feat: add phone frequency controls and modularize codebase
This commit is contained in:
@@ -2748,3 +2748,295 @@ git diff --check
|
||||
- 部署后使用真实 Prisma Client 和 PostgreSQL 只读执行新路径:运营看板返回 00:00~23:00 共 24 个小时桶和企业认证、短信审核、模板、签名、引流信息 5 类审核速度;短信记录运营商筛选真实计数为移动 630、联通 145、电信 138、未识别 87。共享号码路由服务并发识别 3 次只加载 1 次运营商规则,真实号码和未知号码各用 1 次号段查询,均返回预期结果。
|
||||
- 尝试受保护 HTTP 验证时,部署管理员凭据文件的 `password=unchanged` 标记被误当成密码提交一次并返回 401;未继续猜测或绕过认证。随后使用部署自带 `ensure-production-admin.mjs` 将该部署管理员失败计数恢复为 0,确认未锁定。发布后 API/Gateway error 级 journal 和 panic/fatal/unhandled/Prisma 关键错误匹配均为 0。
|
||||
- 本次未发送、重投或补发真实短信,未修改供应商通道凭据或启停状态、企业余额、客户连接和短信业务数据。
|
||||
|
||||
## 2026-07-29 运营看板今日发送趋势小时分桶时区修复(本地未提交)
|
||||
|
||||
- 预生产只读核验确认“01:00 提交 128 条”并非真实凌晨发送:对应 `SmsMessageRecord.queuedAt` 存储值为 UTC `2026-07-29 01:19:41`~`01:50:42`,正确北京时间为 `09:19:41`~`09:50:42`。
|
||||
- 根因是 `queuedAt` 在 PostgreSQL 中为 `timestamp without time zone` 并按 UTC 保存,原聚合 SQL 直接执行 `queuedAt AT TIME ZONE 'Asia/Shanghai'`,把 UTC 墙上时间错误解释为上海本地时间,小时桶整体提前 8 小时且受数据库会话时区影响。
|
||||
- 小时分桶改为先用 `AT TIME ZONE 'UTC'` 将存储值解释为 UTC,再用 `AT TIME ZONE 'Asia/Shanghai'` 转为北京时间后提取小时;新增 SQL 结构回归断言,并在需求和 `TC-DASHBOARD-007` 中明确 UTC 存储及会话时区无关性。
|
||||
- Node.js v24.14.0 下 Operations 定向 1 suite / 26 tests 全部通过,API TypeScript 正式构建通过。预生产真实 PostgreSQL 只读执行修正后的等价 SQL,在会话时区分别设置为 UTC 和 `Asia/Shanghai` 时,128 条记录均稳定归入北京时间 `09:00`,未落入 `01:00`。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署;既有构建缓存、`outputs/`、空文件 `=` 和 `tsconfig.tsbuildinfo` 继续原样保留。
|
||||
|
||||
## 2026-07-30 号码发送频次风控(本地未提交)
|
||||
|
||||
- 按用户确认口径新增两条全局兜底:北京时间自然日 10 条、固定 5 分钟 5 条;隔离键为企业应用、号码和规则,两条规则独立覆盖与命中,首版统一直接拒绝。
|
||||
- 新增`PhoneFrequencyState`实时状态和`PhoneFrequencyHit`历史触发模型及 migration `20260730093000_add_phone_frequency_controls`。计数通过 PostgreSQL `INSERT ... ON CONFLICT DO UPDATE ... RETURNING`原子占用;大批量号码按 1000 条分块写入但保持同一数据库事务,避免 PostgreSQL 参数数量上限。
|
||||
- 客户端批量、公开 HTTP 和 CMPP 单号码入口已接入同一频控服务。非法/黑名单号码和任务级已拒绝记录不计数;命中号码按业务短信记录直接失败且金额为 0,未命中号码继续发送,长短信分片与通道补发不重复计数。
|
||||
- 风控规则页新增两类规则定义,应用级阈值可分别覆盖全局规则,后端强制正整数阈值和直接拒绝动作;新增真实触发记录分页、号码/状态/应用范围查询及“解除并清零”操作。解除原因必填,保留历史触发记录并写操作审计。
|
||||
- Prisma format、validate、generate通过;API TypeScript正式构建和前端 TypeScript/Vite生产构建通过。新增频控服务 1 suite / 2 tests、发送链 1 suite / 104 tests、原风控 1 suite / 15 tests均通过;API 全量 28 suites / 380 tests全部通过。发送链及全量测试需沿用项目既有`--forceExit`开放句柄处理,首次未带该参数运行在工具时限内未自行退出,未将超时计为通过。
|
||||
- 本地真实 PostgreSQL 已应用全部 77 条 migration,其中包含`20260730093000_add_phone_frequency_controls`。6 个同应用同号码并发占用的结果为 5 个放行、1 个拒绝,状态计数 6、活跃命中 1 条;后续提交继续拒绝且计数冻结为 6。人工解除后计数归零、代次从 0 增至 1,同周期再次越线成功生成新代次命中;日规则与 5 分钟规则独立生效。验证使用专用测试号码,状态、命中和操作日志均已清理。
|
||||
- 本地 API 关闭发送 Worker 后连接真实 PostgreSQL 启动成功,Vite production preview 可正常渲染且控制台无错误;访问风控规则目标路由被真实鉴权跳转至图形验证码登录页。`codex_local_admin`在本地数据库中复核为 active、平台管理员、失败次数 0 且未锁定,但本轮未请求用户授权代解验证码,因此未把登录页冒充规则页视觉和解除弹窗交互验收。Vite dev 模式另出现既有`cookie.parse`导出不兼容白屏,改用成功生产构建的 preview 后消失,未修改依赖。
|
||||
- 验收启动的本地 API、Vite dev/preview 和 PostgreSQL 已停止;原先已运行的 Redis 保持不变。当前仍缺登录后规则页桌面/窄屏视觉和解除弹窗交互验收,未提前宣称该项通过。
|
||||
- 本轮按用户要求保持本地未提交、未推送、未部署。另一会话既有的运营看板小时分桶时区修复及其文档修改继续保留,不归因于本需求;构建缓存、`outputs/`、空文件`=`和`tsconfig.tsbuildinfo`继续原样保留。
|
||||
|
||||
## 2026-07-30 平台级号码频控白名单(本地未提交)
|
||||
|
||||
- 按用户确认口径新增平台级号码白名单:启用号码在全平台所有企业应用下均豁免24小时和5分钟号码频控,其他号码校验、黑名单、内容审核、余额、路由及其他风控不受影响。
|
||||
- 新增`PhoneFrequencyWhitelist`模型及 migration `20260730114500_add_phone_frequency_whitelist`,号码全平台唯一,记录启用/停用/软删除状态、用途说明、备注、创建人、最后操作人和时间;创建人、更新人及状态时间均建立相应索引。
|
||||
- 后端提供真实数据库分页、状态/号码/关键字/更新时间查询及新增、修改、停用和软删除接口。批量发送在频控事务内按1000个号码分块读取启用白名单,不使用逐号码查询、Mock、静态数据或localStorage。
|
||||
- 新增/恢复启用、改号、启停和删除会在同一事务中清零相关号码在所有应用和两类规则下的当前状态,并解除活跃命中;白名单及频控命中历史均保留,所有写操作写入运营审计。
|
||||
- 运营端风控规则页新增“平台级号码频控白名单”区域,提供号码/状态查询、真实分页、新增、编辑、启停和填写原因后删除,页面明确说明仅豁免两类号码频控及跨应用生效范围。
|
||||
- Prisma format、validate、generate通过;API TypeScript正式构建、前端TypeScript检查及Vite v8.0.16生产构建通过。号码频控服务定向1 suite / 3 tests、API全量28 suites / 381 tests全部通过;全量Jest仅保留项目既有`--forceExit`开放句柄提示,Vite仅保留既有约1.99MB单chunk提示。
|
||||
- 本地真实PostgreSQL已应用全部78条migration。专用验收号码先在应用A形成24小时计数6和5分钟计数6/活跃命中1条;新增启用白名单后两类状态均归零且活跃命中被解除;在应用B连续占用12次未产生任何频控状态;删除白名单后应用B两类计数均从1重新开始。白名单、状态、命中和审计验收数据均已清理。
|
||||
- 本地API以关闭发送Worker、扫描任务和通道重连的安全配置连接真实PostgreSQL运行,`/api/health`返回HTTP 200;前端production preview的目标路由返回HTTP 200且控制台无warning/error。应用内浏览器无既有登录会话,真实鉴权将目标路由跳转至图形验证码登录页,未获本轮授权代解验证码,因此未把登录页冒充白名单区域的登录后视觉验收。
|
||||
- 本地API继续监听3000,前端production preview继续监听4173,PostgreSQL和Redis分别继续监听5432、6379,供用户本地查看。当前按用户要求保持未提交、未推送、未部署;另一会话的运营看板小时分桶修改继续保留且不归因于本需求,构建缓存、`outputs/`、空文件`=`和`tsconfig.tsbuildinfo`继续原样保留。
|
||||
|
||||
## 2026-07-30 客户端工作台与短信发送体验完善(本地未提交)
|
||||
|
||||
- 客户端 Dashboard 新增真实企业概览:企业名称来自`Tenant`,认证状态按是否存在已通过`EnterpriseCertification`判定,签名数量排除已删除和已禁用签名,待审核批量任务独立统计当前企业`sourceType=client/status=pending_review`的`SmsBatchTask`。这些独立查询与原 Dashboard 聚合并行执行。
|
||||
- 工作台账户状态改为已认证/未认证,企业主体展示企业名称,默认签名改为签名数量;快捷操作移除“真实”字样。模板、签名、批量任务卡片分别展示真实待审核数量并可进入对应菜单。
|
||||
- 客户端今日发送趋势改为消费后端00:00~23:00共24个北京时间小时桶;继续包含另一会话尚未提交的 UTC 存储时间到上海时区双重转换修复,不将其归因于本需求。
|
||||
- 签名与引流信息页的“重置”增加刷新代次,即使筛选条件已经为空也会重新请求真实签名工作区;运营端企业认证审核和短信模板审核的初始及重置状态改为待审核。
|
||||
- 短信发送预计条数改为70字符内1条、长短信每67个Unicode字符一条,并随正文和有效号码数即时计算;单价单位改为元/条。提交失败使用中央弹窗,提交成功弹窗展示真实任务编号和号码数,可清空表单继续发送或携带任务编号进入批量任务页。
|
||||
- 定时发送日期控件新增按`Asia/Shanghai`计算的“今天”按钮和当天浅色标识,提交时把页面选择值显式规范为`+08:00`;不依赖用户浏览器或服务器默认时区解释业务时间。
|
||||
- Operations 定向1 suite / 26 tests、API全量28 suites / 381 tests全部通过;API TypeScript正式构建、前端TypeScript检查和Vite v8.0.16生产构建通过,2442个模块完成转换。Jest仅保留项目既有`--forceExit`开放句柄提示,Vite仅保留既有约2.00MB单chunk提示,`git diff --check`通过。
|
||||
- 本地真实PostgreSQL只读执行企业名称、已通过认证、有效签名和待审核客户端批量任务等价查询成功;样本同时覆盖已认证和未认证企业,未写入或修改认证、签名、任务和短信数据。
|
||||
- 本地API health和production preview均HTTP 200,浏览器加载前端无框架错误覆盖层且控制台无warning/error;目标客户端路由被真实鉴权跳转到图形验证码登录页。未获授权处理验证码,因此未把登录页当作工作台、短信发送、日期控件和成功/失败弹窗的登录后视觉及交互验收。
|
||||
- 本轮未提交发送任务、未发送真实短信,也未修改企业余额、通道、客户连接或预生产数据。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署。号码频控、平台白名单及其migration、发送链、风控页面和文档是另一会话既有修改,继续完整保留且不归因于本需求。
|
||||
|
||||
## 2026-07-30 R0 渐进式拆分安全护栏(本地未提交)
|
||||
|
||||
- R0 已按“先锁定行为、不移动生产代码”的范围完成。新增大文件职责与副作用索引,覆盖 `SendChainService`、Gateway 入站/上游、Channels、SmsConfig、Operations、ReportMaterials、`adminApi` 和全局样式,并记录直接调用者、主要数据库表、队列/外部副作用、事务与幂等不变量。
|
||||
- 新增单版本唯一结构修改会话规则、开始前/实施中/提交前/发布观察清单、立即停止条件和回滚记录模板。后续 R1~R11 每个版本仍需重新核对 Git 与部署事实,不能把本轮基线提交视为永久事实。
|
||||
- 新增机器可执行的 `tools/quality/verify-refactor-r0.mjs` 和 `docs/contracts/refactoring-r0-manifest.json`,固定 8 个稳定门面、Redis Stream 四类契约样例、CMPP 2.0/3.0 报文、Gateway ACK/重连以及发送链和账务并发幂等测试入口。R0 门禁和现有队列契约校验均通过。
|
||||
- Node.js v24.16.0 下 API 全量 28 suites / 381 tests 全部通过;API TypeScript 正式构建、前端 TypeScript 与 Vite v8.0.16 生产构建、Prisma format/validate/generate、Gateway `go test ./...` 与 `go vet ./...`、依赖安全门禁和 `git diff --check` 全部通过。Jest 仅保留项目既有 `--forceExit` 开放句柄提示,Vite 仅保留既有约 2.00MB 单 chunk 提示。
|
||||
- R0 没有新增或修改业务接口、数据库 schema、migration、Redis Stream 消息或 CMPP 行为,没有启动新服务、写数据库或发送短信。当前工作区既有号码频控/白名单、客户端体验、运营看板等其他修改及构建产物均完整保留,不归因于 R0。
|
||||
- 本轮按用户要求仅保留本地未提交修改,不提交、不推送、不部署。
|
||||
|
||||
## 2026-07-31 R1 前端 API 兼容门面拆分(本地未提交)
|
||||
|
||||
- 按路线图完成 R1.1~R1.5。原`src/api/adminApi.ts`从2292行缩减为19行稳定兼容门面;现有页面仍统一从该文件导入,不批量修改73处调用位置。
|
||||
- 通用HTTP、错误解析、401退出、`SESSION_LOCKED`、最近认证、租户请求头、Blob、multipart和查询参数逻辑移动到`src/api/core/httpClient.ts`;函数体与拆分前逐项一致。运营端按身份与企业、通道与报备、运营查询、审核风控账务、文件上传拆成五个领域对象;客户端API和会话API独立。
|
||||
- 104个公开类型按common、identity-config、channels-reports、operations、governance五个领域拆分并由统一barrel重导出。最大业务API文件194行,最大类型文件580行;没有新增循环运行时依赖,跨领域引用均为type-only import。
|
||||
- 新增`docs/contracts/admin-api-r1-methods.json`和`tools/quality/verify-admin-api-r1.mjs`。门禁确认183个运营端方法、60个客户端方法、7个会话方法及9个HTTP核心函数的实现哈希与拆分前一致,同时确认`adminApi`、`clientApi`、`portalSessionApi`和`fileDownloadUrl`稳定导出仍存在;R0门禁继续通过。
|
||||
- Node.js v24.16.0下前端TypeScript检查及Vite v8.0.16生产构建通过,2456个模块完成转换;API全量28 suites / 381 tests、API TypeScript正式构建、Gateway`go test ./...`与`go vet ./...`、依赖安全门禁和`git diff --check`全部通过。Jest仅保留既有`--forceExit`开放句柄提示,Vite仅保留既有约2.00MB单chunk提示。
|
||||
- 应用内浏览器访问`http://localhost:4173/#/admin/login`,页面标题为“聆界短信管理平台”,登录表单和验证码正常渲染;点击验证码后真实算式发生变化,控制台无warning/error且无框架错误覆盖。未获授权求解验证码和登录,因此登录后关键菜单真实API冒烟仍未执行,未将登录页验证冒充该项通过。
|
||||
- R1只移动前端API与类型代码,没有修改URL、HTTP方法、请求体、返回类型、页面交互、后端、数据库schema、migration、Redis Stream或CMPP协议;没有写数据库或发送短信。工作区中既有号码频控/白名单、客户端体验、运营看板及其他会话产物继续完整保留,不归因于R1。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署。
|
||||
|
||||
## 2026-07-31 R2 运营查询服务兼容门面拆分(本地未提交)
|
||||
|
||||
- 按路线图完成R2。`api/src/operations/operations.service.ts`从2368行缩减为150行稳定门面,运营端和客户端控制器继续只注入`OperationsService`,29个公开方法的名称、参数、异步标记和返回推断保持不变。
|
||||
- 原实现按短信记录与CSV、上行与监控、运营看板、发送/签名质量、系统日志、下游投递恢复、追踪对账七个领域迁移;3个私有方法随唯一调用域移动。查询契约独立到`operations.contracts.ts`,36个查询构造、时区、CSV、安全视图和响应汇总函数集中到`operations.helpers.ts`。
|
||||
- 新增`docs/contracts/operations-r2-methods.json`和`tools/quality/verify-operations-r2.mjs`。R2门禁确认29个公开方法、3个私有方法、9个查询契约和36个辅助函数与拆分前实现哈希一致;SQL、Prisma查询参数、分页、CSV、上海时区和客户端安全映射未改写。
|
||||
- Operations定向1 suite / 26 tests、API全量28 suites / 381 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、前端TypeScript与Vite v8.0.16生产构建、Gateway`go test ./...`与`go vet ./...`、依赖安全门禁和`git diff --check`全部通过。Jest仅保留既有`--forceExit`开放句柄提示,Vite仅保留既有约2.00MB单chunk及本次构建解析耗时提示。
|
||||
- 真实本地PostgreSQL只读调用拆分后的服务:短信总数56、第一页5条;签名质量和恢复状态当前均为0条;客户端看板返回真实企业“测试客户A”、未认证、有效签名0和待审核任务0。首次只读验证误用了Tenant不存在的`deletedAt`字段,Prisma在SQL执行前拒绝,修正为当前schema字段后通过;全程未写数据库。
|
||||
- R2没有修改控制器、路由、数据库schema、migration、Redis Stream、Gateway或CMPP协议,没有触发下游重投、文件导出落库或短信发送。当前工作区既有号码频控/白名单、客户端体验、R0/R1及其他会话产物继续完整保留,不归因于R2。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署。
|
||||
|
||||
## 2026-07-31 R3 短信配置兼容门面拆分(本地未提交)
|
||||
|
||||
- 按路线图完成R3。`api/src/sms-config/sms-config.service.ts`从2268行缩减为约244行稳定门面,运营端、客户端、Gateway事件和报备资料服务继续依赖`SmsConfigService`;51个公开方法名称、参数、异步标记和返回推断保持不变。路线图中的“第一阶段”表示保留统一门面,不表示短信配置只拆了一部分。
|
||||
- 原实现按应用配置与接入参数、应用停用生命周期和下游连接、签名、引流信息、模板、审核记录与动作、共享报备资料校验七个领域迁移。21个内部方法随职责移动;既有私有停用扫描测试入口由门面继续委托生命周期服务,未复制业务实现。
|
||||
- 19个DTO和查询类型移到`sms-config.contracts.ts`,运营端、客户端和Gateway控制器不再从实现类文件导入DTO。27个规范化、CMPP参数、模板变量及报备值辅助声明集中到`sms-config.helpers.ts`;`SmsConfigModule`仍只注册并导出稳定门面,不扩大NestJS provider图。
|
||||
- 新增`docs/contracts/sms-config-r3-methods.json`和`tools/quality/verify-sms-config-r3.mjs`。R3门禁确认51个公开方法、21个内部方法、19个契约和27个辅助声明领域归属正确,迁移前后方法体在受控依赖委托还原后完全一致;R0、R1、R2门禁继续通过。
|
||||
- Node.js v24.14.0下短信配置与审核治理定向2 suites / 68 tests、API全量28 suites / 381 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、前端TypeScript和Vite v8.0.16生产构建、Gateway`go test ./...`与`go vet ./...`、依赖安全门禁和`git diff --check`通过。Jest只保留既有`--forceExit`开放句柄提示,Vite只保留既有约2.00MB单chunk提示。
|
||||
- 真实本地PostgreSQL只读调用拆分后的门面成功:读取真实应用并确认租户匹配,应用报备字段当前0条、引流信息0条、模板1条、签名审核记录0条。第一次只读校验脚本按错误的对象结构读取报备字段长度而抛出TypeError,修正为当前数组响应后通过;两次均未执行写操作。
|
||||
- R3没有修改控制器路由、请求/响应DTO内容、数据库schema、migration、Redis Stream、Gateway或CMPP协议,没有调用创建、编辑、审核、停用、下游重投或短信发送路径。现有号码频控/白名单、客户端体验、R0~R2和其他工作区修改继续完整保留,不归因于R3。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署。
|
||||
|
||||
## 2026-07-31 R4 报备资料与企业签名页面拆分(本地未提交)
|
||||
|
||||
- 按路线图完成R4后端全部边界。`api/src/report-materials/report-materials.service.ts`从1134行缩减为82行稳定门面,12个公开方法的名称、参数、异步标记和返回推断保持;11个内部方法按官方模板与导出、导入解析映射、暂存与审核、待生成查询、批次预检生成、通道文件导出、幂等操作记录七个领域迁移。
|
||||
- 10个DTO、查询和内部数据类型移到`report-materials.contracts.ts`,32个工作簿安全、字段映射、分页、日期、文件和导出辅助函数移到`report-materials.helpers.ts`。控制器DTO不再从实现类文件导入,模块和其他调用方仍只依赖稳定门面。
|
||||
- 前端遵守“一个版本只拆一个大页面”,选择`AdminEnterpriseSignaturesPage.tsx`,从884行缩减为238行页面容器。类型、纯展示辅助、动态报备资料、签名编辑、引流编辑、报备状态弹窗和签名/引流表格拆为7个文件,最大132行;页面容器继续统一维护筛选、分页、加载、保存和删除协调。
|
||||
- 新增`docs/contracts/report-materials-r4-methods.json`、`docs/contracts/admin-enterprise-signatures-r4.json`、`tools/quality/verify-report-materials-r4.mjs`和`tools/quality/verify-enterprise-signatures-r4.mjs`。后端门禁确认12个公开方法、11个内部方法、10个契约和32个辅助函数实现一致;前端门禁确认20个移出函数、表格JSX、8个真实API调用和25个页面状态保持。
|
||||
- Node.js v24.14.0下报备资料定向1 suite / 10 tests、API全量28 suites / 381 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、前端TypeScript和Vite v8.0.16生产构建、Gateway`go test ./...`与`go vet ./...`、依赖安全门禁通过。Jest只保留既有`--forceExit`开放句柄提示,Vite只保留既有约2.00MB单chunk提示。
|
||||
- 真实本地PostgreSQL只读调用拆分后门面成功:待生成资料、导入审核批次和已生成批次当前均0条,导入映射配置0条;未调用模板生成、文件上传、导入提交、审核、批次生成、幂等认领或通道导出,没有写数据库或对象存储。
|
||||
- 应用内浏览器访问`http://localhost:4173/#/admin/enterprise-signatures`,真实鉴权将失效会话跳转运营登录页;页面标题、非空DOM、登录提示和表单正常,控制台无warning/error,点击验证码后算式从`25 + 1`变为`36 + 9`。当前浏览器运行时不支持页面或元素截图命令,未切换到未授权的Playwright回退;没有求解验证码或把登录页当成企业签名主体的登录后视觉验收。
|
||||
- R4没有修改数据库schema、migration、Redis Stream、Gateway、CMPP协议或其他大页面,没有发送短信、生成报备文件或修改业务数据。号码频控/白名单、客户端体验、R0~R3和其他工作区修改继续完整保留,不归因于R4。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署。
|
||||
|
||||
## 2026-07-31 R5 通道服务兼容门面拆分(本地未提交)
|
||||
|
||||
- 按路线图完整拆分R5七个领域。`api/src/channels/channels.service.ts`从2572行缩减为204行稳定门面,控制器、模块和既有测试继续依赖同一入口;37个公开方法的名称、参数、异步标记和返回推断保持不变。
|
||||
- 原实现按通道配置与状态、连接/重连与Gateway控制、测试短信、通道组与路由、报备字段/任务/回执/记录、通道复制、删除入口七个领域迁移。连接服务统一持有定时器、Redis客户端、Gateway请求和队列副作用;配置服务仅在既有连接参数变化条件满足时委托重连;既有私有Gateway重启恢复测试入口由门面继续委托。
|
||||
- 17个DTO和查询契约移到`channels.contracts.ts`,控制器不再从实现类文件导入DTO;60个共享常量、类型和纯辅助声明移到`channels.helpers.ts`。`ChannelsModule`仍只注册并导出稳定门面,没有扩大NestJS provider图。
|
||||
- 新增`docs/contracts/channels-r5-methods.json`和`tools/quality/verify-channels-r5.mjs`。门禁确认37个公开方法、14个内部方法、17个契约和60个辅助声明领域归属正确,并锁定连接参数重连条件、Gateway连接/断开路径、定时器、Redis队列和Stream、测试号码规范化及单次提交语义。首次生成版本因统一缩进改变模板字符串内SQL空白,被门禁在`listReportTasks`处拒绝;改为只缩进方法首行后,迁移实现哈希全部一致。
|
||||
- Channels定向测试首次有1项失败,原因是稳定门面遗漏既有私有`reconnectActiveChannelsAfterGatewayRestart`测试缝;补回纯委托入口后1 suite / 41 tests全部通过。API全量28 suites / 381 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、前端TypeScript和Vite v8.0.16生产构建、Gateway`go test ./...`与`go vet ./...`及依赖安全门禁通过。Jest只保留项目既有`--forceExit`开放句柄提示,Vite只保留既有约2.00MB单chunk提示。
|
||||
- 真实本地PostgreSQL只读调用拆分后门面成功:通道分页返回5/5条、通道组2条、路由规则1条、报备任务1/1条,连接、连接日志、报备字段和报备记录查询均正常完成。验证未调用`onModuleInit`、重连、状态同步、创建、编辑、复制、删除、测试短信、报备导出或其他写路径。
|
||||
- R5没有修改数据库schema、migration、控制器路由、Redis Stream契约、Gateway或CMPP协议,没有发送真实短信,也没有修改真实通道账号、密码、启停状态或连接。号码频控/白名单、客户端体验、R0~R4及其他工作区修改继续完整保留,不归因于R5。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署。
|
||||
|
||||
## 2026-07-31 R6 Gateway 入站服务拆分(本地未提交)
|
||||
|
||||
- 按路线图在`gateway/internal/inbound`同一Go package内完整拆分R6。原`server.go`从1671行缩减为37行稳定启动入口;`Server.ListenAndServe`、`DisconnectAccount`、`PushReceiptWithResult`和`PushUplinkWithResult`等公开入口、`cmd/gateway`及控制服务调用方式保持不变。
|
||||
- 原实现按登录认证、Submit与报文转换、下游会话注册、回执/上行Deliver、ACK追踪与SubmitResp顺序屏障、待投递恢复扫描、协议日志、共享HTTP传输八个职责迁移到9个聚焦文件。现有`presence.go`和`recovery.go`保持原样;没有跨package改接口或形成新的运行时依赖。
|
||||
- 新增`docs/contracts/inbound-r6-declarations.json`和`tools/quality/verify-inbound-r6.go`。门禁逐项确认迁移前93个声明的文件归属和实现哈希一致,并锁定稳定启动入口、控制服务三个调用入口及12项关键协议测试。SubmitResp先于排队回执、会话唯一所有权、原始Msg_Id恢复和多实例恢复锁等复杂边界补充了原因注释,没有改写实现。
|
||||
- 入站定向测试32项全部通过;Gateway`go test ./... -count=1`全部package通过,`go vet ./...`通过。`go test -race ./internal/inbound`因当前Windows Go环境`CGO_ENABLED=0`而在执行测试前拒绝启动,未将竞态检测记为通过,也未为本轮临时安装C工具链。
|
||||
- API全量28 suites / 381 tests全部通过;API TypeScript正式构建、Prisma format/validate/generate、前端TypeScript和Vite v8.0.16生产构建、依赖安全门禁及R0~R6全部结构门禁通过。Vite只保留既有约2.00MB单chunk提示,Jest只保留既有`--forceExit`开放句柄提示。
|
||||
- 第一次API全量命令误在仓库根目录直接启动Jest,没有加载`api`目录的TypeScript配置,28个suite均在解析阶段退出且0项测试执行;回到正确`api`工作目录后381项全部通过,该误调用不属于产品失败。
|
||||
- Gateway测试覆盖真实本地TCP监听及CMPP 2.0/3.0登录、单/多号码、长短信、SubmitResp顺序、Deliver ACK、ACK超时、连接关闭与恢复锁。额外的独立本地Gateway进程冒烟命令被当前执行策略在启动前拦截,因此没有把它记录为通过;本轮没有连接预生产CMPP端口。
|
||||
- R6没有修改CMPP报文、HTTP回调内容、Redis键、数据库schema、migration、队列或业务规则,没有发送短信、触发补发/重投、登录真实下游账号,也没有修改通道、余额或客户连接。号码频控/白名单、客户端体验、R0~R5及其他工作区修改继续完整保留,不归因于R6。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署。
|
||||
|
||||
## 2026-07-31 R7 Gateway 上游管理拆分(本地未提交)
|
||||
|
||||
- 按路线图在`gateway/internal/upstream`同一Go package内完整拆分R7。原`manager.go`从1495行缩减为198行稳定管理入口;`Manager.Submit`、`ConnectChannel`、`DisconnectChannel`和`ConnectionState`等公开契约,以及`cmd/gateway`、控制服务和Submit Worker调用方式保持不变。
|
||||
- 原实现按Manager与连接池注册、连接池生命周期、物理连接与读循环、重连状态机、窗口/心跳、Submit与分片、回执/上行Deliver、协议日志、ConnectionState与API回调九个职责迁移。既有`long_message.go`已独立承担长短信拆分和上行组装,本轮保持原样。
|
||||
- 新增`docs/contracts/upstream-r7-declarations.json`和`tools/quality/verify-upstream-r7.go`。门禁按接收者类型分别确认迁移前68个声明的文件归属和实现哈希一致,避免混淆连接池与物理连接的同名方法;同时锁定Manager稳定入口、控制服务调用、既有长短信函数及15项关键状态机测试。
|
||||
- 为慢鉴权重连、手工断开停止条件、每连接窗口所有权、长短信逐分片结果、未决提交唤醒和回执tracker等复杂边界补充原因注释,未修改业务实现、常量或时序。
|
||||
- 上游定向测试18项全部通过;其中本地重连集成测试使用真实TCP监听模拟供应商端点,先确认连接失败,再启动端点并验证自动恢复连接。Gateway`go test ./... -count=1`全部package通过,`go vet ./...`通过;没有连接任何真实供应商通道。
|
||||
- API全量28 suites / 381 tests全部通过;API TypeScript正式构建、Prisma format/validate/generate、前端TypeScript和Vite v8.0.16生产构建、依赖安全门禁及R0~R7全部结构门禁通过。Vite只保留既有约2.00MB单chunk提示,Jest只保留既有`--forceExit`开放句柄提示。
|
||||
- R7没有修改连接数、窗口、心跳、重连延迟、鉴权失败分类、长短信分片、回执状态、HTTP回调、CMPP协议、Redis Stream、数据库schema或migration,没有发送短信、触发补发/重投,也没有修改通道凭据、启停状态、余额或客户连接。号码频控/白名单、客户端体验、R0~R6及其他工作区修改继续完整保留,不归因于R7。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署。
|
||||
|
||||
## 2026-07-31 R8 发送链纯逻辑拆分(本地未提交)
|
||||
|
||||
- 按路线图完成R8。`api/src/send-chain/send-chain.service.ts`从5345行缩减为4578行;24个DTO、Gateway事件和队列契约迁移到`send-chain.contracts.ts`,64个既有常量、状态/错误映射、号码/资源判定、模板/签名/引流分类及事件键等纯声明迁移到`send-chain.helpers.ts`。
|
||||
- `SendChainService`仍保留98个数据库事务、队列发布、Gateway调用和顶层编排方法。通道候选选择、通道可发送性、分片最终状态聚合、上游端点身份比较和回执事件键生成改为显式纯函数;既有数据库查询、事务范围、日志字段、幂等键、队列消息及调用顺序未改变。
|
||||
- 为省内优先/全国兜底、排除或未报备通道、分片未收齐、全部成功、明确失败优先、上游端点身份和稳定回执事件键新增8项纯逻辑测试。纯逻辑与既有SendChain定向2 suites / 112 tests全部通过,其中既有104项特征测试保持。
|
||||
- 新增`docs/contracts/send-chain-r8-pure-logic.json`和`tools/quality/verify-send-chain-r8.mjs`。门禁逐项锁定24个契约与64个迁移声明的实现哈希,确认98个编排方法以及数据库事务、队列、补发和分片审计副作用仍在原服务;R0~R8全部结构门禁继续通过。
|
||||
- Node.js v24.16.0下API全量29 suites / 389 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、前端TypeScript和Vite v8.0.16生产构建、Gateway`go test ./... -count=1`与`go vet ./...`、依赖安全门禁和`git diff --check`全部通过。Jest只保留项目既有`--forceExit`开放句柄提示,Vite只保留既有约2.00MB单chunk提示。
|
||||
- 真实本地运行态只读核验:API health返回HTTP 200,PostgreSQL与Redis端口监听,Redis返回PONG;数据库现有56条短信记录、0条分片审计,因此真实分片聚合样本记为不适用,没有造数冒充通过。使用真实5条通道记录调用可发送性纯函数,当前2条active、0条满足本地连接可发送条件;未调用模块初始化、重连、状态同步或任何写路径。
|
||||
- R8没有修改数据库schema、migration、控制器路由、Redis Stream、Gateway、CMPP协议或业务规则,没有发送短信、触发补发/重投,也没有修改通道账号、密码、启停状态、余额或客户连接。号码频控/白名单、客户端体验、R0~R7及其他工作区修改继续完整保留,不归因于R8。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署;R9、R10再分别拆入口/提交和回执/补发/下游投递编排。
|
||||
|
||||
## 2026-07-31 R9 发送入口与提交编排拆分(本地未提交)
|
||||
|
||||
- 按路线图完成R9五类入口。`api/src/send-chain/send-chain.service.ts`从R8的4578行缩减为2983行,98个稳定方法继续供控制器、Open API、审核中心和其他模块调用;`send-submission.service.ts`为305行内部兼容门面。
|
||||
- 45个方法按批量/HTTP入口、CMPP入站、审核续发、定时调度和Gateway提交拆到五个实现文件,行数分别为552、840、109、160和491。没有把最初1939行的单一提交域文件作为终点,避免只移动大文件而不形成职责边界。
|
||||
- 迁移方法体保持原实现;内部跨方法调用返回`SendChainService`稳定门面,再经内部兼容门面分派,以保留既有覆盖点和测试可观察性。日志上下文继续是`SendChainService`,没有改变控制器路由、公开参数、响应或NestJS provider边界。
|
||||
- 新增`docs/contracts/send-chain-r9-submission.json`和`tools/quality/verify-send-chain-r9.mjs`。门禁锁定45个方法体哈希、五个领域归属、双层门面委托和Worker/事务/回调/Redis Stream副作用;确认Gateway结果、回执、补发、退款及下游投递仍留在R10边界。R0~R9全部结构门禁通过。
|
||||
- 第一次定向测试为97/112通过,15项失败均源于新域内部直接互调,导致既有测试替换稳定门面的`enqueueBatchTask`、调度、队列和限速方法时无法观察内部调用;改为跨方法调用统一返回稳定门面后,2 suites / 112 tests全部通过。该问题在本地门禁阶段发现,没有进入提交或部署。
|
||||
- Node.js v24.14.0下API全量29 suites / 389 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、前端TypeScript和Vite v8.0.16生产构建、Gateway`go test ./... -count=1`与`go vet ./...`、依赖安全门禁和`git diff --check`全部通过。Jest仅保留既有`--forceExit`提示,Vite仅保留既有约2.00MB单chunk提示。
|
||||
- 真实本地后端只读核验使用实际`SendChainService`、Prisma/PostgreSQL和现有任务:拆分后的任务查询成功;号码导入预检通过真实企业/全局黑名单查询,3行数据返回1条有效、2条错误。调用前后批量任务1条、短信56条、频控状态0条、账户流水3条完全不变。API health HTTP 200,PostgreSQL/Redis端口监听,Redis返回PONG。
|
||||
- R9没有调用创建任务、确认导入、HTTP/CMPP真实提交、审核动作、定时调度、Worker或Gateway发布,没有发送短信、触发补发/重投,也没有修改schema、migration、队列消息、通道、余额或客户连接。号码频控/白名单、客户端体验、R0~R8及其他工作区修改继续完整保留,不归因于R9。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署;R10再处理Gateway结果、分片回执、最终聚合、补发、退款和下游投递。
|
||||
|
||||
## 2026-07-31 R10 发送完成链编排拆分(本地未提交)
|
||||
|
||||
- 按路线图完成R10八项边界。`api/src/send-chain/send-chain.service.ts`从R9的2983行缩减为878行,98个稳定方法继续供控制器、Open API、Gateway事件和其他模块调用;`send-completion.service.ts`为323行内部兼容门面。
|
||||
- 41个方法按Gateway提交结果与分片提交审计、上游回执收件箱/分片回执/最终聚合、失败补发、扣费退款与预占释放、下游最终状态、CMPP/HTTP最终回执投递、回执超时扫描七个领域迁移,领域文件分别为390、593、359、142、510、489和104行。
|
||||
- 迁移方法体保持原实现;内部跨领域调用返回`SendChainService`稳定门面,再经完成链兼容门面分派,保留R9提交域依赖方向、既有测试替换点和调用可观察性。日志上下文继续使用`SendChainService`,NestJS模块仍只注册稳定门面。
|
||||
- 新增`docs/contracts/send-chain-r10-completion.json`和`tools/quality/verify-send-chain-r10.mjs`。门禁锁定41个方法体哈希、七个领域归属、双层门面委托和98个稳定方法,并检查来源提交唯一补发关系、P2002唯一冲突、当前尝试判定、分片聚合、账务幂等键、最终回执键、下游去重/ACK/人工重排键及历史记录不删除。为适配R10物理归属,R8门禁改为在全部`send-*.service.ts`实现中检查既有副作用不变量。
|
||||
- 第一次API TypeScript构建发现完成链门面包装方法可见性及迁移领域的少量显式导入缺失;补齐公开委托和`UplinkMatchCandidateInput`、超时/规范化辅助导入后正式构建通过。问题在本地编译门禁发现,没有进入提交或部署。
|
||||
- SendChain定向2 suites / 112 tests、API全量29 suites / 389 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、前端TypeScript和Vite v8.0.16生产构建、Gateway`go test ./... -count=1`与`go vet ./...`、依赖安全门禁、R0~R10全部结构门禁及`git diff --check`通过。Jest仅保留既有`--forceExit`提示,Vite仅保留既有约2.00MB单chunk与插件耗时提示。
|
||||
- 真实本地运行态只读核验:API `/api/health`返回正常,3000、5432、6379端口监听,Redis返回PONG。真实PostgreSQL查询前后均为提交记录61、分片审计0、回执53、下游投递2、下游attempt 0、上游回执收件箱0、Gateway提交死信0、账户流水3,最新提交、回执和下游投递路径均可读,前后计数完全一致。当前没有真实分片审计和下游attempt样本,因此对应数据态验证记为不适用,不造数冒充通过。
|
||||
- R10没有调用模块初始化、Gateway结果写入、回执入箱、补发抢占、扣费、退款、预占释放、最终回执创建、下游认领、ACK、人工重排或超时扫描,没有发送短信、重试、补发或重投,也没有修改数据库schema、migration、Redis Stream、CMPP协议、通道、余额或客户连接。号码频控/白名单、客户端体验、R0~R9和其他工作区修改继续完整保留,不归因于R10。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署。
|
||||
|
||||
## 2026-07-31 R11 通道管理页面与专属样式拆分(本地未提交)
|
||||
|
||||
- 按路线图“每次只迁移一个页面域”执行R11第一页面域,选择剩余最大页面`AdminChannelsPage.tsx`,从782行缩减为197行稳定协调层。类型、纯映射、表格、编辑弹窗、测试短信弹窗和连接日志弹窗拆入`src/apps/admin/channels/`,各TypeScript文件为51~153行。
|
||||
- 页面继续直接调用真实`adminApi`:列表分页、发送质量、连接状态、创建/编辑、启停、复制、连接日志和测试短信接口均保留;没有引入barrel、mock、静态数据或localStorage。React组件不在页面函数内部定义,查询和写操作仍由页面统一协调。
|
||||
- 将通道列表、质量指标、编辑表单、测试结果和连接日志的467行专属样式迁入`AdminChannelsPage.css`,`global.css`从12270行缩减为11800行;共享给通道组的`.channel-confirm`保留全局,375px下连接摘要规则随页面迁移。`main.tsx`的tokens/global/components加载顺序未变。
|
||||
- 新增`docs/contracts/admin-channels-r11.json`和`tools/quality/verify-admin-channels-r11.mjs`,门禁确认198行稳定入口、五个聚焦模块、全部真实API调用、八个交互入口和页面样式归属。第一次门禁用`.sms-channel-`宽前缀误匹配仍属通道组的`.sms-channel-group-*`,改为逐项页面选择器后通过;不是产品故障。
|
||||
- 前端TypeScript检查通过。本地应用内浏览器使用真实运营账号登录,真实API返回5条通道;按`Smoke`查询得到1条,重置恢复5条。编辑弹窗正常回填业务信息、单价、地区和CMPP参数,点击取消未保存;连接日志弹窗正常加载真实连接状态/日志并提供关键词筛选。
|
||||
- 默认桌面和375×812视口页面均非空、无框架错误覆盖,控制台无warning/error。桌面列表、筛选、质量指标和操作按钮布局正常;窄屏保持既有横向表格浏览方式。浏览器运行时截图通过Tab截图接口获取,未写入仓库。
|
||||
- 前端TypeScript和Vite v8.0.16生产构建通过,2468个模块完成转换;API全量29 suites / 389 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、Gateway`go test ./... -count=1`与`go vet ./...`、依赖安全门禁、R0~R11全部结构门禁及`git diff --check`通过。Vite仅保留既有约2.00MB单chunk提示,Jest使用项目既有的`--forceExit`验收口径并保留开放句柄提示。
|
||||
- 第一次并行Gateway全量测试中`TestInboundServerAuthenticatesAndSubmits`因模拟API服务提前关闭而失败;该用例单独重跑通过,随后Gateway全量及vet通过,未修改Gateway代码。两次直接执行未带`--forceExit`的API全量命令在测试完成后留下Jest进程并达到超时,确认并只终止本轮创建的两个全量Jest进程后,按既有`--forceExit`口径重跑,389项在21.381秒全部通过;未终止其他会话长期存在的定向Jest进程。
|
||||
- 验证没有点击编辑确认、添加确认、复制确认、启停确认、删除确认或测试短信最终发送,没有修改通道账号、密码、启停状态、连接或任何业务数据;没有发送短信。
|
||||
- 本轮按用户要求仅保留本地修改,不提交、不推送、不部署。其他剩余大页面及专属样式必须继续按独立小版本迁移,不在本次R11中批量处理。
|
||||
|
||||
## 2026-07-31 R11 短信任务进度页面与专属样式拆分(本地未提交)
|
||||
|
||||
- 按路线图“每次只迁移一个页面域”执行R11第二页面域。`AdminSmsTaskProgressPage.tsx`从657行缩减为163行稳定协调层,只保留真实任务查询、企业/应用筛选项加载、选中状态和终止操作;纯任务映射、筛选区、主表、详情弹窗、真实号码分页弹窗和终止确认拆入`src/apps/admin/sms-task-progress/`,各TypeScript文件为28~170行。
|
||||
- 页面继续直接使用真实`adminApi`:任务分页、企业与应用选项、批次号码分页和终止接口均保留;任务状态归一化、提交/成功/失败计数、计费条数、运营商/省份聚合、进度和成功率公式保持原实现。未引入barrel、mock、静态数据或localStorage,也未把组件定义嵌回页面函数。
|
||||
- 将详情标题、指标、任务详情、运营商卡片和移动端详情布局共273行页面专属样式迁入`AdminSmsTaskProgressPage.css`,`global.css`从11800行缩减为11527行。报备、下游记录等页面仍使用的`.admin-task-filter`、`.admin-task-table-card`、`.admin-task-id`、`.admin-task-enterprise`、`.admin-task-card`和`.batch-progress`保留全局。
|
||||
- 新增`docs/contracts/admin-sms-task-progress-r11.json`和`tools/quality/verify-admin-sms-task-progress-r11.mjs`,门禁确认164行文本入口、六个聚焦模块、全部真实API边界、十一项交互文案、专属/共享样式归属和375px详情布局。入口物理行数为163,门禁按末尾换行计为164,均低于220行上限。
|
||||
- 本地应用内浏览器使用已存在的真实运营账号会话,解锁后真实API返回1条客户批量任务`BT-1783075838138-a886dd56`。不存在批次号查询返回真实空列表,重置再查询恢复1条;详情展示2个号码、2条计费、中国移动2个和未识别省份2个;号码列表真实返回`13800138000`、`13900139000`,按`138`查询后返回1条。
|
||||
- 默认桌面详情弹窗和375×812窄屏列表均非空、无框架错误覆盖,控制台0条warning/error;手机端筛选区、查询/重置按钮和任务卡片正常显示。终止确认弹窗的风险提示正常,验收只点击取消,没有调用确认终止。
|
||||
- Node.js v24.14.0下前端TypeScript和Vite v8.0.16生产构建通过,2475个模块完成转换;API全量29 suites / 389 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、Gateway`go test ./... -count=1`与`go vet ./...`、依赖安全门禁、R0~R11全部结构门禁及`git diff --check`通过。Vite仅保留既有约2.00MB单chunk提示,Jest使用既有`--forceExit`口径并保留开放句柄提示。
|
||||
- 首次前端构建由系统旧Node.js v14.17.4执行,Vite因不支持`??=`语法产生未处理Promise警告但错误返回0;未将其计为通过,切换到Node.js v24.14.0后重新构建并看到实际产物。第一次并行回归中的系统npm 6不支持`npm exec`,Prisma子任务未启动;随后改用项目本地Prisma可执行文件完整补跑并通过,属于工具链编排问题,不是产品代码失败。
|
||||
- 本轮没有发送短信、创建或终止任务、触发补发/重投,也没有修改数据库、Redis Stream、Gateway、通道、余额或客户连接。R0~R11第一页面域、号码频控/白名单、运营看板和其他工作区修改继续完整保留,不归因于本步骤。
|
||||
- 按用户要求继续仅保留本地修改,不提交、不推送、不部署。R11当前完成2个页面域;其余页面和共享CSS域继续按独立小步骤推进。
|
||||
|
||||
## 2026-07-31 R11 短信记录页面与专属样式拆分(本地未提交)
|
||||
|
||||
- 按路线图“每次只迁移一个页面域”执行R11第三页面域。`AdminSmsRecordsPage.tsx`从640行缩减为195行稳定协调层,仅保留真实记录分页、企业/应用筛选项、分片审计、后端CSV导出和选中详情状态;时间/状态/运营商/路由映射、筛选区、记录卡片与分页、发送详情弹窗拆入`src/apps/admin/sms-records/`,各TypeScript文件为33~219行。
|
||||
- 五个真实`adminApi`调用保持:`listOperationMessages`、`listTenants`、`listEnterpriseApplicationOptions`、`listMessageSegmentAudits`和`exportOperationMessages`。默认昨日到今日、提交失败覆盖、平台失败回执说明、运营端测试说明、通道尝试排序、发送接入号拼接和分片审计排序均保持原实现;没有引入barrel、mock、静态列表或localStorage。
|
||||
- 将短信记录筛选、卡片、状态、详情、通道路由、分片审计和900px/780px响应式规则迁入433行`AdminSmsRecordsPage.css`,`global.css`从11527行缩减为11098行。多个运营页面共享的`.template-modal-title`、`.muted`和`.ui-table__empty`保留全局。
|
||||
- 新增`docs/contracts/admin-sms-records-r11.json`和`tools/quality/verify-admin-sms-records-r11.mjs`,门禁确认196行文本入口、四个聚焦模块、五个真实API边界、十五项交互文案、专属/共享样式归属和两级响应式规则。入口物理行数为195,门禁按末尾换行计196,低于220行上限。
|
||||
- 本地应用内浏览器访问真实运营端和本地API:默认2026-07-30至2026-07-31返回0条,清空日期后真实返回56条、3页。按手机号`13900000054`查询收窄为1条;运营商下拉保留全部、移动、联通、电信、未识别五项;翻到第2页后仍显示真实总数56和3页分页。
|
||||
- 真实详情`LOCAL-SIGSTAT-20260728-054`展示发送成功、accepted、delivered、上海/中国联通、发送接入号10690000、两次通道尝试和对应UNDELIV/DELIVRD回执;真实分片接口返回0条,页面明确显示“暂无分片审计”,未造数冒充覆盖。现有56条为本地数据库已存在的统计演示数据,本步骤没有执行演示数据脚本或写入任何记录。
|
||||
- 默认桌面列表/详情和375×812记录卡片均非空、无框架错误覆盖,控制台0条warning/error;窄屏企业应用、状态、时间、内容、号码、计费、通道和详情入口未重叠。浏览器运行时截图未写入仓库。
|
||||
- Node.js v24.14.0下前端TypeScript和Vite v8.0.16生产构建通过,2480个模块完成转换;API全量29 suites / 389 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、依赖安全门禁和R0~R11全部结构门禁通过。Vite仅保留既有约2.00MB单chunk提示,Jest使用既有`--forceExit`口径并保留开放句柄提示。
|
||||
- 第一次并行Gateway全量测试中`TestSubmitResponsePrecedesQueuedFailureReceipt`因等待模拟失败回执超时而失败,日志同时显示模拟API连接被提前关闭。本步骤未修改Gateway;该用例定向重跑通过,随后Gateway`go test ./... -count=1`与`go vet ./...`全量通过,按既有时序型测试波动记录而不掩盖。
|
||||
- 验收没有点击导出下载、发送、补发、重投或任何写操作,没有修改数据库、Redis Stream、Gateway、通道、余额或客户连接。R0~R11前两个页面域及其他工作区修改继续完整保留,不归因于本步骤。
|
||||
- 按用户要求继续仅保留本地修改,不提交、不推送、不部署。R11当前完成3个页面域;其余页面和共享CSS域继续按独立小步骤推进。
|
||||
|
||||
## 2026-07-31 R11 企业应用管理页面与专属样式拆分(本地未提交)
|
||||
|
||||
- 按路线图“每次只迁移一个页面域”执行R11第四页面域。`AdminEnterpriseApplicationsPage.tsx`从616行缩减为273行稳定协调层,仅保留真实应用分页、企业选项、查询草稿/已应用条件、生命周期操作、参数详情和弹窗选中状态;筛选区、主表、生命周期弹窗、CMPP/HTTP参数弹窗、连接详情及纯映射拆入`src/apps/admin/enterprise-applications/`,各TypeScript文件为50~164行。
|
||||
- 六类真实`adminApi`调用继续由页面协调:应用分页、企业列表、状态变更、停用影响预检、CMPP参数和HTTP参数。分页、查询后回第一页、重置、停用等待/强制模式、启用、删除、CMPP/HTTP能力禁用规则和参数加载时序保持原实现;没有引入barrel、mock、静态数据或localStorage。
|
||||
- 将企业应用筛选、连接状态、操作区、连接详情、参数详情、新增应用提示和响应式规则迁入222行`AdminEnterpriseApplicationsPage.css`,`global.css`从11098行缩减为10881行。共享筛选、确认文案、弹窗标题、堆叠和表单布局继续保留全局。
|
||||
- 窄屏视觉初检发现页面CSS后加载可能覆盖原全局780px筛选单列规则;在页面CSS显式恢复该规则并加入结构门禁。修正后375×812视口实测页面宽度375px、文档滚动宽度375px,筛选区单列、两个输入均未造成页面级横向溢出。这是拆分阶段发现并修复的样式加载顺序风险,未进入提交或部署。
|
||||
- 新增`docs/contracts/admin-enterprise-applications-r11.json`和`tools/quality/verify-admin-enterprise-applications-r11.mjs`,门禁确认274行文本入口、六个聚焦模块、六类真实API边界、十六项交互文案、专属/共享样式归属、查询状态分层以及780px、900px、520px响应式规则。R0~R11全部结构门禁和依赖安全门禁通过。
|
||||
- 本地应用内浏览器使用既有真实运营账号会话,真实应用分页返回2条。不存在企业名称查询显示真实空状态,重置恢复2条;新增应用弹窗由真实企业接口加载并保持未选择时“下一步”禁用,随后取消。
|
||||
- 对真实`Smoke SMS App`只读打开连接详情,显示当前连接0、配置连接1、离线及无已连接会话;CMPP参数通过真实详情接口成功打开后直接关闭,未读取、复制或记录敏感参数。停用影响预检返回2项未清算义务,弹窗展示等待/强制停用边界,验收只点击取消,没有调用状态变更。
|
||||
- 默认桌面与375×812窄屏页面均非空、无框架错误覆盖;桌面筛选、页签、真实表格和横向滚动正常,窄屏筛选单列及记录卡片正常。控制台0条warning/error,桌面和窄屏截图写入系统临时目录,未写入仓库。
|
||||
- Node.js v24环境下前端TypeScript和Vite v8.0.16生产构建通过,2487个模块完成转换;API全量29 suites / 389 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、Gateway`go test ./... -count=1`与`go vet ./...`、依赖安全门禁、R0~R11全部结构门禁和`git diff --check`通过。Vite仅保留既有约2.00MB单chunk提示,Jest使用既有`--forceExit`口径并保留开放句柄提示。
|
||||
- 本轮没有创建、编辑、启停或删除企业应用,没有复制接口参数、发送短信、触发补发/重投,也没有修改数据库业务数据、Redis Stream、Gateway、通道、余额或客户连接。R0~R11前三个页面域、号码频控/白名单和其他工作区修改继续完整保留,不归因于本步骤。
|
||||
- 按用户要求继续仅保留本地修改,不提交、不推送、不部署。R11当前完成4个页面域;剩余5个页面/共享CSS域步骤继续按独立小版本推进。
|
||||
|
||||
## 2026-07-31 R11 tokens与reset基础样式域拆分(本地未提交)
|
||||
|
||||
- 按既定9步计划执行R11第5步,范围严格限定为“tokens和reset”。现有97行`tokens.css`继续作为唯一设计令牌入口,76个颜色、排版、间距、形状、阴影、布局和组件基础变量未改名、未改值;新增84行`reset.css`,从`global.css`迁出13组通配符、文档、链接、表单控件、禁用态、焦点和标题基础规则。
|
||||
- `main.tsx`将基础样式依赖顺序固定为`tokens.css → reset.css → global.css → components.css → AppRoutes`。`global.css`从10881行缩减为10801行;AppShell、通用组件、admin/client共享域、响应式页面规则及单页面样式均未在本步骤迁移,避免一次改变多个级联边界。
|
||||
- 第一次生产产物位置检查发现,仅在`AppRoutes`之后书写四个CSS导入不足以约束打包依赖图,组件CSS会先于reset/global进入产物。将`AppRoutes`导入移到四层CSS之后并重建,最终产物关键位置为tokens 76、reset 1969、global 3030、components 33841、页面样式219684,确认实际拼接顺序与目标一致。该风险在本地门禁阶段发现并修复,没有进入提交或部署。
|
||||
- 新增`docs/contracts/foundation-styles-r11.json`和`tools/quality/verify-foundation-styles-r11.mjs`。门禁锁定76个令牌、13组reset/base规则逐规则声明哈希、reset选择器白名单、原`global.css`所有权清理和四层确定性加载顺序;R0~R11全部结构门禁及依赖安全门禁通过。
|
||||
- Node.js v24环境下前端TypeScript与Vite v8.0.16生产构建通过,2488个模块完成转换,产物CSS约237.03kB、gzip约34.91kB;只保留既有约2.00MB单chunk及一次插件耗时提示,没有新增CSS错误。
|
||||
- 本地应用内浏览器在最终依赖顺序调整后重新完整验收。使用真实运营会话打开企业应用管理页,真实API继续返回2条应用。页面URL和标题正确,非空且无框架错误覆盖;背景、14px基础字号、21px行高、字体族、链接无下划线、按钮/禁用态光标和输入继承字体的计算样式均符合原令牌。
|
||||
- 键盘聚焦输入控件时继续得到`rgba(37, 99, 235, 0.18) 0 0 0 3px`焦点环,浏览器默认outline保持关闭。新增应用弹窗正常打开,“下一步”在未选择企业时保持禁用,随后只点击取消,没有创建或修改应用。
|
||||
- 客户端登录页在未提交表单的情况下完成只读验收:Logo、标题、说明、账号、密码、图形验证码和登录按钮正常,未刷新验证码、未登录。运营端和客户端在默认桌面及375×812视口均无页面级横向溢出,控制台均为0条warning/error;四张截图写入系统临时目录,未写入仓库。
|
||||
- API全量29 suites / 389 tests全部通过;Prisma format/validate/generate、API TypeScript正式构建、Gateway`go test ./... -count=1`与`go vet ./...`、依赖安全门禁、R0~R11全部结构门禁和`git diff --check`通过。Jest使用既有`--forceExit`口径并保留开放句柄提示。
|
||||
- 本步骤没有修改React业务组件、API、数据库schema或migration,没有登录客户端、创建/编辑/启停/删除应用、发送短信、触发补发/重投,也没有修改Redis Stream、Gateway、通道、余额或客户连接。R0~R11前四步及其他工作区修改继续完整保留,不归因于本步骤。
|
||||
- 按用户要求继续仅保留本地修改,不提交、不推送、不部署。R11当前完成5/9;下一步为AppShell与通用布局基础域,剩余4步继续独立推进。
|
||||
|
||||
## 2026-07-31 R11 AppShell与通用布局基础域拆分(本地未提交)
|
||||
|
||||
- 按既定9步计划执行R11第6步,范围严格限定为`AppShell`和通用页面布局。新增811行`src/styles/shell.css`,从`global.css`迁出侧栏、折叠导航、顶栏、通知/用户菜单、移动端抽屉/遮罩、减少动画规则,以及`.page-content`、`.page-stack`、`.page-heading`、`.page-heading__actions`、`.page-actions`、`.surface`、`.section-stack`、`.section-heading`九组布局原语;`global.css`从10801行缩减为10001行。
|
||||
- `.icon-button`仍被企业应用表单和用户页面复用,继续保留`global.css`;`.ui-tabs__tab`及通用表格、表单、弹窗样式也未提前迁移。混合的`.page-actions, .table-actions`规则按选择器拆开但声明保持一致,没有修改React业务组件、选择器权重、业务文案、API或交互逻辑。
|
||||
- `main.tsx`加载顺序更新为`tokens.css → reset.css → shell.css → global.css → components.css → AppRoutes`。Node.js v24.14.0下Vite v8.1.5生产构建通过,2530个模块完成转换,产物CSS 237.11kB、gzip 34.75kB;tokens、reset、shell、global和components代表标记依次位于76、1971、3030、15675和36609,只保留既有约2.00MB单chunk及插件耗时提示。
|
||||
- 新增`docs/contracts/app-shell-styles-r11.json`和`tools/quality/verify-app-shell-styles-r11.mjs`,门禁锁定118组规则、44个当前/兼容壳层类、九组共享布局选择器、桌面折叠、781px边界、780px移动抽屉和减少动画规则。基础样式契约同步加入`shell.css`加载层;企业应用契约同步确认`.section-stack`改由`shell.css`托管。全部15个R0~R11结构/行为门禁和依赖安全门禁通过。
|
||||
- Prisma format、validate、generate和API TypeScript正式构建通过;API全量29 suites / 389 tests全部通过。默认Jest命令在断言结束后因既有开放句柄未退出,本次终止的仅为本轮15:44创建的npm/Jest进程,未触碰2026-07-30遗留的其他会话进程;随后按既有`--forceExit`口径获得全量通过并保留开放句柄提示。Gateway`go test ./... -count=1`与`go vet ./...`通过。
|
||||
- 本地前端`http://127.0.0.1:4173/`和API`/api/health`均HTTP 200。应用内浏览器访问企业应用页时恢复运营会话返回`Internal server error`并跳转登录页,Chrome也没有已登录运营端标签;遵守验证码边界,没有填写或提交登录表单、读取/伪造浏览器存储。因此桌面展开/折叠、通知/用户菜单和375×812移动抽屉的真实点击验收本轮受阻,需在可用登录态下补测,不能写成已通过。
|
||||
- 本步骤没有创建、编辑、启停或删除业务数据,没有发送短信、触发补发/重投,也没有修改数据库业务数据、Redis Stream、Gateway、通道、余额或客户连接。R0~R11前五步、号码频控/白名单和其他工作区修改继续完整保留,不归因于本步骤。
|
||||
- 按用户要求继续仅保留本地修改,不提交、不推送、不部署。R11第6步代码与文档完成,当前实施进度6/9;下一步为通用表格、表单和弹窗域,真实AppShell点击验收仍列为待补风险。
|
||||
|
||||
## 2026-07-31 运营端恢复会话500诊断与R11通用组件样式域拆分(本地未提交)
|
||||
|
||||
- 恢复运营会话500已按真实基础设施链路定位。无cookie直接访问API与Vite代理的`/api/admin/auth/session`均正常返回401,验证码接口返回200;Redis返回PONG且存在有效运营会话,但当时本地PostgreSQL 5432未监听。有效会话通过Redis校验后执行`prisma.user.findUnique`,真实Prisma请求以`ECONNREFUSED`失败,Nest因而返回500;`/api/health`仍为200是因为当前health未执行数据库查询。根因是本地PostgreSQL停止/崩溃而API、Redis仍运行,不是前端恢复会话或R11拆分逻辑缺陷。
|
||||
- `logs/postgres.log`记录此前进程以Windows异常`0xC0000142`终止,随后完成自动恢复。使用`tools/start-local.ps1 -SkipMigrate -SkipApi -SkipWeb`仅恢复本地PostgreSQL、Redis和MinIO,没有执行migration,也没有重启API或前端;启动脚本遗留的等待进程已精确停止,基础服务继续运行。恢复后5432、6379、9000、9001、3000、4173均监听,真实Prisma查询返回`codex_local_admin`及其active/sessionVersion/角色数据,API health返回200,无cookie会话接口返回401。
|
||||
- 按既定9步计划执行R11第7步,范围严格限定为“通用表格、表单和弹窗”。从`global.css`迁出52组规则、57个选择器,包括通用`.ui-table*`、`.ui-modal*`、`.form-grid*`、`.radio-row`、`.table-actions`、表格文本辅助类、`.icon-button`、`.ui-tabs__tab`、XL弹窗及780px移动端规则;`global.css`从10001行缩减为9660行,`components.css`从1333行增加为1694行。页面域复合选择器继续留在原层,没有修改React业务组件、API、文案、数据口径或写操作。
|
||||
- 为保持原级联结果,迁入的旧兼容规则位于现有规范组件规则之前,响应式规则位于对应桌面规则之后;`main.tsx`的`tokens → reset → shell → global → components → AppRoutes`顺序不变。新增`docs/contracts/shared-components-r11.json`和`tools/quality/verify-shared-components-r11.mjs`,锁定259组规则、291个选择器、14组通用类族、桌面/780px所有权和五类真实UI组件绑定;短信记录及企业应用旧契约同步更新为components所有权。全部15个R0~R11结构门禁通过。
|
||||
- Node.js v24.14.0下前端TypeScript和Vite v8.1.5生产构建通过,2530个模块完成转换,CSS 237.11kB(gzip 34.70kB)、JS 2003.23kB(gzip 596.71kB),仅保留既有大chunk提示。Prisma format/validate/generate、API TypeScript正式构建、29 suites / 389 tests、Gateway`go test ./... -count=1`与`go vet ./...`、依赖安全门禁均通过;Jest继续使用既有`--forceExit`口径并保留开放句柄提示。
|
||||
- 应用内浏览器确认数据库恢复后访问企业应用页不再显示`Internal server error`,而是正常跳转运营端登录页并提示“请先登录”,控制台无warning/error;Edge没有已登录运营端标签。遵守验证码边界,没有自动求解验证码、读取浏览器存储、伪造cookie或绕过登录。因此第6步AppShell交互及第7步登录后桌面/375px表格、表单、弹窗点击验收仍待可用登录态补做,不能表述为已通过。
|
||||
- 本步骤没有创建、编辑、启停或删除业务数据,没有发送短信、触发补发/重投,也没有修改数据库业务数据、Redis Stream、Gateway、通道、余额或客户连接。R0~R11前六步、号码频控/白名单和其他工作区修改继续完整保留,不归因于本步骤。
|
||||
- 按用户要求继续仅保留本地修改,不提交、不推送、不部署。R11当前完成7/9;下一步为admin共享样式域,client共享域和单页面样式继续独立推进。
|
||||
|
||||
## 2026-07-31 R11 admin共享样式域拆分(本地未提交)
|
||||
|
||||
- 按既定9步计划执行R11第8步,范围严格限定为运营端跨页面共享样式。以“至少被两个`src/apps/admin`源码文件复用、且`src/apps/client`不依赖”为主要判定,再按同一共享模式补齐变体和响应式规则;没有迁移client域或业务逻辑。
|
||||
- 新增678行`src/styles/admin.css`,从`global.css`迁出117组规则、141个选择器,覆盖审核筛选、任务/报备记录、安全页、系统管理、质量/利润/对账筛选、跨页面确认与表单提示、下游明细和通道字段配置等运营端共享模式;`global.css`从9660行缩减为9056行。
|
||||
- `.report-task-detail .admin-task-card`和`.gateway-exception-page .report-task-table-card > .ui-pagination`两个带单页面上下文的覆盖规则继续留在`global.css`,没有因类名命中而误迁。`ui-*`只作为admin所有者的后代上下文,客户端源码不引用admin所有权类。
|
||||
- `main.tsx`加载顺序更新为`tokens → reset → shell → global → admin → components → AppRoutes`。前端TypeScript和Vite v8.1.5生产构建通过,2531个模块完成转换,CSS 237.70kB(gzip 34.79kB)、JS 2003.23kB(gzip 596.71kB),仅保留既有大chunk提示。
|
||||
- 新增`docs/contracts/admin-shared-styles-r11.json`和`tools/quality/verify-admin-shared-styles-r11.mjs`,门禁锁定117组规则、141个选择器、11项跨页面使用下限、admin/client所有权、纯共享规则不得残留global以及780px/360px响应式边界;通道、企业应用、短信任务进度和foundation旧契约同步到新的样式归属与加载顺序。
|
||||
- Prisma format/validate/generate、API TypeScript正式构建、29 suites / 389 tests、Gateway`go test ./... -count=1`与`go vet ./...`、依赖安全门禁、全部17个R0~R11结构门禁和`git diff --check`通过。Jest继续使用既有`--forceExit`口径并保留开放句柄提示。
|
||||
- 应用内浏览器访问真实本地运营端短信审核路由时,因无可复用运营端登录态正常跳转登录页;未求解验证码或伪造会话。运行时生产CSS已包含`.admin-task-filter`和`.admin-report-filter-grid`规则,页面宽度与1280px视口一致,控制台0条warning/error。登录后的审核、任务、安全、系统及统计代表页面与375px交互验收仍待有效登录态补做,不能表述为已通过。
|
||||
- 本步骤没有修改React业务组件、API、数据库schema或migration,没有创建、编辑、启停、删除、导入或导出业务数据,没有发送短信、触发补发/重投,也没有修改Redis Stream、Gateway、通道、余额或客户连接。R0~R11前七步、号码频控/白名单和其他工作区修改继续完整保留,不归因于本步骤。
|
||||
- 按用户要求继续仅保留本地修改,不提交、不推送、不部署。R11当前完成8/9;下一步为client共享样式域,单页面覆盖规则继续保留原所有权。
|
||||
|
||||
## 2026-07-31 R11 client共享样式域拆分(本地未提交)
|
||||
|
||||
- 按既定9步计划执行R11第9步,范围严格限定为client跨页面共享样式。静态引用盘点覆盖`global.css`和全部admin/client TypeScript源码;真正满足“至少两个client文件使用且admin完全不依赖”的全局类只有`.eyebrow`,由`ClientHome.tsx`和`ClientBillingPage.tsx`使用。
|
||||
- 新增8行`src/styles/client.css`并迁移`.eyebrow`一组规则,`global.css`从9056行缩减为9049行。客户端首页专属的`.overview-hero .eyebrow`覆盖继续留在global,没有把单页面上下文误判为共享。
|
||||
- `.sms-send-title`、`.system-page-toolbar`和`.system-table-card`虽然分别被9、3、2个客户端文件使用,但运营端系统日志页也真实依赖,因此继续作为跨门户兼容样式留在global。签名、发送、企业认证、发送详情和模板等代表性单页面样式也继续保留原所有权,没有为扩大改动而批量迁移。
|
||||
- `main.tsx`最终加载顺序为`tokens → reset → shell → global → admin → client → components → AppRoutes`。新增`docs/contracts/client-shared-styles-r11.json`和`tools/quality/verify-client-shared-styles-r11.mjs`,锁定唯一client所有权规则、两页面使用下限、三组跨门户兼容边界和五类单页面保留边界;foundation契约同步加入client层。
|
||||
- Node.js v24.14.0下前端TypeScript和Vite v8.1.5生产构建通过,2532个模块完成转换,CSS 237.70kB(gzip 34.79kB)、JS 2003.23kB(gzip 596.71kB),与第8步产物体积一致,仅保留既有大chunk提示。全部18个R0~R11结构门禁通过。
|
||||
- Prisma format/validate/generate、API TypeScript正式构建、29 suites / 389 tests、Gateway`go test ./... -count=1`与`go vet ./...`、依赖安全门禁和`git diff --check`全部通过。Jest继续使用既有`--forceExit`口径并保留开放句柄提示。
|
||||
- 应用内浏览器访问真实本地客户端首页路由时,因无可复用客户端登录态正常跳转登录页;未求解验证码或伪造会话。运行时生产CSS确认纯`.eyebrow`、`.overview-hero .eyebrow`页面覆盖及`.sms-send-title`跨门户规则均存在,默认1280px和375×812视口均无页面级横向溢出,控制台0条warning/error。登录后的首页、账单和代表单页面验收仍待有效登录态补做,不能表述为已通过。
|
||||
- 本步骤没有修改React业务组件、API、数据库schema或migration,没有创建、编辑、删除或导出业务数据,没有发送短信、触发补发/重投,也没有修改Redis Stream、Gateway、通道、余额或客户连接。R0~R11前八步、号码频控/白名单和其他工作区修改继续完整保留,不归因于本步骤。
|
||||
- 按用户要求继续仅保留本地修改,不提交、不推送、不部署。R11既定九步当前完成9/9;这表示本轮计划范围完成,不代表剩余单页面CSS已被一次性清空,后续应另立小版本继续。
|
||||
|
||||
## 2026-07-31 工作区业务功能与R0-R11汇总提交门禁
|
||||
|
||||
- 用户已明确授权提交并推送当前工作区全部有效代码,但不部署。提交范围包括号码频次风控和平台级白名单、运营看板与短信记录改进、客户端发送体验、R0-R11渐进式拆分、两条新migration、结构契约、测试脚本、需求/测试/进度文档以及后续`global.css`拆分计划。
|
||||
- 提交前重新执行`git fetch --prune`,本地分支为`main`,`HEAD`与`origin/main`均为`0af671b4ed4713912e703defd08791f164d4eb25`,没有远端分叉。工作区未发现相较前次停止时新增的未知业务修改。
|
||||
- 使用Node.js v24.14.0执行Prisma format、validate、generate和migrate status;本地PostgreSQL仅恢复服务用于只读状态检查,没有执行migration或写入业务数据。源码目录共78条migration,本地数据库schema up to date。
|
||||
- API全量测试首次因本地Redis未运行出现1 suite/3项队列等待超时;启动本地Redis并确认`PONG`后,原命令复跑为29 suites / 389 tests全部通过。没有修改或放宽测试来绕过失败,Jest继续使用既有`--forceExit`口径。
|
||||
- API TypeScript正式构建、前端TypeScript与Vite生产构建通过;前端2532个模块完成转换,CSS 237.70kB(gzip 34.79kB)、JS 2003.23kB(gzip 596.71kB),仅保留既有大chunk提示。
|
||||
- 19个Node结构门禁以及R6/R7两个Go结构门禁全部通过;Gateway`go test ./... -count=1`、`go vet ./...`、依赖缓解安全门禁和Git差异检查通过。
|
||||
- `api/tsconfig.build.tsbuildinfo`、根目录`tsconfig.tsbuildinfo`、`outputs/`和空文件`=`继续作为构建缓存或临时产物保留在本地,不纳入提交、不删除、不错误归因。未发送、重投或补发真实短信,未修改真实通道账号、密码、启停状态、企业余额或客户连接,本轮明确不部署。
|
||||
|
||||
Reference in New Issue
Block a user