Commit e3ab3895b71aeeb28a3797ebc6dd6d07c12b03f8

Authored by YunaiV
1 parent 13da7eba

reactor:移除 crm 的 api 包

Showing 303 changed files with 3282 additions and 3347 deletions
yudao-module-crm/pom.xml
@@ -7,13 +7,9 @@ @@ -7,13 +7,9 @@
7 <artifactId>yudao</artifactId> 7 <artifactId>yudao</artifactId>
8 <version>${revision}</version> 8 <version>${revision}</version>
9 </parent> 9 </parent>
10 - <modules>  
11 - <module>yudao-module-crm-api</module>  
12 - <module>yudao-module-crm-biz</module>  
13 - </modules>  
14 <modelVersion>4.0.0</modelVersion> 10 <modelVersion>4.0.0</modelVersion>
15 <artifactId>yudao-module-crm</artifactId> 11 <artifactId>yudao-module-crm</artifactId>
16 - <packaging>pom</packaging> 12 + <packaging>jar</packaging>
17 13
18 <name>${project.artifactId}</name> 14 <name>${project.artifactId}</name>
19 <description> 15 <description>
@@ -21,4 +17,60 @@ @@ -21,4 +17,60 @@
21 例如说:客户、联系人、商机、合同、回款等等 17 例如说:客户、联系人、商机、合同、回款等等
22 </description> 18 </description>
23 19
  20 + <dependencies>
  21 + <dependency>
  22 + <groupId>cn.iocoder.boot</groupId>
  23 + <artifactId>yudao-module-system</artifactId>
  24 + <version>${revision}</version>
  25 + </dependency>
  26 + <dependency>
  27 + <groupId>cn.iocoder.boot</groupId>
  28 + <artifactId>yudao-module-infra</artifactId>
  29 + <version>${revision}</version>
  30 + </dependency>
  31 + <dependency>
  32 + <groupId>cn.iocoder.boot</groupId>
  33 + <artifactId>yudao-module-bpm</artifactId>
  34 + <version>${revision}</version>
  35 + </dependency>
  36 +
  37 + <!-- 业务组件 -->
  38 + <dependency>
  39 + <groupId>cn.iocoder.boot</groupId>
  40 + <artifactId>yudao-spring-boot-starter-biz-ip</artifactId>
  41 + </dependency>
  42 + <dependency>
  43 + <groupId>cn.iocoder.boot</groupId>
  44 + <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
  45 + </dependency>
  46 +
  47 + <!-- Web 相关 -->
  48 + <dependency>
  49 + <groupId>cn.iocoder.boot</groupId>
  50 + <artifactId>yudao-spring-boot-starter-web</artifactId>
  51 + </dependency>
  52 +
  53 + <dependency>
  54 + <groupId>cn.iocoder.boot</groupId>
  55 + <artifactId>yudao-spring-boot-starter-security</artifactId>
  56 + </dependency>
  57 +
  58 + <!-- DB 相关 -->
  59 + <dependency>
  60 + <groupId>cn.iocoder.boot</groupId>
  61 + <artifactId>yudao-spring-boot-starter-mybatis</artifactId>
  62 + </dependency>
  63 +
  64 + <!-- 工具类相关 -->
  65 + <dependency>
  66 + <groupId>cn.iocoder.boot</groupId>
  67 + <artifactId>yudao-spring-boot-starter-excel</artifactId>
  68 + </dependency>
  69 +
  70 + <!-- Test 测试相关 -->
  71 + <dependency>
  72 + <groupId>cn.iocoder.boot</groupId>
  73 + <artifactId>yudao-spring-boot-starter-test</artifactId>
  74 + </dependency>
  75 + </dependencies>
