mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	!861 修改:CRM 商业智能,合并模块到 crm,优化查询
Merge pull request !861 from 安浩浩/develop
This commit is contained in:
		| @@ -0,0 +1,9 @@ | ||||
| ### 合同金额排行榜 | ||||
| GET {{baseUrl}}/crm/bi-ranking/contract-ranKing | ||||
| Authorization: Bearer {{token}} | ||||
| tenant-id: {{adminTenentId}} | ||||
|  | ||||
| ### 回款金额排行榜 | ||||
| GET {{baseUrl}}/crm/bi-ranking/receivables-ranKing | ||||
| Authorization: Bearer {{token}} | ||||
| tenant-id: {{adminTenentId}} | ||||
| @@ -0,0 +1,52 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.bi; | ||||
|  | ||||
|  | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRankingReqVO; | ||||
| import cn.iocoder.yudao.module.crm.service.bi.BiRankingService; | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||||
|  | ||||
|  | ||||
| @Tag(name = "管理后台 - 排行榜") | ||||
| @RestController | ||||
| @RequestMapping("/crm/bi-ranking") | ||||
| @Validated | ||||
| public class BiRankingController { | ||||
|  | ||||
|     @Resource | ||||
|     private BiRankingService biRankingService; | ||||
|  | ||||
|     /** | ||||
|      * 合同金额排行榜 | ||||
|      */ | ||||
|     @GetMapping("/contract-ranking") | ||||
|     @Operation(summary = "合同金额排行榜") | ||||
|     @PreAuthorize("@ss.hasPermission('bi:ranking:query')") | ||||
|     public CommonResult<List<BiRanKingRespVO>> contractAmountRanking(BiRankingReqVO biRankingReqVO) { | ||||
|         return success(biRankingService.contractRanKing(biRankingReqVO)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 回款金额排行榜 | ||||
|      */ | ||||
|     @GetMapping("/receivables-ranking") | ||||
|     @Operation(summary = "回款金额排行榜") | ||||
|     @PreAuthorize("@ss.hasPermission('bi:ranking:query')") | ||||
|     public CommonResult<List<BiRanKingRespVO>> receivablesRanKing(BiRankingReqVO biRankingReqVO) { | ||||
|         return success(biRankingService.receivablesRanKing(biRankingReqVO)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,35 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.bi.vo; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageParam; | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
|  | ||||
| // TODO @anhaohao:这个类的命名,还是保持和其它一致使用 ReqVO 结尾;例如说,CrmStatisticsCommonParamReqVO | ||||
| /** | ||||
|  * @author anhaohao | ||||
|  * bi参数 | ||||
|  */ | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| @Schema(description = "bi查询相关参数") | ||||
| @Data | ||||
| public class BiParams extends PageParam { | ||||
|  | ||||
|     @Schema(description = "部门ID") | ||||
|     private Long deptId; | ||||
|  | ||||
|     @Schema(description = "用户ID") | ||||
|     private Long userId; | ||||
|  | ||||
|     // TODO @anhaohao:这个字段,可以融合到 startTime、endTime 里去,交给前端计算哈; | ||||
|     @Schema(description = "类型") | ||||
|     private String type; | ||||
|  | ||||
|     // TODO @anhaohao:还是使用 LocalDateTime | ||||
|     @Schema(description = "开始时间") | ||||
|     private String startTime; | ||||
|  | ||||
|     @Schema(description = "结束时间") | ||||
|     private String endTime; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,23 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.bi.vo; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
|  | ||||
|  | ||||
| @Schema(description = "管理后台 - BI 排行榜 Response VO") | ||||
| @Data | ||||
| public class BiRanKingRespVO { | ||||
|  | ||||
|     @Schema(description = "金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private Integer price; | ||||
|  | ||||
|     @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private String nickname; | ||||
|  | ||||
|     @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private String deptName; | ||||
|  | ||||
|     @Schema(description = "负责人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private Long ownerUserId; | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,35 @@ | ||||
| package cn.iocoder.yudao.module.crm.controller.admin.bi.vo; | ||||
|  | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| import lombok.Data; | ||||
| import org.springframework.format.annotation.DateTimeFormat; | ||||
|  | ||||
| import java.time.LocalDateTime; | ||||
| import java.util.List; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||||
|  | ||||
| /** | ||||
|  * 管理后台 - 排行榜 Request VO | ||||
|  * | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| @Schema(description = "管理后台 - 排行榜 Request VO") | ||||
| @Data | ||||
| public class BiRankingReqVO { | ||||
|  | ||||
|     @Schema(description = "部门id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     private Long deptId; | ||||
|  | ||||
|     @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-12-12 00:00:00") | ||||
|     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||||
|     private LocalDateTime startTime; | ||||
|  | ||||
|     @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-12-12 23:59:59") | ||||
|     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||||
|     private LocalDateTime endTime; | ||||
|  | ||||
|     @Schema(description = "负责人用户 id 集合", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1") | ||||
|     private List<Long> userIds; | ||||
|  | ||||
| } | ||||
| @@ -22,6 +22,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.annotation.Resource; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.validation.Valid; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| @@ -44,6 +45,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti | ||||
| public class CrmContractController { | ||||
|  | ||||
|     @Resource | ||||
|     @Lazy | ||||
|     private CrmContractService contractService; | ||||
|     @Resource | ||||
|     private CrmCustomerService customerService; | ||||
|   | ||||
| @@ -26,6 +26,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.annotation.Resource; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.validation.Valid; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| @@ -51,6 +52,7 @@ public class CrmReceivableController { | ||||
|     @Resource | ||||
|     private CrmReceivableService receivableService; | ||||
|     @Resource | ||||
|     @Lazy | ||||
|     private CrmContractService contractService; | ||||
|     @Resource | ||||
|     private CrmCustomerService customerService; | ||||
|   | ||||
| @@ -28,6 +28,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.annotation.Resource; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.validation.Valid; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| @@ -55,6 +56,7 @@ public class CrmReceivablePlanController { | ||||
|     @Resource | ||||
|     private CrmReceivableService receivableService; | ||||
|     @Resource | ||||
|     @Lazy | ||||
|     private CrmContractService contractService; | ||||
|     @Resource | ||||
|     private CrmCustomerService customerService; | ||||
|   | ||||
| @@ -0,0 +1,31 @@ | ||||
| package cn.iocoder.yudao.module.crm.dal.mysql.bi; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRankingReqVO; | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| @Mapper | ||||
| public interface BiRankingMapper extends BaseMapperX { | ||||
|     /** | ||||
|      * 合同金额排行榜 | ||||
|      * | ||||
|      * @param biRankingReqVO 参数 | ||||
|      * @return List<BiContractAmountRankingRespVO> | ||||
|      */ | ||||
|     List<BiRanKingRespVO> contractRanKing(BiRankingReqVO biRankingReqVO); | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 回款金额排行榜 | ||||
|      * | ||||
|      * @param biRankingReqVO 参数 | ||||
|      * @return List<BiContractAmountRankingRespVO> | ||||
|      */ | ||||
|     List<BiRanKingRespVO> receivablesRanKing(BiRankingReqVO biRankingReqVO); | ||||
| } | ||||
| @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; | ||||
| import com.mzt.logapi.service.IParseFunction; | ||||
| import jakarta.annotation.Resource; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| /** | ||||
| @@ -20,6 +21,7 @@ public class CrmContractParseFunction implements IParseFunction { | ||||
|     public static final String NAME = "getContractById"; | ||||
|  | ||||
|     @Resource | ||||
|     @Lazy | ||||
|     private CrmContractService contractService; | ||||
|  | ||||
|     @Override | ||||
|   | ||||
| @@ -0,0 +1,31 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.bi; | ||||
|  | ||||
|  | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRankingReqVO; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * BI 排行榜 Service 接口 | ||||
|  * | ||||
|  * @author anhaohao | ||||
|  */ | ||||
| public interface BiRankingService { | ||||
|  | ||||
|     /** | ||||
|      * 合同金额排行榜 | ||||
|      * | ||||
|      * @param biRankingReqVO 参数 | ||||
|      * @return List<BiContractAmountRankingRespVO> | ||||
|      */ | ||||
|     List<BiRanKingRespVO> contractRanKing(BiRankingReqVO biRankingReqVO); | ||||
|  | ||||
|     /** | ||||
|      * 回款金额排行榜 | ||||
|      * | ||||
|      * @param biRankingReqVO 参数 | ||||
|      * @return List<BiContractAmountRankingRespVO> | ||||
|      */ | ||||
|     List<BiRanKingRespVO> receivablesRanKing(BiRankingReqVO biRankingReqVO); | ||||
| } | ||||
| @@ -0,0 +1,93 @@ | ||||
| package cn.iocoder.yudao.module.crm.service.bi; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; | ||||
|  | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO; | ||||
| import cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRankingReqVO; | ||||
| import cn.iocoder.yudao.module.crm.dal.mysql.bi.BiRankingMapper; | ||||
| 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.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.function.Function; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| @Service(value = "biRankingService") | ||||
| @Validated | ||||
| public class BiRankingServiceImpl implements BiRankingService { | ||||
|  | ||||
|     @Resource | ||||
|     private BiRankingMapper biRankingMapper; | ||||
|     @Resource | ||||
|     private AdminUserApi adminUserApi; | ||||
|     @Resource | ||||
|     private DeptApi deptApi; | ||||
|  | ||||
|     @Override | ||||
|     public List<BiRanKingRespVO> contractRanKing(BiRankingReqVO biRankingReqVO) { | ||||
|         return processRanking(biRankingReqVO, biRankingMapper::contractRanKing); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<BiRanKingRespVO> receivablesRanKing(BiRankingReqVO biRankingReqVO) { | ||||
|         return processRanking(biRankingReqVO, biRankingMapper::receivablesRanKing); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 处理排行榜 | ||||
|      * | ||||
|      * @param biRankingReqVO  参数 | ||||
|      * @param rankingFunction 排行榜方法 | ||||
|      * @return List<BiRanKingRespVO> | ||||
|      */ | ||||
|     private List<BiRanKingRespVO> processRanking(BiRankingReqVO biRankingReqVO, Function<BiRankingReqVO, List<BiRanKingRespVO>> rankingFunction) { | ||||
|         analyzeAuth(biRankingReqVO); | ||||
|         if (biRankingReqVO.getUserIds().isEmpty()) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
|         List<BiRanKingRespVO> biRanKingRespVOS = rankingFunction.apply(biRankingReqVO); | ||||
|         return setName(biRanKingRespVOS); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 设置用户名称 | ||||
|      * | ||||
|      * @param biRanKingRespVOS 排行榜数据 | ||||
|      * @return List<BiRanKingRespVO> | ||||
|      */ | ||||
|     private List<BiRanKingRespVO> setName(List<BiRanKingRespVO> biRanKingRespVOS) { | ||||
|         List<Long> userIds = biRanKingRespVOS.stream().map(BiRanKingRespVO::getOwnerUserId).collect(Collectors.toList()); | ||||
|         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); | ||||
|         Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(userMap.values().stream().map(AdminUserRespDTO::getDeptId).collect(Collectors.toList())); | ||||
|         for (BiRanKingRespVO biRanKingRespVO : biRanKingRespVOS) { | ||||
|             AdminUserRespDTO adminUserRespDTO = userMap.get(biRanKingRespVO.getOwnerUserId()); | ||||
|             if (adminUserRespDTO != null) { | ||||
|                 biRanKingRespVO.setNickname(adminUserRespDTO.getNickname()); | ||||
|                 DeptRespDTO deptRespDTO = deptMap.get(adminUserRespDTO.getDeptId()); | ||||
|                 if (deptRespDTO != null) { | ||||
|                     biRanKingRespVO.setDeptName(deptRespDTO.getName()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return biRanKingRespVOS; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 分析权限 | ||||
|      * | ||||
|      * @param biRankingReqVO 参数 | ||||
|      */ | ||||
|     public void analyzeAuth(BiRankingReqVO biRankingReqVO) { | ||||
|         Long deptId = biRankingReqVO.getDeptId() == null ? adminUserApi.getUser(SecurityFrameworkUtils.getLoginUserId()).getDeptId() : biRankingReqVO.getDeptId(); | ||||
|         List<Long> deptIds = deptApi.getChildDeptList(deptId).stream().map(DeptRespDTO::getId).collect(Collectors.toList()); | ||||
|         deptIds.add(deptId); | ||||
|         biRankingReqVO.setUserIds(adminUserApi.getUserListByDeptIds(deptIds).stream().map(AdminUserRespDTO::getId).collect(Collectors.toList())); | ||||
|     } | ||||
| } | ||||
| @@ -28,6 +28,7 @@ import com.mzt.logapi.context.LogRecordContext; | ||||
| import com.mzt.logapi.service.impl.DiffParseFunction; | ||||
| import com.mzt.logapi.starter.annotation.LogRecord; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.springframework.transaction.annotation.Transactional; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| @@ -56,6 +57,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { | ||||
|     @Resource | ||||
|     private CrmBusinessProductService businessProductService; | ||||
|     @Resource | ||||
|     @Lazy | ||||
|     private CrmContractService contractService; | ||||
|     @Resource | ||||
|     private CrmPermissionService permissionService; | ||||
|   | ||||
| @@ -25,6 +25,7 @@ import com.mzt.logapi.context.LogRecordContext; | ||||
| import com.mzt.logapi.service.impl.DiffParseFunction; | ||||
| import com.mzt.logapi.starter.annotation.LogRecord; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.springframework.transaction.annotation.Transactional; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| @@ -56,6 +57,7 @@ public class CrmContactServiceImpl implements CrmContactService { | ||||
|     @Resource | ||||
|     private CrmPermissionService permissionService; | ||||
|     @Resource | ||||
|     @Lazy | ||||
|     private CrmContractService contractService; | ||||
|     @Resource | ||||
|     private CrmContactBusinessService contactBusinessService; | ||||
|   | ||||
| @@ -24,6 +24,7 @@ import com.mzt.logapi.context.LogRecordContext; | ||||
| import com.mzt.logapi.service.impl.DiffParseFunction; | ||||
| import com.mzt.logapi.starter.annotation.LogRecord; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| @@ -49,6 +50,7 @@ public class CrmReceivablePlanServiceImpl implements CrmReceivablePlanService { | ||||
|     private CrmReceivablePlanMapper receivablePlanMapper; | ||||
|  | ||||
|     @Resource | ||||
|     @Lazy | ||||
|     private CrmContractService contractService; | ||||
|     @Resource | ||||
|     private CrmCustomerService customerService; | ||||
|   | ||||
| @@ -27,6 +27,7 @@ import com.mzt.logapi.context.LogRecordContext; | ||||
| import com.mzt.logapi.service.impl.DiffParseFunction; | ||||
| import com.mzt.logapi.starter.annotation.LogRecord; | ||||
| import jakarta.annotation.Resource; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| @@ -50,6 +51,7 @@ public class CrmReceivableServiceImpl implements CrmReceivableService { | ||||
|     private CrmReceivableMapper receivableMapper; | ||||
|  | ||||
|     @Resource | ||||
|     @Lazy | ||||
|     private CrmContractService contractService; | ||||
|     @Resource | ||||
|     private CrmCustomerService customerService; | ||||
|   | ||||
| @@ -0,0 +1,35 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!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.bi.BiRankingMapper"> | ||||
|  | ||||
|  | ||||
|     <select id="contractRanKing" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO"> | ||||
|         SELECT IFNULL(SUM(t.price), 0) AS price, t.owner_user_id | ||||
|         FROM crm_contract t | ||||
|         WHERE t.deleted = 0 | ||||
|         AND t.audit_status = 20 | ||||
|         and t.owner_user_id in | ||||
|         <foreach collection="userIds" item="item" open="(" close=")" separator=","> | ||||
|             #{item} | ||||
|         </foreach> | ||||
|         AND t.order_date between #{startTime} and #{endTime} | ||||
|         GROUP BY t.owner_user_id | ||||
|         ORDER BY price DESC | ||||
|     </select> | ||||
|  | ||||
|     <select id="receivablesRanKing" | ||||
|             resultType="cn.iocoder.yudao.module.crm.controller.admin.bi.vo.BiRanKingRespVO"> | ||||
|         SELECT IFNULL(SUM(t.price), 0) AS price, t.owner_user_id | ||||
|         FROM crm_receivable t | ||||
|         WHERE t.deleted = 0 | ||||
|         AND t.audit_status = 20 | ||||
|         and t.owner_user_id in | ||||
|         <foreach collection="userIds" item="item" open="(" close=")" separator=","> | ||||
|             #{item} | ||||
|         </foreach> | ||||
|         AND t.return_time between #{startTime} and #{endTime} | ||||
|         GROUP BY t.owner_user_id | ||||
|         ORDER BY price DESC | ||||
|     </select> | ||||
| </mapper> | ||||
		Reference in New Issue
	
	Block a user
	 芋道源码
					芋道源码