基于Fo-Dicom实现的MWL服务

文章目录

  • 一、MWL简介
  • 二、MWL 功能
  • 三、MWL 的工作原理
    • 1. 信息来源
    • 2. 信息传输
    • 3. 信息显示和操作
  • 四、基于Fo-Dicom实现MWL服务
    • 服务端
  • 客户端


一、MWL简介

  放射科的成像设备工作列表(Modality Work List,MWL) 是一个包含患者检查信息的列表,这些信息通常来自 HIS 或 RIS。它被发送到放射科的成像设备,如 X 光机、CT 扫描仪、MRI 设备等,以指导设备操作人员进行检查。

二、MWL 功能

患者信息管理: MWL 包含患者的基本信息,如姓名、年龄、性别、病历号等。这些信息有助于设备操作人员准确识别患者,避免检查错误。
检查任务分配: MWL 根据患者的检查需求和设备的可用性,将检查任务分配给合适的成像设备。这可以提高设备的利用率,减少患者等待时间。
检查参数设置: MWL 可以提供检查的详细参数,如检查部位、检查方法、成像序列等。这些参数可以帮助设备操作人员快速设置设备,确保检查的准确性和一致性。
检查状态跟踪: MWL 可以实时跟踪检查的状态,如待检查、正在检查、已完成等。这有助于管理人员了解检查进度,及时调整工作计划。
报告生成: MWL 可以与报告系统集成,自动生成检查报告。这可以提高报告的准确性和及时性,减少医生的工作量。

三、MWL 的工作原理

1. 信息来源

  MWL 的信息主要来自 HIS 和 RIS。当患者在医院挂号、就诊或预约检查时,相关信息会被录入 HIS 或 RIS。这些信息包括患者的基本信息、临床诊断、检查申请等。

2. 信息传输

  MWL 信息通常通过网络传输到放射科的成像设备。这可以通过多种方式实现,如 DICOM(Digital Imaging and Communications in Medicine)协议、HL7(Health Level Seven)协议等。DICOM 协议是医学影像领域的标准通信协议,它可以确保不同厂家的成像设备和信息系统之间的互操作性。

3. 信息显示和操作

  成像设备接收到 MWL 信息后,会将其显示在设备的操作界面上。设备操作人员可以查看患者的检查信息,选择需要进行的检查任务,并根据检查参数设置设备。在检查完成后,设备操作人员可以将检查结果上传到 RIS 或 HIS,更新 MWL 的检查状态。

四、基于Fo-Dicom实现MWL服务

服务端

服务端主要实现CFind:完整代码

public class WorklistService : DicomService, IDicomServiceProvider, IDicomCEchoProvider, IDicomCFindProvider
{private static readonly DicomTransferSyntax[] _acceptedTransferSyntaxes = new DicomTransferSyntax[]{DicomTransferSyntax.ExplicitVRLittleEndian,DicomTransferSyntax.ExplicitVRBigEndian,DicomTransferSyntax.ImplicitVRLittleEndian};public string CallingAE { get; protected set; }public string CalledAE { get; protected set; }public WorklistService(INetworkStream stream, Encoding fallbackEncoding, ILogger logger, DicomServiceDependencies dependencies) : base(stream, fallbackEncoding, logger, dependencies){Logger = logger;    }public async Task<DicomCEchoResponse> OnCEchoRequestAsync(DicomCEchoRequest request){Logger.LogInformation($"Received verification request from AE { Association.CallingAE } with IP: { Association.RemoteHost }");return await Task.FromResult(new DicomCEchoResponse(request,DicomStatus.Success));}/// <summary>/// 查询/// </summary>/// <param name="request"></param>/// <returns></returns>public async IAsyncEnumerable<DicomCFindResponse> OnCFindRequestAsync(DicomCFindRequest request){if(request.Level != DicomQueryRetrieveLevel.NotApplicable){yield return new DicomCFindResponse(request,DicomStatus.QueryRetrieveUnableToProcess);}else{//根据条件筛选出结果,WorklistServer.CurrentWorklistItems是一个静态结果数据集,可自定义foreach(DicomDataset result in WorklistHandler.FilterWorklistItems(request.Dataset,WorklistServer.CurrentWorklistItems) ){yield return new DicomCFindResponse(request, DicomStatus.Pending) { Dataset = result};}yield return new DicomCFindResponse(request, DicomStatus.Success);}}public void OnConnectionClosed(Exception exception){}public void OnReceiveAbort(DicomAbortSource source, DicomAbortReason reason){throw new NotImplementedException();}public Task OnReceiveAssociationReleaseRequestAsync(){return SendAssociationReleaseResponseAsync();}public Task OnReceiveAssociationRequestAsync(DicomAssociation association){CallingAE = association.CallingAE;CalledAE = association.CalledAE;Logger.LogInformation($"Received association request from AE: {association.CallingAE} with IP: {association.RemoteHost} ");if (WorklistServer.CalledAE != association.CalledAE){Logger.LogError($"Association with {association.CallingAE} rejected since called aet {association.CalledAE} is unknown");return SendAssociationRejectAsync(DicomRejectResult.Permanent, DicomRejectSource.ServiceUser, DicomRejectReason.CalledAENotRecognized);}foreach (var pc in association.PresentationContexts){if (pc.AbstractSyntax == DicomUID.Verification|| pc.AbstractSyntax == DicomUID.ModalityWorklistInformationModelFind|| pc.AbstractSyntax == DicomUID.ModalityPerformedProcedureStep|| pc.AbstractSyntax == DicomUID.ModalityPerformedProcedureStepNotification|| pc.AbstractSyntax == DicomUID.ModalityPerformedProcedureStepNotification){pc.AcceptTransferSyntaxes(_acceptedTransferSyntaxes);}else{Logger.LogWarning($"Requested abstract syntax {pc.AbstractSyntax} from {association.CallingAE} not supported");pc.SetResult(DicomPresentationContextResult.RejectAbstractSyntaxNotSupported);}}Logger.LogInformation($"Accepted association request from {association.CallingAE}");return SendAssociationAcceptAsync(association);}

客户端

客户端简单发一个CFind请求:

