mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-30 09:48:43 +08:00 
			
		
		
		
	!860 新增:CRM 商业智能,合同金额排行榜和回款金额排行榜
Merge pull request !860 from 安浩浩/develop
This commit is contained in:
		| @@ -10,6 +10,8 @@ | ||||
|     <modules> | ||||
|         <module>yudao-module-crm-api</module> | ||||
|         <module>yudao-module-crm-biz</module> | ||||
|         <module>yudao-module-bi-biz</module> | ||||
|         <module>yudao-module-bi-api</module> | ||||
|     </modules> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <artifactId>yudao-module-crm</artifactId> | ||||
| @@ -19,6 +21,7 @@ | ||||
|     <description> | ||||
|         crm 包下,客户关系管理(Customer Relationship Management)。 | ||||
|         例如说:客户、联系人、商机、合同、回款等等 | ||||
|         商业智能 BI 模块,包括:报表、图表、数据大屏等等 | ||||
|     </description> | ||||
|  | ||||
| </project> | ||||
|   | ||||
							
								
								
									
										73
									
								
								yudao-module-crm/yudao-module-bi-api/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								yudao-module-crm/yudao-module-bi-api/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
|          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <parent> | ||||
|         <groupId>cn.iocoder.boot</groupId> | ||||
|         <artifactId>yudao-module-crm</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <artifactId>yudao-module-bi-api</artifactId> | ||||
|  | ||||
|     <name>${project.artifactId}</name> | ||||
|     <description> | ||||
|         bi 模块 API,暴露给其它模块调用 | ||||
|     </description> | ||||
|  | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-module-system-api</artifactId> | ||||
|             <version>${revision}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-module-crm-api</artifactId> | ||||
|             <version>${revision}</version> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- 业务组件 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-biz-ip</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- Web 相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-web</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-security</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- DB 相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-mybatis</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- 工具类相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-excel</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-biz-dict</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- Test 测试相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-test</artifactId> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| </project> | ||||
| @@ -0,0 +1 @@ | ||||
| package cn.iocoder.yudao.module.bi.api; | ||||
| @@ -0,0 +1 @@ | ||||
| package cn.iocoder.yudao.module.bi.enums; | ||||
							
								
								
									
										74
									
								
								yudao-module-crm/yudao-module-bi-biz/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								yudao-module-crm/yudao-module-bi-biz/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
