Commit 23df8633f4fc1cedaaaabf1ec72cfd2acf395e8e

Authored by YunaiV
1 parent 8f578a9a

📖 CRM:code review 数据权限的实现

Showing 25 changed files with 128 additions and 139 deletions
... ... @@ -15,12 +15,12 @@
15 15 <!-- 各种 module 拓展 -->
16 16 <module>yudao-module-system</module>
17 17 <module>yudao-module-infra</module>
18   -<!-- <module>yudao-module-member</module>-->
  18 + <module>yudao-module-member</module>
19 19 <!-- <module>yudao-module-bpm</module>-->
20 20 <!-- <module>yudao-module-report</module>-->
21 21 <!-- <module>yudao-module-mp</module>-->
22   -<!-- <module>yudao-module-pay</module>-->
23   -<!-- <module>yudao-module-mall</module>-->
  22 + <module>yudao-module-pay</module>
  23 + <module>yudao-module-mall</module>
24 24 <module>yudao-module-crm</module>
25 25 <!-- 示例项目 -->
26 26 <!-- <module>yudao-example</module>-->
... ...
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
... ... @@ -48,8 +48,10 @@ public interface BaseMapperX&lt;T&gt; extends MPJBaseMapper&lt;T&gt; {
48 48 return new PageResult<>(list, (long) list.size());
49 49 }
50 50  
  51 + // MyBatis Plus Join 查询
51 52 IPage<D> mpPage = MyBatisUtils.buildPage(pageParam);
52 53 mpPage = selectJoinPage(mpPage, clazz, lambdaWrapper);
  54 + // 转换返回
