#faq#master#screen#dev#frontend#backend#troubleshooting
เพิ่มจอข้อมูลหลัก (master) ใหม่ต้องแก้ที่ไหนบ้าง และทำไมผู้ใช้ทั่วไปบันทึกไม่ได้
ตอบสั้น: จอข้อมูลหลักแบบตารางเดียว (รหัส + ชื่อ + ช่องเสริม) ไม่ต้องเขียน component — เพิ่ม config 1 ก้อนใน IC_MASTER_CONFIGS แล้ว StandardMasterScreen วาดให้ แต่จอนี้เขียน DB ด้วย SQL ผ่าน /query/exec จึงต้องเพิ่มชื่อตารางใน allow-list legacyClientWritable ของ backend ด้วย มิฉะนั้นผู้ใช้ level ต่ำกว่า 9 จะได้ 403 ส่วนจอหัว-รายการหลายตารางต้องมี spec ฝั่ง Go (mdSpecs) เพราะบันทึกผ่าน /process/master-detail/save
รายละเอียด
แบบ A — ตารางเดียว (StandardMasterScreen):
- เพิ่มรายการใน
IC_MASTER_CONFIGS(icMasterSchemas.ts:118) key = ชื่อเมนู (menuKey) ฟิลด์หลักของMasterScreenConfig(:18):tableName,idKey(ค่าเริ่มcode),nameKey(ค่าเริ่มname_1),noName2(ตารางไม่มีname_2),showStatus/hideStatus,extraFields,parentFilter(ต้องเลือกกลุ่มแม่ก่อน),fixedValues(ตารางใช้ร่วมกัน เช่น แยกลูกหนี้/เจ้าหนี้ด้วยคอลัมน์ชนิด),rowKey(กรณีรหัสซ้ำได้),fkChecks(นับการใช้งานก่อนลบ) screenRegistry.tsx:1013วนทุก key ในIC_MASTER_CONFIGSลงทะเบียนจออัตโนมัติ (createMasterScreen:152เลือกMasterDetailScreenถ้ามีdetailไม่งั้นStandardMasterScreen) ชื่อและรหัสเมนูถูกทับด้วยค่าในsmlMenu.json(getMenuTextByName/getMenuCodeByName) ถ้าต้องการให้เปิดจากเมนู ให้มีใบเมนูที่nameตรงmenuKey- เพิ่มชื่อตารางใน
legacyClientWritable—StandardMasterScreenทำinsert/updateด้วยqueryExec(StandardMasterScreen.tsx:653,:681) ผ่าน/query/execซึ่งตาม ADR-0011 ผู้ใช้ level < 9 เขียนได้เฉพาะตารางในรายการนี้ (ทำไมเขียนข้อมูลผ่าน /query/exec ไม่ได้ (error 403 ตารางเงิน/สต็อก/GL)) ตารางเงิน/สต็อก/GL ห้ามใส่ — ต้องทำ endpoint ใน/processแทน - สิทธิ์ — ไม่ต้องเพิ่มอะไร:
QueryRequiredRightแปลงคำกริยา SQL เป็น Add/Edit/Delete ให้เอง (ทำไมเข้าเมนู/กดบันทึกแล้วขึ้น 403 ไม่มีสิทธิ์ และตั้งสิทธิ์เมนูให้ผู้ใช้อย่างไร)
แบบ B — หัว + ตารางย่อย (MasterDetailScreen):
- ฝั่งเว็บ เพิ่ม config ใน
MASTER_DETAIL_CONFIGS(masterDetailSchemas.ts:334ซึ่งถูก spread เข้าIC_MASTER_CONFIGSที่icMasterSchemas.ts:1416) ต้องมีdetailมิฉะนั้นจอ throw - ฝั่ง Go เพิ่ม
mdSpecในmdSpecs(master_detail_specs.go:144) ระบุตารางหัว คอลัมน์ที่อนุญาต ตารางย่อย (mdGrid) และการตรวจอ้างอิง — ชื่อ key/คอลัมน์ฝั่งเว็บต้องตรง whitelist นี้ เมนูที่ไม่อยู่ในmdSpecsได้ "ไม่รู้จักเมนู" (master_detail.go:138) master-detail/save(write) และmaster-detail/delete(del) อยู่ในrouteRightsแล้ว และ proxy Next รองรับsave/deleteแล้ว (master-detail/[action]/route.ts:12) จึงไม่ต้องแก้สองจุดนี้ (Process engine (/process) เรียก action อย่างไร และเพิ่ม action ใหม่ต้องแก้ที่ไหนบ้าง)
เมื่อผู้ใช้ level ต่ำบันทึกไม่ได้: ดูข้อความ 403 — "ไม่มีสิทธิ์เพิ่ม/แก้ไข" คือสิทธิ์เมนู ส่วนข้อความตารางเงิน/สต็อก/GL หรือเฉพาะผู้ดูแลระบบคือ write policy ที่ตารางไม่อยู่ใน allow-list
ข้อควรระวัง
StandardMasterScreenประกอบ SQL เป็นสตริงฝั่งเบราว์เซอร์ และtableNameมาจาก config ห้ามรับชื่อตารางจากข้อมูลผู้ใช้- รหัสลูกหนี้/เจ้าหนี้อัตโนมัติและรหัสตามรูปแบบเอกสารมี endpoint แยก (
master/nextcode,master/codeleave) ไม่ได้อยู่ใน config (เลขที่เอกสารรันอย่างไร ตั้งรูปแบบเลขที่ที่ไหน) - ถ้าตารางนั้นแปลงเป็น
/processภายหลัง ต้องลบชื่อออกจากlegacyClientWritable(คอมเมนต์ในไฟล์ระบุ "Remove a name the day its screen moves to Go") - เปลี่ยนรหัสหลักที่ถูกอ้างอิงแล้วมีผลต่อเอกสารเก่า ดู เปลี่ยนรหัสสินค้า/ลูกค้า/เจ้าหนี้/ผังบัญชีที่ใช้ไปแล้วได้ไหม ต้องทำยังไง
ดูเพิ่ม
- จอข้อมูลหลักมาตรฐานและจอ master-detail (StandardMasterScreen / MasterDetailScreen)
- รายการจอข้อมูลหลักแบบตารางเดียว (IC_MASTER_CONFIGS)
- ข้อมูลหลักแบบหัว-รายการ รหัสอัตโนมัติ และเลย์เอาต์รายการ (Master-detail, code auto-run, DataList)
- ทำไมเขียนข้อมูลผ่าน /query/exec ไม่ได้ (error 403 ตารางเงิน/สต็อก/GL)
- Process engine (/process) เรียก action อย่างไร และเพิ่ม action ใหม่ต้องแก้ที่ไหนบ้าง
- ทำไมเข้าเมนู/กดบันทึกแล้วขึ้น 403 ไม่มีสิทธิ์ และตั้งสิทธิ์เมนูให้ผู้ใช้อย่างไร
ที่มาในโค้ด
frontend/src/config/schemas/icMasterSchemas.ts:18MasterScreenConfigและ:118IC_MASTER_CONFIGS(spreadMASTER_DETAIL_CONFIGSบรรทัด 1416)frontend/account/tabs/screenRegistry.tsx:152createMasterScreenและ:1013ลูปลงทะเบียนfrontend/account/master/StandardMasterScreen.tsx:653queryExec(insertSql)(update ที่บรรทัด 681,findFkUseบรรทัด 698)backend/internal/application/process/master_detail_specs.go:144mdSpecs(spec ตัวอย่างmenu_setup_user_groupบรรทัด 332)backend/internal/application/process/master_detail.go:138"ไม่รู้จักเมนู"frontend/src/app/api/process/master-detail/[action]/route.ts:12ACTIONS = save, delete