feat: add platform dunning notifications

This commit is contained in:
Codex
2026-06-30 07:28:32 +08:00
parent e66623158d
commit 51f8cbdec8
26 changed files with 1782 additions and 24 deletions
+74 -2
View File
@@ -2519,7 +2519,7 @@ src/services/ai.ts AI 择校推荐生成、报告列表、报告详情
src/services/pronunciation.ts H5/小程序单词发音适配
src/services/tenantAdmin.ts 租户后台看板、权限矩阵、成员、学生创建/批量导入/分班/备注/跟进、内容、营销、设置、角色模板写操作、公共题库采纳/同步/单条和批量冲突处理、导入详情/复检、CRM 配置/队列、分佣规则/成员比例/订单/结算、优惠券规则/核销报表、积分任务/兑换配置和记录
src/services/tenantFinance.ts 租户财务运营:退款状态机、官方账单任务、对账批次/明细、差错工单、异常订单和人工调整凭证
src/services/platformAdmin.ts 平台后台租户、租户详情、账务资料、平台审计查询/CSV 导出、平台审计告警规则/列表/状态更新、审计告警外部通知渠道/发送事件、套餐账单、订阅账单候选/dry-run/批量生成、自动计费生成结果查看、逾期预览/内部催缴记录、用量、公共题库授权
src/services/platformAdmin.ts 平台后台租户、租户详情、账务资料、平台审计查询/CSV 导出、平台审计告警规则/列表/状态更新、审计告警外部通知渠道/发送事件、套餐账单、订阅账单候选/dry-run/批量生成、自动计费生成结果查看、逾期预览/内部催缴记录、催缴外部通知渠道/发送事件、用量、公共题库授权
```
验证命令:
@@ -2763,11 +2763,83 @@ GET /api/platform-admin/invoices/reminders?tenantId=<tenantId>&invoiceId=<invoic
- 执行成功后重新加载 `/api/platform-admin/invoices``/api/platform-admin/invoices/reminders`
- `platform-dunning` worker 可每天在 `platform-billing` 之后运行一次;它不会自动停用租户,停用仍走平台管理员状态变更流程。
### 平台账务催缴外部通知
平台催缴外部通知用于把 `tenant_invoice_reminders` 中的内部催缴记录推送到平台自己的值班群、财务群或运营 webhook。它属于平台超级管理员能力,前端只能调用后端 API 查看和配置渠道,不要直接写 Supabase 表,也不要在页面状态、日志、埋点或本地缓存保存 webhook secret。
查询催缴通知渠道:
```text
GET /api/platform-admin/dunning-notification-channels?enabled=true&limit=50
```
渠道响应不会返回原始 `webhookUrl`,只返回安全摘要:
```json
{
"items": [
{
"id": "...",
"channelCode": "finance_ops",
"name": "平台财务催缴群",
"enabled": true,
"provider": "wecom",
"secretRef": "app_private.platform_secrets:webhook:platform_dunning_finance_ops",
"reminderTypes": ["overdue", "final_notice"],
"reminderChannels": ["internal"],
"minReminderLevel": 1,
"tenantIds": [],
"webhook": {
"protocol": "https",
"host": "qyapi.weixin.qq.com",
"pathname": "/cgi-bin/webhook/send"
}
}
]
}
```
保存催缴通知渠道:
```http
PUT /api/platform-admin/dunning-notification-channels
Content-Type: application/json
{
"channelCode": "finance_ops",
"name": "",
"provider": "wecom",
"webhookUrl": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...",
"secret": "optional-signing-secret",
"reminderTypes": ["overdue", "final_notice"],
"reminderChannels": ["internal"],
"minReminderLevel": 1,
"tenantIds": [],
"timeoutSec": 10
}
```
查询发送事件:
```text
GET /api/platform-admin/dunning-notification-events?status=failed&limit=50
GET /api/platform-admin/dunning-notification-events?invoiceId=<invoiceId>&limit=50
```
前端展示建议:
- 工作台可展示启用渠道数、最近发送事件、失败数和待重试数;当前 `apps/taro/src/pages/platform-admin/workbench` 已接摘要第一版。
- 账务中心后续可在催缴记录旁展示外部通知状态,但不要把事件状态当作账单真实付款状态。
- `secret` 只在保存渠道时提交一次;后端写入 `app_private.platform_secrets`,响应只回显 `secretRef`
- API 会对事件 `requestPayload` 递归脱敏,worker 会对联系人电话、邮箱做掩码。前端仍不要把 payload 原样写入日志。
- 生产 readiness 会阻断启用的非 HTTPS/localhost webhook;钉钉/飞书签名渠道必须有平台私密 secret。
- `platform-dunning-notifications` worker 适合在 `platform-dunning` 后每 5 到 15 分钟运行一次;发送成功后会把该催缴记录标记为 `sent`,发送失败会按退避策略重试并在终止失败后标记 `failed`
下一批前端开发重点:
- 学生端:地区选择、题目视频播放、题目反馈、错题/收藏专题页、模考交卷报告、收银台、订单详情、售后入口、题干/解析/知识手册 RichContent 安全渲染、逐题复盘、背单词卡片学习/发音/收藏练习、资料短签名水印预览/下载确认、个人中心消息中心、积分任务、积分兑换和积分明细第一版已接;下一批继续补独立消息中心增强、真正 KaTeX/小程序公式方案、私有题图签名资源映射、背单词更细统计、小程序支付容器和分享场景。
- 租户后台:工作台已接权限驱动模块入口;学生运营页已接学生创建/更新、禁用/恢复、批量导入、批量分班、学生备注、跟进任务和完成跟进第一版;题库内容页已接公共题库采纳/同步、冲突查看、单条/批量采纳平台或保留本地、导入问题、模板预览/下载、异步任务轮询和导入后复检第一版;营销中心已接 CRM 配置保存、CRM 队列按状态查看、分佣默认规则、成员分佣比例、分佣订单明细、结算单生成、审核通过/驳回、标记线下打款、优惠券规则表单、筛选、核销明细、核销报表、积分任务/兑换操作台和用户通知查看第一版;财务运营页已接退款申请/审核/供应商提交与查询、官方账单任务、对账批次/异常明细、差错工单处理、人工调整凭证提交/复核和异常订单运营台第一版;租户设置页已接主题模板、草稿预览、发布、角色模板创建、编辑、停用、权限点、菜单、模块、字段、基础数据范围、成员搜索/新建、成员绑定模板、成员状态和额外权限覆盖第一版;下一批继续补更精细的学生导入模板体验、真实生产账单抽样验收、真实打款 provider、发票、更细数据范围 UI 和主题素材库。
- 平台后台:租户创建、租户详情、状态变更、账务资料维护、最近平台审计查询/CSV 导出、开放审计告警展示/确认/解决、审计告警外部通知渠道/事件状态摘要、订阅开通、账单生成、订阅账单候选预览、dry-run、批量生成、自动计费生成结果查看、人工收款确认、逾期预览、内部催缴生成、催缴记录查看、用量录入、公共题库授权编辑已接第一版;后端会跳过已开票订阅并记录 `platform.invoice.subscription_batch_created` 审计,`platform-billing` worker 会自动生成即将到期订阅账单并记录 `platform.invoice.subscription_auto_created` 审计,`platform-dunning` worker 会标记已过期未结清服务费账单、生成 `tenant_invoice_reminders` 并记录 `platform.invoice.overdue_processed` 审计,`platform-audit-alerts` worker 会把高风险平台审计动作转换为内部告警,`platform-audit-notifications` worker 会把开放告警按渠道发送外部通知;前端只展示候选、预览结果、跳过结果、逾期处理结果、开放告警、通知事件和生成后的账单/审计,不要直接更新账单状态、租户 `billing_status`、告警表或通知事件表;继续补租户基础资料编辑增强、平台审计告警升级策略、外部催缴通知和平台在线收款。
- 平台后台:租户创建、租户详情、状态变更、账务资料维护、最近平台审计查询/CSV 导出、开放审计告警展示/确认/解决、审计告警外部通知渠道/事件状态摘要、催缴外部通知渠道/事件状态摘要、订阅开通、账单生成、订阅账单候选预览、dry-run、批量生成、自动计费生成结果查看、人工收款确认、逾期预览、内部催缴生成、催缴记录查看、用量录入、公共题库授权编辑已接第一版;后端会跳过已开票订阅并记录 `platform.invoice.subscription_batch_created` 审计,`platform-billing` worker 会自动生成即将到期订阅账单并记录 `platform.invoice.subscription_auto_created` 审计,`platform-dunning` worker 会标记已过期未结清服务费账单、生成 `tenant_invoice_reminders` 并记录 `platform.invoice.overdue_processed` 审计,`platform-dunning-notifications` worker 会把内部催缴记录按渠道发送外部通知,`platform-audit-alerts` worker 会把高风险平台审计动作转换为内部告警,`platform-audit-notifications` worker 会把开放告警按渠道发送外部通知;前端只展示候选、预览结果、跳过结果、逾期处理结果、开放告警、通知事件和生成后的账单/审计,不要直接更新账单状态、租户 `billing_status`、告警表或通知事件表;继续补租户基础资料编辑增强、平台审计告警升级策略、平台催缴通知配置操作台细节和平台在线收款。
- 小程序:验证 `Taro.login`、微信支付、分享 scene/referral、Supabase client 兼容性;如不稳定,保留 `apps/api/auth/*` 作为小程序登录适配层。
## AI 择校推荐接入