|
@@ -7,9 +7,12 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
|
|
|
import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
|
|
|
import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum;
|
|
|
import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
|
|
|
+import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionRoleCodeEnum;
|
|
|
+import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
|
|
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
|
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
|
|
+import com.github.yulichang.autoconfigure.MybatisPlusJoinProperties;
|
|
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
|
|
|
import java.util.Collection;
|
|
@@ -33,46 +36,41 @@ public class CrmQueryWrapperUtils {
|
|
|
* @param userId 用户编号
|
|
|
* @param sceneType 场景类型
|
|
|
* @param pool 公海
|
|
|
- * @return 是否 (是:需要执行查询,否:不需要查询调用方法直接返回空)
|
|
|
*/
|
|
|
- // TODO @puhui999:bizId 直接传递会不会简单点 回复:还是需要 SFunction 因为分页连表时不知道 bizId 是多少;是不是把 bizId 传入就好啦?
|
|
|
- public static <T extends MPJLambdaWrapper<?>, S> boolean appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId,
|
|
|
- Long userId, Integer sceneType, Boolean pool) {
|
|
|
+ public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId,
|
|
|
+ Long userId, Integer sceneType, Boolean pool) {
|
|
|
+ final String ownerUserIdField = SingletonManager.getMybatisPlusJoinProperties().getTableAlias() + ".owner_user_id";
|
|
|
// 1. 构建数据权限连表条件
|
|
|
- if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE)) { // 管理员不需要数据权限
|
|
|
+ if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE) && ObjUtil.notEqual(pool, Boolean.TRUE)) { // 管理员,公海不需要数据权限
|
|
|
query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType)
|
|
|
- .eq(CrmPermissionDO::getBizId, bizId)
|
|
|
+ .eq(CrmPermissionDO::getBizId, bizId) // 只能使用 SFunction 如果传 id 解析出来的 sql 不对
|
|
|
.eq(CrmPermissionDO::getUserId, userId));
|
|
|
}
|
|
|
// 2.1 场景一:我负责的数据
|
|
|
if (CrmSceneTypeEnum.isOwner(sceneType)) {
|
|
|
- query.eq("owner_user_id", userId);
|
|
|
+ query.eq(ownerUserIdField, userId);
|
|
|
}
|
|
|
// 2.2 场景二:我参与的数据
|
|
|
if (CrmSceneTypeEnum.isInvolved(sceneType)) {
|
|
|
- query.ne("owner_user_id", userId)
|
|
|
- // TODO @puhui999:IN 是不是更合适哈;
|
|
|
- .and(q -> q.eq(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel())
|
|
|
- .or()
|
|
|
- .eq(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.WRITE.getLevel()));
|
|
|
+ query.ne(ownerUserIdField, userId)
|
|
|
+ .in(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel(), CrmPermissionLevelEnum.WRITE.getLevel());
|
|
|
}
|
|
|
// 2.3 场景三:下属负责的数据
|
|
|
if (CrmSceneTypeEnum.isSubordinate(sceneType)) {
|
|
|
- // TODO @puhui999:要不如果没有下属,拼一个 owner_user_id in null,不返回结果就好啦;
|
|
|
- List<AdminUserRespDTO> subordinateUsers = getAdminUserApi().getUserListBySubordinate(userId);
|
|
|
+ List<AdminUserRespDTO> subordinateUsers = SingletonManager.getAdminUserApi().getUserListBySubordinate(userId);
|
|
|
if (CollUtil.isEmpty(subordinateUsers)) {
|
|
|
- return false;
|
|
|
+ query.eq(ownerUserIdField, -1); // 不返回任何结果
|
|
|
+ } else {
|
|
|
+ query.in(ownerUserIdField, convertSet(subordinateUsers, AdminUserRespDTO::getId));
|
|
|
}
|
|
|
- query.in("owner_user_id", convertSet(subordinateUsers, AdminUserRespDTO::getId));
|
|
|
}
|
|
|
|
|
|
// 3. 拼接公海的查询条件
|
|
|
if (ObjUtil.equal(pool, Boolean.TRUE)) { // 情况一:公海
|
|
|
- query.isNull("owner_user_id");
|
|
|
+ query.isNull(ownerUserIdField);
|
|
|
} else { // 情况二:不是公海
|
|
|
- query.isNotNull("owner_user_id");
|
|
|
+ query.isNotNull(ownerUserIdField);
|
|
|
}
|
|
|
- return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -93,38 +91,38 @@ public class CrmQueryWrapperUtils {
|
|
|
.in(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId));
|
|
|
}
|
|
|
|
|
|
- private static AdminUserApi getAdminUserApi() {
|
|
|
- return AdminUserApiHolder.ADMIN_USER_API;
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
- * 校验用户是否是管理员
|
|
|
+ * 校验用户是否是 CRM 管理员
|
|
|
*
|
|
|
* @param userId 用户编号
|
|
|
* @return 是/否
|
|
|
*/
|
|
|
private static boolean validateAdminUser(Long userId) {
|
|
|
- // TODO 查询权限配置表用户的角色信息
|
|
|
- // TODO @puhui999:查询用户的角色;CRM_ADMIN("crm_admin", "CRM 管理员"),
|
|
|
- //CrmPermissionConfig permissionConfig = crmPermissionConfigService.getPermissionConfigByUserId(userId);
|
|
|
- //if (permissionConfig == null) {
|
|
|
- // return false;
|
|
|
- //}
|
|
|
- //// 校验是否为管理员
|
|
|
- //if (permissionConfig.getIsAdmin()){
|
|
|
- // return true;
|
|
|
- //}
|
|
|
- return false;
|
|
|
+ return SingletonManager.getPermissionApi().hasAnyRoles(userId, CrmPermissionRoleCodeEnum.CRM_ADMIN.getCode());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 静态内部类实现 AdminUserApi 单例获取
|
|
|
+ * 静态内部类实现单例获取
|
|
|
*
|
|
|
* @author HUIHUI
|
|
|
*/
|
|
|
- private static class AdminUserApiHolder {
|
|
|
+ private static class SingletonManager {
|
|
|
|
|
|
private static final AdminUserApi ADMIN_USER_API = SpringUtil.getBean(AdminUserApi.class);
|
|
|
+ private static final PermissionApi PERMISSION_API = SpringUtil.getBean(PermissionApi.class);
|
|
|
+ private static final MybatisPlusJoinProperties MYBATIS_PLUS_JOIN_PROPERTIES = SpringUtil.getBean(MybatisPlusJoinProperties.class);
|
|
|
+
|
|
|
+ public static AdminUserApi getAdminUserApi() {
|
|
|
+ return ADMIN_USER_API;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static PermissionApi getPermissionApi() {
|
|
|
+ return PERMISSION_API;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static MybatisPlusJoinProperties getMybatisPlusJoinProperties() {
|
|
|
+ return MYBATIS_PLUS_JOIN_PROPERTIES;
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|