工單狀態變更

wo.status.process
POST JSON 同步 ERP → MES

1. 基本資訊

項目說明
API 中文名稱工單狀態變更(刪除/結案/取消結案)
API 英文名稱Work Order Status Process
API Codewo.status.process
案號0189142
REST EndpointPOST /ESB/API/upModetailStatus
呼叫方向ERP → MES
呼叫時機ERP 刪除、結案或取消結案工單時
主要業務情境ERP 變更製令狀態,同步更新 MES 的製令狀態或刪除製令資料
Request 格式JSON (Content-Type: application/json)
同步/非同步同步呼叫
呼叫方向說明
此 API 為 ERP → MES 單向推送。
根據 status 參數執行不同操作:刪除(1)、結案(2)、取消結案(3)。

2. 狀態對照表

status操作說明MES 行為
1刪除工單刪除製令及相關批次DELETE MODETAIL / LOT
2結案製令指定完工/結案檢查未完工製程,變更狀態
3取消結案還原已結案的製令還原 STATUS(99/100 → 原狀態)

MODETAIL.STATUS 定義

STATUS說明
1未生產
2生產中
3待結案
99結案
100取消

3. Request 規格

傳輸格式: JSON
Content-Type: application/json
欄位型別必填說明範例
CompanyIdstringY公司代號"COMP01"
langstringN語系"zh_TW"
wo_nostringY製令編號(單別-單號)"5101-20260319001"
statusstringY操作類型(1/2/3)"1"

4. Response 規格

欄位型別說明
codestring200=成功,500=失敗
msgstring處理結果訊息或錯誤代碼

5. 處理邏輯

5.1 status=1 刪除工單

status=1 刪除 已發放? JS_0126_00062 DELETE MODETAIL DELETE LOT 完成 檢查 SFT_WS_RUN.EXECUTETYPE='release'
刪除限制
若製令已進行發放(SFT_WS_RUN 有 EXECUTETYPE='release' 的記錄),則無法刪除,會拋出錯誤 JS_0126_00062

5.2 status=2 結案

status=2 結案 暫停中? JS_0115_00014 未完工製程? JS_0115_00017 執行結案流程 檢查 SFT_HOLD_REC (暫停) 和 SFT_OP_REALRUN (未完工)
結案檢核
  • 檢查 SFT_HOLD_REC:製令是否暫停中
  • 檢查 SFT_OP_REALRUN:是否有未完工製程

5.3 status=3 取消結案

status=3 取消結案 STATUS ∈(99,100)? JS_0126_00059 還原結案狀態 檢查 MODETAIL.STATUS 是否為結案/取消狀態
取消結案條件
只有 STATUS=99(結案)或 STATUS=100(取消)的製令才能執行取消結案操作。

6. 錯誤代碼

代碼訊息觸發條件對應 status
JS_0126_00062製令已進行發放,無法進行製令刪除SFT_WS_RUN 有發放記錄status=1
JS_0115_00014製令暫停中,請先解除暫停再執行指定完工SFT_HOLD_REC 有暫停記錄status=2
JS_0115_00017此單據有製程未完工資料,請先將製程完工再作製令完工SFT_OP_REALRUN 有未完工製程status=2
JS_0126_00059eMES 製令未結案,不可取消MODETAIL.STATUS 不在 (99,100)status=3
remind_002資料不存在製令編號不存在all

7. JSON 範例

Request - 刪除工單 (status=1)

{
  "CompanyId": "COMP01",
  "lang": "zh_TW",
  "wo_no": "5101-20260319001",
  "status": "1"  // 刪除
}

Request - 結案 (status=2)

{
  "CompanyId": "COMP01",
  "lang": "zh_TW",
  "wo_no": "5101-20260319001",
  "status": "2"  // 結案
}

Request - 取消結案 (status=3)

{
  "CompanyId": "COMP01",
  "lang": "zh_TW",
  "wo_no": "5101-20260319001",
  "status": "3"  // 取消結案
}

Response (成功)

{
  "code": "200",
  "msg": "success"
}

Response (失敗 - 已發放無法刪除)

{
  "code": "500",
  "msg": "JS_0126_00062"
}

