QAUP_Management/sql/fix_missing_vehicle_commands_table.sql
Tian jianyong 5e1e9f4507 统一了前后端到一个项目,实现了无人车的位置和超速检测,并发送到前端。
管理端在 Ruoyi 框架的基础上,对菜单进行了修改,并添加了司机信息、车辆信息和车辆类型管理。
2025-07-08 20:04:14 +08:00

123 lines
5.1 KiB
PL/PgSQL
Raw 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.

-- ============================================
-- 修复缺失的vehicle_commands表
-- 补充vehicle_commands表创建并应用字段修复
-- 创建时间: 2025-01-15
-- ============================================
-- 1. 创建vehicle_commands表如果不存在
CREATE TABLE IF NOT EXISTS vehicle_commands (
id BIGSERIAL PRIMARY KEY,
trans_id VARCHAR(100) NOT NULL,
timestamp TIMESTAMP NOT NULL,
vehicle_id VARCHAR(50) NOT NULL,
command_type VARCHAR(20) NOT NULL CHECK (command_type IN ('ALERT', 'SIGNAL', 'WARNING', 'RESUME', 'PARKING')),
command_reason VARCHAR(30) NOT NULL CHECK (command_reason IN ('TRAFFIC_LIGHT', 'AIRCRAFT_CROSSING', 'SPECIAL_VEHICLE', 'AIRCRAFT_PUSH', 'RESUME_TRAFFIC', 'PARKING_SIDE')),
signal_state VARCHAR(10) CHECK (signal_state IN ('RED', 'YELLOW', 'GREEN')),
intersection_id VARCHAR(50),
target_location GEOMETRY(POINT, 4326) NOT NULL,
relative_speed DOUBLE PRECISION,
relative_motion_x DOUBLE PRECISION,
relative_motion_y DOUBLE PRECISION,
min_distance DOUBLE PRECISION,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- 2. 创建索引
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_vehicle_id ON vehicle_commands(vehicle_id);
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_timestamp ON vehicle_commands(timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_trans_id ON vehicle_commands(trans_id);
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_command_type ON vehicle_commands(command_type);
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_created_at ON vehicle_commands(created_at);
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_location_gist ON vehicle_commands USING GIST(target_location);
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_vehicle_time ON vehicle_commands(vehicle_id, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_type_time ON vehicle_commands(command_type, timestamp DESC);
-- 3. 添加表注释
COMMENT ON TABLE vehicle_commands IS '无人车控制指令表,用于存储发送给无人车的控制指令,支持轨迹回放和日志审计';
-- 4. 现在应用字段修复(这是之前失败的部分)
-- 添加license_plate字段
ALTER TABLE vehicle_commands ADD COLUMN IF NOT EXISTS license_plate VARCHAR(50);
-- 复制现有数据
UPDATE vehicle_commands SET license_plate = vehicle_id WHERE license_plate IS NULL;
-- 添加索引
CREATE INDEX IF NOT EXISTS idx_vehicle_commands_license_plate ON vehicle_commands(license_plate);
-- 添加sys_vehicle_id字段
ALTER TABLE vehicle_commands ADD COLUMN IF NOT EXISTS sys_vehicle_id BIGINT;
-- 5. 添加字段注释
COMMENT ON COLUMN vehicle_commands.license_plate IS '车牌号对应sys_vehicle_info.license_plate_number';
COMMENT ON COLUMN vehicle_commands.sys_vehicle_id IS '系统车辆ID对应sys_vehicle_info.vehicle_id';
-- 6. 更新数据同步函数重新创建以包含vehicle_commands表
CREATE OR REPLACE FUNCTION update_sys_vehicle_id()
RETURNS void AS $$
BEGIN
-- 更新vehicle_locations表
UPDATE vehicle_locations vl
SET sys_vehicle_id = vi.vehicle_id
FROM sys_vehicle_info vi
WHERE vl.license_plate = vi.license_plate_number
AND vl.sys_vehicle_id IS NULL;
-- 更新vehicle_trajectories表
UPDATE vehicle_trajectories vt
SET sys_vehicle_id = vi.vehicle_id
FROM sys_vehicle_info vi
WHERE vt.license_plate = vi.license_plate_number
AND vt.sys_vehicle_id IS NULL;
-- 更新vehicle_commands表
UPDATE vehicle_commands vc
SET sys_vehicle_id = vi.vehicle_id
FROM sys_vehicle_info vi
WHERE vc.license_plate = vi.license_plate_number
AND vc.sys_vehicle_id IS NULL;
-- 更新rule_violation_events表
UPDATE rule_violation_events rve
SET sys_vehicle_id = vi.vehicle_id
FROM sys_vehicle_info vi
WHERE rve.license_plate = vi.license_plate_number
AND rve.sys_vehicle_id IS NULL
AND rve.subject_type = 'VEHICLE';
RAISE NOTICE '车辆ID同步完成包含vehicle_commands表';
END;
$$ LANGUAGE plpgsql;
-- 7. 执行一次数据同步
SELECT update_sys_vehicle_id();
-- 8. 验证修复结果
SELECT 'vehicle_commands' as table_name,
COUNT(*) as total_records,
COUNT(license_plate) as has_license_plate,
COUNT(sys_vehicle_id) as has_sys_vehicle_id
FROM vehicle_commands;
-- 9. 检查表结构
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = 'vehicle_commands'
AND column_name IN ('vehicle_id', 'license_plate', 'sys_vehicle_id')
ORDER BY column_name;
-- ============================================
-- 完成提示
-- ============================================
DO $$
BEGIN
RAISE NOTICE '==============================================';
RAISE NOTICE 'vehicle_commands表修复完成';
RAISE NOTICE '1. 创建了缺失的vehicle_commands表';
RAISE NOTICE '2. 添加了license_plate和sys_vehicle_id字段';
RAISE NOTICE '3. 更新了数据同步函数';
RAISE NOTICE '现在车辆ID映射关系已完全修复';
RAISE NOTICE '==============================================';
END $$;