九枢云影像安装部署手册
九枢云影像安装部署手册
- 1环境准备
- G3PACS数据库新建视图及dblinks
1.ris数据库
2.SPECTRA数据库 - 安装nginx
1.院内安装
2.前置机安装 - 部署API程序
1.consul
2.webgateapi
3.report
4.pacsstudy
5.pacswado - 集成测试步骤
##基于院内G3 PACS 院内服务器外网映射方案云影像部署
1. 环境准备:
PACSDB 192.168.52.130
PACSWEB: 192.168.52.131
RISDB 192.168.52.132
前置机 192.168.52.128
2. G3PACS数据库新建视图及dblinks
ris数据库
CREATE OR REPLACE VIEW "ihe_view_nreport" AS
SELECT a.iid AS "exam_id",
a.iid AS "iid",
a.CNAME AS "cname",
CASE
WHEN LENGTH(a.CNAME) >= 3 THEN
SUBSTR(a.CNAME, 1, 1) || '*' ||
SUBSTR(a.CNAME, LENGTH(a.CNAME), 1)
WHEN LENGTH(a.CNAME) = 2 THEN
SUBSTR(a.CNAME, 1, 1) || '*'
ELSE
a.CNAME
END AS "cnamey",
a.CSEX AS "csex",
a.CAGE AS "cage",
a.CBLKH AS "cblkh",
a.CCH AS "cch",
a.CSQKS AS "csqks",
a.CSQYSXM AS "csqysxm",
a.CSQYS AS "csqys",
a.DCHECKDATE AS "dcheckdate",
to_char(a.DCHECKDATE, 'yyyy-MM-dd') AS "jcsj",
a.CBZ AS "cbz",
a.CACCNO AS "caccno",
a.CMODALITY AS "cmodality",
a.CBGZT AS "cbgzt",
'RIS' AS "ctype",
a.CJCZT AS "cjczt",
b.cflag AS "report_flag",
a.CBRLX AS "cbrlx",
b.cshysxm AS "cshysxm",
b.dshsj AS "dshsj",
b.cbgzd AS "cbgzd",
b.cbgsj_hl7 AS "cbgsj_hl7",
s.study_instance_uid AS "instance_uid",
'1' AS "enable_query",
'RIS' AS "chospitalid",
s.study_instance_uid AS "instance_uid_view",
'' AS mris_args,
r.cphone AS "ctel",
'杭州九枢科技云影像' AS "HospitalName",
--如果oralce 实例为ris 数据库。院区编码直接使用RIS(大小写铭感,保持一致)
'RIS' AS "HospitalID",
r.cidcard AS "cidnumber",
'' as "mris_args",
a.CMODALITY || '检查报告单' AS "reporttype",
'' AS "yqbm_encrypt",
'' AS "accese_encrypt",
'' AS "pid_encrypt",
'' AS "pacs_args",
substr(r.cidcard, -4, 4) as 身份证后四位,
substr(r.cphone, -4, 4) as 手机后四位,
'http://192.168.52.131:20000/validate?cyqbm=RIS&pid=' || a.CBLKH ||
'&caccno=' || a.CACCNO as "链接地址"
FROM icnris_exam a,
icnris_exam_bg b,
icnris_register r,
study@pacstoris s
where a.iid = b.iexam_iid
and a.iid = r.iid
and a.caccno = s.access_no
and s.merge_key is null
and b.cflag = '9';
SPECTRA数据库
create or replace view "v_ihe_instance" as
select i.instance_key as "instance_key",
im.frame_width as "columnss",
im.frame_height as "rowss",
i.instance_no as "instancenumber",
NVL(im.acq_no, '') as "acquisitionnumber",
im.photometric_interpretation as "photometricinterpretation",
im.bits_allocated as "bitsallocated",
im.bits_stored as "bitsstored",
im.pixel_representation as "pixelrepresentation",
im.samples_per_pixel as "samplesperpixel",
case
when (im.pixelsize_x is null or im.pixelsize_x = '') then
'null'
else
'[' || trim(to_char(im.pixelsize_x, '0.000000')) || ',' ||
trim(to_char(im.pixelsize_y, '0.000000')) || ']'
end as "pixelspacing",
'' as "highbit",
case
when (fr.image_orientation = '\\\\\\\\\\') then
'null'
else
'[' || replace(fr.image_orientation, '\', ',') || ']'
end as "imageorientationpatient",
case
when (fr.image_position = '\\\\') then
'null'
else
'[' || replace(fr.image_position, '\', ',') || ']'
end as "imagepositionpatient",
'[' || replace(im.image_type, '\', ',') || ']' as "imagetype",
i.sop_instance_uid as "sopinstanceuid",
i.sop_instance_uid as "sop_instance_uid",
'dicomweb:http://127.0.0.1' || '/' || '/' || l.pathname || '/' ||
l.filename as "http_path",
'http://127.0.0.1' || '/' || '/' || l.pathname || '/' || l.filename as "http_path2",
im.image_no as "image_no",
case l.b1_vol_code
when 'D1' THEN
'F:\D1\'
WHEN 'D2' THEN
'F:\D2\'
WHEN 'B1' THEN
'G:\backup01\'
WHEN 'B2' THEN
'H:\backup02\'
WHEN 'B3' THEN
'I:\backup03\'
WHEN 'B4' THEN
'J:\backup04\'
ELSE
'Z:\'
END || REPLACE(L.PATHNAME, '/', '\') || '\' || L.FILENAME as "local_path",
--'D:\D1\'||REPLACE( L.PATHNAME,'/','\') ||'\'||L.FILENAME as "local_path",
i.series_key as "series_key",
'' as "meta_data",
'J:\INFINITT_PACS\C1' || '\' || REPLACE(L.PATHNAME, '/', '\') || '\' as "cache_path",
i.instance_key || '.ma' as "cache_metadata",
i.instance_key || '.fe' as "cache_frame",
'' as "cache_status",
'' as "filename",
'' as "pathname",
s.study_instance_uid as "studyinstanceuid",
s.study_instance_uid as "study_instance_uid",
e.series_instance_uid as "seriesinstanceuid",
e.series_instance_uid as "series_instance_uid"
from instance i,
image im,
instanceframe fr,
instanceloc l,
series e,
study s
where i.instance_key = im.instance_key
and i.instance_key = fr.instance_key
and im.instance_key = fr.instance_key
and e.series_key = i.series_key
and i.instance_key=l.instance_key
and e.study_key=s.study_key;
create or replace view "v_ihe_series" as
select se.series_key as "series_key",
se.series_desc as "seriesdescription",
se.series_instance_uid as "seriesinstanceuid",
se.series_no as "seriesnumber",
to_char(se.series_dttm, 'YYYYMMDD') as "seriesdate",
to_char(se.series_dttm, 'HHMISS') as "seriestime",
se.modality as "modality",
se.study_key as "study_key"
from series se;
create or replace view "v_ihe_study" as
select s.study_instance_uid as "studyinstanceuid",
s.study_desc as "studydescription",
to_char(study_dttm, 'YYYYMMDD') as "studydate",
to_char(study_dttm, 'HHMISS') as "studytime",
s.patient_name as "patientname",
s.patient_id as "patientid",
s.study_key as "study_key",
s.access_no as "access_no"
from study s;
3. 安装nginx
院内安装(配置中红色部分修改为绿色部分)
- 将云影像文件夹中的report、view文件夹拷贝nginx 程序目录下/html 文件夹下 ;

配置nginx.conf 中的 location / 和 location /view 节点,路径为上一步拷贝的文件路径。


配置修改
##此处的地址根据自己的作修改
location / {
root D:\\JSPACS\\install\\nginx124\\html\\report;
index index.html;
try_files $uri $uri/ /index.html;
}
location /view {
alias D:\\JSPACS\\install\\nginx124\\html\\view;
index index.html;
try_files $uri $uri/ /view/index.html;
}
location /reportApi/ {
proxy_pass http://localhost:20001/api/;
}
前置机安装(配置中红色部分修改为绿色部分)


这里修改完配置文件,记得另存为编码为ANSI的文件,防止乱码。
安装完成Nginx,打开cmd验证配置文件是否正确,服务启动是否异常
##每次修改完配置文件都需要更新配置文件
切换到自己的文件目录
D:\JSPACS\install\nginx124>nginx.exe -t

说明配置文件没有问题
启动
D:\JSPACS\install\nginx124>nginx.exe

Nginx安装启动完成
bat启动脚本
@echo off
cd /d D:\JSPACS\install\nginx124
start "" /B nginx.exe
echo [%date% %time%] Nginx started >> D:\JSPACS\Nginx.log
exit
创建开机自启动任务计划执行bat脚本
@echo off
schtasks /create /tn "Nginx_AutoStart" /tr "D:\JSPACS\install\nginx124\nginx启动.bat" /sc onstart /ru SYSTEM /f
echo [%date% %time%] 开机自启动任务已创建 >> D:\JSPACS\nginx.log
4 部署API程序
启动consul
consul.exe agent -server -ui -bootstrap -client 0.0.0.0 -bind 127.0.0.1 -data-dir D:/JSPACS/newCloudImage/apis/consul/ConsulData -http-port=4000
http://localhost:4000/ui/dc1/services

运行webgateapi
进入文件所在目录。打开appsettings.json文件修改配置
#### 修改和院内服务器nginx.conf 中的/reportApi 配置端口保持一致
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Urls": "http://*:20001"
}
接着打开ocelot.json文件修改参数

