# SHOPEE_011 AGV出库分拣开发计划

> 依据 `C:/Users/zoe/Downloads/SHOPEE_011_AGV出库分拣(2).docx` 整理。本文档用于维护开发计划和当前完成状态。

## 1. 目标

实现 Shopee AGV 出库分拣：工作站登录 AGV 分拣模式后，系统把已释放的 AGV 区域拣货任务分配到分拣墙，按工作站 AGV 并发量下发周转箱搬运任务；周转箱到站后，操作员按批量或按单首选项扫描分拣，通过电子标签或手工确认完成格口任务，支持绑箱、满箱、封箱、缺料重分配和回库调度。

## 2. 总体模块拆分

| 阶段 | 模块 | 主要内容 | 状态 |
| --- | --- | --- | --- |
| P0 | 数据模型与配置 | `agv_preference`、`wcs_sorting_wall` AGV 分拣字段、工作站 AGV 并发量、菜单/字典配置 | 部分完成：`agv_preference` 建表/domain/table JSON/bill JSON 已落地 |
| P1 | 工作站 AGV 分拣入口 | 登录工作站、开始/退出/暂停/继续、出库单类型选择 | 部分完成：已存在 `AgvSortingService` 统一服务骨架 |
| P1 | 分拣墙箱绑定 | 绑箱、满箱、封箱、缺料按钮 | 待实现 |
| P1 | 任务分配计划任务 | 拣货任务分配到分拣墙，绑定上游波次号和分拣墙 | 待实现 |
| P1 | AGV 下发计划任务 | 控制工作站未完成 AGV 数量，生成/下发 `wcs_dispatch_task` | 待实现 |
| P1 | 扫箱分拣服务 | 扫周转箱、按首选项展示批量/按单分拣信息 | 待实现 |
| P1 | 电子标签与确认 | 亮红灯、拍灯确认、手工确认、完成后亮绿灯 | 待实现 |
| P2 | 异常闭环 | SKU 批次冻结、缺料重分配、缺料盘点单、周转箱回库 | 待实现 |
| P2 | UI | AGV 分拣首选项维护、AGV 分拣工作台页面 | 部分完成：工作站出库菜单已增加 `AGV拣货`，`AGV_PICK.vue` 页面已按参考图绘制 |

## 2.1 流程图补充口径

用户补充的两张流程图将 AGV 出库分拣拆成两条入口：

| 流程 | UI 入口 | 核心差异 | 交付差异 |
| --- | --- | --- | --- |
| 按单拣货 | 选择“按单拣货” | 订单准备后选择订单类型并点确认，分配任务到工作站；扫 SKU 后按分配货位逐个指引拣货 | 增加“交付”阶段：停止拣货订单、机器人搬运待交付料箱至分播位、人员离开、PTL 绿灯闪烁、PTL 关闭分播口 |
| 批量拣货 | 选择“批量拣货” | 订单准备后选择订单类型并点确认，按 SKU/UID 统计数量，PTL 开始拣货对应分配货位 | 无独立交付泳道，完成分配订单后可继续找新的潜在货位或停止分配返回工作站 |

共同主流程：
- Shopee-WMS 向 HAIQ 下发拣货任务，HAIQ 接收任务并创建订单。
- HAIQ 预分配库存。
- HAIQ UI 登录工作站并选择拣货模式。
- 若存在进行中任务，需先换人/结束并清除当前任务，或继续执行可操作员执行的其它任务。
- HAIQ 基于订单波次、优先级、释放规则动态生成波次，并将任务分配到工作站。
- 生成料箱取用任务并分配给机器人，机器人接收任务。
- 拣货任务收集后同步到 WMS 仓储系统。
- 操作员绑定订单箱或料箱，系统确认绑定成功后进入扫码拣货。
- SKU 扫描后判断 UID 是否受库存管理：受管理则逐件扫描 UID 后计数，不受管理则直接统计 SKU 数量。
- HAIQ 根据分配货位指引拣货，PTL 按货位亮灯/分播。
- 若需要更换料箱或继续拣货，系统查找新的潜在货位；否则标记本批次/本订单完成。