53 55 return new PageResult<>(mpPage.getRecords(), mpPage.getTotal());
54 56 }
55 57  
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneTypeEnum.java
... ... @@ -17,9 +17,8 @@ import java.util.Arrays;
17 17 public enum CrmSceneTypeEnum implements IntArrayValuable {
18 18  
19 19 OWNER(1, "我负责的"),
20   - FOLLOW(2, "我关注的"),
21   - INVOLVED(3, "我参与的"),
22   - SUBORDINATE(4, "下属负责的");
  20 + INVOLVED(2, "我参与的"),
  21 + SUBORDINATE(3, "下属负责的");
23 22  
24 23 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmSceneTypeEnum::getType).toArray();
25 24  
... ... @@ -36,10 +35,6 @@ public enum CrmSceneTypeEnum implements IntArrayValuable {
36 35 return ObjUtil.equal(OWNER.getType(), type);
37 36 }
38 37  
39   - public static boolean isFollow(Integer type) {
40   - return ObjUtil.equal(FOLLOW.getType(), type);
41   - }
42   -
43 38 public static boolean isInvolved(Integer type) {
44 39 return ObjUtil.equal(INVOLVED.getType(), type);
45 40 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java
... ... @@ -20,12 +20,9 @@ public class CrmBusinessPageReqVO extends PageParam {
20 20 @Schema(description = "客户编号", example = "10795")
21 21 private Long customerId;
22 22  
23   - /**
24   - * 场景类型,为 null 时则表示全部
25   - */
26 23 @Schema(description = "场景类型", example = "1")
27 24 @InEnum(CrmSceneTypeEnum.class)
28   - private Integer sceneType;
  25 + private Integer sceneType; // 场景类型,为 null 时则表示全部
29 26  
30 27 @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
31 28 private Boolean pool; // null 则表示为不是公海数据
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmCluePageReqVO.java
... ... @@ -23,12 +23,9 @@ public class CrmCluePageReqVO extends PageParam {
23 23 @Schema(description = "手机号", example = "18000000000")
24 24 private String mobile;
25 25  
26   - /**
27   - * 场景类型,为 null 时则表示全部
28   - */
29 26 @Schema(description = "场景类型", example = "1")
30 27 @InEnum(CrmSceneTypeEnum.class)
31   - private Integer sceneType;
  28 + private Integer sceneType; // 场景类型,为 null 时则表示全部
32 29  
33 30 @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
34 31 private Boolean pool; // null 则表示为不是公海数据
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactPageReqVO.java
... ... @@ -35,12 +35,9 @@ public class CrmContactPageReqVO extends PageParam {
35 35 @Schema(description = "微信", example = "zzZ98373")
36 36 private String wechat;
37 37  
38   - /**
39   - * 场景类型,为 null 时则表示全部
40   - */
41 38 @Schema(description = "场景类型", example = "1")
42 39 @InEnum(CrmSceneTypeEnum.class)
43   - private Integer sceneType;
  40 + private Integer sceneType; // 场景类型,为 null 时则表示全部
44 41  
45 42 @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
46 43 private Boolean pool; // null 则表示为不是公海数据
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractPageReqVO.java
... ... @@ -26,14 +26,11 @@ public class CrmContractPageReqVO extends PageParam {
26 26 @Schema(description = "商机编号", example = "10864")
27 27 private Long businessId;
28 28  
29   - /**
30   - * 场景类型,为 null 时则表示全部
31   - */
32 29 @Schema(description = "场景类型", example = "1")
33 30 @InEnum(CrmSceneTypeEnum.class)
34   - private Integer sceneType;
  31 + private Integer sceneType; // 场景类型,为 null 时则表示全部
35 32  
36 33 @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
37   - private Boolean pool; // null 则表示为不是公海数据
  34 + private Boolean pool; // null 则表示为不是公海数据 TODO @puhui999:合同没有公海。目前只有【客户】【线索】有公海,其它都没
38 35  
39 36 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPageReqVO.java
... ... @@ -29,12 +29,9 @@ public class CrmCustomerPageReqVO extends PageParam {
29 29 @Schema(description = "客户来源", example = "1")
30 30 private Integer source;
31 31  
32   - /**
33   - * 场景类型,为 null 时则表示全部
34   - */
35 32 @Schema(description = "场景类型", example = "1")
36 33 @InEnum(CrmSceneTypeEnum.class)
37   - private Integer sceneType;
  34 + private Integer sceneType; // 场景类型,为 null 时则表示全部
38 35  
39 36 @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
40 37 private Boolean pool; // null 则表示为不是公海数据
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/plan/CrmReceivablePlanPageReqVO.java
... ... @@ -21,12 +21,9 @@ public class CrmReceivablePlanPageReqVO extends PageParam {
21 21 @Schema(description = "合同名称", example = "3473")
22 22 private Long contractId;
23 23  
24   - /**
25   - * 场景类型,为 null 时则表示全部
26   - */
27 24 @Schema(description = "场景类型", example = "1")
28 25 @InEnum(CrmSceneTypeEnum.class)
29   - private Integer sceneType;
  26 + private Integer sceneType; // 场景类型,为 null 时则表示全部
30 27  
31 28 @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
32 29 private Boolean pool; // null 则表示为不是公海数据
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/receivable/CrmReceivablePageReqVO.java
... ... @@ -23,12 +23,9 @@ public class CrmReceivablePageReqVO extends PageParam {
23 23 @Schema(description = "客户编号", example = "4963")
24 24 private Long customerId;
25 25  
26   - /**
27   - * 场景类型,为 null 时则表示全部
28   - */
29 26 @Schema(description = "场景类型", example = "1")
30 27 @InEnum(CrmSceneTypeEnum.class)
31   - private Integer sceneType;
  28 + private Integer sceneType; // 场景类型,为 null 时则表示全部
32 29  
33 30 @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
34 31 private Boolean pool; // null 则表示为不是公海数据
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/package-info.java 0 → 100644
  1 +/**
  2 + * 提供 RESTful API 给前端:
  3 + * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目
  4 + * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分
  5 + */
  6 +package cn.iocoder.yudao.module.crm.controller;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java
... ... @@ -38,9 +38,7 @@ public interface CrmBusinessConvert {
38 38  
39 39 List<CrmBusinessExcelVO> convertList02(List<CrmBusinessDO> list);
40 40  
41   - @Mappings({
42   - @Mapping(target = "bizId", source = "reqVO.id")
43   - })
  41 + @Mapping(target = "bizId", source = "reqVO.id")
44 42 CrmPermissionTransferReqBO convert(CrmBusinessTransferReqVO reqVO, Long userId);
45 43  
46 44 default PageResult<CrmBusinessRespVO> convertPage(PageResult<CrmBusinessDO> page, List<CrmCustomerDO> customerList,
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java
... ... @@ -54,9 +54,7 @@ public interface CrmCustomerConvert {
54 54  
55 55 List<CrmCustomerExcelVO> convertList02(List<CrmCustomerDO> list);
56 56  
57   - @Mappings({
58   - @Mapping(target = "bizId", source = "reqVO.id")
59   - })
  57 + @Mapping(target = "bizId", source = "reqVO.id")
60 58 CrmPermissionTransferReqBO convert(CrmCustomerTransferReqVO reqVO, Long userId);
61 59  
62 60 PageResult<CrmCustomerRespVO> convertPage(PageResult<CrmCustomerDO> page);
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java
... ... @@ -28,22 +28,23 @@ public interface CrmBusinessMapper extends BaseMapperX&lt;CrmBusinessDO&gt; {
28 28 }
29 29  
30 30 default PageResult<CrmBusinessDO> selectPage(CrmBusinessPageReqVO pageReqVO, Long userId) {
31   - MPJLambdaWrapperX<CrmBusinessDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
32   - // 构建数据权限连表条件
33   - CrmQueryWrapperUtils.builderPageQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_BUSINESS.getType(), CrmBusinessDO::getId,
  31 + MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>();
  32 + // 拼接数据权限的查询条件
  33 + CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), CrmBusinessDO::getId,
34 34 userId, pageReqVO.getSceneType(), pageReqVO.getPool());
35   - mpjLambdaWrapperX.selectAll(CrmBusinessDO.class)
  35 + // 拼接自身的查询条件
  36 + query.selectAll(CrmBusinessDO.class)
36 37 .eqIfPresent(CrmBusinessDO::getCustomerId, pageReqVO.getCustomerId()) // 指定客户编号
37 38 .likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName())
38 39 .orderByDesc(CrmBusinessDO::getId);
39   - return selectJoinPage(pageReqVO, CrmBusinessDO.class, mpjLambdaWrapperX);
  40 + return selectJoinPage(pageReqVO, CrmBusinessDO.class, query);
40 41 }
41 42  
42 43 default List<CrmBusinessDO> selectBatchIds(Collection<Long> ids, Long userId) {
43   - MPJLambdaWrapperX<CrmBusinessDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
44   - // 构建数据权限连表条件
45   - CrmQueryWrapperUtils.builderListQueryBatch(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_BUSINESS.getType(), ids, userId);
46   - return selectJoinList(CrmBusinessDO.class, mpjLambdaWrapperX);
  44 + MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>();
  45 + // 拼接数据权限的查询条件
  46 + CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), ids, userId);
  47 + return selectJoinList(CrmBusinessDO.class, query);
47 48 }
48 49  
49 50 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/CrmClueMapper.java
... ... @@ -28,23 +28,24 @@ public interface CrmClueMapper extends BaseMapperX&lt;CrmClueDO&gt; {
28 28 }
29 29  
30 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,
  31 + MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
  32 + // 拼接数据权限的查询条件
  33 + CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_LEADS.getType(), CrmClueDO::getId,
34 34 userId, pageReqVO.getSceneType(), pageReqVO.getPool());
35   - mpjLambdaWrapperX.selectAll(CrmClueDO.class)
  35 + // 拼接自身的查询条件
  36 + query.selectAll(CrmClueDO.class)
36 37 .likeIfPresent(CrmClueDO::getName, pageReqVO.getName())
37 38 .likeIfPresent(CrmClueDO::getTelephone, pageReqVO.getTelephone())
38 39 .likeIfPresent(CrmClueDO::getMobile, pageReqVO.getMobile())
39 40 .orderByDesc(CrmClueDO::getId);
40   - return selectJoinPage(pageReqVO, CrmClueDO.class, mpjLambdaWrapperX);
  41 + return selectJoinPage(pageReqVO, CrmClueDO.class, query);
41 42 }
42 43  
43 44 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);
  45 + MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
  46 + // 拼接数据权限的查询条件
  47 + CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_LEADS.getType(), ids, userId);
  48 + return selectJoinList(CrmClueDO.class, query);
48 49 }
49 50  
50 51 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java
... ... @@ -28,11 +28,12 @@ public interface CrmContactMapper extends BaseMapperX&lt;CrmContactDO&gt; {
28 28 }
29 29  
30 30 default PageResult<CrmContactDO> selectPage(CrmContactPageReqVO pageReqVO, Long userId) {
31   - MPJLambdaWrapperX<CrmContactDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
32   - // 构建数据权限连表条件
33   - CrmQueryWrapperUtils.builderPageQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), CrmContactDO::getId,
  31 + MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>();
  32 + // 拼接数据权限的查询条件
  33 + CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_CONTACT.getType(), CrmContactDO::getId,
34 34 userId, pageReqVO.getSceneType(), pageReqVO.getPool());
35   - mpjLambdaWrapperX.selectAll(CrmContactDO.class)
  35 + // 拼接自身的查询条件
  36 + query.selectAll(CrmContactDO.class)
