新增 3 个 AI Agent Tool 扩展医护沙箱能力: - query_patient_lab_reports: 查询患者化验报告列表(含异常计数) - query_patient_appointments: 查询患者即将到来的预约 - query_patient_medications: 查询患者当前用药列表 同时: - HealthDataProvider trait 新增 get_patient_lab_reports 方法 + LabReportListItemDto - erp-health 实现新 trait 方法(含 PII 解密) - sandbox.rs 更新角色权限:Patient 可查体征/化验/用药,MedicalStaff 额外可查预约 - 修复 ai_prompt_tests.rs 中 AnalysisService::new 签名变更的遗留编译错误 - 新增 5 个 agent 测试覆盖新 Tool 和沙箱权限过滤
69 lines
2.0 KiB
Rust
69 lines
2.0 KiB
Rust
use async_trait::async_trait;
|
|
|
|
use crate::agent::tool::{AgentTool, ToolContext, ToolResult};
|
|
|
|
/// 查询患者预约记录
|
|
pub struct QueryAppointmentsTool;
|
|
|
|
#[async_trait]
|
|
impl AgentTool for QueryAppointmentsTool {
|
|
fn name(&self) -> &str {
|
|
"query_patient_appointments"
|
|
}
|
|
|
|
fn description(&self) -> &str {
|
|
"查询患者的即将到来的预约记录,包括科室、医生、时间和状态。"
|
|
}
|
|
|
|
fn parameters_schema(&self) -> serde_json::Value {
|
|
serde_json::json!({
|
|
"type": "object",
|
|
"properties": {}
|
|
})
|
|
}
|
|
|
|
async fn execute(&self, ctx: &ToolContext, _params: serde_json::Value) -> ToolResult {
|
|
let patient_id = match ctx.patient_id {
|
|
Some(id) => id,
|
|
None => {
|
|
return ToolResult {
|
|
output: "未关联患者档案,无法查询预约记录".to_string(),
|
|
display_hint: None,
|
|
};
|
|
}
|
|
};
|
|
|
|
match ctx
|
|
.health_provider
|
|
.get_upcoming_appointments(ctx.tenant_id, patient_id)
|
|
.await
|
|
{
|
|
Ok(appointments) => {
|
|
if appointments.is_empty() {
|
|
return ToolResult {
|
|
output: "该患者暂无即将到来的预约".to_string(),
|
|
display_hint: None,
|
|
};
|
|
}
|
|
|
|
let mut output = String::from("即将到来的预约:\n");
|
|
for a in &appointments {
|
|
output.push_str(&format!(
|
|
"- {} | {} | {} | 状态: {}\n",
|
|
a.scheduled_at, a.department, a.doctor_name, a.status
|
|
));
|
|
}
|
|
|
|
ToolResult {
|
|
output,
|
|
display_hint: None,
|
|
}
|
|
}
|
|
Err(e) => ToolResult {
|
|
output: format!("查询预约记录失败: {}", e),
|
|
display_hint: None,
|
|
},
|
|
}
|
|
}
|
|
}
|