422 lines
13 KiB
SQL
422 lines
13 KiB
SQL
CREATE TABLE IF NOT EXISTS users (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
username text NOT NULL UNIQUE,
|
|
email text NOT NULL UNIQUE,
|
|
password_hash text NOT NULL,
|
|
full_name text,
|
|
role text NOT NULL DEFAULT 'user',
|
|
active boolean NOT NULL DEFAULT true,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS rooms (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name text NOT NULL,
|
|
code text,
|
|
location text,
|
|
description text,
|
|
capacity bigint,
|
|
stage varchar(32),
|
|
region varchar(64),
|
|
status text NOT NULL DEFAULT 'active',
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS devices (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
device_key text NOT NULL UNIQUE,
|
|
name text NOT NULL,
|
|
kind text NOT NULL DEFAULT 'sensor',
|
|
model text,
|
|
firmware text,
|
|
online_status text NOT NULL DEFAULT 'online',
|
|
last_seen timestamptz,
|
|
room_id uuid NOT NULL,
|
|
topic text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_devices_room_id ON devices (room_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS sensors (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name text NOT NULL,
|
|
metric text NOT NULL,
|
|
unit text,
|
|
data_type text,
|
|
device_id uuid NOT NULL,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_sensors_device_id ON sensors (device_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS thresholds (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name text,
|
|
min_value double precision NOT NULL,
|
|
max_value double precision NOT NULL,
|
|
debounce_seconds bigint NOT NULL DEFAULT 5,
|
|
severity bigint NOT NULL DEFAULT 3,
|
|
enabled boolean NOT NULL DEFAULT true,
|
|
sensor_id uuid NOT NULL,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_thresholds_sensor_id ON thresholds (sensor_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS alarms (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
code text,
|
|
title text,
|
|
message text,
|
|
severity text,
|
|
open boolean NOT NULL DEFAULT true,
|
|
acknowledged boolean NOT NULL DEFAULT false,
|
|
acknowledged_at timestamptz,
|
|
triggered_at timestamptz NOT NULL,
|
|
resolved_at timestamptz,
|
|
device_key text,
|
|
metric text,
|
|
value double precision,
|
|
threshold_min double precision,
|
|
threshold_max double precision
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_alarms_device_open_triggered ON alarms (device_key, open, triggered_at);
|
|
|
|
CREATE TABLE IF NOT EXISTS cameras (
|
|
id bigserial PRIMARY KEY,
|
|
room_id text,
|
|
code varchar(64) NOT NULL,
|
|
name varchar(128) NOT NULL,
|
|
rtsp_url varchar(512),
|
|
http_url varchar(512),
|
|
username varchar(64),
|
|
password_enc varchar(255),
|
|
position varchar(255),
|
|
resolution varchar(32),
|
|
fps bigint,
|
|
is_online boolean NOT NULL DEFAULT true,
|
|
gb_device_id varchar(20),
|
|
gb_channel_id varchar(20),
|
|
gb_auth_id varchar(20),
|
|
gb_auth_password varchar(255),
|
|
gb_stream_type varchar(10),
|
|
gb_transport varchar(10),
|
|
gb_alarm_channel_id varchar(20),
|
|
gb_voice_channel_id varchar(20),
|
|
gb_manufacturer varchar(64),
|
|
manufacturer_id varchar(64),
|
|
enabled boolean NOT NULL DEFAULT true,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_cameras_room_id ON cameras (room_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS video_clips (
|
|
id bigserial PRIMARY KEY,
|
|
trigger text NOT NULL DEFAULT 'alarm',
|
|
file_path text,
|
|
duration_sec real NOT NULL DEFAULT 0,
|
|
start_at timestamptz NOT NULL,
|
|
end_at timestamptz,
|
|
resolution text,
|
|
size_bytes bigint,
|
|
notes text,
|
|
camera_id text NOT NULL,
|
|
room_id text,
|
|
alarm_id text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
s3_bucket text,
|
|
s3_key text
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_video_clips_alarm_id ON video_clips (alarm_id);
|
|
CREATE INDEX IF NOT EXISTS idx_video_clips_room_id ON video_clips (room_id);
|
|
CREATE INDEX IF NOT EXISTS idx_video_clips_camera_id ON video_clips (camera_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS audit_logs (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id uuid,
|
|
username text,
|
|
action text NOT NULL,
|
|
resource text,
|
|
target_id text,
|
|
description text,
|
|
ip_address text,
|
|
user_agent text,
|
|
metadata jsonb,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_audit_logs_resource_target ON audit_logs (resource, target_id);
|
|
CREATE INDEX IF NOT EXISTS idx_audit_logs_action_created ON audit_logs (action, created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_audit_logs_user_created ON audit_logs (user_id, created_at);
|
|
|
|
CREATE TABLE IF NOT EXISTS telemetry (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
device_key text NOT NULL,
|
|
metric text NOT NULL,
|
|
value double precision NOT NULL,
|
|
timestamp timestamptz NOT NULL
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_telemetry_device_timestamp ON telemetry (device_key, timestamp);
|
|
|
|
CREATE TABLE IF NOT EXISTS permissions (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
code text NOT NULL,
|
|
name text NOT NULL,
|
|
description text,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_permissions_code ON permissions (code);
|
|
|
|
CREATE TABLE IF NOT EXISTS role_permissions (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
role text NOT NULL,
|
|
permission_id uuid NOT NULL,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_role_permissions_role_code ON role_permissions (role, permission_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS diseases (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name varchar(64) NOT NULL,
|
|
category varchar(32) NOT NULL,
|
|
pathogen text NOT NULL,
|
|
transmission text NOT NULL,
|
|
medium text NOT NULL,
|
|
incubation text NOT NULL,
|
|
symptoms text NOT NULL,
|
|
high_risk_stage text NOT NULL,
|
|
high_risk_condition text NOT NULL,
|
|
lethal_time text NOT NULL,
|
|
spread_trend text NOT NULL,
|
|
recurrence text NOT NULL,
|
|
detection text NOT NULL,
|
|
prevention text NOT NULL,
|
|
image_url varchar(512),
|
|
sort_order bigint NOT NULL DEFAULT 0,
|
|
enabled boolean NOT NULL DEFAULT true,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_diseases_category ON diseases (category);
|
|
|
|
CREATE TABLE IF NOT EXISTS knowledge_articles (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
kind varchar(32) NOT NULL,
|
|
title varchar(128) NOT NULL,
|
|
summary text NOT NULL,
|
|
content text NOT NULL,
|
|
sort_order bigint NOT NULL DEFAULT 0,
|
|
enabled boolean NOT NULL DEFAULT true,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_knowledge_articles_kind ON knowledge_articles (kind);
|
|
|
|
CREATE TABLE IF NOT EXISTS inspection_records (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id uuid,
|
|
room_id uuid,
|
|
image_url varchar(512),
|
|
detections jsonb,
|
|
risk_score double precision,
|
|
risk_level varchar(16),
|
|
ai_status varchar(16) NOT NULL DEFAULT 'done',
|
|
idempotency_key varchar(128),
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_inspection_records_idempotency_key ON inspection_records (idempotency_key);
|
|
CREATE INDEX IF NOT EXISTS idx_inspection_records_room_id ON inspection_records (room_id);
|
|
CREATE INDEX IF NOT EXISTS idx_inspection_records_user_id ON inspection_records (user_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS trays (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name varchar(64) NOT NULL,
|
|
code varchar(64),
|
|
position varchar(128),
|
|
room_id uuid NOT NULL,
|
|
enabled boolean NOT NULL DEFAULT true,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_trays_room_id ON trays (room_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS batches (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
room_id uuid NOT NULL,
|
|
name varchar(64) NOT NULL,
|
|
variety varchar(64),
|
|
source varchar(128),
|
|
seed_batch_no varchar(64),
|
|
quarantine_no varchar(64),
|
|
instar bigint,
|
|
entered_at timestamptz,
|
|
mount_at timestamptz,
|
|
status varchar(16) NOT NULL DEFAULT 'rearing',
|
|
note text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_batches_room_id ON batches (room_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS rearing_records (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
batch_id uuid NOT NULL,
|
|
record_date timestamptz NOT NULL,
|
|
instar bigint,
|
|
mulberry_source varchar(128),
|
|
density varchar(64),
|
|
note text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_rearing_records_batch_id ON rearing_records (batch_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS wechat_bindings (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id uuid NOT NULL,
|
|
open_id varchar(128) NOT NULL,
|
|
authorized_templates jsonb,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_wechat_bindings_open_id ON wechat_bindings (open_id);
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_wechat_bindings_user_id ON wechat_bindings (user_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS weather_alerts (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
disease varchar(64) NOT NULL,
|
|
level varchar(16) NOT NULL,
|
|
reason text NOT NULL,
|
|
snapshot jsonb,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS lamp_tests (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
method varchar(32) NOT NULL DEFAULT 'lamp',
|
|
room_id uuid,
|
|
batch_id uuid,
|
|
diseases jsonb,
|
|
status varchar(16) NOT NULL DEFAULT 'pending',
|
|
sample_info varchar(255),
|
|
result varchar(16),
|
|
result_image_url varchar(512),
|
|
operator_id uuid,
|
|
resulted_at timestamptz,
|
|
cross_status varchar(16) NOT NULL DEFAULT 'pending',
|
|
cross_reason text,
|
|
extra_data jsonb,
|
|
note text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_lamp_tests_batch_id ON lamp_tests (batch_id);
|
|
CREATE INDEX IF NOT EXISTS idx_lamp_tests_room_id ON lamp_tests (room_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS lamp_test_steps (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
lamp_test_id uuid NOT NULL,
|
|
step_no bigint NOT NULL,
|
|
name varchar(64) NOT NULL,
|
|
done boolean NOT NULL DEFAULT false,
|
|
done_at timestamptz,
|
|
note text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_lamp_test_steps_lamp_test_id ON lamp_test_steps (lamp_test_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS consumables (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name varchar(64) NOT NULL,
|
|
category varchar(32) NOT NULL,
|
|
spec varchar(128),
|
|
quantity double precision NOT NULL,
|
|
unit varchar(32),
|
|
min_quantity double precision NOT NULL,
|
|
expiry_date timestamptz,
|
|
supplier varchar(128),
|
|
note text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_consumables_category ON consumables (category);
|
|
|
|
CREATE TABLE IF NOT EXISTS consultations (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
room_id uuid,
|
|
batch_id uuid,
|
|
lamp_test_id uuid,
|
|
title varchar(128) NOT NULL,
|
|
summary text,
|
|
snapshot jsonb,
|
|
status varchar(16) NOT NULL DEFAULT 'pending',
|
|
expert_id uuid,
|
|
opinion text,
|
|
plan text,
|
|
resolved_at timestamptz,
|
|
archived_at timestamptz,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_consultations_lamp_test_id ON consultations (lamp_test_id);
|
|
CREATE INDEX IF NOT EXISTS idx_consultations_batch_id ON consultations (batch_id);
|
|
CREATE INDEX IF NOT EXISTS idx_consultations_room_id ON consultations (room_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS spectrum_entries (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
disease varchar(64) NOT NULL,
|
|
source varchar(128),
|
|
data_url varchar(512),
|
|
note text,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS trace_records (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
room_id uuid,
|
|
lamp_test_id uuid,
|
|
consultation_id uuid,
|
|
disease varchar(64) NOT NULL,
|
|
status varchar(16) NOT NULL DEFAULT 'pending',
|
|
origin varchar(32),
|
|
confidence double precision,
|
|
auto_report jsonb,
|
|
checklist jsonb,
|
|
analysis_report jsonb,
|
|
expert_note text,
|
|
lab_note text,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_trace_records_consultation_id ON trace_records (consultation_id);
|
|
CREATE INDEX IF NOT EXISTS idx_trace_records_lamp_test_id ON trace_records (lamp_test_id);
|
|
CREATE INDEX IF NOT EXISTS idx_trace_records_room_id ON trace_records (room_id);
|
|
|