|
|
|
|
@ -6,6 +6,7 @@ import cn.hutool.extra.spring.SpringUtil;
|
|
|
|
|
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.system.api.user.AdminUserApi;
|
|
|
|
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
|
|
|
|
@ -17,7 +18,7 @@ import java.util.List;
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* CRM 分页查询工具类
|
|
|
|
|
* CRM 查询工具类
|
|
|
|
|
*
|
|
|
|
|
* @author HUIHUI
|
|
|
|
|
*/
|
|
|
|
|
@ -26,17 +27,16 @@ public class CrmQueryWrapperUtils {
|
|
|
|
|
/**
|
|
|
|
|
* 构造 CRM 数据类型数据分页查询条件
|
|
|
|
|
*
|
|
|
|
|
* @param query 连表查询对象
|
|
|
|
|
* @param bizType 数据类型 {@link CrmBizTypeEnum}
|
|
|
|
|
* @param bizId 数据编号
|
|
|
|
|
* @param userId 用户编号
|
|
|
|
|
* @param sceneType 场景类型
|
|
|
|
|
* @param pool 公海
|
|
|
|
|
* @param query 连表查询对象
|
|
|
|
|
* @param bizType 数据类型 {@link CrmBizTypeEnum}
|
|
|
|
|
* @param bizId 数据编号
|
|
|
|
|
* @param userId 用户编号
|
|
|
|
|
* @param sceneType 场景类型
|
|
|
|
|
* @param pool 公海
|
|
|
|
|
*/
|
|
|
|
|
// TODO @puhui999:bizId 直接传递会不会简单点
|
|
|
|
|
// TODO @puhui999:builderPageQuery 应该不仅仅适合于分页查询,应该适用于所有的查询;可以改成 appendPermissionCondition
|
|
|
|
|
public static <T extends MPJLambdaWrapper<?>, S> void builderPageQuery(T query, Integer bizType, SFunction<S, ?> bizId,
|
|
|
|
|
Long userId, Integer sceneType, Boolean pool) {
|
|
|
|
|
// TODO @puhui999:bizId 直接传递会不会简单点 回复:还是需要 SFunction 因为分页连表时不知道 bizId 是多少
|
|
|
|
|
public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId,
|
|
|
|
|
Long userId, Integer sceneType, Boolean pool) {
|
|
|
|
|
// 1. 构建数据权限连表条件
|
|
|
|
|
if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE)) { // 管理员不需要数据权限
|
|
|
|
|
query.innerJoin(CrmPermissionDO.class, on ->
|
|
|
|
|
@ -48,9 +48,13 @@ public class CrmQueryWrapperUtils {
|
|
|
|
|
query.eq("owner_user_id", userId);
|
|
|
|
|
}
|
|
|
|
|
// 2.2 场景二:我参与的数据
|
|
|
|
|
// TODO @puhui999:参与,指的是有读写权限噢;可以把 1. 的合并到 2.2 里;因为 2.1 不需要;
|
|
|
|
|
if (CrmSceneTypeEnum.isInvolved(sceneType)) {
|
|
|
|
|
query.ne("owner_user_id", userId);
|
|
|
|
|
query
|
|
|
|
|
.ne("owner_user_id", userId)
|
|
|
|
|
.and(q -> q.eq(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.READ.getLevel())
|
|
|
|
|
.or()
|
|
|
|
|
.eq(CrmPermissionDO::getLevel, CrmPermissionLevelEnum.WRITE.getLevel()));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// 2.3 场景三:下属负责的数据
|
|
|
|
|
if (CrmSceneTypeEnum.isSubordinate(sceneType)) {
|
|
|
|
|
@ -61,7 +65,7 @@ public class CrmQueryWrapperUtils {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. 拼接公海的查询条件
|
|
|
|
|
// 3. 拼接公海的查询条件
|
|
|
|
|
if (ObjUtil.equal(pool, Boolean.TRUE)) { // 情况一:公海
|
|
|
|
|
query.isNull("owner_user_id");
|
|
|
|
|
} else { // 情况二:不是公海
|
|
|
|
|
@ -72,28 +76,27 @@ public class CrmQueryWrapperUtils {
|
|
|
|
|
/**
|
|
|
|
|
* 构造 CRM 数据类型批量数据查询条件
|
|
|
|
|
*
|
|
|
|
|
* @param query 连表查询对象
|
|
|
|
|
* @param bizType 数据类型 {@link CrmBizTypeEnum}
|
|
|
|
|
* @param bizIds 数据编号
|
|
|
|
|
* @param userId 用户编号
|
|
|
|
|
* @param query 连表查询对象
|
|
|
|
|
* @param bizType 数据类型 {@link CrmBizTypeEnum}
|
|
|
|
|
* @param bizIds 数据编号
|
|
|
|
|
* @param userId 用户编号
|
|
|
|
|
*/
|
|
|
|
|
// TODO @puhui999:可以改成 appendPermissionCondition
|
|
|
|
|
// TODO @puhui999:S 是不是可以删除
|
|
|
|
|
public static <T extends MPJLambdaWrapper<?>, S> void builderListQueryBatch(T query, Integer bizType, Collection<Long> bizIds, Long userId) {
|
|
|
|
|
// TODO @puhui999:这里先 if return 简单点
|
|
|
|
|
if (ObjUtil.notEqual(validateAdminUser(userId), Boolean.TRUE)) { // 管理员不需要数据权限
|
|
|
|
|
query.innerJoin(CrmPermissionDO.class, on ->
|
|
|
|
|
on.eq(CrmPermissionDO::getBizType, bizType).in(CrmPermissionDO::getBizId, bizIds)
|
|
|
|
|
.in(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId));
|
|
|
|
|
public static <T extends MPJLambdaWrapper<?>> void appendPermissionCondition(T query, Integer bizType, Collection<Long> bizIds, Long userId) {
|
|
|
|
|
if (ObjUtil.equal(validateAdminUser(userId), Boolean.TRUE)) {// 管理员不需要数据权限
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
query.innerJoin(CrmPermissionDO.class, on ->
|
|
|
|
|
on.eq(CrmPermissionDO::getBizType, bizType).in(CrmPermissionDO::getBizId, bizIds)
|
|
|
|
|
.in(CollUtil.isNotEmpty(bizIds), CrmPermissionDO::getUserId, userId));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO @puhui999:需要加个变量,不用每次都拿哈;
|
|
|
|
|
private static AdminUserApi getAdminUserApi() {
|
|
|
|
|
return SpringUtil.getBean(AdminUserApi.class);
|
|
|
|
|
return AdminUserApiHolder.ADMIN_USER_API;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO @puhui999:需要实现;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 校验用户是否是管理员
|
|
|
|
|
*
|
|
|
|
|
@ -104,4 +107,15 @@ public class CrmQueryWrapperUtils {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 静态内部类实现 AdminUserApi 单例获取
|
|
|
|
|
*
|
|
|
|
|
* @author HUIHUI
|
|
|
|
|
*/
|
|
|
|
|
private static class AdminUserApiHolder {
|
|
|
|
|
|
|
|
|
|
private static final AdminUserApi ADMIN_USER_API = SpringUtil.getBean(AdminUserApi.class);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|