From f688d1656a6542f1756f62e2f10a11ff4489674a Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期五, 12 六月 2026 15:28:54 +0800
Subject: [PATCH] 修改社保工资计算

---
 src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java |  246 +++++++++++++++++++++++++++---------------------
 1 files changed, 139 insertions(+), 107 deletions(-)

diff --git a/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
index 3043aad..be8abe5 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
@@ -2,35 +2,34 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.production.dto.UserAccountDto;
-import com.ruoyi.production.dto.UserProductionAccountingDto;
+import com.ruoyi.production.bean.dto.UserAccountDto;
+import com.ruoyi.production.bean.dto.UserProductionAccountingDto;
 import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
-import com.ruoyi.project.system.domain.SysUserDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
-import com.ruoyi.project.system.mapper.SysUserDeptMapper;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.staff.controller.TaxCalculator;
-import com.ruoyi.staff.dto.StaffOnJobDto;
+import com.ruoyi.staff.mapper.SchemeApplicableStaffMapper;
 import com.ruoyi.staff.mapper.SchemeInsuranceDetailMapper;
 import com.ruoyi.staff.mapper.StaffOnJobMapper;
 import com.ruoyi.staff.pojo.SchemeApplicableStaff;
-import com.ruoyi.staff.mapper.SchemeApplicableStaffMapper;
 import com.ruoyi.staff.pojo.SchemeInsuranceDetail;
 import com.ruoyi.staff.pojo.StaffOnJob;
-import com.ruoyi.staff.service.IStaffOnJobService;
 import com.ruoyi.staff.service.SchemeApplicableStaffService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import jakarta.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.*;
+import java.math.RoundingMode;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -42,28 +41,15 @@
  * @since 2026-03-05 11:50:17
  */
 @Service
+@RequiredArgsConstructor
 public class SchemeApplicableStaffServiceImpl extends ServiceImpl<SchemeApplicableStaffMapper, SchemeApplicableStaff> implements SchemeApplicableStaffService {
 
-    @Autowired
-    private SchemeApplicableStaffMapper schemeApplicableStaffMapper;
-
-    @Autowired
-    private SchemeInsuranceDetailMapper schemeInsuranceDetailMapper;
-
-    @Autowired
-    private SysUserDeptMapper sysUserDeptMapper;
-
-    @Autowired
-    private SysUserMapper sysUserMapper;
-
-    @Autowired
-    private SysDeptMapper sysDeptMapper;
-
-    @Autowired
-    private StaffOnJobMapper staffOnJobMapper;
-
-    @Autowired
-    private SalesLedgerProductionAccountingService salesLedgerProductionAccountingService;
+    private final SchemeApplicableStaffMapper schemeApplicableStaffMapper;
+    private final SchemeInsuranceDetailMapper schemeInsuranceDetailMapper;
+    private final SysUserMapper sysUserMapper;
+    private final SysDeptMapper sysDeptMapper;
+    private final StaffOnJobMapper staffOnJobMapper;
+    private final SalesLedgerProductionAccountingService salesLedgerProductionAccountingService;
 
 
     @Override
@@ -74,6 +60,7 @@
                 schemeApplicableStaffLambdaQueryWrapper.like(SchemeApplicableStaff::getTitle, schemeApplicableStaff.getTitle());
             }
         }
