feat: improve operations diagnostics and channel management

This commit is contained in:
hectorzhao
2026-08-09 14:27:19 +08:00
parent 44352aeb2f
commit 4724b9db6a
65 changed files with 1211 additions and 293 deletions
+80
View File
@@ -3223,3 +3223,83 @@ git diff --check
- 部署后API、Gateway、Nginx、PostgreSQL、Redis、MinIO均active,关键端口均监听;API/Gateway/MinIO内部健康、Redis PONG、公网页面、运营登录、客户端登录、API health和客户Swagger均通过,客户OpenAPI未认证POST返回401,API专用域名的根路径、管理页面和管理API仍返回404,公网CMPP 17890纯TCP连通。
- 5条active供应商通道均在本次重启后产生新状态并恢复`connected 1/1`Redis Stream仍为消费者1、`pending=0``lag=0`,13个通道TPS配置键存在,最近120秒客户下游连接为0。部署后API/Gateway error级journal为0,程序错误关键字无新增;Nginx仅记录正常优雅重启notice。
- npm审计仍报告根项目2项high及API 3项moderate、2项high;专用安全门禁确认PostCSS补丁、React Router RSC未使用和brace expansion边界有效,未执行可能破坏兼容性的自动升级。本次没有发送、补发或重投真实短信,没有修改真实通道账号、密码、启停状态、企业余额或客户连接。
## 2026-08-09 运营端休眠唤醒后连续401修复(本地未提交)
- 生产Nginx只读日志确认`pending-audits`连续401的响应体长度为86字节,对应`SESSION_LOCKED`2026-08-09 11:10:45运营端登录成功后,前端在11:10:47立即请求`/auth/session/lock`11:10:49才完成解锁,而11:10:57短信记录、企业和应用选项接口均返回200。根因是同一SPA重新登录未重置上一会话的内存活动时间,以及布局只读取首次挂载的`session.locked`快照,锁定后仍保留业务路由和角标轮询。
- 登录成功后立即调用`markUserActivity()`,保证新会话使用新的活动起点。`AppShell`在本地空闲、服务端`SESSION_LOCKED`和跨标签事件三条锁定入口中统一写入实时锁定状态、暂停业务路由,并将状态回传给运营布局;解锁时恢复路由、清除锁定请求标记并重新挂载当前页面。
- 运营端待审核角标现在跟随`AppShell`实时锁定状态启停,锁定后清理30秒定时器和窗口焦点监听;解锁后才重新拉取真实待审核数量。短信记录路由因锁定被卸载,解锁后重新请求真实短信记录及筛选项,不使用缓存或静态数据伪造恢复结果。
- 使用Node.js v24.14.0分别执行前端TypeScript `--noEmit`和Vite v8.1.5生产构建,2534个模块构建通过;仅保留既有约2.03MB单chunk和CSS插件耗时提示。`git diff --check`通过。
- 本地`http://127.0.0.1:4173/#/admin/login`浏览器检查通过页面身份、非空渲染、无框架错误覆盖和输入控件交互;本地预览未启动真实API,验证码请求按预期返回502,因此没有伪造登录态,也未在本地完成真实锁定/解锁交互。完整`TC-AUTH-014``TC-AUTH-016`仍需代码发布后在预生产使用真实会话复测。
- 本轮未提交、未推送、未部署,没有发送、补发或重投真实短信,没有修改数据库、企业余额、真实通道配置或客户连接。既有`api/tsconfig.build.tsbuildinfo`、根目录`tsconfig.tsbuildinfo``outputs/`和空文件`=`继续保留,不删除、不提交、不归因。
## 2026-08-09 签名删除预检与多通道报备汇总修复(本地未提交)
- 删除预检现已将`approved``abandoned`等报备终态排除在“未结束报备任务”之外;预生产只读核对的三条任务`cmrxc3rgk004017nks1bktp9n``cmrxc3rgo004217nkw9enwk72``cmrxc3rgr004417nk887sg9ef`均为`abandoned`,修复后不会再仅因这三条历史任务阻止签名删除。模板、引流信息和真实过程态任务仍继续阻止删除。
- 新增统一报备汇总函数并复用于签名总状态、三网摘要和引流报备摘要:全部目标失败才汇总为`failed`;通过与失败并存汇总为`partial_success`;失败与待处理并存保持`reporting`。运营端签名卡片同步调整为只有所有适用目标均失败才显示红色整体失败,部分失败且仍待处理显示橙色,部分通过显示蓝色。
- 使用Node.js v24.14.0执行本次相关4个API suites,118个测试全部通过;排除受本地Redis影响的`send-chain.service.spec.ts`后,其余API全量32个suites、312个测试全部通过。API与前端TypeScript `--noEmit --incremental false`均通过,Vite v8.1.5生产构建通过(2534个模块,仅保留既有约2.03MB单chunk提示),`git diff --check`通过。
- API全量运行结果为33 suites中的32个通过、420个测试中的415个通过;未通过的5项全部位于本次未修改的`send-chain.service.spec.ts`,原因是本地Redis `127.0.0.1:6379`未运行导致BullMQ连接失败和5秒超时。该套件单独重跑同样被Redis重连拖至工具超时,因此不把API全量记为通过,也未为本任务修改发送链代码或启动外部依赖。
- 本轮没有提交、推送或部署,没有修改预生产数据库、发送真实短信、调整通道配置或客户连接。其他会话已有的登录/休眠恢复代码和文档增量继续原样保留;测试命令意外生成且本轮开始前不存在的根目录`pnpm-lock.yaml`已删除,既有`tsbuildinfo``outputs/`和空文件`=`仍受保护。
## 2026-08-09 发送质量矩阵与成功率色阶统一(本地未提交)
- 签名通道发送质量明细的“按引流切分”已改为每个通道固定三行“含引流、不含引流、未检测”,并固定三列“移动、联通、电信”;通道集合取整体和引流切分真实数据的并集,缺少真实提交的组合保留位置并显示单个`0`。整体统计页签及后端统计口径未改动。
- 新增共享成功率色阶函数,签名质量列表、明细总览、运营商概览、矩阵、短信通道管理列表和通道报备详情统一按`0`红、`>0且<=25`橙、`>25且<=50`黄、`>50且<=75`蓝、`>75且<96`绿、`>=96`深绿展示数字。通道列表和报备详情的提交失败、回执未知、送达失败比例及数量恢复为黑灰色。
- 使用Node.js v24.14.0执行成功率边界校验,`0、0.1、25、25.1、50、50.1、75、75.1、95.9、96`共10个边界值全部符合约定;前端TypeScript `--noEmit --incremental false`通过,Vite v8.1.5生产构建通过(2535个模块),仅保留既有约2.03MB单chunk提示;`git diff --check`通过。
- 本步骤只修改前端展示、共享色阶工具及需求/用例/进度文档,没有修改后端、数据库或真实统计接口,没有连接预生产、发送/补发/重投短信,也没有修改真实通道、企业余额或客户连接。代码按要求保持未提交、未推送、未部署;其他会话和前一步已有修改、`tsbuildinfo``outputs/`及空文件`=`继续保留并保护。
## 2026-08-09 运营端菜单与查询控件细节修正(本地未提交)
- 风控规则已从“审核中心”移动到“安全控制”,页面面包屑同步调整,既有`/admin/risk-rules`路由和真实后端规则接口未改变。发送监控对移动、联通、电信、三网和未识别运营商统一显示中文,未知新值仍原样展示。
- 待生成报备批次两个页签已移除括号及动态数量,标题固定为“待生成资料”和“已生成批次”;后端返回的`total`继续用于分页。短信记录通道条件已由自由文本改为通用可搜索`Select`,真实调用通道接口加载未删除通道,以名称和编码搜索,查询及导出改传精确`channelId`,重置恢复全部通道。
- 使用Node.js v24.14.0执行前端TypeScript `--noEmit --incremental false`通过,Vite v8.1.5生产构建通过(2535个模块),仅保留既有约2.03MB单chunk提示;`git diff --check`通过。本步骤不涉及后端业务逻辑,因此未增加或运行API单元测试。
- 本步骤没有连接预生产、修改数据库、发送/补发/重投短信,也没有修改真实通道配置、企业余额或客户连接。代码保持未提交、未推送、未部署;`AdminLayout.tsx`仅对菜单项位置做局部修改,其他会话已有的会话锁定和轻量轮询增量继续保留且未归因给本步骤。
## 2026-08-09 URL空白边界识别修正(本地未提交)
- 引流检测副本不再删除URL类别中的空白字符。协议链接、裸域名及路径遇普通空格、制表符、换行或全角空格时立即结束命中,空白后的字符不再归入前一个链接;空格拆分域名也不再被拼接成一个URL。短信真实原文、命中位置映射、中文句号域名兼容和数据库默认URL正则保持不变,因此本步骤不需要migration。
- 邮箱排除改用独立检测副本,继续允许仅为排除目的而规范化带空格邮箱,避免其中的数字本地部分被误判为手机号;手机号和固话类别原有空格、短横线及中文标点规避识别不受URL边界修正影响。
- 引流检测针对性测试13/13通过,覆盖四类空白边界、空格拆分域名不命中、中文句号域名、原文高亮位置、普通及带空格邮箱排除、手机号和固话识别;规则管理与通道相关2个suites、57个测试通过。API正式构建配置TypeScript检查和`git diff --check`通过。
- 一次诊断命令误用`api/tsconfig.json --noEmit`,该配置会包含全部`*.spec.ts`但不加载Jest全局类型,因而产生既有测试类型环境错误;随后使用项目正式`api/tsconfig.build.json`重新检查并通过,未修改TypeScript或Jest配置。
- 本步骤未连接预生产、未修改数据库规则、未发送/补发/重投真实短信,也未修改通道、余额或客户连接;代码保持未提交、未推送、未部署。
## 2026-08-09 CMPP客户连接请求诊断日志(本地未提交)
- Gateway入站CMPP CONNECT鉴权请求新增协议版本和原始版本值,并将真实TCP远端IP、Source_Addr账号、Base64 AuthenticatorSource、时间戳一并传给API。API在认证成功或失败时同步写`cmpp_connection.connect_requested`操作日志,客户入站资源固定为`cmpp_downstream_connection`;未知账号同样以请求账号为资源ID保存,便于定位恶意连接。
- 日志`ipAddress`直接保存Gateway报告的真实远端IP,结构化详情保存认证结果、应用ID、失败原因和全部客户请求参数。标准CMPP CONNECT报文不含明文密码,因此详情明确显示该协议事实;只有兼容调用真实携带`password`字段时才保存该字段,平台数据库内的应用密钥不会作为客户参数写入日志。
- 运营端系统与操作日志对`cmpp_connection.connect_requested`增加“查看详情”按钮,弹窗展示请求IP、账号、密码字段说明、AuthenticatorSource、时间戳、协议版本、结果、失败原因及应用ID;既有列表IP列继续读取真实`OperationLog.ipAddress`
- Gateway全量`go test ./... -count=1``go vet ./...`通过;Gateway入站包测试通过。API Gateway认证针对性3/3通过,覆盖成功、应用禁用失败和未知恶意账号;API正式构建TypeScript、前端TypeScript、Vite生产构建和`git diff --check`通过。Vite仅保留既有约2.03MB单chunk提示,Jest使用`--forceExit`结束既有开放句柄。
- 本步骤未实际建立、断开或修改预生产客户连接,未连接预生产数据库,未发送短信,也未修改真实账号、密码、IP白名单、连接数、通道或余额;代码保持未提交、未推送、未部署。
## 2026-08-09 通讯交互日志完整手机号(本地未提交)
- `ProtocolInteractionLog`新增可空`phoneNumber`字段及migration`20260809130000_add_protocol_log_plain_phone`。新产生的CMPP/HTTP通讯日志将Gateway或API上报的完整号码写入该字段,不再为新记录生成`phoneMasked`;既有脱敏列暂不删除,仅作为旧行显示兜底,不执行历史号码恢复或回填。
- 通讯日志关键词查询已从`phoneMasked`切换到`phoneNumber`,运营端列表对象列和详情读取完整号码,筛选提示及页面说明同步明确“完整手机号”。短信正文、密码、密钥、Token、鉴权头和完整请求体仍继续由通讯日志详情清洗逻辑排除。
- Prisma schema validate和client generate通过;通讯日志服务测试3/3通过,覆盖新日志完整号码持久化、敏感详情排除和完整号码查询。API正式构建TypeScript、前端TypeScript、Vite生产构建和`git diff --check`通过,Vite仅保留既有约2.03MB单chunk提示。
- 新migration尚未应用到本地或预生产数据库;本步骤未查询或修改历史手机号,未连接预生产、发送短信、修改通道、余额、客户连接或权限配置。代码保持未提交、未推送、未部署。
## 2026-08-09 三类报表全量筛选汇总(本地未提交)
- `GET /api/admin/reports/reconciliation``profit``quality`在原有分页响应中新增`summary`;后端使用与明细、总数完全相同的`where`对PostgreSQL报表表执行聚合,不从当前页`items`二次求和。
- 对账、利润、质量页在筛选区后展示“筛选结果汇总”,明确说明不受当前分页影响。三页均展示提交/发送/未知/成功/失败合计;利润页另展示全部金额合计和重算综合利润率,质量页展示重算综合成功率。
- 成功率按合计成功/合计发送、利润率按合计利润/合计净消费计算,避免求和或平均分组百分比导致失真;平均到达时长不可直接加总,未放入汇总区。
- 使用Node.js v24.14.0运行`reports.service.spec.ts` 7/7通过,增加无匹配行时合计及综合率全部归零覆盖;API正式构建TypeScript和前端TypeScript均通过。首次测试命令命中系统旧Node导致缺少`node:util/types`,改用工作区Node后专项测试正常;一次在仓库根目录直接运行API Jest未加载`api/jest.config.cjs`,随后在`api`目录按项目配置重跑通过。
- 本步骤未连接预生产、未修改数据库、未发送/补发/重投短信,也未修改真实通道、余额或客户连接。代码保持未提交、未推送、未部署。
## 2026-08-09 运营端新建企业省市字典修正(本地未提交)
- 确认根因为`AdminCustomerFormPage`前端写死仅12个省级地区,且每省只列出1至3个地市,与平台真实数据库不一致。该静态省市数组已移除。
- 新增真实字典接口`GET /api/admin/dictionaries/administrative-regions`,从PostgreSQL `PhoneSegment.province/city`执行去重查询,服务层过滤空白值、合并重复地市并按中文排序。本轮不新建静态地区表、不使用Mock或localStorage。
- 新建/编辑企业页加载上述接口并做真实省—地市级联,切换省份时清空原地市;字典加载失败显式报错。编辑历史档案时会将当前原值补入选项,避免因号段库格式差异静默丢值。
- 字典服务专项测试16/16通过,覆盖真实查询参数、去重、空值过滤和中文排序;API正式构建TypeScript与前端TypeScript通过。
- 本步骤未新增migration,未修改`PhoneSegment`数据或任何企业档案,未连接预生产、发送短信、修改通道、余额或客户连接。代码保持未提交、未推送、未部署。
- 本轮最终组合复核:报表与字典专项共2 suites / 23 tests通过,API正式构建TypeScript、前端TypeScript和Vite v8.1.5生产构建通过(2535个模块);仅保留既有约2.03MB单chunk告警。
## 2026-08-09 通道组逻辑删除与真实风险统计(本地验证完成)
- 新增`GET /api/admin/channel-groups/:id/deletion-impact`,从真实数据库按不同企业应用统计正常/已删除关联,并返回组内通道数及`submitStatus = queued`的等待供应商提交记录数;不使用静态数据、Mock或localStorage。
- 删除弹窗改为“删除通道组:{名称}”,依次展示“关联正常企业应用、关联已删除企业应用、组内通道、等待供应商提交结果”,并使用约定的历史保留说明;不再要求输入名称或删除原因,业务关联数量不禁用确认删除。
- 删除接口不再因企业应用关联阻止,也不再物理删除通道组或组内通道;仅将通道组状态置为`deleted`并记录删除前快照、实时影响统计和逻辑删除方式。默认列表排除已删除组,新短信继续只选择活动通道组,历史配置、发送、回执、上行匹配和审计链路保留。
- 通道专项`channels.service.spec.ts` 1 suite / 43 tests通过;API与前端TypeScript `--noEmit --incremental false`通过;Vite v8.1.5生产构建通过(2535 modules,仅保留既有约2.03MB单chunk提示);Gateway全量`go test ./... -count=1``go vet ./...`通过;Prisma schema validate及client generate通过;全部结构契约门禁通过。
- API全量运行共33 suites / 429 tests,其中32 suites / 424 tests通过;仅`send-chain.service.spec.ts`的5项因本机Redis `127.0.0.1:6379`未运行产生连接拒绝并超时,与此前环境阻塞一致,不是业务断言失败。本轮未为通过测试而伪造Redis或修改发送链逻辑。
- 本地验证未发送、补发或重投真实短信,未修改真实通道账号、密码、启停状态、企业余额或客户连接。预生产发布结果将在安全备份、migration和部署后只读检查完成后补记。