สร้างใบสั่งผลิต

wo.create
POST JSON ซิงโครนัส ERP → MES

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

รายการคำอธิบาย
ชื่อ API ภาษาไทยสร้างใบสั่งผลิต (เพิ่มข้อมูลใบสั่งผลิต)
ชื่อ API ภาษาอังกฤษWork Order Create
รหัส APIwo.create
หมายเลขเคส0189142
REST EndpointPOST /ESB/API/upModetail
ทิศทางการเรียกERP → MES
เวลาที่เรียกหลังจาก ERP ออกใบสั่งผลิตใหม่ ซิงค์ไปยัง MES
สถานการณ์ทางธุรกิจหลักหลังจาก ERP สร้างใบสั่งผลิต ส่งข้อมูลใบสั่งผลิตไปยัง MES และ MES สร้างใบสั่งผลิต แบตช์ และบันทึกกระบวนการที่เกี่ยวข้อง
รูปแบบ RequestJSON (Content-Type: application/json)
ซิงโครนัส/อะซิงโครนัสเรียกแบบซิงโครนัส
การควบคุมธุรกรรมต้องการ (setAutoCommit(false) + transactionCommit())
คำอธิบายทิศทางการเรียก
API นี้เป็นการส่งทางเดียว ERP → MES โดย ERP เรียกอินเทอร์เฟซ MES เพื่อเพิ่มข้อมูลใบสั่งผลิต

2. กระบวนการทางธุรกิจ

ระบบ ERP ระบบ MES 1. ออกใบสั่งผลิต (wo.create) 2. ตรวจสอบข้อมูล (WoCreate) 3. เพิ่มใบสั่งผลิต (MODETAIL) 4. สร้างแบตช์ (LOT) 5. เริ่มต้น (กระบวนการ) initOpRealRun_SftBommf() initProcessTime() → เริ่มต้น SFT_OP_REALRUN ตำแหน่งโปรแกรม: WoCreate.java → RegularESB.upModetail() → ESBapi.java:975-1007
ตำแหน่งโค้ด
  • จุดเข้า API: WoCreate.java (SFT_ERPIntegrate)
  • ลอจิกหลัก: RegularESB.upModetail() (SFT_dataImport)
  • ดำเนินการ SQL: ESBapi.java:975-1007 (KMI_Restful)
  • เริ่มต้นกระบวนการ: dataMantain.initOpRealRun_SftBommf()

3. ข้อกำหนด Request

รูปแบบการส่ง: JSON
Content-Type: application/json

3.1 โครงสร้างชั้นนอก

ฟิลด์ประเภทจำเป็นคำอธิบาย
CompanyIDstringYรหัสบริษัท
OperationTypeintYประเภทการดำเนินการ (1=เพิ่ม)
contentarrayYอาร์เรย์ข้อมูลใบสั่งผลิต

3.2 เนื้อหาอาร์เรย์ content

ฟิลด์ประเภทความยาวจำเป็นคำอธิบายฟิลด์ MES
wo_nostring40Yหมายเลขใบสั่งผลิต (ประเภท-เลขที่)CMOID
item_nostring40Yรหัสสินค้าITEMID
unit_nostring10Yรหัสหน่วยUNIT
plan_date_sstring19Yวันเริ่มต้นตามแผน (yyyy-MM-dd HH:mm:ss)PLANPROCESSST
plan_date_estring19Yวันเสร็จสิ้นตามแผน (yyyy-MM-dd HH:mm:ss)DUEDATETIME
wo_qtydecimal-YจำนวนผลิตตามแผนQTY / PLANRELEASEQTY
so_nostring40Nหมายเลขใบสั่งซื้อDOID
so_seqstring10Nลำดับใบสั่งซื้อSEQUENCE
factory_nostring10YรหัสโรงงานFACTORYID
warehouse_nostring10Nรหัสคลังสินค้าWAREHOUSEID
remarkstring500NหมายเหตุDESCRIPTION
prioritystring1Nลำดับความสำคัญ (1=ด่วน, 0=ไม่)MO032

4. ข้อกำหนด Response

ฟิลด์ประเภทคำอธิบาย
codestring200=สำเร็จ, 500=ล้มเหลว
msgstringข้อความผลการประมวลผล (เมื่อสำเร็จจะส่งกลับหมายเลขใบสั่งผลิต)
queryarrayผลการค้นหา (โดยปกติเป็นอาร์เรย์ว่าง)

