From b24e0818f021240a8c051b5627118102540d1050 Mon Sep 17 00:00:00 2001 From: chiguyong Date: Tue, 24 Mar 2026 01:06:44 +0800 Subject: [PATCH] feat: add database migration script for ops tables --- sql/V3.0__ops_maintenance_and_energy.sql | 227 +++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 sql/V3.0__ops_maintenance_and_energy.sql diff --git a/sql/V3.0__ops_maintenance_and_energy.sql b/sql/V3.0__ops_maintenance_and_energy.sql new file mode 100644 index 0000000..9d54f4e --- /dev/null +++ b/sql/V3.0__ops_maintenance_and_energy.sql @@ -0,0 +1,227 @@ +-- ============================================ +-- V3.0__ops_maintenance_and_energy.sql +-- 运营管理模块 - 维保计划、维保任务、能耗监控 +-- ============================================ + +-- ============================================ +-- 维保计划表 +-- ============================================ +CREATE TABLE IF NOT EXISTS ops_maintenance_plan ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID NOT NULL, + plan_code VARCHAR(50) UNIQUE NOT NULL, + plan_name VARCHAR(100) NOT NULL, + equipment_type VARCHAR(50), + trigger_type VARCHAR(30) NOT NULL, + trigger_value INTEGER, + trigger_unit VARCHAR(20), + maintenance_items TEXT, + estimated_duration INTEGER, + assigned_to UUID, + sla_response_hours INTEGER, + sla_complete_hours INTEGER, + status VARCHAR(20) DEFAULT 'ACTIVE', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_maintenance_plan_project ON ops_maintenance_plan(project_id); +CREATE INDEX IF NOT EXISTS idx_maintenance_plan_status ON ops_maintenance_plan(status); +CREATE INDEX IF NOT EXISTS idx_maintenance_plan_trigger ON ops_maintenance_plan(trigger_type); + +-- ============================================ +-- 维保任务表 +-- ============================================ +CREATE TABLE IF NOT EXISTS ops_maintenance_task ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID NOT NULL, + task_code VARCHAR(50) UNIQUE NOT NULL, + plan_id UUID, + equipment_id UUID, + task_type VARCHAR(20) DEFAULT 'PREVENTIVE', + trigger_type VARCHAR(30), + maintenance_items TEXT, + status VARCHAR(20) DEFAULT 'PENDING', + assigned_to UUID, + scheduled_date TIMESTAMP, + actual_start_date TIMESTAMP, + actual_end_date TIMESTAMP, + labor_hours DECIMAL(10,2), + materials_cost DECIMAL(12,2), + remarks TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_maintenance_task_project ON ops_maintenance_task(project_id); +CREATE INDEX IF NOT EXISTS idx_maintenance_task_status ON ops_maintenance_task(status); +CREATE INDEX IF NOT EXISTS idx_maintenance_task_equipment ON ops_maintenance_task(equipment_id); +CREATE INDEX IF NOT EXISTS idx_maintenance_task_assignee ON ops_maintenance_task(assigned_to); +CREATE INDEX IF NOT EXISTS idx_maintenance_task_scheduled ON ops_maintenance_task(scheduled_date); + +-- ============================================ +-- 能耗计量点表 +-- ============================================ +CREATE TABLE IF NOT EXISTS ops_energy_meter ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID NOT NULL, + meter_code VARCHAR(50) UNIQUE NOT NULL, + meter_name VARCHAR(100) NOT NULL, + energy_type VARCHAR(20) NOT NULL, + space_node_id UUID, + installation_location VARCHAR(200), + rated_capacity DECIMAL(10,2), + unit_price DECIMAL(10,4), + status VARCHAR(20) DEFAULT 'ACTIVE', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_energy_meter_project ON ops_energy_meter(project_id); +CREATE INDEX IF NOT EXISTS idx_energy_meter_type ON ops_energy_meter(energy_type); +CREATE INDEX IF NOT EXISTS idx_energy_meter_space ON ops_energy_meter(space_node_id); + +-- ============================================ +-- 能耗记录表 +-- ============================================ +CREATE TABLE IF NOT EXISTS ops_energy_consumption ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID NOT NULL, + meter_id UUID NOT NULL, + consumption_date DATE NOT NULL, + previous_reading DECIMAL(12,2), + current_reading DECIMAL(12,2) NOT NULL, + consumption DECIMAL(12,2) NOT NULL, + amount DECIMAL(10,2), + recorded_by UUID, + record_method VARCHAR(20) DEFAULT 'MANUAL', + remarks TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_energy_consumption_meter ON ops_energy_consumption(meter_id); +CREATE INDEX IF NOT EXISTS idx_energy_consumption_date ON ops_energy_consumption(consumption_date); +CREATE INDEX IF NOT EXISTS idx_energy_consumption_project ON ops_energy_consumption(project_id); + +-- ============================================ +-- 备件分类表 +-- ============================================ +CREATE TABLE IF NOT EXISTS ops_spare_part_category ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + parent_id UUID, + category_code VARCHAR(50) UNIQUE NOT NULL, + category_name VARCHAR(100) NOT NULL, + description VARCHAR(500), + sort_order INTEGER DEFAULT 0, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_spare_part_category_parent ON ops_spare_part_category(parent_id); + +-- ============================================ +-- 备件表 +-- ============================================ +CREATE TABLE IF NOT EXISTS ops_spare_part ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID NOT NULL, + spare_part_code VARCHAR(50) UNIQUE NOT NULL, + spare_part_name VARCHAR(100) NOT NULL, + category_id UUID, + specification VARCHAR(200), + unit VARCHAR(20) NOT NULL, + safe_stock INTEGER DEFAULT 0, + current_stock INTEGER DEFAULT 0, + unit_price DECIMAL(10,2), + supplier VARCHAR(200), + supplier_contact VARCHAR(100), + location VARCHAR(200), + remarks TEXT, + status VARCHAR(20) DEFAULT 'ACTIVE', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_spare_part_project ON ops_spare_part(project_id); +CREATE INDEX IF NOT EXISTS idx_spare_part_category ON ops_spare_part(category_id); +CREATE INDEX IF NOT EXISTS idx_spare_part_stock ON ops_spare_part(current_stock); + +-- ============================================ +-- 备件记录表 +-- ============================================ +CREATE TABLE IF NOT EXISTS ops_spare_part_record ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + record_code VARCHAR(50) UNIQUE NOT NULL, + record_type VARCHAR(20) NOT NULL, + spare_part_id UUID NOT NULL, + quantity INTEGER NOT NULL, + balance INTEGER NOT NULL, + related_order_id UUID, + recorded_by UUID, + record_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + remarks TEXT +); + +CREATE INDEX IF NOT EXISTS idx_spare_part_record_part ON ops_spare_part_record(spare_part_id); +CREATE INDEX IF NOT EXISTS idx_spare_part_record_order ON ops_spare_part_record(related_order_id); +CREATE INDEX IF NOT EXISTS idx_spare_part_record_date ON ops_spare_part_record(record_date); + +-- ============================================ +-- 设备故障历史表 +-- ============================================ +CREATE TABLE IF NOT EXISTS ops_equipment_failure_history ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + equipment_id UUID NOT NULL, + failure_date TIMESTAMP NOT NULL, + failure_type VARCHAR(50), + failure_cause VARCHAR(200), + failure_description TEXT, + repair_start_time TIMESTAMP, + repair_end_time TIMESTAMP, + repair_duration DECIMAL(10,2), + repair_cost DECIMAL(12,2), + spare_parts_used TEXT, + work_order_id UUID, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_equipment_failure_equipment ON ops_equipment_failure_history(equipment_id); +CREATE INDEX IF NOT EXISTS idx_equipment_failure_date ON ops_equipment_failure_history(failure_date); + +-- ============================================ +-- 设备健康度表 +-- ============================================ +CREATE TABLE IF NOT EXISTS ops_equipment_health_score ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + equipment_id UUID NOT NULL, + score_date DATE NOT NULL, + health_score DECIMAL(5,2), + mtbf DECIMAL(10,2), + mttr DECIMAL(10,2), + failure_count INTEGER, + maintenance_completion_rate DECIMAL(5,2), + alert_level VARCHAR(20) DEFAULT 'NORMAL', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_equipment_health_equipment ON ops_equipment_health_score(equipment_id); +CREATE INDEX IF NOT EXISTS idx_equipment_health_date ON ops_equipment_health_score(score_date); + +-- ============================================ +-- 点检模板表 +-- ============================================ +CREATE TABLE IF NOT EXISTS ops_inspection_template ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID NOT NULL, + template_code VARCHAR(50) UNIQUE NOT NULL, + template_name VARCHAR(100) NOT NULL, + equipment_type VARCHAR(50), + inspection_items TEXT, + estimated_duration INTEGER, + status VARCHAR(20) DEFAULT 'ACTIVE', + version INTEGER DEFAULT 1, + created_by UUID, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_inspection_template_project ON ops_inspection_template(project_id); +CREATE INDEX IF NOT EXISTS idx_inspection_template_type ON ops_inspection_template(equipment_type);