Commit 44c22e1ef549a61a659f6f005766b9463c4e1c5e

Authored by dhb52
1 parent d2f48eb2

wip: 增加公海客户分析(mapper模拟数据)

yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.http
1 # == 1. 客户总量分析 == 1 # == 1. 客户总量分析 ==
2 -### 1.1 客户总量分析(按日)  
3 -GET {{baseUrl}}/crm/statistics-customer/get-customer-summary-by-date?deptId=100&interval=1&times[0]=2024-01-01 00:00:00&times[1]=2024-01-29 23:59:59 2 +### 1.1 客户总量分析(按日期)
  3 +GET {{baseUrl}}/crm/statistics-customer/get-customer-summary-by-date?deptId=100&interval=2&times[0]=2024-01-01 00:00:00&times[1]=2024-01-29 23:59:59
4 Authorization: Bearer {{token}} 4 Authorization: Bearer {{token}}
5 tenant-id: {{adminTenentId}} 5 tenant-id: {{adminTenentId}}
6 6
7 -### 1.2 客户总量分析(按月)  
8 -GET {{baseUrl}}/crm/statistics-customer/get-customer-summary-by-date?deptId=100&intervalType=11&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59  
9 -Authorization: Bearer {{token}}  
10 -tenant-id: {{adminTenentId}}  
11 -  
12 -### 1.3 客户总量统计(按用户)  
13 -GET {{baseUrl}}/crm/statistics-customer/get-customer-summary-by-user?deptId=100&intervalType=11&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59 7 +### 1.2 客户总量统计(按用户)
  8 +GET {{baseUrl}}/crm/statistics-customer/get-customer-summary-by-user?deptId=100&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59
14 Authorization: Bearer {{token}} 9 Authorization: Bearer {{token}}
15 tenant-id: {{adminTenentId}} 10 tenant-id: {{adminTenentId}}
16 11
17 12
18 # == 2. 客户跟进次数分析 == 13 # == 2. 客户跟进次数分析 ==
19 -### 2.1 客户跟进次数分析(按日)  
20 -GET {{baseUrl}}/crm/statistics-customer/get-followup-summary-by-date?deptId=100&intervalType=11&times[0]=2024-01-01 00:00:00&times[1]=2024-01-29 23:59:59  
21 -Authorization: Bearer {{token}}  
22 -tenant-id: {{adminTenentId}}  
23 -  
24 -### 2.2 客户跟进次数分析(按月)  
25 -GET {{baseUrl}}/crm/statistics-customer/get-followup-summary-by-date?deptId=100&intervalType=11&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59 14 +### 2.1 客户跟进次数分析(按日期)
  15 +GET {{baseUrl}}/crm/statistics-customer/get-follow-up-summary-by-date?deptId=100&interval=2&times[0]=2024-01-01 00:00:00&times[1]=2024-01-29 23:59:59
26 Authorization: Bearer {{token}} 16 Authorization: Bearer {{token}}
27 tenant-id: {{adminTenentId}} 17 tenant-id: {{adminTenentId}}
28 18
29 -### 2.3 客户总量统计(按用户)  
30 -GET {{baseUrl}}/crm/statistics-customer/get-followup-summary-by-user?deptId=100&intervalType=11&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59 19 +### 2.2 客户总量统计(按用户)
  20 +GET {{baseUrl}}/crm/statistics-customer/get-follow-up-summary-by-user?deptId=100&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59
