#screens#pos
พื้นที่ทำงาน POS: จอขายแคชเชียร์ (PosDemoWorkspace)
หน้า "ขายหน้าร้าน" ที่เปิดจาก URL /pos ภายในเว็บ SML Ai Account ตัวจอเป็นเปลือก (shell) ที่ฝังแอปแคชเชียร์ Flutter Web ไว้ใน iframe และมีแถบสลับไปหน้าตั้งค่า POS ของระบบบัญชี หน้านี้อยู่คนละกลุ่มกับเมนู ERP ไม่มีรหัสเมนู 4 หลักและไม่ผ่าน screenRegistry (ทะเบียนหน้าจอและโครงเมนู (Screen registry & smlMenu))
วิธีเปิด
- ไปที่
/posหรือ/pos/...โดยตรง หรือจากลิงก์ "เปิดจอขายแคชเชียร์ POS (/pos)" ในจอตั้งค่า (ตั้งค่าและควบคุมระบบขายหน้าร้าน POS (PosSetupAndControlScreen)) - เพจ
src/app/pos/page.tsxตรวจ session: ยังไม่ล็อกอิน -> ไป/login, ยังไม่เลือกฐานข้อมูล -> ไป/select-databaseแล้วจึงเรนเดอร์WorkspaceRouteSync PersistentWorkspaceHostแปลง path ที่ขึ้นต้นด้วย/posเป็นโมดูลpos(PersistentWorkspaceHost.tsx:154) และแสดง<PosDemoWorkspace />(:552) ตัวโมดูลถูกคงสถานะไว้เมื่อสลับระบบอื่น (ดู โครงหน้าเว็บและการนำทาง (App shell & routing))
แถบควบคุมด้านบน (:116-262)
| ปุ่ม | ทำอะไร |
|---|---|
| กลับหน้าหลัก SML Account | ลิงก์ไป /home |
| จุดขายแคชเชียร์ (Flutter POS) | แสดงแอปแคชเชียร์ (viewMode = cashier) |
| สูตรโปรโมชั่น POS (Dede 10 รูปแบบ) | แสดงหน้าตั้งค่า แท็บ promotions |
| กำหนดค่าเริ่มต้น POS | แสดงหน้าตั้งค่า แท็บ startup |
| รหัสเครื่อง POS | แสดงหน้าตั้งค่า แท็บ machines |
| แถบสถานะเสียง | คลิกเพื่อทดสอบเสียงเอฟเฟกต์และเสียงพูดไทย |
| Desktop (เต็มจอ) / Tablet (1024x768) / Mobile (412x840) | เปลี่ยนขนาดกรอบแอปแคชเชียร์เพื่อดูตัวอย่างหลายอุปกรณ์ |
เมื่ออยู่โหมดตั้งค่า ปุ่มมุมขวาแสดงข้อความ "เชื่อมฐานข้อมูล SML Ai Account (PostgreSQL ↔ ObjectBox POS)" แทนตัวเลือกขนาดจอ (:262)
โหมดแคชเชียร์
- โหลดแอป Flutter Web จากไฟล์สถิตใน
public/pos-app/index.htmlด้วยiframe(:279-312) โหมด Desktop เต็มพื้นที่ ส่วน Tablet/Mobile วางในกรอบอุปกรณ์ขนาดคงที่ (max-h86vh) - แอปนี้เป็นโค้ดแยก (build ของ Flutter ใต้
pos-app/) ไม่ใช่โค้ดของfrontend/accountรายละเอียดหน้าจอขายจึงอยู่นอกบันทึกนี้ ตรรกะบิลและการซิงก์ฝั่งหลังบ้านดู POS รับบิลขายจากเครื่องแคชเชียร์ กล่องรับบิล/ประมวลผล/ยกเลิก/ตัดสต็อกเป็นชุด (POS Bill Inbox), POS ซิงก์ข้อมูลเครื่องแคชเชียร์ ผูกเครื่อง/ดึงส่วนต่าง/กู้คืน/รูปภาพ (POS Device Sync)
โหมดตั้งค่า
ฝังจอ ตั้งค่าและควบคุมระบบขายหน้าร้าน POS (PosSetupAndControlScreen) (PosSetupAndControlScreen) ใน main โดยส่ง menuKey, menuCode, title เองตามแท็บที่กด (:271-300)
promotions->pos_promotion_formula,machines->menu_config_pos_machine, นอกนั้น ->menu_config_pos_startup- รหัสเมนูที่ส่งเป็นรหัสแบบจุดรุ่นเก่า ("2.1.14", "1.1.21", "1.1.20") ซึ่งไม่ตรงรหัส 4 หลักในเมนูปัจจุบัน (เช่น เครื่อง POS คือ 1017) เป็นแค่ป้ายแสดงมุมจอ ไม่กระทบสิทธิ์
- ปุ่ม ปิดหน้าจอ ในจอตั้งค่าสลับกลับโหมดแคชเชียร์ (
onClose,:293) - ใช้
key={configTab}จอตั้งค่าจึงรีเซ็ตทุกครั้งที่สลับแท็บ - แท็บโปรโมชั่นเปิดได้เฉพาะทางนี้ เพราะเมนูรหัส 2015 ใน ERP ใช้จอ master-detail (หน้าจอข้อมูลหลัก + ตารางย่อย (MasterDetailScreen))
ระบบเสียง (:31-115)
- หน้าต่างหลักฟังข้อความ
postMessageที่มีsource = "BC_POS_AUDIO"จากแอป POS: ชนิดspeak/speechแสดง "พูดไทย: ..." ส่วนเสียงกดแสดง "เสียงกด (<ชนิด>): ..." และกะพริบ 1.4 วินาที - ปุ่มทดสอบ เรียก
bcPosAudio.play("promo","test")กับspeak("ระบบขายหน้าร้าน เอสเอ็มแอล เอไอ พีโอเอส พร้อมใช้งาน", true)ในแอป ถ้าเข้าไม่ถึง iframe จะใช้speechSynthesisของเบราว์เซอร์ (ภาษาth-TH) แทน - ไฟล์เสียงที่ตั้งได้อยู่ที่เมนู 1051 ใน ตั้งค่าและควบคุมระบบขายหน้าร้าน POS (PosSetupAndControlScreen)
ข้อควรระวัง
- จอนี้ไม่ได้เรียก API เอง การขายจริงทั้งหมดอยู่ในแอป Flutter ภายใน iframe
- ชื่อไฟล์/คอมโพเนนต์ใช้คำว่า Demo แต่ผูกเป็นหน้า
/posจริงของระบบ - ข้อความเสียงที่ทดสอบกำหนดตายตัวในโค้ด
ที่มาในโค้ด
frontend/account/pos/PosDemoWorkspace.tsx:21-22ชนิดมุมมอง;:31-115สถานะ เสียง;:116-262แถบควบคุม;:265-320พื้นที่แสดงผลfrontend/src/app/pos/page.tsx— เพจ/posfrontend/shared/layout/PersistentWorkspaceHost.tsx:23-26,154,552— โหมดโมดูล pos- ดูเพิ่ม: ตั้งค่าและควบคุมระบบขายหน้าร้าน POS (PosSetupAndControlScreen) · จอประมวลผลระบบและ POS (System Process Workbench & POS Setup) · สารบัญหน้าจอทั้งหมดของ SML Ai Account (ต้นไม้เมนู → หน้าจอ → โน้ต)