SysUserServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. package com.ruoyi.system.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  8. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  9. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  10. import com.ruoyi.common.constant.UserConstants;
  11. import com.ruoyi.common.core.domain.PageQuery;
  12. import com.ruoyi.common.core.domain.entity.SysDept;
  13. import com.ruoyi.common.core.domain.entity.SysRole;
  14. import com.ruoyi.common.core.domain.entity.SysUser;
  15. import com.ruoyi.common.core.page.TableDataInfo;
  16. import com.ruoyi.common.exception.ServiceException;
  17. import com.ruoyi.common.helper.DataBaseHelper;
  18. import com.ruoyi.common.helper.LoginHelper;
  19. import com.ruoyi.common.utils.StringUtils;
  20. import com.ruoyi.system.domain.SysPost;
  21. import com.ruoyi.system.domain.SysUserPost;
  22. import com.ruoyi.system.domain.SysUserRole;
  23. import com.ruoyi.system.mapper.*;
  24. import com.ruoyi.system.service.ISysUserService;
  25. import lombok.RequiredArgsConstructor;
  26. import lombok.extern.slf4j.Slf4j;
  27. import org.springframework.stereotype.Service;
  28. import org.springframework.transaction.annotation.Transactional;
  29. import java.util.ArrayList;
  30. import java.util.Arrays;
  31. import java.util.List;
  32. import java.util.Map;
  33. import java.util.stream.Collectors;
  34. /**
  35. * 用户 业务层处理
  36. *
  37. * @author Lion Li
  38. */
  39. @Slf4j
  40. @RequiredArgsConstructor
  41. @Service
  42. public class SysUserServiceImpl implements ISysUserService {
  43. private final SysUserMapper baseMapper;
  44. private final SysDeptMapper deptMapper;
  45. private final SysRoleMapper roleMapper;
  46. private final SysPostMapper postMapper;
  47. private final SysUserRoleMapper userRoleMapper;
  48. private final SysUserPostMapper userPostMapper;
  49. @Override
  50. public TableDataInfo<SysUser> selectPageUserList(SysUser user, PageQuery pageQuery) {
  51. Page<SysUser> page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user));
  52. return TableDataInfo.build(page);
  53. }
  54. /**
  55. * 根据条件分页查询用户列表
  56. *
  57. * @param user 用户信息
  58. * @return 用户信息集合信息
  59. */
  60. @Override
  61. public List<SysUser> selectUserList(SysUser user) {
  62. return baseMapper.selectUserList(this.buildQueryWrapper(user));
  63. }
  64. private Wrapper<SysUser> buildQueryWrapper(SysUser user) {
  65. Map<String, Object> params = user.getParams();
  66. QueryWrapper<SysUser> wrapper = Wrappers.query();
  67. wrapper.eq("u.del_flag", UserConstants.USER_NORMAL)
  68. .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId())
  69. .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
  70. .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
  71. .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())
  72. .between(params.get("beginTime") != null && params.get("endTime") != null,
  73. "u.create_time", params.get("beginTime"), params.get("endTime"))
  74. .and(ObjectUtil.isNotNull(user.getDeptId()), w -> {
  75. List<SysDept> deptList = deptMapper.selectList(new LambdaQueryWrapper<SysDept>()
  76. .select(SysDept::getDeptId)
  77. .apply(DataBaseHelper.findInSet(user.getDeptId(), "ancestors")));
  78. w.eq("u.dept_id", user.getDeptId())
  79. .or()
  80. .in("u.dept_id", deptList.stream().map(SysDept::getDeptId).collect(Collectors.toList()));
  81. });
  82. return wrapper;
  83. }
  84. /**
  85. * 根据条件分页查询已分配用户角色列表
  86. *
  87. * @param user 用户信息
  88. * @return 用户信息集合信息
  89. */
  90. @Override
  91. public TableDataInfo<SysUser> selectAllocatedList(SysUser user, PageQuery pageQuery) {
  92. QueryWrapper<SysUser> wrapper = Wrappers.query();
  93. wrapper.eq("u.del_flag", UserConstants.USER_NORMAL)
  94. .eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId())
  95. .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
  96. .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
  97. .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber());
  98. Page<SysUser> page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper);
  99. return TableDataInfo.build(page);
  100. }
  101. /**
  102. * 根据条件分页查询未分配用户角色列表
  103. *
  104. * @param user 用户信息
  105. * @return 用户信息集合信息
  106. */
  107. @Override
  108. public TableDataInfo<SysUser> selectUnallocatedList(SysUser user, PageQuery pageQuery) {
  109. Long userId = userRoleMapper.selectUserIdByRoleId(user.getRoleId());
  110. QueryWrapper<SysUser> wrapper = Wrappers.query();
  111. wrapper.eq("u.del_flag", UserConstants.USER_NORMAL)
  112. .and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id"))
  113. .notIn("u.user_id", userId)
  114. .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
  115. .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber());
  116. Page<SysUser> page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper);
  117. return TableDataInfo.build(page);
  118. }
  119. /**
  120. * 通过用户名查询用户
  121. *
  122. * @param userName 用户名
  123. * @return 用户对象信息
  124. */
  125. @Override
  126. public SysUser selectUserByUserName(String userName) {
  127. return baseMapper.selectUserByUserName(userName);
  128. }
  129. /**
  130. * 通过用户ID查询用户
  131. *
  132. * @param userId 用户ID
  133. * @return 用户对象信息
  134. */
  135. @Override
  136. public SysUser selectUserById(Long userId) {
  137. return baseMapper.selectUserById(userId);
  138. }
  139. /**
  140. * 查询用户所属角色组
  141. *
  142. * @param userName 用户名
  143. * @return 结果
  144. */
  145. @Override
  146. public String selectUserRoleGroup(String userName) {
  147. List<SysRole> list = roleMapper.selectRolesByUserName(userName);
  148. if (CollUtil.isEmpty(list)) {
  149. return StringUtils.EMPTY;
  150. }
  151. return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(","));
  152. }
  153. /**
  154. * 查询用户所属岗位组
  155. *
  156. * @param userName 用户名
  157. * @return 结果
  158. */
  159. @Override
  160. public String selectUserPostGroup(String userName) {
  161. List<SysPost> list = postMapper.selectPostsByUserName(userName);
  162. if (CollUtil.isEmpty(list)) {
  163. return StringUtils.EMPTY;
  164. }
  165. return list.stream().map(SysPost::getPostName).collect(Collectors.joining(","));
  166. }
  167. /**
  168. * 校验用户名称是否唯一
  169. *
  170. * @param userName 用户名称
  171. * @return 结果
  172. */
  173. @Override
  174. public String checkUserNameUnique(String userName) {
  175. boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName));
  176. if (exist) {
  177. return UserConstants.NOT_UNIQUE;
  178. }
  179. return UserConstants.UNIQUE;
  180. }
  181. /**
  182. * 校验手机号码是否唯一
  183. *
  184. * @param user 用户信息
  185. * @return
  186. */
  187. @Override
  188. public String checkPhoneUnique(SysUser user) {
  189. boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysUser>()
  190. .eq(SysUser::getPhonenumber, user.getPhonenumber())
  191. .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
  192. if (exist) {
  193. return UserConstants.NOT_UNIQUE;
  194. }
  195. return UserConstants.UNIQUE;
  196. }
  197. /**
  198. * 校验email是否唯一
  199. *
  200. * @param user 用户信息
  201. * @return
  202. */
  203. @Override
  204. public String checkEmailUnique(SysUser user) {
  205. boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysUser>()
  206. .eq(SysUser::getEmail, user.getEmail())
  207. .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()));
  208. if (exist) {
  209. return UserConstants.NOT_UNIQUE;
  210. }
  211. return UserConstants.UNIQUE;
  212. }
  213. /**
  214. * 校验用户是否允许操作
  215. *
  216. * @param user 用户信息
  217. */
  218. @Override
  219. public void checkUserAllowed(SysUser user) {
  220. if (ObjectUtil.isNotNull(user.getUserId()) && user.isAdmin()) {
  221. throw new ServiceException("不允许操作超级管理员用户");
  222. }
  223. }
  224. /**
  225. * 校验用户是否有数据权限
  226. *
  227. * @param userId 用户id
  228. */
  229. @Override
  230. public void checkUserDataScope(Long userId) {
  231. if (!LoginHelper.isAdmin()) {
  232. SysUser user = new SysUser();
  233. user.setUserId(userId);
  234. List<SysUser> users = this.selectUserList(user);
  235. if (CollUtil.isEmpty(users)) {
  236. throw new ServiceException("没有权限访问用户数据!");
  237. }
  238. }
  239. }
  240. /**
  241. * 新增保存用户信息
  242. *
  243. * @param user 用户信息
  244. * @return 结果
  245. */
  246. @Override
  247. @Transactional(rollbackFor = Exception.class)
  248. public int insertUser(SysUser user) {
  249. // 新增用户信息
  250. int rows = baseMapper.insert(user);
  251. // 新增用户岗位关联
  252. insertUserPost(user);
  253. // 新增用户与角色管理
  254. insertUserRole(user);
  255. return rows;
  256. }
  257. /**
  258. * 注册用户信息
  259. *
  260. * @param user 用户信息
  261. * @return 结果
  262. */
  263. @Override
  264. public boolean registerUser(SysUser user) {
  265. user.setCreateBy(user.getUserName());
  266. user.setUpdateBy(user.getUserName());
  267. return baseMapper.insert(user) > 0;
  268. }
  269. /**
  270. * 修改保存用户信息
  271. *
  272. * @param user 用户信息
  273. * @return 结果
  274. */
  275. @Override
  276. @Transactional(rollbackFor = Exception.class)
  277. public int updateUser(SysUser user) {
  278. Long userId = user.getUserId();
  279. // 删除用户与角色关联
  280. userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
  281. // 新增用户与角色管理
  282. insertUserRole(user);
  283. // 删除用户与岗位关联
  284. userPostMapper.delete(new LambdaQueryWrapper<SysUserPost>().eq(SysUserPost::getUserId, userId));
  285. // 新增用户与岗位管理
  286. insertUserPost(user);
  287. return baseMapper.updateById(user);
  288. }
  289. /**
  290. * 用户授权角色
  291. *
  292. * @param userId 用户ID
  293. * @param roleIds 角色组
  294. */
  295. @Override
  296. @Transactional(rollbackFor = Exception.class)
  297. public void insertUserAuth(Long userId, Long[] roleIds) {
  298. userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
  299. .eq(SysUserRole::getUserId, userId));
  300. insertUserRole(userId, roleIds);
  301. }
  302. /**
  303. * 修改用户状态
  304. *
  305. * @param user 用户信息
  306. * @return 结果
  307. */
  308. @Override
  309. public int updateUserStatus(SysUser user) {
  310. return baseMapper.updateById(user);
  311. }
  312. /**
  313. * 修改用户基本信息
  314. *
  315. * @param user 用户信息
  316. * @return 结果
  317. */
  318. @Override
  319. public int updateUserProfile(SysUser user) {
  320. return baseMapper.updateById(user);
  321. }
  322. /**
  323. * 修改用户头像
  324. *
  325. * @param userName 用户名
  326. * @param avatar 头像地址
  327. * @return 结果
  328. */
  329. @Override
  330. public boolean updateUserAvatar(String userName, String avatar) {
  331. return baseMapper.update(null,
  332. new LambdaUpdateWrapper<SysUser>()
  333. .set(SysUser::getAvatar, avatar)
  334. .eq(SysUser::getUserName, userName)) > 0;
  335. }
  336. /**
  337. * 重置用户密码
  338. *
  339. * @param user 用户信息
  340. * @return 结果
  341. */
  342. @Override
  343. public int resetPwd(SysUser user) {
  344. return baseMapper.updateById(user);
  345. }
  346. /**
  347. * 重置用户密码
  348. *
  349. * @param userName 用户名
  350. * @param password 密码
  351. * @return 结果
  352. */
  353. @Override
  354. public int resetUserPwd(String userName, String password) {
  355. return baseMapper.update(null,
  356. new LambdaUpdateWrapper<SysUser>()
  357. .set(SysUser::getPassword, password)
  358. .eq(SysUser::getUserName, userName));
  359. }
  360. /**
  361. * 新增用户角色信息
  362. *
  363. * @param user 用户对象
  364. */
  365. public void insertUserRole(SysUser user) {
  366. Long[] roles = user.getRoleIds();
  367. if (ObjectUtil.isNotNull(roles)) {
  368. // 新增用户与角色管理
  369. List<SysUserRole> list = new ArrayList<SysUserRole>();
  370. for (Long roleId : roles) {
  371. SysUserRole ur = new SysUserRole();
  372. ur.setUserId(user.getUserId());
  373. ur.setRoleId(roleId);
  374. list.add(ur);
  375. }
  376. if (list.size() > 0) {
  377. userRoleMapper.insertBatch(list);
  378. }
  379. }
  380. }
  381. /**
  382. * 新增用户岗位信息
  383. *
  384. * @param user 用户对象
  385. */
  386. public void insertUserPost(SysUser user) {
  387. Long[] posts = user.getPostIds();
  388. if (ObjectUtil.isNotNull(posts)) {
  389. // 新增用户与岗位管理
  390. List<SysUserPost> list = new ArrayList<SysUserPost>();
  391. for (Long postId : posts) {
  392. SysUserPost up = new SysUserPost();
  393. up.setUserId(user.getUserId());
  394. up.setPostId(postId);
  395. list.add(up);
  396. }
  397. if (list.size() > 0) {
  398. userPostMapper.insertBatch(list);
  399. }
  400. }
  401. }
  402. /**
  403. * 新增用户角色信息
  404. *
  405. * @param userId 用户ID
  406. * @param roleIds 角色组
  407. */
  408. public void insertUserRole(Long userId, Long[] roleIds) {
  409. if (ObjectUtil.isNotNull(roleIds)) {
  410. // 新增用户与角色管理
  411. List<SysUserRole> list = new ArrayList<SysUserRole>();
  412. for (Long roleId : roleIds) {
  413. SysUserRole ur = new SysUserRole();
  414. ur.setUserId(userId);
  415. ur.setRoleId(roleId);
  416. list.add(ur);
  417. }
  418. if (list.size() > 0) {
  419. userRoleMapper.insertBatch(list);
  420. }
  421. }
  422. }
  423. /**
  424. * 通过用户ID删除用户
  425. *
  426. * @param userId 用户ID
  427. * @return 结果
  428. */
  429. @Override
  430. @Transactional(rollbackFor = Exception.class)
  431. public int deleteUserById(Long userId) {
  432. // 删除用户与角色关联
  433. userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
  434. // 删除用户与岗位表
  435. userPostMapper.delete(new LambdaQueryWrapper<SysUserPost>().eq(SysUserPost::getUserId, userId));
  436. return baseMapper.deleteById(userId);
  437. }
  438. /**
  439. * 批量删除用户信息
  440. *
  441. * @param userIds 需要删除的用户ID
  442. * @return 结果
  443. */
  444. @Override
  445. @Transactional(rollbackFor = Exception.class)
  446. public int deleteUserByIds(Long[] userIds) {
  447. for (Long userId : userIds) {
  448. checkUserAllowed(new SysUser(userId));
  449. checkUserDataScope(userId);
  450. }
  451. List<Long> ids = Arrays.asList(userIds);
  452. // 删除用户与角色关联
  453. userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getUserId, ids));
  454. // 删除用户与岗位表
  455. userPostMapper.delete(new LambdaQueryWrapper<SysUserPost>().in(SysUserPost::getUserId, ids));
  456. return baseMapper.deleteBatchIds(ids);
  457. }
  458. }