huminmin
4 天以前 b8607f49fb2ec4a4113aeb01455e90ae83781bcc
增加餐补夜补,计算薪资
已修改4个文件
130 ■■■■ 文件已修改
doc/万通新型建材.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/StaffSalaryDetail.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java 107 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysUserDeptMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/ÍòͨÐÂÐͽ¨²Ä.sql
@@ -8,3 +8,9 @@
    create_time datetime null comment '录入时间',
    tenant_id   bigint not null default 0 comment '租户id'
);
alter table staff_salary_detail
    add day_days decimal(16, 4) default 0 not null comment '白班天数',
    add night_days decimal(16, 4) default 0 not null comment '夜班天数',
    add meal_amount decimal(16, 4) default 0 not null comment '餐补',
    add night_amount decimal(16, 4) default 0 not null comment '夜班补贴';
src/main/java/com/ruoyi/staff/pojo/StaffSalaryDetail.java
@@ -50,6 +50,18 @@
    @Schema(description = "基本工资")
    private BigDecimal basicSalary;
    @Schema(description = "白班天数")
    private BigDecimal dayDays;
    @Schema(description = "夜班天数")
    private BigDecimal nightDays;
    @Schema(description = "餐补")
    private BigDecimal mealAmount;
    @Schema(description = "夜班补贴")
    private BigDecimal nightAmount;
    @Schema(description = "计件工资")
    private BigDecimal pieceSalary;
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
@@ -13,12 +13,8 @@
import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.staff.controller.TaxCalculator;
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.pojo.SchemeInsuranceDetail;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.mapper.*;
import com.ruoyi.staff.pojo.*;
import com.ruoyi.staff.service.SchemeApplicableStaffService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -48,7 +44,10 @@
    private final SysUserMapper sysUserMapper;
    private final SysDeptMapper sysDeptMapper;
    private final StaffOnJobMapper staffOnJobMapper;
    private final PersonalShiftMapper personalShiftMapper;
    private final PersonalAttendanceLocationConfigMapper personalAttendanceLocationConfigMapper;
    private final SalesLedgerProductionAccountingService salesLedgerProductionAccountingService;
    private final SubsidyConfigurationMapper subsidyConfigurationMapper;
    @Override
