当前位置: 首页 > article >正文

基于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权限管理等核心模块。下一篇文章将详细介绍权限认证与钉钉集成的具体实现。

相关文章:

基于ASP.NET Core的医院不良事件管理系统的架构设计

基于ASP.NET Core的医院不良事件管理系统的架构设计 前言 医院不良事件管理是医疗质量安全管理的重要环节,一个优秀的不良事件管理系统需要覆盖事件上报、审核追踪、分析统计的完整闭环。本文将详细介绍如何基于ASP.NET Core构建一个完整的医院不良事件管理系统&…...

17种统计假设检验方法及Python实现指南

1. 统计假设检验的核心价值与应用场景统计假设检验是数据分析师和研究人员最常用的工具之一。它帮助我们基于样本数据对总体特征做出概率性判断,而不是仅凭直觉或表面现象下结论。在实际工作中,我经常遇到这样的场景:产品经理想知道新版本是否…...

终极微信自动化指南:如何用wxauto轻松管理你的微信消息

终极微信自动化指南:如何用wxauto轻松管理你的微信消息 【免费下载链接】wxauto Windows版本微信客户端(非网页版)自动化,可实现简单的发送、接收微信消息,简单微信机器人 项目地址: https://gitcode.com/gh_mirrors…...

终极Elsevier审稿状态追踪指南:3分钟免费安装,实时监控投稿进度

终极Elsevier审稿状态追踪指南:3分钟免费安装,实时监控投稿进度 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在为Elsevier期刊投稿后的漫长等待而焦虑吗?Elsevier Tracker是…...

基于大语言模型的智能问答代理:WebQA Agent 架构解析与实战

1. 项目概述:当大模型遇上结构化知识库最近在折腾一个挺有意思的项目,叫MigoXLab/webqa-agent。简单来说,这是一个基于大语言模型(LLM)的智能问答代理,但它不是简单地让模型“凭空想象”答案,而…...

Elsevier投稿返修时,如何用LaTeX的xcolor宏包精准修改参考文献颜色(附完整代码)

Elsevier投稿返修时如何用LaTeX的xcolor宏包精准修改参考文献颜色 收到期刊返修意见时,参考文献的格式调整往往是让研究者头疼的环节。特别是当审稿人要求"将修改过的参考文献条目标记为蓝色"时,许多作者发现常规的\textcolor{blue}{...}命令在…...

微信聊天记录永久保存完整指南:如何用WeChatMsg守护你的数字记忆

微信聊天记录永久保存完整指南:如何用WeChatMsg守护你的数字记忆 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…...

一张表说清网络底层:看完你也能当半个“网管”

网络基础知识(详细版)一、什么是网络?网络是通过传输介质(网线、光纤、无线电波)和网络设备(路由器、交换机等)将两台以上计算机或智能设备连接起来,实现数据通信和资源共享的系统。…...

第29篇:ONNX格式详解——实现跨框架模型转换与部署的桥梁(原理解析)

文章目录现象引入:为什么我的PyTorch模型在TensorFlow Serving上跑不起来?提出问题:能否有一种通用的“模型中间件”?原理剖析:ONNX如何构建这座“桥梁”?1. 模型表示层:基于计算图的静态描述2.…...

Python高级应用系列(十五)测试驱动开发:pytest高级用法与测试工程化

前言 测试是软件质量的护城河,而测试工程化则是让这条护城河持续有效的关键。 在Python生态中,pytest几乎是单元测试的代名词——它的设计哲学是「简单用例简单写,复杂用例也有优雅写法」,零配置即能运行,同时也支持从基本到高级的各类复杂场景。 本文将带你从pytest基…...

ComfyUI IPAdapter Plus完整指南:从零开始掌握AI图像风格迁移

ComfyUI IPAdapter Plus完整指南:从零开始掌握AI图像风格迁移 【免费下载链接】ComfyUI_IPAdapter_plus 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_IPAdapter_plus 想要在ComfyUI中实现精准的图像风格控制吗?ComfyUI IPAdapter Plus…...

