# 批量 MES 绑定与解绑接口设计
## 背景
当前 `StockSerivce` 中 `GroupPalletAsync`、`ChangePalletAsync`、`SplitPalletAsync` 每次调用都会触发一次 MES 接口。
WCS 机器人任务按批次取放,一个托盘可能需要多次 MES 调用(如换盘需要先解绑再绑定)。为减少 MES 调用次数,新增两个批量确认接口供 WCS 在任务阶段完成时一次性上传托盘级别的绑定/解绑数据。
## 新增接口
### 1. SplitPalletConfirm — 批量拆盘确认
**触发时机**:WCS 拆盘任务/换盘任务全部取完
**WCS 调用方式**:`POST /api/Stock/SplitPalletConfirm`
**请求参数**:
```csharp
public class SplitPalletConfirmRequest
{
///
/// 源托盘号
///
public string PalletCode { get; set; }
}
```
**处理流程**:
1. WMS 根据 `PalletCode` 从临时表 `Dt_SplitTemp` 读取预存电芯列表
2. 调用 MES `UnBindContainer`(一次性上传整托电芯)
3. 删除临时表 `Dt_SplitTemp` 中对应记录
**临时表写入时机**:`SplitPalletAsync` 每次被调用时,先检查 `Dt_SplitTemp` 中是否存在该托盘记录;不存在则将当前托盘对应的所有电芯条码写入临时表;已存在则跳过写入。
**临时表结构**(`Dt_SplitTemp`):
| 字段 | 类型 | 说明 |
|------|------|------|
| Id | int | 主键 |
| PalletCode | string | 托盘号 |
| SfcList | string | 电芯条码列表(JSON数组) |
| CreateTime | DateTime | 创建时间 |
---
### 2. GroupPalletConfirm — 批量组盘确认
**触发时机**:WCS 组盘任务/换盘任务全部放完
**WCS 调用方式**:`POST /api/Stock/GroupPalletConfirm`
**请求参数**:
```csharp
public class GroupPalletConfirmRequest
{
///
/// 目标托盘号
///
public string PalletCode { get; set; }
}
```
**处理流程**:
1. WMS 根据 `PalletCode` 查询 `Dt_StockInfoDetail` 中该托盘下的所有电芯明细
2. 调用 MES `BindContainer`(一次性上传整托电芯绑定)
3. 返回结果
**注意**:电芯数据在组盘任务放货过程中已由 WCS 通过其他接口写入 `Dt_StockInfoDetail`,WMS 不需要额外存储
---
## 换盘任务完整流程
```
换盘任务:
全部取完 → SplitPalletConfirm(源托盘) → MES UnBindContainer
全部放完 → GroupPalletConfirm(目标托盘) → MES BindContainer
```
## 现有接口处理
- `GroupPalletAsync`、`ChangePalletAsync`、`SplitPalletAsync` 保留
- 新接口与现有接口并存,WCS 根据任务场景选择调用
- 现有接口继续承担单次/非批量场景的 MES 调用
## WCS 侧改造要点
- 拆盘/换盘任务开始时,WCS 调用现有 `SplitPalletAsync` 接口;WMS 在 `SplitPalletAsync` 内部先检查 `Dt_SplitTemp` 是否已有该托盘记录,无则写入,有则跳过(幂等写入)
- 组盘任务全部放完时调用 `GroupPalletConfirm`
- 换盘任务全部取完时调用 `SplitPalletConfirm`,全部放完时调用 `GroupPalletConfirm`
## 文件变更
| 操作 | 文件 |
|------|------|
| 新增 | `WIDESEA_DTO/Stock/SplitPalletConfirmRequestDto.cs` |
| 新增 | `WIDESEA_DTO/Stock/GroupPalletConfirmRequestDto.cs` |
| 新增 | `WIDESEA_Model/Models/Dt_SplitTemp.cs` |
| 修改 | `WIDESEA_IStockService/IStockService.cs`(新增接口定义) |
| 修改 | `WIDESEA_StockService/StockService.cs`(实现批量确认逻辑) |
| 修改 | `WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs`(新增 API 路由) |
| 修改 | 数据库:新增 `Dt_SplitTemp` 表 |
## 风险与约束
- 临时表 `Dt_SplitTemp` 需要有清理机制,防止异常情况下数据残留
- MES 接口调用失败时,临时表数据不回滚,下次重试时可能重复解绑,需 MES 侧幂等支持