功能修复: 1. 患者创建空名称验证:后端添加 name.trim().is_empty() 检查 2. 仪表盘统计容错:单个查询失败返回零值而非 500 3. FHIR 路由修复:从 /fhir 移到 /api/v1/fhir 保持一致 4. 冻结模块后端中间件:新增 frozen_module_middleware 拦截冻结路径 5. 积分端点权限码:health.health-data.list → health.points.list 6. 角色权限迁移:护士补充 devices.list,运营补充 points.list/manage 7. 测试结果文档:R01-R05 角色测试 + T00/T10 结果归档 Clippy 全 workspace 清零(14→0 errors): - erp-core: 修复 empty doc line、collapsible if、redundant closure 等 9 处 - erp-health: 修复 too_many_arguments、unused var、unnecessary parens 等 58 处 - erp-ai: 修复 dead_code、unused import 等 11 处 - erp-plugin: 修复 too_many_arguments、wildcard pattern 等 11 处 - erp-server-migration: 修复 enum_variant_names 5 处 - erp-auth/config/workflow/message: 各 1-3 处 工程改进: - lint-staged 配置迁移到 .lintstagedrc.js(函数式避免文件列表传给 clippy) - cargo fmt 统一格式化
153 lines
5.7 KiB
Rust
153 lines
5.7 KiB
Rust
//! 评估量表插件 — 标准化医学评估(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<u8>) -> 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);
|