22 Commits

Author SHA1 Message Date
wangxiaoshuang 04bd72e90f 下载问题修复
continuous-integration/drone/push Build is passing
2024-07-17 19:30:26 +08:00
wangxiaoshuang d7fcd79cb2 下载问题修复
continuous-integration/drone/push Build is passing
2024-07-17 19:16:42 +08:00
wangxiaoshuang bebd4c4aa0 重复下载提示
continuous-integration/drone/push Build is passing
2024-07-17 17:36:52 +08:00
wangxiaoshuang 81506cc337 下载文件改名
continuous-integration/drone/push Build is passing
2024-07-17 16:49:39 +08:00
caiyiling 13f105faa5 Merge branch 'uat' of https://gitea.frp.extimaging.com/XCKJ/irc_web into uat
continuous-integration/drone/push Build is passing
2024-07-17 14:59:51 +08:00
caiyiling 32ded49982 裁判阅片及医学审核预览图片问题修复 2024-07-17 14:59:10 +08:00
wangxiaoshuang 05ab287e81 修改版本号
continuous-integration/drone/push Build is passing
2024-07-17 13:05:32 +08:00
caiyiling de16944fd6 Merge branch 'uat' of https://gitea.frp.extimaging.com/XCKJ/irc_web into uat
continuous-integration/drone/push Build is passing
2024-07-16 11:22:33 +08:00
caiyiling be96158a73 医学审核更改 2024-07-16 11:22:18 +08:00
wangxiaoshuang 5368538d52 Merge branch 'uat' of https://gitea.frp.extimaging.com/XCKJ/irc_web into uat
continuous-integration/drone/push Build is running
2024-07-16 11:17:35 +08:00
wangxiaoshuang 4a659fdde4 bug调试 2024-07-16 11:17:25 +08:00
caiyiling 198e580288 Merge branch 'uat' of https://gitea.frp.extimaging.com/XCKJ/irc_web into uat
continuous-integration/drone/push Build is passing
2024-07-16 10:41:09 +08:00
caiyiling 3ada3585e5 裁判阅片修改 2024-07-16 10:39:42 +08:00
wangxiaoshuang 38ce7c1f56 bug调试
continuous-integration/drone/push Build is passing
2024-07-16 10:25:44 +08:00
wangxiaoshuang afb1d17853 bug调试
continuous-integration/drone/push Build is passing
2024-07-16 10:14:52 +08:00
wangxiaoshuang 01c2a29085 bug调试
continuous-integration/drone/push Build is passing
2024-07-16 09:58:26 +08:00
wangxiaoshuang c94abac896 iqc下载文件
continuous-integration/drone/push Build is passing
2024-07-15 17:00:58 +08:00
caiyiling fd0679dbd8 阅片添加跳过当前任务功能
continuous-integration/drone/push Build is passing
2024-07-15 14:50:50 +08:00
wangxiaoshuang 6137d9deff 1
continuous-integration/drone/push Build is passing
2024-07-15 13:06:07 +08:00
wangxiaoshuang 8a4674452f 美国环境修改
continuous-integration/drone/push Build is passing
2024-07-12 18:07:31 +08:00
hang a78195fbca uat 分支自动打包测试
continuous-integration/drone/push Build is passing
2024-07-12 15:43:41 +08:00
wangxiaoshuang 1a139af448 美国环境修改 2024-07-12 10:21:03 +08:00
40 changed files with 2069 additions and 609 deletions
+5 -5
View File
@@ -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}$
+46
View File
@@ -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'
+5 -36
View File
@@ -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
+1
View File
@@ -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
View File
@@ -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);
+16
View File
@@ -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
})
}
+8
View File
@@ -3675,3 +3675,11 @@ export function getTrialSiteSelectList(params) {
params
})
}
// 获取项目配置
export function getTrialExtralConfig(params) {
return request({
url: `/TrialConfig/getTrialExtralConfig`,
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

+52
View File
@@ -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

-1
View File
@@ -44,7 +44,6 @@ Viewer.setDefaults({
'rotatable': true,
'scalable': true,
'transition': true,
'fullscreen': true,
'keyboard': true,
'url': 'data-source'
}
+3 -3
View File
@@ -12,7 +12,7 @@ NProgress.configure({ showSpinner: false })
const whiteList = ['/ReviewersResearch', '/login', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/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)
@@ -56,7 +56,7 @@ router.beforeEach(async(to, from, next) => {
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
// 在免登录whiteList中,直接进入
if (to.path === '/readingDicoms' || to.path === '/noneDicomReading'){
if (to.path === '/readingDicoms' || to.path === '/noneDicomReading') {
OSSclient()
}
next()
@@ -68,7 +68,7 @@ router.beforeEach(async(to, from, next) => {
next(`/ReviewersResearch?`)
NProgress.done()
} else {
// 其他无权访问的页面将重定向到登录页面。
// 其他无权访问的页面将重定向到登录页面。
next(`/login?`)
NProgress.done()
}
+3 -4
View File
@@ -493,11 +493,10 @@ const actions = {
})
},
removeCustomizeMeasuredData({ state }, obj) {
return new Promise(async resolve => {
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
var measureData = state.visitTaskList[index].MeasureData
console.log('removeCustomizeMeasuredData',obj, state.visitTaskList[index].MeasureData)
console.log('removeCustomizeMeasuredData', obj, state.visitTaskList[index].MeasureData)
// var uuid = obj.measureData.data.uuid
// var idx = measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === uuid)
// console.log(obj, measureData)
@@ -682,7 +681,7 @@ const actions = {
} else {
// state.visitTaskList[index].MeasureData.push(obj.MeasureData.data)
state.visitTaskList[index].MeasureData.push({
MeasureData: obj.measureData ,
MeasureData: obj.measureData,
SeriesId: obj.measureData.seriesId,
StudyId: obj.measureData.studyId,
InstanceId: obj.measureData.instanceId,
@@ -898,7 +897,7 @@ const actions = {
},
setImageloadedInfo({ state }, obj) {
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
let prefetchInstanceCount = state.visitTaskList[index].StudyList[obj.studyIndex].SeriesList[obj.seriesIndex].prefetchInstanceCount
const prefetchInstanceCount = state.visitTaskList[index].StudyList[obj.studyIndex].SeriesList[obj.seriesIndex].prefetchInstanceCount
state.visitTaskList[index].StudyList[obj.studyIndex].SeriesList[obj.seriesIndex].prefetchInstanceCount = prefetchInstanceCount + 100
state.visitTaskList[index].StudyList[obj.studyIndex].SeriesList[obj.seriesIndex].imageloadedArr.push(obj.imageId)
},
+7
View File
@@ -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)
},
+2
View File
@@ -61,12 +61,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)
}
+1
View File
@@ -19,6 +19,7 @@ export const dcmUpload = async function (name, file, config) {
} catch (e) {
console.log(file, 'warning')
resolve(false)
console.log(e)
}
+1 -3
View File
@@ -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 = {
}
+72 -21
View File
@@ -6,40 +6,48 @@ import {
requestPackageAndAnonymizImage,
} from "@/api/load.js";
let flag = {};
export const downloadImage = async (id, id2) => {
if (flag[id2]) return
flag[id2] = true
export const resetFlag = () => {
flag = {}
}
export const downloadImage = async (id, id2, IsDicom = true) => {
if (flag[`${id2}_${IsDicom}`]) return Vue.prototype.$message.warning(Vue.prototype.$t('trials:upload:tip:uploading'));
flag[`${id2}_${IsDicom}`] = true
try {
let params = {
TrialId: id,
SubjectVisitId: id2
SubjectVisitId: id2,
IsDicom: IsDicom
}
let res = await requestPackageAndAnonymizImage(params);
flag[id2] = false;
if (res.IsSuccess) {
if (!res.Result) {
flag[`${id2}_${IsDicom}`] = false;
Vue.prototype.$message.warning(Vue.prototype.$t("trials:upload:message:not"))
return 1;
}
let a = document.createElement("a");
Vue.prototype.$message.success(Vue.prototype.$t("trials:upload:message:startUpload"));
let href = Vue.prototype.OSSclientConfig.basePath + res.Result;
let fileName =
res.Result.split("/")[res.Result.split("/").length - 1];
a.download = fileName;
a.href = href;
a.click();
URL.revokeObjectURL(href);
let timer = setTimeout(() => {
a = null;
href = null;
timer = null;
}, 500)
download(href, res.OtherInfo.FileName, { id2, IsDicom })
return 2;
// let a = document.createElement("a");
// // 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 {
flag[`${id2}_${IsDicom}`] = false;
return false;
}
} catch (err) {
flag[id2] = false;
flag[`${id2}_${IsDicom}`] = false;
console.log(err);
}
};
@@ -101,11 +109,11 @@ const setfolder = async (item) => {
})
.then((res) => {
saveAs(res, zipName + ".zip"); // 使用FileSaver.saveAs保存文件,文件名可自定义
flag[id2] = false;
flag[`${id2}_${IsDicom}`] = false;
zipObj = null;
});
})
.catch((reason) => { flag[id2] = false; });
.catch((reason) => { flag[`${id2}_${IsDicom}`] = false; });
};
const handleBatchDown = async (item, zip) => {
return new Promise((resolve) => {
@@ -141,4 +149,47 @@ export const fileDownload = (content, filename) => {
document.body.appendChild(eleLink);
eleLink.click();
document.body.removeChild(eleLink);
};
};
let download = async (downloadUrl, downloadFileName, res) => {
const blob = await getBlob(downloadUrl);
flag[`${res.id2}_${res.IsDicom}`] = false;
saveAsB(blob, downloadFileName);
}
let getBlob = (url) => {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onload = () => {
if (xhr.status === 200) {
resolve(xhr.response);
} else {
reject(new Error(`Request failed with status ${xhr.status}`));
}
};
xhr.onerror = () => {
reject(new Error('Request failed'));
};
xhr.send();
});
}
let saveAsB = (blob, filename) => {
const link = document.createElement('a');
const body = document.body;
link.href = window.URL.createObjectURL(blob);
link.download = filename;
// hide the link
link.style.display = 'none';
body.appendChild(link);
link.click();
body.removeChild(link);
window.URL.revokeObjectURL(link.href);
}
+5 -9
View File
@@ -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 />
@@ -183,7 +183,7 @@
{{ $t("login:title:system_title") }}
</p>
<p style="margin-bottom: 20px" v-else>{{ $t("login:title:system") }}</p>
<p style="margin-bottom: 20px">V1.5.2.001</p>
<p style="margin-bottom: 20px">V1.5.3.001</p>
<p style="margin-bottom: 20px" v-if="language === 'zh'">
Copyright © {{ new Date().getFullYear() }} 上海展影医疗科技有限公司
版权所有
@@ -211,8 +211,6 @@ import TopLang from "./topLang";
// import NoticeMarquee from '../trials/trials-layout/components/noticeMarquee'
import Vcode from "vue-puzzle-vcode";
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 },
@@ -256,8 +254,6 @@ export default {
isShow: false,
showCode: false,
Img1,
loginBg,
loginLogo,
};
},
computed: {
@@ -407,7 +403,7 @@ export default {
/* 修复input 背景不协调 和光标变色 */
$bg: #283443;
$light_gray: #0093dd;
$light_gray: #909399;
$cursor: #fff;
// @supports (-webkit-mask: none) and (not (cater-color: $cursor)) {
@@ -514,7 +510,7 @@ $light_gray: #606266;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
justify-content: flex-end;
}
}
.login-r {
@@ -537,7 +533,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;
+398 -172
View File
@@ -1,21 +1,38 @@
<template>
<div class="app-container my_menu">
<el-form :inline="true">
<el-form-item label="菜单名称">
<el-form-item :label="$t('system:menu:search:menuName')">
<el-input
v-model="queryParams.menuName"
placeholder="请输入菜单名称"
placeholder=""
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="queryParams.visible" placeholder="菜单状态" clearable size="small" />
<el-form-item :label="$t('system:menu:search:visible')">
<el-select
v-model="queryParams.visible"
placeholder=""
clearable
size="small"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd">新增</el-button>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>{{ $t("system:menu:button:search") }}</el-button
>
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>{{ $t("system:menu:button:add") }}</el-button
>
</el-form-item>
</el-form>
<div>
@@ -25,7 +42,8 @@
icon="el-icon-sort"
size="mini"
@click="toggleExpandAll"
>展开/折叠</el-button>
>{{ $t("system:menu:button:foldAndExpand") }}</el-button
>
</div>
<el-table
v-if="refreshTable"
@@ -33,38 +51,106 @@
:data="menuList"
:default-expand-all="isExpandAll"
row-key="MenuId"
:tree-props="{children: 'Children', hasChildren: 'hasChildren'}"
:tree-props="{ children: 'Children', hasChildren: 'hasChildren' }"
>
<el-table-column prop="MenuName" label="菜单名称" :show-overflow-tooltip="true" min-width="130px" />
<el-table-column prop="icon" label="图标" align="center" min-width="100px">
<el-table-column
prop="MenuName"
:label="$t('system:menu:table:menuName')"
:show-overflow-tooltip="true"
min-width="130px"
/>
<el-table-column
prop="icon"
:label="$t('system:menu:table:icon')"
align="center"
min-width="100px"
>
<template slot-scope="scope">
<svg-icon :icon-class="scope.row.MenuIcon" />
</template>
</el-table-column>
<el-table-column prop="ShowOrder" label="排序" min-width="60px" />
<el-table-column prop="Path" label="路由" min-width="120px" show-overflow-tooltip />
<el-table-column prop="ApiPath" label="接口名" min-width="180px" show-overflow-tooltip />
<el-table-column prop="Component" label="组件路径" min-width="180px" :show-overflow-tooltip="true" />
<!-- <el-table-column prop="Redirect" label="重定向" min-width="180px" :show-overflow-tooltip="true" />-->
<el-table-column prop="PermissionStr" label="权限标识" min-width="130px" :show-overflow-tooltip="true" />
<el-table-column prop="PermissionStr" label="类型" min-width="80px" :show-overflow-tooltip="true">
<el-table-column
prop="ShowOrder"
:label="$t('system:menu:table:showOrder')"
min-width="60px"
/>
<el-table-column
prop="Path"
:label="$t('system:menu:table:path')"
min-width="120px"
show-overflow-tooltip
/>
<el-table-column
prop="ApiPath"
:label="$t('system:menu:table:apiPath')"
min-width="180px"
show-overflow-tooltip
/>
<el-table-column
prop="Component"
:label="$t('system:menu:table:component')"
min-width="180px"
:show-overflow-tooltip="true"
/>
<!-- <el-table-column prop="Redirect" label="重定向" min-width="180px" :show-overflow-tooltip="true" />-->
<el-table-column
prop="PermissionStr"
:label="$t('system:menu:table:permissionStr')"
min-width="130px"
:show-overflow-tooltip="true"
/>
<el-table-column
prop="PermissionStr"
:label="$t('system:menu:table:type')"
min-width="80px"
:show-overflow-tooltip="true"
>
<template slot-scope="scope">
{{ scope.row.MenuType === 'M' ? '目录' : scope.row.MenuType === 'C' ? '菜单' : '权限点' }}
{{
scope.row.MenuType === "M"
? $t("system:menu:template:message:directttory")
: scope.row.MenuType === "C"
? $t("system:menu:template:message:menu")
: $t("system:menu:template:message:permission")
}}
</template>
</el-table-column>
<el-table-column label="显影" align="center" prop="CreateTime" min-width="80">
<el-table-column
:label="$t('system:menu:table:showOrNone')"
align="center"
prop="CreateTime"
min-width="80"
>
<template slot-scope="scope">
<el-tag v-if="!scope.row.IsDisplay" size="medium">显示</el-tag>
<el-tag v-else size="warning">隐藏</el-tag>
<el-tag v-if="!scope.row.IsDisplay" size="medium">{{
$t("system:menu:tag:show")
}}</el-tag>
<el-tag v-else size="warning">{{
$t("system:menu:tag:none")
}}</el-tag>
</template>
</el-table-column>
<el-table-column label="启用" align="center" prop="CreateTime" min-width="80">
<el-table-column
:label="$t('system:menu:table:enable')"
align="center"
prop="CreateTime"
min-width="80"
>
<template slot-scope="scope">
<el-tag v-if="scope.row.IsEnable" size="success">启用</el-tag>
<el-tag v-else size="danger">禁用</el-tag>
<el-tag v-if="scope.row.IsEnable" size="success">{{
$t("system:menu:tag:enable")
}}</el-tag>
<el-tag v-else size="danger">{{
$t("system:menu:tag:disable")
}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" min-width="180" class-name="small-padding fixed-width">
<el-table-column
:label="$t('system:menu:table:action')"
align="center"
min-width="180"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
v-hasPermi="['system:menu:edit']"
@@ -72,51 +158,72 @@
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改</el-button>
>{{ $t("system:menu:button:edit") }}</el-button
>
<el-button
v-hasPermi="['system:menu:add']"
size="mini"
type="text"
icon="el-icon-plus"
@click="handleAdd(scope.row)"
>新增</el-button>
>{{ $t("system:menu:button:add") }}</el-button
>
<el-button
v-hasPermi="['system:menu:delete']"
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button>
>{{ $t("system:menu:button:remove") }}</el-button
>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改菜单对话框 -->
<el-dialog :title="title" :close-on-click-modal="false" :visible.sync="open" width="680px" append-to-body>
<el-dialog
:title="title"
:close-on-click-modal="false"
:visible.sync="open"
width="680px"
append-to-body
>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-row>
<el-col :span="24">
<el-form-item label="上级菜单">
<el-form-item :label="$t('system:menu:form:lastMenu')">
<treeselect
v-model="form.ParentId"
:options="menuOptions"
:normalizer="normalizer"
:show-count="true"
placeholder="选择上级菜单"
placeholder=""
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="菜单类型" prop="menuType">
<el-form-item
:label="$t('system:menu:form:menuType')"
prop="menuType"
>
<el-radio-group v-model="form.MenuType">
<el-radio label="M">目录</el-radio>
<el-radio label="C">菜单</el-radio>
<el-radio label="F">权限点</el-radio>
<el-radio label="M">{{
$t("system:menu:template:message:directttory")
}}</el-radio>
<el-radio label="C">{{
$t("system:menu:template:message:menu")
}}</el-radio>
<el-radio label="F">{{
$t("system:menu:template:message:permission")
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item v-if="form.MenuType != 'F'" label="菜单图标">
<el-form-item
v-if="form.MenuType != 'F'"
:label="$t('system:menu:form:menuIcon')"
>
<el-popover
placement="bottom-start"
width="460"
@@ -124,118 +231,182 @@
@show="$refs['iconSelect'].reset()"
>
<IconSelect ref="iconSelect" @selected="selected" />
<el-input slot="reference" v-model="form.MenuIcon" placeholder="点击选择图标" readonly>
<el-input
slot="reference"
v-model="form.MenuIcon"
placeholder="点击选择图标"
readonly
>
<svg-icon
v-if="form.MenuIcon"
slot="prefix"
:icon-class="form.MenuIcon"
class="el-input__icon"
style="height: 28px;width: 16px;margin-left: 6px;"
style="height: 28px; width: 16px; margin-left: 6px"
/>
<i
v-else
slot="prefix"
class="el-icon-search el-input__icon"
/>
<i v-else slot="prefix" class="el-icon-search el-input__icon" />
</el-input>
</el-popover>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="菜单名称" prop="MenuName">
<el-input v-model="form.MenuName" placeholder="请输入菜单名称" />
<el-form-item
:label="$t('system:menu:form:menuName')"
prop="MenuName"
>
<el-input v-model="form.MenuName" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="显示排序" prop="ShowOrder">
<el-input-number v-model="form.ShowOrder" controls-position="right" :min="0" />
<el-form-item
:label="$t('system:menu:form:showOrder')"
prop="ShowOrder"
>
<el-input-number
v-model="form.ShowOrder"
controls-position="right"
:min="0"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.MenuType != 'F'">
<span slot="label">
<el-tooltip content="选择是外链则路由地址需要以`http(s)://`开头" placement="top">
<!--选择是外链则路由地址需要以`http(s)://`开头-->
<el-tooltip
:content="$t('system:menu:form:isExternalLinkMessage')"
placement="top"
>
<i class="el-icon-question" />
</el-tooltip>
是否外链
{{ $t("system:menu:form:isExternalLink") }}
</span>
<el-radio-group v-model="form.IsExternalLink">
<el-radio v-for="item of $d.YesOrNo" :label="item.value">{{item.label}}</el-radio>
<el-radio
v-for="item of $d.YesOrNo"
:label="item.value"
:key="item.id"
>{{ item.label }}</el-radio
>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.MenuType != 'F'" prop="path">
<span slot="label">
<el-tooltip content="访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头" placement="top">
<!--访问的路由地址`user`如外网地址需内链访问则以`http(s)://`开头-->
<el-tooltip
:content="$t('system:menu:form:pathMessage')"
placement="top"
>
<i class="el-icon-question" />
</el-tooltip>
路由地址
{{ $t("system:menu:form:path") }}
</span>
<el-input v-model="form.Path" placeholder="请输入路由地址" />
<el-input v-model="form.Path" placeholder="" />
</el-form-item>
</el-col>
<el-col v-if="form.MenuType == 'C'" :span="12">
<el-form-item prop="component">
<span slot="label">
<el-tooltip content="访问的组件路径,如:`system/user/index`,默认在`views`目录下" placement="top">
<!--访问的组件路径`system/user/index`默认在`views`目录下-->
<el-tooltip
:content="$t('system:menu:form:componentMessage')"
placement="top"
>
<i class="el-icon-question" />
</el-tooltip>
组件路径
{{ $t("system:menu:form:component") }}
</span>
<el-input v-model="form.Component" placeholder="请输入组件路径" />
<el-input v-model="form.Component" placeholder="" />
</el-form-item>
</el-col>
<el-col v-if="form.MenuType != 'F'" :span="12">
<el-form-item prop="Redirect Path">
<span slot="label">
<el-tooltip content="重定向路由,如:`/system/user/index`" placement="top">
<!--重定向路由`/system/user/index`-->
<el-tooltip
:content="$t('system:menu:form:redirectPathMessage')"
placement="top"
>
<i class="el-icon-question" />
</el-tooltip>
重定向
{{ $t("system:menu:form:redirectPath") }}
</span>
<el-input v-model="form.Redirect" placeholder="请输入重定向路由" />
<el-input v-model="form.Redirect" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.MenuType != 'M'">
<el-input v-model="form.PermissionStr" placeholder="请输入权限标识" maxlength="100" />
<el-input
v-model="form.PermissionStr"
placeholder=""
maxlength="100"
/>
<span slot="label">
<el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasPermi('system:user:list')`)" placement="top">
<!--控制器中定义的权限字符@PreAuthorize(`@ss.hasPermi('system:user:list')`)-->
<el-tooltip
:content="$t('system:menu:form:permissionStrMessage')"
placement="top"
>
<i class="el-icon-question" />
</el-tooltip>
权限字符
{{ $t("system:menu:form:permissionStr") }}
</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.MenuType != 'M'">
<el-input v-model="form.ApiPath" placeholder="接口名" />
<el-input v-model="form.ApiPath" placeholder="" />
<span slot="label">
<el-tooltip content="接口名" placement="top">
<!--接口名-->
<el-tooltip
:content="$t('system:menu:form:apiPathMessage')"
placement="top"
>
<i class="el-icon-question" />
</el-tooltip>
接口名
{{ $t("system:menu:form:apiPath") }}
</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.MenuType == 'C'">
<span slot="label">
<el-tooltip content="选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致" placement="top">
<!--选择是则会被`keep-alive`缓存需要匹配组件的`name`和地址保持一致-->
<el-tooltip
:content="$t('system:menu:form:isCacheMessage')"
placement="top"
>
<i class="el-icon-question" />
</el-tooltip>
是否缓存
{{ $t("system:menu:form:isCache") }}
</span>
<el-radio-group v-model="form.IsCache">
<el-radio :label="true">缓存</el-radio>
<el-radio :label="false">不缓存</el-radio>
<el-radio :label="true">{{
$t("system:menu:form:radio:cache")
}}</el-radio>
<el-radio :label="false">{{
$t("system:menu:form:radio:notCache")
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.MenuType != 'F'">
<span slot="label">
<el-tooltip content="选择隐藏则路由将不会出现在侧边栏但仍然可以访问" placement="top">
<!--选择隐藏则路由将不会出现在侧边栏但仍然可以访问-->
<el-tooltip
:content="$t('system:menu:form:isDisplayMessage')"
placement="top"
>
<i class="el-icon-question" />
</el-tooltip>
是否隐藏
{{ $t("system:menu:form:isDisplay") }}
</span>
<el-switch
v-model="form.IsDisplay"
@@ -247,10 +418,14 @@
<el-col :span="12">
<el-form-item v-if="form.MenuType != 'F'">
<span slot="label">
<el-tooltip content="选择隐藏则不会在trials模块的TAB中显示,但仍然可以访问" placement="top">
<!--c-->
<el-tooltip
:content="$t('system:menu:form:isInTabDisplayMessage')"
placement="top"
>
<i class="el-icon-question" />
</el-tooltip>
Tab显隐
{{ $t("system:menu:form:isInTabDisplay") }}
</span>
<el-switch
v-model="form.IsInTabDisplay"
@@ -262,10 +437,14 @@
<el-col :span="12">
<el-form-item v-if="form.MenuType != 'F'">
<span slot="label">
<el-tooltip content="选择停用则路由将不会出现在侧边栏也不能被访问" placement="top">
<!--选择停用则路由将不会出现在侧边栏也不能被访问-->
<el-tooltip
:content="$t('system:menu:form:isEnablesMessage')"
placement="top"
>
<i class="el-icon-question" />
</el-tooltip>
菜单状态
{{ $t("system:menu:form:isEnable") }}
</span>
<el-switch
v-model="form.IsEnable"
@@ -275,33 +454,41 @@
</el-form-item>
</el-col>
<el-col v-if="form.MenuType != 'F'" :span="24">
<el-form-item label="LangMark">
<el-form-item :label="$t('system:menu:form:LangMark')">
<el-input v-model="form.LanguageMark" placeholder="LangMark" />
</el-form-item>
</el-col>
<el-col v-if="form.MenuType != 'F'" :span="24">
<el-form-item label="mate">
<el-input v-model="form.Meta" type="textarea" placeholder="{ title: 'Setting', breadcrumb: false, role: [8, 1, 2, 3, 10] }" />
<el-form-item :label="$t('system:menu:form:meta')">
<el-input
v-model="form.Meta"
type="textarea"
placeholder="{ title: 'Setting', breadcrumb: false, role: [8, 1, 2, 3, 10] }"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm">{{
$t("system:menu:button:save")
}}</el-button>
<el-button @click="cancel">{{
$t("system:menu:button:canel")
}}</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { getMenuList, addOrUpdateMenu, deleteMenu } from '@/api/system/menu'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import IconSelect from '@/components/IconSelect'
import { getMenuList, addOrUpdateMenu, deleteMenu } from "@/api/system/menu";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import IconSelect from "@/components/IconSelect";
export default {
name: 'Menu',
name: "Menu",
components: { Treeselect, IconSelect },
data() {
return {
@@ -312,7 +499,7 @@ export default {
// 菜单树选项
menuOptions: [],
// 弹出层标题
title: '',
title: "",
// 是否显示弹出层
open: false,
// 菜单状态数据字典
@@ -320,7 +507,7 @@ export default {
// 查询参数
queryParams: {
menuName: undefined,
visible: undefined
visible: undefined,
},
// 是否展开,默认全部折叠
isExpandAll: false,
@@ -331,168 +518,207 @@ export default {
// 表单校验
rules: {
MenuName: [
{ required: true, message: '菜单名称不能为空', trigger: 'blur' }
{
required: true,
message: this.$t("system:menu:form:rule:notMenuName"),
trigger: "blur",
}, // 菜单名称不能为空
],
ShowOrder: [
{ required: true, message: '菜单顺序不能为空', trigger: 'blur' }
]
}
}
{
required: true,
message: this.$t("system:menu:form:rule:notShowOrder"),
trigger: "blur",
}, // 菜单顺序不能为空
],
},
};
},
created() {
console.log(this.hasPermi(['trials:trials-list:new', 'trials:trials-list:export1'], '&&'))
this.getList()
console.log(
this.hasPermi(
["trials:trials-list:new", "trials:trials-list:export1"],
"&&"
)
);
this.getList();
// this.getDicts("sys_show_hide").then(response => {
// this.visibleOptions = response.data;
// });
},
methods: {
toggleExpandAll() {
this.refreshTable = false
this.isExpandAll = !this.isExpandAll
this.refreshTable = false;
this.isExpandAll = !this.isExpandAll;
this.$nextTick(() => {
this.refreshTable = true
})
this.refreshTable = true;
});
},
normalizer(node) {
if (node.Children && !node.Children.length) {
delete node.Children
delete node.Children;
}
return {
id: node.MenuId,
label: node.MenuName,
children: node.Children
}
children: node.Children,
};
},
toTree(arr, ParentId) {
function loop(ParentId) {
const res = []
const res = [];
for (let i = 0; i < arr.length; i++) {
const item = arr[i]
item.hasChildren = false
const item = arr[i];
item.hasChildren = false;
if (item.ParentId !== ParentId) {
continue
continue;
}
item.Children = loop(item.MenuId)
res.push(item)
item.Children = loop(item.MenuId);
res.push(item);
}
return res
return res;
}
return loop(ParentId)
return loop(ParentId);
},
// 选择图标
selected(name) {
this.form.MenuIcon = name
this.form.MenuIcon = name;
},
/** 查询菜单列表 */
getList() {
this.loading = true
getMenuList(this.queryParams).then(res => {
this.menuList = this.toTree(res.Result, '00000000-0000-0000-0000-000000000000')
const menu = { MenuId: '00000000-0000-0000-0000-000000000000', MenuName: '主类目', Children: [] }
menu.Children = this.menuList
this.menuOptions = Object.assign([], [menu])
this.loading = false
}).catch(function() {})
this.loading = true;
getMenuList(this.queryParams)
.then((res) => {
this.menuList = this.toTree(
res.Result,
"00000000-0000-0000-0000-000000000000"
);
const menu = {
MenuId: "00000000-0000-0000-0000-000000000000",
MenuName: "主类目",
Children: [],
};
menu.Children = this.menuList;
this.menuOptions = Object.assign([], [menu]);
this.loading = false;
})
.catch(function () {});
},
/** 查询菜单下拉树结构 */
getTreeselect() {
this.loading = true
getMenuList({}).then(res => {
const menu = { MenuId: '00000000-0000-0000-0000-000000000000', MenuName: '主类目', Children: [] }
menu.Children = this.toTree(res.Result, '00000000-0000-0000-0000-000000000000')
this.menuOptions = Object.assign([], [menu])
this.loading = false
}).catch(function() {})
this.loading = true;
getMenuList({})
.then((res) => {
const menu = {
MenuId: "00000000-0000-0000-0000-000000000000",
MenuName: "主类目",
Children: [],
};
menu.Children = this.toTree(
res.Result,
"00000000-0000-0000-0000-000000000000"
);
this.menuOptions = Object.assign([], [menu]);
this.loading = false;
})
.catch(function () {});
},
// 菜单显示状态字典翻译
visibleFormat(row, column) {
if (row.MenuType === 'F') {
return ''
if (row.MenuType === "F") {
return "";
}
return this.selectDictLabel(this.visibleOptions, row.visible)
return this.selectDictLabel(this.visibleOptions, row.visible);
},
// 取消按钮
cancel() {
this.open = false
this.reset()
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
MenuId: null,
ParentId: null,
MenuType: 'M',
MenuIcon: '',
MenuName: '',
Path: '',
Component: '',
MenuType: "M",
MenuIcon: "",
MenuName: "",
Path: "",
Component: "",
ShowOrder: null,
IsEnable: true,
IsCache: false,
IsDisplay: false,
IsInTabDisplay: false,
IsExternalLink: false,
PermissionStr: '',
Note: '',
CreateTime: '',
PermissionStr: "",
Note: "",
CreateTime: "",
LanguageMark: null,
Apipath: null
}
this.resetForm('form')
Apipath: null,
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.getList()
this.getList();
},
/** 新增按钮操作 */
handleAdd(row) {
this.reset()
this.getTreeselect()
this.reset();
this.getTreeselect();
if (row != null) {
this.form.ParentId = row.MenuId
this.form.ParentId = row.MenuId;
}
this.open = true
this.title = '添加菜单'
this.open = true;
this.title = this.$t("system:menu:form:title:addMenu");
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
this.getTreeselect()
this.form = Object.assign({}, row)
this.open = true
this.title = '修改菜单'
this.reset();
this.getTreeselect();
this.form = Object.assign({}, row);
this.open = true;
this.title = this.$t("system:menu:form:title:editMenu");
},
/** 提交按钮 */
submitForm: function() {
this.$refs['form'].validate(valid => {
submitForm: function () {
this.$refs["form"].validate((valid) => {
if (valid) {
addOrUpdateMenu(this.form).then(response => {
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.open = false
this.getList()
})
addOrUpdateMenu(this.form).then((response) => {
this.$message.success(this.$t("common:message:savedSuccessfully"));
this.open = false;
this.getList();
});
}
})
});
},
/** 删除按钮操作 */
handleDelete(row) {
this.$confirm('是否确认删除名称为"' + row.MenuName + '"的数据项?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function() {
return deleteMenu(row.MenuId)
}).then(() => {
this.getList()
this.$message.success('删除成功')
}).catch(function() {})
}
}
}
let message = this.$t("system:menu:confirm:message:delete").replace(
"xxx",
row.MenuName
);
//'是否确认删除名称为"' + row.MenuName + '"的数据项?'
this.$confirm(message, this.$t("system:menu:confirm:title:warning"), {
confirmButtonText: this.$t("system:menu:button:save"),
cancelButtonText: this.$t("system:menu:button:canel"),
type: "warning",
})
.then(function () {
return deleteMenu(row.MenuId);
})
.then(() => {
this.getList();
this.$message.success(this.$t("common:message:deletedSuccessfully"));
})
.catch(function () {});
},
},
};
</script>
<style lang="scss">
.vue-treeselect div{
line-height: 40px;
}
.vue-treeselect div {
line-height: 40px;
}
</style>
+146 -93
View File
@@ -16,13 +16,17 @@
<el-form-item label="Shortname: " prop="UserTypeShortName">
<el-input v-model="form.UserTypeShortName" />
</el-form-item>
<el-form-item label="是否内部角色: " prop="IsInternal">
<el-form-item
:label="$t('system:role:form:isInternal')"
prop="IsInternal"
>
<el-radio-group v-model="form.IsInternal">
<el-radio
v-for="item of $d.YesOrNo"
:key="`IsInternal${item.value}`"
:label="item.value"
>{{ item.label }}</el-radio>
>{{ item.label }}</el-radio
>
</el-radio-group>
</el-form-item>
@@ -38,7 +42,11 @@
</el-form-item>
<el-form-item label="Order: ">
<el-input-number v-model="form.Order" controls-position="right" :min="0" />
<el-input-number
v-model="form.Order"
controls-position="right"
:min="0"
/>
</el-form-item>
<el-form-item label="PermissionStr: " prop="PermissionStr">
<el-input v-model="form.PermissionStr" />
@@ -58,9 +66,23 @@
<el-input v-model="form.Description" type="textarea" :rows="5" />
</el-form-item>
<el-form-item label="role: ">
<el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event)">展开/折叠</el-checkbox>
<el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event)">全选/全不选</el-checkbox>
<el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event)">父子联动</el-checkbox>
<el-checkbox
v-model="menuExpand"
@change="handleCheckedTreeExpand($event)"
>{{ $t("system:role:form:checkbox:menuExpand") }}</el-checkbox
>
<el-checkbox
v-model="menuNodeAll"
@change="handleCheckedTreeNodeAll($event)"
>{{ $t("system:role:form:checkbox:menuNodeAll") }}</el-checkbox
>
<el-checkbox
v-model="form.menuCheckStrictly"
@change="handleCheckedTreeConnect($event)"
>{{
$t("system:role:form:checkbox:menuCheckStrictly")
}}</el-checkbox
>
<el-tree
ref="menu"
class="tree-border"
@@ -76,155 +98,186 @@
</el-form>
</template>
<template slot="dialog-footer">
<el-button :disabled="btnLoading" size="small" type="primary" @click="model_cfg.visible = false">Cancel
<el-button
:disabled="btnLoading"
size="small"
type="primary"
@click="model_cfg.visible = false"
>Cancel
</el-button>
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSave">Save</el-button>
<el-button
size="small"
type="primary"
:loading="btnLoading"
@click="handleSave"
>Save</el-button
>
</template>
</base-model>
</template>
<script>
import { addOrUpdateUserType } from '@/api/admin'
import { addOrUpdateUserType } from "@/api/admin";
// import { addOrUpdateUserType } from '@/api/system/role'
// import { getMenuList } from '@/api/system/menu'
import { getMenuList } from '@/api/system/menu'
import { model_cfg } from '../role'
import BaseModel from '@/components/BaseModel'
import { getMenuList } from "@/api/system/menu";
import { model_cfg } from "../role";
import BaseModel from "@/components/BaseModel";
export default {
components: { BaseModel },
dicts: ['UserTypeGroup'],
dicts: ["UserTypeGroup"],
props: {
data: {
type: Object,
default() {
return {
Id: '',
UserTypeName: '',
Id: "",
UserTypeName: "",
IsInternal: true,
UserTypeShortName: '',
Order: '',
Description: '',
PermissionStr: '',
UserTypeEnum: null
}
}
}
UserTypeShortName: "",
Order: "",
Description: "",
PermissionStr: "",
UserTypeEnum: null,
};
},
},
},
data() {
return {
menuExpand: false,
menuNodeAll: false,
userTypeGroupOptions: [{ value: 1, label: 'Trial' }, { value: 2, label: 'Reviewer' }, { value: 3, label: 'Other' }],
userTypeGroupOptions: [
{ value: 1, label: "Trial" },
{ value: 2, label: "Reviewer" },
{ value: 3, label: "Other" },
],
model_cfg,
defaultProps: {
children: 'Children',
label: 'MenuName'
children: "Children",
label: "MenuName",
},
form: {
Id: '',
UserType: '',
Id: "",
UserType: "",
IsInternal: true,
UserTypeShortName: '',
UserTypeShortName: "",
Type: null,
Description: '',
Description: "",
UserTypeGroupIdList: [],
menuCheckStrictly: true
menuCheckStrictly: true,
},
rules: {
UserTypeName: [{ required: true, message: 'Please specify', trigger: 'blur' }, {
max: 50,
message: 'The maximum length is 50'
}],
UserTypeShortName: [{ required: true, message: 'Please specify', trigger: 'blur' }, {
max: 50,
message: 'The maximum length is 50',
trigger: 'blur'
}],
Description: [{ max: 500, message: 'The maximum length is 500' }],
UserTypeGroupIdList: [{ required: true, message: 'Please specify', trigger: 'blur' }],
UserTypeEnum: [{ required: true, message: 'Please select', trigger: 'blur' }]
UserTypeName: [
{ required: true, message: "Please specify", trigger: "blur" },
{
max: 50,
message: "The maximum length is 50",
},
],
UserTypeShortName: [
{ required: true, message: "Please specify", trigger: "blur" },
{
max: 50,
message: "The maximum length is 50",
trigger: "blur",
},
],
Description: [{ max: 500, message: "The maximum length is 500" }],
UserTypeGroupIdList: [
{ required: true, message: "Please specify", trigger: "blur" },
],
UserTypeEnum: [
{ required: true, message: "Please select", trigger: "blur" },
],
},
menuOptions: [],
btnLoading: false
}
btnLoading: false,
};
},
mounted() {
this.getMenuList()
this.getMenuList();
if (Object.keys(this.data).length && this.data.Id) {
this.form = { ...this.data }
this.form = { ...this.data };
}
},
methods: {
handleCheckedTreeConnect(value) {
this.form.menuCheckStrictly = !!value
this.form.menuCheckStrictly = !!value;
},
getMenuAllCheckedKeys() {
// 目前被选中的菜单节点
const checkedKeys = this.$refs.menu.getCheckedKeys()
const checkedKeys = this.$refs.menu.getCheckedKeys();
// 半选中的菜单节点
const halfCheckedKeys = this.$refs.menu.getHalfCheckedKeys()
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
return checkedKeys
const halfCheckedKeys = this.$refs.menu.getHalfCheckedKeys();
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
return checkedKeys;
},
handleCheckedTreeExpand(value) {
const treeList = this.menuOptions
const treeList = this.menuOptions;
for (let i = 0; i < treeList.length; i++) {
this.$refs.menu.store.nodesMap[treeList[i].MenuId].expanded = value
this.$refs.menu.store.nodesMap[treeList[i].MenuId].expanded = value;
}
},
handleCheckedTreeNodeAll(value, type) {
this.$refs.menu.setCheckedNodes(value ? this.menuOptions : [])
this.$refs.menu.setCheckedNodes(value ? this.menuOptions : []);
},
toTree(arr, ParentId) {
function loop(ParentId) {
const res = []
const res = [];
for (let i = 0; i < arr.length; i++) {
const item = arr[i]
item.hasChildren = false
const item = arr[i];
item.hasChildren = false;
if (item.ParentId !== ParentId) {
continue
continue;
}
item.Children = loop(item.MenuId)
res.push(item)
item.Children = loop(item.MenuId);
res.push(item);
}
return res
return res;
}
return loop(ParentId)
return loop(ParentId);
},
getMenuList() {
getMenuList({}).then(res => {
const menu = this.toTree(res.Result, '00000000-0000-0000-0000-000000000000')
this.menuOptions = menu
console.log(this.menuOptions)
this.$nextTick(() => {
this.form.MenuIds.forEach(v => {
this.$refs.menu.setChecked(v, true, false)
})
getMenuList({})
.then((res) => {
const menu = this.toTree(
res.Result,
"00000000-0000-0000-0000-000000000000"
);
this.menuOptions = menu;
console.log(this.menuOptions);
this.$nextTick(() => {
this.form.MenuIds.forEach((v) => {
this.$refs.menu.setChecked(v, true, false);
});
});
})
}).catch(function() {
})
.catch(function () {});
},
handleSave() {
this.$refs.roleForm.validate(valid => {
if (!valid) return
this.btnLoading = true
this.model_cfg.showClose = false
this.form.MenuIds = this.getMenuAllCheckedKeys()
console.log(this.form.MenuIds)
addOrUpdateUserType(this.form).then(res => {
this.btnLoading = false
this.$refs['roleForm'].resetFields()
this.$emit('close')
this.model_cfg.showClose = true
this.$message.success('Saved successfully!')
}).catch(() => {
this.btnLoading = false
this.model_cfg.showClose = true
})
})
}
}
}
this.$refs.roleForm.validate((valid) => {
if (!valid) return;
this.btnLoading = true;
this.model_cfg.showClose = false;
this.form.MenuIds = this.getMenuAllCheckedKeys();
console.log(this.form.MenuIds);
addOrUpdateUserType(this.form)
.then((res) => {
this.btnLoading = false;
this.$refs["roleForm"].resetFields();
this.$emit("close");
this.model_cfg.showClose = true;
this.$message.success("Saved successfully!");
})
.catch(() => {
this.btnLoading = false;
this.model_cfg.showClose = true;
});
});
},
},
};
</script>
@@ -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;
}
@@ -281,6 +281,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"
@@ -203,45 +203,40 @@
>
<i slot="default" class="el-icon-plus" />
<div slot="file" slot-scope="{file}">
<img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
crossorigin="anonymous"
>
<span class="el-upload-list__item-actions">
<span
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
<viewer :images="images" :ref="file.url">
<img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
crossorigin="anonymous"
>
<i class="el-icon-zoom-in" />
</span>
<span class="el-upload-list__item-actions">
<span
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
>
<i class="el-icon-zoom-in" />
</span>
<span
v-if="adInfo.ReadingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" />
<span
v-if="adInfo.ReadingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" />
</span>
</span>
</span>
</viewer>
</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>
<!-- 提交 -->
@@ -317,12 +312,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 +387,8 @@ export default {
judgeResultArmEnum: '',
criterionType: null,
openWindow: null,
isFixed:false
isFixed: false,
images: []
}
},
// watch: {
@@ -407,6 +405,7 @@ export default {
// }
// },
mounted() {
this.initializeViewer()
this.criterionType = parseInt(this.$route.query.criterionType)
this.getAdInfo()
if (this.isReadingShowPreviousResults) {
@@ -708,14 +707,42 @@ export default {
},
// 预览图片
handlePictureCardPreview(file) {
this.imageUrl = this.OSSclientConfig.basePath + file.url
this.imgVisible = true
this.images = this.fileList.map(f => this.OSSclientConfig.basePath + f.url)
// this.imageUrl = this.OSSclientConfig.basePath + file.url
this.$refs[file.url].$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 }
})
}
}
@@ -92,46 +92,49 @@
>
<i slot="default" class="el-icon-plus" />
<div slot="file" slot-scope="{file}">
<img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
crossOrigin="anonymous"
alt=""
>
<span class="el-upload-list__item-actions">
<span
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
<viewer :images="images" :ref="file.url">
<img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
crossOrigin="anonymous"
alt=""
>
<i class="el-icon-zoom-in" />
</span>
<span class="el-upload-list__item-actions">
<span
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
>
<i class="el-icon-zoom-in" />
</span>
<span
v-if="!isSendMessage && auditState!==2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" />
<span
v-if="!isSendMessage && auditState!==2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" />
</span>
</span>
</span>
</viewer>
</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 +173,7 @@
import { saveMedicalReviewInfo } from '@/api/trials'
import ChatForm from './ChatForm'
import CloseQC from './CloseQC'
import Viewer from 'v-viewer'
export default {
name: 'AuditConclusions',
components: {
@@ -220,10 +224,12 @@ export default {
userTypeEnumInt: zzSessionStorage.getItem('userTypeEnumInt') * 1,
isClosedDialog: false,
isSendMessage: false,
closeQuestionVisible: false
closeQuestionVisible: false,
images:[]
}
},
mounted() {
this.initializeViewer()
this.initForm()
},
methods: {
@@ -379,14 +385,20 @@ export default {
},
//
handlePictureCardPreview(file) {
this.imageUrl = this.OSSclientConfig.basePath + file.url
this.imgVisible = true
this.images = this.fileList.map(f => this.OSSclientConfig.basePath + f.url)
// this.imageUrl = this.OSSclientConfig.basePath + file.url
this.$refs[file.url].$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)
}
}
}
}
@@ -372,7 +372,7 @@
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" />
<el-dialog
v-if="ConfirmReReadingVisible"
title="驳回"
:title="$t('trials:rereadTrack:reject:title:reject')"
:visible.sync="ConfirmReReadingVisible"
width="600px"
append-to-body
@@ -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 , resetFlag } from "@/utils/uploadZip.js";
export default {
name: "QualityAssurance",
components: {
@@ -1310,6 +1331,9 @@ export default {
BodyPart: {},
};
},
beforeDestroy(){
resetFlag();
},
async mounted() {
this.BodyPart.Bodypart = await this.$getBodyPart(this.$route.query.trialId);
if (this.disabled) {
@@ -1332,6 +1356,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;
+4 -3
View File
@@ -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,