计划影响：
- `agv_preference.initDocType` 需要明确支持 `SINGLE_ORDER`（按单）和 `BATCH`（批量）两种值。
- UI 工作台入口需按模式切换文案、后续按钮和完成逻辑。
- 后端查询/确认接口需要带 `pickMode`，不能只依赖默认首选项。
- 按单模式需要新增“交付”服务或状态流，批量模式可以先不实现交付泳道。

## 3. 数据库与领域对象

### 3.1 新增表 `agv_preference`（部分完成）

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | bigint | 主键 |
| `code` | varchar(50) | 编码，必填 |
| `name` | varchar(50) | 名称 |
| `warehouseCode` | varchar(50) | 仓库，必填 |
| `initDocType` | varchar(500) | 分拣方式：`BATCH` 批量、`SINGLE_ORDER` 按单 |
| `allUsers` | int | 所有用户可用，默认 0 |
| `useAsDefault` | int | 是否默认，默认 0 |

落地状态：
- 已完成：建表 SQL 已合并到 `wes-loghub/src/main/resources/db/migration/mysql/V3_1_2_3__shopee_outbound_wave_create.sql`。
- 已完成：领域对象 `wes-loghub/wms-automation/src/main/groovy/com/ittx/wms/automation/domain/hairo/AgvPreference.groovy`。
- 已完成：表配置 `wes-loghub/src/main/resources/config/wes/table/agv_preference.json`。
- 已完成：单据配置 `wes-loghub/src/main/resources/config/wes/bill/agv_preference.json`。
- 已完成：维护页面配置 `wes-loghub/src/main/resources/config/wes/view/ttx.wso.TabbedBill/agv_preference.json`。
- 已完成：出库配置菜单 `agv_preference_config` 已挂载到 `wes-loghub/src/main/resources/config/wes/navigator/admin.json`。
- 已完成：服务 `wes-loghub/wms-automation/src/main/groovy/com/ittx/wms/automation/service/hairo/AgvPreferenceService.groovy`，承接平台通用 CRUD。

### 3.2 扩展 `wcs_sorting_wall`

docx 将分拣墙货架作为 AGV 分拣任务载体，现有 `WcsSortingWall.groovy` 仅有基础字段，需要补齐以下字段：

| 字段 | 建议字段名 | 说明 |
| --- | --- | --- |
| 周转箱 | `lpn` | 订单箱/周转箱号 |
| 当前任务 | `taskId` 或 `agvTaskId` | docx 的 `Task_ID`，绑定上游波次号或任务标识需最终确认 |
| 分拣状态 | `syStatus` | 0 空闲、2 已分配、4 分拣中、6 任务完成 |
| 电子标签 | `lamp` | 电子标签 ID |
| 分拣周转箱 | `fjLpn` | 当前正在分拣的周转箱 |
| 分拣 SKU | `fjSku` | 当前正在分拣的 SKU |
| 分拣批次 | `fjBatch` | 当前正在分拣批次 |
| 出库类型范围 | `ckType` | 可绑定的出库任务类型，多值 |
| 组号 | `groupIndex` | UI 显示分拣墙组 |
| AGV 并发量 | `zdAgv` | 当前工作站最多未完成周转箱数，docx 写在 workStationCode 表，需确认是放工作站还是分拣墙 |

计划文件：
- 修改迁移：`wes-loghub/src/main/resources/db/migration/mysql/V3_1_2_x__agv_sorting_wall_fields.sql`
- 修改领域对象：`wes-loghub/wms-automation/src/main/groovy/com/ittx/wms/automation/domain/WcsSortingWall.groovy`
- 如 `zdAgv` 放工作站，修改：`wes-loghub/wms-automation/src/main/groovy/com/ittx/wms/automation/domain/WcsWorkStation.groovy`

### 3.3 任务头/明细字段映射

docx 多次提到任务头自定义字段：
- 自定义1：出库任务类型
- 自定义2：任务分配到分拣墙时间
- 自定义3：电子标签货架货位号
- 自定义4：上游波次号

当前 `TaskHeader.groovy` 没有这些显式字段，计划采用两种方案之一：

