SysUserServiceImpl.java 16 KB

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