Gemma-4-26B-A4B-it-GGUF实战案例:金融研报关键信息抽取+风险点结构化呈现

Gemma-4-26B-A4B-it-GGUF实战案例:金融研报关键信息抽取风险点结构化呈现 1. 项目概述 Google Gemma 4系列中的高性能MoE(混合专家)模型Gemma-4-26B-A4B-it-GGUF,凭借其256K tokens的超长上下文处理能力和结构化输出特性&#x…...

如何让无导航的PDF文档拥有智能目录?pdfdir一键生成书签解决方案

如何让无导航的PDF文档拥有智能目录?pdfdir一键生成书签解决方案 【免费下载链接】pdfdir PDF导航(大纲/目录)添加工具 项目地址: https://gitcode.com/gh_mirrors/pd/pdfdir 在数字化阅读时代,PDF文档已成为我们工作学习中…...

告别云端依赖:手把手教你离线打包uni-app自定义基座(Android Studio实战)

离线开发全攻略:Android Studio构建uni-app自定义基座深度实践 在数字化转型浪潮中,跨平台开发框架uni-app凭借"一次开发,多端部署"的优势,已成为移动应用开发的重要选择。然而,当开发环境受限或需要高度自主…...

别只盯着Arduino IDE!用PlatformIO配置Seeeduino XIAO开发环境,顺便搞定USB驱动

用PlatformIO解锁Seeeduino XIAO的进阶开发体验 当大多数开发者第一次接触Seeeduino XIAO时,Arduino IDE往往是默认选择。但如果你已经厌倦了手动管理库依赖、缺乏现代IDE功能的工作流,PlatformIO可能是你一直在寻找的解决方案。作为一个开源的跨平台嵌入…...

Unreachable code 代码不可达

