14 lines
4.0 KiB
SQL
14 lines
4.0 KiB
SQL
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
|
CREATE TABLE IF NOT EXISTS devices (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),name VARCHAR(128) NOT NULL,protocol_type VARCHAR(32) NOT NULL CHECK(protocol_type IN('S7','MODBUS_TCP')),enabled BOOLEAN NOT NULL DEFAULT TRUE,deleted BOOLEAN NOT NULL DEFAULT FALSE,host VARCHAR(256) NOT NULL,port INTEGER NOT NULL CHECK(port BETWEEN 1 AND 65535),connect_timeout INTEGER NOT NULL DEFAULT 5 CHECK(connect_timeout BETWEEN 1 AND 60),reconnect_interval INTEGER NOT NULL DEFAULT 10 CHECK(reconnect_interval BETWEEN 1 AND 3600),protocol_config JSONB NOT NULL DEFAULT '{}',created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),created_by VARCHAR(64),updated_by VARCHAR(64));
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_devices_name ON devices(name) WHERE deleted=FALSE;
|
|
CREATE TABLE IF NOT EXISTS collection_points (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),name VARCHAR(128) NOT NULL,group_name VARCHAR(64) NOT NULL DEFAULT 'default',device_id UUID NOT NULL REFERENCES devices(id),enabled BOOLEAN NOT NULL DEFAULT TRUE,deleted BOOLEAN NOT NULL DEFAULT FALSE,address VARCHAR(256) NOT NULL,data_type VARCHAR(16) NOT NULL CHECK(data_type IN('BOOL','INT','REAL')),unit VARCHAR(32),valid_min DOUBLE PRECISION,valid_max DOUBLE PRECISION,collect_interval INTEGER NOT NULL DEFAULT 1 CHECK(collect_interval>=1),store_history BOOLEAN NOT NULL DEFAULT TRUE,history_interval INTEGER NOT NULL DEFAULT 1 CHECK(history_interval BETWEEN 1 AND 1440),history_started_at TIMESTAMPTZ,created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),created_by VARCHAR(64),updated_by VARCHAR(64),CHECK(valid_min IS NULL OR valid_max IS NULL OR valid_min<=valid_max));
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_collection_points_name ON collection_points(name) WHERE deleted=FALSE;
|
|
CREATE INDEX IF NOT EXISTS idx_collection_points_device_id ON collection_points(device_id) WHERE deleted=FALSE;
|
|
CREATE INDEX IF NOT EXISTS idx_collection_points_group_name ON collection_points(group_name) WHERE deleted=FALSE;
|
|
CREATE TABLE IF NOT EXISTS write_points (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),name VARCHAR(128) NOT NULL,group_name VARCHAR(64) NOT NULL DEFAULT 'default',device_id UUID NOT NULL REFERENCES devices(id),enabled BOOLEAN NOT NULL DEFAULT TRUE,write_enabled BOOLEAN NOT NULL DEFAULT FALSE,deleted BOOLEAN NOT NULL DEFAULT FALSE,address VARCHAR(256) NOT NULL,data_type VARCHAR(16) NOT NULL CHECK(data_type IN('BOOL','INT','REAL')),unit VARCHAR(32),readback_tolerance DOUBLE PRECISION NOT NULL DEFAULT .0001 CHECK(readback_tolerance BETWEEN 0 AND 1000000),created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),created_by VARCHAR(64),updated_by VARCHAR(64));
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_write_points_name ON write_points(name) WHERE deleted=FALSE;
|
|
CREATE INDEX IF NOT EXISTS idx_write_points_device_id ON write_points(device_id) WHERE deleted=FALSE;
|
|
CREATE TABLE IF NOT EXISTS write_logs (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),point_id UUID NOT NULL REFERENCES write_points(id),point_name VARCHAR(128) NOT NULL,device_id UUID NOT NULL REFERENCES devices(id),device_name VARCHAR(128) NOT NULL,address VARCHAR(256) NOT NULL,data_type VARCHAR(16) NOT NULL,unit VARCHAR(32),source VARCHAR(16) NOT NULL DEFAULT 'manual' CHECK(source='manual'),target_value TEXT NOT NULL,readback_value TEXT,result VARCHAR(16) NOT NULL CHECK(result IN('success','failed','timeout')),error_message TEXT,operator VARCHAR(64),reason VARCHAR(500),created_at TIMESTAMPTZ NOT NULL DEFAULT NOW());
|
|
CREATE INDEX IF NOT EXISTS idx_write_logs_point_id ON write_logs(point_id); CREATE INDEX IF NOT EXISTS idx_write_logs_device_id ON write_logs(device_id); CREATE INDEX IF NOT EXISTS idx_write_logs_created_at ON write_logs(created_at DESC);
|
|
CREATE TABLE IF NOT EXISTS system_settings(key VARCHAR(64) PRIMARY KEY,value JSONB NOT NULL,updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()); INSERT INTO system_settings(key,value) VALUES('history_retention_days','365') ON CONFLICT(key) DO NOTHING;
|