//! 评估量表插件 — 标准化医学评估(PHQ-9, GAD-7 等) use serde_json::json; wit_bindgen::generate!({ path: "../erp-plugin-prototype/wit/plugin.wit", world: "plugin-world", }); use crate::erp::plugin::host_api; use crate::exports::erp::plugin::plugin_api::Guest; struct AssessmentPlugin; impl Guest for AssessmentPlugin { fn init() -> Result<(), String> { host_api::log_write("info", "AssessmentPlugin initialized"); Ok(()) } fn on_tenant_created(tenant_id: String) -> Result<(), String> { host_api::log_write( "info", &format!( "AssessmentPlugin: tenant {} created, inserting default scales", tenant_id ), ); insert_phq9_scale(&tenant_id)?; Ok(()) } fn handle_event(event_type: String, payload: Vec) -> Result<(), String> { host_api::log_write( "debug", &format!("AssessmentPlugin received: {}", event_type), ); if event_type == "assessment_completed" { let data: serde_json::Value = serde_json::from_slice(&payload).map_err(|e| format!("解析失败: {}", e))?; host_api::log_write( "info", &format!( "评估完成: scale_id={}, patient_id={}", data["scale_id"].as_str().unwrap_or("?"), data["patient_id"].as_str().unwrap_or("?") ), ); } Ok(()) } } /// 插入 PHQ-9 抑郁筛查量表默认数据 fn insert_phq9_scale(tenant_id: &str) -> Result<(), String> { let questions = json!([ {"id": 1, "text": "做事时提不起劲或没有兴趣", "options": [ {"label": "完全不会", "score": 0}, {"label": "好几天", "score": 1}, {"label": "一半以上的天数", "score": 2}, {"label": "几乎每天", "score": 3} ]}, {"id": 2, "text": "感到心情低落、沮丧或绝望", "options": [ {"label": "完全不会", "score": 0}, {"label": "好几天", "score": 1}, {"label": "一半以上的天数", "score": 2}, {"label": "几乎每天", "score": 3} ]}, {"id": 3, "text": "入睡困难、睡不安稳或睡眠过多", "options": [ {"label": "完全不会", "score": 0}, {"label": "好几天", "score": 1}, {"label": "一半以上的天数", "score": 2}, {"label": "几乎每天", "score": 3} ]}, {"id": 4, "text": "感觉疲倦或没有活力", "options": [ {"label": "完全不会", "score": 0}, {"label": "好几天", "score": 1}, {"label": "一半以上的天数", "score": 2}, {"label": "几乎每天", "score": 3} ]}, {"id": 5, "text": "食欲不振或吃太多", "options": [ {"label": "完全不会", "score": 0}, {"label": "好几天", "score": 1}, {"label": "一半以上的天数", "score": 2}, {"label": "几乎每天", "score": 3} ]}, {"id": 6, "text": "觉得自己很糟,或觉得自己失败了,或让自己和家人失望", "options": [ {"label": "完全不会", "score": 0}, {"label": "好几天", "score": 1}, {"label": "一半以上的天数", "score": 2}, {"label": "几乎每天", "score": 3} ]}, {"id": 7, "text": "对事物专注有困难(例如阅读或看电视)", "options": [ {"label": "完全不会", "score": 0}, {"label": "好几天", "score": 1}, {"label": "一半以上的天数", "score": 2}, {"label": "几乎每天", "score": 3} ]}, {"id": 8, "text": "动作或说话速度缓慢到别人可以察觉,或正好相反——烦躁不安地动来动去", "options": [ {"label": "完全不会", "score": 0}, {"label": "好几天", "score": 1}, {"label": "一半以上的天数", "score": 2}, {"label": "几乎每天", "score": 3} ]}, {"id": 9, "text": "有不如死掉或者用某种方式伤害自己的念头", "options": [ {"label": "完全不会", "score": 0}, {"label": "好几天", "score": 1}, {"label": "一半以上的天数", "score": 2}, {"label": "几乎每天", "score": 3} ]} ]); let scoring_rules = json!([ {"min": 0, "max": 4, "level": "normal", "label": "无抑郁症状"}, {"min": 5, "max": 9, "level": "mild", "label": "轻度抑郁"}, {"min": 10, "max": 14, "level": "moderate", "label": "中度抑郁"}, {"min": 15, "max": 19, "level": "moderate_severe", "label": "中重度抑郁"}, {"min": 20, "max": 27, "level": "severe", "label": "重度抑郁"} ]); let data = json!({ "scale_code": "PHQ-9", "title": "PHQ-9 患者健康问卷(抑郁筛查)", "description": "Patient Health Questionnaire-9,用于抑郁症状筛查和严重程度评估", "questions_json": questions, "scoring_rules_json": scoring_rules, "status": "active", "tenant_id": tenant_id, }); let result = host_api::db_insert("assessment_scale", data.to_string().as_bytes()) .map_err(|e| format!("插入 PHQ-9 默认量表失败: {}", e))?; let record: serde_json::Value = serde_json::from_slice(&result).map_err(|e| format!("解析结果失败: {}", e))?; host_api::log_write( "info", &format!( "PHQ-9 默认量表已创建: id={}", record["id"].as_str().unwrap_or("?") ), ); Ok(()) } export!(AssessmentPlugin);