Browse Source

薪资代码

yuansh 11 months ago
parent
commit
1a65c55f5d
24 changed files with 1396 additions and 221 deletions
  1. 10 1
      jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/api/vo/Result.java
  2. 18 1
      jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java
  3. 67 18
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/controller/SalaryAttendanceController.java
  4. 2 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/controller/SalaryChangeRecordController.java
  5. 361 73
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/controller/SalaryManagementController.java
  6. 1 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryAttendanceDetail.java
  7. 7 4
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryAttendanceHoliday.java
  8. 3 3
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryChangeRecord.java
  9. 83 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryManagementExtra.java
  10. 2 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryAttendanceDetailMapper.java
  11. 25 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryManagementExtraMapper.java
  12. 1 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryManagementMapper.java
  13. 8 1
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryAttendanceDetailMapper.xml
  14. 1 1
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryAttendanceMapper.xml
  15. 40 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryManagementExtraMapper.xml
  16. 6 1
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryManagementMapper.xml
  17. 16 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryManagementExtraService.java
  18. 10 1
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryManagementService.java
  19. 13 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryChangeRecordServiceImpl.java
  20. 27 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryManagementExtraServiceImpl.java
  21. 663 113
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryManagementServiceImpl.java
  22. 3 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/vo/ExcelDemo.java
  23. 6 4
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/vo/SalaryManagementPage.java
  24. 23 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java

+ 10 - 1
jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/api/vo/Result.java

@@ -97,6 +97,15 @@ public class Result<T> implements Serializable {
 		return r;
 	}
 
+	public static Result<Object> okAndMap(Object data,Map<String,Object> map) {
+		Result<Object> r = new Result<Object>();
+		r.setSuccess(true);
+		r.setCode(CommonConstant.SC_OK_200);
+		r.setResult(data);
+		r.setData(map);
+		return r;
+	}
+
 	public static Result<Object> ok(Object data) {
 		Result<Object> r = new Result<Object>();
 		r.setSuccess(true);
@@ -104,7 +113,7 @@ public class Result<T> implements Serializable {
 		r.setResult(data);
 		return r;
 	}
-	
+
 	public static Result<Object> error(String msg) {
 		return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg);
 	}

+ 18 - 1
jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -26,6 +26,13 @@ public class DateUtils extends PropertyEditorSupport {
             return new SimpleDateFormat("yyyy-MM-dd");
         }
     };
+
+    public static ThreadLocal<SimpleDateFormat> date_ym = new ThreadLocal<SimpleDateFormat>() {
+        @Override
+        protected SimpleDateFormat initialValue() {
+            return new SimpleDateFormat("yyyy-MM");
+        }
+    };
     public static ThreadLocal<SimpleDateFormat> yyyyMMdd = new ThreadLocal<SimpleDateFormat>() {
         @Override
         protected SimpleDateFormat initialValue() {
@@ -354,6 +361,16 @@ public class DateUtils extends PropertyEditorSupport {
         return date_sdf.get().format(getCalendar().getTime());
     }
 
+
+    /**
+     * 默认方式表示的系统当前日期,具体格式:年-月
+     *
+     * @return 默认日期按“年-月“格式显示
+     */
+    public static String date_ym() {
+        return date_ym.get().format(getCalendar().getTime());
+    }
+
     /**
      * 默认方式表示的系统当前日期,具体格式:yyyy-MM-dd HH:mm:ss
      *
@@ -648,6 +665,6 @@ public class DateUtils extends PropertyEditorSupport {
     }
 
     public static void main(String[] args) {
-        System.out.println(now());
+        System.out.println(date_ym());
     }
 }

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

@@ -14,12 +14,14 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
 import org.jeecg.common.system.vo.LoginUser;
 import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.salary.entity.*;
 import org.jeecg.modules.salary.service.*;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 import org.jeecgframework.poi.excel.entity.ExportParams;
 import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.entity.enmus.ExcelType;
 import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
 
 import org.jeecg.common.api.vo.Result;
@@ -75,6 +77,7 @@ public class SalaryAttendanceController {
                                    HttpServletRequest req) {
         salaryAttendance.setDelFlag("0");
         QueryWrapper<SalaryAttendance> queryWrapper = QueryGenerator.initQueryWrapper(salaryAttendance, req.getParameterMap());
+        queryWrapper.orderByDesc("year_with_month");
         Page<SalaryAttendance> page = new Page<SalaryAttendance>(pageNo, pageSize);
         IPage<SalaryAttendance> pageList = salaryAttendanceService.page(page, queryWrapper);
         return Result.ok(pageList);
@@ -221,7 +224,7 @@ public class SalaryAttendanceController {
 
     protected ModelAndView exportXlsView(HttpServletRequest request, SalaryAttendance object) {
         // Step.1 组装查询条件
-        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
 
         // Step.3 AutoPoi 导出Excel
         ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
@@ -236,7 +239,7 @@ public class SalaryAttendanceController {
             mv.addObject(NormalExcelConstants.CLASS, SalaryAttendanceDetail.class);
 
             mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
-            mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+            mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表",  title, ExcelType.XSSF));
 
         }else if(type.equals("加班表")){
             // Step.2 获取导出数据
@@ -246,7 +249,7 @@ public class SalaryAttendanceController {
             mv.addObject(NormalExcelConstants.CLASS, SalaryAttendanceWorkOvertime.class);
 
             mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
-            mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+            mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表",  title, ExcelType.XSSF));
 
         }else if(type.equals("年休表")){
             // Step.2 获取导出数据
@@ -256,7 +259,7 @@ public class SalaryAttendanceController {
             mv.addObject(NormalExcelConstants.CLASS, SalaryAttendanceHoliday.class);
 
             mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
-            mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+            mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表",  title, ExcelType.XSSF));
 
         }
         return mv;
@@ -269,7 +272,7 @@ public class SalaryAttendanceController {
      * @param type
      * @return
      */
-     public boolean 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);
@@ -282,7 +285,11 @@ public class SalaryAttendanceController {
                  Iterator<Cell> cellIterator = headerRow.cellIterator();
                  while (cellIterator.hasNext()) {
                      Cell cell = cellIterator.next();
-                     header.add(cell.getStringCellValue());
+                     try {
+                         header.add(cell.getStringCellValue());
+                     }catch (Exception x){
+                         throw new RuntimeException("导入模板中表头字段:"+cell.toString()+"无法与系统匹配!"+x.getMessage());
+                     }
                  }
              }
          }
