增加影像报告功能

This commit is contained in:
lxd 2024-08-04 18:23:33 +08:00
parent 5da0aef036
commit 0b18e1d38a
19 changed files with 6757 additions and 56 deletions

2018
public/dicom/css/bootstrap-icons.css vendored Normal file

File diff suppressed because it is too large Load Diff

6
public/dicom/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,539 @@
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,235 @@
@font-face {
font-family: "iconfont"; /* Project id 2966544 */
src: url('iconfont.woff2?t=1722174546445') format('woff2'),
url('iconfont.woff?t=1722174546445') format('woff'),
url('iconfont.ttf?t=1722174546445') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-fangxiangjiantou-shang:before {
content: "\e60d";
}
.icon-fangxiangjiantou-xia:before {
content: "\e610";
}
.icon-iconback:before {
content: "\e60c";
}
.icon-xiaoliansmiley40:before {
content: "\e772";
}
.icon-wujiaoxing_full:before {
content: "\e60b";
}
.icon-zhongcao:before {
content: "\e64e";
}
.icon-fenxiang2:before {
content: "\e625";
}
.icon-sanjiaoxing:before {
content: "\e6bd";
}
.icon-weixin:before {
content: "\e60a";
}
.icon-xiazai:before {
content: "\e63b";
}
.icon-iconset0174:before {
content: "\e649";
}
.icon-fenxiang1:before {
content: "\e609";
}
.icon-laba:before {
content: "\e607";
}
.icon-jingyin:before {
content: "\e630";
}
.icon-duihao:before {
content: "\eaf1";
}
.icon-yinle:before {
content: "\e606";
}
.icon-aixin_shixin:before {
content: "\eca2";
}
.icon-naozhong:before {
content: "\e890";
}
.icon-shijian_o:before {
content: "\ebb1";
}
.icon-shijian:before {
content: "\e64d";
}
.icon-bianji:before {
content: "\e604";
}
.icon-shanchu:before {
content: "\e605";
}
.icon-xiajiantou:before {
content: "\e6cc";
}
.icon-zhongbiao:before {
content: "\e60e";
}
.icon-bofang:before {
content: "\e624";
}
.icon-zanting1:before {
content: "\e67a";
}
.icon-xiangshangjiantou:before {
content: "\e65d";
}
.icon-tuichu1:before {
content: "\e65e";
}
.icon-tuichu:before {
content: "\e639";
}
.icon-wj-wjxg:before {
content: "\e770";
}
.icon-aixin:before {
content: "\eca1";
}
.icon-gouwuchexuanzhong:before {
content: "\e603";
}
.icon-iconfontscan:before {
content: "\e601";
}
.icon-kaiguan-kai:before {
content: "\e608";
}
.icon-kaiguan-guan:before {
content: "\e60f";
}
.icon-xiaoyuhao:before {
content: "\e628";
}
.icon-gonggaoxiaolaba:before {
content: "\e6db";
}
.icon-guanbi:before {
content: "\eaf2";
}
.icon-24gf-pause2:before {
content: "\ea81";
}
.icon-yunhang:before {
content: "\ec61";
}
.icon-zanting:before {
content: "\e668";
}
.icon-shangyishou:before {
content: "\e63c";
}
.icon-xiayishou:before {
content: "\e63e";
}
.icon-31shoucang:before {
content: "\e600";
}
.icon-shoucang:before {
content: "\e8c2";
}
.icon-shengyin:before {
content: "\e62a";
}
.icon-fenxiang:before {
content: "\eb24";
}
.icon-shipinbofangshibofang:before {
content: "\e62b";
}
.icon-bofangsanjiaoxing:before {
content: "\e769";
}
.icon-xiangzuosanjiaoxing:before {
content: "\e710";
}
.icon-yousanjiaoxing:before {
content: "\e644";
}
.icon-zuosanjiaoxing:before {
content: "\e645";
}
.icon-arrow-right:before {
content: "\e665";
}
.icon-all:before {
content: "\e6ef";
}
.icon-aichegujiabeifen7:before {
content: "\e602";
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,394 @@
{
"id": "2966544",
"name": "music",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "35441702",
"name": "方向箭头-上",
"font_class": "fangxiangjiantou-shang",
"unicode": "e60d",
"unicode_decimal": 58893
},
{
"icon_id": "35441706",
"name": "方向箭头-下",
"font_class": "fangxiangjiantou-xia",
"unicode": "e610",
"unicode_decimal": 58896
},
{
"icon_id": "521601",
"name": "icon_back",
"font_class": "iconback",
"unicode": "e60c",
"unicode_decimal": 58892
},
{
"icon_id": "609892",
"name": "笑脸",
"font_class": "xiaoliansmiley40",
"unicode": "e772",
"unicode_decimal": 59250
},
{
"icon_id": "18968961",
"name": "五角星_full",
"font_class": "wujiaoxing_full",
"unicode": "e60b",
"unicode_decimal": 58891
},
{
"icon_id": "13547754",
"name": "种草",
"font_class": "zhongcao",
"unicode": "e64e",
"unicode_decimal": 58958
},
{
"icon_id": "2674471",
"name": "分享",
"font_class": "fenxiang2",
"unicode": "e625",
"unicode_decimal": 58917
},
{
"icon_id": "6270980",
"name": "三角形",
"font_class": "sanjiaoxing",
"unicode": "e6bd",
"unicode_decimal": 59069
},
{
"icon_id": "77156",
"name": "微信",
"font_class": "weixin",
"unicode": "e60a",
"unicode_decimal": 58890
},
{
"icon_id": "573733",
"name": "下载",
"font_class": "xiazai",
"unicode": "e63b",
"unicode_decimal": 58939
},
{
"icon_id": "554132",
"name": "调节器",
"font_class": "iconset0174",
"unicode": "e649",
"unicode_decimal": 58953
},
{
"icon_id": "68268",
"name": "分享",
"font_class": "fenxiang1",
"unicode": "e609",
"unicode_decimal": 58889
},
{
"icon_id": "201560",
"name": "喇叭",
"font_class": "laba",
"unicode": "e607",
"unicode_decimal": 58887
},
{
"icon_id": "6582332",
"name": "静音",
"font_class": "jingyin",
"unicode": "e630",
"unicode_decimal": 58928
},
{
"icon_id": "5387519",
"name": "对号",
"font_class": "duihao",
"unicode": "eaf1",
"unicode_decimal": 60145
},
{
"icon_id": "7417094",
"name": "音乐",
"font_class": "yinle",
"unicode": "e606",
"unicode_decimal": 58886
},
{
"icon_id": "6775641",
"name": "爱心 _实心",
"font_class": "aixin_shixin",
"unicode": "eca2",
"unicode_decimal": 60578
},
{
"icon_id": "2076264",
"name": "闹钟",
"font_class": "naozhong",
"unicode": "e890",
"unicode_decimal": 59536
},
{
"icon_id": "5388001",
"name": "时间_o",
"font_class": "shijian_o",
"unicode": "ebb1",
"unicode_decimal": 60337
},
{
"icon_id": "629339",
"name": "时间",
"font_class": "shijian",
"unicode": "e64d",
"unicode_decimal": 58957
},
{
"icon_id": "1264",
"name": "编辑",
"font_class": "bianji",
"unicode": "e604",
"unicode_decimal": 58884
},
{
"icon_id": "17830623",
"name": "删除",
"font_class": "shanchu",
"unicode": "e605",
"unicode_decimal": 58885
},
{
"icon_id": "278744",
"name": "下箭头",
"font_class": "xiajiantou",
"unicode": "e6cc",
"unicode_decimal": 59084
},
{
"icon_id": "15775480",
"name": "钟表",
"font_class": "zhongbiao",
"unicode": "e60e",
"unicode_decimal": 58894
},
{
"icon_id": "2674474",
"name": "播放",
"font_class": "bofang",
"unicode": "e624",
"unicode_decimal": 58916
},
{
"icon_id": "8236094",
"name": "暂停",
"font_class": "zanting1",
"unicode": "e67a",
"unicode_decimal": 59002
},
{
"icon_id": "630085",
"name": "向上箭头",
"font_class": "xiangshangjiantou",
"unicode": "e65d",
"unicode_decimal": 58973
},
{
"icon_id": "1346232",
"name": "退出",
"font_class": "tuichu1",
"unicode": "e65e",
"unicode_decimal": 58974
},
{
"icon_id": "774409",
"name": "退出",
"font_class": "tuichu",
"unicode": "e639",
"unicode_decimal": 58937
},
{
"icon_id": "6834860",
"name": "文件-文件修改",
"font_class": "wj-wjxg",
"unicode": "e770",
"unicode_decimal": 59248
},
{
"icon_id": "6775644",
"name": "爱心",
"font_class": "aixin",
"unicode": "eca1",
"unicode_decimal": 60577
},
{
"icon_id": "88228",
"name": "购物车-选中",
"font_class": "gouwuchexuanzhong",
"unicode": "e603",
"unicode_decimal": 58883
},
{
"icon_id": "162869",
"name": "扫码",
"font_class": "iconfontscan",
"unicode": "e601",
"unicode_decimal": 58881
},
{
"icon_id": "4925462",
"name": "开关-开",
"font_class": "kaiguan-kai",
"unicode": "e608",
"unicode_decimal": 58888
},
{
"icon_id": "4925963",
"name": "开关-关",
"font_class": "kaiguan-guan",
"unicode": "e60f",
"unicode_decimal": 58895
},
{
"icon_id": "4598262",
"name": "小于号",
"font_class": "xiaoyuhao",
"unicode": "e628",
"unicode_decimal": 58920
},
{
"icon_id": "140164",
"name": "公告小喇叭",
"font_class": "gonggaoxiaolaba",
"unicode": "e6db",
"unicode_decimal": 59099
},
{
"icon_id": "5387522",
"name": "关闭",
"font_class": "guanbi",
"unicode": "eaf2",
"unicode_decimal": 60146
},
{
"icon_id": "7594152",
"name": "24gf-pause2",
"font_class": "24gf-pause2",
"unicode": "ea81",
"unicode_decimal": 60033
},
{
"icon_id": "5961323",
"name": "运行",
"font_class": "yunhang",
"unicode": "ec61",
"unicode_decimal": 60513
},
{
"icon_id": "7450658",
"name": "暂停",
"font_class": "zanting",
"unicode": "e668",
"unicode_decimal": 58984
},
{
"icon_id": "8341784",
"name": "上一首",
"font_class": "shangyishou",
"unicode": "e63c",
"unicode_decimal": 58940
},
{
"icon_id": "8341786",
"name": "下一首",
"font_class": "xiayishou",
"unicode": "e63e",
"unicode_decimal": 58942
},
{
"icon_id": "200845",
"name": "3.1收藏",
"font_class": "31shoucang",
"unicode": "e600",
"unicode_decimal": 58880
},
{
"icon_id": "1727441",
"name": "213收藏",
"font_class": "shoucang",
"unicode": "e8c2",
"unicode_decimal": 59586
},
{
"icon_id": "14480279",
"name": "声音",
"font_class": "shengyin",
"unicode": "e62a",
"unicode_decimal": 58922
},
{
"icon_id": "5387651",
"name": "分享",
"font_class": "fenxiang",
"unicode": "eb24",
"unicode_decimal": 60196
},
{
"icon_id": "7060117",
"name": "视频播放时播放",
"font_class": "shipinbofangshibofang",
"unicode": "e62b",
"unicode_decimal": 58923
},
{
"icon_id": "688059",
"name": "播放 三角形",
"font_class": "bofangsanjiaoxing",
"unicode": "e769",
"unicode_decimal": 59241
},
{
"icon_id": "6874517",
"name": "向左三角形",
"font_class": "xiangzuosanjiaoxing",
"unicode": "e710",
"unicode_decimal": 59152
},
{
"icon_id": "15369",
"name": "右三角形",
"font_class": "yousanjiaoxing",
"unicode": "e644",
"unicode_decimal": 58948
},
{
"icon_id": "15370",
"name": "左三角形",
"font_class": "zuosanjiaoxing",
"unicode": "e645",
"unicode_decimal": 58949
},
{
"icon_id": "15838431",
"name": "arrow-right",
"font_class": "arrow-right",
"unicode": "e665",
"unicode_decimal": 58981
},
{
"icon_id": "11474219",
"name": "all",
"font_class": "all",
"unicode": "e6ef",
"unicode_decimal": 59119
},
{
"icon_id": "21497123",
"name": "全部",
"font_class": "aichegujiabeifen7",
"unicode": "e602",
"unicode_decimal": 58882
}
]
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

315
public/dicom/css/index.css Normal file
View File

@ -0,0 +1,315 @@
body {
background: #e8ebf3;
font-family: Helvetica Neue,Tahoma,Arial,PingFangSC-Regular,Hiragino Sans GB,Microsoft Yahei,sans-serif;
padding: 0;
margin: 0;
}
.errormsg {
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 0;
margin: 0;
text-align: center;
color: #00998c;
font-size: 1.2em;
}
.ic_scan {
width: 96px;
height: 96px;
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNjA2NDU4MDIwMTcyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwNDYgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjEwODU2IiBkYXRhLXNwbS1hbmNob3ItaWQ9ImEzMTN4Ljc3ODEwNjkuMC5pMyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI2NS4zNzUiIGhlaWdodD0iNjQiPjxkZWZzPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTIyLjc1NTU1NiAzODYuODQ0NDQ0Yy0xMS4zNzc3NzggMC4xODIwNDQtMjIuNzU1NTU2LTguNjY5ODY3LTIyLjc1NTU1Ni0xOS4xNjAxNzdWMTIwLjAzNTU1NkMwIDUzLjcwMzExMSA1NC4yMjY0ODkgMCAxMjAuOTkxMjg5IDBIMzU1LjY2OTMzM2MxMC40Njc1NTYgMCAxOS43OTczMzMgMTEuMzc3Nzc4IDE5Ljc5NzMzNCAyMi43NTU1NTZzLTkuMzI5Nzc4IDIyLjc1NTU1Ni0xOS43OTczMzQgMjIuNzU1NTU1SDEyMC45OTEyODlDNzUuMDkzMzMzIDQ1LjUxMTExMSA0NS41MTExMTEgNzQuNzA2NDg5IDQ1LjUxMTExMSAxMjAuMDM1NTU2djI0Ny42NDg3MTFjMCAxMC40Njc1NTYtMTEuMzc3Nzc4IDE4Ljk3ODEzMy0yMi43NTU1NTUgMTkuMTYwMTc3ek0xMDEyLjYyMjIyMiAzODYuODQ0NDQ0YzExLjM3Nzc3OCAwLjE4MjA0NCAyMi43NTU1NTYtOC42Njk4NjcgMjIuNzU1NTU2LTE5LjE2MDE3N1YxMjAuMDM1NTU2QzEwMzUuMzc3Nzc4IDUzLjcwMzExMSA5ODEuMTUxMjg5IDAgOTE0LjM4NjQ4OSAwSDY3OS43MDg0NDRjLTEwLjQ2NzU1NiAwLTE5Ljc5NzMzMyAxMS4zNzc3NzgtMTkuNzk3MzMzIDIyLjc1NTU1NnM5LjMyOTc3OCAyMi43NTU1NTYgMTkuNzk3MzMzIDIyLjc1NTU1NWgyMzQuNjc4MDQ1Qzk2MC4yODQ0NDQgNDUuNTExMTExIDk4OS44NjY2NjcgNzQuNzA2NDg5IDk4OS44NjY2NjcgMTIwLjAzNTU1NnYyNDcuNjQ4NzExYzAgMTAuNDY3NTU2IDExLjM3Nzc3OCAxOC45NzgxMzMgMjIuNzU1NTU1IDE5LjE2MDE3N3pNMTAxMi42MjIyMjIgNjM3LjE1NTU1NmMxMS4zNzc3NzgtMC4xODIwNDQgMjIuNzU1NTU2IDguNjkyNjIyIDIyLjc1NTU1NiAxOS4xNjAxNzd2MjQ3LjY0ODcxMUMxMDM1LjM3Nzc3OCA5NzAuMjk2ODg5IDk4MS4xNTEyODkgMTAyNCA5MTQuMzg2NDg5IDEwMjRINjc5LjcwODQ0NGMtMTAuNDY3NTU2IDAtMTkuNzk3MzMzLTExLjM3Nzc3OC0xOS43OTczMzMtMjIuNzU1NTU2czkuMzI5Nzc4LTIyLjc1NTU1NiAxOS43OTczMzMtMjIuNzU1NTU1aDIzNC42NzgwNDVjNDUuODk3OTU2IDAgNzUuNDgwMTc4LTI5LjE5NTM3OCA3NS40ODAxNzgtNzQuNTI0NDQ1VjY1Ni4zMTU3MzNjMC0xMC40Njc1NTYgMTEuMzc3Nzc4LTE4Ljk3ODEzMyAyMi43NTU1NTUtMTkuMTYwMTc3ek0yMi43NTU1NTYgNjM3LjE1NTU1NmMtMTEuMzc3Nzc4LTAuMTgyMDQ0LTIyLjc1NTU1NiA4LjY5MjYyMi0yMi43NTU1NTYgMTkuMTYwMTc3djI0Ny42NDg3MTFDMCA5NzAuMjk2ODg5IDU0LjIyNjQ4OSAxMDI0IDEyMC45OTEyODkgMTAyNEgzNTUuNjY5MzMzYzEwLjQ2NzU1NiAwIDE5Ljc5NzMzMy0xMS4zNzc3NzggMTkuNzk3MzM0LTIyLjc1NTU1NnMtOS4zMjk3NzgtMjIuNzU1NTU2LTE5Ljc5NzMzNC0yMi43NTU1NTVIMTIwLjk5MTI4OUM3NS4wOTMzMzMgOTc4LjQ4ODg4OSA0NS41MTExMTEgOTQ5LjI5MzUxMSA0NS41MTExMTEgOTAzLjk2NDQ0NFY2NTYuMzE1NzMzYzAtMTAuNDY3NTU2LTExLjM3Nzc3OC0xOC45NzgxMzMtMjIuNzU1NTU1LTE5LjE2MDE3N3oiIGZpbGw9IiMwMDk5OGMiIHAtaWQ9IjEwODU3Ij48L3BhdGg+PHBhdGggZD0iTTQ2Ny4xNzE1NTYgMTgyLjA0NDQ0NGMxNS43Njk2IDAgMjguNTM1NDY3IDEyLjc2NTg2NyAyOC41MzU0NjYgMjguNTEyNzEydjI1Ni42MzcxNTVjMCAxNS43NDY4NDQtMTIuNzY1ODY3IDI4LjUxMjcxMS0yOC41MTI3MTEgMjguNTEyNzExSDIxMC41NTcxNTZBMjguNTEyNzExIDI4LjUxMjcxMSAwIDAgMSAxODIuMDQ0NDQ0IDQ2Ny4xNzE1NTZWMjEwLjU1NzE1NkMxODIuMDQ0NDQ0IDE5NC44MTAzMTEgMTk0LjgxMDMxMSAxODIuMDQ0NDQ0IDIxMC41NTcxNTYgMTgyLjA0NDQ0NGgyNTYuNjM3MTU1eiBtMC42NTk5MTEgMjg1Ljc4NzAyM1YyMDkuOTJIMjA5LjkyVjQ2Ny44NTQyMjJINDY3Ljg1NDIyMnpNNDY3LjE3MTU1NiA1NTEuMDQ4NTMzYzE1Ljc2OTYgMCAyOC41MzU0NjcgMTIuNzY1ODY3IDI4LjUzNTQ2NiAyOC41MTI3MTF2MjU2LjYzNzE1NmMwIDE1Ljc0Njg0NC0xMi43NjU4NjcgMjguNTEyNzExLTI4LjUxMjcxMSAyOC41MTI3MTFIMjEwLjU1NzE1NkEyOC41MTI3MTEgMjguNTEyNzExIDAgMCAxIDE4Mi4wNDQ0NDQgODM2LjE5ODRWNTc5LjU2MTI0NGMwLTE1Ljc0Njg0NCAxMi43NjU4NjctMjguNTEyNzExIDI4LjUxMjcxMi0yOC41MTI3MTFoMjU2LjYzNzE1NXogbTAuNjU5OTExIDI4NS43ODcwMjNWNTc4LjkwMTMzM0gyMDkuOTJ2MjU3LjkxMTQ2N0g0NjcuODU0MjIyek04MzYuMTk4NCAxODIuMDQ0NDQ0Qzg1MS45NDUyNDQgMTgyLjA0NDQ0NCA4NjQuNzExMTExIDE5NC44MTAzMTEgODY0LjcxMTExMSAyMTAuNTU3MTU2djI1Ni42MzcxNTVjMCAxNS43NDY4NDQtMTIuNzY1ODY3IDI4LjUxMjcxMS0yOC41MTI3MTEgMjguNTEyNzExSDU3OS41NjEyNDRhMjguNTEyNzExIDI4LjUxMjcxMSAwIDAgMS0yOC41MTI3MTEtMjguNTEyNzExVjIxMC41NTcxNTZjMC0xNS43NDY4NDQgMTIuNzY1ODY3LTI4LjUxMjcxMSAyOC41MTI3MTEtMjguNTEyNzEyaDI1Ni42MzcxNTZ6IG0wLjYzNzE1NiAyODUuNzg3MDIzVjIwOS45Mkg1NzguOTAxMzMzVjQ2Ny44NTQyMjJoMjU3LjkxMTQ2N3oiIGZpbGw9IiMwMDk5OGMiIHAtaWQ9IjEwODU4Ij48L3BhdGg+PHBhdGggZD0iTTI5Mi43NTAyMjIgMjkyLjc1MDIyMmg5Mi4yNTEwMjJ2OTIuMjUxMDIyaC05Mi4yNTEwMjJ6TTI5Mi43NTAyMjIgNjYxLjc1NDMxMWg5Mi4yNTEwMjJ2OTIuMjUxMDIyaC05Mi4yNTEwMjJ6TTY2MS43NTQzMTEgMjkyLjc1MDIyMmg5Mi4yNTEwMjJ2OTIuMjUxMDIyaC05Mi4yNTEwMjJ6TTc3Mi40NjAwODkgNTUxLjA0ODUzM2g3My43OTYyNjd2NzMuNzk2MjY3aC03My43OTYyNjd6TTc2OC43NzM2ODkgNzY4Ljc3MzY4OWgtNTEuNjU1MTExdjc3LjQ4MjY2N2gxMjkuMTM3Nzc4di0xMjkuMTM3Nzc4aC03Ny40ODI2Njd6TTU1MS4wNDg1MzMgNzcyLjQ2MDA4OWg3My43OTYyNjd2NzMuNzk2MjY3aC03My43OTYyNjd6TTU1MS4wNDg1MzMgNTUxLjA0ODUzM2g3My43OTYyNjd2NzMuNzk2MjY3aC03My43OTYyNjd6IiBmaWxsPSIjMDA5OThjIiBwLWlkPSIxMDg1OSI+PC9wYXRoPjxwYXRoIGQ9Ik02MjQuODY3NTU2IDYyNC44Njc1NTZoOTIuMjUxMDIydjE0Ny41OTI1MzNoLTkyLjI3Mzc3OHoiIGZpbGw9IiMwMDk5OGMiIHAtaWQ9IjEwODYwIj48L3BhdGg+PC9zdmc+') no-repeat center center;
background-size: 96px;
margin-bottom: 1em;
}
.container {
height: 100%;
display: flex;
flex-direction: column;
}
.top {
padding-top: 1.5em;
padding-bottom: 2.5em;
background: #ea7e1d;
color: #fff;
display: flex;
flex-direction: column;
justify-content: center;
}
.title {
width: 100%;
text-align: center;
font-size: 1.3em;
font-weight: bold;
}
.hospital_name, .copyright {
white-space: nowrap;
display: block;
overflow: hidden;
width: 85%;
margin: 0 auto;
}
.title1 {
width: 100%;
text-align: center;
font-size: 0.9em;
font-weight: bold;
margin-top: 0.5em;
}
.main {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
background: #e8ebf3;
border-top-left-radius: 1.2em;
border-top-right-radius: 1.2em;
position: relative;
top: -1em;
}
.top_description {
position: absolute;
top: 2em;
font-size: 0.8em;
text-align: center;
width: 100%;
color: #d15f27;
}
.top_description .row {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 3px 0;
}
.ic_alert {
width: 24px;
height: 24px;
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNjA1NTk3NzYyMjQzIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI4NDUiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTk2MS4wMDg2NCA3MTIuNDI3NTJhNTMzNzguOTM4ODggNTMzNzguOTM4ODggMCAwIDEtMzAwLjMzOTItNTMwLjM1MDA4QzU2MS41NzE4NCA0LjcxNTUyIDQ2Mi40NDg2NCA0LjcxNTUyIDM2My4zNDU5MiAxODIuMDc3NDRhNTQyNDUuMDI3ODQgNTQyNDUuMDI3ODQgMCAwIDEtMzAwLjM1NDU2IDUzMC4zNTAwOGMtMTAxLjEyIDE3Ni4xOTQ1Ni01MS41ODQgMjYzLjY2NDY0IDE0OC42NzQ1NiAyNjIuNDgxOTIgMjAwLjIyMjcyLTEuMTY3MzYgNDAwLjQ2NTkyLTEuMTY3MzYgNjAwLjY2ODE2IDAgMjAwLjIyNzg0IDEuMTk4MDggMjQ5LjgwOTkyLTg2LjI4MjI0IDE0OC42NzQ1Ni0yNjIuNDgxOTJ6IG0tNDAyLjcxODcyLTM5MC41MjI4OGwtMTMuNzAxMTIgMzY1LjMyNzM2SDQ4MS41MDUyOGwtMTMuNzQ3Mi0zNjUuMzI3MzZoOTAuNTMxODR6IG0tNDYuNjQzMiA1MzUuMjQ0OGMtMzEuNTM0MDggMC01NC4xOTAwOC0yNi4xMjczNi01NC4xOTAwOC01Ni40MDE5MiAwLTMwLjk3NiAyNC4wMzMyOC01NS43MTA3MiA1NC4xOTAwOC01NS43MTA3MiAzMC4xNzcyOCAwIDU0Ljg2MDggMjQuNzUwMDggNTQuODYwOCA1NS43MTA3MiAwIDMxLjY1MTg0LTI0LjY4MzUyIDU2LjQwMTkyLTU0Ljg2MDggNTYuNDAxOTJ6IiBmaWxsPSIjZTA1NzA0IiBwLWlkPSIyODQ2Ij48L3BhdGg+PC9zdmc+') no-repeat center center;
background-size: 24px;
}
.ic_ok {
width: 24px;
height: 24px;
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNjA2ODg4NTQ4NjU5IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjMxNjAiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTUxMiA1MTJtLTQ0OCAwYTQ0OCA0NDggMCAxIDAgODk2IDAgNDQ4IDQ0OCAwIDEgMC04OTYgMFoiIGZpbGw9IiM0Q0FGNTAiIHAtaWQ9IjMxNjEiPjwvcGF0aD48cGF0aCBkPSJNNzM4LjEzMzMzMyAzMTEuNDY2NjY3TDQ0OCA2MDEuNmwtMTE5LjQ2NjY2Ny0xMTkuNDY2NjY3LTU5LjczMzMzMyA1OS43MzMzMzQgMTc5LjIgMTc5LjIgMzQ5Ljg2NjY2Ny0zNDkuODY2NjY3eiIgZmlsbD0iI0NDRkY5MCIgcC1pZD0iMzE2MiI+PC9wYXRoPjwvc3ZnPg==') no-repeat center center;
background-size: 24px;
}
.top_description .row span {
margin-bottom: 4px;
line-height: 150%;
}
.top_description.ok {
color: #02934e;
}
.bodypart-list {
text-align: center;
font-size: 1em;
font-weight: 700;
color: #00998c;
margin-bottom: 2em;
}
.btn1, .btn2, .btn3, .btn4 {
padding: 0.6em 0;
font-size: 1.1em;
width: 80%;
margin: 0 10%;
font-weight: bold;
text-align: center;
border-radius: 0.5em;
color: #fff;
margin-top: 1em;
}
.btn1 {
background-color: #02934e;
margin-top: 4em;
}
.btn1:active {
background-color: #02532c;
}
.btn2 {
background-color: #00a99b;
}
.btn2:active {
background-color: #006e65;
}
.btn3 {
background-color: #0067a9;
}
.btn3:active {
background-color: #004d7e;
}
.btn4 {
background-color: #d15f27;
}
.btn4:active {
background-color: #853a15;
}
.disabled {
background-color: #bebebe;
}
.bottom {
width: 100%;
margin: 0 auto;
bottom: 0;
text-align: center;
font-size: 0.7em;
margin-bottom: 2em;
color: #696969;
}
.container_dialog {
overflow: auto;
position: absolute;
top: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
min-height: 100%;
}
.container_dialog.hide {
display: none;
}
.container_dialog.show {
display: flex;
}
.dialog_overlay {
width: 100%;
height: 100%;
background: #000000;
opacity: .5;
position: absolute;
transition-delay: .15s;
}
.dialog {
z-index: 1;
width: 65%;
background: #e8ebf3;
border-radius: 1em;
transition-timing-function: cubic-bezier(.54,1.12,.38,1.11);
transition-duration: .3s;
transition-delay: 0;
transition-property: opacity,transform;
}
.dialog.show {
opacity: 1;
transform: scale(1);
}
.dialog.hide {
transform: scale(.5);
opacity: 0;
}
.dialog_content {
padding: 1.3em;
text-align: center;
font-weight: bold;
font-size: 1em;
color: #313131;
}
.dialog_button {
border-top: 1px solid #ccc;
padding: 0.8em 0;
font-size: 1em;
text-align: center;
font-weight: bold;
color: #00998c;
}
.dialog_button:active {
background-color: #e7e7e7;
border-radius: 0 0 1em 1em;
}
.phone-button {
}
.input-phone {
flex-grow: 1;
margin-right: 5px;
}
.phone-div {
margin-top: 15px;
display: flex;
flex-direction: row;
}
.close-div {
display: flex;
flex-direction: row-reverse
}
.modal {
display: none; /* Òþ²Øµ¯³ö¿ò */
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.5); /* °ë͸Ã÷±³¾° */
}
.modal-content {
background-color: #fff;
margin: 15% auto;
padding: 15px;
border: 1px solid #888;
width: 80%;
display: flex;
flex-direction: column;
border-radius: 5px;
}
.close {
color: #aaa;
float: right;
font-size: 18px;
font-weight: bold;
}
.close:hover,
.close:focus {
color: black;
text-decoration: none;
cursor: pointer;
}
#zhuanjia-div {
display: none;
}

