# WMS库存页面MES接口集成设计文档
**日期**: 2026-04-12
**项目**: WIDESEA WMS
**作者**: Claude Code
---
## 一、需求概述
为WMS库存信息页面和库存明细页面添加操作列,调用MES系统的出站/入站/绑定/解绑/NG上报接口,实现WMS与MES的数据同步。
### 功能范围
**库存信息页面(stockInfo.vue)- 托盘级别:**
- 托盘进站(调用MES InboundInContainer接口)
- 托盘出站(调用MES OutboundInContainer接口)
**库存明细页面(stockInfoDetail.vue)- 电芯级别:**
- 托盘电芯绑定(调用MES BindContainer接口)
- 托盘电芯解绑(调用MES UnBindContainer接口)
- 托盘NG电芯上报(调用MES ContainerNgReport接口)
---
## 二、架构设计
### 2.1 系统架构图
```
┌─────────────────────────────────────────────────────────────────┐
│ 前端 (Vue 3) │
│ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ stockInfo.vue │ │stockInfoDetail │ │ MesDialog.vue │ │
│ │ (库存信息) │ │ .vue(库存明细) │ │ (确认对话框) │ │
│ │ + 操作列 │ │ + 操作列 │ │ │ │
│ └────────┬─────────┘ └────────┬─────────┘ └────────┬───────┘ │
│ │ │ │ │
│ └─────────────────────┴──────────────────────┘ │
│ │ │
└──────────────────────────────┼───────────────────────────────────┘
│ HTTP API
┌──────────────────────────────┼───────────────────────────────────┐
│ ▼ 后端 (.NET) │
│ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ StockController │→ │ MesController │ │ MesLogService │ │
│ │ │ │ │ │ │ │
│ └──────────────────┘ └────────┬─────────┘ └────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ IMesService │→ │ MesService │ │Dt_MesApiLog │ │
│ │ (接口定义) │ │ (HTTP调用) │ │ (日志表) │ │
│ └──────────────────┘ └──────────────────┘ └────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────┐
│ MES系统 │
│ (外部接口) │
└──────────────┘
```
### 2.2 技术栈
- **前端**: Vue 3, Element Plus, Pinia
- **后端**: .NET 8, ASP.NET Core, SqlSugar ORM
- **数据库**: SQL Server
- **HTTP客户端**: HttpClient (后端调用MES)
---
## 三、前端设计
### 3.1 库存信息页面 (stockInfo.vue)
#### 操作列设计
**表格列配置:**
```javascript
{
field: "actions",
title: "操作",
width: 200,
fixed: "right",
align: "center",
formatter: (row) => renderActions(row)
}
```
**按钮定义:**
- 进站按钮:调用托盘进站接口
- 出站按钮:调用托盘出站接口
**按钮显示规则:**
| 库存状态 | 进站 | 出站 |
|---------|:----:|:----:|
| 待入库 (0) | ✓ | ✗ |
| 在库 (1) | ✗ | ✓ |
| 出库中 (2) | ✗ | ✓ |
| 锁定 (3) | ✗ | ✗ |
### 3.2 库存明细页面 (stockInfoDetail.vue)
#### 操作列设计
**表格列配置:**
```javascript
{
field: "actions",
title: "操作",
width: 280,
fixed: "right",
align: "center",
formatter: (row) => renderActions(row)
}
```
**按钮定义:**
- 绑定按钮:调用托盘电芯绑定接口
- 解绑按钮:调用托盘电芯解绑接口
- NG上报按钮:调用托盘NG电芯上报接口
**按钮显示规则:**
| 电芯状态 | 绑定 | 解绑 | NG上报 |
|---------|:----:|:----:|:------:|
| 正常 (1) | ✓ | ✓ | ✓ |
| 异常 (2) | ✓ | ✓ | ✓ |
| 已锁定 (99) | ✗ | ✗ | ✗ |
### 3.3 确认对话框组件 (MesConfirmDialog.vue)
**组件职责:**
- 显示即将执行的操作信息
- 展示关键参数(托盘码、设备编码等)
- 提供确认/取消按钮
- 显示调用结果(成功/失败)
**Props定义:**
```typescript
interface MesConfirmDialogProps {
visible: boolean;
operationType: 'inbound' | 'outbound' | 'bind' | 'unbind' | 'ngReport';
palletCode: string;
stockInfo?: any;
detailInfo?: any;
}
```
### 3.4 交互流程
```
用户点击操作按钮
│
▼
检查登录状态 ──────→ 未登录 ────→ 提示"请先登录"
│
▼ 已登录
检查操作权限 ──────→ 无权限 ────→ 提示"无权限执行此操作"
│
▼ 有权限
弹出确认对话框
│
▼
用户点击"确认执行"
│
▼
显示loading状态
│
▼
调用后端API
│
├─→ 成功 ────→ 显示成功提示 ────→ 刷新列表
│
└─→ 失败 ────→ 显示错误提示 + "重试"按钮
```
---
## 四、后端设计
### 4.1 API接口设计
#### 4.1.1 库存信息相关接口
**托盘进站**
```csharp
///
/// 托盘进站 - 调用MES接口
///
[HttpPost("inboundInContainer")]
public async Task InboundInContainer([FromBody] InboundInContainerRequestDto dto)
```
**请求DTO:**
```csharp
public class InboundInContainerRequestDto
{
///
/// 托盘编号
///
public string PalletCode { get; set; }
///
/// 库存ID
///
public long StockId { get; set; }
}
```
**托盘出站**
```csharp
///
/// 托盘出站 - 调用MES接口
///
[HttpPost("outboundInContainer")]
public async Task OutboundInContainer([FromBody] OutboundInContainerRequestDto dto)
```
**请求DTO:**
```csharp
public class OutboundInContainerRequestDto
{
///
/// 托盘编号
///
public string PalletCode { get; set; }
///
/// 库存ID
///
public long StockId { get; set; }
///
/// 产品参数列表(可选)
///
public List ParamList { get; set; }
}
```
#### 4.1.2 库存明细相关接口
**托盘电芯绑定**
```csharp
///
/// 托盘电芯绑定 - 调用MES接口
///
[HttpPost("bindContainer")]
public async Task BindContainer([FromBody] BindContainerRequestDto dto)
```
**请求DTO:**
```csharp
public class BindContainerRequestDto
{
///
/// 托盘编号
///
public string PalletCode { get; set; }
///
/// 电芯码列表
///
public List SfcList { get; set; }
///
/// 位置信息
///
public string Location { get; set; }
///
/// 操作类型:0-默认 1-进站 2-出站 3-进出站
///
public int OperationType { get; set; } = 1;
}
```
**托盘电芯解绑**
```csharp
///
/// 托盘电芯解绑 - 调用MES接口
///
[HttpPost("unbindContainer")]
public async Task UnbindContainer([FromBody] UnbindContainerRequestDto dto)
```
**请求DTO:**
```csharp
public class UnbindContainerRequestDto
{
///
/// 托盘编号
///
public string PalletCode { get; set; }
///
/// 电芯码列表
///
public List SfcList { get; set; }
}
```
**托盘NG电芯上报**
```csharp
///
/// 托盘NG电芯上报 - 调用MES接口
///
[HttpPost("containerNgReport")]
public async Task ContainerNgReport([FromBody] ContainerNgReportRequestDto dto)
```
**请求DTO:**
```csharp
public class ContainerNgReportRequestDto
{
///
/// 托盘编号
///
public string PalletCode { get; set; }
///
/// NG电芯列表
///
public List NgSfcList { get; set; }
}
public class NgSfcItemDto
{
///
/// 产品条码
///
public string Sfc { get; set; }
///
/// NG代码
///
public string NgCode { get; set; }
///
/// NG设备
///
public string NgEquipmentCode { get; set; }
///
/// NG资源
///
public string NgResourceCode { get; set; }
}
```
### 4.2 数据库设计
#### 4.2.1 MES接口调用日志表
```sql
CREATE TABLE Dt_MesApiLog (
Id BIGINT PRIMARY KEY IDENTITY(1,1),
ApiType NVARCHAR(50) NOT NULL, -- 接口类型
RequestJson NVARCHAR(MAX) NULL, -- 请求JSON
ResponseJson NVARCHAR(MAX) NULL, -- 响应JSON
IsSuccess BIT NOT NULL DEFAULT 0, -- 是否成功
ErrorMessage NVARCHAR(500) NULL, -- 错误信息
ElapsedMs INT NOT NULL DEFAULT 0, -- 耗时(毫秒)
CreateDate DATETIME NOT NULL, -- 创建时间
Creator NVARCHAR(50) NULL, -- 创建人
INDEX IX_MesApiLog_ApiType (ApiType),
INDEX IX_MesApiLog_CreateDate (CreateDate)
);
```
**字段说明:**
| 字段 | 类型 | 说明 |
|------|------|------|
| Id | bigint | 主键 |
| ApiType | string(50) | 接口类型:InboundInContainer, OutboundInContainer, BindContainer, UnbindContainer, ContainerNgReport |
| RequestJson | string(MAX) | MES接口请求JSON |
| ResponseJson | string(MAX) | MES接口响应JSON |
| IsSuccess | bool | 调用是否成功 |
| ErrorMessage | string(500) | 失败时的错误信息 |
| ElapsedMs | int | 接口调用耗时(毫秒) |
| CreateDate | datetime | 创建时间 |
| Creator | string(50) | 创建人 |
#### 4.2.2 系统配置表扩展
```sql
-- 在 Dt_SystemConfig 表中新增MES配置项
INSERT INTO Dt_SystemConfig (ConfigKey, ConfigValue, Description, CreateDate)
VALUES
('MES_EquipmentCode', 'WCS_001', 'MES设备编码', GETDATE()),
('MES_ResourceCode', 'RESOURCE_001', 'MES资源编码', GETDATE()),
('MES_ApiBaseUrl', 'http://mes-server/api', 'MES接口地址', GETDATE()),
('MES_TimeoutSeconds', '30', 'MES接口超时时间(秒)', GETDATE());
```
### 4.3 服务层设计
#### 4.3.1 MES日志服务接口
```csharp
///
/// MES接口日志服务接口
///
public interface IMesLogService : IDependency
{
///
/// 记录MES接口调用日志
///
Task LogAsync(MesApiLogDto log);
///
/// 获取最近的MES接口调用记录
///
Task> GetRecentLogsAsync(string apiType, int count = 50);
}
```
#### 4.3.2 MES日志服务实现
```csharp
///
/// MES接口日志服务实现
///
public class MesLogService : IMesLogService
{
private readonly ISqlSugarClient _db;
public async Task LogAsync(MesApiLogDto log)
{
var entity = new Dt_MesApiLog
{
ApiType = log.ApiType,
RequestJson = log.RequestJson,
ResponseJson = log.ResponseJson,
IsSuccess = log.IsSuccess,
ErrorMessage = log.ErrorMessage,
ElapsedMs = log.ElapsedMs,
CreateDate = DateTime.Now,
Creator = log.Creator
};
return await _db.Insertable(entity).ExecuteCommandAsync() > 0;
}
public async Task> GetRecentLogsAsync(string apiType, int count = 50)
{
return await _db.Queryable()
.Where(x => x.ApiType == apiType)
.OrderByDescending(x => x.CreateDate)
.Take(count)
.ToListAsync();
}
}
```
---
## 五、接口调用流程
### 5.1 托盘进站流程
```
用户点击"进站"按钮
│
▼
前端弹出确认对话框(显示托盘码、设备编码等)
│
▼
用户确认
│
▼
前端调用 POST /api/StockInfo/inboundInContainer
│
▼
后端 StockInfoController.InboundInContainer()
│
├─→ 1. 验证库存状态(仅"待入库"状态允许进站)
│
├─→ 2. 获取系统配置(设备编码、资源编码)
│
├─→ 3. 构造MES请求对象
│
├─→ 4. 调用 IMesService.InboundInContainer()
│ │
│ ├─→ 记录开始时间
│ ├─→ 发送HTTP请求到MES
│ ├─→ 记录响应、耗时
│ └─→ 保存日志到 Dt_MesApiLog
│
├─→ 5. 返回结果给前端
│
└─→ 前端显示成功/失败提示
```
### 5.2 托盘电芯绑定流程
```
用户点击"绑定"按钮
│
▼
前端弹出确认对话框(显示托盘码、电芯码列表)
│
▼
用户确认
│
▼
前端调用 POST /api/StockInfoDetail/bindContainer
│
▼
后端 StockInfoDetailController.BindContainer()
│
├─→ 1. 验证电芯状态(非"已锁定"状态允许绑定)
│
├─→ 2. 获取系统配置
│
├─→ 3. 构造MES请求对象(包含电芯码列表)
│
├─→ 4. 调用 IMesService.BindContainer()
│ │
│ ├─→ 记录开始时间
│ ├─→ 发送HTTP请求到MES
│ ├─→ 记录响应、耗时
│ └─→ 保存日志到 Dt_MesApiLog
│
├─→ 5. 返回结果给前端
│
└─→ 前端显示成功/失败提示
```
---
## 六、错误处理
### 6.1 错误类型
| 错误类型 | 说明 | 处理方式 |
|---------|------|---------|
| 网络超时 | MES服务器无响应或连接超时 | 显示错误提示,提供"重试"按钮 |
| 业务校验失败 | 托盘不存在、电芯已绑定等 | 显示MES返回的错误信息 |
| 认证失败 | MES接口认证信息过期 | 显示"MES认证失败,请联系管理员" |
| 参数错误 | 请求参数不完整或格式错误 | 显示"参数错误:{具体错误}" |
| 未知错误 | MES系统返回异常响应 | 显示"MES系统异常,请稍后重试" |
### 6.2 前端错误提示
```javascript
// 成功提示
ElMessage.success('托盘进站成功');
// 失败提示
ElMessage.error({
message: 'MES服务器连接超时,请检查网络后重试',
showRetry: true,
onRetry: () => retryOperation()
});
```
### 6.3 后端错误日志
```csharp
try
{
// 调用MES接口
}
catch (HttpRequestException ex)
{
// 网络异常
await _mesLogService.LogAsync(new MesApiLogDto
{
ApiType = "InboundInContainer",
IsSuccess = false,
ErrorMessage = $"网络异常: {ex.Message}",
ElapsedMs = elapsedMs
});
return ResponseContent.Error("MES服务器连接失败,请检查网络");
}
catch (Exception ex)
{
// 其他异常
_logger.LogError(ex, "调用MES接口异常");
return ResponseContent.Error($"MES接口调用失败: {ex.Message}");
}
```
---
## 七、权限控制
### 7.1 功能权限定义
建议在系统中新增以下功能权限:
| 权限代码 | 权限名称 | 说明 |
|---------|---------|------|
| MES_INBOUND | MES进站操作 | 允许执行托盘进站操作 |
| MES_OUTBOUND | MES出站操作 | 允许执行托盘出站操作 |
| MES_BIND | MES绑定操作 | 允许执行电芯绑定操作 |
| MES_UNBIND | MES解绑操作 | 允许执行电芯解绑操作 |
| MES_NG_REPORT | MES NG上报 | 允许执行NG上报操作 |
### 7.2 权限验证
```csharp
[HttpPost("inboundInContainer")]
[Permission("MES_INBOUND")]
public async Task InboundInContainer([FromBody] InboundInContainerRequestDto dto)
{
// 接口实现
}
```
---
## 八、文件变更清单
### 8.1 前端文件
```
WMS/WIDESEA_WMSClient/src/
├── views/stock/
│ ├── stockInfo.vue # 修改:添加操作列
│ └── stockInfoDetail.vue # 修改:添加操作列
├── components/
│ └── MesConfirmDialog.vue # 新增:MES确认对话框
└── api/
└── mes.js # 新增:MES API调用
```
### 8.2 后端文件
```
WMS/WIDESEA_WMSServer/
├── Controllers/
│ └── Stock/
│ ├── StockInfoController.cs # 修改:添加进站/出站接口
│ └── StockInfoDetailController.cs # 修改:添加绑定/解绑/NG上报接口
├── Services/
│ └── Mes/
│ ├── IMesLogService.cs # 新增:日志服务接口
│ └── MesLogService.cs # 新增:日志服务实现
└── DTO/
├── Mes/
│ ├── MesApiLogDto.cs # 新增:日志DTO
│ ├── InboundInContainerRequestDto.cs # 新增:进站请求DTO
│ ├── OutboundInContainerRequestDto.cs # 新增:出站请求DTO
│ ├── BindContainerRequestDto.cs # 新增:绑定请求DTO
│ ├── UnbindContainerRequestDto.cs # 新增:解绑请求DTO
│ └── ContainerNgReportRequestDto.cs # 新增:NG上报请求DTO
└── Models/
└── Mes/
└── Dt_MesApiLog.cs # 新增:日志实体
```
### 8.3 数据库文件
```
Database/
└── Scripts/
└── 20260412_MesApiLog.sql # 新增:日志表创建脚本
```
---
## 九、测试要点
### 9.1 功能测试
| 测试场景 | 预期结果 |
|---------|---------|
| 待入库状态托盘点击进站 | 弹出确认对话框,确认后成功调用 |
| 在库状态托盘点击进站 | 进站按钮不显示 |
| 网络中断时点击操作 | 显示网络错误提示,提供重试按钮 |
| MES返回业务错误 | 显示MES返回的具体错误信息 |
| 点击操作后刷新页面 | 操作记录已保存到日志表 |
### 9.2 性能测试
| 指标 | 目标值 |
|------|--------|
| MES接口响应时间 | < 2秒 |
| 前端按钮点击响应 | < 100ms |
| 日志写入耗时 | < 50ms |
---
## 十、后续优化建议
1. **批量操作**:支持选中多个托盘/电芯批量调用MES接口
2. **自动重试**:对于网络超时等临时故障,自动重试3次
3. **接口监控**:增加MES接口调用的实时监控和告警
4. **参数配置化**:将超时时间、重试次数等参数做成可配置项
5. **操作审计**:增加操作审计日志,记录谁在什么时间执行了什么操作
---
**文档版本**: 1.0
**最后更新**: 2026-04-12