Commit 9e6474a123fd6fec6be055002ca309abe2a012f2

Authored by scholar
1 parent 705a3e53

1,优化mapper.xml的sql语句;

2,对于无销售数据的月份,插入销售结果为0的数据;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPerformanceServiceImpl.java
1 1 package cn.iocoder.yudao.module.crm.service.statistics;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.date.LocalDateTimeUtil;
4 5 import cn.hutool.core.util.ObjUtil;
5 6 import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO;
6 7 import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO;
... ... @@ -13,8 +14,9 @@ import org.springframework.stereotype.Service;
13 14 import org.springframework.validation.annotation.Validated;
14 15  
15 16 import jakarta.annotation.Resource;
16   -import java.util.Collections;
17   -import java.util.List;
  17 +
  18 +import java.math.BigDecimal;
  19 +import java.util.*;
18 20 import java.util.function.Function;
19 21  
20 22 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
... ... @@ -56,24 +58,87 @@ public class CrmStatisticsPerformanceServiceImpl implements CrmStatisticsPerform
56 58 * 获得员工业绩数据
57 59 *
58 60 * @param performanceReqVO 参数
59   - * @param performanceFunction 排行榜方法
60   - * @return 排行版数据
  61 + * @param performanceFunction 员工业绩统计方法
  62 + * @return 员工业绩数据
