feat(wm-dma): #59 DMA分区计量与漏损分析
- 新增 wm-dma 模块 - Entity: DmaZone, DmaMeter, DmaFlowRecord, DmaLeakageAnalysis, WaterBalance - Mapper + Service + Controller(18个端点) - DMA分区管理: 分区层级定义(CRUD) + 区域划分 + 关联设备 + 树形结构 - 分区计量: 各分区进出水量汇总 + 最小夜间流量(MNF)分析 + 流量趋势 - 漏损分析: 产销差计算 + 漏损率评估 + 趋势分析 + 报警 - 水平衡表: 供水量/售水量/漏损量平衡分析 + IWA组成 - DDL: dma_ddl.sql - 单元测试: 5个Service测试类(25+测试用例)
This commit is contained in:
+136
@@ -0,0 +1,136 @@
|
||||
-- =====================================================
|
||||
-- DMA分区计量与漏损分析 DDL
|
||||
-- 数据库: PostgreSQL
|
||||
-- =====================================================
|
||||
|
||||
-- DMA分区表
|
||||
CREATE TABLE IF NOT EXISTS dma_zone (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
zone_name VARCHAR(100) NOT NULL,
|
||||
zone_code VARCHAR(50) NOT NULL UNIQUE,
|
||||
parent_id BIGINT REFERENCES dma_zone(id),
|
||||
zone_level INTEGER NOT NULL DEFAULT 1,
|
||||
area VARCHAR(100),
|
||||
area_size NUMERIC(10, 2),
|
||||
population INTEGER,
|
||||
pipe_length NUMERIC(10, 2),
|
||||
status VARCHAR(20) DEFAULT 'active',
|
||||
remark VARCHAR(500),
|
||||
deleted INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
COMMENT ON TABLE dma_zone IS 'DMA分区表';
|
||||
COMMENT ON COLUMN dma_zone.zone_level IS '分区层级: 1=一级/2=二级/3=三级';
|
||||
COMMENT ON COLUMN dma_zone.status IS '状态: active/inactive';
|
||||
|
||||
-- DMA计量表
|
||||
CREATE TABLE IF NOT EXISTS dma_meter (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
zone_id BIGINT REFERENCES dma_zone(id),
|
||||
meter_code VARCHAR(50) NOT NULL UNIQUE,
|
||||
meter_name VARCHAR(100),
|
||||
meter_type VARCHAR(20) NOT NULL,
|
||||
location VARCHAR(200),
|
||||
longitude NUMERIC(12, 8),
|
||||
latitude NUMERIC(12, 8),
|
||||
caliber INTEGER,
|
||||
brand VARCHAR(100),
|
||||
status VARCHAR(20) DEFAULT 'online',
|
||||
remark VARCHAR(500),
|
||||
deleted INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
COMMENT ON TABLE dma_meter IS 'DMA计量表';
|
||||
COMMENT ON COLUMN dma_meter.meter_type IS '表计类型: inlet=进水表/outlet=出水表/boundary=边界表';
|
||||
COMMENT ON COLUMN dma_meter.status IS '状态: online/offline/fault';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_meter_zone ON dma_meter(zone_id);
|
||||
|
||||
-- DMA流量记录表
|
||||
CREATE TABLE IF NOT EXISTS dma_flow_record (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
zone_id BIGINT NOT NULL REFERENCES dma_zone(id),
|
||||
meter_id BIGINT NOT NULL REFERENCES dma_meter(id),
|
||||
instant_flow NUMERIC(12, 4),
|
||||
total_flow NUMERIC(14, 4),
|
||||
pressure NUMERIC(8, 4),
|
||||
collect_time TIMESTAMP NOT NULL,
|
||||
data_quality VARCHAR(20) DEFAULT 'good',
|
||||
deleted INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
COMMENT ON TABLE dma_flow_record IS 'DMA流量记录表';
|
||||
COMMENT ON COLUMN dma_flow_record.instant_flow IS '瞬时流量(m³/h)';
|
||||
COMMENT ON COLUMN dma_flow_record.total_flow IS '累计流量(m³)';
|
||||
COMMENT ON COLUMN dma_flow_record.pressure IS '压力(MPa)';
|
||||
COMMENT ON COLUMN dma_flow_record.data_quality IS '数据质量: good/bad/missing';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_flow_zone_time ON dma_flow_record(zone_id, collect_time);
|
||||
CREATE INDEX IF NOT EXISTS idx_flow_meter_time ON dma_flow_record(meter_id, collect_time);
|
||||
|
||||
-- DMA漏损分析表
|
||||
CREATE TABLE IF NOT EXISTS dma_leakage_analysis (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
zone_id BIGINT NOT NULL REFERENCES dma_zone(id),
|
||||
analysis_date DATE NOT NULL,
|
||||
supply_volume NUMERIC(14, 4),
|
||||
sale_volume NUMERIC(14, 4),
|
||||
leakage_volume NUMERIC(14, 4),
|
||||
nrw_rate NUMERIC(8, 2),
|
||||
leakage_rate NUMERIC(8, 2),
|
||||
mnf NUMERIC(10, 4),
|
||||
mnf_time VARCHAR(20),
|
||||
background_leakage NUMERIC(10, 4),
|
||||
burst_leakage NUMERIC(10, 4),
|
||||
alarm_level VARCHAR(20) DEFAULT 'normal',
|
||||
remark VARCHAR(500),
|
||||
deleted INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
COMMENT ON TABLE dma_leakage_analysis IS 'DMA漏损分析表';
|
||||
COMMENT ON COLUMN dma_leakage_analysis.nrw_rate IS '产销差率(%)';
|
||||
COMMENT ON COLUMN dma_leakage_analysis.leakage_rate IS '漏损率(%)';
|
||||
COMMENT ON COLUMN dma_leakage_analysis.mnf IS '最小夜间流量(m³/h)';
|
||||
COMMENT ON COLUMN dma_leakage_analysis.alarm_level IS '报警级别: normal/warning/critical';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_leakage_zone_date ON dma_leakage_analysis(zone_id, analysis_date);
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uk_leakage_zone_date ON dma_leakage_analysis(zone_id, analysis_date) WHERE deleted = 0;
|
||||
|
||||
-- 水平衡表
|
||||
CREATE TABLE IF NOT EXISTS dma_water_balance (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
zone_id BIGINT NOT NULL REFERENCES dma_zone(id),
|
||||
period VARCHAR(20) NOT NULL,
|
||||
stat_date DATE NOT NULL,
|
||||
total_supply NUMERIC(14, 4),
|
||||
total_sale NUMERIC(14, 4),
|
||||
billing_sale NUMERIC(14, 4),
|
||||
free_supply NUMERIC(14, 4),
|
||||
apparent_loss NUMERIC(14, 4),
|
||||
real_loss NUMERIC(14, 4),
|
||||
background_loss NUMERIC(14, 4),
|
||||
burst_loss NUMERIC(14, 4),
|
||||
total_loss NUMERIC(14, 4),
|
||||
nrw_rate NUMERIC(8, 2),
|
||||
leakage_rate NUMERIC(8, 2),
|
||||
remark VARCHAR(500),
|
||||
deleted INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
COMMENT ON TABLE dma_water_balance IS '水平衡表';
|
||||
COMMENT ON COLUMN dma_water_balance.period IS '统计周期: daily/monthly/yearly';
|
||||
COMMENT ON COLUMN dma_water_balance.apparent_loss IS '表观漏损(m³) - 计量误差+偷水';
|
||||
COMMENT ON COLUMN dma_water_balance.real_loss IS '实际漏损(m³) - 物理漏损';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_balance_zone_date ON dma_water_balance(zone_id, stat_date);
|
||||
CREATE INDEX IF NOT EXISTS idx_balance_period ON dma_water_balance(period);
|
||||
Reference in New Issue
Block a user