liu
4 天以前 5d25a8a01ae3070668bc60b2597591ef2ba13e5b
feat(薪酬核算): 全勤奖支持工资表行内调整

- resolveAttendanceBonus 优先取工资表本次传入值(含0,负数归零),未传时回落员工档案配置
- 保持整表核算原有行为不变

Co-Authored-By: Claude <noreply@anthropic.com>
已修改1个文件
17 ■■■■ 文件已修改
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
@@ -168,7 +168,7 @@
            return;
        }
        BigDecimal basicSalary = resolveBasicSalary(map, staffOnJobDto);
        BigDecimal attendanceBonus = resolveAttendanceBonus(staffOnJobDto);
        BigDecimal attendanceBonus = resolveAttendanceBonus(map, staffOnJobDto);
        BigDecimal otherIncome = normalizeMoney(getBigDecimal(map, "otherIncome"));
        BigDecimal otherDeduct = normalizeMoney(getBigDecimal(map, "otherDeduct"));
        BigDecimal socialSupplementAmount = resolveSocialSupplementAmount(map, staffOnJobDto);
@@ -274,11 +274,18 @@
    }
    /**
     * 获取员工最新全勤奖金。
     * 全勤奖金统一以员工档案配置为准。
     * 获取员工全勤奖金。
     * 优先使用工资表本次传入的值(支持行内调整,含调整为 0),未传时回落到员工档案配置。
     */
    private BigDecimal resolveAttendanceBonus(StaffOnJob staffOnJobDto) {
        // 全勤奖金直接取员工档案里的最新配置。
    private BigDecimal resolveAttendanceBonus(Map<String, Object> map, StaffOnJob staffOnJobDto) {
        // 行内调整优先:只要本次传入全勤奖(包括 0),就直接采用传入值,负数按 0 处理。
        if (hasValue(map, "attendanceBonus")) {
            BigDecimal passed = normalizeMoney(getBigDecimal(map, "attendanceBonus"));
            return passed.compareTo(BigDecimal.ZERO) < 0
                    ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)
                    : passed;
        }
        // 未传入时保持原逻辑,取员工档案里的最新配置。
        return staffOnJobDto.getAttendanceBonus() == null
                ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)
                : normalizeMoney(staffOnJobDto.getAttendanceBonus());