# PDA ERP 对接接口汇总
> 服务根地址:`http://127.0.0.1:8980`
> 仅登录 MES,不直连金蝶 ERP
> **PDA 请统一使用 `POST`**(表单或 query 参数均可;部分辅助接口也兼容 GET 供 PC 调试)
> **所有 PDA 接口统一返回 `CommonResp` 结构**(与 `pdaQueryIsSn` 一致)
> **提交类接口**(`submitInStock`、`submitPickMaterial`、`submit`)均支持 **表单 POST** 与 **JSON Body** 两种方式
## 统一响应格式
|字段|类型|说明|
|:----|:-----|-----|
|result|string|`"true"` 成功 / `"false"` 失败|
|message|string|提示信息|
|data|object|业务数据,结构因接口而异,见各接口「返回字段说明」|
### data 分页结构(Page,列表类接口通用)
|字段|类型|中文说明|
|:----|:-----|-----|
|pageNo|int|当前页码|
|pageSize|int|每页条数|
|count|long|总记录数(ERP 游标式分页,末页可能为估算值)|
|list|array|当前页数据行|
### 仓库选项 stockList[](单条)
|字段|类型|中文说明|
|:----|:-----|-----|
|stockNumber|string|仓库编码|
|stockName|string|仓库名称|
|displayLabel|string|展示文本,一般为「编码 + 名称」|
### 仓位选项 locations[](单条)
|字段|类型|中文说明|
|:----|:-----|-----|
|locNumber|string|仓位编码|
|locName|string|仓位名称|
|displayLabel|string|展示文本|
|locKey|string|仓位维度键(因仓库而异,仅展示用;**提交可不回传**,见下文「仓库与仓位」)|
### 批号选项 lots[](单条)
|字段|类型|中文说明|
|:----|:-----|-----|
|lotNumber|string|批号|
|qtyText|string|可用/库存数量展示文本|
### MES 批次码 batch / batchList[](单条)
|字段|类型|中文说明|
|:----|:-----|-----|
|id|string|mes_batch_sn 主键,生产入库提交 batchIds 用此值|
|batchSn|string|MES 托盘批次码(扫码值)|
|lineSn|string|产线编号,如 HEVXT、115XT|
|nums|long|已绑定工件数量,须 >0 才可入库|
|instockStatus|string|入库状态,0 未入库 / 1 已入库|
```
成功示例
{
"result": "true",
"message": "成功",
"data": { ... }
}
失败示例
{
"result": "false",
"message": "参数错误",
"data": null
}
```
> PC 端页面仍使用原 `selectOrderData`、`listData` 等接口(直接返回 `Page`);PDA 请使用下文 **`pda/`** 前缀接口。
---
## 仓库与仓位(通用)
> **PDA 推荐统一调用公共接口**(来料检 / 生产入库 / 直接调拨共用,避免各模块重复实现与权限不一致):
>
> | 用途 | URL |
> |:-----|:----|
> | 仓库列表 | `POST /js/a/mes/erpStockPda/stockList` |
> | 仓位选项 | `POST /js/a/mes/erpStockPda/stockLocOptions?stockNumber=1100105` |
> | 初始化(仓库+默认仓位) | `POST /js/a/mes/erpStockPda/init` 或 `?stockNumber=` |
>
> 权限:拥有 **来料检 / 生产入库 / 直接调拨** 任一模块的 `view` 权限即可调用。
> 各业务模块下原有的 `stockList`、`pda/stockLocOptions` **仍保留兼容**,数据与公共接口一致。
涉及来料检、生产入库、直接调拨的接口,仓库/仓位规则一致:
| 步骤 | PDA 行为 |
|:-----|:---------|
| 1 | 调 **`/mes/erpStockPda/stockList`** 或业务 init 接口,获取 `stockList`、`defaultStockNumber` |
| 2 | 用户选定仓库后,调 **`/mes/erpStockPda/stockLocOptions?stockNumber=`** |
| 3 | 若返回 `data.required=true`,提交时必须带仓位编码(`stockLocNumber`,或调拨的 `srcStockLocNumber` / `destStockLocNumber`) |
| 4 | **不要写死 `stockLocKey`**:MES 后台按仓库查金蝶档案并解析仓位内码 |
**PDA 崩溃常见原因(返回 HTML 登录页)**
| 现象 | 原因 | 处理 |
|:-----|:-----|:-----|
| Logcat 出现 `
登录 - MES生产管理系统` | **Session 失效或未带 Cookie** | 重新登录 MES,请求头携带 `Cookie: jeesite.session.id=...` 或参数 `__sid` |
| 第一次能选仓位、第二次 Gson 崩溃 | 第二次请求未带登录态,把 HTML 当 JSON 解析 | 解析前先判断 `result` 字段或 `Content-Type` 含 `json`;统一改用 **`erpStockPda`** 公共接口 |
| 生产入库却调 `erpInStock/...` 仓位接口 | 模块权限不一致 | 改用 **`/mes/erpStockPda/stockLocOptions`** |
**`locKey` / `stockLocKey`**
| 项 | 说明 |
|:---|:-----|
| 是否固定 | **否**。由 ERP 仓库弹性域决定,因仓库而异。例:五金库 `1100105` → `F100004`;半成品仓 `1100104` → `F100002` |
| 谁解析 | **MES 后台**。根据 `stockNumber` + `stockLocNumber` 查 `BD_FLEXVALUESDETAIL.FID`,以整数写入金蝶 `FStockLocId` |
| PDA 是否必传 | **`stockLocKey` 可选**。仓位选项返回的 `locKey` 仅供展示/日志;只传 `stockNumber` + `stockLocNumber` 即可 |
| 无仓位仓库 | `stockLocOptions` 返回 `required=false` 时,提交不传仓位字段 |
**提交最少字段示例(来料检)**【已改:须带 checkResult】**
```json
{
"billNo": "CGDD110260602003",
"checkResult": "OK",
"channel": "PDA",
"stockNumber": "1100105",
"stockLocNumber": "A22",
"entryIds": ["194383", "194384", "194385"],
"lines": [
{ "inspectQty": 10, "lotNumber": "11020260603" },
{ "inspectQty": 10, "lotNumber": "20250101" },
{ "inspectQty": 600 }
]
}
```
### 公共:仓库列表(推荐)
> 来料检、生产入库、直接调拨 **共用**。PDA 请优先使用本接口,勿再按业务模块分别调用各模块下的 `stockList`。
##### 请求URL
- ` /js/a/mes/erpStockPda/stockList `
##### 请求方式
- POST(也兼容 GET)
##### 权限
- `mes:erpInStock:view` / `mes:erpPrdInStock:view` / `mes:erpTransferDirect:view` **任一**即可
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|无|—|—|—|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpStockPda/stockList' \
--header 'Cookie: jeesite.session.id=你的会话ID'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"defaultStockNumber": "1100105",
"stockHint": "共 5 个可用仓库",
"stockList": [
{ "stockNumber": "1100105", "stockName": "五金库", "displayLabel": "1100105 五金库" }
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.defaultStockNumber|string|推荐默认入库仓库编码|
|data.stockHint|string|仓库加载提示文本|
|data.stockList[]|array|可用仓库列表,字段见「仓库选项 stockList[]」|
---
### 公共:仓位选项(推荐)
> 来料检、生产入库、直接调拨 **共用**。用户**切换仓库后须重新调用**本接口。
##### 请求URL
- ` /js/a/mes/erpStockPda/stockLocOptions `
##### 请求方式
- POST(也兼容 GET)
##### 权限
- `mes:erpInStock:view` / `mes:erpPrdInStock:view` / `mes:erpTransferDirect:view` **任一**即可
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|stockNumber|是|string|仓库编码(来自 stockList 或 init)|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpStockPda/stockLocOptions?stockNumber=1100105' \
--header 'Cookie: jeesite.session.id=你的会话ID'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"stockNumber": "1100105",
"required": true,
"defaultLocNumber": "A",
"locKey": "F100004",
"locHint": "共 278 个仓位,数据来自 ERP 仓位值集",
"locations": [
{ "locNumber": "A", "locName": "A", "locKey": "F100004", "displayLabel": "A A" }
]
}
}
```
```
失败(未传仓库)
{
"result": "false",
"message": "仓库编码不能为空",
"data": null
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.stockNumber|string|请求的仓库编码|
|data.required|boolean|该仓库是否启用仓位(true 时须选择仓位)|
|data.defaultLocNumber|string|推荐默认仓位编码|
|data.locHint|string|仓位加载提示文本|
|data.locKey|string|仓位维度键(因仓库而异,展示用;提交可不回传)|
|data.locKeys|array|仓库启用的全部维度键(多维度仓库时有值)|
|data.locations[]|array|仓位列表,字段见「仓位选项 locations[]」|
---
### 公共:初始化(仓库 + 默认仓位预览)
> 一次返回仓库列表及默认仓库(或指定仓库)的仓位预览,减少 PDA 往返。完整仓位列表仍须调「公共:仓位选项」。
##### 请求URL
- ` /js/a/mes/erpStockPda/init `
##### 请求方式
- POST(也兼容 GET)
##### 权限
- `mes:erpInStock:view` / `mes:erpPrdInStock:view` / `mes:erpTransferDirect:view` **任一**即可
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|stockNumber|否|string|指定仓库编码;不传则取 `defaultStockNumber` 查仓位预览|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpStockPda/init' \
--header 'Cookie: jeesite.session.id=你的会话ID'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"defaultStockNumber": "1100105",
"stockHint": "共 5 个可用仓库",
"stockList": [
{ "stockNumber": "1100105", "stockName": "五金库", "displayLabel": "1100105 五金库" }
],
"stockLoc": {
"stockNumber": "1100105",
"required": true,
"defaultLocNumber": "A11",
"locKey": "F100004",
"locHint": "共 278 个仓位,数据来自 ERP 仓位值集",
"locations": [
{ "locNumber": "A11", "locName": "A11区", "locKey": "F100004", "displayLabel": "A11 A11区" }
]
}
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.defaultStockNumber|string|推荐默认入库仓库编码|
|data.stockHint|string|仓库加载提示文本|
|data.stockList[]|array|可用仓库列表,字段见「仓库选项 stockList[]」|
|data.stockLoc|object|默认/指定仓库的仓位预览,字段同「公共:仓位选项」返回的 data|
---
## 一、来料检(采购入库)
> **【新增·来料检记录】** 提交时必传 `checkResult`(OK/NG);仅 OK 生成 CGRK;NG 只留 MES 检验记录。
> 详细对照与适配说明见:`docs/erp/PDA来料检接口说明.md`(文首「本次变更说明」)。
### 采购订单列表
##### 请求URL
- ` /js/a/mes/erpInStock/pda/selectOrderData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|pageNo|否|int|页码,默认 1|
|pageSize|否|int|每页条数,默认 20|
|billNo|否|string|采购订单号|
|materialNumberQuery|否|string|物料编码模糊|
|documentStatusQuery|否|string|单据状态 A/B/C/D,建议默认 C 已审核|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/pda/selectOrderData?pageNo=1&pageSize=20&documentStatusQuery=C'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"billNo": "CGDD110260602003",
"date": "2026-06-02",
"documentStatusName": "已审核",
"supplierName": "某某供应商",
"entryCount": 3,
"totalQty": 1500
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo|int|当前页码|
|data.pageSize|int|每页条数|
|data.count|long|总记录数|
|data.list[].billNo|string|采购订单号|
|data.list[].date|string|单据日期|
|data.list[].documentStatusName|string|单据状态名称(如已审核)|
|data.list[].supplierName|string|供应商名称|
|data.list[].entryCount|int|订单分录行数|
|data.list[].totalQty|number|订单合计数量|
---
### 待入分录列表
##### 请求URL
- ` /js/a/mes/erpInStock/pda/selectDetailData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|billNo|是|string|采购订单号|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/pda/selectDetailData?billNo=CGDD110260602003'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 2,
"list": [
{
"entryId": "123456",
"seq": "1",
"materialNumber": "3.01.001",
"materialName": "某原材料",
"qty": 1000,
"instockQty": 200,
"remainQty": 800,
"unitName": "千克"
}
]
}
}
```
```
失败(已全部入库,data 中 list 为空)
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 0,
"list": []
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息;失败时说明原因|
|data.pageNo|int|当前页码|
|data.pageSize|int|每页条数|
|data.count|long|总记录数,无待入分录时为 0|
|data.list[].entryId|string|采购订单分录内码(提交入库 lines[].entryId 用)|
|data.list[].seq|string|行号|
|data.list[].materialNumber|string|物料编码|
|data.list[].materialName|string|物料名称|
|data.list[].qty|number|订单数量|
|data.list[].instockQty|number|已入库数量|
|data.list[].remainQty|number|剩余可入数量(检验数量不得超过此值)|
|data.list[].unitName|string|计量单位|
---
### 来料检页初始化
##### 请求URL
- ` /js/a/mes/erpInStock/inspectInit `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|billNo|是|string|采购订单号|
|entryIds|是|string / array|勾选分录内码;多条英文逗号分隔,或 JSON 数组;仅一条时也传此字段|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/inspectInit?billNo=CGDD110260602003&entryIds=123456,123457'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "",
"data": {
"billNo": "CGDD110260602003",
"defaultStockNumber": "1100105",
"inspectorCode": "zhangsan",
"inspectorName": "张三",
"inspectTime": "2026-09-11 13:30:00",
"checkResultOptions": ["OK", "NG"],
"stockList": [
{ "stockNumber": "1100105", "stockName": "五金库", "displayLabel": "1100105 五金库" }
],
"stockLoc": {
"required": true,
"defaultLocNumber": "A11",
"locKey": "F100004",
"locHint": "共 278 个仓位,数据来自 ERP 仓位值集",
"locations": [
{ "locNumber": "A11", "locName": "A11区", "locKey": "F100004", "displayLabel": "A11 A11区" }
]
},
"lines": [
{
"entryId": "123456",
"seq": "1",
"materialNumber": "3.01.001",
"materialName": "螺栓M8",
"remainQty": 800,
"batchManage": true,
"suggestedLotNumber": "LOT202606001"
}
]
}
}
```
> **仓库/仓位说明**:`defaultStockNumber` + `stockList` 为仓库;`stockLoc` 为**默认仓库**的仓位预览(完整列表请调「仓位选项」)。`required=true` 时提交**必须**带 `stockLocNumber`;`stockLocKey` **可选**(后台自动解析)。切换仓库后须重新调「仓位选项」。
> **【新增】** `inspectorCode` / `inspectorName` / `inspectTime` / `checkResultOptions`:供 PDA 预填固定检查项。
```
失败
{
"result": "false",
"message": "所选分录已无剩余可入数量",
"data": {
"billNo": "CGDD110260602003",
"lines": [],
"stockList": [],
"defaultStockNumber": "1100105"
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|变更|
|:----|:-----|-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|原有|
|message|string|提示信息;成功时可能为空|原有|
|data.billNo|string|采购订单号|原有|
|data.defaultStockNumber|string|推荐默认入库仓库编码|原有|
|data.stockList[]|array|可用仓库列表,字段见「仓库选项 stockList[]」|原有|
|data.stockLoc|object|默认仓库的仓位信息,字段同「仓位选项」返回的 data|原有|
|data.inspectorCode|string|默认检验员账号|**【新增】**|
|data.inspectorName|string|默认检验员姓名|**【新增】**|
|data.inspectTime|string|默认检验时间|**【新增】**|
|data.checkResultOptions|array|固定 `["OK","NG"]`|**【新增】**|
|data.lines[].entryId|string|分录内码|原有|
|data.lines[].seq|string|行号|原有|
|data.lines[].materialNumber|string|物料编码|原有|
|data.lines[].materialName|string|物料名称|原有|
|data.lines[].remainQty|number|剩余可入数量|原有|
|data.lines[].batchManage|boolean|是否启用批号管理(true 时须填批号)|原有|
|data.lines[].suggestedLotNumber|string|推荐批号(批号管理物料)|原有|
---
### 仓位选项
##### 请求URL
- ` /js/a/mes/erpInStock/pda/stockLocOptions `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|stockNumber|是|string|仓库编码|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/pda/stockLocOptions?stockNumber=1100105'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"required": true,
"defaultLocNumber": "A",
"locKey": "F100004",
"locHint": "共 278 个仓位,数据来自 ERP 仓位值集",
"locations": [
{ "locNumber": "A", "locName": "A", "locKey": "F100004", "displayLabel": "A A" }
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.required|boolean|该仓库是否启用仓位(true 时须选择仓位)|
|data.defaultLocNumber|string|推荐默认仓位编码|
|data.locHint|string|仓位加载提示文本|
|data.locKey|string|仓位维度键(因仓库而异,展示用;提交可不回传)|
|data.locKeys|array|仓库启用的全部维度键(多维度仓库时有值)|
|data.locations[]|array|仓位列表,字段见「仓位选项 locations[]」|
---
### 仓库列表
##### 请求URL
- ` /js/a/mes/erpInStock/stockList `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|无|—|—|—|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/stockList'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"defaultStockNumber": "1100105",
"stockHint": "共 5 个可用仓库",
"stockList": [
{ "stockNumber": "1100105", "stockName": "五金库", "displayLabel": "1100105 五金库" }
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.defaultStockNumber|string|推荐默认入库仓库编码|
|data.stockHint|string|仓库加载提示文本|
|data.stockList[]|array|可用仓库列表,字段见「仓库选项 stockList[]」|
---
### 批号搜索
##### 请求URL
- ` /js/a/mes/erpInStock/pda/lotSearch `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|materialNumber|是|string|物料编码|
|lotKeyword|否|string|批号关键字|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/pda/lotSearch?materialNumber=3.01.001&lotKeyword=LOT'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"lots": [
{ "lotNumber": "LOT202606001", "qtyText": "0" }
],
"lotHint": "共查到 1 条批号档案"
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.lots[]|array|匹配的批号档案列表,字段见「批号选项 lots[]」|
|data.lotHint|string|查询结果提示(无结果时可手工录入新批号)|
---
### 批号列表
##### 请求URL
- ` /js/a/mes/erpInStock/pda/lotOptions `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|materialNumber|是|string|物料编码|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/pda/lotOptions?materialNumber=3.01.001'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"lots": [
{ "lotNumber": "LOT202606001", "qtyText": "0" }
],
"suggestedLotNumber": "LOT202606001",
"lotHint": "共 3 条批号档案,已推荐第一条"
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.lots[]|array|物料批号档案列表,字段见「批号选项 lots[]」|
|data.suggestedLotNumber|string|推荐默认批号|
|data.lotHint|string|批号加载提示文本|
---
### 提交采购入库(含来料检)【已改:必传 checkResult】
##### 请求URL
- ` /js/a/mes/erpInStock/submitInStock `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|变更|
|:----|:---|:-----|-----|-----|
|billNo|是|string|采购订单号|原有|
|checkResult|是|string|检验结果 `OK`/`NG`;仅 OK 生成采购入库单,NG 只保存检验记录|**【新增】必填**|
|inspectorName|否|string|检验员,默认当前用户|**【新增】**|
|inspectorCode|否|string|检验员账号|**【新增】**|
|inspectTime|否|string|检验时间,默认当前时间|**【新增】**|
|remarks|否|string|备注|**【新增】**|
|channel|否|string|建议 PDA 传 `PDA`|**【新增】**|
|stockNumber|条件|string|入库仓库编码;**OK 时必填**|原有|
|stockLocNumber|条件|string|仓库启用仓位且 OK 时必填|原有|
|stockLocKey|否|string|仓位维度键,可选|原有|
|entryIds|条件|string / array|分录内码;与 lines 二选一或组合|原有|
|lines|条件|array / string|入库明细 JSON 数组;**表单方式时 `lines` 为 URL 编码后的 JSON 字符串**|原有|
|lines[].entryId|条件|string|PO 分录内码|原有|
|lines[].inspectQty|条件|number|检验数量|原有|
|lines[].lotNumber|条件|string|批号管理物料必填|原有|
**Content-Type(二选一):** `application/x-www-form-urlencoded`(PDA 推荐)或 `application/json;charset=UTF-8`
##### 参数示例
```
# PDA 表单(OK 入库)
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/submitInStock' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'billNo=CGDD110260602003' \
--data-urlencode 'checkResult=OK' \
--data-urlencode 'channel=PDA' \
--data-urlencode 'stockNumber=1100105' \
--data-urlencode 'stockLocNumber=A22' \
--data-urlencode 'lines=[{"entryId":"194383","inspectQty":10,"lotNumber":"11020260603"}]'
```
##### 返回示例
```
OK 成功【返回字段含新增】
{
"result": "true",
"message": "来料检合格,采购入库单保存成功,单号:CGRK110260624001",
"data": {
"inspectId": "xxx",
"checkResult": "OK",
"inStockCreated": "1",
"inStockBillNo": "CGRK110260624001"
}
}
```
```
NG 仅留痕【新增场景】
{
"result": "true",
"message": "来料检不合格,已保存检验记录,未生成采购入库单",
"data": {
"inspectId": "xxx",
"checkResult": "NG",
"inStockCreated": "0",
"inStockBillNo": ""
}
}
```
```
失败
{
"result": "false",
"message": "请选择来料检结果(OK/NG)"
}
```
##### 返回 data 字段
|字段|说明|变更|
|:----|-----|-----|
|inspectId|MES 来料检记录 id|**【新增】**|
|checkResult|OK / NG|**【新增】**|
|inStockCreated|`1` 已生成入库单 / `0` 未生成|**【新增】**|
|inStockBillNo|CGRK 单号;未生成时为空|原有|
---
### 来料检记录列表【新增·整节】
##### 请求URL
- ` /js/a/mes/mesErpInStockInspect/pda/listData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|pageNo|否|int|页码|
|pageSize|否|int|每页条数|
|poBillNo|否|string|采购订单号|
|checkResult|否|string|OK / NG|
|inStockBillNo|否|string|入库单号|
|inspectorName|否|string|检验员|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/mesErpInStockInspect/pda/listData?pageNo=1&pageSize=20&checkResult=NG'
```
##### 说明
- **【新增】** 整接口:查 MES 检验留痕(含 NG);与「采购入库历史」查金蝶 CGRK 不同。
- PC 菜单:生产管理 → ERP来料检记录(需执行 `db/mysql/add_mes_erp_in_stock_inspect.sql`)
> 若仍报仓位维度为空,请确认 MES 已部署最新后端(`FStockLocId` 须为 ERP 仓位内码整数)。`stockLocKey` 传错或不传均不影响,关键是 `stockNumber` + `stockLocNumber` 正确。
> **ERP 下推日志**:每次提交(成功/失败)均写入「生产管理 → ERP下推日志」。失败时 `result_message` / `response_summary` 含金蝶报错;`request_summary` 含仓库、仓位、entryIds。需先执行 `db/mysql/add_mes_erp_interaction_log.sql` 并重启 MES。
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|保存结果说明;成功时含 ERP 入库单号|
|data.inStockBillNo|string|成功时返回,ERP 采购入库单号(CGRK 开头)|
---
### 采购入库历史列表
##### 请求URL
- ` /js/a/mes/erpInStock/pda/listData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|pageNo|否|int|页码|
|pageSize|否|int|每页条数|
|poOrderNoQuery|否|string|采购订单号|
|billNoQuery|否|string|入库单号 CGRK|
|materialNumberQuery|否|string|物料编码模糊|
|documentStatusQuery|否|string|C=已审核|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/pda/listData?pageNo=1&pageSize=20'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"billNo": "CGRK110260624001",
"date": "2026-06-24",
"poOrderNo": "CGDD110260602003",
"materialNumber": "3.01.001",
"realQty": 800,
"lotNumber": "LOT202606001"
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo / pageSize / count|—|分页字段,见「data 分页结构」|
|data.list[].billNo|string|采购入库单号(CGRK)|
|data.list[].date|string|入库日期|
|data.list[].poOrderNo|string|来源采购订单号|
|data.list[].materialNumber|string|物料编码|
|data.list[].realQty|number|实收数量|
|data.list[].lotNumber|string|批号|
---
### 查看入库单明细
##### 请求URL
- ` /js/a/mes/erpInStock/pda/detailData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|billNo|是|string|采购入库单号 CGRK|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/pda/detailData?billNo=CGRK110260624001'
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|data.list[].seq|string|行号|
|data.list[].materialNumber|string|物料编码|
|data.list[].realQty|number|实收数量|
|data.list[].lotNumber|string|批号|
|data.list[].stockName|string|仓库名称|
---
## 二、生产入库
### 生产入库单列表
##### 请求URL
- ` /js/a/mes/erpPrdInStock/pda/listData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|pageNo|否|int|页码|
|pageSize|否|int|每页条数|
|billNoQuery|否|string|入库单号 SCRK|
|moBillNoQuery|否|string|生产订单号|
|materialNumberQuery|否|string|物料编码模糊|
|documentStatusQuery|否|string|C=已审核|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPrdInStock/pda/listData?pageNo=1&pageSize=20'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"billNo": "SCRK110260605001",
"moBillNo": "SCDD110260605001",
"materialNumber": "8.10.HEV.10.047696",
"realQty": 150,
"lotNumber": "110260605001"
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo / pageSize / count|—|分页字段,见「data 分页结构」|
|data.list[].billNo|string|生产入库单号(SCRK)|
|data.list[].moBillNo|string|来源生产订单号|
|data.list[].materialNumber|string|物料编码(.10 半成品)|
|data.list[].realQty|number|入库数量|
|data.list[].lotNumber|string|ERP 批号|
---
### 选择生产订单
##### 请求URL
- ` /js/a/mes/erpPrdInStock/pda/selectOrderData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|pageNo|否|int|页码|
|pageSize|否|int|每页条数|
|billNo|否|string|生产订单号|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPrdInStock/pda/selectOrderData?pageNo=1&pageSize=20'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 10,
"list": [
{
"billNo": "SCDD110260605001",
"date": "2026-06-01",
"documentStatusName": "已审核",
"inventoryCategory": "HEV",
"entryCount": 1,
"totalQty": 1500
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo / pageSize / count|—|分页字段,见「data 分页结构」|
|data.list[].billNo|string|生产订单号|
|data.list[].date|string|单据日期|
|data.list[].documentStatusName|string|单据状态名称|
|data.list[].inventoryCategory|string|存货类别(HEV / 115 等)|
|data.list[].entryCount|int|订单分录行数|
|data.list[].totalQty|number|订单合计数量|
---
### 选择订单分录
##### 请求URL
- ` /js/a/mes/erpPrdInStock/pda/selectDetailData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|billNo|是|string|生产订单号|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPrdInStock/pda/selectDetailData?billNo=SCDD110260605001'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"entryId": "266500",
"seq": "1",
"materialNumber": "8.10.HEV.10.047696",
"materialName": "下壳体",
"qty": 1500,
"instockQty": 264,
"remainQty": 1236,
"unitName": "件"
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo / pageSize / count|—|分页字段,见「data 分页结构」|
|data.list[].entryId|string|生产订单分录内码(formInit、submit 用)|
|data.list[].seq|string|行号|
|data.list[].materialNumber|string|物料编码(.10 半成品)|
|data.list[].materialName|string|物料名称|
|data.list[].qty|number|订单数量|
|data.list[].instockQty|number|已入库数量|
|data.list[].remainQty|number|剩余可入数量|
|data.list[].unitName|string|计量单位|
---
### 选批次入库页初始化
##### 请求URL
- ` /js/a/mes/erpPrdInStock/formInit `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|moBillNo|是|string|生产订单号|
|entryId|是|string|订单分录内码|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPrdInStock/formInit?moBillNo=SCDD110260605001&entryId=266500'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "",
"data": {
"moBillNo": "SCDD110260605001",
"entryId": "266500",
"moEntry": {
"qty": 1500,
"instockQty": 264,
"remainQty": 1236
},
"batchList": [
{
"id": "batch-id-001",
"batchSn": "20260527133003",
"lineSn": "HEVXT",
"nums": 50
}
],
"defaultStockNumber": "1100105",
"stockList": [
{ "stockNumber": "1100105", "stockName": "五金库" }
]
}
}
```
```
失败(无待入库批次)
{
"result": "true",
"message": "暂无待入库 MES 批次码。须产线 [HEVXT]、nums>0、且未入库",
"data": {
"moBillNo": "SCDD110260605001",
"entryId": "266500",
"moEntry": { "qty": 1500, "instockQty": 264, "remainQty": 1236 },
"batchList": [],
"stockList": [],
"defaultStockNumber": "1100105"
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息;无待入库批次时说明原因|
|data.moBillNo|string|生产订单号|
|data.entryId|string|订单分录内码|
|data.moEntry.qty|number|订单数量|
|data.moEntry.instockQty|number|已入库数量|
|data.moEntry.remainQty|number|剩余可入数量|
|data.batchList[]|array|待入库 MES 批次码,字段见「MES 批次码 batch」|
|data.defaultStockNumber|string|推荐默认入库仓库编码|
|data.stockList[]|array|可用仓库列表|
---
### 扫 MES 批次码校验
##### 请求URL
- ` /js/a/mes/erpPrdInStock/batchScan `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|batchSn|是|string|MES 托盘批次码|
|materialNumber|是|string|当前订单分录物料编码|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPrdInStock/batchScan?batchSn=20260527133003&materialNumber=8.10.HEV.10.047696'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "可以入库",
"data": {
"batch": {
"id": "batch-id-001",
"batchSn": "20260527133003",
"lineSn": "HEVXT",
"nums": 50
}
}
}
```
```
失败
{
"result": "false",
"message": "批次码产线 115XT 与当前物料 8.10.HEV.10.047696 不匹配,不能入库",
"data": {
"batch": {
"id": "batch-id-001",
"batchSn": "20260527133003",
"lineSn": "115XT",
"nums": 50
}
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|校验结果说明(如「可以入库」或失败原因)|
|data.batch|object|MES 批次码信息,字段见「MES 批次码 batch」|
---
### 仓位选项
##### 请求URL
- ` /js/a/mes/erpPrdInStock/pda/stockLocOptions `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|stockNumber|是|string|仓库编码|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPrdInStock/pda/stockLocOptions?stockNumber=1100105'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"required": true,
"defaultLocNumber": "A",
"locKey": "F100004",
"locHint": "共 278 个仓位,数据来自 ERP 仓位值集",
"locations": [
{ "locNumber": "A", "locName": "A", "locKey": "F100004", "displayLabel": "A A" }
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.required|boolean|是否必须选择仓位|
|data.defaultLocNumber|string|推荐默认仓位编码|
|data.locHint|string|仓位加载提示|
|data.locKey|string|仓位维度键(展示用;提交可不回传)|
|data.locations[]|array|仓位列表,字段见「仓位选项 locations[]」|
---
### 仓库列表
##### 请求URL
- ` /js/a/mes/erpPrdInStock/stockList `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|无|—|—|—|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPrdInStock/stockList'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"defaultStockNumber": "1100105",
"stockHint": "共 5 个可用仓库",
"stockList": [
{ "stockNumber": "1100105", "stockName": "五金库" }
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.defaultStockNumber|string|推荐默认入库仓库编码|
|data.stockHint|string|仓库加载提示|
|data.stockList[]|array|可用仓库列表|
---
### 提交生产入库
##### 请求URL
- ` /js/a/mes/erpPrdInStock/submit `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|moBillNo|是|string|生产订单号|
|entryId|是|string|订单分录内码|
|batchIds|是|array / string|mes_batch_sn.id 列表;表单方式传 JSON 数组字符串或逗号分隔|
|stockNumber|是|string|入库仓库编码|
|stockLocNumber|条件|string|仓库启用仓位时必填|
|stockLocKey|否|string|仓位维度键,可选|
**Content-Type(二选一):** `application/x-www-form-urlencoded`(PDA 推荐)或 `application/json;charset=UTF-8`
##### 参数示例
```
# PDA 表单
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPrdInStock/submit' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'moBillNo=SCDD110260605001' \
--data-urlencode 'entryId=266500' \
--data-urlencode 'batchIds=["batch-id-001"]' \
--data-urlencode 'stockNumber=1100105' \
--data-urlencode 'stockLocNumber=A22'
# JSON Body
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPrdInStock/submit' \
--header 'Content-Type: application/json;charset=UTF-8' \
--data '{"moBillNo":"SCDD110260605001","entryId":"266500","batchIds":["batch-id-001"],"stockNumber":"1100105","stockLocNumber":"A22"}'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "生产入库单保存成功,单号:SCRK110260605002;合计数量 100,绑定批次 1 个",
"data": {
"billNo": "SCRK110260605002",
"totalQty": 100,
"batchCount": 1,
"lotNumber": "110260605002"
}
}
```
```
失败
{
"result": "false",
"message": "请至少选择一个 MES 批次码"
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|保存结果说明|
|data.billNo|string|成功时返回,ERP 生产入库单号(SCRK)|
|data.totalQty|number|本次合计入库数量(所选批次 nums 之和)|
|data.batchCount|int|绑定的 MES 批次码个数|
|data.lotNumber|string|ERP 生成的批号(若有)|
---
### 查看生产入库单明细
##### 请求URL
- ` /js/a/mes/erpPrdInStock/pda/detailData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|billNo|是|string|生产入库单号 SCRK|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPrdInStock/pda/detailData?billNo=SCRK110260605002'
```
---
## 三、生产领料
### 领料单列表
##### 请求URL
- ` /js/a/mes/erpPickMaterialBill/pda/listData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|pageNo|否|int|页码|
|pageSize|否|int|每页条数|
|moBillNoQuery|否|string|生产订单号|
|billNoQuery|否|string|领料单号 SCLL|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPickMaterialBill/pda/listData?pageNo=1&pageSize=20'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"billNo": "SCLL110260603001",
"moBillNo": "SCDD110260603003",
"materialNumber": "3.02.xxx",
"actualQty": 100
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo / pageSize / count|—|分页字段,见「data 分页结构」|
|data.list[].billNo|string|生产领料单号(SCLL)|
|data.list[].moBillNo|string|来源生产订单号|
|data.list[].materialNumber|string|子项物料编码|
|data.list[].actualQty|number|实发数量|
---
### 选择生产订单
##### 请求URL
- ` /js/a/mes/erpPickMaterialBill/pda/selectOrderData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|pageNo|否|int|页码|
|pageSize|否|int|每页条数|
|billNo|否|string|生产订单号|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPickMaterialBill/pda/selectOrderData?pageNo=1&pageSize=20'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 5,
"list": [
{
"billNo": "SCDD110260603003",
"documentStatusName": "已审核",
"inventoryCategory": "HEV",
"entryCount": 1,
"totalQty": 1200
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo / pageSize / count|—|分页字段,见「data 分页结构」|
|data.list[].billNo|string|生产订单号|
|data.list[].documentStatusName|string|单据状态名称|
|data.list[].inventoryCategory|string|存货类别|
|data.list[].entryCount|int|订单分录行数|
|data.list[].totalQty|number|订单合计数量|
---
### 选择订单分录
##### 请求URL
- ` /js/a/mes/erpPickMaterialBill/pda/selectDetailData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|billNo|是|string|生产订单号|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPickMaterialBill/pda/selectDetailData?billNo=SCDD110260603003'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"entryId": "266268",
"seq": "1",
"materialNumber": "8.10.HEV.05.049025",
"qty": 1200,
"workshopName": "冲压壳体线"
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo / pageSize / count|—|分页字段,见「data 分页结构」|
|data.list[].entryId|string|生产订单分录内码(materialInit、submit 用)|
|data.list[].seq|string|行号|
|data.list[].materialNumber|string|成品物料编码(.05)|
|data.list[].qty|number|订单数量|
|data.list[].workshopName|string|生产车间名称|
---
### 领料页初始化(用料清单)
##### 请求URL
- ` /js/a/mes/erpPickMaterialBill/materialInit `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|billNo|是|string|生产订单号|
|entryId|是|string|订单分录内码|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPickMaterialBill/materialInit?billNo=SCDD110260603003&entryId=266268'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "",
"data": {
"billNo": "SCDD110260603003",
"entryId": "266268",
"materialName": "成品",
"moEntry": {
"seq": "1",
"materialNumber": "8.10.HEV.05.049025",
"materialName": "成品",
"qty": 1200
},
"materialList": [
{
"id": "250403",
"ppbomNo": "PPBOM00150358",
"materialNumber": "8.10.HEV.04.01001047696",
"materialName": "内胆",
"mustQty": 100,
"pickedQty": 20,
"canPickQty": 80,
"stockNumber": "1100101",
"batchManage": true,
"pickStatusLabel": "可领料"
},
{
"id": "250404",
"ppbomNo": "PPBOM00150358",
"materialNumber": "8.10.HEV.04.02001047696-2",
"materialName": "横梁-2",
"mustQty": 120,
"pickedQty": 0,
"canPickQty": 120,
"stockNumber": "1100101",
"batchManage": true,
"pickStatusLabel": "可领料"
}
]
}
}
```
```
失败
{
"result": "false",
"message": "未找到生产订单分录",
"data": null
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息;用料清单为空时可能有说明|
|data.billNo|string|生产订单号|
|data.entryId|string|订单分录内码|
|data.materialName|string|订单分录**成品**物料名称(页头展示用,与 moEntry 一致)|
|data.moEntry.seq|string|订单分录行号|
|data.moEntry.materialNumber|string|成品物料编码|
|data.moEntry.materialName|string|成品物料名称|
|data.moEntry.qty|number|订单数量|
|data.materialList[].id|string|用料清单分录 id(提交 lines[].ppbomEntryId 用)|
|data.materialList[].ppbomNo|string|生产用料清单号|
|data.materialList[].materialNumber|string|**子项**物料编码|
|data.materialList[].materialName|string|**子项**物料名称(如「内胆」「横梁-2」,PDA 列表必用)|
|data.materialList[].mustQty|number|应发数量|
|data.materialList[].pickedQty|number|已领数量|
|data.materialList[].canPickQty|number|可领数量(领料数不得超过此值)|
|data.materialList[].stockNumber|string|默认发料仓库编码|
|data.materialList[].batchManage|boolean|是否批号管理(true 时须选批号)|
|data.materialList[].pickStatusLabel|string|领料状态展示(如可领料)|
---
### 批号库存选项
##### 请求URL
- ` /js/a/mes/erpPickMaterialBill/pda/lotOptions `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|materialNumber|是|string|子项物料编码|
|stockNumber|否|string|发料仓库|
|stockStatusNumber|否|string|库存状态|
|stockOrgNumber|否|string|库存组织,默认 110|
|pickQty|否|number|本次领料数量|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPickMaterialBill/pda/lotOptions?materialNumber=3.02.xxx&stockNumber=1100101&pickQty=50'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"lots": [
{ "lotNumber": "LOT001", "qtyText": "200" }
],
"suggestedLotNumber": "LOT001",
"lotPickable": true,
"lotHint": "共 3 条可用批号"
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.lots[]|array|可用批号库存列表,字段见「批号选项 lots[]」|
|data.suggestedLotNumber|string|推荐批号|
|data.lotPickable|boolean|是否存在可领批号库存|
|data.lotHint|string|批号/库存提示(无库存时为诊断说明)|
---
### 批号搜索
##### 请求URL
- ` /js/a/mes/erpPickMaterialBill/pda/lotSearch `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|materialNumber|是|string|子项物料编码|
|stockNumber|否|string|发料仓库|
|stockStatusNumber|否|string|库存状态|
|stockOrgNumber|否|string|库存组织|
|lotKeyword|否|string|批号关键字|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPickMaterialBill/pda/lotSearch?materialNumber=3.02.xxx&stockNumber=1100101&lotKeyword=LOT'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"lots": [
{ "lotNumber": "LOT001", "qtyText": "200" }
],
"lotHint": "共查到 1 条"
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.lots[]|array|匹配的批号库存列表|
|data.lotHint|string|查询结果提示|
---
### 提交领料
##### 请求URL
- ` /js/a/mes/erpPickMaterialBill/submitPickMaterial `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|billNo|是|string|生产订单号|
|entryId|是|string|订单分录内码|
|lines|是|array / string|领料明细;表单方式时 `lines` 为 URL 编码后的 JSON 字符串|
|lines[].ppbomEntryId|是|string|用料清单分录 id|
|lines[].pickQty|是|number|领料数量|
|lines[].lotNumber|条件|string|批号管理物料必填|
**Content-Type(二选一):** `application/x-www-form-urlencoded`(PDA 推荐)或 `application/json;charset=UTF-8`
##### 参数示例
```
# PDA 表单
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPickMaterialBill/submitPickMaterial' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'billNo=SCDD110260603003' \
--data-urlencode 'entryId=266268' \
--data-urlencode 'lines=[{"ppbomEntryId":"250403","pickQty":50,"lotNumber":"LOT001"}]'
# JSON Body
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPickMaterialBill/submitPickMaterial' \
--header 'Content-Type: application/json;charset=UTF-8' \
--data '{"billNo":"SCDD110260603003","entryId":"266268","lines":[{"ppbomEntryId":"250403","pickQty":50,"lotNumber":"LOT001"}]}'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "领料单保存成功,单号:SCLL110260603010",
"data": {
"pickBillNo": "SCLL110260603010",
"syncedKcCount": 1,
"syncedMaterialCount": 0,
"kcSyncFailed": false
}
}
```
```
失败
{
"result": "false",
"message": "领料数量不能超过可领数量"
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|保存结果说明|
|data.pickBillNo|string|成功时返回,ERP 领料单号(SCLL)|
|data.syncedKcCount|int|同步到 MES 库存的行数|
|data.syncedMaterialCount|int|新增 MES 物料档案数|
|data.kcSyncFailed|boolean|领料单已保存但 MES 库存同步是否失败|
---
### 查看领料单明细
##### 请求URL
- ` /js/a/mes/erpPickMaterialBill/pda/detailData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|billNo|是|string|领料单号 SCLL|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpPickMaterialBill/pda/detailData?billNo=SCLL110260603010'
```
---
## 四、直接调拨
> 与 PC「增加直接调拨单」一致:**不关联生产订单**。点新增调用 `formInit` 直接进入填单页;选物料和调出仓库后调 `pda/lotOptions` 选批号;调拨数量通过 `batchScan` 扫批次码累加,须已发货检合格;提交传 `traySns`(托盘码逗号拼接),成功后托盘改为已发货并绑定调拨单号。
> 详细说明见 [PDA直接调拨接口说明.md](./PDA直接调拨接口说明.md)。
### 调拨单列表
##### 请求URL
- ` /js/a/mes/erpTransferDirect/pda/listData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|pageNo|否|int|页码|
|pageSize|否|int|每页条数|
|billNoQuery|否|string|调拨单号|
|moBillNoQuery|否|string|生产订单号|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/pda/listData?pageNo=1&pageSize=20'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"billNo": "ZJDB110260605001",
"moBillNo": "SCDD110260605001",
"materialNumber": "8.10.HEV.10.047696",
"lotNumber": "110260605001",
"realQty": 100
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo / pageSize / count|—|分页字段,见「data 分页结构」|
|data.list[].billNo|string|直接调拨单号(ZJDB)|
|data.list[].moBillNo|string|来源生产订单号|
|data.list[].materialNumber|string|物料编码(.10 半成品)|
|data.list[].lotNumber|string|批号|
|data.list[].realQty|number|调拨数量|
---
### 选择生产订单(兼容旧版,新增流程不再调用)
##### 请求URL
- ` /js/a/mes/erpTransferDirect/pda/selectOrderData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|pageNo|否|int|页码|
|pageSize|否|int|每页条数|
|billNo|否|string|生产订单号|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/pda/selectOrderData?pageNo=1&pageSize=20'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 10,
"list": [
{
"billNo": "SCDD110260605001",
"date": "2026-06-01",
"inventoryCategory": "HEV",
"entryCount": 1,
"totalQty": 1500
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo / pageSize / count|—|分页字段,见「data 分页结构」|
|data.list[].billNo|string|生产订单号(仅 HEV/115 物料 .10)|
|data.list[].date|string|单据日期|
|data.list[].inventoryCategory|string|存货类别|
|data.list[].entryCount|int|订单分录行数|
|data.list[].totalQty|number|订单合计数量|
---
### 调拨页初始化
##### 请求URL
- ` /js/a/mes/erpTransferDirect/formInit `
##### 请求方式
- POST(也兼容 GET)
##### 参数
无(不再传 `moBillNo`,点新增直接进入填单页)
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/formInit'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"transferCategory": "3",
"transferCategoryName": "外发调拨",
"scanHint": "调拨数量通过扫描批次码累加,扫码前须已完成发货检",
"materialList": [
{
"materialNumber": "8.10.HEV.10.047696",
"materialName": "HEV",
"displayLabel": "8.10.HEV.10.047696(HEV)",
"defaultUnitNumber": "Pcs",
"units": [
{ "unitNumber": "Pcs", "unitName": "个" }
]
}
],
"defaultSrcStockNumber": "1100105",
"defaultDestStockNumber": "",
"stockList": [
{ "stockNumber": "1100105", "stockName": "五金库" }
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.transferCategoryName|string|固定「外发调拨」|
|data.materialList[]|array|HEV / 115 可调拨物料(含单位)|
|data.defaultSrcStockNumber|string|推荐默认调出仓库编码|
|data.defaultDestStockNumber|string|推荐默认调入仓库编码(配置项)|
|data.stockList[]|array|可用仓库列表|
|data.scanHint|string|扫码累加数量说明|
---
### 选批号(选物料和调出仓库后调用)
##### 请求URL
- ` /js/a/mes/erpTransferDirect/pda/lotOptions `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|materialNumber|是|string|物料编码|
|stockNumber|是|string|调出仓库编码|
|stockName|否|string|仓库名称,仅提示用|
|lotKeyword|否|string|批号关键字,传入则搜索|
|pickQty|否|number|计划数量,用于推荐批号|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/pda/lotOptions?materialNumber=8.10.HEV.10.047696&stockNumber=1100105'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"materialNumber": "8.10.HEV.10.047696",
"stockNumber": "1100105",
"lots": [
{ "lotNumber": "110260605001", "qty": 100, "qtyText": "100" }
],
"suggestedLotNumber": "110260605001",
"lotPickable": true,
"lotHint": "共 1 条可用批号"
}
}
```
PDA:选中 `lots[].lotNumber` 作为提交 `lotNumber`。切换物料或调出仓后须重调。
---
### 扫批次码(累加数量 + 发货检校验)
##### 请求URL
- ` /js/a/mes/erpTransferDirect/batchScan `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|batchSn|是|string|批次码(扫码值)|
|materialNumber|否|string|当前已选物料;传入时须与批次产线物料一致|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/batchScan?batchSn=20260804084909&materialNumber=8.10.HEV.10.047696'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "扫码成功,可累加数量 2",
"data": {
"batchSn": "20260804084909",
"nums": 2,
"qtyIncrement": 2,
"materialNumber": "8.10.HEV.10.047696",
"lotNumber": "110260605001",
"batchStatus": "1",
"inspected": true
}
}
```
PDA:`qty = qty + data.qtyIncrement`。须 `batchStatus=1`(已发货检合格)才允许累加。
---
### 生产入库源行列表(兼容旧版,新增流程不再调用)
##### 请求URL
- ` /js/a/mes/erpTransferDirect/pda/instockSourceData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|moBillNo|是|string|生产订单号|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/pda/instockSourceData?moBillNo=SCDD110260605001'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"billNo": "SCRK110260605001",
"entryId": "12345",
"lotNumber": "110260605001",
"realQty": 150
}
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.pageNo / pageSize / count|—|分页字段,见「data 分页结构」|
|data.list[].billNo|string|生产入库单号(SCRK)|
|data.list[].entryId|string|生产入库分录内码|
|data.list[].lotNumber|string|批号|
|data.list[].realQty|number|入库数量|
---
### 仓位选项
##### 请求URL
- ` /js/a/mes/erpTransferDirect/pda/stockLocOptions `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|stockNumber|是|string|仓库编码(调出仓、调入仓各调一次)|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/pda/stockLocOptions?stockNumber=1100105'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"required": true,
"defaultLocNumber": "A",
"locKey": "F100004",
"locHint": "共 278 个仓位,数据来自 ERP 仓位值集",
"locations": [
{ "locNumber": "A", "locName": "A", "locKey": "F100004", "displayLabel": "A A" }
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.required|boolean|是否必须选择仓位|
|data.defaultLocNumber|string|推荐默认仓位编码|
|data.locHint|string|仓位加载提示|
|data.locKey|string|仓位维度键(展示用;提交可不回传)|
|data.locations[]|array|仓位列表,字段见「仓位选项 locations[]」|
---
### 仓库列表
##### 请求URL
- ` /js/a/mes/erpTransferDirect/stockList `
##### 请求方式
- POST(也兼容 GET)
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|无|—|—|—|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/stockList'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "成功",
"data": {
"defaultStockNumber": "1100105",
"defaultDestStockNumber": "",
"stockHint": "共 5 个可用仓库",
"stockList": [
{ "stockNumber": "1100105", "stockName": "五金库" }
]
}
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|提示信息|
|data.defaultStockNumber|string|推荐默认调出仓库编码|
|data.defaultDestStockNumber|string|推荐默认调入仓库编码(配置项)|
|data.stockHint|string|仓库加载提示|
|data.stockList[]|array|可用仓库列表|
---
### 提交调拨
##### 请求URL
- ` /js/a/mes/erpTransferDirect/submit `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|materialNumber|是|string|物料编码(HEV / 115)|
|lotNumber|是|string|ERP 批号|
|qty|是|number|调拨数量(扫码 qtyIncrement 合计)|
|unitNumber|否|string|计量单位;不传则取物料默认单位|
|srcStockNumber|是|string|调出仓库|
|srcStockLocNumber|条件|string|调出仓库启用仓位时必填|
|srcStockLocKey|否|string|调出仓位维度键,可选|
|destStockNumber|是|string|调入仓库|
|destStockLocNumber|条件|string|调入仓库启用仓位时必填|
|destStockLocKey|否|string|调入仓位维度键,可选|
|traySns|是|string|托盘码逗号拼接,如 `20260804084909,20260804085001`。成功后改为已发货并绑定调拨单号|
|batchSns|否|string / array|兼容旧参数,与 traySns 合并去重|
不再传 `moBillNo` / `instockBillNo` / `instockEntryId`。
**Content-Type(二选一):** `application/x-www-form-urlencoded`(PDA 推荐)或 `application/json;charset=UTF-8`
##### 参数示例
```
# PDA 表单
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/submit' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'materialNumber=8.10.HEV.10.047696' \
--data-urlencode 'lotNumber=110260605001' \
--data-urlencode 'qty=2' \
--data-urlencode 'srcStockNumber=1100105' \
--data-urlencode 'srcStockLocNumber=A' \
--data-urlencode 'destStockNumber=1100217' \
--data-urlencode 'traySns=20260804084909,20260804085001'
# JSON Body
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/submit' \
--header 'Content-Type: application/json;charset=UTF-8' \
--data '{"materialNumber":"8.10.HEV.10.047696","lotNumber":"110260605001","qty":2,"srcStockNumber":"1100105","srcStockLocNumber":"A","destStockNumber":"1100217","traySns":"20260804084909,20260804085001"}'
```
##### 返回示例
```
成功
{
"result": "true",
"message": "直接调拨单保存成功,单号:ZJDB110260605001",
"data": {
"billNo": "ZJDB110260605001"
}
}
```
```
失败
{
"result": "false",
"message": "批次码 20260804084909 尚未发货检,不能调拨"
}
```
##### 返回字段说明
|字段路径|类型|中文说明|
|:----|:-----|-----|
|result|string|业务成功 `"true"` / 失败 `"false"`|
|message|string|保存结果说明|
|data.billNo|string|成功时返回,ERP 直接调拨单号(ZJDB)|
---
### 查看调拨单明细
##### 请求URL
- ` /js/a/mes/erpTransferDirect/pda/detailData `
##### 请求方式
- POST
##### 参数
|参数名|必选|类型|说明|
|:----|:---|:-----|-----|
|billNo|是|string|直接调拨单号 ZJDB|
##### 参数示例
```
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/pda/detailData?billNo=ZJDB110260605001'
```