← กลับไปรายการ API

ยกเลิกใบรับสินค้าเสีย

ยกเลิก MES → ERP
wo.scrap.data.process

เมื่อ MES ยกเลิกการออกจากสถานี ถ้าใบโอนนั้นเป็นประเภทรับเข้าคลังของเสีย (TRANSORDERTYPE=58) จะเรียก API นี้เพื่อแจ้ง ERP ให้ยกเลิกใบรับสินค้าเสียที่เกี่ยวข้อง

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

ชื่อ API
wo.scrap.data.process
ชื่องานภายใน
woScrapDataProcess
รูปแบบการส่ง
JSON (Content-Type: application/json)
หมายเลขเคส
0189144
หมายเลข API
api-2192
TRANSORDERTYPE
58 (รับเข้าคลังของเสีย)

เวลาที่ทริกเกอร์

ยกเลิกออกจากสถานี CancelCheckOut ดำเนินการโดยผู้ใช้ ค้นหาประเภทใบโอน TRANSORDERTYPE SFT_TRANSORDER_LINE TYPE = 58? ใช่ woScrapDataProcess ยกเลิกใบรับสินค้าเสีย doc_no = TL011-TL012 =59 → outsourcingProcess อื่นๆ → cancelStockIn

ลอจิกการตัดสินยกเลิก API

เมื่อยกเลิกการออกจากสถานี ระบบจะตัดสินว่าจะเรียก API ยกเลิกตัวไหนโดยอ้างอิงจาก SFT_TRANSORDER_LINE.TRANSORDERTYPE:

TRANSORDERTYPE ประเภทเอกสาร API ที่เรียก ชื่องาน
58 รับเข้าคลังของเสีย wo.scrap.data.process woScrapDataProcess
59 รับเข้าคลังจ้างผลิต outsourcing.process outsourcingProcess
อื่นๆ รับเข้าคลังทั่วไป stockin.data.process cancelStockIn
ตำแหน่งโค้ด
ลอจิกการตัดสินอยู่ในเมธอด GeneralUpdater.excuteDeleteErpTransOrders() บรรทัดที่ 1577-1592

พารามิเตอร์ Request

ฟิลด์ ชื่อฟิลด์ ERP ประเภท จำเป็น คำอธิบาย
รหัสบริษัท enterprise_no String จำเป็น รหัสองค์กร
รหัสโรงงาน site_no String จำเป็น รหัสโรงงาน/ฝ่าย
เลขที่ใบรับสินค้าเสีย doc_no String จำเป็น เลขที่ใบรับเข้าคลังที่จะยกเลิก (รูปแบบ: TL011-TL012)
รูปแบบเลขที่ใบรับเข้าคลัง
รูปแบบเลขที่ใบรับเข้าคลังเป็น TL011-TL012 เช่น: 58-20260319001 ค่านี้มาจาก doc_no ที่ ERP ส่งกลับมาเมื่อสร้างใบรับสินค้าเสีย เก็บไว้ใน SFT_TRANSORDER_LINE

ตัวอย่าง Request

รูปแบบ JSON

{
  "enterprise_no": "COMP01",
  "site_no": "SITE01",
  "doc_no": "58-20260319001"
}

รูปแบบ ERP XML (WFERP)

<parameters>
  <parameter key="enterprise_no" type="string">COMP01</parameter>
  <parameter key="site_no" type="string">SITE01</parameter>
  <parameter key="doc_no" type="string">58-20260319001</parameter>
</parameters>

รูปแบบ Response

Response สำเร็จ (code=200)

{
  "code": 200,
  "msg": "ยกเลิกใบรับสินค้าเสียสำเร็จ",
  "ERPMessage": {
    "description": "ประมวลผลสำเร็จ",
    "doc_no": "58-20260319001"
  }
}

Response ล้มเหลว (code=500)

{
  "code": 500,
  "msg": "ยกเลิกใบรับสินค้าเสียล้มเหลว",
  "ERPMessage": {
    "description": "ใบรับเข้าคลังยืนยันแล้ว ไม่สามารถยกเลิกได้"
  }
}

คำอธิบายฟิลด์ Response

ฟิลด์ ประเภท คำอธิบาย
code Integer 200=สำเร็จ, 500=ล้มเหลว
msg String ข้อความการประมวลผล
ERPMessage.description String ข้อความรายละเอียดจาก ERP

ลอจิกการล้างข้อมูล MES

หลังจากยกเลิกใบรับสินค้าเสียสำเร็จ MES จะล้างบันทึกใบโอนที่เกี่ยวข้อง:

