package com.ydtech.modules.esm.service.impl; import com.github.pagehelper.PageHelper; import com.ydtech.constants.SysConstants; import com.ydtech.core.page.HttpResult; import com.ydtech.core.page.PageResult; import com.ydtech.modules.admin.model.SysUser; import com.ydtech.modules.admin.service.SysUserService; import com.ydtech.modules.esm.dao.EsmSalaryCheckMapper; import com.ydtech.modules.esm.dao.EsmSalaryMapper; import com.ydtech.modules.esm.model.EsmSalary; import com.ydtech.modules.esm.model.EsmSalaryCheck; import com.ydtech.modules.esm.service.EsmSalaryService; import com.ydtech.modules.esm.model.vo.EsmSalaryQueryVO; import com.ydtech.modules.esm.model.vo.req.ReqVo; import com.ydtech.modules.esm.model.vo.res.EsmSalaryCheckRes; import com.ydtech.modules.esm.model.vo.res.EsmSalaryRes; import com.ydtech.utils.DateUtil; import com.ydtech.utils.StringUtils; import com.ydtech.utils.excel.ExcelUtils2; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; import java.text.ParseException; import java.util.Date; import java.util.List; /** * @author: shenweidong * @Date: 2021/8/6 17:53 **/ @Slf4j @Service public class EsmSalaryServiceImpl implements EsmSalaryService { @Autowired private EsmSalaryMapper esmSalaryMapper; @Autowired private EsmSalaryCheckMapper esmSalaryCheckMapper; @Autowired private SysUserService sysUserService; /** * @author: shenweidong * @date: 2021/8/6 17:54 **/ @Override @Transactional public HttpResult importSalary(MultipartFile file, String userProp, String userId, String tokemDeptId) { String msg = "导入成功!"; if (StringUtils.isNullOrEmpty(userProp)) { return HttpResult.error("人员合同类型不可为空!"); } List list = null; try { list = ExcelUtils2.importExcel(file, 0, 1, EsmSalary.class); } catch (Exception e) { log.error("数据转换集合异常:" + e.getMessage()); return HttpResult.error("数据转换异常,请检查文件是否与上传类型一致"); } // 总工资 double salaryTotal = 0.00; // 机构代码,只保存2级 tokemDeptId = tokemDeptId.contains("D") ? tokemDeptId.substring(0, tokemDeptId.indexOf("D")) : tokemDeptId; if (list == null || list.isEmpty()) { return HttpResult.error("数据为空,请检查"); } else { Date now = new Date(); String checkId = String.valueOf(now.getTime()); Date payDate = null; String deptId = ""; String oldChcekId = ""; for (int i = 0; i < list.size(); i++) { EsmSalary esmSalary = list.get(i); // 设置发薪日期 String year = esmSalary.getYear();// 获取到年 String month = esmSalary.getMonth(); // 获取到月 String day = esmSalary.getDay(); // 获取到天 if (userProp.equals(SysConstants.B)) { // 非全日制 if (!SysConstants.B.equals(esmSalary.getUserType())) { return HttpResult.error("非全日制员工类型只能为业务员类型【B】"); } if ("1".equals(month) && "15".equals(month)) { return HttpResult.error("非全日制员工的发薪日期只能选择1号或者15号!"); } } else { day = "1"; } // 判断发薪月份 // 获取当前时间的上月月份和上月年份 // String[] lastMonthDay = DateUtil.dayOfLastMonth(new Date()).split("-"); /*if (!lastMonthDay[0].equals(year) || !lastMonthDay[1].equals(month)){ return HttpResult.error("员工编码:" + esmSalary.getUserId() + "的发薪年份(月份)不是有效的上月时间!"); }*/ SysUser sysUser = sysUserService.findByUserId(esmSalary.getUserId()); if (sysUser == null) { return HttpResult.error("第" + (i + 1) + "行员工信息<" + esmSalary.getUserId() + ">不存在"); } /*if (!sysUser.getUsertype().equals(esmSalary.getUserType())){ return HttpResult.error("第" + (i+1) +"行员工<"+esmSalary.getUserId()+">对应的人员类型不是"+ (SysConstants.A.equals(esmSalary.getUserType())? "后线人员":"业务员")); } // 判断权限 if (!SysConstants.DEPT.equals(tokemDeptId)) { if (!esmSalary.getUserId().startsWith(tokemDeptId)) { return HttpResult.error("当前登录账号" + userId + "没有权限导入>>>员工编码:" + esmSalary.getUserId()); } }*/ if (SysConstants.A.equals(userProp)) { if (StringUtils.isNullOrEmpty(year) || StringUtils.isNullOrEmpty(month)) { return HttpResult.error("第" + (i + 1) + "行【全日制 发薪年份/发薪月份】不可为空!"); } } else if (SysConstants.B.equals(userProp)) { if (StringUtils.isNullOrEmpty(year) || StringUtils.isNullOrEmpty(month) || StringUtils.isNullOrEmpty(day)) { return HttpResult.error("第" + (i + 1) + "行【非全日制 发薪年份/发薪月份/发薪日期】不可为空!"); } } // 拼接成YYYY-MM-DD格式 try { payDate = DateUtil.StringToDate(year + "-" + month + (StringUtils.isNullOrEmpty(day) ? "" : "-" + day)); // 设置发薪时间 esmSalary.setPayDate(payDate); } catch (ParseException e) { e.printStackTrace(); return HttpResult.error("第" + (i + 1) + "行【发薪日期】不是有效的日期!"); } // 获取当前员工薪酬数据是否未审核或审核已通过,如果存在返回错误提示 EsmSalary esmSalaryExist = esmSalaryMapper.getByPayDate(esmSalary, userProp); if (esmSalaryExist != null) { if (SysConstants.TO_BE_REVIEW.equals(esmSalaryExist.getReviewStatus())) { return HttpResult.error("员工号:" + esmSalaryExist.getUserId() + "数据已上传过,正在待审核,请检查数据和上传条件"); } else if (SysConstants.SUCCESS_REVIEW.equals(esmSalaryExist.getReviewStatus())) { return HttpResult.error("员工号:" + esmSalaryExist.getUserId() + "数据已上传过,审核已通过,请检查数据和上传条件"); } if (StringUtils.isNullOrEmpty(oldChcekId)) { oldChcekId = esmSalaryExist.getCheckId(); } } // 设置实发工资 esmSalary.setSfgz(String.valueOf(new BigDecimal(esmSalary.getSfgz()).setScale(2, BigDecimal.ROUND_HALF_UP))); // 总实发工资 salaryTotal += Double.parseDouble(StringUtils.isNullOrEmpty(esmSalary.getSfgz()) ? "0.00" : esmSalary.getSfgz()); deptId = esmSalary.getDeptId().length() >= 5 ? (esmSalary.getDeptId().contains("D") ? esmSalary.getDeptId().substring(0, esmSalary.getDeptId().indexOf("D")) : esmSalary.getDeptId().substring(0, 5)) : esmSalary.getDeptId(); // 设置插入表的数据 esmSalary.setCheckId(checkId); esmSalary.setQuality(userProp); esmSalary.setCreateUser(userId); esmSalary.setCreateTime(now); esmSalary.setReviewStatus(SysConstants.NO_SUBMIT_REVIEW); } // 先删后插 esmSalaryMapper.deleteByCheckId(oldChcekId); esmSalaryMapper.inserBatch(list); // 设置审核的数据 EsmSalaryCheck esmSalaryCheck = new EsmSalaryCheck(); esmSalaryCheck.setCheckId(checkId); esmSalaryCheck.setDeptId(deptId); esmSalaryCheck.setQuality(userProp); esmSalaryCheck.setPayDate(payDate); esmSalaryCheck.setPaidInSalaryTotal(String.valueOf(new BigDecimal(salaryTotal).setScale(2, BigDecimal.ROUND_HALF_UP))); esmSalaryCheck.setCreateUser(userId); esmSalaryCheck.setReviewStatus(SysConstants.NO_SUBMIT_REVIEW); // 先删后插 esmSalaryCheckMapper.deleteByPrimaryKey(oldChcekId); esmSalaryCheckMapper.insertSelective(esmSalaryCheck); } return HttpResult.ok("数据导入成功", null); } @Override public HttpResult selectSalary(EsmSalaryQueryVO queryVO, String userId, String tokemDeptId) { if (StringUtils.isNullOrEmpty(queryVO.getPayDate()) || StringUtils.isNullOrEmpty(queryVO.getPayEndDate())) { return HttpResult.error("发薪年月不可为空!"); } // 机构代码,只保存2级 tokemDeptId = tokemDeptId.contains("D") ? tokemDeptId.substring(0, tokemDeptId.indexOf("D")) : tokemDeptId; // 判断权限 if (!SysConstants.DEPT.equals(tokemDeptId)) { if (!queryVO.getSecondCom().startsWith(tokemDeptId)) { queryVO.setSecondCom(tokemDeptId); } } else { } PageHelper.startPage(queryVO.getPageNum(), queryVO.getPageSize()); List list = esmSalaryCheckMapper.select(queryVO); return HttpResult.ok("查询成功", new PageResult<>(list)); } @Override public HttpResult selectSalaryByCheckId(ReqVo vo) { String submitcheckid = vo.getSubmitcheckid(); if (StringUtils.isNullOrEmpty(submitcheckid)) { return HttpResult.error("批次号不可为空!"); } PageHelper.startPage(vo.getPageNum(), vo.getPageSize()); List list = esmSalaryMapper.selectSalaryByCheckId(submitcheckid); return HttpResult.ok("查询成功", new PageResult<>(list)); } /** * 薪酬数据提交审核 * * @param reqVo * @return */ @Transactional @Override public HttpResult submitSalaryByCheckId(ReqVo reqVo) { String submitcheckid = reqVo.getSubmitcheckid(); if (StringUtils.isNullOrEmpty(submitcheckid)) { return HttpResult.error("批次号不可为空!"); } Date date = new Date(); EsmSalary esmSalary = new EsmSalary(); esmSalary.setCheckId(submitcheckid); esmSalary.setReviewStatus(SysConstants.TO_BE_REVIEW); esmSalary.setSubmitDate(date); EsmSalaryCheck esmSalaryCheck = new EsmSalaryCheck(); esmSalaryCheck.setSubmitDate(date); esmSalaryCheck.setReviewStatus(SysConstants.TO_BE_REVIEW); esmSalaryCheck.setCheckId(submitcheckid); // 先查询审核状态,不可二次审核 EsmSalaryCheck resultCheck = esmSalaryCheckMapper.selectByPrimaryKey(submitcheckid); if (SysConstants.SUCCESS_REVIEW.equals(resultCheck.getReviewStatus())) { return HttpResult.error("当前任务已经审核完成,不可再次提交!"); } if (SysConstants.TO_BE_REVIEW.equals(resultCheck.getReviewStatus())) { return HttpResult.error("当前任务已经提交审核,不可再次提交!"); } esmSalaryMapper.updateByPrimaryKeySelective(esmSalary); esmSalaryCheckMapper.updateByPrimaryKeySelective(esmSalaryCheck); return HttpResult.ok("提交审核成功"); } @Transactional @Override public HttpResult reviewSalary(EsmSalaryCheck esmSalaryCheck, String userId, String tokemDeptId) { if (StringUtils.isNullOrEmpty(esmSalaryCheck.getCheckId())) { return HttpResult.error("批次号不可为空!"); } if (StringUtils.isNullOrEmpty(esmSalaryCheck.getReviewStatus())) { return HttpResult.error("审核状态不可为空!"); } Date date = new Date(); EsmSalary esmSalary = new EsmSalary(); esmSalary.setCheckId(esmSalaryCheck.getCheckId()); esmSalary.setReviewStatus(esmSalaryCheck.getReviewStatus()); esmSalaryCheck.setReviewer(userId); esmSalaryCheck.setReviewTime(date); // 先查询审核状态,不可二次审核 EsmSalaryCheck resultCheck = esmSalaryCheckMapper.selectByPrimaryKey(esmSalaryCheck.getCheckId()); if (SysConstants.SUCCESS_REVIEW.equals(resultCheck.getReviewStatus())) { return HttpResult.error("当前任务已经审核完成,不可再次提交!"); } if (esmSalary.getReviewStatus().equals(resultCheck.getReviewStatus())) { return HttpResult.error("当前任务已经是" + (SysConstants.TO_BE_REVIEW.equals(esmSalary.getReviewStatus()) ? "待审核" : "退回修改 ") + ",不可再次提交!"); } esmSalaryMapper.updateByPrimaryKeySelective(esmSalary); esmSalaryCheckMapper.updateByPrimaryKeySelective(esmSalaryCheck); return HttpResult.ok("审核成功"); } }