36 37 .eqIfPresent(CrmContactDO::getCustomerId, pageReqVO.getCustomerId()) // 指定客户编号
37 38 .likeIfPresent(CrmContactDO::getName, pageReqVO.getName())
38 39 .eqIfPresent(CrmContactDO::getMobile, pageReqVO.getMobile())
... ... @@ -41,14 +42,14 @@ public interface CrmContactMapper extends BaseMapperX&lt;CrmContactDO&gt; {
41 42 .eqIfPresent(CrmContactDO::getQq, pageReqVO.getQq())
42 43 .eqIfPresent(CrmContactDO::getWechat, pageReqVO.getWechat())
43 44 .orderByDesc(CrmContactDO::getId);
44   - return selectJoinPage(pageReqVO, CrmContactDO.class, mpjLambdaWrapperX);
  45 + return selectJoinPage(pageReqVO, CrmContactDO.class, query);
45 46 }
46 47  
47 48 default List<CrmContactDO> selectBatchIds(Collection<Long> ids, Long userId) {
48   - MPJLambdaWrapperX<CrmContactDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
49   - // 构建数据权限连表条件
50   - CrmQueryWrapperUtils.builderListQueryBatch(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId);
51   - return selectJoinList(CrmContactDO.class, mpjLambdaWrapperX);
  49 + MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>();
  50 + // 拼接数据权限的查询条件
  51 + CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, userId);
  52 + return selectJoinList(CrmContactDO.class, query);
