Content is user-generated and unverified.

เอกสารประกอบการส่งมอบฐานข้อมูล MOPH-IC (COVID-19 Immunization)

1. ภาพรวมของระบบ

ระบบ MOPH-IC เป็นระบบฐานข้อมูลการฉีดวัคซีน COVID-19 ที่พัฒนาขึ้นเพื่อจัดเก็บและบริหารจัดการข้อมูลการฉีดวัคซีนของประชาชน โดยใช้ MongoDB เป็นฐานข้อมูลหลัก

1.1 Flow การส่งมอบระบบ

2. โครงสร้างไฟล์ที่ส่งมอบ

moph-ic-handover/
│
├── docker-compose.yml
├── data/                    # MongoDB data volume
├── moph-ic-data/           # ข้อมูล JSON สำหรับ import
│   ├── immunization_stat.json
│   └── visit_immunization.json
├── init.sh                 # Script initialization
└── README.md

3. ขั้นตอนการ Backup ข้อมูลจาก MongoDB

3.1 การ Export ข้อมูลเป็น JSON

bash
# Export collection immunization_stat
mongoexport --host <mongodb-host> --port <port> \
  --db mophic --collection immunization_stat \
  --out moph-ic-data/immunization_stat.json \
  --jsonArray

# Export collection visit_immunization
mongoexport --host <mongodb-host> --port <port> \
  --db mophic --collection visit_immunization \
  --out moph-ic-data/visit_immunization.json \
  --jsonArray

3.2 ตรวจสอบความถูกต้องของไฟล์

bash
# ตรวจสอบ format JSON
jq . moph-ic-data/immunization_stat.json | head -20
jq . moph-ic-data/visit_immunization.json | head -20

# นับจำนวน records
jq '. | length' moph-ic-data/immunization_stat.json
jq '. | length' moph-ic-data/visit_immunization.json

## 4. การตั้งค่า Docker Compose

### 4.1 ไฟล์ docker-compose.yml

```yaml
services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: unless-stopped
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin
      MONGO_INITDB_DATABASE: mophic
    ports:
      - "17017:27017"
    volumes:
      - ./data:/data/db
      - ./moph-ic-data:/docker-entrypoint-initdb.d/data:ro
      - ./init.sh:/docker-entrypoint-initdb.d/init.sh:ro
```

### 4.2 ไฟล์ init.sh

```bash
#!/bin/bash
set -eu

# Loop over each JSON file and import into its own collection
for filepath in /docker-entrypoint-initdb.d/data/*.json; do
  collection="$(basename "$filepath" .json)"
  echo "[init] importing $collection from $filepath"
  mongoimport \
    --username "$MONGO_INITDB_ROOT_USERNAME" \
    --password "$MONGO_INITDB_ROOT_PASSWORD" \
    --authenticationDatabase admin \
    --db "$MONGO_INITDB_DATABASE" \
    --collection "$collection" \
    --file "$filepath" \
    --type json
done
```

## 5. การเตรียมไฟล์ init.sh

ไฟล์ init.sh จะถูกรันอัตโนมัติเมื่อ MongoDB container เริ่มทำงาน โดยจะ import ไฟล์ JSON ทั้งหมดที่อยู่ใน folder `/docker-entrypoint-initdb.d/data/`

### 5.1 การตั้ง Permission

```bash
# ตั้ง execute permission ให้กับ init.sh
chmod +x init.sh
```

### 5.2 โครงสร้างการทำงานของ init.sh

```mermaid
flowchart TD
    A[MongoDB Container Start] --> B[Run init.sh]
    B --> C[Loop ผ่านไฟล์ .json ทั้งหมด]
    C --> D[Extract ชื่อ collection จากชื่อไฟล์]
    D --> E[Import ข้อมูลเข้า MongoDB]
    E --> F{มีไฟล์ .json อื่นอีกไหม?}
    F -->|Yes| C
    F -->|No| G[MongoDB Ready with Data]
    
    style A fill:#f9f,stroke:#333,stroke-width:2px
    style G fill:#9f9,stroke:#333,stroke-width:2px
```

### 5.3 หลักการทำงาน

