#tables#ic
ยอดสินค้าตามล็อต (ic_trans_detail_lot)
หน้าที่: บันทึกการเคลื่อนไหว "ตามเลข LOT" ของสินค้า (จำนวน, ราคา, มูลค่า, วันผลิต/หมดอายุ) ใช้ออกรายงานยอดคงเหลือตามล็อตและรายงานยาควบคุม ต้นทางของแถวคือบรรทัดใน รายการสินค้าในเอกสาร (ic_trans_detail) ที่ระบุ lot_number_1 ใช้กับสินค้าที่ตั้งวิธีคิดต้นทุนเป็น LOT (ic_inventory.cost_type 1 LOT FIFO, 2 LOT กำหนดเอง, 3 FEFO — enum ใน ทะเบียนสินค้า (ic_inventory))
คอลัมน์ (จาก INSERT ที่ stock_lot.go:229-231 และ stock_beginning.go:551-555)
| column | ความหมาย |
|---|---|
trans_flag, doc_no |
เอกสารเจ้าของ (หัวเอกสารสินค้า/ซื้อ/ขาย (ic_trans)) |
doc_date, doc_time |
วัน-เวลาเอกสาร (รายงานตัดยอดด้วย doc_date <= วันที่สิ้นสุด) |
line_number, doc_line_number |
ลำดับแถว และบรรทัดสินค้าที่ตรงกันใน รายการสินค้าในเอกสาร (ic_trans_detail) |
item_code |
รหัสสินค้า |
wh_code, shelf_code |
คลัง/ที่เก็บของล็อต |
lot_number |
เลข LOT |
calc_flag |
+1 รับ / -1 จ่าย (ยอดล็อต = ผลรวม calc_flag × qty) |
qty, price, amount |
จำนวน, ราคา, มูลค่า (amount = sum_of_cost ของบรรทัดหลัง rebuild ต้นทุน) |
mfd_date, expire_date, mfn_name |
วันผลิต, วันหมดอายุ, ผู้ผลิต (เฉพาะแถวยอดยกมา) |
create_date_time_now |
เวลาสร้างแถว (เฉพาะยอดยกมา) |
ใครเขียน — ข้อสำคัญ
บันทึกเอกสารปกติ (saveTransTx) ไม่เขียนตารางนี้ เขียนแค่ ic_trans_detail.lot_number_1 ส่วน ic_trans_detail_lot ในระบบเดิมถูกเติมโดย cost engine ฝั่ง Java ซึ่งไม่ได้รันใน backend Go (คอมเมนต์ stock_lot.go:25-26, trans_lot_auto.go:21-24) ดังนั้นแถวในตารางนี้มาจากสามทางเท่านั้น:
- เอกสารยอดยกมา:
sbInsertLotเขียนแถวcalc_flag = 1(stock_beginning.go:551-555; ลบก่อนเขียนใหม่ที่:489) — ดู เอกสารสต็อกพิเศษ: ยอดยกมา ปรับปรุง Lot และตรวจนับ (Opening Stock, Lot Adjust, Stock Count) - เอกสารปรับสต๊อกล็อต (flag 66 ปรับเพิ่ม / 68 ปรับลด จากเมนู
menu_ic_adjust_stock_lot_amountและmenu_ic_stk_adjust_lot_auto,stock_lot.go:19-23):saveAdjustDocลบแล้ว INSERT จากบรรทัดที่มีlot_number_1(stock_lot.go:199-237) - ข้อมูลที่ระบบ Java เคยเติมไว้ (migrate มา) — อ่านได้แต่ Go ไม่สร้างเอง
ใครอ่าน
- ยอดคงเหลือตามล็อต / รายงานล็อต:
icLotBalanceSpec(report_menu_ic.go:1172-1230), รายงานยาควบคุมในหมวดขาย (report_menu_so_po.go:836-860) - ปรับล็อตตามมูลค่า: หาล็อตที่จำนวนเป็น 0 แต่มูลค่าไม่เป็น 0 ด้วย
HAVING SUM(calc_flag*qty)=0 AND ROUND(SUM(calc_flag*amount),2)<>0(stock_lot.go:316-321) - ปรับล็อตอัตโนมัติจากใบตรวจนับ 76: ยอดตามล็อต (
stock_lot.go:696-722) - เลือกล็อตอัตโนมัติ ไม่อ่านตารางนี้ แต่อ่าน
ic_trans_detail.lot_number_1เพราะบันทึกเว็บไม่ได้เขียนตารางนี้ (trans_lot_auto.go:21-23) - เปลี่ยนรหัสสินค้าแก้
item_codeของตารางนี้ (workflow.go:145)
ข้อควรระวัง
- ยอดของสองแหล่งอาจไม่ตรงกัน: รายงานล็อตอ่านตารางนี้ แต่บันทึกเอกสารเว็บเขียนเฉพาะ
ic_trans_detail.lot_number_1(ดัชนีidx_ic_trans_detail_lot_balanceที่service.go:937-939สร้างบนic_trans_detail) ควรเทียบทั้งสองก่อนเชื่อรายงานล็อต - ตารางนี้ไม่ได้ถูกสร้างใหม่โดย
rebuildStockTx(การคำนวณยอดสต็อกคงเหลือใหม่ (Stock Balance Rebuild)) - มูลค่าทุกช่องเป็น decimal (
::numeric) ห้ามใช้ float
ที่มาในโค้ด
backend/internal/application/process/stock_lot.go:25-26,:199-237,:316-321,:696-722backend/internal/application/process/stock_beginning.go:489,:551-555backend/internal/application/process/report_menu_ic.go:1172-1230backend/internal/application/process/report_menu_so_po.go:836-860backend/internal/application/process/trans_lot_auto.go:21-24backend/internal/application/process/service.go:937-939backend/internal/application/process/workflow.go:145