52 53 }
53 54  
54 55 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java
... ... @@ -28,24 +28,25 @@ public interface CrmCustomerMapper extends BaseMapperX&lt;CrmCustomerDO&gt; {
28 28 }
29 29  
30 30 default PageResult<CrmCustomerDO> selectPage(CrmCustomerPageReqVO pageReqVO, Long userId) {
31   - MPJLambdaWrapperX<CrmCustomerDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
32   - // 构建数据权限连表条件
33   - CrmQueryWrapperUtils.builderPageQuery(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CUSTOMER.getType(), CrmCustomerDO::getId,
  31 + MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
  32 + // 拼接数据权限的查询条件
  33 + CrmQueryWrapperUtils.builderPageQuery(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), CrmCustomerDO::getId,
34 34 userId, pageReqVO.getSceneType(), pageReqVO.getPool());
35   - mpjLambdaWrapperX.selectAll(CrmCustomerDO.class)
  35 + // 拼接自身的查询条件
  36 + query.selectAll(CrmCustomerDO.class)
36 37 .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName())
37 38 .eqIfPresent(CrmCustomerDO::getMobile, pageReqVO.getMobile())
38 39 .eqIfPresent(CrmCustomerDO::getIndustryId, pageReqVO.getIndustryId())
39 40 .eqIfPresent(CrmCustomerDO::getLevel, pageReqVO.getLevel())
40 41 .eqIfPresent(CrmCustomerDO::getSource, pageReqVO.getSource());
41   - return selectJoinPage(pageReqVO, CrmCustomerDO.class, mpjLambdaWrapperX);
  42 + return selectJoinPage(pageReqVO, CrmCustomerDO.class, query);
