fix: [CRM-客户统计]根据Code-Review 修改代码

This commit is contained in:
dhb52 2024-03-09 22:51:38 +08:00
parent d556b29214
commit ee2be79987
4 changed files with 266 additions and 308 deletions

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer; 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 io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -48,11 +47,4 @@ public class CrmStatisticsCustomerReqVO {
@Schema(description = "Group By 日期格式", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "%Y%m") @Schema(description = "Group By 日期格式", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "%Y%m")
private String sqlDateFormat; private String sqlDateFormat;
// TODO @dhb52这个字段目前是不是没啥用呀
/**
* 数据类型 {@link CrmBizTypeEnum}
*/
@Schema(description = "数据类型", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "2")
private Integer bizType;
} }

View File

@ -13,33 +13,32 @@ import java.util.List;
@Mapper @Mapper
public interface CrmStatisticsCustomerMapper { 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<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);
} }

View File

@ -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.framework.common.util.number.NumberUtils;
import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.*; 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.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.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 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.dict.DictDataApi;
@ -20,7 +19,6 @@ import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -58,87 +56,83 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
@Override @Override
public List<CrmStatisticsCustomerSummaryByDateRespVO> getCustomerSummaryByDate(CrmStatisticsCustomerReqVO reqVO) { public List<CrmStatisticsCustomerSummaryByDateRespVO> getCustomerSummaryByDate(CrmStatisticsCustomerReqVO reqVO) {
// 1. 获得用户编号数组 // 1. 获得用户编号数组
final List<Long> userIds = getUserIds(reqVO); List<Long> userIds = getUserIds(reqVO);
if (CollUtil.isEmpty(userIds)) { if (CollUtil.isEmpty(userIds)) {
return Collections.emptyList(); return Collections.emptyList();
} }
reqVO.setUserIds(userIds); reqVO.setUserIds(userIds);
// 2. 获取分项统计数据 // 2. 获取分项统计数据
// TODO @dhb52如果是 list 变量要么 List 要么 s 后缀
reqVO.setSqlDateFormat(getSqlDateFormat(reqVO.getTimes()[0], reqVO.getTimes()[1])); reqVO.setSqlDateFormat(getSqlDateFormat(reqVO.getTimes()[0], reqVO.getTimes()[1]));
final List<CrmStatisticsCustomerSummaryByDateRespVO> customerCreateCount = customerMapper.selectCustomerCreateCountGroupbyDate(reqVO); List<CrmStatisticsCustomerSummaryByDateRespVO> customerCreateCountVoList = customerMapper.selectCustomerCreateCountGroupByDate(reqVO);
final List<CrmStatisticsCustomerSummaryByDateRespVO> customerDealCount = customerMapper.selectCustomerDealCountGroupbyDate(reqVO); List<CrmStatisticsCustomerSummaryByDateRespVO> customerDealCountVoList = customerMapper.selectCustomerDealCountGroupByDate(reqVO);
// 3. 获取时间序列 // 3. 合并数据
// TODO @dhb523 4 其实做的是一类事情所以可以考虑 3.1 获取时间序列3.2 合并统计数据 这样注释然后中间就不空行了就是说一般空行的目的是让逻辑分片看着整体性更好但是不能让逻辑感觉碎碎的 List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]);
final List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]); Map<String, Integer> customerCreateCountMap = convertMap(customerCreateCountVoList,
// 4. 合并统计数据
// TODO @dhb52这个是不是要 add respVoList 或者还可以 convertList(times, time -> new CrmStatisticsCustomerDealCycleByDateRespVO()...)
List<CrmStatisticsCustomerSummaryByDateRespVO> respVoList = new ArrayList<>(times.size());
final Map<String, Integer> customerCreateCountMap = convertMap(customerCreateCount,
CrmStatisticsCustomerSummaryByDateRespVO::getTime, CrmStatisticsCustomerSummaryByDateRespVO::getTime,
CrmStatisticsCustomerSummaryByDateRespVO::getCustomerCreateCount); CrmStatisticsCustomerSummaryByDateRespVO::getCustomerCreateCount);
final Map<String, Integer> customerDealCountMap = convertMap(customerDealCount, Map<String, Integer> customerDealCountMap = convertMap(customerDealCountVoList,
CrmStatisticsCustomerSummaryByDateRespVO::getTime, CrmStatisticsCustomerSummaryByDateRespVO::getTime,
CrmStatisticsCustomerSummaryByDateRespVO::getCustomerDealCount); CrmStatisticsCustomerSummaryByDateRespVO::getCustomerDealCount);
times.forEach(time -> respVoList.add( List<CrmStatisticsCustomerSummaryByDateRespVO> respVoList = convertList(times,
new CrmStatisticsCustomerSummaryByDateRespVO().setTime(time) time -> new CrmStatisticsCustomerSummaryByDateRespVO()
.setTime(time)
.setCustomerCreateCount(customerCreateCountMap.getOrDefault(time, 0)) .setCustomerCreateCount(customerCreateCountMap.getOrDefault(time, 0))
.setCustomerDealCount(customerDealCountMap.getOrDefault(time, 0)) .setCustomerDealCount(customerDealCountMap.getOrDefault(time, 0)));
));
return respVoList; return respVoList;
} }
@Override @Override
public List<CrmStatisticsCustomerSummaryByUserRespVO> getCustomerSummaryByUser(CrmStatisticsCustomerReqVO reqVO) { public List<CrmStatisticsCustomerSummaryByUserRespVO> getCustomerSummaryByUser(CrmStatisticsCustomerReqVO reqVO) {
// 1. 获得用户编号数组 // 1. 获得用户编号数组
final List<Long> userIds = getUserIds(reqVO); List<Long> userIds = getUserIds(reqVO);
if (CollUtil.isEmpty(userIds)) { if (CollUtil.isEmpty(userIds)) {
return Collections.emptyList(); return Collections.emptyList();
} }
reqVO.setUserIds(userIds); reqVO.setUserIds(userIds);
// 2. 获取分项统计数据 // 2. 获取分项统计数据
final List<CrmStatisticsCustomerSummaryByUserRespVO> customerCreateCount = customerMapper.selectCustomerCreateCountGroupbyUser(reqVO); List<CrmStatisticsCustomerSummaryByUserRespVO> customerCreateCount = customerMapper.selectCustomerCreateCountGroupByUser(reqVO);
final List<CrmStatisticsCustomerSummaryByUserRespVO> customerDealCount = customerMapper.selectCustomerDealCountGroupbyUser(reqVO); List<CrmStatisticsCustomerSummaryByUserRespVO> customerDealCount = customerMapper.selectCustomerDealCountGroupByUser(reqVO);
final List<CrmStatisticsCustomerSummaryByUserRespVO> contractPrice = customerMapper.selectContractPriceGroupbyUser(reqVO); List<CrmStatisticsCustomerSummaryByUserRespVO> contractPrice = customerMapper.selectContractPriceGroupByUser(reqVO);
final List<CrmStatisticsCustomerSummaryByUserRespVO> receivablePrice = customerMapper.selectReceivablePriceGroupbyUser(reqVO); List<CrmStatisticsCustomerSummaryByUserRespVO> receivablePrice = customerMapper.selectReceivablePriceGroupByUser(reqVO);
// 3. 合并统计数据 // 3. 合并统计数据
final Map<Long, Integer> customerCreateCountMap = convertMap(customerCreateCount, Map<Long, Integer> customerCreateCountMap = convertMap(customerCreateCount,
CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId, CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId,
CrmStatisticsCustomerSummaryByUserRespVO::getCustomerCreateCount); CrmStatisticsCustomerSummaryByUserRespVO::getCustomerCreateCount);
final Map<Long, Integer> customerDealCountMap = convertMap(customerDealCount, Map<Long, Integer> customerDealCountMap = convertMap(customerDealCount,
CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId, CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId,
CrmStatisticsCustomerSummaryByUserRespVO::getCustomerDealCount); CrmStatisticsCustomerSummaryByUserRespVO::getCustomerDealCount);
final Map<Long, BigDecimal> contractPriceMap = convertMap(contractPrice, Map<Long, BigDecimal> contractPriceMap = convertMap(contractPrice,
CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId, CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId,
CrmStatisticsCustomerSummaryByUserRespVO::getContractPrice); CrmStatisticsCustomerSummaryByUserRespVO::getContractPrice);
final Map<Long, BigDecimal> receivablePriceMap = convertMap(receivablePrice, Map<Long, BigDecimal> receivablePriceMap = convertMap(receivablePrice,
CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId, CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId,
CrmStatisticsCustomerSummaryByUserRespVO::getReceivablePrice); CrmStatisticsCustomerSummaryByUserRespVO::getReceivablePrice);
List<CrmStatisticsCustomerSummaryByUserRespVO> respVoList = new ArrayList<>(userIds.size()); List<CrmStatisticsCustomerSummaryByUserRespVO> respVoList = convertList(userIds, userId -> {
userIds.forEach(userId -> { CrmStatisticsCustomerSummaryByUserRespVO vo = new CrmStatisticsCustomerSummaryByUserRespVO();
final CrmStatisticsCustomerSummaryByUserRespVO vo = new CrmStatisticsCustomerSummaryByUserRespVO(); // ownerUserId 为基类属性
vo.setOwnerUserId(userId); vo.setOwnerUserId(userId);
vo.setCustomerCreateCount(customerCreateCountMap.getOrDefault(userId, 0)) vo.setCustomerCreateCount(customerCreateCountMap.getOrDefault(userId, 0))
.setCustomerDealCount(customerDealCountMap.getOrDefault(userId, 0)) .setCustomerDealCount(customerDealCountMap.getOrDefault(userId, 0))
.setContractPrice(contractPriceMap.getOrDefault(userId, BigDecimal.ZERO)) .setContractPrice(contractPriceMap.getOrDefault(userId, BigDecimal.ZERO))
.setReceivablePrice(receivablePriceMap.getOrDefault(userId, BigDecimal.ZERO)); .setReceivablePrice(receivablePriceMap.getOrDefault(userId, BigDecimal.ZERO));
respVoList.add(vo); return vo;
}); });
// 4. 拼接用户信息 // 4. 拼接用户信息
appendUserInfo(respVoList); appendUserInfo(respVoList);
return respVoList; return respVoList;
} }
@Override @Override
public List<CrmStatisticsFollowupSummaryByDateRespVO> getFollowupSummaryByDate(CrmStatisticsCustomerReqVO reqVO) { public List<CrmStatisticsFollowupSummaryByDateRespVO> getFollowupSummaryByDate(CrmStatisticsCustomerReqVO reqVO) {
// 1. 获得用户编号数组 // 1. 获得用户编号数组
final List<Long> userIds = getUserIds(reqVO); List<Long> userIds = getUserIds(reqVO);
if (CollUtil.isEmpty(userIds)) { if (CollUtil.isEmpty(userIds)) {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -146,26 +140,22 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
// 2. 获取分项统计数据 // 2. 获取分项统计数据
reqVO.setSqlDateFormat(getSqlDateFormat(reqVO.getTimes()[0], reqVO.getTimes()[1])); reqVO.setSqlDateFormat(getSqlDateFormat(reqVO.getTimes()[0], reqVO.getTimes()[1]));
reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); List<CrmStatisticsFollowupSummaryByDateRespVO> followupRecordCount = customerMapper.selectFollowupRecordCountGroupByDate(reqVO);
final List<CrmStatisticsFollowupSummaryByDateRespVO> followupRecordCount = customerMapper.selectFollowupRecordCountGroupbyDate(reqVO); List<CrmStatisticsFollowupSummaryByDateRespVO> followupCustomerCount = customerMapper.selectFollowupCustomerCountGroupByDate(reqVO);
final List<CrmStatisticsFollowupSummaryByDateRespVO> followupCustomerCount = customerMapper.selectFollowupCustomerCountGroupbyDate(reqVO);
// 3. 获取时间序列 // 3. 合并统计数据
final List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]); List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]);
Map<String, Integer> followupRecordCountMap = convertMap(followupRecordCount,
// 4. 合并统计数据
List<CrmStatisticsFollowupSummaryByDateRespVO> respVoList = new ArrayList<>(times.size());
final Map<String, Integer> followupRecordCountMap = convertMap(followupRecordCount,
CrmStatisticsFollowupSummaryByDateRespVO::getTime, CrmStatisticsFollowupSummaryByDateRespVO::getTime,
CrmStatisticsFollowupSummaryByDateRespVO::getFollowupRecordCount); CrmStatisticsFollowupSummaryByDateRespVO::getFollowupRecordCount);
final Map<String, Integer> followupCustomerCountMap = convertMap(followupCustomerCount, Map<String, Integer> followupCustomerCountMap = convertMap(followupCustomerCount,
CrmStatisticsFollowupSummaryByDateRespVO::getTime, CrmStatisticsFollowupSummaryByDateRespVO::getTime,
CrmStatisticsFollowupSummaryByDateRespVO::getFollowupCustomerCount); CrmStatisticsFollowupSummaryByDateRespVO::getFollowupCustomerCount);
times.forEach(time -> respVoList.add( List<CrmStatisticsFollowupSummaryByDateRespVO> respVoList = convertList(times, time ->
new CrmStatisticsFollowupSummaryByDateRespVO().setTime(time) new CrmStatisticsFollowupSummaryByDateRespVO().setTime(time)
.setFollowupRecordCount(followupRecordCountMap.getOrDefault(time, 0)) .setFollowupRecordCount(followupRecordCountMap.getOrDefault(time, 0))
.setFollowupCustomerCount(followupCustomerCountMap.getOrDefault(time, 0)) .setFollowupCustomerCount(followupCustomerCountMap.getOrDefault(time, 0))
)); );
return respVoList; return respVoList;
} }
@ -173,31 +163,30 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
@Override @Override
public List<CrmStatisticsFollowupSummaryByUserRespVO> getFollowupSummaryByUser(CrmStatisticsCustomerReqVO reqVO) { public List<CrmStatisticsFollowupSummaryByUserRespVO> getFollowupSummaryByUser(CrmStatisticsCustomerReqVO reqVO) {
// 1. 获得用户编号数组 // 1. 获得用户编号数组
final List<Long> userIds = getUserIds(reqVO); List<Long> userIds = getUserIds(reqVO);
if (CollUtil.isEmpty(userIds)) { if (CollUtil.isEmpty(userIds)) {
return Collections.emptyList(); return Collections.emptyList();
} }
reqVO.setUserIds(userIds); reqVO.setUserIds(userIds);
// 2. 获取分项统计数据 // 2. 获取分项统计数据
reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); List<CrmStatisticsFollowupSummaryByUserRespVO> followupRecordCount = customerMapper.selectFollowupRecordCountGroupByUser(reqVO);
final List<CrmStatisticsFollowupSummaryByUserRespVO> followupRecordCount = customerMapper.selectFollowupRecordCountGroupbyUser(reqVO); List<CrmStatisticsFollowupSummaryByUserRespVO> followupCustomerCount = customerMapper.selectFollowupCustomerCountGroupByUser(reqVO);
final List<CrmStatisticsFollowupSummaryByUserRespVO> followupCustomerCount = customerMapper.selectFollowupCustomerCountGroupbyUser(reqVO);
// 3. 合并统计数据 // 3. 合并统计数据
final Map<Long, Integer> followupRecordCountMap = convertMap(followupRecordCount, Map<Long, Integer> followupRecordCountMap = convertMap(followupRecordCount,
CrmStatisticsFollowupSummaryByUserRespVO::getOwnerUserId, CrmStatisticsFollowupSummaryByUserRespVO::getOwnerUserId,
CrmStatisticsFollowupSummaryByUserRespVO::getFollowupRecordCount); CrmStatisticsFollowupSummaryByUserRespVO::getFollowupRecordCount);
final Map<Long, Integer> followupCustomerCountMap = convertMap(followupCustomerCount, Map<Long, Integer> followupCustomerCountMap = convertMap(followupCustomerCount,
CrmStatisticsFollowupSummaryByUserRespVO::getOwnerUserId, CrmStatisticsFollowupSummaryByUserRespVO::getOwnerUserId,
CrmStatisticsFollowupSummaryByUserRespVO::getFollowupCustomerCount); CrmStatisticsFollowupSummaryByUserRespVO::getFollowupCustomerCount);
List<CrmStatisticsFollowupSummaryByUserRespVO> respVoList = new ArrayList<>(userIds.size()); List<CrmStatisticsFollowupSummaryByUserRespVO> respVoList = convertList(userIds, userId -> {
userIds.forEach(userId -> { CrmStatisticsFollowupSummaryByUserRespVO vo = new CrmStatisticsFollowupSummaryByUserRespVO()
final CrmStatisticsFollowupSummaryByUserRespVO vo = new CrmStatisticsFollowupSummaryByUserRespVO()
.setFollowupRecordCount(followupRecordCountMap.getOrDefault(userId, 0)) .setFollowupRecordCount(followupRecordCountMap.getOrDefault(userId, 0))
.setFollowupCustomerCount(followupCustomerCountMap.getOrDefault(userId, 0)); .setFollowupCustomerCount(followupCustomerCountMap.getOrDefault(userId, 0));
// ownerUserId 为基类属性
vo.setOwnerUserId(userId); vo.setOwnerUserId(userId);
respVoList.add(vo); return vo;
}); });
// 4. 拼接用户信息 // 4. 拼接用户信息
@ -208,19 +197,18 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
@Override @Override
public List<CrmStatisticsFollowupSummaryByTypeRespVO> getFollowupSummaryByType(CrmStatisticsCustomerReqVO reqVO) { public List<CrmStatisticsFollowupSummaryByTypeRespVO> getFollowupSummaryByType(CrmStatisticsCustomerReqVO reqVO) {
// 1. 获得用户编号数组 // 1. 获得用户编号数组
final List<Long> userIds = getUserIds(reqVO); List<Long> userIds = getUserIds(reqVO);
if (CollUtil.isEmpty(userIds)) { if (CollUtil.isEmpty(userIds)) {
return Collections.emptyList(); return Collections.emptyList();
} }
reqVO.setUserIds(userIds); reqVO.setUserIds(userIds);
// 2. 获得排行数据 // 2. 获得排行数据
reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); List<CrmStatisticsFollowupSummaryByTypeRespVO> respVoList = customerMapper.selectFollowupRecordCountGroupByType(reqVO);
List<CrmStatisticsFollowupSummaryByTypeRespVO> respVoList = customerMapper.selectFollowupRecordCountGroupbyType(reqVO);
// 3. 获取字典数据 // 3. 获取字典数据
List<DictDataRespDTO> followUpTypes = dictDataApi.getDictDataList(CRM_FOLLOW_UP_TYPE); 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); DictDataRespDTO::getValue, DictDataRespDTO::getLabel);
respVoList.forEach(vo -> { respVoList.forEach(vo -> {
vo.setFollowupType(followUpTypeMap.get(vo.getFollowupType())); vo.setFollowupType(followUpTypeMap.get(vo.getFollowupType()));
@ -232,7 +220,7 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
@Override @Override
public List<CrmStatisticsCustomerContractSummaryRespVO> getContractSummary(CrmStatisticsCustomerReqVO reqVO) { public List<CrmStatisticsCustomerContractSummaryRespVO> getContractSummary(CrmStatisticsCustomerReqVO reqVO) {
// 1. 获得用户编号数组 // 1. 获得用户编号数组
final List<Long> userIds = getUserIds(reqVO); List<Long> userIds = getUserIds(reqVO);
if (CollUtil.isEmpty(userIds)) { if (CollUtil.isEmpty(userIds)) {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -242,16 +230,16 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
List<CrmStatisticsCustomerContractSummaryRespVO> respVoList = customerMapper.selectContractSummary(reqVO); List<CrmStatisticsCustomerContractSummaryRespVO> respVoList = customerMapper.selectContractSummary(reqVO);
// 3. 设置 创建人负责人行业来源 // 3. 设置 创建人负责人行业来源
// 获取客户所属行业 // 3.1 获取客户所属行业
Map<String, String> industryMap = convertMap(dictDataApi.getDictDataList(CRM_CUSTOMER_INDUSTRY), Map<String, String> industryMap = convertMap(dictDataApi.getDictDataList(CRM_CUSTOMER_INDUSTRY),
DictDataRespDTO::getValue, DictDataRespDTO::getLabel); DictDataRespDTO::getValue, DictDataRespDTO::getLabel);
// 获取客户来源 // 3.2 获取客户来源
Map<String, String> sourceMap = convertMap(dictDataApi.getDictDataList(CRM_CUSTOMER_SOURCE), Map<String, String> sourceMap = convertMap(dictDataApi.getDictDataList(CRM_CUSTOMER_SOURCE),
DictDataRespDTO::getValue, DictDataRespDTO::getLabel); DictDataRespDTO::getValue, DictDataRespDTO::getLabel);
// 获取创建人负责人列表 // 3.3 获取创建人负责人列表
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSetByFlatMap(respVoList, Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSetByFlatMap(respVoList,
vo -> Stream.of(NumberUtils.parseLong(vo.getCreatorUserId()), vo.getOwnerUserId()))); vo -> Stream.of(NumberUtils.parseLong(vo.getCreatorUserId()), vo.getOwnerUserId())));
// 3.4 设置 创建人负责人行业来源
respVoList.forEach(vo -> { respVoList.forEach(vo -> {
MapUtils.findAndThen(industryMap, vo.getIndustryId(), vo::setIndustryName); MapUtils.findAndThen(industryMap, vo.getIndustryId(), vo::setIndustryName);
MapUtils.findAndThen(sourceMap, vo.getSource(), vo::setSourceName); MapUtils.findAndThen(sourceMap, vo.getSource(), vo::setSourceName);
@ -266,7 +254,7 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
@Override @Override
public List<CrmStatisticsCustomerDealCycleByDateRespVO> getCustomerDealCycleByDate(CrmStatisticsCustomerReqVO reqVO) { public List<CrmStatisticsCustomerDealCycleByDateRespVO> getCustomerDealCycleByDate(CrmStatisticsCustomerReqVO reqVO) {
// 1. 获得用户编号数组 // 1. 获得用户编号数组
final List<Long> userIds = getUserIds(reqVO); List<Long> userIds = getUserIds(reqVO);
if (CollUtil.isEmpty(userIds)) { if (CollUtil.isEmpty(userIds)) {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -274,52 +262,48 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
// 2. 获取分项统计数据 // 2. 获取分项统计数据
reqVO.setSqlDateFormat(getSqlDateFormat(reqVO.getTimes()[0], reqVO.getTimes()[1])); reqVO.setSqlDateFormat(getSqlDateFormat(reqVO.getTimes()[0], reqVO.getTimes()[1]));
reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); List<CrmStatisticsCustomerDealCycleByDateRespVO> customerDealCycle = customerMapper.selectCustomerDealCycleGroupByDate(reqVO);
final List<CrmStatisticsCustomerDealCycleByDateRespVO> customerDealCycle = customerMapper.selectCustomerDealCycleGroupbyDate(reqVO);
// 3. 获取时间序列 // 3. 合并统计数据
final List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]); List<String> times = generateTimeSeries(reqVO.getTimes()[0], reqVO.getTimes()[1]);
Map<String, Double> customerDealCycleMap = convertMap(customerDealCycle,
// 4. 合并统计数据
List<CrmStatisticsCustomerDealCycleByDateRespVO> respVoList = new ArrayList<>(times.size());
final Map<String, Double> customerDealCycleMap = convertMap(customerDealCycle,
CrmStatisticsCustomerDealCycleByDateRespVO::getTime, CrmStatisticsCustomerDealCycleByDateRespVO::getTime,
CrmStatisticsCustomerDealCycleByDateRespVO::getCustomerDealCycle); CrmStatisticsCustomerDealCycleByDateRespVO::getCustomerDealCycle);
times.forEach(time -> respVoList.add( List<CrmStatisticsCustomerDealCycleByDateRespVO> respVoList = convertList(times, time ->
new CrmStatisticsCustomerDealCycleByDateRespVO().setTime(time) new CrmStatisticsCustomerDealCycleByDateRespVO().setTime(time)
.setCustomerDealCycle(customerDealCycleMap.getOrDefault(time, 0D)) .setCustomerDealCycle(customerDealCycleMap.getOrDefault(time, 0D))
)); );
return respVoList; return respVoList;
} }
@Override @Override
public List<CrmStatisticsCustomerDealCycleByUserRespVO> getCustomerDealCycleByUser(CrmStatisticsCustomerReqVO reqVO) { public List<CrmStatisticsCustomerDealCycleByUserRespVO> getCustomerDealCycleByUser(CrmStatisticsCustomerReqVO reqVO) {
// 1. 获得用户编号数组 // 1. 获得用户编号数组
final List<Long> userIds = getUserIds(reqVO); List<Long> userIds = getUserIds(reqVO);
if (CollUtil.isEmpty(userIds)) { if (CollUtil.isEmpty(userIds)) {
return Collections.emptyList(); return Collections.emptyList();
} }
reqVO.setUserIds(userIds); reqVO.setUserIds(userIds);
// 2. 获取分项统计数据 // 2. 获取分项统计数据
reqVO.setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()); List<CrmStatisticsCustomerDealCycleByUserRespVO> customerDealCycle = customerMapper.selectCustomerDealCycleGroupByUser(reqVO);
final List<CrmStatisticsCustomerDealCycleByUserRespVO> customerDealCycle = customerMapper.selectCustomerDealCycleGroupbyUser(reqVO); List<CrmStatisticsCustomerSummaryByUserRespVO> customerDealCount = customerMapper.selectCustomerDealCountGroupByUser(reqVO);
final List<CrmStatisticsCustomerSummaryByUserRespVO> customerDealCount = customerMapper.selectCustomerDealCountGroupbyUser(reqVO);
// 3. 合并统计数据 // 3. 合并统计数据
final Map<Long, Double> customerDealCycleMap = convertMap(customerDealCycle, Map<Long, Double> customerDealCycleMap = convertMap(customerDealCycle,
CrmStatisticsCustomerDealCycleByUserRespVO::getOwnerUserId, CrmStatisticsCustomerDealCycleByUserRespVO::getOwnerUserId,
CrmStatisticsCustomerDealCycleByUserRespVO::getCustomerDealCycle); CrmStatisticsCustomerDealCycleByUserRespVO::getCustomerDealCycle);
final Map<Long, Integer> customerDealCountMap = convertMap(customerDealCount, Map<Long, Integer> customerDealCountMap = convertMap(customerDealCount,
CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId, CrmStatisticsCustomerSummaryByUserRespVO::getOwnerUserId,
CrmStatisticsCustomerSummaryByUserRespVO::getCustomerDealCount); CrmStatisticsCustomerSummaryByUserRespVO::getCustomerDealCount);
List<CrmStatisticsCustomerDealCycleByUserRespVO> respVoList = new ArrayList<>(userIds.size()); List<CrmStatisticsCustomerDealCycleByUserRespVO> respVoList = convertList(userIds, userId -> {
userIds.forEach(userId -> { CrmStatisticsCustomerDealCycleByUserRespVO vo = new CrmStatisticsCustomerDealCycleByUserRespVO()
final CrmStatisticsCustomerDealCycleByUserRespVO vo = new CrmStatisticsCustomerDealCycleByUserRespVO()
.setCustomerDealCycle(customerDealCycleMap.getOrDefault(userId, 0.0)) .setCustomerDealCycle(customerDealCycleMap.getOrDefault(userId, 0.0))
.setCustomerDealCount(customerDealCountMap.getOrDefault(userId, 0)); .setCustomerDealCount(customerDealCountMap.getOrDefault(userId, 0));
// ownerUserId 为基类属性
vo.setOwnerUserId(userId); vo.setOwnerUserId(userId);
respVoList.add(vo); return vo;
}); });
// 4. 拼接用户信息 // 4. 拼接用户信息
@ -335,8 +319,9 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
*/ */
private <T extends CrmStatisticsCustomerByUserBaseRespVO> void appendUserInfo(List<T> respVoList) { private <T extends CrmStatisticsCustomerByUserBaseRespVO> void appendUserInfo(List<T> respVoList) {
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSet(respVoList, Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSet(respVoList,
CrmStatisticsCustomerByUserBaseRespVO::getOwnerUserId)); CrmStatisticsCustomerByUserBaseRespVO::getOwnerUserId));
respVoList.forEach(vo -> MapUtils.findAndThen(userMap, vo.getOwnerUserId(), user -> vo.setOwnerUserName(user.getNickname()))); respVoList.forEach(vo -> MapUtils.findAndThen(userMap,
vo.getOwnerUserId(), user -> vo.setOwnerUserName(user.getNickname())));
} }
/** /**
@ -352,7 +337,7 @@ public class CrmStatisticsCustomerServiceImpl implements CrmStatisticsCustomerSe
} }
// 情况二选中某个部门 // 情况二选中某个部门
// 2.1 获得部门列表 // 2.1 获得部门列表
final Long deptId = reqVO.getDeptId(); Long deptId = reqVO.getDeptId();
List<Long> deptIds = convertList(deptApi.getChildDeptList(deptId), DeptRespDTO::getId); List<Long> deptIds = convertList(deptApi.getChildDeptList(deptId), DeptRespDTO::getId);
deptIds.add(deptId); deptIds.add(deptId);
// 2.2 获得用户编号 // 2.2 获得用户编号

View File

@ -2,251 +2,233 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!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"> <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"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByDateRespVO">
SELECT SELECT
<!-- TODO @dhb52下面这个缩进一个 tab这样可读性更好哈 --> DATE_FORMAT( create_time, #{sqlDateFormat} ) AS time,
DATE_FORMAT( create_time, #{sqlDateFormat} ) AS time, COUNT(*) AS customerCreateCount
COUNT(*) AS customerCreateCount FROM crm_customer
FROM crm_customer WHERE deleted = 0
WHERE deleted = 0 AND owner_user_id IN
AND owner_user_id IN <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> #{userId}
#{userId} </foreach>
</foreach> AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND GROUP BY time
<!-- TODO @dhb52这可以考虑不换行直接跟在后面的 AND更连贯哈 -->
#{times[1],javaType=java.time.LocalDateTime}
GROUP BY time
</select> </select>
<select id="selectCustomerDealCountGroupbyDate" <select id="selectCustomerDealCountGroupByDate"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByDateRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByDateRespVO">
SELECT SELECT
<!-- TODO @dhb52下面这个缩进一个 tab这样可读性更好哈 --> DATE_FORMAT( order_date, #{sqlDateFormat} ) AS time,
<!-- TODO @dhb52表变量最好不要用 a、b可以用 customer 和 constract虽然长一点但是一眼看的清楚哈 --> COUNT( DISTINCT customer_id ) AS customerDealCount
DATE_FORMAT( b.order_date, #{sqlDateFormat} ) AS time, FROM crm_contract
count( DISTINCT a.id ) AS customerDealCount WHERE deleted = 0
FROM crm_customer AS a AND audit_status = 20
LEFT JOIN crm_contract AS b ON b.customer_id = a.id AND owner_user_id IN
WHERE a.deleted = 0 AND b.deleted = 0 <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
AND b.audit_status = 20 #{userId}
AND a.owner_user_id IN </foreach>
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
#{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}
GROUP BY time GROUP BY time
</select> </select>
<!-- TODO @dhb52根据上面建议进行优化 --> <select id="selectCustomerCreateCountGroupByUser"
<select id="selectCustomerCreateCountGroupbyUser"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO">
SELECT owner_user_id, COUNT(1) AS customer_create_count SELECT
FROM crm_customer owner_user_id,
WHERE deleted = 0 COUNT(1) AS customer_create_count
AND owner_user_id in FROM crm_customer
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> WHERE deleted = 0
#{userId} AND owner_user_id in
</foreach> <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{userId}
#{times[1],javaType=java.time.LocalDateTime} </foreach>
AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
GROUP BY owner_user_id GROUP BY owner_user_id
</select> </select>
<!-- TODO @dhb52根据上面建议进行优化 --> <select id="selectCustomerDealCountGroupByUser"
<select id="selectCustomerDealCountGroupbyUser"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO"> 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 SELECT
FROM crm_customer AS a customer.owner_user_id,
LEFT JOIN crm_contract AS b ON b.customer_id = a.id COUNT( DISTINCT customer.id ) AS customer_deal_count
WHERE a.deleted = 0 AND b.deleted = 0 FROM crm_customer AS customer
AND b.audit_status = 20 LEFT JOIN crm_contract AS contract ON contract.customer_id = customer.id
AND a.owner_user_id IN WHERE customer.deleted = 0 AND contract.deleted = 0
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> AND contract.audit_status = 20
#{userId} AND customer.owner_user_id IN
</foreach> <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{userId}
#{times[1],javaType=java.time.LocalDateTime} </foreach>
GROUP BY a.owner_user_id 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> </select>
<!-- TODO @dhb52根据上面建议进行优化 --> <select id="selectContractPriceGroupByUser"
<select id="selectContractPriceGroupbyUser"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO">
SELECT owner_user_id, IFNULL(SUM(total_price), 0) AS contract_price SELECT
FROM crm_contract owner_user_id,
WHERE deleted = 0 IFNULL(SUM(total_price), 0) AS contract_price
AND audit_status = 20 FROM crm_contract
AND owner_user_id in WHERE deleted = 0
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> AND audit_status = 20
#{userId} AND owner_user_id in
</foreach> <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
AND order_date BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{userId}
#{times[1],javaType=java.time.LocalDateTime} </foreach>
GROUP BY owner_user_id AND order_date BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
GROUP BY owner_user_id
</select> </select>
<select id="selectReceivablePriceGroupByUser"
<!-- TODO @dhb52根据上面建议进行优化 -->
<select id="selectReceivablePriceGroupbyUser"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerSummaryByUserRespVO">
SELECT owner_user_id, SELECT
IFNULL(SUM(price), 0) AS receivable_price owner_user_id,
FROM crm_receivable IFNULL(SUM(price), 0) AS receivable_price
WHERE deleted = 0 FROM crm_receivable
AND audit_status = 20 WHERE deleted = 0
AND owner_user_id IN AND audit_status = 20
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> AND owner_user_id IN
#{userId} <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
</foreach> #{userId}
AND return_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND </foreach>
#{times[1],javaType=java.time.LocalDateTime} AND return_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
GROUP BY owner_user_id GROUP BY owner_user_id
</select> </select>
<select id="selectFollowupRecordCountGroupbyDate" <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"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByDateRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByDateRespVO">
SELECT SELECT
DATE_FORMAT( create_time, #{sqlDateFormat} ) AS time, DATE_FORMAT( create_time, #{sqlDateFormat} ) AS time,
count(DISTINCT biz_id) AS followup_customer_count COUNT(*) AS followup_record_count
FROM crm_follow_up_record FROM crm_follow_up_record
WHERE creator IN WHERE creator IN
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
#{userId} #{userId}
</foreach> </foreach>
AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
#{times[1],javaType=java.time.LocalDateTime} AND biz_type = ${@cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum@CRM_CUSTOMER.type}
AND biz_type = #{bizType} GROUP BY time
GROUP BY time
</select> </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"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByUserRespVO">
SELECT creator as owner_user_id, SELECT
count(*) AS followup_record_count creator as owner_user_id,
FROM crm_follow_up_record COUNT(*) AS followup_record_count
WHERE creator IN FROM crm_follow_up_record
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> WHERE creator IN
#{userId} <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
</foreach> #{userId}
AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND </foreach>
#{times[1],javaType=java.time.LocalDateTime} AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
AND biz_type = #{bizType} AND biz_type = ${@cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum@CRM_CUSTOMER.type}
GROUP BY creator GROUP BY creator
</select> </select>
<select id="selectFollowupCustomerCountGroupbyUser" <select id="selectFollowupCustomerCountGroupByUser"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByUserRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByUserRespVO">
SELECT creator as owner_user_id, SELECT
count(DISTINCT biz_id) AS followup_customer_count creator as owner_user_id,
FROM crm_follow_up_record COUNT(DISTINCT biz_id) AS followup_customer_count
WHERE creator IN FROM crm_follow_up_record
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> WHERE creator IN
#{userId} <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
</foreach> #{userId}
AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND </foreach>
#{times[1],javaType=java.time.LocalDateTime} AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
AND biz_type = #{bizType} AND biz_type = ${@cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum@CRM_CUSTOMER.type}
GROUP BY creator GROUP BY creator
</select> </select>
<select id="selectFollowupRecordCountGroupbyType" <select id="selectFollowupRecordCountGroupByType"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByTypeRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsFollowupSummaryByTypeRespVO">
SELECT SELECT
type AS followupType, type AS followupType,
count(*) AS followup_record_count COUNT(*) AS followup_record_count
FROM crm_follow_up_record FROM crm_follow_up_record
WHERE creator IN WHERE creator IN
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
#{userId} #{userId}
</foreach> </foreach>
AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND AND create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
#{times[1],javaType=java.time.LocalDateTime} AND biz_type = ${@cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum@CRM_CUSTOMER.type}
AND biz_type = #{bizType} GROUP BY followupType
GROUP BY followupType
</select> </select>
<select id="selectContractSummary" <select id="selectContractSummary"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerContractSummaryRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerContractSummaryRespVO">
SELECT SELECT
a.`name` AS customer_name, customer.`name` AS customer_name,
b.`name` AS contract_name, contract.`name` AS contract_name,
b.total_price, contract.total_price,
IFNULL( c.price, 0 ) AS receivable_price, IFNULL( receivable.price, 0 ) AS receivable_price,
a.industry_id, customer.industry_id,
a.source, customer.source,
a.owner_user_id, customer.owner_user_id,
a.creator AS creator_user_id, customer.creator AS creator_user_id,
a.create_time, customer.create_time,
b.order_date contract.order_date
FROM FROM crm_customer AS customer
crm_customer AS a INNER JOIN crm_contract AS contract ON customer.id = contract.customer_id
INNER JOIN crm_contract AS b ON a.id = b.customer_id LEFT JOIN crm_receivable AS receivable ON contract.id = receivable.contract_id
LEFT JOIN crm_receivable AS c ON b.id = c.contract_id WHERE customer.deleted = 0 AND contract.deleted = 0 AND receivable.deleted = 0
WHERE a.deleted = 0 AND b.deleted = 0 AND c.deleted = 0 AND contract.audit_status = 20
AND b.audit_status = 20 AND customer.owner_user_id IN
AND a.owner_user_id IN <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> #{userId}
#{userId} </foreach>
</foreach> AND contract.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND
#{times[1],javaType=java.time.LocalDateTime}
</select> </select>
<select id="selectCustomerDealCycleGroupbyDate" <select id="selectCustomerDealCycleGroupByDate"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerDealCycleByDateRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerDealCycleByDateRespVO">
SELECT SELECT
DATE_FORMAT( b.order_date, #{sqlDateFormat} ) AS time, DATE_FORMAT( contract.order_date, #{sqlDateFormat} ) AS time,
IFNULL( TRUNCATE ( AVG( TIMESTAMPDIFF( DAY, a.create_time, b.order_date )), 1 ), 0 ) AS customer_deal_cycle IFNULL( TRUNCATE ( AVG( TIMESTAMPDIFF( DAY, customer.create_time, contract.order_date )), 1 ), 0 ) AS customer_deal_cycle
FROM crm_customer AS a FROM crm_customer AS customer
LEFT JOIN crm_contract AS b ON b.customer_id = a.id LEFT JOIN crm_contract AS contract ON contract.customer_id = customer.id
WHERE a.deleted = 0 AND b.deleted = 0 WHERE customer.deleted = 0 AND contract.deleted = 0
AND b.audit_status = 20 AND contract.audit_status = 20
AND a.owner_user_id IN AND customer.owner_user_id IN
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
#{userId} #{userId}
</foreach> </foreach>
AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND AND contract.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
#{times[1],javaType=java.time.LocalDateTime} GROUP BY time
GROUP BY time
</select> </select>
<select id="selectCustomerDealCycleGroupbyUser" <select id="selectCustomerDealCycleGroupByUser"
resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerDealCycleByUserRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.customer.CrmStatisticsCustomerDealCycleByUserRespVO">
SELECT SELECT
a.owner_user_id, customer.owner_user_id,
IFNULL( TRUNCATE ( AVG( TIMESTAMPDIFF( DAY, a.create_time, b.order_date )), 1 ), 0 ) AS customer_deal_cycle IFNULL( TRUNCATE ( AVG( TIMESTAMPDIFF( DAY, customer.create_time, contract.order_date )), 1 ), 0 ) AS customer_deal_cycle
FROM crm_customer AS a FROM crm_customer AS customer
LEFT JOIN crm_contract AS b ON b.customer_id = a.id LEFT JOIN crm_contract AS contract ON contract.customer_id = customer.id
WHERE a.deleted = 0 AND b.deleted = 0 WHERE customer.deleted = 0 AND contract.deleted = 0
AND b.audit_status = 20 AND contract.audit_status = 20
AND a.owner_user_id IN AND customer.owner_user_id IN
<foreach collection="userIds" item="userId" open="(" close=")" separator=","> <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
#{userId} #{userId}
</foreach> </foreach>
AND b.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND AND contract.create_time BETWEEN #{times[0],javaType=java.time.LocalDateTime} AND #{times[1],javaType=java.time.LocalDateTime}
#{times[1],javaType=java.time.LocalDateTime} GROUP BY customer.owner_user_id
GROUP BY a.owner_user_id
</select> </select>
</mapper> </mapper>