← 返回 API 列表

取消報工單(報工單還原)

CANCEL MES → ERP
wo.work.report.data.process

當 MES 取消出站時,呼叫此 API 通知 ERP 取消對應的報工單,還原報工數據。 ERP 收到後會作廢或還原該筆報工記錄。

基本資訊

API 名稱
wo.work.report.data.process
內部任務名稱
cancelProductionForm
傳輸格式
JSON (Content-Type: application/json)
案號
0190760
API 編號
api-2196
資料方向
MES → ERP

觸發時機

取消出站 CancelCheckOut 使用者操作 查詢報工單號 PRODUCTION_REPORTID SFT_OP_REALRUN 報工單號 存在? 送 ERP 取消 cancelProductionForm wo.work.report.data.process 無 → 跳過
重要提醒
取消報工單只有在 PRODUCTION_REPORTID 有值時才會呼叫 ERP。 如果出站時 ERP 尚未回傳報工單號(TIMEOUT 或失敗),取消時將無法通知 ERP 還原。

觸發情境

情境 1:正常取消出站

使用者在 MES 點擊「取消出站」,系統查詢到報工單號後,呼叫 ERP 取消該報工單。

情境 2:批次取消出站

批次取消多筆出站記錄,系統會逐筆呼叫 ERP 取消對應的報工單。

情境 3:重工取消

重工站取消出站時,同樣會觸發報工單取消流程。

請求參數

欄位 ERP 欄位名 類型 必填 說明
公司代碼 enterprise_no String 必填 企業代碼
工廠代碼 site_no String 必填 工廠/廠別代碼
報工單號 report_no String 必填 要取消的報工單號(類別-單號)
報工單號格式
報工單號格式為 PDTYPE-PDNO,例如:10-20260319001。 此值來自 SFT_OP_REALRUN.PRODUCTION_REPORTIDSFT_WS_RUN.WR024

請求範例

JSON 格式

{
  "enterprise_no": "COMP01",
  "site_no": "SITE01",
  "report_no": "10-20260319001"
}

ERP XML 格式 (WFERP)

<parameters>
  <parameter key="enterprise_no" type="string">COMP01</parameter>
  <parameter key="site_no" type="string">SITE01</parameter>
  <parameter key="report_no" type="string">10-20260319001</parameter>
</parameters>

回應格式

成功回應 (code=200)

{
  "code": 200,
  "msg": "報工單取消成功",
  "ERPMessage": {
    "description": "處理成功",
    "report_no": "10-20260319001"
  }
}

失敗回應 (code=500)

{
  "code": 500,
  "msg": "報工單取消失敗",
  "ERPMessage": {
    "description": "報工單已確認,無法取消"
  }
}

回應欄位說明

欄位 類型 說明
code Integer 200=成功, 500=失敗
msg String 處理訊息
ERPMessage.description String ERP 回傳的詳細訊息

MES 清除邏輯

取消報工單成功後,MES 會清除相關記錄中的報工單號:

ERP 取消成功 code=200 清除報工單號 SFT_OP_REALRUN PRODUCTION_REPORTID = '' SFT_WS_RUN WR024 = '', WR025 = '' 清除報工明細 SFT_SFCTD SFT_SFCTE

清除 SQL 邏輯

-- 清除 SFT_OP_REALRUN 的報工單號
UPDATE SFT_OP_REALRUN
SET PRODUCTION_REPORTID = '',
    PRODUCTION_REPORTSN = ''
WHERE ID = :KEYID
  AND ERP_OPSEQ = :ERP_OPSEQ
  AND SEQUENCE = :SEQUENCE

-- 清除 SFT_WS_RUN 的報工單號
UPDATE SFT_WS_RUN
SET WR024 = '',
    WR025 = ''
WHERE (對應的進出站記錄條件)

-- 刪除報工單頭明細(視系統設定)
DELETE FROM SFT_SFCTE WHERE TE001 = :PDTYPE AND TE002 = :PDNO
DELETE FROM SFT_SFCTD WHERE TD001 = :PDTYPE AND TD002 = :PDNO

與其他取消 API 的差異

API 名稱 任務名稱 適用情境 取消的單據類型
wo.work.report.data.process cancelProductionForm 一般報工取消 報工單
outsourcing.process outsourcingProcess 委外入庫取消 (TRANSORDERTYPE=59) 委外進貨單
stockin.data.process cancelStockIn 入庫單取消 入庫單
wo.scrap.data.process woScrapDataProcess 報廢入庫取消 (TRANSORDERTYPE=58) 報廢單
判斷邏輯
取消出站時,系統會根據 SFT_TRANSORDER_LINE.TRANSORDERTYPE 判斷呼叫哪個取消 API:

• TRANSORDERTYPE = 59 → outsourcingProcess(委外)
• TRANSORDERTYPE = 58 → woScrapDataProcess(報廢)
• 其他 → cancelStockIn 或 cancelProductionForm

相關資料表

資料表 說明 影響欄位
SFT_OP_REALRUN 製程執行記錄 PRODUCTION_REPORTID, PRODUCTION_REPORTSN (清空)
SFT_WS_RUN 工作站執行記錄 WR024, WR025 (清空)
SFT_SFCTD 報工單頭檔 整筆刪除或標記取消
SFT_SFCTE 報工單明細 整筆刪除或標記取消

程式碼位置

功能 檔案路徑 行號
取消出站入口 SFT_core/src/com/dci/sft/update/GeneralUpdater.java 1571-1605
取消 API 呼叫 SFT_ERPIntegrate/src/com/dci/sft/erp/XmlToERP_handler.java 159-237
清除報工單號 SFT_core/src/com/dci/sft/jsonMappingHibernate/TransOrderDataToJson.java 1530-1580

錯誤處理

錯誤情境 ERP 回應 MES 處理方式
報工單已確認 code=500, 報工單已確認 顯示錯誤訊息,需人工處理
報工單不存在 code=500, 報工單不存在 清除 MES 報工單號,繼續取消流程
連線超時 SocketTimeoutException 記錄 LOG,需手動補取消

LOG 記錄

// 日誌檔案:logs/ERPReturnErrorRec.log

[ERP_SEND_ERROR] taskName=cancelProductionForm, errorType=SocketTimeoutException, errorMsg=Read timed out
[ERP_SEND_ERROR] 送出内容={"report_no":"10-20260319001"}

Race Condition 風險

重要注意事項
與建立報工單的 API 相同,取消報工單也存在 Race Condition 風險:

情境:出站後立即取消,但 ERP 尚未回傳報工單號
結果:PRODUCTION_REPORTID 為空,無法呼叫 ERP 取消
後果:MES 已取消出站,但 ERP 報工單仍存在

建議處理方式:
  1. 出站後等待 ERP 回傳成功再允許取消操作
  2. 定期比對 MES 與 ERP 報工單狀態
  3. 提供手動補取消功能