พฤติกรรมเมื่อสำเร็จ

5. กฎการตรวจสอบ

#รายการตรวจสอบกฎรหัสข้อผิดพลาด
1หมายเลขใบสั่งผลิตซ้ำCMOID ต้องไม่ซ้ำใน MODETAILJS_0126_00061
2รหัสสินค้าต้องมีอยู่ITEMID ต้องมีอยู่ในตาราง ITEMJS_0096_00058
3หน่วยต้องมีอยู่unit_no ต้องมีอยู่ใน UnitBasisJS_0016_00134
4โรงงานต้องมีอยู่factory_no ต้องมีอยู่ใน FACTORYJS_0016_00115
5คลังสินค้าต้องมีอยู่warehouse_no (ถ้ามีค่า) ต้องมีอยู่ใน WAREHOUSEJS_0135_00036
6ตรวจสอบจำนวนwo_qty ต้องมากกว่า 0-

6. รหัสข้อผิดพลาด

รหัสข้อความคำอธิบาย
JS_0126_00061หมายเลขใบสั่งผลิตมีอยู่แล้ว ไม่สามารถเพิ่มได้CMOID ซ้ำ
JS_0096_00058รหัสสินค้านี้ไม่มีอยู่ไม่พบรหัสสินค้าในตาราง ITEM
JS_0016_00134หน่วยไม่มีอยู่ กรุณาตรวจสอบไม่พบหน่วยนี้ใน UnitBasis
JS_0016_00115รหัสโรงงานไม่มีอยู่ไม่พบโรงงานนี้ใน FACTORY
JS_0135_00036รหัสคลังสินค้านี้ไม่มีอยู่ไม่พบคลังสินค้านี้ใน WAREHOUSE
remind_001ข้อมูลมีอยู่แล้วเพิ่มซ้ำ

7. ตัวอย่าง JSON

Request

{
  "CompanyID": "COMP01",
  "OperationType": 1,
  "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": 1000,
    "so_no": "SO20260301001",
    "so_seq": "001",
    "factory_no": "P001",
    "warehouse_no": "FG01",
    "remark": "คำสั่งด่วน",
    "priority": "1"
  }]
}

Response (สำเร็จ)

{
  "code": "200",
  "msg": "[\"5101-20260319001\"]",
  "query": []
}

Response (ล้มเหลว - ใบสั่งผลิตมีอยู่แล้ว)

{
  "code": "500",
  "msg": "JS_0126_00061",
  "query": []
}

8. ตารางข้อมูลที่เกี่ยวข้อง

8.1 MODETAIL (ตารางหลักใบสั่งผลิต)

ฟิลด์ประเภทคำอธิบาย
CMOIDNVARCHAR(40)PK: หมายเลขใบสั่งผลิต (ประเภท-เลขที่)
MO004NVARCHAR(10)ประเภทใบสั่งผลิต
MO005NVARCHAR(20)เลขที่ใบสั่งผลิต
ITEMIDNVARCHAR(40)รหัสสินค้า
QTYFLOATจำนวนผลิตตามแผน
PLANRELEASEQTYFLOATจำนวนปล่อยตามแผน
RELEASEDQTYFLOATจำนวนที่ปล่อยแล้ว
STATUSINTสถานะ (1=ยังไม่ผลิต 2=กำลังผลิต 99=ปิดงาน 100=ยกเลิก)
PLANPROCESSSTDATETIMEวันเริ่มต้นตามแผน
DUEDATETIMEDATETIMEวันเสร็จสิ้นตามแผน
FLAGINTหมายเลขเวอร์ชัน

8.2 LOT (บันทึกแบตช์)

ฟิลด์ประเภทคำอธิบาย
IDNVARCHAR(40)PK: หมายเลขแบตช์ (โดยปกติ=CMOID)
MOIDNVARCHAR(40)FK: หมายเลขใบสั่งผลิต
TYPEINTประเภทแบตช์ (1=แบตช์ตามแผน)
LOTSIZEFLOATจำนวนแบตช์ (จำนวนรอปล่อย)
STATUSINTสถานะ (0=รอปล่อย 1=ปล่อยแล้ว)
LOCATIONNVARCHAR(20)ตำแหน่ง (โดยปกติ='release')

9. SQL อัปเดตฐานข้อมูล

9.1 ตรวจสอบว่าใบสั่งผลิตมีอยู่หรือไม่

