模块:
ErpInStockController(提交)、MesErpInStockInspectController(查检验记录)
权限:mes:erpInStock:view(登录 MES 即可,不要直连金蝶 ERP)
服务地址示例:http://127.0.0.1:8980
下文凡标注 【新增】 的字段/接口,均为「固定检查项 + OK/NG 留痕」改造新增;未标注的为原有能力。
| 类型 | 内容 | 说明 |
|---|---|---|
| 【新增】必填参数 | submitInStock.checkResult |
OK / NG;不传会失败 |
| 【新增】可选参数 | inspectorName / inspectorCode / inspectTime / remarks / channel |
检验员、时间、备注、渠道 |
| 【新增】返回字段 | data.inspectId / checkResult / inStockCreated |
提交后带回检验记录信息 |
| 【新增】业务规则 | 仅 OK 生成采购入库单;NG 只保存检验记录 |
原流程等价于默认一直 OK 入库 |
| 【新增】初始化字段 | inspectInit 返回检验员/时间/结果选项 |
便于 PDA 预填 |
| 【新增】接口 | mesErpInStockInspect/pda/listData |
查询来料检记录列表 |
| 【新增】PC 菜单 | 生产管理 → ERP来料检记录 | 需执行 db/mysql/add_mes_erp_in_stock_inspect.sql |
PDA 适配要点:
checkResult=OK 或 NGOK 时仍须传仓库(及仓位,若 required)NG 时可不传仓库,接口仍返回 result=true,但 inStockCreated=0data.inStockCreated 判断是否生成了 CGRK 入库单① pda/listData(可选) 采购入库历史
↓ 新增
② pda/selectOrderData 采购订单列表
↓ 点选 billNo
③ pda/selectDetailData 待入分录,勾选 entryId
↓ billNo + entryIds
④ inspectInit 来料检页(仓库/数量/批号 + 【新增】固定检查项)
└ pda/stockLocOptions 选仓库后查仓位(required=true 必选)
└ pda/lotSearch 搜批号(可选)
↓
⑤ submitInStock 提交来料检【新增 checkResult】
├ checkResult=OK → 保存检验记录 + 生成采购入库单(CGRK)
└ checkResult=NG → 仅保存检验记录,不生成入库单
↓(可选)
⑥ mesErpInStockInspect/pda/listData 【新增】查来料检记录
PDA 统一返回
CommonResp(result/message/data);列表类接口data为分页结构。提交接口支持 表单 POST 与 JSON Body 两种方式。固定检查项(【新增】): 检验员、检验时间、OK/NG、数量、批号、备注。其中
checkResult必填。
请求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'
带订单号搜索:
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/pda/selectOrderData?pageNo=1&pageSize=20&documentStatusQuery=C&billNo=CGDD110260602003'
返回示例:
成功:
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"billNo": "CGDD110260602003",
"date": "2026-06-02",
"documentStatus": "C",
"documentStatusName": "已审核",
"supplierNumber": "VEN001",
"supplierName": "某某供应商",
"purchaseOrgName": "安徽裕洋",
"entryCount": 3,
"totalQty": 1500
}
]
}
}
页面显示: billNo、date、supplierName、documentStatusName、entryCount
下一步: 用户点击某行 → 进入接口 2,传入 billNo
请求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": "某原材料",
"unitName": "千克",
"qty": 1000,
"instockQty": 200,
"remainQty": 800,
"deliveryDate": "2026-06-15"
}
]
}
}
成功(已全部入库,list 为空):
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 0,
"list": []
}
}
页面显示: seq、materialNumber、materialName、qty(订单量)、instockQty(已入)、remainQty(剩余可入)、unitName
下一步: 勾选 1~N 行 → 收集 entryId,逗号拼接 → 进入接口 3
请求URL: /js/a/mes/erpInStock/inspectInit
请求方式: GET 或 POST(PDA 常用 POST + form 表单参数)
参数:
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| billNo | 是 | string | 采购订单号 |
| entryIds | 是 | string / array | 分录内码;多条逗号分隔,或 JSON 数组;仅一条时也传此字段 |
参数示例:
# 多条
curl --location --request GET 'http://127.0.0.1:8980/js/a/mes/erpInStock/inspectInit?billNo=CGDD110260602003&entryIds=123456,123457'
# 单条
curl --location --request GET 'http://127.0.0.1:8980/js/a/mes/erpInStock/inspectInit?billNo=CGDD110260602003&entryIds=123456'
返回示例:
成功:
{
"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": "F100002",
"locHint": "共 278 个仓位,数据来自 ERP 仓位值集",
"locations": [
{ "locNumber": "A11", "locName": "A11区", "locKey": "F100002", "displayLabel": "A11 A11区" }
]
},
"lines": [
{
"entryId": "123456",
"seq": "1",
"materialNumber": "3.01.001",
"materialName": "某原材料",
"unitName": "千克",
"remainQty": 800,
"batchManage": true,
"suggestedLotNumber": "LOT202606001",
"lotHint": "共 3 条批号档案,已推荐第一条",
"availableLots": [
{ "lotNumber": "LOT202606001", "qtyText": "0" }
]
}
]
}
}
返回字段说明(inspectInit data):
| 字段 | 类型 | 说明 | 变更 |
|---|---|---|---|
| billNo | string | 采购订单号 | 原有 |
| defaultStockNumber | string | 默认仓库 | 原有 |
| stockList | array | 仓库列表 | 原有 |
| stockLoc | object | 默认仓库仓位 | 原有 |
| lines | array | 待检分录 | 原有 |
| inspectorCode | string | 默认检验员账号 | 【新增】 |
| inspectorName | string | 默认检验员姓名 | 【新增】 |
| inspectTime | string | 默认检验时间 yyyy-MM-dd HH:mm:ss |
【新增】 |
| checkResultOptions | array | 结果选项,固定 ["OK","NG"] |
【新增】 |
失败(分录已无剩余):
{
"result": "false",
"message": "所选分录已无剩余可入数量",
"billNo": "CGDD110260602003",
"lines": [],
"stockList": [],
"defaultStockNumber": "1100105"
}
页面显示:
data.billNoinspectorName,时间默认 inspectTime,结果选 OK/NGdata.stockList,默认 data.defaultStockNumber(选 OK 时必填)data.stockLoc(默认仓库);required=true 时必选仓位,切换仓库后调接口 4seq、materialNumber、materialName、remainQtyremainQty,可改小,不能超过 remainQtybatchManage=true 时必填,默认 suggestedLotNumber,可点搜批号(接口 6)或手工输入下一步: 用户选 OK/NG →(OK 时选仓库/仓位)→ 填数量/批号/备注 → 调接口 8 提交
请求URL: /js/a/mes/erpInStock/pda/stockLocOptions
请求方式: POST(也兼容 GET)
参数:
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| stockNumber | 是 | string | 仓库编码(来自 inspectInit 的 stockList) |
参数示例:
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": "共 12 个仓位,数据来自 ERP 仓位值集",
"locations": [
{
"locNumber": "A",
"locName": "A区",
"displayLabel": "A A区"
}
]
}
}
成功(不需选仓位):
{
"result": "true",
"message": "成功",
"data": {
"required": false,
"defaultLocNumber": "",
"locHint": "该仓库未启用仓位或未配置仓位值集",
"locations": []
}
}
页面显示: 仓位下拉/选择列表;required=true 时仓位为必填
下一步: 选完仓位 → 继续填写数量/批号 → 接口 7 提交
请求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 五金库"
}
]
}
}
请求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": "true",
"message": "成功",
"data": {
"lots": [],
"lotHint": "未查到符合条件的 ERP 批号档案,可手工录入新批号"
}
}
请求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 条批号档案,已推荐第一条"
}
}
破坏性变更: 旧版可不传检验结果、直接入库;现版 必须传
checkResult,否则返回失败。
请求URL: /js/a/mes/erpInStock/submitInStock
请求方式: POST
Content-Type(二选一):
| 方式 | Content-Type | 说明 |
|---|---|---|
| PDA 推荐 | application/x-www-form-urlencoded |
表单参数,lines 传 JSON 数组字符串 |
| 调试/脚本 | application/json;charset=UTF-8 |
整包 JSON Body |
参数:
| 参数名 | 必选 | 类型 | 说明 | 变更 |
|---|---|---|---|---|
| billNo | 是 | string | 采购订单号 | 原有 |
| checkResult | 是 | string | 检验结果:OK / NG(也可用 1/0、合格/不合格) |
【新增】必填 |
| inspectorName | 否 | string | 检验员姓名,默认当前登录用户 | 【新增】 |
| inspectorCode | 否 | string | 检验员账号,默认当前登录用户 | 【新增】 |
| inspectTime | 否 | string | 检验时间,默认当前时间;格式 yyyy-MM-dd HH:mm:ss |
【新增】 |
| remarks | 否 | string | 备注 | 【新增】 |
| channel | 否 | string | PC / PDA,建议 PDA 传 PDA |
【新增】 |
| stockNumber | 条件 | string | 入库仓库编码;checkResult=OK 时必填;NG 可不传 | 原有(规则收紧) |
| stockLocNumber | 条件 | string | 入库仓位;stockLoc.required=true 且 OK 时必填 |
原有 |
| stockLocKey | 条件 | string | 仓位维度键,与 locations[].locKey 一致 |
原有 |
| entryIds | 条件 | string / array | 分录内码;与 lines 二选一或组合 | 原有 |
| lines | 条件 | array / string | 明细 JSON 数组;表单方式时为 URL 编码后的 JSON 字符串 | 原有 |
| lines[].entryId | 条件 | string | 可与顶层 entryIds 按顺序对应 | 原有 |
| lines[].inspectQty | 条件 | number | 检验数量,缺省取 remainQty | 原有 |
| lines[].lotNumber | 条件 | string | 批号管理物料必填 | 原有 |
| lines[].materialName | 否 | string | 物料名称(展示用) | 原有 |
参数示例:
PDA 表单(OK 入库)【新增 checkResult 等】:
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 'inspectorName=张三' \
--data-urlencode 'remarks=外观正常' \
--data-urlencode 'channel=PDA' \
--data-urlencode 'stockNumber=1100101' \
--data-urlencode 'stockLocNumber=A11' \
--data-urlencode 'lines=[{"entryId":"194383","inspectQty":1.0,"lotNumber":"11020260603"},{"entryId":"194384","inspectQty":1.0,"lotNumber":"20250101"}]'
JSON Body(NG 仅留痕)【新增】:
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpInStock/submitInStock' \
--header 'Content-Type: application/json;charset=UTF-8' \
--data '{
"billNo": "CGDD110260602003",
"checkResult": "NG",
"inspectorName": "张三",
"remarks": "尺寸超差",
"channel": "PDA",
"entryIds": "123456",
"lines": [{"entryId":"123456","inspectQty":1.0,"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)"
}
失败(仓位等,会记入 ERP 下推日志;若已写入检验记录会带 inspectId):
{
"result": "false",
"message": "仓位维度【五金库货架仓位】不能为空",
"data": {
"inspectId": "xxx",
"checkResult": "OK",
"inStockCreated": "0"
}
}
返回 data 字段:
| 字段 | 类型 | 说明 | 变更 |
|---|---|---|---|
| inspectId | string | MES 来料检记录 id | 【新增】 |
| checkResult | string | OK / NG |
【新增】 |
| inStockCreated | string | 1 已生成入库单 / 0 未生成 |
【新增】 |
| inStockBillNo | string | 采购入库单号 CGRK…;未生成时为空 | 原有(仍保留) |
页面显示: 成功弹 message;用 data.inStockCreated 判断是否生成了入库单。
查记录: PC 菜单「ERP来料检记录」;PDA 用接口 10。
下一步: 完成;可返回订单列表、查检验记录(接口 10)或查入库历史(接口 9)
PDA 请用
pda/listData(CommonResp);PC 后台仍用listData(直接返回Page)。
请求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&poOrderNoQuery=CGDD110260602003'
返回示例:
成功:
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"billNo": "CGRK110260624001",
"date": "2026-06-24",
"documentStatusName": "已审核",
"poOrderNo": "CGDD110260602003",
"supplierName": "某某供应商",
"materialNumber": "3.01.001",
"materialName": "某原材料",
"realQty": 800,
"unitName": "千克",
"lotNumber": "LOT202606001",
"stockName": "五金库"
}
]
}
}
失败:
{
"result": "false",
"message": "查询失败原因",
"data": null
}
查询 MES 本地保存的来料检记录(含 OK/NG、检验员、时间、备注、是否已生成入库单)。
与接口 9「采购入库历史」不同:接口 9 查的是金蝶已生成的 CGRK;本接口查的是 MES 检验留痕(NG 也能查到)。
请求URL: /js/a/mes/mesErpInStockInspect/pda/listData
请求方式: POST
权限: mes:erpInStock:view(与来料检相同,便于 PDA 复用)
参数:
| 参数名 | 必选 | 类型 | 说明 | 变更 |
|---|---|---|---|---|
| pageNo | 否 | int | 页码,默认 1 | 【新增】接口 |
| pageSize | 否 | int | 每页条数 | 【新增】接口 |
| poBillNo | 否 | string | 采购订单号(模糊) | 【新增】接口 |
| checkResult | 否 | string | OK / NG |
【新增】接口 |
| inStockBillNo | 否 | string | 采购入库单号(模糊) | 【新增】接口 |
| inspectorName | 否 | string | 检验员(模糊) | 【新增】接口 |
| inspectTime_gte | 否 | datetime | 检验时间起 | 【新增】接口 |
| inspectTime_lte | 否 | datetime | 检验时间止 | 【新增】接口 |
参数示例:
curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/mesErpInStockInspect/pda/listData?pageNo=1&pageSize=20&checkResult=NG&poBillNo=CGDD110260602003'
返回示例:
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 1,
"list": [
{
"id": "xxx",
"poBillNo": "CGDD110260602003",
"checkResult": "NG",
"checkResultLabel": "不合格",
"inspectorName": "张三",
"inspectTime": "2026-09-11 13:35:00",
"remarks": "尺寸超差",
"lineCount": 1,
"totalQty": 1.0,
"inStockStatus": "NONE",
"inStockStatusLabel": "未入库",
"inStockBillNo": "",
"inStockMessage": "来料检不合格,未生成采购入库单",
"channel": "PDA"
}
]
}
}
list[] 主要字段:
| 字段 | 说明 | 变更 |
|---|---|---|
| id | 检验记录 id(= submit 返回的 inspectId) | 【新增】 |
| poBillNo | 采购订单号 | 【新增】 |
| checkResult | OK / NG | 【新增】 |
| inspectorName / inspectTime / remarks | 检验员、时间、备注 | 【新增】 |
| lineCount / totalQty | 行数、合计数量 | 【新增】 |
| inStockStatus | NONE 未入库 / SUCCESS 已入库 / FAIL 入库失败 |
【新增】 |
| inStockBillNo | 生成的 CGRK 单号 | 【新增】 |
| channel | PC / PDA | 【新增】 |
PC 详情页: /js/a/mes/mesErpInStockInspect/detail?id=xxx(含明细行:物料、数量、批号)
请求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'
返回示例:
成功:
{
"result": "true",
"message": "成功",
"data": {
"pageNo": 1,
"pageSize": 20,
"count": 2,
"list": [
{
"seq": "1",
"materialNumber": "3.01.001",
"materialName": "某原材料",
"realQty": 400,
"unitName": "千克",
"lotNumber": "LOT202606001",
"stockName": "五金库"
}
]
}
}
| 代码 | 含义 |
|---|---|
| A | 创建 |
| B | 审核中 |
| C | 已审核 |
| D | 重新审核 |
| message | 原因 |
|---|---|
| 请选择来料检结果(OK/NG) | 【新增】 未传或非法 checkResult |
| 所选分录已无剩余可入数量 | PO 行已入满,返回重新选单 |
| 检验数量不能超过剩余可入数量 | inspectQty 大于 remainQty |
| 启用批号管理,请从 ERP 选择或手工录入批号 | batchManage=true 但未传 lotNumber |
| 请选择入库仓库 | checkResult=OK 但未传 stockNumber |
| 所选仓库需要选择仓位 | 五金库等需仓位但未传 stockLocNumber |