อัปเดตใบสั่งผลิต (ปรับจำนวน/วันที่)

wo.update
PUT JSON ซิงโครนัส ERP → MES

1. ข้อมูลพื้นฐาน

รายการคำอธิบาย
ชื่อ API ภาษาไทยอัปเดตใบสั่งผลิต (ปรับจำนวน/วันที่ใบสั่งผลิต)
ชื่อ API ภาษาอังกฤษWork Order Update
รหัส APIwo.update
หมายเลขเคส0189142
REST EndpointPOST /ESB/API/upModetail
ทิศทางการเรียกERP → MES
เวลาที่เรียกหลังจาก ERP แก้ไขจำนวนหรือวันที่ใบสั่งผลิต ซิงค์ไปยัง MES
สถานการณ์ทางธุรกิจหลักERP ปรับจำนวนผลิตหรือวันที่ตามกำหนดการของใบสั่งผลิต อัปเดตใบสั่งผลิตและข้อมูลแบตช์ใน MES พร้อมกัน
รูปแบบ RequestJSON (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