@@ -290,7 +297,7 @@ public class SalaryAttendanceController {
              String fileName = "编号,姓名,工资卡号,单双休,每日工时,出勤天数,话费补贴,午餐补贴,住房补贴,交通补贴,全勤奖,养老保险,失业保险,医疗保险,公积金,工资抵扣,迟到次数,迟到扣费,事假时间(分),病假时间(分),婚假时间(分),丧假时间(分),年假时间(天),加班时间(分)";
              for(String o:fileName.split(",")){
                 if(!header.contains(o)){
-                    return false;
+                    return o;
                 }
 
              }
@@ -298,22 +305,25 @@ public class SalaryAttendanceController {
              String fileName = "编号,姓名,工资卡号,单双休,工时/天,年假天数,已请天数,剩余天数";
              for(String o:fileName.split(",")){
                  if(!header.contains(o)){
-                     return false;
+                     return o;
                  }
 
              }
          }else{
-             return false;
+             return "类型异常";
          }
-         return true;
+         return "true";
      }
 
     public static void main(String[] args) {
-        List<String> header = new ArrayList<>();
-        header.add("编号");
-        header.add("姓名");
-        header.add("工资卡号");
-        System.out.println(header.toString());
+//        List<String> header = new ArrayList<>();
+//        header.add("编号");
+//        header.add("姓名");
+//        header.add("工资卡号");
+//        String aa = "2022-12".substring(0, 4);
+//        System.out.println(aa);
+        DateUtils.getYear();
+        System.out.println(DateUtils.getYear());
     }
 
     /**
@@ -330,6 +340,43 @@ public class SalaryAttendanceController {
             return Result.error("参数异常:年月或类型为空!!");
         }
 
+        if(StringUtils.isEmpty(salaryAttendance.getId()) || "false".equals(salaryAttendance.getId())){
+            QueryWrapper<SalaryAttendance> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("del_flag", "0");
+            if(salaryAttendance.getType().equals("年休表")){
+                salaryAttendance.setType("年休表");
+                salaryAttendance.setYearWithMonth(salaryAttendance.getYearWithMonth().substring(0, 4));
+                queryWrapper.likeRight("year_with_month",salaryAttendance.getYearWithMonth());
+            }else if(salaryAttendance.getType().equals("考勤表")){
+                salaryAttendance.setType("考勤表");
+                queryWrapper.eq("year_with_month", salaryAttendance.getYearWithMonth());
+            }else{
+                return Result.error("操作频繁:请刷新后重试!!");
+            }
+
+            queryWrapper.eq("type", salaryAttendance.getType().trim());
+            List<SalaryAttendance> list = salaryAttendanceService.list(queryWrapper);
+            if(list.size() > 0){
+                return Result.error("系统中已含有"+salaryAttendance.getYearWithMonth()+salaryAttendance.getType()+",若要覆盖请选中覆盖上传选项!");
+            }
+        }
+
+        //考勤表也不允许后份生成后,重新更新之前数据,(该问题最后更新)
+//        QueryWrapper<SalaryAttendance> queryWrapper1 = new QueryWrapper<>();
+//        queryWrapper1.eq("del_flag", "0");
+//        if(salaryAttendance.getType().equals("年休表")){
+//            salaryAttendance.setYearWithMonth(salaryAttendance.getYearWithMonth().substring(0, 4));
+//            queryWrapper1.gt("year_with_month",salaryAttendance.getYearWithMonth());
+//        }else{
+//            queryWrapper1.gt("year_with_month", salaryAttendance.getYearWithMonth());
+//        }
+//
+//        queryWrapper1.eq("type", salaryAttendance.getType());
+//        List<SalaryAttendance> list1 = salaryAttendanceService.list(queryWrapper1);
+//        if(list1.size() > 0){
+//            return Result.error("后续考勤已导入,无法导入此月考勤数据!!");
+//        }
+
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
@@ -339,9 +386,9 @@ public class SalaryAttendanceController {
             params.setHeadRows(1);
             params.setNeedSave(false);
 
-            boolean st = this.ifExist(file,salaryAttendance.getType());
-            if(!st){
-                return Result.error("导入模板异常,请勿增删改导入模板的字段!!");
+            String st = this.ifExist(file,salaryAttendance.getType());
+            if(!"true".equals(st)){
+                return Result.error("未在模板中找到"+st+"字段,请勿增删改导入模板的字段!!");
             }
 
             salaryAttendance.setName(file.getOriginalFilename());
@@ -417,6 +464,8 @@ public class SalaryAttendanceController {
                 }
                 else if(salaryAttendance.getType().equals("年休表")){
 
+                    salaryAttendance.setYearWithMonth(salaryAttendance.getYearWithMonth().substring(0, 4));
+
                     List<SalaryAttendanceHoliday> list = ExcelImportUtil.importExcel(file.getInputStream(), SalaryAttendanceHoliday.class, params);
 
                     for (SalaryAttendanceHoliday page : list) {

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

@@ -84,7 +84,9 @@ public class SalaryChangeRecordController extends JeecgController<SalaryChangeRe
                                    HttpServletRequest req) {
         QueryWrapper<SalaryChangeRecord> queryWrapper = QueryGenerator.initQueryWrapper(salaryChangeRecord, req.getParameterMap());
         Page<SalaryChangeRecord> page = new Page<SalaryChangeRecord>(pageNo, pageSize);
+        queryWrapper.orderByDesc("create_time");
         IPage<SalaryChangeRecord> pageList = salaryChangeRecordService.page(page, queryWrapper);
+
         for (SalaryChangeRecord o : pageList.getRecords()) {
             try {
                 String salaryReduction = o.getSalaryReduction();//降薪额度

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

@@ -1,29 +1,25 @@
 package org.jeecg.modules.salary.controller;
 
 import java.io.*;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
 import java.net.*;
 import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import cn.hutool.core.io.resource.ClassPathResource;
 import org.apache.commons.lang.StringUtils;
-import org.apache.poi.hssf.usermodel.HSSFRow;
-import org.apache.poi.hssf.usermodel.HSSFSheet;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.*;
 import org.jeecg.common.system.vo.LoginUser;
 import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.SqlInjectionUtil;
 import org.jeecg.common.util.encryption.AesEncryptUtil;
 import org.jeecg.modules.salary.entity.*;
 import org.jeecg.modules.salary.service.*;
 import org.jeecg.modules.salary.vo.ExcelDemo;
-import org.jeecgframework.poi.excel.ExcelExportUtil;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 import org.jeecgframework.poi.excel.def.TemplateExcelConstants;
@@ -34,12 +30,10 @@ import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
 
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.salary.vo.SalaryManagementPage;
 import org.jeecgframework.poi.excel.view.JeecgTemplateExcelView;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.multipart.MultipartFile;
@@ -69,6 +63,8 @@ public class SalaryManagementController {
     @Autowired
     private ISalaryManagementHolidayService salaryManagementHolidayService;
     @Autowired
+    private ISalaryManagementExtraService salaryManagementExtraService;
+    @Autowired
     private ISalaryChangeRecordService salaryChangeRecordService;
 
     /**
@@ -85,11 +81,21 @@ public class SalaryManagementController {
                                    @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                    @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                    HttpServletRequest req) {
+        String year = "";
+        if (StringUtils.isNotEmpty(salaryManagement.getYearWith())) {
+            year = salaryManagement.getYearWith();
+            salaryManagement.setYearWith(null);
+        }
         salaryManagement.setDelFlag("0");
         QueryWrapper<SalaryManagement> queryWrapper = QueryGenerator.initQueryWrapper(salaryManagement, req.getParameterMap());
         queryWrapper.ne("salary", "nghotxDTNyeHgH0mlfbJig==");
         queryWrapper.ne("salary", "HV3ndEx8HV9kd1WNbxLgwg==");
-        Page<SalaryManagement> page = new Page<SalaryManagement>(pageNo, pageSize);
+        if (StringUtils.isNotEmpty(year)) {
+            queryWrapper.likeRight("year_with_month", year);
+        }
+        queryWrapper.orderByDesc("year_with_month");
+        queryWrapper.orderByDesc("org_name");
+        Page<SalaryManagement> page = new Page<>(pageNo, pageSize);
         IPage<SalaryManagement> pageList = salaryManagementService.page(page, queryWrapper);
         for (SalaryManagement o : pageList.getRecords()) {
             try {
@@ -121,7 +127,7 @@ public class SalaryManagementController {
     public Result<?> querySalaryTotalList(
             @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
             @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
-            SalaryChangeRecord userParams, HttpServletRequest req) {
+            SalaryChangeRecord userParams, HttpServletRequest req) throws IllegalAccessException {
 
         String beginDate = userParams.getBeginDate();
         String endDate = userParams.getEndDate();
@@ -165,17 +171,41 @@ public class SalaryManagementController {
         }
         userParams.setSqlParameter(sql);
         Page page = new Page(pageNo, pageSize);
+        Page page2 = new Page(1, 999);
         IPage<SalaryChangeRecord> pageList = salaryChangeRecordService.selectUserInfo2(userParams, page);
+        IPage<SalaryChangeRecord> pageList2 = salaryChangeRecordService.selectUserInfo2(userParams, page2);
 
         salaryManagementService.querySalaryTotalList(pageList.getRecords(), userParams);
 
-        return Result.ok(pageList);
+        SalaryChangeRecord ent = new SalaryChangeRecord();
+        ent.setBeginDate(beginDate);
+        ent.setEndDate(endDate);
+        salaryManagementService.querySalaryTotalList(pageList2.getRecords(), ent);
+        Map<String, Object> map = new HashMap<>();
+        for (Field field : ent.getClass().getDeclaredFields()) {
+            field.setAccessible(true);
+            map.put(field.getName(), field.get(ent));
+        }
+//        return Result.ok(pageList);
+        return Result.okAndMap(pageList, map);
 
     }
 
 
-    public static void main(String[] args) throws IOException {
-        getV4IP();
+    public static void main(String[] args) throws IOException, IllegalAccessException {
+//        SalaryChangeRecord userParams = new SalaryChangeRecord();
+//        userParams.setId("sssss");
+//        Map<String, Object> map = new HashMap<>();
+//        for (Field field : userParams.getClass().getDeclaredFields()) {
+//            field.setAccessible(true);
+//            map.put(field.getName(), field.get(userParams));
+//        }
+        if("使用请ssss".contains("请")){
+            System.out.println(1111);
+        }
+        System.out.println(222);
+
+//        getV4IP();
 //        System.out.println(1);
 //		Runtime runtime = Runtime.getRuntime();
 //
@@ -256,6 +286,7 @@ public class SalaryManagementController {
 
     /**
      * 通过id查询
+     * 月度工资单
      *
      * @param id
      * @return
@@ -347,6 +378,37 @@ public class SalaryManagementController {
     }
 
 
+    /**
+     * 通过id查询
+     * 0福利现金 / 1年终奖
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/querySalaryManagementExtraListByMainId")
+    public Result<?> querySalaryManagementExtraListByMainId(@RequestParam(name = "id", required = true) String id, String name, String type) {
+        List<SalaryManagementExtra> salaryManagementExtraList = salaryManagementExtraService.selectByMainId(id, name, type);
+
+        try {
+            salaryManagementExtraList.removeIf(item -> item.getBeforeTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+            for (SalaryManagementExtra o : salaryManagementExtraList) {
+                String beforeTaxAmount = o.getBeforeTaxAmount();
+                String afterTaxAmount = o.getAfterTaxAmount();
+                if (StringUtils.isNotBlank(beforeTaxAmount)) {
+                    o.setBeforeTaxAmount(AesEncryptUtil.desEncrypt(beforeTaxAmount).trim());
+                }
+                if (StringUtils.isNotBlank(afterTaxAmount)) {
+                    o.setAfterTaxAmount(AesEncryptUtil.desEncrypt(afterTaxAmount).trim());
+                }
+
+            }
+        } catch (Exception e) {
+            System.out.println("解密失败!!");
+        }
+        return Result.ok(salaryManagementExtraList);
+    }
+
 
     /**
      * 生成工资单
@@ -360,6 +422,18 @@ public class SalaryManagementController {
         return result;
     }
 
+    /**
+     * 生成工资单前校验
+     *
+     * @param salaryManagement
+     * @return
+     */
+    @PostMapping(value = "/generatePayrollBefore")
+    public Result<?> generatePayrollBefore(@RequestBody SalaryManagement salaryManagement) {
+        Result<?> result = salaryManagementService.generatePayrollBefore(salaryManagement);
+        return result;
+    }
+
 
     /**
      * 导出excel
@@ -450,6 +524,49 @@ public class SalaryManagementController {
                 mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
                 mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
 
+            } else if (type.equals("福利现金")) {
+                title = "福利现金";
+                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(object.getId(), null,"0");
+                exportList.removeIf(item -> item.getAfterTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+                for (SalaryManagementExtra o : exportList) {
+                    String getAfterTaxAmount = o.getAfterTaxAmount();
+                    String getBeforeTaxAmount = o.getBeforeTaxAmount();
+                    if (StringUtils.isNotBlank(getAfterTaxAmount)) {
+                        o.setAfterTaxAmount(AesEncryptUtil.desEncrypt(getAfterTaxAmount).trim());
+                    }
+                    if (StringUtils.isNotBlank(getBeforeTaxAmount)) {
+                        o.setBeforeTaxAmount(AesEncryptUtil.desEncrypt(getBeforeTaxAmount).trim());
+                    }
+                }
+                mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+                mv.addObject(NormalExcelConstants.CLASS, SalaryManagementExtra.class);
+
+                mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
+                mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+
+            } else if (type.equals("年终奖")) {
+                title = "年终奖";
+
+                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(object.getId(), null,"0");
+                exportList.removeIf(item -> item.getAfterTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+                for (SalaryManagementExtra o : exportList) {
+                    String getAfterTaxAmount = o.getAfterTaxAmount();
+                    String getBeforeTaxAmount = o.getBeforeTaxAmount();
+                    if (StringUtils.isNotBlank(getAfterTaxAmount)) {
+                        o.setAfterTaxAmount(AesEncryptUtil.desEncrypt(getAfterTaxAmount).trim());
+                    }
+                    if (StringUtils.isNotBlank(getBeforeTaxAmount)) {
+                        o.setBeforeTaxAmount(AesEncryptUtil.desEncrypt(getBeforeTaxAmount).trim());
+                    }
+                }
+                mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+                mv.addObject(NormalExcelConstants.CLASS, SalaryManagementExtra.class);
+
+                mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
+                mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+
             }
 
         } catch (Exception e) {
@@ -460,29 +577,116 @@ public class SalaryManagementController {
 
     /**
      * 通过excel导入数据
+     * 福利现金 年终奖
      *
      * @param request
      * @param response
      * @return
      */
     @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response, SalaryManagement salaryManagement) throws IOException, InvalidFormatException {
+
+        if (StringUtils.isEmpty(salaryManagement.getType())) {
+            return Result.error("参数异常:类型为空!!");
+        }
+        salaryManagement.setYearWithMonth(DateUtils.date_ym());
+
+        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("福利现金".equals(salaryManagement.getType())){
+            QueryWrapper<SalaryManagementExtra> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("del_flag", "0");
+            queryWrapper.eq("year_with_month", salaryManagement.getYearWithMonth());
+            //0福利现金 1年终奖
+            queryWrapper.eq("type", "0");
+            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()+"),无法覆盖!");
+            }
+
+        }
+
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
             MultipartFile file = entity.getValue();// 获取上传文件对象
             ImportParams params = new ImportParams();
-            params.setTitleRows(2);
+            params.setTitleRows(1);
             params.setHeadRows(1);