 var worklistItems = new List<DicomDataset>();var cfind = DicomCFindRequest.CreateWorklistQuery();cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) =>{if(rp.HasDataset){worklistItems.Add(rp.Dataset);}};var client = DicomClientFactory.Create(_mwlIp, _mwlPort,false,_mwlCallingAE,_mwlCalledAE);await client.AddRequestAsync(cfind);await client.SendAsync();return worklistItems;

五、MPPS和MWL服务结合
关于MPPS的介绍,参考前文:MPPS详细介绍

很多时候MPPS服务和MWL服务可以一起实现,不需要分开。
流程:

  • 1、设备端通过MWL服务从Worklist查询相关检查信息
  • 2、设备将状态更改后,生成一个MPPS实例并通过MPPS服务返回给Worklist
  • 3、Worklist根据返回的检查状态进行其他操作

简单的可视化Demo程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35600.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

图神经网络GNN入门

参考教程&#xff1a;A Gentle Introduction to Graph Neural Networks 图神经网络&#xff08;Graph Neural Networks&#xff0c;GNNs&#xff09;是一类专门用于处理图结构数据的神经网络&#xff0c;旨在通过节点、边和图的结构信息来学习图中节点和图的表示。GNN通过消息传…

卧式螺旋混合机搅拌机:饲料加工设备

卧式螺旋混合机搅拌机是一种用于饲料混合的设备&#xff0c;其结构特点为卧式&#xff0c;即搅拌桶体水平放置。这种设计使得物料在搅拌过程中能够充分混合&#xff0c;且搅拌效率高、混合均匀度好。卧式饲料混合机广泛应用于畜牧业、养殖业以及饲料加工行业&#xff0c;是饲料…

【北京迅为】iTOP-4412全能版使用手册-第四十二章 驱动注册

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

交易系统:线上交易系统流程详解

大家好&#xff0c;我是汤师爷~ 今天聊聊线上交易系统流程详解。 线上交易系统为新零售连锁商家提供一站式线上交易解决方案。其核心目标是&#xff0c;通过数字化手段扩大商家的服务范围&#xff0c;突破传统门店的地理限制。系统支持电商、O2O等多种业务形态&#xff0c;为…

Postman接口测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 pre-request script 介绍 在过往的工作中&#xff0c;遇到很多测试小伙伴使用 postman 的时候都是直接通过 api 文档的描述请求&#xff0c;检查返回的数据是否正…

【单链表】(更新中...)

一、 题单 206.反转链表203.移除链表元素 876.链表的中间结点BM8 链表中倒数最后k个结点21.合并两个有序链表 二、题目简介及思路 206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 思路简单&#xff0c;但是除了要两个指针进…

深入理解 SQL 注入:原理、攻击流程与防御措施

深入理解 SQL 注入&#xff1a;原理、攻击流程与防御措施 在当今数字化的时代&#xff0c;数据安全已成为每个企业和开发者必须面对的重要课题。SQL 注入&#xff08;SQL Injection&#xff09;作为一种常见的网络攻击方式&#xff0c;给无数企业带来了巨大的损失。本文将深入…

市场上显卡型号需求分析

两个平台统计&#xff1a;&#xff08;关键词统计&#xff0c;仅做参考&#xff09; GPU型号&#xff5c;平台 github(提交量/万) huggingface&#xff08;模型量/个&#xff09; H100 6.6 210 A100 17.2 483 V100 14.4 484 4090 27.3 31 3090 11.1 92 在git…

