mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-22 23:31:52 +08:00
fix: [CRM-客户统计]根据Code-Review 修改代码
This commit is contained in:
parent
d556b29214
commit
ee2be79987
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user