Files
railwaysystem/qa-bootstrap/sql/05b_fusion_iot_test_data.sql

190 lines
12 KiB
PL/PgSQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ==============================================================================
-- RailwaySystem QA Bootstrap: 05b_fusion_iot_test_data.sql
-- 目标数据库: railwaysystem_fusion_qa_20261013 (schema: iotlocks + public)
-- 业务场景: 培训住宿与 IoT 智能门锁跨模式业务融合合成测试数据
-- 合规与门禁保证:
-- 1. 100% 虚拟 Mock 合成数据,不包含任何真实学员、人脸图像或生产门锁 SN
-- 2. 不连接真实 MQTT Broker,下发与回执由自动化测试与 Mock 双向驱动
-- 3. 【任务6核心要求】初始测试数据置为未授权/待同步状态 (sync_status=0, status=0),
-- 绝不预置下发成功(sync_status=2)冒充完整链路,确保通过真实业务 API 和 Mock 回执推动
-- 4. 【任务4与5核心要求】外键类型严格对齐 BIGINT,列名与 Mapper 完全一致,
-- 利用部分唯一索引验证退宿 (accommodation_status=2) 与重新入住 (accommodation_status=1) 并存
-- ==============================================================================
BEGIN;
-- ==============================================================================
-- 1. IoT 物联基础设施底座 (schema: iotlocks)
-- ==============================================================================
-- 1.1 分组 (对应公寓楼宇/培训园区)
INSERT INTO iotlocks.lock_group
(group_id, group_code, group_name, dept_id, manager, phone, address, status, order_num, del_flag, create_by, create_time, remark)
VALUES
(1001, 'GRP_FUSION_TEST', '致远楼融合测试公寓', 112, '管理员', '18800000001', '沈阳段实训园区致远楼', '0', 1, '0', 'admin', CURRENT_TIMESTAMP, '融合测试专用设备分组')
ON CONFLICT (group_id) DO UPDATE SET
group_code = EXCLUDED.group_code,
group_name = EXCLUDED.group_name,
del_flag = '0';
-- 1.2 网关设备 (对齐 04 DDL 列名: gateway_ip)
INSERT INTO iotlocks.lock_gateway
(gateway_id, gateway_sn, gateway_name, group_id, gateway_ip, online_status, status, del_flag, create_by, create_time, remark)
VALUES
(1001, 'GW-FUSION-TEST-01', '致远楼1层测试LoRa网关', 1001, '192.168.10.201', '0', '0', '0', 'admin', CURRENT_TIMESTAMP, '融合测试网关')
ON CONFLICT (gateway_id) DO UPDATE SET
gateway_sn = EXCLUDED.gateway_sn,
gateway_name = EXCLUDED.gateway_name,
group_id = EXCLUDED.group_id,
gateway_ip = EXCLUDED.gateway_ip,
del_flag = '0';
-- 1.3 智能门锁设备 (对应宿舍房间 101 与 102)
INSERT INTO iotlocks.lock_device
(device_id, device_sn, device_name, gateway_id, group_id, room_no, dev_type, dev_ver, face_algo_version, online_status, status, del_flag, create_by, create_time, remark)
VALUES
(1001, 'LOCK-ZY-101', '致远楼101智能门锁', 1001, 1001, '101', '01', 'V2.1.0', '2.14.5_2.7.1_M3', '0', '0', '0', 'admin', CURRENT_TIMESTAMP, '宿舍101匹配智能门锁'),
(1002, 'LOCK-ZY-102', '致远楼102智能门锁', 1001, 1001, '102', '01', 'V2.1.0', '2.14.5_2.7.1_M3', '0', '0', '0', 'admin', CURRENT_TIMESTAMP, '宿舍102匹配智能门锁')
ON CONFLICT (device_id) DO UPDATE SET
device_sn = EXCLUDED.device_sn,
device_name = EXCLUDED.device_name,
gateway_id = EXCLUDED.gateway_id,
group_id = EXCLUDED.group_id,
room_no = EXCLUDED.room_no,
del_flag = '0';
-- ==============================================================================
-- 2. 培训业务主档与宿舍房间 (schema: public)
-- ==============================================================================
-- 2.1 宿舍主档 (lock_device_sn 与 iotlocks.lock_device.device_sn 100% 对应)
INSERT INTO public.train_dormitory_info
(dorm_id, dorm_building, dorm_floor, dorm_room, capacity, gender_type, dorm_status, lock_device_sn, create_by, create_time, del_flag, remark)
VALUES
('DORM-ZY-101', '致远楼', '1层', '101', 4, 1, 1, 'LOCK-ZY-101', 'admin', CURRENT_TIMESTAMP, '0', '男生宿舍101室(绑定门锁LOCK-ZY-101)'),
('DORM-ZY-102', '致远楼', '1层', '102', 4, 1, 1, 'LOCK-ZY-102', 'admin', CURRENT_TIMESTAMP, '0', '男生宿舍102室(绑定门锁LOCK-ZY-102)')
ON CONFLICT (dorm_id) DO UPDATE SET
lock_device_sn = EXCLUDED.lock_device_sn,
dorm_status = EXCLUDED.dorm_status,
del_flag = '0';
-- 2.2 开班计划
INSERT INTO public.train_class_plan
(plan_id, plan_name, start_time, end_time, report_deadline, train_address, recruit_num, apply_condition, plan_status, create_by, create_time, del_flag, remark)
VALUES
('PLAN-FUSION-01', '2026年公寓智能物联与门禁业务融合实训班', '2026-10-01 08:30:00', '2026-10-30 17:30:00', '2026-09-30 18:00:00', '致远楼实训园区', 20, '参训学员', 1, 'admin', CURRENT_TIMESTAMP, '0', '融合测试专用开班')
ON CONFLICT (plan_id) DO UPDATE SET
plan_name = EXCLUDED.plan_name,
plan_status = EXCLUDED.plan_status,
del_flag = '0';
-- 2.3 融合测试专属学员主档 (稳定唯一的 person_no)
INSERT INTO public.train_student
(s_id, s_name, s_gender, s_birth, org_name, s_phone, s_email, id_card_hash, id_card_last4, person_no, source_type, status, del_flag, create_by, create_time, remark)
VALUES
('S_FUSION_001', '刘强(融合测试)', '0', '1992-05-18', '沈阳房建公寓段沈阳车间', '18800000881', 'liuqiang@sict.railway.cn', 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', '8811', 'AA000001', 1, 1, '0', 'admin', CURRENT_TIMESTAMP, '学员1-用于退宿与重新入住场景'),
('S_FUSION_002', '陈燕(融合测试)', '1', '1994-08-22', '沈阳房建公寓段大连车间', '18800000882', 'chenyan@sict.railway.cn', 'd41d8cd98f00b204e9800998ecf8427e', '8822', 'AA000002', 1, 1, '0', 'admin', CURRENT_TIMESTAMP, '学员2-用于调宿与端到端授权下发场景')
ON CONFLICT (s_id) DO UPDATE SET
s_name = EXCLUDED.s_name,
person_no = EXCLUDED.person_no,
s_phone = EXCLUDED.s_phone,
status = EXCLUDED.status,
del_flag = '0';
-- 2.4 参训记录 (使用正确列名 student_id,enrollment_id 为 BIGINT)
INSERT INTO public.train_enrollment
(enrollment_id, plan_id, student_id, source_type, enrollment_status, accommodation_required, join_time, create_by, create_time)
VALUES
(2001, 'PLAN-FUSION-01', 'S_FUSION_001', 1, 1, 1, '2026-09-30 14:00:00', 'admin', CURRENT_TIMESTAMP),
(2002, 'PLAN-FUSION-01', 'S_FUSION_002', 1, 1, 1, '2026-09-30 14:30:00', 'admin', CURRENT_TIMESTAMP)
ON CONFLICT (enrollment_id) DO UPDATE SET
student_id = EXCLUDED.student_id,
enrollment_status = EXCLUDED.enrollment_status;
-- ==============================================================================
-- 3. 住宿业务记录 (使用正确列名: accommodation_id, enrollment_id, dorm_id, bed_no, assigned_time, accommodation_status)
-- ==============================================================================
-- 学员1 (enrollment_id = 2001, AA000001):
-- - 记录 2001: 历史退宿记录 (accommodation_status = 2)
-- - 记录 2003: 重新入住记录 (accommodation_status = 1)
-- -> 证明部分唯一索引 uq_accommodation_active_enroll 正常放行历史退宿与再次入住
-- 学员2 (enrollment_id = 2002, AA000002):
-- - 记录 2002: 当前在住记录 (accommodation_status = 1)
INSERT INTO public.train_accommodation
(accommodation_id, enrollment_id, dorm_id, bed_no, assigned_time, accommodation_status, create_by, create_time, remark)
VALUES
(2001, 2001, 'DORM-ZY-101', '1号床', '2026-09-01 09:00:00', 2, 'admin', CURRENT_TIMESTAMP, '历史住宿记录-已退宿'),
(2003, 2001, 'DORM-ZY-101', '1号床', '2026-10-01 08:00:00', 1, 'admin', CURRENT_TIMESTAMP, '重新入住记录-当前在住'),
(2002, 2002, 'DORM-ZY-102', '1号床', '2026-10-01 08:30:00', 1, 'admin', CURRENT_TIMESTAMP, '当前分配入住记录')
ON CONFLICT (accommodation_id) DO UPDATE SET
dorm_id = EXCLUDED.dorm_id,
bed_no = EXCLUDED.bed_no,
accommodation_status = EXCLUDED.accommodation_status,
assigned_time = EXCLUDED.assigned_time;
-- ==============================================================================
-- 4. IoT 人脸凭证与门锁授权数据 (schema: iotlocks)
-- 【核心门禁要求】初始态为未授权/待提取/待下发,绝不预置成功状态冒充完整链路
-- ==============================================================================
-- 4.1 Mock 人脸凭证 (对齐 04 DDL 列名: photo_url, feature_data, feature_algo_version)
INSERT INTO iotlocks.lock_face
(face_id, person_no, person_name, person_type, photo_url, feature_data, extract_status, feature_algo_version, create_by, create_time, remark)
VALUES
(1001, 'AA000001', '刘强(融合测试)', '0', 'mock:base64:synthetic_face_image_001', NULL, '0', '2.14.5_2.7.1_M3', 'admin', CURRENT_TIMESTAMP, '初始未提取人脸-待提取特征'),
(1002, 'AA000002', '陈燕(融合测试)', '0', 'mock:base64:synthetic_face_image_002', NULL, '0', '2.14.5_2.7.1_M3', 'admin', CURRENT_TIMESTAMP, '初始未提取人脸-待提取特征')
ON CONFLICT (face_id) DO UPDATE SET
person_no = EXCLUDED.person_no,
person_name = EXCLUDED.person_name,
extract_status = EXCLUDED.extract_status;
-- 4.2 门锁授权记录 (对齐 04 DDL 与 LockAuth 实体: auth_no, device_sn, gateway_id, group_id, auth_type, sync_status, status)
-- 由业务端到端 API 发起下发并经 Mock MQTT 回执推进状态至成功
INSERT INTO iotlocks.lock_auth
(auth_id, auth_no, person_no, person_name, device_id, device_sn, gateway_id, group_id, auth_type, sync_status, status, begin_time, end_time, retry_count, del_flag, create_by, create_time, remark)
VALUES
(1001, 'AUTH202610130001', 'AA000001', '刘强(融合测试)', 1001, 'LOCK-ZY-101', 1001, 1001, '01', '0', '0', '2026-10-01 08:00:00', '2026-10-30 23:59:59', 0, '0', 'admin', CURRENT_TIMESTAMP, '学员1门锁101-初始待下发授权'),
(1002, 'AUTH202610130002', 'AA000002', '陈燕(融合测试)', 1002, 'LOCK-ZY-102', 1001, 1001, '01', '0', '0', '2026-10-01 08:00:00', '2026-10-30 23:59:59', 0, '0', 'admin', CURRENT_TIMESTAMP, '学员2门锁102-初始待下发授权')
ON CONFLICT (auth_id) DO UPDATE SET
auth_no = EXCLUDED.auth_no,
person_no = EXCLUDED.person_no,
device_id = EXCLUDED.device_id,
device_sn = EXCLUDED.device_sn,
status = EXCLUDED.status,
sync_status = EXCLUDED.sync_status;
-- ==============================================================================
-- 5. 序列号安全复位 (防止后续业务自增冲突)
-- ==============================================================================
DO $$
BEGIN
IF pg_get_serial_sequence('iotlocks.lock_group', 'group_id') IS NOT NULL THEN
PERFORM setval(pg_get_serial_sequence('iotlocks.lock_group', 'group_id'), greatest((SELECT coalesce(max(group_id), 0) FROM iotlocks.lock_group), 1001));
END IF;
IF pg_get_serial_sequence('iotlocks.lock_gateway', 'gateway_id') IS NOT NULL THEN
PERFORM setval(pg_get_serial_sequence('iotlocks.lock_gateway', 'gateway_id'), greatest((SELECT coalesce(max(gateway_id), 0) FROM iotlocks.lock_gateway), 1001));
END IF;
IF pg_get_serial_sequence('iotlocks.lock_device', 'device_id') IS NOT NULL THEN
PERFORM setval(pg_get_serial_sequence('iotlocks.lock_device', 'device_id'), greatest((SELECT coalesce(max(device_id), 0) FROM iotlocks.lock_device), 1002));
END IF;
IF pg_get_serial_sequence('iotlocks.lock_face', 'face_id') IS NOT NULL THEN
PERFORM setval(pg_get_serial_sequence('iotlocks.lock_face', 'face_id'), greatest((SELECT coalesce(max(face_id), 0) FROM iotlocks.lock_face), 1002));
END IF;
IF pg_get_serial_sequence('iotlocks.lock_auth', 'auth_id') IS NOT NULL THEN
PERFORM setval(pg_get_serial_sequence('iotlocks.lock_auth', 'auth_id'), greatest((SELECT coalesce(max(auth_id), 0) FROM iotlocks.lock_auth), 1002));
END IF;
IF pg_get_serial_sequence('public.train_enrollment', 'enrollment_id') IS NOT NULL THEN
PERFORM setval(pg_get_serial_sequence('public.train_enrollment', 'enrollment_id'), greatest((SELECT coalesce(max(enrollment_id), 0) FROM public.train_enrollment), 2002));
END IF;
IF pg_get_serial_sequence('public.train_accommodation', 'accommodation_id') IS NOT NULL THEN
PERFORM setval(pg_get_serial_sequence('public.train_accommodation', 'accommodation_id'), greatest((SELECT coalesce(max(accommodation_id), 0) FROM public.train_accommodation), 2003));
END IF;
END $$;
COMMIT;