## 1. 现状分析 - [x] 1.1 使用 lsp_diagnostics 检查 client_realname.go、manual_trigger_service.go 的语法和类型错误 - [x] 1.2 分析现有 ClientRealnameHandler 和 ManualTriggerService 的依赖关系,确认无循环依赖风险 ## 2. 配置管理和常量定义 - [x] 2.1 在 `pkg/config/` 中新增 `AutoTriggerSystemUserID int` 和 `EnableAutoTrigger bool`(默认 true)配置字段,通过环境变量 `JUNHONG_AUTO_TRIGGER_SYSTEM_USER_ID` 和 `JUNHONG_ENABLE_AUTO_TRIGGER` 注入 - [x] 2.2 更新 `pkg/config/defaults/config.yaml`,添加 `auto_trigger_system_user_id` 和 `enable_auto_trigger` 默认值 - [x] 2.3 运行 lsp_diagnostics 检查配置相关代码无错误 ## 3. 手动触发服务 Bug 修复和优化 - [x] 3.1 在 `internal/service/polling/manual_trigger_service.go` 的 `TriggerSingle`、`TriggerBatch`、`TriggerByCondition` 三处将 `todayCount >= 100` 改为 `todayCount >= 500` - [x] 3.2 在 `internal/service/polling/manual_trigger_service.go` 的 `TriggerSingle` 中将 `s.redis.Expire(ctx, dedupeKey, time.Hour)` 改为 `s.redis.Expire(ctx, dedupeKey, 24*time.Hour)` - [x] 3.3 同步更新 `pkg/constants/redis.go` 中 `RedisPollingManualDedupeKey` 函数的注释,将 `// 过期时间:1小时` 改为 `// 过期时间:24小时` - [x] 3.4 优化 `canManageCard` 和 `canManageCards` 权限检查函数,提取公共逻辑减少重复代码 - [x] 3.5 改进 `TriggerSingle` 的错误日志,增加 `triggeredBy`、`cardID` 等上下文字段 - [x] 3.6 运行 lsp_diagnostics 检查 ManualTriggerService 相关代码无错误 - [x] 3.7 使用 PostgreSQL MCP 和 Redis CLI 手动验证:触发同一张卡后 24 小时内重复触发被拒绝,24 小时后允许重复触发 ## 4. ClientRealnameHandler 集成自动触发功能 - [x] 4.1 在 `ClientRealnameHandler` 结构体中新增 `manualTriggerSvc *polling.ManualTriggerService` 字段 - [x] 4.2 修改 `NewClientRealnameHandler` 构造函数,新增 `manualTriggerSvc *polling.ManualTriggerService` 参数(可为 nil,nil 时跳过自动触发) - [x] 4.3 在 `GetRealnameLink` 成功返回实名链接前,若 `h.manualTriggerSvc != nil` 且配置 `EnableAutoTrigger=true`,则启动 goroutine 异步触发实名检查 - [x] 4.4 goroutine 内部必须使用 `context.WithTimeout(context.Background(), 3*time.Second)` 创建独立 context,禁止复用 `c.UserContext()`(请求 context 在 handler 返回后失效) - [x] 4.5 goroutine 内部构造系统用户 context(注入 UserTypePlatform 和配置的 AutoTriggerSystemUserID),调用 `manualTriggerSvc.TriggerSingle(sysCtx, targetCard.ID, constants.TaskTypePollingRealname, systemUserID)` - [x] 4.6 goroutine 执行失败时记录 WARN 日志(含 customerID、ICCID、error),成功时记录 INFO 日志(含 customerID、ICCID);失败不影响主流程 - [x] 4.7 运行 lsp_diagnostics 检查 ClientRealnameHandler 相关代码无错误 ## 5. 依赖注入配置更新 - [x] 5.1 在 `internal/bootstrap/handlers.go` 中更新 `ClientRealname` handler 的初始化,传入 ManualTriggerService - [x] 5.2 确认 ManualTriggerService 在 bootstrap/services.go 中已初始化(检查是否已存在,若不存在则补充) - [x] 5.3 更新 `cmd/api/docs.go` 和 `cmd/gendocs/main.go` 中 `NewClientRealnameHandler` 的调用,补充新增的 manualTriggerSvc 参数(传 nil 即可) - [x] 5.4 运行 lsp_diagnostics 检查 bootstrap 和 docs.go 相关代码无编译错误 ## 6. 手动验证 - [x] 6.1 使用 curl 调用 `GET /api/c/v1/realname/link` 接口,通过日志确认异步触发 goroutine 被启动 - [x] 6.2 通过 PostgreSQL MCP 查询 `tb_polling_manual_trigger_log`,确认自动触发记录的 `triggered_by` 为配置的系统用户 ID - [x] 6.3 通过 Redis CLI 检查 `polling:manual:realname` 队列,确认 cardID 已写入 - [x] 6.4 使用 PostgreSQL MCP 查询 `tb_polling_manual_trigger_log`,验证今日触发次数计数正确(不超过 500 次限制) - [x] 6.5 使用 Redis CLI 确认 dedup key TTL 为 24 小时(`TTL polling:manual:dedupe:realname`) - [x] 6.6 模拟 manualTriggerSvc 不可用场景(临时将 EnableAutoTrigger 设为 false),确认接口正常返回实名链接,日志无 panic ## 7. 最终验收 - [x] 7.1 运行 lsp_diagnostics 对所有修改过的文件做最终检查,确认无错误和警告 - [x] 7.2 确认环境变量 `JUNHONG_AUTO_TRIGGER_SYSTEM_USER_ID` 和 `JUNHONG_ENABLE_AUTO_TRIGGER` 已在部署文档中记录 - [x] 7.3 确认 `GetRealnameLink` handler 函数长度不超过 100 行(满足项目规范)