-- ============================================================ -- E2E 服务预约前置数据 seed(幂等,本机与 CI 通用) -- -- 为什么需要(两个缺一不可的原因): -- 1. 全新库里 `service_locations` 是**空表** —— 没有任何迁移种站点, -- 本机那两个站(含旧脚本留下的「E2E 预约测试站」)都是手工产物。 -- 没有站点就没有 serviceLocationId,预约根本创建不了。 -- 2. 运营确认/完成/取消受**数据范围**约束,不是「有权限就行」: -- `ServiceAppointmentService.assertOperatorScope` 走 -- `canAccessByOperator`,条件为 -- sa.assigned_operator_id = :operatorId -- OR EXISTS(service_location_operators 中该站点关联了 :operatorId) -- —— super_admin 也**不豁免**(实测 e2e_admin 确认预约返回 403)。 -- 因此必须显式建立「站点 → 运营」关联。 -- -- 关联的运营是 seed_e2e_operators.sql 建的 `e2e_station`(service_station_operator), -- 它同时持有 service_location.view 与 service_appointment.confirm / .complete。 -- -- 幂等:全部 ON CONFLICT DO NOTHING,可重复执行。 -- 固定 UUID:测试按常量引用(见 service_appointment_test.py 的 E2E_STATION_ID)。 -- ============================================================ INSERT INTO service_locations (id, name, short_name, address, status) VALUES ( 'e2e00000-0000-0000-0000-0000000000b1', 'E2E 预约测试服务站', 'E2E 服务站', 'E2E 测试地址(仅预约用例使用)', 'active' ) ON CONFLICT (id) DO NOTHING; INSERT INTO service_location_operators (service_location_id, operator_id, created_by) VALUES ( 'e2e00000-0000-0000-0000-0000000000b1', 'e2e00000-0000-0000-0000-000000000004', -- e2e_station 'e2e00000-0000-0000-0000-000000000001' -- e2e_admin(created_by 仅审计) ) ON CONFLICT (service_location_id, operator_id) DO NOTHING;