Files
bot_dev2 ba535c47e2 feat(wm-revenue): #53 水表全生命周期管理
- 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个测试用例)
2026-06-15 08:37:38 +08:00

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);