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

医疗信息化实战:打造全院统一标签打印平台的完整解决方案

医疗信息化实战:打造全院统一标签打印平台的完整解决方案

一、项目概述

本文详细讲解如何使用ASP.NET Core+Layui+LODOP实现病历号标签、药品标签、腕带、病理切片等多种医疗场景下的标签打印功能。该系统涵盖了门诊、住院、血透、肿瘤等不同患者类型的腕带打印,以及药品效期、货架标签等物资管理标签的打印需求。

二、系统架构设计

2.1 技术栈

层级技术选型说明
后端框架ASP.NET Core MVC (.NET 7)轻量级、高性能
前端框架Layui 2.9.7模块化UI组件
ORMDapper轻量级ORM,支持多数据库
打印控件LODOP专业条码标签打印控件
数据库MySQL + Oracle + PostgreSQL医院多数据源整合

2.2 核心功能模块

BarPrinterController ├── Index() # 主页-标签打印总览 ├── WristStrapPrinter() # 住院患者腕带打印 ├── IMedicineRack() # 智能药架标签打印 ├── GetBingrenxx() # 获取病人信息(门诊) ├── GetZhuYuanBrxx() # 获取住院病人信息 ├── GetMenZhenBrxx() # 获取门诊病人信息 ├── GetZhigongxx() # 获取职工信息 ├── GetDrugDic() # 药品字典查询 ├── GetYouXiaoq() # 效期计算 ├── GetPrintText() # 获取打印模板内容 └── NumList()/AddNumList() # 号码段标签生成

三、核心代码实现

3.1 多数据源病人信息查询

医院系统通常涉及多个业务数据库,系统需要从不同数据源获取病人信息:

/// <summary>/// 获取门诊病人信息 - 从PostgreSQL查询/// </summary>publicJsonResultGetMenZhenBrxx(stringbingrenid){MZBINGRENXXbingrenxx=null;// 从LyradB PostgreSQL数据库查询门诊病人视图stringsql=@"SELECT * FROM ""interface"".""V_GLXT_BINGLIHAO"" WHERE ""BINGRENID"" = @bingrenid";List<MZBINGRENXX>bingrenxxList=_pgsqlService.DBQuery<MZBINGRENXX>(_lyradb,sql,newMZBINGRENXX{bingrenid=bingrenid});if(bingrenxxList.Count>0){bingrenxx=bingrenxxList[0];// 根据出生日期计算年龄bingrenxx.nianling=getAgeByBirthday.getAge(bingrenxx.chushengrq);}returnJson(bingrenxx);}/// <summary>/// 获取住院病人信息 - 从PostgreSQL查询在院患者/// </summary>publicJsonResultGetZhuYuanBrxx(stringbingrenid){BINGRENXXbingrenxx=null;stringsql=@"SELECT binganhao as ""BINGRENID"", xingming as ""XINGMING"", xingbiemc as ""XINGBIE"", dangqiancwmc as ""DANGQIANCW"", ruyuansj::DATE as ""RUYUANRQ"" FROM vela_jz.jz_zy_jiuzhenxx aa WHERE aa.zuhuid = '1416615363583414272' AND aa.zuzhijgid = 'H33018200799' AND aa.zuofeibz = '0' AND aa.zaiyuanztdm = '0' AND aa.binganhao = @bingrenid AND aa.xiugaixtid='lyra.saas'";List<BINGRENXX>bingrenxxList=_pgsqlService.DBQuery<BINGRENXX>(_lyradb1,sql,newBINGRENXX{bingrenid=bingrenid});returnJson(bingrenxxList.Count>0?bingrenxxList[0]:null);}

3.2 药品效期智能计算

系统支持按天、小时、月计算药品效期:

/// <summary>/// 根据有效期计算效期开始时间和结束时间/// </summary>publicJsonResultGetYouXiaoq(YouXiaoQmodel){stringxiaoqijs=string.Empty;if(model.danwei=="1"||string.IsNullOrEmpty(model.danwei)){// 按天计算xiaoqijs=Convert.ToDateTime(model.xiaoqiks).AddDays(model.youxiaoq).ToString("yyyy-MM-dd HH:mm");}elseif(model.danwei=="2"){// 按小时计算xiaoqijs=Convert.ToDateTime(model.xiaoqiks).AddHours(model.youxiaoq).ToString("yyyy-MM-dd HH:mm");}elseif(model.danwei=="3"){// 按月计算xiaoqijs=Convert.ToDateTime(model.xiaoqiks).AddMonths(model.youxiaoq).ToString("yyyy-MM-dd HH:mm");}YouXiaoQyouXiaoQ=newYouXiaoQ(){youxiaoq=model.youxiaoq,xiaoqiks=Convert.ToDateTime(model.xiaoqiks).ToString("yyyy-MM-dd HH:mm"),xiaoqijs=xiaoqijs};returnJson(youXiaoQ);}

