diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsPortraitController.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsPortraitController.java index 0f1e9e6355ffe91172df4f3eae27afca31a8f1b5..986e2268c404615e45ce3dc4751b293b2e58e39c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsPortraitController.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/CrmStatisticsPortraitController.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.crm.controller.admin.statistics; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerReqVO; +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticsPortraitReqVO; import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerAreaRespVO; import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerIndustryRespVO; import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerLevelRespVO; @@ -30,34 +30,32 @@ public class CrmStatisticsPortraitController { @Resource private CrmStatisticsPortraitService statisticsPortraitService; - // TODO @puhui999:搞个属于自己的 CrmStatisticsCustomerReqVO 类哈 - @GetMapping("/get-customer-area-summary") @Operation(summary = "获取客户地区统计数据", description = "用于【城市分布分析】页面") @PreAuthorize("@ss.hasPermission('crm:statistics-portrait:query')") - public CommonResult> getCustomerAreaSummary(@Valid CrmStatisticsCustomerReqVO reqVO) { - return success(statisticsPortraitService.getCustomerAreaSummary(reqVO)); + public CommonResult> getCustomerAreaSummary(@Valid CrmStatisticsPortraitReqVO reqVO) { + return success(statisticsPortraitService.getCustomerSummaryByArea(reqVO)); } @GetMapping("/get-customer-industry-summary") @Operation(summary = "获取客户行业统计数据", description = "用于【客户行业分析】页面") @PreAuthorize("@ss.hasPermission('crm:statistics-portrait:query')") - public CommonResult> getCustomerIndustrySummary(@Valid CrmStatisticsCustomerReqVO reqVO) { - return success(statisticsPortraitService.getCustomerIndustrySummary(reqVO)); + public CommonResult> getCustomerIndustrySummary(@Valid CrmStatisticsPortraitReqVO reqVO) { + return success(statisticsPortraitService.getCustomerSummaryByIndustry(reqVO)); } @GetMapping("/get-customer-level-summary") @Operation(summary = "获取客户级别统计数据", description = "用于【客户级别分析】页面") @PreAuthorize("@ss.hasPermission('crm:statistics-portrait:query')") - public CommonResult> getCustomerLevelSummary(@Valid CrmStatisticsCustomerReqVO reqVO) { - return success(statisticsPortraitService.getCustomerLevelSummary(reqVO)); + public CommonResult> getCustomerLevelSummary(@Valid CrmStatisticsPortraitReqVO reqVO) { + return success(statisticsPortraitService.getCustomerSummaryByLevel(reqVO)); } @GetMapping("/get-customer-source-summary") @Operation(summary = "获取客户来源统计数据", description = "用于【客户来源分析】页面") @PreAuthorize("@ss.hasPermission('crm:statistics-portrait:query')") - public CommonResult> getCustomerSourceSummary(@Valid CrmStatisticsCustomerReqVO reqVO) { - return success(statisticsPortraitService.getCustomerSourceSummary(reqVO)); + public CommonResult> getCustomerSourceSummary(@Valid CrmStatisticsPortraitReqVO reqVO) { + return success(statisticsPortraitService.getCustomerSummaryBySource(reqVO)); } } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerAreaRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerAreaRespVO.java index e83563d5b174bd66fc904a75a2991a541113fd06..3420e7e5b61e89eee29535b7c85d79e6907a5df3 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerAreaRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerAreaRespVO.java @@ -18,12 +18,4 @@ public class CrmStatisticCustomerAreaRespVO { @Schema(description = "成交个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer dealCount; - // TODO @puhui999:下面两个的计算,交给前端。后端只返回数据即可。 - - @Schema(description = "省份占比(%)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Double areaPortion; - - @Schema(description = "成交占比(%)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Double dealPortion; - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerIndustryRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerIndustryRespVO.java index 4029a42b030aa52a6e10cd4c5c755dbeeffe4bbd..84b8de70f306a43abf88096251773730ae5ea812 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerIndustryRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerIndustryRespVO.java @@ -9,9 +9,6 @@ public class CrmStatisticCustomerIndustryRespVO { @Schema(description = "客户行业ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") private Integer industryId; - // TODO @puhui999:这个前端字典翻译哈 - @Schema(description = "客户行业名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - private String industryName; @Schema(description = "客户个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer customerCount; @@ -19,12 +16,4 @@ public class CrmStatisticCustomerIndustryRespVO { @Schema(description = "成交个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer dealCount; - // TODO @puhui999:下面两个的计算,交给前端。后端只返回数据即可。 - - @Schema(description = "行业占比(%)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Double industryPortion; - - @Schema(description = "成交占比(%)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Double dealPortion; - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerLevelRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerLevelRespVO.java index c438ee21e190135724a6cc00b07741cb9bae9794..dea4eeb0c8d26d21633dd8c5d350439895b7d77f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerLevelRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerLevelRespVO.java @@ -9,9 +9,6 @@ public class CrmStatisticCustomerLevelRespVO { @Schema(description = "客户级别编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") private Integer level; - // TODO @puhui999:这个前端字典翻译哈 - @Schema(description = "客户级别名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - private String levelName; @Schema(description = "客户个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer customerCount; @@ -19,12 +16,4 @@ public class CrmStatisticCustomerLevelRespVO { @Schema(description = "成交个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer dealCount; - // TODO @puhui999:下面两个的计算,交给前端。后端只返回数据即可。 - - @Schema(description = "级别占比(%)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Double levelPortion; - - @Schema(description = "成交占比(%)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Double dealPortion; - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerSourceRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerSourceRespVO.java index e66a5c634f4abd3ec810f15df6a5301f48e65b24..61b9688ff4191c86192b2c7e67e02d4ae5967261 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerSourceRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticCustomerSourceRespVO.java @@ -9,9 +9,6 @@ public class CrmStatisticCustomerSourceRespVO { @Schema(description = "客户来源编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") private Integer source; - // TODO @puhui999:这个前端字典翻译哈 - @Schema(description = "客户来源名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - private String sourceName; @Schema(description = "客户个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer customerCount; @@ -19,12 +16,4 @@ public class CrmStatisticCustomerSourceRespVO { @Schema(description = "成交个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer dealCount; - // TODO @puhui999:下面两个的计算,交给前端。后端只返回数据即可。 - - @Schema(description = "来源占比(%)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Double sourcePortion; - - @Schema(description = "成交占比(%)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Double dealPortion; - } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticsPortraitReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticsPortraitReqVO.java new file mode 100644 index 0000000000000000000000000000000000000000..c284e7457f213b987c76da86a9917982a16623be --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/statistics/vo/portrait/CrmStatisticsPortraitReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - CRM 客户画像 Request VO") +@Data +public class CrmStatisticsPortraitReqVO { + + @Schema(description = "部门 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "部门 id 不能为空") + private Long deptId; + + /** + * 负责人用户 id, 当用户为空, 则计算部门下用户 + */ + @Schema(description = "负责人用户 id", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1") + private Long userId; + + /** + * userIds 目前不用前端传递,目前是方便后端通过 deptId 读取编号后,设置回来 + * 后续,可能会支持选择部分用户进行查询 + */ + @Schema(description = "负责人用户 id 集合", hidden = true, example = "2") + private List userIds; + + /** + * 前端如果选择自定义时间, 那么前端传递起始-终止时间, 如果选择其他时间间隔类型, 则由后台计算起始-终止时间 + * 并作为参数传递给Mapper + */ + @Schema(description = "时间范围", requiredMode = Schema.RequiredMode.NOT_REQUIRED) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] times; + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsPortraitMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsPortraitMapper.java index 193cc930726ab7ed53b88a360419d44167d0e72c..a7c942752b606459e5e5a931ce2c4e2a2ec963b7 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsPortraitMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/statistics/CrmStatisticsPortraitMapper.java @@ -1,10 +1,6 @@ package cn.iocoder.yudao.module.crm.dal.mysql.statistics; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.*; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerAreaRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerIndustryRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerLevelRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerSourceRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.*; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -17,14 +13,12 @@ import java.util.List; @Mapper public interface CrmStatisticsPortraitMapper { - // TODO @puuhui999:GroupBy + List selectSummaryListGroupByAreaId(CrmStatisticsPortraitReqVO reqVO); - List selectCustomerIndustryListGroupbyIndustryId(CrmStatisticsCustomerReqVO reqVO); + List selectCustomerIndustryListGroupByIndustryId(CrmStatisticsPortraitReqVO reqVO); - List selectCustomerSourceListGroupbySource(CrmStatisticsCustomerReqVO reqVO); + List selectCustomerSourceListGroupBySource(CrmStatisticsPortraitReqVO reqVO); - List selectCustomerLevelListGroupbyLevel(CrmStatisticsCustomerReqVO reqVO); - - List selectSummaryListByAreaId(CrmStatisticsCustomerReqVO reqVO); + List selectCustomerLevelListGroupByLevel(CrmStatisticsPortraitReqVO reqVO); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitService.java index dd1f3e3dafd9229346561781412037b032e4299f..c568d3b4ec689d9d9f36cafe24440f2b040cdfc2 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitService.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitService.java @@ -1,10 +1,6 @@ package cn.iocoder.yudao.module.crm.service.statistics; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerAreaRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerIndustryRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerLevelRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerSourceRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.*; import java.util.List; @@ -21,7 +17,7 @@ public interface CrmStatisticsPortraitService { * @param reqVO 请求参数 * @return 统计数据 */ - List getCustomerAreaSummary(CrmStatisticsCustomerReqVO reqVO); + List getCustomerSummaryByArea(CrmStatisticsPortraitReqVO reqVO); /** * 获取客户行业统计数据 @@ -29,7 +25,7 @@ public interface CrmStatisticsPortraitService { * @param reqVO 请求参数 * @return 统计数据 */ - List getCustomerIndustrySummary(CrmStatisticsCustomerReqVO reqVO); + List getCustomerSummaryByIndustry(CrmStatisticsPortraitReqVO reqVO); /** * 获取客户级别统计数据 @@ -37,7 +33,7 @@ public interface CrmStatisticsPortraitService { * @param reqVO 请求参数 * @return 统计数据 */ - List getCustomerLevelSummary(CrmStatisticsCustomerReqVO reqVO); + List getCustomerSummaryByLevel(CrmStatisticsPortraitReqVO reqVO); /** * 获取客户来源统计数据 @@ -45,6 +41,6 @@ public interface CrmStatisticsPortraitService { * @param reqVO 请求参数 * @return 统计数据 */ - List getCustomerSourceSummary(CrmStatisticsCustomerReqVO reqVO); + List getCustomerSummaryBySource(CrmStatisticsPortraitReqVO reqVO); } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitServiceImpl.java index e38a702bcb0598b379d8e28583177d9704f4be76..9863f62fcf953ee26fd7657b70158e9ee3ff3ad2 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/statistics/CrmStatisticsPortraitServiceImpl.java @@ -5,15 +5,10 @@ import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.ip.core.Area; import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum; import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerReqVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerAreaRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerIndustryRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerLevelRespVO; -import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.CrmStatisticCustomerSourceRespVO; +import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.portrait.*; import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsPortraitMapper; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; -import cn.iocoder.yudao.module.system.api.dict.DictDataApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; @@ -26,9 +21,7 @@ import java.util.Map; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; -import static cn.iocoder.yudao.module.crm.enums.DictTypeConstants.*; -// TODO @puhui999:参考 CrmStatisticsCustomerServiceImpl 代码风格,优化下这个类哈;包括命名、空行、注释等; /** * CRM 客户画像 Service 实现类 * @@ -44,64 +37,54 @@ public class CrmStatisticsPortraitServiceImpl implements CrmStatisticsPortraitSe private AdminUserApi adminUserApi; @Resource private DeptApi deptApi; - @Resource - private DictDataApi dictDataApi; @Override - public List getCustomerAreaSummary(CrmStatisticsCustomerReqVO reqVO) { - // 1. 获得用户编号数组 + public List getCustomerSummaryByArea(CrmStatisticsPortraitReqVO reqVO) { + // 1.1 获得用户编号数组 List userIds = getUserIds(reqVO); if (CollUtil.isEmpty(userIds)) { return Collections.emptyList(); } reqVO.setUserIds(userIds); - // 2. 获取客户地区统计数据 - List list = portraitMapper.selectSummaryListByAreaId(reqVO); + // 1.2 获取客户地区统计数据 + List list = portraitMapper.selectSummaryListGroupByAreaId(reqVO); if (CollUtil.isEmpty(list)) { return Collections.emptyList(); } - // 拼接数据 + // 2. 拼接数据 List areaList = AreaUtils.getByType(AreaTypeEnum.PROVINCE, area -> area); areaList.add(new Area().setId(null).setName("未知")); Map areaMap = convertMap(areaList, Area::getId); - List customerAreaRespVOList = convertList(list, item -> { + return convertList(list, item -> { Integer parentId = AreaUtils.getParentIdByType(item.getAreaId(), AreaTypeEnum.PROVINCE); - // TODO @puhui999:找不到,可以归到未知哈; - if (parentId == null) { - return item; + if (parentId == null) { // 找不到,归到未知 + return item.setAreaId(null).setAreaName("未知"); } findAndThen(areaMap, parentId, area -> item.setAreaId(parentId).setAreaName(area.getName())); return item; }); - return customerAreaRespVOList; } @Override - public List getCustomerIndustrySummary(CrmStatisticsCustomerReqVO reqVO) { + public List getCustomerSummaryByIndustry(CrmStatisticsPortraitReqVO reqVO) { // 1. 获得用户编号数组 List userIds = getUserIds(reqVO); if (CollUtil.isEmpty(userIds)) { return Collections.emptyList(); } reqVO.setUserIds(userIds); + // 2. 获取客户行业统计数据 - List industryRespVOList = portraitMapper.selectCustomerIndustryListGroupbyIndustryId(reqVO); + List industryRespVOList = portraitMapper.selectCustomerIndustryListGroupByIndustryId(reqVO); if (CollUtil.isEmpty(industryRespVOList)) { return Collections.emptyList(); } - - return convertList(industryRespVOList, item -> { - if (ObjUtil.isNull(item.getIndustryId())) { - return item; - } - item.setIndustryName(dictDataApi.getDictDataLabel(CRM_CUSTOMER_INDUSTRY, item.getIndustryId())); - return item; - }); + return industryRespVOList; } @Override - public List getCustomerSourceSummary(CrmStatisticsCustomerReqVO reqVO) { + public List getCustomerSummaryBySource(CrmStatisticsPortraitReqVO reqVO) { // 1. 获得用户编号数组 List userIds = getUserIds(reqVO); if (CollUtil.isEmpty(userIds)) { @@ -110,41 +93,28 @@ public class CrmStatisticsPortraitServiceImpl implements CrmStatisticsPortraitSe reqVO.setUserIds(userIds); // 2. 获取客户行业统计数据 - List sourceRespVOList = portraitMapper.selectCustomerSourceListGroupbySource(reqVO); + List sourceRespVOList = portraitMapper.selectCustomerSourceListGroupBySource(reqVO); if (CollUtil.isEmpty(sourceRespVOList)) { return Collections.emptyList(); } - - return convertList(sourceRespVOList, item -> { - if (ObjUtil.isNull(item.getSource())) { - return item; - } - item.setSourceName(dictDataApi.getDictDataLabel(CRM_CUSTOMER_SOURCE, item.getSource())); - return item; - }); + return sourceRespVOList; } @Override - public List getCustomerLevelSummary(CrmStatisticsCustomerReqVO reqVO) { + public List getCustomerSummaryByLevel(CrmStatisticsPortraitReqVO reqVO) { // 1. 获得用户编号数组 List userIds = getUserIds(reqVO); if (CollUtil.isEmpty(userIds)) { return Collections.emptyList(); } reqVO.setUserIds(userIds); - // 2. 获取客户行业统计数据 - List levelRespVOList = portraitMapper.selectCustomerLevelListGroupbyLevel(reqVO); + + // 2. 获取客户级别统计数据 + List levelRespVOList = portraitMapper.selectCustomerLevelListGroupByLevel(reqVO); if (CollUtil.isEmpty(levelRespVOList)) { return Collections.emptyList(); } - - return convertList(levelRespVOList, item -> { - if (ObjUtil.isNull(item.getLevel())) { - return item; - } - item.setLevelName(dictDataApi.getDictDataLabel(CRM_CUSTOMER_LEVEL, item.getLevel())); - return item; - }); + return levelRespVOList; } /** @@ -153,7 +123,7 @@ public class CrmStatisticsPortraitServiceImpl implements CrmStatisticsPortraitSe * @param reqVO 请求参数 * @return 用户编号数组 */ - private List getUserIds(CrmStatisticsCustomerReqVO reqVO) { + private List getUserIds(CrmStatisticsPortraitReqVO reqVO) { // 情况一:选中某个用户 if (ObjUtil.isNotNull(reqVO.getUserId())) { return List.of(reqVO.getUserId()); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsPortraitMapper.xml b/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsPortraitMapper.xml index 946bd292b895bab582000e48f3c20ddbb1ac985e..42056a48b5441966c57eefc02d29a60d890ccba4 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsPortraitMapper.xml +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/statistics/CrmStatisticsPortraitMapper.xml @@ -2,91 +2,60 @@ - - - + SELECT area_id, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount + FROM crm_customer + WHERE deleted = 0 AND area_id IS NOT NULL AND owner_user_id IN #{userId} - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND - #{times[1],javaType=java.time.LocalDateTime} - GROUP BY - industry_id; + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} + AND #{times[1],javaType=java.time.LocalDateTime} + GROUP BY area_id - + SELECT industry_id, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount + FROM crm_customer + WHERE deleted = 0 AND industry_id IS NOT NULL AND owner_user_id IN #{userId} - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND - #{times[1],javaType=java.time.LocalDateTime} - GROUP BY - source; + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} + AND #{times[1],javaType=java.time.LocalDateTime} + GROUP BY industry_id - + SELECT source, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount + FROM crm_customer + WHERE deleted = 0 AND source IS NOT NULL AND owner_user_id IN #{userId} - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND - #{times[1],javaType=java.time.LocalDateTime} - GROUP BY - level; + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} + AND #{times[1],javaType=java.time.LocalDateTime} + GROUP BY source - + SELECT level, COUNT(*) AS customerCount, SUM(deal_status) AS dealCount + FROM crm_customer + WHERE deleted = 0 AND level IS NOT NULL AND owner_user_id IN #{userId} - AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND - #{times[1],javaType=java.time.LocalDateTime} - GROUP BY - area_id; + AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} + AND #{times[1],javaType=java.time.LocalDateTime} + GROUP BY level