吉安感知网项目-后端
xiebin
2026-01-06 d207a86cdf1ab52ef8cb7cd83bad8fceab8038cf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package org.sxkj.resource.builder;
 
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.stereotype.Component;
import org.sxkj.system.cache.SysCache;
import org.sxkj.system.cache.UserCache;
import org.sxkj.system.entity.Dept;
import org.sxkj.system.entity.User;
 
import java.util.List;
 
/**
 * @Description 权限查询构建器
 * @Author AIX
 * @Date 2025/9/20 11:28
 * @Version 1.0
 */
@Component
public class DevicePermissionBuilder {
 
    /**
     * 构建设备查询的权限条件
     */
    public String buildDevicePermissionCondition(Long userId, String tableAlias) {
        if (userId == null) {
            return "1 = 0"; // 无用户ID,无权限
        }
 
        User user = UserCache.getUser(userId);
        if (user == null || user.getDeptId() == null) {
            return "1 = 0"; // 用户不存在或无部门,无权限
        }
 
        Dept userDept = SysCache.getDept(Long.valueOf(user.getDeptId()));
        if (userDept == null) {
            return "1 = 0"; // 部门不存在,无权限
        }
 
        StringBuilder condition = new StringBuilder();
        String alias = tableAlias != null ? tableAlias + "." : "";
 
        // 规则1:本部门设备,同部门设备
        List<Long> deptIds = SysCache.getDeptParentIds(userDept.getId());
 
//        condition.append(alias).append("domain = 3");
//        condition.append(" and ").append(alias).append("is_deleted = 0");
//        condition.append(" and ").append(alias).append("dept_id in (");
//        for (int i = 0; i < deptIds.size(); i++) {
//            if (i == deptIds.size() - 1) {
//                condition.append(deptIds.get(i));
//                continue;
//            }
//            condition.append(deptIds.get(i)).append(",");
//        }
//        condition.append(")");
 
        // 规则2:借调设备,同部门设备
        condition.append(alias).append("device_sn in (")
            .append("SELECT device_sn FROM manage_device_per_share ms ")
            .append("WHERE ms.device_sn = ").append(alias).append("device_sn ")
            .append("AND ms.loan_to_dept_id in (");
 
        for (int i = 0; i < deptIds.size(); i++) {
            if (i == deptIds.size() - 1) {
                condition.append(deptIds.get(i));
                continue;
            }
            condition.append(deptIds.get(i)).append(",");
        }
        condition.append(")) ").append(" and ").append(alias).append("hidden_flag = 0 ");
 
        // 规则3:统一部署机构的行政区划可见性
//        if (userDept.getDeploymentMode() == 0 && user.getAreaCode() != null) {
//            condition.append(" OR (")
//                .append(alias).append("area_code LIKE '").append(HeaderUtils.formatAreaCode(user.getAreaCode())).append("%'")
//                // 统一部署
//                .append(" and ").append(alias).append("deployment_mode = 0")
//                .append(")");
//        }
 
        return condition.toString();
    }
 
    public String buildDevicePermissionCondition(Long userId, String tableAlias, String sqlStr) {
        if (userId == null) {
            return "1 = 0"; // 无用户ID,无权限
        }
 
        User user = UserCache.getUser(userId);
        if (user == null || user.getDeptId() == null) {
            return "1 = 0"; // 用户不存在或无部门,无权限
        }
 
        Dept userDept = SysCache.getDept(Long.valueOf(user.getDeptId()));
        if (userDept == null) {
            return "1 = 0"; // 部门不存在,无权限
        }
 
        StringBuilder condition = new StringBuilder();
        String alias = tableAlias != null ? tableAlias + "." : "";
 
        //部门祖父集合
        List<Long> deptIds = SysCache.getDeptParentIds(userDept.getId());
 
        // 借调设备,同部门设备
        condition.append(alias).append("device_sn in (")
            .append("SELECT device_sn FROM manage_device_per_share ms ")
            .append("WHERE ms.device_sn = ").append(alias).append("device_sn ")
            .append("AND ms.loan_to_dept_id in (");
 
        for (int i = 0; i < deptIds.size(); i++) {
            if (i == deptIds.size() - 1) {
                condition.append(deptIds.get(i));
                continue;
            }
            condition.append(deptIds.get(i)).append(",");
        }
        condition.append(")) ").append(" and ").append(alias).append("hidden_flag = 0 ");
 
        condition.append(" " + sqlStr);
 
        return condition.toString();
    }
 
    /**
     * 构建数据查询的权限条件
     */
    public String buildDataPermissionCondition(Long userId, String tableAlias) {
 
        if (userId == null) {
            return "1 = 0"; // 无用户ID,无权限
        }
 
        User user = UserCache.getUser(userId);
        if (user == null || user.getDeptId() == null) {
            return "1 = 0"; // 用户不存在或无部门,无权限
        }
 
        Dept userDept = SysCache.getDept(Long.valueOf(user.getDeptId()));
        if (userDept == null) {
            return "1 = 0"; // 部门不存在,无权限
        }
 
        StringBuilder condition = new StringBuilder();
        String alias = StringUtil.isNotBlank(tableAlias)? tableAlias + "." : "";
 
        // 根据部门部署模式查询,单独查询只查看本部门数据
//        List<Long> deptIds = SysCache.getDeptChildIds(userDept.getId());
        condition.append(alias).append("create_dept in (");
        condition.append("SELECT id FROM blade_dept ")
            .append("WHERE id = ").append(alias).append("create_dept ")
            .append("AND deployment_mode = ").append(userDept.getDeploymentMode());
 
        condition.append(")");
 
        return condition.toString();
    }
 
}