1 parent
417c076465
commit
35751b4f00
144 files changed
+13905
-342
No files matched your search
@@ -0,0 +1,55 @@
|
||||
-- =============================================================================
|
||||
-- IT-2 增量补列(幂等):把 公寓端/04 表 4-5 / 4-7 的既定业务字段补齐到 IT-0 [推断] 表。
|
||||
-- 前提:先执行 00_common.sql 建立 apt_add_column_if_missing。
|
||||
-- 纪律:Q-20 / Q-40 / Q-43 / Q-48 未决项仍不新增列、不启用(表 13-10 用 JSON 兜底);
|
||||
-- 本次只补设计文档已经明确列出的字段,不改 59 张表的口径与主键/唯一键/索引。
|
||||
-- =============================================================================
|
||||
|
||||
-- 交路(表 4-5):jch/qd/zd 复用 route_name/start_station/end_station,enabled 复用 state,
|
||||
-- sourceVersion 复用 source_version;其余 4 个字段为设计既定但 IT-0 未建的列。
|
||||
CALL apt_add_column_if_missing('apt_master_route', 'jcsj',
|
||||
'jcsj DATETIME(3) NULL COMMENT ''叫乘时刻基线;权威值恒由公寓复算(D8)''');
|
||||
CALL apt_add_column_if_missing('apt_master_route', 'lysj',
|
||||
'lysj DATETIME(3) NULL COMMENT ''离寓时刻''');
|
||||
CALL apt_add_column_if_missing('apt_master_route', 'cclx',
|
||||
'cclx VARCHAR(32) NULL COMMENT ''车次类型''');
|
||||
CALL apt_add_column_if_missing('apt_master_route', 'bz',
|
||||
'bz VARCHAR(512) NULL COMMENT ''备注''');
|
||||
|
||||
-- 房间运行时事实(表 4-7 #4 本地可编辑属性);快照字段仍在 apt_master_room,不在此表。
|
||||
CALL apt_add_column_if_missing('gy_rooms', 'room_type',
|
||||
'room_type VARCHAR(32) NULL COMMENT ''本地房型''');
|
||||
CALL apt_add_column_if_missing('gy_rooms', 'room_dept',
|
||||
'room_dept VARCHAR(64) NULL COMMENT ''所属部门''');
|
||||
CALL apt_add_column_if_missing('gy_rooms', 'room_order',
|
||||
'room_order INT NOT NULL DEFAULT 0 COMMENT ''展示排序''');
|
||||
CALL apt_add_column_if_missing('gy_rooms', 'room_dir',
|
||||
'room_dir VARCHAR(32) NULL COMMENT ''朝向''');
|
||||
CALL apt_add_column_if_missing('gy_rooms', 'room_face',
|
||||
'room_face VARCHAR(32) NULL COMMENT ''方位''');
|
||||
CALL apt_add_column_if_missing('gy_rooms', 'bed_numbers',
|
||||
'bed_numbers VARCHAR(64) NULL COMMENT ''床位号集合(本地展示)''');
|
||||
|
||||
-- 修复历史执行中因 Windows PowerShell 5.1 ASCII 管道损坏的列注释。
|
||||
-- 只重置元数据,列类型/默认值/主键/索引口径不变;可重复执行。
|
||||
ALTER TABLE apt_master_route
|
||||
MODIFY COLUMN jcsj DATETIME(3) NULL COMMENT '叫乘时刻基线;权威值恒由公寓复算(D8)',
|
||||
MODIFY COLUMN lysj DATETIME(3) NULL COMMENT '离寓时刻',
|
||||
MODIFY COLUMN cclx VARCHAR(32) NULL COMMENT '车次类型',
|
||||
MODIFY COLUMN bz VARCHAR(512) NULL COMMENT '备注';
|
||||
|
||||
ALTER TABLE gy_rooms
|
||||
MODIFY COLUMN room_type VARCHAR(32) NULL COMMENT '本地房型',
|
||||
MODIFY COLUMN room_dept VARCHAR(64) NULL COMMENT '所属部门',
|
||||
MODIFY COLUMN room_order INT NOT NULL DEFAULT 0 COMMENT '展示排序',
|
||||
MODIFY COLUMN room_dir VARCHAR(32) NULL COMMENT '朝向',
|
||||
MODIFY COLUMN room_face VARCHAR(32) NULL COMMENT '方位',
|
||||
MODIFY COLUMN bed_numbers VARCHAR(64) NULL COMMENT '床位号集合(本地展示)';
|
||||
|
||||
SELECT '=== IT-2 补列结果(含注释,中文不应为问号)===' AS section;
|
||||
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND ((TABLE_NAME = 'apt_master_route' AND COLUMN_NAME IN ('jcsj','lysj','cclx','bz'))
|
||||
OR (TABLE_NAME = 'gy_rooms' AND COLUMN_NAME IN ('room_type','room_dept','room_order','room_dir','room_face','bed_numbers')))
|
||||
ORDER BY TABLE_NAME, COLUMN_NAME;
|
||||
@@ -0,0 +1,109 @@
|
||||
-- =============================================================================
|
||||
-- IT-2 / DV-2 Mock 灌数(可重放):3 交路 / 5 房间 / 5 人员 / 2 天计划。
|
||||
-- 依据:公寓端/09 表 9-16(Mock source='LOCAL'、source_version=0)、表 13-12、表 7-7 步骤 2。
|
||||
-- 所有数据标 LOCAL / version=0,页面须显示「非平台下发」;不得冒充真实平台下行。
|
||||
-- =============================================================================
|
||||
SET @apt_gyid = 'APT-REV01-001';
|
||||
|
||||
-- 1. 主数据版本快照:6 个域均 APPLIED / LOCAL / source_version=0
|
||||
INSERT INTO apt_master_version (gyid, domain, source_version, source, state, applied_at, remark, deleted)
|
||||
VALUES
|
||||
(@apt_gyid, 'APARTMENT', 0, 'LOCAL', 'APPLIED', NOW(3), 'IT-2 Mock', 0),
|
||||
(@apt_gyid, 'ROOM', 0, 'LOCAL', 'APPLIED', NOW(3), 'IT-2 Mock', 0),
|
||||
(@apt_gyid, 'PERSON', 0, 'LOCAL', 'APPLIED', NOW(3), 'IT-2 Mock', 0),
|
||||
(@apt_gyid, 'ROUTE', 0, 'LOCAL', 'APPLIED', NOW(3), 'IT-2 Mock', 0),
|
||||
(@apt_gyid, 'RULE', 0, 'LOCAL', 'APPLIED', NOW(3), 'IT-2 Mock', 0),
|
||||
(@apt_gyid, 'HOLIDAY', 0, 'LOCAL', 'APPLIED', NOW(3), 'IT-2 Mock', 0)
|
||||
ON DUPLICATE KEY UPDATE source = VALUES(source), state = VALUES(state), remark = VALUES(remark);
|
||||
|
||||
-- 2. 3 条交路(jlid 唯一;kcsj 为开车时刻,jcsj 为基线,权威值由复算服务给出)
|
||||
INSERT INTO apt_master_route
|
||||
(gyid, jlid, cc, kcsj, jcsj, lysj, route_name, start_station, end_station,
|
||||
cclx, bz, state, stop_reason, source_version, deleted)
|
||||
VALUES
|
||||
(@apt_gyid, 'JL-001', 'G101', DATE_ADD(CURDATE(), INTERVAL 8 HOUR),
|
||||
DATE_ADD(CURDATE(), INTERVAL 6 HOUR), DATE_ADD(CURDATE(), INTERVAL 5 HOUR),
|
||||
'北京南-济南西', '北京南', '济南西', 'HIGH_SPEED', 'IT-2 Mock', 'ACTIVE', NULL, 0, 0),
|
||||
(@apt_gyid, 'JL-002', 'G203', DATE_ADD(CURDATE(), INTERVAL 12 HOUR),
|
||||
DATE_ADD(CURDATE(), INTERVAL 10 HOUR), DATE_ADD(CURDATE(), INTERVAL 9 HOUR),
|
||||
'济南西-上海虹桥', '济南西', '上海虹桥', 'HIGH_SPEED', 'IT-2 Mock', 'ACTIVE', NULL, 0, 0),
|
||||
(@apt_gyid, 'JL-003', 'K51', DATE_ADD(CURDATE(), INTERVAL 18 HOUR),
|
||||
DATE_ADD(CURDATE(), INTERVAL 16 HOUR), DATE_ADD(CURDATE(), INTERVAL 15 HOUR),
|
||||
'北京-青岛北', '北京', '青岛北', 'NORMAL_SPEED', 'IT-2 Mock', 'STOPPED', 'Mock 停用样例', 0, 0)
|
||||
ON DUPLICATE KEY UPDATE cc = VALUES(cc), bz = VALUES(bz),
|
||||
route_name = VALUES(route_name), start_station = VALUES(start_station),
|
||||
end_station = VALUES(end_station), stop_reason = VALUES(stop_reason);
|
||||
|
||||
-- 3. 5 个房间:平台基线 + 运行时房态各一条
|
||||
INSERT INTO apt_master_room
|
||||
(gyid, room_id, room_no, room_floor, bed_count, orientation, room_type, state, source_version, deleted)
|
||||
VALUES
|
||||
(@apt_gyid, 'ROOM-201', '201', '2', 2, 'SOUTH', 'DOUBLE', 'ACTIVE', 0, 0),
|
||||
(@apt_gyid, 'ROOM-202', '202', '2', 2, 'NORTH', 'DOUBLE', 'ACTIVE', 0, 0),
|
||||
(@apt_gyid, 'ROOM-301', '301', '3', 3, 'SOUTH', 'TRIPLE', 'ACTIVE', 0, 0),
|
||||
(@apt_gyid, 'ROOM-302', '302', '3', 2, 'EAST', 'DOUBLE', 'ACTIVE', 0, 0),
|
||||
(@apt_gyid, 'ROOM-303', '303', '3', 1, 'WEST', 'SINGLE', 'ACTIVE', 0, 0)
|
||||
ON DUPLICATE KEY UPDATE room_no = VALUES(room_no), room_floor = VALUES(room_floor);
|
||||
|
||||
INSERT INTO gy_rooms
|
||||
(gyid, room_id, room_no, room_floor, room_status, in_person_count, state_version,
|
||||
room_type, room_order, room_dir, bed_numbers, deleted)
|
||||
VALUES
|
||||
(@apt_gyid, 'ROOM-201', '201', '2', '1', 0, 1, 'DOUBLE', 1, 'SOUTH', '201-1,201-2', 0),
|
||||
(@apt_gyid, 'ROOM-202', '202', '2', '5', 1, 1, 'DOUBLE', 2, 'NORTH', '202-1,202-2', 0),
|
||||
(@apt_gyid, 'ROOM-301', '301', '3', '2', 3, 1, 'TRIPLE', 3, 'SOUTH', '301-1,301-2,301-3', 0),
|
||||
(@apt_gyid, 'ROOM-302', '302', '3', '3', 0, 1, 'DOUBLE', 4, 'EAST', '302-1,302-2', 0),
|
||||
(@apt_gyid, 'ROOM-303', '303', '3', '4', 0, 1, 'SINGLE', 5, 'WEST', '303-1', 0)
|
||||
ON DUPLICATE KEY UPDATE room_no = VALUES(room_no), room_floor = VALUES(room_floor);
|
||||
|
||||
-- 4. 5 名人员(xm 为平台快照字段,本地改须返回 40904)
|
||||
INSERT INTO apt_master_person
|
||||
(gyid, ryid, xm, work_no, dept_code, person_category, state, source_version, deleted)
|
||||
VALUES
|
||||
(@apt_gyid, 'RY-001', '张三', 'W001', 'D01', 'TRANSIENT', 'ACTIVE', 0, 0),
|
||||
(@apt_gyid, 'RY-002', '李四', 'W002', 'D01', 'TRANSIENT', 'ACTIVE', 0, 0),
|
||||
(@apt_gyid, 'RY-003', '王五', 'W003', 'D02', 'LONG_TERM', 'ACTIVE', 0, 0),
|
||||
(@apt_gyid, 'RY-004', '赵六', 'W004', 'D02', 'TRANSIENT', 'ACTIVE', 0, 0),
|
||||
(@apt_gyid, 'RY-005', '钱七', 'W005', 'D03', 'TRANSIENT', 'ACTIVE', 0, 0)
|
||||
ON DUPLICATE KEY UPDATE xm = VALUES(xm), dept_code = VALUES(dept_code);
|
||||
|
||||
-- 5. 2 天计划(jcsj 仅基线,computed_jcsj 为公寓复算权威值)
|
||||
INSERT INTO gy_syn_jcxx
|
||||
(gyid, jcid, jlid, cc, ryid, xm, fjh, kcsj, jcsj, computed_jcsj,
|
||||
plan_version, sync_state, source_version, deleted)
|
||||
VALUES
|
||||
(@apt_gyid, 'PLAN-D1-001', 'JL-001', 'G101', 'RY-001', '张三', '201',
|
||||
DATE_ADD(CURDATE(), INTERVAL 8 HOUR), DATE_ADD(CURDATE(), INTERVAL 6 HOUR),
|
||||
DATE_ADD(CURDATE(), INTERVAL 6 HOUR), 1, 'SYNCED', 0, 0),
|
||||
(@apt_gyid, 'PLAN-D2-001', 'JL-002', 'G203', 'RY-002', '李四', '202',
|
||||
DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 12 HOUR),
|
||||
DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 10 HOUR),
|
||||
DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 10 HOUR), 1, 'SYNCED', 0, 0)
|
||||
ON DUPLICATE KEY UPDATE xm = VALUES(xm), fjh = VALUES(fjh);
|
||||
|
||||
SELECT '=== IT-2 Mock 数据量(交路/房间/人员/计划/版本)===' AS section;
|
||||
SELECT 'route' AS domain, COUNT(*) AS cnt FROM apt_master_route WHERE gyid = @apt_gyid AND deleted = 0
|
||||
UNION ALL SELECT 'room', COUNT(*) FROM gy_rooms WHERE gyid = @apt_gyid AND deleted = 0
|
||||
UNION ALL SELECT 'person', COUNT(*) FROM apt_master_person WHERE gyid = @apt_gyid AND deleted = 0
|
||||
UNION ALL SELECT 'plan', COUNT(*) FROM gy_syn_jcxx WHERE gyid = @apt_gyid AND deleted = 0
|
||||
UNION ALL SELECT 'version', COUNT(*) FROM apt_master_version
|
||||
WHERE gyid = @apt_gyid AND state = 'APPLIED' AND source = 'LOCAL';
|
||||
|
||||
-- 6. 版本标记纪律校验(公寓端/09 表 9-16、08 R-03)
|
||||
SELECT '=== 版本标记:LOCAL / source_version=0 / APPLIED(应为 6)===' AS section;
|
||||
SELECT COUNT(*) AS local_applied_domains
|
||||
FROM apt_master_version
|
||||
WHERE gyid = @apt_gyid AND source = 'LOCAL' AND source_version = 0
|
||||
AND state = 'APPLIED' AND deleted = 0;
|
||||
|
||||
SELECT '=== 不得冒充平台下发(应为 0)===' AS section;
|
||||
SELECT COUNT(*) AS fake_platform_rows
|
||||
FROM apt_master_version
|
||||
WHERE gyid = @apt_gyid AND source = 'PLATFORM' AND source_version = 0 AND deleted = 0;
|
||||
|
||||
SELECT '=== 各域版本明细(页面须显示「非平台下发」)===' AS section;
|
||||
SELECT domain, source, source_version AS sourceVersion, state,
|
||||
CASE WHEN source = 'LOCAL' THEN '非平台下发' ELSE '平台下发' END AS sourceLabel
|
||||
FROM apt_master_version
|
||||
WHERE gyid = @apt_gyid AND deleted = 0
|
||||
ORDER BY domain;
|
||||
@@ -0,0 +1,58 @@
|
||||
-- =============================================================================
|
||||
-- IT-2 权限点种子(可重放):M1 交路 CRUD + M2 房间路径权限点。
|
||||
-- 说明:3003 在 IT-1 为置灰预置,IT-2 起启用;3004~3006 仍保持置灰不关联角色。
|
||||
-- IT-1 校验段 grey_permission_bound(3003~3006)在 IT-2 后为 1 属预期变化。
|
||||
-- =============================================================================
|
||||
|
||||
-- 1. 启用 IT-1 预置的房间列表权限点
|
||||
UPDATE sys_menu SET visible = '0', status = '0', remark = 'IT-2 / M2 启用'
|
||||
WHERE menu_id = 3003 AND perms = 'apt:room:list';
|
||||
|
||||
-- 2. 新增权限点 3007~3015
|
||||
INSERT INTO sys_menu
|
||||
(menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
|
||||
VALUES
|
||||
(3007, '交路详情', 3000, 7, '', NULL, NULL, '', 1, 0, 'F', '0', '0',
|
||||
'apt:route:query', '#', 'IT-2', NOW(), 'IT-2 / M1 启用'),
|
||||
(3008, '交路新增', 3000, 8, '', NULL, NULL, '', 1, 0, 'F', '0', '0',
|
||||
'apt:route:add', '#', 'IT-2', NOW(), 'IT-2 / M1 启用;受 D7 约束,本期默认关闭'),
|
||||
(3009, '交路编辑', 3000, 9, '', NULL, NULL, '', 1, 0, 'F', '0', '0',
|
||||
'apt:route:edit', '#', 'IT-2', NOW(), 'IT-2 / M1 启用;受 D7 约束'),
|
||||
(3010, '交路启停', 3000, 10, '', NULL, NULL, '', 1, 0, 'F', '0', '0',
|
||||
'apt:route:changeStatus', '#', 'IT-2', NOW(), 'IT-2 / M1 启用'),
|
||||
(3011, '房间详情', 3000, 11, '', NULL, NULL, '', 1, 0, 'F', '0', '0',
|
||||
'apt:room:query', '#', 'IT-2', NOW(), 'IT-2 / M2 登记'),
|
||||
(3012, '房间编辑', 3000, 12, '', NULL, NULL, '', 1, 0, 'F', '0', '0',
|
||||
'apt:room:edit', '#', 'IT-2', NOW(), 'IT-2 / M2 登记'),
|
||||
(3013, '房间停复', 3000, 13, '', NULL, NULL, '', 1, 0, 'F', '0', '0',
|
||||
'apt:room:changeStatus', '#', 'IT-2', NOW(), 'IT-2 / M2 登记'),
|
||||
(3014, '房间新增', 3000, 14, '', NULL, NULL, '', 1, 0, 'F', '1', '1',
|
||||
'apt:room:add', '#', 'IT-2', NOW(), 'G-01/G-04 补齐前保持置灰'),
|
||||
(3015, '主数据版本', 3000, 15, '', NULL, NULL, '', 1, 0, 'F', '0', '0',
|
||||
'apt:master:version', '#', 'IT-2', NOW(),
|
||||
'IT-2 / Mock 版本查询;表 4-17 权威权限点为 apt:ops:health,本点为兼容登记')
|
||||
ON DUPLICATE KEY UPDATE menu_name = VALUES(menu_name), perms = VALUES(perms),
|
||||
remark = VALUES(remark);
|
||||
|
||||
-- 3. 关联超管角色(显式留痕;超管本身已有 *:*:*)
|
||||
-- 3014 为置灰项不关联;3015 为本轮主数据版本点,需显式留痕
|
||||
INSERT INTO sys_role_menu (role_id, menu_id)
|
||||
SELECT 1, m.menu_id FROM sys_menu m
|
||||
WHERE (m.menu_id BETWEEN 3007 AND 3013 OR m.menu_id = 3015)
|
||||
AND NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 1 AND rm.menu_id = m.menu_id);
|
||||
|
||||
-- 4. 校验
|
||||
SELECT '=== IT-2 权限点 ===' AS section;
|
||||
SELECT menu_id, perms, visible, status, remark FROM sys_menu WHERE menu_id BETWEEN 3000 AND 3015 ORDER BY menu_id;
|
||||
SELECT '=== 置灰项是否仍未关联角色(3004~3006 / 3014 应为 0)===' AS section;
|
||||
SELECT COUNT(*) AS grey_bound FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE m.menu_id IN (3004, 3005, 3006, 3014);
|
||||
SELECT '=== 主数据版本权限点已关联超管(应为 1)===' AS section;
|
||||
SELECT COUNT(*) AS version_permission_bound
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE rm.role_id = 1 AND m.menu_id = 3015 AND m.perms = 'apt:master:version';
|
||||
SELECT '=== M0 验收账号仍无公寓端权限点(应为 0)===' AS section;
|
||||
SELECT COUNT(*) AS apt_permission_count
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE rm.role_id = 300 AND (m.perms LIKE 'apt:%' OR m.perms LIKE 'duty:%' OR m.perms = '*:*:*');
|
||||
@@ -0,0 +1,75 @@
|
||||
-- =============================================================================
|
||||
-- IT-2 前端页面菜单种子(可重放):为公寓端 4 个已落地 Vue 页面登记 C 类型菜单。
|
||||
-- 依据:公寓端/02 §2.5、16 第 9 章、04 表 4-6 / 4-8 / 4-17、13 表 13-12。
|
||||
-- 前提:09_it1_permissions.sql 已建 3000 父目录;12_it2_permissions.sql 已建 F 权限点。
|
||||
--
|
||||
-- 口径:
|
||||
-- 1) 只新增 menu_type='C' 的页面菜单(3101~3104),不改 3000 目录、不改任何 F 权限点,
|
||||
-- 不动 59 张业务表;重复执行不产生重复数据。
|
||||
-- 2) 路由由后端 getRouters 下发,component 走前端 loadView('@/views/' + component),
|
||||
-- 与 system/user 等既有页面同构;不在 constantRoutes 里硬编码业务页面。
|
||||
-- 3) 详情页 /apt/route-detail/index/:id、/apt/room-detail/index/:id 属前端
|
||||
-- dynamicRoutes(hidden + permissions),不建 C 菜单、不出现在侧边栏。
|
||||
-- 4) 仅登记「后端接口已就绪」的 4 个页面。叫乘、人员、设备、语音、入住、
|
||||
-- 消费/充值/菜品等仅设计未实现,按 13 表 13-29「预埋不上线」不建菜单、不建页面;
|
||||
-- IT-9~IT-11 账务域更是明文「不开接口、不建包、权限点置灰」。
|
||||
-- 5) C 菜单 perms 留空:菜单可见性由 sys_role_menu 控制,按钮级权限由 F 权限点控制。
|
||||
-- =============================================================================
|
||||
|
||||
-- 1. 页面菜单(C):父目录 3000(path='apt'),完整路由为 /apt/<path>
|
||||
INSERT INTO sys_menu
|
||||
(menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
|
||||
VALUES
|
||||
(3101, '交路管理', 3000, 1, 'route', 'apt/route/index', '', '', 1, 0, 'C', '0', '0',
|
||||
'', 'guide', 'IT-2', NOW(),
|
||||
'IT-2 / M1 交路列表页;对应 /apt/route/** 7 接口;按钮权限 3001/3007~3010'),
|
||||
(3102, '房间管理', 3000, 2, 'room', 'apt/room/index', '', '', 1, 0, 'C', '0', '0',
|
||||
'', 'build', 'IT-2', NOW(),
|
||||
'IT-2 / M2 房间列表页;对应 /apt/room/** 5 接口;按钮权限 3003/3011~3014'),
|
||||
(3103, '主数据版本', 3000, 3, 'version', 'apt/master/version/index', '', '', 1, 0, 'C', '0', '0',
|
||||
'', 'clipboard', 'IT-2', NOW(),
|
||||
'IT-2 版本只读台账;对应 /apt/master/versions;权限口径 apt:ops:health / apt:master:version'),
|
||||
(3104, '连通性自检', 3000, 4, 'connectivity', 'apt/ops/connectivity/index', '', '', 1, 0, 'C', '0', '0',
|
||||
'', 'monitor', 'IT-2', NOW(),
|
||||
'IT-0~IT-1 自检页;对应 /apt/ops/connectivity/**;接口 @Anonymous + 开关 + 回环双限')
|
||||
ON DUPLICATE KEY UPDATE menu_name = VALUES(menu_name), parent_id = VALUES(parent_id),
|
||||
order_num = VALUES(order_num), path = VALUES(path), component = VALUES(component),
|
||||
menu_type = VALUES(menu_type), visible = VALUES(visible), status = VALUES(status),
|
||||
icon = VALUES(icon), remark = VALUES(remark);
|
||||
|
||||
-- 2. 关联超管角色(超管本身已有 *:*:*,此处为 getRouters 下发与审计留痕)
|
||||
INSERT INTO sys_role_menu (role_id, menu_id)
|
||||
SELECT 1, m.menu_id FROM sys_menu m
|
||||
WHERE m.menu_id BETWEEN 3101 AND 3104
|
||||
AND NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 1 AND rm.menu_id = m.menu_id);
|
||||
|
||||
-- 3. 校验
|
||||
SELECT '=== IT-2 前端页面菜单(应为 4 条 C)===' AS section;
|
||||
SELECT menu_id, menu_name, parent_id, path, component, menu_type, visible, status, icon
|
||||
FROM sys_menu WHERE menu_id BETWEEN 3101 AND 3104 ORDER BY menu_id;
|
||||
|
||||
SELECT '=== 组件路径(须与 RuoYi-Vue2-master/src/views/apt/** 一致)===' AS section;
|
||||
SELECT menu_id, CONCAT('src/views/', component, '.vue') AS vue_file
|
||||
FROM sys_menu WHERE menu_id BETWEEN 3101 AND 3104 ORDER BY menu_id;
|
||||
|
||||
SELECT '=== C 菜单是否全部关联超管(应为 4)===' AS section;
|
||||
SELECT COUNT(*) AS admin_frontend_menu_bound
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE rm.role_id = 1 AND m.menu_id BETWEEN 3101 AND 3104 AND m.menu_type = 'C';
|
||||
|
||||
SELECT '=== 公寓端菜单树构成(应 M=1 / C=4 / F=15)===' AS section;
|
||||
SELECT menu_type, COUNT(*) AS cnt
|
||||
FROM sys_menu
|
||||
WHERE menu_id = 3000 OR parent_id = 3000
|
||||
GROUP BY menu_type ORDER BY menu_type;
|
||||
|
||||
SELECT '=== 置灰权限点是否仍未关联角色(3004~3006 / 3014 应为 0)===' AS section;
|
||||
SELECT COUNT(*) AS grey_bound
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE m.menu_id IN (3004, 3005, 3006, 3014);
|
||||
|
||||
SELECT '=== M0 验收账号仍无公寓端权限点(应为 0)===' AS section;
|
||||
SELECT COUNT(*) AS apt_permission_count
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE rm.role_id = 300 AND (m.perms LIKE 'apt:%' OR m.perms LIKE 'duty:%' OR m.perms = '*:*:*');
|
||||
@@ -0,0 +1,111 @@
|
||||
-- =============================================================================
|
||||
-- IT-3 补列(可重放):人脸注册「回执态」字段 + §12 设备范围字段。
|
||||
-- 依据:公寓端/10 §2(表 10-2 / 10-3)、03-数据设计、CR-02 表 3-49 / 3-66、13 表 13-13。
|
||||
-- 口径:
|
||||
-- 1) 59 张业务表不变:只补列,不建表、不删列、不改既有 CHECK 与唯一键。
|
||||
-- 2) DV-3「注册态与回执态字段」= reg_state / upload_state / dispatch_state / verdict
|
||||
-- + platform_version;实库已有前四项与 verdict_version,仅缺 platform_version。
|
||||
-- 3) 平台回执为「拉升回」(CR-C07 零回调),platform_version 仅承载 #2 personRegVerdicts[]
|
||||
-- 的 platformVersion,不参与注册生效判定(生效点恒为值班员 CONFIRM)。
|
||||
-- 4) 表 10-2 的 gy_sb §12 补列(device_class / face_scope_value / face_cache_enabled)
|
||||
-- 本期只建列并登记 Mock 设备;按范围选设备与缓存开关的执行逻辑属 IT-7(N-26/N-27)。
|
||||
-- =============================================================================
|
||||
|
||||
-- 1. apt_person_face_reg.platform_version —— #2 回执版本
|
||||
SET @ddl_reg = (SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE apt_person_face_reg ADD COLUMN platform_version BIGINT NOT NULL DEFAULT 0 COMMENT ''平台回执版本(#2 personRegVerdicts[].platformVersion)'' AFTER verdict_version',
|
||||
'DO 0')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'apt_person_face_reg'
|
||||
AND COLUMN_NAME = 'platform_version');
|
||||
PREPARE apt_stmt_reg FROM @ddl_reg;
|
||||
EXECUTE apt_stmt_reg;
|
||||
DEALLOCATE PREPARE apt_stmt_reg;
|
||||
|
||||
-- 2. apt_master_person.face_platform_version —— 主档人脸回执版本
|
||||
SET @ddl_person = (SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE apt_master_person ADD COLUMN face_platform_version BIGINT NOT NULL DEFAULT 0 COMMENT ''人脸主档平台回执版本'' AFTER feature_version',
|
||||
'DO 0')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'apt_master_person'
|
||||
AND COLUMN_NAME = 'face_platform_version');
|
||||
PREPARE apt_stmt_person FROM @ddl_person;
|
||||
EXECUTE apt_stmt_person;
|
||||
DEALLOCATE PREPARE apt_stmt_person;
|
||||
|
||||
-- 3. apt_person_face_reg.unit_code —— N-34 必填要素(N-36 允许值班员修正)
|
||||
SET @ddl_unit = (SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE apt_person_face_reg ADD COLUMN unit_code VARCHAR(64) NULL COMMENT ''所属单位编码(N-34 必填要素,N-36 可修正)'' AFTER name',
|
||||
'DO 0')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'apt_person_face_reg'
|
||||
AND COLUMN_NAME = 'unit_code');
|
||||
PREPARE apt_stmt_unit FROM @ddl_unit;
|
||||
EXECUTE apt_stmt_unit;
|
||||
DEALLOCATE PREPARE apt_stmt_unit;
|
||||
|
||||
-- 4. gy_sb.device_class —— 表 10-2 设备类别(CHECKIN / CONSUME / CALL / TABLET / OTHER)
|
||||
-- 表 10-15 / 10-16 的目标集计算依赖本列;IT-3 只建列 + 种子登记,
|
||||
-- 按范围选设备的逻辑属 IT-7(N-26 / N-27),本期不启用。
|
||||
SET @ddl_sb_class = (SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE gy_sb ADD COLUMN device_class VARCHAR(20) NOT NULL DEFAULT ''OTHER'' COMMENT ''设备类别 CHECKIN/CONSUME/CALL/TABLET/OTHER;IT-7 启用'' AFTER device_type',
|
||||
'DO 0')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'gy_sb'
|
||||
AND COLUMN_NAME = 'device_class');
|
||||
PREPARE apt_stmt_sb_class FROM @ddl_sb_class;
|
||||
EXECUTE apt_stmt_sb_class;
|
||||
DEALLOCATE PREPARE apt_stmt_sb_class;
|
||||
|
||||
-- 5. gy_sb.face_scope_value —— 表 10-2 可见范围取值(房间号 / 类别白名单 / 区域编码)
|
||||
-- 与既有 face_scope_ref(IT-2 §12 预置引用列)并存:本期只建列,取值由 IT-7 N-27 写入。
|
||||
SET @ddl_sb_value = (SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE gy_sb ADD COLUMN face_scope_value VARCHAR(256) NULL COMMENT ''可见范围取值:房间号 / 类别白名单 / 区域编码;IT-7 启用'' AFTER face_scope_ref',
|
||||
'DO 0')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'gy_sb'
|
||||
AND COLUMN_NAME = 'face_scope_value');
|
||||
PREPARE apt_stmt_sb_value FROM @ddl_sb_value;
|
||||
EXECUTE apt_stmt_sb_value;
|
||||
DEALLOCATE PREPARE apt_stmt_sb_value;
|
||||
|
||||
-- 6. gy_sb.face_cache_enabled —— 表 10-2 是否允许缓存人脸(平板等临时拉取设备为 0)
|
||||
SET @ddl_sb_cache = (SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE gy_sb ADD COLUMN face_cache_enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''是否允许缓存人脸;TABLET 等临时拉取设备须为 0'' AFTER face_scope_value',
|
||||
'DO 0')
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'gy_sb'
|
||||
AND COLUMN_NAME = 'face_cache_enabled');
|
||||
PREPARE apt_stmt_sb_cache FROM @ddl_sb_cache;
|
||||
EXECUTE apt_stmt_sb_cache;
|
||||
DEALLOCATE PREPARE apt_stmt_sb_cache;
|
||||
|
||||
-- 7. 校验
|
||||
SELECT '=== IT-3 回执态列(应 3 行)===' AS section;
|
||||
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND ( (TABLE_NAME = 'apt_person_face_reg' AND COLUMN_NAME IN ('platform_version','unit_code'))
|
||||
OR (TABLE_NAME = 'apt_master_person' AND COLUMN_NAME = 'face_platform_version'))
|
||||
ORDER BY TABLE_NAME, COLUMN_NAME;
|
||||
|
||||
SELECT '=== §12 设备范围补列(应 3 行 device_class/face_scope_value/face_cache_enabled)===' AS section;
|
||||
SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'gy_sb'
|
||||
AND COLUMN_NAME IN ('device_class','face_scope_value','face_cache_enabled')
|
||||
ORDER BY ORDINAL_POSITION;
|
||||
|
||||
SELECT '=== 注册双状态链 CHECK 未被改动(应 5 行 state/verdict/upload/dispatch/report)===' AS section;
|
||||
SELECT CONSTRAINT_NAME, CHECK_CLAUSE
|
||||
FROM information_schema.CHECK_CONSTRAINTS
|
||||
WHERE CONSTRAINT_SCHEMA = DATABASE()
|
||||
AND CONSTRAINT_NAME IN ('ck_facereg_state','ck_facereg_verdict','ck_facereg_upload','ck_facereg_dispatch','ck_facereg_report')
|
||||
ORDER BY CONSTRAINT_NAME;
|
||||
@@ -0,0 +1,56 @@
|
||||
-- =============================================================================
|
||||
-- IT-3 / DV-3 Mock 设备灌数(可重放):1 签到终端 + 1 平板 + 1 停用签到终端。
|
||||
-- 依据:公寓端/10 表 10-2(gy_sb §12 补列)、表 10-15 / 10-16(设备类别→可见范围矩阵)、
|
||||
-- 表 10-26 N-34(申请设备须在公寓设备档案登记)、13 表 13-13。
|
||||
-- 口径:
|
||||
-- 1) 只登记设备档案,不伪造心跳与缓存台账(gy_sb_xt 由设备真实心跳写入,IT-7 才读)。
|
||||
-- 2) 签到终端 CHECKIN / ALL_ACTIVE / 允许缓存;平板 TABLET / NONE / 不缓存(表 10-16)。
|
||||
-- 3) 停用设备 DEV-CHECKIN-99 用于验证 40303:countDeviceByCode 只认 state <> 'DISABLED',
|
||||
-- 停用设备不得作为 N-34 申请设备。
|
||||
-- 4) device_code 入库大写,与 AptDeviceSigner 的规范化口径一致;重复执行不产生重复设备。
|
||||
-- 执行前可用以下方式覆盖公寓标识(需与环境变量 APT_GY_ID 保持一致):
|
||||
-- mysql ... -e "SET @apt_gyid='YOUR_GYID'; SOURCE 15_it3_seed.sql"
|
||||
-- =============================================================================
|
||||
SET @apt_gyid := COALESCE(NULLIF(@apt_gyid, ''), 'APT-REV01-001');
|
||||
|
||||
-- 1. 设备档案(§12 补列随 14_it3_columns.sql 一并落地)
|
||||
INSERT INTO gy_sb
|
||||
(gyid, device_code, device_type, device_class, room_id, state,
|
||||
face_scope_type, face_scope_ref, face_scope_value, face_cache_enabled,
|
||||
biz_version, deleted)
|
||||
VALUES
|
||||
(@apt_gyid, 'DEV-CHECKIN-01', 'FACE', 'CHECKIN', NULL, 'ACTIVE',
|
||||
'ALL_ACTIVE', 'scope://face/all-active', 'ALL', 1, 1, 0),
|
||||
(@apt_gyid, 'DEV-TABLET-01', 'TABLET', 'TABLET', 'ROOM-201', 'ACTIVE',
|
||||
'NONE', NULL, NULL, 0, 1, 0),
|
||||
(@apt_gyid, 'DEV-CHECKIN-99', 'FACE', 'CHECKIN', NULL, 'DISABLED',
|
||||
'ALL_ACTIVE', 'scope://face/all-active', 'ALL', 1, 1, 0)
|
||||
ON DUPLICATE KEY UPDATE device_type = VALUES(device_type), device_class = VALUES(device_class),
|
||||
room_id = VALUES(room_id), state = VALUES(state),
|
||||
face_scope_type = VALUES(face_scope_type), face_scope_ref = VALUES(face_scope_ref),
|
||||
face_scope_value = VALUES(face_scope_value),
|
||||
face_cache_enabled = VALUES(face_cache_enabled), deleted = VALUES(deleted);
|
||||
|
||||
-- 2. 校验
|
||||
SELECT '=== IT-3 Mock 设备(应 3 行:2 CHECKIN + 1 TABLET)===' AS section;
|
||||
SELECT device_code, device_type, device_class, state,
|
||||
face_scope_type, face_scope_value, face_cache_enabled
|
||||
FROM gy_sb
|
||||
WHERE gyid = @apt_gyid
|
||||
AND device_code IN ('DEV-CHECKIN-01', 'DEV-TABLET-01', 'DEV-CHECKIN-99')
|
||||
ORDER BY device_code;
|
||||
|
||||
SELECT '=== N-34 可申请设备(state <> DISABLED,应 2)===' AS section;
|
||||
SELECT COUNT(*) AS apply_device_count
|
||||
FROM gy_sb
|
||||
WHERE gyid = @apt_gyid
|
||||
AND device_code IN ('DEV-CHECKIN-01', 'DEV-TABLET-01', 'DEV-CHECKIN-99')
|
||||
AND state <> 'DISABLED';
|
||||
|
||||
SELECT '=== 表 10-16 矩阵一致性(CHECKIN 须 ALL_ACTIVE 且可缓存;TABLET 不得缓存,应 0 行违规)===' AS section;
|
||||
SELECT device_code, device_class, face_scope_type, face_cache_enabled
|
||||
FROM gy_sb
|
||||
WHERE gyid = @apt_gyid AND deleted = 0
|
||||
AND ( (device_class = 'CHECKIN' AND (face_scope_type <> 'ALL_ACTIVE' OR face_cache_enabled <> 1))
|
||||
OR (device_class = 'TABLET' AND face_cache_enabled <> 0))
|
||||
ORDER BY device_code;
|
||||
@@ -0,0 +1,89 @@
|
||||
-- =============================================================================
|
||||
-- IT-3 权限点与页面菜单种子(可重放)。执行顺序:14 补列 → 15 设备种子 → 本文件。
|
||||
-- 依据:公寓端/10 表 10-24(权限与安全)、表 10-26(N-25~N-37 接口)、
|
||||
-- 04 §0 接口增量表、13 表 13-13 验收①、CR-02 §12(CR-C25 / 验收 15)。
|
||||
-- 口径:
|
||||
-- 1) 只新增 IT-3 需要的权限点与 1 个页面菜单,不改 3000 目录、不改 IT-1/IT-2 既有 F 点。
|
||||
-- 2) N-34 / N-38(`/open/v1/**`)为设备侧匿名分区,无权限点字符串,
|
||||
-- 靠「设备编码 + HMAC + 时间窗 + nonce」四要素鉴权,不在此登记。
|
||||
-- 3) 签到终端只有「发起申请」权(N-34);确认 / 驳回必须 `duty:person:reg` + 二次确认(N-36/N-37)。
|
||||
-- 4) 设备下发 / 可见范围 / 类别标注 / 三级对账属 IT-7(N-26/N-27/N-29),
|
||||
-- 表 10-24 #1 要求登记 `apt:face:category`,本期只登记权限点并置灰,
|
||||
-- 与 IT-2 的 3014 `apt:room:add` 置灰策略一致,避免「页面有按钮、后端恒 40940」的假交互。
|
||||
-- =============================================================================
|
||||
|
||||
-- 1. F 权限点(parent 3000)
|
||||
INSERT INTO sys_menu
|
||||
(menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
|
||||
VALUES
|
||||
(3211, '人脸人员查看', 3000, 11, '', '', '', '', 1, 0, 'F', '0', '0',
|
||||
'apt:face:list', '#', 'IT-3', NOW(),
|
||||
'IT-3 N-25 人脸人员 / N-35 注册台账查看;只读,不接受客户端 gyid'),
|
||||
(3212, '人脸注册审核', 3000, 12, '', '', '', '', 1, 0, 'F', '0', '0',
|
||||
'duty:person:reg', '#', 'IT-3', NOW(),
|
||||
'IT-3 N-35/N-36/N-37 值班台;确认=注册生效点,须二次确认;签到终端只有申请权'),
|
||||
(3213, '人脸下发', 3000, 13, '', '', '', '', 1, 0, 'F', '1', '1',
|
||||
'apt:face:dispatch', '#', 'IT-3', NOW(),
|
||||
'N-26 设备下发指令;IT-7 才开放,本期置灰不授予角色'),
|
||||
(3214, '人脸可见范围', 3000, 14, '', '', '', '', 1, 0, 'F', '1', '1',
|
||||
'apt:face:scope', '#', 'IT-3', NOW(),
|
||||
'N-27 设备人脸可见范围;IT-7 才开放,本期置灰不授予角色'),
|
||||
(3215, '人脸对账', 3000, 15, '', '', '', '', 1, 0, 'F', '1', '1',
|
||||
'apt:face:reconcile', '#', 'IT-3', NOW(),
|
||||
'N-29 三级版本 / hash 对账;IT-7 才开放,本期置灰不授予角色'),
|
||||
(3216, '人脸类别标注', 3000, 16, '', '', '', '', 1, 0, 'F', '1', '1',
|
||||
'apt:face:category', '#', 'IT-3', NOW(),
|
||||
'表 10-24 #7 人员类别标注仅公寓管理员可改;类别变更联动 FACE_ERASE 属 IT-7,本期置灰不授予角色')
|
||||
ON DUPLICATE KEY UPDATE menu_name = VALUES(menu_name), parent_id = VALUES(parent_id),
|
||||
order_num = VALUES(order_num), menu_type = VALUES(menu_type), visible = VALUES(visible),
|
||||
status = VALUES(status), perms = VALUES(perms), remark = VALUES(remark);
|
||||
|
||||
-- 2. C 页面菜单(父目录 3000,完整路由 /apt/face)
|
||||
INSERT INTO sys_menu
|
||||
(menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
|
||||
VALUES
|
||||
(3201, '人脸注册审核', 3000, 5, 'face', 'apt/face/reg/index', '', '', 1, 0, 'C', '0', '0',
|
||||
'', 'peoples', 'IT-3', NOW(),
|
||||
'IT-3 人脸注册申请台账:regState 切换待审/已确认/已驳回;N-36 确认、N-37 驳回;双路同步状态只读')
|
||||
ON DUPLICATE KEY UPDATE menu_name = VALUES(menu_name), parent_id = VALUES(parent_id),
|
||||
order_num = VALUES(order_num), path = VALUES(path), component = VALUES(component),
|
||||
menu_type = VALUES(menu_type), visible = VALUES(visible), status = VALUES(status),
|
||||
icon = VALUES(icon), remark = VALUES(remark);
|
||||
|
||||
-- 3. 超管关联(仅可用项;置灰项 3213~3216 不关联)
|
||||
INSERT INTO sys_role_menu (role_id, menu_id)
|
||||
SELECT 1, m.menu_id FROM sys_menu m
|
||||
WHERE m.menu_id IN (3201, 3211, 3212)
|
||||
AND NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 1 AND rm.menu_id = m.menu_id);
|
||||
|
||||
-- 4. 校验
|
||||
SELECT '=== IT-3 权限点与页面菜单(应 7 行:6 F + 1 C)===' AS section;
|
||||
SELECT menu_id, menu_name, menu_type, visible, status, perms, component
|
||||
FROM sys_menu WHERE menu_id BETWEEN 3201 AND 3216 ORDER BY menu_id;
|
||||
|
||||
SELECT '=== C 菜单组件路径(须与 src/views/apt/face/reg/index.vue 一致)===' AS section;
|
||||
SELECT menu_id, CONCAT('src/views/', component, '.vue') AS vue_file
|
||||
FROM sys_menu WHERE menu_id = 3201;
|
||||
|
||||
SELECT '=== 超管关联可用项(应 3)===' AS section;
|
||||
SELECT COUNT(*) AS admin_bound
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE rm.role_id = 1 AND m.menu_id IN (3201, 3211, 3212);
|
||||
|
||||
SELECT '=== 置灰项是否仍未关联角色(3213~3216 应为 0)===' AS section;
|
||||
SELECT COUNT(*) AS grey_bound
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE m.menu_id IN (3213, 3214, 3215, 3216);
|
||||
|
||||
SELECT '=== 公寓端菜单树构成(应 M=1 / C=5 / F=21)===' AS section;
|
||||
SELECT menu_type, COUNT(*) AS cnt
|
||||
FROM sys_menu
|
||||
WHERE menu_id = 3000 OR parent_id = 3000
|
||||
GROUP BY menu_type ORDER BY menu_type;
|
||||
|
||||
SELECT '=== M0 验收账号仍无公寓端权限点(应为 0)===' AS section;
|
||||
SELECT COUNT(*) AS apt_permission_count
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE rm.role_id = 300 AND (m.perms LIKE 'apt:%' OR m.perms LIKE 'duty:%' OR m.perms = '*:*:*');
|
||||
@@ -0,0 +1,178 @@
|
||||
-- =============================================================================
|
||||
-- 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;
|
||||
@@ -0,0 +1,80 @@
|
||||
-- =============================================================================
|
||||
-- IT-4 权限点与页面菜单种子(可重放)。执行顺序:17_it4_columns.sql → 本文件。
|
||||
-- 依据:公寓端/11 表 11-33(权限点)、表 11-34(接口清单 N-38~N-47)、
|
||||
-- 13 表 13-14、CR-02 表 3-57 验收 18~20。
|
||||
-- 口径:
|
||||
-- 1) `duty:checkin:list` 在 IT-1 已登记并置灰(menu_id 3005),本期**启用**,不新增重复点。
|
||||
-- 2) 新增 3 个 F 点:审核(review)/ 换房(adjust)/ 管理端查询(apt:checkin:query)。
|
||||
-- 3) 新增 1 个 C 页面菜单 3202「入住审核」,完整路由 /apt/checkin。
|
||||
-- 4) 设备侧 `/open/v1/checkin/**`(N-39~N-41)走设备四要素鉴权,无权限点字符串。
|
||||
-- 5) 跨公寓、超范围一律 40302/40303;本脚本不引入 role_id 300 的任何 apt 权限。
|
||||
-- =============================================================================
|
||||
|
||||
-- 1. 启用 IT-1 预置的入住列表权限点(3005)
|
||||
UPDATE sys_menu
|
||||
SET visible = '0', status = '0',
|
||||
remark = 'IT-4 启用:N-42 入住待审列表 duty:checkin:list(IT-1 预置并置灰)'
|
||||
WHERE menu_id = 3005 AND perms = 'duty:checkin:list';
|
||||
|
||||
-- 2. 新增 F 权限点(parent 3000)
|
||||
INSERT INTO sys_menu
|
||||
(menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
|
||||
VALUES
|
||||
(3217, '入住审核', 3000, 17, '', '', '', '', 1, 0, 'F', '0', '0',
|
||||
'duty:checkin:review', '#', 'IT-4', NOW(),
|
||||
'IT-4 N-44 审核:APPROVE / APPROVE_WITH_ROOM_CHANGE / REJECT,须二次确认且带 expectedBizVersion'),
|
||||
(3218, '入住换房', 3000, 18, '', '', '', '', 1, 0, 'F', '0', '0',
|
||||
'duty:checkin:adjust', '#', 'IT-4', NOW(),
|
||||
'IT-4 N-45 换房:仅审核期(APPROVED / ROOM_ADJUSTED),CHECKED_IN 后走退宿换房(40926)'),
|
||||
(3219, '入住查询', 3000, 19, '', '', '', '', 1, 0, 'F', '0', '0',
|
||||
'apt:checkin:query', '#', 'IT-4', NOW(),
|
||||
'IT-4 N-47 按 jcid 查入住与叫乘任务(管理端只读,不接受客户端 gyid)')
|
||||
ON DUPLICATE KEY UPDATE menu_name = VALUES(menu_name), parent_id = VALUES(parent_id),
|
||||
order_num = VALUES(order_num), menu_type = VALUES(menu_type), visible = VALUES(visible),
|
||||
status = VALUES(status), perms = VALUES(perms), remark = VALUES(remark);
|
||||
|
||||
-- 3. C 页面菜单(父目录 3000)
|
||||
INSERT INTO sys_menu
|
||||
(menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
|
||||
VALUES
|
||||
(3202, '入住审核', 3000, 6, 'checkin', 'apt/checkin/index', '', '', 1, 0, 'C', '0', '0',
|
||||
'', 'druid', 'IT-4', NOW(),
|
||||
'IT-4 值班台入住待审台账:审核/换房/时间线只读;换房仅审核期,入住后走退宿换房')
|
||||
ON DUPLICATE KEY UPDATE menu_name = VALUES(menu_name), parent_id = VALUES(parent_id),
|
||||
order_num = VALUES(order_num), path = VALUES(path), component = VALUES(component),
|
||||
menu_type = VALUES(menu_type), visible = VALUES(visible), status = VALUES(status),
|
||||
icon = VALUES(icon), remark = VALUES(remark);
|
||||
|
||||
-- 4. 超管关联(本期全部可用)
|
||||
INSERT INTO sys_role_menu (role_id, menu_id)
|
||||
SELECT 1, m.menu_id FROM sys_menu m
|
||||
WHERE m.menu_id IN (3202, 3005, 3217, 3218, 3219)
|
||||
AND NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 1 AND rm.menu_id = m.menu_id);
|
||||
|
||||
-- 5. 校验
|
||||
SELECT '=== IT-4 权限点与页面菜单(应 5 行:3005 + 3217~3219 + 3202)===' AS section;
|
||||
SELECT menu_id, menu_name, menu_type, visible, status, perms, component
|
||||
FROM sys_menu WHERE menu_id IN (3005, 3217, 3218, 3219, 3202) ORDER BY menu_id;
|
||||
|
||||
SELECT '=== C 菜单组件路径(须与 src/views/apt/checkin/index.vue 一致)===' AS section;
|
||||
SELECT menu_id, CONCAT('src/views/', component, '.vue') AS vue_file
|
||||
FROM sys_menu WHERE menu_id = 3202;
|
||||
|
||||
SELECT '=== 超管关联(应 5)===' AS section;
|
||||
SELECT COUNT(*) AS admin_bound
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE rm.role_id = 1 AND m.menu_id IN (3202, 3005, 3217, 3218, 3219);
|
||||
|
||||
SELECT '=== 公寓端菜单树构成(应 M=1 / C=6 / F=24)===' AS section;
|
||||
SELECT menu_type, COUNT(*) AS cnt
|
||||
FROM sys_menu
|
||||
WHERE menu_id = 3000 OR parent_id = 3000
|
||||
GROUP BY menu_type ORDER BY menu_type;
|
||||
|
||||
SELECT '=== 无遗留置灰的入住权限点(应为 0)===' AS section;
|
||||
SELECT COUNT(*) AS still_grey
|
||||
FROM sys_menu
|
||||
WHERE perms IN ('duty:checkin:list','duty:checkin:review','duty:checkin:adjust','apt:checkin:query')
|
||||
AND (visible <> '0' OR status <> '0');
|
||||
@@ -0,0 +1,114 @@
|
||||
-- =============================================================================
|
||||
-- IT-5 叫乘执行与状态机(M3)增量 DDL(可重放)
|
||||
-- 依据:公寓端/03 表 3-10(状态迁移矩阵)、公寓端/04 表 4-9(叫乘接口)、
|
||||
-- 公寓端/05 表 5-7(干预动作)/ 表 5-20(终态矩阵)、13 表 13-15
|
||||
-- 口径:
|
||||
-- 1) 不新增业务表(59 张口径不变);只补 gy_jcxx 的时间戳/标志位存量列
|
||||
-- 与 duty_manual_action 的 reason 列。
|
||||
-- 2) ryzt / finish_jc / finish_ly / stoped 仍只有 apt.duty.state 一个写入口,
|
||||
-- 本脚本不写任何业务数据。
|
||||
-- 3) 幂等:补列走 apt_add_column_if_missing,索引先查 information_schema。
|
||||
-- =============================================================================
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 1. gy_jcxx 存量列补齐(表 3-10 的「同表写入」列)
|
||||
-- 注意:apt_add_column_if_missing(p_table, p_column, p_ddl) 的 p_ddl 必须
|
||||
-- **自带列名**(过程只拼 "ALTER TABLE `t` ADD COLUMN "),
|
||||
-- 与 07_patch_columns.sql 的写法一致。
|
||||
-- -----------------------------------------------------------------------------
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'jcsj_s',
|
||||
"jcsj_s DATETIME(3) NULL COMMENT '实际开始叫乘时刻(CALL_START 条件更新写入)'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'jch',
|
||||
"jch VARCHAR(32) NULL COMMENT '机次;表 4-9 correct 白名单字段(存量表缺列,IT-5 补齐)'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'hjxysj',
|
||||
"hjxysj DATETIME(3) NULL COMMENT '应答时刻:SIP ConfbridgeJoin / 平板 VERIFIED'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'jcbjsj_s',
|
||||
"jcbjsj_s DATETIME(3) NULL COMMENT '叫乘报警时刻(无应答 / NO_ANSWER)'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'fjsj_s',
|
||||
"fjsj_s DATETIME(3) NULL COMMENT '复叫时刻(RE_CALL 或自动复叫)'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'lybjsj',
|
||||
"lybjsj DATETIME(3) NULL COMMENT '离寓报警时刻'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'is_jcbj',
|
||||
"is_jcbj VARCHAR(2) NOT NULL DEFAULT '0' COMMENT '叫乘报警标志 0/1'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'is_lybj',
|
||||
"is_lybj VARCHAR(2) NOT NULL DEFAULT '0' COMMENT '离寓报警标志 0/1'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'is_temp_call',
|
||||
"is_temp_call VARCHAR(2) NOT NULL DEFAULT '0' COMMENT '临时叫乘标志(人工临时叫乘仅置 1)'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'leave_type',
|
||||
"leave_type VARCHAR(20) NULL COMMENT '离寓类型:MANUAL / DEVICE / FACE 等'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'leave_event_id',
|
||||
"leave_event_id VARCHAR(64) NULL COMMENT '离寓事件 ID(gygl_ly_event.event_id)'");
|
||||
CALL apt_add_column_if_missing('gy_jcxx', 'leave_remark',
|
||||
"leave_remark VARCHAR(256) NULL COMMENT '离寓/修正备注(correct 白名单字段)'");
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 2. duty_manual_action:reason 列 + 动作枚举注释扩展
|
||||
-- 表 4-9 第 5 个接口的 5 个命令全部先落本表,再由 apt.duty.state 执行
|
||||
-- -----------------------------------------------------------------------------
|
||||
CALL apt_add_column_if_missing('duty_manual_action', 'reason',
|
||||
"reason VARCHAR(256) NULL COMMENT '命令原因(审计与追责用)'");
|
||||
|
||||
ALTER TABLE duty_manual_action
|
||||
MODIFY COLUMN action_type VARCHAR(32) NOT NULL
|
||||
COMMENT 'STOP / RE_CALL / FORCE_FINISH / MARK_LEAVE / CANCEL / CORRECT';
|
||||
|
||||
ALTER TABLE duty_manual_action
|
||||
MODIFY COLUMN state VARCHAR(20) NOT NULL DEFAULT 'PENDING'
|
||||
COMMENT 'PENDING / DONE / FAILED / DUPLICATED';
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 3. gy_jcxx 派发扫描索引(平板补任务 + SIP 超时扫描)
|
||||
-- -----------------------------------------------------------------------------
|
||||
SET @apt_idx_mode = (SELECT COUNT(*) FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_jcxx'
|
||||
AND INDEX_NAME = 'idx_jcxx_gyid_mode_state');
|
||||
SET @apt_sql_mode = IF(@apt_idx_mode = 0,
|
||||
'ALTER TABLE gy_jcxx ADD KEY idx_jcxx_gyid_mode_state (gyid, call_mode, ryzt, finish_ly)',
|
||||
'SELECT 1');
|
||||
PREPARE apt_stmt_mode FROM @apt_sql_mode;
|
||||
EXECUTE apt_stmt_mode;
|
||||
DEALLOCATE PREPARE apt_stmt_mode;
|
||||
|
||||
-- 平板结果按 (gyid, occurred_at) 归日统计的覆盖索引
|
||||
SET @apt_idx_result = (SELECT COUNT(*) FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_tablet_call_result'
|
||||
AND INDEX_NAME = 'idx_tabletresult_gyid_time');
|
||||
SET @apt_sql_result = IF(@apt_idx_result = 0,
|
||||
'ALTER TABLE apt_tablet_call_result ADD KEY idx_tabletresult_gyid_time (gyid, occurred_at)',
|
||||
'SELECT 1');
|
||||
PREPARE apt_stmt_result FROM @apt_sql_result;
|
||||
EXECUTE apt_stmt_result;
|
||||
DEALLOCATE PREPARE apt_stmt_result;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 4. 校验
|
||||
-- -----------------------------------------------------------------------------
|
||||
SELECT '=== IT-5 gy_jcxx 增量列(应 12)===' AS section;
|
||||
SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_jcxx'
|
||||
AND COLUMN_NAME IN ('jcsj_s','hjxysj','jcbjsj_s','fjsj_s','lybjsj','is_jcbj',
|
||||
'is_lybj','is_temp_call','leave_type','leave_event_id','leave_remark','jch')
|
||||
ORDER BY COLUMN_NAME;
|
||||
|
||||
SELECT '=== IT-5 duty_manual_action 动作枚举(应含 5 命令 + CORRECT / reason 列)===' AS section;
|
||||
SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'duty_manual_action'
|
||||
AND COLUMN_NAME IN ('action_type','state','reason');
|
||||
|
||||
SELECT '=== IT-5 索引(应 2:gy_jcxx 模式扫描 + 平板结果归日)===' AS section;
|
||||
SELECT TABLE_NAME, INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS cols
|
||||
FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND INDEX_NAME IN ('idx_jcxx_gyid_mode_state','idx_tabletresult_gyid_time')
|
||||
GROUP BY TABLE_NAME, INDEX_NAME;
|
||||
|
||||
SELECT '=== IT-5 状态字段初值兜底(应 0:不得出现 NULL/stoped 非法值)===' AS section;
|
||||
SELECT COUNT(*) AS illegal_state_rows
|
||||
FROM gy_jcxx
|
||||
WHERE deleted = 0
|
||||
AND (stoped IS NULL OR stoped NOT IN ('0','1')
|
||||
OR finish_jc IS NULL OR finish_jc NOT IN ('0','1')
|
||||
OR finish_ly IS NULL OR finish_ly NOT IN ('0','1'));
|
||||
@@ -0,0 +1,97 @@
|
||||
-- =============================================================================
|
||||
-- IT-5 权限点与页面菜单种子(可重放)。执行顺序:19_it5_columns.sql → 本文件。
|
||||
-- 依据:公寓端/04 表 4-9(叫乘 6 接口)、表 4-10(叫乘域映射)、13 表 13-15
|
||||
-- 口径:
|
||||
-- 1) `apt:jcxx:list` 在 IT-1 已登记并置灰(menu_id 3004),本期**启用**,
|
||||
-- 不新增重复点。
|
||||
-- 2) 新增 3 个 F 点:详情/时间线(query)、非状态修正(correct)、
|
||||
-- 状态机命令(changeStatus)。
|
||||
-- 3) 新增 1 个 C 页面菜单 3203「叫乘台账」,路由 /apt/jcxx。
|
||||
-- 4) 设备侧 `/open/v1/tablet/**`(N-03/N-04/N-05)走设备四要素鉴权,
|
||||
-- 无权限点字符串,本脚本不为其建点。
|
||||
-- 5) 本脚本不引入 role_id 300 的任何 apt 权限。
|
||||
-- =============================================================================
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- 1. 启用 IT-1 预置的叫乘列表权限点(3004)
|
||||
UPDATE sys_menu
|
||||
SET visible = '0', status = '0',
|
||||
remark = 'IT-5 启用:/apt/jcxx/list 与 /apt/jcxx/statistics(IT-1 预置并置灰)'
|
||||
WHERE menu_id = 3004 AND perms = 'apt:jcxx:list';
|
||||
|
||||
-- 2. 新增 F 权限点(parent 3000)
|
||||
INSERT INTO sys_menu
|
||||
(menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
|
||||
VALUES
|
||||
(3220, '叫乘详情', 3000, 20, '', '', '', '', 1, 0, 'F', '0', '0',
|
||||
'apt:jcxx:query', '#', 'IT-5', NOW(),
|
||||
'IT-5 详情与时间线:状态迁移 + AMI 事件 + 人工命令按 at 升序,只读'),
|
||||
(3221, '叫乘修正', 3000, 21, '', '', '', '', 1, 0, 'F', '0', '0',
|
||||
'apt:jcxx:correct', '#', 'IT-5', NOW(),
|
||||
'IT-5 非状态字段白名单修正(fjh/jlid/cc/jch/leaveRemark/is_temp_call);ryzt 等一律 40001'),
|
||||
(3222, '叫乘命令', 3000, 22, '', '', '', '', 1, 0, 'F', '0', '0',
|
||||
'apt:jcxx:changeStatus', '#', 'IT-5', NOW(),
|
||||
'IT-5 STOP/RE_CALL/FORCE_FINISH/MARK_LEAVE/CANCEL,commandId 幂等,非法状态 40902')
|
||||
ON DUPLICATE KEY UPDATE menu_name = VALUES(menu_name), parent_id = VALUES(parent_id),
|
||||
order_num = VALUES(order_num), menu_type = VALUES(menu_type), visible = VALUES(visible),
|
||||
status = VALUES(status), perms = VALUES(perms), remark = VALUES(remark);
|
||||
|
||||
-- 3. C 页面菜单(父目录 3000)
|
||||
INSERT INTO sys_menu
|
||||
(menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
|
||||
VALUES
|
||||
(3203, '叫乘台账', 3000, 7, 'jcxx', 'apt/jcxx/index', '', '', 1, 0, 'C', '0', '0',
|
||||
'', 'phone', 'IT-5', NOW(),
|
||||
'IT-5 / M3 叫乘台账:只读 + 提交命令;无「编辑状态」入口(PUT /apt/jcxx/{id} 不存在)')
|
||||
ON DUPLICATE KEY UPDATE menu_name = VALUES(menu_name), parent_id = VALUES(parent_id),
|
||||
order_num = VALUES(order_num), path = VALUES(path), component = VALUES(component),
|
||||
menu_type = VALUES(menu_type), visible = VALUES(visible), status = VALUES(status),
|
||||
icon = VALUES(icon), remark = VALUES(remark);
|
||||
|
||||
-- 4. 超管关联(本期全部可用)
|
||||
INSERT INTO sys_role_menu (role_id, menu_id)
|
||||
SELECT 1, m.menu_id FROM sys_menu m
|
||||
WHERE m.menu_id IN (3203, 3004, 3220, 3221, 3222)
|
||||
AND NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 1 AND rm.menu_id = m.menu_id);
|
||||
|
||||
-- 5. 叫乘扫描任务(默认停用,试点时手工启用)
|
||||
-- 说明:invoke_target 必须是 com.ruoyi.quartz.task 包内的 bean,
|
||||
-- 故 Job 类放在 ruoyi-apt 模块的 com.ruoyi.quartz.task.AptDispatchTask,
|
||||
-- 委托 AptDispatchScanService;不扩若依白名单。
|
||||
INSERT INTO sys_job
|
||||
(job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy,
|
||||
concurrent, status, create_by, create_time, remark)
|
||||
VALUES
|
||||
(103, '叫乘扫描(平板派发/过期/SIP 超时)', 'SYSTEM', 'aptDispatchTask.scan()', '0 * * * * ?',
|
||||
'1', '1', '1', 'IT-5', NOW(),
|
||||
'IT-5 每分钟:回收过期平板任务、补生成任务、SIP 30s 无入会转叫乘报警;默认停用')
|
||||
ON DUPLICATE KEY UPDATE job_name = VALUES(job_name), invoke_target = VALUES(invoke_target),
|
||||
cron_expression = VALUES(cron_expression), remark = VALUES(remark);
|
||||
|
||||
-- 6. 校验
|
||||
SELECT '=== IT-5 权限点与页面菜单(应 5 行:3004 + 3220~3222 + 3203)===' AS section;
|
||||
SELECT menu_id, menu_name, menu_type, visible, status, perms, component
|
||||
FROM sys_menu WHERE menu_id IN (3004, 3220, 3221, 3222, 3203) ORDER BY menu_id;
|
||||
|
||||
SELECT '=== C 菜单组件路径(须与 src/views/apt/jcxx/index.vue 一致)===' AS section;
|
||||
SELECT menu_id, CONCAT('src/views/', component, '.vue') AS vue_file
|
||||
FROM sys_menu WHERE menu_id = 3203;
|
||||
|
||||
SELECT '=== 超管关联(应 5)===' AS section;
|
||||
SELECT COUNT(*) AS admin_bound
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE rm.role_id = 1 AND m.menu_id IN (3203, 3004, 3220, 3221, 3222);
|
||||
|
||||
SELECT '=== 公寓端菜单树构成(M=1 / C=7 / F=27)===' AS section;
|
||||
SELECT menu_type, COUNT(*) AS cnt
|
||||
FROM sys_menu
|
||||
WHERE menu_id = 3000 OR parent_id = 3000
|
||||
GROUP BY menu_type ORDER BY menu_type;
|
||||
|
||||
SELECT '=== 无遗留置灰的叫乘权限点(应为 0)===' AS section;
|
||||
SELECT COUNT(*) AS still_grey
|
||||
FROM sys_menu
|
||||
WHERE perms IN ('apt:jcxx:list','apt:jcxx:query','apt:jcxx:correct','apt:jcxx:changeStatus')
|
||||
AND (visible <> '0' OR status <> '0');
|
||||
@@ -0,0 +1,156 @@
|
||||
-- =============================================================================
|
||||
-- AMI 连接与语音链路增量(一公寓一 Asterisk 实例)
|
||||
-- 依据:公寓端/19 设计文档;公寓端/05 表 5-12(SIP 叫乘链路)、表 5-13(AMI 事件映射);
|
||||
-- docs/10 表 8-3(AMI 不出本机)、表 8-4(端口 7058)、D5(一进程一 gyid)
|
||||
-- 口径:
|
||||
-- 1) 新增 1 张映射表 apt_ast_instance:gyid 唯一 -> 一公寓一实例(UK 兜底)。
|
||||
-- 这是对「59 张表」基线的显式偏离,已在公寓端/19 §7 登记(新增第 60 张)。
|
||||
-- 2) AMI 口令**不落库**:只存环境变量引用 ami_secret_ref(红钱:口令不进仓库)。
|
||||
-- 3) 复用既有 apt_ast_ami_session / apt_call_session / apt_call_event /
|
||||
-- apt_tts_utterance / apt_recording,仅补列,不新建语音表。
|
||||
-- 4) 幂等:建表 IF NOT EXISTS,补列走 apt_add_column_if_missing。
|
||||
-- =============================================================================
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 1. 公寓 ↔ Asterisk 实例映射(1:1)
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS apt_ast_instance (
|
||||
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '代理主键',
|
||||
gyid VARCHAR(32) NOT NULL COMMENT '公寓隔离标识(D5:一进程一 gyid)',
|
||||
instance_code VARCHAR(64) NOT NULL COMMENT '实例编码,如 AST-REV01-001',
|
||||
display_name VARCHAR(64) NULL COMMENT '展示名,如 1 号楼机房 Asterisk',
|
||||
ami_host VARCHAR(128) NOT NULL COMMENT 'AMI 地址;生产固定 127.0.0.1(AMI 不出本机)',
|
||||
ami_port INT NOT NULL DEFAULT 5038 COMMENT 'AMI 端口;现网配置值 7058',
|
||||
ami_user VARCHAR(64) NOT NULL COMMENT 'AMI 账号',
|
||||
ami_secret_ref VARCHAR(128) NOT NULL COMMENT '口令引用(环境变量名),禁止存明文',
|
||||
tls_enabled TINYINT NOT NULL DEFAULT 0 COMMENT '0 明文 / 1 TLS(TLS 端口另配)',
|
||||
conference VARCHAR(64) NOT NULL DEFAULT 'Conf-01' COMMENT '会议桥标识(D11 未定前不改)',
|
||||
dial_context VARCHAR(64) NOT NULL DEFAULT 'from-internal' COMMENT '拨号计划上下文',
|
||||
dial_prefix VARCHAR(16) NULL COMMENT '外呼前缀(如 9),本地分机为空',
|
||||
channel_tech VARCHAR(16) NOT NULL DEFAULT 'PJSIP' COMMENT '话机通道技术:PJSIP / SIP',
|
||||
recording_base_url VARCHAR(256) NULL COMMENT '录音 HTTP 基址(只对内网)',
|
||||
connect_timeout_ms INT NOT NULL DEFAULT 3000 COMMENT 'TCP 建连超时',
|
||||
action_timeout_ms INT NOT NULL DEFAULT 5000 COMMENT 'AMI Action 等待 Response 超时',
|
||||
ping_interval_sec INT NOT NULL DEFAULT 30 COMMENT '心跳间隔(Action: Ping)',
|
||||
ping_timeout_sec INT NOT NULL DEFAULT 5 COMMENT '单次心跳超时',
|
||||
reconnect_initial_ms INT NOT NULL DEFAULT 1000 COMMENT '重连初始退避',
|
||||
reconnect_max_ms INT NOT NULL DEFAULT 60000 COMMENT '重连最大退避(封顶)',
|
||||
state VARCHAR(20) NOT NULL DEFAULT 'DOWN' COMMENT 'DOWN/CONNECTING/UP/DEGRADED/DISABLED',
|
||||
last_connected_at DATETIME(3) NULL COMMENT '最近登录成功时刻',
|
||||
last_ping_at DATETIME(3) NULL COMMENT '最近心跳成功时刻',
|
||||
last_error VARCHAR(256) NULL COMMENT '最近一次失败原因(脱敏,不含口令)',
|
||||
enabled TINYINT NOT NULL DEFAULT 1 COMMENT '0 停用(不建连、不叫乘)',
|
||||
biz_version BIGINT NOT NULL DEFAULT 1 COMMENT '数据库条件更新乐观锁',
|
||||
deleted TINYINT NOT NULL DEFAULT 0,
|
||||
create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
update_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_astinstance_gyid (gyid),
|
||||
KEY idx_astinstance_gyid_state (gyid, state, enabled),
|
||||
CONSTRAINT ck_astinstance_state CHECK (state IN ('DOWN','CONNECTING','UP','DEGRADED','DISABLED')),
|
||||
CONSTRAINT ck_astinstance_enabled CHECK (enabled IN (0,1))
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
|
||||
COMMENT='公寓-Asterisk 实例映射与 AMI 连接配置(一公寓一实例)';
|
||||
|
||||
-- 默认实例:只写占位地址与口令引用,口令由部署环境 APT_AMI_SECRET 注入
|
||||
INSERT INTO apt_ast_instance
|
||||
(gyid, instance_code, display_name, ami_host, ami_port, ami_user, ami_secret_ref,
|
||||
conference, dial_context, state, enabled, create_time, update_time)
|
||||
SELECT 'APT-REV01-001', 'AST-REV01-001', '本机 Asterisk(AMI 仅本机)',
|
||||
'127.0.0.1', 5038, 'apt', 'APT_AMI_SECRET',
|
||||
'Conf-01', 'from-internal', 'DOWN', 1, NOW(3), NOW(3)
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM apt_ast_instance WHERE gyid = 'APT-REV01-001' AND deleted = 0
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 2. AMI 会话补列:心跳与断连原因(表已有 connected_at/disconnected_at/reconnect_count/state)
|
||||
-- -----------------------------------------------------------------------------
|
||||
CALL apt_add_column_if_missing('apt_ast_ami_session', 'last_ping_at',
|
||||
"last_ping_at DATETIME(3) NULL COMMENT '最近心跳成功时刻'");
|
||||
CALL apt_add_column_if_missing('apt_ast_ami_session', 'last_error',
|
||||
"last_error VARCHAR(256) NULL COMMENT '本次连接断开的失败原因(脱敏)'");
|
||||
CALL apt_add_column_if_missing('apt_ast_ami_session', 'close_reason',
|
||||
"close_reason VARCHAR(64) NULL COMMENT 'CLIENT_CLOSE / IO_ERROR / PING_TIMEOUT / AUTH_FAILED / SHUTDOWN'");
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 3. 通话会话补列:双腿(房间/值班台)与通道映射
|
||||
-- -----------------------------------------------------------------------------
|
||||
CALL apt_add_column_if_missing('apt_call_session', 'leg_role',
|
||||
"leg_role VARCHAR(16) NOT NULL DEFAULT 'ROOM' COMMENT '腿角色:ROOM 房间 / DUTY 值班台 / TTS 播报'");
|
||||
CALL apt_add_column_if_missing('apt_call_session', 'channel',
|
||||
"channel VARCHAR(128) NULL COMMENT 'AMI Channel(PJSIP/1001-00000001),事件反查用'");
|
||||
CALL apt_add_column_if_missing('apt_call_session', 'originate_action_id',
|
||||
"originate_action_id VARCHAR(64) NULL COMMENT 'Originate ActionID,OriginateResponse 关联用'");
|
||||
CALL apt_add_column_if_missing('apt_call_session', 'ami_session_id',
|
||||
"ami_session_id VARCHAR(64) NULL COMMENT '所属 AMI 连接会话(apt_ast_ami_session.ami_session_id)'");
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 4. TTS 播报补列:与会话/序号绑定,避免并发时互相覆盖(docs/10 表 10-13 TTS 槽位风险)
|
||||
-- -----------------------------------------------------------------------------
|
||||
CALL apt_add_column_if_missing('apt_tts_utterance', 'session_id',
|
||||
"session_id VARCHAR(64) NULL COMMENT '关联会话;一次入会一条播报链'");
|
||||
CALL apt_add_column_if_missing('apt_tts_utterance', 'utterance_seq',
|
||||
"utterance_seq BIGINT NOT NULL DEFAULT 1 COMMENT '同会话单调递增,禁止共用槽位'");
|
||||
CALL apt_add_column_if_missing('apt_tts_utterance', 'played_at',
|
||||
"played_at DATETIME(3) NULL COMMENT '播放完成时刻'");
|
||||
CALL apt_add_column_if_missing('apt_tts_utterance', 'error_msg',
|
||||
"error_msg VARCHAR(256) NULL COMMENT '失败原因(不改叫乘结论,只告警)'");
|
||||
|
||||
-- 会话按通道反查(事件热点路径)
|
||||
SET @apt_idx_channel = (SELECT COUNT(*) FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_call_session'
|
||||
AND INDEX_NAME = 'idx_callsession_gyid_channel');
|
||||
SET @apt_sql_channel = IF(@apt_idx_channel = 0,
|
||||
'ALTER TABLE apt_call_session ADD KEY idx_callsession_gyid_channel (gyid, channel)',
|
||||
'SELECT 1');
|
||||
PREPARE apt_stmt_channel FROM @apt_sql_channel;
|
||||
EXECUTE apt_stmt_channel;
|
||||
DEALLOCATE PREPARE apt_stmt_channel;
|
||||
|
||||
SET @apt_idx_action = (SELECT COUNT(*) FROM information_schema.STATISTICS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_call_session'
|
||||
AND INDEX_NAME = 'idx_callsession_gyid_action');
|
||||
SET @apt_sql_action = IF(@apt_idx_action = 0,
|
||||
'ALTER TABLE apt_call_session ADD KEY idx_callsession_gyid_action (gyid, originate_action_id)',
|
||||
'SELECT 1');
|
||||
PREPARE apt_stmt_action FROM @apt_sql_action;
|
||||
EXECUTE apt_stmt_action;
|
||||
DEALLOCATE PREPARE apt_stmt_action;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 5. 校验
|
||||
-- -----------------------------------------------------------------------------
|
||||
SELECT '=== 27. 公寓-实例映射(应 1 行,一公寓一实例)===' AS section;
|
||||
SELECT gyid, instance_code, ami_host, ami_port, ami_user, ami_secret_ref,
|
||||
conference, dial_context, state, enabled
|
||||
FROM apt_ast_instance WHERE deleted = 0 ORDER BY gyid;
|
||||
|
||||
SELECT '=== 28. 口令不落明文(应 0:secret_ref 不得是疑似明文口令)===' AS section;
|
||||
SELECT COUNT(*) AS plaintext_secret_rows
|
||||
FROM apt_ast_instance
|
||||
WHERE deleted = 0
|
||||
AND (ami_secret_ref LIKE '% %' OR ami_secret_ref LIKE '%.%' OR CHAR_LENGTH(ami_secret_ref) > 64);
|
||||
|
||||
SELECT '=== 29. AMI 会话补列(应 3)===' AS section;
|
||||
SELECT COUNT(*) AS ami_session_columns
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_ast_ami_session'
|
||||
AND COLUMN_NAME IN ('last_ping_at','last_error','close_reason');
|
||||
|
||||
SELECT '=== 30. 会话/TTS 补列(应 8:call_session 4 + tts 4)===' AS section;
|
||||
SELECT COUNT(*) AS call_tts_columns
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND ((TABLE_NAME = 'apt_call_session'
|
||||
AND COLUMN_NAME IN ('leg_role','channel','originate_action_id','ami_session_id'))
|
||||
OR (TABLE_NAME = 'apt_tts_utterance'
|
||||
AND COLUMN_NAME IN ('session_id','utterance_seq','played_at','error_msg')));
|
||||
|
||||
SELECT '=== 31. 会话索引(应 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_call_session'
|
||||
AND INDEX_NAME IN ('idx_callsession_gyid_channel','idx_callsession_gyid_action')
|
||||
GROUP BY INDEX_NAME;
|
||||
@@ -3,6 +3,7 @@
|
||||
-- 预期:business_table_count = 59;missing_pk = 0;missing_gyid = 0
|
||||
-- 口径:apt_* 36 + gy_*/gygl_* 18 + duty_* 5 = 59(CR-02 表 3-25、公寓端/03 表 3-8)
|
||||
-- apt_ops_probe 为连通性探针表,显式排除,不计入 59 张。
|
||||
-- 追加:第 7~13 段为 IT-3(DV-3)增量校验,见文件末段说明。
|
||||
-- =============================================================================
|
||||
SELECT '=== 1. 业务表总数(应为 59)===' AS section;
|
||||
SELECT COUNT(*) AS business_table_count
|
||||
@@ -62,3 +63,151 @@ SELECT '=== 6. 探针表与基线种子 ===' AS section;
|
||||
SELECT (SELECT COUNT(*) FROM apt_ops_probe) AS probe_rows,
|
||||
(SELECT COUNT(*) FROM apt_master_version WHERE source = 'LOCAL') AS local_baseline_rows,
|
||||
(SELECT COUNT(*) FROM apt_ops_selfcheck) AS selfcheck_item_rows;
|
||||
|
||||
-- =============================================================================
|
||||
-- IT-3 追加校验(DV-3 / 13 表 13-13 验收①)
|
||||
-- 预期:IT-3 增量列 6 条;人脸权限点 7 行(6 F + 1 C);IT-7 置灰项授权 0;
|
||||
-- N-34 可申请设备 2 台;注册链三处「泄漏」计数均为 0。
|
||||
-- =============================================================================
|
||||
SELECT '=== 7. IT-3 增量列(应 6:回执态 3 + §12 设备范围 3)===' AS section;
|
||||
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND ( (TABLE_NAME = 'apt_person_face_reg' AND COLUMN_NAME IN ('platform_version','unit_code'))
|
||||
OR (TABLE_NAME = 'apt_master_person' AND COLUMN_NAME = 'face_platform_version')
|
||||
OR (TABLE_NAME = 'gy_sb' AND COLUMN_NAME IN ('device_class','face_scope_value','face_cache_enabled')))
|
||||
ORDER BY TABLE_NAME, COLUMN_NAME;
|
||||
|
||||
SELECT '=== 8. 人脸权限点与页面菜单(应 7 行:6 F + 1 C)===' AS section;
|
||||
SELECT menu_id, menu_name, menu_type, visible, status, perms
|
||||
FROM sys_menu WHERE menu_id BETWEEN 3201 AND 3216 ORDER BY menu_id;
|
||||
|
||||
SELECT '=== 9. IT-7 预留点置灰且未授权(3213~3216 应为 0)===' AS section;
|
||||
SELECT COUNT(*) AS it3_grey_bound
|
||||
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
|
||||
WHERE m.menu_id IN (3213, 3214, 3215, 3216);
|
||||
|
||||
SELECT '=== 10. N-34 可申请设备(state <> DISABLED,应 2)===' AS section;
|
||||
SELECT COUNT(*) AS it3_apply_device_count
|
||||
FROM gy_sb
|
||||
WHERE device_code IN ('DEV-CHECKIN-01', 'DEV-TABLET-01', 'DEV-CHECKIN-99')
|
||||
AND state <> 'DISABLED';
|
||||
|
||||
SELECT '=== 11. 注册链一致性:APPLIED 不得带 ryid、CONFIRMED 必带 ryid(均应 0)===' AS section;
|
||||
SELECT
|
||||
(SELECT COUNT(*) FROM apt_person_face_reg
|
||||
WHERE reg_state = 'APPLIED' AND (confirmed_ryid IS NOT NULL OR local_only <> 1)) AS it3_applied_leak,
|
||||
(SELECT COUNT(*) FROM apt_person_face_reg
|
||||
WHERE reg_state = 'CONFIRMED' AND confirmed_ryid IS NULL) AS it3_confirmed_without_ryid,
|
||||
(SELECT COUNT(*) FROM apt_person_face_reg
|
||||
WHERE reg_state = 'REJECTED' AND confirmed_ryid IS NOT NULL) AS it3_rejected_with_ryid;
|
||||
|
||||
SELECT '=== 12. 双路状态链独立:CONFIRMED 行不得缺 upload_state / dispatch_state(应 0)===' AS section;
|
||||
SELECT reg_id, upload_state, dispatch_state, verdict, platform_version
|
||||
FROM apt_person_face_reg
|
||||
WHERE reg_state = 'CONFIRMED' AND (upload_state IS NULL OR dispatch_state IS NULL);
|
||||
|
||||
SELECT '=== 13. 确认行必须有对应人员主档(应 0 孤儿)===' AS section;
|
||||
SELECT COUNT(*) AS it3_confirmed_orphan
|
||||
FROM apt_person_face_reg r
|
||||
WHERE r.reg_state = 'CONFIRMED'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM apt_master_person p
|
||||
WHERE p.gyid = r.gyid AND p.ryid = r.confirmed_ryid AND p.deleted = 0
|
||||
);
|
||||
|
||||
-- =============================================================================
|
||||
-- IT-4 追加校验(入住作业核心 / 表 11-4、表 11-9、CR-02 表 3-57 验收 18~20)
|
||||
-- 预期:增量列 26 条;流程态字典 8/5 值;入住权限点 5 行;三处链路泄漏均为 0。
|
||||
-- =============================================================================
|
||||
SELECT '=== 14. IT-4 apt_local_task 增量列(应 27)===' AS section;
|
||||
SELECT COUNT(*) AS it4_local_task_columns
|
||||
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');
|
||||
|
||||
SELECT '=== 15. 流程态字典(checkin_state 8 值 / sync_state 5 值 / 事件含 ROOM_SWAP)===' 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 '=== 16. 入住权限点与页面菜单(应 5 行)===' AS section;
|
||||
SELECT menu_id, menu_name, menu_type, visible, status, perms
|
||||
FROM sys_menu WHERE menu_id IN (3005, 3202, 3217, 3218, 3219) ORDER BY menu_id;
|
||||
|
||||
SELECT '=== 17. 任务就绪必须已复算 jcsj(应 0)===' AS section;
|
||||
SELECT COUNT(*) AS it4_task_ready_without_jcsj
|
||||
FROM apt_local_task
|
||||
WHERE sync_state = 'TASK_READY' AND jcsj IS NULL AND deleted = 0;
|
||||
|
||||
SELECT '=== 18. CHECKED_IN 必须有 gy_jcxx 行(应 0 孤儿)===' AS section;
|
||||
SELECT COUNT(*) AS it4_checked_in_orphan
|
||||
FROM apt_local_task t
|
||||
WHERE t.checkin_state = 'CHECKED_IN' AND t.deleted = 0
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM gy_jcxx j WHERE j.gyid = t.gyid AND j.jcid = t.jcid AND j.deleted = 0
|
||||
);
|
||||
|
||||
SELECT '=== 19. 未入住不得提前生成叫乘行(应 0 泄漏)===' AS section;
|
||||
SELECT COUNT(*) AS it4_checkin_leak
|
||||
FROM apt_local_task t
|
||||
WHERE t.checkin_state IN ('SUBMITTED','REVIEWING','APPROVED','ROOM_ADJUSTED','REJECTED')
|
||||
AND t.deleted = 0
|
||||
AND EXISTS (SELECT 1 FROM gy_jcxx j WHERE j.gyid = t.gyid AND j.jcid = t.jcid AND j.deleted = 0);
|
||||
|
||||
-- =============================================================================
|
||||
-- IT-5 追加校验(叫乘执行与状态机 / 表 3-10、表 4-9、表 5-20、表 7-3 M3)
|
||||
-- 预期:增量列 11 条;叫乘权限点 5 行;平板字典 3 个 CHECK;
|
||||
-- 状态一致性四类泄漏全为 0;平板链路无 #24 语音摘要。
|
||||
-- =============================================================================
|
||||
SELECT '=== 20. IT-5 gy_jcxx 增量列(应 12)===' AS section;
|
||||
SELECT COUNT(*) AS it5_jcxx_columns
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_jcxx'
|
||||
AND COLUMN_NAME IN ('jcsj_s','hjxysj','jcbjsj_s','fjsj_s','lybjsj','is_jcbj',
|
||||
'is_lybj','is_temp_call','leave_type','leave_event_id','leave_remark','jch');
|
||||
|
||||
SELECT '=== 21. 叫乘权限点与页面菜单(应 5 行)===' AS section;
|
||||
SELECT menu_id, menu_name, menu_type, visible, status, perms
|
||||
FROM sys_menu WHERE menu_id IN (3004, 3220, 3221, 3222, 3203) ORDER BY menu_id;
|
||||
|
||||
SELECT '=== 22. 平板字典 CHECK(应 3:face / result_type / applied_state)===' AS section;
|
||||
SELECT CONSTRAINT_NAME, CHECK_CLAUSE
|
||||
FROM information_schema.CHECK_CONSTRAINTS
|
||||
WHERE CONSTRAINT_SCHEMA = DATABASE()
|
||||
AND CONSTRAINT_NAME IN ('ck_tabletresult_face','ck_tabletresult_type','ck_tabletresult_applied')
|
||||
ORDER BY CONSTRAINT_NAME;
|
||||
|
||||
SELECT '=== 23. 终态一致性:ryzt=3 必须 finish_jc=1(应 0)===' AS section;
|
||||
SELECT COUNT(*) AS it5_answered_without_finish
|
||||
FROM gy_jcxx
|
||||
WHERE deleted = 0 AND ryzt = '3' AND finish_jc <> '1';
|
||||
|
||||
SELECT '=== 24. 已结束叫乘不得回退到未完成态(应 0)===' AS section;
|
||||
SELECT COUNT(*) AS it5_finished_regressed
|
||||
FROM gy_jcxx
|
||||
WHERE deleted = 0 AND finish_jc = '1' AND ryzt IN ('0','1');
|
||||
|
||||
SELECT '=== 25. 平板任务与结果一致:DONE 任务必须有结果行(应 0)===' AS section;
|
||||
SELECT COUNT(*) AS it5_task_done_without_result
|
||||
FROM apt_tablet_task t
|
||||
WHERE t.pull_state = 'DONE'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM apt_tablet_call_result r
|
||||
WHERE r.gyid = t.gyid AND r.task_id = t.task_id
|
||||
);
|
||||
|
||||
SELECT '=== 26. 平板链路不得上报 #24 语音摘要(应 0)===' AS section;
|
||||
SELECT COUNT(*) AS it5_tablet_voice_summary
|
||||
FROM apt_report_outbox o
|
||||
WHERE o.biz_type = 'VOICE_SUMMARY'
|
||||
AND EXISTS (
|
||||
SELECT 1 FROM gy_jcxx j
|
||||
WHERE j.gyid = o.gyid AND j.jcid = o.biz_id AND j.call_mode = 'TABLET'
|
||||
);
|
||||
Reference in new issue
Block a user