From c33cc6f6c33a7002b256c2f9fe8a5a89c8474b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E8=BF=9B?= Date: Tue, 27 Oct 2026 18:07:46 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B2=89=E9=BB=98=E6=9C=9F=2011.1?= =?UTF-8?q?=E3=80=813.5=20=E6=B5=8B=E8=AF=95=E7=8E=AF=E5=A2=83=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=BB=93=E6=9E=9C=E4=B8=8E=E5=89=8D=E7=AB=AF=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=B1=87=E6=80=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- ...7-实名即生效套餐沉默期-前端接口变更说明.md | 2 +- ...026-10-27-订单拆分至沉默期-前端修改汇总.md | 246 ++++++++++++++++++ .../add-package-silence-period/tasks.md | 8 +- 3 files changed, 252 insertions(+), 4 deletions(-) create mode 100644 docs/2026-10-27-订单拆分至沉默期-前端修改汇总.md diff --git a/docs/2026-10-27-实名即生效套餐沉默期-前端接口变更说明.md b/docs/2026-10-27-实名即生效套餐沉默期-前端接口变更说明.md index 9a4a473b..f351024f 100644 --- a/docs/2026-10-27-实名即生效套餐沉默期-前端接口变更说明.md +++ b/docs/2026-10-27-实名即生效套餐沉默期-前端接口变更说明.md @@ -88,7 +88,7 @@ - 卡列表、设备列表返回 `first_purchase_at`,支持 `first_purchase_start`、`first_purchase_end`(RFC3339)筛选;卡详情、设备详情、资产解析返回 `first_purchase_at`。 - 卡、设备导出末尾新增"首次购买套餐时间"列。 -- 首次购买套餐记录:`GET /api/admin/assets/:asset_type/:id/first-purchase-records`(asset_type 为 card / device),按世代倒序,含来源(首次购买套餐 / 历史回填)、订单号、结束时间与原因。 +- 首次购买套餐记录:`GET /api/admin/package-silence/assets/:asset_type/:id/first-purchase-records`(asset_type 为 card / device),按世代倒序,含来源(首次购买套餐 / 历史回填)、订单号、结束时间与原因。 - 换货后的新资产不会因换货得到首次购买套餐时间,要等它在当前世代真正支付套餐订单;旧资产换货回库后该时间清空,旧世代记录带结束时间与原因"换货回库"。 - 绑定在设备上的卡不记录首次购买套餐时间;只读,不提供修改。 diff --git a/docs/2026-10-27-订单拆分至沉默期-前端修改汇总.md b/docs/2026-10-27-订单拆分至沉默期-前端修改汇总.md new file mode 100644 index 00000000..2fb5757e --- /dev/null +++ b/docs/2026-10-27-订单拆分至沉默期-前端修改汇总.md @@ -0,0 +1,246 @@ +# 订单按类别拆分 → 套餐沉默期:前端修改汇总 + +日期:2026-10-27 +范围:`Iteration/8-11` 提交 `eb9f12d1`(后台订单按类别拆分)至 `af57de0d`(沉默期配置口径调整),均已部署测试环境。 +接口字段以 `docs/admin-openapi.yaml` 为准;本文说明页面要改什么。 + +## 一、总览 + +| # | 变更 | 前端是否要改 | 章节 | +|---|---|---|---| +| 1 | 后台订单按平台 / 代理商 / 在线支付拆分列表与导出 | **要改**:拆三个页面 | 二 | +| 2 | 企业账号只能访问授权给本企业的资产 | **要改**:企业账号隐藏部分资产操作 | 三 | +| 3 | 实名即生效套餐沉默期、延期办理 | **要改**:套餐配置、购买、资产套餐展示、延期页面、总开关、政策 | 四 | +| 4 | 卡 / 设备首次购买套餐时间 | **要改**:列表列、筛选、详情、记录弹窗 | 五 | +| 5 | 后台线下下单不再绕开实名 | 不改接口,展示需知晓 | 六 | +| 6 | 退款 0 元可提交审批 | 不改接口 | 六 | +| 7 | 排队激活停复机、孤儿套餐、微信查单 | 不涉及前端 | — | + +--- + +## 二、后台订单按类别拆分 + +### 2.1 新接口 + +| 页面 | 列表接口 | 导出场景(`POST /api/admin/export-tasks` 的 `scene`) | 包含 | +|---|---|---|---| +| 平台订单 | `GET /api/admin/orders/platform` | `order_platform` | 后台下单且线下支付:平台自营、赠送、平台代购代理名下的卡 | +| 代理商订单 | `GET /api/admin/orders/agent` | `order_agent` | 后台下单且从代理钱包扣款:代理自购、代理给下级购买、平台代扣代理钱包、代理 OpenAPI 下单 | +| 在线支付订单 | `GET /api/admin/orders/online` | `order_online` | 个人客户在客户端下的单:微信、支付宝、卡钱包支付,自动续费,自动购买,待支付 | + +- 三个列表接口的查询参数、返回结构与 `GET /api/admin/orders` 完全相同,**不需要也不接受类别参数**。 +- 三类互不重叠:相同筛选条件下三个 `total` 之和等于 `GET /orders` 的 `total`。 +- 导出 `query.filters` 与 `scene=order` 相同,表头相同。导出任务列表里新任务的 `scene` 是新值,显示中文请按上表映射。 +- 订单详情仍用 `GET /api/admin/orders/{id}`;`GET /orders` 与场景 `order` 保留不变。 + +```json +{ "scene": "order_online", "format": "xlsx", + "query": { "filters": { "payment_status": 2, "start_time": "2026-10-01T00:00:00+08:00", "end_time": "2026-10-26T23:59:59+08:00" } } } +``` + +### 2.2 账号可见范围 + +| 账号 | 平台订单 | 代理商订单 | 在线支付订单 | +|---|---|---|---| +| 超管、平台 | 全部 | 全部 | 全部 | +| 代理 | 平台为本店名下卡代购的单 | 买家是本店的钱包订单 | **始终为空**,隐藏此页面 | +| 企业 | 无权限 | 无权限 | 无权限 | + +企业账号调用以下接口返回无权限("企业账号无权访问订单"):`GET /orders`、`/orders/platform|agent|online`、`GET /orders/{id}`、`POST /orders/purchase-check`。 + +### 2.3 前端改动 + +1. 订单管理下拆三个页面,分别调用对应列表接口,导出按钮传对应场景。 +2. 原"订单列表"页可保留或下线。 +3. 代理账号隐藏"在线支付订单";企业账号隐藏订单菜单。 + +--- + +## 三、企业账号的资产访问范围 + +`/api/admin/assets/:identifier/*` 对企业账号收紧: + +- **只能访问当前授权给本企业的卡或设备**。未授权与不存在一样返回"未找到"。涉及资产解析、实时状态、刷新、套餐、当前套餐、钱包、订单、操作日志、停机 / 复机。 +- 以下操作**企业账号一律无权限**(即使资产已授权),返回 `CodeForbidden`"企业账号无权执行该资产操作": + +| 接口 | 操作 | +|---|---| +| `PATCH /assets/:identifier/packages/:package_usage_id/expires-at` | 改套餐有效期 | +| `PATCH /assets/:identifier/packages/:package_usage_id/used-data` | 改已用量 | +| `PATCH /assets/:identifier/deactivate` | 停用 | +| `PATCH /assets/:identifier/polling-status` | 开关轮询 | +| `PATCH /assets/:identifier/realname-status` | 改实名状态 | + +- 停机 / 复机(`POST /stop`、`/start`)对已授权资产仍可用。 + +**前端改动**:企业账号登录时隐藏上表 5 个操作按钮;资产搜索结果为"未找到"时按普通未找到提示,不要提示"无权限"。 + +--- + +## 四、实名即生效套餐沉默期 + +> 规则见 `docs/沉默期技术方案/实名即生效套餐沉默期技术方案_v3.md` 与 OpenSpec `add-package-silence-period`。 + +### 4.1 总开关对页面的影响 + +总开关 `package.silence.enabled` **默认关闭**。 + +| 页面 / 功能 | 关闭时 | 打开时 | +|---|---|---| +| 资产套餐列表、H5 套餐历史里的 `silence` 对象 | **不返回**,页面不显示沉默期 | 返回,显示状态、截止日 | +| "延期"入口 | 不显示 | `silence.extendable = true` 时显示 | +| 延期资格、试算、下单、线下登记、特殊延期 | 返回 **1274** | 可用 | +| 套餐默认沉默期、延期政策、企微审批场景配置 | 可用 | 可用 | +| 购买时调整沉默期 | 可用 | 可用 | + +总开关只能用专用接口切换(通用"系统配置"接口里只读): + +- `GET /api/admin/package-silence/switch`:返回 `enabled` 与打开前 4 项检查 `precheck[]`(`code`、`name`、`passed`、`count`)。 +- `PUT /api/admin/package-silence/switch` `{ "enabled": true|false }`:仅超级管理员。打开前检查不通过返回 **1275**,`data.failed_items` 为未满足项,直接展示;关闭不检查。 + +**前端改动**:新增"沉默期总开关"设置页(超管可见),展示 4 项检查结果与开关。 + +### 4.2 套餐配置 + +- 新增 / 编辑套餐增加 `silence_period_days`(1~90)、`silence_extension_enabled`(是否支持付费延期,默认 true)。 + - **实名即生效的正式套餐必填**默认沉默期,新建时预填 30;不填或越界返回 **1260**。 + - **购买即生效的正式套餐可选填**(只在店铺分配覆盖为实名即生效时使用)。 + - 加油包不显示、不提交。 +- 套餐响应新增 `silence_period_days`、`silence_extension_enabled`、`silence_config_required`(是否必填,用来决定表单必填标记)。 +- 生效条件变更限制(返回 **1262**): + - 实名即生效套餐改为购买即生效:禁止。 + - 店铺分配(单个、批量、系列授权)把实名即生效套餐覆盖为购买即生效:禁止。 + - 店铺分配把购买即生效套餐覆盖为实名即生效:**套餐已配置默认沉默期才允许**。 + - 套餐由购买即生效改为实名即生效:同一请求必须带 `silence_period_days`。 +- "未配置沉默期的实名即生效套餐"清单:套餐列表加查询参数 `silence_unconfigured=true`(含"本身购买即生效、但有店铺分配覆盖为实名即生效"的套餐);套餐导出同样传该筛选。套餐导出新增"默认沉默期(天)""是否支持付费延期"两列。 + +**前端改动**:套餐表单加两个字段(按 `expiry_base`、`package_type` 控制显示与必填);套餐列表加"未配置沉默期"筛选。 + +### 4.3 后台购买时调整沉默期 + +`POST /api/admin/orders` 新增可选字段: + +- `silence_period_days`(≥ 1,不设上限)、`silence_reason`(填了天数时必填)。 +- 需要 `package_silence:override` 权限,无权限传值返回 **1261**。 +- 不超过默认值直接生效;超过默认值时按延期政策直接生效,或**先按默认值购买并提交企微审批**。发起人未绑定企微成员时购买被拒。 +- 只对"资产未实名时购买的实名即生效主套餐"生效,其他情况忽略。 + +**前端改动**:后台下单弹窗增加"本次沉默期(天)""调整原因",有权限才显示。 + +### 4.4 资产套餐展示 + +后台资产套餐历史 / 当前套餐、H5 套餐历史(`GET /api/c/v1/asset/package-history`)每笔套餐增加 `silence` 对象(总开关打开且适用时返回): + +| 字段 | 说明 | +|---|---| +| `silence_status` / `silence_status_name` | `waiting` 待实名(延期后为"延期待实名")/ `expired` 沉默期已过期 / `ended` 沉默期已结束;待实名但已过截止的直接按 `expired` 返回 | +| `silence_deadline_at`、`silence_start_at`、`silence_period_days` | 截止时间(当日 23:59:59)、起算时间、天数 | +| `silence_extended_days`、`silence_paid_extended_days`、`silence_extension_count`、`silence_free_extension_used` | 延期累计 | +| `silence_expired_at`、`silence_adjust_pending` | 过期时间、调整审批中 | +| `extendable` | 是否显示"延期"入口 | + +沉默期流水:后台 `GET /api/admin/package-silence/records?package_usage_id=`,H5 `GET /api/c/v1/package-silence/records?package_usage_id=`。 + +**前端改动**:套餐列表显示沉默期状态与截止日、"延期"入口、"沉默期流水"弹窗(后台与 H5)。 + +### 4.5 延期(后台) + +均在 `/api/admin/package-silence` 下: + +| 接口 | 权限 | 说明 | +|---|---|---| +| `GET /eligibility?package_usage_id=` | — | 资格:`can_extend`、`special_extension_available`、`reason`、`min_days`/`max_days`、`min_months`/`max_months`、`unit_price`、`options[]`(每档计费天数、金额、新截止日)。**金额由后端算,前端只传天数** | +| `GET /quote?package_usage_id=&days=` | — | 按天数试算(按 30 天向上取整:1→30、31→60) | +| `POST /orders/qrcode` | `package_silence:extend` | 生成支付二维码:`package_usage_id`、`days`、`payment_method`(wechat/alipay)、`request_id`、`evidence_refs`;返回 `qr_content`,前端渲染为二维码 | +| `POST /orders/offline` | `package_silence:offline` | 登记线下付款:`package_usage_id`、`days`、`offline_payment_method_id`、`offline_trade_no`、`paid_amount`(必须等于计算金额,否则 **1273**)、`paid_at`、`payment_voucher_keys`(1~5)、`evidence_refs`、`request_id`。交易单号重复 **1272**。默认进企微审批 | +| `GET /orders`、`GET /orders/:id` | — | 延期订单列表 / 详情;导出场景 `package_silence_order` | +| `POST /special` | `package_silence:extend`(批量另需 `package_silence:extend_batch`) | 特殊延期:`extension_type`(free/discount/complaint_compensation/system_compensation/special_customer)、`items[]`(`package_usage_id` + `days`)、`reason`、`basis`、`evidence_refs`、`amount`;优惠价有收款时填收款方式、交易单号、凭证。批量逐行校验,失败返回 `data.rows[]`(行号与原因)。免费次数用完 **1267** | +| `GET /batches`、`GET /batches/:id` | — | 批次与明细(`has_exception=true` 只看含异常的) | +| `POST /extensions/:id/handle` | `package_silence:exception` | 异常明细 `action=retry|close` + `reason` | +| `GET /usages?view=expiring|expired|all` | — | 即将过期(默认 7 天内)/ 已过期套餐;导出场景 `package_silence_usage` | + +延期政策(`package_silence:policy`):`GET/POST /policies`、`GET/PUT /policies/:id`、`PUT /policies/:id/status`、`GET /policies/match?package_id=`。同级重叠返回 **1269**。 + +**前端改动**:新增页面——延期弹窗(资格 + 试算 + 二维码 / 线下登记 / 特殊延期三种方式)、延期订单、延期批次与异常处理、即将过期 / 已过期套餐、延期政策管理。 + +### 4.6 延期(H5) + +均在 `/api/c/v1/package-silence` 下,资产须属于当前客户: + +- `GET /eligibility`、`GET /quote`:同后台。 +- `POST /orders`:自助下单(`package_usage_id`、`days`、`payment_method`、`request_id`),返回 `qr_content`(支付链接或二维码内容);支付成功自动延期。 +- `GET /orders`、`GET /orders/:id`:我的延期订单。 +- `GET /records`:沉默期流水。 + +### 4.7 退款 + +沉默期已过期的套餐申请退款返回 **1268**(总开关打开时)。 + +### 4.8 企微审批场景 + +在"企微审批场景"配置业务类型 **沉默期审批(`package_silence_approval`)**。模板需有"申请类型"单选控件,选项映射:`购买时调整沉默期`、`特殊延期`、`线下付费延期`。可映射的业务字段见场景配置页。 + +**前端改动**:审批场景页的业务类型下拉加入"沉默期审批"。 + +### 4.9 错误码 + +| 码 | 名称 | 说明 | +|---|---|---| +| 1260 | silence_period_out_of_range | 沉默期天数不在允许范围 | +| 1261 | silence_override_forbidden | 无权限调整沉默期 | +| 1262 | package_expiry_base_change_forbidden | 不允许变更该套餐的生效条件 | +| 1263 | silence_extension_not_expired | 套餐未过期 / 无沉默期 / 已激活 / 已退款(`data.reason` 细分) | +| 1264 | silence_extension_disabled | 该套餐不支持付费延期(可申请特殊延期) | +| 1265 | silence_extension_exceeds_limit | 超过可延期期限(`data.min_months`、`data.max_months`) | +| 1266 | silence_extension_months_invalid | 延期天数不在允许范围(`data.min_days`、`data.max_days`) | +| 1267 | silence_free_extension_used_up | 免费延期次数已用完 | +| 1268 | silence_expired_not_refundable | 沉默期已过期的套餐不能退款 | +| 1269 | silence_policy_overlap | 延期政策重叠 | +| 1270 | silence_extension_no_policy | 未匹配到延期政策 | +| 1271 | silence_extension_order_pending | 已有未结束的延期订单或申请 | +| 1272 | silence_offline_trade_no_duplicate | 线下交易单号已登记 | +| 1273 | silence_offline_amount_mismatch | 实收金额与计算金额不一致(`data.expected_amount`) | +| 1274 | silence_feature_disabled | 沉默期功能未开启 | +| 1275 | silence_switch_precheck_failed | 总开关打开前检查未通过(`data.failed_items`) | + +### 4.10 新增权限点 + +`package_silence:override`、`package_silence:extend`、`package_silence:extend_batch`、`package_silence:offline`、`package_silence:exception`、`package_silence:policy`。前端按权限控制按钮显示,角色配置页需能勾选。 + +--- + +## 五、卡 / 设备首次购买套餐时间 + +- 卡列表、设备列表返回 `first_purchase_at`,支持 `first_purchase_start`、`first_purchase_end`(RFC3339)筛选;卡详情、设备详情、资产解析返回 `first_purchase_at`。 +- 卡、设备导出末尾新增"首次购买套餐时间"列。 +- 首次购买套餐记录:`GET /api/admin/package-silence/assets/:asset_type/:id/first-purchase-records`(`asset_type` 为 `card` / `device`),按世代倒序,含来源(首次购买套餐 / 历史回填)、订单号、结束时间与原因。 +- 换货后的新资产不会因换货得到该时间,要等它在当前世代真正支付套餐订单;旧资产换货回库后该时间清空,旧记录带结束原因"换货回库"。 +- 绑定在设备上的卡不记录;只读,不提供修改。不受沉默期总开关影响。 + +**前端改动**:卡 / 设备列表加列与时间范围筛选,详情显示该时间,加"首次购买套餐记录"弹窗。 + +--- + +## 六、只影响展示、不改接口 + +- **后台线下下单不再绕开实名**(`69ec98aa`):后台给**平台自营资产**线下下单、或线下下单**赠送套餐**时,若资产未实名、套餐是实名即生效,套餐现在是"待生效(等待实名)",实名后才生效;以前会直接"生效中"。订单 `buyer_type` 仍是 `personal`。前端不用改,测试和运营看到状态变化属正常。 +- **退款 0 元可提交审批**(`c9e5d655`):以前 0 元退款提交审批报数据库错误,现在正常。前端若对退款金额做了 `> 0` 校验,可放宽为 `≥ 0`。 + +--- + +## 七、前端改动清单 + +- [ ] 订单管理拆三页(平台 / 代理商 / 在线支付),各自导出场景;代理隐藏在线支付页;企业隐藏订单菜单 +- [ ] 企业账号隐藏资产的改有效期、改已用量、停用、开关轮询、改实名状态 5 个按钮 +- [ ] 沉默期总开关设置页(超管) +- [ ] 套餐表单:默认沉默期、是否支持付费延期;套餐列表"未配置沉默期"筛选 +- [ ] 后台下单弹窗:本次沉默期、调整原因(`package_silence:override`) +- [ ] 资产套餐列表(后台 + H5):沉默期状态、截止日、延期入口、沉默期流水 +- [ ] 后台延期:资格 / 试算、二维码、线下登记、特殊延期(单个 + 批量导入) +- [ ] 延期订单、延期批次与异常处理、即将过期 / 已过期套餐页面(含导出) +- [ ] 延期政策管理页 +- [ ] H5:延期资格、试算、自助下单、我的延期订单、流水 +- [ ] 企微审批场景业务类型加"沉默期审批" +- [ ] 角色权限配置加 6 个 `package_silence:*` 权限点 +- [ ] 卡 / 设备:首次购买套餐时间列、筛选、详情、记录弹窗、导出列 +- [ ] 错误码 1260~1275 的提示文案 diff --git a/openspec/changes/add-package-silence-period/tasks.md b/openspec/changes/add-package-silence-period/tasks.md index f9e6c960..cea2b321 100644 --- a/openspec/changes/add-package-silence-period/tasks.md +++ b/openspec/changes/add-package-silence-period/tasks.md @@ -28,8 +28,9 @@ - [x] 3.1 套餐新增 / 编辑 DTO 与校验:实名即生效套餐必填 `silence_period_days`(1~90)、`silence_extension_enabled`;普通套餐禁止写入;修改默认值写审计 `package.silence_default_changed` - [x] 3.2 生效条件变更约束:套餐服务与店铺分配(单个、批量、系列授权)共用校验函数,阻断 §3.3 的三种变更,`from_purchase → from_activation` 要求同时提供默认沉默期 - [x] 3.3 "未配置沉默期的实名即生效套餐"列表接口(筛选、导出) -- [ ] 3.4 分配覆盖口径(design D11):共用条件"正式套餐本身 `from_activation` 或存在未删除的分配覆盖为 `from_activation`",用于未配置清单(列表、导出)与打开前检查;购买即生效正式套餐允许选填默认沉默期(不强制),加油包仍禁止;分配覆盖 `from_purchase → from_activation` 在套餐已配置默认沉默期时放行(单个、批量、系列授权共用校验) -- [ ] 3.5 测试环境核对:套餐 708 / 710 / 712 出现在未配置清单与打开前检查中;配置默认沉默期后回填套餐记录 20005;未配置时分配覆盖为实名即生效被拒绝,配置后放行 +- [x] 3.4 分配覆盖口径(design D11):共用条件"正式套餐本身 `from_activation` 或存在未删除的分配覆盖为 `from_activation`",用于未配置清单(列表、导出)与打开前检查;购买即生效正式套餐允许选填默认沉默期(不强制),加油包仍禁止;分配覆盖 `from_purchase → from_activation` 在套餐已配置默认沉默期时放行(单个、批量、系列授权共用校验) +- [x] 3.5 测试环境核对:套餐 708 / 710 / 712 出现在未配置清单与打开前检查中;配置默认沉默期后回填套餐记录 20005;未配置时分配覆盖为实名即生效被拒绝,配置后放行 + - 核对结果(2026-10-27,部署 `af57de0d`):打开前检查与 `silence_unconfigured=true` 列表均为 708 / 710 / 712(3 个);新建购买即生效套餐 825 在系列授权 215 覆盖为实名即生效返回 1262,配置默认沉默期 20 天后放行(分配 289);加油包 709 填沉默期返回 1001;708 / 710 / 712 配置 30 天后回填工具清单"可回填 1、将过期 1",执行后记录 20005 `waiting`、截止 2026-10-18 23:59:59、流水 `backfill`,重复执行"待回填 0"。 ## 4. 沉默期设置、判定与激活拦截(§4、§5) @@ -104,8 +105,9 @@ - [x] 11.1 部署后确认总开关关闭时行为不变:新购买写入沉默期字段,过期后实名仍激活,延期接口返回 `silence_feature_disabled` - 验证结果(2026-10-27,部署 `69ec98aa`):总开关 `enabled=false`;代理 539 未实名卡 8019 后台钱包购买验证套餐 823(订单 892)→ 套餐记录 20175 `waiting`、30 天、截止 2026-11-26 23:59:59,流水 `set / order_paid`,首次购买套餐时间与记录写入;资格、试算、二维码下单、线下登记、特殊延期均返回 1274,未产生延期订单 / 批次 / 明细;把 20175 截止改为 2026-10-20 后将卡标为已实名,孤儿扫描 10 秒内激活(status=1),`silence_status` 保持 `waiting`、不写判定流水。 - 发现并修复(`69ec98aa`):后台平台自营资产与赠送套餐线下订单 `buyer_type=personal`,`activateMainPackage` 误判为 C 端购买,未实名也直接生效、不进沉默期;增加 `order.Source == client` 条件后,代理卡 8030 线下购买赠送套餐 824(订单 893)→ 记录 20176 待实名、`waiting`、30 天。 - - 待 11.10 清理:套餐 822 / 823 / 824、分配 288、订单 891(卡 11895)/ 892(卡 8019,代理 539 钱包扣 1 分)/ 893(卡 8030)及其套餐记录、沉默期流水、首次购买套餐时间与记录;卡 8019 恢复 `real_name_status=0`、`first_realname_at=NULL`、`enable_polling=true`。 + - 待 11.10 清理:套餐 822 / 823 / 824 / 825、分配 288 / 289、订单 891(卡 11895)/ 892(卡 8019,代理 539 钱包扣 1 分)/ 893(卡 8030)及其套餐记录、沉默期流水、首次购买套餐时间与记录;卡 8019 恢复 `real_name_status=0`、`first_realname_at=NULL`、`enable_polling=true`。 - [ ] 11.2 总开关打开前检查:逐项制造不满足条件,确认拒绝及返回内容;全部满足后打开成功并写审计 + - 进度(2026-10-27):未满足时 `PUT /switch` 返回 1275 与 `failed_items`;临时停用默认政策后 4 项全部拦下(已恢复);测试库 16 个实名即生效套餐与 708 / 710 / 712 已配置默认沉默期 30 天(各写审计 `package.silence_default_changed`),回填后前 3 项通过;剩"沉默期企微审批场景"待业务建模板后配置,再验证打开成功与审计。 - [ ] 11.3 沉默期设置、购买时调整(直接生效 / 审批通过 / 驳回 / 免审批)、实名与过期判定(§14 第 1~12 条) - [ ] 11.4 延期资格与计费(§14 第 13~15 条,含示例表四种情况) - [ ] 11.5 四种延期办理(§14 第 16~21 条):H5 微信或支付宝真实小额支付、后台二维码扫码、线下登记审批、特殊与免费延期、批量部分失败、跨天支付异常退款