|  |  | 
 |  |  | package com.moral.api.service.impl; | 
 |  |  |  | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.beans.factory.annotation.Value; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.util.ObjectUtils; | 
 |  |  | import org.springframework.web.context.request.RequestContextHolder; | 
 |  |  | import org.springframework.web.context.request.ServletRequestAttributes; | 
 |  |  |  | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Comparator; | 
 |  |  | import java.util.Date; | 
 |  |  | 
 |  |  | import java.util.Map; | 
 |  |  | import java.util.Objects; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.beans.factory.annotation.Value; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.web.context.request.RequestContextHolder; | 
 |  |  | import org.springframework.web.context.request.ServletRequestAttributes; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletRequest; | 
 |  |  |  | 
 |  |  | 
 |  |  | import com.moral.api.entity.Organization; | 
 |  |  | import com.moral.api.entity.User; | 
 |  |  | import com.moral.api.entity.UserGroup; | 
 |  |  |  | 
 |  |  | import com.moral.api.entity.UserLog; | 
 |  |  | import com.moral.api.mapper.MenuMapper; | 
 |  |  | import com.moral.api.mapper.UserGroupMapper; | 
 |  |  | 
 |  |  |  * @since 2021-03-09 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private UserLogMapper userLogMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private OperationLogUtils operationLogUtils; | 
 |  |  |  | 
 |  |  |     @Value("${AES.KEY}") | 
 |  |  |     private String AESKey; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public UserBO selectUserInfo(Map<String, Object> parameters) { | 
 |  |  | 
 |  |  |         //封装用户信息 | 
 |  |  |         Map<String, Object> userInfo = new LinkedHashMap<>(); | 
 |  |  |  | 
 |  |  |         //用户in西 | 
 |  |  |         //用户信息 | 
 |  |  |         userInfo.put("userId", userBo.getId()); | 
 |  |  |         userInfo.put("account", userBo.getAccount()); | 
 |  |  |         userInfo.put("userName", userBo.getUserName()); | 
 |  |  | 
 |  |  |         userInfo.put("organization", orgInfo); | 
 |  |  |  | 
 |  |  |         //用户组信息 | 
 |  |  |         List<Map<String, Object>> groups = new ArrayList<>(); | 
 |  |  |         for (Group group : userBo.getGroups()) { | 
 |  |  |             HashMap<String, Object> groupMap = new LinkedHashMap<>(); | 
 |  |  |         Group group = userBo.getGroup(); | 
 |  |  |         Map<String, Object> groupMap = new LinkedHashMap<>(); | 
 |  |  |         userInfo.put("group", groupMap); | 
 |  |  |         if (group != null) { | 
 |  |  |             groupMap.put("id", group.getId()); | 
 |  |  |             groupMap.put("groupName", group.getGroupName()); | 
 |  |  |             groups.add(groupMap); | 
 |  |  |             userInfo.put("group", groupMap); | 
 |  |  |         } | 
 |  |  |         userInfo.put("groups", groups); | 
 |  |  |  | 
 |  |  |         Map<String, Object> map = new HashMap<>(); | 
 |  |  |         map.put("userId", userBo.getId()); | 
 |  |  | 
 |  |  |         try { | 
 |  |  |             //生成token,并存入redis | 
 |  |  |             String token = TokenUtils.getToken(userBo.getId().toString(), userInfo); | 
 |  |  |             Map<String, Object> data = new HashMap<>(); | 
 |  |  |             data.put("token", token); | 
 |  |  |             data.put("user", userInfo); | 
 |  |  |             result.put("data", data); | 
 |  |  |             result.put("token", token); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("token生成异常:" + e.getMessage()); | 
 |  |  |             result.put("code", ResponseCodeEnum.TOKEN_CREATE_ERROR.getCode()); | 
 |  |  |             result.put("msg", ResponseCodeEnum.TOKEN_CREATE_ERROR.getMsg()); | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |         //日志 | 
 |  |  |         HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); | 
 |  |  |         UserLog userLog = new UserLog(); | 
 |  |  |         userLog.setType(Constants.LOGIN_OPERTATE_TYPE); | 
 |  |  |         userLog.setIp(WebUtils.getIpAddr(request)); | 
 |  |  |         userLog.setOperateId(userBo.getId()); | 
 |  |  |         userLog.setOrganizationId(userBo.getOrganizationId()); | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Map<String, Object> getCurrentUserInfo() { | 
 |  |  |         Map<String, Object> userInfo = (Map<String, Object>) TokenUtils.getUserInfo(); | 
 |  |  |         return userInfo; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Map<String, Object> getMenus(Map<String, Object> parameters) { | 
 |  |  |         List<Menu> allMenus; | 
 |  |  |         if (parameters.containsKey("userId")) { | 
 |  |  |             allMenus = menuMapper.selectUserMenu(Integer.parseInt(parameters.get("userId").toString())); | 
 |  |  |         } else { | 
 |  |  |             allMenus = menuMapper.selectOrganizationMenu(Integer.parseInt(parameters.get("orgId").toString())); | 
 |  |  |             allMenus.removeIf(m -> "员工管理".equals(m.getName())); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         Map<String, Object> resultMap = new LinkedHashMap<>(); | 
 |  |  | 
 |  |  |         oneMenu.forEach(o -> { | 
 |  |  |             Map<String, Object> menuMap = new LinkedHashMap<>(); | 
 |  |  |             menuMap.put("id", o.getId()); | 
 |  |  |             menuMap.put("name", o.getName()); | 
 |  |  |             menuMap.put("label", o.getName()); | 
 |  |  |             menuMap.put("url", o.getUrl()); | 
 |  |  |             menuMap.put("icon", o.getIcon()); | 
 |  |  |             menuMap.put("child", getMenusByRecursion(o, allMenus)); | 
 |  |  |             menuMap.put("children", getMenusByRecursion(o, allMenus)); | 
 |  |  |             newList.add(menuMap); | 
 |  |  |         }); | 
 |  |  |         resultMap.put("menus", newList); | 
 |  |  | 
 |  |  |         //筛选出下一级菜单信息 | 
 |  |  |         List<Menu> nextLevelMenus = menus.stream() | 
 |  |  |                 .filter(o -> o.getParentId().equals(menu.getId())) | 
 |  |  |                 .sorted(Comparator.comparing(Menu::getOrder)) | 
 |  |  |                 .collect(Collectors.toList()); | 
 |  |  |         List<Map<String, Object>> list = new ArrayList<>(); | 
 |  |  |         if (nextLevelMenus.size() > 0) { | 
 |  |  | 
 |  |  |             nextLevelMenus.forEach(o -> { | 
 |  |  |                 Map<String, Object> menuMap = new LinkedHashMap<>(); | 
 |  |  |                 menuMap.put("id", o.getId()); | 
 |  |  |                 menuMap.put("name", o.getName()); | 
 |  |  |                 menuMap.put("label", o.getName()); | 
 |  |  |                 menuMap.put("url", o.getUrl()); | 
 |  |  |                 menuMap.put("icon", o.getIcon()); | 
 |  |  |                 //调用递归体 | 
 |  |  |                 menuMap.put("child", getMenusByRecursion(o, menus)); | 
 |  |  |                 menuMap.put("children", getMenusByRecursion(o, menus)); | 
 |  |  |                 list.add(menuMap); | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public Map<String, Object> addUser(User user, String token) { | 
 |  |  |     public Map<String, Object> addUser(User user) { | 
 |  |  |  | 
 |  |  |         Map<String, Object> result = new HashMap<>(); | 
 |  |  |         Map<String, Object> currentUserInfo = (Map<String, Object>) TokenUtils.getUserInfoByToken(token); | 
 |  |  |         Map<String, Object> currentUserInfo = (Map<String, Object>) TokenUtils.getUserInfo(); | 
 |  |  |  | 
 |  |  |         QueryWrapper<User> queryWrapper = new QueryWrapper<>(); | 
 |  |  |         queryWrapper.eq("account", user.getAccount()).eq("is_delete", Constants.NOT_DELETE); | 
 |  |  |         //校验账户是否存在 | 
 |  |  |         if (user.selectOne(queryWrapper) != null) { | 
 |  |  |         if (user.selectCount(queryWrapper) > 0) { | 
 |  |  |             result.put("code", ResponseCodeEnum.ACCOUNT_EXIST.getCode()); | 
 |  |  |             result.put("msg", ResponseCodeEnum.ACCOUNT_EXIST.getMsg()); | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |         //正则校验账户 | 
 |  |  |         //校验账户 | 
 |  |  |         if (!RegexUtils.checkAccount(user.getAccount())) { | 
 |  |  |             result.put("code", ResponseCodeEnum.ACCOUNT_INVALID.getCode()); | 
 |  |  |             result.put("msg", ResponseCodeEnum.ACCOUNT_INVALID.getMsg()); | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |         //正则校验账户 | 
 |  |  |         if (user.getEmail() != null && !RegexUtils.checkEmail(user.getEmail())) { | 
 |  |  |  | 
 |  |  |         //校验邮箱 | 
 |  |  |         if (!ObjectUtils.isEmpty(user.getEmail()) && !RegexUtils.checkEmail(user.getEmail())) { | 
 |  |  |             result.put("code", ResponseCodeEnum.EMAIL_INVALID.getCode()); | 
 |  |  |             result.put("msg", ResponseCodeEnum.EMAIL_INVALID.getMsg()); | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |         //正则校验密码 | 
 |  |  |         //校验密码 | 
 |  |  |         String password = user.getPassword(); | 
 |  |  |         //密码解密 | 
 |  |  |         password = AESUtils.decrypt(password, AESKey); | 
 |  |  | 
 |  |  |             result.put("msg", ResponseCodeEnum.PASSWORD_INVALID.getMsg()); | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |         //正则校验手机号 | 
 |  |  |         if (user.getMobile() != null && !RegexUtils.checkMobile(user.getMobile())) { | 
 |  |  |         //校验手机号 | 
 |  |  |         if (!ObjectUtils.isEmpty(user.getMobile()) && !RegexUtils.checkMobile(user.getMobile())) { | 
 |  |  |             result.put("code", ResponseCodeEnum.MOBILE_INVALID.getCode()); | 
 |  |  |             result.put("msg", ResponseCodeEnum.MOBILE_INVALID.getMsg()); | 
 |  |  |             return result; | 
 |  |  | 
 |  |  |         } | 
 |  |  |         userMapper.insert(user); | 
 |  |  |         //日志 | 
 |  |  |         HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); | 
 |  |  |         String content = "添加了用户:" + user.getAccount(); | 
 |  |  |         OperationLogUtils.insertLog(request, content); | 
 |  |  |         operationLogUtils.insertLog(content, Constants.INSERT_OPERATE_TYPE); | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public void deleteUser(User user) { | 
 |  |  |         String userId = user.getId().toString(); | 
 |  |  |     public void deleteUser(Integer userId) { | 
 |  |  |         User user = userMapper.selectById(userId); | 
 |  |  |         //逻辑删除user | 
 |  |  |         user.setIsDelete(Constants.DELETE); | 
 |  |  |         userMapper.updateById(user); | 
 |  |  |         //逻辑删除user_group | 
 |  |  |         UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); | 
 |  |  |         updateWrapper.eq("id", userId).set("is_delete", Constants.DELETE); | 
 |  |  |         userMapper.update(null, updateWrapper); | 
 |  |  |         //删除user_group | 
 |  |  |         UpdateWrapper<UserGroup> deleteWrapper = new UpdateWrapper<>(); | 
 |  |  |         deleteWrapper.set("is_delete", Constants.DELETE).eq("user_id", userId); | 
 |  |  |         //更新redis | 
 |  |  |         if (TokenUtils.hHasKey(userId)) { | 
 |  |  |             String token = TokenUtils.hget(userId).toString(); | 
 |  |  |             TokenUtils.destoryToken(userId, token); | 
 |  |  |         deleteWrapper.eq("user_id", userId); | 
 |  |  |         userGroupMapper.delete(deleteWrapper); | 
 |  |  |         //清楚redis | 
 |  |  |         if (TokenUtils.hHasKey(userId.toString())) { | 
 |  |  |             String token = TokenUtils.hget(userId.toString()).toString(); | 
 |  |  |             TokenUtils.destoryToken(userId.toString(), token); | 
 |  |  |         } | 
 |  |  |         userGroupMapper.update(null, deleteWrapper); | 
 |  |  |         //日志 | 
 |  |  |         HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); | 
 |  |  |         String content = "删除了用户:" + user.getAccount(); | 
 |  |  |         OperationLogUtils.insertLog(request, content); | 
 |  |  |         operationLogUtils.insertLog(content, Constants.DELETE_OPERATE_TYPE); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public Map<String, Object> updateUser(User user, String token) { | 
 |  |  |     public Map<String, Object> updateUser(User user) { | 
 |  |  |         Map<String, Object> result = new HashMap<>(); | 
 |  |  |         //更新的属性 | 
 |  |  |         Map<String, Object> update = JSONObject.parseObject(JSON.toJSONString(user), Map.class); | 
 |  |  |         Map<String, Object> result = new HashMap<>(); | 
 |  |  |         Map<String, Object> currentUserInfo = (Map<String, Object>) TokenUtils.getUserInfoByToken(token); | 
 |  |  |         Map<String, Object> currentUserInfo = (Map<String, Object>) TokenUtils.getUserInfo(); | 
 |  |  |         User beforeUser = userMapper.selectById(user.getId()); | 
 |  |  |         Map<String, Object> before = JSONObject.parseObject(JSON.toJSONString(beforeUser), Map.class); | 
 |  |  |         String account = beforeUser.getAccount(); | 
 |  |  |         /*String account = beforeUser.getAccount(); | 
 |  |  |         //account不可修改 | 
 |  |  |         user.setAccount(account); | 
 |  |  |         user.setAccount(account);*/ | 
 |  |  |         if (!ObjectUtils.isEmpty(user.getAccount())) { | 
 |  |  |             QueryWrapper<User> queryWrapper = new QueryWrapper<>(); | 
 |  |  |             queryWrapper.eq("is_delete", Constants.NOT_DELETE).eq("account", user.getAccount()); | 
 |  |  |             if (userMapper.selectCount(queryWrapper) > 0) { | 
 |  |  |                 result.put("code", ResponseCodeEnum.ACCOUNT_EXIST.getCode()); | 
 |  |  |                 result.put("msg", ResponseCodeEnum.ACCOUNT_EXIST.getMsg()); | 
 |  |  |                 return result; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //邮箱校验 | 
 |  |  |         if (user.getEmail() != null && !RegexUtils.checkEmail(user.getEmail())) { | 
 |  |  |         if (!ObjectUtils.isEmpty(user.getEmail()) && !RegexUtils.checkEmail(user.getEmail())) { | 
 |  |  |             result.put("code", ResponseCodeEnum.EMAIL_INVALID.getCode()); | 
 |  |  |             result.put("msg", ResponseCodeEnum.EMAIL_INVALID.getMsg()); | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |         //密码校验 | 
 |  |  |         String password = user.getPassword(); | 
 |  |  |         if (password != null) { | 
 |  |  |         if (!ObjectUtils.isEmpty(password)) { | 
 |  |  |             //密码解密 | 
 |  |  |             password = AESUtils.decrypt(password, AESKey); | 
 |  |  |             if (!RegexUtils.checkPassword(password)) { | 
 |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //正则校验手机号 | 
 |  |  |         if (user.getMobile() != null && !RegexUtils.checkMobile(user.getMobile())) { | 
 |  |  |         if (!ObjectUtils.isEmpty(user.getMobile()) && !RegexUtils.checkMobile(user.getMobile())) { | 
 |  |  |             result.put("code", ResponseCodeEnum.MOBILE_INVALID.getCode()); | 
 |  |  |             result.put("msg", ResponseCodeEnum.MOBILE_INVALID.getMsg()); | 
 |  |  |             return result; | 
 |  |  | 
 |  |  |         Date orgExpireTime = DateUtils.getDate((String) orgInfo.get("expireTime"), DateUtils.yyyy_MM_dd_HH_mm_ss_EN); | 
 |  |  |         if (userExpireTime != null) { | 
 |  |  |             if (orgExpireTime != null && userExpireTime.getTime() > orgExpireTime.getTime()) { | 
 |  |  |                 user.setExpireTime(orgExpireTime); | 
 |  |  |             } else { | 
 |  |  |                 user.setExpireTime(userExpireTime); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             if (orgExpireTime != null) { | 
 |  |  |                 user.setExpireTime(orgExpireTime); | 
 |  |  |                 result.put("code", ResponseCodeEnum.EXPIRE_BEYOND_ADMIN.getCode()); | 
 |  |  |                 result.put("msg", ResponseCodeEnum.EXPIRE_BEYOND_ADMIN.getMsg()); | 
 |  |  |                 return result; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         //更新redis | 
 |  |  | 
 |  |  |         userMapper.updateById(user); | 
 |  |  |  | 
 |  |  |         //日志 | 
 |  |  |         HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); | 
 |  |  |         StringBuilder content = new StringBuilder("修改了用户:" + user.getAccount() + "->"); | 
 |  |  |         String account = userMapper.selectById(userId).getAccount(); | 
 |  |  |         StringBuilder content = new StringBuilder("修改了用户:" + account + "->"); | 
 |  |  |         for (String key : update.keySet()) { | 
 |  |  |             Object afterValue = update.get(key); | 
 |  |  |             if (!key.equals("id") && afterValue != null) { | 
 |  |  | 
 |  |  |                 content.append(key).append(":").append(beforeValue).append("=>").append(afterValue).append(";"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         OperationLogUtils.insertLog(request, content.toString()); | 
 |  |  |  | 
 |  |  |         operationLogUtils.insertLog(content.toString(), Constants.UPDATE_OPERATE_TYPE); | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Page<User> selectUsers(Map<String, Object> parameters) { | 
 |  |  |         Map<String, Object> currentUserInfo = (Map<String, Object>) TokenUtils.getUserInfoByToken(parameters.get("token").toString()); | 
 |  |  |         Map<String, Object> currentUserInfo = (Map<String, Object>) TokenUtils.getUserInfo(); | 
 |  |  |         Map<String, Object> orgInfo = (Map<String, Object>) currentUserInfo.get("organization"); | 
 |  |  |         QueryWrapper<User> queryWrapper = new QueryWrapper<>(); | 
 |  |  |         queryWrapper.eq("organization_id", orgInfo.get("id")) | 
 |  |  |                 .eq("is_delete", Constants.NOT_DELETE); | 
 |  |  |                 .eq("is_delete", Constants.NOT_DELETE) | 
 |  |  |                 .eq("is_admin", false); | 
 |  |  |         Object order = parameters.get("order"); | 
 |  |  |         Object orderType = parameters.get("orderType"); | 
 |  |  |         Object account = parameters.get("account"); | 
 |  |  | 
 |  |  |             queryWrapper.like("wechat", wechat); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         Integer page = (Integer) parameters.get("page"); | 
 |  |  |         Integer size = (Integer) parameters.get("size"); | 
 |  |  |         int page = Integer.parseInt(parameters.get("page").toString()); | 
 |  |  |         int size = Integer.parseInt(parameters.get("size").toString()); | 
 |  |  |         Page<User> pageData = new Page<>(page, size); | 
 |  |  |         //排序参数,默认create_time降序 | 
 |  |  |         if (order != null && orderType != null) { | 
 |  |  | 
 |  |  |             queryWrapper.orderByDesc("create_time"); | 
 |  |  |         } | 
 |  |  |         userMapper.selectPage(pageData, queryWrapper); | 
 |  |  |  | 
 |  |  |         return pageData; | 
 |  |  |     } | 
 |  |  |  |