Commit 490418a1fc21a7806a6c081640d071ffda53eef0

Authored by puhui999
1 parent 9ea06073

CRM-线索:完善数据权限,新增权限关联、场景分页查询,新增权限关联批量查询

Showing 18 changed files with 262 additions and 218 deletions
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/CrmClueController.java
@@ -11,18 +11,20 @@ import cn.iocoder.yudao.module.crm.service.clue.CrmClueService; @@ -11,18 +11,20 @@ import cn.iocoder.yudao.module.crm.service.clue.CrmClueService;
11 import io.swagger.v3.oas.annotations.Operation; 11 import io.swagger.v3.oas.annotations.Operation;
12 import io.swagger.v3.oas.annotations.Parameter; 12 import io.swagger.v3.oas.annotations.Parameter;
13 import io.swagger.v3.oas.annotations.tags.Tag; 13 import io.swagger.v3.oas.annotations.tags.Tag;
  14 +import jakarta.annotation.Resource;
  15 +import jakarta.servlet.http.HttpServletResponse;
  16 +import jakarta.validation.Valid;
14 import org.springframework.security.access.prepost.PreAuthorize; 17 import org.springframework.security.access.prepost.PreAuthorize;
15 import org.springframework.validation.annotation.Validated; 18 import org.springframework.validation.annotation.Validated;
16 import org.springframework.web.bind.annotation.*; 19 import org.springframework.web.bind.annotation.*;
17 20
18 -import jakarta.annotation.Resource;  
19 -import jakarta.servlet.http.HttpServletResponse;  
20 -import jakarta.validation.Valid;  
21 import java.io.IOException; 21 import java.io.IOException;
22 import java.util.List; 22 import java.util.List;
23 23
24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  25 +import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE;
25 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; 26 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
  27 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
