SysUserServiceImpl.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659
  1. package com.slibra.system.service.impl;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. import java.util.Objects;
  6. import java.util.stream.Collectors;
  7. import javax.validation.Validator;
  8. import com.slibra.business.domain.*;
  9. import com.slibra.business.mapper.*;
  10. import com.slibra.common.utils.DateUtils;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Service;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import org.springframework.util.CollectionUtils;
  18. import com.slibra.common.annotation.DataScope;
  19. import com.slibra.common.constant.UserConstants;
  20. import com.slibra.common.core.domain.entity.SysRole;
  21. import com.slibra.common.core.domain.entity.SysUser;
  22. import com.slibra.common.exception.ServiceException;
  23. import com.slibra.common.utils.SecurityUtils;
  24. import com.slibra.common.utils.StringUtils;
  25. import com.slibra.common.utils.bean.BeanValidators;
  26. import com.slibra.common.utils.spring.SpringUtils;
  27. import com.slibra.system.domain.SysPost;
  28. import com.slibra.system.domain.SysUserPost;
  29. import com.slibra.system.domain.SysUserRole;
  30. import com.slibra.system.mapper.SysPostMapper;
  31. import com.slibra.system.mapper.SysRoleMapper;
  32. import com.slibra.system.mapper.SysUserMapper;
  33. import com.slibra.system.mapper.SysUserPostMapper;
  34. import com.slibra.system.mapper.SysUserRoleMapper;
  35. import com.slibra.system.service.ISysConfigService;
  36. import com.slibra.system.service.ISysUserService;
  37. import static com.slibra.common.constant.MyConstants.*;
  38. /**
  39. * 用户 业务层处理
  40. *
  41. *
  42. */
  43. @Service
  44. public class SysUserServiceImpl implements ISysUserService
  45. {
  46. private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
  47. @Autowired
  48. private SysUserMapper userMapper;
  49. @Autowired
  50. private SysRoleMapper roleMapper;
  51. @Autowired
  52. private SysPostMapper postMapper;
  53. @Autowired
  54. private SysUserRoleMapper userRoleMapper;
  55. @Autowired
  56. private SysUserPostMapper userPostMapper;
  57. @Autowired
  58. private ISysConfigService configService;
  59. @Autowired
  60. protected Validator validator;
  61. @Autowired
  62. private CAgentMapper cAgentMapper;
  63. @Autowired
  64. private CAgentMonitorMapper cagentMonitorMapper;
  65. @Autowired
  66. private CPhoneMapper cPhoneMapper;
  67. @Autowired
  68. private CHumanServiceMapMapper cHumanServiceMapMapper;
  69. @Autowired
  70. private TZuoxiRecordMapper tzuoxiRecordMapper;
  71. @Value("${SIP_SUFFIX}")
  72. private String sipSuffix;
  73. /**
  74. * 根据条件分页查询用户列表
  75. *
  76. * @param user 用户信息
  77. * @return 用户信息集合信息
  78. */
  79. @Override
  80. @DataScope(deptAlias = "d", userAlias = "u")
  81. public List<SysUser> selectUserList(SysUser user)
  82. {
  83. return userMapper.selectUserList(user);
  84. }
  85. /**
  86. * 根据条件分页查询已分配用户角色列表
  87. *
  88. * @param user 用户信息
  89. * @return 用户信息集合信息
  90. */
  91. @Override
  92. @DataScope(deptAlias = "d", userAlias = "u")
  93. public List<SysUser> selectAllocatedList(SysUser user)
  94. {
  95. return userMapper.selectAllocatedList(user);
  96. }
  97. /**
  98. * 根据条件分页查询未分配用户角色列表
  99. *
  100. * @param user 用户信息
  101. * @return 用户信息集合信息
  102. */
  103. @Override
  104. @DataScope(deptAlias = "d", userAlias = "u")
  105. public List<SysUser> selectUnallocatedList(SysUser user)
  106. {
  107. return userMapper.selectUnallocatedList(user);
  108. }
  109. /**
  110. * 通过用户名查询用户
  111. *
  112. * @param userName 用户名
  113. * @return 用户对象信息
  114. */
  115. @Override
  116. public SysUser selectUserByUserName(String userName)
  117. {
  118. return userMapper.selectUserByUserName(userName);
  119. }
  120. /**
  121. * 通过用户ID查询用户
  122. *
  123. * @param userId 用户ID
  124. * @return 用户对象信息
  125. */
  126. @Override
  127. public SysUser selectUserById(Long userId)
  128. {
  129. return userMapper.selectUserById(userId);
  130. }
  131. /**
  132. * 查询用户所属角色组
  133. *
  134. * @param userName 用户名
  135. * @return 结果
  136. */
  137. @Override
  138. public String selectUserRoleGroup(String userName)
  139. {
  140. List<SysRole> list = roleMapper.selectRolesByUserName(userName);
  141. if (CollectionUtils.isEmpty(list))
  142. {
  143. return StringUtils.EMPTY;
  144. }
  145. return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(","));
  146. }
  147. /**
  148. * 查询用户所属岗位组
  149. *
  150. * @param userName 用户名
  151. * @return 结果
  152. */
  153. @Override
  154. public String selectUserPostGroup(String userName)
  155. {
  156. List<SysPost> list = postMapper.selectPostsByUserName(userName);
  157. if (CollectionUtils.isEmpty(list))
  158. {
  159. return StringUtils.EMPTY;
  160. }
  161. return list.stream().map(SysPost::getPostName).collect(Collectors.joining(","));
  162. }
  163. /**
  164. * 校验用户名称是否唯一
  165. *
  166. * @param user 用户信息
  167. * @return 结果
  168. */
  169. @Override
  170. public boolean checkUserNameUnique(SysUser user)
  171. {
  172. Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
  173. // SysUser info = userMapper.checkUserNameUnique(user.getUserName());
  174. SysUser info = userMapper.checkUserNameUnique(user.getUserName(), user.getType());
  175. if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
  176. {
  177. return UserConstants.NOT_UNIQUE;
  178. }
  179. return UserConstants.UNIQUE;
  180. }
  181. /**
  182. * 校验手机号码是否唯一
  183. *
  184. * @param user 用户信息
  185. * @return
  186. */
  187. @Override
  188. public boolean checkPhoneUnique(SysUser user)
  189. {
  190. Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
  191. // SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
  192. SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber(), user.getType());
  193. if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
  194. {
  195. return UserConstants.NOT_UNIQUE;
  196. }
  197. return UserConstants.UNIQUE;
  198. }
  199. /**
  200. * 校验email是否唯一
  201. *
  202. * @param user 用户信息
  203. * @return
  204. */
  205. @Override
  206. public boolean checkEmailUnique(SysUser user)
  207. {
  208. /*Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
  209. SysUser info = userMapper.checkEmailUnique(user.getEmail(), user.getType());
  210. if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
  211. {
  212. return UserConstants.NOT_UNIQUE;
  213. }*/
  214. return UserConstants.UNIQUE;
  215. }
  216. /**
  217. * 校验用户是否允许操作
  218. *
  219. * @param user 用户信息
  220. */
  221. @Override
  222. public void checkUserAllowed(SysUser user)
  223. {
  224. if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())
  225. {
  226. throw new ServiceException("不允许操作超级管理员用户");
  227. }
  228. }
  229. /**
  230. * 校验用户是否有数据权限
  231. *
  232. * @param userId 用户id
  233. */
  234. @Override
  235. public void checkUserDataScope(Long userId)
  236. {
  237. if (!SysUser.isAdmin(SecurityUtils.getUserId()))
  238. {
  239. SysUser user = new SysUser();
  240. user.setUserId(userId);
  241. //2024年09月10日15:54:25 修改因为区分前后端用户新增的type 默认为0导致的bug
  242. user.setType(null);
  243. List<SysUser> users = SpringUtils.getAopProxy(this).selectUserList(user);
  244. if (StringUtils.isEmpty(users))
  245. {
  246. throw new ServiceException("没有权限访问用户数据!");
  247. }
  248. }
  249. }
  250. /**
  251. * 新增保存用户信息
  252. *
  253. * @param user 用户信息
  254. * @return 结果
  255. */
  256. @Override
  257. @Transactional
  258. public int insertUser(SysUser user)
  259. {
  260. // 新增用户信息
  261. int rows = userMapper.insertUser(user);
  262. // 新增用户岗位关联
  263. insertUserPost(user);
  264. // 新增用户与角色管理
  265. insertUserRole(user);
  266. //2024年12月19日15:37:18 新增用户的时候,也可以分配角色,这时候也要考虑坐席
  267. addZuoXi(user);
  268. return rows;
  269. }
  270. /**
  271. * 注册用户信息
  272. *
  273. * @param user 用户信息
  274. * @return 结果
  275. */
  276. @Override
  277. public boolean registerUser(SysUser user)
  278. {
  279. return userMapper.insertUser(user) > 0;
  280. }
  281. /**
  282. * 修改保存用户信息
  283. *
  284. * @param user 用户信息
  285. * @return 结果
  286. */
  287. @Override
  288. @Transactional
  289. public int updateUser(SysUser user)
  290. {
  291. Long userId = user.getUserId();
  292. // 删除用户与角色关联
  293. userRoleMapper.deleteUserRoleByUserId(userId);
  294. // 新增用户与角色管理
  295. insertUserRole(user);
  296. // 删除用户与岗位关联
  297. userPostMapper.deleteUserPostByUserId(userId);
  298. // 新增用户与岗位管理
  299. insertUserPost(user);
  300. //2024年11月25日10:51:14 在分配用户角色的时候,如果角色包含”坐席“,那么需要额外保存到数据库中2条坐席相关的记录
  301. addZuoXi(user);
  302. return userMapper.updateUser(user);
  303. }
  304. private void addZuoXi( SysUser user) {
  305. Long[] roleIds = user.getRoleIds();
  306. boolean isZuoXi = false;
  307. if(StringUtils.isNotEmpty(roleIds)){
  308. for (Long roleId : roleIds) {
  309. if(SysUser.isZuoXi(roleId)){
  310. isZuoXi = true;
  311. break;
  312. }
  313. }
  314. }
  315. if(isZuoXi){
  316. log.info("当前更新用户的时候,所携带的角色包含坐席的角色");
  317. Long userId = user.getUserId();
  318. String nickName = user.getNickName();
  319. //先去判断在坐席里面,是否已经关联过用户了,如果关联过了,就不需要再增加
  320. List<CAgent> cAgents = this.cAgentMapper.selectCAgentList(CAgent.builder().userId(userId).build());
  321. if(!CollectionUtils.isEmpty(cAgents)){
  322. log.info("用户ID{}已经绑定过坐席了,无需重复添加", userId);
  323. //2025年01月07日09:33:45 新增逻辑:如果用户的昵称改了,那么对应坐席中的用户的昵称也要修改
  324. CAgent cAgent = cAgents.get(0);
  325. if(!Objects.isNull(cAgent)){
  326. cAgent.setAgentName(nickName);
  327. cAgent.setUpdateTime(DateUtils.getNowDate());
  328. this.cAgentMapper.updateCAgent(cAgent);
  329. }
  330. return;
  331. }
  332. //没有添加过 添加坐席和坐席监控,并在坐席里插入用户的ID、姓名、密码字段
  333. //查询最大的坐席工号 (SQL兜底,有默认值)
  334. String maxNum = this.cAgentMapper.selectMaxNum();
  335. String agentNum = String.valueOf(Long.parseLong(maxNum) + 1);
  336. //坐席对象
  337. CAgent cAgent = CAgent.builder().saasId(SAAS_ID).agentNum(agentNum).agentName(nickName).outId(agentNum).agentPwd(user.getPassword()).phoneNum(agentNum).userId(userId).build();
  338. //插入坐席
  339. this.cAgentMapper.insertCAgent(cAgent);
  340. //坐席监控对象
  341. CAgentMonitor cAgentMonitor = CAgentMonitor.builder().saasId(SAAS_ID).agentNum(agentNum).outId(agentNum).build();
  342. //插入坐席监控
  343. this.cagentMonitorMapper.insertCAgentMonitor(cAgentMonitor);
  344. //分机信息对象
  345. CPhone cPhone = CPhone.builder().saasId(SAAS_ID).phoneNum(agentNum).sipServer(SIP_PREFIX + agentNum + sipSuffix).build();
  346. //插入分机信息
  347. this.cPhoneMapper.insertCPhone(cPhone);
  348. //2024年12月11日15:02:10 需要插入新的数据
  349. CHumanServiceMap cHumanServiceMap = CHumanServiceMap.builder().saasId(SAAS_ID).agentId(agentNum).build();
  350. cHumanServiceMapMapper.insertCHumanServiceMap(cHumanServiceMap);
  351. //2025年01月08日13:34:02 新增逻辑,需要记录坐席用户,用于在通话记录查询的筛选客服列表查询
  352. //先去查询是否已经存在了,存在就更新姓名,如果不存在,就插入数据即可
  353. List<TZuoxiRecord> tZuoxiRecords = this.tzuoxiRecordMapper.selectTZuoxiRecordList(TZuoxiRecord.builder().userId(userId).build());
  354. Date nowDate = DateUtils.getNowDate();
  355. String username = SecurityUtils.getUsername();
  356. if(!CollectionUtils.isEmpty(tZuoxiRecords)){
  357. log.info("坐席用户已经存在了,这里只更新坐席的昵称");
  358. TZuoxiRecord tZuoxiRecord = tZuoxiRecords.get(0);
  359. tZuoxiRecord.setUserName(nickName);
  360. tZuoxiRecord.setUpdateTime(nowDate);
  361. tZuoxiRecord.setUpdateBy(username);
  362. this.tzuoxiRecordMapper.updateTZuoxiRecord(tZuoxiRecord);
  363. }else{
  364. log.info("坐席用户已经不存在,插入坐席用户");
  365. TZuoxiRecord tZuoxiRecord = TZuoxiRecord.builder().userId(userId).userName(nickName).build();
  366. tZuoxiRecord.setCreateTime(nowDate);
  367. tZuoxiRecord.setCreateBy(username);
  368. this.tzuoxiRecordMapper.insertTZuoxiRecord(tZuoxiRecord);
  369. }
  370. }
  371. }
  372. /**
  373. * 用户授权角色
  374. *
  375. * @param userId 用户ID
  376. * @param roleIds 角色组
  377. */
  378. @Override
  379. @Transactional
  380. public void insertUserAuth(Long userId, Long[] roleIds)
  381. {
  382. userRoleMapper.deleteUserRoleByUserId(userId);
  383. //2024年12月11日15:05:06 新增逻辑,判断坐席
  384. SysUser sysUser = this.userMapper.selectUserById(userId);
  385. sysUser.setRoleIds(roleIds);
  386. addZuoXi(sysUser);
  387. insertUserRole(userId, roleIds);
  388. }
  389. /**
  390. * 修改用户状态
  391. *
  392. * @param user 用户信息
  393. * @return 结果
  394. */
  395. @Override
  396. public int updateUserStatus(SysUser user)
  397. {
  398. return userMapper.updateUser(user);
  399. }
  400. /**
  401. * 修改用户基本信息
  402. *
  403. * @param user 用户信息
  404. * @return 结果
  405. */
  406. @Override
  407. public int updateUserProfile(SysUser user)
  408. {
  409. return userMapper.updateUser(user);
  410. }
  411. /**
  412. * 修改用户头像
  413. *
  414. * @param userName 用户名
  415. * @param avatar 头像地址
  416. * @return 结果
  417. */
  418. @Override
  419. public boolean updateUserAvatar(String userName, String avatar)
  420. {
  421. return userMapper.updateUserAvatar(userName, avatar) > 0;
  422. }
  423. /**
  424. * 重置用户密码
  425. *
  426. * @param user 用户信息
  427. * @return 结果
  428. */
  429. @Override
  430. public int resetPwd(SysUser user)
  431. {
  432. return userMapper.updateUser(user);
  433. }
  434. /**
  435. * 重置用户密码
  436. *
  437. * @param userName 用户名
  438. * @param password 密码
  439. * @return 结果
  440. */
  441. @Override
  442. public int resetUserPwd(String userName, String password)
  443. {
  444. return userMapper.resetUserPwd(userName, password);
  445. }
  446. /**
  447. * 新增用户角色信息
  448. *
  449. * @param user 用户对象
  450. */
  451. public void insertUserRole(SysUser user)
  452. {
  453. this.insertUserRole(user.getUserId(), user.getRoleIds());
  454. }
  455. /**
  456. * 新增用户岗位信息
  457. *
  458. * @param user 用户对象
  459. */
  460. public void insertUserPost(SysUser user)
  461. {
  462. Long[] posts = user.getPostIds();
  463. if (StringUtils.isNotEmpty(posts))
  464. {
  465. // 新增用户与岗位管理
  466. List<SysUserPost> list = new ArrayList<SysUserPost>(posts.length);
  467. for (Long postId : posts)
  468. {
  469. SysUserPost up = new SysUserPost();
  470. up.setUserId(user.getUserId());
  471. up.setPostId(postId);
  472. list.add(up);
  473. }
  474. userPostMapper.batchUserPost(list);
  475. }
  476. }
  477. /**
  478. * 新增用户角色信息
  479. *
  480. * @param userId 用户ID
  481. * @param roleIds 角色组
  482. */
  483. public void insertUserRole(Long userId, Long[] roleIds)
  484. {
  485. if (StringUtils.isNotEmpty(roleIds))
  486. {
  487. // 新增用户与角色管理
  488. List<SysUserRole> list = new ArrayList<SysUserRole>(roleIds.length);
  489. for (Long roleId : roleIds)
  490. {
  491. SysUserRole ur = new SysUserRole();
  492. ur.setUserId(userId);
  493. ur.setRoleId(roleId);
  494. list.add(ur);
  495. }
  496. userRoleMapper.batchUserRole(list);
  497. }
  498. }
  499. /**
  500. * 通过用户ID删除用户
  501. *
  502. * @param userId 用户ID
  503. * @return 结果
  504. */
  505. @Override
  506. @Transactional
  507. public int deleteUserById(Long userId)
  508. {
  509. // 删除用户与角色关联
  510. userRoleMapper.deleteUserRoleByUserId(userId);
  511. // 删除用户与岗位表
  512. userPostMapper.deleteUserPostByUserId(userId);
  513. return userMapper.deleteUserById(userId);
  514. }
  515. /**
  516. * 批量删除用户信息
  517. *
  518. * @param userIds 需要删除的用户ID
  519. * @return 结果
  520. */
  521. @Override
  522. @Transactional
  523. public int deleteUserByIds(Long[] userIds)
  524. {
  525. for (Long userId : userIds)
  526. {
  527. checkUserAllowed(new SysUser(userId));
  528. checkUserDataScope(userId);
  529. }
  530. // 删除用户与角色关联
  531. userRoleMapper.deleteUserRole(userIds);
  532. // 删除用户与岗位关联
  533. userPostMapper.deleteUserPost(userIds);
  534. return userMapper.deleteUserByIds(userIds);
  535. }
  536. /**
  537. * 导入用户数据
  538. *
  539. * @param userList 用户数据列表
  540. * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
  541. * @param operName 操作用户
  542. * @return 结果
  543. */
  544. @Override
  545. public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName)
  546. {
  547. if (StringUtils.isNull(userList) || userList.size() == 0)
  548. {
  549. throw new ServiceException("导入用户数据不能为空!");
  550. }
  551. int successNum = 0;
  552. int failureNum = 0;
  553. StringBuilder successMsg = new StringBuilder();
  554. StringBuilder failureMsg = new StringBuilder();
  555. String password = configService.selectConfigByKey("sys.user.initPassword");
  556. for (SysUser user : userList)
  557. {
  558. try
  559. {
  560. // 验证是否存在这个用户
  561. //做了多环境区分 目前只能在sql层处理了
  562. SysUser u = userMapper.selectUserByUserName(user.getUserName() + LOGIN_TYPE_APPEND + user.getType());
  563. if (StringUtils.isNull(u))
  564. {
  565. BeanValidators.validateWithException(validator, user);
  566. user.setPassword(SecurityUtils.encryptPassword(password));
  567. user.setCreateBy(operName);
  568. userMapper.insertUser(user);
  569. successNum++;
  570. successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 导入成功");
  571. }
  572. else if (isUpdateSupport)
  573. {
  574. BeanValidators.validateWithException(validator, user);
  575. checkUserAllowed(u);
  576. checkUserDataScope(u.getUserId());
  577. user.setUserId(u.getUserId());
  578. user.setUpdateBy(operName);
  579. userMapper.updateUser(user);
  580. successNum++;
  581. successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 更新成功");
  582. }
  583. else
  584. {
  585. failureNum++;
  586. failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 已存在");
  587. }
  588. }
  589. catch (Exception e)
  590. {
  591. failureNum++;
  592. String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:";
  593. failureMsg.append(msg + e.getMessage());
  594. log.error(msg, e);
  595. }
  596. }
  597. if (failureNum > 0)
  598. {
  599. failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
  600. throw new ServiceException(failureMsg.toString());
  601. }
  602. else
  603. {
  604. successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
  605. }
  606. return successMsg.toString();
  607. }
  608. @Override
  609. public SysUser selectUserByPhonenumber(String phoneNumber) {
  610. return userMapper.selectUserByPhonenumber(phoneNumber);
  611. }
  612. }