|
|
@@ -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);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|