| 方案 | 做法 | 优点 | 风险 |
| --- | --- | --- | --- |
| 推荐 A | 新增明确字段：`shipmentType/agvAssignedAt/agvSortingWallCode/upstreamWaveCode` | 语义清楚，后续维护稳定 | 需要迁移和上游字段映射 |
| 备选 B | 使用现有 `EntityUserDef` 自定义字段 | 改动小 | 字段语义隐性，后续易混淆 |

建议先确认任务头“自定义1-4”在当前数据库实际列名，再决定字段落点。

## 4. 后端服务计划

### 4.1 AGV 分拣工作站服务（部分完成）

当前落点：`com.ittx.wms.wave.service.hairo.AgvSortingService`

状态：已创建 AGV 出库分拣统一服务骨架，具体登录、开始、退出、暂停、继续逻辑仍待补齐。

原计划服务：`com.ittx.wms.automation.service.hairo.AgvSortingStationService`

职责：
- `loginStation(session, warehouseCode, workStationCode)`：校验 `wcs_work_station` 存在且启用。
- `startSorting(session, workStationId, shipmentType)`：校验 `currentJobMode` 为 0 或 2，更新为 2，写入当前出库单类型。
- `exitSorting(session, workStationId)`：`currentJobMode=2` 时更新为 0。
- `pauseAccept(session, workStationId)`：`acceptStatus=0`。
- `resumeAccept(session, workStationId)`：`acceptStatus=1`。

注意：
- 现有 `WcsWorkStation.acceptStatus` 是 String，docx 写 0/1，需要确认字典值。计划中先按现有常量或字典，不硬编码数字。
- `currentJobMode=2` 表示 AGV 出库分拣模式，需要补常量注释。

### 4.2 分拣墙箱绑定服务

新增服务：`com.ittx.wms.automation.service.hairo.AgvSortingWallBoxService`

接口：
- `bindBox(session, warehouseCode, sortingWallCode, lpn)`：校验分拣墙存在、`lpn` 为空、调用 WMS 周转箱检查接口、回写 `wcs_sorting_wall.lpn`。
- `replaceFullBox(session, warehouseCode, sortingWallCode, oldLpn, newLpn)`：满箱换箱；docx 此处描述仍写“检查可用并更新 LPN”，需确认是否要先封箱旧箱。
- `sealBox(session, warehouseCode, sortingWallCode)`：要求 `syStatus=6`，清空 `taskId/lpn`，`syStatus=0`，下发灭灯。
- `shortage(session, warehouseCode, sortingWallCode)`：二次确认后触发缺料重分配、缺料盘点单、继续显示下一货品或回库。

依赖待确认：
- 上游 WMS 周转箱检查接口。
- 电子标签灭灯接口。
- 缺料盘点单创建接口/字段。

### 4.3 波次任务分配计划任务

新增服务：`com.ittx.wms.automation.service.hairo.AgvWaveTaskAssignService`

入口：
- 建议先不加 `@Scheduled`，提供 `assignOnce()`；计划任务开关确认后再接调度入口。

筛选工作站：
- `wcs_work_station.currentJobMode=2`
- `acceptStatus=1`
- `status=1`

筛选分拣墙：
- `wcs_sorting_wall.workStationCode = 当前工作站`
- 存在 `taskId is null`
- 若分拣墙已有 `taskId`，该货架不再下发任务。

筛选任务头：
- 仓库 = 当前仓库
- 拣货任务头已释放
- 任务从货位区域 = AGV 区域
- 任务头状态 = 100
- AGV 分拣分配时间为空
- 任务头出库任务类型包含在分拣墙 `ckType`
- 任务头上游波次号关联上游波次号段表，且号段未分配

分配动作：
- `wcs_sorting_wall.taskId = task_header.上游波次号`
- `wcs_sorting_wall.syStatus = 2`
- `task_header.agvAssignedAt = now`
- `task_header.agvSortingWallCode = wcs_sorting_wall.code`
- 上游波次号段表标记已分配

需要复用/衔接：
- Shopee 集波里已有 `shopee_wave` 号段逻辑，需确认 “上游波次号段表” 是否就是 `shopee_wave`。

