工單更新(數量/日期調整)

wo.update
PUT JSON 同步 ERP → MES

1. 基本資訊

項目說明
API 中文名稱工單更新(製令數量/日期調整)
API 英文名稱Work Order Update
API Codewo.update
案號0189142
REST EndpointPOST /ESB/API/upModetail
呼叫方向ERP → MES
呼叫時機ERP 修改工單數量或日期後,同步至 MES
主要業務情境ERP 調整製令產量或排程日期,同步更新 MES 的製令及批次資料
Request 格式JSON (Content-Type: application/json)
同步/非同步同步呼叫
交易控管需要
呼叫方向說明
此 API 為 ERP → MES 單向推送。
OperationType = 2 表示修改操作。

2. 業務流程

ERP 系統 MES 系統 1. 修改工單 (wo.update) 2. 數量檢核 (WoUpdate) 3. 更新製令 (MODETAIL) 4. 調整批次 (LOT) 完成 數量檢核邏輯 newQTY vs (MOQTY - MODIQTY) 增加:直接增加 LOTSIZE 扣除:檢查可變更額度 程式位置: WoUpdate.java → RegularESB.upModetail():1243-1472
程式碼對應
  • API 入口: WoUpdate.java:59-100
  • 數量檢核: RegularESB.java:1234-1319
  • LOT 更新: RegularESB.java:1243-1472
  • 製程重算: SFT_OP_REALRUN.sqlUpdate_RecalculateAll()

3. Request 規格

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

3.1 外層結構