-            params.setNeedSave(true);
+            params.setNeedSave(false);
+
+            String st = this.ifExist(file,salaryManagement.getType());
+            if (!"true".equals(st)) {
+                if(st.contains("请")){
+                    return Result.error(st);
+                }
+                return Result.error("未在模板中找到" + st + "字段,请勿增删改导入模板的字段!!");
+            }
+
             try {
-                List<SalaryManagementPage> list = ExcelImportUtil.importExcel(file.getInputStream(), SalaryManagementPage.class, params);
-                for (SalaryManagementPage page : list) {
-                    SalaryManagement po = new SalaryManagement();
-                    BeanUtils.copyProperties(page, po);
-                    salaryManagementService.saveMain(po, page.getSalaryManagementDetailList());
+
+                List<SalaryManagementExtra> detailList = new ArrayList<>();
+
+                List<SalaryManagementExtra> list = ExcelImportUtil.importExcel(file.getInputStream(), SalaryManagementExtra.class, params);
+
+                for (SalaryManagementExtra page : list) {
+
+                    String name = page.getName();//员工姓名
+                    String cardNo = page.getCardNo();//卡号
+                    String beforeTaxAmount = page.getBeforeTaxAmount();//税前金额
+
+                    if (StringUtils.isEmpty(name) || StringUtils.isEmpty(cardNo)) {
+                        continue;
+                    }
+                    if (StringUtils.isEmpty(beforeTaxAmount)) {
+                        return Result.error("文件导入失败!" + name + "+" + cardNo + "组合,税前金额不能为空!");
+                    }
+
+                    try {
+                        new BigDecimal(beforeTaxAmount);
+                    }catch (Exception ex){
+                        return Result.error("文件导入失败!" + name + "+" + cardNo + "组合,税前金额无转换成数字!");
+                    }
+
+                    List<SalaryChangeRecord> userList = salaryChangeRecordService.selectUserByPar(name.trim(), cardNo.trim());
+                    if (userList.size() < 1) {
+                        return Result.error("文件导入失败!" + name + "+" + cardNo + "组合,无法在查找到数据!");
+                    }
+
+                    SalaryChangeRecord entry = userList.get(0);
+
+                    page.setCode(entry.getCode());
+                    page.setUserId(entry.getUserId());
+                    page.setOrgName(entry.getOrgName());
+                    page.setYearWithMonth(salaryManagement.getYearWithMonth());
+
+                    if(salaryManagement.getType().equals("福利现金")){
+                        page.setType("0");//福利现金
+                    }else{
+                        page.setType("1");//年终奖
+                    }
+                    detailList.add(page);
                 }
-                return Result.ok("文件导入成功!数据行数:" + list.size());
+
+                if (detailList.size() > 0) {
+                    salaryManagementService.saveMainExtra(salaryManagement,detailList);
+                } else {
+                    return Result.error("文件导入失败:导入模板不正确或者导入数据为空!");
+                }
+
+                return Result.ok("文件导入成功!合法数据行数:" + detailList.size());
             } catch (Exception e) {
                 log.error(e.getMessage(), e);
                 return Result.error("文件导入失败:" + e.getMessage());
@@ -497,46 +701,6 @@ public class SalaryManagementController {
         return Result.ok("文件导入失败!");
     }
 
-    /**
-     * 测试导出全部excel(无用)
-     *
-     * @param request
-     * @param response
-     */
-    @RequestMapping(value = "/exportXls3111111")
-    public ModelAndView exportAllXls(HttpServletRequest request, HttpServletResponse response) {
-        // Step.1 组装查询条件
-
-        List<ExcelDemo> list = new ArrayList<>();
-        // Step.3 查询信息并转换为map
-        ExcelDemo classInfoVO = new ExcelDemo();
-        classInfoVO.setCardNo("ssssss");
-        classInfoVO.setName("sasdasdasd");
-        list.add(classInfoVO);
-        list.add(classInfoVO);
-        list.add(classInfoVO);
-        Map map = JSON.parseObject(JSON.toJSONString(classInfoVO), Map.class);
-        // Step.4 循环list并转换为map
-        List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>(); //模板写法
-        for (ExcelDemo s : list) {
-            //date 转string
-            Map m = JSON.parseObject(JSON.toJSONString(s), Map.class);
-
-            listMap.add(m);
-        }
-        map.put("list", listMap);
-        //Step.4 AutoPoi 导出Excel
-        TemplateExportParams params = new TemplateExportParams();
-//            params.setTemplateUrl(uploadpath + File.separator  + "template" + File.separator + "moban.xlsx");
-        params.setTemplateUrl("D:\\test.xlsx");
-        ModelAndView mv = new ModelAndView(new JeecgTemplateExcelView());
-        mv.addObject(TemplateExcelConstants.PARAMS, params);
-        mv.addObject(TemplateExcelConstants.MAP_DATA, map);
-        mv.addObject(NormalExcelConstants.FILE_NAME, "导出数据");
-        return mv;
-
-    }
-
 
     /**
      * 工资单模板导出excel
@@ -555,15 +719,17 @@ public class SalaryManagementController {
             String org = "";
             String month = "";
             List<ExcelDemo> list = new ArrayList<>();
-
+            int index = 0;
             if (type.equals("月度工资单")) {
                 title = "月度工资单";
                 List<SalaryManagementDetail> exportList = salaryManagementDetailService.selectByMainId(salaryManagement.getId(), null);
                 exportList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
 
                 for (SalaryManagementDetail o : exportList) {
+                    index++;
                     ExcelDemo demo = new ExcelDemo();
-                    demo.setCode(o.getCode());
+//                    demo.setCode(o.getCode());
+                    demo.setCode(String.valueOf(index));
                     demo.setName(o.getName());
                     demo.setCardNo(o.getCardNo());
                     String actualOccurrence = o.getActualOccurrence();
@@ -586,9 +752,10 @@ public class SalaryManagementController {
                 exportList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
 
                 for (SalaryManagementWorkOvertime o : exportList) {
-
+                    index++;
                     ExcelDemo demo = new ExcelDemo();
-                    demo.setCode(o.getCode());
+//                    demo.setCode(o.getCode());
+                    demo.setCode(String.valueOf(index));
                     demo.setName(o.getName());
                     demo.setCardNo(o.getCardNo());
                     String actualOccurrence = o.getActualOccurrence();
@@ -610,9 +777,10 @@ public class SalaryManagementController {
                 exportList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
 
                 for (SalaryManagementHoliday o : exportList) {
-
+                    index++;
                     ExcelDemo demo = new ExcelDemo();
-                    demo.setCode(o.getCode());
+//                    demo.setCode(o.getCode());
+                    demo.setCode(String.valueOf(index));
                     demo.setName(o.getName());
                     demo.setCardNo(o.getCardNo());
                     String actualOccurrence = o.getActualOccurrence();
@@ -628,6 +796,56 @@ public class SalaryManagementController {
                     month = exportList.get(0).getYearWithMonth();
                 }
 
+            } else if (type.equals("福利现金")) {
+                title = "福利现金";
+
+                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(salaryManagement.getId(), null,"0");
+                exportList.removeIf(item -> item.getAfterTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+                for (SalaryManagementExtra o : exportList) {
+                    index++;
+                    ExcelDemo demo = new ExcelDemo();
+                    demo.setCode(String.valueOf(index));
+                    demo.setName(o.getName());
+                    demo.setCardNo(o.getCardNo());
+                    String actualOccurrence = o.getAfterTaxAmount();
+                    if (StringUtils.isNotBlank(actualOccurrence)) {
+                        demo.setWages(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                    }
+                    list.add(demo);
+
+                }
+
+                if (exportList.size() > 0) {
+                    org = exportList.get(0).getOrgName();
+                    month = exportList.get(0).getYearWithMonth();
+                }
+
+            } else if (type.equals("年终奖")) {
+                title = "年终奖";
+
+                List<SalaryManagementExtra> exportList = salaryManagementExtraService.selectByMainId(salaryManagement.getId(), null,"1");
+                exportList.removeIf(item -> item.getAfterTaxAmount().equals("nghotxDTNyeHgH0mlfbJig==") || item.getAfterTaxAmount().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+                for (SalaryManagementExtra o : exportList) {
+                    index++;
+                    ExcelDemo demo = new ExcelDemo();
+                    demo.setCode(String.valueOf(index));
+                    demo.setName(o.getName());
+                    demo.setCardNo(o.getCardNo());
+                    String actualOccurrence = o.getAfterTaxAmount();
+                    if (StringUtils.isNotBlank(actualOccurrence)) {
+                        demo.setWages(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                    }
+                    list.add(demo);
+
+                }
+
+                if (exportList.size() > 0) {
+                    org = exportList.get(0).getOrgName();
+                    month = exportList.get(0).getYearWithMonth();
+                }
+
             }
 
             ExcelDemo demo = new ExcelDemo();
@@ -638,8 +856,13 @@ public class SalaryManagementController {
             map.put("list", list);
 
             TemplateExportParams params = new TemplateExportParams();
-            params.setTemplateUrl("D:\\service\\oa\\银行导出模板.xlsx");
-//            params.setTemplateUrl("D:\\银行导出模板.xlsx");
+            if (org.equals("正织")) {
+                params.setTemplateUrl("D:\\service\\oa\\宁波银行导出模板.xls");
+//                params.setTemplateUrl("D:\\宁波银行导出模板.xls");
+            } else {
+                params.setTemplateUrl("D:\\service\\oa\\中国银行导出模板.xls");
+//                params.setTemplateUrl("D:\\中国银行导出模板.xls");
+            }
 
             mv.addObject(TemplateExcelConstants.PARAMS, params);
             mv.addObject(TemplateExcelConstants.MAP_DATA, map);
@@ -736,4 +959,69 @@ public class SalaryManagementController {
     }
 
 
+    /**
+     * 校验导入模板是否完整
+     *
+     * @param file
+     * @return
+     */
+    public String ifExist(MultipartFile file,String type) throws IOException, InvalidFormatException {
+
+        Workbook workbook = WorkbookFactory.create(file.getInputStream());
+        Sheet sheet = workbook.getSheetAt(0);
+        Iterator<Row> rowIterator = sheet.iterator();
+        List<String> header = new ArrayList<>();
+        List<String> header1 = new ArrayList<>();
+        if (rowIterator.hasNext()) {
+            Row headerRow1 = rowIterator.next();
+            if (rowIterator.hasNext()) {
+                Iterator<Cell> cellIterator = headerRow1.cellIterator();
+                while (cellIterator.hasNext()) {
+                    Cell cell = cellIterator.next();
+                    try {
+                        if(StringUtils.isNotBlank(cell.getStringCellValue())){
+                            header1.add(cell.getStringCellValue());
+                        }
+                    } catch (Exception x) {
+                        throw new RuntimeException("导入模板中表头字段:" + cell.toString() + "无法与系统匹配!" + x.getMessage());
+                    }
+                }
+            }
+            Row headerRow = rowIterator.next();
+            if (rowIterator.hasNext()) {
+//                headerRow = rowIterator.next();
+                Iterator<Cell> cellIterator = headerRow.cellIterator();
+                while (cellIterator.hasNext()) {
+                    Cell cell = cellIterator.next();
+                    try {
+                        header.add(cell.getStringCellValue());
+                    } catch (Exception x) {
+                        throw new RuntimeException("导入模板中表头字段:" + cell.toString() + "无法与系统匹配!" + x.getMessage());
+                    }
+                }
+            }
+        }
+
+        if(type.equals("福利现金") && !header1.get(0).equals("福利现金导入模板")){
+
+            return "请使用福利现金导入模板";
+
+        }
+        if(type.equals("年终奖") && !header1.get(0).equals("年终奖导入模板")){
+
+            return "请使用年终奖导入模板";
+
+        }
+
+        String fileName = "姓名,工资卡号,金额";
+        for (String o : fileName.split(",")) {
+            if (!header.contains(o)) {
+                return o;
+            }
+
+        }
+
+        return "true";
+    }
+
 }

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

@@ -127,5 +127,6 @@ public class SalaryAttendanceDetail implements Serializable {
 	/**年月*/
 	private String version;
 	/**备注*/
+	@Excel(name = "备注", width = 15)
 	private String remarks;
 }

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

@@ -55,6 +55,12 @@ public class SalaryAttendanceHoliday implements Serializable {
 	/**工资卡号*/
     @Excel(name = "工资卡号", width = 30)
 	private String cardNo;
+	/**单双休*/
+	@Excel(name = "单双休", width = 15)
+	private String restMode;
+	/**工时/天*/
+	@Excel(name = "工时/天", width = 15)
+	private java.math.BigDecimal workingHours;
 	/**年假天数*/
     @Excel(name = "年假天数", width = 15)
 	private java.math.BigDecimal annualLeave;
@@ -70,8 +76,5 @@ public class SalaryAttendanceHoliday implements Serializable {
 	private String yearWithMonth;
 	/**版本*/
 	private String version;
-	/**单双休*/
-	private String restMode;
-	/**工时/天*/
-	private java.math.BigDecimal workingHours;
+
 }

+ 3 - 3
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryChangeRecord.java

@@ -112,7 +112,7 @@ public class SalaryChangeRecord implements Serializable {
 
 	/**基本薪资*/
 	@TableField(exist = false)
-	private java.lang.String wages;
+	private java.math.BigDecimal wages;
 	/**话费补贴*/
 	@TableField(exist = false)
 	private java.math.BigDecimal phoneBill;
@@ -136,7 +136,7 @@ public class SalaryChangeRecord implements Serializable {
 	private java.math.BigDecimal yearSalary;
 	/**合计应发*/
 	@TableField(exist = false)
-	private java.lang.String totalPayable;
+	private java.math.BigDecimal totalPayable;
 
 	/**社保*/
 	@TableField(exist = false)
@@ -167,7 +167,7 @@ public class SalaryChangeRecord implements Serializable {
 	private java.math.BigDecimal totalDeduction;
 	/**实发合计*/
 	@TableField(exist = false)
-	private java.lang.String actualOccurrence;
+	private java.math.BigDecimal actualOccurrence;
 
 	//在职状态
 	@TableField(exist = false)

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

@@ -0,0 +1,83 @@
+package org.jeecg.modules.salary.entity;
+
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import java.util.Date;
+
+/**
+ * @Description: 薪资管理子表-福利现金/年终奖
+ * @Author: jeecg-boot
+ * @Date:   2024-05-06
+ * @Version: V1.0
+ */
+@Data
+@TableName("salary_management_extra")
+public class SalaryManagementExtra implements Serializable {
+    private static final long serialVersionUID = 1L;
+    
+	/**主键*/
+	@TableId(type = IdType.ID_WORKER_STR)
+	private String id;
+	/**创建人登录名称*/
+	private String createBy;
+	/**创建日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+	/**更新人登录名称*/
+	private String updateBy;
+	/**更新日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+	/**删除标记*/
+	private String delFlag;
+	/**所属部门*/
+	private String sysOrgCode;
+	/**主表主键*/
+	private String headId;
+	/**用户主键*/
+	private String userId;
+	/**员工编号*/
+	private String code;
+	/**员工姓名*/
+    @Excel(name = "姓名", width = 15)
+	private String name;
+	/**组织*/
+	private String orgName;
+	/**工资卡号*/
+    @Excel(name = "工资卡号", width = 25)
+	private String cardNo;
+	/**年月*/
+	private String yearWithMonth;
+	/**税前工资(加密)*/
+    @Excel(name = "金额", width = 15)
+	private String beforeTaxAmount;
+	/**税后工资(加密)*/
+    @Excel(name = "税后金额", width = 15)
+	private String afterTaxAmount;
+	/**0福利现金 1年终奖*/
+	private String type;
+	/**版本*/
+	private String version;
+	/**应纳税所得额*/
+	private String payTaxes;
+	/**累计所得额*/
+	private String cumulative;
+	/**个税*/
+	private java.math.BigDecimal personalTax;
+	/**累计纳税额*/
+	private String cumulativeTax;
+	/**计入工资月*/
+	private String calculateDate;
+	/**0未计算,1计算*/
+	private String calculate;
+	/**执行日志*/
+	private String actionLog;
+}

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

@@ -20,4 +20,6 @@ public interface SalaryAttendanceDetailMapper extends BaseMapper<SalaryAttendanc
 													   @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> selectListByDate(String yearWithMonth);
 }

+ 25 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryManagementExtraMapper.java

@@ -0,0 +1,25 @@
+package org.jeecg.modules.salary.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.salary.entity.SalaryManagementExtra;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 薪资管理子表-福利现金/年终奖
+ * @Author: jeecg-boot
+ * @Date:   2024-05-06
+ * @Version: V1.0
+ */
+public interface SalaryManagementExtraMapper extends BaseMapper<SalaryManagementExtra> {
+
+	public boolean deleteByMainId(String mainId);
+    
+	public List<SalaryManagementExtra> selectByMainId(@Param("id")String mainId,@Param("name")String name,@Param("type")String type);
+
+	public List<SalaryManagementExtra> selectByUser(@Param("userId")String userId, @Param("yearWithMonth")String yearWithMonth, @Param("yearWithMonthNow")String yearWithMonthNow,@Param("type")String type);
+
+	public List<SalaryManagementExtra> selectByUserTotal(@Param("userId")String userId, @Param("beginDate")String beginDate, @Param("endDate")String endDate,@Param("type")String type);
+
+}

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

@@ -19,5 +19,6 @@ public interface SalaryManagementMapper extends BaseMapper<SalaryManagement> {
     int deleteVersionDetail(@Param("yearWithMonth") String yearWithMonth,@Param("version") int version);
     int deleteVersionHoliday(@Param("yearWith") String yearWith,@Param("version") int version);
     int deleteVersionOvertime(@Param("yearWithMonth") String yearWithMonth,@Param("version") int version);
+    int deleteVersionExtra(@Param("yearWithMonth") String yearWithMonth,@Param("type") String type,@Param("version") int version);
 
 }

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

@@ -9,8 +9,15 @@
 			 head_id = #{id} 		
 	</delete>
 	
+	<select id="selectListByDate" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryAttendanceDetail">
+		SELECT b.adjustment "wages",a.*
+		FROM  salary_attendance_detail a
+		left join sys_user b on a.user_id = b.id
+		where a.del_flag=0
+			AND a.year_With_Month = #{yearWithMonth}
+	</select>
 	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryAttendanceDetail">
-		SELECT * 
+		SELECT *
 		FROM  salary_attendance_detail a
 		WHERE
 			 a.head_id = #{id} and a.del_flag = 0

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

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.salary.mapper.SalaryAttendanceMapper">
     <select id="selectVersion" resultType="int">
-        select sum(version) from salary_attendance where del_flag =0 and type =#{type} and year_with_month =#{yearWithMonth}
+        select version from salary_attendance where del_flag =0 and type =#{type} and year_with_month =#{yearWithMonth} limit 1
     </select>
 
     <delete id="deleteVersion">

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

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.salary.mapper.SalaryManagementExtraMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE 
+		FROM  salary_management_extra 
+		WHERE
+			 head_id = #{id} 		
+	</delete>
+	
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryManagementExtra">
+		SELECT * 
+		FROM  salary_management_extra
+		WHERE
+			 head_id = #{id} and type = #{type}
+		<if test="name != null and name != ''">
+			AND name LIKE '%${name}%'
+		</if>
+		order by substring_index(code, '-', 1) + 0 ASC,code
+	</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
+		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}
+		and user_id = #{userId} and year_with_month BETWEEN #{beginDate} and #{endDate}
+
+	</select>
+
+
+</mapper>

+ 6 - 1
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryManagementMapper.xml

@@ -3,7 +3,7 @@
 <mapper namespace="org.jeecg.modules.salary.mapper.SalaryManagementMapper">
 
     <select id="selectVersion" resultType="int">
-        select sum(version) from salary_management where del_flag =0 and type =#{type} and year_with_month =#{yearWithMonth}
+        select version from salary_management where del_flag =0 and type =#{type} and year_with_month =#{yearWithMonth} limit 1
     </select>
 
     <delete id="deleteVersion">
@@ -25,4 +25,9 @@
         update salary_management_work_overtime set del_flag = 1 where del_flag =0 and year_with_month =#{yearWithMonth}
                                                                   and version &lt; #{version}
     </delete>
+
+    <delete id="deleteVersionExtra">
+        update salary_management_extra set del_flag = 1 where del_flag =0 and year_with_month =#{yearWithMonth} and type =#{type}
+                                                                  and version &lt; #{version}
+    </delete>
 </mapper>

+ 16 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryManagementExtraService.java

@@ -0,0 +1,16 @@
+package org.jeecg.modules.salary.service;
+
+import org.jeecg.modules.salary.entity.SalaryManagementExtra;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * @Description: 薪资管理子表-福利现金/年终奖
+ * @Author: jeecg-boot
+ * @Date:   2024-05-06
+ * @Version: V1.0
+ */
+public interface ISalaryManagementExtraService extends IService<SalaryManagementExtra> {
+
+	public List<SalaryManagementExtra> selectByMainId(String mainId,String name, String type);
+}

+ 10 - 1
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryManagementService.java

@@ -5,6 +5,8 @@ import org.jeecg.modules.salary.entity.SalaryChangeRecord;
 import org.jeecg.modules.salary.entity.SalaryManagementDetail;
 import org.jeecg.modules.salary.entity.SalaryManagement;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.salary.entity.SalaryManagementExtra;
+
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.List;
@@ -24,6 +26,12 @@ public interface ISalaryManagementService extends IService<SalaryManagement> {
 	 */
 	public void saveMain(SalaryManagement salaryManagement,List<SalaryManagementDetail> salaryManagementDetailList) ;
 	
+	/**
+	 * 添加一对多
+	 *
+	 */
+	public void saveMainExtra(SalaryManagement salaryManagement,List<SalaryManagementExtra> salaryManagementDetailList) throws Exception;
+
 	/**
 	 * 修改一对多
 	 * 
@@ -46,5 +54,6 @@ public interface ISalaryManagementService extends IService<SalaryManagement> {
 	 * @return
 	 */
 	public Result<?> generatePayroll(SalaryManagement salaryManagement);
-	
+	public Result<?> generatePayrollBefore(SalaryManagement salaryManagement);
+
 }

+ 13 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryChangeRecordServiceImpl.java

@@ -17,6 +17,8 @@ import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 
@@ -42,11 +44,21 @@ public class SalaryChangeRecordServiceImpl extends ServiceImpl<SalaryChangeRecor
                 }
             }
         }
+//        // 使用匿名比较器排序
+//        Collections.sort(list, new Comparator<SalaryChangeRecord>() {
+//            @Override
+//            public int compare(SalaryChangeRecord p1, SalaryChangeRecord p2) {
+//                BigDecimal p22 = p2.getWages() == null ? new BigDecimal("0"):p2.getWages();
+//                BigDecimal p11 = p1.getWages() == null ? new BigDecimal("0"):p1.getWages();
+//                return p22.intValue()-p11.intValue();
+//            }
+//        });
         IPage<SalaryChangeRecord> result = new Page<>(page.getCurrent(), page.getSize(), total);
         result.setRecords(list);
 
         return result;
     }
+
     @Override
     public IPage<SalaryChangeRecord> selectUserInfo2( SalaryChangeRecord userParams, IPage page){
         List<SalaryChangeRecord> list = baseMapper.selectUserInfo2(page, userParams);
@@ -61,6 +73,7 @@ public class SalaryChangeRecordServiceImpl extends ServiceImpl<SalaryChangeRecor
                 }
             }
         }
+
         IPage<SalaryChangeRecord> result = new Page<>(page.getCurrent(), page.getSize(), total);
         result.setRecords(list);
 

+ 27 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryManagementExtraServiceImpl.java

@@ -0,0 +1,27 @@
+package org.jeecg.modules.salary.service.impl;
+
+import org.jeecg.modules.salary.entity.SalaryManagementExtra;
+import org.jeecg.modules.salary.mapper.SalaryManagementExtraMapper;
+import org.jeecg.modules.salary.service.ISalaryManagementExtraService;
+import org.springframework.stereotype.Service;
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @Description: 薪资管理子表-福利现金/年终奖
+ * @Author: jeecg-boot
+ * @Date:   2024-05-06
+ * @Version: V1.0
+ */
+@Service
+public class SalaryManagementExtraServiceImpl extends ServiceImpl<SalaryManagementExtraMapper, SalaryManagementExtra> implements ISalaryManagementExtraService {
+	
+	@Autowired
+	private SalaryManagementExtraMapper salaryManagementExtraMapper;
+	
+	@Override
+	public List<SalaryManagementExtra> selectByMainId(String mainId,String name, String type) {
+		return salaryManagementExtraMapper.selectByMainId(mainId,name,type);
+	}
+}

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

@@ -6,6 +6,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.encryption.AesEncryptUtil;
 import org.jeecg.modules.salary.entity.*;
 import org.jeecg.modules.salary.mapper.*;
@@ -36,6 +37,8 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
     private SalaryManagementWorkOvertimeMapper salaryManagementWorkOvertimeMapper;
     @Autowired
     private SalaryManagementHolidayMapper salaryManagementHolidayMapper;
+    @Autowired
+    private SalaryManagementExtraMapper salaryManagementExtraMapper;
 
     @Autowired
     private SalaryAttendanceDetailMapper salaryAttendanceDetailMapper;
@@ -52,8 +55,13 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
         String endDate = userParams.getEndDate();
 
         try {
+            BigDecimal wagesNew = new BigDecimal("0");//基本薪资合计
 
             for (SalaryChangeRecord o : pageList) {
+
+                BigDecimal wages = new BigDecimal(o.getBeforeAdjustment()==null || o.getBeforeAdjustment()=="" ? "0":o.getBeforeAdjustment());//基本薪资合计
+                wagesNew = wagesNew.add(wages);
+
                 String userId = o.getUserId();
                 List<SalaryManagementDetail> detailList = salaryManagementDetailMapper.selectByUserTotal(userId, beginDate, endDate);
                 List<SalaryManagementWorkOvertime> overTimeList = salaryManagementWorkOvertimeMapper.selectByUserTotal(userId, beginDate, endDate);
@@ -64,12 +72,9 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                 BigDecimal housingSubsidies = new BigDecimal("0");//住房补贴
                 BigDecimal transportation = new BigDecimal("0");//交通补贴
                 BigDecimal fullAttendance = new BigDecimal("0");//全勤奖
-
                 BigDecimal overtimePay = new BigDecimal("0");//加班工资
                 BigDecimal yearSalary = new BigDecimal("0");//年休工资
-
                 BigDecimal totalPayable = new BigDecimal("0");//合计应发String
-
                 BigDecimal socialSecurity = new BigDecimal("0");//社保
                 BigDecimal accumulationFund = new BigDecimal("0");//公积金
                 BigDecimal personalTax = new BigDecimal("0");//个税
@@ -78,12 +83,11 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                 BigDecimal sickCost = new BigDecimal("0");//病假扣费
                 BigDecimal marriageCost = new BigDecimal("0");//婚假扣费
                 BigDecimal funeralCost = new BigDecimal("0");//丧假扣费
-
                 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());
                     lunch = lunch.add(d.getLunch() == null ? BigDecimal.ZERO : d.getLunch());
                     housingSubsidies = housingSubsidies.add(d.getHousingSubsidies() == null ? BigDecimal.ZERO : d.getHousingSubsidies());
@@ -155,7 +159,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                 o.setFullAttendance(fullAttendance);
                 o.setOvertimePay(overtimePay);
                 o.setYearSalary(yearSalary);
-                o.setTotalPayable(totalPayable.toString());
+                o.setTotalPayable(totalPayable);
                 o.setSocialSecurity(socialSecurity);
                 o.setAccumulationFund(accumulationFund);
                 o.setLatenessCost(latenessCost);
@@ -165,10 +169,29 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                 o.setMarriageCost(marriageCost);
                 o.setFuneralCost(funeralCost);
                 o.setTotalDeduction(totalDeduction);
-                o.setActualOccurrence(actualOccurrence.toString());
+                o.setActualOccurrence(actualOccurrence);
+
+                userParams.setPhoneBill(phoneBill.add(userParams.getPhoneBill() == null ? BigDecimal.ZERO : userParams.getPhoneBill()));
+                userParams.setLunch(lunch.add(userParams.getLunch() == null ? BigDecimal.ZERO : userParams.getLunch()));
+                userParams.setHousingSubsidies(housingSubsidies.add(userParams.getHousingSubsidies() == null ? BigDecimal.ZERO : userParams.getHousingSubsidies()));
+                userParams.setTransportation(transportation.add(userParams.getTransportation() == null ? BigDecimal.ZERO : userParams.getTransportation()));
+                userParams.setFullAttendance(fullAttendance.add(userParams.getFullAttendance() == null ? BigDecimal.ZERO : userParams.getFullAttendance()));
+                userParams.setOvertimePay(overtimePay.add(userParams.getOvertimePay() == null ? BigDecimal.ZERO : userParams.getOvertimePay()));
+                userParams.setYearSalary(yearSalary.add(userParams.getYearSalary() == null ? BigDecimal.ZERO : userParams.getYearSalary()));
+                userParams.setTotalPayable(totalPayable.add(userParams.getTotalPayable() == null ? BigDecimal.ZERO : userParams.getTotalPayable()));
+                userParams.setSocialSecurity(socialSecurity.add(userParams.getSocialSecurity() == null ? BigDecimal.ZERO : userParams.getSocialSecurity()));
+                userParams.setAccumulationFund(accumulationFund.add(userParams.getAccumulationFund() == null ? BigDecimal.ZERO : userParams.getAccumulationFund()));
+                userParams.setPersonalTax(personalTax.add(userParams.getPersonalTax() == null ? BigDecimal.ZERO : userParams.getPersonalTax()));
+                userParams.setLatenessCost(latenessCost.add(userParams.getLatenessCost() == null ? BigDecimal.ZERO : userParams.getLatenessCost()));
+                userParams.setPersonalCost(personalCost.add(userParams.getPersonalCost() == null ? BigDecimal.ZERO : userParams.getPersonalCost()));
+                userParams.setSickCost(sickCost.add(userParams.getSickCost() == null ? BigDecimal.ZERO : userParams.getSickCost()));
+                userParams.setMarriageCost(marriageCost.add(userParams.getMarriageCost() == null ? BigDecimal.ZERO : userParams.getMarriageCost()));
+                userParams.setFuneralCost(funeralCost.add(userParams.getFuneralCost() == null ? BigDecimal.ZERO : userParams.getFuneralCost()));
+                userParams.setTotalDeduction(totalDeduction.add(userParams.getTotalDeduction() == null ? BigDecimal.ZERO : userParams.getTotalDeduction()));
+                userParams.setActualOccurrence(actualOccurrence.add(userParams.getActualOccurrence() == null ? BigDecimal.ZERO : userParams.getActualOccurrence()));
 
             }