运行 EDCWebCoreV2.exe

三个文件夹都是修改对呀的数据库连接参数,注意标点符号

打开report文件夹,修改appsettings.json文件修改配置
ReadCloudReport配置文件(report)
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Urls": "http://*:5501",
"ServiceIntegration": {
"ServiceName": "ReadCloudReport",
"ServiceHost": "localhost",
"ServicePort": 5501,
"ConsulAddress": "http://localhost:4000",
"HealthCheckEndpoint": "/health",
"RetryCount": 3,
"CircuitBreakerThreshold": 5,
"LoadBalancer": "RoundRobin",
"ExceptionlessApiKey": "8SAvZCG2b3620ldQ7Bw6N9gwvtnzMKEerDMavTeW",
"ExceptionlessServerUrl": "https://api.exceptionless.io/"
},
"Exceptionless": {
"ExceptionlessApiKey": "8SAvZCG2b3620ldQ7Bw6N9gwvtnzMKEerDMavTeW",
"ExceptionlessServerUrl": "https://api.exceptionless.io/"
},
"AppSettings": {
"domainURL": "https://img.yi123.cc:10006/validate",
"domainURLForThirdPartReport": "https://img.yi123.cc:10006/validate2",
"domainURLForThirdPartImage": "https://img.yi123.cc:10006/viewer2", // pc 端地址格式 https://img.yi123.cc:10006/pc-viewer/viewer
"domainURLForThirdPartImage_PC": "",
"domainDownLoadImageURL": "https://www.dcstsoft.cn:12001/packimageZip",
##// --------------------------------------------------------
"UserPacsDB": "PACSDB",
"PACSDB": "W0zcoFOB56fR+F0dvWOhMExJcsOIp1z96nuRWDMvQTM7Ihtct245nTk22QQ3MuwbwwvO5jysJ2KirCTVNlHVrLaPPYJiG5eGu1VaJl+mUjs0ea/lkRvcDQ5ZxzueolNhGzNIEKraiuXXTS24VJmO15M0uC9gpvGMwL7Ynion7qwUD0fAUcmUL6WBHjKidq8j+zHWiKYg0FMh9bUCfYOe3A==",
"UserReportDB": "oracleReport",
"oracleReport": "W0zcoFOB56fR+F0dvWOhMExJcsOIp1z96nuRWDMvQTM7Ihtct245nTk22QQ3MuwbwwvO5jysJ2KirCTVNlHVrM/EBK6D2GF0lh2bzC8cj9UH+E2Fu7c1qRgc0SM5aZo03kY9zzvtmCu0wOez0gdq2tV9FKzAQDjeFiB4//87uegPOKqf013cFT83nQ7kXjl+",
##// --------------------------------------------------------
"svip": "ec6f3b823409f6e4062b5000a65a2de0",
"Cache": "", //"47.98.41.208:9100,password=MWWRedis1234%^&*,connectTimeout=1000,connectRetry=1,syncTimeout=1000",
//"使用身份证或手机号做验证" 1, "身份证号" 0,"手机号"
"USER_CARDID": "0",
//"jwt","验证相关",
//"token的有效时间","单位分钟"
"TimeStamp": "1000",
//"使用加密程序生成token" "验证的账号",
"tokenUser": "yXKSHtmDFK6KKGkfRblPPYO7rq0zxbs3lcbdjkZCu+I=",
//使用加密程序生成token","验证的密码
"tokenPwd": "KQzVvLgvubaUPHQxp/RnYf/L5QYGkXa5",
// MQ "消息队列相关相关-->" "<add",
"MQ_ProduceWEB": "http://127.0.0.1:10002/Api/Values",
// "医院名称-
"hospitalname": "杭州云影像医院",
// "医院个性化配置- 医院编码_配置参数
"0311_ZSYY_BannerTitle": "",
"0311_ZSYY_BannerSubTitle": "",
"0311_ZSYY_BannerSubTitle2": "",
"0311_ZSYY_userBannerLogoImage": "1",
"0311_ZSYY_showRegiionlInfo": "1",
"0311_ZSYY_showValueService": "1"
// 结束一个医院个性化配置
}
}
这里##// --------------------------------------------------------中间那一部分对应的是数据库加密连接,修改这一部分。加密后张贴进去即可。其他三个文件夹内的这个文件同理修改即可。
ReadPacsStudy配置文件(pacsstudy)
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Urls": "http://*:4401",
"ServiceIntegration": {
"ServiceName": "ReadPacsStudy",
"ServiceHost": "localhost",
"ServicePort": 4401,
"ConsulAddress": "http://localhost:4000",
"HealthCheckEndpoint": "/health",
"RetryCount": 3,
"CircuitBreakerThreshold": 5,
"LoadBalancer": "RoundRobin"//,
//"ExceptionlessApiKey": "8SAvZCG2b3620ldQ7Bw6N9gwvtnzMKEerDMavTeW",
//"ExceptionlessServerUrl": "https://api.exceptionless.io/"
},
//"Exceptionless": {
// "ExceptionlessApiKey": "8SAvZCG2b3620ldQ7Bw6N9gwvtnzMKEerDMavTeW",
// "ExceptionlessServerUrl": "https://api.exceptionless.io/"
//},
"AppSettings": {
"UserPacsDB": "PACSDB", // 使用的PACSdb 数据库名称
"PACSDB": "W0zcoFOB56fR+F0dvWOhMExJcsOIp1z96nuRWDMvQTM7Ihtct245nTk22QQ3MuwbwwvO5jysJ2KirCTVNlHVrLaPPYJiG5eGu1VaJl+mUjs0ea/lkRvcDQ5ZxzueolNhGzNIEKraiuXXTS24VJmO15M0uC9gpvGMwL7Ynion7qwUD0fAUcmUL6WBHjKidq8j+zHWiKYg0FMh9bUCfYOe3A==",
"UserReportDB": "oracleReport", // 使用的report db 数据库名称
"oracleReport": "W0zcoFOB56fR+F0dvWOhMExJcsOIp1z96nuRWDMvQTM7Ihtct245nTk22QQ3MuwbwwvO5jysJ2KirCTVNlHVrM/EBK6D2GF0lh2bzC8cj9UH+E2Fu7c1qRgc0SM5aZo03kY9zzvtmCu0wOez0gdq2tV9FKzAQDjeFiB4//87uegPOKqf013cFT83nQ7kXjl+",
"svip": "",
//"jwt","验证相关",
//"token的有效时间","单位分钟"
"TimeStamp": "1000",
//"使用加密程序生成token" "验证的账号",
"tokenUser": "yXKSHtmDFK6KKGkfRblPPYO7rq0zxbs3lcbdjkZCu+I=",
//使用加密程序生成token","验证的密码
"tokenPwd": "KQzVvLgvubaUPHQxp/RnYf/L5QYGkXa5",
// 给第三方系统调用的凭证授权码 每个项目按需生成
"project_code": "ec6f3b823409f6e4062b5000a65a2de0",
// 给第三方调用图像的地址 可和pacs 系统自用ip或端口分开,做一定负载均衡
"DomainURLForThirdPartImage": "http:127.0.0.1:8090/viewer2"
}
}
ReadPacsWadoV5配置文件(pacswado)
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Storage": {
"Path": "D:\\workdir\\2024\\newPACS\\develop\\EDCWebInterface\\NET8\\EDCWebCoreV2\\ReadPacsWadoV5\\testFile\\",
"RetentionDays": 7
},
"Urls": "http://*:6608",
"ServiceIntegration": {
"ServiceName": "ReadPacsWadoV5",
"ServiceHost": "localhost",
"ServicePort": 6608,
"ConsulAddress": "http://localhost:4000",
"HealthCheckEndpoint": "/health",
"RetryCount": 3,
"CircuitBreakerThreshold": 5,
"LoadBalancer": "RoundRobin" //,
//"ExceptionlessApiKey": "8SAvZCG2b3620ldQ7Bw6N9gwvtnzMKEerDMavTeW",
//"ExceptionlessServerUrl": "https://api.exceptionless.io/"
},
"AllowedHosts": "*",
"AppSettings": {
"loglevel": "debug", // debug,info,error,
"domainURL": "https://img.yi123.cc:10006/validate",
"domainURLForThirdPartReport": "https://img.yi123.cc:10006/validate2",
"domainURLForThirdPartImage": "https://img.yi123.cc:10006/viewer2", // pc 端地址格式 https://img.yi123.cc:10006/pc-viewer/viewer
"domainURLForThirdPartImage_PC": "",
"domainDownLoadImageURL": "https://www.dcstsoft.cn:12001/packimageZip",
"UserPacsDB": "PACSDB", // 使用的PACSdb 数据库名称
"PACSDB": "W0zcoFOB56fR+F0dvWOhMExJcsOIp1z96nuRWDMvQTM7Ihtct245nTk22QQ3MuwbwwvO5jysJ2KirCTVNlHVrLaPPYJiG5eGu1VaJl+mUjs0ea/lkRvcDQ5ZxzueolNhGzNIEKraiuXXTS24VJmO15M0uC9gpvGMwL7Ynion7qwUD0fAUcmUL6WBHjKidq8j+zHWiKYg0FMh9bUCfYOe3A==",
"UserReportDB": "oracleReport", // 使用的report db 数据库名称
"oracleReport": "W0zcoFOB56fR+F0dvWOhMExJcsOIp1z96nuRWDMvQTM7Ihtct245nTk22QQ3MuwbwwvO5jysJ2KirCTVNlHVrM/EBK6D2GF0lh2bzC8cj9UH+E2Fu7c1qRgc0SM5aZo03kY9zzvtmCu0wOez0gdq2tV9FKzAQDjeFiB4//87uegPOKqf013cFT83nQ7kXjl+",
"svip": "",
"Cache": "",
//"使用身份证或手机号做验证" 1, "身份证号" 0,"手机号"
"USER_CARDID": "0",
//"jwt","验证相关",
//"token的有效时间","单位分钟"
"TimeStamp": "10",
//"使用加密程序生成token" "验证的账号",
"tokenUser": "yXKSHtmDFK6KKGkfRblPPYO7rq0zxbs3lcbdjkZCu+I=",
//使用加密程序生成token","验证的密码
"tokenPwd": "KQzVvLgvubaUPHQxp/RnYf/L5QYGkXa5",
// MQ "消息队列相关相关-->" "<add",
"MQ_ProduceWEB": "http://127.0.0.1:10002/Api/Values",
// "医院名称-
"hospitalname": "杭州云影像医院",
// "医院个性化配置- 医院编码_配置参数
"0311_ZSYY_BannerTitle": "",
"0311_ZSYY_BannerSubTitle": "",
"0311_ZSYY_BannerSubTitle2": "",
"0311_ZSYY_userBannerLogoImage": "1",
"0311_ZSYY_showRegiionlInfo": "1",
"0311_ZSYY_showValueService": "1"
// 结束一个医院个性化配置
}
}
所有修改完成后启动,每个文件夹下的对应的exe程序

