Commit 945d379625f9fb432100026cd0a1c896db7a6a14
1 parent
db3dbf08
【代码优化】CRM:数据权限拼接时,把 pool 条件拿回到 customer 里,只有它有公海逻辑
Showing
9 changed files
with
30 additions
and
37 deletions
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/clue/vo/CrmCluePageReqVO.java
| ... | ... | @@ -30,9 +30,6 @@ public class CrmCluePageReqVO 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 则表示为不是公海数据 | |
| 35 | - | |
| 36 | 33 | @Schema(description = "所属行业", example = "1") |
| 37 | 34 | private Integer industryId; |
| 38 | 35 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessMapper.java
| ... | ... | @@ -47,7 +47,7 @@ public interface CrmBusinessMapper extends BaseMapperX<CrmBusinessDO> { |
| 47 | 47 | MPJLambdaWrapperX<CrmBusinessDO> query = new MPJLambdaWrapperX<>(); |
| 48 | 48 | // 拼接数据权限的查询条件 |
| 49 | 49 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_BUSINESS.getType(), |
| 50 | - CrmBusinessDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE); | |
| 50 | + CrmBusinessDO::getId, userId, pageReqVO.getSceneType()); | |
| 51 | 51 | // 拼接自身的查询条件 |
| 52 | 52 | query.selectAll(CrmBusinessDO.class) |
| 53 | 53 | .likeIfPresent(CrmBusinessDO::getName, pageReqVO.getName()) | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/clue/CrmClueMapper.java
| ... | ... | @@ -25,7 +25,7 @@ public interface CrmClueMapper extends BaseMapperX<CrmClueDO> { |
| 25 | 25 | MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>(); |
| 26 | 26 | // 拼接数据权限的查询条件 |
| 27 | 27 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(), |
| 28 | - CrmClueDO::getId, userId, pageReqVO.getSceneType(), pageReqVO.getPool()); | |
| 28 | + CrmClueDO::getId, userId, pageReqVO.getSceneType()); | |
| 29 | 29 | // 拼接自身的查询条件 |
| 30 | 30 | query.selectAll(CrmClueDO.class) |
| 31 | 31 | .likeIfPresent(CrmClueDO::getName, pageReqVO.getName()) |
| ... | ... | @@ -53,7 +53,7 @@ public interface CrmClueMapper extends BaseMapperX<CrmClueDO> { |
| 53 | 53 | MPJLambdaWrapperX<CrmClueDO> query = new MPJLambdaWrapperX<>(); |
| 54 | 54 | // 我负责的 + 非公海 |
| 55 | 55 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CLUE.getType(), |
| 56 | - CrmClueDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); | |
| 56 | + CrmClueDO::getId, userId, CrmSceneTypeEnum.OWNER.getType()); | |
| 57 | 57 | // 未跟进 + 未转化 |
| 58 | 58 | query.eq(CrmClueDO::getFollowUpStatus, false) |
| 59 | 59 | .eq(CrmClueDO::getTransformStatus, false); | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contact/CrmContactMapper.java
| ... | ... | @@ -56,7 +56,7 @@ public interface CrmContactMapper extends BaseMapperX<CrmContactDO> { |
| 56 | 56 | MPJLambdaWrapperX<CrmContactDO> query = new MPJLambdaWrapperX<>(); |
| 57 | 57 | // 拼接数据权限的查询条件 |
| 58 | 58 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTACT.getType(), |
| 59 | - CrmContactDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE); | |
| 59 | + CrmContactDO::getId, userId, pageReqVO.getSceneType()); | |
| 60 | 60 | // 拼接自身的查询条件 |
| 61 | 61 | query.selectAll(CrmContactDO.class) |
| 62 | 62 | .likeIfPresent(CrmContactDO::getName, pageReqVO.getName()) | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
| ... | ... | @@ -54,7 +54,7 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> { |
| 54 | 54 | MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); |
| 55 | 55 | // 拼接数据权限的查询条件 |
| 56 | 56 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), |
| 57 | - CrmContractDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE); | |
| 57 | + CrmContractDO::getId, userId, pageReqVO.getSceneType()); | |
| 58 | 58 | // 拼接自身的查询条件 |
| 59 | 59 | query.selectAll(CrmContractDO.class) |
| 60 | 60 | .likeIfPresent(CrmContractDO::getNo, pageReqVO.getNo()) |
| ... | ... | @@ -98,7 +98,7 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> { |
| 98 | 98 | MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); |
| 99 | 99 | // 我负责的 + 非公海 |
| 100 | 100 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), |
| 101 | - CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); | |
| 101 | + CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType()); | |
| 102 | 102 | // 未审核 |
| 103 | 103 | query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus()); |
| 104 | 104 | return selectCount(query); |
| ... | ... | @@ -108,7 +108,7 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> { |
| 108 | 108 | MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); |
| 109 | 109 | // 我负责的 + 非公海 |
| 110 | 110 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), |
| 111 | - CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); | |
| 111 | + CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType()); | |
| 112 | 112 | // 即将到期 |
| 113 | 113 | LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); |
| 114 | 114 | LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java
| ... | ... | @@ -52,8 +52,12 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { |
| 52 | 52 | default PageResult<CrmCustomerDO> selectPage(CrmCustomerPageReqVO pageReqVO, Long ownerUserId) { |
| 53 | 53 | MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>(); |
| 54 | 54 | // 拼接数据权限的查询条件 |
| 55 | - CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), | |
| 56 | - CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType(), pageReqVO.getPool()); | |
| 55 | + if (Boolean.TRUE.equals(pageReqVO.getPool())) { | |
| 56 | + query.isNull(CrmCustomerDO::getOwnerUserId); | |
| 57 | + } else { | |
| 58 | + CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), | |
| 59 | + CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType()); | |
| 60 | + } | |
| 57 | 61 | // 拼接自身的查询条件 |
| 58 | 62 | query.selectAll(CrmCustomerDO.class) |
| 59 | 63 | .likeIfPresent(CrmCustomerDO::getName, pageReqVO.getName()) |
| ... | ... | @@ -102,9 +106,9 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { |
| 102 | 106 | } |
| 103 | 107 | |
| 104 | 108 | default Long selectPutPoolRemindCustomerCount(CrmCustomerPageReqVO pageReqVO, |
| 105 | - CrmCustomerPoolConfigDO poolConfigDO, | |
| 109 | + CrmCustomerPoolConfigDO poolConfig, | |
| 106 | 110 | Long userId) { |
| 107 | - final MPJLambdaWrapperX<CrmCustomerDO> query = buildPutPoolRemindCustomerQuery(pageReqVO, poolConfigDO, userId); | |
| 111 | + final MPJLambdaWrapperX<CrmCustomerDO> query = buildPutPoolRemindCustomerQuery(pageReqVO, poolConfig, userId); | |
| 108 | 112 | return selectCount(query); |
| 109 | 113 | } |
| 110 | 114 | |
| ... | ... | @@ -114,7 +118,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { |
| 114 | 118 | MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>(); |
| 115 | 119 | // 拼接数据权限的查询条件 |
| 116 | 120 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), |
| 117 | - CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType(), null); | |
| 121 | + CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType()); | |
| 118 | 122 | |
| 119 | 123 | // 未锁定 + 未成交 |
| 120 | 124 | query.eq(CrmCustomerDO::getLockStatus, false).eq(CrmCustomerDO::getDealStatus, false); |
| ... | ... | @@ -168,7 +172,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { |
| 168 | 172 | MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>(); |
| 169 | 173 | // 我负责的 + 非公海 |
| 170 | 174 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), |
| 171 | - CrmCustomerDO::getId, ownerUserId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); | |
| 175 | + CrmCustomerDO::getId, ownerUserId, CrmSceneTypeEnum.OWNER.getType()); | |
| 172 | 176 | // 今天需联系 |
| 173 | 177 | LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); |
| 174 | 178 | LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); |
| ... | ... | @@ -180,7 +184,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { |
| 180 | 184 | MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>(); |
| 181 | 185 | // 我负责的 + 非公海 |
| 182 | 186 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), |
| 183 | - CrmCustomerDO::getId, ownerUserId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); | |
| 187 | + CrmCustomerDO::getId, ownerUserId, CrmSceneTypeEnum.OWNER.getType()); | |
| 184 | 188 | // 未跟进 |
| 185 | 189 | query.eq(CrmClueDO::getFollowUpStatus, false); |
| 186 | 190 | return selectCount(query); | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivableMapper.java
| ... | ... | @@ -48,7 +48,7 @@ public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> { |
| 48 | 48 | MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>(); |
| 49 | 49 | // 拼接数据权限的查询条件 |
| 50 | 50 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(), |
| 51 | - CrmReceivableDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE); | |
| 51 | + CrmReceivableDO::getId, userId, pageReqVO.getSceneType()); | |
| 52 | 52 | // 拼接自身的查询条件 |
| 53 | 53 | query.selectAll(CrmReceivableDO.class) |
| 54 | 54 | .eqIfPresent(CrmReceivableDO::getNo, pageReqVO.getNo()) |
| ... | ... | @@ -72,7 +72,7 @@ public interface CrmReceivableMapper extends BaseMapperX<CrmReceivableDO> { |
| 72 | 72 | MPJLambdaWrapperX<CrmReceivableDO> query = new MPJLambdaWrapperX<>(); |
| 73 | 73 | // 我负责的 + 非公海 |
| 74 | 74 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE.getType(), |
| 75 | - CrmReceivableDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); | |
| 75 | + CrmReceivableDO::getId, userId, CrmSceneTypeEnum.OWNER.getType()); | |
| 76 | 76 | // 未审核 |
| 77 | 77 | query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus()); |
| 78 | 78 | return selectCount(query); | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/receivable/CrmReceivablePlanMapper.java
| ... | ... | @@ -48,7 +48,7 @@ public interface CrmReceivablePlanMapper extends BaseMapperX<CrmReceivablePlanDO |
| 48 | 48 | MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>(); |
| 49 | 49 | // 拼接数据权限的查询条件 |
| 50 | 50 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(), |
| 51 | - CrmReceivablePlanDO::getId, userId, pageReqVO.getSceneType(), Boolean.FALSE); | |
| 51 | + CrmReceivablePlanDO::getId, userId, pageReqVO.getSceneType()); | |
| 52 | 52 | // 拼接自身的查询条件 |
| 53 | 53 | query.selectAll(CrmReceivablePlanDO.class) |
| 54 | 54 | .eqIfPresent(CrmReceivablePlanDO::getCustomerId, pageReqVO.getCustomerId()) |
| ... | ... | @@ -87,7 +87,7 @@ public interface CrmReceivablePlanMapper extends BaseMapperX<CrmReceivablePlanDO |
| 87 | 87 | MPJLambdaWrapperX<CrmReceivablePlanDO> query = new MPJLambdaWrapperX<>(); |
| 88 | 88 | // 我负责的 + 非公海 |
| 89 | 89 | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(), |
| 90 | - CrmReceivablePlanDO::getId, userId, CrmSceneTypeEnum.OWNER.getType(), Boolean.FALSE); | |
| 90 | + CrmReceivablePlanDO::getId, userId, CrmSceneTypeEnum.OWNER.getType()); | |
| 91 | 91 | // 未回款 + 已逾期 + 今天开始提醒 |
| 92 | 92 | LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); |
| 93 | 93 | query.isNull(CrmReceivablePlanDO::getReceivableId) // 未回款 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/util/CrmPermissionUtils.java
| 1 | 1 | package cn.iocoder.yudao.module.crm.util; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | -import cn.hutool.core.util.ObjUtil; | |
| 5 | 4 | import cn.hutool.extra.spring.SpringUtil; |
| 6 | 5 | import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; |
| 7 | 6 | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; |
| ... | ... | @@ -39,21 +38,20 @@ public class CrmPermissionUtils { |
| 39 | 38 | } |
| 40 | 39 | |
| 41 | 40 | /** |
| 42 | - * 构造 CRM 数据类型数据分页查询条件 | |
| 41 | + * 构造 CRM 数据类型数据【分页】查询条件 | |
| 43 | 42 | * |
| 44 | 43 | * @param query 连表查询对象 |
| 45 | 44 | * @param bizType 数据类型 {@link CrmBizTypeEnum} |
| 46 | 45 | * @param bizId 数据编号 |
| 47 | 46 | * @param userId 用户编号 |
| 48 | 47 | * @param sceneType 场景类型 |
| 49 | - * @param pool 公海 | |
| 50 | 48 | */ |
| 51 | 49 | public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId, |
| 52 | - Long userId, Integer sceneType, Boolean pool) { | |
| 50 | + Long userId, Integer sceneType) { | |
| 53 | 51 | MybatisPlusJoinProperties mybatisPlusJoinProperties = SpringUtil.getBean(MybatisPlusJoinProperties.class); |
| 54 | 52 | final String ownerUserIdField = mybatisPlusJoinProperties.getTableAlias() + ".owner_user_id"; |
| 55 | 53 | // 1. 构建数据权限连表条件 |
| 56 | - if (!CrmPermissionUtils.isCrmAdmin() && ObjUtil.notEqual(pool, Boolean.TRUE)) { // 管理员,公海不需要数据权限 | |
| 54 | + if (!CrmPermissionUtils.isCrmAdmin()) { // 管理员,公海不需要数据权限 | |
| 57 | 55 | query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType) |
| 58 | 56 | .eq(CrmPermissionDO::getBizId, bizId) // 只能使用 SFunction 如果传 id 解析出来的 sql 不对 |
| 59 | 57 | .eq(CrmPermissionDO::getUserId, userId)); |
| ... | ... | @@ -62,14 +60,14 @@ public class CrmPermissionUtils { |
| 62 | 60 | if (CrmSceneTypeEnum.isOwner(sceneType)) { |
| 63 | 61 | query.eq(ownerUserIdField, userId); |
| 64 | 62 | } |
| 65 | - // 2.2 场景二:我参与的数据 | |
| 63 | + // 2.2 场景二:我参与的数据(我有读或写权限,并且不是负责人) | |
| 66 | 64 | if (CrmSceneTypeEnum.isInvolved(sceneType)) { |
| 67 | 65 | query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType) |
| 68 | 66 | .eq(CrmPermissionDO::getBizId, bizId) |
| 69 | 67 | .in(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel(), CrmPermissionLevelEnum.WRITE.getLevel())); |
| 70 | 68 | query.ne(ownerUserIdField, userId); |
| 71 | 69 | } |
| 72 | - // 2.3 场景三:下属负责的数据 | |
| 70 | + // 2.3 场景三:下属负责的数据(下属是负责人) | |
| 73 | 71 | if (CrmSceneTypeEnum.isSubordinate(sceneType)) { |
| 74 | 72 | AdminUserApi adminUserApi = SpringUtil.getBean(AdminUserApi.class); |
| 75 | 73 | List<AdminUserRespDTO> subordinateUsers = adminUserApi.getUserListBySubordinate(userId); |
| ... | ... | @@ -79,24 +77,18 @@ public class CrmPermissionUtils { |
| 79 | 77 | query.in(ownerUserIdField, convertSet(subordinateUsers, AdminUserRespDTO::getId)); |
| 80 | 78 | } |
| 81 | 79 | } |
| 82 | - | |
| 83 | - // 3. 拼接公海的查询条件 | |
| 84 | - if (ObjUtil.equal(pool, Boolean.TRUE)) { // 情况一:公海 | |
| 85 | - query.isNull(ownerUserIdField); | |
| 86 | - } else { // 情况二:不是公海 | |
| 87 | - query.isNotNull(ownerUserIdField); | |
| 88 | - } | |
| 89 | 80 | } |
| 90 | 81 | |
| 91 | 82 | /** |
| 92 | - * 构造 CRM 数据类型批量数据查询条件 | |
| 83 | + * 构造 CRM 数据类型【批量】数据查询条件 | |
| 93 | 84 | * |
| 94 | 85 | * @param query 连表查询对象 |
| 95 | 86 | * @param bizType 数据类型 {@link CrmBizTypeEnum} |
| 96 | 87 | * @param bizIds 数据编号 |
| 97 | 88 | * @param userId 用户编号 |
| 98 | 89 | */ |
| 99 | - public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, Integer bizType, Collection<Long> bizIds, Long userId) { | |
| 90 | + public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, | |
| 91 | + Integer bizType, Collection<Long> bizIds, Long userId) { | |
| 100 | 92 | if (isCrmAdmin()) {// 管理员不需要数据权限 |
| 101 | 93 | return; |
| 102 | 94 | } | ... | ... |