-- ============================================================================= -- 2026-05-06 考勤相关 DDL 全量合并(单次执行本文件即可) -- -- 包含: -- A. 应休表建表、门店默认考勤分组列、人员应休/可打卡门店、删除人员表历史班次列 -- B. 班次表 lq_attendance_group 应休三列迁出至 lq_attendance_rest_group + F_DefaultRestGroupId -- -- 执行前请备份。若某步报 Duplicate column / Duplicate entry / Unknown column,说明已执行过,跳过该步后继续。 -- 应用侧要求: -- - 执行「A.5 删人员 F_AttendanceGroupId」前,应用需已不读 BASE_USER.F_AttendanceGroupId -- - 执行「B.4 删班次应休三列」前,应用需已读写 F_DefaultRestGroupId + 应休表 -- ============================================================================= -- ############################################################################## -- A. 门店班次、人员应休/可打卡、人员历史班次列清理 -- ############################################################################## -- A.1 应休分组表(福利口径:与班次上下班时间解耦) CREATE TABLE IF NOT EXISTS `lq_attendance_rest_group` ( `F_Id` varchar(50) NOT NULL, `F_GroupName` varchar(200) NOT NULL, `F_MonthlyRestDays` int NOT NULL DEFAULT 0, `F_HalfDaySplitRestDays` int NOT NULL DEFAULT 0, `F_RestUnlockCycle` int NOT NULL DEFAULT 0, `F_IsEnabled` int NOT NULL DEFAULT 1, `F_Remark` varchar(500) DEFAULT NULL, `F_SortCode` int NOT NULL DEFAULT 0, `F_CreateTime` datetime DEFAULT NULL, `F_DeleteMark` int DEFAULT NULL, `F_VersionNo` int DEFAULT NULL, `F_LastModifyUserId` varchar(50) DEFAULT NULL, `F_LastModifyUserName` varchar(50) DEFAULT NULL, `F_LastModifyTime` datetime DEFAULT NULL, `F_CreateUserId` varchar(50) DEFAULT NULL, PRIMARY KEY (`F_Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='应休分组(月应休/半天拆分/解锁周期)'; -- A.2 门店默认考勤分组(可选) ALTER TABLE `lq_mdxx` ADD COLUMN `F_AttendanceGroupId` varchar(50) DEFAULT NULL COMMENT '门店默认考勤分组(lq_attendance_group.F_Id)' AFTER `F_TrafficTips`; -- A.3 人员应休分组绑定(依赖 BASE_USER 仍存在 F_AttendanceGroupId 时可用 AFTER;若该列已删,请改为 AFTER F_GW 等后手工执行) ALTER TABLE `BASE_USER` ADD COLUMN `F_AttendanceRestGroupId` varchar(50) DEFAULT NULL COMMENT '应休分组ID;空则沿用门店班次绑定的默认应休分组' AFTER `F_AttendanceGroupId`; -- A.4 人员可打卡门店(JSON 数组字符串) ALTER TABLE `BASE_USER` ADD COLUMN `F_PunchAllowedStoreIds` TEXT NULL COMMENT '可打卡门店ID列表JSON' AFTER `F_AttendanceRestGroupId`; -- ############################################################################## -- B. 班次表应休字段迁出(依赖 A.1 已建 lq_attendance_rest_group,且 lq_attendance_group 仍含旧三列) -- ############################################################################## -- B.1 班次表增加指向默认应休分组的指针列 ALTER TABLE `lq_attendance_group` ADD COLUMN `F_DefaultRestGroupId` varchar(50) DEFAULT NULL COMMENT '默认应休分组(lq_attendance_rest_group.F_Id)' AFTER `F_EarlyLeaveToleranceMinutes`; -- B.2 从旧列复制到应休表(主键 bind_ + 班次 F_Id) INSERT INTO `lq_attendance_rest_group` ( `F_Id`, `F_GroupName`, `F_MonthlyRestDays`, `F_HalfDaySplitRestDays`, `F_RestUnlockCycle`, `F_IsEnabled`, `F_Remark`, `F_SortCode`, `F_CreateTime`, `F_DeleteMark`, `F_VersionNo` ) SELECT CONCAT('bind_', g.`F_Id`), CONCAT(IFNULL(NULLIF(TRIM(g.`F_GroupName`), ''), '班次'), '·默认应休'), IFNULL(g.`F_MonthlyRestDays`, 0), IFNULL(g.`F_HalfDaySplitRestDays`, 0), IFNULL(g.`F_RestUnlockCycle`, 0), 1, NULL, 0, NOW(), IFNULL(g.`F_DeleteMark`, 0), 1 FROM `lq_attendance_group` g WHERE NOT EXISTS ( SELECT 1 FROM `lq_attendance_rest_group` r WHERE r.`F_Id` = CONCAT('bind_', g.`F_Id`) ); -- B.3 回填班次表指针 UPDATE `lq_attendance_group` g SET g.`F_DefaultRestGroupId` = CONCAT('bind_', g.`F_Id`) WHERE (g.`F_DefaultRestGroupId` IS NULL OR g.`F_DefaultRestGroupId` = ''); -- B.4 删除班次表上已迁出的三列(应用须已升级) ALTER TABLE `lq_attendance_group` DROP COLUMN `F_MonthlyRestDays`; ALTER TABLE `lq_attendance_group` DROP COLUMN `F_HalfDaySplitRestDays`; ALTER TABLE `lq_attendance_group` DROP COLUMN `F_RestUnlockCycle`; -- ############################################################################## -- A.5 删除人员表历史班次列(应用须已升级;建议在 B 之后执行,减少不一致窗口) -- ############################################################################## ALTER TABLE `BASE_USER` DROP COLUMN `F_AttendanceGroupId`;