SysUserServiceImpl.java 38 KB

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