117 lines
4.1 KiB
SQL
117 lines
4.1 KiB
SQL
-- Operation-system business tables (design doc §4 / §12 P1).
|
|
-- Six ops configuration tables + event attribution columns.
|
|
|
|
-- 1. station: 工位
|
|
CREATE TABLE station (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
code TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
line_code TEXT,
|
|
segment_code TEXT,
|
|
station_type TEXT NOT NULL,
|
|
enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
|
description TEXT,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
UNIQUE (code)
|
|
);
|
|
|
|
CREATE INDEX idx_station_line_code ON station(line_code);
|
|
CREATE INDEX idx_station_segment_code ON station(segment_code);
|
|
|
|
-- 2. station_signal: 工位 ↔ 信号绑定
|
|
CREATE TABLE station_signal (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
station_id UUID NOT NULL REFERENCES station(id) ON DELETE CASCADE,
|
|
signal_role TEXT NOT NULL,
|
|
point_id UUID REFERENCES point(id) ON DELETE SET NULL,
|
|
derived_from_role TEXT,
|
|
invert_value BOOLEAN NOT NULL DEFAULT FALSE,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
UNIQUE (station_id, signal_role)
|
|
);
|
|
|
|
CREATE INDEX idx_station_signal_point_id ON station_signal(point_id);
|
|
|
|
-- 3. process_segment: 流程段
|
|
CREATE TABLE process_segment (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
code TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
segment_type TEXT NOT NULL,
|
|
line_code TEXT,
|
|
priority INTEGER NOT NULL DEFAULT 0,
|
|
enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
|
mode TEXT NOT NULL DEFAULT 'disabled',
|
|
require_manual_ack_after_fault BOOLEAN NOT NULL DEFAULT TRUE,
|
|
description TEXT,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
UNIQUE (code)
|
|
);
|
|
|
|
CREATE INDEX idx_process_segment_line_code ON process_segment(line_code);
|
|
CREATE INDEX idx_process_segment_enabled ON process_segment(enabled);
|
|
|
|
-- 4. segment_step: 段步骤
|
|
CREATE TABLE segment_step (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
segment_id UUID NOT NULL REFERENCES process_segment(id) ON DELETE CASCADE,
|
|
step_no INTEGER NOT NULL,
|
|
step_code TEXT NOT NULL,
|
|
action_kind TEXT NOT NULL,
|
|
target_equipment_id UUID REFERENCES equipment(id) ON DELETE SET NULL,
|
|
target_station_id UUID REFERENCES station(id) ON DELETE SET NULL,
|
|
confirm_signal_role TEXT,
|
|
confirm_point_id UUID REFERENCES point(id) ON DELETE SET NULL,
|
|
expected_value BOOLEAN NOT NULL DEFAULT TRUE,
|
|
timeout_ms INTEGER NOT NULL DEFAULT 30000 CHECK (timeout_ms > 0),
|
|
command_role TEXT,
|
|
stop_command_role TEXT,
|
|
pulse_ms INTEGER CHECK (pulse_ms IS NULL OR pulse_ms > 0),
|
|
hold_until_confirm BOOLEAN NOT NULL DEFAULT FALSE,
|
|
cancel_on_fault BOOLEAN NOT NULL DEFAULT TRUE,
|
|
next_step_no_on_success INTEGER,
|
|
next_step_no_on_failure INTEGER,
|
|
on_timeout TEXT NOT NULL DEFAULT 'fault',
|
|
description TEXT,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
UNIQUE (segment_id, step_no)
|
|
);
|
|
|
|
CREATE INDEX idx_segment_step_segment_id ON segment_step(segment_id);
|
|
|
|
-- 5. segment_interlock: 段联锁
|
|
CREATE TABLE segment_interlock (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
segment_id UUID NOT NULL REFERENCES process_segment(id) ON DELETE CASCADE,
|
|
applies_to TEXT NOT NULL,
|
|
rule_kind TEXT NOT NULL,
|
|
point_id UUID REFERENCES point(id) ON DELETE SET NULL,
|
|
station_id UUID REFERENCES station(id) ON DELETE SET NULL,
|
|
equipment_id UUID REFERENCES equipment(id) ON DELETE SET NULL,
|
|
expected_value BOOLEAN,
|
|
description TEXT,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_segment_interlock_segment_id ON segment_interlock(segment_id);
|
|
|
|
-- 6. segment_resource: 段资源声明
|
|
CREATE TABLE segment_resource (
|
|
segment_id UUID NOT NULL REFERENCES process_segment(id) ON DELETE CASCADE,
|
|
resource_key TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
PRIMARY KEY (segment_id, resource_key)
|
|
);
|
|
|
|
-- 7. event attribution: subject_type / subject_id (design doc §4.2.8)
|
|
ALTER TABLE event
|
|
ADD COLUMN subject_type TEXT,
|
|
ADD COLUMN subject_id UUID;
|
|
|
|
CREATE INDEX idx_event_subject ON event(subject_type, subject_id);
|