在 Vue 组件中,data 和 props 是同级关系。它们都是定义在组件选项对象顶层的属性,与 methods、computed 等选项并列。export default {// props 和 data 在这里是并列的同级选项props: [messageFromParent], data() {return {messageFromMe: Hello!}},m…...

保姆级教程:手把手教你用Visdom可视化SimCLR在PyTorch中的完整训练过程(含Loss/Acc曲线)

深度解析:用Visdom实时监控SimCLR在PyTorch中的训练动态与调参实战 当你在深夜盯着终端里不断跳动的loss数值,是否曾希望训练过程能像仪表盘一样直观呈现?SimCLR作为对比学习的经典框架,其两阶段训练特性使得可视化监控变得尤为重…...

ORB-SLAM2特征点提取器(ORBextractor)的八叉树筛选与图像金字塔实战调参指南

ORB-SLAM2特征点提取器实战调参:八叉树筛选与图像金字塔深度优化 1. ORBextractor核心机制解析 在视觉SLAM系统中,特征点提取的质量直接影响后续的跟踪精度和建图效果。ORB-SLAM2的ORBextractor模块通过创新的八叉树筛选机制和图像金字塔策略&#xff0c…...

Windows 11任务栏拖放功能增强工具:从技术原理到个性化配置的完整探索

Windows 11任务栏拖放功能增强工具:从技术原理到个性化配置的完整探索 【免费下载链接】Windows11DragAndDropToTaskbarFix "Windows 11 Drag & Drop to the Taskbar (Fix)" fixes the missing "Drag & Drop to the Taskbar" support i…...

Windows下从零跑通PULSE算法:手把手解决dlib安装报错和‘Could not find a face’问题

Windows下PULSE算法实战指南:从环境搭建到人脸超分辨率重建 最近两年,图像超分辨率重建技术取得了突破性进展,其中PULSE算法因其独特的人脸生成能力备受关注。不同于传统超分方法,PULSE通过生成对抗网络(GAN)的逆向推理&#xff0…...

Qt6.5安装后,如何在VS2022里配置插件并创建第一个项目?

Qt6.5与VS2022开发环境深度配置指南 对于习惯使用Visual Studio进行C开发的程序员来说,将Qt6.5集成到VS2022中能充分发挥两者的优势。本文将详细介绍从插件安装到项目创建的全流程,帮助开发者快速搭建高效的Qt开发环境。 1. 安装Qt Visual Studio Tools插…...

【花雕动手做】嵌入ESP32S3的具身智能体:AI Agent 四大核心能力的物理化重构

当AI Agent的载体是一个基于ESP32S3的物理机器人时,其四大核心能力被赋予了全新的物理化内涵:它们不再依赖云端无限的算力与存储资源,而是需适配MCU(微控制单元)的功耗限制、内存约束与实时性要求,同时获得…...

如何在5分钟内用Python获取专业级金融数据:Finnhub API完整指南

如何在5分钟内用Python获取专业级金融数据:Finnhub API完整指南 【免费下载链接】finnhub-python Finnhub Python API Client. Finnhub API provides institutional-grade financial data to investors, fintech startups and investment firms. We support real-ti…...

快递鸟批量快递查询Skill,正式上线 Clawhub!可在WorkBuddy一键安装技能!

快递鸟批量快递查询Skill,正式上线 Clawhub!可在WorkBuddy一键安装技能!快递鸟 2026-04-21企业数字化转型浪潮下,AI Agent正在重塑业务交互模式。从智能客服到办公助手,越来越多的企业开始探索将AI能力融入日常工作流程…...

从拒稿到接收:我如何通过优化论文格式让Journal of Intelligent Fuzzy Systems审稿人眼前一亮

从拒稿到接收:学术论文格式优化的实战经验分享 第一次收到Journal of Intelligent & Fuzzy Systems的拒稿邮件时,我盯着屏幕足足五分钟——不是因为研究内容被质疑,而是审稿人那句"图表分辨率不足,引用格式混乱"让我…...

数字孪生落地指南与技术选型:从选型到交付全流程避坑实战 | 数字孪生实战训练营

⚠️ 说明:本文内容偏实践经验总结,更适合有数字孪生项目背景或正在推进相关工作的读者阅读。 在数字化转型的深水区,数字孪生已不再仅仅是炫酷的视觉概念,而是深入业务一线、赋能决策的核心工具。然而,从概念雏形到最…...

企业无线网反复弹认证页面?排查这3个AC配置项和2个手机设置就够了

企业无线网络认证弹窗故障排查指南:从AC配置到终端优化的全流程解决方案 当企业员工频繁抱怨"明明已经认证过,为什么又弹出登录页面"时,作为网络管理员的你该如何快速定位并解决问题?这种反复弹窗的认证故障不仅影响工作…...

企业如何选择适合自己的电商系统技术架构?(实操落地版)

一、先明确4个核心前提(选架构的基础) 企业不要盲目追「微服务、云原生」高端概念,先自查自身条件: 业务体量:日订单量、用户规模、是否做大促/直播爆单;经营模式:单商户自营、多商户入驻、S2B2…...

别再手动排班了!用 Vue 和 Element UI 封装一个可复用的日历排班组件(支持批量操作)

基于Vue与Element UI构建企业级可视化排班系统 在医疗、零售、客服等行业中,排班管理一直是困扰管理者的难题。传统表格形式的排班方式不仅操作繁琐,而且难以直观展示复杂的班次关系。本文将介绍如何利用Vue.js和Element UI组件库,从零开始构…...

为什么选择Qsign签名API:5分钟搭建QQ机器人核心服务实战指南

为什么选择Qsign签名API:5分钟搭建QQ机器人核心服务实战指南 【免费下载链接】Qsign Windows的一键搭建签名api 项目地址: https://gitcode.com/gh_mirrors/qs/Qsign Qsign签名API服务是专为QQ机器人开发者设计的签名计算解决方案,通过模拟Androi…...