View File

@ -0,0 +1,342 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>胶片预览</title>
<script src="https://unpkg.com/hammerjs@2.0.8/hammer.js"></script>
<script src="https://unpkg.com/cornerstone-core@2.6.1/dist/cornerstone.js"></script>
<script src="https://unpkg.com/cornerstone-math@0.1.10/dist/cornerstoneMath.min.js"></script>
<script src="https://unpkg.com/cornerstone-wado-image-loader@4.1.3/dist/cornerstoneWADOImageLoader.bundle.min.js"></script>
<script src="https://unpkg.com/cornerstone-web-image-loader@2.1.1/dist/cornerstoneWebImageLoader.min.js"></script>
<script src="https://unpkg.com/cornerstone-tools@6.0.7/dist/cornerstoneTools.js"></script>
<script src="https://unpkg.com/dicom-parser@1.8.13/dist/dicomParser.min.js"></script>
<script src="http://code.jquery.com/jquery-1.12.2.min.js"></script>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
<script src="./js/dicomViewPc.js"></script>
<link rel="stylesheet" href="./css/iconfont/iconfont.css">
<style>
.info {
position: relative;
left: 0;
top: 0;
font-size: 20px;
display: none;
width: 100px;
height: 100px;
border: 1px solid red;
z-index: 100;
color: white;
margin-top: -100px;
}
/***/
body {
margin: 0;
height: 100vh;
padding: 0px;
}
#app {
height: 100%;
width: 100%;
}
#container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
#top-menu {
background-color: black;
/*height: 180px;
display: flex;
flex-direction: row;*/
border: 0px solid red;
overflow-x: hidden;
overflow-y: hidden;
}
#body-part {
width: 100%;
display: flex;
flex-direction: row;
flex-grow: 1;
}
#dicom-continer {
display: flex;
flex-direction: column;
height: 100%;
flex-grow: 1;
}
#dicom-list {
background-color: black;
width: 150px;
height: 100%;
display: flex;
flex-direction: column;
}
.btn {
margin: 5px 5px 5px 0;
}
/* #dicomImage {
flex-grow:1;
height: 100%;
}
#dicomImage1 {
flex-grow: 1;
height: 100%;
}*/
.series_img {
border: 0px solid green;
}
.series_img_active {
border: 1px solid green;
}
.border-red {
border: 1px solid red;
}
.left-top {
position: absolute;
top: 0px;
right: 0px;
text-align: right;
width: 100px;
height: 100px;
}
.left-bottom {
position: relative;
left: 0;
bottom: 0;
width: 100px;
height: 100px;
}
.right-top {
position: relative;
right: 0;
top: 0;
width: 100px;
height: 100px;
}
.right-bottom {
position: relative;
right: 0;
bottom: 0;
width: 100px;
height: 100px;
}
.cornerstone-tool-active {
stroke: #FF0000 !important; /* 红色 */
}
.dicom-img-box {
flex-grow: 1;
width: 0;
height: 100%;
margin: 0 1px 0 1px;
display: flex;
flex-direction: row;
align-items: center;
background-color: black;
border: 1px solid white;
position:relative;
}
.dicom-img-box-active {
flex-grow: 1;
width: 0;
height: 100%;
margin: 0 1px 0 1px;
border: 1px solid red;
display: flex;
flex-direction: row;
align-items: center;
background-color: black;
position: relative;
}
.dicom-img {
flex-grow: 1;
width: 0;
height: 100%;
margin: 0 1px 0 1px;
}
.dicom-img-active {
flex-grow: 1;
width: 0;
height: 100%;
border: 1px solid red;
}
/*滚动条*/
.slider-container {
height: 100%;
width: 3rem;
background-color: black;
display: flex;
flex-direction: column;
justify-content: center;
}
/*滑块样式-开始*/
/* range主体样式 */
.lcmf-range {
-webkit-appearance: none;
position: relative;
appearance: none;
height: 0.5rem;
/* outline设置为零防止点到空白区域时会出现边框影响美观性问题 */
outline: 0;
border: 0;
/* 背景色设置为渐变色,有兼容性问题谨慎使用 */
/*background: linear-gradient(to right,rgb(238,222,217),rgb(200,66,67));*/
border-radius: 0 0.5rem 0.5rem 0;
}
.lcmf-range-date {
/* 顺时针旋转90度作为y轴 */
transform: rotate(90deg);
width: 20rem !important;
margin-left: -8.5rem;
/*background: linear-gradient(to right,rgb(200,66,67),rgb(238,222,217));*/
background: linear-gradient(to right,rgb(200,66,67),rgb(200,66,67));
}
/* 滑动块样式 */
.lcmf-range::-webkit-slider-thumb {
appearance: none;
-webkit-appearance: none;
height: 2rem;
width: 2rem;
border-radius: 0rem;
background-color: white;
border: 0.15rem solid rgb(245,95,95);
}
/*滑块样式-结束*/
.icon-shang {
color: red;
height: 12rem;
display: flex;
flex-direction: column;
align-items: center;
}
.icon-xia:hover, .icon-shang:hover {
color: white;
}
.icon-xia {
color: red;
height: 12rem;
display: flex;
flex-direction: column-reverse;
align-items: center;
}
.flex-row {
display: flex;
flex-direction: row;
align-items: center;
flex-grow: 1;
height: 0;
}
.around-info-left-top {
position: absolute;
top: 0px;
left: 0px;
color: white;
}
.around-info-right-top {
position: absolute;
top: 0px;
right: 0px;
color: white;
display:flex;
flex-direction:row-reverse;
}
.around-info-left-bottom {
position: absolute;
left: 0px;
bottom: 0px;
color: white;
}
.around-info-right-bottom {
position: absolute;
right: 0px;
bottom: 0px;
color: white;
display: flex;
flex-direction:column;
}
.around-info-right-bottom > .tag-item, around-info-right-top > .tag-item {
display: flex;
flex-direction: row-reverse;
}
</style>
</head>
<body>
<div id="container">
<div id="top-menu" class="btn-group">
<button type="button" id="Magnify" class="btn btn-default" onclick="switchAction('Magnify',1,this)">Magnify</button>
<button type="button" id="Pan" class="btn btn-default" onclick="switchAction('Pan',1,this)">Pan</button>
<button type="button" id="Zoom" class="btn btn-default" onclick="switchAction('Zoom',1,this)">Zoom</button>
<button type="button" id="ZoomMouseWheel" class="btn btn-default" onclick="switchAction('ZoomMouseWheel',1,this)">ZoomMouseWheel</button>
<button type="button" id="Wwwc" class="btn btn-default" onclick="switchAction('Wwwc',1,this)">Wwwc</button>
<button type="button" id="WwwcRegion" class="btn btn-default" onclick="switchAction('WwwcRegion',1,this)">WwwcRegion</button>
<button type="button" id="ScaleOverlay" class="btn btn-default" onclick="switchAction('ScaleOverlay',1,this)">ScaleOverlay</button>
<button type="button" id="Rotate" class="btn btn-default" onclick="switchAction('Rotate',1,this)">Rotate</button>
<button type="button" id="OrientationMarkers" class="btn btn-default" onclick="switchAction('OrientationMarkers',1,this)">OrientationMarkers</button>
<button type="button" id="Angle" class="btn btn-default" onclick="switchAction('Angle',1,this)">Angle</button>
<button type="button" id="ArrowAnnotate" class="btn btn-default" onclick="switchAction('ArrowAnnotate',1,this)">ArrowAnnotate</button>
<button type="button" id="Bidirectional" class="btn btn-default" onclick="switchAction('Bidirectional',1,this)">Bidirectional</button>
<button type="button" id="CobbAngle" class="btn btn-default" onclick="switchAction('CobbAngle',1,this)">CobbAngle</button>
<button type="button" id="EllipticalRoi" class="btn btn-default" onclick="switchAction('EllipticalRoi',1,this)">EllipticalRoi</button>
<button type="button" id="FreehandRoi" class="btn btn-default" onclick="switchAction('FreehandRoi',1,this)">FreehandRoi</button>
<button type="button" id="Length" class="btn btn-default" onclick="switchAction('Length',1,this)">Length</button>
<button type="button" id="Probe" class="btn btn-default" onclick="switchAction('Probe',1,this)">Probe</button>
<button type="button" id="RectangleRoi" class="btn btn-default" onclick="switchAction('RectangleRoi',1,this)">RectangleRoi</button>
<button type="button" id="TextMarker" class="btn btn-default" onclick="switchAction('TextMarker',1,this)">TextMarker</button>
<button type="button" id="StackScroll" class="btn btn-default" onclick="switchAction('StackScroll',1,this)">StackScroll</button>
<button type="button" id="StackScrollMouseWheel" class="btn btn-default" onclick="switchAction('StackScrollMouseWheel',1,this)">StackScrollMouseWheel</button>
<button type="button" id="invert" class="btn btn-default" onclick="invert(1,this)">反转色</button>
<button type="button" id="changeColorx" class="btn btn-default" onclick="changColor(1,this)">改变颜色</button>
<button type="button" class="btn btn-default" onclick="resetTool()">重置</button>
<input type="text" id='row-count' placeholder="行数" value='1' /> x <input type="text" id='column-count' placeholder="列数" value='1' /> <input type='button' onclick="doCreate()" value="生成" />
</div>
<div id="body-part">
<div id="dicom-continer">
</div>
<div id="dicom-list">
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,644 @@
//功能名称
const functionNames = [
"Magnify", "Pan", "Zoom", "ZoomMouseWheel", "Wwwc",
"ScaleOverlay", "OrientationMarkers", "WwwcRegion", "Rotate", "Angle", "ArrowAnnotate", "Bidirectional", "CobbAngle", "EllipticalRoi", "FreehandRoi", "Length", "Probe", "RectangleRoi", "TextMarker",
"StackScroll", "StackScrollMouseWheel"
]
//标尺和方向显示可与其他状态同时启用
const displayFunctions = ["ScaleOverlay", "OrientationMarkers"]
//不能同时启用的功能
const notNeedDisableFunctions = ["WwwcRegion", "Rotate", "Angle", "ArrowAnnotate", "Bidirectional", "CobbAngle", "EllipticalRoi", "FreehandRoi", "Length", "Probe", "RectangleRoi", "TextMarker"]
//状态数据
var stateData = {
rowCount: 1,
columnCount: 1,
imgIndex: 0,
element: {},
dicomInfo: {},
showMapping: new Map()
}
/*切换工具*/
function switchAction(tagName, flag, btn) {
//btn btn-primary
var isSelected = $(btn).hasClass('selected');
if (isSelected) {
$(btn).removeClass("btn-primary")
$(btn).removeClass("selected")
$(btn).addClass("btn-default")
disableFunctions(tagName);
}
else {
disableFunctions(tagName);
$(btn).removeClass("btn-default")
$(btn).addClass("btn-primary")
$(btn).addClass("selected")
}
if (!isSelected) {
cornerstoneTools.setToolActive(tagName, { mouseButtonMask: 1 })
}
}
function reload() {
var data = cornerstoneTools.getToolState(stateData.element, "stack").data[0];
var index = data.currentImageIdIndex;
var imgId = data.imageIds[index];
data.currentImageIdIndex = index;
cornerstone.loadAndCacheImage(imgId).then(function (image) {
cornerstone.enable(stateData.element);
cornerstone.displayImage(stateData.element, image);
});
}
//下一张
function next(imgId) {
if (imgId && stateData.element != imgId) {
return;
}
var data = cornerstoneTools.getToolState(stateData.element, "stack").data[0];
var index = data.currentImageIdIndex;
if (index == data.imageIds.length - 1) {
return;
}
else {
index += 1;
}
var imgId = data.imageIds[index];
data.currentImageIdIndex = index;
cornerstone.loadAndCacheImage(imgId).then(function (image) {
cornerstone.enable(stateData.element);
cornerstone.displayImage(stateData.element, image);
renderTagText(stateData.element,image)
});
for (var i = 0; i < 10; i++) {
if (index + i == data.imageIds.length - 1) {
break;
}
cornerstone.loadImage(data.imageIds[index + i]).then((image) => {
console.log("loaded ok " + data.imageIds[index + i]);
})
}
setSliderValue(stateData.element.id)
}
//读取文件中的标签信息
function getDicomInfo(image) {
var imageInfo = {};
imageInfo.seriesNumber = image.data.string('x00200011');//图像序列号
imageInfo.imageNum = image.data.string('x00200013');//图像位置
imageInfo.imageDate = image.data.string("x00080021");//拍摄日期
imageInfo.sliceThickness = image.data.string('x00180050');//层厚
imageInfo.patientId = image.data.string('x00100020');//病理号
// 判断窗宽窗位是否合法
imageInfo.pixelR = image.data.uint16('x00280103');
imageInfo.heightBit = image.data.uint16('x00280102') || '';
// 病人基本信息
imageInfo.patientName = image.data.string('x00100010');
imageInfo.patientBirthDate = image.data.string('x00100030');
imageInfo.patientGender = image.data.string('x00100040');
imageInfo.sID = image.data.string('x00200011');
// 像素间距
imageInfo.pixelSpacing = image.data.string('x00280030');
imageInfo.height = image.data.uint16('x00280010');
imageInfo.width = image.data.uint16('x00280011');
imageInfo.height = image.data.uint16('x00280010');
imageInfo.windowCenter = image.data.string('x00281050');
imageInfo.windowWidth = image.data.string('x00281051');
imageInfo.imagePixelSpacing = image.data.string('x00181164') || '';
imageInfo.rowPixelSpacing = image.rowPixelSpacing;
// 放射放大系数
imageInfo.magnification = Number(image.data.string('x00181114'));
// 放射源到面板的距离
imageInfo.sourceTOdetector = image.data.string('x00181110');
// 放射源到病人的距离
imageInfo.sourceTOpatient = image.data.string('x00181111');
//this.modalityLUT = cornerstone.metaData.get('modalityLutModule', image.imageId).modalityLUTSequence;
imageInfo.voiContent = cornerstone.metaData.get('voiLutModule', image.imageId);
// 斜率截距
imageInfo.rescaleIntercept = Number(image.data.string('x00281052'));
imageInfo.rescaleSlope = Number(image.data.string('x00281053'));
return imageInfo;
}
//上一张
function last(imgId) {
if (imgId && stateData.element != imgId) {
return;
}
var data = cornerstoneTools.getToolState(stateData.element, "stack").data[0];
var index = data.currentImageIdIndex;
if (index == 0) {
return;
}
else {
index -= 1;
}
var imgId = data.imageIds[index];
data.currentImageIdIndex = index;
cornerstone.loadAndCacheImage(imgId).then(function (image) {
cornerstone.enable(stateData.element);
cornerstone.displayImage(stateData.element, image);
renderTagText(stateData.element, image)
});
setSliderValue(stateData.element.id)
}
//进度条更新
function setAllSliderValue() {
//获取所有已经加载的图片区映射关系
if (stateData.showMapping) {
stateData.showMapping.forEach((value, key) => {
setSliderValue(key);
});
}
}
//标签文本更新
function setAllTagsValue() {
if (stateData.showMapping) {
stateData.showMapping.forEach((value, key) => {
var element = document.getElementById(key)
var image = cornerstone.getImage(element);
//TODO 缺少获取图片对象信息
renderTagText(element, image)
});
}
}
//重置画布
function resetRenderCanvase() {
var element = stateData.element;
const enabledElement = cornerstone.getEnabledElement(element);
enabledElement.renderingTools.colormapId = undefined;
enabledElement.renderingTools.colorLut = undefined;
const renderCanvas = enabledElement.renderingTools.renderCanvas;
const canvasContext = renderCanvas.getContext('2d');
// NOTE - we need to fill the render canvas with white pixels since we
// control the luminance using the alpha channel to improve rendering performance.
canvasContext.fillStyle = 'white';
canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);
const renderCanvasData = canvasContext.getImageData(0, 0, renderCanvas.width, renderCanvas.height);
enabledElement.renderingTools.renderCanvasContext = canvasContext;
enabledElement.renderingTools.renderCanvasData = renderCanvasData;
cornerstone.updateImage(stateData.element);
}
//重置按钮状态
function resetBtnState(id) {
if ($("#" + id).hasClass("selected")) {
$("#" + id).removeClass("btn-primary")
$("#" + id).removeClass("selected")
$("#" + id).addClass("btn-default")
}
}
function disableFunctions(currentFun) {
functionNames.forEach(function (fname) {
resetBtnState(fname)
if (currentFun != fname && (notNeedDisableFunctions.includes(fname) || displayFunctions.includes(fname))) {
return;
}
cornerstoneTools.setToolDisabled(fname, { mouseButtonMask: 1 })
})
}
//辅助工具
const toolFunction = ["ScaleOverlay", "OrientationMarkers"]
const wheelFunction = ["ZoomMouseWheel"]
//撤销所有改动
function resetTool() {
//反转色
//invert(null, $("#invert"), true)
//changColor(0, $("#changeColor"), true)
functionNames.forEach(function (fname) {
if (notNeedDisableFunctions.includes(fname)) {
cornerstoneTools.clearToolState(stateData.element, fname);
}
})
cornerstone.reset(stateData.element);
cornerstone.updateImage(stateData.element);
}
//反转颜色
function invert(flag, btn, reset) {
//btn btn-primary
var isSelected = $(btn).hasClass('selected');
if (isSelected || reset) {
$(btn).removeClass("btn-primary")
$(btn).removeClass("selected")
$(btn).addClass("btn-default")
}
else {
$(btn).removeClass("btn-default")
$(btn).addClass("btn-primary")
$(btn).addClass("selected")
}
//反转颜色
var viewport = {
invert: !isSelected ? true : false
}
cornerstone.setViewport(stateData.element, viewport);
}
//彩色
function changColor(flag, btn, reset) {
var element = stateData.element;
//btn btn-primary
var isSelected = $(btn).hasClass('selected');
if (isSelected || reset) {
$(btn).removeClass("btn-primary")
$(btn).removeClass("selected")
$(btn).addClass("btn-default")
}
else {
$(btn).removeClass("btn-default")
$(btn).addClass("btn-primary")
$(btn).addClass("selected")
}
resetRenderCanvase();
const b = cornerstone.getEnabledElement(element)
const v = cornerstone.getDefaultViewport(b.canvas, b.image)
var vp = cornerstone.getViewport(element);
vp.colormap = !isSelected ? "hsv" : undefined;
if (!flag) {
cornerstone.setViewport(element, v)
}
else {
cornerstone.setViewport(element, vp)
}
}
//重置cornerstone
function reset() {
cornerstone.reset(stateData.element);
}
function initConerstone(element) {
// 注册并挂载cornerstone及其cornerstoneTools固定操作
cornerstoneTools.external.cornerstone = cornerstone;
cornerstoneTools.external.cornerstoneMath = cornerstoneMath;
cornerstoneTools.external.Hammer = Hammer;
cornerstoneWADOImageLoader.external.dicomParser = dicomParser;
cornerstoneWADOImageLoader.external.cornerstone = cornerstone;
// imageId就是cornerstone要求的.dcm图片地址,例如var imageId = "wadouri:http://127.0.0.1:6699/ctdcm1.dcm";
//var imageId = "wadouri:./1.dcm";
// 初始化cornerstoneTools工具
cornerstoneTools.init();
//// 获取要用于加载图片的div区域
//element = document.getElementById('dicomImage');
////激活获取到的用于图片加载的区域
cornerstone.enable(element);
// 从cornerstoneTools库中获取窗宽,窗高工具
const WwwcTool = cornerstoneTools.WwwcTool;
//添加获取到的窗宽,窗高工具
cornerstoneTools.addTool(WwwcTool);
//放大
const MagnifyTool = cornerstoneTools.MagnifyTool;
cornerstoneTools.addTool(MagnifyTool)
//平移
const PanTool = cornerstoneTools.PanTool;
cornerstoneTools.addTool(PanTool)
const ZoomTool = cornerstoneTools.ZoomTool;
cornerstoneTools.addTool(ZoomTool, {
// Optional configuration
configuration: {
invert: false,
preventZoomOutsideImage: false,
minScale: .1,
maxScale: 20.0,
}
});
const ZoomMouseWheelTool = cornerstoneTools.ZoomMouseWheelTool;
cornerstoneTools.addTool(ZoomMouseWheelTool)
const WwwcRegionTool = cornerstoneTools.WwwcRegionTool;
cornerstoneTools.addTool(WwwcRegionTool)
const ScaleOverlayTool = cornerstoneTools.ScaleOverlayTool;
cornerstoneTools.addTool(ScaleOverlayTool)
//旋转
const RotateTool = cornerstoneTools.RotateTool;
cornerstoneTools.addTool(RotateTool)
const OrientationMarkersTool = cornerstoneTools.OrientationMarkersTool;
cornerstoneTools.addTool(OrientationMarkersTool)
const AngleTool = cornerstoneTools.AngleTool;
cornerstoneTools.addTool(AngleTool)
const ArrowAnnotateTool = cornerstoneTools.ArrowAnnotateTool;
cornerstoneTools.addTool(ArrowAnnotateTool)
const BidirectionalTool = cornerstoneTools.BidirectionalTool;
cornerstoneTools.addTool(BidirectionalTool)
const CobbAngleTool = cornerstoneTools.CobbAngleTool;
cornerstoneTools.addTool(CobbAngleTool)
const EllipticalRoiTool = cornerstoneTools.EllipticalRoiTool;
cornerstoneTools.addTool(EllipticalRoiTool)
const FreehandRoiTool = cornerstoneTools.FreehandRoiTool;
cornerstoneTools.addTool(FreehandRoiTool)
const LengthTool = cornerstoneTools.LengthTool;
cornerstoneTools.addTool(LengthTool)
const ProbeTool = cornerstoneTools.ProbeTool;
cornerstoneTools.addTool(ProbeTool)
const RectangleRoiTool = cornerstoneTools.RectangleRoiTool;
cornerstoneTools.addTool(RectangleRoiTool)
const TextMarkerTool = cornerstoneTools.TextMarkerTool
// set up the markers configuration
const configuration = {
markers: ['F5', 'F4', 'F3', 'F2', 'F1'],
current: 'F5',
ascending: true,
loop: true,
}
cornerstoneTools.addTool(TextMarkerTool, { configuration })
const StackScrollTool = cornerstoneTools.StackScrollTool
cornerstoneTools.addTool(StackScrollTool)
const StackScrollMouseWheelTool = cornerstoneTools.StackScrollMouseWheelTool
cornerstoneTools.addTool(StackScrollMouseWheelTool)
cornerstoneTools.setToolActive('StackScrollMouseWheel', {})
}
function initConerstoneAndData() {
var series = stateData.dicomInfo.seriesList[stateData.imgIndex].instanceList
const scheme = 'wadouri'
const baseUrl = ''
const imageIds = series.map(seriesImage => `${scheme}:${baseUrl}${seriesImage.imageid}`)
//define the stack
const stack = {
currentImageIdIndex: 0,
imageIds: imageIds
}
cornerstone.enable(stateData.element);
// load images and set the stack
cornerstone.loadImage(imageIds[0]).then((image) => {
initSlider(stateData.element);
cornerstone.displayImage(stateData.element, image)
cornerstoneTools.addStackStateManager(stateData.element, ['stack'])
cornerstoneTools.addToolState(stateData.element, 'stack', stack)
renderTagText(stateData.element, image)
})
}
//页面加载完成,执行初始化
$(document).ready(function () {
createElements(1, 1,true);
//激活获取到的用于图片加载的区域
stateData.element = document.getElementById('dicomImage_0_0');
stateData.showMapping.set('dicomImage_0_0',0);
//cornerstone.enable(stateData.element);
initConerstone(stateData.element);
//初始化数据
initData();
//鼠标滚轮事件
document.addEventListener('mousewheel', function (event) {
// 处理事件
setAllSliderValue();
setAllTagsValue();
});
//鼠标移动事件
document.addEventListener('mousemove', function (event) {
// 处理事件
setAllSliderValue();
setAllTagsValue();
});
})
//初始化右侧图片列表
function initImgList(data) {
$("#dicom-list").empty();
for (var i = 0; i < data.seriesList.length; i++) {
var className = "series_img";
if (stateData.imgIndex == i) {
className += "_active";
}
$("#dicom-list").append('<img id="img_' + i + '" onclick="changeIndex(' + i + ')" class="' + className + '" src="' + data.seriesList[i].thumbUrl + '"/>');
}
}
//修改序列
function changeIndex(i) {
if (stateData.imgIndex == i && stateData.showMapping.get(stateData.element.id) == i) {
return;
}
$("#img_" + stateData.imgIndex).removeClass("series_img_active");
$("#img_" + stateData.imgIndex).addClass("series_img")
$("#img_" + i).removeClass("series_img")
$("#img_" + i).addClass("series_img_active")
stateData.imgIndex = i
initConerstone(stateData.element)
initConerstoneAndData();
stateData.showMapping.set(stateData.element.id, i);
}
//获取数据 Handler/Service.ashx idx: idx, no: localData.no, orgId: localData.orgId, method: "getSeries"
function initData() {
var idx = GetQueryString("idx");
var localStorage = window.localStorage;
var localData = JSON.parse(localStorage.data);
/* alert(localData.regid) */
$.getJSON("http://127.0.0.1:5000/get-data", {
},
function (data) {
if ("failed" == data.status) {
alert("获取数据失败")
}
else {
stateData.dicomInfo = data;
initImgList(stateData.dicomInfo);
initConerstoneAndData();
}
});
}
//初始化滚动条
function initSlider(element) {
var idx = stateData.showMapping.get(element.id);
var size = stateData.dicomInfo.seriesList[idx].instanceList.length;
//当前索引
var index = 0;
try {
var data = cornerstoneTools.getToolState(element, "stack").data[0];
index = data.currentImageIdIndex;
}
catch (err) {
console.log('err',err)
}
$("#" + element.id + "-slider").attr("min", 1)
$("#" + element.id + "-slider").attr("max", size)
$("#" + element.id + "-slider").val(index + 1)
}
//选中元素
function changeElement(b) {
//滚动条和上下翻页禁用
$(".operator").attr("disabled", "true");
$("#" + b.id + "-btn-next").removeAttr("disabled");
$("#" + b.id + "-btn-last").removeAttr("disabled");
$("#" + b.id + "-slider").removeAttr("disabled");
if (stateData.element == b) {
$(b).parent().removeClass("dicom-img-box");
$(b).parent().addClass("dicom-img-box-active");
return;
}
$(b).parent().removeClass("dicom-img-box");
$(b).parent().addClass("dicom-img-box-active");
$(stateData.element).parent().removeClass("dicom-img-box-active");
$(stateData.element).parent().addClass("dicom-img-box");
stateData.element = b;
}
//获取URL参数
function GetQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
//设置滑动条值
function setSliderValue(imgId) {
//获取被选中胶片区域元素
var element = document.getElementById(imgId)
var data = cornerstoneTools.getToolState(element, "stack").data[0];
var index = data.currentImageIdIndex;
$("#" + imgId + "-slider").val(index+1);
}
function changeSlider(imgId, slider) {
var sliderValue = $(slider).val();
var data = cornerstoneTools.getToolState(stateData.element, "stack").data[0];
index = sliderValue - 1;
var imgId = data.imageIds[index];
data.currentImageIdIndex = index;
cornerstone.loadAndCacheImage(imgId).then(function (image) {
cornerstone.enable(stateData.element);
cornerstone.displayImage(stateData.element, image);
renderTagText(stateData.element,image)
});
for (var i = 0; i < 10; i++) {
if (index + i == data.imageIds.length - 1) {
break;
}
cornerstone.loadImage(data.imageIds[index + i]).then((image) => {
console.log("loaded ok " + data.imageIds[index + i]);
})
}
}
//渲染标签文本
function renderTagText(e, i) {
var tagsInfo = getDicomInfo(i);
var element = $(e).parent()[0];
var boxId = element.id;
//判断文本是否已经显示
if (!$("#" + boxId + "_left-top").length) {
var infoElement =
' <div id="' + boxId + '_left-top" class="around-info-left-top"></div>' +
' <div id="' + boxId + '_right-top" class="around-info-right-top"></div>' +
' <div id="' + boxId + '_left-bottom" class="around-info-left-bottom"></div>' +
' <div id="' + boxId + '_right-bottom" class="around-info-right-bottom"></div>';
$(element).children().first().before(infoElement);
}
//左上角
var leftTop = $("#" + boxId + "_left-top");
leftTop.empty();
leftTop.append("<div class='tag-item'>" + tagsInfo.patientId + "</div>");//体检编号
leftTop.append("<div class='tag-item'>姓名:" + stateData.dicomInfo.patientname + "</div>");//患者姓名
leftTop.append("<div class='tag-item'>" + tagsInfo.patientBirthDate + " " + (tagsInfo.patientGender == 'F' ? "男":"女") + "</div>");
leftTop.append("<div class='tag-item'>" + tagsInfo.imageDate + "</div>");
//左下角
var leftBottom = $("#" + boxId + "_left-bottom");
leftBottom.empty();
leftBottom.append("<div class='tag-item'>" + stateData.dicomInfo.hospital +"</div>");
//右上角
var rightTop = $("#" + boxId + "_right-top");
rightTop.empty();
rightTop.append("<div class='tag-item'>序列:" + tagsInfo.seriesNumber + " 图像:" + tagsInfo.imageNum + "</div>");
//右下角
var vp = cornerstone.getViewport(e);
var rightBottom = $("#" + boxId + "_right-bottom");
rightBottom.empty();
rightBottom.append("<div class='tag-item'>缩放:" + vp.scale.toFixed(2) + "</div>");
rightBottom.append("<div class='tag-item'>" + tagsInfo.width + "x" + tagsInfo.height + "</div>");
rightBottom.append("<div class='tag-item'>窗宽:" + tagsInfo.windowWidth + " 窗位:" + tagsInfo.windowCenter + "</div>");
}
//创建视图元素
function createElements(rowCount, columnCount,isInit) {
var container = document.getElementById('dicom-continer');
if (!isInit) {
clearChildren(container);
}
for (var i = 0; i < rowCount; i++) {
//生成行
var rowDom = document.createElement('div')
rowDom.setAttribute("class", "flex-row");
for (var j = 0; j < columnCount; j++) {
var columnDom = document.createElement('div');
columnDom.setAttribute("class", "dicom-img-box");
columnDom.setAttribute("id", 'dicom-img-box_' + i + '_' + j)
var imgId = 'dicomImage_' + i + '_' + j;
$(columnDom).append('<div class="dicom-img" id="' + imgId + '" onclick="changeElement(this)"></div>'
+'<div class="slider-container">'
+ '<i class="iconfont icon-fangxiangjiantou-shang icon-shang operator" id="' + imgId +'-last_btn" onclick="last(' + imgId +')"></i>'
+ '<input type="range" class="lcmf-range lcmf-range-date operator" value="0" id="' + imgId +'-slider" onchange="changeSlider(\'' + imgId + '\',this)" />'
+ '<i class="iconfont icon-fangxiangjiantou-xia icon-xia operator" id="' + imgId +'-next_btn" onclick="next(' + imgId +')"></i>'
+ '</div>');
rowDom.appendChild(columnDom);
}
container.appendChild(rowDom);
}
}
//清理元素
function clearChildren(element) {
if (element && element.children.length > 0) {
for (var i = 0; i < element.children.length; i++) {
element.removeChild(element.children[i]);
i--;
}
}
}
//创建视图入口
function doCreate() {
let rowCount = parseInt(document.getElementById('row-count').value);
let columnCount = parseInt(document.getElementById('column-count').value);
if (stateData.rowCount == rowCount && stateData.columnCount == columnCount) {
return;
}
createElements(rowCount, columnCount, false);
stateData.rowCount = rowCount;
stateData.columnCount = columnCount;
stateData.imgIndex = 0;
stateData.element = null;
stateData.showMapping = new Map()
}

