Commit 2bf5c7a7018d2ef69647fa47cb56a6f9502a3600
Committed by
Gitee
!889 feat: CRM/数据统计/员工客户分析 初稿
Merge pull request !889 from dhb52/develop
Showing
15 changed files
with
663 additions
and
81 deletions
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.http
0 → 100644
| 1 | +### 新建客户总量分析(按日) | ||
| 2 | +GET {{baseUrl}}/crm/statistics-customer/get-total-customer-count?deptId=100×[0]=2024-12-01 00:00:00×[1]=2024-12-12 23:59:59 | ||
| 3 | +Authorization: Bearer {{token}} | ||
| 4 | +tenant-id: {{adminTenentId}} | ||
| 5 | + | ||
| 6 | +### 新建客户总量分析(按月) | ||
| 7 | +GET {{baseUrl}}/crm/statistics-customer/get-total-customer-count?deptId=100×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 | ||
| 8 | +Authorization: Bearer {{token}} | ||
| 9 | +tenant-id: {{adminTenentId}} | ||
| 10 | + | ||
| 11 | +### 成交客户总量分析(按日) | ||
| 12 | +GET {{baseUrl}}/crm/statistics-customer/get-deal-total-customer-count?deptId=100×[0]=2024-12-01 00:00:00×[1]=2024-12-12 23:59:59 | ||
| 13 | +Authorization: Bearer {{token}} | ||
| 14 | +tenant-id: {{adminTenentId}} | ||
| 15 | + | ||
| 16 | +### 成交客户总量分析(按月) | ||
| 17 | +GET {{baseUrl}}/crm/statistics-customer/get-deal-total-customer-count?deptId=100×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 | ||
| 18 | +Authorization: Bearer {{token}} | ||
| 19 | +tenant-id: {{adminTenentId}} | ||
| 20 | + | ||
| 21 | +### 获取客户跟进次数(按日) | ||
| 22 | +GET {{baseUrl}}/crm/statistics-customer/get-record-count?deptId=100×[0]=2024-12-01 00:00:00×[1]=2024-12-12 23:59:59 | ||
| 23 | +Authorization: Bearer {{token}} | ||
| 24 | +tenant-id: {{adminTenentId}} | ||
| 25 | + | ||
| 26 | +### 获取客户跟进次数(按月) | ||
| 27 | +GET {{baseUrl}}/crm/statistics-customer/get-record-count?deptId=100×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 | ||
| 28 | +Authorization: Bearer {{token}} | ||
| 29 | +tenant-id: {{adminTenentId}} | ||
| 30 | + | ||
| 31 | +### 获取已跟进客户数(按日) | ||
| 32 | +GET {{baseUrl}}/crm/statistics-customer/get-distinct-record-count?deptId=100×[0]=2024-12-01 00:00:00×[1]=2024-12-12 23:59:59 | ||
| 33 | +Authorization: Bearer {{token}} | ||
| 34 | +tenant-id: {{adminTenentId}} | ||
| 35 | + | ||
| 36 | +### 获取已跟进客户数(按月) | ||
| 37 | +GET {{baseUrl}}/crm/statistics-customer/get-distinct-record-count?deptId=100×[0]=2023-01-01 00:00:00×[1]=2024-12-12 23:59:59 | ||
| 38 | +Authorization: Bearer {{token}} | ||
| 39 | +tenant-id: {{adminTenentId}} | ||
| 0 | \ No newline at end of file | 40 | \ No newline at end of file |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsCustomerController.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.controller.admin.statistics; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||
| 4 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerCountVO; | ||
| 5 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerReqVO; | ||
| 6 | +import cn.iocoder.yudao.module.crm.service.statistics.CrmStatisticsCustomerService; | ||
| 7 | +import io.swagger.v3.oas.annotations.Operation; | ||
| 8 | +import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 9 | +import jakarta.annotation.Resource; | ||
| 10 | +import jakarta.validation.Valid; | ||
| 11 | +import org.springframework.security.access.prepost.PreAuthorize; | ||
| 12 | +import org.springframework.validation.annotation.Validated; | ||
| 13 | +import org.springframework.web.bind.annotation.GetMapping; | ||
| 14 | +import org.springframework.web.bind.annotation.RequestMapping; | ||
| 15 | +import org.springframework.web.bind.annotation.RestController; | ||
| 16 | + | ||
| 17 | +import java.util.List; | ||
| 18 | + | ||
| 19 | +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||
| 20 | + | ||
| 21 | +@Tag(name = "管理后台 - CRM 数据统计 员工客户分析") | ||
| 22 | +@RestController | ||
| 23 | +@RequestMapping("/crm/statistics-customer") | ||
| 24 | +@Validated | ||
| 25 | +public class CrmStatisticsCustomerController { | ||
| 26 | + | ||
| 27 | + @Resource | ||
| 28 | + private CrmStatisticsCustomerService customerService; | ||
| 29 | + | ||
| 30 | + @GetMapping("/get-total-customer-count") | ||
| 31 | + @Operation(summary = "获得新建客户数量") | ||
| 32 | + @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')") | ||
| 33 | + public CommonResult<List<CrmStatisticsCustomerCountVO>> getTotalCustomerCount(@Valid CrmStatisticsCustomerReqVO reqVO) { | ||
| 34 | + return success(customerService.getTotalCustomerCount(reqVO)); | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + @GetMapping("/get-deal-total-customer-count") | ||
| 38 | + @Operation(summary = "获得成交客户数量") | ||
| 39 | + @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')") | ||
| 40 | + public CommonResult<List<CrmStatisticsCustomerCountVO>> getDealTotalCustomerCount(@Valid CrmStatisticsCustomerReqVO reqVO) { | ||
| 41 | + return success(customerService.getDealTotalCustomerCount(reqVO)); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + @GetMapping("/get-record-count") | ||
| 45 | + @Operation(summary = "获取客户跟进次数") | ||
| 46 | + @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')") | ||
| 47 | + public CommonResult<List<CrmStatisticsCustomerCountVO>> getRecordCount(@Valid CrmStatisticsCustomerReqVO reqVO) { | ||
| 48 | + return success(customerService.getRecordCount(reqVO)); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + @GetMapping("/get-distinct-record-count") | ||
| 52 | + @Operation(summary = "获取已跟进客户数") | ||
| 53 | + @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')") | ||
| 54 | + public CommonResult<List<CrmStatisticsCustomerCountVO>> getDistinctRecordCount(@Valid CrmStatisticsCustomerReqVO reqVO) { | ||
| 55 | + return success(customerService.getDistinctRecordCount(reqVO)); | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + @GetMapping("/get-record-type-count") | ||
| 59 | + @Operation(summary = "获取客户跟进方式统计数") | ||
| 60 | + @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')") | ||
| 61 | + public CommonResult<List<CrmStatisticsCustomerCountVO>> getRecordTypeCount(@Valid CrmStatisticsCustomerReqVO reqVO) { | ||
| 62 | + return success(customerService.getRecordTypeCount(reqVO)); | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + @GetMapping("/get-customer-cycle") | ||
| 66 | + @Operation(summary = "获取客户成交周期") | ||
| 67 | + @PreAuthorize("@ss.hasPermission('crm:statistics-customer:query')") | ||
| 68 | + public CommonResult<List<CrmStatisticsCustomerCountVO>> getCustomerCycle(@Valid CrmStatisticsCustomerReqVO reqVO) { | ||
| 69 | + return success(customerService.getCustomerCycle(reqVO)); | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | +} |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsRankController.java
| 1 | package cn.iocoder.yudao.module.crm.controller.admin.statistics; | 1 | package cn.iocoder.yudao.module.crm.controller.admin.statistics; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO; | ||
| 5 | -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRankReqVO; | ||
| 6 | -import cn.iocoder.yudao.module.crm.service.statistics.CrmStatisticsRankingService; | 4 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO; |
| 5 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankReqVO; | ||
| 6 | +import cn.iocoder.yudao.module.crm.service.statistics.CrmStatisticsRankService; | ||
| 7 | import io.swagger.v3.oas.annotations.Operation; | 7 | import io.swagger.v3.oas.annotations.Operation; |
| 8 | import io.swagger.v3.oas.annotations.tags.Tag; | 8 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 9 | import jakarta.annotation.Resource; | 9 | import jakarta.annotation.Resource; |
| @@ -19,69 +19,69 @@ import java.util.List; | @@ -19,69 +19,69 @@ import java.util.List; | ||
| 19 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 19 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 20 | 20 | ||
| 21 | 21 | ||
| 22 | -@Tag(name = "管理后台 - CRM 排行榜统计") | 22 | +@Tag(name = "管理后台 - CRM 数据统计 排行榜统计") |
| 23 | @RestController | 23 | @RestController |
| 24 | @RequestMapping("/crm/statistics-rank") | 24 | @RequestMapping("/crm/statistics-rank") |
| 25 | @Validated | 25 | @Validated |
| 26 | public class CrmStatisticsRankController { | 26 | public class CrmStatisticsRankController { |
| 27 | 27 | ||
| 28 | @Resource | 28 | @Resource |
| 29 | - private CrmStatisticsRankingService rankingService; | 29 | + private CrmStatisticsRankService rankService; |
| 30 | 30 | ||
| 31 | @GetMapping("/get-contract-price-rank") | 31 | @GetMapping("/get-contract-price-rank") |
| 32 | @Operation(summary = "获得合同金额排行榜") | 32 | @Operation(summary = "获得合同金额排行榜") |
| 33 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") | 33 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") |
| 34 | - public CommonResult<List<CrmStatisticsRanKRespVO>> getContractPriceRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { | ||
| 35 | - return success(rankingService.getContractPriceRank(rankingReqVO)); | 34 | + public CommonResult<List<CrmStatisticsRankRespVO>> getContractPriceRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { |
| 35 | + return success(rankService.getContractPriceRank(rankingReqVO)); | ||
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | @GetMapping("/get-receivable-price-rank") | 38 | @GetMapping("/get-receivable-price-rank") |
| 39 | @Operation(summary = "获得回款金额排行榜") | 39 | @Operation(summary = "获得回款金额排行榜") |
| 40 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") | 40 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") |
| 41 | - public CommonResult<List<CrmStatisticsRanKRespVO>> getReceivablePriceRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { | ||
| 42 | - return success(rankingService.getReceivablePriceRank(rankingReqVO)); | 41 | + public CommonResult<List<CrmStatisticsRankRespVO>> getReceivablePriceRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { |
| 42 | + return success(rankService.getReceivablePriceRank(rankingReqVO)); | ||
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | @GetMapping("/get-contract-count-rank") | 45 | @GetMapping("/get-contract-count-rank") |
| 46 | @Operation(summary = "获得签约合同数量排行榜") | 46 | @Operation(summary = "获得签约合同数量排行榜") |
| 47 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") | 47 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") |
| 48 | - public CommonResult<List<CrmStatisticsRanKRespVO>> getContractCountRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { | ||
| 49 | - return success(rankingService.getContractCountRank(rankingReqVO)); | 48 | + public CommonResult<List<CrmStatisticsRankRespVO>> getContractCountRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { |
| 49 | + return success(rankService.getContractCountRank(rankingReqVO)); | ||
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | @GetMapping("/get-product-sales-rank") | 52 | @GetMapping("/get-product-sales-rank") |
| 53 | @Operation(summary = "获得产品销量排行榜") | 53 | @Operation(summary = "获得产品销量排行榜") |
| 54 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") | 54 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") |
| 55 | - public CommonResult<List<CrmStatisticsRanKRespVO>> getProductSalesRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { | ||
| 56 | - return success(rankingService.getProductSalesRank(rankingReqVO)); | 55 | + public CommonResult<List<CrmStatisticsRankRespVO>> getProductSalesRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { |
| 56 | + return success(rankService.getProductSalesRank(rankingReqVO)); | ||
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | @GetMapping("/get-customer-count-rank") | 59 | @GetMapping("/get-customer-count-rank") |
| 60 | @Operation(summary = "获得新增客户数排行榜") | 60 | @Operation(summary = "获得新增客户数排行榜") |
| 61 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") | 61 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") |
| 62 | - public CommonResult<List<CrmStatisticsRanKRespVO>> getCustomerCountRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { | ||
| 63 | - return success(rankingService.getCustomerCountRank(rankingReqVO)); | 62 | + public CommonResult<List<CrmStatisticsRankRespVO>> getCustomerCountRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { |
| 63 | + return success(rankService.getCustomerCountRank(rankingReqVO)); | ||
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | @GetMapping("/get-contacts-count-rank") | 66 | @GetMapping("/get-contacts-count-rank") |
| 67 | @Operation(summary = "获得新增联系人数排行榜") | 67 | @Operation(summary = "获得新增联系人数排行榜") |
| 68 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") | 68 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") |
| 69 | - public CommonResult<List<CrmStatisticsRanKRespVO>> getContactsCountRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { | ||
| 70 | - return success(rankingService.getContactsCountRank(rankingReqVO)); | 69 | + public CommonResult<List<CrmStatisticsRankRespVO>> getContactsCountRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { |
| 70 | + return success(rankService.getContactsCountRank(rankingReqVO)); | ||
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | @GetMapping("/get-follow-count-rank") | 73 | @GetMapping("/get-follow-count-rank") |
| 74 | @Operation(summary = "获得跟进次数排行榜") | 74 | @Operation(summary = "获得跟进次数排行榜") |
| 75 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") | 75 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") |
| 76 | - public CommonResult<List<CrmStatisticsRanKRespVO>> getFollowCountRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { | ||
| 77 | - return success(rankingService.getFollowCountRank(rankingReqVO)); | 76 | + public CommonResult<List<CrmStatisticsRankRespVO>> getFollowCountRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { |
| 77 | + return success(rankService.getFollowCountRank(rankingReqVO)); | ||
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | @GetMapping("/get-follow-customer-count-rank") | 80 | @GetMapping("/get-follow-customer-count-rank") |
| 81 | @Operation(summary = "获得跟进客户数排行榜") | 81 | @Operation(summary = "获得跟进客户数排行榜") |
| 82 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") | 82 | @PreAuthorize("@ss.hasPermission('crm:statistics-rank:query')") |
| 83 | - public CommonResult<List<CrmStatisticsRanKRespVO>> getFollowCustomerCountRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { | ||
| 84 | - return success(rankingService.getFollowCustomerCountRank(rankingReqVO)); | 83 | + public CommonResult<List<CrmStatisticsRankRespVO>> getFollowCustomerCountRank(@Valid CrmStatisticsRankReqVO rankingReqVO) { |
| 84 | + return success(rankService.getFollowCustomerCountRank(rankingReqVO)); | ||
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | } | 87 | } |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerCountVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | +import lombok.Data; | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +@Schema(description = "管理后台 - CRM 数据统计 员工客户分析 VO") | ||
| 8 | +@Data | ||
| 9 | +public class CrmStatisticsCustomerCountVO { | ||
| 10 | + | ||
| 11 | + /** | ||
| 12 | + * 时间轴 | ||
| 13 | + * <p> | ||
| 14 | + * group by DATE_FORMAT(create_date, '%Y%m') | ||
| 15 | + */ | ||
| 16 | + @Schema(description = "时间轴", requiredMode = Schema.RequiredMode.REQUIRED, example = "202401") | ||
| 17 | + private String category; | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * 数量是个特别“抽象”的概念,在不同排行下,代表不同含义 | ||
| 21 | + * <p> | ||
| 22 | + * 1. 金额:合同金额排行、回款金额排行 | ||
| 23 | + * 2. 个数:签约合同排行、产品销量排行、产品销量排行、新增客户数排行、新增联系人排行、跟进次数排行、跟进客户数排行 | ||
| 24 | + */ | ||
| 25 | + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 26 | + private Integer count = 0; | ||
| 27 | + | ||
| 28 | + /** | ||
| 29 | + * 成交周期(天) | ||
| 30 | + */ | ||
| 31 | + @Schema(description = "成交周期", requiredMode = Schema.RequiredMode.REQUIRED, example = "1.0") | ||
| 32 | + private Double cycle = 0.0; | ||
| 33 | + | ||
| 34 | +} |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/customer/CrmStatisticsCustomerReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 5 | +import jakarta.validation.constraints.NotEmpty; | ||
| 6 | +import jakarta.validation.constraints.NotNull; | ||
| 7 | +import lombok.Data; | ||
| 8 | +import org.springframework.format.annotation.DateTimeFormat; | ||
| 9 | + | ||
| 10 | +import java.time.LocalDateTime; | ||
| 11 | +import java.util.List; | ||
| 12 | + | ||
| 13 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||
| 14 | + | ||
| 15 | +@Schema(description = "管理后台 - CRM 数据统计 员工客户分析 Request VO") | ||
| 16 | +@Data | ||
| 17 | +public class CrmStatisticsCustomerReqVO { | ||
| 18 | + | ||
| 19 | + @Schema(description = "部门 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 20 | + @NotNull(message = "部门 id 不能为空") | ||
| 21 | + private Long deptId; | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * 负责人用户 id, 当用户为空, 则计算部门下用户 | ||
| 25 | + */ | ||
| 26 | + @Schema(description = "负责人用户 id", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1") | ||
| 27 | + private Long userId; | ||
| 28 | + | ||
| 29 | + /** | ||
| 30 | + * userIds 目前不用前端传递,目前是方便后端通过 deptId 读取编号后,设置回来 | ||
| 31 | + * <p> | ||
| 32 | + * 后续,可能会支持选择部分用户进行查询 | ||
| 33 | + */ | ||
| 34 | + @Schema(description = "负责人用户 id 集合", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2") | ||
| 35 | + private List<Long> userIds; | ||
| 36 | + | ||
| 37 | + @Schema(description = "时间范围", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 38 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 39 | + @NotEmpty(message = "时间范围不能为空") | ||
| 40 | + private LocalDateTime[] times; | ||
| 41 | + | ||
| 42 | + /** | ||
| 43 | + * group by DATE_FORMAT(field, #{dateFormat}) | ||
| 44 | + */ | ||
| 45 | + @Schema(description = "Group By 日期格式", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "%Y%m") | ||
| 46 | + private String sqlDateFormat; | ||
| 47 | + | ||
| 48 | + /** | ||
| 49 | + * 数据类型 {@link CrmBizTypeEnum} | ||
| 50 | + */ | ||
| 51 | + @Schema(description = "数据类型", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2") | ||
| 52 | + private Integer bizType; | ||
| 53 | + | ||
| 54 | +} |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/CrmStatisticsRankReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/rank/CrmStatisticsRankReqVO.java
| 1 | -package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo; | 1 | +package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank; |
| 2 | 2 | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | import jakarta.validation.constraints.NotEmpty; | 4 | import jakarta.validation.constraints.NotEmpty; |
| @@ -11,7 +11,7 @@ import java.util.List; | @@ -11,7 +11,7 @@ import java.util.List; | ||
| 11 | 11 | ||
| 12 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | 12 | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| 13 | 13 | ||
| 14 | -@Schema(description = "管理后台 - CRM 排行榜统计 Request VO") | 14 | +@Schema(description = "管理后台 - CRM 数据统计 排行榜统计 Request VO") |
| 15 | @Data | 15 | @Data |
| 16 | public class CrmStatisticsRankReqVO { | 16 | public class CrmStatisticsRankReqVO { |
| 17 | 17 | ||
| @@ -21,7 +21,7 @@ public class CrmStatisticsRankReqVO { | @@ -21,7 +21,7 @@ public class CrmStatisticsRankReqVO { | ||
| 21 | 21 | ||
| 22 | /** | 22 | /** |
| 23 | * userIds 目前不用前端传递,目前是方便后端通过 deptId 读取编号后,设置回来 | 23 | * userIds 目前不用前端传递,目前是方便后端通过 deptId 读取编号后,设置回来 |
| 24 | - * | 24 | + * <p> |
| 25 | * 后续,可能会支持选择部分用户进行查询 | 25 | * 后续,可能会支持选择部分用户进行查询 |
| 26 | */ | 26 | */ |
| 27 | @Schema(description = "负责人用户 id 集合", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2") | 27 | @Schema(description = "负责人用户 id 集合", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2") |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/CrmStatisticsRanKRespVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/rank/CrmStatisticsRankRespVO.java
| 1 | -package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo; | 1 | +package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank; |
| 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 | 5 | ||
| 6 | 6 | ||
| 7 | -@Schema(description = "管理后台 - CRM BI 排行榜统计 Response VO") | 7 | +@Schema(description = "管理后台 - CRM 数据统计 排行榜统计 Response VO") |
| 8 | @Data | 8 | @Data |
| 9 | -public class CrmStatisticsRanKRespVO { | 9 | +public class CrmStatisticsRankRespVO { |
| 10 | 10 | ||
| 11 | @Schema(description = "负责人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 11 | @Schema(description = "负责人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 12 | private Long ownerUserId; | 12 | private Long ownerUserId; |
| @@ -19,7 +19,7 @@ public class CrmStatisticsRanKRespVO { | @@ -19,7 +19,7 @@ public class CrmStatisticsRanKRespVO { | ||
| 19 | 19 | ||
| 20 | /** | 20 | /** |
| 21 | * 数量是个特别“抽象”的概念,在不同排行下,代表不同含义 | 21 | * 数量是个特别“抽象”的概念,在不同排行下,代表不同含义 |
| 22 | - * | 22 | + * <p> |
| 23 | * 1. 金额:合同金额排行、回款金额排行 | 23 | * 1. 金额:合同金额排行、回款金额排行 |
| 24 | * 2. 个数:签约合同排行、产品销量排行、产品销量排行、新增客户数排行、新增联系人排行、跟进次数排行、跟进客户数排行 | 24 | * 2. 个数:签约合同排行、产品销量排行、产品销量排行、新增客户数排行、新增联系人排行、跟进次数排行、跟进客户数排行 |
| 25 | */ | 25 | */ |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsCustomerMapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.dal.mysql.statistics; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerCountVO; | ||
| 4 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerReqVO; | ||
| 5 | +import org.apache.ibatis.annotations.Mapper; | ||
| 6 | + | ||
| 7 | +import java.util.List; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * CRM 数据统计 员工客户分析 Mapper | ||
| 11 | + * | ||
| 12 | + * @author dhb52 | ||
| 13 | + */ | ||
| 14 | +@Mapper | ||
| 15 | +public interface CrmStatisticsCustomerMapper { | ||
| 16 | + | ||
| 17 | + List<CrmStatisticsCustomerCountVO> selectCustomerCountGroupbyDate(CrmStatisticsCustomerReqVO reqVO); | ||
| 18 | + | ||
| 19 | + List<CrmStatisticsCustomerCountVO> selectDealCustomerCountGroupbyDate(CrmStatisticsCustomerReqVO reqVO); | ||
| 20 | + | ||
| 21 | + List<CrmStatisticsCustomerCountVO> selectRecordCountGroupbyDate(CrmStatisticsCustomerReqVO reqVO); | ||
| 22 | + | ||
| 23 | + List<CrmStatisticsCustomerCountVO> selectDistinctRecordCountGroupbyDate(CrmStatisticsCustomerReqVO reqVO); | ||
| 24 | + | ||
| 25 | + List<CrmStatisticsCustomerCountVO> selectRecordCountGroupbyType(CrmStatisticsCustomerReqVO reqVO); | ||
| 26 | + | ||
| 27 | + List<CrmStatisticsCustomerCountVO> selectCustomerCycleGroupbyDate(CrmStatisticsCustomerReqVO reqVO); | ||
| 28 | + | ||
| 29 | +} |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsRankingMapper.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsRankMapper.java
| 1 | package cn.iocoder.yudao.module.crm.dal.mysql.statistics; | 1 | package cn.iocoder.yudao.module.crm.dal.mysql.statistics; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO; | ||
| 4 | -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRankReqVO; | 3 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO; |
| 4 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankReqVO; | ||
| 5 | import org.apache.ibatis.annotations.Mapper; | 5 | import org.apache.ibatis.annotations.Mapper; |
| 6 | 6 | ||
| 7 | import java.util.List; | 7 | import java.util.List; |
| 8 | 8 | ||
| 9 | /** | 9 | /** |
| 10 | - * CRM 排行榜统计 Mapper | 10 | + * CRM 数据统计 排行榜统计 Mapper |
| 11 | * | 11 | * |
| 12 | * @author anhaohao | 12 | * @author anhaohao |
| 13 | */ | 13 | */ |
| 14 | @Mapper | 14 | @Mapper |
| 15 | -public interface CrmStatisticsRankingMapper { | 15 | +public interface CrmStatisticsRankMapper { |
| 16 | 16 | ||
| 17 | /** | 17 | /** |
| 18 | * 查询合同金额排行榜 | 18 | * 查询合同金额排行榜 |
| @@ -20,7 +20,7 @@ public interface CrmStatisticsRankingMapper { | @@ -20,7 +20,7 @@ public interface CrmStatisticsRankingMapper { | ||
| 20 | * @param rankReqVO 参数 | 20 | * @param rankReqVO 参数 |
| 21 | * @return 合同金额排行榜 | 21 | * @return 合同金额排行榜 |
| 22 | */ | 22 | */ |
| 23 | - List<CrmStatisticsRanKRespVO> selectContractPriceRank(CrmStatisticsRankReqVO rankReqVO); | 23 | + List<CrmStatisticsRankRespVO> selectContractPriceRank(CrmStatisticsRankReqVO rankReqVO); |
| 24 | 24 | ||
| 25 | /** | 25 | /** |
| 26 | * 查询回款金额排行榜 | 26 | * 查询回款金额排行榜 |
| @@ -28,7 +28,7 @@ public interface CrmStatisticsRankingMapper { | @@ -28,7 +28,7 @@ public interface CrmStatisticsRankingMapper { | ||
| 28 | * @param rankReqVO 参数 | 28 | * @param rankReqVO 参数 |
| 29 | * @return 回款金额排行榜 | 29 | * @return 回款金额排行榜 |
| 30 | */ | 30 | */ |
| 31 | - List<CrmStatisticsRanKRespVO> selectReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO); | 31 | + List<CrmStatisticsRankRespVO> selectReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO); |
| 32 | 32 | ||
| 33 | /** | 33 | /** |
| 34 | * 查询签约合同数量排行榜 | 34 | * 查询签约合同数量排行榜 |
| @@ -36,7 +36,7 @@ public interface CrmStatisticsRankingMapper { | @@ -36,7 +36,7 @@ public interface CrmStatisticsRankingMapper { | ||
| 36 | * @param rankReqVO 参数 | 36 | * @param rankReqVO 参数 |
| 37 | * @return 签约合同数量排行榜 | 37 | * @return 签约合同数量排行榜 |
| 38 | */ | 38 | */ |
| 39 | - List<CrmStatisticsRanKRespVO> selectContractCountRank(CrmStatisticsRankReqVO rankReqVO); | 39 | + List<CrmStatisticsRankRespVO> selectContractCountRank(CrmStatisticsRankReqVO rankReqVO); |
| 40 | 40 | ||
| 41 | /** | 41 | /** |
| 42 | * 查询产品销量排行榜 | 42 | * 查询产品销量排行榜 |
| @@ -44,7 +44,7 @@ public interface CrmStatisticsRankingMapper { | @@ -44,7 +44,7 @@ public interface CrmStatisticsRankingMapper { | ||
| 44 | * @param rankReqVO 参数 | 44 | * @param rankReqVO 参数 |
| 45 | * @return 产品销量排行榜 | 45 | * @return 产品销量排行榜 |
| 46 | */ | 46 | */ |
| 47 | - List<CrmStatisticsRanKRespVO> selectProductSalesRank(CrmStatisticsRankReqVO rankReqVO); | 47 | + List<CrmStatisticsRankRespVO> selectProductSalesRank(CrmStatisticsRankReqVO rankReqVO); |
| 48 | 48 | ||
| 49 | /** | 49 | /** |
| 50 | * 查询新增客户数排行榜 | 50 | * 查询新增客户数排行榜 |
| @@ -52,7 +52,7 @@ public interface CrmStatisticsRankingMapper { | @@ -52,7 +52,7 @@ public interface CrmStatisticsRankingMapper { | ||
| 52 | * @param rankReqVO 参数 | 52 | * @param rankReqVO 参数 |
| 53 | * @return 新增客户数排行榜 | 53 | * @return 新增客户数排行榜 |
| 54 | */ | 54 | */ |
| 55 | - List<CrmStatisticsRanKRespVO> selectCustomerCountRank(CrmStatisticsRankReqVO rankReqVO); | 55 | + List<CrmStatisticsRankRespVO> selectCustomerCountRank(CrmStatisticsRankReqVO rankReqVO); |
| 56 | 56 | ||
| 57 | /** | 57 | /** |
| 58 | * 查询联系人数量排行榜 | 58 | * 查询联系人数量排行榜 |
| @@ -60,7 +60,7 @@ public interface CrmStatisticsRankingMapper { | @@ -60,7 +60,7 @@ public interface CrmStatisticsRankingMapper { | ||
| 60 | * @param rankReqVO 参数 | 60 | * @param rankReqVO 参数 |
| 61 | * @return 联系人数量排行榜 | 61 | * @return 联系人数量排行榜 |
| 62 | */ | 62 | */ |
| 63 | - List<CrmStatisticsRanKRespVO> selectContactsCountRank(CrmStatisticsRankReqVO rankReqVO); | 63 | + List<CrmStatisticsRankRespVO> selectContactsCountRank(CrmStatisticsRankReqVO rankReqVO); |
| 64 | 64 | ||
| 65 | /** | 65 | /** |
| 66 | * 查询跟进次数排行榜 | 66 | * 查询跟进次数排行榜 |
| @@ -68,7 +68,7 @@ public interface CrmStatisticsRankingMapper { | @@ -68,7 +68,7 @@ public interface CrmStatisticsRankingMapper { | ||
| 68 | * @param rankReqVO 参数 | 68 | * @param rankReqVO 参数 |
| 69 | * @return 跟进次数排行榜 | 69 | * @return 跟进次数排行榜 |
| 70 | */ | 70 | */ |
| 71 | - List<CrmStatisticsRanKRespVO> selectFollowCountRank(CrmStatisticsRankReqVO rankReqVO); | 71 | + List<CrmStatisticsRankRespVO> selectFollowCountRank(CrmStatisticsRankReqVO rankReqVO); |
| 72 | 72 | ||
| 73 | /** | 73 | /** |
| 74 | * 查询跟进客户数排行榜 | 74 | * 查询跟进客户数排行榜 |
| @@ -76,6 +76,6 @@ public interface CrmStatisticsRankingMapper { | @@ -76,6 +76,6 @@ public interface CrmStatisticsRankingMapper { | ||
| 76 | * @param rankReqVO 参数 | 76 | * @param rankReqVO 参数 |
| 77 | * @return 跟进客户数排行榜 | 77 | * @return 跟进客户数排行榜 |
| 78 | */ | 78 | */ |
| 79 | - List<CrmStatisticsRanKRespVO> selectFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO); | 79 | + List<CrmStatisticsRankRespVO> selectFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO); |
| 80 | 80 | ||
| 81 | } | 81 | } |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsCustomerService.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.service.statistics; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerCountVO; | ||
| 4 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerReqVO; | ||
| 5 | + | ||
| 6 | +import java.util.List; | ||
| 7 | + | ||
| 8 | +/** | ||
| 9 | + * CRM 数据统计 员工客户分析 Service 接口 | ||
| 10 | + * | ||
| 11 | + * @author dhb52 | ||
| 12 | + */ | ||
| 13 | +public interface CrmStatisticsCustomerService { | ||
| 14 | + | ||
| 15 | + /** | ||
| 16 | + * 获取新建客户数量 | ||
| 17 | + * | ||
| 18 | + * @param reqVO 请求参数 | ||
| 19 | + * @return 新建客户数量统计 | ||
| 20 | + */ | ||
| 21 | + List<CrmStatisticsCustomerCountVO> getTotalCustomerCount(CrmStatisticsCustomerReqVO reqVO); | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * 获取成交客户数量 | ||
| 25 | + * | ||
| 26 | + * @param reqVO 请求参数 | ||
| 27 | + * @return 成交客户数量统计 | ||
| 28 | + */ | ||
| 29 | + List<CrmStatisticsCustomerCountVO> getDealTotalCustomerCount(CrmStatisticsCustomerReqVO reqVO); | ||
| 30 | + | ||
| 31 | + | ||
| 32 | + /** | ||
| 33 | + * 获取客户跟进次数 | ||
| 34 | + * | ||
| 35 | + * @param reqVO 请求参数 | ||
| 36 | + * @return 客户跟进次数 | ||
| 37 | + */ | ||
| 38 | + List<CrmStatisticsCustomerCountVO> getRecordCount(CrmStatisticsCustomerReqVO reqVO); | ||
| 39 | + | ||
| 40 | + /** | ||
| 41 | + * 获取已跟进客户数 | ||
| 42 | + * | ||
| 43 | + * @param reqVO 请求参数 | ||
| 44 | + * @return 已跟进客户数 | ||
| 45 | + */ | ||
| 46 | + List<CrmStatisticsCustomerCountVO> getDistinctRecordCount(CrmStatisticsCustomerReqVO reqVO); | ||
| 47 | + | ||
| 48 | + /** | ||
| 49 | + * 获取客户跟进方式统计数 | ||
| 50 | + * | ||
| 51 | + * @param reqVO 请求参数 | ||
| 52 | + * @return 客户跟进方式统计数 | ||
| 53 | + */ | ||
| 54 | + List<CrmStatisticsCustomerCountVO> getRecordTypeCount(CrmStatisticsCustomerReqVO reqVO); | ||
| 55 | + | ||
| 56 | + /** | ||
| 57 | + * 获取客户成交周期 | ||
| 58 | + * | ||
| 59 | + * @param reqVO 请求参数 | ||
| 60 | + * @return 客户成交周期 | ||
| 61 | + */ | ||
| 62 | + List<CrmStatisticsCustomerCountVO> getCustomerCycle(CrmStatisticsCustomerReqVO reqVO); | ||
| 63 | + | ||
| 64 | +} |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsCustomerServiceImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.service.statistics; | ||
| 2 | + | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 4 | +import cn.hutool.core.date.LocalDateTimeUtil; | ||
| 5 | +import cn.hutool.core.util.ObjUtil; | ||
| 6 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerCountVO; | ||
| 7 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsCustomerMapper; | ||
| 9 | +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||
| 10 | +import cn.iocoder.yudao.module.system.api.dept.DeptApi; | ||
| 11 | +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; | ||
| 12 | +import cn.iocoder.yudao.module.system.api.dict.DictDataApi; | ||
| 13 | +import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO; | ||
| 14 | +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||
| 15 | +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | ||
| 16 | +import jakarta.annotation.Resource; | ||
| 17 | +import org.springframework.stereotype.Service; | ||
| 18 | +import org.springframework.validation.annotation.Validated; | ||
| 19 | + | ||
| 20 | +import java.time.LocalDateTime; | ||
| 21 | +import java.util.Collections; | ||
| 22 | +import java.util.List; | ||
| 23 | +import java.util.Map; | ||
| 24 | +import java.util.function.Function; | ||
| 25 | + | ||
| 26 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | ||
| 27 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; | ||
| 28 | + | ||
| 29 | +/** | ||
| 30 | + * CRM 数据统计 员工客户分析 Service 实现类 | ||
| 31 | + * | ||
| 32 | + * @author dhb52 | ||
| 33 | + */ | ||
| 34 | +@Service | ||
| 35 | +@Validated | ||
| 36 | +public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerService { | ||
| 37 | + | ||
| 38 | + @Resource | ||
| 39 | + private CrmStatisticsCustomerMapper customerMapper; | ||
| 40 | + | ||
| 41 | + @Resource | ||
| 42 | + private AdminUserApi adminUserApi; | ||
| 43 | + @Resource | ||
| 44 | + private DeptApi deptApi; | ||
| 45 | + @Resource | ||
| 46 | + private DictDataApi dictDataApi; | ||
| 47 | + | ||
| 48 | + @Override | ||
| 49 | + public List<CrmStatisticsCustomerCountVO> getTotalCustomerCount(CrmStatisticsCustomerReqVO reqVO) { | ||
| 50 | + return getStat(reqVO, customerMapper::selectCustomerCountGroupbyDate); | ||
| 51 | + } | ||
| 52 | + | ||
| 53 | + @Override | ||
| 54 | + public List<CrmStatisticsCustomerCountVO> getDealTotalCustomerCount(CrmStatisticsCustomerReqVO reqVO) { | ||
| 55 | + return getStat(reqVO, customerMapper::selectDealCustomerCountGroupbyDate); | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + @Override | ||
| 59 | + public List<CrmStatisticsCustomerCountVO> getRecordCount(CrmStatisticsCustomerReqVO reqVO) { | ||
| 60 | + reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); | ||
| 61 | + return getStat(reqVO, customerMapper::selectRecordCountGroupbyDate); | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + @Override | ||
| 65 | + public List<CrmStatisticsCustomerCountVO> getDistinctRecordCount(CrmStatisticsCustomerReqVO reqVO) { | ||
| 66 | + reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); | ||
| 67 | + return getStat(reqVO, customerMapper::selectDistinctRecordCountGroupbyDate); | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + @Override | ||
| 71 | + public List<CrmStatisticsCustomerCountVO> getRecordTypeCount(CrmStatisticsCustomerReqVO reqVO) { | ||
| 72 | + // 1. 获得用户编号数组: 如果用户编号为空, 则获得部门下的用户编号数组 | ||
| 73 | + if (ObjUtil.isNotNull(reqVO.getUserId())) { | ||
| 74 | + reqVO.setUserIds(List.of(reqVO.getUserId())); | ||
| 75 | + } else { | ||
| 76 | + reqVO.setUserIds(getUserIds(reqVO.getDeptId())); | ||
| 77 | + } | ||
| 78 | + if (CollUtil.isEmpty(reqVO.getUserIds())) { | ||
| 79 | + return Collections.emptyList(); | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + // 2. 获得排行数据 | ||
| 83 | + reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); | ||
| 84 | + List<CrmStatisticsCustomerCountVO> stats = customerMapper.selectRecordCountGroupbyType(reqVO); | ||
| 85 | + | ||
| 86 | + // 3. 获取字典数据 | ||
| 87 | + List<DictDataRespDTO> followUpTypes = dictDataApi.getDictDataList("crm_follow_up_type"); | ||
| 88 | + final Map<String, String> followUpTypeMap = convertMap(followUpTypes, DictDataRespDTO::getValue, DictDataRespDTO::getLabel); | ||
| 89 | + stats.forEach(stat -> { | ||
| 90 | + stat.setCategory(followUpTypeMap.get(stat.getCategory())); | ||
| 91 | + }); | ||
| 92 | + | ||
| 93 | + return stats; | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + @Override | ||
| 97 | + public List<CrmStatisticsCustomerCountVO> getCustomerCycle(CrmStatisticsCustomerReqVO reqVO) { | ||
| 98 | + return getStat(reqVO, customerMapper::selectCustomerCycleGroupbyDate); | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + /** | ||
| 102 | + * 获得统计数据 | ||
| 103 | + * | ||
| 104 | + * @param reqVO 参数 | ||
| 105 | + * @param statFunction 统计方法 | ||
| 106 | + * @return 统计数据 | ||
| 107 | + */ | ||
| 108 | + private List<CrmStatisticsCustomerCountVO> getStat(CrmStatisticsCustomerReqVO reqVO, Function<CrmStatisticsCustomerReqVO, List<CrmStatisticsCustomerCountVO>> statFunction) { | ||
| 109 | + // 1. 获得用户编号数组: 如果用户编号为空, 则获得部门下的用户编号数组 | ||
| 110 | + if (ObjUtil.isNotNull(reqVO.getUserId())) { | ||
| 111 | + reqVO.setUserIds(List.of(reqVO.getUserId())); | ||
| 112 | + } else { | ||
| 113 | + reqVO.setUserIds(getUserIds(reqVO.getDeptId())); | ||
| 114 | + } | ||
| 115 | + if (CollUtil.isEmpty(reqVO.getUserIds())) { | ||
| 116 | + return Collections.emptyList(); | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + // 2. 生成日期格式 | ||
| 120 | + LocalDateTime startTime = reqVO.getTimes()[0]; | ||
| 121 | + final LocalDateTime endTime = reqVO.getTimes()[1]; | ||
| 122 | + final long days = LocalDateTimeUtil.between(startTime, endTime).toDays(); | ||
| 123 | + boolean byMonth = days > 31; | ||
| 124 | + if (byMonth) { | ||
| 125 | + // 按月 | ||
| 126 | + reqVO.setSqlDateFormat("%Y%m"); | ||
| 127 | + } else { | ||
| 128 | + // 按日 | ||
| 129 | + reqVO.setSqlDateFormat("%Y%m%d"); | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + // 3. 获得排行数据 | ||
| 133 | + List<CrmStatisticsCustomerCountVO> stats = statFunction.apply(reqVO); | ||
| 134 | + | ||
| 135 | + // 4. 生成时间序列 | ||
| 136 | + List<CrmStatisticsCustomerCountVO> result = CollUtil.newArrayList(); | ||
| 137 | + while (!startTime.isAfter(endTime)) { | ||
| 138 | + final String category = LocalDateTimeUtil.format(startTime, byMonth ? "yyyyMM" : "yyyyMMdd"); | ||
| 139 | + result.add(new CrmStatisticsCustomerCountVO().setCategory(category)); | ||
| 140 | + if (byMonth) | ||
| 141 | + startTime = startTime.plusMonths(1); | ||
| 142 | + else | ||
| 143 | + startTime = startTime.plusDays(1); | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + // 5. 使用时间序列填充结果 | ||
| 147 | + final Map<String, CrmStatisticsCustomerCountVO> statMap = convertMap(stats, | ||
| 148 | + CrmStatisticsCustomerCountVO::getCategory, | ||
| 149 | + Function.identity()); | ||
| 150 | + result.forEach(r -> { | ||
| 151 | + if (statMap.containsKey(r.getCategory())) { | ||
| 152 | + r.setCount(statMap.get(r.getCategory()).getCount()) | ||
| 153 | + .setCycle(statMap.get(r.getCategory()).getCycle()); | ||
| 154 | + } | ||
| 155 | + }); | ||
| 156 | + | ||
| 157 | + return result; | ||
| 158 | + } | ||
| 159 | + | ||
| 160 | + | ||
| 161 | + /** | ||
| 162 | + * 获得部门下的用户编号数组,包括子部门的 | ||
| 163 | + * | ||
| 164 | + * @param deptId 部门编号 | ||
| 165 | + * @return 用户编号数组 | ||
| 166 | + */ | ||
| 167 | + public List<Long> getUserIds(Long deptId) { | ||
| 168 | + // 1. 获得部门列表 | ||
| 169 | + List<Long> deptIds = convertList(deptApi.getChildDeptList(deptId), DeptRespDTO::getId); | ||
| 170 | + deptIds.add(deptId); | ||
| 171 | + // 2. 获得用户编号 | ||
| 172 | + return convertList(adminUserApi.getUserListByDeptIds(deptIds), AdminUserRespDTO::getId); | ||
| 173 | + } | ||
| 174 | +} |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsRankingService.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsRankService.java
| 1 | package cn.iocoder.yudao.module.crm.service.statistics; | 1 | package cn.iocoder.yudao.module.crm.service.statistics; |
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO; | ||
| 5 | -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRankReqVO; | 4 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO; |
| 5 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankReqVO; | ||
| 6 | 6 | ||
| 7 | import java.util.List; | 7 | import java.util.List; |
| 8 | 8 | ||
| 9 | /** | 9 | /** |
| 10 | - * CRM 排行榜统计 Service 接口 | 10 | + * CRM 数据统计 排行榜统计 Service 接口 |
| 11 | * | 11 | * |
| 12 | * @author anhaohao | 12 | * @author anhaohao |
| 13 | */ | 13 | */ |
| 14 | -public interface CrmStatisticsRankingService { | 14 | +public interface CrmStatisticsRankService { |
| 15 | 15 | ||
| 16 | /** | 16 | /** |
| 17 | * 获得合同金额排行榜 | 17 | * 获得合同金额排行榜 |
| @@ -19,7 +19,7 @@ public interface CrmStatisticsRankingService { | @@ -19,7 +19,7 @@ public interface CrmStatisticsRankingService { | ||
| 19 | * @param rankReqVO 排行参数 | 19 | * @param rankReqVO 排行参数 |
| 20 | * @return 合同金额排行榜 | 20 | * @return 合同金额排行榜 |
| 21 | */ | 21 | */ |
| 22 | - List<CrmStatisticsRanKRespVO> getContractPriceRank(CrmStatisticsRankReqVO rankReqVO); | 22 | + List<CrmStatisticsRankRespVO> getContractPriceRank(CrmStatisticsRankReqVO rankReqVO); |
| 23 | 23 | ||
| 24 | /** | 24 | /** |
| 25 | * 获得回款金额排行榜 | 25 | * 获得回款金额排行榜 |
| @@ -27,7 +27,7 @@ public interface CrmStatisticsRankingService { | @@ -27,7 +27,7 @@ public interface CrmStatisticsRankingService { | ||
| 27 | * @param rankReqVO 排行参数 | 27 | * @param rankReqVO 排行参数 |
| 28 | * @return 回款金额排行榜 | 28 | * @return 回款金额排行榜 |
| 29 | */ | 29 | */ |
| 30 | - List<CrmStatisticsRanKRespVO> getReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO); | 30 | + List<CrmStatisticsRankRespVO> getReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO); |
| 31 | 31 | ||
| 32 | /** | 32 | /** |
| 33 | * 获得签约合同数量排行榜 | 33 | * 获得签约合同数量排行榜 |
| @@ -35,7 +35,7 @@ public interface CrmStatisticsRankingService { | @@ -35,7 +35,7 @@ public interface CrmStatisticsRankingService { | ||
| 35 | * @param rankReqVO 排行参数 | 35 | * @param rankReqVO 排行参数 |
| 36 | * @return 签约合同数量排行榜 | 36 | * @return 签约合同数量排行榜 |
| 37 | */ | 37 | */ |
| 38 | - List<CrmStatisticsRanKRespVO> getContractCountRank(CrmStatisticsRankReqVO rankReqVO); | 38 | + List<CrmStatisticsRankRespVO> getContractCountRank(CrmStatisticsRankReqVO rankReqVO); |
| 39 | 39 | ||
| 40 | /** | 40 | /** |
| 41 | * 获得产品销量排行榜 | 41 | * 获得产品销量排行榜 |
| @@ -43,7 +43,7 @@ public interface CrmStatisticsRankingService { | @@ -43,7 +43,7 @@ public interface CrmStatisticsRankingService { | ||
| 43 | * @param rankReqVO 排行参数 | 43 | * @param rankReqVO 排行参数 |
| 44 | * @return 产品销量排行榜 | 44 | * @return 产品销量排行榜 |
| 45 | */ | 45 | */ |
| 46 | - List<CrmStatisticsRanKRespVO> getProductSalesRank(CrmStatisticsRankReqVO rankReqVO); | 46 | + List<CrmStatisticsRankRespVO> getProductSalesRank(CrmStatisticsRankReqVO rankReqVO); |
| 47 | 47 | ||
| 48 | /** | 48 | /** |
| 49 | * 获得新增客户数排行榜 | 49 | * 获得新增客户数排行榜 |
| @@ -51,7 +51,7 @@ public interface CrmStatisticsRankingService { | @@ -51,7 +51,7 @@ public interface CrmStatisticsRankingService { | ||
| 51 | * @param rankReqVO 排行参数 | 51 | * @param rankReqVO 排行参数 |
| 52 | * @return 新增客户数排行榜 | 52 | * @return 新增客户数排行榜 |
| 53 | */ | 53 | */ |
| 54 | - List<CrmStatisticsRanKRespVO> getCustomerCountRank(CrmStatisticsRankReqVO rankReqVO); | 54 | + List<CrmStatisticsRankRespVO> getCustomerCountRank(CrmStatisticsRankReqVO rankReqVO); |
| 55 | 55 | ||
| 56 | /** | 56 | /** |
| 57 | * 获得联系人数量排行榜 | 57 | * 获得联系人数量排行榜 |
| @@ -59,7 +59,7 @@ public interface CrmStatisticsRankingService { | @@ -59,7 +59,7 @@ public interface CrmStatisticsRankingService { | ||
| 59 | * @param rankReqVO 排行参数 | 59 | * @param rankReqVO 排行参数 |
| 60 | * @return 联系人数量排行榜 | 60 | * @return 联系人数量排行榜 |
| 61 | */ | 61 | */ |
| 62 | - List<CrmStatisticsRanKRespVO> getContactsCountRank(CrmStatisticsRankReqVO rankReqVO); | 62 | + List<CrmStatisticsRankRespVO> getContactsCountRank(CrmStatisticsRankReqVO rankReqVO); |
| 63 | 63 | ||
| 64 | /** | 64 | /** |
| 65 | * 获得跟进次数排行榜 | 65 | * 获得跟进次数排行榜 |
| @@ -67,7 +67,7 @@ public interface CrmStatisticsRankingService { | @@ -67,7 +67,7 @@ public interface CrmStatisticsRankingService { | ||
| 67 | * @param rankReqVO 排行参数 | 67 | * @param rankReqVO 排行参数 |
| 68 | * @return 跟进次数排行榜 | 68 | * @return 跟进次数排行榜 |
| 69 | */ | 69 | */ |
| 70 | - List<CrmStatisticsRanKRespVO> getFollowCountRank(CrmStatisticsRankReqVO rankReqVO); | 70 | + List<CrmStatisticsRankRespVO> getFollowCountRank(CrmStatisticsRankReqVO rankReqVO); |
| 71 | 71 | ||
| 72 | /** | 72 | /** |
| 73 | * 获得跟进客户数排行榜 | 73 | * 获得跟进客户数排行榜 |
| @@ -75,6 +75,6 @@ public interface CrmStatisticsRankingService { | @@ -75,6 +75,6 @@ public interface CrmStatisticsRankingService { | ||
| 75 | * @param rankReqVO 排行参数 | 75 | * @param rankReqVO 排行参数 |
| 76 | * @return 跟进客户数排行榜 | 76 | * @return 跟进客户数排行榜 |
| 77 | */ | 77 | */ |
| 78 | - List<CrmStatisticsRanKRespVO> getFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO); | 78 | + List<CrmStatisticsRankRespVO> getFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO); |
| 79 | 79 | ||
| 80 | } | 80 | } |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsRankingServiceImpl.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsRankServiceImpl.java
| @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.crm.service.statistics; | @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.crm.service.statistics; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | 4 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| 5 | -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO; | ||
| 6 | -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRankReqVO; | ||
| 7 | -import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsRankingMapper; | 5 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankReqVO; |
| 6 | +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO; | ||
| 7 | +import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsRankMapper; | ||
| 8 | import cn.iocoder.yudao.module.system.api.dept.DeptApi; | 8 | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| 9 | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; | 9 | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| 10 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | 10 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| @@ -23,16 +23,16 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. | @@ -23,16 +23,16 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. | ||
| 23 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 23 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 24 | 24 | ||
| 25 | /** | 25 | /** |
| 26 | - * CRM 排行榜统计 Service 实现类 | 26 | + * CRM 数据统计 排行榜统计 Service 实现类 |
| 27 | * | 27 | * |
| 28 | * @author anhaohao | 28 | * @author anhaohao |
| 29 | */ | 29 | */ |
| 30 | @Service | 30 | @Service |
| 31 | @Validated | 31 | @Validated |
| 32 | -public class CrmStatisticsRankingServiceImpl implements CrmStatisticsRankingService { | 32 | +public class CrmStatisticsRankServiceImpl implements CrmStatisticsRankService { |
| 33 | 33 | ||
| 34 | @Resource | 34 | @Resource |
| 35 | - private CrmStatisticsRankingMapper rankMapper; | 35 | + private CrmStatisticsRankMapper rankMapper; |
| 36 | 36 | ||
| 37 | @Resource | 37 | @Resource |
| 38 | private AdminUserApi adminUserApi; | 38 | private AdminUserApi adminUserApi; |
| @@ -40,64 +40,64 @@ public class CrmStatisticsRankingServiceImpl implements CrmStatisticsRankingServ | @@ -40,64 +40,64 @@ public class CrmStatisticsRankingServiceImpl implements CrmStatisticsRankingServ | ||
| 40 | private DeptApi deptApi; | 40 | private DeptApi deptApi; |
| 41 | 41 | ||
| 42 | @Override | 42 | @Override |
| 43 | - public List<CrmStatisticsRanKRespVO> getContractPriceRank(CrmStatisticsRankReqVO rankReqVO) { | 43 | + public List<CrmStatisticsRankRespVO> getContractPriceRank(CrmStatisticsRankReqVO rankReqVO) { |
| 44 | return getRank(rankReqVO, rankMapper::selectContractPriceRank); | 44 | return getRank(rankReqVO, rankMapper::selectContractPriceRank); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | @Override | 47 | @Override |
| 48 | - public List<CrmStatisticsRanKRespVO> getReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO) { | 48 | + public List<CrmStatisticsRankRespVO> getReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO) { |
| 49 | return getRank(rankReqVO, rankMapper::selectReceivablePriceRank); | 49 | return getRank(rankReqVO, rankMapper::selectReceivablePriceRank); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | @Override | 52 | @Override |
| 53 | - public List<CrmStatisticsRanKRespVO> getContractCountRank(CrmStatisticsRankReqVO rankReqVO) { | 53 | + public List<CrmStatisticsRankRespVO> getContractCountRank(CrmStatisticsRankReqVO rankReqVO) { |
| 54 | return getRank(rankReqVO, rankMapper::selectContractCountRank); | 54 | return getRank(rankReqVO, rankMapper::selectContractCountRank); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | @Override | 57 | @Override |
| 58 | - public List<CrmStatisticsRanKRespVO> getProductSalesRank(CrmStatisticsRankReqVO rankReqVO) { | 58 | + public List<CrmStatisticsRankRespVO> getProductSalesRank(CrmStatisticsRankReqVO rankReqVO) { |
| 59 | return getRank(rankReqVO, rankMapper::selectProductSalesRank); | 59 | return getRank(rankReqVO, rankMapper::selectProductSalesRank); |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | @Override | 62 | @Override |
| 63 | - public List<CrmStatisticsRanKRespVO> getCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) { | 63 | + public List<CrmStatisticsRankRespVO> getCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) { |
| 64 | return getRank(rankReqVO, rankMapper::selectCustomerCountRank); | 64 | return getRank(rankReqVO, rankMapper::selectCustomerCountRank); |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | @Override | 67 | @Override |
| 68 | - public List<CrmStatisticsRanKRespVO> getContactsCountRank(CrmStatisticsRankReqVO rankReqVO) { | 68 | + public List<CrmStatisticsRankRespVO> getContactsCountRank(CrmStatisticsRankReqVO rankReqVO) { |
| 69 | return getRank(rankReqVO, rankMapper::selectContactsCountRank); | 69 | return getRank(rankReqVO, rankMapper::selectContactsCountRank); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | @Override | 72 | @Override |
| 73 | - public List<CrmStatisticsRanKRespVO> getFollowCountRank(CrmStatisticsRankReqVO rankReqVO) { | 73 | + public List<CrmStatisticsRankRespVO> getFollowCountRank(CrmStatisticsRankReqVO rankReqVO) { |
| 74 | return getRank(rankReqVO, rankMapper::selectFollowCountRank); | 74 | return getRank(rankReqVO, rankMapper::selectFollowCountRank); |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | @Override | 77 | @Override |
| 78 | - public List<CrmStatisticsRanKRespVO> getFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) { | 78 | + public List<CrmStatisticsRankRespVO> getFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) { |
| 79 | return getRank(rankReqVO, rankMapper::selectFollowCustomerCountRank); | 79 | return getRank(rankReqVO, rankMapper::selectFollowCustomerCountRank); |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | /** | 82 | /** |
| 83 | * 获得排行版数据 | 83 | * 获得排行版数据 |
| 84 | * | 84 | * |
| 85 | - * @param rankReqVO 参数 | 85 | + * @param rankReqVO 参数 |
| 86 | * @param rankFunction 排行榜方法 | 86 | * @param rankFunction 排行榜方法 |
| 87 | * @return 排行版数据 | 87 | * @return 排行版数据 |
| 88 | */ | 88 | */ |
| 89 | - private List<CrmStatisticsRanKRespVO> getRank(CrmStatisticsRankReqVO rankReqVO, Function<CrmStatisticsRankReqVO, List<CrmStatisticsRanKRespVO>> rankFunction) { | 89 | + private List<CrmStatisticsRankRespVO> getRank(CrmStatisticsRankReqVO rankReqVO, Function<CrmStatisticsRankReqVO, List<CrmStatisticsRankRespVO>> rankFunction) { |
| 90 | // 1. 获得用户编号数组 | 90 | // 1. 获得用户编号数组 |
| 91 | rankReqVO.setUserIds(getUserIds(rankReqVO.getDeptId())); | 91 | rankReqVO.setUserIds(getUserIds(rankReqVO.getDeptId())); |
| 92 | if (CollUtil.isEmpty(rankReqVO.getUserIds())) { | 92 | if (CollUtil.isEmpty(rankReqVO.getUserIds())) { |
| 93 | return Collections.emptyList(); | 93 | return Collections.emptyList(); |
| 94 | } | 94 | } |
| 95 | // 2. 获得排行数据 | 95 | // 2. 获得排行数据 |
| 96 | - List<CrmStatisticsRanKRespVO> ranks = rankFunction.apply(rankReqVO); | 96 | + List<CrmStatisticsRankRespVO> ranks = rankFunction.apply(rankReqVO); |
| 97 | if (CollUtil.isEmpty(ranks)) { | 97 | if (CollUtil.isEmpty(ranks)) { |
| 98 | return Collections.emptyList(); | 98 | return Collections.emptyList(); |
| 99 | } | 99 | } |
| 100 | - ranks.sort(Comparator.comparing(CrmStatisticsRanKRespVO::getCount).reversed()); | 100 | + ranks.sort(Comparator.comparing(CrmStatisticsRankRespVO::getCount).reversed()); |
| 101 | // 3. 拼接用户信息 | 101 | // 3. 拼接用户信息 |
| 102 | appendUserInfo(ranks); | 102 | appendUserInfo(ranks); |
| 103 | return ranks; | 103 | return ranks; |
| @@ -108,8 +108,8 @@ public class CrmStatisticsRankingServiceImpl implements CrmStatisticsRankingServ | @@ -108,8 +108,8 @@ public class CrmStatisticsRankingServiceImpl implements CrmStatisticsRankingServ | ||
| 108 | * | 108 | * |
| 109 | * @param ranks 排行榜数据 | 109 | * @param ranks 排行榜数据 |
| 110 | */ | 110 | */ |
| 111 | - private void appendUserInfo(List<CrmStatisticsRanKRespVO> ranks) { | ||
| 112 | - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSet(ranks, CrmStatisticsRanKRespVO::getOwnerUserId)); | 111 | + private void appendUserInfo(List<CrmStatisticsRankRespVO> ranks) { |
| 112 | + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSet(ranks, CrmStatisticsRankRespVO::getOwnerUserId)); | ||
| 113 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); | 113 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); |
| 114 | ranks.forEach(rank -> MapUtils.findAndThen(userMap, rank.getOwnerUserId(), user -> { | 114 | ranks.forEach(rank -> MapUtils.findAndThen(userMap, rank.getOwnerUserId(), user -> { |
| 115 | rank.setNickname(user.getNickname()); | 115 | rank.setNickname(user.getNickname()); |
yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsCustomerMapper.xml
0 → 100644
| 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"> | ||
| 3 | +<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsCustomerMapper"> | ||
| 4 | + | ||
| 5 | + | ||
| 6 | + <select id="selectCustomerCountGroupbyDate" | ||
| 7 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerCountVO"> | ||
| 8 | + SELECT | ||
| 9 | + DATE_FORMAT( create_time, #{sqlDateFormat,javaType=java.lang.String} ) AS category, | ||
| 10 | + count(*) AS count | ||
| 11 | + FROM | ||
| 12 | + crm_customer | ||
| 13 | + WHERE | ||
| 14 | + deleted = 0 | ||
| 15 | + AND owner_user_id IN | ||
| 16 | + <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||
| 17 | + #{userId} | ||
| 18 | + </foreach> | ||
| 19 | + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||
| 20 | + #{times[1],javaType=java.time.LocalDateTime} | ||
| 21 | + GROUP BY category | ||
| 22 | + </select> | ||
| 23 | + | ||
| 24 | + <select id="selectDealCustomerCountGroupbyDate" | ||
| 25 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerCountVO"> | ||
| 26 | + SELECT | ||
| 27 | + DATE_FORMAT( b.order_date, #{sqlDateFormat,javaType=java.lang.String} ) AS category, | ||
| 28 | + count( DISTINCT a.id ) AS count | ||
| 29 | + FROM | ||
| 30 | + crm_customer AS a | ||
| 31 | + LEFT JOIN crm_contract AS b ON b.customer_id = a.id | ||
| 32 | + WHERE | ||
| 33 | + a.deleted = 0 AND b.deleted = 0 | ||
| 34 | + AND b.audit_status = 20 | ||
| 35 | + AND a.owner_user_id IN | ||
| 36 | + <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||
| 37 | + #{userId} | ||
| 38 | + </foreach> | ||
| 39 | + AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||
| 40 | + #{times[1],javaType=java.time.LocalDateTime} | ||
| 41 | + GROUP BY category | ||
| 42 | + </select> | ||
| 43 | + | ||
| 44 | + <select id="selectRecordCountGroupbyDate" | ||
| 45 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerCountVO"> | ||
| 46 | + SELECT | ||
| 47 | + DATE_FORMAT( create_time, #{sqlDateFormat,javaType=java.lang.String} ) AS category, | ||
| 48 | + count(*) AS count | ||
| 49 | + FROM | ||
| 50 | + crm_follow_up_record | ||
| 51 | + WHERE | ||
| 52 | + creator IN | ||
| 53 | + <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||
| 54 | + #{userId} | ||
| 55 | + </foreach> | ||
| 56 | + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||
| 57 | + #{times[1],javaType=java.time.LocalDateTime} | ||
| 58 | + AND biz_type = #{bizType,javaType=java.lang.Integer} | ||
| 59 | + GROUP BY category | ||
| 60 | + </select> | ||
| 61 | + | ||
| 62 | + <select id="selectDistinctRecordCountGroupbyDate" | ||
| 63 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerCountVO"> | ||
| 64 | + SELECT | ||
| 65 | + DATE_FORMAT( create_time, #{sqlDateFormat,javaType=java.lang.String} ) AS category, | ||
| 66 | + count(DISTINCT biz_id) AS count | ||
| 67 | + FROM | ||
| 68 | + crm_follow_up_record | ||
| 69 | + WHERE | ||
| 70 | + creator IN | ||
| 71 | + <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||
| 72 | + #{userId} | ||
| 73 | + </foreach> | ||
| 74 | + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||
| 75 | + #{times[1],javaType=java.time.LocalDateTime} | ||
| 76 | + AND biz_type = #{bizType,javaType=java.lang.Integer} | ||
| 77 | + GROUP BY category | ||
| 78 | + </select> | ||
| 79 | + | ||
| 80 | + <select id="selectRecordCountGroupbyType" | ||
| 81 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerCountVO"> | ||
| 82 | + SELECT | ||
| 83 | + type AS category, | ||
| 84 | + count(*) AS count | ||
| 85 | + FROM crm_follow_up_record | ||
| 86 | + WHERE | ||
| 87 | + creator IN | ||
| 88 | + <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||
| 89 | + #{userId} | ||
| 90 | + </foreach> | ||
| 91 | + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||
| 92 | + #{times[1],javaType=java.time.LocalDateTime} | ||
| 93 | + AND biz_type = #{bizType,javaType=java.lang.Integer} | ||
| 94 | + GROUP BY category | ||
| 95 | + </select> | ||
| 96 | + | ||
| 97 | + <select id="selectCustomerCycleGroupbyDate" | ||
| 98 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerCountVO"> | ||
| 99 | + SELECT | ||
| 100 | + DATE_FORMAT( b.order_date, #{sqlDateFormat,javaType=java.lang.String} ) AS category, | ||
| 101 | + IFNULL( TRUNCATE ( AVG( TIMESTAMPDIFF( DAY, a.create_time, b.order_date )), 1 ), 0 ) AS cycle | ||
| 102 | + FROM crm_customer AS a | ||
| 103 | + LEFT JOIN crm_contract AS b ON b.customer_id = a.id | ||
| 104 | + WHERE | ||
| 105 | + a.deleted = 0 AND b.deleted = 0 | ||
| 106 | + AND b.audit_status = 20 | ||
| 107 | + AND a.owner_user_id IN | ||
| 108 | + <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||
| 109 | + #{userId} | ||
| 110 | + </foreach> | ||
| 111 | + AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||
| 112 | + #{times[1],javaType=java.time.LocalDateTime} | ||
| 113 | + GROUP BY category | ||
| 114 | + </select> | ||
| 115 | + | ||
| 116 | +</mapper> |
yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/bi/CrmBiRankingMapper.xml renamed to yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsRankMapper.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.crm.dal.mysql.statistics.CrmStatisticsRankingMapper"> | 3 | +<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsRankMapper"> |
| 4 | 4 | ||
| 5 | <select id="selectContractPriceRank" | 5 | <select id="selectContractPriceRank" |
| 6 | - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO"> | 6 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO"> |
| 7 | SELECT IFNULL(SUM(total_price), 0) AS count, owner_user_id | 7 | SELECT IFNULL(SUM(total_price), 0) AS count, owner_user_id |
| 8 | FROM crm_contract | 8 | FROM crm_contract |
| 9 | WHERE deleted = 0 | 9 | WHERE deleted = 0 |
| @@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
| 18 | </select> | 18 | </select> |
| 19 | 19 | ||
| 20 | <select id="selectReceivablePriceRank" | 20 | <select id="selectReceivablePriceRank" |
| 21 | - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO"> | 21 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO"> |
| 22 | SELECT IFNULL(SUM(price), 0) AS count, owner_user_id | 22 | SELECT IFNULL(SUM(price), 0) AS count, owner_user_id |
| 23 | FROM crm_receivable | 23 | FROM crm_receivable |
| 24 | WHERE deleted = 0 | 24 | WHERE deleted = 0 |
| @@ -33,7 +33,7 @@ | @@ -33,7 +33,7 @@ | ||
| 33 | </select> | 33 | </select> |
| 34 | 34 | ||
| 35 | <select id="selectContractCountRank" | 35 | <select id="selectContractCountRank" |
| 36 | - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO"> | 36 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO"> |
| 37 | SELECT COUNT(1) AS count, owner_user_id | 37 | SELECT COUNT(1) AS count, owner_user_id |
| 38 | FROM crm_contract | 38 | FROM crm_contract |
| 39 | WHERE deleted = 0 | 39 | WHERE deleted = 0 |
| @@ -49,7 +49,7 @@ | @@ -49,7 +49,7 @@ | ||
| 49 | 49 | ||
| 50 | <!-- TODO 待定 这里是否需要关联 crm_contract_product 表,计算销售额 --> | 50 | <!-- TODO 待定 这里是否需要关联 crm_contract_product 表,计算销售额 --> |
| 51 | <select id="selectProductSalesRank" | 51 | <select id="selectProductSalesRank" |
| 52 | - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO"> | 52 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO"> |
| 53 | SELECT COUNT(1) AS count, owner_user_id | 53 | SELECT COUNT(1) AS count, owner_user_id |
| 54 | FROM crm_contract | 54 | FROM crm_contract |
| 55 | WHERE deleted = 0 | 55 | WHERE deleted = 0 |
| @@ -64,7 +64,7 @@ | @@ -64,7 +64,7 @@ | ||
| 64 | </select> | 64 | </select> |
| 65 | 65 | ||
| 66 | <select id="selectCustomerCountRank" | 66 | <select id="selectCustomerCountRank" |
| 67 | - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO"> | 67 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO"> |
| 68 | SELECT COUNT(1) AS count, owner_user_id | 68 | SELECT COUNT(1) AS count, owner_user_id |
| 69 | FROM crm_customer | 69 | FROM crm_customer |
| 70 | WHERE deleted = 0 | 70 | WHERE deleted = 0 |
| @@ -78,7 +78,7 @@ | @@ -78,7 +78,7 @@ | ||
| 78 | </select> | 78 | </select> |
| 79 | 79 | ||
| 80 | <select id="selectContactsCountRank" | 80 | <select id="selectContactsCountRank" |
| 81 | - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO"> | 81 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO"> |
| 82 | SELECT COUNT(1) AS count, owner_user_id | 82 | SELECT COUNT(1) AS count, owner_user_id |
| 83 | FROM crm_contact | 83 | FROM crm_contact |
| 84 | WHERE deleted = 0 | 84 | WHERE deleted = 0 |
| @@ -92,7 +92,7 @@ | @@ -92,7 +92,7 @@ | ||
| 92 | </select> | 92 | </select> |
| 93 | 93 | ||
| 94 | <select id="selectFollowCountRank" | 94 | <select id="selectFollowCountRank" |
| 95 | - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO"> | 95 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO"> |
| 96 | SELECT COUNT(1) AS count, cc.owner_user_id | 96 | SELECT COUNT(1) AS count, cc.owner_user_id |
| 97 | FROM crm_follow_up_record AS cfur | 97 | FROM crm_follow_up_record AS cfur |
| 98 | LEFT JOIN crm_contact AS cc ON FIND_IN_SET(cc.id, cfur.contact_ids) | 98 | LEFT JOIN crm_contact AS cc ON FIND_IN_SET(cc.id, cfur.contact_ids) |
| @@ -108,7 +108,7 @@ | @@ -108,7 +108,7 @@ | ||
| 108 | </select> | 108 | </select> |
| 109 | 109 | ||
| 110 | <select id="selectFollowCustomerCountRank" | 110 | <select id="selectFollowCustomerCountRank" |
| 111 | - resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.CrmStatisticsRanKRespVO"> | 111 | + resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.rank.CrmStatisticsRankRespVO"> |
| 112 | SELECT COUNT(DISTINCT cc.id) AS count, cc.owner_user_id | 112 | SELECT COUNT(DISTINCT cc.id) AS count, cc.owner_user_id |
| 113 | FROM crm_follow_up_record AS cfur | 113 | FROM crm_follow_up_record AS cfur |
| 114 | LEFT JOIN crm_contact AS cc ON FIND_IN_SET(cc.id, cfur.contact_ids) | 114 | LEFT JOIN crm_contact AS cc ON FIND_IN_SET(cc.id, cfur.contact_ids) |