工單完工入庫還原(取消)

stockin.data.process
CANCEL JSON 同步

1. 基本資訊

項目說明
API 中文名稱工單完工入庫還原(取消入庫)
API 英文名稱Work Order Stock-In Data Process (Cancel)
CROSS API Codestockin.data.process
對應 ESB 服務/cancelStockIn (一般) 或 /outsourcingProcess (TRANSORDERTYPE=59)
呼叫方向MES → ERP
呼叫時機1. MES 執行取消出站作業時
2. 品質異常需退回重工時
觸發條件TL011/TL012 不為空
主要業務情境取消已完成的入庫作業,ERP 需還原庫存扣減並作廢原入庫單據
Request 格式JSON (Content-Type: application/json)
同步/非同步同步呼叫
交易控管需要
備註取消前需檢查 TL011/TL012 是否有值,有值才呼叫 ERP

取消類型判斷

TRANSORDERTYPEESB 服務說明
59outsourcingProcess取消委外進貨單
其他cancelStockIn取消一般入庫單

source_type 參數(委外專用)

source_type說明使用情境
0出貨還原取消出站(委外送出)
1回貨還原取消入站(委外回收)
2退貨還原取消退貨

2. 業務流程

取消出站 檢查 TL011/TL012 是否有值 判斷 TRANSORDERTYPE = 59: outsourcingProcess 其他: cancelStockIn 呼叫 ERP 還原庫存 完成 TL011/TL012 為空 跳過 ERP 呼叫 程式位置: GeneralUpdater.java:1571-1605
程式碼對應
  • 取消判斷: GeneralUpdater.java:1571-1605
  • TL011/TL012 檢查: GeneralUpdater.java:1571
  • TRANSORDERTYPE 判斷: GeneralUpdater.java:1577
關聯 API
取消入庫單與建立入庫單 (stockin.data.create) 成對使用。
取消時需使用建立成功後 ERP 回傳的 TB001/TB002 (存於 TL011/TL012)。

3. Request 規格

傳輸格式: JSON
Content-Type: application/json

3.1 取消一般入庫單 (cancelStockIn)

欄位型別必填說明MES 來源
companyIDstringY公司別COMPANYID
userIdstringY操作人員當前登入者
stock_in_nostringY入庫單號(單別-單號)TL011 + "-" + TL012

3.2 取消委外入庫單 (outsourcingProcess)

欄位型別必填說明MES 來源
companyIDstringY公司別COMPANYID
userIdstringY操作人員當前登入者
outsource_nostringY委外單號(單別-單號)TL011 + "-" + TL012
source_typestringY還原類型(0/1/2)"0" (出貨還原)

欄位來源說明

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

TL011/TL012 是由 stockin.data.create 成功後,ERP 回傳的 TB001/TB002 所寫入。

4. Response 規格

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

成功行為

5. 檢核規則

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

6. 錯誤代碼

代碼訊息說明
E101入庫單不存在stock_in_no 對應單據不存在
E102入庫單已過帳入庫單已完成過帳,無法還原
E103入庫單已引用有後續銷貨單或調撥單
E104庫存不足取消後庫存會變負數
E999系統錯誤Timeout、連線異常

7. JSON 範例

Request - 取消一般入庫單

{
  "companyID": "COMP01",
  "userId": "EMP001",
  "stock_in_no": "5101-20260319001"
}

Request - 取消委外入庫單

{
  "companyID": "COMP01",
  "userId": "EMP001",
  "outsource_no": "5902-20260319001",
  "source_type": "0"   // 0=出貨還原
}

Response (成功)

{
  "code": 200,
  "msg": "入庫單取消成功"
}

Response (失敗)

{
  "code": 500,
  "msg": "入庫單已過帳,無法取消"
}

8. Race Condition 風險說明

已知問題:取消出站時 TL011/TL012 為空

當使用者在 ERP 回傳之前取消出站時,由於 TL011/TL012 尚未被回寫,取消 API 不會被呼叫。
這會導致 MES 與 ERP 資料不一致。

時間線範例

T1 MES 出站 送 ERP T2 取消出站 TL011/TL012 為空! T3 ERP 回傳 TB001/TB002 ERP 單據未被取消

問題原因

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

處理建議

方案說明影響
立即處理手動至 ERP 作廢該入庫單需人工介入
等待機制取消出站時等待 ERP 回傳完成需程式修改
Lock 機制出站進行中禁止取消操作需程式修改
定期比對排程比對 MES 與 ERP 單據狀態需新增功能
參考案例
詳見 CLAUDE.md 中 2026-03-12 記錄的「0000675600 取消出站 outsourcingProcess 未呼叫問題分析」