懒羊羊
2023-08-30 1ac2bc1590406d9babec036e154d8d08f34a6aa1
提交 | 用户 | 时间
1ac2bc 1 package cn.stylefeng.guns.sys.modular.system.service;
2
3 import cn.hutool.core.collection.CollectionUtil;
4 import cn.stylefeng.guns.base.auth.context.LoginContextHolder;
5 import cn.stylefeng.guns.base.auth.model.LoginUser;
6 import cn.stylefeng.guns.base.oauth2.entity.OauthUserInfo;
7 import cn.stylefeng.guns.base.oauth2.service.OauthUserInfoService;
8 import cn.stylefeng.guns.base.pojo.node.MenuNode;
9 import cn.stylefeng.guns.base.pojo.page.LayuiPageFactory;
10 import cn.stylefeng.guns.sys.core.constant.Const;
11 import cn.stylefeng.guns.sys.core.constant.factory.ConstantFactory;
12 import cn.stylefeng.guns.sys.core.constant.state.ManagerStatus;
13 import cn.stylefeng.guns.sys.core.exception.enums.BizExceptionEnum;
14 import cn.stylefeng.guns.sys.core.util.DefaultImages;
15 import cn.stylefeng.guns.sys.core.util.SaltUtil;
16 import cn.stylefeng.guns.sys.modular.system.entity.User;
17 import cn.stylefeng.guns.sys.modular.system.entity.UserPos;
18 import cn.stylefeng.guns.sys.modular.system.factory.UserFactory;
19 import cn.stylefeng.guns.sys.modular.system.mapper.UserMapper;
20 import cn.stylefeng.guns.sys.modular.system.model.UserDto;
21 import cn.stylefeng.roses.core.datascope.DataScope;
22 import cn.stylefeng.roses.core.util.SpringContextHolder;
23 import cn.stylefeng.roses.core.util.ToolUtil;
24 import cn.stylefeng.roses.kernel.model.exception.ServiceException;
25 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
26 import com.baomidou.mybatisplus.core.metadata.IPage;
27 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
28 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
29 import org.springframework.beans.factory.annotation.Autowired;
30 import org.springframework.stereotype.Service;
31 import org.springframework.transaction.annotation.Transactional;
32
33 import java.util.ArrayList;
34 import java.util.HashMap;
35 import java.util.List;
36 import java.util.Map;
37
38 /**
39  * <p>
40  * 管理员表 服务实现类
41  * </p>
42  *
43  * @author stylefeng
44  * @since 2018-12-07
45  */
46 @Service
47 public class UserService extends ServiceImpl<UserMapper, User> {
48
49     @Autowired
50     private MenuService menuService;
51
52     @Autowired
53     private UserPosService userPosService;
54
55     /**
56      * 添加用戶
57      *
58      * @author fengshuonan
59      * @Date 2018/12/24 22:51
60      */
61     @Transactional(rollbackFor = Exception.class)
62     public void addUser(UserDto user) {
63
64         // 判断账号是否重复
65         User theUser = this.getByAccount(user.getAccount());
66         if (theUser != null) {
67             throw new ServiceException(BizExceptionEnum.USER_ALREADY_REG);
68         }
69
70         // 完善账号信息
71         String salt = SaltUtil.getRandomSalt();
72         String password = SaltUtil.md5Encrypt(user.getPassword(), salt);
73
74         User newUser = UserFactory.createUser(user, password, salt);
75         this.save(newUser);
76
77         //添加职位关联
78         addPosition(user.getPosition(), newUser.getUserId());
79     }
80
81     /**
82      * 修改用户
83      *
84      * @author fengshuonan
85      * @Date 2018/12/24 22:53
86      */
87     @Transactional(rollbackFor = Exception.class)
88     public void editUser(UserDto user) {
89         User oldUser = this.getById(user.getUserId());
90
91         if (LoginContextHolder.getContext().hasRole(Const.ADMIN_NAME)) {
92             this.updateById(UserFactory.editUser(user, oldUser));
93         } else {
94             this.assertAuth(user.getUserId());
95             LoginUser shiroUser = LoginContextHolder.getContext().getUser();
96             if (shiroUser.getId().equals(user.getUserId())) {
97                 this.updateById(UserFactory.editUser(user, oldUser));
98             } else {
99                 throw new ServiceException(BizExceptionEnum.NO_PERMITION);
100             }
101         }
102
103         //删除职位关联
104         userPosService.remove(new QueryWrapper<UserPos>().eq("user_id", user.getUserId()));
105
106         //添加职位关联
107         addPosition(user.getPosition(), user.getUserId());
108     }
109
110     /**
111      * 删除用户
112      *
113      * @author fengshuonan
114      * @Date 2018/12/24 22:54
115      */
116     @Transactional(rollbackFor = Exception.class)
117     public void deleteUser(Long userId) {
118
119         //不能删除超级管理员
120         if (userId.equals(Const.ADMIN_ID)) {
121             throw new ServiceException(BizExceptionEnum.CANT_DELETE_ADMIN);
122         }
123         this.assertAuth(userId);
124         this.setStatus(userId, ManagerStatus.DELETED.getCode());
125
126         //删除对应的oauth2绑定表
127         OauthUserInfoService oauthUserInfoService = null;
128         try {
129             oauthUserInfoService = SpringContextHolder.getBean(OauthUserInfoService.class);
130             oauthUserInfoService.remove(new QueryWrapper<OauthUserInfo>().eq("user_id", userId));
131         } catch (Exception e) {
132             //没有集成oauth2模块,不操作
133         }
134
135         //删除职位关联
136         userPosService.remove(new QueryWrapper<UserPos>().eq("user_id", userId));
137     }
138
139     /**
140      * 修改用户状态
141      *
142      * @author fengshuonan
143      * @Date 2018/12/24 22:45
144      */
145     public int setStatus(Long userId, String status) {
146         return this.baseMapper.setStatus(userId, status);
147     }
148
149     /**
150      * 修改密码
151      *
152      * @author fengshuonan
153      * @Date 2018/12/24 22:45
154      */
155     public void changePwd(String oldPassword, String newPassword) {
156         Long userId = LoginContextHolder.getContext().getUser().getId();
157         User user = this.getById(userId);
158
159         String oldMd5 = SaltUtil.md5Encrypt(oldPassword, user.getSalt());
160
161         if (user.getPassword().equals(oldMd5)) {
162             String newMd5 = SaltUtil.md5Encrypt(newPassword, user.getSalt());
163             user.setPassword(newMd5);
164             this.updateById(user);
165         } else {
166             throw new ServiceException(BizExceptionEnum.OLD_PWD_NOT_RIGHT);
167         }
168     }
169
170     /**
171      * 根据条件查询用户列表
172      *
173      * @author fengshuonan
174      * @Date 2018/12/24 22:45
175      */
176     public Page<Map<String, Object>> selectUsers(DataScope dataScope, String name, String beginTime, String endTime, Long deptId) {
177         Page page = LayuiPageFactory.defaultPage();
178         return this.baseMapper.selectUsers(page, dataScope, name, beginTime, endTime, deptId);
179     }
180
181     /**
182      * 设置用户的角色
183      *
184      * @author fengshuonan
185      * @Date 2018/12/24 22:45
186      */
187     public int setRoles(Long userId, String roleIds) {
188         return this.baseMapper.setRoles(userId, roleIds);
189     }
190
191     /**
192      * 通过账号获取用户
193      *
194      * @author fengshuonan
195      * @Date 2018/12/24 22:46
196      */
197     public User getByAccount(String account) {
198         return this.baseMapper.getByAccount(account);
199     }
200
201     /**
202      * 获取用户菜单列表
203      *
204      * @author fengshuonan
205      * @Date 2018/12/24 22:46
206      */
207     public List<Map<String, Object>> getUserMenuNodes(List<Long> roleList) {
208         if (roleList == null || roleList.size() == 0) {
209             return new ArrayList<>();
210         } else {
211             List<MenuNode> menus = menuService.getMenusByRoleIds(roleList);
212
213             //定义不同系统分类的菜单集合
214             ArrayList<Map<String, Object>> lists = new ArrayList<>();
215
216             //根据当前用户包含的系统类型,分类出不同的菜单
217             List<Map<String, Object>> systemTypes = LoginContextHolder.getContext().getUser().getSystemTypes();
218             for (Map<String, Object> systemType : systemTypes) {
219
220                 //当前遍历系统分类code
221                 String systemCode = (String) systemType.get("code");
222
223                 //获取当前系统分类下菜单集合
224                 ArrayList<MenuNode> originSystemTypeMenus = new ArrayList<>();
225                 for (MenuNode menu : menus) {
226                     if (menu.getSystemType().equals(systemCode)) {
227                         originSystemTypeMenus.add(menu);
228                     }
229                 }
230
231                 //拼接存放key为系统分类编码,value为该分类下菜单集合的map
232                 HashMap<String, Object> map = new HashMap<>();
233                 List<MenuNode> treeSystemTypeMenus = MenuNode.buildTitle(originSystemTypeMenus);
234                 map.put("systemType", systemCode);
235                 map.put("menus", treeSystemTypeMenus);
236                 lists.add(map);
237             }
238
239             return lists;
240         }
241     }
242
243     /**
244      * 判断当前登录的用户是否有操作这个用户的权限
245      *
246      * @author fengshuonan
247      * @Date 2018/12/24 22:44
248      */
249     public void assertAuth(Long userId) {
250         if (LoginContextHolder.getContext().isAdmin()) {
251             return;
252         }
253         List<Long> deptDataScope = LoginContextHolder.getContext().getDeptDataScope();
254         User user = this.getById(userId);
255         Long deptId = user.getDeptId();
256         if (deptDataScope.contains(deptId)) {
257             return;
258         } else {
259             throw new ServiceException(BizExceptionEnum.NO_PERMITION);
260         }
261     }
262
263     /**
264      * 刷新当前登录用户的信息
265      *
266      * @author fengshuonan
267      * @Date 2019/1/19 5:59 PM
268      */
269     public void refreshCurrentUser() {
270         //TODO 刷新
271     }
272
273     /**
274      * 获取用户的基本信息
275      *
276      * @author fengshuonan
277      * @Date 2019-05-04 17:12
278      */
279     public Map<String, Object> getUserInfo(Long userId) {
280         User user = this.getById(userId);
281         Map<String, Object> map = UserFactory.removeUnSafeFields(user);
282
283         HashMap<String, Object> hashMap = CollectionUtil.newHashMap();
284         hashMap.putAll(map);
285         hashMap.put("roleName", ConstantFactory.me().getRoleName(user.getRoleId()));
286         hashMap.put("deptName", ConstantFactory.me().getDeptName(user.getDeptId()));
287
288         return hashMap;
289     }
290
291     /**
292      * 获取用户首页信息
293      *
294      * @author fengshuonan
295      * @Date 2019/10/17 16:18
296      */
297     public Map<String, Object> getUserIndexInfo() {
298
299         //获取当前用户角色列表
300         LoginUser user = LoginContextHolder.getContext().getUser();
301         List<Long> roleList = user.getRoleList();
302
303         //用户没有角色无法显示首页信息
304         if (roleList == null || roleList.size() == 0) {
305             return null;
306         }
307
308         List<Map<String, Object>> menus = this.getUserMenuNodes(roleList);
309
310         HashMap<String, Object> result = new HashMap<>();
311         result.put("menus", menus);
312         result.put("avatar", DefaultImages.defaultAvatarUrl());
313         result.put("name", user.getName());
314
315         return result;
316     }
317
318     /**
319      * 添加职位关联
320      *
321      * @author fengshuonan
322      * @Date 2019-06-28 13:35
323      */
324     private void addPosition(String positions, Long userId) {
325         if (ToolUtil.isNotEmpty(positions)) {
326             String[] position = positions.split(",");
327             for (String item : position) {
328
329                 UserPos entity = new UserPos();
330                 entity.setUserId(userId);
331                 entity.setPosId(Long.valueOf(item));
332
333                 userPosService.save(entity);
334             }
335         }
336     }
337
338     /**
339      * 选择办理人
340      *
341      * @author fengshuonan
342      * @Date 2019-08-27 19:07
343      */
344     public IPage listUserAndRoleExpectAdmin(Page pageContext) {
345         return baseMapper.listUserAndRoleExpectAdmin(pageContext);
346     }
347 }