Commit 7a8ffd9ccb6b8ee434ea79f917aa249b2a9a4694

Authored by puhui999
1 parent 91dd61ed

CRM-商机:完善获取权限过滤后的分页数据

Showing 14 changed files with 96 additions and 24 deletions
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java
... ... @@ -71,8 +71,7 @@ public class CrmBusinessController {
71 71 @Operation(summary = "获得商机分页")
72 72 @PreAuthorize("@ss.hasPermission('crm:business:query')")
73 73 public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPage(@Valid CrmBusinessPageReqVO pageVO) {
74   - PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(pageVO);
75   -
  74 + PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(pageVO, getLoginUserId());
76 75 return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult));
77 76 }
78 77  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.crm.convert.business;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*;
5 5 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
  6 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionPageReqBO;
6 7 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmTransferPermissionReqBO;
7 8 import org.mapstruct.Mapper;
8 9 import org.mapstruct.Mapping;
... ... @@ -37,4 +38,6 @@ public interface CrmBusinessConvert {
37 38 })
38 39 CrmTransferPermissionReqBO convert(CrmBusinessTransferReqVO reqVO, Long userId);
39 40  
  41 + CrmPermissionPageReqBO convert(CrmBusinessPageReqVO pageReqVO);
  42 +
40 43 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/permission/CrmPermissionDO.java
... ... @@ -24,6 +24,12 @@ import lombok.*;
24 24 public class CrmPermissionDO extends BaseDO {
25 25  
26 26 /**
  27 + * 当数据变为公海数据时,也就是数据团队成员中没有负责人的时候,将原本的负责人 userId 设置为 POOL_USER_ID 方便查询公海数据。
  28 + * 也就是说每条数据到最后都有一个负责人,如果有人领取则 userId 为领取人
  29 + */
  30 + public static final Long POOL_USER_ID = 0L;
  31 +
  32 + /**
27 33 * ID
28 34 */
29 35 @TableId
... ... @@ -38,12 +44,12 @@ public class CrmPermissionDO extends BaseDO {
38 44 private Long bizId;
39 45 /**
40 46 * 团队成员,关联 AdminUser#id
  47 + * 如果为公海数据的话会干掉此数据的负责人后设置为 {@link #POOL_USER_ID},领取人则上位负责人
  48 + * 例:客户放入公海后会干掉团队成员中的负责人,而其他团队成员则不受影响
41 49 */
42 50 private Long userId;
43 51 /**
44 52 * 权限级别,关联 {@link CrmPermissionLevelEnum}
45   - * 如果为公海数据的话会干掉此数据的负责人,领取人则上位负责人
46   - * 例:客户放入公海后会干掉团队成员中的负责人,而其他团队成员则不受影响
47 53 */
48 54 private Integer permissionLevel;
49 55  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java
1 1 package cn.iocoder.yudao.module.crm.dal.mysql.business;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 5 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessExportReqVO;
... ... @@ -8,6 +7,7 @@ import cn.iocoder.yudao.module.crm.controller.admin.business.vo.CrmBusinessPageR
8 7 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
9 8 import org.apache.ibatis.annotations.Mapper;
10 9  
  10 +import java.util.Collection;
11 11 import java.util.List;
12 12  
13 13 /**
... ... @@ -18,8 +18,9 @@ import java.util.List;
18 18 @Mapper
19 19 public interface CrmBusinessMapper extends BaseMapperX<CrmBusinessDO> {
20 20  
21   - default PageResult<CrmBusinessDO> selectPage(CrmBusinessPageReqVO reqVO) {
22   - return selectPage(reqVO, new LambdaQueryWrapperX<CrmBusinessDO>()
  21 + default List<CrmBusinessDO> selectList(CrmBusinessPageReqVO reqVO, Collection<Long> ids) {
  22 + return selectList(new LambdaQueryWrapperX<CrmBusinessDO>()
  23 + .in(CrmBusinessDO::getId, ids)
23 24 .likeIfPresent(CrmBusinessDO::getName, reqVO.getName())
24 25 .orderByDesc(CrmBusinessDO::getId));
25 26 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/permission/CrmPermissionMapper.java
1 1 package cn.iocoder.yudao.module.crm.dal.mysql.permission;
2 2  
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 6 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
6 7 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
  8 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionPageReqBO;
7 9 import org.apache.ibatis.annotations.Mapper;
8 10  
9 11 import java.util.List;
... ... @@ -57,4 +59,10 @@ public interface CrmPermissionMapper extends BaseMapperX&lt;CrmPermissionDO&gt; {
57 59 .eq(CrmPermissionDO::getUserId, userId));
58 60 }
59 61  
  62 + default PageResult<CrmPermissionDO> selectPage(CrmPermissionPageReqBO pageReqBO) {
  63 + return selectPage(pageReqBO, new LambdaQueryWrapperX<CrmPermissionDO>()
  64 + .eq(CrmPermissionDO::getBizType, pageReqBO.getBizType())
  65 + .eq(CrmPermissionDO::getUserId, pageReqBO.getUserId())); // 只要是团队成员都有读取的权限
  66 + }
  67 +
60 68 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java
... ... @@ -81,7 +81,8 @@ public class CrmPermissionAspect {
81 81 }
82 82 if (isRead(permissionLevel)) { // 读权限
83 83 // 如果没有数据权限或没有负责人则表示此记录为公海数据所有人都有只读权限可以领取成为负责人(团队成员领取的)
84   - if (CollUtil.isEmpty(bizPermissions) || !CollUtil.anyMatch(bizPermissions, item -> isOwner(item.getPermissionLevel()))) {
  84 + if (CollUtil.isEmpty(bizPermissions) || CollUtil.anyMatch(bizPermissions,
  85 + item -> ObjUtil.equal(item.getUserId(), CrmPermissionDO.POOL_USER_ID))) { // 详见 CrmPermissionDO.POOL_USER_ID 注释
85 86 return;
86 87 }
87 88 if (isRead(userPermission.getPermissionLevel())) { // 校验当前用户是否有读权限
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java
... ... @@ -58,9 +58,10 @@ public interface CrmBusinessService {
58 58 * 获得商机分页
59 59 *
60 60 * @param pageReqVO 分页查询
  61 + * @param userId 用户编号
61 62 * @return 商机分页
62 63 */
63   - PageResult<CrmBusinessDO> getBusinessPage(CrmBusinessPageReqVO pageReqVO);
  64 + PageResult<CrmBusinessDO> getBusinessPage(CrmBusinessPageReqVO pageReqVO, Long userId);
64 65  
65 66 /**
66 67 * 获得商机列表, 用于 Excel 导出
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
... ... @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6 import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*;
7 7 import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
8 8 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
  9 +import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
9 10 import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper;
10 11 import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
11 12 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
... ... @@ -19,8 +20,10 @@ import org.springframework.validation.annotation.Validated;
19 20 import javax.annotation.Resource;
20 21 import java.util.Collection;
21 22 import java.util.List;
  23 +import java.util.Set;
22 24  
23 25 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  26 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
24 27 import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.BUSINESS_NOT_EXISTS;
25 28  
26 29 /**
... ... @@ -98,8 +101,18 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
98 101 }
99 102  
100 103 @Override
101   - public PageResult<CrmBusinessDO> getBusinessPage(CrmBusinessPageReqVO pageReqVO) {
102   - return businessMapper.selectPage(pageReqVO);
  104 + public PageResult<CrmBusinessDO> getBusinessPage(CrmBusinessPageReqVO pageReqVO, Long userId) {
  105 + // 1. 获取当前用户能看的分页数据
  106 + PageResult<CrmPermissionDO> permissionPage = crmPermissionService.getPermissionPage(
  107 + CrmBusinessConvert.INSTANCE.convert(pageReqVO).setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()).setUserId(userId));
  108 + Set<Long> ids = convertSet(permissionPage.getList(), CrmPermissionDO::getBizId);
  109 + if (CollUtil.isEmpty(ids)) { // 没得说明没有什么给他看的
  110 + return PageResult.empty();
  111 + }
  112 +
  113 + // 2. 获取商机分页数据
  114 + List<CrmBusinessDO> businessList = businessMapper.selectList(pageReqVO, ids);
  115 + return new PageResult<>(businessList, (long) businessList.size());
103 116 }
104 117  
105 118 @Override
... ... @@ -114,7 +127,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
114 127 validateBusinessExists(reqVO.getId());
115 128  
116 129 // 2. 数据权限转移
117   - crmPermissionService.transferCrmPermission(
  130 + crmPermissionService.transferPermission(
118 131 CrmBusinessConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()));
119 132  
120 133 // 3. TODO 记录转移日志
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java
... ... @@ -115,7 +115,7 @@ public class ContactServiceImpl implements ContactService {
115 115 validateContactExists(reqVO.getId());
116 116  
117 117 // 2. 数据权限转移
118   - crmPermissionService.transferCrmPermission(
  118 + crmPermissionService.transferPermission(
119 119 ContactConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CONTACTS.getType()));
120 120  
121 121 // 3. TODO 记录转移日志
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java
... ... @@ -113,7 +113,7 @@ public class ContractServiceImpl implements ContractService {
113 113 validateContractExists(reqVO.getId());
114 114  
115 115 // 2. 数据权限转移
116   - crmPermissionService.transferCrmPermission(
  116 + crmPermissionService.transferPermission(
117 117 ContractConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()));
118 118  
119 119 // 3. TODO 记录转移日志
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
... ... @@ -136,7 +136,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
136 136 validateCustomer(reqVO.getId());
137 137  
138 138 // 2. 数据权限转移
139   - crmPermissionService.transferCrmPermission(
  139 + crmPermissionService.transferPermission(
140 140 CrmCustomerConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()));
141 141  
142 142 // 3. TODO 记录转移日志
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java
1 1 package cn.iocoder.yudao.module.crm.service.permission;
2 2  
3 3  
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
5 6 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
6 7 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
  8 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionPageReqBO;
7 9 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO;
8 10 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmTransferPermissionReqBO;
9 11  
... ... @@ -59,19 +61,18 @@ public interface CrmPermissionService {
59 61 List<CrmPermissionDO> getPermissionByBizTypeAndBizId(Integer bizType, Long bizId);
60 62  
61 63 /**
62   - * 获取数据权限列表,通过 数据类型 x 用户编号
  64 + * 数据权限转移
63 65 *
64   - * @param bizType 数据类型,关联 {@link CrmBizTypeEnum}
65   - * @param userId 用户编号
66   - * @return Crm 数据权限列表
  66 + * @param crmTransferPermissionReqBO 数据权限转移请求
67 67 */
68   - List<CrmPermissionDO> getPermissionByBizTypeAndUserId(Integer bizType, Long userId);
  68 + void transferPermission(@Valid CrmTransferPermissionReqBO crmTransferPermissionReqBO);
69 69  
70 70 /**
71   - * 数据权限转移
  71 + * 获取数据权限分页数据
72 72 *
73   - * @param crmTransferPermissionReqBO 数据权限转移请求
  73 + * @param pageReqBO 分页请求
  74 + * @return 数据权限分页数据
74 75 */
75   - void transferCrmPermission(@Valid CrmTransferPermissionReqBO crmTransferPermissionReqBO);
  76 + PageResult<CrmPermissionDO> getPermissionPage(CrmPermissionPageReqBO pageReqBO);
76 77  
77 78 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
... ... @@ -2,12 +2,14 @@ package cn.iocoder.yudao.module.crm.service.permission;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.ObjUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.module.crm.convert.permission.CrmPermissionConvert;
6 7 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
7 8 import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper;
8 9 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
9 10 import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
10 11 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
  12 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionPageReqBO;
11 13 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO;
12 14 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmTransferPermissionReqBO;
13 15 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
... ... @@ -86,7 +88,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
86 88  
87 89  
88 90 @Override
89   - public void transferCrmPermission(CrmTransferPermissionReqBO transferReqBO) {
  91 + public void transferPermission(CrmTransferPermissionReqBO transferReqBO) {
90 92 // 1. 校验数据权限-是否是负责人,只有负责人才可以转移
91 93 CrmPermissionDO oldPermission = crmPermissionMapper.selectByBizTypeAndBizIdByUserId(transferReqBO.getBizType(),
92 94 transferReqBO.getBizId(), transferReqBO.getUserId());
... ... @@ -131,4 +133,9 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
131 133 crmPermissionMapper.deleteById(oldPermission.getId()); // 移除
132 134 }
133 135  
  136 + @Override
  137 + public PageResult<CrmPermissionDO> getPermissionPage(CrmPermissionPageReqBO pageReqBO) {
  138 + return crmPermissionMapper.selectPage(pageReqBO);
  139 + }
  140 +
134 141 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionPageReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.service.permission.bo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
  6 +import io.swagger.v3.oas.annotations.media.Schema;
  7 +import lombok.Data;
  8 +import lombok.EqualsAndHashCode;
  9 +import lombok.ToString;
  10 +
  11 +import javax.validation.constraints.NotNull;
  12 +
  13 +@Schema(description = "管理后台 - CRM 数据权限分页 Request BO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +@ToString(callSuper = true)
  17 +public class CrmPermissionPageReqBO extends PageParam {
  18 +
  19 + /**
  20 + * 当前登录用户编号
  21 + */
  22 + @NotNull(message = "用户编号不能为空")
  23 + private Long userId;
  24 +
  25 + /**
  26 + * Crm 类型
  27 + */
  28 + @NotNull(message = "Crm 类型不能为空")
  29 + @InEnum(CrmBizTypeEnum.class)
  30 + private Integer bizType;
  31 +
  32 +}
... ...