liusuyi
2025-12-20 ba8b1496ba9881719e522d0a60a8c86baa7be08b
ard-framework/src/main/java/com/ard/framework/aspectj/DataScopePlusAspect.java
@@ -21,116 +21,116 @@
@Aspect
@Component
public class DataScopePlusAspect {
    /**
     * 全部数据权限
     */
    public static final String DATA_SCOPE_ALL = "1";
    /**
     * 自定数据权限
     */
    public static final String DATA_SCOPE_CUSTOM = "2";
    /**
     * 部门数据权限
     */
    public static final String DATA_SCOPE_DEPT = "3";
    /**
     * 部门及以下数据权限
     */
    public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";
    /**
     * 仅本人数据权限
     */
    public static final String DATA_SCOPE_SELF = "5";
    @Pointcut("@annotation(com.ard.common.annotation.DataScopePlus)")
    public void dataScopePointcut() {
    }
    @Before("@annotation(controllerDataScopePlus)")
    public void doBefore(JoinPoint joinPoint, DataScopePlus controllerDataScopePlus) {
        handleDataScope(joinPoint, controllerDataScopePlus);
    }
    protected void handleDataScope(final JoinPoint joinPoint, DataScopePlus controllerDataScope) {
        // 获取当前用户
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (StringUtils.isNotNull(loginUser)) {
            SysUser currentUser = loginUser.getUser();
            if (currentUser != null && !currentUser.isAdmin()) {
                String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(),
                        PermissionContextHolder.getContext());
                dataScopeFilter(joinPoint, currentUser, permission);
            }
        }
    }
    private void dataScopeFilter(JoinPoint joinPoint, SysUser user, String permission) {
        StringBuilder sqlString = new StringBuilder();
        List<String> conditions = new ArrayList<>();
        List<String> scopeCustomIds = new ArrayList<>();
        // 获取用户角色并遍历进行权限检查
        user.getRoles().forEach(role -> {
            if (DATA_SCOPE_CUSTOM.equals(role.getDataScope()) && StringUtils.equals(role.getStatus(),
                    UserConstants.ROLE_NORMAL)) {
                if (StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) {
                    scopeCustomIds.add(Convert.toStr(role.getRoleId()));
                }
            }
        });
        for (SysRole role : user.getRoles()) {
            String dataScope = role.getDataScope();
            if (conditions.contains(dataScope) || StringUtils.equals(role.getStatus(), UserConstants.ROLE_DISABLE)) {
                continue;
            }
            if (!StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) {
                continue;
            }
            if (DATA_SCOPE_ALL.equals(dataScope)) {
                sqlString = new StringBuilder();
                conditions.add(dataScope);
                break;
            } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) {
                // 自定义数据权限
                if (scopeCustomIds.size() > 1) {
                    sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_role_dept WHERE " +
                            "role_id IN ({}) )", String.join(",", scopeCustomIds)));
                } else {
                    sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_role_dept WHERE " +
                            "role_id = {} )", role.getRoleId()));
                }
            } else if (DATA_SCOPE_DEPT.equals(dataScope)) {
                // 部门数据权限
                sqlString.append(StringUtils.format(" OR dept_id = {}", user.getDeptId()));
            } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) {
                // 部门及以下数据权限
                sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = {} " +
                        "OR find_in_set({}, ancestors))", user.getDeptId(), user.getDeptId()));
            } else if (DATA_SCOPE_SELF.equals(dataScope)) {
                // 仅本人数据权限
                sqlString.append(StringUtils.format(" OR user_id = {}", user.getUserId()));
            }
            conditions.add(dataScope);
        }
        QueryWrapper<?> queryWrapper = getQueryWrapper(joinPoint);
        if (StringUtils.isNotBlank(sqlString.toString())) {
            queryWrapper.apply(sqlString.substring(4));
        }
    }
    private QueryWrapper<?> getQueryWrapper(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        if (args != null && args.length > 0 && args[0] instanceof QueryWrapper) {
            return (QueryWrapper<?>) args[0];
        }
        return null;
    }
