Commit a8bec19196cd63b135734011b1de13d8b728b6a8

Authored by YunaiV
1 parent 90f82b15

CRM:code review【客户统计】的代码实现

yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.java
... ... @@ -61,8 +61,10 @@ public class CrmStatisticsCustomerController {
61 61 return success(customerService.getFollowUpSummaryByType(reqVO));
62 62 }
63 63  
  64 + // TODO @dhb52:【客户转化率】里,应该少了一个接口,给上面图标的;
  65 +
64 66 @GetMapping("/get-contract-summary")
65   - @Operation(summary = "获取合同摘要信息(客户转化率页面)")
  67 + @Operation(summary = "获取客户的首次合同、回款信息列表", description = "用于【客户转化率】页面")
66 68 @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')")
67 69 public CommonResult<List<CrmStatisticsCustomerContractSummaryRespVO>> getContractSummary(@Valid CrmStatisticsCustomerReqVO reqVO) {
68 70 return success(customerService.getContractSummary(reqVO));
... ... @@ -82,4 +84,6 @@ public class CrmStatisticsCustomerController {
82 84 return success(customerService.getCustomerDealCycleByUser(reqVO));
83 85 }
84 86  
  87 + // TODO dhb52:【成交周期分析】里,有按照员工(已实现)、地区(未实现)、产品(未实现),需要在看看哈;可以把 CustomerDealCycle 拆成 3 个 tab,员工客户成交周期分析、地区客户成交周期分析、产品客户成交周期分析;
  88 +
85 89 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsCustomerMapper.java
... ... @@ -39,6 +39,6 @@ public interface CrmStatisticsCustomerMapper {
39 39  
40 40 List<CrmStatisticsCustomerDealCycleByDateRespVO> selectCustomerDealCycleGroupByDate(CrmStatisticsCustomerReqVO reqVO);
41 41  
42   - List<CrmStatisticsCustomerDealCycleByUserRespVO> selectCustomerDealCycleGroupByUser(CrmStatisticsCustomerReqVO reqVO); // TODO
  42 + List<CrmStatisticsCustomerDealCycleByUserRespVO> selectCustomerDealCycleGroupByUser(CrmStatisticsCustomerReqVO reqVO);
43 43  
44 44 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsCustomerService.java
... ... @@ -52,16 +52,18 @@ public interface CrmStatisticsCustomerService {
52 52 List<CrmStatisticsFollowUpSummaryByTypeRespVO> getFollowUpSummaryByType(CrmStatisticsCustomerReqVO reqVO);
53 53  
54 54 /**
55   - * 获取合同摘要信息(客户转化率页面)
  55 + * 获取客户的首次合同、回款信息列表,用于【客户转化率】页面
56 56 *
57 57 * @param reqVO 请求参数
58   - * @return 合同摘要列表
  58 + * @return 客户的首次合同、回款信息列表
59 59 */
60 60 List<CrmStatisticsCustomerContractSummaryRespVO> getContractSummary(CrmStatisticsCustomerReqVO reqVO);
61 61  
62 62 /**
63 63 * 客户成交周期(按日期)
64 64 *
  65 + * 成交的定义:客户 customer 在创建出来,到合同 contract 第一次成交的时间差
  66 + *
65 67 * @param reqVO 请求参数
66 68 * @return 统计数据
67 69 */
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsCustomerMapper.xml
... ... @@ -24,7 +24,7 @@
24 24 COUNT( DISTINCT customer_id ) AS customerDealCount
25 25 FROM crm_contract
26 26 WHERE deleted = 0
27   - AND audit_status = 20
  27 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
28 28 AND owner_user_id IN
29 29 <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
30 30 #{userId}
... ... @@ -56,7 +56,7 @@
56 56 FROM crm_customer AS customer
57 57 LEFT JOIN crm_contract AS contract ON contract.customer_id = customer.id
58 58 WHERE customer.deleted = 0 AND contract.deleted = 0
59   - AND contract.audit_status = 20
  59 + AND contract.audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
60 60 AND customer.owner_user_id IN
61 61 <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
62 62 #{userId}
... ... @@ -72,7 +72,7 @@
72 72 IFNULL(SUM(total_price), 0) AS contract_price
73 73 FROM crm_contract
74 74 WHERE deleted = 0
75   - AND audit_status = 20
  75 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
76 76 AND owner_user_id in
77 77 <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
78 78 #{userId}
... ... @@ -88,7 +88,7 @@
88 88 IFNULL(SUM(price), 0) AS receivable_price
89 89 FROM crm_receivable
90 90 WHERE deleted = 0
91   - AND audit_status = 20
  91 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
92 92 AND owner_user_id IN
93 93 <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
94 94 #{userId}
... ... @@ -175,28 +175,24 @@
175 175 <select id="selectContractSummary"
176 176 resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerContractSummaryRespVO">
177 177 SELECT
178   - customer.name AS customer_name,
179   - contract.name AS contract_name,
180   - contract.total_price,
181   - IFNULL( receivable.price, 0 ) AS receivable_price,
182   - customer.industry_id,
183   - customer.source,
184   - customer.owner_user_id,
185   - customer.creator,
  178 + customer.name AS customer_name, customer.industry_id, customer.source, customer.owner_user_id, customer.creator,
186 179 customer.create_time,
187   - contract.order_date
  180 + contract.name AS contract_name, contract.total_price, contract.order_date,
  181 + IFNULL( receivable.price, 0 ) AS receivable_price
188 182 FROM crm_customer AS customer
189 183 INNER JOIN crm_contract AS contract ON customer.id = contract.customer_id
190 184 LEFT JOIN crm_receivable AS receivable ON contract.id = receivable.contract_id
191 185 WHERE customer.deleted = 0 AND contract.deleted = 0 AND receivable.deleted = 0
192   - AND contract.audit_status = 20
  186 + AND contract.audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
193 187 AND customer.owner_user_id IN
194 188 <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
195 189 #{userId}
196 190 </foreach>
  191 + <!-- TODO @dhb52:应该是客户的创建时间;因为它的定位,是知道这个时间范围内创建的客户,是否下合同了(转化); -->
197 192 AND contract.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
198 193 </select>
199 194  
  195 + <!-- TIMESTAMPDIFF 用于求差值;AVG 求平均;TRUNCATE 去掉小数点、只保留整数 -->
200 196 <select id="selectCustomerDealCycleGroupByDate"
201 197 resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerDealCycleByDateRespVO">
202 198 SELECT
... ... @@ -205,11 +201,12 @@
205 201 FROM crm_customer AS customer
206 202 LEFT JOIN crm_contract AS contract ON contract.customer_id = customer.id
207 203 WHERE customer.deleted = 0 AND contract.deleted = 0
208   - AND contract.audit_status = 20
  204 + AND contract.audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
209 205 AND customer.owner_user_id IN
210 206 <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
211 207 #{userId}
212 208 </foreach>
  209 + <!-- TODO @dhb52:应该是客户的创建时间; -->
213 210 AND contract.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
214 211 GROUP BY time
215 212 </select>
... ... @@ -222,11 +219,12 @@
222 219 FROM crm_customer AS customer
223 220 LEFT JOIN crm_contract AS contract ON contract.customer_id = customer.id
224 221 WHERE customer.deleted = 0 AND contract.deleted = 0
225   - AND contract.audit_status = 20
  222 + AND contract.audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
226 223 AND customer.owner_user_id IN
227 224 <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
228 225 #{userId}
229 226 </foreach>
  227 + <!-- TODO @dhb52:应该是客户的创建时间; -->
230 228 AND contract.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
231 229 GROUP BY customer.owner_user_id
232 230 </select>
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsRankMapper.xml
... ... @@ -7,11 +7,11 @@
7 7 SELECT IFNULL(SUM(total_price), 0) AS count, owner_user_id
8 8 FROM crm_contract
9 9 WHERE deleted = 0
10   - AND audit_status = 20
  10 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
11 11 and owner_user_id in
12   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
13   - #{userId}
14   - </foreach>
  12 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  13 + #{userId}
  14 + </foreach>
15 15 AND order_date between #{times[0],javaType=java.time.LocalDateTime} and
16 16 #{times[1],javaType=java.time.LocalDateTime}
17 17 GROUP BY owner_user_id
... ... @@ -22,11 +22,11 @@
22 22 SELECT IFNULL(SUM(price), 0) AS count, owner_user_id
23 23 FROM crm_receivable
24 24 WHERE deleted = 0
25   - AND audit_status = 20
  25 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
26 26 AND owner_user_id in
27   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
28   - #{userId}
29   - </foreach>
  27 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  28 + #{userId}
  29 + </foreach>
30 30 AND return_time between #{times[0],javaType=java.time.LocalDateTime} and
31 31 #{times[1],javaType=java.time.LocalDateTime}
32 32 GROUP BY owner_user_id
... ... @@ -37,11 +37,11 @@
37 37 SELECT COUNT(1) AS count, owner_user_id
38 38 FROM crm_contract
39 39 WHERE deleted = 0
40   - AND audit_status = 20
  40 + AND audit_status = ${@cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum@APPROVE.status}
41 41 AND owner_user_id in
42   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
43   - #{userId}
44   - </foreach>
  42 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  43 + #{userId}
  44 + </foreach>
45 45 AND order_date between #{times[0],javaType=java.time.LocalDateTime} and
46 46 #{times[1],javaType=java.time.LocalDateTime}
47 47 GROUP BY owner_user_id
... ... @@ -55,9 +55,9 @@
55 55 WHERE deleted = 0
56 56 AND audit_status = 20
57 57 AND owner_user_id in
58   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
59   - #{userId}
60   - </foreach>
  58 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  59 + #{userId}
  60 + </foreach>
61 61 AND order_date between #{times[0],javaType=java.time.LocalDateTime} and
62 62 #{times[1],javaType=java.time.LocalDateTime}
63 63 GROUP BY owner_user_id
... ... @@ -69,9 +69,9 @@
69 69 FROM crm_customer
70 70 WHERE deleted = 0
71 71 AND owner_user_id in
72   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
73   - #{userId}
74   - </foreach>
  72 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  73 + #{userId}
  74 + </foreach>
75 75 AND create_time between #{times[0],javaType=java.time.LocalDateTime} and
76 76 #{times[1],javaType=java.time.LocalDateTime}
77 77 GROUP BY owner_user_id
... ... @@ -83,9 +83,9 @@
83 83 FROM crm_contact
84 84 WHERE deleted = 0
85 85 AND owner_user_id in
86   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
87   - #{userId}
88   - </foreach>
  86 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  87 + #{userId}
  88 + </foreach>
89 89 AND create_time between #{times[0],javaType=java.time.LocalDateTime} and
90 90 #{times[1],javaType=java.time.LocalDateTime}
91 91 GROUP BY owner_user_id
... ... @@ -99,9 +99,9 @@
99 99 WHERE cfur.deleted = 0
100 100 AND cc.deleted = 0
101 101 AND cc.owner_user_id in
102   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
103   - #{userId}
104   - </foreach>
  102 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  103 + #{userId}
  104 + </foreach>
105 105 AND cfur.create_time between #{times[0],javaType=java.time.LocalDateTime} and
106 106 #{times[1],javaType=java.time.LocalDateTime}
107 107 GROUP BY cc.owner_user_id
... ... @@ -115,9 +115,9 @@
115 115 WHERE cfur.deleted = 0
116 116 AND cc.deleted = 0
117 117 AND cc.owner_user_id in
118   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
119   - #{userId}
120   - </foreach>
  118 + <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
  119 + #{userId}
  120 + </foreach>
121 121 AND cfur.create_time between #{times[0],javaType=java.time.LocalDateTime} and
122 122 #{times[1],javaType=java.time.LocalDateTime}
123 123 GROUP BY cc.owner_user_id
... ...