After work order checkout is completed, send the work report data (production report) to the ERP system. After ERP returns the report number, MES writes it back to SFT_OP_REALRUN and SFT_WS_RUN.
MainDataHead.generateProductionForm() method
to send work report data to ERP.
| Field | MES Field | ERP Field | Type | Required | Description |
|---|---|---|---|---|---|
| Report Type | TD001 |
doc_type_no |
String | Required | Work report type code |
| Report Date | TD003 |
create_date |
Date | Required | Work report date (yyyy-MM-dd) |
| Workstation | TD004 |
workstation_no |
String | Required | ERP Workstation ID (ERP_WSID) |
| Remark | TD006 |
remark |
String | Optional | Work report remark |
| Item Code-Name | itemCode-itemName |
source_no |
String | Optional | Product source identifier |
| Field | MES Field | ERP Field | Type | Required | Description |
|---|---|---|---|---|---|
| Reporter | TE004 |
reporter |
String | Required | Operator ID |
| Machine No. | TE005 |
machine_no |
String | Required | Equipment ID (eqId) |
| WO Type | TE006 |
wo_no |
String | Required | Work order type (moType) |
| WO Number | TE007 |
String | Required | Work order number (moCode), combined with WO type | |
| Operation Seq | TE008 |
op_seq |
String | Required | Operation sequence (ERP_OPSEQ) |
| Operation Code | TE009 |
op_no |
String | Required | Operation code (ERP_OPID) |
| Report Qty | TE011 |
qty |
Numeric | Required | Completed quantity |
| Labor Hours | TE012 |
labor_hours |
Numeric | Required | Labor hours (minutes) |
| Machine Hours | TE013 |
machine_hours |
Numeric | Required | Machine hours (minutes) |
| Remark | TE015 |
remark |
String | Optional | Line remark |
| Complete Date | - |
complete_date |
Date | Optional | Operation complete date |
| Unit | TE020 |
unit_no |
String | Optional | Base unit |
| Dual Unit | TWINUNIT |
- |
String | Optional | Manufacturing dual unit name |
{
"head": {
"productionType": "10",
"date": "2026-03-19",
"wsId": "WS001",
"remark": "Normal work report",
"itemCode": "ITEM-001",
"itemName": "Test Item",
"create": "USER001"
},
"line": [
{
"userId": "USER001",
"eqId": "EQ001",
"moType": "5101",
"moCode": "20260319001",
"opSeq": "10",
"opId": "OP001",
"state": "1",
"qty": "100",
"useTime": "60",
"useMachineTime": "55",
"remark": "",
"packagingQty": "10",
"itemCode": "ITEM-001",
"itemName": "Test Item",
"description": "Specification",
"unit": "PCS",
"packUnit": "BOX",
"manufactureDualUnit": "BOX"
}
]
}
<parameters>
<parameter key="enterprise_no" type="string">Company Code</parameter>
<parameter key="site_no" type="string">Site Code</parameter>
<parameter key="report_data" type="data">
<data name="report">
<row seq="1">
<!-- ======== Head ======== -->
<field name="doc_type_no" type="string">10</field>
<field name="create_date" type="date">2026-03-19</field>
<field name="workstation_no" type="string">WS001</field>
<field name="remark" type="string">Normal work report</field>
<field name="factory_no" type="string"></field>
<field name="shift_no" type="string"></field>
<field name="source_no" type="string">ITEM-001-Test Item</field>
<field name="plot_no" type="string"></field>
<field name="doc_head_wo_no" type="string"></field>
<field name="doc_head_reporter" type="string"></field>
<field name="doc_head_complete_date" type="date"></field>
<field name="doc_head_machine_no" type="string"></field>
<field name="doc_head_unit_no" type="string"></field>
<field name="total_qty" type="numeric"></field>
<field name="total_labor_hours" type="numeric"></field>
<field name="total_machine_hours" type="numeric"></field>
<field name="total_number_of_operators" type="string"></field>
<field name="total_scrap_qty" type="numeric"></field>
<field name="total_shortage_qty" type="numeric"></field>
<field name="total_surplus_qty" type="numeric"></field>
<!-- ======== Line ======== -->
<detail name="report_detail">
<row>
<field name="seq" type="string"></field>
<field name="wo_no" type="string">5101-20260319001</field>
<field name="qty" type="numeric">100</field>
<field name="labor_hours" type="numeric">60</field>
<field name="machine_hours" type="numeric">55</field>
<field name="machine_no" type="string">EQ001</field>
<field name="op_seq" type="string">10</field>
<field name="op_no" type="string">OP001</field>
<field name="unit_no" type="string">PCS</field>
<field name="reporter" type="string">USER001</field>
<field name="report_datetime_e" type="string"></field>
<field name="number_of_operators" type="string"></field>
<field name="complete_date" type="date">2026-03-19</field>
<field name="remark" type="string"></field>
<field name="return_type" type="string"></field>
<field name="price" type="numeric"></field>
<field name="wages" type="numeric"></field>
</row>
</detail>
</row>
</data>
</parameter>
</parameters>
{
"code": 200,
"msg": "Work report created successfully",
"ERPMessage": {
"description": "Processing successful",
"report_no": "10-20260319001"
}
}
{
"code": 500,
"msg": "Work report creation failed",
"ERPMessage": {
"description": "Work order does not exist"
}
}
| Field | Type | Description |
|---|---|---|
code |
Integer | 200=Success, 500=Failure |
msg |
String | Processing message |
ERPMessage.report_no |
String | Work report number returned by ERP (type-number) |
After ERP returns the work report number, MES writes it back to the following tables:
-- Update SFT_OP_REALRUN
UPDATE SFT_OP_REALRUN
SET PRODUCTION_REPORTID = 'PDTYPE-PDNO',
PRODUCTION_REPORTSN = TE003
WHERE ID = :KEYID
AND ERP_OPSEQ = :TE008
AND ERP_OPID = :TE009
AND ERP_WSID = :TD004
AND SEQUENCE = :PRODUCTIONSEQ
-- Update SFT_WS_RUN
UPDATE SFT_WS_RUN
SET WR024 = 'PDTYPE-PDNO',
WR025 = TE003
WHERE (corresponding check-in/out record conditions)
EmploymentReportingItemized = "-1",
combined report mode is used, and related records are batch updated based on TD001 and TD002.
| Table | Description | Key Fields |
|---|---|---|
SFT_SFCTD |
Work Report Header | TD001 (Type), TD002 (No.), TD003 (Date), TD004 (Workstation) |
SFT_SFCTE |
Work Report Detail | TE001-TE002 (FK), TE003 (Line No.), TE011 (Qty) |
SFT_OP_REALRUN |
Operation Execution Record | PRODUCTION_REPORTID, PRODUCTION_REPORTSN |
SFT_WS_RUN |
Workstation Execution Record | WR024 (Report No.), WR025 (Report Seq) |
| Function | File Path | Line |
|---|---|---|
| Work Report Generation Entry | SFT_core/src/com/dci/sft/dataTrunk/MainDataHead.java | 354 |
| JSON Conversion | SFT_core/src/com/dci/sft/erp/webservice/SendFormSbyJson.java | 47-57 |
| Field Definition | SFT_core/src/com/dci/sft/erp/webservice/SendFormElementbyJson.java | 289-343 |
| XML Parameter Assembly | SFT_ERPIntegrate/src/com/dci/sft/erp/webservice/SendFormS.java | 1503-1577 |
| ERP Send | SFT_core/src/com/dci/sft/jsonMappingHibernate/TransOrderDataToJson.java | 1636-1645 |
| Write Back Processing | SFT_core/src/com/dci/sft/jsonMappingHibernate/TransOrderDataToJson.java | 1452-1527 |
| Error Type | Cause | Resolution |
|---|---|---|
SocketTimeoutException |
Connection timeout | Check ERP server status, resend |
ConnectException |
Cannot connect | Check network and ERP server status |
RemoteException |
Remote service error | Check ERP logs, contact ERP vendor |
| Work order does not exist | No such work order in ERP | Confirm work order is synced to ERP |
// Log file: logs/ERPReturnErrorRec.log
[ERP_SEND_ERROR] taskName=generateProductionForm, errorType=SocketTimeoutException, errorMsg=Read timed out
[ERP_SEND_ERROR] Content sent={...JSON...}