From 9494075e6d9d2a4b2b884b4ed740dee0c434734c Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@local>
Date: 星期二, 03 十一月 2026 11:48:44 +0800
Subject: [PATCH] fix(hrm): 修复薪酬核算写错 user_id 导致员工查不到工资条
---
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java | 66 +++++++++++++++++++++------------
1 files changed, 42 insertions(+), 24 deletions(-)
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 08218c8..7f1d49e 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
@@ -169,10 +169,17 @@
// 2. 閬嶅巻鍛樺伐杩涜钖叕鏍哥畻
for (HrmEmployeeDO employee : employees) {
- // employeeId 鏄憳宸D锛岀敤浜庡叧鑱旇柂閰。妗堛�佺ぞ淇濇。妗堛�佹牳绠楄褰�
+ // employeeId 鏄憳宸ユ。妗堜富閿紙hrm_employee.id锛夛紝浠呯敤浜庡叧鑱旀帓鐝�
+ // userId 鏄郴缁熻处鍙� ID锛坰ystem_users.id锛夛紝鏍哥畻璁板綍 / 钖叕妗f / 绀句繚妗f
+ // 鍏ㄩ儴鎸夊畠鍏宠仈 鈥斺�� 鍛樺伐鐧诲綍鍚庢煡銆屾垜鐨勮柂璧勩�嶇敤鐨勪篃鏄繖涓� ID
Long employeeId = employee.getId();
- // 2.1 妫�鏌ヨ鍛樺伐褰撴湀鏄惁宸插瓨鍦ㄦ牳绠楄褰曪紙鎸夊憳宸D鏌ヨ锛�
- List<HrmSalaryCalculationDO> existCalculations = salaryCalculationMapper.selectListByUserIdAndPeriod(employeeId, period);
+ Long userId = employee.getUserId();
+ if (userId == null) {
+ log.warn("[calculateSalary] 鍛樺伐({}) 鏈叧鑱旂郴缁熻处鍙凤紝璺宠繃鏍哥畻", employee.getName());
+ continue;
+ }
+ // 2.1 妫�鏌ヨ鍛樺伐褰撴湀鏄惁宸插瓨鍦ㄦ牳绠楄褰曪紙鎸夌郴缁熻处鍙� ID 鏌ヨ锛�
+ List<HrmSalaryCalculationDO> existCalculations = salaryCalculationMapper.selectListByUserIdAndPeriod(userId, period);
if (CollUtil.isNotEmpty(existCalculations)) {
// 濡傛灉瀛樺湪澶氭潯璁板綍锛屾彁绀哄紓甯告暟鎹�
if (existCalculations.size() > 1) {
@@ -184,15 +191,15 @@
}
}
- // 2.2 鑾峰彇鍛樺伐钖叕妗f锛堟寜鍛樺伐ID鏌ヨ锛�
- HrmEmployeeSalaryDO employeeSalary = employeeSalaryMapper.selectLatestByUserId(employeeId);
+ // 2.2 鑾峰彇鍛樺伐钖叕妗f锛堟寜绯荤粺璐﹀彿 ID 鏌ヨ锛�
+ HrmEmployeeSalaryDO employeeSalary = employeeSalaryMapper.selectLatestByUserId(userId);
if (employeeSalary == null) {
// 濡傛灉娌℃湁钖叕妗f锛屼娇鐢ㄥ憳宸ヨ〃涓殑鍩烘湰宸ヨ祫鍒涘缓榛樿鏁版嵁
- employeeSalary = buildDefaultEmployeeSalary(employeeId, employee);
+ employeeSalary = buildDefaultEmployeeSalary(userId, employee);
}
- // 2.3 鑾峰彇鍛樺伐绀句繚鍏Н閲戞。妗堬紙鎸夊憳宸D鏌ヨ锛屽彇鏈�鏂扮敓鏁堢殑锛�
- HrmEmployeeSocialSecurityDO socialSecurity = employeeSocialSecurityMapper.selectLatestByUserId(employeeId);
+ // 2.3 鑾峰彇鍛樺伐绀句繚鍏Н閲戞。妗堬紙鎸夌郴缁熻处鍙� ID 鏌ヨ锛屽彇鏈�鏂扮敓鏁堢殑锛�
+ HrmEmployeeSocialSecurityDO socialSecurity = employeeSocialSecurityMapper.selectLatestByUserId(userId);
// 2.4 濡傛灉鏈夌ぞ淇濇。妗堬紝鑾峰彇缁戝畾鐨勬柟妗�
HrmSocialSecuritySchemeDO scheme = null;
if (socialSecurity != null && socialSecurity.getSocialSecuritySchemeId() != null) {
@@ -200,7 +207,7 @@
}
// 2.5 鏋勫缓鏍哥畻璁板綍锛堝寘鍚墸闄よ绠楋紝閫氳繃鏂规鑾峰彇姣斾緥锛�
- HrmSalaryCalculationDO calculation = buildSalaryCalculation(period, employeeId, employee, employeeSalary, socialSecurity, scheme, effectiveDate);
+ HrmSalaryCalculationDO calculation = buildSalaryCalculation(period, userId, employee, employeeSalary, socialSecurity, scheme, effectiveDate);
// 2.6 淇濆瓨锛氶娆$敓鎴愬崟鍙凤紱宸叉湁寰呯‘璁よ褰曞垯淇濈暀鍗曞彿骞惰鐩栭噸绠楃粨鏋�
if (CollUtil.isNotEmpty(existCalculations)) {
@@ -231,11 +238,13 @@
/**
* 鏋勫缓榛樿鐨勫憳宸ヨ柂閰。妗堛�傚熀鏈伐璧勭粺涓�鍙栧憳宸ユ。妗堬紝缁╂晥宸ヨ祫榛樿涓嶈嚜鍔ㄧ敓鎴愩��
+ *
+ * @param userId 绯荤粺璐﹀彿 ID锛坰ystem_users.id锛夛紝涓嶆槸 hrm_employee.id
*/
- private HrmEmployeeSalaryDO buildDefaultEmployeeSalary(Long employeeId, HrmEmployeeDO employee) {
+ private HrmEmployeeSalaryDO buildDefaultEmployeeSalary(Long userId, HrmEmployeeDO employee) {
BigDecimal baseSalary = employee.getBaseSalary() != null ? employee.getBaseSalary() : BigDecimal.ZERO;
return HrmEmployeeSalaryDO.builder()
- .userId(employeeId) // 浣跨敤鍛樺伐ID
+ .userId(userId)
.salaryStructureId(employee.getSalaryStructureId())
.baseSalary(baseSalary)
.performanceSalary(BigDecimal.ZERO)
@@ -249,8 +258,10 @@
/**
* 鏋勫缓钖叕鏍哥畻璁板綍锛堝寘鍚ぞ淇濄�佸叕绉噾銆佷釜绋庛�佽鍋囨墸闄よ绠楋級
* 閫氳繃鍛樺伐绀句繚妗f缁戝畾鐨勬柟妗堣幏鍙栫即绾虫瘮渚�
+ *
+ * @param userId 绯荤粺璐﹀彿 ID锛坰ystem_users.id锛夛紝鍐欏叆鏍哥畻璁板綍鐨� user_id
*/
- private HrmSalaryCalculationDO buildSalaryCalculation(String period, Long employeeId, HrmEmployeeDO employee,
+ private HrmSalaryCalculationDO buildSalaryCalculation(String period, Long userId, HrmEmployeeDO employee,
HrmEmployeeSalaryDO employeeSalary,
HrmEmployeeSocialSecurityDO socialSecurity,
HrmSocialSecuritySchemeDO scheme,
@@ -265,7 +276,8 @@
BigDecimal overtimePay = overtimeSalary.pay();
// 鎸夋帓鐝疮璁″嚭鍕ゅぉ鏁颁笌鎺掔彮鎬诲伐鏃讹紙鏃犳帓鐝椂鍑哄嫟澶╂暟鍥為��榛樿 22锛�
- ScheduleStat scheduleStat = calculateScheduleStat(employeeId, period);
+ // 娉ㄦ剰锛氭帓鐝〃鎸夊憳宸ユ。妗� ID锛坔rm_employee.id锛夊叧鑱旓紝涓庢牳绠楄褰曠殑 userId 涓嶅悓
+ ScheduleStat scheduleStat = calculateScheduleStat(employee.getId(), period);
Integer workDays = scheduleStat.scheduledDays() > 0 ? scheduleStat.scheduledDays() : 22;
BigDecimal totalWorkHours = scheduleStat.totalWorkHours();
@@ -325,7 +337,7 @@
return HrmSalaryCalculationDO.builder()
.period(period)
- .userId(employeeId) // 浣跨敤鍛樺伐ID
+ .userId(userId)
.deptId(employee.getDeptId())
.baseSalary(baseSalary)
.performanceSalary(performanceSalary)
@@ -595,17 +607,23 @@
// 2. 閬嶅巻鍛樺伐瀹炴椂璁$畻钖叕
List<HrmSalaryCalculationDO> resultList = new java.util.ArrayList<>();
for (HrmEmployeeDO employee : employees) {
- Long employeeId = employee.getId();
-
- // 2.1 鑾峰彇鍛樺伐钖叕妗f锛堟寜鍛樺伐ID鏌ヨ锛�
- HrmEmployeeSalaryDO employeeSalary = employeeSalaryMapper.selectLatestByUserId(employeeId);
- if (employeeSalary == null) {
- // 濡傛灉娌℃湁钖叕妗f锛屼娇鐢ㄥ憳宸ヨ〃涓殑鍩烘湰宸ヨ祫鍒涘缓榛樿鏁版嵁
- employeeSalary = buildDefaultEmployeeSalary(employeeId, employee);
+ // userId 鏄郴缁熻处鍙� ID锛坰ystem_users.id锛夛紝钖叕妗f / 绀句繚妗f鎸夊畠鍏宠仈锛�
+ // 鎺掔彮琛ㄥ垯鎸� hrm_employee.id 鍏宠仈锛屼袱鑰呬笉鍚�
+ Long userId = employee.getUserId();
+ if (userId == null) {
+ log.warn("[previewSalaryCalculation] 鍛樺伐({}) 鏈叧鑱旂郴缁熻处鍙凤紝璺宠繃", employee.getName());
+ continue;
}
- // 2.2 鑾峰彇鍛樺伐绀句繚鍏Н閲戞。妗堬紙鎸夊憳宸D鏌ヨ锛屽彇鏈�鏂扮敓鏁堢殑锛�
- HrmEmployeeSocialSecurityDO socialSecurity = employeeSocialSecurityMapper.selectLatestByUserId(employeeId);
+ // 2.1 鑾峰彇鍛樺伐钖叕妗f锛堟寜绯荤粺璐﹀彿 ID 鏌ヨ锛�
+ HrmEmployeeSalaryDO employeeSalary = employeeSalaryMapper.selectLatestByUserId(userId);
+ if (employeeSalary == null) {
+ // 濡傛灉娌℃湁钖叕妗f锛屼娇鐢ㄥ憳宸ヨ〃涓殑鍩烘湰宸ヨ祫鍒涘缓榛樿鏁版嵁
+ employeeSalary = buildDefaultEmployeeSalary(userId, employee);
+ }
+
+ // 2.2 鑾峰彇鍛樺伐绀句繚鍏Н閲戞。妗堬紙鎸夌郴缁熻处鍙� ID 鏌ヨ锛屽彇鏈�鏂扮敓鏁堢殑锛�
+ HrmEmployeeSocialSecurityDO socialSecurity = employeeSocialSecurityMapper.selectLatestByUserId(userId);
// 2.3 濡傛灉鏈夌ぞ淇濇。妗堬紝鑾峰彇缁戝畾鐨勬柟妗�
HrmSocialSecuritySchemeDO scheme = null;
if (socialSecurity != null && socialSecurity.getSocialSecuritySchemeId() != null) {
@@ -613,7 +631,7 @@
}
// 2.4 鏋勫缓鏍哥畻璁板綍锛堝疄鏃惰绠楋紝涓嶅瓨鍌級
- HrmSalaryCalculationDO calculation = buildSalaryCalculation(period, employeeId, employee, employeeSalary, socialSecurity, scheme, effectiveDate);
+ HrmSalaryCalculationDO calculation = buildSalaryCalculation(period, userId, employee, employeeSalary, socialSecurity, scheme, effectiveDate);
resultList.add(calculation);
}
return resultList;
--
Gitblit v1.9.3