EsmSalaryServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package com.ydtech.modules.esm.service.impl;
  2. import com.github.pagehelper.PageHelper;
  3. import com.ydtech.constants.SysConstants;
  4. import com.ydtech.core.page.HttpResult;
  5. import com.ydtech.core.page.PageResult;
  6. import com.ydtech.modules.admin.model.SysUser;
  7. import com.ydtech.modules.admin.service.SysUserService;
  8. import com.ydtech.modules.esm.dao.EsmSalaryCheckMapper;
  9. import com.ydtech.modules.esm.dao.EsmSalaryMapper;
  10. import com.ydtech.modules.esm.model.EsmSalary;
  11. import com.ydtech.modules.esm.model.EsmSalaryCheck;
  12. import com.ydtech.modules.esm.service.EsmSalaryService;
  13. import com.ydtech.modules.esm.model.vo.EsmSalaryQueryVO;
  14. import com.ydtech.modules.esm.model.vo.req.ReqVo;
  15. import com.ydtech.modules.esm.model.vo.res.EsmSalaryCheckRes;
  16. import com.ydtech.modules.esm.model.vo.res.EsmSalaryRes;
  17. import com.ydtech.utils.DateUtil;
  18. import com.ydtech.utils.StringUtils;
  19. import com.ydtech.utils.excel.ExcelUtils2;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.transaction.annotation.Transactional;
  24. import org.springframework.web.multipart.MultipartFile;
  25. import java.math.BigDecimal;
  26. import java.text.ParseException;
  27. import java.util.Date;
  28. import java.util.List;
  29. /**
  30. * @author: shenweidong
  31. * @Date: 2021/8/6 17:53
  32. **/
  33. @Slf4j
  34. @Service
  35. public class EsmSalaryServiceImpl implements EsmSalaryService {
  36. @Autowired
  37. private EsmSalaryMapper esmSalaryMapper;
  38. @Autowired
  39. private EsmSalaryCheckMapper esmSalaryCheckMapper;
  40. @Autowired
  41. private SysUserService sysUserService;
  42. /**
  43. * @author: shenweidong
  44. * @date: 2021/8/6 17:54
  45. **/
  46. @Override
  47. @Transactional
  48. public HttpResult importSalary(MultipartFile file, String userProp, String userId, String tokemDeptId) {
  49. String msg = "导入成功!";
  50. if (StringUtils.isNullOrEmpty(userProp)) {
  51. return HttpResult.error("人员合同类型不可为空!");
  52. }
  53. List<EsmSalary> list = null;
  54. try {
  55. list = ExcelUtils2.importExcel(file, 0, 1, EsmSalary.class);
  56. } catch (Exception e) {
  57. log.error("数据转换集合异常:" + e.getMessage());
  58. return HttpResult.error("数据转换异常,请检查文件是否与上传类型一致");
  59. }
  60. // 总工资
  61. double salaryTotal = 0.00;
  62. // 机构代码,只保存2级
  63. tokemDeptId = tokemDeptId.contains("D") ? tokemDeptId.substring(0, tokemDeptId.indexOf("D")) : tokemDeptId;
  64. if (list == null || list.isEmpty()) {
  65. return HttpResult.error("数据为空,请检查");
  66. } else {
  67. Date now = new Date();
  68. String checkId = String.valueOf(now.getTime());
  69. Date payDate = null;
  70. String deptId = "";
  71. String oldChcekId = "";
  72. for (int i = 0; i < list.size(); i++) {
  73. EsmSalary esmSalary = list.get(i);
  74. // 设置发薪日期
  75. String year = esmSalary.getYear();// 获取到年
  76. String month = esmSalary.getMonth(); // 获取到月
  77. String day = esmSalary.getDay(); // 获取到天
  78. if (userProp.equals(SysConstants.B)) { // 非全日制
  79. if (!SysConstants.B.equals(esmSalary.getUserType())) {
  80. return HttpResult.error("非全日制员工类型只能为业务员类型【B】");
  81. }
  82. if ("1".equals(month) && "15".equals(month)) {
  83. return HttpResult.error("非全日制员工的发薪日期只能选择1号或者15号!");
  84. }
  85. } else {
  86. day = "1";
  87. }
  88. // 判断发薪月份
  89. // 获取当前时间的上月月份和上月年份
  90. // String[] lastMonthDay = DateUtil.dayOfLastMonth(new Date()).split("-");
  91. /*if (!lastMonthDay[0].equals(year) || !lastMonthDay[1].equals(month)){
  92. return HttpResult.error("员工编码:" + esmSalary.getUserId() + "的发薪年份(月份)不是有效的上月时间!");
  93. }*/
  94. SysUser sysUser = sysUserService.findByUserId(esmSalary.getUserId());
  95. if (sysUser == null) {
  96. return HttpResult.error("第" + (i + 1) + "行员工信息<" + esmSalary.getUserId() + ">不存在");
  97. }
  98. /*if (!sysUser.getUsertype().equals(esmSalary.getUserType())){
  99. return HttpResult.error("第" + (i+1) +"行员工<"+esmSalary.getUserId()+">对应的人员类型不是"+
  100. (SysConstants.A.equals(esmSalary.getUserType())? "后线人员":"业务员"));
  101. }
  102. // 判断权限
  103. if (!SysConstants.DEPT.equals(tokemDeptId)) {
  104. if (!esmSalary.getUserId().startsWith(tokemDeptId)) {
  105. return HttpResult.error("当前登录账号" + userId + "没有权限导入>>>员工编码:" + esmSalary.getUserId());
  106. }
  107. }*/
  108. if (SysConstants.A.equals(userProp)) {
  109. if (StringUtils.isNullOrEmpty(year) || StringUtils.isNullOrEmpty(month)) {
  110. return HttpResult.error("第" + (i + 1) + "行【全日制 发薪年份/发薪月份】不可为空!");
  111. }
  112. } else if (SysConstants.B.equals(userProp)) {
  113. if (StringUtils.isNullOrEmpty(year) || StringUtils.isNullOrEmpty(month) || StringUtils.isNullOrEmpty(day)) {
  114. return HttpResult.error("第" + (i + 1) + "行【非全日制 发薪年份/发薪月份/发薪日期】不可为空!");
  115. }
  116. }
  117. // 拼接成YYYY-MM-DD格式
  118. try {
  119. payDate = DateUtil.StringToDate(year + "-" + month + (StringUtils.isNullOrEmpty(day) ? "" : "-" + day));
  120. // 设置发薪时间
  121. esmSalary.setPayDate(payDate);
  122. } catch (ParseException e) {
  123. e.printStackTrace();
  124. return HttpResult.error("第" + (i + 1) + "行【发薪日期】不是有效的日期!");
  125. }
  126. // 获取当前员工薪酬数据是否未审核或审核已通过,如果存在返回错误提示
  127. EsmSalary esmSalaryExist = esmSalaryMapper.getByPayDate(esmSalary, userProp);
  128. if (esmSalaryExist != null) {
  129. if (SysConstants.TO_BE_REVIEW.equals(esmSalaryExist.getReviewStatus())) {
  130. return HttpResult.error("员工号:" + esmSalaryExist.getUserId() + "数据已上传过,正在待审核,请检查数据和上传条件");
  131. } else if (SysConstants.SUCCESS_REVIEW.equals(esmSalaryExist.getReviewStatus())) {
  132. return HttpResult.error("员工号:" + esmSalaryExist.getUserId() + "数据已上传过,审核已通过,请检查数据和上传条件");
  133. }
  134. if (StringUtils.isNullOrEmpty(oldChcekId)) {
  135. oldChcekId = esmSalaryExist.getCheckId();
  136. }
  137. }
  138. // 设置实发工资
  139. esmSalary.setSfgz(String.valueOf(new BigDecimal(esmSalary.getSfgz()).setScale(2, BigDecimal.ROUND_HALF_UP)));
  140. // 总实发工资
  141. salaryTotal += Double.parseDouble(StringUtils.isNullOrEmpty(esmSalary.getSfgz()) ? "0.00" : esmSalary.getSfgz());
  142. deptId = esmSalary.getDeptId().length() >= 5 ? (esmSalary.getDeptId().contains("D") ? esmSalary.getDeptId().substring(0, esmSalary.getDeptId().indexOf("D")) : esmSalary.getDeptId().substring(0, 5)) : esmSalary.getDeptId();
  143. // 设置插入表的数据
  144. esmSalary.setCheckId(checkId);
  145. esmSalary.setQuality(userProp);
  146. esmSalary.setCreateUser(userId);
  147. esmSalary.setCreateTime(now);
  148. esmSalary.setReviewStatus(SysConstants.NO_SUBMIT_REVIEW);
  149. }
  150. // 先删后插
  151. esmSalaryMapper.deleteByCheckId(oldChcekId);
  152. esmSalaryMapper.inserBatch(list);
  153. // 设置审核的数据
  154. EsmSalaryCheck esmSalaryCheck = new EsmSalaryCheck();
  155. esmSalaryCheck.setCheckId(checkId);
  156. esmSalaryCheck.setDeptId(deptId);
  157. esmSalaryCheck.setQuality(userProp);
  158. esmSalaryCheck.setPayDate(payDate);
  159. esmSalaryCheck.setPaidInSalaryTotal(String.valueOf(new BigDecimal(salaryTotal).setScale(2, BigDecimal.ROUND_HALF_UP)));
  160. esmSalaryCheck.setCreateUser(userId);
  161. esmSalaryCheck.setReviewStatus(SysConstants.NO_SUBMIT_REVIEW);
  162. // 先删后插
  163. esmSalaryCheckMapper.deleteByPrimaryKey(oldChcekId);
  164. esmSalaryCheckMapper.insertSelective(esmSalaryCheck);
  165. }
  166. return HttpResult.ok("数据导入成功", null);
  167. }
  168. @Override
  169. public HttpResult selectSalary(EsmSalaryQueryVO queryVO, String userId, String tokemDeptId) {
  170. if (StringUtils.isNullOrEmpty(queryVO.getPayDate()) || StringUtils.isNullOrEmpty(queryVO.getPayEndDate())) {
  171. return HttpResult.error("发薪年月不可为空!");
  172. }
  173. // 机构代码,只保存2级
  174. tokemDeptId = tokemDeptId.contains("D") ? tokemDeptId.substring(0, tokemDeptId.indexOf("D")) : tokemDeptId;
  175. // 判断权限
  176. if (!SysConstants.DEPT.equals(tokemDeptId)) {
  177. if (!queryVO.getSecondCom().startsWith(tokemDeptId)) {
  178. queryVO.setSecondCom(tokemDeptId);
  179. }
  180. } else {
  181. }
  182. PageHelper.startPage(queryVO.getPageNum(), queryVO.getPageSize());
  183. List<EsmSalaryCheckRes> list = esmSalaryCheckMapper.select(queryVO);
  184. return HttpResult.ok("查询成功", new PageResult<>(list));
  185. }
  186. @Override
  187. public HttpResult selectSalaryByCheckId(ReqVo vo) {
  188. String submitcheckid = vo.getSubmitcheckid();
  189. if (StringUtils.isNullOrEmpty(submitcheckid)) {
  190. return HttpResult.error("批次号不可为空!");
  191. }
  192. PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
  193. List<EsmSalaryRes> list = esmSalaryMapper.selectSalaryByCheckId(submitcheckid);
  194. return HttpResult.ok("查询成功", new PageResult<>(list));
  195. }
  196. /**
  197. * 薪酬数据提交审核
  198. *
  199. * @param reqVo
  200. * @return
  201. */
  202. @Transactional
  203. @Override
  204. public HttpResult submitSalaryByCheckId(ReqVo reqVo) {
  205. String submitcheckid = reqVo.getSubmitcheckid();
  206. if (StringUtils.isNullOrEmpty(submitcheckid)) {
  207. return HttpResult.error("批次号不可为空!");
  208. }
  209. Date date = new Date();
  210. EsmSalary esmSalary = new EsmSalary();
  211. esmSalary.setCheckId(submitcheckid);
  212. esmSalary.setReviewStatus(SysConstants.TO_BE_REVIEW);
  213. esmSalary.setSubmitDate(date);
  214. EsmSalaryCheck esmSalaryCheck = new EsmSalaryCheck();
  215. esmSalaryCheck.setSubmitDate(date);
  216. esmSalaryCheck.setReviewStatus(SysConstants.TO_BE_REVIEW);
  217. esmSalaryCheck.setCheckId(submitcheckid);
  218. // 先查询审核状态,不可二次审核
  219. EsmSalaryCheck resultCheck = esmSalaryCheckMapper.selectByPrimaryKey(submitcheckid);
  220. if (SysConstants.SUCCESS_REVIEW.equals(resultCheck.getReviewStatus())) {
  221. return HttpResult.error("当前任务已经审核完成,不可再次提交!");
  222. }
  223. if (SysConstants.TO_BE_REVIEW.equals(resultCheck.getReviewStatus())) {
  224. return HttpResult.error("当前任务已经提交审核,不可再次提交!");
  225. }
  226. esmSalaryMapper.updateByPrimaryKeySelective(esmSalary);
  227. esmSalaryCheckMapper.updateByPrimaryKeySelective(esmSalaryCheck);
  228. return HttpResult.ok("提交审核成功");
  229. }
  230. @Transactional
  231. @Override
  232. public HttpResult reviewSalary(EsmSalaryCheck esmSalaryCheck, String userId, String tokemDeptId) {
  233. if (StringUtils.isNullOrEmpty(esmSalaryCheck.getCheckId())) {
  234. return HttpResult.error("批次号不可为空!");
  235. }
  236. if (StringUtils.isNullOrEmpty(esmSalaryCheck.getReviewStatus())) {
  237. return HttpResult.error("审核状态不可为空!");
  238. }
  239. Date date = new Date();
  240. EsmSalary esmSalary = new EsmSalary();
  241. esmSalary.setCheckId(esmSalaryCheck.getCheckId());
  242. esmSalary.setReviewStatus(esmSalaryCheck.getReviewStatus());
  243. esmSalaryCheck.setReviewer(userId);
  244. esmSalaryCheck.setReviewTime(date);
  245. // 先查询审核状态,不可二次审核
  246. EsmSalaryCheck resultCheck = esmSalaryCheckMapper.selectByPrimaryKey(esmSalaryCheck.getCheckId());
  247. if (SysConstants.SUCCESS_REVIEW.equals(resultCheck.getReviewStatus())) {
  248. return HttpResult.error("当前任务已经审核完成,不可再次提交!");
  249. }
  250. if (esmSalary.getReviewStatus().equals(resultCheck.getReviewStatus())) {
  251. return HttpResult.error("当前任务已经是" + (SysConstants.TO_BE_REVIEW.equals(esmSalary.getReviewStatus()) ? "待审核" : "退回修改 ") + ",不可再次提交!");
  252. }
  253. esmSalaryMapper.updateByPrimaryKeySelective(esmSalary);
  254. esmSalaryCheckMapper.updateByPrimaryKeySelective(esmSalaryCheck);
  255. return HttpResult.ok("审核成功");
  256. }
  257. }