ERP ยกเลิกสำเร็จ code=200 ล้างบันทึกใบโอน SFT_TRANSORDER_LINE TL011 = '', TL012 = '' หรือลบทั้งแถว

SQL การล้างข้อมูล

-- ล้างเลขที่ ERP ใน SFT_TRANSORDER_LINE
UPDATE SFT_TRANSORDER_LINE
SET TL011 = '',
    TL012 = ''
WHERE TRANSORDERTYPE = '58'
  AND TL011 = :TL011
  AND TL012 = :TL012

-- หรือลบบันทึกใบโอนทั้งแถว (ขึ้นอยู่กับการตั้งค่าระบบ)
DELETE FROM SFT_TRANSORDER_LINE
WHERE TRANSORDERTYPE = '58'
  AND TRANSNO = :TRANSNO

ความเสี่ยง Race Condition

ข้อควรระวังที่สำคัญ
เช่นเดียวกับ API ยกเลิกอื่นๆ การยกเลิกใบรับสินค้าเสียก็มีความเสี่ยง Race Condition:

สถานการณ์:ยกเลิกทันทีหลังออกจากสถานี แต่ ERP ยังไม่ส่งเลขที่ใบรับสินค้าเสียกลับมา
ผลลัพธ์:TL011/TL012 ว่าง ไม่สามารถเรียก ERP เพื่อยกเลิกได้
ผลกระทบ:MES ยกเลิกออกจากสถานีแล้ว แต่ใบรับสินค้าเสีย ERP ยังคงอยู่

ลอจิกการตัดสิน

// GeneralUpdater.java:1571-1575
if(!SftTransorderLine.getTl011().equals("") && !SftTransorderLine.getTl012().equals("")){
    // TL011/TL012 มีค่า ถึงจะเรียก ERP เพื่อยกเลิก
    String stock_in_no = SftTransorderLine.getTl011() + "-" + SftTransorderLine.getTl012();
    // ตัดสินว่าจะเรียก API ไหนตาม TRANSORDERTYPE
    ...
} else {
    // TL011/TL012 ว่าง ข้ามการเรียก ERP
}
วิธีการจัดการที่แนะนำ
  1. รอ ERP ตอบกลับสำเร็จก่อนอนุญาตให้ยกเลิกหลังออกจากสถานี
  2. เพิ่มกลไก Lock เพื่อป้องกันการดำเนินการพร้อมกัน
  3. เปรียบเทียบสถานะใบรับสินค้าเสีย MES กับ ERP เป็นระยะ
  4. ให้ฟังก์ชันยกเลิกเพิ่มเติมด้วยตนเอง

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

ตารางข้อมูล คำอธิบาย ฟิลด์ที่ได้รับผลกระทบ
SFT_TRANSORDER_LINE รายละเอียดใบโอน TL011, TL012 (ล้างหรือลบทั้งแถว)
SftTransorder หัวใบโอน TO007, TO008 (อาจต้องล้าง)

ตำแหน่งโค้ด

ฟังก์ชัน พาธไฟล์ บรรทัด
จุดเข้ายกเลิกออกจากสถานี SFT_core/src/com/dci/sft/update/GeneralUpdater.java 1550-1612
ตัดสิน TRANSORDERTYPE SFT_core/src/com/dci/sft/update/GeneralUpdater.java 1577-1592
เส้นทาง API SFT_ERPIntegrate/src/com/dci/sft/erp/XmlToERP_handler.java 96-98
ประกอบพารามิเตอร์ XML SFT_ERPIntegrate/src/com/dci/sft/erp/webservice/SendFormS.java 1811-1815

การจัดการข้อผิดพลาด

สถานการณ์ข้อผิดพลาด Response จาก ERP วิธีการจัดการ MES
ใบรับเข้าคลังยืนยันแล้ว code=500, ใบรับเข้าคลังยืนยันแล้ว แสดงข้อความผิดพลาด ต้องจัดการด้วยตนเอง
ไม่มีใบรับเข้าคลัง code=500, ไม่มีใบรับเข้าคลัง ล้างบันทึก MES ดำเนินการยกเลิกต่อ
หมดเวลาเชื่อมต่อ SocketTimeoutException บันทึก LOG ต้องยกเลิกเพิ่มเติมด้วยตนเอง

บันทึก LOG

// ไฟล์ LOG: logs/ERPReturnErrorRec.log

[ERP_SEND_ERROR] taskName=woScrapDataProcess, errorType=SocketTimeoutException, errorMsg=Read timed out
[ERP_SEND_ERROR] 送出内容={"doc_no":"58-20260319001"}