- Script จะวนลูปหาไฟล์ `.json` ทั้งหมดใน folder `moph-ic-data`
- ใช้ชื่อไฟล์ (ไม่รวม .json) เป็นชื่อ collection
- Import แต่ละไฟล์เข้าสู่ collection ที่สอดคล้องกัน
- ใช้ `--type json` เพื่อระบุว่าเป็นไฟล์ JSON array

## 6. คู่มือการติดตั้งและใช้งาน

### 6.1 ข้อกำหนดเบื้องต้น

- Docker Engine version 20.10 ขึ้นไป
- Docker Compose version 2.0 ขึ้นไป
- พื้นที่ว่างบนฮาร์ดดิสก์อย่างน้อย 50GB

### 6.2 ขั้นตอนการติดตั้ง

```mermaid
flowchart LR
    A[1. แตกไฟล์ที่ได้รับ] --> B[2. เข้าไปยัง folder]
    B --> C[3. Start Docker Compose]
    C --> D[4. รอระบบ Start และ Import อัตโนมัติ]
    D --> E[5. ตรวจสอบข้อมูล]
    E --> F[6. ระบบพร้อมใช้งาน]
```

#### คำสั่งการติดตั้ง:

```bash
# 1. แตกไฟล์และเข้าไปยัง folder
cd moph-ic-handover

# 2. ตรวจสอบไฟล์ที่จำเป็น
ls -la init.sh moph-ic-data/*.json

# 3. Start Docker Compose
docker-compose up -d

# 4. ตรวจสอบ logs การ import ข้อมูล
docker logs -f mongodb

# 5. ตรวจสอบสถานะ container
docker-compose ps
```

### 6.3 การเข้าใช้งานระบบ

- **MongoDB**: `mongodb://localhost:17017`
  - Username: `admin`
  - Password: `admin`

- **MongoDB Connection String**:

mongodb://admin:admin@localhost:17017/mophic?authSource=admin


## 7. การตรวจสอบข้อมูลหลังการ Import

### 7.1 ผ่าน Mongo Shell

```bash
# เข้าสู่ mongo shell
docker exec -it mongodb mongosh \
  -u admin -p admin \
  --authenticationDatabase admin

# เลือก database
use mophic

# ตรวจสอบ collections
show collections

# นับจำนวน documents
db.immunization_stat.countDocuments()
db.visit_immunization.countDocuments()
```

### 7.2 ผ่าน MongoDB Client Tools

สามารถใช้ MongoDB client tools ต่างๆ เช่น:
- MongoDB Compass
- Studio 3T
- Robo 3T

โดยใช้ connection string:

mongodb://admin:admin@localhost:17017/mophic?authSource=admin


## 8. การ Backup และ Restore

### 8.1 การ Backup ข้อมูลเพิ่มเติม

```bash
# Backup ทั้ง database
docker exec mongodb mongodump \
  --username=admin \
  --password=admin \
  --authenticationDatabase=admin \
  --db=mophic \
  --out=/data/db/backup-$(date +%Y%m%d)
```

### 8.2 การ Restore จาก Backup

```bash
# Restore จาก dump
docker exec mongodb mongorestore \
  --username=admin \
  --password=admin \
  --authenticationDatabase=admin \
  --db=mophic \
  /data/db/backup-20250703/mophic
```

## 9. การแก้ไขปัญหาเบื้องต้น

### 9.1 MongoDB ไม่สามารถ start ได้

```bash
# ตรวจสอบ logs
docker-compose logs mongodb

# ลบ container และ volume เก่า
docker-compose down -v
docker-compose up -d
```

### 9.2 Import ข้อมูลไม่สำเร็จ

```bash
# ตรวจสอบไฟล์ JSON
file moph-ic-data/*.json
jq type moph-ic-data/*.json

# ตรวจสอบ permission
ls -la moph-ic-data/
ls -la init.sh

# ตรวจสอบ logs ของ initialization
docker logs mongodb | grep -i "importing"

# Import แบบ manual หากจำเป็น
docker exec -it mongodb mongoimport \
  --username=admin \
  --password=admin \
  --authenticationDatabase=admin \
  --db=mophic --collection=immunization_stat \
  --file=/docker-entrypoint-initdb.d/data/immunization_stat.json \
  --type json
```

## 10. ข้อมูลการติดต่อ

