feat: 实现发送质量监控与报备状态消息通知
CSS quality / css-quality (push) Has been cancelled

This commit is contained in:
hectorzhao
2026-09-06 19:22:49 +08:00
parent 69e3d7368d
commit 457319e627
66 changed files with 6992 additions and 489 deletions
@@ -130,6 +130,9 @@
"submitStatus": { "enum": ["accepted", "rejected", "timeout"] },
"errorCode": { "type": "string" },
"errorMessage": { "type": "string" },
"firstWireSubmitAt": { "type": "string", "format": "date-time" },
"wireTimeSource": { "enum": ["not_written", "write_uncertain", "gateway_write_complete"] },
"receiptRequested": { "type": "boolean" },
"submittedAt": { "type": "string", "format": "date-time" },
"segments": {
"type": "array",
@@ -144,7 +147,10 @@
"submitStatus": { "enum": ["accepted", "rejected", "timeout"] },
"errorCode": { "type": "string" },
"errorMessage": { "type": "string" },
"submittedAt": { "type": "string", "format": "date-time" }
"firstWireSubmitAt": { "type": "string", "format": "date-time" },
"wireTimeSource": { "enum": ["not_written", "write_uncertain", "gateway_write_complete"] },
"receiptRequested": { "type": "boolean" },
"submittedAt": { "type": "string", "format": "date-time" }
}
}
}
+10
View File
@@ -264,3 +264,13 @@ bash tools/deploy/production-deploy.sh
用户明确授权创建并保留后续复用的专用测试管理员。2026-09-06在测试环境100.93.204.60创建`codex_qa_admin`,显示名“自动化验收管理员”,用户ID`cmtphgp340000yrle7v11jemc`,角色`platform_admin`、状态`active`;正常验证码登录和退出已验证。该账号仅在测试环境创建,预生产不适用。
安全认证入口:工作站`C:\Users\hectorzhao\.config\cmpp-qa\test-admin.json`,仅当前Windows用户及SYSTEM可访问;测试机备份入口`/home/hector/.config/cmpp-qa/test-admin.json`,目录0700、文件0600、所有者hector。文件保存随机生成密码和登录地址,禁止打印内容、提交Git或将密码写进命令、截图和报告。后续通过既有SSH安全入口读取到内存或使用本机受限文件完成正常登录;账号和凭据按用户要求保留,测试结束退出会话即可。使用前重新核验账号有效性,不覆盖已有账号、不因认证失败重置其他管理员;账号存在不构成发送短信、改余额或通道/客户配置的授权。
## 发送质量监控与报备消息发布(2026-09-06)
本轮仅授权测试环境。候选版本新增20260906170000_report_readiness_notifications及20260906171000_sending_monitor两项兼容迁移;新增表/索引/报备触发器、Gateway可选时间元数据,以及独立cmpp-sending-monitor服务。默认规则和行业纳管均为空,不能套用原型阈值。
cmpp-sending-monitor以cmpp-api:cmpp-security运行,TZ=UTCPostgreSQL池上限2、单实例排他锁、5秒采集;读取已有持久事实,不发送短信、不新增发送链路同步依赖。工作目录api,入口dist/sending-monitor-worker.js,日志logs/sending-monitor,目录0750。标准发布脚本已安装并启用该服务;存量部署按本轮范围建立相同单元,保留已有存储及安全drop-in,不为本功能运行初始化/账号重置/存储配置脚本。
发布前分别核对迁移、存储、DB连接余量、近72小时尝试量和磁盘预算,备份新触发器上线前的数据库。事实72小时、分钟7天、快照30天、关闭告警90天;当前测试机零近期发送、24GB可用空间适用于此次测试准入,不证明500TPS或预生产容量达标。后续高峰上线须按方案容量和CPU/IO/延迟预算实测。
发布顺序:独立候选归档构建→迁移→切换受保护的原运行目录→callback(已启用时)→Gateway健康→API健康→既有Worker→新监控Worker。日志、队列、对象存储和环境沿用;不重启无关存储、不清理历史恢复点、不手工ACK/补发。验证健康检查点更新、规则为空、真实分页API、双端消息页、三尺寸、匿名/越权拒绝及队列基线。应用回退时先停止新Worker,旧代码忽略新增字段;兼容新增表/触发器可保留,数据回退另行评估,不直接覆盖库。
Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

@@ -0,0 +1,184 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="1000" viewBox="0 0 1600 1000">
<title>发送监控页面重做 · 静态设计原型(全部为示例数据)</title>
<rect x="0" y="0" width="1600" height="1000" rx="0" fill="#F6F7F9" stroke="none"/>
<rect x="0" y="0" width="248" height="1000" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="248" y1="0" x2="248" y2="1000" stroke="#E5E7EB" stroke-width="1"/>
<rect x="24" y="24" width="38" height="38" rx="8" fill="#EFF6FF" stroke="none"/>
<text x="31" y="54" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="600" fill="#2563EB"></text>
<text x="74" y="41" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#111827">聆界短信管理平台</text>
<text x="74" y="61" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">平台运营工作区</text>
<text x="28" y="117" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">运营概览</text>
<rect x="29" y="136" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="148" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">运营看板</text>
<rect x="16" y="171" width="216" height="40" rx="6" fill="#EFF6FF" stroke="none"/>
<rect x="16" y="171" width="3" height="40" rx="0" fill="#2563EB" stroke="none"/>
<rect x="29" y="180" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#2563EB"/>
<text x="56" y="192" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#2563EB">发送监控</text>
<rect x="29" y="224" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="236" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">网关异常</text>
<rect x="29" y="268" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="280" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">签名质量检测</text>
<text x="28" y="339" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">客户管理</text>
<rect x="29" y="358" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="370" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业管理</text>
<rect x="29" y="402" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="414" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业应用管理</text>
<rect x="29" y="446" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="458" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业签名管理</text>
<rect x="29" y="490" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="502" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业模板管理</text>
<text x="28" y="561" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">短信业务</text>
<rect x="29" y="580" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="592" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信通道</text>
<rect x="29" y="624" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="636" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信记录</text>
<rect x="29" y="668" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="680" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">任务进度</text>
<text x="28" y="739" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">系统管理</text>
<rect x="29" y="758" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="770" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">用户管理</text>
<rect x="29" y="802" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="814" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">系统监控</text>
<text x="24" y="964" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">设计原型 · 非真实业务数据</text>
<rect x="249" y="0" width="1351" height="65" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="249" y1="65" x2="1600" y2="65" stroke="#E5E7EB" stroke-width="1"/>
<text x="276" y="37" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">运营概览 / 发送监控</text>
<rect x="1000" y="15" width="140" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1014" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">预警中心 6</text>
<rect x="1152" y="15" width="148" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1166" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">待审核任务</text>
<rect x="1312" y="15" width="152" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1326" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">报备任务提醒</text>
<text x="1500" y="40" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">管理员</text>
<text x="276" y="115" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="600" fill="#111827">发送监控</text>
<text x="276" y="138" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">监测时效变化,定位异常通道与应用签名</text>
<rect x="1370" y="91" width="138" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1379" y="109" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">静态示例 · 待实施</text>
<text x="284" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#2563EB">行业通道</text>
<line x1="276" y1="223" x2="376" y2="223" stroke="#2563EB" stroke-width="3"/>
<text x="418" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#6B7280">验证码</text>
<text x="552" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#6B7280">整体兜底</text>
<text x="686" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#6B7280">告警记录</text>
<line x1="276" y1="225" x2="1572" y2="225" stroke="#E5E7EB" stroke-width="1"/>
<rect x="276" y="150" width="1296" height="28" rx="5" fill="#EFF6FF" stroke="none"/>
<text x="288" y="169" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#2563EB">以平台收到成功回执为准;未满观察时长的短信不参与该指标评估。</text>
<rect x="1210" y="183" width="80" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1224" y="206" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">刷新</text>
<rect x="1300" y="183" width="118" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1314" y="206" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">阈值设置</text>
<rect x="1428" y="183" width="144" height="36" rx="6" fill="#2563EB" stroke="none"/>
<text x="1442" y="206" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#FFFFFF">监控通道</text>
<rect x="276" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="294" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">监控维度</text>
<text x="294" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#111827">16</text>
<text x="391" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">通道 × 运营商</text>
<rect x="606" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="624" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">异常维度</text>
<text x="624" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#DC2626">2</text>
<text x="721" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">点击仅看异常</text>
<rect x="936" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="954" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">样本不足</text>
<text x="954" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#111827">3</text>
<text x="1051" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">不足最低成熟条数</text>
<rect x="1266" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1284" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">窗口提交量</text>
<text x="1284" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#111827">3,458</text>
<text x="1381" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">次发送尝试</text>
<rect x="276" y="363" width="1296" height="72" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="294" y="390" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">统计窗口</text>
<text x="294" y="415" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">12:25 12:30</text>
<text x="490" y="390" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">评估时刻 12:30:00</text>
<text x="490" y="414" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#1F2937">初评 · 12:31补齐</text>
<text x="686" y="390" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">更新于 12:30:18</text>
<text x="686" y="414" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">查看最近2小时趋势</text>
<rect x="934" y="382" width="168" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="948" y="405" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">搜索通道 / 编号</text>
<rect x="1114" y="382" width="168" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1128" y="405" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">运营商:全部</text>
<rect x="1294" y="382" width="152" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1308" y="405" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">状态:全部</text>
<rect x="276" y="455" width="1296" height="462" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<rect x="277" y="456" width="1294" height="47" rx="7" fill="#F9FAFB" stroke="none"/>
<text x="294" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">通道 / 运营商</text>
<text x="574" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">窗口提交</text>
<text x="727" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">5秒到达率</text>
<text x="889" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">20秒到达率</text>
<text x="1051" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">1分钟到达率</text>
<text x="1220" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">状态 / 规则</text>
<text x="1384" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">操作</text>
<rect x="277" y="504" width="1294" height="74" rx="0" fill="#FFFBFB" stroke="none"/>
<text x="294" y="534" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">行业通道 A</text>
<text x="294" y="556" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">CH-001 · 移动</text>
<text x="574" y="539" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">1,280</text>
<text x="727" y="538" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#DC2626">83.97%</text>
<text x="727" y="559" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">1,058 / 1,260 成熟</text>
<text x="889" y="538" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#DC2626">94.00%</text>
<text x="889" y="559" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">1,128 / 1,200 成熟</text>
<text x="1051" y="538" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#DC2626">97.00%</text>
<text x="1051" y="559" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">1,067 / 1,100 成熟</text>
<rect x="1220" y="515" width="42" height="25" rx="5" fill="#FEF2F2" stroke="none"/>
<text x="1229" y="533" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#DC2626">异常</text>
<text x="1220" y="560" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">通用规则</text>
<text x="1384" y="544" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="578" x2="1571" y2="578" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="609" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">行业通道 A</text>
<text x="294" y="631" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">CH-001 · 联通</text>
<text x="574" y="614" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">920</text>
<text x="727" y="613" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">97.11%</text>
<text x="727" y="634" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">874 / 900 成熟</text>
<text x="889" y="613" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">97.27%</text>
<text x="889" y="634" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">856 / 880 成熟</text>
<text x="1051" y="613" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">99.15%</text>
<text x="1051" y="634" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">813 / 820 成熟</text>
<rect x="1220" y="590" width="42" height="25" rx="5" fill="#F0FDF4" stroke="none"/>
<text x="1229" y="608" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#15803D">正常</text>
<text x="1220" y="635" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">通用规则</text>
<text x="1384" y="619" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="653" x2="1571" y2="653" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="684" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">行业通道 B</text>
<text x="294" y="706" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">CH-002 · 电信</text>
<text x="574" y="689" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">760</text>
<text x="727" y="688" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">91.89%</text>
<text x="727" y="709" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">680 / 740 成熟</text>
<text x="889" y="688" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">95.14%</text>
<text x="889" y="709" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">666 / 700 成熟</text>
<text x="1051" y="688" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">98.46%</text>
<text x="1051" y="709" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">640 / 650 成熟</text>
<rect x="1220" y="665" width="42" height="25" rx="5" fill="#F0FDF4" stroke="none"/>
<text x="1229" y="683" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#15803D">正常</text>
<text x="1220" y="710" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">通用规则</text>
<text x="1384" y="694" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="728" x2="1571" y2="728" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="759" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">行业通道 C</text>
<text x="294" y="781" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">CH-003 · 移动</text>
<text x="574" y="764" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">68</text>
<text x="727" y="763" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#6B7280">93.33%</text>
<text x="727" y="784" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">56 / 60 成熟</text>
<text x="889" y="763" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#6B7280">96.36%</text>
<text x="889" y="784" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">53 / 55 成熟</text>
<text x="1051" y="763" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#6B7280">97.83%</text>
<text x="1051" y="784" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">45 / 46 成熟</text>
<rect x="1220" y="740" width="66" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1229" y="758" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">样本不足</text>
<text x="1220" y="785" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">通用规则</text>
<text x="1384" y="769" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="803" x2="1571" y2="803" stroke="#E5E7EB" stroke-width="1"/>
<rect x="277" y="804" width="1294" height="74" rx="0" fill="#FFFBFB" stroke="none"/>
<text x="294" y="834" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">行业通道 D</text>
<text x="294" y="856" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">CH-004 · 联通</text>
<text x="574" y="839" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">430</text>
<text x="727" y="838" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#DC2626">73.81%</text>
<text x="727" y="859" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">310 / 420 成熟</text>
<text x="889" y="838" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#DC2626">90.50%</text>
<text x="889" y="859" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">362 / 400 成熟</text>
<text x="1051" y="838" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#DC2626">96.67%</text>
<text x="1051" y="859" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">348 / 360 成熟</text>
<rect x="1220" y="815" width="42" height="25" rx="5" fill="#FEF2F2" stroke="none"/>
<text x="1229" y="833" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#DC2626">异常</text>
<text x="1220" y="860" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">通用规则</text>
<text x="1384" y="844" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="878" x2="1571" y2="878" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="904" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">每个指标独立校验成熟样本;百分比下方为成功数 / 可评估数。</text>
<text x="1274" y="904" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">展示5行 ‹ 1 2 3 ›</text>
<text x="276" y="952" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">行业通道监控 · 图中所有数值仅用于需求评审</text>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

