mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	wip: 根据code review优化代码
This commit is contained in:
		| @@ -84,4 +84,7 @@ public interface ErrorCodeConstants { | |||||||
|     // ========== 跟进记录 1_020_013_000 ========== |     // ========== 跟进记录 1_020_013_000 ========== | ||||||
|     ErrorCode FOLLOW_UP_RECORD_NOT_EXISTS = new ErrorCode(1_020_013_000, "跟进记录不存在"); |     ErrorCode FOLLOW_UP_RECORD_NOT_EXISTS = new ErrorCode(1_020_013_000, "跟进记录不存在"); | ||||||
|  |  | ||||||
|  |     // ========== 待办消息 1_020_014_000 ========== | ||||||
|  |     ErrorCode BACKLOG_CONTACT_STATUS_ERROR = new ErrorCode(1_020_014_000, "客户联系状态有误"); | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,39 +0,0 @@ | |||||||
| package cn.iocoder.yudao.module.crm.enums.message; |  | ||||||
|  |  | ||||||
| import cn.iocoder.yudao.framework.common.core.IntArrayValuable; |  | ||||||
| import lombok.Getter; |  | ||||||
| import lombok.RequiredArgsConstructor; |  | ||||||
|  |  | ||||||
| import java.util.Arrays; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * CRM 联系状态 |  | ||||||
|  * |  | ||||||
|  * @author dhb52 |  | ||||||
|  */ |  | ||||||
| @RequiredArgsConstructor |  | ||||||
| @Getter |  | ||||||
| public enum CrmContactStatusEnum implements IntArrayValuable { |  | ||||||
|  |  | ||||||
|     NEEDED_TODAY(1, "今日需联系"), |  | ||||||
|     EXPIRED(2, "已逾期"), |  | ||||||
|     ALREADY_CONTACT(3, "已联系"), |  | ||||||
|     ; |  | ||||||
|  |  | ||||||
|     public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmContactStatusEnum::getType).toArray(); |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 状态 |  | ||||||
|      */ |  | ||||||
|     private final Integer type; |  | ||||||
|     /** |  | ||||||
|      * 状态名 |  | ||||||
|      */ |  | ||||||
|     private final String name; |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public int[] array() { |  | ||||||
|         return ARRAYS; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -1,12 +1,12 @@ | |||||||
| package cn.iocoder.yudao.module.crm.controller.admin.message; | package cn.iocoder.yudao.module.crm.controller.admin.backlog; | ||||||
| 
 | 
 | ||||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerRespVO; | import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerRespVO; | ||||||
| import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO; | import cn.iocoder.yudao.module.crm.controller.admin.backlog.vo.CrmTodayCustomerPageReqVO; | ||||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||||
| import cn.iocoder.yudao.module.crm.service.message.CrmMessageService; | import cn.iocoder.yudao.module.crm.service.message.CrmBacklogService; | ||||||
| import io.swagger.v3.oas.annotations.Operation; | import io.swagger.v3.oas.annotations.Operation; | ||||||
| import io.swagger.v3.oas.annotations.tags.Tag; | import io.swagger.v3.oas.annotations.tags.Tag; | ||||||
| import jakarta.annotation.Resource; | import jakarta.annotation.Resource; | ||||||
| @@ -20,19 +20,19 @@ import org.springframework.web.bind.annotation.RestController; | |||||||
| import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||||||
| import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | ||||||
| 
 | 
 | ||||||
| @Tag(name = "管理后台 - CRM消息") | @Tag(name = "管理后台 - CRM待办消息") | ||||||
| @RestController | @RestController | ||||||
| @RequestMapping("/crm/message") | @RequestMapping("/crm/backlog") | ||||||
| @Validated | @Validated | ||||||
| public class CrmMessageController { | public class CrmBacklogController { | ||||||
| 
 | 
 | ||||||
|     @Resource |     @Resource | ||||||
|     private CrmMessageService crmMessageService; |     private CrmBacklogService crmMessageService; | ||||||
| 
 | 
 | ||||||
|     // TODO 芋艿:未来可能合并到 CrmCustomerController |     // TODO 芋艿:未来可能合并到 CrmCustomerController | ||||||
|     @GetMapping("/todayCustomer") // TODO @dbh52:【优先级低】url 使用中划线,项目规范。然后叫 today-customer-page,通过 page 体现出它是个分页接口 |     @GetMapping("/today-customer-page") | ||||||
|     @Operation(summary = "今日需联系客户") |     @Operation(summary = "今日需联系客户") | ||||||
|     @PreAuthorize("@ss.hasPermission('crm:message:todayCustomer')") |     @PreAuthorize("@ss.hasPermission('crm:customer:query')") | ||||||
|     public CommonResult<PageResult<CrmCustomerRespVO>> getTodayCustomerPage(@Valid CrmTodayCustomerPageReqVO pageReqVO) { |     public CommonResult<PageResult<CrmCustomerRespVO>> getTodayCustomerPage(@Valid CrmTodayCustomerPageReqVO pageReqVO) { | ||||||
|         PageResult<CrmCustomerDO> pageResult = crmMessageService.getTodayCustomerPage(pageReqVO, getLoginUserId()); |         PageResult<CrmCustomerDO> pageResult = crmMessageService.getTodayCustomerPage(pageReqVO, getLoginUserId()); | ||||||
|         return success(BeanUtils.toBean(pageResult, CrmCustomerRespVO.class)); |         return success(BeanUtils.toBean(pageResult, CrmCustomerRespVO.class)); | ||||||
| @@ -1,9 +1,8 @@ | |||||||
| package cn.iocoder.yudao.module.crm.controller.admin.message.vo; | package cn.iocoder.yudao.module.crm.controller.admin.backlog.vo; | ||||||
| 
 | 
 | ||||||
| import cn.iocoder.yudao.framework.common.pojo.PageParam; | import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||||||
| import cn.iocoder.yudao.framework.common.validation.InEnum; | import cn.iocoder.yudao.framework.common.validation.InEnum; | ||||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum; | import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum; | ||||||
| import cn.iocoder.yudao.module.crm.enums.message.CrmContactStatusEnum; |  | ||||||
| import io.swagger.v3.oas.annotations.media.Schema; | import io.swagger.v3.oas.annotations.media.Schema; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
| import lombok.EqualsAndHashCode; | import lombok.EqualsAndHashCode; | ||||||
| @@ -15,10 +14,12 @@ import lombok.ToString; | |||||||
| @ToString(callSuper = true) | @ToString(callSuper = true) | ||||||
| public class CrmTodayCustomerPageReqVO extends PageParam { | public class CrmTodayCustomerPageReqVO extends PageParam { | ||||||
| 
 | 
 | ||||||
|     // TODO @dbh52:CrmContactStatusEnum 可以直接枚举三个 Integer;一般来说,枚举类尽量给数据模型用,这样枚举类少,更聚焦;这里的枚举,更多是专门给这个接口用的哈 |     public static final int CONTACT_TODAY = 1; | ||||||
|  |     public static final int CONTACT_EXPIRED = 2; | ||||||
|  |     public static final int CONTACT_ALREADY = 3; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|     @Schema(description = "联系状态", example = "1") |     @Schema(description = "联系状态", example = "1") | ||||||
|     @InEnum(CrmContactStatusEnum.class) |  | ||||||
|     private Integer contactStatus; |     private Integer contactStatus; | ||||||
| 
 | 
 | ||||||
|     @Schema(description = "场景类型", example = "1") |     @Schema(description = "场景类型", example = "1") | ||||||
| @@ -4,20 +4,26 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | |||||||
| import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||||||
| import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||||||
| import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; | ||||||
|  | import cn.iocoder.yudao.module.crm.controller.admin.backlog.vo.CrmTodayCustomerPageReqVO; | ||||||
| import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; | import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; | ||||||
| import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO; |  | ||||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO; | import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO; | ||||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||||||
| import cn.iocoder.yudao.module.crm.enums.message.CrmContactStatusEnum; |  | ||||||
| import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils; | import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils; | ||||||
| import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | ||||||
| import org.apache.ibatis.annotations.Mapper; | import org.apache.ibatis.annotations.Mapper; | ||||||
| import org.springframework.lang.Nullable; | import org.springframework.lang.Nullable; | ||||||
|  |  | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
|  | import java.time.LocalDateTime; | ||||||
|  | import java.time.LocalTime; | ||||||
|  | import java.time.temporal.TemporalUnit; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.concurrent.TimeUnit; | ||||||
|  |  | ||||||
|  | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||||
|  | import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BACKLOG_CONTACT_STATUS_ERROR; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 客户 Mapper |  * 客户 Mapper | ||||||
| @@ -80,41 +86,22 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { | |||||||
|         CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), |         CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), | ||||||
|                 CrmCustomerDO::getId, userId, pageReqVO.getSceneType(), null); |                 CrmCustomerDO::getId, userId, pageReqVO.getSceneType(), null); | ||||||
|  |  | ||||||
|         query.selectAll(CrmCustomerDO.class) |         query.selectAll(CrmCustomerDO.class); | ||||||
|                 .leftJoin(CrmFollowUpRecordDO.class, CrmFollowUpRecordDO::getBizId, CrmCustomerDO::getId) |  | ||||||
|                 .eq(CrmFollowUpRecordDO::getType, CrmBizTypeEnum.CRM_CUSTOMER.getType()); |  | ||||||
|  |  | ||||||
|         // 拼接自身的查询条件 |         // 拼接自身的查询条件 | ||||||
|         // TODO @dbh52:这里不仅仅要获得 today、tomorrow。而是 today 要获取今天的 00:00:00 这种; |         LocalDateTime beginOfToday =  LocalDateTime.now().toLocalDate().atTime(LocalTime.MIN); | ||||||
|         LocalDate today = LocalDate.now(); |         LocalDateTime endOfToday =  LocalDateTime.now().toLocalDate().atTime(LocalTime.MAX); | ||||||
|         LocalDate tomorrow = today.plusDays(1); |         if (pageReqVO.getContactStatus().equals(CrmTodayCustomerPageReqVO.CONTACT_TODAY)) { | ||||||
|         LocalDate yesterday = today.minusDays(1); |             // 今天需联系 | ||||||
|         if (pageReqVO.getContactStatus().equals(CrmContactStatusEnum.NEEDED_TODAY.getType())) { |             query.between(CrmCustomerDO::getContactNextTime, beginOfToday, endOfToday); | ||||||
|             // 今天需联系: |         } else if (pageReqVO.getContactStatus().equals(CrmTodayCustomerPageReqVO.CONTACT_EXPIRED)) { | ||||||
|             // 1.【客户】的【下一次联系时间】 是【今天】 |             // 已逾期 | ||||||
|             // 2. 无法找到【今天】创建的【跟进】记录 |             query.lt(CrmCustomerDO::getContactNextTime, beginOfToday); | ||||||
|             query.between(CrmCustomerDO::getContactNextTime, today, tomorrow) |         } else if (pageReqVO.getContactStatus().equals(CrmTodayCustomerPageReqVO.CONTACT_ALREADY)) { | ||||||
|                     // TODO @dbh52:是不是查询 CrmCustomerDO::contactLastTime < today?因为今天联系过,应该会更新该字段,减少链表查询; |             // 已联系 | ||||||
|                     .between(CrmFollowUpRecordDO::getCreateTime, today, tomorrow) |             query.between(CrmCustomerDO::getContactLastTime, beginOfToday, endOfToday); | ||||||
|                     .isNull(CrmFollowUpRecordDO::getId); |  | ||||||
|         } else if (pageReqVO.getContactStatus().equals(CrmContactStatusEnum.EXPIRED.getType())) { |  | ||||||
|             // 已逾期: |  | ||||||
|             // 1. 【客户】的【下一次联系时间】 <= 【昨天】 |  | ||||||
|             // 2. 无法找到【今天】创建的【跟进】记录 |  | ||||||
|             //  TODO @dbh52:是不是 contactNextTime 在当前时间之前,且 contactLastTime < contactNextTime?说白了,就是下次联系时间超过当前时间,且最后联系时间没去联系; |  | ||||||
|             query.le(CrmCustomerDO::getContactNextTime, yesterday) |  | ||||||
|                     .between(CrmFollowUpRecordDO::getCreateTime, today, tomorrow) |  | ||||||
|                     .isNull(CrmFollowUpRecordDO::getId); |  | ||||||
|         } else if (pageReqVO.getContactStatus().equals(CrmContactStatusEnum.ALREADY_CONTACT.getType())) { |  | ||||||
|             // 已联系: |  | ||||||
|             // 1.【客户】的【下一次联系时间】 是【今天】 |  | ||||||
|             // 2. 找到【今天】创建的【跟进】记录 |  | ||||||
|             query.between(CrmCustomerDO::getContactNextTime, today, tomorrow) |  | ||||||
|                     // TODO @dbh52:contactLastTime 是今天 |  | ||||||
|                     .between(CrmFollowUpRecordDO::getCreateTime, today, tomorrow) |  | ||||||
|                     .isNotNull(CrmFollowUpRecordDO::getId); |  | ||||||
|         } else { |         } else { | ||||||
|             // TODO: 参数错误,是不是要兜一下底;直接抛出异常就好啦; |             throw exception(BACKLOG_CONTACT_STATUS_ERROR); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return selectJoinPage(pageReqVO, CrmCustomerDO.class, query); |         return selectJoinPage(pageReqVO, CrmCustomerDO.class, query); | ||||||
|   | |||||||
| @@ -1,22 +1,22 @@ | |||||||
| package cn.iocoder.yudao.module.crm.service.message; | package cn.iocoder.yudao.module.crm.service.message; | ||||||
| 
 | 
 | ||||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||||
| import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO; | import cn.iocoder.yudao.module.crm.controller.admin.backlog.vo.CrmTodayCustomerPageReqVO; | ||||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||||
| import jakarta.validation.Valid; | import jakarta.validation.Valid; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * CRM 代办消息 Service 接口 |  * CRM 待办消息 Service 接口 | ||||||
|  * |  * | ||||||
|  * @author dhb52 |  * @author dhb52 | ||||||
|  */ |  */ | ||||||
| public interface CrmMessageService { | public interface CrmBacklogService { | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * TODO @dbh52:注释要写下 |      * 根据【联系状态】、【场景类型】筛选客户分页 | ||||||
|      * |      * | ||||||
|      * @param pageReqVO |      * @param pageReqVO 分页查询 | ||||||
|      * @return |      * @return 分页数据 | ||||||
|      */ |      */ | ||||||
|     PageResult<CrmCustomerDO> getTodayCustomerPage(@Valid CrmTodayCustomerPageReqVO pageReqVO, Long userId); |     PageResult<CrmCustomerDO> getTodayCustomerPage(@Valid CrmTodayCustomerPageReqVO pageReqVO, Long userId); | ||||||
| 
 | 
 | ||||||
| @@ -1,17 +1,20 @@ | |||||||
| package cn.iocoder.yudao.module.crm.service.message; | package cn.iocoder.yudao.module.crm.service.message; | ||||||
| 
 | 
 | ||||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||||
| import cn.iocoder.yudao.module.crm.controller.admin.message.vo.CrmTodayCustomerPageReqVO; | import cn.iocoder.yudao.module.crm.controller.admin.backlog.vo.CrmTodayCustomerPageReqVO; | ||||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||||||
| import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; | import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; | ||||||
| import jakarta.annotation.Resource; | import jakarta.annotation.Resource; | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
| 
 | 
 | ||||||
| // TODO @dbh52:注释要写下 | /** | ||||||
|  |  * 待办消息 Service 实现类 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
| @Component | @Component | ||||||
| @Validated | @Validated | ||||||
| public class CrmMessageServiceImpl implements CrmMessageService { | public class CrmBacklogServiceImpl implements CrmBacklogService { | ||||||
| 
 | 
 | ||||||
|     @Resource |     @Resource | ||||||
|     private CrmCustomerMapper customerMapper; |     private CrmCustomerMapper customerMapper; | ||||||
		Reference in New Issue
	
	Block a user
	 dhb52
					dhb52