This commit is contained in:
@@ -2218,3 +2218,7 @@
|
||||
- 添加/编辑通道弹窗不允许设置顺序或优先级;新增全国通道固定追加末尾,编辑保留当前位置,调整只通过编辑页上移/下移,保留撤销功能。
|
||||
- 待选通道隐藏已占用、不支持运营商/地区、已删除的项;编辑当前成员可保留自身,搜索只在可选集合中进行。保留原可配置的停用/暂断连状态及真实提示,不等同发送资格。
|
||||
- 符合发送资格的全国通道按列表顺序首次尝试和补发,跳过已尝试、未报备和不可用通道;省网优先及失败转全国规则保持。优先级仅作为API兼容字段,整数上限时保持相对顺序压紧当前草稿后追加,不将新增项插到前面。
|
||||
|
||||
## 2026-09-07 夜间累计发送量审核
|
||||
|
||||
原“非工作时间大批量营销发送”替换为每企业应用每夜累计所有业务短信的人工审核规则,所有企业应用默认通用5000条,支持应用阈值覆盖;不依赖分类、内容或任务名。CMPP、公开HTTP、客户端合并计数,第5001条及之后待审;分片/内部重试/补发/幂等重试不重复累计。统一在首次发送Worker提交前拦截,含定时任务到期及CMPP快速入队路径。短信审核复用现有字段、号码明细、详情和批量审核,按同应用同内容10秒窗口聚合,窗口关闭后审核;批准只释放该任务消息,不豁免后续发送。时间跨午夜连续,默认21:00至次日08:00(北京时间),夜间改时间待本夜结束生效,阈值修改不清零。详见phase-6-risk-review-plan.md的2026-09-07章节;该章节替代旧营销识别和单任务阈值语义。
|
||||
|
||||
@@ -59,3 +59,13 @@ api/src/risk-review/
|
||||
3. 直接拒绝的任务必须向客户端返回可读原因。
|
||||
4. `npm run verify:phase6` 通过。
|
||||
|
||||
## 2026-09-07 夜间累计发送量审核(替代营销单任务规则)
|
||||
|
||||
- 用户授权实现、提交、推送并发布测试与预生产。复用短信审核页面及其内容聚合、号码明细、通过/驳回/批量审核;不改版审核页面。旧规则编码保留兼容历史命中记录,名称改为“夜间累计发送量审核”,不再判断category、内容或任务名称。
|
||||
- 所有企业应用默认开启,通用阈值5000,应用覆盖优先,停用覆盖回落通用。单位为每应用每夜业务短信数(一个业务消息×一个号码);CMPP、公开HTTP、客户端共用计数。同号码不同业务消息分别累计,长短信分片、重试、补发和重复消费不重复计数。超过阈值的消息待人工审核;其他规则直接拒绝和未进入发送阶段的消息不消耗额度。
|
||||
- 夜间默认Asia/Shanghai 21:00至次日08:00,开始包含、结束不包含,跨午夜不清零。定时任务到期后执行。统一在发送Worker首次提交前拦截,覆盖CMPP批量快速入队和普通入口;HTTP/CMPP入口受理不等于已发送,异步消息状态为准。批量跨阈值按消息分流;失败/审核拒绝不归还夜间额度。
|
||||
- PostgreSQL新增NightSendingWindow与NightSendingReservation,应用锁、消息幂等记录、累计量、审核关联与pending_review状态同事务提交。Redis仅沿用队列,不保存唯一风控计数;数据库失败不得放行。新窗口首次使用从已有首次Submit记录补齐本夜历史数,避免夜间发布或规则启用时额度重置;发布仍核对历史基线和执行计划。
|
||||
- 审核按企业应用、相同原始内容及10秒窗口聚合(不混合不同内容),窗口关闭后沿用短信审核入口。计数维度不按内容拆分。已审核窗口不得再追加;审核批准仅释放该聚合任务绑定的消息,不豁免整晚;重复/相反审核须受控,续发失败可用同一决定重试。夜间结束仍不自动释放待审消息。
|
||||
- 阈值修改不清空计数,不自动释放待审消息;时间配置在当前夜间结束后生效,界面说明延迟生效。批量任务已有部分正常发送时,保留部分发送进度并标记存在待审核,不覆盖整批消息状态。审核与入队失败不得吞错,续发使用消息ID幂等队列任务。
|
||||
- 权限沿用管理员风控配置/短信审核入口;应用必须从真实消息与企业关联取得,不能信任客户端自报企业、时间或分类;应用覆盖必须验证对象存在。历史审核记录不重写、不自动重投。回退须先停发送Worker并保留新待审及计数事实,旧版本不能继续绕过新夜间门禁。
|
||||
- 验收覆盖阈值边界、多入口/多实例并发、跨午夜、应用隔离、幂等、重启、配置覆盖/变更、历史初始化、相同内容聚合、审核范围与并发、定时任务和数据库失败;使用隔离PostgreSQL/Redis证明持久化,不发送真实短信。前后端全量测试、类型/构建/质量门禁、两环境真实API与三尺寸页面验收分别留证。
|
||||
|
||||
@@ -5202,3 +5202,19 @@ npm run verify:phase8
|
||||
| TC-REPORT-WPS-007 | 上述残留节点仍被另一单元格DISPIMG引用 | 两种模式均拒绝,提示实际损坏单元格及工作表、重新插入/清空建议;不得误报相邻正常图片,不进行部分业务落库 |
|
||||
| TC-REPORT-WPS-008 | 已引用图片ID重复,或图片relationship缺失/重复/External,或包内媒体缺失 | 明确拒绝并提示工作表及单元格;不后写覆盖重复ID、不读取外部图片、不静默跳过真实缺失图片 |
|
||||
| TC-REPORT-WPS-009 | 真实故障文件及仅清空损坏单元格的内存副本,保留残留cellImage节点 | 原文件准确定位N7;内存副本33张有效图片位置与独立XML解析结果一致,提交模式33张SHA256全部匹配;原始文件保持不变,不据此冒充线上导入成功 |
|
||||
|
||||
## 2026-09-07 夜间累计发送量审核(替代TC-RISK-006及旧营销口径)
|
||||
|
||||
| 用例 | 场景与预期 |
|
||||
|---|---|
|
||||
| TC-RISK-NIGHT-001 | 同应用CMPP/HTTP/客户端逐条混合发送;累计4999、5000正常处理,5001及之后待人工审核;不受分类、正文或任务名影响。 |
|
||||
| TC-RISK-NIGHT-002 | 多实例并发和批量跨阈值;仅额度内消息允许正常提交,超量消息无Gateway Submit;其他企业/应用独立计数。 |
|
||||
| TC-RISK-NIGHT-003 | 21:00包含、08:00不包含,午夜不清零;白天创建的夜间定时任务在发送阶段检查,白天排队夜间执行同样检查;旧待审不自动释放。 |
|
||||
| TC-RISK-NIGHT-004 | 同业务消息重复消费、长短信分片、重试/补发不重复计数;同号码不同业务消息分别计数;服务/Redis重启不恢复额度。 |
|
||||
| TC-RISK-NIGHT-005 | 通用5000、个性化应用覆盖、停用覆盖回落通用;修改阈值不清零,夜间改时段展示当前/待生效;非法阈值、时区及改为直接拒绝受控400。 |
|
||||
| TC-RISK-NIGHT-006 | 同应用同内容10秒聚合,不同内容分开;号码数量/列表/详情/单个和批量审核沿用现有页面。窗口未关闭不可审核,已审核不可再追加或改相反决定。 |
|
||||
| TC-RISK-NIGHT-007 | 批准只释放关联消息,后续仍待审;审核后的Redis入队失败可由持久恢复记录重试,消息ID稳定去重;并发续发有租约,驳回按现有机制释放冻结并保留原因。 |
|
||||
| TC-RISK-NIGHT-008 | 夜间上线或首次启用从真实首次Submit补齐历史数,多个Submit尝试仅计同一业务短信一次;计数/审核持久化失败回滚且不得放行。 |
|
||||
| TC-RISK-NIGHT-009 | 1600×1000、1366×768、390×844检查风控规则及短信审核,保留筛选、号码列表、详情和批量操作;真实请求、刷新、路由、空态、失败和权限状态分别留证。 |
|
||||
|
||||
自动化入口:api/src/risk-review/night-sending-risk.service.spec.ts、api/src/send-chain/night-sending-gate.spec.ts及tools/testing/verify-night-sending-postgres.mjs。后者使用隔离PostgreSQL schema及独立Redis QA队列,不启动消费者、不调用Gateway、不写业务发送队列;隔离队列与schema仅清理本次随机名称。它验证真实持久化与队列恢复,不能冒充实际运营商发送或公网协议压测。
|
||||
|
||||
@@ -4688,3 +4688,13 @@ git diff --check
|
||||
- 新增14项回归,含metadata/字节两模式×未引用残留及自闭合单元格、实际损坏位置、重复图片ID、媒体缺失、关系缺失/重复/外部。定向17项通过;API全量60套653项通过(测试中的Redis/Prometheus不可用warning来自既有隔离场景)。API生产配置TypeScript/构建、增量Prettier/ESLint与diff检查通过。曾误用基础tsconfig执行含测试文件的全量tsc,因该配置未加载Jest全局类型失败;改按仓库tsconfig.build.json核验生产代码,测试文件由完整ts-jest回归校验,未为此改动既有类型配置。
|
||||
- 当前修复代码在本机读取此前只读取得的真实原始文件:两种模式均准确拒绝N7;只在内存清空N7公式、保留损坏cellImage节点后,两模式读取33张图片且不串位。独立Python ElementTree解析原始OOXML建立期望位置/图片SHA256,字节模式33张全部逐一匹配;原始文件摘要不变,未生成或上传替换业务表格。
|
||||
- 证据在本机%TEMP%/cmpp-wps-diagnosis-20260907:api-full.log、independent-image-hashes.json、real-file-verification.json及受控原始文件。真实客户文件不进入Git。此前浏览器只读状态核验尝试登录返回401,未取得该项浏览器证据;本轮未复试、重置账号或修改服务器。已依据PG持久失败记录、真实MinIO文件、运行解析器与本地修复解析结果完成复现/回归;新版本的线上API/Worker/浏览器验收待另行授权部署后执行,不将本地文件回归称为线上导入成功。
|
||||
|
||||
## 2026-09-07 夜间累计发送量审核(实现与发布前验证)
|
||||
|
||||
- 用户授权实施、提交、推送和测试/预生产发布,并要求复用短信审核。起始main为e281ff8,实时origin/main为f885f0b,暂存空;9份原文档修改及3份未跟踪草稿保护,仅提交本轮精确追加文档。发布同时包含此前本地WPS修复e281ff8。
|
||||
- 只读根因:旧规则只对category=marketing/promo/promotion/营销的单任务号码数判断;CMPP单号码评估和批量快速入队没有跨请求夜间计数。已有短信审核提供CMPP模板不匹配同内容10秒聚合、号码列表/详情/批量操作,适合复用。测试和预生产现场版本均f885f0b;夜间规则均通用5000启用,无个性化覆盖,现场本夜首次Submit均0。测试119509条消息/130769次Submit;预生产本轮基线93243/91563、签名653,不能沿用昨天的旧数字。
|
||||
- 实现:两张夜间计数/幂等表、审核续发租约字段及兼容迁移;所有业务入口在共享发送Worker首次提交前执行应用级夜间门禁,跨午夜连续,第5001条起挂起,保持分片/重试/幂等业务计数。首次初始化从持久首次Submit补齐历史;新增审核记录按应用、原始相同内容、10秒窗口聚合并复用现有UI。审核批准只释放已锁定任务,持久续发记录和15秒扫描恢复入队失败,稳定新jobId避免旧已完成任务吞掉续发。数据库故障向上抛出,不能当路由失败或默认放行。
|
||||
- 规则沿用既有编码/ID和历史记录,改名并去除旧营销计算;应用覆盖/停用回落、强制人工审核、整数阈值、北京时间与夜间时段延期生效。UI只修改口径、说明及审核来源标签,无CSS/Gateway/依赖/余额/通道/客户配置调整。触及的既有文件按现行Prettier门禁规范化,并清理历史拆分遗留的未使用导入及等价控制字符判断;未扩大lint例外。
|
||||
- 本机后端62套665项、前端21套105项回归通过;新夜间单元与发送门禁12项通过,生产类型和构建通过。测试机独立候选、真实PG双实例并发/隔离/午夜/幂等/覆盖/历史初始化/事务回滚及独立Redis审核恢复11组通过;public消息/Submit计数不变,Gateway调用0、业务队列写入0。固定时间在隔离service层注入,不构造真实短信。
|
||||
- 现场真实测试页面三尺寸基线读取规则、编辑取消、短信审核空态/刷新通过,API200、无新增控制台错误,未保存线上业务规则。测试机初期Tailscale离线超时,用户恢复后正常密码认证;不是Git认证问题,未修改SSH配置。当前浏览器技能未提供,按frontend-testing-debugging技能和既有任意浏览器授权使用Playwright/Edge。临时脚本初次将Windows路径URL编码未还原导致截图失败,修正fileURLToPath后通过;隔离验证先修正模板变量表名与BullMQ优先队列计数口径后重跑通过,不作为业务缺陷。
|
||||
- 本机证据%TEMP%/cmpp-night-risk-20260907,测试候选/opt/cmpp-night-candidate-20260907,PG/Redis隔离结果/tmp/night-pg-verification.log。最终门禁及发布后真实页面/服务/队列验收另记下节;尚未执行真实短信发送、供应商压测或实际备份恢复。
|
||||
|
||||
Reference in New Issue
Block a user