fix: harden real backend admin workflows and ui

This commit is contained in:
hectorzhao
2026-07-03 19:29:56 +08:00
parent dd09d91c1e
commit 8cca361441
71 changed files with 5111 additions and 4439 deletions
+201
View File
@@ -0,0 +1,201 @@
# 运营端企业配置原型恢复范围
## 背景
本次排查定位到页面与原型出现明显差异的关键提交为:
- 提交:`131f344ac4da5e3b610e4fd32596d4546a1cf9de`
- 时间:`2026-07-02 19:30:04 +0800`
- 标题:`fix: connect remaining sms pages to real backend`
该提交的目标是把剩余短信页面从 mock/localStorage 接到真实后端,但执行方式把部分原型页面重写为最小真实 API 表格/表单,导致原型字段、弹窗、Tab、引流信息和新增/编辑动作大量丢失。
后续修复原则:
1.`131f344a^` 中的原型页面结构和字段命名为视觉与交互基准。
2. 保留当前真实 API 接入方向,不回退到 mock/localStorage/static 数组。
3. 前端缺入口时恢复入口;后端缺字段或接口时补 NestJS API 与 Prisma 模型/服务。
4. 彩信能力仍按第一版待开发边界处理;短信能力不得用彩信待开发作为阻塞理由。
## 差异清单
### 企业管理:列表、新增、编辑、详情
相关文件:
- `src/apps/admin/AdminCustomersPage.tsx`
- `src/apps/admin/AdminCustomerFormPage.tsx`
- `src/apps/admin/AdminCustomerDetailPage.tsx`
- `api/src/tenants/tenants.service.ts`
状态:阶段 4-1 已修复。
原型能力:
- 企业照片上传占位。
- 统一社会信用代码。
- 省/直辖市、市/区。
- 通讯地址。
- 联系人姓名。
- 联系人身份证号。
- 联系人手机号。
- 企业主体、证照、地址、联系人分区。
- 本地原型通过 `adminEnterpriseMock` 保存完整企业档案。
当前实现:
- 表单只保留 `企业名称``企业编码``企业状态`
- 保存只写 `Tenant.name``Tenant.code``Tenant.status`
- 企业档案、证照、地址和联系人信息没有真实保存入口。
- 删除是软删除 `status=deleted`,但不存在或过期 ID 会由 Prisma update 抛 500。
需要恢复/补齐:
- 已恢复企业表单的主体、证照地址、联系人区块和主要字段。
- 已复用 `EnterpriseCertification` 保存真实企业档案,并在租户接口返回 `enterpriseProfile`
- 已修复企业删除/更新/状态变更的不存在 ID 处理,返回 404,不再由 Prisma update 抛 500。
- 已在企业列表和详情展示真实企业档案字段。
### 企业应用管理
相关文件:
- `src/apps/admin/AdminEnterpriseApplicationsPage.tsx`
- `src/apps/admin/AdminSmsApplicationFormPage.tsx`
- `src/api/adminApi.ts`
- `api/src/sms-config/admin-sms-config.controller.ts`
- `api/src/sms-config/client-sms-config.controller.ts`
- `api/src/sms-config/sms-config.service.ts`
状态:阶段 4-2 已修复短信应用新增/编辑闭环;彩信仍为待开发边界。
原型/预期能力:
- 运营端企业应用页可新增、编辑、启用/停用、删除应用。
- 新增/编辑必须作用于真实企业。
- 短信应用保存时可配置移动、联通、电信通道组。
- 彩信应用 Tab 是待开发边界,不计入短信验收。
当前实现:
- 短信应用列表接了真实 `GET /api/admin/enterprise-applications`
- 新增时先选择真实企业,再进入 `/admin/customers/{tenantId}/sms-apps/new`
- 编辑入口使用应用自身 `tenantId`,不再硬编码企业 ID。
- 运营端已补 `GET/POST/PUT /api/admin/enterprise-applications`
- 编辑表单会加载真实应用详情和已有三网路由规则。
- 保存时调用 `PUT /api/admin/enterprise-applications/{id}/route-rules` 事务替换应用级运营商通道组绑定。
- 彩信 Tab 只显示待开发空态,不再渲染 `initialMmsApps` 演示数组。
需要恢复/补齐:
- 已删除企业应用页硬编码企业 ID。
- 已实现企业应用页新增选择真实企业。
- 已补运营端应用创建/编辑 API。
- 已实现编辑页加载真实应用详情并可保存。
- 已强制短信应用保存时至少配置一个运营商通道组。
- 已校验应用路由 carrier 与通道组 carrier 一致。
- 彩信 Tab 标记为待开发,不得作为短信功能验收项。
### 企业签名与引流信息
相关文件:
- `src/apps/admin/AdminEnterpriseSignaturesPage.tsx`
- `src/api/adminApi.ts`
- `api/src/sms-config/admin-sms-config.controller.ts`
- `api/src/sms-config/client-sms-config.controller.ts`
- `api/src/sms-config/sms-config.service.ts`
- `api/prisma/schema.prisma`
状态:阶段 4-3 已修复短信签名和引流信息新增/编辑/删除闭环;彩信签名仍为待开发边界。
原型能力:
- 短信/彩信签名 Tab。
- 添加签名、编辑签名、删除签名。
- 资质凭证、法人身份证、责任人身份证上传占位。
- 三网报备状态:移动、联通、电信。
- 签名报备详情。
- 引流信息列表。
- 添加/编辑/删除引流链接。
- 引流信息报备详情。
当前实现:
- 运营端签名页恢复短信/彩信 Tab,其中彩信签名显示待开发空态,不展示演示数据。
- 短信签名列表使用真实 `GET /api/admin/enterprise-signatures`,返回企业、应用、材料和 `drainageInfo`
- 已补运营端 `POST /api/admin/enterprise-signatures``PUT /api/admin/enterprise-signatures/{id}`
- 添加/编辑签名可选择真实企业和应用,三网报备状态保存到 `SmsSignature.drainageInfo.carrierStatus`
- 引流信息列表、添加、编辑、删除保存到 `SmsSignature.drainageInfo.links`
- 删除签名调用真实状态变更接口写 `auditStatus=deleted`,列表默认排除 deleted。
需要恢复/补齐:
- 已恢复短信签名的卡片列表、报备详情和引流信息区块。
- 已补运营端代企业新增/编辑签名 API。
- 已提供企业选择、应用选择、用途和三网状态真实保存。
- 已将引流信息真实保存到 `drainageInfo`,不再使用本地数组。
- 彩信签名能力继续标记待开发。
### 企业模板
相关文件:
- `src/apps/admin/AdminEnterpriseTemplatesPage.tsx`
- `src/api/adminApi.ts`
- `api/src/sms-config/admin-sms-config.controller.ts`
- `api/src/sms-config/client-sms-config.controller.ts`
- `api/src/sms-config/sms-config.service.ts`
- `api/prisma/schema.prisma`
状态:阶段 4-4 已修复短信模板新增/编辑/删除和变量真实保存闭环;彩信模板仍为待开发边界。
原型能力:
- 短信/彩信模板 Tab。
- 添加模板、编辑模板、删除模板。
- 应用选择。
- 签名选择。
- 模板内容编辑。
- 推荐变量与自定义变量。
- 自动提取变量。
- 字数与计费条数提示。
- 彩信模板多帧编辑和预览。
当前实现:
- 运营端模板页恢复短信/彩信 Tab,其中彩信模板显示待开发空态,不展示演示数据。
- 短信模板列表使用真实 `GET /api/admin/enterprise-templates`,返回企业、应用、签名和变量。
- 已补运营端 `POST /api/admin/enterprise-templates``PUT /api/admin/enterprise-templates/{id}`
- 添加/编辑模板可选择真实企业、应用、签名,模板内容和分类写入真实 `SmsTemplate`
- 变量从 `${name}` 语法自动提取,也支持推荐变量和自定义变量插入,保存时写入真实 `TemplateVariable`
- 编辑模板时后端事务删除旧变量并重建新变量。
- 删除模板调用真实状态变更接口写 `auditStatus=deleted`,列表默认排除 deleted。
需要恢复/补齐:
- 已恢复短信模板新增/编辑弹窗和变量交互。
- 已补运营端代企业新增/编辑模板 API。
- 应用和签名下拉来自真实 API,并按企业过滤。
- 变量已写入真实 `TemplateVariable`,不能只在前端展示。
- 彩信模板能力继续标记待开发。
## 后续执行顺序
1. 修企业删除接口健壮性。
2. 恢复企业管理原型表单,并补真实企业档案保存。
3. 修企业应用新增/编辑,移除硬编码 `2763`。(阶段 4-2 已完成)
4. 恢复企业签名与引流信息,并补真实保存接口。(阶段 4-3 已完成)
5. 恢复企业模板新增/编辑,并补变量真实保存。(阶段 4-4 已完成)
6. 补 API 单测和真实环境 smoke。
7.`npm --prefix api test``npm --prefix api run build``npm run build`
## 验收口径
页面验收时需要同时满足:
- 页面结构、字段、按钮和弹窗接近 `131f344a^` 的原型。
- 所有非彩信短信能力调用真实 API。
- 清空业务数据后,页面应为空态或可从 0 创建数据,不出现原型残留记录。
- 不存在硬编码企业 ID、`initial*` 短信业务数组、mock/localStorage 业务兜底。
- API 失败时展示错误态,不静默回退到假数据。
+405
View File
@@ -0,0 +1,405 @@
# 全菜单与弹窗真实后端审计
## 审计范围
本次范围扩大到客户端、运营端所有已挂路由页面,以及页面中的新增、编辑、删除、提交、导入、上传、详情、预览等主要弹窗/动作。
审计依据:
- `src/routes/AppRoutes.tsx`
- `src/apps/admin/*.tsx`
- `src/apps/client/*.tsx`
- `src/api/adminApi.ts`
- `docs/first-version-development-requirements.md`
- `docs/testing-plan.md`
- `docs/admin-prototype-recovery-scope.md`
审计口径:
1. 第一版短信功能必须走真实 NestJS API + Prisma/PostgreSQL。
2. mock/localStorage/static 数组不能作为系统功能验收通过依据。
3. API 失败只能展示错误态或空态,不能静默回退假数据。
4. 彩信能力当前是待开发边界,但如果菜单仍可进入,需要明确标记或从第一版验收菜单中移除。
## P0:短信第一版必须修复
### 客户端短信应用列表仍是静态数据
文件:`src/apps/client/ClientApplicationsPage.tsx`
状态:已修复。
问题:
- 旧实现没有调用 `clientApi.listApplications()`
- 旧实现的 `applications` 是前端静态数组。
- 旧实现的“接口参数”弹窗展示假企业代码、账号、密码、网关 IP、端口、接入号、绑定 IP。
影响:
- 清空业务数据后页面仍会显示假应用。
- 客户端看到的 CMPP 对接参数不可信。
已完成修复:
- 页面接入真实 `GET /api/client/applications`
- 新增 `GET /api/client/applications/{id}/cmpp-params`,参数弹窗按当前租户读取真实参数。
- 服务层按 `tenantId` 校验应用归属,跨租户应用不可见。
- 空库时显示空态,不再渲染假应用。
### 客户端企业认证是纯前端状态机
文件:`src/apps/client/ClientEnterpriseAuthPage.tsx`
问题:
- 页面没有 API 调用。
- 企业信息、认证状态、提交时间、法人信息、二维码、人脸/打款认证结果全是前端状态。
- 点击提交只改本地 `status``step`
影响:
- 客户端提交企业认证后,运营端无法看到真实待审记录。
- 发送前认证校验依赖真实 `Tenant.certificationStatus`,该页面不会改变真实状态。
修复:
- 接入企业认证查询、提交、重新提交接口。
- 上传营业执照/材料必须走真实文件对象和对象存储。
- 提交后写 `EnterpriseCertification`,运营端审核后同步 `Tenant.certificationStatus`
### 客户端短信发送详情仍是静态表
文件:`src/apps/client/ClientSendDetailPage.tsx`
状态:已修复。
问题:
- `sendDetailRows` 是静态数组。
- 查询条件只过滤本地数组。
- 发送记录、回执状态、运营商、省份均不是数据库记录。
影响:
- 发送链路真实跑通后,客户端详情页看不到真实短信。
- 清空数据后仍会显示假记录。
修复:
- 已接入 `GET /api/client/operations/messages`
- 查询按当前租户隔离,支持应用、手机号、状态过滤。
- 页面展示真实 `SmsMessageRecord`、回执记录、通道运营商和发送地区;空库时显示空态。
### 客户端短信上行记录仍是静态表
文件:`src/apps/client/ClientUplinkMessagesPage.tsx`
状态:已修复。
问题:
- `uplinkMessages``matchedSendRecords` 是静态数组。
- “添加到应用黑名单”按钮没有 API 动作。
影响:
- Gateway/真实 API 写入的上行短信无法在客户端展示。
- 上行匹配下发记录的业务闭环不存在。
修复:
- 已接入 `GET /api/client/operations/uplink-messages`
- 详情弹窗按上行 `messageId` 查询 `GET /api/client/operations/messages`,展示真实匹配的下发记录。
- 原无 API 支撑的“添加到应用黑名单”按钮已移除,后续补真实企业黑名单或应用黑名单 API 后再恢复。
### 运营端短信上行记录仍是静态表
文件:`src/apps/admin/AdminSmsUplinkRecordsPage.tsx`
状态:已修复。
问题:
- `uplinkMessages``matchedRecord` 是静态数组。
- 查询、详情、匹配下发记录均在前端完成。
- “添加到应用黑名单”按钮没有 API 动作。
影响:
- 运营端看不到真实上行记录。
- 上行匹配和人工处理无法验收。
修复:
- 已接入 `GET /api/admin/operations/uplink-messages`,返回真实上行记录、企业和通道信息。
- 详情弹窗按上行 `messageId` 查询 `GET /api/admin/operations/messages`,展示真实匹配的下发记录。
- 原无 API 支撑的“添加到应用黑名单”按钮已移除,后续补真实企业黑名单或应用黑名单 API 后再恢复。
### 运营端短信任务进度仍是静态任务
文件:`src/apps/admin/AdminSmsTaskProgressPage.tsx`
状态:已修复。
问题:
- `taskData` 是静态数组。
- 运营商统计、城市统计、任务详情均来自前端。
- 终止任务只更新本地状态。
影响:
- 真实批量任务、发送进度、分运营商/地区统计无法验收。
修复:
- 已接入 `GET /api/admin/send/batch-tasks`,任务列表和详情均来自真实 `SmsBatchTask` 与关联短信记录。
- 详情弹窗使用真实短信记录聚合通道运营商与发送地区分布;当前数据库未持久化号码归属城市,因此不再展示静态城市分布。
- 已新增 `POST /api/admin/send/batch-tasks/{id}/terminate`,运营终止只取消未提交的 queued/scheduled/ready 消息,已提交部分继续等待回执。
### 运营端通道组表单没有真实保存
文件:`src/apps/admin/AdminChannelGroupFormPage.tsx`
状态:已修复。
问题:
- `channelOptions``defaultProvinceRoutes``defaultNationalRoutes` 是静态数据。
- 新增/编辑省网、全国通道只改本地 state。
- 底部“确认”只 `navigate('/admin/channel-groups')`,没有调用 API。
- 与当前重要规则冲突:省份通道选择、全国优先级唯一、通道组 item carrier、通道 sendRegion 校验都无法在该页面落库。
影响:
- 页面看似可配置通道组,但实际不会保存到真实通道组 item。
- 从 0 测试时无法通过该表单配置发送路由。
修复:
- 已接入真实通道列表和通道组列表,编辑时加载真实通道组 items。
- 已新增 `PUT /api/admin/channel-groups/{id}`,保存时事务更新通道组并重建省网/全国 items。
- 后端校验省份唯一、全国优先级唯一、通道不重复、item carrier 与通道组 carrier 一致、省网通道地区一致。
### 运营端企业管理专项缺口已阶段性关闭
文件:
- `docs/admin-prototype-recovery-scope.md`
- `src/apps/admin/AdminCustomerFormPage.tsx`
- `src/apps/admin/AdminEnterpriseApplicationsPage.tsx`
- `src/apps/admin/AdminSmsApplicationFormPage.tsx`
- `src/apps/admin/AdminEnterpriseSignaturesPage.tsx`
- `src/apps/admin/AdminEnterpriseTemplatesPage.tsx`
问题摘要:
- 企业表单曾从原型完整档案瘦身为租户三字段,阶段 4-1 已恢复真实档案保存。
- 企业删除不存在/过期 ID 曾返回 500,阶段 4-1 已修复为 404。
- 企业应用新增/编辑曾硬编码 `2763`,阶段 4-2 已改为真实企业选择和应用自身 `tenantId`
- 短信应用编辑接口曾待补,阶段 4-2 已补运营端 `GET/POST/PUT /api/admin/enterprise-applications` 和应用路由替换接口。
- 彩信应用当前明确标记待开发,不展示演示数组。
- 企业签名与引流信息曾只剩只读列表,阶段 4-3 已恢复短信签名新增/编辑/删除和引流信息维护,真实保存到 `SmsSignature.drainageInfo`
- 企业模板曾只剩只读列表,阶段 4-4 已恢复短信模板新增/编辑/删除和变量维护,真实保存到 `SmsTemplate``TemplateVariable`
- 彩信应用、彩信签名、彩信模板当前明确标记待开发,不展示演示数组。
修复:
- 企业管理、企业应用、企业签名与引流信息、企业模板已按 `docs/admin-prototype-recovery-scope.md` 阶段 4-1 至 4-4 修复。
- 后续继续按审计清单处理其他 P0/P1 页面。
### 运营端短信通道编辑接口待补
文件:`src/apps/admin/AdminChannelsPage.tsx`
状态:阶段 5 已修复。
问题:
- 创建、复制、启停、删除、链接日志已经接真实 API。
- 旧实现编辑通道时直接提示“短信通道编辑接口待补,当前不做本地模拟保存”。
影响:
- 旧实现中通道创建后无法真实编辑网关、账号、接入号、地区、运营商等关键配置。
修复:
- 已补 `PUT /api/admin/channels/:id`
- 编辑弹窗提交真实更新,密码留空时不覆盖原密码,填写时更新 `passwordCipher`
- 后端继续校验 `gatewayPort` 范围,并写 `sms_channel.update` 操作日志。
- 已补通道更新单元测试,并重新通过通道定向测试、API 全量测试、前后端构建。
## P1:真实接口已接入但能力不完整
### 客户端短信发送导入表格只是展示入口
文件:`src/apps/client/ClientSendPage.tsx`
状态:阶段 6 已修复 CSV/TSV/TXT 文本导入真实预览和确认发送;XLSX 二进制解析后续单列能力补齐。
问题:
- 手动输入号码可调用真实 `clientApi.createBatchTask()`
- 旧实现“导入表格”明确写着“当前原型仅展示上传入口”。
- 旧实现没有真实文件解析、预览、确认导入。
修复:
- 已接入真实 `POST /api/client/send/imports/preview``POST /api/client/send/imports/confirm`
- 客户端读取 CSV/TSV/TXT 文件文本后交由后端预览,后端校验手机号格式、重复号码、黑名单和模板变量列。
- 页面展示总行数、有效号码、错误行和前 5 条错误明细。
- 确认发送走真实导入确认接口,并复用批量任务创建链路。
- 当前后端接口是文本解析,XLSX 二进制解析未标记完成,后续如验收 XLSX 需补解析库和对应测试。
### 客户端签名材料只记录文件元数据
文件:`src/apps/client/ClientSignaturesPage.tsx`
状态:阶段 7 已修复。
问题:
- 签名创建、材料记录、提交审核调用真实 API。
- 旧实现文件本体没有真正上传到 MinIO/对象存储,只创建 `FileObject` 元数据。
修复:
- 已新增 `POST /api/admin/files/upload` multipart 上传接口。
- 服务端先把文件内容写入 MinIO 对象存储,再创建 `FileObject` 元数据。
- 客户端签名页上传材料时先调用真实上传接口,成功后再创建签名材料关联。
- 如果对象存储不可用,上传会失败并阻止材料元数据冒充成功。
### 客户端短信模板功能比原型瘦身
文件:`src/apps/client/ClientTemplatesPage.tsx`
状态:阶段 8 已修复。
问题:
- 列表、新增、提交审核调用真实 API。
- 旧实现缺少编辑模板、签名选择、变量推荐/自定义变量面板等原型交互。
- 旧实现删除实际是改状态为 `disabled`,页面文案需要匹配。
修复:
- 已恢复模板新增/编辑弹窗、推荐变量、自定义变量、变量示例值维护。
- 已补 `PUT /api/client/templates/{id}`,编辑时真实更新 `SmsTemplate` 并重建 `TemplateVariable`
- 模板可绑定签名,签名下拉按应用所属企业和签名绑定应用过滤。
- 删除仍按第一版现有语义写 `disabled`,页面保留删除入口并从列表过滤 disabled。
### 运营端报备回执导入不是真文件导入
文件:`src/apps/admin/AdminReportTasksPage.tsx`
状态:阶段 9 已修复 CSV/TSV/TXT 文本回执真实上传和解析。
问题:
- 报备任务列表和导入动作接了 API。
- 弹窗只输入 `fileName` 和备注,没有真实文件上传/解析。
- `statusAfter` 固定为 `partial`
已完成修复:
- 前端导入弹窗改为真实选择文件,先上传到 `/api/admin/files/upload`,再提交回执内容到报备导入接口。
- 后端解析 CSV/TSV/TXT 文本回执,按状态/结果列统计成功、失败行,并派生 `completed``partial``failed` 任务状态。
- 导入记录保存真实 `fileObjectId`、文件名、行数、成功数、失败数和行级解析结果。
- 未识别状态按失败处理,避免把未知运营商回执误判为报备通过。
### 系统配置与账号设置没有保存接口
状态:本轮已从第一版路由移除。
文件:
- `src/apps/admin/AdminSettingsPage.tsx`
- `src/apps/client/ClientSettingsPage.tsx`
问题:
- 运营端系统配置没有 API。
- 客户端账号设置明确写着“纯前端原型,不会提交到后端”。
已完成修复:
- 运营端系统配置、客户端账号设置当前无真实保存接口,且不属于第一版短信主链路验收入口。
- 已移除对应路由并删除纯前端页面文件,避免直达 URL 展示假功能。
## P2:彩信待开发边界,需要菜单策略
以下页面以彩信为主,当前大量使用静态数组、本地 state 或无 API。第一版若不验收彩信,建议从菜单隐藏或明确标记“待开发”,避免与短信真实功能混淆。
状态:本轮已将可点击彩信待开发路由统一指向占位页,不再进入静态 mock 演示页。
客户端:
- `src/apps/client/ClientMmsSignatureReportPage.tsx`
- `src/apps/client/ClientMmsTemplatesPage.tsx`
- `src/apps/client/ClientMmsSendPage.tsx`
- `src/apps/client/ClientMmsBatchTasksPage.tsx`
- `src/apps/client/ClientMmsSendDetailPage.tsx`
- `src/apps/client/ClientMmsUplinkMessagesPage.tsx`
运营端:
- `src/apps/admin/AdminMmsApplicationFormPage.tsx`
- `src/apps/admin/AdminMmsChannelsPage.tsx`
- `src/apps/admin/AdminMmsRecordsPage.tsx`
- `src/apps/admin/AdminMmsTaskProgressPage.tsx`
- `src/apps/admin/AdminSignatureAuditPage.tsx`
说明:
- `AdminSignatureAuditPage.tsx` 当前实际是“彩信模板审核”,使用 `initialMmsAudits`,通过/拒绝只改本地 state。
- 如果菜单名称仍显示为审核中心能力,需要调整命名或隐藏,避免被误认为短信签名审核真实闭环。
## 已基本接入真实 API 的页面
以下页面未发现明显静态业务主数据兜底,仍需后续做浏览器 smoke 和真实空库验证:
客户端:
- `ClientHome`
- `ClientBatchTasksPage`
- `ClientBillingPage`
- `ClientInvoicesPage`
- `ClientUsersPage`
- `ClientSystemLogsPage`
运营端:
- `AdminHome`
- `AdminMonitorPage`
- `AdminAnalyticsPage`
- `AdminRechargeRecordsPage`
- `AdminBillingPage`
- `AdminUsersPage`
- `AdminSystemLogsPage`
- `AdminSmsAuditPage`
- `AdminTemplateAuditPage`
- `AdminEnterpriseAuditPage`
- `AdminReportRecordsPage`
- `AdminChannelReportPage`
- `AdminSensitiveWordsPage`
- `AdminGlobalBlacklistPage`
- `AdminEnterpriseBlacklistPage`
- `AdminPhoneSegmentsPage`
- `AdminDrainageFieldsPage`
注意:
- “基本接入”不等于业务验收通过;仍要用真实空库和真实 API 操作验证按钮、弹窗和错误态。
- 搜索表达式会对 option 常量、纯 UI 状态产生少量误报,最终修复应以源码和真实页面操作为准。
## 建议修复顺序
1. 先修 P0 短信主链路展示页:客户端应用、发送详情、上行;运营端短信任务进度、短信上行。
2. 修通道组表单真实保存,因为它直接影响发送路由配置。
3. 按企业专项恢复企业管理、企业应用、签名引流、模板。
4. 补短信通道编辑接口。
5. 补 P1 的导入、材料上传、模板编辑、回执导入和设置保存。
6. 彩信页面统一隐藏、标记待开发或单独进入彩信开发计划。
7. 每完成一组,执行真实空库 smoke,确认清库后不会显示假数据。
+92
View File
@@ -509,3 +509,95 @@ npm run verify:phase8
- `verify:phase8` 当前失败点是独立 BullMQ 性能阈值,不是本轮通道组、计费、报备、回执业务逻辑测试失败。
- 浏览器端完整手工回归仍建议补跑企业应用创建、通道组配置、短信记录详情弹窗中的历史回执展示。
## 2026-07-03 阶段 9:运营端报备回执导入真实上传/解析
### 本轮修复
- 运营端报备任务导入弹窗改为真实选择 CSV/TSV/TXT 文件。
- 前端先调用 `/api/admin/files/upload` 保存文件对象,再提交 `fileObjectId`、文件名和文本内容到 `/api/admin/report-tasks/{id}/receipt-import`
- 后端导入接口解析文本回执,识别 `status/result/状态/结果` 列,统计成功行、失败行,并保存行级解析结果。
- 报备任务状态由后端按解析结果派生:全成功为 `completed`,有成功有失败为 `partial`,全失败或空文件为 `failed`
- 未识别的运营商状态按失败处理,避免把未知回执误判为通过。
### 已执行命令
```bash
npm --prefix api test -- channels.service.spec.ts
npm --prefix api test
npm --prefix api run build
npm run build
git diff --check
```
### 当前结果
- `api/src/channels/channels.service.spec.ts` 新增文本回执解析和任务状态派生覆盖。
- API Jest12 个 test suite 通过,73 个测试通过。
- API build 通过。
- 前端 build 通过,仍存在既有 Vite chunk size warning。
- `git diff --check` 无空白错误,仅 Windows 工作区 LF/CRLF 提示。
- 本地服务已重启:`http://localhost:3000/``http://localhost:5173/` 均监听,`/api/admin/report-tasks``/admin/report-tasks` HTTP smoke 返回 200。
## 2026-07-03 全菜单真实后端、上传和列宽回归
### 本轮修复
- 客户端企业认证从纯前端状态机改为真实 `GET/POST /api/client/enterprise-certification` 驱动。
- 客户端企业认证营业执照上传接入 `/api/admin/files/upload`,提交时保存 `licenseFileObjectId` 等材料字段。
- 运营端企业表单“企业照片”从禁用占位按钮改为真实上传,保存时写入 `photoFileObjectId`
- 客户端账号设置、运营端系统配置无真实保存接口,已移除路由并删除纯前端页面。
- 彩信待开发菜单路由统一指向占位页,不再进入静态 mock 演示页面。
- 客户端短信发送详情、批量任务表格中明显偏窄的中文字段列已加宽。
### 已执行命令
```bash
npm --prefix api test
npm --prefix api run build
npm run build
npm run spike:contracts
npm run test:gateway
$env:API_BASE_URL='http://127.0.0.1:3000/api'; node tools/smoke/real-env-smoke.mjs
npm run verify:phase8
git diff --check
```
### 当前结果
- API Jest12 个 test suite 通过,73 个测试通过。
- API build 通过。
- 前端 build 通过,仍存在既有 Vite chunk size warning。
- Gateway 队列契约通过,4 个示例均验证通过。
- `npm run test:gateway` 通过。
- 真实 API smoke 通过,覆盖真实 PostgreSQL/Redis/MinIO/API 主链路和文件上传对象写入。
- 浏览器抽检通过:客户端真实登录后,企业认证页面无“纯前端原型”文案,资料页出现真实上传入口;彩信待开发入口显示占位页而非静态表单。
- `npm run verify:phase8` 仍未通过,失败点仍是已知 BullMQ spike 性能阈值:15000 条消息、并发 500、end-to-end TPS 469.76,低于 500。
## 2026-07-03 企业列表列宽和新建应用交互回归
### 本轮修复
- 通用 `Table` 组件增加 `colgroup`、列最小宽度和表格最小宽度计算,显式配置的业务列不再被容器强行压窄,超出区域横向滚动。
- 企业管理列表加宽企业 ID、企业名称、企业编码、统一社会信用代码、联系人、联系电话、余额、短信余量、状态和操作列。
- 企业模板管理列表加宽企业、应用、签名、模板内容、审核状态、更新时间和操作列,模板内容列保留两行展示。
- 运营端短信任务进度、短信审核、短信记录、报备任务、用户、系统日志、安全控制、充值记录等列表中的状态/操作/数量等易挤压列统一加宽。
- 新建企业应用入口弹窗改为先选择真实企业,再进入应用参数、客户单价、IP 白名单和三网通道组配置;未选择企业时“下一步”禁用。
- 新建短信应用表单把移动、联通、电信通道组配置改为独立卡片区,显示已配置数量和无可用通道组提示;未填写应用名称或未选择任一运营商通道组时禁止保存。
- 补齐基础弹窗居中、遮罩、最大宽度和正文滚动样式,避免 1280px 视口下弹窗偏移或被截断。
### 已执行命令和浏览器验证
```bash
npm run build
git diff --check
```
- 前端 build 通过,仍存在既有 Vite chunk size warning。
- `git diff --check` 无空白错误,仅 Windows 工作区 LF/CRLF 提示。
- 窄列扫描仅剩短字段列:报备字段“必填”90px、运营看板排名72px、短信上行选择框72px。
- 浏览器使用真实运营端登录 `admin@example.com` 抽检通过:
- 企业管理表格最小宽度 1920px,统一社会信用代码列 220px,联系人列 160px,联系电话列 150px,横向滚动生效。
- 企业模板管理表格最小宽度 1820px,模板内容列 420px,横向滚动生效。
- 新建企业应用弹窗在 1280px 视口下未截断,未选择企业时“下一步”禁用。
- 新建短信应用页显示三网通道组卡片、已配置数量和无可用通道组提示,初始状态“创建应用”禁用。