refactor: 流量系统重构 — 增量累加算法 + 日粒度缓冲 + 旧详单清理
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m16s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m16s
核心改造: - 增量算法:流量计算从覆盖式改为增量累加(gateway - lastReading),支持上游运营商重置检测 - 日流量缓冲:insertDataUsageRecord 改为 Redis INCRBYFLOAT,每日凌晨落盘到 tb_card_daily_usage - 运营商:新增 data_reset_day 字段(联通=27,其余=1) - IoT卡:新增 last_gateway_reading_mb 字段存储上次网关读数 - 查询层:新建 TrafficQueryService 合并 Redis(今日)+ DB(历史)数据源 - 清理:删除 DataUsageRecord model/store,移除 polling_handler 旧引用 迁移:000094-000097(carrier字段、iot_card字段、数据初始化、日流量表)
This commit is contained in:
1
migrations/000094_add_data_reset_day_to_carrier.down.sql
Normal file
1
migrations/000094_add_data_reset_day_to_carrier.down.sql
Normal file
@@ -0,0 +1 @@
|
||||
ALTER TABLE tb_carrier DROP COLUMN IF EXISTS data_reset_day;
|
||||
8
migrations/000094_add_data_reset_day_to_carrier.up.sql
Normal file
8
migrations/000094_add_data_reset_day_to_carrier.up.sql
Normal file
@@ -0,0 +1,8 @@
|
||||
-- 运营商新增上游流量重置日字段
|
||||
-- 用于检测上游网关流量值下降是否为正常自然月重置(与套餐级 data_reset_cycle 完全独立)
|
||||
ALTER TABLE tb_carrier ADD COLUMN data_reset_day INT NOT NULL DEFAULT 1;
|
||||
COMMENT ON COLUMN tb_carrier.data_reset_day IS '上游流量重置日(1-28),运营商每月清零网关计数器的日期';
|
||||
|
||||
-- 初始化已有运营商:联通=27,其余=1
|
||||
UPDATE tb_carrier SET data_reset_day = 27 WHERE carrier_type = 'CUCC';
|
||||
UPDATE tb_carrier SET data_reset_day = 1 WHERE carrier_type != 'CUCC';
|
||||
@@ -0,0 +1 @@
|
||||
ALTER TABLE tb_iot_card DROP COLUMN IF EXISTS last_gateway_reading_mb;
|
||||
@@ -0,0 +1,4 @@
|
||||
-- IoT 卡新增上次网关读数字段
|
||||
-- 用于增量算法:increment = 当前读数 - 上次读数
|
||||
ALTER TABLE tb_iot_card ADD COLUMN last_gateway_reading_mb FLOAT NOT NULL DEFAULT 0;
|
||||
COMMENT ON COLUMN tb_iot_card.last_gateway_reading_mb IS '上次轮询时网关返回的流量读数(MB),用于计算增量';
|
||||
2
migrations/000096_init_last_gateway_reading_mb.down.sql
Normal file
2
migrations/000096_init_last_gateway_reading_mb.down.sql
Normal file
@@ -0,0 +1,2 @@
|
||||
-- 回滚:重置所有卡的 last_gateway_reading_mb 为 0
|
||||
UPDATE tb_iot_card SET last_gateway_reading_mb = 0 WHERE last_gateway_reading_mb > 0;
|
||||
5
migrations/000096_init_last_gateway_reading_mb.up.sql
Normal file
5
migrations/000096_init_last_gateway_reading_mb.up.sql
Normal file
@@ -0,0 +1,5 @@
|
||||
-- 数据初始化:将所有卡的 last_gateway_reading_mb 设为当前 current_month_usage_mb
|
||||
-- 避免上线后第一次轮询把整个已用量当作增量
|
||||
UPDATE tb_iot_card
|
||||
SET last_gateway_reading_mb = current_month_usage_mb
|
||||
WHERE last_gateway_reading_mb = 0 AND current_month_usage_mb > 0;
|
||||
1
migrations/000097_create_card_daily_usage.down.sql
Normal file
1
migrations/000097_create_card_daily_usage.down.sql
Normal file
@@ -0,0 +1 @@
|
||||
DROP TABLE IF EXISTS tb_card_daily_usage;
|
||||
10
migrations/000097_create_card_daily_usage.up.sql
Normal file
10
migrations/000097_create_card_daily_usage.up.sql
Normal file
@@ -0,0 +1,10 @@
|
||||
CREATE TABLE IF NOT EXISTS tb_card_daily_usage (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
iot_card_id BIGINT NOT NULL,
|
||||
date DATE NOT NULL,
|
||||
usage_mb NUMERIC(12,2) NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
CONSTRAINT uk_card_daily UNIQUE (iot_card_id, date)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_card_daily_date ON tb_card_daily_usage (date);
|
||||
Reference in New Issue
Block a user