mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	CRM: 新增商机赢单转化率分析
This commit is contained in:
		| @@ -5,10 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.business.CrmBusinessController; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByEndStatusRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticFunnelSummaryRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByDateRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsFunnelReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.*; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; | ||||
| import cn.iocoder.yudao.module.crm.service.statistics.CrmStatisticsFunnelService; | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| @@ -55,6 +52,13 @@ public class CrmStatisticsFunnelController { | ||||
|         return success(funnelService.getBusinessSummaryByDate(reqVO)); | ||||
|     } | ||||
|  | ||||
|     @GetMapping("/get-business-inversion-rate-summary-by-date") | ||||
|     @Operation(summary = "获取商机转化率分析(按日期)", description = "用于【销售漏斗】页面") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:statistics-funnel:query')") | ||||
|     public CommonResult<List<CrmStatisticsBusinessInversionRateSummaryByDateRespVO>> getBusinessInversionRateSummaryByDate(@Valid CrmStatisticsFunnelReqVO reqVO) { | ||||
|         return success(funnelService.getBusinessInversionRateSummaryByDate(reqVO)); | ||||
|     } | ||||
|  | ||||
|     @GetMapping("/get-business-page-by-date") | ||||
|     @Operation(summary = "获得商机分页(按日期)", description = "用于【销售漏斗】页面的【新增商机分析】") | ||||
|     @PreAuthorize("@ss.hasPermission('crm:business:query')") | ||||
|   | ||||
| @@ -0,0 +1,21 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
|  | ||||
| @Schema(description = "管理后台 - CRM 商机转化率分析(按日期) VO") | ||||
| @Data | ||||
| public class CrmStatisticsBusinessInversionRateSummaryByDateRespVO { | ||||
|  | ||||
|     @Schema(description = "时间轴", requiredMode = Schema.RequiredMode.REQUIRED, example = "202401") | ||||
|     private String time; | ||||
|  | ||||
|     @Schema(description = "商机数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private Long businessCount; | ||||
|  | ||||
|     @Schema(description = "赢单商机数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private Long businessWinCount; | ||||
|  | ||||
| } | ||||
| @@ -13,7 +13,7 @@ public class CrmStatisticsBusinessSummaryByDateRespVO { | ||||
|     private String time; | ||||
|  | ||||
|     @Schema(description = "新增商机数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private Integer businessCreateCount; | ||||
|     private Long businessCreateCount; | ||||
|  | ||||
|     @Schema(description = "新增商机金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private BigDecimal totalPrice; | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package cn.iocoder.yudao.module.crm.dal.mysql.statistics; | ||||
|  | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessInversionRateSummaryByDateRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByDateRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByEndStatusRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsFunnelReqVO; | ||||
| @@ -24,4 +25,6 @@ public interface CrmStatisticsFunnelMapper { | ||||
|  | ||||
|     List<CrmStatisticsBusinessSummaryByDateRespVO> selectBusinessSummaryGroupByDate(CrmStatisticsFunnelReqVO reqVO); | ||||
|  | ||||
|     List<CrmStatisticsBusinessInversionRateSummaryByDateRespVO> selectBusinessInversionRateSummaryByDate(CrmStatisticsFunnelReqVO reqVO); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,10 +1,7 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.statistics; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByEndStatusRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticFunnelSummaryRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByDateRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsFunnelReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.*; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; | ||||
|  | ||||
| import java.util.List; | ||||
| @@ -40,6 +37,14 @@ public interface CrmStatisticsFunnelService { | ||||
|      */ | ||||
|     List<CrmStatisticsBusinessSummaryByDateRespVO> getBusinessSummaryByDate(CrmStatisticsFunnelReqVO reqVO); | ||||
|  | ||||
|     /** | ||||
|      * 获得商机转化率分析(按日期) | ||||
|      * | ||||
|      * @param reqVO 请求 | ||||
|      * @return 商机转化率分析 | ||||
|      */ | ||||
|     List<CrmStatisticsBusinessInversionRateSummaryByDateRespVO> getBusinessInversionRateSummaryByDate(CrmStatisticsFunnelReqVO reqVO); | ||||
|  | ||||
|     /** | ||||
|      * 获得商机分页(按日期) | ||||
|      * | ||||
|   | ||||
| @@ -4,10 +4,7 @@ import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.util.ObjUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticFunnelSummaryRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByDateRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessSummaryByEndStatusRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsFunnelReqVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.*; | ||||
| import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; | ||||
| import cn.iocoder.yudao.module.crm.dal.mysql.statistics.CrmStatisticsFunnelMapper; | ||||
| import cn.iocoder.yudao.module.crm.enums.business.CrmBusinessEndStatusEnum; | ||||
| @@ -85,9 +82,9 @@ public class CrmStatisticsFunnelServiceImpl implements CrmStatisticsFunnelServic | ||||
|         // 3. 按照日期间隔,合并数据 | ||||
|         List<LocalDateTime[]> timeRanges = LocalDateTimeUtils.getDateRangeList(reqVO.getTimes()[0], reqVO.getTimes()[1], reqVO.getInterval()); | ||||
|         return convertList(timeRanges, times -> { | ||||
|             Integer businessCreateCount = businessSummaryList.stream() | ||||
|             Long businessCreateCount = businessSummaryList.stream() | ||||
|                     .filter(vo -> LocalDateTimeUtils.isBetween(times[0], times[1], vo.getTime())) | ||||
|                     .mapToInt(CrmStatisticsBusinessSummaryByDateRespVO::getBusinessCreateCount).sum(); | ||||
|                     .mapToLong(CrmStatisticsBusinessSummaryByDateRespVO::getBusinessCreateCount).sum(); | ||||
|             BigDecimal businessDealCount = businessSummaryList.stream() | ||||
|                     .filter(vo -> LocalDateTimeUtils.isBetween(times[0], times[1], vo.getTime())) | ||||
|                     .map(CrmStatisticsBusinessSummaryByDateRespVO::getTotalPrice) | ||||
| @@ -98,6 +95,31 @@ public class CrmStatisticsFunnelServiceImpl implements CrmStatisticsFunnelServic | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<CrmStatisticsBusinessInversionRateSummaryByDateRespVO> getBusinessInversionRateSummaryByDate(CrmStatisticsFunnelReqVO reqVO) { | ||||
|         // 1. 获得用户编号数组 | ||||
|         reqVO.setUserIds(getUserIds(reqVO)); | ||||
|         if (CollUtil.isEmpty(reqVO.getUserIds())) { | ||||
|             return Collections.emptyList(); | ||||
|         } | ||||
|  | ||||
|         // 2. 按天统计,获取分项统计数据 | ||||
|         List<CrmStatisticsBusinessInversionRateSummaryByDateRespVO> businessSummaryList = funnelMapper.selectBusinessInversionRateSummaryByDate(reqVO); | ||||
|         // 3. 按照日期间隔,合并数据 | ||||
|         List<LocalDateTime[]> timeRanges = LocalDateTimeUtils.getDateRangeList(reqVO.getTimes()[0], reqVO.getTimes()[1], reqVO.getInterval()); | ||||
|         return convertList(timeRanges, times -> { | ||||
|             Long businessCount = businessSummaryList.stream() | ||||
|                     .filter(vo -> LocalDateTimeUtils.isBetween(times[0], times[1], vo.getTime())) | ||||
|                     .mapToLong(CrmStatisticsBusinessInversionRateSummaryByDateRespVO::getBusinessCount).sum(); | ||||
|             Long businessWinCount = businessSummaryList.stream() | ||||
|                     .filter(vo -> LocalDateTimeUtils.isBetween(times[0], times[1], vo.getTime())) | ||||
|                     .mapToLong(CrmStatisticsBusinessInversionRateSummaryByDateRespVO::getBusinessWinCount).sum(); | ||||
|             return new CrmStatisticsBusinessInversionRateSummaryByDateRespVO() | ||||
|                     .setTime(LocalDateTimeUtils.formatDateRange(times[0], times[1], reqVO.getInterval())) | ||||
|                     .setBusinessCount(businessCount).setBusinessWinCount(businessWinCount); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public PageResult<CrmBusinessDO> getBusinessPageByDate(CrmStatisticsFunnelReqVO pageVO) { | ||||
|         // 1. 获得用户编号数组 | ||||
|   | ||||
| @@ -60,4 +60,21 @@ | ||||
|         GROUP BY time | ||||
|     </select> | ||||
|  | ||||
|     <select id="selectBusinessInversionRateSummaryByDate" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.funnel.CrmStatisticsBusinessInversionRateSummaryByDateRespVO"> | ||||
|         SELECT | ||||
|         DATE_FORMAT(create_time, '%Y-%m-%d') AS time, | ||||
|         COUNT(*) AS businessCount, | ||||
|         SUM(IF(end_status = 1, 1, 0)) AS businessWinCount | ||||
|         FROM crm_business | ||||
|         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> | ||||
|  | ||||
| </mapper> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 puhui999
					puhui999