42 43 }
43 44  
44 45 default List<CrmCustomerDO> selectBatchIds(Collection<Long> ids, Long userId) {
45   - MPJLambdaWrapperX<CrmCustomerDO> mpjLambdaWrapperX = new MPJLambdaWrapperX<>();
46   - // 构建数据权限连表条件
47   - CrmQueryWrapperUtils.builderListQueryBatch(mpjLambdaWrapperX, CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, userId);
48   - return selectJoinList(CrmCustomerDO.class, mpjLambdaWrapperX);
  46 + MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
  47 + // 拼接数据权限的查询条件
  48 + CrmQueryWrapperUtils.builderListQueryBatch(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, userId);
  49 + return selectJoinList(CrmCustomerDO.class, query);
49 50 }
50 51  
51 52 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
... ... @@ -112,9 +112,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
112 112  
113 113 @Override
114 114 public PageResult<CrmBusinessDO> getBusinessPageByCustomer(CrmBusinessPageReqVO pageReqVO, Long userId) {
115   - // 校验客户存在
  115 + // 校验客户存在 TODO @puhui999:这里不校验
116 116 customerService.validateCustomer(pageReqVO.getCustomerId());
117   -
  117 + // TODO @puhui999:感觉这里貌似不太复用用 selectPage,因为他可能没商机权限,只是因为能看 customer,所以可以看到列表
118 118 return businessMapper.selectPage(pageReqVO, userId);
119 119 }
120 120  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/clue/CrmClueServiceImpl.java
... ... @@ -35,6 +35,7 @@ public class CrmClueServiceImpl implements CrmClueService {
35 35  
36 36 @Resource
37 37 private CrmClueMapper clueMapper;
  38 +
38 39 @Resource
39 40 private CrmCustomerService customerService;
40 41 @Resource
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/CrmContactServiceImpl.java
... ... @@ -137,7 +137,7 @@ public class CrmContactServiceImpl implements CrmContactService {
137 137 public PageResult<CrmContactDO> getContactPageByCustomerId(CrmContactPageReqVO pageVO, Long userId) {
138 138 // 校验用户存在
139 139 customerService.validateCustomer(pageVO.getCustomerId());
140   -
  140 + // TODO @puhui999:getBusinessPageByCustomer 同理
141 141 return contactMapper.selectPage(pageVO, userId);
142 142 }
143 143  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
... ... @@ -126,9 +126,9 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
126 126 @Override
127 127 @Transactional(rollbackFor = Exception.class)
128 128 public void deletePermission(Integer bizType, Long bizId, Integer level) {
  129 + // 校验存在
129 130 List<CrmPermissionDO> permissions = crmPermissionMapper.selectListByBizTypeAndBizIdAndLevel(
130 131 bizType, bizId, level);
131   - // 校验存在
132 132 if (CollUtil.isEmpty(permissions)) {
133 133 throw exception(CRM_PERMISSION_NOT_EXISTS);
134 134 }
... ... @@ -139,6 +139,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
139 139  
140 140 @Override
141 141 public void deletePermission(Integer bizType, Long bizId) {
  142 + // TODO @puhui999:这种直接写条件删除;不需要先查询,再删除
142 143 List<CrmPermissionDO> permissionList = crmPermissionMapper.selectByBizTypeAndBizId(bizType, bizId);
143 144 if (CollUtil.isEmpty(permissionList)) {
144 145 return;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmQueryWrapperUtils.java
... ... @@ -26,67 +26,74 @@ public class CrmQueryWrapperUtils {
26 26 /**
27 27 * 构造 CRM 数据类型数据分页查询条件
28 28 *
29   - * @param queryMapper 连表查询对象
  29 + * @param query 连表查询对象
30 30 * @param bizType 数据类型 {@link CrmBizTypeEnum}
31 31 * @param bizId 数据编号
32 32 * @param userId 用户编号
33 33 * @param sceneType 场景类型
34 34 * @param pool 公海
35 35 */
36   - public static <T extends MPJLambdaWrapper<?>, S> void builderPageQuery(
37   - T queryMapper, Integer bizType, SFunction<S, ?> bizId, Long userId, Integer sceneType, Boolean pool) {
  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) {
38 40 // 1. 构建数据权限连表条件
39 41 if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE)) { // 管理员不需要数据权限
40   - queryMapper.innerJoin(CrmPermissionDO.class, on ->
  42 + query.innerJoin(CrmPermissionDO.class, on ->
41 43 on.eq(CrmPermissionDO::getBizType, bizType).eq(CrmPermissionDO::getBizId, bizId)
42 44 .eq(CrmPermissionDO::getUserId, userId));
43 45 }
44   - // 1.2 场景一:我负责的数据
  46 + // 2.1 场景一:我负责的数据
45 47 if (CrmSceneTypeEnum.isOwner(sceneType)) {
46   - queryMapper.eq("owner_user_id", userId);
  48 + query.eq("owner_user_id", userId);
47 49 }
48   - // 1.3 场景一:我参与的数据
  50 + // 2.2 场景二:我参与的数据
  51 + // TODO @puhui999:参与,指的是有读写权限噢;可以把 1. 的合并到 2.2 里;因为 2.1 不需要;
49 52 if (CrmSceneTypeEnum.isInvolved(sceneType)) {
50   - queryMapper.ne("owner_user_id", userId);
  53 + query.ne("owner_user_id", userId);
51 54 }
52   - // 1.4 场景二:下属负责的数据
  55 + // 2.3 场景三:下属负责的数据
53 56 if (CrmSceneTypeEnum.isSubordinate(sceneType)) {
54 57 List<AdminUserRespDTO> subordinateUsers = getAdminUserApi().getUserListBySubordinate(userId);
  58 + // TODO @puhui999:如果为空,不拼接,就是查询了所有数据呀?
55 59 if (CollUtil.isNotEmpty(subordinateUsers)) {
56   - queryMapper.in("owner_user_id", convertSet(subordinateUsers, AdminUserRespDTO::getId));
  60 + query.in("owner_user_id", convertSet(subordinateUsers, AdminUserRespDTO::getId));
57 61 }
58 62 }
59 63  
60 64 // 2. 拼接公海的查询条件
61 65 if (ObjUtil.equal(pool, Boolean.TRUE)) { // 情况一:公海
62   - queryMapper.isNull("owner_user_id");
  66 + query.isNull("owner_user_id");
63 67 } else { // 情况二:不是公海
64   - queryMapper.isNotNull("owner_user_id");
  68 + query.isNotNull("owner_user_id");
65 69 }
66 70 }
67 71  
68 72 /**
69 73 * 构造 CRM 数据类型批量数据查询条件
70 74 *
71   - * @param queryMapper 连表查询对象
  75 + * @param query 连表查询对象
72 76 * @param bizType 数据类型 {@link CrmBizTypeEnum}
73 77 * @param bizIds 数据编号
74 78 * @param userId 用户编号
75 79 */
76   - public static <T extends MPJLambdaWrapper<?>, S> void builderListQueryBatch(
77   - T queryMapper, Integer bizType, Collection<Long> bizIds, Long userId) {
78   - // 1. 构建数据权限连表条件
  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 简单点
79 84 if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE)) { // 管理员不需要数据权限
80   - queryMapper.innerJoin(CrmPermissionDO.class, on ->
  85 + query.innerJoin(CrmPermissionDO.class, on ->
81 86 on.eq(CrmPermissionDO::getBizType, bizType).in(CrmPermissionDO::getBizId, bizIds)
82 87 .in(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId));
83 88 }
84 89 }
85 90  
  91 + // TODO @puhui999:需要加个变量,不用每次都拿哈;
86 92 private static AdminUserApi getAdminUserApi() {
87 93 return SpringUtil.getBean(AdminUserApi.class);
88 94 }
89 95  
  96 + // TODO @puhui999:需要实现;
90 97 /**
91 98 * 校验用户是否是管理员
92 99 *
... ...
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java
... ... @@ -22,7 +22,6 @@ public interface AdminUserApi {
22 22 */
23 23 AdminUserRespDTO getUser(Long id);
24 24  
25   - // TODO @puhui999:这里返回 List<AdminUserRespDTO> 方法名可以改成 getUserListBySubordinate
26 25 /**
27 26 * 通过用户 ID 查询用户下属
28 27 *
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java
... ... @@ -39,13 +39,11 @@ public class AdminUserApiImpl implements AdminUserApi {
39 39  
40 40 @Override
41 41 public List<AdminUserRespDTO> getUserListBySubordinate(Long userId) {
42   - // 1. 获取用户信息
  42 + // 1.1 获取用户负责的部门
43 43 AdminUserDO user = userService.getUser(userId);
44 44 if (user == null) {
45 45 return Collections.emptyList();
46 46 }
47   -
48   - // 2.1 获取用户负责的部门
49 47 ArrayList<Long> deptIds = new ArrayList<>();
50 48 DeptDO dept = deptService.getDept(user.getDeptId());
51 49 if (dept == null) {
... ... @@ -54,13 +52,14 @@ public class AdminUserApiImpl implements AdminUserApi {
54 52 if (ObjUtil.notEqual(dept.getLeaderUserId(), userId)) { // 校验为负责人
55 53 return Collections.emptyList();
56 54 }
57   - deptIds.add(dept.getId()); // 加入此部门
58   - // 2.2 获取所有子部门
  55 + deptIds.add(dept.getId());
  56 + // 1.2 获取所有子部门
59 57 List<DeptDO> childDeptList = deptService.getChildDeptList(dept.getId());
60 58 if (CollUtil.isNotEmpty(childDeptList)) {
61 59 deptIds.addAll(convertSet(childDeptList, DeptDO::getId));
62 60 }
63   - // 2.3 获取用户信息
  61 +
  62 + // 2. 获取部门对应的用户信息
64 63 List<AdminUserDO> users = userService.getUserListByDeptIds(deptIds);
65 64 users.removeIf(item -> ObjUtil.equal(item.getId(), userId)); // 排除自己
66 65 return BeanUtils.toBean(users, AdminUserRespDTO.class);
... ...
yudao-server/pom.xml
... ... @@ -37,11 +37,11 @@
37 37 </dependency>
38 38  
39 39 <!-- 会员中心。默认注释,保证编译速度 -->
40   -<!-- <dependency>-->
41   -<!-- <groupId>cn.iocoder.boot</groupId>-->
42   -<!-- <artifactId>yudao-module-member-biz</artifactId>-->
43   -<!-- <version>${revision}</version>-->
44   -<!-- </dependency>-->
  40 + <dependency>
  41 + <groupId>cn.iocoder.boot</groupId>
  42 + <artifactId>yudao-module-member-biz</artifactId>
  43 + <version>${revision}</version>
  44 + </dependency>
45 45  
46 46 <!-- 数据报表。默认注释,保证编译速度 -->
47 47 <!-- <dependency>-->
... ... @@ -56,11 +56,11 @@
56 56 <!-- <version>${revision}</version>-->
57 57 <!-- </dependency>-->
58 58 <!-- 支付服务。默认注释,保证编译速度 -->
59   -<!-- <dependency>-->
60   -<!-- <groupId>cn.iocoder.boot</groupId>-->
61   -<!-- <artifactId>yudao-module-pay-biz</artifactId>-->
62   -<!-- <version>${revision}</version>-->
63   -<!-- </dependency>-->
  59 + <dependency>
  60 + <groupId>cn.iocoder.boot</groupId>
  61 + <artifactId>yudao-module-pay-biz</artifactId>
  62 + <version>${revision}</version>
  63 + </dependency>
64 64  
65 65 <!-- 微信公众号模块。默认注释,保证编译速度 -->
66 66 <!-- <dependency>-->
... ... @@ -70,26 +70,26 @@
70 70 <!-- </dependency>-->
71 71  
72 72 <!-- 商城相关模块。默认注释,保证编译速度-->
73   -<!-- <dependency>-->
74   -<!-- <groupId>cn.iocoder.boot</groupId>-->
75   -<!-- <artifactId>yudao-module-promotion-biz</artifactId>-->
76   -<!-- <version>${revision}</version>-->
77   -<!-- </dependency>-->
78   -<!-- <dependency>-->
79   -<!-- <groupId>cn.iocoder.boot</groupId>-->
80   -<!-- <artifactId>yudao-module-product-biz</artifactId>-->
81   -<!-- <version>${revision}</version>-->
82   -<!-- </dependency>-->
83   -<!-- <dependency>-->
84   -<!-- <groupId>cn.iocoder.boot</groupId>-->
85   -<!-- <artifactId>yudao-module-trade-biz</artifactId>-->
86   -<!-- <version>${revision}</version>-->
87   -<!-- </dependency>-->
88   -<!-- <dependency>-->
89   -<!-- <groupId>cn.iocoder.boot</groupId>-->
90   -<!-- <artifactId>yudao-module-statistics-biz</artifactId>-->
91   -<!-- <version>${revision}</version>-->
92   -<!-- </dependency>-->
  73 + <dependency>
  74 + <groupId>cn.iocoder.boot</groupId>
  75 + <artifactId>yudao-module-promotion-biz</artifactId>
  76 + <version>${revision}</version>
  77 + </dependency>
  78 + <dependency>
  79 + <groupId>cn.iocoder.boot</groupId>
  80 + <artifactId>yudao-module-product-biz</artifactId>
  81 + <version>${revision}</version>
  82 + </dependency>
  83 + <dependency>
  84 + <groupId>cn.iocoder.boot</groupId>
  85 + <artifactId>yudao-module-trade-biz</artifactId>
  86 + <version>${revision}</version>
  87 + </dependency>
  88 + <dependency>
  89 + <groupId>cn.iocoder.boot</groupId>
  90 + <artifactId>yudao-module-statistics-biz</artifactId>
  91 + <version>${revision}</version>
  92 + </dependency>
93 93  
94 94 <!-- CRM 相关模块。默认注释,保证编译速度 -->
95 95 <dependency>
... ...