From e71d71bf43c2307c89d3592adf08c1b32fcd0907 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期六, 17 十月 2026 22:31:42 +0800
Subject: [PATCH] fix(hrm): 同步考勤节假日时间段表结构并修复规则部门继承
---
sql/mysql/hrm_attendance_holiday_date_range_20261017.sql | 70 +++++++++++++++++++++++++++++++++++
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceRuleMapper.java | 12 ++++++
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceRuleServiceImpl.java | 29 +++++++++++---
3 files changed, 104 insertions(+), 7 deletions(-)
diff --git a/sql/mysql/hrm_attendance_holiday_date_range_20261017.sql b/sql/mysql/hrm_attendance_holiday_date_range_20261017.sql
new file mode 100644
index 0000000..782e03d
--- /dev/null
+++ b/sql/mysql/hrm_attendance_holiday_date_range_20261017.sql
@@ -0,0 +1,70 @@
+-- =====================================================
+-- HRM 鑰冨嫟鑺傚亣鏃ラ厤缃細琛ラ綈銆屾椂闂存銆嶇粨鏋勶紙start_date / end_date锛�
+--
+-- 鑳屾櫙锛�
+-- 2026-09-30 鐨勬彁浜� a797b580 灏嗐�岃妭鍋囨棩閰嶇疆銆嶇敱鍗曟棩(date)鏀逛负鏃堕棿娈�(startDate/endDate)锛�
+-- DO/VO/Mapper 宸叉寜 start_date銆乪nd_date 鏌ヨ锛屼絾鏁版嵁搴撹〃缁撴瀯娌℃湁鍚屾銆�
+-- 2026-10-17 鏂板鐨� GET /hrm/attendance/record/my-status 绗竴娆¤蛋鍒拌妭鍋囨棩鏌ヨ锛�
+-- 鎶� Unknown column 'start_date' in 'field list'銆�
+--
+-- 鍐呭锛�
+-- 鈶� hrm_attendance_holiday 鏂板 start_date銆乪nd_date
+-- 鈶� 瀛橀噺鏁版嵁鎸� date 鍥炲~锛坉ate 鍒椾繚鐣欏吋瀹癸紝淇濆瓨鏃朵粛鍐欏叆 start_date锛�
+-- 鈶� 鍥炲~鍚庢敹绱т负 NOT NULL锛岄伩鍏嶅悗缁啓鍏ュ崐鏉℃椂闂存
+--
+-- 骞傜瓑锛氬彲閲嶅鎵ц锛圡ySQL 涓嶆敮鎸� ADD COLUMN IF NOT EXISTS锛屽厛鏌� information_schema锛�
+-- 鎵ц鏂瑰紡锛�
+-- mysql -h<host> -P<port> -u<user> -p --default-character-set=utf8mb4 <db> < docs/sql/hrm_attendance_holiday_date_range_20261017.sql
+-- =====================================================
+
+SET NAMES utf8mb4;
+
+-- ------------------------------------------------------------
+-- 鈶� 鏂板 start_date
+-- ------------------------------------------------------------
+SET @col_exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = DATABASE()
+ AND table_name = 'hrm_attendance_holiday'
+ AND column_name = 'start_date');
+SET @ddl = IF(@col_exists = 0,
+ 'ALTER TABLE `hrm_attendance_holiday` ADD COLUMN `start_date` date DEFAULT NULL COMMENT ''寮�濮嬫棩鏈�'' AFTER `date`',
+ 'SELECT 1');
+PREPARE stmt FROM @ddl;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- ------------------------------------------------------------
+-- 鈶� 鏂板 end_date
+-- ------------------------------------------------------------
+SET @col_exists = (SELECT COUNT(*) FROM information_schema.columns
+ WHERE table_schema = DATABASE()
+ AND table_name = 'hrm_attendance_holiday'
+ AND column_name = 'end_date');
+SET @ddl = IF(@col_exists = 0,
+ 'ALTER TABLE `hrm_attendance_holiday` ADD COLUMN `end_date` date DEFAULT NULL COMMENT ''缁撴潫鏃ユ湡'' AFTER `start_date`',
+ 'SELECT 1');
+PREPARE stmt FROM @ddl;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- ------------------------------------------------------------
+-- 鈶� 瀛橀噺鏁版嵁鍥炲~锛氬崟鏃ラ厤缃殑璧锋鏃ユ湡閮界瓑浜庡師 date
+-- ------------------------------------------------------------
+UPDATE `hrm_attendance_holiday` SET `start_date` = `date` WHERE `start_date` IS NULL;
+UPDATE `hrm_attendance_holiday` SET `end_date` = `date` WHERE `end_date` IS NULL;
+
+-- ------------------------------------------------------------
+-- 鈶� 鍥炲~瀹屾垚鍚庢敹绱т负 NOT NULL锛堝箓绛夛級
+-- ------------------------------------------------------------
+ALTER TABLE `hrm_attendance_holiday`
+ MODIFY COLUMN `start_date` date NOT NULL COMMENT '寮�濮嬫棩鏈�',
+ MODIFY COLUMN `end_date` date NOT NULL COMMENT '缁撴潫鏃ユ湡';
+
+-- ------------------------------------------------------------
+-- 鏍¢獙
+-- ------------------------------------------------------------
+SELECT 'start_date' AS item, COUNT(*) AS cnt FROM information_schema.columns
+WHERE table_schema = DATABASE() AND table_name = 'hrm_attendance_holiday' AND column_name = 'start_date'
+UNION ALL
+SELECT 'end_date', COUNT(*) FROM information_schema.columns
+WHERE table_schema = DATABASE() AND table_name = 'hrm_attendance_holiday' AND column_name = 'end_date';
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceRuleMapper.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceRuleMapper.java
index a22c23b..25a3073 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceRuleMapper.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceRuleMapper.java
@@ -37,4 +37,16 @@
.orderByAsc(HrmAttendanceRuleDO::getName));
}
+ /**
+ * 鏌ヨ閮ㄩ棬涓嬪凡鍚敤鐨勮鍒欙紝鏈�鏂板垱寤虹殑鎺掑湪鍓嶉潰
+ *
+ * 鍚屼竴閮ㄩ棬瀛樺湪澶氭潯鍚敤瑙勫垯鏃讹紝浠ユ渶鏂板垱寤虹殑涓�鏉′负褰撳墠鐢熸晥瑙勫垯
+ */
+ default List<HrmAttendanceRuleDO> selectEnabledListByDeptId(Long deptId) {
+ return selectList(new LambdaQueryWrapperX<HrmAttendanceRuleDO>()
+ .eq(HrmAttendanceRuleDO::getDeptId, deptId)
+ .eq(HrmAttendanceRuleDO::getStatus, 0)
+ .orderByDesc(HrmAttendanceRuleDO::getId));
+ }
+
}
\ No newline at end of file
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceRuleServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceRuleServiceImpl.java
index ecc82a7..673a1ab 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceRuleServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceRuleServiceImpl.java
@@ -6,12 +6,16 @@
import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRuleSaveReqVO;
import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRuleDO;
import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceRuleMapper;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*;
@@ -27,6 +31,8 @@
@Resource
private HrmAttendanceRuleMapper attendanceRuleMapper;
+ @Resource
+ private DeptApi deptApi;
@Override
public Long createAttendanceRule(HrmAttendanceRuleSaveReqVO createReqVO) {
@@ -121,17 +127,26 @@
@Override
public HrmAttendanceRuleDO getAttendanceRuleByDeptId(Long deptId) {
- // 1. 鍏堟煡鎵鹃儴闂ㄤ笓灞炶鍒�
- List<HrmAttendanceRuleDO> deptRules = attendanceRuleMapper.selectList(new cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX<HrmAttendanceRuleDO>()
- .eq(HrmAttendanceRuleDO::getDeptId, deptId)
- .eq(HrmAttendanceRuleDO::getStatus, 0));
- if (!deptRules.isEmpty()) {
- return deptRules.get(0);
+ // 1. 浠庡憳宸ユ墍鍦ㄩ儴闂ㄥ紑濮嬮�愮骇鍚戜笂鏌ユ壘锛氶厤缃湪涓婄骇閮ㄩ棬鐨勮鍒欏鍏跺瓙閮ㄩ棬鐢熸晥
+ Set<Long> visitedDeptIds = new HashSet<>();
+ Long currentDeptId = deptId;
+ while (currentDeptId != null && currentDeptId != 0 && visitedDeptIds.add(currentDeptId)) {
+ List<HrmAttendanceRuleDO> deptRules = attendanceRuleMapper.selectEnabledListByDeptId(currentDeptId);
+ if (!deptRules.isEmpty()) {
+ // 鍚屼竴閮ㄩ棬锛堝銆屾�诲叕鍙搞�嶏級鍙兘閰嶇疆浜嗗鏉″惎鐢ㄨ鍒欙紝浠ユ渶鏂板垱寤虹殑涓哄綋鍓嶇敓鏁堣鍒�
+ return deptRules.get(0);
+ }
+ DeptRespDTO dept = deptApi.getDept(currentDeptId);
+ if (dept == null) {
+ break;
+ }
+ currentDeptId = dept.getParentId();
}
// 2. 鏌ユ壘鍏ㄥ眬瑙勫垯锛坉eptId 涓� null锛�
List<HrmAttendanceRuleDO> globalRules = attendanceRuleMapper.selectList(new cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX<HrmAttendanceRuleDO>()
.isNull(HrmAttendanceRuleDO::getDeptId)
- .eq(HrmAttendanceRuleDO::getStatus, 0));
+ .eq(HrmAttendanceRuleDO::getStatus, 0)
+ .orderByDesc(HrmAttendanceRuleDO::getId));
if (!globalRules.isEmpty()) {
return globalRules.get(0);
}
--
Gitblit v1.9.3