ตารางและชุดข้อมูลของ 3D Monitor TV
หน้า 3D Monitor TV แผนที่ธุรกรรมประเทศไทย ภาพรวม (SYS-13 MonitorMap) ไม่อ่านตารางบัญชีโดยตรง แต่อ่านตาราง monitormap_* 6 ตารางซึ่งเป็น "แคชที่สร้างไว้สำหรับแสดงผล" แล้วแปลงเป็นชุดข้อมูลสำหรับวาด 3 มิติ บันทึกนี้อธิบายตาราง วิธีสร้าง/หว่านข้อมูล และข้อสังเกตของตัวสร้างชุดข้อมูล
การสร้างตาราง
- ตารางทั้ง 6 สร้างด้วย
CREATE TABLE IF NOT EXISTSในฟังก์ชันensureCrmAndMonitorMapTablesของโมดูล CRM ฝั่ง Go (ใช้AllowDDL) ซึ่งถูกเรียกครั้งแรกต่อฐานข้อมูลผ่านensureSeedActivities(ใช้seedDoneกันซ้ำ) เส้นทาง/api/monitormapจึงเรียกGET /api/v1/crm/overviewก่อนเสมอเมื่อต้องหว่านข้อมูล - นโยบายเขียนของเกตเวย์คิวรีอนุญาตคำนำหน้า
monitormap_เป็นพิเศษ เพราะเป็น "แคชที่สร้างจากข้อมูลดิบ" ดู นโยบายล็อกการเขียนผ่าน Query Gateway (Query write policy / lockdown) และ ADR-0011 ล็อก SQL เขียนจาก browser: ตารางเงิน/สต๊อก/GL ผ่าน /api/process เท่านั้น - ตารางแผ่นแผนที่
monitormap_tile_cacheเป็นอีกตารางหนึ่ง สร้างโดยโมดูลmonitormapเอง ดู API ตรวจสุขภาพ แผนที่ติดตาม และเส้นทางเฉพาะชั้น Next (Health, Monitormap, Next-only routes)
ตารางทั้ง 6
| ตาราง | คีย์ | เก็บอะไร (คอลัมน์สำคัญ) |
|---|---|---|
monitormap_hub_nodes |
hub_id |
คลังสินค้า/ศูนย์กระจายสินค้า: wh_code, hub_name, region_name, lat/lng, total_sku, physical_qty, capacity_qty, utilization_pct, pending_pick_orders, packed_ready_orders, daily_throughput_value, theme_color |
monitormap_customer_nodes |
stop_id |
ลูกค้า/สาขา POS ที่เป็นจุดส่ง: stop_code, cust_code, cust_name, store_category (ค่าเริ่มต้น B2B_WHOLESALE), พิกัด, origin_wh_code, invoice_amount, box_count, delivery_status (ค่าเริ่มต้น IN_TRANSIT), product_summary |
monitormap_fleet_missions |
mission_id |
รถและภารกิจส่งของ: vehicle_code, plate_no, vehicle_type, driver_name, driver_phone, route_zone, trip_no, origin_wh_code, target_stop_code, highway_id, load_kg, max_weight_kg, utilization_pct, invoice_value, speed_factor, initial_progress, mission_status |
monitormap_live_events |
event_id |
เหตุการณ์สดสำหรับแถบข่าวและเสียงบรรยาย: event_time_label, event_category, headline_text, detail_text, voice_narration, amount_baht, พิกัด, badge_color, sort_order |
monitormap_kpi_projection |
projection_key |
แถวสรุปตัวเลขทั้งประเทศ (คีย์ NATIONAL_LIVE): จำนวนคลัง สต็อกรวม จำนวนรถ ทริปที่วิ่งอยู่ จำนวนจุดส่ง จุดที่ส่งแล้ว on_time_rate_pct รายได้รวม total_pos_terminals และ rebuilt_at |
monitormap_sme_alerts |
alert_id |
การแจ้งเตือนสำหรับผู้บริหาร: severity (ค่าเริ่มต้น CRITICAL), dept_code, dept_label, alert_title, alert_detail, action_label, voice_alert, voice_resolved, impact_amount, target_entity_kind/target_entity_id, พิกัด, alert_status (OPEN/RESOLVED), sort_order |
ค่าเงินในตารางเป็น NUMERIC ที่ฝั่งฐานข้อมูล แต่ตัวสร้างชุดข้อมูลฝั่งหน้าจออ่านเป็น Number เพื่อวาดภาพเท่านั้น (ตัวเลขสรุปเพื่อแสดงผล ไม่ใช่ตัวเลขทางบัญชี ดู ความถูกต้องของข้อมูล: เงิน ภาษี Transaction เดียว และ Rebuild (Data Integrity, big.Rat, ExecBatch))
การหว่านข้อมูลตัวอย่าง (เฉพาะฐาน bcdemo)
ensureMonitorMapDatabaseSeeded ใน route.ts ทำงานครั้งเดียวต่อฐานต่อโปรเซส (จำใน schemaSeededForDb) ถ้าฐานไม่ใช่ bcdemo และไม่ได้สั่ง ?reseed=1 จะข้ามทันทีโดยไม่เพิ่มแถว ถ้าเข้าเงื่อนไขจะส่งคำสั่งชุดเดียว (/query/execBatch) ประกอบด้วย:
- คลัง 12 แห่งทั่วประเทศ (เช่น กรุงเทพฯ อยุธยา EEC ระยอง อีสาน เหนือ ใต้)
- ลูกค้า/สาขา POS 24 จุด
- รถบรรทุก 22 คัน พร้อมภารกิจ
- เหตุการณ์สด 12 รายการ พร้อมข้อความเสียงบรรยายภาษาไทย
- การแจ้งเตือน 8 รายการ จากหลายแผนก
- สร้างแถว
NATIONAL_LIVEใหม่จากตารางดิบ
ทุกคำสั่งใช้ ON CONFLICT ... DO UPDATE จึงรันซ้ำได้ ข้อสังเกต: การหว่านซ้ำปรับเฉพาะคอลัมน์ตัวเลข/สถานะของคลัง และ alert_status ของการแจ้งเตือนจะถูกคืนเป็น OPEN เฉพาะตอนสั่ง ?reseed=1 เท่านั้น
แถว KPI NATIONAL_LIVE
จำนวนคลัง สต็อกรวม จำนวนรถ ทริปที่ IN_TRANSIT จำนวนจุดส่ง และจุดที่ DELIVERED คำนวณจากตารางดิบ ส่วนรายได้รวมคือผลรวม daily_throughput_value ของคลังบวกผลรวม invoice_amount ของจุดส่ง แต่ on_time_rate_pct (98.70) และ total_pos_terminals (15) เป็นค่าที่เขียนตรง ๆ ในคำสั่ง ไม่ได้คำนวณจากข้อมูลจริง แถวนี้ถูกสร้างใหม่เฉพาะตอนเข้าเงื่อนไขหว่านข้อมูลข้างต้น
ตัวสร้างชุดข้อมูล buildMonitorWorldDataset
ฟังก์ชันนี้ (frontend/monitormap/monitorDataBuilder.ts) รับคำตอบจาก GET /api/monitormap แล้วคืน MonitorWorldDataset ที่มี kpi, finance, warehouses, customers, trucks, events, alerts:
- แหล่งข้อมูล: ใช้แถวจากตาราง
monitormap_*เป็นหลัก ถ้าตารางว่างและเป็นฐานbcdemoจะใช้ชุดตัวอย่างที่เขียนไว้ในโค้ด (คลังเริ่มต้น 12 แห่งDEFAULT_WAREHOUSE_HUBS, จุดส่งเริ่มต้น, เหตุการณ์ตัวอย่าง 5 รายการ, การแจ้งเตือนตัวอย่าง 6 รายการ, รถที่สร้างจากคลังกับลูกค้า) ฐานอื่นจะได้อาร์เรย์ว่าง - ข้อมูล TMS/WMS/แดชบอร์ด/POS ที่ route ดึงมาพ่วง ถูกอ่านเข้าตัวแปรแต่ใช้เพียงตั้งค่า
isLiveBackend(มีคลังในตาราง หรือได้คำตอบจากระบบใดระบบหนึ่ง) ไม่ได้เอาตัวเลขจริงของระบบเหล่านั้นมาแสดง - ตัวเลขการเงินของผู้บริหาร (
finance): ฐานbcdemoเป็นค่าคงที่ที่เขียนไว้ในโค้ด (เงินสด ลูกหนี้ เจ้าหนี้ ใบสั่งซื้อค้าง จำนวนใบกำกับภาษีอิเล็กทรอนิกส์วันนี้ ฯลฯ) ฐานอื่นเป็น 0 ยกเว้น 3 ค่าที่คำนวณจากสูตรง่าย ๆ: กำไรสุทธิประมาณการ = รายได้รวม x 0.168, ภาษีขายประมาณการ = รายได้รวม x 0.07, มูลค่าสต็อก = จำนวนชิ้นรวม x 145 ทุกค่านี้เป็นค่าประมาณเพื่อภาพรวม ไม่ใช่ผลจากสมุดบัญชี - รถ: ทุกคันถูกระบุเป็น
OWN_FLEET(ไม่แยกรถร่วม) ภารกิจจากฐานข้อมูลได้healthScorePct96,totalStops6,completedStops4 เป็นค่าคงที่ จุดผ่าน (routeWaypoints) สร้างจากสูตรโค้งระหว่างคลังต้นทางกับพิกัดลูกค้า ไม่ใช่เส้นทางถนนจริง - ค่าเริ่มต้นแบบ
||: ฟิลด์ตัวเลขเขียนเป็นNumber(row.xxx || ค่าเริ่มต้น)ดังนั้นค่า 0 จากฐานข้อมูลจะถูกแทนด้วยค่าเริ่มต้น (เช่น คลังที่physical_qtyเป็น 0 จะแสดง 100000) ควรระวังเมื่อใช้ฐานจริงที่มีคลังว่าง - สถานะแจ้งเตือน:
RESOLVEDเมื่อalert_statusเป็นRESOLVEDนอกนั้นเป็นOPEN
พิกัดและการแปลงเป็นฉาก 3 มิติ (Mercator, แม่น้ำ, ทางหลวง, ขอบเขตภาค) อยู่ใน thailandGeoData.ts ดูเพิ่ม ข้อมูลภูมิศาสตร์ไทย 77 จังหวัด แผนที่ปักหมุด และโลโก้ธนาคาร 40 แห่ง (Thai Geo, Map Picker, Bank Logos)
ที่มาในโค้ด
backend/internal/adapter/inbound/http/crm/handler.go:867-1015ฟังก์ชันสร้างตารางและตัวป้องกันซ้ำ;:893-995DDL ของตารางทั้ง 6backend/internal/domain/query/write_policy_legacy.go:41-42คำนำหน้าmonitormap_ที่เขียนผ่านเกตเวย์ได้frontend/src/app/api/monitormap/route.ts:80-100เงื่อนไขหว่านข้อมูล (bcdemoหรือreseed);:117-124และ:252-261ON CONFLICT;:263-318สร้างแถวNATIONAL_LIVEและส่งคำสั่งชุดเดียว;:369-383คิวรีอ่านตารางfrontend/monitormap/monitorDataBuilder.ts:10-72ชนิดข้อมูล;:74-91สูตรจุดผ่านของรถ;:492-531ต้นฟังก์ชันและคลัง;:572-690รถ (จากฐานข้อมูลและตัวอย่าง);:692-705เหตุการณ์;:786-800การแจ้งเตือน;:900-945ผลลัพธ์ KPI และ financefrontend/monitormap/thailandGeoData.ts:84-95ชนิดภาค;:528-533คลังเริ่มต้น- ดูเพิ่ม: 3D Monitor TV แผนที่ธุรกรรมประเทศไทย ภาพรวม (SYS-13 MonitorMap) · หน้าจอแผนที่ 3 มิติ: กล้อง แผง คีย์ลัด เสียง และแคชแผ่นแผนที่ (ThailandMonitorMapScreen) · API ตรวจสุขภาพ แผนที่ติดตาม และเส้นทางเฉพาะชั้น Next (Health, Monitormap, Next-only routes) · นโยบายล็อกการเขียนผ่าน Query Gateway (Query write policy / lockdown) · ความถูกต้องของข้อมูล: เงิน ภาษี Transaction เดียว และ Rebuild (Data Integrity, big.Rat, ExecBatch)