Commit e16f1caae0d70e9943fd2dfbe8191eddcd87e3a0
Committed by
Gitee
!831 WIP: CRM-待办事项
Merge pull request !831 from dhb52/crm-msg
Showing
6 changed files
with
205 additions
and
0 deletions
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/message/CrmContactStatusEnum.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.enums.message; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.core.IntArrayValuable; | |
| 4 | +import lombok.Getter; | |
| 5 | +import lombok.RequiredArgsConstructor; | |
| 6 | + | |
| 7 | +import java.util.Arrays; | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * CRM 联系状态 | |
| 11 | + * | |
| 12 | + * @author dhb52 | |
| 13 | + */ | |
| 14 | +@RequiredArgsConstructor | |
| 15 | +@Getter | |
| 16 | +public enum CrmContactStatusEnum implements IntArrayValuable { | |
| 17 | + | |
| 18 | + NEEDED_TODAY(1, "今日需联系"), | |
| 19 | + EXPIRED(2, "已逾期"), | |
| 20 | + ALREADY_CONTACT(3, "已联系"), | |
| 21 | + ; | |
| 22 | + | |
| 23 | + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmContactStatusEnum::getType).toArray(); | |
| 24 | + | |
| 25 | + /** | |
| 26 | + * 状态 | |
| 27 | + */ | |
| 28 | + private final Integer type; | |
| 29 | + /** | |
| 30 | + * 状态名 | |
| 31 | + */ | |
| 32 | + private final String name; | |
| 33 | + | |
| 34 | + @Override | |
| 35 | + public int[] array() { | |
| 36 | + return ARRAYS; | |
| 37 | + } | |
| 38 | + | |
| 39 | +} | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/message/CrmMessageController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.controller.admin.message; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | |
| 6 | +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerRespVO; | |
| 7 | +import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO; | |
| 8 | +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | |
| 9 | +import cn.iocoder.yudao.module.crm.service.message.CrmMessageService; | |
| 10 | +import io.swagger.v3.oas.annotations.Operation; | |
| 11 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 12 | +import jakarta.annotation.Resource; | |
| 13 | +import jakarta.validation.Valid; | |
| 14 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 15 | +import org.springframework.validation.annotation.Validated; | |
| 16 | +import org.springframework.web.bind.annotation.GetMapping; | |
| 17 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 18 | +import org.springframework.web.bind.annotation.RestController; | |
| 19 | + | |
| 20 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | |
| 21 | +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | |
| 22 | + | |
| 23 | + | |
| 24 | +@Tag(name = "管理后台 - CRM消息") | |
| 25 | +@RestController | |
| 26 | +@RequestMapping("/crm/message") | |
| 27 | +@Validated | |
| 28 | +public class CrmMessageController { | |
| 29 | + | |
| 30 | + @Resource | |
| 31 | + private CrmMessageService crmMessageService; | |
| 32 | + | |
| 33 | + @GetMapping("/todayCustomer") | |
| 34 | + @Operation(summary = "今日需联系客户") | |
| 35 | + @PreAuthorize("@ss.hasPermission('crm:message:todayCustomer')") | |
| 36 | + public CommonResult<PageResult<CrmCustomerRespVO>> getTodayCustomerPage(@Valid CrmTodayCustomerPageReqVO pageReqVO) { | |
| 37 | + PageResult<CrmCustomerDO> pageResult = crmMessageService.getTodayCustomerPage(pageReqVO, getLoginUserId()); | |
| 38 | + return success(BeanUtils.toBean(pageResult, CrmCustomerRespVO.class)); | |
| 39 | + } | |
| 40 | + | |
| 41 | +} | |
| 0 | 42 | \ No newline at end of file | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/message/vo/CrmTodayCustomerPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.controller.admin.message.vo; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageParam; | |
| 4 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 5 | +import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum; | |
| 6 | +import cn.iocoder.yudao.module.crm.enums.message.CrmContactStatusEnum; | |
| 7 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 8 | +import lombok.Data; | |
| 9 | +import lombok.EqualsAndHashCode; | |
| 10 | +import lombok.ToString; | |
| 11 | + | |
| 12 | +@Schema(description = "管理后台 - 今日需联系客户 Request VO") | |
| 13 | +@Data | |
| 14 | +@EqualsAndHashCode(callSuper = true) | |
| 15 | +@ToString(callSuper = true) | |
| 16 | +public class CrmTodayCustomerPageReqVO extends PageParam { | |
| 17 | + | |
| 18 | + @Schema(description = "联系状态", example = "1") | |
| 19 | + @InEnum(CrmContactStatusEnum.class) | |
| 20 | + private Integer contactStatus; | |
| 21 | + | |
| 22 | + @Schema(description = "场景类型", example = "1") | |
| 23 | + @InEnum(CrmSceneTypeEnum.class) | |
| 24 | + private Integer sceneType; | |
| 25 | + | |
| 26 | +} | |
| 0 | 27 | \ No newline at end of file | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java
| ... | ... | @@ -5,13 +5,17 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | 5 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 6 | 6 | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; |
| 7 | 7 | import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; |
| 8 | +import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO; | |
| 8 | 9 | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; |
| 10 | +import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO; | |
| 9 | 11 | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; |
| 12 | +import cn.iocoder.yudao.module.crm.enums.message.CrmContactStatusEnum; | |
| 10 | 13 | import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils; |
| 11 | 14 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| 12 | 15 | import org.apache.ibatis.annotations.Mapper; |
| 13 | 16 | import org.springframework.lang.Nullable; |
| 14 | 17 | |
| 18 | +import java.time.LocalDate; | |
| 15 | 19 | import java.util.Collection; |
| 16 | 20 | import java.util.List; |
| 17 | 21 | |
| ... | ... | @@ -63,4 +67,53 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { |
| 63 | 67 | return selectJoinList(CrmCustomerDO.class, query); |
| 64 | 68 | } |
| 65 | 69 | |
| 70 | + /** | |
| 71 | + * 待办事项 - 今日需联系客户 | |
| 72 | + * | |
| 73 | + * @param pageReqVO 分页请求参数 | |
| 74 | + * @param userId 当前用户ID | |
| 75 | + * @return 分页结果 | |
| 76 | + */ | |
| 77 | + default PageResult<CrmCustomerDO> selectTodayCustomerPage(CrmTodayCustomerPageReqVO pageReqVO, Long userId) { | |
| 78 | + MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>(); | |
| 79 | + // 拼接数据权限的查询条件 | |
| 80 | + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), | |
| 81 | + CrmCustomerDO::getId, userId, pageReqVO.getSceneType(), null); | |
| 82 | + | |
| 83 | + query.selectAll(CrmCustomerDO.class) | |
| 84 | + .leftJoin(CrmFollowUpRecordDO.class, CrmFollowUpRecordDO::getBizId, CrmCustomerDO::getId) | |
| 85 | + .eq(CrmFollowUpRecordDO::getType, CrmBizTypeEnum.CRM_CUSTOMER.getType()); | |
| 86 | + | |
| 87 | + // 拼接自身的查询条件 | |
| 88 | + LocalDate today = LocalDate.now(); | |
| 89 | + LocalDate tomorrow = today.plusDays(1); | |
| 90 | + LocalDate yesterday = today.minusDays(1); | |
| 91 | + if (pageReqVO.getContactStatus().equals(CrmContactStatusEnum.NEEDED_TODAY.getType())) { | |
| 92 | + // 今天需联系: | |
| 93 | + // 1.【客户】的【下一次联系时间】 是【今天】 | |
| 94 | + // 2. 无法找到【今天】创建的【跟进】记录 | |
| 95 | + query.between(CrmCustomerDO::getContactNextTime, today, tomorrow) | |
| 96 | + .between(CrmFollowUpRecordDO::getCreateTime, today, tomorrow) | |
| 97 | + .isNull(CrmFollowUpRecordDO::getId); | |
| 98 | + } else if (pageReqVO.getContactStatus().equals(CrmContactStatusEnum.EXPIRED.getType())) { | |
| 99 | + // 已逾期: | |
| 100 | + // 1. 【客户】的【下一次联系时间】 <= 【昨天】 | |
| 101 | + // 2. 无法找到【今天】创建的【跟进】记录 | |
| 102 | + query.le(CrmCustomerDO::getContactNextTime, yesterday) | |
| 103 | + .between(CrmFollowUpRecordDO::getCreateTime, today, tomorrow) | |
| 104 | + .isNull(CrmFollowUpRecordDO::getId); | |
| 105 | + } else if (pageReqVO.getContactStatus().equals(CrmContactStatusEnum.ALREADY_CONTACT.getType())) { | |
| 106 | + // 已联系: | |
| 107 | + // 1.【客户】的【下一次联系时间】 是【今天】 | |
| 108 | + // 2. 找到【今天】创建的【跟进】记录 | |
| 109 | + query.between(CrmCustomerDO::getContactNextTime, today, tomorrow) | |
| 110 | + .between(CrmFollowUpRecordDO::getCreateTime, today, tomorrow) | |
| 111 | + .isNotNull(CrmFollowUpRecordDO::getId); | |
| 112 | + } else { | |
| 113 | + // TODO: 参数错误,是不是要兜一下底 | |
| 114 | + } | |
| 115 | + | |
| 116 | + return selectJoinPage(pageReqVO, CrmCustomerDO.class, query); | |
| 117 | + } | |
| 118 | + | |
| 66 | 119 | } | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/message/CrmMessageService.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.service.message; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 4 | +import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO; | |
| 5 | +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | |
| 6 | +import jakarta.validation.Valid; | |
| 7 | + | |
| 8 | +/** | |
| 9 | + * CRM 代办消息 Service 接口 | |
| 10 | + * | |
| 11 | + * @author dhb52 | |
| 12 | + */ | |
| 13 | +public interface CrmMessageService { | |
| 14 | + | |
| 15 | + /** | |
| 16 | + * | |
| 17 | + * @param pageReqVO | |
| 18 | + * @return | |
| 19 | + */ | |
| 20 | + PageResult<CrmCustomerDO> getTodayCustomerPage(@Valid CrmTodayCustomerPageReqVO pageReqVO, Long userId); | |
| 21 | + | |
| 22 | +} | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/message/CrmMessageServiceImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.service.message; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 4 | +import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO; | |
| 5 | +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | |
| 6 | +import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; | |
| 7 | +import jakarta.annotation.Resource; | |
| 8 | +import org.springframework.stereotype.Component; | |
| 9 | +import org.springframework.validation.annotation.Validated; | |
| 10 | + | |
| 11 | + | |
| 12 | +@Component | |
| 13 | +@Validated | |
| 14 | +public class CrmMessageServiceImpl implements CrmMessageService { | |
| 15 | + | |
| 16 | + @Resource | |
| 17 | + private CrmCustomerMapper customerMapper; | |
| 18 | + | |
| 19 | + @Override | |
| 20 | + public PageResult<CrmCustomerDO> getTodayCustomerPage(CrmTodayCustomerPageReqVO pageReqVO, Long userId) { | |
| 21 | + return customerMapper.selectTodayCustomerPage(pageReqVO, userId); | |
| 22 | + } | |
| 23 | + | |
| 24 | +} | ... | ... |