mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	fix: [CRM-客户统计]根据Code-Review 修改代码
This commit is contained in:
		| @@ -1,6 +1,5 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer; | ||||
|  | ||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import jakarta.validation.constraints.NotEmpty; | ||||
| import jakarta.validation.constraints.NotNull; | ||||
| @@ -48,11 +47,4 @@ public class CrmStatisticsCustomerReqVO { | ||||
|     @Schema(description = "Group By 日期格式", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "%Y%m") | ||||
|     private String sqlDateFormat; | ||||
|  | ||||
|     // TODO @dhb52:这个字段,目前是不是没啥用呀? | ||||
|     /** | ||||
|      * 数据类型 {@link CrmBizTypeEnum} | ||||
|      */ | ||||
|     @Schema(description = "数据类型", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2") | ||||
|     private Integer bizType; | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -13,33 +13,32 @@ import java.util.List; | ||||
| @Mapper | ||||
| public interface CrmStatisticsCustomerMapper { | ||||
|  | ||||
|     // TODO @dhb52:拼写,GroupBy。一般 idea 如果出现绿色的警告,可能是单词拼写错误,建议是要修改的哈; | ||||
|     List<CrmStatisticsCustomerSummaryByDateRespVO> selectCustomerCreateCountGroupbyDate(CrmStatisticsCustomerReqVO reqVO); // 已经 review | ||||
|     List<CrmStatisticsCustomerSummaryByDateRespVO> selectCustomerCreateCountGroupByDate(CrmStatisticsCustomerReqVO reqVO); // 已经 review | ||||
|  | ||||
|     List<CrmStatisticsCustomerSummaryByDateRespVO> selectCustomerDealCountGroupbyDate(CrmStatisticsCustomerReqVO reqVO); // 已经 review | ||||
|     List<CrmStatisticsCustomerSummaryByDateRespVO> selectCustomerDealCountGroupByDate(CrmStatisticsCustomerReqVO reqVO); // 已经 review | ||||
|  | ||||
|     List<CrmStatisticsCustomerSummaryByUserRespVO> selectCustomerCreateCountGroupbyUser(CrmStatisticsCustomerReqVO reqVO); // 已经 review | ||||
|     List<CrmStatisticsCustomerSummaryByUserRespVO> selectCustomerCreateCountGroupByUser(CrmStatisticsCustomerReqVO reqVO); // 已经 review | ||||
|  | ||||
|     List<CrmStatisticsCustomerSummaryByUserRespVO> selectCustomerDealCountGroupbyUser(CrmStatisticsCustomerReqVO crmStatisticsCustomerReqVO); // 已经 review | ||||
|     List<CrmStatisticsCustomerSummaryByUserRespVO> selectCustomerDealCountGroupByUser(CrmStatisticsCustomerReqVO crmStatisticsCustomerReqVO); // 已经 review | ||||
|  | ||||
|     List<CrmStatisticsCustomerSummaryByUserRespVO> selectContractPriceGroupbyUser(CrmStatisticsCustomerReqVO crmStatisticsCustomerReqVO); // 已经 review | ||||
|     List<CrmStatisticsCustomerSummaryByUserRespVO> selectContractPriceGroupByUser(CrmStatisticsCustomerReqVO crmStatisticsCustomerReqVO); // 已经 review | ||||
|  | ||||
|     List<CrmStatisticsCustomerSummaryByUserRespVO> selectReceivablePriceGroupbyUser(CrmStatisticsCustomerReqVO crmStatisticsCustomerReqVO);  // 已经 review | ||||
|     List<CrmStatisticsCustomerSummaryByUserRespVO> selectReceivablePriceGroupByUser(CrmStatisticsCustomerReqVO crmStatisticsCustomerReqVO);  // 已经 review | ||||
|  | ||||
|     List<CrmStatisticsFollowupSummaryByDateRespVO> selectFollowupRecordCountGroupbyDate(CrmStatisticsCustomerReqVO reqVO); | ||||
|     List<CrmStatisticsFollowupSummaryByDateRespVO> selectFollowupRecordCountGroupByDate(CrmStatisticsCustomerReqVO reqVO); | ||||
|  | ||||
|     List<CrmStatisticsFollowupSummaryByDateRespVO> selectFollowupCustomerCountGroupbyDate(CrmStatisticsCustomerReqVO reqVO); | ||||
|     List<CrmStatisticsFollowupSummaryByDateRespVO> selectFollowupCustomerCountGroupByDate(CrmStatisticsCustomerReqVO reqVO); | ||||
|  | ||||
|     List<CrmStatisticsFollowupSummaryByUserRespVO> selectFollowupRecordCountGroupbyUser(CrmStatisticsCustomerReqVO reqVO); | ||||
|     List<CrmStatisticsFollowupSummaryByUserRespVO> selectFollowupRecordCountGroupByUser(CrmStatisticsCustomerReqVO reqVO); | ||||
|  | ||||
|     List<CrmStatisticsFollowupSummaryByUserRespVO> selectFollowupCustomerCountGroupbyUser(CrmStatisticsCustomerReqVO reqVO); | ||||
|     List<CrmStatisticsFollowupSummaryByUserRespVO> selectFollowupCustomerCountGroupByUser(CrmStatisticsCustomerReqVO reqVO); | ||||
|  | ||||
|     List<CrmStatisticsCustomerContractSummaryRespVO> selectContractSummary(CrmStatisticsCustomerReqVO reqVO); | ||||
|  | ||||
|     List<CrmStatisticsFollowupSummaryByTypeRespVO> selectFollowupRecordCountGroupbyType(CrmStatisticsCustomerReqVO reqVO); | ||||
|     List<CrmStatisticsFollowupSummaryByTypeRespVO> selectFollowupRecordCountGroupByType(CrmStatisticsCustomerReqVO reqVO); | ||||
|  | ||||
|     List<CrmStatisticsCustomerDealCycleByDateRespVO> selectCustomerDealCycleGroupbyDate(CrmStatisticsCustomerReqVO reqVO); | ||||
|     List<CrmStatisticsCustomerDealCycleByDateRespVO> selectCustomerDealCycleGroupByDate(CrmStatisticsCustomerReqVO reqVO); | ||||
|  | ||||
|     List<CrmStatisticsCustomerDealCycleByUserRespVO> selectCustomerDealCycleGroupbyUser(CrmStatisticsCustomerReqVO reqVO); | ||||
|     List<CrmStatisticsCustomerDealCycleByUserRespVO> selectCustomerDealCycleGroupByUser(CrmStatisticsCustomerReqVO reqVO); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.*; | ||||
| import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsCustomerMapper; | ||||
| import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; | ||||
| 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; | ||||
| @@ -20,7 +19,6 @@ import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
| import java.time.LocalDateTime; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| @@ -58,87 +56,83 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe | ||||
|     @Override | ||||
|     public List<CrmStatisticsCustomerSummaryByDateRespVO> getCustomerSummaryByDate(CrmStatisticsCustomerReqVO reqVO) { | ||||
|         // 1. 获得用户编号数组 | ||||
|         final List<Long> userIds = getUserIds(reqVO); | ||||
|         List<Long> userIds = getUserIds(reqVO); | ||||
|         if (CollUtil.isEmpty(userIds)) { | ||||
|             return Collections.emptyList(); | ||||
|         } | ||||
|         reqVO.setUserIds(userIds); | ||||
|  | ||||
|         // 2. 获取分项统计数据 | ||||
|         // TODO @dhb52:如果是 list 变量,要么 List 要么 s 后缀 | ||||
|         reqVO.setSqlDateFormat(getSqlDateFormat(reqVO.getTimes()[0], reqVO.getTimes()[1])); | ||||
|         final List<CrmStatisticsCustomerSummaryByDateRespVO> customerCreateCount = customerMapper.selectCustomerCreateCountGroupbyDate(reqVO); | ||||
|         final List<CrmStatisticsCustomerSummaryByDateRespVO> customerDealCount = customerMapper.selectCustomerDealCountGroupbyDate(reqVO); | ||||
|         List<CrmStatisticsCustomerSummaryByDateRespVO> customerCreateCountVoList = customerMapper.selectCustomerCreateCountGroupByDate(reqVO); | ||||
|         List<CrmStatisticsCustomerSummaryByDateRespVO> customerDealCountVoList = customerMapper.selectCustomerDealCountGroupByDate(reqVO); | ||||
|  | ||||
|         // 3. 获取时间序列 | ||||
|         // TODO @dhb52:3 和 4 其实做的是一类事情,所以可以考虑 3.1 获取时间序列、3.2 合并统计数据 这样注释;然后中间就不空行了;就是说,一般空行的目的,是让逻辑分片,看着整体性更好,但是不能让逻辑感觉碎碎的; | ||||
|         final List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]); | ||||
|  | ||||
|         // 4. 合并统计数据 | ||||
|         // TODO @dhb52:这个是不是要 add 到 respVoList 里?或者还可以 convertList(times, time -> new CrmStatisticsCustomerDealCycleByDateRespVO()...) | ||||
|         List<CrmStatisticsCustomerSummaryByDateRespVO> respVoList = new ArrayList<>(times.size()); | ||||
|         final Map<String, Integer> customerCreateCountMap = convertMap(customerCreateCount, | ||||
|         // 3. 合并数据 | ||||
|         List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]); | ||||
|         Map<String, Integer> customerCreateCountMap = convertMap(customerCreateCountVoList, | ||||
|             CrmStatisticsCustomerSummaryByDateRespVO::getTime, | ||||
|             CrmStatisticsCustomerSummaryByDateRespVO::getCustomerCreateCount); | ||||
|         final Map<String, Integer> customerDealCountMap = convertMap(customerDealCount, | ||||
|         Map<String, Integer> customerDealCountMap = convertMap(customerDealCountVoList, | ||||
|             CrmStatisticsCustomerSummaryByDateRespVO::getTime, | ||||
|             CrmStatisticsCustomerSummaryByDateRespVO::getCustomerDealCount); | ||||
|         times.forEach(time -> respVoList.add( | ||||
|             new CrmStatisticsCustomerSummaryByDateRespVO().setTime(time) | ||||
|         List<CrmStatisticsCustomerSummaryByDateRespVO> respVoList = convertList(times, | ||||
|             time -> new CrmStatisticsCustomerSummaryByDateRespVO() | ||||
|                 .setTime(time) | ||||
|                 .setCustomerCreateCount(customerCreateCountMap.getOrDefault(time, 0)) | ||||
|                 .setCustomerDealCount(customerDealCountMap.getOrDefault(time, 0)) | ||||
|         )); | ||||
|                 .setCustomerDealCount(customerDealCountMap.getOrDefault(time, 0))); | ||||
|  | ||||
|         return respVoList; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<CrmStatisticsCustomerSummaryByUserRespVO> getCustomerSummaryByUser(CrmStatisticsCustomerReqVO reqVO) { | ||||
|         // 1. 获得用户编号数组 | ||||
|         final List<Long> userIds = getUserIds(reqVO); | ||||
|         List<Long> userIds = getUserIds(reqVO); | ||||
|         if (CollUtil.isEmpty(userIds)) { | ||||
|             return Collections.emptyList(); | ||||
|         } | ||||
|         reqVO.setUserIds(userIds); | ||||
|  | ||||
|         // 2. 获取分项统计数据 | ||||
|         final List<CrmStatisticsCustomerSummaryByUserRespVO> customerCreateCount = customerMapper.selectCustomerCreateCountGroupbyUser(reqVO); | ||||
|         final List<CrmStatisticsCustomerSummaryByUserRespVO> customerDealCount = customerMapper.selectCustomerDealCountGroupbyUser(reqVO); | ||||
|         final List<CrmStatisticsCustomerSummaryByUserRespVO> contractPrice = customerMapper.selectContractPriceGroupbyUser(reqVO); | ||||
|         final List<CrmStatisticsCustomerSummaryByUserRespVO> receivablePrice = customerMapper.selectReceivablePriceGroupbyUser(reqVO); | ||||
|         List<CrmStatisticsCustomerSummaryByUserRespVO> customerCreateCount = customerMapper.selectCustomerCreateCountGroupByUser(reqVO); | ||||
|         List<CrmStatisticsCustomerSummaryByUserRespVO> customerDealCount = customerMapper.selectCustomerDealCountGroupByUser(reqVO); | ||||
|         List<CrmStatisticsCustomerSummaryByUserRespVO> contractPrice = customerMapper.selectContractPriceGroupByUser(reqVO); | ||||
|         List<CrmStatisticsCustomerSummaryByUserRespVO> receivablePrice = customerMapper.selectReceivablePriceGroupByUser(reqVO); | ||||
|  | ||||
|         // 3. 合并统计数据 | ||||
|         final Map<Long, Integer> customerCreateCountMap = convertMap(customerCreateCount, | ||||
|         Map<Long, Integer> customerCreateCountMap = convertMap(customerCreateCount, | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId, | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO::getCustomerCreateCount); | ||||
|         final Map<Long, Integer> customerDealCountMap = convertMap(customerDealCount, | ||||
|         Map<Long, Integer> customerDealCountMap = convertMap(customerDealCount, | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId, | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO::getCustomerDealCount); | ||||
|         final Map<Long, BigDecimal> contractPriceMap = convertMap(contractPrice, | ||||
|         Map<Long, BigDecimal> contractPriceMap = convertMap(contractPrice, | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId, | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO::getContractPrice); | ||||
|         final Map<Long, BigDecimal> receivablePriceMap = convertMap(receivablePrice, | ||||
|         Map<Long, BigDecimal> receivablePriceMap = convertMap(receivablePrice, | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId, | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO::getReceivablePrice); | ||||
|         List<CrmStatisticsCustomerSummaryByUserRespVO> respVoList = new ArrayList<>(userIds.size()); | ||||
|         userIds.forEach(userId -> { | ||||
|             final CrmStatisticsCustomerSummaryByUserRespVO vo = new CrmStatisticsCustomerSummaryByUserRespVO(); | ||||
|         List<CrmStatisticsCustomerSummaryByUserRespVO> respVoList = convertList(userIds, userId -> { | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO vo = new CrmStatisticsCustomerSummaryByUserRespVO(); | ||||
|             // ownerUserId 为基类属性 | ||||
|             vo.setOwnerUserId(userId); | ||||
|             vo.setCustomerCreateCount(customerCreateCountMap.getOrDefault(userId, 0)) | ||||
|                 .setCustomerDealCount(customerDealCountMap.getOrDefault(userId, 0)) | ||||
|                 .setContractPrice(contractPriceMap.getOrDefault(userId, BigDecimal.ZERO)) | ||||
|                 .setReceivablePrice(receivablePriceMap.getOrDefault(userId, BigDecimal.ZERO)); | ||||
|             respVoList.add(vo); | ||||
|             return vo; | ||||
|         }); | ||||
|  | ||||
|         // 4. 拼接用户信息 | ||||
|         appendUserInfo(respVoList); | ||||
|  | ||||
|         return respVoList; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<CrmStatisticsFollowupSummaryByDateRespVO> getFollowupSummaryByDate(CrmStatisticsCustomerReqVO reqVO) { | ||||
|         // 1. 获得用户编号数组 | ||||
|         final List<Long> userIds = getUserIds(reqVO); | ||||
|         List<Long> userIds = getUserIds(reqVO); | ||||
|         if (CollUtil.isEmpty(userIds)) { | ||||
|             return Collections.emptyList(); | ||||
|         } | ||||
| @@ -146,26 +140,22 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe | ||||
|  | ||||
|         // 2. 获取分项统计数据 | ||||
|         reqVO.setSqlDateFormat(getSqlDateFormat(reqVO.getTimes()[0], reqVO.getTimes()[1])); | ||||
|         reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); | ||||
|         final List<CrmStatisticsFollowupSummaryByDateRespVO> followupRecordCount = customerMapper.selectFollowupRecordCountGroupbyDate(reqVO); | ||||
|         final List<CrmStatisticsFollowupSummaryByDateRespVO> followupCustomerCount = customerMapper.selectFollowupCustomerCountGroupbyDate(reqVO); | ||||
|         List<CrmStatisticsFollowupSummaryByDateRespVO> followupRecordCount = customerMapper.selectFollowupRecordCountGroupByDate(reqVO); | ||||
|         List<CrmStatisticsFollowupSummaryByDateRespVO> followupCustomerCount = customerMapper.selectFollowupCustomerCountGroupByDate(reqVO); | ||||
|  | ||||
|         // 3. 获取时间序列 | ||||
|         final List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]); | ||||
|  | ||||
|         // 4. 合并统计数据 | ||||
|         List<CrmStatisticsFollowupSummaryByDateRespVO> respVoList = new ArrayList<>(times.size()); | ||||
|         final Map<String, Integer> followupRecordCountMap = convertMap(followupRecordCount, | ||||
|         // 3. 合并统计数据 | ||||
|         List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]); | ||||
|         Map<String, Integer> followupRecordCountMap = convertMap(followupRecordCount, | ||||
|             CrmStatisticsFollowupSummaryByDateRespVO::getTime, | ||||
|             CrmStatisticsFollowupSummaryByDateRespVO::getFollowupRecordCount); | ||||
|         final Map<String, Integer> followupCustomerCountMap = convertMap(followupCustomerCount, | ||||
|         Map<String, Integer> followupCustomerCountMap = convertMap(followupCustomerCount, | ||||
|             CrmStatisticsFollowupSummaryByDateRespVO::getTime, | ||||
|             CrmStatisticsFollowupSummaryByDateRespVO::getFollowupCustomerCount); | ||||
|         times.forEach(time -> respVoList.add( | ||||
|         List<CrmStatisticsFollowupSummaryByDateRespVO> respVoList = convertList(times, time -> | ||||
|             new CrmStatisticsFollowupSummaryByDateRespVO().setTime(time) | ||||
|                 .setFollowupRecordCount(followupRecordCountMap.getOrDefault(time, 0)) | ||||
|                 .setFollowupCustomerCount(followupCustomerCountMap.getOrDefault(time, 0)) | ||||
|         )); | ||||
|         ); | ||||
|  | ||||
|         return respVoList; | ||||
|     } | ||||
| @@ -173,31 +163,30 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe | ||||
|     @Override | ||||
|     public List<CrmStatisticsFollowupSummaryByUserRespVO> getFollowupSummaryByUser(CrmStatisticsCustomerReqVO reqVO) { | ||||
|         // 1. 获得用户编号数组 | ||||
|         final List<Long> userIds = getUserIds(reqVO); | ||||
|         List<Long> userIds = getUserIds(reqVO); | ||||
|         if (CollUtil.isEmpty(userIds)) { | ||||
|             return Collections.emptyList(); | ||||
|         } | ||||
|         reqVO.setUserIds(userIds); | ||||
|  | ||||
|         // 2. 获取分项统计数据 | ||||
|         reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); | ||||
|         final List<CrmStatisticsFollowupSummaryByUserRespVO> followupRecordCount = customerMapper.selectFollowupRecordCountGroupbyUser(reqVO); | ||||
|         final List<CrmStatisticsFollowupSummaryByUserRespVO> followupCustomerCount = customerMapper.selectFollowupCustomerCountGroupbyUser(reqVO); | ||||
|         List<CrmStatisticsFollowupSummaryByUserRespVO> followupRecordCount = customerMapper.selectFollowupRecordCountGroupByUser(reqVO); | ||||
|         List<CrmStatisticsFollowupSummaryByUserRespVO> followupCustomerCount = customerMapper.selectFollowupCustomerCountGroupByUser(reqVO); | ||||
|  | ||||
|         // 3. 合并统计数据 | ||||
|         final Map<Long, Integer> followupRecordCountMap = convertMap(followupRecordCount, | ||||
|         Map<Long, Integer> followupRecordCountMap = convertMap(followupRecordCount, | ||||
|             CrmStatisticsFollowupSummaryByUserRespVO::getOwnerUserId, | ||||
|             CrmStatisticsFollowupSummaryByUserRespVO::getFollowupRecordCount); | ||||
|         final Map<Long, Integer> followupCustomerCountMap = convertMap(followupCustomerCount, | ||||
|         Map<Long, Integer> followupCustomerCountMap = convertMap(followupCustomerCount, | ||||
|             CrmStatisticsFollowupSummaryByUserRespVO::getOwnerUserId, | ||||
|             CrmStatisticsFollowupSummaryByUserRespVO::getFollowupCustomerCount); | ||||
|         List<CrmStatisticsFollowupSummaryByUserRespVO> respVoList = new ArrayList<>(userIds.size()); | ||||
|         userIds.forEach(userId -> { | ||||
|             final CrmStatisticsFollowupSummaryByUserRespVO vo = new CrmStatisticsFollowupSummaryByUserRespVO() | ||||
|         List<CrmStatisticsFollowupSummaryByUserRespVO> respVoList = convertList(userIds, userId -> { | ||||
|             CrmStatisticsFollowupSummaryByUserRespVO vo = new CrmStatisticsFollowupSummaryByUserRespVO() | ||||
|                 .setFollowupRecordCount(followupRecordCountMap.getOrDefault(userId, 0)) | ||||
|                 .setFollowupCustomerCount(followupCustomerCountMap.getOrDefault(userId, 0)); | ||||
|             // ownerUserId 为基类属性 | ||||
|             vo.setOwnerUserId(userId); | ||||
|             respVoList.add(vo); | ||||
|             return vo; | ||||
|         }); | ||||
|  | ||||
|         // 4. 拼接用户信息 | ||||
| @@ -208,19 +197,18 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe | ||||
|     @Override | ||||
|     public List<CrmStatisticsFollowupSummaryByTypeRespVO> getFollowupSummaryByType(CrmStatisticsCustomerReqVO reqVO) { | ||||
|         // 1. 获得用户编号数组 | ||||
|         final List<Long> userIds = getUserIds(reqVO); | ||||
|         List<Long> userIds = getUserIds(reqVO); | ||||
|         if (CollUtil.isEmpty(userIds)) { | ||||
|             return Collections.emptyList(); | ||||
|         } | ||||
|         reqVO.setUserIds(userIds); | ||||
|  | ||||
|         // 2. 获得排行数据 | ||||
|         reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); | ||||
|         List<CrmStatisticsFollowupSummaryByTypeRespVO> respVoList = customerMapper.selectFollowupRecordCountGroupbyType(reqVO); | ||||
|         List<CrmStatisticsFollowupSummaryByTypeRespVO> respVoList = customerMapper.selectFollowupRecordCountGroupByType(reqVO); | ||||
|  | ||||
|         // 3. 获取字典数据 | ||||
|         List<DictDataRespDTO> followUpTypes = dictDataApi.getDictDataList(CRM_FOLLOW_UP_TYPE); | ||||
|         final Map<String, String> followUpTypeMap = convertMap(followUpTypes, | ||||
|         Map<String, String> followUpTypeMap = convertMap(followUpTypes, | ||||
|             DictDataRespDTO::getValue, DictDataRespDTO::getLabel); | ||||
|         respVoList.forEach(vo -> { | ||||
|             vo.setFollowupType(followUpTypeMap.get(vo.getFollowupType())); | ||||
| @@ -232,7 +220,7 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe | ||||
|     @Override | ||||
|     public List<CrmStatisticsCustomerContractSummaryRespVO> getContractSummary(CrmStatisticsCustomerReqVO reqVO) { | ||||
|         // 1. 获得用户编号数组 | ||||
|         final List<Long> userIds = getUserIds(reqVO); | ||||
|         List<Long> userIds = getUserIds(reqVO); | ||||
|         if (CollUtil.isEmpty(userIds)) { | ||||
|             return Collections.emptyList(); | ||||
|         } | ||||
| @@ -242,16 +230,16 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe | ||||
|         List<CrmStatisticsCustomerContractSummaryRespVO> respVoList = customerMapper.selectContractSummary(reqVO); | ||||
|  | ||||
|         // 3. 设置 创建人、负责人、行业、来源 | ||||
|         // 获取客户所属行业 | ||||
|         // 3.1 获取客户所属行业 | ||||
|         Map<String, String> industryMap = convertMap(dictDataApi.getDictDataList(CRM_CUSTOMER_INDUSTRY), | ||||
|             DictDataRespDTO::getValue, DictDataRespDTO::getLabel); | ||||
|         // 获取客户来源 | ||||
|         // 3.2 获取客户来源 | ||||
|         Map<String, String> sourceMap = convertMap(dictDataApi.getDictDataList(CRM_CUSTOMER_SOURCE), | ||||
|             DictDataRespDTO::getValue, DictDataRespDTO::getLabel); | ||||
|         // 获取创建人、负责人列表 | ||||
|         // 3.3 获取创建人、负责人列表 | ||||
|         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSetByFlatMap(respVoList, | ||||
|             vo -> Stream.of(NumberUtils.parseLong(vo.getCreatorUserId()), vo.getOwnerUserId()))); | ||||
|  | ||||
|         // 3.4 设置 创建人、负责人、行业、来源 | ||||
|         respVoList.forEach(vo -> { | ||||
|             MapUtils.findAndThen(industryMap, vo.getIndustryId(), vo::setIndustryName); | ||||
|             MapUtils.findAndThen(sourceMap, vo.getSource(), vo::setSourceName); | ||||
| @@ -266,7 +254,7 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe | ||||
|     @Override | ||||
|     public List<CrmStatisticsCustomerDealCycleByDateRespVO> getCustomerDealCycleByDate(CrmStatisticsCustomerReqVO reqVO) { | ||||
|         // 1. 获得用户编号数组 | ||||
|         final List<Long> userIds = getUserIds(reqVO); | ||||
|         List<Long> userIds = getUserIds(reqVO); | ||||
|         if (CollUtil.isEmpty(userIds)) { | ||||
|             return Collections.emptyList(); | ||||
|         } | ||||
| @@ -274,52 +262,48 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe | ||||
|  | ||||
|         // 2. 获取分项统计数据 | ||||
|         reqVO.setSqlDateFormat(getSqlDateFormat(reqVO.getTimes()[0], reqVO.getTimes()[1])); | ||||
|         reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); | ||||
|         final List<CrmStatisticsCustomerDealCycleByDateRespVO> customerDealCycle = customerMapper.selectCustomerDealCycleGroupbyDate(reqVO); | ||||
|         List<CrmStatisticsCustomerDealCycleByDateRespVO> customerDealCycle = customerMapper.selectCustomerDealCycleGroupByDate(reqVO); | ||||
|  | ||||
|         // 3. 获取时间序列 | ||||
|         final List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]); | ||||
|  | ||||
|         // 4. 合并统计数据 | ||||
|         List<CrmStatisticsCustomerDealCycleByDateRespVO> respVoList = new ArrayList<>(times.size()); | ||||
|         final Map<String, Double> customerDealCycleMap = convertMap(customerDealCycle, | ||||
|         // 3. 合并统计数据 | ||||
|         List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]); | ||||
|         Map<String, Double> customerDealCycleMap = convertMap(customerDealCycle, | ||||
|             CrmStatisticsCustomerDealCycleByDateRespVO::getTime, | ||||
|             CrmStatisticsCustomerDealCycleByDateRespVO::getCustomerDealCycle); | ||||
|         times.forEach(time -> respVoList.add( | ||||
|         List<CrmStatisticsCustomerDealCycleByDateRespVO> respVoList = convertList(times, time -> | ||||
|             new CrmStatisticsCustomerDealCycleByDateRespVO().setTime(time) | ||||
|                 .setCustomerDealCycle(customerDealCycleMap.getOrDefault(time, 0D)) | ||||
|         )); | ||||
|         ); | ||||
|  | ||||
|         return respVoList; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<CrmStatisticsCustomerDealCycleByUserRespVO> getCustomerDealCycleByUser(CrmStatisticsCustomerReqVO reqVO) { | ||||
|         // 1. 获得用户编号数组 | ||||
|         final List<Long> userIds = getUserIds(reqVO); | ||||
|         List<Long> userIds = getUserIds(reqVO); | ||||
|         if (CollUtil.isEmpty(userIds)) { | ||||
|             return Collections.emptyList(); | ||||
|         } | ||||
|         reqVO.setUserIds(userIds); | ||||
|  | ||||
|         // 2. 获取分项统计数据 | ||||
|         reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); | ||||
|         final List<CrmStatisticsCustomerDealCycleByUserRespVO> customerDealCycle = customerMapper.selectCustomerDealCycleGroupbyUser(reqVO); | ||||
|         final List<CrmStatisticsCustomerSummaryByUserRespVO> customerDealCount = customerMapper.selectCustomerDealCountGroupbyUser(reqVO); | ||||
|         List<CrmStatisticsCustomerDealCycleByUserRespVO> customerDealCycle = customerMapper.selectCustomerDealCycleGroupByUser(reqVO); | ||||
|         List<CrmStatisticsCustomerSummaryByUserRespVO> customerDealCount = customerMapper.selectCustomerDealCountGroupByUser(reqVO); | ||||
|  | ||||
|         // 3. 合并统计数据 | ||||
|         final Map<Long, Double> customerDealCycleMap = convertMap(customerDealCycle, | ||||
|         Map<Long, Double> customerDealCycleMap = convertMap(customerDealCycle, | ||||
|             CrmStatisticsCustomerDealCycleByUserRespVO::getOwnerUserId, | ||||
|             CrmStatisticsCustomerDealCycleByUserRespVO::getCustomerDealCycle); | ||||
|         final Map<Long, Integer> customerDealCountMap = convertMap(customerDealCount, | ||||
|         Map<Long, Integer> customerDealCountMap = convertMap(customerDealCount, | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId, | ||||
|             CrmStatisticsCustomerSummaryByUserRespVO::getCustomerDealCount); | ||||
|         List<CrmStatisticsCustomerDealCycleByUserRespVO> respVoList = new ArrayList<>(userIds.size()); | ||||
|         userIds.forEach(userId -> { | ||||
|             final CrmStatisticsCustomerDealCycleByUserRespVO vo = new CrmStatisticsCustomerDealCycleByUserRespVO() | ||||
|         List<CrmStatisticsCustomerDealCycleByUserRespVO> respVoList = convertList(userIds, userId -> { | ||||
|             CrmStatisticsCustomerDealCycleByUserRespVO vo = new CrmStatisticsCustomerDealCycleByUserRespVO() | ||||
|                 .setCustomerDealCycle(customerDealCycleMap.getOrDefault(userId, 0.0)) | ||||
|                 .setCustomerDealCount(customerDealCountMap.getOrDefault(userId, 0)); | ||||
|             // ownerUserId 为基类属性 | ||||
|             vo.setOwnerUserId(userId); | ||||
|             respVoList.add(vo); | ||||
|             return vo; | ||||
|         }); | ||||
|  | ||||
|         // 4. 拼接用户信息 | ||||
| @@ -335,8 +319,9 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe | ||||
|      */ | ||||
|     private <T extends CrmStatisticsCustomerByUserBaseRespVO> void appendUserInfo(List<T> respVoList) { | ||||
|         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSet(respVoList, | ||||
|                 CrmStatisticsCustomerByUserBaseRespVO::getOwnerUserId)); | ||||
|         respVoList.forEach(vo -> MapUtils.findAndThen(userMap, vo.getOwnerUserId(), user -> vo.setOwnerUserName(user.getNickname()))); | ||||
|             CrmStatisticsCustomerByUserBaseRespVO::getOwnerUserId)); | ||||
|         respVoList.forEach(vo -> MapUtils.findAndThen(userMap, | ||||
|             vo.getOwnerUserId(), user -> vo.setOwnerUserName(user.getNickname()))); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -352,7 +337,7 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe | ||||
|         } | ||||
|         // 情况二:选中某个部门 | ||||
|         // 2.1 获得部门列表 | ||||
|         final Long deptId = reqVO.getDeptId(); | ||||
|         Long deptId = reqVO.getDeptId(); | ||||
|         List<Long> deptIds = convertList(deptApi.getChildDeptList(deptId), DeptRespDTO::getId); | ||||
|         deptIds.add(deptId); | ||||
|         // 2.2 获得用户编号 | ||||
|   | ||||
| @@ -2,251 +2,233 @@ | ||||
| <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||||
| <mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsCustomerMapper"> | ||||
|  | ||||
|     <!-- TODO @dhb52:数据库的关键字,进行大写。例如说,COUNT --> | ||||
|  | ||||
|     <select id="selectCustomerCreateCountGroupbyDate" | ||||
|     <select id="selectCustomerCreateCountGroupByDate" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByDateRespVO"> | ||||
|         SELECT | ||||
|         <!-- TODO @dhb52:下面这个,缩进一个 tab;这样可读性更好哈 --> | ||||
|         DATE_FORMAT( create_time, #{sqlDateFormat} ) AS time, | ||||
|         COUNT(*) AS customerCreateCount | ||||
|         FROM crm_customer | ||||
|         WHERE deleted = 0 | ||||
|         AND owner_user_id IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         <!-- TODO @dhb52:这可以考虑不换行,直接跟在后面的 AND,更连贯哈; --> | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         GROUP BY time | ||||
|             DATE_FORMAT( create_time, #{sqlDateFormat} ) AS time, | ||||
|             COUNT(*) AS customerCreateCount | ||||
|           FROM crm_customer | ||||
|          WHERE deleted = 0 | ||||
|            AND owner_user_id IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|          GROUP BY time | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectCustomerDealCountGroupbyDate" | ||||
|     <select id="selectCustomerDealCountGroupByDate" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByDateRespVO"> | ||||
|         SELECT | ||||
|         <!-- TODO @dhb52:下面这个,缩进一个 tab;这样可读性更好哈 --> | ||||
|         <!-- TODO @dhb52:表变量最好不要用 a、b;可以用 customer 和 constract;虽然长一点,但是一眼看的清楚哈 --> | ||||
|         DATE_FORMAT( b.order_date, #{sqlDateFormat} ) AS time, | ||||
|         count( DISTINCT a.id ) AS customerDealCount | ||||
|         FROM crm_customer AS a | ||||
|         LEFT JOIN crm_contract AS b ON b.customer_id = a.id | ||||
|         WHERE a.deleted = 0 AND b.deleted = 0 | ||||
|         AND b.audit_status = 20 | ||||
|         AND a.owner_user_id IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         <!-- TODO @dhb52:这个应该是 order_date 的范围哈;貌似如果改成这样,不需要查询 customer 表,只要 contract 表就 ok 拉 --> | ||||
|         AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|             DATE_FORMAT( order_date, #{sqlDateFormat} ) AS time, | ||||
|             COUNT( DISTINCT customer_id ) AS customerDealCount | ||||
|          FROM crm_contract | ||||
|         WHERE deleted = 0 | ||||
|           AND audit_status = 20 | ||||
|           AND owner_user_id IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|           AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|         GROUP BY time | ||||
|     </select> | ||||
|  | ||||
|     <!-- TODO @dhb52:根据上面建议,进行优化 --> | ||||
|     <select id="selectCustomerCreateCountGroupbyUser" | ||||
|     <select id="selectCustomerCreateCountGroupByUser" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO"> | ||||
|         SELECT owner_user_id, COUNT(1) AS customer_create_count | ||||
|         FROM crm_customer | ||||
|         WHERE deleted = 0 | ||||
|         AND owner_user_id in | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         SELECT | ||||
|             owner_user_id, | ||||
|             COUNT(1) AS customer_create_count | ||||
|           FROM crm_customer | ||||
|          WHERE deleted = 0 | ||||
|            AND owner_user_id in | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|           AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|         GROUP BY owner_user_id | ||||
|     </select> | ||||
|  | ||||
|     <!-- TODO @dhb52:根据上面建议,进行优化 --> | ||||
|     <select id="selectCustomerDealCountGroupbyUser" | ||||
|     <select id="selectCustomerDealCountGroupByUser" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO"> | ||||
|         SELECT a.owner_user_id, count( DISTINCT a.id ) AS customer_deal_count | ||||
|         FROM crm_customer AS a | ||||
|         LEFT JOIN crm_contract AS b ON b.customer_id = a.id | ||||
|         WHERE a.deleted = 0 AND b.deleted = 0 | ||||
|         AND b.audit_status = 20 | ||||
|         AND a.owner_user_id IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         GROUP BY a.owner_user_id | ||||
|         SELECT | ||||
|             customer.owner_user_id, | ||||
|             COUNT( DISTINCT customer.id ) AS customer_deal_count | ||||
|           FROM crm_customer AS customer | ||||
|                 LEFT JOIN crm_contract AS contract ON contract.customer_id = customer.id | ||||
|          WHERE customer.deleted = 0 AND contract.deleted = 0 | ||||
|            AND contract.audit_status = 20 | ||||
|            AND customer.owner_user_id IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND contract.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|          GROUP BY customer.owner_user_id | ||||
|     </select> | ||||
|  | ||||
|     <!-- TODO @dhb52:根据上面建议,进行优化 --> | ||||
|     <select id="selectContractPriceGroupbyUser" | ||||
|     <select id="selectContractPriceGroupByUser" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO"> | ||||
|         SELECT owner_user_id, IFNULL(SUM(total_price), 0) AS contract_price | ||||
|         FROM crm_contract | ||||
|         WHERE deleted = 0 | ||||
|         AND audit_status = 20 | ||||
|         AND owner_user_id in | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND order_date BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         GROUP BY owner_user_id | ||||
|         SELECT | ||||
|             owner_user_id, | ||||
|             IFNULL(SUM(total_price), 0) AS contract_price | ||||
|           FROM crm_contract | ||||
|          WHERE deleted = 0 | ||||
|            AND audit_status = 20 | ||||
|            AND owner_user_id in | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND order_date BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|          GROUP BY owner_user_id | ||||
|     </select> | ||||
|  | ||||
|  | ||||
|     <!-- TODO @dhb52:根据上面建议,进行优化 --> | ||||
|     <select id="selectReceivablePriceGroupbyUser" | ||||
|     <select id="selectReceivablePriceGroupByUser" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO"> | ||||
|         SELECT owner_user_id, | ||||
|         IFNULL(SUM(price), 0) AS receivable_price | ||||
|         FROM crm_receivable | ||||
|         WHERE deleted = 0 | ||||
|         AND audit_status = 20 | ||||
|         AND owner_user_id IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND return_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         GROUP BY owner_user_id | ||||
|         SELECT | ||||
|             owner_user_id, | ||||
|             IFNULL(SUM(price), 0) AS receivable_price | ||||
|           FROM crm_receivable | ||||
|          WHERE deleted = 0 | ||||
|            AND audit_status = 20 | ||||
|            AND owner_user_id IN | ||||
|                  <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                      #{userId} | ||||
|                  </foreach> | ||||
|            AND return_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|          GROUP BY owner_user_id | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectFollowupRecordCountGroupbyDate" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByDateRespVO"> | ||||
|         SELECT DATE_FORMAT( create_time, #{sqlDateFormat} ) AS time, | ||||
|         count(*) AS followup_record_count | ||||
|         FROM crm_follow_up_record | ||||
|         WHERE creator IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         AND biz_type = #{bizType} | ||||
|         GROUP BY time | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectFollowupCustomerCountGroupbyDate" | ||||
|     <select id="selectFollowupRecordCountGroupByDate" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByDateRespVO"> | ||||
|         SELECT | ||||
|         DATE_FORMAT( create_time, #{sqlDateFormat} ) AS time, | ||||
|         count(DISTINCT biz_id) AS followup_customer_count | ||||
|         FROM crm_follow_up_record | ||||
|         WHERE creator IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         AND biz_type = #{bizType} | ||||
|         GROUP BY time | ||||
|             DATE_FORMAT( create_time, #{sqlDateFormat} ) AS time, | ||||
|             COUNT(*) AS followup_record_count | ||||
|           FROM crm_follow_up_record | ||||
|          WHERE creator IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|            AND biz_type = ${@cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum@CRM_CUSTOMER.type} | ||||
|          GROUP BY time | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectFollowupRecordCountGroupbyUser" | ||||
|     <select id="selectFollowupCustomerCountGroupByDate" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByDateRespVO"> | ||||
|         SELECT | ||||
|             DATE_FORMAT( create_time, #{sqlDateFormat} ) AS time, | ||||
|             COUNT(DISTINCT biz_id) AS followup_customer_count | ||||
|           FROM crm_follow_up_record | ||||
|          WHERE creator IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|            AND biz_type = ${@cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum@CRM_CUSTOMER.type} | ||||
|          GROUP BY time | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectFollowupRecordCountGroupByUser" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByUserRespVO"> | ||||
|         SELECT creator as owner_user_id, | ||||
|         count(*) AS followup_record_count | ||||
|         FROM crm_follow_up_record | ||||
|         WHERE creator IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         AND biz_type = #{bizType} | ||||
|         GROUP BY creator | ||||
|         SELECT | ||||
|             creator as owner_user_id, | ||||
|             COUNT(*) AS followup_record_count | ||||
|           FROM crm_follow_up_record | ||||
|          WHERE creator IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|            AND biz_type = ${@cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum@CRM_CUSTOMER.type} | ||||
|          GROUP BY creator | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectFollowupCustomerCountGroupbyUser" | ||||
|     <select id="selectFollowupCustomerCountGroupByUser" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByUserRespVO"> | ||||
|         SELECT creator as owner_user_id, | ||||
|         count(DISTINCT biz_id) AS followup_customer_count | ||||
|         FROM crm_follow_up_record | ||||
|         WHERE creator IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         AND biz_type = #{bizType} | ||||
|         GROUP BY creator | ||||
|         SELECT | ||||
|             creator as owner_user_id, | ||||
|             COUNT(DISTINCT biz_id) AS followup_customer_count | ||||
|           FROM crm_follow_up_record | ||||
|          WHERE creator IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|            AND biz_type = ${@cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum@CRM_CUSTOMER.type} | ||||
|          GROUP BY creator | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectFollowupRecordCountGroupbyType" | ||||
|     <select id="selectFollowupRecordCountGroupByType" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByTypeRespVO"> | ||||
|         SELECT | ||||
|         type AS followupType, | ||||
|         count(*) AS followup_record_count | ||||
|         FROM crm_follow_up_record | ||||
|         WHERE creator IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         AND biz_type = #{bizType} | ||||
|         GROUP BY followupType | ||||
|             type AS followupType, | ||||
|             COUNT(*) AS followup_record_count | ||||
|           FROM crm_follow_up_record | ||||
|          WHERE creator IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|            AND biz_type = ${@cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum@CRM_CUSTOMER.type} | ||||
|          GROUP BY followupType | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectContractSummary" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerContractSummaryRespVO"> | ||||
|         SELECT | ||||
|         a.`name` AS customer_name, | ||||
|         b.`name` AS contract_name, | ||||
|         b.total_price, | ||||
|         IFNULL( c.price, 0 ) AS receivable_price, | ||||
|         a.industry_id, | ||||
|         a.source, | ||||
|         a.owner_user_id, | ||||
|         a.creator AS creator_user_id, | ||||
|         a.create_time, | ||||
|         b.order_date | ||||
|         FROM | ||||
|         crm_customer AS a | ||||
|         INNER JOIN crm_contract AS b ON a.id = b.customer_id | ||||
|         LEFT JOIN crm_receivable AS c ON b.id = c.contract_id | ||||
|         WHERE a.deleted = 0 AND b.deleted = 0 AND c.deleted = 0 | ||||
|         AND b.audit_status = 20 | ||||
|         AND a.owner_user_id IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|             customer.`name` AS customer_name, | ||||
|             contract.`name` AS contract_name, | ||||
|             contract.total_price, | ||||
|             IFNULL( receivable.price, 0 ) AS receivable_price, | ||||
|             customer.industry_id, | ||||
|             customer.source, | ||||
|             customer.owner_user_id, | ||||
|             customer.creator AS creator_user_id, | ||||
|             customer.create_time, | ||||
|             contract.order_date | ||||
|           FROM crm_customer AS customer | ||||
|                 INNER JOIN crm_contract AS contract ON customer.id = contract.customer_id | ||||
|                 LEFT JOIN crm_receivable AS receivable ON contract.id = receivable.contract_id | ||||
|          WHERE customer.deleted = 0 AND contract.deleted = 0 AND receivable.deleted = 0 | ||||
|            AND contract.audit_status = 20 | ||||
|            AND customer.owner_user_id IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND contract.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectCustomerDealCycleGroupbyDate" | ||||
|     <select id="selectCustomerDealCycleGroupByDate" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerDealCycleByDateRespVO"> | ||||
|         SELECT | ||||
|         DATE_FORMAT( b.order_date, #{sqlDateFormat} ) AS time, | ||||
|         IFNULL( TRUNCATE ( AVG( TIMESTAMPDIFF( DAY, a.create_time, b.order_date )), 1 ), 0 ) AS customer_deal_cycle | ||||
|         FROM crm_customer AS a | ||||
|         LEFT JOIN crm_contract AS b ON b.customer_id = a.id | ||||
|         WHERE a.deleted = 0 AND b.deleted = 0 | ||||
|         AND b.audit_status = 20 | ||||
|         AND a.owner_user_id IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         GROUP BY time | ||||
|             DATE_FORMAT( contract.order_date, #{sqlDateFormat} ) AS time, | ||||
|             IFNULL( TRUNCATE ( AVG( TIMESTAMPDIFF( DAY, customer.create_time, contract.order_date )), 1 ), 0 ) AS customer_deal_cycle | ||||
|           FROM crm_customer AS customer | ||||
|                 LEFT JOIN crm_contract AS contract ON contract.customer_id = customer.id | ||||
|          WHERE customer.deleted = 0 AND contract.deleted = 0 | ||||
|            AND contract.audit_status = 20 | ||||
|            AND customer.owner_user_id IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND contract.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|          GROUP BY time | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectCustomerDealCycleGroupbyUser" | ||||
|     <select id="selectCustomerDealCycleGroupByUser" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerDealCycleByUserRespVO"> | ||||
|         SELECT | ||||
|         a.owner_user_id, | ||||
|         IFNULL( TRUNCATE ( AVG( TIMESTAMPDIFF( DAY, a.create_time, b.order_date )), 1 ), 0 ) AS customer_deal_cycle | ||||
|         FROM crm_customer AS a | ||||
|         LEFT JOIN crm_contract AS b ON b.customer_id = a.id | ||||
|         WHERE a.deleted = 0 AND b.deleted = 0 | ||||
|         AND b.audit_status = 20 | ||||
|         AND a.owner_user_id IN | ||||
|         <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|             #{userId} | ||||
|         </foreach> | ||||
|         AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND | ||||
|         #{times[1],javaType=java.time.LocalDateTime} | ||||
|         GROUP BY a.owner_user_id | ||||
|             customer.owner_user_id, | ||||
|             IFNULL( TRUNCATE ( AVG( TIMESTAMPDIFF( DAY, customer.create_time, contract.order_date )), 1 ), 0 ) AS customer_deal_cycle | ||||
|           FROM crm_customer AS customer | ||||
|                 LEFT JOIN crm_contract AS contract ON contract.customer_id = customer.id | ||||
|          WHERE customer.deleted = 0 AND contract.deleted = 0 | ||||
|            AND contract.audit_status = 20 | ||||
|            AND customer.owner_user_id IN | ||||
|                 <foreach collection="userIds" item="userId" open="(" close=")" separator=","> | ||||
|                     #{userId} | ||||
|                 </foreach> | ||||
|            AND contract.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime} | ||||
|          GROUP BY customer.owner_user_id | ||||
|     </select> | ||||
|  | ||||
| </mapper> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 dhb52
					dhb52