2025-08-11 20:40:33 +08:00
|
|
|
|
from typing import Dict, List, Optional
|
|
|
|
|
|
from enum import Enum
|
|
|
|
|
|
|
|
|
|
|
|
class TaskPhase(Enum):
|
|
|
|
|
|
"""任务阶段枚举"""
|
|
|
|
|
|
TRIAGE = "triage" # 分诊阶段
|
|
|
|
|
|
HPI = "hpi" # 现病史阶段
|
|
|
|
|
|
PH = "ph" # 既往史阶段
|
|
|
|
|
|
COMPLETED = "completed" # 全部完成
|
|
|
|
|
|
|
|
|
|
|
|
class TaskManager:
|
|
|
|
|
|
"""
|
|
|
|
|
|
任务管理器
|
|
|
|
|
|
负责管理分诊、现病史、既往史三个阶段的子任务状态和完成度评分
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
|
"""初始化任务管理器"""
|
|
|
|
|
|
self.completion_threshold = 0.85 # 任务完成阈值
|
2025-09-03 21:44:01 +08:00
|
|
|
|
self.current_step = 1 # 当前步骤计数器
|
2025-08-11 20:40:33 +08:00
|
|
|
|
|
|
|
|
|
|
# 定义各阶段的子任务
|
|
|
|
|
|
self.task_definitions = {
|
|
|
|
|
|
TaskPhase.TRIAGE: {
|
|
|
|
|
|
"一级科室判定": {"description": "确定患者应就诊的一级科室(如内科、外科等)"},
|
|
|
|
|
|
"二级科室判定": {"description": "在一级科室基础上确定具体的二级科室"}
|
|
|
|
|
|
},
|
|
|
|
|
|
TaskPhase.HPI: {
|
2025-09-03 21:44:01 +08:00
|
|
|
|
"发病情况": {"description": "记录发病的时间、地点、起病缓急、前驱症状、可能的原因或诱因"},
|
|
|
|
|
|
"主要症状特征": {"description": "按发生的先后顺序描述主要症状的部位、性质、持续时间、程度、缓解或加剧因素"},
|
|
|
|
|
|
"病情发展与演变": {"description": "按发生的先后顺序描述演变发展情况"},
|
|
|
|
|
|
"伴随症状": {"description": "记录伴随症状,描述伴随症状与主要症状之间的相互关系"},
|
|
|
|
|
|
"诊疗经过": {"description": "记录患者发病后是否接受过检查与治疗,若是则记录接受过的检查与治疗的经过及效果"},
|
|
|
|
|
|
"一般情况": {"description": "简要记录患者发病后的精神状态、睡眠、食欲、大小便、体重等情况"}
|
2025-08-11 20:40:33 +08:00
|
|
|
|
},
|
|
|
|
|
|
TaskPhase.PH: {
|
2025-09-03 21:44:01 +08:00
|
|
|
|
"疾病史": {"description": "详细询问患者既往患过的各种疾病史,包括传染病史如结核、肝炎等"},
|
|
|
|
|
|
"预防接种史": {"description": "询问患者疫苗接种情况"},
|
|
|
|
|
|
"手术外伤史": {"description": "记录患者既往手术史和外伤史"},
|
|
|
|
|
|
"输血史": {"description": "询问患者既往输血史及输血反应"},
|
|
|
|
|
|
"过敏史": {"description": "了解患者食物或药物过敏史等"}
|
2025-08-11 20:40:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 初始化任务完成度评分(所有任务初始分数为0.0)
|
|
|
|
|
|
self.task_scores = {}
|
|
|
|
|
|
for phase in self.task_definitions:
|
|
|
|
|
|
self.task_scores[phase] = {}
|
|
|
|
|
|
for task_name in self.task_definitions[phase]:
|
|
|
|
|
|
self.task_scores[phase][task_name] = 0.0
|
|
|
|
|
|
|
2025-09-03 21:44:01 +08:00
|
|
|
|
def update_step(self, step_num: int):
|
|
|
|
|
|
"""
|
|
|
|
|
|
更新当前步骤编号
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
step_num: 当前步骤编号
|
|
|
|
|
|
"""
|
|
|
|
|
|
self.current_step = step_num
|
|
|
|
|
|
|
2025-08-11 20:40:33 +08:00
|
|
|
|
def get_current_phase(self) -> TaskPhase:
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取当前应该执行的任务阶段
|
2025-09-03 21:44:01 +08:00
|
|
|
|
分诊阶段限制最多4步,第5步开始即使未完成也进入现病史阶段
|
2025-08-11 20:40:33 +08:00
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
TaskPhase: 当前任务阶段
|
|
|
|
|
|
"""
|
2025-09-03 21:44:01 +08:00
|
|
|
|
# 检查分诊阶段是否完成,且不超过4步
|
|
|
|
|
|
if not self._is_phase_completed(TaskPhase.TRIAGE) and self.current_step <= 4:
|
2025-08-11 20:40:33 +08:00
|
|
|
|
return TaskPhase.TRIAGE
|
|
|
|
|
|
|
2025-09-03 21:44:01 +08:00
|
|
|
|
# 如果超过4步或分诊已完成,进入现病史阶段
|
2025-08-11 20:40:33 +08:00
|
|
|
|
if not self._is_phase_completed(TaskPhase.HPI):
|
|
|
|
|
|
return TaskPhase.HPI
|
|
|
|
|
|
|
|
|
|
|
|
# 检查既往史阶段是否完成
|
|
|
|
|
|
if not self._is_phase_completed(TaskPhase.PH):
|
|
|
|
|
|
return TaskPhase.PH
|
|
|
|
|
|
|
|
|
|
|
|
# 所有阶段都完成
|
|
|
|
|
|
return TaskPhase.COMPLETED
|
|
|
|
|
|
|
|
|
|
|
|
def get_pending_tasks(self, phase: Optional[TaskPhase] = None) -> List[Dict[str, str]]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取指定阶段的未完成任务列表
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
phase: 指定的任务阶段,如果为None则获取当前阶段
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
List[Dict]: 未完成任务列表,每个任务包含name和description字段
|
|
|
|
|
|
"""
|
|
|
|
|
|
if phase is None:
|
|
|
|
|
|
phase = self.get_current_phase()
|
|
|
|
|
|
|
|
|
|
|
|
if phase == TaskPhase.COMPLETED:
|
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
|
|
pending_tasks = []
|
|
|
|
|
|
phase_tasks = self.task_definitions[phase]
|
|
|
|
|
|
phase_scores = self.task_scores[phase]
|
|
|
|
|
|
|
|
|
|
|
|
for task_name, task_info in phase_tasks.items():
|
|
|
|
|
|
if phase_scores[task_name] < self.completion_threshold:
|
|
|
|
|
|
pending_tasks.append({
|
|
|
|
|
|
"name": task_name,
|
|
|
|
|
|
"description": task_info["description"]
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
return pending_tasks
|
|
|
|
|
|
|
|
|
|
|
|
def update_task_scores(self, phase: TaskPhase, task_scores: Dict[str, float]):
|
|
|
|
|
|
"""
|
|
|
|
|
|
更新指定阶段的任务完成度评分
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
phase: 任务阶段
|
|
|
|
|
|
task_scores: 任务评分字典,格式为 {任务名: 评分}
|
|
|
|
|
|
"""
|
|
|
|
|
|
if phase not in self.task_scores:
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
for task_name, score in task_scores.items():
|
|
|
|
|
|
if task_name in self.task_scores[phase]:
|
|
|
|
|
|
self.task_scores[phase][task_name] = score
|
|
|
|
|
|
|
|
|
|
|
|
def get_task_scores(self, phase: Optional[TaskPhase] = None) -> Dict:
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取任务评分信息
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
phase: 指定的任务阶段,如果为None则返回所有阶段
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
Dict: 任务评分信息
|
|
|
|
|
|
"""
|
|
|
|
|
|
if phase is None:
|
|
|
|
|
|
return self.task_scores
|
|
|
|
|
|
return self.task_scores.get(phase, {})
|
|
|
|
|
|
|
|
|
|
|
|
def get_completion_summary(self) -> Dict[str, any]:
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取任务完成情况摘要
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
Dict: 完成情况摘要,包含各阶段完成状态和进度
|
|
|
|
|
|
"""
|
|
|
|
|
|
summary = {
|
|
|
|
|
|
"current_phase": self.get_current_phase().value,
|
|
|
|
|
|
"phases": {}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for phase, tasks in self.task_definitions.items():
|
|
|
|
|
|
completed_count = sum(
|
|
|
|
|
|
1 for task_name in tasks
|
|
|
|
|
|
if self.task_scores[phase][task_name] >= self.completion_threshold
|
|
|
|
|
|
)
|
|
|
|
|
|
total_count = len(tasks)
|
|
|
|
|
|
|
|
|
|
|
|
summary["phases"][phase.value] = {
|
|
|
|
|
|
"completed": completed_count,
|
|
|
|
|
|
"total": total_count,
|
|
|
|
|
|
"completion_rate": completed_count / total_count if total_count > 0 else 0,
|
|
|
|
|
|
"is_completed": self._is_phase_completed(phase)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return summary
|
|
|
|
|
|
|
|
|
|
|
|
def _is_phase_completed(self, phase: TaskPhase) -> bool:
|
|
|
|
|
|
"""
|
|
|
|
|
|
检查指定阶段是否完成
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
phase: 任务阶段
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
bool: 是否完成
|
|
|
|
|
|
"""
|
|
|
|
|
|
if phase not in self.task_scores:
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
phase_scores = self.task_scores[phase]
|
|
|
|
|
|
return all(score >= self.completion_threshold for score in phase_scores.values())
|
|
|
|
|
|
|
|
|
|
|
|
def is_workflow_completed(self) -> bool:
|
|
|
|
|
|
"""
|
|
|
|
|
|
检查整个工作流是否完成
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
bool: 是否完成
|
|
|
|
|
|
"""
|
|
|
|
|
|
return self.get_current_phase() == TaskPhase.COMPLETED
|