#history#serial#lot#shipment
ภาพรวม
ข้อมูลที่ผูกกับแถวสินค้า (เลข serial, lot, ข้อมูลขนส่ง) ถูกกรอกบนจอได้ก่อนที่ backend จะเก็บจริง ช่วง 2026-10-19..24 พบว่าค่าที่ผู้ใช้กรอกหายตอนบันทึก และตาราง derived ic_serial ไม่ถูกสร้างใหม่ตามหลังบันทึก/ลบ แก้โดยบันทึกทุกอย่างใน tx เดียวกับเอกสารแล้ว rebuild ราย item
อาการ
- A (ebe66efd): บันทึกการ์ดสินค้าแล้ว
ic_serialไม่ถูกสร้างใหม่ (คอมเมนต์เดิมในItemSavedระบุว่ายังไม่มี Go port ตาม diff) - B (2ab00c67): serial ที่คีย์ใน
SerialNumberModalไม่ถูกบันทึก ลบเอกสารแล้วic_trans_serial_number/ic_serialค้าง (commit ไม่มีเนื้อความ; อนุมานจาก diff: เพิ่มTransLine.Serials, ส่วน insert/delete/rebuild ในtrans.go+124) - C (dc975db9): ข้อมูลขนส่งของเอกสาร (
ic_trans_shipment) ไม่ถูกบันทึกและไม่ถูกโหลดกลับ (จากชื่อ commit และ diff ที่เพิ่ม insert +23 บรรทัด) - D (b002e065, 72d402f3): จอขาย 44 ไม่เลือก lot อัตโนมัติ; จอตรวจนับสต็อก recheck/ref/lot และจอตรวจนับ serial มีปัญหา autofocus/ราคา (ตามชื่อ commit; ยังไม่ได้ตรวจ diff ละเอียด)
- E (d19d3695): แถวสินค้าไม่มี
is_serial_number,mfd_date,mfn_name, หน่วยเทียบ ทำให้ค่าหายตอนดึงจากเอกสารอ้างอิง
สาเหตุ (root cause)
- A: C#
_icMain.cs:808เรียก_docFlow._processAllหลังบันทึกสินค้า แต่ Go ยังไม่พอร์ตขั้น_serialNumberQueryList - B/C: contract
TransLineไม่มีช่อง serial/ขนส่ง ส่วน save/delete ไม่มีคำสั่งเขียน-ลบตารางเหล่านี้ ตารางลูกจึงไม่ตามเอกสาร - E: เป็น R1 contract change ใน handoff §7: C# บันทึกฟิลด์เหล่านี้ แต่
TransLineไม่มี
วิธีแก้
- A: พอร์ต
rebuildSerialTxทำงานใน tx ของItemSavedและจำกัดทุกขั้นที่ item code เดียว (C# รัน 1-5 ทั้งระบบ) ใช้DISTINCT ON (ic_code, serial_number)เอาบรรทัดเก่าสุดก่อน กัน PK ชน และใช้roworderตัดสินเมื่อวันที่-เวลาเท่ากันเพื่อให้รันซ้ำได้ผลเดิม - B:
saveTransTxinsert serial (72 สร้างแถวออก + แถวรับเข้า 70 อัตโนมัติ),deleteTransTxลบแล้ว rebuild ทุก item ทั้งเก่า/ใหม่ - C: insert
ic_trans_shipmentในsaveTransTxและโหลดกลับขึ้นจอ; โค้ดปัจจุบันลบแถวนี้พร้อมเอกสาร (ไม่ยืนยันว่า commit นี้เป็นผู้เพิ่มส่วนลบ) - D:
autoLotsเติม lot ให้บรรทัดจอขาย 44 เอกสารใหม่ฝั่ง server - E: เพิ่มฟิลด์ใน
TransLineและเปิดคอลัมน์ตาม erp_option gate
commit ที่เกี่ยวข้อง
ebe66efd— rebuildic_serialตอนบันทึกสินค้า + เทสต์SERIAL_IT_DB72d402f3— ตรวจนับสต็อก recheck/ref/lot (#92), นับ serial (#93)2ab00c67— บันทึก/โหลด/rebuild serial ใน save/deletedc975db9— บันทึก/โหลด shipmentb002e065—find_lot_autod19d3695— ฟิลด์แถวเพิ่ม (serial, mfd, หน่วยเทียบ)
โค้ดปัจจุบันที่ป้องกัน
process/stock_tools.go:625rebuildSerialTx (วนserialRebuildSQL:581; เงื่อนไข flag ที่นับเป็นสต็อกserialMoveFlags:576); เรียกที่:562,stock_beginning.go:477process/trans.go:421-422, 532-535ลบic_trans_serial_numberและic_trans_shipmentพร้อมเอกสาร;:439,:584rebuild ทุก item ที่เกี่ยวtrans.go:979วนl.Serials;:725insertTransSerialSQL;:1187insertic_trans_shipmenttrans_lot_auto.go:32autoLots;trans_grid.go:364เติมIsSerialNumberจากic_serial_no- เทสต์:
TestRebuildSerialIntegration(ต้องตั้งSERIAL_IT_DB, rollback),trans_line_extra_test.go
บทเรียน / กฎที่ได้
- ตารางลูกของเอกสาร (serial, shipment) ต้องเขียนและลบใน tx เดียวกับ
ic_transและ rebuild ตารางสรุปท้าย tx - rebuild แบบ derived ต้อง idempotent: จำกัดขอบเขตต่อ item,
DISTINCT ON+ tiebreak, รันซ้ำแล้วไม่เปลี่ยน (AGENTS.md ข้อ 9) - ฟิลด์ที่ UI เก็บต้องเทียบ struct ฝั่ง backend ทุกครั้ง ถ้าไม่มีช่อง = ค่าหาย
- ใช้เทสต์ DB ที่ rollback ได้เทียบกับ SQL ต้นฉบับ C# แบบคำต่อคำ
- รายการเปิด: handoff บรรทัด 77 ยังมีข้อความ "set is_serial_number" (ไม่อธิบายต่อ; ยังไม่ได้ตรวจว่าเป็นงานอะไร)
ดูเพิ่ม
เครื่องมือสต็อก กลุ่ม route stocktools (Stock Tools) · การคำนวณยอดสต็อกคงเหลือใหม่ (Stock Balance Rebuild) · ลำดับการบันทึกเอกสาร (Transaction Save Flow) · เอกสารสต็อกพิเศษ: ยอดยกมา ปรับปรุง Lot และตรวจนับ (Opening Stock, Lot Adjust, Stock Count) · บทเรียนธุรกรรมอะตอมมิกและ error ที่ถูกกลืน (Atomic Transactions & Swallowed Errors) · บทเรียนเอกสารอ้างอิงและ Doc Flow (Document Reference & Flow)
ที่มาในโค้ด
backend/internal/application/process/stock_tools.go:576,581,625backend/internal/application/process/trans.go:421,439,584,979,1187backend/internal/application/process/trans_lot_auto.go:32backend/internal/application/process/trans_grid.go:364docs/HANDOFF_SMLCM_PARITY_2026-10-22.md:73,77- git:ebe66efd, git:2ab00c67, git:dc975db9, git:d19d3695