Initial Plast Track MVP

This commit is contained in:
masterdev
2026-06-15 13:35:22 +01:00
commit 3bf4c622d8
47 changed files with 7339 additions and 0 deletions

106
database/init.sql Normal file
View File

@@ -0,0 +1,106 @@
CREATE TABLE IF NOT EXISTS machines (
id SERIAL PRIMARY KEY,
code VARCHAR(50) NOT NULL UNIQUE,
name VARCHAR(120) NOT NULL,
brand VARCHAR(120),
model VARCHAR(120),
status VARCHAR(50) NOT NULL DEFAULT 'hors_planning',
is_active BOOLEAN NOT NULL DEFAULT TRUE,
powered_on BOOLEAN NOT NULL DEFAULT TRUE,
cycle_signal_edge VARCHAR(20) NOT NULL DEFAULT 'rising',
debounce_ms INTEGER NOT NULL DEFAULT 300,
min_cycle_time_sec INTEGER NOT NULL DEFAULT 5,
max_cycle_time_sec INTEGER NOT NULL DEFAULT 300,
stop_detection_delay_sec INTEGER NOT NULL DEFAULT 180,
last_cycle_at TIMESTAMPTZ,
status_since TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS production_orders (
id SERIAL PRIMARY KEY,
order_number VARCHAR(80) NOT NULL UNIQUE,
machine_id INTEGER NOT NULL REFERENCES machines(id),
article_ref VARCHAR(80) NOT NULL,
article_name VARCHAR(160) NOT NULL,
mold_ref VARCHAR(80),
material_ref VARCHAR(80),
planned_qty INTEGER NOT NULL,
cavities INTEGER NOT NULL DEFAULT 1,
theoretical_cycle_time_sec DOUBLE PRECISION NOT NULL,
status VARCHAR(40) NOT NULL DEFAULT 'planned',
started_at TIMESTAMPTZ,
ended_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS downtime_reasons (
code VARCHAR(80) PRIMARY KEY,
label VARCHAR(160) NOT NULL
);
CREATE TABLE IF NOT EXISTS scrap_reasons (
code VARCHAR(80) PRIMARY KEY,
label VARCHAR(160) NOT NULL
);
CREATE TABLE IF NOT EXISTS operators (
id SERIAL PRIMARY KEY,
name VARCHAR(120) NOT NULL UNIQUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS machine_events (
id SERIAL PRIMARY KEY,
machine_id INTEGER NOT NULL REFERENCES machines(id),
event_type VARCHAR(80) NOT NULL,
timestamp TIMESTAMPTZ NOT NULL,
payload JSONB NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS cycles (
id SERIAL PRIMARY KEY,
machine_id INTEGER NOT NULL REFERENCES machines(id),
production_order_id INTEGER REFERENCES production_orders(id),
timestamp TIMESTAMPTZ NOT NULL,
cycle_time_sec DOUBLE PRECISION NOT NULL,
cavities INTEGER NOT NULL DEFAULT 1,
produced_qty INTEGER NOT NULL DEFAULT 1,
is_valid BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS downtimes (
id SERIAL PRIMARY KEY,
machine_id INTEGER NOT NULL REFERENCES machines(id),
production_order_id INTEGER REFERENCES production_orders(id),
start_time TIMESTAMPTZ NOT NULL,
end_time TIMESTAMPTZ,
duration_sec INTEGER,
reason_code VARCHAR(80) REFERENCES downtime_reasons(code),
comment TEXT,
auto_detected BOOLEAN NOT NULL DEFAULT TRUE,
qualified_by VARCHAR(120),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS scraps (
id SERIAL PRIMARY KEY,
machine_id INTEGER NOT NULL REFERENCES machines(id),
production_order_id INTEGER REFERENCES production_orders(id),
quantity INTEGER NOT NULL,
reason_code VARCHAR(80) NOT NULL REFERENCES scrap_reasons(code),
comment TEXT,
operator_name VARCHAR(120) NOT NULL,
timestamp TIMESTAMPTZ NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_machine_events_machine_time ON machine_events(machine_id, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_cycles_machine_time ON cycles(machine_id, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_downtimes_machine_time ON downtimes(machine_id, start_time DESC);
CREATE INDEX IF NOT EXISTS idx_scraps_machine_time ON scraps(machine_id, timestamp DESC);