Commit 46e01e07a896be55310fdca7192f71ef01ec7aaf

Authored by 安浩浩
1 parent acb8d3f2

修改:CRM 商业智能,合并模块到 crm,优化查询

Showing 33 changed files with 197 additions and 634 deletions
yudao-module-crm/pom.xml
@@ -10,8 +10,6 @@ @@ -10,8 +10,6 @@
10 <modules> 10 <modules>
11 <module>yudao-module-crm-api</module> 11 <module>yudao-module-crm-api</module>
12 <module>yudao-module-crm-biz</module> 12 <module>yudao-module-crm-biz</module>
13 - <module>yudao-module-bi-biz</module>  
14 - <module>yudao-module-bi-api</module>  
15 </modules> 13 </modules>
16 <modelVersion>4.0.0</modelVersion> 14 <modelVersion>4.0.0</modelVersion>
17 <artifactId>yudao-module-crm</artifactId> 15 <artifactId>yudao-module-crm</artifactId>
yudao-module-crm/yudao-module-bi-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-bi-api</artifactId>  
12 -  
13 - <name>${project.artifactId}</name>  
14 - <description>  
15 - bi 模块 API,暴露给其它模块调用  
16 - </description>  
17 -  
18 - <dependencies>  
19 - <dependency>  
20 - <groupId>cn.iocoder.boot</groupId>  
21 - <artifactId>yudao-module-system-api</artifactId>  
22 - <version>${revision}</version>  
23 - </dependency>  
24 - <dependency>  
25 - <groupId>cn.iocoder.boot</groupId>  
26 - <artifactId>yudao-module-crm-api</artifactId>  
27 - <version>${revision}</version>  
28 - </dependency>  
29 -  
30 - <!-- 业务组件 -->  
31 - <dependency>  
32 - <groupId>cn.iocoder.boot</groupId>  
33 - <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>  
34 - </dependency>  
35 - <dependency>  
36 - <groupId>cn.iocoder.boot</groupId>  
37 - <artifactId>yudao-spring-boot-starter-biz-ip</artifactId>  
38 - </dependency>  
39 -  
40 - <!-- Web 相关 -->  
41 - <dependency>  
42 - <groupId>cn.iocoder.boot</groupId>  
43 - <artifactId>yudao-spring-boot-starter-web</artifactId>  
44 - </dependency>  
45 -  
46 - <dependency>  
47 - <groupId>cn.iocoder.boot</groupId>  
48 - <artifactId>yudao-spring-boot-starter-security</artifactId>  
49 - </dependency>  
50 -  
51 - <!-- DB 相关 -->  
52 - <dependency>  
53 - <groupId>cn.iocoder.boot</groupId>  
54 - <artifactId>yudao-spring-boot-starter-mybatis</artifactId>  
55 - </dependency>  
56 -  
57 - <!-- 工具类相关 -->  
58 - <dependency>  
59 - <groupId>cn.iocoder.boot</groupId>  
60 - <artifactId>yudao-spring-boot-starter-excel</artifactId>  
61 - </dependency>  
62 - <dependency>  
63 - <groupId>cn.iocoder.boot</groupId>  
64 - <artifactId>yudao-spring-boot-starter-biz-dict</artifactId>  
65 - </dependency>  
66 -  
67 - <!-- Test 测试相关 -->  
68 - <dependency>  
69 - <groupId>cn.iocoder.boot</groupId>  
70 - <artifactId>yudao-spring-boot-starter-test</artifactId>  
71 - </dependency>  
72 - </dependencies>  
73 -</project>  
74 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-bi-api/src/main/java/cn/iocoder/yudao/module/bi/api/package-info.java deleted
1 -package cn.iocoder.yudao.module.bi.api;  
2 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-bi-api/src/main/java/cn/iocoder/yudao/module/bi/enums/package-info.java deleted
1 -package cn.iocoder.yudao.module.bi.enums;  
2 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-bi-biz/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-bi-biz</artifactId>  
12 -  
13 - <name>${project.artifactId}</name>  
14 - <description>  
15 - crm 包下,商业智能(Business Intelligence)。  
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-crm-api</artifactId>  
28 - <version>${revision}</version>  
29 - </dependency>  
30 -  
31 - <!-- 业务组件 -->  
32 - <dependency>  
33 - <groupId>cn.iocoder.boot</groupId>  
34 - <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>  
35 - </dependency>  
36 - <dependency>  
37 - <groupId>cn.iocoder.boot</groupId>  
38 - <artifactId>yudao-spring-boot-starter-biz-ip</artifactId>  
39 - </dependency>  
40 -  
41 - <!-- Web 相关 -->  
42 - <dependency>  
43 - <groupId>cn.iocoder.boot</groupId>  
44 - <artifactId>yudao-spring-boot-starter-web</artifactId>  
45 - </dependency>  
46 -  
47 - <dependency>  
48 - <groupId>cn.iocoder.boot</groupId>  
49 - <artifactId>yudao-spring-boot-starter-security</artifactId>  
50 - </dependency>  
51 -  
52 - <!-- DB 相关 -->  
53 - <dependency>  
54 - <groupId>cn.iocoder.boot</groupId>  
55 - <artifactId>yudao-spring-boot-starter-mybatis</artifactId>  
56 - </dependency>  
57 -  
58 - <!-- 工具类相关 -->  
59 - <dependency>  
60 - <groupId>cn.iocoder.boot</groupId>  
61 - <artifactId>yudao-spring-boot-starter-excel</artifactId>  
62 - </dependency>  
63 - <dependency>  
64 - <groupId>cn.iocoder.boot</groupId>  
65 - <artifactId>yudao-spring-boot-starter-biz-dict</artifactId>  
66 - </dependency>  
67 -  
68 - <!-- Test 测试相关 -->  
69 - <dependency>  
70 - <groupId>cn.iocoder.boot</groupId>  
71 - <artifactId>yudao-spring-boot-starter-test</artifactId>  
72 - </dependency>  
73 - </dependencies>  
74 -</project>  
75 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/controller/admin/ranking/vo/BiContractRanKingRespVO.java deleted
1 -package cn.iocoder.yudao.module.bi.controller.admin.ranking.vo;  
2 -  
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.Data;  
5 -  
6 -// TODO @anhaohao:VO 类有 swagger 注解,不写注释哈  
7 -/**  
8 - * 管理后台 - BI 排行榜 Response VO  
9 - *  
10 - * @author anhaohao  
11 - */  
12 -@Schema(description = "管理后台 - BI 合同金额排行榜 Response VO")  
13 -@Data  
14 -public class BiContractRanKingRespVO {  
15 -  
16 - // TODO @anhaohao:如果一定返回的字段,需要加 requiredMode = Schema.RequiredMode.REQUIRED, 哈  
17 - @Schema(description = "金额", example = "1")  
18 - private Integer price;  
19 -  
20 - @Schema(description = "姓名", example = "1")  
21 - private String nickname;  
22 -  
23 - @Schema(description = "部门名称", example = "1")  
24 - private String deptName;  
25 -  
26 -}  
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/controller/admin/ranking/vo/BiReceivablesRanKingRespVO.java deleted
1 -package cn.iocoder.yudao.module.bi.controller.admin.ranking.vo;  
2 -  
3 -import io.swagger.v3.oas.annotations.media.Schema;  
4 -import lombok.Data;  
5 -  
6 -// TODO @anhaohao:参考 BiContractRanKingRespVO 的建议  
7 -/**  
8 - * 管理后台 - BI 排行榜 Response VO  
9 - *  
10 - * @author anhaohao  
11 - */  
12 -@Schema(description = "管理后台 - BI 合同金额排行榜 Response VO")  
13 -@Data  
14 -public class BiReceivablesRanKingRespVO {  
15 -  
16 - @Schema(description = "金额", example = "100")  
17 - private Integer price;  
18 -  
19 - @Schema(description = "姓名", example = "张三")  
20 - private String nickname;  
21 -  
22 - @Schema(description = "部门名称", example = "研发部")  
23 - private String deptName;  
24 -  
25 -}  
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/controller/package-info.java deleted
1 -/**  
2 - * 提供 RESTful API 给前端:  
3 - * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目  
4 - * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分  
5 - */  
6 -package cn.iocoder.yudao.module.bi.controller;  
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/framework/package-info.java deleted
1 -/**  
2 - * 属于 bi 模块的 framework 封装  
3 - *  
4 - * @author 芋道源码  
5 - */  
6 -package cn.iocoder.yudao.module.bi.framework;  
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/framework/web/config/BiWebConfiguration.java deleted
1 -package cn.iocoder.yudao.module.bi.framework.web.config;  
2 -  
3 -import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;  
4 -import org.springdoc.core.models.GroupedOpenApi;  
5 -import org.springframework.context.annotation.Bean;  
6 -import org.springframework.context.annotation.Configuration;  
7 -  
8 -/**  
9 - * bi 模块的 web 组件的 Configuration  
10 - *  
11 - * @author 芋道源码  
12 - */  
13 -@Configuration(proxyBeanMethods = false)  
14 -public class BiWebConfiguration {  
15 -  
16 - /**  
17 - * bi 模块的 API 分组  
18 - */  
19 - @Bean  
20 - public GroupedOpenApi biGroupedOpenApi() {  
21 - return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("bi");  
22 - }  
23 -  
24 -}  
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/framework/web/package-info.java deleted
1 -/**  
2 - * bi 模块的 web 配置  
3 - */  
4 -package cn.iocoder.yudao.module.bi.framework.web;  
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/package-info.java deleted
1 -/**  
2 - * crm 包下,商业智能(Business Intelligence)。  
3 - * 例如说:报表、图表、数据分析等等  
4 - * <p>  
5 - * 1. Controller URL:以 /bi/ 开头,避免和其它 Module 冲突  
6 - *  
7 - * TODO @anhaohao:mall 当时独立拆分一个 statistics 模块的原因,是因为 mall 拆分了多个模块,没有模块适合承接统计的能力,所以独立了。  
8 - * TODO crm 因为没有拆分,所以可以直接放在 crm 模块下面;这样,我们可以在 controller/admin 和 service 下,新建一个 bi 包,专门放置统计的代码。  
9 - */  
10 -package cn.iocoder.yudao.module.bi;  
11 \ No newline at end of file 0 \ No newline at end of file
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/service/ranking/BiRankingServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.bi.service.ranking;  
2 -  
3 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiContractRanKingRespVO;  
4 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiParams;  
5 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiRankReqVO;  
6 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiReceivablesRanKingRespVO;  
7 -import cn.iocoder.yudao.module.bi.dal.mysql.BiRankingMapper;  
8 -import cn.iocoder.yudao.module.bi.util.BiTimeUtil;  
9 -import jakarta.annotation.Resource;  
10 -import org.springframework.stereotype.Service;  
11 -import org.springframework.validation.annotation.Validated;  
12 -  
13 -import java.util.ArrayList;  
14 -import java.util.List;  
15 -  
16 -/**  
17 - * @author anhaohao  
18 - */  
19 -@Service(value = "biRankService")  
20 -@Validated  
21 -public class BiRankingServiceImpl implements BiRankingService {  
22 -  
23 - @Resource  
24 - private BiRankingMapper biRankingMapper;  
25 -  
26 - @Override  
27 - public List<BiContractRanKingRespVO> contractRanKing(BiRankReqVO biRankReqVO) {  
28 - BiParams biParams = new BiParams();  
29 - biParams.setType(biRankReqVO.getType());  
30 - biParams.setDeptId(biRankReqVO.getDeptId());  
31 - biParams.setIsUser(0);  
32 - BiTimeUtil.BiTimeEntity biTimeEntity = BiTimeUtil.analyzeType(biParams);  
33 - List<Long> userIds = biTimeEntity.getUserIds();  
34 - if (userIds.isEmpty()) {  
35 - return new ArrayList<>();  
36 - }  
37 - return biRankingMapper.contractRanKing(biTimeEntity);  
38 - }  
39 -  
40 - @Override  
41 - public List<BiReceivablesRanKingRespVO> receivablesRanKing(BiRankReqVO biRankReqVO) {  
42 - BiParams biParams = new BiParams();  
43 - biParams.setType(biRankReqVO.getType());  
44 - biParams.setDeptId(biRankReqVO.getDeptId());  
45 - biParams.setIsUser(0);  
46 - BiTimeUtil.BiTimeEntity biTimeEntity = BiTimeUtil.analyzeType(biParams);  
47 - List<Long> userIds = biTimeEntity.getUserIds();  
48 - if (userIds.isEmpty()) {  
49 - return new ArrayList<>();  
50 - }  
51 - return biRankingMapper.receivablesRanKing(biTimeEntity);  
52 - }  
53 -}  
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/util/BiTimeUtil.java deleted
1 -package cn.iocoder.yudao.module.bi.util;  
2 -  
3 -import cn.hutool.core.date.DateUnit;  
4 -import cn.hutool.core.date.DateUtil;  
5 -import cn.hutool.core.util.StrUtil;  
6 -import cn.hutool.extra.spring.SpringUtil;  
7 -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;  
8 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiParams;  
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 lombok.Data;  
14 -import lombok.experimental.Accessors;  
15 -  
16 -import java.util.ArrayList;  
17 -import java.util.Date;  
18 -import java.util.List;  
19 -  
20 -/**  
21 - * bi时间工具类  
22 - *  
23 - * @author anhaohao  
24 - */  
25 -public class BiTimeUtil {  
26 -  
27 - public static BiTimeEntity analyzeType(BiParams biParams) {  
28 - // 解析时间  
29 - BiTimeEntity biTimeEntity = analyzeTime(biParams);  
30 - // 解析权限  
31 - // TODO @anhaohao:涉及到数据的读取,不放在 Util 里,还是搞会到 Service 哈;  
32 - biTimeEntity.setUserIds(analyzeAuth(biParams));  
33 - return biTimeEntity;  
34 - }  
35 -  
36 - /**  
37 - * 解析权限  
38 - *  
39 - * @param biParams bi参数  
40 - * @return List<Long>  
41 - */  
42 - public static List<Long> analyzeAuth(BiParams biParams) {  
43 - List<Long> userIdList = new ArrayList<>();  
44 - Long deptId = biParams.getDeptId();  
45 - Long userId = biParams.getUserId();  
46 - Integer isUser = biParams.getIsUser();  
47 - // 获取部门和用户的api  
48 - DeptApi deptApi = SpringUtil.getBean("deptApiImpl");  
49 - AdminUserApi adminUserApi = SpringUtil.getBean("adminUserApiImpl");  
50 - // 0.部门 1.用户  
51 - if (isUser == 0) {  
52 - if (deptId == null) {  
53 - deptId = adminUserApi.getUser(SecurityFrameworkUtils.getLoginUserId()).getDeptId();  
54 - }  
55 - List<DeptRespDTO> childDeptList = deptApi.getChildDeptList(deptId);  
56 - List<Long> deptIds = new ArrayList<>();  
57 - deptIds.add(deptId);  
58 - if (childDeptList != null && !childDeptList.isEmpty()) {  
59 - for (DeptRespDTO deptRespDTO : childDeptList) {  
60 - deptIds.add(deptRespDTO.getId());  
61 - }  
62 - }  
63 - // 获取部门下的用户  
64 - adminUserApi.getUserListByDeptIds(deptIds).forEach(adminUserRespDTO -> userIdList.add(adminUserRespDTO.getId()));  
65 - } else {  
66 - if (userId == null) {  
67 - List<AdminUserRespDTO> userListBySubordinate = adminUserApi.getUserListBySubordinate(SecurityFrameworkUtils.getLoginUserId());  
68 - userListBySubordinate.forEach(adminUserRespDTO -> userIdList.add(adminUserRespDTO.getId()));  
69 - } else {  
70 - userIdList.add(userId);  
71 - }  
72 - }  
73 - return userIdList;  
74 - }  
75 -  
76 -  
77 - /**  
78 - * 解析时间  
79 - *  
80 - * @param biParams bi参数  
81 - * @return BiTimeEntity  
82 - */  
83 - public static BiTimeEntity analyzeTime(BiParams biParams) {  
84 - Date beginDate = DateUtil.date();  
85 - Date endDate = DateUtil.date();  
86 - int cycleNum = 12;  
87 - String sqlDateFormat = "%Y%m";  
88 - String dateFormat = "yyyyMM";  
89 - String type = biParams.getType();  
90 - String startTime = biParams.getStartTime();  
91 - String endTime = biParams.getEndTime();  
92 - if (StrUtil.isNotEmpty(type)) {  
93 - //1.今天 2.昨天 3.本周 4.上周 5.本月 6.上月 7.本季度 8.上季度 9.本年 10 上年  
94 - switch (type) {  
95 - case "1":  
96 - beginDate = DateUtil.beginOfDay(DateUtil.date());  
97 - endDate = DateUtil.endOfDay(DateUtil.date());  
98 - sqlDateFormat = "%Y%m%d";  
99 - dateFormat = "yyyyMMdd";  
100 - cycleNum = 1;  
101 - break;  
102 - case "2":  
103 - beginDate = DateUtil.beginOfDay(new Date(System.currentTimeMillis() - 86400000));  
104 - endDate = DateUtil.endOfDay(new Date(System.currentTimeMillis() - 86400000));  
105 - sqlDateFormat = "%Y%m%d";  
106 - dateFormat = "yyyyMMdd";  
107 - cycleNum = 1;  
108 - break;  
109 - case "3":  
110 - beginDate = DateUtil.beginOfWeek(DateUtil.date());  
111 - endDate = DateUtil.endOfWeek(DateUtil.date());  
112 - sqlDateFormat = "%Y%m%d";  
113 - dateFormat = "yyyyMMdd";  
114 - cycleNum = 7;  
115 - break;  
116 - case "4":  
117 - beginDate = DateUtil.beginOfWeek(DateUtil.offsetWeek(DateUtil.date(), -1));  
118 - endDate = DateUtil.endOfWeek(DateUtil.offsetWeek(DateUtil.date(), -1));  
119 - sqlDateFormat = "%Y%m%d";  
120 - dateFormat = "yyyyMMdd";  
121 - cycleNum = 7;  
122 - break;  
123 - case "5":  
124 - beginDate = DateUtil.beginOfMonth(DateUtil.date());  
125 - endDate = DateUtil.endOfMonth(DateUtil.date());  
126 - sqlDateFormat = "%Y%m%d";  
127 - dateFormat = "yyyyMMdd";  
128 - cycleNum = (int) DateUtil.between(beginDate, endDate, DateUnit.DAY) + 1;  
129 - break;  
130 - case "6":  
131 - beginDate = DateUtil.beginOfMonth(DateUtil.offsetMonth(DateUtil.date(), -1));  
132 - endDate = DateUtil.endOfMonth(DateUtil.offsetMonth(DateUtil.date(), -1));  
133 - sqlDateFormat = "%Y%m%d";  
134 - dateFormat = "yyyyMMdd";  
135 - cycleNum = (int) DateUtil.between(beginDate, endDate, DateUnit.DAY) + 1;  
136 - break;  
137 - case "7":  
138 - beginDate = DateUtil.beginOfQuarter(DateUtil.date());  
139 - endDate = DateUtil.endOfQuarter(DateUtil.date());  
140 - cycleNum = 3;  
141 - break;  
142 - case "8":  
143 - beginDate = DateUtil.beginOfQuarter(DateUtil.offsetMonth(DateUtil.date(), -3));  
144 - endDate = DateUtil.endOfQuarter(DateUtil.offsetMonth(DateUtil.date(), -3));  
145 - cycleNum = 3;  
146 - break;  
147 - case "9":  
148 - beginDate = DateUtil.beginOfYear(DateUtil.date());  
149 - endDate = DateUtil.endOfYear(DateUtil.date());  
150 - break;  
151 - case "10":  
152 - beginDate = DateUtil.beginOfYear(DateUtil.offsetMonth(DateUtil.date(), -12));  
153 - endDate = DateUtil.endOfYear(DateUtil.offsetMonth(DateUtil.date(), -12));  
154 - break;  
155 - default:  
156 - break;  
157 - }  
158 - } else if (StrUtil.isNotEmpty(startTime) && StrUtil.isNotEmpty(endTime)) {  
159 - Date start;  
160 - Date end;  
161 - if (startTime.length() == 6) {  
162 - start = DateUtil.parse(startTime, "yyyyMM");  
163 - end = DateUtil.endOfMonth(DateUtil.parse(endTime, "yyyyMM"));  
164 - } else {  
165 - start = DateUtil.parse(startTime);  
166 - end = DateUtil.parse(endTime);  
167 - }  
168 - Integer startMonth = Integer.valueOf(DateUtil.format(start, "yyyyMM"));  
169 - int endMonth = Integer.parseInt(DateUtil.format(end, "yyyyMM"));  
170 - if (startMonth.equals(endMonth)) {  
171 - sqlDateFormat = "%Y%m%d";  
172 - dateFormat = "yyyyMMdd";  
173 - long diffDay = DateUtil.between(start, end, DateUnit.DAY);  
174 - cycleNum = (int) diffDay + 1;  
175 - } else {  
176 - sqlDateFormat = "%Y%m";  
177 - dateFormat = "yyyyMM";  
178 - int diffYear = Integer.parseInt(Integer.toString(endMonth).substring(0, 4)) - Integer.parseInt(startMonth.toString().substring(0, 4));  
179 - int diffMonth = endMonth % 100 - startMonth % 100 + 1;  
180 - cycleNum = diffYear * 12 + diffMonth;  
181 - }  
182 - beginDate = start;  
183 - endDate = end;  
184 - }  
185 - Integer beginTime = Integer.valueOf(DateUtil.format(beginDate, dateFormat));  
186 - Integer finalTime = Integer.valueOf(DateUtil.format(endDate, dateFormat));  
187 - return new BiTimeEntity(sqlDateFormat, dateFormat, beginDate, endDate, cycleNum, beginTime, finalTime, new ArrayList<>());  
188 - }  
189 -  
190 - @Data  
191 - @Accessors(chain = true)  
192 - public static class BiTimeEntity {  
193 - /**  
194 - * sql日期格式化  
195 - */  
196 - private String sqlDateFormat;  
197 -  
198 - /**  
199 - * 日期格式化  
200 - */  
201 - private String dateFormat;  
202 -  
203 - /**  
204 - * 开始时间  
205 - */  
206 - private Date beginDate;  
207 -  
208 - /**  
209 - * 结束时间  
210 - */  
211 - private Date endDate;  
212 -  
213 - /**  
214 - * 周期  
215 - */  
216 - private Integer cycleNum;  
217 -  
218 - /**  
219 - * 开始时间 字符串格式 如20200101  
220 - */  
221 - private Integer beginTime;  
222 -  
223 - /**  
224 - * 结束时间 字符串格式 如20200101  
225 - */  
226 - private Integer finalTime;  
227 -  
228 - /**  
229 - * user列表  
230 - */  
231 - private List<Long> userIds = new ArrayList<>();  
232 - private Integer page;  
233 - private Integer limit;  
234 -  
235 - public BiTimeEntity(String sqlDateFormat, String dateFormat, Date beginDate, Date endDate, Integer cycleNum, Integer beginTime, Integer finalTime, List<Long> userIds) {  
236 - this.sqlDateFormat = sqlDateFormat;  
237 - this.dateFormat = dateFormat;  
238 - this.beginDate = beginDate;  
239 - this.endDate = endDate;  
240 - this.cycleNum = cycleNum;  
241 - this.beginTime = beginTime;  
242 - this.finalTime = finalTime;  
243 - this.userIds = userIds;  
244 - }  
245 -  
246 - public BiTimeEntity() {  
247 - }  
248 -  
249 - }  
250 -}  
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/controller/admin/ranking/BiRankingController.http renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/bi/BiRankingController.http
1 ### 合同金额排行榜 1 ### 合同金额排行榜
2 -GET {{baseUrl}}/bi/rank/contract-ranKing 2 +GET {{baseUrl}}/crm/bi-ranking/contract-ranKing
3 Authorization: Bearer {{token}} 3 Authorization: Bearer {{token}}
4 tenant-id: {{adminTenentId}} 4 tenant-id: {{adminTenentId}}
5 5
6 ### 回款金额排行榜 6 ### 回款金额排行榜
7 -GET {{baseUrl}}/bi/rank/receivables-ranKing 7 +GET {{baseUrl}}/crm/bi-ranking/receivables-ranKing
8 Authorization: Bearer {{token}} 8 Authorization: Bearer {{token}}
9 tenant-id: {{adminTenentId}} 9 tenant-id: {{adminTenentId}}
10 \ No newline at end of file 10 \ No newline at end of file
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/controller/admin/ranking/BiRankingController.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/bi/BiRankingController.java
1 -package cn.iocoder.yudao.module.bi.controller.admin.ranking; 1 +package cn.iocoder.yudao.module.crm.controller.admin.bi;
  2 +