C# WPF抽奖程序

C# WPF抽奖程序 using Microsoft.Win32; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.…

Master EDI 项目需求分析

Master Electronics 通过其全球分销网络&#xff0c;支持多种采购需求&#xff0c;确保能够为客户提供可靠的元件供应链解决方案&#xff0c;同时为快速高效的与全球伙伴建立合作&#xff0c;Master 选择通过EDI来实现与交易伙伴间的数据传输。 EDI为交易伙伴之间建立了一个安…

基于单片机的输液速度监控系统设计

本设计是以STM32F103C8T6单片机为控制核心&#xff0c;用户可通过按键模块来设置液体高度与点滴速度的阈值&#xff0c;采用液位传感器实时监测瓶内液体位置&#xff0c;若液位低于所设阈值&#xff0c;蜂鸣器进行声音报警提醒患者或医生。采用步进电机通过控制输液管直径大小从…

河工oj新生周赛第八周2024

A.小七的作业 小柒的作业 - 问题 - 软件学院OJ 代码 #include<bits/stdc.h> using namespace std;int main() {string s;cin >> s;int l, r;cin >> l >> r;string str s.substr(l,r-l1);cout << str;return 0; } B.小七的签到题 小柒的签到…

FPGA工作原理、架构及底层资源

FPGA工作原理、架构及底层资源 文章目录 FPGA工作原理、架构及底层资源前言一、FPGA工作原理二、FPGA架构及底层资源 1.FPGA架构2.FPGA底层资源 2.1可编程输入/输出单元简称&#xff08;IOB&#xff09;2.2可配置逻辑块2.3丰富的布线资源2.4数字时钟管理模块(DCM)2.5嵌入式块 …

低功耗蓝牙模块在高尔夫测距仪上的应用

在绿意盎然的高尔夫球场上&#xff0c;每一次挥杆都承载着球员对精准与完美的追求。随着科技的飞速发展&#xff0c;高尔夫运动也迎来了智能化的革新。一款集成了先进蓝牙模组的高尔夫测距仪&#xff0c;它不仅重新定义了高尔夫运动的测距精度&#xff0c;更以无线互联的便捷性…

如何在 cPanel 中创建子域名:分步指南

cPanel 是一个用于管理网站的工具&#xff0c;操作界面简单直观&#xff0c;常用于管理网站的各种功能&#xff0c;包括创建子域名。很多知名的网络服务提供商&#xff0c;如 Hostease&#xff0c;都提供了 cPanel 管理工具。 本文将详细介绍如何在 cPanel 中创建子域名&#x…

减少30%人工处理时间,AI OCR与表格识别助力医疗化验单快速处理

在医疗行业&#xff0c;化验单作为重要的诊断依据和数据来源&#xff0c;涉及大量的文字和表格信息&#xff0c;传统的手工输入和数据处理方式不仅繁琐&#xff0c;而且容易出错&#xff0c;给医院的运营效率和数据准确性带来较大挑战。随着人工智能技术的快速发展&#xff0c;…

Linux安装BellSoft JDK 17 LTS

原来使用的OpenJdk&#xff0c;看到SpringBoot官网推荐&#xff08;如下图&#xff09;贝尔实验室的JDK&#xff0c;打算换一下 官方下载链接 JKD下载 可以看到Win、Mac、Linux都提供了&#xff0c;并且还有x86架构和arm架构的 在Linux中我们可以使用 uname -a 查看当前操作系…

C++(九)

前言&#xff1a; 本文主要讲述运算符的优先顺序。 一&#xff0c;运算符的优先级。 请看以下表达式&#xff1a; a32*5 运算结果为&#xff1a;13. 可以看到&#xff0c;在此代码中&#xff0c;先运行了2*5的结果&#xff0c;在此基础上在进行3操作&#xff0c;因此结果…

学生公寓智能限电系统的功能和作用

学生公寓智能限电系统‌是一种用于管理和限制学生公寓用电的设备和技术&#xff0c;旨在确保用电安全、防止火灾事故&#xff0c;并促进节能减排。以下是关于学生公寓智能限电系统的详细介绍&#xff1a; 1、功能和作用 智能限电系统通过以下功能来管理和限制用电&#xff1a…

嵌入式入门Day25

数据结构Day 6,IO Day1 查找算法顺序查找折半查找&#xff08;二分查找&#xff09;哈希查找 IO概念标准IO创建递归索引&#xff08;用于查询结构体定义&#xff09; 文件IO标准IO缓冲区指针相关函数 查找算法 顺序查找 关键字&#xff1a;分为主关键字和次关键字主关键字&am…