# 项目约定和模式

## 模块路径
- 项目模块路径：`github.com/break/junhong_cmp_fiber`

## 关键包路径（区分 pkg vs internal）
- `pkg/middleware` - 包含 `SetUserContext`, `UserContextInfo`, `GetUserTypeFromContext`
- `internal/middleware` - 包含 `GetCustomerID(c *fiber.Ctx)` (C端个人客户认证)
- `internal/service/polling` - ManualTriggerService 所在包
- `pkg/constants` - UserTypePlatform, TaskTypePollingRealname 等常量

## 重要发现
- `SetUserContext` 在 `pkg/middleware` 包，不在 `internal/middleware`
- `UserContextInfo` 字段：UserID(uint), UserType(int), ShopID(uint), EnterpriseID(uint), CustomerID(uint)
- `GetCustomerID(c *fiber.Ctx)` 在 `internal/middleware/personal_auth.go`，返回 (uint, bool)
- manual_trigger_service.go 当前 469 行，进行重构

## 当前待修复 Bug
- `todayCount >= 100` 在 3 处（行58, 129, 238）需改为 `>= 500`
- `time.Hour` TTL 在 2 处（行72, 192）需改为 `24*time.Hour`
- `RedisPollingManualDedupeKey` 注释写的"1小时"需改为"24小时"

## client_realname.go 重构要点
- 当前 `GetRealnameLink` 函数 127 行，加新代码会超 100 行限制
- 需提取 `resolveTargetCard(c *fiber.Ctx, asset, iccid)` - 资产类型 switch
- 需提取 `buildRealnameResponse(ctx, card, carrier)` - 运营商 URL 调度
- 注意：`findCardInDeviceBindings` 和 `findFirstBoundCard` 已存在，可从 resolveTargetCard 调用
- goroutine 传标量值（uint, string），不能捕获 `c *fiber.Ctx`

## 依赖注入
- `handlers.go` 第 66 行：`ClientRealname: app.NewClientRealnameHandler(...)` 需加第8个参数
- `docs.go` 和 `gendocs/main.go` 各有一处 `NewClientRealnameHandler(nil*7)` 需改为 8个nil
- `svc.PollingManualTrigger` 已在 services.go:210 初始化，可直接使用

## Commit 3 后临时编译失败
- Task 4 修改构造函数后、Task 5 接线前，全量编译报错是预期行为
- 只做文件级 LSP 检查，不跑全量 build
