# PDA 直接调拨 — 接口说明 > 模块:`ErpTransferDirectController`(`/mes/erpTransferDirect`) > 权限:`mes:erpTransferDirect:view` > 服务地址示例:`http://127.0.0.1:8980` > **只登录 MES,不直连金蝶**;请求须带会话(Cookie `jeesite.session.id` 或 `__sid` + `__ajax=json`)。 > PDA 统一返回 `CommonResp`(`result` / `message` / `data`)。 > 提交接口支持 **表单 POST** 与 **JSON Body** 两种方式。 > 与 PC「增加直接调拨单」一致:**不关联生产订单**。点新增直接进入填单页;调拨数量通过扫描批次码累加;扫码时校验是否已发货检合格。 --- ## 统一响应格式 | 字段 | 类型 | 说明 | |------|------|------| | result | string | `"true"` 业务成功 / `"false"` 业务失败 | | message | string | 提示信息。成功时可空或为「成功」;失败时为原因,PDA 直接展示 | | data | object / null | 业务数据。失败时也可能带部分字段(如扫码失败仍返回批次状态) | 列表类接口的 `data` 为分页结构: | 字段 | 类型 | 说明 | |------|------|------| | data.pageNo | int | 当前页码 | | data.pageSize | int | 每页条数 | | data.count | long | 总记录数(ERP 游标式分页,末页可能为估算值) | | data.list | array | 当前页数据行 | --- ## 页面流程 ```text ① pda/listData 调拨单列表(模块首页) ↓ 点「新增」(无需选生产订单) ② formInit 物料、单位、仓库列表、默认仓 ↓ 选调出仓库 / 调入仓库后 ③ erpStockPda/stockLocOptions 查该仓库仓位(调出、调入各调一次) 或 erpTransferDirect/pda/stockLocOptions ↓ 选物料 + 调出仓库后 ④ pda/lotOptions 查 ERP 即时库存可用批号 ↓ 扫批次码(可多次,累加数量) ⑤ batchScan 校验已发货检,qty += qtyIncrement ↓ 填完仓库仓位、批号后 ⑥ submit 提交;传 traySns(托盘码逗号拼接) ``` 仓库列表:`formInit` 已返回 `stockList`,一般不必再调。若要单独刷新仓库,用接口 3。 **发货检规则:** | 批次状态 `batchStatus` | 含义 | 可否扫码累加调拨数量 | |------------------------|------|----------------------| | `3` | 待装中(尚未生产入库) | 否 | | `0` | 仓库中(含发货检 NG) | 否 | | `1` | 合格(发货检 OK) | 是 | | `2` | 已发货 | 否 | --- ## 1. 调拨单列表 模块首页。点某行可看明细(接口 8);点「新增」调接口 2。 **请求URL:** `/js/a/mes/erpTransferDirect/pda/listData` **请求方式:** `POST` **参数:** | 参数名 | 必选 | 类型 | 说明 | |--------|------|------|------| | pageNo | 否 | int | 页码,默认 1 | | pageSize | 否 | int | 每页条数,默认 20 | | billNoQuery | 否 | string | 调拨单号模糊查询 | | materialNumberQuery | 否 | string | 物料编码。不传则 HEV+115;可传 `8.10.HEV.10.047696` 或 `8.35.115.10.5003146600021` | | documentStatusQuery | 否 | string | 单据状态:`A` 创建 / `B` 审核中 / `C` 已审核 / `D` 重新审核 | **参数示例:** ```bash curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/pda/listData?pageNo=1&pageSize=20' ``` **返回示例:** ```json { "result": "true", "message": "成功", "data": { "pageNo": 1, "pageSize": 20, "count": 1, "list": [ { "billNo": "ZJDB110260605001", "date": "2026-06-05", "documentStatus": "C", "documentStatusName": "已审核", "billTypeName": "直接调拨", "seq": "1", "materialNumber": "8.10.HEV.10.047696", "materialName": "下壳体", "qty": 100, "unitName": "个", "srcStockNumber": "1100105", "srcStockName": "五金库", "destStockNumber": "1100217", "destStockName": "成品仓", "lotNumber": "110260605001" } ] } } ``` **返回字段说明:** | 字段路径 | 类型 | 说明 | |----------|------|------| | result | string | `"true"` / `"false"` | | message | string | 提示信息 | | data.pageNo | int | 当前页码 | | data.pageSize | int | 每页条数 | | data.count | long | 总记录数(游标估算) | | data.list[] | array | 调拨明细分录(一行一条) | | data.list[].billNo | string | 直接调拨单号(ZJDB),点行看明细时回传 | | data.list[].date | string | 调拨日期,`yyyy-MM-dd` | | data.list[].documentStatus | string | 单据状态码:`A` 创建 / `B` 审核中 / `C` 已审核 / `D` 重新审核 | | data.list[].documentStatusName | string | 单据状态中文 | | data.list[].billTypeNumber | string | 单据类型编码 | | data.list[].billTypeName | string | 单据类型名称 | | data.list[].stockOrgNumber | string | 调入库存组织编码 | | data.list[].stockOrgName | string | 调入库存组织名称 | | data.list[].seq | string | 分录行号 | | data.list[].materialNumber | string | 物料编码 | | data.list[].materialName | string | 物料名称 | | data.list[].qty | number | 调拨数量 | | data.list[].unitName | string | 单位名称 | | data.list[].srcStockNumber | string | 调出仓库编码 | | data.list[].srcStockName | string | 调出仓库名称 | | data.list[].destStockNumber | string | 调入仓库编码 | | data.list[].destStockName | string | 调入仓库名称 | | data.list[].lotNumber | string | ERP 批号 | | data.list[].note | string | 备注,可空 | | data.list[].entryId | string | 分录内码 | | data.list[].id / fid | string | ERP 单据内码,一般不展示 | **下一步:** 点「新增」→ 接口 2;点某行 → 接口 8,传 `billNo` --- ## 2. 调拨页初始化 点「新增」后调用。**无请求参数**,不传生产订单号。一次返回可调拨物料(含单位)、仓库列表、默认调出/调入仓。 **请求URL:** `/js/a/mes/erpTransferDirect/formInit` **请求方式:** `POST`(也兼容 GET) **参数:** 无 **参数示例:** ```bash curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/formInit' ``` **返回示例:** ```json { "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": "个", "displayLabel": "个" } ] }, { "materialNumber": "8.35.115.10.5003146600021", "materialName": "115", "displayLabel": "8.35.115.10.5003146600021(115)", "defaultUnitNumber": "Pcs", "units": [ { "unitNumber": "Pcs", "unitName": "个", "displayLabel": "个" } ] } ], "defaultSrcStockNumber": "1100105", "defaultDestStockNumber": "", "stockList": [ { "stockNumber": "1100105", "stockName": "五金库", "displayLabel": "1100105 五金库" } ] } } ``` **返回字段说明:** | 字段路径 | 类型 | 说明 | |----------|------|------| | result | string | `"true"` / `"false"` | | message | string | 提示信息 | | data.transferCategory | string | 调拨类别编码,当前固定 `3`(外发调拨),展示用,提交不必回传 | | data.transferCategoryName | string | 调拨类别中文,固定「外发调拨」,页面标题/标签用 | | data.scanHint | string | 扫码说明文案,可展示在数量输入旁 | | data.defaultSrcStockNumber | string | 推荐默认**调出**仓库编码。进入页面时预选该仓,再调接口 4 查仓位 | | data.defaultDestStockNumber | string | 推荐默认**调入**仓库编码。空字符串表示未配置,须用户自选。不能与调出仓相同 | | data.materialList | array | 可调拨物料,目前 HEV、115 两条。下拉数据源 | | data.materialList[].materialNumber | string | 物料编码。提交 `materialNumber`、扫码 `materialNumber` 用此值 | | data.materialList[].materialName | string | 简称:`HEV` 或 `115` | | data.materialList[].displayLabel | string | 下拉展示文本,如 `8.10.HEV.10.047696(HEV)` | | data.materialList[].defaultUnitNumber | string | 该物料默认单位编码。提交 `unitNumber` 可直接用此值;无单位时可能缺此字段 | | data.materialList[].units | array | 该物料计量单位列表(来自 ERP) | | data.materialList[].units[].unitNumber | string | 单位编码,提交 `unitNumber` 用此值 | | data.materialList[].units[].unitName | string | 单位名称,如「个」 | | data.materialList[].units[].displayLabel | string | 单位下拉展示文本,优先名称 | | data.stockList | array | 可用仓库列表。调出仓、调入仓共用同一份,用户各选一次 | | data.stockList[].stockNumber | string | 仓库编码。提交 `srcStockNumber` / `destStockNumber`,以及查仓位的 `stockNumber` | | data.stockList[].stockName | string | 仓库名称 | | data.stockList[].displayLabel | string | 仓库下拉展示文本,一般为「编码 + 空格 + 名称」 | **页面用法:** 1. 调拨类别只展示 `transferCategoryName`,不可改。 2. 物料下拉绑定 `materialList`,选中后记录 `materialNumber`、`defaultUnitNumber`。 3. 调出仓库、调入仓库都绑定 `stockList`;调出仓预选 `defaultSrcStockNumber`,调入仓预选 `defaultDestStockNumber`(有值时)。 4. **选定(或切换)调出仓库后**,用该仓 `stockNumber` 调接口 4,加载调出仓位。 5. **选定(或切换)调入仓库后**,再调一次接口 4,加载调入仓位。 6. **选定物料和调出仓库后**,调接口 5 加载可用批号,选中后作为提交 `lotNumber`。 7. 数量不要手填初始值,用接口 6 扫码累加。 **下一步:** 选仓库 → 接口 4;选物料+调出仓 → 接口 5;扫批次码 → 接口 6;填完 → 接口 7 --- ## 3. 仓库列表(可选) `formInit` 已含 `stockList`,一般不用再调。需要单独刷新仓库时用本接口。 **推荐(来料检 / 生产入库 / 直接调拨共用):** **请求URL:** `/js/a/mes/erpStockPda/stockList` **本模块兼容别名:** `/js/a/mes/erpTransferDirect/stockList`(调拨多返回默认调入仓) **请求方式:** `POST`(也兼容 GET) **权限:** `mes:erpTransferDirect:view`(公共接口也可用来料检或生产入库的 view) **参数:** 无 **参数示例:** ```bash curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpStockPda/stockList' ``` 或本模块: ```bash curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/stockList' ``` **返回示例(本模块 `erpTransferDirect/stockList`):** ```json { "result": "true", "message": "成功", "data": { "defaultStockNumber": "1100105", "defaultSrcStockNumber": "1100105", "defaultDestStockNumber": "", "stockHint": "共 5 个可用仓库", "stockList": [ { "stockNumber": "1100105", "stockName": "五金库", "displayLabel": "1100105 五金库" } ] } } ``` **返回字段说明:** | 字段路径 | 类型 | 说明 | |----------|------|------| | result | string | `"true"` / `"false"` | | message | string | 提示信息 | | data.stockList | array | 可用仓库,字段同接口 2 的 `stockList[]` | | data.stockList[].stockNumber | string | 仓库编码 | | data.stockList[].stockName | string | 仓库名称 | | data.stockList[].displayLabel | string | 下拉展示文本 | | data.defaultStockNumber | string | 通用默认仓库编码(与默认调出仓相同) | | data.defaultSrcStockNumber | string | 推荐调出仓库编码(仅本模块 `erpTransferDirect/stockList` 有) | | data.defaultDestStockNumber | string | 推荐调入仓库编码(仅本模块有;空表示未配置) | | data.stockHint | string | 加载提示,如「共 5 个可用仓库」;失败时提示检查 ERP 连接 | 公共接口 `erpStockPda/stockList` **没有** `defaultSrcStockNumber` / `defaultDestStockNumber`,只有 `defaultStockNumber`、`stockHint`、`stockList`。 **PDA 处理:** 用 `stockList` 刷新调出/调入仓库下拉。切换仓库后必须重新调接口 4。 --- ## 4. 仓位选项(选仓库后必调) 用户选定或切换**调出仓库**、**调入仓库**后,用对应 `stockNumber` 各调一次。 `formInit` **不含**仓位列表。 **推荐(共用):** **请求URL:** `/js/a/mes/erpStockPda/stockLocOptions` **本模块兼容别名:** - `/js/a/mes/erpTransferDirect/pda/stockLocOptions` - `/js/a/mes/erpTransferDirect/stockLocOptions` **请求方式:** `POST`(也兼容 GET) **参数:** | 参数名 | 必选 | 类型 | 说明 | |--------|------|------|------| | stockNumber | 是 | string | 仓库编码,来自 `stockList[].stockNumber` | **参数示例:** 调出仓: ```bash curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpStockPda/stockLocOptions?stockNumber=1100105' ``` 调入仓: ```bash curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpStockPda/stockLocOptions?stockNumber=1100217' ``` **返回示例(仓库启用仓位):** ```json { "result": "true", "message": "成功", "data": { "stockNumber": "1100105", "required": true, "defaultLocNumber": "A", "locKey": "F100004", "locKeys": ["F100004"], "locHint": "共 278 个仓位,数据来自 ERP 仓位值集", "locations": [ { "locNumber": "A", "locName": "A", "locKey": "F100004", "locEntryId": "123", "displayLabel": "A" } ] } } ``` **返回示例(仓库未启用仓位):** ```json { "result": "true", "message": "成功", "data": { "stockNumber": "1100217", "required": false, "defaultLocNumber": "", "locHint": "该仓库未启用仓位或未配置仓位值集", "locations": [] } } ``` **失败示例:** ```json { "result": "false", "message": "仓库编码不能为空", "data": null } ``` **返回字段说明:** | 字段路径 | 类型 | 说明 | |----------|------|------| | result | string | `"true"` / `"false"` | | message | string | 成功为「成功」;未传仓库为「仓库编码不能为空」 | | data.stockNumber | string | 本次查询的仓库编码,与请求一致 | | data.required | boolean | **是否必须选仓位**。`true`:下拉必选,提交必须带仓位编码;`false`:可不选,提交不传仓位 | | data.defaultLocNumber | string | 推荐默认仓位编码,进入页/切仓后可预选;无则空 | | data.locHint | string | 提示文案,可显示在仓位下拉下方 | | data.locKey | string | 该仓库主仓位维度键(如 `F100004`),**仅展示/日志用**。提交可不传,MES 会按仓库+仓位编码自行解析 | | data.locKeys | array | 该仓库全部维度键。多维度仓库才有;可忽略 | | data.locations | array | 仓位下拉数据源。`required=false` 时为空数组 | | data.locations[].locNumber | string | 仓位编码。提交调出仓用 `srcStockLocNumber`,调入仓用 `destStockLocNumber` | | data.locations[].locName | string | 仓位名称 | | data.locations[].displayLabel | string | 下拉展示文本 | | data.locations[].locKey | string | 该仓位维度键,展示用,提交可不回传 | | data.locations[].locEntryId | string | 仓位值集分录内码,PDA 不用 | **PDA 处理:** | 步骤 | 说明 | |------|------| | 1 | 选中调出仓库 `srcStockNumber` 后,请求本接口,结果赋给**调出仓位**下拉 | | 2 | 选中调入仓库 `destStockNumber` 后,再请求一次,结果赋给**调入仓位**下拉 | | 3 | `required=true` 时仓位必选,默认选 `defaultLocNumber` | | 4 | `required=false` 时仓位可隐藏或显示「无库位」,提交不传对应 Loc 字段 | | 5 | 切换仓库必须重新调用,不要沿用上一仓库的仓位列表 | | 6 | **不要写死 `locKey`**。提交时 `srcStockLocKey` / `destStockLocKey` 可选 | **提交对应关系:** | 页面 | 仓库字段 | 仓位字段 | 仓位来源 | |------|----------|----------|----------| | 调出 | `srcStockNumber` | `srcStockLocNumber` | 调出仓这次 `locations[].locNumber` | | 调入 | `destStockNumber` | `destStockLocNumber` | 调入仓这次 `locations[].locNumber` | --- ## 5. 选批号(选物料和调出仓库后必调) 用户选定 **物料** 和 **调出仓库** 后调用。查 ERP 即时库存中该物料在该仓的可用批号,供下拉选择。 切换物料或调出仓库后须重新调用。 **请求URL:** `/js/a/mes/erpTransferDirect/pda/lotOptions` **请求方式:** `POST`(也兼容 GET) **参数:** | 参数名 | 必选 | 类型 | 说明 | |--------|------|------|------| | materialNumber | 是 | string | 物料编码,来自 `materialList[].materialNumber` | | stockNumber | 是 | string | **调出仓库**编码,来自 `stockList[].stockNumber` | | stockName | 否 | string | 仓库名称,仅用于缺批号时的提示文案 | | lotKeyword | 否 | string | 批号关键字。传入则按关键字搜索,不传则返回该仓全部可用批号 | | pickQty | 否 | number | 计划调拨数量,用于推荐 `suggestedLotNumber` | **参数示例:** ```bash curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/pda/lotOptions?materialNumber=8.10.HEV.10.047696&stockNumber=1100105' ``` 带关键字搜索: ```bash curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/pda/lotOptions?materialNumber=8.10.HEV.10.047696&stockNumber=1100105&lotKeyword=11026' ``` **返回示例(有可用批号):** ```json { "result": "true", "message": "成功", "data": { "materialNumber": "8.10.HEV.10.047696", "stockNumber": "1100105", "lots": [ { "lotNumber": "110260605001", "qty": 100, "qtyText": "100", "stockNumber": "1100105", "stockName": "五金库" } ], "suggestedLotNumber": "110260605001", "lotPickable": true, "lotHint": "共 1 条可用批号" } } ``` **返回示例(无批号):** ```json { "result": "true", "message": "成功", "data": { "materialNumber": "8.10.HEV.10.047696", "stockNumber": "1100105", "lots": [], "suggestedLotNumber": "", "lotPickable": false, "lotHint": "未查到符合条件的批号库存" } } ``` **失败示例:** ```json { "result": "false", "message": "请先选择调出仓库", "data": null } ``` **返回字段说明:** | 字段路径 | 类型 | 说明 | |----------|------|------| | result | string | `"true"` / `"false"`。未传物料或调出仓为 `"false"` | | message | string | 成功为「成功」;失败为「请先选择物料编码」或「请先选择调出仓库」 | | data.materialNumber | string | 本次查询的物料编码 | | data.stockNumber | string | 本次查询的调出仓库编码 | | data.lots | array | 可用批号列表,绑定下拉 | | data.lots[].lotNumber | string | ERP 批号。提交 `lotNumber` 用此值 | | data.lots[].qty | number | 该批号在该仓可用库存 | | data.lots[].qtyText | string | 可用库存展示文本 | | data.lots[].stockNumber | string | 仓库编码 | | data.lots[].stockName | string | 仓库名称 | | data.suggestedLotNumber | string | 推荐批号。有 `pickQty` 时优先选够量的最小批号;可预选 | | data.lotPickable | boolean | 是否有可选批号。`false` 时下拉为空,展示 `lotHint` | | data.lotHint | string | 提示文案,显示在批号下拉下方 | **PDA 处理:** 1. 物料、调出仓库都选好后再调,缺一不可。 2. 下拉绑定 `lots[]`,展示 `lotNumber` + `qtyText`。 3. 有 `suggestedLotNumber` 时可预选。 4. 选中后记录 `lotNumber`,提交时回传。 5. 切换物料或调出仓库必须重新调用,并清空已选批号。 **失败 message:** | message | 原因 | |---------|------| | 请先选择物料编码 | 未传 `materialNumber` | | 请先选择调出仓库 | 未传 `stockNumber` | --- ## 6. 扫批次码(累加数量 + 发货检校验) 每扫一次调一次。成功则 `qty = qty + data.qtyIncrement`。 同一张调拨单应扫**同一物料、同一 ERP 批号**;可用返回的 `materialNumber` / `lotNumber` 自动带出。 **请求URL:** `/js/a/mes/erpTransferDirect/batchScan` **请求方式:** `POST`(也兼容 GET) **参数:** | 参数名 | 必选 | 类型 | 说明 | |--------|------|------|------| | batchSn | 是 | string | 批次码(扫码值) | | materialNumber | 否 | string | 当前已选物料编码。传入时须与该批次产线物料一致,用于防止 HEV/115 扫串 | **参数示例:** ```bash curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/batchScan?batchSn=20260804084909&materialNumber=8.10.HEV.10.047696' ``` **返回示例(成功,已发货检):** ```json { "result": "true", "message": "扫码成功,可累加数量 2", "data": { "batchSn": "20260804084909", "nums": 2, "qtyIncrement": 2, "lineSn": "HEVXT", "materialNumber": "8.10.HEV.10.047696", "materialName": "HEV", "lotNumber": "110260605001", "batchStatus": "1", "batchStatusName": "合格", "inspected": true } } ``` **返回示例(失败,尚未发货检):** ```json { "result": "false", "message": "批次码 20260804084909 尚未发货检,不能调拨", "data": { "batchSn": "20260804084909", "nums": 2, "qtyIncrement": 2, "lineSn": "HEVXT", "materialNumber": "8.10.HEV.10.047696", "materialName": "HEV", "lotNumber": "", "batchStatus": "0", "batchStatusName": "仓库中", "inspected": false } } ``` **返回字段说明:** | 字段路径 | 类型 | 说明 | |----------|------|------| | result | string | `"true"` 允许累加数量 / `"false"` 不允许 | | message | string | 成功含累加数量;失败为原因,PDA 弹窗展示 | | data.batchSn | string | 本次扫到的批次码 | | data.nums | long | 该批次已绑定工件数量 | | data.qtyIncrement | long | **本次应累加的调拨数量**,与 `nums` 相同。`qty += qtyIncrement` | | data.lineSn | string | 产线编号,如 `HEVXT`、`115XT` | | data.materialNumber | string | 按产线解析的物料编码。第一枪可用来自动选中物料 | | data.materialName | string | `HEV` 或 `115` | | data.lotNumber | string | 生产入库回写的 ERP 批号。有值时自动填提交用的 `lotNumber`;可能为空 | | data.batchStatus | string | 批次状态:`3` 待装中 / `0` 仓库中 / `1` 合格 / `2` 已发货 | | data.batchStatusName | string | 状态中文(字典 `mes_batch_sn_status`) | | data.inspected | boolean | 是否已发货检合格。仅 `true` 时 `result` 才为 `"true"` | **PDA 处理:** 1. `result != "true"`:提示 `message`,数量不加。 2. `result == "true"`:记录该 `batchSn`(提交 `traySns` 用逗号拼接),`qty += qtyIncrement`。 3. 若页面还没选物料,用返回的 `materialNumber` 选中。 4. 若 `lotNumber` 非空且页面批号为空,填入批号。 5. 再扫时若物料或批号与已选不一致,接口或本地都应拒绝。 6. 同一批次码不要重复累加。 **失败 message:** | message | 原因 | |---------|------| | 批次码不能为空 | 未传 `batchSn` | | 未找到该 MES 批次码 | 批次码无效 | | 尚未生产入库,不能调拨 | `batchStatus=3` 待装中 | | 尚未发货检,不能调拨 | `batchStatus` 不是 `1`(含仓库中、发货检 NG) | | 已发货,不能调拨 | `batchStatus=2` | | 绑定数量为 0,不能调拨 | `nums<=0` | | 与当前选择物料不一致 | 传入的 `materialNumber` 与批次产线物料不符 | --- ## 7. 提交调拨 **请求URL:** `/js/a/mes/erpTransferDirect/submit` **请求方式:** `POST` **Content-Type(二选一):** | 方式 | Content-Type | 说明 | |------|--------------|------| | PDA 推荐 | `application/x-www-form-urlencoded` | 表单参数 | | 调试/脚本 | `application/json;charset=UTF-8` | 整包 JSON Body | **请求参数:** | 参数名 | 必选 | 类型 | 说明 | |--------|------|------|------| | materialNumber | 是 | string | 物料编码,来自 `materialList[].materialNumber` 或扫码返回值 | | lotNumber | 是 | string | ERP 批号,优先用扫码返回的 `lotNumber` | | qty | 是 | number | 调拨数量 = 各次扫码 `qtyIncrement` 合计,且不超过该批号在调出仓可用量 | | unitNumber | 否 | string | 计量单位编码,来自 `defaultUnitNumber` 或 `units[].unitNumber`。不传则后台取物料默认单位 | | srcStockNumber | 是 | string | 调出仓库编码 | | srcStockLocNumber | 条件 | string | 调出仓位编码。调出仓 `required=true` 时必填 | | srcStockLocKey | 否 | string | 调出仓位维度键,可选,不传由后台解析 | | destStockNumber | 是 | string | 调入仓库编码,不能与调出仓相同 | | destStockLocNumber | 条件 | string | 调入仓位编码。调入仓 `required=true` 时必填 | | destStockLocKey | 否 | string | 调入仓位维度键,可选 | | traySns | 是 | string | **托盘码(MES 批次码)逗号拼接**,如 `20260804084909,20260804085001`。提交成功后将这些托盘改为已发货(`batchStatus=2`),并绑定本次调拨单号 | | batchSns | 否 | string / array | 兼容旧参数,与 `traySns` 合并去重。表单逗号分隔,JSON 可用数组 | > 不再传 `moBillNo` / `instockBillNo` / `instockEntryId`。 > 提交成功后:ERP 生成直接调拨单;同时把 `traySns` 中每个托盘的 `batch_status` 改为 `2`(已发货),`erp_transfer_bill_no` 写入本次 `billNo`。 **参数示例:** PDA 表单: ```bash 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 'unitNumber=Pcs' \ --data-urlencode 'srcStockNumber=1100105' \ --data-urlencode 'srcStockLocNumber=A' \ --data-urlencode 'destStockNumber=1100217' \ --data-urlencode 'traySns=20260804084909,20260804085001' ``` JSON Body: ```bash 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,"unitNumber":"Pcs","srcStockNumber":"1100105","srcStockLocNumber":"A","destStockNumber":"1100217","traySns":"20260804084909,20260804085001"}' ``` **返回示例(成功):** ```json { "result": "true", "message": "直接调拨单保存成功,单号:ZJDB110260605001", "data": { "billNo": "ZJDB110260605001" } } ``` **返回示例(失败):** ```json { "result": "false", "message": "批次码 20260804084909 尚未发货检,不能调拨", "data": null } ``` **返回字段说明:** | 字段路径 | 类型 | 说明 | |----------|------|------| | result | string | `"true"` 保存成功 / `"false"` 失败 | | message | string | 成功含 ERP 单号;失败为原因,PDA 展示 | | data | object | 失败时一般为 `null` | | data.billNo | string | 成功时 ERP 直接调拨单号(ZJDB) | **常见失败 message:** | message | 原因 | |---------|------| | 请选择物料编码 | 未传 `materialNumber` | | 物料 xxx 不在 HEV/115 调拨范围内 | 物料不在配置清单 | | 请选择批号 | 未传 `lotNumber` | | 调拨数量必须大于 0 | `qty` 空或 ≤0 | | 请选择调出仓库 / 请选择调入仓库 | 仓库未选 | | 调入仓库不能与调出仓库相同 | 两仓相同 | | 所选批号在调出仓库无可用库存 | ERP 即时库存无该批号 | | 调拨数量不能超过批号可用库存 n | `qty` 大于可用量 | | 调出仓库:… / 调入仓库:… | 仓位校验失败(启用仓位却未选等) | | 请选择计量单位 | 未传单位且 ERP 也未加载到默认单位 | | 尚未发货检 / 已发货 / 物料不一致 | 传入了 `traySns` 且复核未通过 | **传 `traySns` 时额外规则:** - 每条托盘码须已发货检合格(`batchStatus=1`) - 各托盘物料、ERP 批号须一致 - 若未传 `materialNumber` / `lotNumber`,用扫码结果回填 - 若未传 `qty`,用各托盘 `nums` 合计 - **ERP 保存成功后**:托盘状态改为已发货(`2`),并写入调拨单号 `erp_transfer_bill_no` --- ## 8. 查看调拨单明细 列表点某行调用。 **请求URL:** `/js/a/mes/erpTransferDirect/pda/detailData` **请求方式:** `POST` **参数:** | 参数名 | 必选 | 类型 | 说明 | |--------|------|------|------| | billNo | 是 | string | 直接调拨单号 ZJDB,来自列表 `list[].billNo` | **参数示例:** ```bash curl --location --request POST 'http://127.0.0.1:8980/js/a/mes/erpTransferDirect/pda/detailData?billNo=ZJDB110260605001' ``` **返回示例:** ```json { "result": "true", "message": "成功", "data": { "pageNo": 1, "pageSize": 20, "count": 1, "list": [ { "seq": "1", "materialNumber": "8.10.HEV.10.047696", "materialName": "下壳体", "qty": 100, "unitName": "个", "srcStockNumber": "1100105", "srcStockName": "五金库", "destStockNumber": "1100217", "destStockName": "成品仓", "lotNumber": "110260605001", "documentStatusName": "已审核", "date": "2026-06-05" } ] } } ``` **返回字段说明:** 分页字段同接口 1;`list[]` 字段与接口 1 的 `list[]` 相同(该单全部分录)。展示建议:行号、物料、数量、单位、调出仓、调入仓、批号。 --- ## 仓库 / 仓位选用小结 | 用途 | 推荐 URL | 何时调用 | |------|----------|----------| | 物料 + 仓库(进新增页) | `POST /js/a/mes/erpTransferDirect/formInit` | 点新增一次 | | 只刷新仓库 | `POST /js/a/mes/erpStockPda/stockList` | 可选 | | 查仓位 | `POST /js/a/mes/erpStockPda/stockLocOptions?stockNumber=` | 调出仓、调入仓各一次;切换仓库再调 | | 选批号 | `POST /js/a/mes/erpTransferDirect/pda/lotOptions` | 选物料 + 调出仓库后;切换后再调 | | 扫码加数量 | `POST /js/a/mes/erpTransferDirect/batchScan` | 每扫一枪 | | 提交 | `POST /js/a/mes/erpTransferDirect/submit` | 填完提交,`traySns` 逗号拼接托盘码 | 仓位规则:`data.required=true` 必须选仓位并提交对应 `*StockLocNumber`;`false` 不传仓位。不要写死 `locKey`。 --- ## 兼容旧接口(新增流程不再调用) | 接口 | 说明 | |------|------| | `pda/selectOrderData` | 旧:选生产订单 | | `pda/instockSourceData` | 旧:按生产订单查入库源行 |