Merge branch 'uat'
# Conflicts: # src/api/trials.js # src/permission.js # src/utils/uploadZip.js # src/views/login/index.vueuat_us
commit
ba1ba68c78
10
.env.usa
10
.env.usa
|
@ -2,28 +2,28 @@
|
||||||
ENV = 'usa'
|
ENV = 'usa'
|
||||||
NODE_ENV = 'usa'
|
NODE_ENV = 'usa'
|
||||||
# base public path
|
# base public path
|
||||||
VUE_APP_BASE_PATH = 'https://ei-code-prod.s3.amazonaws.com/2024-07-10/'
|
VUE_APP_BASE_PATH = 'https://ei-code-prod.s3.amazonaws.com/2024-07-12/'
|
||||||
|
|
||||||
# 是否开启登陆限制 true:是 false:否
|
# 是否开启登陆限制 true:是 false:否
|
||||||
VUE_APP_LOGIN_FOR_PERMISSION = false
|
VUE_APP_LOGIN_FOR_PERMISSION = true
|
||||||
|
|
||||||
# 是否开启长时间无操作锁定弹框MFA验证 true:是 false:否
|
# 是否开启长时间无操作锁定弹框MFA验证 true:是 false:否
|
||||||
VUE_APP_LOCK_FOR_PERMISSION_MFA = true
|
VUE_APP_LOCK_FOR_PERMISSION_MFA = true
|
||||||
|
|
||||||
# 是否开启长时间无操作锁定弹框 true:是 false:否
|
# 是否开启长时间无操作锁定弹框 true:是 false:否
|
||||||
VUE_APP_LOCK_FOR_PERMISSION = false
|
VUE_APP_LOCK_FOR_PERMISSION = true
|
||||||
|
|
||||||
# 无操作锁定弹框判断时间 单位:秒
|
# 无操作锁定弹框判断时间 单位:秒
|
||||||
VUE_APP_LOCK_FOR_TIME = 900
|
VUE_APP_LOCK_FOR_TIME = 900
|
||||||
|
|
||||||
# 是否开启长时间无操作登出 true:是 false:否
|
# 是否开启长时间无操作登出 true:是 false:否
|
||||||
VUE_APP_LOGOUT_FOR_PERMISSION = false
|
VUE_APP_LOGOUT_FOR_PERMISSION = true
|
||||||
|
|
||||||
# 无操作锁定弹框判断时间 单位:秒
|
# 无操作锁定弹框判断时间 单位:秒
|
||||||
VUE_APP_LOGOUT_FOR_TIME = 1800
|
VUE_APP_LOGOUT_FOR_TIME = 1800
|
||||||
|
|
||||||
# 是否开启密码正则验证 true:是 false:否
|
# 是否开启密码正则验证 true:是 false:否
|
||||||
VUE_APP_PASSWORD_FOR_PERMISSION = false
|
VUE_APP_PASSWORD_FOR_PERMISSION = true
|
||||||
|
|
||||||
# 是否开启密码正则验证 true:是 false:否
|
# 是否开启密码正则验证 true:是 false:否
|
||||||
VUE_APP_PASSWORD_FOR_REGULAR = ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[-_.@^+\$!%#*?&\$~])[A-Za-z0-9-~_.@^+\$~!%#*?&]{8,32}$
|
VUE_APP_PASSWORD_FOR_REGULAR = ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[-_.@^+\$!%#*?&\$~])[A-Za-z0-9-~_.@^+\$~!%#*?&]{8,32}$
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
# just a flag
|
||||||
|
ENV = 'usa'
|
||||||
|
NODE_ENV = 'usa'
|
||||||
|
# base public path
|
||||||
|
VUE_APP_BASE_PATH = 'https://ei-med-s3-code.s3.amazonaws.com/2024-07-11/'
|
||||||
|
|
||||||
|
# 是否开启登陆限制 true:是 false:否
|
||||||
|
VUE_APP_LOGIN_FOR_PERMISSION = true
|
||||||
|
|
||||||
|
# 是否开启长时间无操作锁定弹框MFA验证 true:是 false:否
|
||||||
|
VUE_APP_LOCK_FOR_PERMISSION_MFA = true
|
||||||
|
|
||||||
|
# 是否开启长时间无操作锁定弹框 true:是 false:否
|
||||||
|
VUE_APP_LOCK_FOR_PERMISSION = true
|
||||||
|
|
||||||
|
# 无操作锁定弹框判断时间 单位:秒
|
||||||
|
VUE_APP_LOCK_FOR_TIME = 900
|
||||||
|
|
||||||
|
# 是否开启长时间无操作登出 true:是 false:否
|
||||||
|
VUE_APP_LOGOUT_FOR_PERMISSION = true
|
||||||
|
|
||||||
|
# 无操作锁定弹框判断时间 单位:秒
|
||||||
|
VUE_APP_LOGOUT_FOR_TIME = 1800
|
||||||
|
|
||||||
|
# 是否开启密码正则验证 true:是 false:否
|
||||||
|
VUE_APP_PASSWORD_FOR_PERMISSION = true
|
||||||
|
|
||||||
|
# 是否开启密码正则验证 true:是 false:否
|
||||||
|
VUE_APP_PASSWORD_FOR_REGULAR = ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[-_.@^+\$!%#*?&\$~])[A-Za-z0-9-~_.@^+\$~!%#*?&]{8,32}$
|
||||||
|
|
||||||
|
# 是否开启文档签署验证 true:是 false:否
|
||||||
|
VUE_APP_WORD_FOR_PERMISSION = true
|
||||||
|
|
||||||
|
# 公司名称
|
||||||
|
VUE_APP_COMPANY_NAME = "Elevate Imaging"
|
||||||
|
|
||||||
|
# dicom文件地址
|
||||||
|
VUE_APP_DICOM_PATH = 'https://zyypacs-usa.oss-us-west-1.aliyuncs.com'
|
||||||
|
|
||||||
|
VUE_APP_DICOM_USA_PATH = 'https://zyypacs-usa.oss-us-west-1.aliyuncs.com'
|
||||||
|
|
||||||
|
VUE_APP_OSS_CONFIG_REGION = 'oss-us-west-1'
|
||||||
|
|
||||||
|
VUE_APP_OSS_CONFIG_BUCKET = 'zyypacs-usa'
|
||||||
|
|
||||||
|
VUE_APP_OSS_PATH = '/usa/dist'
|
|
@ -10,51 +10,20 @@ clone:
|
||||||
disable: true #禁用默认克隆
|
disable: true #禁用默认克隆
|
||||||
|
|
||||||
server:
|
server:
|
||||||
host: 106.14.89.110
|
host: 47.117.164.182
|
||||||
user: root
|
user: root
|
||||||
password:
|
password:
|
||||||
from_secret: local_pwd
|
from_secret: local_pwd
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: publish-test-irc-vue
|
- name: uat-branch-publish-irc-vue
|
||||||
commands:
|
commands:
|
||||||
- echo start publish test-irc-vue
|
- cd /opt/1panel/vue-devops/Uat_IRC/Uat-To-Uat
|
||||||
- cd /opt/1panel/hang/vue/test-irc
|
- sh uat-to-uat.sh v${DRONE_BUILD_NUMBER}
|
||||||
- sh test-irc.sh v${DRONE_BUILD_NUMBER}
|
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
branch:
|
branch:
|
||||||
- main
|
- uat
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
kind: pipeline
|
|
||||||
type: ssh
|
|
||||||
name: ssh-linux-test-study-publish
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: Linux
|
|
||||||
arch: 386
|
|
||||||
|
|
||||||
clone:
|
|
||||||
disable: true #禁用默认克隆
|
|
||||||
|
|
||||||
server:
|
|
||||||
host: 106.14.89.110
|
|
||||||
user: root
|
|
||||||
password:
|
|
||||||
from_secret: local_pwd
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: publish-test-study
|
|
||||||
commands:
|
|
||||||
- echo start publish test-study-api
|
|
||||||
- cd /opt/1panel/hang/devops/test-study
|
|
||||||
- sh test-study.sh v${DRONE_BUILD_NUMBER}
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
branch:
|
|
||||||
- Test.Study
|
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
"build:prod": "vue-cli-service build --mode prod",
|
"build:prod": "vue-cli-service build --mode prod",
|
||||||
"build:uat": "vue-cli-service build --mode uat",
|
"build:uat": "vue-cli-service build --mode uat",
|
||||||
"build:usa": "vue-cli-service build --mode usa",
|
"build:usa": "vue-cli-service build --mode usa",
|
||||||
|
"build:usa_prod": "vue-cli-service build --mode usa_prod",
|
||||||
"pre": "vue-cli-service build --mode pre",
|
"pre": "vue-cli-service build --mode pre",
|
||||||
"i18n": "npm run i18n:zh && npm run i18n:en",
|
"i18n": "npm run i18n:zh && npm run i18n:en",
|
||||||
"i18n:zh": "node i18nGenerate.js lang=zh keyCol=5 valCol=6",
|
"i18n:zh": "node i18nGenerate.js lang=zh keyCol=5 valCol=6",
|
||||||
|
|
23
src/App.vue
23
src/App.vue
|
@ -89,6 +89,7 @@ import {
|
||||||
batchAddOrUpdateFrontInternationalization,
|
batchAddOrUpdateFrontInternationalization,
|
||||||
getFrontInternationalizationList,
|
getFrontInternationalizationList,
|
||||||
} from "@/api/dictionary/dictionary";
|
} from "@/api/dictionary/dictionary";
|
||||||
|
import { getTrialExtralConfig } from "@/api/trials";
|
||||||
import Vue from "vue";
|
import Vue from "vue";
|
||||||
import i18n from "./lang";
|
import i18n from "./lang";
|
||||||
export default {
|
export default {
|
||||||
|
@ -105,6 +106,28 @@ export default {
|
||||||
mounted() {
|
mounted() {
|
||||||
this.show = process.env.VUE_APP_OSS_PATH === "/test/dist";
|
this.show = process.env.VUE_APP_OSS_PATH === "/test/dist";
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
"$route.query": {
|
||||||
|
async handler() {
|
||||||
|
if (
|
||||||
|
this.$route.query.trialId &&
|
||||||
|
this.$route.query.trialId !== this.$store.state.trials.config.trialId
|
||||||
|
) {
|
||||||
|
let res = await getTrialExtralConfig({
|
||||||
|
TrialId: this.$route.query.trialId,
|
||||||
|
});
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
this.$store.dispatch("trials/setConfig", {
|
||||||
|
trialId: this.$route.query.trialId,
|
||||||
|
...res.Result,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
immediate: true,
|
||||||
|
deep: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
changeValue(target, attr, e) {
|
changeValue(target, attr, e) {
|
||||||
this.$set(target, attr, e);
|
this.$set(target, attr, e);
|
||||||
|
|
|
@ -171,3 +171,19 @@ export function getCustomTag(param) {
|
||||||
data: param
|
data: param
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function clearSkipReadingCache(param) {
|
||||||
|
return request({
|
||||||
|
url: `/ReadingImageTask/clearSkipReadingCache`,
|
||||||
|
method: 'post',
|
||||||
|
data: param
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setSkipReadingCache(param) {
|
||||||
|
return request({
|
||||||
|
url: `/ReadingImageTask/setSkipReadingCache`,
|
||||||
|
method: 'post',
|
||||||
|
data: param
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -3723,6 +3723,14 @@ export function getTrialDicomAE(params) {
|
||||||
params
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 获取项目配置
|
||||||
|
export function getTrialExtralConfig(params) {
|
||||||
|
return request({
|
||||||
|
url: `/TrialConfig/getTrialExtralConfig`,
|
||||||
|
method: 'get',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
// 项目新增或修改dicomAE配置
|
// 项目新增或修改dicomAE配置
|
||||||
export function addOrUpdateDicomAE(data) {
|
export function addOrUpdateDicomAE(data) {
|
||||||
return request({
|
return request({
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 39 KiB |
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 98 KiB |
|
@ -0,0 +1,52 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="_图层_2" data-name="图层 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 454.72 126.1">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #0093dd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #5b5b5b;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g id="_图层_1-2" data-name="图层 1">
|
||||||
|
<g>
|
||||||
|
<path class="cls-1" d="m162.51,68.1h14.37c5.59,0,9.79,4.03,8.73,8.37l-1.38,5.61h-44.66c-2.41,0-4.3-.44-5.66-1.32-1.36-.82-1.84-2.17-1.42-4.06L148.68,6.71c.52-1.95,1.97-3.56,4.32-4.82,2.36-1.26,5.16-1.89,8.41-1.89h16.82l-15.72,68.1Z"/>
|
||||||
|
<path class="cls-1" d="m204.2,25.41c.52-1.76,1.86-3.21,4.01-4.34,2.15-1.13,4.69-1.7,7.62-1.7h15.88l-11.32,49.4c-.94,3.97-3.83,7.19-8.64,9.68-4.82,2.49-10.43,3.73-16.82,3.73h-3.61l12.89-56.77ZM219.29.38h17.6l-2.04,8.78c-.42,1.26-1.36,2.28-2.83,3.07-1.47.79-3.2,1.18-5.19,1.18h-19.02l1.89-8.12c.31-1.45,1.39-2.63,3.22-3.54,1.83-.91,3.95-1.37,6.36-1.37Z"/>
|
||||||
|
<path class="cls-1" d="m262.55,68.1h14.37c5.59,0,9.79,4.03,8.73,8.37l-1.38,5.61h-44.66c-2.41,0-4.3-.44-5.66-1.32-1.36-.82-1.84-2.17-1.42-4.06L248.72,6.71c.52-1.95,1.97-3.56,4.32-4.82,2.36-1.26,5.16-1.89,8.41-1.89h16.82l-15.72,68.1Z"/>
|
||||||
|
<path class="cls-1" d="m304.25,25.41c.52-1.76,1.86-3.21,4.01-4.34,2.15-1.13,4.69-1.7,7.62-1.7h15.88l-11.32,49.4c-.94,3.97-3.83,7.19-8.64,9.68-4.82,2.49-10.43,3.73-16.82,3.73h-3.61l12.89-56.77ZM319.33.38h17.6l-2.04,8.78c-.42,1.26-1.36,2.28-2.83,3.07-1.47.79-3.2,1.18-5.19,1.18h-19.02l1.89-8.12c.31-1.45,1.39-2.63,3.22-3.54,1.83-.91,3.95-1.37,6.36-1.37Z"/>
|
||||||
|
<g>
|
||||||
|
<path class="cls-2" d="m0,101.17h2.51v19.36H0v-19.36Z"/>
|
||||||
|
<path class="cls-2" d="m28.37,110.12v10.4h-2.4v-9.54c0-2.31-.64-3.65-2.9-3.65-1.76,0-3.26.5-3.91,2.65v10.54h-2.4v-9.54c0-2.31-.56-3.65-2.76-3.65-1.87,0-3.24.42-3.99,2.73v10.46h-2.4v-15.06h2.4v1.98c.92-1.79,2.54-2.26,4.35-2.26,2.37,0,3.74.95,4.38,2.45.89-1.95,2.84-2.45,4.69-2.45,3.51,0,4.94,2.04,4.94,4.94Z"/>
|
||||||
|
<path class="cls-2" d="m45.28,109.84v10.68h-2.04l-.36-2.29c-.86,1.65-3.12,2.57-5.38,2.57-3.6,0-5.19-1.65-5.19-4.49,0-3.57,2.37-4.8,5.97-4.8h4.6v-1.26c0-1.81-.64-3.07-3.71-3.07-1,0-2.23.11-3.32.33v-2.12c1.12-.14,2.34-.22,3.43-.22,4.74,0,6,1.95,6,4.66Zm-2.4,6.08v-2.48h-4.43c-2.48,0-3.65.5-3.65,2.85,0,1.65.81,2.51,2.93,2.51,2.51,0,4.38-1.09,5.16-2.87Z"/>
|
||||||
|
<path class="cls-2" d="m63.05,105.46v14c0,4.16-2.26,6.64-7.36,6.64-1.28,0-2.71-.17-3.65-.36v-2.04c1.14.22,2.4.33,3.68.33,3.35,0,4.94-1.37,4.94-4.83v-1.51c-.61,1.76-1.98,2.82-4.88,2.82-5.02,0-6.25-3.07-6.25-7.67,0-4.16,1.23-7.67,6.25-7.67,3.04,0,4.29,1.31,4.88,3.1v-2.82h2.4Zm-2.32,7.39c0-3.46-1-5.66-4.63-5.66s-4.02,2.73-4.02,5.66c0,3.15.47,5.66,4.02,5.66s4.63-2.06,4.63-5.66Z"/>
|
||||||
|
<path class="cls-2" d="m67.9,101.28c0-1.26.39-1.42,1.45-1.42,1,0,1.42.17,1.42,1.42s-.42,1.42-1.42,1.42c-1.06,0-1.45-.2-1.45-1.42Zm.22,4.18h2.4v15.06h-2.4v-15.06Z"/>
|
||||||
|
<path class="cls-2" d="m87.87,110.09v10.43h-2.43v-9.54c0-2.31-.47-3.65-2.87-3.65-1.9,0-3.74.36-4.57,3.01v10.18h-2.4v-15.06h2.4v2.15c.92-1.92,2.98-2.43,4.83-2.43,3.93,0,5.05,2.04,5.05,4.91Z"/>
|
||||||
|
<path class="cls-2" d="m105.5,105.46v14c0,4.16-2.26,6.64-7.36,6.64-1.28,0-2.71-.17-3.65-.36v-2.04c1.14.22,2.4.33,3.68.33,3.35,0,4.94-1.37,4.94-4.83v-1.51c-.61,1.76-1.98,2.82-4.88,2.82-5.02,0-6.25-3.07-6.25-7.67,0-4.16,1.23-7.67,6.25-7.67,3.04,0,4.29,1.31,4.88,3.1v-2.82h2.4Zm-2.32,7.39c0-3.46-1-5.66-4.63-5.66s-4.02,2.73-4.02,5.66c0,3.15.47,5.66,4.02,5.66s4.63-2.06,4.63-5.66Z"/>
|
||||||
|
<path class="cls-2" d="m129.47,103.4h-5.63v17.13h-2.51v-17.13h-5.66v-2.23h13.81v2.23Z"/>
|
||||||
|
<path class="cls-2" d="m138.31,105.18l-.08,2.18h-.33c-1.92,0-3.82.64-4.66,3.32v9.85h-2.4v-15.06h2.4v2.73c.95-2.51,2.98-3.01,4.8-3.01h.28Z"/>
|
||||||
|
<path class="cls-2" d="m141.19,101.28c0-1.26.39-1.42,1.45-1.42,1,0,1.42.17,1.42,1.42s-.42,1.42-1.42,1.42c-1.06,0-1.45-.2-1.45-1.42Zm.22,4.18h2.4v15.06h-2.4v-15.06Z"/>
|
||||||
|
<path class="cls-2" d="m160.85,109.84v10.68h-2.04l-.36-2.29c-.86,1.65-3.12,2.57-5.38,2.57-3.6,0-5.19-1.65-5.19-4.49,0-3.57,2.37-4.8,5.97-4.8h4.6v-1.26c0-1.81-.64-3.07-3.71-3.07-1,0-2.23.11-3.32.33v-2.12c1.12-.14,2.34-.22,3.43-.22,4.74,0,6,1.95,6,4.66Zm-2.4,6.08v-2.48h-4.43c-2.48,0-3.65.5-3.65,2.85,0,1.65.81,2.51,2.93,2.51,2.51,0,4.38-1.09,5.16-2.87Z"/>
|
||||||
|
<path class="cls-2" d="m165.96,117.48v-18.16h2.4v17.54c0,1.51.42,1.81,1.39,1.81.33,0,.75-.03,1.14-.14v1.98c-.45.11-.92.17-1.59.17-2.23,0-3.35-.95-3.35-3.21Z"/>
|
||||||
|
<path class="cls-2" d="m181.13,101.17h4.02l4.94,12.47h.17l4.94-12.47h3.96v19.36h-2.51v-16.82h-.17l-4.96,12.44h-2.73l-5.02-12.44h-.17v16.82h-2.45v-19.36Z"/>
|
||||||
|
<path class="cls-2" d="m216.23,109.84v10.68h-2.04l-.36-2.29c-.86,1.65-3.12,2.57-5.38,2.57-3.6,0-5.19-1.65-5.19-4.49,0-3.57,2.37-4.8,5.97-4.8h4.6v-1.26c0-1.81-.64-3.07-3.71-3.07-1,0-2.23.11-3.32.33v-2.12c1.12-.14,2.34-.22,3.43-.22,4.74,0,6,1.95,6,4.66Zm-2.4,6.08v-2.48h-4.43c-2.48,0-3.65.5-3.65,2.85,0,1.65.81,2.51,2.93,2.51,2.51,0,4.38-1.09,5.16-2.87Z"/>
|
||||||
|
<path class="cls-2" d="m233.61,110.09v10.43h-2.43v-9.54c0-2.31-.47-3.65-2.87-3.65-1.9,0-3.74.36-4.57,3.01v10.18h-2.4v-15.06h2.4v2.15c.92-1.92,2.98-2.43,4.83-2.43,3.93,0,5.05,2.04,5.05,4.91Z"/>
|
||||||
|
<path class="cls-2" d="m250.54,109.84v10.68h-2.04l-.36-2.29c-.86,1.65-3.12,2.57-5.38,2.57-3.6,0-5.19-1.65-5.19-4.49,0-3.57,2.37-4.8,5.97-4.8h4.6v-1.26c0-1.81-.64-3.07-3.71-3.07-1,0-2.23.11-3.32.33v-2.12c1.12-.14,2.34-.22,3.43-.22,4.74,0,6,1.95,6,4.66Zm-2.4,6.08v-2.48h-4.43c-2.48,0-3.65.5-3.65,2.85,0,1.65.81,2.51,2.93,2.51,2.51,0,4.38-1.09,5.16-2.87Z"/>
|
||||||
|
<path class="cls-2" d="m268.31,105.46v14c0,4.16-2.26,6.64-7.36,6.64-1.28,0-2.71-.17-3.65-.36v-2.04c1.14.22,2.4.33,3.68.33,3.35,0,4.94-1.37,4.94-4.83v-1.51c-.61,1.76-1.98,2.82-4.88,2.82-5.02,0-6.25-3.07-6.25-7.67,0-4.16,1.23-7.67,6.25-7.67,3.04,0,4.29,1.31,4.88,3.1v-2.82h2.4Zm-2.32,7.39c0-3.46-1-5.66-4.63-5.66s-4.02,2.73-4.02,5.66c0,3.15.47,5.66,4.02,5.66s4.63-2.06,4.63-5.66Z"/>
|
||||||
|
<path class="cls-2" d="m285.22,113.24l-10.21.64c.03,3.29,1.17,4.8,4.83,4.8,1.65,0,3.57-.42,4.71-.98v2.2c-.86.45-2.93.89-5.08.89-4.44,0-6.97-1.81-6.97-7.81s2.54-7.81,6.83-7.81c5.13,0,6.02,3.38,6.02,6.3,0,.42-.06,1.06-.14,1.76Zm-2.23-1.73c0-2.32-.39-4.35-3.65-4.35-3.46,0-4.24,1.87-4.32,4.94l7.98-.59Z"/>
|
||||||
|
<path class="cls-2" d="m310.27,110.12v10.4h-2.4v-9.54c0-2.31-.64-3.65-2.9-3.65-1.76,0-3.26.5-3.91,2.65v10.54h-2.4v-9.54c0-2.31-.56-3.65-2.76-3.65-1.87,0-3.24.42-3.99,2.73v10.46h-2.4v-15.06h2.4v1.98c.92-1.79,2.54-2.26,4.35-2.26,2.37,0,3.74.95,4.38,2.45.89-1.95,2.84-2.45,4.69-2.45,3.51,0,4.94,2.04,4.94,4.94Z"/>
|
||||||
|
<path class="cls-2" d="m327.03,113.24l-10.21.64c.03,3.29,1.17,4.8,4.83,4.8,1.65,0,3.57-.42,4.71-.98v2.2c-.86.45-2.93.89-5.08.89-4.44,0-6.97-1.81-6.97-7.81s2.54-7.81,6.83-7.81c5.13,0,6.03,3.38,6.03,6.3,0,.42-.06,1.06-.14,1.76Zm-2.23-1.73c0-2.32-.39-4.35-3.65-4.35-3.46,0-4.24,1.87-4.32,4.94l7.98-.59Z"/>
|
||||||
|
<path class="cls-2" d="m343.6,110.09v10.43h-2.43v-9.54c0-2.31-.47-3.65-2.87-3.65-1.9,0-3.74.36-4.57,3.01v10.18h-2.4v-15.06h2.4v2.15c.92-1.92,2.98-2.43,4.83-2.43,3.93,0,5.05,2.04,5.05,4.91Z"/>
|
||||||
|
<path class="cls-2" d="m354.9,118.52v2.04c-.59.08-1.06.14-1.7.14-3.32,0-4.52-.81-4.52-4.77v-8.45h-2.23v-2.01h2.23v-3.57h2.4v3.57h3.74v2.01h-3.74v8.31c0,2.34.33,2.9,2.18,2.9.67,0,1.12-.06,1.65-.17Z"/>
|
||||||
|
<path class="cls-2" d="m364.19,120.05v-2.32c1.14.42,3.46.86,5.75.86,2.9,0,4.41-.86,4.41-3.26s-.84-3.01-4.46-3.88c-3.96-.95-5.41-1.92-5.41-5.36s2.06-5.24,6.44-5.24c1.87,0,3.93.33,4.85.7v2.29c-1.12-.42-3.07-.78-4.83-.78-2.71,0-3.99.53-3.99,3.04,0,1.81.47,2.45,3.96,3.26,4.32,1,5.88,2.15,5.88,5.94s-2.4,5.49-6.86,5.49c-2.4,0-4.8-.42-5.75-.75Z"/>
|
||||||
|
<path class="cls-2" d="m379.71,124.04c2.62,0,3.68-1.12,4.43-3.54l-6.02-15.03h2.59l4.6,12.5h.17l4.35-12.5h2.43l-5.41,14.56c-1.42,3.77-2.71,6.08-7.14,6.08v-2.06Z"/>
|
||||||
|
<path class="cls-2" d="m394.18,120.22v-2.06c1.06.31,2.98.59,4.35.59,2.29,0,3.49-.56,3.49-2.31s-.5-2.15-3.38-2.82c-3.32-.75-4.21-1.81-4.21-4.35s1.84-4.07,5.41-4.07c1.45,0,3.07.22,3.79.5l-.17,2.04c-.86-.33-2.2-.59-3.6-.59-2.12,0-3.18.47-3.18,2.18,0,1.53.53,1.87,2.87,2.4,3.46.78,4.71,1.73,4.71,4.63s-2.04,4.35-5.72,4.35c-1.45,0-3.54-.22-4.38-.47Z"/>
|
||||||
|
<path class="cls-2" d="m414.77,118.52v2.04c-.59.08-1.06.14-1.7.14-3.32,0-4.52-.81-4.52-4.77v-8.45h-2.23v-2.01h2.23v-3.57h2.4v3.57h3.74v2.01h-3.74v8.31c0,2.34.33,2.9,2.18,2.9.67,0,1.12-.06,1.65-.17Z"/>
|
||||||
|
<path class="cls-2" d="m429.67,113.24l-10.21.64c.03,3.29,1.17,4.8,4.83,4.8,1.65,0,3.57-.42,4.71-.98v2.2c-.86.45-2.93.89-5.08.89-4.44,0-6.97-1.81-6.97-7.81s2.54-7.81,6.83-7.81c5.13,0,6.02,3.38,6.02,6.3,0,.42-.06,1.06-.14,1.76Zm-2.23-1.73c0-2.32-.39-4.35-3.65-4.35-3.46,0-4.24,1.87-4.32,4.94l7.98-.59Z"/>
|
||||||
|
<path class="cls-2" d="m454.72,110.12v10.4h-2.4v-9.54c0-2.31-.64-3.65-2.9-3.65-1.76,0-3.26.5-3.91,2.65v10.54h-2.4v-9.54c0-2.31-.56-3.65-2.76-3.65-1.87,0-3.24.42-3.99,2.73v10.46h-2.4v-15.06h2.4v1.98c.92-1.79,2.54-2.26,4.35-2.26,2.37,0,3.74.95,4.38,2.45.89-1.95,2.84-2.45,4.69-2.45,3.51,0,4.94,2.04,4.94,4.94Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.8 KiB |
|
@ -12,7 +12,7 @@ NProgress.configure({ showSpinner: false })
|
||||||
|
|
||||||
const whiteList = ['/ReviewersResearch', '/login', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/researchLogin_m', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms']
|
const whiteList = ['/ReviewersResearch', '/login', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/researchLogin_m', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms']
|
||||||
|
|
||||||
router.beforeEach(async(to, from, next) => {
|
router.beforeEach(async (to, from, next) => {
|
||||||
NProgress.start()
|
NProgress.start()
|
||||||
// 设置页面标题
|
// 设置页面标题
|
||||||
// document.title = getPageTitle(to.meta.title)
|
// document.title = getPageTitle(to.meta.title)
|
||||||
|
@ -81,7 +81,7 @@ router.beforeEach(async(to, from, next) => {
|
||||||
next(`/ReviewersResearch?`)
|
next(`/ReviewersResearch?`)
|
||||||
NProgress.done()
|
NProgress.done()
|
||||||
} else {
|
} else {
|
||||||
// 其他无权访问的页面将重定向到登录页面。
|
// 其他无权访问的页面将重定向到登录页面。
|
||||||
next(`/login?`)
|
next(`/login?`)
|
||||||
NProgress.done()
|
NProgress.done()
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ const getDefaultState = () => {
|
||||||
visitPointQuery: null,
|
visitPointQuery: null,
|
||||||
studyListQuery: null,
|
studyListQuery: null,
|
||||||
unlock: false,
|
unlock: false,
|
||||||
|
config: {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,6 +21,9 @@ const mutations = {
|
||||||
SET_UNLOCK: (state, unlock) => {
|
SET_UNLOCK: (state, unlock) => {
|
||||||
state.unlock = unlock
|
state.unlock = unlock
|
||||||
},
|
},
|
||||||
|
SET_CONFIG: (state, config) => {
|
||||||
|
state.config = config
|
||||||
|
},
|
||||||
SET_ACTIVENAME: (state, activeName) => {
|
SET_ACTIVENAME: (state, activeName) => {
|
||||||
state.trialDetailActiveName = activeName
|
state.trialDetailActiveName = activeName
|
||||||
},
|
},
|
||||||
|
@ -44,6 +48,9 @@ const actions = {
|
||||||
setUnLock({ commit }, unlock) {
|
setUnLock({ commit }, unlock) {
|
||||||
commit('SET_UNLOCK', unlock)
|
commit('SET_UNLOCK', unlock)
|
||||||
},
|
},
|
||||||
|
setConfig({ commit }, config) {
|
||||||
|
commit('SET_CONFIG', config)
|
||||||
|
},
|
||||||
setActiveName({ commit }, activeName) {
|
setActiveName({ commit }, activeName) {
|
||||||
commit('SET_ACTIVENAME', activeName)
|
commit('SET_ACTIVENAME', activeName)
|
||||||
},
|
},
|
||||||
|
|
|
@ -60,12 +60,14 @@ export const anonymization = function (file, config) {
|
||||||
const blob = new Blob([bufferArray], { type: 'application/octet-stream' })
|
const blob = new Blob([bufferArray], { type: 'application/octet-stream' })
|
||||||
resolve({ blob, pixelDataElement })
|
resolve({ blob, pixelDataElement })
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
console.log(file, 'warning')
|
||||||
console.log(err)
|
console.log(err)
|
||||||
resolve(false);
|
resolve(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
reader.readAsArrayBuffer(file);
|
reader.readAsArrayBuffer(file);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
console.log(file, 'warning')
|
||||||
console.log(e)
|
console.log(e)
|
||||||
reject(e)
|
reject(e)
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ export const dcmUpload = async function (name, file, config) {
|
||||||
|
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
console.log(file, 'warning')
|
||||||
resolve(false)
|
resolve(false)
|
||||||
console.log(e)
|
console.log(e)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,8 @@ const OSS = require('ali-oss')
|
||||||
const router = require('@/router');
|
const router = require('@/router');
|
||||||
const Minio = require('minio')
|
const Minio = require('minio')
|
||||||
const stream = require('stream')
|
const stream = require('stream')
|
||||||
console.log(Minio)
|
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
const { GenerateSTS, GetObjectStoreToken } = require('../api/user.js')
|
const { GetObjectStoreToken } = require('../api/user.js')
|
||||||
import { getToken } from '@/utils/auth'
|
|
||||||
|
|
||||||
Vue.prototype.OSSclientConfig = {
|
Vue.prototype.OSSclientConfig = {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,115 @@
|
||||||
|
import JSZip from "jszip";
|
||||||
|
import { saveAs } from "file-saver";
|
||||||
|
import Vue from 'vue';
|
||||||
|
import {
|
||||||
|
requestPackageAndAnonymizImage,
|
||||||
|
} from "@/api/load.js";
|
||||||
import streamSaver from "streamsaver";
|
import streamSaver from "streamsaver";
|
||||||
import "streamsaver/examples/zip-stream.js"
|
import "streamsaver/examples/zip-stream.js"
|
||||||
export const downloadImage = (zipName, files) => {
|
let flag = {};
|
||||||
|
export const downloadImage = async (id, id2, IsDicom = true) => {
|
||||||
|
if (flag[`${id2}_${IsDicom}`]) return
|
||||||
|
flag[`${id2}_${IsDicom}`] = true
|
||||||
|
try {
|
||||||
|
let params = {
|
||||||
|
TrialId: id,
|
||||||
|
SubjectVisitId: id2,
|
||||||
|
IsDicom: IsDicom
|
||||||
|
}
|
||||||
|
let res = await requestPackageAndAnonymizImage(params);
|
||||||
|
flag[`${id2}_${IsDicom}`] = false;
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
if (!res.Result) {
|
||||||
|
Vue.prototype.$message.warning(Vue.prototype.$t("trials:upload:message:not"))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
let a = document.createElement("a");
|
||||||
|
let href = Vue.prototype.OSSclientConfig.basePath + res.Result;
|
||||||
|
// let fileName =
|
||||||
|
// res.Result.split("/")[res.Result.split("/").length - 1];
|
||||||
|
a.download = res.OtherInfo.fileName;
|
||||||
|
a.href = href;
|
||||||
|
a.click();
|
||||||
|
URL.revokeObjectURL(href);
|
||||||
|
let timer = setTimeout(() => {
|
||||||
|
a = null;
|
||||||
|
href = null;
|
||||||
|
timer = null;
|
||||||
|
}, 500)
|
||||||
|
return 2;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
flag[`${id2}_${IsDicom}`] = false;
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const setfolder = async (item) => {
|
||||||
|
const zip = new JSZip(); // 创建实例对象
|
||||||
|
let patientIds = item.PatientList.map(i => i.PatientIdStr);
|
||||||
|
let zipName = `${item.SubjectCode}_${patientIds.join(',')}`;
|
||||||
|
let zipObj = {};
|
||||||
|
const promises = [];
|
||||||
|
for (let visit of item.VisitList) {
|
||||||
|
if (!zipObj[`${visit.VisitName}`]) {
|
||||||
|
zipObj[`${visit.VisitName}`] = zip.folder(visit.VisitName);
|
||||||
|
}
|
||||||
|
for (let study of visit.StudyList) {
|
||||||
|
let date = study.StudyTime.split(" ")[0];
|
||||||
|
for (let series of study.SeriesList) {
|
||||||
|
if (
|
||||||
|
!zipObj[
|
||||||
|
`${visit.VisitName}${series.Modality}`
|
||||||
|
]
|
||||||
|
) {
|
||||||
|
zipObj[
|
||||||
|
`${visit.VisitName}${series.Modality}`
|
||||||
|
] = zipObj[`${visit.VisitName}`].folder(
|
||||||
|
`${date}_${series.Modality}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
for (let instance of series.InstancePathList) {
|
||||||
|
let obj = {
|
||||||
|
subjectCode: item.SubjectCode,
|
||||||
|
visitName: visit.VisitName,
|
||||||
|
date: study.StudyTime.split(" ")[0],
|
||||||
|
modality: series.Modality,
|
||||||
|
instancePath: instance.Path,
|
||||||
|
dicomName: instance.Path.split("/Dicom/")[1],
|
||||||
|
};
|
||||||
|
const promise = handleBatchDown(
|
||||||
|
obj,
|
||||||
|
zipObj[
|
||||||
|
`${visit.VisitName}${series.Modality}`
|
||||||
|
],
|
||||||
|
);
|
||||||
|
promises.push(promise);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 生成 zip 文件
|
||||||
|
Promise.all(promises)
|
||||||
|
.then(() => {
|
||||||
|
// 生成zip 文件
|
||||||
|
zip
|
||||||
|
.generateAsync({
|
||||||
|
type: "blob",
|
||||||
|
compression: "DEFLATE", // STORE: 默认不压缩, DEFLATE:需要压缩
|
||||||
|
compressionOptions: {
|
||||||
|
level: 9, // 压缩等级 1~9 1 压缩速度最快, 9 最优压缩方式
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
saveAs(res, zipName + ".zip"); // 使用FileSaver.saveAs保存文件,文件名可自定义
|
||||||
|
flag[`${id2}_${IsDicom}`] = false;
|
||||||
|
zipObj = null;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch((reason) => { flag[`${id2}_${IsDicom}`] = false; });
|
||||||
|
};
|
||||||
|
const handleBatchDown = async (item, zip) => {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
console.log("同步下载打包开始时间:" + new Date());
|
console.log("同步下载打包开始时间:" + new Date());
|
||||||
// 创建压缩文件输出流
|
// 创建压缩文件输出流
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
>
|
>
|
||||||
<svg-icon
|
<svg-icon
|
||||||
icon-class="login-bg"
|
icon-class="login-bg"
|
||||||
style="width: 450px; height: 450px"
|
style="width: 90%; height: 90%"
|
||||||
v-if="NODE_ENV === 'usa'"
|
v-if="NODE_ENV === 'usa'"
|
||||||
/>
|
/>
|
||||||
<img src="@/assets/login-bg.png" v-else />
|
<img src="@/assets/login-bg.png" v-else />
|
||||||
|
@ -213,8 +213,6 @@ import TopLang from "./topLang";
|
||||||
import Vcode from "vue-puzzle-vcode";
|
import Vcode from "vue-puzzle-vcode";
|
||||||
import browserTip from "@/views/dictionary/template/browser/tip.vue";
|
import browserTip from "@/views/dictionary/template/browser/tip.vue";
|
||||||
import Img1 from "@/assets/pic-2.png";
|
import Img1 from "@/assets/pic-2.png";
|
||||||
import loginBg from "@/assets/icons/svg/login-bg.svg";
|
|
||||||
import loginLogo from "@/assets/icons/svg/login-logo.svg";
|
|
||||||
export default {
|
export default {
|
||||||
name: "Login",
|
name: "Login",
|
||||||
components: { TopLang, Vcode, browserTip },
|
components: { TopLang, Vcode, browserTip },
|
||||||
|
@ -258,8 +256,6 @@ export default {
|
||||||
isShow: false,
|
isShow: false,
|
||||||
showCode: false,
|
showCode: false,
|
||||||
Img1,
|
Img1,
|
||||||
loginBg,
|
|
||||||
loginLogo,
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -410,7 +406,7 @@ export default {
|
||||||
/* 修复input 背景不协调 和光标变色 */
|
/* 修复input 背景不协调 和光标变色 */
|
||||||
|
|
||||||
$bg: #283443;
|
$bg: #283443;
|
||||||
$light_gray: #606266;
|
$light_gray: #909399;
|
||||||
$cursor: #fff;
|
$cursor: #fff;
|
||||||
|
|
||||||
// @supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
|
// @supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
|
||||||
|
@ -517,7 +513,7 @@ $light_gray: #606266;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: flex-end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.login-r {
|
.login-r {
|
||||||
|
@ -540,7 +536,7 @@ $light_gray: #606266;
|
||||||
.title-container {
|
.title-container {
|
||||||
// margin-bottom: 50px;
|
// margin-bottom: 50px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-top: 18%;
|
margin-top: 20%;
|
||||||
.title {
|
.title {
|
||||||
font-size: 35px;
|
font-size: 35px;
|
||||||
color: $light_gray;
|
color: $light_gray;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="notice-marquee_wrapper">
|
<div class="notice-marquee_wrapper">
|
||||||
<marquee ref="mar" hspace="0" direction="left" width="500" @mouseout="start()" @mouseover="stop()">
|
<marquee ref="mar" hspace="0" direction="left" width="100%" @mouseout="start()" @mouseover="stop()">
|
||||||
<!-- <i class="el-icon-message-solid" /> -->
|
<!-- <i class="el-icon-message-solid" /> -->
|
||||||
<svg-icon v-if="noticeList.length > 0" icon-class="speaker" />
|
<svg-icon v-if="noticeList.length > 0" icon-class="speaker" />
|
||||||
<span v-for="item in noticeList" :key="item.Id" style="cursor:pointer;" @click="showDetail(item)">
|
<span v-for="item in noticeList" :key="item.Id" style="cursor:pointer;" @click="showDetail(item)">
|
||||||
|
@ -70,6 +70,7 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.notice-marquee_wrapper{
|
.notice-marquee_wrapper{
|
||||||
|
width: 100%;
|
||||||
/deep/ .el-dialog__header{
|
/deep/ .el-dialog__header{
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -277,6 +277,9 @@ export default {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.center-menu {
|
||||||
|
width: calc(100% - 1200px);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<style>
|
<style>
|
||||||
|
|
|
@ -36,13 +36,13 @@
|
||||||
sortable="custom"
|
sortable="custom"
|
||||||
/>
|
/>
|
||||||
<!-- 中文名 -->
|
<!-- 中文名 -->
|
||||||
<el-table-column
|
<!-- <el-table-column
|
||||||
prop="BlindNameCN"
|
prop="BlindNameCN"
|
||||||
:label="$t('trials:spmEnroll:table:blindNameCN')"
|
:label="$t('trials:spmEnroll:table:blindNameCN')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
min-width="120"
|
min-width="120"
|
||||||
sortable="custom"
|
sortable="custom"
|
||||||
/>
|
/> -->
|
||||||
<!-- 专业 -->
|
<!-- 专业 -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="SpecialityId"
|
prop="SpecialityId"
|
||||||
|
|
|
@ -31,13 +31,13 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- Name CN -->
|
<!-- Name CN -->
|
||||||
<el-table-column
|
<!-- <el-table-column
|
||||||
prop="ChineseName"
|
prop="ChineseName"
|
||||||
:label="$t('trials:seletctedReviews:table:nameCN')"
|
:label="$t('trials:seletctedReviews:table:nameCN')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
min-width="120"
|
min-width="120"
|
||||||
sortable="custom"
|
sortable="custom"
|
||||||
/>
|
/> -->
|
||||||
<!-- ID -->
|
<!-- ID -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="Code"
|
prop="Code"
|
||||||
|
|
|
@ -42,13 +42,13 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- Name CN -->
|
<!-- Name CN -->
|
||||||
<el-table-column
|
<!-- <el-table-column
|
||||||
prop="ChineseName"
|
prop="ChineseName"
|
||||||
:label="$t('trials:seletctedReviews:table:nameCN')"
|
:label="$t('trials:seletctedReviews:table:nameCN')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
min-width="120"
|
min-width="120"
|
||||||
sortable="custom"
|
sortable="custom"
|
||||||
/>
|
/> -->
|
||||||
<!-- ID -->
|
<!-- ID -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="Code"
|
prop="Code"
|
||||||
|
|
|
@ -146,13 +146,13 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- Name CN -->
|
<!-- Name CN -->
|
||||||
<el-table-column
|
<!-- <el-table-column
|
||||||
prop="ChineseName"
|
prop="ChineseName"
|
||||||
:label="$t('trials:seletctedReviews:table:nameCN')"
|
:label="$t('trials:seletctedReviews:table:nameCN')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
sortable="custom"
|
sortable="custom"
|
||||||
width="120"
|
width="120"
|
||||||
/>
|
/> -->
|
||||||
|
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="DoctorUserName"
|
prop="DoctorUserName"
|
||||||
|
|
|
@ -52,13 +52,13 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- Name CN -->
|
<!-- Name CN -->
|
||||||
<el-table-column
|
<!-- <el-table-column
|
||||||
prop="ChineseName"
|
prop="ChineseName"
|
||||||
:label="$t('trials:seletctedReviews:table:nameCN')"
|
:label="$t('trials:seletctedReviews:table:nameCN')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
sortable="custom"
|
sortable="custom"
|
||||||
min-width="120"
|
min-width="120"
|
||||||
/>
|
/> -->
|
||||||
<!-- ID -->
|
<!-- ID -->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="Code"
|
prop="Code"
|
||||||
|
|
|
@ -227,21 +227,14 @@
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
<el-dialog
|
|
||||||
append-to-body
|
|
||||||
:visible.sync="imgVisible"
|
|
||||||
width="600px"
|
|
||||||
>
|
|
||||||
<!-- <img width="100%" :src="imageUrl" alt="图片未找到"> -->
|
|
||||||
<el-image :src="imageUrl" width="100%" crossorigin="anonymous">
|
|
||||||
<div slot="placeholder" class="image-slot">
|
|
||||||
{{ $t('trials:adReview:title:loading') }}<span class="dot">...</span>
|
|
||||||
</div>
|
|
||||||
</el-image>
|
|
||||||
</el-dialog>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item v-if="adInfo.ReadingTaskState < 2">
|
<el-form-item v-if="adInfo.ReadingTaskState < 2">
|
||||||
<div style="text-align:center;">
|
<div style="text-align:center;">
|
||||||
|
<el-button type="primary" @click="skipTask">
|
||||||
|
<!-- 跳过 -->
|
||||||
|
{{ $t('trials:readingReport:button:skip') }}
|
||||||
|
</el-button>
|
||||||
<!-- 保存 -->
|
<!-- 保存 -->
|
||||||
<el-button type="primary" @click="handleSave">{{ $t('common:button:save') }}</el-button>
|
<el-button type="primary" @click="handleSave">{{ $t('common:button:save') }}</el-button>
|
||||||
<!-- 提交 -->
|
<!-- 提交 -->
|
||||||
|
@ -310,6 +303,9 @@
|
||||||
</div>
|
</div>
|
||||||
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
|
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
<viewer v-if="imgVisible" :images="[imageUrl]" ref="viewer">
|
||||||
|
<img :src="imageUrl" crossorigin="anonymous" alt="">
|
||||||
|
</viewer>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
|
@ -317,12 +313,14 @@ import { getJudgeReadingInfo,
|
||||||
// uploadJudgeTaskImage,
|
// uploadJudgeTaskImage,
|
||||||
saveJudgeVisitTaskResult, submitJudgeVisitTaskResult, getReadingPastResultList } from '@/api/trials'
|
saveJudgeVisitTaskResult, submitJudgeVisitTaskResult, getReadingPastResultList } from '@/api/trials'
|
||||||
import { getAutoCutNextTask } from '@/api/user'
|
import { getAutoCutNextTask } from '@/api/user'
|
||||||
|
import { setSkipReadingCache } from '@/api/reading'
|
||||||
import const_ from '@/const/sign-code'
|
import const_ from '@/const/sign-code'
|
||||||
import { getToken } from '@/utils/auth'
|
import { getToken } from '@/utils/auth'
|
||||||
import SignForm from '@/views/trials/components/newSignForm'
|
import SignForm from '@/views/trials/components/newSignForm'
|
||||||
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { changeURLStatic } from '@/utils/history.js'
|
import { changeURLStatic } from '@/utils/history.js'
|
||||||
|
import Viewer from 'v-viewer'
|
||||||
export default {
|
export default {
|
||||||
name: 'AdReview',
|
name: 'AdReview',
|
||||||
components: { SignForm },
|
components: { SignForm },
|
||||||
|
@ -390,7 +388,7 @@ export default {
|
||||||
judgeResultArmEnum: '',
|
judgeResultArmEnum: '',
|
||||||
criterionType: null,
|
criterionType: null,
|
||||||
openWindow: null,
|
openWindow: null,
|
||||||
isFixed:false
|
isFixed: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// watch: {
|
// watch: {
|
||||||
|
@ -407,6 +405,7 @@ export default {
|
||||||
// }
|
// }
|
||||||
// },
|
// },
|
||||||
mounted() {
|
mounted() {
|
||||||
|
this.initializeViewer()
|
||||||
this.criterionType = parseInt(this.$route.query.criterionType)
|
this.criterionType = parseInt(this.$route.query.criterionType)
|
||||||
this.getAdInfo()
|
this.getAdInfo()
|
||||||
if (this.isReadingShowPreviousResults) {
|
if (this.isReadingShowPreviousResults) {
|
||||||
|
@ -710,12 +709,40 @@ export default {
|
||||||
handlePictureCardPreview(file) {
|
handlePictureCardPreview(file) {
|
||||||
this.imageUrl = this.OSSclientConfig.basePath + file.url
|
this.imageUrl = this.OSSclientConfig.basePath + file.url
|
||||||
this.imgVisible = true
|
this.imgVisible = true
|
||||||
|
this.$refs.viewer.$viewer.show()
|
||||||
},
|
},
|
||||||
// 删除图片
|
// 删除图片
|
||||||
handleRemove(file, fileList) {
|
handleRemove(file, fileList) {
|
||||||
var idx = this.fileList.findIndex(i => i.url === file.url)
|
var idx = this.fileList.findIndex(i => i.url === file.url)
|
||||||
if (idx === -1) return
|
if (idx === -1) return
|
||||||
this.fileList.splice(idx, 1)
|
this.fileList.splice(idx, 1)
|
||||||
|
},
|
||||||
|
async skipTask() {
|
||||||
|
try {
|
||||||
|
// 是否确认跳过?
|
||||||
|
const confirm = await this.$confirm(
|
||||||
|
this.$t('trials:readingReport:message:skipConfirm'),
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (confirm !== 'confirm') return
|
||||||
|
this.loading = true
|
||||||
|
const res = await setSkipReadingCache({ visitTaskId: this.visitTaskId })
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
window.location.reload()
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initializeViewer() {
|
||||||
|
Viewer.setDefaults({
|
||||||
|
toolbar: { zoomIn: true, zoomOut: true, rotateLeft: true, rotateRight: true, flipHorizontal: true, flipVertical: true }
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,15 @@
|
||||||
style="margin-right:5px;"
|
style="margin-right:5px;"
|
||||||
@change="handleShowDetail"
|
@change="handleShowDetail"
|
||||||
/>
|
/>
|
||||||
|
<el-button
|
||||||
|
v-if="readingTaskState<2"
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
@click="skipTask"
|
||||||
|
>
|
||||||
|
<!-- 跳过 -->
|
||||||
|
{{ $t('trials:readingReport:button:skip') }}
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-if="readingTaskState<2"
|
v-if="readingTaskState<2"
|
||||||
type="primary"
|
type="primary"
|
||||||
|
@ -172,8 +181,7 @@
|
||||||
@change="evaluateReasonChange"
|
@change="evaluateReasonChange"
|
||||||
/>
|
/>
|
||||||
<!-- 系统评估结果为:xxx,与当前调整的结果不一致,请填写调整原因 -->
|
<!-- 系统评估结果为:xxx,与当前调整的结果不一致,请填写调整原因 -->
|
||||||
<p v-if="currentEvaluateResult !== tumorEvaluate" style="width: 140px;padding:0 2px;white-space: normal;word-break: break-all;word-wrap: break-word;" v-html="getWarningText()">
|
<p v-if="currentEvaluateResult !== tumorEvaluate" style="width: 140px;padding:0 2px;white-space: normal;word-break: break-all;word-wrap: break-word;" v-html="getWarningText()" />
|
||||||
</p>
|
|
||||||
<p v-else-if="currentExistDisease !== isExistDisease" style="width: 140px;padding:0 2px;white-space: normal;word-break: break-all;word-wrap: break-word;">{{ $t('trials:readingReport:title:sysEvaluationRes') }}<span style="color:red">{{ $fd('ExistDisease',isExistDisease) }}</span>{{ $t('trials:readingReport:message:msg1') }}
|
<p v-else-if="currentExistDisease !== isExistDisease" style="width: 140px;padding:0 2px;white-space: normal;word-break: break-all;word-wrap: break-word;">{{ $t('trials:readingReport:title:sysEvaluationRes') }}<span style="color:red">{{ $fd('ExistDisease',isExistDisease) }}</span>{{ $t('trials:readingReport:message:msg1') }}
|
||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
|
@ -262,6 +270,7 @@
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getReadingReportEvaluation, changeDicomReadingQuestionAnswer, submitDicomVisitTask, verifyVisitTaskQuestions, getTaskAdditionalQuestion } from '@/api/trials'
|
import { getReadingReportEvaluation, changeDicomReadingQuestionAnswer, submitDicomVisitTask, verifyVisitTaskQuestions, getTaskAdditionalQuestion } from '@/api/trials'
|
||||||
|
import { setSkipReadingCache } from '@/api/reading'
|
||||||
import { getAutoCutNextTask } from '@/api/user'
|
import { getAutoCutNextTask } from '@/api/user'
|
||||||
import DicomEvent from './DicomEvent'
|
import DicomEvent from './DicomEvent'
|
||||||
import const_ from '@/const/sign-code'
|
import const_ from '@/const/sign-code'
|
||||||
|
@ -816,14 +825,36 @@ export default {
|
||||||
var sysRes = ''
|
var sysRes = ''
|
||||||
var curRes = ''
|
var curRes = ''
|
||||||
if (this.CriterionType === 2) {
|
if (this.CriterionType === 2) {
|
||||||
sysRes = this.$fd('ImagingOverallAssessment_Lugano',this.tumorEvaluate)
|
sysRes = this.$fd('ImagingOverallAssessment_Lugano', this.tumorEvaluate)
|
||||||
curRes = this.$fd('ImagingOverallAssessment_Lugano',this.currentEvaluateResult)
|
curRes = this.$fd('ImagingOverallAssessment_Lugano', this.currentEvaluateResult)
|
||||||
} else {
|
} else {
|
||||||
sysRes = this.$fd('OverallAssessment',this.tumorEvaluate)
|
sysRes = this.$fd('OverallAssessment', this.tumorEvaluate)
|
||||||
curRes = this.$fd('OverallAssessment',this.currentEvaluateResult)
|
curRes = this.$fd('OverallAssessment', this.currentEvaluateResult)
|
||||||
}
|
}
|
||||||
let msg = this.$t('trials:readingReport:message:msg9').replace('xxx','<font color="red">' + sysRes + '</font>').replace('yyy','<font color="red">' + curRes + '</font>')
|
const msg = this.$t('trials:readingReport:message:msg9').replace('xxx', '<font color="red">' + sysRes + '</font>').replace('yyy', '<font color="red">' + curRes + '</font>')
|
||||||
return msg
|
return msg
|
||||||
|
},
|
||||||
|
async skipTask() {
|
||||||
|
try {
|
||||||
|
// 是否确认跳过?
|
||||||
|
const confirm = await this.$confirm(
|
||||||
|
this.$t('trials:readingReport:message:skipConfirm'),
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (confirm !== 'confirm') return
|
||||||
|
this.loading = true
|
||||||
|
const res = await setSkipReadingCache({ visitTaskId: this.visitTaskId })
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
window.location.reload()
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,15 @@
|
||||||
style="margin-right:5px"
|
style="margin-right:5px"
|
||||||
@change="handleShowDetail"
|
@change="handleShowDetail"
|
||||||
/>
|
/>
|
||||||
|
<el-button
|
||||||
|
v-if="readingTaskState<2"
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
@click="skipTask"
|
||||||
|
>
|
||||||
|
<!-- 跳过 -->
|
||||||
|
{{ $t('trials:readingReport:button:skip') }}
|
||||||
|
</el-button>
|
||||||
<el-button v-if="readingTaskState<2" type="primary" size="small" @click="getReportInfo">{{$t('trials:readingReport:button:refresh')}}</el-button>
|
<el-button v-if="readingTaskState<2" type="primary" size="small" @click="getReportInfo">{{$t('trials:readingReport:button:refresh')}}</el-button>
|
||||||
<el-button v-if="readingTaskState<2" type="primary" size="small" @click="handleSave(true)">{{$t('common:button:save')}}</el-button>
|
<el-button v-if="readingTaskState<2" type="primary" size="small" @click="handleSave(true)">{{$t('common:button:save')}}</el-button>
|
||||||
<el-button v-if="readingTaskState<2" type="primary" size="small" @click="handleConfirm">{{$t('common:button:submit')}}</el-button>
|
<el-button v-if="readingTaskState<2" type="primary" size="small" @click="handleConfirm">{{$t('common:button:submit')}}</el-button>
|
||||||
|
@ -260,6 +269,7 @@
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { changeCalculationAnswer, getReadingReportEvaluation, changeDicomReadingQuestionAnswer, submitDicomVisitTask, verifyVisitTaskQuestions, getQuestionCalculateRelation } from '@/api/trials'
|
import { changeCalculationAnswer, getReadingReportEvaluation, changeDicomReadingQuestionAnswer, submitDicomVisitTask, verifyVisitTaskQuestions, getQuestionCalculateRelation } from '@/api/trials'
|
||||||
|
import { setSkipReadingCache } from '@/api/reading'
|
||||||
import DicomEvent from './../components/DicomEvent'
|
import DicomEvent from './../components/DicomEvent'
|
||||||
import CustomizeReportPageUpload from './CustomizeReportPageUpload'
|
import CustomizeReportPageUpload from './CustomizeReportPageUpload'
|
||||||
import const_ from '@/const/sign-code'
|
import const_ from '@/const/sign-code'
|
||||||
|
@ -828,6 +838,28 @@ export default {
|
||||||
reject()
|
reject()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
async skipTask() {
|
||||||
|
try {
|
||||||
|
// 是否确认跳过?
|
||||||
|
const confirm = await this.$confirm(
|
||||||
|
this.$t('trials:readingReport:message:skipConfirm'),
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (confirm !== 'confirm') return
|
||||||
|
this.loading = true
|
||||||
|
const res = await setSkipReadingCache({ visitTaskId: this.visitTaskId })
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
window.location.reload()
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,14 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if=" readingTaskState < 2" style="text-align:right;margin:5px 0;">
|
<div v-if=" readingTaskState < 2" style="text-align:right;margin:5px 0;">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
@click="skipTask"
|
||||||
|
>
|
||||||
|
<!-- 跳过 -->
|
||||||
|
{{ $t('trials:readingReport:button:skip') }}
|
||||||
|
</el-button>
|
||||||
<el-button size="small" type="primary" @click="handleSave">
|
<el-button size="small" type="primary" @click="handleSave">
|
||||||
{{ $t('common:button:save') }}
|
{{ $t('common:button:save') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
|
@ -142,6 +149,7 @@
|
||||||
<script>
|
<script>
|
||||||
import { getGlobalReadingInfo, getReadingPastResultList, submitGlobalReadingInfo, saveGlobalReadingInfo } from '@/api/trials'
|
import { getGlobalReadingInfo, getReadingPastResultList, submitGlobalReadingInfo, saveGlobalReadingInfo } from '@/api/trials'
|
||||||
import { getAutoCutNextTask } from '@/api/user'
|
import { getAutoCutNextTask } from '@/api/user'
|
||||||
|
import { setSkipReadingCache } from '@/api/reading'
|
||||||
import { getToken } from '@/utils/auth'
|
import { getToken } from '@/utils/auth'
|
||||||
import const_ from '@/const/sign-code'
|
import const_ from '@/const/sign-code'
|
||||||
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
||||||
|
@ -377,6 +385,28 @@ export default {
|
||||||
handleSave() {
|
handleSave() {
|
||||||
this.$refs['globalTbl'].handleSave(true)
|
this.$refs['globalTbl'].handleSave(true)
|
||||||
},
|
},
|
||||||
|
async skipTask() {
|
||||||
|
try {
|
||||||
|
// 是否确认跳过?
|
||||||
|
const confirm = await this.$confirm(
|
||||||
|
this.$t('trials:readingReport:message:skipConfirm'),
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (confirm !== 'confirm') return
|
||||||
|
this.loading = true
|
||||||
|
const res = await setSkipReadingCache({ visitTaskId: this.visitTaskId })
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
window.location.reload()
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
},
|
||||||
async handleConfirm() {
|
async handleConfirm() {
|
||||||
// 判断是否存在访视评估结果未确认
|
// 判断是否存在访视评估结果未确认
|
||||||
var idx = this.taskList.findIndex(i => !i.AgreeOrNotAnswer)
|
var idx = this.taskList.findIndex(i => !i.AgreeOrNotAnswer)
|
||||||
|
|
|
@ -29,11 +29,22 @@
|
||||||
{{ $t('trials:medicalFeedback:message:msg2') }}
|
{{ $t('trials:medicalFeedback:message:msg2') }}
|
||||||
<ol>
|
<ol>
|
||||||
<li v-for="file in record.FileList" :key="file.ImagePath" style="list-style: none;">
|
<li v-for="file in record.FileList" :key="file.ImagePath" style="list-style: none;">
|
||||||
<el-button
|
<viewer
|
||||||
type="text"
|
v-if="file.ImagePath"
|
||||||
size="mini"
|
:ref="file.ImagePath"
|
||||||
@click="previewImage(file.ImagePath)"
|
style="margin:0 10px;"
|
||||||
>{{ file.FileName }}</el-button>
|
:images="[`${OSSclientConfig.basePath}${file.ImagePath}`]"
|
||||||
|
>
|
||||||
|
<el-button type="text" @click="previewImage(file.ImagePath)">
|
||||||
|
{{ file.FileName }}
|
||||||
|
</el-button>
|
||||||
|
<img
|
||||||
|
v-show="false"
|
||||||
|
crossorigin="anonymous"
|
||||||
|
:src="`${OSSclientConfig.basePath}${file.ImagePath}`"
|
||||||
|
alt="Image"
|
||||||
|
>
|
||||||
|
</viewer>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
|
@ -97,22 +108,6 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<el-dialog
|
|
||||||
v-if="previewDialog"
|
|
||||||
append-to-body
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
:visible.sync="previewDialog"
|
|
||||||
width="600px"
|
|
||||||
>
|
|
||||||
<!-- <img width="100%" :src="imagePath" alt="图片未找到"> -->
|
|
||||||
<el-image :src="imagePath" crossorigin="anonymous" width="100%">
|
|
||||||
<div slot="placeholder" class="image-slot">
|
|
||||||
<!-- 加载中 -->
|
|
||||||
{{ $t('trials:medicalFeedback:message:loading') }}<span class="dot">...</span>
|
|
||||||
</div>
|
|
||||||
</el-image>
|
|
||||||
|
|
||||||
</el-dialog>
|
|
||||||
|
|
||||||
<el-dialog
|
<el-dialog
|
||||||
v-if="irFeedbackForm.visible"
|
v-if="irFeedbackForm.visible"
|
||||||
|
@ -137,6 +132,7 @@ import { getMedicalReviewDialog } from '@/api/trials'
|
||||||
import FeedbackForm from './FeedbackForm'
|
import FeedbackForm from './FeedbackForm'
|
||||||
import mimAvatar from '@/assets/MIM.png'
|
import mimAvatar from '@/assets/MIM.png'
|
||||||
import irAvatar from '@/assets/IR.png'
|
import irAvatar from '@/assets/IR.png'
|
||||||
|
import Viewer from 'v-viewer'
|
||||||
export default {
|
export default {
|
||||||
name: 'ChatForm',
|
name: 'ChatForm',
|
||||||
components: { FeedbackForm },
|
components: { FeedbackForm },
|
||||||
|
@ -170,6 +166,7 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
this.initializeViewer()
|
||||||
this.getMessageList()
|
this.getMessageList()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -204,6 +201,12 @@ export default {
|
||||||
previewImage(path) {
|
previewImage(path) {
|
||||||
this.imagePath = `${this.OSSclientConfig.basePath}${path}`
|
this.imagePath = `${this.OSSclientConfig.basePath}${path}`
|
||||||
this.previewDialog = true
|
this.previewDialog = true
|
||||||
|
this.$refs[path][0].$viewer.show()
|
||||||
|
},
|
||||||
|
initializeViewer() {
|
||||||
|
Viewer.setDefaults({
|
||||||
|
toolbar: { zoomIn: true, zoomOut: true, rotateLeft: true, rotateRight: true, flipHorizontal: true, flipVertical: true }
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,22 @@
|
||||||
{{ $t('trials:medicalFeedback:message:msg2') }}
|
{{ $t('trials:medicalFeedback:message:msg2') }}
|
||||||
<ol>
|
<ol>
|
||||||
<li v-for="file in record.FileList" :key="file.ImagePath" style="list-style: none;">
|
<li v-for="file in record.FileList" :key="file.ImagePath" style="list-style: none;">
|
||||||
<el-button
|
<viewer
|
||||||
type="text"
|
v-if="file.ImagePath"
|
||||||
size="mini"
|
:ref="file.ImagePath"
|
||||||
@click="previewImage(file.ImagePath)"
|
style="margin:0 10px;"
|
||||||
>{{ file.FileName }}</el-button>
|
:images="[`${OSSclientConfig.basePath}${file.ImagePath}`]"
|
||||||
|
>
|
||||||
|
<el-button type="text" @click="previewImage(file.ImagePath)">
|
||||||
|
{{ file.FileName }}
|
||||||
|
</el-button>
|
||||||
|
<img
|
||||||
|
v-show="false"
|
||||||
|
crossorigin="anonymous"
|
||||||
|
:src="`${OSSclientConfig.basePath}${file.ImagePath}`"
|
||||||
|
alt="Image"
|
||||||
|
>
|
||||||
|
</viewer>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
|
@ -125,19 +136,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-dialog
|
|
||||||
append-to-body
|
|
||||||
:visible.sync="previewDialog"
|
|
||||||
width="600px"
|
|
||||||
>
|
|
||||||
<!-- <img width="100%" :src="imagePath" alt="图片未找到"> -->
|
|
||||||
<el-image :src="OSSclientConfig.basePath + imagePath" width="100%" crossorigin="anonymous">
|
|
||||||
<div slot="placeholder" class="image-slot">
|
|
||||||
{{ $t('trials:medicalFeedback:message:loading') }}<span class="dot">...</span>
|
|
||||||
</div>
|
|
||||||
</el-image>
|
|
||||||
</el-dialog>
|
|
||||||
|
|
||||||
<el-dialog
|
<el-dialog
|
||||||
v-if="irFeedbackForm.visible"
|
v-if="irFeedbackForm.visible"
|
||||||
:visible.sync="irFeedbackForm.visible"
|
:visible.sync="irFeedbackForm.visible"
|
||||||
|
@ -154,6 +152,7 @@
|
||||||
@close="irFeedbackForm.visible = false"
|
@close="irFeedbackForm.visible = false"
|
||||||
/>
|
/>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
|
@ -161,6 +160,7 @@ import { getMedicalReviewDialog, sendMedicalReviewDialog } from '@/api/trials'
|
||||||
import FeedbackForm from '@/views/trials/trials-panel/reading/medical-feedback/components/FeedbackForm'
|
import FeedbackForm from '@/views/trials/trials-panel/reading/medical-feedback/components/FeedbackForm'
|
||||||
import mimAvatar from '@/assets/MIM.png'
|
import mimAvatar from '@/assets/MIM.png'
|
||||||
import irAvatar from '@/assets/IR.png'
|
import irAvatar from '@/assets/IR.png'
|
||||||
|
import Viewer from 'v-viewer'
|
||||||
export default {
|
export default {
|
||||||
name: 'ChatForm',
|
name: 'ChatForm',
|
||||||
components: {
|
components: {
|
||||||
|
@ -196,6 +196,7 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
this.initializeViewer()
|
||||||
this.getMessageList()
|
this.getMessageList()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -242,12 +243,18 @@ export default {
|
||||||
previewImage(path) {
|
previewImage(path) {
|
||||||
this.imagePath = `${path}`
|
this.imagePath = `${path}`
|
||||||
this.previewDialog = true
|
this.previewDialog = true
|
||||||
|
this.$refs[path][0].$viewer.show()
|
||||||
},
|
},
|
||||||
handleIRReply() {
|
handleIRReply() {
|
||||||
// '反馈'
|
// '反馈'
|
||||||
this.irFeedbackForm.title = this.$t('trials:medicalFeedback:title:feedback')
|
this.irFeedbackForm.title = this.$t('trials:medicalFeedback:title:feedback')
|
||||||
|
|
||||||
this.irFeedbackForm.visible = true
|
this.irFeedbackForm.visible = true
|
||||||
|
},
|
||||||
|
initializeViewer() {
|
||||||
|
Viewer.setDefaults({
|
||||||
|
toolbar: { zoomIn: true, zoomOut: true, rotateLeft: true, rotateRight: true, flipHorizontal: true, flipVertical: true }
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,22 +116,23 @@
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
<el-dialog
|
<!-- <el-dialog
|
||||||
append-to-body
|
append-to-body
|
||||||
:visible.sync="imgVisible"
|
:visible.sync="imgVisible"
|
||||||
width="600px"
|
width="600px"
|
||||||
>
|
>
|
||||||
<!-- <img width="100%" :src="imageUrl" alt="图片未找到"> -->
|
|
||||||
<el-image :src="imageUrl" width="100%" crossorigin="anonymous">
|
<el-image :src="imageUrl" width="100%" crossorigin="anonymous">
|
||||||
<div slot="placeholder" class="image-slot">
|
<div slot="placeholder" class="image-slot">
|
||||||
{{ $t('trials:medicalFeedback:message:loading') }}<span class="dot">...</span>
|
{{ $t('trials:medicalFeedback:message:loading') }}<span class="dot">...</span>
|
||||||
</div>
|
</div>
|
||||||
</el-image>
|
</el-image>
|
||||||
</el-dialog>
|
</el-dialog> -->
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
</el-form>
|
</el-form>
|
||||||
|
<viewer v-if="imgVisible" :images="[imageUrl]" ref="viewer">
|
||||||
|
<img :src="imageUrl" crossorigin="anonymous" alt="">
|
||||||
|
</viewer>
|
||||||
<el-dialog
|
<el-dialog
|
||||||
v-if="chatVisible"
|
v-if="chatVisible"
|
||||||
:visible.sync="chatVisible"
|
:visible.sync="chatVisible"
|
||||||
|
@ -170,6 +171,7 @@
|
||||||
import { saveMedicalReviewInfo } from '@/api/trials'
|
import { saveMedicalReviewInfo } from '@/api/trials'
|
||||||
import ChatForm from './ChatForm'
|
import ChatForm from './ChatForm'
|
||||||
import CloseQC from './CloseQC'
|
import CloseQC from './CloseQC'
|
||||||
|
import Viewer from 'v-viewer'
|
||||||
export default {
|
export default {
|
||||||
name: 'AuditConclusions',
|
name: 'AuditConclusions',
|
||||||
components: {
|
components: {
|
||||||
|
@ -224,6 +226,7 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
this.initializeViewer()
|
||||||
this.initForm()
|
this.initForm()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -381,12 +384,18 @@ export default {
|
||||||
handlePictureCardPreview(file) {
|
handlePictureCardPreview(file) {
|
||||||
this.imageUrl = this.OSSclientConfig.basePath + file.url
|
this.imageUrl = this.OSSclientConfig.basePath + file.url
|
||||||
this.imgVisible = true
|
this.imgVisible = true
|
||||||
|
this.$refs.viewer.$viewer.show()
|
||||||
},
|
},
|
||||||
// 删除图片
|
// 删除图片
|
||||||
handleRemove(file, fileList) {
|
handleRemove(file, fileList) {
|
||||||
var idx = this.fileList.findIndex(i => i.url === file.url)
|
var idx = this.fileList.findIndex(i => i.url === file.url)
|
||||||
if (idx === -1) return
|
if (idx === -1) return
|
||||||
this.fileList.splice(idx, 1)
|
this.fileList.splice(idx, 1)
|
||||||
|
},
|
||||||
|
initializeViewer() {
|
||||||
|
Viewer.setDefaults({
|
||||||
|
toolbar: { zoomIn: true, zoomOut: true, rotateLeft: true, rotateRight: true, flipHorizontal: true, flipVertical: true }
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,14 @@
|
||||||
>
|
>
|
||||||
{{ $t('trials:oncologyReview:button:clinicalData') }}
|
{{ $t('trials:oncologyReview:button:clinicalData') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
@click="skipTask"
|
||||||
|
>
|
||||||
|
<!-- 跳过 -->
|
||||||
|
{{ $t('trials:readingReport:button:skip') }}
|
||||||
|
</el-button>
|
||||||
<!-- 保存 -->
|
<!-- 保存 -->
|
||||||
<el-button
|
<el-button
|
||||||
v-if="oncologyInfo.ReadingTaskState < 2"
|
v-if="oncologyInfo.ReadingTaskState < 2"
|
||||||
|
@ -253,6 +261,7 @@
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getOncologyReadingInfo, getReadingPastResultList, setOncologyReadingInfo, submitOncologyReadingInfo } from '@/api/trials'
|
import { getOncologyReadingInfo, getReadingPastResultList, setOncologyReadingInfo, submitOncologyReadingInfo } from '@/api/trials'
|
||||||
|
import { setSkipReadingCache } from '@/api/reading'
|
||||||
import const_ from '@/const/sign-code'
|
import const_ from '@/const/sign-code'
|
||||||
import { getToken } from '@/utils/auth'
|
import { getToken } from '@/utils/auth'
|
||||||
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
||||||
|
@ -554,6 +563,28 @@ export default {
|
||||||
path: `/clinicalData?subjectId=${this.oncologyInfo.SubjectId}&trialId=${this.trialId}&visitTaskId=${this.oncologyInfo.OncologyTaskId}&TokenKey=${token}`
|
path: `/clinicalData?subjectId=${this.oncologyInfo.SubjectId}&trialId=${this.trialId}&visitTaskId=${this.oncologyInfo.OncologyTaskId}&TokenKey=${token}`
|
||||||
})
|
})
|
||||||
window.open(routeData.href, '_blank')
|
window.open(routeData.href, '_blank')
|
||||||
|
},
|
||||||
|
async skipTask() {
|
||||||
|
try {
|
||||||
|
// 是否确认跳过?
|
||||||
|
const confirm = await this.$confirm(
|
||||||
|
this.$t('trials:readingReport:message:skipConfirm'),
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (confirm !== 'confirm') return
|
||||||
|
this.loading = true
|
||||||
|
const res = await setSkipReadingCache({ visitTaskId: this.visitTaskId })
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
window.location.reload()
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -764,8 +764,16 @@ export default {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
confirmSign(type) {
|
confirmSign(type) {
|
||||||
const { HeavyReadingApproval } = const_.processSignature
|
const { HeavyReadingApproval } = const_.processSignature;
|
||||||
this.type = type
|
this.type = type
|
||||||
|
if(type === 2){
|
||||||
|
return this.$refs.reasonForm.validate(validate=>{
|
||||||
|
if(validate){
|
||||||
|
this.signCode = HeavyReadingApproval
|
||||||
|
this.signVisible = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
this.signCode = HeavyReadingApproval
|
this.signCode = HeavyReadingApproval
|
||||||
this.signVisible = true
|
this.signVisible = true
|
||||||
},
|
},
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
v-if="
|
v-if="
|
||||||
(isReadingTaskViewInOrder === 1 ||
|
(isReadingTaskViewInOrder === 1 ||
|
||||||
isReadingTaskViewInOrder === 2) &&
|
isReadingTaskViewInOrder === 2) &&
|
||||||
TrialReadingCriterionId === item.TrialReadingCriterionId
|
TrialReadingCriterionId === item.TrialReadingCriterionId
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<div slot="search-container">
|
<div slot="search-container">
|
||||||
|
@ -75,11 +75,10 @@
|
||||||
scope.row.UrgentColor === 1
|
scope.row.UrgentColor === 1
|
||||||
? 'danger'
|
? 'danger'
|
||||||
: scope.row.UrgentColor === 2
|
: scope.row.UrgentColor === 2
|
||||||
? 'warning'
|
? 'warning'
|
||||||
: 'primary'
|
: 'primary'
|
||||||
"
|
"
|
||||||
>{{ $fd("YesOrNo", scope.row.IsUrgent) }}</el-tag
|
>{{ $fd("YesOrNo", scope.row.IsUrgent) }}</el-tag>
|
||||||
>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 受试者编号 -->
|
<!-- 受试者编号 -->
|
||||||
|
@ -114,11 +113,10 @@
|
||||||
scope.row.UrgentColor === 1
|
scope.row.UrgentColor === 1
|
||||||
? '#F56C6C'
|
? '#F56C6C'
|
||||||
: scope.row.UrgentColor === 2
|
: scope.row.UrgentColor === 2
|
||||||
? '#E6A23C'
|
? '#E6A23C'
|
||||||
: '#409EFF',
|
: '#409EFF',
|
||||||
}"
|
}"
|
||||||
>{{ scope.row.UrgentCount }}</span
|
>{{ scope.row.UrgentCount }}</span>
|
||||||
>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 建议完成时间 -->
|
<!-- 建议完成时间 -->
|
||||||
|
@ -148,8 +146,8 @@
|
||||||
:title="
|
:title="
|
||||||
scope.row.ExistReadingApply
|
scope.row.ExistReadingApply
|
||||||
? $t(
|
? $t(
|
||||||
'trials:pendingReadingTasks:button:ExistReadingApply'
|
'trials:pendingReadingTasks:button:ExistReadingApply'
|
||||||
)
|
)
|
||||||
: $t('trials:pendingReadingTasks:button:review')
|
: $t('trials:pendingReadingTasks:button:review')
|
||||||
"
|
"
|
||||||
icon="el-icon-edit-outline"
|
icon="el-icon-edit-outline"
|
||||||
|
@ -157,12 +155,12 @@
|
||||||
/>
|
/>
|
||||||
<!-- 上传 -->
|
<!-- 上传 -->
|
||||||
<el-button
|
<el-button
|
||||||
v-hasPermi="['role:ir']"
|
|
||||||
v-if="
|
v-if="
|
||||||
item.CriterionType === 0 &&
|
item.CriterionType === 0 &&
|
||||||
item.ImageUploadEnum > 0 &&
|
item.ImageUploadEnum > 0 &&
|
||||||
item.IsReadingTaskViewInOrder > 0
|
item.IsReadingTaskViewInOrder > 0
|
||||||
"
|
"
|
||||||
|
v-hasPermi="['role:ir']"
|
||||||
circle
|
circle
|
||||||
icon="el-icon-upload2"
|
icon="el-icon-upload2"
|
||||||
:title="$t('trials:pendingReadingTasks:button:upload')"
|
:title="$t('trials:pendingReadingTasks:button:upload')"
|
||||||
|
@ -170,12 +168,12 @@
|
||||||
/>
|
/>
|
||||||
<!-- 下载 -->
|
<!-- 下载 -->
|
||||||
<el-button
|
<el-button
|
||||||
v-hasPermi="['role:ir']"
|
|
||||||
v-if="
|
v-if="
|
||||||
item.CriterionType === 0 &&
|
item.CriterionType === 0 &&
|
||||||
item.ImageDownloadEnum === 1 &&
|
item.ImageDownloadEnum === 1 &&
|
||||||
item.IsReadingTaskViewInOrder > 0
|
item.IsReadingTaskViewInOrder > 0
|
||||||
"
|
"
|
||||||
|
v-hasPermi="['role:ir']"
|
||||||
circle
|
circle
|
||||||
icon="el-icon-download"
|
icon="el-icon-download"
|
||||||
:title="$t('trials:pendingReadingTasks:button:download')"
|
:title="$t('trials:pendingReadingTasks:button:download')"
|
||||||
|
@ -196,7 +194,7 @@
|
||||||
<div
|
<div
|
||||||
v-else-if="
|
v-else-if="
|
||||||
isReadingTaskViewInOrder === 0 &&
|
isReadingTaskViewInOrder === 0 &&
|
||||||
TrialReadingCriterionId === item.TrialReadingCriterionId
|
TrialReadingCriterionId === item.TrialReadingCriterionId
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<el-descriptions :column="2" border style="width: 800px">
|
<el-descriptions :column="2" border style="width: 800px">
|
||||||
|
@ -250,7 +248,7 @@
|
||||||
:disabled="
|
:disabled="
|
||||||
randomReadInfo.UnReadTaskCount +
|
randomReadInfo.UnReadTaskCount +
|
||||||
randomReadInfo.UnReadJudgeTaskCount ===
|
randomReadInfo.UnReadJudgeTaskCount ===
|
||||||
0
|
0
|
||||||
"
|
"
|
||||||
@click="handleOutOfOrderReading"
|
@click="handleOutOfOrderReading"
|
||||||
>
|
>
|
||||||
|
@ -264,8 +262,8 @@
|
||||||
<upload-image
|
<upload-image
|
||||||
v-if="uploadImageVisible"
|
v-if="uploadImageVisible"
|
||||||
:visible.sync="uploadImageVisible"
|
:visible.sync="uploadImageVisible"
|
||||||
:SubjectId="uploadSubjectId"
|
:subject-id="uploadSubjectId"
|
||||||
:Criterion="uploadTrialCriterion"
|
:criterion="uploadTrialCriterion"
|
||||||
:status="uploadStatus"
|
:status="uploadStatus"
|
||||||
@getList="getList"
|
@getList="getList"
|
||||||
/>
|
/>
|
||||||
|
@ -274,35 +272,36 @@
|
||||||
<script>
|
<script>
|
||||||
import {
|
import {
|
||||||
getIRUnReadSubjectTaskList,
|
getIRUnReadSubjectTaskList,
|
||||||
verifyReadingRestTime,
|
verifyReadingRestTime
|
||||||
} from "@/api/trials";
|
} from '@/api/trials'
|
||||||
import { getTrialCriterionList } from "@/api/trials/reading";
|
import { getTrialCriterionList } from '@/api/trials/reading'
|
||||||
import BaseContainer from "@/components/BaseContainer";
|
import { clearSkipReadingCache } from '@/api/reading'
|
||||||
import uploadImage from "@/components/uploadImage";
|
import BaseContainer from '@/components/BaseContainer'
|
||||||
import Pagination from "@/components/Pagination";
|
import uploadImage from '@/components/uploadImage'
|
||||||
import { getToken } from "@/utils/auth";
|
import Pagination from '@/components/Pagination'
|
||||||
|
import { getToken } from '@/utils/auth'
|
||||||
const searchDataDefault = () => {
|
const searchDataDefault = () => {
|
||||||
return {
|
return {
|
||||||
SubjectCode: "",
|
SubjectCode: '',
|
||||||
PageIndex: 1,
|
PageIndex: 1,
|
||||||
PageSize: 20,
|
PageSize: 20
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
export default {
|
export default {
|
||||||
name: "ReadingTaskList",
|
name: 'ReadingTaskList',
|
||||||
components: { BaseContainer, Pagination, "upload-image": uploadImage },
|
components: { BaseContainer, Pagination, 'upload-image': uploadImage },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
searchData: searchDataDefault(),
|
searchData: searchDataDefault(),
|
||||||
list: [],
|
list: [],
|
||||||
total: 0,
|
total: 0,
|
||||||
loading: false,
|
loading: false,
|
||||||
trialId: "",
|
trialId: '',
|
||||||
isReadingTaskViewInOrder: null,
|
isReadingTaskViewInOrder: null,
|
||||||
randomReadInfo: {},
|
randomReadInfo: {},
|
||||||
isRender: false,
|
isRender: false,
|
||||||
trialCriterionList: [],
|
trialCriterionList: [],
|
||||||
TrialReadingCriterionId: "",
|
TrialReadingCriterionId: '',
|
||||||
isTableShow: true,
|
isTableShow: true,
|
||||||
readingTool: null,
|
readingTool: null,
|
||||||
criterionType: null,
|
criterionType: null,
|
||||||
|
@ -312,147 +311,146 @@ export default {
|
||||||
uploadImageVisible: false,
|
uploadImageVisible: false,
|
||||||
uploadSubjectId: null,
|
uploadSubjectId: null,
|
||||||
uploadTrialCriterion: {},
|
uploadTrialCriterion: {},
|
||||||
uploadStatus: "upload",
|
uploadStatus: 'upload'
|
||||||
};
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
TrialReadingCriterionId(v) {
|
TrialReadingCriterionId(v) {
|
||||||
if (v) {
|
if (v) {
|
||||||
this.getList();
|
this.getList()
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
window.addEventListener("message", this.receiveMsg);
|
window.addEventListener('message', this.receiveMsg)
|
||||||
this.trialId = this.$route.query.trialId;
|
this.trialId = this.$route.query.trialId
|
||||||
this.getTrialCriterionList();
|
this.getTrialCriterionList()
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
window.removeEventListener("message", this.receiveMsg);
|
window.removeEventListener('message', this.receiveMsg)
|
||||||
if (this.openWindow) {
|
if (this.openWindow) {
|
||||||
this.openWindow.close();
|
this.openWindow.close()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// 打开上传下载弹框
|
// 打开上传下载弹框
|
||||||
openUploadImage(item, trialCriterion, status) {
|
openUploadImage(item, trialCriterion, status) {
|
||||||
this.uploadSubjectId = item.SubjectId;
|
this.uploadSubjectId = item.SubjectId
|
||||||
this.uploadTrialCriterion = trialCriterion;
|
this.uploadTrialCriterion = trialCriterion
|
||||||
this.uploadStatus = status;
|
this.uploadStatus = status
|
||||||
this.uploadImageVisible = true;
|
this.uploadImageVisible = true
|
||||||
},
|
},
|
||||||
getTrialCriterionList() {
|
async getTrialCriterionList() {
|
||||||
getTrialCriterionList(this.trialId)
|
try {
|
||||||
.then((res) => {
|
const res = await getTrialCriterionList(this.trialId)
|
||||||
this.trialCriterionList = res.Result;
|
if (res.IsSuccess) {
|
||||||
|
this.trialCriterionList = res.Result
|
||||||
this.TrialReadingCriterionId =
|
this.TrialReadingCriterionId =
|
||||||
this.trialCriterionList[0].TrialReadingCriterionId;
|
this.trialCriterionList[0].TrialReadingCriterionId
|
||||||
})
|
}
|
||||||
.catch(() => {});
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
getList() {
|
async getList() {
|
||||||
this.loading = true;
|
try {
|
||||||
this.searchData.TrialId = this.trialId;
|
this.loading = true
|
||||||
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId;
|
this.searchData.TrialId = this.trialId
|
||||||
this.isRender = false;
|
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId
|
||||||
getIRUnReadSubjectTaskList(this.searchData)
|
this.isRender = false
|
||||||
.then((res) => {
|
const res = await getIRUnReadSubjectTaskList(this.searchData)
|
||||||
|
if (res.IsSuccess) {
|
||||||
this.isReadingTaskViewInOrder =
|
this.isReadingTaskViewInOrder =
|
||||||
res.OtherInfo.IsReadingTaskViewInOrder;
|
res.OtherInfo.IsReadingTaskViewInOrder
|
||||||
this.readingTool = res.OtherInfo.ReadingTool;
|
this.readingTool = res.OtherInfo.ReadingTool
|
||||||
this.criterionType = res.OtherInfo.CriterionType;
|
this.criterionType = res.OtherInfo.CriterionType
|
||||||
if (res.OtherInfo.IsReadingTaskViewInOrder) {
|
if (res.OtherInfo.IsReadingTaskViewInOrder) {
|
||||||
this.list = res.Result.CurrentPageData;
|
this.list = res.Result.CurrentPageData
|
||||||
this.total = res.Result.TotalCount;
|
this.total = res.Result.TotalCount
|
||||||
} else {
|
} else {
|
||||||
this.randomReadInfo = res.OtherInfo.RandomReadInfo;
|
this.randomReadInfo = res.OtherInfo.RandomReadInfo
|
||||||
}
|
}
|
||||||
this.isRender = true;
|
this.isRender = true
|
||||||
this.loading = false;
|
this.loading = false
|
||||||
})
|
}
|
||||||
.catch(() => {
|
} catch (e) {
|
||||||
this.isRender = true;
|
this.isRender = true
|
||||||
this.loading = false;
|
this.loading = false
|
||||||
});
|
}
|
||||||
},
|
},
|
||||||
handleSearch() {
|
handleSearch() {
|
||||||
this.searchData.PageIndex = 1;
|
this.searchData.PageIndex = 1
|
||||||
this.getList();
|
this.getList()
|
||||||
},
|
},
|
||||||
handleReset() {
|
handleReset() {
|
||||||
this.searchData = searchDataDefault();
|
this.searchData = searchDataDefault()
|
||||||
this.getList();
|
this.getList()
|
||||||
},
|
},
|
||||||
handleReadImage(row) {
|
async handleReadImage(row) {
|
||||||
if (this.openWindow) {
|
if (this.openWindow) {
|
||||||
this.openWindow.close();
|
this.openWindow.close()
|
||||||
}
|
}
|
||||||
this.loading = true;
|
try {
|
||||||
verifyReadingRestTime()
|
this.loading = true
|
||||||
.then((_) => {
|
await clearSkipReadingCache()
|
||||||
this.loading = false;
|
await verifyReadingRestTime()
|
||||||
|
this.loading = false
|
||||||
|
window.localStorage.setItem('TrialReadingCriterionId', this.TrialReadingCriterionId)
|
||||||
|
var token = getToken()
|
||||||
|
var path = ''
|
||||||
|
if (this.readingTool === 0) {
|
||||||
|
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
||||||
|
} else {
|
||||||
|
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
||||||
|
}
|
||||||
|
var routeData = this.$router.resolve({ path })
|
||||||
|
|
||||||
window.localStorage.setItem(
|
this.openWindow = window.open(routeData.href, '_blank')
|
||||||
"TrialReadingCriterionId",
|
} catch (e) {
|
||||||
this.TrialReadingCriterionId
|
this.loading = false
|
||||||
);
|
console.log(e)
|
||||||
var token = getToken();
|
}
|
||||||
var path = "";
|
|
||||||
if (this.readingTool === 0) {
|
|
||||||
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
|
|
||||||
} else {
|
|
||||||
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
|
|
||||||
}
|
|
||||||
var routeData = this.$router.resolve({ path });
|
|
||||||
|
|
||||||
this.openWindow = window.open(routeData.href, "_blank");
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
this.loading = false;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
handleOutOfOrderReading() {
|
async handleOutOfOrderReading() {
|
||||||
if (this.openWindow) {
|
if (this.openWindow) {
|
||||||
this.openWindow.close();
|
this.openWindow.close()
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
this.loading = true
|
||||||
|
await clearSkipReadingCache()
|
||||||
|
await verifyReadingRestTime()
|
||||||
|
this.loading = false
|
||||||
|
window.localStorage.setItem('TrialReadingCriterionId', this.TrialReadingCriterionId)
|
||||||
|
var token = getToken()
|
||||||
|
var path = ''
|
||||||
|
if (this.readingTool === 0) {
|
||||||
|
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
||||||
|
} else {
|
||||||
|
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
||||||
|
}
|
||||||
|
var routeData = this.$router.resolve({ path })
|
||||||
|
this.openWindow = window.open(routeData.href, '_blank')
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(e)
|
||||||
}
|
}
|
||||||
this.loading = true;
|
|
||||||
verifyReadingRestTime()
|
|
||||||
.then((_) => {
|
|
||||||
this.loading = false;
|
|
||||||
window.localStorage.setItem(
|
|
||||||
"TrialReadingCriterionId",
|
|
||||||
this.TrialReadingCriterionId
|
|
||||||
);
|
|
||||||
var token = getToken();
|
|
||||||
var path = "";
|
|
||||||
if (this.readingTool === 0) {
|
|
||||||
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
|
|
||||||
} else {
|
|
||||||
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
|
|
||||||
}
|
|
||||||
var routeData = this.$router.resolve({ path });
|
|
||||||
this.openWindow = window.open(routeData.href, "_blank");
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
this.loading = false;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
receiveMsg(event) {
|
receiveMsg(event) {
|
||||||
if (event.data === "refreshTaskList") {
|
if (event.data === 'refreshTaskList') {
|
||||||
this.getList();
|
this.getList()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 排序
|
// 排序
|
||||||
handleSortChange(column) {
|
handleSortChange(column) {
|
||||||
if (column.order === "ascending") {
|
if (column.order === 'ascending') {
|
||||||
this.searchData.Asc = true;
|
this.searchData.Asc = true
|
||||||
} else {
|
} else {
|
||||||
this.searchData.Asc = false;
|
this.searchData.Asc = false
|
||||||
}
|
}
|
||||||
this.searchData.SortField = column.prop;
|
this.searchData.SortField = column.prop
|
||||||
this.searchData.PageIndex = 1;
|
this.searchData.PageIndex = 1
|
||||||
this.getList();
|
this.getList()
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -43,6 +43,16 @@
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<div style="text-align: right">
|
<div style="text-align: right">
|
||||||
|
<!-- 下载所有影像 -->
|
||||||
|
<el-button
|
||||||
|
v-if="$store.state.trials.config.IsSupportQCDownloadImage"
|
||||||
|
size="small"
|
||||||
|
type="primary"
|
||||||
|
style="margin-left: 10px"
|
||||||
|
@click="downloadImage(true)"
|
||||||
|
>
|
||||||
|
{{ $t("trials:audit:button:downLoadAllDiocms") }}
|
||||||
|
</el-button>
|
||||||
<!-- 预览所有影像 -->
|
<!-- 预览所有影像 -->
|
||||||
<el-button
|
<el-button
|
||||||
size="small"
|
size="small"
|
||||||
|
@ -285,6 +295,16 @@
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<div style="text-align: right">
|
<div style="text-align: right">
|
||||||
|
<!-- 下载所有影像 -->
|
||||||
|
<el-button
|
||||||
|
v-if="$store.state.trials.config.IsSupportQCDownloadImage"
|
||||||
|
size="small"
|
||||||
|
type="primary"
|
||||||
|
style="margin-left: 10px"
|
||||||
|
@click="downloadImage(false)"
|
||||||
|
>
|
||||||
|
{{ $t("trials:audit:button:downLoadAllNonDiocms") }}
|
||||||
|
</el-button>
|
||||||
<!-- 预览 -->
|
<!-- 预览 -->
|
||||||
<el-button
|
<el-button
|
||||||
size="small"
|
size="small"
|
||||||
|
@ -1198,6 +1218,7 @@ import SignForm from "@/views/trials/components/newSignForm";
|
||||||
import { getToken } from "@/utils/auth";
|
import { getToken } from "@/utils/auth";
|
||||||
import const_ from "@/const/sign-code";
|
import const_ from "@/const/sign-code";
|
||||||
import uploadPetClinicalData from "@/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue";
|
import uploadPetClinicalData from "@/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue";
|
||||||
|
import { downloadImage } from "@/utils/uploadZip.js";
|
||||||
export default {
|
export default {
|
||||||
name: "QualityAssurance",
|
name: "QualityAssurance",
|
||||||
components: {
|
components: {
|
||||||
|
@ -1332,6 +1353,18 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
// 打包下载
|
||||||
|
async downloadImage(IsDicom) {
|
||||||
|
try {
|
||||||
|
await downloadImage(
|
||||||
|
this.$route.query.trialId,
|
||||||
|
this.data.Id,
|
||||||
|
IsDicom
|
||||||
|
);
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
},
|
||||||
// 获取QC界面基本信息
|
// 获取QC界面基本信息
|
||||||
getQCInfo() {
|
getQCInfo() {
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
|
|
|
@ -11,7 +11,7 @@ function resolve(dir) {
|
||||||
return path.join(__dirname, dir)
|
return path.join(__dirname, dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
const name = defaultSettings.title || 'IRCIS' // page title
|
const name = process.env.NODE_ENV === 'usa' ? 'LILI' : defaultSettings.title || 'IRCIS' // page title
|
||||||
|
|
||||||
// eslint-disable-next-line no-undef
|
// eslint-disable-next-line no-undef
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
@ -63,7 +63,8 @@ module.exports = {
|
||||||
// target: 'http://123.56.94.154:8079', // 国内测试环境2
|
// target: 'http://123.56.94.154:8079', // 国内测试环境2
|
||||||
// target: 'http://123.56.94.154:7000', // 国内测试环境2
|
// target: 'http://123.56.94.154:7000', // 国内测试环境2
|
||||||
// target: 'http://123.56.94.154:30668',
|
// target: 'http://123.56.94.154:30668',
|
||||||
target: 'http://106.14.89.110:30000',
|
// target: 'http://106.14.89.110:30000',
|
||||||
|
target: 'http://47.117.164.182:7010', // uat
|
||||||
// target: 'http://123.56.181.144:7000',
|
// target: 'http://123.56.181.144:7000',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
secure: false,
|
secure: false,
|
||||||
|
@ -94,7 +95,7 @@ module.exports = {
|
||||||
ignore: ['.*']
|
ignore: ['.*']
|
||||||
}
|
}
|
||||||
]),
|
]),
|
||||||
process.env.NODE_ENV === 'development' || process.env.VUE_APP_OSS_CONFIG_BUCKET === 'zyypacs-usa' ? function() {}
|
process.env.NODE_ENV === 'development' || process.env.VUE_APP_OSS_CONFIG_BUCKET === 'zyypacs-usa' ? function() { }
|
||||||
: new WebpackAliyunOss({
|
: new WebpackAliyunOss({
|
||||||
from: ['./dist/**'],
|
from: ['./dist/**'],
|
||||||
dist: process.env.VUE_APP_OSS_PATH + distDate,
|
dist: process.env.VUE_APP_OSS_PATH + distDate,
|
||||||
|
|
Loading…
Reference in New Issue