31 Authorization: Bearer {{token}} 21 Authorization: Bearer {{token}}
32 tenant-id: {{adminTenentId}} 22 tenant-id: {{adminTenentId}}
33 23
34 24
35 # == 3. 客户跟进方式分析 == 25 # == 3. 客户跟进方式分析 ==
36 ### 3.1 客户跟进方式分析 26 ### 3.1 客户跟进方式分析
37 -GET {{baseUrl}}/crm/statistics-customer/get-followup-summary-by-type?deptId=100&intervalType=11&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59 27 +GET {{baseUrl}}/crm/statistics-customer/get-follow-up-summary-by-type?deptId=100&interval=2&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59
38 Authorization: Bearer {{token}} 28 Authorization: Bearer {{token}}
39 tenant-id: {{adminTenentId}} 29 tenant-id: {{adminTenentId}}
40 -tenant-id: {{adminTenentId}}  
41 30
42 31
43 # == 4. 客户成交周期 == 32 # == 4. 客户成交周期 ==
44 ### 4.1 合同摘要信息(客户转化率页面) 33 ### 4.1 合同摘要信息(客户转化率页面)
45 -GET {{baseUrl}}/crm/statistics-customer/get-contract-summary?deptId=100&intervalType=11&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59 34 +GET {{baseUrl}}/crm/statistics-customer/get-contract-summary?deptId=100&interval=2&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59
46 Authorization: Bearer {{token}} 35 Authorization: Bearer {{token}}
47 tenant-id: {{adminTenentId}} 36 tenant-id: {{adminTenentId}}
48 -tenant-id: {{adminTenentId}}  
49 -  
50 37
51 # == 5. 客户成交周期 == 38 # == 5. 客户成交周期 ==
52 -### 5.1 客户成交周期(按日)  
53 -GET {{baseUrl}}/crm/statistics-customer/get-customer-deal-cycle-by-date?deptId=100&intervalType=11&times[0]=2024-01-01 00:00:00&times[1]=2024-01-29 23:59:59 39 +### 5.1 获取客户公海分析(按日期)
  40 +GET {{baseUrl}}/crm/statistics-customer/get-pool-summary-by-date?deptId=100&interval=2&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59
54 Authorization: Bearer {{token}} 41 Authorization: Bearer {{token}}
55 tenant-id: {{adminTenentId}} 42 tenant-id: {{adminTenentId}}
56 -tenant-id: {{adminTenentId}}  
57 43
58 -### 5.2 客户成交周期(按月)  
59 -GET {{baseUrl}}/crm/statistics-customer/get-customer-deal-cycle-by-date?deptId=100&intervalType=11&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59 44 +### 5.2 获取客户公海分析(按用户)
  45 +GET {{baseUrl}}/crm/statistics-customer/get-pool-summary-by-user?deptId=100&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59
60 Authorization: Bearer {{token}} 46 Authorization: Bearer {{token}}
61 tenant-id: {{adminTenentId}} 47 tenant-id: {{adminTenentId}}
  48 +
  49 +# == 6. 客户成交周期 ==
  50 +### 6.1 客户成交周期(按日期)
  51 +GET {{baseUrl}}/crm/statistics-customer/get-customer-deal-cycle-by-date?deptId=100&interval=2&times[0]=2024-01-01 00:00:00&times[1]=2024-01-29 23:59:59
  52 +Authorization: Bearer {{token}}
62 tenant-id: {{adminTenentId}} 53 tenant-id: {{adminTenentId}}
63 54
64 -### 5.3 获取客户成交周期(按用户)  
65 -GET {{baseUrl}}/crm/statistics-customer/get-customer-deal-cycle-by-user?deptId=100&intervalType=11&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59 55 +### 6.2 获取客户成交周期(按用户)
  56 +GET {{baseUrl}}/crm/statistics-customer/get-customer-deal-cycle-by-user?deptId=100&times[0]=2023-01-01 00:00:00&times[1]=2024-12-12 23:59:59
