Files
jcgl-dev/dev/sql/apt_rev01/17_it4_columns.sql
T

178 lines
10 KiB
SQL
Raw Normal View History

2026-11-11 18:30:31 +08:00
-- =============================================================================
-- IT-4 入住作业核心补列与状态字典(可重放):CI-02 ~ CI-05。
-- 依据:公寓端/11 §3(表 11-7 / 11-8 / 11-9)、CR-02 §13 表 3-57 验收 18~20、13 表 13-14。
-- 口径:
-- 1) 59 张业务表不变:只补列、不放宽既有事实列语义、不新增 gy_jcxx 状态字段。
-- 2) `checkin_state` / `sync_state` 两条流程态字典按表 11-4 / 11-9 扩展:
-- checkin_state: SUBMITTED/REVIEWING/APPROVED/ROOM_ADJUSTED/REJECTED/CHECKED_IN/CANCELLED/CLOSED
-- sync_state : PENDING/REPORTED/MATCHED/UNMATCHED/TASK_READY
-- 这是**流程态**字典替换(表 11-4),不是新增状态字段;gy_jcxx 的 ryzt/finish_ly 仍只经 apt.duty.state 写入。
-- 3) `gygl_ly_event.event_type` 按 CR-02 表 3-14 增补 ROOM_SWAP(审核期换房的证据事件)。
-- 4) 复用既有列:`audited_by` / `audited_at` 即表 11-7 的 reviewed_by / reviewed_at(不重复建列)。
-- 5) 依赖 00_common.sql 的 apt_add_column_if_missing(与 07_patch_columns.sql 同一辅助)。
-- =============================================================================
-- 1. apt_local_task 申请阶段补列(表 11-7)
CALL apt_add_column_if_missing('apt_local_task', 'device_code',
'device_code VARCHAR(64) NULL COMMENT ''签到终端来源(表 11-7)''');
CALL apt_add_column_if_missing('apt_local_task', 'device_event_id',
'device_event_id VARCHAR(64) NULL COMMENT ''设备侧幂等键(表 11-7)''');
CALL apt_add_column_if_missing('apt_local_task', 'work_no',
'work_no VARCHAR(64) NULL COMMENT ''工号快照(平台匹配输入)''');
CALL apt_add_column_if_missing('apt_local_task', 'name_snapshot',
'name_snapshot VARCHAR(128) NULL COMMENT ''姓名快照(不替代 apt_master_person)''');
CALL apt_add_column_if_missing('apt_local_task', 'reg_id',
'reg_id VARCHAR(64) NULL COMMENT ''关联 apt_person_face_reg''');
CALL apt_add_column_if_missing('apt_local_task', 'reg_state_at_apply',
'reg_state_at_apply VARCHAR(20) NULL COMMENT ''申请时注册态,必须是 CONFIRMED''');
CALL apt_add_column_if_missing('apt_local_task', 'jch',
'jch VARCHAR(32) NULL COMMENT ''机次快照''');
CALL apt_add_column_if_missing('apt_local_task', 'kcsj_snapshot',
'kcsj_snapshot DATETIME(3) NULL COMMENT ''开车时刻快照(不写主数据)''');
CALL apt_add_column_if_missing('apt_local_task', 'verified_ryid',
'verified_ryid VARCHAR(64) NULL COMMENT ''N-38 核验通过的人员''');
CALL apt_add_column_if_missing('apt_local_task', 'verified_at',
'verified_at DATETIME(3) NULL COMMENT ''N-38 核验时刻(≤5 min 才能提交申请)''');
CALL apt_add_column_if_missing('apt_local_task', 'feature_version',
'feature_version BIGINT NULL COMMENT ''核验所用特征版本''');
CALL apt_add_column_if_missing('apt_local_task', 'source',
'source VARCHAR(20) NOT NULL DEFAULT ''DEVICE'' COMMENT ''DEVICE / DUTY / SELF(CR-02 表 3-14)''');
CALL apt_add_column_if_missing('apt_local_task', 'submitted_at',
'submitted_at DATETIME(3) NULL COMMENT ''申请提交时刻''');
CALL apt_add_column_if_missing('apt_local_task', 'occurred_at',
'occurred_at DATETIME(3) NULL COMMENT ''业务发生时刻(设备事件时间,不判日切)''');
CALL apt_add_column_if_missing('apt_local_task', 'review_note',
'review_note VARCHAR(256) NULL COMMENT ''审核说明 / 驳回原因''');
CALL apt_add_column_if_missing('apt_local_task', 'adjusted_by',
'adjusted_by VARCHAR(64) NULL COMMENT ''房间调整操作人''');
CALL apt_add_column_if_missing('apt_local_task', 'adjusted_at',
'adjusted_at DATETIME(3) NULL COMMENT ''房间调整时刻''');
CALL apt_add_column_if_missing('apt_local_task', 'adjust_reason',
'adjust_reason VARCHAR(256) NULL COMMENT ''房间调整理由''');
CALL apt_add_column_if_missing('apt_local_task', 'reported_at',
'reported_at DATETIME(3) NULL COMMENT ''#9 CHECKIN 入队时刻''');
CALL apt_add_column_if_missing('apt_local_task', 'matched_at',
'matched_at DATETIME(3) NULL COMMENT ''#7 匹配结论落库时刻''');
CALL apt_add_column_if_missing('apt_local_task', 'task_ready_at',
'task_ready_at DATETIME(3) NULL COMMENT ''任务就绪(jcsj 复算完成)时刻''');
CALL apt_add_column_if_missing('apt_local_task', 'matched_plan_key',
'matched_plan_key VARCHAR(128) NULL COMMENT ''平台匹配键(仅登记,不替代 jcid)''');
CALL apt_add_column_if_missing('apt_local_task', 'base_kcsj',
'base_kcsj DATETIME(3) NULL COMMENT ''平台补齐的开車时刻(要素非叫乘时刻)''');
CALL apt_add_column_if_missing('apt_local_task', 'base_jcfs',
'base_jcfs VARCHAR(32) NULL COMMENT ''平台补齐的叫乘方式''');
CALL apt_add_column_if_missing('apt_local_task', 'origin_jcsj',
'origin_jcsj DATETIME(3) NULL COMMENT ''本地指定叫乘时刻(锁定时保留)''');
CALL apt_add_column_if_missing('apt_local_task', 'derived_rule_version',
'derived_rule_version BIGINT NULL COMMENT ''jcsj 复算所用规则版本,升级不回溯''');
CALL apt_add_column_if_missing('apt_local_task', 'jllx',
'jllx VARCHAR(8) NULL COMMENT ''1=本地锁定交路要素(D8 例外②)''');
-- 2. 幂等键:设备事件唯一、申请单唯一(表 11-7)
SET @uk_device_event = (SELECT IF(COUNT(*) = 0,
'ALTER TABLE apt_local_task ADD UNIQUE KEY uk_lt_gyid_device_event (gyid, device_code, device_event_id)',
'DO 0')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_local_task'
AND INDEX_NAME = 'uk_lt_gyid_device_event');
PREPARE apt_stmt_uk_de FROM @uk_device_event;
EXECUTE apt_stmt_uk_de;
DEALLOCATE PREPARE apt_stmt_uk_de;
SET @uk_apply = (SELECT IF(COUNT(*) = 0,
'ALTER TABLE apt_local_task ADD UNIQUE KEY uk_lt_gyid_apply (gyid, apply_id)',
'DO 0')
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_local_task'
AND INDEX_NAME = 'uk_lt_gyid_apply');
PREPARE apt_stmt_uk_apply FROM @uk_apply;
EXECUTE apt_stmt_uk_apply;
DEALLOCATE PREPARE apt_stmt_uk_apply;
-- 3. 流程态字典(表 11-4 / 11-9):先删旧 CHECK,再按新字典重建,可重放
SET @drop_checkin = (SELECT IF(COUNT(*) > 0,
'ALTER TABLE apt_local_task DROP CHECK ck_lt_checkin',
'DO 0')
FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_local_task'
AND CONSTRAINT_NAME = 'ck_lt_checkin' AND CONSTRAINT_TYPE = 'CHECK');
PREPARE apt_stmt_drop_ci FROM @drop_checkin;
EXECUTE apt_stmt_drop_ci;
DEALLOCATE PREPARE apt_stmt_drop_ci;
SET @add_checkin = (SELECT IF(COUNT(*) = 0,
'ALTER TABLE apt_local_task ADD CONSTRAINT ck_lt_checkin CHECK (checkin_state IN (''SUBMITTED'',''REVIEWING'',''APPROVED'',''ROOM_ADJUSTED'',''REJECTED'',''CHECKED_IN'',''CANCELLED'',''CLOSED''))',
'DO 0')
FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_local_task'
AND CONSTRAINT_NAME = 'ck_lt_checkin' AND CONSTRAINT_TYPE = 'CHECK');
PREPARE apt_stmt_add_ci FROM @add_checkin;
EXECUTE apt_stmt_add_ci;
DEALLOCATE PREPARE apt_stmt_add_ci;
SET @drop_sync = (SELECT IF(COUNT(*) > 0,
'ALTER TABLE apt_local_task DROP CHECK ck_lt_sync',
'DO 0')
FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_local_task'
AND CONSTRAINT_NAME = 'ck_lt_sync' AND CONSTRAINT_TYPE = 'CHECK');
PREPARE apt_stmt_drop_sync FROM @drop_sync;
EXECUTE apt_stmt_drop_sync;
DEALLOCATE PREPARE apt_stmt_drop_sync;
SET @add_sync = (SELECT IF(COUNT(*) = 0,
'ALTER TABLE apt_local_task ADD CONSTRAINT ck_lt_sync CHECK (sync_state IN (''PENDING'',''REPORTED'',''MATCHED'',''UNMATCHED'',''TASK_READY''))',
'DO 0')
FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_local_task'
AND CONSTRAINT_NAME = 'ck_lt_sync' AND CONSTRAINT_TYPE = 'CHECK');
PREPARE apt_stmt_add_sync FROM @add_sync;
EXECUTE apt_stmt_add_sync;
DEALLOCATE PREPARE apt_stmt_add_sync;
-- 4. gygl_ly_event.event_type 增补 ROOM_SWAP(CR-02 表 3-14;审核期换房证据)
SET @drop_lye = (SELECT IF(COUNT(*) > 0,
'ALTER TABLE gygl_ly_event DROP CHECK ck_lye_type',
'DO 0')
FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE() AND TABLE_NAME = 'gygl_ly_event'
AND CONSTRAINT_NAME = 'ck_lye_type' AND CONSTRAINT_TYPE = 'CHECK');
PREPARE apt_stmt_drop_lye FROM @drop_lye;
EXECUTE apt_stmt_drop_lye;
DEALLOCATE PREPARE apt_stmt_drop_lye;
SET @add_lye = (SELECT IF(COUNT(*) = 0,
'ALTER TABLE gygl_ly_event ADD CONSTRAINT ck_lye_type CHECK (event_type IN (''CHECKIN'',''CHECKOUT'',''ROOM_SWAP''))',
'DO 0')
FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE() AND TABLE_NAME = 'gygl_ly_event'
AND CONSTRAINT_NAME = 'ck_lye_type' AND CONSTRAINT_TYPE = 'CHECK');
PREPARE apt_stmt_add_lye FROM @add_lye;
EXECUTE apt_stmt_add_lye;
DEALLOCATE PREPARE apt_stmt_add_lye;
-- 5. 校验
SELECT '=== IT-4 apt_local_task 补列(应 27 行)===' AS section;
SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_local_task'
AND COLUMN_NAME IN ('device_code','device_event_id','work_no','name_snapshot','reg_id',
'reg_state_at_apply','jch','kcsj_snapshot','verified_ryid','verified_at','feature_version',
'source','submitted_at','occurred_at','review_note','adjusted_by','adjusted_at','adjust_reason',
'reported_at','matched_at','task_ready_at','matched_plan_key','base_kcsj','base_jcfs',
'origin_jcsj','derived_rule_version','jllx')
ORDER BY COLUMN_NAME;
SELECT '=== 流程态字典 CHECK(checkin_state 应 8 值 / sync_state 应 5 值)===' AS section;
SELECT CONSTRAINT_NAME, CHECK_CLAUSE
FROM information_schema.CHECK_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE()
AND CONSTRAINT_NAME IN ('ck_lt_checkin','ck_lt_sync','ck_lye_type')
ORDER BY CONSTRAINT_NAME;
SELECT '=== 幂等唯一键(应 2 行)===' AS section;
SELECT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS cols
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_local_task'
AND INDEX_NAME IN ('uk_lt_gyid_device_event','uk_lt_gyid_apply')
GROUP BY INDEX_NAME;