### 4.4 AGV 下发计划任务

新增服务：`com.ittx.wms.automation.service.hairo.AgvDispatchService`

可复用现有：
- `wes-loghub/wms-automation/src/main/groovy/com/ittx/wms/automation/service/WcsDispatchTaskService.groovy`
- `AgvTaskCreateWcsCmd.groovy`
- `AgvTaskCancelWcsCmd.groovy`

流程：
- 轮询 AGV 分拣工作站。
- 查询当前工作站 `wcs_dispatch_task.processStatus` 未完成数量 Y。
- 比较工作站 AGV 并发量 Z，`Y < Z` 才继续。
- 查询当前分拣墙 `taskId` 下的拣货明细：
  - 从区域 = AGV 库区
  - 任务头已释放
  - 明细状态 = 100
  - 明细 `fromLPN` 关联 `wcs_container`
  - `wcs_container.onHandStatus = 10`
- 按货品排序，最多取 `Z - Y` 个周转箱。
- 每个周转箱创建一条 `wcs_dispatch_task`，并下发 AGV 搬运任务。

待确认：
- AGV 库区标识来自系统参数、库区配置还是任务明细字段。
- `wcs_container.onHandStatus=10` 是否已有常量。
- `processStatus` 未完成状态集合是否复用现有 `WcsDispatchTaskService` 常量。

### 4.5 AGV 到站与扫箱分拣服务

新增服务：`com.ittx.wms.automation.service.hairo.AgvOutboundSortingService`

接口：
- `scanContainer(session, workStationCode, containerCode, preferenceCode, pickMode)`：扫周转箱，读取首个待分拣货品。
- `scanSku(session, containerCode, skuCode, pickMode)`：校验 SKU、冻结状态、订单箱是否绑定齐全，返回分拣指引。
- `scanUid(session, containerCode, skuCode, uid)`：UID 受库存管理时逐件扫描并累计 SKU 数量。
- `confirmByLamp(session, lampCallback)`：电子标签拍灯确认。
- `manualConfirm(session, currentSortingContext)`：手工确认。
- `nextSortingItem(session, containerCode, mode)`：批量/按单切换下一任务。

批量模式：
- 同一周转箱第一个 `SKU + 批次 + 库存状态` 下，展示所有分拣墙格口任务。

按单模式：
- 同一周转箱第一个 `SKU + 批次 + 库存状态` 下，只展示第一个格口任务；完成后切下一个格口。

确认动作：
- 任务明细确认。
- 将 `wcs_sorting_wall.lpn` 回写到任务明细自定义1字段。
- 清空 `wcs_sorting_wall.fjLpn/fjSku/fjBatch`。
- `syStatus` 回到 2。
- 若整个格口任务完成，亮绿灯并 `syStatus=6`。
- 若当前周转箱全部完成，下发周转箱回库。

### 4.7 按单拣货交付服务

流程图中“按单拣货”比批量拣货多一个交付阶段，建议新增服务：`com.ittx.wms.automation.service.hairo.AgvSingleOrderDeliveryService`

接口：
- `stopPickingOrder(session, workStationCode, taskCode)`：点击“停止拣货订单”。
- `bindNewBoxToSortPosition(session, workStationCode, sortingLocationCode, lpn)`：继续拣货时绑定新料箱至分播位。
- `finishAssignedTaskToStation(session, workStationCode)`：没有继续拣货时，将未分配完的拣货任务返回本工作站。
- `handoverToPtl(session, workStationCode, sortingLocationCode)`：机器人搬运待交付料箱至分播位，人员离开后触发 PTL 进行确认。
- `ptlConfirmDelivery(session, ptlCallback)`：PTL 绿灯闪烁、完成分播、关闭分播口后同步状态。

状态同步：
- HAIQ 接收拣货任务状态。
- 同步拣货任务状态至 Shopee WMS。
- 更新拣货任务/订单状态。

