package cn.iocoder.yudao.module.crm.service.statistics; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO; import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO; import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsPerformanceMapper; 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.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; 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; import java.util.function.Function; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; /** * CRM 员工业绩分析 Service 实现类 * * @author scholar */ @Service @Validated public class CrmStatisticsPerformanceServiceImpl implements CrmStatisticsPerformanceService { @Resource private CrmStatisticsPerformanceMapper performanceMapper; @Resource private AdminUserApi adminUserApi; @Resource private DeptApi deptApi; @Override public List getContractCountPerformance(CrmStatisticsPerformanceReqVO performanceReqVO) { return getPerformance(performanceReqVO, performanceMapper::selectContractCountPerformance); } @Override public List getContractPricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO) { return getPerformance(performanceReqVO, performanceMapper::selectContractPricePerformance); } @Override public List getReceivablePricePerformance(CrmStatisticsPerformanceReqVO performanceReqVO) { return getPerformance(performanceReqVO, performanceMapper::selectReceivablePricePerformance); } /** * 获得员工业绩数据 * * 1. 获得今年 + 去年的数据 * 2. 遍历今年的月份,逐个拼接去年的月份数据 * * @param performanceReqVO 参数 * @param performanceFunction 员工业绩统计方法 * @return 员工业绩数据 */ private List getPerformance(CrmStatisticsPerformanceReqVO performanceReqVO, Function> performanceFunction) { // 1. 获得用户编号数组 List userIds = getUserIds(performanceReqVO); if (CollUtil.isEmpty(userIds)) { return Collections.emptyList(); } performanceReqVO.setUserIds(userIds); // 2. 获得业绩数据 int year = performanceReqVO.getTimes()[0].getYear(); // 获取查询的年份 performanceReqVO.getTimes()[0] = performanceReqVO.getTimes()[0].minusYears(1); List performanceList = performanceFunction.apply(performanceReqVO); Map performanceMap = convertMap(performanceList, CrmStatisticsPerformanceRespVO::getTime, CrmStatisticsPerformanceRespVO::getCurrentMonthCount); // 3. 组装数据返回 List result = new ArrayList<>(); for (int month = 1; month <= 12; month++) { String currentMonth = String.format("%d%02d", year, month); String lastMonth = month == 1 ? String.format("%d%02d", year - 1, 12) : String.format("%d%02d", year, month - 1); String lastYear = String.format("%d%02d", year - 1, month); result.add(new CrmStatisticsPerformanceRespVO().setTime(currentMonth) .setCurrentMonthCount(performanceMap.getOrDefault(currentMonth, BigDecimal.ZERO)) .setLastMonthCount(performanceMap.getOrDefault(lastMonth, BigDecimal.ZERO)) .setLastYearCount(performanceMap.getOrDefault(lastYear, BigDecimal.ZERO))); } return result; } /** * 获取用户编号数组。如果用户编号为空, 则获得部门下的用户编号数组,包括子部门的所有用户编号 * * @param reqVO 请求参数 * @return 用户编号数组 */ private List getUserIds(CrmStatisticsPerformanceReqVO reqVO) { // 情况一:选中某个用户 if (ObjUtil.isNotNull(reqVO.getUserId())) { return ListUtil.of(reqVO.getUserId()); } // 情况二:选中某个部门 // 2.1 获得部门列表 final Long deptId = reqVO.getDeptId(); List deptIds = convertList(deptApi.getChildDeptList(deptId), DeptRespDTO::getId); deptIds.add(deptId); // 2.2 获得用户编号 return convertList(adminUserApi.getUserListByDeptIds(deptIds), AdminUserRespDTO::getId); } }