deploykeempat

This commit is contained in:
livindra 2026-04-28 22:00:35 +07:00
parent 503df38bfa
commit 9735aa873c
3 changed files with 85 additions and 4 deletions

28
app.py
View File

@ -40,6 +40,34 @@ def get_symptom_desc(symptom_code):
return kb.gejala.get(symptom_code, 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: try:
from utils.mysql_db import ( from utils.mysql_db import (
save_prediction_mysql, save_prediction_mysql,

View File

@ -36,10 +36,19 @@ class KnowledgeBase:
) )
def _set_fallback_knowledge(self): def _set_fallback_knowledge(self):
self.gejala = {} try:
self.penyakit = {} from utils.mysql_db import get_builtin_expert_knowledge
self.aturan = []
self.gejala_groups = self._empty_groups() 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): def _load_from_database(self):
try: try:

View File

@ -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([ _GROUP_TITLES = OrderedDict([
('umum', 'Gejala Umum / Sistemik'), ('umum', 'Gejala Umum / Sistemik'),
('mulut', 'Gejala Mulut / Oral'), ('mulut', 'Gejala Mulut / Oral'),