+        schemeApplicableStaffLambdaQueryWrapper.orderByDesc(SchemeApplicableStaff::getId);
         Page<SchemeApplicableStaff> page1 = schemeApplicableStaffMapper.selectPage(page, schemeApplicableStaffLambdaQueryWrapper);
         List<Long> collect = page1.getRecords().stream().map(SchemeApplicableStaff::getId).collect(Collectors.toList());
         if(CollectionUtils.isEmpty(collect)){
@@ -167,100 +154,85 @@
      * @param id
      */
     public void calculateByEmployeeId(Integer id,Map<String, Object> map,String date) {
-        // 1. 鍏ュ弬鏍¢獙
-        if (id == null) {
-            return; // 鎴栬繑鍥炵┖鍒楄〃锛屾牴鎹笟鍔¢渶姹傝皟鏁�
+        if (id == null || map == null) {
+            return;
         }
         Long staffId = id.longValue();
-        // 绀句繚閲戦
-        BigDecimal socialPersonal = new BigDecimal("0.00");
-        // 鍏Н閲戦噾棰�
-        BigDecimal fundPersonal = new BigDecimal("0.00");
-        // 鍩烘湰宸ヨ祫
-        BigDecimal basicSalary = new BigDecimal("0.00");
-        map.put("fundPersonal", fundPersonal); // 鍏Н閲�
-        map.put("socialPersonal", socialPersonal); // 绀句繚閲戦
-        map.put("basicSalary", basicSalary); // 鍩烘湰宸ヨ祫
-        // 涓◣閲戦
-        BigDecimal salaryTax = new BigDecimal("0.00");
-        map.put("salaryTax", salaryTax);
-        // 璁′欢宸ヨ祫
-        BigDecimal pieceSalary = new BigDecimal("0.00");
-        map.put("pieceSalary", pieceSalary);
-        // 璁℃椂宸ヨ祫
-        BigDecimal hourlySalary = new BigDecimal("0.00");
-        map.put("hourlySalary", hourlySalary);
-        // 鍏朵粬鏀跺叆
-        BigDecimal otherIncome = new BigDecimal("0.00");
-        map.put("otherIncome", otherIncome);
-        // 鍏朵粬鏀嚭
-        BigDecimal otherDeduct = new BigDecimal("0.00");
-        map.put("otherDeduct", otherDeduct);
-        // 搴斿彂宸ヨ祫
-        BigDecimal grossSalary = new BigDecimal("0.00");
-        map.put("grossSalary", grossSalary);
-        // 搴旀墸宸ヨ祫
-        BigDecimal deductSalary = new BigDecimal("0.00");
-        map.put("deductSalary", deductSalary);
-        // 瀹炲彂宸ヨ祫
-        BigDecimal netSalary = new BigDecimal("0.00");
-        map.put("netSalary", netSalary);
-        // 璋冪敤鍩烘湰宸ヨ祫
         StaffOnJob staffOnJobDto = staffOnJobMapper.selectById(staffId);
         if(staffOnJobDto == null){
             return;
         }
-        basicSalary = staffOnJobDto.getBasicSalary();
-        map.put("basicSalary", basicSalary);
-        // 搴斿彂宸ヨ祫
-        map.put("grossSalary", basicSalary);
-        // 涓◣閲戦锛堟棤绀句繚鐗堬級
-        BigDecimal bigDecimal = TaxCalculator.calculateMonthlyTax(basicSalary, socialPersonal, fundPersonal);
-        map.put("salaryTax", bigDecimal);
-        // 璁℃椂宸ヨ祫 璁′欢宸ヨ祫
+        BigDecimal basicSalary = hasValue(map, "basicSalary")
+                ? normalizeMoney(getBigDecimal(map, "basicSalary"))
+                : normalizeMoney(staffOnJobDto.getBasicSalary());
+        BigDecimal otherIncome = normalizeMoney(getBigDecimal(map, "otherIncome"));
+        BigDecimal otherDeduct = normalizeMoney(getBigDecimal(map, "otherDeduct"));
+        BigDecimal socialSupplementAmount = hasValue(map, "socialSupplementAmount")
+                ? normalizeMoney(getBigDecimal(map, "socialSupplementAmount"))
+                : calculateLatestDeptSocialSupplementAmount(staffOnJobDto);
+        BigDecimal pieceSalary = normalizeMoney(getBigDecimal(map, "pieceSalary"));
+        BigDecimal hourlySalary = normalizeMoney(getBigDecimal(map, "hourlySalary"));
+        BigDecimal socialPersonal = normalizeMoney(getBigDecimal(map, "socialPersonal"));
+        BigDecimal fundPersonal = normalizeMoney(getBigDecimal(map, "fundPersonal"));
+
         UserProductionAccountingDto userProductionAccountingDto = new UserProductionAccountingDto();
         userProductionAccountingDto.setUserId(getUidByStaffId(staffId));
         userProductionAccountingDto.setDate(date);
         UserAccountDto byUserId = salesLedgerProductionAccountingService.getByUserId(userProductionAccountingDto);
         if(byUserId != null){
-            map.put("pieceSalary", byUserId.getAccountBalance());
-            map.put("hourlySalary", byUserId.getAccount());
-            // 搴斿彂 瀹炲彂澧炲姞
-            grossSalary = grossSalary.add(byUserId.getAccountBalance()).add(byUserId.getAccount());
-            map.put("grossSalary", grossSalary);
-            netSalary = netSalary.add(byUserId.getAccountBalance()).add(byUserId.getAccount());
-            map.put("netSalary", netSalary);
+            pieceSalary = normalizeMoney(byUserId.getAccountBalance());
+            hourlySalary = normalizeMoney(byUserId.getAccount());
         }
-        // 2. 鏌ヨ璇ヤ汉鍛樺搴旂殑绀句繚鏂规
+
+        // 鏌ヨ璇ヤ汉鍛樺搴旂殑绀句繚鏂规
         List<SchemeApplicableStaff> schemeList = schemeApplicableStaffMapper.selectSchemeByStaffId(staffId);
-        if (CollectionUtils.isEmpty(schemeList)) {
-            return; // 鏃犲尮閰嶆柟妗堬紝杩斿洖绌哄垪琛�
-        }
-        // 3. 涓烘瘡涓柟妗堝叧鑱旀槑缁嗗垪琛�
-        for (SchemeApplicableStaff scheme : schemeList) {
-            List<SchemeInsuranceDetail> detailList = schemeApplicableStaffMapper.selectDetailBySchemeId(scheme.getId());
-            // 鏍规嵁鏄庣粏鍒楄〃璁$畻绀句繚缂磋垂閲戦
-            if(CollectionUtils.isEmpty(detailList)){
-                continue;
-            }
-            for (SchemeInsuranceDetail detail : detailList) {
-                if("鍏Н閲�".equals(detail.getInsuranceType())){
-                    fundPersonal = fundPersonal.add(calculateByEmployeeIdType(detail.getInsuranceType(),fundPersonal, staffOnJobDto, detail));
-                }else{
-                    socialPersonal = socialPersonal.add(calculateByEmployeeIdType(detail.getInsuranceType(),socialPersonal, staffOnJobDto, detail));
+        if (!CollectionUtils.isEmpty(schemeList)) {
+            for (SchemeApplicableStaff scheme : schemeList) {
+                List<SchemeInsuranceDetail> detailList = schemeApplicableStaffMapper.selectDetailBySchemeId(scheme.getId());
+                if(CollectionUtils.isEmpty(detailList)){
+                    continue;
+                }
+                for (SchemeInsuranceDetail detail : detailList) {
+                    if("鍏Н閲�".equals(detail.getInsuranceType())){
+                        fundPersonal = fundPersonal.add(calculateByEmployeeIdType(detail.getInsuranceType(), fundPersonal, staffOnJobDto, detail));
+                    }else{
+                        socialPersonal = socialPersonal.add(calculateByEmployeeIdType(detail.getInsuranceType(), socialPersonal, staffOnJobDto, detail));
+                    }
                 }
             }
         }
+
+        BigDecimal grossSalary = basicSalary.add(pieceSalary).add(hourlySalary).add(otherIncome);
+        BigDecimal salaryTax = TaxCalculator.calculateMonthlyTax(
+                grossSalary,
+                socialPersonal.add(socialSupplementAmount),
+                fundPersonal
+        );
+        BigDecimal deductSalary = salaryTax
+                .add(fundPersonal)
+                .add(socialPersonal)
+                .add(socialSupplementAmount)
+                .add(otherDeduct);
+        BigDecimal netSalary = grossSalary.subtract(deductSalary);
+
+        if (!hasText(map, "staffName")) {
+            map.put("staffName", staffOnJobDto.getStaffName());
+        }
+        if (!hasText(map, "nation")) {
+            map.put("nation", staffOnJobDto.getNation());
+        }
+        map.put("basicSalary", basicSalary);
+        map.put("pieceSalary", pieceSalary);
+        map.put("hourlySalary", hourlySalary);
+        map.put("otherIncome", otherIncome);
         map.put("socialPersonal", socialPersonal);
         map.put("fundPersonal", fundPersonal);
-        // 涓◣閲戦锛堢ぞ淇濈増锛�
-        bigDecimal = TaxCalculator.calculateMonthlyTax(basicSalary, socialPersonal, fundPersonal);
-        map.put("salaryTax", bigDecimal);
-        // 搴旀墸宸ヨ祫
-        map.put("deductSalary", bigDecimal.add(fundPersonal).add(socialPersonal));
-        // 瀹炲彂宸ヨ祫
-        map.put("netSalary", basicSalary.subtract(bigDecimal).subtract(fundPersonal).subtract(socialPersonal));
-
+        map.put("otherDeduct", otherDeduct);
+        map.put("socialSupplementAmount", socialSupplementAmount);
+        map.put("grossSalary", grossSalary);
+        map.put("salaryTax", salaryTax);
+        map.put("deductSalary", deductSalary);
+        map.put("netSalary", netSalary);
     }
 
     /**
@@ -304,4 +276,64 @@
         bigDecimal = bigDecimal.add(detail.getPersonalFixed());
         return bigDecimal;
     }
+
+    private BigDecimal calculateLatestDeptSocialSupplementAmount(StaffOnJob staffOnJobDto) {
+        if (staffOnJobDto == null || staffOnJobDto.getSysDeptId() == null) {
+            return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+        }
+        SchemeApplicableStaff latestScheme = schemeApplicableStaffMapper.selectLatestSchemeByDeptId(staffOnJobDto.getSysDeptId());
+        if (latestScheme == null) {
+            return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+        }
+        List<SchemeInsuranceDetail> detailList = schemeApplicableStaffMapper.selectDetailBySchemeId(latestScheme.getId());
+        if (CollectionUtils.isEmpty(detailList)) {
+            return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+        }
+        BigDecimal socialSupplementAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+        for (SchemeInsuranceDetail detail : detailList) {
+            if (!"鍏Н閲�".equals(detail.getInsuranceType())) {
+                socialSupplementAmount = socialSupplementAmount.add(
+                        calculateByEmployeeIdType(detail.getInsuranceType(), socialSupplementAmount, staffOnJobDto, detail)
+                );
+            }
+        }
+        return socialSupplementAmount.setScale(2, RoundingMode.HALF_UP);
+    }
+
+    private boolean hasValue(Map<String, Object> map, String key) {
+        return map != null && map.get(key) != null;
+    }
+
+    private boolean hasText(Map<String, Object> map, String key) {
+        if (map == null) {
+            return false;
+        }
+        Object value = map.get(key);
+        return value != null && !String.valueOf(value).trim().isEmpty();
+    }
+
+    private BigDecimal getBigDecimal(Map<String, Object> map, String key) {
+        if (map == null) {
+            return null;
+        }
+        Object value = map.get(key);
+        if (value == null) {
+            return null;
+        }
+        if (value instanceof BigDecimal) {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Number) {
+            return new BigDecimal(String.valueOf(value));
+        }
+        String text = String.valueOf(value).trim();
+        if (text.isEmpty()) {
+            return null;
+        }
+        return new BigDecimal(text);
+    }
+
+    private BigDecimal normalizeMoney(BigDecimal value) {
+        return value == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : value.setScale(2, RoundingMode.HALF_UP);
+    }
 }

--
Gitblit v1.9.3