3D จอพนักงาน (SYS-14)
WorkMonitor คือจอ "ออฟฟิศ 3 มิติ" ที่ให้ผู้ดูแลเห็นว่าเครื่องของพนักงานที่กำลังเปิด BC Ai Account อยู่ตอนนี้กำลังทำอะไร: โต๊ะแต่ละตัวในฉาก Three.js คือหนึ่งแท็บของพนักงาน คลิกแล้วเห็นหน้าจอสดของแท็บนั้นในกรอบด้านขวา ข้อมูลทั้งหมดอยู่ในหน่วยความจำของเซิร์ฟเวอร์ ไม่มีตารางฐานข้อมูล รายละเอียดการส่งหน้าจอและการสร้างสัญญาณ WebRTC อยู่ที่ ตัวแทนบนเครื่องพนักงาน สัญญาณ WebRTC และจอผู้ดู (WorkMonitor telemetry)
ใครใช้ / เปิดอย่างไร
- ผู้ใช้หลัก: ผู้บริหารหรือหัวหน้างานที่ต้องการเห็นการใช้งานจริงของพนักงานในฐานข้อมูล (บริษัท) เดียวกัน
- เปิดจากหน้ารวมระบบ (Portal) การ์ด
SYS-14"3D จอพนักงาน (ดูหน้าจอการทำงานสด)" ป้าย "3D Office Live" ในกลุ่ม "④ 3D Command Center & ตรวจสอบ" ลิงก์ไป/workmonitorหรือจากแถบหัวระบบ "ระบบ 3D จอพนักงาน" - หน้า
/workmonitorเป็น Server Page: ไม่มี session เด้งไป/loginยังไม่เลือกฐานข้อมูลเด้งไป/select-databaseถ้าผ่านจะวางWorkspaceRouteSyncแล้วPersistentWorkspaceHostโหลดจอEmployeeWorkMonitor3DScreenแบบโหลดตามต้องการ (ดู พื้นที่ทำงานแบบแท็บ MDI และสิทธิ์จอ (TabWorkspace)) - บนโดเมนเดโม ด่าน
proxyอนุญาตเส้นทาง/workmonitorไว้ในรายการที่กำหนด (เหมือน/monitormapและ/fraudwarningที่อยู่กลุ่มเดียวกัน ดู 3D Monitor TV แผนที่ธุรกรรมประเทศไทย ภาพรวม (SYS-13 MonitorMap))
ภาพรวมการทำงาน
- ทุกหน้าของ workspace ที่ล็อกอินแล้วมีตัวแทนเงียบ
WorkstationTelemetryAgentติดอยู่ในPersistentWorkspaceHost(ไม่แสดงอะไรบนหน้าจอพนักงาน) มันเปิด SSEGET /api/workmonitor/stream?role=agentเพื่อลงทะเบียน "โต๊ะ" ของแท็บนี้ - ผู้ดูเปิด
/workmonitorจอเปิดสวิตช์ดูสดเป็นค่าเริ่มต้น แล้วเปิด SSE ฝั่งผู้ดู (role=viewer) เซิร์ฟเวอร์ส่งinit_snapshotกลับ และบอกทุกแท็บพนักงานว่า "มีคนดูอยู่" - เมื่อมีคนดู ตัวแทนบนเครื่องพนักงานเริ่มส่งสถานะหน้าจอ (หน้าที่เปิด ช่องที่กำลังพิมพ์ ตำแหน่งเมาส์ ภาพรวม DOM) ผ่าน
POST /api/workmonitor(telemetry_ping) และเปิดท่อ WebRTC ตรงไปยังผู้ดู - ผู้ดูเห็นโต๊ะในฉาก 3 มิติ เลือกโต๊ะเพื่อดูหน้าจอจำลองแบบสดและซูมได้ ลากย้ายโต๊ะหรือสั่งจัดผังอัตโนมัติ (
move_desk,apply_preset_layout) ตำแหน่งใหม่ถูกกระจายให้ผู้ดูทุกคนทันที - ปิดสวิตช์ดูหรือไม่มีผู้ดูเหลือ: เซิร์ฟเวอร์สั่งตัวแทนปิดท่อ WebRTC และ
telemetry_pingถูกข้าม (skippedBecauseNoViewer) จึงไม่มีข้อมูลหน้าจอของพนักงานถูกส่งเข้าเซิร์ฟเวอร์ (แต่การบันทึกพฤติกรรมไป/api/fraudwarningยังทำงานตามปกติ ดูหัวข้อความสัมพันธ์) - พนักงานปิดแท็บ: ตัวแทนส่ง
disconnectแล้วโต๊ะหายจากฉาก
เส้นทาง /api/workmonitor (GET, POST 6 การกระทำ) และ /api/workmonitor/stream อธิบายไว้ครบที่ API ตรวจสุขภาพ แผนที่ติดตาม และเส้นทางเฉพาะชั้น Next (Health, Monitormap, Next-only routes) ไม่เขียนซ้ำที่นี่ ทั้งสองเป็นเส้นทางของชั้น Next เท่านั้น ไม่ผ่านระบบหลังบ้าน Go
ข้อมูลอยู่ที่ไหน (ไม่มีตารางฐานข้อมูล)
getInMemoryHub(database) เก็บสถานะใน globalThis.__bcWorkMonitorRamHubMap แยกตามชื่อฐานข้อมูลของ session (ตัวพิมพ์เล็ก ค่าเริ่มต้น bcdemo) แต่ละฐานมี:
sessionsโต๊ะ/แท็บที่ออนไลน์ (EmployeeDeskNode) และlayoutsตำแหน่งโต๊ะที่ผู้ดูลากไว้logsประวัติการเปลี่ยนหน้าจอล่าสุดสูงสุด 30 รายการ (ตอบกลับ 25)viewersและagentsคือ callback ของ SSE ที่เชื่อมอยู่ และtotalSignalsRelayedตัวนับสัญญาณ WebRTC ที่ส่งต่อ
ผลที่ตามมา: รีสตาร์ท Next แล้วข้อมูลหายหมด และถ้ารันหลาย process/หลายเครื่องจะไม่ใช้สถานะร่วมกัน ผู้ดูกับพนักงานต้องต่อเข้า process เดียวกัน
กฎล้างโต๊ะที่ค้าง (pruneStaleInMemorySessions) ทำงานทุกครั้งที่ขอ snapshot:
- โต๊ะที่
routePathเป็น/workmonitorถูกลบทิ้ง (ไม่แสดงหน้าจอของจอดูเอง) - โต๊ะที่มี SSE ตัวแทนเชื่อมอยู่: ลบทั้งโต๊ะและตัวแทนเมื่อไม่มีการอัปเดตเกิน 180 วินาที
- โต๊ะที่ไม่มี SSE ตัวแทน: ลบเมื่อเงียบเกิน 15 วินาที
ข้อสังเกตจากการอ่านโค้ด (ยังไม่ได้ทดสอบจริง): ตัวแทนส่ง telemetry_ping เฉพาะตอนมีคนดูหรือเมื่อสั่งบังคับ จึงไม่มีสัญญาณต่ออายุเป็นระยะตอนไม่มีผู้ดู โต๊ะที่เปิดค้างนานเกิน 180 วินาทีก่อนผู้ดูคนแรกเข้า อาจถูกล้างออกจาก hub ตอนผู้ดูเปิดจอ
ตัวเลขสรุป (KPI)
getInMemoryWorkMonitorSnapshot คำนวณจำนวนโต๊ะ ออนไลน์ กำลังพิมพ์ ว่าง ค่าเฉลี่ยจำนวนครั้งกดแป้นใน 60 วินาทีล่าสุด (avgKpmRate) และผลรวม txVolumeToday / docsProcessedToday ของทุกโต๊ะ ข้อจำกัดของโค้ดปัจจุบัน:
docsProcessedTodayไม่มีจุดใน hub ที่บวกเพิ่ม ตัวเลข "เอกสารที่ประมวลผล" จึงเป็น 0 เสมอtxVolumeTodayรับได้เฉพาะเมื่อtelemetryส่งtxAmountมา แต่ตัวแทนไม่ส่งค่านี้ จึงเป็น 0 เสมอ- ตัวแทนตั้งสถานะได้เพียง
ONLINEหรือTYPING(มีการกดแป้นภายใน 60 วินาที) จำนวนโต๊ะ "ว่าง" (IDLE) จึงเป็น 0
ความสัมพันธ์กับระบบบัญชีและระบบอื่น
- ไม่อ่านหรือเขียนตารางบัญชี ใช้เพียง session (
userCode,userName,database) จากการล็อกอิน ดู เซสชันและการยืนยันตัวตนฝั่ง frontend (Auth session & tokens) - ชื่อหน้าจอที่โชว์มาจากแท็บ workspace ที่พนักงานเปิดจริง (รหัสเมนู + ชื่อจอ) เช่น POS, WMS, TMS, e-Tax ดู พื้นที่ทำงานแบบแท็บ MDI และสิทธิ์จอ (TabWorkspace) และ ทะเบียนหน้าจอและโครงเมนู (Screen registry & bcMenu)
- ตัวแทนตัวเดียวกันนี้ยังบันทึกพฤติกรรมการแก้ไขข้อมูลส่งไป
/api/fraudwarningตลอดเวลา ไม่ขึ้นกับว่ามีคนดูหรือไม่ ดู 3D Warning ตรวจจับความผิดปกติและทุจริต ภาพรวม (SYS-15 FraudWarning) - ปุ่มบนแถบควบคุม "3D Warning (ตรวจทุจริต)" พาไปยัง
/fraudwarning; ระบบพี่น้องในกลุ่มเดียวกันคือ 3D Monitor TV แผนที่ธุรกรรมประเทศไทย ภาพรวม (SYS-13 MonitorMap)
ข้อควรระวังและข้อจำกัด
- ตัวแทนไม่แจ้งพนักงาน: ตัวแทน
return nullไม่มีป้ายหรือปุ่มใดบนหน้าจอพนักงาน และไม่ขอสิทธิ์จากเบราว์เซอร์ การแจ้งพนักงานจึงเป็นเรื่องของนโยบายบริษัท ไม่ใช่ของโปรแกรม - ที่อยู่เครื่อง มาจากหัวข้อ
x-forwarded-forหรือx-real-ipถ้าไม่มีใช้ค่าเครื่องตัวเอง จึงเชื่อถือได้เฉพาะเมื่อผ่านพร็อกซีที่ตั้งค่าถูกต้อง - ใช้ได้เฉพาะ process เดียว และ STUN ที่ใช้เป็นบริการสาธารณะของผู้ให้บริการภายนอก ถ้าเครือข่ายองค์กรบล็อก ท่อ WebRTC อาจไม่ขึ้น (ฝั่งดูยังเห็นภาพ DOM ที่ส่งผ่านเซิร์ฟเวอร์ ดู ตัวแทนบนเครื่องพนักงาน สัญญาณ WebRTC และจอผู้ดู (WorkMonitor telemetry))
ที่มาในโค้ด
frontend/shared/layout/SystemPortalScreen.tsx:77-82,321-337กลุ่มและการ์ด SYS-14;frontend/shared/layout/Header.tsx:74-80,129-130ป้ายหัวระบบfrontend/shared/layout/PersistentWorkspaceHost.tsx:81-86โหลดตัวแทน;:93-102โหลดจอผู้ดู/จอ 3D Warning;:167-172จับคู่เส้นทาง;:511-514วางตัวแทนในทุกหน้า workspacefrontend/src/app/workmonitor/page.tsx:1-18redirect ตาม session;frontend/src/proxy.ts:10-25รายการเส้นทางบนโดเมนเดโมfrontend/src/app/api/workmonitor/route.ts:24-42GET snapshot;:168-220telemetry_ping(ข้ามเมื่อไม่มีผู้ดู, ที่อยู่จากหัวข้อ)frontend/workmonitor/inMemoryHub.ts:53-88โครง hub แยกตามฐาน;:459-484กฎล้างโต๊ะ;:486-526KPI และสถิติfrontend/workmonitor/workmonitorData.ts:113-149โซนพื้นของฉาก 3 มิติ- ดูเพิ่ม: ตัวแทนบนเครื่องพนักงาน สัญญาณ WebRTC และจอผู้ดู (WorkMonitor telemetry) · 3D Warning ตรวจจับความผิดปกติและทุจริต ภาพรวม (SYS-15 FraudWarning) · 3D Monitor TV แผนที่ธุรกรรมประเทศไทย ภาพรวม (SYS-13 MonitorMap) · API ตรวจสุขภาพ แผนที่ติดตาม และเส้นทางเฉพาะชั้น Next (Health, Monitormap, Next-only routes) · เส้นทาง API ฝั่ง Next.js ที่ส่งต่อไป Go backend (API proxy routes)