From f23c489eeba7a210473a17bb7f8fd550b02274f8 Mon Sep 17 00:00:00 2001 From: hshansha Date: Thu, 5 Jun 2025 15:02:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=96=AA=E8=B5=84=E7=94=9F=E6=88=90=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PayDayWorkHoursController.java | 4 +- .../controller/PaySalaryReportController.java | 12 + .../java/com/ruoyi/pay/enums/PayCalcType.java | 27 ++ .../pay/mapper/PayBaohuoEmployeeMapper.java | 4 + .../pay/mapper/PayButieEmplyeeMapper.java | 3 + .../pay/mapper/PayDayWorkHoursMapper.java | 4 +- .../pay/mapper/PayEmployeeInfoMapper.java | 3 + .../mapper/PayWorkOrderEmployeeMapper.java | 4 + .../pay/service/IPayDayWorkHoursService.java | 4 +- .../pay/service/IPaySalaryReportService.java | 3 + .../impl/PayDayWorkHoursServiceImpl.java | 14 +- .../impl/PaySalaryReportServiceImpl.java | 359 +++++++++++++++++- .../mapper/pay/PayBaohuoEmployeeMapper.xml | 41 ++ .../mapper/pay/PayWorkOrderEmployeeMapper.xml | 52 +++ 14 files changed, 516 insertions(+), 18 deletions(-) create mode 100644 ruoyi-pay/src/main/java/com/ruoyi/pay/enums/PayCalcType.java create mode 100644 ruoyi-pay/src/main/resources/mapper/pay/PayBaohuoEmployeeMapper.xml create mode 100644 ruoyi-pay/src/main/resources/mapper/pay/PayWorkOrderEmployeeMapper.xml diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayDayWorkHoursController.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayDayWorkHoursController.java index da6338f..5598201 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayDayWorkHoursController.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayDayWorkHoursController.java @@ -49,7 +49,7 @@ public class PayDayWorkHoursController extends BaseController { */ @SaCheckPermission("pay:dayWorkHours:list") @GetMapping("/list") - public TableDataInfo list(PayDayWorkHoursBo bo, PageQuery pageQuery) { + public TableDataInfo list(PayDayWorkHoursBo bo, PageQuery pageQuery) { return iPayDayWorkHoursService.queryPageList2(bo, pageQuery); } @@ -101,7 +101,7 @@ public class PayDayWorkHoursController extends BaseController { */ @SaCheckPermission("pay:dayWorkHours:query") @GetMapping("/{id}") - public R getInfo(@NotNull(message = "主键不能为空") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { return R.ok(iPayDayWorkHoursService.queryById(id)); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PaySalaryReportController.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PaySalaryReportController.java index c4f7852..5dc49a8 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PaySalaryReportController.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PaySalaryReportController.java @@ -89,6 +89,18 @@ public class PaySalaryReportController extends BaseController { public R add(@Validated(AddGroup.class) @RequestBody PaySalaryReportBo bo) { return toAjax(iPaySalaryReportService.insertByBo(bo)); } + /** + * 新增工资明细总 + */ + @SaCheckPermission("pay:salaryReport:add") + @Log(title = "工资明细总", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/generate") + public R generateSalaryReport(@RequestParam(name = "date") String date, + @RequestParam(name = "updateSupport")boolean updateSupport, + @RequestParam(name = "tenantId")Long tenantId) { + return iPaySalaryReportService.generateSalaryReport(date,updateSupport,tenantId); + } /** * 修改工资明细总 diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/enums/PayCalcType.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/enums/PayCalcType.java new file mode 100644 index 0000000..a9001ea --- /dev/null +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/enums/PayCalcType.java @@ -0,0 +1,27 @@ +package com.ruoyi.pay.enums; + + +/** + * 员工工资计算类型 + */ +public enum PayCalcType { + TYPE1("0", "日薪"), TYPE2("1", "月薪"),TYPE3("2", "喷涂按小时数"), TYPE4("3", "外贸按小时数"), TYPE5("4", "包月"); + + PayCalcType(String value, String text){ + this.value = value; + this.text = text; + } + + + private String value; + + private String text; + + public String getValue() { + return value; + } + + public String getText() { + return text; + } +} diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayBaohuoEmployeeMapper.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayBaohuoEmployeeMapper.java index 1b6df2f..202c7c1 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayBaohuoEmployeeMapper.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayBaohuoEmployeeMapper.java @@ -1,9 +1,12 @@ package com.ruoyi.pay.mapper; import com.ruoyi.pay.domain.PayBaohuoEmployee; +import com.ruoyi.pay.domain.bo.PayBaohuoEmployeeBo; import com.ruoyi.pay.domain.vo.PayBaohuoEmployeeVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; +import java.util.List; + /** * 包活工单员工关联Mapper接口 * @@ -12,4 +15,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus; */ public interface PayBaohuoEmployeeMapper extends BaseMapperPlus { + List selectSgrBaohuoEmployeeList1(PayBaohuoEmployeeBo bhEmployee); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayButieEmplyeeMapper.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayButieEmplyeeMapper.java index c224746..274c196 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayButieEmplyeeMapper.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayButieEmplyeeMapper.java @@ -4,6 +4,7 @@ import com.ruoyi.pay.domain.PayButieEmplyee; import com.ruoyi.pay.domain.vo.PayButieEmplyeeVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.math.BigDecimal; @@ -18,4 +19,6 @@ public interface PayButieEmplyeeMapper extends BaseMapperPlus selectPayDayWorkHoursList2(PayDayWorkHoursQuery sgrDayWorkHoursQuery); - Page selectVoPage2(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper ew); + Page selectVoPage2(@Param("page") Page page, @Param(Constants.WRAPPER) QueryWrapper ew); - PayDayWorkHoursVo selectDetailById(Long id); + PayDayWorkHoursQuery selectDetailById(Long id); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayEmployeeInfoMapper.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayEmployeeInfoMapper.java index 408b5d3..3c7b42e 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayEmployeeInfoMapper.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayEmployeeInfoMapper.java @@ -23,4 +23,7 @@ public interface PayEmployeeInfoMapper extends BaseMapperPlus getSalesmanList(@Param("tenantId") Long tenantId); PayEmployeeInfo selectSgrEmployeeInfoByIdHasDel(Long id); + + @Select("select dept_name from sys_dept where dept_id = #{deptId}") + String selectDeptNameByDeptNo(Long deptId); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayWorkOrderEmployeeMapper.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayWorkOrderEmployeeMapper.java index 8631a9d..c138462 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayWorkOrderEmployeeMapper.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayWorkOrderEmployeeMapper.java @@ -1,9 +1,12 @@ package com.ruoyi.pay.mapper; import com.ruoyi.pay.domain.PayWorkOrderEmployee; +import com.ruoyi.pay.domain.bo.PayWorkOrderEmployeeBo; import com.ruoyi.pay.domain.vo.PayWorkOrderEmployeeVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; +import java.util.List; + /** * 工单和员工联系Mapper接口 * @@ -12,4 +15,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus; */ public interface PayWorkOrderEmployeeMapper extends BaseMapperPlus { + List selectPayWorkOrderEmployeeList1(PayWorkOrderEmployeeBo woEmployee); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayDayWorkHoursService.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayDayWorkHoursService.java index fa13d38..a1078f5 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayDayWorkHoursService.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayDayWorkHoursService.java @@ -23,7 +23,7 @@ public interface IPayDayWorkHoursService { /** * 查询日工工时 */ - PayDayWorkHoursVo queryById(Long id); + PayDayWorkHoursQuery queryById(Long id); /** * 查询日工工时列表 @@ -52,5 +52,5 @@ public interface IPayDayWorkHoursService { public List selectPayDayWorkHoursList2(PayDayWorkHoursQuery sgrDayWorkHoursQuery); - TableDataInfo queryPageList2(PayDayWorkHoursBo bo, PageQuery pageQuery); + TableDataInfo queryPageList2(PayDayWorkHoursBo bo, PageQuery pageQuery); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPaySalaryReportService.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPaySalaryReportService.java index 50c48eb..b006a77 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPaySalaryReportService.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPaySalaryReportService.java @@ -1,5 +1,6 @@ package com.ruoyi.pay.service; +import com.ruoyi.common.core.domain.R; import com.ruoyi.pay.domain.PaySalaryReport; import com.ruoyi.pay.domain.vo.PaySalaryReportVo; import com.ruoyi.pay.domain.bo.PaySalaryReportBo; @@ -55,4 +56,6 @@ public interface IPaySalaryReportService { TableDataInfo queryLastMonthReport(Long tenantId, PageQuery pageQuery); void export(HttpServletRequest request, HttpServletResponse response, List list); + + R generateSalaryReport(String date, boolean updateSupport, Long tenantId); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayDayWorkHoursServiceImpl.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayDayWorkHoursServiceImpl.java index 0973b02..42e16ce 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayDayWorkHoursServiceImpl.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayDayWorkHoursServiceImpl.java @@ -50,7 +50,7 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService { * 查询日工工时 */ @Override - public PayDayWorkHoursVo queryById(Long id){ + public PayDayWorkHoursQuery queryById(Long id){ return baseMapper.selectDetailById(id); } @@ -67,9 +67,9 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService { * 查询日工工时列表 */ @Override - public TableDataInfo queryPageList2(PayDayWorkHoursBo bo, PageQuery pageQuery) { + public TableDataInfo queryPageList2(PayDayWorkHoursBo bo, PageQuery pageQuery) { QueryWrapper lqw = buildQueryWrapper2(bo); - Page result = baseMapper.selectVoPage2(pageQuery.build(), lqw); + Page result = baseMapper.selectVoPage2(pageQuery.build(), lqw); return TableDataInfo.build(result); } @@ -117,7 +117,7 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService { public R insertByBo(PayDayWorkHoursQuery2 payDayWorkHoursQuery2) { //先拆分员工 然后每个员工信息存储到SgrDayWorkHoursQuery集合中 List querys = new ArrayList<>(); - if(payDayWorkHoursQuery2.getEmpInfos()!=null&&payDayWorkHoursQuery2.getEmpInfos().size()>0){ + if(payDayWorkHoursQuery2.getEmpInfos()==null||payDayWorkHoursQuery2.getEmpInfos().size()<=0){ return R.fail("添加工时的员工为空!"); } for(PayDayWorkEmps emp :payDayWorkHoursQuery2.getEmpInfos()){ @@ -129,6 +129,7 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService { payDayWorkHoursQuery.setDwHoursContrasts(payDayWorkHoursQuery2.getDwHoursContrasts()); payDayWorkHoursQuery.setDwYearMonth(payDayWorkHoursQuery2.getDwYearMonth()); payDayWorkHoursQuery.setDate(payDayWorkHoursQuery2.getDate()); + payDayWorkHoursQuery.setTenantId(payDayWorkHoursQuery2.getTenantId()); querys.add(payDayWorkHoursQuery); } //验证每个员工信息是否符合添加条件 不符合则提示退出 @@ -172,6 +173,7 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService { List sgrDwHoursContrasts = sgrDayWorkHoursQuery.getDwHoursContrasts(); sgrDwHoursContrasts.parallelStream().forEachOrdered(sgrDwHoursContrast -> { sgrDwHoursContrast.setDwHoursId(payDayWorkHour.getId()); + sgrDwHoursContrast.setTenantId(payDayWorkHoursQuery2.getTenantId()); if (sgrDwHoursContrast.getIsHelper() == 0) {//当不是帮工时 直接存员工的部门 sgrDwHoursContrast.setDeptId(sgrDayWorkHoursQuery.getDeptId()); sgrDwHoursContrast.setDeptName(sgrDayWorkHoursQuery.getDeptName()); @@ -220,7 +222,8 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService { //保存工时信息 sgrDayWorkHoursQuery.setDwYearMonth(getYearMonth(sgrDayWorkHoursQuery)); PayDayWorkHours payDayWorkHour = BeanUtil.toBean(sgrDayWorkHoursQuery, PayDayWorkHours.class); - int result = baseMapper.insert(payDayWorkHour); + // int result = baseMapper.insert(payDayWorkHour); + int result = baseMapper.updateById(payDayWorkHour); //存员工当日工作时间段 if (result > 0) { //采用先删除对应的时间段,然后重新添加的方式 @@ -232,6 +235,7 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService { List sgrDwHoursContrasts = sgrDayWorkHoursQuery.getDwHoursContrasts(); sgrDwHoursContrasts.parallelStream().forEachOrdered(sgrDwHoursContrast -> { sgrDwHoursContrast.setDwHoursId(payDayWorkHour.getId()); + sgrDwHoursContrast.setTenantId(sgrDayWorkHoursQuery.getTenantId()); if (sgrDwHoursContrast.getIsHelper() == 0) {//当不是帮工时 直接存员工的部门 sgrDwHoursContrast.setDeptId(sgrDayWorkHoursQuery.getDeptId()); sgrDwHoursContrast.setDeptName(sgrDayWorkHoursQuery.getDeptName()); diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PaySalaryReportServiceImpl.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PaySalaryReportServiceImpl.java index 800f02b..bda7a37 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PaySalaryReportServiceImpl.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PaySalaryReportServiceImpl.java @@ -4,27 +4,32 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.service.DictService; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.ruoyi.pay.domain.PayEmployeeInfo; -import com.ruoyi.pay.domain.vo.ButieMoneyAndTypes; -import com.ruoyi.pay.mapper.PayEmployeeInfoMapper; +import com.ruoyi.pay.domain.*; +import com.ruoyi.pay.domain.bo.*; +import com.ruoyi.pay.domain.vo.*; +import com.ruoyi.pay.enums.PayCalcType; +import com.ruoyi.pay.mapper.*; import com.ruoyi.pay.util.SalaryExportUtil; +import com.ruoyi.system.service.ISysDictDataService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import com.ruoyi.pay.domain.bo.PaySalaryReportBo; -import com.ruoyi.pay.domain.vo.PaySalaryReportVo; -import com.ruoyi.pay.domain.PaySalaryReport; -import com.ruoyi.pay.mapper.PaySalaryReportMapper; import com.ruoyi.pay.service.IPaySalaryReportService; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,40 @@ public class PaySalaryReportServiceImpl implements IPaySalaryReportService { private final PaySalaryReportMapper baseMapper; private final PayEmployeeInfoMapper payEmployeeInfoMapper; + private final DictService dictService; + @Resource + private PayBaohuoWorktimeMapper payBaohuoWorktimeMapper; + @Resource + private PayBaohuoWorktimeServiceImpl payBaohuoWorktimeService; + @Resource + private PayBaohuoEmployeeMapper sgrBaohuoEmployeeMapper; + @Resource + private PayButieEmplyeeMapper sgrButieEmplyeeMapper; + @Resource + private PayButieServiceImpl butieService; + @Resource + private PayWorkOrderEmployeeMapper sgrWorkOrderEmployeeMapper; + @Resource + private PayWorkTimeMapper sgrWorkTimeMapper; + @Resource + private PayWorkTimeServiceImpl payWorkTimeService; + @Resource + private PayRequireAttendanceReportMapper sgrRequireAttendanceReportMapper; + @Resource + private PayRequireAttendanceReportServiceImpl payRequireAttendanceReportService; + @Resource + private PayDayWorkHoursMapper sgrDayWorkHoursMapper; + @Resource + private PayDayWorkHoursServiceImpl payDayWorkHoursService; + @Resource + private PayDwHoursContrastMapper sgrDwHoursContrastMapper; + @Resource + private PayEmployeeInfoServiceImpl employeeInfoService; + @Resource + private PayEmployeeInfoMapper employeeInfoMapper; + @Resource + private PaySalaryReportMapper sgrSalaryReportMapper; + /** * 查询工资明细总 @@ -279,4 +318,310 @@ public class PaySalaryReportServiceImpl implements IPaySalaryReportService { SalaryExportUtil.exportExcel("工资明细表", column, data, request, response); } + + @Override + @Transactional + public R generateSalaryReport(String date, boolean updateSupport, Long tenantId) { + Integer successNums = 0; + Integer failedNums = 0; + StringBuffer successMsg = new StringBuffer(); + StringBuffer failedMsg = new StringBuffer(); + String year = date.split("-")[0]; + String month = date.split("-")[1]; + Date yearMonth; + try { + yearMonth = new SimpleDateFormat("yyyy-MM").parse(date); + } catch (ParseException e) { + e.printStackTrace(); + return R.fail("系统日期格式转换错误"); + } + PaySalaryReportBo re = new PaySalaryReportBo(); + re.setTenantId(tenantId); + re.setYear(year); + re.setMonth(month); + List sgrSalaryReports = this.queryList(re); + if (sgrSalaryReports != null && sgrSalaryReports.size() > 0) { + if (updateSupport) { + //已有本月数据 做更新操作 + List collect = sgrSalaryReports.stream().map(PaySalaryReportVo::getId).collect(Collectors.toList()); + baseMapper.deleteBatchIds(collect); + } else { + return R.ok("如需更新生成报表,请勾选更新"); + } + } + + //1.拿到所有员工信息 + //测试单个员工 +/* SgrEmployeeInfo emp =new SgrEmployeeInfo(); + emp.setName("卢志伟"); + List employeeInfoList = sgrEmployeeInfoMapper.selectSgrEmployeeInfoList(emp);*/ + PayEmployeeInfoBo employeeInfoBo = new PayEmployeeInfoBo(); + employeeInfoBo.setTenantId(tenantId); + List employeeInfoList = employeeInfoService.queryList(employeeInfoBo); + + //获取所有补贴类型 + PayButieBo butiebo = new PayButieBo(); + List sgrButies = butieService.queryList(butiebo); + for (PayEmployeeInfoVo employeeInfo : employeeInfoList) { + if (employeeInfo.getPayCalcType() == null) { + failedNums++; + failedMsg.append("
" + employeeInfo.getName() + ":的工资计算类型不能为空"); + continue; + } + if (employeeInfo.getBasicSalary() == null) { + failedNums++; + failedMsg.append("
" + employeeInfo.getName() + ":的基本工资信息不能为空"); + continue; + } + PaySalaryReport sgrSalaryReport = new PaySalaryReport(); + String empName = employeeInfo.getName(); + sgrSalaryReport.setEmployeeId(employeeInfo.getId()); + sgrSalaryReport.setEmployeeName(employeeInfo.getName()); + sgrSalaryReport.setYear(year); + sgrSalaryReport.setMonth(month); + sgrSalaryReport.setBasicSalary(employeeInfo.getBasicSalary()); + sgrSalaryReport.setDeptId(employeeInfo.getDeptId()); + //当type类型为包月时只能在此保存部门名称 + String DeptName = employeeInfoMapper.selectDeptNameByDeptNo(employeeInfo.getDeptId()); + sgrSalaryReport.setDeptName(DeptName); + + //1.根据员工信息获取应出勤信息、包活及流程卡信息、补贴信息 + //1.1获取应出勤信息 + PayRequireAttendanceReportBo attendanceReport1 = new PayRequireAttendanceReportBo(); + attendanceReport1.setTenantId(tenantId); + attendanceReport1.setEmpName(empName); + attendanceReport1.setYear(year); + attendanceReport1.setMonth(month); + PayRequireAttendanceReportVo attendanceReport =BeanUtil.toBean(attendanceReport1,PayRequireAttendanceReportVo.class); + BigDecimal yingchuqintianshu = BigDecimal.ZERO; + List attendanceReports = payRequireAttendanceReportService.queryList(attendanceReport1); + if (attendanceReports != null && attendanceReports.size() > 0) { + attendanceReport = attendanceReports.get(0); + if (attendanceReport.getRequireDays().equals(0L)) { + failedNums++; + failedMsg.append("
错误:" + employeeInfo.getName() + "的应出勤天数为0"); + continue; + } + if (attendanceReport.getLeaveDays() == null) { + attendanceReport.setLeaveDays(new BigDecimal("0")); + } + yingchuqintianshu = new BigDecimal(attendanceReport.getRequireDays()); + sgrSalaryReport.setActuallyDays(attendanceReport.getAvtiveDays()); + sgrSalaryReport.setActuallyHours(attendanceReport.getAttendanceHours()); + sgrSalaryReport.setOvertimeWorkHours(attendanceReport.getOvertimeHours()); + sgrSalaryReport.setNote(attendanceReport.getRemark()); + } else if (!employeeInfo.getPayCalcType().equals(PayCalcType.TYPE5.getValue())) { + failedNums++; + failedMsg.append("
未找到:" + employeeInfo.getName() + "的应出勤信息"); + continue; + // return AjaxResult.error("未找到"+employeeInfo.getName()+"的应出勤信息"); + } + //1.2获取员工日工工时信息 + PayDayWorkHoursQuery sgrdayworkHoursQuery = new PayDayWorkHoursQuery(); + BigDecimal rigongbanggong = BigDecimal.ZERO; //日工帮工小时数 + sgrdayworkHoursQuery.setDwYearMonth(date); + sgrdayworkHoursQuery.setEmpName(employeeInfo.getName()); + List sgrDayWorkHoursQueryList = payDayWorkHoursService.selectPayDayWorkHoursList2(sgrdayworkHoursQuery); + if (sgrDayWorkHoursQueryList != null && sgrDayWorkHoursQueryList.size() > 0) { + for (PayDayWorkHoursQuery dayWorkHour : sgrDayWorkHoursQueryList) { + for (PayDwHoursContrast dwHoursContrast : dayWorkHour.getDwHoursContrasts()) { + if (dwHoursContrast.getIsHelper() == 1) { + BigDecimal datePoor = dwHoursContrast.getHours(); + rigongbanggong = rigongbanggong.add(datePoor); + } + } + } + } + /*if(employeeInfo.getName().equals("赵向进")){ //测试使用的 + System.out.println("....."); + }*/ + sgrSalaryReport.setRigongHelpHours(rigongbanggong);//2023-10-16 客户要求展示日工帮工工时 + + //1.3获取员工包活及流程卡信息 + //流程卡工时 + PayWorkTimeBo workTime = new PayWorkTimeBo(); + workTime.setEmpId(employeeInfo.getId()); + workTime.setDate(yearMonth); + List sgrWorkTimes = payWorkTimeService.queryList(workTime); + BigDecimal baohuogongshi = BigDecimal.ZERO; //包活工时 + if (sgrWorkTimes != null && sgrWorkTimes.size() > 0) { + for (PayWorkTimeVo time : sgrWorkTimes) { + baohuogongshi = baohuogongshi.add(time.getValidHours()); + } + } + //包活工时 + PayBaohuoWorktime bhtime = new PayBaohuoWorktime(); + bhtime.setEmpId(employeeInfo.getId()); + bhtime.setDate(yearMonth); + List bhtimes = payBaohuoWorktimeMapper.selectBaohuoWorktimeList(bhtime); + if (bhtimes != null && bhtimes.size() > 0) { + for (PayBaohuoWorktime btime : bhtimes) { + baohuogongshi = baohuogongshi.add(btime.getValidHours()); + } + } + //流程卡工资 + BigDecimal baohuogongzi = BigDecimal.ZERO; //包活工资 + BigDecimal baohuobanggongGZ = BigDecimal.ZERO;//包活帮工工资 + PayWorkOrderEmployeeBo woEmployee = new PayWorkOrderEmployeeBo(); + woEmployee.setEmpName(empName); + woEmployee.setIntime(yearMonth); + List woEmployees = sgrWorkOrderEmployeeMapper.selectPayWorkOrderEmployeeList1(woEmployee); + for (PayWorkOrderEmployee woe : woEmployees) { + if (woe.getHelper() == 0) { + baohuogongzi = baohuogongzi.add(woe.getAmount()); + } else { + baohuobanggongGZ = baohuobanggongGZ.add(woe.getAmount()); + } + } + + //包活工资 + PayBaohuoEmployeeBo bhEmployee = new PayBaohuoEmployeeBo(); + bhEmployee.setEmpName(empName); + bhEmployee.setIntime(yearMonth); + List bhEmployees = sgrBaohuoEmployeeMapper.selectSgrBaohuoEmployeeList1(bhEmployee); + for (PayBaohuoEmployee bhe : bhEmployees) { + if (bhe.getHelper() == 0) { + baohuogongzi = baohuogongzi.add(bhe.getAmount()); + } else { + baohuobanggongGZ = baohuobanggongGZ.add(bhe.getAmount()); + } + } + sgrSalaryReport.setWorkOrderHours(baohuogongshi); + sgrSalaryReport.setWorkOrderPay(baohuogongzi.setScale(2, BigDecimal.ROUND_HALF_UP)); + + //1.4获取补贴信息 + List butieMoneyAndTypesList = new ArrayList<>(); + for (PayButieVo butie : sgrButies) { + ButieMoneyAndTypes butieMoneyAndType = new ButieMoneyAndTypes(); + BigDecimal money = sgrButieEmplyeeMapper.getMoneyByInfo(employeeInfo.getId(), butie.getId(), date); + butieMoneyAndType.setBuTieName(butie.getName()); + //补贴扣减全勤和津贴需要按比例发放 +/* if(money.compareTo(BigDecimal.ZERO)!=0){ + if((butie.getName().equals("全勤奖")||butie.getName().equals("岗位津贴"))&&!employeeInfo.getPayCalcType().equals(PayCalcType.TYPE5.getValue()) + &&attendanceReport.getRequireDays().longValue()>attendanceReport.getAvtiveDays().longValue()){ + BigDecimal moneyPerHour = money.divide(new BigDecimal(attendanceReport.getRequireDays()),4,BigDecimal.ROUND_HALF_UP) + .divide(employeeInfo.getHoursPerDay(),4,BigDecimal.ROUND_HALF_UP); + money =moneyPerHour.multiply(new BigDecimal(attendanceReport.getAvtiveDays()).multiply(employeeInfo.getHoursPerDay()).add(attendanceReport.getAttendanceHours())); + } + }*/ + butieMoneyAndType.setMoney(money.setScale(2, BigDecimal.ROUND_HALF_UP)); + butieMoneyAndType.setType(butie.getType()); + butieMoneyAndTypesList.add(butieMoneyAndType); + } + sgrSalaryReport.setAllButieData(JSON.toJSONString(butieMoneyAndTypesList)); + + /* SgrButieEmplyee butieEmplyee = new SgrButieEmplyee(); + butieEmplyee.setButieId(employeeInfo.getId()); + butieEmplyee.setDate(date); + List butieEmplyeeList=sgrButieEmplyeeMapper.selectSgrButieEmplyeeList(butieEmplyee); + if(butieEmplyeeList!=null&&butieEmplyeeList.size()>0){ + hasBuTie=true; + sgrSalaryReport.setAllBieteiData(JSON.toJSONString(butieEmplyeeList.get(0))); + }else{ + sgrSalaryReport.setAllBieteiData(JSON.toJSONString(new SgrButieEmplyee())); + }*/ + + //根据不同计算类型计算 + String payCalcType = employeeInfo.getPayCalcType(); + BigDecimal yingfagongzi; + BigDecimal shifagongzi; + BigDecimal chuqingongshi = BigDecimal.ZERO; + BigDecimal jiabangongzi = BigDecimal.ZERO; + BigDecimal rigongbanggongGZ = BigDecimal.ZERO; + BigDecimal payPerHour; + if (!payCalcType.equals(PayCalcType.TYPE5.getValue())) { + //出勤工时=实际出勤天数*每日小时数+实际出勤小时数 + chuqingongshi = new BigDecimal(sgrSalaryReport.getActuallyDays()).multiply(employeeInfo.getHoursPerDay()).add(sgrSalaryReport.getActuallyHours()); + } + sgrSalaryReport.setDayWorkHours(chuqingongshi); + BigDecimal rigonggongzi = BigDecimal.ZERO; + //日工工时=出勤工时-包活工时-日工帮工 + BigDecimal rigonghours = chuqingongshi.subtract(baohuogongshi).subtract(rigongbanggong);//日工工时数 + /*0:日薪(日工工资+包活工资) + 1:月薪(日工工资+包活工资) + 2:喷涂按小时数(16/17、17/18) + 3.外贸按小时数(17/21) + 4.包月工资*/ + switch (payCalcType) { + case "0": //工资计算类型:日薪(日工工资+包活工资) + //日工工资=基本工资/每日应出勤工时*日工工时 + payPerHour = sgrSalaryReport.getBasicSalary().divide(employeeInfo.getHoursPerDay(), 4, BigDecimal.ROUND_HALF_UP); + rigonggongzi = payPerHour.multiply(rigonghours); + jiabangongzi = payPerHour.multiply(new BigDecimal("1.3")).multiply(sgrSalaryReport.getOvertimeWorkHours()); + rigongbanggongGZ = payPerHour.multiply(rigongbanggong); + break; + case "1": //工资计算类型:月薪(日工工资+包活工资) + //小时工资=基本工资/应出勤天数/员工每日应出勤小时数 + // 日工工资==小时工资 *(实际出勤天数 *员工每日应出勤小时数 +实际出勤小时数) + payPerHour = sgrSalaryReport.getBasicSalary().divide(yingchuqintianshu, 4, BigDecimal.ROUND_HALF_UP). + divide(employeeInfo.getHoursPerDay(), 4, BigDecimal.ROUND_HALF_UP); + rigonggongzi = payPerHour.multiply(rigonghours); + jiabangongzi = payPerHour.multiply(new BigDecimal("1.3")).multiply(sgrSalaryReport.getOvertimeWorkHours()); + rigongbanggongGZ = payPerHour.multiply(rigongbanggong); + break; + case "2": //工资计算类型:喷涂按小时 + //出勤工时需要达到234并且本月请假天数不能超过4天 工时工资按高工资计算 + //客户需求修改:去掉234小时的判断 + //客户需求修改:喷涂计算时薪,符合条件原来+1元, 现在改为+2元 (将这个值2存储到字典中 hourpayDiff) + //2024-8-15客户需求修改:请假天数<=4天 原来+字典值+2元, 改为不加钱, ( 将字典hourpayDiff值改为0--已修改 ),(并且新增:如果请假大于4天扣200元——未修改,客户自己加减) + // if (chuqingongshi.compareTo(new BigDecimal("234")) >= 0 && attendanceReport.getLeaveDays().compareTo(new BigDecimal("4")) <= 0) { //>=234小时 时薪+1元 + if (attendanceReport.getLeaveDays().compareTo(new BigDecimal("4")) <= 0) { //符合条件: 时薪 +字典设定值 元 + String diff = dictService.getDictValue("pay_hourpay_diff","diff"); + payPerHour = sgrSalaryReport.getBasicSalary().add(new BigDecimal(diff)); + } else { + payPerHour = sgrSalaryReport.getBasicSalary(); + } + rigonggongzi = payPerHour.multiply(rigonghours); + rigongbanggongGZ = payPerHour.multiply(rigongbanggong); + + break; + case "3": //工资计算类型:外贸按小时 + rigonggongzi = sgrSalaryReport.getBasicSalary().multiply(rigonghours); + rigongbanggongGZ = sgrSalaryReport.getBasicSalary().multiply(rigongbanggong); + break; + case "4": //工资计算类型:包月 + rigonggongzi = sgrSalaryReport.getBasicSalary(); + break; + } + sgrSalaryReport.setDayWorkPay(rigonggongzi.setScale(2, BigDecimal.ROUND_HALF_UP)); + sgrSalaryReport.setWorkOrderPay(baohuogongzi.setScale(2, BigDecimal.ROUND_HALF_UP)); + sgrSalaryReport.setOvertime(jiabangongzi.setScale(2, BigDecimal.ROUND_HALF_UP)); + //帮贡工资计算 + BigDecimal banggonggongzi = baohuobanggongGZ.add(rigongbanggongGZ); + sgrSalaryReport.setBanggongPay(banggonggongzi.setScale(2, BigDecimal.ROUND_HALF_UP)); + + //应付工资=日工工资+包活工资+加班工资+帮工工资+增补项 值班、拉货工资 节假日工资 岗位津贴 补贴(话费及其他) 合同补助 全勤奖 帮工工资 上月差异 + yingfagongzi = rigonggongzi.add(baohuogongzi).add(jiabangongzi).add(banggonggongzi); + //遍历补贴扣减项 + BigDecimal koujianxiang = BigDecimal.ZERO; + for (ButieMoneyAndTypes butieMoney : butieMoneyAndTypesList) { + if (butieMoney.getType().equals("1")) { + yingfagongzi = yingfagongzi.add(butieMoney.getMoney()); + } else { + koujianxiang = koujianxiang.add(butieMoney.getMoney()); + } + } + + //实发工资=应付工资-扣减项 迟到-党费 + shifagongzi = yingfagongzi.subtract(koujianxiang); + sgrSalaryReport.setShoudPayMoney(yingfagongzi.setScale(2, BigDecimal.ROUND_HALF_UP)); + sgrSalaryReport.setActuallyPayMoney(shifagongzi.setScale(0, BigDecimal.ROUND_HALF_UP)); + int result = baseMapper.insert(sgrSalaryReport); + if (result > 0) { + successNums++; + successMsg.append("
" + employeeInfo.getName() + "操作成功"); + } else { + failedNums++; + failedMsg.append("
" + employeeInfo.getName() + "添加到数据库时服务器异常"); + } + } + if (failedNums > 0) { + failedMsg.insert(0, "生成成功:" + successNums + "条,生成失败:" + failedNums + "条,错误如下:"); + return R.fail(failedMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部生成成功!共 " + successNums + " 条,数据如下:"); + } + return R.ok(successMsg.toString()); + + } } diff --git a/ruoyi-pay/src/main/resources/mapper/pay/PayBaohuoEmployeeMapper.xml b/ruoyi-pay/src/main/resources/mapper/pay/PayBaohuoEmployeeMapper.xml new file mode 100644 index 0000000..3f80e8f --- /dev/null +++ b/ruoyi-pay/src/main/resources/mapper/pay/PayBaohuoEmployeeMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-pay/src/main/resources/mapper/pay/PayWorkOrderEmployeeMapper.xml b/ruoyi-pay/src/main/resources/mapper/pay/PayWorkOrderEmployeeMapper.xml new file mode 100644 index 0000000..880a7ef --- /dev/null +++ b/ruoyi-pay/src/main/resources/mapper/pay/PayWorkOrderEmployeeMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +