Browse Source

薪资代码

yuansh 2 years ago
parent
commit
0dff6ee33b
61 changed files with 5471 additions and 11 deletions
  1. 10 1
      jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/api/vo/Result.java
  2. 2 0
      jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java
  3. 29 4
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oa/controller/IncidentTicketController.java
  4. 472 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/controller/SalaryAttendanceController.java
  5. 318 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/controller/SalaryChangeRecordController.java
  6. 739 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/controller/SalaryManagementController.java
  7. 52 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryAttendance.java
  8. 131 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryAttendanceDetail.java
  9. 77 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryAttendanceHoliday.java
  10. 101 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryAttendanceWorkOvertime.java
  11. 180 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryChangeRecord.java
  12. 79 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryManagement.java
  13. 125 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryManagementDetail.java
  14. 99 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryManagementHoliday.java
  15. 108 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/entity/SalaryManagementWorkOvertime.java
  16. 23 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryAttendanceDetailMapper.java
  17. 20 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryAttendanceHolidayMapper.java
  18. 23 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryAttendanceMapper.java
  19. 20 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryAttendanceWorkOvertimeMapper.java
  20. 30 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryChangeRecordMapper.java
  21. 24 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryManagementDetailMapper.java
  22. 24 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryManagementHolidayMapper.java
  23. 23 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryManagementMapper.java
  24. 24 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/SalaryManagementWorkOvertimeMapper.java
  25. 45 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryAttendanceDetailMapper.xml
  26. 26 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryAttendanceHolidayMapper.xml
  27. 28 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryAttendanceMapper.xml
  28. 27 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryAttendanceWorkOvertimeMapper.xml
  29. 220 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryChangeRecordMapper.xml
  30. 40 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryManagementDetailMapper.xml
  31. 34 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryManagementHolidayMapper.xml
  32. 28 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryManagementMapper.xml
  33. 40 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryManagementWorkOvertimeMapper.xml
  34. 16 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryAttendanceDetailService.java
  35. 16 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryAttendanceHolidayService.java
  36. 45 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryAttendanceService.java
  37. 16 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryAttendanceWorkOvertimeService.java
  38. 26 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryChangeRecordService.java
  39. 16 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryManagementDetailService.java
  40. 16 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryManagementHolidayService.java
  41. 50 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryManagementService.java
  42. 16 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/ISalaryManagementWorkOvertimeService.java
  43. 27 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryAttendanceDetailServiceImpl.java
  44. 27 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryAttendanceHolidayServiceImpl.java
  45. 137 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryAttendanceServiceImpl.java
  46. 27 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryAttendanceWorkOvertimeServiceImpl.java
  47. 156 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryChangeRecordServiceImpl.java
  48. 36 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryManagementDetailServiceImpl.java
  49. 27 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryManagementHolidayServiceImpl.java
  50. 1369 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryManagementServiceImpl.java
  51. 27 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/service/impl/SalaryManagementWorkOvertimeServiceImpl.java
  52. 22 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/vo/ExcelDemo.java
  53. 68 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/vo/SalaryAttendancePage.java
  54. 83 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/vo/SalaryManagementPage.java
  55. 3 2
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java
  56. 8 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml
  57. 2 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictService.java
  58. 2 1
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
  59. 5 0
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java
  60. 5 1
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java
  61. 2 2
      jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/jeecg_database.properties

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

@@ -87,7 +87,16 @@ public class Result<T> implements Serializable {
 		r.setMessage(msg);
 		return r;
 	}
-	
+
+	public static Result<Object> okAndMap(String msg,Map<String,Object> data) {
+		Result<Object> r = new Result<Object>();
+		r.setSuccess(true);
+		r.setCode(CommonConstant.SC_OK_200);
+		r.setMessage(msg);
+		r.setData(data);
+		return r;
+	}
+
 	public static Result<Object> ok(Object data) {
 		Result<Object> r = new Result<Object>();
 		r.setSuccess(true);

+ 2 - 0
jeecg-boot/jeecg-boot-base-common/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java

@@ -80,6 +80,8 @@ public interface ISysBaseAPI {
 	 */
 	public List<DictModel> queryDictItemsByCode(String code);
 
+	public int queryDictCountBy(String code, String itemText, String itemValue);
+
 	/** 查询所有的父级字典,按照create_time排序 */
 	public List<DictModel> queryAllDict();
 

+ 29 - 4
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/oa/controller/IncidentTicketController.java

@@ -102,10 +102,17 @@ public class IncidentTicketController {
 //		}else{
 //			System.out.println("tre");
 //		}
-		String practicalSumOld = "-1232131.23232";
-		BigDecimal practicalSumBig = new BigDecimal(practicalSumOld).abs();//
-		String practicalSum = practicalSumBig.toString();
-		System.out.println(new BigDecimal(practicalSum));
+//		String practicalSumOld = "-1232131.23232";
+//		BigDecimal practicalSumBig = new BigDecimal(practicalSumOld).abs();//
+//		String practicalSum = practicalSumBig.toString();
+//		System.out.println(new BigDecimal(practicalSum));
+
+		String aa = "id,name";
+
+		String bb = aa.replaceAll(",",",cl.");
+
+		String cc = "CONCAT(cl."+bb+") ";
+		System.out.println(cc);
 
 	 }
 	 @RequestMapping(value = "/list1", method = RequestMethod.GET)
@@ -156,15 +163,24 @@ public class IncidentTicketController {
 		String state = incidentTicket.getState();//单据状态
 		String informant = incidentTicket.getInformant();//填报人
 		String processor = incidentTicket.getProcessor();//处理人
+		String responsibilityPerson1 = incidentTicket.getResponsibilityPerson1();//责任人
 
 		String handle = incidentTicket.getHandle();
 		incidentTicket.setProcessor(null);
 		incidentTicket.setState(null);
 		incidentTicket.setInformant(null);
 		incidentTicket.setHandle(null);
+		incidentTicket.setResponsibilityPerson1(null);
+
 		QueryWrapper<IncidentTicket> queryWrapper = QueryGenerator.initQueryWrapper(incidentTicket, req.getParameterMap());
 		queryWrapper.eq("1","1");
 
+        if(StringUtils.isNotBlank(responsibilityPerson1)){
+            queryWrapper.and(wrapper -> wrapper.like("responsibility_Person1",responsibilityPerson1)
+                    .or().like("responsibility_Person2",responsibilityPerson1)
+                    .or().like("responsibility_Person3",responsibilityPerson1)
+                    .or().like("responsibility_Person4",responsibilityPerson1));
+        }
 //		queryWrapper.last("and id in(select table_id from act_z_business where table_name='incident_ticket' and result = 2) " +
 //				"order by accident_number desc ");
 		if(StringUtils.isNotBlank(state)){
@@ -654,17 +670,26 @@ public class IncidentTicketController {
 		String state = incidentTicket.getState();//单据状态
 		String informant = incidentTicket.getInformant();//填报人
 		String processor = incidentTicket.getProcessor();//处理人
+		String responsibilityPerson1 = incidentTicket.getResponsibilityPerson1();//责任人
 
 		String handle = incidentTicket.getHandle();
 		incidentTicket.setProcessor(null);
 		incidentTicket.setState(null);
 		incidentTicket.setInformant(null);
 		incidentTicket.setHandle(null);
+		incidentTicket.setResponsibilityPerson1(null);
+
 		QueryWrapper<IncidentTicket> queryWrapper = QueryGenerator.initQueryWrapper(incidentTicket, request.getParameterMap());
 		queryWrapper.eq("1","1");
 
 //		queryWrapper.last("and id in(select table_id from act_z_business where table_name='incident_ticket' and result = 2) " +
 //				"order by accident_number desc ");
+        if(StringUtils.isNotBlank(responsibilityPerson1)){
+            queryWrapper.and(wrapper -> wrapper.like("responsibility_Person1",responsibilityPerson1)
+                    .or().like("responsibility_Person2",responsibilityPerson1)
+                    .or().like("responsibility_Person3",responsibilityPerson1)
+                    .or().like("responsibility_Person4",responsibilityPerson1));
+        }
 		if(StringUtils.isNotBlank(state)){
 			queryWrapper.in("state",state.split(","));
 		}

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

@@ -0,0 +1,472 @@
+package org.jeecg.modules.salary.controller;
+
+import java.io.UnsupportedEncodingException;
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.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.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.SalaryAttendancePage;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import com.alibaba.fastjson.JSON;
+
+/**
+ * @Description: 考勤管理主表
+ * @Author: jeecg-boot
+ * @Date: 2024-04-10
+ * @Version: V1.0
+ */
+@RestController
+@RequestMapping("/salary/salaryAttendance")
+@Slf4j
+public class SalaryAttendanceController {
+    @Autowired
+    private ISalaryAttendanceService salaryAttendanceService;
+    @Autowired
+    private ISalaryAttendanceDetailService salaryAttendanceDetailService;
+    @Autowired
+    private ISalaryAttendanceWorkOvertimeService salaryAttendanceWorkOvertimeService;
+    @Autowired
+    private ISalaryAttendanceHolidayService salaryAttendanceHolidayService;
+    @Autowired
+    private ISalaryChangeRecordService salaryChangeRecordService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param salaryAttendance
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @GetMapping(value = "/list")
+    public Result<?> queryPageList(SalaryAttendance salaryAttendance,
+                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                   HttpServletRequest req) {
+        salaryAttendance.setDelFlag("0");
+        QueryWrapper<SalaryAttendance> queryWrapper = QueryGenerator.initQueryWrapper(salaryAttendance, req.getParameterMap());
+        Page<SalaryAttendance> page = new Page<SalaryAttendance>(pageNo, pageSize);
+        IPage<SalaryAttendance> pageList = salaryAttendanceService.page(page, queryWrapper);
+        return Result.ok(pageList);
+    }
+
+    /**
+     * 添加
+     *
+     * @param salaryAttendancePage
+     * @return
+     */
+    @PostMapping(value = "/add")
+    public Result<?> add(@RequestBody SalaryAttendancePage salaryAttendancePage) {
+        SalaryAttendance salaryAttendance = new SalaryAttendance();
+        BeanUtils.copyProperties(salaryAttendancePage, salaryAttendance);
+        salaryAttendanceService.saveMain(salaryAttendance, salaryAttendancePage.getSalaryAttendanceDetailList(),null,null);
+        return Result.ok("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param salaryAttendancePage
+     * @return
+     */
+    @PutMapping(value = "/edit")
+    public Result<?> edit(@RequestBody SalaryAttendancePage salaryAttendancePage) {
+        SalaryAttendance salaryAttendance = new SalaryAttendance();
+        BeanUtils.copyProperties(salaryAttendancePage, salaryAttendance);
+        salaryAttendanceService.updateMain(salaryAttendance, salaryAttendancePage.getSalaryAttendanceDetailList());
+        return Result.ok("编辑成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        salaryAttendanceService.delMain(id);
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.salaryAttendanceService.delBatchMain(Arrays.asList(ids.split(",")));
+        return Result.ok("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/queryById")
+    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
+        SalaryAttendance salaryAttendance = salaryAttendanceService.getById(id);
+        return Result.ok(salaryAttendance);
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/querySalaryAttendanceDetailByMainId")
+    public Result<?> querySalaryAttendanceDetailListByMainId(@RequestParam(name = "id", required = true) String id,
+                                                             String orgName,String yearWithMonth,String version,String name,String remarks) {
+
+        List<SalaryAttendanceDetail> salaryAttendanceDetailList = salaryAttendanceDetailService.selectByMainId(id,orgName,yearWithMonth,version,name,remarks);
+        return Result.ok(salaryAttendanceDetailList);
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/querySalaryAttendanceWorkOvertimeByMainId")
+    public Result<?> querySalaryAttendanceWorkOvertimeListByMainId(@RequestParam(name="id",required=true) String id,String orgName
+            ,String name) {
+        List<SalaryAttendanceWorkOvertime> salaryAttendanceWorkOvertimeList = salaryAttendanceWorkOvertimeService.selectByMainId(id,orgName,name);
+        return Result.ok(salaryAttendanceWorkOvertimeList);
+    }
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/querySalaryAttendanceHolidayByMainId")
+    public Result<?> querySalaryAttendanceHolidayListByMainId(@RequestParam(name="id",required=true) String id,String orgName
+            ,String name) {
+        List<SalaryAttendanceHoliday> salaryAttendanceHolidayList = salaryAttendanceHolidayService.selectByMainId(id,orgName,name);
+        return Result.ok(salaryAttendanceHolidayList);
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param salaryAttendance
+     */
+//    @RequestMapping(value = "/exportXls")
+//    public ModelAndView exportXls(HttpServletRequest request, SalaryAttendance salaryAttendance) {
+//        // Step.1 组装查询条件
+//        QueryWrapper<SalaryAttendance> queryWrapper = QueryGenerator.initQueryWrapper(salaryAttendance, request.getParameterMap());
+//        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//
+//        //Step.2 获取导出数据
+//        List<SalaryAttendancePage> pageList = new ArrayList<SalaryAttendancePage>();
+//        List<SalaryAttendance> salaryAttendanceList = salaryAttendanceService.list(queryWrapper);
+//        for (SalaryAttendance temp : salaryAttendanceList) {
+//            SalaryAttendancePage vo = new SalaryAttendancePage();
+//            BeanUtils.copyProperties(temp, vo);
+//            List<SalaryAttendanceDetail> salaryAttendanceDetailList = salaryAttendanceDetailService.selectByMainId(temp.getId(),null,null,null,null,null);
+//            vo.setSalaryAttendanceDetailList(salaryAttendanceDetailList);
+//            pageList.add(vo);
+//        }
+//        //Step.3 调用AutoPoi导出Excel
+//        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+//        mv.addObject(NormalExcelConstants.FILE_NAME, "考勤管理主表");
+//        mv.addObject(NormalExcelConstants.CLASS, SalaryAttendancePage.class);
+//        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("考勤管理主表数据", "导出人:" + sysUser.getRealname(), "考勤管理主表"));
+//        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+//        return mv;
+//    }
+//
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, SalaryAttendance salaryAttendance) {
+        return this.exportXlsView(request, salaryAttendance);
+    }
+
+    protected ModelAndView exportXlsView(HttpServletRequest request, SalaryAttendance object) {
+        // Step.1 组装查询条件
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+        // Step.3 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+
+        String type = object.getType();
+        String title = "";
+        if(type.equals("考勤表")){
+            // Step.2 获取导出数据
+            title = "考勤表";
+            List<SalaryAttendanceDetail> exportList = salaryAttendanceDetailService.selectByMainId(object.getId(),null,null,null,null,null);
+            mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+            mv.addObject(NormalExcelConstants.CLASS, SalaryAttendanceDetail.class);
+
+            mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
+            mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+
+        }else if(type.equals("加班表")){
+            // Step.2 获取导出数据
+            title = "加班表";
+            List<SalaryAttendanceWorkOvertime> exportList = salaryAttendanceWorkOvertimeService.selectByMainId(object.getId(),null,null);
+            mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+            mv.addObject(NormalExcelConstants.CLASS, SalaryAttendanceWorkOvertime.class);
+
+            mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
+            mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+
+        }else if(type.equals("年休表")){
+            // Step.2 获取导出数据
+            title = "年休表";
+            List<SalaryAttendanceHoliday> exportList = salaryAttendanceHolidayService.selectByMainId(object.getId(),null,null);
+            mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+            mv.addObject(NormalExcelConstants.CLASS, SalaryAttendanceHoliday.class);
+
+            mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
+            mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+
+        }
+        return mv;
+     }
+
+
+    /**
+     * 校验导入模板是否完整
+     * @param file
+     * @param type
+     * @return
+     */
+     public boolean 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<>();
+         if (rowIterator.hasNext()) {
+             Row headerRow = rowIterator.next();
+             if (rowIterator.hasNext()) {
+                 headerRow = rowIterator.next();
+                 Iterator<Cell> cellIterator = headerRow.cellIterator();
+                 while (cellIterator.hasNext()) {
+                     Cell cell = cellIterator.next();
+                     header.add(cell.getStringCellValue());
+                 }
+             }
+         }
+         if("考勤表".equals(type)){
+             String fileName = "编号,姓名,工资卡号,单双休,每日工时,出勤天数,话费补贴,午餐补贴,住房补贴,交通补贴,全勤奖,养老保险,失业保险,医疗保险,公积金,工资抵扣,迟到次数,迟到扣费,事假时间(分),病假时间(分),婚假时间(分),丧假时间(分),年假时间(天),加班时间(分)";
+             for(String o:fileName.split(",")){
+                if(!header.contains(o)){
+                    return false;
+                }
+
+             }
+         }else if("年休表".equals(type)){
+             String fileName = "编号,姓名,工资卡号,单双休,工时/天,年假天数,已请天数,剩余天数";
+             for(String o:fileName.split(",")){
+                 if(!header.contains(o)){
+                     return false;
+                 }
+
+             }
+         }else{
+             return false;
+         }
+         return true;
+     }
+
+    public static void main(String[] args) {
+        List<String> header = new ArrayList<>();
+        header.add("编号");
+        header.add("姓名");
+        header.add("工资卡号");
+        System.out.println(header.toString());
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response,SalaryAttendance salaryAttendance) throws IOException, InvalidFormatException {
+
+        if(StringUtils.isEmpty(salaryAttendance.getYearWithMonth()) || StringUtils.isEmpty(salaryAttendance.getType())){
+            return Result.error("参数异常:年月或类型为空!!");
+        }
+
+        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(1);
+            params.setHeadRows(1);
+            params.setNeedSave(false);
+
+            boolean st = this.ifExist(file,salaryAttendance.getType());
+            if(!st){
+                return Result.error("导入模板异常,请勿增删改导入模板的字段!!");
+            }
+
+            salaryAttendance.setName(file.getOriginalFilename());
+
+            try {
+
+                int size = 0;
+                List<SalaryAttendanceDetail> detailList = new ArrayList<>();
+                List<SalaryAttendanceWorkOvertime> workOvertimeList = new ArrayList<>();
+                List<SalaryAttendanceHoliday> attendanceHolidayList = new ArrayList<>();
+
+
+                if(salaryAttendance.getType().equals("考勤表")){
+
+                    List<SalaryAttendanceDetail> list = ExcelImportUtil.importExcel(file.getInputStream(), SalaryAttendanceDetail.class, params);
+
+                    for (SalaryAttendanceDetail page : list) {
+
+                        String name = page.getName();//员工姓名
+                        String cardNo = page.getCardNo();//卡号
+
+                        if (StringUtils.isEmpty(name) || StringUtils.isEmpty(cardNo)) {
+                            continue;
+                        }
+
+                        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.setWages(entry.getBeforeAdjustment());
+                        page.setYearWithMonth(salaryAttendance.getYearWithMonth());
+
+                        detailList.add(page);
+                    }
+                    size = detailList.size();
+
+                }
+                else if(salaryAttendance.getType().equals("加班表")){
+
+                    List<SalaryAttendanceWorkOvertime> list = ExcelImportUtil.importExcel(file.getInputStream(), SalaryAttendanceWorkOvertime.class, params);
+
+                    for (SalaryAttendanceWorkOvertime page : list) {
+
+                        String name = page.getName();//员工姓名
+                        String cardNo = page.getCardNo();//卡号
+
+                        if (StringUtils.isEmpty(name) || StringUtils.isEmpty(cardNo)) {
+                            continue;
+                        }
+
+                        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(salaryAttendance.getYearWithMonth());
+
+                        workOvertimeList.add(page);
+                    }
+                    size = workOvertimeList.size();
+
+                }
+                else if(salaryAttendance.getType().equals("年休表")){
+
+                    List<SalaryAttendanceHoliday> list = ExcelImportUtil.importExcel(file.getInputStream(), SalaryAttendanceHoliday.class, params);
+
+                    for (SalaryAttendanceHoliday page : list) {
+
+                        String name = page.getName();//员工姓名
+                        String cardNo = page.getCardNo();//卡号
+
+                        if (StringUtils.isEmpty(name) || StringUtils.isEmpty(cardNo)) {
+                            continue;
+                        }
+
+                        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(salaryAttendance.getYearWithMonth());
+
+                        attendanceHolidayList.add(page);
+                    }
+                    size = attendanceHolidayList.size();
+
+
+                }
+
+                if(size > 0 ){
+
+                    salaryAttendanceService.saveMain(salaryAttendance, detailList,workOvertimeList,attendanceHolidayList);
+                }else{
+                    return Result.error("文件导入失败:导入模板不正确或者导入数据为空!" );
+                }
+
+                return Result.ok("文件导入成功!合法数据行数:" + size);
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,318 @@
+package org.jeecg.modules.salary.controller;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.SqlInjectionUtil;
+import org.jeecg.common.util.encryption.AesEncryptUtil;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.salary.entity.SalaryChangeRecord;
+import org.jeecg.modules.salary.service.ISalaryChangeRecordService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.model.SysUserSysDepartModel;
+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.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 薪资变更记录
+ * @Author: jeecg-boot
+ * @Date: 2024-04-10
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "薪资变更记录")
+@RestController
+@RequestMapping("/salary/salaryChangeRecord")
+public class SalaryChangeRecordController extends JeecgController<SalaryChangeRecord, ISalaryChangeRecordService> {
+    @Autowired
+    private ISalaryChangeRecordService salaryChangeRecordService;
+
+//    @ModelAttribute
+//    public void get() {
+//
+//        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//        if(!"111".equals(sysUser.getUsername())){
+//            throw new JeecgBootException("无权操作此功能!!!");
+//        }
+//    }
+    /**
+     * 分页列表查询
+     *
+     * @param salaryChangeRecord
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "薪资变更记录-分页列表查询")
+    @ApiOperation(value = "薪资变更记录-分页列表查询", notes = "薪资变更记录-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<?> queryPageList(SalaryChangeRecord salaryChangeRecord,
+                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                   HttpServletRequest req) {
+        QueryWrapper<SalaryChangeRecord> queryWrapper = QueryGenerator.initQueryWrapper(salaryChangeRecord, req.getParameterMap());
+        Page<SalaryChangeRecord> page = new Page<SalaryChangeRecord>(pageNo, pageSize);
+        IPage<SalaryChangeRecord> pageList = salaryChangeRecordService.page(page, queryWrapper);
+        for (SalaryChangeRecord o : pageList.getRecords()) {
+            try {
+                String salaryReduction = o.getSalaryReduction();//降薪额度
+                String salaryIncrease = o.getSalaryIncrease();//涨薪额度
+                if (StringUtils.isNotBlank(salaryReduction)) {
+                    o.setSalaryReduction(AesEncryptUtil.desEncrypt(salaryReduction).trim());
+                }
+                if (StringUtils.isNotBlank(salaryIncrease)) {
+                    o.setSalaryIncrease(AesEncryptUtil.desEncrypt(salaryIncrease).trim());
+                }
+            } catch (Exception e) {
+                System.out.println("解密失败!!");
+            }
+        }
+
+        return Result.ok(pageList);
+    }
+
+    /**
+     * 基本薪资
+     *
+     * @param pageNo
+     * @param pageSize
+     * @param userParams
+     * @return
+     */
+    @GetMapping("/querySalaryList")
+    public Result<?> querySalaryList(
+            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+            SalaryChangeRecord userParams, HttpServletRequest req) {
+
+        String syHireType = userParams.getSyHireType();
+        String typeSql = "";
+        if(StringUtils.isNotBlank(syHireType)){
+            String[] types = syHireType.split(",");
+            for(String o:types){
+                typeSql = typeSql + ",'" + o + "'";
+            }
+        }
+        if(StringUtils.isNotBlank(typeSql)){
+            typeSql = "("+typeSql.substring(1)+")";
+            userParams.setSyHireType(typeSql);
+        }
+
+        String column=null,order="asc";
+        String sql = "";
+
+        Map<String, String[]> parameterMap = req.getParameterMap();
+        if(parameterMap!=null&& parameterMap.containsKey("column")) {
+            column = parameterMap.get("column")[0];
+        }
+        if(parameterMap!=null&& parameterMap.containsKey("order")) {
+            order = parameterMap.get("order")[0];
+        }
+        if(StringUtils.isNotBlank(column)){
+            SqlInjectionUtil.filterContent(column);
+//            column = oConvertUtils.camelToUnderline(column);
+            sql = "order by "+column +" "+order +", substring_index(work_no, '-', 1) + 0 ASC,work_no";
+
+        }else{
+            sql = "order by substring_index(work_no, '-', 1) + 0 ASC,work_no";
+        }
+        userParams.setSqlParameter(sql);
+        IPage page = new Page(pageNo, pageSize);
+        IPage<SalaryChangeRecord> pageList = salaryChangeRecordService.selectUserInfo(userParams, page);
+        return Result.ok(pageList);
+
+    }
+
+
+    public static void main(String[] args) {
+
+        String syHireType = "在职,离职";
+        String typeSql = "";
+        if(StringUtils.isNotBlank(syHireType)){
+            String[] types = syHireType.split(",");
+            for(String o:types){
+                typeSql = typeSql + ",'" + o + "'";
+            }
+        }
+        if(StringUtils.isNotBlank(typeSql)){
+            typeSql = "("+typeSql.substring(1)+")";
+        }
+        System.out.println(typeSql);
+//        queryWrapper.last("and IFNULL(sy_Hire_Type,'在职') !='离职' order by substring_index(work_no, '-', 1) + 0 asc,work_no asc");
+
+
+//        String column="sysOrgCode",order="ASC";
+//        Map<String, String[]> parameterMap = new HashMap<>();
+//        QueryWrapper<SalaryChangeRecord> queryWrapper = new QueryWrapper<>();
+//        QueryGenerator.doMultiFieldsOrder(queryWrapper,parameterMap);
+//        if(column.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {
+//            column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
+//        }
+//        System.out.println(column);
+//        oConvertUtils.camelToUnderline(column);
+//        //SQL注入check
+//        SqlInjectionUtil.filterContent(column);
+//        System.out.println(column);
+//        oConvertUtils.camelToUnderline(column);
+//        System.out.println(oConvertUtils.camelToUnderline(column));
+//        if (order.toUpperCase().indexOf("ASC")>=0) {
+//            queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column));
+//        } else {
+//            queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column));
+//        }
+//        System.out.println(queryWrapper.getSqlComment());
+    }
+
+
+    /**
+     * 添加
+     *
+     * @param salaryChangeRecord
+     * @return
+     */
+    @AutoLog(value = "薪资变更记录-添加")
+    @ApiOperation(value = "薪资变更记录-添加", notes = "薪资变更记录-添加")
+    @PostMapping(value = "/saveSalaryChangeRecord")
+    public Result<?> saveSalaryChangeRecord(@RequestBody SalaryChangeRecord salaryChangeRecord) {
+        return salaryChangeRecordService.saveSalaryChangeRecord(salaryChangeRecord);
+    }
+
+    /**
+     * 编辑
+     *
+     * @param salaryChangeRecord
+     * @return
+     */
+    @AutoLog(value = "薪资变更记录-编辑")
+    @ApiOperation(value = "薪资变更记录-编辑", notes = "薪资变更记录-编辑")
+    @PutMapping(value = "/edit")
+    public Result<?> edit(@RequestBody SalaryChangeRecord salaryChangeRecord) {
+        salaryChangeRecordService.updateById(salaryChangeRecord);
+        return Result.ok("编辑成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "薪资变更记录-通过id删除")
+    @ApiOperation(value = "薪资变更记录-通过id删除", notes = "薪资变更记录-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        salaryChangeRecordService.removeById(id);
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "薪资变更记录-批量删除")
+    @ApiOperation(value = "薪资变更记录-批量删除", notes = "薪资变更记录-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.salaryChangeRecordService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.ok("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "薪资变更记录-通过id查询")
+    @ApiOperation(value = "薪资变更记录-通过id查询", notes = "薪资变更记录-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
+        SalaryChangeRecord salaryChangeRecord = salaryChangeRecordService.getById(id);
+        return Result.ok(salaryChangeRecord);
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param salaryChangeRecord
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, SalaryChangeRecord salaryChangeRecord) {
+        return super.exportXls(request, salaryChangeRecord, SalaryChangeRecord.class, "薪资变更记录");
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, SalaryChangeRecord.class);
+    }
+
+
+    /**
+     * 新增基本工资
+     * @param basicSalary
+     * @return
+     */
+    @ApiOperation(value = "新增基本工资", notes = "新增基本工资")
+    @GetMapping(value = "/insertSalaryBasicSalaryRecord")
+    public Result<?> insertSalaryBasicSalaryRecord(@RequestParam(name = "basicSalary", required = true) BigDecimal basicSalary) {
+        String state = salaryChangeRecordService.insertSalaryBasicSalaryRecord(basicSalary);
+        if("false".equals(state)){
+            return Result.error("执行失败,请联系管理员!");
+        }
+        return Result.ok("执行成功");
+    }
+
+    /**
+     * 新增基本工资
+     * @return
+     */
+    @ApiOperation(value = "查询基本工资", notes = "查询基本工资")
+    @GetMapping(value = "/selectSalary")
+    public BigDecimal selectSalary() {
+        BigDecimal state = salaryChangeRecordService.selectSalary();
+        return state;
+    }
+
+}

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

@@ -0,0 +1,739 @@
+package org.jeecg.modules.salary.controller;
+
+import java.io.*;
+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.jeecg.common.system.vo.LoginUser;
+import org.apache.shiro.SecurityUtils;
+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;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.entity.TemplateExportParams;
+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;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import com.alibaba.fastjson.JSON;
+
+/**
+ * @Description: 薪资管理主表
+ * @Author: jeecg-boot
+ * @Date: 2024-04-16
+ * @Version: V1.0
+ */
+@RestController
+@RequestMapping("/salary/salaryManagement")
+@Slf4j
+public class SalaryManagementController {
+    @Autowired
+    private ISalaryManagementService salaryManagementService;
+    @Autowired
+    private ISalaryManagementDetailService salaryManagementDetailService;
+    @Autowired
+    private ISalaryManagementWorkOvertimeService salaryManagementWorkOvertimeService;
+    @Autowired
+    private ISalaryManagementHolidayService salaryManagementHolidayService;
+    @Autowired
+    private ISalaryChangeRecordService salaryChangeRecordService;
+
+    /**
+     * 分页列表查询 (工资单)
+     *
+     * @param salaryManagement
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @GetMapping(value = "/list")
+    public Result<?> queryPageList(SalaryManagement salaryManagement,
+                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                   HttpServletRequest req) {
+        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);
+        IPage<SalaryManagement> pageList = salaryManagementService.page(page, queryWrapper);
+        for (SalaryManagement o : pageList.getRecords()) {
+            try {
+                String Salary = o.getSalary();//发放薪水
+                String PersonalTax = o.getPersonalTax();//发放个税
+                if (StringUtils.isNotBlank(Salary)) {
+                    o.setSalary(AesEncryptUtil.desEncrypt(Salary).trim());
+                }
+                if (StringUtils.isNotBlank(PersonalTax)) {
+                    o.setPersonalTax(AesEncryptUtil.desEncrypt(PersonalTax).trim());
+                }
+            } catch (Exception e) {
+                System.out.println("解密失败!!");
+            }
+        }
+        return Result.ok(pageList);
+    }
+
+
+    /**
+     * 查询薪资统计
+     *
+     * @param pageNo
+     * @param pageSize
+     * @param userParams
+     * @return
+     */
+    @GetMapping("/querySalaryTotalList")
+    public Result<?> querySalaryTotalList(
+            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+            SalaryChangeRecord userParams, HttpServletRequest req) {
+
+        String beginDate = userParams.getBeginDate();
+        String endDate = userParams.getEndDate();
+        if (StringUtils.isBlank(beginDate) || StringUtils.isBlank(endDate)) {
+            return Result.error("日期不能为空!!");
+        }
+
+        userParams.setBeginDateYear(beginDate.substring(0, 4));
+        userParams.setEndDateYear(endDate.substring(0, 4));
+
+        String syHireType = userParams.getSyHireType();
+        String typeSql = "";
+        if (StringUtils.isNotBlank(syHireType)) {
+            String[] types = syHireType.split(",");
+            for (String o : types) {
+                typeSql = typeSql + ",'" + o + "'";
+            }
+        }
+        if (StringUtils.isNotBlank(typeSql)) {
+            typeSql = "(" + typeSql.substring(1) + ")";
+            userParams.setSyHireType(typeSql);
+        }
+
+        String column = null, order = "asc";
+        String sql = "";
+
+        Map<String, String[]> parameterMap = req.getParameterMap();
+        if (parameterMap != null && parameterMap.containsKey("column")) {
+            column = parameterMap.get("column")[0];
+        }
+        if (parameterMap != null && parameterMap.containsKey("order")) {
+            order = parameterMap.get("order")[0];
+        }
+        if (StringUtils.isNotBlank(column)) {
+            SqlInjectionUtil.filterContent(column);
+//            column = oConvertUtils.camelToUnderline(column);
+            sql = "order by " + column + " " + order + ", substring_index(work_no, '-', 1) + 0 ASC,work_no";
+
+        } else {
+            sql = "order by substring_index(work_no, '-', 1) + 0 ASC,work_no";
+        }
+        userParams.setSqlParameter(sql);
+        Page page = new Page(pageNo, pageSize);
+        IPage<SalaryChangeRecord> pageList = salaryChangeRecordService.selectUserInfo2(userParams, page);
+
+        salaryManagementService.querySalaryTotalList(pageList.getRecords(), userParams);
+
+        return Result.ok(pageList);
+
+    }
+
+
+    public static void main(String[] args) throws IOException {
+        getV4IP();
+//        System.out.println(1);
+//		Runtime runtime = Runtime.getRuntime();
+//
+//		long maxMemory = runtime.maxMemory(); // 获取JVM最大可用内存
+//		long allocatedMemory = runtime.totalMemory(); // 获取已分配内存
+//		long freeMemory = runtime.freeMemory(); // 获取空闲内存
+//		long usedMemory = allocatedMemory - freeMemory; // 已使用内存
+//
+//		System.out.println("最大内存: " + maxMemory + " bytes");
+//		System.out.println("已分配内存: " + allocatedMemory + " bytes");
+//		System.out.println("空闲内存: " + freeMemory + " bytes");
+//		System.out.println("已使用内存: " + usedMemory + " bytes");
+    }
+
+    /**
+     * 添加
+     *
+     * @param salaryManagementPage
+     * @return
+     */
+    @PostMapping(value = "/add")
+    public Result<?> add(@RequestBody SalaryManagementPage salaryManagementPage) {
+        SalaryManagement salaryManagement = new SalaryManagement();
+        BeanUtils.copyProperties(salaryManagementPage, salaryManagement);
+        salaryManagementService.saveMain(salaryManagement, salaryManagementPage.getSalaryManagementDetailList());
+        return Result.ok("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param salaryManagementPage
+     * @return
+     */
+    @PutMapping(value = "/edit")
+    public Result<?> edit(@RequestBody SalaryManagementPage salaryManagementPage) {
+        SalaryManagement salaryManagement = new SalaryManagement();
+        BeanUtils.copyProperties(salaryManagementPage, salaryManagement);
+        salaryManagementService.updateMain(salaryManagement, salaryManagementPage.getSalaryManagementDetailList());
+        return Result.ok("编辑成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        salaryManagementService.delMain(id);
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.salaryManagementService.delBatchMain(Arrays.asList(ids.split(",")));
+        return Result.ok("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/queryById")
+    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
+        SalaryManagement salaryManagement = salaryManagementService.getById(id);
+        return Result.ok(salaryManagement);
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/querySalaryManagementDetailByMainId")
+    public Result<?> querySalaryManagementDetailListByMainId(@RequestParam(name = "id", required = true) String id, String name) {
+        List<SalaryManagementDetail> salaryManagementDetailList = salaryManagementDetailService.selectByMainId(id, name);
+        try {
+            salaryManagementDetailList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+            for (SalaryManagementDetail o : salaryManagementDetailList) {
+                String actualOccurrence = o.getActualOccurrence();
+                String wages = o.getWages();
+                String totalPayable = o.getTotalPayable();
+                if (StringUtils.isNotBlank(actualOccurrence)) {
+                    o.setActualOccurrence(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                }
+                if (StringUtils.isNotBlank(totalPayable)) {
+                    o.setTotalPayable(AesEncryptUtil.desEncrypt(totalPayable).trim());
+                }
+                if (StringUtils.isNotBlank(wages)) {
+                    o.setWages(AesEncryptUtil.desEncrypt(wages).trim());
+                }
+
+            }
+
+        } catch (Exception e) {
+            System.out.println("解密失败!!");
+        }
+        return Result.ok(salaryManagementDetailList);
+    }
+
+    /**
+     * 通过id查询
+     * 加班工资单
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/querySalaryManagementWorkOvertimeListByMainId")
+    public Result<?> querySalaryManagementWorkOvertimeListByMainId(@RequestParam(name = "id", required = true) String id, String name) {
+        List<SalaryManagementWorkOvertime> salaryManagementWorkOvertimeList = salaryManagementWorkOvertimeService.selectByMainId(id, name);
+
+        try {
+            salaryManagementWorkOvertimeList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+            for (SalaryManagementWorkOvertime o : salaryManagementWorkOvertimeList) {
+                String actualOccurrence = o.getActualOccurrence();
+                if (StringUtils.isNotBlank(actualOccurrence)) {
+                    o.setActualOccurrence(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                }
+            }
+
+        } catch (Exception e) {
+            System.out.println("解密失败!!");
+        }
+        return Result.ok(salaryManagementWorkOvertimeList);
+    }
+
+    /**
+     * 通过id查询
+     * 年休工资单
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/querySalaryManagementHolidayListByMainId")
+    public Result<?> querySalaryManagementHolidayListByMainId(@RequestParam(name = "id", required = true) String id, String name) {
+        List<SalaryManagementHoliday> salaryManagementHolidayList = salaryManagementHolidayService.selectByMainId(id, name);
+
+        try {
+            salaryManagementHolidayList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+            for (SalaryManagementHoliday o : salaryManagementHolidayList) {
+                String actualOccurrence = o.getActualOccurrence();
+                String wages = o.getWages();
+                if (StringUtils.isNotBlank(actualOccurrence)) {
+                    o.setActualOccurrence(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                }
+                if (StringUtils.isNotBlank(wages)) {
+                    o.setWages(AesEncryptUtil.desEncrypt(wages).trim());
+                }
+
+            }
+        } catch (Exception e) {
+            System.out.println("解密失败!!");
+        }
+        return Result.ok(salaryManagementHolidayList);
+    }
+
+
+
+    /**
+     * 生成工资单
+     *
+     * @param salaryManagement
+     * @return
+     */
+    @PostMapping(value = "/generatePayroll")
+    public Result<?> generatePayroll(@RequestBody SalaryManagement salaryManagement) {
+        Result<?> result = salaryManagementService.generatePayroll(salaryManagement);
+        return result;
+    }
+
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, SalaryManagement salaryManagement) {
+        return this.exportXlsView(request, salaryManagement);
+    }
+
+    protected ModelAndView exportXlsView(HttpServletRequest request, SalaryManagement object) {
+        // Step.1 组装查询条件
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+        // Step.3 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+
+        String type = object.getType();
+        String title = "";
+        try {
+
+            if (type.equals("月度工资单")) {
+                title = "月度工资单";
+                List<SalaryManagementDetail> exportList = salaryManagementDetailService.selectByMainId(object.getId(), null);
+                exportList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+                for (SalaryManagementDetail o : exportList) {
+                    String actualOccurrence = o.getActualOccurrence();
+                    String wages = o.getWages();
+                    String totalPayable = o.getTotalPayable();
+                    if (StringUtils.isNotBlank(actualOccurrence)) {
+                        o.setActualOccurrence(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                    }
+                    if (StringUtils.isNotBlank(totalPayable)) {
+                        o.setTotalPayable(AesEncryptUtil.desEncrypt(totalPayable).trim());
+                    }
+                    if (StringUtils.isNotBlank(wages)) {
+                        o.setWages(AesEncryptUtil.desEncrypt(wages).trim());
+                    }
+                }
+
+                mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+                mv.addObject(NormalExcelConstants.CLASS, SalaryManagementDetail.class);
+
+                mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
+                mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+
+            } else if (type.equals("加班工资单")) {
+                title = "加班工资单";
+                List<SalaryManagementWorkOvertime> exportList = salaryManagementWorkOvertimeService.selectByMainId(object.getId(), null);
+
+                exportList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+                for (SalaryManagementWorkOvertime o : exportList) {
+                    String actualOccurrence = o.getActualOccurrence();
+                    if (StringUtils.isNotBlank(actualOccurrence)) {
+                        o.setActualOccurrence(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                    }
+                }
+                mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+                mv.addObject(NormalExcelConstants.CLASS, SalaryManagementWorkOvertime.class);
+
+                mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
+                mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+
+
+            } else if (type.equals("年休工资单")) {
+                title = "年休工资单";
+
+                List<SalaryManagementHoliday> exportList = salaryManagementHolidayService.selectByMainId(object.getId(), null);
+                exportList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+                for (SalaryManagementHoliday o : exportList) {
+                    String actualOccurrence = o.getActualOccurrence();
+                    String wages = o.getWages();
+                    if (StringUtils.isNotBlank(actualOccurrence)) {
+                        o.setActualOccurrence(AesEncryptUtil.desEncrypt(actualOccurrence).trim());
+                    }
+                    if (StringUtils.isNotBlank(wages)) {
+                        o.setWages(AesEncryptUtil.desEncrypt(wages).trim());
+                    }
+                }
+                mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+                mv.addObject(NormalExcelConstants.CLASS, SalaryManagementHoliday.class);
+
+                mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
+                mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title));
+
+            }
+
+        } catch (Exception e) {
+
+        }
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        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.setHeadRows(1);
+            params.setNeedSave(true);
+            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());
+                }
+                return Result.ok("文件导入成功!数据行数:" + list.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        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
+     *
+     * @param request
+     * @param
+     */
+    @RequestMapping(value = "/exportXls2")
+    public ModelAndView exportXls2(HttpServletRequest request, SalaryManagement salaryManagement) {
+
+        ModelAndView mv = new ModelAndView(new JeecgTemplateExcelView());
+        try {
+
+            String type = salaryManagement.getType();
+            String title = "";
+            String org = "";
+            String month = "";
+            List<ExcelDemo> list = new ArrayList<>();
+
+            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) {
+                    ExcelDemo demo = new ExcelDemo();
+                    demo.setCode(o.getCode());
+                    demo.setName(o.getName());
+                    demo.setCardNo(o.getCardNo());
+                    String actualOccurrence = o.getActualOccurrence();
+                    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<SalaryManagementWorkOvertime> exportList = salaryManagementWorkOvertimeService.selectByMainId(salaryManagement.getId(), null);
+
+                exportList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+                for (SalaryManagementWorkOvertime o : exportList) {
+
+                    ExcelDemo demo = new ExcelDemo();
+                    demo.setCode(o.getCode());
+                    demo.setName(o.getName());
+                    demo.setCardNo(o.getCardNo());
+                    String actualOccurrence = o.getActualOccurrence();
+                    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<SalaryManagementHoliday> exportList = salaryManagementHolidayService.selectByMainId(salaryManagement.getId(), null);
+                exportList.removeIf(item -> item.getActualOccurrence().equals("nghotxDTNyeHgH0mlfbJig==") || item.getActualOccurrence().equals("HV3ndEx8HV9kd1WNbxLgwg=="));
+
+                for (SalaryManagementHoliday o : exportList) {
+
+                    ExcelDemo demo = new ExcelDemo();
+                    demo.setCode(o.getCode());
+                    demo.setName(o.getName());
+                    demo.setCardNo(o.getCardNo());
+                    String actualOccurrence = o.getActualOccurrence();
+                    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();
+            demo.setName(org + title);
+            demo.setCode(month);
+
+            Map map = JSON.parseObject(JSON.toJSONString(demo), Map.class);
+            map.put("list", list);
+
+            TemplateExportParams params = new TemplateExportParams();
+            params.setTemplateUrl("D:\\service\\oa\\银行导出模板.xlsx");
+//            params.setTemplateUrl("D:\\银行导出模板.xlsx");
+
+            mv.addObject(TemplateExcelConstants.PARAMS, params);
+            mv.addObject(TemplateExcelConstants.MAP_DATA, map);
+            mv.addObject(NormalExcelConstants.FILE_NAME, "导出数据");
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return mv;
+    }
+
+
+    /**
+     * 导出薪资统计
+     *
+     * @param userParams
+     * @return
+     */
+    @RequestMapping(value = "/exportXls3")
+    public ModelAndView exportXls3(HttpServletRequest request, SalaryChangeRecord userParams) {
+
+        ModelAndView mv = new ModelAndView(new JeecgTemplateExcelView());
+
+        String beginDate = userParams.getBeginDate();
+        String endDate = userParams.getEndDate();
+        if (StringUtils.isBlank(beginDate) || StringUtils.isBlank(endDate)) {
+
+        }
+
+        userParams.setBeginDateYear(beginDate.substring(0, 4));
+        userParams.setEndDateYear(endDate.substring(0, 4));
+
+        String syHireType = userParams.getSyHireType();
+        String typeSql = "";
+        if (StringUtils.isNotBlank(syHireType)) {
+            String[] types = syHireType.split(",");
+            for (String o : types) {
+                typeSql = typeSql + ",'" + o + "'";
+            }
+        }
+        if (StringUtils.isNotBlank(typeSql)) {
+            typeSql = "(" + typeSql.substring(1) + ")";
+            userParams.setSyHireType(typeSql);
+        }
+
+        userParams.setSqlParameter("order by substring_index(work_no, '-', 1) + 0 ASC,work_no");
+        IPage page = new Page(1, 999999);
+        IPage<SalaryChangeRecord> pageList = salaryChangeRecordService.selectUserInfo2(userParams, page);
+
+        salaryManagementService.querySalaryTotalList(pageList.getRecords(), userParams);
+
+        Map map = JSON.parseObject(JSON.toJSONString(userParams), Map.class);
+        map.put("list", pageList.getRecords());
+        TemplateExportParams params = new TemplateExportParams();
+        params.setTemplateUrl("D:\\service\\oa\\薪资统计.xlsx");
+//        params.setTemplateUrl("D:\\薪资统计.xlsx");
+
+        mv.addObject(TemplateExcelConstants.PARAMS, params);
+        mv.addObject(TemplateExcelConstants.MAP_DATA, map);
+        mv.addObject(NormalExcelConstants.FILE_NAME, "导出数据");
+
+        return mv;
+    }
+
+    /**
+     * @Function
+     * @Description 得到本机外网ip
+     **/
+    public static String getV4IP() throws IOException {
+        String ip = null;
+        String objWebURL = "https://bajiu.cn/ip/";
+        BufferedReader br = null;
+        try {
+            URL url = new URL(objWebURL);
+            br = new BufferedReader(new InputStreamReader(url.openStream()));
+            String s = "";
+            String webContent = "";
+            while ((s = br.readLine()) != null) {
+                if (s.indexOf("互联网IP") != -1) {
+                    ip = s.substring(s.indexOf("'") + 1, s.lastIndexOf("'"));
+                    break;
+                }
+            }
+        } finally {
+            if (br != null)
+                br.close();
+        }
+        if (StringUtils.isEmpty(ip)) {
+            throw new RuntimeException();
+        }
+        System.out.println(ip);
+        return ip;
+    }
+
+
+}

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

@@ -0,0 +1,52 @@
+package org.jeecg.modules.salary.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+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;
+
+/**
+ * @Description: 考勤管理主表
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+@Data
+@TableName("salary_attendance")
+public class SalaryAttendance 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 type;
+	/**薪资年月*/
+	private String yearWithMonth;
+	/**名称*/
+	private String name;
+	/**版本*/
+	private String version;
+	/**备注*/
+	private String remarks;
+}

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

@@ -0,0 +1,131 @@
+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-04-10
+ * @Version: V1.0
+ */
+@Data
+@TableName("salary_attendance_detail")
+public class SalaryAttendanceDetail 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 orgName;
+
+	/**员工编号*/
+    @Excel(name = "编号", width = 15)
+	private String code;
+	/**员工姓名*/
+    @Excel(name = "姓名", width = 15)
+	private String name;
+	/**工资卡号*/
+    @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 attendanceDays;
+	/**话费补贴*/
+    @Excel(name = "话费补贴", width = 15)
+	private java.math.BigDecimal phoneBill;
+	/**午餐补贴*/
+    @Excel(name = "午餐补贴", width = 15)
+	private java.math.BigDecimal lunch;
+	/**住房补贴*/
+    @Excel(name = "住房补贴", width = 15)
+	private java.math.BigDecimal housingSubsidies;
+	/**交通补贴*/
+    @Excel(name = "交通补贴", width = 15)
+	private java.math.BigDecimal transportation;
+	/**全勤奖*/
+    @Excel(name = "全勤奖", width = 15)
+	private java.math.BigDecimal fullAttendance;
+	/**养老保险*/
+    @Excel(name = "养老保险", width = 15)
+	private java.math.BigDecimal endowmentInsurance;
+	/**失业保险*/
+    @Excel(name = "失业保险", width = 15)
+	private java.math.BigDecimal unemploymentInsurance;
+	/**医疗保险*/
+    @Excel(name = "医疗保险", width = 15)
+	private java.math.BigDecimal medicalInsurance;
+	/**公积金*/
+    @Excel(name = "公积金", width = 15)
+	private java.math.BigDecimal accumulationFund;
+	/**工资抵扣*/
+    @Excel(name = "工资抵扣", width = 15)
+	private java.math.BigDecimal deduction;
+	/**迟到次数*/
+	@Excel(name = "迟到次数", width = 15)
+	private Integer latenessTimes;
+	/**迟到扣费*/
+	@Excel(name = "迟到扣费", width = 15)
+	private java.math.BigDecimal latenessCost;
+	/**事假时间*/
+    @Excel(name = "事假时间(分)", width = 15)
+	private java.math.BigDecimal personalLeave;
+	/**病假时间*/
+    @Excel(name = "病假时间(分)", width = 15)
+	private java.math.BigDecimal sickLeave;
+	/**婚假时间*/
+    @Excel(name = "婚假时间(分)", width = 15)
+	private java.math.BigDecimal marriageLeave;
+
+	/**丧家时间*/
+    @Excel(name = "丧假时间(分)", width = 15)
+	private java.math.BigDecimal funeralLeave;
+	/**年假时间*/
+    @Excel(name = "年假时间(天)", width = 15)
+	private java.math.BigDecimal yearLeave;
+	/**年假时间*/
+    @Excel(name = "加班时间(分)", width = 15)
+	private java.math.BigDecimal workOvertime;
+	/**工资*/
+	private String wages;
+	/**年月*/
+	private String yearWithMonth;
+	/**年月*/
+	private String version;
+	/**备注*/
+	private String remarks;
+}

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

@@ -0,0 +1,77 @@
+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-04-15
+ * @Version: V1.0
+ */
+@Data
+@TableName("salary_attendance_holiday")
+public class SalaryAttendanceHoliday 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 orgName;
+	/**员工编号*/
+    @Excel(name = "编号", width = 15)
+	private String code;
+	/**员工姓名*/
+    @Excel(name = "姓名", width = 15)
+	private String name;
+	/**工资卡号*/
+    @Excel(name = "工资卡号", width = 30)
+	private String cardNo;
+	/**年假天数*/
+    @Excel(name = "年假天数", width = 15)
+	private java.math.BigDecimal annualLeave;
+	/**使用天数*/
+    @Excel(name = "已请天数", width = 15)
+	private java.math.BigDecimal used;
+	/**剩余天数*/
+    @Excel(name = "剩余天数", width = 15)
+	private java.math.BigDecimal surplus;
+	/**合计*/
+	private java.math.BigDecimal total;
+	/**年度*/
+	private String yearWithMonth;
+	/**版本*/
+	private String version;
+	/**单双休*/
+	private String restMode;
+	/**工时/天*/
+	private java.math.BigDecimal workingHours;
+}

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

@@ -0,0 +1,101 @@
+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-04-15
+ * @Version: V1.0
+ */
+@Data
+@TableName("salary_attendance_work_overtime")
+public class SalaryAttendanceWorkOvertime 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 orgName;
+	/**员工编号*/
+    @Excel(name = "编号", width = 15)
+	private String code;
+	/**员工姓名*/
+    @Excel(name = "姓名", width = 15)
+	private String name;
+	/**工资卡号*/
+    @Excel(name = "工资卡号", width = 30)
+	private String cardNo;
+	/**一月*/
+    @Excel(name = "一月份", width = 15)
+	private java.math.BigDecimal january;
+	/**二月*/
+    @Excel(name = "二月份", width = 15)
+	private java.math.BigDecimal february;
+	/**三月*/
+    @Excel(name = "三月份", width = 15)
+	private java.math.BigDecimal march;
+	/**四月*/
+    @Excel(name = "四月份", width = 15)
+	private java.math.BigDecimal april;
+	/**五月*/
+    @Excel(name = "五月份", width = 15)
+	private java.math.BigDecimal may;
+	/**六月*/
+    @Excel(name = "六月份", width = 15)
+	private java.math.BigDecimal june;
+	/**七月*/
+    @Excel(name = "七月份", width = 15)
+	private java.math.BigDecimal july;
+	/**八月*/
+    @Excel(name = "八月份", width = 15)
+	private java.math.BigDecimal august;
+	/**九月*/
+    @Excel(name = "九月份", width = 15)
+	private java.math.BigDecimal september;
+	/**十月*/
+    @Excel(name = "十月份", width = 15)
+	private java.math.BigDecimal october;
+	/**十一月*/
+    @Excel(name = "十一月份", width = 15)
+	private java.math.BigDecimal november;
+	/**十二月*/
+    @Excel(name = "十二月份", width = 15)
+	private java.math.BigDecimal december;
+	/**合计*/
+//    @Excel(name = "合计", width = 15)
+	private java.math.BigDecimal total;
+	/**年度*/
+	private String yearWithMonth;
+	/**版本*/
+	private String version;
+}

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

@@ -0,0 +1,180 @@
+package org.jeecg.modules.salary.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * @Description: 薪资变更记录
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+@Data
+@TableName("salary_change_record")
+@ApiModel(value="salary_change_record对象", description="薪资变更记录")
+public class SalaryChangeRecord implements Serializable {
+	private static final long serialVersionUID = 1L;
+	/**主键*/
+	@TableId(type = IdType.ID_WORKER_STR)
+    @ApiModelProperty(value = "主键")
+	private String id;
+	/**创建人*/
+	@Excel(name = "创建人", width = 15)
+    @ApiModelProperty(value = "创建人")
+	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;
+	/**更新人*/
+	@Excel(name = "更新人", width = 15)
+    @ApiModelProperty(value = "更新人")
+	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;
+	/**删除标记*/
+	@Excel(name = "删除标记", width = 15)
+    @ApiModelProperty(value = "删除标记")
+	private String delFlag;
+	/**所属部门*/
+	@Excel(name = "所属部门", width = 15)
+    @ApiModelProperty(value = "所属部门")
+	private String sysOrgCode;
+	/**员工主键*/
+	@Excel(name = "员工主键", width = 15)
+    @ApiModelProperty(value = "员工主键")
+	private String userId;
+	/**员工编号*/
+	@Excel(name = "员工编号", width = 15)
+    @ApiModelProperty(value = "员工编号")
+	private String code;
+	/**员工姓名*/
+	@Excel(name = "员工姓名", width = 15)
+    @ApiModelProperty(value = "员工姓名")
+	private String name;
+	/**工资卡号*/
+	@Excel(name = "工资卡号", width = 15)
+    @ApiModelProperty(value = "工资卡号")
+	private String cardNo;
+	/**组织*/
+	@Excel(name = "组织", width = 15)
+    @ApiModelProperty(value = "组织")
+	private String orgName;
+	/**1涨薪,0降薪*/
+	@Excel(name = "1涨薪,0降薪", width = 15)
+    @ApiModelProperty(value = "1涨薪,0降薪")
+	private String type;
+	/**降薪额度*/
+	@Excel(name = "降薪额度", width = 15)
+    @ApiModelProperty(value = "降薪额度")
+	private String salaryReduction;
+	/**涨薪额度*/
+	@Excel(name = "涨薪额度", width = 15)
+    @ApiModelProperty(value = "涨薪额度")
+	private String salaryIncrease;
+	/**调整前薪资*/
+	@Excel(name = "调整前薪资", width = 15)
+    @ApiModelProperty(value = "调整前薪资")
+	private String beforeAdjustment;
+	/**调整后薪资*/
+	@Excel(name = "调整后薪资", width = 15)
+    @ApiModelProperty(value = "调整后薪资")
+	private String afterAdjustment;
+	/**变更说明*/
+	@Excel(name = "变更说明", width = 15)
+    @ApiModelProperty(value = "变更说明")
+	private String remarks;
+
+	@TableField(exist = false)
+	private String sqlParameter;
+
+	/*
+	以下字段为薪资统计临时使用
+	 */
+	@TableField(exist = false)
+	private String beginDate;
+	@TableField(exist = false)
+	private String endDate;
+
+	/**基本薪资*/
+	@TableField(exist = false)
+	private java.lang.String wages;
+	/**话费补贴*/
+	@TableField(exist = false)
+	private java.math.BigDecimal phoneBill;
+	/**午餐补贴*/
+	@TableField(exist = false)
+	private java.math.BigDecimal lunch;
+	/**住房补贴*/
+	@TableField(exist = false)
+	private java.math.BigDecimal housingSubsidies;
+	/**交通补贴*/
+	@TableField(exist = false)
+	private java.math.BigDecimal transportation;
+	/**全勤奖*/
+	@TableField(exist = false)
+	private java.math.BigDecimal fullAttendance;
+	/**加班工资*/
+	@TableField(exist = false)
+	private java.math.BigDecimal overtimePay;
+	/**年休工资*/
+	@TableField(exist = false)
+	private java.math.BigDecimal yearSalary;
+	/**合计应发*/
+	@TableField(exist = false)
+	private java.lang.String totalPayable;
+
+	/**社保*/
+	@TableField(exist = false)
+	private java.math.BigDecimal socialSecurity;
+	/**公积金*/
+	@TableField(exist = false)
+	private java.math.BigDecimal accumulationFund;
+	/**个税*/
+	@TableField(exist = false)
+	private java.math.BigDecimal personalTax;
+	/**迟到扣费*/
+	@TableField(exist = false)
+	private java.math.BigDecimal latenessCost;
+	/**事假扣费*/
+	@TableField(exist = false)
+	private java.math.BigDecimal personalCost;
+	/**病假扣费*/
+	@TableField(exist = false)
+	private java.math.BigDecimal sickCost;
+	/**婚假扣费*/
+	@TableField(exist = false)
+	private java.math.BigDecimal marriageCost;
+	/**丧假扣费*/
+	@TableField(exist = false)
+	private java.math.BigDecimal funeralCost;
+	/**合计应扣*/
+	@TableField(exist = false)
+	private java.math.BigDecimal totalDeduction;
+	/**实发合计*/
+	@TableField(exist = false)
+	private java.lang.String actualOccurrence;
+
+	//在职状态
+	@TableField(exist = false)
+	private java.lang.String syHireType;
+	@TableField(exist = false)
+	private String beginDateYear;
+	@TableField(exist = false)
+	private String endDateYear;
+
+}

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

@@ -0,0 +1,79 @@
+package org.jeecg.modules.salary.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+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;
+
+/**
+ * @Description: 薪资管理主表
+ * @Author: jeecg-boot
+ * @Date:   2024-04-16
+ * @Version: V1.0
+ */
+@Data
+@TableName("salary_management")
+public class SalaryManagement 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 type;
+	/**薪资年月*/
+	private String yearWithMonth;
+
+	/**生成加班工资单时临时字段*/
+	@TableField(exist = false)
+	private String beginMonth;
+	/**生成加班工资单时临时字段*/
+	@TableField(exist = false)
+	private String endMonth;
+	/**生成年休工资单时临时字段*/
+	@TableField(exist = false)
+	private String yearWith;
+
+	/**组织*/
+	private String orgName;
+	/**版本*/
+	private String version;
+	/**发放人数*/
+	private Integer numberPeople;
+	/**发放薪水*/
+	private String salary;
+	/**个税*/
+	private String personalTax;
+	/**生成时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private Date generationTime;
+
+	@TableField(exist = false)
+	private String idMFY;
+	@TableField(exist = false)
+	private String idNBSY;
+	@TableField(exist = false)
+	private String idZZ;
+}

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

@@ -0,0 +1,125 @@
+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-04-16
+ * @Version: V1.0
+ */
+@Data
+@TableName("salary_management_detail")
+public class SalaryManagementDetail implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ID_WORKER_STR)
+	private java.lang.String id;
+	/**创建人登录名称*/
+	private java.lang.String createBy;
+	/**创建日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private java.util.Date createTime;
+	/**更新人登录名称*/
+	private java.lang.String updateBy;
+	/**更新日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private java.util.Date updateTime;
+	/**删除标记*/
+	private java.lang.String delFlag;
+	/**所属部门*/
+//	@Excel(name = "所属部门", width = 15)
+	private java.lang.String sysOrgCode;
+	/**主表主键*/
+	private java.lang.String headId;
+	/**用户主键*/
+	private java.lang.String userId;
+	/**员工编号*/
+	@Excel(name = "员工编号", width = 15)
+	private java.lang.String code;
+	/**员工姓名*/
+	@Excel(name = "员工姓名", width = 15)
+	private java.lang.String name;
+	/**组织*/
+	@Excel(name = "组织", width = 15)
+	private java.lang.String orgName;
+	/**基本薪资*/
+	@Excel(name = "基本薪资", width = 15)
+	private java.lang.String wages;
+	/**话费补贴*/
+	@Excel(name = "话费补贴", width = 15)
+	private java.math.BigDecimal phoneBill;
+	/**午餐补贴*/
+	@Excel(name = "午餐补贴", width = 15)
+	private java.math.BigDecimal lunch;
+	/**住房补贴*/
+	@Excel(name = "住房补贴", width = 15)
+	private java.math.BigDecimal housingSubsidies;
+	/**交通补贴*/
+	@Excel(name = "交通补贴", width = 15)
+	private java.math.BigDecimal transportation;
+	/**全勤奖*/
+	@Excel(name = "全勤奖", width = 15)
+	private java.math.BigDecimal fullAttendance;
+	/**合计应发*/
+	@Excel(name = "合计应发", width = 15)
+	private java.lang.String totalPayable;
+
+	/**社保*/
+	@Excel(name = "社保", width = 15)
+	private java.math.BigDecimal socialSecurity;
+	/**公积金*/
+	@Excel(name = "公积金", width = 15)
+	private java.math.BigDecimal accumulationFund;
+	/**个税*/
+	@Excel(name = "个税", width = 15)
+	private java.math.BigDecimal personalTax;
+	/**迟到扣费*/
+	@Excel(name = "迟到扣费", width = 15)
+	private java.math.BigDecimal latenessCost;
+	/**事假扣费*/
+	@Excel(name = "事假扣费", width = 15)
+	private java.math.BigDecimal personalCost;
+	/**病假扣费*/
+	@Excel(name = "病假扣费", width = 15)
+	private java.math.BigDecimal sickCost;
+	/**婚假扣费*/
+	@Excel(name = "婚假扣费", width = 15)
+	private java.math.BigDecimal marriageCost;
+	/**丧假扣费*/
+	@Excel(name = "丧假扣费", width = 15)
+	private java.math.BigDecimal funeralCost;
+	/**合计应扣*/
+	@Excel(name = "合计应扣", width = 15)
+	private java.math.BigDecimal totalDeduction;
+	/**实发合计*/
+	@Excel(name = "实发合计", width = 15)
+	private java.lang.String actualOccurrence;
+	/**工资抵扣*/
+	private java.math.BigDecimal deduction;
+	/**应纳税所得额*/
+	private java.lang.String payTaxes;
+	/**累计所得额*/
+	private java.lang.String cumulative;
+	/**工资卡号*/
+	private java.lang.String cardNo;
+
+	/**执行日志*/
+	private java.lang.String actionLog;
+	/**年月*/
+	@Excel(name = "年月", width = 15)
+	private java.lang.String yearWithMonth;
+	/**版本*/
+	private String version;
+}

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

@@ -0,0 +1,99 @@
+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-04-18
+ * @Version: V1.0
+ */
+@Data
+@TableName("salary_management_holiday")
+public class SalaryManagementHoliday 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;
+	/**员工编号*/
+    @Excel(name = "员工编号", width = 15)
+	private String code;
+	/**员工姓名*/
+    @Excel(name = "员工姓名", width = 15)
+	private String name;
+	/**组织*/
+    @Excel(name = "组织", width = 15)
+	private String orgName;
+	/**工资卡号*/
+//    @Excel(name = "工资卡号", width = 15)
+	private String cardNo;
+	/**年假天数*/
+    @Excel(name = "年假天数", width = 15)
+	private java.math.BigDecimal annualLeave;
+	/**使用天数*/
+    @Excel(name = "使用天数", width = 15)
+	private java.math.BigDecimal used;
+	/**剩余天数*/
+    @Excel(name = "剩余天数", width = 15)
+	private java.math.BigDecimal surplus;
+
+	/**计算年月*/
+//    @Excel(name = "计算年月", width = 15)
+	private String yearWithMonth;
+	/**版本*/
+//    @Excel(name = "版本", width = 15)
+	private String version;
+	/**个税*/
+    @Excel(name = "个税", width = 15)
+	private java.math.BigDecimal personalTax;
+	/**应发薪资*/
+    @Excel(name = "应发薪资", width = 15)
+	private String wages;
+	/**实发合计*/
+    @Excel(name = "实发合计", width = 15)
+	private String actualOccurrence;
+	/**应纳税所得额*/
+	private String payTaxes;
+	/**累计所得额*/
+	private String cumulative;
+	/**执行日志*/
+	private String actionLog;
+	/**年度*/
+	@Excel(name = "年度", width = 15)
+	private String yearWith;
+	/**单双休*/
+//	@Excel(name = "单双休", width = 15)
+	private String restMode;
+	/**工时/天*/
+//	@Excel(name = "工时/天", width = 15)
+	private java.math.BigDecimal workingHours;
+}

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

@@ -0,0 +1,108 @@
+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-04-16
+ * @Version: V1.0
+ */
+@Data
+@TableName("salary_management_work_overtime")
+public class SalaryManagementWorkOvertime 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;
+	/**员工编号*/
+    @Excel(name = "员工编号", width = 15)
+	private String code;
+	/**员工姓名*/
+    @Excel(name = "员工姓名", width = 15)
+	private String name;
+	/**组织*/
+    @Excel(name = "组织", width = 15)
+	private String orgName;
+	/**工资卡号*/
+	private String cardNo;
+	/**一月*/
+	private java.math.BigDecimal january;
+	/**二月*/
+	private java.math.BigDecimal february;
+	/**三月*/
+	private java.math.BigDecimal march;
+	/**四月*/
+	private java.math.BigDecimal april;
+	/**五月*/
+	private java.math.BigDecimal may;
+	/**六月*/
+	private java.math.BigDecimal june;
+	/**七月*/
+	private java.math.BigDecimal july;
+	/**八月*/
+	private java.math.BigDecimal august;
+	/**九月*/
+	private java.math.BigDecimal september;
+	/**十月*/
+	private java.math.BigDecimal october;
+	/**十一月*/
+	private java.math.BigDecimal november;
+	/**十二月*/
+	private java.math.BigDecimal december;
+	/**加班工资*/
+    @Excel(name = "加班工资", width = 15)
+	private java.math.BigDecimal workOvertimeCost;
+	/**个税*/
+    @Excel(name = "个税", width = 15)
+	private java.math.BigDecimal personalTax;
+	/**实发合计*/
+    @Excel(name = "实发合计", width = 15)
+	private String actualOccurrence;
+	/**工资抵扣*/
+	private java.math.BigDecimal deduction;
+	/**应纳税所得额*/
+	private String payTaxes;
+	/**累计所得额*/
+	private String cumulative;
+	/**执行日志*/
+	private String actionLog;
+	/**年月*/
+	@Excel(name = "计算年月", width = 15)
+	private java.lang.String yearWithMonth;
+	/**年月*/
+	private java.lang.String beginMonth;
+	/**年月*/
+	private java.lang.String endMonth;
+	/**版本*/
+	private String version;
+}

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

@@ -0,0 +1,23 @@
+package org.jeecg.modules.salary.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.salary.entity.SalaryAttendanceDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 考勤管理子表-考勤明细
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+public interface SalaryAttendanceDetailMapper extends BaseMapper<SalaryAttendanceDetail> {
+
+	public boolean deleteByMainId(String mainId);
+    
+	public List<SalaryAttendanceDetail> selectByMainId(@Param("id") String mainId, @Param("orgName")String orgName, @Param("yearWithMonth")String yearWithMonth,
+													   @Param("version")String version, @Param("name")String name, @Param("remarks")String remarks);
+
+	public List<SalaryAttendanceDetail> selectWorkOvertime(@Param("beginMonth") String beginMonth, @Param("endMonth")String endMonth);
+}

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

@@ -0,0 +1,20 @@
+package org.jeecg.modules.salary.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.salary.entity.SalaryAttendanceHoliday;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 考勤管理子表-假期明细
+ * @Author: jeecg-boot
+ * @Date:   2024-04-15
+ * @Version: V1.0
+ */
+public interface SalaryAttendanceHolidayMapper extends BaseMapper<SalaryAttendanceHoliday> {
+
+	public boolean deleteByMainId(String mainId);
+
+	public List<SalaryAttendanceHoliday> selectByMainId(@Param("id") String mainId, @Param("orgName") String orgName, @Param("name") String name);
+}

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

@@ -0,0 +1,23 @@
+package org.jeecg.modules.salary.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.salary.entity.SalaryAttendance;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 考勤管理主表
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+public interface SalaryAttendanceMapper extends BaseMapper<SalaryAttendance> {
+
+    Integer selectVersion(@Param("type") String type ,@Param("yearWithMonth") String yearWithMonth);
+
+    int deleteVersion(@Param("type") String type ,@Param("yearWithMonth") String yearWithMonth,@Param("version") int version);
+    int deleteVersionDetail(@Param("yearWithMonth") String yearWithMonth,@Param("version") int version);
+    int deleteVersionHoliday(@Param("yearWithMonth") String yearWithMonth,@Param("version") int version);
+    int deleteVersionOvertime(@Param("yearWithMonth") String yearWithMonth,@Param("version") int version);
+}

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

@@ -0,0 +1,20 @@
+package org.jeecg.modules.salary.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.salary.entity.SalaryAttendanceWorkOvertime;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 考勤管理子表-加班明细
+ * @Author: jeecg-boot
+ * @Date:   2024-04-15
+ * @Version: V1.0
+ */
+public interface SalaryAttendanceWorkOvertimeMapper extends BaseMapper<SalaryAttendanceWorkOvertime> {
+
+	public boolean deleteByMainId(String mainId);
+    
+	public List<SalaryAttendanceWorkOvertime> selectByMainId(@Param("id")String mainId, @Param("orgName")String orgName, @Param("name")String name);
+}

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

@@ -0,0 +1,30 @@
+package org.jeecg.modules.salary.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.salary.entity.SalaryChangeRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.system.entity.SysUser;
+
+/**
+ * @Description: 薪资变更记录
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+public interface SalaryChangeRecordMapper extends BaseMapper<SalaryChangeRecord> {
+    Integer selectUserInfoTotal( @Param("userParams") SalaryChangeRecord userParams);
+    Integer selectUserInfoTotal2( @Param("userParams") SalaryChangeRecord userParams);
+    List<SalaryChangeRecord> selectUserInfo(IPage page,@Param("userParams") SalaryChangeRecord userParams);
+    List<SalaryChangeRecord> selectUserInfo2(IPage page,@Param("userParams") SalaryChangeRecord userParams);
+
+    List<SalaryChangeRecord> selectUserByPar(@Param("name") String name,@Param("cardNo") String cardNo);
+
+    int updateSalary(@Param("adjustment")String adjustment,@Param("id")String id);
+
+    int insertSalaryBasicSalaryRecord(@Param("id")String id,@Param("createBy")String createBy,@Param("basicSalary")String basicSalary);
+
+    String selectSalary();
+}

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

@@ -0,0 +1,24 @@
+package org.jeecg.modules.salary.mapper;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.salary.entity.SalaryManagementDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 薪资管理子表-月度工资明细
+ * @Author: jeecg-boot
+ * @Date:   2024-04-16
+ * @Version: V1.0
+ */
+public interface SalaryManagementDetailMapper extends BaseMapper<SalaryManagementDetail> {
+
+	public boolean deleteByMainId(String mainId);
+    
+	public List<SalaryManagementDetail> selectByMainId(@Param("id")String mainId,@Param("name")String name);
+
+	public List<SalaryManagementDetail> selectByUser(@Param("userId")String userId, @Param("yearWithMonth")String yearWithMonth, @Param("yearWithMonthNow")String yearWithMonthNow);
+
+	public List<SalaryManagementDetail> selectByUserTotal(@Param("userId")String userId, @Param("beginDate")String beginDate, @Param("endDate")String endDate);
+
+}

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

@@ -0,0 +1,24 @@
+package org.jeecg.modules.salary.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.salary.entity.SalaryManagementHoliday;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 薪资管理子表-年休工资单
+ * @Author: jeecg-boot
+ * @Date:   2024-04-18
+ * @Version: V1.0
+ */
+public interface SalaryManagementHolidayMapper extends BaseMapper<SalaryManagementHoliday> {
+
+	public boolean deleteByMainId(String mainId);
+    
+	public List<SalaryManagementHoliday> selectByMainId(@Param("id")String mainId,@Param("name")String name);
+
+	public List<SalaryManagementHoliday> selectByUser(@Param("userId") String userId,@Param("yearWith") String yearWith);
+
+	public List<SalaryManagementHoliday> selectByUserTotal(@Param("userId") String userId,@Param("beginDate") String beginDate,@Param("endDate") String endDate);
+}

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

@@ -0,0 +1,23 @@
+package org.jeecg.modules.salary.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.salary.entity.SalaryManagement;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 薪资管理主表
+ * @Author: jeecg-boot
+ * @Date:   2024-04-16
+ * @Version: V1.0
+ */
+public interface SalaryManagementMapper extends BaseMapper<SalaryManagement> {
+
+    Integer selectVersion(@Param("type") String type ,@Param("yearWithMonth") String yearWithMonth);
+    int deleteVersion(@Param("type") String type ,@Param("yearWithMonth") String yearWithMonth,@Param("version") int version);
+    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);
+
+}

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

@@ -0,0 +1,24 @@
+package org.jeecg.modules.salary.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.salary.entity.SalaryManagementWorkOvertime;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 薪资管理子表-加班工资单
+ * @Author: jeecg-boot
+ * @Date:   2024-04-16
+ * @Version: V1.0
+ */
+public interface SalaryManagementWorkOvertimeMapper extends BaseMapper<SalaryManagementWorkOvertime> {
+
+	public boolean deleteByMainId(String mainId);
+    
+	public List<SalaryManagementWorkOvertime> selectByMainId(@Param("id")String mainId,@Param("name")String name);
+
+	public List<SalaryManagementWorkOvertime> selectByUser(@Param("userId")String userId, @Param("yearWithMonth")String yearWithMonth, @Param("yearWithMonthNow")String yearWithMonthNow);
+
+	public List<SalaryManagementWorkOvertime> selectByUserTotal(@Param("userId")String userId, @Param("beginDate")String beginDate, @Param("endDate")String endDate);
+}

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

@@ -0,0 +1,45 @@
+<?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.SalaryAttendanceDetailMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE 
+		FROM  salary_attendance_detail 
+		WHERE
+			 head_id = #{id} 		
+	</delete>
+	
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryAttendanceDetail">
+		SELECT * 
+		FROM  salary_attendance_detail a
+		WHERE
+			 a.head_id = #{id} and a.del_flag = 0
+
+		<if test="orgName != null and orgName != ''">
+			AND a.org_Name = #{orgName}
+		</if>
+		<if test="yearWithMonth != null and yearWithMonth != ''">
+			AND a.year_With_Month = #{yearWithMonth}
+		</if>
+		<if test="version != null and version != ''">
+			AND a.version = #{version}
+		</if>
+		<if test="name != null and name != ''">
+			AND a.name LIKE '%${name}%'
+		</if>
+		<if test="remarks != null and remarks != ''">
+			AND a.remarks LIKE '%${remarks}%'
+		</if>
+
+	</select>
+
+	<select id="selectWorkOvertime" resultType="org.jeecg.modules.salary.entity.SalaryAttendanceDetail">
+
+		select user_id "userId", code "code",name "name", org_name "orgName", card_no "cardNo" ,sum(working_hours)  "workingHours" ,
+		       sum(attendance_days)  "attendanceDays",sum(work_overtime )  "workOvertime"
+		from salary_attendance_detail
+		where del_flag = 0 and year_with_month BETWEEN #{beginMonth} and #{endMonth}
+		group by code,name,org_name
+
+	</select>
+</mapper>

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

@@ -0,0 +1,26 @@
+<?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.SalaryAttendanceHolidayMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE 
+		FROM  salary_attendance_holiday 
+		WHERE
+			 head_id = #{id} 		
+	</delete>
+	
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryAttendanceHoliday">
+		SELECT * 
+		FROM  salary_attendance_holiday a
+		WHERE
+		a.head_id = #{id} and a.del_flag = 0
+
+		<if test="orgName != null and orgName != ''">
+			AND a.org_Name = #{orgName}
+		</if>
+
+		<if test="name != null and name != ''">
+			AND a.name LIKE '%${name}%'
+		</if>
+	</select>
+</mapper>

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

@@ -0,0 +1,28 @@
+<?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.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>
+
+    <delete id="deleteVersion">
+        update salary_attendance set del_flag = 1 where del_flag =0 and type =#{type} and year_with_month =#{yearWithMonth}
+        and version &lt; #{version}
+    </delete>
+
+    <delete id="deleteVersionDetail">
+        update salary_attendance_detail set del_flag = 1 where del_flag =0 and year_with_month =#{yearWithMonth}
+        and version &lt; #{version}
+    </delete>
+
+    <delete id="deleteVersionHoliday">
+        update salary_attendance_holiday set del_flag = 1 where del_flag =0 and year_with_month =#{yearWithMonth}
+        and version &lt; #{version}
+    </delete>
+
+    <delete id="deleteVersionOvertime">
+        update salary_attendance_work_overtime set del_flag = 1 where del_flag =0 and year_with_month =#{yearWithMonth}
+        and version &lt; #{version}
+    </delete>
+
+</mapper>

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

@@ -0,0 +1,27 @@
+<?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.SalaryAttendanceWorkOvertimeMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE 
+		FROM  salary_attendance_work_overtime 
+		WHERE
+			 head_id = #{id} 		
+	</delete>
+	
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryAttendanceWorkOvertime">
+		SELECT * 
+		FROM  salary_attendance_work_overtime a
+		WHERE
+		a.head_id = #{id} and a.del_flag = 0
+
+		<if test="orgName != null and orgName != ''">
+			AND a.org_Name = #{orgName}
+		</if>
+
+		<if test="name != null and name != ''">
+			AND a.name LIKE '%${name}%'
+		</if>
+	</select>
+
+</mapper>

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

@@ -0,0 +1,220 @@
+<?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.SalaryChangeRecordMapper">
+
+    <select id="selectUserInfoTotal" resultType="java.lang.Integer">
+        select count(1) from (
+            SELECT a.username,a.realname from sys_user a
+                left join sys_user_depart b on a.id = b.user_id
+                left join sys_depart c on c.id = b.dep_id
+            WHERE
+                a.del_flag='0'
+            <if test="userParams != null">
+                <if test="userParams.name != null and userParams.name != ''">
+                    AND a.realname LIKE '%${userParams.name}%'
+                </if>
+                <if test="userParams.code != null and userParams.code != ''">
+                    AND a.work_no LIKE '%${userParams.code}%'
+                </if>
+                <if test="userParams.sysOrgCode != null and userParams.sysOrgCode != ''">
+                    AND c.depart_name LIKE '%${userParams.sysOrgCode}%'
+                </if>
+                <if test="userParams.orgName != null and userParams.orgName != ''">
+                    AND a.belonging_company  LIKE '%${userParams.orgName}%'
+                </if>
+                <if test="userParams.syHireType != null and userParams.syHireType != ''">
+                    AND IFNULL(a.sy_Hire_Type,'在职') in ${userParams.syHireType}
+                </if>
+            </if>
+            group by a.username,a.realname
+        ) a
+    </select>
+
+    <select id="selectUserInfo" resultType="org.jeecg.modules.salary.entity.SalaryChangeRecord">
+        select a.id AS "userId",
+        group_concat(IFNULL(c.depart_name,'无部门')) AS "sysOrgCode",
+
+        a.realname AS "name",
+        a.work_no AS "code",
+        a.belonging_company as "orgName",
+        a.n_card_no as "cardNo",
+        a.adjustment as "beforeAdjustment",
+        a.adjustment_time as "updateTime"
+
+        from sys_user a
+        left join sys_user_depart b on a.id = b.user_id
+        left join sys_depart c on c.id = b.dep_id
+
+        WHERE
+        a.del_flag='0'
+        <if test="userParams != null">
+            <if test="userParams.name != null and userParams.name != ''">
+                AND a.realname LIKE '%${userParams.name}%'
+            </if>
+            <if test="userParams.code != null and userParams.code != ''">
+                AND a.work_no LIKE '%${userParams.code}%'
+            </if>
+            <if test="userParams.sysOrgCode != null and userParams.sysOrgCode != ''">
+                AND c.depart_name LIKE '%${userParams.sysOrgCode}%'
+            </if>
+            <if test="userParams.orgName != null and userParams.orgName != ''">
+                AND a.belonging_company  LIKE '%${userParams.orgName}%'
+            </if>
+            <if test="userParams.syHireType != null and userParams.syHireType != ''">
+                AND IFNULL(a.sy_Hire_Type,'在职') in ${userParams.syHireType}
+            </if>
+        </if>
+        group by a.username,a.realname
+        <if test="userParams != null">
+            <if test="userParams.sqlParameter != null and userParams.sqlParameter != ''">
+                ${userParams.sqlParameter}
+            </if>
+        </if>
+       <!-- order by substring_index(work_no, '-', 1) + 0 ASC,work_no -->
+
+    </select>
+
+    <select id="selectUserInfoTotal2" resultType="java.lang.Integer">
+        select count(1) from (
+        select a.id AS "userId",
+        group_concat(IFNULL(c.depart_name,'无部门')) AS "sysOrgCode",
+        a.realname AS "name",
+        a.work_no AS "code",
+        a.belonging_company as "orgName",
+        a.n_card_no as "cardNo",
+        a.adjustment as "beforeAdjustment",
+        a.adjustment_time as "updateTime"
+
+        from sys_user a
+        left join sys_user_depart b on a.id = b.user_id
+        left join sys_depart c on c.id = b.dep_id
+
+        left join (select user_id from salary_management_detail where del_flag=0 and year_with_month BETWEEN
+        #{userParams.beginDate} and #{userParams.endDate}
+        group by user_id) man on man.user_id = a.id
+
+        left join (select user_id from salary_management_holiday where del_flag=0 and year_with BETWEEN
+        #{userParams.beginDateYear} and #{userParams.endDateYear}
+        group by user_id) ho on ho.user_id = a.id
+
+        left join (select user_id from salary_management_work_overtime where del_flag=0 and year_with_month BETWEEN
+        #{userParams.beginDate} and #{userParams.endDate}
+        group by user_id) overtime on overtime.user_id = a.id
+
+        WHERE (man.user_id != '' or ho.user_id != '' or overtime.user_id != '')
+
+        and a.del_flag='0'
+        <if test="userParams != null">
+            <if test="userParams.name != null and userParams.name != ''">
+                AND a.realname LIKE '%${userParams.name}%'
+            </if>
+            <if test="userParams.code != null and userParams.code != ''">
+                AND a.work_no LIKE '%${userParams.code}%'
+            </if>
+            <if test="userParams.sysOrgCode != null and userParams.sysOrgCode != ''">
+                AND c.depart_name LIKE '%${userParams.sysOrgCode}%'
+            </if>
+            <if test="userParams.orgName != null and userParams.orgName != ''">
+                AND a.belonging_company LIKE '%${userParams.orgName}%'
+            </if>
+            <if test="userParams.syHireType != null and userParams.syHireType != ''">
+                AND IFNULL(a.sy_Hire_Type,'在职') in ${userParams.syHireType}
+            </if>
+        </if>
+        group by a.username,a.realname
+        ) a
+
+
+    </select>
+
+    <select id="selectUserInfo2" resultType="org.jeecg.modules.salary.entity.SalaryChangeRecord">
+        select a.id AS "userId",
+        group_concat(IFNULL(c.depart_name,'无部门')) AS "sysOrgCode",
+        a.realname AS "name",
+        a.work_no AS "code",
+        a.belonging_company as "orgName",
+        a.n_card_no as "cardNo",
+        a.adjustment as "beforeAdjustment",
+        a.adjustment_time as "updateTime"
+
+        from sys_user a
+        left join sys_user_depart b on a.id = b.user_id
+        left join sys_depart c on c.id = b.dep_id
+
+        left join (select user_id from salary_management_detail where del_flag=0 and year_with_month BETWEEN #{userParams.beginDate} and #{userParams.endDate}
+                    group by user_id) man on man.user_id = a.id
+
+        left join (select user_id from salary_management_holiday where del_flag=0 and year_with BETWEEN #{userParams.beginDateYear} and #{userParams.endDateYear}
+                    group by user_id) ho on ho.user_id = a.id
+
+        left join (select user_id from salary_management_work_overtime where del_flag=0 and year_with_month BETWEEN #{userParams.beginDate} and #{userParams.endDate}
+                    group by user_id) overtime on overtime.user_id = a.id
+
+        WHERE (man.user_id != '' or ho.user_id != '' or overtime.user_id != '')
+
+        and a.del_flag='0'
+        <if test="userParams != null">
+            <if test="userParams.name != null and userParams.name != ''">
+                AND a.realname LIKE '%${userParams.name}%'
+            </if>
+            <if test="userParams.code != null and userParams.code != ''">
+                AND a.work_no LIKE '%${userParams.code}%'
+            </if>
+            <if test="userParams.sysOrgCode != null and userParams.sysOrgCode != ''">
+                AND c.depart_name LIKE '%${userParams.sysOrgCode}%'
+            </if>
+            <if test="userParams.orgName != null and userParams.orgName != ''">
+                AND a.belonging_company  LIKE '%${userParams.orgName}%'
+            </if>
+            <if test="userParams.syHireType != null and userParams.syHireType != ''">
+                AND IFNULL(a.sy_Hire_Type,'在职') in ${userParams.syHireType}
+            </if>
+        </if>
+        group by a.username,a.realname
+        <if test="userParams != null">
+            <if test="userParams.sqlParameter != null and userParams.sqlParameter != ''">
+                ${userParams.sqlParameter}
+            </if>
+        </if>
+
+    </select>
+
+    <select id="selectUserByPar" resultType="org.jeecg.modules.salary.entity.SalaryChangeRecord">
+        select a.id AS "userId",
+        a.realname AS "name",
+        a.work_no AS "code",
+        a.belonging_company as "orgName",
+        a.n_card_no as "cardNo",
+        a.adjustment as "beforeAdjustment"
+        from sys_user a
+        WHERE
+        a.del_flag='0'
+        <if test="name != null and name != ''">
+            AND a.realname = #{name}
+        </if>
+        <if test="cardNo != null and cardNo != ''">
+            AND a.n_card_no = #{cardNo}
+        </if>
+    </select>
+
+
+    <update id="updateSalary">
+
+        update sys_user set adjustment = #{adjustment} ,adjustment_time = now()
+        where id =#{id}
+
+    </update>
+
+    <insert id="insertSalaryBasicSalaryRecord">
+        insert into salary_basic_salary_record values
+          (
+            #{id},#{createBy},now(),#{basicSalary}
+          )
+
+    </insert>
+
+    <select id="selectSalary" resultType="String">
+        select  basic_salary from salary_basic_salary_record order by create_time desc LIMIT 0,1
+    </select>
+
+</mapper>

+ 40 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryManagementDetailMapper.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.SalaryManagementDetailMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE 
+		FROM  salary_management_detail 
+		WHERE
+			 head_id = #{id} 		
+	</delete>
+	
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryManagementDetail">
+		SELECT * 
+		FROM  salary_management_detail
+		WHERE
+			 head_id = #{id} and del_flag=0
+		<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.SalaryManagementDetail">
+		select * from salary_management_detail where del_flag = 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.SalaryManagementDetail">
+		select * from salary_management_detail where del_flag = 0
+		and user_id = #{userId} and year_with_month BETWEEN #{beginDate} and #{endDate}
+
+	</select>
+
+</mapper>

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

@@ -0,0 +1,34 @@
+<?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.SalaryManagementHolidayMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE 
+		FROM  salary_management_holiday 
+		WHERE
+			 head_id = #{id} 		
+	</delete>
+	
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryManagementHoliday">
+		SELECT * 
+		FROM  salary_management_holiday
+		WHERE
+			 head_id = #{id} and del_flag=0
+		<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.SalaryManagementHoliday">
+		select * from salary_management_holiday where del_flag = 0
+		and user_id = #{userId} and year_with like '${yearWith}'
+
+	</select>
+	<select id="selectByUserTotal" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryManagementHoliday">
+		select * from salary_management_holiday where del_flag = 0
+		and user_id = #{userId} and year_with BETWEEN #{beginDate} and #{endDate}
+
+	</select>
+
+</mapper>

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

@@ -0,0 +1,28 @@
+<?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.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>
+
+    <delete id="deleteVersion">
+        update salary_management set del_flag = 1 where del_flag =0 and type =#{type} and year_with_month =#{yearWithMonth}
+                                                    and version &lt; #{version}
+    </delete>
+
+    <delete id="deleteVersionDetail">
+        update salary_management_detail set del_flag = 1 where del_flag =0 and year_with_month =#{yearWithMonth}
+                                                           and version &lt; #{version}
+    </delete>
+
+    <delete id="deleteVersionHoliday">
+        update salary_management_holiday set del_flag = 1 where del_flag =0 and year_with =#{yearWith}
+                                                            and version &lt; #{version}
+    </delete>
+
+    <delete id="deleteVersionOvertime">
+        update salary_management_work_overtime set del_flag = 1 where del_flag =0 and year_with_month =#{yearWithMonth}
+                                                                  and version &lt; #{version}
+    </delete>
+</mapper>

+ 40 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/salary/mapper/xml/SalaryManagementWorkOvertimeMapper.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.SalaryManagementWorkOvertimeMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE 
+		FROM  salary_management_work_overtime 
+		WHERE
+			 head_id = #{id} 		
+	</delete>
+	
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.salary.entity.SalaryManagementWorkOvertime">
+		SELECT * 
+		FROM  salary_management_work_overtime
+		WHERE
+			 head_id = #{id} and del_flag=0
+		<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.SalaryManagementWorkOvertime">
+		select * from salary_management_work_overtime where del_flag = 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.SalaryManagementWorkOvertime">
+		select * from salary_management_work_overtime where del_flag = 0
+		and user_id = #{userId} and year_with_month BETWEEN #{beginDate} and #{endDate}
+
+	</select>
+
+</mapper>

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

@@ -0,0 +1,16 @@
+package org.jeecg.modules.salary.service;
+
+import org.jeecg.modules.salary.entity.SalaryAttendanceDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * @Description: 考勤管理子表-考勤明细
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+public interface ISalaryAttendanceDetailService extends IService<SalaryAttendanceDetail> {
+
+	public List<SalaryAttendanceDetail> selectByMainId(String mainId,String orgName,String yearWithMonth,String version,String name,String remarks);
+}

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

@@ -0,0 +1,16 @@
+package org.jeecg.modules.salary.service;
+
+import org.jeecg.modules.salary.entity.SalaryAttendanceHoliday;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * @Description: 考勤管理子表-假期明细
+ * @Author: jeecg-boot
+ * @Date:   2024-04-15
+ * @Version: V1.0
+ */
+public interface ISalaryAttendanceHolidayService extends IService<SalaryAttendanceHoliday> {
+
+	public List<SalaryAttendanceHoliday> selectByMainId(String mainId,String orgName,String name);
+}

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

@@ -0,0 +1,45 @@
+package org.jeecg.modules.salary.service;
+
+import org.jeecg.modules.salary.entity.SalaryAttendanceDetail;
+import org.jeecg.modules.salary.entity.SalaryAttendance;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.salary.entity.SalaryAttendanceHoliday;
+import org.jeecg.modules.salary.entity.SalaryAttendanceWorkOvertime;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @Description: 考勤管理主表
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+public interface ISalaryAttendanceService extends IService<SalaryAttendance> {
+
+	/**
+	 * 添加一对多
+	 * 
+	 */
+	public void saveMain(SalaryAttendance salaryAttendance,List<SalaryAttendanceDetail> salaryAttendanceDetailList,
+						 List<SalaryAttendanceWorkOvertime> salaryAttendanceWorkOvertimeList,
+						 List<SalaryAttendanceHoliday> salaryAttendanceHolidayList) ;
+	
+	/**
+	 * 修改一对多
+	 * 
+	 */
+	public void updateMain(SalaryAttendance salaryAttendance,List<SalaryAttendanceDetail> salaryAttendanceDetailList);
+	
+	/**
+	 * 删除一对多
+	 */
+	public void delMain (String id);
+	
+	/**
+	 * 批量删除一对多
+	 */
+	public void delBatchMain (Collection<? extends Serializable> idList);
+	
+}

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

@@ -0,0 +1,16 @@
+package org.jeecg.modules.salary.service;
+
+import org.jeecg.modules.salary.entity.SalaryAttendanceWorkOvertime;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * @Description: 考勤管理子表-加班明细
+ * @Author: jeecg-boot
+ * @Date:   2024-04-15
+ * @Version: V1.0
+ */
+public interface ISalaryAttendanceWorkOvertimeService extends IService<SalaryAttendanceWorkOvertime> {
+
+	public List<SalaryAttendanceWorkOvertime> selectByMainId(String mainId,String orgName,String name);
+}

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

@@ -0,0 +1,26 @@
+package org.jeecg.modules.salary.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.salary.entity.SalaryChangeRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Description: 薪资变更记录
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+public interface ISalaryChangeRecordService extends IService<SalaryChangeRecord> {
+    IPage<SalaryChangeRecord> selectUserInfo(SalaryChangeRecord userParams, IPage page);
+    IPage<SalaryChangeRecord> selectUserInfo2(SalaryChangeRecord userParams, IPage page);
+    Result<?> saveSalaryChangeRecord(SalaryChangeRecord salaryChangeRecord);
+    List<SalaryChangeRecord> selectUserByPar(String name, String cardNo);
+
+    BigDecimal selectSalary();
+
+    String insertSalaryBasicSalaryRecord(BigDecimal basicSalary);
+}

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

@@ -0,0 +1,16 @@
+package org.jeecg.modules.salary.service;
+
+import org.jeecg.modules.salary.entity.SalaryManagementDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * @Description: 薪资管理子表-月度工资明细
+ * @Author: jeecg-boot
+ * @Date:   2024-04-16
+ * @Version: V1.0
+ */
+public interface ISalaryManagementDetailService extends IService<SalaryManagementDetail> {
+
+	public List<SalaryManagementDetail> selectByMainId(String mainId,String name);
+}

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

@@ -0,0 +1,16 @@
+package org.jeecg.modules.salary.service;
+
+import org.jeecg.modules.salary.entity.SalaryManagementHoliday;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * @Description: 薪资管理子表-年休工资单
+ * @Author: jeecg-boot
+ * @Date:   2024-04-18
+ * @Version: V1.0
+ */
+public interface ISalaryManagementHolidayService extends IService<SalaryManagementHoliday> {
+
+	public List<SalaryManagementHoliday> selectByMainId(String mainId,String name);
+}

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

@@ -0,0 +1,50 @@
+package org.jeecg.modules.salary.service;
+
+import org.jeecg.common.api.vo.Result;
+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 java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @Description: 薪资管理主表
+ * @Author: jeecg-boot
+ * @Date:   2024-04-16
+ * @Version: V1.0
+ */
+public interface ISalaryManagementService extends IService<SalaryManagement> {
+
+	void querySalaryTotalList(List<SalaryChangeRecord> pageList, SalaryChangeRecord userParams);
+	/**
+	 * 添加一对多
+	 * 
+	 */
+	public void saveMain(SalaryManagement salaryManagement,List<SalaryManagementDetail> salaryManagementDetailList) ;
+	
+	/**
+	 * 修改一对多
+	 * 
+	 */
+	public void updateMain(SalaryManagement salaryManagement,List<SalaryManagementDetail> salaryManagementDetailList);
+	
+	/**
+	 * 删除一对多
+	 */
+	public void delMain (String id);
+	
+	/**
+	 * 批量删除一对多
+	 */
+	public void delBatchMain (Collection<? extends Serializable> idList);
+
+	/**
+	 * 生成工资单
+	 * @param salaryManagement
+	 * @return
+	 */
+	public Result<?> generatePayroll(SalaryManagement salaryManagement);
+	
+}

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

@@ -0,0 +1,16 @@
+package org.jeecg.modules.salary.service;
+
+import org.jeecg.modules.salary.entity.SalaryManagementWorkOvertime;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * @Description: 薪资管理子表-加班工资单
+ * @Author: jeecg-boot
+ * @Date:   2024-04-16
+ * @Version: V1.0
+ */
+public interface ISalaryManagementWorkOvertimeService extends IService<SalaryManagementWorkOvertime> {
+
+	public List<SalaryManagementWorkOvertime> selectByMainId(String mainId,String name);
+}

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

@@ -0,0 +1,27 @@
+package org.jeecg.modules.salary.service.impl;
+
+import org.jeecg.modules.salary.entity.SalaryAttendanceDetail;
+import org.jeecg.modules.salary.mapper.SalaryAttendanceDetailMapper;
+import org.jeecg.modules.salary.service.ISalaryAttendanceDetailService;
+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-04-10
+ * @Version: V1.0
+ */
+@Service
+public class SalaryAttendanceDetailServiceImpl extends ServiceImpl<SalaryAttendanceDetailMapper, SalaryAttendanceDetail> implements ISalaryAttendanceDetailService {
+	
+	@Autowired
+	private SalaryAttendanceDetailMapper salaryAttendanceDetailMapper;
+	
+	@Override
+	public List<SalaryAttendanceDetail> selectByMainId(String mainId,String orgName,String yearWithMonth,String version,String name,String remarks) {
+		return salaryAttendanceDetailMapper.selectByMainId(mainId,orgName,yearWithMonth,version,name,remarks);
+	}
+}

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

@@ -0,0 +1,27 @@
+package org.jeecg.modules.salary.service.impl;
+
+import org.jeecg.modules.salary.entity.SalaryAttendanceHoliday;
+import org.jeecg.modules.salary.mapper.SalaryAttendanceHolidayMapper;
+import org.jeecg.modules.salary.service.ISalaryAttendanceHolidayService;
+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-04-15
+ * @Version: V1.0
+ */
+@Service
+public class SalaryAttendanceHolidayServiceImpl extends ServiceImpl<SalaryAttendanceHolidayMapper, SalaryAttendanceHoliday> implements ISalaryAttendanceHolidayService {
+	
+	@Autowired
+	private SalaryAttendanceHolidayMapper salaryAttendanceHolidayMapper;
+	
+	@Override
+	public List<SalaryAttendanceHoliday> selectByMainId(String mainId,String orgName,String name) {
+		return salaryAttendanceHolidayMapper.selectByMainId(mainId,orgName,name);
+	}
+}

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

@@ -0,0 +1,137 @@
+package org.jeecg.modules.salary.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.salary.entity.SalaryAttendance;
+import org.jeecg.modules.salary.entity.SalaryAttendanceDetail;
+import org.jeecg.modules.salary.entity.SalaryAttendanceHoliday;
+import org.jeecg.modules.salary.entity.SalaryAttendanceWorkOvertime;
+import org.jeecg.modules.salary.mapper.SalaryAttendanceDetailMapper;
+import org.jeecg.modules.salary.mapper.SalaryAttendanceHolidayMapper;
+import org.jeecg.modules.salary.mapper.SalaryAttendanceMapper;
+import org.jeecg.modules.salary.mapper.SalaryAttendanceWorkOvertimeMapper;
+import org.jeecg.modules.salary.service.ISalaryAttendanceService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Collection;
+
+/**
+ * @Description: 考勤管理主表
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+@Service
+public class SalaryAttendanceServiceImpl extends ServiceImpl<SalaryAttendanceMapper, SalaryAttendance> implements ISalaryAttendanceService {
+
+	@Autowired
+	private SalaryAttendanceMapper salaryAttendanceMapper;
+	@Autowired
+	private SalaryAttendanceDetailMapper salaryAttendanceDetailMapper;
+	@Autowired
+	private SalaryAttendanceHolidayMapper salaryAttendanceHolidayMapper;
+	@Autowired
+	private SalaryAttendanceWorkOvertimeMapper salaryAttendanceWorkOvertimeMapper;
+
+	@Override
+	@Transactional
+	public void saveMain(SalaryAttendance salaryAttendance, List<SalaryAttendanceDetail> salaryAttendanceDetailList,
+						 List<SalaryAttendanceWorkOvertime> salaryAttendanceWorkOvertimeList,
+						 List<SalaryAttendanceHoliday> salaryAttendanceHolidayList) {
+
+		LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+		Integer version = salaryAttendanceMapper.selectVersion(salaryAttendance.getType(), salaryAttendance.getYearWithMonth());
+		if(version != null){
+			version = version+1;
+		}else{
+			version = 1;
+		}
+
+		salaryAttendance.setVersion(String.valueOf(version));
+		salaryAttendance.setId(IdUtil.simpleUUID());
+		salaryAttendance.setCreateBy(sysUser.getUsername());
+		salaryAttendance.setCreateTime(new Date());
+
+		salaryAttendanceMapper.insert(salaryAttendance);
+		salaryAttendanceMapper.deleteVersion(salaryAttendance.getType(),salaryAttendance.getYearWithMonth(),version);
+
+		if(salaryAttendanceDetailList != null && salaryAttendanceDetailList.size() > 0){
+			for(SalaryAttendanceDetail entity:salaryAttendanceDetailList) {
+				//外键设置
+				entity.setHeadId(salaryAttendance.getId());
+				entity.setVersion(String.valueOf(version));
+				salaryAttendanceDetailMapper.insert(entity);
+			}
+			salaryAttendanceMapper.deleteVersionDetail(salaryAttendance.getYearWithMonth(),version);
+		}
+
+		if(salaryAttendanceWorkOvertimeList != null && salaryAttendanceWorkOvertimeList.size() > 0){
+			for(SalaryAttendanceWorkOvertime entity:salaryAttendanceWorkOvertimeList) {
+				//外键设置
+				entity.setHeadId(salaryAttendance.getId());
+				entity.setVersion(String.valueOf(version));
+				BigDecimal bg = new BigDecimal("0");
+
+				bg = bg.add(entity.getJanuary()).add(entity.getFebruary()).add(entity.getMarch()).add(entity.getApril()).add(entity.getMay()).add(entity.getJune())
+						.add(entity.getJuly()).add(entity.getAugust()).add(entity.getSeptember()).add(entity.getOctober()).add(entity.getNovember()).add(entity.getDecember());
+				entity.setTotal(bg);
+
+				salaryAttendanceWorkOvertimeMapper.insert(entity);
+			}
+			salaryAttendanceMapper.deleteVersionHoliday(salaryAttendance.getYearWithMonth(),version);
+		}
+
+		if(salaryAttendanceHolidayList != null && salaryAttendanceHolidayList.size() > 0){
+
+			for(SalaryAttendanceHoliday entity:salaryAttendanceHolidayList) {
+				//外键设置
+				entity.setHeadId(salaryAttendance.getId());
+				entity.setVersion(String.valueOf(version));
+				salaryAttendanceHolidayMapper.insert(entity);
+			}
+			salaryAttendanceMapper.deleteVersionOvertime(salaryAttendance.getYearWithMonth(),version);
+		}
+
+	}
+
+	@Override
+	@Transactional
+	public void updateMain(SalaryAttendance salaryAttendance,List<SalaryAttendanceDetail> salaryAttendanceDetailList) {
+		salaryAttendanceMapper.updateById(salaryAttendance);
+		
+		//1.先删除子表数据
+		salaryAttendanceDetailMapper.deleteByMainId(salaryAttendance.getId());
+		
+		//2.子表数据重新插入
+		for(SalaryAttendanceDetail entity:salaryAttendanceDetailList) {
+			//外键设置
+			entity.setHeadId(salaryAttendance.getId());
+			salaryAttendanceDetailMapper.insert(entity);
+		}
+	}
+
+	@Override
+	@Transactional
+	public void delMain(String id) {
+		salaryAttendanceDetailMapper.deleteByMainId(id);
+		salaryAttendanceMapper.deleteById(id);
+	}
+
+	@Override
+	@Transactional
+	public void delBatchMain(Collection<? extends Serializable> idList) {
+		for(Serializable id:idList) {
+			salaryAttendanceDetailMapper.deleteByMainId(id.toString());
+			salaryAttendanceMapper.deleteById(id);
+		}
+	}
+	
+}

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

@@ -0,0 +1,27 @@
+package org.jeecg.modules.salary.service.impl;
+
+import org.jeecg.modules.salary.entity.SalaryAttendanceWorkOvertime;
+import org.jeecg.modules.salary.mapper.SalaryAttendanceWorkOvertimeMapper;
+import org.jeecg.modules.salary.service.ISalaryAttendanceWorkOvertimeService;
+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-04-15
+ * @Version: V1.0
+ */
+@Service
+public class SalaryAttendanceWorkOvertimeServiceImpl extends ServiceImpl<SalaryAttendanceWorkOvertimeMapper, SalaryAttendanceWorkOvertime> implements ISalaryAttendanceWorkOvertimeService {
+	
+	@Autowired
+	private SalaryAttendanceWorkOvertimeMapper salaryAttendanceWorkOvertimeMapper;
+	
+	@Override
+	public List<SalaryAttendanceWorkOvertime> selectByMainId(String mainId,String orgName,String name) {
+		return salaryAttendanceWorkOvertimeMapper.selectByMainId(mainId,orgName,name);
+	}
+}

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

@@ -0,0 +1,156 @@
+package org.jeecg.modules.salary.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang.StringUtils;
+import org.apache.ibatis.annotations.Param;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.encryption.AesEncryptUtil;
+import org.jeecg.modules.salary.entity.SalaryChangeRecord;
+import org.jeecg.modules.salary.mapper.SalaryChangeRecordMapper;
+import org.jeecg.modules.salary.service.ISalaryChangeRecordService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 薪资变更记录
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+@Service
+public class SalaryChangeRecordServiceImpl extends ServiceImpl<SalaryChangeRecordMapper, SalaryChangeRecord> implements ISalaryChangeRecordService {
+    @Override
+    public IPage<SalaryChangeRecord> selectUserInfo( SalaryChangeRecord userParams, IPage page){
+        List<SalaryChangeRecord> list = baseMapper.selectUserInfo(page, userParams);
+        Integer total = baseMapper.selectUserInfoTotal(userParams);
+        for(SalaryChangeRecord o:list){
+            String beforeAdjustment = o.getBeforeAdjustment();
+            if(StringUtils.isNotBlank(beforeAdjustment)){
+                try {
+                    o.setBeforeAdjustment(AesEncryptUtil.desEncrypt(beforeAdjustment).trim());
+                }catch (Exception e){
+                    System.out.println("解密失败!!!!");
+                }
+            }
+        }
+        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);
+        Integer total = baseMapper.selectUserInfoTotal2(userParams);
+        for(SalaryChangeRecord o:list){
+            String beforeAdjustment = o.getBeforeAdjustment();
+            if(StringUtils.isNotBlank(beforeAdjustment)){
+                try {
+                    o.setBeforeAdjustment(AesEncryptUtil.desEncrypt(beforeAdjustment).trim());
+                }catch (Exception e){
+                    System.out.println("解密失败!!!!");
+                }
+            }
+        }
+        IPage<SalaryChangeRecord> result = new Page<>(page.getCurrent(), page.getSize(), total);
+        result.setRecords(list);
+
+        return result;
+    }
+
+    /**
+     * 保存变更
+     * @param salaryChangeRecord
+     * @return
+     */
+    @Override
+    public Result<?> saveSalaryChangeRecord(SalaryChangeRecord salaryChangeRecord){
+
+        String beforeAdjustment = salaryChangeRecord.getBeforeAdjustment();//调整前薪资
+        String afterAdjustment = salaryChangeRecord.getAfterAdjustment();//调整后薪资
+        String salaryReduction = salaryChangeRecord.getSalaryReduction();//降薪额度
+        String salaryIncrease = salaryChangeRecord.getSalaryIncrease();//涨薪额度
+
+        try {
+            if(StringUtils.isNotBlank(beforeAdjustment)){
+                salaryChangeRecord.setBeforeAdjustment(AesEncryptUtil.encrypt(beforeAdjustment));
+            }
+            if(StringUtils.isNotBlank(afterAdjustment)){
+                salaryChangeRecord.setAfterAdjustment(AesEncryptUtil.encrypt(afterAdjustment));
+            }
+            if(StringUtils.isNotBlank(salaryReduction)){
+                salaryChangeRecord.setType("0");//1涨薪,0降薪
+                salaryChangeRecord.setSalaryReduction(AesEncryptUtil.encrypt(salaryReduction));
+            }
+            if(StringUtils.isNotBlank(salaryIncrease)){
+                salaryChangeRecord.setType("1");//1涨薪,0降薪
+                salaryChangeRecord.setSalaryIncrease(AesEncryptUtil.encrypt(salaryIncrease));
+            }
+
+            if(StringUtils.isBlank(salaryReduction) && StringUtils.isBlank(salaryIncrease)){
+                return Result.error("薪资为空!");
+            }
+
+        }catch (Exception e){
+            System.out.println("加密失败!!!!");
+        }
+        this.save(salaryChangeRecord);
+        baseMapper.updateSalary(salaryChangeRecord.getAfterAdjustment(),salaryChangeRecord.getUserId());
+
+        return Result.ok("添加成功!");
+    }
+
+    @Override
+    public List<SalaryChangeRecord> selectUserByPar(String name, String cardNo){
+        return baseMapper.selectUserByPar(name,cardNo);
+    }
+
+    @Override
+    public BigDecimal selectSalary(){
+
+        try {
+
+            String salary = baseMapper.selectSalary();
+            if(StringUtils.isNotBlank(salary)){
+
+                String bas = AesEncryptUtil.desEncrypt(salary).trim();
+                BigDecimal bg = new BigDecimal(bas);
+                return bg;
+
+            }else{
+                return new BigDecimal("0");
+            }
+
+        }catch (Exception e){
+            return new BigDecimal("0");
+        }
+
+    }
+
+    @Override
+    public String insertSalaryBasicSalaryRecord(BigDecimal basicSalary){
+
+        try {
+            String bas = AesEncryptUtil.encrypt(basicSalary.toString());
+
+            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            baseMapper.insertSalaryBasicSalaryRecord(IdUtil.simpleUUID(),sysUser.getUsername(),bas);
+            return "true";
+
+        }catch (Exception e){
+            return "false";
+        }
+
+    }
+
+
+}

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

@@ -0,0 +1,36 @@
+package org.jeecg.modules.salary.service.impl;
+
+import org.jeecg.modules.salary.entity.SalaryManagementDetail;
+import org.jeecg.modules.salary.mapper.SalaryManagementDetailMapper;
+import org.jeecg.modules.salary.service.ISalaryManagementDetailService;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+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-04-16
+ * @Version: V1.0
+ */
+@Service
+public class SalaryManagementDetailServiceImpl extends ServiceImpl<SalaryManagementDetailMapper, SalaryManagementDetail> implements ISalaryManagementDetailService {
+	
+	@Autowired
+	private SalaryManagementDetailMapper salaryManagementDetailMapper;
+	
+	@Override
+	public List<SalaryManagementDetail> selectByMainId(String mainId,String name) {
+		return salaryManagementDetailMapper.selectByMainId(mainId,name);
+	}
+
+	public static void main(String[] args) {
+		BigDecimal bd = new BigDecimal("12.1154545");
+		String str2 = String.format("%.2f",bd);
+		System.out.println("str2: "+str2);
+
+	}
+}

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

@@ -0,0 +1,27 @@
+package org.jeecg.modules.salary.service.impl;
+
+import org.jeecg.modules.salary.entity.SalaryManagementHoliday;
+import org.jeecg.modules.salary.mapper.SalaryManagementHolidayMapper;
+import org.jeecg.modules.salary.service.ISalaryManagementHolidayService;
+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-04-18
+ * @Version: V1.0
+ */
+@Service
+public class SalaryManagementHolidayServiceImpl extends ServiceImpl<SalaryManagementHolidayMapper, SalaryManagementHoliday> implements ISalaryManagementHolidayService {
+	
+	@Autowired
+	private SalaryManagementHolidayMapper salaryManagementHolidayMapper;
+	
+	@Override
+	public List<SalaryManagementHoliday> selectByMainId(String mainId,String name) {
+		return salaryManagementHolidayMapper.selectByMainId(mainId,name);
+	}
+}

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

@@ -0,0 +1,1369 @@
+package org.jeecg.modules.salary.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.encryption.AesEncryptUtil;
+import org.jeecg.modules.salary.entity.*;
+import org.jeecg.modules.salary.mapper.*;
+import org.jeecg.modules.salary.service.ISalaryManagementService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @Description: 薪资管理主表
+ * @Author: jeecg-boot
+ * @Date: 2024-04-16
+ * @Version: V1.0
+ */
+@Service
+public class SalaryManagementServiceImpl extends ServiceImpl<SalaryManagementMapper, SalaryManagement> implements ISalaryManagementService {
+
+    @Autowired
+    private SalaryManagementMapper salaryManagementMapper;
+    @Autowired
+    private SalaryManagementDetailMapper salaryManagementDetailMapper;
+    @Autowired
+    private SalaryManagementWorkOvertimeMapper salaryManagementWorkOvertimeMapper;
+    @Autowired
+    private SalaryManagementHolidayMapper salaryManagementHolidayMapper;
+
+    @Autowired
+    private SalaryAttendanceDetailMapper salaryAttendanceDetailMapper;
+    @Autowired
+    private SalaryAttendanceHolidayMapper salaryAttendanceHolidayMapper;
+    @Autowired
+    private SalaryChangeRecordMapper salaryChangeRecordMapper;
+
+
+    @Override
+    public void querySalaryTotalList(List<SalaryChangeRecord> pageList, SalaryChangeRecord userParams) {
+
+        String beginDate = userParams.getBeginDate();
+        String endDate = userParams.getEndDate();
+
+        try {
+
+            for (SalaryChangeRecord o : pageList) {
+                String userId = o.getUserId();
+                List<SalaryManagementDetail> detailList = salaryManagementDetailMapper.selectByUserTotal(userId, beginDate, endDate);
+                List<SalaryManagementWorkOvertime> overTimeList = salaryManagementWorkOvertimeMapper.selectByUserTotal(userId, beginDate, endDate);
+                List<SalaryManagementHoliday> holidayList = salaryManagementHolidayMapper.selectByUserTotal(userId, beginDate.substring(0, 4), endDate.substring(0, 4));
+
+                BigDecimal phoneBill = new BigDecimal("0");//话费补贴
+                BigDecimal lunch = new BigDecimal("0");//午餐补贴
+                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");//个税
+                BigDecimal latenessCost = new BigDecimal("0");//迟到扣费
+                BigDecimal personalCost = new BigDecimal("0");//事假扣费
+                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());
+                    transportation = transportation.add(d.getTransportation() == null ? BigDecimal.ZERO : d.getTransportation());
+                    fullAttendance = fullAttendance.add(d.getFullAttendance() == null ? BigDecimal.ZERO : d.getFullAttendance());
+                    socialSecurity = socialSecurity.add(d.getSocialSecurity() == null ? BigDecimal.ZERO : d.getSocialSecurity());
+                    accumulationFund = accumulationFund.add(d.getAccumulationFund() == null ? BigDecimal.ZERO : d.getAccumulationFund());
+                    personalTax = personalTax.add(d.getPersonalTax() == null ? BigDecimal.ZERO : d.getPersonalTax());
+                    latenessCost = latenessCost.add(d.getLatenessCost() == null ? BigDecimal.ZERO : d.getLatenessCost());
+                    personalCost = personalCost.add(d.getPersonalCost() == null ? BigDecimal.ZERO : d.getPersonalCost());
+                    sickCost = sickCost.add(d.getSickCost() == null ? BigDecimal.ZERO : d.getSickCost());
+                    marriageCost = marriageCost.add(d.getMarriageCost() == null ? BigDecimal.ZERO : d.getMarriageCost());
+                    funeralCost = funeralCost.add(d.getFuneralCost() == null ? BigDecimal.ZERO : d.getFuneralCost());
+
+                    //合计应扣
+                    totalDeduction = totalDeduction.add(d.getTotalDeduction() == null ? BigDecimal.ZERO : d.getTotalDeduction());
+
+                    //totalPayable 合计应发
+                    String hisTotalPayable = d.getTotalPayable() == null ? "nghotxDTNyeHgH0mlfbJig==" : d.getTotalPayable();
+                    hisTotalPayable = AesEncryptUtil.desEncrypt(hisTotalPayable).trim();
+                    BigDecimal hisTotalPayableNew = new BigDecimal(hisTotalPayable);
+                    totalPayable = totalPayable.add(hisTotalPayableNew);
+
+                    //actualOccurrence 实发合计
+                    String hisActualOccurrence = d.getActualOccurrence() == null ? "nghotxDTNyeHgH0mlfbJig==" : d.getActualOccurrence();
+                    hisActualOccurrence = AesEncryptUtil.desEncrypt(hisActualOccurrence).trim();
+                    BigDecimal hisActualOccurrenceNew = new BigDecimal(hisActualOccurrence);
+                    actualOccurrence = actualOccurrence.add(hisActualOccurrenceNew);
+                }
+
+
+                for (SalaryManagementWorkOvertime d : overTimeList) {
+                    overtimePay = overtimePay.add(d.getWorkOvertimeCost() == null ? BigDecimal.ZERO : d.getWorkOvertimeCost());
+                    personalTax = personalTax.add(d.getPersonalTax() == null ? BigDecimal.ZERO : d.getPersonalTax());
+                    //合计应扣,此处需加上加班工资的个税
+                    totalDeduction = personalTax.add(d.getPersonalTax() == null ? BigDecimal.ZERO : d.getPersonalTax());
+                    //合计应发,此处需加上加班工资
+                    totalPayable = totalPayable.add(d.getWorkOvertimeCost() == null ? BigDecimal.ZERO : d.getWorkOvertimeCost());
+                    //actualOccurrence 实发合计
+                    String hisActualOccurrence = d.getActualOccurrence() == null ? "nghotxDTNyeHgH0mlfbJig==" : d.getActualOccurrence();
+                    hisActualOccurrence = AesEncryptUtil.desEncrypt(hisActualOccurrence).trim();
+                    BigDecimal hisActualOccurrenceNew = new BigDecimal(hisActualOccurrence);
+                    actualOccurrence = actualOccurrence.add(hisActualOccurrenceNew);
+                }
+
+                for (SalaryManagementHoliday d : holidayList) {
+                    personalTax = personalTax.add(d.getPersonalTax() == null ? BigDecimal.ZERO : d.getPersonalTax());
+                    //合计应扣,此处需加上年休工资的个税
+                    totalDeduction = personalTax.add(d.getPersonalTax() == null ? BigDecimal.ZERO : d.getPersonalTax());
+
+                    //totalPayable 合计应发  d.getWages();//应发薪资
+                    String hisTotalPayable = d.getWages() == null ? "nghotxDTNyeHgH0mlfbJig==" : d.getWages();
+                    hisTotalPayable = AesEncryptUtil.desEncrypt(hisTotalPayable).trim();
+                    BigDecimal hisTotalPayableNew = new BigDecimal(hisTotalPayable);
+                    totalPayable = totalPayable.add(hisTotalPayableNew);
+
+                    //actualOccurrence 实发合计 d.getActualOccurrence();//实发合计
+                    String hisActualOccurrence = d.getActualOccurrence() == null ? "nghotxDTNyeHgH0mlfbJig==" : d.getActualOccurrence();
+                    hisActualOccurrence = AesEncryptUtil.desEncrypt(hisActualOccurrence).trim();
+                    BigDecimal hisActualOccurrenceNew = new BigDecimal(hisActualOccurrence);
+                    actualOccurrence = actualOccurrence.add(hisActualOccurrenceNew);
+                    yearSalary = yearSalary.add(hisTotalPayableNew);
+                }
+
+                o.setPhoneBill(phoneBill);
+                o.setLunch(lunch);
+                o.setHousingSubsidies(housingSubsidies);
+                o.setTransportation(transportation);
+                o.setFullAttendance(fullAttendance);
+                o.setOvertimePay(overtimePay);
+                o.setYearSalary(yearSalary);
+                o.setTotalPayable(totalPayable.toString());
+                o.setSocialSecurity(socialSecurity);
+                o.setAccumulationFund(accumulationFund);
+                o.setLatenessCost(latenessCost);
+                o.setPersonalTax(personalTax);
+                o.setPersonalCost(personalCost);
+                o.setSickCost(sickCost);
+                o.setMarriageCost(marriageCost);
+                o.setFuneralCost(funeralCost);
+                o.setTotalDeduction(totalDeduction);
+                o.setActualOccurrence(actualOccurrence.toString());
+
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    @Transactional
+    public void saveMain(SalaryManagement salaryManagement, List<SalaryManagementDetail> salaryManagementDetailList) {
+        salaryManagementMapper.insert(salaryManagement);
+        for (SalaryManagementDetail entity : salaryManagementDetailList) {
+            //外键设置
+            entity.setHeadId(salaryManagement.getId());
+            salaryManagementDetailMapper.insert(entity);
+        }
+    }
+
+    @Override
+    @Transactional
+    public void updateMain(SalaryManagement salaryManagement, List<SalaryManagementDetail> salaryManagementDetailList) {
+        salaryManagementMapper.updateById(salaryManagement);
+
+        //1.先删除子表数据
+        salaryManagementDetailMapper.deleteByMainId(salaryManagement.getId());
+
+        //2.子表数据重新插入
+        for (SalaryManagementDetail entity : salaryManagementDetailList) {
+            //外键设置
+            entity.setHeadId(salaryManagement.getId());
+            salaryManagementDetailMapper.insert(entity);
+        }
+    }
+
+    @Override
+    @Transactional
+    public void delMain(String id) {
+        salaryManagementDetailMapper.deleteByMainId(id);
+        salaryManagementMapper.deleteById(id);
+    }
+
+    @Override
+    @Transactional
+    public void delBatchMain(Collection<? extends Serializable> idList) {
+        for (Serializable id : idList) {
+            salaryManagementDetailMapper.deleteByMainId(id.toString());
+            salaryManagementMapper.deleteById(id);
+        }
+    }
+
+    @Override
+    @Transactional
+    public Result<?> generatePayroll(SalaryManagement salaryManagement) {
+
+        String type = salaryManagement.getType();//月度工资单、年休工资单、加班工资单
+
+        if (StringUtils.isBlank(type)) {
+            return Result.error("参数异常type、yearWithMonth");
+        }
+
+        String yearWithMonth = salaryManagement.getYearWithMonth();
+
+        String endMonth = salaryManagement.getEndMonth();
+        String beginMonth = salaryManagement.getBeginMonth();
+
+        String yearWith = salaryManagement.getYearWith();
+
+        if (StringUtils.isBlank(yearWithMonth)) {
+            yearWithMonth = "2024-12-12";
+        }
+        String withMonth = yearWithMonth.substring(0, 4);
+
+
+        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");
+
+        Map<String,Object> data = new HashMap<>();
+        data.put("MFY",null);
+        data.put("NBSY",null);
+        data.put("ZZ",null);
+
+        try {
+
+            if ("月度工资单".equals(type)) {
+
+                if (StringUtils.isBlank(yearWithMonth)) {
+                    return Result.error("参数异常yearWithMonth");
+                }
+
+                //月度工资单
+                List<SalaryManagementDetail> salaryAttendanceDetailListMFY = new ArrayList<>();//马非羊
+                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);
+
+                if (list.size() < 1) {
+                    return Result.error("执行失败,没有找到" + yearWithMonth + "的考勤数据!");
+                }
+
+                for (SalaryAttendanceDetail o : list) {
+
+                    StringBuffer sb = new StringBuffer("本次执行(月度工资单):");//记录执行信息
+
+                    String userId = o.getUserId();//用户主键
+                    String orgName = o.getOrgName();//组织
+                    String wages = o.getWages();//基本薪资
+                    if (StringUtils.isBlank(wages)) {
+                        return Result.error("执行失败,员工" + o.getName() + ",工号" + o.getCode() + ":" + yearWithMonth + "月份的薪资没有维护!!");
+                    }
+                    BigDecimal bigWages = new BigDecimal(AesEncryptUtil.desEncrypt(wages).trim());//基本薪资 (明文)
+
+                    BigDecimal personalLeave = o.getPersonalLeave() == null ? BigDecimal.ZERO : o.getPersonalLeave();//事假时间(分)
+                    BigDecimal workingHours = o.getWorkingHours() == null ? BigDecimal.ZERO : o.getWorkingHours();//每日工时
+                    BigDecimal attendanceDays = o.getAttendanceDays() == null ? BigDecimal.ZERO : o.getAttendanceDays();//出勤天数
+
+				/*
+				附加薪资
+				 */
+                    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();//全勤奖
+
+				/*
+				扣除薪资
+				 */
+                    BigDecimal endowmentInsurance = o.getEndowmentInsurance() == null ? BigDecimal.ZERO : o.getEndowmentInsurance();//养老保险
+                    BigDecimal unemploymentInsurance = o.getUnemploymentInsurance() == null ? BigDecimal.ZERO : o.getUnemploymentInsurance();//失业保险
+                    BigDecimal medicalInsurance = o.getMedicalInsurance() == null ? BigDecimal.ZERO : o.getMedicalInsurance();//医疗保险
+                    BigDecimal accumulationFund = o.getAccumulationFund() == null ? BigDecimal.ZERO : o.getAccumulationFund();//公积金
+                    BigDecimal latenessCost = o.getLatenessCost() == null ? BigDecimal.ZERO : o.getLatenessCost();//迟到扣费
+
+                    BigDecimal deduction = o.getDeduction() == null ? BigDecimal.ZERO : o.getDeduction();
+                    ;//工资抵扣
+
+                /*
+                赋值和计算
+                 */
+                    SalaryManagementDetail salaryManagementDetail = new SalaryManagementDetail();//
+                    salaryManagementDetail.setUserId(o.getUserId());
+                    salaryManagementDetail.setCode(o.getCode());
+                    salaryManagementDetail.setName(o.getName());
+                    salaryManagementDetail.setOrgName(o.getOrgName());
+                    salaryManagementDetail.setCardNo(o.getCardNo());
+
+                    salaryManagementDetail.setWages(o.getWages());
+                    salaryManagementDetail.setPhoneBill(o.getPhoneBill());
+                    salaryManagementDetail.setLunch(o.getLunch());
+                    salaryManagementDetail.setHousingSubsidies(o.getHousingSubsidies());
+                    salaryManagementDetail.setTransportation(o.getTransportation());
+                    salaryManagementDetail.setFullAttendance(o.getFullAttendance());
+
+                    //合计应发 = 基本薪资+话费补贴+午餐补贴+住房补贴+交通补贴+全勤奖
+                    BigDecimal totalPayable = new BigDecimal("0");
+                    totalPayable = bigWages.add(phoneBill).add(lunch).add(housingSubsidies).add(transportation).add(fullAttendance);
+                    //合计应发 (密文)
+                    String totalPayableText = AesEncryptUtil.encrypt(totalPayable.toString());
+                    salaryManagementDetail.setTotalPayable(totalPayableText);//合计应发
+
+                    //社保 = 养老+失业+医疗保险
+                    BigDecimal socialSecurity = new BigDecimal("0");
+                    socialSecurity = endowmentInsurance.add(unemploymentInsurance).add(medicalInsurance);
+                    salaryManagementDetail.setSocialSecurity(socialSecurity);//社保
+
+                    salaryManagementDetail.setAccumulationFund(o.getAccumulationFund());//公积金
+
+
+                    //应纳税所得额 = 合计应发 - 五险一金 - 扣除数(deduction)
+                    BigDecimal payTaxes = new BigDecimal("0");
+                    payTaxes = totalPayable.subtract(socialSecurity).subtract(accumulationFund).subtract(deduction);
+                    String payTaxesText = AesEncryptUtil.encrypt(payTaxes.toString());
+                    salaryManagementDetail.setPayTaxes(payTaxesText);//应纳税所得额
+
+                    //累计所得额 = 本年度当前人员所有应纳税所得之和
+                    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);
+
+                    if (cumulativeList.size() > 0) {
+                        for (SalaryManagementDetail detail : cumulativeList) {
+                            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){
+//                            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) {
+                            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(payTaxes);
+                    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);
+                    }
+
+                    salaryManagementDetail.setPersonalTax(personalTax);//个税
+
+                    salaryManagementDetail.setLatenessCost(o.getLatenessCost());//迟到扣费
+
+//                    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保险(社保)+公积金+迟到扣费+事假扣费
+                    BigDecimal totalDeduction = new BigDecimal("0");
+                    totalDeduction = personalTax.add(socialSecurity).add(accumulationFund).add(latenessCost).add(personalCost);
+                    salaryManagementDetail.setTotalDeduction(totalDeduction);//合计应扣
+
+                    //实发合计 = 合计应发-合计应扣
+                    BigDecimal actualOccurrence = new BigDecimal("0");
+                    actualOccurrence = totalPayable.subtract(totalDeduction).setScale(2, BigDecimal.ROUND_HALF_UP);
+                    ;
+                    String actualOccurrenceText = AesEncryptUtil.encrypt(actualOccurrence.toString());
+                    salaryManagementDetail.setActualOccurrence(actualOccurrenceText);//实发合计
+                    salaryManagementDetail.setDeduction(o.getDeduction());//工资抵扣
+
+
+                    salaryManagementDetail.setYearWithMonth(yearWithMonth);
+                    salaryManagementDetail.setActionLog("执行日志" + sb);//执行日志
+
+                    if ("马菲羊".equals(orgName)) {
+                        //统计总金额和总个税
+                        salaryMFY = salaryMFY.add(actualOccurrence);
+                        personalTaxMFY = personalTaxMFY.add(personalTax);
+
+                        salaryAttendanceDetailListMFY.add(salaryManagementDetail);
+                    } else if ("森语".equals(orgName)) {
+                        //统计总金额和总个税
+                        salaryNBSY = salaryNBSY.add(actualOccurrence);
+                        personalTaxNBSY = personalTaxNBSY.add(personalTax);
+
+                        salaryAttendanceDetailListNBSY.add(salaryManagementDetail);
+                    } else if ("正织".equals(orgName)) {
+                        //统计总金额和总个税
+                        salaryZZ = salaryZZ.add(actualOccurrence);
+                        personalTaxZZ = personalTaxZZ.add(personalTax);
+
+                        salaryAttendanceDetailListZZ.add(salaryManagementDetail);
+                    } else {
+                        continue;
+                    }
+                }
+
+
+                if (salaryAttendanceDetailListMFY.size() > 0) {
+                    salaryManagementMFY.setYearWithMonth(yearWithMonth);
+//                    salaryManagementMFY.setSalary(AesEncryptUtil.encrypt(salaryMFY.toString()));
+//                    salaryManagementMFY.setPersonalTax(AesEncryptUtil.encrypt(personalTaxMFY.toString()));
+
+                    salaryManagementMFY.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryMFY)));
+                    salaryManagementMFY.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxMFY)));
+                }
+                if (salaryAttendanceDetailListNBSY.size() > 0) {
+                    salaryManagementNBSY.setYearWithMonth(yearWithMonth);
+//                    salaryManagementNBSY.setSalary(AesEncryptUtil.encrypt(salaryNBSY.toString()));
+//                    salaryManagementNBSY.setPersonalTax(AesEncryptUtil.encrypt(personalTaxNBSY.toString()));
+
+                    salaryManagementNBSY.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryNBSY)));
+                    salaryManagementNBSY.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxNBSY)));
+                }
+                if (salaryAttendanceDetailListZZ.size() > 0) {
+                    salaryManagementZZ.setYearWithMonth(yearWithMonth);
+//                    salaryManagementZZ.setSalary(AesEncryptUtil.encrypt(salaryZZ.toString()));
+//                    salaryManagementZZ.setPersonalTax(AesEncryptUtil.encrypt(personalTaxZZ.toString()));
+
+                    salaryManagementZZ.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryZZ)));
+                    salaryManagementZZ.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxZZ)));
+                }
+
+                this.saveAll(yearWithMonth, salaryManagementMFY, salaryManagementNBSY, salaryManagementZZ, salaryAttendanceDetailListMFY,
+                        salaryAttendanceDetailListNBSY, salaryAttendanceDetailListZZ);
+
+                if(salaryMFY.compareTo(new BigDecimal("0")) != 0){
+                    data.put("MFY",salaryManagementMFY.getId());
+                }
+                if(salaryNBSY.compareTo(new BigDecimal("0")) != 0){
+                    data.put("NBSY",salaryManagementNBSY.getId());
+                }
+                if(salaryZZ.compareTo(new BigDecimal("0")) != 0){
+                    data.put("ZZ",salaryManagementZZ.getId());
+                }
+
+            }
+            else if ("年休工资单".equals(type)) {
+                if (StringUtils.isBlank(yearWith)) {
+                    return Result.error("参数异常yearWith");
+                }
+
+                //年休工资单
+                List<SalaryManagementHoliday> holidayListMFY = new ArrayList<>();//马非羊
+                List<SalaryManagementHoliday> holidayListNBSY = new ArrayList<>();//宁波森语
+                List<SalaryManagementHoliday> holidayListZZ = new ArrayList<>();//正织
+
+                QueryWrapper<SalaryAttendanceHoliday> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("del_flag", "0");
+                queryWrapper.like("year_with_month", yearWith + "%");
+                List<SalaryAttendanceHoliday> list = salaryAttendanceHolidayMapper.selectList(queryWrapper);
+
+                if (list.size() < 1) {
+                    return Result.error("执行失败,没有找到" + yearWith + "的年休数据!");
+                }
+
+                String salaryBase = salaryChangeRecordMapper.selectSalary();
+                if (StringUtils.isBlank(salaryBase)) {
+                    return Result.error("计算失败,工资基数异常!");
+                }
+
+                String salaryBaseText = AesEncryptUtil.desEncrypt(salaryBase).trim();
+
+                BigDecimal salaryBaseBig = new BigDecimal(salaryBaseText);
+
+                for (SalaryAttendanceHoliday o : list) {
+
+                    StringBuffer sb = new StringBuffer("本次执行(年休工资单):");//记录执行信息
+
+                    String userId = o.getUserId();//用户主键
+                    String orgName = o.getOrgName();//组织
+                    BigDecimal workingHours = o.getWorkingHours() == null ? new BigDecimal("22") : o.getWorkingHours();//每日工时
+                    BigDecimal surplus = o.getSurplus() == null ? BigDecimal.ZERO : o.getSurplus();//剩余天数
+
+                    SalaryManagementHoliday salaryManagementHoliday = new SalaryManagementHoliday();
+
+                    salaryManagementHoliday.setUserId(userId);
+                    salaryManagementHoliday.setCode(o.getCode());
+                    salaryManagementHoliday.setName(o.getName());
+                    salaryManagementHoliday.setOrgName(orgName);
+                    salaryManagementHoliday.setCardNo(o.getCardNo());
+                    salaryManagementHoliday.setAnnualLeave(o.getAnnualLeave());
+                    salaryManagementHoliday.setUsed(o.getUsed());
+                    salaryManagementHoliday.setSurplus(o.getSurplus());
+                    salaryManagementHoliday.setYearWithMonth(o.getYearWithMonth());
+                    salaryManagementHoliday.setYearWith(yearWith);
+                    salaryManagementHoliday.setRestMode(o.getRestMode());
+                    salaryManagementHoliday.setWorkingHours(o.getWorkingHours());
+
+                    //应发薪资 = 基本薪资/(单休26,双休22)*剩余年休
+                    BigDecimal wages = new BigDecimal("0");
+                    wages = salaryBaseBig.divide(workingHours, 2, BigDecimal.ROUND_HALF_UP).multiply(surplus);
+                    String wagesText = AesEncryptUtil.encrypt(wages.toString()).trim();
+                    salaryManagementHoliday.setWages(wagesText);//应发薪资
+                    salaryManagementHoliday.setPayTaxes(wagesText);//应纳税所得额
+
+                    //累计所得额 = 本年度当前人员所有应纳税所得之和
+                    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);
+
+                        if (cumulativeList.size() > 0) {
+                            for (SalaryManagementDetail detail : cumulativeList) {
+                                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) {
+                                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);
+                    } else {
+                        sb.append("本次应发薪资年休工资为0,不计入累计所得额中");
+                    }
+
+                    String cumulativeText = AesEncryptUtil.encrypt(cumulative.toString());
+                    salaryManagementHoliday.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);
+                    }
+
+                    salaryManagementHoliday.setPersonalTax(personalTax);//个税
+
+                    //实发加班工资 = 加班工资 - 个税
+                    BigDecimal actualOccurrence = new BigDecimal("0");
+                    actualOccurrence = wages.subtract(personalTax).setScale(2, BigDecimal.ROUND_HALF_UP);
+
+                    if (actualOccurrence.compareTo(BigDecimal.ZERO) < 0) {
+                        actualOccurrence = new BigDecimal("0");
+                        salaryManagementHoliday.setActualOccurrence("nghotxDTNyeHgH0mlfbJig==");//实发合计,当个税多于工资时,实发金额默认0
+                    } else {
+                        String actualOccurrenceText = AesEncryptUtil.encrypt(actualOccurrence.toString());
+                        salaryManagementHoliday.setActualOccurrence(actualOccurrenceText);//实发合计
+                    }
+
+                    salaryManagementHoliday.setActionLog(sb.toString());
+
+
+                    if ("马菲羊".equals(orgName)) {
+                        //统计总金额和总个税
+                        salaryMFY = salaryMFY.add(actualOccurrence);
+                        personalTaxMFY = personalTaxMFY.add(personalTax);
+
+                        holidayListMFY.add(salaryManagementHoliday);
+                    } else if ("森语".equals(orgName)) {
+                        //统计总金额和总个税
+                        salaryNBSY = salaryNBSY.add(actualOccurrence);
+                        personalTaxNBSY = personalTaxNBSY.add(personalTax);
+
+                        holidayListNBSY.add(salaryManagementHoliday);
+                    } else if ("正织".equals(orgName)) {
+                        //统计总金额和总个税
+                        salaryZZ = salaryZZ.add(actualOccurrence);
+                        personalTaxZZ = personalTaxZZ.add(personalTax);
+
+                        holidayListZZ.add(salaryManagementHoliday);
+                    } else {
+                        continue;
+                    }
+
+                    //---循环结束
+                }
+
+                if (holidayListMFY.size() > 0) {
+                    salaryManagementMFY.setYearWithMonth(yearWith);
+//                    salaryManagementMFY.setSalary(AesEncryptUtil.encrypt(salaryMFY.toString()));
+//                    salaryManagementMFY.setPersonalTax(AesEncryptUtil.encrypt(personalTaxMFY.toString()));
+
+                    salaryManagementMFY.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryMFY)));
+                    salaryManagementMFY.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxMFY)));
+                }
+                if (holidayListNBSY.size() > 0) {
+                    salaryManagementNBSY.setYearWithMonth(yearWith);
+//                    salaryManagementNBSY.setSalary(AesEncryptUtil.encrypt(salaryNBSY.toString()));
+//                    salaryManagementNBSY.setPersonalTax(AesEncryptUtil.encrypt(personalTaxNBSY.toString()));
+
+                    salaryManagementNBSY.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryNBSY)));
+                    salaryManagementNBSY.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxNBSY)));
+                }
+                if (holidayListZZ.size() > 0) {
+                    salaryManagementZZ.setYearWithMonth(yearWith);
+//                    salaryManagementZZ.setSalary(AesEncryptUtil.encrypt(salaryZZ.toString()));
+//                    salaryManagementZZ.setPersonalTax(AesEncryptUtil.encrypt(personalTaxZZ.toString()));
+
+                    salaryManagementZZ.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryZZ)));
+                    salaryManagementZZ.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxZZ)));
+                }
+
+                this.saveHoliday(yearWith, salaryManagementMFY, salaryManagementNBSY, salaryManagementZZ,
+                        holidayListMFY, holidayListNBSY, holidayListZZ);
+
+                if(salaryMFY.compareTo(new BigDecimal("0")) != 0){
+                    data.put("MFY",salaryManagementMFY.getId());
+                }
+                if(salaryNBSY.compareTo(new BigDecimal("0")) != 0){
+                    data.put("NBSY",salaryManagementNBSY.getId());
+                }
+                if(salaryZZ.compareTo(new BigDecimal("0")) != 0){
+                    data.put("ZZ",salaryManagementZZ.getId());
+                }
+
+            }
+            else if ("加班工资单".equals(type)) {
+
+                if (StringUtils.isBlank(endMonth) || StringUtils.isBlank(beginMonth) || StringUtils.isBlank(yearWithMonth)) {
+                    return Result.error("参数异常endMonth、beginMonth、yearWithMonth");
+                }
+
+                //加班工资单
+                List<SalaryManagementWorkOvertime> workOvertimeListMFY = new ArrayList<>();//马非羊
+                List<SalaryManagementWorkOvertime> workOvertimeListNBSY = new ArrayList<>();//宁波森语
+                List<SalaryManagementWorkOvertime> workOvertimeListZZ = new ArrayList<>();//正织
+
+                List<SalaryAttendanceDetail> list = salaryAttendanceDetailMapper.selectWorkOvertime(beginMonth, endMonth);
+
+                if (list.size() < 1) {
+                    return Result.error("执行失败,没有找到" + beginMonth + "-" + endMonth + "的考勤数据!");
+                }
+
+                String salaryBase = salaryChangeRecordMapper.selectSalary();
+                if (StringUtils.isBlank(salaryBase)) {
+                    return Result.error("计算失败,工资基数异常!");
+                }
+
+                String salaryBaseText = AesEncryptUtil.desEncrypt(salaryBase).trim();
+
+                BigDecimal salaryBaseBig = new BigDecimal(salaryBaseText);
+
+                for (SalaryAttendanceDetail o : list) {
+
+                    StringBuffer sb = new StringBuffer("本次执行(加班工资单):");//记录执行信息
+
+                    String userId = o.getUserId();//用户主键
+                    String orgName = o.getOrgName();//组织
+                    BigDecimal workingHours = o.getWorkingHours() == null ? BigDecimal.ZERO : o.getWorkingHours();//每日工时
+                    BigDecimal attendanceDays = o.getAttendanceDays() == null ? BigDecimal.ZERO : o.getAttendanceDays();//出勤天数
+                    BigDecimal workOvertime = o.getWorkOvertime() == null ? BigDecimal.ZERO : o.getWorkOvertime();//加班时间(分)
+
+                    SalaryManagementWorkOvertime salaryAttendanceWorkOvertime = new SalaryManagementWorkOvertime();//加班明细
+                    salaryAttendanceWorkOvertime.setUserId(userId);
+                    salaryAttendanceWorkOvertime.setCode(o.getCode());
+                    salaryAttendanceWorkOvertime.setName(o.getName());
+                    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);
+                    salaryAttendanceWorkOvertime.setWorkOvertimeCost(workOverTotal);//加班工资
+
+                    String payTaxesText = AesEncryptUtil.encrypt(workOverTotal.toString());
+                    salaryAttendanceWorkOvertime.setPayTaxes(payTaxesText);//应纳税所得额
+
+                    //累计所得额 = 本年度当前人员所有应纳税所得之和
+                    BigDecimal cumulative = new BigDecimal("0");
+                    if (workOverTotal.compareTo(BigDecimal.ZERO) != 0) {
+
+                        List<SalaryManagementDetail> cumulativeList = salaryManagementDetailMapper.selectByUser(userId, withMonth, yearWithMonth);
+                        List<SalaryManagementWorkOvertime> cumulativeOvertimeList = salaryManagementWorkOvertimeMapper.selectByUser(userId, withMonth, yearWithMonth);
+
+                        if (cumulativeList.size() > 0) {
+                            for (SalaryManagementDetail detail : cumulativeList) {
+                                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) {
+                                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);
+                    } else {
+                        sb.append("本次应发加班工资为0,不计入累计所得额中");
+                    }
+
+                    String cumulativeText = AesEncryptUtil.encrypt(cumulative.toString());
+                    salaryAttendanceWorkOvertime.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);
+                    }
+
+                    salaryAttendanceWorkOvertime.setPersonalTax(personalTax);//个税
+
+                    //实发加班工资 = 加班工资 - 个税
+                    BigDecimal actualOccurrence = new BigDecimal("0");
+                    actualOccurrence = workOverTotal.subtract(personalTax).setScale(2, BigDecimal.ROUND_HALF_UP);
+
+                    if (actualOccurrence.compareTo(BigDecimal.ZERO) < 0) {
+                        actualOccurrence = new BigDecimal("0");
+                        salaryAttendanceWorkOvertime.setActualOccurrence("nghotxDTNyeHgH0mlfbJig==");//实发合计,当个税多于工资时,实发金额默认0
+                    } else {
+                        String actualOccurrenceText = AesEncryptUtil.encrypt(actualOccurrence.toString());
+                        salaryAttendanceWorkOvertime.setActualOccurrence(actualOccurrenceText);//实发合计
+                    }
+
+//                    salaryAttendanceWorkOvertime.setDeduction(o.getDeduction());//工资抵扣(无需)
+                    salaryAttendanceWorkOvertime.setYearWithMonth(yearWithMonth);//
+                    salaryAttendanceWorkOvertime.setBeginMonth(beginMonth);//
+                    salaryAttendanceWorkOvertime.setEndMonth(endMonth);//
+
+                    salaryAttendanceWorkOvertime.setActionLog(sb.toString());
+
+                    if ("马菲羊".equals(orgName)) {
+                        //统计总金额和总个税
+                        salaryMFY = salaryMFY.add(actualOccurrence);
+                        personalTaxMFY = personalTaxMFY.add(personalTax);
+
+                        workOvertimeListMFY.add(salaryAttendanceWorkOvertime);
+                    } else if ("森语".equals(orgName)) {
+                        //统计总金额和总个税
+                        salaryNBSY = salaryNBSY.add(actualOccurrence);
+                        personalTaxNBSY = personalTaxNBSY.add(personalTax);
+
+                        workOvertimeListNBSY.add(salaryAttendanceWorkOvertime);
+                    } else if ("正织".equals(orgName)) {
+                        //统计总金额和总个税
+                        salaryZZ = salaryZZ.add(actualOccurrence);
+                        personalTaxZZ = personalTaxZZ.add(personalTax);
+
+                        workOvertimeListZZ.add(salaryAttendanceWorkOvertime);
+                    } else {
+                        continue;
+                    }
+
+                }
+
+
+                if (workOvertimeListMFY.size() > 0) {
+                    salaryManagementMFY.setYearWithMonth(yearWithMonth);
+//                    salaryManagementMFY.setSalary(AesEncryptUtil.encrypt(salaryMFY.toString()));
+//                    salaryManagementMFY.setPersonalTax(AesEncryptUtil.encrypt(personalTaxMFY.toString()));
+
+                    salaryManagementMFY.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryMFY)));
+                    salaryManagementMFY.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxMFY)));
+                }
+                if (workOvertimeListNBSY.size() > 0) {
+                    salaryManagementNBSY.setYearWithMonth(yearWithMonth);
+//                    salaryManagementNBSY.setSalary(AesEncryptUtil.encrypt(salaryNBSY.toString()));
+//                    salaryManagementNBSY.setPersonalTax(AesEncryptUtil.encrypt(personalTaxNBSY.toString()));
+
+                    salaryManagementNBSY.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryNBSY)));
+                    salaryManagementNBSY.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxNBSY)));
+                }
+                if (workOvertimeListZZ.size() > 0) {
+                    salaryManagementZZ.setYearWithMonth(yearWithMonth);
+//                    salaryManagementZZ.setSalary(AesEncryptUtil.encrypt(salaryZZ.toString()));
+//                    salaryManagementZZ.setPersonalTax(AesEncryptUtil.encrypt(personalTaxZZ.toString()));
+
+                    salaryManagementZZ.setSalary(AesEncryptUtil.encrypt(String.format("%.2f", salaryZZ)));
+                    salaryManagementZZ.setPersonalTax(AesEncryptUtil.encrypt(String.format("%.2f", personalTaxZZ)));
+                }
+
+                this.saveWorkOvertime(yearWithMonth, salaryManagementMFY, salaryManagementNBSY, salaryManagementZZ,
+                        workOvertimeListMFY, workOvertimeListNBSY, workOvertimeListZZ);
+
+                if(salaryMFY.compareTo(new BigDecimal("0")) != 0){
+                    data.put("MFY",salaryManagementMFY.getId());
+                }
+                if(salaryNBSY.compareTo(new BigDecimal("0")) != 0){
+                    data.put("NBSY",salaryManagementNBSY.getId());
+                }
+                if(salaryZZ.compareTo(new BigDecimal("0")) != 0){
+                    data.put("ZZ",salaryManagementZZ.getId());
+                }
+
+
+            }
+            else {
+                return Result.error("type参数异常");
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Result.error("计算失败,请检查数据是否完整" + e.getMessage());
+        }
+
+        if (salaryMFY.compareTo(new BigDecimal("0")) == 0 && salaryNBSY.compareTo(new BigDecimal("0")) == 0
+                && salaryZZ.compareTo(new BigDecimal("0")) == 0) {
+
+            return Result.ok("执行结束:本次执行金额为0,不生成工资单!");
+        }
+
+        return Result.okAndMap("执行成功",data);
+    }
+
+
+    /**
+     * 保存数据 年休工资单
+     *
+     * @param yearWith
+     * @param salaryManagementMFY
+     * @param salaryManagementNBSY
+     * @param salaryManagementZZ
+     */
+    public void saveHoliday(String yearWith,
+                            SalaryManagement salaryManagementMFY,
+                            SalaryManagement salaryManagementNBSY,
+                            SalaryManagement salaryManagementZZ,
+                            List<SalaryManagementHoliday> holidayListMFY,
+                            List<SalaryManagementHoliday> holidayListNBSY,
+                            List<SalaryManagementHoliday> holidayListZZ) {
+
+
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        Date date = new Date();
+
+        Integer ver = salaryManagementMapper.selectVersion("年休工资单", yearWith);
+
+        if (ver == null) {
+            ver = 1;
+        } else {
+            ver = ver + 1;
+        }
+
+
+        if (holidayListMFY != null && holidayListMFY.size() > 0) {
+
+            salaryManagementMFY.setId(IdUtil.simpleUUID());
+            salaryManagementMFY.setCreateBy(sysUser.getUsername());
+            salaryManagementMFY.setCreateTime(date);
+            salaryManagementMFY.setGenerationTime(date);
+            salaryManagementMFY.setOrgName("马菲羊");
+            salaryManagementMFY.setType("年休工资单");
+            salaryManagementMFY.setVersion(String.valueOf(ver));
+            salaryManagementMFY.setNumberPeople(holidayListMFY.size());
+
+            salaryManagementMapper.insert(salaryManagementMFY);
+
+            for (SalaryManagementHoliday o : holidayListMFY) {
+                o.setHeadId(salaryManagementMFY.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementHolidayMapper.insert(o);
+            }
+
+        }
+
+        if (holidayListNBSY != null && holidayListNBSY.size() > 0) {
+
+            salaryManagementNBSY.setId(IdUtil.simpleUUID());
+            salaryManagementNBSY.setCreateBy(sysUser.getUsername());
+            salaryManagementNBSY.setCreateTime(date);
+            salaryManagementNBSY.setGenerationTime(date);
+            salaryManagementNBSY.setOrgName("森语");
+            salaryManagementNBSY.setType("年休工资单");
+            salaryManagementNBSY.setVersion(String.valueOf(ver));
+            salaryManagementNBSY.setNumberPeople(holidayListNBSY.size());
+
+            salaryManagementMapper.insert(salaryManagementNBSY);
+
+            for (SalaryManagementHoliday o : holidayListNBSY) {
+                o.setHeadId(salaryManagementNBSY.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementHolidayMapper.insert(o);
+            }
+
+        }
+
+        if (holidayListZZ != null && holidayListZZ.size() > 0) {
+
+            salaryManagementZZ.setId(IdUtil.simpleUUID());
+            salaryManagementZZ.setCreateBy(sysUser.getUsername());
+            salaryManagementZZ.setCreateTime(date);
+            salaryManagementZZ.setGenerationTime(date);
+            salaryManagementZZ.setOrgName("正织");
+            salaryManagementZZ.setType("年休工资单");
+            salaryManagementZZ.setVersion(String.valueOf(ver));
+            salaryManagementZZ.setNumberPeople(holidayListZZ.size());
+
+            salaryManagementMapper.insert(salaryManagementZZ);
+
+            for (SalaryManagementHoliday o : holidayListZZ) {
+                o.setHeadId(salaryManagementZZ.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementHolidayMapper.insert(o);
+            }
+
+        }
+
+
+        salaryManagementMapper.deleteVersion("年休工资单", yearWith, ver);
+        salaryManagementMapper.deleteVersionHoliday(yearWith, ver);
+
+
+    }
+
+    /**
+     * 保存数据 加班工资单
+     *
+     * @param yearWithMonth
+     * @param salaryManagementMFY
+     * @param salaryManagementNBSY
+     * @param salaryManagementZZ
+     * @param workOvertimeListMFY
+     * @param workOvertimeListNBSY
+     * @param workOvertimeListZZ
+     */
+    public void saveWorkOvertime(String yearWithMonth,
+                                 SalaryManagement salaryManagementMFY,
+                                 SalaryManagement salaryManagementNBSY,
+                                 SalaryManagement salaryManagementZZ,
+                                 List<SalaryManagementWorkOvertime> workOvertimeListMFY,
+                                 List<SalaryManagementWorkOvertime> workOvertimeListNBSY,
+                                 List<SalaryManagementWorkOvertime> workOvertimeListZZ) {
+
+
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        Date date = new Date();
+
+        Integer ver = salaryManagementMapper.selectVersion("加班工资单", yearWithMonth);
+
+        if (ver == null) {
+            ver = 1;
+        } else {
+            ver = ver + 1;
+        }
+
+
+        if (workOvertimeListMFY != null && workOvertimeListMFY.size() > 0) {
+
+            salaryManagementMFY.setId(IdUtil.simpleUUID());
+            salaryManagementMFY.setCreateBy(sysUser.getUsername());
+            salaryManagementMFY.setCreateTime(date);
+            salaryManagementMFY.setGenerationTime(date);
+            salaryManagementMFY.setOrgName("马菲羊");
+            salaryManagementMFY.setType("加班工资单");
+            salaryManagementMFY.setVersion(String.valueOf(ver));
+            salaryManagementMFY.setNumberPeople(workOvertimeListMFY.size());
+
+            salaryManagementMapper.insert(salaryManagementMFY);
+
+            for (SalaryManagementWorkOvertime o : workOvertimeListMFY) {
+                o.setHeadId(salaryManagementMFY.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementWorkOvertimeMapper.insert(o);
+            }
+
+        }
+
+        if (workOvertimeListNBSY != null && workOvertimeListNBSY.size() > 0) {
+
+            salaryManagementNBSY.setId(IdUtil.simpleUUID());
+            salaryManagementNBSY.setCreateBy(sysUser.getUsername());
+            salaryManagementNBSY.setCreateTime(date);
+            salaryManagementNBSY.setGenerationTime(date);
+            salaryManagementNBSY.setOrgName("森语");
+            salaryManagementNBSY.setType("加班工资单");
+            salaryManagementNBSY.setVersion(String.valueOf(ver));
+            salaryManagementNBSY.setNumberPeople(workOvertimeListNBSY.size());
+
+            salaryManagementMapper.insert(salaryManagementNBSY);
+
+            for (SalaryManagementWorkOvertime o : workOvertimeListNBSY) {
+                o.setHeadId(salaryManagementNBSY.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementWorkOvertimeMapper.insert(o);
+            }
+
+        }
+
+        if (workOvertimeListZZ != null && workOvertimeListZZ.size() > 0) {
+
+            salaryManagementZZ.setId(IdUtil.simpleUUID());
+            salaryManagementZZ.setCreateBy(sysUser.getUsername());
+            salaryManagementZZ.setCreateTime(date);
+            salaryManagementZZ.setGenerationTime(date);
+            salaryManagementZZ.setOrgName("正织");
+            salaryManagementZZ.setType("加班工资单");
+            salaryManagementZZ.setVersion(String.valueOf(ver));
+            salaryManagementZZ.setNumberPeople(workOvertimeListZZ.size());
+
+            salaryManagementMapper.insert(salaryManagementZZ);
+
+            for (SalaryManagementWorkOvertime o : workOvertimeListZZ) {
+                o.setHeadId(salaryManagementZZ.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementWorkOvertimeMapper.insert(o);
+            }
+
+        }
+
+
+        salaryManagementMapper.deleteVersion("加班工资单", yearWithMonth, ver);
+        salaryManagementMapper.deleteVersionOvertime(yearWithMonth, ver);
+
+
+    }
+
+    /**
+     * 保存数据 月度工资单
+     *
+     * @param salaryManagementMFY
+     * @param salaryManagementNBSY
+     * @param salaryManagementZZ
+     * @param salaryAttendanceDetailListMFY
+     * @param salaryAttendanceDetailListNBSY
+     * @param salaryAttendanceDetailListZZ
+     */
+    public void saveAll(String yearWithMonth, SalaryManagement salaryManagementMFY, SalaryManagement salaryManagementNBSY, SalaryManagement salaryManagementZZ,
+                        List<SalaryManagementDetail> salaryAttendanceDetailListMFY,
+                        List<SalaryManagementDetail> salaryAttendanceDetailListNBSY,
+                        List<SalaryManagementDetail> salaryAttendanceDetailListZZ
+    ) {
+
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        Date date = new Date();
+
+        Integer ver = salaryManagementMapper.selectVersion("月度工资单", 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("月度工资单");
+            salaryManagementMFY.setVersion(String.valueOf(ver));
+            salaryManagementMFY.setNumberPeople(salaryAttendanceDetailListMFY.size());
+
+            salaryManagementMapper.insert(salaryManagementMFY);
+
+            for (SalaryManagementDetail o : salaryAttendanceDetailListMFY) {
+                o.setHeadId(salaryManagementMFY.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementDetailMapper.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("月度工资单");
+            salaryManagementNBSY.setVersion(String.valueOf(ver));
+            salaryManagementNBSY.setNumberPeople(salaryAttendanceDetailListNBSY.size());
+
+            salaryManagementMapper.insert(salaryManagementNBSY);
+
+            for (SalaryManagementDetail o : salaryAttendanceDetailListNBSY) {
+                o.setHeadId(salaryManagementNBSY.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementDetailMapper.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("月度工资单");
+            salaryManagementZZ.setVersion(String.valueOf(ver));
+            salaryManagementZZ.setNumberPeople(salaryAttendanceDetailListZZ.size());
+
+            salaryManagementMapper.insert(salaryManagementZZ);
+
+            for (SalaryManagementDetail o : salaryAttendanceDetailListZZ) {
+                o.setHeadId(salaryManagementZZ.getId());
+                o.setId(IdUtil.simpleUUID());
+                o.setCreateBy(sysUser.getUsername());
+                o.setCreateTime(date);
+                o.setVersion(String.valueOf(ver));
+                salaryManagementDetailMapper.insert(o);
+            }
+
+        }
+
+        salaryManagementMapper.deleteVersion("月度工资单", yearWithMonth, ver);
+        salaryManagementMapper.deleteVersionDetail(yearWithMonth, ver);
+
+
+    }
+
+    public static void main(String[] args) throws Exception {
+        String aa = "2024-02";
+        System.out.println(aa.substring(0, 4));
+//        SalaryAttendanceDetail o = new SalaryAttendanceDetail();
+//        BigDecimal aa = o.getDeduction() == null ? BigDecimal.ZERO:o.getDeduction();
+//        String wages = o.getWages() == null || o.getWages() == "" ? "nghotxDTNyeHgH0mlfbJig==":o.getWages();//基本薪资
+//
+//        System.out.println(wages);
+//        BigDecimal bigWages = new BigDecimal(AesEncryptUtil.desEncrypt(wages).trim());//基本薪资 (明文)
+//        System.out.println(bigWages);
+//        BigDecimal bg = new BigDecimal("1");
+//        BigDecimal bg1 = new BigDecimal("1");
+//        System.out.println(aa.add(bg1));
+//        System.out.println(bg);
+//        System.out.println(bg1);
+
+
+//        BigDecimal bigWages = new BigDecimal("10000");//基本薪资 (明文)
+//        BigDecimal personalLeave = new BigDecimal("300");//事假时间(分)
+//        BigDecimal workingHours = new BigDecimal("8");//每日工时
+//        BigDecimal attendanceDays = new BigDecimal("22");//出勤天数
+//
+//        System.out.println(personalLeave.divide(new BigDecimal("60")));
+//        System.out.println(workingHours.multiply(attendanceDays));
+//
+//        System.out.println(personalLeave.divide(new BigDecimal("60"),2,BigDecimal.ROUND_HALF_UP)
+//                .divide(workingHours.multiply(attendanceDays),2,BigDecimal.ROUND_HALF_UP).multiply(bigWages));
+
+        //事假扣费 = 事假(转换成小时数)/(每日工时*天数)*基本薪资
+//        BigDecimal personalCost = new BigDecimal("0");
+//        personalCost = personalLeave.divide(new BigDecimal("60")).divide(workingHours.multiply(attendanceDays)).multiply(bigWages);
+//
+
+//        String aa = "2024-03";
+//
+//        System.out.println(aa.substring(0,5));
+        //个税 ===========================
+
+//        BigDecimal cumulative = new BigDecimal("994005");
+//        BigDecimal personalTax = 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");
+//
+//        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);
+//            System.out.println(11);
+//        }
+//        if(top660000.compareTo(cumulative) != -1 && cumulative.compareTo(top420000) == 1){ //top144000 >= cumulative && cumulative > top36000
+//            personalTax = cumulative.multiply(Tax03);
+//            System.out.println(22);
+//        }
+//        if(top960000.compareTo(cumulative) != -1 && cumulative.compareTo(top660000) == 1){ //top144000 >= cumulative && cumulative > top36000
+//            personalTax = cumulative.multiply(Tax035);
+//            System.out.println(33);
+//        }
+//        if(cumulative.compareTo(top960000) == 1){ //cumulative > top960000
+//            personalTax = cumulative.multiply(Tax045);
+//            System.out.println(5555);
+//        }
+
+//        System.out.println(personalTax);
+//        BigDecimal bigDecimal = new BigDecimal("0.000");
+//        boolean isGreaterThanZero = bigDecimal.compareTo(BigDecimal.ZERO) < 0;
+//        System.out.println("Is the BigDecimal greater than zero? " + isGreaterThanZero);
+    }
+
+}

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

@@ -0,0 +1,27 @@
+package org.jeecg.modules.salary.service.impl;
+
+import org.jeecg.modules.salary.entity.SalaryManagementWorkOvertime;
+import org.jeecg.modules.salary.mapper.SalaryManagementWorkOvertimeMapper;
+import org.jeecg.modules.salary.service.ISalaryManagementWorkOvertimeService;
+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-04-16
+ * @Version: V1.0
+ */
+@Service
+public class SalaryManagementWorkOvertimeServiceImpl extends ServiceImpl<SalaryManagementWorkOvertimeMapper, SalaryManagementWorkOvertime> implements ISalaryManagementWorkOvertimeService {
+	
+	@Autowired
+	private SalaryManagementWorkOvertimeMapper salaryManagementWorkOvertimeMapper;
+	
+	@Override
+	public List<SalaryManagementWorkOvertime> selectByMainId(String mainId,String name) {
+		return salaryManagementWorkOvertimeMapper.selectByMainId(mainId,name);
+	}
+}

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

@@ -0,0 +1,22 @@
+package org.jeecg.modules.salary.vo;
+
+import lombok.Data;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+@Data
+public class ExcelDemo {
+
+    /**员工编号*/
+    @Excel(name = "编号", width = 15)
+    private String code;
+    /**员工姓名*/
+    @Excel(name = "姓名", width = 15)
+    private String name;
+    /**工资卡号*/
+    @Excel(name = "工资卡号", width = 30)
+    private String cardNo;
+    /**工资*/
+    @Excel(name = "员工工资", width = 15)
+    private String wages;
+}
+

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

@@ -0,0 +1,68 @@
+package org.jeecg.modules.salary.vo;
+
+import java.util.List;
+import org.jeecg.modules.salary.entity.SalaryAttendance;
+import org.jeecg.modules.salary.entity.SalaryAttendanceDetail;
+import lombok.Data;
+import org.jeecg.modules.salary.entity.SalaryAttendanceHoliday;
+import org.jeecg.modules.salary.entity.SalaryAttendanceWorkOvertime;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecgframework.poi.excel.annotation.ExcelCollection;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.util.Date;
+
+/**
+ * @Description: 考勤管理主表
+ * @Author: jeecg-boot
+ * @Date:   2024-04-10
+ * @Version: V1.0
+ */
+@Data
+public class SalaryAttendancePage {
+	
+	/**主键*/
+	private java.lang.String id;
+	/**创建人登录名称*/
+  	@Excel(name = "创建人登录名称", width = 15)
+	private java.lang.String createBy;
+	/**创建日期*/
+  	@Excel(name = "创建日期", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+  	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private java.util.Date createTime;
+	/**更新人登录名称*/
+  	@Excel(name = "更新人登录名称", width = 15)
+	private java.lang.String updateBy;
+	/**更新日期*/
+  	@Excel(name = "更新日期", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+  	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private java.util.Date updateTime;
+	/**删除标记*/
+  	@Excel(name = "删除标记", width = 15)
+	private java.lang.String delFlag;
+	/**所属部门*/
+  	@Excel(name = "所属部门", width = 15)
+	private java.lang.String sysOrgCode;
+	/**薪资年月*/
+  	@Excel(name = "薪资年月", width = 15)
+	private java.lang.String yearWithMonth;
+	/**名称*/
+  	@Excel(name = "名称", width = 15)
+	private java.lang.String name;
+	/**版本*/
+  	@Excel(name = "版本", width = 15)
+	private java.lang.String version;
+	/**备注*/
+  	@Excel(name = "备注", width = 15)
+	private java.lang.String remarks;
+	
+	@ExcelCollection(name="考勤管理子表-考勤明细")
+	private List<SalaryAttendanceDetail> salaryAttendanceDetailList;
+	@ExcelCollection(name="考勤管理子表-加班明细")
+	private List<SalaryAttendanceWorkOvertime> salaryAttendanceWorkOvertimeList;
+	@ExcelCollection(name="考勤管理子表-假期明细")
+	private List<SalaryAttendanceHoliday> salaryAttendanceHolidayList;
+
+}

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

@@ -0,0 +1,83 @@
+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 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;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.util.Date;
+
+/**
+ * @Description: 薪资管理主表
+ * @Author: jeecg-boot
+ * @Date:   2024-04-16
+ * @Version: V1.0
+ */
+@Data
+public class SalaryManagementPage {
+	
+	/**主键*/
+	private String id;
+	/**创建人登录名称*/
+  	@Excel(name = "创建人登录名称", width = 15)
+	private String createBy;
+	/**创建日期*/
+  	@Excel(name = "创建日期", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+  	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+	/**更新人登录名称*/
+  	@Excel(name = "更新人登录名称", width = 15)
+	private String updateBy;
+	/**更新日期*/
+  	@Excel(name = "更新日期", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+  	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+	/**删除标记*/
+  	@Excel(name = "删除标记", width = 15)
+	private String delFlag;
+	/**所属部门*/
+  	@Excel(name = "所属部门", width = 15)
+	private String sysOrgCode;
+	/**类型*/
+  	@Excel(name = "类型", width = 15)
+	private String type;
+	/**薪资年月*/
+  	@Excel(name = "薪资年月", width = 15)
+	private String yearWithMonth;
+	/**组织*/
+  	@Excel(name = "组织", width = 15)
+	private String orgName;
+	/**版本*/
+  	@Excel(name = "版本", width = 15)
+	private String version;
+	/**发放人数*/
+  	@Excel(name = "发放人数", width = 15)
+	private Integer numberPeople;
+	/**发放薪水*/
+  	@Excel(name = "发放薪水", width = 15)
+	private String salary;
+	/**个税*/
+  	@Excel(name = "个税", width = 15)
+	private String personalTax;
+	/**生成时间*/
+  	@Excel(name = "生成时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+  	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private Date generationTime;
+	
+	@ExcelCollection(name="薪资管理子表-月度工资明细")
+	private List<SalaryManagementDetail> salaryManagementDetailList;
+
+	@ExcelCollection(name="薪资管理子表-加班工资单")
+	private List<SalaryManagementWorkOvertime> salaryManagementWorkOvertimeList;
+
+	@ExcelCollection(name="薪资管理子表-年休工资单")
+	private List<SalaryManagementHoliday> salaryManagementHolidayList;
+}

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

@@ -23,14 +23,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @since 2018-12-28
  */
 public interface SysDictMapper extends BaseMapper<SysDict> {
-	
+
+	public int queryDictCountBy(@Param("code") String code,@Param("itemText") String itemText,@Param("itemValue") String itemValue);
 	/**
 	  *  重复检查SQL
 	 * @return
 	 */
 	public Long duplicateCheckCountSql(DuplicateCheckVo duplicateCheckVo);
 	public Long duplicateCheckCountSqlNoDataId(DuplicateCheckVo duplicateCheckVo);
-	
+
 	public List<DictModel> queryDictItemsByCode(@Param("code") String code);
 	public List<DictModel> queryTableDictItemsByCode(@Param("table") String table,@Param("text") String text,@Param("code") String code);
 	public List<DictModel> queryTableDictItemsByCodeAndFilter(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("filterSql") String filterSql);

+ 8 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml

@@ -16,6 +16,14 @@
 		   and s.item_value = #{key}
 	</select>
 
+	<!-- 查询字典是否包含此值 -->
+	<select id="queryDictCountBy" parameterType="String"  resultType="int">
+		select count(1) from sys_dict_item s
+		where s.dict_id = (select id from sys_dict where dict_code = #{code})
+		and ((s.item_text = #{itemText} and  (s.item_value =#{itemValue} or s.item_value = 'all_table'))
+		or (s.item_value = #{itemValue} and  (s.item_text =#{itemText} or s.item_text = 'all_user')))
+	</select>
+
 
 	<!--通过查询指定table的 text code 获取字典-->
 	<select id="queryTableDictItemsByCode" parameterType="String"  resultType="org.jeecg.common.system.vo.DictModel">

+ 2 - 0
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysDictService.java

@@ -20,6 +20,8 @@ import org.jeecg.modules.system.model.TreeSelectModel;
  */
 public interface ISysDictService extends IService<SysDict> {
 
+	public int queryDictCountBy(String code, String itemText,  String itemValue);
+
     public List<DictModel> queryDictItemsByCode(String code);
 
     List<DictModel> queryTableDictItemsByCode(String table, String text, String code);

+ 2 - 1
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java

@@ -178,7 +178,8 @@ public interface ISysUserService extends IService<SysUser> {
 	 * @return 权限集合
 	 */
 	Set<String> getUserPermissionsSet(String username);
-	
+	Set<String> getUserUrlSet(String username);
+
 	/**
 	 * 根据用户名设置部门ID
 	 * @param username

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

@@ -211,6 +211,11 @@ public class SysBaseApiImpl implements ISysBaseAPI {
 		return sysDictService.queryDictItemsByCode(code);
 	}
 
+	@Override
+	public int queryDictCountBy(String code, String itemText,  String itemValue){
+		return sysDictService.queryDictCountBy(code,itemText,itemValue);
+	}
+
 	@Override
 	public List<DictModel> queryTableDictItemsByCode(String table, String text, String code) {
 		return sysDictService.queryTableDictItemsByCode(table, text, code);

+ 5 - 1
jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java

@@ -5,6 +5,7 @@ import java.util.List;
 import java.util.Map;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.apache.ibatis.annotations.Param;
 import org.jeecg.common.constant.CacheConstant;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.system.vo.DictModel;
@@ -40,7 +41,10 @@ public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDict> impl
     @Autowired
     private SysDictItemMapper sysDictItemMapper;
 
-
+	@Override
+	public int queryDictCountBy(String code, String itemText,  String itemValue){
+		return sysDictMapper.queryDictCountBy(code,itemText,itemValue);
+	}
 	/**
 	 * tableName
 	 * @param tableName

+ 2 - 2
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/jeecg_database.properties

@@ -1,9 +1,9 @@
 #mysql
 diver_name=com.mysql.jdbc.Driver
-url=jdbc:mysql://localhost:3306/cd_work_flow_dev?useUnicode=true&characterEncoding=UTF-8
+url=jdbc:mysql://localhost:3306/cd_work_flow_dev2?useUnicode=true&characterEncoding=UTF-8
 username=root
 password=root
-database_name=cd_work_flow_dev
+database_name=cd_work_flow_dev2
 #diver_name=com.mysql.jdbc.Driver
 #url=jdbc:mysql://127.0.0.1:3306/cd_project_management?useUnicode=true&characterEncoding=UTF-8
 #username=root