From 9735aa873ca3c757948406ab08ddc41d7d24b730 Mon Sep 17 00:00:00 2001 From: livindra Date: Tue, 28 Apr 2026 22:00:35 +0700 Subject: [PATCH] deploykeempat --- app.py | 28 ++++++++++++++++++++++++++++ expert_system.py | 17 +++++++++++++---- utils/mysql_db.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index 55225ea..bf676de 100644 --- a/app.py +++ b/app.py @@ -40,6 +40,34 @@ def get_symptom_desc(symptom_code): return kb.gejala.get(symptom_code, symptom_code) +def _serialize_knowledge_base(): + """Return the current expert knowledge in JSON-serializable form.""" + return { + 'source': 'mysql' if MYSQL_AVAILABLE else 'builtin', + 'gejala': dict(expert_system.get_gejala_list()), + 'gejala_groups': dict(expert_system.get_gejala_groups()), + 'penyakit': dict(expert_system.kb.penyakit), + 'aturan': list(expert_system.kb.aturan), + } + + +@app.route('/api/expert-knowledge') +def api_expert_knowledge(): + """Expose PMK expert knowledge as JSON.""" + return jsonify(_serialize_knowledge_base()) + + +@app.route('/api/gejala') +def api_gejala(): + """Expose the PMK gejala master list as JSON.""" + payload = _serialize_knowledge_base() + return jsonify({ + 'source': payload['source'], + 'gejala': payload['gejala'], + 'gejala_groups': payload['gejala_groups'], + }) + + try: from utils.mysql_db import ( save_prediction_mysql, diff --git a/expert_system.py b/expert_system.py index 397d2eb..5c13fa9 100644 --- a/expert_system.py +++ b/expert_system.py @@ -36,10 +36,19 @@ class KnowledgeBase: ) def _set_fallback_knowledge(self): - self.gejala = {} - self.penyakit = {} - self.aturan = [] - self.gejala_groups = self._empty_groups() + try: + from utils.mysql_db import get_builtin_expert_knowledge + + knowledge = get_builtin_expert_knowledge() + self.gejala = knowledge.get('gejala', {}) + self.penyakit = knowledge.get('penyakit', {}) + self.aturan = knowledge.get('aturan', []) + self.gejala_groups = knowledge.get('gejala_groups', self._empty_groups()) + except Exception: + self.gejala = {} + self.penyakit = {} + self.aturan = [] + self.gejala_groups = self._empty_groups() def _load_from_database(self): try: diff --git a/utils/mysql_db.py b/utils/mysql_db.py index 534525b..2bef856 100644 --- a/utils/mysql_db.py +++ b/utils/mysql_db.py @@ -292,6 +292,50 @@ DEFAULT_EXPERT_RULES = [ }, ] + +def get_builtin_expert_knowledge(): + """Return expert knowledge from the repository defaults when MySQL is unavailable.""" + gejala = OrderedDict() + penyakit = OrderedDict() + aturan = [] + grouped_codes = {k: [] for k in _GROUP_TITLES.keys()} + + for item in DEFAULT_EXPERT_SYMPTOMS: + gejala[item['code']] = item['description'] + category = (item.get('category') or 'umum').lower() + if category not in grouped_codes: + grouped_codes[category] = [] + grouped_codes[category].append(item['code']) + + for item in DEFAULT_EXPERT_DISEASES: + penyakit[item['code']] = { + 'nama': item['name'], + 'deskripsi': item['description'], + 'solusi': list(item.get('solutions', [])), + } + + for item in DEFAULT_EXPERT_RULES: + aturan.append({ + 'kode': item['code'], + 'gejala': list(item.get('symptom_codes', [])), + 'hasil': item['result_disease_code'], + 'deskripsi': item.get('description', ''), + }) + + gejala_groups = OrderedDict() + for key, title in _GROUP_TITLES.items(): + gejala_groups[key] = { + 'title': title, + 'codes': grouped_codes.get(key, []), + } + + return { + 'gejala': dict(gejala), + 'penyakit': dict(penyakit), + 'aturan': aturan, + 'gejala_groups': gejala_groups, + } + _GROUP_TITLES = OrderedDict([ ('umum', 'Gejala Umum / Sistemik'), ('mulut', 'Gejala Mulut / Oral'),