1. 基本資訊
| 項目 | 說明 |
| API 中文名稱 | 取消委外進貨單(委外採購收貨還原) |
| CROSS API Code | outsourcing.process |
| MES taskName | outsourcingProcess |
| ESB 路徑 | /outsourcingProcess |
| DSMS 參考 | api-2058 |
| 呼叫方向 | MES → ERP |
| 觸發條件 | TRANSORDERTYPE = "59" + TL011/TL012 不為空 |
| Request 格式 | JSON (Content-Type: application/json) |
| 傳輸方式 | HTTP POST via ESB |
| 同步/非同步 | 同步呼叫 |
source_type 參數對照
| source_type | 說明 | 使用情境 |
| 0 | 出貨還原 | 取消出站(委外送出) |
| 1 | 回貨還原 | 取消入站(委外回收) |
| 2 | 退貨還原 | 取消退貨 |
2. 業務流程
程式碼對應
- 取消判斷:
GeneralUpdater.java:1571-1605
- TL011/TL012 檢查:
GeneralUpdater.java:1571
- TRANSORDERTYPE 判斷:
GeneralUpdater.java:1577
- JSON 組裝:
transOrder.put("outsource_no", stock_in_no)
關聯 API
取消委外進貨單 (outsourcingProcess) 與建立委外進貨單 (outsourcingPurchaseStockinCreate) 成對使用。
取消時需使用建立成功後 ERP 回傳的 TB001/TB002 (存於 TL011/TL012)。
3. Request 規格
傳輸格式: JSON
Content-Type: application/json (HttpClient.java:25)
Request 欄位 (Parameter)
| 欄位 | 型別 | 必填 | 說明 | MES 來源 |
| enterprise_no | string | Y | 公司別 | COMPANYID (sftcompany) |
| site_no | string | Y | 站點 | COMPANYID (sftcompany) |
| source_no | string | Y | 來源單號(委外進貨單號) | outsource_no (TL011 + "-" + TL012) |
| source_type | string | Y | 還原類型(0/1/2) | "0" (出貨還原) |
| objective_doc_no | string | Y | 目標單據號(同 source_no) | outsource_no |
outsourcing_info_data 結構
| 欄位 | 型別 | 必填 | 說明 | MES 來源 |
| source_no | string | N | 來源單號 | 空字串 |
| plot_no | string | N | 批號 | 空字串 |
| purchase_seq | numeric | N | 採購序號 | 空字串 |
欄位來源說明
outsource_no = SFT_TRANSORDER_LINE.TL011 + "-" + SFT_TRANSORDER_LINE.TL012
TL011/TL012 是由 outsourcingPurchaseStockinCreate 成功後,ERP 回傳的 TB001/TB002 所寫入。
4. Response 規格
| 欄位 | 型別 | 說明 |
| code | int | 200=成功,其他=失敗 |
| msg | string | 處理結果訊息 |
成功行為
- ERP 委外進貨單作廢/還原
- 庫存數量還原
- MES 出站記錄取消
5. 檢核規則
| # | 檢核項目 | 規則 | 程式位置 |
| 1 | TL011 不為空 | 必須有 ERP 單別 | GeneralUpdater.java:1571 |
| 2 | TL012 不為空 | 必須有 ERP 單號 | GeneralUpdater.java:1571 |
| 3 | TRANSORDERTYPE = "59" | 委外單類型判斷 | GeneralUpdater.java:1577 |
| 4 | 原始單據存在 | ERP 端單據須存在 | ERP 端檢核 |
| 5 | 單據狀態允許取消 | 未過帳才可還原 | ERP 端檢核 |
重要:TL011/TL012 為空時不會呼叫 ERP
程式邏輯中,只有當 TL011 和 TL012 都不為空時,才會呼叫 outsourcingProcess。
若為空,取消出站動作僅在 MES 端執行,ERP 端不受影響。
6. 錯誤代碼
| 代碼 | 訊息 | 說明 |
| E001 | 必填欄位缺失 | outsource_no 或 source_type 為空 |
| E002 | 委外進貨單不存在 | outsource_no 對應單據不存在 |
| E003 | 單據已過帳不可取消 | ERP 單據已過帳,無法還原 |
| E004 | 單據已取消 | 重複取消 |
| E005 | source_type 不正確 | 值不在 0/1/2 範圍 |
| E999 | 系統錯誤 | Timeout、連線異常 |
7. JSON 範例
Request (MES 內部 JSON)
{
"companyID": "COMP01",
"userId": "EMP001",
"outsource_no": "5902-20260319001",
"source_type": "0"
}
ERP XML 格式 (實際傳送)
<parameters>
<parameter key="enterprise_no" type="string">COMP01</parameter>
<parameter key="site_no" type="string">COMP01</parameter>
<parameter key="source_no" type="string">5902-20260319001</parameter>
<parameter key="source_type" type="numeric">0</parameter>
<parameter key="objective_doc_no" type="string">5902-20260319001</parameter>
<parameter key="outsourcing_info_data" type="data">
<data name="outsourcing_info">
<row seq="1">
<field name="source_no" type="string"></field>
<field name="plot_no" type="string"></field>
<field name="purchase_seq" type="numeric"></field>
</row>
</data>
</parameter>
</parameters>
Response (成功)
{
"code": 200,
"msg": "委外進貨單還原成功"
}
Response (失敗)
{
"code": 500,
"msg": "單據已過帳不可取消 5902-20260319001"
}
8. Race Condition 風險說明
已知問題:取消出站時 TL011/TL012 為空
當使用者在 ERP 回傳之前取消出站時,由於 TL011/TL012 尚未被回寫,outsourcingProcess 不會被呼叫。
這會導致 MES 與 ERP 資料不一致。
時間線範例
問題原因
if(!SftTransorderLine.getTl011().equals("") && !SftTransorderLine.getTl012().equals("")){
}
處理建議
| 方案 | 說明 | 影響 |
| 立即處理 | 手動至 ERP 作廢該委外進貨單 | 需人工介入 |
| 等待機制 | 取消出站時等待 ERP 回傳完成 | 需程式修改 |
| Lock 機制 | 出站進行中禁止取消操作 | 需程式修改 |
| 定期比對 | 排程比對 MES 與 ERP 單據狀態 | 需新增功能 |