九枢云影像安装部署手册

九枢云影像安装部署手册

##基于院内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

院内安装(配置中红色部分修改为绿色部分)

  1. 将云影像文件夹中的report、view文件夹拷贝nginx 程序目录下/html 文件夹下 ;

在这里插入图片描述

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

配置1在这里插入图片描述

配置修改

##此处的地址根据自己的作修改
		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

在这里插入图片描述
浏览器输入地址查看consul是否启动成功

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"
posted @ 2025-08-01 17:11  任福  阅读(3)  评论(0)    收藏  举报  来源