待确认：
- PTL 分播口编码与 `wcs_sorting_wall`、`wcs_sorting_wall_cell` 还是其它表关联。
- “机器人搬运待交付料箱至分播位”是否复用 `wcs_dispatch_task`，还是需要新任务类型。
- “人员离开，无待搬运料箱”由 UI 点击确认、机器人回调还是 PTL 回调触发。

可参考：
- `wms-shipping/src/main/groovy/com/ittx/wms/shipping/service/RebinService.groovy`
- `wms-task/src/main/groovy/com/ittx/wms/task/service/TaskHeaderService.groovy`
- `wms-task/src/main/groovy/com/ittx/wms/task/service/TaskDetailService.groovy`

### 4.6 电子标签接口

新增/复用 WCS 接口命令：
- 亮红灯：按 `wcs_sorting_wall.lamp` 下发当前 SKU 对应格口分拣数量。
- 灭灯：封箱时下发。
- 亮绿灯：格口整个任务完成。
- 拍灯回调：根据 `lamp` 找 `wcs_sorting_wall`，按 `syStatus` 判断是任务确认还是封箱确认。

待确认：
- 电子标签接口路径、报文结构、回调结构。
- `lamp` 是否唯一绑定到 `wcs_sorting_wall`。

## 5. UI 计划

### 5.1 AGV 分拣首选项维护（部分完成）

新增菜单：AGV 分拣首选项。

功能：
- 编码、名称、仓库。
- 分拣方式：批量/按单。
- 所有用户。
- 是否默认。
- 用户权限配置，参考“包装复合首选项”。

已完成：
- `agv_preference` table/bill/TabbedBill JSON 已新增。
- 出库配置菜单已增加 `AGV分拣首选项`。

待实现/待确认：
- 用户权限配置。

### 5.2 AGV 分拣工作台（部分完成）

入口：
- 打开页面后扫描/选择工作站。
- 校验工作站存在。
- 进入管理界面。

操作区：
- 开始：弹框选择出库单类型。
- 退出：退出 AGV 分拣模式。
- 暂停/继续：切换 `acceptStatus`。
- 绑箱：扫货架号 + 周转箱号。
- 满箱：扫货架号 + 周转箱号。
- 封箱：扫货架号。
- 缺料：二次确认后触发缺料流程。

分拣区：
- 左侧：当前周转箱格口示意，支持 1/2/4/6/8 格，当前格口放大蓝色显示。
- 中间：分拣数量、商品图片、商品名称、SKU/UPC。
- 右侧：当前工作站两组分拣墙，共 35 个货架：
  - 第 1 组：4 层 * 5 = 20
  - 第 2 组：3 层 * 5 = 15
- 分拣墙当前货位放大蓝色显示，并显示对应格口分拣数量。

已完成：
- `cbt-ui/src/views/wes/workStation/utils.ts` 出库菜单已增加 `AGV拣货`。
- `cbt-ui/src/views/wes/workStation/home.vue` 已接入 `AGV_PICK` 同级页面，后端作业模式映射为 `PICK`。
- `cbt-ui/src/views/wes/workStation/mode/AGV_PICK.vue` 已按参考图绘制页面，并增加自适应防覆盖样式。

待实现：
- 页面真实数据绑定。
- AGV 首选项弹窗/选择逻辑。
- 开始/退出/暂停/绑箱/满箱/封箱/任务确认按钮接口联动。

## 6. 接口清单

| 接口 | 方向 | 状态 |
| --- | --- | --- |
| 周转箱检查 | WES -> 上游 WMS | 待接口 |
| AGV 任务创建 | WES -> WCS/AGV | 可复用现有 `AgvTaskCreateWcsCmd`，需补出库分拣参数 |
| AGV 任务完成回调 | WCS/AGV -> WES | 现有回调需确认是否覆盖 |
| AGV 任务取消/回库 | WES -> WCS/AGV | 可复用 `AgvTaskCancelWcsCmd`，回库任务需确认 |
| 电子标签亮红灯 | WES -> WCS | 待接口 |
| 电子标签灭灯 | WES -> WCS | 待接口 |
| 电子标签亮绿灯 | WES -> WCS | 待接口 |
| 电子标签拍灯回调 | WCS -> WES | 待接口 |
| PTL 分播口开始分播 | WES/HAIQ -> PTL | 按单交付阶段待接口 |
| PTL 完成分播 | PTL -> WES/HAIQ | 按单交付阶段待接口 |
| PTL 关闭分播口 | PTL -> WES/HAIQ | 按单交付阶段待接口 |
| PTL 绿灯闪烁/确认 | PTL -> WES/HAIQ | 按单交付阶段待接口 |
| 缺料盘点单创建 | WES -> 盘点模块/上游 | 待字段与接口 |