-
+            userParams.setBeforeAdjustment(wagesNew.toString());
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -185,6 +208,200 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
         }
     }
 
+    @Override
+    @Transactional
+    public void saveMainExtra(SalaryManagement salaryManagement, List<SalaryManagementExtra> salaryManagementExtraList) throws Exception {
+
+        String yearWithMonth = salaryManagement.getYearWithMonth();
+        String type = salaryManagement.getType();
+
+        SalaryManagement salaryManagementMFY = new SalaryManagement(); //马非羊
+        SalaryManagement salaryManagementNBSY = new SalaryManagement();//宁波森语
+        SalaryManagement salaryManagementZZ = new SalaryManagement();//正织
+
+        //发放薪资合计(用于主表统计)
+        BigDecimal salaryMFY = new BigDecimal("0");
+        BigDecimal salaryNBSY = new BigDecimal("0");
+        BigDecimal salaryZZ = new BigDecimal("0");
+
+        //个税合计(用于主表统计)
+        BigDecimal personalTaxMFY = new BigDecimal("0");
+        BigDecimal personalTaxNBSY = new BigDecimal("0");
+        BigDecimal personalTaxZZ = new BigDecimal("0");
+
+        //附加信息
+        BigDecimal top36000 = new BigDecimal("36000");
+        BigDecimal top144000 = new BigDecimal("144000");
+        BigDecimal top300000 = new BigDecimal("300000");
+        BigDecimal top420000 = new BigDecimal("420000");
+        BigDecimal top660000 = new BigDecimal("660000");
+        BigDecimal top960000 = new BigDecimal("960000");
+
+        BigDecimal tax003 = new BigDecimal("0.03");
+        BigDecimal Tax01 = new BigDecimal("0.1");
+        BigDecimal Tax02 = new BigDecimal("0.2");
+        BigDecimal Tax025 = new BigDecimal("0.25");
+        BigDecimal Tax03 = new BigDecimal("0.3");
+        BigDecimal Tax035 = new BigDecimal("0.35");
+        BigDecimal Tax045 = new BigDecimal("0.45");
+
+        //月度工资单
+        List<SalaryManagementExtra> salaryAttendanceDetailListMFY = new ArrayList<>();//马非羊
+        List<SalaryManagementExtra> salaryAttendanceDetailListNBSY = new ArrayList<>();//宁波森语
+        List<SalaryManagementExtra> salaryAttendanceDetailListZZ = new ArrayList<>();//正织
+
+        if ("福利现金".equals(type)) {
+
+            for(SalaryManagementExtra o:salaryManagementExtraList){
+
+                String org = o.getOrgName();
+                String beforeTaxAmountTxt = o.getBeforeTaxAmount();
+
+                BigDecimal beforeTaxAmount = new BigDecimal(beforeTaxAmountTxt);
+                //加密后金额
+                String beforeTaxAmountEn = AesEncryptUtil.encrypt(String.format("%.2f", beforeTaxAmount));
+
+                if("马菲羊".equals(org)){
+
+                    salaryMFY = salaryMFY.add(beforeTaxAmount);
+                    salaryAttendanceDetailListMFY.add(o);
+
+                }else if("正织".equals(org)){
+
+                    salaryZZ = salaryZZ.add(beforeTaxAmount);
+                    salaryAttendanceDetailListZZ.add(o);
+
+                }else if("森语".equals(org)){
+
+                    salaryNBSY = salaryNBSY.add(beforeTaxAmount);
+                    salaryAttendanceDetailListNBSY.add(o);
+
+                }
+                o.setType("0");//0福利现金 1年终奖
+                o.setPersonalTax(new BigDecimal("0"));//个税
+                o.setBeforeTaxAmount(beforeTaxAmountEn);//税前金额
+                o.setAfterTaxAmount(beforeTaxAmountEn);//税后金额
+                o.setPayTaxes(beforeTaxAmountEn);//应纳税所得额
+                o.setCalculate("0");//0未计算,1计算
+
+            }
+
+            salaryManagementMFY.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryMFY)));
+            salaryManagementMFY.setPersonalTax("HV3ndEx8HV9kd1WNbxLgwg==");// 0.00
+
+            salaryManagementZZ.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryZZ)));
+            salaryManagementZZ.setPersonalTax("HV3ndEx8HV9kd1WNbxLgwg==");// 0.00
+
+            salaryManagementNBSY.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryNBSY)));
+            salaryManagementNBSY.setPersonalTax("HV3ndEx8HV9kd1WNbxLgwg==");// 0.00
+
+            saveExtra(type,yearWithMonth,salaryManagementMFY,salaryManagementNBSY,salaryManagementZZ
+                    ,salaryAttendanceDetailListMFY,salaryAttendanceDetailListNBSY,salaryAttendanceDetailListZZ);
+
+
+        }else{
+
+            //年终奖
+            for(SalaryManagementExtra o:salaryManagementExtraList){
+
+                String org = o.getOrgName();
+                String beforeTaxAmountTxt = o.getBeforeTaxAmount();
+                BigDecimal beforeTaxAmount = new BigDecimal(beforeTaxAmountTxt);
+                //加密后金额
+                String beforeTaxAmountEn = AesEncryptUtil.encrypt(String.format("%.2f", beforeTaxAmount));
+
+                //累计个税 = 本年度当前人员所有已缴纳个税
+                BigDecimal cumulativeTax = new BigDecimal("0");
+                //累计所得额 = 本年度当前人员所有应纳税所得之和
+                BigDecimal cumulative = beforeTaxAmount;
+
+                //个税 = 累计所得额 * 对应税率 - 速算扣除数 - 累计税额  ===========================
+                BigDecimal personalTax = new BigDecimal("0");
+
+                if(cumulative.compareTo(BigDecimal.ZERO) == 0){
+                    //如果应纳税额为0 则个税默认为0
+                }else{
+                    if (top36000.compareTo(cumulative) != -1) { //top36000 >= cumulative
+                        personalTax = cumulative.multiply(tax003).subtract(cumulativeTax);
+                    }
+                    if (top144000.compareTo(cumulative) != -1 && cumulative.compareTo(top36000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                        personalTax = cumulative.multiply(Tax01).subtract(new BigDecimal("2520")).subtract(cumulativeTax);
+                    }
+                    if (top300000.compareTo(cumulative) != -1 && cumulative.compareTo(top144000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                        personalTax = cumulative.multiply(Tax02).subtract(new BigDecimal("16920")).subtract(cumulativeTax);;
+                    }
+                    if (top420000.compareTo(cumulative) != -1 && cumulative.compareTo(top300000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                        personalTax = cumulative.multiply(Tax025).subtract(new BigDecimal("31920")).subtract(cumulativeTax);;
+                    }
+                    if (top660000.compareTo(cumulative) != -1 && cumulative.compareTo(top420000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                        personalTax = cumulative.multiply(Tax03).subtract(new BigDecimal("52920")).subtract(cumulativeTax);;
+                    }
+                    if (top960000.compareTo(cumulative) != -1 && cumulative.compareTo(top660000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                        personalTax = cumulative.multiply(Tax035).subtract(new BigDecimal("85920")).subtract(cumulativeTax);;
+                    }
+                    if (cumulative.compareTo(top960000) == 1) { //cumulative > top960000
+                        personalTax = cumulative.multiply(Tax045).subtract(new BigDecimal("181920")).subtract(cumulativeTax);;
+                    }
+                    if(personalTax.compareTo(new BigDecimal("0")) < 0){
+                        personalTax = new BigDecimal("0");
+                    }
+                }
+
+                o.setPersonalTax(personalTax);//个税
+
+                BigDecimal afterTaxAmount = beforeTaxAmount.subtract(personalTax);
+                //加密税后金额
+                String afterTaxAmountEn = AesEncryptUtil.encrypt(String.format("%.2f", afterTaxAmount));
+                o.setAfterTaxAmount(afterTaxAmountEn);//税后金额
+
+                if("马菲羊".equals(org)){
+
+                    salaryMFY = salaryMFY.add(afterTaxAmount);
+                    personalTaxMFY = personalTaxMFY.add(personalTax);
+
+                    salaryAttendanceDetailListMFY.add(o);
+
+                }else if("正织".equals(org)){
+
+                    salaryZZ = salaryZZ.add(afterTaxAmount);
+                    personalTaxZZ = personalTaxZZ.add(personalTax);
+
+                    salaryAttendanceDetailListZZ.add(o);
+
+                }else if("森语".equals(org)){
+
+                    salaryNBSY = salaryNBSY.add(afterTaxAmount);
+                    personalTaxNBSY = personalTaxNBSY.add(personalTax);
+
+                    salaryAttendanceDetailListNBSY.add(o);
+
+                }
+
+                o.setType("1");//0福利现金 1年终奖
+                o.setBeforeTaxAmount(beforeTaxAmountEn);//税前金额
+                o.setPayTaxes(beforeTaxAmountEn);//应纳税所得额
+                o.setCalculate("0");//0未计算,1计算
+
+            }
+
+
+            salaryManagementMFY.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryMFY)));
+            salaryManagementMFY.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxMFY)));// 0.00
+
+            salaryManagementZZ.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryZZ)));
+            salaryManagementZZ.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxZZ)));// 0.00
+
+            salaryManagementNBSY.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryNBSY)));
+            salaryManagementNBSY.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxNBSY)));// 0.00
+
+            saveExtra(type,yearWithMonth,salaryManagementMFY,salaryManagementNBSY,salaryManagementZZ
+                    ,salaryAttendanceDetailListMFY,salaryAttendanceDetailListNBSY,salaryAttendanceDetailListZZ);
+
+
+        }
+
+    }
+
     @Override
     @Transactional
     public void updateMain(SalaryManagement salaryManagement, List<SalaryManagementDetail> salaryManagementDetailList) {
@@ -217,6 +434,55 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
         }
     }
 
+    @Override
+    @Transactional
+    public Result<?> generatePayrollBefore(SalaryManagement salaryManagement) {
+
+        String type = salaryManagement.getType();//月度工资单、年休工资单、加班工资单
+
+        if (StringUtils.isBlank(type)) {
+            return Result.error("参数异常type、yearWithMonth");
+        }
+
+        String yearWithMonth = salaryManagement.getYearWithMonth();
+        String yearWith = salaryManagement.getYearWith();
+
+        if ("月度工资单".equals(type)) {
+
+            QueryWrapper<SalaryManagement> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("del_flag", "0");
+            queryWrapper.eq("year_with_month", yearWithMonth);
+            queryWrapper.eq("type", "月度工资单");
+            List<SalaryManagement> list = salaryManagementMapper.selectList(queryWrapper);
+            if(list.size() > 0){
+                return Result.error("已生成过"+yearWithMonth+"月度工资单,是否重新生成?");
+            }
+        }
+        if ("年休工资单".equals(type)) {
+            QueryWrapper<SalaryManagement> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("del_flag", "0");
+            queryWrapper.eq("year_with_month", yearWith);
+            queryWrapper.eq("type", "年休工资单");
+            List<SalaryManagement> list = salaryManagementMapper.selectList(queryWrapper);
+            if(list.size() > 0){
+                return Result.error("已生成过"+yearWith+"年休工资单,是否重新生成?");
+            }
+        }
+        if ("加班工资单".equals(type)) {
+            QueryWrapper<SalaryManagement> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("del_flag", "0");
+            queryWrapper.eq("year_with_month", yearWithMonth);
+            queryWrapper.eq("type", "加班工资单");
+            List<SalaryManagement> list = salaryManagementMapper.selectList(queryWrapper);
+            if(list.size() > 0){
+                return Result.error("已生成过"+yearWithMonth+"加班工资单,是否重新生成?");
+            }
+        }
+
+        return Result.ok();
+    }
+
+
     @Override
     @Transactional
     public Result<?> generatePayroll(SalaryManagement salaryManagement) {
@@ -239,6 +505,33 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
         }
         String withMonth = yearWithMonth.substring(0, 4);
 