2 3
3 4
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiContractRanKingRespVO;  
6 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiRankReqVO;  
7 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiReceivablesRanKingRespVO;  
8 -import cn.iocoder.yudao.module.bi.service.ranking.BiRankingService; 6 +import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRankingReqVO;
  8 +import cn.iocoder.yudao.module.crm.service.bi.BiRankingService;
9 import io.swagger.v3.oas.annotations.Operation; 9 import io.swagger.v3.oas.annotations.Operation;
10 import io.swagger.v3.oas.annotations.tags.Tag; 10 import io.swagger.v3.oas.annotations.tags.Tag;
11 import jakarta.annotation.Resource; 11 import jakarta.annotation.Resource;
@@ -19,13 +19,10 @@ import java.util.List; @@ -19,13 +19,10 @@ import java.util.List;
19 19
20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
21 21
22 -// TODO @anhaohao:写了 swagger 注解,不写注释哈  
23 -/**  
24 - * @author anhaohao  
25 - */ 22 +
26 @Tag(name = "管理后台 - 排行榜") 23 @Tag(name = "管理后台 - 排行榜")
27 @RestController 24 @RestController
28 -@RequestMapping("/bi/ranking") 25 +@RequestMapping("/crm/bi-ranking")
29 @Validated 26 @Validated
30 public class BiRankingController { 27 public class BiRankingController {
31 28
@@ -38,8 +35,8 @@ public class BiRankingController { @@ -38,8 +35,8 @@ public class BiRankingController {
38 @GetMapping("/contract-ranking") 35 @GetMapping("/contract-ranking")
39 @Operation(summary = "合同金额排行榜") 36 @Operation(summary = "合同金额排行榜")
40 @PreAuthorize("@ss.hasPermission('bi:ranking:query')") 37 @PreAuthorize("@ss.hasPermission('bi:ranking:query')")
41 - public CommonResult<List<BiContractRanKingRespVO>> contractAmountRanking(BiRankReqVO biRankReqVO) {  
42 - return success(biRankingService.contractRanKing(biRankReqVO)); 38 + public CommonResult<List<BiRanKingRespVO>> contractAmountRanking(BiRankingReqVO biRankingReqVO) {
  39 + return success(biRankingService.contractRanKing(biRankingReqVO));
43 } 40 }
44 41
45 /** 42 /**
@@ -48,8 +45,8 @@ public class BiRankingController { @@ -48,8 +45,8 @@ public class BiRankingController {
48 @GetMapping("/receivables-ranking") 45 @GetMapping("/receivables-ranking")
49 @Operation(summary = "回款金额排行榜") 46 @Operation(summary = "回款金额排行榜")
50 @PreAuthorize("@ss.hasPermission('bi:ranking:query')") 47 @PreAuthorize("@ss.hasPermission('bi:ranking:query')")
51 - public CommonResult<List<BiReceivablesRanKingRespVO>> receivablesRanKing(BiRankReqVO biRankReqVO) {  
52 - return success(biRankingService.receivablesRanKing(biRankReqVO)); 48 + public CommonResult<List<BiRanKingRespVO>> receivablesRanKing(BiRankingReqVO biRankingReqVO) {
  49 + return success(biRankingService.receivablesRanKing(biRankingReqVO));
53 } 50 }
54 51
55 } 52 }
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/controller/admin/ranking/vo/BiParams.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/bi/vo/BiParams.java
1 -package cn.iocoder.yudao.module.bi.controller.admin.ranking.vo; 1 +package cn.iocoder.yudao.module.crm.controller.admin.bi.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.EqualsAndHashCode; 6 import lombok.EqualsAndHashCode;
7 7
8 -import java.util.List;  
9 -  
10 // TODO @anhaohao:这个类的命名,还是保持和其它一致使用 ReqVO 结尾;例如说,CrmStatisticsCommonParamReqVO 8 // TODO @anhaohao:这个类的命名,还是保持和其它一致使用 ReqVO 结尾;例如说,CrmStatisticsCommonParamReqVO
11 /** 9 /**
12 * @author anhaohao 10 * @author anhaohao
@@ -23,9 +21,6 @@ public class BiParams extends PageParam { @@ -23,9 +21,6 @@ public class BiParams extends PageParam {
23 @Schema(description = "用户ID") 21 @Schema(description = "用户ID")
24 private Long userId; 22 private Long userId;
25 23
26 - @Schema(description = "用户IDs")  
27 - private List<Long> userIds;  
28 -  
29 // TODO @anhaohao:这个字段,可以融合到 startTime、endTime 里去,交给前端计算哈; 24 // TODO @anhaohao:这个字段,可以融合到 startTime、endTime 里去,交给前端计算哈;
30 @Schema(description = "类型") 25 @Schema(description = "类型")
31 private String type; 26 private String type;
@@ -37,8 +32,4 @@ public class BiParams extends PageParam { @@ -37,8 +32,4 @@ public class BiParams extends PageParam {
37 @Schema(description = "结束时间") 32 @Schema(description = "结束时间")
38 private String endTime; 33 private String endTime;
39 34
40 - // TODO @anhaohao:这个字段,是不是直接只基于 deptId 和 userId 来判断即可哈?  
41 - @Schema(description = "0 部门 1员工")  
42 - private Integer isUser = 1;  
43 -  
44 } 35 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/bi/vo/BiRanKingRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.bi.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +
  7 +@Schema(description = "管理后台 - BI 排行榜 Response VO")
  8 +@Data
  9 +public class BiRanKingRespVO {
  10 +
  11 + @Schema(description = "金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  12 + private Integer price;
  13 +
  14 + @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  15 + private String nickname;
  16 +
  17 + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  18 + private String deptName;
  19 +
  20 + @Schema(description = "负责人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  21 + private Long ownerUserId;
  22 +
  23 +}
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/controller/admin/ranking/vo/BiRankReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/bi/vo/BiRankingReqVO.java
1 -package cn.iocoder.yudao.module.bi.controller.admin.ranking.vo; 1 +package cn.iocoder.yudao.module.crm.controller.admin.bi.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +
  7 +import java.time.LocalDateTime;
  8 +import java.util.List;
  9 +
  10 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
5 11
6 /** 12 /**
7 * 管理后台 - 排行榜 Request VO 13 * 管理后台 - 排行榜 Request VO
@@ -10,13 +16,20 @@ import lombok.Data; @@ -10,13 +16,20 @@ import lombok.Data;
10 */ 16 */
11 @Schema(description = "管理后台 - 排行榜 Request VO") 17 @Schema(description = "管理后台 - 排行榜 Request VO")
12 @Data 18 @Data
13 -public class BiRankReqVO { 19 +public class BiRankingReqVO {
14 20
15 @Schema(description = "部门id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 21 @Schema(description = "部门id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
16 private Long deptId; 22 private Long deptId;
17 23
18 - // TODO @anhaohao:这个字段,参考 BiParams 的 type 建议  
19 - @Schema(description = "分析类型(1.今天 2.昨天 3.本周 4.上周 5.本月 6.上月 7.本季度 8.上季度 9.本年 10 上年)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
20 - private String type; 24 + @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-12-12 00:00:00")
  25 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  26 + private LocalDateTime startTime;
  27 +
  28 + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-12-12 23:59:59")
  29 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  30 + private LocalDateTime endTime;
  31 +
  32 + @Schema(description = "负责人用户 id 集合", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1")
  33 + private List<Long> userIds;
21 34
22 } 35 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java
@@ -22,6 +22,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; @@ -22,6 +22,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
22 import jakarta.annotation.Resource; 22 import jakarta.annotation.Resource;
23 import jakarta.servlet.http.HttpServletResponse; 23 import jakarta.servlet.http.HttpServletResponse;
24 import jakarta.validation.Valid; 24 import jakarta.validation.Valid;
  25 +import org.springframework.context.annotation.Lazy;
25 import org.springframework.security.access.prepost.PreAuthorize; 26 import org.springframework.security.access.prepost.PreAuthorize;
26 import org.springframework.validation.annotation.Validated; 27 import org.springframework.validation.annotation.Validated;
27 import org.springframework.web.bind.annotation.*; 28 import org.springframework.web.bind.annotation.*;
@@ -44,6 +45,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @@ -44,6 +45,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
44 public class CrmContractController { 45 public class CrmContractController {
45 46
46 @Resource 47 @Resource
  48 + @Lazy
47 private CrmContractService contractService; 49 private CrmContractService contractService;
48 @Resource 50 @Resource
49 private CrmCustomerService customerService; 51 private CrmCustomerService customerService;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/CrmReceivableController.java
@@ -26,6 +26,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; @@ -26,6 +26,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
26 import jakarta.annotation.Resource; 26 import jakarta.annotation.Resource;
27 import jakarta.servlet.http.HttpServletResponse; 27 import jakarta.servlet.http.HttpServletResponse;
28 import jakarta.validation.Valid; 28 import jakarta.validation.Valid;
  29 +import org.springframework.context.annotation.Lazy;
29 import org.springframework.security.access.prepost.PreAuthorize; 30 import org.springframework.security.access.prepost.PreAuthorize;
30 import org.springframework.validation.annotation.Validated; 31 import org.springframework.validation.annotation.Validated;
31 import org.springframework.web.bind.annotation.*; 32 import org.springframework.web.bind.annotation.*;
@@ -51,6 +52,7 @@ public class CrmReceivableController { @@ -51,6 +52,7 @@ public class CrmReceivableController {
51 @Resource 52 @Resource
52 private CrmReceivableService receivableService; 53 private CrmReceivableService receivableService;
53 @Resource 54 @Resource
  55 + @Lazy
54 private CrmContractService contractService; 56 private CrmContractService contractService;
55 @Resource 57 @Resource
56 private CrmCustomerService customerService; 58 private CrmCustomerService customerService;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/CrmReceivablePlanController.java
@@ -28,6 +28,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; @@ -28,6 +28,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
28 import jakarta.annotation.Resource; 28 import jakarta.annotation.Resource;
29 import jakarta.servlet.http.HttpServletResponse; 29 import jakarta.servlet.http.HttpServletResponse;
30 import jakarta.validation.Valid; 30 import jakarta.validation.Valid;
  31 +import org.springframework.context.annotation.Lazy;
31 import org.springframework.security.access.prepost.PreAuthorize; 32 import org.springframework.security.access.prepost.PreAuthorize;
32 import org.springframework.validation.annotation.Validated; 33 import org.springframework.validation.annotation.Validated;
33 import org.springframework.web.bind.annotation.*; 34 import org.springframework.web.bind.annotation.*;
@@ -55,6 +56,7 @@ public class CrmReceivablePlanController { @@ -55,6 +56,7 @@ public class CrmReceivablePlanController {
55 @Resource 56 @Resource
56 private CrmReceivableService receivableService; 57 private CrmReceivableService receivableService;
57 @Resource 58 @Resource
  59 + @Lazy
58 private CrmContractService contractService; 60 private CrmContractService contractService;
59 @Resource 61 @Resource
60 private CrmCustomerService customerService; 62 private CrmCustomerService customerService;
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/dal/mysql/BiRankingMapper.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/bi/BiRankingMapper.java
1 -package cn.iocoder.yudao.module.bi.dal.mysql; 1 +package cn.iocoder.yudao.module.crm.dal.mysql.bi;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiContractRanKingRespVO;  
5 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiReceivablesRanKingRespVO;  
6 -import cn.iocoder.yudao.module.bi.util.BiTimeUtil; 4 +import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRankingReqVO;
7 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
8 7
9 import java.util.List; 8 import java.util.List;
@@ -16,16 +15,17 @@ public interface BiRankingMapper extends BaseMapperX { @@ -16,16 +15,17 @@ public interface BiRankingMapper extends BaseMapperX {
16 /** 15 /**
17 * 合同金额排行榜 16 * 合同金额排行榜
18 * 17 *
19 - * @param biTimeEntity 参数 18 + * @param biRankingReqVO 参数
20 * @return List<BiContractAmountRankingRespVO> 19 * @return List<BiContractAmountRankingRespVO>
21 */ 20 */
22 - List<BiContractRanKingRespVO> contractRanKing(BiTimeUtil.BiTimeEntity biTimeEntity); 21 + List<BiRanKingRespVO> contractRanKing(BiRankingReqVO biRankingReqVO);
  22 +
23 23
24 /** 24 /**
25 * 回款金额排行榜 25 * 回款金额排行榜
26 * 26 *
27 - * @param biTimeEntity 参数 27 + * @param biRankingReqVO 参数
28 * @return List<BiContractAmountRankingRespVO> 28 * @return List<BiContractAmountRankingRespVO>
29 */ 29 */
30 - List<BiReceivablesRanKingRespVO> receivablesRanKing(BiTimeUtil.BiTimeEntity biTimeEntity); 30 + List<BiRanKingRespVO> receivablesRanKing(BiRankingReqVO biRankingReqVO);
31 } 31 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/operatelog/core/CrmContractParseFunction.java
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
6 import com.mzt.logapi.service.IParseFunction; 6 import com.mzt.logapi.service.IParseFunction;
7 import jakarta.annotation.Resource; 7 import jakarta.annotation.Resource;
8 import lombok.extern.slf4j.Slf4j; 8 import lombok.extern.slf4j.Slf4j;
  9 +import org.springframework.context.annotation.Lazy;
9 import org.springframework.stereotype.Component; 10 import org.springframework.stereotype.Component;
10 11
11 /** 12 /**
@@ -20,6 +21,7 @@ public class CrmContractParseFunction implements IParseFunction { @@ -20,6 +21,7 @@ public class CrmContractParseFunction implements IParseFunction {
20 public static final String NAME = "getContractById"; 21 public static final String NAME = "getContractById";
21 22
22 @Resource 23 @Resource
  24 + @Lazy
23 private CrmContractService contractService; 25 private CrmContractService contractService;
24 26
25 @Override 27 @Override
yudao-module-crm/yudao-module-bi-biz/src/main/java/cn/iocoder/yudao/module/bi/service/ranking/BiRankingService.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/bi/BiRankingService.java
1 -package cn.iocoder.yudao.module.bi.service.ranking; 1 +package cn.iocoder.yudao.module.crm.service.bi;
2 2
3 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiContractRanKingRespVO;  
4 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiRankReqVO;  
5 -import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiReceivablesRanKingRespVO; 3 +
  4 +import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRankingReqVO;
6 6
7 import java.util.List; 7 import java.util.List;
8 8
@@ -11,20 +11,21 @@ import java.util.List; @@ -11,20 +11,21 @@ import java.util.List;
11 * 11 *
12 * @author anhaohao 12 * @author anhaohao
13 */ 13 */
14 -public interface BiRankingService { // TODO @anhaohao:第一个方法,和类要有一个空行 14 +public interface BiRankingService {
  15 +
15 /** 16 /**
16 * 合同金额排行榜 17 * 合同金额排行榜
17 * 18 *
18 - * @param biRankReqVO 参数 19 + * @param biRankingReqVO 参数
19 * @return List<BiContractAmountRankingRespVO> 20 * @return List<BiContractAmountRankingRespVO>
20 */ 21 */
21 - List<BiContractRanKingRespVO> contractRanKing(BiRankReqVO biRankReqVO); 22 + List<BiRanKingRespVO> contractRanKing(BiRankingReqVO biRankingReqVO);
22 23
23 /** 24 /**
24 * 回款金额排行榜 25 * 回款金额排行榜
25 * 26 *
26 - * @param biRankReqVO 参数 27 + * @param biRankingReqVO 参数
27 * @return List<BiContractAmountRankingRespVO> 28 * @return List<BiContractAmountRankingRespVO>
28 */ 29 */
29 - List<BiReceivablesRanKingRespVO> receivablesRanKing(BiRankReqVO biRankReqVO); 30 + List<BiRanKingRespVO> receivablesRanKing(BiRankingReqVO biRankingReqVO);
30 } 31 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/bi/BiRankingServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.bi;
  2 +
  3 +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
  4 +
  5 +import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRankingReqVO;
  7 +import cn.iocoder.yudao.module.crm.dal.mysql.bi.BiRankingMapper;
  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.ArrayList;
  17 +import java.util.List;
  18 +import java.util.Map;
  19 +import java.util.function.Function;
  20 +import java.util.stream.Collectors;
  21 +
  22 +@Service(value = "biRankingService")
  23 +@Validated
  24 +public class BiRankingServiceImpl implements BiRankingService {
  25 +
  26 + @Resource
  27 + private BiRankingMapper biRankingMapper;
  28 + @Resource
  29 + private AdminUserApi adminUserApi;
  30 + @Resource
  31 + private DeptApi deptApi;
  32 +
  33 + @Override
  34 + public List<BiRanKingRespVO> contractRanKing(BiRankingReqVO biRankingReqVO) {
  35 + return processRanking(biRankingReqVO, biRankingMapper::contractRanKing);
  36 + }
  37 +
  38 + @Override
  39 + public List<BiRanKingRespVO> receivablesRanKing(BiRankingReqVO biRankingReqVO) {
  40 + return processRanking(biRankingReqVO, biRankingMapper::receivablesRanKing);
  41 + }
  42 +
  43 + /**
  44 + * 处理排行榜
  45 + *
  46 + * @param biRankingReqVO 参数
  47 + * @param rankingFunction 排行榜方法
  48 + * @return List<BiRanKingRespVO>
  49 + */
  50 + private List<BiRanKingRespVO> processRanking(BiRankingReqVO biRankingReqVO, Function<BiRankingReqVO, List<BiRanKingRespVO>> rankingFunction) {
  51 + analyzeAuth(biRankingReqVO);
  52 + if (biRankingReqVO.getUserIds().isEmpty()) {
  53 + return new ArrayList<>();
  54 + }
  55 + List<BiRanKingRespVO> biRanKingRespVOS = rankingFunction.apply(biRankingReqVO);
  56 + return setName(biRanKingRespVOS);
  57 + }
  58 +
  59 + /**
  60 + * 设置用户名称
  61 + *
  62 + * @param biRanKingRespVOS 排行榜数据
  63 + * @return List<BiRanKingRespVO>
  64 + */
  65 + private List<BiRanKingRespVO> setName(List<BiRanKingRespVO> biRanKingRespVOS) {
  66 + List<Long> userIds = biRanKingRespVOS.stream().map(BiRanKingRespVO::getOwnerUserId).collect(Collectors.toList());
  67 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
  68 + Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(userMap.values().stream().map(AdminUserRespDTO::getDeptId).collect(Collectors.toList()));
  69 + for (BiRanKingRespVO biRanKingRespVO : biRanKingRespVOS) {
  70 + AdminUserRespDTO adminUserRespDTO = userMap.get(biRanKingRespVO.getOwnerUserId());
  71 + if (adminUserRespDTO != null) {
  72 + biRanKingRespVO.setNickname(adminUserRespDTO.getNickname());
  73 + DeptRespDTO deptRespDTO = deptMap.get(adminUserRespDTO.getDeptId());
  74 + if (deptRespDTO != null) {
  75 + biRanKingRespVO.setDeptName(deptRespDTO.getName());
  76 + }
  77 + }
  78 + }
  79 + return biRanKingRespVOS;
  80 + }
  81 +
  82 + /**
  83 + * 分析权限
  84 + *
  85 + * @param biRankingReqVO 参数
  86 + */
  87 + public void analyzeAuth(BiRankingReqVO biRankingReqVO) {
  88 + Long deptId = biRankingReqVO.getDeptId() == null ? adminUserApi.getUser(SecurityFrameworkUtils.getLoginUserId()).getDeptId() : biRankingReqVO.getDeptId();
  89 + List<Long> deptIds = deptApi.getChildDeptList(deptId).stream().map(DeptRespDTO::getId).collect(Collectors.toList());
  90 + deptIds.add(deptId);
  91 + biRankingReqVO.setUserIds(adminUserApi.getUserListByDeptIds(deptIds).stream().map(AdminUserRespDTO::getId).collect(Collectors.toList()));
  92 + }
  93 +}
0 \ No newline at end of file 94 \ No newline at end of file
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
@@ -28,6 +28,7 @@ import com.mzt.logapi.context.LogRecordContext; @@ -28,6 +28,7 @@ import com.mzt.logapi.context.LogRecordContext;
28 import com.mzt.logapi.service.impl.DiffParseFunction; 28 import com.mzt.logapi.service.impl.DiffParseFunction;
29 import com.mzt.logapi.starter.annotation.LogRecord; 29 import com.mzt.logapi.starter.annotation.LogRecord;
30 import jakarta.annotation.Resource; 30 import jakarta.annotation.Resource;
  31 +import org.springframework.context.annotation.Lazy;
31 import org.springframework.stereotype.Service; 32 import org.springframework.stereotype.Service;
32 import org.springframework.transaction.annotation.Transactional; 33 import org.springframework.transaction.annotation.Transactional;
33 import org.springframework.validation.annotation.Validated; 34 import org.springframework.validation.annotation.Validated;
@@ -56,6 +57,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { @@ -56,6 +57,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
56 @Resource 57 @Resource
57 private CrmBusinessProductService businessProductService; 58 private CrmBusinessProductService businessProductService;
58 @Resource 59 @Resource
  60 + @Lazy
59 private CrmContractService contractService; 61 private CrmContractService contractService;
60 @Resource 62 @Resource
61 private CrmPermissionService permissionService; 63 private CrmPermissionService permissionService;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java
@@ -25,6 +25,7 @@ import com.mzt.logapi.context.LogRecordContext; @@ -25,6 +25,7 @@ import com.mzt.logapi.context.LogRecordContext;
25 import com.mzt.logapi.service.impl.DiffParseFunction; 25 import com.mzt.logapi.service.impl.DiffParseFunction;
26 import com.mzt.logapi.starter.annotation.LogRecord; 26 import com.mzt.logapi.starter.annotation.LogRecord;
27 import jakarta.annotation.Resource; 27 import jakarta.annotation.Resource;
  28 +import org.springframework.context.annotation.Lazy;
28 import org.springframework.stereotype.Service; 29 import org.springframework.stereotype.Service;
29 import org.springframework.transaction.annotation.Transactional; 30 import org.springframework.transaction.annotation.Transactional;
30 import org.springframework.validation.annotation.Validated; 31 import org.springframework.validation.annotation.Validated;
@@ -56,6 +57,7 @@ public class CrmContactServiceImpl implements CrmContactService { @@ -56,6 +57,7 @@ public class CrmContactServiceImpl implements CrmContactService {
56 @Resource 57 @Resource
57 private CrmPermissionService permissionService; 58 private CrmPermissionService permissionService;
58 @Resource 59 @Resource
  60 + @Lazy
59 private CrmContractService contractService; 61 private CrmContractService contractService;
60 @Resource 62 @Resource
61 private CrmContactBusinessService contactBusinessService; 63 private CrmContactBusinessService contactBusinessService;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivablePlanServiceImpl.java
@@ -24,6 +24,7 @@ import com.mzt.logapi.context.LogRecordContext; @@ -24,6 +24,7 @@ import com.mzt.logapi.context.LogRecordContext;
24 import com.mzt.logapi.service.impl.DiffParseFunction; 24 import com.mzt.logapi.service.impl.DiffParseFunction;
25 import com.mzt.logapi.starter.annotation.LogRecord; 25 import com.mzt.logapi.starter.annotation.LogRecord;
26 import jakarta.annotation.Resource; 26 import jakarta.annotation.Resource;
  27 +import org.springframework.context.annotation.Lazy;
27 import org.springframework.stereotype.Service; 28 import org.springframework.stereotype.Service;
28 import org.springframework.validation.annotation.Validated; 29 import org.springframework.validation.annotation.Validated;
29 30
@@ -49,6 +50,7 @@ public class CrmReceivablePlanServiceImpl implements CrmReceivablePlanService { @@ -49,6 +50,7 @@ public class CrmReceivablePlanServiceImpl implements CrmReceivablePlanService {
49 private CrmReceivablePlanMapper receivablePlanMapper; 50 private CrmReceivablePlanMapper receivablePlanMapper;
50 51
51 @Resource 52 @Resource
  53 + @Lazy
52 private CrmContractService contractService; 54 private CrmContractService contractService;
53 @Resource 55 @Resource
54 private CrmCustomerService customerService; 56 private CrmCustomerService customerService;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java
@@ -27,6 +27,7 @@ import com.mzt.logapi.context.LogRecordContext; @@ -27,6 +27,7 @@ import com.mzt.logapi.context.LogRecordContext;
27 import com.mzt.logapi.service.impl.DiffParseFunction; 27 import com.mzt.logapi.service.impl.DiffParseFunction;
28 import com.mzt.logapi.starter.annotation.LogRecord; 28 import com.mzt.logapi.starter.annotation.LogRecord;
29 import jakarta.annotation.Resource; 29 import jakarta.annotation.Resource;
  30 +import org.springframework.context.annotation.Lazy;
30 import org.springframework.stereotype.Service; 31 import org.springframework.stereotype.Service;
31 import org.springframework.validation.annotation.Validated; 32 import org.springframework.validation.annotation.Validated;
32 33
@@ -50,6 +51,7 @@ public class CrmReceivableServiceImpl implements CrmReceivableService { @@ -50,6 +51,7 @@ public class CrmReceivableServiceImpl implements CrmReceivableService {
50 private CrmReceivableMapper receivableMapper; 51 private CrmReceivableMapper receivableMapper;
51 52
52 @Resource 53 @Resource
  54 + @Lazy
53 private CrmContractService contractService; 55 private CrmContractService contractService;
54 @Resource 56 @Resource
55 private CrmCustomerService customerService; 57 private CrmCustomerService customerService;
yudao-module-crm/yudao-module-bi-biz/src/main/resources/mapper/rank/BiRankingMapper.xml renamed to yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/bi/BiRankingMapper.xml
1 <?xml version="1.0" encoding="UTF-8"?> 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"> 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.bi.dal.mysql.BiRankingMapper"> 3 +<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.bi.BiRankingMapper">
4 4
5 5
6 <select id="contractRanKing" 6 <select id="contractRanKing"
7 - resultType="cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiContractRanKingRespVO">  
8 - SELECT IFNULL(SUM(t.price), 0) AS price, su.nickname, t.owner_user_id, dept.name AS deptName 7 + resultType="cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO">
  8 + SELECT IFNULL(SUM(t.price), 0) AS price, t.owner_user_id
9 FROM crm_contract t 9 FROM crm_contract t
10 - <!-- TODO @anhaohao:system_users、system_dept 是不是没用到?尽量不连这 2 个表,微服务下会是独立仓库;如果显示需要,可以在 service 读取后拼接; -->  
11 - LEFT JOIN system_users AS su ON su.id = t.owner_user_id  
12 - LEFT JOIN system_dept AS dept ON dept.id = su.dept_id  
13 WHERE t.deleted = 0 10 WHERE t.deleted = 0
14 AND t.audit_status = 20 11 AND t.audit_status = 20
15 - <if test="userIds != null and userIds.size() > 0">  
16 - and t.owner_user_id in  
17 - <foreach collection="userIds" item="item" open="(" close=")" separator=",">  
18 - #{item}  
19 - </foreach>  
20 - </if>  
21 - <!-- TODO @anhaohao:在某个区间的时间,这么做有点浪费性能;一般做法是 beginTime 是开始时间(00:00:00),finalTime 是结束时间(23:59:59),这样实现的; -->  
22 - AND DATE_FORMAT(t.order_date,'${sqlDateFormat}') between #{beginTime} and #{finalTime} 12 + and t.owner_user_id in
  13 + <foreach collection="userIds" item="item" open="(" close=")" separator=",">
  14 + #{item}
  15 + </foreach>
  16 + AND t.order_date between #{startTime} and #{endTime}
23 GROUP BY t.owner_user_id 17 GROUP BY t.owner_user_id
24 ORDER BY price DESC 18 ORDER BY price DESC
25 </select> 19 </select>
26 20
27 <select id="receivablesRanKing" 21 <select id="receivablesRanKing"
28 - resultType="cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiReceivablesRanKingRespVO">  
29 - SELECT IFNULL(SUM(t.price), 0) AS price, su.nickname, t.owner_user_id, dept.name AS deptName 22 + resultType="cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO">
  23 + SELECT IFNULL(SUM(t.price), 0) AS price, t.owner_user_id
30 FROM crm_receivable t 24 FROM crm_receivable t
31 - LEFT JOIN system_users AS su ON su.id = t.owner_user_id  
32 - LEFT JOIN system_dept AS dept ON dept.id = su.dept_id  
33 WHERE t.deleted = 0 25 WHERE t.deleted = 0
34 AND t.audit_status = 20 26 AND t.audit_status = 20
35 - <if test="userIds != null and userIds.size() > 0">  
36 - and t.owner_user_id in  
37 - <foreach collection="userIds" item="item" open="(" close=")" separator=",">  
38 - #{item}  
39 - </foreach>  
40 - </if>  
41 - AND DATE_FORMAT(t.return_time,'${sqlDateFormat}') between #{beginTime} and #{finalTime} 27 + and t.owner_user_id in
  28 + <foreach collection="userIds" item="item" open="(" close=")" separator=",">
  29 + #{item}
  30 + </foreach>
  31 + AND t.return_time between #{startTime} and #{endTime}
42 GROUP BY t.owner_user_id 32 GROUP BY t.owner_user_id
43 ORDER BY price DESC 33 ORDER BY price DESC
44 </select> 34 </select>
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApiImpl.java
@@ -20,7 +20,6 @@ import java.util.List; @@ -20,7 +20,6 @@ import java.util.List;
20 public class DeptApiImpl implements DeptApi { 20 public class DeptApiImpl implements DeptApi {
21 21
22 @Resource 22 @Resource
23 - @Lazy // 延迟加载,解决相互依赖的问题  
24 private DeptService deptService; 23 private DeptService deptService;
25 24
26 @Override 25 @Override
yudao-server/pom.xml
@@ -93,11 +93,6 @@ @@ -93,11 +93,6 @@
93 <artifactId>yudao-module-crm-biz</artifactId> 93 <artifactId>yudao-module-crm-biz</artifactId>
94 <version>${revision}</version> 94 <version>${revision}</version>
95 </dependency> 95 </dependency>
96 - <dependency>  
97 - <groupId>cn.iocoder.boot</groupId>  
98 - <artifactId>yudao-module-bi-biz</artifactId>  
99 - <version>${revision}</version>  
100 - </dependency>  
101 96
102 <!-- ERP 相关模块。默认注释,保证编译速度 --> 97 <!-- ERP 相关模块。默认注释,保证编译速度 -->
103 <dependency> 98 <dependency>