SysUserServiceImpl.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938
  1. package com.ruoyi.system.service.impl;
  2. import java.sql.SQLException;
  3. import java.sql.SQLIntegrityConstraintViolationException;
  4. import java.time.*;
  5. import java.time.format.DateTimeFormatter;
  6. import java.util.*;
  7. import java.util.stream.Collectors;
  8. import javax.validation.Validator;
  9. import com.ruoyi.common.core.domain.AjaxResult;
  10. import com.ruoyi.common.core.domain.entity.SysDept;
  11. import com.ruoyi.common.enums.UserRolesType;
  12. import com.ruoyi.common.utils.bean.BeanUtils;
  13. import com.ruoyi.project.bo.ProjectStaffRecordInput;
  14. import com.ruoyi.project.bo.ProjectStaffRecordOut;
  15. import com.ruoyi.project.domain.ProjectStaff;
  16. import com.ruoyi.project.domain.ProjectStaffRecord;
  17. import com.ruoyi.project.domain.ProjectTask;
  18. import com.ruoyi.project.mapper.ProjectStaffMapper;
  19. import com.ruoyi.project.mapper.ProjectStaffRecordMapper;
  20. import com.ruoyi.project.mapper.ProjectTaskMapper;
  21. import com.ruoyi.project.service.ProjectStaffRecordService;
  22. import com.ruoyi.system.domain.*;
  23. import com.ruoyi.system.mapper.*;
  24. import com.ruoyi.system.service.ISysDeptService;
  25. import com.ruoyi.weChat.service.WeChatService;
  26. import org.slf4j.Logger;
  27. import org.slf4j.LoggerFactory;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import org.springframework.util.CollectionUtils;
  32. import com.ruoyi.common.annotation.DataScope;
  33. import com.ruoyi.common.constant.UserConstants;
  34. import com.ruoyi.common.core.domain.entity.SysRole;
  35. import com.ruoyi.common.core.domain.entity.SysUser;
  36. import com.ruoyi.common.exception.ServiceException;
  37. import com.ruoyi.common.utils.SecurityUtils;
  38. import com.ruoyi.common.utils.StringUtils;
  39. import com.ruoyi.common.utils.bean.BeanValidators;
  40. import com.ruoyi.common.utils.spring.SpringUtils;
  41. import com.ruoyi.system.service.ISysConfigService;
  42. import com.ruoyi.system.service.ISysUserService;
  43. /**
  44. * 用户 业务层处理
  45. *
  46. */
  47. @Service
  48. public class SysUserServiceImpl implements ISysUserService
  49. {
  50. private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
  51. @Autowired
  52. private SysUserMapper userMapper;
  53. @Autowired
  54. private SysRoleMapper roleMapper;
  55. @Autowired
  56. private SysPostMapper postMapper;
  57. @Autowired
  58. private SysUserRoleMapper userRoleMapper;
  59. @Autowired
  60. private SysUserPostMapper userPostMapper;
  61. @Autowired
  62. private ISysConfigService configService;
  63. @Autowired
  64. private ISysDeptService deptService;
  65. @Autowired
  66. private WeChatService weChatService;
  67. @Autowired
  68. protected Validator validator;
  69. @Autowired
  70. private ProjectStaffMapper projectStaffMapper;
  71. @Autowired
  72. private ProjectStaffRecordMapper projectStaffRecordMapper;
  73. @Autowired
  74. private ProjectTaskMapper projectTaskMapper;
  75. @Autowired
  76. private UserRecordMapper userRecordMapper;
  77. @Autowired
  78. private ProjectStaffRecordService projectStaffRecordService;
  79. /**
  80. * 根据条件分页查询用户列表
  81. *
  82. * @param user 用户信息
  83. * @return 用户信息集合信息
  84. */
  85. @Override
  86. @DataScope(deptAlias = "d", userAlias = "u")
  87. public List<SysUser> selectUserList(SysUser user)
  88. {
  89. Long companyId = deptService.selectCompanyByDeptId();
  90. if (companyId!=null)user.setCompanyId(companyId);
  91. return userMapper.selectUserList(user);
  92. }
  93. /**
  94. * 根据条件分页查询已分配用户角色列表
  95. *
  96. * @param user 用户信息
  97. * @return 用户信息集合信息
  98. */
  99. @Override
  100. @DataScope(deptAlias = "d", userAlias = "u")
  101. public List<SysUser> selectAllocatedList(SysUser user)
  102. {
  103. return userMapper.selectAllocatedList(user);
  104. }
  105. /**
  106. * 根据条件分页查询未分配用户角色列表
  107. *
  108. * @param user 用户信息
  109. * @return 用户信息集合信息
  110. */
  111. @Override
  112. @DataScope(deptAlias = "d", userAlias = "u")
  113. public List<SysUser> selectUnallocatedList(SysUser user)
  114. {
  115. return userMapper.selectUnallocatedList(user);
  116. }
  117. /**
  118. * 通过用户名查询用户
  119. *
  120. * @param userName 用户名
  121. * @return 用户对象信息
  122. */
  123. @Override
  124. public SysUser selectUserByUserName(String userName)
  125. {
  126. return userMapper.selectUserByUserName(userName);
  127. }
  128. /**
  129. * 通过用户ID查询用户
  130. *
  131. * @param userId 用户ID
  132. * @return 用户对象信息
  133. */
  134. @Override
  135. public SysUser selectUserById(Long userId)
  136. {
  137. return userMapper.selectUserById(userId);
  138. }
  139. /**
  140. * 查询用户所属角色组
  141. *
  142. * @param userName 用户名
  143. * @return 结果
  144. */
  145. @Override
  146. public String selectUserRoleGroup(String userName)
  147. {
  148. List<SysRole> list = roleMapper.selectRolesByUserName(userName);
  149. if (CollectionUtils.isEmpty(list))
  150. {
  151. return StringUtils.EMPTY;
  152. }
  153. return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(","));
  154. }
  155. /**
  156. * 查询用户所属岗位组
  157. *
  158. * @param userName 用户名
  159. * @return 结果
  160. */
  161. @Override
  162. public String selectUserPostGroup(String userName)
  163. {
  164. List<SysPost> list = postMapper.selectPostsByUserName(userName);
  165. if (CollectionUtils.isEmpty(list))
  166. {
  167. return StringUtils.EMPTY;
  168. }
  169. return list.stream().map(SysPost::getPostName).collect(Collectors.joining(","));
  170. }
  171. /**
  172. * 校验用户名称是否唯一
  173. *
  174. * @param user 用户信息
  175. * @return 结果
  176. */
  177. @Override
  178. public boolean checkUserNameUnique(SysUser user)
  179. {
  180. Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
  181. SysUser info = userMapper.checkUserNameUnique(user.getUserName());
  182. if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
  183. {
  184. return UserConstants.NOT_UNIQUE;
  185. }
  186. return UserConstants.UNIQUE;
  187. }
  188. /**
  189. * 校验手机号码是否唯一
  190. *
  191. * @param user 用户信息
  192. * @return
  193. */
  194. @Override
  195. public boolean checkPhoneUnique(SysUser user)
  196. {
  197. Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
  198. SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
  199. if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
  200. {
  201. return UserConstants.NOT_UNIQUE;
  202. }
  203. return UserConstants.UNIQUE;
  204. }
  205. /**
  206. * 校验email是否唯一
  207. *
  208. * @param user 用户信息
  209. * @return
  210. */
  211. @Override
  212. public boolean checkEmailUnique(SysUser user)
  213. {
  214. Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
  215. SysUser info = userMapper.checkEmailUnique(user.getEmail());
  216. if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
  217. {
  218. return UserConstants.NOT_UNIQUE;
  219. }
  220. return UserConstants.UNIQUE;
  221. }
  222. /**
  223. * 校验用户是否允许操作
  224. *
  225. * @param user 用户信息
  226. */
  227. @Override
  228. public void checkUserAllowed(SysUser user)
  229. {
  230. if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())
  231. {
  232. throw new ServiceException("不允许操作超级管理员用户");
  233. }
  234. }
  235. /**
  236. * 校验用户是否有数据权限
  237. *
  238. * @param userId 用户id
  239. */
  240. @Override
  241. public void checkUserDataScope(Long userId)
  242. {
  243. if (!SysUser.isAdmin(SecurityUtils.getUserId()))
  244. {
  245. SysUser user = new SysUser();
  246. user.setUserId(userId);
  247. List<SysUser> users = SpringUtils.getAopProxy(this).selectUserList(user);
  248. if (StringUtils.isEmpty(users))
  249. {
  250. throw new ServiceException("没有权限访问用户数据!");
  251. }
  252. }
  253. }
  254. /**
  255. * 新增保存用户信息
  256. *
  257. * @param user 用户信息
  258. * @return 结果
  259. */
  260. @Override
  261. @Transactional
  262. public int insertUser(SysUser user)
  263. {
  264. // 新增用户信息
  265. int rows = userMapper.insertUser(user);
  266. // 新增用户岗位关联
  267. insertUserPost(user);
  268. // 新增用户与角色管理
  269. insertUserRole(user);
  270. return rows;
  271. }
  272. /**
  273. * 注册用户信息
  274. *
  275. * @param user 用户信息
  276. * @return 结果
  277. */
  278. @Override
  279. public boolean registerUser(SysUser user)
  280. {
  281. return userMapper.insertUser(user) > 0;
  282. }
  283. /**
  284. * 修改保存用户信息
  285. *
  286. * @param user 用户信息
  287. * @return 结果
  288. */
  289. @Override
  290. @Transactional
  291. public int updateUser(SysUser user)
  292. {
  293. Long userId = user.getUserId();
  294. // 删除用户与角色关联
  295. userRoleMapper.deleteUserRoleByUserId(userId);
  296. // 新增用户与角色管理
  297. insertUserRole(user);
  298. // 删除用户与岗位关联
  299. userPostMapper.deleteUserPostByUserId(userId);
  300. // 新增用户与岗位管理
  301. insertUserPost(user);
  302. //修改关联名称
  303. updateUserName(user);
  304. return userMapper.updateUser(user);
  305. }
  306. private void updateUserName(SysUser user) {
  307. SysUser sysUser = userMapper.selectUserById(user.getUserId());
  308. if (!sysUser.getNickName().equals(user.getNickName())){
  309. //修改所有名字
  310. projectStaffMapper.updateNameByAid(user);
  311. projectStaffRecordMapper.updateNameByAid(user);
  312. projectTaskMapper.updateAdminNameByAid(user);
  313. List<ProjectStaff> projectStaffs = projectStaffMapper.selectByAid(user.getUserId());
  314. for (ProjectStaff projectStaff : projectStaffs) {
  315. projectTaskMapper.updateStaffName(projectStaff.getPid());
  316. }
  317. }
  318. }
  319. /**
  320. * 用户授权角色
  321. *
  322. * @param userId 用户ID
  323. * @param roleIds 角色组
  324. */
  325. @Override
  326. @Transactional
  327. public void insertUserAuth(Long userId, Long[] roleIds)
  328. {
  329. userRoleMapper.deleteUserRoleByUserId(userId);
  330. insertUserRole(userId, roleIds);
  331. }
  332. /**
  333. * 修改用户状态
  334. *
  335. * @param user 用户信息
  336. * @return 结果
  337. */
  338. @Override
  339. public int updateUserStatus(SysUser user)
  340. {
  341. return userMapper.updateUser(user);
  342. }
  343. /**
  344. * 修改用户基本信息
  345. *
  346. * @param user 用户信息
  347. * @return 结果
  348. */
  349. @Override
  350. public int updateUserProfile(SysUser user)
  351. {
  352. return userMapper.updateUser(user);
  353. }
  354. /**
  355. * 修改用户头像
  356. *
  357. * @param userName 用户名
  358. * @param avatar 头像地址
  359. * @return 结果
  360. */
  361. @Override
  362. public boolean updateUserAvatar(String userName, String avatar)
  363. {
  364. return userMapper.updateUserAvatar(userName, avatar) > 0;
  365. }
  366. /**
  367. * 重置用户密码
  368. *
  369. * @param user 用户信息
  370. * @return 结果
  371. */
  372. @Override
  373. public int resetPwd(SysUser user)
  374. {
  375. return userMapper.updateUser(user);
  376. }
  377. /**
  378. * 重置用户密码
  379. *
  380. * @param userName 用户名
  381. * @param password 密码
  382. * @return 结果
  383. */
  384. @Override
  385. public int resetUserPwd(String userName, String password)
  386. {
  387. return userMapper.resetUserPwd(userName, password);
  388. }
  389. /**
  390. * 新增用户角色信息
  391. *
  392. * @param user 用户对象
  393. */
  394. public void insertUserRole(SysUser user)
  395. {
  396. this.insertUserRole(user.getUserId(), user.getRoleIds());
  397. }
  398. /**
  399. * 新增用户岗位信息
  400. *
  401. * @param user 用户对象
  402. */
  403. public void insertUserPost(SysUser user)
  404. {
  405. Long[] posts = user.getPostIds();
  406. if (StringUtils.isNotEmpty(posts))
  407. {
  408. // 新增用户与岗位管理
  409. List<SysUserPost> list = new ArrayList<SysUserPost>(posts.length);
  410. for (Long postId : posts)
  411. {
  412. SysUserPost up = new SysUserPost();
  413. up.setUserId(user.getUserId());
  414. up.setPostId(postId);
  415. list.add(up);
  416. }
  417. userPostMapper.batchUserPost(list);
  418. }
  419. }
  420. /**
  421. * 新增用户角色信息
  422. *
  423. * @param userId 用户ID
  424. * @param roleIds 角色组
  425. */
  426. public void insertUserRole(Long userId, Long[] roleIds)
  427. {
  428. if (StringUtils.isNotEmpty(roleIds))
  429. {
  430. // 新增用户与角色管理
  431. List<SysUserRole> list = new ArrayList<SysUserRole>(roleIds.length);
  432. for (Long roleId : roleIds)
  433. {
  434. SysUserRole ur = new SysUserRole();
  435. ur.setUserId(userId);
  436. ur.setRoleId(roleId);
  437. list.add(ur);
  438. }
  439. userRoleMapper.batchUserRole(list);
  440. }
  441. }
  442. /**
  443. * 通过用户ID删除用户
  444. *
  445. * @param userId 用户ID
  446. * @return 结果
  447. */
  448. @Override
  449. @Transactional
  450. public int deleteUserById(Long userId)
  451. {
  452. // 删除用户与角色关联
  453. userRoleMapper.deleteUserRoleByUserId(userId);
  454. // 删除用户与岗位表
  455. userPostMapper.deleteUserPostByUserId(userId);
  456. return userMapper.deleteUserById(userId);
  457. }
  458. /**
  459. * 批量删除用户信息
  460. *
  461. * @param userIds 需要删除的用户ID
  462. * @return 结果
  463. */
  464. @Override
  465. @Transactional
  466. public int deleteUserByIds(Long[] userIds)
  467. {
  468. for (Long userId : userIds)
  469. {
  470. checkUserAllowed(new SysUser(userId));
  471. checkUserDataScope(userId);
  472. }
  473. // 删除用户与角色关联
  474. userRoleMapper.deleteUserRole(userIds);
  475. // 删除用户与岗位关联
  476. userPostMapper.deleteUserPost(userIds);
  477. return userMapper.deleteUserByIds(userIds);
  478. }
  479. /**
  480. * 导入用户数据
  481. *
  482. * @param userList 用户数据列表
  483. * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
  484. * @param operName 操作用户
  485. * @return 结果
  486. */
  487. @Override
  488. public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName)
  489. {
  490. if (StringUtils.isNull(userList) || userList.size() == 0)
  491. {
  492. throw new ServiceException("导入用户数据不能为空!");
  493. }
  494. int successNum = 0;
  495. int failureNum = 0;
  496. StringBuilder successMsg = new StringBuilder();
  497. StringBuilder failureMsg = new StringBuilder();
  498. String password = configService.selectConfigByKey("sys.user.initPassword");
  499. Long company = deptService.selectCompanyByDeptId();
  500. for (SysUser user : userList)
  501. {
  502. try
  503. {
  504. if (StringUtils.isEmpty(user.getDeptName())){
  505. throw new ServiceException("部门数据异常");
  506. }
  507. if (StringUtils.isEmpty(user.getFullJob())){
  508. throw new ServiceException("全职/兼职数据异常");
  509. }
  510. // 验证是否存在这个用户
  511. SysUser u = userMapper.checkJobNumber(user.getJobNumber(),company);
  512. if (StringUtils.isNull(u)){
  513. SysUser sysUser1 = userMapper.selectUserByUserName(user.getUserName());
  514. if (sysUser1 != null){
  515. throw new ServiceException("用户名(账号)已存在");
  516. }
  517. user.setPassword(SecurityUtils.encryptPassword(password));
  518. user.setCreateBy(operName);
  519. user.setUserId(null);
  520. if (user.getSuperiorName()!=null){
  521. SysUser sysUser = userMapper.selectByNikeName(user.getSuperiorName(),company);
  522. if (sysUser != null){
  523. user.setSuperiorId(sysUser.getUserId());
  524. }
  525. }
  526. if (user.getDeptName()!=null){
  527. SysDept sysDept = deptService.selectByDepName(user.getDeptName(), company);
  528. if (sysDept ==null){
  529. throw new ServiceException("部门数据异常,找不到部门");
  530. }else {
  531. user.setDeptId(sysDept.getDeptId());
  532. }
  533. }
  534. userMapper.insertUser(user);
  535. if (user.getRoleName()!=null){
  536. SysRole sysRole = roleMapper.selectByRoleName(user.getRoleName());
  537. if (sysRole !=null){
  538. List<SysUserRole> list=new ArrayList<>();
  539. SysUserRole sur = new SysUserRole();
  540. sur.setUserId(user.getUserId());
  541. sur.setRoleId(sysRole.getRoleId());
  542. list.add(sur);
  543. userRoleMapper.batchUserRole(list);
  544. }
  545. }
  546. successNum++;
  547. successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 导入成功");
  548. } else if (isUpdateSupport) {
  549. // BeanValidators.validateWithException(validator, user);
  550. checkUserAllowed(u);
  551. checkUserDataScope(u.getUserId());
  552. user.setUserId(u.getUserId());
  553. user.setUpdateBy(operName);
  554. if (user.getSuperiorName()!=null&&!user.getSuperiorName().equals(u.getSuperiorName())){
  555. SysUser sysUser = userMapper.selectByNikeName(user.getSuperiorName(),company);
  556. if (sysUser != null){
  557. user.setSuperiorId(sysUser.getUserId());
  558. }
  559. }
  560. if (user.getDeptName()!=null&&!user.getDeptName().equals(u.getDeptName())){
  561. SysDept sysDept = deptService.selectByDepName(user.getDeptName(), company);
  562. if (sysDept ==null){
  563. throw new ServiceException("部门数据异常,找不到部门");
  564. }else {
  565. user.setDeptId(sysDept.getDeptId());
  566. }
  567. }
  568. if (user.getRoleName()!=null&&!user.getRoleName().equals(u.getRoleName())){
  569. SysRole sysRole = roleMapper.selectByRoleName(user.getRoleName());
  570. if (sysRole !=null){
  571. userRoleMapper.deleteUserRoleByUserId(user.getUserId());
  572. List<SysUserRole> list=new ArrayList<>();
  573. SysUserRole sur = new SysUserRole();
  574. sur.setUserId(user.getUserId());
  575. sur.setRoleId(sysRole.getRoleId());
  576. list.add(sur);
  577. userRoleMapper.batchUserRole(list);
  578. }
  579. }
  580. userMapper.updateUser(user);
  581. successNum++;
  582. successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 更新成功");
  583. }
  584. else
  585. {
  586. failureNum++;
  587. failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 已存在");
  588. }
  589. }
  590. catch (Exception e)
  591. {
  592. failureNum++;
  593. String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:";
  594. if (e instanceof ServiceException){
  595. failureMsg.append(msg + e.getMessage());
  596. }else if (e instanceof SQLException){
  597. failureMsg.append("数据异常");
  598. }
  599. log.error(msg, e);
  600. }
  601. }
  602. if (failureNum > 0)
  603. {
  604. failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
  605. throw new ServiceException(failureMsg.toString());
  606. }
  607. else
  608. {
  609. successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
  610. }
  611. return successMsg.toString();
  612. }
  613. @Override
  614. public Object selectName(String name,Integer type){
  615. if (name==null||name.length()<2)return new ArrayList<>();
  616. Long roleId=null;
  617. if (type==null)type=0;
  618. if (type==0)roleId= UserRolesType.COMMON.getCode();
  619. else if (type==1)roleId=UserRolesType.MANAGE.getCode();
  620. if (SecurityUtils.isSuperAdmin()){
  621. roleId=UserRolesType.ADMIN.getCode();;
  622. }
  623. Long companyId = deptService.selectCompanyByDeptId();
  624. return userMapper.selectName(name,roleId,companyId);
  625. }
  626. @Override
  627. public String setOpenId(String code) {
  628. System.out.println(code);
  629. String openId = weChatService.getOpenId(code);
  630. SysUser user = new SysUser();
  631. user.setUserId(SecurityUtils.getUserId());
  632. user.setOpenId(openId);
  633. userMapper.updateUser(user);
  634. return openId;
  635. }
  636. @Override
  637. public boolean checkJobNumber(SysUser user) {
  638. Long companyId = getCompany(user.getDeptId());
  639. log.debug("company="+companyId);
  640. SysUser sysUser = userMapper.checkJobNumber(user.getJobNumber(),companyId);
  641. if (sysUser==null){
  642. return false;
  643. }else if (StringUtils.isNotNull(user.getUserId())&&user.getUserId().equals(sysUser.getUserId())){
  644. return false;
  645. }
  646. return true;
  647. }
  648. @Override
  649. public boolean checkProject(Long[] userIds) {
  650. for (Long userId : userIds) {
  651. int i = userMapper.selectParticipateProjectSum(userId);
  652. if (i>0){
  653. return true;
  654. }
  655. }
  656. return false;
  657. }
  658. private Long getCompany(Long deptId) {
  659. log.debug("depID="+deptId);
  660. SysDept sysDept = deptService.selectDeptById(deptId);
  661. String ancestors = sysDept.getAncestors();
  662. log.debug("anc="+ancestors);
  663. String[] split = ancestors.split(",");
  664. if (split.length>2)return Long.valueOf(split[2]);
  665. else return deptId;
  666. }
  667. @Override
  668. public void pushUserClock(List<Map<Integer, String>> maps) {
  669. List<UserClockDtails> list=new ArrayList<>();
  670. int month =0;
  671. int year =0;
  672. int days=0;
  673. Map<Integer,String> hand=new HashMap<>();
  674. String startClockTime=null;
  675. String endClockTime=null;
  676. if (!maps.isEmpty()){
  677. for (int i = 0; i < maps.size(); i++) {
  678. //获取头部
  679. if (i==0){
  680. Map<Integer, String> map = maps.get(i);
  681. String head = map.get(0);
  682. int i1 = head.indexOf(":")+1;
  683. int i2 = head.indexOf("至");
  684. startClockTime = head.substring(i1, i2).trim();
  685. endClockTime = head.substring(i2+1).trim();
  686. LocalDate date = LocalDate.parse(startClockTime, DateTimeFormatter.ISO_DATE);
  687. month=date.getMonthValue();
  688. year = date.getYear();
  689. }else if (i==2){
  690. hand=maps.get(2);
  691. }else {
  692. Map<Integer, String> map = maps.get(i);
  693. UserClockDtails userClockDtails=new UserClockDtails();
  694. //每一条是一个人的当月打卡
  695. for (int j = 0; j < map.size(); j++) {
  696. String s = map.get(j);
  697. if (j==0)userClockDtails.setName(s);
  698. else if (j==1)userClockDtails.setGroupName(s.replace("\n","-").replace(" ",""));
  699. else if (j==2)userClockDtails.setDepName(s.replace("\n","-"));
  700. else if (j==3)userClockDtails.setJobNumber(s);
  701. else if (j==4)userClockDtails.setPosition(s);
  702. else if (j==5)userClockDtails.setUserId(s);
  703. //前5为基本信息,后面则是打卡信息
  704. else {
  705. UserClockDtails newUserlock=new UserClockDtails(userClockDtails);
  706. if(StringUtils.isNotEmpty(s)){
  707. String[] split = s.split("\n");
  708. if (split.length==1){
  709. newUserlock.setStauts(1);
  710. }
  711. String regex = "\\d+";
  712. if (hand.get(j).matches(regex)){
  713. days=Integer.parseInt(hand.get(j));
  714. }else {
  715. days++;
  716. }
  717. newUserlock.setClockDate(s);
  718. newUserlock.setClockTime(LocalDate.of(year,month,days));
  719. int startHour = Integer.parseInt(getTime(split[0].split(":")[0]));
  720. int startMinute = Integer.parseInt(getTime(split[0].split(":")[1]));
  721. LocalDateTime startTime=LocalDateTime.of(year,month,days,startHour,startMinute);
  722. newUserlock.setStartTime(startTime);
  723. if (newUserlock.getStauts()==0){
  724. int endHour = Integer.parseInt(getTime(split[split.length - 1].split(":")[0]));
  725. int endMinute = Integer.parseInt(getTime(split[split.length - 1].split(":")[1]));
  726. LocalDateTime endTime=LocalDateTime.of(year,month,days,endHour,endMinute);
  727. newUserlock.setEndTime(endTime);
  728. Double hours = getHuors(startTime, endTime);
  729. newUserlock.setDuration(hours);
  730. }else {
  731. newUserlock.setDuration(0.0);
  732. }
  733. list.add(newUserlock);
  734. }
  735. }
  736. }
  737. }
  738. }
  739. }
  740. List<UserRecordOut> userRecordList = new ArrayList<>();
  741. for (UserClockDtails e:list){
  742. Long ddUserId = Long.valueOf(e.getUserId());
  743. List<ProjectStaffRecord> projectStaffRecords = projectStaffRecordMapper.selectByDDUidAndTime(ddUserId, e.getClockTime());
  744. UserRecordOut ur=new UserRecordOut();
  745. ur.setName(e.getName());
  746. ur.setDdUserId(Long.valueOf(e.getUserId()));
  747. ur.setCheckDuration(e.getDuration());
  748. ur.setSumDuration(e.getDuration());
  749. ur.setContent(e.getClockDate());
  750. ur.setStartTime(Date.from(e.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
  751. if (e.getEndTime() != null){
  752. ur.setEndTime(Date.from(e.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
  753. ur.setStatus(0);
  754. }else {
  755. ur.setStatus(1);
  756. }
  757. ur.setRecordTime(Date.from(e.getClockTime().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()));
  758. if (projectStaffRecords.isEmpty()){
  759. ur.setClockStatus(2);
  760. }else if (projectStaffRecords.size()==1){
  761. ur.setClockStatus(0);
  762. ur.setPsrId(projectStaffRecords.get(0).getId());
  763. }else if (projectStaffRecords.size()>1){
  764. ur.setClockStatus(1);
  765. ur.setList(projectStaffRecords);
  766. }
  767. ur.setCreateId(SecurityUtils.getUserId());
  768. userRecordList.add(ur);
  769. }
  770. if (!userRecordList.isEmpty()){
  771. for (UserRecordOut userRecordOut : userRecordList) {
  772. userRecordMapper.insertSelective(userRecordOut);
  773. }
  774. }
  775. }
  776. @Override
  777. public List<UserRecordOut> selectUserClock(selectUserClockInput in) {
  778. in.setUserId(SecurityUtils.getUserId());
  779. return userRecordMapper.selectUserClock(in);
  780. }
  781. private String getTime(String s) {
  782. return s.replace("外勤","").trim();
  783. }
  784. private Double getHuors(LocalDateTime startTime, LocalDateTime endTime) {
  785. //打卡时间处理
  786. if (startTime.getHour()<=8&&startTime.getMinute()<30){
  787. startTime=startTime.withHour(8);
  788. startTime=startTime.withMinute(30);
  789. }else if (startTime.getHour()>8&&startTime.getMinute()>30){
  790. startTime=startTime.withMinute(startTime.getHour()+1);
  791. startTime=startTime.withMinute(0);
  792. }else if (startTime.getHour()>8&&startTime.getMinute()<30){
  793. startTime=startTime.withMinute(30);
  794. }
  795. if (endTime.getHour()<18 &&endTime.getMinute()<30){
  796. endTime=endTime.withMinute(0);
  797. }else if (endTime.getHour()>=18&&endTime.getMinute()<30){
  798. endTime=endTime.withMinute(0);
  799. }else if (endTime.getHour()>=18&&endTime.getMinute()>30){
  800. endTime=endTime.withMinute(30);
  801. }
  802. Duration duration = Duration.between(startTime, endTime);
  803. long minutes = duration.toMinutes();
  804. long l = minutes / 30;
  805. double l1 = (double) (l / 2);
  806. long l2 = l % 2;
  807. if (l2==1){
  808. l1+=0.5;
  809. }
  810. //在12点之前
  811. if (startTime.getHour()<13&&endTime.getHour()>13&&endTime.getHour()<18){
  812. l1=l1-1.5;
  813. }else if (startTime.getHour()<13&&endTime.getHour()>17){
  814. l1=l1-2;
  815. }else if (startTime.getHour()>=13&&endTime.getHour()>17){
  816. l1=l1-0.5;
  817. }
  818. return l1;
  819. }
  820. @Override
  821. public UserRecordOut UserClockDetails(Long id) {
  822. UserRecord userRecord = userRecordMapper.selectByPrimaryKey(id);
  823. UserRecordOut out=new UserRecordOut();
  824. BeanUtils.copyProperties(userRecord, out);
  825. LocalDate localDate =userRecord.getRecordTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
  826. List<ProjectStaffRecord> projectStaffRecords = projectStaffRecordMapper.selectByDDUidAndTime(out.getDdUserId(), localDate);
  827. out.setList(projectStaffRecords);
  828. return out;
  829. }
  830. @Override
  831. public void updateAllUserClock(Integer type) {
  832. userRecordMapper.updateTypeDuration(SecurityUtils.getUserId(),type);
  833. }
  834. @Override
  835. public void updateUserClockDetails(UserClockDetailsInput in) {
  836. for (ProjectStaffRecord projectStaffRecord : in.getList()) {
  837. projectStaffRecordMapper.updateByPrimaryKeySelective(projectStaffRecord);
  838. }
  839. UserRecord ur =new UserRecord();
  840. ur.setId(in.getId());
  841. ur.setClockStatus(3);
  842. userRecordMapper.updateByPrimaryKeySelective(ur);
  843. }
  844. @Override
  845. public void updateUserRecord(UserRecord in) {
  846. UserRecord ur=new UserRecord();
  847. ur.setId(in.getId());
  848. ur.setCheckDuration(in.getCheckDuration());
  849. ur.setStatus(2);
  850. userRecordMapper.updateByPrimaryKeySelective(ur);
  851. }
  852. @Override
  853. public void userRecordMerge() {
  854. Long userId = SecurityUtils.getUserId();
  855. //合并到打卡表
  856. userRecordMapper.userRecordMerge(userId);
  857. //清楚考勤合并数据
  858. userRecordMapper.deleteByUserId(userId);
  859. }
  860. @Override
  861. public AjaxResult userRecordMergeCheck() {
  862. Long userId = SecurityUtils.getUserId();
  863. int i = userRecordMapper.checkUserRecord(userId,1);
  864. if (i>0){
  865. return AjaxResult.error("当前用户存在缺卡的考勤,请处理后再提交");
  866. }
  867. int x = userRecordMapper.checkClockUserRecord(userId);
  868. if (x>0){
  869. return AjaxResult.error("当前用户存的考勤存在多打卡,请处理后再提交");
  870. }
  871. return AjaxResult.success();
  872. }
  873. }