View File

@ -146,11 +146,11 @@ const getProject = async () => {
message: '/reservation/applyform'
},
{
name: '超声报告',
name: '超声工作台',
message: '/diagnosis/patientexamlistultrasonic'
},
{
name: '影像报告',
name: '影像工作台',
message: '/diagnosis/patientexamlist'
}
]

View File

@ -0,0 +1,622 @@
<template>
<el-dialog
v-model="dialogVisible"
:title="dialogTitle"
class="my-custom-close-icon"
:fullscreen="true"
>
<el-tabs v-model="activeName" type="card" class="demo-tabs">
<el-tab-pane label="影像" name="first">
<iframe
frameborder="0"
scrolling="no"
:src="newSrc"
style="width: 100%; height: 87vh"
></iframe>
</el-tab-pane>
<el-tab-pane label="报告单" name="second">
<!-- 外层 Flex 容器 -->
<div style="display: flex; height: 100%">
<!-- 模版区域 -->
<div style="flex: 1; min-width: 0" class="template-area">
<el-select
v-model="fordevicemValue"
placeholder="请选择模版类别"
clearable
@change="handleselectchange"
@clear="selectclear"
>
<el-option label="门诊" value="门诊模版" />
<el-option label="住院" value="住院模版" />
<el-option label="体检" value="体检模版" />
</el-select>
<el-tabs type="border-card" style="height: 83vh">
<el-tab-pane label="通用模版">
<!-- -->
<el-tree
style="min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
:highlight-current="true"
:default-expand-all="true"
:data="treeData"
:props="treeDefaultProps"
node-key="id"
:show-checkbox="false"
:check-strictly="true"
@check="handleTreeNodeClick"
ref="selectTree"
:expand-on-click-node="false"
/>
</el-tab-pane>
<el-tab-pane label="私有模版">
<!-- -->
<el-tree
style="min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
:highlight-current="true"
:default-expand-all="true"
:data="privateData"
:props="treeDefaultProps"
node-key="id"
:show-checkbox="false"
:check-strictly="true"
@node-click="handleTreeNodeClick"
ref="priselectTree"
:expand-on-click-node="false"
/>
</el-tab-pane>
</el-tabs>
</div>
<!-- 用户信息区域 -->
<div style="flex: 3; min-width: 0" class="user-info-area">
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">患者信息</label>
<el-divider />
<el-form
:model="applyFormVO"
label-width="auto"
style="max-width: 1000px; margin: auto"
:inline="true"
>
<el-row>
<el-col :span="7">
<el-form-item label="检查号" style="font-weight: bold" label-width="110px">
<el-input v-model="applyFormVO.examId" style="width: 220px" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="姓名" style="font-weight: bold" label-width="130px">
<el-input v-model="applyFormVO.pname" style="width: 220px" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="性别" style="font-weight: bold" label-width="160px">
<el-input v-model="applyFormVO.gender" style="width: 220px" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="出生日期" style="font-weight: bold" label-width="110px">
<el-date-picker
v-model="applyFormVO.birthday"
type="date"
placeholder="出生日期"
size="default"
style="width: 220px"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查时间" style="font-weight: bold" label-width="130px">
<el-date-picker
v-model="applyFormVO.examDate"
type="datetime"
placeholder="检查时间"
size="default"
style="width: 220px"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查项目名称" label-width="160px" style="font-weight: bold">
<el-input
v-model="applyFormVO.examItemName"
style="width: 220px"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="申请时间" style="font-weight: bold" label-width="110px">
<el-date-picker
v-model="applyFormVO.applicationDate"
type="datetime"
placeholder="检查时间"
size="default"
style="width: 220px"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请单号" style="font-weight: bold" label-width="130px">
<el-input v-model="applyFormVO.regId" style="width: 220px" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="送检科室" style="font-weight: bold" label-width="160px">
<el-input
v-model="applyFormVO.billDoctorDepartment"
style="width: 220px"
:disabled="true"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">影像所见</label>
<el-divider />
<el-input
v-model="sj"
style="width: 95%; font-size: 20px; margin-left: 40px; margin-bottom: 3px"
:rows="7"
type="textarea"
placeholder="影像所见"
/>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">影像结论</label>
<el-divider />
<el-input
v-model="zdjl"
style="width: 95%; font-size: 20px; margin-left: 40px; margin-bottom: 3px"
:rows="7"
type="textarea"
placeholder="影像结论"
/>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">报告备注</label>
<el-divider />
<el-input
v-model="notes"
style="
width: 95%;
font-size: 19px;
margin-left: 40px;
margin-top: 6px;
margin-bottom: 6px;
"
placeholder=""
/>
<el-divider />
<el-radio-group
v-model="radio1"
size="small"
class="radio-group-wrapper"
@dblclick="cancelSelection"
>
<el-radio-button label="阴性" value="0" />
<el-radio-button label="阳性" value="1" />
</el-radio-group>
<el-divider />
<div class="form-row">
<el-form-item label="诊断医生" class="form-item">
<el-input v-model="applyFormVO.diagDoctor" style="width: 180px" :disabled="true" />
</el-form-item>
<el-form-item label="审核医生" class="form-item">
<el-input
v-model="applyFormVO.reviewDoctor"
style="width: 180px"
:disabled="true"
/>
</el-form-item>
<el-form-item label="报告状态" class="form-item">
<el-input
v-model="applyFormVO.reportstatus"
style="width: 180px"
:disabled="true"
/>
</el-form-item>
</div>
<div style="position: absolute; bottom: 0; right: 0">
<el-button
type="success"
plain
style="width: 80px; float: right; margin-right: 15px; margin-top: 13px"
@click="save"
:disabled="savedisabled"
>保存</el-button
>
<!-- v-show="examinedisabled" -->
<el-button
type="primary"
plain
v-show="examinedisabled"
style="width: 80px; float: right; margin-right: 15px; margin-top: 13px"
@click="examine"
>审核</el-button
>
</div>
</div>
</div>
</el-tab-pane>
</el-tabs>
</el-dialog>
<!-- </Dialog> -->
<!-- 弹窗-->
<el-dialog v-model="dialogTableVisible" title="选择结论添加方式" width="320" align-center>
<div>
<el-button @click="handleButtonClick('覆盖')" type="primary" style="font-size: 20px"
>覆盖</el-button
>
<el-button @click="handleButtonClick('追加')" type="success" style="font-size: 20px"
>追加</el-button
>
<el-button @click="dialogTableVisible = false" type="info" style="font-size: 20px"
>关闭</el-button
>
</div>
</el-dialog>
</template>
<script setup lang="ts">
import { ApplyformApi, ApplyformVO, UPFJApplyformVO } from '@/api/applyregistration/applyform'
import { ultrasoniccomApi, updateexamineimageVO } from '@/api/ultrasoniccom'
import { PatientexamlistApi, PatientexamlistVO } from '@/api/tblist/patientexamlist'
import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
/** dicom */
defineOptions({ name: 'DicomViewForm' })
const Profilevo = ref<ProfileVO>({} as ProfileVO) //
const { t } = useI18n() //
const message = useMessage() //
const upFJApplyformVO = ref<UPFJApplyformVO[]>([])
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const examineFormVO = ref<PatientexamlistVO>({} as PatientexamlistVO)
const savedisabled = ref(true) //
const examinedisabled = ref(false) //
const isImageLoaded = ref(false) //
const isImageLoaded2 = ref(false) //
const isImageLoaded3 = ref(false) //
//使
const clickuptime = async (pid: string) => {
await ultrasoniccomApi.upreporttemplatetime(pid)
}
//
const dialogTableVisible = ref(false)
//
const btncleckname = ref()
//
const handleButtonClick = (buttonName) => {
if (buttonName == '覆盖') {
zdjl.value = strzdjl
sj.value = strsj
} else if (buttonName == '追加') {
let lszdjl: string = zdjl.value
let lssj: string = sj.value
zdjl.value = lszdjl + strzdjl
sj.value = lssj + strsj
}
dialogTableVisible.value = false
console.log('获取到父节点' + pid)
clickuptime(pid)
}
//or
const updateexamineimage = ref<updateexamineimageVO[]>([])
//
const notes = ref()
//
const save = async () => {
try {
//
await message.delConfirm('是否进行保存', '确认')
let timesta = new Date()
var localDateTime = new Date(timesta.getTime()).toISOString() // ISO
localDateTime = localDateTime.slice(0, localDateTime.length - 1)
console.log('当前时间' + localDateTime)
examineFormVO.value.id = ID.toString()
examineFormVO.value.examDescription = sj.value
examineFormVO.value.diagResults = zdjl.value
examineFormVO.value.notes = notes.value
examineFormVO.value.diagFlag = radio1.value
examineFormVO.value.diagDoctor = Profilevo.value.username
// examineFormVO.value.reviewDoctor = Profilevo.value.username
examineFormVO.value.reportstatus = '已分析'
// examineFormVO.value.diagDate=localDateTime
// examineFormVO.value.reviewDate=dateTime
const response = await PatientexamlistApi.examineupdatelist(examineFormVO.value)
// code
if (response) {
message.alertSuccess('保存成功')
// data
console.log('接口调用成功')
console.log('data:', response.data)
// ID
getPatientexamlist(ID)
//
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
emit('success')
} else {
//
console.error('接口调用失败:', response.msg)
}
} catch (error) {
//
console.error('接口调用失败:', error)
}
}
//
const examine = async () => {
if (applyFormVO.value.reportstatus === '已分析') {
const response = await PatientexamlistApi.examine(ID.toString())
if (response) {
message.alertSuccess('审核成功')
// ID
getPatientexamlist(ID)
emit('success')
}
} else if (applyFormVO.value.reportstatus === '已审核') {
message.warning('已经审核,无需再次审核')
return
} else {
message.warning('请先进行保存')
return
}
}
//
const age = ref()
const calculateAge = (birthdate) => {
if (!birthdate) {
age.value = null
return
}
const today = new Date()
const birth = new Date(birthdate)
let yearsDiff = today.getFullYear() - birth.getFullYear()
// Check if the birthday hasn't occurred yet this year
const hasBirthdayPassed =
today.getMonth() > birth.getMonth() ||
(today.getMonth() === birth.getMonth() && today.getDate() >= birth.getDate())
if (!hasBirthdayPassed) {
yearsDiff--
}
age.value = yearsDiff
}
//
const applyFormVO = ref<PatientexamlistVO>({} as PatientexamlistVO)
//
const fordevicemValue = ref('')
//
const selectclear = async () => {
//
//
const dd = await ultrasoniccomApi.getreporttemplatelist('', '', '')
treeData.value = dd
const pridate = await ultrasoniccomApi.getreporttemplatelist('', '', '1')
privateData.value = pridate
}
const fordevicemData = ref<any[]>([])
const formRules = reactive({})
const formRef = ref() // Ref
//table
const activeName = ref('first')
//
const radio1 = ref('')
const cancelSelection = () => {
radio1.value = ''
}
//
const zdjl = ref('')
//
const sj = ref('')
//
const selectTree = ref()
//
const treeData = ref([])
//
const privateData = ref([])
//
const treeDefaultProps = {
children: 'children',
label: 'tempname'
}
//
let strzdjl: string = ''
let strsj: string = ''
let pid: string = '' //id
//
const handleTreeNodeClick = async (data) => {
strzdjl = data.diagResults
strsj = data.examDescription
pid = data.pid
console.log('父节点' + data.pid)
dialogTableVisible.value = true
}
//
const handleselectchange = async () => {
console.log(fordevicemValue.value)
if (fordevicemValue.value) {
//
//
const dd = await ultrasoniccomApi.getreporttemplatelist('', String(fordevicemValue.value), '')
treeData.value = dd
const pridate = await ultrasoniccomApi.getreporttemplatelist(
'',
String(fordevicemValue.value),
'1'
)
privateData.value = pridate
}
}
//
let ID: number
//orgid
const orgId = ref('')
//regid
const regId = ref('')
//
const newSrc=ref('');
/** 打开弹窗 */
const open = async (id: number, orgid: string, regid: string) => {
resetForm()
const Src = `/public/dicom/dicomViewPc1.html?t=${new Date().getTime()}`;
newSrc.value=Src
console.log('orgid' + orgid)
console.log('regid' + regid)
console.log('id' + id)
orgId.value = orgid
regId.value = regid
ID = id
dialogVisible.value = true
dialogTitle.value = '书写报告(影像)'
//
formLoading.value = true
try {
//
const dd = await ultrasoniccomApi.getreporttemplatelist('', String(fordevicemValue.value), '')
treeData.value = dd
console.log('返回值1' + dd)
console.log('返回值2' + treeData.value)
//
const pridate = await ultrasoniccomApi.getreporttemplatelist(
'',
String(fordevicemValue.value),
'1'
)
privateData.value = pridate
// ID
getPatientexamlist(id)
//html
var localData = {
regid: regid, // 'someNumber'
orgId: orgid // 'someOrgId' ID
}
// JSON
var localStorageData = JSON.stringify(localData);
localStorage.setItem('data', localStorageData)
//
getlogininfo()
} finally {
formLoading.value = false
}
}
// ID
const getPatientexamlist = async (id: number) => {
const data = await PatientexamlistApi.getPatientexamlist(id)
applyFormVO.value = data
//
radio1.value = applyFormVO.value.diagFlag
zdjl.value = applyFormVO.value.diagResults
sj.value = applyFormVO.value.examDescription
notes.value = applyFormVO.value.notes
calculateAge(applyFormVO.value.birthday)
if (applyFormVO.value.reportstatus == '已分检' || applyFormVO.value.reportstatus == '待分析') {
savedisabled.value = false
} else {
savedisabled.value = true
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
// 使v-print
const PrintForm = () => {
// window.print()
//
emit('success')
}
//
const getlogininfo = async () => {
Profilevo.value = await getUserProfile()
console.log('审核是否可见' + Profilevo.value.isexamine)
if (Profilevo.value.isexamine === '1') {
examinedisabled.value = true
}
}
/** 重置表单 */
const resetForm = () => {
applyFormVO.value = {} as PatientexamlistVO
pid = ''
strzdjl = ''
strsj = ''
activeName.value = 'first'
updateexamineimage.value = []
selectTree.value = ''
treeData.value = []
privateData.value = []
fordevicemData.value = []
fordevicemValue.value = ''
upFJApplyformVO.value = []
formRef.value?.resetFields()
orgId.value = ''
regId.value = ''
}
</script>
<style>
.my-container {
height: 100vh;
width: 100vw;
}
/* 报告区域 左侧模版选择字体大小 */
.treeStyle {
font-size: 20px;
}
/* 分割线内部的间距 */
.el-divider--horizontal {
margin: 6px;
}
/* 阴性 阳性 */
.radio-group-wrapper {
display: flex;
justify-content: flex-end;
margin-top: 10px; /* 调整上方外边距 */
margin-right: 33px;
}
/* 诊断医生等样式 */
.form-row {
display: flex;
justify-content: space-around; /* 将元素左右对齐 */
margin-top: 10px;
}
</style>

View File

@ -395,10 +395,8 @@
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<PatientexamlistForm ref="formRef" @success="getList" />
<!-- 表单弹窗超声组件 -->
<Ultrasonic ref="ultrasonic" @success="getList" />
<!-- 表单弹窗影像组件 -->
<DicomViewForm ref="dicomViewRef" @success="getList" />
</template>
<script setup lang="ts">
@ -406,7 +404,7 @@ import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { PatientexamlistApi, PatientexamlistVO } from '@/api/tblist/patientexamlist'
import PatientexamlistForm from './PatientexamlistForm.vue'
import Ultrasonic from '/src/views/ultrasoniccom/ultrasonicForm.vue'
import DicomViewForm from '/src/views/dicomForm/dicomViewForm.vue'
/** PACS检查列表 列表 */
defineOptions({ name: 'Patientexamlist' })
@ -447,19 +445,18 @@ const queryParams = reactive({
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 超声组件 */
const ultrasonic = ref()
const openultrForm = (id: number, orgid: string, regid: string) => {
ultrasonic.value.open(id, orgid, regid)
/** 影像组件 */
const dicomViewRef = ref()
const opendicomViewFrom= (id: number, orgid: string, regid: string) => {
dicomViewRef.value.open(id, orgid, regid)
}
/** 表格行点击 */
const clickNumber = ref(0)
function handleEdit(row) {
console.log(111111121212)
openultrForm(row.id, row.orgId, row.regId)
if(row.deviceType!="US")//US
{
openultrForm(row.id,row.orgId,row.regId)
opendicomViewFrom(row.id,row.orgId,row.regId)
}

View File

@ -27,11 +27,11 @@
<el-option label="体检" value="体检模版" />
</el-select>
<el-tabs type="border-card" style="height: calc(100% - 32px)">
<el-tabs type="border-card" style="height: calc(100% - 32px); ">
<el-tab-pane label="通用模版">
<!-- -->
<el-tree
style="min-width: 195px"
style="min-width: 195px;"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
@ -75,20 +75,20 @@
v-model="activeName"
class="demo-tabs"
type="border-card"
style="height: 100%"
style="height: 1020px"
@tab-change="handleTabChange"
>
<el-tab-pane label="用户信息" name="first">
<div class="my-app-container">
<el-tab-pane label="用户信息" name="first" >
<div class="my-app-container" >
<el-form
:model="applyFormVO"
label-width="auto"
style="max-width: 900px"
style="max-width: 900px;"
:inline="true"
>
<el-row>
<el-col :span="7">
<el-form-item label="检查号" style="font-weight: bold">
<el-form-item label="检查号" style="font-weight: bold;">
<el-input
v-model="applyFormVO.examId"
style="width: 190px"
@ -97,12 +97,12 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="姓名" style="font-weight: bold">
<el-form-item label="姓名" style="font-weight: bold;">
<el-input v-model="applyFormVO.pname" style="width: 190px" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="性别" style="font-weight: bold">
<el-form-item label="性别" style="font-weight: bold;">
<el-input
v-model="applyFormVO.gender"
style="width: 190px"
@ -177,39 +177,86 @@
<el-divider />
<!--图片显示区域-->
<div class="demo-image">
<el-button
type="danger"
circle
style="width: 21px; height: 21px"
@click="deleteimage('1')"
:icon="Delete"
v-if="isImageLoaded"
/>
<el-card style="max-width: 180px">
<el-image
style="width: 100px; height: 100px"
:src="selecteimagedone"
fit="fill"
fit="cover"
:preview-src-list="[selecteimagedone]"
@load="handleLoad('1')"
@error="handleError('1')"
@dblclick="deleteimage('1')"
/>
>
<template #error>
<div class="image-error">
<!-- <span>自定义加载失败提示</span> -->
</div>
</template>
</el-image>
</el-card>
<el-button
type="danger"
circle
style="width: 21px; height: 21px"
@click="deleteimage('2')"
:icon="Delete"
v-if="isImageLoaded2"
/>
<el-card style="max-width: 180px">
<el-image
style="width: 100px; height: 100px"
:src="selecteimagedtwo"
:preview-src-list="[selecteimagedtwo]"
fit="fill"
@dblclick="deleteimage('2')"
/>
@load="handleLoad('2')"
@error="handleError('2')"
>
<template #error>
<div class="image-error">
<!-- <span>自定义加载失败提示</span> -->
</div>
</template>
</el-image>
</el-card>
<el-button
type="danger"
circle
style="width: 21px; height: 21px"
@click="deleteimage('3')"
:icon="Delete"
v-if="isImageLoaded3"
/>
<el-card style="max-width: 180px">
<el-image
style="width: 100px; height: 100px"
:src="selecteimagedthree"
:preview-src-list="[selecteimagedthree]"
fit="fill"
@dblclick="deleteimage('3')"
/>
@load="handleLoad('3')"
@error="handleError('3')"
>
<template #error>
<div class="image-error">
<!-- <span>自定义加载失败提示</span> -->
</div>
</template>
</el-image>
</el-card>
</div>
<el-divider />
<label style="text-align: center; font-size: 17px; font-weight: bold">检查所见</label>
<el-input
v-model="sj"
style="width: 100%"
:rows="8"
style="width: 100%;font-size:19px;"
:rows="5"
type="textarea"
placeholder="检查所见"
/>
@ -217,14 +264,14 @@
<label style="font-size: 17px; font-weight: bold">诊断结论</label>
<el-input
v-model="zdjl"
style="width: 100%"
:rows="8"
style="width: 100%;font-size:19px;"
:rows="5"
type="textarea"
placeholder="诊断结论"
/>
<el-divider />
<label style="font-size: 17px; font-weight: bold">报告备注</label>
<el-input v-model="notes" style="width: 100%" placeholder="" />
<el-input v-model="notes" style="width: 100%;font-size:19px;" placeholder="" />
<el-radio-group
v-model="radio1"
size="small"
@ -272,9 +319,9 @@
>审核</el-button
>
</el-tab-pane>
<el-tab-pane label="报告" name="report">
<el-tab-pane label="报告" name="report" >
<!--报告区域-->
<div class="flex-center" id="printMe" style="height: 100%">
<div class="flex-center" id="printMe" style="height: calc(100% - 15px)">
<div class="ultrasound-report" id="PDF">
<h2>超声检查报告单</h2>
<hr />
@ -334,7 +381,7 @@
</el-tab-pane>
</el-tabs>
</div>
<div class="my-right" style="border: 1px solid #dcdfe6; height: 100%">
<div class="my-right" style="border: 1px solid #dcdfe6; height: 1020px">
<!--图片区域-->
<div style="width: 100%">
<el-button
@ -351,7 +398,7 @@
type="primary"
plain
style="width: 100%"
@click="getimages"
@click="getimages('')"
:disabled="savedisabled"
>图像刷新</el-button
>
@ -396,7 +443,7 @@ import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
import { getNowDateTimeS } from '@/utils/formatTime'
import print from 'vue3-print-nb'
import htmlToPdf from '@/utils/htmlPdf'
import { Check, Delete, Edit, Message, Search, Star } from '@element-plus/icons-vue'
/** 超声组件 */
defineOptions({ name: 'Ultrasonic' })
@ -410,6 +457,48 @@ const formLoading = ref(false) // 表单的加载中1修改时的数据加
const examineFormVO = ref<PatientexamlistVO>({} as PatientexamlistVO)
const savedisabled = ref(true) //
const examinedisabled = ref(false) //
const isImageLoaded = ref(false) //
const isImageLoaded2 = ref(false) //
const isImageLoaded3 = ref(false) //
//
const handleLoad = (id: string) => {
if (applyFormVO.value.reportstatus == '已分析' || applyFormVO.value.reportstatus == '已审核') {
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
}
else
{
switch (id) {
case '1':
isImageLoaded.value = true
break
case '2':
isImageLoaded2.value = true
break
case '3':
isImageLoaded3.value = true
break
}
}
}
const handleError = (id: string) => {
switch (id) {
case '1':
isImageLoaded.value = false
break
case '2':
isImageLoaded2.value = false
break
case '3':
isImageLoaded3.value = false
break
}
}
//使
const clickuptime = async (pid: string) => {
await ultrasoniccomApi.upreporttemplatetime(pid)
@ -476,6 +565,10 @@ const save = async () => {
console.log('data:', response.data)
// ID
getPatientexamlist(ID)
//
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
emit('success')
} else {
//
@ -533,11 +626,35 @@ const images = ref<any[]>([])
//
const reportimages = ref<any[]>([])
//
const getimages = async () => {
const imageslist = await ultrasoniccomApi.getimageslist(orgId.value, regId.value, '')
const getimages = async (type:string) => {
const imageslist = await ultrasoniccomApi.getimageslist(orgId.value, regId.value, type)
console.log(imageslist)
images.value = imageslist
}
//
const loadimage =async () => {
if (applyFormVO.value.reportstatus == '已分析' || applyFormVO.value.reportstatus == '已审核') {
const imageslist = await ultrasoniccomApi.getimageslist(orgId.value, regId.value, '1')
if (imageslist.length > 0) {
imageslist.forEach((image, index) => {
switch (index) {
case 0:
selecteimagedone.value = image.imgUrl
break
case 1:
selecteimagedtwo.value = image.imgUrl
break
case 2:
selecteimagedthree.value = image.imgUrl
break
}
})
}
}
}
//
const selectImage = (imageUrl: string, id: number) => {
console.log(imageUrl)
console.log(id)
@ -750,6 +867,7 @@ const orgId = ref('')
//regid
const regId = ref('')
/** 打开弹窗 */
const open = async (id: number, orgid: string, regid: string) => {
resetForm()
@ -782,6 +900,7 @@ const open = async (id: number, orgid: string, regid: string) => {
//
getlogininfo()
} finally {
formLoading.value = false
}
@ -800,6 +919,8 @@ const getPatientexamlist = async (id: number) => {
if (applyFormVO.value.reportstatus == '已分检' || applyFormVO.value.reportstatus == '待分析') {
savedisabled.value = false
} else {
//
loadimage()
savedisabled.value = true
}
}
@ -817,7 +938,7 @@ const PrintForm = () => {
//
const getlogininfo = async () => {
Profilevo.value = await getUserProfile()
console.log("审核是否可见"+Profilevo.value.isexamine)
console.log('审核是否可见' + Profilevo.value.isexamine)
if (Profilevo.value.isexamine === '1') {
examinedisabled.value = true
}
@ -873,22 +994,29 @@ const chooseImage = (event, id: number) => {
<style>
.my-container {
display: flex;
height: 1200px;
height: calc(100% - 40px);
}
.my-container * {
font-size: 15px;
/* .my-container * {
font-size: 16px;
} */
/* 给 my-left 内的元素一个特定的类名 */
.my-container .my-left .treeStyle {
font-size: 19px; /* 或者你想要的字体大小 */
}
.my-left {
width: 20%;
background: lightblue;
height: 1020px;
}
.my-middle {
width: 60%;
margin-left: 2px;
background: rgb(238, 240, 238);
height: calc(100% - 60px);
}
.my-right {
@ -897,20 +1025,15 @@ const chooseImage = (event, id: number) => {
display: flex;
flex-direction: column;
align-items: flex-start;
height: 1016px;
}
.custom-dialog {
width: 1500px; /* 设置宽度 */
height: 1100px; /* 设置高度 */
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
padding: 10px;
}
.my-app-container {
display: flex;
justify-content: center;
align-items: center;
}
.demo-image {
@ -928,6 +1051,7 @@ const chooseImage = (event, id: number) => {
}
/* 右侧图片列表样式 */
.image-container {
overflow-y: auto;
/* 添加一些外边距来控制图像容器与周围元素之间的间距 */
margin-top: 20px;
margin-bottom: 20px;
@ -948,7 +1072,7 @@ const chooseImage = (event, id: number) => {
.image-item {
/* 可选:设置图像的宽度和高度 */
width: 80%;
height: 80%;
height: auto;
cursor: pointer;
transition: transform 0.3s ease; /* 添加过渡效果 */
}
@ -988,7 +1112,7 @@ const chooseImage = (event, id: number) => {
border: 1px solid #ccc;
border-radius: 8px;
position: relative;
height: 900px;
height: 800px;
}
.ultrasound-report h1,
@ -1041,4 +1165,15 @@ const chooseImage = (event, id: number) => {
font-size: 40px; /* 自定义图标大小 */
color: red; /* 自定义图标颜色 */
}
/* 用户、报告 */
.el-tabs__content
{
height: 970px;
}
.el-divider--horizontal
{
margin: 16px;
}
</style>