""" 初始化绩效考核指标模板 根据参考文档创建各类科室的考核指标模板 """ import asyncio import json from app.core.database import async_session_maker from app.models.models import Indicator, IndicatorType, BSCDimension, DeptType async def init_indicator_templates(): """初始化指标模板数据""" async with async_session_maker() as db: # 检查是否已存在数据 from sqlalchemy import text result = await db.execute(text("SELECT count(*) FROM indicators")) count = result.scalar() if count > 0: print("指标数据已存在,跳过初始化") return # 临床手术科室指标模板 surgical_indicators = [ # 财务维度 Indicator( name="业务收入增长率", code="FIN001", indicator_type=IndicatorType.QUANTITY, bs_dimension=BSCDimension.FINANCIAL, weight=1.0, max_score=100.0, target_value=10.0, target_unit="%", calculation_method="(本期收入 - 同期收入)/同期收入 × 100%", assessment_method="统计报表", deduction_standard="每降低 1% 扣 2 分", data_source="HIS 系统", applicable_dept_types=json.dumps(["clinical_surgical"]), is_veto=False, is_active=True ), Indicator( name="药品比例控制", code="FIN002", indicator_type=IndicatorType.COST, bs_dimension=BSCDimension.FINANCIAL, weight=1.2, max_score=100.0, target_value=40.0, target_unit="%", calculation_method="药品收入/总收入 × 100%", assessment_method="药事统计", deduction_standard="超 1% 扣 1 分", data_source="HIS 系统", applicable_dept_types=json.dumps(["clinical_surgical"]), is_veto=False, is_active=True ), Indicator( name="医保扣款控制", code="FIN003", indicator_type=IndicatorType.COST, bs_dimension=BSCDimension.FINANCIAL, weight=1.5, max_score=100.0, target_value=0.0, target_unit="元", calculation_method="因违规导致的医保扣款金额", assessment_method="医保办统计", deduction_standard="每发生 1 例扣 5 分", data_source="医保系统", applicable_dept_types=json.dumps(["clinical_surgical"]), is_veto=False, is_active=True ), # 客户维度 Indicator( name="患者满意度", code="CUS001", indicator_type=IndicatorType.SERVICE, bs_dimension=BSCDimension.CUSTOMER, weight=1.5, max_score=100.0, target_value=90.0, target_unit="%", calculation_method="满意度调查表统计", assessment_method="问卷调查", deduction_standard="<90% 每降 1% 扣 1 分", data_source="满意度调查系统", applicable_dept_types=json.dumps(["clinical_surgical", "clinical_nonsurgical_ward", "clinical_nonsurgical_noward"]), is_veto=False, is_active=True ), Indicator( name="服务投诉处理率", code="CUS002", indicator_type=IndicatorType.SERVICE, bs_dimension=BSCDimension.CUSTOMER, weight=1.0, max_score=100.0, target_value=100.0, target_unit="%", calculation_method="已处理投诉/总投诉 × 100%", assessment_method="投诉记录统计", deduction_standard="每有 1 例未处理扣 5 分", data_source="投诉管理系统", applicable_dept_types=json.dumps(["clinical_surgical", "clinical_nonsurgical_ward", "clinical_nonsurgical_noward"]), is_veto=False, is_active=True ), # 内部流程维度 Indicator( name="病历书写合格率", code="PRO001", indicator_type=IndicatorType.QUALITY, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=2.0, max_score=100.0, target_value=95.0, target_unit="%", calculation_method="合格病历数/总病历数 × 100%", assessment_method="每周抽查", deduction_standard="不合格每份扣 50 元", data_source="电子病历系统", applicable_dept_types=json.dumps(["clinical_surgical", "clinical_nonsurgical_ward"]), is_veto=False, is_active=True ), Indicator( name="手术安全核对表执行率", code="PRO002", indicator_type=IndicatorType.QUALITY, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=1.5, max_score=100.0, target_value=100.0, target_unit="%", calculation_method="执行核对的手术数/总手术数 × 100%", assessment_method="现场核查", deduction_standard="未执行每次扣 1 分", data_source="手术麻醉系统", applicable_dept_types=json.dumps(["clinical_surgical"]), is_veto=False, is_active=True ), Indicator( name="手术分级管理制度执行", code="PRO003", indicator_type=IndicatorType.COMPLIANCE, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=1.5, max_score=100.0, target_value=100.0, target_unit="%", calculation_method="符合分级的手术数/总手术数 × 100%", assessment_method="病历审查", deduction_standard="越级手术每例扣 2 分", data_source="手术麻醉系统", applicable_dept_types=json.dumps(["clinical_surgical"]), is_veto=False, is_active=True ), Indicator( name="抗菌药物使用率", code="PRO004", indicator_type=IndicatorType.QUALITY, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=1.5, max_score=100.0, target_value=50.0, target_unit="%", calculation_method="使用抗菌药物病例数/总病例数 × 100%", assessment_method="院感统计", deduction_standard="超 1% 扣 1 分", data_source="院感监测系统", applicable_dept_types=json.dumps(["clinical_surgical", "clinical_nonsurgical_ward"]), is_veto=False, is_active=True ), Indicator( name="院感控制达标率", code="PRO005", indicator_type=IndicatorType.SAFETY, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=2.0, max_score=100.0, target_value=100.0, target_unit="%", calculation_method="院感监测指标达标情况", assessment_method="现场抽查 + 数据监测", deduction_standard="违规每项扣 3 分", data_source="院感监测系统", applicable_dept_types=json.dumps(["clinical_surgical", "clinical_nonsurgical_ward", "medical_tech"]), is_veto=True, is_active=True ), # 学习与成长维度 Indicator( name="培训参与率", code="LRN001", indicator_type=IndicatorType.LEARNING, bs_dimension=BSCDimension.LEARNING_GROWTH, weight=1.0, max_score=100.0, target_value=90.0, target_unit="%", calculation_method="实际参与人数/应参与人数 × 100%", assessment_method="培训记录", deduction_standard="每降 1% 扣 1 分", data_source="科教科", applicable_dept_types=json.dumps(["clinical_surgical", "clinical_nonsurgical_ward", "medical_tech"]), is_veto=False, is_active=True ), Indicator( name="继续教育学分达标率", code="LRN002", indicator_type=IndicatorType.LEARNING, bs_dimension=BSCDimension.LEARNING_GROWTH, weight=1.0, max_score=100.0, target_value=100.0, target_unit="%", calculation_method="达标人数/总人数 × 100%", assessment_method="学分统计", deduction_standard="每降 1% 扣 1 分", data_source="科教科", applicable_dept_types=json.dumps(["clinical_surgical", "clinical_nonsurgical_ward", "medical_tech"]), is_veto=False, is_active=True ), ] # 行政科室指标模板 admin_indicators = [ # 工作业绩 Indicator( name="工作计划完成率", code="ADM001", indicator_type=IndicatorType.QUANTITY, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=2.0, max_score=100.0, target_value=100.0, target_unit="%", calculation_method="实际完成工作数/计划工作数 × 100%", assessment_method="年度考核", deduction_standard="每项未完成扣 5 分", data_source="院办", applicable_dept_types=json.dumps(["admin"]), is_veto=False, is_active=True ), Indicator( name="制度建设健全率", code="ADM002", indicator_type=IndicatorType.COMPLIANCE, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=1.0, max_score=100.0, target_value=100.0, target_unit="%", calculation_method="已建立制度数/应建立制度数 × 100%", assessment_method="查记录", deduction_standard="每缺一项制度扣 2 分", data_source="院办", applicable_dept_types=json.dumps(["admin"]), is_veto=False, is_active=True ), # 服务质量 Indicator( name="临床对行政满意度", code="ADM003", indicator_type=IndicatorType.SERVICE, bs_dimension=BSCDimension.CUSTOMER, weight=1.5, max_score=100.0, target_value=90.0, target_unit="%", calculation_method="满意度调查统计", assessment_method="季度测评", deduction_standard="<90% 每降 1% 扣 1 分", data_source="满意度调查", applicable_dept_types=json.dumps(["admin"]), is_veto=False, is_active=True ), # 内部管理 Indicator( name="科务会召开率", code="ADM004", indicator_type=IndicatorType.COMPLIANCE, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=1.0, max_score=100.0, target_value=100.0, target_unit="%", calculation_method="实际召开次数/应召开次数 × 100%", assessment_method="查会议记录", deduction_standard="<2 次/月扣 2 分", data_source="院办", applicable_dept_types=json.dumps(["admin"]), is_veto=False, is_active=True ), ] # 医技科室指标模板 tech_indicators = [ Indicator( name="报告及时率", code="TECH001", indicator_type=IndicatorType.EFFICIENCY, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=1.5, max_score=100.0, target_value=100.0, target_unit="%", calculation_method="及时报告数/总报告数 × 100%", assessment_method="系统统计", deduction_standard="每降 1% 扣 1 分", data_source="LIS/PACS 系统", applicable_dept_types=json.dumps(["medical_tech"]), is_veto=False, is_active=True ), Indicator( name="检查阳性率", code="TECH002", indicator_type=IndicatorType.QUALITY, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=1.5, max_score=100.0, target_value=70.0, target_unit="%", calculation_method="阳性例数/总检查例数 × 100%", assessment_method="科室统计", deduction_standard="每降 1% 扣 1 分", data_source="LIS/PACS 系统", applicable_dept_types=json.dumps(["medical_tech"]), is_veto=False, is_active=True ), Indicator( name="设备完好率", code="TECH003", indicator_type=IndicatorType.QUANTITY, bs_dimension=BSCDimension.INTERNAL_PROCESS, weight=1.0, max_score=100.0, target_value=95.0, target_unit="%", calculation_method="完好设备数/总设备数 × 100%", assessment_method="设备科统计", deduction_standard="每降 1% 扣 1 分", data_source="设备科", applicable_dept_types=json.dumps(["medical_tech"]), is_veto=False, is_active=True ), ] # 添加所有指标到数据库 all_indicators = surgical_indicators + admin_indicators + tech_indicators for indicator in all_indicators: db.add(indicator) await db.commit() print(f"成功初始化 {len(all_indicators)} 个考核指标模板") if __name__ == "__main__": asyncio.run(init_indicator_templates())