查看服务i服务启动情况。

测试Report配置文件是否修改正确连接数据库
浏览器中输入
http://localhost:20001/api/ReadCloudReport/CloudReport?id=401
101 测试链接ICPC库;
301 测试链接mysql类型 report库 (ihe_view_nreport)视图库
401 测试链接 oracle 类型 report库 ( ihe_view_nreport)视图库
404 测试链接 UserReportDB 指定的 类型 report库 ( ihe_view_nreport)视图库


测试pacsstudy配置文件是否修改正确连接数据库
浏览器中输入
http://localhost:20001/api/ReadPacsStudy/StudyList?id=1

测试pacswado配置文件是否修改正确连接数据库
浏览器中输入
http://localhost:20001/api/ReadPacsWado/health/id?id=501

5 集成测试步骤
1.根据院内数据 生成调用URL
##原文
http://IP:20000/validate?cyqbm=RIS&pid=1948937&caccno=11423612
##加密后
http://192.168.52.131:20000/validate?cyqbm=85a3c3649cb16fc1d74715324f59a391&pid=dc6624cc6b72c7c8295a81141397162d&caccno=1fc20f726a6982dd05a0f2783bb0ae07
这个连接在上面数据库拼接了,直接复制下来,到加密的web里面加密,加密后复制到浏览器调用。





这一步如果不出图像,查看如下日志

这里描述的是spectra数据库的ihe_v_instance视图的cache_path字段,看看是否有缓存目录
下面将加密地址张贴在主机上,ip端口修改为前置机的nginx的查看是否正常调取。



以上就是安装部署完成。
公众号的后期更新
var code = "59ae9b82-6ca2-445d-a68b-2af54ec0e791"


浙公网安备 33010602011771号