3.3 LODOP标签打印实现

3.3.1 病历号条码标签打印
functionBarPrinter(strPrinterName,data,type){LODOP=getLodop();if(type==0){// 病历号标签打印LODOP.PRINT_INITA("0cm","0cm","5cm","3cm","病历号打印");LODOP.PRINT_INIT("病历号打印-"+data.xingming+"("+data.bingrenid+")");// 添加Code39条码LODOP.ADD_PRINT_BARCODE("1.296cm","0.529cm","3.969cm","1.005cm","Code39",data.bingrenid);LODOP.SET_PRINT_STYLEA(0,"ShowBarText",0);// 添加医院名称LODOP.ADD_PRINT_TEXT("0.307cm","0.011cm","5.001cm","0.688cm","建德市第一人民医院");LODOP.SET_PRINT_STYLEA(0,"FontName","微软雅黑");LODOP.SET_PRINT_STYLEA(0,"FontSize",11);LODOP.SET_PRINT_STYLEA(0,"Alignment",2);LODOP.SET_PRINT_STYLEA(0,"Bold",1);// 添加姓名和性别LODOP.ADD_PRINT_TEXT("0.9cm","0.511cm","4.551cm","0.661cm","姓名:"+data.xingming);LODOP.SET_PRINT_STYLEA(0,"FontName","微软雅黑");LODOP.ADD_PRINT_TEXT("2.381cm","2.985cm","2cm","0.661cm","性别:"+data.xingbie);}// ... 其他打印类型}
3.3.2 智能药架二维码标签打印
functionBarPrinter(strPrinterName,data,type){LODOP=getLodop();if(type==2){// 智能药架标签打印LODOP.PRINT_INITA("0cm","0cm","5cm","3cm","货架标签");LODOP.SET_PRINT_MODE("PRINT_NOCOLLATE",1);if(data.medicineRackType==0){// 普通药架标签 - 二维码在左侧LODOP.ADD_PRINT_BARCODE("0.423cm","3.493cm","1.799cm","1.799cm","QRCode",data.medicineRackNo);LODOP.ADD_PRINT_TEXT("1.667cm","3.519cm","1.588cm","0.529cm",data.medicineRackNo);LODOP.SET_PRINT_STYLEA(0,"FontName","微软雅黑");LODOP.ADD_PRINT_TEXT(16,10,121,25,data.drugName);LODOP.ADD_PRINT_TEXT(55,10,120,25,data.drugStandards);LODOP.ADD_PRINT_TEXT(89,10,110,25,"货架标签");}else{// 机包药架标签 - 二维码在右侧LODOP.ADD_PRINT_BARCODE("1.61cm","0.2cm","1.81cm","1.81cm","QRCode",data.medicineRackNo);LODOP.ADD_PRINT_TEXT(62,52,130,25,data.drugName);LODOP.ADD_PRINT_TEXT(94,52,130,25,data.drugStandards);}}}
3.3.3 腕带打印(垂直布局)
functionWristbandPrinter(strPrinterName,data){LODOP=getLodop();// 腕带尺寸: 宽度3.5cm, 高度27.6cm (垂直打印)LODOP.PRINT_INITA("-0.212cm","0cm","3.5cm","27.599cm","病人腕带打印");LODOP.SET_PRINT_MODE("PRINT_NOCOLLATE",1);// 添加"血透"科室标识LODOP.ADD_PRINT_TEXT("8.837cm","0.37cm","2.17cm","0.582cm","血透");LODOP.SET_PRINT_STYLEA(0,"FontName","微软雅黑");LODOP.SET_PRINT_STYLEA(0,"FontSize",11);LODOP.SET_PRINT_STYLEA(0,"Alignment",2);// 添加二维码 (20|前缀表示血透患者)LODOP.ADD_PRINT_BARCODE("9.525cm","0.873cm","1.535cm","1.349cm","QRCode","20|"+data.bingrenid3);// 添加患者姓名LODOP.ADD_PRINT_TEXT("10.742cm","0.185cm","2.514cm","0.529cm",data.xingming);LODOP.SET_PRINT_STYLEA(0,"FontName","微软雅黑");LODOP.SET_PRINT_STYLEA(0,"Alignment",2);// 添加病历号LODOP.ADD_PRINT_TEXT(424,7,96,20,data.bingrenid3);LODOP.SET_PRINT_STYLEA(0,"FontName","微软雅黑");LODOP.SET_PRINT_STYLEA(0,"FontSize",10);LODOP.SET_PRINT_STYLEA(0,"Alignment",2);// 发送到打印机if(LODOP.SET_PRINTER_INDEXA(strPrinterName)){LODOP.PRINT();}}

3.4 动态模板打印

系统支持从数据库加载打印模板,实现动态打印内容:

[HttpPost]publicDataTableModel<BINGRENXX>GetPrintText(BINGRENXXmodel){// 获取住院病人信息BINGRENXXbingrenxx=GetZhuYuanBrxx3(model.bingrenid);// 从MySQL数据库加载打印模板stringsql="SELECT * FROM Template WHERE TempCode=?TempCode AND UseFlag=0";TemplateModelTemplateModel=_mysqlService.DBFind<TemplateModel>(_qasystem,sql,newTemplateModel{TempCode=model.waidailb});List<BINGRENXX>Nums=newList<BINGRENXX>();Nums.Add(bingrenxx);// 模板内容通过msg返回,前端用eval执行DataTableModel<BINGRENXX>dataTableModel=newDataTableModel<BINGRENXX>{code=1,count=0,msg=TemplateModel.Content,// 模板JS代码data=Nums};returndataTableModel;}

前端执行模板代码:

functionprn(data,msg,strPrinterName){LODOP=getLodop();eval(msg);// 执行模板中的LODOP打印指令if(LODOP.SET_PRINTER_INDEXA(strPrinterName)){LODOP.PRINT();}}

四、前端页面设计

4.1 Layui标签页实现

<divclass="layui-tab layui-tab-brief"lay-filter="component-tabs-brief"><ulclass="layui-tab-title"><liclass="layui-this">病历号标签打印</li><li>智能药架标签打印</li><li>药品效期标签打印</li><li>其他效期标签打印</li><li>血透病人腕带打印</li><li>门诊患者腕带打印</li><li>肿瘤患者腕带打印</li><li>病理切片标签打印</li></ul></div>

4.2 药品字典弹窗选择

使用tableSelect组件实现药品快速检索选择:

tableSelect.render({elem:'#drugName',checkedKey:'JIAGEID',searchKey:'YAOPINMC',searchPlaceholder:'药品名称搜索',table:{url:'/BarPrinter/GetDrugDic',cols:[[{field:'JIAGEID',title:'价格ID',width:100},{field:'YAOPINMC',title:'药品名称',width:200},{field:'YAOPINGG',title:'药品规格',width:150}]]},done:function(elem,data){layui.each(data.data,function(index,item){elem.val(item.YAOPINMC);$("#drugStandards").val(item.YAOPINGG);})}})

五、数据模型定义

// 住院病人信息模型publicclassBINGRENXX{publicstringbingrenid{get;set;}// 病历号publicstringxingming{get;set;}// 姓名publicstringchushengrq{get;set;}// 出生日期publicstringnianling{get;set;}// 年龄publicstringxingbie{get;set;}// 性别publicstringdangqiancw{get;set;}// 当前床位publicstringruyuanrq{get;set;}// 入院日期publicstringwaidailb{get;set;}// 腕带类别}// 门诊病人信息模型publicclassMZBINGRENXX{publicstringbingrenid{get;set;}publicstringxingming{get;set;}publicstringchushengrq{get;set;}publicstringnianling{get;set;}publicstringxingbie{get;set;}publicstringjiuzhenrq{get;set;}// 就诊日期publicstringwaidailb{get;set;}}// 效期模型publicclassYouXiaoQ{publicintyouxiaoq{get;set;}// 有效期数值publicstringxiaoqiks{get;set;}// 效期开始时间publicstringxiaoqijs{get;set;}// 效期结束时间publicstringdanwei{get;set;}// 单位(1:天,2:小时,3:月)}// 打印模板模型publicclassTemplateModel{publicstringTempCode{get;set;}// 模板代码publicstringTempName{get;set;}// 模板名称publicstringTempType{get;set;}// 模板类型publicstringContent{get;set;}// 模板内容(JS代码)publicstringuseFlag{get;set;}// 使用标志}

六、打印功能流程图

┌─────────────────────────────────────────────────────────────────┐ │ 标签打印流程 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ 用户输入 → AJAX查询病人信息 → 选择打印模板 → LODOP打印 │ │ ↓ ↓ ↓ ↓ │ │ 病历号/姓名 多数据源聚合查询 数据库模板配置 硬件打印机 │ │ │ ├─────────────────────────────────────────────────────────────────┤ │ 支持的标签类型: │ │ • 病历号条码标签 (Code39) │ │ • 药品货架二维码标签 (QRCode) │ │ • 药品效期标签 │ │ • 患者腕带 (血透/门诊/住院/肿瘤) │ │ • 病理切片标签 │ └─────────────────────────────────────────────────────────────────┘

七、关键技术点总结

技术点实现方式优势
多数据源整合Dapper + 多种数据库驱动统一查询接口,适配医院复杂环境
条码生成LODOP ADD_PRINT_BARCODE支持Code39/QRCode等多种格式
前端框架Layui Tab + tableSelect界面友好,操作便捷
模板引擎数据库存储JS代码 + eval()模板可动态修改,无需编译
打印控制LODOP SET_PRINTER_INDEXA支持多打印机同时部署

八、总结

本文详细介绍了医院全院标签打印平台的设计与实现,该系统通过ASP.NET Core搭建后端服务,整合MySQL、Oracle、PostgreSQL多种数据源,使用LODOP控件实现专业的条码标签打印功能。前端采用Layui框架构建友好的用户界面,支持病历号标签、药品货架标签、患者腕带等多种类型的标签打印需求。系统架构清晰、扩展性强,已在实际医院环境中稳定运行。

http://www.cnnetsun.cn/news/1759473.html

相关文章:

  • Cellpose-SAM:革新生物医学图像分析的智能细胞分割解决方案
  • WindowsCleaner深度解析:三步解决C盘爆红难题,让你的Windows系统重获新生
  • Kubernetes External Secrets安全指南:命名空间注解与访问控制最佳实践
  • 基于卷积神经网络与Qwen3.5-4B的多模态理解效果对比展示
  • 超星Chaoxing多线程并发处理:高效完成多个课程任务的终极方案
  • 三步掌握微信数据管理:PyWxDump终极指南与合规启示
  • SEUThesis:东南大学学术论文写作的格式革命与效率提升指南
  • 百度网盘Mac版下载加速:告别龟速下载的实用方案
  • 车窗升降背后的通信秘密:拆解LIN总线在车身控制中的实战调度表
  • Outlook中没有发起Teams会议选项怎么办?一篇文章教你快速恢复
  • VisDrone2019数据集标注转换实战:从TXT到VOC格式的完整指南
  • 智能流分发:OBS多平台推流插件如何实现低资源高效直播
  • MRI脉冲序列实战指南:从SE到FLASH的7种临床常用配置详解
  • Bitwarden Web Vault:终极密码管理平台完全指南
  • 高效定位学术论文开源代码的五大实用技巧
  • 直播内容转瞬即逝?这款工具让精彩永驻
  • Z-Image-Turbo-辉夜巫女部署案例:GPU算力优化下的低显存高效文生图方案
  • Windows 11系统优化神器:Win11Debloat让你的电脑重获新生
  • granite-4.0-h-350m部署案例:Ollama构建外贸行业多语种邮件自动生成工具
  • 微信聊天记录全掌控:PyWxDump本地化备份与深度管理指南
  • 别再手动算RSEI了!用GEE+Python脚本自动化处理Landsat8/9数据,5分钟出图
  • GraphRAG 2.0.0实战:用阿里云API为你的本地文档库(如PDF/TXT)构建智能问答机器人
  • CyberpunkSaveEditor:精准解决赛博朋克2077存档修改难题的全能方案
  • Claude辅助设计提示词:提升Kandinsky-5.0-I2V-Lite-5s视频生成创意性
  • 终极指南:如何用FontCenter彻底解决AutoCAD字体缺失问题
  • ​Problem - 2149F - Codeforces​
  • 开源工具BaiduNetdiskPlugin-macOS:突破百度网盘下载速度限制的完整解决方案
  • 保姆级教程:用QGC地面站为Pixhawk6c mini刷写PX4 V1.13.3固件并完成DJI F450全配置
  • 如何通过参考文献追溯经典论文?—— 反向查找
  • BERT文本分割-中文-通用领域镜像免配置:内置健康检查与自动重启机制