From e2a6bb12ebb7ee07fbd5a428603995dbaccd1ce9 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期一, 02 十一月 2026 14:43:06 +0800
Subject: [PATCH] fix(hrm): 核算批量删除增加工资发放引用保护

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/salary/HrmSalaryPaymentDetailMapper.java  |   16 ++++++++++++++++
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java |   23 +++++++++++++++++++----
 2 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/salary/HrmSalaryPaymentDetailMapper.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/salary/HrmSalaryPaymentDetailMapper.java
index 6a97972..15e0384 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/salary/HrmSalaryPaymentDetailMapper.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/salary/HrmSalaryPaymentDetailMapper.java
@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.hrm.dal.mysql.salary;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -7,6 +8,8 @@
 import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryPaymentDetailDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -40,4 +43,17 @@
         return selectOne(HrmSalaryPaymentDetailDO::getCalculationId, calculationId);
     }
 
+    /**
+     * 鎵归噺鏌ヨ锛氬摢浜涙牳绠楀崟宸茶宸ヨ祫鍙戞斁鏄庣粏寮曠敤
+     *
+     * 鐢ㄤ簬鍒犻櫎鏍哥畻鍗曞墠鍋氬紩鐢ㄤ繚鎶わ紝閬垮厤鍙戞斁鏄庣粏鍙樻垚瀛ゅ効鏁版嵁銆�
+     */
+    default List<HrmSalaryPaymentDetailDO> selectListByCalculationIds(Collection<Long> calculationIds) {
+        if (CollUtil.isEmpty(calculationIds)) {
+            return Collections.emptyList();
+        }
+        return selectList(new LambdaQueryWrapperX<HrmSalaryPaymentDetailDO>()
+                .in(HrmSalaryPaymentDetailDO::getCalculationId, calculationIds));
+    }
+
 }
\ No newline at end of file
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java
index 8c61cad..858e2b1 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java
+++ b/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();
     }
 
 }

--
Gitblit v1.9.3