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 | 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 | 1 | package cn.iocoder.yudao.module.crm.controller.admin.statistics; |
| 2 | 2 | |
| 3 | 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 | 7 | import io.swagger.v3.oas.annotations.Operation; |
| 8 | 8 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 9 | 9 | import jakarta.annotation.Resource; |
| ... | ... | @@ -19,69 +19,69 @@ import java.util.List; |
| 19 | 19 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 20 | 20 | |
| 21 | 21 | |
| 22 | -@Tag(name = "管理后台 - CRM 排行榜统计") | |
| 22 | +@Tag(name = "管理后台 - CRM 数据统计 排行榜统计") | |
| 23 | 23 | @RestController |
| 24 | 24 | @RequestMapping("/crm/statistics-rank") |
| 25 | 25 | @Validated |
| 26 | 26 | public class CrmStatisticsRankController { |
| 27 | 27 | |
| 28 | 28 | @Resource |
| 29 | - private CrmStatisticsRankingService rankingService; | |
| 29 | + private CrmStatisticsRankService rankService; | |
| 30 | 30 | |
| 31 | 31 | @GetMapping("/get-contract-price-rank") |
| 32 | 32 | @Operation(summary = "获得合同金额排行榜") |
| 33 | 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 | 38 | @GetMapping("/get-receivable-price-rank") |
| 39 | 39 | @Operation(summary = "获得回款金额排行榜") |
| 40 | 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 | 45 | @GetMapping("/get-contract-count-rank") |
| 46 | 46 | @Operation(summary = "获得签约合同数量排行榜") |
| 47 | 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 | 52 | @GetMapping("/get-product-sales-rank") |
| 53 | 53 | @Operation(summary = "获得产品销量排行榜") |
| 54 | 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 | 59 | @GetMapping("/get-customer-count-rank") |
| 60 | 60 | @Operation(summary = "获得新增客户数排行榜") |
| 61 | 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 | 66 | @GetMapping("/get-contacts-count-rank") |
| 67 | 67 | @Operation(summary = "获得新增联系人数排行榜") |
| 68 | 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 | 73 | @GetMapping("/get-follow-count-rank") |
| 74 | 74 | @Operation(summary = "获得跟进次数排行榜") |
| 75 | 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 | 80 | @GetMapping("/get-follow-customer-count-rank") |
| 81 | 81 | @Operation(summary = "获得跟进客户数排行榜") |
| 82 | 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 | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | 4 | import jakarta.validation.constraints.NotEmpty; |
| ... | ... | @@ -11,7 +11,7 @@ import java.util.List; |
| 11 | 11 | |
| 12 | 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 | 15 | @Data |
| 16 | 16 | public class CrmStatisticsRankReqVO { |
| 17 | 17 | |
| ... | ... | @@ -21,7 +21,7 @@ public class CrmStatisticsRankReqVO { |
| 21 | 21 | |
| 22 | 22 | /** |
| 23 | 23 | * userIds 目前不用前端传递,目前是方便后端通过 deptId 读取编号后,设置回来 |
| 24 | - * | |
| 24 | + * <p> | |
| 25 | 25 | * 后续,可能会支持选择部分用户进行查询 |
| 26 | 26 | */ |
| 27 | 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 | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | 4 | import lombok.Data; |
| 5 | 5 | |
| 6 | 6 | |
| 7 | -@Schema(description = "管理后台 - CRM BI 排行榜统计 Response VO") | |
| 7 | +@Schema(description = "管理后台 - CRM 数据统计 排行榜统计 Response VO") | |
| 8 | 8 | @Data |
| 9 | -public class CrmStatisticsRanKRespVO { | |
| 9 | +public class CrmStatisticsRankRespVO { | |
| 10 | 10 | |
| 11 | 11 | @Schema(description = "负责人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 12 | 12 | private Long ownerUserId; |
| ... | ... | @@ -19,7 +19,7 @@ public class CrmStatisticsRanKRespVO { |
| 19 | 19 | |
| 20 | 20 | /** |
| 21 | 21 | * 数量是个特别“抽象”的概念,在不同排行下,代表不同含义 |
| 22 | - * | |
| 22 | + * <p> | |
| 23 | 23 | * 1. 金额:合同金额排行、回款金额排行 |
| 24 | 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 | 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 | 5 | import org.apache.ibatis.annotations.Mapper; |
| 6 | 6 | |
| 7 | 7 | import java.util.List; |
| 8 | 8 | |
| 9 | 9 | /** |
| 10 | - * CRM 排行榜统计 Mapper | |
| 10 | + * CRM 数据统计 排行榜统计 Mapper | |
| 11 | 11 | * |
| 12 | 12 | * @author anhaohao |
| 13 | 13 | */ |
| 14 | 14 | @Mapper |
| 15 | -public interface CrmStatisticsRankingMapper { | |
| 15 | +public interface CrmStatisticsRankMapper { | |
| 16 | 16 | |
| 17 | 17 | /** |
| 18 | 18 | * 查询合同金额排行榜 |
| ... | ... | @@ -20,7 +20,7 @@ public interface CrmStatisticsRankingMapper { |
| 20 | 20 | * @param rankReqVO 参数 |
| 21 | 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 | 28 | * @param rankReqVO 参数 |
| 29 | 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 | 36 | * @param rankReqVO 参数 |
| 37 | 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 | 44 | * @param rankReqVO 参数 |
| 45 | 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 | 52 | * @param rankReqVO 参数 |
| 53 | 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 | 60 | * @param rankReqVO 参数 |
| 61 | 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 | 68 | * @param rankReqVO 参数 |
| 69 | 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 | 76 | * @param rankReqVO 参数 |
| 77 | 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 | 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 | 7 | import java.util.List; |
| 8 | 8 | |
| 9 | 9 | /** |
| 10 | - * CRM 排行榜统计 Service 接口 | |
| 10 | + * CRM 数据统计 排行榜统计 Service 接口 | |
| 11 | 11 | * |
| 12 | 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 | 19 | * @param rankReqVO 排行参数 |
| 20 | 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 | 27 | * @param rankReqVO 排行参数 |
| 28 | 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 | 35 | * @param rankReqVO 排行参数 |
| 36 | 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 | 43 | * @param rankReqVO 排行参数 |
| 44 | 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 | 51 | * @param rankReqVO 排行参数 |
| 52 | 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 | 59 | * @param rankReqVO 排行参数 |
| 60 | 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 | 67 | * @param rankReqVO 排行参数 |
| 68 | 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 | 75 | * @param rankReqVO 排行参数 |
| 76 | 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 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 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 | 8 | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| 9 | 9 | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| 10 | 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 | 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 | 28 | * @author anhaohao |
| 29 | 29 | */ |
| 30 | 30 | @Service |
| 31 | 31 | @Validated |
| 32 | -public class CrmStatisticsRankingServiceImpl implements CrmStatisticsRankingService { | |
| 32 | +public class CrmStatisticsRankServiceImpl implements CrmStatisticsRankService { | |
| 33 | 33 | |
| 34 | 34 | @Resource |
| 35 | - private CrmStatisticsRankingMapper rankMapper; | |
| 35 | + private CrmStatisticsRankMapper rankMapper; | |
| 36 | 36 | |
| 37 | 37 | @Resource |
| 38 | 38 | private AdminUserApi adminUserApi; |
| ... | ... | @@ -40,64 +40,64 @@ public class CrmStatisticsRankingServiceImpl implements CrmStatisticsRankingServ |
| 40 | 40 | private DeptApi deptApi; |
| 41 | 41 | |
| 42 | 42 | @Override |
| 43 | - public List<CrmStatisticsRanKRespVO> getContractPriceRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 43 | + public List<CrmStatisticsRankRespVO> getContractPriceRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 44 | 44 | return getRank(rankReqVO, rankMapper::selectContractPriceRank); |
| 45 | 45 | } |
| 46 | 46 | |
| 47 | 47 | @Override |
| 48 | - public List<CrmStatisticsRanKRespVO> getReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 48 | + public List<CrmStatisticsRankRespVO> getReceivablePriceRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 49 | 49 | return getRank(rankReqVO, rankMapper::selectReceivablePriceRank); |
| 50 | 50 | } |
| 51 | 51 | |
| 52 | 52 | @Override |
| 53 | - public List<CrmStatisticsRanKRespVO> getContractCountRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 53 | + public List<CrmStatisticsRankRespVO> getContractCountRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 54 | 54 | return getRank(rankReqVO, rankMapper::selectContractCountRank); |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | 57 | @Override |
| 58 | - public List<CrmStatisticsRanKRespVO> getProductSalesRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 58 | + public List<CrmStatisticsRankRespVO> getProductSalesRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 59 | 59 | return getRank(rankReqVO, rankMapper::selectProductSalesRank); |
| 60 | 60 | } |
| 61 | 61 | |
| 62 | 62 | @Override |
| 63 | - public List<CrmStatisticsRanKRespVO> getCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 63 | + public List<CrmStatisticsRankRespVO> getCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 64 | 64 | return getRank(rankReqVO, rankMapper::selectCustomerCountRank); |
| 65 | 65 | } |
| 66 | 66 | |
| 67 | 67 | @Override |
| 68 | - public List<CrmStatisticsRanKRespVO> getContactsCountRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 68 | + public List<CrmStatisticsRankRespVO> getContactsCountRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 69 | 69 | return getRank(rankReqVO, rankMapper::selectContactsCountRank); |
| 70 | 70 | } |
| 71 | 71 | |
| 72 | 72 | @Override |
| 73 | - public List<CrmStatisticsRanKRespVO> getFollowCountRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 73 | + public List<CrmStatisticsRankRespVO> getFollowCountRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 74 | 74 | return getRank(rankReqVO, rankMapper::selectFollowCountRank); |
| 75 | 75 | } |
| 76 | 76 | |
| 77 | 77 | @Override |
| 78 | - public List<CrmStatisticsRanKRespVO> getFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 78 | + public List<CrmStatisticsRankRespVO> getFollowCustomerCountRank(CrmStatisticsRankReqVO rankReqVO) { | |
| 79 | 79 | return getRank(rankReqVO, rankMapper::selectFollowCustomerCountRank); |
| 80 | 80 | } |
| 81 | 81 | |
| 82 | 82 | /** |
| 83 | 83 | * 获得排行版数据 |
| 84 | 84 | * |
| 85 | - * @param rankReqVO 参数 | |
| 85 | + * @param rankReqVO 参数 | |
| 86 | 86 | * @param rankFunction 排行榜方法 |
| 87 | 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 | 90 | // 1. 获得用户编号数组 |
| 91 | 91 | rankReqVO.setUserIds(getUserIds(rankReqVO.getDeptId())); |
| 92 | 92 | if (CollUtil.isEmpty(rankReqVO.getUserIds())) { |
| 93 | 93 | return Collections.emptyList(); |
| 94 | 94 | } |
| 95 | 95 | // 2. 获得排行数据 |
| 96 | - List<CrmStatisticsRanKRespVO> ranks = rankFunction.apply(rankReqVO); | |
| 96 | + List<CrmStatisticsRankRespVO> ranks = rankFunction.apply(rankReqVO); | |
| 97 | 97 | if (CollUtil.isEmpty(ranks)) { |
| 98 | 98 | return Collections.emptyList(); |
| 99 | 99 | } |
| 100 | - ranks.sort(Comparator.comparing(CrmStatisticsRanKRespVO::getCount).reversed()); | |
| 100 | + ranks.sort(Comparator.comparing(CrmStatisticsRankRespVO::getCount).reversed()); | |
| 101 | 101 | // 3. 拼接用户信息 |
| 102 | 102 | appendUserInfo(ranks); |
| 103 | 103 | return ranks; |
| ... | ... | @@ -108,8 +108,8 @@ public class CrmStatisticsRankingServiceImpl implements CrmStatisticsRankingServ |
| 108 | 108 | * |
| 109 | 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 | 113 | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId)); |
| 114 | 114 | ranks.forEach(rank -> MapUtils.findAndThen(userMap, rank.getOwnerUserId(), user -> { |
| 115 | 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 | 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 2 | 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 | 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 | 7 | SELECT IFNULL(SUM(total_price), 0) AS count, owner_user_id |
| 8 | 8 | FROM crm_contract |
| 9 | 9 | WHERE deleted = 0 |
| ... | ... | @@ -18,7 +18,7 @@ |
| 18 | 18 | </select> |
| 19 | 19 | |
| 20 | 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 | 22 | SELECT IFNULL(SUM(price), 0) AS count, owner_user_id |
| 23 | 23 | FROM crm_receivable |
| 24 | 24 | WHERE deleted = 0 |
| ... | ... | @@ -33,7 +33,7 @@ |
| 33 | 33 | </select> |
| 34 | 34 | |
| 35 | 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 | 37 | SELECT COUNT(1) AS count, owner_user_id |
| 38 | 38 | FROM crm_contract |
| 39 | 39 | WHERE deleted = 0 |
| ... | ... | @@ -49,7 +49,7 @@ |
| 49 | 49 | |
| 50 | 50 | <!-- TODO 待定 这里是否需要关联 crm_contract_product 表,计算销售额 --> |
| 51 | 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 | 53 | SELECT COUNT(1) AS count, owner_user_id |
| 54 | 54 | FROM crm_contract |
| 55 | 55 | WHERE deleted = 0 |
| ... | ... | @@ -64,7 +64,7 @@ |
| 64 | 64 | </select> |
| 65 | 65 | |
| 66 | 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 | 68 | SELECT COUNT(1) AS count, owner_user_id |
| 69 | 69 | FROM crm_customer |
| 70 | 70 | WHERE deleted = 0 |
| ... | ... | @@ -78,7 +78,7 @@ |
| 78 | 78 | </select> |
| 79 | 79 | |
| 80 | 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 | 82 | SELECT COUNT(1) AS count, owner_user_id |
| 83 | 83 | FROM crm_contact |
| 84 | 84 | WHERE deleted = 0 |
| ... | ... | @@ -92,7 +92,7 @@ |
| 92 | 92 | </select> |
| 93 | 93 | |
| 94 | 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 | 96 | SELECT COUNT(1) AS count, cc.owner_user_id |
| 97 | 97 | FROM crm_follow_up_record AS cfur |
| 98 | 98 | LEFT JOIN crm_contact AS cc ON FIND_IN_SET(cc.id, cfur.contact_ids) |
| ... | ... | @@ -108,7 +108,7 @@ |
| 108 | 108 | </select> |
| 109 | 109 | |
| 110 | 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 | 112 | SELECT COUNT(DISTINCT cc.id) AS count, cc.owner_user_id |
| 113 | 113 | FROM crm_follow_up_record AS cfur |
| 114 | 114 | LEFT JOIN crm_contact AS cc ON FIND_IN_SET(cc.id, cfur.contact_ids) | ... | ... |