| | |
| | | if (CrmPermissionUtils.isCrmAdmin()) { // 特殊逻辑:如果是超管,直接查询所有,不过滤数据权限 |
| | | return; |
| | | } |
| | | query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType) |
| | | .eq(CrmPermissionDO::getBizId, bizId) |
| | | .in(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel(), CrmPermissionLevelEnum.WRITE.getLevel()) |
| | | .eq(CrmPermissionDO::getUserId,userId)); |
| | | query.ne(ownerUserIdField, userId); |
| | | // 商机特殊处理:同时关联商机团队和客户团队的权限 |
| | | if (CrmBizTypeEnum.CRM_BUSINESS.getType().equals(bizType)) { |
| | | appendBusinessPermissionCondition(query, bizId, userId, ownerUserIdField); |
| | | } else { |
| | | query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType) |
| | | .eq(CrmPermissionDO::getBizId, bizId) |
| | | .in(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel(), CrmPermissionLevelEnum.WRITE.getLevel()) |
| | | .eq(CrmPermissionDO::getUserId, userId)); |
| | | query.ne(ownerUserIdField, userId); |
| | | } |
| | | } |
| | | // 场景三:下属负责的数据(下属是负责人) |
| | | if (CrmSceneTypeEnum.isSubordinate(sceneType)) { |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 商机特殊权限条件:同时关联商机团队和客户团队的权限 |
| | | * 商机继承客户团队的权限,即客户团队成员也能看到该客户下的商机 |
| | | */ |
| | | private static <T extends MPJLambdaWrapper<?>, S> void appendBusinessPermissionCondition(T query, SFunction<S, ?> bizId, |
| | | Long userId, String ownerUserIdField) { |
| | | // 使用子查询方式:商机团队成员 OR 客户团队成员 |
| | | // 子查询1:商机团队成员权限 |
| | | String subQuery1 = "(SELECT p1.biz_id FROM crm_permission p1 " + |
| | | "WHERE p1.biz_type = " + CrmBizTypeEnum.CRM_BUSINESS.getType() + " " + |
| | | "AND p1.level IN (" + CrmPermissionLevelEnum.READ.getLevel() + "," + CrmPermissionLevelEnum.WRITE.getLevel() + ") " + |
| | | "AND p1.user_id = " + userId + ")"; |
| | | // 子查询2:客户团队成员权限(通过商机的 customer_id 关联) |
| | | String subQuery2 = "(SELECT b.id FROM crm_business b " + |
| | | "INNER JOIN crm_permission p2 ON p2.biz_type = " + CrmBizTypeEnum.CRM_CUSTOMER.getType() + " " + |
| | | "AND p2.biz_id = b.customer_id " + |
| | | "AND p2.level IN (" + CrmPermissionLevelEnum.READ.getLevel() + "," + CrmPermissionLevelEnum.WRITE.getLevel() + ") " + |
| | | "AND p2.user_id = " + userId + ")"; |
| | | // 使用 OR 连接两个子查询,并排除自己是负责人的情况 |
| | | query.apply("t.id IN (" + subQuery1 + " UNION " + subQuery2 + ")") |
| | | .ne(ownerUserIdField, userId); |
| | | } |
| | | |
| | | } |