Commit 3f8fa6b1bcdb45fff1a25d82d6ecb56a5017b399

Authored by YunaiV
1 parent a8f6a3d3

✨ CRM:简化 CRM 数据权限的实现

Showing 14 changed files with 56 additions and 134 deletions
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java
... ... @@ -10,6 +10,8 @@ import java.util.Arrays;
10 10 /**
11 11 * CRM 数据权限级别枚举
12 12 *
  13 + * OWNER > WRITE > READ
  14 + *
13 15 * @author HUIHUI
14 16 */
15 17 @Getter
... ... @@ -17,8 +19,8 @@ import java.util.Arrays;
17 19 public enum CrmPermissionLevelEnum implements IntArrayValuable {
18 20  
19 21 OWNER(1, "负责人"),
20   - READ(2, "读"),
21   - WRITE(3, "写");
  22 + READ(2, "只读"),
  23 + WRITE(3, "读写");
22 24  
23 25 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmPermissionLevelEnum::getLevel).toArray();
24 26  
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionRoleCodeEnum.java deleted
1   -package cn.iocoder.yudao.module.crm.enums.permission;
2   -
3   -import lombok.AllArgsConstructor;
4   -import lombok.Getter;
5   -
6   -/**
7   - * Crm 数据权限角色枚举
8   - *
9   - * @author HUIHUI
10   - */
11   -@Getter
12   -@AllArgsConstructor
13   -public enum CrmPermissionRoleCodeEnum {
14   -
15   - CRM_ADMIN("crm_admin", "CRM 管理员");
16   -
17   - /**
18   - * 角色标识
19   - */
20   - private String code;
21   - /**
22   - * 角色名称
23   - */
24   - private String name;
25   -
26   -}
27   -
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java
... ... @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
7 7 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessPageReqVO;
8 8 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
9 9 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
10   -import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
  10 +import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
11 11 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
12 12 import org.apache.ibatis.annotations.Mapper;
13 13  
... ... @@ -45,7 +45,7 @@ public interface CrmBusinessMapper extends BaseMapperX<CrmBusinessDO> {
45 45 default PageResult<CrmBusinessDO> selectPage(CrmBusinessPageReqVO pageReqVO, Long userId) {
46 46 MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>();
47 47 // 拼接数据权限的查询条件
48   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(),
  48 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(),
49 49 CrmBusinessDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
50 50 // 拼接自身的查询条件
51 51 query.selectAll(CrmBusinessDO.class)
... ... @@ -57,7 +57,7 @@ public interface CrmBusinessMapper extends BaseMapperX&lt;CrmBusinessDO&gt; {
57 57 default List<CrmBusinessDO> selectBatchIds(Collection<Long> ids, Long userId) {
58 58 MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>();
59 59 // 拼接数据权限的查询条件
60   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), ids, userId);
  60 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), ids, userId);
61 61 // 拼接自身的查询条件
62 62 query.selectAll(CrmBusinessDO.class).in(CrmBusinessDO::getId, ids).orderByDesc(CrmBusinessDO::getId);
63 63 return selectJoinList(CrmBusinessDO.class, query);
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/CrmClueMapper.java
... ... @@ -7,7 +7,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.clue.vo.CrmCluePageReqVO;
7 7 import cn.iocoder.yudao.module.crm.dal.dataobject.clue.CrmClueDO;
8 8 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
9 9 import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
10   -import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
  10 +import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