@@ -191,15 +190,93 @@
        // å®žå‘工资
        BigDecimal netSalary = new BigDecimal("0.00");
        map.put("netSalary", netSalary);
        // è°ƒç”¨åŸºæœ¬å·¥èµ„
        // æ ¹æ®æŽ’班数据计算白班天数和夜班天数
        BigDecimal dayDays = new BigDecimal("0.00");
        BigDecimal nightDays = new BigDecimal("0.00");
        // æŸ¥è¯¢å½“月排班记录
        List<PersonalShift> shiftList = personalShiftMapper.selectList(new LambdaQueryWrapper<PersonalShift>()
                .eq(PersonalShift::getStaffOnJobId, staffId)
                .like(PersonalShift::getWorkTime, date));
        if(!CollectionUtils.isEmpty(shiftList)){
            // æ”¶é›†æ‰€æœ‰ç­æ¬¡é…ç½®ID
            List<Integer> configIds = shiftList.stream()
                    .map(PersonalShift::getPersonalAttendanceLocationConfigId)
                    .filter(Objects::nonNull)
                    .collect(Collectors.toList());
            if(!CollectionUtils.isEmpty(configIds)){
                // æŸ¥è¯¢ç­æ¬¡é…ç½®ä¿¡æ¯
                List<PersonalAttendanceLocationConfig> configList = personalAttendanceLocationConfigMapper.selectList(
                        new LambdaQueryWrapper<PersonalAttendanceLocationConfig>()
                                .in(PersonalAttendanceLocationConfig::getId, configIds));
                // æž„建班次配置映射
                Map<Integer, String> configMap = configList.stream()
                        .collect(Collectors.toMap(
                                PersonalAttendanceLocationConfig::getId,
                                PersonalAttendanceLocationConfig::getShift,
                                (a, b) -> a));
                // ç»Ÿè®¡ç™½ç­å’Œå¤œç­å¤©æ•°
                for (PersonalShift shift : shiftList) {
                    Integer configId = shift.getPersonalAttendanceLocationConfigId();
                    String shiftName = configMap.get(configId);
                    if(shiftName != null){
                        // æ ¹æ®ç­æ¬¡åç§°åˆ¤æ–­ï¼šåŒ…含"白"或"日"为白班,包含"夜"为夜班
                        if(shiftName.contains("白") || shiftName.contains("日")){
                            dayDays = dayDays.add(BigDecimal.ONE);
                        } else if(shiftName.contains("夜")){
                            nightDays = nightDays.add(BigDecimal.ONE);
                        }
                    }
                }
            }
        }
        map.put("dayDays", dayDays); // ç™½ç­å¤©æ•°
        map.put("nightDays", nightDays); // å¤œç­å¤©æ•°
        // æŸ¥è¯¢é¤è¡¥å’Œå¤œç­è¡¥è´´
        // è®¡ç®—餐补(回族特有)和夜班补助
        BigDecimal mealAmount = new BigDecimal("0.00"); // é¤è¡¥
        BigDecimal nightAmount = new BigDecimal("0.00"); // å¤œç­è¡¥åŠ©
        // èŽ·å–é¤è¡¥å’Œå¤œç­è¡¥è´´æ ‡å‡†ï¼ˆä»Žè¡¥è´´é…ç½®ä¸­èŽ·å–ï¼‰
        SubsidyConfiguration subsidyConfig = subsidyConfigurationMapper.selectOne(null);
        BigDecimal mealStandard = new BigDecimal("0.00"); // é¤è¡¥æ ‡å‡†
        BigDecimal nightStandard = new BigDecimal("0.00"); // å¤œç­è¡¥è´´æ ‡å‡†
        if(subsidyConfig != null){
            mealStandard = subsidyConfig.getMealAmount() != null ? subsidyConfig.getMealAmount() : new BigDecimal("0.00");
            nightStandard = subsidyConfig.getNightAmount() != null ? subsidyConfig.getNightAmount() : new BigDecimal("0.00");
        }
        // é¤è¡¥ï¼šæ°‘族为回族特有,计算方式为(白班天数+夜班天数)*餐补标准
        StaffOnJob staffOnJobDto = staffOnJobMapper.selectById(staffId);
        if(staffOnJobDto == null){
            return;
        }
        String nation = staffOnJobDto.getNation();
        if("回族".equals(nation)){
            mealAmount = dayDays.add(nightDays).multiply(mealStandard);
        }
        // å¤œç­è¡¥åŠ©ï¼šå¤œç­å¤©æ•°*夜班补贴标准
        nightAmount = nightDays.multiply(nightStandard);
        map.put("mealAmount", mealAmount); // é¤è¡¥
        map.put("nightAmount", nightAmount); // å¤œç­è¡¥åŠ©
        // è°ƒç”¨åŸºæœ¬å·¥èµ„
        basicSalary = staffOnJobDto.getBasicSalary();
        map.put("basicSalary", basicSalary);
        // åº”发工资
        map.put("grossSalary", basicSalary);
        // åº”发工资(基本工资+餐补+夜班补助+其他收入)
        grossSalary = basicSalary.add(mealAmount).add(nightAmount).add(otherIncome);
        map.put("grossSalary", grossSalary);
        // å®žå‘工资初始值
        netSalary = grossSalary;
        map.put("netSalary", netSalary);
        // ä¸ªç¨Žé‡‘额(无社保版)
        BigDecimal bigDecimal = TaxCalculator.calculateMonthlyTax(basicSalary, socialPersonal, fundPersonal);
        map.put("salaryTax", bigDecimal);
@@ -242,10 +319,14 @@
        // ä¸ªç¨Žé‡‘额(社保版)
        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));
        // åº”扣工资 = ä¸ªç¨Ž + å…¬ç§¯é‡‘个人 + ç¤¾ä¿ä¸ªäºº + å…¶ä»–支出
        deductSalary = bigDecimal.add(fundPersonal).add(socialPersonal).add(otherDeduct);
        map.put("deductSalary", deductSalary);
        // å®žå‘工资 = åº”发工资 - åº”扣工资
        netSalary = grossSalary.subtract(deductSalary);
        map.put("netSalary", netSalary);
    }
src/main/resources/mapper/system/SysUserDeptMapper.xml
@@ -10,7 +10,8 @@
        T1.staff_name as staffName,
        T2.dept_id as deptId,
        T2.dept_name as deptName,
        T1.staff_state as staffState
        T1.staff_state as staffState,
        T1.nation as nation
        FROM
        staff_on_job T1
        LEFT JOIN sys_dept T2 ON T1.sys_dept_id = T2.dept_id
@@ -41,4 +42,4 @@
            </if>
        </where>
    </select>
</mapper>
</mapper>