5.0 KiB
5.0 KiB
1. 数据库迁移
- 1.1 创建迁移文件
000120_add_polling_card_status.up.sql:tb_polling_config新增card_status_check_interval INT NULL,tb_iot_card新增last_card_status_check_at TIMESTAMPTZ NULL - 1.2 创建对应回滚文件
000120_add_polling_card_status.down.sql:DROP COLUMN 两列 - 1.3 执行
make migrate-up并验证:make migrate-version确认 dirty=false,使用 PostgreSQL MCP 验证两列已创建
2. 常量与配置
- 2.1
pkg/constants/constants.go:轮询任务类型常量块新增TaskTypePollingCardStatus = "polling:card_status" - 2.2
pkg/config/config.go:新增PollingConfig struct { VerboseLog bool },在Config中加入Polling PollingConfig字段 - 2.3
pkg/config/defaults/config.yaml:在 polling 配置区新增verbose_log: false - 2.4 验证:
LspDiagnostics检查pkg/constants/constants.go和pkg/config/config.go无报错
3. 数据模型更新
- 3.1
internal/model/polling.go:PollingConfig结构体新增CardStatusCheckInterval *int(GORM column:card_status_check_interval) - 3.2
internal/model/iot_card.go:IotCard结构体新增LastCardStatusCheckAt *time.Time(GORM column:last_card_status_check_at) - 3.3 验证:
LspDiagnostics检查两个 model 文件无报错
4. PollingBase 新增 verboseLog 支持
- 4.1
internal/task/polling_base.go:PollingBase结构体新增verboseLog bool字段;NewPollingBase函数签名新增verboseLog bool参数并赋值 - 4.2
cmd/worker/main.go:task.NewPollingBase(...)调用新增cfg.Polling.VerboseLog参数 - 4.3 验证:
LspDiagnostics检查polling_base.go和main.go无报错
5. 现有 Handler 添加 verbose 日志
- 5.1
internal/task/polling_realname_handler.go:在QueryRealnameStatus成功返回后,判断h.base.verboseLog为 true 时输出 Info 日志(card_id、iccid、real_status、new_status、changed) - 5.2
internal/task/polling_carddata_handler.go:在QueryFlow成功返回后,判断h.base.verboseLog为 true 时输出 Info 日志(card_id、iccid、gateway_flow_mb、increment_mb、is_cross_month) - 5.3
internal/task/polling_package_handler.go:在freshCard加载成功后、调用EvaluateAndAct之前,判断h.base.verboseLog为 true 时输出 Info 日志(card_id、iccid、network_status、stop_reason) - 5.4
internal/task/polling_protect_handler.go:在 switch 块执行完毕、UpdateFields(last_protect_check_at)之前,判断h.base.verboseLog为 true 时输出 Info 日志(card_id、iccid、stop_protect、start_protect、network_status) - 5.5 验证:
LspDiagnostics检查上述 4 个 handler 文件无报错
6. 卡状态轮询 Handler 实现
- 6.1 新建
internal/task/polling_cardstatus_handler.go:实现PollingCardStatusHandler(字段:base、gateway、iotCardStore、stopResumeSvc),完整实现Handle方法 - 6.2
Handle方法逻辑:获取并发信号量 → 获取卡信息(带缓存)→ 调用gateway.QueryCardStatus→ 映射状态("停机"→0,其他→1)→ verbose log 判断 → 比较状态是否变化 → 写 DB(last_card_status_check_at+ 可选network_status)→ 状态变化时更新缓存并调用EvaluateAndAct→ 更新统计 → 重入队 - 6.3 验证:
LspDiagnostics检查新文件无报错
7. 轮询系统基础设施集成
- 7.1
internal/task/polling_utils.go:getIntervalByTaskType新增case constants.TaskTypePollingCardStatus,返回cfg.CardStatusCheckInterval - 7.2
internal/polling/queue_manager.go:allTaskTypesslice 追加constants.TaskTypePollingCardStatus - 7.3
internal/polling/lifecycle_service.go:getEnabledTaskTypes新增 card_status 条件(CardStatusCheckInterval != nil && *CardStatusCheckInterval > 0);calcInitialDelay新增对应 case - 7.4
internal/polling/initializer.go:在initBatch()的 if-block 链中新增一段,当cfg.CardStatusCheckInterval != nil && *cfg.CardStatusCheckInterval > 0时,以card.LastCardStatusCheckAt(新增字段)为基准调用calculateNextCheckTime,向TaskTypePollingCardStatus分片队列写入 ZAdd 条目;位置紧跟 ProtectCheckInterval 块之后,格式与其他 4 种类型一致 - 7.5 验证:
LspDiagnostics检查上述 4 个文件无报错
8. Worker Handler 注册
- 8.1
pkg/queue/handler.go:在RegisterHandlers中创建cardStatusHandler := task.NewPollingCardStatusHandler(...)并注册h.mux.HandleFunc(constants.TaskTypePollingCardStatus, cardStatusHandler.Handle) - 8.2 验证:
LspDiagnostics检查handler.go无报错;go build ./cmd/worker/...成功编译
9. 整体验证
- 9.1 执行
go build ./...确认整个项目编译通过 - 9.2 使用 PostgreSQL MCP 验证迁移列已正确创建(类型、NULL 约束)
- 9.3 检查
make migrate-down && make migrate-up回滚和重新迁移均成功