## 7. 实施任务拆分

### Task 1：数据模型与配置落地（部分完成）

- 已完成：新增 `agv_preference` 建表 SQL。
- 已完成：新增 `AgvPreference` domain 和 `AgvPreferenceService` 通用 CRUD 服务。
- 扩展 `wcs_sorting_wall` AGV 分拣字段。
- 视确认结果扩展 `wcs_work_station` 或系统参数保存 AGV 并发量。
- 增加常量：AGV 分拣模式、分拣墙状态、首选项模式。
- 已完成：增加 `agv_preference` UI 表/单配置。

### Task 2：工作站 AGV 分拣入口（部分完成）

- 部分完成：已新增 `AgvSortingService` 统一服务骨架。
- 新增 controller endpoint。
- 实现登录、开始、退出、暂停、继续。
- 记录系统处理日志。
- 验证 currentJobMode/acceptStatus 状态切换。

### Task 3：AGV 分拣首选项（部分完成）

- 实现首选项 CRUD。
- 实现用户权限过滤和默认首选项选择。
- 已完成：`agv_preference` table/bill/TabbedBill JSON 和出库配置菜单入口。
- 已完成：`AgvPreferenceService` 通用 CRUD 服务。
- 待实现：用户权限过滤和默认首选项选择业务逻辑。

### Task 4：分拣墙绑箱/满箱/封箱/缺料

- 新增 `AgvSortingWallBoxService`。
- 实现货架校验、LPN 校验、周转箱检查接口占位。
- 实现封箱清空和灭灯接口占位。
- 实现缺料入口：先记录待重分配和待盘点，等接口确认后补全。

### Task 5：波次任务分配到分拣墙

- 新增 `AgvWaveTaskAssignService.assignOnce()`。
- 查询 AGV 分拣工作站。
- 查询空闲分拣墙。
- 查询符合条件任务头。
- 绑定任务头、分拣墙、上游波次号段。
- 增加 Redis 锁，避免多工作站/多计划任务重复分配。

### Task 6：AGV 任务下发

- 新增 `AgvDispatchService.dispatchOnce()`。
- 控制未完成 AGV 任务数量。
- 查询待搬运周转箱。
- 创建 `wcs_dispatch_task`。
- 调用现有 WCS API 下发 AGV 搬运。
- 失败记录系统处理日志。

### Task 7：扫箱与分拣展示

- 新增 `AgvOutboundSortingService.scanContainer()`。
- 实现批量/按单两种模式的数据查询，接口显式传 `pickMode`。
- 返回周转箱格口示意、商品信息、分拣墙示意和分拣数量。
- SKU 扫描时校验冻结状态和订单箱绑定状态。
- UID 受库存管理时，支持逐件扫描 UID 并累计 SKU 数量。

### Task 8：电子标签与任务确认

- 实现亮红灯、亮绿灯、灭灯命令。
- 实现拍灯回调确认。
- 实现手工确认。
- 确认后更新任务明细、分拣墙状态、当前分拣字段。
- 当前周转箱完成后触发回库调度。

### Task 9：按单交付阶段

- 新增 `AgvSingleOrderDeliveryService`。
- 实现“停止拣货订单”。
- 实现“继续拣货？”判断。
- 继续拣货时查找并绑定新的潜在货位。
- 不继续拣货时将未分配完任务返回本工作站。
- 触发机器人搬运待交付料箱至分播位。
- 对接 PTL 分播口开始分播、完成分播、关闭分播口、绿灯闪烁。
- 同步拣货任务状态至 Shopee WMS，并更新本地任务/订单状态。

### Task 10：异常与缺料闭环