Response (失敗 - 暫停中無法結案)

{
  "code": "500",
  "msg": "JS_0115_00014"
}

Response (失敗 - 未結案不可取消)

{
  "code": "500",
  "msg": "JS_0126_00059"
}

8. 資料庫更新 SQL

8.1 status=1 刪除工單

-- 檢查是否已發放(已發放則不可刪除)
SELECT COUNT(*) FROM SFT_WS_RUN WITH (NOLOCK)
WHERE ID = N'{wo_no}'
  AND EXECUTETYPE = 'release'
  AND PLUSINDEX = '0'
-- 若 COUNT > 0,拋出 JS_0126_00062

-- 檢查是否有拆批記錄
SELECT COUNT(*) FROM SFT_BATCH_REC WHERE BR001 = N'{wo_no}'
-- 若 COUNT > 0,拋出 remind_004

-- 刪除相關資料(依序執行)
DELETE FROM SFT_OP_REALRUN WHERE ID = :CMOID
DELETE FROM LOT WHERE MOID = :CMOID
DELETE FROM MODETAIL WHERE CMOID = :CMOID
DELETE FROM SFT_SPEC_MODIREC WHERE MD001 = :CMOID
DELETE FROM SFT_BATCH_REC WHERE BR002 = :CMOID
DELETE FROM EQUIPMENT_RUN WHERE LOTID = :CMOID
DELETE FROM SFT_WS_RUN WHERE ID = :CMOID
DELETE FROM SFT_SPLITOUT_REC WHERE SSR001 = :CMOID
DELETE FROM SFT_ASSEMBLY_REC WHERE SAR001 = :CMOID
DELETE FROM SFT_HOLD_REC WHERE HR001 = :CMOID
DELETE FROM SFT_MO_MODI WHERE MODI002 = :CMOID

8.2 status=2 結案

-- 檢查製令是否暫停中
jsonQueryFactory.sqlQuery_checkMoidIsHold(dataObject)
-- 若暫停中,拋出 JS_0115_00014

-- 檢查是否有未完工製程
jsonQueryFactory.checkHaveUndoneOp(dataObject)
-- 若有未完工製程,拋出 JS_0115_00017

-- 執行結案流程(由 JsonQueryFactory 處理)
-- 更新 MODETAIL.STATUS = 99
UPDATE MODETAIL SET
    STATUS = 99,
    LASTMAINTAINUSER = :userid,
    LASTMAINTAINDATETIME = N'{當前時間}'
WHERE CMOID = :CMOID

8.3 status=3 取消結案

-- 檢查製令是否已結案
SELECT COUNT(*) FROM MODETAIL WITH (NOLOCK)
WHERE CMOID = N'{wo_no}'
  AND STATUS NOT IN ('99', '100')
-- 若 COUNT > 0,表示未結案,拋出 JS_0126_00059

-- 還原結案狀態(由結案流程反向執行)
-- 根據 SFT_WS_RUN 進站記錄判斷還原狀態
UPDATE MODETAIL SET
    STATUS = CASE
        WHEN (SELECT COUNT(1) FROM SFT_WS_RUN WITH (NOLOCK)
              WHERE ID = N'{wo_no}' AND EXECUTETYPE = 'checkIn') > 0
        THEN 2  -- 有進站記錄 → 生產中
        ELSE 1  -- 無進站記錄 → 未生產
    END,
    LASTMAINTAINUSER = :userid,
    LASTMAINTAINDATETIME = N'{當前時間}'
WHERE CMOID = :CMOID
刪除關聯資料表說明
資料表說明
SFT_OP_REALRUN製程實績記錄
LOT批次記錄
MODETAIL製令主檔
SFT_SPEC_MODIREC特殊修改記錄
SFT_BATCH_REC拆批記錄
EQUIPMENT_RUN機台運行記錄
SFT_WS_RUN工作站運行記錄
SFT_SPLITOUT_REC分出記錄
SFT_ASSEMBLY_REC組裝記錄
SFT_HOLD_REC暫停記錄
SFT_MO_MODI補發放數量記錄
程式位置
API 入口:ESBapi.java:1400-1493
狀態檢核:WoStatusProcess.java:66-108