Explorar o código

📖 CRM:code review 待提醒逻辑

YunaiV hai 1 ano
pai
achega
1bfb406041
Modificáronse 13 ficheiros con 199 adicións e 205 borrados
  1. 48 47
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueRespVO.java
  2. 35 34
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueSaveReqVO.java
  3. 0 1
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java
  4. 5 8
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
  5. 1 4
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPageReqVO.java
  6. 45 35
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/clue/CrmClueDO.java
  7. 41 41
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerDO.java
  8. 4 5
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/CrmClueMapper.java
  9. 6 9
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
  10. 7 12
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java
  11. 2 4
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java
  12. 4 5
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivablePlanMapper.java
  13. 1 0
      yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java

+ 48 - 47
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueRespVO.java

@@ -24,58 +24,67 @@ public class CrmClueRespVO {
     @ExcelProperty("编号")
     private Long id;
 
-    @Schema(description = "转化状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
-    @ExcelProperty(value = "转化状态", converter = DictConvert.class)
-    @DictFormat(DictTypeConstants.BOOLEAN_STRING)
-    private Boolean transformStatus;
+    @Schema(description = "线索名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "线索xxx")
+    @ExcelProperty("线索名称")
+    private String name;
 
     @Schema(description = "跟进状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
     @ExcelProperty(value = "跟进状态", converter = DictConvert.class)
     @DictFormat(DictTypeConstants.BOOLEAN_STRING)
     private Boolean followUpStatus;
 
-    @Schema(description = "线索名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "线索xxx")
-    @ExcelProperty("线索名称")
-    private String name;
-
-    @Schema(description = "客户 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "520")
-    // TODO 这里需要导出成客户名称
-    @ExcelProperty("客户id")
-    private Long customerId;
+    @Schema(description = "最后跟进时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @ExcelProperty("最后跟进时间")
+    private LocalDateTime contactLastTime;
 
     @Schema(description = "下次联系时间", example = "2023-10-18 01:00:00")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @ExcelProperty("下次联系时间")
     private LocalDateTime contactNextTime;
 
-    @Schema(description = "电话", example = "18000000000")
-    @ExcelProperty("电话")
-    private String telephone;
+    @Schema(description = "负责人编号")
+    @ExcelProperty("负责人的用户编号")
+    // TODO 这里需要导出成负责人的名字
+    private Long ownerUserId;
+
+    @Schema(description = "转化状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
+    @ExcelProperty(value = "转化状态", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.BOOLEAN_STRING)
+    private Boolean transformStatus;
+
+    @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "520")
+    // TODO 这里需要导出成客户名称
+    @ExcelProperty("客户编号")
+    private Long customerId;
 
     @Schema(description = "手机号", example = "18000000000")
     @ExcelProperty("手机号")
     private String mobile;
 
-    @Schema(description = "地址", example = "北京市海淀区")
-    @ExcelProperty("地址")
-    private String address;
+    @Schema(description = "电话", example = "18000000000")
+    @ExcelProperty("电话")
+    private String telephone;
 
-    @Schema(description = "负责人编号")
-    @ExcelProperty("负责人的用户编号")
-    private Long ownerUserId;
+    @Schema(description = "网址", example = "25682")
+    @ExcelProperty("网址")
+    private String website;
 
-    @Schema(description = "最后跟进时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    @ExcelProperty("最后跟进时间")
-    private LocalDateTime contactLastTime;
+    @Schema(description = "QQ", example = "25682")
+    @ExcelProperty("QQ")
+    private String qq;
 
-    @Schema(description = "备注", example = "随便")
-    @ExcelProperty("备注")
-    private String remark;
+    @Schema(description = "wechat", example = "25682")
+    @ExcelProperty("wechat")
+    private String wechat;
 
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("创建时间")
-    private LocalDateTime createTime;
+    @Schema(description = "email", example = "25682")
+    @ExcelProperty("email")
+    private String email;
+
+    @Schema(description = "地址", example = "北京市海淀区")
+    @ExcelProperty("地址")
+    private String address;
 
     @Schema(description = "所属行业", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
     @ExcelProperty(value = "所属行业", converter = DictConvert.class)
@@ -92,24 +101,16 @@ public class CrmClueRespVO {
     @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_SOURCE)
     private Integer source;
 
-    @Schema(description = "网址", example = "25682")
-    @ExcelProperty("网址")
-    private String website;
-
-    @Schema(description = "QQ", example = "25682")
-    @ExcelProperty("QQ")
-    private String qq;
-
-    @Schema(description = "wechat", example = "25682")
-    @ExcelProperty("wechat")
-    private String wechat;
-
-    @Schema(description = "email", example = "25682")
-    @ExcelProperty("email")
-    private String email;
-
     @Schema(description = "客户描述", example = "25682")
     @ExcelProperty("客户描述")
     private String description;
 
+    @Schema(description = "备注", example = "随便")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
 }

+ 35 - 34
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueSaveReqVO.java

@@ -21,7 +21,7 @@ import java.time.LocalDateTime;
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 import static cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY;
 
-@Schema(description = "管理后台 - CRM 线索 创建/更新 Request VO")
+@Schema(description = "管理后台 - CRM 线索创建/更新 Request VO")
 @Data
 public class CrmClueSaveReqVO {
 
@@ -33,50 +33,28 @@ public class CrmClueSaveReqVO {
     @NotEmpty(message = "线索名称不能为空")
     private String name;
 
+    @Schema(description = "最后跟进时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @DiffLogField(name = "最后跟进时间")
+    private LocalDateTime contactLastTime;
+
     @Schema(description = "下次联系时间", example = "2023-10-18 01:00:00")
     @DiffLogField(name = "下次联系时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime contactNextTime;
 
-    @Schema(description = "电话", example = "18000000000")
-    @DiffLogField(name = "电话")
-    @Telephone
-    private String telephone;
+    @Schema(description = "负责人编号", example = "2048")
+    private Long ownerUserId;
 
     @Schema(description = "手机号", example = "18000000000")
     @DiffLogField(name = "手机号")
     @Mobile
     private String mobile;
 
-    @Schema(description = "地址", example = "北京市海淀区")
-    @DiffLogField(name = "地址")
-    private String address;
-
-    @Schema(description = "最后跟进时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    @DiffLogField(name = "最后跟进时间")
-    private LocalDateTime contactLastTime;
-
-    @Schema(description = "负责人编号", example = "2048")
-    private Long ownerUserId;
-
-    @Schema(description = "备注", example = "随便")
-    @DiffLogField(name = "备注")
-    private String remark;
-
-    @Schema(description = "所属行业", example = "1")
-    @DiffLogField(name = "所属行业", function = CrmCustomerIndustryParseFunction.NAME)
-    @DictFormat(CRM_CUSTOMER_INDUSTRY)
-    private Integer industryId;
-
-    @Schema(description = "客户等级", example = "2")
-    @DiffLogField(name = "客户等级", function = CrmCustomerLevelParseFunction.NAME)
-    @InEnum(CrmCustomerLevelEnum.class)
-    private Integer level;
-
-    @Schema(description = "客户来源", example = "3")
-    @DiffLogField(name = "客户来源", function = CrmCustomerSourceParseFunction.NAME)
-    private Integer source;
+    @Schema(description = "电话", example = "18000000000")
+    @DiffLogField(name = "电话")
+    @Telephone
+    private String telephone;
 
     @Schema(description = "网址", example = "https://www.baidu.com")
     @DiffLogField(name = "网址")
@@ -98,8 +76,31 @@ public class CrmClueSaveReqVO {
     @Size(max = 255, message = "邮箱长度不能超过 255 个字符")
     private String email;
 
+    @Schema(description = "地址", example = "北京市海淀区")
+    @DiffLogField(name = "地址")
+    private String address;
+
+    @Schema(description = "所属行业", example = "1")
+    @DiffLogField(name = "所属行业", function = CrmCustomerIndustryParseFunction.NAME)
+    @DictFormat(CRM_CUSTOMER_INDUSTRY)
+    private Integer industryId;
+
+    @Schema(description = "客户等级", example = "2")
+    @DiffLogField(name = "客户等级", function = CrmCustomerLevelParseFunction.NAME)
+    @InEnum(CrmCustomerLevelEnum.class)
+    private Integer level;
+
+    @Schema(description = "客户来源", example = "3")
+    @DiffLogField(name = "客户来源", function = CrmCustomerSourceParseFunction.NAME)
+    private Integer source;
+
     @Schema(description = "客户描述", example = "任意文字")
     @DiffLogField(name = "客户描述")
     @Size(max = 4096, message = "客户描述长度不能超过 4096 个字符")
     private String description;
+
+    @Schema(description = "备注", example = "随便")
+    @DiffLogField(name = "备注")
+    private String remark;
+
 }

+ 0 - 1
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java

@@ -191,7 +191,6 @@ public class CrmContractController {
         return success(contractService.getCheckContractCount(getLoginUserId()));
     }
 
-
     @GetMapping("/end-contract-count")
     @Operation(summary = "获得即将到期的合同数量")
     @PreAuthorize("@ss.hasPermission('crm:contract:query')")

+ 5 - 8
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java

@@ -152,19 +152,17 @@ public class CrmCustomerController {
     @Operation(summary = "获得待进入公海客户数量")
     @PreAuthorize("@ss.hasPermission('crm:customer:query')")
     public CommonResult<Long> getPutInPoolRemindCustomerCount() {
-        // 获取公海配置 TODO @dbh52:合并到 getPutInPoolRemindCustomerPage 会更合适哈;
+        // 获取公海配置
         CrmCustomerPoolConfigDO poolConfigDO = customerPoolConfigService.getCustomerPoolConfig();
         if (ObjUtil.isNull(poolConfigDO)
                 || Boolean.FALSE.equals(poolConfigDO.getEnabled())
                 || Boolean.FALSE.equals(poolConfigDO.getNotifyEnabled())) {
             throw exception(CUSTOMER_POOL_CONFIG_NOT_EXISTS_OR_DISABLED);
         }
-
-        CrmCustomerPageReqVO pageVO = new CrmCustomerPageReqVO();
-        pageVO.setPool(null);
-        pageVO.setContactStatus(CrmCustomerPageReqVO.CONTACT_TODAY);
-        pageVO.setSceneType(CrmSceneTypeEnum.OWNER.getType());
-
+        CrmCustomerPageReqVO pageVO = new CrmCustomerPageReqVO()
+                .setPool(null)
+                .setContactStatus(CrmCustomerPageReqVO.CONTACT_TODAY)
+                .setSceneType(CrmSceneTypeEnum.OWNER.getType());
         return success(customerService.getPutInPoolRemindCustomerCount(pageVO, poolConfigDO, getLoginUserId()));
     }
 
@@ -182,7 +180,6 @@ public class CrmCustomerController {
         return success(customerService.getFollowCustomerCount(getLoginUserId()));
     }
 
-
     /**
      * 获取距离进入公海的时间
      *

+ 1 - 4
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPageReqVO.java

@@ -50,10 +50,7 @@ public class CrmCustomerPageReqVO extends PageParam {
     private Boolean pool; // null 则表示为不是公海数据
 
     @Schema(description = "联系状态", example = "1")
-    private Integer contactStatus; // backlog查询条件, null 则表示为不做查询
-
-    @Schema(description = "跟进状态", example = "true")
-    private Boolean followUpStatus; // backlog查询条件, null 则表示为不做查询
+    private Integer contactStatus; // backlog 查询条件
 
     @Schema(description = "跟进状态", example = "true")
     private Boolean followUpStatus;

+ 45 - 35
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/clue/CrmClueDO.java

@@ -10,7 +10,6 @@ import lombok.*;
 
 import java.time.LocalDateTime;
 
-// TODO 芋艿:字段的顺序,需要整理下;
 /**
  * 线索 DO
  *
@@ -32,85 +31,96 @@ public class CrmClueDO extends BaseDO {
     @TableId
     private Long id;
     /**
-     * 转化状态
+     * 线索名称
      */
-    private Boolean transformStatus;
+    private String name;
+
     /**
      * 跟进状态
      */
     private Boolean followUpStatus;
     /**
-     * 线索名称
+     * 最后跟进时间 TODO 添加跟进记录时更新该值
      */
-    private String name;
+    private LocalDateTime contactLastTime;
+    /**
+     * 下次联系时间
+     */
+    private LocalDateTime contactNextTime;
+
+    /**
+     * 负责人的用户编号
+     *
+     * 关联 AdminUserDO 的 id 字段
+     */
+    private Long ownerUserId;
+
+    /**
+     * 转化状态
+     *
+     * true 表示已转换,会更新 {@link #customerId} 字段
+     */
+    private Boolean transformStatus;
     /**
-     * 客户 id
+     * 客户编号
      *
      * 关联 {@link CrmCustomerDO#getId()}
      */
     private Long customerId;
+
     /**
-     * 下次联系时间
+     * 手机号
      */
-    private LocalDateTime contactNextTime;
+    private String mobile;
     /**
      * 电话
      */
     private String telephone;
     /**
-     * 手机号
+     * 网址
      */
-    private String mobile;
+    private String website;
     /**
-     * 地址
+     * QQ
      */
-    private String address;
+    private String qq;
     /**
-     * 最后跟进时间 TODO 添加跟进记录时更新该值
+     * wechat
      */
-    private LocalDateTime contactLastTime;
+    private String wechat;
     /**
-     * 备注
+     * email
      */
-    private String remark;
+    private String email;
     /**
-     * 负责人的用户编号
-     * 关联 AdminUserDO 的 id 字段
+     * 地址
      */
-    private Long ownerUserId;
+    private String address;
     /**
      * 所属行业
+     *
      * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY}
      */
     private Integer industryId;
     /**
      * 客户等级
+     *
      * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_LEVEL}
      */
     private Integer level;
     /**
      * 客户来源
+     *
      * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_SOURCE}
      */
     private Integer source;
-    /**
-     * 网址
-     */
-    private String website;
-    /**
-     * QQ
-     */
-    private String qq;
-    /**
-     * wechat
-     */
-    private String wechat;
-    /**
-     * email
-     */
-    private String email;
     /**
      * 客户描述
      */
     private String description;
+    /**
+     * 备注
+     */
+    private String remark;
+
 }

+ 41 - 41
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerDO.java

@@ -9,8 +9,6 @@ import lombok.*;
 
 import java.time.LocalDateTime;
 
-// TODO 芋艿:调整下字段
-
 /**
  * CRM 客户 DO
  *
@@ -35,36 +33,44 @@ public class CrmCustomerDO extends BaseDO {
      * 客户名称
      */
     private String name;
+
     /**
      * 跟进状态
      */
     private Boolean followUpStatus;
     /**
-     * 锁定状态
+     * 最后跟进时间
      */
-    private Boolean lockStatus;
+    private LocalDateTime contactLastTime;
     /**
-     * 成交状态
+     * 最后跟进内容
      */
-    private Boolean dealStatus;
+    private String contactLastContent;
     /**
-     * 所属行业
-     *
-     * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY}
+     * 下次联系时间
      */
-    private Integer industryId;
+    private LocalDateTime contactNextTime;
+
     /**
-     * 客户等级
+     * 负责人的用户编号
      *
-     * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_LEVEL}
+     * 关联 AdminUserDO 的 id 字段
      */
-    private Integer level;
+    private Long ownerUserId;
     /**
-     * 客户来源
-     *
-     * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_SOURCE}
+     * 最后接收时间
      */
-    private Integer source;
+    private LocalDateTime receiveTime;
+
+    /**
+     * 锁定状态
+     */
+    private Boolean lockStatus;
+    /**
+     * 成交状态
+     */
+    private Boolean dealStatus;
+
     /**
      * 手机
      */
@@ -89,20 +95,6 @@ public class CrmCustomerDO extends BaseDO {
      * email
      */
     private String email;
-    /**
-     * 客户描述
-     */
-    private String description;
-    /**
-     * 备注
-     */
-    private String remark;
-    /**
-     * 负责人的用户编号
-     *
-     * 关联 AdminUserDO 的 id 字段
-     */
-    private Long ownerUserId;
     /**
      * 所在地
      *
@@ -113,23 +105,31 @@ public class CrmCustomerDO extends BaseDO {
      * 详细地址
      */
     private String detailAddress;
-
     /**
-     * 最后接收时间
+     * 所属行业
+     *
+     * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY}
      */
-    private LocalDateTime receiveTime;
+    private Integer industryId;
     /**
-     * 最后跟进时间
+     * 客户等级
+     *
+     * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_LEVEL}
      */
-    private LocalDateTime contactLastTime;
-
+    private Integer level;
     /**
-     * 最后跟进内容
+     * 客户来源
+     *
+     * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_SOURCE}
      */
-    private String contactLastContent;
+    private Integer source;
     /**
-     * 下次联系时间
+     * 客户描述
      */
-    private LocalDateTime contactNextTime;
+    private String description;
+    /**
+     * 备注
+     */
+    private String remark;
 
 }

+ 4 - 5
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/CrmClueMapper.java

@@ -55,17 +55,16 @@ public interface CrmClueMapper extends BaseMapperX<CrmClueDO> {
         return selectJoinList(CrmClueDO.class, query);
     }
 
+    // TODO @dhb52:db 统一都是 select 关键字;
     default Long getFollowLeadsCount(Long userId) {
         MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
-
-        // 我负责的, 非公海
+        // 我负责的 + 非公海
         CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_LEADS.getType(),
                 CrmClueDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
-
-        // 未跟进, 未转化
+        // 未跟进 + 未转化 TODO @dhb52:是不是 eq 会更好哈;mysql 不等于,对索引不友好
         query.ne(CrmClueDO::getFollowUpStatus, true)
                 .ne(CrmClueDO::getTransformStatus, true);
-
         return selectCount(query);
     }
+
 }

+ 6 - 9
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java

@@ -6,7 +6,6 @@ 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.MPJLambdaWrapperX;
 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
-import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;
 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
 import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;
 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
@@ -89,33 +88,31 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
         return selectCount(CrmContractDO::getBusinessId, businessId);
     }
 
+    // TODO @dhb52:db 统一都是 select 关键字;
     default Long getCheckContractCount(Long userId) {
         MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
-
-        // 我负责的, 非公海
+        // 我负责的 + 非公海
         CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
                 CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
-
         // 未提交 or 审核不通过
         query.in(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.DRAFT.getStatus(), CrmAuditStatusEnum.REJECT.getStatus());
-
         return selectCount(query);
     }
 
+    // TODO @dhb52:db 统一都是 select 关键字;
     default Long getEndContractCount(Long userId) {
         MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
-
-        // 我负责的, 非公海
+        // 我负责的 + 非公海
         CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
                 CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
-
         // 即将到期
         LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
         LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
+        // TODO: @芋艿 需要配置 提前提醒天数
         int REMIND_DAYS = 20;
         query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus())
                 .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(REMIND_DAYS));
-
         return selectCount(query);
     }
+
 }

+ 7 - 12
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java

@@ -99,8 +99,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
 
         // backlog 查询
         if (ObjUtil.isNotNull(pageReqVO.getContactStatus())) {
-            Assert.isNull(pageReqVO.getPool(), "[是否为公海数据]必须是null");
-
+            Assert.isNull(pageReqVO.getPool(), "pool 必须是 null");
             LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
             LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
             if (pageReqVO.getContactStatus().equals(CrmCustomerPageReqVO.CONTACT_TODAY)) { // 今天需联系
@@ -113,7 +112,6 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
                 throw new IllegalArgumentException("未知联系状态:" + pageReqVO.getContactStatus());
             }
         }
-
         return selectJoinPage(pageReqVO, CrmCustomerDO.class, query);
     }
 
@@ -150,31 +148,28 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
         return selectCount(query);
     }
 
+    // TODO @dhb52:db 统一都是 select 关键字;
     default Long getTodayCustomerCount(Long userId) {
         MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
-
-        // 我负责的, 非公海
+        // 我负责的 + 非公海
         CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
                 CrmCustomerDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
-
         // 今天需联系
         LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
         LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
         query.between(CrmCustomerDO::getContactNextTime, beginOfToday, endOfToday);
-
         return selectCount(query);
     }
 
+    // TODO @dhb52:db 统一都是 select 关键字;
     default Long getFollowCustomerCount(Long userId) {
         MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
-
-        // 我负责的, 非公海
+        // 我负责的 + 非公海
         CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
                 CrmCustomerDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
-
-        // 未跟进
+        // 未跟进 TODO @dhb52:是不是 eq 会更好哈;mysql 不等于,对索引不友好
         query.ne(CrmClueDO::getFollowUpStatus, true);
-
         return selectCount(query);
     }
+
 }

+ 2 - 4
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java

@@ -62,16 +62,14 @@ public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> {
         return selectJoinList(CrmReceivableDO.class, query);
     }
 
+    // TODO @dhb52:db 统一都是 select 关键字;
     default Long getCheckReceivablesCount(Long userId) {
         MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
-
-        // 我负责的, 非公海
+        // 我负责的 + 非公海
         CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(),
                 CrmReceivableDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
-
         // 未提交 or 审核不通过
         query.in(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.DRAFT.getStatus(), CrmAuditStatusEnum.REJECT.getStatus());
-
         return selectCount(query);
     }
 

+ 4 - 5
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivablePlanMapper.java

@@ -79,19 +79,18 @@ public interface CrmReceivablePlanMapper extends BaseMapperX<CrmReceivablePlanDO
         return selectJoinList(CrmReceivablePlanDO.class, query);
     }
 
+    // TODO @dhb52:db 统一都是 select 关键字;
     default Long getRemindReceivablePlanCount(Long userId) {
         MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>();
-
-        // 我负责的, 非公海
+        // 我负责的 + 非公海
         CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(),
                 CrmReceivablePlanDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
-
-        // 待回款
+        // 待回款 TODO @dhb52:to_days(return_time) <= to_days(now())+ remind_days 看看怎么改成,不用数据库自己去计算这样的时间;
         LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
         query.isNull(CrmReceivablePlanDO::getReceivableId)
                 .gt(CrmReceivablePlanDO::getReturnTime, beginOfToday)
                 .apply("to_days(return_time) <= to_days(now())+ remind_days");
-
         return selectCount(query);
     }
+
 }

+ 1 - 0
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java

@@ -179,4 +179,5 @@ public interface CrmCustomerService {
      * @return 提醒数量
      */
     Long getFollowCustomerCount(Long userId);
+
 }