欄位型別必填說明
CompanyIDstringY公司代號
OperationTypeintY操作類型(2=修改
contentarrayY工單資料陣列

3.2 content 陣列內容

欄位型別必填說明異動欄位
wo_nostringY製令編號(單別-單號)條件欄位
item_nostringY品號ITEMID
unit_nostringY單位代號UNIT
plan_date_sstringY預計開工日PLANPROCESSST
plan_date_estringY預計完工日DUEDATETIME
wo_qtydecimalY新預計產量QTY / PLANRELEASEQTY / LOT.LOTSIZE
so_nostringN訂單單號DOID
so_seqstringN訂單項次SEQUENCE
factory_nostringY廠別代號FACTORYID
warehouse_nostringN庫別代號WAREHOUSEID
remarkstringN備註DESCRIPTION
prioritystringN優先級MO032

4. Response 規格

欄位型別說明
codestring200=成功,500=失敗
msgstring處理結果訊息
queryarray查詢結果

成功行為

5. 數量檢核邏輯

關鍵變數定義
  • MOQTY: MODETAIL.PLANRELEASEQTY(原預計發放量)
  • MOREQTY: MODETAIL.RELEASEDQTY(已發放量)
  • LOTQTY: LOT.LOTSIZE(待發放量)
  • newQTY: ERP 傳入的新產量
  • MODIQTY: SFT_MO_MODI 合計(補發放量)
  • BATQTY: SFT_BATCH_REC 合計(拆批量)

5.1 增加數量情況

newQTY > (MOQTY - MODIQTY)

// 增加數量 - 直接增加
增加量 = newQTY - (MOQTY - MODIQTY)

IF LOT 存在 THEN
    UPDATE LOT SET LOTSIZE += 增加量
ELSE
    INSERT LOT (新建批次記錄)
END IF

UPDATE MODETAIL SET PLANRELEASEQTY += 增加量

5.2 扣除數量情況

newQTY < (MOQTY - MODIQTY)

// 扣除數量 - 需檢查可變更額度
最大可變更量 = MOQTY - MOREQTY - BATQTY
此次變更量 = MOQTY - newQTY - MODIQTY

IF 最大可變更量 >= 此次變更量 THEN
    // 可以扣除
    IF LOTQTY - 此次變更量 > 0 THEN
        UPDATE LOT SET LOTSIZE -= 此次變更量
    ELSE
        DELETE FROM LOT  // 扣除後數量為零或負數
    END IF
    UPDATE MODETAIL SET PLANRELEASEQTY -= 此次變更量
ELSE
    // 無法扣除 - 已發放或拆批超過可變更額度
    Throw Exception("JS_0126_00060")
END IF
重要限制
若 MES 端已發放數量 + 拆批數量 > 新產量,將無法進行扣除,會拋出錯誤 JS_0126_00060

5.3 流程圖

newQTY vs (MOQTY-MODIQTY) 增加數量 直接增加 LOTSIZE > 可變更額度 足夠? < 扣除數量 減少 LOTSIZE 拋出錯誤 JS_0126_00060 程式位置: RegularESB.java:1234-1319

6. 錯誤代碼

代碼訊息說明
JS_0126_00060變更數量小於待發放數量,不允許異動扣除數量超過可變更額度
JS_0096_00058此品號不存在ITEM 表無此品號
JS_0016_00134單位不存在,請確認UnitBasis 無此單位
JS_0016_00115廠別代號不存在FACTORY 無此廠別
JS_0135_00036此庫別代號不存在WAREHOUSE 無此庫別
remind_002資料不存在製令編號不存在

7. JSON 範例

Request(增加數量)

{
  "CompanyID": "COMP01",
  "OperationType": 2,  // 2=修改
  "content": [{
    "wo_no": "5101-20260319001",
    "item_no": "FG-A001-001",
    "unit_no": "PCS",
    "plan_date_s": "2026-03-19 08:00:00",
    "plan_date_e": "2026-03-21 17:00:00",
    "wo_qty": 1500,  // 原本 1000,增加 500
    "factory_no": "P001",
    "remark": "追加訂單"
  }]
}

Request(扣除數量)

{
  "CompanyID": "COMP01",
  "OperationType": 2,
  "content": [{
    "wo_no": "5101-20260319001",
    "item_no": "FG-A001-001",
    "unit_no": "PCS",
    "plan_date_s": "2026-03-19 08:00:00",
    "plan_date_e": "2026-03-20 17:00:00",
    "wo_qty": 800,  // 原本 1000,扣除 200
    "factory_no": "P001",
    "remark": "客戶減少訂單"
  }]
}

Response (成功)

{
  "code": "200",
  "msg": "success",
  "query": []
}

Response (失敗 - 無法扣除)

{
  "code": "500",
  "msg": "JS_0126_00060",  // 已發放數量超過新數量
  "query": []
}

8. 資料庫更新 SQL

8.1 UPDATE MODETAIL(更新製令主檔)

UPDATE MODETAIL SET
    PLANPROCESSST = :PLANPROCESSST,      -- 預計開工日
    DUEDATETIME = :DUEDATETIME,          -- 預計完工日
    DOID = :DOID,                        -- 訂單單號
    SEQUENCE = :SEQUENCE,                -- 訂單項次
    FACTORYID = :FACTORYID,              -- 廠別代號
    WAREHOUSEID = :WAREHOUSEID,          -- 庫別代號
    DESCRIPTION = :DESCRIPTION,          -- 備註
    MO032 = :MO032,                      -- 優先級
    LASTMAINTAINUSER = :userid,
    LASTMAINTAINDATETIME = N'{當前時間}',
    FLAG = (SELECT MAX(FLAG)+1 FROM MODETAIL WHERE CMOID = :CMOID)
WHERE CMOID = :CMOID

8.2 數量增加時(UPDATE LOT)

-- 增加數量 = newQTY - (MOQTY - MODIQTY)
UPDATE LOT SET
    LOTSIZE = LOTSIZE + {增加量}
WHERE MOID = :CMOID

-- 同時更新 MODETAIL 預計發放量
UPDATE MODETAIL SET
    PLANRELEASEQTY = PLANRELEASEQTY + {增加量},
    QTY = :newQTY
WHERE CMOID = :CMOID

8.3 數量扣除時(UPDATE/DELETE LOT)

-- 扣除數量 = MOQTY - newQTY - MODIQTY
-- 先檢查可變更額度
最大可變更量 = MOQTY - MOREQTY - BATQTY

IF LOTQTY - 扣除數量 > 0 THEN
    -- 扣除後還有餘量
    UPDATE LOT SET
        LOTSIZE = LOTSIZE - {扣除量}
    WHERE MOID = :CMOID
ELSE
    -- 扣除後數量為零或負數,刪除批次
    DELETE FROM LOT WHERE MOID = :CMOID
END IF

-- 同時更新 MODETAIL 預計發放量
UPDATE MODETAIL SET
    PLANRELEASEQTY = PLANRELEASEQTY - {扣除量},
    QTY = :newQTY
WHERE CMOID = :CMOID

8.4 重算製程

-- 更新完成後重算所有製程
SFT_OP_REALRUN.sqlUpdate_RecalculateAll("updateMODETAIL")
數量檢核相關資料表
  • MODETAIL.PLANRELEASEQTY:預計發放量 (MOQTY)
  • MODETAIL.RELEASEDQTY:已發放量 (MOREQTY)
  • LOT.LOTSIZE:待發放量 (LOTQTY)
  • SFT_MO_MODI:補發放量 (MODIQTY)
  • SFT_BATCH_REC:拆批量 (BATQTY)
程式位置
數量檢核:RegularESB.java:1234-1319
LOT 更新:RegularESB.java:1243-1472