tuqin
5 天以前 e2a6bb12ebb7ee07fbd5a428603995dbaccd1ce9
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java
@@ -881,8 +881,12 @@
    /**
     * 批量删除核算记录(全选后一键删除)
     *
     * 说明:按业务要求,批量删除不限制状态,勾选即删。
     * 不存在的 ID 直接跳过,不报错(避免前端勾选列表与库不一致时整体失败)。
     * 说明:
     * 1. 按业务要求,批量删除不限制核算单状态,勾选即删;
     * 2. 不存在的 ID 直接跳过,不报错(避免前端勾选列表与库不一致时整体失败);
     * 3. 已被「工资发放明细」引用的记录会跳过不删,避免发放明细变成孤儿数据。
     *
     * @return 实际删除的条数(可能小于传入条数)
     */
    @Override
    public Integer deleteSalaryCalculationList(List<Long> ids) {
@@ -895,8 +899,19 @@
        if (CollUtil.isEmpty(existIds)) {
            return 0;
        }
        salaryCalculationMapper.deleteByIds(existIds);
        return existIds.size();
        // 引用保护:已进入工资发放流程的核算单不允许删除
        Set<Long> referencedIds = salaryPaymentDetailMapper.selectListByCalculationIds(existIds).stream()
                .map(HrmSalaryPaymentDetailDO::getCalculationId)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
        List<Long> deletableIds = existIds.stream()
                .filter(id -> !referencedIds.contains(id))
                .collect(Collectors.toList());
        if (CollUtil.isEmpty(deletableIds)) {
            return 0;
        }
        salaryCalculationMapper.deleteByIds(deletableIds);
        return deletableIds.size();
    }
}