first
This commit is contained in:
commit
5afc7be530
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 7126efe774e93505ca12bedaba2f244cae4a23e5
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit cb58213a33974a1c151d2f8fc0cc3faba94c904b
|
||||||
|
|
@ -0,0 +1,97 @@
|
||||||
|
# Revisi Implementasi Decision Tree untuk Penomoran Surat Otomatis
|
||||||
|
|
||||||
|
## 1. Latar Belakang
|
||||||
|
|
||||||
|
Sistem penomoran surat otomatis saat ini masih menggunakan increment sederhana (`nomor_terakhir + 1`). Untuk meningkatkan akurasi dan memberikan kontribusi akademik yang lebih berbobot, Node 3 (penentuan nomor urut) akan menggunakan **Full Decision Tree (scikit-learn)** dengan multi-feature, bukan counter biasa.
|
||||||
|
|
||||||
|
## 2. Ruang Lingkup Perubahan
|
||||||
|
|
||||||
|
| Area | File | Perubahan |
|
||||||
|
|------|------|-----------|
|
||||||
|
| **eLaDesSkripsiML** | `ml_model.py` | Rombak: tambah DecisionTreeClassifier + fitur multi untuk DecisionTreeRegressor |
|
||||||
|
| | `elades_mysql.py` | Tambah auto-klasifikasi, kode surat, counter dengan FOR UPDATE, orchestrator |
|
||||||
|
| | `app.py` | Update endpoint `/api/proses-nomor/<id>`, tambah `/api/retrain` |
|
||||||
|
| **eLaDesSkripsi** | 3 Migration baru | Tambah kolom ke jenis_surat, pengajuan, dan tabel nomor_surat_counters |
|
||||||
|
|
||||||
|
## 3. Decision Tree Flow
|
||||||
|
|
||||||
|
```
|
||||||
|
Root: jenis_surat_id tersedia?
|
||||||
|
├── Tidak → Error return
|
||||||
|
└── Ya → Fetch jenis_surat dari MySQL
|
||||||
|
│
|
||||||
|
├── Node 1: KLASIFIKASI SURAT
|
||||||
|
│ ├── Cek jenis_surat.kategori
|
||||||
|
│ │ ├── Ada → gunakan itu
|
||||||
|
│ │ └── Tidak → Python keyword matching:
|
||||||
|
│ │ ├── "pernyataan" → "Surat Pernyataan"
|
||||||
|
│ │ ├── "pengantar" → "Surat Pengantar"
|
||||||
|
│ │ ├── "keterangan" → "Surat Keterangan"
|
||||||
|
│ │ └── default → "Surat Keterangan"
|
||||||
|
│ └── Output: klasifikasi_surat
|
||||||
|
│
|
||||||
|
├── Node 2: KODE SURAT
|
||||||
|
│ ├── jenis_surat.kode_surat ada?
|
||||||
|
│ │ ├── Ya → gunakan kode_surat
|
||||||
|
│ │ └── Tidak → default:
|
||||||
|
│ │ ├── Surat Keterangan → "SK"
|
||||||
|
│ │ ├── Surat Pengantar → "SP"
|
||||||
|
│ │ └── Surat Pernyataan → "SPT"
|
||||||
|
│ └── Output: kode_surat
|
||||||
|
│
|
||||||
|
├── Node 3: FULL DECISION TREE — NOMOR URUT
|
||||||
|
│ ├── Tentukan periode:
|
||||||
|
│ │ ├── reset_periode = "bulanan" → filter (jenis, klasifikasi, BULAN, TAHUN)
|
||||||
|
│ │ └── reset_periode = "tahunan" → filter (jenis, klasifikasi, TAHUN)
|
||||||
|
│ ├── Ambil existing numbers (FOR UPDATE lock)
|
||||||
|
│ ├── Cek gap: ada nomor yang loncat?
|
||||||
|
│ │ ├── Ya → pakai nomor gap pertama (isi celah)
|
||||||
|
│ │ └── Tidak → Full Decision Tree prediction
|
||||||
|
│ ├── Siapkan fitur training multi-dimensi
|
||||||
|
│ ├── Train DecisionTreeRegressor
|
||||||
|
│ ├── Predict nomor berikutnya
|
||||||
|
│ ├── Validasi: cek duplikat via FOR UPDATE
|
||||||
|
│ └── Output: nomor_urut
|
||||||
|
│
|
||||||
|
├── Node 4: FORMAT NOMOR SURAT
|
||||||
|
│ ├── format_nomor dari jenis_surat
|
||||||
|
│ ├── Replace: {NO_URUT} {KODE} {BULAN_ROM} {TAHUN}
|
||||||
|
│ └── Output: nomor_terformat
|
||||||
|
│
|
||||||
|
└── SAVE: UPDATE pengajuan
|
||||||
|
├── nomor_surat = nomor_urut
|
||||||
|
├── klasifikasi_surat = hasil Node 1
|
||||||
|
├── kode_surat = hasil Node 2
|
||||||
|
└── tanggal_surat = NOW()
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. Fitur Multi-Dimensi untuk DecisionTreeRegressor
|
||||||
|
|
||||||
|
| Fitur | Keterangan |
|
||||||
|
|-------|------------|
|
||||||
|
| `bulan` | Bulan pengajuan (1-12) |
|
||||||
|
| `tahun` | Tahun pengajuan |
|
||||||
|
| `index_ke` | Urutan ke berapa dalam sequence |
|
||||||
|
| `jumlah_dalam_periode` | Total surat dalam periode yang sama |
|
||||||
|
| `selisih_hari` | Selisih hari dari pengajuan sebelumnya |
|
||||||
|
|
||||||
|
## 5. Endpoint API
|
||||||
|
|
||||||
|
| Endpoint | Method | Fungsi |
|
||||||
|
|----------|--------|--------|
|
||||||
|
| `/api/proses-nomor/<id>` | POST | Decision Tree lengkap: klasifikasi + kode + nomor urut + format |
|
||||||
|
| `/api/retrain` | POST | Retrain model setelah ada jenis_surat baru |
|
||||||
|
| `/api/health` | GET | Cek kesehatan server |
|
||||||
|
|
||||||
|
## 6. Output Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"nomor_surat": "001/SKD/VI/2026",
|
||||||
|
"nomor_urut": 1,
|
||||||
|
"klasifikasi_surat": "Surat Keterangan",
|
||||||
|
"kode_surat": "SKD",
|
||||||
|
"message": "Nomor surat berhasil diproses"
|
||||||
|
}
|
||||||
|
```
|
||||||
Loading…
Reference in New Issue