จอข้อมูลหลักมาตรฐานและจอ master-detail
จอ "ข้อมูลหลัก" แบ่งเป็น 3 แบบ: (1) StandardMasterScreen ตารางเดียว รหัส+ชื่อ+ช่องเสริม วาดจาก config (รายการจอข้อมูลหลักแบบตารางเดียว (IC_MASTER_CONFIGS)); (2) MasterDetailScreen หัว+ตารางย่อยหลายตาราง วาดจาก MASTER_DETAIL_CONFIGS; (3) จอเขียนมือเฉพาะเรื่อง (ลูกหนี้ เจ้าหนี้ สินค้า ฯลฯ) ในโฟลเดอร์ account/master/
ทั้งสามแบบหน้าตาเดียวกัน: รายการซ้าย (ResizableSplit + SmlDataList ตารางรายการและหน้าต่างค้นหา (SmlDataList, SmlLookupModal, SmlLookupInput)) และฟอร์มขวา
ทำงานอย่างไร
StandardMasterScreen (StandardMasterScreen.tsx, 1,806 บรรทัด; prop config: MasterScreenConfig)
- โหลดรายการ (บรรทัด 268-348): ประกอบ
select * from <tableName> where <ค้นหา> and <fixedValues> and <parentFilter> order by <idKey>แล้วqueryLimit(sql, 500, 0, true); ค้นหาด้วยbuildSmlSearchWhereบนidKey, nameKey, name_2(ตัวเรียก API และตัวประกอบ SQL ฝั่งเบราว์เซอร์ (api-client, query-client, sml-query-builder)). ถ้าparentFilter.requiredและยังไม่เลือกกลุ่มแม่ รายการว่างและปิดการแก้ไข. โหลดเสร็จเลือกแถวแรกอัตโนมัติ (ยกเว้นผู้ใช้กด "เพิ่มใหม่" ระหว่างรอ - กันด้วยnewSeq/loadSeq). - บันทึก
handleSave(513-695): ตรวจcanSaveWithRights(พื้นที่ทำงานแบบแท็บ MDI และสิทธิ์จอ (TabWorkspace)) -> ต้องมีรหัสและชื่อ -> (ใหม่) ตรวจรหัสซ้ำด้วยselect count(*)ตามfixedValues/parentFilter(ข้ามเมื่อมีrowKey) ->insertหรือupdate ... where <keyCol> = ...ผ่านqueryExec. ค่าช่องเสริมแปลงด้วยextraFieldSql(บรรทัด 185: number/calc ->sqlDecimal, date ว่าง ->null, select/radio/checkbox -> เลข, lookup ตัดส่วนหลัง~). - ลบ
handleDelete(724):findFkUseไล่config.fkChecksนับการใช้งานก่อน ถ้ามีใช้ -> dialog "ไม่อนุญาตให้ลบ"; ผ่านแล้วจึงถามยืนยัน (รายการจอข้อมูลหลักแบบตารางเดียว (IC_MASTER_CONFIGS)). - ลัด:
Ctrl+Sบันทึก เฉพาะแท็บที่มองเห็น (rootRef.offsetParent, บรรทัด 898-909). ปิดจอที่มีข้อมูลค้างจะถามก่อน (isDirty, บรรทัด 775). - กรณีพิเศษที่ฝังในไฟล์ตาม
menuKey/ตาราง:menu_setup_bankมี "นำเข้าธนาคารไทย" ผ่านThaiBankDirectoryModal/handleImportThaiBanks(826-880,queryExecBatch);menu_setup_qr_payment(1615);menu_ic_item_serialแสดงประวัติ serial จากic_trans_serial_number(106-135, 1669); ตารางic_trans(เอกสารแต้ม) บันทึกผ่านPOST /api/process/stocktools/pointdocsave(isPointDoc, 510-560) และลบผ่านpointdocdelete; ที่อยู่จัดส่ง (1183-1195) มีปุ่มพิเศษ.
MasterDetailScreen (MasterDetailScreen.tsx, 1,301 บรรทัด; ต้องมี config.detail ไม่งั้น throw, บรรทัด 157-158)
- รูปแบบกำหนดใน
MasterDetailConfig(masterDetailSchemas.ts:81-105):mode=item(เลือกสินค้าจากรายการแล้วแก้รายละเอียด),header(หัวเอกสาร + ตารางย่อย มีรหัสหลัก/scopeKey/autoRunningNo),table(ตารางเดียวไม่มีรายการ);list,top[](บล็อกช่องด้านบน),tabs[](ป้ายแท็บ -> บล็อก/ตาราง),grids[](MdGrid; คอลัมน์MdColชนิด text/upper/number/int/date/lookup/select/check/display; มีreadOnly,updateOnly,single,pick,newRow),stacked,canDelete. - อ่าน ผ่าน
queryList(SELECT ตาม config ต่อ gridlimit 2000, บรรทัด 150-155) และรายการqueryLimit(sql,500,...)(250). - เขียน/ลบผ่าน backend:
POST /api/process/master-detail/saveส่ง{menuKey, key, scope, mode:"new"|"edit", header, grids}(บรรทัด 565-572) และ/master-detail/delete{menuKey,key,scope}(600); ชื่อ key/คอลัมน์ใน config ต้องตรง whitelist ฝั่ง Go (คอมเมนต์หัวmasterDetailSchemas.ts:2). ไฟล์หัวระบุว่าบันทึก/ลบ atomic ผ่าน Go (MasterDetailScreen.tsx:4). บันทึกใหม่กับautoRunningNoแล้วขึ้นเลขถัดไปให้ทันที (580-587). ค่าเริ่มต้นค่าเสื่อมราคาเรียก/api/process/master/assetdepdefaults. - เงินที่แสดงในจอนี้คำนวณด้วย bigint (
toScaled,mulRound2,sumRound2,masterDetailSchemas.ts:108-126) - ตัวเลขจริง backend คำนวณ (ตัวเลข เงิน ภาษี และปี พ.ศ. ฝั่ง frontend (numeric.ts)).
รายการจอ master-detail (MASTER_DETAIL_CONFIGS, 24 รายการ)
| menu key | ชื่อจอ | ตารางหลัก | บรรทัด |
|---|---|---|---|
menu_ic_item_set |
สินค้าชุด | ic_inventory |
336 |
menu_ic_purchase_price |
กำหนดราคาซื้อ | ic_inventory |
393 |
menu_ic_item_saleprice |
กำหนดราคาขายมาตรฐาน | ic_inventory |
445 |
menu_ic_item_saleprice_2 |
กำหนดราคาขายทั่วไป | ic_inventory |
446 |
menu_ic_discount |
กำหนดส่วนลดสินค้า | ic_inventory |
449 |
menu_ic_item_formula_template |
กำหนดรูปแบบสูตรราคาขาย | ic_price_formula_template |
469 |
menu_ic_item_saleprice_formula |
กำหนดสูตรราคาขาย | ic_inventory |
506 |
menu_asset_lists |
ข้อมูลสินทรัพย์ | as_asset |
535 |
menu_asset_maintenance |
บันทึกการซ่อมบำรุงสินทรัพย์ | as_asset_maintenance |
619 |
menu_chart_of_account |
รายละเอียดผังบัญชี | gl_chart_of_account |
691 |
menu_chart_of_account_fast |
ปรับปรุงผังบัญชีแบบเร็ว | gl_chart_of_account |
740 |
ic_warehouse_and_location_group |
กำหนดกลุ่มที่เก็บ | ic_warehouse_location_group |
783 |
menu_ic_all_price |
ราคาขายสินค้า | ic_inventory |
829 |
menu_ic_report_sort |
กำหนดการเรียงข้อมูลรายงาน | ic_report_sort_item |
893 |
menu_ic_purchase_premium |
ของแถมซื้อ | ic_purchase_permium |
930 |
menu_ar_point |
แต้มสะสม | ar_customer |
1072 |
menu_setup_user_group |
กำหนดกลุ่มพนักงาน | erp_user_group |
1131 |
menu_setup_user_group_warehouse_shelf |
กำหนดการใช้คลังและที่เก็บ | erp_user_group |
1291 |
menu_ic_warehouse_locaton |
คลังที่เก็บสินค้า | ic_inventory |
1375 |
menu_sale_plan |
กำหนดแผนการขาย | erp_sale_plan |
1478 |
menu_account_period |
กำหนดงวดบัญชี | erp_account_period |
1563 |
menu_view_manager_custom |
กำหนดรูปแบบการค้นหาข้อมูล | erp_view_table_custom |
1602 |
pos_promotion_formula |
กำหนดสูตรโปรโมชั่น | ic_promotion_formula |
1660 |
menu_setup_pos_slip_campaign |
กำหนดแคมเปญท้ายใบเสร็จ | pos_slip_campaign |
1772 |
จอเขียนมือใน account/master/ - endpoint ที่แต่ละไฟล์เรียกจริง (ได้จาก grep)
| ไฟล์ | เรียก |
|---|---|
CustomerScreen, SupplierScreen, DealerScreen |
queryList/queryLimit/queryExecBatch; ลูกหนี้/เจ้าหนี้ใช้ masterAutoCode |
CustomerDetailScreen, SupplierDetailScreen |
+ queryExec, POST /api/crm/upload (อัปโหลดไฟล์; ระบบ crm อยู่นอกขอบเขตโน้ตนี้ ยังไม่ได้อ่าน) |
ItemScreen |
/api/process/itemmaster/save, /barcode/ean, itemMasterDelete, itemNextCode, /api/crm/upload |
ItemDetail2Screen |
/api/process/itemdetail/get|save, itempicture/get|image |
ItemPictureScreen, DocumentPictureScreen |
itempicture/list|get|save|image, docpicture/formats|docs|get|save|image |
BarcodeScreens, BarcodePrintScreen, BarcodeDiscountScreens |
/api/process/barcode/item|save|ean|format|print-items|discount-load|discount-save |
LotAdjustScreens, HiddenCostScreen, SerialStockCountScreen, StockCheckScreens, StockToolBits |
/api/process/stocktools/* (lotautolist/run/check, lotamountload/save, hiddencostcalc/save/delete, serialscan/countsave, barcodecheck, serialanalyze, formats) |
ModifyPriceScreen |
/api/process/modifyprice/* |
DocFormatScreen |
/api/process/gl/template-defaults + queryExecBatch (มี fkChecks ของตัวเอง บรรทัด 735) |
ProvinceTreeScreen |
/api/process/workflow/province-list|province-load + queryExecBatch |
EmployeeScreen, UnitScreen, WarehouseScreen, TransportLabelPrintScreen |
queryList/queryLimit/queryExec ตรงๆ |
masterAutoCode.ts: masterNextCode(kind) (บรรทัด 33) เรียก POST /api/process/master/nextcode ได้รหัส "สูงสุด+1" ของ customer/supplier (ตามคอมเมนต์ C# _getAutoRun); useMasterCodeLeave (51) เรียก codeleave เมื่อออกจากช่องรหัสเพื่อตรวจ/เติมรหัสที่พิมพ์เอง; duplicateCodeDialog (109) แสดง dialog รหัสซ้ำ. ใช้ใน 4 จอลูกหนี้/เจ้าหนี้. error ประเภท NETWORK|UNAUTHORIZED|SESSION_EXPIRED|FORBIDDEN ไม่แสดง (บรรทัด 15).
ScreenFrame.tsx: กรอบจอมาตรฐาน "หัว 2 แถว" (แถบชื่อ + toolbar ซ้าย / เลขเมนู + ชื่อจอขวา) และ useShortcuts(onSave,onCancel,enabled) (F12/Ctrl+S = บันทึก, Escape = ยกเลิก; ประกาศบรรทัด 37). ใช้โดย BarcodeDiscountScreens, DocumentPictureScreen, HiddenCostScreen, ItemDetail2Screen, ItemPictureScreen, LotAdjustScreens, ModifyPriceScreen, SerialStockCountScreen, StockCheckScreens และ transaction/AssetSaleScreen.
ข้อควรระวัง
StandardMasterScreenเขียนด้วย SQL ที่เบราว์เซอร์ประกอบ (insert/update/delete) ไม่ผ่าน process endpoint - ความถูกต้องของescapeSqlและfkChecksอยู่ฝั่ง frontend;MasterDetailScreenต่างกันตรงเขียนผ่าน backend.- รหัสซ้ำตรวจก่อน insert ด้วย SELECT แยก - สองผู้ใช้อาจชนกันได้ (ยังไม่ยืนยันว่ามี unique constraint ที่ DB).
- แท็บที่ซ่อนยัง mount อยู่ จึงต้องเช็ก
offsetParentก่อนรับCtrl+S(พื้นที่ทำงานแบบแท็บ MDI และสิทธิ์จอ (TabWorkspace)).
ที่มาในโค้ด
frontend/account/master/StandardMasterScreen.tsx:63-200,268-348- สถานะ, SQL ตัวกรอง, โหลดรายการfrontend/account/master/StandardMasterScreen.tsx:513-695,699-770- บันทึก,findFkUse, ลบfrontend/account/master/MasterDetailScreen.tsx:150-215,554-620- SELECT ต่อ grid, บันทึก/ลบผ่าน/master-detail/*frontend/src/config/schemas/masterDetailSchemas.ts:6-105,334-1918- ชนิดMd*และ configfrontend/account/master/masterAutoCode.ts:5-129- รันรหัสอัตโนมัติfrontend/account/master/ScreenFrame.tsx:5-59- กรอบจอ + ช็อตคัต
ดูเพิ่ม
ภาพรวม Frontend ของ SML Ai Account (Frontend overview) · รายการจอข้อมูลหลักแบบตารางเดียว (IC_MASTER_CONFIGS) · ตารางรายการและหน้าต่างค้นหา (SmlDataList, SmlLookupModal, SmlLookupInput) · เครื่องฟอร์มแบบ schema (SchemaForm, FieldDef, useRecordForm) และจอตั้งค่าระบบ · ทะเบียนหน้าจอและโครงเมนู (Screen registry & smlMenu) · พื้นที่ทำงานแบบแท็บ MDI และสิทธิ์จอ (TabWorkspace) · เส้นทาง API ฝั่ง Next.js ที่ส่งต่อไป Go backend (API proxy routes)