- SKU 批次冻结时触发重分配。
- 缺料按钮触发重分配。
- 生成缺料盘点单。
- 判断当前周转箱是否还有其它货品，若无则回库。

### Task 11：UI 页面（部分完成）

- AGV 分拣首选项页面。
- 已完成：AGV 分拣工作台静态页面和自适应样式。
- 工作站登录/开始/暂停/退出操作。
- 绑箱/满箱/封箱/缺料弹框。
- 分拣动态图和电子标签/手工确认交互。
- 按单模式增加交付阶段按钮和 PTL 分播口状态展示。

## 8. 工时预估拆分

> 预估单位为人日，按 1 名熟悉当前 WES/WMS 代码的开发人员口径估算。外部接口报文未确认、现场 AGV/PTL 联调等待、真实设备排期不计入纯开发人日；若接口或设备行为与计划差异较大，需要另行追加。

### 8.1 总体预估

| 范围 | 后端 | 前端 | 联调/验证 | 合计 |
| --- | ---: | ---: | ---: | ---: |
| P0 数据模型与配置 | 2 - 3 | 1 - 2 | 1 | 4 - 6 |
| P1 核心出库分拣闭环 | 13 - 19 | 6 - 10 | 3 - 5 | 22 - 34 |
| P2 异常、交付与设备闭环 | 8 - 13 | 3 - 5 | 6 - 8 | 17 - 24 |
| 合计 | 23 - 35 | 10 - 17 | 10 - 14 | 43 - 64 |

建议排期：
- 最小可用版本：先完成 P0 + P1，约 `26 - 40` 人日，可覆盖工作站入口、任务分配、AGV 下发、扫箱分拣、确认闭环。
- 完整版本：完成 P0 + P1 + P2，约 `43 - 64` 人日，覆盖按单交付、缺料、冻结、PTL 和现场设备闭环。
- 若上游 WMS、WCS/AGV、PTL 接口可提前提供稳定 mock，联调人日可压缩约 `20% - 30%`。

### 8.2 按任务拆分

| Task | 内容 | 后端 | 前端 | 联调/验证 | 合计 | 备注 |
| --- | --- | ---: | ---: | ---: | ---: | --- |
| Task 1 | 数据模型与配置落地 | 2 - 3 | 1 | 0 - 1 | 3 - 5 | 包含迁移、domain/service、表单配置和常量 |
| Task 2 | 工作站 AGV 分拣入口 | 1 - 2 | 1 | 0 - 1 | 2 - 4 | currentJobMode、acceptStatus、系统日志 |
| Task 3 | AGV 分拣首选项 | 1 - 2 | 1 - 2 | 0 - 1 | 2 - 5 | CRUD、默认首选项、权限过滤 |
| Task 4 | 分拣墙绑箱/满箱/封箱/缺料入口 | 2 - 3 | 1 - 2 | 1 | 4 - 6 | 周转箱检查、灭灯接口先可占位 |
| Task 5 | 波次任务分配到分拣墙 | 3 - 4 | 0 | 1 | 4 - 5 | 包含 Redis 锁、任务头/分拣墙回写 |
| Task 6 | AGV 任务下发 | 2 - 3 | 0 | 1 - 2 | 3 - 5 | 复用现有 dispatch task，需确认 AGV 参数 |
| Task 7 | 扫箱与分拣展示 | 3 - 5 | 2 - 3 | 1 - 2 | 6 - 10 | 批量/按单查询差异、SKU/UID 扫描 |
| Task 8 | 电子标签与任务确认 | 3 - 4 | 1 - 2 | 2 - 3 | 6 - 9 | 红灯/绿灯/灭灯、拍灯回调、手工确认 |
| Task 9 | 按单交付阶段 | 3 - 5 | 1 - 2 | 2 - 3 | 6 - 10 | PTL 分播口与机器人搬运接口风险较高 |
| Task 10 | 异常与缺料闭环 | 3 - 4 | 1 | 1 - 2 | 5 - 7 | 冻结、缺料、盘点单、回库调度 |
| Task 11 | UI 页面整合 | 1 | 3 - 5 | 1 - 2 | 5 - 8 | 工作台主界面、动态图、按钮与状态展示 |

