Commit e4d3175f06ef278e8abd536fa793a28862421198

Authored by puhui999
1 parent 23df8633

CRM-数据权限:完善 review 提到的问题

Showing 31 changed files with 169 additions and 123 deletions
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java
... ... @@ -22,7 +22,8 @@ public enum CrmBizTypeEnum implements IntArrayValuable {
22 22 CRM_CONTACT(3, "联系人"),
23 23 CRM_BUSINESS(4, "商机"),
24 24 CRM_CONTRACT(5, "合同"),
25   - CRM_PRODUCT(6, "产品")
  25 + CRM_PRODUCT(6, "产品"),
  26 + CRM_RECEIVABLE(7, "回款")
26 27 ;
27 28  
28 29 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmBizTypeEnum::getType).toArray();
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java
... ... @@ -122,7 +122,7 @@ public class CrmBusinessController {
122 122 @Operation(summary = "获得商机分页,基于指定客户")
123 123 public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPageByCustomer(@Valid CrmBusinessPageReqVO pageReqVO) {
124 124 Assert.notNull(pageReqVO.getCustomerId(), "客户编号不能为空");
125   - PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPageByCustomer(pageReqVO, getLoginUserId());
  125 + PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPageByCustomerId(pageReqVO);
126 126 // 处理客户名称回显
127 127 // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈;
128 128 Set<Long> customerIds = pageResult.getList().stream()
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java
... ... @@ -24,7 +24,4 @@ public class CrmBusinessPageReqVO extends PageParam {
24 24 @InEnum(CrmSceneTypeEnum.class)
25 25 private Integer sceneType; // 场景类型,为 null 时则表示全部
26 26  
27   - @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
28   - private Boolean pool; // null 则表示为不是公海数据
29   -
30 27 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java
... ... @@ -125,7 +125,7 @@ public class CrmContactController {
125 125 @Operation(summary = "获得联系人分页,基于指定客户")
126 126 public CommonResult<PageResult<CrmContactRespVO>> getContactPageByCustomer(@Valid CrmContactPageReqVO pageVO) {
127 127 Assert.notNull(pageVO.getCustomerId(), "客户编号不能为空");
128   - PageResult<CrmContactDO> pageResult = contactService.getContactPageByCustomerId(pageVO, getLoginUserId());
  128 + PageResult<CrmContactDO> pageResult = contactService.getContactPageByCustomerId(pageVO);
129 129 return success(convertDetailContactPage(pageResult));
130 130 }
131 131  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactPageReqVO.java
... ... @@ -39,7 +39,4 @@ public class CrmContactPageReqVO extends PageParam {
39 39 @InEnum(CrmSceneTypeEnum.class)
40 40 private Integer sceneType; // 场景类型,为 null 时则表示全部
41 41  
42   - @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
43   - private Boolean pool; // null 则表示为不是公海数据
44   -
45 42 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java
... ... @@ -95,7 +95,7 @@ public class CrmContractController {
95 95 @Operation(summary = "获得联系人分页,基于指定客户")
96 96 public CommonResult<PageResult<ContractRespVO>> getContractPageByCustomer(@Valid CrmContractPageReqVO pageVO) {
97 97 Assert.notNull(pageVO.getCustomerId(), "客户编号不能为空");
98   - PageResult<CrmContractDO> pageResult = contractService.getContractPageByCustomer(pageVO, getLoginUserId());
  98 + PageResult<CrmContractDO> pageResult = contractService.getContractPageByCustomerId(pageVO);
99 99 return success(convertDetailContractPage(pageResult));
100 100 }
101 101  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractPageReqVO.java
... ... @@ -30,7 +30,4 @@ public class CrmContractPageReqVO extends PageParam {
30 30 @InEnum(CrmSceneTypeEnum.class)
31 31 private Integer sceneType; // 场景类型,为 null 时则表示全部
32 32  
33   - @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
34   - private Boolean pool; // null 则表示为不是公海数据 TODO @puhui999:合同没有公海。目前只有【客户】【线索】有公海,其它都没
35   -
36 33 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/CrmReceivableController.java
... ... @@ -36,6 +36,7 @@ import java.util.Map;
36 36 import java.util.stream.Stream;
37 37  
38 38 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  39 +import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE;
39 40 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap;
40 41 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
41 42 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
... ... @@ -94,7 +95,7 @@ public class CrmReceivableController {
94 95 @Operation(summary = "获得回款分页")
95 96 @PreAuthorize("@ss.hasPermission('crm:receivable:query')")
96 97 public CommonResult<PageResult<CrmReceivableRespVO>> getReceivablePage(@Valid CrmReceivablePageReqVO pageReqVO) {
97   - PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(pageReqVO);
  98 + PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(pageReqVO, getLoginUserId());
98 99 return success(convertDetailReceivablePage(pageResult));
99 100 }
100 101  
... ... @@ -102,7 +103,7 @@ public class CrmReceivableController {
102 103 @Operation(summary = "获得回款分页,基于指定客户")
103 104 public CommonResult<PageResult<CrmReceivableRespVO>> getReceivablePageByCustomer(@Valid CrmReceivablePageReqVO pageReqVO) {
104 105 Assert.notNull(pageReqVO.getCustomerId(), "客户编号不能为空");
105   - PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePageByCustomer(pageReqVO);
  106 + PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePageByCustomerId(pageReqVO);
106 107 return success(convertDetailReceivablePage(pageResult));
107 108 }
108 109  
... ... @@ -113,7 +114,8 @@ public class CrmReceivableController {
113 114 @OperateLog(type = EXPORT)
114 115 public void exportReceivableExcel(@Valid CrmReceivablePageReqVO exportReqVO,
115 116 HttpServletResponse response) throws IOException {
116   - PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(exportReqVO);
  117 + exportReqVO.setPageSize(PAGE_SIZE_NONE);
  118 + PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(exportReqVO, getLoginUserId());
117 119 // 导出 Excel
118 120 ExcelUtils.write(response, "回款.xls", "数据", CrmReceivableRespVO.class,
119 121 convertDetailReceivablePage(pageResult).getList());
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanPageReqVO.java
... ... @@ -25,7 +25,4 @@ public class CrmReceivablePlanPageReqVO extends PageParam {
25 25 @InEnum(CrmSceneTypeEnum.class)
26 26 private Integer sceneType; // 场景类型,为 null 时则表示全部
27 27  
28   - @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
29   - private Boolean pool; // null 则表示为不是公海数据
30   -
31 28 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivablePageReqVO.java
... ... @@ -27,7 +27,4 @@ public class CrmReceivablePageReqVO extends PageParam {
27 27 @InEnum(CrmSceneTypeEnum.class)
28 28 private Integer sceneType; // 场景类型,为 null 时则表示全部
29 29  
30   - @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
31   - private Boolean pool; // null 则表示为不是公海数据
32   -
33 30 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java
... ... @@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferRe
9 9 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
10 10 import org.mapstruct.Mapper;
11 11 import org.mapstruct.Mapping;
12   -import org.mapstruct.Mappings;
13 12 import org.mapstruct.factory.Mappers;
14 13  
15 14 import java.util.List;
... ... @@ -48,10 +47,7 @@ public interface ContactConvert {
48 47  
49 48 List<CrmContactSimpleRespVO> convertAllList(List<CrmContactDO> list);
50 49  
51   - @Mappings({
52   - @Mapping(target = "bizId", source = "reqVO.id"),
53   - @Mapping(target = "newOwnerUserId", source = "reqVO.id")
54   - })
  50 + @Mapping(target = "bizId", source = "reqVO.id")
55 51 CrmPermissionTransferReqBO convert(CrmContactTransferReqVO reqVO, Long userId);
56 52  
57 53 /**
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contract/ContractConvert.java
... ... @@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferRe
8 8 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
9 9 import org.mapstruct.Mapper;
10 10 import org.mapstruct.Mapping;
11   -import org.mapstruct.Mappings;
12 11 import org.mapstruct.factory.Mappers;
13 12  
14 13 import java.util.List;
... ... @@ -39,10 +38,7 @@ public interface ContractConvert {
39 38  
40 39 List<CrmContractExcelVO> convertList02(List<CrmContractDO> list);
41 40  
42   - @Mappings({
43   - @Mapping(target = "bizId", source = "reqVO.id"),
44   - @Mapping(target = "newOwnerUserId", source = "reqVO.id")
45   - })
  41 + @Mapping(target = "bizId", source = "reqVO.id")
46 42 CrmPermissionTransferReqBO convert(CrmContractTransferReqVO reqVO, Long userId);
47 43  
48 44 default PageResult<ContractRespVO> convertPage(PageResult<CrmContractDO> pageResult, Map<Long, AdminUserRespDTO> userMap,
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.dal.mysql.business;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 6 import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
6 7 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO;
7 8 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
... ... @@ -27,14 +28,20 @@ public interface CrmBusinessMapper extends BaseMapperX&lt;CrmBusinessDO&gt; {
27 28 .set(CrmBusinessDO::getOwnerUserId, ownerUserId));
28 29 }
29 30  
  31 + default PageResult<CrmBusinessDO> selectPageByCustomerId(CrmBusinessPageReqVO pageReqVO) {
  32 + return selectPage(pageReqVO, new LambdaQueryWrapperX<CrmBusinessDO>()
  33 + .eq(CrmBusinessDO::getCustomerId, pageReqVO.getCustomerId()) // 指定客户编号
  34 + .likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName())
  35 + .orderByDesc(CrmBusinessDO::getId));
  36 + }
  37 +
30 38 default PageResult<CrmBusinessDO> selectPage(CrmBusinessPageReqVO pageReqVO, Long userId) {
31 39 MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>();
32 40 // 拼接数据权限的查询条件
33   - CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), CrmBusinessDO::getId,
34   - userId, pageReqVO.getSceneType(), pageReqVO.getPool());
  41 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), CrmBusinessDO::getId,
  42 + userId, pageReqVO.getSceneType(), Boolean.FALSE);
35 43 // 拼接自身的查询条件
36 44 query.selectAll(CrmBusinessDO.class)
37   - .eqIfPresent(CrmBusinessDO::getCustomerId, pageReqVO.getCustomerId()) // 指定客户编号
38 45 .likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName())
39 46 .orderByDesc(CrmBusinessDO::getId);
40 47 return selectJoinPage(pageReqVO, CrmBusinessDO.class, query);
... ... @@ -43,7 +50,7 @@ public interface CrmBusinessMapper extends BaseMapperX&lt;CrmBusinessDO&gt; {
43 50 default List<CrmBusinessDO> selectBatchIds(Collection<Long> ids, Long userId) {
44 51 MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>();
45 52 // 拼接数据权限的查询条件
46   - CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), ids, userId);
  53 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), ids, userId);
47 54 return selectJoinList(CrmBusinessDO.class, query);
48 55 }
49 56  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/CrmClueMapper.java
... ... @@ -30,7 +30,7 @@ public interface CrmClueMapper extends BaseMapperX&lt;CrmClueDO&gt; {
30 30 default PageResult<CrmClueDO> selectPage(CrmCluePageReqVO pageReqVO, Long userId) {
31 31 MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
32 32 // 拼接数据权限的查询条件
33   - CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_LEADS.getType(), CrmClueDO::getId,
  33 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_LEADS.getType(), CrmClueDO::getId,
34 34 userId, pageReqVO.getSceneType(), pageReqVO.getPool());
35 35 // 拼接自身的查询条件
36 36 query.selectAll(CrmClueDO.class)
... ... @@ -44,7 +44,7 @@ public interface CrmClueMapper extends BaseMapperX&lt;CrmClueDO&gt; {
44 44 default List<CrmClueDO> selectBatchIds(Collection<Long> ids, Long userId) {
45 45 MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
46 46 // 拼接数据权限的查询条件
47   - CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_LEADS.getType(), ids, userId);
  47 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_LEADS.getType(), ids, userId);
48 48 return selectJoinList(CrmClueDO.class, query);
49 49 }
50 50  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.dal.mysql.contact;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 6 import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
6 7 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO;
7 8 import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
... ... @@ -27,14 +28,25 @@ public interface CrmContactMapper extends BaseMapperX&lt;CrmContactDO&gt; {
27 28 .set(CrmContactDO::getOwnerUserId, ownerUserId));
28 29 }
29 30  
  31 + default PageResult<CrmContactDO> selectPageByCustomerId(CrmContactPageReqVO pageVO) {
  32 + return selectPage(pageVO, new LambdaQueryWrapperX<CrmContactDO>()
  33 + .eq(CrmContactDO::getCustomerId, pageVO.getCustomerId()) // 指定客户编号
  34 + .likeIfPresent(CrmContactDO::getName, pageVO.getName())
  35 + .eqIfPresent(CrmContactDO::getMobile, pageVO.getMobile())
  36 + .eqIfPresent(CrmContactDO::getTelephone, pageVO.getTelephone())
  37 + .eqIfPresent(CrmContactDO::getEmail, pageVO.getEmail())
  38 + .eqIfPresent(CrmContactDO::getQq, pageVO.getQq())
  39 + .eqIfPresent(CrmContactDO::getWechat, pageVO.getWechat())
  40 + .orderByDesc(CrmContactDO::getId));
  41 + }
  42 +
30 43 default PageResult<CrmContactDO> selectPage(CrmContactPageReqVO pageReqVO, Long userId) {
31 44 MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>();
32 45 // 拼接数据权限的查询条件
33   - CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_CONTACT.getType(), CrmContactDO::getId,
34   - userId, pageReqVO.getSceneType(), pageReqVO.getPool());
  46 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(), CrmContactDO::getId,
  47 + userId, pageReqVO.getSceneType(), Boolean.FALSE);
35 48 // 拼接自身的查询条件
36 49 query.selectAll(CrmContactDO.class)
37   - .eqIfPresent(CrmContactDO::getCustomerId, pageReqVO.getCustomerId()) // 指定客户编号
38 50 .likeIfPresent(CrmContactDO::getName, pageReqVO.getName())
39 51 .eqIfPresent(CrmContactDO::getMobile, pageReqVO.getMobile())
40 52 .eqIfPresent(CrmContactDO::getTelephone, pageReqVO.getTelephone())
... ... @@ -48,7 +60,7 @@ public interface CrmContactMapper extends BaseMapperX&lt;CrmContactDO&gt; {
48 60 default List<CrmContactDO> selectBatchIds(Collection<Long> ids, Long userId) {
49 61 MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>();
50 62 // 拼接数据权限的查询条件
51   - CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId);
  63 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId);
52 64 return selectJoinList(CrmContactDO.class, query);
53 65 }
54 66  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.dal.mysql.contract;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 6 import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
6 7 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
7 8 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
... ... @@ -27,13 +28,22 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
27 28 .set(CrmContractDO::getOwnerUserId, ownerUserId));
28 29 }
29 30  
  31 + default PageResult<CrmContractDO> selectPageByCustomerId(CrmContractPageReqVO pageReqVO) {
  32 + return selectPage(pageReqVO, new LambdaQueryWrapperX<CrmContractDO>()
  33 + .eq(CrmContractDO::getCustomerId, pageReqVO.getCustomerId())
  34 + .likeIfPresent(CrmContractDO::getNo, pageReqVO.getNo())
  35 + .likeIfPresent(CrmContractDO::getName, pageReqVO.getName())
  36 + .eqIfPresent(CrmContractDO::getCustomerId, pageReqVO.getCustomerId())
  37 + .eqIfPresent(CrmContractDO::getBusinessId, pageReqVO.getBusinessId())
  38 + .orderByDesc(CrmContractDO::getId));
  39 + }
  40 +
30 41 default PageResult<CrmContractDO> selectPage(CrmContractPageReqVO pageReqVO, Long userId) {
31 42 MPJLambdaWrapperX<CrmContractDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
32 43 // 构建数据权限连表条件
33   - CrmQueryWrapperUtils.builderPageQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), CrmContractDO::getId,
34   - userId, pageReqVO.getSceneType(), pageReqVO.getPool());
  44 + CrmQueryWrapperUtils.appendPermissionCondition(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), CrmContractDO::getId,
  45 + userId, pageReqVO.getSceneType(), Boolean.FALSE);
35 46 mpjLambdaWrapperX.selectAll(CrmContractDO.class)
36   - .eqIfPresent(CrmContractDO::getCustomerId, pageReqVO.getCustomerId())
37 47 .likeIfPresent(CrmContractDO::getNo, pageReqVO.getNo())
38 48 .likeIfPresent(CrmContractDO::getName, pageReqVO.getName())
39 49 .eqIfPresent(CrmContractDO::getCustomerId, pageReqVO.getCustomerId())
... ... @@ -45,7 +55,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
45 55 default List<CrmContractDO> selectBatchIds(Collection<Long> ids, Long userId) {
46 56 MPJLambdaWrapperX<CrmContractDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
47 57 // 构建数据权限连表条件
48   - CrmQueryWrapperUtils.builderListQueryBatch(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId);
  58 + CrmQueryWrapperUtils.appendPermissionCondition(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId);
49 59 return selectJoinList(CrmContractDO.class, mpjLambdaWrapperX);
50 60 }
51 61  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java
... ... @@ -30,7 +30,7 @@ public interface CrmCustomerMapper extends BaseMapperX&lt;CrmCustomerDO&gt; {
30 30 default PageResult<CrmCustomerDO> selectPage(CrmCustomerPageReqVO pageReqVO, Long userId) {
31 31 MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
32 32 // 拼接数据权限的查询条件
33   - CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), CrmCustomerDO::getId,
  33 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), CrmCustomerDO::getId,
34 34 userId, pageReqVO.getSceneType(), pageReqVO.getPool());
35 35 // 拼接自身的查询条件
36 36 query.selectAll(CrmCustomerDO.class)
... ... @@ -45,7 +45,7 @@ public interface CrmCustomerMapper extends BaseMapperX&lt;CrmCustomerDO&gt; {
45 45 default List<CrmCustomerDO> selectBatchIds(Collection<Long> ids, Long userId) {
46 46 MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
47 47 // 拼接数据权限的查询条件
48   - CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, userId);
  48 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, userId);
49 49 return selectJoinList(CrmCustomerDO.class, query);
50 50 }
51 51  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java
... ... @@ -46,4 +46,10 @@ public interface CrmPermissionMapper extends BaseMapperX&lt;CrmPermissionDO&gt; {
46 46 .eq(CrmPermissionDO::getId, id).eq(CrmPermissionDO::getUserId, userId));
47 47 }
48 48  
  49 + default int deletePermission(Integer bizType, Long bizId) {
  50 + return delete(new LambdaQueryWrapperX<CrmPermissionDO>()
  51 + .eq(CrmPermissionDO::getBizType, bizType)
  52 + .eq(CrmPermissionDO::getBizId, bizId));
  53 + }
  54 +
49 55 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java
... ... @@ -3,10 +3,17 @@ package cn.iocoder.yudao.module.crm.dal.mysql.receivable;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
6 7 import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivablePageReqVO;
7 8 import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO;
  9 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  10 +import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
  11 +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
8 12 import org.apache.ibatis.annotations.Mapper;
9 13  
  14 +import java.util.Collection;
  15 +import java.util.List;
  16 +
10 17 /**
11 18 * 回款 Mapper
12 19 *
... ... @@ -15,15 +22,13 @@ import org.apache.ibatis.annotations.Mapper;
15 22 @Mapper
16 23 public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> {
17 24  
18   - default PageResult<CrmReceivableDO> selectPage(CrmReceivablePageReqVO reqVO) {
19   - return selectPage(reqVO, new LambdaQueryWrapperX<CrmReceivableDO>()
20   - .eqIfPresent(CrmReceivableDO::getNo, reqVO.getNo())
21   - .eqIfPresent(CrmReceivableDO::getPlanId, reqVO.getPlanId())
22   - .eqIfPresent(CrmReceivableDO::getCustomerId, reqVO.getCustomerId())
23   - .orderByDesc(CrmReceivableDO::getId));
  25 + default int updateOwnerUserIdById(Long id, Long ownerUserId) {
  26 + return update(new LambdaUpdateWrapper<CrmReceivableDO>()
  27 + .eq(CrmReceivableDO::getId, id)
  28 + .set(CrmReceivableDO::getOwnerUserId, ownerUserId));
24 29 }
25 30  
26   - default PageResult<CrmReceivableDO> selectPageByCustomer(CrmReceivablePageReqVO reqVO) {
  31 + default PageResult<CrmReceivableDO> selectPageByCustomerId(CrmReceivablePageReqVO reqVO) {
27 32 return selectPage(reqVO, new LambdaQueryWrapperX<CrmReceivableDO>()
28 33 .eq(CrmReceivableDO::getCustomerId, reqVO.getCustomerId()) // 必须传递
29 34 .eqIfPresent(CrmReceivableDO::getNo, reqVO.getNo())
... ... @@ -31,4 +36,24 @@ public interface CrmReceivableMapper extends BaseMapperX&lt;CrmReceivableDO&gt; {
31 36 .orderByDesc(CrmReceivableDO::getId));
32 37 }
33 38  
  39 + default PageResult<CrmReceivableDO> selectPage(CrmReceivablePageReqVO pageReqVO, Long userId) {
  40 + MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
  41 + // 拼接数据权限的查询条件
  42 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(), CrmReceivableDO::getId,
  43 + userId, pageReqVO.getSceneType(), Boolean.FALSE);
  44 + // 拼接自身的查询条件
  45 + query.selectAll(CrmReceivableDO.class)
  46 + .eqIfPresent(CrmReceivableDO::getNo, pageReqVO.getNo())
  47 + .eqIfPresent(CrmReceivableDO::getPlanId, pageReqVO.getPlanId())
  48 + .orderByDesc(CrmReceivableDO::getId);
  49 + return selectJoinPage(pageReqVO, CrmReceivableDO.class, query);
  50 + }
  51 +
  52 + default List<CrmReceivableDO> selectBatchIds(Collection<Long> ids, Long userId) {
  53 + MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
  54 + // 拼接数据权限的查询条件
  55 + CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(), ids, userId);
  56 + return selectJoinList(CrmReceivableDO.class, query);
  57 + }
  58 +
34 59 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java
... ... @@ -75,10 +75,9 @@ public interface CrmBusinessService {
75 75 * 数据权限:基于 {@link CrmCustomerDO} 读取
76 76 *
77 77 * @param pageReqVO 分页查询
78   - * @param userId 用户编号
79 78 * @return 联系人分页
80 79 */
81   - PageResult<CrmBusinessDO> getBusinessPageByCustomer(CrmBusinessPageReqVO pageReqVO, Long userId);
  80 + PageResult<CrmBusinessDO> getBusinessPageByCustomerId(CrmBusinessPageReqVO pageReqVO);
82 81  
83 82 /**
84 83 * 商机转移
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
... ... @@ -111,11 +111,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
111 111 }
112 112  
113 113 @Override
114   - public PageResult<CrmBusinessDO> getBusinessPageByCustomer(CrmBusinessPageReqVO pageReqVO, Long userId) {
115   - // 校验客户存在 TODO @puhui999:这里不校验
116   - customerService.validateCustomer(pageReqVO.getCustomerId());
117   - // TODO @puhui999:感觉这里貌似不太复用用 selectPage,因为他可能没商机权限,只是因为能看 customer,所以可以看到列表
118   - return businessMapper.selectPage(pageReqVO, userId);
  114 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageReqVO.customerId", level = CrmPermissionLevelEnum.READ)
  115 + public PageResult<CrmBusinessDO> getBusinessPageByCustomerId(CrmBusinessPageReqVO pageReqVO) {
  116 + return businessMapper.selectPageByCustomerId(pageReqVO);
119 117 }
120 118  
121 119 @Override
... ... @@ -127,7 +125,6 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
127 125 // 2.1 数据权限转移
128 126 crmPermissionService.transferPermission(
129 127 CrmBusinessConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()));
130   -
131 128 // 2.2 设置新的负责人
132 129 businessMapper.updateOwnerUserIdById(reqVO.getId(), reqVO.getNewOwnerUserId());
133 130  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactService.java
... ... @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactCreateR
5 5 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO;
6 6 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactUpdateReqVO;
7 7 import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
  8 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
8 9 import jakarta.validation.Valid;
9 10  
10 11 import java.util.Collection;
... ... @@ -71,12 +72,11 @@ public interface CrmContactService {
71 72 /**
72 73 * 获得联系人分页
73 74 *
74   - * 数据权限:基于 {@link CrmContactDO}
  75 + * 数据权限:基于 {@link CrmCustomerDO}
75 76 *
76 77 * @param pageVO 分页查询
77   - * @param userId 用户编号
78 78 * @return 联系人分页
79 79 */
80   - PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO, Long userId);
  80 + PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO);
81 81  
82 82 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java
... ... @@ -134,11 +134,9 @@ public class CrmContactServiceImpl implements CrmContactService {
134 134 }
135 135  
136 136 @Override
137   - public PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO, Long userId) {
138   - // 校验用户存在
139   - customerService.validateCustomer(pageVO.getCustomerId());
140   - // TODO @puhui999:getBusinessPageByCustomer 同理
141   - return contactMapper.selectPage(pageVO, userId);
  137 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageVO.customerId", level = CrmPermissionLevelEnum.READ)
  138 + public PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO) {
  139 + return contactMapper.selectPageByCustomerId(pageVO);
142 140 }
143 141  
144 142 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java
... ... @@ -75,12 +75,9 @@ public interface CrmContractService {
75 75 * 数据权限:基于 {@link CrmCustomerDO} 读取
76 76 *
77 77 * @param pageReqVO 分页查询
78   - * @param userId 用户编号
79 78 * @return 联系人分页
80 79 */
81   - default PageResult<CrmContractDO> getContractPageByCustomer(CrmContractPageReqVO pageReqVO, Long userId) {
82   - return getContractPage(pageReqVO, userId);
83   - }
  80 + PageResult<CrmContractDO> getContractPageByCustomerId(CrmContractPageReqVO pageReqVO);
84 81  
85 82 /**
86 83 * 合同转移
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
... ... @@ -105,6 +105,12 @@ public class CrmContractServiceImpl implements CrmContractService {
105 105 }
106 106  
107 107 @Override
  108 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageReqVO.customerId", level = CrmPermissionLevelEnum.READ)
  109 + public PageResult<CrmContractDO> getContractPageByCustomerId(CrmContractPageReqVO pageReqVO) {
  110 + return contractMapper.selectPageByCustomerId(pageReqVO);
  111 + }
  112 +
  113 + @Override
108 114 @Transactional(rollbackFor = Exception.class)
109 115 public void transferContract(CrmContractTransferReqVO reqVO, Long userId) {
110 116 // 1. 校验合同是否存在
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
... ... @@ -114,7 +114,6 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
114 114 */
115 115 @Override
116 116 public void validateCustomer(Long customerId) {
117   - // TODO puhui999: 不返回客户不走校验应该可行
118 117 // 校验客户是否存在
119 118 if (customerId == null) {
120 119 throw exception(CUSTOMER_NOT_EXISTS);
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
... ... @@ -139,14 +139,11 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
139 139  
140 140 @Override
141 141 public void deletePermission(Integer bizType, Long bizId) {
142   - // TODO @puhui999:这种直接写条件删除;不需要先查询,再删除
143   - List<CrmPermissionDO> permissionList = crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId);
144   - if (CollUtil.isEmpty(permissionList)) {
145   - return;
146   - }
147   -
148 142 // 删除数据权限
149   - crmPermissionMapper.deleteBatchIds(convertSet(permissionList, CrmPermissionDO::getId));
  143 + int deletedCol = crmPermissionMapper.deletePermission(bizType, bizId);
  144 + if (deletedCol == 0) {
  145 + throw exception(CRM_PERMISSION_NOT_EXISTS);
  146 + }
150 147 }
151 148  
152 149 @Override
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableService.java
... ... @@ -6,8 +6,8 @@ import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.Crm
6 6 import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableUpdateReqVO;
7 7 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
8 8 import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO;
9   -
10 9 import jakarta.validation.Valid;
  10 +
11 11 import java.util.Collection;
12 12 import java.util.List;
13 13  
... ... @@ -62,9 +62,10 @@ public interface CrmReceivableService {
62 62 * 数据权限:基于 {@link CrmReceivableDO} 读取
63 63 *
64 64 * @param pageReqVO 分页查询
  65 + * @param userId 用户编号
65 66 * @return 回款分页
66 67 */
67   - PageResult<CrmReceivableDO> getReceivablePage(CrmReceivablePageReqVO pageReqVO);
  68 + PageResult<CrmReceivableDO> getReceivablePage(CrmReceivablePageReqVO pageReqVO, Long userId);
68 69  
69 70 /**
70 71 * 获得回款分页,基于指定客户
... ... @@ -74,6 +75,6 @@ public interface CrmReceivableService {
74 75 * @param pageReqVO 分页查询
75 76 * @return 回款分页
76 77 */
77   - PageResult<CrmReceivableDO> getReceivablePageByCustomer(CrmReceivablePageReqVO pageReqVO);
  78 + PageResult<CrmReceivableDO> getReceivablePageByCustomerId(CrmReceivablePageReqVO pageReqVO);
78 79  
79 80 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/CrmReceivableServiceImpl.java
... ... @@ -20,10 +20,10 @@ import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
20 20 import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
21 21 import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
22 22 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
  23 +import jakarta.annotation.Resource;
23 24 import org.springframework.stereotype.Service;
24 25 import org.springframework.validation.annotation.Validated;
25 26  
26   -import jakarta.annotation.Resource;
27 27 import java.util.Collection;
28 28 import java.util.List;
29 29  
... ... @@ -129,16 +129,15 @@ public class CrmReceivableServiceImpl implements CrmReceivableService {
129 129 return receivableMapper.selectBatchIds(ids);
130 130 }
131 131  
132   - // TODO @芋艿:数据权限
133 132 @Override
134   - public PageResult<CrmReceivableDO> getReceivablePage(CrmReceivablePageReqVO pageReqVO) {
135   - return receivableMapper.selectPage(pageReqVO);
  133 + public PageResult<CrmReceivableDO> getReceivablePage(CrmReceivablePageReqVO pageReqVO, Long userId) {
  134 + return receivableMapper.selectPage(pageReqVO, userId);
136 135 }
137 136  
138 137 @Override
139 138 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#pageReqVO.customerId", level = CrmPermissionLevelEnum.READ)
140   - public PageResult<CrmReceivableDO> getReceivablePageByCustomer(CrmReceivablePageReqVO pageReqVO) {
141   - return receivableMapper.selectPageByCustomer(pageReqVO);
  139 + public PageResult<CrmReceivableDO> getReceivablePageByCustomerId(CrmReceivablePageReqVO pageReqVO) {
  140 + return receivableMapper.selectPageByCustomerId(pageReqVO);
142 141 }
143 142  
144 143 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmQueryWrapperUtils.java
... ... @@ -6,6 +6,7 @@ import cn.hutool.extra.spring.SpringUtil;
6 6 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
7 7 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
8 8 import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
  9 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
9 10 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
10 11 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
11 12 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
... ... @@ -17,7 +18,7 @@ import java.util.List;
17 18 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
18 19  
19 20 /**
20   - * CRM 分页查询工具类
  21 + * CRM 查询工具类
21 22 *
22 23 * @author HUIHUI
23 24 */
... ... @@ -26,17 +27,16 @@ public class CrmQueryWrapperUtils {
26 27 /**
27 28 * 构造 CRM 数据类型数据分页查询条件
28 29 *
29   - * @param query 连表查询对象
30   - * @param bizType 数据类型 {@link CrmBizTypeEnum}
31   - * @param bizId 数据编号
32   - * @param userId 用户编号
33   - * @param sceneType 场景类型
34   - * @param pool 公海
  30 + * @param query 连表查询对象
  31 + * @param bizType 数据类型 {@link CrmBizTypeEnum}
  32 + * @param bizId 数据编号
  33 + * @param userId 用户编号
  34 + * @param sceneType 场景类型
  35 + * @param pool 公海
35 36 */
36   - // TODO @puhui999:bizId 直接传递会不会简单点
37   - // TODO @puhui999:builderPageQuery 应该不仅仅适合于分页查询,应该适用于所有的查询;可以改成 appendPermissionCondition
38   - public static <T extends MPJLambdaWrapper<?>, S> void builderPageQuery(T query, Integer bizType, SFunction<S, ?> bizId,
39   - Long userId, Integer sceneType, Boolean pool) {
  37 + // TODO @puhui999:bizId 直接传递会不会简单点 回复:还是需要 SFunction 因为分页连表时不知道 bizId 是多少
  38 + public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId,
  39 + Long userId, Integer sceneType, Boolean pool) {
40 40 // 1. 构建数据权限连表条件
41 41 if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE)) { // 管理员不需要数据权限
42 42 query.innerJoin(CrmPermissionDO.class, on ->
... ... @@ -48,9 +48,13 @@ public class CrmQueryWrapperUtils {
48 48 query.eq("owner_user_id", userId);
49 49 }
50 50 // 2.2 场景二:我参与的数据
51   - // TODO @puhui999:参与,指的是有读写权限噢;可以把 1. 的合并到 2.2 里;因为 2.1 不需要;
52 51 if (CrmSceneTypeEnum.isInvolved(sceneType)) {
53   - query.ne("owner_user_id", userId);
  52 + query
  53 + .ne("owner_user_id", userId)
  54 + .and(q -> q.eq(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel())
  55 + .or()
  56 + .eq(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.WRITE.getLevel()));
  57 +
54 58 }
55 59 // 2.3 场景三:下属负责的数据
56 60 if (CrmSceneTypeEnum.isSubordinate(sceneType)) {
... ... @@ -61,7 +65,7 @@ public class CrmQueryWrapperUtils {
61 65 }
62 66 }
63 67  
64   - // 2. 拼接公海的查询条件
  68 + // 3. 拼接公海的查询条件
65 69 if (ObjUtil.equal(pool, Boolean.TRUE)) { // 情况一:公海
66 70 query.isNull("owner_user_id");
67 71 } else { // 情况二:不是公海
... ... @@ -72,28 +76,27 @@ public class CrmQueryWrapperUtils {
72 76 /**
73 77 * 构造 CRM 数据类型批量数据查询条件
74 78 *
75   - * @param query 连表查询对象
76   - * @param bizType 数据类型 {@link CrmBizTypeEnum}
77   - * @param bizIds 数据编号
78   - * @param userId 用户编号
  79 + * @param query 连表查询对象
  80 + * @param bizType 数据类型 {@link CrmBizTypeEnum}
  81 + * @param bizIds 数据编号
  82 + * @param userId 用户编号
79 83 */
80   - // TODO @puhui999:可以改成 appendPermissionCondition
81   - // TODO @puhui999:S 是不是可以删除
82   - public static <T extends MPJLambdaWrapper<?>, S> void builderListQueryBatch(T query, Integer bizType, Collection<Long> bizIds, Long userId) {
83   - // TODO @puhui999:这里先 if return 简单点
84   - if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE)) { // 管理员不需要数据权限
85   - query.innerJoin(CrmPermissionDO.class, on ->
86   - on.eq(CrmPermissionDO::getBizType, bizType).in(CrmPermissionDO::getBizId, bizIds)
87   - .in(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId));
  84 + public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, Integer bizType, Collection<Long> bizIds, Long userId) {
  85 + if (ObjUtil.equal(validateAdminUser(userId), Boolean.TRUE)) {// 管理员不需要数据权限
  86 + return;
88 87 }
  88 +
  89 + query.innerJoin(CrmPermissionDO.class, on ->
  90 + on.eq(CrmPermissionDO::getBizType, bizType).in(CrmPermissionDO::getBizId, bizIds)
  91 + .in(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId));
89 92 }
90 93  
91   - // TODO @puhui999:需要加个变量,不用每次都拿哈;
92 94 private static AdminUserApi getAdminUserApi() {
93   - return SpringUtil.getBean(AdminUserApi.class);
  95 + return AdminUserApiHolder.ADMIN_USER_API;
94 96 }
95 97  
96 98 // TODO @puhui999:需要实现;
  99 +
97 100 /**
98 101 * 校验用户是否是管理员
99 102 *
... ... @@ -104,4 +107,15 @@ public class CrmQueryWrapperUtils {
104 107 return false;
105 108 }
106 109  
  110 + /**
  111 + * 静态内部类实现 AdminUserApi 单例获取
  112 + *
  113 + * @author HUIHUI
  114 + */
  115 + private static class AdminUserApiHolder {
  116 +
  117 + private static final AdminUserApi ADMIN_USER_API = SpringUtil.getBean(AdminUserApi.class);
  118 +
  119 + }
  120 +
107 121 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/test/java/cn/iocoder/yudao/module/crm/service/receivable/CrmCrmReceivableServiceImplTest.java
... ... @@ -7,12 +7,11 @@ import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.Crm
7 7 import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.receivable.CrmReceivableUpdateReqVO;
8 8 import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO;
9 9 import cn.iocoder.yudao.module.crm.dal.mysql.receivable.CrmReceivableMapper;
  10 +import jakarta.annotation.Resource;
10 11 import org.junit.jupiter.api.Disabled;
11 12 import org.junit.jupiter.api.Test;
12 13 import org.springframework.context.annotation.Import;
13 14  
14   -import jakarta.annotation.Resource;
15   -
16 15 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
17 16 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
18 17 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
... ... @@ -133,7 +132,7 @@ public class CrmCrmReceivableServiceImplTest extends BaseDbUnitTest {
133 132 reqVO.setCustomerId(null);
134 133  
135 134 // 调用
136   - PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(reqVO);
  135 + PageResult<CrmReceivableDO> pageResult = receivableService.getReceivablePage(reqVO, 1L);
137 136 // 断言
138 137 assertEquals(1, pageResult.getTotal());
139 138 assertEquals(1, pageResult.getList().size());
... ...