หากพบปัญหาในการติดตั้งหรือใช้งาน กรุณาติดต่อ:

- **ทีมพัฒนา**: MOPH-IC Development Team
- **Email**: support@mophic.moph.go.th
- **โทรศัพท์**: 02-XXX-XXXX

## 11. ภาคผนวก

### 11.1 โครงสร้างข้อมูลใน Collections

#### immunization_stat Collection
ข้อมูลสรุปสถิติการได้รับวัคซีน COVID-19 ของแต่ละบุคคล รวมถึงประวัติการฉีดวัคซีนทุกเข็ม

```json
{
  "_id": ObjectId,
  "immunization_stat_id": Number,
  "cid": String,  // เลขบัตรประชาชนที่เข้ารหัส
  "vaccine_code": String,  // รหัสวัคซีน เช่น "C19"
  "immunization_date_1": Date,  // วันที่ฉีดเข็มที่ 1
  "immunization_date_2": Date,  // วันที่ฉีดเข็มที่ 2
  "immunization_date_3": Date,  // วันที่ฉีดเข็มที่ 3
  "immunization_date_4": Date,  // วันที่ฉีดเข็มที่ 4
  "immunization_date_5": Date,  // วันที่ฉีดเข็มที่ 5
  "vaccine_ref_name": String,  // ชื่อวัคซีนเข็มที่ 1
  "vaccine_ref_name_2": String,  // ชื่อวัคซีนเข็มที่ 2 (ถ้าต่างกัน)
  "vaccine_manufacturer": String,  // ผู้ผลิตวัคซีน
  "vaccine_manufacturer_2": String,  // ผู้ผลิตวัคซีนเข็มที่ 2
  "vaccine_manufacturer_id": Number,
  "vaccine_manufacturer_id_2": Number,
  "percent_complete": Number,  // เปอร์เซ็นต์ความสมบูรณ์
  "ref_visit_immunization_id": Number,
  "certificate_code": String,  // รหัสใบรับรอง
  "certificate_serial_no": String,  // เลขที่ใบรับรอง
  "certificate_datetime": Date,
  "hospital_code": String,  // รหัสโรงพยาบาล
  "ref_hospital_name_dose_1": String,  // ชื่อโรงพยาบาลที่ฉีดเข็ม 1
  "ref_hospital_name_dose_2": String,  // ชื่อโรงพยาบาลที่ฉีดเข็ม 2
  "ref_hospital_name_dose_3": String,  // ชื่อโรงพยาบาลที่ฉีดเข็ม 3
  "vaccine_lot_no_dose_1": String,  // Lot number เข็ม 1
  "vaccine_lot_no_dose_2": String,  // Lot number เข็ม 2
  "vaccine_lot_no_dose_3": String,  // Lot number เข็ม 3
  "ref_patient_thai_name": String,  // ชื่อผู้รับวัคซีน (ภาษาไทย)
  "ref_patient_eng_name": String,  // ชื่อผู้รับวัคซีน (ภาษาอังกฤษ)
  "ref_patient_address_name": String,  // ที่อยู่
  "ref_patient_cid": String,  // เลขบัตรประชาชน
  "ref_patient_passport_no": String,  // เลขหนังสือเดินทาง
  "ref_patient_gender_name": String,  // เพศ
  "ref_patient_birth_date": Date,  // วันเกิด
  "ref_patient_thai_date_of_birth": String,  // วันเกิด (ภาษาไทย)
  "ref_patient_eng_date_of_birth": String,  // วันเกิด (ภาษาอังกฤษ)
  "total_dose": Number  // จำนวนเข็มที่ได้รับทั้งหมด
}
```

#### visit_immunization Collection
ข้อมูลการเข้ารับวัคซีนแต่ละครั้ง (แต่ละเข็ม) พร้อมรายละเอียดการฉีดวัคซีน

