基于ASP.NET Core的医院不良事件管理系统的架构设计
基于ASP.NET Core的医院不良事件管理系统的架构设计前言医院不良事件管理是医疗质量安全管理的重要环节一个优秀的不良事件管理系统需要覆盖事件上报、审核追踪、分析统计的完整闭环。本文将详细介绍如何基于ASP.NET Core构建一个完整的医院不良事件管理系统涵盖26种不良事件类型、完善的权限体系、钉钉集成以及数据可视化统计。一、系统整体架构1.1 技术栈选型// 核心技术栈-框架:ASP.NET Core3.1-前端UI:Layui2.9.7-数据库:MySQL(主数据库)-辅助数据库:Oracle(人事系统),SQLServer(HIS),PostgreSQL(LIS)-ORM:Dapper(轻量级高性能)-图表:ECharts5.x-即时通讯:钉钉SDK-PDF生成:QuestPDF,iText-Excel操作:NPOI1.2 项目结构QASystem/ ├── Controllers/ # 控制器层 │ ├── LoginController.cs # 登录认证 │ ├── HarmfulEventController.cs # 不良事件上报 │ ├── HarmfulEventManageController.cs # 不良事件管理 │ └── HarmfulChartController.cs # 图表统计 ├── Models/ # 数据模型 │ ├── Login/ # 登录相关模型 │ ├── HarmfulEvent/ # 不良事件模型 │ ├── HarmfulEventManage/ # 管理模块模型 │ └── HarmfulChart/ # 图表模型 ├── Views/ # 视图层 │ ├── Login/ # 登录视图 │ ├── HarmfulEvent/ # 26种事件表单视图 │ ├── HarmfulEventManage/ # 管理视图 │ └── HarmfulChart/ # 图表视图 ├── Services/ # 业务服务层 ├── Unitity/ # 工具类 └── Configuration/ # 配置文件1.3 多数据库架构系统需要对接多个业务系统采用了多数据库连接架构publicclassHarmfulEventController:CheckLoginController{privatereadonlystring_harmfulevent;// 不良事件数据库privatereadonlystring_qasystem;// QA系统数据库privatereadonlystring_his3;// HIS3数据库privatereadonlystring_sihis;// SI医院信息系统privatereadonlystring_lyradb;// LIS数据库publicHarmfulEventController(IConfigurationconfiguration){_harmfuleventconfiguration.GetConnectionString(harmfulevent);_qasystemconfiguration.GetConnectionString(qasystem);_his3configuration.GetConnectionString(his3);_sihisconfiguration.GetConnectionString(sihis);_lyradbconfiguration.GetConnectionString(lyradb);}}这种设计使得系统能够从HIS自动获取患者信息从人事系统获取员工数据从LIS获取检验数据统一管理不良事件数据二、数据库设计2.1 核心表结构-- 不良事件主表CREATETABLEmedreportmt(idINTPRIMARYKEYAUTO_INCREMENT,repIdVARCHAR(50)NOTNULL,-- 事件编号repTypeIdINTNOTNULL,-- 事件类型IDrepTypeId1INTNOTNULL,-- 事件类型ID(可修改)statusTINYINTDEFAULT0,-- 状态:0暂存/1上报/2审核empIdINTNOTNULL,-- 上报人IDempDeptIdINTNOTNULL,-- 上报科室IDcreateDateDATETIME,-- 创建时间submitDateDATETIME,-- 提交时间isTrackTINYINTDEFAULT0,-- 追踪状态:0未/1可/2中/3已isSendTINYINTDEFAULT0,-- 是否转发sacINTDEFAULT0,-- SAC分级UNIQUEKEYrepId(repId));-- 不良事件明细表CREATETABLEmedreportdt(idINTPRIMARYKEYAUTO_INCREMENT,repIdVARCHAR(50)NOTNULL,-- 关联事件编号repContentJSONNOTNULL,-- 事件详细内容(JSON)FOREIGNKEY(repId)REFERENCESmedreportmt(repId));-- 事件追踪表CREATETABLEmedreptrack(idINTPRIMARYKEYAUTO_INCREMENT,repIdVARCHAR(50)NOTNULL,-- 关联事件编号trackcontentJSONNOTNULL,-- 追踪内容auditContentJSON,-- 审核内容FOREIGNKEY(repId)REFERENCESmedreportmt(repId));-- 事件转发表CREATETABLEmedreportsd(idINTPRIMARYKEYAUTO_INCREMENT,repIdVARCHAR(50)NOTNULL,sendEmpIdINTNOTNULL,-- 发送人acceptEmpIdINTNOTNULL,-- 接收人sendDateDATETIME);-- 附件表CREATETABLEmedreportfiles(idINTPRIMARYKEYAUTO_INCREMENT,repIdVARCHAR(50)NOTNULL,fileNameVARCHAR(255),fileExtVARCHAR(20),fileSizeVARCHAR(50),filePathVARCHAR(500),uploaderINT,uploadTimeDATETIME);2.2 事件内容JSON结构不同类型的不良事件使用JSON存储灵活的事件内容// 以药品不良反应为例 (HarmfulEvent06Model)publicclassHarmfulEvent06Model{publicstringdeptid{get;set;}// 发生科室publicstringoccutime{get;set;}// 发生时间publicstringoccuaddr{get;set;}// 发生地点publicstringpname{get;set;}// 患者姓名publicstringpsex{get;set;}// 性别publicstringage{get;set;}// 年龄publicstringdiagnose{get;set;}// 临床诊断publicstringmrn{get;set;}// 病历号publicstringeventtype{get;set;}// 事件类型publicstringeffect{get;set;}// 损害程度publicstringprocess{get;set;}// 发生过程publicstringanalysis{get;set;}// 原因分析publicstringadvise{get;set;}// 建议// 药品相关字段publicstringimpact{get;set;}// 对原患疾病影响publicstringevaluation{get;set;}// 关联性评价publicstringstopdrug{get;set;}// 停药情况publicstringusedagain{get;set;}// 再次使用publicstringeventresult{get;set;}// 不良反应结果}三、控制器设计3.1 控制器职责划分LoginController - 认证授权、钉钉集成、SSO单点登录 │ ├─ HarmfulEventController - 26种事件的上报、编辑、查看 │ ├─ HarmfulEvent01Add/Edit/Show (输血不良反应) │ ├─ HarmfulEvent02Add/Edit/Show (输血相关事件) │ ├─ ... │ └─ HarmfulEvent26Add/Edit/Show (非计划再次手术) │ ├─ HarmfulEventManageController - 审核、追踪、转发、导出 │ ├─ Index (管理首页) │ ├─ HarmfulEventManageAudit (审核) │ ├─ HarmfulEventManageTrack (追踪) │ ├─ HarmfulEventManageSend (转发) │ └─ HarmfulEventManageExportExcel (导出) │ └─ HarmfulChartController - 7种统计图表 ├─ echart01 (按科室统计趋势) ├─ echart02 (按伤害程度饼图) ├─ echart03 (按事件类型统计) ├─ echart04 (按人员类别饼图) ├─ echart05 (按月份季度统计) ├─ echart06 (按SAC分级饼图) └─ echart07 (按事件类型饼图)3.2 统一响应模型// 统一的API响应格式publicclassDataTableModelT{publicintcode{get;set;}// 0成功/1失败publicintcount{get;set;}// 总记录数publicstringmsg{get;set;}// 消息publicListTdata{get;set;}// 数据}publicclassMsgModel{publicintcode{get;set;}publicstringmsg{get;set;}}3.3 分页查询实现publicIActionResultHarmfulEventManageList(HarmfulEventManageSearchModelmodel){intoffset(model.page-1)*model.limit;introwsmodel.limit;ListstringwhereListnewListstring();varcountPmnewDynamicParameters();varpagePmnewDynamicParameters();// 动态构建查询条件if(model.repTypeId0){whereList.Add(repTypeId1?repTypeId1);countPm.Add(?repTypeId1,model.repTypeId);pagePm.Add(?repTypeId1,model.repTypeId);}if(!string.IsNullOrEmpty(model.submitDate)){string[]datesmodel.submitDate.Split(~);whereList.Add(submitDate between ?startTime and ?endTime);countPm.Add(?startTime,dates[0].Trim() 00:00:00);countPm.Add(?endTime,dates[1].Trim() 23:59:59);pagePm.Add(?startTime,dates[0].Trim() 00:00:00);pagePm.Add(?endTime,dates[1].Trim() 23:59:59);}stringwheresqlstring.Join( and ,whereList);stringsqlPagesql where wheresql ORDER BY submitDate DESC LIMIT ?pageoff,?limit;MedreportmtInfos_mysqlService.DBQueryMedreportmtModel(_harmfulevent,sqlPage,pagePm);MedreportmtCount_mysqlService.DBQueryMedreportmtModel(_harmfulevent,sqlCount,countPm);returnJson(newDataTableModelT{code0,countMedreportmtCount.Count,dataMedreportmtInfos});}四、会话与权限管理4.1 Session存储用户信息// 登录时设置SessionprivatevoidSetEmployeeRoles(EmployeeModelLoginUser){HttpContext.Session.SetString(Employee,JsonConvert.SerializeObject(LoginUser));HttpContext.Session.SetString(EventTypes,JsonConvert.SerializeObject(DI.QueryMedreptypes(_mysqlService,_harmfulevent,LoginUser.roleId)));// 权限控制HttpContext.Session.SetString(CanTrack,DI.isPermissions(_mysqlService,_qasystem,LoginUser.roleId,47));// 追踪权限HttpContext.Session.SetString(CanTrackAudit,DI.isPermissions(_mysqlService,_qasystem,LoginUser.roleId,50));// 追踪审核权限HttpContext.Session.SetString(CanSend,DI.isPermissions(_mysqlService,_qasystem,LoginUser.roleId,51));// 转发权限HttpContext.Session.SetString(DeptManager,DI.isPermissions(_mysqlService,_qasystem,LoginUser.roleId,42));// 科室管理权限}4.2 权限验证基类publicclassCheckLoginController:Controller{publicnewIActionResultView(){if(string.IsNullOrEmpty(HttpContext.Session.GetString(Employee))){returnRedirect(/Login/UserLogin);}returnbase.View();}}五、前端架构5.1 Layui表格组件tableidHarmfulEventsManageTablelay-filterHarmfulEventsManageTable/tablescriptlayui.use([index,table],function(){vartablelayui.table;table.render({elem:#HarmfulEventsManageTable,url:/HarmfulEventManage/HarmfulEventManageList,cols:[[{type:checkbox,fixed:left},{field:repId,width:160,title:文书ID},{field:status,width:70,title:状态,templet:#status},{field:isTrack,width:80,title:追踪,templet:#isTrack},{field:repTypeName,width:250,title:事件类型}]],page:true,limit:20,limits:[20,100,200,300]});});/script5.2 事件类型模板scripttypetext/htmlidstatus{{#if(d.status0){}}buttonclasslayui-btn layui-btn-warm layui-btn-xs暂存/button{{#}elseif(d.status1){}}buttonclasslayui-btn layui-btn-normal layui-btn-xs上报/button{{#}elseif(d.status2){}}buttonclasslayui-btn layui-btn-xs审核/button{{#}}}/script六、26种不良事件类型系统支持26种不良事件涵盖了医院运营的各个关键环节编号事件类型特殊字段01输血不良反应血型、配血结果02输血相关事件血袋信息03手术并发症手术信息、麻醉方式04术前术后诊断不符诊断对比05其他手术相关事件手术部位错误等06药品不良反应用药信息、过敏史07用药差错事件差错环节分类08职业暴露事件暴露类型、病毒类型09医院感染相关感染类型10麻醉镇静相关麻醉方式11管路事件管路类型、滑脱方式12公共意外事件意外类型13跌倒坠床事件跌倒评分、跌倒部位14治安事件事件类型15其他不良事件-16医疗设备器械设备信息17其他医疗不良事件-18护理给药错误给药途径19其他护理不良事件护理缺陷20压力性损伤压疮分期21院感爆发爆发类型22信息不良事件网络安全23院内不预期心跳停止心肺复苏24检查检验病理切片标本信息25输液并发症静脉炎分级26非计划再次手术再手术原因七、系统亮点7.1 灵活的事件类型扩展通过JSON存储事件内容可以轻松添加新的事件类型而无需修改数据库结构。7.2 多系统数据整合通过统一的数据访问层整合了HIS、LIS、人事系统等多个数据源。7.3 完善的权限体系基于角色的权限控制细粒度的功能权限和数据权限管理。7.4 实时的钉钉通知关键操作自动推送钉钉消息实现闭环管理。总结本文介绍了医院不良事件管理系统的整体架构设计包括多数据库架构、26种事件类型设计、统一响应模型、Session权限管理等核心模块。下一篇文章将详细介绍权限认证与钉钉集成的具体实现。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2553442.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!