From 3e17b898ed5c4a62fbad777f39c3f89953345ff2 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 29 七月 2026 16:38:42 +0800
Subject: [PATCH] 修改工资计算
---
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java | 489 +++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 372 insertions(+), 117 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 7d59c26..4cd0b2c 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
@@ -2,36 +2,39 @@
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.mapper.ProductionProductMainMapper;
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 javax.annotation.Resource;
import java.math.BigDecimal;
-import java.util.*;
+import java.math.RoundingMode;
+import java.time.DayOfWeek;
+import java.time.YearMonth;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
import java.util.stream.Collectors;
+import java.time.LocalDate;
/**
* <p>
@@ -42,28 +45,16 @@
* @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;
+ private final ProductionProductMainMapper productionProductMainMapper;
@Override
@@ -74,6 +65,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)){
@@ -166,101 +158,285 @@
* 閫氳繃鍛樺伐id璁$畻绀句繚鏂规
* @param id
*/
- public void calculateByEmployeeId(Integer id,Map<String, Object> map,String date) {
- // 1. 鍏ュ弬鏍¢獙
- if (id == 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){
+ public void calculateByEmployeeId(Integer id, Map<String, Object> map, String date) {
+ if (id == null || map == null) {
return;
}
- basicSalary = staffOnJobDto.getBasicSalary();
- map.put("basicSalary", basicSalary);
- // 搴斿彂宸ヨ祫
- map.put("grossSalary", basicSalary);
- // 涓◣閲戦锛堟棤绀句繚鐗堬級
- BigDecimal bigDecimal = TaxCalculator.calculateMonthlyTax(basicSalary, socialPersonal, fundPersonal);
- map.put("salaryTax", bigDecimal);
- // 璁℃椂宸ヨ祫 璁′欢宸ヨ祫
+ Long staffId = id.longValue();
+ StaffOnJob staffOnJobDto = staffOnJobMapper.selectById(staffId);
+ if (staffOnJobDto == null) {
+ return;
+ }
+ BigDecimal basicSalary = resolveBasicSalary(map, staffOnJobDto);
+ BigDecimal attendanceBonus = resolveAttendanceBonus(staffOnJobDto);
+ BigDecimal otherIncome = normalizeMoney(getBigDecimal(map, "otherIncome"));
+ BigDecimal otherDeduct = normalizeMoney(getBigDecimal(map, "otherDeduct"));
+ BigDecimal socialSupplementAmount = resolveSocialSupplementAmount(map, staffOnJobDto);
+ BigDecimal socialPersonal = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ BigDecimal fundPersonal = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ int monthWorkDays = resolveMonthWorkDays(map, date);
+ BigDecimal workDays = resolveWorkDays(map, monthWorkDays);
+ BigDecimal standardHours = resolveStandardHours(map, monthWorkDays);
+ BigDecimal actualOutput = resolveActualOutput(map);
+ BigDecimal standardQuantity = resolveStandardQuantity(map);
+ BigDecimal dailySalary = calculateDailySalary(basicSalary, workDays);
+
+ Long sysUserId = getUidByStaffId(staffId);
UserProductionAccountingDto userProductionAccountingDto = new UserProductionAccountingDto();
- userProductionAccountingDto.setUserId(getUidByStaffId(staffId));
+ userProductionAccountingDto.setUserId(sysUserId);
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);
- }
- // 2. 鏌ヨ璇ヤ汉鍛樺搴旂殑绀句繚鏂规
+ BigDecimal repairWorkHour = resolveRepairWorkHour(sysUserId, date);
+ BigDecimal convertedWorkHours = resolveConvertedWorkHours(
+ map,
+ actualOutput,
+ standardQuantity,
+ repairWorkHour,
+ byUserId
+ );
+ BigDecimal conversionRatio = calculateConversionRatio(standardHours, convertedWorkHours);
+
+ // 鏌ヨ璇ヤ汉鍛樺搴旂殑绀句繚鏂规
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 = calculateByEmployeeIdType(detail.getInsuranceType(), fundPersonal, basicSalary, staffOnJobDto, detail);
+ } else {
+ socialPersonal = calculateByEmployeeIdType(detail.getInsuranceType(), socialPersonal, basicSalary, staffOnJobDto, detail);
+ }
}
}
}
+
+ // 宸ヨ祫 = 鍏ㄥ嫟濂栭噾 + 鍩烘湰宸ヨ祫 * 鎶樺悎鍊嶆暟 + 鍏朵粬鏀跺叆 + 娲ヨ创
+ BigDecimal grossSalary = attendanceBonus
+ .add(basicSalary.multiply(conversionRatio))
+ .add(otherIncome)
+ .add(normalizeMoney(getBigDecimal(map, "allowance")));
+ 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("attendanceBonus", attendanceBonus);
+ map.put("workDays", workDays);
+ map.put("monthWorkDays", monthWorkDays);
+ map.put("dailySalary", dailySalary);
+ map.put("standardHours", standardHours);
+ map.put("actualOutput", actualOutput);
+ map.put("standardQuantity", standardQuantity);
+ map.put("convertedWorkHours", convertedWorkHours);
+ map.put("monthTimeTotal", convertedWorkHours);
+ map.put("conversionRatio", conversionRatio);
+ map.put("benefit", conversionRatio);
+ map.put("pieceSalary", convertedWorkHours);
+ map.put("hourlySalary", BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP));
+ 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);
+ }
+ /**
+ * 瑙f瀽鍛樺伐鍩虹宸ヨ祫銆�
+ * 浼樺厛浣跨敤宸ヨ祫琛ㄩ噷鏈浼犲叆鐨勫�硷紝鏈紶鏃跺洖钀藉埌鍛樺伐妗f涓殑鍩虹宸ヨ祫銆�
+ */
+ private BigDecimal resolveBasicSalary(Map<String, Object> map, StaffOnJob staffOnJobDto) {
+ // 鍛樺伐鍩虹宸ヨ祫浼樺厛鍙栧伐璧勮〃浼犲叆鍊硷紝娌℃湁鍒欏洖钀藉埌鍛樺伐妗f涓殑鍩虹宸ヨ祫銆�
+ return hasValue(map, "basicSalary")
+ ? normalizeMoney(getBigDecimal(map, "basicSalary"))
+ : normalizeMoney(staffOnJobDto.getBasicSalary());
+ }
+
+ /**
+ * 鑾峰彇鍛樺伐鏈�鏂板叏鍕ゅ閲戙��
+ * 鍏ㄥ嫟濂栭噾缁熶竴浠ュ憳宸ユ。妗堥厤缃负鍑嗐��
+ */
+ private BigDecimal resolveAttendanceBonus(StaffOnJob staffOnJobDto) {
+ // 鍏ㄥ嫟濂栭噾鐩存帴鍙栧憳宸ユ。妗堥噷鐨勬渶鏂伴厤缃��
+ return staffOnJobDto.getAttendanceBonus() == null
+ ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)
+ : normalizeMoney(staffOnJobDto.getAttendanceBonus());
+ }
+
+ /**
+ * 瑙f瀽绀句繚琛ョ即閲戦銆�
+ * 濡傛灉宸ヨ祫琛ㄤ紶鍏ヤ簡琛ョ即閲戦鍒欑洿鎺ヤ娇鐢紝鍚﹀垯鎸夊憳宸ユ墍灞為儴闂ㄦ渶鏂版柟妗堣绠椼��
+ */
+ private BigDecimal resolveSocialSupplementAmount(Map<String, Object> map, StaffOnJob staffOnJobDto) {
+ return hasValue(map, "socialSupplementAmount")
+ ? normalizeMoney(getBigDecimal(map, "socialSupplementAmount"))
+ : calculateLatestDeptSocialSupplementAmount(staffOnJobDto);
+ }
+
+ /**
+ * 璁$畻鏈堟爣鍑嗗伐鏃躲��
+ * 瑙勫垯锛氬伐浣滄棩澶╂暟 * 8 灏忔椂銆�
+ */
+ private BigDecimal calculateStandardHours(int monthWorkDays) {
+ // 鏈堟爣鍑嗗伐鏃� = 宸ヤ綔鏃ュぉ鏁� * 8 灏忔椂銆�
+ return BigDecimal.valueOf(monthWorkDays)
+ .multiply(new BigDecimal("8"))
+ .setScale(2, RoundingMode.HALF_UP);
+ }
+
+ /**
+ * 瑙f瀽鏈堟爣鍑嗗伐鏃躲��
+ * 浼樺厛浣跨敤宸ヨ祫琛ㄤ紶鍏ョ殑宸ヤ綔鏃ヨ绠楋紝鍏舵浣跨敤褰撴湀榛樿宸ヤ綔鏃ャ��
+ */
+ private BigDecimal resolveStandardHours(Map<String, Object> map, int monthWorkDays) {
+ if (hasValue(map, "standardHours")) {
+ BigDecimal standardHours = normalizeMoney(getBigDecimal(map, "standardHours"));
+ if (standardHours.compareTo(BigDecimal.ZERO) > 0) {
+ return standardHours;
+ }
+ }
+ return calculateStandardHours(monthWorkDays);
+ }
+
+ /**
+ * 瑙f瀽褰撴湀瀹為檯浜ч噺銆�
+ */
+ private BigDecimal resolveActualOutput(Map<String, Object> map) {
+ return hasValue(map, "actualOutput")
+ ? normalizeMoney(getBigDecimal(map, "actualOutput"))
+ : BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ }
+
+ /**
+ * 瑙f瀽宸ュ簭鏍囧噯鏁伴噺銆�
+ */
+ private BigDecimal resolveStandardQuantity(Map<String, Object> map) {
+ return hasValue(map, "standardQuantity")
+ ? normalizeMoney(getBigDecimal(map, "standardQuantity"))
+ : BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ }
+
+ /**
+ * 姹囨�昏交寰繑宸ョ殑琛ヤ慨鐞嗗伐鏃躲��
+ * 鎸夌郴缁熺敤鎴� ID 鍜屽伐璧勬湀浠界粺璁★紝骞朵綔涓烘湀鏃堕棿鍚堣鐨勪竴閮ㄥ垎銆�
+ */
+ private BigDecimal resolveRepairWorkHour(Long sysUserId, String date) {
+ if (sysUserId == null || sysUserId <= 0 || StringUtils.isEmpty(date)) {
+ return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ }
+ LocalDate monthStart = YearMonth.parse(date).atDay(1);
+ LocalDate monthEnd = YearMonth.parse(date).atEndOfMonth();
+ return productionProductMainMapper.selectList(new LambdaQueryWrapper<com.ruoyi.production.pojo.ProductionProductMain>()
+ .eq(com.ruoyi.production.pojo.ProductionProductMain::getUserId, sysUserId)
+ .eq(com.ruoyi.production.pojo.ProductionProductMain::getReportType, 1)
+ .ge(com.ruoyi.production.pojo.ProductionProductMain::getCreateTime, monthStart.atStartOfDay())
+ .le(com.ruoyi.production.pojo.ProductionProductMain::getCreateTime, monthEnd.atTime(23, 59, 59)))
+ .stream()
+ .map(item -> normalizeMoney(item.getRepairWorkHour()))
+ .reduce(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP), BigDecimal::add)
+ .setScale(2, RoundingMode.HALF_UP);
+ }
+
+ /**
+ * 璁$畻鏈堟椂闂村悎璁°��
+ * 璁′欢鍦烘櫙浣跨敤瀹為檯浜ч噺鍜屾爣鍑嗘暟閲忔崲绠楋紱
+ * 娌℃湁璁′欢鏁版嵁鏃讹紝鍥炶惤鍒扮敓浜ф牳绠楁眹鎬诲�硷紱
+ * 鏈�鍚庡啀鍙犲姞杩斿伐琛ヤ慨鐞嗗伐鏃躲��
+ */
+ private BigDecimal resolveConvertedWorkHours(Map<String, Object> map,
+ BigDecimal actualOutput,
+ BigDecimal standardQuantity,
+ BigDecimal repairWorkHour,
+ UserAccountDto byUserId) {
+ if (hasValue(map, "monthTimeTotal")) {
+ BigDecimal monthTimeTotal = normalizeMoney(getBigDecimal(map, "monthTimeTotal"));
+ if (monthTimeTotal.compareTo(BigDecimal.ZERO) > 0) {
+ return monthTimeTotal;
+ }
+ }
+ BigDecimal convertedWorkHours = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+ // 璁′欢鎶樼畻宸ユ椂 = 褰撴湀瀹為檯浜ч噺 / 宸ュ簭鏍囧噯鏁伴噺 * 8
+ if (actualOutput.compareTo(BigDecimal.ZERO) > 0 && standardQuantity.compareTo(BigDecimal.ZERO) > 0) {
+ convertedWorkHours = actualOutput
+ .divide(standardQuantity, 8, RoundingMode.HALF_UP)
+ .multiply(new BigDecimal("8"))
+ .setScale(2, RoundingMode.HALF_UP);
+ } else if (byUserId != null) {
+ convertedWorkHours = normalizeMoney(byUserId.getAccountBalance().add(byUserId.getAccount()));
+ }
+ return convertedWorkHours.add(repairWorkHour).setScale(2, RoundingMode.HALF_UP);
+ }
+
+ /**
+ * 璁$畻鎶樺悎鍊嶆暟銆�
+ * 瑙勫垯锛氭湀鏃堕棿鍚堣 / 鏈堟爣鍑嗗伐鏃躲��
+ */
+ private BigDecimal calculateConversionRatio(BigDecimal standardHours, BigDecimal convertedWorkHours) {
+ return standardHours.compareTo(BigDecimal.ZERO) == 0
+ ? BigDecimal.ZERO.setScale(4, RoundingMode.HALF_UP)
+ : convertedWorkHours.divide(standardHours, 8, RoundingMode.HALF_UP)
+ .setScale(4, RoundingMode.HALF_UP);
+ }
+
+ /**
+ * 璁$畻鏃ヨ宸ヨ祫銆�
+ * 瑙勫垯锛氬熀鏈伐璧� / 宸ヤ綔鏃ュぉ鏁般��
+ */
+ private BigDecimal calculateDailySalary(BigDecimal basicSalary, BigDecimal workDays) {
+ if (basicSalary == null || workDays == null || workDays.compareTo(BigDecimal.ZERO) <= 0) {
+ return BigDecimal.ZERO.setScale(3, RoundingMode.HALF_UP);
+ }
+ return basicSalary.divide(workDays, 3, RoundingMode.HALF_UP);
+ }
+
+ /**
+ * 瑙f瀽宸ヨ祫琛ㄥ伐浣滄棩銆�
+ * 浼樺厛浣跨敤椤甸潰浼犲叆鐨勫伐浣滄棩锛屾湭浼犳椂鎵嶆寜鑷劧鏈堝伐浣滄棩璁$畻銆�
+ */
+ private int resolveMonthWorkDays(Map<String, Object> map, String date) {
+ if (hasValue(map, "monthWorkDays")) {
+ BigDecimal monthWorkDays = normalizeMoney(getBigDecimal(map, "monthWorkDays"));
+ if (monthWorkDays.compareTo(BigDecimal.ZERO) > 0) {
+ return monthWorkDays.intValue();
+ }
+ }
+ return calculateWorkDays(date);
+ }
+
+ /**
+ * 瑙f瀽宸ヤ綔鏃ャ��
+ * 濡傛灉宸ヨ祫琛ㄩ噷宸茬粡濉啓浜嗗伐浣滄棩锛屽垯浼樺厛浣跨敤浜哄伐濉啓鍊硷紱
+ * 鍚﹀垯榛樿浣跨敤褰撴湀宸ヤ綔鏃ュぉ鏁般��
+ */
+ private BigDecimal resolveWorkDays(Map<String, Object> map, int monthWorkDays) {
+ if (hasValue(map, "workDays")) {
+ BigDecimal workDays = normalizeMoney(getBigDecimal(map, "workDays"));
+ if (workDays.compareTo(BigDecimal.ZERO) > 0) {
+ return workDays;
+ }
+ }
+ return BigDecimal.valueOf(monthWorkDays).setScale(2, RoundingMode.HALF_UP);
}
/**
@@ -291,17 +467,96 @@
* @param detail
* @return
*/
- public BigDecimal calculateByEmployeeIdType(String type,BigDecimal bigDecimal, StaffOnJob staffOnJobDto,SchemeInsuranceDetail detail) {
+ public BigDecimal calculateByEmployeeIdType(String type,BigDecimal bigDecimal, BigDecimal basicSalary, StaffOnJob staffOnJobDto,SchemeInsuranceDetail detail) {
// 鍒ゆ柇鏄惁璋冪敤鍩烘湰宸ヨ祫
if (detail.getUseBasicSalary() == 1) {
BigDecimal divide = detail.getPaymentBase().multiply(detail.getPersonalRatio()).divide(new BigDecimal("100"), 2);
bigDecimal = bigDecimal.add(divide);
}else{
- // 璋冪敤鍩烘湰宸ヨ祫
- BigDecimal multiply = staffOnJobDto.getBasicSalary().multiply(detail.getPersonalRatio().divide(new BigDecimal("100"), 2));
+ // 璋冪敤褰撳墠宸ヨ祫琛ㄤ腑鐨勫熀鏈伐璧�
+ BigDecimal multiply = basicSalary.multiply(detail.getPersonalRatio().divide(new BigDecimal("100"), 2));
bigDecimal = bigDecimal.add(multiply);
}
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 = calculateByEmployeeIdType(
+ detail.getInsuranceType(),
+ socialSupplementAmount,
+ normalizeMoney(staffOnJobDto.getBasicSalary()),
+ 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);
+ }
+
+ private int calculateWorkDays(String date) {
+ if (StringUtils.isEmpty(date)) {
+ return 0;
+ }
+ YearMonth yearMonth = YearMonth.parse(date);
+ int workDays = 0;
+ for (int day = 1; day <= yearMonth.lengthOfMonth(); day++) {
+ DayOfWeek dayOfWeek = yearMonth.atDay(day).getDayOfWeek();
+ if (dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) {
+ workDays++;
+ }
+ }
+ return workDays;
+ }
}
--
Gitblit v1.9.3