@@ -0,0 +1,180 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="1000" viewBox="0 0 1600 1000">
<title>发送监控页面重做 · 静态设计原型(全部为示例数据)</title>
<rect x="0" y="0" width="1600" height="1000" rx="0" fill="#F6F7F9" stroke="none"/>
<rect x="0" y="0" width="248" height="1000" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="248" y1="0" x2="248" y2="1000" stroke="#E5E7EB" stroke-width="1"/>
<rect x="24" y="24" width="38" height="38" rx="8" fill="#EFF6FF" stroke="none"/>
<text x="31" y="54" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="600" fill="#2563EB"></text>
<text x="74" y="41" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#111827">聆界短信管理平台</text>
<text x="74" y="61" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">平台运营工作区</text>
<text x="28" y="117" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">运营概览</text>
<rect x="29" y="136" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="148" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">运营看板</text>
<rect x="16" y="171" width="216" height="40" rx="6" fill="#EFF6FF" stroke="none"/>
<rect x="16" y="171" width="3" height="40" rx="0" fill="#2563EB" stroke="none"/>
<rect x="29" y="180" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#2563EB"/>
<text x="56" y="192" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#2563EB">发送监控</text>
<rect x="29" y="224" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="236" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">网关异常</text>
<rect x="29" y="268" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="280" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">签名质量检测</text>
<text x="28" y="339" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">客户管理</text>
<rect x="29" y="358" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="370" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业管理</text>
<rect x="29" y="402" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="414" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业应用管理</text>
<rect x="29" y="446" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="458" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业签名管理</text>
<rect x="29" y="490" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="502" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业模板管理</text>
<text x="28" y="561" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">短信业务</text>
<rect x="29" y="580" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="592" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信通道</text>
<rect x="29" y="624" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="636" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信记录</text>
<rect x="29" y="668" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="680" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">任务进度</text>
<text x="28" y="739" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">系统管理</text>
<rect x="29" y="758" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="770" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">用户管理</text>
<rect x="29" y="802" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="814" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">系统监控</text>
<text x="24" y="964" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">设计原型 · 非真实业务数据</text>
<rect x="249" y="0" width="1351" height="65" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="249" y1="65" x2="1600" y2="65" stroke="#E5E7EB" stroke-width="1"/>
<text x="276" y="37" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">运营概览 / 发送监控</text>
<rect x="1000" y="15" width="140" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1014" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">预警中心 6</text>
<rect x="1152" y="15" width="148" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1166" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">待审核任务</text>
<rect x="1312" y="15" width="152" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1326" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">报备任务提醒</text>
<text x="1500" y="40" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">管理员</text>
<text x="276" y="115" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="600" fill="#111827">发送监控</text>
<text x="276" y="138" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">监测时效变化,定位异常通道与应用签名</text>
<rect x="1370" y="91" width="138" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1379" y="109" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">静态示例 · 待实施</text>
<text x="284" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#6B7280">行业通道</text>
<text x="418" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#2563EB">验证码</text>
<line x1="410" y1="223" x2="510" y2="223" stroke="#2563EB" stroke-width="3"/>
<text x="552" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#6B7280">整体兜底</text>
<text x="686" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#6B7280">告警记录</text>
<line x1="276" y1="225" x2="1572" y2="225" stroke="#E5E7EB" stroke-width="1"/>
<rect x="276" y="150" width="1296" height="28" rx="5" fill="#EFF6FF" stroke="none"/>
<text x="288" y="169" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#2563EB">仅统计最终正文包含“验证码”的业务短信;补发不重复计数,以成功回执为准。</text>
<rect x="1210" y="183" width="80" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1224" y="206" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">刷新</text>
<rect x="1300" y="183" width="118" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1314" y="206" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">阈值设置</text>
<rect x="1428" y="183" width="144" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1442" y="206" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">运行概况</text>
<rect x="276" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="294" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">监控维度</text>
<text x="294" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#111827">48</text>
<text x="391" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">企业应用 × 签名</text>
<rect x="606" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="624" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">异常维度</text>
<text x="624" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#DC2626">1</text>
<text x="721" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">点击仅看异常</text>
<rect x="936" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="954" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">样本不足</text>
<text x="954" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#111827">3</text>
<text x="1051" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">不足最低成熟条数</text>
<rect x="1266" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1284" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">窗口提交量</text>
<text x="1284" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#111827">3,028</text>
<text x="1381" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">条业务短信</text>
<rect x="276" y="363" width="1296" height="72" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="294" y="390" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">统计窗口</text>
<text x="294" y="415" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">12:25 12:30</text>
<text x="490" y="390" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">评估时刻 12:30:00</text>
<text x="490" y="414" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#1F2937">初评 · 12:31补齐</text>
<text x="686" y="390" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">更新于 12:30:18</text>
<text x="686" y="414" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">查看最近2小时趋势</text>
<rect x="934" y="382" width="168" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="948" y="405" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业 / 应用</text>
<rect x="1114" y="382" width="168" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1128" y="405" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">搜索签名</text>
<rect x="1294" y="382" width="152" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1308" y="405" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">状态:全部</text>
<rect x="276" y="455" width="1296" height="462" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<rect x="277" y="456" width="1294" height="47" rx="7" fill="#F9FAFB" stroke="none"/>
<text x="294" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">企业应用 / 签名</text>
<text x="574" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">窗口提交</text>
<text x="727" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">5秒到达率</text>
<text x="889" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">20秒到达率</text>
<text x="1051" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">1分钟到达率</text>
<text x="1220" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">状态 / 规则</text>
<text x="1384" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">操作</text>
<rect x="277" y="504" width="1294" height="74" rx="0" fill="#FFFBFB" stroke="none"/>
<text x="294" y="534" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">示例零售 · 登录应用</text>
<text x="294" y="556" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例商城】</text>
<text x="574" y="539" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">1,280</text>
<text x="727" y="538" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#DC2626">83.97%</text>
<text x="727" y="559" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">1,058 / 1,260 成熟</text>
<text x="889" y="538" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#DC2626">94.00%</text>
<text x="889" y="559" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">1,128 / 1,200 成熟</text>
<text x="1051" y="538" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#DC2626">97.00%</text>
<text x="1051" y="559" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">1,067 / 1,100 成熟</text>
<rect x="1220" y="515" width="42" height="25" rx="5" fill="#FEF2F2" stroke="none"/>
<text x="1229" y="533" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#DC2626">异常</text>
<text x="1220" y="560" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">验证码通用</text>
<text x="1384" y="544" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="578" x2="1571" y2="578" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="609" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">示例服务 · 用户中心</text>
<text x="294" y="631" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例服务】</text>
<text x="574" y="614" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">920</text>
<text x="727" y="613" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">97.11%</text>
<text x="727" y="634" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">874 / 900 成熟</text>
<text x="889" y="613" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">97.27%</text>
<text x="889" y="634" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">856 / 880 成熟</text>
<text x="1051" y="613" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">99.15%</text>
<text x="1051" y="634" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">813 / 820 成熟</text>
<rect x="1220" y="590" width="42" height="25" rx="5" fill="#F0FDF4" stroke="none"/>
<text x="1229" y="608" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#15803D">正常</text>
<text x="1220" y="635" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">验证码通用</text>
<text x="1384" y="619" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="653" x2="1571" y2="653" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="684" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">示例物流 · 商户应用</text>
<text x="294" y="706" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例物流】</text>
<text x="574" y="689" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">760</text>
<text x="727" y="688" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">91.89%</text>
<text x="727" y="709" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">680 / 740 成熟</text>
<text x="889" y="688" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">95.14%</text>
<text x="889" y="709" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">666 / 700 成熟</text>
<text x="1051" y="688" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">98.46%</text>
<text x="1051" y="709" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">640 / 650 成熟</text>
<rect x="1220" y="665" width="42" height="25" rx="5" fill="#F0FDF4" stroke="none"/>
<text x="1229" y="683" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#15803D">正常</text>
<text x="1220" y="710" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">验证码通用</text>
<text x="1384" y="694" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="728" x2="1571" y2="728" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="759" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">示例教育 · 学员登录</text>
<text x="294" y="781" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例学堂】</text>
<text x="574" y="764" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">68</text>
<text x="727" y="763" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#6B7280">93.33%</text>
<text x="727" y="784" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">56 / 60 成熟</text>
<text x="889" y="763" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#6B7280">96.36%</text>
<text x="889" y="784" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">53 / 55 成熟</text>
<text x="1051" y="763" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#6B7280">97.83%</text>
<text x="1051" y="784" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">45 / 46 成熟</text>
<rect x="1220" y="740" width="66" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1229" y="758" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">样本不足</text>
<text x="1220" y="785" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">验证码通用</text>
<text x="1384" y="769" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="803" x2="1571" y2="803" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="834" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">示例平台 · 会员应用</text>
<text x="294" y="856" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例会员】</text>
<text x="574" y="839" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937"></text>
<text x="727" y="838" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#6B7280">— 待更新</text>
<text x="889" y="838" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#6B7280">— 待更新</text>
<text x="1051" y="838" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#6B7280">— 待更新</text>
<rect x="1220" y="815" width="66" height="25" rx="5" fill="#FFFBEB" stroke="none"/>
<text x="1229" y="833" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#B45309">数据延迟</text>
<text x="1220" y="860" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">验证码通用</text>
<text x="1384" y="844" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="878" x2="1571" y2="878" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="904" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">每个指标独立校验成熟样本;百分比下方为成功数 / 可评估数。</text>
<text x="1274" y="904" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">展示5行 ‹ 1 2 3 ›</text>
<text x="276" y="952" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">验证码监控 · 图中所有数值仅用于需求评审</text>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

@@ -0,0 +1,181 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="1000" viewBox="0 0 1600 1000">
<title>发送监控页面重做 · 静态设计原型(全部为示例数据)</title>
<rect x="0" y="0" width="1600" height="1000" rx="0" fill="#F6F7F9" stroke="none"/>
<rect x="0" y="0" width="248" height="1000" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="248" y1="0" x2="248" y2="1000" stroke="#E5E7EB" stroke-width="1"/>
<rect x="24" y="24" width="38" height="38" rx="8" fill="#EFF6FF" stroke="none"/>
<text x="31" y="54" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="600" fill="#2563EB"></text>
<text x="74" y="41" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#111827">聆界短信管理平台</text>
<text x="74" y="61" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">平台运营工作区</text>
<text x="28" y="117" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">运营概览</text>
<rect x="29" y="136" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="148" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">运营看板</text>
<rect x="16" y="171" width="216" height="40" rx="6" fill="#EFF6FF" stroke="none"/>
<rect x="16" y="171" width="3" height="40" rx="0" fill="#2563EB" stroke="none"/>
<rect x="29" y="180" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#2563EB"/>
<text x="56" y="192" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#2563EB">发送监控</text>
<rect x="29" y="224" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="236" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">网关异常</text>
<rect x="29" y="268" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="280" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">签名质量检测</text>
<text x="28" y="339" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">客户管理</text>
<rect x="29" y="358" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="370" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业管理</text>
<rect x="29" y="402" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="414" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业应用管理</text>
<rect x="29" y="446" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="458" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业签名管理</text>
<rect x="29" y="490" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="502" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业模板管理</text>
<text x="28" y="561" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">短信业务</text>
<rect x="29" y="580" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="592" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信通道</text>
<rect x="29" y="624" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="636" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信记录</text>
<rect x="29" y="668" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="680" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">任务进度</text>
<text x="28" y="739" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">系统管理</text>
<rect x="29" y="758" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="770" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">用户管理</text>
<rect x="29" y="802" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="814" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">系统监控</text>
<text x="24" y="964" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">设计原型 · 非真实业务数据</text>
<rect x="249" y="0" width="1351" height="65" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="249" y1="65" x2="1600" y2="65" stroke="#E5E7EB" stroke-width="1"/>
<text x="276" y="37" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">运营概览 / 发送监控</text>
<rect x="1000" y="15" width="140" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1014" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">预警中心 6</text>
<rect x="1152" y="15" width="148" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1166" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">待审核任务</text>
<rect x="1312" y="15" width="152" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1326" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">报备任务提醒</text>
<text x="1500" y="40" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">管理员</text>
<text x="276" y="115" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="600" fill="#111827">发送监控</text>
<text x="276" y="138" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">监测时效变化,定位异常通道与应用签名</text>
<rect x="1370" y="91" width="138" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1379" y="109" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">静态示例 · 待实施</text>
<text x="284" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#6B7280">行业通道</text>
<text x="418" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#6B7280">验证码</text>
<text x="552" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#2563EB">整体兜底</text>
<line x1="544" y1="223" x2="644" y2="223" stroke="#2563EB" stroke-width="3"/>
<text x="686" y="207" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#6B7280">告警记录</text>
<line x1="276" y1="225" x2="1572" y2="225" stroke="#E5E7EB" stroke-width="1"/>
<rect x="276" y="150" width="1296" height="28" rx="5" fill="#EFF6FF" stroke="none"/>
<text x="288" y="169" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#2563EB">近30分钟整体监控;1 / 5 / 20分钟分别使用成熟分母,不将新提交短信计作失败。</text>
<rect x="1210" y="183" width="80" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1224" y="206" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">刷新</text>
<rect x="1300" y="183" width="118" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1314" y="206" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">阈值设置</text>
<rect x="1428" y="183" width="144" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1442" y="206" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">运行概况</text>
<rect x="276" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="294" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">监控维度</text>
<text x="294" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#111827">48</text>
<text x="391" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">企业应用 × 签名</text>
<rect x="606" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="624" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">异常维度</text>
<text x="624" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#DC2626">1</text>
<text x="721" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">点击仅看异常</text>
<rect x="936" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="954" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">样本不足</text>
<text x="954" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#111827">3</text>
<text x="1051" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">不足最低成熟条数</text>
<rect x="1266" y="246" width="306" height="97" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1284" y="273" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">窗口提交量</text>
<text x="1284" y="314" font-family="Microsoft YaHei, sans-serif" font-size="28" font-weight="600" fill="#111827">5,230</text>
<text x="1381" y="312" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">条业务短信</text>
<rect x="276" y="363" width="1296" height="72" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="294" y="390" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">统计窗口</text>
<text x="294" y="415" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">12:00 12:30</text>
<text x="490" y="390" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">评估时刻 12:30:00</text>
<text x="490" y="414" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#1F2937">每10分钟评估</text>
<text x="686" y="390" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">更新于 12:30:18</text>
<text x="686" y="414" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">查看最近2小时趋势</text>
<rect x="934" y="382" width="168" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="948" y="405" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业 / 应用</text>
<rect x="1114" y="382" width="168" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1128" y="405" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">搜索签名</text>
<rect x="1294" y="382" width="152" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1308" y="405" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">状态:全部</text>
<rect x="276" y="455" width="1296" height="462" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<rect x="277" y="456" width="1294" height="47" rx="7" fill="#F9FAFB" stroke="none"/>
<text x="294" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">企业应用 / 签名</text>
<text x="574" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">窗口提交</text>
<text x="727" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">1分钟到达率</text>
<text x="889" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">5分钟到达率</text>
<text x="1051" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">20分钟到达率</text>
<text x="1220" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">状态 / 规则</text>
<text x="1384" y="485" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">操作</text>
<text x="294" y="534" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">示例零售 · 通知应用</text>
<text x="294" y="556" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例商城】</text>
<text x="574" y="539" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">300</text>
<text x="727" y="538" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">88.62%</text>
<text x="727" y="559" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">257 / 290 成熟</text>
<text x="889" y="538" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">92.17%</text>
<text x="889" y="559" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">212 / 230 成熟</text>
<text x="1051" y="538" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#6B7280">94.44%</text>
<text x="1051" y="559" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">85 / 90 成熟</text>
<rect x="1220" y="515" width="66" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1229" y="533" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">样本不足</text>
<text x="1220" y="560" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">应用×签名</text>
<text x="1384" y="544" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="578" x2="1571" y2="578" stroke="#E5E7EB" stroke-width="1"/>
<rect x="277" y="579" width="1294" height="74" rx="0" fill="#FFFBFB" stroke="none"/>
<text x="294" y="609" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">示例服务 · 业务应用</text>
<text x="294" y="631" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例服务】</text>
<text x="574" y="614" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">2,500</text>
<text x="727" y="613" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">90.00%</text>
<text x="727" y="634" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">2,115 / 2,350 成熟</text>
<text x="889" y="613" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">97.00%</text>
<text x="889" y="634" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">1,940 / 2,000 成熟</text>
<text x="1051" y="613" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#DC2626">95.00%</text>
<text x="1051" y="634" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">950 / 1,000 成熟</text>
<rect x="1220" y="590" width="42" height="25" rx="5" fill="#FEF2F2" stroke="none"/>
<text x="1229" y="608" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#DC2626">异常</text>
<text x="1220" y="635" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">签名规则</text>
<text x="1384" y="619" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="653" x2="1571" y2="653" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="684" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">示例物流 · 商户应用</text>
<text x="294" y="706" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例物流】</text>
<text x="574" y="689" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">1,800</text>
<text x="727" y="688" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">98.00%</text>
<text x="727" y="709" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">1,666 / 1,700 成熟</text>
<text x="889" y="688" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">99.00%</text>
<text x="889" y="709" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">1,485 / 1,500 成熟</text>
<text x="1051" y="688" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">99.44%</text>
<text x="1051" y="709" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">895 / 900 成熟</text>
<rect x="1220" y="665" width="42" height="25" rx="5" fill="#F0FDF4" stroke="none"/>
<text x="1229" y="683" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#15803D">正常</text>
<text x="1220" y="710" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">应用规则</text>
<text x="1384" y="694" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="728" x2="1571" y2="728" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="759" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">示例教育 · 通知应用</text>
<text x="294" y="781" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例学堂】</text>
<text x="574" y="764" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">630</text>
<text x="727" y="763" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">93.00%</text>
<text x="727" y="784" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">558 / 600 成熟</text>
<text x="889" y="763" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">95.60%</text>
<text x="889" y="784" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">478 / 500 成熟</text>
<text x="1051" y="763" font-family="Microsoft YaHei, sans-serif" font-size="19" font-weight="600" fill="#15803D">99.17%</text>
<text x="1051" y="784" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">238 / 240 成熟</text>
<rect x="1220" y="740" width="42" height="25" rx="5" fill="#F0FDF4" stroke="none"/>
<text x="1229" y="758" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#15803D">正常</text>
<text x="1220" y="785" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">通用规则</text>
<text x="1384" y="769" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="803" x2="1571" y2="803" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="834" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">示例平台 · 消息应用</text>
<text x="294" y="856" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例会员】</text>
<text x="574" y="839" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937"></text>
<text x="727" y="838" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#6B7280">— 待更新</text>
<text x="889" y="838" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#6B7280">— 待更新</text>
<text x="1051" y="838" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#6B7280">— 待更新</text>
<rect x="1220" y="815" width="66" height="25" rx="5" fill="#FFFBEB" stroke="none"/>
<text x="1229" y="833" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#B45309">数据延迟</text>
<text x="1220" y="860" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">通用规则</text>
<text x="1384" y="844" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">趋势 / 详情</text>
<line x1="277" y1="878" x2="1571" y2="878" stroke="#E5E7EB" stroke-width="1"/>
<text x="294" y="904" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">每个指标独立校验成熟样本;百分比下方为成功数 / 可评估数。</text>
<text x="1274" y="904" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">展示5行 ‹ 1 2 3 ›</text>
<text x="276" y="952" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">整体兜底监控 · 图中所有数值仅用于需求评审</text>
<text x="276" y="981" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#2563EB">示例首行:20分钟指标85/90,最低100条,尚不触发告警;另有210条观察中。</text>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