|          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <parent> | ||||
|         <groupId>cn.iocoder.boot</groupId> | ||||
|         <artifactId>yudao-module-crm</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <artifactId>yudao-module-bi-biz</artifactId> | ||||
|  | ||||
|     <name>${project.artifactId}</name> | ||||
|     <description> | ||||
|         crm 包下,商业智能(Business Intelligence)。 | ||||
|         例如说:报表、图表、数据分析等等 | ||||
|     </description> | ||||
|  | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-module-system-api</artifactId> | ||||
|             <version>${revision}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-module-crm-api</artifactId> | ||||
|             <version>${revision}</version> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- 业务组件 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-biz-ip</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- Web 相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-web</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-security</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- DB 相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-mybatis</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- 工具类相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-excel</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-biz-dict</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- Test 测试相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-test</artifactId> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| </project> | ||||
| @@ -0,0 +1,10 @@ | ||||
| ### 合同金额排行榜 | ||||
| GET {{baseUrl}}/bi/rank/contract-ranKing | ||||
| Authorization: Bearer {{token}} | ||||
| tenant-id: {{adminTenentId}} | ||||
|  | ||||
|  | ||||
| ### 回款金额排行榜 | ||||
| GET {{baseUrl}}/bi/rank/receivables-ranKing | ||||
| Authorization: Bearer {{token}} | ||||
| tenant-id: {{adminTenentId}} | ||||
| @@ -0,0 +1,53 @@ | ||||
| package cn.iocoder.yudao.module.bi.controller.admin.ranking; | ||||
|  | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiContractRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiRankReqVO; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiReceivablesRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.bi.service.ranking.BiRankingService; | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||||
|  | ||||
| /** | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| @Tag(name = "管理后台 - 排行榜") | ||||
| @RestController | ||||
| @RequestMapping("/bi/ranking") | ||||
| @Validated | ||||
| public class BiRankingController { | ||||
|  | ||||
|     @Resource | ||||
|     private BiRankingService biRankingService; | ||||
|  | ||||
|     /** | ||||
|      * 合同金额排行榜 | ||||
|      */ | ||||
|     @GetMapping("/contract-ranking") | ||||
|     @Operation(summary = "合同金额排行榜") | ||||
|     @PreAuthorize("@ss.hasPermission('bi:ranking:query')") | ||||
|     public CommonResult<List<BiContractRanKingRespVO>> contractAmountRanking(BiRankReqVO biRankReqVO) { | ||||
|         return success(biRankingService.contractRanKing(biRankReqVO)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 回款金额排行榜 | ||||
|      */ | ||||
|     @GetMapping("/receivables-ranking") | ||||
|     @Operation(summary = "回款金额排行榜") | ||||
|     @PreAuthorize("@ss.hasPermission('bi:ranking:query')") | ||||
|     public CommonResult<List<BiReceivablesRanKingRespVO>> receivablesRanKing(BiRankReqVO biRankReqVO) { | ||||
|         return success(biRankingService.receivablesRanKing(biRankReqVO)); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,24 @@ | ||||
| package cn.iocoder.yudao.module.bi.controller.admin.ranking.vo; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
|  | ||||
| /** | ||||
|  * 管理后台 - BI 排行榜 Response VO | ||||
|  * | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| @Schema(description = "管理后台 - BI 合同金额排行榜 Response VO") | ||||
| @Data | ||||
| public class BiContractRanKingRespVO { | ||||
|  | ||||
|     @Schema(description = "金额", example = "1") | ||||
|     private Integer price; | ||||
|  | ||||
|     @Schema(description = "姓名", example = "1") | ||||
|     private String nickname; | ||||
|  | ||||
|  | ||||
|     @Schema(description = "部门名称", example = "1") | ||||
|     private String deptName; | ||||
| } | ||||
| @@ -0,0 +1,41 @@ | ||||
| package cn.iocoder.yudao.module.bi.controller.admin.ranking.vo; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * @author anhaohao | ||||
|  * bi参数 | ||||
|  */ | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| @Schema(description = "bi查询相关参数") | ||||
| @Data | ||||
| public class BiParams extends PageParam { | ||||
|  | ||||
|     @Schema(description = "部门ID") | ||||
|     private Long deptId; | ||||
|  | ||||
|     @Schema(description = "用户ID") | ||||
|     private Long userId; | ||||
|  | ||||
|     @Schema(description = "用户IDs") | ||||
|     private List<Long> userIds; | ||||
|  | ||||
|     @Schema(description = "类型") | ||||
|     private String type; | ||||
|  | ||||
|     @Schema(description = "开始时间") | ||||
|     private String startTime; | ||||
|  | ||||
|     @Schema(description = "结束时间") | ||||
|     private String endTime; | ||||
|  | ||||
|     @Schema(description = "0 部门 1员工") | ||||
|     private Integer isUser = 1; | ||||
|  | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,20 @@ | ||||
| package cn.iocoder.yudao.module.bi.controller.admin.ranking.vo; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
|  | ||||
| /** | ||||
|  * 管理后台 - 排行榜 Request VO | ||||
|  * | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| @Schema(description = "管理后台 - 排行榜 Request VO") | ||||
| @Data | ||||
| public class BiRankReqVO { | ||||
|  | ||||
|     @Schema(description = "部门id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private Long deptId; | ||||
|  | ||||
|     @Schema(description = "分析类型(1.今天 2.昨天 3.本周 4.上周 5.本月 6.上月 7.本季度 8.上季度 9.本年 10 上年)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private String type; | ||||
| } | ||||
| @@ -0,0 +1,23 @@ | ||||
| package cn.iocoder.yudao.module.bi.controller.admin.ranking.vo; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
|  | ||||
| /** | ||||
|  * 管理后台 - BI 排行榜 Response VO | ||||
|  * | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| @Schema(description = "管理后台 - BI 合同金额排行榜 Response VO") | ||||
| @Data | ||||
| public class BiReceivablesRanKingRespVO { | ||||
|  | ||||
|     @Schema(description = "金额", example = "100") | ||||
|     private Integer price; | ||||
|  | ||||
|     @Schema(description = "姓名", example = "张三") | ||||
|     private String nickname; | ||||
|  | ||||
|     @Schema(description = "部门名称", example = "研发部") | ||||
|     private String deptName; | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| /** | ||||
|  * 提供 RESTful API 给前端: | ||||
|  * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目 | ||||
|  * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 | ||||
|  */ | ||||
| package cn.iocoder.yudao.module.bi.controller; | ||||
| @@ -0,0 +1,31 @@ | ||||
| package cn.iocoder.yudao.module.bi.dal.mysql; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiContractRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiReceivablesRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.bi.util.BiTimeUtil; | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| @Mapper | ||||
| public interface BiRankingMapper extends BaseMapperX { | ||||
|     /** | ||||
|      * 合同金额排行榜 | ||||
|      * | ||||
|      * @param biTimeEntity 参数 | ||||
|      * @return List<BiContractAmountRankingRespVO> | ||||
|      */ | ||||
|     List<BiContractRanKingRespVO> contractRanKing(BiTimeUtil.BiTimeEntity biTimeEntity); | ||||
|  | ||||
|     /** | ||||
|      * 回款金额排行榜 | ||||
|      * | ||||
|      * @param biTimeEntity 参数 | ||||
|      * @return List<BiContractAmountRankingRespVO> | ||||
|      */ | ||||
|     List<BiReceivablesRanKingRespVO> receivablesRanKing(BiTimeUtil.BiTimeEntity biTimeEntity); | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| /** | ||||
|  * 属于 bi 模块的 framework 封装 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| package cn.iocoder.yudao.module.bi.framework; | ||||
| @@ -0,0 +1,24 @@ | ||||
| package cn.iocoder.yudao.module.bi.framework.web.config; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration; | ||||
| import org.springdoc.core.models.GroupedOpenApi; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
|  | ||||
| /** | ||||
|  * bi 模块的 web 组件的 Configuration | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @Configuration(proxyBeanMethods = false) | ||||
| public class BiWebConfiguration { | ||||
|  | ||||
|     /** | ||||
|      * bi 模块的 API 分组 | ||||
|      */ | ||||
|     @Bean | ||||
|     public GroupedOpenApi biGroupedOpenApi() { | ||||
|         return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("bi"); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,4 @@ | ||||
| /** | ||||
|  * bi 模块的 web 配置 | ||||
|  */ | ||||
| package cn.iocoder.yudao.module.bi.framework.web; | ||||
| @@ -0,0 +1,7 @@ | ||||
| /** | ||||
|  * crm 包下,商业智能(Business Intelligence)。 | ||||
|  * 例如说:报表、图表、数据分析等等 | ||||
|  * <p> | ||||
|  * 1. Controller URL:以 /bi/ 开头,避免和其它 Module 冲突 | ||||
|  */ | ||||
| package cn.iocoder.yudao.module.bi; | ||||
| @@ -0,0 +1,30 @@ | ||||
| package cn.iocoder.yudao.module.bi.service.ranking; | ||||
|  | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiContractRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiRankReqVO; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiReceivablesRanKingRespVO; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * BI 排行榜 Service 接口 | ||||
|  * | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| public interface BiRankingService { | ||||
|     /** | ||||
|      * 合同金额排行榜 | ||||
|      * | ||||
|      * @param biRankReqVO 参数 | ||||
|      * @return List<BiContractAmountRankingRespVO> | ||||
|      */ | ||||
|     List<BiContractRanKingRespVO> contractRanKing(BiRankReqVO biRankReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 回款金额排行榜 | ||||
|      * | ||||
|      * @param biRankReqVO 参数 | ||||
|      * @return List<BiContractAmountRankingRespVO> | ||||
|      */ | ||||
|     List<BiReceivablesRanKingRespVO> receivablesRanKing(BiRankReqVO biRankReqVO); | ||||
| } | ||||
| @@ -0,0 +1,53 @@ | ||||
| package cn.iocoder.yudao.module.bi.service.ranking; | ||||
|  | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiContractRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiParams; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiRankReqVO; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiReceivablesRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.bi.dal.mysql.BiRankingMapper; | ||||
| import cn.iocoder.yudao.module.bi.util.BiTimeUtil; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| @Service(value = "biRankService") | ||||
| @Validated | ||||
| public class BiRankingServiceImpl implements BiRankingService { | ||||
|  | ||||
|     @Resource | ||||
|     private BiRankingMapper biRankingMapper; | ||||
|  | ||||
|     @Override | ||||
|     public List<BiContractRanKingRespVO> contractRanKing(BiRankReqVO biRankReqVO) { | ||||
|         BiParams biParams = new BiParams(); | ||||
|         biParams.setType(biRankReqVO.getType()); | ||||
|         biParams.setDeptId(biRankReqVO.getDeptId()); | ||||
|         biParams.setIsUser(0); | ||||
|         BiTimeUtil.BiTimeEntity biTimeEntity = BiTimeUtil.analyzeType(biParams); | ||||
|         List<Long> userIds = biTimeEntity.getUserIds(); | ||||
|         if (userIds.isEmpty()) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
|         return biRankingMapper.contractRanKing(biTimeEntity); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<BiReceivablesRanKingRespVO> receivablesRanKing(BiRankReqVO biRankReqVO) { | ||||
|         BiParams biParams = new BiParams(); | ||||
|         biParams.setType(biRankReqVO.getType()); | ||||
|         biParams.setDeptId(biRankReqVO.getDeptId()); | ||||
|         biParams.setIsUser(0); | ||||
|         BiTimeUtil.BiTimeEntity biTimeEntity = BiTimeUtil.analyzeType(biParams); | ||||
|         List<Long> userIds = biTimeEntity.getUserIds(); | ||||
|         if (userIds.isEmpty()) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
|         return biRankingMapper.receivablesRanKing(biTimeEntity); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,249 @@ | ||||
| package cn.iocoder.yudao.module.bi.util; | ||||
|  | ||||
| import cn.hutool.core.date.DateUnit; | ||||
| import cn.hutool.core.date.DateUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.hutool.extra.spring.SpringUtil; | ||||
| import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; | ||||
| import cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiParams; | ||||
| import cn.iocoder.yudao.module.system.api.dept.DeptApi; | ||||
| import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; | ||||
| import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||||
| import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | ||||
| import lombok.Data; | ||||
| import lombok.experimental.Accessors; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * bi时间工具类 | ||||
|  * | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| public class BiTimeUtil { | ||||
|  | ||||
|     public static BiTimeEntity analyzeType(BiParams biParams) { | ||||
|         // 解析时间 | ||||
|         BiTimeEntity biTimeEntity = analyzeTime(biParams); | ||||
|         // 解析权限 | ||||
|         biTimeEntity.setUserIds(analyzeAuth(biParams)); | ||||
|         return biTimeEntity; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 解析权限 | ||||
|      * | ||||
|      * @param biParams bi参数 | ||||
|      * @return List<Long> | ||||
|      */ | ||||
|     public static List<Long> analyzeAuth(BiParams biParams) { | ||||
|         List<Long> userIdList = new ArrayList<>(); | ||||
|         Long deptId = biParams.getDeptId(); | ||||
|         Long userId = biParams.getUserId(); | ||||
|         Integer isUser = biParams.getIsUser(); | ||||
|         // 获取部门和用户的api | ||||
|         DeptApi deptApi = SpringUtil.getBean("deptApiImpl"); | ||||
|         AdminUserApi adminUserApi = SpringUtil.getBean("adminUserApiImpl"); | ||||
|         // 0.部门 1.用户 | ||||
|         if (isUser == 0) { | ||||
|             if (deptId == null) { | ||||
|                 deptId = adminUserApi.getUser(SecurityFrameworkUtils.getLoginUserId()).getDeptId(); | ||||
|             } | ||||
|             List<DeptRespDTO> childDeptList = deptApi.getChildDeptList(deptId); | ||||
|             List<Long> deptIds = new ArrayList<>(); | ||||
|             deptIds.add(deptId); | ||||
|             if (childDeptList != null && !childDeptList.isEmpty()) { | ||||
|                 for (DeptRespDTO deptRespDTO : childDeptList) { | ||||
|                     deptIds.add(deptRespDTO.getId()); | ||||
|                 } | ||||
|             } | ||||
|             // 获取部门下的用户 | ||||
|             adminUserApi.getUserListByDeptIds(deptIds).forEach(adminUserRespDTO -> userIdList.add(adminUserRespDTO.getId())); | ||||
|         } else { | ||||
|             if (userId == null) { | ||||
|                 List<AdminUserRespDTO> userListBySubordinate = adminUserApi.getUserListBySubordinate(SecurityFrameworkUtils.getLoginUserId()); | ||||
|                 userListBySubordinate.forEach(adminUserRespDTO -> userIdList.add(adminUserRespDTO.getId())); | ||||
|             } else { | ||||
|                 userIdList.add(userId); | ||||
|             } | ||||
|         } | ||||
|         return userIdList; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 解析时间 | ||||
|      * | ||||
|      * @param biParams bi参数 | ||||
|      * @return BiTimeEntity | ||||
|      */ | ||||
|     public static BiTimeEntity analyzeTime(BiParams biParams) { | ||||
|         Date beginDate = DateUtil.date(); | ||||
|         Date endDate = DateUtil.date(); | ||||
|         int cycleNum = 12; | ||||
|         String sqlDateFormat = "%Y%m"; | ||||
|         String dateFormat = "yyyyMM"; | ||||
|         String type = biParams.getType(); | ||||
|         String startTime = biParams.getStartTime(); | ||||
|         String endTime = biParams.getEndTime(); | ||||
|         if (StrUtil.isNotEmpty(type)) { | ||||
|             //1.今天 2.昨天 3.本周 4.上周 5.本月 6.上月 7.本季度 8.上季度 9.本年 10 上年 | ||||
|             switch (type) { | ||||
|                 case "1": | ||||
|                     beginDate = DateUtil.beginOfDay(DateUtil.date()); | ||||
|                     endDate = DateUtil.endOfDay(DateUtil.date()); | ||||
|                     sqlDateFormat = "%Y%m%d"; | ||||
|                     dateFormat = "yyyyMMdd"; | ||||
|                     cycleNum = 1; | ||||
|                     break; | ||||
|                 case "2": | ||||
|                     beginDate = DateUtil.beginOfDay(new Date(System.currentTimeMillis() - 86400000)); | ||||
|                     endDate = DateUtil.endOfDay(new Date(System.currentTimeMillis() - 86400000)); | ||||
|                     sqlDateFormat = "%Y%m%d"; | ||||
|                     dateFormat = "yyyyMMdd"; | ||||
|                     cycleNum = 1; | ||||
|                     break; | ||||
|                 case "3": | ||||
|                     beginDate = DateUtil.beginOfWeek(DateUtil.date()); | ||||
|                     endDate = DateUtil.endOfWeek(DateUtil.date()); | ||||
|                     sqlDateFormat = "%Y%m%d"; | ||||
|                     dateFormat = "yyyyMMdd"; | ||||
|                     cycleNum = 7; | ||||
|                     break; | ||||
|                 case "4": | ||||
|                     beginDate = DateUtil.beginOfWeek(DateUtil.offsetWeek(DateUtil.date(), -1)); | ||||
|                     endDate = DateUtil.endOfWeek(DateUtil.offsetWeek(DateUtil.date(), -1)); | ||||
|                     sqlDateFormat = "%Y%m%d"; | ||||
|                     dateFormat = "yyyyMMdd"; | ||||
|                     cycleNum = 7; | ||||
|                     break; | ||||
|                 case "5": | ||||
|                     beginDate = DateUtil.beginOfMonth(DateUtil.date()); | ||||
|                     endDate = DateUtil.endOfMonth(DateUtil.date()); | ||||
|                     sqlDateFormat = "%Y%m%d"; | ||||
|                     dateFormat = "yyyyMMdd"; | ||||
|                     cycleNum = (int) DateUtil.between(beginDate, endDate, DateUnit.DAY) + 1; | ||||
|                     break; | ||||
|                 case "6": | ||||
|                     beginDate = DateUtil.beginOfMonth(DateUtil.offsetMonth(DateUtil.date(), -1)); | ||||
|                     endDate = DateUtil.endOfMonth(DateUtil.offsetMonth(DateUtil.date(), -1)); | ||||
|                     sqlDateFormat = "%Y%m%d"; | ||||
|                     dateFormat = "yyyyMMdd"; | ||||
|                     cycleNum = (int) DateUtil.between(beginDate, endDate, DateUnit.DAY) + 1; | ||||
|                     break; | ||||
|                 case "7": | ||||
|                     beginDate = DateUtil.beginOfQuarter(DateUtil.date()); | ||||
|                     endDate = DateUtil.endOfQuarter(DateUtil.date()); | ||||
|                     cycleNum = 3; | ||||
|                     break; | ||||
|                 case "8": | ||||
|                     beginDate = DateUtil.beginOfQuarter(DateUtil.offsetMonth(DateUtil.date(), -3)); | ||||
|                     endDate = DateUtil.endOfQuarter(DateUtil.offsetMonth(DateUtil.date(), -3)); | ||||
|                     cycleNum = 3; | ||||
|                     break; | ||||
|                 case "9": | ||||
|                     beginDate = DateUtil.beginOfYear(DateUtil.date()); | ||||
|                     endDate = DateUtil.endOfYear(DateUtil.date()); | ||||
|                     break; | ||||
|                 case "10": | ||||
|                     beginDate = DateUtil.beginOfYear(DateUtil.offsetMonth(DateUtil.date(), -12)); | ||||
|                     endDate = DateUtil.endOfYear(DateUtil.offsetMonth(DateUtil.date(), -12)); | ||||
|                     break; | ||||
|                 default: | ||||
|                     break; | ||||
|             } | ||||
|         } else if (StrUtil.isNotEmpty(startTime) && StrUtil.isNotEmpty(endTime)) { | ||||
|             Date start; | ||||
|             Date end; | ||||
|             if (startTime.length() == 6) { | ||||
|                 start = DateUtil.parse(startTime, "yyyyMM"); | ||||
|                 end = DateUtil.endOfMonth(DateUtil.parse(endTime, "yyyyMM")); | ||||
|             } else { | ||||
|                 start = DateUtil.parse(startTime); | ||||
|                 end = DateUtil.parse(endTime); | ||||
|             } | ||||
|             Integer startMonth = Integer.valueOf(DateUtil.format(start, "yyyyMM")); | ||||
|             int endMonth = Integer.parseInt(DateUtil.format(end, "yyyyMM")); | ||||
|             if (startMonth.equals(endMonth)) { | ||||
|                 sqlDateFormat = "%Y%m%d"; | ||||
|                 dateFormat = "yyyyMMdd"; | ||||
|                 long diffDay = DateUtil.between(start, end, DateUnit.DAY); | ||||
|                 cycleNum = (int) diffDay + 1; | ||||
|             } else { | ||||
|                 sqlDateFormat = "%Y%m"; | ||||
|                 dateFormat = "yyyyMM"; | ||||
|                 int diffYear = Integer.parseInt(Integer.toString(endMonth).substring(0, 4)) - Integer.parseInt(startMonth.toString().substring(0, 4)); | ||||
|                 int diffMonth = endMonth % 100 - startMonth % 100 + 1; | ||||
|                 cycleNum = diffYear * 12 + diffMonth; | ||||
|             } | ||||
|             beginDate = start; | ||||
|             endDate = end; | ||||
|         } | ||||
|         Integer beginTime = Integer.valueOf(DateUtil.format(beginDate, dateFormat)); | ||||
|         Integer finalTime = Integer.valueOf(DateUtil.format(endDate, dateFormat)); | ||||
|         return new BiTimeEntity(sqlDateFormat, dateFormat, beginDate, endDate, cycleNum, beginTime, finalTime, new ArrayList<>()); | ||||
|     } | ||||
|  | ||||
|     @Data | ||||
|     @Accessors(chain = true) | ||||
|     public static class BiTimeEntity { | ||||
|         /** | ||||
|          * sql日期格式化 | ||||
|          */ | ||||
|         private String sqlDateFormat; | ||||
|  | ||||
|         /** | ||||
|          * 日期格式化 | ||||
|          */ | ||||
|         private String dateFormat; | ||||
|  | ||||
|         /** | ||||
|          * 开始时间 | ||||
|          */ | ||||
|         private Date beginDate; | ||||
|  | ||||
|         /** | ||||
|          * 结束时间 | ||||
|          */ | ||||
|         private Date endDate; | ||||
|  | ||||
|         /** | ||||
|          * 周期 | ||||
|          */ | ||||
|         private Integer cycleNum; | ||||
|  | ||||
|         /** | ||||
|          * 开始时间 字符串格式 如20200101 | ||||
|          */ | ||||
|         private Integer beginTime; | ||||
|  | ||||
|         /** | ||||
|          * 结束时间 字符串格式 如20200101 | ||||
|          */ | ||||
|         private Integer finalTime; | ||||
|  | ||||
|         /** | ||||
|          * user列表 | ||||
|          */ | ||||
|         private List<Long> userIds = new ArrayList<>(); | ||||
|         private Integer page; | ||||
|         private Integer limit; | ||||
|  | ||||
|         public BiTimeEntity(String sqlDateFormat, String dateFormat, Date beginDate, Date endDate, Integer cycleNum, Integer beginTime, Integer finalTime, List<Long> userIds) { | ||||
|             this.sqlDateFormat = sqlDateFormat; | ||||
|             this.dateFormat = dateFormat; | ||||
|             this.beginDate = beginDate; | ||||
|             this.endDate = endDate; | ||||
|             this.cycleNum = cycleNum; | ||||
|             this.beginTime = beginTime; | ||||
|             this.finalTime = finalTime; | ||||
|             this.userIds = userIds; | ||||
|         } | ||||
|  | ||||
|         public BiTimeEntity() { | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,42 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||||
| <mapper namespace="cn.iocoder.yudao.module.bi.dal.mysql.BiRankingMapper"> | ||||
|  | ||||
|  | ||||
|     <select id="contractRanKing" | ||||
|             resultType="cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiContractRanKingRespVO"> | ||||
|         SELECT IFNULL(SUM(t.price), 0) AS price, su.nickname, t.owner_user_id, dept.name AS deptName | ||||
|         FROM crm_contract t | ||||
|         LEFT JOIN system_users AS su ON su.id = t.owner_user_id | ||||
|         LEFT JOIN system_dept AS dept ON dept.id = su.dept_id | ||||
|         WHERE t.deleted = 0 | ||||
|         AND t.audit_status = 20 | ||||
|         <if test="userIds != null and userIds.size() > 0"> | ||||
|             and t.owner_user_id in | ||||
|             <foreach collection="userIds" item="item" open="(" close=")" separator=","> | ||||
|                 #{item} | ||||
|             </foreach> | ||||
|         </if> | ||||
|         AND DATE_FORMAT(t.order_date,'${sqlDateFormat}') between #{beginTime} and #{finalTime} | ||||
|         GROUP BY t.owner_user_id | ||||
|         ORDER BY price DESC | ||||
|     </select> | ||||
|     <select id="receivablesRanKing" | ||||
|             resultType="cn.iocoder.yudao.module.bi.controller.admin.ranking.vo.BiReceivablesRanKingRespVO"> | ||||
|         SELECT IFNULL(SUM(t.price), 0) AS price, su.nickname, t.owner_user_id, dept.name AS deptName | ||||
|         FROM crm_receivable t | ||||
|         LEFT JOIN system_users AS su ON su.id = t.owner_user_id | ||||
|         LEFT JOIN system_dept AS dept ON dept.id = su.dept_id | ||||
|         WHERE t.deleted = 0 | ||||
|         AND t.audit_status = 20 | ||||
|         <if test="userIds != null and userIds.size() > 0"> | ||||
|             and t.owner_user_id in | ||||
|             <foreach collection="userIds" item="item" open="(" close=")" separator=","> | ||||
|                 #{item} | ||||
|             </foreach> | ||||
|         </if> | ||||
|         AND DATE_FORMAT(t.return_time,'${sqlDateFormat}') between #{beginTime} and #{finalTime} | ||||
|         GROUP BY t.owner_user_id | ||||
|         ORDER BY price DESC | ||||
|     </select> | ||||
| </mapper> | ||||
| @@ -50,4 +50,12 @@ public interface DeptApi { | ||||
|         return CollectionUtils.convertMap(list, DeptRespDTO::getId); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获得指定部门的所有子部门 | ||||
|      * | ||||
|      * @param id 部门编号 | ||||
|      * @return 子部门列表 | ||||
|      */ | ||||
|     List<DeptRespDTO> getChildDeptList(Long id); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; | ||||
| import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; | ||||
| import cn.iocoder.yudao.module.system.service.dept.DeptService; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.stereotype.Service; | ||||
|  | ||||
| import jakarta.annotation.Resource; | ||||
| @@ -19,6 +20,7 @@ import java.util.List; | ||||
| public class DeptApiImpl implements DeptApi { | ||||
|  | ||||
|     @Resource | ||||
|     @Lazy // 延迟加载,解决相互依赖的问题 | ||||
|     private DeptService deptService; | ||||
|  | ||||
|     @Override | ||||
| @@ -38,4 +40,11 @@ public class DeptApiImpl implements DeptApi { | ||||
|         deptService.validateDeptList(ids); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<DeptRespDTO> getChildDeptList(Long id) { | ||||
|         List<DeptDO> childDeptList = deptService.getChildDeptList(id); | ||||
|         return BeanUtils.toBean(childDeptList, DeptRespDTO.class); | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -93,6 +93,11 @@ | ||||
|             <artifactId>yudao-module-crm-biz</artifactId> | ||||
|             <version>${revision}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-module-bi-biz</artifactId> | ||||
|             <version>${revision}</version> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- ERP 相关模块。默认注释,保证编译速度 --> | ||||
|         <dependency> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 芋道源码
					芋道源码