# 📊 สรุปผลและวิเคราะห์การพัฒนาระบบ iRAM-Scopus (Retrospective Report)

**วันที่จัดทำรายงาน:** 31 กรกฎาคม 2026
**ระบบที่เกี่ยวข้อง:** `iram-scopus` (Frontend / Ingestion) และ `iram-backend` (API / Database)

เอกสารฉบับนี้เป็นการทบทวนเส้นทางการพัฒนาระบบ iRAM ตั้งแต่จุดเริ่มต้นจนถึงปัจจุบัน พร้อมทั้งวิเคราะห์จุดคอขวด (Bottlenecks) ที่ทำให้เสียเวลา สาเหตุรากฐาน (Root Causes) และวิธีการที่เราใช้แก้ปัญหาจนระบบมีความเสถียรในปัจจุบัน

---

## 1. 🛣️ สรุปแผนการดำเนินการตั้งแต่ต้น (The Journey)

เราได้พัฒนาระบบ iRAM (Institutional Research Analytics Metrics) โดยแบ่งออกเป็นเฟสต่างๆ ดังนี้:

### เฟสที่ 1: สถาปัตยกรรมแบบ Static (Local JSON)
- **เริ่มต้นโปรเจกต์:** สร้างหน้าแดชบอร์ดด้วย HTML/CSS/JS บริสุทธิ์ (Single Page Application) ในโฟลเดอร์ `iram-scopus`
- **ระบบข้อมูล:** ใช้สคริปต์ Python (`fetch_data.py`) ไปดึงข้อมูลจาก Scopus/PubMed และเซฟลงมาเป็นไฟล์ `data.json` และ `researchers.json` บนเครื่อง
- **ข้อจำกัดที่พบ:** ข้อมูลเริ่มมีขนาดใหญ่ขึ้น การอัปเดตข้อมูลด้วยการเซฟทับไฟล์ JSON ทำให้เกิดความเสี่ยงสูงหากมีคนแก้ไขพร้อมกัน และไม่สามารถสเกลระบบให้คนอื่นใช้งานได้อย่างแท้จริง

### เฟสที่ 2: การยกระดับสู่ระบบ Cloud & API (Cloudflare D1)
- **สร้าง Backend:** เราได้สร้างโปรเจกต์ใหม่ชื่อ `iram-backend` โดยใช้เทคโนโลยี Cloudflare Workers และฐานข้อมูล D1 เพื่อเป็นศูนย์กลางของข้อมูล (Source of Truth)
- **ปรับ Data Pipeline:** เปลี่ยนสคริปต์ Python ให้เลิกเซฟลงไฟล์ JSON แต่เปลี่ยนเป็นการยิง HTTP POST ไปที่ API (`/api/publications/import`) ของ Backend แทน เพื่อให้ข้อมูลถูกจัดเก็บอย่างปลอดภัยบน Cloud
- **เพิ่มแหล่งข้อมูล:** พัฒนาสคริปต์ `fetch_wos_orcid.py` เพื่อดึงผลงานจาก Web of Science (WoS) เข้ามารวมกับ Scopus และ PubMed 

### เฟสที่ 3: การจัดการ Data Alignment และ UI Refinement
- **แก้บั๊กแสดงผล:** ปรับแก้การแสดงผลปีที่ติดทศนิยม (2020.0) และเพิ่มการรองรับยอดอ้างอิง (Citations) ทะลุทะลวงตั้งแต่ Database, API, Python ไปจนถึงหน้า Frontend
- **การจัดระเบียบหน้า Admin:** ยกเลิกการแก้ไขข้อมูลผ่านหน้าเว็บ (เนื่องจากให้ Python จัดการแบบอัตโนมัติ 100%) และเปลี่ยนหน้า Admin เป็นแบบ Read-Only Dashboard เพื่อตรวจสอบความถูกต้อง

---

## 2. 🏆 ผลการดำเนินการ (Current Results)

✅ **ระบบ Backend เสถียรภาพสูง:** ข้อมูลถูกจัดเก็บอย่างเป็นระเบียบใน Cloudflare D1 มี API รองรับการทำงานทั้งดึงข้อมูลและอัปเดตข้อมูล 
✅ **Pipeline ข้อมูลอัตโนมัติเต็มรูปแบบ:** ดึงข้อมูลจากทั้ง Scopus, PubMed, และ Web of Science โดยสามารถนำบทความที่ซ้ำกันมารวมแท็ก (Deduplication) ได้อัตโนมัติ
✅ **Frontend ทันสมัยและแม่นยำ:** หน้า Dashboard (`app.js`), หน้า Report (`report.js`), และหน้า Admin (`admin.js`) ดึงข้อมูลชุดเดียวกันจาก API กลางแบบ Real-time ขจัดปัญหาข้อมูลคลาดเคลื่อนโดยสิ้นเชิง

