หน่วยนับขนาน Serial และการดึงเอกสารอ้างอิง
สินค้าที่ตั้ง unit_type เป็น 2 หรือ 3 มีจำนวนสองแกน: หน่วยมาตรฐานบัญชี (qty) และหน่วยขนานเพื่อตรวจนับจริง (qty_2) การดึงเอกสารอ้างอิงต้องคำนวณยอดค้างทั้งสองแกน ส่วนสูตรยอดคงเหลือและต้นทุนดู ยอดคงเหลือและต้นทุนสินค้า (Stock Balance and Costing, rebuildStockTx)
ค่า unit_type และข้อมูลหน่วยขนาน
| ค่า | ความหมาย (ตาม KMS) |
|---|---|
| 0 / 1 | หน่วยเดี่ยว / หลายหน่วย |
| 2 | หน่วยนับขนาน |
| 3 | หลายหน่วยนับ + หน่วยนับขนาน |
- หน่วยขนานของสินค้าเก็บใน
ic_opposite_unit(unit_code,stand_value,divide_value); รายการในเอกสารเก็บunit_code_2,qty_2,unit_sizeในic_trans_detail
กฎ/วิธีทำ
- ทะเบียนสินค้า: ถ้า
unit_type IN (2,3)ต้องมีอย่างน้อย 1 แถวในic_opposite_unitไม่เช่นนั้นบันทึกไม่ผ่าน ("สินค้าประเภทหน่วยนับขนาน กรุณาเพิ่มข้อมูล...") —item_master.go:257และ:593, มี test ที่parallel_unit_test.go - บันทึกเอกสารทุกเมนู (
trans_lines_check.go:191-210, ตรวจแล้ว): สินค้าที่unit_type IN (2,3)ต้องมีunit_code_2(ถ้าว่างเติมจากic_opposite_unitอัตโนมัติ),qty_2ห้ามติดลบ (ยกเว้นเอกสารปรับสต็อก), และถ้าqty != 0ต้องqty_2 != 0; หน้าจอยกมา (stock_beginning.goราว :408-440) มีกติกาเดียวกัน - สินค้าปกติไม่มีหน่วยขนาน ยกเว้นเอกสารที่เปิดสวิตช์
erp_option.use_compare_unitและเป็นชนิด 30, 34, 36, 44, 46, 48, 144 (lineExtraGates/compareUnitFlagsในtrans_line_extra.go) — นอกเหนือจากนั้นระบบล้างunit_code_2/qty_2/unit_sizeทิ้งก่อนบันทึก;total_qty(จำนวน Packaging) เปิดผ่านuse_quality_control_systemเฉพาะชนิด 12, 310, 60 - หน้าจอ: แสดงช่อง
หน่วยขนาน*และจำนวนขนาน*(data-testid="parallel-unit-code-{idx}",parallel-qty2-{idx}) เฉพาะบรรทัดที่สินค้าเป็นunit_type 2/3ในfrontend/account/transaction/TransItemGrid.tsxห้ามรบกวนบรรทัดสินค้าปกติ - อนุมัติ/ยกเลิกรายสินค้า:
insertApproveLines(doc_approve_item.go:59) คัดลอกunit_code_2, qty_2, unit_sizeไปใบอนุมัติ;insertCancelLines(doc_cancel_item.go:162) คำนวณqty_2ตามสัดส่วนจำนวนที่ยกเลิก (qty_2 × จำนวนที่ยกเลิก / qty, ปัด 4 ตำแหน่ง) - ยอดค้าง (
lineBalances,doc_cancel_item.go:98):qty_2คงเหลือ =GREATEST(d.qty_2 - SUM(x.qty_2), 0)ควบคู่กับqtyคงเหลือ - โอนสินค้าระหว่างคลัง: บันทึกเป็นคู่ขา 72 (ออก, calc_flag -1) และ 70 (เข้า, +1) พร้อมคัดลอก
unit_code_2,qty_2,unit_sizeทั้งสองขา (trans.goราว :1088-1127)
การดึงเอกสารอ้างอิง (POST /process/transgrid/refimport)
ตาราง refImportSpecs ใน trans_ref_import.go:24 ใช้คีย์ {ชนิดเอกสารปลายทาง, ชนิดเอกสารต้นทาง} กำหนดว่าต้องหักยอดเอกสารชนิดใดออกจากยอดค้าง (คอมเมนต์ในโค้ดอ้างบรรทัดใน C# _icTransItemGridControl) คู่ที่ไม่อยู่ในตารางจะคงจำนวนเต็มของบรรทัดต้นทาง (ตอนบันทึกยังตรวจกันดึงเกิน)
| ปลายทาง ← ต้นทาง | ความหมาย |
|---|---|
| 6 ← 4 หรือ 2 | ใบสั่งซื้อ (PO) จากใบอนุมัติ PR / PR |
| 12 ← 6, 310 ← 6 | ซื้อสินค้า / รับทะยอย จาก PO |
| 315 ← 310 | ชนิด 315 (skill เรียก Billing) จากรับทะยอย |
| 34 ← 30, 36 ← 30, 36 ← 34 | จอง / ใบสั่งขาย (SO) จากใบเสนอราคาหรือใบจอง |
| 44 ← 30, 34, 36 | ขายสินค้าจากใบเสนอราคา / ใบจอง / SO |
| 56 ← 122, 58 ← 56 | เบิกจากใบขอเบิก, รับคืนจากการเบิก |
| 72 ← 124 | โอนออกจากใบขอโอน |
- ยอดคืน ใช้
refRemainSpecs(trans_ref_import_remain.go:18):311 ← 310,16 ← 12,48 ← 44หักทั้งqty,qty_2และมูลค่าที่เคยคืนแล้ว ด้วยเงื่อนไขinquiry_typeต่อคู่ และremain_qty_2 = GREATEST(d.qty_2 - ยอดที่ใช้แล้ว, 0) - ตัวอย่างเรียก (จาก skill):
apiPost("/api/process/transgrid/refimport", { transFlag: 12, docNo, vatType: 1, vatRate: "7", refDocs: [{ docNo, transFlag: 6, docRefType: 0 }] })
Serial Number และ Lot
- KMS ระบุ
cost_type3 = Serial, 2 = Lot/Expire; ตารางic_serial(คงเหลือ) และic_trans_serial_number(ผูกกับเอกสาร) — โค้ดเครื่องมือ Serial อยู่ที่stock_tools.go(SerialAnalyze,SerialScan,SerialCountSave) เอกสารแหล่งนี้ไม่มีกติกาเชิงลึกกว่านี้ จึงไม่ขยายความเพิ่ม
ข้อควรระวัง: เอกสารกับโค้ดไม่ตรงกัน (ตรวจแล้ว)
- ตารางใน KMS §4 ใช้เลขชนิดเอกสารต่างจากโค้ด (เช่น KMS ระบุ PO = 10, SO = 32) ขณะที่
refImportSpecsและ skill ใช้ PO = 6, SO = 36 ให้ยึดโค้ด/skill และห้ามคัดเลขจากตาราง KMS มาใช้ - ไฟล์ที่ KMS/skill อ้างแต่ไม่พบแล้ว:
inventory_save.go,ic_trans_validation.go,so_po_save.go,ic_trans_save.go(ตรรกะย้ายไปitem_master.go,trans_lines_check.go,trans.go),frontend/src/components/**(ของจริงอยู่frontend/account/transaction/และfrontend/account/master/ItemScreen.tsx) frontend/account/StockBeginningBalanceScreen.tsxใน skill: ของจริงอยู่ที่frontend/account/transaction/StockBeginningBalanceScreen.tsx
ที่มา
docs/kms/KMS_INVENTORY_COSTING_SERIAL_PARALLEL_UNIT.md§1, §3, §4.agents/skills/inventory-costing-and-parallel-unit/SKILL.mdWorkflow ข้อ 1–3, Config, Usage example- โค้ดจริง:
backend/internal/application/process/(ไฟล์ที่ระบุข้างต้น)
ดูเพิ่ม
สารบัญมาตรฐานและกฎเหล็กของ SML Ai Account (Standards Overview) · ยอดคงเหลือและต้นทุนสินค้า (Stock Balance and Costing, rebuildStockTx) · ลากสลับแถว ⋮⋮ เฉพาะโหมดแก้ไข และปุ่มเพิ่มแถวด้านล่างตาราง (Row Reorder, Bottom Add-Row Bar) · ความถูกต้องของข้อมูล: เงิน ภาษี Transaction เดียว และ Rebuild (Data Integrity, big.Rat, ExecBatch) · ภาพรวมกลุ่ม process ของ Backend (Process overview) · ภาพรวม Backend Go ของ SML Ai Account (Backend overview)