61 63 */
62 64 private List<CrmStatisticsPerformanceRespVO> getPerformance(CrmStatisticsPerformanceReqVO performanceReqVO, Function<CrmStatisticsPerformanceReqVO,
63 65 List<CrmStatisticsPerformanceRespVO>> performanceFunction) {
64 66  
  67 + List<CrmStatisticsPerformanceRespVO> performanceRespVOList;
  68 +
65 69 // 1. 获得用户编号数组
66 70 final List<Long> userIds = getUserIds(performanceReqVO);
67 71 if (CollUtil.isEmpty(userIds)) {
68 72 return Collections.emptyList();
69 73 }
70 74 performanceReqVO.setUserIds(userIds);
71   - // 2. 获得排行数据
  75 + // 2. 获得业绩数据
72 76 List<CrmStatisticsPerformanceRespVO> performance = performanceFunction.apply(performanceReqVO);
73   - if (CollUtil.isEmpty(performance)) {
74   - return Collections.emptyList();
  77 +
  78 + // 获取查询的年份
  79 + String currentYear = LocalDateTimeUtil.format(performanceReqVO.getTimes()[0],"yyyy");
  80 +
  81 + // 构造查询当年和前一年,每年12个月的年月组合
  82 + List<String> allMonths = new ArrayList<>();
  83 + for (int year = Integer.parseInt(currentYear)-1; year <= Integer.parseInt(currentYear); year++) {
  84 + for (int month = 1; month <= 12; month++) {
  85 + allMonths.add(String.format("%d%02d", year, month));
  86 + }
  87 + }
  88 +
  89 + List<CrmStatisticsPerformanceRespVO> computedList = new ArrayList<>();
  90 + List<CrmStatisticsPerformanceRespVO> respVOList = new ArrayList<>();
  91 +
  92 + // 生成computedList基础数据
  93 + // 构造完整的2*12个月的数据,如果某月数据缺失,需要补上0,一年12个月不能有缺失
  94 + for (String month : allMonths) {
  95 + CrmStatisticsPerformanceRespVO foundData = performance.stream()
  96 + .filter(data -> data.getTime().equals(month))
  97 + .findFirst()
  98 + .orElse(null);
  99 +
  100 + if (foundData != null) {
  101 + computedList.add(foundData);
  102 + } else {
  103 + CrmStatisticsPerformanceRespVO missingData = new CrmStatisticsPerformanceRespVO();
  104 + missingData.setTime(month);
  105 + missingData.setCurrentMonthCount(BigDecimal.ZERO);
  106 + missingData.setLastMonthCount(BigDecimal.ZERO);
  107 + missingData.setLastYearCount(BigDecimal.ZERO);
  108 + computedList.add(missingData);
  109 + }
  110 + }
  111 + //根据查询年份和前一年的数据,计算查询年份的同比环比数据
  112 + for (CrmStatisticsPerformanceRespVO currentData : computedList) {
  113 + String currentMonth = currentData.getTime();
  114 +
  115 + // 根据当年和前一年的月销售数据,计算currentYear的完整数据
  116 + if (currentMonth.startsWith(currentYear)) {
  117 + // 计算 LastMonthCount
  118 + int currentIndex = computedList.indexOf(currentData);
  119 + if (currentIndex > 0) {
  120 + CrmStatisticsPerformanceRespVO lastMonthData = computedList.get(currentIndex - 1);
  121 + currentData.setLastMonthCount(lastMonthData.getCurrentMonthCount());
  122 + } else {
  123 + currentData.setLastMonthCount(BigDecimal.ZERO); // 第一个月的 LastMonthCount 设为0
  124 + }
  125 +
  126 + // 计算 LastYearCount
  127 + String lastYearMonth = String.valueOf(Integer.parseInt(currentMonth) - 100);
  128 + CrmStatisticsPerformanceRespVO lastYearData = computedList.stream()
  129 + .filter(data -> data.getTime().equals(lastYearMonth))
  130 + .findFirst()
  131 + .orElse(null);
  132 +
  133 + if (lastYearData != null) {
  134 + currentData.setLastYearCount(lastYearData.getCurrentMonthCount());
  135 + } else {
  136 + currentData.setLastYearCount(BigDecimal.ZERO); // 如果去年同月数据不存在,设为0
  137 + }
  138 + respVOList.add(currentData);//给前端只需要返回查询当年的数据,不需要前一年数据
  139 + }
75 140 }
76   - return performance;
  141 + return respVOList;
77 142 }
78 143  
79 144 /**
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsPerformanceMapper.xml
... ... @@ -5,27 +5,8 @@
5 5 <select id="selectContractCountPerformance"
6 6 resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO">
7 7 SELECT
8   - t.time as time,
9   - COALESCE(t.currentMonthCount,0) as currentMonthCount,
10   - COALESCE(y.lastMonthCount,0) as lastMonthCount,
11   - COALESCE(z.lastYearCount,0) as lastYearCount
12   - FROM
13   - (SELECT
14   - COUNT(1) AS currentMonthCount,
15   - DATE_FORMAT(order_date, '%Y-%m') AS time
16   - FROM crm_contract
17   - WHERE deleted = 0
18   - AND audit_status = 20
19   - AND owner_user_id in
20   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
21   - #{userId}
22   - </foreach>
23   - AND DATE_FORMAT(order_date, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')
24   - GROUP BY time)t
25   - LEFT JOIN
26   - (SELECT
27   - COUNT(1) AS lastMonthCount,
28   - DATE_FORMAT(DATE_ADD(order_date,INTERVAL 1 MONTH), '%Y-%m') AS time
  8 + DATE_FORMAT(order_date, '%Y%m') AS time,
  9 + COUNT(1) AS currentMonthCount
29 10 FROM crm_contract
30 11 WHERE deleted = 0
31 12 AND audit_status = 20
... ... @@ -35,45 +16,14 @@
35 16 </foreach>
36 17 AND (DATE_FORMAT(order_date, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')
37 18 or DATE_FORMAT(order_date, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')-1)
38   - GROUP BY time)y ON t.time = y.time
39   - LEFT JOIN
40   - (SELECT
41   - COUNT(1) AS lastYearCount,
42   - DATE_FORMAT(DATE_ADD(order_date,INTERVAL 1 YEAR), '%Y-%m') AS time
43   - FROM crm_contract
44   - WHERE deleted = 0
45   - AND audit_status = 20
46   - AND owner_user_id in
47   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
48   - #{userId}
49   - </foreach>
50   - AND DATE_FORMAT(order_date, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')-1
51   - GROUP BY time)z ON t.time = z.time
  19 + GROUP BY time
52 20 </select>
  21 +
53 22 <select id="selectContractPricePerformance"
54 23 resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO">
55 24 SELECT
56   - t.time as time,
57   - COALESCE(t.currentMonthCount,0) as currentMonthCount,
58   - COALESCE(y.lastMonthCount,0) as lastMonthCount,
59   - COALESCE(z.lastYearCount,0) as lastYearCount
60   - FROM
61   - (SELECT
62   - IFNULL(SUM(total_price), 0) AS currentMonthCount,
63   - DATE_FORMAT(order_date, '%Y-%m') AS time
64   - FROM crm_contract
65   - WHERE deleted = 0
66   - AND audit_status = 20
67   - AND owner_user_id in
68   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
69   - #{userId}
70   - </foreach>
71   - AND DATE_FORMAT(order_date, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')
72   - GROUP BY time)t
73   - LEFT JOIN
74   - (SELECT
75   - IFNULL(SUM(total_price), 0) AS lastMonthCount,
76   - DATE_FORMAT(DATE_ADD(order_date,INTERVAL 1 MONTH), '%Y-%m') AS time
  25 + DATE_FORMAT(order_date, '%Y%m') AS time,
  26 + IFNULL(SUM(total_price), 0) AS currentMonthCount
77 27 FROM crm_contract
78 28 WHERE deleted = 0
79 29 AND audit_status = 20
... ... @@ -83,46 +33,14 @@
83 33 </foreach>
84 34 AND (DATE_FORMAT(order_date, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')
85 35 or DATE_FORMAT(order_date, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')-1)
86   - GROUP BY time)y ON t.time = y.time
87   - LEFT JOIN
88   - (SELECT
89   - IFNULL(SUM(total_price), 0) AS lastYearCount,
90   - DATE_FORMAT(DATE_ADD(order_date,INTERVAL 1 YEAR), '%Y-%m') AS time
91   - FROM crm_contract
92   - WHERE deleted = 0
93   - AND audit_status = 20
94   - AND owner_user_id in
95   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
96   - #{userId}
97   - </foreach>
98   - AND DATE_FORMAT(order_date, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')-1
99   - GROUP BY time)z ON t.time = z.time
  36 + GROUP BY time
100 37 </select>
101 38  
102 39 <select id="selectReceivablePricePerformance"
103 40 resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO">
104 41 SELECT
105   - t.time as time,
106   - COALESCE(t.currentMonthCount,0) as currentMonthCount,
107   - COALESCE(y.lastMonthCount,0) as lastMonthCount,
108   - COALESCE(z.lastYearCount,0) as lastYearCount
109   - FROM
110   - (SELECT
111   - IFNULL(SUM(price), 0) AS currentMonthCount,
112   - DATE_FORMAT(return_time, '%Y-%m') AS time
113   - FROM crm_receivable
114   - WHERE deleted = 0
115   - AND audit_status = 20
116   - AND owner_user_id in
117   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
118   - #{userId}
119   - </foreach>
120   - AND DATE_FORMAT(return_time, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')
121   - GROUP BY time)t
122   - LEFT JOIN
123   - (SELECT
124   - IFNULL(SUM(price), 0) AS lastMonthCount,
125   - DATE_FORMAT(DATE_ADD(return_time,INTERVAL 1 MONTH), '%Y-%m') AS time
  42 + DATE_FORMAT(return_time, '%Y%m') AS time,
  43 + IFNULL(SUM(price), 0) AS currentMonthCount
126 44 FROM crm_receivable
127 45 WHERE deleted = 0
128 46 AND audit_status = 20
... ... @@ -132,21 +50,7 @@
132 50 </foreach>
133 51 AND (DATE_FORMAT(return_time, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')
134 52 or DATE_FORMAT(return_time, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')-1)
135   - GROUP BY time)y ON t.time = y.time
136   - LEFT JOIN
137   - (SELECT
138   - IFNULL(SUM(price), 0) AS lastYearCount,
139   - DATE_FORMAT(DATE_ADD(return_time,INTERVAL 1 YEAR), '%Y-%m') AS time
140   - FROM crm_receivable
141   - WHERE deleted = 0
142   - AND audit_status = 20
143   - AND owner_user_id in
144   - <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
145   - #{userId}
146   - </foreach>
147   - AND DATE_FORMAT(return_time, '%Y') = DATE_FORMAT(#{times[0],javaType=java.time.LocalDateTime},'%Y')-1
148   - GROUP BY time)z ON t.time = z.time
  53 + GROUP BY time
149 54 </select>
150 55  
151   -
152 56 </mapper>
... ...