Ver Fonte

crm: 增加基于客户查询商机分页

YunaiV há 1 ano atrás
pai
commit
db03b10d24

+ 31 - 4
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.crm.controller.admin.business;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
@@ -8,6 +9,7 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*;
 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusQueryVO;
 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeQueryVO;
+import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
 import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
@@ -109,7 +111,32 @@ public class CrmBusinessController {
         List<CrmBusinessStatusTypeDO> statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO);
         // 处理商机状态名称回显
         Set<Long> statusIds = pageResult.getList().stream()
+                .map(CrmBusinessDO::getStatusId).filter(Objects::nonNull).collect(Collectors.toSet());
+        CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO();
+        queryVO.setIdList(statusIds);
+        List<CrmBusinessStatusDO> statusList = businessStatusService.selectList(queryVO);
+        return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult, customerList, statusTypeList, statusList));
+    }
+
+    @GetMapping("/page-by-customer")
+    @Operation(summary = "获得商机分页,基于指定客户")
+    public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPageByCustomer(@Valid CrmContractPageReqVO pageReqVO) {
+        Assert.notNull(pageReqVO.getCustomerId(), "客户编号不能为空");
+        PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPageByCustomer(pageReqVO);
+        // 处理客户名称回显
+        // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈;
+        Set<Long> customerIds = pageResult.getList().stream()
                 .map(CrmBusinessDO::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet());
+        List<CrmCustomerDO> customerList = customerService.getCustomerList(customerIds);
+        // 处理商机状态类型名称回显
+        Set<Long> statusTypeIds = pageResult.getList().stream()
+                .map(CrmBusinessDO::getStatusTypeId).filter(Objects::nonNull).collect(Collectors.toSet());
+        CrmBusinessStatusTypeQueryVO queryStatusTypeVO = new CrmBusinessStatusTypeQueryVO();
+        queryStatusTypeVO.setIdList(statusTypeIds);
+        List<CrmBusinessStatusTypeDO> statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO);
+        // 处理商机状态名称回显
+        Set<Long> statusIds = pageResult.getList().stream()
+                .map(CrmBusinessDO::getStatusId).filter(Objects::nonNull).collect(Collectors.toSet());
         CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO();
         queryVO.setIdList(statusIds);
         List<CrmBusinessStatusDO> statusList = businessStatusService.selectList(queryVO);
