fix: align channel copy and gateway connection state
This commit is contained in:
@@ -8,6 +8,19 @@
|
||||
- 已执行:`npm --prefix api test -- channels.service.spec.ts --runInBand`、`npm --prefix api run build`、`npm run build`。待生产部署后用指定号码做一次真实发送验证,并回查 DB/短信记录。
|
||||
- 2026-07-09 追加:按产品边界收窄通道测试短信,`SmsMessageRecord/SmsSubmitRecord/SmsReceiptRecord/SmsMessageSegmentAudit` 支持 `tenantId/batchTaskId` 为空;通道测试只记录短信、提交结果和回执,不进入企业账务、发送任务进度、客户侧 Deliver 推送或业务补发。
|
||||
|
||||
## 2026-07-09 通道复制默认停用与真实连接池状态回写修复
|
||||
|
||||
- 生产验证发现当前 3 个赛邮行业通道中有 2 个由首个 active 通道复制而来;数据库 `CmppConnectionState` 曾显示 3 条通道都为 `connected/currentConnections=1`,但生产机 `ss/netstat` 与上游平台都只能看到 1 条真实 TCP 长连接。
|
||||
- 根因一:`POST /api/admin/channels/:id/copy` 会继承源通道 `status=active`,复制后的通道创建完成后立即参与 Gateway 连接流程,和“复制只是拷贝配置,不应自动上线”的产品预期不符。
|
||||
- 根因二:Gateway `/connections/connect` 之前只做一次性 `DialCMPP` 探测,探测成功后就把 `connected/currentConnections=desiredConnections` 回写给 NestJS;该探测连接随后立即断开,导致页面状态与真实上游连接池不一致。
|
||||
- 已修复:
|
||||
- 通道复制后统一保存为 `disabled`,复制日志补充 `sourceStatus` 和 `copiedStatus`,避免 active 通道副本自动占用上游连接。
|
||||
- Gateway `ConnectChannel` 改为直接建立/复用真实上游连接池,并由连接池回写 `connected/failed/disconnected`、`currentConnections`、最近错误和断开时间;连接丢失时状态随真实连接数变化更新。
|
||||
- 测试口径同步:
|
||||
- `TC-ADMIN-003` 增加“连接状态必须来自真实上游连接池回写”的要求。
|
||||
- `TC-ADMIN-016` 明确复制 active 通道后副本默认 `disabled`,且不会立即触发上游真实连接。
|
||||
- 已执行:`npm --prefix api test -- channels.service.spec.ts --runInBand`、`npm --prefix api run build`、`go test ./internal/control ./internal/upstream`、`go build -o ..\\dist\\cmpp-gateway .\\cmd\\gateway`。
|
||||
|
||||
## 2026-07-09 线上通道 CMPP 版本修复
|
||||
|
||||
- 线上生产验证发现 3 个赛邮行业通道配置均指向 `121.40.172.212:7890`,其中 2 个已触发 Gateway 真实连接并失败,`CmppConnectionState.lastError` 为 `packetWriter.ReadBytes error: ReadBytes reads 14 bytes, not equal to 16 we expected`。
|
||||
@@ -468,6 +481,7 @@ GET /api/admin/system-logs?page=1&pageSize=2
|
||||
|
||||
- 新增用户登录字段和 fail2ban 持久化字段:`email`、`phone`、`failedLoginCount`、`lockedUntil`、`lastLoginAt`、`deletedAt`。
|
||||
- 登录入口拆分为 `/client/login` 和 `/admin/login`,两端均调用真实验证码和登录 API。
|
||||
- 用户登录入口和用户表单统一文案为“用户名/登录账号”,提示可用用户名、邮箱或手机号登录。
|
||||
- 运营端登录仅允许 `platform_admin`;客户端登录仅允许已关联企业的 `enterprise_admin`。
|
||||
- 运营端用户管理接入真实 `/api/admin/users`,支持平台管理员和企业管理员的新增、编辑、启用/禁用、删除、改密;企业管理员必须关联企业。
|
||||
- 客户端用户管理接入真实 `/api/client/users`,所有操作继承当前登录企业 `tenantId`。
|
||||
|
||||
Reference in New Issue
Block a user