-- ตรวจสอบก่อนเพิ่ม ถ้ามีอยู่จะโยน JS_0126_00061
SELECT COUNT(1) FROM MODETAIL WHERE CMOID = N'{wo_no}'

9.2 INSERT MODETAIL (เพิ่มตารางหลักใบสั่งผลิต)

INSERT INTO MODETAIL (
    CMOID, MO004, MO005, ITEMID, MO021, MO022, UNIT,
    PLANPROCESSST, DUEDATETIME, QTY, STATUS, DOID,
    SEQUENCE, FACTORYID, WAREHOUSEID, DESCRIPTION,
    MO008, MO012, MO016, MO032, PLANRELEASEQTY,
    FLAG, LASTMAINTAINUSER, LASTMAINTAINDATETIME
) VALUES (
    :CMOID,              -- หมายเลขใบสั่งผลิต (ประเภท-เลขที่)
    :MO004,              -- ประเภทใบสั่งผลิต
    :MO005,              -- เลขที่ใบสั่งผลิต
    :ITEMID,             -- รหัสสินค้า
    :MO021,              -- ชื่อสินค้า
    :MO022,              -- สเปค
    :UNIT,               -- หน่วย
    :PLANPROCESSST,      -- วันเริ่มต้นตามแผน
    :DUEDATETIME,        -- วันเสร็จสิ้นตามแผน
    :QTY,                -- จำนวนผลิตตามแผน
    1,                   -- STATUS = 1 (ยังไม่ผลิต)
    :DOID,               -- หมายเลขใบสั่งซื้อ
    :SEQUENCE,           -- ลำดับใบสั่งซื้อ
    :FACTORYID,          -- รหัสโรงงาน
    :WAREHOUSEID,        -- รหัสคลังสินค้า
    :DESCRIPTION,        -- หมายเหตุ
    1,                   -- MO008 = 1
    :MO012,              -- วันที่ออกใบสั่ง
    0,                   -- MO016 = 0
    :MO032,              -- ลำดับความสำคัญ (1=ด่วน)
    :QTY,                -- จำนวนปล่อยตามแผน = จำนวนผลิตตามแผน
    1,                   -- FLAG หมายเลขเวอร์ชัน
    :userid,
    N'{เวลาปัจจุบัน}'
)

9.3 INSERT LOT (เพิ่มบันทึกแบตช์)

INSERT INTO LOT (
    ID, TYPE, MOID, ITEMID, LOTSIZE, STATUS, UNIT,
    QTYPER, LOCATION, ERP_OPSEQ, ERP_OPID, ERP_WSID,
    LOT004, PKQTY, PKQTYPER, LOT007, LOT011,
    LASTMAINTAINUSER, LASTMAINTAINDATETIME
) VALUES (
    :CMOID,              -- หมายเลขแบตช์ = หมายเลขใบสั่งผลิต
    1,                   -- TYPE = 1 (แบตช์ตามแผน)
    :CMOID,              -- MOID = หมายเลขใบสั่งผลิต
    :ITEMID,             -- รหัสสินค้า
    :QTY,                -- LOTSIZE = จำนวนผลิตตามแผน
    0,                   -- STATUS = 0 (รอปล่อย)
    :UNIT,               -- หน่วย
    1,                   -- QTYPER = 1
    'release',           -- LOCATION = 'release'
    '', '', '',          -- ฟิลด์กระบวนการ ERP (ว่าง)
    1, 0, 0,             -- LOT004, PKQTY, PKQTYPER
    '0', 'N',            -- LOT007, LOT011
    :userid,
    N'{เวลาปัจจุบัน}'
)
รายการตารางข้อมูลที่ได้รับผลกระทบจากการเพิ่มใบสั่งผลิต
ตารางข้อมูลการดำเนินการคำอธิบาย
MODETAILINSERTตารางหลักใบสั่งผลิต
LOTINSERTบันทึกแบตช์
SFT_OP_REALRUNDELETE + INSERTผลการดำเนินการกระบวนการ (คัดลอกจาก SFT_BOMMF)
SFT_OP_BACK_RUNDELETE + INSERTความสัมพันธ์กระบวนการก่อน-หลัง (เส้นทางแบบตาข่าย)
ตำแหน่งโปรแกรม
ดำเนินการ SQL: ESBapi.java:1007-1046
เริ่มต้นกระบวนการ: dataMantain.initOpRealRun_SftBommf()
ความสัมพันธ์ก่อน-หลัง: UpdateData.InsertOpBackRun()