@@ -128,12 +155,12 @@ public class CrmBusinessController {
     @Operation(summary = "导出商机 Excel")
     @PreAuthorize("@ss.hasPermission('crm:business:export')")
     @OperateLog(type = EXPORT)
-    public void exportBusinessExcel(@Valid CrmBusinessExportReqVO exportReqVO,
+    public void exportBusinessExcel(@Valid CrmBusinessPageReqVO exportReqVO,
                                     HttpServletResponse response) throws IOException {
-        List<CrmBusinessDO> list = businessService.getBusinessList(exportReqVO);
+        PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(exportReqVO, getLoginUserId());
         // 导出 Excel
-        List<CrmBusinessExcelVO> datas = CrmBusinessConvert.INSTANCE.convertList02(list);
-        ExcelUtils.write(response, "商机.xls", "数据", CrmBusinessExcelVO.class, datas);
+        ExcelUtils.write(response, "商机.xls", "数据", CrmBusinessExcelVO.class,
+                CrmBusinessConvert.INSTANCE.convertList02(pageResult.getList()));
     }
 
     @PutMapping("/transfer")

+ 0 - 74
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExportReqVO.java

@@ -1,74 +0,0 @@
-package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - 商机 Excel 导出 Request VO,参数和 CrmBusinessPageReqVO 是一致的")
-@Data
-public class CrmBusinessExportReqVO {
-
-    @Schema(description = "商机名称", example = "李四")
-    private String name;
-
-    @Schema(description = "商机状态类型编号", example = "25714")
-    private Long statusTypeId;
-
-    @Schema(description = "商机状态编号", example = "30320")
-    private Long statusId;
-
-    @Schema(description = "下次联系时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDateTime[] contactNextTime;
-
-    @Schema(description = "客户编号", example = "10299")
-    private Long customerId;
-
-    @Schema(description = "预计成交日期")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDateTime[] dealTime;
-
-    @Schema(description = "商机金额", example = "12371")
-    private BigDecimal price;
-
-    @Schema(description = "整单折扣")
-    private BigDecimal discountPercent;
-
-    @Schema(description = "产品总金额", example = "12025")
-    private BigDecimal productPrice;
-
-    @Schema(description = "备注", example = "随便")
-    private String remark;
-
-    @Schema(description = "负责人的用户编号", example = "25562")
-    private Long ownerUserId;
-
-    @Schema(description = "创建时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDateTime[] createTime;
-
-    @Schema(description = "只读权限的用户编号数组")
-    private String roUserIds;
-
-    @Schema(description = "读写权限的用户编号数组")
-    private String rwUserIds;
-
-    @Schema(description = "1赢单2输单3无效", example = "1")
-    private Integer endStatus;
-
-    @Schema(description = "结束时的备注", example = "你说的对")
-    private String endRemark;
-
-    @Schema(description = "最后跟进时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDateTime[] contactLastTime;
-
-    @Schema(description = "跟进状态", example = "1")
-    private Integer followUpStatus;
-
-}

+ 3 - 0
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java

@@ -15,4 +15,7 @@ public class CrmBusinessPageReqVO extends PageParam {
     @Schema(description = "商机名称", example = "李四")
     private String name;
 
+    @Schema(description = "客户编号", example = "10795")
+    private Long customerId;
+
 }

+ 0 - 1
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBaseVO.java

@@ -93,7 +93,6 @@ public class CrmContactBaseVO {
     @ExcelProperty(value = "最后跟进时间",order = 6)
     private LocalDateTime lastTime;
 
-
     @Schema(description = "负责人用户编号", example = "14334")
     @NotNull(message = "负责人不能为空")
     private Long ownerUserId;

+ 4 - 18
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java

@@ -3,13 +3,12 @@ package cn.iocoder.yudao.module.crm.dal.mysql.business;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessExportReqVO;
 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO;
+import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.Collection;
-import java.util.List;
 
 /**
  * 商机 Mapper
@@ -26,23 +25,10 @@ public interface CrmBusinessMapper extends BaseMapperX<CrmBusinessDO> {
                 .orderByDesc(CrmBusinessDO::getId));
     }
 
-    default List<CrmBusinessDO> selectList(CrmBusinessExportReqVO reqVO) {
-        return selectList(new LambdaQueryWrapperX<CrmBusinessDO>()
+    default PageResult<CrmBusinessDO> selectPageByCustomer(CrmContractPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<CrmBusinessDO>()
+                .eq(CrmBusinessDO::getCustomerId, reqVO.getCustomerId()) // 必须传递
                 .likeIfPresent(CrmBusinessDO::getName, reqVO.getName())
-                .eqIfPresent(CrmBusinessDO::getStatusTypeId, reqVO.getStatusTypeId())
-                .eqIfPresent(CrmBusinessDO::getStatusId, reqVO.getStatusId())
-                .betweenIfPresent(CrmBusinessDO::getContactNextTime, reqVO.getContactNextTime())
-                .eqIfPresent(CrmBusinessDO::getCustomerId, reqVO.getCustomerId())
-                .betweenIfPresent(CrmBusinessDO::getDealTime, reqVO.getDealTime())
-                .eqIfPresent(CrmBusinessDO::getPrice, reqVO.getPrice())
-                .eqIfPresent(CrmBusinessDO::getDiscountPercent, reqVO.getDiscountPercent())
-                .eqIfPresent(CrmBusinessDO::getProductPrice, reqVO.getProductPrice())
-                .eqIfPresent(CrmBusinessDO::getRemark, reqVO.getRemark())
-                .betweenIfPresent(CrmBusinessDO::getCreateTime, reqVO.getCreateTime())
-                .eqIfPresent(CrmBusinessDO::getEndStatus, reqVO.getEndStatus())
-                .eqIfPresent(CrmBusinessDO::getEndRemark, reqVO.getEndRemark())
-                .betweenIfPresent(CrmBusinessDO::getContactLastTime, reqVO.getContactLastTime())
-                .eqIfPresent(CrmBusinessDO::getFollowUpStatus, reqVO.getFollowUpStatus())
                 .orderByDesc(CrmBusinessDO::getId));
     }
 

+ 14 - 5
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java

@@ -1,8 +1,13 @@
 package cn.iocoder.yudao.module.crm.service.business;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*;
+import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessCreateReqVO;
+import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO;
+import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessTransferReqVO;
+import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessUpdateReqVO;
+import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
+import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
 
 import javax.validation.Valid;
 import java.util.Collection;
@@ -57,6 +62,8 @@ public interface CrmBusinessService {
     /**
      * 获得商机分页
      *
+     * 数据权限:基于 {@link CrmBusinessDO}
+     *
      * @param pageReqVO 分页查询
      * @param userId    用户编号
      * @return 商机分页
@@ -64,12 +71,14 @@ public interface CrmBusinessService {
     PageResult<CrmBusinessDO> getBusinessPage(CrmBusinessPageReqVO pageReqVO, Long userId);
 
     /**
-     * 获得商机列表, 用于 Excel 导出
+     * 获得商机分页,基于指定客户
      *
-     * @param exportReqVO 查询条件
-     * @return 商机列表
+     * 数据权限:基于 {@link CrmCustomerDO} 读取
+     *
+     * @param pageReqVO 分页查询
+     * @return 联系人分页
      */
-    List<CrmBusinessDO> getBusinessList(CrmBusinessExportReqVO exportReqVO);
+    PageResult<CrmBusinessDO> getBusinessPageByCustomer(CrmContractPageReqVO pageReqVO);
 
     /**
      * 商机转移

+ 4 - 2
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*;
+import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
 import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
@@ -116,8 +117,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
     }
 
     @Override
-    public List<CrmBusinessDO> getBusinessList(CrmBusinessExportReqVO exportReqVO) {
-        return businessMapper.selectList(exportReqVO);
+    @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageReqVO.customerId", level = CrmPermissionLevelEnum.READ)
+    public PageResult<CrmBusinessDO> getBusinessPageByCustomer(CrmContractPageReqVO pageReqVO) {
+        return businessMapper.selectPageByCustomer(pageReqVO);
     }
 
     @Override

+ 2 - 2
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java

@@ -72,10 +72,10 @@ public interface CrmContactService {
      *
      * 数据权限:基于 {@link CrmCustomerDO} 读取
      *
-     * @param pageVO 分页查询
+     * @param pageReqVO 分页查询
      * @return 联系人分页
      */
-    PageResult<CrmContactDO> getContactPageByCustomer(CrmContactPageReqVO pageVO);
+    PageResult<CrmContactDO> getContactPageByCustomer(CrmContactPageReqVO pageReqVO);
 
     /**
      * 获取所有联系人列表