//    /**
//     * 全部数据权限
//     */
//    public static final String DATA_SCOPE_ALL = "1";
//
//    /**
//     * 自定数据权限
//     */
//    public static final String DATA_SCOPE_CUSTOM = "2";
//
//    /**
//     * 部门数据权限
//     */
//    public static final String DATA_SCOPE_DEPT = "3";
//
//    /**
//     * 部门及以下数据权限
//     */
//    public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";
//
//    /**
//     * 仅本人数据权限
//     */
//    public static final String DATA_SCOPE_SELF = "5";
//
//
//    @Pointcut("@annotation(com.ard.common.annotation.DataScopePlus)")
//    public void dataScopePointcut() {
//    }
//
//    @Before("@annotation(controllerDataScopePlus)")
//    public void doBefore(JoinPoint joinPoint, DataScopePlus controllerDataScopePlus) {
//        handleDataScope(joinPoint, controllerDataScopePlus);
//    }
//
//    protected void handleDataScope(final JoinPoint joinPoint, DataScopePlus controllerDataScope) {
//        // 获取当前用户
//        LoginUser loginUser = SecurityUtils.getLoginUser();
//        if (StringUtils.isNotNull(loginUser)) {
//            SysUser currentUser = loginUser.getUser();
//            if (currentUser != null && !currentUser.isAdmin()) {
//                String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(),
//                        PermissionContextHolder.getContext());
//                dataScopeFilter(joinPoint, currentUser, permission);
//            }
//        }
//    }
//
//    private void dataScopeFilter(JoinPoint joinPoint, SysUser user, String permission) {
//        StringBuilder sqlString = new StringBuilder();
//        List<String> conditions = new ArrayList<>();
//        List<String> scopeCustomIds = new ArrayList<>();
//
//        // 获取用户角色并遍历进行权限检查
//        user.getRoles().forEach(role -> {
//            if (DATA_SCOPE_CUSTOM.equals(role.getDataScope()) && StringUtils.equals(role.getStatus(),
//                    UserConstants.ROLE_NORMAL)) {
//                if (StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) {
//                    scopeCustomIds.add(Convert.toStr(role.getRoleId()));
//                }
//            }
//        });
//
//        for (SysRole role : user.getRoles()) {
//            String dataScope = role.getDataScope();
//            if (conditions.contains(dataScope) || StringUtils.equals(role.getStatus(), UserConstants.ROLE_DISABLE)) {
//                continue;
//            }
//
//            if (!StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) {
//                continue;
//            }
//
//            if (DATA_SCOPE_ALL.equals(dataScope)) {
//                sqlString = new StringBuilder();
//                conditions.add(dataScope);
//                break;
//            } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) {
//                // 自定义数据权限
//                if (scopeCustomIds.size() > 1) {
//                    sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_role_dept WHERE " +
//                            "role_id IN ({}) )", String.join(",", scopeCustomIds)));
//                } else {
//                    sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_role_dept WHERE " +
//                            "role_id = {} )", role.getRoleId()));
//                }
//            } else if (DATA_SCOPE_DEPT.equals(dataScope)) {
//                // 部门数据权限
//                sqlString.append(StringUtils.format(" OR dept_id = {}", user.getDeptId()));
//            } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) {
//                // 部门及以下数据权限
//                sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = {} " +
//                        "OR find_in_set({}, ancestors))", user.getDeptId(), user.getDeptId()));
//            } else if (DATA_SCOPE_SELF.equals(dataScope)) {
//                // 仅本人数据权限
//                sqlString.append(StringUtils.format(" OR user_id = {}", user.getUserId()));
//            }
//            conditions.add(dataScope);
//        }
//        QueryWrapper<?> queryWrapper = getQueryWrapper(joinPoint);
//        if (StringUtils.isNotBlank(sqlString.toString())) {
//            queryWrapper.apply(sqlString.substring(4));
//        }
//    }
//
//    private QueryWrapper<?> getQueryWrapper(JoinPoint joinPoint) {
//        Object[] args = joinPoint.getArgs();
//        if (args != null && args.length > 0 && args[0] instanceof QueryWrapper) {
//            return (QueryWrapper<?>) args[0];
//        }
//        return null;
//    }
}