---

## 3. 🔍 การวิเคราะห์ปัญหา: จุดที่เรา "เสียเวลา" มากที่สุด

จากการทบทวนประวัติการทำงาน เราพบว่าจุดที่ทีมงานใช้เวลาและรอบการทำงาน (Iterations) สูงสุด คือ **"การจัดการสถาปัตยกรรมข้อมูลในช่วงรอยต่อ (Data Discrepancy during Migration)"**

### ⚠️ อาการของปัญหา (The Symptoms)
- ข้อมูลที่โชว์หน้าแรก (`app.js`) ไม่ตรงกับที่แสดงในหน้า Admin (`admin.js`) และหน้า Report Matrix (`report.js`) 
- ปุ่ม "Save to JSON" ในหน้า Admin กดแล้วไม่ทำงาน และโยน Error ฟ้องว่าหา API ไม่เจอ (`/api/researchers`)

### 🧠 สาเหตุที่แท้จริง (Root Cause)
1. **Partial Migration (อัปเกรดไม่ครบทุกส่วน):** ในช่วงที่เราเปลี่ยนผ่านจาก Static JSON ไปเป็น Cloudflare API เราได้ทำการแก้โค้ดแค่ที่หน้าแรก (`app.js`) ให้ไปดึงข้อมูลจาก API ใหม่เท่านั้น แต่เรา "ลืม" อัปเดตหน้า `report.js` และ `admin.js` ทำให้สองหน้านี้ยังคงโหลดข้อมูลจากไฟล์ `data.json` ตัวเก่าที่ตายไปแล้ว
2. **Ghost API Endpoint (อ้างอิง API ที่ไม่มีอยู่จริง):** หน้า Admin ถูกเขียนมาให้ส่งคำสั่ง POST ไปยัง `/api/...` แบบ Local (เหมือนตั้งสมมติฐานว่ามี Express Server รันอยู่ในเครื่อง) แต่ในความเป็นจริง เราใช้ระบบ Static Pages การเซฟจึงพังทันที เพราะไม่มี Local Server คอยรับคำสั่ง
3. **Conflict of "Source of Truth":** เราพยายามจะสร้างหน้าให้แก้ไขข้อมูลด้วยมือ (Manual Edit) ในขณะที่เราก็มี Python สคริปต์คอยดึงข้อมูลมาทับ (Automated Ingestion) ทำให้เกิดความขัดแย้งว่า ใครควรจะเป็นผู้เขียนข้อมูลที่แท้จริง

### 💡 วิธีแก้ปัญหาที่เกิดขึ้น (The Resolutions)
เพื่อแก้ปัญหานี้ให้เด็ดขาดและไม่ต้องกลับมาแก้ซ้ำ ทีม iRAM ได้ดำเนินการดังนี้:
1. **ทำการ Data Alignment ครั้งใหญ่:** เขียนโค้ดรื้อระบบใน `report.js` และ `admin.js` ใหม่ทั้งหมด ให้เลิกอ่านไฟล์ `.json` แล้วบังคับให้ชี้ไปที่ `https://iram-backend.tinnakornh.workers.dev/api/...` ทำให้หน้าเว็บทั้ง 3 หน้าเห็นข้อมูลชุดเดียวกันเป๊ะๆ
2. **ตัดใจทิ้งระบบที่ขัดแย้งกัน:** เราตัดสินใจถอดระบบ "Save to JSON" ในหน้า Admin ทิ้ง เปลี่ยนสถานะหน้า Admin เป็น **Read-only Monitor** เพราะข้อตกลงใหม่คือ ข้อมูลจะต้องอัปเดตผ่าน Python Automation เท่านั้น มนุษย์จะไม่แก้ไขเองผ่านหน้าเว็บเพื่อรักษาความสะอาดของ Data Pipeline
3. **ปรับแก้ Document:** อัปเดตไฟล์ `about.html` เพื่อเขียนทับประวัติสถาปัตยกรรม แจ้งให้ทุกคนในอนาคตทราบว่าระบบได้เปลี่ยนจาก JSON ไปเป็น Cloudflare API อย่างเป็นทางการ (Legacy Notice)

### 📈 บทเรียนที่ได้รับ (Lessons Learned)
การย้ายฐานข้อมูล (Migration) ต้องทำแบบ **Holistic (มองภาพรวม)** ทุกครั้งที่มีการเปลี่ยน URL แหล่งข้อมูล หรือ Schema ต้องสั่งค้นหาโค้ดทั้งโปรเจกต์แบบครอบคลุม (Search All Files) เพื่อป้องกันไม่ให้มีไฟล์ใดตกหล่นและกลายเป็น "ข้อมูลผี" ที่ไม่ซิงค์กับระบบหลักครับ