66 Authorization: Bearer {{token}} 57 Authorization: Bearer {{token}}
67 tenant-id: {{adminTenentId}} 58 tenant-id: {{adminTenentId}}
68 -tenant-id: {{adminTenentId}}  
69 \ No newline at end of file 59 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.java
@@ -61,8 +61,6 @@ public class CrmStatisticsCustomerController { @@ -61,8 +61,6 @@ public class CrmStatisticsCustomerController {
61 return success(customerService.getFollowUpSummaryByType(reqVO)); 61 return success(customerService.getFollowUpSummaryByType(reqVO));
62 } 62 }
63 63
64 - // TODO @dhb52:【客户转化率】里,应该少了一个接口,给上面图标的;  
65 -  
66 @GetMapping("/get-contract-summary") 64 @GetMapping("/get-contract-summary")
67 @Operation(summary = "获取客户的首次合同、回款信息列表", description = "用于【客户转化率】页面") 65 @Operation(summary = "获取客户的首次合同、回款信息列表", description = "用于【客户转化率】页面")
68 @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')") 66 @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')")
@@ -70,6 +68,20 @@ public class CrmStatisticsCustomerController { @@ -70,6 +68,20 @@ public class CrmStatisticsCustomerController {
70 return success(customerService.getContractSummary(reqVO)); 68 return success(customerService.getContractSummary(reqVO));
71 } 69 }
72 70
  71 + @GetMapping("/get-pool-summary-by-date")
  72 + @Operation(summary = "获取客户成交周期(按日期)")
  73 + @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')")
  74 + public CommonResult<List<CrmStatisticsPoolSummaryByDateRespVO>> getPoolSummaryByDate(@Valid CrmStatisticsCustomerReqVO reqVO) {
  75 + return success(customerService.getPoolSummaryByDate(reqVO));
  76 + }
  77 +
  78 + @GetMapping("/get-pool-summary-by-user")
  79 + @Operation(summary = "获取客户成交周期(按用户)")
  80 + @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')")
  81 + public CommonResult<List<CrmStatisticsPoolSummaryByUserRespVO>> getPoolSummaryByUser(@Valid CrmStatisticsCustomerReqVO reqVO) {
  82 + return success(customerService.getPoolSummaryByUser(reqVO));
  83 + }
  84 +
