UserService.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. package com.nokia.service;
  2. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.OrderItem;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.nokia.common.R;
  6. import com.nokia.common.exception.BizException;
  7. import com.nokia.dao.*;
  8. import com.nokia.pojo.User;
  9. import com.nokia.pojo.UserFunction;
  10. import com.nokia.pojo.UserRoleCity;
  11. import com.nokia.vo.*;
  12. import org.springframework.stereotype.Service;
  13. import org.springframework.transaction.annotation.Transactional;
  14. import org.springframework.util.CollectionUtils;
  15. import org.springframework.util.StringUtils;
  16. import javax.servlet.http.HttpSession;
  17. import java.util.*;
  18. import java.util.stream.Collectors;
  19. @Service
  20. public class UserService {
  21. private final UserDao userDao;
  22. private final UserRoleCityDao userRoleCityDao;
  23. private final UserFunctionDao userFunctionDao;
  24. private final AreaDao areaDao;
  25. private final RoleDao roleDao;
  26. private final OperationLogService operationLogService;
  27. public UserService(UserDao userDao, UserRoleCityDao userRoleCityDao, UserFunctionDao userFunctionDao,
  28. AreaDao areaDao, RoleDao roleDao, OperationLogService operationLogService) {
  29. this.userDao = userDao;
  30. this.userRoleCityDao = userRoleCityDao;
  31. this.userFunctionDao = userFunctionDao;
  32. this.areaDao = areaDao;
  33. this.roleDao = roleDao;
  34. this.operationLogService = operationLogService;
  35. }
  36. public List<UserVo> baseList() {
  37. return userDao.baseList();
  38. }
  39. public R<TopUserVo> getTopUserByLoginName(TopUserDto dto, HttpSession session) {
  40. if (hasLoginName(dto.getLoginName())) {
  41. return R.<TopUserVo>error("用户已存在系统中").code(-3);
  42. }
  43. TopUserVo vo = userDao.getTopUserByLoginName(dto.getLoginName());
  44. if (vo == null) {
  45. return R.<TopUserVo>error("新增用户必须是TOP已由账号,用户正常使用需要TOP增加移网投诉权限。"
  46. + "识别当前用户为外协用户或top用户信息未同步,需要手动输入用户信息").code(-1);
  47. }
  48. UserRoleCity role = getUserRoleCity(session);
  49. if (role.getCityId() != -1 && !role.getCityId().equals(vo.getCityId())) {
  50. return R.<TopUserVo>error("非本地市用户").code(-2);
  51. }
  52. if (vo.getCityId() != -1) {
  53. // 查询归属地市区县列表
  54. vo.setAreas(areaDao.getByParentId(vo.getCityId()).stream()
  55. .map(t -> new TreeAreaVo(t.getAreaName(), t.getAreaId())).collect(Collectors.toList()));
  56. }
  57. return R.ok(vo);
  58. }
  59. public R<List<GetRoleByLoginNameVo>> getRoleByLoginName(GetRoleByLoginNameDto dto, HttpSession session) {
  60. User user = userDao.selectByLoginName(dto.getLoginName());
  61. if (user == null || user.getDeleted().equals(1)) {
  62. return R.error("账号不存在");
  63. }
  64. UserRoleCity role = getUserRoleCity(session);
  65. if (role.getCityId() != -1 && !role.getCityId().equals(user.getCityId())) {
  66. return R.error("非本地市用户");
  67. }
  68. List<GetRoleByLoginNameVo> vo = userDao.getRoleByLoginName(dto.getLoginName());
  69. return R.ok(vo);
  70. }
  71. public R<PageVo<ListUserVo>> list(ListUserDto dto, HttpSession session) {
  72. // 默认归属地市
  73. if (dto.getAreaId() == null) {
  74. User userinfo = getUserInfo(session);
  75. dto.setAreaId(userinfo.getCityId());
  76. }
  77. PageVo<ListUserVo> vo = new PageVo<>();
  78. Page<ListUserVo> page = new Page<>(dto.getCurrent(), dto.getPageSize());
  79. page.addOrder(OrderItem.asc("au.city_id"));
  80. List<ListUserVo> list = userDao.list(page, dto.getLoginName(), dto.getUserName(), dto.getOrg(), dto.getAreaId());
  81. vo.setList(list);
  82. vo.setTotal(page.getTotal());
  83. return R.ok(vo);
  84. }
  85. @Transactional(rollbackFor = Exception.class)
  86. public R<Object> add(AddUserDto dto, HttpSession session) {
  87. // 查询用户
  88. User user = userDao.selectByLoginName(dto.getLoginName());
  89. if (user != null && user.getDeleted().equals(0)) {
  90. return R.error("用户已存在系统中");
  91. }
  92. UserRoleCity role = getUserRoleCity(session);
  93. if (role.getCityId() != -1 && !role.getCityId().equals(dto.getCityId())) {
  94. return R.error("无法添加非本地市用户");
  95. }
  96. // 检查权限和地市
  97. if (!CollectionUtils.isEmpty(dto.getRoles())) {
  98. for (AddUserRoleDto t : dto.getRoles()) {
  99. // 除工单查询外其他权限地市不匹配
  100. if (!t.getRoleId().equals(3) && !t.getCityId().equals(dto.getCityId())) {
  101. throw new BizException("权限和地市不匹配");
  102. }
  103. }
  104. }
  105. if (user == null) {
  106. user = new User();
  107. }
  108. user.setLoginName(dto.getLoginName());
  109. user.setUserName(dto.getUserName());
  110. user.setPhone(dto.getPhone());
  111. user.setEmail(dto.getEmail());
  112. user.setOrg(dto.getOrgName());
  113. user.setDeleted(0);
  114. user.setProvinceId(dto.getProvinceId());
  115. user.setCityId(dto.getCityId());
  116. user.setAreaId(dto.getAreaId());
  117. // 插入新用户
  118. if (user.getUserId() == null) {
  119. userDao.insert(user);
  120. } else {
  121. // 修改已删除用户信息
  122. userDao.updateById(user);
  123. }
  124. StringBuilder sb = new StringBuilder();
  125. sb.append("添加用户 ").append(dto.getLoginName()).append(";")
  126. .append("用户名:").append(dto.getUserName()).append(",")
  127. .append("手机号:").append(dto.getPhone()).append(",")
  128. .append("邮箱:").append(dto.getEmail()).append(",")
  129. .append("部门:").append(dto.getOrgName()).append(",")
  130. .append("省份:").append(dto.getProvinceName()).append(",")
  131. .append("地市:").append(dto.getCityName()).append(",")
  132. .append("区县:").append(dto.getAreaName()).append(";");
  133. // 添加权限
  134. if (!CollectionUtils.isEmpty(dto.getRoles())) {
  135. int userId = user.getUserId();
  136. List<UserRoleCity> userRoleCities = new ArrayList<>();
  137. Set<Integer> roleIds = new HashSet<>();
  138. sb.append("角色:");
  139. for (AddUserRoleDto t : dto.getRoles()) {
  140. sb.append(t.getRoleName()).append("-").append(t.getCityName()).append(",");
  141. UserRoleCity userRoleCity = new UserRoleCity();
  142. userRoleCity.setUserId(userId);
  143. userRoleCity.setRoleId(t.getRoleId());
  144. userRoleCity.setCityId(t.getCityId());
  145. userRoleCities.add(userRoleCity);
  146. roleIds.add(t.getRoleId());
  147. }
  148. userRoleCityDao.insertBatch(userRoleCities);
  149. Set<Integer> functionIds = roleDao.getFunctionIdsByRoleIds(roleIds);
  150. if (!CollectionUtils.isEmpty(functionIds)) {
  151. List<UserFunction> userFunctions = functionIds.stream().map(t -> new UserFunction(userId, t))
  152. .collect(Collectors.toList());
  153. userFunctionDao.insertBatch(userFunctions);
  154. }
  155. }
  156. // 记录日志
  157. operationLogService.logOperation(session, "添加用户", sb.toString());
  158. return R.ok();
  159. }
  160. @Transactional(rollbackFor = Exception.class)
  161. public R<Object> update(UpdateUserDto dto, HttpSession session) {
  162. GetUserDetailVo oldUser = userDao.getUserDetail(dto.getUserId());
  163. UserRoleCity role = getUserRoleCity(session);
  164. if (role.getCityId() != -1 && !role.getCityId().equals(oldUser.getCityId())) {
  165. return R.error("无法修改非本地市用户");
  166. }
  167. // 检查权限和地市
  168. if (!CollectionUtils.isEmpty(dto.getRoles())) {
  169. for (AddUserRoleDto t : dto.getRoles()) {
  170. // 除工单查询外其他权限地市不匹配
  171. if (!t.getRoleId().equals(3) && !t.getCityId().equals(oldUser.getCityId())) {
  172. throw new BizException("权限和地市不匹配");
  173. }
  174. }
  175. }
  176. User user = new User();
  177. user.setUserId(dto.getUserId());
  178. StringBuilder sb = new StringBuilder();
  179. sb.append("修改用户 ").append(oldUser.getLoginName()).append(";");
  180. if (StringUtils.hasText(dto.getEmail()) && !dto.getEmail().equals(oldUser.getEmail())) {
  181. sb.append("邮箱旧值:").append(oldUser.getEmail()).append(",")
  182. .append("邮箱新值:").append(dto.getEmail()).append(";");
  183. user.setEmail(dto.getEmail());
  184. }
  185. if (StringUtils.hasText(dto.getPhone()) && !dto.getPhone().equals(oldUser.getPhone())) {
  186. sb.append("手机号旧值:").append(oldUser.getPhone()).append(",")
  187. .append("手机号新值:").append(dto.getPhone()).append(";");
  188. user.setPhone(dto.getPhone());
  189. }
  190. if (dto.getAreaId() != null && !dto.getAreaId().equals(oldUser.getAreaId())) {
  191. sb.append("区县旧值:").append(oldUser.getAreaName()).append(",")
  192. .append("区县新值:").append(dto.getAreaName()).append(";");
  193. user.setAreaId(dto.getAreaId());
  194. }
  195. // 修改用户信息
  196. if (StringUtils.hasText(user.getEmail()) || StringUtils.hasText(user.getPhone()) || user.getAreaId() != null) {
  197. userDao.updateById(user);
  198. }
  199. // 修改权限
  200. if (!CollectionUtils.isEmpty(dto.getRoles())) {
  201. int userId = oldUser.getUserId();
  202. List<GetUserDetailRoleVo> oldRoles = userDao.getUserDetailRole(userId);
  203. sb.append("角色旧值:");
  204. for (GetUserDetailRoleVo t : oldRoles) {
  205. sb.append(t.getRoleName()).append("-").append(t.getCityName()).append(",");
  206. }
  207. List<UserRoleCity> userRoleCities = new ArrayList<>();
  208. Set<Integer> roleIds = new HashSet<>();
  209. sb.append(";角色新值:");
  210. for (AddUserRoleDto t : dto.getRoles()) {
  211. sb.append(t.getRoleName()).append("-").append(t.getCityName()).append(",");
  212. UserRoleCity userRoleCity = new UserRoleCity();
  213. userRoleCity.setUserId(oldUser.getUserId());
  214. userRoleCity.setRoleId(t.getRoleId());
  215. userRoleCity.setCityId(t.getCityId());
  216. userRoleCities.add(userRoleCity);
  217. roleIds.add(t.getRoleId());
  218. }
  219. UpdateWrapper<UserRoleCity> userRoleCityUpdateWrapper = new UpdateWrapper<>();
  220. userRoleCityUpdateWrapper.eq("user_id", dto.getUserId());
  221. userRoleCityDao.delete(userRoleCityUpdateWrapper);
  222. userRoleCityDao.insertBatch(userRoleCities);
  223. Set<Integer> functionIds = roleDao.getFunctionIdsByRoleIds(roleIds);
  224. if (!CollectionUtils.isEmpty(functionIds)) {
  225. UpdateWrapper<UserFunction> userFunctionUpdateWrapper = new UpdateWrapper<>();
  226. userFunctionUpdateWrapper.eq("user_id", dto.getUserId());
  227. userFunctionDao.delete(userFunctionUpdateWrapper);
  228. List<UserFunction> userFunctions = functionIds.stream().map(t -> new UserFunction(userId, t))
  229. .collect(Collectors.toList());
  230. userFunctionDao.insertBatch(userFunctions);
  231. }
  232. }
  233. // 记录日志
  234. operationLogService.logOperation(session, "修改用户", sb.toString());
  235. return R.ok();
  236. }
  237. @Transactional(rollbackFor = Exception.class)
  238. public R<Object> del(DeleteUserDto dto, HttpSession session) {
  239. UserRoleCity role = getUserRoleCity(session);
  240. if (role.getCityId() != -1 && userDao.exceptCityUser(role.getCityId(), dto.getUserIds()) != null) {
  241. return R.error("无法删除非本地市用户");
  242. }
  243. User user = new User();
  244. user.setDeleted(1);
  245. UpdateWrapper<User> wrapper = new UpdateWrapper<>();
  246. wrapper.in("user_id", dto.getUserIds());
  247. userDao.update(user, wrapper);
  248. deleteUserRoleCityByUserIds(dto.getUserIds());
  249. deleteUserFunctionByUserIds(dto.getUserIds());
  250. StringBuilder sb = new StringBuilder();
  251. List<User> users = userDao.selectBatchIds(dto.getUserIds());
  252. String loginNames = users.stream().map(User::getLoginName).collect(Collectors.joining("、"));
  253. sb.append("删除用户 ").append(loginNames);
  254. // 记录日志
  255. operationLogService.logOperation(session, "删除用户", sb.toString());
  256. return R.ok();
  257. }
  258. public R<GetUserDetailVo> detail(GetUserDetailDto dto) {
  259. GetUserDetailVo vo = userDao.getUserDetail(dto.getUserId());
  260. List<GetUserDetailRoleVo> roles = userDao.getUserDetailRole(dto.getUserId());
  261. vo.setRoles(roles);
  262. if (vo.getCityId() != -1) {
  263. // 查询归属地市区县列表
  264. vo.setAreas(areaDao.getByParentId(vo.getCityId()).stream()
  265. .map(t -> new TreeAreaVo(t.getAreaName(), t.getAreaId())).collect(Collectors.toList()));
  266. }
  267. return R.ok(vo);
  268. }
  269. @Transactional(rollbackFor = Exception.class)
  270. public R<Object> copyRole(CopyRolesDto dto, HttpSession session) {
  271. List<Integer> cityIds = userDao.getCityIdsByUserIds(dto.getUserIds());
  272. if (cityIds.size() > 1) {
  273. return R.error("不能选择不同地市用户");
  274. }
  275. int cityId = cityIds.get(0);
  276. UserRoleCity role = getUserRoleCity(session);
  277. if (role.getCityId() != -1 && !role.getCityId().equals(cityId)) {
  278. return R.error("无法修改非本地市用户");
  279. }
  280. Set<Integer> roleIds = new HashSet<>();
  281. // 检查权限和地市
  282. for (AddUserRoleDto t : dto.getRoles()) {
  283. // 除工单查询外其他权限地市不匹配
  284. if (!t.getRoleId().equals(3) && !t.getCityId().equals(cityId)) {
  285. throw new BizException("权限和地市不匹配");
  286. }
  287. roleIds.add(t.getRoleId());
  288. }
  289. StringBuilder sb = new StringBuilder();
  290. List<User> users = userDao.selectBatchIds(dto.getUserIds());
  291. String loginNames = users.stream().map(User::getLoginName).collect(Collectors.joining("、"));
  292. sb.append("批量复制权限给 ").append(loginNames).append(";权限:");
  293. List<UserRoleCity> userRoleCities = new ArrayList<>();
  294. Set<UserFunction> userFunctions = new HashSet<>();
  295. for (AddUserRoleDto t : dto.getRoles()) {
  296. sb.append(t.getRoleName()).append("-").append(t.getCityName()).append(",");
  297. for (Integer userId : dto.getUserIds()) {
  298. UserRoleCity userRoleCity = new UserRoleCity();
  299. userRoleCity.setUserId(userId);
  300. userRoleCity.setRoleId(t.getRoleId());
  301. userRoleCity.setCityId(t.getCityId());
  302. userRoleCities.add(userRoleCity);
  303. }
  304. }
  305. Set<Integer> functionIds = roleDao.getFunctionIdsByRoleIds(roleIds);
  306. for (Integer t : functionIds) {
  307. for (Integer userId : dto.getUserIds()) {
  308. UserFunction userFunction = new UserFunction();
  309. userFunction.setUserId(userId);
  310. userFunction.setFunctionId(t);
  311. userFunctions.add(userFunction);
  312. }
  313. }
  314. deleteUserRoleCityByUserIds(dto.getUserIds());
  315. userRoleCityDao.insertBatch(userRoleCities);
  316. if (!CollectionUtils.isEmpty(userFunctions)) {
  317. deleteUserFunctionByUserIds(dto.getUserIds());
  318. userFunctionDao.insertBatch(new ArrayList<>(userFunctions));
  319. }
  320. // 记录日志
  321. operationLogService.logOperation(session, "批量复制权限", sb.toString());
  322. return R.ok();
  323. }
  324. /**
  325. * 获取用户信息
  326. *
  327. * @param session 会话
  328. * @return {@link User}
  329. */
  330. public User getUserInfo(HttpSession session) {
  331. return (User) session.getAttribute("userinfo");
  332. }
  333. /**
  334. * 得到用户角色城市
  335. *
  336. * @param session 会话
  337. * @return {@link UserRoleCity}
  338. */
  339. public UserRoleCity getUserRoleCity(HttpSession session) {
  340. return (UserRoleCity) session.getAttribute("role");
  341. }
  342. /**
  343. * 登录名存在
  344. *
  345. * @param loginName 登录名
  346. * @return boolean
  347. */
  348. private boolean hasLoginName(String loginName) {
  349. return userDao.hasLoginName(loginName) != null;
  350. }
  351. /**
  352. * 通过用户id删除用户功能
  353. *
  354. * @param list 列表
  355. */
  356. private void deleteUserFunctionByUserIds(List<Integer> list) {
  357. UpdateWrapper<UserFunction> wrapper = new UpdateWrapper<>();
  358. wrapper.in("user_id", list);
  359. userFunctionDao.delete(wrapper);
  360. }
  361. /**
  362. * 通过用户id删除用户角色城市
  363. *
  364. * @param list 列表
  365. */
  366. private void deleteUserRoleCityByUserIds(List<Integer> list) {
  367. UpdateWrapper<UserRoleCity> wrapper = new UpdateWrapper<>();
  368. wrapper.in("user_id", list);
  369. userRoleCityDao.delete(wrapper);
  370. }
  371. }