# MES 电芯绑定解绑集成设计 ## 概述 在 `StockService` 的组盘、换盘、拆盘操作中,将 MES 电芯绑定/解绑调用纳入 WMS 事务内,确保库存数据与 MES 状态一致。 ## 事务策略 **MES 调用纳入 WMS 事务内** — 如果 MES 调用失败,整个事务回滚,WMS 库存数据不会变化。 ## 数据流 | 操作 | MES 调用 | 时机 | |------|----------|------| | **组盘** | `BindContainer` | WMS 库存写入后 | | **换盘** | `UnBindContainer` → `BindContainer` | 解绑在换出前,绑定在换入后 | | **拆盘** | `UnBindContainer` | 库存明细删除前 | ## 涉及文件 - `WIDESEA_StockService/StockSerivce.cs` ## 详细设计 ### 1. 组盘 (GroupPalletAsync) **现有逻辑:** - 在事务内执行 WMS 库存写入 - 第 166 行已存在 `_mesService.BindContainer()` 调用,但缺少 `await` 和结果处理 **修改后:** - 修复为 `await _mesService.BindContainer(bindRequest)` - 检查返回结果,`result.Success == false` 时事务回滚 - 错误返回:`"组盘成功,但MES调用失败: {MES错误}"` ### 2. 换盘 (ChangePalletAsync) **现有逻辑:** - 事务内:查询源托盘和目标托盘 → 更新库存明细的 `StockId` **修改后:** - 在更新库存明细前,调用 `UnBindContainer` 解绑源托盘电芯 - 在更新库存明细后,调用 `BindContainer` 绑定到目标托盘 - MES 失败 → 事务回滚 **UnBindContainer 请求构建:** ```csharp var unbindRequest = new UnBindContainerRequest { EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainCode = stock.SourcePalletNo, SfcList = detailEntities.Select(d => d.SerialNumber).ToList() }; ``` ### 3. 拆盘 (SplitPalletAsync) **现有逻辑:** - 事务内:查询库存明细 → 删除明细记录 **修改后:** - 删除前,调用 `UnBindContainer` 解绑电芯 - MES 失败 → 事务回滚 **UnBindContainer 请求构建:** ```csharp var unbindRequest = new UnBindContainerRequest { EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainCode = stock.SourcePalletNo, SfcList = detailEntities.Select(d => d.SerialNumber).ToList() }; ``` ## 错误处理 统一错误处理策略: - MES 调用失败时,事务回滚 - 返回:`"{操作}成功,但MES调用失败: {MES错误}"` 其中 `{MES错误}` 来自 `result.Message`。 ## 设备编码 硬编码 `EquipmentCode = "STK-GROUP-001"` 和 `ResourceCode = "STK-GROUP-001"`,与组盘现有逻辑保持一致。 ## 实现要点 - 所有 MES 调用使用 `await` - 检查 `HttpResponseResult` 的 `Success` 属性 - MES 调用失败时返回错误信息,事务自动回滚(`ExecuteWithinTransactionAsync` 在 `result.Status != true` 时回滚)