Browse Source

薪资代码

yuansh 10 months ago
parent
commit
eeafff1b32

+ 49 - 4
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/controller/SalaryAttendanceController.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.salary.controller;
 
 import java.io.UnsupportedEncodingException;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.net.URLDecoder;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -60,7 +61,7 @@ public class SalaryAttendanceController {
     private ISalaryAttendanceHolidayService salaryAttendanceHolidayService;
     @Autowired
     private ISalaryChangeRecordService salaryChangeRecordService;
-
+    String remarkExcel = "";
     /**
      * 分页列表查询
      *
@@ -273,7 +274,7 @@ public class SalaryAttendanceController {
      * @return
      */
      public String ifExist(MultipartFile file,String type) throws IOException, InvalidFormatException {
-
+         remarkExcel = "";
          Workbook workbook = WorkbookFactory.create(file.getInputStream());
          Sheet sheet = workbook.getSheetAt(0);
          Iterator<Row> rowIterator = sheet.iterator();
@@ -285,6 +286,9 @@ public class SalaryAttendanceController {
                  Iterator<Cell> cellIterator = headerRow.cellIterator();
                  while (cellIterator.hasNext()) {
                      Cell cell = cellIterator.next();
+                     if(cell.getColumnIndex() == 24){
+                         remarkExcel = cell.getStringCellValue();
+                     }
                      try {
                          header.add(cell.getStringCellValue());
                      }catch (Exception x){
@@ -377,6 +381,7 @@ public class SalaryAttendanceController {
 //            return Result.error("后续考勤已导入,无法导入此月考勤数据!!");
 //        }
 
+
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
@@ -404,15 +409,34 @@ public class SalaryAttendanceController {
                 if(salaryAttendance.getType().equals("考勤表")){
 
                     List<SalaryAttendanceDetail> list = ExcelImportUtil.importExcel(file.getInputStream(), SalaryAttendanceDetail.class, params);
+                    if(list.size() > 0){
+
+                    }else{
+                        return Result.error("文件导入失败!数据为空");
+                    }
 
                     for (SalaryAttendanceDetail page : list) {
 
                         String name = page.getName();//员工姓名
                         String cardNo = page.getCardNo();//卡号
+                        String restMode = page.getRestMode();//单双休
+                        BigDecimal workingHours = page.getWorkingHours();//每日工时
+                        BigDecimal attendanceDays = page.getAttendanceDays();//出勤天数
 
                         if (StringUtils.isEmpty(name) || StringUtils.isEmpty(cardNo)) {
                             continue;
                         }
+                        if (StringUtils.isEmpty(restMode)) {
+                            return Result.error("文件导入失败!"+name+"+"+cardNo+"组合,单双休不能为空!");
+                        }
+                        if (workingHours == null) {
+                            return Result.error("文件导入失败!"+name+"+"+cardNo+"组合,每日工时不能为空!");
+                        } else if (workingHours.compareTo(BigDecimal.ZERO) <= 0) {
+                            return Result.error("文件导入失败!"+name+"+"+cardNo+"组合,每日工时不能小于0!");
+                        }
+                        if (attendanceDays == null) {
+                            return Result.error("文件导入失败!"+name+"+"+cardNo+"组合,出勤天数不能为空!");
+                        }
 
                         List<SalaryChangeRecord> userList = salaryChangeRecordService.selectUserByPar(name.trim(), cardNo.trim());
                         if(userList.size() < 1){
@@ -467,7 +491,11 @@ public class SalaryAttendanceController {
                     salaryAttendance.setYearWithMonth(salaryAttendance.getYearWithMonth().substring(0, 4));
 
                     List<SalaryAttendanceHoliday> list = ExcelImportUtil.importExcel(file.getInputStream(), SalaryAttendanceHoliday.class, params);
+                    if(list.size() > 0){
 
+                    }else{
+                        return Result.error("文件导入失败!数据为空");
+                    }
                     for (SalaryAttendanceHoliday page : list) {
 
                         String name = page.getName();//员工姓名
@@ -477,6 +505,23 @@ public class SalaryAttendanceController {
                             continue;
                         }
 
+                        String restMode = page.getRestMode();//单双休
+                        BigDecimal workingHours = page.getWorkingHours();//每日工时
+
+                        if (StringUtils.isEmpty(name) || StringUtils.isEmpty(cardNo)) {
+                            continue;
+                        }
+
+                        if (StringUtils.isEmpty(restMode)) {
+                            return Result.error("文件导入失败!"+name+"+"+cardNo+"组合,单双休不能为空!");
+                        }
+                        if (workingHours == null) {
+                            return Result.error("文件导入失败!"+name+"+"+cardNo+"组合,每日工时不能为空!");
+                        } else if (workingHours.compareTo(BigDecimal.ZERO) <= 0) {
+                            return Result.error("文件导入失败!"+name+"+"+cardNo+"组合,每日工时不能小于0!");
+                        }
+
+
                         List<SalaryChangeRecord> userList = salaryChangeRecordService.selectUserByPar(name.trim(), cardNo.trim());
                         if(userList.size() < 1){
                             return Result.error("文件导入失败!"+name+"+"+cardNo+"组合,无法在查找到数据!");
@@ -497,7 +542,7 @@ public class SalaryAttendanceController {
                 }
 
                 if(size > 0 ){
-
+                    salaryAttendance.setRemarks(remarkExcel);
                     salaryAttendanceService.saveMain(salaryAttendance, detailList,workOvertimeList,attendanceHolidayList);
                 }else{
                     return Result.error("文件导入失败:导入模板不正确或者导入数据为空!" );
@@ -506,7 +551,7 @@ public class SalaryAttendanceController {
                 return Result.ok("文件导入成功!合法数据行数:" + size);
             } catch (Exception e) {
                 log.error(e.getMessage(), e);
-                return Result.error("文件导入失败:" + e.getMessage());
+                return Result.error("文件导入失败:数据不合法,请检查导入模板数据," + e.getMessage());
             } finally {
                 try {
                     file.getInputStream().close();

+ 214 - 23
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/controller/SalaryManagementController.java

@@ -200,7 +200,7 @@ public class SalaryManagementController {
 //            field.setAccessible(true);
 //            map.put(field.getName(), field.get(userParams));
 //        }
-        if("使用请ssss".contains("请")){
+        if ("使用请ssss".contains("请")) {
             System.out.println(1111);
         }
         System.out.println(222);
@@ -526,7 +526,7 @@ public class SalaryManagementController {
 
             } else if (type.equals("福利现金")) {
                 title = "福利现金";
-                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(object.getId(), null,"0");
+                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(object.getId(), null, "0");
                 exportList.removeIf(item -> item.getAfterTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
 
                 for (SalaryManagementExtra o : exportList) {
@@ -548,7 +548,7 @@ public class SalaryManagementController {
             } else if (type.equals("年终奖")) {
                 title = "年终奖";
 
-                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(object.getId(), null,"0");
+                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(object.getId(), null, "0");
                 exportList.removeIf(item -> item.getAfterTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
 
                 for (SalaryManagementExtra o : exportList) {
@@ -590,20 +590,21 @@ public class SalaryManagementController {
             return Result.error("参数异常:类型为空!!");
         }
         salaryManagement.setYearWithMonth(DateUtils.date_ym());
+//        salaryManagement.setYearWithMonth("2024-12");
 
-        if(StringUtils.isEmpty(salaryManagement.getId()) || "false".equals(salaryManagement.getId())){
+        if (StringUtils.isEmpty(salaryManagement.getId()) || "false".equals(salaryManagement.getId())) {
 
             QueryWrapper<SalaryManagement> queryWrapper = new QueryWrapper<>();
             queryWrapper.eq("del_flag", "0");
             queryWrapper.eq("year_with_month", salaryManagement.getYearWithMonth());
             queryWrapper.eq("type", salaryManagement.getType());
             List<SalaryManagement> list = salaryManagementService.list(queryWrapper);
-            if(list.size() > 0){
-                return Result.error("系统中已含有"+salaryManagement.getYearWithMonth()+salaryManagement.getType()+",若要覆盖请选中覆盖上传选项!");
+            if (list.size() > 0) {
+                return Result.error("系统中已含有" + salaryManagement.getYearWithMonth() + salaryManagement.getType() + ",若要覆盖请选中覆盖上传选项!");
             }
         }
 
-        if("福利现金".equals(salaryManagement.getType())){
+        if ("福利现金".equals(salaryManagement.getType())) {
             QueryWrapper<SalaryManagementExtra> queryWrapper = new QueryWrapper<>();
             queryWrapper.eq("del_flag", "0");
             queryWrapper.eq("year_with_month", salaryManagement.getYearWithMonth());
@@ -612,12 +613,26 @@ public class SalaryManagementController {
             queryWrapper.eq("calculate", "1");
 
             List<SalaryManagementExtra> list1 = salaryManagementExtraService.list(queryWrapper);
-            if(list1.size() > 0){
-                return Result.error("系统中"+salaryManagement.getYearWithMonth()+salaryManagement.getType()+"已计算("+list1.get(0).getCalculateDate()+"),无法覆盖!");
+            if (list1.size() > 0) {
+                return Result.error("系统中" + salaryManagement.getYearWithMonth() + salaryManagement.getType() + "已计算(" + list1.get(0).getCalculateDate() + "),无法覆盖!");
             }
 
+            //如果当年12月份工资已计算,则当年12月福利现金不能导入
+            if(DateUtils.formatDate("MM").equals("12")){
+
+                QueryWrapper<SalaryManagement> queryWrapper2 = new QueryWrapper<>();
+                queryWrapper2.eq("del_flag", "0");
+                queryWrapper2.eq("year_with_month", salaryManagement.getYearWithMonth());
+                queryWrapper2.eq("type", "月度工资单");
+                List<SalaryManagement> list = salaryManagementService.list(queryWrapper2);
+                if (list.size() > 0) {
+                    return Result.error("系统中已含有本年度12月月度工资单,无法再生成福利现金!!");
+                }
+
+            }
         }
 
+
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
@@ -627,9 +642,9 @@ public class SalaryManagementController {
             params.setHeadRows(1);
             params.setNeedSave(false);
 
-            String st = this.ifExist(file,salaryManagement.getType());
+            String st = this.ifExist(file, salaryManagement.getType());
             if (!"true".equals(st)) {
-                if(st.contains("请")){
+                if (st.contains("请")) {
                     return Result.error(st);
                 }
                 return Result.error("未在模板中找到" + st + "字段,请勿增删改导入模板的字段!!");
@@ -651,13 +666,13 @@ public class SalaryManagementController {
                         continue;
                     }
                     if (StringUtils.isEmpty(beforeTaxAmount)) {
-                        return Result.error("文件导入失败!" + name + "+" + cardNo + "组合,税前金额不能为空!");
+                        return Result.error("文件导入失败!" + name + "+" + cardNo + "组合,金额(税前)不能为空!");
                     }
 
                     try {
                         new BigDecimal(beforeTaxAmount);
-                    }catch (Exception ex){
-                        return Result.error("文件导入失败!" + name + "+" + cardNo + "组合,税前金额无转换成数字!");
+                    } catch (Exception ex) {
+                        return Result.error("文件导入失败!" + name + "+" + cardNo + "组合,金额(税前)无转换成数字!");
                     }
 
                     List<SalaryChangeRecord> userList = salaryChangeRecordService.selectUserByPar(name.trim(), cardNo.trim());
@@ -672,16 +687,16 @@ public class SalaryManagementController {
                     page.setOrgName(entry.getOrgName());
                     page.setYearWithMonth(salaryManagement.getYearWithMonth());
 
-                    if(salaryManagement.getType().equals("福利现金")){
+                    if (salaryManagement.getType().equals("福利现金")) {
                         page.setType("0");//福利现金
-                    }else{
+                    } else {
                         page.setType("1");//年终奖
                     }
                     detailList.add(page);
                 }
 
                 if (detailList.size() > 0) {
-                    salaryManagementService.saveMainExtra(salaryManagement,detailList);
+                    salaryManagementService.saveMainExtra(salaryManagement, detailList);
                 } else {
                     return Result.error("文件导入失败:导入模板不正确或者导入数据为空!");
                 }
@@ -702,6 +717,182 @@ public class SalaryManagementController {
     }
 
 
+    /**
+     * 工资单模板导出excel
+     *
+     * @param request
+     * @param
+     */
+    @RequestMapping(value = "/exportXls99")
+    public ModelAndView exportXls99(HttpServletRequest request, SalaryManagement salaryManagement) {
+        ModelAndView mv = new ModelAndView(new JeecgTemplateExcelView());
+        try {
+
+            String title = "";
+            String org = "";
+            String month = "";
+            List<ExcelDemo> list = new ArrayList<>();
+            int index = 0;
+            QueryWrapper<SalaryManagementDetail> queryWrapper1 = new QueryWrapper<>();
+            queryWrapper1.orderByDesc("year_With_Month");
+            queryWrapper1.eq("del_flag", "0");
+            List<SalaryManagementDetail> exportList = salaryManagementDetailService.list(queryWrapper1);
+            exportList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+            for (SalaryManagementDetail o : exportList) {
+                index++;
+                ExcelDemo demo = new ExcelDemo();
+                demo.setCode(o.getYearWithMonth());
+                demo.setName(o.getName());
+
+                String totalPayable = o.getTotalPayable();
+                if (StringUtils.isNotBlank(totalPayable)) {
+                    demo.setCardNo(AesEncryptUtil.desEncrypt(totalPayable).trim());
+                }
+                demo.setWages(o.getPersonalTax().toString());
+                demo.setTest1(o.getTotalDeduction().toString());
+                demo.setTest("月度工资单");
+
+                String actualOccurrence = o.getActualOccurrence();
+                if (StringUtils.isNotBlank(actualOccurrence)) {
+                    demo.setTest2(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                }
+
+                list.add(demo);
+            }
+
+            QueryWrapper<SalaryManagementWorkOvertime> queryWrapper2 = new QueryWrapper<>();
+            queryWrapper2.eq("del_flag", "0");
+            queryWrapper2.orderByDesc("year_With_Month");
+            List<SalaryManagementWorkOvertime> exportList1 = salaryManagementWorkOvertimeService.list(queryWrapper2);
+
+            exportList1.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+            for (SalaryManagementWorkOvertime o : exportList1) {
+                index++;
+                ExcelDemo demo = new ExcelDemo();
+                demo.setCode(o.getYearWithMonth());
+                demo.setName(o.getName());
+                demo.setTest("加班工资单");
+                demo.setCardNo(o.getWorkOvertimeCost().toString());
+                demo.setWages(o.getPersonalTax().toString());
+                demo.setTest1(o.getPersonalTax().toString());
+
+                String actualOccurrence = o.getActualOccurrence();
+                if (StringUtils.isNotBlank(actualOccurrence)) {
+                    demo.setTest2(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                }
+                list.add(demo);
+
+            }
+
+            QueryWrapper<SalaryManagementHoliday> queryWrapper3 = new QueryWrapper<>();
+            queryWrapper3.eq("del_flag", "0");
+            queryWrapper3.orderByDesc("year_With_Month");
+            List<SalaryManagementHoliday> exportList2 = salaryManagementHolidayService.list(queryWrapper3);
+            exportList2.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+            for (SalaryManagementHoliday o : exportList2) {
+                index++;
+                ExcelDemo demo = new ExcelDemo();
+//                    demo.setCode(o.getCode());
+                demo.setCode(o.getYearWithMonth());
+                demo.setName(o.getName());
+                demo.setTest("年休工资单");
+                demo.setCardNo(o.getWages().toString());
+                demo.setWages(o.getPersonalTax().toString());
+                demo.setTest1(o.getPersonalTax().toString());
+
+                String actualOccurrence = o.getActualOccurrence();
+                if (StringUtils.isNotBlank(actualOccurrence)) {
+                    demo.setTest2(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                }
+                list.add(demo);
+
+            }
+
+
+            QueryWrapper<SalaryManagementExtra> queryWrapper4 = new QueryWrapper<>();
+            queryWrapper4.eq("del_flag", "0");
+            queryWrapper4.eq("type", "0");
+            queryWrapper4.orderByDesc("year_With_Month");
+            List<SalaryManagementExtra> exportList3 = salaryManagementExtraService.list(queryWrapper4);
+            exportList3.removeIf(item -> item.getAfterTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+            title = "福利现金";
+            for (SalaryManagementExtra o : exportList3) {
+                index++;
+                ExcelDemo demo = new ExcelDemo();
+                demo.setCode(o.getYearWithMonth());
+                demo.setName(o.getName());
+                demo.setTest("福利现金");
+                String getBeforeTaxAmount = o.getBeforeTaxAmount();
+                if (StringUtils.isNotBlank(getBeforeTaxAmount)) {
+                    demo.setCardNo(AesEncryptUtil.desEncrypt(getBeforeTaxAmount).trim());
+                }
+                demo.setWages(o.getPersonalTax().toString());
+                demo.setTest1(o.getPersonalTax().toString());
+
+                String actualOccurrence = o.getAfterTaxAmount();
+                if (StringUtils.isNotBlank(actualOccurrence)) {
+                    demo.setTest2(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                }
+                list.add(demo);
+
+            }
+
+
+            QueryWrapper<SalaryManagementExtra> queryWrapper5 = new QueryWrapper<>();
+            queryWrapper5.eq("del_flag", "0");
+            queryWrapper5.eq("type", "1");
+            queryWrapper5.orderByDesc("year_With_Month");
+            List<SalaryManagementExtra> exportList4 = salaryManagementExtraService.list(queryWrapper5);
+            exportList4.removeIf(item -> item.getAfterTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+            for (SalaryManagementExtra o : exportList4) {
+                index++;
+                ExcelDemo demo = new ExcelDemo();
+                demo.setCode(o.getYearWithMonth());
+                demo.setName(o.getName());
+                demo.setTest("年终奖");
+
+                String getBeforeTaxAmount = o.getBeforeTaxAmount();
+                if (StringUtils.isNotBlank(getBeforeTaxAmount)) {
+                    demo.setCardNo(AesEncryptUtil.desEncrypt(getBeforeTaxAmount).trim());
+                }
+                demo.setWages(o.getPersonalTax().toString());
+                demo.setTest1(o.getPersonalTax().toString());
+
+                String actualOccurrence = o.getAfterTaxAmount();
+                if (StringUtils.isNotBlank(actualOccurrence)) {
+                    demo.setTest2(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                }
+                list.add(demo);
+
+            }
+
+
+            ExcelDemo demo = new ExcelDemo();
+            demo.setName(org + title);
+            demo.setCode(month);
+
+            Map map = JSON.parseObject(JSON.toJSONString(demo), Map.class);
+            map.put("list", list);
+
+            TemplateExportParams params = new TemplateExportParams();
+//            params.setTemplateUrl("D:\\test.xlsx");
+            params.setTemplateUrl("D:\\service\\oa\\test.xlsx");
+//
+            mv.addObject(TemplateExcelConstants.PARAMS, params);
+            mv.addObject(TemplateExcelConstants.MAP_DATA, map);
+            mv.addObject(NormalExcelConstants.FILE_NAME, "导出数据");
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return mv;
+    }
+
     /**
      * 工资单模板导出excel
      *
@@ -799,7 +990,7 @@ public class SalaryManagementController {
             } else if (type.equals("福利现金")) {
                 title = "福利现金";
 
-                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(salaryManagement.getId(), null,"0");
+                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(salaryManagement.getId(), null, "0");
                 exportList.removeIf(item -> item.getAfterTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
 
                 for (SalaryManagementExtra o : exportList) {
@@ -824,7 +1015,7 @@ public class SalaryManagementController {
             } else if (type.equals("年终奖")) {
                 title = "年终奖";
 
-                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(salaryManagement.getId(), null,"1");
+                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(salaryManagement.getId(), null, "1");
                 exportList.removeIf(item -> item.getAfterTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
 
                 for (SalaryManagementExtra o : exportList) {
@@ -965,7 +1156,7 @@ public class SalaryManagementController {
      * @param file
      * @return
      */
-    public String ifExist(MultipartFile file,String type) throws IOException, InvalidFormatException {
+    public String ifExist(MultipartFile file, String type) throws IOException, InvalidFormatException {
 
         Workbook workbook = WorkbookFactory.create(file.getInputStream());
         Sheet sheet = workbook.getSheetAt(0);
@@ -979,7 +1170,7 @@ public class SalaryManagementController {
                 while (cellIterator.hasNext()) {
                     Cell cell = cellIterator.next();
                     try {
-                        if(StringUtils.isNotBlank(cell.getStringCellValue())){
+                        if (StringUtils.isNotBlank(cell.getStringCellValue())) {
                             header1.add(cell.getStringCellValue());
                         }
                     } catch (Exception x) {
@@ -1002,12 +1193,12 @@ public class SalaryManagementController {
             }
         }
 
-        if(type.equals("福利现金") && !header1.get(0).equals("福利现金导入模板")){
+        if (type.equals("福利现金") && !header1.get(0).equals("福利现金导入模板")) {
 
             return "请使用福利现金导入模板";
 
         }
-        if(type.equals("年终奖") && !header1.get(0).equals("年终奖导入模板")){
+        if (type.equals("年终奖") && !header1.get(0).equals("年终奖导入模板")) {
 
             return "请使用年终奖导入模板";
 

+ 2 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryAttendanceHoliday.java

@@ -76,5 +76,7 @@ public class SalaryAttendanceHoliday implements Serializable {
 	private String yearWithMonth;
 	/**版本*/
 	private String version;
+	@Excel(name = "备注", width = 15)
+	private String remarks;
 
 }

+ 2 - 1
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryAttendanceDetailMapper.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.salary.mapper;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 import org.apache.ibatis.annotations.Param;
@@ -19,7 +20,7 @@ public interface SalaryAttendanceDetailMapper extends BaseMapper<SalaryAttendanc
 	public List<SalaryAttendanceDetail> selectByMainId(@Param("id") String mainId, @Param("orgName")String orgName, @Param("yearWithMonth")String yearWithMonth,
 													   @Param("version")String version, @Param("name")String name, @Param("remarks")String remarks);
 
-	public List<SalaryAttendanceDetail> selectWorkOvertime(@Param("beginMonth") String beginMonth, @Param("endMonth")String endMonth);
+	public List<SalaryAttendanceDetail> selectWorkOvertime(@Param("beginMonth") String beginMonth, @Param("endMonth")String endMonth, @Param("salaryBaseBig") BigDecimal salaryBaseBig);
 
 	public List<SalaryAttendanceDetail> selectListByDate(String yearWithMonth);
 }

+ 3 - 2
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryAttendanceDetailMapper.xml

@@ -42,8 +42,9 @@
 
 	<select id="selectWorkOvertime" resultType="org.jeecg.modules.salary.entity.SalaryAttendanceDetail">
 
-		select user_id "userId", code "code",name "name", org_name "orgName", card_no "cardNo" ,sum(working_hours)  "workingHours" ,
-		       sum(attendance_days)  "attendanceDays",sum(work_overtime )  "workOvertime"
+		select user_id "userId", code "code",name "name", org_name "orgName", card_no "cardNo" ,working_hours  "workingHours" ,
+		       attendance_days "attendanceDays",sum(work_overtime) "workOvertime"
+				,sum( ROUND(${salaryBaseBig}/attendance_days/(working_hours*60)*work_overtime, 2)) "fullAttendance"
 		from salary_attendance_detail
 		where del_flag = 0 and year_with_month BETWEEN #{beginMonth} and #{endMonth}
 		group by code,name,org_name

+ 10 - 5
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryManagementExtraMapper.xml

@@ -21,17 +21,22 @@
 	</select>
 
 	<select id="selectByUser" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryManagementExtra">
-		select * from salary_management_extra where del_flag = 0 and type = #{type} and calculate = 0
+		select * from salary_management_extra where del_flag = 0 and type = #{type}
+		and (calculate = 0
+			<if test="yearWithMonthNow != null and yearWithMonthNow != ''">
+				OR (calculate_date = #{yearWithMonthNow} and calculate = 1)
+			</if>
+			)
 		and user_id = #{userId} and year_with_month like '${yearWithMonth}%'
 
-		<if test="yearWithMonthNow != null and yearWithMonthNow != ''">
-			AND year_with_month != #{yearWithMonthNow}
-		</if>
 
 	</select>
 
 	<select id="selectByUserTotal" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryManagementExtra">
-		select * from salary_management_extra where del_flag = 0 and type = #{type}
+		select * from salary_management_extra where del_flag = 0 and calculate = 1
+		<if test="type != null and type != ''">
+			and type = #{type}
+		</if>
 		and user_id = #{userId} and year_with_month BETWEEN #{beginDate} and #{endDate}
 
 	</select>

+ 4 - 2
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryAttendanceServiceImpl.java

@@ -86,7 +86,8 @@ public class SalaryAttendanceServiceImpl extends ServiceImpl<SalaryAttendanceMap
 
 				salaryAttendanceWorkOvertimeMapper.insert(entity);
 			}
-			salaryAttendanceMapper.deleteVersionHoliday(salaryAttendance.getYearWithMonth(),version);
+
+			salaryAttendanceMapper.deleteVersionOvertime(salaryAttendance.getYearWithMonth(),version);
 		}
 
 		if(salaryAttendanceHolidayList != null && salaryAttendanceHolidayList.size() > 0){
@@ -97,7 +98,8 @@ public class SalaryAttendanceServiceImpl extends ServiceImpl<SalaryAttendanceMap
 				entity.setVersion(String.valueOf(version));
 				salaryAttendanceHolidayMapper.insert(entity);
 			}
-			salaryAttendanceMapper.deleteVersionOvertime(salaryAttendance.getYearWithMonth(),version);
+
+			salaryAttendanceMapper.deleteVersionHoliday(salaryAttendance.getYearWithMonth(),version);
 		}
 
 	}

+ 88 - 37
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryManagementServiceImpl.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.salary.service.impl;
 
 import cn.hutool.core.util.IdUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.Synchronized;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
@@ -66,6 +67,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                 List<SalaryManagementDetail> detailList = salaryManagementDetailMapper.selectByUserTotal(userId, beginDate, endDate);
                 List<SalaryManagementWorkOvertime> overTimeList = salaryManagementWorkOvertimeMapper.selectByUserTotal(userId, beginDate, endDate);
                 List<SalaryManagementHoliday> holidayList = salaryManagementHolidayMapper.selectByUserTotal(userId, beginDate.substring(0, 4), endDate.substring(0, 4));
+                List<SalaryManagementExtra> extraList = salaryManagementExtraMapper.selectByUserTotal(userId,beginDate, endDate,null);
 
                 BigDecimal phoneBill = new BigDecimal("0");//话费补贴
                 BigDecimal lunch = new BigDecimal("0");//午餐补贴
@@ -86,6 +88,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                 BigDecimal totalDeduction = new BigDecimal("0");//合计应扣
                 BigDecimal actualOccurrence = new BigDecimal("0");//实发合计String
 
+
                 for (SalaryManagementDetail d : detailList) {
 
                     phoneBill = phoneBill.add(d.getPhoneBill() == null ? BigDecimal.ZERO : d.getPhoneBill());
@@ -133,6 +136,18 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     actualOccurrence = actualOccurrence.add(hisActualOccurrenceNew);
                 }
 
+                for (SalaryManagementExtra d : extraList) {
+
+                    //合计应发
+                    String hisTotalPayable = d.getBeforeTaxAmount() == null ? "nghotxDTNyeHgH0mlfbJig==" : d.getBeforeTaxAmount();
+                    hisTotalPayable = AesEncryptUtil.desEncrypt(hisTotalPayable).trim();
+                    BigDecimal hisTotalPayableNew = new BigDecimal(hisTotalPayable);
+                    totalPayable = totalPayable.add(hisTotalPayableNew);
+
+                    // 实发合计
+                    actualOccurrence = actualOccurrence.add(hisTotalPayableNew);
+                }
+
                 for (SalaryManagementHoliday d : holidayList) {
                     personalTax = personalTax.add(d.getPersonalTax() == null ? BigDecimal.ZERO : d.getPersonalTax());
                     //合计应扣,此处需加上年休工资的个税
@@ -485,20 +500,21 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
 
     @Override
     @Transactional
+    @Synchronized
     public Result<?> generatePayroll(SalaryManagement salaryManagement) {
 
         String type = salaryManagement.getType();//月度工资单、年休工资单、加班工资单
 
         if (StringUtils.isBlank(type)) {
-            return Result.error("参数异常type、yearWithMonth");
+            return Result.error("参数异常type");
         }
 
-        String yearWithMonth = salaryManagement.getYearWithMonth();
+        String yearWithMonth = salaryManagement.getYearWithMonth();//除年休时本字段有值,2024-01;年休时为空
 
-        String endMonth = salaryManagement.getEndMonth();
-        String beginMonth = salaryManagement.getBeginMonth();
+        String endMonth = salaryManagement.getEndMonth(); //加班时此字段有值;其他时为空
+        String beginMonth = salaryManagement.getBeginMonth();//加班时此字段有值;其他时为空
 
-        String yearWith = salaryManagement.getYearWith();
+        String yearWith = salaryManagement.getYearWith();//年休时本字段有值,2024;其他时为空
 
         if (StringUtils.isBlank(yearWithMonth)) {
             yearWithMonth = "2024-12-12";
@@ -511,28 +527,48 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
         queryWrapper1.ne("salary", "HV3ndEx8HV9kd1WNbxLgwg==");
         queryWrapper1.ne("type", "福利现金");
         queryWrapper1.ne("type", "年终奖");
+
+        QueryWrapper<SalaryManagement> queryWrapper2 = new QueryWrapper<>();
+        queryWrapper2.eq("del_flag", "0");
+        queryWrapper2.ne("salary", "nghotxDTNyeHgH0mlfbJig==");
+        queryWrapper2.ne("salary", "HV3ndEx8HV9kd1WNbxLgwg==");
+
         if(type.equals("年休工资单")){
+            queryWrapper2.eq("year_with_month",yearWith);
+            queryWrapper2.eq("type","年休工资单");
 
             queryWrapper1.likeRight("year_with_month",yearWith);
             queryWrapper1.last("and generation_time > " +
                     "(select generation_time from salary_management where year_with_month ='"+yearWith+"' and type ='年休工资单' and del_flag=0 limit 1 ) ");
         }else if(type.equals("加班工资单")){
 
+            queryWrapper2.eq("year_with_month",yearWithMonth);
+            queryWrapper2.eq("type","加班工资单");
+
             queryWrapper1.likeRight("year_with_month",withMonth);
             queryWrapper1.last("and (year_with_month > '"+yearWithMonth+"' or generation_time > " +
                     "(select generation_time from salary_management where year_with_month ='"+yearWithMonth+"' and type ='加班工资单' and del_flag=0 limit 1 ) ) ");
         }else{
 
+            queryWrapper2.eq("year_with_month",yearWithMonth);
+            queryWrapper2.eq("type","月度工资单");
+
             queryWrapper1.likeRight("year_with_month",withMonth);
             queryWrapper1.last("and (year_with_month > '"+yearWithMonth+"' or generation_time > " +
                     "(select generation_time from salary_management where year_with_month ='"+yearWithMonth+"' and type ='月度工资单' and del_flag=0 limit 1 ) ) ");
         }
 
-        List<SalaryManagement> list1 = salaryManagementMapper.selectList(queryWrapper1);
-        if(list1.size() > 0){
-            return Result.error("后续薪资已计算,无法生成此月工资单!!");
+        List<SalaryManagement> list2 = salaryManagementMapper.selectList(queryWrapper2);
+
+        if(list2.size() > 0){
+
+            List<SalaryManagement> list1 = salaryManagementMapper.selectList(queryWrapper1);
+            if(list1.size() > 0){
+                return Result.error("后续薪资已计算,无法生成此月工资单!!");
+            }
         }
 
+
         SalaryManagement salaryManagementMFY = new SalaryManagement(); //马非羊
         SalaryManagement salaryManagementNBSY = new SalaryManagement();//宁波森语
         SalaryManagement salaryManagementZZ = new SalaryManagement();//正织
@@ -652,7 +688,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
 
                     //合计应发 = 基本薪资+话费补贴+午餐补贴+住房补贴+交通补贴+全勤奖
                     BigDecimal totalPayable = new BigDecimal("0");
-                    totalPayable = bigWages.add(phoneBill).add(lunch).add(housingSubsidies).add(transportation).add(fullAttendance);
+                    totalPayable = bigWages.add(phoneBill).add(lunch).add(housingSubsidies).add(transportation).add(fullAttendance).setScale(2, BigDecimal.ROUND_HALF_UP);
                     //合计应发 (密文)
                     String totalPayableText = AesEncryptUtil.encrypt(totalPayable.toString());
                     salaryManagementDetail.setTotalPayable(totalPayableText);//合计应发
@@ -679,7 +715,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     salaryManagementDetail.setPersonalCost(personalCost);//事假扣费
 
                     BigDecimal sickCost = new BigDecimal("0");//病假扣费
-                    if(personalLeave.compareTo(BigDecimal.ZERO)!=0){
+                    if(sickLeave.compareTo(BigDecimal.ZERO)!=0){
 //                      基本薪资/(每日工时*天数)/ 60 * 病假分钟
                         sickCost = bigWages.divide(workingHours.multiply(attendanceDays), 12, BigDecimal.ROUND_HALF_UP).divide(new BigDecimal("60"), 12, BigDecimal.ROUND_HALF_UP)
                                 .multiply(sickLeave).setScale(2, BigDecimal.ROUND_HALF_UP);;
@@ -693,10 +729,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     payTaxes = totalPayable.subtract(socialSecurity).subtract(accumulationFund).subtract(new BigDecimal("5000")).subtract(deduction)
                             .subtract(personalCost).subtract(sickCost).subtract(latenessCost).setScale(2, BigDecimal.ROUND_HALF_UP);;
 
-                    if(payTaxes.compareTo(BigDecimal.ZERO) < 0){
-                        sb.append("实际应纳税所得额为"+payTaxes+"故默认为0!!");
-                        payTaxes = new BigDecimal("0");
-                    }
+
 
 
                     //累计个税 = 本年度当前人员所有已缴纳个税
@@ -704,10 +737,10 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     //累计所得额 = 本年度当前人员所有应纳税所得之和
                     BigDecimal cumulative = new BigDecimal("0");
                     List<SalaryManagementDetail> cumulativeList = salaryManagementDetailMapper.selectByUser(userId, withMonth, yearWithMonth);
-                    List<SalaryManagementWorkOvertime> cumulativeOvertimeList = salaryManagementWorkOvertimeMapper.selectByUser(userId, withMonth, yearWithMonth);
+                    List<SalaryManagementWorkOvertime> cumulativeOvertimeList = salaryManagementWorkOvertimeMapper.selectByUser(userId, withMonth, null);
                     List<SalaryManagementHoliday> holidayList = salaryManagementHolidayMapper.selectByUser(userId,withMonth);
                     //0福利现金 1年终奖 福利现金需计算工资、加班费、年休累计纳税额,且参与入其他薪资累计
-                    List<SalaryManagementExtra> extra = salaryManagementExtraMapper.selectByUser(userId,withMonth,null,"0");
+                    List<SalaryManagementExtra> extra = salaryManagementExtraMapper.selectByUser(userId,withMonth,yearWithMonth,"0");
 //                    extra = salaryManagementExtraMapper.selectByUser(userId,withMonth,yearWithMonth,"0");
 
                     //福利金
@@ -726,8 +759,15 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                         }
 
                     }
-                    sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效福利现金" + cumulativeList.size() + "条,共计金额"+extraTax+"已计入应纳税所得额与累计所得额中;");
+
+                    sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效福利现金" + extra.size() + "条,共计金额"+extraTax+"已计入应纳税所得额与累计所得额中;");
                     payTaxes = payTaxes.add(extraTax);
+
+                    if(payTaxes.compareTo(BigDecimal.ZERO) < 0){
+                        sb.append("实际应纳税所得额为"+payTaxes+"故默认为0!!");
+                        payTaxes = new BigDecimal("0");
+                    }
+
                     String payTaxesText = AesEncryptUtil.encrypt(payTaxes.toString());
                     salaryManagementDetail.setPayTaxes(payTaxesText);//应纳税所得额
 
@@ -759,7 +799,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                         }
 
                     }
-                    sb.append(withMonth+"年度,此时之前("+yearWithMonth+")有效年休工资单"+cumulativeList.size()+"条,已累计入累计所得额中;");
+                    sb.append(withMonth+"年度,此时之前("+yearWithMonth+")有效年休工资单"+holidayList.size()+"条,已累计入累计所得额中;");
 
                     if (cumulativeOvertimeList.size() > 0) {
                         for (SalaryManagementWorkOvertime detail : cumulativeOvertimeList) {
@@ -773,7 +813,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                             cumulative = cumulative.add(bigPayTaxes);
                         }
                     }
-                    sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效加班工资单" + cumulativeList.size() + "条,已累计入累计所得额中;");
+                    sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效加班工资单" + cumulativeOvertimeList.size() + "条,已累计入累计所得额中;");
                     cumulative = cumulative.add(payTaxes).setScale(2, BigDecimal.ROUND_HALF_UP);;
                     String cumulativeText = AesEncryptUtil.encrypt(cumulative.toString());
                     salaryManagementDetail.setCumulative(cumulativeText);//累计所得额
@@ -809,7 +849,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                             personalTax = new BigDecimal("0");
                         }
                     }
-
+                    personalTax = personalTax.setScale(2, BigDecimal.ROUND_HALF_UP);
                     salaryManagementDetail.setPersonalTax(personalTax);//个税
 
                     salaryManagementDetail.setLatenessCost(latenessCost);//迟到扣费
@@ -825,7 +865,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
 
                     //合计应扣 = 个税+3保险(社保)+公积金+迟到扣费+事假扣费+病假扣费
                     BigDecimal totalDeduction = new BigDecimal("0");
-                    totalDeduction = personalTax.add(socialSecurity).add(accumulationFund).add(latenessCost).add(personalCost).add(sickCost);
+                    totalDeduction = personalTax.add(socialSecurity).add(accumulationFund).add(latenessCost).add(personalCost).add(sickCost).setScale(2, BigDecimal.ROUND_HALF_UP);
 
                     salaryManagementDetail.setTotalDeduction(totalDeduction);//合计应扣
 
@@ -1007,7 +1047,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                                 cumulative = cumulative.add(bigPayTaxes);
                             }
                         }
-                        sb.append(withMonth + "年度,此时之前(" + newYear + ")有效加班工资单" + cumulativeList.size() + "条,已累计入累计所得额中;");
+                        sb.append(withMonth + "年度,此时之前(" + newYear + ")有效加班工资单" + cumulativeOvertimeList.size() + "条,已累计入累计所得额中;");
                         cumulative = cumulative.add(wages).setScale(2, BigDecimal.ROUND_HALF_UP);;
                     } else {
                         sb.append("本次应发薪资年休工资为0,不计入累计所得额中");
@@ -1046,7 +1086,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                             personalTax = new BigDecimal("0");
                         }
                     }
-
+                    personalTax = personalTax.setScale(2, BigDecimal.ROUND_HALF_UP);
                     salaryManagementHoliday.setPersonalTax(personalTax);//个税
 
                     //实发加班工资 = 加班工资 - 个税
@@ -1139,11 +1179,6 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                 List<SalaryManagementWorkOvertime> workOvertimeListNBSY = new ArrayList<>();//宁波森语
                 List<SalaryManagementWorkOvertime> workOvertimeListZZ = new ArrayList<>();//正织
 
-                List<SalaryAttendanceDetail> list = salaryAttendanceDetailMapper.selectWorkOvertime(beginMonth, endMonth);
-
-                if (list.size() < 1) {
-                    return Result.error("执行失败,没有找到" + beginMonth + "-" + endMonth + "的考勤数据!");
-                }
 
                 String salaryBase = salaryChangeRecordMapper.selectSalary();
                 if (StringUtils.isBlank(salaryBase)) {
@@ -1153,6 +1188,14 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                 String salaryBaseText = AesEncryptUtil.desEncrypt(salaryBase).trim();
 
                 BigDecimal salaryBaseBig = new BigDecimal(salaryBaseText);
+//                beginMonth = "2024-07";
+//                endMonth = "2024-12";
+                List<SalaryAttendanceDetail> list = salaryAttendanceDetailMapper.selectWorkOvertime(beginMonth, endMonth,salaryBaseBig);
+
+                if (list.size() < 1) {
+                    return Result.error("执行失败,没有找到" + beginMonth + "-" + endMonth + "的考勤数据!");
+                }
+
 
                 for (SalaryAttendanceDetail o : list) {
 
@@ -1160,9 +1203,16 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
 
                     String userId = o.getUserId();//用户主键
                     String orgName = o.getOrgName();//组织
-                    BigDecimal workingHours = o.getWorkingHours() == null ? BigDecimal.ZERO : o.getWorkingHours();//每日工时
-                    BigDecimal attendanceDays = o.getAttendanceDays() == null ? BigDecimal.ZERO : o.getAttendanceDays();//出勤天数
-                    BigDecimal workOvertime = o.getWorkOvertime() == null ? BigDecimal.ZERO : o.getWorkOvertime();//加班时间(分)
+//                    String getName = o.getName();//姓名
+//
+//                    if(getName.equals("王能")|| getName.equals("童园")){
+//                        System.out.println(111);
+//                    }
+
+//                    BigDecimal workingHours = o.getWorkingHours() == null ? BigDecimal.ZERO : o.getWorkingHours();//每日工时
+//                    BigDecimal attendanceDays = o.getAttendanceDays() == null ? BigDecimal.ZERO : o.getAttendanceDays();//出勤天数
+//                    BigDecimal workOvertime = o.getWorkOvertime() == null ? BigDecimal.ZERO : o.getWorkOvertime();//加班时间(分)
+                    BigDecimal workOverTotal = o.getFullAttendance() == null ? BigDecimal.ZERO : o.getFullAttendance();//数据库已计算好的加班工资,暂用此字段代替
 
                     SalaryManagementWorkOvertime salaryAttendanceWorkOvertime = new SalaryManagementWorkOvertime();//加班明细
                     salaryAttendanceWorkOvertime.setUserId(userId);
@@ -1173,9 +1223,9 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     salaryAttendanceWorkOvertime.setCardNo(o.getCardNo());
 
                     //加班工资 = 工资基数÷出勤天数(22or26)÷420or480(每天的上班分钟数)×加班时间分钟数
-                    BigDecimal workOverTotal = new BigDecimal("0");
-                    workOverTotal = salaryBaseBig.divide(attendanceDays, 8, BigDecimal.ROUND_HALF_UP)
-                            .divide(workingHours.multiply(new BigDecimal("60")), 8, BigDecimal.ROUND_HALF_UP).multiply(workOvertime).setScale(2, BigDecimal.ROUND_HALF_UP);;
+//                    BigDecimal workOverTotal = new BigDecimal("0");
+//                    workOverTotal = salaryBaseBig.divide(attendanceDays, 8, BigDecimal.ROUND_HALF_UP)
+//                            .divide(workingHours.multiply(new BigDecimal("60")), 8, BigDecimal.ROUND_HALF_UP).multiply(workOvertime).setScale(2, BigDecimal.ROUND_HALF_UP);
                     salaryAttendanceWorkOvertime.setWorkOvertimeCost(workOverTotal);//加班工资
 
                     String payTaxesText = AesEncryptUtil.encrypt(workOverTotal.toString());
@@ -1219,7 +1269,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                                 cumulative = cumulative.add(bigPayTaxes);
                             }
                         }
-                        sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效加班工资单" + cumulativeList.size() + "条,已累计入累计所得额中;");
+                        sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效加班工资单" + cumulativeOvertimeList.size() + "条,已累计入累计所得额中;");
 
                         if(holidayList.size() > 0){
                             for(SalaryManagementHoliday detail:holidayList){
@@ -1234,7 +1284,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                             }
 
                         }
-                        sb.append(withMonth+"年度,此时之前("+yearWithMonth+")有效年休工资单"+cumulativeList.size()+"条,已累计入累计所得额中;");
+                        sb.append(withMonth+"年度,此时之前("+yearWithMonth+")有效年休工资单"+holidayList.size()+"条,已累计入累计所得额中;");
 
                         cumulative = cumulative.add(workOverTotal).setScale(2, BigDecimal.ROUND_HALF_UP);;
                     } else {
@@ -1277,6 +1327,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                         }
                     }
 
+                    personalTax = personalTax.setScale(2, BigDecimal.ROUND_HALF_UP);
                     salaryAttendanceWorkOvertime.setPersonalTax(personalTax);//个税
 
                     //实发加班工资 = 加班工资 - 个税
@@ -1375,7 +1426,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     }else{
                         e.setCalculateDate(yearWith);
                     }
-                    e.setActionLog("计入工资单:"+type+"年度:"+yearWith+"年月:"+yearWithMonth);
+                    e.setActionLog(DateUtils.now()+"计入工资单:"+type+"年度:"+yearWith+"年月:"+yearWithMonth);
                     salaryManagementExtraMapper.updateById(e);
                 }
             }

+ 8 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/vo/ExcelDemo.java

@@ -21,5 +21,13 @@ public class ExcelDemo {
     /**序号*/
     @Excel(name = "序号", width = 15)
     private Integer index;
+
+
+    /**工资卡号*/
+    private String test;
+    /**工资卡号*/
+    private String test1;
+    /**工资*/
+    private String test2;
 }