24 </project> 76 </project>
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/api/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/api/package-info.java
1 /** 1 /**
2 - * crm API 包,定义暴露给其它模块的 API 2 + * crm API 包,定义并实现提供给其它模块的 API
3 */ 3 */
4 package cn.iocoder.yudao.module.crm.api; 4 package cn.iocoder.yudao.module.crm.api;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessUpdateStatusReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessUpdateStatusReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/CrmClueController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/CrmClueController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmCluePageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmCluePageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueTransferReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueTransferReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBusiness2ReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBusiness2ReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBusinessReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBusinessReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactPageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactPageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractConfigController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractConfigController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/config/CrmContractConfigRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/config/CrmContractConfigRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/config/CrmContractConfigSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/config/CrmContractConfigSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractPageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractPageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractTransferReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractTransferReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerDistributeReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerDistributeReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerImportExcelVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerImportExcelVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerImportReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerImportReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerImportRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerImportRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerLockReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerLockReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerPageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerPageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerTransferReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/customer/CrmCustomerTransferReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigPageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigPageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/followup/CrmFollowUpRecordController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/followup/CrmFollowUpRecordController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/followup/vo/CrmFollowUpRecordPageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/followup/vo/CrmFollowUpRecordPageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/followup/vo/CrmFollowUpRecordRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/followup/vo/CrmFollowUpRecordRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/followup/vo/CrmFollowUpRecordSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/followup/vo/CrmFollowUpRecordSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/operatelog/CrmOperateLogController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/operatelog/CrmOperateLogController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/operatelog/vo/CrmOperateLogPageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/operatelog/vo/CrmOperateLogPageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/operatelog/vo/CrmOperateLogRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/operatelog/vo/CrmOperateLogRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionUpdateReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionUpdateReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductCategoryController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductCategoryController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryCreateReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryCreateReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryListReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryListReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/category/CrmProductCategoryRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductPageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductPageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/CrmReceivableController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/CrmReceivableController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/CrmReceivablePlanController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/CrmReceivablePlanController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanPageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanPageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivablePageReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivablePageReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivableRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivableRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivableSaveReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivableSaveReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.http renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.http
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsFunnelController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsFunnelController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsPerformanceController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsPerformanceController.java
1 -package cn.iocoder.yudao.module.crm.controller.admin.statistics;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.CommonResult;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO;  
6 -import cn.iocoder.yudao.module.crm.service.statistics.CrmStatisticsPerformanceService;  
7 -import io.swagger.v3.oas.annotations.Operation;  
8 -import io.swagger.v3.oas.annotations.tags.Tag;  
9 -import org.springframework.security.access.prepost.PreAuthorize;  
10 -import org.springframework.validation.annotation.Validated;  
11 -import org.springframework.web.bind.annotation.GetMapping;  
12 -import org.springframework.web.bind.annotation.RequestMapping;  
13 -import org.springframework.web.bind.annotation.RestController;  
14 -  
15 -import jakarta.annotation.Resource;  
16 -import jakarta.validation.Valid;  
17 -import java.util.List;  
18 -  
19 -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;  
20 -  
21 -  
22 -@Tag(name = "管理后台 - CRM 员工业绩统计")  
23 -@RestController  
24 -@RequestMapping("/crm/statistics-performance")  
25 -@Validated  
26 -public class CrmStatisticsPerformanceController {  
27 -  
28 - @Resource  
29 - private CrmStatisticsPerformanceService performanceService;  
30 -  
31 - @GetMapping("/get-contract-count-performance")  
32 - @Operation(summary = "合同数量统计", description = "用于【合同数量分析】页面")  
33 - @PreAuthorize("@ss.hasPermission('crm:statistics-performance:query')")  
34 - public CommonResult<List<CrmStatisticsPerformanceRespVO>> getContractCountPerformance(@Valid CrmStatisticsPerformanceReqVO performanceReqVO) {  
35 - return success(performanceService.getContractCountPerformance(performanceReqVO));  
36 - }  
37 -  
38 - @GetMapping("/get-contract-price-performance")  
39 - @Operation(summary = "合同金额统计")  
40 - @PreAuthorize("@ss.hasPermission('crm:statistics-performance:query')")  
41 - public CommonResult<List<CrmStatisticsPerformanceRespVO>> getContractPriceStaffPerformance(@Valid CrmStatisticsPerformanceReqVO performanceReqVO) {  
42 - return success(performanceService.getContractPricePerformance(performanceReqVO));  
43 - }  
44 -  
45 - @GetMapping("/get-receivable-price-performance")  
46 - @Operation(summary = "回款金额统计")  
47 - @PreAuthorize("@ss.hasPermission('crm:statistics-performance:query')")  
48 - public CommonResult<List<CrmStatisticsPerformanceRespVO>> getReceivablePriceStaffPerformance(@Valid CrmStatisticsPerformanceReqVO performanceReqVO) {  
49 - return success(performanceService.getReceivablePricePerformance(performanceReqVO));  
50 - }  
51 -  
52 -} 1 +package cn.iocoder.yudao.module.crm.controller.admin.statistics;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO;
  6 +import cn.iocoder.yudao.module.crm.service.statistics.CrmStatisticsPerformanceService;
  7 +import io.swagger.v3.oas.annotations.Operation;
  8 +import io.swagger.v3.oas.annotations.tags.Tag;
  9 +import org.springframework.security.access.prepost.PreAuthorize;
  10 +import org.springframework.validation.annotation.Validated;
  11 +import org.springframework.web.bind.annotation.GetMapping;
  12 +import org.springframework.web.bind.annotation.RequestMapping;
  13 +import org.springframework.web.bind.annotation.RestController;
  14 +
  15 +import jakarta.annotation.Resource;
  16 +import jakarta.validation.Valid;
  17 +import java.util.List;
  18 +
  19 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  20 +
  21 +
  22 +@Tag(name = "管理后台 - CRM 员工业绩统计")
  23 +@RestController
  24 +@RequestMapping("/crm/statistics-performance")
  25 +@Validated
  26 +public class CrmStatisticsPerformanceController {
  27 +
  28 + @Resource
  29 + private CrmStatisticsPerformanceService performanceService;
  30 +
  31 + @GetMapping("/get-contract-count-performance")
  32 + @Operation(summary = "合同数量统计", description = "用于【合同数量分析】页面")
  33 + @PreAuthorize("@ss.hasPermission('crm:statistics-performance:query')")
  34 + public CommonResult<List<CrmStatisticsPerformanceRespVO>> getContractCountPerformance(@Valid CrmStatisticsPerformanceReqVO performanceReqVO) {
  35 + return success(performanceService.getContractCountPerformance(performanceReqVO));
  36 + }
  37 +
  38 + @GetMapping("/get-contract-price-performance")
  39 + @Operation(summary = "合同金额统计")
  40 + @PreAuthorize("@ss.hasPermission('crm:statistics-performance:query')")
  41 + public CommonResult<List<CrmStatisticsPerformanceRespVO>> getContractPriceStaffPerformance(@Valid CrmStatisticsPerformanceReqVO performanceReqVO) {
  42 + return success(performanceService.getContractPricePerformance(performanceReqVO));
  43 + }
  44 +
  45 + @GetMapping("/get-receivable-price-performance")
  46 + @Operation(summary = "回款金额统计")
  47 + @PreAuthorize("@ss.hasPermission('crm:statistics-performance:query')")
  48 + public CommonResult<List<CrmStatisticsPerformanceRespVO>> getReceivablePriceStaffPerformance(@Valid CrmStatisticsPerformanceReqVO performanceReqVO) {
  49 + return success(performanceService.getReceivablePricePerformance(performanceReqVO));
  50 + }
  51 +
  52 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsPortraitController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsPortraitController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsRankController.http renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsRankController.http
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsRankController.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsRankController.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerByUserBaseRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerByUserBaseRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerContractSummaryRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerContractSummaryRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerDealCycleByAreaRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerDealCycleByAreaRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerDealCycleByDateRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerDealCycleByDateRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerDealCycleByProductRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerDealCycleByProductRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerDealCycleByUserRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerDealCycleByUserRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerSummaryByDateRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerSummaryByDateRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerSummaryByUserRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerSummaryByUserRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsFollowUpSummaryByDateRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsFollowUpSummaryByDateRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsFollowUpSummaryByTypeRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsFollowUpSummaryByTypeRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsFollowUpSummaryByUserRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsFollowUpSummaryByUserRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsPoolSummaryByDateRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsPoolSummaryByDateRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsPoolSummaryByUserRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsPoolSummaryByUserRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/funnel/CrmStatisticFunnelSummaryRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/funnel/CrmStatisticFunnelSummaryRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/funnel/CrmStatisticsBusinessInversionRateSummaryByDateRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/funnel/CrmStatisticsBusinessInversionRateSummaryByDateRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/funnel/CrmStatisticsBusinessSummaryByDateRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/funnel/CrmStatisticsBusinessSummaryByDateRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/funnel/CrmStatisticsBusinessSummaryByEndStatusRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/funnel/CrmStatisticsBusinessSummaryByEndStatusRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/funnel/CrmStatisticsFunnelReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/funnel/CrmStatisticsFunnelReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/performance/CrmStatisticsPerformanceReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/performance/CrmStatisticsPerformanceReqVO.java
1 -package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance;  
2 -  
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.Data;  
5 -import org.springframework.format.annotation.DateTimeFormat;  
6 -  
7 -import jakarta.validation.constraints.NotEmpty;  
8 -import jakarta.validation.constraints.NotNull;  
9 -import java.time.LocalDateTime;  
10 -import java.util.List;  
11 -  
12 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;  
13 -  
14 -@Schema(description = "管理后台 - CRM 员工业绩统计 Request VO")  
15 -@Data  
16 -public class CrmStatisticsPerformanceReqVO {  
17 -  
18 - @Schema(description = "部门 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
19 - @NotNull(message = "部门 id 不能为空")  
20 - private Long deptId;  
21 -  
22 - /**  
23 - * 负责人用户 id, 当用户为空, 则计算部门下用户  
24 - */  
25 - @Schema(description = "负责人用户 id", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1")  
26 - private Long userId;  
27 -  
28 - /**  
29 - * userIds 目前不用前端传递,目前是方便后端通过 deptId 读取编号后,设置回来  
30 - * <p>  
31 - * 后续,可能会支持选择部分用户进行查询  
32 - */  
33 - @Schema(description = "负责人用户 id 集合", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2")  
34 - private List<Long> userIds;  
35 -  
36 - @Schema(description = "时间范围", requiredMode = Schema.RequiredMode.REQUIRED)  
37 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
38 - @NotEmpty(message = "时间范围不能为空")  
39 - private LocalDateTime[] times;  
40 -  
41 -} 1 +package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +
  7 +import jakarta.validation.constraints.NotEmpty;
  8 +import jakarta.validation.constraints.NotNull;
  9 +import java.time.LocalDateTime;
  10 +import java.util.List;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@Schema(description = "管理后台 - CRM 员工业绩统计 Request VO")
  15 +@Data
  16 +public class CrmStatisticsPerformanceReqVO {
  17 +
  18 + @Schema(description = "部门 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  19 + @NotNull(message = "部门 id 不能为空")
  20 + private Long deptId;
  21 +
  22 + /**
  23 + * 负责人用户 id, 当用户为空, 则计算部门下用户
  24 + */
  25 + @Schema(description = "负责人用户 id", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1")
  26 + private Long userId;
  27 +
  28 + /**
  29 + * userIds 目前不用前端传递,目前是方便后端通过 deptId 读取编号后,设置回来
  30 + * <p>
  31 + * 后续,可能会支持选择部分用户进行查询
  32 + */
  33 + @Schema(description = "负责人用户 id 集合", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2")
  34 + private List<Long> userIds;
  35 +
  36 + @Schema(description = "时间范围", requiredMode = Schema.RequiredMode.REQUIRED)
  37 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  38 + @NotEmpty(message = "时间范围不能为空")
  39 + private LocalDateTime[] times;
  40 +
  41 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/performance/CrmStatisticsPerformanceRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/performance/CrmStatisticsPerformanceRespVO.java
1 -package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance;  
2 -  
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.Data;  
5 -import java.math.BigDecimal;  
6 -  
7 -  
8 -@Schema(description = "管理后台 - CRM 员工业绩统计 Response VO")  
9 -@Data  
10 -public class CrmStatisticsPerformanceRespVO {  
11 -  
12 - @Schema(description = "时间轴", requiredMode = Schema.RequiredMode.REQUIRED, example = "202401")  
13 - private String time;  
14 -  
15 - @Schema(description = "当月统计结果", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
16 - private BigDecimal currentMonthCount;  
17 -  
18 - @Schema(description = "上月统计结果", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")  
19 - private BigDecimal lastMonthCount;  
20 -  
21 - @Schema(description = "去年同期统计结果", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")  
22 - private BigDecimal lastYearCount;  
23 -  
24 -} 1 +package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import java.math.BigDecimal;
  6 +
  7 +
  8 +@Schema(description = "管理后台 - CRM 员工业绩统计 Response VO")
  9 +@Data
  10 +public class CrmStatisticsPerformanceRespVO {
  11 +
  12 + @Schema(description = "时间轴", requiredMode = Schema.RequiredMode.REQUIRED, example = "202401")
  13 + private String time;
  14 +
  15 + @Schema(description = "当月统计结果", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  16 + private BigDecimal currentMonthCount;
  17 +
  18 + @Schema(description = "上月统计结果", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
  19 + private BigDecimal lastMonthCount;
  20 +
  21 + @Schema(description = "去年同期统计结果", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
  22 + private BigDecimal lastYearCount;
  23 +
  24 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerAreaRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerAreaRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerIndustryRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerIndustryRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerLevelRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerLevelRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerSourceRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerSourceRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticsPortraitReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticsPortraitReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/rank/CrmStatisticsRankReqVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/rank/CrmStatisticsRankReqVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/rank/CrmStatisticsRankRespVO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/rank/CrmStatisticsRankRespVO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/app/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/app/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/convert/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessProductDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessProductDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/clue/CrmClueDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/clue/CrmClueDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/clue/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/clue/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/CrmContactBusinessDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/CrmContactBusinessDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/CrmContactDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/CrmContactDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contact/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/CrmContractConfigDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/CrmContractConfigDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/CrmContractDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/CrmContractDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/CrmContractProductDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/contract/CrmContractProductDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerLimitConfigDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerLimitConfigDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerPoolConfigDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerPoolConfigDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/followup/CrmFollowUpRecordDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/followup/CrmFollowUpRecordDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductCategoryDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductCategoryDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivableDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivableDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivablePlanDO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/receivable/CrmReceivablePlanDO.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessProductMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessProductMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/CrmClueMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/CrmClueMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactBusinessMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactBusinessMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractConfigMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractConfigMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractProductMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractProductMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerLimitConfigMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerLimitConfigMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerPoolConfigMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerPoolConfigMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/followup/CrmFollowUpRecordMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/followup/CrmFollowUpRecordMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductCategoryMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductCategoryMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivablePlanMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivablePlanMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsCustomerMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsCustomerMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsFunnelMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsFunnelMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsPerformanceMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsPerformanceMapper.java
1 -package cn.iocoder.yudao.module.crm.dal.mysql.statistics;  
2 -  
3 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO;  
5 -import org.apache.ibatis.annotations.Mapper;  
6 -  
7 -import java.util.List;  
8 -  
9 -/**  
10 - * CRM 员工业绩分析 Mapper  
11 - *  
12 - * @author scholar  
13 - */  
14 -@Mapper  
15 -public interface CrmStatisticsPerformanceMapper {  
16 -  
17 - /**  
18 - * 员工签约合同数量  
19 - *  
20 - * @param performanceReqVO 参数  
21 - * @return 员工签约合同数量  
22 - */  
23 - List<CrmStatisticsPerformanceRespVO> selectContractCountPerformance(CrmStatisticsPerformanceReqVO performanceReqVO);  
24 -  
25 - /**  
26 - * 员工签约合同金额  
27 - *  
28 - * @param performanceReqVO 参数  
29 - * @return 员工签约合同金额  
30 - */  
31 - List<CrmStatisticsPerformanceRespVO> selectContractPricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO);  
32 -  
33 - /**  
34 - * 员工回款金额  
35 - *  
36 - * @param performanceReqVO 参数  
37 - * @return 员工回款金额  
38 - */  
39 - List<CrmStatisticsPerformanceRespVO> selectReceivablePricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO);  
40 -  
41 -} 1 +package cn.iocoder.yudao.module.crm.dal.mysql.statistics;
  2 +
  3 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * CRM 员工业绩分析 Mapper
  11 + *
  12 + * @author scholar
  13 + */
  14 +@Mapper
  15 +public interface CrmStatisticsPerformanceMapper {
  16 +
  17 + /**
  18 + * 员工签约合同数量
  19 + *
  20 + * @param performanceReqVO 参数
  21 + * @return 员工签约合同数量
  22 + */
  23 + List<CrmStatisticsPerformanceRespVO> selectContractCountPerformance(CrmStatisticsPerformanceReqVO performanceReqVO);
  24 +
  25 + /**
  26 + * 员工签约合同金额
  27 + *
  28 + * @param performanceReqVO 参数
  29 + * @return 员工签约合同金额
  30 + */
  31 + List<CrmStatisticsPerformanceRespVO> selectContractPricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO);
  32 +
  33 + /**
  34 + * 员工回款金额
  35 + *
  36 + * @param performanceReqVO 参数
  37 + * @return 员工回款金额
  38 + */
  39 + List<CrmStatisticsPerformanceRespVO> selectReceivablePricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO);
  40 +
  41 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsPortraitMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsPortraitMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsRankMapper.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsRankMapper.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/redis/RedisKeyConstants.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/redis/RedisKeyConstants.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/redis/no/CrmNoRedisDAO.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/redis/no/CrmNoRedisDAO.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/DictTypeConstants.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/DictTypeConstants.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/business/CrmBusinessEndStatusEnum.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/business/CrmBusinessEndStatusEnum.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneTypeEnum.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneTypeEnum.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLimitConfigTypeEnum.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLimitConfigTypeEnum.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/product/CrmProductStatusEnum.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/product/CrmProductStatusEnum.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/receivable/CrmReceivableReturnTypeEnum.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/receivable/CrmReceivableReturnTypeEnum.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/excel/core/AreaExcelColumnSelectFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/excel/core/AreaExcelColumnSelectFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/excel/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/excel/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmBusinessParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmBusinessParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmContactParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmContactParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmContractParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmContractParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmCustomerIndustryParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmCustomerIndustryParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmCustomerLevelParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmCustomerLevelParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmCustomerParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmCustomerParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmCustomerSourceParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmCustomerSourceParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmProductStatusParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmProductStatusParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmProductUnitParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmProductUnitParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmReceivablePlanParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmReceivablePlanParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmReceivableReturnTypeParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmReceivableReturnTypeParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/SysAdminUserParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/SysAdminUserParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/SysAreaParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/SysAreaParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/SysBooleanParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/SysBooleanParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/SysDeptParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/SysDeptParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/SysSexParseFunction.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/SysSexParseFunction.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/annotations/CrmPermission.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/annotations/CrmPermission.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/aop/CrmPermissionAspect.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/aop/CrmPermissionAspect.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/web/config/CrmWebConfiguration.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/web/config/CrmWebConfiguration.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/api/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/framework/web/package-info.java
1 /** 1 /**
2 - * crm API 实现类,定义暴露给其它模块的 API 2 + * crm 模块的 web 拓展封装
3 */ 3 */
4 -package cn.iocoder.yudao.module.crm.api; 4 +package cn.iocoder.yudao.module.crm.framework.web;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/job/customer/CrmCustomerAutoPutPoolJob.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/job/customer/CrmCustomerAutoPutPoolJob.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/job/package-info.java 0 → 100644
  1 +/**
  2 + * 定时任务
  3 + */
  4 +package cn.iocoder.yudao.module.crm.job;
0 \ No newline at end of file 5 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/package-info.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/package-info.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.business;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusSaveReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
  7 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO;
  8 +import jakarta.validation.Valid;
  9 +
  10 +import java.util.Collection;
  11 +import java.util.List;
  12 +import java.util.Map;
  13 +
  14 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  15 +
  16 +/**
  17 + * 商机状态 Service 接口
  18 + *
  19 + * @author ljlleo
  20 + */
  21 +public interface CrmBusinessStatusService {
  22 +
  23 + /**
  24 + * 创建商机状态
  25 + *
  26 + * @param createReqVO 创建信息
  27 + * @return 编号
  28 + */
  29 + Long createBusinessStatus(@Valid CrmBusinessStatusSaveReqVO createReqVO);
  30 +
  31 + /**
  32 + * 更新商机状态
  33 + *
  34 + * @param updateReqVO 更新信息
  35 + */
  36 + void updateBusinessStatus(@Valid CrmBusinessStatusSaveReqVO updateReqVO);
  37 +
  38 + /**
  39 + * 删除商机状态
  40 + *
  41 + * @param id 编号
  42 + */
  43 + void deleteBusinessStatusType(Long id);
  44 +
  45 + /**
  46 + * 获得商机状态组
  47 + *
  48 + * @param id 编号
  49 + * @return 商机状态组
  50 + */
  51 + CrmBusinessStatusTypeDO getBusinessStatusType(Long id);
  52 +
  53 + /**
  54 + * 校验商机状态组
  55 + *
  56 + * @param id 编号
  57 + */
  58 + void validateBusinessStatusType(Long id);
  59 +
  60 + /**
  61 + * 获得商机状态组列表
  62 + *
  63 + * @return 商机状态组列表
  64 + */
  65 + List<CrmBusinessStatusTypeDO> getBusinessStatusTypeList();
  66 +
  67 + /**
  68 + * 获得商机状态组分页
  69 + *
  70 + * @param pageReqVO 分页查询
  71 + * @return 商机状态组分页
  72 + */
  73 + PageResult<CrmBusinessStatusTypeDO> getBusinessStatusTypePage(PageParam pageReqVO);
  74 +
  75 + /**
  76 + * 获得商机状态组列表
  77 + *
  78 + * @param ids 编号数组
  79 + * @return 商机状态组列表
  80 + */
  81 + List<CrmBusinessStatusTypeDO> getBusinessStatusTypeList(Collection<Long> ids);
  82 +
  83 + /**
  84 + * 获得商机状态组 Map
  85 + *
  86 + * @param ids 编号数组
  87 + * @return 商机状态组 Map
  88 + */
  89 + default Map<Long, CrmBusinessStatusTypeDO> getBusinessStatusTypeMap(Collection<Long> ids) {
  90 + return convertMap(getBusinessStatusTypeList(ids), CrmBusinessStatusTypeDO::getId);
  91 + }
  92 +
  93 + /**
  94 + * 获得指定类型的商机状态列表
  95 + *
  96 + * @param typeId 商机状态组编号
  97 + * @return 商机状态列表
  98 + */
  99 + List<CrmBusinessStatusDO> getBusinessStatusListByTypeId(Long typeId);
  100 +
  101 + /**
  102 + * 获得商机状态列表
  103 + *
  104 + * @param ids 编号数组
  105 + * @return 商机状态列表
  106 + */
  107 + List<CrmBusinessStatusDO> getBusinessStatusList(Collection<Long> ids);
  108 +
  109 + /**
  110 + * 获得商机状态 Map
  111 + *
  112 + * @param ids 编号数组
  113 + * @return 商机状态 Map
  114 + */
  115 + default Map<Long, CrmBusinessStatusDO> getBusinessStatusMap(Collection<Long> ids) {
  116 + return convertMap(getBusinessStatusList(ids), CrmBusinessStatusDO::getId);
  117 + }
  118 +
  119 + /**
  120 + * 获得商机状态
  121 + *
  122 + * @param id 编号
  123 + * @return 商机状态
  124 + */
  125 + CrmBusinessStatusDO getBusinessStatus(Long id);
  126 +
  127 + /**
  128 + * 校验商机状态
  129 + *
  130 + * @param statusTypeId 商机状态组编号
  131 + * @param statusId 商机状态编号
  132 + */
  133 + CrmBusinessStatusDO validateBusinessStatus(Long statusTypeId, Long statusId);
  134 +
  135 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.clue;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueSaveReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransferReqVO;
  7 +import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;
  8 +import jakarta.validation.Valid;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +/**
  13 + * 线索 Service 接口
  14 + *
  15 + * @author Wanwan
  16 + */
  17 +public interface CrmClueService {
  18 +
  19 + /**
  20 + * 创建线索
  21 + *
  22 + * @param createReqVO 创建信息
  23 + * @return 编号
  24 + */
  25 + Long createClue(@Valid CrmClueSaveReqVO createReqVO);
  26 +
  27 + /**
  28 + * 更新线索
  29 + *
  30 + * @param updateReqVO 更新信息
  31 + */
  32 + void updateClue(@Valid CrmClueSaveReqVO updateReqVO);
  33 +
  34 + /**
  35 + * 更新线索相关的跟进信息
  36 + *
  37 + * @param id 编号
  38 + * @param contactNextTime 下次联系时间
  39 + * @param contactLastContent 最后联系内容
  40 + */
  41 + void updateClueFollowUp(Long id, LocalDateTime contactNextTime, String contactLastContent);
  42 +
  43 + /**
  44 + * 删除线索
  45 + *
  46 + * @param id 编号
  47 + */
  48 + void deleteClue(Long id);
  49 +
  50 + /**
  51 + * 获得线索
  52 + *
  53 + * @param id 编号
  54 + * @return 线索
  55 + */
  56 + CrmClueDO getClue(Long id);
  57 +
  58 + /**
  59 + * 获得线索分页
  60 + *
  61 + * @param pageReqVO 分页查询
  62 + * @param userId 用户编号
  63 + * @return 线索分页
  64 + */
  65 + PageResult<CrmClueDO> getCluePage(CrmCluePageReqVO pageReqVO, Long userId);
  66 +
  67 + /**
  68 + * 线索转移
  69 + *
  70 + * @param reqVO 请求
  71 + * @param userId 用户编号
  72 + */
  73 + void transferClue(CrmClueTransferReqVO reqVO, Long userId);
  74 +
  75 + /**
  76 + * 线索转化为客户
  77 + *
  78 + * @param id 线索编号
  79 + * @param userId 用户编号
  80 + */
  81 + void transformClue(Long id, Long userId);
  82 +
  83 + /**
  84 + * 获得分配给我的、待跟进的线索数量
  85 + *
  86 + * @param userId 用户编号
  87 + * @return 数量
  88 + */
  89 + Long getFollowClueCount(Long userId);
  90 +
  91 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.contact;
  2 +
  3 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusiness2ReqVO;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessReqVO;
  5 +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessDO;
  6 +import jakarta.validation.Valid;
  7 +
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * CRM 联系人与商机的关联 Service 接口
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +public interface CrmContactBusinessService {
  16 +
  17 + /**
  18 + * 创建联系人与商机的关联【通过联系人,关联商机】
  19 + *
  20 + * @param createReqVO 创建信息
  21 + */
  22 + void createContactBusinessList(@Valid CrmContactBusinessReqVO createReqVO);
  23 +
  24 + /**
  25 + * 创建联系人与商机的关联【通过商机,关联联系人】
  26 + *
  27 + * @param createReqVO 创建信息
  28 + */
  29 + void createContactBusinessList2(@Valid CrmContactBusiness2ReqVO createReqVO);
  30 +
  31 + /**
  32 + * 删除联系人与商机的关联【通过联系人,取关商机】
  33 + *
  34 + * @param deleteReqVO 删除信息
  35 + */
  36 + void deleteContactBusinessList(@Valid CrmContactBusinessReqVO deleteReqVO);
  37 +
  38 + /**
  39 + * 删除联系人与商机的关联【通过商机,取关联系人】
  40 + *
  41 + * @param deleteReqVO 删除信息
  42 + */
  43 + void deleteContactBusinessList2(@Valid CrmContactBusiness2ReqVO deleteReqVO);
  44 +
  45 + /**
  46 + * 删除联系人与商机的关联,基于联系人编号
  47 + *
  48 + * @param contactId 联系人编号
  49 + */
  50 + void deleteContactBusinessByContactId(Long contactId);
  51 +
  52 + /**
  53 + * 获得联系人与商机的关联列表,基于联系人编号
  54 + *
  55 + * @param contactId 联系人编号
  56 + * @return 联系人商机关联
  57 + */
  58 + List<CrmContactBusinessDO> getContactBusinessListByContactId(Long contactId);
  59 +
  60 + /**
  61 + * 获得联系人与商机的关联列表,基于商机编号
  62 + *
  63 + * @param businessId 商机编号
  64 + * @return 联系人商机关联
  65 + */
  66 + List<CrmContactBusinessDO> getContactBusinessListByBusinessId(Long businessId);
  67 +
  68 +}
0 \ No newline at end of file 69 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.contact;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactSaveReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactTransferReqVO;
  7 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
  8 +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
  9 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
  10 +import jakarta.validation.Valid;
  11 +
  12 +import java.time.LocalDateTime;
  13 +import java.util.Collection;
  14 +import java.util.List;
  15 +import java.util.Map;
  16 +
  17 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  18 +
  19 +/**
  20 + * CRM 联系人 Service 接口
  21 + *
  22 + * @author 芋道源码
  23 + */
  24 +public interface CrmContactService {
  25 +
  26 + /**
  27 + * 创建联系人
  28 + *
  29 + * @param createReqVO 创建信息
  30 + * @param userId 用户编号
  31 + * @return 编号
  32 + */
  33 + Long createContact(@Valid CrmContactSaveReqVO createReqVO, Long userId);
  34 +
  35 + /**
  36 + * 更新联系人
  37 + *
  38 + * @param updateReqVO 更新信息
  39 + */
  40 + void updateContact(@Valid CrmContactSaveReqVO updateReqVO);
  41 +
  42 + /**
  43 + * 删除联系人
  44 + *
  45 + * @param id 编号
  46 + */
  47 + void deleteContact(Long id);
  48 +
  49 + /**
  50 + * 联系人转移
  51 + *
  52 + * @param reqVO 请求
  53 + * @param userId 用户编号
  54 + */
  55 + void transferContact(CrmContactTransferReqVO reqVO, Long userId);
  56 +
  57 + /**
  58 + * 更新指定客户的联系人的负责人
  59 + * 数据权限基于 【客户】
  60 + *
  61 + * @param customerId 客户编号
  62 + * @param ownerUserId 用户编号
  63 + */
  64 + void updateOwnerUserIdByCustomerId(Long customerId, Long ownerUserId);
  65 +
  66 + /**
  67 + * 更新联系人相关跟进信息
  68 + *
  69 + * @param id 编号
  70 + * @param contactNextTime 下次联系时间
  71 + * @param contactLastContent 最后联系内容
  72 + */
  73 + void updateContactFollowUp(Long id, LocalDateTime contactNextTime, String contactLastContent);
  74 +
  75 + /**
  76 + * 更新联系人的下次联系时间
  77 + *
  78 + * @param ids 编号数组
  79 + * @param contactNextTime 下次联系时间
  80 + */
  81 + void updateContactContactNextTime(Collection<Long> ids, LocalDateTime contactNextTime);
  82 +
  83 + /**
  84 + * 获得联系人
  85 + *
  86 + * @param id 编号
  87 + * @return 联系人
  88 + */
  89 + CrmContactDO getContact(Long id);
  90 +
  91 + /**
  92 + * 校验联系人
  93 + *
  94 + * @param id 编号
  95 + */
  96 + void validateContact(Long id);
  97 +
  98 + /**
  99 + * 获得联系人列表
  100 + *
  101 + * @param ids 编号
  102 + * @return 联系人列表
  103 + */
  104 + List<CrmContactDO> getContactList(Collection<Long> ids);
  105 +
  106 + /**
  107 + * 获得联系人 Map
  108 + *
  109 + * @param ids 编号
  110 + * @return 联系人 Map
  111 + */
  112 + default Map<Long, CrmContactDO> getContactMap(Collection<Long> ids) {
  113 + return convertMap(getContactList(ids), CrmContactDO::getId);
  114 + }
  115 +
  116 + /**
  117 + * 获取联系人列表(校验权限)
  118 + *
  119 + * @param userId 用户编号
  120 + * @return 联系人列表
  121 + */
  122 + List<CrmContactDO> getContactList(Long userId);
  123 +
  124 + /**
  125 + * 获得联系人分页
  126 + *
  127 + * 数据权限:基于 {@link CrmContactDO}
  128 + *
  129 + * @param pageReqVO 分页查询
  130 + * @param userId 用户编号
  131 + * @return 联系人分页
  132 + */
  133 + PageResult<CrmContactDO> getContactPage(CrmContactPageReqVO pageReqVO, Long userId);
  134 +
  135 + /**
  136 + * 获得联系人分页
  137 + *
  138 + * 数据权限:基于 {@link CrmCustomerDO}
  139 + *
  140 + * @param pageVO 分页查询
  141 + * @return 联系人分页
  142 + */
  143 + PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO);
  144 +
  145 + /**
  146 + * 获得联系人分页
  147 + *
  148 + * 数据权限:基于 {@link CrmBusinessDO}
  149 + *
  150 + * @param pageVO 分页查询
  151 + * @return 联系人分页
  152 + */
  153 + PageResult<CrmContactDO> getContactPageByBusinessId(CrmContactPageReqVO pageVO);
  154 +
  155 + /**
  156 + * 获取关联客户的联系人数量
  157 + *
  158 + * @param customerId 客户编号
  159 + * @return 数量
  160 + */
  161 + Long getContactCountByCustomerId(Long customerId);
  162 +
  163 + /**
  164 + * 获得联系人列表
  165 + *
  166 + * @param customerId 客户编号
  167 + * @param ownerUserId 负责人编号
  168 + * @return 联系人列表
  169 + */
  170 + List<CrmContactDO> getContactListByCustomerIdOwnerUserId(Long customerId, Long ownerUserId);
  171 +
  172 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractConfigService.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractConfigService.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractConfigServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.contract;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.config.CrmContractConfigSaveReqVO;
  5 +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractConfigDO;
  6 +import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractConfigMapper;
  7 +import com.mzt.logapi.context.LogRecordContext;
  8 +import com.mzt.logapi.starter.annotation.LogRecord;
  9 +import jakarta.annotation.Resource;
  10 +import org.springframework.stereotype.Service;
  11 +import org.springframework.validation.annotation.Validated;
  12 +
  13 +import java.util.Objects;
  14 +
  15 +import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*;
  16 +
  17 +/**
  18 + * 合同配置 Service 实现类
  19 + *
  20 + * @author 芋道源码
  21 + */
  22 +@Service
  23 +@Validated
  24 +public class CrmContractConfigServiceImpl implements CrmContractConfigService {
  25 +
  26 + @Resource
  27 + private CrmContractConfigMapper contractConfigMapper;
  28 +
  29 + @Override
  30 + public CrmContractConfigDO getContractConfig() {
  31 + return contractConfigMapper.selectOne();
  32 + }
  33 +
  34 + @Override
  35 + @LogRecord(type = CRM_CONTRACT_CONFIG_TYPE, subType = CRM_CONTRACT_CONFIG_SUB_TYPE, bizNo = "{{#configId}}",
  36 + success = CRM_CONTRACT_CONFIG_SUCCESS)
  37 + public void saveContractConfig(CrmContractConfigSaveReqVO saveReqVO) {
  38 + // 1. 存在,则进行更新
  39 + CrmContractConfigDO dbConfig = getContractConfig();
  40 + CrmContractConfigDO config = BeanUtils.toBean(saveReqVO, CrmContractConfigDO.class);
  41 + if (Objects.nonNull(dbConfig)) {
  42 + contractConfigMapper.updateById(config.setId(dbConfig.getId()));
  43 + // 记录操作日志上下文
  44 + LogRecordContext.putVariable("isConfigUpdate", Boolean.TRUE);
  45 + LogRecordContext.putVariable("configId", config.getId());
  46 + return;
  47 + }
  48 +
  49 + // 2. 不存在,则进行插入
  50 + contractConfigMapper.insert(config);
  51 + // 记录操作日志上下文
  52 + LogRecordContext.putVariable("isConfigUpdate", Boolean.FALSE);
  53 + LogRecordContext.putVariable("configId", config.getId());
  54 + }
  55 +
  56 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/listener/CrmContractStatusListener.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.contract.listener;
  2 +
  3 +import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
  4 +import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
  5 +import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
  6 +import cn.iocoder.yudao.module.crm.service.contract.CrmContractServiceImpl;
  7 +import jakarta.annotation.Resource;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +/**
  11 + * 合同审批的结果的监听器实现类
  12 + *
  13 + * @author HUIHUI
  14 + */
  15 +@Component
  16 +public class CrmContractStatusListener extends BpmProcessInstanceStatusEventListener {
  17 +
  18 + @Resource
  19 + private CrmContractService contractService;
  20 +
  21 + @Override
  22 + public String getProcessDefinitionKey() {
  23 + return CrmContractServiceImpl.BPM_PROCESS_DEFINITION_KEY;
  24 + }
  25 +
  26 + @Override
  27 + protected void onEvent(BpmProcessInstanceStatusEvent event) {
  28 + contractService.updateContractAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus());
  29 + }
  30 +
  31 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.customer;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigSaveReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO;
  7 +import jakarta.validation.Valid;
  8 +
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * 客户限制配置 Service 接口
  13 + *
  14 + * @author Wanwan
  15 + */
  16 +public interface CrmCustomerLimitConfigService {
  17 +
  18 + /**
  19 + * 创建客户限制配置
  20 + *
  21 + * @param createReqVO 创建信息
  22 + * @return 编号
  23 + */
  24 + Long createCustomerLimitConfig(@Valid CrmCustomerLimitConfigSaveReqVO createReqVO);
  25 +
  26 + /**
  27 + * 更新客户限制配置
  28 + *
  29 + * @param updateReqVO 更新信息
  30 + */
  31 + void updateCustomerLimitConfig(@Valid CrmCustomerLimitConfigSaveReqVO updateReqVO);
  32 +
  33 + /**
  34 + * 删除客户限制配置
  35 + *
  36 + * @param id 编号
  37 + */
  38 + void deleteCustomerLimitConfig(Long id);
  39 +
  40 + /**
  41 + * 获得客户限制配置
  42 + *
  43 + * @param id 编号
  44 + * @return 客户限制配置
  45 + */
  46 + CrmCustomerLimitConfigDO getCustomerLimitConfig(Long id);
  47 +
  48 + /**
  49 + * 获得客户限制配置分页
  50 + *
  51 + * @param pageReqVO 分页查询
  52 + * @return 客户限制配置分页
  53 + */
  54 + PageResult<CrmCustomerLimitConfigDO> getCustomerLimitConfigPage(CrmCustomerLimitConfigPageReqVO pageReqVO);
  55 +
  56 + /**
  57 + * 查询用户对应的配置列表
  58 + *
  59 + * @param type 类型
  60 + * @param userId 用户类型
  61 + */
  62 + List<CrmCustomerLimitConfigDO> getCustomerLimitConfigListByUserId(Integer type, Long userId);
  63 +
  64 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigServiceImpl.java
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigService.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigService.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.customer;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO;
  5 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO;
  6 +import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerPoolConfigMapper;
  7 +import com.mzt.logapi.context.LogRecordContext;
  8 +import com.mzt.logapi.starter.annotation.LogRecord;
  9 +import jakarta.annotation.Resource;
  10 +import org.springframework.stereotype.Service;
  11 +import org.springframework.validation.annotation.Validated;
  12 +
  13 +import java.util.Objects;
  14 +
  15 +import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*;
  16 +
  17 +/**
  18 + * 客户公海配置 Service 实现类
  19 + *
  20 + * @author Wanwan
  21 + */
  22 +@Service
  23 +@Validated
  24 +public class CrmCustomerPoolConfigServiceImpl implements CrmCustomerPoolConfigService {
  25 +
  26 + @Resource
  27 + private CrmCustomerPoolConfigMapper customerPoolConfigMapper;
  28 +
  29 + @Override
  30 + public CrmCustomerPoolConfigDO getCustomerPoolConfig() {
  31 + return customerPoolConfigMapper.selectOne();
  32 + }
  33 +
  34 + @Override
  35 + @LogRecord(type = CRM_CUSTOMER_POOL_CONFIG_TYPE, subType = CRM_CUSTOMER_POOL_CONFIG_SUB_TYPE, bizNo = "{{#poolConfigId}}",
  36 + success = CRM_CUSTOMER_POOL_CONFIG_SUCCESS)
  37 + public void saveCustomerPoolConfig(CrmCustomerPoolConfigSaveReqVO saveReqVO) {
  38 + // 1. 存在,则进行更新
  39 + CrmCustomerPoolConfigDO dbConfig = getCustomerPoolConfig();
  40 + CrmCustomerPoolConfigDO poolConfig = BeanUtils.toBean(saveReqVO, CrmCustomerPoolConfigDO.class);
  41 + if (Objects.nonNull(dbConfig)) {
  42 + customerPoolConfigMapper.updateById(poolConfig.setId(dbConfig.getId()));
  43 + // 记录操作日志上下文
  44 + LogRecordContext.putVariable("isPoolConfigUpdate", Boolean.TRUE);
  45 + LogRecordContext.putVariable("poolConfigId", poolConfig.getId());
  46 + return;
  47 + }
  48 +
  49 + // 2. 不存在,则进行插入
  50 + customerPoolConfigMapper.insert(poolConfig);
  51 + // 记录操作日志上下文
  52 + LogRecordContext.putVariable("isPoolConfigUpdate", Boolean.FALSE);
  53 + LogRecordContext.putVariable("poolConfigId", poolConfig.getId());
  54 + }
  55 +
  56 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java
1 -package cn.iocoder.yudao.module.crm.service.contact; 1 +package cn.iocoder.yudao.module.crm.service.customer;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactSaveReqVO;  
6 -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactTransferReqVO;  
7 -import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;  
8 -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO; 4 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.customer.*;
9 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; 5 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
  6 +import cn.iocoder.yudao.module.crm.service.customer.bo.CrmCustomerCreateReqBO;
10 import jakarta.validation.Valid; 7 import jakarta.validation.Valid;
11 8
12 import java.time.LocalDateTime; 9 import java.time.LocalDateTime;
@@ -17,156 +14,185 @@ import java.util.Map; @@ -17,156 +14,185 @@ import java.util.Map;
17 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; 14 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
18 15
19 /** 16 /**
20 - * CRM 联系人 Service 接口 17 + * 客户 Service 接口
21 * 18 *
22 - * @author 芋道源码 19 + * @author Wanwan
23 */ 20 */
24 -public interface CrmContactService { 21 +public interface CrmCustomerService {
25 22
26 /** 23 /**
27 - * 创建联系人 24 + * 创建客户
28 * 25 *
29 * @param createReqVO 创建信息 26 * @param createReqVO 创建信息
30 * @param userId 用户编号 27 * @param userId 用户编号
31 * @return 编号 28 * @return 编号
32 */ 29 */
33 - Long createContact(@Valid CrmContactSaveReqVO createReqVO, Long userId); 30 + Long createCustomer(@Valid CrmCustomerSaveReqVO createReqVO, Long userId);
34 31
35 /** 32 /**
36 - * 更新联系人 33 + * 更新客户
37 * 34 *
38 * @param updateReqVO 更新信息 35 * @param updateReqVO 更新信息
39 */ 36 */
40 - void updateContact(@Valid CrmContactSaveReqVO updateReqVO); 37 + void updateCustomer(@Valid CrmCustomerSaveReqVO updateReqVO);
41 38
42 /** 39 /**
43 - * 删除联系人 40 + * 更新客户的跟进状态
44 * 41 *
45 - * @param id 编号 42 + * @param id 编号
  43 + * @param dealStatus 跟进状态
46 */ 44 */
47 - void deleteContact(Long id); 45 + void updateCustomerDealStatus(Long id, Boolean dealStatus);
48 46
49 /** 47 /**
50 - * 联系人转移 48 + * 更新客户相关的跟进信息
51 * 49 *
52 - * @param reqVO 请求  
53 - * @param userId 用户编号 50 + * @param id 编号
  51 + * @param contactNextTime 下次联系时间
  52 + * @param contactLastContent 最后联系内容
54 */ 53 */
55 - void transferContact(CrmContactTransferReqVO reqVO, Long userId); 54 + void updateCustomerFollowUp(Long id, LocalDateTime contactNextTime, String contactLastContent);
56 55
57 /** 56 /**
58 - * 更新指定客户的联系人的负责人  
59 - * 数据权限基于 【客户】 57 + * 删除客户
60 * 58 *
61 - * @param customerId 客户编号  
62 - * @param ownerUserId 用户编号 59 + * @param id 编号
63 */ 60 */
64 - void updateOwnerUserIdByCustomerId(Long customerId, Long ownerUserId); 61 + void deleteCustomer(Long id);
65 62
66 /** 63 /**
67 - * 更新联系人相关跟进信息 64 + * 获得客户
68 * 65 *
69 - * @param id 编号  
70 - * @param contactNextTime 下次联系时间  
71 - * @param contactLastContent 最后联系内容 66 + * @param id 编号
  67 + * @return 客户
72 */ 68 */
73 - void updateContactFollowUp(Long id, LocalDateTime contactNextTime, String contactLastContent); 69 + CrmCustomerDO getCustomer(Long id);
74 70
75 /** 71 /**
76 - * 更新联系人的下次联系时间 72 + * 获得客户列表
77 * 73 *
78 - * @param ids 编号数组  
79 - * @param contactNextTime 下次联系时间 74 + * @param ids 客户编号数组
  75 + * @return 客户列表
  76 + * @author ljlleo
80 */ 77 */
81 - void updateContactContactNextTime(Collection<Long> ids, LocalDateTime contactNextTime); 78 + List<CrmCustomerDO> getCustomerList(Collection<Long> ids);
82 79
83 /** 80 /**
84 - * 获得联系人 81 + * 获得客户 Map
85 * 82 *
86 - * @param id 编号  
87 - * @return 联系人 83 + * @param ids 客户编号数组
  84 + * @return 客户 Map
88 */ 85 */
89 - CrmContactDO getContact(Long id); 86 + default Map<Long, CrmCustomerDO> getCustomerMap(Collection<Long> ids) {
  87 + return convertMap(getCustomerList(ids), CrmCustomerDO::getId);
  88 + }
90 89
91 /** 90 /**
92 - * 校验联系人 91 + * 获得客户分页
93 * 92 *
94 - * @param id 编号 93 + * @param pageReqVO 分页查询
  94 + * @param userId 用户编号
  95 + * @return 客户分页
95 */ 96 */
96 - void validateContact(Long id); 97 + PageResult<CrmCustomerDO> getCustomerPage(CrmCustomerPageReqVO pageReqVO, Long userId);
97 98
98 /** 99 /**
99 - * 获得联系人列表 100 + * 获得放入公海提醒的客户分页
100 * 101 *
101 - * @param ids 编号  
102 - * @return 联系人列表 102 + * @param pageVO 分页查询
  103 + * @param userId 用户编号
  104 + * @return 客户分页
103 */ 105 */
104 - List<CrmContactDO> getContactList(Collection<Long> ids); 106 + PageResult<CrmCustomerDO> getPutPoolRemindCustomerPage(CrmCustomerPageReqVO pageVO, Long userId);
105 107
106 /** 108 /**
107 - * 获得联系人 Map 109 + * 获得待进入公海的客户数量
108 * 110 *
109 - * @param ids 编号  
110 - * @return 联系人 Map 111 + * @param userId 用户编号
  112 + * @return 提醒数量
111 */ 113 */
112 - default Map<Long, CrmContactDO> getContactMap(Collection<Long> ids) {  
113 - return convertMap(getContactList(ids), CrmContactDO::getId);  
114 - } 114 + Long getPutPoolRemindCustomerCount(Long userId);
115 115
116 /** 116 /**
117 - * 获取联系人列表(校验权限) 117 + * 获得今日需联系客户数量
118 * 118 *
119 * @param userId 用户编号 119 * @param userId 用户编号
120 - * @return 联系人列表 120 + * @return 提醒数量
121 */ 121 */
122 - List<CrmContactDO> getContactList(Long userId); 122 + Long getTodayContactCustomerCount(Long userId);
123 123
124 /** 124 /**
125 - * 获得联系人分页 125 + * 获得分配给我的客户数量
126 * 126 *
127 - * 数据权限:基于 {@link CrmContactDO} 127 + * @param userId 用户编号
  128 + * @return 提醒数量
  129 + */
  130 + Long getFollowCustomerCount(Long userId);
  131 +
  132 + /**
  133 + * 校验客户是否存在
128 * 134 *
129 - * @param pageReqVO 分页查询  
130 - * @param userId 用户编号  
131 - * @return 联系人分页 135 + * @param id 编号
132 */ 136 */
133 - PageResult<CrmContactDO> getContactPage(CrmContactPageReqVO pageReqVO, Long userId); 137 + void validateCustomer(Long id);
134 138
135 /** 139 /**
136 - * 获得联系人分页 140 + * 客户转移
137 * 141 *
138 - * 数据权限:基于 {@link CrmCustomerDO} 142 + * @param reqVO 请求
  143 + * @param userId 用户编号
  144 + */
  145 + void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId);
  146 +
  147 + /**
  148 + * 锁定/解锁客户
139 * 149 *
140 - * @param pageVO 分页查询  
141 - * @return 联系人分页 150 + * @param lockReqVO 更新信息
  151 + * @param userId 用户编号
142 */ 152 */
143 - PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO); 153 + void lockCustomer(@Valid CrmCustomerLockReqVO lockReqVO, Long userId);
144 154
145 /** 155 /**
146 - * 获得联系人分页 156 + * 创建客户
147 * 157 *
148 - * 数据权限:基于 {@link CrmBusinessDO} 158 + * @param customerCreateReq 请求信息
  159 + * @param userId 用户编号
  160 + * @return 客户列表
  161 + */
  162 + Long createCustomer(CrmCustomerCreateReqBO customerCreateReq, Long userId);
  163 +
  164 + /**
  165 + * 批量导入客户
149 * 166 *
150 - * @param pageVO 分页查询  
151 - * @return 联系人分页 167 + * @param importCustomers 导入客户列表
  168 + * @param importReqVO 请求
  169 + * @return 导入结果
  170 + */
  171 + CrmCustomerImportRespVO importCustomerList(List<CrmCustomerImportExcelVO> importCustomers, CrmCustomerImportReqVO importReqVO);
  172 +
  173 + // ==================== 公海相关操作 ====================
  174 +
  175 + /**
  176 + * 客户放入公海
  177 + *
  178 + * @param id 客户编号
152 */ 179 */
153 - PageResult<CrmContactDO> getContactPageByBusinessId(CrmContactPageReqVO pageVO); 180 + void putCustomerPool(Long id);
154 181
155 /** 182 /**
156 - * 获取关联客户的联系人数量 183 + * 领取公海客户
157 * 184 *
158 - * @param customerId 客户编号  
159 - * @return 数量 185 + * @param ids 要领取的客户编号数组
  186 + * @param ownerUserId 负责人
  187 + * @param isReceive 是/否领取;true - 领取;false - 分配
160 */ 188 */
161 - Long getContactCountByCustomerId(Long customerId); 189 + void receiveCustomer(List<Long> ids, Long ownerUserId, Boolean isReceive);
162 190
163 /** 191 /**
164 - * 获得联系人列表 192 + * 【系统】客户自动掉入公海
165 * 193 *
166 - * @param customerId 客户编号  
167 - * @param ownerUserId 负责人编号  
168 - * @return 联系人列表 194 + * @return 掉入公海数量
169 */ 195 */
170 - List<CrmContactDO> getContactListByCustomerIdOwnerUserId(Long customerId, Long ownerUserId); 196 + int autoPutCustomerPool();
171 197
172 } 198 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/customer/bo/CrmCustomerCreateReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.customer.bo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.Mobile;
  4 +import cn.iocoder.yudao.framework.common.validation.Telephone;
  5 +import cn.iocoder.yudao.module.crm.enums.DictTypeConstants;
  6 +import jakarta.validation.constraints.Email;
  7 +import jakarta.validation.constraints.NotEmpty;
  8 +import jakarta.validation.constraints.Size;
  9 +import lombok.Data;
  10 +
  11 +import java.time.LocalDateTime;
  12 +
  13 +/**
  14 + * 客户创建 Create Req BO
  15 + *
  16 + * @author HUIHUI
  17 + */
  18 +@Data
  19 +public class CrmCustomerCreateReqBO {
  20 +
  21 + /**
  22 + * 客户名称
  23 + */
  24 + @NotEmpty(message = "客户名称不能为空")
  25 + private String name;
  26 + /**
  27 + * 跟进状态
  28 + */
  29 + private Boolean followUpStatus;
  30 + /**
  31 + * 锁定状态
  32 + */
  33 + private Boolean lockStatus;
  34 + /**
  35 + * 成交状态
  36 + */
  37 + private Boolean dealStatus;
  38 + /**
  39 + * 所属行业
  40 + *
  41 + * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY}
  42 + */
  43 + private Integer industryId;
  44 + /**
  45 + * 客户等级
  46 + *
  47 + * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_LEVEL}
  48 + */
  49 + private Integer level;
  50 + /**
  51 + * 客户来源
  52 + *
  53 + * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_SOURCE}
  54 + */
  55 + private Integer source;
  56 +
  57 + /**
  58 + * 手机
  59 + */
  60 + @Mobile
  61 + private String mobile;
  62 + /**
  63 + * 电话
  64 + */
  65 + @Telephone
  66 + private String telephone;
  67 + /**
  68 + * QQ
  69 + */
  70 + private String qq;
  71 + /**
  72 + * wechat
  73 + */
  74 + private String wechat;
  75 +
  76 + /**
  77 + * 邮箱
  78 + */
  79 + @Email(message = "邮箱格式不正确")
  80 + private String email;
  81 +
  82 + /**
  83 + * 客户描述
  84 + */
  85 + @Size(max = 4096, message = "客户描述长度不能超过 4096 个字符")
  86 + private String description;
  87 + /**
  88 + * 备注
  89 + */
  90 + private String remark;
  91 + /**
  92 + * 负责人的用户编号
  93 + *
  94 + * 关联 AdminUserDO 的 id 字段
  95 + */
  96 + private Long ownerUserId;
  97 + /**
  98 + * 所在地
  99 + *
  100 + * 关联 {@link cn.iocoder.yudao.framework.ip.core.Area#getId()} 字段
  101 + */
  102 + private Integer areaId;
  103 + /**
  104 + * 详细地址
  105 + */
  106 + private String detailAddress;
  107 +
  108 + /**
  109 + * 最后跟进时间
  110 + */
  111 + private LocalDateTime contactLastTime;
  112 + /**
  113 + * 最后跟进内容
  114 + */
  115 + private String contactLastContent;
  116 + /**
  117 + * 下次联系时间
  118 + */
  119 + private LocalDateTime contactNextTime;
  120 +
  121 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/followup/CrmFollowUpRecordService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.followup;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.followup.vo.CrmFollowUpRecordPageReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.followup.vo.CrmFollowUpRecordSaveReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;
  7 +import cn.iocoder.yudao.module.crm.service.followup.bo.CrmFollowUpCreateReqBO;
  8 +import jakarta.validation.Valid;
  9 +
  10 +import java.util.Collection;
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 跟进记录 Service 接口
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +public interface CrmFollowUpRecordService {
  19 +
  20 + /**
  21 + * 创建跟进记录 (数据权限基于 bizType、 bizId)
  22 + *
  23 + * @param createReqVO 创建信息
  24 + * @return 编号
  25 + */
  26 + Long createFollowUpRecord(@Valid CrmFollowUpRecordSaveReqVO createReqVO);
  27 +
  28 + /**
  29 + * 创建更进
  30 + *
  31 + * @param list 请求
  32 + */
  33 + void createFollowUpRecordBatch(List<CrmFollowUpCreateReqBO> list);
  34 +
  35 + /**
  36 + * 删除跟进记录 (数据权限基于 bizType、 bizId)
  37 + *
  38 + * @param id 编号
  39 + * @param userId 用户编号
  40 + */
  41 + void deleteFollowUpRecord(Long id, Long userId);
  42 +
  43 + /**
  44 + * 删除跟进
  45 + *
  46 + * @param bizType 模块类型
  47 + * @param bizId 模块数据编号
  48 + */
  49 + void deleteFollowUpRecordByBiz(Integer bizType, Long bizId);
  50 +
  51 + /**
  52 + * 获得跟进记录
  53 + *
  54 + * @param id 编号
  55 + * @return 跟进记录
  56 + */
  57 + CrmFollowUpRecordDO getFollowUpRecord(Long id);
  58 +
  59 + /**
  60 + * 获得跟进记录分页 (数据权限基于 bizType、 bizId)
  61 + *
  62 + * @param pageReqVO 分页查询
  63 + * @return 跟进记录分页
  64 + */
  65 + PageResult<CrmFollowUpRecordDO> getFollowUpRecordPage(CrmFollowUpRecordPageReqVO pageReqVO);
  66 +
  67 + /**
  68 + * 获取跟进记录
  69 + *
  70 + * @param bizType 模块类型
  71 + * @param bizIds 模块数据编号
  72 + * @return 跟进列表
  73 + */
  74 + List<CrmFollowUpRecordDO> getFollowUpRecordByBiz(Integer bizType, Collection<Long> bizIds);
  75 +
  76 +}
0 \ No newline at end of file 77 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/followup/CrmFollowUpRecordServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/followup/CrmFollowUpRecordServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/followup/bo/CrmFollowUpCreateReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.followup.bo;
  2 +
  3 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
  4 +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
  5 +import cn.iocoder.yudao.module.crm.enums.DictTypeConstants;
  6 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  7 +import jakarta.validation.constraints.NotEmpty;
  8 +import jakarta.validation.constraints.NotNull;
  9 +import lombok.Data;
  10 +
  11 +import java.time.LocalDateTime;
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 跟进信息 Create Req BO
  16 + *
  17 + * @author HUIHUI
  18 + */
  19 +@Data
  20 +public class CrmFollowUpCreateReqBO {
  21 +
  22 + /**
  23 + * 数据类型
  24 + *
  25 + * 枚举 {@link CrmBizTypeEnum}
  26 + */
  27 + @NotNull(message = "数据类型不能为空")
  28 + private Integer bizType;
  29 + /**
  30 + * 数据编号
  31 + *
  32 + * 关联 {@link CrmBizTypeEnum} 对应模块 DO 的 id 字段
  33 + */
  34 + @NotNull(message = "数据编号不能为空")
  35 + private Long bizId;
  36 +
  37 + /**
  38 + * 跟进类型
  39 + *
  40 + * 关联 {@link DictTypeConstants#CRM_FOLLOW_UP_TYPE} 字典
  41 + */
  42 + @NotNull(message = "跟进类型不能为空")
  43 + private Integer type;
  44 + /**
  45 + * 跟进内容
  46 + */
  47 + @NotEmpty(message = "跟进内容不能为空")
  48 + private String content;
  49 + /**
  50 + * 下次联系时间
  51 + */
  52 + @NotNull(message = "下次联系时间不能为空")
  53 + private LocalDateTime nextTime;
  54 +
  55 + /**
  56 + * 图片
  57 + */
  58 + private List<String> picUrls;
  59 + /**
  60 + * 附件
  61 + */
  62 + private List<String> fileUrls;
  63 +
  64 + /**
  65 + * 关联的商机编号数组
  66 + *
  67 + * 关联 {@link CrmBusinessDO#getId()}
  68 + */
  69 + private List<Long> businessIds;
  70 +
  71 + /**
  72 + * 关联的联系人编号数组
  73 + *
  74 + * 关联 {@link CrmContactDO#getId()}
  75 + */
  76 + private List<Long> contactIds;
  77 +
  78 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.permission;
  2 +
  3 +
  4 +import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionSaveReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
  7 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  8 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
  9 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
  10 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
  11 +import jakarta.validation.Valid;
  12 +
  13 +import java.util.Collection;
  14 +import java.util.List;
  15 +
  16 +/**
  17 + * crm 数据权限 Service 接口
  18 + *
  19 + * @author HUIHUI
  20 + */
  21 +public interface CrmPermissionService {
  22 +
  23 + /**
  24 + * 创建数据权限
  25 + *
  26 + * @param reqVO 创建信息
  27 + * @param userId 用户编号
  28 + */
  29 + void createPermission(CrmPermissionSaveReqVO reqVO, Long userId);
  30 +
  31 + /**
  32 + * 创建数据权限
  33 + *
  34 + * @param createReqBO 创建信息
  35 + * @return 编号
  36 + */
  37 + Long createPermission(@Valid CrmPermissionCreateReqBO createReqBO);
  38 +
  39 + /**
  40 + * 创建数据权限
  41 + *
  42 + * @param createReqBOs 创建信息
  43 + */
  44 + void createPermissionBatch(@Valid List<CrmPermissionCreateReqBO> createReqBOs);
  45 +
  46 + /**
  47 + * 更新数据权限
  48 + *
  49 + * @param updateReqVO 更新信息
  50 + */
  51 + void updatePermission(CrmPermissionUpdateReqVO updateReqVO);
  52 +
  53 + /**
  54 + * 数据权限转移
  55 + *
  56 + * @param crmPermissionTransferReqBO 数据权限转移请求
  57 + */
  58 + void transferPermission(@Valid CrmPermissionTransferReqBO crmPermissionTransferReqBO);
  59 +
  60 + /**
  61 + * 删除数据权限
  62 + *
  63 + * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
  64 + * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
  65 + * @param level 数据权限级别,关联 {@link CrmPermissionLevelEnum}
  66 + */
  67 + void deletePermission(Integer bizType, Long bizId, Integer level);
  68 +
  69 + /**
  70 + * 删除数据权限
  71 + *
  72 + * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
  73 + * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
  74 + */
  75 + void deletePermission(Integer bizType, Long bizId);
  76 +
  77 + /**
  78 + * 批量删除数据权限
  79 + *
  80 + * @param ids 权限编号
  81 + * @param userId 用户编号
  82 + */
  83 + void deletePermissionBatch(Collection<Long> ids, Long userId);
  84 +
  85 + /**
  86 + * 删除指定用户数据权限
  87 + *
  88 + * @param id 权限编号
  89 + * @param userId 用户编号
  90 + */
  91 + void deleteSelfPermission(Long id, Long userId);
  92 +
  93 + /**
  94 + * 获取数据权限列表,通过 数据类型 x 某个数据
  95 + *
  96 + * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
  97 + * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
  98 + * @return Crm 数据权限列表
  99 + */
  100 + List<CrmPermissionDO> getPermissionListByBiz(Integer bizType, Long bizId);
  101 +
  102 + /**
  103 + * 获取数据权限列表,通过 数据类型 x 某个数据
  104 + *
  105 + * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
  106 + * @param bizIds 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
  107 + * @return Crm 数据权限列表
  108 + */
  109 + List<CrmPermissionDO> getPermissionListByBiz(Integer bizType, Collection<Long> bizIds);
  110 +
  111 + /**
  112 + * 获取用户参与的模块数据列表
  113 + *
  114 + * @param bizType 模块类型
  115 + * @param userId 用户编号
  116 + * @return 模块数据列表
  117 + */
  118 + List<CrmPermissionDO> getPermissionListByBizTypeAndUserId(Integer bizType, Long userId);
  119 +
  120 + /**
  121 + * 校验是否有指定数据的操作权限
  122 + *
  123 + * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
  124 + * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
  125 + * @param userId 用户编号
  126 + * @param level 权限级别
  127 + * @return 是否有权限
  128 + */
  129 + boolean hasPermission(Integer bizType, Long bizId, Long userId, CrmPermissionLevelEnum level);
  130 +
  131 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionCreateReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.permission.bo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
  6 +import lombok.Data;
  7 +
  8 +import jakarta.validation.constraints.NotNull;
  9 +
  10 +/**
  11 + * crm 数据权限 Create Req BO
  12 + *
  13 + * @author HUIHUI
  14 + */
  15 +@Data
  16 +public class CrmPermissionCreateReqBO {
  17 +
  18 + /**
  19 + * 当前登录用户编号
  20 + */
  21 + @NotNull(message = "用户编号不能为空")
  22 + private Long userId;
  23 +
  24 + /**
  25 + * Crm 类型
  26 + */
  27 + @NotNull(message = "Crm 类型不能为空")
  28 + @InEnum(CrmBizTypeEnum.class)
  29 + private Integer bizType;
  30 + /**
  31 + * 数据编号
  32 + */
  33 + @NotNull(message = "Crm 数据编号不能为空")
  34 + private Long bizId;
  35 +
  36 + /**
  37 + * 权限级别
  38 + */
  39 + @NotNull(message = "权限级别不能为空")
  40 + @InEnum(CrmPermissionLevelEnum.class)
  41 + private Integer level;
  42 +
  43 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionTransferReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.permission.bo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
  6 +import lombok.AllArgsConstructor;
  7 +import lombok.Data;
  8 +
  9 +import jakarta.validation.constraints.NotNull;
  10 +import lombok.NoArgsConstructor;
  11 +
  12 +/**
  13 + * 数据权限转移 Request BO
  14 + *
  15 + * @author HUIHUI
  16 + */
  17 +@Data
  18 +@NoArgsConstructor
  19 +@AllArgsConstructor
  20 +public class CrmPermissionTransferReqBO {
  21 +
  22 + /**
  23 + * 当前登录用户编号
  24 + */
  25 + @NotNull(message = "用户编号不能为空")
  26 + private Long userId;
  27 +
  28 + /**
  29 + * CRM 类型
  30 + */
  31 + @NotNull(message = "Crm 类型不能为空")
  32 + @InEnum(CrmBizTypeEnum.class)
  33 + private Integer bizType;
  34 + /**
  35 + * 数据编号
  36 + */
  37 + @NotNull(message = "CRM 数据编号不能为空")
  38 + private Long bizId;
  39 +
  40 + /**
  41 + * 新负责人的用户编号
  42 + */
  43 + @NotNull(message = "新负责人的用户编号不能为空")
  44 + private Long newOwnerUserId;
  45 +
  46 + /**
  47 + * 老负责人加入团队后的权限级别。如果 null 说明移除
  48 + *
  49 + * 关联 {@link CrmPermissionLevelEnum}
  50 + */
  51 + private Integer oldOwnerPermissionLevel;
  52 +
  53 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductCategoryService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.product;
  2 +
  3 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.category.CrmProductCategoryCreateReqVO;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.category.CrmProductCategoryListReqVO;
  5 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;
  6 +import jakarta.validation.Valid;
  7 +
  8 +import java.util.Collection;
  9 +import java.util.List;
  10 +import java.util.Map;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  13 +
  14 +/**
  15 + * CRM 产品分类 Service 接口
  16 + *
  17 + * @author ZanGe丶
  18 + */
  19 +public interface CrmProductCategoryService {
  20 +
  21 + /**
  22 + * 创建产品分类
  23 + *
  24 + * @param createReqVO 创建信息
  25 + * @return 编号
  26 + */
  27 + Long createProductCategory(@Valid CrmProductCategoryCreateReqVO createReqVO);
  28 +
  29 + /**
  30 + * 更新产品分类
  31 + *
  32 + * @param updateReqVO 更新信息
  33 + */
  34 + void updateProductCategory(@Valid CrmProductCategoryCreateReqVO updateReqVO);
  35 +
  36 + /**
  37 + * 删除产品分类
  38 + *
  39 + * @param id 编号
  40 + */
  41 + void deleteProductCategory(Long id);
  42 +
  43 + /**
  44 + * 获得产品分类
  45 + *
  46 + * @param id 编号
  47 + * @return 产品分类
  48 + */
  49 + CrmProductCategoryDO getProductCategory(Long id);
  50 +
  51 + /**
  52 + * 获得产品分类列表
  53 + *
  54 + * @param listReqVO 列表请求
  55 + * @return 产品分类列表
  56 + */
  57 + List<CrmProductCategoryDO> getProductCategoryList(CrmProductCategoryListReqVO listReqVO);
  58 +
  59 + /**
  60 + * 获得产品分类列表
  61 + *
  62 + * @param ids 编号数组
  63 + * @return 产品分类列表
  64 + */
  65 + List<CrmProductCategoryDO> getProductCategoryList(Collection<Long> ids);
  66 +
  67 + /**
  68 + * 获得产品分类 Map
  69 + *
  70 + * @param ids 编号数组
  71 + * @return 产品分类 Map
  72 + */
  73 + default Map<Long, CrmProductCategoryDO> getProductCategoryMap(Collection<Long> ids) {
  74 + return convertMap(getProductCategoryList(ids), CrmProductCategoryDO::getId);
  75 + }
  76 +
  77 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductCategoryServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.product;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.category.CrmProductCategoryCreateReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.category.CrmProductCategoryListReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;
  7 +import cn.iocoder.yudao.module.crm.dal.mysql.product.CrmProductCategoryMapper;
  8 +import com.mzt.logapi.context.LogRecordContext;
  9 +import com.mzt.logapi.starter.annotation.LogRecord;
  10 +import jakarta.annotation.Resource;
  11 +import org.springframework.context.annotation.Lazy;
  12 +import org.springframework.stereotype.Service;
  13 +import org.springframework.validation.annotation.Validated;
  14 +
  15 +import java.util.Collection;
  16 +import java.util.List;
  17 +import java.util.Objects;
  18 +
  19 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  20 +import static cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO.PARENT_ID_NULL;
  21 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
  22 +import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*;
  23 +
  24 +/**
  25 + * CRM 产品分类 Service 实现类
  26 + *
  27 + * @author ZanGe丶
  28 + */
  29 +@Service
  30 +@Validated
  31 +public class CrmProductCategoryServiceImpl implements CrmProductCategoryService {
  32 +
  33 + @Resource(name = "crmProductCategoryMapper")
  34 + private CrmProductCategoryMapper productCategoryMapper;
  35 +
  36 + @Resource
  37 + @Lazy // 延迟加载,解决循环依赖问题
  38 + private CrmProductService crmProductService;
  39 +
  40 + @Override
  41 + @LogRecord(type = CRM_PRODUCT_CATEGORY_TYPE, subType = CRM_PRODUCT_CATEGORY_CREATE_SUB_TYPE, bizNo = "{{#productCategoryId}}",
  42 + success = CRM_PRODUCT_CATEGORY_CREATE_SUCCESS)
  43 + public Long createProductCategory(CrmProductCategoryCreateReqVO createReqVO) {
  44 + // 1.1 校验父分类存在
  45 + validateParentProductCategory(createReqVO.getParentId());
  46 + // 1.2 分类名称是否存在
  47 + validateProductNameExists(null, createReqVO.getParentId(), createReqVO.getName());
  48 +
  49 + // 2. 插入分类
  50 + CrmProductCategoryDO category = BeanUtils.toBean(createReqVO, CrmProductCategoryDO.class);
  51 + productCategoryMapper.insert(category);
  52 +
  53 + // 3. 记录操作日志上下文
  54 + LogRecordContext.putVariable("productCategoryId", category.getId());
  55 + return category.getId();
  56 + }
  57 +
  58 + @Override
  59 + @LogRecord(type = CRM_PRODUCT_CATEGORY_TYPE, subType = CRM_PRODUCT_CATEGORY_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}",
  60 + success = CRM_PRODUCT_CATEGORY_UPDATE_SUCCESS)
  61 + public void updateProductCategory(CrmProductCategoryCreateReqVO updateReqVO) {
  62 + // 1.1 校验存在
  63 + validateProductCategoryExists(updateReqVO.getId());
  64 + // 1.2 校验父分类存在
  65 + validateParentProductCategory(updateReqVO.getParentId());
  66 + // 1.3 分类名称是否存在
  67 + validateProductNameExists(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName());
  68 +
  69 + // 2. 更新分类
  70 + CrmProductCategoryDO updateObj = BeanUtils.toBean(updateReqVO, CrmProductCategoryDO.class);
  71 + productCategoryMapper.updateById(updateObj);
  72 + }
  73 +
  74 + private void validateProductCategoryExists(Long id) {
  75 + if (productCategoryMapper.selectById(id) == null) {
  76 + throw exception(PRODUCT_CATEGORY_NOT_EXISTS);
  77 + }
  78 + }
  79 +
  80 + private void validateParentProductCategory(Long id) {
  81 + // 如果是根分类,无需验证
  82 + if (Objects.equals(id, PARENT_ID_NULL)) {
  83 + return;
  84 + }
  85 + // 父分类不存在
  86 + CrmProductCategoryDO category = productCategoryMapper.selectById(id);
  87 + if (category == null) {
  88 + throw exception(PRODUCT_CATEGORY_PARENT_NOT_EXISTS);
  89 + }
  90 + // 父分类不能是二级分类
  91 + if (!Objects.equals(category.getParentId(), PARENT_ID_NULL)) {
  92 + throw exception(PRODUCT_CATEGORY_PARENT_NOT_FIRST_LEVEL);
  93 + }
  94 + }
  95 +
  96 + private void validateProductNameExists(Long id, Long parentId, String name) {
  97 + CrmProductCategoryDO category = productCategoryMapper.selectByParentIdAndName(parentId, name);
  98 + if (category == null
  99 + || category.getId().equals(id)) {
  100 + return;
  101 + }
  102 + throw exception(PRODUCT_CATEGORY_EXISTS);
  103 + }
  104 +
  105 + @Override
  106 + @LogRecord(type = CRM_PRODUCT_CATEGORY_TYPE, subType = CRM_PRODUCT_CATEGORY_DELETE_SUB_TYPE, bizNo = "{{#id}}",
  107 + success = CRM_PRODUCT_CATEGORY_DELETE_SUCCESS)
  108 + public void deleteProductCategory(Long id) {
  109 + // 1.1 校验存在
  110 + validateProductCategoryExists(id);
  111 + // 1.2 校验是否还有子分类
  112 + if (productCategoryMapper.selectCountByParentId(id) > 0) {
  113 + throw exception(PRODUCT_CATEGORY_EXISTS_CHILDREN);
  114 + }
  115 + // 1.3 校验是否被产品使用
  116 + if (crmProductService.getProductByCategoryId(id) > 0) {
  117 + throw exception(PRODUCT_CATEGORY_USED);
  118 + }
  119 + // 2. 删除
  120 + productCategoryMapper.deleteById(id);
  121 + }
  122 +
  123 + @Override
  124 + public CrmProductCategoryDO getProductCategory(Long id) {
  125 + return productCategoryMapper.selectById(id);
  126 + }
  127 +
  128 + @Override
  129 + public List<CrmProductCategoryDO> getProductCategoryList(CrmProductCategoryListReqVO listReqVO) {
  130 + return productCategoryMapper.selectList(listReqVO);
  131 + }
  132 +
  133 + @Override
  134 + public List<CrmProductCategoryDO> getProductCategoryList(Collection<Long> ids) {
  135 + return productCategoryMapper.selectBatchIds(ids);
  136 + }
  137 +
  138 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.product;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductSaveReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
  7 +import jakarta.validation.Valid;
  8 +
  9 +import java.util.Collection;
  10 +import java.util.List;
  11 +import java.util.Map;
  12 +
  13 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  14 +
  15 +/**
  16 + * CRM 产品 Service 接口
  17 + *
  18 + * @author ZanGe丶
  19 + */
  20 +public interface CrmProductService {
  21 +
  22 + /**
  23 + * 创建产品
  24 + *
  25 + * @param createReqVO 创建信息
  26 + * @return 编号
  27 + */
  28 + Long createProduct(@Valid CrmProductSaveReqVO createReqVO);
  29 +
  30 + /**
  31 + * 更新产品
  32 + *
  33 + * @param updateReqVO 更新信息
  34 + */
  35 + void updateProduct(@Valid CrmProductSaveReqVO updateReqVO);
  36 +
  37 + /**
  38 + * 删除产品
  39 + *
  40 + * @param id 编号
  41 + */
  42 + void deleteProduct(Long id);
  43 +
  44 + /**
  45 + * 获得产品
  46 + *
  47 + * @param id 编号
  48 + * @return 产品
  49 + */
  50 + CrmProductDO getProduct(Long id);
  51 +
  52 + /**
  53 + * 获得产品列表
  54 + *
  55 + * @param ids 编号
  56 + * @return 产品列表
  57 + */
  58 + List<CrmProductDO> getProductList(Collection<Long> ids);
  59 +
  60 + /**
  61 + * 获得产品 Map
  62 + *
  63 + * @param ids 编号
  64 + * @return 产品 Map
  65 + */
  66 + default Map<Long, CrmProductDO> getProductMap(Collection<Long> ids) {
  67 + return convertMap(getProductList(ids), CrmProductDO::getId);
  68 + }
  69 +
  70 + /**
  71 + * 获得产品分页
  72 + *
  73 + * @param pageReqVO 分页查询
  74 + * @return 产品分页
  75 + */
  76 + PageResult<CrmProductDO> getProductPage(CrmProductPageReqVO pageReqVO);
  77 +
  78 + /**
  79 + * 获得产品数量
  80 + *
  81 + * @param categoryId 分类编号
  82 + * @return 产品
  83 + */
  84 + Long getProductByCategoryId(Long categoryId);
  85 +
  86 + /**
  87 + * 获得指定状态的产品列表
  88 + *
  89 + * @param status 状态
  90 + * @return 产品列表
  91 + */
  92 + List<CrmProductDO> getProductListByStatus(Integer status);
  93 +
  94 + /**
  95 + * 校验产品们的有效性
  96 + *
  97 + * @param ids 编号数组
  98 + * @return 产品列表
  99 + */
  100 + List<CrmProductDO> validProductList(Collection<Long> ids);
  101 +
  102 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivablePlanService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.receivable;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan.CrmReceivablePlanPageReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan.CrmReceivablePlanSaveReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
  7 +import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivablePlanDO;
  8 +import jakarta.validation.Valid;
  9 +
  10 +import java.util.Collection;
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * CRM 回款计划 Service 接口
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +public interface CrmReceivablePlanService {
  19 +
  20 + /**
  21 + * 创建回款计划
  22 + *
  23 + * @param createReqVO 创建信息
  24 + * @return 编号
  25 + */
  26 + Long createReceivablePlan(@Valid CrmReceivablePlanSaveReqVO createReqVO);
  27 +
  28 + /**
  29 + * 更新回款计划
  30 + *
  31 + * @param updateReqVO 更新信息
  32 + */
  33 + void updateReceivablePlan(@Valid CrmReceivablePlanSaveReqVO updateReqVO);
  34 +
  35 + /**
  36 + * 更新回款计划关联的回款编号
  37 + *
  38 + * @param id 编号
  39 + * @param receivableId 回款编号
  40 + */
  41 + void updateReceivablePlanReceivableId(Long id, Long receivableId);
  42 +
  43 + /**
  44 + * 删除回款计划
  45 + *
  46 + * @param id 编号
  47 + */
  48 + void deleteReceivablePlan(Long id);
  49 +
  50 + /**
  51 + * 获得回款计划
  52 + *
  53 + * @param id 编号
  54 + * @return 回款计划
  55 + */
  56 + CrmReceivablePlanDO getReceivablePlan(Long id);
  57 +
  58 + /**
  59 + * 获得回款计划列表
  60 + *
  61 + * @param ids 编号
  62 + * @return 回款计划列表
  63 + */
  64 + List<CrmReceivablePlanDO> getReceivablePlanList(Collection<Long> ids);
  65 +
  66 + /**
  67 + * 获得回款计划分页
  68 + *
  69 + * 数据权限:基于 {@link CrmReceivablePlanDO} 读取
  70 + *
  71 + * @param pageReqVO 分页查询
  72 + * @param userId 用户编号
  73 + * @return 回款计划分页
  74 + */
  75 + PageResult<CrmReceivablePlanDO> getReceivablePlanPage(CrmReceivablePlanPageReqVO pageReqVO, Long userId);
  76 +
  77 + /**
  78 + * 获得回款计划分页,基于指定客户
  79 + *
  80 + * 数据权限:基于 {@link CrmCustomerDO} 读取
  81 + *
  82 + * @param pageReqVO 分页查询
  83 + * @return 回款计划分页
  84 + */
  85 + PageResult<CrmReceivablePlanDO> getReceivablePlanPageByCustomerId(CrmReceivablePlanPageReqVO pageReqVO);
  86 +
  87 + /**
  88 + * 获得待回款提醒数量
  89 + *
  90 + * @param userId 用户编号
  91 + * @return 提醒数量
  92 + */
  93 + Long getReceivablePlanRemindCount(Long userId);
  94 +
  95 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivablePlanServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivablePlanServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.receivable;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivablePageReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableSaveReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
  7 +import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO;
  8 +import jakarta.validation.Valid;
  9 +
  10 +import java.math.BigDecimal;
  11 +import java.util.Collection;
  12 +import java.util.List;
  13 +import java.util.Map;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  16 +
  17 +/**
  18 + * CRM 回款 Service 接口
  19 + *
  20 + * @author 赤焰
  21 + */
  22 +public interface CrmReceivableService {
  23 +
  24 + /**
  25 + * 创建回款
  26 + *
  27 + * @param createReqVO 创建信息
  28 + * @return 编号
  29 + */
  30 + Long createReceivable(@Valid CrmReceivableSaveReqVO createReqVO);
  31 +
  32 + /**
  33 + * 更新回款
  34 + *
  35 + * @param updateReqVO 更新信息
  36 + */
  37 + void updateReceivable(@Valid CrmReceivableSaveReqVO updateReqVO);
  38 +
  39 + /**
  40 + * 更新回款流程审批结果
  41 + *
  42 + * @param id 回款编号
  43 + * @param bpmResult BPM 审批结果
  44 + */
  45 + void updateReceivableAuditStatus(Long id, Integer bpmResult);
  46 +
  47 + /**
  48 + * 删除回款
  49 + *
  50 + * @param id 编号
  51 + */
  52 + void deleteReceivable(Long id);
  53 +
  54 + /**
  55 + * 发起回款审批流程
  56 + *
  57 + * @param id 回款编号
  58 + * @param userId 用户编号
  59 + */
  60 + void submitReceivable(Long id, Long userId);
  61 +
  62 + /**
  63 + * 获得回款
  64 + *
  65 + * @param id 编号
  66 + * @return 回款
  67 + */
  68 + CrmReceivableDO getReceivable(Long id);
  69 +
  70 + /**
  71 + * 获得回款列表
  72 + *
  73 + * @param ids 编号
  74 + * @return 回款列表
  75 + */
  76 + List<CrmReceivableDO> getReceivableList(Collection<Long> ids);
  77 +
  78 + /**
  79 + * 获得回款 Map
  80 + *
  81 + * @param ids 编号
  82 + * @return 回款 Map
  83 + */
  84 + default Map<Long, CrmReceivableDO> getReceivableMap(Collection<Long> ids) {
  85 + return convertMap(getReceivableList(ids), CrmReceivableDO::getId);
  86 + }
  87 +
  88 + /**
  89 + * 获得回款分页
  90 + *
  91 + * 数据权限:基于 {@link CrmReceivableDO} 读取
  92 + *
  93 + * @param pageReqVO 分页查询
  94 + * @param userId 用户编号
  95 + * @return 回款分页
  96 + */
  97 + PageResult<CrmReceivableDO> getReceivablePage(CrmReceivablePageReqVO pageReqVO, Long userId);
  98 +
  99 + /**
  100 + * 获得回款分页,基于指定客户
  101 + *
  102 + * 数据权限:基于 {@link CrmCustomerDO} 读取
  103 + *
  104 + * @param pageReqVO 分页查询
  105 + * @return 回款分页
  106 + */
  107 + PageResult<CrmReceivableDO> getReceivablePageByCustomerId(CrmReceivablePageReqVO pageReqVO);
  108 +
  109 + /**
  110 + * 获得待审核回款数量
  111 + *
  112 + * @param userId 用户编号
  113 + * @return 待审批数量
  114 + */
  115 + Long getAuditReceivableCount(Long userId);
  116 +
  117 + /**
  118 + * 获得合同已回款金额 Map
  119 + *
  120 + * @param contractIds 合同编号
  121 + * @return 回款金额 Map
  122 + */
  123 + Map<Long, BigDecimal> getReceivablePriceMapByContractId(Collection<Long> contractIds);
  124 +
  125 + /**
  126 + * 根据合同编号查询回款数量
  127 + *
  128 + * @param contractId 合同编号
  129 + * @return 回款数量
  130 + */
  131 + Long getReceivableCountByContractId(Long contractId);
  132 +
  133 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/listener/CrmReceivableStatusListener.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.receivable.listener;
  2 +
  3 +import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
  4 +import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
  5 +import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService;
  6 +import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableServiceImpl;
  7 +import jakarta.annotation.Resource;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +/**
  11 + * 回款审批的结果的监听器实现类
  12 + *
  13 + * @author HUIHUI
  14 + */
  15 +@Component
  16 +public class CrmReceivableStatusListener extends BpmProcessInstanceStatusEventListener {
  17 +
  18 + @Resource
  19 + private CrmReceivableService receivableService;
  20 +
  21 + @Override
  22 + public String getProcessDefinitionKey() {
  23 + return CrmReceivableServiceImpl.BPM_PROCESS_DEFINITION_KEY;
  24 + }
  25 +
  26 + @Override
  27 + public void onEvent(BpmProcessInstanceStatusEvent event) {
  28 + receivableService.updateReceivableAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus());
  29 + }
  30 +
  31 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsCustomerService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.statistics;
  2 +
  3 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.*;
  4 +
  5 +import java.util.List;
  6 +
  7 +/**
  8 + * CRM 客户分析 Service 接口
  9 + *
  10 + * @author dhb52
  11 + */
  12 +public interface CrmStatisticsCustomerService {
  13 +
  14 + /**
  15 + * 总量分析(按日期)
  16 + *
  17 + * @param reqVO 请求参数
  18 + * @return 统计数据
  19 + */
  20 + List<CrmStatisticsCustomerSummaryByDateRespVO> getCustomerSummaryByDate(CrmStatisticsCustomerReqVO reqVO);
  21 +
  22 + /**
  23 + * 总量分析(按用户)
  24 + *
  25 + * @param reqVO 请求参数
  26 + * @return 统计数据
  27 + */
  28 + List<CrmStatisticsCustomerSummaryByUserRespVO> getCustomerSummaryByUser(CrmStatisticsCustomerReqVO reqVO);
  29 +
  30 + /**
  31 + * 跟进次数分析(按日期)
  32 + *
  33 + * @param reqVO 请求参数
  34 + * @return 统计数据
  35 + */
  36 + List<CrmStatisticsFollowUpSummaryByDateRespVO> getFollowUpSummaryByDate(CrmStatisticsCustomerReqVO reqVO);
  37 +
  38 + /**
  39 + * 跟进次数分析(按用户)
  40 + *
  41 + * @param reqVO 请求参数
  42 + * @return 统计数据
  43 + */
  44 + List<CrmStatisticsFollowUpSummaryByUserRespVO> getFollowUpSummaryByUser(CrmStatisticsCustomerReqVO reqVO);
  45 +
  46 + /**
  47 + * 客户跟进次数分析(按类型)
  48 + *
  49 + * @param reqVO 请求参数
  50 + * @return 统计数据
  51 + */
  52 + List<CrmStatisticsFollowUpSummaryByTypeRespVO> getFollowUpSummaryByType(CrmStatisticsCustomerReqVO reqVO);
  53 +
  54 + /**
  55 + * 获取客户的首次合同、回款信息列表,用于【客户转化率】页面
  56 + *
  57 + * @param reqVO 请求参数
  58 + * @return 统计数据
  59 + */
  60 + List<CrmStatisticsCustomerContractSummaryRespVO> getContractSummary(CrmStatisticsCustomerReqVO reqVO);
  61 +
  62 + /**
  63 + * 公海客户分析(按日期)
  64 + *
  65 + * @param reqVO 请求参数
  66 + * @return 统计数据
  67 + */
  68 + List<CrmStatisticsPoolSummaryByDateRespVO> getPoolSummaryByDate(CrmStatisticsCustomerReqVO reqVO);
  69 +
  70 + /**
  71 + * 公海客户分析(按用户)
  72 + *
  73 + * @param reqVO 请求参数
  74 + * @return 统计数据
  75 + */
  76 + List<CrmStatisticsPoolSummaryByUserRespVO> getPoolSummaryByUser(CrmStatisticsCustomerReqVO reqVO);
  77 +
  78 + /**
  79 + * 客户成交周期(按日期)
  80 + *
  81 + * 成交周期的定义:客户 customer 在创建出来,到合同 contract 第一次成交的时间差
  82 + *
  83 + * @param reqVO 请求参数
  84 + * @return 统计数据
  85 + */
  86 + List<CrmStatisticsCustomerDealCycleByDateRespVO> getCustomerDealCycleByDate(CrmStatisticsCustomerReqVO reqVO);
  87 +
  88 + /**
  89 + * 客户成交周期(按用户)
  90 + *
  91 + * @param reqVO 请求参数
  92 + * @return 统计数据
  93 + */
  94 + List<CrmStatisticsCustomerDealCycleByUserRespVO> getCustomerDealCycleByUser(CrmStatisticsCustomerReqVO reqVO);
  95 +
  96 + /**
  97 + * 客户成交周期(按区域)
  98 + *
  99 + * @param reqVO 请求参数
  100 + * @return 统计数据
  101 + */
  102 + List<CrmStatisticsCustomerDealCycleByAreaRespVO> getCustomerDealCycleByArea(CrmStatisticsCustomerReqVO reqVO);
  103 +
  104 + /**
  105 + * 客户成交周期(按产品)
  106 + *
  107 + * @param reqVO 请求参数
  108 + * @return 统计数据
  109 + */
  110 + List<CrmStatisticsCustomerDealCycleByProductRespVO> getCustomerDealCycleByProduct(CrmStatisticsCustomerReqVO reqVO);
  111 +
  112 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsCustomerServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsCustomerServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsFunnelService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.statistics;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.*;
  5 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * CRM 销售漏斗分析 Service
  11 + *
  12 + * @author HUIHUI
  13 + */
  14 +public interface CrmStatisticsFunnelService {
  15 +
  16 + /**
  17 + * 获得销售漏斗数据
  18 + *
  19 + * @param reqVO 请求
  20 + * @return 销售漏斗数据
  21 + */
  22 + CrmStatisticFunnelSummaryRespVO getFunnelSummary(CrmStatisticsFunnelReqVO reqVO);
  23 +
  24 + /**
  25 + * 获得商机结束状态统计
  26 + *
  27 + * @param reqVO 请求
  28 + * @return 商机结束状态统计
  29 + */
  30 + List<CrmStatisticsBusinessSummaryByEndStatusRespVO> getBusinessSummaryByEndStatus(CrmStatisticsFunnelReqVO reqVO);
  31 +
  32 + /**
  33 + * 获取新增商机分析(按日期)
  34 + *
  35 + * @param reqVO 请求
  36 + * @return 新增商机分析
  37 + */
  38 + List<CrmStatisticsBusinessSummaryByDateRespVO> getBusinessSummaryByDate(CrmStatisticsFunnelReqVO reqVO);
  39 +
  40 + /**
  41 + * 获得商机转化率分析(按日期)
  42 + *
  43 + * @param reqVO 请求
  44 + * @return 商机转化率分析
  45 + */
  46 + List<CrmStatisticsBusinessInversionRateSummaryByDateRespVO> getBusinessInversionRateSummaryByDate(CrmStatisticsFunnelReqVO reqVO);
  47 +
  48 + /**
  49 + * 获得商机分页(按日期)
  50 + *
  51 + * @param pageVO 请求
  52 + * @return 商机分页
  53 + */
  54 + PageResult<CrmBusinessDO> getBusinessPageByDate(CrmStatisticsFunnelReqVO pageVO);
  55 +
  56 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsFunnelServiceImpl.java renamed to yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsFunnelServiceImpl.java
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPerformanceService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.statistics;
  2 +
  3 +
  4 +
  5 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO;
  7 +
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * CRM 员工绩效统计 Service 接口
  12 + *
  13 + * @author scholar
  14 + */
  15 +public interface CrmStatisticsPerformanceService {
  16 +
  17 + /**
  18 + * 员工签约合同数量分析
  19 + *
  20 + * @param performanceReqVO 排行参数
  21 + * @return 员工签约合同数量排行分析
  22 + */
  23 + List<CrmStatisticsPerformanceRespVO> getContractCountPerformance(CrmStatisticsPerformanceReqVO performanceReqVO);
  24 +
  25 + /**
  26 + * 员工签约合同金额分析
  27 + *
  28 + * @param performanceReqVO 排行参数
  29 + * @return 员工签约合同金额分析
  30 + */
  31 + List<CrmStatisticsPerformanceRespVO> getContractPricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO);
  32 +
  33 + /**
  34 + * 员工获得回款金额分析
  35 + *
  36 + * @param performanceReqVO 排行参数
  37 + * @return 员工获得回款金额分析
  38 + */
  39 + List<CrmStatisticsPerformanceRespVO> getReceivablePricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO);
  40 +
  41 +
  42 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPerformanceServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.statistics;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.collection.ListUtil;
  5 +import cn.hutool.core.util.ObjUtil;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO;
  8 +import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsPerformanceMapper;
  9 +import cn.iocoder.yudao.module.system.api.dept.DeptApi;
  10 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
  11 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  12 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  13 +import jakarta.annotation.Resource;
  14 +import org.springframework.stereotype.Service;
  15 +import org.springframework.validation.annotation.Validated;
  16 +
  17 +import java.math.BigDecimal;
  18 +import java.util.ArrayList;
  19 +import java.util.Collections;
  20 +import java.util.List;
  21 +import java.util.Map;
  22 +import java.util.function.Function;
  23 +
  24 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  25 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  26 +
  27 +/**
  28 + * CRM 员工业绩分析 Service 实现类
  29 + *
  30 + * @author scholar
  31 + */
  32 +@Service
  33 +@Validated
  34 +public class CrmStatisticsPerformanceServiceImpl implements CrmStatisticsPerformanceService {
  35 +
  36 + @Resource
  37 + private CrmStatisticsPerformanceMapper performanceMapper;
  38 +
  39 + @Resource
  40 + private AdminUserApi adminUserApi;
  41 + @Resource
  42 + private DeptApi deptApi;
  43 +
  44 + @Override
  45 + public List<CrmStatisticsPerformanceRespVO> getContractCountPerformance(CrmStatisticsPerformanceReqVO performanceReqVO) {
  46 + return getPerformance(performanceReqVO, performanceMapper::selectContractCountPerformance);
  47 + }
  48 +
  49 + @Override
  50 + public List<CrmStatisticsPerformanceRespVO> getContractPricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO) {
  51 + return getPerformance(performanceReqVO, performanceMapper::selectContractPricePerformance);
  52 + }
  53 +
  54 + @Override
  55 + public List<CrmStatisticsPerformanceRespVO> getReceivablePricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO) {
  56 + return getPerformance(performanceReqVO, performanceMapper::selectReceivablePricePerformance);
  57 + }
  58 +
  59 + /**
  60 + * 获得员工业绩数据
  61 + *
  62 + * 1. 获得今年 + 去年的数据
  63 + * 2. 遍历今年的月份,逐个拼接去年的月份数据
  64 + *
  65 + * @param performanceReqVO 参数
  66 + * @param performanceFunction 员工业绩统计方法
  67 + * @return 员工业绩数据
  68 + */
  69 + private List<CrmStatisticsPerformanceRespVO> getPerformance(CrmStatisticsPerformanceReqVO performanceReqVO,
  70 + Function<CrmStatisticsPerformanceReqVO, List<CrmStatisticsPerformanceRespVO>> performanceFunction) {
  71 +
  72 + // 1. 获得用户编号数组
  73 + List<Long> userIds = getUserIds(performanceReqVO);
  74 + if (CollUtil.isEmpty(userIds)) {
  75 + return Collections.emptyList();
  76 + }
  77 + performanceReqVO.setUserIds(userIds);
  78 +
  79 + // 2. 获得业绩数据
  80 + int year = performanceReqVO.getTimes()[0].getYear(); // 获取查询的年份
  81 + performanceReqVO.getTimes()[0] = performanceReqVO.getTimes()[0].minusYears(1);
  82 + List<CrmStatisticsPerformanceRespVO> performanceList = performanceFunction.apply(performanceReqVO);
  83 + Map<String, BigDecimal> performanceMap = convertMap(performanceList, CrmStatisticsPerformanceRespVO::getTime,
  84 + CrmStatisticsPerformanceRespVO::getCurrentMonthCount);
  85 +
  86 + // 3. 组装数据返回
  87 + List<CrmStatisticsPerformanceRespVO> result = new ArrayList<>();
  88 + for (int month = 1; month <= 12; month++) {
  89 + String currentMonth = String.format("%d%02d", year, month);
  90 + String lastMonth = month == 1 ? String.format("%d%02d", year - 1, 12) : String.format("%d%02d", year, month - 1);
  91 + String lastYear = String.format("%d%02d", year - 1, month);
  92 + result.add(new CrmStatisticsPerformanceRespVO().setTime(currentMonth)
  93 + .setCurrentMonthCount(performanceMap.getOrDefault(currentMonth, BigDecimal.ZERO))
  94 + .setLastMonthCount(performanceMap.getOrDefault(lastMonth, BigDecimal.ZERO))
  95 + .setLastYearCount(performanceMap.getOrDefault(lastYear, BigDecimal.ZERO)));
  96 + }
  97 + return result;
  98 + }
  99 +
  100 + /**
  101 + * 获取用户编号数组。如果用户编号为空, 则获得部门下的用户编号数组,包括子部门的所有用户编号
  102 + *
  103 + * @param reqVO 请求参数
  104 + * @return 用户编号数组
  105 + */
  106 + private List<Long> getUserIds(CrmStatisticsPerformanceReqVO reqVO) {
  107 + // 情况一:选中某个用户
  108 + if (ObjUtil.isNotNull(reqVO.getUserId())) {
  109 + return ListUtil.of(reqVO.getUserId());
  110 + }
  111 + // 情况二:选中某个部门
  112 + // 2.1 获得部门列表
  113 + final Long deptId = reqVO.getDeptId();
  114 + List<Long> deptIds = convertList(deptApi.getChildDeptList(deptId), DeptRespDTO::getId);
  115 + deptIds.add(deptId);
  116 + // 2.2 获得用户编号
  117 + return convertList(adminUserApi.getUserListByDeptIds(deptIds), AdminUserRespDTO::getId);
  118 + }
  119 +
  120 +}
0 \ No newline at end of file 121 \ No newline at end of file
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.statistics;
  2 +
  3 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.*;
  4 +
  5 +import java.util.List;
  6 +
  7 +/**
  8 + * CRM 客户画像 Service 接口
  9 + *
  10 + * @author HUIHUI
  11 + */
  12 +public interface CrmStatisticsPortraitService {
  13 +
  14 + /**
  15 + * 获取客户地区统计数据
  16 + *
  17 + * @param reqVO 请求参数
  18 + * @return 统计数据
  19 + */
  20 + List<CrmStatisticCustomerAreaRespVO> getCustomerSummaryByArea(CrmStatisticsPortraitReqVO reqVO);
  21 +
  22 + /**
  23 + * 获取客户行业统计数据
  24 + *
  25 + * @param reqVO 请求参数
  26 + * @return 统计数据
  27 + */
  28 + List<CrmStatisticCustomerIndustryRespVO> getCustomerSummaryByIndustry(CrmStatisticsPortraitReqVO reqVO);
  29 +
  30 + /**
  31 + * 获取客户级别统计数据
  32 + *
  33 + * @param reqVO 请求参数
  34 + * @return 统计数据
  35 + */
  36 + List<CrmStatisticCustomerLevelRespVO> getCustomerSummaryByLevel(CrmStatisticsPortraitReqVO reqVO);
  37 +
  38 + /**
  39 + * 获取客户来源统计数据
  40 + *
  41 + * @param reqVO 请求参数
  42 + * @return 统计数据
  43 + */
  44 + List<CrmStatisticCustomerSourceRespVO> getCustomerSummaryBySource(CrmStatisticsPortraitReqVO reqVO);
  45 +
  46 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.statistics;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.collection.ListUtil;
  5 +import cn.hutool.core.util.ObjUtil;
  6 +import cn.iocoder.yudao.framework.ip.core.Area;
  7 +import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum;
  8 +import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
  9 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.*;
  10 +import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsPortraitMapper;
  11 +import cn.iocoder.yudao.module.system.api.dept.DeptApi;
  12 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
  13 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  14 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  15 +import jakarta.annotation.Resource;
  16 +import org.springframework.stereotype.Service;
  17 +
  18 +import java.util.Collections;
  19 +import java.util.List;
  20 +import java.util.Map;
  21 +
  22 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  23 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  24 +
  25 +/**
  26 + * CRM 客户画像 Service 实现类
  27 + *
  28 + * @author HUIHUI
  29 + */
  30 +@Service
  31 +public class CrmStatisticsPortraitServiceImpl implements CrmStatisticsPortraitService {
  32 +
  33 + @Resource
  34 + private CrmStatisticsPortraitMapper portraitMapper;
  35 +
  36 + @Resource
  37 + private AdminUserApi adminUserApi;
  38 + @Resource
  39 + private DeptApi deptApi;
  40 +
  41 + @Override
  42 + public List<CrmStatisticCustomerAreaRespVO> getCustomerSummaryByArea(CrmStatisticsPortraitReqVO reqVO) {
  43 + // 1. 获得用户编号数组
  44 + List<Long> userIds = getUserIds(reqVO);
  45 + if (CollUtil.isEmpty(userIds)) {
  46 + return Collections.emptyList();
  47 + }
  48 + reqVO.setUserIds(userIds);
  49 +
  50 + // 2. 获取客户地区统计数据
  51 + List<CrmStatisticCustomerAreaRespVO> list = portraitMapper.selectSummaryListGroupByAreaId(reqVO);
  52 + if (CollUtil.isEmpty(list)) {
  53 + return Collections.emptyList();
  54 + }
  55 +
  56 + // 3. 拼接数据
  57 + List<Area> areaList = AreaUtils.getByType(AreaTypeEnum.PROVINCE, area -> area);
  58 + Map<Integer, Area> areaMap = convertMap(areaList, Area::getId);
  59 + return convertList(list, item -> {
  60 + Integer parentId = AreaUtils.getParentIdByType(item.getAreaId(), AreaTypeEnum.PROVINCE);
  61 + if (parentId != null) {
  62 + Area area = areaMap.get(parentId);
  63 + if (area != null) {
  64 + item.setAreaId(parentId).setAreaName(area.getName());
  65 + return item;
  66 + }
  67 + }
  68 + // 找不到,归到未知
  69 + return item.setAreaId(null).setAreaName("未知");
  70 + });
  71 + }
  72 +
  73 + @Override
  74 + public List<CrmStatisticCustomerIndustryRespVO> getCustomerSummaryByIndustry(CrmStatisticsPortraitReqVO reqVO) {
  75 + // 1. 获得用户编号数组
  76 + List<Long> userIds = getUserIds(reqVO);
  77 + if (CollUtil.isEmpty(userIds)) {
  78 + return Collections.emptyList();
  79 + }
  80 + reqVO.setUserIds(userIds);
  81 +
  82 + // 2. 获取客户行业统计数据
  83 + return portraitMapper.selectCustomerIndustryListGroupByIndustryId(reqVO);
  84 + }
  85 +
  86 + @Override
  87 + public List<CrmStatisticCustomerSourceRespVO> getCustomerSummaryBySource(CrmStatisticsPortraitReqVO reqVO) {
  88 + // 1. 获得用户编号数组
  89 + List<Long> userIds = getUserIds(reqVO);
  90 + if (CollUtil.isEmpty(userIds)) {
  91 + return Collections.emptyList();
  92 + }
  93 + reqVO.setUserIds(userIds);
  94 +
  95 + // 2. 获取客户行业统计数据
  96 + return portraitMapper.selectCustomerSourceListGroupBySource(reqVO);
  97 + }
  98 +
  99 + @Override
  100 + public List<CrmStatisticCustomerLevelRespVO> getCustomerSummaryByLevel(CrmStatisticsPortraitReqVO reqVO) {
  101 + // 1. 获得用户编号数组
  102 + List<Long> userIds = getUserIds(reqVO);
  103 + if (CollUtil.isEmpty(userIds)) {
  104 + return Collections.emptyList();
  105 + }
  106 + reqVO.setUserIds(userIds);
  107 +
  108 + // 2. 获取客户级别统计数据
  109 + return portraitMapper.selectCustomerLevelListGroupByLevel(reqVO);
  110 + }
  111 +
  112 + /**
  113 + * 获取用户编号数组。如果用户编号为空, 则获得部门下的用户编号数组,包括子部门的所有用户编号
  114 + *
  115 + * @param reqVO 请求参数
  116 + * @return 用户编号数组
  117 + */
  118 + private List<Long> getUserIds(CrmStatisticsPortraitReqVO reqVO) {
  119 + // 情况一:选中某个用户
  120 + if (ObjUtil.isNotNull(reqVO.getUserId())) {
  121 + return ListUtil.of(reqVO.getUserId());
  122 + }
  123 + // 情况二:选中某个部门
  124 + // 2.1 获得部门列表
  125 + List<Long> deptIds = convertList(deptApi.getChildDeptList(reqVO.getDeptId()), DeptRespDTO::getId);
  126 + deptIds.add(reqVO.getDeptId());
  127 + // 2.2 获得用户编号
  128 + return convertList(adminUserApi.getUserListByDeptIds(deptIds), AdminUserRespDTO::getId);
  129 + }
  130 +
  131 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsRankService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.statistics;
  2 +
  3 +
  4 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankReqVO;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * CRM 排行榜统计 Service 接口
  11 + *
  12 + * @author anhaohao
  13 + */
  14 +public interface CrmStatisticsRankService {
  15 +
  16 + /**
  17 + * 获得合同金额排行榜
  18 + *
  19 + * @param rankReqVO 排行参数
  20 + * @return 合同金额排行榜
  21 + */
  22 + List<CrmStatisticsRankRespVO> getContractPriceRank(CrmStatisticsRankReqVO rankReqVO);
  23 +
  24 + /**
  25 + * 获得回款金额排行榜
  26 + *
  27 + * @param rankReqVO 排行参数
  28 + * @return 回款金额排行榜
  29 + */
  30 + List<CrmStatisticsRankRespVO> getReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO);
  31 +
  32 + /**
  33 + * 获得签约合同数量排行榜
  34 + *
  35 + * @param rankReqVO 排行参数
  36 + * @return 签约合同数量排行榜
  37 + */
  38 + List<CrmStatisticsRankRespVO> getContractCountRank(CrmStatisticsRankReqVO rankReqVO);
  39 +
  40 + /**
  41 + * 获得产品销量排行榜
  42 + *
  43 + * @param rankReqVO 排行参数
  44 + * @return 产品销量排行榜
  45 + */
  46 + List<CrmStatisticsRankRespVO> getProductSalesRank(CrmStatisticsRankReqVO rankReqVO);
  47 +
  48 + /**
  49 + * 获得新增客户数排行榜
  50 + *
  51 + * @param rankReqVO 排行参数
  52 + * @return 新增客户数排行榜
  53 + */
  54 + List<CrmStatisticsRankRespVO> getCustomerCountRank(CrmStatisticsRankReqVO rankReqVO);
  55 +
  56 + /**
  57 + * 获得联系人数量排行榜
  58 + *
  59 + * @param rankReqVO 排行参数
  60 + * @return 联系人数量排行榜
  61 + */
  62 + List<CrmStatisticsRankRespVO> getContactsCountRank(CrmStatisticsRankReqVO rankReqVO);
  63 +
  64 + /**
  65 + * 获得跟进次数排行榜
  66 + *
  67 + * @param rankReqVO 排行参数
  68 + * @return 跟进次数排行榜
  69 + */
  70 + List<CrmStatisticsRankRespVO> getFollowCountRank(CrmStatisticsRankReqVO rankReqVO);
  71 +
  72 + /**
  73 + * 获得跟进客户数排行榜
  74 + *
  75 + * @param rankReqVO 排行参数
  76 + * @return 跟进客户数排行榜
  77 + */
  78 + List<CrmStatisticsRankRespVO> getFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO);
  79 +
  80 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsRankServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.statistics;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO;
  7 +import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsRankMapper;
  8 +import cn.iocoder.yudao.module.system.api.dept.DeptApi;
  9 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
  10 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  11 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  12 +import jakarta.annotation.Resource;
  13 +import org.springframework.stereotype.Service;
  14 +import org.springframework.validation.annotation.Validated;
  15 +
  16 +import java.util.Collections;
  17 +import java.util.Comparator;
  18 +import java.util.List;
  19 +import java.util.Map;
  20 +import java.util.function.Function;
  21 +
  22 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  23 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  24 +
  25 +/**
  26 + * CRM 排行榜统计 Service 实现类
  27 + *
  28 + * @author anhaohao
  29 + */
  30 +@Service
  31 +@Validated
  32 +public class CrmStatisticsRankServiceImpl implements CrmStatisticsRankService {
  33 +
  34 + @Resource
  35 + private CrmStatisticsRankMapper rankMapper;
  36 +
  37 + @Resource
  38 + private AdminUserApi adminUserApi;
  39 + @Resource
  40 + private DeptApi deptApi;
  41 +
  42 + @Override
  43 + public List<CrmStatisticsRankRespVO> getContractPriceRank(CrmStatisticsRankReqVO rankReqVO) {
  44 + return getRank(rankReqVO, rankMapper::selectContractPriceRank);
  45 + }
  46 +
  47 + @Override
  48 + public List<CrmStatisticsRankRespVO> getReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO) {
  49 + return getRank(rankReqVO, rankMapper::selectReceivablePriceRank);
  50 + }
  51 +
  52 + @Override
  53 + public List<CrmStatisticsRankRespVO> getContractCountRank(CrmStatisticsRankReqVO rankReqVO) {
  54 + return getRank(rankReqVO, rankMapper::selectContractCountRank);
  55 + }
  56 +
  57 + @Override
  58 + public List<CrmStatisticsRankRespVO> getProductSalesRank(CrmStatisticsRankReqVO rankReqVO) {
  59 + return getRank(rankReqVO, rankMapper::selectProductSalesRank);
  60 + }
  61 +
  62 + @Override
  63 + public List<CrmStatisticsRankRespVO> getCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) {
  64 + return getRank(rankReqVO, rankMapper::selectCustomerCountRank);
  65 + }
  66 +
  67 + @Override
  68 + public List<CrmStatisticsRankRespVO> getContactsCountRank(CrmStatisticsRankReqVO rankReqVO) {
  69 + return getRank(rankReqVO, rankMapper::selectContactsCountRank);
  70 + }
  71 +
  72 + @Override
  73 + public List<CrmStatisticsRankRespVO> getFollowCountRank(CrmStatisticsRankReqVO rankReqVO) {
  74 + return getRank(rankReqVO, rankMapper::selectFollowCountRank);
  75 + }
  76 +
  77 + @Override
  78 + public List<CrmStatisticsRankRespVO> getFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) {
  79 + return getRank(rankReqVO, rankMapper::selectFollowCustomerCountRank);
  80 + }
  81 +
  82 + /**
  83 + * 获得排行版数据
  84 + *
  85 + * @param rankReqVO 参数
  86 + * @param rankFunction 排行榜方法
  87 + * @return 排行版数据
  88 + */
  89 + private List<CrmStatisticsRankRespVO> getRank(CrmStatisticsRankReqVO rankReqVO, Function<CrmStatisticsRankReqVO, List<CrmStatisticsRankRespVO>> rankFunction) {
  90 + // 1. 获得用户编号数组
  91 + rankReqVO.setUserIds(getUserIds(rankReqVO.getDeptId()));
  92 + if (CollUtil.isEmpty(rankReqVO.getUserIds())) {
  93 + return Collections.emptyList();
  94 + }
  95 + // 2. 获得排行数据
  96 + List<CrmStatisticsRankRespVO> ranks = rankFunction.apply(rankReqVO);
  97 + if (CollUtil.isEmpty(ranks)) {
  98 + return Collections.emptyList();
  99 + }
  100 + ranks.sort(Comparator.comparing(CrmStatisticsRankRespVO::getCount).reversed());
  101 + // 3. 拼接用户信息
  102 + appendUserInfo(ranks);
  103 + return ranks;
  104 + }
  105 +
  106 + /**
  107 + * 拼接用户信息(昵称、部门)
  108 + *
  109 + * @param ranks 排行榜数据
  110 + */
  111 + private void appendUserInfo(List<CrmStatisticsRankRespVO> ranks) {
  112 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSet(ranks, CrmStatisticsRankRespVO::getOwnerUserId));
  113 + Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
  114 + ranks.forEach(rank -> MapUtils.findAndThen(userMap, rank.getOwnerUserId(), user -> {
  115 + rank.setNickname(user.getNickname());
  116 + MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> rank.setDeptName(dept.getName()));
  117 + }));
  118 + }
  119 +
  120 + /**
  121 + * 获得部门下的用户编号数组,包括子部门的
  122 + *
  123 + * @param deptId 部门编号
  124 + * @return 用户编号数组
  125 + */
  126 + public List<Long> getUserIds(Long deptId) {
  127 + // 1. 获得部门列表
  128 + List<Long> deptIds = convertList(deptApi.getChildDeptList(deptId), DeptRespDTO::getId);
  129 + deptIds.add(deptId);
  130 + // 2. 获得用户编号
  131 + return convertList(adminUserApi.getUserListByDeptIds(deptIds), AdminUserRespDTO::getId);
  132 + }
  133 +
  134 +}
0 \ No newline at end of file 135 \ No newline at end of file
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/util/CrmAuditStatusUtils.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.util;
  2 +
  3 +import cn.hutool.core.lang.Assert;
  4 +import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;
  6 +
  7 +/**
  8 + * CRM 流程工具类
  9 + *
  10 + * @author HUIHUI
  11 + */
  12 +public class CrmAuditStatusUtils {
  13 +
  14 + /**
  15 + * BPM 审批结果转换
  16 + *
  17 + * @param bpmResult BPM 审批结果
  18 + */
  19 + public static Integer convertBpmResultToAuditStatus(Integer bpmResult) {
  20 + Integer auditStatus = BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult) ? CrmAuditStatusEnum.APPROVE.getStatus()
  21 + : BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult) ? CrmAuditStatusEnum.REJECT.getStatus()
  22 + : BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult) ? BpmTaskStatusEnum.CANCEL.getStatus() : null;
  23 + Assert.notNull(auditStatus, "BPM 审批结果({}) 转换失败", bpmResult);
  24 + return auditStatus;
  25 + }
  26 +
  27 +}
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.util;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.extra.spring.SpringUtil;
  5 +import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
  6 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  7 +import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
  8 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
  9 +import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
  10 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  11 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  12 +import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
  13 +import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
  14 +import com.github.yulichang.autoconfigure.MybatisPlusJoinProperties;
  15 +import com.github.yulichang.wrapper.MPJLambdaWrapper;
  16 +
  17 +import java.util.List;
  18 +
  19 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  20 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
  21 +
  22 +/**
  23 + * 数据权限工具类
  24 + *
  25 + * @author HUIHUI
  26 + */
  27 +public class CrmPermissionUtils {
  28 +
  29 + /**
  30 + * 校验用户是否是 CRM 管理员
  31 + *
  32 + * @return 是/否
  33 + */
  34 + public static boolean isCrmAdmin() {
  35 + PermissionApi permissionApi = SpringUtil.getBean(PermissionApi.class);
  36 + return permissionApi.hasAnyRoles(getLoginUserId(), RoleCodeEnum.CRM_ADMIN.getCode());
  37 + }
  38 +
  39 + /**
  40 + * 构造 CRM 数据类型数据【分页】查询条件
  41 + *
  42 + * @param query 连表查询对象
  43 + * @param bizType 数据类型 {@link CrmBizTypeEnum}
  44 + * @param bizId 数据编号
  45 + * @param userId 用户编号
  46 + * @param sceneType 场景类型
  47 + */
  48 + public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId,
  49 + Long userId, Integer sceneType) {
  50 + MybatisPlusJoinProperties mybatisPlusJoinProperties = SpringUtil.getBean(MybatisPlusJoinProperties.class);
  51 + final String ownerUserIdField = mybatisPlusJoinProperties.getTableAlias() + ".owner_user_id";
  52 + // 场景一:我负责的数据
  53 + if (CrmSceneTypeEnum.isOwner(sceneType)) {
  54 + query.eq(ownerUserIdField, userId);
  55 + }
  56 + // 场景二:我参与的数据(我有读或写权限,并且不是负责人)
  57 + if (CrmSceneTypeEnum.isInvolved(sceneType)) {
  58 + if (CrmPermissionUtils.isCrmAdmin()) { // 特殊逻辑:如果是超管,直接查询所有,不过滤数据权限
  59 + return;
  60 + }
  61 + query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType)
  62 + .eq(CrmPermissionDO::getBizId, bizId)
  63 + .in(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel(), CrmPermissionLevelEnum.WRITE.getLevel())
  64 + .eq(CrmPermissionDO::getUserId,userId));
  65 + query.ne(ownerUserIdField, userId);
  66 + }
  67 + // 场景三:下属负责的数据(下属是负责人)
  68 + if (CrmSceneTypeEnum.isSubordinate(sceneType)) {
  69 + AdminUserApi adminUserApi = SpringUtil.getBean(AdminUserApi.class);
  70 + List<AdminUserRespDTO> subordinateUsers = adminUserApi.getUserListBySubordinate(userId);
  71 + if (CollUtil.isEmpty(subordinateUsers)) {
  72 + query.eq(ownerUserIdField, -1); // 不返回任何结果
  73 + } else {
  74 + query.in(ownerUserIdField, convertSet(subordinateUsers, AdminUserRespDTO::getId));
  75 + }
  76 + }
  77 + }
  78 +
  79 +}
yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsCustomerMapper.xml renamed to yudao-module-crm/src/main/resources/mapper/statistics/CrmStatisticsCustomerMapper.xml
yudao-module-crm/src/main/resources/mapper/statistics/CrmStatisticsFunnelMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsFunnelMapper">
  4 +
  5 + <select id="selectCustomerCountByDate" resultType="java.lang.Long">
  6 + SELECT
  7 + COUNT(*)
  8 + FROM crm_customer
  9 + WHERE deleted = 0
  10 + AND owner_user_id IN
  11 + <!-- TODO @puhui999:这个 foreach 搞个缩进哈 - -->
  12 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  13 + #{userId}
  14 + </foreach>
  15 + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND
  16 + <!-- TODO @puhui999:下面这个,就不缩进啦 - -->
  17 + #{times[1],javaType=java.time.LocalDateTime}
  18 + </select>
  19 +
  20 + <select id="selectBusinessCountByDateAndEndStatus" resultType="java.lang.Long">
  21 + SELECT
  22 + COUNT(*)
  23 + FROM crm_business
  24 + WHERE deleted = 0
  25 + <if test="status != null">
  26 + AND end_status = #{status}
  27 + </if>
  28 + AND owner_user_id IN
  29 + <foreach collection="reqVO.userIds" item="userId" open="(" close=")" separator=",">
  30 + #{userId}
  31 + </foreach>
  32 + AND create_time BETWEEN #{reqVO.times[0],javaType=java.time.LocalDateTime} AND
  33 + #{reqVO.times[1],javaType=java.time.LocalDateTime}
  34 + </select>
  35 +
  36 + <select id="selectBusinessSummaryListGroupByEndStatus"
  37 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByEndStatusRespVO">
  38 + SELECT
  39 + end_status AS endStatus,
  40 + COUNT(*) AS businessCount,
  41 + SUM(total_price) AS totalPrice
  42 + FROM crm_business
  43 + WHERE deleted = 0 AND end_status IS NOT NULL
  44 + AND owner_user_id IN
  45 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  46 + #{userId}
  47 + </foreach>
  48 + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND
  49 + #{times[1],javaType=java.time.LocalDateTime}
  50 + GROUP BY end_status
  51 + </select>
  52 +
  53 + <select id="selectBusinessSummaryGroupByDate"
  54 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByDateRespVO">
  55 + SELECT
  56 + DATE_FORMAT(create_time, '%Y-%m-%d') AS time,
  57 + COUNT(*) AS businessCreateCount,
  58 + SUM(total_price) AS totalPrice
  59 + FROM crm_business
  60 + WHERE deleted = 0
  61 + AND owner_user_id IN
  62 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  63 + #{userId}
  64 + </foreach>
  65 + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND
  66 + #{times[1],javaType=java.time.LocalDateTime}
  67 + GROUP BY time
  68 + </select>
  69 +
  70 + <select id="selectBusinessInversionRateSummaryByDate"
  71 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessInversionRateSummaryByDateRespVO">
  72 + SELECT
  73 + DATE_FORMAT(create_time, '%Y-%m-%d') AS time,
  74 + COUNT(*) AS businessCount,
  75 + SUM(IF(end_status = 1, 1, 0)) AS businessWinCount
  76 + FROM crm_business
  77 + WHERE deleted = 0
  78 + AND owner_user_id IN
  79 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  80 + #{userId}
  81 + </foreach>
  82 + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND
  83 + #{times[1],javaType=java.time.LocalDateTime}
  84 + GROUP BY time
  85 + </select>
  86 +
  87 +</mapper>
yudao-module-crm/src/main/resources/mapper/statistics/CrmStatisticsPerformanceMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsPerformanceMapper">
  4 +
  5 + <select id="selectContractCountPerformance"
  6 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO">
  7 + SELECT
  8 + DATE_FORMAT(order_date, '%Y%m') AS time,
  9 + COUNT(1) AS currentMonthCount
  10 + FROM crm_contract
  11 + WHERE deleted = 0
  12 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
  13 + AND owner_user_id in
  14 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  15 + #{userId}
  16 + </foreach>
  17 + AND order_date between #{times[0],javaType=java.time.LocalDateTime} and
  18 + #{times[1],javaType=java.time.LocalDateTime}
  19 + GROUP BY time
  20 + </select>
  21 +
  22 + <select id="selectContractPricePerformance"
  23 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO">
  24 + SELECT
  25 + DATE_FORMAT(order_date, '%Y%m') AS time,
  26 + IFNULL(SUM(total_price), 0) AS currentMonthCount
  27 + FROM crm_contract
  28 + WHERE deleted = 0
  29 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
  30 + AND owner_user_id in
  31 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  32 + #{userId}
  33 + </foreach>
  34 + AND order_date between #{times[0],javaType=java.time.LocalDateTime} and
  35 + #{times[1],javaType=java.time.LocalDateTime}
  36 + GROUP BY time
  37 + </select>
  38 +
  39 + <select id="selectReceivablePricePerformance"
  40 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO">
  41 + SELECT
  42 + DATE_FORMAT(return_time, '%Y%m') AS time,
  43 + IFNULL(SUM(price), 0) AS currentMonthCount
  44 + FROM crm_receivable
  45 + WHERE deleted = 0
  46 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
  47 + AND owner_user_id in
  48 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  49 + #{userId}
  50 + </foreach>
  51 + AND return_time between #{times[0],javaType=java.time.LocalDateTime} and
  52 + #{times[1],javaType=java.time.LocalDateTime}
  53 + GROUP BY time
  54 + </select>
  55 +
  56 +</mapper>
yudao-module-crm/src/main/resources/mapper/statistics/CrmStatisticsPortraitMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsPortraitMapper">
  4 +
  5 + <select id="selectSummaryListGroupByAreaId"
  6 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerAreaRespVO">
  7 + SELECT area_id, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount
  8 + FROM crm_customer
  9 + WHERE deleted = 0 AND area_id IS NOT NULL
  10 + AND owner_user_id IN
  11 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  12 + #{userId}
  13 + </foreach>
  14 + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime}
  15 + AND #{times[1],javaType=java.time.LocalDateTime}
  16 + GROUP BY area_id
  17 + </select>
  18 +
  19 + <select id="selectCustomerIndustryListGroupByIndustryId"
  20 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerIndustryRespVO">
  21 + SELECT industry_id, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount
  22 + FROM crm_customer
  23 + WHERE deleted = 0 AND industry_id IS NOT NULL
  24 + AND owner_user_id IN
  25 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  26 + #{userId}
  27 + </foreach>
  28 + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime}
  29 + AND #{times[1],javaType=java.time.LocalDateTime}
  30 + GROUP BY industry_id
  31 + </select>
  32 +
  33 + <select id="selectCustomerSourceListGroupBySource"
  34 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerSourceRespVO">
  35 + SELECT source, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount
  36 + FROM crm_customer
  37 + WHERE deleted = 0 AND source IS NOT NULL
  38 + AND owner_user_id IN
  39 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  40 + #{userId}
  41 + </foreach>
  42 + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime}
  43 + AND #{times[1],javaType=java.time.LocalDateTime}
  44 + GROUP BY source
  45 + </select>
  46 +
  47 + <select id="selectCustomerLevelListGroupByLevel"
  48 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerLevelRespVO">
  49 + SELECT level, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount
  50 + FROM crm_customer
  51 + WHERE deleted = 0 AND level IS NOT NULL
  52 + AND owner_user_id IN
  53 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  54 + #{userId}
  55 + </foreach>
  56 + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime}
  57 + AND #{times[1],javaType=java.time.LocalDateTime}
  58 + GROUP BY level
  59 + </select>
  60 +
  61 +</mapper>
yudao-module-crm/src/main/resources/mapper/statistics/CrmStatisticsRankMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsRankMapper">
  4 +
  5 + <select id="selectContractPriceRank"
  6 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">
  7 + SELECT IFNULL(SUM(total_price), 0) AS count, owner_user_id
  8 + FROM crm_contract
  9 + WHERE deleted = 0
  10 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
  11 + and owner_user_id in
  12 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  13 + #{userId}
  14 + </foreach>
  15 + AND order_date between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}
  16 + GROUP BY owner_user_id
  17 + </select>
  18 +
  19 + <select id="selectReceivablePriceRank"
  20 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">
  21 + SELECT IFNULL(SUM(price), 0) AS count, owner_user_id
  22 + FROM crm_receivable
  23 + WHERE deleted = 0
  24 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
  25 + AND owner_user_id in
  26 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  27 + #{userId}
  28 + </foreach>
  29 + AND return_time between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}
  30 + GROUP BY owner_user_id
  31 + </select>
  32 +
  33 + <select id="selectContractCountRank"
  34 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">
  35 + SELECT COUNT(1) AS count, owner_user_id
  36 + FROM crm_contract
  37 + WHERE deleted = 0
  38 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
  39 + AND owner_user_id in
  40 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  41 + #{userId}
  42 + </foreach>
  43 + AND order_date between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}
  44 + GROUP BY owner_user_id
  45 + </select>
  46 +
  47 + <select id="selectProductSalesRank"
  48 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">
  49 + SELECT COUNT(product.count) AS count, contract.owner_user_id
  50 + FROM crm_contract_product product
  51 + INNER JOIN crm_contract contract ON product.contract_id = contract.id
  52 + WHERE contract.deleted = 0 AND contract.deleted = 0
  53 + AND contract.audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
  54 + AND contract.owner_user_id in
  55 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  56 + #{userId}
  57 + </foreach>
  58 + AND contract.order_date between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}
  59 + GROUP BY contract.owner_user_id
  60 + </select>
  61 +
  62 + <select id="selectCustomerCountRank"
  63 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">
  64 + SELECT COUNT(1) AS count, owner_user_id
  65 + FROM crm_customer
  66 + WHERE deleted = 0
  67 + AND owner_user_id in
  68 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  69 + #{userId}
  70 + </foreach>
  71 + AND create_time between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}
  72 + GROUP BY owner_user_id
  73 + </select>
  74 +
  75 + <select id="selectContactsCountRank"
  76 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">
  77 + SELECT COUNT(1) AS count, owner_user_id
  78 + FROM crm_contact
  79 + WHERE deleted = 0
  80 + AND owner_user_id in
  81 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  82 + #{userId}
  83 + </foreach>
  84 + AND create_time between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}
  85 + GROUP BY owner_user_id
  86 + </select>
  87 +
  88 + <select id="selectFollowCountRank"
  89 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">
  90 + SELECT COUNT(1) AS count, cc.owner_user_id
  91 + FROM crm_follow_up_record AS cfur
  92 + LEFT JOIN crm_contact AS cc ON FIND_IN_SET(cc.id, cfur.contact_ids)
  93 + WHERE cfur.deleted = 0
  94 + AND cc.deleted = 0
  95 + AND cc.owner_user_id in
  96 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  97 + #{userId}
  98 + </foreach>
  99 + AND cfur.create_time between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}
  100 + GROUP BY cc.owner_user_id
  101 + </select>
  102 +
  103 + <select id="selectFollowCustomerCountRank"
  104 + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">
  105 + SELECT COUNT(DISTINCT cc.id) AS count, cc.owner_user_id
  106 + FROM crm_follow_up_record AS cfur
  107 + LEFT JOIN crm_contact AS cc ON FIND_IN_SET(cc.id, cfur.contact_ids)
  108 + WHERE cfur.deleted = 0
  109 + AND cc.deleted = 0
  110 + AND cc.owner_user_id in
  111 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  112 + #{userId}
  113 + </foreach>
  114 + AND cfur.create_time between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}
  115 + GROUP BY cc.owner_user_id
  116 + </select>
  117 +
  118 +</mapper>
yudao-module-crm/src/test/resources/application-unit-test.yaml 0 → 100644
  1 +spring:
  2 + main:
  3 + lazy-initialization: true # 开启懒加载,加快速度
  4 + banner-mode: off # 单元测试,禁用 Banner
  5 +
  6 +--- #################### 数据库相关配置 ####################
  7 +
  8 +spring:
  9 + # 数据源配置项
  10 + datasource:
  11 + name: ruoyi-vue-pro
  12 + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写
  13 + driver-class-name: org.h2.Driver
  14 + username: sa
  15 + password:
  16 + druid:
  17 + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
  18 + initial-size: 1 # 单元测试,配置为 1,提升启动速度
  19 + sql:
  20 + init:
  21 + schema-locations: classpath:/sql/create_tables.sql
  22 +
  23 + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
  24 + data:
  25 + redis:
  26 + host: 127.0.0.1 # 地址
  27 + port: 16379 # 端口(单元测试,使用 16379 端口)
  28 + database: 0 # 数据库索引
  29 +
  30 +mybatis-plus:
  31 + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
  32 + type-aliases-package: ${yudao.info.base-package}.module.*.dal.dataobject
  33 +
  34 +--- #################### 定时任务相关配置 ####################
  35 +
  36 +--- #################### 配置中心相关配置 ####################
  37 +
  38 +--- #################### 服务保障相关配置 ####################
  39 +
  40 +# Lock4j 配置项(单元测试,禁用 Lock4j)
  41 +
  42 +--- #################### 监控相关配置 ####################
  43 +
  44 +--- #################### 芋道相关配置 ####################
  45 +
  46 +# 芋道配置项,设置当前项目所有自定义的配置
  47 +yudao:
  48 + info:
  49 + base-package: cn.iocoder.yudao
yudao-module-crm/yudao-module-crm-biz/src/test/resources/logback.xml renamed to yudao-module-crm/src/test/resources/logback.xml
yudao-module-crm/yudao-module-crm-api/pom.xml deleted
1 -<?xml version="1.0" encoding="UTF-8"?>  
2 -<project xmlns="http://maven.apache.org/POM/4.0.0"  
3 - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
4 - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
5 - <parent>  
6 - <groupId>cn.iocoder.boot</groupId>  
7 - <artifactId>yudao-module-crm</artifactId>  
8 - <version>${revision}</version>  
9 - </parent>  
10 - <modelVersion>4.0.0</modelVersion>  
11 - <artifactId>yudao-module-crm-api</artifactId>  
12 - <packaging>jar</packaging>  
13 -  
14 - <name>${project.artifactId}</name>  
15 - <description>  
16 - crm 模块 API,暴露给其它模块调用  
17 - </description>  
18 -  
19 - <dependencies>  
20 - <dependency>  
21 - <groupId>cn.iocoder.boot</groupId>  
22 - <artifactId>yudao-common</artifactId>  
23 - </dependency>  
24 -  
25 - <!-- 参数校验 -->  
26 - <dependency>  
27 - <groupId>org.springframework.boot</groupId>  
28 - <artifactId>spring-boot-starter-validation</artifactId>  
29 - <optional>true</optional>  
30 - </dependency>  
31 - </dependencies>  
32 -  
33 -</project>  
yudao-module-crm/yudao-module-crm-biz/pom.xml deleted
1 -<?xml version="1.0" encoding="UTF-8"?>  
2 -<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
3 - xmlns="http://maven.apache.org/POM/4.0.0"  
4 - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
5 - <parent>  
6 - <groupId>cn.iocoder.boot</groupId>  
7 - <artifactId>yudao-module-crm</artifactId>  
8 - <version>${revision}</version>  
9 - </parent>  
10 - <modelVersion>4.0.0</modelVersion>  
11 - <artifactId>yudao-module-crm-biz</artifactId>  
12 -  
13 - <name>${project.artifactId}</name>  
14 - <description>  
15 - crm 包下,客户关系管理(Customer Relationship Management)。  
16 - 例如说:客户、联系人、商机、合同、回款等等  
17 - </description>  
18 -  
19 - <dependencies>  
20 - <dependency>  
21 - <groupId>cn.iocoder.boot</groupId>  
22 - <artifactId>yudao-module-system-api</artifactId>  
23 - <version>${revision}</version>  
24 - </dependency>  
25 - <dependency>  
26 - <groupId>cn.iocoder.boot</groupId>  
27 - <artifactId>yudao-module-infra-api</artifactId>  
28 - <version>${revision}</version>  
29 - </dependency>  
30 - <dependency>  
31 - <groupId>cn.iocoder.boot</groupId>  
32 - <artifactId>yudao-module-crm-api</artifactId>  
33 - <version>${revision}</version>  
34 - </dependency>  
35 - <dependency>  
36 - <groupId>cn.iocoder.boot</groupId>  
37 - <artifactId>yudao-module-bpm-api</artifactId>  
38 - <version>${revision}</version>  
39 - </dependency>  
40 -  
41 - <!-- 业务组件 -->  
42 - <dependency>  
43 - <groupId>cn.iocoder.boot</groupId>  
44 - <artifactId>yudao-spring-boot-starter-biz-ip</artifactId>  
45 - </dependency>  
46 - <dependency>  
47 - <groupId>cn.iocoder.boot</groupId>  
48 - <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>  
49 - </dependency>  
50 -  
51 - <!-- Web 相关 -->  
52 - <dependency>  
53 - <groupId>cn.iocoder.boot</groupId>  
54 - <artifactId>yudao-spring-boot-starter-web</artifactId>  
55 - </dependency>  
56 -  
57 - <dependency>  
58 - <groupId>cn.iocoder.boot</groupId>  
59 - <artifactId>yudao-spring-boot-starter-security</artifactId>  
60 - </dependency>  
61 -  
62 - <!-- DB 相关 -->  
63 - <dependency>  
64 - <groupId>cn.iocoder.boot</groupId>  
65 - <artifactId>yudao-spring-boot-starter-mybatis</artifactId>  
66 - </dependency>  
67 -  
68 - <!-- 工具类相关 -->  
69 - <dependency>  
70 - <groupId>cn.iocoder.boot</groupId>  
71 - <artifactId>yudao-spring-boot-starter-excel</artifactId>  
72 - </dependency>  
73 -  
74 - <!-- Test 测试相关 -->  
75 - <dependency>  
76 - <groupId>cn.iocoder.boot</groupId>  
77 - <artifactId>yudao-spring-boot-starter-test</artifactId>  
78 - </dependency>  
79 - </dependencies>  
80 -</project>  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/web/package-info.java deleted
1 -/**  
2 - * crm 模块的 web 拓展封装  
3 - */  
4 -package cn.iocoder.yudao.module.crm.framework.web;  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/job/package-info.java deleted
1 -/**  
2 - * 定时任务  
3 - */  
4 -package cn.iocoder.yudao.module.crm.job;  
5 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessStatusService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.business;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusSaveReqVO;  
6 -import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;  
7 -import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO;  
8 -import jakarta.validation.Valid;  
9 -  
10 -import java.util.Collection;  
11 -import java.util.List;  
12 -import java.util.Map;  
13 -  
14 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
15 -  
16 -/**  
17 - * 商机状态 Service 接口  
18 - *  
19 - * @author ljlleo  
20 - */  
21 -public interface CrmBusinessStatusService {  
22 -  
23 - /**  
24 - * 创建商机状态  
25 - *  
26 - * @param createReqVO 创建信息  
27 - * @return 编号  
28 - */  
29 - Long createBusinessStatus(@Valid CrmBusinessStatusSaveReqVO createReqVO);  
30 -  
31 - /**  
32 - * 更新商机状态  
33 - *  
34 - * @param updateReqVO 更新信息  
35 - */  
36 - void updateBusinessStatus(@Valid CrmBusinessStatusSaveReqVO updateReqVO);  
37 -  
38 - /**  
39 - * 删除商机状态  
40 - *  
41 - * @param id 编号  
42 - */  
43 - void deleteBusinessStatusType(Long id);  
44 -  
45 - /**  
46 - * 获得商机状态组  
47 - *  
48 - * @param id 编号  
49 - * @return 商机状态组  
50 - */  
51 - CrmBusinessStatusTypeDO getBusinessStatusType(Long id);  
52 -  
53 - /**  
54 - * 校验商机状态组  
55 - *  
56 - * @param id 编号  
57 - */  
58 - void validateBusinessStatusType(Long id);  
59 -  
60 - /**  
61 - * 获得商机状态组列表  
62 - *  
63 - * @return 商机状态组列表  
64 - */  
65 - List<CrmBusinessStatusTypeDO> getBusinessStatusTypeList();  
66 -  
67 - /**  
68 - * 获得商机状态组分页  
69 - *  
70 - * @param pageReqVO 分页查询  
71 - * @return 商机状态组分页  
72 - */  
73 - PageResult<CrmBusinessStatusTypeDO> getBusinessStatusTypePage(PageParam pageReqVO);  
74 -  
75 - /**  
76 - * 获得商机状态组列表  
77 - *  
78 - * @param ids 编号数组  
79 - * @return 商机状态组列表  
80 - */  
81 - List<CrmBusinessStatusTypeDO> getBusinessStatusTypeList(Collection<Long> ids);  
82 -  
83 - /**  
84 - * 获得商机状态组 Map  
85 - *  
86 - * @param ids 编号数组  
87 - * @return 商机状态组 Map  
88 - */  
89 - default Map<Long, CrmBusinessStatusTypeDO> getBusinessStatusTypeMap(Collection<Long> ids) {  
90 - return convertMap(getBusinessStatusTypeList(ids), CrmBusinessStatusTypeDO::getId);  
91 - }  
92 -  
93 - /**  
94 - * 获得指定类型的商机状态列表  
95 - *  
96 - * @param typeId 商机状态组编号  
97 - * @return 商机状态列表  
98 - */  
99 - List<CrmBusinessStatusDO> getBusinessStatusListByTypeId(Long typeId);  
100 -  
101 - /**  
102 - * 获得商机状态列表  
103 - *  
104 - * @param ids 编号数组  
105 - * @return 商机状态列表  
106 - */  
107 - List<CrmBusinessStatusDO> getBusinessStatusList(Collection<Long> ids);  
108 -  
109 - /**  
110 - * 获得商机状态 Map  
111 - *  
112 - * @param ids 编号数组  
113 - * @return 商机状态 Map  
114 - */  
115 - default Map<Long, CrmBusinessStatusDO> getBusinessStatusMap(Collection<Long> ids) {  
116 - return convertMap(getBusinessStatusList(ids), CrmBusinessStatusDO::getId);  
117 - }  
118 -  
119 - /**  
120 - * 获得商机状态  
121 - *  
122 - * @param id 编号  
123 - * @return 商机状态  
124 - */  
125 - CrmBusinessStatusDO getBusinessStatus(Long id);  
126 -  
127 - /**  
128 - * 校验商机状态  
129 - *  
130 - * @param statusTypeId 商机状态组编号  
131 - * @param statusId 商机状态编号  
132 - */  
133 - CrmBusinessStatusDO validateBusinessStatus(Long statusTypeId, Long statusId);  
134 -  
135 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.clue;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueSaveReqVO;  
6 -import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueTransferReqVO;  
7 -import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;  
8 -import jakarta.validation.Valid;  
9 -  
10 -import java.time.LocalDateTime;  
11 -  
12 -/**  
13 - * 线索 Service 接口  
14 - *  
15 - * @author Wanwan  
16 - */  
17 -public interface CrmClueService {  
18 -  
19 - /**  
20 - * 创建线索  
21 - *  
22 - * @param createReqVO 创建信息  
23 - * @return 编号  
24 - */  
25 - Long createClue(@Valid CrmClueSaveReqVO createReqVO);  
26 -  
27 - /**  
28 - * 更新线索  
29 - *  
30 - * @param updateReqVO 更新信息  
31 - */  
32 - void updateClue(@Valid CrmClueSaveReqVO updateReqVO);  
33 -  
34 - /**  
35 - * 更新线索相关的跟进信息  
36 - *  
37 - * @param id 编号  
38 - * @param contactNextTime 下次联系时间  
39 - * @param contactLastContent 最后联系内容  
40 - */  
41 - void updateClueFollowUp(Long id, LocalDateTime contactNextTime, String contactLastContent);  
42 -  
43 - /**  
44 - * 删除线索  
45 - *  
46 - * @param id 编号  
47 - */  
48 - void deleteClue(Long id);  
49 -  
50 - /**  
51 - * 获得线索  
52 - *  
53 - * @param id 编号  
54 - * @return 线索  
55 - */  
56 - CrmClueDO getClue(Long id);  
57 -  
58 - /**  
59 - * 获得线索分页  
60 - *  
61 - * @param pageReqVO 分页查询  
62 - * @param userId 用户编号  
63 - * @return 线索分页  
64 - */  
65 - PageResult<CrmClueDO> getCluePage(CrmCluePageReqVO pageReqVO, Long userId);  
66 -  
67 - /**  
68 - * 线索转移  
69 - *  
70 - * @param reqVO 请求  
71 - * @param userId 用户编号  
72 - */  
73 - void transferClue(CrmClueTransferReqVO reqVO, Long userId);  
74 -  
75 - /**  
76 - * 线索转化为客户  
77 - *  
78 - * @param id 线索编号  
79 - * @param userId 用户编号  
80 - */  
81 - void transformClue(Long id, Long userId);  
82 -  
83 - /**  
84 - * 获得分配给我的、待跟进的线索数量  
85 - *  
86 - * @param userId 用户编号  
87 - * @return 数量  
88 - */  
89 - Long getFollowClueCount(Long userId);  
90 -  
91 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactBusinessService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.contact;  
2 -  
3 -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusiness2ReqVO;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactBusinessReqVO;  
5 -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactBusinessDO;  
6 -import jakarta.validation.Valid;  
7 -  
8 -import java.util.List;  
9 -  
10 -/**  
11 - * CRM 联系人与商机的关联 Service 接口  
12 - *  
13 - * @author 芋道源码  
14 - */  
15 -public interface CrmContactBusinessService {  
16 -  
17 - /**  
18 - * 创建联系人与商机的关联【通过联系人,关联商机】  
19 - *  
20 - * @param createReqVO 创建信息  
21 - */  
22 - void createContactBusinessList(@Valid CrmContactBusinessReqVO createReqVO);  
23 -  
24 - /**  
25 - * 创建联系人与商机的关联【通过商机,关联联系人】  
26 - *  
27 - * @param createReqVO 创建信息  
28 - */  
29 - void createContactBusinessList2(@Valid CrmContactBusiness2ReqVO createReqVO);  
30 -  
31 - /**  
32 - * 删除联系人与商机的关联【通过联系人,取关商机】  
33 - *  
34 - * @param deleteReqVO 删除信息  
35 - */  
36 - void deleteContactBusinessList(@Valid CrmContactBusinessReqVO deleteReqVO);  
37 -  
38 - /**  
39 - * 删除联系人与商机的关联【通过商机,取关联系人】  
40 - *  
41 - * @param deleteReqVO 删除信息  
42 - */  
43 - void deleteContactBusinessList2(@Valid CrmContactBusiness2ReqVO deleteReqVO);  
44 -  
45 - /**  
46 - * 删除联系人与商机的关联,基于联系人编号  
47 - *  
48 - * @param contactId 联系人编号  
49 - */  
50 - void deleteContactBusinessByContactId(Long contactId);  
51 -  
52 - /**  
53 - * 获得联系人与商机的关联列表,基于联系人编号  
54 - *  
55 - * @param contactId 联系人编号  
56 - * @return 联系人商机关联  
57 - */  
58 - List<CrmContactBusinessDO> getContactBusinessListByContactId(Long contactId);  
59 -  
60 - /**  
61 - * 获得联系人与商机的关联列表,基于商机编号  
62 - *  
63 - * @param businessId 商机编号  
64 - * @return 联系人商机关联  
65 - */  
66 - List<CrmContactBusinessDO> getContactBusinessListByBusinessId(Long businessId);  
67 -  
68 -}  
69 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractConfigServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.crm.service.contract;  
2 -  
3 -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.config.CrmContractConfigSaveReqVO;  
5 -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractConfigDO;  
6 -import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractConfigMapper;  
7 -import com.mzt.logapi.context.LogRecordContext;  
8 -import com.mzt.logapi.starter.annotation.LogRecord;  
9 -import jakarta.annotation.Resource;  
10 -import org.springframework.stereotype.Service;  
11 -import org.springframework.validation.annotation.Validated;  
12 -  
13 -import java.util.Objects;  
14 -  
15 -import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*;  
16 -  
17 -/**  
18 - * 合同配置 Service 实现类  
19 - *  
20 - * @author 芋道源码  
21 - */  
22 -@Service  
23 -@Validated  
24 -public class CrmContractConfigServiceImpl implements CrmContractConfigService {  
25 -  
26 - @Resource  
27 - private CrmContractConfigMapper contractConfigMapper;  
28 -  
29 - @Override  
30 - public CrmContractConfigDO getContractConfig() {  
31 - return contractConfigMapper.selectOne();  
32 - }  
33 -  
34 - @Override  
35 - @LogRecord(type = CRM_CONTRACT_CONFIG_TYPE, subType = CRM_CONTRACT_CONFIG_SUB_TYPE, bizNo = "{{#configId}}",  
36 - success = CRM_CONTRACT_CONFIG_SUCCESS)  
37 - public void saveContractConfig(CrmContractConfigSaveReqVO saveReqVO) {  
38 - // 1. 存在,则进行更新  
39 - CrmContractConfigDO dbConfig = getContractConfig();  
40 - CrmContractConfigDO config = BeanUtils.toBean(saveReqVO, CrmContractConfigDO.class);  
41 - if (Objects.nonNull(dbConfig)) {  
42 - contractConfigMapper.updateById(config.setId(dbConfig.getId()));  
43 - // 记录操作日志上下文  
44 - LogRecordContext.putVariable("isConfigUpdate", Boolean.TRUE);  
45 - LogRecordContext.putVariable("configId", config.getId());  
46 - return;  
47 - }  
48 -  
49 - // 2. 不存在,则进行插入  
50 - contractConfigMapper.insert(config);  
51 - // 记录操作日志上下文  
52 - LogRecordContext.putVariable("isConfigUpdate", Boolean.FALSE);  
53 - LogRecordContext.putVariable("configId", config.getId());  
54 - }  
55 -  
56 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/listener/CrmContractStatusListener.java deleted
1 -package cn.iocoder.yudao.module.crm.service.contract.listener;  
2 -  
3 -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;  
4 -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEventListener;  
5 -import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;  
6 -import cn.iocoder.yudao.module.crm.service.contract.CrmContractServiceImpl;  
7 -import jakarta.annotation.Resource;  
8 -import org.springframework.stereotype.Component;  
9 -  
10 -/**  
11 - * 合同审批的结果的监听器实现类  
12 - *  
13 - * @author HUIHUI  
14 - */  
15 -@Component  
16 -public class CrmContractStatusListener extends BpmProcessInstanceStatusEventListener {  
17 -  
18 - @Resource  
19 - private CrmContractService contractService;  
20 -  
21 - @Override  
22 - public String getProcessDefinitionKey() {  
23 - return CrmContractServiceImpl.BPM_PROCESS_DEFINITION_KEY;  
24 - }  
25 -  
26 - @Override  
27 - protected void onEvent(BpmProcessInstanceStatusEvent event) {  
28 - contractService.updateContractAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus());  
29 - }  
30 -  
31 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerLimitConfigService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.customer;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigSaveReqVO;  
6 -import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO;  
7 -import jakarta.validation.Valid;  
8 -  
9 -import java.util.List;  
10 -  
11 -/**  
12 - * 客户限制配置 Service 接口  
13 - *  
14 - * @author Wanwan  
15 - */  
16 -public interface CrmCustomerLimitConfigService {  
17 -  
18 - /**  
19 - * 创建客户限制配置  
20 - *  
21 - * @param createReqVO 创建信息  
22 - * @return 编号  
23 - */  
24 - Long createCustomerLimitConfig(@Valid CrmCustomerLimitConfigSaveReqVO createReqVO);  
25 -  
26 - /**  
27 - * 更新客户限制配置  
28 - *  
29 - * @param updateReqVO 更新信息  
30 - */  
31 - void updateCustomerLimitConfig(@Valid CrmCustomerLimitConfigSaveReqVO updateReqVO);  
32 -  
33 - /**  
34 - * 删除客户限制配置  
35 - *  
36 - * @param id 编号  
37 - */  
38 - void deleteCustomerLimitConfig(Long id);  
39 -  
40 - /**  
41 - * 获得客户限制配置  
42 - *  
43 - * @param id 编号  
44 - * @return 客户限制配置  
45 - */  
46 - CrmCustomerLimitConfigDO getCustomerLimitConfig(Long id);  
47 -  
48 - /**  
49 - * 获得客户限制配置分页  
50 - *  
51 - * @param pageReqVO 分页查询  
52 - * @return 客户限制配置分页  
53 - */  
54 - PageResult<CrmCustomerLimitConfigDO> getCustomerLimitConfigPage(CrmCustomerLimitConfigPageReqVO pageReqVO);  
55 -  
56 - /**  
57 - * 查询用户对应的配置列表  
58 - *  
59 - * @param type 类型  
60 - * @param userId 用户类型  
61 - */  
62 - List<CrmCustomerLimitConfigDO> getCustomerLimitConfigListByUserId(Integer type, Long userId);  
63 -  
64 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerPoolConfigServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.crm.service.customer;  
2 -  
3 -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO;  
5 -import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO;  
6 -import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerPoolConfigMapper;  
7 -import com.mzt.logapi.context.LogRecordContext;  
8 -import com.mzt.logapi.starter.annotation.LogRecord;  
9 -import jakarta.annotation.Resource;  
10 -import org.springframework.stereotype.Service;  
11 -import org.springframework.validation.annotation.Validated;  
12 -  
13 -import java.util.Objects;  
14 -  
15 -import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*;  
16 -  
17 -/**  
18 - * 客户公海配置 Service 实现类  
19 - *  
20 - * @author Wanwan  
21 - */  
22 -@Service  
23 -@Validated  
24 -public class CrmCustomerPoolConfigServiceImpl implements CrmCustomerPoolConfigService {  
25 -  
26 - @Resource  
27 - private CrmCustomerPoolConfigMapper customerPoolConfigMapper;  
28 -  
29 - @Override  
30 - public CrmCustomerPoolConfigDO getCustomerPoolConfig() {  
31 - return customerPoolConfigMapper.selectOne();  
32 - }  
33 -  
34 - @Override  
35 - @LogRecord(type = CRM_CUSTOMER_POOL_CONFIG_TYPE, subType = CRM_CUSTOMER_POOL_CONFIG_SUB_TYPE, bizNo = "{{#poolConfigId}}",  
36 - success = CRM_CUSTOMER_POOL_CONFIG_SUCCESS)  
37 - public void saveCustomerPoolConfig(CrmCustomerPoolConfigSaveReqVO saveReqVO) {  
38 - // 1. 存在,则进行更新  
39 - CrmCustomerPoolConfigDO dbConfig = getCustomerPoolConfig();  
40 - CrmCustomerPoolConfigDO poolConfig = BeanUtils.toBean(saveReqVO, CrmCustomerPoolConfigDO.class);  
41 - if (Objects.nonNull(dbConfig)) {  
42 - customerPoolConfigMapper.updateById(poolConfig.setId(dbConfig.getId()));  
43 - // 记录操作日志上下文  
44 - LogRecordContext.putVariable("isPoolConfigUpdate", Boolean.TRUE);  
45 - LogRecordContext.putVariable("poolConfigId", poolConfig.getId());  
46 - return;  
47 - }  
48 -  
49 - // 2. 不存在,则进行插入  
50 - customerPoolConfigMapper.insert(poolConfig);  
51 - // 记录操作日志上下文  
52 - LogRecordContext.putVariable("isPoolConfigUpdate", Boolean.FALSE);  
53 - LogRecordContext.putVariable("poolConfigId", poolConfig.getId());  
54 - }  
55 -  
56 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.customer;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.customer.*;  
5 -import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;  
6 -import cn.iocoder.yudao.module.crm.service.customer.bo.CrmCustomerCreateReqBO;  
7 -import jakarta.validation.Valid;  
8 -  
9 -import java.time.LocalDateTime;  
10 -import java.util.Collection;  
11 -import java.util.List;  
12 -import java.util.Map;  
13 -  
14 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
15 -  
16 -/**  
17 - * 客户 Service 接口  
18 - *  
19 - * @author Wanwan  
20 - */  
21 -public interface CrmCustomerService {  
22 -  
23 - /**  
24 - * 创建客户  
25 - *  
26 - * @param createReqVO 创建信息  
27 - * @param userId 用户编号  
28 - * @return 编号  
29 - */  
30 - Long createCustomer(@Valid CrmCustomerSaveReqVO createReqVO, Long userId);  
31 -  
32 - /**  
33 - * 更新客户  
34 - *  
35 - * @param updateReqVO 更新信息  
36 - */  
37 - void updateCustomer(@Valid CrmCustomerSaveReqVO updateReqVO);  
38 -  
39 - /**  
40 - * 更新客户的跟进状态  
41 - *  
42 - * @param id 编号  
43 - * @param dealStatus 跟进状态  
44 - */  
45 - void updateCustomerDealStatus(Long id, Boolean dealStatus);  
46 -  
47 - /**  
48 - * 更新客户相关的跟进信息  
49 - *  
50 - * @param id 编号  
51 - * @param contactNextTime 下次联系时间  
52 - * @param contactLastContent 最后联系内容  
53 - */  
54 - void updateCustomerFollowUp(Long id, LocalDateTime contactNextTime, String contactLastContent);  
55 -  
56 - /**  
57 - * 删除客户  
58 - *  
59 - * @param id 编号  
60 - */  
61 - void deleteCustomer(Long id);  
62 -  
63 - /**  
64 - * 获得客户  
65 - *  
66 - * @param id 编号  
67 - * @return 客户  
68 - */  
69 - CrmCustomerDO getCustomer(Long id);  
70 -  
71 - /**  
72 - * 获得客户列表  
73 - *  
74 - * @param ids 客户编号数组  
75 - * @return 客户列表  
76 - * @author ljlleo  
77 - */  
78 - List<CrmCustomerDO> getCustomerList(Collection<Long> ids);  
79 -  
80 - /**  
81 - * 获得客户 Map  
82 - *  
83 - * @param ids 客户编号数组  
84 - * @return 客户 Map  
85 - */  
86 - default Map<Long, CrmCustomerDO> getCustomerMap(Collection<Long> ids) {  
87 - return convertMap(getCustomerList(ids), CrmCustomerDO::getId);  
88 - }  
89 -  
90 - /**  
91 - * 获得客户分页  
92 - *  
93 - * @param pageReqVO 分页查询  
94 - * @param userId 用户编号  
95 - * @return 客户分页  
96 - */  
97 - PageResult<CrmCustomerDO> getCustomerPage(CrmCustomerPageReqVO pageReqVO, Long userId);  
98 -  
99 - /**  
100 - * 获得放入公海提醒的客户分页  
101 - *  
102 - * @param pageVO 分页查询  
103 - * @param userId 用户编号  
104 - * @return 客户分页  
105 - */  
106 - PageResult<CrmCustomerDO> getPutPoolRemindCustomerPage(CrmCustomerPageReqVO pageVO, Long userId);  
107 -  
108 - /**  
109 - * 获得待进入公海的客户数量  
110 - *  
111 - * @param userId 用户编号  
112 - * @return 提醒数量  
113 - */  
114 - Long getPutPoolRemindCustomerCount(Long userId);  
115 -  
116 - /**  
117 - * 获得今日需联系客户数量  
118 - *  
119 - * @param userId 用户编号  
120 - * @return 提醒数量  
121 - */  
122 - Long getTodayContactCustomerCount(Long userId);  
123 -  
124 - /**  
125 - * 获得分配给我的客户数量  
126 - *  
127 - * @param userId 用户编号  
128 - * @return 提醒数量  
129 - */  
130 - Long getFollowCustomerCount(Long userId);  
131 -  
132 - /**  
133 - * 校验客户是否存在  
134 - *  
135 - * @param id 编号  
136 - */  
137 - void validateCustomer(Long id);  
138 -  
139 - /**  
140 - * 客户转移  
141 - *  
142 - * @param reqVO 请求  
143 - * @param userId 用户编号  
144 - */  
145 - void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId);  
146 -  
147 - /**  
148 - * 锁定/解锁客户  
149 - *  
150 - * @param lockReqVO 更新信息  
151 - * @param userId 用户编号  
152 - */  
153 - void lockCustomer(@Valid CrmCustomerLockReqVO lockReqVO, Long userId);  
154 -  
155 - /**  
156 - * 创建客户  
157 - *  
158 - * @param customerCreateReq 请求信息  
159 - * @param userId 用户编号  
160 - * @return 客户列表  
161 - */  
162 - Long createCustomer(CrmCustomerCreateReqBO customerCreateReq, Long userId);  
163 -  
164 - /**  
165 - * 批量导入客户  
166 - *  
167 - * @param importCustomers 导入客户列表  
168 - * @param importReqVO 请求  
169 - * @return 导入结果  
170 - */  
171 - CrmCustomerImportRespVO importCustomerList(List<CrmCustomerImportExcelVO> importCustomers, CrmCustomerImportReqVO importReqVO);  
172 -  
173 - // ==================== 公海相关操作 ====================  
174 -  
175 - /**  
176 - * 客户放入公海  
177 - *  
178 - * @param id 客户编号  
179 - */  
180 - void putCustomerPool(Long id);  
181 -  
182 - /**  
183 - * 领取公海客户  
184 - *  
185 - * @param ids 要领取的客户编号数组  
186 - * @param ownerUserId 负责人  
187 - * @param isReceive 是/否领取;true - 领取;false - 分配  
188 - */  
189 - void receiveCustomer(List<Long> ids, Long ownerUserId, Boolean isReceive);  
190 -  
191 - /**  
192 - * 【系统】客户自动掉入公海  
193 - *  
194 - * @return 掉入公海数量  
195 - */  
196 - int autoPutCustomerPool();  
197 -  
198 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/bo/CrmCustomerCreateReqBO.java deleted
1 -package cn.iocoder.yudao.module.crm.service.customer.bo;  
2 -  
3 -import cn.iocoder.yudao.framework.common.validation.Mobile;  
4 -import cn.iocoder.yudao.framework.common.validation.Telephone;  
5 -import cn.iocoder.yudao.module.crm.enums.DictTypeConstants;  
6 -import jakarta.validation.constraints.Email;  
7 -import jakarta.validation.constraints.NotEmpty;  
8 -import jakarta.validation.constraints.Size;  
9 -import lombok.Data;  
10 -  
11 -import java.time.LocalDateTime;  
12 -  
13 -/**  
14 - * 客户创建 Create Req BO  
15 - *  
16 - * @author HUIHUI  
17 - */  
18 -@Data  
19 -public class CrmCustomerCreateReqBO {  
20 -  
21 - /**  
22 - * 客户名称  
23 - */  
24 - @NotEmpty(message = "客户名称不能为空")  
25 - private String name;  
26 - /**  
27 - * 跟进状态  
28 - */  
29 - private Boolean followUpStatus;  
30 - /**  
31 - * 锁定状态  
32 - */  
33 - private Boolean lockStatus;  
34 - /**  
35 - * 成交状态  
36 - */  
37 - private Boolean dealStatus;  
38 - /**  
39 - * 所属行业  
40 - *  
41 - * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_INDUSTRY}  
42 - */  
43 - private Integer industryId;  
44 - /**  
45 - * 客户等级  
46 - *  
47 - * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_LEVEL}  
48 - */  
49 - private Integer level;  
50 - /**  
51 - * 客户来源  
52 - *  
53 - * 对应字典 {@link DictTypeConstants#CRM_CUSTOMER_SOURCE}  
54 - */  
55 - private Integer source;  
56 -  
57 - /**  
58 - * 手机  
59 - */  
60 - @Mobile  
61 - private String mobile;  
62 - /**  
63 - * 电话  
64 - */  
65 - @Telephone  
66 - private String telephone;  
67 - /**  
68 - * QQ  
69 - */  
70 - private String qq;  
71 - /**  
72 - * wechat  
73 - */  
74 - private String wechat;  
75 -  
76 - /**  
77 - * 邮箱  
78 - */  
79 - @Email(message = "邮箱格式不正确")  
80 - private String email;  
81 -  
82 - /**  
83 - * 客户描述  
84 - */  
85 - @Size(max = 4096, message = "客户描述长度不能超过 4096 个字符")  
86 - private String description;  
87 - /**  
88 - * 备注  
89 - */  
90 - private String remark;  
91 - /**  
92 - * 负责人的用户编号  
93 - *  
94 - * 关联 AdminUserDO 的 id 字段  
95 - */  
96 - private Long ownerUserId;  
97 - /**  
98 - * 所在地  
99 - *  
100 - * 关联 {@link cn.iocoder.yudao.framework.ip.core.Area#getId()} 字段  
101 - */  
102 - private Integer areaId;  
103 - /**  
104 - * 详细地址  
105 - */  
106 - private String detailAddress;  
107 -  
108 - /**  
109 - * 最后跟进时间  
110 - */  
111 - private LocalDateTime contactLastTime;  
112 - /**  
113 - * 最后跟进内容  
114 - */  
115 - private String contactLastContent;  
116 - /**  
117 - * 下次联系时间  
118 - */  
119 - private LocalDateTime contactNextTime;  
120 -  
121 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/followup/CrmFollowUpRecordService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.followup;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.followup.vo.CrmFollowUpRecordPageReqVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.followup.vo.CrmFollowUpRecordSaveReqVO;  
6 -import cn.iocoder.yudao.module.crm.dal.dataobject.followup.CrmFollowUpRecordDO;  
7 -import cn.iocoder.yudao.module.crm.service.followup.bo.CrmFollowUpCreateReqBO;  
8 -import jakarta.validation.Valid;  
9 -  
10 -import java.util.Collection;  
11 -import java.util.List;  
12 -  
13 -/**  
14 - * 跟进记录 Service 接口  
15 - *  
16 - * @author 芋道源码  
17 - */  
18 -public interface CrmFollowUpRecordService {  
19 -  
20 - /**  
21 - * 创建跟进记录 (数据权限基于 bizType、 bizId)  
22 - *  
23 - * @param createReqVO 创建信息  
24 - * @return 编号  
25 - */  
26 - Long createFollowUpRecord(@Valid CrmFollowUpRecordSaveReqVO createReqVO);  
27 -  
28 - /**  
29 - * 创建更进  
30 - *  
31 - * @param list 请求  
32 - */  
33 - void createFollowUpRecordBatch(List<CrmFollowUpCreateReqBO> list);  
34 -  
35 - /**  
36 - * 删除跟进记录 (数据权限基于 bizType、 bizId)  
37 - *  
38 - * @param id 编号  
39 - * @param userId 用户编号  
40 - */  
41 - void deleteFollowUpRecord(Long id, Long userId);  
42 -  
43 - /**  
44 - * 删除跟进  
45 - *  
46 - * @param bizType 模块类型  
47 - * @param bizId 模块数据编号  
48 - */  
49 - void deleteFollowUpRecordByBiz(Integer bizType, Long bizId);  
50 -  
51 - /**  
52 - * 获得跟进记录  
53 - *  
54 - * @param id 编号  
55 - * @return 跟进记录  
56 - */  
57 - CrmFollowUpRecordDO getFollowUpRecord(Long id);  
58 -  
59 - /**  
60 - * 获得跟进记录分页 (数据权限基于 bizType、 bizId)  
61 - *  
62 - * @param pageReqVO 分页查询  
63 - * @return 跟进记录分页  
64 - */  
65 - PageResult<CrmFollowUpRecordDO> getFollowUpRecordPage(CrmFollowUpRecordPageReqVO pageReqVO);  
66 -  
67 - /**  
68 - * 获取跟进记录  
69 - *  
70 - * @param bizType 模块类型  
71 - * @param bizIds 模块数据编号  
72 - * @return 跟进列表  
73 - */  
74 - List<CrmFollowUpRecordDO> getFollowUpRecordByBiz(Integer bizType, Collection<Long> bizIds);  
75 -  
76 -}  
77 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/followup/bo/CrmFollowUpCreateReqBO.java deleted
1 -package cn.iocoder.yudao.module.crm.service.followup.bo;  
2 -  
3 -import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;  
4 -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;  
5 -import cn.iocoder.yudao.module.crm.enums.DictTypeConstants;  
6 -import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;  
7 -import jakarta.validation.constraints.NotEmpty;  
8 -import jakarta.validation.constraints.NotNull;  
9 -import lombok.Data;  
10 -  
11 -import java.time.LocalDateTime;  
12 -import java.util.List;  
13 -  
14 -/**  
15 - * 跟进信息 Create Req BO  
16 - *  
17 - * @author HUIHUI  
18 - */  
19 -@Data  
20 -public class CrmFollowUpCreateReqBO {  
21 -  
22 - /**  
23 - * 数据类型  
24 - *  
25 - * 枚举 {@link CrmBizTypeEnum}  
26 - */  
27 - @NotNull(message = "数据类型不能为空")  
28 - private Integer bizType;  
29 - /**  
30 - * 数据编号  
31 - *  
32 - * 关联 {@link CrmBizTypeEnum} 对应模块 DO 的 id 字段  
33 - */  
34 - @NotNull(message = "数据编号不能为空")  
35 - private Long bizId;  
36 -  
37 - /**  
38 - * 跟进类型  
39 - *  
40 - * 关联 {@link DictTypeConstants#CRM_FOLLOW_UP_TYPE} 字典  
41 - */  
42 - @NotNull(message = "跟进类型不能为空")  
43 - private Integer type;  
44 - /**  
45 - * 跟进内容  
46 - */  
47 - @NotEmpty(message = "跟进内容不能为空")  
48 - private String content;  
49 - /**  
50 - * 下次联系时间  
51 - */  
52 - @NotNull(message = "下次联系时间不能为空")  
53 - private LocalDateTime nextTime;  
54 -  
55 - /**  
56 - * 图片  
57 - */  
58 - private List<String> picUrls;  
59 - /**  
60 - * 附件  
61 - */  
62 - private List<String> fileUrls;  
63 -  
64 - /**  
65 - * 关联的商机编号数组  
66 - *  
67 - * 关联 {@link CrmBusinessDO#getId()}  
68 - */  
69 - private List<Long> businessIds;  
70 -  
71 - /**  
72 - * 关联的联系人编号数组  
73 - *  
74 - * 关联 {@link CrmContactDO#getId()}  
75 - */  
76 - private List<Long> contactIds;  
77 -  
78 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.permission;  
2 -  
3 -  
4 -import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionSaveReqVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO;  
6 -import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;  
7 -import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;  
8 -import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;  
9 -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;  
10 -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;  
11 -import jakarta.validation.Valid;  
12 -  
13 -import java.util.Collection;  
14 -import java.util.List;  
15 -  
16 -/**  
17 - * crm 数据权限 Service 接口  
18 - *  
19 - * @author HUIHUI  
20 - */  
21 -public interface CrmPermissionService {  
22 -  
23 - /**  
24 - * 创建数据权限  
25 - *  
26 - * @param reqVO 创建信息  
27 - * @param userId 用户编号  
28 - */  
29 - void createPermission(CrmPermissionSaveReqVO reqVO, Long userId);  
30 -  
31 - /**  
32 - * 创建数据权限  
33 - *  
34 - * @param createReqBO 创建信息  
35 - * @return 编号  
36 - */  
37 - Long createPermission(@Valid CrmPermissionCreateReqBO createReqBO);  
38 -  
39 - /**  
40 - * 创建数据权限  
41 - *  
42 - * @param createReqBOs 创建信息  
43 - */  
44 - void createPermissionBatch(@Valid List<CrmPermissionCreateReqBO> createReqBOs);  
45 -  
46 - /**  
47 - * 更新数据权限  
48 - *  
49 - * @param updateReqVO 更新信息  
50 - */  
51 - void updatePermission(CrmPermissionUpdateReqVO updateReqVO);  
52 -  
53 - /**  
54 - * 数据权限转移  
55 - *  
56 - * @param crmPermissionTransferReqBO 数据权限转移请求  
57 - */  
58 - void transferPermission(@Valid CrmPermissionTransferReqBO crmPermissionTransferReqBO);  
59 -  
60 - /**  
61 - * 删除数据权限  
62 - *  
63 - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}  
64 - * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()  
65 - * @param level 数据权限级别,关联 {@link CrmPermissionLevelEnum}  
66 - */  
67 - void deletePermission(Integer bizType, Long bizId, Integer level);  
68 -  
69 - /**  
70 - * 删除数据权限  
71 - *  
72 - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}  
73 - * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()  
74 - */  
75 - void deletePermission(Integer bizType, Long bizId);  
76 -  
77 - /**  
78 - * 批量删除数据权限  
79 - *  
80 - * @param ids 权限编号  
81 - * @param userId 用户编号  
82 - */  
83 - void deletePermissionBatch(Collection<Long> ids, Long userId);  
84 -  
85 - /**  
86 - * 删除指定用户数据权限  
87 - *  
88 - * @param id 权限编号  
89 - * @param userId 用户编号  
90 - */  
91 - void deleteSelfPermission(Long id, Long userId);  
92 -  
93 - /**  
94 - * 获取数据权限列表,通过 数据类型 x 某个数据  
95 - *  
96 - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}  
97 - * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()  
98 - * @return Crm 数据权限列表  
99 - */  
100 - List<CrmPermissionDO> getPermissionListByBiz(Integer bizType, Long bizId);  
101 -  
102 - /**  
103 - * 获取数据权限列表,通过 数据类型 x 某个数据  
104 - *  
105 - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}  
106 - * @param bizIds 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()  
107 - * @return Crm 数据权限列表  
108 - */  
109 - List<CrmPermissionDO> getPermissionListByBiz(Integer bizType, Collection<Long> bizIds);  
110 -  
111 - /**  
112 - * 获取用户参与的模块数据列表  
113 - *  
114 - * @param bizType 模块类型  
115 - * @param userId 用户编号  
116 - * @return 模块数据列表  
117 - */  
118 - List<CrmPermissionDO> getPermissionListByBizTypeAndUserId(Integer bizType, Long userId);  
119 -  
120 - /**  
121 - * 校验是否有指定数据的操作权限  
122 - *  
123 - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}  
124 - * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()  
125 - * @param userId 用户编号  
126 - * @param level 权限级别  
127 - * @return 是否有权限  
128 - */  
129 - boolean hasPermission(Integer bizType, Long bizId, Long userId, CrmPermissionLevelEnum level);  
130 -  
131 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionCreateReqBO.java deleted
1 -package cn.iocoder.yudao.module.crm.service.permission.bo;  
2 -  
3 -import cn.iocoder.yudao.framework.common.validation.InEnum;  
4 -import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;  
5 -import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;  
6 -import lombok.Data;  
7 -  
8 -import jakarta.validation.constraints.NotNull;  
9 -  
10 -/**  
11 - * crm 数据权限 Create Req BO  
12 - *  
13 - * @author HUIHUI  
14 - */  
15 -@Data  
16 -public class CrmPermissionCreateReqBO {  
17 -  
18 - /**  
19 - * 当前登录用户编号  
20 - */  
21 - @NotNull(message = "用户编号不能为空")  
22 - private Long userId;  
23 -  
24 - /**  
25 - * Crm 类型  
26 - */  
27 - @NotNull(message = "Crm 类型不能为空")  
28 - @InEnum(CrmBizTypeEnum.class)  
29 - private Integer bizType;  
30 - /**  
31 - * 数据编号  
32 - */  
33 - @NotNull(message = "Crm 数据编号不能为空")  
34 - private Long bizId;  
35 -  
36 - /**  
37 - * 权限级别  
38 - */  
39 - @NotNull(message = "权限级别不能为空")  
40 - @InEnum(CrmPermissionLevelEnum.class)  
41 - private Integer level;  
42 -  
43 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionTransferReqBO.java deleted
1 -package cn.iocoder.yudao.module.crm.service.permission.bo;  
2 -  
3 -import cn.iocoder.yudao.framework.common.validation.InEnum;  
4 -import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;  
5 -import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;  
6 -import lombok.AllArgsConstructor;  
7 -import lombok.Data;  
8 -  
9 -import jakarta.validation.constraints.NotNull;  
10 -import lombok.NoArgsConstructor;  
11 -  
12 -/**  
13 - * 数据权限转移 Request BO  
14 - *  
15 - * @author HUIHUI  
16 - */  
17 -@Data  
18 -@NoArgsConstructor  
19 -@AllArgsConstructor  
20 -public class CrmPermissionTransferReqBO {  
21 -  
22 - /**  
23 - * 当前登录用户编号  
24 - */  
25 - @NotNull(message = "用户编号不能为空")  
26 - private Long userId;  
27 -  
28 - /**  
29 - * CRM 类型  
30 - */  
31 - @NotNull(message = "Crm 类型不能为空")  
32 - @InEnum(CrmBizTypeEnum.class)  
33 - private Integer bizType;  
34 - /**  
35 - * 数据编号  
36 - */  
37 - @NotNull(message = "CRM 数据编号不能为空")  
38 - private Long bizId;  
39 -  
40 - /**  
41 - * 新负责人的用户编号  
42 - */  
43 - @NotNull(message = "新负责人的用户编号不能为空")  
44 - private Long newOwnerUserId;  
45 -  
46 - /**  
47 - * 老负责人加入团队后的权限级别。如果 null 说明移除  
48 - *  
49 - * 关联 {@link CrmPermissionLevelEnum}  
50 - */  
51 - private Integer oldOwnerPermissionLevel;  
52 -  
53 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductCategoryService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.product;  
2 -  
3 -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.category.CrmProductCategoryCreateReqVO;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.category.CrmProductCategoryListReqVO;  
5 -import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;  
6 -import jakarta.validation.Valid;  
7 -  
8 -import java.util.Collection;  
9 -import java.util.List;  
10 -import java.util.Map;  
11 -  
12 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
13 -  
14 -/**  
15 - * CRM 产品分类 Service 接口  
16 - *  
17 - * @author ZanGe丶  
18 - */  
19 -public interface CrmProductCategoryService {  
20 -  
21 - /**  
22 - * 创建产品分类  
23 - *  
24 - * @param createReqVO 创建信息  
25 - * @return 编号  
26 - */  
27 - Long createProductCategory(@Valid CrmProductCategoryCreateReqVO createReqVO);  
28 -  
29 - /**  
30 - * 更新产品分类  
31 - *  
32 - * @param updateReqVO 更新信息  
33 - */  
34 - void updateProductCategory(@Valid CrmProductCategoryCreateReqVO updateReqVO);  
35 -  
36 - /**  
37 - * 删除产品分类  
38 - *  
39 - * @param id 编号  
40 - */  
41 - void deleteProductCategory(Long id);  
42 -  
43 - /**  
44 - * 获得产品分类  
45 - *  
46 - * @param id 编号  
47 - * @return 产品分类  
48 - */  
49 - CrmProductCategoryDO getProductCategory(Long id);  
50 -  
51 - /**  
52 - * 获得产品分类列表  
53 - *  
54 - * @param listReqVO 列表请求  
55 - * @return 产品分类列表  
56 - */  
57 - List<CrmProductCategoryDO> getProductCategoryList(CrmProductCategoryListReqVO listReqVO);  
58 -  
59 - /**  
60 - * 获得产品分类列表  
61 - *  
62 - * @param ids 编号数组  
63 - * @return 产品分类列表  
64 - */  
65 - List<CrmProductCategoryDO> getProductCategoryList(Collection<Long> ids);  
66 -  
67 - /**  
68 - * 获得产品分类 Map  
69 - *  
70 - * @param ids 编号数组  
71 - * @return 产品分类 Map  
72 - */  
73 - default Map<Long, CrmProductCategoryDO> getProductCategoryMap(Collection<Long> ids) {  
74 - return convertMap(getProductCategoryList(ids), CrmProductCategoryDO::getId);  
75 - }  
76 -  
77 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductCategoryServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.crm.service.product;  
2 -  
3 -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.category.CrmProductCategoryCreateReqVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.category.CrmProductCategoryListReqVO;  
6 -import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;  
7 -import cn.iocoder.yudao.module.crm.dal.mysql.product.CrmProductCategoryMapper;  
8 -import com.mzt.logapi.context.LogRecordContext;  
9 -import com.mzt.logapi.starter.annotation.LogRecord;  
10 -import jakarta.annotation.Resource;  
11 -import org.springframework.context.annotation.Lazy;  
12 -import org.springframework.stereotype.Service;  
13 -import org.springframework.validation.annotation.Validated;  
14 -  
15 -import java.util.Collection;  
16 -import java.util.List;  
17 -import java.util.Objects;  
18 -  
19 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
20 -import static cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO.PARENT_ID_NULL;  
21 -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;  
22 -import static cn.iocoder.yudao.module.crm.enums.LogRecordConstants.*;  
23 -  
24 -/**  
25 - * CRM 产品分类 Service 实现类  
26 - *  
27 - * @author ZanGe丶  
28 - */  
29 -@Service  
30 -@Validated  
31 -public class CrmProductCategoryServiceImpl implements CrmProductCategoryService {  
32 -  
33 - @Resource(name = "crmProductCategoryMapper")  
34 - private CrmProductCategoryMapper productCategoryMapper;  
35 -  
36 - @Resource  
37 - @Lazy // 延迟加载,解决循环依赖问题  
38 - private CrmProductService crmProductService;  
39 -  
40 - @Override  
41 - @LogRecord(type = CRM_PRODUCT_CATEGORY_TYPE, subType = CRM_PRODUCT_CATEGORY_CREATE_SUB_TYPE, bizNo = "{{#productCategoryId}}",  
42 - success = CRM_PRODUCT_CATEGORY_CREATE_SUCCESS)  
43 - public Long createProductCategory(CrmProductCategoryCreateReqVO createReqVO) {  
44 - // 1.1 校验父分类存在  
45 - validateParentProductCategory(createReqVO.getParentId());  
46 - // 1.2 分类名称是否存在  
47 - validateProductNameExists(null, createReqVO.getParentId(), createReqVO.getName());  
48 -  
49 - // 2. 插入分类  
50 - CrmProductCategoryDO category = BeanUtils.toBean(createReqVO, CrmProductCategoryDO.class);  
51 - productCategoryMapper.insert(category);  
52 -  
53 - // 3. 记录操作日志上下文  
54 - LogRecordContext.putVariable("productCategoryId", category.getId());  
55 - return category.getId();  
56 - }  
57 -  
58 - @Override  
59 - @LogRecord(type = CRM_PRODUCT_CATEGORY_TYPE, subType = CRM_PRODUCT_CATEGORY_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}",  
60 - success = CRM_PRODUCT_CATEGORY_UPDATE_SUCCESS)  
61 - public void updateProductCategory(CrmProductCategoryCreateReqVO updateReqVO) {  
62 - // 1.1 校验存在  
63 - validateProductCategoryExists(updateReqVO.getId());  
64 - // 1.2 校验父分类存在  
65 - validateParentProductCategory(updateReqVO.getParentId());  
66 - // 1.3 分类名称是否存在  
67 - validateProductNameExists(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName());  
68 -  
69 - // 2. 更新分类  
70 - CrmProductCategoryDO updateObj = BeanUtils.toBean(updateReqVO, CrmProductCategoryDO.class);  
71 - productCategoryMapper.updateById(updateObj);  
72 - }  
73 -  
74 - private void validateProductCategoryExists(Long id) {  
75 - if (productCategoryMapper.selectById(id) == null) {  
76 - throw exception(PRODUCT_CATEGORY_NOT_EXISTS);  
77 - }  
78 - }  
79 -  
80 - private void validateParentProductCategory(Long id) {  
81 - // 如果是根分类,无需验证  
82 - if (Objects.equals(id, PARENT_ID_NULL)) {  
83 - return;  
84 - }  
85 - // 父分类不存在  
86 - CrmProductCategoryDO category = productCategoryMapper.selectById(id);  
87 - if (category == null) {  
88 - throw exception(PRODUCT_CATEGORY_PARENT_NOT_EXISTS);  
89 - }  
90 - // 父分类不能是二级分类  
91 - if (!Objects.equals(category.getParentId(), PARENT_ID_NULL)) {  
92 - throw exception(PRODUCT_CATEGORY_PARENT_NOT_FIRST_LEVEL);  
93 - }  
94 - }  
95 -  
96 - private void validateProductNameExists(Long id, Long parentId, String name) {  
97 - CrmProductCategoryDO category = productCategoryMapper.selectByParentIdAndName(parentId, name);  
98 - if (category == null  
99 - || category.getId().equals(id)) {  
100 - return;  
101 - }  
102 - throw exception(PRODUCT_CATEGORY_EXISTS);  
103 - }  
104 -  
105 - @Override  
106 - @LogRecord(type = CRM_PRODUCT_CATEGORY_TYPE, subType = CRM_PRODUCT_CATEGORY_DELETE_SUB_TYPE, bizNo = "{{#id}}",  
107 - success = CRM_PRODUCT_CATEGORY_DELETE_SUCCESS)  
108 - public void deleteProductCategory(Long id) {  
109 - // 1.1 校验存在  
110 - validateProductCategoryExists(id);  
111 - // 1.2 校验是否还有子分类  
112 - if (productCategoryMapper.selectCountByParentId(id) > 0) {  
113 - throw exception(PRODUCT_CATEGORY_EXISTS_CHILDREN);  
114 - }  
115 - // 1.3 校验是否被产品使用  
116 - if (crmProductService.getProductByCategoryId(id) > 0) {  
117 - throw exception(PRODUCT_CATEGORY_USED);  
118 - }  
119 - // 2. 删除  
120 - productCategoryMapper.deleteById(id);  
121 - }  
122 -  
123 - @Override  
124 - public CrmProductCategoryDO getProductCategory(Long id) {  
125 - return productCategoryMapper.selectById(id);  
126 - }  
127 -  
128 - @Override  
129 - public List<CrmProductCategoryDO> getProductCategoryList(CrmProductCategoryListReqVO listReqVO) {  
130 - return productCategoryMapper.selectList(listReqVO);  
131 - }  
132 -  
133 - @Override  
134 - public List<CrmProductCategoryDO> getProductCategoryList(Collection<Long> ids) {  
135 - return productCategoryMapper.selectBatchIds(ids);  
136 - }  
137 -  
138 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.product;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductSaveReqVO;  
6 -import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;  
7 -import jakarta.validation.Valid;  
8 -  
9 -import java.util.Collection;  
10 -import java.util.List;  
11 -import java.util.Map;  
12 -  
13 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
14 -  
15 -/**  
16 - * CRM 产品 Service 接口  
17 - *  
18 - * @author ZanGe丶  
19 - */  
20 -public interface CrmProductService {  
21 -  
22 - /**  
23 - * 创建产品  
24 - *  
25 - * @param createReqVO 创建信息  
26 - * @return 编号  
27 - */  
28 - Long createProduct(@Valid CrmProductSaveReqVO createReqVO);  
29 -  
30 - /**  
31 - * 更新产品  
32 - *  
33 - * @param updateReqVO 更新信息  
34 - */  
35 - void updateProduct(@Valid CrmProductSaveReqVO updateReqVO);  
36 -  
37 - /**  
38 - * 删除产品  
39 - *  
40 - * @param id 编号  
41 - */  
42 - void deleteProduct(Long id);  
43 -  
44 - /**  
45 - * 获得产品  
46 - *  
47 - * @param id 编号  
48 - * @return 产品  
49 - */  
50 - CrmProductDO getProduct(Long id);  
51 -  
52 - /**  
53 - * 获得产品列表  
54 - *  
55 - * @param ids 编号  
56 - * @return 产品列表  
57 - */  
58 - List<CrmProductDO> getProductList(Collection<Long> ids);  
59 -  
60 - /**  
61 - * 获得产品 Map  
62 - *  
63 - * @param ids 编号  
64 - * @return 产品 Map  
65 - */  
66 - default Map<Long, CrmProductDO> getProductMap(Collection<Long> ids) {  
67 - return convertMap(getProductList(ids), CrmProductDO::getId);  
68 - }  
69 -  
70 - /**  
71 - * 获得产品分页  
72 - *  
73 - * @param pageReqVO 分页查询  
74 - * @return 产品分页  
75 - */  
76 - PageResult<CrmProductDO> getProductPage(CrmProductPageReqVO pageReqVO);  
77 -  
78 - /**  
79 - * 获得产品数量  
80 - *  
81 - * @param categoryId 分类编号  
82 - * @return 产品  
83 - */  
84 - Long getProductByCategoryId(Long categoryId);  
85 -  
86 - /**  
87 - * 获得指定状态的产品列表  
88 - *  
89 - * @param status 状态  
90 - * @return 产品列表  
91 - */  
92 - List<CrmProductDO> getProductListByStatus(Integer status);  
93 -  
94 - /**  
95 - * 校验产品们的有效性  
96 - *  
97 - * @param ids 编号数组  
98 - * @return 产品列表  
99 - */  
100 - List<CrmProductDO> validProductList(Collection<Long> ids);  
101 -  
102 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivablePlanService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.receivable;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan.CrmReceivablePlanPageReqVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan.CrmReceivablePlanSaveReqVO;  
6 -import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;  
7 -import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivablePlanDO;  
8 -import jakarta.validation.Valid;  
9 -  
10 -import java.util.Collection;  
11 -import java.util.List;  
12 -  
13 -/**  
14 - * CRM 回款计划 Service 接口  
15 - *  
16 - * @author 芋道源码  
17 - */  
18 -public interface CrmReceivablePlanService {  
19 -  
20 - /**  
21 - * 创建回款计划  
22 - *  
23 - * @param createReqVO 创建信息  
24 - * @return 编号  
25 - */  
26 - Long createReceivablePlan(@Valid CrmReceivablePlanSaveReqVO createReqVO);  
27 -  
28 - /**  
29 - * 更新回款计划  
30 - *  
31 - * @param updateReqVO 更新信息  
32 - */  
33 - void updateReceivablePlan(@Valid CrmReceivablePlanSaveReqVO updateReqVO);  
34 -  
35 - /**  
36 - * 更新回款计划关联的回款编号  
37 - *  
38 - * @param id 编号  
39 - * @param receivableId 回款编号  
40 - */  
41 - void updateReceivablePlanReceivableId(Long id, Long receivableId);  
42 -  
43 - /**  
44 - * 删除回款计划  
45 - *  
46 - * @param id 编号  
47 - */  
48 - void deleteReceivablePlan(Long id);  
49 -  
50 - /**  
51 - * 获得回款计划  
52 - *  
53 - * @param id 编号  
54 - * @return 回款计划  
55 - */  
56 - CrmReceivablePlanDO getReceivablePlan(Long id);  
57 -  
58 - /**  
59 - * 获得回款计划列表  
60 - *  
61 - * @param ids 编号  
62 - * @return 回款计划列表  
63 - */  
64 - List<CrmReceivablePlanDO> getReceivablePlanList(Collection<Long> ids);  
65 -  
66 - /**  
67 - * 获得回款计划分页  
68 - *  
69 - * 数据权限:基于 {@link CrmReceivablePlanDO} 读取  
70 - *  
71 - * @param pageReqVO 分页查询  
72 - * @param userId 用户编号  
73 - * @return 回款计划分页  
74 - */  
75 - PageResult<CrmReceivablePlanDO> getReceivablePlanPage(CrmReceivablePlanPageReqVO pageReqVO, Long userId);  
76 -  
77 - /**  
78 - * 获得回款计划分页,基于指定客户  
79 - *  
80 - * 数据权限:基于 {@link CrmCustomerDO} 读取  
81 - *  
82 - * @param pageReqVO 分页查询  
83 - * @return 回款计划分页  
84 - */  
85 - PageResult<CrmReceivablePlanDO> getReceivablePlanPageByCustomerId(CrmReceivablePlanPageReqVO pageReqVO);  
86 -  
87 - /**  
88 - * 获得待回款提醒数量  
89 - *  
90 - * @param userId 用户编号  
91 - * @return 提醒数量  
92 - */  
93 - Long getReceivablePlanRemindCount(Long userId);  
94 -  
95 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.receivable;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivablePageReqVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableSaveReqVO;  
6 -import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;  
7 -import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO;  
8 -import jakarta.validation.Valid;  
9 -  
10 -import java.math.BigDecimal;  
11 -import java.util.Collection;  
12 -import java.util.List;  
13 -import java.util.Map;  
14 -  
15 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
16 -  
17 -/**  
18 - * CRM 回款 Service 接口  
19 - *  
20 - * @author 赤焰  
21 - */  
22 -public interface CrmReceivableService {  
23 -  
24 - /**  
25 - * 创建回款  
26 - *  
27 - * @param createReqVO 创建信息  
28 - * @return 编号  
29 - */  
30 - Long createReceivable(@Valid CrmReceivableSaveReqVO createReqVO);  
31 -  
32 - /**  
33 - * 更新回款  
34 - *  
35 - * @param updateReqVO 更新信息  
36 - */  
37 - void updateReceivable(@Valid CrmReceivableSaveReqVO updateReqVO);  
38 -  
39 - /**  
40 - * 更新回款流程审批结果  
41 - *  
42 - * @param id 回款编号  
43 - * @param bpmResult BPM 审批结果  
44 - */  
45 - void updateReceivableAuditStatus(Long id, Integer bpmResult);  
46 -  
47 - /**  
48 - * 删除回款  
49 - *  
50 - * @param id 编号  
51 - */  
52 - void deleteReceivable(Long id);  
53 -  
54 - /**  
55 - * 发起回款审批流程  
56 - *  
57 - * @param id 回款编号  
58 - * @param userId 用户编号  
59 - */  
60 - void submitReceivable(Long id, Long userId);  
61 -  
62 - /**  
63 - * 获得回款  
64 - *  
65 - * @param id 编号  
66 - * @return 回款  
67 - */  
68 - CrmReceivableDO getReceivable(Long id);  
69 -  
70 - /**  
71 - * 获得回款列表  
72 - *  
73 - * @param ids 编号  
74 - * @return 回款列表  
75 - */  
76 - List<CrmReceivableDO> getReceivableList(Collection<Long> ids);  
77 -  
78 - /**  
79 - * 获得回款 Map  
80 - *  
81 - * @param ids 编号  
82 - * @return 回款 Map  
83 - */  
84 - default Map<Long, CrmReceivableDO> getReceivableMap(Collection<Long> ids) {  
85 - return convertMap(getReceivableList(ids), CrmReceivableDO::getId);  
86 - }  
87 -  
88 - /**  
89 - * 获得回款分页  
90 - *  
91 - * 数据权限:基于 {@link CrmReceivableDO} 读取  
92 - *  
93 - * @param pageReqVO 分页查询  
94 - * @param userId 用户编号  
95 - * @return 回款分页  
96 - */  
97 - PageResult<CrmReceivableDO> getReceivablePage(CrmReceivablePageReqVO pageReqVO, Long userId);  
98 -  
99 - /**  
100 - * 获得回款分页,基于指定客户  
101 - *  
102 - * 数据权限:基于 {@link CrmCustomerDO} 读取  
103 - *  
104 - * @param pageReqVO 分页查询  
105 - * @return 回款分页  
106 - */  
107 - PageResult<CrmReceivableDO> getReceivablePageByCustomerId(CrmReceivablePageReqVO pageReqVO);  
108 -  
109 - /**  
110 - * 获得待审核回款数量  
111 - *  
112 - * @param userId 用户编号  
113 - * @return 待审批数量  
114 - */  
115 - Long getAuditReceivableCount(Long userId);  
116 -  
117 - /**  
118 - * 获得合同已回款金额 Map  
119 - *  
120 - * @param contractIds 合同编号  
121 - * @return 回款金额 Map  
122 - */  
123 - Map<Long, BigDecimal> getReceivablePriceMapByContractId(Collection<Long> contractIds);  
124 -  
125 - /**  
126 - * 根据合同编号查询回款数量  
127 - *  
128 - * @param contractId 合同编号  
129 - * @return 回款数量  
130 - */  
131 - Long getReceivableCountByContractId(Long contractId);  
132 -  
133 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/listener/CrmReceivableStatusListener.java deleted
1 -package cn.iocoder.yudao.module.crm.service.receivable.listener;  
2 -  
3 -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;  
4 -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEventListener;  
5 -import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService;  
6 -import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableServiceImpl;  
7 -import jakarta.annotation.Resource;  
8 -import org.springframework.stereotype.Component;  
9 -  
10 -/**  
11 - * 回款审批的结果的监听器实现类  
12 - *  
13 - * @author HUIHUI  
14 - */  
15 -@Component  
16 -public class CrmReceivableStatusListener extends BpmProcessInstanceStatusEventListener {  
17 -  
18 - @Resource  
19 - private CrmReceivableService receivableService;  
20 -  
21 - @Override  
22 - public String getProcessDefinitionKey() {  
23 - return CrmReceivableServiceImpl.BPM_PROCESS_DEFINITION_KEY;  
24 - }  
25 -  
26 - @Override  
27 - public void onEvent(BpmProcessInstanceStatusEvent event) {  
28 - receivableService.updateReceivableAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus());  
29 - }  
30 -  
31 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsCustomerService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.statistics;  
2 -  
3 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.*;  
4 -  
5 -import java.util.List;  
6 -  
7 -/**  
8 - * CRM 客户分析 Service 接口  
9 - *  
10 - * @author dhb52  
11 - */  
12 -public interface CrmStatisticsCustomerService {  
13 -  
14 - /**  
15 - * 总量分析(按日期)  
16 - *  
17 - * @param reqVO 请求参数  
18 - * @return 统计数据  
19 - */  
20 - List<CrmStatisticsCustomerSummaryByDateRespVO> getCustomerSummaryByDate(CrmStatisticsCustomerReqVO reqVO);  
21 -  
22 - /**  
23 - * 总量分析(按用户)  
24 - *  
25 - * @param reqVO 请求参数  
26 - * @return 统计数据  
27 - */  
28 - List<CrmStatisticsCustomerSummaryByUserRespVO> getCustomerSummaryByUser(CrmStatisticsCustomerReqVO reqVO);  
29 -  
30 - /**  
31 - * 跟进次数分析(按日期)  
32 - *  
33 - * @param reqVO 请求参数  
34 - * @return 统计数据  
35 - */  
36 - List<CrmStatisticsFollowUpSummaryByDateRespVO> getFollowUpSummaryByDate(CrmStatisticsCustomerReqVO reqVO);  
37 -  
38 - /**  
39 - * 跟进次数分析(按用户)  
40 - *  
41 - * @param reqVO 请求参数  
42 - * @return 统计数据  
43 - */  
44 - List<CrmStatisticsFollowUpSummaryByUserRespVO> getFollowUpSummaryByUser(CrmStatisticsCustomerReqVO reqVO);  
45 -  
46 - /**  
47 - * 客户跟进次数分析(按类型)  
48 - *  
49 - * @param reqVO 请求参数  
50 - * @return 统计数据  
51 - */  
52 - List<CrmStatisticsFollowUpSummaryByTypeRespVO> getFollowUpSummaryByType(CrmStatisticsCustomerReqVO reqVO);  
53 -  
54 - /**  
55 - * 获取客户的首次合同、回款信息列表,用于【客户转化率】页面  
56 - *  
57 - * @param reqVO 请求参数  
58 - * @return 统计数据  
59 - */  
60 - List<CrmStatisticsCustomerContractSummaryRespVO> getContractSummary(CrmStatisticsCustomerReqVO reqVO);  
61 -  
62 - /**  
63 - * 公海客户分析(按日期)  
64 - *  
65 - * @param reqVO 请求参数  
66 - * @return 统计数据  
67 - */  
68 - List<CrmStatisticsPoolSummaryByDateRespVO> getPoolSummaryByDate(CrmStatisticsCustomerReqVO reqVO);  
69 -  
70 - /**  
71 - * 公海客户分析(按用户)  
72 - *  
73 - * @param reqVO 请求参数  
74 - * @return 统计数据  
75 - */  
76 - List<CrmStatisticsPoolSummaryByUserRespVO> getPoolSummaryByUser(CrmStatisticsCustomerReqVO reqVO);  
77 -  
78 - /**  
79 - * 客户成交周期(按日期)  
80 - *  
81 - * 成交周期的定义:客户 customer 在创建出来,到合同 contract 第一次成交的时间差  
82 - *  
83 - * @param reqVO 请求参数  
84 - * @return 统计数据  
85 - */  
86 - List<CrmStatisticsCustomerDealCycleByDateRespVO> getCustomerDealCycleByDate(CrmStatisticsCustomerReqVO reqVO);  
87 -  
88 - /**  
89 - * 客户成交周期(按用户)  
90 - *  
91 - * @param reqVO 请求参数  
92 - * @return 统计数据  
93 - */  
94 - List<CrmStatisticsCustomerDealCycleByUserRespVO> getCustomerDealCycleByUser(CrmStatisticsCustomerReqVO reqVO);  
95 -  
96 - /**  
97 - * 客户成交周期(按区域)  
98 - *  
99 - * @param reqVO 请求参数  
100 - * @return 统计数据  
101 - */  
102 - List<CrmStatisticsCustomerDealCycleByAreaRespVO> getCustomerDealCycleByArea(CrmStatisticsCustomerReqVO reqVO);  
103 -  
104 - /**  
105 - * 客户成交周期(按产品)  
106 - *  
107 - * @param reqVO 请求参数  
108 - * @return 统计数据  
109 - */  
110 - List<CrmStatisticsCustomerDealCycleByProductRespVO> getCustomerDealCycleByProduct(CrmStatisticsCustomerReqVO reqVO);  
111 -  
112 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsFunnelService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.statistics;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.*;  
5 -import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;  
6 -  
7 -import java.util.List;  
8 -  
9 -/**  
10 - * CRM 销售漏斗分析 Service  
11 - *  
12 - * @author HUIHUI  
13 - */  
14 -public interface CrmStatisticsFunnelService {  
15 -  
16 - /**  
17 - * 获得销售漏斗数据  
18 - *  
19 - * @param reqVO 请求  
20 - * @return 销售漏斗数据  
21 - */  
22 - CrmStatisticFunnelSummaryRespVO getFunnelSummary(CrmStatisticsFunnelReqVO reqVO);  
23 -  
24 - /**  
25 - * 获得商机结束状态统计  
26 - *  
27 - * @param reqVO 请求  
28 - * @return 商机结束状态统计  
29 - */  
30 - List<CrmStatisticsBusinessSummaryByEndStatusRespVO> getBusinessSummaryByEndStatus(CrmStatisticsFunnelReqVO reqVO);  
31 -  
32 - /**  
33 - * 获取新增商机分析(按日期)  
34 - *  
35 - * @param reqVO 请求  
36 - * @return 新增商机分析  
37 - */  
38 - List<CrmStatisticsBusinessSummaryByDateRespVO> getBusinessSummaryByDate(CrmStatisticsFunnelReqVO reqVO);  
39 -  
40 - /**  
41 - * 获得商机转化率分析(按日期)  
42 - *  
43 - * @param reqVO 请求  
44 - * @return 商机转化率分析  
45 - */  
46 - List<CrmStatisticsBusinessInversionRateSummaryByDateRespVO> getBusinessInversionRateSummaryByDate(CrmStatisticsFunnelReqVO reqVO);  
47 -  
48 - /**  
49 - * 获得商机分页(按日期)  
50 - *  
51 - * @param pageVO 请求  
52 - * @return 商机分页  
53 - */  
54 - PageResult<CrmBusinessDO> getBusinessPageByDate(CrmStatisticsFunnelReqVO pageVO);  
55 -  
56 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPerformanceService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.statistics;  
2 -  
3 -  
4 -  
5 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO;  
6 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO;  
7 -  
8 -import java.util.List;  
9 -  
10 -/**  
11 - * CRM 员工绩效统计 Service 接口  
12 - *  
13 - * @author scholar  
14 - */  
15 -public interface CrmStatisticsPerformanceService {  
16 -  
17 - /**  
18 - * 员工签约合同数量分析  
19 - *  
20 - * @param performanceReqVO 排行参数  
21 - * @return 员工签约合同数量排行分析  
22 - */  
23 - List<CrmStatisticsPerformanceRespVO> getContractCountPerformance(CrmStatisticsPerformanceReqVO performanceReqVO);  
24 -  
25 - /**  
26 - * 员工签约合同金额分析  
27 - *  
28 - * @param performanceReqVO 排行参数  
29 - * @return 员工签约合同金额分析  
30 - */  
31 - List<CrmStatisticsPerformanceRespVO> getContractPricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO);  
32 -  
33 - /**  
34 - * 员工获得回款金额分析  
35 - *  
36 - * @param performanceReqVO 排行参数  
37 - * @return 员工获得回款金额分析  
38 - */  
39 - List<CrmStatisticsPerformanceRespVO> getReceivablePricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO);  
40 -  
41 -  
42 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPerformanceServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.crm.service.statistics;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.core.collection.ListUtil;  
5 -import cn.hutool.core.util.ObjUtil;  
6 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO;  
7 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO;  
8 -import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsPerformanceMapper;  
9 -import cn.iocoder.yudao.module.system.api.dept.DeptApi;  
10 -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;  
11 -import cn.iocoder.yudao.module.system.api.user.AdminUserApi;  
12 -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;  
13 -import jakarta.annotation.Resource;  
14 -import org.springframework.stereotype.Service;  
15 -import org.springframework.validation.annotation.Validated;  
16 -  
17 -import java.math.BigDecimal;  
18 -import java.util.ArrayList;  
19 -import java.util.Collections;  
20 -import java.util.List;  
21 -import java.util.Map;  
22 -import java.util.function.Function;  
23 -  
24 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;  
25 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
26 -  
27 -/**  
28 - * CRM 员工业绩分析 Service 实现类  
29 - *  
30 - * @author scholar  
31 - */  
32 -@Service  
33 -@Validated  
34 -public class CrmStatisticsPerformanceServiceImpl implements CrmStatisticsPerformanceService {  
35 -  
36 - @Resource  
37 - private CrmStatisticsPerformanceMapper performanceMapper;  
38 -  
39 - @Resource  
40 - private AdminUserApi adminUserApi;  
41 - @Resource  
42 - private DeptApi deptApi;  
43 -  
44 - @Override  
45 - public List<CrmStatisticsPerformanceRespVO> getContractCountPerformance(CrmStatisticsPerformanceReqVO performanceReqVO) {  
46 - return getPerformance(performanceReqVO, performanceMapper::selectContractCountPerformance);  
47 - }  
48 -  
49 - @Override  
50 - public List<CrmStatisticsPerformanceRespVO> getContractPricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO) {  
51 - return getPerformance(performanceReqVO, performanceMapper::selectContractPricePerformance);  
52 - }  
53 -  
54 - @Override  
55 - public List<CrmStatisticsPerformanceRespVO> getReceivablePricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO) {  
56 - return getPerformance(performanceReqVO, performanceMapper::selectReceivablePricePerformance);  
57 - }  
58 -  
59 - /**  
60 - * 获得员工业绩数据  
61 - *  
62 - * 1. 获得今年 + 去年的数据  
63 - * 2. 遍历今年的月份,逐个拼接去年的月份数据  
64 - *  
65 - * @param performanceReqVO 参数  
66 - * @param performanceFunction 员工业绩统计方法  
67 - * @return 员工业绩数据  
68 - */  
69 - private List<CrmStatisticsPerformanceRespVO> getPerformance(CrmStatisticsPerformanceReqVO performanceReqVO,  
70 - Function<CrmStatisticsPerformanceReqVO, List<CrmStatisticsPerformanceRespVO>> performanceFunction) {  
71 -  
72 - // 1. 获得用户编号数组  
73 - List<Long> userIds = getUserIds(performanceReqVO);  
74 - if (CollUtil.isEmpty(userIds)) {  
75 - return Collections.emptyList();  
76 - }  
77 - performanceReqVO.setUserIds(userIds);  
78 -  
79 - // 2. 获得业绩数据  
80 - int year = performanceReqVO.getTimes()[0].getYear(); // 获取查询的年份  
81 - performanceReqVO.getTimes()[0] = performanceReqVO.getTimes()[0].minusYears(1);  
82 - List<CrmStatisticsPerformanceRespVO> performanceList = performanceFunction.apply(performanceReqVO);  
83 - Map<String, BigDecimal> performanceMap = convertMap(performanceList, CrmStatisticsPerformanceRespVO::getTime,  
84 - CrmStatisticsPerformanceRespVO::getCurrentMonthCount);  
85 -  
86 - // 3. 组装数据返回  
87 - List<CrmStatisticsPerformanceRespVO> result = new ArrayList<>();  
88 - for (int month = 1; month <= 12; month++) {  
89 - String currentMonth = String.format("%d%02d", year, month);  
90 - String lastMonth = month == 1 ? String.format("%d%02d", year - 1, 12) : String.format("%d%02d", year, month - 1);  
91 - String lastYear = String.format("%d%02d", year - 1, month);  
92 - result.add(new CrmStatisticsPerformanceRespVO().setTime(currentMonth)  
93 - .setCurrentMonthCount(performanceMap.getOrDefault(currentMonth, BigDecimal.ZERO))  
94 - .setLastMonthCount(performanceMap.getOrDefault(lastMonth, BigDecimal.ZERO))  
95 - .setLastYearCount(performanceMap.getOrDefault(lastYear, BigDecimal.ZERO)));  
96 - }  
97 - return result;  
98 - }  
99 -  
100 - /**  
101 - * 获取用户编号数组。如果用户编号为空, 则获得部门下的用户编号数组,包括子部门的所有用户编号  
102 - *  
103 - * @param reqVO 请求参数  
104 - * @return 用户编号数组  
105 - */  
106 - private List<Long> getUserIds(CrmStatisticsPerformanceReqVO reqVO) {  
107 - // 情况一:选中某个用户  
108 - if (ObjUtil.isNotNull(reqVO.getUserId())) {  
109 - return ListUtil.of(reqVO.getUserId());  
110 - }  
111 - // 情况二:选中某个部门  
112 - // 2.1 获得部门列表  
113 - final Long deptId = reqVO.getDeptId();  
114 - List<Long> deptIds = convertList(deptApi.getChildDeptList(deptId), DeptRespDTO::getId);  
115 - deptIds.add(deptId);  
116 - // 2.2 获得用户编号  
117 - return convertList(adminUserApi.getUserListByDeptIds(deptIds), AdminUserRespDTO::getId);  
118 - }  
119 -  
120 -}  
121 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.statistics;  
2 -  
3 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.*;  
4 -  
5 -import java.util.List;  
6 -  
7 -/**  
8 - * CRM 客户画像 Service 接口  
9 - *  
10 - * @author HUIHUI  
11 - */  
12 -public interface CrmStatisticsPortraitService {  
13 -  
14 - /**  
15 - * 获取客户地区统计数据  
16 - *  
17 - * @param reqVO 请求参数  
18 - * @return 统计数据  
19 - */  
20 - List<CrmStatisticCustomerAreaRespVO> getCustomerSummaryByArea(CrmStatisticsPortraitReqVO reqVO);  
21 -  
22 - /**  
23 - * 获取客户行业统计数据  
24 - *  
25 - * @param reqVO 请求参数  
26 - * @return 统计数据  
27 - */  
28 - List<CrmStatisticCustomerIndustryRespVO> getCustomerSummaryByIndustry(CrmStatisticsPortraitReqVO reqVO);  
29 -  
30 - /**  
31 - * 获取客户级别统计数据  
32 - *  
33 - * @param reqVO 请求参数  
34 - * @return 统计数据  
35 - */  
36 - List<CrmStatisticCustomerLevelRespVO> getCustomerSummaryByLevel(CrmStatisticsPortraitReqVO reqVO);  
37 -  
38 - /**  
39 - * 获取客户来源统计数据  
40 - *  
41 - * @param reqVO 请求参数  
42 - * @return 统计数据  
43 - */  
44 - List<CrmStatisticCustomerSourceRespVO> getCustomerSummaryBySource(CrmStatisticsPortraitReqVO reqVO);  
45 -  
46 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.crm.service.statistics;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.core.collection.ListUtil;  
5 -import cn.hutool.core.util.ObjUtil;  
6 -import cn.iocoder.yudao.framework.ip.core.Area;  
7 -import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum;  
8 -import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;  
9 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.*;  
10 -import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsPortraitMapper;  
11 -import cn.iocoder.yudao.module.system.api.dept.DeptApi;  
12 -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;  
13 -import cn.iocoder.yudao.module.system.api.user.AdminUserApi;  
14 -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;  
15 -import jakarta.annotation.Resource;  
16 -import org.springframework.stereotype.Service;  
17 -  
18 -import java.util.Collections;  
19 -import java.util.List;  
20 -import java.util.Map;  
21 -  
22 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;  
23 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
24 -  
25 -/**  
26 - * CRM 客户画像 Service 实现类  
27 - *  
28 - * @author HUIHUI  
29 - */  
30 -@Service  
31 -public class CrmStatisticsPortraitServiceImpl implements CrmStatisticsPortraitService {  
32 -  
33 - @Resource  
34 - private CrmStatisticsPortraitMapper portraitMapper;  
35 -  
36 - @Resource  
37 - private AdminUserApi adminUserApi;  
38 - @Resource  
39 - private DeptApi deptApi;  
40 -  
41 - @Override  
42 - public List<CrmStatisticCustomerAreaRespVO> getCustomerSummaryByArea(CrmStatisticsPortraitReqVO reqVO) {  
43 - // 1. 获得用户编号数组  
44 - List<Long> userIds = getUserIds(reqVO);  
45 - if (CollUtil.isEmpty(userIds)) {  
46 - return Collections.emptyList();  
47 - }  
48 - reqVO.setUserIds(userIds);  
49 -  
50 - // 2. 获取客户地区统计数据  
51 - List<CrmStatisticCustomerAreaRespVO> list = portraitMapper.selectSummaryListGroupByAreaId(reqVO);  
52 - if (CollUtil.isEmpty(list)) {  
53 - return Collections.emptyList();  
54 - }  
55 -  
56 - // 3. 拼接数据  
57 - List<Area> areaList = AreaUtils.getByType(AreaTypeEnum.PROVINCE, area -> area);  
58 - Map<Integer, Area> areaMap = convertMap(areaList, Area::getId);  
59 - return convertList(list, item -> {  
60 - Integer parentId = AreaUtils.getParentIdByType(item.getAreaId(), AreaTypeEnum.PROVINCE);  
61 - if (parentId != null) {  
62 - Area area = areaMap.get(parentId);  
63 - if (area != null) {  
64 - item.setAreaId(parentId).setAreaName(area.getName());  
65 - return item;  
66 - }  
67 - }  
68 - // 找不到,归到未知  
69 - return item.setAreaId(null).setAreaName("未知");  
70 - });  
71 - }  
72 -  
73 - @Override  
74 - public List<CrmStatisticCustomerIndustryRespVO> getCustomerSummaryByIndustry(CrmStatisticsPortraitReqVO reqVO) {  
75 - // 1. 获得用户编号数组  
76 - List<Long> userIds = getUserIds(reqVO);  
77 - if (CollUtil.isEmpty(userIds)) {  
78 - return Collections.emptyList();  
79 - }  
80 - reqVO.setUserIds(userIds);  
81 -  
82 - // 2. 获取客户行业统计数据  
83 - return portraitMapper.selectCustomerIndustryListGroupByIndustryId(reqVO);  
84 - }  
85 -  
86 - @Override  
87 - public List<CrmStatisticCustomerSourceRespVO> getCustomerSummaryBySource(CrmStatisticsPortraitReqVO reqVO) {  
88 - // 1. 获得用户编号数组  
89 - List<Long> userIds = getUserIds(reqVO);  
90 - if (CollUtil.isEmpty(userIds)) {  
91 - return Collections.emptyList();  
92 - }  
93 - reqVO.setUserIds(userIds);  
94 -  
95 - // 2. 获取客户行业统计数据  
96 - return portraitMapper.selectCustomerSourceListGroupBySource(reqVO);  
97 - }  
98 -  
99 - @Override  
100 - public List<CrmStatisticCustomerLevelRespVO> getCustomerSummaryByLevel(CrmStatisticsPortraitReqVO reqVO) {  
101 - // 1. 获得用户编号数组  
102 - List<Long> userIds = getUserIds(reqVO);  
103 - if (CollUtil.isEmpty(userIds)) {  
104 - return Collections.emptyList();  
105 - }  
106 - reqVO.setUserIds(userIds);  
107 -  
108 - // 2. 获取客户级别统计数据  
109 - return portraitMapper.selectCustomerLevelListGroupByLevel(reqVO);  
110 - }  
111 -  
112 - /**  
113 - * 获取用户编号数组。如果用户编号为空, 则获得部门下的用户编号数组,包括子部门的所有用户编号  
114 - *  
115 - * @param reqVO 请求参数  
116 - * @return 用户编号数组  
117 - */  
118 - private List<Long> getUserIds(CrmStatisticsPortraitReqVO reqVO) {  
119 - // 情况一:选中某个用户  
120 - if (ObjUtil.isNotNull(reqVO.getUserId())) {  
121 - return ListUtil.of(reqVO.getUserId());  
122 - }  
123 - // 情况二:选中某个部门  
124 - // 2.1 获得部门列表  
125 - List<Long> deptIds = convertList(deptApi.getChildDeptList(reqVO.getDeptId()), DeptRespDTO::getId);  
126 - deptIds.add(reqVO.getDeptId());  
127 - // 2.2 获得用户编号  
128 - return convertList(adminUserApi.getUserListByDeptIds(deptIds), AdminUserRespDTO::getId);  
129 - }  
130 -  
131 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsRankService.java deleted
1 -package cn.iocoder.yudao.module.crm.service.statistics;  
2 -  
3 -  
4 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankReqVO;  
6 -  
7 -import java.util.List;  
8 -  
9 -/**  
10 - * CRM 排行榜统计 Service 接口  
11 - *  
12 - * @author anhaohao  
13 - */  
14 -public interface CrmStatisticsRankService {  
15 -  
16 - /**  
17 - * 获得合同金额排行榜  
18 - *  
19 - * @param rankReqVO 排行参数  
20 - * @return 合同金额排行榜  
21 - */  
22 - List<CrmStatisticsRankRespVO> getContractPriceRank(CrmStatisticsRankReqVO rankReqVO);  
23 -  
24 - /**  
25 - * 获得回款金额排行榜  
26 - *  
27 - * @param rankReqVO 排行参数  
28 - * @return 回款金额排行榜  
29 - */  
30 - List<CrmStatisticsRankRespVO> getReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO);  
31 -  
32 - /**  
33 - * 获得签约合同数量排行榜  
34 - *  
35 - * @param rankReqVO 排行参数  
36 - * @return 签约合同数量排行榜  
37 - */  
38 - List<CrmStatisticsRankRespVO> getContractCountRank(CrmStatisticsRankReqVO rankReqVO);  
39 -  
40 - /**  
41 - * 获得产品销量排行榜  
42 - *  
43 - * @param rankReqVO 排行参数  
44 - * @return 产品销量排行榜  
45 - */  
46 - List<CrmStatisticsRankRespVO> getProductSalesRank(CrmStatisticsRankReqVO rankReqVO);  
47 -  
48 - /**  
49 - * 获得新增客户数排行榜  
50 - *  
51 - * @param rankReqVO 排行参数  
52 - * @return 新增客户数排行榜  
53 - */  
54 - List<CrmStatisticsRankRespVO> getCustomerCountRank(CrmStatisticsRankReqVO rankReqVO);  
55 -  
56 - /**  
57 - * 获得联系人数量排行榜  
58 - *  
59 - * @param rankReqVO 排行参数  
60 - * @return 联系人数量排行榜  
61 - */  
62 - List<CrmStatisticsRankRespVO> getContactsCountRank(CrmStatisticsRankReqVO rankReqVO);  
63 -  
64 - /**  
65 - * 获得跟进次数排行榜  
66 - *  
67 - * @param rankReqVO 排行参数  
68 - * @return 跟进次数排行榜  
69 - */  
70 - List<CrmStatisticsRankRespVO> getFollowCountRank(CrmStatisticsRankReqVO rankReqVO);  
71 -  
72 - /**  
73 - * 获得跟进客户数排行榜  
74 - *  
75 - * @param rankReqVO 排行参数  
76 - * @return 跟进客户数排行榜  
77 - */  
78 - List<CrmStatisticsRankRespVO> getFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO);  
79 -  
80 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsRankServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.crm.service.statistics;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.iocoder.yudao.framework.common.util.collection.MapUtils;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankReqVO;  
6 -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO;  
7 -import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsRankMapper;  
8 -import cn.iocoder.yudao.module.system.api.dept.DeptApi;  
9 -import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;  
10 -import cn.iocoder.yudao.module.system.api.user.AdminUserApi;  
11 -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;  
12 -import jakarta.annotation.Resource;  
13 -import org.springframework.stereotype.Service;  
14 -import org.springframework.validation.annotation.Validated;  
15 -  
16 -import java.util.Collections;  
17 -import java.util.Comparator;  
18 -import java.util.List;  
19 -import java.util.Map;  
20 -import java.util.function.Function;  
21 -  
22 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;  
23 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;  
24 -  
25 -/**  
26 - * CRM 排行榜统计 Service 实现类  
27 - *  
28 - * @author anhaohao  
29 - */  
30 -@Service  
31 -@Validated  
32 -public class CrmStatisticsRankServiceImpl implements CrmStatisticsRankService {  
33 -  
34 - @Resource  
35 - private CrmStatisticsRankMapper rankMapper;  
36 -  
37 - @Resource  
38 - private AdminUserApi adminUserApi;  
39 - @Resource  
40 - private DeptApi deptApi;  
41 -  
42 - @Override  
43 - public List<CrmStatisticsRankRespVO> getContractPriceRank(CrmStatisticsRankReqVO rankReqVO) {  
44 - return getRank(rankReqVO, rankMapper::selectContractPriceRank);  
45 - }  
46 -  
47 - @Override  
48 - public List<CrmStatisticsRankRespVO> getReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO) {  
49 - return getRank(rankReqVO, rankMapper::selectReceivablePriceRank);  
50 - }  
51 -  
52 - @Override  
53 - public List<CrmStatisticsRankRespVO> getContractCountRank(CrmStatisticsRankReqVO rankReqVO) {  
54 - return getRank(rankReqVO, rankMapper::selectContractCountRank);  
55 - }  
56 -  
57 - @Override  
58 - public List<CrmStatisticsRankRespVO> getProductSalesRank(CrmStatisticsRankReqVO rankReqVO) {  
59 - return getRank(rankReqVO, rankMapper::selectProductSalesRank);  
60 - }  
61 -  
62 - @Override  
63 - public List<CrmStatisticsRankRespVO> getCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) {  
64 - return getRank(rankReqVO, rankMapper::selectCustomerCountRank);  
65 - }  
66 -  
67 - @Override  
68 - public List<CrmStatisticsRankRespVO> getContactsCountRank(CrmStatisticsRankReqVO rankReqVO) {  
69 - return getRank(rankReqVO, rankMapper::selectContactsCountRank);  
70 - }  
71 -  
72 - @Override  
73 - public List<CrmStatisticsRankRespVO> getFollowCountRank(CrmStatisticsRankReqVO rankReqVO) {  
74 - return getRank(rankReqVO, rankMapper::selectFollowCountRank);  
75 - }  
76 -  
77 - @Override  
78 - public List<CrmStatisticsRankRespVO> getFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) {  
79 - return getRank(rankReqVO, rankMapper::selectFollowCustomerCountRank);  
80 - }  
81 -  
82 - /**  
83 - * 获得排行版数据  
84 - *  
85 - * @param rankReqVO 参数  
86 - * @param rankFunction 排行榜方法  
87 - * @return 排行版数据  
88 - */  
89 - private List<CrmStatisticsRankRespVO> getRank(CrmStatisticsRankReqVO rankReqVO, Function<CrmStatisticsRankReqVO, List<CrmStatisticsRankRespVO>> rankFunction) {  
90 - // 1. 获得用户编号数组  
91 - rankReqVO.setUserIds(getUserIds(rankReqVO.getDeptId()));  
92 - if (CollUtil.isEmpty(rankReqVO.getUserIds())) {  
93 - return Collections.emptyList();  
94 - }  
95 - // 2. 获得排行数据  
96 - List<CrmStatisticsRankRespVO> ranks = rankFunction.apply(rankReqVO);  
97 - if (CollUtil.isEmpty(ranks)) {  
98 - return Collections.emptyList();  
99 - }  
100 - ranks.sort(Comparator.comparing(CrmStatisticsRankRespVO::getCount).reversed());  
101 - // 3. 拼接用户信息  
102 - appendUserInfo(ranks);  
103 - return ranks;  
104 - }  
105 -  
106 - /**  
107 - * 拼接用户信息(昵称、部门)  
108 - *  
109 - * @param ranks 排行榜数据  
110 - */  
111 - private void appendUserInfo(List<CrmStatisticsRankRespVO> ranks) {  
112 - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSet(ranks, CrmStatisticsRankRespVO::getOwnerUserId));  
113 - Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId));  
114 - ranks.forEach(rank -> MapUtils.findAndThen(userMap, rank.getOwnerUserId(), user -> {  
115 - rank.setNickname(user.getNickname());  
116 - MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> rank.setDeptName(dept.getName()));  
117 - }));  
118 - }  
119 -  
120 - /**  
121 - * 获得部门下的用户编号数组,包括子部门的  
122 - *  
123 - * @param deptId 部门编号  
124 - * @return 用户编号数组  
125 - */  
126 - public List<Long> getUserIds(Long deptId) {  
127 - // 1. 获得部门列表  
128 - List<Long> deptIds = convertList(deptApi.getChildDeptList(deptId), DeptRespDTO::getId);  
129 - deptIds.add(deptId);  
130 - // 2. 获得用户编号  
131 - return convertList(adminUserApi.getUserListByDeptIds(deptIds), AdminUserRespDTO::getId);  
132 - }  
133 -  
134 -}  
135 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmAuditStatusUtils.java deleted
1 -package cn.iocoder.yudao.module.crm.util;  
2 -  
3 -import cn.hutool.core.lang.Assert;  
4 -import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;  
5 -import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;  
6 -  
7 -/**  
8 - * CRM 流程工具类  
9 - *  
10 - * @author HUIHUI  
11 - */  
12 -public class CrmAuditStatusUtils {  
13 -  
14 - /**  
15 - * BPM 审批结果转换  
16 - *  
17 - * @param bpmResult BPM 审批结果  
18 - */  
19 - public static Integer convertBpmResultToAuditStatus(Integer bpmResult) {  
20 - Integer auditStatus = BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult) ? CrmAuditStatusEnum.APPROVE.getStatus()  
21 - : BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult) ? CrmAuditStatusEnum.REJECT.getStatus()  
22 - : BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult) ? BpmTaskStatusEnum.CANCEL.getStatus() : null;  
23 - Assert.notNull(auditStatus, "BPM 审批结果({}) 转换失败", bpmResult);  
24 - return auditStatus;  
25 - }  
26 -  
27 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java deleted
1 -package cn.iocoder.yudao.module.crm.util;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.extra.spring.SpringUtil;  
5 -import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;  
6 -import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;  
7 -import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;  
8 -import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;  
9 -import cn.iocoder.yudao.module.system.api.permission.PermissionApi;  
10 -import cn.iocoder.yudao.module.system.api.user.AdminUserApi;  
11 -import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;  
12 -import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;  
13 -import com.baomidou.mybatisplus.core.toolkit.support.SFunction;  
14 -import com.github.yulichang.autoconfigure.MybatisPlusJoinProperties;  
15 -import com.github.yulichang.wrapper.MPJLambdaWrapper;  
16 -  
17 -import java.util.List;  
18 -  
19 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;  
20 -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;  
21 -  
22 -/**  
23 - * 数据权限工具类  
24 - *  
25 - * @author HUIHUI  
26 - */  
27 -public class CrmPermissionUtils {  
28 -  
29 - /**  
30 - * 校验用户是否是 CRM 管理员  
31 - *  
32 - * @return 是/否  
33 - */  
34 - public static boolean isCrmAdmin() {  
35 - PermissionApi permissionApi = SpringUtil.getBean(PermissionApi.class);  
36 - return permissionApi.hasAnyRoles(getLoginUserId(), RoleCodeEnum.CRM_ADMIN.getCode());  
37 - }  
38 -  
39 - /**  
40 - * 构造 CRM 数据类型数据【分页】查询条件  
41 - *  
42 - * @param query 连表查询对象  
43 - * @param bizType 数据类型 {@link CrmBizTypeEnum}  
44 - * @param bizId 数据编号  
45 - * @param userId 用户编号  
46 - * @param sceneType 场景类型  
47 - */  
48 - public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId,  
49 - Long userId, Integer sceneType) {  
50 - MybatisPlusJoinProperties mybatisPlusJoinProperties = SpringUtil.getBean(MybatisPlusJoinProperties.class);  
51 - final String ownerUserIdField = mybatisPlusJoinProperties.getTableAlias() + ".owner_user_id";  
52 - // 场景一:我负责的数据  
53 - if (CrmSceneTypeEnum.isOwner(sceneType)) {  
54 - query.eq(ownerUserIdField, userId);  
55 - }  
56 - // 场景二:我参与的数据(我有读或写权限,并且不是负责人)  
57 - if (CrmSceneTypeEnum.isInvolved(sceneType)) {  
58 - if (CrmPermissionUtils.isCrmAdmin()) { // 特殊逻辑:如果是超管,直接查询所有,不过滤数据权限  
59 - return;  
60 - }  
61 - query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType)  
62 - .eq(CrmPermissionDO::getBizId, bizId)  
63 - .in(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel(), CrmPermissionLevelEnum.WRITE.getLevel())  
64 - .eq(CrmPermissionDO::getUserId,userId));  
65 - query.ne(ownerUserIdField, userId);  
66 - }  
67 - // 场景三:下属负责的数据(下属是负责人)  
68 - if (CrmSceneTypeEnum.isSubordinate(sceneType)) {  
69 - AdminUserApi adminUserApi = SpringUtil.getBean(AdminUserApi.class);  
70 - List<AdminUserRespDTO> subordinateUsers = adminUserApi.getUserListBySubordinate(userId);  
71 - if (CollUtil.isEmpty(subordinateUsers)) {  
72 - query.eq(ownerUserIdField, -1); // 不返回任何结果  
73 - } else {  
74 - query.in(ownerUserIdField, convertSet(subordinateUsers, AdminUserRespDTO::getId));  
75 - }  
76 - }  
77 - }  
78 -  
79 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsFunnelMapper.xml deleted
1 -<?xml version="1.0" encoding="UTF-8"?>  
2 -<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
3 -<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsFunnelMapper">  
4 -  
5 - <select id="selectCustomerCountByDate" resultType="java.lang.Long">  
6 - SELECT  
7 - COUNT(*)  
8 - FROM crm_customer  
9 - WHERE deleted = 0  
10 - AND owner_user_id IN  
11 - <!-- TODO @puhui999:这个 foreach 搞个缩进哈 - -->  
12 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
13 - #{userId}  
14 - </foreach>  
15 - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND  
16 - <!-- TODO @puhui999:下面这个,就不缩进啦 - -->  
17 - #{times[1],javaType=java.time.LocalDateTime}  
18 - </select>  
19 -  
20 - <select id="selectBusinessCountByDateAndEndStatus" resultType="java.lang.Long">  
21 - SELECT  
22 - COUNT(*)  
23 - FROM crm_business  
24 - WHERE deleted = 0  
25 - <if test="status != null">  
26 - AND end_status = #{status}  
27 - </if>  
28 - AND owner_user_id IN  
29 - <foreach collection="reqVO.userIds" item="userId" open="(" close=")" separator=",">  
30 - #{userId}  
31 - </foreach>  
32 - AND create_time BETWEEN #{reqVO.times[0],javaType=java.time.LocalDateTime} AND  
33 - #{reqVO.times[1],javaType=java.time.LocalDateTime}  
34 - </select>  
35 -  
36 - <select id="selectBusinessSummaryListGroupByEndStatus"  
37 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByEndStatusRespVO">  
38 - SELECT  
39 - end_status AS endStatus,  
40 - COUNT(*) AS businessCount,  
41 - SUM(total_price) AS totalPrice  
42 - FROM crm_business  
43 - WHERE deleted = 0 AND end_status IS NOT NULL  
44 - AND owner_user_id IN  
45 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
46 - #{userId}  
47 - </foreach>  
48 - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND  
49 - #{times[1],javaType=java.time.LocalDateTime}  
50 - GROUP BY end_status  
51 - </select>  
52 -  
53 - <select id="selectBusinessSummaryGroupByDate"  
54 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByDateRespVO">  
55 - SELECT  
56 - DATE_FORMAT(create_time, '%Y-%m-%d') AS time,  
57 - COUNT(*) AS businessCreateCount,  
58 - SUM(total_price) AS totalPrice  
59 - FROM crm_business  
60 - WHERE deleted = 0  
61 - AND owner_user_id IN  
62 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
63 - #{userId}  
64 - </foreach>  
65 - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND  
66 - #{times[1],javaType=java.time.LocalDateTime}  
67 - GROUP BY time  
68 - </select>  
69 -  
70 - <select id="selectBusinessInversionRateSummaryByDate"  
71 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessInversionRateSummaryByDateRespVO">  
72 - SELECT  
73 - DATE_FORMAT(create_time, '%Y-%m-%d') AS time,  
74 - COUNT(*) AS businessCount,  
75 - SUM(IF(end_status = 1, 1, 0)) AS businessWinCount  
76 - FROM crm_business  
77 - WHERE deleted = 0  
78 - AND owner_user_id IN  
79 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
80 - #{userId}  
81 - </foreach>  
82 - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND  
83 - #{times[1],javaType=java.time.LocalDateTime}  
84 - GROUP BY time  
85 - </select>  
86 -  
87 -</mapper>  
yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsPerformanceMapper.xml deleted
1 -<?xml version="1.0" encoding="UTF-8"?>  
2 -<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
3 -<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsPerformanceMapper">  
4 -  
5 - <select id="selectContractCountPerformance"  
6 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO">  
7 - SELECT  
8 - DATE_FORMAT(order_date, '%Y%m') AS time,  
9 - COUNT(1) AS currentMonthCount  
10 - FROM crm_contract  
11 - WHERE deleted = 0  
12 - AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}  
13 - AND owner_user_id in  
14 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
15 - #{userId}  
16 - </foreach>  
17 - AND order_date between #{times[0],javaType=java.time.LocalDateTime} and  
18 - #{times[1],javaType=java.time.LocalDateTime}  
19 - GROUP BY time  
20 - </select>  
21 -  
22 - <select id="selectContractPricePerformance"  
23 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO">  
24 - SELECT  
25 - DATE_FORMAT(order_date, '%Y%m') AS time,  
26 - IFNULL(SUM(total_price), 0) AS currentMonthCount  
27 - FROM crm_contract  
28 - WHERE deleted = 0  
29 - AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}  
30 - AND owner_user_id in  
31 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
32 - #{userId}  
33 - </foreach>  
34 - AND order_date between #{times[0],javaType=java.time.LocalDateTime} and  
35 - #{times[1],javaType=java.time.LocalDateTime}  
36 - GROUP BY time  
37 - </select>  
38 -  
39 - <select id="selectReceivablePricePerformance"  
40 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO">  
41 - SELECT  
42 - DATE_FORMAT(return_time, '%Y%m') AS time,  
43 - IFNULL(SUM(price), 0) AS currentMonthCount  
44 - FROM crm_receivable  
45 - WHERE deleted = 0  
46 - AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}  
47 - AND owner_user_id in  
48 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
49 - #{userId}  
50 - </foreach>  
51 - AND return_time between #{times[0],javaType=java.time.LocalDateTime} and  
52 - #{times[1],javaType=java.time.LocalDateTime}  
53 - GROUP BY time  
54 - </select>  
55 -  
56 -</mapper>  
yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsPortraitMapper.xml deleted
1 -<?xml version="1.0" encoding="UTF-8"?>  
2 -<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
3 -<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsPortraitMapper">  
4 -  
5 - <select id="selectSummaryListGroupByAreaId"  
6 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerAreaRespVO">  
7 - SELECT area_id, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount  
8 - FROM crm_customer  
9 - WHERE deleted = 0 AND area_id IS NOT NULL  
10 - AND owner_user_id IN  
11 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
12 - #{userId}  
13 - </foreach>  
14 - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime}  
15 - AND #{times[1],javaType=java.time.LocalDateTime}  
16 - GROUP BY area_id  
17 - </select>  
18 -  
19 - <select id="selectCustomerIndustryListGroupByIndustryId"  
20 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerIndustryRespVO">  
21 - SELECT industry_id, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount  
22 - FROM crm_customer  
23 - WHERE deleted = 0 AND industry_id IS NOT NULL  
24 - AND owner_user_id IN  
25 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
26 - #{userId}  
27 - </foreach>  
28 - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime}  
29 - AND #{times[1],javaType=java.time.LocalDateTime}  
30 - GROUP BY industry_id  
31 - </select>  
32 -  
33 - <select id="selectCustomerSourceListGroupBySource"  
34 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerSourceRespVO">  
35 - SELECT source, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount  
36 - FROM crm_customer  
37 - WHERE deleted = 0 AND source IS NOT NULL  
38 - AND owner_user_id IN  
39 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
40 - #{userId}  
41 - </foreach>  
42 - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime}  
43 - AND #{times[1],javaType=java.time.LocalDateTime}  
44 - GROUP BY source  
45 - </select>  
46 -  
47 - <select id="selectCustomerLevelListGroupByLevel"  
48 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerLevelRespVO">  
49 - SELECT level, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount  
50 - FROM crm_customer  
51 - WHERE deleted = 0 AND level IS NOT NULL  
52 - AND owner_user_id IN  
53 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
54 - #{userId}  
55 - </foreach>  
56 - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime}  
57 - AND #{times[1],javaType=java.time.LocalDateTime}  
58 - GROUP BY level  
59 - </select>  
60 -  
61 -</mapper>  
yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsRankMapper.xml deleted
1 -<?xml version="1.0" encoding="UTF-8"?>  
2 -<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
3 -<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsRankMapper">  
4 -  
5 - <select id="selectContractPriceRank"  
6 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">  
7 - SELECT IFNULL(SUM(total_price), 0) AS count, owner_user_id  
8 - FROM crm_contract  
9 - WHERE deleted = 0  
10 - AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}  
11 - and owner_user_id in  
12 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
13 - #{userId}  
14 - </foreach>  
15 - AND order_date between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}  
16 - GROUP BY owner_user_id  
17 - </select>  
18 -  
19 - <select id="selectReceivablePriceRank"  
20 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">  
21 - SELECT IFNULL(SUM(price), 0) AS count, owner_user_id  
22 - FROM crm_receivable  
23 - WHERE deleted = 0  
24 - AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}  
25 - AND owner_user_id in  
26 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
27 - #{userId}  
28 - </foreach>  
29 - AND return_time between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}  
30 - GROUP BY owner_user_id  
31 - </select>  
32 -  
33 - <select id="selectContractCountRank"  
34 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">  
35 - SELECT COUNT(1) AS count, owner_user_id  
36 - FROM crm_contract  
37 - WHERE deleted = 0  
38 - AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}  
39 - AND owner_user_id in  
40 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
41 - #{userId}  
42 - </foreach>  
43 - AND order_date between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}  
44 - GROUP BY owner_user_id  
45 - </select>  
46 -  
47 - <select id="selectProductSalesRank"  
48 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">  
49 - SELECT COUNT(product.count) AS count, contract.owner_user_id  
50 - FROM crm_contract_product product  
51 - INNER JOIN crm_contract contract ON product.contract_id = contract.id  
52 - WHERE contract.deleted = 0 AND contract.deleted = 0  
53 - AND contract.audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}  
54 - AND contract.owner_user_id in  
55 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
56 - #{userId}  
57 - </foreach>  
58 - AND contract.order_date between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}  
59 - GROUP BY contract.owner_user_id  
60 - </select>  
61 -  
62 - <select id="selectCustomerCountRank"  
63 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">  
64 - SELECT COUNT(1) AS count, owner_user_id  
65 - FROM crm_customer  
66 - WHERE deleted = 0  
67 - AND owner_user_id in  
68 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
69 - #{userId}  
70 - </foreach>  
71 - AND create_time between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}  
72 - GROUP BY owner_user_id  
73 - </select>  
74 -  
75 - <select id="selectContactsCountRank"  
76 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">  
77 - SELECT COUNT(1) AS count, owner_user_id  
78 - FROM crm_contact  
79 - WHERE deleted = 0  
80 - AND owner_user_id in  
81 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
82 - #{userId}  
83 - </foreach>  
84 - AND create_time between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}  
85 - GROUP BY owner_user_id  
86 - </select>  
87 -  
88 - <select id="selectFollowCountRank"  
89 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">  
90 - SELECT COUNT(1) AS count, cc.owner_user_id  
91 - FROM crm_follow_up_record AS cfur  
92 - LEFT JOIN crm_contact AS cc ON FIND_IN_SET(cc.id, cfur.contact_ids)  
93 - WHERE cfur.deleted = 0  
94 - AND cc.deleted = 0  
95 - AND cc.owner_user_id in  
96 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
97 - #{userId}  
98 - </foreach>  
99 - AND cfur.create_time between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}  
100 - GROUP BY cc.owner_user_id  
101 - </select>  
102 -  
103 - <select id="selectFollowCustomerCountRank"  
104 - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO">  
105 - SELECT COUNT(DISTINCT cc.id) AS count, cc.owner_user_id  
106 - FROM crm_follow_up_record AS cfur  
107 - LEFT JOIN crm_contact AS cc ON FIND_IN_SET(cc.id, cfur.contact_ids)  
108 - WHERE cfur.deleted = 0  
109 - AND cc.deleted = 0  
110 - AND cc.owner_user_id in  
111 - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">  
112 - #{userId}  
113 - </foreach>  
114 - AND cfur.create_time between #{times[0],javaType=java.time.LocalDateTime} and #{times[1],javaType=java.time.LocalDateTime}  
115 - GROUP BY cc.owner_user_id  
116 - </select>  
117 -  
118 -</mapper>  
yudao-module-crm/yudao-module-crm-biz/src/test/resources/application-unit-test.yaml deleted
1 -spring:  
2 - main:  
3 - lazy-initialization: true # 开启懒加载,加快速度  
4 - banner-mode: off # 单元测试,禁用 Banner  
5 -  
6 ---- #################### 数据库相关配置 ####################  
7 -  
8 -spring:  
9 - # 数据源配置项  
10 - datasource:  
11 - name: ruoyi-vue-pro  
12 - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写  
13 - driver-class-name: org.h2.Driver  
14 - username: sa  
15 - password:  
16 - druid:  
17 - async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度  
18 - initial-size: 1 # 单元测试,配置为 1,提升启动速度  
19 - sql:  
20 - init:  
21 - schema-locations: classpath:/sql/create_tables.sql  
22 -  
23 - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优  
24 - data:  
25 - redis:  
26 - host: 127.0.0.1 # 地址  
27 - port: 16379 # 端口(单元测试,使用 16379 端口)  
28 - database: 0 # 数据库索引  
29 -  
30 -mybatis-plus:  
31 - lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试  
32 - type-aliases-package: ${yudao.info.base-package}.module.*.dal.dataobject  
33 -  
34 ---- #################### 定时任务相关配置 ####################  
35 -  
36 ---- #################### 配置中心相关配置 ####################  
37 -  
38 ---- #################### 服务保障相关配置 ####################  
39 -  
40 -# Lock4j 配置项(单元测试,禁用 Lock4j)  
41 -  
42 ---- #################### 监控相关配置 ####################  
43 -  
44 ---- #################### 芋道相关配置 ####################  
45 -  
46 -# 芋道配置项,设置当前项目所有自定义的配置  
47 -yudao:  
48 - info:  
49 - base-package: cn.iocoder.yudao  
yudao-server/pom.xml
@@ -46,11 +46,11 @@ @@ -46,11 +46,11 @@
46 <!-- <version>${revision}</version>--> 46 <!-- <version>${revision}</version>-->
47 <!-- </dependency>--> 47 <!-- </dependency>-->
48 <!-- 工作流。默认注释,保证编译速度 --> 48 <!-- 工作流。默认注释,保证编译速度 -->
49 -<!-- <dependency>-->  
50 -<!-- <groupId>cn.iocoder.boot</groupId>-->  
51 -<!-- <artifactId>yudao-module-bpm-biz</artifactId>-->  
52 -<!-- <version>${revision}</version>-->  
53 -<!-- </dependency>--> 49 + <dependency>
  50 + <groupId>cn.iocoder.boot</groupId>
  51 + <artifactId>yudao-module-bpm</artifactId>
  52 + <version>${revision}</version>
  53 + </dependency>
54 <!-- 支付服务。默认注释,保证编译速度 --> 54 <!-- 支付服务。默认注释,保证编译速度 -->
55 <!-- <dependency>--> 55 <!-- <dependency>-->
56 <!-- <groupId>cn.iocoder.boot</groupId>--> 56 <!-- <groupId>cn.iocoder.boot</groupId>-->
@@ -90,7 +90,7 @@ @@ -90,7 +90,7 @@
90 <!-- CRM 相关模块。默认注释,保证编译速度 --> 90 <!-- CRM 相关模块。默认注释,保证编译速度 -->
91 <!-- <dependency>--> 91 <!-- <dependency>-->
92 <!-- <groupId>cn.iocoder.boot</groupId>--> 92 <!-- <groupId>cn.iocoder.boot</groupId>-->
93 -<!-- <artifactId>yudao-module-crm-biz</artifactId>--> 93 +<!-- <artifactId>yudao-module-crm</artifactId>-->
94 <!-- <version>${revision}</version>--> 94 <!-- <version>${revision}</version>-->
95 <!-- </dependency>--> 95 <!-- </dependency>-->
96 96