2026-05-06_考勤扩展_全量合并.sql 4.76 KB
-- =============================================================================
-- 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`;