กำหนดรหัสจังหวัด / อำเภอ / ตำบล (เมนู 1015)
จอเดียวจัดการข้อมูลที่อยู่ไทย 3 ชั้น (จังหวัด > อำเภอ/เขต > ตำบล/แขวง + รหัสไปรษณีย์ + พิกัด) ที่ตาราง erp_province, erp_amper, erp_tambon ซึ่งช่องที่อยู่ของลูกค้า/เจ้าหนี้ใช้เป็นตัวเลือก (ลูกค้า/เจ้าหนี้อ่าน erp_province/erp_tambon, เช่น CustomerDetailScreen.tsx:377,387,1518; ดู รายละเอียดลูกหนี้ สินเชื่อ ผู้ติดต่อ รูปภาพ (CustomerDetailScreen) และ กำหนดเจ้าหนี้ และรายละเอียดเจ้าหนี้ (SupplierScreen, SupplierDetailScreen)) มีปุ่ม ดึงจังหวัดอัตโนมัติ นำเข้าข้อมูลมาตรฐานทั้งประเทศ ตรรกะฝั่ง Go ดู โหลดข้อมูลจังหวัด/อำเภอ/ตำบลมาตรฐาน (Province Load)
วิธีเปิด
เมนู 1015 "กำหนดรหัสจังหวัด / อำเภอ / ตำบล" (menu_setup_province) อีก 4 คีย์เมนูเก่าเปิดจอเดียวกัน: menu_setup_province_auto, menu_province_auto, menu_setup_ampher, menu_setup_tambon (screenRegistry.tsx:987-1010 วนลงทะเบียนด้วย buildProvinceTreeEntry) กลไกเมนูดู ทะเบียนหน้าจอและโครงเมนู (Screen registry & smlMenu) ค่ารหัสเมนูที่ส่งเข้าจอมาจาก getMenuCodeByName ส่วนค่าสำรองที่ฝังในโค้ดเป็นรหัสเก่า 1.1.19
โครงจอ
- ซ้าย: ผังโครงสร้าง จังหวัด / อำเภอ / ตำบล แบบต้นไม้กางได้ โหลดทั้ง 3 ตารางครั้งเดียวด้วย
queryBatch(เรียงตามรหัส,:212-233) กล่องค้นหา "ค้นหารหัส / ชื่อจังหวัด / อำเภอ / ตำบล / รหัสไปรษณีย์" กรองต้นไม้ในเครื่องและกางสายที่ตรงให้เอง; ปุ่มกางอำเภอทุกจังหวัด / กางทั้งหมด / ยุบทั้งหมด / โหลดใหม่ และปุ่ม ดึงจังหวัดอัตโนมัติ; ถ้าฐานว่างมีลิงก์ "ดึงรายชื่อ 77 จังหวัดมาตรฐานอัตโนมัติ" - ขวา: ฟอร์ม 1 ใบสลับ 3 ระดับด้วยแท็บ "1. จังหวัด", "2. อำเภอ/เขต", "3. ตำบล/แขวง" บวกปุ่มลัด เพิ่มจังหวัด, เพิ่มอำเภอในจังหวัดนี้, เพิ่มตำบลในอำเภอนี้ (ล็อกจังหวัด/อำเภอแม่ไว้ให้) ใต้ฟอร์มเป็นตารางลูก: เลือกจังหวัดจะเห็นตารางอำเภอ (รหัส, ชื่อไทย, ชื่ออังกฤษ, พิกัด, จำนวนตำบล) เลือกอำเภอจะเห็นตารางตำบล
- ปุ่ม: เพิ่มใหม่, แก้ไข, ลบ, ปิดหน้าจอ (โหมดดู); บันทึก, ปิดหน้าจอ (โหมดแก้ = ยกเลิกการแก้) ตามสิทธิ์ ดู การตรวจสิทธิ์เมนูของ route process (Process route rights)
- คีย์ลัดมีแค่ Ctrl+S (หรือ Cmd+S) บันทึก (
:882-892) ไม่มี Esc; ผู้ใช้กดคลิกโหนดอื่นหรือปุ่มเพิ่มขณะมีการแก้ค้าง ระบบถาม "มีข้อมูลค้างบันทึก ... ละทิ้งการแก้ไข / กลับไปบันทึก" (guardedRun,:508-520)
ช่องในฟอร์ม
| ระดับ | ช่อง | ข้อกำหนด |
|---|---|---|
| ทุกระดับ | รหัส (จังหวัด/อำเภอ/ตำบล) | บังคับ ตัวพิมพ์ใหญ่ แก้ได้เฉพาะตอนเพิ่มใหม่ (disabled={!(editable && isNew)}) |
| ทุกระดับ | ชื่อ (ไทย) | บังคับ ("กรุณาระบุชื่อ (ภาษาไทย)") |
| ทุกระดับ | ชื่อภาษาอังกฤษ | ไม่บังคับ |
| อำเภอ, ตำบล | จังหวัด | บังคับ เลือกจากรายการ ("กรุณาเลือกจังหวัด") เปลี่ยนจังหวัดแล้วอำเภอเลื่อนไปอำเภอแรกของจังหวัดนั้นให้ |
| ตำบล | อำเภอ/เขต | บังคับ ("กรุณาเลือกอำเภอ/เขต") รายการกรองตามจังหวัดที่เลือก |
| ตำบล | รหัสไปรษณีย์ | รับเฉพาะตัวเลข ไม่เกิน 10 หลัก (ตัวอักษรอื่นถูกตัดทิ้งขณะพิมพ์, :1700-1710) |
| ทุกระดับ | ละติจูด / ลองจิจูด | ช่องตัวเลขทศนิยม 6 ตำแหน่ง (NumberBox) ว่างบันทึกเป็น 0 ใช้ sqlDecimal ไม่ผ่านตัวเลขทศนิยมไบนารี ดู ตัวเลข เงิน ภาษี และปี พ.ศ. ฝั่ง frontend (numeric.ts) |
| ทุกระดับ | กล่องพิกัดบนแผนที่ | SmlLocationFieldBox หมวด PROVINCE คลิกแผนที่แล้วเติมละติจูด/ลองจิจูดให้ |
ค่าพิกัด 0 ถูกแสดงเป็นช่องว่าง (cleanZeroCoord, :88-96) จึงแยก "ไม่มีพิกัด" กับ "พิกัด 0" ไม่ได้ตามที่จอนี้เก็บ (ว่าง = 0)
ดึงจังหวัดอัตโนมัติ (นำเข้าข้อมูลมาตรฐาน)
กดปุ่มแล้วเปิดหน้าต่างรายการ 77 จังหวัดมาตรฐานจาก POST /api/process/workflow/province-list (ได้รหัส ชื่อ พิกัด) ติ๊กเลือกไว้ครบทุกจังหวัดเป็นค่าเริ่มต้น มีช่องกรองชื่อ ปุ่มเลือกทั้งหมด / ยกเลิกทั้งหมด แล้วกด นำเข้าข้อมูล (n จังหวัด) ส่งรหัสที่ติ๊กไป POST /api/process/workflow/province-load (:912-948) ข้อความบนหน้าต่างระบุว่าข้อมูลมาตรฐานมี 77 จังหวัด · 928 อำเภอ/เขต · 7,436 ตำบล/แขวง พร้อมรหัสไปรษณีย์ สำเร็จแสดงจำนวนจังหวัด/อำเภอ/ตำบลที่นำเข้าแล้วโหลดต้นไม้ใหม่ เงื่อนไข: ต้องมีสิทธิ์เพิ่มหรือแก้ไข (ผู้ใช้อ่านอย่างเดียวกดไม่ได้ ปุ่มถูกปิด) และต้องติ๊กอย่างน้อย 1 จังหวัด ฝั่ง Go ล้างแถวเดิมตามรหัสแล้วเขียนใหม่ใน transaction เดียว (รายละเอียดที่ โหลดข้อมูลจังหวัด/อำเภอ/ตำบลมาตรฐาน (Province Load))
บันทึกและลบ
- บันทึก (
:668-880): ตรวจสิทธิ์ → รหัส → ชื่อไทย → (อำเภอ/ตำบล) จังหวัด/อำเภอแม่ → ตอนเพิ่มใหม่ตรวจรหัสซ้ำ: จังหวัดซ้ำที่รหัส, อำเภอซ้ำภายในจังหวัดเดียวกัน, ตำบลซ้ำภายในจังหวัด+อำเภอเดียวกัน (ข้อความรหัสอำเภอ "X" ในจังหวัด "Y" มีอยู่ในระบบแล้ว) แล้ว INSERT หรือ UPDATE ทีละตาราง ผ่านqueryExecสำเร็จแล้วโหลดต้นไม้ใหม่และเลือกโหนดที่เพิ่งบันทึก - ลบ (
:812-880): ถามยืนยันโดยบอกขอบเขต — ลบจังหวัด "พร้อมอำเภอและตำบลภายใต้จังหวัดนี้", ลบอำเภอ "พร้อมตำบลภายใต้อำเภอนี้", ลบตำบลเดี่ยว ๆ; จังหวัด/อำเภอลบเป็นชุดคำสั่งเดียวด้วยqueryExecBatch(ล้มพร้อมกัน)
ข้อควรระวัง
- ลบแล้วลบต่อเนื่องทั้งสาย โดยไม่ตรวจว่ามีลูกค้า/เจ้าหนี้ใช้รหัสนั้นอยู่หรือไม่ (ไม่มี query ตรวจอ้างอิงในฟังก์ชันลบ
:812-880) ลูกค้า/เจ้าหนี้ที่เก็บรหัสจังหวัด/ตำบลเดิมไว้จะหาชื่อไม่เจอ ตรวจก่อนลบ - รหัสอำเภอ/ตำบลซ้ำข้ามจังหวัดได้ ถือรหัสจังหวัดเป็นส่วนของคีย์ ไม่ใช่รหัสเดี่ยว
- ปุ่ม "ดึงจังหวัดอัตโนมัติ" เขียนทับ แถวที่รหัสตรงกับข้อมูลมาตรฐาน (แก้ชื่อ/พิกัดเอง แล้วดึงซ้ำจะหาย) ตามกลไก DELETE+INSERT ใน โหลดข้อมูลจังหวัด/อำเภอ/ตำบลมาตรฐาน (Province Load)
- คอมเมนต์ในโค้ดใช้ชื่อ "F12 shortcut" แต่ที่ผูกจริงคือ Ctrl+S
- ไม่มีตาราง tbl- แยกของ 3 ตารางนี้ในคลัง; โครงสร้างอ่านจากคำสั่ง SQL ในไฟล์ (
:212-233): จังหวัดcode,name_1,name_2,lat,lng; อำเภอ เพิ่มprovince; ตำบล เพิ่มprovince,amper,zip_code
ที่มาในโค้ด
frontend/account/master/ProvinceTreeScreen.tsx:35-96ชนิดข้อมูล/พิกัด;:212-312โหลดต้นไม้;:508-520ป้องกันข้อมูลค้าง;:668-810บันทึก;:812-880ลบ;:882-892คีย์ลัด;:895-948ดึงอัตโนมัติfrontend/account/tabs/screenRegistry.tsx:987-1010- ดูเพิ่ม: กำหนดคลังสินค้า และจอคลังที่เก็บสินค้า (WarehouseScreen) · รายการจอข้อมูลหลักแบบตารางเดียว (IC_MASTER_CONFIGS) · สารบัญหน้าจอทั้งหมดของ SML Ai Account (ต้นไม้เมนู → หน้าจอ → โน้ต)