Files
hms/crates/erp-plugin-assessment/src/lib.rs
iven 6d5a711d2c
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled
fix: 修复测试发现的 7 个问题 + 全 workspace clippy 清零
功能修复:
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 统一格式化
2026-05-07 23:43:14 +08:00

153 lines
5.7 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! 评估量表插件 — 标准化医学评估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);