# 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 对齐)。