@@ -0,0 +1,137 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="1000" viewBox="0 0 1600 1000">
<title>发送监控页面重做 · 静态设计原型(全部为示例数据)</title>
<rect x="0" y="0" width="1600" height="1000" rx="0" fill="#F6F7F9" stroke="none"/>
<rect x="0" y="0" width="248" height="1000" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="248" y1="0" x2="248" y2="1000" stroke="#E5E7EB" stroke-width="1"/>
<rect x="24" y="24" width="38" height="38" rx="8" fill="#EFF6FF" stroke="none"/>
<text x="31" y="54" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="600" fill="#2563EB"></text>
<text x="74" y="41" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#111827">聆界短信管理平台</text>
<text x="74" y="61" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">平台运营工作区</text>
<text x="28" y="117" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">运营概览</text>
<rect x="29" y="136" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="148" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">运营看板</text>
<rect x="16" y="171" width="216" height="40" rx="6" fill="#EFF6FF" stroke="none"/>
<rect x="16" y="171" width="3" height="40" rx="0" fill="#2563EB" stroke="none"/>
<rect x="29" y="180" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#2563EB"/>
<text x="56" y="192" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#2563EB">发送监控</text>
<rect x="29" y="224" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="236" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">网关异常</text>
<rect x="29" y="268" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="280" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">签名质量检测</text>
<text x="28" y="339" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">客户管理</text>
<rect x="29" y="358" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="370" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业管理</text>
<rect x="29" y="402" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="414" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业应用管理</text>
<rect x="29" y="446" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="458" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业签名管理</text>
<rect x="29" y="490" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="502" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业模板管理</text>
<text x="28" y="561" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">短信业务</text>
<rect x="29" y="580" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="592" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信通道</text>
<rect x="29" y="624" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="636" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信记录</text>
<rect x="29" y="668" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="680" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">任务进度</text>
<text x="28" y="739" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">系统管理</text>
<rect x="29" y="758" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="770" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">用户管理</text>
<rect x="29" y="802" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="814" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">系统监控</text>
<text x="24" y="964" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">设计原型 · 非真实业务数据</text>
<rect x="249" y="0" width="1351" height="65" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="249" y1="65" x2="1600" y2="65" stroke="#E5E7EB" stroke-width="1"/>
<text x="276" y="37" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">运营概览 / 发送监控</text>
<rect x="1000" y="15" width="140" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1014" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">预警中心 6</text>
<rect x="1152" y="15" width="148" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1166" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">待审核任务</text>
<rect x="1312" y="15" width="152" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1326" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">报备任务提醒</text>
<text x="1500" y="40" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">管理员</text>
<text x="276" y="115" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="600" fill="#111827">告警阈值设置</text>
<text x="276" y="138" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">整体兜底 · 通用规则与个性规则</text>
<rect x="1370" y="91" width="138" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1379" y="109" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">静态示例 · 待实施</text>
<rect x="1458" y="126" width="114" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1472" y="149" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">返回监控</text>
<rect x="276" y="176" width="600" height="706" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="298" y="215" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">生效优先级</text>
<rect x="298" y="231" width="554" height="43" rx="6" fill="#EFF6FF" stroke="none"/>
<text x="312" y="259" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#2563EB">应用×签名 &gt; 签名 &gt; 应用 &gt; 通用</text>
<text x="298" y="304" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">命中最高优先级后,整套规则覆盖。</text>
<text x="298" y="348" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">规则列表</text>
<rect x="730" y="320" width="122" height="36" rx="6" fill="#2563EB" stroke="none"/>
<text x="744" y="343" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#FFFFFF">新增规则</text>
<rect x="298" y="373" width="554" height="83" rx="6" fill="#EFF6FF" stroke="#2563EB"/>
<rect x="313" y="385" width="78" height="25" rx="5" fill="#EFF6FF" stroke="none"/>
<text x="322" y="403" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#2563EB">应用×签名</text>
<text x="426" y="403" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">通知应用 / 【示例商城】</text>
<text x="426" y="433" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">100条 · 85% / 90% / 95%</text>
<rect x="298" y="471" width="554" height="83" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<rect x="313" y="483" width="42" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="322" y="501" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">签名</text>
<text x="426" y="501" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">【示例服务】</text>
<text x="426" y="531" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">100条 · 90% / 95% / 98%</text>
<rect x="298" y="569" width="554" height="83" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<rect x="313" y="581" width="42" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="322" y="599" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">应用</text>
<text x="426" y="599" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">商户应用</text>
<text x="426" y="629" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">100条 · 90% / 95% / 98%</text>
<rect x="298" y="667" width="554" height="83" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<rect x="313" y="679" width="42" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="322" y="697" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">通用</text>
<text x="426" y="697" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">全部未覆盖对象</text>
<text x="426" y="727" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">100条 · 90% / 95% / 98%</text>
<text x="298" y="807" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">实际生效示例</text>
<text x="298" y="836" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#1F2937">示例零售 / 通知应用 / 【示例商城】</text>
<text x="298" y="860" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#2563EB">采用应用×签名规则,覆盖下层通用设置。</text>
<rect x="900" y="176" width="672" height="706" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="925" y="217" font-family="Microsoft YaHei, sans-serif" font-size="18" font-weight="600" fill="#1F2937">编辑个性规则</text>
<rect x="1398" y="198" width="114" height="25" rx="5" fill="#FFFBEB" stroke="none"/>
<text x="1407" y="216" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#B45309">草稿 · 未保存</text>
<text x="925" y="259" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">作用范围</text>
<rect x="1085" y="238" width="455" height="38" rx="5" fill="#FAFAFA" stroke="#E5E7EB"/>
<text x="1097" y="263" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业应用 × 签名</text>
<text x="925" y="326" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">企业 / 应用</text>
<rect x="1085" y="305" width="455" height="38" rx="5" fill="#FAFAFA" stroke="#E5E7EB"/>
<text x="1097" y="330" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">示例零售 / 通知应用</text>
<text x="925" y="393" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">签名</text>
<rect x="1085" y="372" width="455" height="38" rx="5" fill="#FAFAFA" stroke="#E5E7EB"/>
<text x="1097" y="397" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">【示例商城】</text>
<line x1="925" y1="445" x2="1540" y2="445" stroke="#E5E7EB" stroke-width="1"/>
<text x="925" y="483" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">最低成熟条数</text>
<rect x="1170" y="458" width="160" height="40" rx="5" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1183" y="487" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="400" fill="#1F2937">100</text>
<text x="1340" y="486" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">条 / 每项指标</text>
<text x="925" y="520" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">仅有样本数达到门槛的指标才参与告警。</text>
<rect x="925" y="549" width="18" height="18" rx="3" fill="#2563EB" stroke="none"/>
<line x1="929" y1="558" x2="933" y2="562" stroke="#FFFFFF" stroke-width="2"/>
<line x1="933" y1="562" x2="939" y2="554" stroke="#FFFFFF" stroke-width="2"/>
<text x="954" y="565" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">1分钟到达率下限</text>
<rect x="1280" y="541" width="260" height="38" rx="5" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1293" y="566" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">85.00 %</text>
<rect x="925" y="603" width="18" height="18" rx="3" fill="#2563EB" stroke="none"/>
<line x1="929" y1="612" x2="933" y2="616" stroke="#FFFFFF" stroke-width="2"/>
<line x1="933" y1="616" x2="939" y2="608" stroke="#FFFFFF" stroke-width="2"/>
<text x="954" y="619" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">5分钟到达率下限</text>
<rect x="1280" y="595" width="260" height="38" rx="5" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1293" y="620" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">90.00 %</text>
<rect x="925" y="657" width="18" height="18" rx="3" fill="#2563EB" stroke="none"/>
<line x1="929" y1="666" x2="933" y2="670" stroke="#FFFFFF" stroke-width="2"/>
<line x1="933" y1="670" x2="939" y2="662" stroke="#FFFFFF" stroke-width="2"/>
<text x="954" y="673" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">20分钟到达率下限</text>
<rect x="1280" y="649" width="260" height="38" rx="5" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1293" y="674" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">95.00 %</text>
<text x="925" y="731" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#1F2937">连续异常 1 次触发 · 连续恢复 2 次关闭</text>
<text x="925" y="762" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">预计下周期生效;旧告警记录保留原规则版本。</text>
<line x1="901" y1="791" x2="1571" y2="791" stroke="#E5E7EB" stroke-width="1"/>
<rect x="925" y="817" width="120" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="939" y="840" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">恢复继承</text>
<rect x="1300" y="817" width="80" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1314" y="840" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">取消</text>
<rect x="1392" y="817" width="148" height="36" rx="6" fill="#2563EB" stroke="none"/>
<text x="1406" y="840" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#FFFFFF">保存规则</text>
<text x="276" y="933" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">交互说明:保存失败保留输入;版本冲突重新加载;未保存离开须确认。</text>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

@@ -0,0 +1,82 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="1000" viewBox="0 0 1600 1000">
<title>发送监控页面重做 · 静态设计原型(全部为示例数据)</title>
<rect x="0" y="0" width="1600" height="1000" rx="0" fill="#F6F7F9" stroke="none"/>
<rect x="0" y="0" width="248" height="1000" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="248" y1="0" x2="248" y2="1000" stroke="#E5E7EB" stroke-width="1"/>
<rect x="24" y="24" width="38" height="38" rx="8" fill="#EFF6FF" stroke="none"/>
<text x="31" y="54" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="600" fill="#2563EB"></text>
<text x="74" y="41" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#111827">聆界短信管理平台</text>
<text x="74" y="61" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">平台运营工作区</text>
<text x="28" y="117" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">运营概览</text>
<rect x="29" y="136" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="148" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">运营看板</text>
<rect x="16" y="171" width="216" height="40" rx="6" fill="#EFF6FF" stroke="none"/>
<rect x="16" y="171" width="3" height="40" rx="0" fill="#2563EB" stroke="none"/>
<rect x="29" y="180" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#2563EB"/>
<text x="56" y="192" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#2563EB">发送监控</text>
<rect x="29" y="224" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="236" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">网关异常</text>
<rect x="29" y="268" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="280" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">签名质量检测</text>
<text x="28" y="339" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">客户管理</text>
<rect x="29" y="358" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="370" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业管理</text>
<rect x="29" y="402" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="414" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业应用管理</text>
<rect x="29" y="446" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="458" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业签名管理</text>
<rect x="29" y="490" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="502" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业模板管理</text>
<text x="28" y="561" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">短信业务</text>
<rect x="29" y="580" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="592" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信通道</text>
<rect x="29" y="624" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="636" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信记录</text>
<rect x="29" y="668" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="680" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">任务进度</text>
<text x="28" y="739" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">系统管理</text>
<rect x="29" y="758" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="770" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">用户管理</text>
<rect x="29" y="802" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="814" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">系统监控</text>
<text x="24" y="964" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">设计原型 · 非真实业务数据</text>
<rect x="249" y="0" width="1351" height="65" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="249" y1="65" x2="1600" y2="65" stroke="#E5E7EB" stroke-width="1"/>
<text x="276" y="37" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">运营概览 / 发送监控</text>
<rect x="1000" y="15" width="140" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1014" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">预警中心 6</text>
<rect x="1152" y="15" width="148" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1166" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">待审核任务</text>
<rect x="1312" y="15" width="152" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1326" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">报备任务提醒</text>
<text x="1500" y="40" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">管理员</text>
<text x="276" y="115" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="600" fill="#111827">短信通道</text>
<text x="276" y="138" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">新建 / 复制通道保存成功之后,独立询问是否纳管</text>
<rect x="1370" y="91" width="138" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1379" y="109" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">静态示例 · 待实施</text>
<rect x="276" y="180" width="1296" height="713" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<rect x="298" y="202" width="78" height="25" rx="5" fill="#F0FDF4" stroke="none"/>
<text x="307" y="220" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#15803D">通道已保存</text>
<text x="420" y="221" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">行业通道 E · 新通道编号 CH-005</text>
<text x="298" y="262" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">创建结果已生效。加入监控不会修改通道价格、连接或路由。</text>
<rect x="426" y="316" width="940" height="421" rx="9" fill="#F3F4F6" stroke="none"/>
<rect x="420" y="310" width="940" height="421" rx="8" fill="#FFFFFF" stroke="#D1D5DB"/>
<text x="448" y="357" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="600" fill="#111827">是否加入行业通道监控?</text>
<text x="1313" y="358" font-family="Microsoft YaHei, sans-serif" font-size="23" font-weight="400" fill="#6B7280">×</text>
<line x1="421" y1="386" x2="1359" y2="386" stroke="#E5E7EB" stroke-width="1"/>
<rect x="448" y="409" width="884" height="48" rx="6" fill="#EFF6FF" stroke="none"/>
<text x="468" y="440" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#2563EB">如果是行业短信通道建议加入</text>
<text x="448" y="499" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">新通道:行业通道 E(CH-005) · 支持:移动 / 联通 / 电信</text>
<text x="448" y="541" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">将采用行业通道通用规则</text>
<text x="448" y="575" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#6B7280">最低100条成熟样本;5秒 ≥90%,20秒 ≥95%,1分钟 ≥98%。</text>
<text x="448" y="615" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">现在不加入,也可稍后从发送监控 → 监控通道中添加。</text>
<line x1="421" y1="655" x2="1359" y2="655" stroke="#E5E7EB" stroke-width="1"/>
<rect x="1058" y="678" width="118" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1072" y="701" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">暂不加入</text>
<rect x="1190" y="678" width="142" height="36" rx="6" fill="#2563EB" stroke="none"/>
<text x="1204" y="701" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#FFFFFF">加入监控</text>
<rect x="420" y="761" width="940" height="79" rx="6" fill="#FFFBEB" stroke="none"/>
<text x="440" y="792" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#B45309">加入失败状态:通道已保存,加入监控失败。</text>
<text x="440" y="821" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#B45309">仅重试加入监控,不重复创建通道;关闭弹窗保留原创建结果。</text>
<text x="276" y="943" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">触发点:服务端返回新ID之后。复制通道不继承原通道监控身份。</text>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

