#process#item#ic_inventory#master-data#unit#barcode#transaction
ข้อมูลสินค้าและข้อมูลสินค้าเพิ่มเติม (Item master & item detail)
สองหน้าจอสินค้าที่พอร์ตจาก C# SMLERPIC: (1) ข้อมูลสินค้า (_icMain.cs, เมนู 2.1.1/2.1.2/2.1.24) บันทึก ic_inventory พร้อมตารางหน่วยนับ บาร์โค้ด คลัง/ที่เก็บ ต้นทุนมาตรฐาน รูป ใน transaction เดียว และ (2) ข้อมูลสินค้าเพิ่มเติม (_icMainDetail.cs, เมนู 2.1.3/2.1.4) บันทึกกลุ่ม/ยี่ห้อ/มิติ/คลังตั้งต้น ฯลฯ ทั้งสองให้เซิร์ฟเวอร์ตรวจกฎเองทั้งหมด หน้าเว็บส่งแค่ฟอร์ม
ทำงานอย่างไร
Route และสิทธิ์
| Route | หน้าที่ | สิทธิ์ | ขนาด body สูงสุด |
|---|---|---|---|
itemmaster/save |
บันทึก/สร้างสินค้า | add เมื่อ isNew มิฉะนั้น edit (RequiredRight อ่าน body) |
4 MB |
itemmaster/delete |
ลบสินค้าหลายรหัส | del |
1 MB |
itemdetail/get |
โหลดข้อมูลเพิ่มเติม | read |
1 MB |
itemdetail/save |
บันทึกข้อมูลเพิ่มเติม | write |
4 MB |
1. บันทึกข้อมูลสินค้า (ItemMasterSave)
- Input:
menuKey,isNew,item(map:code,have_point,width_length_height,weight+ คอลัมน์ic_inventory),units,oppositeUnits,barcodes,whShelves,standardCosts,images menuKeyต้องเป็นmenu_ic_item_detail(screen_code0),menu_ic_item_detail_barcode(1) หรือmenu_ic_item_for_sync(0; โหมด sync ตัดตารางบาร์โค้ดและคลังทิ้ง) ไม่เช่นนั้น "เมนูไม่ถูกต้อง"- ตรวจก่อนเขียน (
parseItemMaster): รหัสสินค้า (ตัวพิมพ์ใหญ่ ไม่เกิน 25) ชื่อสินค้า 1 หน่วยต้นทุน หน่วยยอดคงเหลือ ห้ามว่าง; ทุกคอลัมน์ผ่านfieldSpec(ข้อความจำกัดความยาว, จำนวนเต็ม, ตัวเลข ชื่อคอลัมน์มาจากตาราง spec ไม่มาจาก request); ค่าตั้งต้นสินค้าใหม่update_detail = 1,update_price = 1 - ใน transaction (หมดเวลา 60 วินาที):
checkChangeMaster: กลุ่มผู้ใช้ของผู้ล็อกอินเรียงตามis_change_masterdataมากไปน้อย ถ้ามีกลุ่มใดเป็น 1 อนุญาต; ผู้ใช้ที่ไม่อยู่กลุ่มใดอนุญาต; ไม่เช่นนั้นKindForbidden"ไม่อนุญาตให้แก้ไขข้อมูลหลัก"itemMasterState: สินค้าใหม่แต่รหัสซ้ำ ->รหัสสินค้า "X" มีอยู่แล้วในระบบ; แก้ไขแต่ไม่พบ ->KindNotFound; ถ้าสินค้ามีรายการในic_trans_detailแล้ว (locked) ค่าunit_type,unit_cost,unit_standard,cost_typeจะใช้ค่าที่เก็บไว้ทับค่าที่ส่งมาcheckItemUnits: ต้องมีหน่วยต้นทุนและหน่วยยอดคงเหลืออยู่ในตารางหน่วยนับ;unit_type2 หรือ 3 (หน่วยขนาน) ต้องมีแถวในoppositeUnits; ถ้าไม่ได้เปิดerp_option.enable_all_ic_wh_shelf(และไม่ใช่โหมด sync) ต้องมีแถวคลัง/ที่เก็บอย่างน้อยหนึ่งแถวcheckBarcodeOwners: บาร์โค้ดที่เป็นของสินค้าอื่นแล้ว ปฏิเสธwriteItemMaster:INSERT/UPDATE ic_inventory(บันทึกcreate_code,last_update_code, เวลา) และic_inventory_detail.have_pointwriteItemMasterGrids: ลบแล้วแทรกใหม่ทั้งชุดic_unit_use,ic_opposite_unit,ic_inventory_barcode,ic_wh_shelf,ic_standard_cost(แต่ละตารางส่งเป็น jsonb พารามิเตอร์เดียว);writeItemImagesเขียนตารางimagesตามช่องimage_order+image_url(กลไกลิงก์ภาพ ต่างจากแนบไฟล์ใน แนบรูปเอกสารและรูปสินค้า (Document & item pictures))- เขียน
master_logs(function_code1 = เพิ่ม, 2 = แก้,computer_name 'WEB',data1= JSON ของคำขอ) itemSavedTx(stock_tools.go:553): ลบic_inventory_detailกำพร้า, รัน SQL ชุดitemSavedSQL, ซิงค์ic_serialของสินค้า (rebuildSerialTx) และคำนวณสต็อก/ยอดคงเหลือสินค้านั้นใหม่ (rebuildStockTx) คืนผลในItemMasterSaveResult(ฝังRebuildStockResult)
- ผลลัพธ์:
{code, ...RebuildStockResult}
2. ลบสินค้า (ItemMasterDelete)
- ทำได้เฉพาะเมนูที่ screen_code
0("C#: only _displayMode 0 deletes") มิฉะนั้นแจ้งให้ไปลบที่หน้าข้อมูลสินค้า - รับรหัสได้ไม่เกิน 500 รายการ (
itemDetailGridMax) ตัดซ้ำ/ว่าง - สินค้าที่มีรายการใน
ic_trans_detailถูกข้าม (คืนในused) ส่วนที่เหลือถูกลบพร้อมตารางลูกในitemChildTables(เช่นic_unit_use,ic_wh_shelf,ic_inventory_barcode,ic_standard_cost,ic_inventory_price,ic_inventory_discount),ic_inventory_set_detailและimagesแล้วจึงลบic_inventoryพร้อมเขียนmaster_logs(function_code 3) - ผลลัพธ์:
{deleted: [...], used: [...]}
3. ข้อมูลสินค้าเพิ่มเติม (itemdetail/get|save)
get: ค้นด้วยcodeหรือbarcode(ค้นic_inventory_barcodeแบบไม่สนตัวพิมพ์); คืน{code, editable, data}ที่dataเป็น JSON หนึ่งก้อนต่อแท็บ (คิวรีเดียวitemDetailQueryใช้jsonb_build_object),editable=ic_inventory.update_detail = 1; รันใน transaction แบบอ่านอย่างเดียวsaveฟิลด์:item(คอลัมน์ic_inventoryในitemSpecs: ยี่ห้อ รูปแบบ ดีไซน์ เกรด รุ่น ชนิด กลุ่มหลัก/ย่อย ชั้น คำอธิบาย ค่าคอมมิชชัน รูปแบบซีเรียล หมายเหตุ),detail(คอลัมน์ic_inventory_detailในdetailSpecs: มิติ 1-45, คลัง/ที่เก็บ/หน่วยตั้งต้นซื้อ-ขาย-เบิก, กลุ่มผู้ใช้ฝ่ายต่าง ๆ,purchase_point,minimum_qty,maximum_qtyและธงhave_point,balance_control,accrued_control,lock_cost,is_end,lock_price,lock_discount,is_hold_purchase,is_hold_sale,is_premium) และตาราง 11 ชุด:market,billing,short,pos(ตารางชื่อ),colors,sizes,patterns,replace,bundle,suggest,manufacturers- คอลัมน์ที่มี
lookupต้องมีรหัสนั้นอยู่ในตารางอ้างอิง (ตรวจแบบพิมพ์ใหญ่); ธง ต้องเป็น "0"/"1"; ตัวเลข^\d{1,15}(\.\d{1,6})?$(ไม่ติดลบ);descriptionเก็บช่องว่างนำหน้า/ขึ้นบรรทัดไว้ cleanRowsตัดบรรทัดว่าง ตรวจความยาว และปฏิเสธคีย์ซ้ำสำหรับcolors/sizes/patterns/manufacturers(ตารางมี PK(code, ic_code))- ใน transaction: ล็อกแถว
ic_inventory ... FOR UPDATE;update_detail <> 1->KindConflict"สินค้านี้ยังไม่พร้อมแก้ไข"; เพิ่มแถวic_inventory_detailที่ขาดอยู่ (ยกเว้นitem_type = 5);UPDATEตามคอลัมน์ที่ส่งมา; แล้วลบ-แทรกตารางย่อย; สุดท้ายอ่านสินค้ากลับมาเป็นItemDetailView
จุดที่ต้องระวัง
- การที่สินค้ามีเคลื่อนไหวแล้ว (
locked) ทำให้ค่าหน่วย/ชนิดต้นทุนที่แก้ไม่มีผล (ถูกแทนที่ด้วยค่าที่เก็บ) โดยไม่แจ้ง error update_detailและupdate_priceในic_inventoryเป็น gate ที่หน้าราคา/ส่วนลด (ข้อมูลหลักแบบหัว-รายการ รหัสอัตโนมัติ และเลย์เอาต์รายการ (Master-detail, code auto-run, DataList)), รูปสินค้า (แนบรูปเอกสารและรูปสินค้า (Document & item pictures)) และข้อมูลเพิ่มเติมใช้ร่วมกัน- ลบสินค้าที่ถูกใช้แล้วไม่ใช่ error: ได้ HTTP สำเร็จพร้อมรายชื่อใน
used
ที่มาในโค้ด
backend/internal/application/process/item_master.go:14-35- คอมเมนต์หลัก,itemMasterScreenbackend/internal/application/process/item_master.go:42-70-itemMasterSpecs, ค่าตั้งต้นbackend/internal/application/process/item_master.go:133-162-ItemMasterSaveInput,ItemMasterSaveResultbackend/internal/application/process/item_master.go:218-parseItemMaster;:521checkItemUnits;:541checkChangeMasterbackend/internal/application/process/item_master.go:559-ItemMasterSave;:627itemMasterState;:654checkBarcodeOwnersbackend/internal/application/process/item_master.go:676-writeItemMaster;:719writeItemMasterGrids;:779writeItemImagesbackend/internal/application/process/item_master.go:812-itemChildTables;:817ItemMasterDeletebackend/internal/application/process/item_detail.go:35-87-fieldSpec,itemSpecs,detailSpecsbackend/internal/application/process/item_detail.go:194-itemDetailLoad;:221ItemDetailGet;:246ItemDetailSaveInput;:367ItemDetailSave;:464itemDetailSaveGridsbackend/internal/application/process/stock_tools.go:553-itemSavedTxbackend/internal/adapter/inbound/http/process/itemdetail_handler.go:14-44- handleritemdetail,itemmasterbackend/internal/adapter/inbound/http/process/permission.go:81- สิทธิ์ add/edit ของitemmaster/save
ดูเพิ่ม
- ข้อมูลหลักแบบหัว-รายการ รหัสอัตโนมัติ และเลย์เอาต์รายการ (Master-detail, code auto-run, DataList)
- แนบรูปเอกสารและรูปสินค้า (Document & item pictures)
- บาร์โค้ดสินค้า ส่วนลดบาร์โค้ด EAN13 และพิมพ์ป้าย (Barcode menus 2.1.7-2.1.17)
- เครื่องมือสต็อก กลุ่ม route stocktools (Stock Tools)
- การตรวจสิทธิ์เมนูของ route process (Process route rights)
- ภาพรวมกลุ่ม process ของ Backend (Process overview)