SysUserController.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. package com.ruoyi.web.controller.system;
  2. import java.util.List;
  3. import java.util.Map;
  4. import java.util.stream.Collectors;
  5. import javax.servlet.http.HttpServletResponse;
  6. import com.ruoyi.dz.domain.DzAgent;
  7. import com.ruoyi.dz.domain.DzCards;
  8. import com.ruoyi.dz.service.IDzAgentService;
  9. import com.ruoyi.dz.service.IDzCardsService;
  10. import com.ruoyi.dz.service.IDzSchoolService;
  11. import com.ruoyi.dz.service.IDzClassesService;
  12. import com.ruoyi.enums.CardType;
  13. import com.ruoyi.enums.UserTypeEnum;
  14. import org.apache.commons.collections.CollectionUtils;
  15. import org.apache.commons.lang3.ArrayUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.security.access.prepost.PreAuthorize;
  18. import org.springframework.validation.annotation.Validated;
  19. import org.springframework.web.bind.annotation.DeleteMapping;
  20. import org.springframework.web.bind.annotation.GetMapping;
  21. import org.springframework.web.bind.annotation.PathVariable;
  22. import org.springframework.web.bind.annotation.PostMapping;
  23. import org.springframework.web.bind.annotation.PutMapping;
  24. import org.springframework.web.bind.annotation.RequestBody;
  25. import org.springframework.web.bind.annotation.RequestMapping;
  26. import org.springframework.web.bind.annotation.RestController;
  27. import org.springframework.web.multipart.MultipartFile;
  28. import com.ruoyi.common.annotation.Log;
  29. import com.ruoyi.common.core.controller.BaseController;
  30. import com.ruoyi.common.core.domain.AjaxResult;
  31. import com.ruoyi.common.core.domain.entity.SysDept;
  32. import com.ruoyi.common.core.domain.entity.SysRole;
  33. import com.ruoyi.common.core.domain.entity.SysUser;
  34. import com.ruoyi.common.core.page.TableDataInfo;
  35. import com.ruoyi.common.enums.BusinessType;
  36. import com.ruoyi.common.utils.SecurityUtils;
  37. import com.ruoyi.common.utils.StringUtils;
  38. import com.ruoyi.common.utils.poi.ExcelUtil;
  39. import com.ruoyi.system.service.ISysDeptService;
  40. import com.ruoyi.system.service.ISysPostService;
  41. import com.ruoyi.system.service.ISysRoleService;
  42. import com.ruoyi.system.service.ISysUserService;
  43. /**
  44. * 用户信息
  45. *
  46. * @author ruoyi
  47. */
  48. @RestController
  49. @RequestMapping("/system/user")
  50. public class SysUserController extends BaseController
  51. {
  52. @Autowired
  53. private ISysUserService userService;
  54. @Autowired
  55. private ISysRoleService roleService;
  56. @Autowired
  57. private ISysDeptService deptService;
  58. @Autowired
  59. private ISysPostService postService;
  60. @Autowired
  61. private IDzCardsService cardsService;
  62. @Autowired
  63. private IDzSchoolService schoolService;
  64. @Autowired
  65. private IDzClassesService classesService;
  66. @Autowired
  67. private IDzAgentService agentService;
  68. /**
  69. * 获取用户列表
  70. */
  71. @PreAuthorize("@ss.hasPermi('system:user:list')")
  72. @GetMapping("/list")
  73. public TableDataInfo list(SysUser user)
  74. {
  75. startPage();
  76. List<SysUser> list = userService.selectUserList(user);
  77. // 批量查询 password2 并设置到用户对象中
  78. if (CollectionUtils.isNotEmpty(list)) {
  79. List<Long> userIds = list.stream()
  80. .map(SysUser::getUserId)
  81. .filter(userId -> userId != null)
  82. .collect(Collectors.toList());
  83. if (CollectionUtils.isNotEmpty(userIds)) {
  84. Map<Long, String> password2Map = userService.selectPassword2ByUserIds(userIds);
  85. for (SysUser sysUser : list) {
  86. if (sysUser.getUserId() != null && password2Map.containsKey(sysUser.getUserId())) {
  87. sysUser.setPassword2(password2Map.get(sysUser.getUserId()));
  88. }
  89. }
  90. }
  91. }
  92. return getDataTable(list);
  93. }
  94. /**
  95. * 获取用户列表
  96. */
  97. @PreAuthorize("@ss.hasPermi('system:user:list')")
  98. @GetMapping("/listCard")
  99. public TableDataInfo listCard(SysUser user)
  100. {
  101. SysUser sysUser = SecurityUtils.getLoginUser().getUser();
  102. if (UserTypeEnum.isAgent(sysUser.getUserType())) {
  103. user.setAgentId(sysUser.getUserTypeId());
  104. } else if (UserTypeEnum.isInstitution(sysUser.getUserType())) {
  105. user.setDeptId(sysUser.getDeptId());
  106. user.setInviteDeptId(sysUser.getDeptId());
  107. } else if(!UserTypeEnum.isSys(sysUser.getUserType())) {
  108. user.setDeptId(sysUser.getDeptId());
  109. }
  110. //只显示普通用户
  111. user.setUsercardType(String.valueOf(CardType.Common.getVal()));
  112. startPage();
  113. List<SysUser> list = userService.selectCardUserList(user);
  114. // 先获取分页信息,再处理数据
  115. TableDataInfo dataTable = getDataTable(list);
  116. // 处理用户信息(填充学校名称、班级名称等)
  117. list = processUserInfo(list);
  118. dataTable.setRows(list);
  119. return dataTable;
  120. }
  121. private List<SysUser> processUserInfo(List<SysUser> list) {
  122. if (CollectionUtils.isNotEmpty(list)) {
  123. // 批量查询 password2 并设置到用户对象中
  124. List<Long> userIds = list.stream()
  125. .map(SysUser::getUserId)
  126. .filter(userId -> userId != null)
  127. .collect(Collectors.toList());
  128. if (CollectionUtils.isNotEmpty(userIds)) {
  129. Map<Long, String> password2Map = userService.selectPassword2ByUserIds(userIds);
  130. for (SysUser sysUser : list) {
  131. if (sysUser.getUserId() != null && password2Map.containsKey(sysUser.getUserId())) {
  132. sysUser.setPassword2(password2Map.get(sysUser.getUserId()));
  133. }
  134. }
  135. }
  136. // 获取邀请码列表(邀请码是String类型,需要转换为Long类型的用户ID)
  137. List<Long> inviteCodeUserIds = list.stream()
  138. .map(SysUser::getInviteCode)
  139. .filter(inviteCode -> StringUtils.isNotEmpty(inviteCode))
  140. .map(inviteCode -> {
  141. try {
  142. return Long.parseLong(inviteCode);
  143. } catch (NumberFormatException e) {
  144. return null;
  145. }
  146. })
  147. .distinct().collect(Collectors.toList());
  148. List<Long> cardIds = list.stream().map(SysUser::getCardId).filter(cardId -> cardId != null)
  149. .distinct().collect(Collectors.toList());
  150. // 根据邀请码(即用户ID)查询对应的代理商信息
  151. Map<Long, DzAgent> agentMap = new java.util.HashMap<>();
  152. if (CollectionUtils.isNotEmpty(inviteCodeUserIds)) {
  153. List<DzAgent> agentList = agentService.selectDzAgentByAgentIds(inviteCodeUserIds);
  154. if (CollectionUtils.isNotEmpty(agentList)) {
  155. agentMap = agentList.stream().collect(Collectors.toMap(DzAgent::getAgentId,agent -> agent,(existing, replacement) -> existing));
  156. }
  157. }
  158. // 如果cardIds为空,直接返回,不进行后续处理
  159. if (CollectionUtils.isEmpty(cardIds)) {
  160. // 即使没有cardIds,也要设置代理商名称
  161. for (SysUser user : list) {
  162. //设置卡类型
  163. user.setUsercardType(String.valueOf(CardType.getNewVal(CardType.Common.getVal())));
  164. if (user.getInviteCode() != null && !user.getInviteCode().isEmpty()) {
  165. try {
  166. Long inviteCodeUserId = Long.parseLong(user.getInviteCode());
  167. DzAgent agent = agentMap.get(inviteCodeUserId);
  168. if (agent != null && agent.getName() != null) {
  169. user.setAgentName(agent.getName());
  170. user.setDeptName(null!=agent.getDept()?agent.getDept().getDeptName():StringUtils.EMPTY);
  171. }
  172. } catch (NumberFormatException e) {
  173. // 邀请码不是有效的数字,忽略
  174. }
  175. }
  176. }
  177. return list;
  178. }
  179. List<DzCards> cards = cardsService.selectCardsByCardIds(cardIds);
  180. //将里面的campusId与schoolId汇总为一个list后,通过schoolService查询所有学校的信息List<DzSchool>
  181. List<Long> schoolIds = cards.stream().map(DzCards::getSchoolId).filter(schoolId -> schoolId != null).collect(Collectors.toList());
  182. List<Long> campusIds = cards.stream().map(DzCards::getCampusId).filter(campusId -> campusId != null).collect(Collectors.toList());
  183. // 合并schoolId和campusId,并去重
  184. List<Long> allIds = new java.util.ArrayList<>(schoolIds);
  185. allIds.addAll(campusIds);
  186. List<Long> distinctIds = allIds.stream().distinct().collect(Collectors.toList());
  187. Map<Long, String> schoolMap = new java.util.HashMap<>();
  188. if (CollectionUtils.isNotEmpty(distinctIds)) {
  189. List<com.ruoyi.dz.domain.DzSchool> schoolList = schoolService.selectDzSchoolListByIds(distinctIds);
  190. if (CollectionUtils.isNotEmpty(schoolList)) {
  191. schoolMap = schoolList.stream()
  192. .collect(Collectors.toMap(dzSchool -> dzSchool.getId(), dzSchool -> dzSchool.getName()));
  193. }
  194. }
  195. //将里面的classId与campusClassId汇总为一个list后,通过classesService查询所有班级的信息List<DzClasses>
  196. List<Long> classIds = cards.stream().map(DzCards::getClassId).filter(classId -> classId != null).collect(Collectors.toList());
  197. List<Long> campusClassIds = cards.stream().map(DzCards::getCampusClassId).filter(campusClassId -> campusClassId != null).collect(Collectors.toList());
  198. // 合并classId和campusClassId,并去重
  199. List<Long> allClassIds = new java.util.ArrayList<>(classIds);
  200. allClassIds.addAll(campusClassIds);
  201. List<Long> distinctClassIds = allClassIds.stream().distinct().collect(Collectors.toList());
  202. Map<Long, String> classMap = new java.util.HashMap<>();
  203. if (CollectionUtils.isNotEmpty(distinctClassIds)) {
  204. List<com.ruoyi.dz.domain.DzClasses> classList = classesService.selectDzClassesListByIds(distinctClassIds);
  205. if (CollectionUtils.isNotEmpty(classList)) {
  206. classMap = classList.stream()
  207. .collect(Collectors.toMap(dzClass -> dzClass.getClassId(), dzClass -> dzClass.getName()));
  208. }
  209. }
  210. // 创建cardId到DzCards的映射,方便后续查找
  211. Map<Long, DzCards> cardMap = new java.util.HashMap<>();
  212. if (CollectionUtils.isNotEmpty(cards)) {
  213. cardMap = cards.stream()
  214. .collect(Collectors.toMap(DzCards::getCardId, card -> card, (existing, replacement) -> existing));
  215. }
  216. // 遍历用户列表,设置学校名称和班级名称
  217. for (SysUser user : list) {
  218. // 设置代理商名称(从dept对象中获取)
  219. if (user.getDept() != null && user.getDept().getDeptName() != null) {
  220. user.setDeptName(user.getDept().getDeptName());
  221. }
  222. // 设置代理商名称(从邀请码对应的代理商获取)
  223. if (user.getInviteCode() != null && !user.getInviteCode().isEmpty()) {
  224. try {
  225. Long inviteCodeUserId = Long.parseLong(user.getInviteCode());
  226. DzAgent agent = agentMap.get(inviteCodeUserId);
  227. if (agent != null && agent.getName() != null) {
  228. user.setAgentName(agent.getName());
  229. user.setDeptName(null!=agent.getDept()?agent.getDept().getDeptName():StringUtils.EMPTY);
  230. }
  231. } catch (NumberFormatException e) {
  232. // 邀请码不是有效的数字,忽略
  233. }
  234. }
  235. if (user.getCardId() != null) {
  236. DzCards card = cardMap.get(user.getCardId());
  237. if (card != null) {
  238. user.setCardNo(card.getCardNo());
  239. //设置卡类型
  240. user.setUsercardType(String.valueOf(CardType.getNewVal(card.getType())));
  241. // 设置注册学校名称(schoolId对应的学校名称)
  242. if (card.getSchoolId() != null) {
  243. user.setSchoolName(schoolMap.get(card.getSchoolId()));
  244. }
  245. // 设置学校班级名称(classId对应的班级名称)
  246. if (card.getClassId() != null) {
  247. user.setSchoolClassName(classMap.get(card.getClassId()));
  248. }
  249. // 设置培训校区名称(campusId对应的学校名称)
  250. if (card.getCampusId() != null) {
  251. user.setCampusName(schoolMap.get(card.getCampusId()));
  252. }
  253. // 设置校区班级名称(campusClassId对应的班级名称)
  254. if (card.getCampusClassId() != null) {
  255. user.setCampusClassName(classMap.get(card.getCampusClassId()));
  256. }
  257. }else {
  258. user.setUsercardType(String.valueOf(CardType.getNewVal(CardType.Common.getVal())));
  259. }
  260. }else {
  261. user.setUsercardType(String.valueOf(CardType.getNewVal(CardType.Common.getVal())));
  262. }
  263. }
  264. }
  265. return list;
  266. }
  267. @Log(title = "用户管理", businessType = BusinessType.EXPORT)
  268. @PreAuthorize("@ss.hasPermi('system:user:export')")
  269. @PostMapping("/export")
  270. public void export(HttpServletResponse response, SysUser user)
  271. {
  272. List<SysUser> list = userService.selectUserList(user);
  273. list = processUserInfo(list);
  274. ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
  275. util.exportExcel(response, list, "用户数据");
  276. }
  277. @Log(title = "用户管理", businessType = BusinessType.IMPORT)
  278. @PreAuthorize("@ss.hasPermi('system:user:import')")
  279. @PostMapping("/importData")
  280. public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
  281. {
  282. ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
  283. List<SysUser> userList = util.importExcel(file.getInputStream());
  284. String operName = getUsername();
  285. String message = userService.importUser(userList, updateSupport, operName);
  286. return success(message);
  287. }
  288. @PostMapping("/importTemplate")
  289. public void importTemplate(HttpServletResponse response)
  290. {
  291. ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
  292. util.importTemplateExcel(response, "用户数据");
  293. }
  294. /**
  295. * 根据用户编号获取详细信息
  296. */
  297. @PreAuthorize("@ss.hasPermi('system:user:query')")
  298. @GetMapping(value = { "/", "/{userId}" })
  299. public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
  300. {
  301. AjaxResult ajax = AjaxResult.success();
  302. if (StringUtils.isNotNull(userId))
  303. {
  304. userService.checkUserDataScope(userId);
  305. SysUser sysUser = userService.selectUserById(userId);
  306. ajax.put(AjaxResult.DATA_TAG, sysUser);
  307. ajax.put("postIds", postService.selectPostListByUserId(userId));
  308. ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
  309. }
  310. List<SysRole> roles = roleService.selectRoleAll();
  311. ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
  312. ajax.put("posts", postService.selectPostAll());
  313. return ajax;
  314. }
  315. /**
  316. * 新增用户
  317. */
  318. @PreAuthorize("@ss.hasPermi('system:user:add')")
  319. @Log(title = "用户管理", businessType = BusinessType.INSERT)
  320. @PostMapping
  321. public AjaxResult add(@Validated @RequestBody SysUser user)
  322. {
  323. deptService.checkDeptDataScope(user.getDeptId());
  324. roleService.checkRoleDataScope(user.getRoleIds());
  325. if (!userService.checkUserNameUnique(user))
  326. {
  327. return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
  328. }
  329. else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
  330. {
  331. return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
  332. }
  333. else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
  334. {
  335. return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
  336. }
  337. user.setCreateBy(getUsername());
  338. user.setPassword2(SecurityUtils.encryptPassword2(user.getPassword()));
  339. user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
  340. return AjaxResult.success(userService.insertUser(user));
  341. }
  342. /**
  343. * 修改用户
  344. */
  345. @PreAuthorize("@ss.hasPermi('system:user:edit')")
  346. @Log(title = "用户管理", businessType = BusinessType.UPDATE)
  347. @PutMapping
  348. public AjaxResult edit(@Validated @RequestBody SysUser user)
  349. {
  350. userService.checkUserAllowed(user);
  351. userService.checkUserDataScope(user.getUserId());
  352. deptService.checkDeptDataScope(user.getDeptId());
  353. roleService.checkRoleDataScope(user.getRoleIds());
  354. if (!userService.checkUserNameUnique(user))
  355. {
  356. return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
  357. }
  358. else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
  359. {
  360. return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
  361. }
  362. else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
  363. {
  364. return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
  365. }
  366. user.setUpdateBy(getUsername());
  367. return toAjax(userService.updateUser(user));
  368. }
  369. /**
  370. * 删除用户
  371. */
  372. @PreAuthorize("@ss.hasPermi('system:user:remove')")
  373. @Log(title = "用户管理", businessType = BusinessType.DELETE)
  374. @DeleteMapping("/{userIds}")
  375. public AjaxResult remove(@PathVariable Long[] userIds)
  376. {
  377. if (ArrayUtils.contains(userIds, getUserId()))
  378. {
  379. return error("当前用户不能删除");
  380. }
  381. return toAjax(userService.deleteUserByIds(userIds));
  382. }
  383. /**
  384. * 重置密码
  385. */
  386. @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
  387. @Log(title = "用户管理", businessType = BusinessType.UPDATE)
  388. @PutMapping("/resetPwd")
  389. public AjaxResult resetPwd(@RequestBody SysUser user)
  390. {
  391. if (StringUtils.isEmpty(user.getPassword()))
  392. {
  393. return AjaxResult.error("密码不能为空");
  394. }
  395. userService.checkUserAllowed(user);
  396. userService.checkUserDataScope(user.getUserId());
  397. user.setPassword2(SecurityUtils.encryptPassword2(user.getPassword()));
  398. user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
  399. user.setUpdateBy(getUsername());
  400. return toAjax(userService.resetPwd(user));
  401. }
  402. /**
  403. * 清空用户定向信息
  404. */
  405. @PreAuthorize("@ss.hasPermi('system:user:edit')")
  406. @Log(title = "用户管理", businessType = BusinessType.UPDATE)
  407. @PutMapping("/clearDirectedStudy/{userId}")
  408. public AjaxResult clearDirectedStudy(@PathVariable("userId") Long userId)
  409. {
  410. userService.checkUserDataScope(userId);
  411. return toAjax(userService.clearDirectedStudy(userId));
  412. }
  413. /**
  414. * 状态修改
  415. */
  416. @PreAuthorize("@ss.hasPermi('system:user:edit')")
  417. @Log(title = "用户管理", businessType = BusinessType.UPDATE)
  418. @PutMapping("/changeStatus")
  419. public AjaxResult changeStatus(@RequestBody SysUser user)
  420. {
  421. userService.checkUserAllowed(user);
  422. userService.checkUserDataScope(user.getUserId());
  423. user.setUpdateBy(getUsername());
  424. return toAjax(userService.updateUserStatus(user));
  425. }
  426. /**
  427. * 根据用户编号获取授权角色
  428. */
  429. @PreAuthorize("@ss.hasPermi('system:user:query')")
  430. @GetMapping("/authRole/{userId}")
  431. public AjaxResult authRole(@PathVariable("userId") Long userId)
  432. {
  433. AjaxResult ajax = AjaxResult.success();
  434. SysUser user = userService.selectUserById(userId);
  435. List<SysRole> roles = roleService.selectRolesByUserId(userId);
  436. ajax.put("user", user);
  437. ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
  438. return ajax;
  439. }
  440. /**
  441. * 用户授权角色
  442. */
  443. @PreAuthorize("@ss.hasPermi('system:user:edit')")
  444. @Log(title = "用户管理", businessType = BusinessType.GRANT)
  445. @PutMapping("/authRole")
  446. public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
  447. {
  448. userService.checkUserDataScope(userId);
  449. roleService.checkRoleDataScope(roleIds);
  450. userService.insertUserAuth(userId, roleIds);
  451. return success();
  452. }
  453. /**
  454. * 获取机构树列表
  455. */
  456. // @PreAuthorize("@ss.hasPermi('system:user:list')")
  457. @GetMapping("/deptTree")
  458. public AjaxResult deptTree(SysDept dept)
  459. {
  460. return success(deptService.selectDeptTreeList(dept));
  461. }
  462. /**
  463. * 获取省份列表(去重)
  464. */
  465. @GetMapping("/locations")
  466. public AjaxResult getLocations()
  467. {
  468. List<String> locations = userService.selectDistinctLocations();
  469. return success(locations);
  470. }
  471. }