@@ -0,0 +1,198 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="1000" viewBox="0 0 1600 1000">
<title>发送监控页面重做 · 静态设计原型(全部为示例数据)</title>
<rect x="0" y="0" width="1600" height="1000" rx="0" fill="#F6F7F9" stroke="none"/>
<rect x="0" y="0" width="248" height="1000" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="248" y1="0" x2="248" y2="1000" stroke="#E5E7EB" stroke-width="1"/>
<rect x="24" y="24" width="38" height="38" rx="8" fill="#EFF6FF" stroke="none"/>
<text x="31" y="54" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="600" fill="#2563EB"></text>
<text x="74" y="41" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#111827">聆界短信管理平台</text>
<text x="74" y="61" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">平台运营工作区</text>
<text x="28" y="117" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">运营概览</text>
<rect x="29" y="136" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="148" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">运营看板</text>
<rect x="16" y="171" width="216" height="40" rx="6" fill="#EFF6FF" stroke="none"/>
<rect x="16" y="171" width="3" height="40" rx="0" fill="#2563EB" stroke="none"/>
<rect x="29" y="180" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#2563EB"/>
<text x="56" y="192" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#2563EB">发送监控</text>
<rect x="29" y="224" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="236" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">网关异常</text>
<rect x="29" y="268" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="280" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">签名质量检测</text>
<text x="28" y="339" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">客户管理</text>
<rect x="29" y="358" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="370" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业管理</text>
<rect x="29" y="402" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="414" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业应用管理</text>
<rect x="29" y="446" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="458" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业签名管理</text>
<rect x="29" y="490" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="502" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">企业模板管理</text>
<text x="28" y="561" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">短信业务</text>
<rect x="29" y="580" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="592" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信通道</text>
<rect x="29" y="624" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="636" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">短信记录</text>
<rect x="29" y="668" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="680" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">任务进度</text>
<text x="28" y="739" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">系统管理</text>
<rect x="29" y="758" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="770" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">用户管理</text>
<rect x="29" y="802" width="14" height="14" rx="3" fill="#F8FAFC" stroke="#9CA3AF"/>
<text x="56" y="814" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">系统监控</text>
<text x="24" y="964" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">设计原型 · 非真实业务数据</text>
<rect x="249" y="0" width="1351" height="65" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="249" y1="65" x2="1600" y2="65" stroke="#E5E7EB" stroke-width="1"/>
<text x="276" y="37" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">运营概览 / 发送监控</text>
<rect x="1000" y="15" width="140" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1014" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">预警中心 6</text>
<rect x="1152" y="15" width="148" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1166" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">待审核任务</text>
<rect x="1312" y="15" width="152" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1326" y="38" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">报备任务提醒</text>
<text x="1500" y="40" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">管理员</text>
<text x="276" y="115" font-family="Microsoft YaHei, sans-serif" font-size="24" font-weight="600" fill="#111827">发送质量告警</text>
<text x="276" y="138" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">聚合异常指标,记录处理与恢复过程</text>
<rect x="1370" y="91" width="138" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1379" y="109" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">静态示例 · 待实施</text>
<rect x="276" y="180" width="808" height="724" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<rect x="298" y="203" width="66" height="25" rx="5" fill="#FEF2F2" stroke="none"/>
<text x="307" y="221" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#DC2626">异常持续</text>
<text x="408" y="225" font-family="Microsoft YaHei, sans-serif" font-size="18" font-weight="600" fill="#1F2937">行业通道 A × 移动</text>
<text x="298" y="263" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">事件 AL-EXAMPLE-001 · 开始于12:30 · 最近评估12:35</text>
<rect x="298" y="282" width="764" height="54" rx="6" fill="#FEF2F2" stroke="none"/>
<text x="314" y="314" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#DC2626">三个时效指标低于阈值,合并为一条活动告警。</text>
<text x="298" y="379" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">命中指标</text>
<text x="548" y="379" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">实际值</text>
<text x="704" y="379" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">最低值</text>
<text x="851" y="379" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="600" fill="#6B7280">成熟样本</text>
<text x="298" y="420" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">5秒到达率</text>
<text x="548" y="420" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#DC2626">83.97%</text>
<text x="704" y="420" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">90.00%</text>
<text x="851" y="420" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">1058 / 1260</text>
<line x1="298" y1="440" x2="1062" y2="440" stroke="#E5E7EB" stroke-width="1"/>
<text x="298" y="470" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">20秒到达率</text>
<text x="548" y="470" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#DC2626">94.00%</text>
<text x="704" y="470" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">95.00%</text>
<text x="851" y="470" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">1128 / 1200</text>
<line x1="298" y1="490" x2="1062" y2="490" stroke="#E5E7EB" stroke-width="1"/>
<text x="298" y="520" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">1分钟到达率</text>
<text x="548" y="520" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#DC2626">97.00%</text>
<text x="704" y="520" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">98.00%</text>
<text x="851" y="520" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="400" fill="#1F2937">1067 / 1100</text>
<line x1="298" y1="540" x2="1062" y2="540" stroke="#E5E7EB" stroke-width="1"/>
<text x="298" y="589" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">5秒到达率趋势</text>
<text x="798" y="589" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">实线:实际 / 虚线:阈值</text>
<line x1="350" y1="619" x2="1044" y2="619" stroke="#E5E7EB" stroke-width="1"/>
<line x1="350" y1="660" x2="1044" y2="660" stroke="#E5E7EB" stroke-width="1"/>
<line x1="350" y1="701" x2="1044" y2="701" stroke="#E5E7EB" stroke-width="1"/>
<line x1="350" y1="742" x2="1044" y2="742" stroke="#E5E7EB" stroke-width="1"/>
<text x="298" y="624" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">100%</text>
<text x="305" y="686" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">90%</text>
<text x="305" y="749" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">80%</text>
<line x1="350" y1="681" x2="357" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="363" y1="681" x2="370" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="376" y1="681" x2="383" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="389" y1="681" x2="396" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="402" y1="681" x2="409" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="415" y1="681" x2="422" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="428" y1="681" x2="435" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="441" y1="681" x2="448" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="454" y1="681" x2="461" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="467" y1="681" x2="474" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="480" y1="681" x2="487" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="493" y1="681" x2="500" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="506" y1="681" x2="513" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="519" y1="681" x2="526" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="532" y1="681" x2="539" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="545" y1="681" x2="552" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="558" y1="681" x2="565" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="571" y1="681" x2="578" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="584" y1="681" x2="591" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="597" y1="681" x2="604" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="610" y1="681" x2="617" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="623" y1="681" x2="630" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="636" y1="681" x2="643" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="649" y1="681" x2="656" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="662" y1="681" x2="669" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="675" y1="681" x2="682" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="688" y1="681" x2="695" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="701" y1="681" x2="708" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="714" y1="681" x2="721" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="727" y1="681" x2="734" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="740" y1="681" x2="747" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="753" y1="681" x2="760" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="766" y1="681" x2="773" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="779" y1="681" x2="786" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="792" y1="681" x2="799" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="805" y1="681" x2="812" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="818" y1="681" x2="825" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="831" y1="681" x2="838" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="844" y1="681" x2="851" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="857" y1="681" x2="864" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="870" y1="681" x2="877" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="883" y1="681" x2="890" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="896" y1="681" x2="903" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="909" y1="681" x2="916" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="922" y1="681" x2="929" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="935" y1="681" x2="942" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="948" y1="681" x2="955" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="961" y1="681" x2="968" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="974" y1="681" x2="981" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="987" y1="681" x2="994" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="1000" y1="681" x2="1007" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="1013" y1="681" x2="1020" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="1026" y1="681" x2="1033" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="1039" y1="681" x2="1046" y2="681" stroke="#DC2626" stroke-width="1"/>
<line x1="350.0" y1="631.4" x2="419.4" y2="634.5" stroke="#2563EB" stroke-width="3"/>
<line x1="419.4" y1="634.5" x2="488.8" y2="637.6" stroke="#2563EB" stroke-width="3"/>
<line x1="488.8" y1="637.6" x2="558.2" y2="634.5" stroke="#2563EB" stroke-width="3"/>
<line x1="558.2" y1="634.5" x2="627.6" y2="643.8" stroke="#2563EB" stroke-width="3"/>
<line x1="627.6" y1="643.8" x2="697.0" y2="650.0" stroke="#2563EB" stroke-width="3"/>
<line x1="697.0" y1="650.0" x2="766.4000000000001" y2="656.2" stroke="#2563EB" stroke-width="3"/>
<line x1="766.4000000000001" y1="656.2" x2="835.8000000000001" y2="668.6" stroke="#2563EB" stroke-width="3"/>
<line x1="835.8000000000001" y1="668.6" x2="905.2" y2="674.8" stroke="#2563EB" stroke-width="3"/>
<line x1="905.2" y1="674.8" x2="974.6" y2="718.386" stroke="#2563EB" stroke-width="3"/>
<line x1="974.6" y1="718.386" x2="1044.0" y2="718.386" stroke="#2563EB" stroke-width="3"/>
<text x="350" y="780" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">11:45</text>
<text x="558" y="780" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">12:00</text>
<text x="766" y="780" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">12:15</text>
<text x="999" y="780" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">12:35</text>
<line x1="277" y1="821" x2="1083" y2="821" stroke="#E5E7EB" stroke-width="1"/>
<rect x="298" y="846" width="120" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="312" y="869" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">查看样本</text>
<rect x="834" y="846" width="224" height="36" rx="6" fill="#2563EB" stroke="none"/>
<text x="848" y="869" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#FFFFFF">标记已读(非恢复)</text>
<rect x="1110" y="180" width="462" height="376" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1132" y="220" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">预警中心弹层示意</text>
<text x="1132" y="250" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">与既有消息提醒保持相同交互</text>
<rect x="1130" y="277" width="420" height="70" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1146" y="304" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#1F2937">安全检测与封禁</text>
<rect x="1496" y="287" width="30" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1505" y="305" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">0</text>
<text x="1146" y="332" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">暂无待处置告警</text>
<rect x="1130" y="360" width="420" height="70" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1146" y="387" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#1F2937">系统监控告警</text>
<rect x="1496" y="370" width="30" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1505" y="388" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">0</text>
<text x="1146" y="415" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">暂无活动告警</text>
<rect x="1130" y="443" width="420" height="70" rx="6" fill="#EFF6FF" stroke="#E5E7EB"/>
<text x="1146" y="470" font-family="Microsoft YaHei, sans-serif" font-size="15" font-weight="600" fill="#1F2937">发送质量告警</text>
<rect x="1496" y="453" width="30" height="25" rx="5" fill="#FEF2F2" stroke="none"/>
<text x="1505" y="471" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#DC2626">6</text>
<text x="1146" y="498" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">行业2 · 验证码1 · 整体兜底3</text>
<rect x="1110" y="580" width="462" height="324" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="1132" y="619" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">事件时间线</text>
<rect x="1132" y="645" width="78" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1141" y="663" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">12:30</text>
<text x="1212" y="663" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">首次异常</text>
<text x="1212" y="691" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">三项命中,创建1条事件</text>
<rect x="1132" y="725" width="78" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1141" y="743" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">12:35</text>
<text x="1212" y="743" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">持续异常</text>
<text x="1212" y="771" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">更新原事件,不重复刷屏</text>
<rect x="1132" y="805" width="42" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="1141" y="823" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">后续</text>
<text x="1212" y="823" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">连续2次正常后恢复</text>
<text x="1212" y="851" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">缺样本或数据延迟不算恢复</text>
<text x="276" y="955" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">未读状态按用户记录;同一异常多个窗口只计一个活动事件。所有数据均为设计示例。</text>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@@ -0,0 +1,60 @@
<svg xmlns="http://www.w3.org/2000/svg" width="390" height="844" viewBox="0 0 390 844">
<title>发送监控页面重做 · 静态设计原型(全部为示例数据)</title>
<rect x="0" y="0" width="390" height="844" rx="0" fill="#F6F7F9" stroke="none"/>
<rect x="0" y="0" width="390" height="58" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="0" y1="58" x2="390" y2="58" stroke="#E5E7EB" stroke-width="1"/>
<line x1="17" y1="22" x2="33" y2="22" stroke="#6B7280" stroke-width="2"/>
<line x1="17" y1="28" x2="33" y2="28" stroke="#6B7280" stroke-width="2"/>
<line x1="17" y1="34" x2="33" y2="34" stroke="#6B7280" stroke-width="2"/>
<text x="49" y="37" font-family="Microsoft YaHei, sans-serif" font-size="18" font-weight="600" fill="#111827">发送监控</text>
<rect x="255" y="18" width="66" height="25" rx="5" fill="#FEF2F2" stroke="none"/>
<text x="264" y="36" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#DC2626">预警 6</text>
<rect x="349" y="27" width="3" height="3" rx="1" fill="#6B7280" stroke="none"/>
<rect x="355" y="27" width="3" height="3" rx="1" fill="#6B7280" stroke="none"/>
<rect x="361" y="27" width="3" height="3" rx="1" fill="#6B7280" stroke="none"/>
<text x="16" y="103" font-family="Microsoft YaHei, sans-serif" font-size="22" font-weight="600" fill="#111827">整体兜底</text>
<rect x="246" y="80" width="90" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="255" y="98" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">静态设计示例</text>
<text x="16" y="129" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#6B7280">近30分钟 · 每10分钟评估</text>
<text x="16" y="168" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#6B7280">行业通道</text>
<text x="118" y="168" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#6B7280">验证码</text>
<text x="204" y="168" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#2563EB">整体兜底</text>
<text x="310" y="168" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#6B7280">告警</text>
<line x1="199" y1="183" x2="280" y2="183" stroke="#2563EB" stroke-width="3"/>
<rect x="16" y="202" width="358" height="73" rx="6" fill="#EFF6FF" stroke="none"/>
<text x="28" y="229" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#2563EB">以收到成功回执为准</text>
<text x="28" y="256" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#2563EB">未满时长仍在观察中,不计作失败。</text>
<rect x="16" y="290" width="107" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="30" y="313" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">筛选</text>
<rect x="132" y="290" width="116" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="146" y="313" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">阈值设置</text>
<rect x="257" y="290" width="117" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="271" y="313" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">刷新</text>
<text x="16" y="356" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">12:00 12:30 / 12:30:18更新</text>
<rect x="16" y="374" width="358" height="341" rx="8" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="32" y="408" font-family="Microsoft YaHei, sans-serif" font-size="16" font-weight="600" fill="#1F2937">示例零售 · 通知应用</text>
<text x="32" y="433" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">【示例商城】 · 应用×签名规则</text>
<rect x="269" y="390" width="66" height="25" rx="5" fill="#F3F4F6" stroke="none"/>
<text x="278" y="408" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="600" fill="#6B7280">样本不足</text>
<text x="32" y="467" font-family="Microsoft YaHei, sans-serif" font-size="13" font-weight="400" fill="#1F2937">窗口提交300条业务短信</text>
<line x1="32" y1="482" x2="358" y2="482" stroke="#E5E7EB" stroke-width="1"/>
<text x="32" y="510" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">1分钟</text>
<text x="232" y="514" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="600" fill="#15803D">88.62%</text>
<text x="122" y="534" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">257/290成熟 · 10条观察中</text>
<line x1="32" y1="547" x2="358" y2="547" stroke="#E5E7EB" stroke-width="1"/>
<text x="32" y="575" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">5分钟</text>
<text x="232" y="579" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="600" fill="#15803D">92.17%</text>
<text x="122" y="599" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">212/230成熟 · 70条观察中</text>
<line x1="32" y1="612" x2="358" y2="612" stroke="#E5E7EB" stroke-width="1"/>
<text x="32" y="640" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="600" fill="#1F2937">20分钟</text>
<text x="232" y="644" font-family="Microsoft YaHei, sans-serif" font-size="20" font-weight="600" fill="#6B7280">94.44%</text>
<text x="122" y="664" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">85/90成熟 · 210条观察中</text>
<text x="16" y="745" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">20分钟指标最低100条,当前90条。</text>
<text x="16" y="770" font-family="Microsoft YaHei, sans-serif" font-size="12" font-weight="400" fill="#6B7280">可评估项正常;不足项继续观察。</text>
<rect x="0" y="788" width="390" height="56" rx="0" fill="#FFFFFF" stroke="none"/>
<line x1="0" y1="788" x2="390" y2="788" stroke="#E5E7EB" stroke-width="1"/>
<rect x="16" y="798" width="171" height="36" rx="6" fill="#FFFFFF" stroke="#E5E7EB"/>
<text x="30" y="821" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#1F2937">查看趋势</text>
<rect x="201" y="798" width="173" height="36" rx="6" fill="#2563EB" stroke="none"/>
<text x="215" y="821" font-family="Microsoft YaHei, sans-serif" font-size="14" font-weight="400" fill="#FFFFFF">告警记录</text>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

