基本資訊
API 名稱
wo.scrap.data.process
內部任務名稱
woScrapDataProcess
傳輸格式
JSON (Content-Type: application/json)
觸發時機
取消 API 判斷邏輯
取消出站時,系統根據 SFT_TRANSORDER_LINE.TRANSORDERTYPE 判斷呼叫哪個取消 API:
| TRANSORDERTYPE |
單據類型 |
呼叫的 API |
任務名稱 |
58 |
報廢入庫(不良品) |
wo.scrap.data.process |
woScrapDataProcess |
59 |
委外入庫 |
outsourcing.process |
outsourcingProcess |
| 其他 |
一般入庫 |
stockin.data.process |
cancelStockIn |
程式碼位置
判斷邏輯位於 GeneralUpdater.excuteDeleteErpTransOrders() 方法,
第 1577-1592 行。
請求參數
| 欄位 |
ERP 欄位名 |
類型 |
必填 |
說明 |
| 公司代碼 |
enterprise_no |
String |
必填 |
企業代碼 |
| 工廠代碼 |
site_no |
String |
必填 |
工廠/廠別代碼 |
| 不良品入庫單號 |
doc_no |
String |
必填 |
要取消的入庫單號(格式: TL011-TL012) |
入庫單號格式
入庫單號格式為 TL011-TL012,例如:58-20260319001。
此值來自建立不良品入庫時 ERP 回傳的 doc_no,儲存於 SFT_TRANSORDER_LINE。
請求範例
JSON 格式
{
"enterprise_no": "COMP01",
"site_no": "SITE01",
"doc_no": "58-20260319001"
}
ERP XML 格式 (WFERP)
<parameters>
<parameter key="enterprise_no" type="string">COMP01</parameter>
<parameter key="site_no" type="string">SITE01</parameter>
<parameter key="doc_no" type="string">58-20260319001</parameter>
</parameters>
回應格式
成功回應 (code=200)
{
"code": 200,
"msg": "不良品入庫單取消成功",
"ERPMessage": {
"description": "處理成功",
"doc_no": "58-20260319001"
}
}
失敗回應 (code=500)
{
"code": 500,
"msg": "不良品入庫單取消失敗",
"ERPMessage": {
"description": "入庫單已確認,無法取消"
}
}
回應欄位說明
| 欄位 |
類型 |
說明 |
code |
Integer |
200=成功, 500=失敗 |
msg |
String |
處理訊息 |
ERPMessage.description |
String |
ERP 回傳的詳細訊息 |
MES 清除邏輯
取消不良品入庫成功後,MES 會清除相關移轉單記錄:
清除 SQL
-- 清除 SFT_TRANSORDER_LINE 的 ERP 單號
UPDATE SFT_TRANSORDER_LINE
SET TL011 = '',
TL012 = ''
WHERE TRANSORDERTYPE = '58'
AND TL011 = :TL011
AND TL012 = :TL012
-- 或刪除整筆移轉單記錄(視系統設定)
DELETE FROM SFT_TRANSORDER_LINE
WHERE TRANSORDERTYPE = '58'
AND TRANSNO = :TRANSNO
Race Condition 風險
重要注意事項
與其他取消 API 相同,取消不良品入庫也存在 Race Condition 風險:
情境:出站後立即取消,但 ERP 尚未回傳不良品入庫單號
結果:TL011/TL012 為空,無法呼叫 ERP 取消
後果:MES 已取消出站,但 ERP 不良品入庫單仍存在
判斷邏輯
// GeneralUpdater.java:1571-1575
if(!SftTransorderLine.getTl011().equals("") && !SftTransorderLine.getTl012().equals("")){
// TL011/TL012 有值,才呼叫 ERP 取消
String stock_in_no = SftTransorderLine.getTl011() + "-" + SftTransorderLine.getTl012();
// 根據 TRANSORDERTYPE 判斷呼叫哪個 API
...
} else {
// TL011/TL012 為空,跳過 ERP 呼叫
}
建議處理方式
- 出站後等待 ERP 回傳成功再允許取消操作
- 加入 Lock 機制防止同時操作
- 定期比對 MES 與 ERP 不良品入庫單狀態
- 提供手動補取消功能
相關資料表
| 資料表 |
說明 |
影響欄位 |
SFT_TRANSORDER_LINE |
移轉單明細 |
TL011, TL012 (清空或刪除整筆) |
SftTransorder |
移轉單頭檔 |
TO007, TO008 (可能需要清空) |
程式碼位置
| 功能 |
檔案路徑 |
行號 |
| 取消出站入口 |
SFT_core/src/com/dci/sft/update/GeneralUpdater.java |
1550-1612 |
| TRANSORDERTYPE 判斷 |
SFT_core/src/com/dci/sft/update/GeneralUpdater.java |
1577-1592 |
| API 路由 |
SFT_ERPIntegrate/src/com/dci/sft/erp/XmlToERP_handler.java |
96-98 |
| XML 參數組裝 |
SFT_ERPIntegrate/src/com/dci/sft/erp/webservice/SendFormS.java |
1811-1815 |
錯誤處理
| 錯誤情境 |
ERP 回應 |
MES 處理方式 |
| 入庫單已確認 |
code=500, 入庫單已確認 |
顯示錯誤訊息,需人工處理 |
| 入庫單不存在 |
code=500, 入庫單不存在 |
清除 MES 記錄,繼續取消流程 |
| 連線超時 |
SocketTimeoutException |
記錄 LOG,需手動補取消 |
LOG 記錄
// 日誌檔案:logs/ERPReturnErrorRec.log
[ERP_SEND_ERROR] taskName=woScrapDataProcess, errorType=SocketTimeoutException, errorMsg=Read timed out
[ERP_SEND_ERROR] 送出内容={"doc_no":"58-20260319001"}