สมอง SML

คลังความรู้ / หน้าจอทีละจอ

#screens#master

กำหนดรหัสจังหวัด / อำเภอ / ตำบล (เมนู 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

ที่มาในโค้ด