```json
{
  "_id": ObjectId,
  "visit_immunization_id": Number,
  "visit_guid": String,  // GUID ของการเข้ารับบริการ
  "vaccine_code": String,  // รหัสวัคซีน เช่น "C19"
  "lot_number": String,  // Lot number ของวัคซีน
  "expiration_date": Date,  // วันหมดอายุของวัคซีน
  "immunization_datetime": Date,  // วันเวลาที่ฉีดวัคซีน
  "immunization_date": Date,  // วันที่ฉีดวัคซีน
  "visit_immunization_ref_code": String,
  "update_datetime": Date,  // วันเวลาที่อัพเดทข้อมูล
  "cid": String,  // เลขบัตรประชาชนที่เข้ารหัส
  "hospital_code": String,  // รหัสโรงพยาบาล
  "ref_hospital_name": String,  // ชื่อโรงพยาบาล
  "hospital_tmbpart": String,  // รหัสตำบล
  "hospital_amppart": String,  // รหัสอำเภอ
  "hospital_chwpart": String,  // รหัสจังหวัด
  "hospital_region_id": Number,  // รหัสเขตสุขภาพ
  "field_hospital_code": String,  // รหัสโรงพยาบาลสนาม
  "field_hospital_name": String,
  "practitioner_license_number": String,  // เลขใบประกอบวิชาชีพ
  "practitioner_name": String,  // ชื่อผู้ฉีดวัคซีน
  "practitioner_role": String,  // ตำแหน่งผู้ฉีดวัคซีน
  "vaccine_ref_name": String,  // ชื่อวัคซีน
  "vaccine_manufacturer": String,  // ผู้ผลิตวัคซีน
  "vaccine_manufacturer_id": Number,
  "vaccine_serial_no": String,  // Serial number ของวัคซีน
  "vaccine_note": String,  // หมายเหตุ
  "vaccine_plan_no": Number,  // เข็มที่
  "vaccine_route_name": String,  // วิธีการฉีด
  "found_aefi": String,  // พบอาการไม่พึงประสงค์หรือไม่ (Y/N)
  "aefi_list_text": String,  // รายการอาการไม่พึงประสงค์
  "need_aefi_followup": String,  // ต้องติดตามอาการหรือไม่
  "followup_count": Number,  // จำนวนครั้งที่ติดตาม
  "update_aefi_datetime": Date,
  "is_target_person": String,  // เป็นกลุ่มเป้าหมายหรือไม่ (Y/N)
  "is_target_person_need_vaccine": String,  // เป็นกลุ่มที่ต้องได้รับวัคซีนหรือไม่
  "ref_patient_name": String,  // ชื่อผู้รับวัคซีน
  "ref_visit_date": Date,  // วันที่เข้ารับบริการ
  "ref_birth_date": Date,  // วันเกิด
  "ref_gender_name": String,  // เพศ
  "ref_vaccine_name": String,  // ชื่อวัคซีน
  "ref_hn": String,  // HN
  "ref_visit_time": String,  // เวลาที่เข้ารับบริการ
  "ref_phone": String,  // เบอร์โทรศัพท์
  "ref_province_name": String,  // จังหวัด
  "person_type_id": Number,  // รหัสประเภทบุคคล
  "person_type_name": String,  // ประเภทบุคคล
  "person_risk_type_id": Number,  // รหัสกลุ่มเสี่ยง
  "person_risk_type_name": String,  // ชื่อกลุ่มเสี่ยง
  "project_id": Number,  // รหัสโครงการ
  "project_name": String  // ชื่อโครงการ
}
```

### 11.3 ข้อแตกต่างระหว่าง JSON และ JSONL

#### JSON Format (ที่ใช้ในระบบนี้)
```json
[
  {"_id": "1", "field": "value1"},
  {"_id": "2", "field": "value2"},
  {"_id": "3", "field": "value3"}
]
```
- เป็น JSON Array
- ต้องใช้ `--jsonArray` เมื่อ export
- ใช้ `--type json` เมื่อ import

#### JSONL Format

{"_id": "1", "field": "value1"} {"_id": "2", "field": "value2"} {"_id": "3", "field": "value3"}

- แต่ละบรรทัดเป็น JSON object
- ไม่ต้องใช้ option พิเศษเมื่อ export/import

---

**เอกสารฉบับนี้จัดทำขึ้นเมื่อ**: วันที่ 3 กรกฎาคม 2568  
**เวอร์ชันเอกสาร**: 1.0
Content is user-generated and unverified.
    เอกสารประกอบการส่งมอบฐานข้อมูล MOPH-IC | Claude