Files
uniprop-manual/prop-acc/scenarios/adhoc/cancel-resident-withdrawal.md
Willie 35c0147a7b P3.5: prop-acc 启用子模块嵌套(adhoc/),应对大型业务域扩展
背景:
单纯按 UDAS 严格扁平,prop-acc/scenarios/ 装齐 7 子模块后预计 100-150
篇 .md 单一文件夹,Explorer 无法浏览、Quartz folder page 无法阅读。

扩展规则(已写入 SKILL.md 多域章节 + multi-domain.md 第 10 节):
- 单类型文件夹文件数 > 30 且能按业务子模块分组时,启用嵌套
- 路径:<domain>/<type>/<sub-feature>/<file>.md
- 文件名去 <sub-feature>- 前缀(路径已表达)
- title 三段式:<domain> · <sub-feature> · <名>
- frontmatter 新增 sub_feature 字段(便于 RAG 过滤)
- 跨子模块文档落在 <domain>/<type>/(不进子文件夹),与"跨域→cross/"对称

本次迁移:
- prop-acc/concepts/adhoc-*.md (3)  → prop-acc/concepts/adhoc/*.md
- prop-acc/scenarios/adhoc-*.md (25) → prop-acc/scenarios/adhoc/*.md
- 每个文件:title 加 adhoc 段、aliases 追加旧 prop-acc · 前缀形式(兼容)、
  新增 sub_feature: adhoc 字段

WikiLink 解析未受影响:
- 既有 [[场景-A流-...]] 等 200+ 引用通过 aliases (含旧 basename) 解析
- 新引用可用 [[adhoc · 前台购买 IC 卡]] 或 [[prop-acc · adhoc · 前台购买 IC 卡]]
- 各域 knowledge-map.md 内 WikiLink 全部仍有效

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 20:55:59 +08:00

174 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: prop-acc · adhoc · 场景 - 取消 - 业户改主意主动撤单
aliases:
- prop-acc · 场景 - 取消 - 业户改主意主动撤单
- 场景 - 取消 - 业户改主意主动撤单
- 场景-取消-业户改主意主动撤单
tags:
- 场景
- prop-acc
- 一次性收费
- 业务场景
- 取消退款
audience:
- 业户
- 业务人员
status: 已发布
sub_feature: adhoc
last_review: 2026-05-25
code_version: 2026-05-22
---
# 场景:业户改主意主动撤单
**B 流场景**:业户在小程序下完单但还没付款,自己主动取消。
> [!info] 与超时作废的区别
> [[场景-超时未付自动作废|超时作废]]是系统**被动**作废(到期了机器自动废)。本场景是**业户主动**操作。两者都只针对 Pending 状态,**已支付订单走 [[场景-已收款作废]]**。
## 典型情境
> [!example] 真实情境
> 周先生在小程序下单 2 张游泳卡 ¥400,准备明天带朋友来游泳。下单后 5 分钟接到朋友电话说出差不来了,他想取消订单。
## 业户视角
### 第 1 步:打开"我的订单"
小程序底部 → 我家 → 我的订单
### 第 2 步:找到待付款订单
```
我的订单
├── 🟡 待付款
│ └── 游泳卡 × 2 ¥400
│ 订单号 CO-20260525-XXX
│ 下单于 5 分钟前
│ ⏰ 剩余 25 分钟自动取消
│ [立即支付] [取消订单]
└── ✅ 已完成
└── ...
```
### 第 3 步:点"取消订单"
弹出确认框:
```
确认取消订单?
取消后此订单不可恢复,如需购买请重新下单。
[再想想] [确认取消]
```
点"确认取消"。
### 第 4 步:订单消失
```
我的订单
├── 🟡 待付款
│ (空)
└── ✅ 已完成 / ❌ 已取消
└── 游泳卡 × 2 ¥400
状态:已取消
原因:用户主动取消
```
> [!success] 完成
> 您未付款,**不涉及任何退款**。订单从"待付款"列表移除,显示在"已取消"区。
## 业务人员视角
### 几乎不用关心
> [!tip] 全自动
> 业户撤单 → 小程序 API → 后端 `VoidAdHocEventAction` → 完成。**业务人员不参与**。
### 业务人员能看到什么
Filament 后台 → 一次性收费 → 切到"已作废" tab:
```
状态:Voided
meta.voided_at: 2026-05-25 15:42:11
meta.voided_reason: "[业户主动取消] 用户在小程序点击取消"
meta.voided_by: null (业户操作,无运营员工)
```
### 如何区分"业户主动撤单"和"系统超时作废"?
`voided_reason` 前缀:
| 前缀 | 来源 |
|---|---|
| `[业户主动取消] ...` | 业户在小程序点取消 |
| `[订单超时作废] ...` | Scheduled job 自动作废 |
| `[临时收费事件作废] ...` | 业务人员在 Filament 后台手动作废 |
详见 `VoidAdHocEventAction``$reason` 参数处理。
## 系统流程
```mermaid
sequenceDiagram
participant 业户
participant 小程序
participant 系统
业户->>小程序: 我的订单 → 点取消
小程序->>业户: 弹确认框
业户->>小程序: 确认
小程序->>系统: DELETE /api/ad-hoc-events/{id}
系统->>系统: 检查订单是否 Pending
alt 是 Pending
系统->>系统: VoidAdHocEventAction
系统->>系统: AdHocEvent → Voided
系统->>系统: CollectionOrder → Failed
系统->>系统: 写 meta.voided_reason = "[业户主动取消] ..."
系统-->>小程序: 成功
小程序-->>业户: 显示"已取消"
else 已是 Completed
系统-->>小程序: 失败,提示"订单已支付,请走退款"
小程序-->>业户: 提示
end
```
## 常见问题
> [!question] 取消后还能恢复吗?
> **不能**。取消是终态。要继续买,请重新下单。
> [!question] 我已经付款了想取消怎么办?
> 走 [[场景-已收款作废]] —— 但需要**联系物业**(小程序不直接暴露付款后的取消按钮,以防误操作)。
> [!question] 我取消的时候系统说"操作失败"?
> 可能是:
> 1. **订单已超时**:你点取消的瞬间订单刚被系统自动作废了 —— 实际效果一样,刷新页面看
> 2. **网络问题**:重试一次
> 3. **订单已被支付**:支付回调与你的取消操作同时到达,以支付为准
> [!question] 取消会影响我的信用吗?
> 不会。系统**不记录**业户取消次数。
## 与超时作废的对照
| 维度 | 业户主动撤单(本场景)| [[场景-超时未付自动作废\|系统超时作废]] |
|---|---|---|
| 触发方 | 业户 | 系统(scheduled job)|
| 时间窗 | 任何时候(只要未付)| 超过 expires_at |
| meta.voided_by | null | null |
| 业户感知 | 主动,即时反馈 | 被动,登录小程序才发现 |
| 适用场景 | 业户明确不想要 | 业户忘记付 |
两种情况**底层都走 `VoidAdHocEventAction`** —— 同一份级联废逻辑,只是触发来源不同。
## 相关概念
- [[概念-AdHocEvent状态机]] — Pending → Voided 流转
- [[概念-CollectionOrder与Receipt]] — Pending 单作废时收据未生成,无需处理
- [[场景-B流-小程序下单+微信支付]] — 上游下单流程
- [[场景-超时未付自动作废]] — 系统自动版本
- [[场景-已收款作废]] — 已支付场景