Work Order Create

wo.create
POST JSON Sync ERP → MES

1. Basic Information

ItemDescription
API Chinese NameWork Order Create (Manufacturing Order Create)
API English NameWork Order Create
API Codewo.create
Case Number0189142
REST EndpointPOST /ESB/API/upModetail
Call DirectionERP → MES
Trigger TimingWhen ERP creates a new work order, sync to MES
Main Business ScenarioAfter ERP creates a manufacturing order, push work order information to MES, MES creates corresponding order, lot and process records
Request FormatJSON (Content-Type: application/json)
Sync/AsyncSynchronous call
Transaction ControlRequired (setAutoCommit(false) + transactionCommit())
Call Direction Note
This API is ERP → MES one-way push, ERP actively calls MES interface to create work order data.

2. Business Flow

ERP System MES System 1. Create Order (wo.create) 2. Validate Data (WoCreate) 3. Create Order (MODETAIL) 4. Create Lot (LOT) 5. Initialize (Process) initOpRealRun_SftBommf() initProcessTime() → SFT_OP_REALRUN initialization Code Location: WoCreate.java → RegularESB.upModetail() → ESBapi.java:975-1007
Code Reference
  • API Entry: WoCreate.java (SFT_ERPIntegrate)
  • Core Logic: RegularESB.upModetail() (SFT_dataImport)
  • SQL Execution: ESBapi.java:975-1007 (KMI_Restful)
  • Process Initialization: dataMantain.initOpRealRun_SftBommf()

3. Request Specification

Format: JSON
Content-Type: application/json

3.1 Outer Structure

FieldTypeRequiredDescription
CompanyIDstringYCompany code
OperationTypeintYOperation type (1=Create)
contentarrayYWork order data array

3.2 content Array Contents

FieldTypeLengthRequiredDescriptionMES Field
wo_nostring40YWork order number (type-number)CMOID
item_nostring40YItem numberITEMID
unit_nostring10YUnit codeUNIT
plan_date_sstring19YPlanned start date (yyyy-MM-dd HH:mm:ss)PLANPROCESSST
plan_date_estring19YPlanned end date (yyyy-MM-dd HH:mm:ss)DUEDATETIME
wo_qtydecimal-YPlanned quantityQTY / PLANRELEASEQTY
so_nostring40NSales order numberDOID
so_seqstring10NSales order lineSEQUENCE
factory_nostring10YFactory codeFACTORYID
warehouse_nostring10NWarehouse codeWAREHOUSEID
remarkstring500NRemarksDESCRIPTION
prioritystring1NPriority (1=Urgent, 0=No)MO032

4. Response Specification

FieldTypeDescription
codestring200=Success, 500=Failure
msgstringProcessing result message (returns order number on success)
queryarrayQuery result (usually empty array)

Success Behavior

5. Validation Rules

#Validation ItemRuleError Code
1Order number duplicateCMOID cannot exist in MODETAILJS_0126_00061
2Item existsITEMID must exist in ITEM tableJS_0096_00058
3Unit existsunit_no must exist in UnitBasisJS_0016_00134
4Factory existsfactory_no must exist in FACTORYJS_0016_00115
5Warehouse existswarehouse_no (if provided) must exist in WAREHOUSEJS_0135_00036
6Quantity validationwo_qty must be greater than 0-

6. Error Codes

CodeMessageDescription
JS_0126_00061Work order number already exists, cannot createCMOID duplicate
JS_0096_00058Item number does not existItem not found in ITEM table
JS_0016_00134Unit does not exist, please confirmUnit not found in UnitBasis
JS_0016_00115Factory code does not existFactory not found in FACTORY
JS_0135_00036Warehouse code does not existWarehouse not found in WAREHOUSE
remind_001Data already existsDuplicate create

7. JSON Examples

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": "Urgent order",
    "priority": "1"
  }]
}

Response (Success)

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

Response (Failure - Order Already Exists)

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

8. Related Database Tables

8.1 MODETAIL (Work Order Master)

FieldTypeDescription
CMOIDNVARCHAR(40)PK: Work order number (type-number)
MO004NVARCHAR(10)Order type
MO005NVARCHAR(20)Order number
ITEMIDNVARCHAR(40)Item number
QTYFLOATPlanned quantity
PLANRELEASEQTYFLOATPlanned release quantity
RELEASEDQTYFLOATReleased quantity
STATUSINTStatus (1=Not started 2=In progress 99=Closed 100=Cancelled)
PLANPROCESSSTDATETIMEPlanned start date
DUEDATETIMEDATETIMEPlanned end date
FLAGINTVersion number

8.2 LOT (Lot Record)

