取消委外進貨單

outsourcing.process
CANCEL JSON 同步

1. 基本資訊

項目說明
API 中文名稱取消委外進貨單(委外採購收貨還原)
CROSS API Codeoutsourcing.process
MES taskNameoutsourcingProcess
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. 業務流程

取消出站 檢查 TL011/TL012 是否有值 判斷 TRANSORDERTYPE = "59" outsourcingProcess 呼叫 ERP 還原入庫 完成 其他: cancelStockIn != "59" 程式位置: GeneralUpdater.java:1571-1605
程式碼對應
  • 取消判斷: 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_nostringY公司別COMPANYID (sftcompany)
site_nostringY站點COMPANYID (sftcompany)
source_nostringY來源單號(委外進貨單號)outsource_no (TL011 + "-" + TL012)
source_typestringY還原類型(0/1/2)"0" (出貨還原)
objective_doc_nostringY目標單據號(同 source_no)outsource_no

outsourcing_info_data 結構

欄位型別必填說明MES 來源
source_nostringN來源單號空字串
plot_nostringN批號空字串
purchase_seqnumericN採購序號空字串

欄位來源說明

outsource_no = SFT_TRANSORDER_LINE.TL011 + "-" + SFT_TRANSORDER_LINE.TL012

TL011/TL012 是由 outsourcingPurchaseStockinCreate 成功後,ERP 回傳的 TB001/TB002 所寫入。

4. Response 規格

欄位型別說明
codeint200=成功,其他=失敗
msgstring處理結果訊息

成功行為

5. 檢核規則

#檢核項目規則程式位置
1TL011 不為空必須有 ERP 單別GeneralUpdater.java:1571
2TL012 不為空必須有 ERP 單號GeneralUpdater.java:1571
3TRANSORDERTYPE = "59"委外單類型判斷GeneralUpdater.java:1577
4原始單據存在ERP 端單據須存在ERP 端檢核
5單據狀態允許取消未過帳才可還原ERP 端檢核
重要:TL011/TL012 為空時不會呼叫 ERP
程式邏輯中,只有當 TL011TL012 都不為空時,才會呼叫 outsourcingProcess
若為空,取消出站動作僅在 MES 端執行,ERP 端不受影響。

6. 錯誤代碼

代碼訊息說明
E001必填欄位缺失outsource_no 或 source_type 為空
E002委外進貨單不存在outsource_no 對應單據不存在
E003單據已過帳不可取消ERP 單據已過帳,無法還原
E004單據已取消重複取消
E005source_type 不正確值不在 0/1/2 範圍
E999系統錯誤Timeout、連線異常

7. JSON 範例

Request (MES 內部 JSON)

{
  "companyID": "COMP01",
  "userId": "EMP001",
  "outsource_no": "5902-20260319001",
  "source_type": "0"
}

ERP XML 格式 (實際傳送)

<!-- SendFormS.java:1727-1752 -->
<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 資料不一致。

時間線範例

16:29:46 MES 出站 送 ERP 16:31:08 取消出站 TL011/TL012 為空! 16:31:49 ERP 回傳 5902-20260310069 ERP 單據未被取消

問題原因

// GeneralUpdater.java:1571
if(!SftTransorderLine.getTl011().equals("") && !SftTransorderLine.getTl012().equals("")){
    // 只有 TL011/TL012 不為空時,才呼叫 outsourcingProcess
    // 若在 ERP 回傳前取消,此 if 為 false,跳過 ERP 呼叫
}

處理建議

方案說明影響
立即處理手動至 ERP 作廢該委外進貨單需人工介入
等待機制取消出站時等待 ERP 回傳完成需程式修改
Lock 機制出站進行中禁止取消操作需程式修改
定期比對排程比對 MES 與 ERP 單據狀態需新增功能