# Orders 模块业务逻辑

## 模块职责

Orders 模块负责登录后的订单 Tab 与订单相关二级页面。当前已对齐 Android `zhiflyfollow` 订单列表能力：主订单列表（摄影师/非店长）、店长押金式订单 Tab、独立核销管理页，以及押金订单独立入口、历史拍摄、任务上传、尾片入口和 orderType 11/14 订单来源（带客单绑定）闭环。

订单 Tab 内不再展示「订单管理 / 核销订单」分段；核销管理通过首页菜单、TabBar 扫码或路由 push 进入独立页面。

门店订单详情页与核销订单详情页暂未接入，列表卡片仅展示摘要信息与卡片内操作。

当前仍不迁移独立视频播放器增强、尾片审核进度、上传后自动关联订单尾片等后端未体现的能力；多点位核销的定位 + 打卡点 Sheet 若 iOS 尚无完整能力，列表内仅预留扫码入口。

## 页面结构

| 场景 | 视图 | 说明 |
|------|------|------|
| 订单 Tab · 非店长 | `StoreOrderListView` | 对齐 Android `OrderListScreen` |
| 订单 Tab · 店长 | `StoreAdminOrderListView` | 对齐 Android `DepositOrderListScreen` |
| 核销管理 | `WriteOffListView` | 对齐 Android `WriteOffListScreen`，独立 push 页 |
| 押金订单入口 | `DepositOrderEntryView` | 首页 `deposit_order*` 仍保留独立入口 |

`OrdersRootView` 按 `AppRoleCode.storeAdmin` 分流店长 Tab 与主订单 Tab。

## 核心对象

- `StoreOrderListView`：主订单 Tab 根视图，组合 `OrderListHeaderView`、`OrderListCardView` 与 `OrdersViewModel`。
- `StoreAdminOrderListView`：店长订单 Tab，组合共享头部与店长卡片，使用 `StoreAdminOrderListViewModel`。
- `WriteOffListView`：核销管理页，使用 `WriteOffListViewModel`，含横向状态 pill、日期筛选与扫码/手动核销。
- `OrderListHeaderView`：白底状态/日期筛选头部；手机号搜索使用系统 `.searchable`。
- `OrderListCardView`：主订单卡片，对齐 Android `OrderView` 展示顺序与操作区。
- `OrderListComponents`：状态 Chip、信息行、操作按钮、精修单选等共享组件。
- `OrderDialogViews`：退款、赠送修图/视频、店长退款、核销确认弹窗。
- `OrdersViewModel`：主订单列表分页、筛选、卡片操作（退款/核销/精修/取消/赠送）与订单来源。
- `StoreAdminOrderListViewModel`：店长订单列表与 `storeOrderList` / `storeOrderRefund`。
- `WriteOffListViewModel`：核销列表筛选、分页与核销提交。
- `DepositOrderListViewModel`：押金订单分页、核销、退款（独立押金入口）。
- `OrderRefundViewModel`：普通订单退款金额校验与提交。
- `OrdersAPI`：订单列表、核销列表、精修更新、取消、赠送、店长列表/退款等接口。
- `OrdersEntry`：订单 Tab 内部入口枚举，保留 `verificationOrders` 供测试/推送兼容。
- `OrdersRoute`：二级路由，含 `writeOffList`、押金详情、历史拍摄、任务上传、尾片入口。
- `OrderNumberParser`：从扫码内容解析订单号。

## 数据流程

### 主订单列表

从 `AccountContext.currentScenic` 读取景区 ID，从 `PermissionContext.currentAppRole` 读取角色。景区管理员（`scenicAdmin`）使用景区管理员订单接口且卡片只读（隐藏退款/核销/拨号/精修/赠送/取消）。

支持状态筛选（含精修筛选项）、手机号搜索、日期范围 Sheet 筛选。筛选变更后从第一页重新加载，滚动到底加载下一页。

卡片展示订单号、状态、创建时间、类型、订单来源、操作行、上传任务条（orderType 19）、精修单选、信息行、条件行、退款信息、备注、历史拍摄缩略图与取消订单按钮。操作受 `hideOrderWriteActions` 控制。

### 店长订单 Tab

从 `AccountContext.currentStore` 读取门店 ID，调用 `GET /api/app/store/order/list`。筛选为全部/已支付/已完成/已退款。卡片展示项目、金额、时间、UID、手机号与退款/部分退款；线下产品订单额外展示核销按钮。仅 `orderType == 19` 可进详情。

### 核销管理

独立页面，调用 `writeOffList` 并支持 `order_status`、`order_verify_status`、`start_time`、`end_time`、`user_phone` 查询参数。横向 pill：全部/已支付/已完成/已核销/未核销。

扫码使用 `OrderCodeScannerView`，命中列表时滚动高亮；核销前弹确认框，成功后刷新第一页。TabBar 全局扫码通过 `pendingOrderScanCode` 交给核销页消费。

### 押金订单（独立入口）

首页 `deposit_order_detail`、`deposit_order`、`deposit_order_shooting_info` 进入 `DepositOrderEntryView`，与 Tab 内店长列表 UI 分离但共用部分 API。

### 订单来源（带客单绑定）

仅对 `orderType == 11` 或 `14` 展示，景区管理员只读。绑定接口 `POST .../sale-user/bind-referral-order`；退款成功后若存在带客单则异步更新状态。

### 历史拍摄与任务上传

历史拍摄：`GET .../photog/order/multi-travel/shoot-history`。任务上传：仅 orderType 19，先拉已核销打卡点再上传素材。

## 路由边界

| 入口 | 目标 |
|------|------|
| `photographer_orders`、`/scenic-order-manage` | 订单 Tab · 主列表或店长列表 |
| `verification_order` | push `OrdersRoute.writeOffList`（核销管理） |
| `deposit_order*` | push 押金订单页 |
| TabBar 扫码 | 核销管理页消费扫码结果 |

`AppRouter.routeToOrderVerification` 切换订单 Tab 并 push 核销页，不再设置 `selectedOrdersEntry`。

未明确接口的订单能力继续占位，避免入口崩溃。

## 设计常量

订单列表专用色值与间距定义在 `AppDesign`（页面背景 `#F5F5F5`、输入背景 `#F4F4F4`、状态 Chip 色等与 Android 对齐）。