@@ -0,0 +1,74 @@
# 发送监控重做:主要页面原型
配套需求:[发送监控页面重做方案](../../sending-monitor-redesign-plan-20260906.md)。
本目录为2026-09-06需求评审材料。全部名称、告警和指标均为设计示例,不含真实业务数据,不连接API,不代表功能已经实现或通过真实页面验收。桌面图为1600×1000,窄屏图为390×844;1366×768的适配要求在需求方案中说明,本轮未绘制该尺寸。
## 1. 行业通道监控
按通道×运营商展开;展示近5分钟窗口、更新时间、三项到达率、成功数/成熟分母、异常与样本不足状态。顶部进入监控通道选择和阈值设置;行内进入趋势或详情。通道纳管不影响发送路由。
行业/验证码图展示12:30初评,12:31补齐同一窗口最后一分钟的观察样本;初评/定稿合并处理,不能重复计连续告警次数。详见需求方案4.3节。
![行业通道监控](01-industry-monitor.png)
[可编辑SVG](01-industry-monitor.svg)
## 2. 验证码监控
按企业应用×签名展开,只统计最终提交内容含“验证码”的业务短信。复用行业监控的时间口径、筛选和详情布局;数据延迟明确显示为待更新,不填充正常指标。
![验证码监控](02-verification-monitor.png)
[可编辑SVG](02-verification-monitor.svg)
## 3. 整体兜底监控
暂按全部短信理解“兜底”,展示近30分钟、每10分钟评估的1/5/20分钟指标,以及当前生效规则来源。
首行采用应用×签名规则,最低100条、下限85%/90%/95%。前两项正常;20分钟成功85条、成熟90条,94.44%但尚不告警,另有210条观察中。该例用于说明三个指标的分母不同,不能用全窗口300条直接计算20分钟指标。
![整体兜底监控](03-overall-monitor.png)
[可编辑SVG](03-overall-monitor.svg)
## 4. 阈值与个性规则
完整规则优先级为:应用×签名 > 签名 > 企业应用 > 通用。左侧选择范围,右侧编辑最低样本、各指标下限及异常/恢复连续次数;保存前预览生效范围。恢复继承需要清晰说明将采用哪一套规则。保存失败保留输入,版本冲突提示重新加载。
![阈值与个性规则](04-threshold-rules.png)
[可编辑SVG](04-threshold-rules.svg)
## 5. 新建或复制通道后的纳管提示
仅在服务端创建成功、取得新通道ID之后出现。提示“是否加入行业通道监控?”并标注“如果是行业短信通道建议加入”。暂不加入不影响创建结果;加入失败只重试纳管,不重复创建通道。图下方的失败提示用于展示另一种状态,并非成功时同时弹出错误。
![通道纳管提示](05-channel-enrollment.png)
[可编辑SVG](05-channel-enrollment.svg)
## 6. 预警中心与告警详情
右上角预警中心新增“发送质量告警”,汇总行业、验证码、整体兜底三类;保留既有待审核任务和报备任务提醒入口。点击进入告警列表,再进入左侧详情。图中把弹层、详情和时间线并列,以便评审,实际弹层仍由顶部按钮打开。
同一维度多项异常合成一条活动事件,持续异常更新原事件;标记已读不等于恢复。阈值线、当时分母、首次/最近异常时间及规则版本应可追溯。
![预警中心与告警详情](06-alert-center-detail.png)
[可编辑SVG](06-alert-center-detail.svg)
## 7. 窄屏监控
折叠导航,将宽表转为指标卡;每项独立展示百分比、成熟样本、观察中条数。筛选和配置在抽屉中完成,保留刷新、趋势和告警入口。
![窄屏监控](07-mobile-monitor.png)
[可编辑SVG](07-mobile-monitor.svg)
## 文件维护与核验
- PNG用于直接评审,SVG保留文字和矢量形状,二者由同一绘制源生成。
- 绘制源:[render-prototypes.py](render-prototypes.py),依赖Python、Pillow及Windows微软雅黑字体;执行`python render-prototypes.py`只重建本目录七组PNG/SVG,不读取业务数据。
- 本轮检查图文内容、比例示例、图片尺寸、SVG可解析性和文档链接;原型不包含可操作的业务功能,也不代替后续三个尺寸的真实浏览器验收。
- 本目录未使用业务CSS,未修改应用样式或其他并行任务文件。
@@ -0,0 +1,318 @@
"""Standalone design artifacts only. No network, application state or business APIs.
Regenerates only the PNG/SVG files in this prototype directory.
Requires Pillow and Windows Microsoft YaHei fonts.
"""
from pathlib import Path
from html import escape
from PIL import Image, ImageDraw, ImageFont
ROOT = Path(__file__).resolve().parent
FONT = Path('C:/Windows/Fonts/msyh.ttc')
BOLD = Path('C:/Windows/Fonts/msyhbd.ttc')
C = dict(bg='#F6F7F9', white='#FFFFFF', text='#1F2937', title='#111827', muted='#6B7280',
line='#E5E7EB', blue='#2563EB', soft='#EFF6FF', red='#DC2626', redbg='#FEF2F2',
green='#15803D', greenbg='#F0FDF4', amber='#B45309', amberbg='#FFFBEB')
fonts = {}
class Canvas:
def __init__(self, w=1600, h=1000):
self.w, self.h = w, h
self.im = Image.new('RGB', (w, h), C['bg'])
self.d = ImageDraw.Draw(self.im)
self.svg = [f'<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="{h}" viewBox="0 0 {w} {h}">',
'<title>发送监控页面重做 · 静态设计原型(全部为示例数据)</title>']
self.rect(0, 0, w, h, C['bg'])
self.overflow = []
def rect(self, x, y, w, h, fill=None, stroke=None, radius=0):
fill = fill or C['white']
self.d.rounded_rectangle((x, y, x+w, y+h), radius=radius, fill=fill, outline=stroke)
self.svg.append(f'<rect x="{x}" y="{y}" width="{w}" height="{h}" rx="{radius}" fill="{fill}" stroke="{stroke or "none"}"/>')
def line(self, x1, y1, x2, y2, color=None, width=1):
color = color or C['line']
self.d.line((x1, y1, x2, y2), fill=color, width=width)
self.svg.append(f'<line x1="{x1}" y1="{y1}" x2="{x2}" y2="{y2}" stroke="{color}" stroke-width="{width}"/>')
def text(self, x, y, s, size=14, color=None, bold=False, maxw=None):
key = (size, bold)
if key not in fonts:
fonts[key] = ImageFont.truetype(str(BOLD if bold else FONT), size)
font = fonts[key]
width = self.d.textlength(s, font=font)
if (maxw is not None and width > maxw) or x+width > self.w or y+size > self.h:
self.overflow.append((s, round(width, 1), maxw))
color = color or C['text']
self.d.text((x, y), s, font=font, fill=color, anchor='lt')
self.svg.append(f'<text x="{x}" y="{y+size}" font-family="Microsoft YaHei, sans-serif" font-size="{size}" font-weight="{600 if bold else 400}" fill="{color}">{escape(s)}</text>')
def button(self, x, y, w, label, primary=False):
self.rect(x,y,w,36,C['blue'] if primary else C['white'],None if primary else C['line'],6)
self.text(x+14,y+9,label,14,C['white'] if primary else C['text'],maxw=w-22)
def badge(self, x, y, label, tone='blue'):
palettes = {'blue':(C['soft'],C['blue']),'red':(C['redbg'],C['red']),
'green':(C['greenbg'],C['green']),'gray':('#F3F4F6',C['muted']),
'amber':(C['amberbg'],C['amber'])}
bg,fg=palettes[tone]
w= len(label)*12+18
self.rect(x,y,w,25,bg,radius=5)
self.text(x+9,y+6,label,12,fg,bold=True)
def save(self, name):
if self.overflow:
raise RuntimeError(f'{name}: overflowing text: {self.overflow}')
self.im.save(ROOT/(name+'.png'))
(ROOT/(name+'.svg')).write_text('\n'.join(self.svg+['</svg>']),encoding='utf-8')
print(name, f'{self.w}x{self.h}', 'OK')
def shell(c, title='发送监控', subtitle='监测时效变化,定位异常通道与应用签名'):
c.rect(0,0,248,c.h,C['white']); c.line(248,0,248,c.h)
c.rect(24,24,38,38,C['soft'],radius=8); c.text(31,32,'',22,C['blue'],True)
c.text(74,25,'聆界短信管理平台',16,C['title'],True); c.text(74,49,'平台运营工作区',12,C['muted'])
sections=[('运营概览',['运营看板','发送监控','网关异常','签名质量检测']),
('客户管理',['企业管理','企业应用管理','企业签名管理','企业模板管理']),
('短信业务',['短信通道','短信记录','任务进度']),('系统管理',['用户管理','系统监控'])]
y=105
for group,items in sections:
c.text(28,y,group,12,C['muted'],True); y+=29
for item in items:
if item=='发送监控':
c.rect(16,y-7,216,40,C['soft'],radius=6); c.rect(16,y-7,3,40,C['blue'])
c.rect(29,y+2,14,14,'#F8FAFC',C['blue'] if item=='发送监控' else '#9CA3AF',3)
c.text(56,y,item,14,C['blue'] if item=='发送监控' else C['text'],item=='发送监控')
y+=44
y+=17
c.text(24,952,'设计原型 · 非真实业务数据',12,C['muted'])
c.rect(249,0,1351,65,C['white']); c.line(249,65,1600,65)
c.text(276,24,'运营概览 / 发送监控',13,C['muted'])
c.button(1000,15,140,'预警中心 6'); c.button(1152,15,148,'待审核任务'); c.button(1312,15,152,'报备任务提醒')
c.text(1500,27,'管理员',13,C['muted'])
c.text(276,91,title,24,C['title'],True); c.text(276,125,subtitle,13,C['muted'])
c.badge(1370,91,'静态示例 · 待实施','gray')
def tabbar(c, selected):
tabs=['行业通道','验证码','整体兜底','告警记录']
for i,t in enumerate(tabs):
x=276+i*134
c.text(x+8,192,t,15,C['blue'] if i==selected else C['muted'],i==selected)
if i==selected: c.line(x,223,x+100,223,C['blue'],3)
c.line(276,225,1572,225)
CHANNEL = [
('行业通道 A','CH-001 · 移动',1280,[(1058,1260),(1128,1200),(1067,1100)],'异常','通用规则'),
('行业通道 A','CH-001 · 联通',920,[(874,900),(856,880),(813,820)],'正常','通用规则'),
('行业通道 B','CH-002 · 电信',760,[(680,740),(666,700),(640,650)],'正常','通用规则'),
('行业通道 C','CH-003 · 移动',68,[(56,60),(53,55),(45,46)],'样本不足','通用规则'),
('行业通道 D','CH-004 · 联通',430,[(310,420),(362,400),(348,360)],'异常','通用规则')]
OTP = [
('示例零售 · 登录应用','【示例商城】',1280,[(1058,1260),(1128,1200),(1067,1100)],'异常','验证码通用'),
('示例服务 · 用户中心','【示例服务】',920,[(874,900),(856,880),(813,820)],'正常','验证码通用'),
('示例物流 · 商户应用','【示例物流】',760,[(680,740),(666,700),(640,650)],'正常','验证码通用'),
('示例教育 · 学员登录','【示例学堂】',68,[(56,60),(53,55),(45,46)],'样本不足','验证码通用'),
('示例平台 · 会员应用','【示例会员】',0,[], '数据延迟','验证码通用')]
FALLBACK = [
('示例零售 · 通知应用','【示例商城】',300,[(257,290),(212,230),(85,90)],'样本不足','应用×签名'),
('示例服务 · 业务应用','【示例服务】',2500,[(2115,2350),(1940,2000),(950,1000)],'异常','签名规则'),
('示例物流 · 商户应用','【示例物流】',1800,[(1666,1700),(1485,1500),(895,900)],'正常','应用规则'),
('示例教育 · 通知应用','【示例学堂】',630,[(558,600),(478,500),(238,240)],'正常','通用规则'),
('示例平台 · 消息应用','【示例会员】',0,[], '数据延迟','通用规则')]
def overview(kind):
c=Canvas(); shell(c); tabbar(c,kind)
title=['行业通道监控','验证码监控','整体兜底监控'][kind]
c.rect(276,150,1296,28,C['soft'],radius=5)
note='以平台收到成功回执为准;未满观察时长的短信不参与该指标评估。'
if kind==1: note='仅统计最终正文包含“验证码”的业务短信;补发不重复计数,以成功回执为准。'
if kind==2: note='近30分钟整体监控;1 / 5 / 20分钟分别使用成熟分母,不将新提交短信计作失败。'
c.text(288,157,note,12,C['blue'])
c.button(1210,183,80,'刷新'); c.button(1300,183,118,'阈值设置')
c.button(1428,183,144,'监控通道' if kind==0 else '运行概况',kind==0)
values=[('监控维度','16' if kind==0 else '48','通道 × 运营商' if kind==0 else '企业应用 × 签名'),
('异常维度','2' if kind==0 else '1','点击仅看异常'),('样本不足','3','不足最低成熟条数'),
('窗口提交量','3,458' if kind==0 else ('3,028' if kind==1 else '5,230'),'次发送尝试' if kind==0 else '条业务短信')]
for i,(lab,val,desc) in enumerate(values):
x=276+i*330; c.rect(x,246,306,97,C['white'],C['line'],8)
c.text(x+18,260,lab,13,C['muted']); c.text(x+18,286,val,28,C['red'] if i==1 else C['title'],True)
c.text(x+115,300,desc,12,C['muted'])
c.rect(276,363,1296,72,C['white'],C['line'],8)
c.text(294,378,'统计窗口',12,C['muted']); c.text(294,401,'12:00 12:30' if kind==2 else '12:25 12:30',14,C['text'],True)
c.text(490,378,'评估时刻 12:30:00',12,C['muted']); c.text(490,401,'每10分钟评估' if kind==2 else '初评 · 12:31补齐',13)
c.text(686,378,'更新于 12:30:18',12,C['muted']); c.text(686,401,'查看最近2小时趋势',13,C['blue'])
c.button(934,382,168,'搜索通道 / 编号' if kind==0 else '企业 / 应用'); c.button(1114,382,168,'运营商:全部' if kind==0 else '搜索签名'); c.button(1294,382,152,'状态:全部')
c.rect(276,455,1296,462,C['white'],C['line'],8)
c.rect(277,456,1294,47,'#F9FAFB',radius=7)
xs=[294,574,727,889,1051,1220,1384]
headers=['通道 / 运营商' if kind==0 else '企业应用 / 签名','窗口提交',
'1分钟到达率' if kind==2 else '5秒到达率','5分钟到达率' if kind==2 else '20秒到达率',
'20分钟到达率' if kind==2 else '1分钟到达率','状态 / 规则','操作']
for x,h in zip(xs,headers): c.text(x,472,h,13,C['muted'],True)
data=[CHANNEL,OTP,FALLBACK][kind]
for i,(name,sub,total,metrics,state,rule) in enumerate(data):
y=504+i*75
if state=='异常': c.rect(277,y,1294,74,'#FFFBFB')
c.text(xs[0],y+16,name,14,bold=True,maxw=265); c.text(xs[0],y+40,sub,12,C['muted'])
c.text(xs[1],y+19,f'{total:,}' if metrics else '',16,bold=True)
if metrics:
for j,(s,n) in enumerate(metrics):
x=xs[2+j]; minimum=100
thresholds = [.85,.90,.95] if kind==2 and i==0 else [.90,.95,.98]
low=s/n < thresholds[j]
tone=C['muted'] if n<minimum else (C['red'] if low else C['green'])
c.text(x,y+15,f'{s/n*100:.2f}%',19,tone,True)
c.text(x,y+43,f'{s:,} / {n:,} 成熟',12,C['muted'])
else:
for j in range(3): c.text(xs[2+j],y+20,'— 待更新',14,C['muted'])
tone={'正常':'green','异常':'red','样本不足':'gray','数据延迟':'amber'}[state]
c.badge(xs[5],y+11,state,tone); c.text(xs[5],y+44,rule,12,C['muted'])
c.text(xs[6],y+27,'趋势 / 详情',13,C['blue'])
c.line(277,y+74,1571,y+74)
c.text(294,892,'每个指标独立校验成熟样本;百分比下方为成功数 / 可评估数。',12,C['muted'])
c.text(1274,892,'展示5行 ‹ 1 2 3 ›',12,C['muted'])
c.text(276,940,title+' · 图中所有数值仅用于需求评审',12,C['muted'])
if kind==2: c.text(276,969,'示例首行:20分钟指标85/90,最低100条,尚不触发告警;另有210条观察中。',12,C['blue'])
return c
def policy():
c=Canvas(); shell(c,'告警阈值设置','整体兜底 · 通用规则与个性规则');
c.button(1458,126,114,'返回监控')
c.rect(276,176,600,706,C['white'],C['line'],8)
c.text(298,199,'生效优先级',16,bold=True)
c.rect(298,231,554,43,C['soft'],radius=6)
c.text(312,244,'应用×签名 > 签名 > 应用 > 通用',15,C['blue'],True)
c.text(298,291,'命中最高优先级后,整套规则覆盖。',13,C['muted'])
c.text(298,332,'规则列表',16,bold=True); c.button(730,320,122,'新增规则',True)
rules=[('应用×签名','通知应用 / 【示例商城】','100条 · 85% / 90% / 95%'),
('签名','【示例服务】','100条 · 90% / 95% / 98%'),
('应用','商户应用','100条 · 90% / 95% / 98%'),
('通用','全部未覆盖对象','100条 · 90% / 95% / 98%')]
for i,(scope,obj,value) in enumerate(rules):
y=373+i*98
c.rect(298,y,554,83,C['soft'] if i==0 else C['white'],C['blue'] if i==0 else C['line'],6)
c.badge(313,y+12,scope,'blue' if i==0 else 'gray'); c.text(426,y+16,obj,14,bold=True)
c.text(426,y+48,value,12,C['muted'])
c.text(298,793,'实际生效示例',14,bold=True)
c.text(298,823,'示例零售 / 通知应用 / 【示例商城】',13)
c.text(298,847,'采用应用×签名规则,覆盖下层通用设置。',13,C['blue'])
c.rect(900,176,672,706,C['white'],C['line'],8)
c.text(925,199,'编辑个性规则',18,bold=True); c.badge(1398,198,'草稿 · 未保存','amber')
labels=[('作用范围','企业应用 × 签名'),('企业 / 应用','示例零售 / 通知应用'),('签名','【示例商城】')]
for i,(lab,value) in enumerate(labels):
y=246+i*67; c.text(925,y,lab,13,C['muted']); c.rect(1085,y-8,455,38,'#FAFAFA',C['line'],5); c.text(1097,y+3,value,14)
c.line(925,445,1540,445)
c.text(925,469,'最低成熟条数',14,bold=True); c.rect(1170,458,160,40,C['white'],C['line'],5); c.text(1183,471,'100',16); c.text(1340,473,'条 / 每项指标',13,C['muted'])
c.text(925,508,'仅有样本数达到门槛的指标才参与告警。',12,C['muted'])
for i,(label,val) in enumerate([('1分钟到达率下限','85.00'),('5分钟到达率下限','90.00'),('20分钟到达率下限','95.00')]):
y=548+i*54; c.rect(925,y+1,18,18,C['blue'],radius=3)
c.line(929,y+10,933,y+14,C['white'],2); c.line(933,y+14,939,y+6,C['white'],2); c.text(954,y+3,label,14)
c.rect(1280,y-7,260,38,C['white'],C['line'],5); c.text(1293,y+3,val+' %',15)
c.text(925,718,'连续异常 1 次触发 · 连续恢复 2 次关闭',13)
c.text(925,750,'预计下周期生效;旧告警记录保留原规则版本。',12,C['muted'])
c.line(901,791,1571,791)
c.button(925,817,120,'恢复继承'); c.button(1300,817,80,'取消'); c.button(1392,817,148,'保存规则',True)
c.text(276,920,'交互说明:保存失败保留输入;版本冲突重新加载;未保存离开须确认。',13,C['muted'])
return c
def join_dialog():
c=Canvas(); shell(c,'短信通道','新建 / 复制通道保存成功之后,独立询问是否纳管')
c.rect(276,180,1296,713,C['white'],C['line'],8)
c.badge(298,202,'通道已保存','green'); c.text(420,207,'行业通道 E · 新通道编号 CH-005',14,bold=True)
c.text(298,249,'创建结果已生效。加入监控不会修改通道价格、连接或路由。',13,C['muted'])
c.rect(426,316,940,421,'#F3F4F6',radius=9)
c.rect(420,310,940,421,C['white'],'#D1D5DB',8)
c.text(448,335,'是否加入行业通道监控?',22,C['title'],True); c.text(1313,335,'×',23,C['muted'])
c.line(421,386,1359,386)
c.rect(448,409,884,48,C['soft'],radius=6); c.text(468,424,'如果是行业短信通道建议加入',16,C['blue'],True)
c.text(448,484,'新通道:行业通道 E(CH-005) · 支持:移动 / 联通 / 电信',15)
c.text(448,527,'将采用行业通道通用规则',14,bold=True)
c.text(448,561,'最低100条成熟样本;5秒 ≥90%20秒 ≥95%1分钟 ≥98%',14,C['muted'])
c.text(448,602,'现在不加入,也可稍后从发送监控 → 监控通道中添加。',13,C['muted'])
c.line(421,655,1359,655); c.button(1058,678,118,'暂不加入'); c.button(1190,678,142,'加入监控',True)
c.rect(420,761,940,79,C['amberbg'],radius=6)
c.text(440,778,'加入失败状态:通道已保存,加入监控失败。',14,C['amber'],True)
c.text(440,808,'仅重试加入监控,不重复创建通道;关闭弹窗保留原创建结果。',13,C['amber'])
c.text(276,930,'触发点:服务端返回新ID之后。复制通道不继承原通道监控身份。',13,C['muted'])
return c
def alerts():
c=Canvas(); shell(c,'发送质量告警','聚合异常指标,记录处理与恢复过程')
c.rect(276,180,808,724,C['white'],C['line'],8)
c.badge(298,203,'异常持续','red'); c.text(408,207,'行业通道 A × 移动',18,bold=True)
c.text(298,250,'事件 AL-EXAMPLE-001 · 开始于12:30 · 最近评估12:35',13,C['muted'])
c.rect(298,282,764,54,C['redbg'],radius=6)
c.text(314,299,'三个时效指标低于阈值,合并为一条活动告警。',15,C['red'],True)
xs=[298,548,704,851]
for x,t in zip(xs,['命中指标','实际值','最低值','成熟样本']): c.text(x,366,t,13,C['muted'],True)
for i,(lab,val,limit,count) in enumerate([('5秒到达率','83.97%','90.00%','1058 / 1260'),('20秒到达率','94.00%','95.00%','1128 / 1200'),('1分钟到达率','97.00%','98.00%','1067 / 1100')]):
y=405+i*50
for j,(x,t) in enumerate(zip(xs,[lab,val,limit,count])): c.text(x,y,t,15,C['red'] if j==1 else C['text'],j==1)
c.line(298,y+35,1062,y+35)
c.text(298,573,'5秒到达率趋势',16,bold=True); c.text(798,577,'实线:实际 / 虚线:阈值',12,C['muted'])
for i in range(4): c.line(350,619+i*41,1044,619+i*41)
c.text(298,612,'100%',12,C['muted']); c.text(305,674,'90%',12,C['muted']); c.text(305,737,'80%',12,C['muted'])
for x in range(350,1044,13): c.line(x,681,x+7,681,C['red'],1)
points=[(350+i*69.4,619+(100-v)*6.2) for i,v in enumerate([98,97.5,97,97.5,96,95,94,92,91,83.97,83.97])]
for (x1,y1),(x2,y2) in zip(points,points[1:]): c.line(x1,y1,x2,y2,C['blue'],3)
for x,t in [(350,'11:45'),(558,'12:00'),(766,'12:15'),(999,'12:35')]: c.text(x,768,t,12,C['muted'])
c.line(277,821,1083,821); c.button(298,846,120,'查看样本'); c.button(834,846,224,'标记已读(非恢复)',True)
c.rect(1110,180,462,376,C['white'],C['line'],8)
c.text(1132,204,'预警中心弹层示意',16,bold=True); c.text(1132,238,'与既有消息提醒保持相同交互',12,C['muted'])
for i,(lab,count,desc) in enumerate([('安全检测与封禁','0','暂无待处置告警'),('系统监控告警','0','暂无活动告警'),('发送质量告警','6','行业2 · 验证码1 · 整体兜底3')]):
y=277+i*83
c.rect(1130,y,420,70,C['soft'] if i==2 else C['white'],C['line'],6)
c.text(1146,y+12,lab,15,bold=True); c.badge(1496,y+10,count,'red' if i==2 else 'gray')
c.text(1146,y+43,desc,12,C['muted'])
c.rect(1110,580,462,324,C['white'],C['line'],8)
c.text(1132,603,'事件时间线',16,bold=True)
for i,(time,status,desc) in enumerate([('12:30','首次异常','三项命中,创建1条事件'),('12:35','持续异常','更新原事件,不重复刷屏'),('后续','连续2次正常后恢复','缺样本或数据延迟不算恢复')]):
y=645+i*80; c.badge(1132,y,time,'gray'); c.text(1212,y+4,status,14,bold=True,maxw=338); c.text(1212,y+34,desc,12,C['muted'],maxw=330)
c.text(276,942,'未读状态按用户记录;同一异常多个窗口只计一个活动事件。所有数据均为设计示例。',13,C['muted'])
return c
def mobile():
c=Canvas(390,844)
c.rect(0,0,390,58,C['white']); c.line(0,58,390,58)
for y in [22,28,34]: c.line(17,y,33,y,C['muted'],2)
c.text(49,19,'发送监控',18,C['title'],True)
c.badge(255,18,'预警 6','red')
for x in [349,355,361]: c.rect(x,27,3,3,C['muted'],radius=1)
c.text(16,81,'整体兜底',22,C['title'],True); c.badge(246,80,'静态设计示例','gray')
c.text(16,116,'近30分钟 · 每10分钟评估',13,C['muted'])
for i,t in enumerate(['行业通道','验证码','整体兜底','告警']):
x=[16,118,204,310][i]; c.text(x,154,t,14,C['blue'] if i==2 else C['muted'],i==2)
c.line(199,183,280,183,C['blue'],3)
c.rect(16,202,358,73,C['soft'],radius=6)
c.text(28,215,'以收到成功回执为准',14,C['blue'],True)
c.text(28,244,'未满时长仍在观察中,不计作失败。',12,C['blue'])
c.button(16,290,107,'筛选'); c.button(132,290,116,'阈值设置'); c.button(257,290,117,'刷新')
c.text(16,344,'12:00 12:30 / 12:30:18更新',12,C['muted'])
c.rect(16,374,358,341,C['white'],C['line'],8)
c.text(32,392,'示例零售 · 通知应用',16,bold=True); c.text(32,421,'【示例商城】 · 应用×签名规则',12,C['muted'])
c.badge(269,390,'样本不足','gray'); c.text(32,454,'窗口提交300条业务短信',13)
rows=[('1分钟','88.62%','257/290成熟 · 10条观察中'),('5分钟','92.17%','212/230成熟 · 70条观察中'),('20分钟','94.44%','85/90成熟 · 210条观察中')]
for i,(label,val,desc) in enumerate(rows):
y=486+i*65; c.line(32,y-4,358,y-4); c.text(32,y+10,label,14,bold=True); c.text(232,y+8,val,20,C['muted'] if i==2 else C['green'],True)
c.text(122,y+36,desc,12,C['muted'],maxw=236)
c.text(16,733,'20分钟指标最低100条,当前90条。',12,C['muted'])
c.text(16,758,'可评估项正常;不足项继续观察。',12,C['muted'])
c.rect(0,788,390,56,C['white']); c.line(0,788,390,788)
c.button(16,798,171,'查看趋势'); c.button(201,798,173,'告警记录',True)
return c
if __name__ == '__main__':
ROOT.mkdir(parents=True,exist_ok=True)
for i,n in enumerate(['01-industry-monitor','02-verification-monitor','03-overall-monitor']): overview(i).save(n)
policy().save('04-threshold-rules')
join_dialog().save('05-channel-enrollment')
alerts().save('06-alert-center-detail')
mobile().save('07-mobile-monitor')
@@ -0,0 +1,27 @@
# 报备状态变化站内通知
2026-09-06;状态:实施中。补充报备工作台设计,不替代既有状态记录。
## 业务规则
签名和每条引流信息独立计算移动、联通、电信的全国通道报备覆盖。通道必须启用、发送地区为全国并支持该运营商;签名的运营商专属报备覆盖同通道旧版全通道报备,不能用被覆盖的历史成功抵消新的失败。引流按自己的报备任务计算,不借用签名成功。
从零网成功开始记住一次变化过程,允许分次经过一网、两网成功;首次达到三网成功创建一条不可变站内事件。重复导入和三网状态重复保存不重复通知。只有再次回到零网成功才开启下一轮;三网降到两网再恢复不重复通知。存量状态只建基线,不追发历史通知。此处是报备覆盖通知,不保证余额、路由、风控等其他发送条件通过。
每个事件同时对平台运营人员和所属企业可见,企业按北京时间自然小时汇总。阅读状态按用户保存已读汇总版本;同小时追加事件后重新显示未读。不发送短信、邮件或第三方消息。通道组改动是否使资料重新进入待生成池是本轮独立调查项,不由通知改动顺便调整。
## 数据与事务
PostgreSQL 保存对象状态、不可变事件、企业小时汇总及用户阅读游标。报备任务触发器覆盖人工状态修改、导入、删除等全部写入口;在同一事务内按对象加锁、计算覆盖、推进状态、写事件及递增小时版本。回滚同时撤销通知,失败明确使状态写入失败,避免假成功。触发器只在报备任务写路径执行,不接入短信发送热路径。
迁移仅增加表、索引、函数和触发器,不回填虚假通知。通知保存企业、应用、签名和引流名称快照,删除或重命名不破坏历史展示;不存短信正文、手机号或验证码。
## API 与页面
`GET /api/{admin|client}/report-notifications` 分页企业小时汇总,`GET /:id` 分页查看该小时事件,`GET /summary` 返回个人未读小时数,`POST /:id/read` 携带已展示版本幂等标记已读。分页最大100;非法页码、版本返回400。运营必须平台管理员;客户企业由已验证会话确定,越权详情与不存在同为404,拒绝伪造租户。
运营“状态记录”保留原有筛选与详情,新增 URL 页签 `tab=readiness`。“报备任务提醒”增加“报备状态变化通知”跳转此页签。客户端新增“消息通知”页及导航入口。两端展示未读、企业/小时、签名/引流条数及展开明细;加载、失败、无通知有独立状态,读取失败不伪造已读。
## 验收
真实 PostgreSQL 隔离事务覆盖零→部分→全部、重复、回零再恢复、并发、回滚、历史基线、三网通道专属优先、省通道排除、引流独立;真实 API 验证双端会话、租户隔离、分页、小时聚合与按版本阅读。浏览器覆盖三尺寸、刷新、路由页签、详情与失败状态。部署仅测试环境,保留独立恢复资产。
@@ -0,0 +1,313 @@
# 发送监控页面重做:需求、统计口径与页面方案
- 版本:V1.0实施版,2026-09-06。
- 状态:2026-09-06用户授权实施中;原型中的名称、条数和比率全部为设计示例。
- 本轮范围:用户已授权按方案修改、提交、推送、部署测试环境;默认阈值留空。原设计阶段及当前验证边界分别见第11、12节和testing-progress。
- 原型入口:[原型说明](prototypes/sending-monitor-20260906/README.md)。
## 1. 目标与页面定位
将运营端 `/admin/monitor` 从通道清单和总体数量页改为发送质量监控工作台:运营人员能快速回答“哪个通道/哪个应用签名发送异常、哪个时效指标下降、样本够不够、何时发生、采用什么阈值”。
提供三种监控,并将异常集中展示到右上角现有“预警中心”:
| 监控类型 | 聚合维度 | 执行频率 | 每次选取的提交窗口 | 指标 |
|---|---|---|---|---|
| 行业通道监控 | 通道 × 运营商 | 每5分钟 | 最近5分钟 | 5秒、20秒、1分钟到达率 |
| 验证码监控 | 企业应用 × 签名(含企业隔离键) | 每5分钟 | 最近5分钟,最终发送正文包含“验证码” | 5秒、20秒、1分钟到达率 |
| 整体兜底监控 | 企业应用 × 签名(含企业隔离键) | 每10分钟 | 最近30分钟 | 1分钟、5分钟、20分钟到达率 |
这是按固定周期评估的准实时业务监控,不宣称秒级持续告警。“刷新页面”刷新已计算的最新快照,不重启全量统计;界面同时展示样本窗口、评估时刻、最近计算时间和数据是否延迟。
系统监控 `/admin/system-monitoring` 继续负责CPU、内存、磁盘及服务指标;数据统计/签名质量报表继续承担长周期报表。不得把三类页面的分母和统计口径互相替换。
## 2. 原需求解释与待确认点
以下是为使方案可实施而采用的建议,不视为用户已确认:
1. “5到达率”按“5分钟到达率”处理。
2. “兜底”暂指**全部短信的整体质量兜底**,包含验证码和行业短信,与前两类监控允许重叠;不是仅筛选补发或兜底通道。若实际意图是后者,必须先定义哪些通道/重试事件属于兜底,并在发送事实中冻结标记,不能仅凭最终channelId推断。
3. “提交”建议指首次实际发往上游的 Submit,不包括尚在平台排队、定时未到、审核未通过或路由前拦截的消息。用户提交至平台的排队时长另作辅助信息,不混进供应商回执时延;若要验证码端到端SLA,应另加“平台受理起算”指标。
4. “到达”采用**平台收到有效成功回执**的可观测口径。页面可保留用户熟悉的“5秒到达率”等列名,但须常驻说明“以平台收到成功回执为准”。不等于终端实测到达或用户已读。
5. 各指标下限、最低样本量初始值待根据真实基线确定。原型中的100条、90%/95%/98%等只是示例,不作为生产默认值或行业标准自动启用。
6. 未满观察时长的短信不计为失败;采用第4节的按指标成熟样本口径。同一行三个指标可有不同分母,必须明确展示。
## 3. 当前实现核对与差距
本轮只读基线:2026-09-06`main / 69e3d73`,本地相对跟踪`origin/main`领先2项;`ls-remote`回读远端为`442dda711d5c9f778f3f76fd6d8fd69f14414ce6`。工作区有其他任务的文档修改及草稿,均未作为本轮成果或纳入原型数据。未连接PostgreSQL、Redis或服务器,因此下列是代码事实,性能数字仅为设计目标。
| 位置 | 当前代码事实 | 本次设计影响 |
|---|---|---|
| [AdminMonitorPage.tsx](../src/apps/admin/AdminMonitorPage.tsx) | 调用通道列表和listMonitor,展示运行通道、总体成功率、消息总量;手动刷新 | 没有三类时效窗口、监控范围与告警策略 |
| [uplink.queries.ts](../api/src/operations/queries/uplink.queries.ts) 的monitor | 按messageWhere分组当前状态,另读最近消息/回执/上行;本页调用未提供有界时间窗口 | 不应让新自动刷新继续触发全表总体聚合 |
| [AdminLayout.tsx](../src/layouts/AdminLayout.tsx) | 全局用轻量接口轮询;预警中心含安全和系统告警;另有待审与报备任务提醒 | 新发送质量告警加入预警中心,不放入报备任务提醒,不复用重型dashboard接口 |
| [schema.prisma](../api/prisma/schema.prisma) | 有SmsMessageRecord、SmsSubmitRecord、分片审计、SmsReceiptRecord与UpstreamReceiptInbox | 能关联业务消息、发送尝试、分片和回执;还没有本方案的规则、快照与告警实体 |
| [upstream/submit.go](../gateway/internal/upstream/submit.go) | submitResult中的SubmittedAt为结果构造时刻,submitPart内才发生SendReqPkt | 现有submittedAt不能未经验证就当作最初发包时间计算5秒指标 |
| [upstream/deliver.go](../gateway/internal/upstream/deliver.go) | 回执事件DeliveredAt赋值time.Now().UTC() | 这是Gateway收到回执的时间,不是供应商DoneTime;不能将字段名直接理解为终端时间 |
| [send-receipt.service.ts](../api/src/send-chain/send-receipt.service.ts) | 入站回执持久化到Inbox,再匹配处理;重复回执有receiptKey | 复用现有持久化与匹配结果,区分Gateway接收时间和API处理时间,避免处理积压扭曲5秒指标 |
旧需求[5.10运营看板与监控](first-version-development-requirements.md)及[TC-ADMIN-011](system-functional-test-cases.md)还要求发送趋势、最近发送/回执/上行、通道状态和积压。本次以三类质量监控为主视图,保留“运行概况”和详情跳转入口承接这些功能;不因当前页面未展示某旧需求就擅自删除它。统计逻辑不复用运营看板的分片到达率。
## 4. 统一统计口径
### 4.1 计数单位与去重
- 行业通道:按`messageRecordId + submitId + channelId`唯一的**一次业务短信发送尝试**计1次,随后按真实收件号码运营商分组。一个三网通道拆为移动、联通、电信三行,不能按通道配置的“三网”重复累计同一条;未知运营商单列并提示数据质量。
- 验证码与整体兜底:按`tenantId + applicationId + messageRecordId`去重,每条业务短信计1条。补发、换通道不增加分母,也不重置第一次实际提交时间;成功可来自任一有效完整发送尝试,但不能将不同尝试的零散成功分片拼成一次完整成功。
- 行业通道中,原通道尝试失败、换通道成功分别反映各自质量;后者不得反向把前者改成成功。该业务短信在应用×签名监控中仍只计一次。
- 同号码多次不同业务发送各计一次,不按号码去重;网关重放同一事件不增加计数。批量多号码按平台稳定业务消息ID逐条统计。
- 长短信以完整业务消息为单位:该次有效尝试的全部必要分片成功回执收齐才成功,成功时刻取最后必要分片的首次成功回执接收时刻。分片总数必须来自真实发送快照,不能用当前计费单位随意替代。
- 实际已提交但上游拒绝、响应超时或最终失败的尝试保留在分母;未发包的路由/连接失败不伪造Submit样本,进入运行概况的“提交前失败”。对于“可能已写出但无法确认”的网络边界,单列不确定样本和完整性状态,不静默排除并显示健康。
- 未要求回执、不支持成功回执、无法匹配、缺少关键时间的记录,不制造100%或0%指标。展示不可评估数量和原因,触发数据质量提示;已确认提交且正常应有回执但未收到的样本,在成熟后计为未按时成功。
签名采用发送时已解析的`signatureId`及名称快照;应用用稳定ID,tenantId始终在后端隔离键中。签名重命名不拆历史序列;删除后历史快照仍可查。没有可验证签名/应用映射的历史数据单列“未识别”,不按当前同名签名猜测归并。验证码判断是最终展开、重组后的**发送正文包含字面量“验证码”**,只识别一次保存布尔值和规则版本;不以模板分类、登录图形验证码或模糊关键词替代,不存储验证码具体值到监控表。
### 4.2 时间定义
- `t0`:行业通道为该次尝试第一次成功写出Submit的时间;验证码/整体兜底为该业务消息所有有效尝试中最早的实际Submit时间。
- `ts`:满足完整成功条件的Gateway成功回执接收时刻;重复成功取首次、重复事件幂等。记录`timestampSource`和精度,禁止用API事务处理时间/updatedAt替代。
- 时间统一存UTC,页面显示北京时间,精确到毫秒计算;阈值边界使用`ts - t0 <= h`5.000秒算5秒内,5.001秒不算。负延迟或时钟明显异常单列不可评估并暂停受影响告警,不强制归零。
- 真正Submit时间采集是实施前置项:扩展现有Gateway结果/分片事件携带`firstWireSubmitAt`及时间源,随已有耐久事件持久化,保持旧消费者兼容。不得靠解析全量文本日志实现常态监控;必须验证进程崩溃、无SubmitResp、分片和回执先到的边界,不能只在accepted结果里补时间。
- 旧数据缺少精确起点时可显示“历史口径不可比”,但不参与新5秒告警;不把SubmitResp时刻回填成已核实发包时刻。
### 4.3 周期、成熟样本与公式
设评估边界为`T`,5分钟任务在北京时间整5分钟对齐,10分钟任务在整10分钟对齐;按`[T-W, T)`选取提交样本,左闭右开。`W`为5分钟或30分钟。
对每个时效`h`独立计算。`B`是观察截止时刻,实时初评时`B=T`;行业/验证码补齐时`B=T+60秒`,详见本节末尾:
```text
Q = 窗口内本维度可纳入时效统计的唯一提交样本
M_h = { m ∈ Q | t0(m) + h <= B } # 已等满h的成熟样本
N_h = |M_h| # 可评估条数
S_h = |{ m ∈ M_h | 完整成功且0 <= ts(m)-t0(m) <= h }|
R_h = S_h / N_h × 100% # N_h=0时为null
观察中_h = |Q| - N_h
触发_h = 指标开启 且 数据完整 且 N_h>=minSamples 且 R_h<下限_h
```
重要规则:尚未等满时长的样本,即使已成功或已失败,也统一先留在“观察中”,不能只把提前成功的样本塞入分子/分母造成幸存偏差。失败、超时、未知及成熟后未回执均在分母中;`N_h<minSamples`显示“样本不足”,不触发该指标。最低条数应用于**每项指标的成熟分母**,不是整行总提交量。
示例:12:30评估兜底窗口`[12:00,12:30)`。20分钟指标仅评估12:10及以前提交的样本,12:10之后的仍观察中;1分钟与5分钟分别评估至12:29、12:25。若全窗口300条,20分钟可评估90条、其中85条按时成功,则显示94.44%(85/90),最低100条时不告警,而不是85/300=28.33%。
同一批固定成熟样本的累计成功率随时限应不下降;本页面同一行三个时限使用不同成熟子集,比率**不保证单调**,不能前端排序或修正数字。每格显示`S_h/N_h`,悬停显示观察中数量及口径。全局合计必须先加分子分母再相除,不能对各行百分比做算术平均。
**5分钟固定窗口必须补齐尾部观察样本。**行业/验证码窗口不重叠,如果只在T计算一次,最后1分钟的短信可能永远不参与1分钟指标。故T时先给出实时初评,T+60秒再对同一`[T-5分钟,T)`生成完整结果,成熟判定时刻改为T+60秒,窗口提交边界保持不变,并再等待摄取宽限。历史趋势默认展示补齐后的完整结果;当前实时行显著标注“初评,待补齐”,补齐后显示“已定稿”。这最多增加约1分钟的完整窗口确认延迟,不改变每5分钟一个统计窗口。
初评可提前产生异常提示,补齐时更新同一事件,不能将初评和补齐计为两次连续异常。连续异常/恢复次数以每个窗口的定稿结果计数;配置连续1次时允许初评先报,随后定稿证实;配置大于1次时等定稿后计数。初评异常而定稿正常,事件按“窗口补齐后解除”关闭并保留两份证据,不伪称真实业务恢复。自动业务恢复只使用定稿窗口,禁止旧窗口补齐覆盖更新窗口的状态。整体兜底的窗口每10分钟重叠,每条样本会在后续窗口中成熟并纳入;需用边界用例证明任意提交时刻都能参与各时效指标,不能据此跳过行业/验证码的补齐任务。
### 4.4 快照完整性、迟到与回算
- 每个边界T生成版本化快照,记录窗口、观察截止B、初评/定稿阶段、计算时间、规则版本、样本量、完整性、水位和指标。建议在B之后给摄取/匹配预留30秒宽限(需实测调优),统计仍按B观察,不把宽限期新增提交算入窗口;补齐也不改变窗口右边界T。
- 已在时限内被Gateway接收但晚处理的回执,按原接收时间回算;真正超时后才收到的成功回执,不得因为最终成功而提高较短时限比率。
- 水位完整不是“最近一条事件很新”:需检查相关已提交事实、未处理/未匹配回执、检查点连续性及积压。数据未齐时显示“数据延迟”,冻结该维度新的低到达率告警和自动恢复,独立提示监控管道异常;不能把监控自身故障归咎于通道。
- 同一`类型+维度+T`只有一个快照身份,回算增加revision而不重复新建。保留告警首次评估值和更正值,迟到导致误报时标记“数据修正关闭”,不伪称业务自然恢复。
- 最近30分钟兜底窗口每10分钟重叠,样本可参与多个不同T的评估;同一T内只计一次。不得把重叠窗口累计为发送总量。
- 初次纳管/配置启用后默认只对生效时间之后的提交执行告警,等待成熟样本;历史数据仅作对比。回算保留时长建议72小时,以事件完整性及成本校准,超出范围显式提示未回算,不全表补算。
## 5. 监控配置
### 5.1 行业通道
- 监控范围由运营人员在“监控通道”弹窗中搜索、勾选、移除;展示通道名称/编号、支持运营商、业务启停状态、监控是否开启、生效时间。
- 通道监控开关独立于业务通道启停,不改变通道价格、路由、连接或发送配置。关闭业务通道不自动删除监控历史;展示停用状态,已有窗口继续评估,后续无样本不虚报异常。
- 设置一套行业通道通用阈值:最低成熟条数、5秒/20秒/1分钟到达率下限,各指标可单独开启/关闭;本期不强制增加每通道独立策略,避免无需求的配置膨胀。
- 新建通道、复制通道必须在**服务端保存成功且返回新ID之后**弹窗:“是否加入行业通道监控?”说明:“如果是行业短信通道建议加入”。按钮“暂不加入”“加入监控”,显示将使用的通用阈值摘要。
- 加入动作只调用独立监控配置API;成功提示“通道已保存,已加入监控”。加入失败提示“通道已保存,加入监控失败,可重试”,不可回滚已创建通道、重复提交创建或假报全部成功;重试对同一个通道ID幂等。
- 复制不继承原通道的监控成员身份或个性设置,一律对新通道再提醒;关闭弹窗等同暂不加入,后续可在监控范围加入。原通道不受影响。无监控管理权限者看到已保存结果和权限说明,不展示可执行加入按钮。
### 5.2 验证码
- 全平台有权限范围内的企业应用×签名自动覆盖,无需逐个添加。只纳入最终正文包含“验证码”的业务短信。
- 独立通用阈值:最低成熟条数、5秒/20秒/1分钟下限,不能与行业通道配置共用同一个值对象。
- 搜索条件:企业、应用、签名、状态;详情可按运营商/通道分解定位原因,但不改变主告警键,也不把通道尝试数当主分母。
### 5.3 整体兜底与个性阈值
- 通用规则:最低成熟条数、1分钟/5分钟/20分钟下限。
- 个性规则支持“某企业应用”“某签名”“某企业应用×签名”三个作用范围。所有ID均在同一企业权限范围内校验,不能按名字匹配跨企业签名。
- 建议优先级:**应用×签名 > 签名 > 应用 > 通用**。同时匹配签名和应用时采用签名规则,界面明确显示被覆盖来源;列表显示“实际生效规则”,详情能查看完整匹配链。
- 采用最高优先级的一整套规则,避免不同来源按字段拼接难以解释。创建个性规则时预填继承值,保存为独立完整规则集;“恢复继承”删除该层覆盖并展示将生效的下级策略。
- 同层同范围唯一,重复保存更新原规则;版本号乐观锁,冲突返回409并让用户重新加载。改规则记录操作者、修改前后值、生效时间;不对历史窗口用新阈值追溯制造告警。
- 编辑页实时展示一个示例维度的最终生效策略,并提示高优先级覆盖范围。不要让用户保存后仍猜测哪套生效。
### 5.4 参数校验与生效
- 最低成熟条数为正整数;到达率下限0~100%,保留两位小数;开启的累计下限建议满足短时限≤长时限,不合理顺序提示修正。至少开启一项时效指标。
- 百分比仅展示时四舍五入,告警比较使用整数基点/精确分子分母;等于下限不告警,低于下限告警。0%下限等于该项不会因低比率触发,界面明确提示。
- 每类可配置连续异常次数(默认建议1)、连续恢复次数(默认建议2),范围1~5;站内提醒默认新异常一次,持续异常更新原事件,不周期刷屏。
- 配置成功以真实持久化为准,页面显示版本和生效时间。配置修改后从下一个周期使用新版本;旧活动事件以“规则变更”关闭并重置连续计数,不算业务恢复。
## 6. 告警生命周期与预警中心
1. 任意开启的指标在成熟样本达标且数据完整时低于下限,累计对应连续异常次数;达到阈值创建一条该维度的发送质量告警,附全部命中指标。
2. 同一类型+维度只保留一个活动告警事件,多个时效指标合并展示;使用事务唯一约束/锁防止双Worker重复。业务维度键不包含窗口T,避免每个重叠窗口新建。
3. 活动事件更新最新值、最差值、持续时长和周期记录。用户“标记已读/已知悉”只影响个人未读状态,不等于恢复或关闭统计。
4. 所有开启指标均有充分成熟样本、数据完整且不再命中下限,连续满足恢复次数后自动恢复。样本不足、无发送、数据延迟均不累计恢复;活动告警显示“暂停评估”原因。
5. 恢复后再次异常创建新事件并重新未读;配置关闭、范围移除、规则变更分别记录关闭原因,不能冒充恢复。短暂静默仅隐藏个人/授权范围通知,统计仍进行并记录到期时间。
6. 预警中心新增“发送质量告警”,展示未读活动事件数及异常维度数,点击进入`/admin/monitor?tab=alerts`;弹层样式、键盘/点击外部关闭和窄屏行为复用现有AppShell。
7. 全局角标只调用独立轻量`notification-summary`,按既有30秒节奏、聚焦及已读事件刷新。返回失败保留上次值并标记不可用,不能清零或清空其他预警域。明细列表和计数使用相同权限、过滤和去重口径。
8. 发送质量告警属于预警中心;签名清退继续在现有报备任务提醒中,待审核任务不增加这些计数。首期只做站内告警,不发短信、邮件或第三方通知,不触发自动停通道、换路由、补发。
## 7. 页面与交互
### 7.1 监控主页面
- 路由保持`/admin/monitor`。一级页签:行业通道、验证码、整体兜底、告警记录;标题操作区为刷新、阈值设置、行业页特有的监控通道。
- 顶部持续显示口径、当前窗口、计算周期、最新成功计算时间/数据延迟;30秒页面取数不等同于5/10分钟重新评估。长时间挂后台暂停轮询,恢复焦点再拉取,手动刷新节流。
- 摘要卡:监控维度数、异常维度数、样本不足维度数、窗口提交量(行业用“提交尝试”,其他用“业务短信”)。无数据时显示—/0并区别未配置、无发送、计算中与接口失败。
- 表格以异常优先:维度、窗口提交量、三个到达率、实际阈值/规则来源、状态、趋势/详情。各指标格包含百分比、成功/成熟数;低于阈值的格红色强调,观察中/样本不足中性显示,不只依赖颜色。
- 用户能筛选全部/异常/正常/样本不足/数据延迟;应用/签名支持带企业名的远程搜索、分页。筛选保存在URL,首次进入、刷新和告警深链接能还原。
- 保留“运行概况”入口显示连接、积压及最近消息/回执/上行,不把业务启用标记等同实际连接健康。详情链接保持权限过滤。
### 7.2 趋势与告警详情
- 详情页/抽屉显示异常对象、类型、状态、开始/最近评估时间、规则快照及每项命中指标。
- 展示最近2小时/24小时曲线,点的时间含义为评估T;悬停显示窗口、分子分母、观察中条数和revision。阈值变更用分段线和注释,不能用今天阈值覆盖昨天曲线。
- “查看样本”跳转已有短信记录,带精确应用/签名/通道/时间/结果过滤;需有详情权限,手机号脱敏,不在告警摘要暴露正文或验证码。
- 异常、无数据、待计算、采集延迟、失败重试、权限不足、删除对象历史查看均有明确状态。配置弹窗保存失败保留输入,未保存离开有确认。
### 7.3 响应式与原型覆盖
- 原型采用项目白底侧栏、浅灰内容区、蓝色选中、紧凑表格和8px圆角;复用Breadcrumb/Button/Select/Table/Tag/Modal。
- 1600×1000完整展开;1366×768保持正文14px,表格自身横向滚动、弹窗仅Body滚动;390×844用折叠导航、横滑页签、每维度一张指标卡和全屏配置抽屉,不缩小字体挤宽表。
- 配套图覆盖三个主视图、阈值/个性规则、通道纳管提示、预警中心/详情、窄屏;均为静态示意,不含真实API、数据库或用户操作。
## 8. 数据流与性能方案
### 8.1 推荐架构
```text
已有Submit结果 / 分片审计 / 回执Inbox(耐久业务事实)
→ 独立监控Worker:增量投影、完整性校验、幂等归并
→ 短期MonitorFact + 分钟汇总桶
→ 5/10分钟调度:生成窗口快照、评估规则、维护告警事件
→ 轻量分页API / 角标摘要 → 页面
```
原则是发送热路径不等待统计查询、规则匹配或通知,也不每条短信执行多次聚合SQL。精确时间需要扩展既有耐久事件,但尽量不新增独立同步消息或额外发送事务。监控读取失败只造成监控降级,不能阻断发送;基础事实持久化本身仍遵循原发送可靠性契约,不为性能跳过必要写入。
推荐一期由独立Worker读取**既有已落库事实**做短批增量投影,避免再造一套逐短信业务Outbox;如果无法在既有事实中证明完整性,必须在技术验证阶段调整采集契约,不宣称纯查询就能准确算5秒。不能直接消费现有短信Stream的同一个consumer group分走消息,也不能依赖已ACK/XDEL的Stream作为历史账本。
### 8.2 增量、桶与精度
- 数据提取针对提交事实与回执处理结果两条游标分别维护检查点。`createdAt/id``updatedAt/id`排序只提供扫描位置,不能假设数据库事务提交顺序与时间戳一致;采用重叠回读+按ID幂等覆盖,并定期有界对账。扫描到未完成关联的Inbox保留待匹配集合,直到已匹配或明确异常,不越过后遗忘。
- 监控事实保持稳定source key、源版本、t0、首次完整成功时间、类型标记和维度快照;同一源重复摄取以替换贡献/脏桶重建处理,不能直接重复INCR。事实、桶版本和检查点在监控侧短事务内一致提交,崩溃可回放。
- 以提交分钟建立稀疏桶,记录计数及5秒/20秒/1分钟/5分钟/20分钟累计按时成功数。长时限成熟边界可整分钟读取;5秒/20秒成熟边界落在分钟内部,必须从索引事实补算边界秒区间,不能把整分钟全算成熟,更不能把时间四舍五入到分钟。
- 每次评估读5或30个分钟桶及最多一分钟的边界事实,不对每个通道/签名单独发SQL循环。批量处理活跃维度,监控列表只读已保存快照。
- 三类监控共享一次业务消息/正文解析投影,验证码布尔只识别一次;行业通道尝试汇总与应用业务消息汇总分别维护。禁止常态运行`content LIKE '%验证码%'`扫描业务大表,禁止反复JSON反序列化正文。
- 固定维度ID;仅有流量或配置的组合建桶,不生成“企业×应用×签名×通道×运营商”笛卡尔积。应用签名不是Prometheus高基数标签;Prometheus仅观测Worker延迟、批量大小、错误率等低基数运行指标。
- 迟到事件只将相应提交分钟标脏并合并修正其相关快照;兜底每条样本最多影响3个滚动提交窗口,再处理有必要的历史revision,禁止重算所有维度全部历史。
### 8.3 表与索引候选(设计项,不直接执行迁移)
| 候选实体 | 内容及约束 |
|---|---|
| SendingMonitorTarget | 行业通道成员、enabled、effectiveFrom、versionchannelId唯一 |
| SendingMonitorRule | 类型、作用域与ID、完整阈值JSON/结构字段、版本、生效时间、操作者;同类型同作用域唯一 |
| SendingMonitorFact | sourceKind/sourceId唯一、tenant/app/signature/channel/carrier快照、t0、successAt、时间源、验证码标记、完整性与源版本;不复制手机号和正文 |
| SendingMonitorMinute | type/dimensionKey/minute/口径版本唯一,累计计数、revision;稀疏存储 |
| SendingMonitorSnapshot | type/dimensionKey/T/口径版本唯一,三个S/N、观察中、规则快照、completeAt/revision;保留历史追溯 |
| SendingMonitorAlert / AlertRead | 活动事件唯一约束、规则版本、首次/最新/最差值、状态/原因;已读按eventId+userId唯一 |
| SendingMonitorCheckpoint | 按来源/分片的扫描位置、租约、扫描上下界、对账进度、未处理缺口 |
索引按实际谓词和EXPLAIN选:事实`(dimensionKey,t0)`支持边界范围;快照`(type,T,status)`及维度历史时间索引;源表新增`(updatedAt,id)`/相关状态时间索引前先验证现有查询计划。不能仅因表很大就堆宽索引,源表新增索引会增加发送/回执写放大;DDL锁与索引创建窗口需部署评审。
参考:[PostgreSQL复合索引说明](https://www.postgresql.org/docs/current/indexes-multicolumn.html)强调前导列约束对扫描范围的作用;[Prometheus标签规范](https://prometheus.io/docs/practices/naming/)提示避免无界高基数。应用版本能力以目标数据库为准,不将文档最新版优化当作当前服务器已具备。
### 8.4 调度与资源预算
- 一期建议1个独立监控Worker,连接池上限2、并行任务1,按哈希/时间分批;每批500~2000条是压测候选值,受statement_timeout和短事务约束,自适应退避,禁止Promise.all按全部签名并发。
- 以数据库租约/唯一任务键确保每个边界T只被一个执行者持有;过期可接管,重跑幂等。不要只使用进程内setInterval防重。调度边界固定,批次可错峰,不漂移窗口定义。
- 轻量摘要API缓存15~30秒,按权限作用域及版本隔离;缓存丢失只回源汇总表,禁止回源重扫业务表。使用Redis只缓存结果,不做每条短信一个TTL键/定时器。
- 建议热事实先按2小时估算,分钟桶7天、窗口快照30天、告警及规则审计90天,再按实际合规与磁盘容量评审。72小时是候选纠错范围,不要求保留等长的全量热明细;热事实过期后的纠错从既有事实按ID有界恢复,恢复成本超预算则明确标记未回算。清理仅针对独立监控数据,按分区/小批执行,不清业务消息、回执或短信队列。
- 新增实际发包时间字段、源表索引、监控投影和回算均有成本;不能承诺“零影响”。性能验证不通过时先缩小纳管范围、降低摄取批量或部署独立读副本(需确认复制延迟),不能以提高发送并发或削弱耐久性掩盖。
### 8.5 可解释的容量估算与验收预算
令业务短信速率为λ、平均尝试数a、平均分片数s,则已有提交/分片/回执事实处理量约按`λ×a×s`增长;重复回执另计,不能仅看业务TPS。
以假设500条业务短信/秒、a=1.1、s=1为例:每5分钟15万业务短信、约16.5万次尝试;每30分钟90万业务短信。每次对这些数据重新Join三遍会产生持续负载。监控分钟汇总将周期读取转为与活跃维度和窗口长度相关,而事实摄取仍与事件量线性相关。
该假设下业务+尝试投影若约1050行/秒,72小时约2.72亿行;即使每行连索引按粗估200字节,也约54GB且未计WAL/膨胀。**因此72小时明细不能不经容量测算直接上线**;可优先缩短热事实至2小时(约756万行、粗估1.5GB),更长回算在既有事实中按ID有界恢复,或评估分区/独立存储。这是容量风险示例,不代表现环境有500TPS、该磁盘余量或该行大小。
实现验收建议预算(待基线实测校准):
- 同负载对照开启/关闭监控,发送受理/提交及回执落库P95相对恶化不超过5%,无业务错误增加,发送Stream/Inbox无持续新增积压。
- 监控新增连接不超分配池,数据库总体CPU增幅目标不超过5个百分点,磁盘I/O和WAL写放大单独记录;不以单次低峰截图证明高峰达标。
- 周期任务P95在30秒内完成、必须小于调度周期;快照/摘要API P95≤300ms(不含公网延迟);不足则标记性能验收未通过,禁止藏掉延迟指标。
- 数据超过一个采集SLA(初值30秒)未完整时标为延迟;两个评估周期无新完整快照时告警“监控计算异常”。按真实依赖延迟校准,不误关正常短信发送。
- 先用脱敏历史快照/隔离数据集验证1倍及峰值2倍规模,覆盖高签名基数、长短信、重试与回执突发。真实发送压力测试另需授权;本设计阶段未运行压测。
## 9. API与权限边界(拟定)
统一使用`/api/admin/sending-monitor`,不重用系统监控或旧monitor的全量聚合接口:
| 接口 | 用途 |
|---|---|
| GET /overview?type=... | 最新快照摘要、T、nextEvaluationAt、数据完整性 |
| GET /rows?type=...&page=... | 权限范围内分页维度、S/N/观察中、状态与生效规则 |
| GET /history?dimensionId=...&range=... | 有界历史快照及规则变更 |
| GET /targetsPUT /targets/:channelId | 行业纳管列表与幂等加入/移除,携带version |
| GET /rulesPUT /rules/:idPOST /rules | 通用与个性规则,完整校验与乐观锁 |
| GET /effective-rule?... | 返回生效规则及被覆盖层,用于编辑预览 |
| GET /alertsGET /alerts/:id | 历史、活动及详情、过滤、分页 |
| GET /notification-summary | 轻量未读活动事件/异常维度数、更新时间,不聚合原始消息 |
| POST /alerts/:id/read | 个人幂等标记已读,不改变业务恢复状态 |
响应必须区分`rate=null``sample_insufficient``observing``stale``error`,不能统一0。越权资源返回一致404/403策略;后端从会话确定访问范围,不能相信前端tenantId。监控查看、阈值修改、通道纳管、消息详情分别校验权限,配置写入与版本审计在事务中完成。分页上限建议100,历史时间范围有限,错误明确返回而非静默成功。
## 10. 实施拆分与验收清单
### 10.1 分阶段建议
1. 先确认第2节口径与阈值,对真实代码/数据核验提交时间、回执匹配、分片合并和高峰规模。交付统计样本独立对账,不先接告警。
2. 实现兼容时间字段、独立投影/桶/快照,影子运行并与独立SQL按ID比对;监控关闭时不改变发送行为。完成容量和故障演练后才开启有限纳管。
3. 实现三页签、通用与个性规则、通道新建/复制提示,接预警中心轻量摘要和事件生命周期;先灰度一个测试范围再扩展。
4. 同步主需求、系统用例、技术设计及testing-progress;经授权提交、推送及部署,分别记录代码级与真实环境证据。
### 10.2 可直接转入系统用例的验收条目
| 编号 | 场景 | 预期 |
|---|---|---|
| SMR-001 | 5分钟边界、10分钟边界、跨天和时区 | 提交窗口左闭右开、UTC计算一致,无跨周期漏重 |
| SMR-002 | 三网通道含移动/联通/电信/未知号码 | 按消息运营商拆分;未知单列,不重复三次计数 |
| SMR-003 | 同业务短信换通道补发 | 通道按各尝试,应用签名按1条;t0不因补发重置 |
| SMR-004 | 长短信、重复/乱序/冲突回执 | 全必要分片同一有效尝试完整成功才计成功;幂等,负时延异常可追溯 |
| SMR-005 | 4.999/5.000/5.001秒以及20秒/1分/5分/20分边界 | 精确分类,不由显示四舍五入决定 |
| SMR-006 | 尚未成熟但已成功/已失败的样本 | 两者都观察中;不能只纳入提前成功者;N_h独立 |
| SMR-007 | N_h为0、99、100且最低100 | null、样本不足、可评估,零数据不显示100%或自动恢复 |
| SMR-008 | 最新30分钟,20分钟成熟段只有前10分钟 | 分子分母/观察中符合第4.3例子,不把新提交直接计为未到达 |
| SMR-009 | 正文含验证码、模板分类验证码但正文不含、不同租户同名签名 | 字面正文匹配;稳定ID归属和租户隔离,不混淆 |
| SMR-010 | 全部规则层同时匹配、重复修改、恢复继承 | 应用×签名>签名>应用>通用;整套规则覆盖、409冲突、来源可解释 |
| SMR-011 | 新建/复制成功后加入监控成功或失败 | 主创建只一次、加入幂等;失败保留新通道,复制不继承成员资格 |
| SMR-012 | 新建失败/无权限/关闭纳管弹窗 | 不误弹成功、不越权加入、后续可手动纳管 |
| SMR-013 | 一个维度三项低于阈值、连续重叠周期 | 一条活动事件、多命中指标;无重复角标刷屏 |
| SMR-014 | 已读、持续异常、恢复、再异常、样本不足 | 已读非恢复;充分数据连续恢复;再异常新未读;不足暂停评估 |
| SMR-015 | 回执Gateway及时但API处理迟到、规则变更 | 延迟/回算有revision;保留原告警与修正原因,不伪称终端时延 |
| SMR-016 | 投影Worker重启、多实例抢占、数据库/Redis故障 | 检查点可恢复、幂等;监控显示降级,业务发送链无新增依赖阻断 |
| SMR-017 | 长事务晚提交、游标跨越、已扫描Inbox后匹配 | 重叠读取+待匹配集合+有界对账恢复,不永久漏统 |
| SMR-018 | 预警中心接口失败、权限变化、点告警深链接 | 其他域不清零,来源状态明确;同作用域计数与列表一致 |
| SMR-019 | 三尺寸、首次进入、刷新、筛选、弹窗失败与未保存离开 | 无页面级意外溢出,正文可读、Footer可见,表单状态保留 |
| SMR-020 | 高峰/高基数/长短信与监控开启关闭对照 | 按第8.5预算出真实CPU/IO/延迟/队列/存储报告,不用构建成功代替 |
| SMR-021 | 旧数据缺时间、不确定发包、不支持回执 | 单列不可评估和完整性,不伪造指标或混入健康样本 |
| SMR-022 | 旧功能入口与跨业务提醒分组 | 保留运行概况/最近事件入口,新告警只进预警中心,不污染报备和待审核 |
| SMR-023 | 固定窗口尾部与补齐任务 | 12:29:59提交的行业/验证码短信必须进入12:30窗口的12:31定稿;初评/定稿不重复计告警次数,旧定稿不覆盖新状态 |
## 11. 原型文件与本轮验证边界
参见[原型目录](prototypes/sending-monitor-20260906/README.md),PNG便于预览,SVG用于后续修改。所有表格为示例数据;正文未展示短信、手机号或验证码。原型是需求交流材料,不接后端,不可作为业务验收证据。
本轮已核验文档相对链接、Markdown代码块、空白、统计公式示例、绘制脚本语法、七组PNG/SVG尺寸及可解析性,并逐图检查文字与布局;文件范围仅本文及专属原型目录。没有真实API/数据库/Redis功能测试或性能压测。阈值、兜底范围、提交计时起点及容量预算必须在实施前评审,不能依据示例图直接启用告警。
## 12. 实施决策与验收边界(2026-09-06)
用户已确认默认阈值留空,由运营后续配置;任何原型阈值均不自动启用。前三节旧记录保留为设计阶段证据,不代表当前实施状态。
新增 Gateway 实际写出时间、时间来源及真实上游回执请求标记,随已有结果和分片耐久事件传递;API 持久化到尝试/分片,回执新增 gatewayReceivedAt 区分真实 Gateway 接收时间与 API 缺省时间。客户端是否要求下游回执不能代替上游实际请求标记。现有 Inbox 的 matchedSubmitRecordId 尚未写入,投影使用已匹配业务消息、通道和网关消息号关联,遇到尝试重号拒绝混合。
独立 Worker 使用最多2个 PostgreSQL 连接、单执行槽、数据库排他租约;提交及回执各自保留重叠游标,另有72小时有界对账,脏分钟只重算所属固定窗口/最多3个兜底窗口,调度队列与投影原子提交。指标读取成熟分钟桶加毫秒边界事实,不按页面刷新扫描业务大表。
事实保留期本次采用72小时(第8节2小时是原建议),以保证迟到修改能替换原贡献、不会在删除事实后把旧桶重建成局部样本;分钟7天、快照30天、关闭告警90天。新增表不存短信正文/手机号。需要以真实峰值容量预算再优化事实压缩/冷热分层;当前不得据此宣称500TPS下预算达标。真实短信压测未获授权,只使用隔离数据库样本验证统计和查询成本。
纳管范围使用不可变版本,按窗口评估时刻解析;以后移除/重新加入不改写旧统计。当前API规则按type+scope通过POST完整保存(version乐观锁),不另外提供重复的PUT更新入口。新Worker健康异常通过发送监控数据延迟和预警中心不可用说明展示;监控性能指标接Prometheus和真实峰值对照尚未验收。
+19
View File
@@ -5145,3 +5145,22 @@ npm run verify:phase8
| TC-CHANNEL-ORDER-006 | 三尺寸首次进入、刷新、上移/下移/撤销、添加、搜索空态和跨路由切换 | 撤销和保存按钮宽度相同且紧凑;表格/弹窗可操作,无新增裁切或控制台异常;真实API验收不保存业务配置 |
真实短信补发、真实保存业务通道组及真实权限/故障注入未授权时仍标记未执行;不能把纯函数、模拟保存或构建通过当作发送链投递验收。
## 发送质量监控与报备状态消息(2026-09-06)
权威设计:[发送监控方案](sending-monitor-redesign-plan-20260906.md)、[报备状态通知](report-readiness-notifications-20260906.md)。发送监控 SMR-001~023 全部沿用方案第10.2节,不把未执行项视为通过。
| 编号 | 操作 | 预期 |
|---|---|---|
| RRN-001 | 签名零网成功,依次更新移动、联通、电信全国成功 | 到第三网仅产生1条站内事件,双端均可见 |
| RRN-002 | 引流独立报备;全国三网通道旧版成功或多通道逐步成功 | 按引流自己的报备覆盖计算,不借签名状态 |
| RRN-003 | 重复导入;三→二→三;三→零→三 | 前两者不重复,回零再恢复新增下一轮 |
| RRN-004 | 同企业同小时多对象达到条件;读后同小时追加 | 企业×小时汇总计数,按用户和revision重新未读 |
| RRN-005 | 不同企业详情ID、伪造租户头、匿名及非法分页/版本 | 会话隔离,403/404/401/400,无越权读取或写入 |
| RRN-006 | 报备事务失败/回滚、并发保存相同对象 | 通知与事务同进退,对象锁和唯一键防重 |
| RRN-007 | 既有成功、省通道、运营商专属失败覆盖旧成功 | 不追发历史,排除省通道和被覆盖成功 |
| RRN-008 | 运营状态记录tab、顶栏跳转、客户端消息页,三尺寸及失败 | URL可刷新,原记录筛选保留,失败不伪造已读 |
| SMR-024 | 默认阈值及样本量为空,尚无任何规则 | 显示未配置,不启用告警;后续完整校验后保存 |
| SMR-025 | 纳管移除/重新加入后重算旧窗口 | 使用历史纳管版本,不改写原窗口范围 |
| SMR-026 | 从快照查看短信样本,再筛选和导出 | 均限定同一快照贡献范围,超过72小时明确提示 |
| RMP-OBS-001 | 已生成资料的对象所用组新增通道(只读代码调查) | 记录实际行为:pendingReport=false不会自动重入池;不把调查写成修复 |
+13
View File
@@ -4605,3 +4605,16 @@ git diff --check
- 动态环境:浏览器验收期间其他操作新增了一个真实停用通道,旧候选快照因此不再匹配;改为用当前页面实际收到的API响应核对过滤集合,未删除或改写该通道。只读数据库短信记录119509;三条短信Stream在核验时pending/lag均0且last-delivered/entries-read与本轮开始一致。未发送、补发、重投或重新入队短信,未修改余额、通道或客户配置。
- 证据目录:本机`%TEMP%/cmpp-channel-order-20260906`内before.png、after.json、editor-1600/1366/390.png、choices-1600/1366/390.png、前后浏览器脚本、build.log和api-tests.log。首轮浏览器脚本修正了API路径/定位器及草稿beforeunload确认处理;不把脚本超时当作功能通过。图片、响应报告不含密码,认证文件沿用部署文档受限入口。
- 验收边界:未真实保存现有通道组、未执行短信补发;参数映射/保存失败用组件隔离测试,补发顺序用真实代码、当前PostgreSQL/API顺序及无副作用策略测试交叉核对。无真实省网可选夹具,地区过滤和历史缺失项由组件测试覆盖;不冒充端到端投递或真实权限异常验收。仅本地提交,不推送、不部署测试或预生产。
## 2026-09-06 发送监控与报备状态消息实施(发布前)
- 范围:按用户授权修改、提交、推送、部署测试环境;本轮不访问或发布预生产。阈值及最低样本量默认留空、不告警,后续由用户配置。
- 起点:main/HEAD=69e3d732026-09-06 19:15回读origin/main=442dda711d5c9f778f3f76fd6d8fd69f14414ce6,差异0/2。原有AGENTS、开发/测试/部署规范、用例/进度及未跟踪方案受保护,仅暂存本轮文件或追加节。
- 实现:三种周期监控、真实Gateway写出和回执接收时间、尝试/业务去重、独立有界投影Worker、成熟桶/边界统计、规则与纳管版本、告警生命周期、历史快照和短信样本范围;顶部预警中心及运行概况保留。通知采用事务触发器、零网过程记忆、企业小时聚合、个人版本已读,双端页面和运营提醒入口。
- 根因证据:现有submittedAt是等待供应商响应后的时间,不能冒充发包时间;matchedSubmitRecordId实际未写入,使用已匹配消息/通道/网关号,重号不可评估;上游实际RegisteredDelivery与客户要求的下游回执不同,分别保留。测试库时区Asia/Shanghai,新表/SQL显式UTC。
- 资料池只读结论:pending-query要求pendingReport=true;生成完成置false;组添加通道没有重新置true。实际41个pendingReport=false签名存在有效路由和通道组,不会仅因新增通道自动重新进入待生成池;尚待生成对象可以动态计算新目标,但不会自动创建资料文件。本轮未修改此业务规则。
- 验证:前端20套99项、API59套638项、Gateway全量Go测试及vet通过;真实PostgreSQL隔离事务20项通过(含5秒边界、初评/定稿、重复、缺时间/回执请求、历史纳管版本、签名和引流通知、UTC、回滚)。数据库夹具明确为从不入队的隔离样本,全部回滚;测试替身不作为真实业务验收。新增API单测初次类型声明失败,修正后全量通过;引流夹具初次误用按运营商三条,与真实唯一约束冲突,改为既有全通道报备模型后通过。
- 本地TypeScript、前后端构建通过;格式、Stylelint、CSS所有权/级联治理及15项门禁测试通过,CSS全部由页面所有者导入,未修改历史模块或加载顺序。按当前门禁机械格式化了本轮涉及的旧代码文件,未变更其其他业务逻辑。ESLint无错误,有既有/关联Hook和any警告;入口gzip108.71KiB低于250KiB,图表chunk保留既有提示。
- 测试机19:0519:08基线:旧部署442dda7;短信119509、近72小时尝试0、待匹配回执0;提交命令/结果Stream pending/lag均0;数据库约2363MB、连接13/100、根盘可用24GB。Gateway desired=6、connected=0是发布前既有状态,不宣称供应商链路通过。当前没有真实高峰/长短信负载;500TPS性能预算及故障演练尚未执行,不作容量承诺。
- 本次独立恢复点:/var/backups/cmpp-platform/20260906-sending-monitor-191302,含PostgreSQL custom dump、应用、环境/systemd/Nginx/Prometheus/fstab、Redis RDB、旧版本;pg_restore列表、tar可读性及SHA-256均通过。未执行实际恢复演练。
- 此节为发布前证据;提交、推送、测试发布、真实双端浏览器结果在后续发布节记录,不预先标记完成。