26 28
27 @Tag(name = "管理后台 - 线索") 29 @Tag(name = "管理后台 - 线索")
28 @RestController 30 @RestController
@@ -70,7 +72,7 @@ public class CrmClueController { @@ -70,7 +72,7 @@ public class CrmClueController {
70 @Operation(summary = "获得线索分页") 72 @Operation(summary = "获得线索分页")
71 @PreAuthorize("@ss.hasPermission('crm:clue:query')") 73 @PreAuthorize("@ss.hasPermission('crm:clue:query')")
72 public CommonResult<PageResult<CrmClueRespVO>> getCluePage(@Valid CrmCluePageReqVO pageVO) { 74 public CommonResult<PageResult<CrmClueRespVO>> getCluePage(@Valid CrmCluePageReqVO pageVO) {
73 - PageResult<CrmClueDO> pageResult = clueService.getCluePage(pageVO); 75 + PageResult<CrmClueDO> pageResult = clueService.getCluePage(pageVO, getLoginUserId());
74 return success(CrmClueConvert.INSTANCE.convertPage(pageResult)); 76 return success(CrmClueConvert.INSTANCE.convertPage(pageResult));
75 } 77 }
76 78
@@ -78,9 +80,9 @@ public class CrmClueController { @@ -78,9 +80,9 @@ public class CrmClueController {
78 @Operation(summary = "导出线索 Excel") 80 @Operation(summary = "导出线索 Excel")
79 @PreAuthorize("@ss.hasPermission('crm:clue:export')") 81 @PreAuthorize("@ss.hasPermission('crm:clue:export')")
80 @OperateLog(type = EXPORT) 82 @OperateLog(type = EXPORT)
81 - public void exportClueExcel(@Valid CrmClueExportReqVO exportReqVO,  
82 - HttpServletResponse response) throws IOException {  
83 - List<CrmClueDO> list = clueService.getClueList(exportReqVO); 83 + public void exportClueExcel(@Valid CrmCluePageReqVO pageReqVO, HttpServletResponse response) throws IOException {
  84 + pageReqVO.setPageSize(PAGE_SIZE_NONE);
  85 + List<CrmClueDO> list = clueService.getCluePage(pageReqVO, getLoginUserId()).getList();
84 // 导出 Excel 86 // 导出 Excel
85 List<CrmClueExcelVO> datas = CrmClueConvert.INSTANCE.convertList02(list); 87 List<CrmClueExcelVO> datas = CrmClueConvert.INSTANCE.convertList02(list);
86 ExcelUtils.write(response, "线索.xls", "数据", CrmClueExcelVO.class, datas); 88 ExcelUtils.write(response, "线索.xls", "数据", CrmClueExcelVO.class, datas);
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmClueExportReqVO.java deleted
1 -package cn.iocoder.yudao.module.crm.controller.admin.clue.vo;  
2 -  
3 -import lombok.*;  
4 -import java.util.*;  
5 -import io.swagger.v3.oas.annotations.media.Schema;  
6 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
7 -import java.time.LocalDateTime;  
8 -import org.springframework.format.annotation.DateTimeFormat;  
9 -  
10 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;  
11 -  
12 -@Schema(description = "管理后台 - 线索 Excel 导出 Request VO,参数和 CrmCluePageReqVO 是一致的")  
13 -@Data  
14 -public class CrmClueExportReqVO {  
15 -  
16 - @Schema(description = "转化状态", example = "true")  
17 - private Boolean transformStatus;  
18 -  
19 - @Schema(description = "跟进状态", example = "true")  
20 - private Boolean followUpStatus;  
21 -  
22 - @Schema(description = "线索名称", example = "线索xxx")  
23 - private String name;  
24 -  
25 - @Schema(description = "客户id", example = "520")  
26 - private Long customerId;  
27 -  
28 - @Schema(description = "下次联系时间", example = "2023-10-18 01:00:00")  
29 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
30 - private LocalDateTime[] contactNextTime;  
31 -  
32 - @Schema(description = "电话", example = "18000000000")  
33 - private String telephone;  
34 -  
35 - @Schema(description = "手机号", example = "18000000000")  
36 - private String mobile;  
37 -  
38 - @Schema(description = "地址", example = "北京市海淀区")  
39 - private String address;  
40 -  
41 - @Schema(description = "负责人的用户编号", example = "27199")  
42 - private Long ownerUserId;  
43 -  
44 - @Schema(description = "最后跟进时间")  
45 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
46 - private LocalDateTime[] contactLastTime;  
47 -  
48 - @Schema(description = "创建时间")  
49 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
50 - private LocalDateTime[] createTime;  
51 -  
52 -}  
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmCluePageReqVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.clue.vo; 1 package cn.iocoder.yudao.module.crm.controller.admin.clue.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
4 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 7 import lombok.Data;
6 import lombok.EqualsAndHashCode; 8 import lombok.EqualsAndHashCode;
@@ -21,4 +23,14 @@ public class CrmCluePageReqVO extends PageParam { @@ -21,4 +23,14 @@ public class CrmCluePageReqVO extends PageParam {
21 @Schema(description = "手机号", example = "18000000000") 23 @Schema(description = "手机号", example = "18000000000")
22 private String mobile; 24 private String mobile;
23 25
  26 + /**
  27 + * 场景类型,为 null 时则表示全部
  28 + */
  29 + @Schema(description = "场景类型", example = "1")
  30 + @InEnum(CrmSceneTypeEnum.class)
  31 + private Integer sceneType;
  32 +
  33 + @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
  34 + private Boolean pool; // null 则表示为不是公海数据
  35 +
24 } 36 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactPageReqVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo; 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
4 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 7 import lombok.Data;
6 import lombok.EqualsAndHashCode; 8 import lombok.EqualsAndHashCode;
@@ -33,4 +35,14 @@ public class CrmContactPageReqVO extends PageParam { @@ -33,4 +35,14 @@ public class CrmContactPageReqVO extends PageParam {
33 @Schema(description = "微信", example = "zzZ98373") 35 @Schema(description = "微信", example = "zzZ98373")
34 private String wechat; 36 private String wechat;
35 37
  38 + /**
  39 + * 场景类型,为 null 时则表示全部
  40 + */
  41 + @Schema(description = "场景类型", example = "1")
  42 + @InEnum(CrmSceneTypeEnum.class)
  43 + private Integer sceneType;
  44 +
  45 + @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
  46 + private Boolean pool; // null 则表示为不是公海数据
  47 +
36 } 48 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractPageReqVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.contract.vo; 1 package cn.iocoder.yudao.module.crm.controller.admin.contract.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
4 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 7 import lombok.Data;
6 import lombok.EqualsAndHashCode; 8 import lombok.EqualsAndHashCode;
@@ -24,4 +26,14 @@ public class CrmContractPageReqVO extends PageParam { @@ -24,4 +26,14 @@ public class CrmContractPageReqVO extends PageParam {
24 @Schema(description = "商机编号", example = "10864") 26 @Schema(description = "商机编号", example = "10864")
25 private Long businessId; 27 private Long businessId;
26 28
  29 + /**
  30 + * 场景类型,为 null 时则表示全部
  31 + */
  32 + @Schema(description = "场景类型", example = "1")
  33 + @InEnum(CrmSceneTypeEnum.class)
  34 + private Integer sceneType;
  35 +
  36 + @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
  37 + private Boolean pool; // null 则表示为不是公海数据
  38 +
27 } 39 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanPageReqVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan; 1 package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
4 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 7 import lombok.Data;
6 import lombok.EqualsAndHashCode; 8 import lombok.EqualsAndHashCode;
@@ -19,4 +21,14 @@ public class CrmReceivablePlanPageReqVO extends PageParam { @@ -19,4 +21,14 @@ public class CrmReceivablePlanPageReqVO extends PageParam {
19 @Schema(description = "合同名称", example = "3473") 21 @Schema(description = "合同名称", example = "3473")
20 private Long contractId; 22 private Long contractId;
21 23
  24 + /**
  25 + * 场景类型,为 null 时则表示全部
  26 + */
  27 + @Schema(description = "场景类型", example = "1")
  28 + @InEnum(CrmSceneTypeEnum.class)
  29 + private Integer sceneType;
  30 +
  31 + @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
  32 + private Boolean pool; // null 则表示为不是公海数据
  33 +
22 } 34 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivablePageReqVO.java
1 package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable; 1 package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
4 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 7 import lombok.Data;
6 import lombok.EqualsAndHashCode; 8 import lombok.EqualsAndHashCode;
@@ -21,4 +23,14 @@ public class CrmReceivablePageReqVO extends PageParam { @@ -21,4 +23,14 @@ public class CrmReceivablePageReqVO extends PageParam {
21 @Schema(description = "客户编号", example = "4963") 23 @Schema(description = "客户编号", example = "4963")
22 private Long customerId; 24 private Long customerId;
23 25
  26 + /**
  27 + * 场景类型,为 null 时则表示全部
  28 + */
  29 + @Schema(description = "场景类型", example = "1")
  30 + @InEnum(CrmSceneTypeEnum.class)
  31 + private Integer sceneType;
  32 +
  33 + @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
  34 + private Boolean pool; // null 则表示为不是公海数据
  35 +
24 } 36 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/clue/CrmClueDO.java
@@ -73,6 +73,13 @@ public class CrmClueDO extends BaseDO { @@ -73,6 +73,13 @@ public class CrmClueDO extends BaseDO {
73 */ 73 */
74 private String remark; 74 private String remark;
75 75
  76 + /**
  77 + * 负责人的用户编号
  78 + *
  79 + * 关联 AdminUserDO 的 id 字段
  80 + */
  81 + private Long ownerUserId;
  82 +
76 // TODO 芋艿:客户级别; 83 // TODO 芋艿:客户级别;
77 // TODO 芋艿:线索来源; 84 // TODO 芋艿:线索来源;
78 // TODO 芋艿:客户行业; 85 // TODO 芋艿:客户行业;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/CrmClueMapper.java
@@ -2,12 +2,15 @@ package cn.iocoder.yudao.module.crm.dal.mysql.clue; @@ -2,12 +2,15 @@ package cn.iocoder.yudao.module.crm.dal.mysql.clue;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;  
6 -import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueExportReqVO; 5 +import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
7 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO; 6 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO;
8 import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; 7 import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;
  8 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  9 +import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
  10 +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
9 import org.apache.ibatis.annotations.Mapper; 11 import org.apache.ibatis.annotations.Mapper;
10 12
  13 +import java.util.Collection;
11 import java.util.List; 14 import java.util.List;
12 15
13 /** 16 /**
@@ -18,27 +21,30 @@ import java.util.List; @@ -18,27 +21,30 @@ import java.util.List;
18 @Mapper 21 @Mapper
19 public interface CrmClueMapper extends BaseMapperX<CrmClueDO> { 22 public interface CrmClueMapper extends BaseMapperX<CrmClueDO> {
20 23
21 - default PageResult<CrmClueDO> selectPage(CrmCluePageReqVO reqVO) {  
22 - return selectPage(reqVO, new LambdaQueryWrapperX<CrmClueDO>()  
23 - .likeIfPresent(CrmClueDO::getName, reqVO.getName())  
24 - .likeIfPresent(CrmClueDO::getTelephone, reqVO.getTelephone())  
25 - .likeIfPresent(CrmClueDO::getMobile, reqVO.getMobile())  
26 - .orderByDesc(CrmClueDO::getId)); 24 + default int updateOwnerUserIdById(Long id, Long ownerUserId) {
  25 + return update(new LambdaUpdateWrapper<CrmClueDO>()
  26 + .eq(CrmClueDO::getId, id)
  27 + .set(CrmClueDO::getOwnerUserId, ownerUserId));
27 } 28 }
28 29
29 - default List<CrmClueDO> selectList(CrmClueExportReqVO reqVO) {  
30 - return selectList(new LambdaQueryWrapperX<CrmClueDO>()  
31 - .eqIfPresent(CrmClueDO::getTransformStatus, reqVO.getTransformStatus())  
32 - .eqIfPresent(CrmClueDO::getFollowUpStatus, reqVO.getFollowUpStatus())  
33 - .likeIfPresent(CrmClueDO::getName, reqVO.getName())  
34 - .eqIfPresent(CrmClueDO::getCustomerId, reqVO.getCustomerId())  
35 - .betweenIfPresent(CrmClueDO::getContactNextTime, reqVO.getContactNextTime())  
36 - .likeIfPresent(CrmClueDO::getTelephone, reqVO.getTelephone())  
37 - .likeIfPresent(CrmClueDO::getMobile, reqVO.getMobile())  
38 - .likeIfPresent(CrmClueDO::getAddress, reqVO.getAddress())  
39 - .betweenIfPresent(CrmClueDO::getContactLastTime, reqVO.getContactLastTime())  
40 - .betweenIfPresent(CrmClueDO::getCreateTime, reqVO.getCreateTime())  
41 - .orderByDesc(CrmClueDO::getId)); 30 + default PageResult<CrmClueDO> selectPage(CrmCluePageReqVO pageReqVO, Long userId) {
  31 + MPJLambdaWrapperX<CrmClueDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
  32 + // 构建数据权限连表条件
  33 + CrmQueryWrapperUtils.builderPageQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_LEADS.getType(), CrmClueDO::getId,
  34 + userId, pageReqVO.getSceneType(), pageReqVO.getPool());
  35 + mpjLambdaWrapperX.selectAll(CrmClueDO.class)
  36 + .likeIfPresent(CrmClueDO::getName, pageReqVO.getName())
  37 + .likeIfPresent(CrmClueDO::getTelephone, pageReqVO.getTelephone())
  38 + .likeIfPresent(CrmClueDO::getMobile, pageReqVO.getMobile())
  39 + .orderByDesc(CrmClueDO::getId);
  40 + return selectJoinPage(pageReqVO, CrmClueDO.class, mpjLambdaWrapperX);
  41 + }
  42 +
  43 + default List<CrmClueDO> selectBatchIds(Collection<Long> ids, Long userId) {
  44 + MPJLambdaWrapperX<CrmClueDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
  45 + // 构建数据权限连表条件
  46 + CrmQueryWrapperUtils.builderListQueryBatch(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_LEADS.getType(), ids, userId);
  47 + return selectJoinList(CrmClueDO.class, mpjLambdaWrapperX);
42 } 48 }
43 49
44 } 50 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/annotations/CrmPermission.java
@@ -35,9 +35,8 @@ public @interface CrmPermission { @@ -35,9 +35,8 @@ public @interface CrmPermission {
35 35
36 /** 36 /**
37 * 数据编号,通过 Spring EL 表达式获取 37 * 数据编号,通过 Spring EL 表达式获取
38 - * TODO 数据权限完成后去除 default ""  
39 */ 38 */
40 - String bizId() default ""; 39 + String bizId();
41 40
42 /** 41 /**
43 * 操作所需权限级别 42 * 操作所需权限级别
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
@@ -71,12 +71,14 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { @@ -71,12 +71,14 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
71 71
72 @Override 72 @Override
73 @Transactional(rollbackFor = Exception.class) 73 @Transactional(rollbackFor = Exception.class)
74 - @CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, level = CrmPermissionLevelEnum.OWNER) 74 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
75 public void deleteBusiness(Long id) { 75 public void deleteBusiness(Long id) {
76 // 校验存在 76 // 校验存在
77 validateBusinessExists(id); 77 validateBusinessExists(id);
78 // 删除 78 // 删除
79 businessMapper.deleteById(id); 79 businessMapper.deleteById(id);
  80 + // 删除数据权限
  81 + crmPermissionService.deletePermission(CrmBizTypeEnum.CRM_BUSINESS.getType(), id);
80 } 82 }
81 83
82 private CrmBusinessDO validateBusinessExists(Long id) { 84 private CrmBusinessDO validateBusinessExists(Long id) {
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueService.java
1 package cn.iocoder.yudao.module.crm.service.clue; 1 package cn.iocoder.yudao.module.crm.service.clue;
2 2
3 -import java.util.*;  
4 -import jakarta.validation.*;  
5 -import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.*;  
6 -import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;  
7 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueCreateReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueUpdateReqVO;
  7 +import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;
  8 +import jakarta.validation.Valid;
  9 +
  10 +import java.util.Collection;
  11 +import java.util.List;
8 12
9 /** 13 /**
10 * 线索 Service 接口 14 * 线索 Service 接口
@@ -49,22 +53,15 @@ public interface CrmClueService { @@ -49,22 +53,15 @@ public interface CrmClueService {
49 * @param ids 编号 53 * @param ids 编号
50 * @return 线索列表 54 * @return 线索列表
51 */ 55 */
52 - List<CrmClueDO> getClueList(Collection<Long> ids); 56 + List<CrmClueDO> getClueList(Collection<Long> ids, Long userId);
53 57
54 /** 58 /**
55 * 获得线索分页 59 * 获得线索分页
56 * 60 *
57 * @param pageReqVO 分页查询 61 * @param pageReqVO 分页查询
  62 + * @param userId 用户编号
58 * @return 线索分页 63 * @return 线索分页
59 */ 64 */
60 - PageResult<CrmClueDO> getCluePage(CrmCluePageReqVO pageReqVO);  
61 -  
62 - /**  
63 - * 获得线索列表, 用于 Excel 导出  
64 - *  
65 - * @param exportReqVO 查询条件  
66 - * @return 线索列表  
67 - */  
68 - List<CrmClueDO> getClueList(CrmClueExportReqVO exportReqVO); 65 + PageResult<CrmClueDO> getCluePage(CrmCluePageReqVO pageReqVO, Long userId);
69 66
70 } 67 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueServiceImpl.java
@@ -4,23 +4,25 @@ import cn.hutool.core.collection.CollUtil; @@ -4,23 +4,25 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueCreateReqVO; 6 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueCreateReqVO;
7 -import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueExportReqVO;  
8 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO; 7 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO;
9 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueUpdateReqVO; 8 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueUpdateReqVO;
10 import cn.iocoder.yudao.module.crm.convert.clue.CrmClueConvert; 9 import cn.iocoder.yudao.module.crm.convert.clue.CrmClueConvert;
11 import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; 10 import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;
12 import cn.iocoder.yudao.module.crm.dal.mysql.clue.CrmClueMapper; 11 import cn.iocoder.yudao.module.crm.dal.mysql.clue.CrmClueMapper;
  12 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  13 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
  14 +import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
13 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; 15 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
  16 +import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
  17 +import jakarta.annotation.Resource;
14 import org.springframework.stereotype.Service; 18 import org.springframework.stereotype.Service;
15 import org.springframework.validation.annotation.Validated; 19 import org.springframework.validation.annotation.Validated;
16 20
17 -import jakarta.annotation.Resource;  
18 import java.util.Collection; 21 import java.util.Collection;
19 import java.util.List; 22 import java.util.List;
20 23
21 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 24 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
22 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CLUE_NOT_EXISTS; 25 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CLUE_NOT_EXISTS;
23 -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CUSTOMER_NOT_EXISTS;  
24 26
25 /** 27 /**
26 * 线索 Service 实现类 28 * 线索 Service 实现类
@@ -35,6 +37,8 @@ public class CrmClueServiceImpl implements CrmClueService { @@ -35,6 +37,8 @@ public class CrmClueServiceImpl implements CrmClueService {
35 private CrmClueMapper clueMapper; 37 private CrmClueMapper clueMapper;
36 @Resource 38 @Resource
37 private CrmCustomerService customerService; 39 private CrmCustomerService customerService;
  40 + @Resource
  41 + private CrmPermissionService crmPermissionService;
38 42
39 @Override 43 @Override
40 public Long createClue(CrmClueCreateReqVO createReqVO) { 44 public Long createClue(CrmClueCreateReqVO createReqVO) {
@@ -48,6 +52,7 @@ public class CrmClueServiceImpl implements CrmClueService { @@ -48,6 +52,7 @@ public class CrmClueServiceImpl implements CrmClueService {
48 } 52 }
49 53
50 @Override 54 @Override
  55 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_LEADS, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE)
51 public void updateClue(CrmClueUpdateReqVO updateReqVO) { 56 public void updateClue(CrmClueUpdateReqVO updateReqVO) {
52 // 校验存在 57 // 校验存在
53 validateClueExists(updateReqVO.getId()); 58 validateClueExists(updateReqVO.getId());
@@ -60,11 +65,14 @@ public class CrmClueServiceImpl implements CrmClueService { @@ -60,11 +65,14 @@ public class CrmClueServiceImpl implements CrmClueService {
60 } 65 }
61 66
62 @Override 67 @Override
  68 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_LEADS, bizId = "#id", level = CrmPermissionLevelEnum.OWNER)
63 public void deleteClue(Long id) { 69 public void deleteClue(Long id) {
64 // 校验存在 70 // 校验存在
65 validateClueExists(id); 71 validateClueExists(id);
66 // 删除 72 // 删除
67 clueMapper.deleteById(id); 73 clueMapper.deleteById(id);
  74 + // 删除数据权限
  75 + crmPermissionService.deletePermission(CrmBizTypeEnum.CRM_LEADS.getType(), id);
68 } 76 }
69 77
70 private void validateClueExists(Long id) { 78 private void validateClueExists(Long id) {
@@ -74,26 +82,22 @@ public class CrmClueServiceImpl implements CrmClueService { @@ -74,26 +82,22 @@ public class CrmClueServiceImpl implements CrmClueService {
74 } 82 }
75 83
76 @Override 84 @Override
  85 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_LEADS, bizId = "#id", level = CrmPermissionLevelEnum.READ)
77 public CrmClueDO getClue(Long id) { 86 public CrmClueDO getClue(Long id) {
78 return clueMapper.selectById(id); 87 return clueMapper.selectById(id);
79 } 88 }
80 89
81 @Override 90 @Override
82 - public List<CrmClueDO> getClueList(Collection<Long> ids) { 91 + public List<CrmClueDO> getClueList(Collection<Long> ids, Long userId) {
83 if (CollUtil.isEmpty(ids)) { 92 if (CollUtil.isEmpty(ids)) {
84 return ListUtil.empty(); 93 return ListUtil.empty();
85 } 94 }
86 - return clueMapper.selectBatchIds(ids);  
87 - }  
88 -  
89 - @Override  
90 - public PageResult<CrmClueDO> getCluePage(CrmCluePageReqVO pageReqVO) {  
91 - return clueMapper.selectPage(pageReqVO); 95 + return clueMapper.selectBatchIds(ids, userId);
92 } 96 }
93 97
94 @Override 98 @Override
95 - public List<CrmClueDO> getClueList(CrmClueExportReqVO exportReqVO) {  
96 - return clueMapper.selectList(exportReqVO); 99 + public PageResult<CrmClueDO> getCluePage(CrmCluePageReqVO pageReqVO, Long userId) {
  100 + return clueMapper.selectPage(pageReqVO, userId);
97 } 101 }
98 102
99 } 103 }
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contactbusinesslink/CrmContactBusinessLinkServiceImpl.java
@@ -12,14 +12,18 @@ import cn.iocoder.yudao.module.crm.convert.contactbusinessslink.CrmContactBusine @@ -12,14 +12,18 @@ import cn.iocoder.yudao.module.crm.convert.contactbusinessslink.CrmContactBusine
12 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO; 12 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
13 import cn.iocoder.yudao.module.crm.dal.dataobject.contactbusinesslink.CrmContactBusinessLinkDO; 13 import cn.iocoder.yudao.module.crm.dal.dataobject.contactbusinesslink.CrmContactBusinessLinkDO;
14 import cn.iocoder.yudao.module.crm.dal.mysql.contactbusinesslink.CrmContactBusinessLinkMapper; 14 import cn.iocoder.yudao.module.crm.dal.mysql.contactbusinesslink.CrmContactBusinessLinkMapper;
  15 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  16 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
  17 +import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
15 import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; 18 import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
  19 +import jakarta.annotation.Resource;
16 import org.springframework.stereotype.Service; 20 import org.springframework.stereotype.Service;
17 import org.springframework.validation.annotation.Validated; 21 import org.springframework.validation.annotation.Validated;
18 22
19 -import jakarta.annotation.Resource;  
20 import java.util.List; 23 import java.util.List;
21 24
22 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 25 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  26 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
23 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTACT_BUSINESS_LINK_NOT_EXISTS; 27 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CONTACT_BUSINESS_LINK_NOT_EXISTS;
24 28
25 // TODO @puhui999:数据权限的校验;每个操作; 29 // TODO @puhui999:数据权限的校验;每个操作;
@@ -54,6 +58,7 @@ public class CrmContactBusinessLinkServiceImpl implements CrmContactBusinessLink @@ -54,6 +58,7 @@ public class CrmContactBusinessLinkServiceImpl implements CrmContactBusinessLink
54 } 58 }
55 59
56 @Override 60 @Override
  61 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, bizId = "#updateReqVO.id", level = CrmPermissionLevelEnum.WRITE)
57 public void updateContactBusinessLink(CrmContactBusinessLinkSaveReqVO updateReqVO) { 62 public void updateContactBusinessLink(CrmContactBusinessLinkSaveReqVO updateReqVO) {
58 // 校验存在 63 // 校验存在
59 validateContactBusinessLinkExists(updateReqVO.getId()); 64 validateContactBusinessLinkExists(updateReqVO.getId());
@@ -80,6 +85,7 @@ public class CrmContactBusinessLinkServiceImpl implements CrmContactBusinessLink @@ -80,6 +85,7 @@ public class CrmContactBusinessLinkServiceImpl implements CrmContactBusinessLink
80 } 85 }
81 86
82 @Override 87 @Override
  88 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_BUSINESS, bizId = "#id", level = CrmPermissionLevelEnum.READ)
83 public CrmContactBusinessLinkDO getContactBusinessLink(Long id) { 89 public CrmContactBusinessLinkDO getContactBusinessLink(Long id) {
84 return contactBusinessLinkMapper.selectById(id); 90 return contactBusinessLinkMapper.selectById(id);
85 } 91 }
@@ -90,7 +96,7 @@ public class CrmContactBusinessLinkServiceImpl implements CrmContactBusinessLink @@ -90,7 +96,7 @@ public class CrmContactBusinessLinkServiceImpl implements CrmContactBusinessLink
90 crmContactBusinessLinkPageReqVO.setContactId(pageReqVO.getContactId()); 96 crmContactBusinessLinkPageReqVO.setContactId(pageReqVO.getContactId());
91 PageResult<CrmContactBusinessLinkDO> businessLinkDOS = contactBusinessLinkMapper.selectPageByContact(crmContactBusinessLinkPageReqVO); 97 PageResult<CrmContactBusinessLinkDO> businessLinkDOS = contactBusinessLinkMapper.selectPageByContact(crmContactBusinessLinkPageReqVO);
92 List<CrmBusinessDO> businessDOS = crmBusinessService.getBusinessList(CollectionUtils.convertList(businessLinkDOS.getList(), 98 List<CrmBusinessDO> businessDOS = crmBusinessService.getBusinessList(CollectionUtils.convertList(businessLinkDOS.getList(),
93 - CrmContactBusinessLinkDO::getBusinessId)); 99 + CrmContactBusinessLinkDO::getBusinessId), getLoginUserId());
94 PageResult<CrmBusinessRespVO> pageResult = new PageResult<CrmBusinessRespVO>(); 100 PageResult<CrmBusinessRespVO> pageResult = new PageResult<CrmBusinessRespVO>();
95 pageResult.setList(CrmBusinessConvert.INSTANCE.convert(businessDOS)); 101 pageResult.setList(CrmBusinessConvert.INSTANCE.convert(businessDOS));
96 pageResult.setTotal(businessLinkDOS.getTotal()); 102 pageResult.setTotal(businessLinkDOS.getTotal());
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
@@ -78,6 +78,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @@ -78,6 +78,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
78 78
79 // 删除 79 // 删除
80 customerMapper.deleteById(id); 80 customerMapper.deleteById(id);
  81 + // 删除数据权限
  82 + crmPermissionService.deletePermission(CrmBizTypeEnum.CRM_CUSTOMER.getType(), id);
81 } 83 }
82 84
83 private void validateCustomerExists(Long id) { 85 private void validateCustomerExists(Long id) {
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java
@@ -7,8 +7,8 @@ import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; @@ -7,8 +7,8 @@ import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
7 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; 7 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
8 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; 8 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
9 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; 9 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
10 -  
11 import jakarta.validation.Valid; 10 import jakarta.validation.Valid;
  11 +
12 import java.util.Collection; 12 import java.util.Collection;
13 import java.util.List; 13 import java.util.List;
14 14
@@ -58,9 +58,17 @@ public interface CrmPermissionService { @@ -58,9 +58,17 @@ public interface CrmPermissionService {
58 void deletePermission(Integer bizType, Long bizId, Integer level); 58 void deletePermission(Integer bizType, Long bizId, Integer level);
59 59
60 /** 60 /**
  61 + * 删除数据权限
  62 + *
  63 + * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
  64 + * @param bizId 数据编号,关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
  65 + */
  66 + void deletePermission(Integer bizType, Long bizId);
  67 +
  68 + /**
61 * 批量删除数据权限 69 * 批量删除数据权限
62 * 70 *
63 - * @param ids 权限编号 71 + * @param ids 权限编号
64 * @param userId 用户编号 72 * @param userId 用户编号
65 */ 73 */
66 void deletePermissionBatch(Collection<Long> ids, Long userId); 74 void deletePermissionBatch(Collection<Long> ids, Long userId);
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
@@ -11,11 +11,11 @@ import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; @@ -11,11 +11,11 @@ import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
11 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; 11 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
12 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; 12 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
13 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 13 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  14 +import jakarta.annotation.Resource;
14 import org.springframework.stereotype.Service; 15 import org.springframework.stereotype.Service;
15 import org.springframework.transaction.annotation.Transactional; 16 import org.springframework.transaction.annotation.Transactional;
16 import org.springframework.validation.annotation.Validated; 17 import org.springframework.validation.annotation.Validated;
17 18
18 -import jakarta.annotation.Resource;  
19 import java.util.Collection; 19 import java.util.Collection;
20 import java.util.Collections; 20 import java.util.Collections;
21 import java.util.List; 21 import java.util.List;
@@ -138,6 +138,17 @@ public class CrmPermissionServiceImpl implements CrmPermissionService { @@ -138,6 +138,17 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
138 } 138 }
139 139
140 @Override 140 @Override
  141 + public void deletePermission(Integer bizType, Long bizId) {
  142 + List<CrmPermissionDO> permissionList = crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId);
  143 + if (CollUtil.isEmpty(permissionList)) {
  144 + return;
  145 + }
  146 +
  147 + // 删除数据权限
  148 + crmPermissionMapper.deleteBatchIds(convertSet(permissionList, CrmPermissionDO::getId));
  149 + }
  150 +
  151 + @Override
141 public void deletePermissionBatch(Collection<Long> ids, Long userId) { 152 public void deletePermissionBatch(Collection<Long> ids, Long userId) {
142 List<CrmPermissionDO> permissions = crmPermissionMapper.selectBatchIds(ids); 153 List<CrmPermissionDO> permissions = crmPermissionMapper.selectBatchIds(ids);
143 if (CollUtil.isEmpty(permissions)) { 154 if (CollUtil.isEmpty(permissions)) {
yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueServiceImplTest.java
@@ -3,19 +3,18 @@ package cn.iocoder.yudao.module.crm.service.clue; @@ -3,19 +3,18 @@ package cn.iocoder.yudao.module.crm.service.clue;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; 4 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
5 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueCreateReqVO; 5 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueCreateReqVO;
6 -import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueExportReqVO;  
7 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO; 6 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO;
8 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueUpdateReqVO; 7 import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmClueUpdateReqVO;
9 import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO; 8 import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;
10 import cn.iocoder.yudao.module.crm.dal.mysql.clue.CrmClueMapper; 9 import cn.iocoder.yudao.module.crm.dal.mysql.clue.CrmClueMapper;
  10 +import jakarta.annotation.Resource;
11 import org.junit.jupiter.api.Disabled; 11 import org.junit.jupiter.api.Disabled;
12 import org.junit.jupiter.api.Test; 12 import org.junit.jupiter.api.Test;
13 import org.springframework.context.annotation.Import; 13 import org.springframework.context.annotation.Import;
14 14
15 -import jakarta.annotation.Resource;  
16 import java.util.List; 15 import java.util.List;
17 16
18 -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; 17 +import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE;
19 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; 18 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
20 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; 19 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
21 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; 20 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
@@ -25,6 +24,7 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CLUE_NOT_EXIS @@ -25,6 +24,7 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CLUE_NOT_EXIS
25 import static org.junit.jupiter.api.Assertions.*; 24 import static org.junit.jupiter.api.Assertions.*;
26 25
27 // TODO 芋艿:单测后续补; 26 // TODO 芋艿:单测后续补;
  27 +
28 /** 28 /**
29 * {@link CrmClueServiceImpl} 的单元测试类 29 * {@link CrmClueServiceImpl} 的单元测试类
30 * 30 *
@@ -90,8 +90,8 @@ public class CrmClueServiceImplTest extends BaseDbUnitTest { @@ -90,8 +90,8 @@ public class CrmClueServiceImplTest extends BaseDbUnitTest {
90 90
91 // 调用 91 // 调用
92 clueService.deleteClue(id); 92 clueService.deleteClue(id);
93 - // 校验数据不存在了  
94 - assertNull(clueMapper.selectById(id)); 93 + // 校验数据不存在了
  94 + assertNull(clueMapper.selectById(id));
95 } 95 }
96 96
97 @Test 97 @Test
@@ -106,110 +106,102 @@ public class CrmClueServiceImplTest extends BaseDbUnitTest { @@ -106,110 +106,102 @@ public class CrmClueServiceImplTest extends BaseDbUnitTest {
106 @Test 106 @Test
107 @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 107 @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
108 public void testGetCluePage() { 108 public void testGetCluePage() {
109 - // mock 数据  
110 - CrmClueDO dbClue = randomPojo(CrmClueDO.class, o -> { // 等会查询到  
111 - o.setTransformStatus(null);  
112 - o.setFollowUpStatus(null);  
113 - o.setName(null);  
114 - o.setCustomerId(null);  
115 - o.setContactNextTime(null);  
116 - o.setTelephone(null);  
117 - o.setMobile(null);  
118 - o.setAddress(null);  
119 - o.setContactLastTime(null);  
120 - o.setCreateTime(null);  
121 - });  
122 - clueMapper.insert(dbClue);  
123 - // 测试 transformStatus 不匹配  
124 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setTransformStatus(null)));  
125 - // 测试 followUpStatus 不匹配  
126 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setFollowUpStatus(null)));  
127 - // 测试 name 不匹配  
128 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setName(null)));  
129 - // 测试 customerId 不匹配  
130 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setCustomerId(null)));  
131 - // 测试 contactNextTime 不匹配  
132 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setContactNextTime(null)));  
133 - // 测试 telephone 不匹配  
134 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setTelephone(null)));  
135 - // 测试 mobile 不匹配  
136 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setMobile(null)));  
137 - // 测试 address 不匹配  
138 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setAddress(null)));  
139 - // 测试 contactLastTime 不匹配  
140 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setContactLastTime(null)));  
141 - // 测试 createTime 不匹配  
142 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setCreateTime(null)));  
143 - // 准备参数  
144 - CrmCluePageReqVO reqVO = new CrmCluePageReqVO();  
145 - reqVO.setName(null);  
146 - reqVO.setTelephone(null);  
147 - reqVO.setMobile(null);  
148 -  
149 - // 调用  
150 - PageResult<CrmClueDO> pageResult = clueService.getCluePage(reqVO);  
151 - // 断言  
152 - assertEquals(1, pageResult.getTotal());  
153 - assertEquals(1, pageResult.getList().size());  
154 - assertPojoEquals(dbClue, pageResult.getList().get(0)); 109 + // mock 数据
  110 + CrmClueDO dbClue = randomPojo(CrmClueDO.class, o -> { // 等会查询到
  111 + o.setTransformStatus(null);
  112 + o.setFollowUpStatus(null);
  113 + o.setName(null);
  114 + o.setCustomerId(null);
  115 + o.setContactNextTime(null);
  116 + o.setTelephone(null);
  117 + o.setMobile(null);
  118 + o.setAddress(null);
  119 + o.setContactLastTime(null);
  120 + o.setCreateTime(null);
  121 + });
  122 + clueMapper.insert(dbClue);
  123 + // 测试 transformStatus 不匹配
  124 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setTransformStatus(null)));
  125 + // 测试 followUpStatus 不匹配
  126 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setFollowUpStatus(null)));
  127 + // 测试 name 不匹配
  128 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setName(null)));
  129 + // 测试 customerId 不匹配
  130 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setCustomerId(null)));
  131 + // 测试 contactNextTime 不匹配
  132 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setContactNextTime(null)));
  133 + // 测试 telephone 不匹配
  134 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setTelephone(null)));
  135 + // 测试 mobile 不匹配
  136 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setMobile(null)));
  137 + // 测试 address 不匹配
  138 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setAddress(null)));
  139 + // 测试 contactLastTime 不匹配
  140 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setContactLastTime(null)));
  141 + // 测试 createTime 不匹配
  142 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setCreateTime(null)));
  143 + // 准备参数
  144 + CrmCluePageReqVO reqVO = new CrmCluePageReqVO();
  145 + reqVO.setName(null);
  146 + reqVO.setTelephone(null);
  147 + reqVO.setMobile(null);
  148 +
  149 + // 调用
  150 + PageResult<CrmClueDO> pageResult = clueService.getCluePage(reqVO, getLoginUserId());
  151 + // 断言
  152 + assertEquals(1, pageResult.getTotal());
  153 + assertEquals(1, pageResult.getList().size());
  154 + assertPojoEquals(dbClue, pageResult.getList().get(0));
155 } 155 }
156 156
157 @Test 157 @Test
158 @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 158 @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
159 public void testGetClueList() { 159 public void testGetClueList() {
160 - // mock 数据  
161 - CrmClueDO dbClue = randomPojo(CrmClueDO.class, o -> { // 等会查询到  
162 - o.setTransformStatus(null);  
163 - o.setFollowUpStatus(null);  
164 - o.setName(null);  
165 - o.setCustomerId(null);  
166 - o.setContactNextTime(null);  
167 - o.setTelephone(null);  
168 - o.setMobile(null);  
169 - o.setAddress(null);  
170 - o.setContactLastTime(null);  
171 - o.setCreateTime(null);  
172 - });  
173 - clueMapper.insert(dbClue);  
174 - // 测试 transformStatus 不匹配  
175 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setTransformStatus(null)));  
176 - // 测试 followUpStatus 不匹配  
177 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setFollowUpStatus(null)));  
178 - // 测试 name 不匹配  
179 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setName(null)));  
180 - // 测试 customerId 不匹配  
181 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setCustomerId(null)));  
182 - // 测试 contactNextTime 不匹配  
183 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setContactNextTime(null)));  
184 - // 测试 telephone 不匹配  
185 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setTelephone(null)));  
186 - // 测试 mobile 不匹配  
187 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setMobile(null)));  
188 - // 测试 address 不匹配  
189 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setAddress(null)));  
190 - // 测试 contactLastTime 不匹配  
191 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setContactLastTime(null)));  
192 - // 测试 createTime 不匹配  
193 - clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setCreateTime(null)));  
194 - // 准备参数  
195 - CrmClueExportReqVO reqVO = new CrmClueExportReqVO();  
196 - reqVO.setTransformStatus(null);  
197 - reqVO.setFollowUpStatus(null);  
198 - reqVO.setName(null);  
199 - reqVO.setCustomerId(null);  
200 - reqVO.setContactNextTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));  
201 - reqVO.setTelephone(null);  
202 - reqVO.setMobile(null);  
203 - reqVO.setAddress(null);  
204 - reqVO.setOwnerUserId(null);  
205 - reqVO.setContactLastTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));  
206 - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));  
207 -  
208 - // 调用  
209 - List<CrmClueDO> list = clueService.getClueList(reqVO);  
210 - // 断言  
211 - assertEquals(1, list.size());  
212 - assertPojoEquals(dbClue, list.get(0)); 160 + // mock 数据
  161 + CrmClueDO dbClue = randomPojo(CrmClueDO.class, o -> { // 等会查询到
  162 + o.setTransformStatus(null);
  163 + o.setFollowUpStatus(null);
  164 + o.setName(null);
  165 + o.setCustomerId(null);
  166 + o.setContactNextTime(null);
  167 + o.setTelephone(null);
  168 + o.setMobile(null);
  169 + o.setAddress(null);
  170 + o.setContactLastTime(null);
  171 + o.setCreateTime(null);
  172 + });
  173 + clueMapper.insert(dbClue);
  174 + // 测试 transformStatus 不匹配
  175 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setTransformStatus(null)));
  176 + // 测试 followUpStatus 不匹配
  177 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setFollowUpStatus(null)));
  178 + // 测试 name 不匹配
  179 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setName(null)));
  180 + // 测试 customerId 不匹配
  181 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setCustomerId(null)));
  182 + // 测试 contactNextTime 不匹配
  183 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setContactNextTime(null)));
  184 + // 测试 telephone 不匹配
  185 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setTelephone(null)));
  186 + // 测试 mobile 不匹配
  187 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setMobile(null)));
  188 + // 测试 address 不匹配
  189 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setAddress(null)));
  190 + // 测试 contactLastTime 不匹配
  191 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setContactLastTime(null)));
  192 + // 测试 createTime 不匹配
  193 + clueMapper.insert(cloneIgnoreId(dbClue, o -> o.setCreateTime(null)));
  194 + // 准备参数
  195 + CrmCluePageReqVO reqVO = new CrmCluePageReqVO();
  196 + reqVO.setName(null);
  197 + reqVO.setTelephone(null);
  198 + reqVO.setMobile(null);
  199 + reqVO.setPageSize(PAGE_SIZE_NONE);
  200 + // 调用
  201 + List<CrmClueDO> list = clueService.getCluePage(reqVO, 1L).getList();
  202 + // 断言
  203 + assertEquals(1, list.size());
  204 + assertPojoEquals(dbClue, list.get(0));
213 } 205 }
214 206
215 } 207 }