11 11 import org.apache.ibatis.annotations.Mapper;
12 12  
13 13 import java.util.Collection;
... ... @@ -24,7 +24,7 @@ public interface CrmClueMapper extends BaseMapperX&lt;CrmClueDO&gt; {
24 24 default PageResult<CrmClueDO> selectPage(CrmCluePageReqVO pageReqVO, Long userId) {
25 25 MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
26 26 // 拼接数据权限的查询条件
27   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(),
  27 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(),
28 28 CrmClueDO::getId, userId, pageReqVO.getSceneType(), pageReqVO.getPool());
29 29 // 拼接自身的查询条件
30 30 query.selectAll(CrmClueDO.class)
... ... @@ -43,7 +43,7 @@ public interface CrmClueMapper extends BaseMapperX&lt;CrmClueDO&gt; {
43 43 default List<CrmClueDO> selectBatchIds(Collection<Long> ids, Long userId) {
44 44 MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
45 45 // 拼接数据权限的查询条件
46   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(), ids, userId);
  46 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(), ids, userId);
47 47 query.selectAll(CrmClueDO.class).in(CrmClueDO::getId, ids).orderByDesc(CrmClueDO::getId);
48 48 // 拼接自身的查询条件
49 49 return selectJoinList(CrmClueDO.class, query);
... ... @@ -52,7 +52,7 @@ public interface CrmClueMapper extends BaseMapperX&lt;CrmClueDO&gt; {
52 52 default Long selectCountByFollow(Long userId) {
53 53 MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>();
54 54 // 我负责的 + 非公海
55   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(),
  55 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(),
56 56 CrmClueDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
57 57 // 未跟进 + 未转化
58 58 query.eq(CrmClueDO::getFollowUpStatus, false)
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java
... ... @@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
7 7 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.CrmContactPageReqVO;
8 8 import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
9 9 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
10   -import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
  10 +import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
11 11 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
12 12 import org.apache.ibatis.annotations.Mapper;
13 13  
... ... @@ -55,7 +55,7 @@ public interface CrmContactMapper extends BaseMapperX&lt;CrmContactDO&gt; {
55 55 default PageResult<CrmContactDO> selectPage(CrmContactPageReqVO pageReqVO, Long userId) {
56 56 MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>();
57 57 // 拼接数据权限的查询条件
58   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(),
  58 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(),
59 59 CrmContactDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
60 60 // 拼接自身的查询条件
61 61 query.selectAll(CrmContactDO.class)
... ... @@ -72,7 +72,7 @@ public interface CrmContactMapper extends BaseMapperX&lt;CrmContactDO&gt; {
72 72 default List<CrmContactDO> selectBatchIds(Collection<Long> ids, Long ownerUserId) {
73 73 MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>();
74 74 // 拼接数据权限的查询条件
75   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, ownerUserId);
  75 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(), ids, ownerUserId);
76 76 query.selectAll(CrmContactDO.class).in(CrmContactDO::getId, ids).orderByDesc(CrmContactDO::getId);
77 77 return selectJoinList(CrmContactDO.class, query);
78 78 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
... ... @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
10 10 import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;
11 11 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
12 12 import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
13   -import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
  13 +import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
14 14 import org.apache.ibatis.annotations.Mapper;
15 15  
16 16 import java.time.LocalDateTime;
... ... @@ -42,7 +42,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
42 42 default PageResult<CrmContractDO> selectPage(CrmContractPageReqVO pageReqVO, Long userId) {
43 43 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
44 44 // 拼接数据权限的查询条件
45   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
  45 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
46 46 CrmContractDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
47 47 // 拼接自身的查询条件
48 48 query.selectAll(CrmContractDO.class)
... ... @@ -71,7 +71,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
71 71 default List<CrmContractDO> selectBatchIds(Collection<Long> ids, Long userId) {
72 72 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
73 73 // 构建数据权限连表条件
74   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), ids, userId);
  74 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), ids, userId);
75 75 // 拼接自身的查询条件
76 76 query.selectAll(CrmContractDO.class).in(CrmContractDO::getId, ids).orderByDesc(CrmContractDO::getId);
77 77 return selectJoinList(CrmContractDO.class, query);
... ... @@ -88,7 +88,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
88 88 default Long selectCheckContractCount(Long userId) {
89 89 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
90 90 // 我负责的 + 非公海
91   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
  91 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
92 92 CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
93 93 // 未提交 or 审核不通过
94 94 query.in(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.DRAFT.getStatus(), CrmAuditStatusEnum.REJECT.getStatus());
... ... @@ -98,7 +98,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
98 98 default Long selectEndContractCount(Long userId) {
99 99 MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>();
100 100 // 我负责的 + 非公海
101   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
  101 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(),
102 102 CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
103 103 // 即将到期
104 104 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java
... ... @@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
12 12 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO;
13 13 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
14 14 import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
15   -import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
  15 +import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
16 16 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
17 17 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
18 18 import org.apache.ibatis.annotations.Mapper;
... ... @@ -52,7 +52,7 @@ public interface CrmCustomerMapper extends BaseMapperX&lt;CrmCustomerDO&gt; {
52 52 default PageResult<CrmCustomerDO> selectPage(CrmCustomerPageReqVO pageReqVO, Long ownerUserId) {
53 53 MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
54 54 // 拼接数据权限的查询条件
55   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
  55 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
56 56 CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType(), pageReqVO.getPool());
57 57 // 拼接自身的查询条件
58 58 query.selectAll(CrmCustomerDO.class)
... ... @@ -84,7 +84,7 @@ public interface CrmCustomerMapper extends BaseMapperX&lt;CrmCustomerDO&gt; {
84 84 default List<CrmCustomerDO> selectBatchIds(Collection<Long> ids, Long ownerUserId) {
85 85 MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
86 86 // 拼接数据权限的查询条件
87   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, ownerUserId);
  87 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, ownerUserId);
88 88 // 拼接自身的查询条件
89 89 query.selectAll(CrmCustomerDO.class).in(CrmCustomerDO::getId, ids).orderByDesc(CrmCustomerDO::getId);
90 90 return selectJoinList(CrmCustomerDO.class, query);
... ... @@ -113,7 +113,7 @@ public interface CrmCustomerMapper extends BaseMapperX&lt;CrmCustomerDO&gt; {
113 113 Long ownerUserId) {
114 114 MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
115 115 // 拼接数据权限的查询条件
116   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
  116 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
117 117 CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType(), null);
118 118  
119 119 // 未锁定 + 未成交
... ... @@ -167,7 +167,7 @@ public interface CrmCustomerMapper extends BaseMapperX&lt;CrmCustomerDO&gt; {
167 167 default Long selectCountByTodayContact(Long ownerUserId) {
168 168 MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
169 169 // 我负责的 + 非公海
170   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
  170 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
171 171 CrmCustomerDO::getId, ownerUserId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
172 172 // 今天需联系
173 173 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
... ... @@ -179,7 +179,7 @@ public interface CrmCustomerMapper extends BaseMapperX&lt;CrmCustomerDO&gt; {
179 179 default Long selectCountByFollow(Long ownerUserId) {
180 180 MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>();
181 181 // 我负责的 + 非公海
182   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
  182 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(),
183 183 CrmCustomerDO::getId, ownerUserId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
184 184 // 未跟进
185 185 query.eq(CrmClueDO::getFollowUpStatus, false);
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java
... ... @@ -10,8 +10,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO;
10 10 import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;
11 11 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
12 12 import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
13   -import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
14   -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  13 +import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
15 14 import org.apache.ibatis.annotations.Mapper;
16 15  
17 16 import java.util.Collection;
... ... @@ -25,12 +24,6 @@ import java.util.List;
25 24 @Mapper
26 25 public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> {
27 26  
28   - default int updateOwnerUserIdById(Long id, Long ownerUserId) {
29   - return update(new LambdaUpdateWrapper<CrmReceivableDO>()
30   - .eq(CrmReceivableDO::getId, id)
31   - .set(CrmReceivableDO::getOwnerUserId, ownerUserId));
32   - }
33   -
34 27 default PageResult<CrmReceivableDO> selectPageByCustomerId(CrmReceivablePageReqVO reqVO) {
35 28 return selectPage(reqVO, new LambdaQueryWrapperX<CrmReceivableDO>()
36 29 .eq(CrmReceivableDO::getCustomerId, reqVO.getCustomerId()) // 必须传递
... ... @@ -42,7 +35,7 @@ public interface CrmReceivableMapper extends BaseMapperX&lt;CrmReceivableDO&gt; {
42 35 default PageResult<CrmReceivableDO> selectPage(CrmReceivablePageReqVO pageReqVO, Long userId) {
43 36 MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
44 37 // 拼接数据权限的查询条件
45   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(),
  38 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(),
46 39 CrmReceivableDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
47 40 // 拼接自身的查询条件
48 41 query.selectAll(CrmReceivableDO.class)
... ... @@ -56,7 +49,7 @@ public interface CrmReceivableMapper extends BaseMapperX&lt;CrmReceivableDO&gt; {
56 49 default List<CrmReceivableDO> selectBatchIds(Collection<Long> ids, Long userId) {
57 50 MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
58 51 // 拼接数据权限的查询条件
59   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(), ids, userId);
  52 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(), ids, userId);
60 53 // 拼接自身的查询条件
61 54 query.selectAll(CrmReceivableDO.class).in(CrmReceivableDO::getId, ids).orderByDesc(CrmReceivableDO::getId);
62 55 return selectJoinList(CrmReceivableDO.class, query);
... ... @@ -65,7 +58,7 @@ public interface CrmReceivableMapper extends BaseMapperX&lt;CrmReceivableDO&gt; {
65 58 default Long selectCheckReceivablesCount(Long userId) {
66 59 MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>();
67 60 // 我负责的 + 非公海
68   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(),
  61 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(),
69 62 CrmReceivableDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
70 63 // 未提交 or 审核不通过
71 64 query.in(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.DRAFT.getStatus(), CrmAuditStatusEnum.REJECT.getStatus());
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivablePlanMapper.java
... ... @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan.CrmReceiv
9 9 import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivablePlanDO;
10 10 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
11 11 import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
12   -import cn.iocoder.yudao.module.crm.util.CrmQueryWrapperUtils;
  12 +import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
13 13 import org.apache.ibatis.annotations.Mapper;
14 14  
15 15 import java.time.LocalDateTime;
... ... @@ -34,7 +34,7 @@ public interface CrmReceivablePlanMapper extends BaseMapperX&lt;CrmReceivablePlanDO
34 34 default PageResult<CrmReceivablePlanDO> selectPage(CrmReceivablePlanPageReqVO pageReqVO, Long userId) {
35 35 MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>();
36 36 // 拼接数据权限的查询条件
37   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(),
  37 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(),
38 38 CrmReceivablePlanDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE);
39 39 // 拼接自身的查询条件
40 40 query.selectAll(CrmReceivablePlanDO.class)
... ... @@ -64,7 +64,7 @@ public interface CrmReceivablePlanMapper extends BaseMapperX&lt;CrmReceivablePlanDO
64 64 default List<CrmReceivablePlanDO> selectBatchIds(Collection<Long> ids, Long userId) {
65 65 MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>();
66 66 // 拼接数据权限的查询条件
67   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(), ids, userId);
  67 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(), ids, userId);
68 68 // 拼接自身的查询条件
69 69 query.selectAll(CrmReceivablePlanDO.class).in(CrmReceivablePlanDO::getId, ids).orderByDesc(CrmReceivablePlanDO::getId);
70 70 return selectJoinList(CrmReceivablePlanDO.class, query);
... ... @@ -73,7 +73,7 @@ public interface CrmReceivablePlanMapper extends BaseMapperX&lt;CrmReceivablePlanDO
73 73 default Long selectRemindReceivablePlanCount(Long userId) {
74 74 MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>();
75 75 // 我负责的 + 非公海
76   - CrmQueryWrapperUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(),
  76 + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(),
77 77 CrmReceivablePlanDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE);
78 78 // TODO: @dhb52 需要配置 提前提醒天数
79 79 int REMIND_DAYS = 20;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/aop/CrmPermissionAspect.java
... ... @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
9 9 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
10 10 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
11 11 import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
12   -import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionUtils;
  12 +import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
13 13 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
14 14 import jakarta.annotation.Resource;
15 15 import lombok.extern.slf4j.Slf4j;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/permission/core/util/CrmPermissionUtils.java deleted
1   -package cn.iocoder.yudao.module.crm.framework.permission.core.util;
2   -
3   -import cn.hutool.extra.spring.SpringUtil;
4   -import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionRoleCodeEnum;
5   -import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
6   -
7   -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
8   -
9   -/**
10   - * 数据权限工具类
11   - *
12   - * @author HUIHUI
13   - */
14   -public class CrmPermissionUtils {
15   -
16   - /**
17   - * 校验用户是否是 CRM 管理员
18   - *
19   - * @return 是/否
20   - */
21   - public static boolean isCrmAdmin() {
22   - return SingletonManager.getPermissionApi().hasAnyRoles(getLoginUserId(), CrmPermissionRoleCodeEnum.CRM_ADMIN.getCode());
23   - }
24   -
25   - /**
26   - * 静态内部类实现单例获取
27   - *
28   - * @author HUIHUI
29   - */
30   - private static class SingletonManager {
31   -
32   - private static final PermissionApi PERMISSION_API = SpringUtil.getBean(PermissionApi.class);
33   -
34   - public static PermissionApi getPermissionApi() {
35   - return PERMISSION_API;
36   - }
37   -
38   - }
39   -
40   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
... ... @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
9 9 import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper;
10 10 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
11 11 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
12   -import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionUtils;
  12 +import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils;
13 13 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
14 14 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
15 15 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmQueryWrapperUtils.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java
... ... @@ -7,9 +7,10 @@ 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 9 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
10   -import cn.iocoder.yudao.module.crm.framework.permission.core.util.CrmPermissionUtils;
  10 +import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
11 11 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
12 12 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
  13 +import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
13 14 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
14 15 import com.github.yulichang.autoconfigure.MybatisPlusJoinProperties;
15 16 import com.github.yulichang.wrapper.MPJLambdaWrapper;
... ... @@ -18,13 +19,24 @@ import java.util.Collection;
18 19 import java.util.List;
19 20  
20 21 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  22 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
21 23  
22 24 /**
23   - * CRM 查询工具类
  25 + * 数据权限工具类
24 26 *
25 27 * @author HUIHUI
26 28 */
27   -public class CrmQueryWrapperUtils {
  29 +public class CrmPermissionUtils {
  30 +
  31 + /**
  32 + * 校验用户是否是 CRM 管理员
  33 + *
  34 + * @return 是/否
  35 + */
  36 + public static boolean isCrmAdmin() {
  37 + PermissionApi permissionApi = SpringUtil.getBean(PermissionApi.class);
  38 + return permissionApi.hasAnyRoles(getLoginUserId(), RoleCodeEnum.CRM_ADMIN.getCode());
  39 + }
28 40  
29 41 /**
30 42 * 构造 CRM 数据类型数据分页查询条件
... ... @@ -38,7 +50,8 @@ public class CrmQueryWrapperUtils {
38 50 */
39 51 public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId,
40 52 Long userId, Integer sceneType, Boolean pool) {
41   - final String ownerUserIdField = SingletonManager.getMybatisPlusJoinProperties().getTableAlias() + ".owner_user_id";
  53 + MybatisPlusJoinProperties mybatisPlusJoinProperties = SpringUtil.getBean(MybatisPlusJoinProperties.class);
  54 + final String ownerUserIdField = mybatisPlusJoinProperties.getTableAlias() + ".owner_user_id";
42 55 // 1. 构建数据权限连表条件
43 56 if (!CrmPermissionUtils.isCrmAdmin() && ObjUtil.notEqual(pool, Boolean.TRUE)) { // 管理员,公海不需要数据权限
44 57 query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType)
... ... @@ -56,7 +69,8 @@ public class CrmQueryWrapperUtils {
56 69 }
57 70 // 2.3 场景三:下属负责的数据
58 71 if (CrmSceneTypeEnum.isSubordinate(sceneType)) {
59   - List<AdminUserRespDTO> subordinateUsers = SingletonManager.getAdminUserApi().getUserListBySubordinate(userId);
  72 + AdminUserApi adminUserApi = SpringUtil.getBean(AdminUserApi.class);
  73 + List<AdminUserRespDTO> subordinateUsers = adminUserApi.getUserListBySubordinate(userId);
60 74 if (CollUtil.isEmpty(subordinateUsers)) {
61 75 query.eq(ownerUserIdField, -1); // 不返回任何结果
62 76 } else {
... ... @@ -81,7 +95,7 @@ public class CrmQueryWrapperUtils {
81 95 * @param userId 用户编号
82 96 */
83 97 public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, Integer bizType, Collection<Long> bizIds, Long userId) {
84   - if (CrmPermissionUtils.isCrmAdmin()) {// 管理员不需要数据权限
  98 + if (isCrmAdmin()) {// 管理员不需要数据权限
85 99 return;
86 100 }
87 101 query.innerJoin(CrmPermissionDO.class, on ->
... ... @@ -89,25 +103,4 @@ public class CrmQueryWrapperUtils {
89 103 .eq(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId));
90 104 }
91 105  
92   - /**
93   - * 静态内部类实现单例获取
94   - *
95   - * @author HUIHUI
96   - */
97   - private static class SingletonManager {
98   -
99   - private static final AdminUserApi ADMIN_USER_API = SpringUtil.getBean(AdminUserApi.class);
100   -
101   - private static final MybatisPlusJoinProperties MYBATIS_PLUS_JOIN_PROPERTIES = SpringUtil.getBean(MybatisPlusJoinProperties.class);
102   -
103   - public static AdminUserApi getAdminUserApi() {
104   - return ADMIN_USER_API;
105   - }
106   -
107   - public static MybatisPlusJoinProperties getMybatisPlusJoinProperties() {
108   - return MYBATIS_PLUS_JOIN_PROPERTIES;
109   - }
110   -
111   - }
112   -
113 106 }
... ...
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/permission/RoleCodeEnum.java
... ... @@ -13,6 +13,7 @@ public enum RoleCodeEnum {
13 13  
14 14 SUPER_ADMIN("super_admin", "超级管理员"),
15 15 TENANT_ADMIN("tenant_admin", "租户管理员"),
  16 + CRM_ADMIN("crm_admin", "CRM 管理员"); // CRM 系统专用
16 17 ;
17 18  
18 19 /**
... ...