เอกสารถอดตรรกะการทำงาน ระบบ Teacher V2 Curriculum
เอกสารนี้ถอดตรรกะการทำงานจาก prototype หน้า /teacher/v2/curriculum/ ให้เป็นภาษาที่ PO, UX, และทีม Dev ใช้คุยร่วมกันได้ โดยไม่ต้องเปิดโค้ด Astro แล้วไล่เดาเองว่าปุ่มหรือ component แต่ละส่วนทำอะไร
เป้าหมายของระบบ
ระบบนี้ควรถูกมองเป็น “พื้นที่ทำงานของครูแนะแนว” มากกว่าระบบรายงานหรือ dashboard
ครูเปิดระบบมาเพื่อรู้ว่า:
- วันนี้ต้องสอนอะไร
- ต้องใช้กิจกรรม สื่อ หรือใบงานไหน
- นักเรียนคนไหนต้องติดตาม
- หลังสอนต้องบันทึกอะไร
- ระบบสรุปความครอบคลุมของแผนให้อัตโนมัติ
ดังนั้นหน้าแรกควรเป็น Today หรือ “ผู้ช่วยสอนวันนี้” ส่วน Reports เป็นหน้าตรวจภาพรวมภายหลัง ไม่ใช่พระเอกของระบบ
ขอบเขตของ Prototype ตอนนี้
Route หลัก:
/teacher/v2/curriculum/
ไฟล์หลัก:
src/pages/teacher/v2/curriculum.astrosrc/components/teacher/CurriculumBuilderApp.astro
ข้อมูลจำลอง:
src/data/curriculumData.ts
ตาราง mapping แบบ static:
MVP/table.html
แผนผัง Component
| Component | หน้าที่บนหน้า | ตรรกะที่เกี่ยวข้อง |
|---|---|---|
CurriculumBuilderApp.astro | โครงหลักของหน้า, header, tab, state, calculation, event ทั้งหมด | เป็น controller ของ prototype |
CurriculumOverviewView.astro | หน้า Today | รับข้อมูลจาก renderOverview() |
ActivityLibraryView.astro | หน้า Activities | รับข้อมูลจาก renderRecommendation() |
ScheduleView.astro | หน้า Calendar | รับข้อมูลจาก renderSchedule() |
DeliveryView.astro | หน้า Students | รับข้อมูลจาก renderDelivery() |
| Inline Materials | หน้า Materials | รับข้อมูลจาก renderWorkspacePages() |
| Inline Assessment | หน้า Assessment | เป็น checklist static ชั่วคราว |
| Inline Reports | หน้า Reports | รับข้อมูลจาก renderWorkspacePages() และ renderOverview() |
UnitDetailPanel.astro | Drawer รายละเอียดหน่วย | รับข้อมูลจาก renderUnitPanel() |
ActivityDetailPanel.astro | Drawer รายละเอียดกิจกรรม | รับข้อมูลจาก renderActivityPanel() |
ข้อสังเกตสำคัญ:
ไฟล์ component ย่อยส่วนใหญ่เป็นเพียงโครงหน้าจอ ส่วนตรรกะการทำงานจริงยังรวมอยู่ใน CurriculumBuilderApp.astro ค่อนข้างมาก ถ้าทำ production ควรแยกตรรกะการทำงานออกเป็น service/hook/store ให้ชัด
โครงข้อมูลที่ระบบใช้
หน่วยการเรียนรู้
ใช้บอกว่าแผนแนะแนวต้องครอบคลุมเรื่องใดบ้าง และแต่ละหน่วยควรมีสัดส่วนเท่าไร
ข้อมูลที่ใช้:
id: เลขหน่วย 1-4title: ชื่อหน่วยแบบเต็มshortTitle: ชื่อสั้นสำหรับแสดงบน card/tabletarget: สัดส่วนเป้าหมายของหน่วยmin: สัดส่วนขั้นต่ำที่ควรมีdescription: คำอธิบายหน่วยgoals: เป้าหมายการเรียนรู้color: สีประจำหน่วยcurrent: ค่าที่ระบบคำนวณภายหลังว่าแผนปัจจุบันครอบคลุมหน่วยนี้กี่เปอร์เซ็นต์
กิจกรรม
กิจกรรมคือสิ่งที่ครูเลือกเข้าแผน และเป็นฐานในการคำนวณ coverage ทั้งหมด
ข้อมูลที่ใช้:
id: รหัสกิจกรรมtitle: ชื่อกิจกรรมduration: จำนวนชั่วโมงunitId: กิจกรรมนี้อยู่ในหน่วยใดunitObjectives: ตัวชี้วัตถุประสงค์ เช่น4.1,4.2gradeLevel: ระดับชั้นที่เหมาะสมobjectives: วัตถุประสงค์ของกิจกรรมmaterials: สื่อหรือใบงานที่ใช้expectedOutcomes: ผลลัพธ์ที่คาดหวังcomps: สมรรถนะที่กิจกรรมนี้ช่วยพัฒนาskills: ทักษะที่กิจกรรมนี้ช่วยพัฒนา
รายการกิจกรรมในแผน
เมื่อครูเพิ่มกิจกรรมเข้าแผน ระบบจะสร้างรายการกิจกรรมในแผนขึ้นมา
ข้อมูลที่ใช้:
id: รหัสรายการในแผนactivityId: อ้างอิงกิจกรรมต้นทางweek: สัปดาห์ที่สอนdate: วันที่สอนstatus: สถานะของกิจกรรม เช่น เสร็จสิ้น / กำลังดำเนินการ / ยังไม่เริ่มsubStatus: ข้อความเสริมของสถานะ
สถานะการส่งงานและติดตามนักเรียน
ตอนนี้เป็นข้อมูลจำลองใน browser state เท่านั้น
{
totalStudents: 35,
sentCount: 30,
notStartedCount: 5,
pendingEvaluationCount: 7,
offlineLogCount: 0,
reminderSentCount: 0,
log: []
}
ถ้าทำจริง ข้อมูลชุดนี้ควรมาจาก assignment/submission API ของห้องเรียนนั้น
ตรรกะการทำงานหลักของระบบ
การคำนวณภาพรวมแผน
Function อ้างอิงใน prototype: calculate()
หน้าที่ของส่วนนี้คือดูว่า “แผนที่ครูเลือกไว้ตอนนี้ครอบคลุมพอหรือยัง”
ระบบคำนวณจากกิจกรรมที่ถูกเลือกเข้าแผนแล้ว โดยสรุปออกมาเป็น:
- จำนวนกิจกรรมทั้งหมด
- จำนวนชั่วโมงทั้งหมด
- สัดส่วนความครอบคลุมของแต่ละหน่วย
- สัดส่วนความครอบคลุมของสมรรถนะ
- สัดส่วนความครอบคลุมของทักษะ
- รายการเรื่องที่ยังขาด
- สถานะว่าแผนพร้อมใช้งานหรือยัง
สูตรปัจจุบัน:
- รวมชั่วโมงของกิจกรรมที่เลือกทั้งหมด
- สำหรับแต่ละหน่วย: เอาชั่วโมงของกิจกรรมในหน่วยนั้น หารด้วยชั่วโมงรวมทั้งหมด
- ถ้าไม่มีชั่วโมงรวม ให้ถือว่าความครอบคลุมเป็น 0%
- หน่วยใดที่ต่ำกว่า
minจะถือว่ายังขาด - สมรรถนะและทักษะคิดจากจำนวนกิจกรรมที่แตะเรื่องนั้น หารด้วยจำนวนกิจกรรมทั้งหมด
- ถ้าสมรรถนะหรือทักษะใดต่ำกว่า 25% จะถือว่ายังขาด
สถานะ “พร้อมใช้งาน” ตอนนี้เกิดขึ้นเมื่อ:
- ไม่มีหน่วยที่ต่ำกว่าเกณฑ์
- ไม่มีสมรรถนะที่ต่ำกว่าเกณฑ์
- ไม่มีทักษะที่ต่ำกว่าเกณฑ์
หมายเหตุสำหรับ production:
- ในโค้ดเดิมใช้ชื่อ
canApproveแต่ UX ปัจจุบันไม่ได้มี flow ส่งอนุมัติจริง ควรเปลี่ยนชื่อเป็นisPlanReadyหรือisCoverageReady - เกณฑ์ 25% ของสมรรถนะ/ทักษะยังเป็นสมมติฐานของ prototype ต้องให้ทีมหลักสูตรยืนยันก่อนใช้จริง
การสรุปเรื่องที่ยังขาด
Function อ้างอิง: gapLabels(summary)
หน้าที่คือแปลงผลคำนวณที่เป็นข้อมูลดิบ ให้กลายเป็นข้อความที่ครูอ่านรู้เรื่อง เช่น:
- ขาดหน่วย 2
- ขาดสมรรถนะการคิดขั้นสูง
- ขาดทักษะ Leadership
ข้อมูลนี้ถูกใช้ใน:
- header สถานะแผน
- ปุ่ม next action
- panel ความครอบคลุม
- หน้า Reports
การแนะนำกิจกรรม
Function อ้างอิง:
scoreActivity(activity, summary)recommendations(summary)
แนวคิดคือ ระบบควรช่วยครูเติมแผนให้ครบ โดยไม่ต้องให้ครูอ่านกิจกรรมทั้งหมดเอง
วิธีคิดคะแนนตอนนี้:
- ถ้ากิจกรรมช่วยเติมหน่วยที่ยังขาด ได้คะแนนเพิ่มมากที่สุด
- ถ้ากิจกรรมช่วยเติมสมรรถนะที่ยังขาด ได้คะแนนรองลงมา
- ถ้ากิจกรรมช่วยเติมทักษะที่ยังขาด ได้คะแนนเพิ่มอีกระดับหนึ่ง
- กิจกรรมที่อยู่ในแผนแล้วจะไม่ถูกแนะนำซ้ำ
น้ำหนักคะแนนใน prototype:
- เติมหน่วยที่ยังขาด: +4
- เติมสมรรถนะที่ยังขาด: +3 ต่อเรื่อง
- เติมทักษะที่ยังขาด: +2 ต่อเรื่อง
สิ่งที่ควรทำเพิ่มใน production:
- แสดงเหตุผลว่า “ทำไมระบบถึงแนะนำกิจกรรมนี้”
- ให้ backend ส่งรายการ recommendation กลับมาพร้อม reason
- ไม่ควรให้ client แต่ละหน้าคำนวณแยกเอง เพราะอาจไม่ตรงกัน
ตรรกะการทำงานรายหน้า
1. Header
Header ทำหน้าที่บอกสถานะแผนแบบเร็วที่สุด
ข้อมูลที่แสดง:
- ลิงก์กลับ
Teacher Workspace - ปีการศึกษา
- จำนวนกิจกรรมและจำนวนชั่วโมง
- สถานะแผน
- สถานะการบันทึก
- ปุ่ม action ถัดไปที่ระบบแนะนำ
สถานะที่แสดง:
- ถ้าแผนพร้อม:
แผนพร้อมใช้งาน - ถ้าแผนยังไม่พร้อม:
ยังต้องเติม {จำนวนเรื่อง} เรื่อง
ปุ่ม action ถัดไป:
- ถ้าแผนยังขาด: พาไปหน้า Activities
- ถ้าแผนครบแล้วแต่ยังไม่ได้จัดวัน: พาไป Calendar
- ถ้าแผนพร้อมแล้ว: พาไปขั้นตอนใช้งาน/สอนต่อ
สิ่งที่ต้องเปลี่ยนตอนทำจริง:
- ปีการศึกษาต้องมาจากบริบทโรงเรียน/เทอม
- สถานะบันทึกต้องอิง server ไม่ใช่ localStorage อย่างเดียว
- ปุ่มกลับ Teacher Workspace ไม่ควรปนกับ action ของแผน
2. Navigation
ระบบใช้ tab หลัก 7 หน้า:
- Today
- Calendar
- Activities
- Students
- Materials
- Assessment
- Reports
ใน prototype การเปลี่ยนหน้าใช้ data-view-tab และเปิด/ปิด .cb-view ด้วย JavaScript
ตอนทำจริงควรพิจารณา:
- จะใช้ router จริง หรือเก็บเป็น state ภายในหน้า
- ควรรองรับ browser back/forward หรือไม่
- ถ้าครูส่งลิงก์ให้กัน ควรเปิดมาที่ tab เดิมได้หรือไม่
3. Today
หน้า Today คือหน้าแรกของครู
คำถามที่หน้านี้ต้องตอบ:
- วันนี้สอนกิจกรรมอะไร
- ต้องใช้สื่ออะไร
- ต้องติดตามนักเรียนคนไหน
- หลังสอนต้องทำอะไรต่อ
ตรรกะการเลือกกิจกรรมวันนี้ใน prototype:
- เรียงกิจกรรมในแผนตามสัปดาห์
- ถ้ามีกิจกรรมสถานะ “กำลังดำเนินการ” ให้ใช้กิจกรรมนั้น
- ถ้าไม่มี ให้ใช้กิจกรรมแรกที่ “ยังไม่เริ่ม”
- ถ้าไม่มีอีก ให้ใช้กิจกรรมแรกในแผน
ข้อจำกัดของตรรกะปัจจุบัน:
- ยังไม่ได้ดูวันที่จริง
- ยังไม่ได้ดูตารางสอนจริง
- ยังไม่ได้ดูห้องเรียนที่ครูกำลังสอนจริง
ตอนทำ production ควรเลือกกิจกรรมวันนี้จาก:
- วันที่ปัจจุบัน
- ตารางสอนของครู
- ห้องเรียนที่เลือก
- กิจกรรมในแผนที่ผูกกับวันนั้น
4. Activities
หน้านี้ช่วยให้ครูเติมกิจกรรมที่แผนยังขาด
มี 2 ส่วน:
- กิจกรรมที่ระบบแนะนำ
- คลังกิจกรรมทั้งหมดสำหรับค้นหาเอง
ตรรกะของกิจกรรมแนะนำ:
- ถ้าแผนยังไม่ครบ ระบบแสดงกิจกรรมที่ช่วยเติม gap ได้ดีที่สุด
- ถ้าแผนครบแล้ว ระบบแสดงสถานะว่าพร้อม และพาไปจัดตาราง
ตรรกะของ filter:
- filter ตามระดับชั้น
- filter ตามหน่วยการเรียนรู้
- กิจกรรม
ทุกระดับถือว่าใช้ได้กับทุกระดับชั้น
Action หลัก:
- เพิ่มกิจกรรมเข้าแผน
- ดูรายละเอียดกิจกรรม
- เปิดคลังทั้งหมด
สิ่งที่ต้องทำจริง:
- คลังกิจกรรมควรมาจาก API
- การเพิ่มกิจกรรมต้องบันทึกลงแผนบน server
- ป้องกันการเพิ่มซ้ำทั้งฝั่ง client และ server
5. Calendar
Calendar ใช้จัดแผนให้สอนจริงได้
มี 3 ขั้นตอน:
- จัดลำดับกิจกรรม
- ตั้งวันสอน
- ตรวจความพร้อมก่อนใช้
ขั้นตอนจัดลำดับ:
- แสดงกิจกรรมที่เลือกไว้
- ครูเลื่อนขึ้น/ลงได้
- ครูลบกิจกรรมออกจากแผนได้
ขั้นตอนตั้งวัน:
- ครูเลือกวันเริ่มต้น
- ระบบเรียงวันสอนให้เป็นรายสัปดาห์
- ถ้าติ๊กข้ามวันหยุด ระบบจะข้ามวันที่อยู่ในรายการวันหยุด
ขั้นตอนตรวจแผน:
- ถ้าแผนพร้อม ระบบพาไป Students/Delivery
- ถ้ายังไม่พร้อม ระบบแสดง gap และแนะนำกิจกรรมที่ควรเติม
สิ่งที่ต้องทำจริง:
- วันหยุดต้องมาจาก school calendar
- ต้องเช็กวันชนกับตารางสอนจริง
- ต้องเก็บลำดับและวันที่ลง server
6. Students
หน้านี้ใช้ส่งกิจกรรมและติดตามนักเรียน
ตอนนี้ข้อมูลเป็น mock:
- จำนวนนักเรียนทั้งหมด
- จำนวนที่ได้รับงานแล้ว
- จำนวนที่ยังไม่เริ่ม
- จำนวนงานที่รอประเมิน
- log กิจกรรมล่าสุด
Action mock ตอนนี้:
- ส่งกิจกรรมให้ทั้งห้อง
- เตือนนักเรียนที่ยังไม่เปิดงาน
- ตรวจงานที่รอประเมิน
- บันทึกกิจกรรมออฟไลน์
สิ่งที่ต้องทำจริง:
- ทุก action ต้องเป็น API mutation
- ต้องมีรายชื่อนักเรียนจริง ไม่ใช่แค่ตัวเลขรวม
- ต้องมี rollback หรือ error state ถ้าส่งไม่สำเร็จ
7. Materials
หน้านี้แสดงสื่อของกิจกรรมที่ active อยู่
ตรรกะปัจจุบัน:
- ใช้กิจกรรมเดียวกับหน้า Today
- เอา
materialsของกิจกรรมนั้นมาแสดง - กดแล้วเปิด drawer รายละเอียดกิจกรรม
สิ่งที่ต้องทำจริง:
- สื่อควรมีประเภท เช่น slide, worksheet, QR, link
- ต้องมี URL หรือ file reference จริง
- ต้องกำหนดสิทธิ์การเข้าถึงไฟล์
8. Assessment
ตอนนี้เป็น checklist เตือนครูหลังสอน
เนื้อหาปัจจุบัน:
- นักเรียนที่ยังไม่ส่งงาน
- บรรยากาศในห้อง
- หลักฐานการเรียนรู้
สิ่งที่ต้องทำจริง:
- ต้องมี model สำหรับบันทึกหลังสอน
- ควรผูกกับ class session
- ควรแนบหลักฐานหรือไฟล์ได้
- ควรเลือกนักเรียนที่ต้องติดตามต่อได้
9. Reports
Reports ใช้ตรวจภาพรวม ไม่ใช่งานหลักในชีวิตประจำวันของครู
ข้อมูลที่แสดง:
- KPI ความครอบคลุมของหน่วย
- KPI ความครอบคลุมของสมรรถนะ
- KPI ความครอบคลุมของทักษะ
- ตารางหน่วยการเรียนรู้
- metrics ภาพรวม
หลักการสำคัญ:
- Reports ควรใช้ summary เดียวกับ Header และ Today
- ไม่ควรมีสูตรคำนวณซ้ำคนละที่
10. Unit Drawer
Drawer หน่วยใช้ให้ครูเข้าใจว่าแต่ละหน่วยคืออะไร
ข้อมูลที่แสดง:
- ชื่อหน่วย
- เป้าหมายและขั้นต่ำ
- คำอธิบายหน่วย
- เป้าหมายการเรียนรู้
- กิจกรรมในหน่วยนั้น
Action:
- เปิดรายละเอียดกิจกรรม
- ไปหน้า Activities พร้อม filter หน่วยนั้น
11. Activity Drawer
Drawer กิจกรรมใช้ให้ครูตัดสินใจก่อนเพิ่มเข้าแผน
ข้อมูลที่แสดง:
- ชื่อกิจกรรม
- หน่วย
- ระยะเวลา
- ระดับชั้น
- วัตถุประสงค์
- สื่อการสอน
- ผลลัพธ์ที่คาดหวัง
- สมรรถนะและทักษะ
Action:
- ถ้ายังไม่อยู่ในแผน: เพิ่มกิจกรรมเข้าแผน
- ถ้าอยู่ในแผนแล้ว: ปิด drawer
การบันทึกข้อมูล
ตอนนี้ prototype ใช้ localStorage
Key:
cb-plan-v1
ข้อมูลที่บันทึก:
- รายการกิจกรรมในแผน
- สถานะ delivery mock
- เวลาที่บันทึกล่าสุด
พฤติกรรม:
- แก้ไขแล้วตั้งสถานะกำลังบันทึก
- debounce ประมาณ 800ms
- บันทึกลง localStorage
- เปลี่ยนข้อความสถานะบน header
ตอนทำจริง:
- ต้องเปลี่ยนเป็น server-side draft
- localStorage ใช้ได้แค่ fallback หรือ cache ชั่วคราว
- ต้องรองรับการเปิดจากหลายเครื่อง
Endpoint ที่ควรมี:
GET /teacher/curriculum-plans/currentPATCH /teacher/curriculum-plans/{id}POST /teacher/curriculum-plans/{id}/activitiesDELETE /teacher/curriculum-plans/{id}/activities/{eventId}POST /teacher/curriculum-plans/{id}/auto-schedulePOST /teacher/curriculum-plans/{id}/deliver
Contract ของ Action ใน Prototype
ตารางนี้ช่วยให้ Dev เห็นว่า DOM action เดิมหมายถึง behavior อะไร
| Attribute | ความหมาย |
|---|---|
data-view-tab | เปลี่ยน tab หลัก |
data-go | ไปยัง view อื่น |
data-add | เพิ่มกิจกรรมเข้าแผน |
data-add-close | เพิ่มกิจกรรมแล้วปิด drawer |
data-remove | ลบกิจกรรมออกจากแผน |
data-schedule-step, data-step | เปลี่ยน step ใน Calendar |
data-auto-schedule | สร้างวันที่สอนอัตโนมัติ |
data-shift + data-dir | เลื่อนกิจกรรมขึ้น/ลง |
data-open-unit | เปิด drawer หน่วย |
data-open-act | เปิด drawer กิจกรรม |
data-close-unit, data-close-act | ปิด drawer |
data-save-draft | บันทึกแผน |
data-next-action | ทำ action ถัดไปที่ระบบแนะนำ |
data-delivery-action | ทำ action ในหน้า Students |
data-go-unit-lib, data-go-unit-library | ไปคลังกิจกรรมพร้อม filter หน่วย |
data-event-date | แก้วันที่ของกิจกรรมในแผน |
data-grade-filter, data-unit-filter | filter คลังกิจกรรม |
ตอนทำจริงควรเปลี่ยนจาก DOM attribute เป็น typed event/action ของ framework ที่ใช้ แต่ชื่อ action เหล่านี้ยังใช้เป็น reference ได้
ตรรกะการทำงานที่ควรถอดออกหรือแยกเป็น Feature เฉพาะ
Onboarding Tour
Prototype มี tour แนะนำระบบ โดยจำ state ด้วย localStorage key cb-tour-v1
ถ้าจะใช้จริงควร:
- ทำเป็น feature flag
- แยกออกจาก controller หลัก
- มีปุ่มเปิดดูซ้ำได้
- ไม่ควรบังคับทุกครั้งที่เปิดหน้า
Skeleton Loading จำลอง
ตอนนี้ skeleton เกิดจาก timeout เพื่อให้ demo ดูมี transition
ถ้าทำจริงควร:
- ผูกกับ loading state ของ API
- ไม่ใส่ delay ปลอมถ้าข้อมูลมาเร็ว
Delivery Mock Counter
ตัวเลขการส่งงานและเตือนนักเรียนตอนนี้เปลี่ยนใน browser state
ถ้าทำจริงต้อง:
- เรียก API
- มี error state
- มีรายชื่อนักเรียนรายคน
ชื่อ canApprove
ชื่อเดิมทำให้เข้าใจเหมือนมี flow อนุมัติ
UX ปัจจุบันสรุปแล้วว่าไม่ควรมี “ส่งอนุมัติหลักสูตร” สำหรับครูใน flow นี้ จึงควรเปลี่ยนเป็นคำว่า:
isPlanReadyisCoverageReadyreadiness.status
ข้อมูล hardcoded
ข้อมูลต่อไปนี้ยังเป็น mock:
- ปีการศึกษา 2569
- ห้อง ม.4/1
- นักเรียนที่ต้องติดตาม
- วันหยุดโรงเรียน
- สถานะส่งงาน
รูปแบบข้อมูล Summary ที่แนะนำ
type CurriculumPlanSummary = {
academicYear: number;
classId: string;
selectedActivityCount: number;
totalHours: number;
readiness: {
status: "ready" | "needs_action";
gapCount: number;
gaps: Array<{
type: "unit" | "competency" | "skill";
id: string | number;
label: string;
currentPercent: number;
targetPercent: number;
minimumPercent?: number;
}>;
};
coverage: {
units: Array<{ id: number; label: string; current: number; target: number; min: number }>;
competencies: Array<{ id: string; label: string; current: number; target: number }>;
skills: Array<{ id: string; label: string; current: number; target: number }>;
};
recommendations: Array<{
activityId: string;
score: number;
reasons: string[];
}>;
};
รูปแบบข้อมูลกิจกรรมในแผนที่แนะนำ
type CurriculumPlanItem = {
id: string;
activityId: string;
order: number;
week: number;
date?: string;
classId: string;
status: "not_started" | "scheduled" | "in_progress" | "completed";
};
ตาราง MVP
ไฟล์:
MVP/table.html
หน้าที่:
- แสดง matrix ว่ากิจกรรมแต่ละตัวเชื่อมกับวัตถุประสงค์และสมรรถนะใด
- ตอนนี้เป็น static HTML
- ไม่ได้เชื่อมกับ Teacher V2 โดยตรง
แนวทาง production:
- ควรมองเป็น report/export view
- mapping กลางอยู่ใน
src/data/curriculumData.tsผ่านCURRICULUM_OBJECTIVES,CORE_COMPETENCIES,ACTIVITY_CURRICULUM_MAPPINGS, และCURRICULUM_COVERAGE_SUMMARY - report/export ควร generate จาก mapping เดียวกับข้อมูลกิจกรรม
- ไม่ควรดูแลเป็นไฟล์ static แยกจาก source of truth
คำถามที่ PO ต้องตัดสินใจก่อนทำจริง
- เกณฑ์ readiness อย่างเป็นทางการคืออะไร
- หน่วยใช้ค่า min รายหน่วย
- สมรรถนะ/ทักษะตอนนี้ใช้ 25% แบบ prototype
- แผนหนึ่งชุดผูกกับอะไร
- ครู
- ห้องเรียน
- ระดับชั้น
- เทอม
- หรือทั้งหมดร่วมกัน
- หน้า Today ควรอิงจากอะไร
- วันที่ปัจจุบัน
- timetable จริง
- กิจกรรมที่ครูเลือกเป็น active
- หรือห้องเรียนที่กำลังเปิดอยู่
- การติดตามนักเรียนควรลึกแค่ไหน
- เตือนเท่านั้น
- บันทึก offline completion
- จด note รายคน
- ส่งต่อผู้เกี่ยวข้อง
- ครูควรส่งกิจกรรมแบบใด
- ส่งทีละกิจกรรม
- ส่งทั้งแผน
- ส่งเฉพาะกิจกรรมวันนี้
- Reports ต้อง export/print ได้หรือไม่
- Onboarding tour จะใช้จริงหรือเป็นแค่ demo
ลำดับงานที่แนะนำให้ทีม Dev ทำ
- แยก data model และสูตรคำนวณ summary ออกจาก UI
- ทำ draft plan CRUD บน server
- ทำ Today จาก timetable + plan item + class context
- ทำ recommendation พร้อมเหตุผล
- ทำ Calendar ที่ตรวจวันชนกับ school calendar
- ทำ Students/Delivery จาก assignment/submission จริง
- ทำ Reports จาก summary endpoint เดียวกัน
- แปลง MVP table ให้ generate จากข้อมูลจริง