package cn.iocoder.yudao.module.aftersales.util;
|
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.extra.spring.SpringUtil;
|
import cn.iocoder.yudao.framework.common.biz.system.permission.PermissionCommonApi;
|
import cn.iocoder.yudao.module.aftersales.dal.dataobject.permission.AfterSalePermissionDO;
|
import cn.iocoder.yudao.module.aftersales.enums.AfterSaleBizTypeEnum;
|
import cn.iocoder.yudao.module.aftersales.enums.permission.AfterSalePermissionLevelEnum;
|
import cn.iocoder.yudao.module.aftersales.enums.permission.AfterSaleSceneTypeEnum;
|
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 org.springframework.util.Assert;
|
|
import java.util.List;
|
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
|
/**
|
* 售后模块数据权限工具类
|
*/
|
public class AfterSalePermissionUtils {
|
|
/**
|
* 校验用户是否是售后管理员
|
*
|
* @return 是/否
|
*/
|
public static boolean isAftersaleAdmin() {
|
PermissionCommonApi permissionApi = SpringUtil.getBean(PermissionCommonApi.class);
|
return permissionApi.hasAnyRoles(getLoginUserId(), "aftersales_admin");
|
}
|
|
/**
|
* 校验用户是否有查看全部售后数据的权限
|
*/
|
private static boolean hasViewAllPermission() {
|
PermissionCommonApi permissionApi = SpringUtil.getBean(PermissionCommonApi.class);
|
return permissionApi.hasAnyPermissions(getLoginUserId(), "aftersales:view-all");
|
}
|
|
/**
|
* 构造售后模块数据【分页】查询条件
|
*
|
* @param query 连表查询对象
|
* @param bizType 数据类型 {@link AfterSaleBizTypeEnum}
|
* @param bizId 数据编号
|
* @param userId 用户编号
|
* @param sceneType 场景类型
|
*/
|
public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType,
|
SFunction<S, ?> bizId,
|
Long userId, Integer sceneType) {
|
MybatisPlusJoinProperties mybatisPlusJoinProperties = SpringUtil.getBean(MybatisPlusJoinProperties.class);
|
final String ownerUserIdField = mybatisPlusJoinProperties.getTableAlias() + ".owner_user_id";
|
// 场景一:我负责的数据
|
if (AfterSaleSceneTypeEnum.isOwner(sceneType)) {
|
query.eq(ownerUserIdField, userId);
|
}
|
// 场景二:我参与的数据(我有读或写权限,并且不是负责人)
|
if (AfterSaleSceneTypeEnum.isInvolved(sceneType)) {
|
if (isAftersaleAdmin()) {
|
return;
|
}
|
query.innerJoin(AfterSalePermissionDO.class, on -> on.eq(AfterSalePermissionDO::getBizType, bizType)
|
.eq(AfterSalePermissionDO::getBizId, bizId)
|
.in(AfterSalePermissionDO::getLevel, AfterSalePermissionLevelEnum.READ.getLevel(),
|
AfterSalePermissionLevelEnum.WRITE.getLevel())
|
.eq(AfterSalePermissionDO::getUserId, userId));
|
query.ne(ownerUserIdField, userId);
|
}
|
// 场景三:下属负责的数据(下属是负责人)
|
if (AfterSaleSceneTypeEnum.isSubordinate(sceneType)) {
|
AdminUserApi adminUserApi = SpringUtil.getBean(AdminUserApi.class);
|
List<AdminUserRespDTO> subordinateUsers = adminUserApi.getUserListBySubordinate(userId);
|
if (CollUtil.isEmpty(subordinateUsers)) {
|
query.eq(ownerUserIdField, -1);
|
} else {
|
query.in(ownerUserIdField, convertSet(subordinateUsers, AdminUserRespDTO::getId));
|
}
|
}
|
// 场景四:全部数据(需要有 view-all 权限或售后管理员)
|
if (AfterSaleSceneTypeEnum.isAll(sceneType)) {
|
if (isAftersaleAdmin() || hasViewAllPermission()) {
|
return;
|
}
|
query.eq(ownerUserIdField, userId);
|
}
|
}
|
|
}
|