# 合作订单模块

## 职责

合作订单模块面向摄影师/门店角色，管理合作获客业务：

- **获客员线索**：查看合作获客员上报的潜在客户线索（手机号、备注、图片）
- **获客订单**：查看通过合作渠道产生的订单，支持关键词搜索
- **合作获客员**：查看已绑定获客员列表，扫码绑定新获客员

权限 URI：`cooperation_order`（与 Android `CooperationOrderFeature.URI` 一致）。

## 核心流程

### 首页入口

1. 用户点击首页「合作订单」菜单（`cooperation_order`）
2. `CooperationOrderAccessView` 校验 `PermissionContext.canAccess("cooperation_order")`
3. 无权限时 Toast 提示并返回；有权限进入 `CooperationOrderListView`

### 双 Tab 列表

| Tab | API | 说明 |
| --- | --- | --- |
| 获客员线索 | `GET .../sale-user/referral-leads` | 分页 10 条，下拉刷新/加载更多 |
| 获客订单 | `GET .../sale-user/acquisition-orders` | 支持 `keyword` 搜索 |

### 获客员绑定

1. 列表页右上角「合作获客员」→ `CooperationAcquirerView`
2. 扫码页由 `CooperationOrderListView` 统一弹出（避免在 `navigationDestination` 子页内嵌 `fullScreenCover` 导致 SwiftUI 栈溢出崩溃）
3. 扫码或主 Tab 扫码识别 `{"method":"sale_user_bind","sale_user_id":N}`
4. `BindAcquirerView` 加载邀请信息 → 填写分账比例（0–100）→ `POST .../sale-user/accept-bind?sale_user_id=&commission_rate=`

### 获客员备注名

1. 合作获客员列表每行右上角「修改备注」→ 弹窗编辑备注名
2. 备注名最多 20 个字符；点击保存时校验，超出则提示且不提交
3. 修改备注弹窗展示 `saler_real_name`：「为 {获客员真实姓名} 设置备注名」
4. 保存 → `POST .../sale-user/update-remark`，Body：`{ "sale_user_id": Int, "photog_remark_name": String }`
5. 展示规则：优先 `photog_remark_name`，为空时回退获客员原名（`name` / `saler_name` / `sale_user_name`）
6. 绑定确认页（`BindAcquirerView`）仍展示真实获客员名，不使用备注名

## 与订单模块关系

订单管理（`orderType` 11 摄影师跟拍 / 14 线下扫码）在订单卡片展示「订单来源」：

- Sheet 内选择获客员 → 带客单 → `POST .../bind-referral-order`
- 全页流程见 `ReferralOrderSelectView`
- 订单退款成功后，若已绑定带客单，调用 `POST .../referral-orders/{id}/status`（status=3）

## 主要文件

| 文件 | 说明 |
| --- | --- |
| `API/CooperationOrderAPI.swift` | 9 个 sale-user / cooperative 接口 |
| `Models/CooperationOrderModels.swift` | 实体与解码 |
| `Services/CooperationOrderFeature.swift` | 权限 URI 常量 |
| `ViewModels/*` | 列表、获客员、绑定 ViewModel |
| `Views/*` | SwiftUI 页面与卡片组件 |

## 依赖

- `@Environment(\.cooperationOrderAPI)` 注入网络层
- `@EnvironmentObject PermissionContext` 权限校验
- `@EnvironmentObject ToastCenter` 用户提示
- Kingfisher 加载线索图片
