# 结果修改工作流（Step 6 详细指南）

当用户对 Step 5 展示的报关结果提出修改要求时，参考本文档执行。

---

## ⛔ 约束

- **禁止**重新上传文件或提交新的分类/报关任务
- **禁止**自行创建新的 Excel 模板或格式
- **必须**基于当前任务已有的 `structured_data` 进行修改，再用已下载的 Excel 文件直接修改对应单元格

---

## 工作流程

### 1. 判断修改类型

用户的修改意图分为两类：

#### 类型 A：用户直接给出修改值

用户明确说出了要改成什么值，直接映射到 `structured_data` 字段：

| 用户说法示例 | 对应操作 |
|---|---|
| "第3项品名改成塑料薄膜" | `items[2].品名 = "塑料薄膜"` |
| "HS编码第一个改成3920109090" | `items[0].商品编码 = "3920109090"` |
| "总金额应该是5000美元" | `summary.总金额 = "5000"` |
| "删掉最后一行" | 删除 `items` 末尾元素 |
| "加一个商品：螺丝，编码7318159001，100千克" | 在 `items` 末尾追加 |

→ 直接进入步骤 2（展示修改预览）。

#### 类型 B：用户只给方向，不给具体值

用户指向一个**原始文件**，要求从中提取某些字段来补充或修正结果。用户不会把每个值都列出来——他们用工具就是为了不手动抄写。

| 用户说法示例 | 用户真实意图 |
|---|---|
| "根据上传的报关单草单，把收货人、运输方式补充进去" | Agent 去读草单文件，找到收货人和运输方式的值 |
| "装箱单上的件数和毛重跟结果不一样，以装箱单为准" | Agent 去读装箱单，提取件数和毛重来覆盖结果 |
| "发票上的单价好像提取错了，你再看看" | Agent 去读发票，重新确认单价 |
| "把报关单里的贸易国别、成交方式这些表头信息补全" | Agent 去读报关单，提取多个表头字段 |

**处理步骤**：

1. **确定目标文件** — 根据用户提及的文件类型（报关单/装箱单/发票等），在当前任务目录的 `raw/` 子目录中找到对应的原始上传文件（如 `tasks/customs_<id>/raw/draft.xlsx`）
2. **自行阅读文件** — 使用你自身的能力（视觉理解/文本阅读）直接读取该文件内容
3. **提取用户要求的字段值** — 从文件中找到用户提及的字段（收货人、运输方式、件数等）
4. **进入步骤 2** — 将提取到的值作为修改预览展示给用户确认

> ⛔ **类型 B 仍然是修改操作，不是重新执行报关任务。** 你只是用自己的能力从原始文件中读取特定字段值，然后修改 `structured_data` 和 Excel。**禁止**重新调用 `submit_and_poll.py` 或提交新的处理任务。

---

### 2. 展示修改预览

修改前必须展示变更对比，等用户确认：

```
📝 将按您的要求修改以下内容：

| # | 字段 | 原值 | → | 新值 |
|---|------|------|---|------|
| 1 | 第3项 品名 | 塑料板 | → | 塑料薄膜 |
| 2 | 第3项 商品编码 | 3920991000 | → | 3920109090 |

确认修改吗？（确认/OK/取消）
```

### 2.5 修改时的合规建议

当用户要求修改以下字段时，Agent 应打开 [FIELD_GUIDE.md](FIELD_GUIDE.md) 查阅对应字段的规范，在修改预览表格**下方**附带合规提示：

| 用户修改的字段 | 查阅 FIELD_GUIDE 章节 | 提示内容 |
|---|---|---|
| 成交方式 | 「成交方式」表 | 对应保费规则（FOB/EXW/C&F 须填保费率 0.3‰） |
| 品牌类型 | 「品牌类型」表 | 正确的代码映射（0-4） |
| 运输方式 | 「运输方式」表 | 代码对照 |
| 包装种类 | 「包装种类」表 | 代码对照 |
| 经停港/指运港/贸易国别 | 「易混淆字段辨析」 | 三者的区别说明 |
| 征免方式 | 「征免方式」表 | 代码对照 |
| 监管方式 | 「监管方式」表 | 代码对照 |

**合规提示格式（附在修改预览表格下方）：**

```
💡 合规提示：FOB 成交方式下，即便未实际支付保费，也须填写保费率（通常为 0.3‰）。
当前保费字段为空，是否需要一并补充？
```

⛔ 约束：
- 合规提示仅在修改上述字段时出现，修改品名、数量等常规字段时**不附加提示**
- 提示不超过 2 行，简洁明了
- 用户可忽略提示直接确认修改

---

### 3. 用户确认后，直接修改 Excel 文件

使用 Python + openpyxl 打开任务目录下已下载的 Excel 文件，定位到对应单元格修改值并保存：

> ⚠️ **此步骤需要 `openpyxl` 库（非标准库）。** 如果用户环境未安装，先执行 `pip install openpyxl`。执行修改前请先确认该依赖可用。

```python
from openpyxl import load_workbook

# Excel 文件位于任务目录下
wb = load_workbook("tasks/customs_<id>/customs_result.xlsx")
ws = wb.active

# 根据实际行列位置修改对应单元格
# 例如: 第3项品名在第 N 行第 M 列
ws.cell(row=<行号>, column=<列号>).value = "塑料薄膜"

wb.save("tasks/customs_<id>/customs_result_v2.xlsx")
wb.close()
```

> ⚠️ 修改时保留原文件样式和格式，只改值，不改结构。
> 保存为新文件名（如 `_v2`、`_v3`），避免覆盖原始结果。

---

### 4. 告知用户修改完成

展示修改后的数据摘要，并告知新文件位置。

---

## 多轮修改

用户可以反复修改。每次修改都基于**最新版本**的数据和文件继续调整，不回退到原始版本。
