SysUserServiceImpl.java 35 KB

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