CZT
2023-09-06 71c4fa1e27f75ae4b765c95c67a3069c84dc72ba
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
package com.ld.igds.sys.service;
 
import com.bstek.bdf2.core.model.Role;
import com.bstek.bdf2.core.model.RoleMember;
import com.bstek.bdf2.core.model.RoleResource;
import com.bstek.bdf2.core.model.Url;
import com.bstek.bdf2.core.orm.hibernate.HibernateDao;
import com.bstek.bdf2.core.service.IUrlService;
import com.ld.igds.constant.RedisConst;
import com.ld.igds.util.ContextUtil;
 
import com.ld.igds.util.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@Repository(SysRoleService.BEAN_ID)
public class SysRoleService extends HibernateDao {
 
    public static final String BEAN_ID = "sys.RoleService";
 
    private String CACHE_ROLE_URL = "ROLE_URL";
 
    private String CACHE_ROLE_USER = "ROLE_USER";
 
    @Autowired
    private IUrlService urlService;
    @Autowired
    private RedisUtil redisUtil;
 
    public List<Role> getRolesByUsername(String username) {
        String hql = " from " + Role.class.getName() + " where id in("
                + "select roleId from " + RoleMember.class.getName()
                + " where username=:username)";
 
        Map<String, Object> args = new HashMap<String, Object>();
        args.put("username", username);
        return this.query(hql, args);
    }
 
    public Role getRoleByUsername(String username) {
        List<Role> roles = this.getRolesByUsername(username);
        if (null == roles || roles.isEmpty())
            return null;
 
        return roles.get(0);
    }
 
    public List<Role> loadRoles(String companyId) {
 
        String hql = " from " + Role.class.getName()
                + " where companyId=:companyId order by name";
 
        Map<String, Object> args = new HashMap<>();
        args.put("companyId", companyId);
        return this.query(hql, args);
    }
 
    public void updateUserRole(String username, String roleId) {
        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(roleId)) {
            return;
        }
 
        // 删除当前用户的原来均色
        Session session = this.getSessionFactory().openSession();
        try {
            String hql = "delete from " + RoleMember.class.getName()
                    + " where username=:username";
            Query query = session.createQuery(hql);
            query.setString("username", username);
            query.executeUpdate();
 
            // 执行新增
            RoleMember member = new RoleMember();
            member.setId(ContextUtil.getUUID());
            member.setUsername(username);
            member.setRoleId(roleId);
            member.setCreateDate(new Date());
            member.setGranted(true);
 
            session.save(member);
 
        } finally {
            session.flush();
            session.close();
        }
 
    }
 
    public String delRole(Role data) {
        if (null == data.getId())
            return null;
 
        Session session = this.getSessionFactory().openSession();
        try {
 
            // 删除角色
            String hql = " delete from " + Role.class.getName()
                    + " where id = :id";
            Query query = session.createQuery(hql);
            query.setString("id", data.getId());
            query.executeUpdate();
 
            // 删除角色成员
            hql = " delete from " + RoleMember.class.getName()
                    + " where roleId = :id";
            query = session.createQuery(hql);
            query.setString("id", data.getId());
            query.executeUpdate();
 
            // 删除角色资源
            hql = " delete from " + RoleResource.class.getName()
                    + " where roleId = :id";
            query = session.createQuery(hql);
            query.setString("id", data.getId());
            query.executeUpdate();
 
        } finally {
            session.flush();
            session.close();
        }
 
        return null;
    }
 
    public void updateRole(Role data) {
 
        Session session = this.getSessionFactory().openSession();
        try {
            if (null == data.getCompanyId()) {
                data.setCompanyId(ContextUtil.getCompanyId());
 
                session.save(data);
            } else {
                session.update(data);
            }
 
        } finally {
            session.flush();
            session.close();
        }
 
    }
 
    public List<Url> loadUrls(String companyId, String parentId, String roleId) {
 
        // 已经分配的菜单
        List<Url> allUrls = urlService.loadUrlsByRoleId(roleId);
 
        String hql = "from " + Url.class.getName()
                + " u where u.companyId=:companyId";
        Map<String, Object> parameterMap = new HashMap<String, Object>();
        parameterMap.put("companyId", companyId);
        hql += " and u.parentId=:parentId order by u.order asc";
        parameterMap.put("parentId", parentId);
        List<Url> urls = this.query(hql, parameterMap);
 
        for (Url url : urls) {
            url.setUse(this.checkUse(url, allUrls));
        }
        return urls;
    }
 
    public List<Url> loadUrls(String companyId, String roleId) {
 
        // 已经分配的菜单
        List<Url> allUrls = urlService.loadUrlsByRoleId(roleId);
 
        String hql = "from " + Url.class.getName()
                + " u where u.companyId=:companyId";
        Map<String, Object> parameterMap = new HashMap<String, Object>();
        parameterMap.put("companyId", companyId);
        hql += " and u.parentId is null order by u.order asc";
        List<Url> urls = this.query(hql, parameterMap);
 
        for (Url url : urls) {
            url.setUse(this.checkUse(url, allUrls));
        }
        return urls;
    }
 
    private boolean checkUse(Url url, List<Url> allUrls) {
        if (null == allUrls || allUrls.isEmpty())
            return false;
        for (Url roleUrl : allUrls) {
            if (url.getId().equals(roleUrl.getId())) {
                return true;
            }
        }
        return false;
    }
 
    /**
     * 根据组织编码更新缓存
     *
     * @param companyId
     */
    public List<RoleResource> updateCacheRoleUrl(String companyId) {
        String hql = "from " + RoleResource.class.getName();
 
        List<RoleResource> resources = this.query(hql);
 
        if (null == resources || resources.isEmpty()) {
            redisUtil.del(RedisConst.buildKey(companyId, CACHE_ROLE_URL));
        } else {
            redisUtil.set(RedisConst.buildKey(companyId, CACHE_ROLE_URL), resources);
        }
        return resources;
    }
 
 
    /**
     * 根据用户获取当前用户所拥有的角色下的菜单信息
     * @param companyId
     * @param userName
     * @return
     */
    public Map<String, String> getMapUrlByUser(String companyId, String userName) {
        List<RoleResource> resources = (List<RoleResource>) redisUtil.get(RedisConst.buildKey(companyId, CACHE_ROLE_URL));
 
        if (null == resources || resources.isEmpty()) return null;
 
        String roleId = (String) redisUtil.get(RedisConst.buildKey(CACHE_ROLE_USER, userName));
        if (StringUtils.isEmpty(roleId)) return null;
 
        Map<String, String> result = new HashMap<>();
        for (RoleResource roleUrl : resources) {
            if (roleUrl.getRoleId().equals(roleId)) result.put(roleUrl.getUrlId(), roleUrl.getRoleId());
        }
 
        return result;
    }
 
    public void updateCacheRoleUser(String companyId) {
        String hql = "from " + RoleMember.class.getName();
        List<RoleMember> resources = this.query(hql);
        if (null == resources || resources.isEmpty()) return;
 
        String key;
        for (RoleMember roleUser : resources) {
            key = RedisConst.buildKey(CACHE_ROLE_USER, roleUser.getUsername());
            redisUtil.set(key, roleUser.getRoleId());
        }
    }
}