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'
|
||||
NODE_ENV = 'usa'
|
||||
# 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:否
|
||||
VUE_APP_LOGIN_FOR_PERMISSION = false
|
||||
VUE_APP_LOGIN_FOR_PERMISSION = true
|
||||
|
||||
# 是否开启长时间无操作锁定弹框MFA验证 true:是 false:否
|
||||
VUE_APP_LOCK_FOR_PERMISSION_MFA = true
|
||||
|
||||
# 是否开启长时间无操作锁定弹框 true:是 false:否
|
||||
VUE_APP_LOCK_FOR_PERMISSION = false
|
||||
VUE_APP_LOCK_FOR_PERMISSION = true
|
||||
|
||||
# 无操作锁定弹框判断时间 单位:秒
|
||||
VUE_APP_LOCK_FOR_TIME = 900
|
||||
|
||||
# 是否开启长时间无操作登出 true:是 false:否
|
||||
VUE_APP_LOGOUT_FOR_PERMISSION = false
|
||||
VUE_APP_LOGOUT_FOR_PERMISSION = true
|
||||
|
||||
# 无操作锁定弹框判断时间 单位:秒
|
||||
VUE_APP_LOGOUT_FOR_TIME = 1800
|
||||
|
||||
# 是否开启密码正则验证 true:是 false:否
|
||||
VUE_APP_PASSWORD_FOR_PERMISSION = 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}$
|
||||
|
|
|
@ -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 #禁用默认克隆
|
||||
|
||||
server:
|
||||
host: 106.14.89.110
|
||||
host: 47.117.164.182
|
||||
user: root
|
||||
password:
|
||||
from_secret: local_pwd
|
||||
|
||||
steps:
|
||||
- name: publish-test-irc-vue
|
||||
- name: uat-branch-publish-irc-vue
|
||||
commands:
|
||||
- echo start publish test-irc-vue
|
||||
- cd /opt/1panel/hang/vue/test-irc
|
||||
- sh test-irc.sh v${DRONE_BUILD_NUMBER}
|
||||
- cd /opt/1panel/vue-devops/Uat_IRC/Uat-To-Uat
|
||||
- sh uat-to-uat.sh v${DRONE_BUILD_NUMBER}
|
||||
|
||||
trigger:
|
||||
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:uat": "vue-cli-service build --mode uat",
|
||||
"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",
|
||||
"i18n": "npm run i18n:zh && npm run i18n:en",
|
||||
"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,
|
||||
getFrontInternationalizationList,
|
||||
} from "@/api/dictionary/dictionary";
|
||||
import { getTrialExtralConfig } from "@/api/trials";
|
||||
import Vue from "vue";
|
||||
import i18n from "./lang";
|
||||
export default {
|
||||
|
@ -105,6 +106,28 @@ export default {
|
|||
mounted() {
|
||||
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: {
|
||||
changeValue(target, attr, e) {
|
||||
this.$set(target, attr, e);
|
||||
|
|
|
@ -171,3 +171,19 @@ export function getCustomTag(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
|
||||
})
|
||||
}
|
||||
// 获取项目配置
|
||||
export function getTrialExtralConfig(params) {
|
||||
return request({
|
||||
url: `/TrialConfig/getTrialExtralConfig`,
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
// 项目新增或修改dicomAE配置
|
||||
export function addOrUpdateDicomAE(data) {
|
||||
return request({
|
||||
|
@ -3785,4 +3793,4 @@ export function getDicomCallingAEList(params) {
|
|||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
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']
|
||||
|
||||
router.beforeEach(async(to, from, next) => {
|
||||
router.beforeEach(async (to, from, next) => {
|
||||
NProgress.start()
|
||||
// 设置页面标题
|
||||
// document.title = getPageTitle(to.meta.title)
|
||||
|
@ -81,7 +81,7 @@ router.beforeEach(async(to, from, next) => {
|
|||
next(`/ReviewersResearch?`)
|
||||
NProgress.done()
|
||||
} else {
|
||||
// 其他无权访问的页面将重定向到登录页面。
|
||||
// 其他无权访问的页面将重定向到登录页面。
|
||||
next(`/login?`)
|
||||
NProgress.done()
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ const getDefaultState = () => {
|
|||
visitPointQuery: null,
|
||||
studyListQuery: null,
|
||||
unlock: false,
|
||||
config: {},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,6 +21,9 @@ const mutations = {
|
|||
SET_UNLOCK: (state, unlock) => {
|
||||
state.unlock = unlock
|
||||
},
|
||||
SET_CONFIG: (state, config) => {
|
||||
state.config = config
|
||||
},
|
||||
SET_ACTIVENAME: (state, activeName) => {
|
||||
state.trialDetailActiveName = activeName
|
||||
},
|
||||
|
@ -44,6 +48,9 @@ const actions = {
|
|||
setUnLock({ commit }, unlock) {
|
||||
commit('SET_UNLOCK', unlock)
|
||||
},
|
||||
setConfig({ commit }, config) {
|
||||
commit('SET_CONFIG', config)
|
||||
},
|
||||
setActiveName({ commit }, activeName) {
|
||||
commit('SET_ACTIVENAME', activeName)
|
||||
},
|
||||
|
|
|
@ -60,12 +60,14 @@ export const anonymization = function (file, config) {
|
|||
const blob = new Blob([bufferArray], { type: 'application/octet-stream' })
|
||||
resolve({ blob, pixelDataElement })
|
||||
} catch (err) {
|
||||
console.log(file, 'warning')
|
||||
console.log(err)
|
||||
resolve(false);
|
||||
}
|
||||
};
|
||||
reader.readAsArrayBuffer(file);
|
||||
} catch (e) {
|
||||
console.log(file, 'warning')
|
||||
console.log(e)
|
||||
reject(e)
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ export const dcmUpload = async function (name, file, config) {
|
|||
|
||||
|
||||
} catch (e) {
|
||||
console.log(file, 'warning')
|
||||
resolve(false)
|
||||
console.log(e)
|
||||
}
|
||||
|
|
|
@ -2,10 +2,8 @@ const OSS = require('ali-oss')
|
|||
const router = require('@/router');
|
||||
const Minio = require('minio')
|
||||
const stream = require('stream')
|
||||
console.log(Minio)
|
||||
import Vue from 'vue'
|
||||
const { GenerateSTS, GetObjectStoreToken } = require('../api/user.js')
|
||||
import { getToken } from '@/utils/auth'
|
||||
const { GetObjectStoreToken } = require('../api/user.js')
|
||||
|
||||
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/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) => {
|
||||
console.log("同步下载打包开始时间:" + new Date());
|
||||
// 创建压缩文件输出流
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
>
|
||||
<svg-icon
|
||||
icon-class="login-bg"
|
||||
style="width: 450px; height: 450px"
|
||||
style="width: 90%; height: 90%"
|
||||
v-if="NODE_ENV === 'usa'"
|
||||
/>
|
||||
<img src="@/assets/login-bg.png" v-else />
|
||||
|
@ -213,8 +213,6 @@ import TopLang from "./topLang";
|
|||
import Vcode from "vue-puzzle-vcode";
|
||||
import browserTip from "@/views/dictionary/template/browser/tip.vue";
|
||||
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 {
|
||||
name: "Login",
|
||||
components: { TopLang, Vcode, browserTip },
|
||||
|
@ -258,8 +256,6 @@ export default {
|
|||
isShow: false,
|
||||
showCode: false,
|
||||
Img1,
|
||||
loginBg,
|
||||
loginLogo,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
@ -410,7 +406,7 @@ export default {
|
|||
/* 修复input 背景不协调 和光标变色 */
|
||||
|
||||
$bg: #283443;
|
||||
$light_gray: #606266;
|
||||
$light_gray: #909399;
|
||||
$cursor: #fff;
|
||||
|
||||
// @supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
|
||||
|
@ -517,7 +513,7 @@ $light_gray: #606266;
|
|||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
}
|
||||
.login-r {
|
||||
|
@ -540,7 +536,7 @@ $light_gray: #606266;
|
|||
.title-container {
|
||||
// margin-bottom: 50px;
|
||||
text-align: center;
|
||||
margin-top: 18%;
|
||||
margin-top: 20%;
|
||||
.title {
|
||||
font-size: 35px;
|
||||
color: $light_gray;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<template>
|
||||
<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" /> -->
|
||||
<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)">
|
||||
|
@ -70,6 +70,7 @@ export default {
|
|||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.notice-marquee_wrapper{
|
||||
width: 100%;
|
||||
/deep/ .el-dialog__header{
|
||||
padding: 10px;
|
||||
}
|
||||
|
|
|
@ -277,6 +277,9 @@ export default {
|
|||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
.center-menu {
|
||||
width: calc(100% - 1200px);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style>
|
||||
|
|
|
@ -36,13 +36,13 @@
|
|||
sortable="custom"
|
||||
/>
|
||||
<!-- 中文名 -->
|
||||
<el-table-column
|
||||
<!-- <el-table-column
|
||||
prop="BlindNameCN"
|
||||
:label="$t('trials:spmEnroll:table:blindNameCN')"
|
||||
show-overflow-tooltip
|
||||
min-width="120"
|
||||
sortable="custom"
|
||||
/>
|
||||
/> -->
|
||||
<!-- 专业 -->
|
||||
<el-table-column
|
||||
prop="SpecialityId"
|
||||
|
|
|
@ -31,13 +31,13 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<!-- Name CN -->
|
||||
<el-table-column
|
||||
<!-- <el-table-column
|
||||
prop="ChineseName"
|
||||
:label="$t('trials:seletctedReviews:table:nameCN')"
|
||||
show-overflow-tooltip
|
||||
min-width="120"
|
||||
sortable="custom"
|
||||
/>
|
||||
/> -->
|
||||
<!-- ID -->
|
||||
<el-table-column
|
||||
prop="Code"
|
||||
|
|
|
@ -42,13 +42,13 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<!-- Name CN -->
|
||||
<el-table-column
|
||||
<!-- <el-table-column
|
||||
prop="ChineseName"
|
||||
:label="$t('trials:seletctedReviews:table:nameCN')"
|
||||
show-overflow-tooltip
|
||||
min-width="120"
|
||||
sortable="custom"
|
||||
/>
|
||||
/> -->
|
||||
<!-- ID -->
|
||||
<el-table-column
|
||||
prop="Code"
|
||||
|
|
|
@ -146,13 +146,13 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<!-- Name CN -->
|
||||
<el-table-column
|
||||
<!-- <el-table-column
|
||||
prop="ChineseName"
|
||||
:label="$t('trials:seletctedReviews:table:nameCN')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
width="120"
|
||||
/>
|
||||
/> -->
|
||||
|
||||
<el-table-column
|
||||
prop="DoctorUserName"
|
||||
|
|
|
@ -52,13 +52,13 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<!-- Name CN -->
|
||||
<el-table-column
|
||||
<!-- <el-table-column
|
||||
prop="ChineseName"
|
||||
:label="$t('trials:seletctedReviews:table:nameCN')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="120"
|
||||
/>
|
||||
/> -->
|
||||
<!-- ID -->
|
||||
<el-table-column
|
||||
prop="Code"
|
||||
|
|
|
@ -227,21 +227,14 @@
|
|||
</span>
|
||||
</div>
|
||||
</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 v-if="adInfo.ReadingTaskState < 2">
|
||||
<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>
|
||||
<!-- 提交 -->
|
||||
|
@ -310,6 +303,9 @@
|
|||
</div>
|
||||
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
|
||||
</el-dialog>
|
||||
<viewer v-if="imgVisible" :images="[imageUrl]" ref="viewer">
|
||||
<img :src="imageUrl" crossorigin="anonymous" alt="">
|
||||
</viewer>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
@ -317,12 +313,14 @@ import { getJudgeReadingInfo,
|
|||
// uploadJudgeTaskImage,
|
||||
saveJudgeVisitTaskResult, submitJudgeVisitTaskResult, getReadingPastResultList } from '@/api/trials'
|
||||
import { getAutoCutNextTask } from '@/api/user'
|
||||
import { setSkipReadingCache } from '@/api/reading'
|
||||
import const_ from '@/const/sign-code'
|
||||
import { getToken } from '@/utils/auth'
|
||||
import SignForm from '@/views/trials/components/newSignForm'
|
||||
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
||||
import store from '@/store'
|
||||
import { changeURLStatic } from '@/utils/history.js'
|
||||
import Viewer from 'v-viewer'
|
||||
export default {
|
||||
name: 'AdReview',
|
||||
components: { SignForm },
|
||||
|
@ -390,7 +388,7 @@ export default {
|
|||
judgeResultArmEnum: '',
|
||||
criterionType: null,
|
||||
openWindow: null,
|
||||
isFixed:false
|
||||
isFixed: false
|
||||
}
|
||||
},
|
||||
// watch: {
|
||||
|
@ -407,6 +405,7 @@ export default {
|
|||
// }
|
||||
// },
|
||||
mounted() {
|
||||
this.initializeViewer()
|
||||
this.criterionType = parseInt(this.$route.query.criterionType)
|
||||
this.getAdInfo()
|
||||
if (this.isReadingShowPreviousResults) {
|
||||
|
@ -710,12 +709,40 @@ export default {
|
|||
handlePictureCardPreview(file) {
|
||||
this.imageUrl = this.OSSclientConfig.basePath + file.url
|
||||
this.imgVisible = true
|
||||
this.$refs.viewer.$viewer.show()
|
||||
},
|
||||
// 删除图片
|
||||
handleRemove(file, fileList) {
|
||||
var idx = this.fileList.findIndex(i => i.url === file.url)
|
||||
if (idx === -1) return
|
||||
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;"
|
||||
@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"
|
||||
|
@ -172,8 +181,7 @@
|
|||
@change="evaluateReasonChange"
|
||||
/>
|
||||
<!-- 系统评估结果为: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>
|
||||
<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-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>
|
||||
</template>
|
||||
|
@ -262,6 +270,7 @@
|
|||
</template>
|
||||
<script>
|
||||
import { getReadingReportEvaluation, changeDicomReadingQuestionAnswer, submitDicomVisitTask, verifyVisitTaskQuestions, getTaskAdditionalQuestion } from '@/api/trials'
|
||||
import { setSkipReadingCache } from '@/api/reading'
|
||||
import { getAutoCutNextTask } from '@/api/user'
|
||||
import DicomEvent from './DicomEvent'
|
||||
import const_ from '@/const/sign-code'
|
||||
|
@ -816,14 +825,36 @@ export default {
|
|||
var sysRes = ''
|
||||
var curRes = ''
|
||||
if (this.CriterionType === 2) {
|
||||
sysRes = this.$fd('ImagingOverallAssessment_Lugano',this.tumorEvaluate)
|
||||
curRes = this.$fd('ImagingOverallAssessment_Lugano',this.currentEvaluateResult)
|
||||
sysRes = this.$fd('ImagingOverallAssessment_Lugano', this.tumorEvaluate)
|
||||
curRes = this.$fd('ImagingOverallAssessment_Lugano', this.currentEvaluateResult)
|
||||
} else {
|
||||
sysRes = this.$fd('OverallAssessment',this.tumorEvaluate)
|
||||
curRes = this.$fd('OverallAssessment',this.currentEvaluateResult)
|
||||
sysRes = this.$fd('OverallAssessment', this.tumorEvaluate)
|
||||
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
|
||||
},
|
||||
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"
|
||||
@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="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>
|
||||
|
@ -260,6 +269,7 @@
|
|||
</template>
|
||||
<script>
|
||||
import { changeCalculationAnswer, getReadingReportEvaluation, changeDicomReadingQuestionAnswer, submitDicomVisitTask, verifyVisitTaskQuestions, getQuestionCalculateRelation } from '@/api/trials'
|
||||
import { setSkipReadingCache } from '@/api/reading'
|
||||
import DicomEvent from './../components/DicomEvent'
|
||||
import CustomizeReportPageUpload from './CustomizeReportPageUpload'
|
||||
import const_ from '@/const/sign-code'
|
||||
|
@ -828,6 +838,28 @@ export default {
|
|||
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 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">
|
||||
{{ $t('common:button:save') }}
|
||||
</el-button>
|
||||
|
@ -142,6 +149,7 @@
|
|||
<script>
|
||||
import { getGlobalReadingInfo, getReadingPastResultList, submitGlobalReadingInfo, saveGlobalReadingInfo } from '@/api/trials'
|
||||
import { getAutoCutNextTask } from '@/api/user'
|
||||
import { setSkipReadingCache } from '@/api/reading'
|
||||
import { getToken } from '@/utils/auth'
|
||||
import const_ from '@/const/sign-code'
|
||||
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
||||
|
@ -377,6 +385,28 @@ export default {
|
|||
handleSave() {
|
||||
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() {
|
||||
// 判断是否存在访视评估结果未确认
|
||||
var idx = this.taskList.findIndex(i => !i.AgreeOrNotAnswer)
|
||||
|
|
|
@ -29,11 +29,22 @@
|
|||
{{ $t('trials:medicalFeedback:message:msg2') }}
|
||||
<ol>
|
||||
<li v-for="file in record.FileList" :key="file.ImagePath" style="list-style: none;">
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
@click="previewImage(file.ImagePath)"
|
||||
>{{ file.FileName }}</el-button>
|
||||
<viewer
|
||||
v-if="file.ImagePath"
|
||||
:ref="file.ImagePath"
|
||||
style="margin:0 10px;"
|
||||
: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>
|
||||
</ol>
|
||||
</div>
|
||||
|
@ -97,22 +108,6 @@
|
|||
</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
|
||||
v-if="irFeedbackForm.visible"
|
||||
|
@ -137,6 +132,7 @@ import { getMedicalReviewDialog } from '@/api/trials'
|
|||
import FeedbackForm from './FeedbackForm'
|
||||
import mimAvatar from '@/assets/MIM.png'
|
||||
import irAvatar from '@/assets/IR.png'
|
||||
import Viewer from 'v-viewer'
|
||||
export default {
|
||||
name: 'ChatForm',
|
||||
components: { FeedbackForm },
|
||||
|
@ -170,6 +166,7 @@ export default {
|
|||
}
|
||||
},
|
||||
mounted() {
|
||||
this.initializeViewer()
|
||||
this.getMessageList()
|
||||
},
|
||||
methods: {
|
||||
|
@ -204,6 +201,12 @@ export default {
|
|||
previewImage(path) {
|
||||
this.imagePath = `${this.OSSclientConfig.basePath}${path}`
|
||||
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 }
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,12 +28,23 @@
|
|||
<!-- 本次医学审核相关截图(如适用)如下: -->
|
||||
{{ $t('trials:medicalFeedback:message:msg2') }}
|
||||
<ol>
|
||||
<li v-for="file in record.FileList" :key="file.ImagePath" style="list-style: none;">
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
@click="previewImage(file.ImagePath)"
|
||||
>{{ file.FileName }}</el-button>
|
||||
<li v-for="file in record.FileList" :key="file.ImagePath" style="list-style: none;">
|
||||
<viewer
|
||||
v-if="file.ImagePath"
|
||||
:ref="file.ImagePath"
|
||||
style="margin:0 10px;"
|
||||
: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>
|
||||
</ol>
|
||||
</div>
|
||||
|
@ -125,19 +136,6 @@
|
|||
</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
|
||||
v-if="irFeedbackForm.visible"
|
||||
:visible.sync="irFeedbackForm.visible"
|
||||
|
@ -154,6 +152,7 @@
|
|||
@close="irFeedbackForm.visible = false"
|
||||
/>
|
||||
</el-dialog>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
@ -161,6 +160,7 @@ import { getMedicalReviewDialog, sendMedicalReviewDialog } from '@/api/trials'
|
|||
import FeedbackForm from '@/views/trials/trials-panel/reading/medical-feedback/components/FeedbackForm'
|
||||
import mimAvatar from '@/assets/MIM.png'
|
||||
import irAvatar from '@/assets/IR.png'
|
||||
import Viewer from 'v-viewer'
|
||||
export default {
|
||||
name: 'ChatForm',
|
||||
components: {
|
||||
|
@ -196,6 +196,7 @@ export default {
|
|||
}
|
||||
},
|
||||
mounted() {
|
||||
this.initializeViewer()
|
||||
this.getMessageList()
|
||||
},
|
||||
methods: {
|
||||
|
@ -242,12 +243,18 @@ export default {
|
|||
previewImage(path) {
|
||||
this.imagePath = `${path}`
|
||||
this.previewDialog = true
|
||||
this.$refs[path][0].$viewer.show()
|
||||
},
|
||||
handleIRReply() {
|
||||
// '反馈'
|
||||
this.irFeedbackForm.title = this.$t('trials:medicalFeedback:title:feedback')
|
||||
|
||||
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>
|
||||
</div>
|
||||
</el-upload>
|
||||
<el-dialog
|
||||
<!-- <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:medicalFeedback:message:loading') }}<span class="dot">...</span>
|
||||
</div>
|
||||
</el-image>
|
||||
</el-dialog>
|
||||
</el-dialog> -->
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
|
||||
<viewer v-if="imgVisible" :images="[imageUrl]" ref="viewer">
|
||||
<img :src="imageUrl" crossorigin="anonymous" alt="">
|
||||
</viewer>
|
||||
<el-dialog
|
||||
v-if="chatVisible"
|
||||
:visible.sync="chatVisible"
|
||||
|
@ -170,6 +171,7 @@
|
|||
import { saveMedicalReviewInfo } from '@/api/trials'
|
||||
import ChatForm from './ChatForm'
|
||||
import CloseQC from './CloseQC'
|
||||
import Viewer from 'v-viewer'
|
||||
export default {
|
||||
name: 'AuditConclusions',
|
||||
components: {
|
||||
|
@ -224,6 +226,7 @@ export default {
|
|||
}
|
||||
},
|
||||
mounted() {
|
||||
this.initializeViewer()
|
||||
this.initForm()
|
||||
},
|
||||
methods: {
|
||||
|
@ -381,12 +384,18 @@ export default {
|
|||
handlePictureCardPreview(file) {
|
||||
this.imageUrl = this.OSSclientConfig.basePath + file.url
|
||||
this.imgVisible = true
|
||||
this.$refs.viewer.$viewer.show()
|
||||
},
|
||||
// 删除图片
|
||||
handleRemove(file, fileList) {
|
||||
var idx = this.fileList.findIndex(i => i.url === file.url)
|
||||
if (idx === -1) return
|
||||
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') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
size="small"
|
||||
@click="skipTask"
|
||||
>
|
||||
<!-- 跳过 -->
|
||||
{{ $t('trials:readingReport:button:skip') }}
|
||||
</el-button>
|
||||
<!-- 保存 -->
|
||||
<el-button
|
||||
v-if="oncologyInfo.ReadingTaskState < 2"
|
||||
|
@ -253,6 +261,7 @@
|
|||
</template>
|
||||
<script>
|
||||
import { getOncologyReadingInfo, getReadingPastResultList, setOncologyReadingInfo, submitOncologyReadingInfo } from '@/api/trials'
|
||||
import { setSkipReadingCache } from '@/api/reading'
|
||||
import const_ from '@/const/sign-code'
|
||||
import { getToken } from '@/utils/auth'
|
||||
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}`
|
||||
})
|
||||
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) {
|
||||
const { HeavyReadingApproval } = const_.processSignature
|
||||
const { HeavyReadingApproval } = const_.processSignature;
|
||||
this.type = type
|
||||
if(type === 2){
|
||||
return this.$refs.reasonForm.validate(validate=>{
|
||||
if(validate){
|
||||
this.signCode = HeavyReadingApproval
|
||||
this.signVisible = true
|
||||
}
|
||||
})
|
||||
}
|
||||
this.signCode = HeavyReadingApproval
|
||||
this.signVisible = true
|
||||
},
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
v-if="
|
||||
(isReadingTaskViewInOrder === 1 ||
|
||||
isReadingTaskViewInOrder === 2) &&
|
||||
TrialReadingCriterionId === item.TrialReadingCriterionId
|
||||
TrialReadingCriterionId === item.TrialReadingCriterionId
|
||||
"
|
||||
>
|
||||
<div slot="search-container">
|
||||
|
@ -75,11 +75,10 @@
|
|||
scope.row.UrgentColor === 1
|
||||
? 'danger'
|
||||
: scope.row.UrgentColor === 2
|
||||
? 'warning'
|
||||
: 'primary'
|
||||
? 'warning'
|
||||
: 'primary'
|
||||
"
|
||||
>{{ $fd("YesOrNo", scope.row.IsUrgent) }}</el-tag
|
||||
>
|
||||
>{{ $fd("YesOrNo", scope.row.IsUrgent) }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 受试者编号 -->
|
||||
|
@ -114,11 +113,10 @@
|
|||
scope.row.UrgentColor === 1
|
||||
? '#F56C6C'
|
||||
: scope.row.UrgentColor === 2
|
||||
? '#E6A23C'
|
||||
: '#409EFF',
|
||||
? '#E6A23C'
|
||||
: '#409EFF',
|
||||
}"
|
||||
>{{ scope.row.UrgentCount }}</span
|
||||
>
|
||||
>{{ scope.row.UrgentCount }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 建议完成时间 -->
|
||||
|
@ -148,8 +146,8 @@
|
|||
:title="
|
||||
scope.row.ExistReadingApply
|
||||
? $t(
|
||||
'trials:pendingReadingTasks:button:ExistReadingApply'
|
||||
)
|
||||
'trials:pendingReadingTasks:button:ExistReadingApply'
|
||||
)
|
||||
: $t('trials:pendingReadingTasks:button:review')
|
||||
"
|
||||
icon="el-icon-edit-outline"
|
||||
|
@ -157,12 +155,12 @@
|
|||
/>
|
||||
<!-- 上传 -->
|
||||
<el-button
|
||||
v-hasPermi="['role:ir']"
|
||||
v-if="
|
||||
item.CriterionType === 0 &&
|
||||
item.ImageUploadEnum > 0 &&
|
||||
item.IsReadingTaskViewInOrder > 0
|
||||
item.ImageUploadEnum > 0 &&
|
||||
item.IsReadingTaskViewInOrder > 0
|
||||
"
|
||||
v-hasPermi="['role:ir']"
|
||||
circle
|
||||
icon="el-icon-upload2"
|
||||
:title="$t('trials:pendingReadingTasks:button:upload')"
|
||||
|
@ -170,12 +168,12 @@
|
|||
/>
|
||||
<!-- 下载 -->
|
||||
<el-button
|
||||
v-hasPermi="['role:ir']"
|
||||
v-if="
|
||||
item.CriterionType === 0 &&
|
||||
item.ImageDownloadEnum === 1 &&
|
||||
item.IsReadingTaskViewInOrder > 0
|
||||
item.ImageDownloadEnum === 1 &&
|
||||
item.IsReadingTaskViewInOrder > 0
|
||||
"
|
||||
v-hasPermi="['role:ir']"
|
||||
circle
|
||||
icon="el-icon-download"
|
||||
:title="$t('trials:pendingReadingTasks:button:download')"
|
||||
|
@ -196,7 +194,7 @@
|
|||
<div
|
||||
v-else-if="
|
||||
isReadingTaskViewInOrder === 0 &&
|
||||
TrialReadingCriterionId === item.TrialReadingCriterionId
|
||||
TrialReadingCriterionId === item.TrialReadingCriterionId
|
||||
"
|
||||
>
|
||||
<el-descriptions :column="2" border style="width: 800px">
|
||||
|
@ -250,7 +248,7 @@
|
|||
:disabled="
|
||||
randomReadInfo.UnReadTaskCount +
|
||||
randomReadInfo.UnReadJudgeTaskCount ===
|
||||
0
|
||||
0
|
||||
"
|
||||
@click="handleOutOfOrderReading"
|
||||
>
|
||||
|
@ -264,8 +262,8 @@
|
|||
<upload-image
|
||||
v-if="uploadImageVisible"
|
||||
:visible.sync="uploadImageVisible"
|
||||
:SubjectId="uploadSubjectId"
|
||||
:Criterion="uploadTrialCriterion"
|
||||
:subject-id="uploadSubjectId"
|
||||
:criterion="uploadTrialCriterion"
|
||||
:status="uploadStatus"
|
||||
@getList="getList"
|
||||
/>
|
||||
|
@ -274,35 +272,36 @@
|
|||
<script>
|
||||
import {
|
||||
getIRUnReadSubjectTaskList,
|
||||
verifyReadingRestTime,
|
||||
} from "@/api/trials";
|
||||
import { getTrialCriterionList } from "@/api/trials/reading";
|
||||
import BaseContainer from "@/components/BaseContainer";
|
||||
import uploadImage from "@/components/uploadImage";
|
||||
import Pagination from "@/components/Pagination";
|
||||
import { getToken } from "@/utils/auth";
|
||||
verifyReadingRestTime
|
||||
} from '@/api/trials'
|
||||
import { getTrialCriterionList } from '@/api/trials/reading'
|
||||
import { clearSkipReadingCache } from '@/api/reading'
|
||||
import BaseContainer from '@/components/BaseContainer'
|
||||
import uploadImage from '@/components/uploadImage'
|
||||
import Pagination from '@/components/Pagination'
|
||||
import { getToken } from '@/utils/auth'
|
||||
const searchDataDefault = () => {
|
||||
return {
|
||||
SubjectCode: "",
|
||||
SubjectCode: '',
|
||||
PageIndex: 1,
|
||||
PageSize: 20,
|
||||
};
|
||||
};
|
||||
PageSize: 20
|
||||
}
|
||||
}
|
||||
export default {
|
||||
name: "ReadingTaskList",
|
||||
components: { BaseContainer, Pagination, "upload-image": uploadImage },
|
||||
name: 'ReadingTaskList',
|
||||
components: { BaseContainer, Pagination, 'upload-image': uploadImage },
|
||||
data() {
|
||||
return {
|
||||
searchData: searchDataDefault(),
|
||||
list: [],
|
||||
total: 0,
|
||||
loading: false,
|
||||
trialId: "",
|
||||
trialId: '',
|
||||
isReadingTaskViewInOrder: null,
|
||||
randomReadInfo: {},
|
||||
isRender: false,
|
||||
trialCriterionList: [],
|
||||
TrialReadingCriterionId: "",
|
||||
TrialReadingCriterionId: '',
|
||||
isTableShow: true,
|
||||
readingTool: null,
|
||||
criterionType: null,
|
||||
|
@ -312,147 +311,146 @@ export default {
|
|||
uploadImageVisible: false,
|
||||
uploadSubjectId: null,
|
||||
uploadTrialCriterion: {},
|
||||
uploadStatus: "upload",
|
||||
};
|
||||
uploadStatus: 'upload'
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
TrialReadingCriterionId(v) {
|
||||
if (v) {
|
||||
this.getList();
|
||||
this.getList()
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
window.addEventListener("message", this.receiveMsg);
|
||||
this.trialId = this.$route.query.trialId;
|
||||
this.getTrialCriterionList();
|
||||
window.addEventListener('message', this.receiveMsg)
|
||||
this.trialId = this.$route.query.trialId
|
||||
this.getTrialCriterionList()
|
||||
},
|
||||
beforeDestroy() {
|
||||
window.removeEventListener("message", this.receiveMsg);
|
||||
window.removeEventListener('message', this.receiveMsg)
|
||||
if (this.openWindow) {
|
||||
this.openWindow.close();
|
||||
this.openWindow.close()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 打开上传下载弹框
|
||||
openUploadImage(item, trialCriterion, status) {
|
||||
this.uploadSubjectId = item.SubjectId;
|
||||
this.uploadTrialCriterion = trialCriterion;
|
||||
this.uploadStatus = status;
|
||||
this.uploadImageVisible = true;
|
||||
this.uploadSubjectId = item.SubjectId
|
||||
this.uploadTrialCriterion = trialCriterion
|
||||
this.uploadStatus = status
|
||||
this.uploadImageVisible = true
|
||||
},
|
||||
getTrialCriterionList() {
|
||||
getTrialCriterionList(this.trialId)
|
||||
.then((res) => {
|
||||
this.trialCriterionList = res.Result;
|
||||
async getTrialCriterionList() {
|
||||
try {
|
||||
const res = await getTrialCriterionList(this.trialId)
|
||||
if (res.IsSuccess) {
|
||||
this.trialCriterionList = res.Result
|
||||
this.TrialReadingCriterionId =
|
||||
this.trialCriterionList[0].TrialReadingCriterionId;
|
||||
})
|
||||
.catch(() => {});
|
||||
this.trialCriterionList[0].TrialReadingCriterionId
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
},
|
||||
getList() {
|
||||
this.loading = true;
|
||||
this.searchData.TrialId = this.trialId;
|
||||
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId;
|
||||
this.isRender = false;
|
||||
getIRUnReadSubjectTaskList(this.searchData)
|
||||
.then((res) => {
|
||||
async getList() {
|
||||
try {
|
||||
this.loading = true
|
||||
this.searchData.TrialId = this.trialId
|
||||
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId
|
||||
this.isRender = false
|
||||
const res = await getIRUnReadSubjectTaskList(this.searchData)
|
||||
if (res.IsSuccess) {
|
||||
this.isReadingTaskViewInOrder =
|
||||
res.OtherInfo.IsReadingTaskViewInOrder;
|
||||
this.readingTool = res.OtherInfo.ReadingTool;
|
||||
this.criterionType = res.OtherInfo.CriterionType;
|
||||
res.OtherInfo.IsReadingTaskViewInOrder
|
||||
this.readingTool = res.OtherInfo.ReadingTool
|
||||
this.criterionType = res.OtherInfo.CriterionType
|
||||
if (res.OtherInfo.IsReadingTaskViewInOrder) {
|
||||
this.list = res.Result.CurrentPageData;
|
||||
this.total = res.Result.TotalCount;
|
||||
this.list = res.Result.CurrentPageData
|
||||
this.total = res.Result.TotalCount
|
||||
} else {
|
||||
this.randomReadInfo = res.OtherInfo.RandomReadInfo;
|
||||
this.randomReadInfo = res.OtherInfo.RandomReadInfo
|
||||
}
|
||||
this.isRender = true;
|
||||
this.loading = false;
|
||||
})
|
||||
.catch(() => {
|
||||
this.isRender = true;
|
||||
this.loading = false;
|
||||
});
|
||||
this.isRender = true
|
||||
this.loading = false
|
||||
}
|
||||
} catch (e) {
|
||||
this.isRender = true
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
handleSearch() {
|
||||
this.searchData.PageIndex = 1;
|
||||
this.getList();
|
||||
this.searchData.PageIndex = 1
|
||||
this.getList()
|
||||
},
|
||||
handleReset() {
|
||||
this.searchData = searchDataDefault();
|
||||
this.getList();
|
||||
this.searchData = searchDataDefault()
|
||||
this.getList()
|
||||
},
|
||||
handleReadImage(row) {
|
||||
async handleReadImage(row) {
|
||||
if (this.openWindow) {
|
||||
this.openWindow.close();
|
||||
this.openWindow.close()
|
||||
}
|
||||
this.loading = true;
|
||||
verifyReadingRestTime()
|
||||
.then((_) => {
|
||||
this.loading = false;
|
||||
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}&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(
|
||||
"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 });
|
||||
|
||||
this.openWindow = window.open(routeData.href, "_blank");
|
||||
})
|
||||
.catch(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
this.openWindow = window.open(routeData.href, '_blank')
|
||||
} catch (e) {
|
||||
this.loading = false
|
||||
console.log(e)
|
||||
}
|
||||
},
|
||||
handleOutOfOrderReading() {
|
||||
async handleOutOfOrderReading() {
|
||||
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) {
|
||||
if (event.data === "refreshTaskList") {
|
||||
this.getList();
|
||||
if (event.data === 'refreshTaskList') {
|
||||
this.getList()
|
||||
}
|
||||
},
|
||||
// 排序
|
||||
handleSortChange(column) {
|
||||
if (column.order === "ascending") {
|
||||
this.searchData.Asc = true;
|
||||
if (column.order === 'ascending') {
|
||||
this.searchData.Asc = true
|
||||
} else {
|
||||
this.searchData.Asc = false;
|
||||
this.searchData.Asc = false
|
||||
}
|
||||
this.searchData.SortField = column.prop;
|
||||
this.searchData.PageIndex = 1;
|
||||
this.getList();
|
||||
},
|
||||
},
|
||||
};
|
||||
this.searchData.SortField = column.prop
|
||||
this.searchData.PageIndex = 1
|
||||
this.getList()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -43,6 +43,16 @@
|
|||
</el-col>
|
||||
</el-row>
|
||||
<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
|
||||
size="small"
|
||||
|
@ -285,6 +295,16 @@
|
|||
</el-col>
|
||||
</el-row>
|
||||
<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
|
||||
size="small"
|
||||
|
@ -1198,6 +1218,7 @@ import SignForm from "@/views/trials/components/newSignForm";
|
|||
import { getToken } from "@/utils/auth";
|
||||
import const_ from "@/const/sign-code";
|
||||
import uploadPetClinicalData from "@/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue";
|
||||
import { downloadImage } from "@/utils/uploadZip.js";
|
||||
export default {
|
||||
name: "QualityAssurance",
|
||||
components: {
|
||||
|
@ -1332,6 +1353,18 @@ export default {
|
|||
}
|
||||
},
|
||||
methods: {
|
||||
// 打包下载
|
||||
async downloadImage(IsDicom) {
|
||||
try {
|
||||
await downloadImage(
|
||||
this.$route.query.trialId,
|
||||
this.data.Id,
|
||||
IsDicom
|
||||
);
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
},
|
||||
// 获取QC界面基本信息
|
||||
getQCInfo() {
|
||||
this.loading = true;
|
||||
|
|
|
@ -11,7 +11,7 @@ function resolve(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
|
||||
module.exports = {
|
||||
|
@ -63,7 +63,8 @@ module.exports = {
|
|||
// target: 'http://123.56.94.154:8079', // 国内测试环境2
|
||||
// target: 'http://123.56.94.154:7000', // 国内测试环境2
|
||||
// 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',
|
||||
changeOrigin: true,
|
||||
secure: false,
|
||||
|
@ -94,7 +95,7 @@ module.exports = {
|
|||
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({
|
||||
from: ['./dist/**'],
|
||||
dist: process.env.VUE_APP_OSS_PATH + distDate,
|
||||
|
|
Loading…
Reference in New Issue