基于信创云与云原生架构的医疗影像PACS系统实战指南
大家好,我是专注于医疗信息化与云计算领域的技术博主。在近期参与的一个医院影像科系统升级项目中,我们面临了传统PACS系统在数据孤岛、扩展性差、运维成本高以及国产化替代需求下的多重挑战。经过多轮技术选型与验证,最终基于“信创云”架构成功构建了一套全新的云PACS解决方案。本文将系统性地拆解这套方案的落地全过程,从核心概念、架构设计、环境搭建、关键配置到部署运维,手把手带你完成一个可运行的云PACS原型。无论你是医疗软件开发者、系统架构师,还是对信创和医疗云化感兴趣的IT从业者,都能从本文中获得从理论到实践的完整闭环知识。
1. 背景与核心概念:为什么需要“信创云PACS”?
在深入技术细节之前,我们必须厘清几个关键概念及其背后的驱动力。
1.1 传统PACS的痛点与挑战
PACS(Picture Archiving and Communication System,影像归档和通信系统)是医院影像科的核心,负责医学影像的获取、存储、传输、显示和管理。传统的PACS通常是基于院内服务器和存储阵列的紧耦合单体或烟囱式架构,存在以下典型问题:
- 数据孤岛严重 :影像数据与临床信息系统(HIS)、电子病历(EMR)、放射信息系统(RIS)交互困难,影响临床决策效率。
- 扩展性与弹性不足 :存储和计算资源固定,无法应对突发的影像数据增长(如疫情期间的CT检查量激增),扩容流程复杂、周期长、成本高。
- 运维成本高昂 :需要专业的硬件维护、机房环境保障和数据库调优团队,对于中小型医院是不小的负担。
- 高可用与容灾能力弱 :传统双机热备方案投资大,且真正的异地容灾实现复杂。
- 国产化替代需求 :在“信息技术应用创新”的国家战略背景下,医疗核心系统的软硬件国产化替代已成为明确方向,涉及操作系统、数据库、中间件、服务器芯片等全栈技术。
1.2 信创云与云PACS的定义与价值
- 信创云 :指基于信息技术应用创新体系构建的云计算平台。它底层采用国产化的CPU(如鲲鹏、飞腾)、操作系统(如麒麟、统信UOS)、数据库(如达梦、OceanBase)等基础软硬件,上层提供与主流云平台兼容的IaaS、PaaS服务。其核心价值在于 自主可控、安全可靠 。
- 云PACS :指将PACS的核心能力(如影像存储、处理、调阅)云化部署。它可以是私有云、行业云或混合云模式。云PACS并非简单地将传统软件部署在虚拟机上,而是采用微服务、容器化、对象存储等云原生技术进行重构。
- “信创云PACS”的结合价值 :将云PACS部署在信创云平台上,实现了 “云化敏捷弹性” 与 “信创自主安全” 的双重优势。具体表现为:
- 弹性资源 :按需分配存储和计算资源,应对业务峰值,降低初期投入。
- 服务化集成 :通过API网关,轻松与院内其他信创系统(HIS、EMR)对接,打破数据孤岛。
- 统一运维 :利用云平台的监控、日志、自动化运维能力,提升系统管理效率。
- 满足合规要求 :全栈国产化技术栈,符合医疗行业信息安全与信创建设政策。
1.3 全栈信创云管平台方案的角色
“全栈信创云管平台方案”是一个更上层的概念。它指的是一个能够统一管理信创云底层资源(计算、存储、网络)和上层平台服务(数据库、中间件、容器平台)的管控系统。对于云PACS而言,该平台可以:
- 一键部署 :通过模板将云PACS的微服务集群快速部署到信创云资源池中。
- 监控告警 :集中监控PACS各个服务的健康状态、影像调阅性能、存储容量等。
- 成本核算 :精确计量PACS服务所占用的云资源,实现成本分摊。
本文的实战部分,我们将聚焦于构建一个可运行在信创云IaaS层之上的云PACS核心微服务,暂不深入云管平台的开发。
2. 环境准备与版本说明
我们的目标是搭建一个最小化的云PACS演示环境,包含影像上传、存储、调阅等基本功能。
环境规划:
- 信创云IaaS层 :模拟环境使用基于 KVM+OpenStack 的私有云(兼容ARM架构的鲲鹏服务器),你也可以使用VMware等虚拟化环境模拟。生产环境则对应真实的鲲鹏/飞腾服务器集群。
- 操作系统 :统信服务器操作系统V20(1060)或麒麟V10 SPx。本文以统信UOS为例。
- 容器平台 : Kubernetes (K8s) 。这是云原生应用的事实标准,我们使用 K8s 来部署和管理PACS微服务。版本:v1.23+。
- 容器运行时 :Docker 20.10+ 或 Containerd。
- 核心中间件 :
- 数据库 :国产达梦数据库DM8,用于存储患者、检查、报告等结构化数据。也可用开源MySQL 8.0作为学习替代。
- 缓存 :Redis 6.x,用于会话和热点数据缓存。
- 对象存储 : MinIO 。这是一个兼容Amazon S3 API的高性能对象存储,用于存储DICOM影像文件。选择它是因为其轻量、开源,且易于在信创环境中部署。生产环境可考虑商用对象存储或Ceph。
- 微服务框架 :Spring Boot 2.7.x + Spring Cloud Alibaba 2021.x。这套框架在国内信创生态中兼容性较好。
- 开发工具 :JDK 11+(建议使用毕昇JDK或龙芯JDK等信创版本), Maven 3.8+, IDE不限。
项目结构预览:
cloud-pacs-demo/
├── docker-compose.yml # 本地开发环境编排
├── k8s-manifests/ # K8s部署文件
│ ├── namespace.yaml
│ ├── configmap.yaml
│ ├── secret.yaml
│ ├── mysql-dameng/ # 数据库部署
│ ├── minio/ # 对象存储部署
│ ├── pacs-gateway/ # API网关
│ ├── pacs-registry/ # 服务注册中心
│ ├── pacs-storage/ # 影像存储服务
│ └── pacs-viewer/ # 影像调阅服务
├── service-pacs-storage/ # 影像存储微服务
│ ├── src/main/java/.../controller/UploadController.java
│ ├── src/main/java/.../service/impl/DicomStoreServiceImpl.java
│ └── src/main/resources/application.yml
├── service-pacs-viewer/ # 影像调阅微服务
└── ...
3. 核心架构与原理拆解
一个典型的云PACS微服务架构如下图所示(此处用文字描述):
- 用户层 :医生工作站通过Web浏览器或专用客户端访问。
- 网关层 :Spring Cloud Gateway统一接收所有请求,负责路由、鉴权、限流。
- 业务服务层 :
- 存储服务 (Storage Service) :接收DICOM文件(通常通过DICOM C-STORE SCU发送),解析文件头信息,将元数据写入达梦数据库,将像素数据上传至MinIO对象存储。
- 调阅服务 (Viewer Service) :提供Restful API和WebSocket,前端根据检查ID请求影像列表,该服务从数据库查询元数据,从MinIO获取影像文件,并可能调用 影像处理服务 进行窗宽窗位调整、三维重建等(本文简化)。
- 报告服务、工作流服务等 (本文略)。
- 支撑服务层 :Nacos(服务注册发现、配置中心)、Sentinel(流量防护)、Seata(分布式事务,可选)。
- 数据层 :达梦数据库(元数据)、MinIO对象存储(影像文件)、Redis(缓存)。
关键技术原理:
- DICOM文件处理 :DICOM文件包含文件头(元数据)和像素数据。存储服务需要使用如
dcm4che、fo-dicom等开源库进行解析。 - 对象存储替代传统文件系统 :将海量、非结构化的影像文件存储在MinIO中,通过唯一的对象Key(如
patientId/studyId/seriesId/instanceId.dcm)进行索引,实现了无限扩展、高可靠和低成本存储。 - 微服务间通信 :服务间通过OpenFeign进行HTTP调用,通过Spring Cloud Stream或RocketMQ进行异步消息通信(如“新影像已归档”事件)。
4. 完整实战:从零搭建云PACS核心服务
我们从一个最简单的场景开始:实现一个接收DICOM文件并存储的微服务。
4.1 创建项目与依赖
首先,使用Spring Initializr创建 service-pacs-storage 项目,主要依赖: Spring Web , Spring Cloud OpenFeign , Nacos Discovery , MyBatis-Plus (操作达梦数据库), MinIO Java SDK。
pom.xml 关键依赖片段:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 达梦数据库驱动 -->
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.3.62</version>
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
<!-- MinIO SDK -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.7</version>
</dependency>
<!-- DICOM解析库 (以dcm4che为例) -->
<dependency>
<groupId>org.dcm4che</groupId>
<artifactId>dcm4che-core</artifactId>
<version>5.31.0</version>
</dependency>
<!-- Nacos服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.5.0</version>
</dependency>
</dependencies>
4.2 配置数据库与对象存储连接
application.yml 配置:
server:
port: 8081
spring:
application:
name: service-pacs-storage
datasource:
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://192.168.1.100:5236/cloud_pacs?useUnicode=true&characterEncoding=utf8
username: PACSDBA
password: ${DB_PASSWORD:YourStrongPassword} # 建议从环境变量读取
cloud:
nacos:
discovery:
server-addr: 192.168.1.101:8848
# MinIO配置
minio:
endpoint: http://192.168.1.102:9000
accessKey: ${MINIO_ACCESS_KEY:minioadmin}
secretKey: ${MINIO_SECRET_KEY:minioadmin}
bucket-name: dicom-images
# MyBatis-Plus配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开发时开启SQL日志
global-config:
db-config:
logic-delete-field: deleted # 逻辑删除字段
logic-delete-value: 1
logic-not-delete-value: 0
4.3 编写核心业务代码
1. 实体类与Mapper: 创建DICOM研究(Study)、序列(Series)、实例(Instance)的实体类,并定义对应的MyBatis-Plus Mapper接口。
// 实体类:DicomInstance.java (影像实例,对应一个DICOM文件)
@Data
@TableName("t_dicom_instance")
public class DicomInstance {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String studyUid; // 研究UID
private String seriesUid; // 序列UID
private String instanceUid; // 实例UID,DICOM文件唯一标识
private String patientId;
private String patientName;
private String modality; // 设备类型,如CT、MR
private String objectKey; // 在MinIO中的存储路径,如 `patient/study/series/instance.dcm`
private Date acquisitionDate; // 采集日期
// ... 其他DICOM Tag字段
}
2. MinIO配置类:
@Configuration
public class MinioConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
3. 核心服务层:DicomStoreServiceImpl
@Service
@Slf4j
public class DicomStoreServiceImpl implements DicomStoreService {
@Autowired
private MinioClient minioClient;
@Autowired
private DicomInstanceMapper instanceMapper;
@Value("${minio.bucket-name}")
private String bucketName;
@Override
public StoreResult storeDicomFile(MultipartFile dicomFile) throws Exception {
// 1. 解析DICOM文件头
DicomObject dicomObject = parseDicomHeader(dicomFile.getInputStream());
String studyUid = dicomObject.getString(Tag.StudyInstanceUID);
String seriesUid = dicomObject.getString(Tag.SeriesInstanceUID);
String instanceUid = dicomObject.getString(Tag.SOPInstanceUID);
String patientId = dicomObject.getString(Tag.PatientID);
// 2. 生成对象存储路径 (避免单目录文件过多)
String objectKey = String.format("%s/%s/%s/%s.dcm",
patientId, studyUid, seriesUid, instanceUid);
// 3. 上传到MinIO
minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(objectKey)
.stream(dicomFile.getInputStream(), dicomFile.getSize(), -1)
.contentType("application/dicom")
.build()
);
log.info("DICOM文件已上传至MinIO: {}", objectKey);
// 4. 元数据存入达梦数据库
DicomInstance instance = new DicomInstance();
instance.setInstanceUid(instanceUid);
instance.setStudyUid(studyUid);
instance.setSeriesUid(seriesUid);
instance.setPatientId(patientId);
instance.setPatientName(dicomObject.getString(Tag.PatientName));
instance.setModality(dicomObject.getString(Tag.Modality));
instance.setObjectKey(objectKey);
// ... 设置其他字段
instanceMapper.insert(instance);
log.info("DICOM实例元数据已入库,ID: {}", instance.getId());
// 5. (可选) 发送消息通知,触发后续处理流程
// dicomEventPublisher.publish(new DicomStoredEvent(instanceUid));
return StoreResult.success(instanceUid, objectKey);
}
private DicomObject parseDicomHeader(InputStream ins) throws IOException {
// 使用dcm4che库解析,此处为简化示例
DicomInputStream dis = new DicomInputStream(ins);
DicomObject dicomObject = dis.readDicomObject();
dis.close();
return dicomObject;
}
}
4. 控制器层:UploadController
@RestController
@RequestMapping("/api/dicom")
@Slf4j
public class UploadController {
@Autowired
private DicomStoreService dicomStoreService;
@PostMapping("/upload")
public ResponseEntity<ApiResponse<StoreResult>> uploadDicom(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return ResponseEntity.badRequest().body(ApiResponse.error("文件为空"));
}
try {
StoreResult result = dicomStoreService.storeDicomFile(file);
return ResponseEntity.ok(ApiResponse.success(result));
} catch (Exception e) {
log.error("DICOM文件存储失败", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(ApiResponse.error("存储失败: " + e.getMessage()));
}
}
}
4.4 部署与验证
1. 使用Docker Compose启动基础设施(开发环境):
# docker-compose.yml
version: '3.8'
services:
minio:
image: minio/minio:latest
container_name: pacs-minio
ports:
- "9000:9000" # API端口
- "9001:9001" # 控制台端口
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin123
command: server /data --console-address ":9001"
volumes:
- ./minio_data:/data
mysql: # 此处先用MySQL代替达梦做演示,达梦部署类似
image: mysql:8.0
container_name: pacs-mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: cloud_pacs
ports:
- "3306:3306"
volumes:
- ./mysql_data:/var/lib/mysql
nacos:
image: nacos/nacos-server:latest
container_name: pacs-nacos
environment:
MODE: standalone
ports:
- "8848:8848"
运行 docker-compose up -d 启动服务。
2. 创建MinIO存储桶和数据库表。 使用MinIO控制台( http://localhost:9001 )创建名为 dicom-images 的存储桶。 在达梦/MySQL中执行建表SQL,创建 t_dicom_instance 等表。
3. 启动 service-pacs-storage 应用。 确保应用连接到正确的Nacos、数据库和MinIO。
4. 使用Postman或curl进行测试。
curl --location --request POST 'http://localhost:8081/api/dicom/upload' \
--form 'file=@"/path/to/your/CT.dcm"'
预期成功响应:
{
"code": 200,
"message": "success",
"data": {
"instanceUid": "1.2.840.113619.2.176.2025...",
"objectKey": "patient001/1.2.840.113619.2.176.2025.../1.2.840.113619.2.176.2025.../1.2.840.113619.2.176.2025....dcm"
}
}
同时,检查MinIO控制台可以看到上传的文件,数据库 t_dicom_instance 表中有对应的记录。
5. 常见问题与排查思路
在信创云PACS的部署和开发过程中,你可能会遇到以下典型问题:
| 问题现象 | 可能原因 | 排查思路与解决方案 |
|---|---|---|
| DICOM文件上传后,元数据解析失败 | 1. 文件不是标准DICOM格式。 2. 使用的 dcm4che 等库版本与DICOM文件传输语法不兼容。 3. 文件流在传输过程中损坏。 |
1. 使用专业的DICOM查看器(如RadiAnt DICOM Viewer)验证文件。 2. 查看解析库的日志,确认支持的传输语法列表。尝试使用 DicomInputStream 的 setIncludeBulkData 等方法。 3. 检查上传接口的 MultipartFile 配置,确保 spring.servlet.multipart.max-file-size 足够大。 |
| 微服务无法注册到Nacos | 1. 网络不通,无法访问Nacos服务器地址。 2. spring-cloud-starter-alibaba-nacos-discovery 版本与Spring Boot/Cloud版本不匹配。 3. 信创操作系统防火墙策略限制。 |
1. 在微服务所在容器或主机上 ping 或 telnet Nacos地址端口。 2. 查阅Spring Cloud Alibaba官方版本说明,使用推荐版本组合。 3. 检查统信UOS/麒麟系统的防火墙: sudo firewall-cmd --list-all ,添加相应端口规则。 |
| 应用连接达梦数据库失败 | 1. JDBC驱动版本与达梦数据库版本不匹配。 2. 连接URL格式错误或端口不对。 3. 数据库用户权限不足。 |
1. 确认达梦数据库版本(如DM8),并从官方获取对应版本的JDBC驱动( DmJdbcDriver18 )。 2. 达梦默认端口是5236,检查URL: jdbc:dm://host:port/DATABASE 。 3. 使用数据库管理工具,确认用于连接的账户具有目标数据库的读写权限。 |
| MinIO上传文件超时或速度慢 | 1. MinIO服务所在节点网络带宽不足或磁盘IO慢。 2. 微服务与MinIO跨可用区或跨机房访问。 3. MinIO集群配置未优化(生产环境)。 |
1. 在微服务所在节点对MinIO节点进行网络测速和磁盘性能测试。 2. 尽量将微服务和MinIO部署在同一可用区或机房,减少网络延迟。 3. 生产环境部署MinIO集群,使用EC(纠删码)模式提升性能和可靠性。调整 MINIO_STORAGE_CLASS_STANDARD 等环境变量。 |
| 影像调阅服务从MinIO下载文件慢 | 1. 同上网络和IO问题。 2. 前端一次性请求全部序列的影像(可能上百张)。 3. 未启用缓存。 |
1. 优化网络。 2. 实现分片加载(Lazy Loading),前端先加载关键帧或缩略图,滚动时再加载完整图像。 3. 在调阅服务或网关层,对热门的、不变的影像文件引入Redis缓存,缓存其访问URL或文件流。 |
| 在鲲鹏ARM服务器上构建Docker镜像失败 | 基础镜像或某些依赖库没有ARM版本。 | 1. 确保所有 FROM 的基础镜像(如 openjdk:11-jre )支持多架构或提供ARM版本。推荐使用 eclipse-temurin:11-jre (支持多架构)。 2. 对于需要编译的本地依赖(如某些JNI库),需要在ARM环境下重新编译。 |
6. 最佳实践与工程建议
将云PACS推向生产环境,需要遵循以下工程实践以确保系统的稳定性、安全性和可维护性。
6.1 架构与部署
- 微服务粒度划分 :不要过度拆分。建议按 业务能力 划分,如“存储服务”、“调阅服务”、“报告服务”、“工作流引擎服务”。每个服务应独立可部署、可扩展。
- 配置外部化 :所有数据库连接、MinIO端点、第三方服务密钥等配置,必须通过Nacos Config或Apollo等配置中心管理,严禁硬编码在代码中。
- 健康检查与就绪探针 :在K8s的Deployment中为每个微服务配置
livenessProbe和readinessProbe,确保流量只会被路由到健康的实例。 - 资源限制与请求 :为每个K8s Pod设置合理的
resources.limits和requests,防止某个服务异常耗尽节点资源。
6.2 数据存储与安全
- DICOM文件存储策略 :
- 生命周期管理 :在MinIO中配置生命周期规则,自动将超过一定时间(如3年)的冷数据转移到更廉价的存储层。
- 存储桶策略 :遵循最小权限原则。为前端调阅服务生成预签名URL(有有效期)来临时访问影像,而不是直接暴露AccessKey/SecretKey。
- 数据库设计与优化 :
- 索引策略 :在
patient_id,study_uid,series_uid,modality,acquisition_date等高频查询字段上建立复合索引。 - 分区表 :对于海量实例记录表,可以按检查日期(
acquisition_date)进行范围分区,大幅提升查询效率。 - 数据归档 :将超过法定保存期限的检查记录和元数据迁移到历史库,减轻主库压力。
- 索引策略 :在
6.3 性能与高可用
- 服务无状态化 :确保微服务实例本身不保存会话状态,会话信息应存储在Redis集群中。这是实现水平扩展的前提。
- 网关层限流与熔断 :在Spring Cloud Gateway或独立的API网关上,对
/api/dicom/upload等关键接口配置限流规则,防止突发流量打垮存储服务。同时集成Sentinel实现服务熔断和降级。 - 对象存储高可用 :MinIO生产环境必须部署为分布式集群(至少4个节点),并启用纠删码(Erasure Code)模式,实现数据冗余和故障自愈。
- CDN加速影像调阅 :对于互联网医院等需要外网调阅的场景,可以将MinIO作为源站,对接信创云或第三方CDN,加速影像文件的下载。
6.4 运维与监控
- 集中式日志 :使用ELK(Elasticsearch, Logstash, Kibana)或Loki+Grafana栈,收集所有微服务、数据库、MinIO的日志,便于问题追踪。
- 全链路监控 :使用Prometheus监控各服务的JVM指标、HTTP请求延迟、错误率、MinIO存储桶容量、数据库连接数等关键指标,并在Grafana中配置仪表盘和告警规则。
- 持续集成与交付(CI/CD) :搭建基于Jenkins或GitLab CI的流水线,实现代码提交后自动构建Docker镜像、扫描漏洞、部署到K8s测试环境,并最终通过蓝绿发布或金丝雀发布上线到生产环境。
6.5 信创环境适配要点
- 基础镜像选择 :所有服务的Docker基础镜像,应优先选择支持ARM架构的官方镜像或国内信创镜像仓库提供的镜像。
- 国产中间件兼容性测试 :在开发阶段,就需要在鲲鹏/飞腾的服务器上进行完整的兼容性测试,特别是涉及本地库(如图像处理库OpenCV的Java绑定)的部分。
- 性能基准测试 :由于ARM和x86架构差异,需对关键业务流程(如DICOM文件解析上传、大规模影像调阅)进行性能压测,建立性能基线,为容量规划提供依据。
7. 总结与扩展方向
通过本文的实践,我们完成了一个云PACS核心存储服务的搭建,它运行在信创云环境(以K8s和国产组件为代表)中,实现了DICOM影像的接收、解析、元数据存储(达梦数据库)和文件存储(MinIO对象存储)的完整流程。这仅仅是云PACS的起点。
要构建一个完整的、可用于生产的系统,你还需要在以下方向进行扩展:
- 完善核心服务 :开发独立的 调阅服务 ,提供符合DICOM Web标准的WADO-RS API,并集成一个开源的Web影像查看器(如OHIF Viewer、Cornerstone.js)。
- 集成工作流引擎 :引入Camunda或Flowable等工作流引擎,实现从检查登记、技师拍片、医生写报告到报告审核发布的自动化流程。
- 强化安全与权限 :集成医院统一身份认证(如CAS),并在网关层实现基于角色的细粒度访问控制(RBAC),确保患者隐私数据安全。
- 对接外部系统 :通过HL7或Restful API与医院HIS、RIS系统对接,实现患者信息同步、检查申请与状态回传。
- 探索AI应用 :在架构中预留AI推理服务接口,未来可以接入肺结节筛查、骨折检测等AI辅助诊断模型,将结果结构化存储并反馈给医生。
信创云PACS的建设是一个系统工程,它不仅是技术的云化升级,更是对医疗IT架构、运维模式和生态合作的一次重塑。从这个小原型出发,逐步迭代,你就能构建出支撑未来智慧医院发展的坚实影像数据平台。如果在搭建过程中遇到任何问题,欢迎在评论区交流探讨。
更多推荐
所有评论(0)