- Entity: WaterMeter, MeterInstallRecord, MeterReplaceRecord, MeterLifecycleLog - Enum: MeterStatus (IN_STOCK/INSTALLED/DISMANTLED/SCRAPPED/REPAIRING) - Mapper: WaterMeterMapper, MeterInstallRecordMapper, MeterReplaceRecordMapper, MeterLifecycleLogMapper - Service: MeterLifecycleService (入库/安装/查询), MeterReplaceService (换表/报废/审批), MeterStatsService (统计) - Controller: MeterController (/api/revenue/meter/*), MeterReplaceController (/api/revenue/meter-replace/*), MeterStatsController (/api/revenue/meter-stats/*) - DDL: V_meter_lifecycle.sql (4张表 + 索引) - Test: MeterLifecycleTest (12个测试用例)
134 lines
6.6 KiB
SQL
134 lines
6.6 KiB
SQL
-- ============================================================
|
|
-- 水表全生命周期管理 DDL
|
|
-- 包含: rev_water_meter, rev_meter_install_record,
|
|
-- rev_meter_replace_record, rev_meter_lifecycle_log
|
|
-- ============================================================
|
|
|
|
-- 1. 水表主表
|
|
CREATE TABLE IF NOT EXISTS rev_water_meter (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
meter_no VARCHAR(64) NOT NULL UNIQUE,
|
|
model VARCHAR(64),
|
|
diameter INTEGER,
|
|
manufacturer VARCHAR(128),
|
|
production_date DATE,
|
|
install_date DATE,
|
|
install_address VARCHAR(512),
|
|
customer_no VARCHAR(64),
|
|
status VARCHAR(32) NOT NULL DEFAULT 'IN_STOCK',
|
|
in_stock_time TIMESTAMP,
|
|
out_stock_time TIMESTAMP,
|
|
initial_reading NUMERIC(14,4) DEFAULT 0,
|
|
current_reading NUMERIC(14,4) DEFAULT 0,
|
|
dismantle_date DATE,
|
|
scrapped_date DATE,
|
|
remark VARCHAR(512),
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
COMMENT ON TABLE rev_water_meter IS '水表主表';
|
|
COMMENT ON COLUMN rev_water_meter.meter_no IS '水表编号';
|
|
COMMENT ON COLUMN rev_water_meter.model IS '水表型号';
|
|
COMMENT ON COLUMN rev_water_meter.diameter IS '口径(mm)';
|
|
COMMENT ON COLUMN rev_water_meter.manufacturer IS '制造商';
|
|
COMMENT ON COLUMN rev_water_meter.production_date IS '生产日期';
|
|
COMMENT ON COLUMN rev_water_meter.install_date IS '安装日期';
|
|
COMMENT ON COLUMN rev_water_meter.install_address IS '安装地址';
|
|
COMMENT ON COLUMN rev_water_meter.customer_no IS '客户编号';
|
|
COMMENT ON COLUMN rev_water_meter.status IS '状态: IN_STOCK/INSTALLED/DISMANTLED/SCRAPPED/REPAIRING';
|
|
COMMENT ON COLUMN rev_water_meter.in_stock_time IS '入库时间';
|
|
COMMENT ON COLUMN rev_water_meter.out_stock_time IS '出库时间';
|
|
COMMENT ON COLUMN rev_water_meter.initial_reading IS '初始读数';
|
|
COMMENT ON COLUMN rev_water_meter.current_reading IS '当前读数';
|
|
COMMENT ON COLUMN rev_water_meter.dismantle_date IS '拆除日期';
|
|
COMMENT ON COLUMN rev_water_meter.scrapped_date IS '报废日期';
|
|
|
|
-- 2. 水表安装记录
|
|
CREATE TABLE IF NOT EXISTS rev_meter_install_record (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
meter_no VARCHAR(64) NOT NULL,
|
|
customer_no VARCHAR(64),
|
|
installer VARCHAR(128),
|
|
install_date DATE,
|
|
install_address VARCHAR(512),
|
|
old_meter_no VARCHAR(64),
|
|
initial_reading NUMERIC(14,4) DEFAULT 0,
|
|
remark VARCHAR(512),
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
COMMENT ON TABLE rev_meter_install_record IS '水表安装记录';
|
|
|
|
-- 3. 水表换表记录
|
|
CREATE TABLE IF NOT EXISTS rev_meter_replace_record (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
old_meter_no VARCHAR(64) NOT NULL,
|
|
new_meter_no VARCHAR(64) NOT NULL,
|
|
customer_no VARCHAR(64),
|
|
replace_type VARCHAR(32) NOT NULL,
|
|
reason VARCHAR(512),
|
|
replacer VARCHAR(128),
|
|
replace_date DATE,
|
|
old_reading NUMERIC(14,4),
|
|
new_reading NUMERIC(14,4),
|
|
approval_status VARCHAR(32) DEFAULT 'APPROVED',
|
|
approver VARCHAR(128),
|
|
approval_time TIMESTAMP,
|
|
remark VARCHAR(512),
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
COMMENT ON TABLE rev_meter_replace_record IS '水表换表记录';
|
|
COMMENT ON COLUMN rev_meter_replace_record.replace_type IS '换表类型: FAULT-故障, EXPIRED-到期';
|
|
COMMENT ON COLUMN rev_meter_replace_record.approval_status IS '审批状态: PENDING/APPROVED/REJECTED';
|
|
|
|
-- 4. 水表生命周期日志
|
|
CREATE TABLE IF NOT EXISTS rev_meter_lifecycle_log (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
meter_no VARCHAR(64) NOT NULL,
|
|
action_type VARCHAR(32) NOT NULL,
|
|
action_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
operator VARCHAR(128),
|
|
detail VARCHAR(1024),
|
|
old_meter_no VARCHAR(64),
|
|
new_meter_no VARCHAR(64),
|
|
customer_no VARCHAR(64),
|
|
remark VARCHAR(512),
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
COMMENT ON TABLE rev_meter_lifecycle_log IS '水表生命周期日志';
|
|
COMMENT ON COLUMN rev_meter_lifecycle_log.action_type IS '操作类型: STOCK_IN/INSTALL/DISMANTLE/REPLACE/SCRAP/REPAIR';
|
|
|
|
-- ============================================================
|
|
-- 索引
|
|
-- ============================================================
|
|
|
|
-- rev_water_meter 索引
|
|
CREATE INDEX IF NOT EXISTS idx_water_meter_status ON rev_water_meter (status);
|
|
CREATE INDEX IF NOT EXISTS idx_water_meter_customer ON rev_water_meter (customer_no);
|
|
CREATE INDEX IF NOT EXISTS idx_water_meter_diameter ON rev_water_meter (diameter);
|
|
CREATE INDEX IF NOT EXISTS idx_water_meter_manufacturer ON rev_water_meter (manufacturer);
|
|
CREATE INDEX IF NOT EXISTS idx_water_meter_created ON rev_water_meter (created_at);
|
|
|
|
-- rev_meter_install_record 索引
|
|
CREATE INDEX IF NOT EXISTS idx_install_record_meter ON rev_meter_install_record (meter_no);
|
|
CREATE INDEX IF NOT EXISTS idx_install_record_customer ON rev_meter_install_record (customer_no);
|
|
CREATE INDEX IF NOT EXISTS idx_install_record_date ON rev_meter_install_record (install_date);
|
|
|
|
-- rev_meter_replace_record 索引
|
|
CREATE INDEX IF NOT EXISTS idx_replace_record_old ON rev_meter_replace_record (old_meter_no);
|
|
CREATE INDEX IF NOT EXISTS idx_replace_record_new ON rev_meter_replace_record (new_meter_no);
|
|
CREATE INDEX IF NOT EXISTS idx_replace_record_customer ON rev_meter_replace_record (customer_no);
|
|
CREATE INDEX IF NOT EXISTS idx_replace_record_approval ON rev_meter_replace_record (approval_status);
|
|
CREATE INDEX IF NOT EXISTS idx_replace_record_date ON rev_meter_replace_record (replace_date);
|
|
|
|
-- rev_meter_lifecycle_log 索引
|
|
CREATE INDEX IF NOT EXISTS idx_lifecycle_log_meter ON rev_meter_lifecycle_log (meter_no);
|
|
CREATE INDEX IF NOT EXISTS idx_lifecycle_log_action ON rev_meter_lifecycle_log (action_type);
|
|
CREATE INDEX IF NOT EXISTS idx_lifecycle_log_time ON rev_meter_lifecycle_log (action_time);
|
|
CREATE INDEX IF NOT EXISTS idx_lifecycle_log_customer ON rev_meter_lifecycle_log (customer_no);
|