Commit a8bec19196cd63b135734011b1de13d8b728b6a8
1 parent
90f82b15
CRM:code review【客户统计】的代码实现
Showing
5 changed files
with
51 additions
and
47 deletions
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 | ... | ... |