Files
junhong_cmp_fiber/internal/model/card_traffic_collection.go
邹进 94cbf2adab feat: 采集记录成功失败分表并保存网关原始数据,到期归档 csv.gz,新增记录分页查询接口
- 网关客户端新增原始数据收集器,记录最后一次尝试的明文请求、HTTP 状态、响应体与 code/msg/trace_id
- tb_card_traffic_collection 只写成功读数,新增 carrier_id 与原始数据列;新增 tb_card_traffic_collection_failure,失败不判断有无套餐并带错误详情
- 采集记录在线保留当月加最近 2 个整月,到期分区摘出、导出 csv.gz、校验行数与 SHA-256 后删除,本地保留 3 个月
- 新增采集成功/失败、卡日流量、套餐日流量详单、冲正流水、退款后处理尝试列表接口:可查单个也可查全部,分页与条件筛选
- 停复机记录支持资产标识、场景、原因、指令号筛选;单卡历史支持动作、结果、来源筛选
- 单卡采集记录支持筛选与合并失败记录;套餐日流量详单支持分页;退款列表支持后处理状态筛选
- 测试环境 api、worker 日志分目录,保留 40 个压缩备份;worker 挂载 archive 目录
- 迁移 000272、000273 需维护者在测试库执行后再部署

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 18:47:00 +09:00

94 lines
6.1 KiB
Go

package model
import (
"time"
"gorm.io/datatypes"
)
// CardTrafficCollection 卡流量采集记录:采集时刻有套餐的卡每次采集一条,按月分区保留 90 天。
type CardTrafficCollection struct {
ID uint `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
IotCardID uint `gorm:"column:iot_card_id;not null" json:"iot_card_id"`
ObservedAt time.Time `gorm:"column:observed_at;primaryKey;not null" json:"observed_at"`
ObservationID string `gorm:"column:observation_id;type:varchar(128);not null;default:''" json:"observation_id"`
Source string `gorm:"column:source;type:varchar(32);not null;default:''" json:"source"`
Scene string `gorm:"column:scene;type:varchar(64);not null;default:''" json:"scene"`
Result string `gorm:"column:result;type:varchar(32);not null" json:"result"`
VendorUsedMB *float64 `gorm:"column:vendor_used_mb;type:numeric(14,3)" json:"vendor_used_mb"`
QueuePoints datatypes.JSON `gorm:"column:queue_points;type:jsonb" json:"queue_points"`
Decision string `gorm:"column:decision;type:varchar(32);not null;default:''" json:"decision"`
MonthUsedMB *float64 `gorm:"column:month_used_mb;type:numeric(14,3)" json:"month_used_mb"`
StaleGuarded *bool `gorm:"column:stale_guarded" json:"stale_guarded"`
DeltaMB *float64 `gorm:"column:delta_mb;type:numeric(14,3)" json:"delta_mb"`
EventID string `gorm:"column:event_id;type:varchar(128);not null;default:''" json:"event_id"`
CarrierID uint `gorm:"column:carrier_id;not null;default:0" json:"carrier_id"`
CollectionRaw
CreatedAt time.Time `gorm:"column:created_at;not null;default:now()" json:"created_at"`
}
// TableName 指定表名。
func (CardTrafficCollection) TableName() string {
return "tb_card_traffic_collection"
}
// CollectionRaw 是采集记录保存的网关原始数据(成功表与失败表共用)。
type CollectionRaw struct {
RawRequest datatypes.JSON `gorm:"column:raw_request;type:jsonb" json:"raw_request"`
HTTPStatus *int `gorm:"column:http_status" json:"http_status"`
GatewayCode *int `gorm:"column:gateway_code" json:"gateway_code"`
GatewayMsg string `gorm:"column:gateway_msg;type:varchar(500);not null;default:''" json:"gateway_msg"`
GatewayTraceID string `gorm:"column:gateway_trace_id;type:varchar(128);not null;default:''" json:"gateway_trace_id"`
RawResponse datatypes.JSON `gorm:"column:raw_response;type:jsonb" json:"raw_response"`
RawResponseText string `gorm:"column:raw_response_text;type:text;not null;default:''" json:"raw_response_text"`
RawTruncated bool `gorm:"column:raw_truncated;not null;default:false" json:"raw_truncated"`
GatewayAttempts int `gorm:"column:gateway_attempts;not null;default:0" json:"gateway_attempts"`
}
// CardTrafficCollectionFailure 卡流量采集失败记录:所有被采集的卡每次失败一条,按月分区,在线保留 2 个月。
type CardTrafficCollectionFailure struct {
ID uint `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
IotCardID uint `gorm:"column:iot_card_id;not null" json:"iot_card_id"`
ICCID string `gorm:"column:iccid;type:varchar(30);not null;default:''" json:"iccid"`
CarrierID uint `gorm:"column:carrier_id;not null;default:0" json:"carrier_id"`
ObservedAt time.Time `gorm:"column:observed_at;primaryKey;not null" json:"observed_at"`
ObservationID string `gorm:"column:observation_id;type:varchar(128);not null;default:''" json:"observation_id"`
Source string `gorm:"column:source;type:varchar(32);not null;default:''" json:"source"`
Scene string `gorm:"column:scene;type:varchar(64);not null;default:''" json:"scene"`
Result string `gorm:"column:result;type:varchar(32);not null" json:"result"`
ErrorCategory string `gorm:"column:error_category;type:varchar(30);not null;default:''" json:"error_category"`
ProviderCode string `gorm:"column:provider_code;type:varchar(30);not null;default:''" json:"provider_code"`
ProviderMessage string `gorm:"column:provider_message;type:varchar(500);not null;default:''" json:"provider_message"`
DurationMS int `gorm:"column:duration_ms;not null;default:0" json:"duration_ms"`
CollectionRaw
CreatedAt time.Time `gorm:"column:created_at;not null;default:now()" json:"created_at"`
}
// TableName 指定表名。
func (CardTrafficCollectionFailure) TableName() string {
return "tb_card_traffic_collection_failure"
}
// PackageUsageAdjustment 套餐流量人工冲正流水:只新增,不修改、不删除。
type PackageUsageAdjustment struct {
ID uint `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
PackageUsageID uint `gorm:"column:package_usage_id;not null" json:"package_usage_id"`
IotCardID uint `gorm:"column:iot_card_id;not null;default:0" json:"iot_card_id"`
DeviceID uint `gorm:"column:device_id;not null;default:0" json:"device_id"`
DeltaMB int64 `gorm:"column:delta_mb;not null" json:"delta_mb"`
BeforeUsageMB int64 `gorm:"column:before_usage_mb;not null" json:"before_usage_mb"`
AfterUsageMB int64 `gorm:"column:after_usage_mb;not null" json:"after_usage_mb"`
BeforeStatus int `gorm:"column:before_status;not null" json:"before_status"`
AfterStatus int `gorm:"column:after_status;not null" json:"after_status"`
Reason string `gorm:"column:reason;type:varchar(500);not null" json:"reason"`
RefObservationID string `gorm:"column:ref_observation_id;type:varchar(128);not null;default:''" json:"ref_observation_id"`
RefEventID string `gorm:"column:ref_event_id;type:varchar(128);not null;default:''" json:"ref_event_id"`
OperatorID uint `gorm:"column:operator_id;not null" json:"operator_id"`
CreatedAt time.Time `gorm:"column:created_at;not null;default:now()" json:"created_at"`
}
// TableName 指定表名。
func (PackageUsageAdjustment) TableName() string {
return "tb_package_usage_adjustment"
}