73 @GetMapping("/get-customer-deal-cycle-by-date") 85 @GetMapping("/get-customer-deal-cycle-by-date")
74 @Operation(summary = "获取客户成交周期(按日期)") 86 @Operation(summary = "获取客户成交周期(按日期)")
75 @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')") 87 @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')")
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsPoolSummaryByDateRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +@Schema(description = "管理后台 - CRM 公海客户分析(按日期) VO")
  7 +@Data
  8 +public class CrmStatisticsPoolSummaryByDateRespVO {
  9 +
  10 + @Schema(description = "时间轴", requiredMode = Schema.RequiredMode.REQUIRED, example = "202401")
  11 + private String time;
  12 +
  13 + @Schema(description = "进入公海客户数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  14 + private Integer customerPutCount;
  15 +
  16 + @Schema(description = "公海领取客户数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  17 + private Integer customerTakeCount;
  18 +
  19 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsPoolSummaryByUserRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +@Schema(description = "管理后台 - CRM 公海客户分析(按用户) VO")
  7 +@Data
  8 +public class CrmStatisticsPoolSummaryByUserRespVO extends CrmStatisticsCustomerByUserBaseRespVO {
  9 +
  10 + @Schema(description = "进入公海客户数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  11 + private Integer customerPutCount;
  12 +
  13 + @Schema(description = "公海领取客户数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  14 + private Integer customerTakeCount;
  15 +
  16 +}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsCustomerMapper.java
1 package cn.iocoder.yudao.module.crm.dal.mysql.statistics; 1 package cn.iocoder.yudao.module.crm.dal.mysql.statistics;
2 2
  3 +import cn.hutool.core.date.LocalDateTimeUtil;
  4 +import cn.hutool.core.util.RandomUtil;
3 import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.*; 5 import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.*;
4 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
5 7
  8 +import java.time.LocalDateTime;
  9 +import java.util.ArrayList;
6 import java.util.List; 10 import java.util.List;
7 11
  12 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  13 +
8 /** 14 /**
9 - * CRM 数据统计 Mapper 15 + * CRM 客户分析 Mapper
10 * 16 *
11 * @author dhb52 17 * @author dhb52
12 */ 18 */
13 @Mapper 19 @Mapper
14 public interface CrmStatisticsCustomerMapper { 20 public interface CrmStatisticsCustomerMapper {
15 21
  22 + /**
  23 + * 新建客户数(按日期)
  24 + *
  25 + * @param reqVO 请求参数
  26 + * @return 统计数据
  27 + */
16 List<CrmStatisticsCustomerSummaryByDateRespVO> selectCustomerCreateCountGroupByDate(CrmStatisticsCustomerReqVO reqVO); 28 List<CrmStatisticsCustomerSummaryByDateRespVO> selectCustomerCreateCountGroupByDate(CrmStatisticsCustomerReqVO reqVO);
17 29
  30 + /**
  31 + * 成交客户数(按日期)
  32 + *
  33 + * @param reqVO 请求参数
  34 + * @return 统计数据
  35 + */
18 List<CrmStatisticsCustomerSummaryByDateRespVO> selectCustomerDealCountGroupByDate(CrmStatisticsCustomerReqVO reqVO); 36 List<CrmStatisticsCustomerSummaryByDateRespVO> selectCustomerDealCountGroupByDate(CrmStatisticsCustomerReqVO reqVO);
19 37
  38 + /**
  39 + * 新建客户数(按用户)
  40 + *
  41 + * @param reqVO 请求参数
  42 + * @return 统计数据
  43 + */
20 List<CrmStatisticsCustomerSummaryByUserRespVO> selectCustomerCreateCountGroupByUser(CrmStatisticsCustomerReqVO reqVO); 44 List<CrmStatisticsCustomerSummaryByUserRespVO> selectCustomerCreateCountGroupByUser(CrmStatisticsCustomerReqVO reqVO);
21 45
  46 + /**
  47 + * 成交客户数(按用户)
  48 + *
  49 + * @param reqVO 请求参数@param reqVO 请求参数@param reqVO 请求参数
  50 + * @return 统计数据
  51 + */
22 List<CrmStatisticsCustomerSummaryByUserRespVO> selectCustomerDealCountGroupByUser(CrmStatisticsCustomerReqVO reqVO); 52 List<CrmStatisticsCustomerSummaryByUserRespVO> selectCustomerDealCountGroupByUser(CrmStatisticsCustomerReqVO reqVO);
23 53
  54 + /**
  55 + * 合同总金额(按用户)
  56 + * @return 统计数据@return 统计数据@param reqVO 请求参数
  57 + * @return 统计数据
  58 + */
24 List<CrmStatisticsCustomerSummaryByUserRespVO> selectContractPriceGroupByUser(CrmStatisticsCustomerReqVO reqVO); 59 List<CrmStatisticsCustomerSummaryByUserRespVO> selectContractPriceGroupByUser(CrmStatisticsCustomerReqVO reqVO);
25 60
  61 + /**
  62 + * 合同回款金额(按用户)
  63 + *
  64 + * @param reqVO 请求参数
  65 + * @return 统计数据
  66 + */
26 List<CrmStatisticsCustomerSummaryByUserRespVO> selectReceivablePriceGroupByUser(CrmStatisticsCustomerReqVO reqVO); 67 List<CrmStatisticsCustomerSummaryByUserRespVO> selectReceivablePriceGroupByUser(CrmStatisticsCustomerReqVO reqVO);
27 68
  69 + /**
  70 + * 跟进次数(按日期)
  71 + *
  72 + * @param reqVO 请求参数
  73 + * @return 统计数据
  74 + */
28 List<CrmStatisticsFollowUpSummaryByDateRespVO> selectFollowUpRecordCountGroupByDate(CrmStatisticsCustomerReqVO reqVO); 75 List<CrmStatisticsFollowUpSummaryByDateRespVO> selectFollowUpRecordCountGroupByDate(CrmStatisticsCustomerReqVO reqVO);
29 76
  77 + /**
  78 + * 跟进客户数(按日期)
  79 + *
  80 + * @param reqVO 请求参数
  81 + * @return 统计数据
  82 + */
30 List<CrmStatisticsFollowUpSummaryByDateRespVO> selectFollowUpCustomerCountGroupByDate(CrmStatisticsCustomerReqVO reqVO); 83 List<CrmStatisticsFollowUpSummaryByDateRespVO> selectFollowUpCustomerCountGroupByDate(CrmStatisticsCustomerReqVO reqVO);
31 84
  85 + /**
  86 + * 跟进次数(按用户)
  87 + *
  88 + * @param reqVO 请求参数
  89 + * @return 统计数据
  90 + */
32 List<CrmStatisticsFollowUpSummaryByUserRespVO> selectFollowUpRecordCountGroupByUser(CrmStatisticsCustomerReqVO reqVO); 91 List<CrmStatisticsFollowUpSummaryByUserRespVO> selectFollowUpRecordCountGroupByUser(CrmStatisticsCustomerReqVO reqVO);
33 92
  93 + /**
  94 + * 跟进客户数(按用户)
  95 + *
  96 + * @param reqVO 请求参数
  97 + * @return 统计数据
  98 + */
34 List<CrmStatisticsFollowUpSummaryByUserRespVO> selectFollowUpCustomerCountGroupByUser(CrmStatisticsCustomerReqVO reqVO); 99 List<CrmStatisticsFollowUpSummaryByUserRespVO> selectFollowUpCustomerCountGroupByUser(CrmStatisticsCustomerReqVO reqVO);
35 100
  101 +
  102 + /**
  103 + * 首次合同、回款信息(用于【客户转化率】页面)
  104 + *
  105 + * @param reqVO 请求参数
  106 + * @return 统计数据
  107 + */
36 List<CrmStatisticsCustomerContractSummaryRespVO> selectContractSummary(CrmStatisticsCustomerReqVO reqVO); 108 List<CrmStatisticsCustomerContractSummaryRespVO> selectContractSummary(CrmStatisticsCustomerReqVO reqVO);
37 109
  110 + /**
  111 + * 跟进次数(按类型)
  112 + *
  113 + * @param reqVO 请求参数
  114 + * @return 统计数据
  115 + */
38 List<CrmStatisticsFollowUpSummaryByTypeRespVO> selectFollowUpRecordCountGroupByType(CrmStatisticsCustomerReqVO reqVO); 116 List<CrmStatisticsFollowUpSummaryByTypeRespVO> selectFollowUpRecordCountGroupByType(CrmStatisticsCustomerReqVO reqVO);
39 117
  118 +
  119 + /**
  120 + * 进入公海客户数(按日期)
  121 + *
  122 + * @param reqVO 请求参数
  123 + * @return 统计数据
  124 + */
  125 + // TODO: @芋艿 模拟数据, 需要增加 crm_owner_record 表
  126 + default List<CrmStatisticsPoolSummaryByDateRespVO> selectPoolCustomerPutCountByDate(CrmStatisticsCustomerReqVO reqVO) {
  127 + LocalDateTime currrentDate = LocalDateTimeUtil.beginOfDay(reqVO.getTimes()[0]);
  128 + LocalDateTime endDate = LocalDateTimeUtil.endOfDay(reqVO.getTimes()[1]);
  129 + List<CrmStatisticsPoolSummaryByDateRespVO> voList = new ArrayList<>();
  130 + while (currrentDate.isBefore(endDate)) {
  131 + voList.add(new CrmStatisticsPoolSummaryByDateRespVO()
  132 + .setTime(LocalDateTimeUtil.format(currrentDate, "yyyy-MM-dd"))
  133 + .setCustomerPutCount(RandomUtil.randomInt(0, 10))
  134 + .setCustomerTakeCount(RandomUtil.randomInt(0, 10)));
  135 + currrentDate = currrentDate.plusDays(1);
  136 + }
  137 +
  138 + return voList;
  139 + }
  140 +
  141 +
  142 + /**
  143 + * 公海领取客户数(按日期)
  144 + *
  145 + * @param reqVO 请求参数
  146 + * @return 统计数据
  147 + */
  148 + // TODO: @芋艿 模拟数据, 需要增加 crm_owner_record 表
  149 + default List<CrmStatisticsPoolSummaryByDateRespVO> selectPoolCustomerTakeCountByDate(CrmStatisticsCustomerReqVO reqVO) {
  150 + return selectPoolCustomerPutCountByDate(reqVO);
  151 + }
  152 +
  153 + /**
  154 + * 进入公海客户数(按用户)
  155 + *
  156 + * @param reqVO 请求参数
  157 + * @return 统计数据
  158 + */
  159 + // TODO: @芋艿 模拟数据, 需要增加 crm_owner_record 表
  160 + default List<CrmStatisticsPoolSummaryByUserRespVO> selectPoolCustomerPutCountByUser(CrmStatisticsCustomerReqVO reqVO) {
  161 + return convertList(reqVO.getUserIds(), userId ->
  162 + (CrmStatisticsPoolSummaryByUserRespVO) new CrmStatisticsPoolSummaryByUserRespVO()
  163 + .setCustomerPutCount(RandomUtil.randomInt(0, 10))
  164 + .setCustomerTakeCount(RandomUtil.randomInt(0, 10))
  165 + .setOwnerUserId(userId));
  166 + }
  167 +
  168 + /**
  169 + * 公海领取客户数(按用户)
  170 + *
  171 + * @param reqVO 请求参数
  172 + * @return 统计数据
  173 + */
  174 + // TODO: @芋艿 模拟数据, 需要增加 crm_owner_record 表
  175 + default List<CrmStatisticsPoolSummaryByUserRespVO> selectPoolCustomerTakeCountByUser(CrmStatisticsCustomerReqVO reqVO) {
  176 + return selectPoolCustomerPutCountByUser(reqVO);
  177 + }
  178 +
  179 + /**
  180 + * 客户成交周期(按日期)
  181 + *
  182 + * @param reqVO 请求参数
  183 + * @return 统计数据
  184 + */
40 List<CrmStatisticsCustomerDealCycleByDateRespVO> selectCustomerDealCycleGroupByDate(CrmStatisticsCustomerReqVO reqVO); 185 List<CrmStatisticsCustomerDealCycleByDateRespVO> selectCustomerDealCycleGroupByDate(CrmStatisticsCustomerReqVO reqVO);
41 186
  187 + /**
  188 + * 客户成交周期(按用户)
  189 + *
  190 + * @param reqVO 请求参数
  191 + * @return 统计数据
  192 + */
42 List<CrmStatisticsCustomerDealCycleByUserRespVO> selectCustomerDealCycleGroupByUser(CrmStatisticsCustomerReqVO reqVO); 193 List<CrmStatisticsCustomerDealCycleByUserRespVO> selectCustomerDealCycleGroupByUser(CrmStatisticsCustomerReqVO reqVO);
43 194
44 } 195 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsCustomerService.java
@@ -55,11 +55,27 @@ public interface CrmStatisticsCustomerService { @@ -55,11 +55,27 @@ public interface CrmStatisticsCustomerService {
55 * 获取客户的首次合同、回款信息列表,用于【客户转化率】页面 55 * 获取客户的首次合同、回款信息列表,用于【客户转化率】页面
56 * 56 *
57 * @param reqVO 请求参数 57 * @param reqVO 请求参数
58 - * @return 客户的首次合同、回款信息列表 58 + * @return 统计数据
59 */ 59 */
60 List<CrmStatisticsCustomerContractSummaryRespVO> getContractSummary(CrmStatisticsCustomerReqVO reqVO); 60 List<CrmStatisticsCustomerContractSummaryRespVO> getContractSummary(CrmStatisticsCustomerReqVO reqVO);
61 61
62 /** 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 + /**
63 * 客户成交周期(按日期) 79 * 客户成交周期(按日期)
64 * 80 *
65 * 成交周期的定义:客户 customer 在创建出来,到合同 contract 第一次成交的时间差 81 * 成交周期的定义:客户 customer 在创建出来,到合同 contract 第一次成交的时间差
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsCustomerServiceImpl.java
@@ -188,6 +188,60 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe @@ -188,6 +188,60 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
188 } 188 }
189 189
190 @Override 190 @Override
  191 + public List<CrmStatisticsPoolSummaryByDateRespVO> getPoolSummaryByDate(CrmStatisticsCustomerReqVO reqVO) {
  192 + // 1. 获得用户编号数组
  193 + reqVO.setUserIds(getUserIds(reqVO));
  194 + if (CollUtil.isEmpty(reqVO.getUserIds())) {
  195 + return Collections.emptyList();
  196 + }
  197 +
  198 + // 2. 按天统计,获取分项统计数据
  199 + List<CrmStatisticsPoolSummaryByDateRespVO> customerPutCountList = customerMapper.selectPoolCustomerPutCountByDate(reqVO);
  200 + List<CrmStatisticsPoolSummaryByDateRespVO> customerTakeCountList = customerMapper.selectPoolCustomerTakeCountByDate(reqVO);
  201 +
  202 + // 3. 按照日期间隔,合并数据
  203 + List<LocalDateTime[]> timeRanges = LocalDateTimeUtils.getDateRangeList(reqVO.getTimes()[0], reqVO.getTimes()[1], reqVO.getInterval());
  204 + return convertList(timeRanges, times -> {
  205 + Integer customerPutCount = customerPutCountList.stream()
  206 + .filter(vo -> LocalDateTimeUtils.isBetween(times[0], times[1], vo.getTime()))
  207 + .mapToInt(CrmStatisticsPoolSummaryByDateRespVO::getCustomerPutCount).sum();
  208 + Integer customerTakeCount = customerTakeCountList.stream()
  209 + .filter(vo -> LocalDateTimeUtils.isBetween(times[0], times[1], vo.getTime()))
  210 + .mapToInt(CrmStatisticsPoolSummaryByDateRespVO::getCustomerTakeCount).sum();
  211 + return new CrmStatisticsPoolSummaryByDateRespVO()
  212 + .setTime(LocalDateTimeUtils.formatDateRange(times[0], times[1], reqVO.getInterval()))
  213 + .setCustomerPutCount(customerPutCount).setCustomerTakeCount(customerTakeCount);
  214 + });
  215 + }
  216 +
  217 + @Override
  218 + public List<CrmStatisticsPoolSummaryByUserRespVO> getPoolSummaryByUser(CrmStatisticsCustomerReqVO reqVO) {
  219 + // 1. 获得用户编号数组
  220 + reqVO.setUserIds(getUserIds(reqVO));
  221 + if (CollUtil.isEmpty(reqVO.getUserIds())) {
  222 + return Collections.emptyList();
  223 + }
  224 +
  225 + // 2. 按用户统计,获取分项统计数据
  226 + List<CrmStatisticsPoolSummaryByUserRespVO> customerPutCountList = customerMapper.selectPoolCustomerPutCountByUser(reqVO);
  227 + List<CrmStatisticsPoolSummaryByUserRespVO> customerTakeCountList = customerMapper.selectPoolCustomerTakeCountByUser(reqVO);
  228 +
  229 + // 3.1 按照用户,合并统计数据
  230 + List<CrmStatisticsPoolSummaryByUserRespVO> summaryList = convertList(reqVO.getUserIds(), userId -> {
  231 + Integer customerPutCount = customerPutCountList.stream().filter(vo -> userId.equals(vo.getOwnerUserId()))
  232 + .mapToInt(CrmStatisticsPoolSummaryByUserRespVO::getCustomerPutCount).sum();
  233 + Integer customerTakeCount = customerTakeCountList.stream().filter(vo -> userId.equals(vo.getOwnerUserId()))
  234 + .mapToInt(CrmStatisticsPoolSummaryByUserRespVO::getCustomerTakeCount).sum();
  235 + return (CrmStatisticsPoolSummaryByUserRespVO) new CrmStatisticsPoolSummaryByUserRespVO()
  236 + .setCustomerPutCount(customerPutCount).setCustomerTakeCount(customerTakeCount)
  237 + .setOwnerUserId(userId);
  238 + });
  239 + // 3.2 拼接用户信息
  240 + appendUserInfo(summaryList);
  241 + return summaryList;
  242 + }
  243 +
  244 + @Override
191 public List<CrmStatisticsCustomerDealCycleByDateRespVO> getCustomerDealCycleByDate(CrmStatisticsCustomerReqVO reqVO) { 245 public List<CrmStatisticsCustomerDealCycleByDateRespVO> getCustomerDealCycleByDate(CrmStatisticsCustomerReqVO reqVO) {
192 // 1. 获得用户编号数组 246 // 1. 获得用户编号数组
193 reqVO.setUserIds(getUserIds(reqVO)); 247 reqVO.setUserIds(getUserIds(reqVO));