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 , S> void appendPermissionCondition(T query, Integer bizType, SFunction bizId, Long userId, Integer sceneType) { appendPermissionCondition(query, bizType, bizId, userId, sceneType, null); } /** * 构造售后模块数据【分页】查询条件(支持「处理人」也算可见范围) * * @param handlerUserIdField 处理人字段(带表别名),为 null 表示该表没有处理人概念 */ public static , S> void appendPermissionCondition(T query, Integer bizType, SFunction bizId, Long userId, Integer sceneType, String handlerUserIdField) { MybatisPlusJoinProperties mybatisPlusJoinProperties = SpringUtil.getBean(MybatisPlusJoinProperties.class); final String tableAlias = mybatisPlusJoinProperties.getTableAlias(); final String ownerUserIdField = tableAlias + ".owner_user_id"; // 处理人字段补齐表别名(避免连表查询时列名歧义) final String handlerField = handlerUserIdField != null ? tableAlias + "." + handlerUserIdField : null; // 场景一:我负责的数据(或我作为处理人的数据) if (AfterSaleSceneTypeEnum.isOwner(sceneType)) { if (handlerField != null) { query.and(w -> w.eq(ownerUserIdField, userId).or().eq(handlerField, userId)); } else { 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 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; } if (handlerField != null) { query.and(w -> w.eq(ownerUserIdField, userId).or().eq(handlerField, userId)); } else { query.eq(ownerUserIdField, userId); } } } }