+        QueryWrapper<SalaryManagement> queryWrapper1 = new QueryWrapper<>();
+        queryWrapper1.eq("del_flag", "0");
+        queryWrapper1.ne("salary", "nghotxDTNyeHgH0mlfbJig==");
+        queryWrapper1.ne("salary", "HV3ndEx8HV9kd1WNbxLgwg==");
+        queryWrapper1.ne("type", "福利现金");
+        queryWrapper1.ne("type", "年终奖");
+        if(type.equals("年休工资单")){
+
+            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("加班工资单")){
+
+            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{
+
+            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("后续薪资已计算,无法生成此月工资单!!");
+        }
 
         SalaryManagement salaryManagementMFY = new SalaryManagement(); //马非羊
         SalaryManagement salaryManagementNBSY = new SalaryManagement();//宁波森语
@@ -270,6 +563,8 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
         BigDecimal Tax035 = new BigDecimal("0.35");
         BigDecimal Tax045 = new BigDecimal("0.45");
 
+        List<SalaryManagementExtra> extraList = new ArrayList<>();
+
         Map<String,Object> data = new HashMap<>();
         data.put("MFY",null);
         data.put("NBSY",null);
@@ -288,10 +583,11 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                 List<SalaryManagementDetail> salaryAttendanceDetailListNBSY = new ArrayList<>();//宁波森语
                 List<SalaryManagementDetail> salaryAttendanceDetailListZZ = new ArrayList<>();//正织
 
-                QueryWrapper<SalaryAttendanceDetail> queryWrapper = new QueryWrapper<>();
-                queryWrapper.eq("del_flag", "0");
-                queryWrapper.eq("year_with_month", yearWithMonth);
-                List<SalaryAttendanceDetail> list = salaryAttendanceDetailMapper.selectList(queryWrapper);
+//                QueryWrapper<SalaryAttendanceDetail> queryWrapper = new QueryWrapper<>();
+//                queryWrapper.eq("del_flag", "0");
+//                queryWrapper.eq("year_with_month", yearWithMonth);
+//                List<SalaryAttendanceDetail> list = salaryAttendanceDetailMapper.selectList(queryWrapper);
+                List<SalaryAttendanceDetail> list = salaryAttendanceDetailMapper.selectListByDate(yearWithMonth);
 
                 if (list.size() < 1) {
                     return Result.error("执行失败,没有找到" + yearWithMonth + "的考勤数据!");
@@ -310,6 +606,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     BigDecimal bigWages = new BigDecimal(AesEncryptUtil.desEncrypt(wages).trim());//基本薪资 (明文)
 
                     BigDecimal personalLeave = o.getPersonalLeave() == null ? BigDecimal.ZERO : o.getPersonalLeave();//事假时间(分)
+                    BigDecimal sickLeave = o.getSickLeave() == null ? BigDecimal.ZERO : o.getSickLeave();//病假时间(分)
                     BigDecimal workingHours = o.getWorkingHours() == null ? BigDecimal.ZERO : o.getWorkingHours();//每日工时
                     BigDecimal attendanceDays = o.getAttendanceDays() == null ? BigDecimal.ZERO : o.getAttendanceDays();//出勤天数
 
@@ -318,7 +615,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
 				 */
                     BigDecimal phoneBill = o.getPhoneBill() == null ? BigDecimal.ZERO : o.getPhoneBill();//话费补贴
                     BigDecimal lunch = o.getLunch() == null ? BigDecimal.ZERO : o.getLunch();
-                    ;//午餐补贴
+                    //午餐补贴
                     BigDecimal housingSubsidies = o.getHousingSubsidies() == null ? BigDecimal.ZERO : o.getHousingSubsidies();//住房补贴
                     BigDecimal transportation = o.getTransportation() == null ? BigDecimal.ZERO : o.getTransportation();//交通补贴
                     BigDecimal fullAttendance = o.getFullAttendance() == null ? BigDecimal.ZERO : o.getFullAttendance();//全勤奖
@@ -333,7 +630,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     BigDecimal latenessCost = o.getLatenessCost() == null ? BigDecimal.ZERO : o.getLatenessCost();//迟到扣费
 
                     BigDecimal deduction = o.getDeduction() == null ? BigDecimal.ZERO : o.getDeduction();
-                    ;//工资抵扣
+                    //工资抵扣
 
                 /*
                 赋值和计算
@@ -342,6 +639,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     salaryManagementDetail.setUserId(o.getUserId());
                     salaryManagementDetail.setCode(o.getCode());
                     salaryManagementDetail.setName(o.getName());
+                    salaryManagementDetail.setSysOrgCode(o.getSysOrgCode());
                     salaryManagementDetail.setOrgName(o.getOrgName());
                     salaryManagementDetail.setCardNo(o.getCardNo());
 
@@ -366,22 +664,80 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
 
                     salaryManagementDetail.setAccumulationFund(o.getAccumulationFund());//公积金
 
+                    //事假扣费 = 事假(转换成小时数)/(每日工时*天数)*基本薪资
+                    BigDecimal personalCost = new BigDecimal("0");
+//                    personalCost = personalLeave.divide(new BigDecimal("60"), 2, BigDecimal.ROUND_HALF_UP)
+//                            .divide(workingHours.multiply(attendanceDays), 2, BigDecimal.ROUND_HALF_UP).multiply(bigWages);
+
+                    if(personalLeave.compareTo(BigDecimal.ZERO)!=0){
+//                      基本薪资/(每日工时*天数)/ 60 * 事假分钟
+                        personalCost = bigWages.divide(workingHours.multiply(attendanceDays), 12, BigDecimal.ROUND_HALF_UP).divide(new BigDecimal("60"), 12, BigDecimal.ROUND_HALF_UP)
+                                .multiply(personalLeave).setScale(2, BigDecimal.ROUND_HALF_UP);;
+
+                    }
+
+                    salaryManagementDetail.setPersonalCost(personalCost);//事假扣费
+
+                    BigDecimal sickCost = new BigDecimal("0");//病假扣费
+                    if(personalLeave.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);;
 
-                    //应纳税所得额 = 合计应发 - 五险一金 - 扣除数(deduction)
+                    }
+
+                    salaryManagementDetail.setSickCost(sickCost);//病假扣费
+
+                    //应纳税所得额 = 合计应发 - 五险一金 - 5000 - 扣除数(考勤管理中的工资抵扣deduction) - 事假扣费  - 病假扣费 - 迟到扣费
                     BigDecimal payTaxes = new BigDecimal("0");
-                    payTaxes = totalPayable.subtract(socialSecurity).subtract(accumulationFund).subtract(deduction);
-                    String payTaxesText = AesEncryptUtil.encrypt(payTaxes.toString());
-                    salaryManagementDetail.setPayTaxes(payTaxesText);//应纳税所得额
+                    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");
+                    }
+
+
+                    //累计个税 = 本年度当前人员所有已缴纳个税
+                    BigDecimal cumulativeTax = new BigDecimal("0");
                     //累计所得额 = 本年度当前人员所有应纳税所得之和
                     BigDecimal cumulative = new BigDecimal("0");
                     List<SalaryManagementDetail> cumulativeList = salaryManagementDetailMapper.selectByUser(userId, withMonth, yearWithMonth);
                     List<SalaryManagementWorkOvertime> cumulativeOvertimeList = salaryManagementWorkOvertimeMapper.selectByUser(userId, withMonth, yearWithMonth);
-//                    List<SalaryManagementHoliday> holidayList = salaryManagementHolidayMapper.selectByUser(userId,withMonth);
+                    List<SalaryManagementHoliday> holidayList = salaryManagementHolidayMapper.selectByUser(userId,withMonth);
+                    //0福利现金 1年终奖 福利现金需计算工资、加班费、年休累计纳税额,且参与入其他薪资累计
+                    List<SalaryManagementExtra> extra = salaryManagementExtraMapper.selectByUser(userId,withMonth,null,"0");
+//                    extra = salaryManagementExtraMapper.selectByUser(userId,withMonth,yearWithMonth,"0");
+
+                    //福利金
+                    BigDecimal extraTax = new BigDecimal("0");
+                    if (extra.size() > 0) {
+                        for (SalaryManagementExtra detail : extra) {
+                            extraList.add(detail);
+                            BigDecimal personalTax = detail.getPersonalTax() == null ? BigDecimal.ZERO : detail.getPersonalTax();
+                            cumulativeTax = cumulativeTax.add(personalTax);//个税
+
+                            String hisPayTaxes = detail.getPayTaxes();//应纳税所得额
+                            hisPayTaxes = AesEncryptUtil.desEncrypt(hisPayTaxes).trim();
+                            BigDecimal bigPayTaxes = new BigDecimal(hisPayTaxes);
+                            extraTax = extraTax.add(bigPayTaxes);
+//                            cumulative = cumulative.add(bigPayTaxes);上行已累计,此处无需累加
+                        }
+
+                    }
+                    sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效福利现金" + cumulativeList.size() + "条,共计金额"+extraTax+"已计入应纳税所得额与累计所得额中;");
+                    payTaxes = payTaxes.add(extraTax);
+                    String payTaxesText = AesEncryptUtil.encrypt(payTaxes.toString());
+                    salaryManagementDetail.setPayTaxes(payTaxesText);//应纳税所得额
 
                     if (cumulativeList.size() > 0) {
                         for (SalaryManagementDetail detail : cumulativeList) {
-                            String hisPayTaxes = detail.getPayTaxes();
+
+                            BigDecimal personalTax = detail.getPersonalTax() == null ? BigDecimal.ZERO : detail.getPersonalTax();
+                            cumulativeTax = cumulativeTax.add(personalTax);//个税
+
+                            String hisPayTaxes = detail.getPayTaxes();//应纳税所得额
                             hisPayTaxes = AesEncryptUtil.desEncrypt(hisPayTaxes).trim();
                             BigDecimal bigPayTaxes = new BigDecimal(hisPayTaxes);
                             cumulative = cumulative.add(bigPayTaxes);
@@ -390,19 +746,27 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     }
                     sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效月度工资单" + cumulativeList.size() + "条,已累计入累计所得额中;");
 
-//                    if(holidayList.size() > 0){
-//                        for(SalaryManagementHoliday detail:holidayList){
-//                            String hisPayTaxes = detail.getPayTaxes();
-//                            hisPayTaxes = AesEncryptUtil.desEncrypt(hisPayTaxes).trim();
-//                            BigDecimal bigPayTaxes = new BigDecimal(hisPayTaxes);
-//                            cumulative = cumulative.add(bigPayTaxes);
-//                        }
-//
-//                    }
-//                    sb.append(withMonth+"年度,此时之前("+yearWithMonth+")有效年休工资单"+cumulativeList.size()+"条,已累计入累计所得额中;");
+                    if(holidayList.size() > 0){
+                        for(SalaryManagementHoliday detail:holidayList){
+
+                            BigDecimal personalTax = detail.getPersonalTax() == null ? BigDecimal.ZERO : detail.getPersonalTax();
+                            cumulativeTax = cumulativeTax.add(personalTax);//个税
+
+                            String hisPayTaxes = detail.getPayTaxes();
+                            hisPayTaxes = AesEncryptUtil.desEncrypt(hisPayTaxes).trim();
+                            BigDecimal bigPayTaxes = new BigDecimal(hisPayTaxes);
+                            cumulative = cumulative.add(bigPayTaxes);
+                        }
+
+                    }
+                    sb.append(withMonth+"年度,此时之前("+yearWithMonth+")有效年休工资单"+cumulativeList.size()+"条,已累计入累计所得额中;");
 
                     if (cumulativeOvertimeList.size() > 0) {
                         for (SalaryManagementWorkOvertime detail : cumulativeOvertimeList) {
+
+                            BigDecimal personalTax = detail.getPersonalTax() == null ? BigDecimal.ZERO : detail.getPersonalTax();
+                            cumulativeTax = cumulativeTax.add(personalTax);//个税
+
                             String hisPayTaxes = detail.getPayTaxes();
                             hisPayTaxes = AesEncryptUtil.desEncrypt(hisPayTaxes).trim();
                             BigDecimal bigPayTaxes = new BigDecimal(hisPayTaxes);
@@ -410,62 +774,68 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                         }
                     }
                     sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效加班工资单" + cumulativeList.size() + "条,已累计入累计所得额中;");
-                    cumulative = cumulative.add(payTaxes);
+                    cumulative = cumulative.add(payTaxes).setScale(2, BigDecimal.ROUND_HALF_UP);;
                     String cumulativeText = AesEncryptUtil.encrypt(cumulative.toString());
                     salaryManagementDetail.setCumulative(cumulativeText);//累计所得额
 
-                    //个税 ===========================
+                    //个税 = 累计所得额 * 对应税率 - 速算扣除数 - 累计税额  ===========================
                     BigDecimal personalTax = new BigDecimal("0");
 
-                    if (top36000.compareTo(cumulative) != -1) { //top36000 >= cumulative
-                        personalTax = cumulative.multiply(tax003);
-                    }
-                    if (top144000.compareTo(cumulative) != -1 && cumulative.compareTo(top36000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax01);
-                    }
-                    if (top300000.compareTo(cumulative) != -1 && cumulative.compareTo(top144000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax02);
-                    }
-                    if (top420000.compareTo(cumulative) != -1 && cumulative.compareTo(top300000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax025);
-                    }
-                    if (top660000.compareTo(cumulative) != -1 && cumulative.compareTo(top420000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax03);
-                    }
-                    if (top960000.compareTo(cumulative) != -1 && cumulative.compareTo(top660000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax035);
-                    }
-                    if (cumulative.compareTo(top960000) == 1) { //cumulative > top960000
-                        personalTax = cumulative.multiply(Tax045);
+                    if(cumulative.compareTo(BigDecimal.ZERO) == 0){
+                        //如果应纳税额为0 则个税默认为0
+                    }else{
+                        if (top36000.compareTo(cumulative) != -1) { //top36000 >= cumulative
+                            personalTax = cumulative.multiply(tax003).subtract(cumulativeTax);
+                        }
+                        if (top144000.compareTo(cumulative) != -1 && cumulative.compareTo(top36000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax01).subtract(new BigDecimal("2520")).subtract(cumulativeTax);
+                        }
+                        if (top300000.compareTo(cumulative) != -1 && cumulative.compareTo(top144000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax02).subtract(new BigDecimal("16920")).subtract(cumulativeTax);;
+                        }
+                        if (top420000.compareTo(cumulative) != -1 && cumulative.compareTo(top300000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax025).subtract(new BigDecimal("31920")).subtract(cumulativeTax);;
+                        }
+                        if (top660000.compareTo(cumulative) != -1 && cumulative.compareTo(top420000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax03).subtract(new BigDecimal("52920")).subtract(cumulativeTax);;
+                        }
+                        if (top960000.compareTo(cumulative) != -1 && cumulative.compareTo(top660000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax035).subtract(new BigDecimal("85920")).subtract(cumulativeTax);;
+                        }
+                        if (cumulative.compareTo(top960000) == 1) { //cumulative > top960000
+                            personalTax = cumulative.multiply(Tax045).subtract(new BigDecimal("181920")).subtract(cumulativeTax);;
+                        }
+                        if(personalTax.compareTo(new BigDecimal("0")) < 0){
+                            personalTax = new BigDecimal("0");
+                        }
                     }
 
                     salaryManagementDetail.setPersonalTax(personalTax);//个税
 
-                    salaryManagementDetail.setLatenessCost(o.getLatenessCost());//迟到扣费
+                    salaryManagementDetail.setLatenessCost(latenessCost);//迟到扣费
 
 //                    BigDecimal personalLeave = o.getPersonalLeave();//事假时间(分)
 //                    BigDecimal workingHours = o.getWorkingHours();//每日工时
 //                    BigDecimal attendanceDays = o.getAttendanceDays();//出勤天数
 
-                    //事假扣费 = 事假(转换成小时数)/(每日工时*天数)*基本薪资
-                    BigDecimal personalCost = new BigDecimal("0");
-                    personalCost = personalLeave.divide(new BigDecimal("60"), 2, BigDecimal.ROUND_HALF_UP)
-                            .divide(workingHours.multiply(attendanceDays), 2, BigDecimal.ROUND_HALF_UP).multiply(bigWages);
-                    salaryManagementDetail.setPersonalCost(personalCost);//事假扣费
 
-                    salaryManagementDetail.setSickCost(new BigDecimal("0"));//病假扣费====
+
                     salaryManagementDetail.setMarriageCost(new BigDecimal("0"));//婚假扣费====
                     salaryManagementDetail.setFuneralCost(new BigDecimal("0"));//丧假扣费====
 
-                    //合计应扣 = 个税+3保险(社保)+公积金+迟到扣费+事假扣费
+                    //合计应扣 = 个税+3保险(社保)+公积金+迟到扣费+事假扣费+病假扣费
                     BigDecimal totalDeduction = new BigDecimal("0");
-                    totalDeduction = personalTax.add(socialSecurity).add(accumulationFund).add(latenessCost).add(personalCost);
+                    totalDeduction = personalTax.add(socialSecurity).add(accumulationFund).add(latenessCost).add(personalCost).add(sickCost);
+
                     salaryManagementDetail.setTotalDeduction(totalDeduction);//合计应扣
 
                     //实发合计 = 合计应发-合计应扣
                     BigDecimal actualOccurrence = new BigDecimal("0");
                     actualOccurrence = totalPayable.subtract(totalDeduction).setScale(2, BigDecimal.ROUND_HALF_UP);
-                    ;
+                    if(actualOccurrence.compareTo(BigDecimal.ZERO) < 0){
+                        sb.append("实发合计为"+actualOccurrence+"故默认为0!!");
+                        actualOccurrence = new BigDecimal("0");
+                    }
                     String actualOccurrenceText = AesEncryptUtil.encrypt(actualOccurrence.toString());
                     salaryManagementDetail.setActualOccurrence(actualOccurrenceText);//实发合计
                     salaryManagementDetail.setDeduction(o.getDeduction());//工资抵扣
@@ -538,10 +908,13 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
 
             }
             else if ("年休工资单".equals(type)) {
+
                 if (StringUtils.isBlank(yearWith)) {
                     return Result.error("参数异常yearWith");
                 }
 
+                String newYear = String.valueOf(DateUtils.getYear());
+
                 //年休工资单
                 List<SalaryManagementHoliday> holidayListMFY = new ArrayList<>();//马非羊
                 List<SalaryManagementHoliday> holidayListNBSY = new ArrayList<>();//宁波森语
@@ -579,6 +952,7 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     salaryManagementHoliday.setUserId(userId);
                     salaryManagementHoliday.setCode(o.getCode());
                     salaryManagementHoliday.setName(o.getName());
+                    salaryManagementHoliday.setSysOrgCode(o.getSysOrgCode());
                     salaryManagementHoliday.setOrgName(orgName);
                     salaryManagementHoliday.setCardNo(o.getCardNo());
                     salaryManagementHoliday.setAnnualLeave(o.getAnnualLeave());
@@ -591,21 +965,27 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
 
                     //应发薪资 = 基本薪资/(单休26,双休22)*剩余年休
                     BigDecimal wages = new BigDecimal("0");
-                    wages = salaryBaseBig.divide(workingHours, 2, BigDecimal.ROUND_HALF_UP).multiply(surplus);
+                    wages = salaryBaseBig.divide(workingHours, 2, BigDecimal.ROUND_HALF_UP).multiply(surplus).setScale(2, BigDecimal.ROUND_HALF_UP);;
                     String wagesText = AesEncryptUtil.encrypt(wages.toString()).trim();
                     salaryManagementHoliday.setWages(wagesText);//应发薪资
                     salaryManagementHoliday.setPayTaxes(wagesText);//应纳税所得额
 
+                    //累计个税 = 本年度当前人员所有缴纳个税之和
+                    BigDecimal cumulativeTax = new BigDecimal("0");
                     //累计所得额 = 本年度当前人员所有应纳税所得之和
                     BigDecimal cumulative = new BigDecimal("0");
 
                     if (wages.compareTo(BigDecimal.ZERO) != 0) {
 
-                        List<SalaryManagementDetail> cumulativeList = salaryManagementDetailMapper.selectByUser(userId, yearWith, null);
-                        List<SalaryManagementWorkOvertime> cumulativeOvertimeList = salaryManagementWorkOvertimeMapper.selectByUser(userId, yearWith, null);
+                        List<SalaryManagementDetail> cumulativeList = salaryManagementDetailMapper.selectByUser(userId, newYear, null);
+                        List<SalaryManagementWorkOvertime> cumulativeOvertimeList = salaryManagementWorkOvertimeMapper.selectByUser(userId, newYear, null);
 
                         if (cumulativeList.size() > 0) {
                             for (SalaryManagementDetail detail : cumulativeList) {
+
+                                BigDecimal personalTax = detail.getPersonalTax() == null ? BigDecimal.ZERO : detail.getPersonalTax();
+                                cumulativeTax = cumulativeTax.add(personalTax);//个税
+
                                 String hisPayTaxes = detail.getPayTaxes();
                                 hisPayTaxes = AesEncryptUtil.desEncrypt(hisPayTaxes).trim();
                                 BigDecimal bigPayTaxes = new BigDecimal(hisPayTaxes);
@@ -613,18 +993,22 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                             }
 
                         }
-                        sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效月度工资单" + cumulativeList.size() + "条,已累计入累计所得额中;");
+                        sb.append(withMonth + "年度,此时之前(" + newYear + ")有效月度工资单" + cumulativeList.size() + "条,已累计入累计所得额中;");
 
                         if (cumulativeOvertimeList.size() > 0) {
                             for (SalaryManagementWorkOvertime detail : cumulativeOvertimeList) {
+
+                                BigDecimal personalTax = detail.getPersonalTax() == null ? BigDecimal.ZERO : detail.getPersonalTax();
+                                cumulativeTax = cumulativeTax.add(personalTax);//个税
+
                                 String hisPayTaxes = detail.getPayTaxes();
                                 hisPayTaxes = AesEncryptUtil.desEncrypt(hisPayTaxes).trim();
                                 BigDecimal bigPayTaxes = new BigDecimal(hisPayTaxes);
                                 cumulative = cumulative.add(bigPayTaxes);
                             }
                         }
-                        sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效加班工资单" + cumulativeList.size() + "条,已累计入累计所得额中;");
-                        cumulative = cumulative.add(wages);
+                        sb.append(withMonth + "年度,此时之前(" + newYear + ")有效加班工资单" + cumulativeList.size() + "条,已累计入累计所得额中;");
+                        cumulative = cumulative.add(wages).setScale(2, BigDecimal.ROUND_HALF_UP);;
                     } else {
                         sb.append("本次应发薪资年休工资为0,不计入累计所得额中");
                     }
@@ -634,27 +1018,33 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
 
                     //个税 ===========================
                     BigDecimal personalTax = new BigDecimal("0");
-
-                    if (top36000.compareTo(cumulative) != -1) { //top36000 >= cumulative
-                        personalTax = cumulative.multiply(tax003);
-                    }
-                    if (top144000.compareTo(cumulative) != -1 && cumulative.compareTo(top36000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax01);
-                    }
-                    if (top300000.compareTo(cumulative) != -1 && cumulative.compareTo(top144000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax02);
-                    }
-                    if (top420000.compareTo(cumulative) != -1 && cumulative.compareTo(top300000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax025);
-                    }
-                    if (top660000.compareTo(cumulative) != -1 && cumulative.compareTo(top420000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax03);
-                    }
-                    if (top960000.compareTo(cumulative) != -1 && cumulative.compareTo(top660000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax035);
-                    }
-                    if (cumulative.compareTo(top960000) == 1) { //cumulative > top960000
-                        personalTax = cumulative.multiply(Tax045);
+                    if(cumulative.compareTo(BigDecimal.ZERO) == 0){
+                        //如果应纳税额为0 则个税默认为0
+                    }else{
+                        if (top36000.compareTo(cumulative) != -1) { //top36000 >= cumulative
+                            personalTax = cumulative.multiply(tax003).subtract(cumulativeTax);
+                        }
+                        if (top144000.compareTo(cumulative) != -1 && cumulative.compareTo(top36000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax01).subtract(new BigDecimal("2520")).subtract(cumulativeTax);
+                        }
+                        if (top300000.compareTo(cumulative) != -1 && cumulative.compareTo(top144000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax02).subtract(new BigDecimal("16920")).subtract(cumulativeTax);
+                        }
+                        if (top420000.compareTo(cumulative) != -1 && cumulative.compareTo(top300000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax025).subtract(new BigDecimal("31920")).subtract(cumulativeTax);
+                        }
+                        if (top660000.compareTo(cumulative) != -1 && cumulative.compareTo(top420000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax03).subtract(new BigDecimal("52920")).subtract(cumulativeTax);
+                        }
+                        if (top960000.compareTo(cumulative) != -1 && cumulative.compareTo(top660000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax035).subtract(new BigDecimal("85920")).subtract(cumulativeTax);
+                        }
+                        if (cumulative.compareTo(top960000) == 1) { //cumulative > top960000
+                            personalTax = cumulative.multiply(Tax045).subtract(new BigDecimal("181920")).subtract(cumulativeTax);
+                        }
+                        if(personalTax.compareTo(new BigDecimal("0")) < 0){
+                            personalTax = new BigDecimal("0");
+                        }
                     }
 
                     salaryManagementHoliday.setPersonalTax(personalTax);//个税
@@ -778,27 +1168,36 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     salaryAttendanceWorkOvertime.setUserId(userId);
                     salaryAttendanceWorkOvertime.setCode(o.getCode());
                     salaryAttendanceWorkOvertime.setName(o.getName());
+                    salaryAttendanceWorkOvertime.setSysOrgCode(o.getSysOrgCode());
                     salaryAttendanceWorkOvertime.setOrgName(orgName);
                     salaryAttendanceWorkOvertime.setCardNo(o.getCardNo());
 
                     //加班工资 = 工资基数÷出勤天数(22or26)÷420or480(每天的上班分钟数)×加班时间分钟数
                     BigDecimal workOverTotal = new BigDecimal("0");
-                    workOverTotal = salaryBaseBig.divide(attendanceDays, 2, BigDecimal.ROUND_HALF_UP)
-                            .divide(workingHours.multiply(new BigDecimal("60")), 2, BigDecimal.ROUND_HALF_UP).multiply(workOvertime);
+                    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());
                     salaryAttendanceWorkOvertime.setPayTaxes(payTaxesText);//应纳税所得额
 
+                    //累计个税 = 本年度当前人员所有个税之和
+                    BigDecimal cumulativeTax = new BigDecimal("0");
                     //累计所得额 = 本年度当前人员所有应纳税所得之和
                     BigDecimal cumulative = new BigDecimal("0");
                     if (workOverTotal.compareTo(BigDecimal.ZERO) != 0) {
 
-                        List<SalaryManagementDetail> cumulativeList = salaryManagementDetailMapper.selectByUser(userId, withMonth, yearWithMonth);
+//                        List<SalaryManagementDetail> cumulativeList = salaryManagementDetailMapper.selectByUser(userId, withMonth, yearWithMonth);
+                        List<SalaryManagementDetail> cumulativeList = salaryManagementDetailMapper.selectByUser(userId, withMonth, null);
                         List<SalaryManagementWorkOvertime> cumulativeOvertimeList = salaryManagementWorkOvertimeMapper.selectByUser(userId, withMonth, yearWithMonth);
+                        List<SalaryManagementHoliday> holidayList = salaryManagementHolidayMapper.selectByUser(userId,withMonth);
 
                         if (cumulativeList.size() > 0) {
                             for (SalaryManagementDetail detail : cumulativeList) {
+
+                                BigDecimal personalTax = detail.getPersonalTax() == null ? BigDecimal.ZERO : detail.getPersonalTax();
+                                cumulativeTax = cumulativeTax.add(personalTax);//个税
+
                                 String hisPayTaxes = detail.getPayTaxes();
                                 hisPayTaxes = AesEncryptUtil.desEncrypt(hisPayTaxes).trim();
                                 BigDecimal bigPayTaxes = new BigDecimal(hisPayTaxes);
@@ -810,6 +1209,10 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
 
                         if (cumulativeOvertimeList.size() > 0) {
                             for (SalaryManagementWorkOvertime detail : cumulativeOvertimeList) {
+
+                                BigDecimal personalTax = detail.getPersonalTax() == null ? BigDecimal.ZERO : detail.getPersonalTax();
+                                cumulativeTax = cumulativeTax.add(personalTax);//个税
+
                                 String hisPayTaxes = detail.getPayTaxes();
                                 hisPayTaxes = AesEncryptUtil.desEncrypt(hisPayTaxes).trim();
                                 BigDecimal bigPayTaxes = new BigDecimal(hisPayTaxes);
@@ -817,7 +1220,23 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                             }
                         }
                         sb.append(withMonth + "年度,此时之前(" + yearWithMonth + ")有效加班工资单" + cumulativeList.size() + "条,已累计入累计所得额中;");
-                        cumulative = cumulative.add(workOverTotal);
+
+                        if(holidayList.size() > 0){
+                            for(SalaryManagementHoliday detail:holidayList){
+
+                                BigDecimal personalTax = detail.getPersonalTax() == null ? BigDecimal.ZERO : detail.getPersonalTax();
+                                cumulativeTax = cumulativeTax.add(personalTax);//个税
+
+                                String hisPayTaxes = detail.getPayTaxes();
+                                hisPayTaxes = AesEncryptUtil.desEncrypt(hisPayTaxes).trim();
+                                BigDecimal bigPayTaxes = new BigDecimal(hisPayTaxes);
+                                cumulative = cumulative.add(bigPayTaxes);
+                            }
+
+                        }
+                        sb.append(withMonth+"年度,此时之前("+yearWithMonth+")有效年休工资单"+cumulativeList.size()+"条,已累计入累计所得额中;");
+
+                        cumulative = cumulative.add(workOverTotal).setScale(2, BigDecimal.ROUND_HALF_UP);;
                     } else {
                         sb.append("本次应发加班工资为0,不计入累计所得额中");
                     }
@@ -828,26 +1247,34 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                     //个税 ===========================
                     BigDecimal personalTax = new BigDecimal("0");
 
-                    if (top36000.compareTo(cumulative) != -1) { //top36000 >= cumulative
-                        personalTax = cumulative.multiply(tax003);
-                    }
-                    if (top144000.compareTo(cumulative) != -1 && cumulative.compareTo(top36000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax01);
-                    }
-                    if (top300000.compareTo(cumulative) != -1 && cumulative.compareTo(top144000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax02);
-                    }
-                    if (top420000.compareTo(cumulative) != -1 && cumulative.compareTo(top300000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax025);
-                    }
-                    if (top660000.compareTo(cumulative) != -1 && cumulative.compareTo(top420000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax03);
-                    }
-                    if (top960000.compareTo(cumulative) != -1 && cumulative.compareTo(top660000) == 1) { //top144000 >= cumulative && cumulative > top36000
-                        personalTax = cumulative.multiply(Tax035);
-                    }
-                    if (cumulative.compareTo(top960000) == 1) { //cumulative > top960000
-                        personalTax = cumulative.multiply(Tax045);
+                    if(cumulative.compareTo(BigDecimal.ZERO) == 0){
+                        //如果应纳税额为0 则个税默认为0
+                    }else{
+
+                        if (top36000.compareTo(cumulative) != -1) { //top36000 >= cumulative
+                            personalTax = cumulative.multiply(tax003).subtract(cumulativeTax);
+                        }
+                        if (top144000.compareTo(cumulative) != -1 && cumulative.compareTo(top36000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax01).subtract(new BigDecimal("2520")).subtract(cumulativeTax);
+                        }
+                        if (top300000.compareTo(cumulative) != -1 && cumulative.compareTo(top144000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax02).subtract(new BigDecimal("16920")).subtract(cumulativeTax);
+                        }
+                        if (top420000.compareTo(cumulative) != -1 && cumulative.compareTo(top300000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax025).subtract(new BigDecimal("31920")).subtract(cumulativeTax);
+                        }
+                        if (top660000.compareTo(cumulative) != -1 && cumulative.compareTo(top420000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax03).subtract(new BigDecimal("52920")).subtract(cumulativeTax);
+                        }
+                        if (top960000.compareTo(cumulative) != -1 && cumulative.compareTo(top660000) == 1) { //top144000 >= cumulative && cumulative > top36000
+                            personalTax = cumulative.multiply(Tax035).subtract(new BigDecimal("85920")).subtract(cumulativeTax);
+                        }
+                        if (cumulative.compareTo(top960000) == 1) { //cumulative > top960000
+                            personalTax = cumulative.multiply(Tax045).subtract(new BigDecimal("181920")).subtract(cumulativeTax);
+                        }
+                        if(personalTax.compareTo(new BigDecimal("0")) < 0){
+                            personalTax = new BigDecimal("0");
+                        }
                     }
 
                     salaryAttendanceWorkOvertime.setPersonalTax(personalTax);//个税
@@ -940,6 +1367,19 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
                 return Result.error("type参数异常");
             }
 
+            if(extraList.size() > 0){
+                for(SalaryManagementExtra e:extraList){
+                    e.setCalculate("1");
+                    if(StringUtils.isNotBlank(yearWithMonth)){
+                        e.setCalculateDate(yearWithMonth);
+                    }else{
+                        e.setCalculateDate(yearWith);
+                    }
+                    e.setActionLog("计入工资单:"+type+"年度:"+yearWith+"年月:"+yearWithMonth);
+                    salaryManagementExtraMapper.updateById(e);
+                }
+            }
+
         } catch (Exception e) {
             e.printStackTrace();
             return Result.error("计算失败,请检查数据是否完整" + e.getMessage());
@@ -1276,6 +1716,116 @@ public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMap
         salaryManagementMapper.deleteVersionDetail(yearWithMonth, ver);
 
 
+    }
+
+    /**
+     * 保存数据 福利现金 年终奖
+     *
+     * @param salaryManagementMFY
+     * @param salaryManagementNBSY
+     * @param salaryManagementZZ
+     * @param salaryAttendanceDetailListMFY
+     * @param salaryAttendanceDetailListNBSY
+     * @param salaryAttendanceDetailListZZ
+     */
+    public void saveExtra(String type,String yearWithMonth,
+                          SalaryManagement salaryManagementMFY, SalaryManagement salaryManagementNBSY, SalaryManagement salaryManagementZZ,
+                        List<SalaryManagementExtra> salaryAttendanceDetailListMFY,
+                        List<SalaryManagementExtra> salaryAttendanceDetailListNBSY,
+                        List<SalaryManagementExtra> salaryAttendanceDetailListZZ
+    ) {
+
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        Date date = new Date();
+
+        Integer ver = salaryManagementMapper.selectVersion(type, yearWithMonth);
+
+        if (ver == null) {
+            ver = 1;
+        } else {
+            ver = ver + 1;
+        }
+
+        if (salaryAttendanceDetailListMFY != null && salaryAttendanceDetailListMFY.size() > 0) {
+
+            salaryManagementMFY.setId(IdUtil.simpleUUID());
+            salaryManagementMFY.setCreateBy(sysUser.getUsername());
+            salaryManagementMFY.setCreateTime(date);
+            salaryManagementMFY.setGenerationTime(date);
+            salaryManagementMFY.setOrgName("马菲羊");
+            salaryManagementMFY.setType(type);
+            salaryManagementMFY.setVersion(String.valueOf(ver));
+            salaryManagementMFY.setNumberPeople(salaryAttendanceDetailListMFY.size());
+            salaryManagementMFY.setYearWithMonth(yearWithMonth);
+            salaryManagementMapper.insert(salaryManagementMFY);
+
+            for (SalaryManagementExtra o : salaryAttendanceDetailListMFY) {
+                o.setHeadId(salaryManagementMFY.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementExtraMapper.insert(o);
+            }
+        }
+
+        if (salaryAttendanceDetailListNBSY != null && salaryAttendanceDetailListNBSY.size() > 0) {
+
+            salaryManagementNBSY.setId(IdUtil.simpleUUID());
+            salaryManagementNBSY.setCreateBy(sysUser.getUsername());
+            salaryManagementNBSY.setCreateTime(date);
+            salaryManagementNBSY.setGenerationTime(date);
+            salaryManagementNBSY.setOrgName("森语");
+            salaryManagementNBSY.setType(type);
+            salaryManagementNBSY.setVersion(String.valueOf(ver));
+            salaryManagementNBSY.setNumberPeople(salaryAttendanceDetailListNBSY.size());
+            salaryManagementNBSY.setYearWithMonth(yearWithMonth);
+            salaryManagementMapper.insert(salaryManagementNBSY);
+
+            for (SalaryManagementExtra o : salaryAttendanceDetailListNBSY) {
+                o.setHeadId(salaryManagementNBSY.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementExtraMapper.insert(o);
+            }
+
+        }
+
+        if (salaryAttendanceDetailListZZ != null && salaryAttendanceDetailListZZ.size() > 0) {
+
+            salaryManagementZZ.setId(IdUtil.simpleUUID());
+            salaryManagementZZ.setCreateBy(sysUser.getUsername());
+            salaryManagementZZ.setCreateTime(date);
+            salaryManagementZZ.setGenerationTime(date);
+            salaryManagementZZ.setOrgName("正织");
+            salaryManagementZZ.setType(type);
+            salaryManagementZZ.setVersion(String.valueOf(ver));
+            salaryManagementZZ.setNumberPeople(salaryAttendanceDetailListZZ.size());
+            salaryManagementZZ.setYearWithMonth(yearWithMonth);
+            salaryManagementMapper.insert(salaryManagementZZ);
+
+            for (SalaryManagementExtra o : salaryAttendanceDetailListZZ) {
+                o.setHeadId(salaryManagementZZ.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementExtraMapper.insert(o);
+            }
+
+        }
+
+        salaryManagementMapper.deleteVersion(type, yearWithMonth, ver);
+        if(type.equals("福利现金")){
+            salaryManagementMapper.deleteVersionExtra(yearWithMonth, "0", ver);
+        }else{
+            //年终奖
+            salaryManagementMapper.deleteVersionExtra(yearWithMonth, "1",ver);
+        }
+
+
     }
 
     public static void main(String[] args) throws Exception {

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

@@ -18,5 +18,8 @@ public class ExcelDemo {
     /**工资*/
     @Excel(name = "员工工资", width = 15)
     private String wages;
+    /**序号*/
+    @Excel(name = "序号", width = 15)
+    private Integer index;
 }
 

+ 6 - 4
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/vo/SalaryManagementPage.java

@@ -1,11 +1,9 @@
 package org.jeecg.modules.salary.vo;
 
 import java.util.List;
-import org.jeecg.modules.salary.entity.SalaryManagement;
-import org.jeecg.modules.salary.entity.SalaryManagementDetail;
+
+import org.jeecg.modules.salary.entity.*;
 import lombok.Data;
-import org.jeecg.modules.salary.entity.SalaryManagementHoliday;
-import org.jeecg.modules.salary.entity.SalaryManagementWorkOvertime;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.jeecgframework.poi.excel.annotation.ExcelCollection;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -80,4 +78,8 @@ public class SalaryManagementPage {
 
 	@ExcelCollection(name="薪资管理子表-年休工资单")
 	private List<SalaryManagementHoliday> salaryManagementHolidayList;
+
+	@ExcelCollection(name="薪资管理子表-福利现金/年终奖")
+	private List<SalaryManagementExtra> salaryManagementExtraList;
+
 }

+ 23 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java

@@ -192,6 +192,29 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		return permissionSet;
 	}
 
+	/**
+	 * 通过用户名获取用户权限集合
+	 *
+	 * @param username 用户名
+	 * @return 权限集合
+	 */
+	@Override
+	public Set<String> getUserUrlSet(String username) {
+		Set<String> permissionSet = new HashSet<>();
+		List<SysPermission> permissionList = sysPermissionMapper.queryByUser(username);
+		for (SysPermission po : permissionList) {
+//			// TODO URL规则有问题?
+			if (oConvertUtils.isNotEmpty(po.getUrl())) {
+				permissionSet.add(po.getUrl());
+			}
+//			if (oConvertUtils.isNotEmpty(po.getPerms())) {
+//				permissionSet.add(po.getPerms());
+//			}
+		}
+		log.info("-------通过数据库读取用户拥有的权限Perms------username: "+ username+",Perms size: "+ (permissionSet==null?0:permissionSet.size()) );
+		return permissionSet;
+	}
+
 	@Override
 	public SysUserCacheInfo getCacheUser(String username) {
 		SysUserCacheInfo info = new SysUserCacheInfo();