### 8.3 外部依赖风险工时

| 依赖项 | 风险 | 可能追加 |
| --- | --- | ---: |
| 上游 WMS 周转箱检查接口 | 报文和校验规则未定，可能影响绑箱/满箱 | 1 - 2 人日 |
| WCS/AGV 任务创建与回库接口 | 现有接口可复用程度待确认，可能需要新任务类型 | 1 - 3 人日 |
| 电子标签接口与拍灯回调 | 灯号映射、回调幂等、异常补偿需现场验证 | 1 - 3 人日 |
| PTL 分播口接口 | 按单交付阶段依赖强，接口未确认时无法闭环 | 2 - 4 人日 |
| 缺料盘点单接口 | 字段和生成入口未确认 | 1 - 2 人日 |
| 真实 AGV/PTL 现场联调 | 设备排队、网络、回调时序和异常重试不可控 | 3 - 6 人日 |

### 8.4 里程碑建议

| 里程碑 | 范围 | 验收口径 | 预估 |
| --- | --- | --- | ---: |
| M1 基础配置可用 | Task 1 - 3 | 可维护 AGV 首选项，工作站可进入/退出 AGV 分拣模式 | 7 - 12 人日 |
| M2 核心分拣可跑 | Task 4 - 7 | 任务可分配到分拣墙，AGV 可下发，扫箱可返回批量/按单分拣指引 | 17 - 26 人日 |
| M3 确认闭环可跑 | Task 8 + Task 11 基础界面 | 支持电子标签/手工确认，分拣墙与任务状态可闭环 | 10 - 14 人日 |
| M4 异常与交付闭环 | Task 9 - 10 + Task 11 完整界面 | 按单交付、缺料、冻结、回库、PTL 状态完成闭环 | 14 - 22 人日 |

## 9. 验证计划

| 验证项 | 方法 |
| --- | --- |
| 编译 | `:wms-automation:compileGroovy`、涉及 shipping/task 时分别编译对应模块 |
| 数据迁移 | 本地 MySQL 执行迁移脚本，确认字段/表存在 |
| 工作站状态 | 手工调用接口验证 `currentJobMode/acceptStatus/taskType` |
| 任务分配 | 构造已释放 AGV 区任务，执行 `assignOnce()` 验证分拣墙和任务头回写 |
| AGV 下发 | 使用模拟 WCS API 验证 `wcs_dispatch_task` 创建和报文 |
| 扫箱分拣 | 构造周转箱和任务明细，验证批量/按单返回差异 |
| UID 扫描 | 构造受 UID 管理的 SKU，验证逐件扫描和数量统计 |
| 确认闭环 | 模拟拍灯/手工确认，验证任务明细、分拣墙状态和回库触发 |
| 按单交付 | 模拟停止拣货、继续拣货、绑定新货位、PTL 完成分播 |
| 异常流程 | 冻结、缺料、无箱、无任务、AGV 超并发 |

## 10. 待确认事项

1. `wcs_sorting_wall.Task_ID` 存“上游波次号”还是“任务头 ID/任务号”。
2. `task_header` 自定义1-4在当前数据库中的实际列名。
3. `wcs_work_station.acceptStatus` 取值是 `0/1` 还是现有字符串字典。
4. AGV 并发量 `ZDagv` 放在工作站表、分拣墙表还是系统参数。
5. AGV 区域判断使用库区编码、库区类型还是系统参数。
6. 上游波次号段表是否复用 `shopee_wave`。
7. 周转箱检查接口报文和返回结构。
8. 电子标签接口和拍灯回调报文。
9. 缺料盘点单字段和创建入口。
10. SKU 批次冻结判断使用库存状态、冻结标识还是库存 holdCode。
11. UID 受库存管理的判断字段和 UID 扫描校验接口。
12. PTL 分播口、分播位、分拣墙/格口之间的表关系。
13. 按单交付阶段是否必须同步 Shopee WMS，接口报文是什么。
14. “换人拣货/结束并清除当前任务”的状态清理范围。