FieldTypeDescription
IDNVARCHAR(40)PK: Lot number (usually=CMOID)
MOIDNVARCHAR(40)FK: Work order number
TYPEINTLot type (1=Planned lot)
LOTSIZEFLOATLot quantity (pending release quantity)
STATUSINTStatus (0=Pending release 1=Released)
LOCATIONNVARCHAR(20)Location (usually='release')

9. Database Update SQL

9.1 Check if Order Exists

-- Check before create, throw JS_0126_00061 if exists
SELECT COUNT(1) FROM MODETAIL WHERE CMOID = N'{wo_no}'

9.2 INSERT MODETAIL (Create Work Order Master)

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,              -- Work order number (type-number)
    :MO004,              -- Order type
    :MO005,              -- Order number
    :ITEMID,             -- Item number
    :MO021,              -- Item name
    :MO022,              -- Specification
    :UNIT,               -- Unit
    :PLANPROCESSST,      -- Planned start date
    :DUEDATETIME,        -- Planned end date
    :QTY,                -- Planned quantity
    1,                   -- STATUS = 1 (Not started)
    :DOID,               -- Sales order number
    :SEQUENCE,           -- Sales order line
    :FACTORYID,          -- Factory code
    :WAREHOUSEID,        -- Warehouse code
    :DESCRIPTION,        -- Remarks
    1,                   -- MO008 = 1
    :MO012,              -- Order date
    0,                   -- MO016 = 0
    :MO032,              -- Priority (1=Urgent)
    :QTY,                -- Planned release qty = Planned qty
    1,                   -- FLAG version number
    :userid,
    N'{current_time}'
)

9.3 INSERT LOT (Create Lot Record)

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,              -- Lot number = Work order number
    1,                   -- TYPE = 1 (Planned lot)
    :CMOID,              -- MOID = Work order number
    :ITEMID,             -- Item number
    :QTY,                -- LOTSIZE = Planned quantity
    0,                   -- STATUS = 0 (Pending release)
    :UNIT,               -- Unit
    1,                   -- QTYPER = 1
    'release',           -- LOCATION = 'release'
    '', '', '',          -- ERP process fields (empty)
    1, 0, 0,             -- LOT004, PKQTY, PKQTYPER
    '0', 'N',            -- LOT007, LOT011
    :userid,
    N'{current_time}'
)

9.4 Initialize Process SFT_OP_REALRUN (Read from SFT_BOMMF)

-- Check if item has standard routing
SELECT ME007 FROM SFT_BOMME, MODETAIL, ITEM
WHERE ITEM.ID = MODETAIL.ITEMID
  AND CMOID = N'{wo_no}'
  AND RTRIM(ME001) = ITEM.STDROUTEITEMID
  AND RTRIM(ME002) = ITEM.STDROUTEID

-- If has routing, delete then insert
DELETE SFT_OP_REALRUN WHERE ID = N'{wo_no}'

-- Copy process data from SFT_BOMMF
INSERT INTO SFT_OP_REALRUN (
    ID, SEQUENCE, OPID, OPDESCRIPTION,
    ARRIVEQTY, OUTQTY, REWORKQTY, DEFECTQTY,
    ERP_OPSEQ, PERLOTWORKTIME, STANDARDEQWORKTIME, STANDARDMANWORKTIME,
    ERP_OPID, ERP_WSID, ERP_FIXEDLEADTIME, ERP_TRANSQTY, ...
)
SELECT
    CMOID,                          -- ID = Work order number
    0,                              -- SEQUENCE = 0
    RTRIM(MF004)+'---'+RTRIM(MF006), -- OPID = Process+Workstation
    MF008,                          -- OPDESCRIPTION = Process description
    0, 0, 0, 0,                     -- Quantity fields init to 0
    RTRIM(MF003),                   -- ERP_OPSEQ = Process sequence
    MF019,                          -- PERLOTWORKTIME = Per lot work time
    ...
FROM SFT_BOMMF, MODETAIL, ITEM
WHERE ITEM.ID = MODETAIL.ITEMID
  AND CMOID = N'{wo_no}'
  AND RTRIM(MF001) = ITEM.STDROUTEITEMID
  AND RTRIM(MF002) = ITEM.STDROUTEID
Tables Affected by Work Order Creation
TableOperationDescription
MODETAILINSERTWork order master
LOTINSERTLot record
SFT_OP_REALRUNDELETE + INSERTProcess execution (copy from SFT_BOMMF)
SFT_OP_BACK_RUNDELETE + INSERTProcess routing relationships (network routing)
Code Location
SQL Execution: ESBapi.java:1007-1046
Process Initialization: dataMantain.initOpRealRun_SftBommf()
Routing Relationships: UpdateData.InsertOpBackRun()