Compare commits

..

44 Commits
main ... uat_us

Author SHA1 Message Date
wangxiaoshuang 8cef0141a4 Merge branch 'uat' into uat_us
# Conflicts:
#	src/views/login/index.vue
#	vue.config.js
2025-10-31 15:55:58 +08:00
wangxiaoshuang 88a7634ed3 阅片快捷键注册
continuous-integration/drone/push Build encountered an error Details
2025-10-16 19:35:53 +08:00
wangxiaoshuang 60415e41d1 uat环境打包配置修改 2025-02-10 14:33:00 +08:00
wangxiaoshuang d7e85aa766 Merge branch 'main' into uat_us 2025-02-10 14:18:22 +08:00
wangxiaoshuang ef4d6420f3 美国uat环境配置修改,使用gzip压缩 2025-02-08 15:42:54 +08:00
wangxiaoshuang b6ffcd3d6b Merge branch 'main' into uat_us 2025-01-24 16:33:53 +08:00
wangxiaoshuang 914a6af94a LiLi简历设置去除盲化中文名称 2025-01-24 14:02:11 +08:00
wangxiaoshuang fee7e80929 打包配置修改 2025-01-24 13:57:32 +08:00
wangxiaoshuang d065b8b2c1 LiLi简历去除身份证、手机号校验,预览不显示中文简历 2025-01-24 13:56:48 +08:00
wangxiaoshuang 52445f3791 Merge branch 'main' into uat_us 2025-01-24 13:51:27 +08:00
wangxiaoshuang c4f8e08b91 LiLi环境logo 2025-01-24 10:19:56 +08:00
wangxiaoshuang f7968667f6 Merge branch 'main' into uat_us 2025-01-24 10:17:54 +08:00
wangxiaoshuang 24303b208d Merge branch 'main' into uat_us 2025-01-23 18:41:20 +08:00
wangxiaoshuang 296c251847 1 2025-01-23 18:40:25 +08:00
wangxiaoshuang 3b9e5cddb7 Merge branch 'main' into uat_us 2025-01-23 16:37:18 +08:00
wangxiaoshuang d11092338d 打包配置修改 2025-01-23 14:06:28 +08:00
wangxiaoshuang 848427ac3c Merge branch 'main' into uat_us 2025-01-23 13:03:36 +08:00
wangxiaoshuang d70cffe306 Merge branch 'main' into uat_us 2025-01-22 15:29:37 +08:00
wangxiaoshuang 0cd44bf4c6 Merge branch 'main' into uat_us 2025-01-21 15:51:22 +08:00
DESKTOP-6C3NK6N\WXS a2939e52b2 v1.7.0发布 2024-10-14 17:05:51 +08:00
DESKTOP-6C3NK6N\WXS 99e6f700c3 国际化修改 2024-09-14 10:33:27 +08:00
DESKTOP-6C3NK6N\WXS 45c50bf67d 1.6版本发布 2024-09-05 11:15:04 +08:00
DESKTOP-6C3NK6N\WXS 19e3177e23 Merge branch 'uat' into uat_us 2024-09-05 10:45:21 +08:00
DESKTOP-6C3NK6N\WXS 437010c0f7 1 2024-08-30 13:40:35 +08:00
DESKTOP-6C3NK6N\WXS 01b3d6e85e 1 2024-08-12 15:43:38 +08:00
DESKTOP-6C3NK6N\WXS cb032485e1 Merge branch 'uat' into uat_us 2024-08-12 14:39:21 +08:00
DESKTOP-6C3NK6N\WXS 4b771a9d70 1 2024-08-12 13:43:26 +08:00
DESKTOP-6C3NK6N\WXS 86321d8405 Merge branch 'uat' into uat_us 2024-08-12 13:42:50 +08:00
DESKTOP-6C3NK6N\WXS b9f3b24608 Merge branch 'uat' into uat_us 2024-08-09 13:42:57 +08:00
DESKTOP-6C3NK6N\WXS bde8a7d572 1 2024-08-09 13:12:16 +08:00
DESKTOP-6C3NK6N\WXS 267ee60fc2 Merge branch 'uat' into uat_us 2024-08-09 13:11:36 +08:00
DESKTOP-6C3NK6N\WXS ef891857c4 1 2024-08-08 16:42:14 +08:00
DESKTOP-6C3NK6N\WXS 787f6425e0 Merge branch 'uat' into uat_us 2024-08-08 16:41:40 +08:00
DESKTOP-6C3NK6N\WXS 4929bb594d Merge branch 'uat' into uat_us 2024-08-07 18:31:12 +08:00
DESKTOP-6C3NK6N\WXS 4b9c2a073b 1 2024-08-07 18:17:17 +08:00
DESKTOP-6C3NK6N\WXS 861c7022b9 Merge branch 'uat' into uat_us 2024-08-07 18:17:05 +08:00
DESKTOP-6C3NK6N\WXS 21e0568b90 Merge branch 'uat' into uat_us 2024-08-07 17:27:36 +08:00
DESKTOP-6C3NK6N\WXS ffc9372c25 Merge branch 'uat' into uat_us 2024-08-07 16:20:52 +08:00
DESKTOP-6C3NK6N\WXS a58a6e4931 Merge branch 'uat' into uat_us 2024-08-07 15:33:24 +08:00
DESKTOP-6C3NK6N\WXS 6ac94ec1a0 Merge branch 'uat' into uat_us 2024-08-02 14:17:49 +08:00
DESKTOP-6C3NK6N\WXS ddc175961c Merge branch 'uat' into uat_us 2024-08-02 14:09:18 +08:00
DESKTOP-6C3NK6N\WXS 098a838c1e 美国测试环境 2024-08-02 09:52:14 +08:00
DESKTOP-6C3NK6N\WXS 6bb7d47511 Merge branch 'uat' into uat_us 2024-07-31 14:08:34 +08:00
DESKTOP-6C3NK6N\WXS 8e641300d2 1 2024-07-30 18:09:14 +08:00
178 changed files with 12412 additions and 20945 deletions

View File

@ -2,7 +2,11 @@
ENV = 'usa' ENV = 'usa'
NODE_ENV = 'usa' NODE_ENV = 'usa'
# base public path # base public path
VUE_APP_BASE_PATH = 'https://ei-code-prod.s3.amazonaws.com/2024-07-30/' # VUE_APP_BASE_PATH = 'https://d3taa4kz0xxv95.cloudfront.net/2025-10-31/'
VUE_APP_BASE_PATH = '/'
# onlyoffice地址
VUE_APP_ONLYOFFICE_URL = "https://onlyoffice.uat.elevateimaging.ai"
# 是否开启登陆限制 true:是 false:否 # 是否开启登陆限制 true:是 false:否
VUE_APP_LOGIN_FOR_PERMISSION = true VUE_APP_LOGIN_FOR_PERMISSION = true

View File

@ -2,7 +2,7 @@
ENV = 'usa' ENV = 'usa'
NODE_ENV = 'usa' NODE_ENV = 'usa'
# base public path # base public path
VUE_APP_BASE_PATH = 'https://ei-med-s3-code.s3.amazonaws.com/2024-07-30/' VUE_APP_BASE_PATH = 'https://ei-med-s3-code.s3.amazonaws.com/2025-01-24/'
# 是否开启登陆限制 true:是 false:否 # 是否开启登陆限制 true:是 false:否
VUE_APP_LOGIN_FOR_PERMISSION = true VUE_APP_LOGIN_FOR_PERMISSION = true

44
.env.usa_test Normal file
View File

@ -0,0 +1,44 @@
# just a flag
ENV = 'usa'
NODE_ENV = 'usa'
# base public path
VUE_APP_BASE_PATH = 'https://ei-code-prod.s3.amazonaws.com/2024-08-12/'
# 是否开启登陆限制 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-uat.oss-cn-shanghai.aliyuncs.com'
VUE_APP_OSS_CONFIG_REGION = 'oss-cn-shanghai'
VUE_APP_OSS_CONFIG_BUCKET = 'zyypacs-uat'
VUE_APP_OSS_PATH = '/usa/dist'

View File

@ -6,6 +6,7 @@
"build": "vue-cli-service build", "build": "vue-cli-service build",
"build:prod": "vue-cli-service build --mode prod", "build:prod": "vue-cli-service build --mode prod",
"build:uat": "vue-cli-service build --mode uat", "build:uat": "vue-cli-service build --mode uat",
"build:usa_test": "vue-cli-service build --mode usa_test",
"build:usa": "vue-cli-service build --mode usa", "build:usa": "vue-cli-service build --mode usa",
"build:usa_prod": "vue-cli-service build --mode usa_prod", "build:usa_prod": "vue-cli-service build --mode usa_prod",
"pre": "vue-cli-service build --mode pre", "pre": "vue-cli-service build --mode pre",
@ -20,7 +21,6 @@
"@cornerstonejs/core": "^2.19.7", "@cornerstonejs/core": "^2.19.7",
"@cornerstonejs/dicom-image-loader": "^2.19.7", "@cornerstonejs/dicom-image-loader": "^2.19.7",
"@cornerstonejs/tools": "^2.19.7", "@cornerstonejs/tools": "^2.19.7",
"@fingerprintjs/fingerprintjs": "^4.6.2",
"@icr/polyseg-wasm": "^0.4.0", "@icr/polyseg-wasm": "^0.4.0",
"@microsoft/signalr": "^8.0.7", "@microsoft/signalr": "^8.0.7",
"@riophae/vue-treeselect": "^0.4.0", "@riophae/vue-treeselect": "^0.4.0",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

View File

@ -350,43 +350,3 @@ export function getUserJoinedTrialList(data) {
data data
}) })
} }
// 邮件日志-日志列表
export function getEmailLogList(data) {
return request({
url: `/EmailLog/getEmailLogList`,
method: 'post',
data
})
}
// 邮件日志-日志详情
export function getEmailInfo(data) {
return request({
url: `/EmailLog/getEmailInfo`,
method: 'post',
data
})
}
// 邮件日志-重发邮件
export function resendEmail(data) {
return request({
url: `/EmailLog/resendEmail`,
method: 'post',
data
})
}
// 邮件日志-同步邮件
export function synchronizationEmail(data) {
return request({
url: `/EmailLog/synchronizationEmail`,
method: 'post',
data
})
}
// 邮件日志-重发列表
export function getReSendEmail(data) {
return request({
url: `/EmailLog/getReSendEmail`,
method: 'post',
data
})
}

View File

@ -1403,74 +1403,3 @@ export function batchUpdateEmail(data) {
data data
}) })
} }
// 隐私政策和用户协议-获取列表
export function getUserAgreementList(data) {
return request({
url: `/UserAgreement/getUserAgreementList`,
method: 'post',
data
})
}
// 隐私政策和用户协议-设置当前版本
export function setCurrentVersion(data) {
return request({
url: `/UserAgreement/setCurrentVersion`,
method: 'post',
data
})
}
// 隐私政策和用户协议-新增或修改
export function addOrUpdateUserAgreement(data) {
return request({
url: `/UserAgreement/addOrUpdateUserAgreement`,
method: 'post',
data
})
}
// 隐私政策和用户协议-删除
export function deleteUserAgreement(id) {
return request({
url: `/UserAgreement/deleteUserAgreement/${id}`,
method: 'delete',
})
}
// 隐私政策和用户协议-详情
export function getUserAgreementById(data) {
return request({
url: `/UserAgreement/getUserAgreementById`,
method: 'post',
data
})
}
// 隐私政策和用户协议-当前版本
export function getCurrentVersionUserAgreements(data) {
return request({
url: `/UserAgreement/getCurrentVersionUserAgreements`,
method: 'post',
data
})
}
// 获取系统阅片关键点文件列表
export function getSystemCriterionKeyFileList(data) {
return request({
url: `/SystemCriterionKeyFile/getSystemCriterionKeyFileList`,
method: 'post',
data
})
}
// 新增/修改系统阅片关键点文件
export function addOrUpdateSystemCriterionKeyFile(data) {
return request({
url: `/SystemCriterionKeyFile/addOrUpdateSystemCriterionKeyFile`,
method: 'post',
data
})
}
// 删除系统阅片关键点文件
export function deleteSystemCriterionKeyFile(systemCriterionKeyFileId) {
return request({
url: `/SystemCriterionKeyFile/deleteSystemCriterionKeyFile/${systemCriterionKeyFileId}`,
method: 'delete'
})
}

View File

@ -255,14 +255,6 @@ export function getCommonJudgeRatioList_Export(data) {
data data
}) })
} }
export function getTumor_CDISC_Export(data) {
return requestDownload({
url: `/Tumor_CDISC_Export/getTumor_CDISC_Export`,
responseType: 'blob',
method: 'post',
data
})
}
// 导出国际化列表 // 导出国际化列表
export function GetInternationalizationList_Export(data) { export function GetInternationalizationList_Export(data) {
return requestDownload({ return requestDownload({

View File

@ -294,28 +294,3 @@ export function readingImport(param) {
data: param data: param
}) })
} }
// 非dicom阅片保存标记
export function saveAnswerAndBindingNoneDicomMark(param) {
return request({
url: `/ReadingImageTask/saveAnswerAndBindingNoneDicomMark`,
method: 'post',
data: param
})
}
// 非dicom按比例修改答案
export function changePlottingScaleChangeAnswer(param) {
return request({
url: `/ReadingImageTask/changePlottingScaleChangeAnswer`,
method: 'post',
data: param
})
}
// 阅片获取图表数据
export function getReportsChartData(param) {
return request({
url: `/ReadingImageTask/getReportsChartData`,
method: 'post',
data: param
})
}

View File

@ -26,11 +26,8 @@ export function getTrialSurveyInitInfo(trialId) {
export function getSiteSurveyInfo(trialId, id) { export function getSiteSurveyInfo(trialId, id) {
return request({ return request({
url: `/TrialSiteSurvey/getSiteSurveyInfo/${trialId}`, url: `/TrialSiteSurvey/getSiteSurveyInfo/${trialId}/${id}`,
method: 'get', method: 'get'
params: {
TrialsiteSurveyId: id
}
}) })
} }

View File

@ -1203,13 +1203,7 @@ export function getConsistencyVerificationList(param) {
data: param data: param
}) })
} }
export function getConsistencyCheckFileList(param) {
return request({
url: `/QCList/getConsistencyCheckFileList`,
method: 'post',
data: param
})
}
export function getCheckChallengeDialogList(subjectVisitId) { export function getCheckChallengeDialogList(subjectVisitId) {
return request({ return request({
url: `/QCList/getCheckChallengeDialogList/${subjectVisitId}`, url: `/QCList/getCheckChallengeDialogList/${subjectVisitId}`,
@ -1262,11 +1256,11 @@ export function getCRCVisitChallengeAndDialog(subjectVisitId, trialQCProcess) {
}) })
} }
export function uploadVisitCheckExcel(trialId, file, isFullCheck = false) { export function uploadVisitCheckExcel(trialId, file) {
const formData = new FormData() const formData = new FormData()
formData.append('file', file) formData.append('file', file)
return request({ return request({
url: `/QCOperation/UploadVisitCheckExcel/${trialId}?isFullCheck=${isFullCheck}`, url: `/QCOperation/UploadVisitCheckExcel/${trialId}`,
method: 'post', method: 'post',
data: formData data: formData
}) })
@ -2839,13 +2833,7 @@ export function getSplitPPdSum(param) {
data: param data: param
}) })
} }
export function getSplitPPdSumNoPet(param) {
return request({
url: `/LuganoWithoutPETCalculate/getSplitPPdSum`,
method: 'post',
data: param
})
}
export function submitDicomVisitTask(param) { export function submitDicomVisitTask(param) {
return request({ return request({
url: `/Inspection/ReadingImageTask/SubmitDicomVisitTask`, url: `/Inspection/ReadingImageTask/SubmitDicomVisitTask`,
@ -2884,13 +2872,7 @@ export function getIsSuvMaxLesion(param) {
data: param data: param
}) })
} }
export function getIsSuvMaxLesionNoPet(param) {
return request({
url: `/LuganoWithoutPETCalculate/getIsSuvMaxLesion`,
method: 'post',
data: param
})
}
export function getCanChooseNotMerge(param) { export function getCanChooseNotMerge(param) {
return request({ return request({
url: `/LuganoCalculate/getCanChooseNotMerge`, url: `/LuganoCalculate/getCanChooseNotMerge`,
@ -2898,13 +2880,6 @@ export function getCanChooseNotMerge(param) {
data: param data: param
}) })
} }
export function getCanChooseNotMergeNoPet(param) {
return request({
url: `/LuganoWithoutPETCalculate/getCanChooseNotMerge`,
method: 'post',
data: param
})
}
export function saveTaskQuestion(saveQuestionType, param) { export function saveTaskQuestion(saveQuestionType, param) {
return request({ return request({
url: `/SaveTaskQuestion/${saveQuestionType}`, url: `/SaveTaskQuestion/${saveQuestionType}`,
@ -3628,24 +3603,13 @@ export function getSplenicState(visitTaskId, spleenLength) {
method: 'post' method: 'post'
}) })
} }
export function getSplenicStateNoPet(visitTaskId, spleenLength) {
return request({
url: `/LuganoWithoutPETCalculate/getSplenicState?visitTaskId=${visitTaskId}&spleenLength=${spleenLength}`,
method: 'post'
})
}
export function getSplenicVerify(visitTaskId) { export function getSplenicVerify(visitTaskId) {
return request({ return request({
url: `/LuganoCalculate/getSplenicVerify?visitTaskId=${visitTaskId}`, url: `/LuganoCalculate/getSplenicVerify?visitTaskId=${visitTaskId}`,
method: 'post' method: 'post'
}) })
} }
export function getSplenicVerifyNoPet(visitTaskId) {
return request({
url: `/LuganoWithoutPETCalculate/getSplenicVerify?visitTaskId=${visitTaskId}`,
method: 'post'
})
}
export function uploadTrialSiteSurveyUser(trialId, baseUrl, routeUrl, param) { export function uploadTrialSiteSurveyUser(trialId, baseUrl, routeUrl, param) {
return request({ return request({
url: `/TrialSiteSurvey/UploadTrialSiteSurveyUser?trialId=${trialId}&baseUrl=${baseUrl}&routeUrl=${routeUrl}`, url: `/TrialSiteSurvey/UploadTrialSiteSurveyUser?trialId=${trialId}&baseUrl=${baseUrl}&routeUrl=${routeUrl}`,
@ -4317,93 +4281,4 @@ export function deleteAuditRecord(auditRecordId) {
url: `/AuditDocument/deleteAuditRecord/${auditRecordId}`, url: `/AuditDocument/deleteAuditRecord/${auditRecordId}`,
method: 'delete' method: 'delete'
}) })
}
// 核对中心人员发送邮件
export function sendCheckSiteSurveyUserEmail(data) {
return request({
url: `/TrialSiteSurvey/sendCheckSiteSurveyUserEmail`,
method: 'post',
data
})
}
// 更新中心人员发送邮件
export function sendUpdateSiteSurveyUserEmail(data) {
return request({
url: `/TrialSiteSurvey/sendUpdateSiteSurveyUserEmail`,
method: 'post',
data
})
}
// 更新中心人员发送邮件
export function getTrialSiteLatestSurvey(params) {
return request({
url: `/TrialSiteSurvey/getTrialSiteLatestSurvey`,
method: 'get',
params
})
}
// 阅片期计划列表
export function getReadModulePageList(data) {
return request({
url: `/ReadModule/getReadModulePageList`,
method: 'post',
data
})
}
// 移除阅片期
export function setBatchRemoveReadingPlan(data) {
return request({
url: `/ReadingPeriodSet/setBatchRemoveReadingPlan`,
method: 'post',
data
})
}
// 更新项目额外json配置
export function updateTrialExtralConfig(params, data) {
return request({
url: `/TrialConfig/updateTrialExtralConfig`,
method: 'put',
params,
data
})
}
// 获取项目标准阅片关键点列表
export function getTrialCriterionKeyFileList(data) {
return request({
url: `/TrialCriterionKeyFile/getTrialCriterionKeyFileList`,
method: 'post',
data
})
}
// 设置已阅读关键文件
export function setReadKeyFile(data) {
return request({
url: `/ReadingImageTask/setReadKeyFile`,
method: 'post',
data
})
}
// 项目报表-访视完成度
export function getTrialVisitFinishedStatList(data) {
return request({
url: `/TrialStat/getTrialVisitFinishedStatList`,
method: 'post',
data
})
}
// 项目报表-质疑统计表
export function getTrialQuestionStatList(data) {
return request({
url: `/TrialStat/getTrialQuestionStatList`,
method: 'post',
data
})
}
// 项目报表-疗效统计表
export function getTrialEfficacyEvaluationStatList(data) {
return request({
url: `/TrialStat/getTrialEfficacyEvaluationStatList`,
method: 'post',
data
})
} }

View File

@ -1,37 +0,0 @@
import Vue from "vue";
import AGRCOMP from "./index.vue";
const MFAConstructor = Vue.extend(AGRCOMP);
let MFAINSTANCELIST = [];
const AGR = options => {
const { Id, IsEn_Us, callBack, cancelBack } = options;
if (!Id) throw `Id is requred.but ${Id}`
const id = `AGR${new Date().getTime()}`;
const instance = new MFAConstructor();
MFAINSTANCELIST.push(instance)
instance.id = id;
instance.vm = instance.$mount();
if (instance.vm.visible) return;
document.body.appendChild(instance.vm.$el);
instance.vm.open({ Id, IsEn_Us });
instance.vm.$on("success", (Id) => {
if (callBack) callBack(Id)
});
instance.vm.$on("closed", () => {
if (cancelBack) cancelBack();
document.body.removeChild(instance.vm.$el);
instance.vm.$destroy();
let index = MFAINSTANCELIST.findIndex(item => item.id === id);
MFAINSTANCELIST.splice(index, 1)
});
return instance.vm;
}
AGR.close = () => {
if (MFAINSTANCELIST.length <= 0) return;
MFAINSTANCELIST.forEach(item => {
document.body.removeChild(item.vm.$el);
item.vm.$destroy();
})
MFAINSTANCELIST = [];
}
export default AGR;

View File

@ -1,7 +0,0 @@
import AGRCOMP from "./index.vue";
import AGR from "./fun";
export default Vue => {
Vue.component(AGRCOMP.name, AGRCOMP);
Vue.prototype.$AGR = AGR;
};

View File

@ -1,65 +0,0 @@
<template>
<!--AGR-->
<el-dialog v-if="visible" :visible.sync="visible" width="60%" :close-on-click-modal="false" append-to-body center
:show-close="true" @close="cancel">
<!-- <div slot="title">
{{ agreement.FileName }}
</div> -->
<div v-html="agreement.FileEnContent" class="content" v-if="IsEn_Us"></div>
<div v-html="agreement.FileContent" class="content" v-else></div>
</el-dialog>
</template>
<script>
import {
getUserAgreementById
} from '@/api/dictionary'
export default {
name: "AGR",
data() {
return {
visible: false,
agreement: {},
IsEn_Us: false
}
},
mounted() {
},
methods: {
async getAgreement(Id) {
try {
let data = {
Id
}
let res = await getUserAgreementById(data)
if (res.IsSuccess) {
this.agreement = res.Result
}
} catch (err) {
console.log(err)
}
},
open(data) {
let { Id, IsEn_Us } = data;
this.IsEn_Us = IsEn_Us
this.getAgreement(Id)
this.visible = true
},
cancel() {
this.visible = false;
this.$emit("closed");
},
},
};
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__body {
height: 500px;
}
.content {
height: 100%;
overflow-y: auto;
}
</style>

View File

@ -1,11 +1,25 @@
<template> <template>
<!--MFA--> <!--MFA-->
<el-dialog v-if="visible" :visible.sync="visible" width="540px" :close-on-click-modal="false" append-to-body center <el-dialog
:show-close="status === 'login'" @close="cancel"> v-if="visible"
:visible.sync="visible"
width="540px"
:close-on-click-modal="false"
append-to-body
center
:show-close="status === 'login'"
@close="cancel"
>
<div slot="title"> <div slot="title">
{{ status === "login" ? $t("mfa:title") : $t("mfa:lock:title") }} {{ status === "login" ? $t("mfa:title") : $t("mfa:lock:title") }}
</div> </div>
<el-form ref="mfaForm" label-position="right" :model="form" :rules="rules" label-width="100px"> <el-form
ref="mfaForm"
label-position="right"
:model="form"
:rules="rules"
label-width="100px"
>
<!-- 邮箱 --> <!-- 邮箱 -->
<p class="tip_mfa"> <p class="tip_mfa">
<i class="el-icon-warning" style="color: #409eff"></i> <i class="el-icon-warning" style="color: #409eff"></i>
@ -17,13 +31,18 @@
</el-form-item> </el-form-item>
<!-- 验证码 --> <!-- 验证码 -->
<el-form-item :label="$t('mfa:form:MFACode')" prop="Code"> <el-form-item :label="$t('mfa:form:MFACode')" prop="Code">
<div style="display: flex;justify-content: space-between;width: 90%;"> <el-input
<el-input :placeholder="$t('mfa:form:input:placeholder:Codes')" v-model="form.Code" /> :placeholder="$t('mfa:form:input:placeholder:Codes')"
<el-button size="small" @click.stop="sendMFACode" :disabled="flag || sendFlag" style="margin-left: 10px;" v-model="form.Code"
class="codeBtn">{{ style="width: 240px; margin-right: 10px"
flag ? />
`${$t("mfa:form:sendMFACodeCountDown")} (${second}s)` : $t("mfa:form:sendMFACode") }}</el-button> <el-button
</div> type="primary"
size="small"
@click.stop="sendMFACode"
:disabled="flag || sendFlag"
>{{ flag ? `${second}s` : $t("mfa:form:sendMFACode") }}</el-button
>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer"> <div slot="footer">
@ -32,16 +51,19 @@
{{ $t("mfa:button:cancel") }} {{ $t("mfa:button:cancel") }}
</el-button> --> </el-button> -->
<!-- 保存 --> <!-- 保存 -->
<el-button type="primary" size="small" @click="save" :loading="loading" style="width: 80%"> <el-button
type="primary"
size="small"
@click="save"
:loading="loading"
style="width: 80%"
>
{{ {{
status === "login" status === "login"
? $t("mfa:button:save") ? $t("mfa:button:save")
: $t("mfa:lock:button:save") : $t("mfa:lock:button:save")
}} }}
</el-button> </el-button>
<p style="text-align: left;font-size: 14px;margin:10px auto;width: 80%;">
<el-checkbox v-model="form.isRemember" /><span style="margin-left: 10px;">{{ $t("mfa:tip:noLogin") }}</span>
</p>
</div> </div>
</el-dialog> </el-dialog>
</template> </template>
@ -64,7 +86,6 @@ export default {
IdentityUserId: null, IdentityUserId: null,
EMail: null, EMail: null,
username: null, username: null,
isRemember: true
}, },
rules: { rules: {
Code: [ Code: [
@ -91,18 +112,6 @@ export default {
}, },
}; };
}, },
mounted() {
this.flag = true;
this.second = 60;
this.timer = setInterval(() => {
this.second--;
if (this.second <= 0) {
this.flag = false;
clearInterval(this.timer);
this.timer = null;
}
}, 1000);
},
methods: { methods: {
open(data) { open(data) {
let { UserId, status, username, EMail } = data; let { UserId, status, username, EMail } = data;
@ -180,21 +189,6 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.codeBtn {
color: #409EFF;
border-color: #409EFF;
}
.codeBtn.is-disabled,
.codeBtn.is-disabled:focus,
.codeBtn.is-disabled:hover {
color: #c0c4cc;
cursor: not-allowed;
background-image: none;
background-color: #fff;
border-color: #ebeef5;
}
.tip_mfa { .tip_mfa {
width: 86%; width: 86%;
margin: auto; margin: auto;
@ -204,12 +198,10 @@ export default {
line-height: 30px; line-height: 30px;
border-radius: 5px; border-radius: 5px;
background-color: #eee; background-color: #eee;
i { i {
margin-right: 5px; margin-right: 5px;
} }
} }
::v-deep .el-dialog__header { ::v-deep .el-dialog__header {
font-weight: bold; font-weight: bold;
} }

View File

@ -4,7 +4,7 @@ import Preview from "./index.vue";
const PreviewConstructor = Vue.extend(Preview); const PreviewConstructor = Vue.extend(Preview);
const preview = options => { const preview = options => {
const { path, type, title, isLocal = false } = options; const { path, type, title } = options;
if (!path) throw `path is requred.but ${path}` if (!path) throw `path is requred.but ${path}`
const id = `Preview_${new Date().getTime()}`; const id = `Preview_${new Date().getTime()}`;
const instance = new PreviewConstructor(); const instance = new PreviewConstructor();
@ -12,7 +12,7 @@ const preview = options => {
instance.vm = instance.$mount(); instance.vm = instance.$mount();
if (instance.vm.visible) return; if (instance.vm.visible) return;
document.body.appendChild(instance.vm.$el); document.body.appendChild(instance.vm.$el);
instance.vm.open(path, type, title, isLocal); instance.vm.open(path, type, title);
instance.vm.$on("closed", () => { instance.vm.$on("closed", () => {
document.body.removeChild(instance.vm.$el); document.body.removeChild(instance.vm.$el);
instance.vm.$destroy(); instance.vm.$destroy();

View File

@ -1,8 +1,15 @@
<template> <template>
<el-dialog v-if="visible" :visible.sync="visible" :title="title" :fullscreen="true" append-to-body <el-dialog
custom-class="base-dialog-wrapper" @close="handleClose"> v-if="visible"
:visible.sync="visible"
:title="title"
:fullscreen="true"
append-to-body
custom-class="base-dialog-wrapper"
@close="handleClose"
>
<div class="base-modal-body" style="border: 2px solid #ccc; padding: 10px"> <div class="base-modal-body" style="border: 2px solid #ccc; padding: 10px">
<PreviewFile v-if="visible" :file-path="path" :file-type="type" :is-local="isLocal" /> <PreviewFile v-if="visible" :file-path="path" :file-type="type" />
</div> </div>
</el-dialog> </el-dialog>
</template> </template>
@ -17,15 +24,13 @@ export default {
path: null, path: null,
type: null, type: null,
title: null, title: null,
isLocal: false
}; };
}, },
methods: { methods: {
open(path, type, title, isLocal) { open(path, type, title) {
this.path = path; this.path = path;
this.type = type; this.type = type;
this.title = title; this.title = title;
this.isLocal = isLocal;
this.visible = true; this.visible = true;
}, },
handleClose() { handleClose() {

View File

@ -5,17 +5,16 @@
<!-- <embed v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" style="width: 100%; height: 100%"> --> <!-- <embed v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" style="width: 100%; height: 100%"> -->
<!-- <iframe v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" width="100%" height="100%" frameborder="0" /> --> <!-- <iframe v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" width="100%" height="100%" frameborder="0" /> -->
<iframe v-else-if="fileType.indexOf('pdf') !== -1" <iframe v-else-if="fileType.indexOf('pdf') !== -1"
:src="`/static/pdfjs/web/viewer.html?file=${isLocal ? window.location.origin : OSSclientConfig.basePath}${filePath}?userName=${currentUser}&COMPANY=${COMPANY}`" :src="`/static/pdfjs/web/viewer.html?file=${OSSclientConfig.basePath}${filePath}?userName=${currentUser}&COMPANY=${COMPANY}`"
width="100%" height="100%" frameborder="0" crossorigin="anonymous" /> width="100%" height="100%" frameborder="0" crossorigin="anonymous" />
<!-- <pdf--> <!-- <pdf-->
<!-- v-else-if="fileType.indexOf('pdf') !== -1"--> <!-- v-else-if="fileType.indexOf('pdf') !== -1"-->
<!-- :src="`/static/pdfjs/web/viewer.html?file=${filePath}`">--> <!-- :src="`/static/pdfjs/web/viewer.html?file=${filePath}`">-->
<!-- </pdf>--> <!-- </pdf>-->
<video :src="`${isLocal ? window.location.origin : OSSclientConfig.basePath}${filePath}`" <video :src="`${OSSclientConfig.basePath}${filePath}`" style="width: 100%;height: 99%;" autoplay controls
style="width: 100%;height: 99%;" autoplay controls controlsList="nodownload" controlsList="nodownload" v-else-if="fileType.indexOf('mp4') !== -1"></video>
v-else-if="fileType.indexOf('mp4') !== -1"></video>
<iframe v-else <iframe v-else
:src="`/static/onlyOffice/viewer.html?url=${isLocal ? window.location.origin : OSSclientConfig.basePath}${filePath}?onlyOffice_url=${onlyOffice_url}&type=${fileType}&title=${title}&documentType=${documentType}&userName=${currentUser}`" :src="`/static/onlyOffice/viewer.html?url=${OSSclientConfig.basePath}${filePath}?onlyOffice_url=${onlyOffice_url}&type=${fileType}&title=${title}&documentType=${documentType}&userName=${currentUser}`"
width="100%" height="100%" frameborder="0" crossorigin="anonymous" /> width="100%" height="100%" frameborder="0" crossorigin="anonymous" />
<!-- <div v-else> <!-- <div v-else>
{{ $t('common:message:downloadFile') }} {{ $t('common:message:downloadFile') }}
@ -44,17 +43,12 @@ export default {
type: String, type: String,
default: '' default: ''
}, },
isLocal: {
type: Boolean,
default: false
}
}, },
data() { data() {
return { return {
currentUser: zzSessionStorage.getItem('userName'), currentUser: zzSessionStorage.getItem('userName'),
COMPANY: process.env.VUE_APP_COMPANY_NAME, COMPANY: process.env.VUE_APP_COMPANY_NAME,
onlyOffice_url: process.env.VUE_APP_ONLYOFFICE_URL, onlyOffice_url: process.env.VUE_APP_ONLYOFFICE_URL
window,
} }
}, },
computed: { computed: {

View File

@ -22,7 +22,7 @@ export default {
}, },
methods: { methods: {
click() { click() {
if (!screenfull.isEnabled) { if (!screenfull.enabled) {
this.$message({ this.$message({
message: 'you browser can not work', message: 'you browser can not work',
type: 'warning' type: 'warning'
@ -35,12 +35,12 @@ export default {
this.isFullscreen = screenfull.isFullscreen this.isFullscreen = screenfull.isFullscreen
}, },
init() { init() {
if (screenfull.isEnabled) { if (screenfull.enabled) {
screenfull.on('change', this.change) screenfull.on('change', this.change)
} }
}, },
destroy() { destroy() {
if (screenfull.isEnabled) { if (screenfull.enabled) {
screenfull.off('change', this.change) screenfull.off('change', this.change)
} }
} }

View File

@ -1,240 +0,0 @@
<template>
<div :id="key" class="readingChart" v-show="visible" :style="{
'z-index': zIndex
}">
<div ref="chartContainer" style="width: 490px; height: 290px;" v-loading="loading"></div>
</div>
</template>
<script>
import { getReportsChartData } from "@/api/reading"
import moment from "moment"
let echarts = require('echarts/lib/echarts');
//
// require('echarts/lib/chart/bar');
require('echarts/lib/chart/line');
// require('echarts/lib/chart/pie');
// require('echarts/lib/chart/scatter');
//
require('echarts/lib/component/tooltip');
require('echarts/lib/component/title');
require('echarts/lib/component/legend');
require('echarts/lib/component/grid');
require('echarts/lib/component/dataZoom');
export default {
name: "readingChart",
props: {
},
data() {
return {
visible: false,
zIndex: 9,
chart: null,
loading: false,
key: 'readingChart'
};
},
methods: {
init(event, obj, zIndex = 9) {
this.loading = true
this.zIndex = zIndex
let { key } = obj
if (key) {
this.key = key
}
this.$nextTick(() => {
this.visible = true
let readingChart = document.querySelector(`#${this.key}`);
let chaY = document.body.clientHeight - event.clientY;
let chaX = document.body.clientWidth - event.clientX;
if (chaY < 250) {
readingChart.style.top = event.clientY - 220 + "px";
} else {
readingChart.style.top = event.clientY + "px";
}
if (chaX < 500) {
readingChart.style.left = event.clientX - 520 + "px";
} else {
readingChart.style.left = event.clientX + 15 + "px";
}
this.getInfo(obj)
})
},
async getInfo(data) {
try {
let { VisitTaskId = null, TrialId = null, QuestionId = null, QuestionName = null, TableQuestionId = null, RowIndex = null, ReportChartTypeEnum = null } = data
let params = {
VisitTaskId, TrialId, QuestionId, TableQuestionId, RowIndex, ReportChartTypeEnum
}
this.loading = true
let res = await getReportsChartData(params)
this.loading = false
if (res.IsSuccess) {
let LatestScanDateList = res.Result.LatestScanDateList.map(item => item.split(" ")[0])
let obj = {
title: QuestionName,
xAxisData: LatestScanDateList || [],
series: [],
unit: this.$fd("ValueUnit", res.Result.Unit),
visitName: res.Result.VisitTaskNameList,
min: null,
max: null
}
res.Result.ChartDataList.forEach((item) => {
let arr = []
item.Value.forEach((d, index) => {
// arr.push([LatestScanDateList[index], d])
arr.push(d)
})
obj.series.push({
name: item.Name,
data: arr,
type: 'line'
})
});
// if (Array.isArray(res.Result.LatestScanDateList) && res.Result.LatestScanDateList.length >= 2) {
// let hours = moment(res.Result.LatestScanDateList[res.Result.LatestScanDateList.length - 1]).diff(moment(res.Result.LatestScanDateList[0]), 'hours');
// let days = moment(res.Result.LatestScanDateList[res.Result.LatestScanDateList.length - 1]).diff(moment(res.Result.LatestScanDateList[0]), 'days');
// let months = moment(res.Result.LatestScanDateList[res.Result.LatestScanDateList.length - 1]).diff(moment(res.Result.LatestScanDateList[0]), 'months');
// console.log(hours, 'hours')
// console.log(days, 'days')
// console.log(months, 'months')
// if (hours < 24) {
// obj.min = moment(res.Result.LatestScanDateList[0]).format('YYYY-MM-DD') + ' 00:00:00'
// obj.max = moment(res.Result.LatestScanDateList[0]).format('YYYY-MM-DD') + ' 23:59:59'
// }
// if (days >= 1 && days <= 7) {
// obj.min = moment(res.Result.LatestScanDateList[0]).format('YYYY-MM-DD') + ' 00:00:00'
// obj.max = moment(res.Result.LatestScanDateList[0]).add(7, 'days').format('YYYY-MM-DD') + ' 23:59:59'
// }
// if (days > 7 && days < 30) {
// obj.min = moment(res.Result.LatestScanDateList[0]).startOf('month').format('YYYY-MM-DD') + ' 00:00:00'
// obj.max = moment(res.Result.LatestScanDateList[0]).endOf('month').format('YYYY-MM-DD') + ' 23:59:59'
// }
// if (months >= 1 && months <= 3) {
// obj.min = moment(res.Result.LatestScanDateList[0]).startOf('month').format('YYYY-MM-DD') + ' 00:00:00'
// obj.max = moment(res.Result.LatestScanDateList[0]).add(4, 'months').startOf('month').format('YYYY-MM-DD') + ' 23:59:59'
// }
// if (months > 3 && months <= 6) {
// obj.min = moment(res.Result.LatestScanDateList[0]).startOf('month').format('YYYY-MM-DD') + ' 00:00:00'
// obj.max = moment(res.Result.LatestScanDateList[0]).add(7, 'months').startOf('month').format('YYYY-MM-DD') + ' 23:59:59'
// }
// if (months > 6 && months <= 12) {
// obj.min = moment(res.Result.LatestScanDateList[0]).startOf('month').format('YYYY-MM-DD') + ' 00:00:00'
// obj.max = moment(res.Result.LatestScanDateList[0]).add(13, 'months').startOf('month').format('YYYY-MM-DD') + ' 23:59:59'
// }
// if (months > 12) {
// obj.min = moment(res.Result.LatestScanDateList[0]).startOf('month').format('YYYY-MM-DD') + ' 00:00:00'
// obj.max = moment(res.Result.LatestScanDateList[res.Result.LatestScanDateList.length - 1]).add(1, 'months').startOf('month').format('YYYY-MM-DD') + ' 23:59:59'
// }
// }
// console.log(obj)
this.initChart(obj)
}
} catch (err) {
this.loading = false
console.log(err)
}
},
foo() {
this.visible = false
this.$emit("foo");
this.dispose()
},
initChart(obj) {
this.chart = echarts.init(this.$refs.chartContainer);
// ...
const option = {
title: {
text: obj.title,
textStyle: {
color: "#fff"
}
},
tooltip: {
trigger: 'axis',
// formatter: function (params) {
// let index = obj.xAxisData.findIndex(item => item === params[0].value[0])
// let result = obj.visitName[index] + ' ' + params[0].value[0] + '<br>'; //
// params.forEach(function (item) {
// result += item.marker + ' ' + item.seriesName + ': ' + item.value[1] + '<br>'; //
// });
// return result;
// }
},
xAxis: {
// type: 'time',
// data: obj.xAxisData,
data: obj.visitName,
axisLine: { // x 线
lineStyle: {
color: '#fff',
}
},
axisLabel: { // x
textStyle: {
color: '#fff'
}
},
// splitLine: {
// show: false // 线
// },
// min: obj.min,
// max: obj.max
},
yAxis: {
name: obj.unit,
type: 'value',
axisLabel: {
textStyle: {
color: '#fff',
}
},
axisLine: {
lineStyle: {
color: '#fff',
}
},
},
series: obj.series
};
// 4. 使
this.chart.setOption(option);
},
resize() {
if (this.chart) {
this.chart.resize()
}
},
dispose() {
if (this.chart) {
this.chart.dispose()
this.chart = null
}
}
},
};
</script>
<style lang="scss" scoped>
.readingChart {
min-width: 500px;
max-width: 500px;
font-size: 14px;
display: inline-block;
background: #000;
border: 1px solid #ebeef5;
border-radius: 4px;
position: fixed;
padding: 10px 6px;
list-style-type: none;
min-height: 300px;
max-height: 80vh;
// overflow: hidden;
// overflow-y: auto;
box-sizing: border-box;
}
</style>

View File

@ -730,13 +730,6 @@ export default {
fileList: [], fileList: [],
dicomInfo: { dicomInfo: {
studyId: data.string('x00200010'), studyId: data.string('x00200010'),
Manufacturer: data.string('x00080070') || '',
ManufacturerModelName: data.string('x000801090') || '',
DeviceSerialNumber: data.string('x00181000') || '',
DeviceUID: data.string('x00181002') || '',
SoftwareVersions: data.string('x00181020') || '',
PatientWeight: data.string('x00101030') || '',
DicomStudyDate: data.string('x00080020'), DicomStudyDate: data.string('x00080020'),
DicomStudyTime: data.string('x00080030'), DicomStudyTime: data.string('x00080030'),
studyUid: studyUid, studyUid: studyUid,
@ -849,9 +842,6 @@ export default {
) )
seriesItem = { seriesItem = {
seriesUid: seriesUid, seriesUid: seriesUid,
RadiopharmaceuticalInformationSequence: data.string('x00540016') || "",
AcquisitionDate: data.string('x00080022') || "",
DicomSeriesDate: data.string('x00080021'), DicomSeriesDate: data.string('x00080021'),
DicomSeriesTime: data.string('x00080031'), DicomSeriesTime: data.string('x00080031'),
seriesNumber: data.intString('x00200011') || 1, seriesNumber: data.intString('x00200011') || 1,
@ -892,20 +882,6 @@ export default {
instanceTime = time ? `${date} ${time}` : `${date} 00:00:00` instanceTime = time ? `${date} ${time}` : `${date} 00:00:00`
} }
instanceItem = { instanceItem = {
PhotometricInterpretation: data.string('x00280004') || '',
BitsAllocated: data.uint16('x00280100') || '',
PixelRepresentation: data.uint16('x00280103') || '',
RescaleIntercept: data.string('x00281052') || '',
RescaleSlope: data.string('x00281053') || '',
ImagePositionPatient: data.string('x00200032') || '',
ImageOrientationPatient: data.string('x00200037') || '',
SequenceOfUltrasoundRegions: data.string('x00186011') || '',
FrameTime: data.string('x00181063') || '',
CorrectedImage: data.string('x00280051') || '',
Units: data.string('x00541001') || '',
DecayCorrection: data.string('x00541102') || '',
EncapsulatedDocument: data.string('x00420011') || '',
instanceUid: instanceUid, instanceUid: instanceUid,
SOPClassUID: data.string('x00080016'), SOPClassUID: data.string('x00080016'),
TransferSytaxUID: data.string('x00020010'), TransferSytaxUID: data.string('x00020010'),
@ -1122,13 +1098,6 @@ export default {
DicomStudyDate: dicomInfo.DicomStudyDate, DicomStudyDate: dicomInfo.DicomStudyDate,
DicomStudyTime: dicomInfo.DicomStudyTime, DicomStudyTime: dicomInfo.DicomStudyTime,
seriesList: [], seriesList: [],
Manufacturer: dicomInfo.Manufacturer,
ManufacturerModelName: dicomInfo.ManufacturerModelName,
DeviceSerialNumber: dicomInfo.DeviceSerialNumber,
DeviceUID: dicomInfo.DeviceUID,
SoftwareVersions: dicomInfo.SoftwareVersions,
PatientWeight: dicomInfo.PatientWeight,
}, },
} }
let arr = [] let arr = []
@ -1171,20 +1140,6 @@ export default {
windowWidth: o.windowWidth, windowWidth: o.windowWidth,
path: o.myPath, path: o.myPath,
FileSize: o.FileSize, FileSize: o.FileSize,
PhotometricInterpretation: o.PhotometricInterpretation,
BitsAllocated: o.BitsAllocated,
PixelRepresentation: o.PixelRepresentation,
RescaleIntercept: o.RescaleIntercept,
RescaleSlope: o.RescaleSlope,
ImagePositionPatient: o.ImagePositionPatient,
ImageOrientationPatient: o.ImageOrientationPatient,
SequenceOfUltrasoundRegions: o.SequenceOfUltrasoundRegions,
FrameTime: o.FrameTime,
CorrectedImage: o.CorrectedImage,
Units: o.Units,
DecayCorrection: o.DecayCorrection,
EncapsulatedDocument: o.EncapsulatedDocument,
}) })
Record.Uploaded.push(name) Record.Uploaded.push(name)
dicomInfo.failedFileCount++ dicomInfo.failedFileCount++
@ -1269,20 +1224,6 @@ export default {
windowWidth: o.windowWidth, windowWidth: o.windowWidth,
path: scope.$getObjectName(res.url), path: scope.$getObjectName(res.url),
FileSize: o.FileSize, FileSize: o.FileSize,
PhotometricInterpretation: o.PhotometricInterpretation,
BitsAllocated: o.BitsAllocated,
PixelRepresentation: o.PixelRepresentation,
RescaleIntercept: o.RescaleIntercept,
RescaleSlope: o.RescaleSlope,
ImagePositionPatient: o.ImagePositionPatient,
ImageOrientationPatient: o.ImageOrientationPatient,
SequenceOfUltrasoundRegions: o.SequenceOfUltrasoundRegions,
FrameTime: o.FrameTime,
CorrectedImage: o.CorrectedImage,
Units: o.Units,
DecayCorrection: o.DecayCorrection,
EncapsulatedDocument: o.EncapsulatedDocument,
}) })
o.myPath = scope.$getObjectName(res.url) o.myPath = scope.$getObjectName(res.url)
Record.Uploaded.push(name) Record.Uploaded.push(name)
@ -1331,9 +1272,6 @@ export default {
bodyPartExamined: dicomInfo.bodyPart, bodyPartExamined: dicomInfo.bodyPart,
instanceList: instanceList, instanceList: instanceList,
ImageResizePath: ImageResizePath, ImageResizePath: ImageResizePath,
RadiopharmaceuticalInformationSequence: v.RadiopharmaceuticalInformationSequence,
AcquisitionDate: v.AcquisitionDate,
}) })
} }
let text = JSON.stringify(Record) let text = JSON.stringify(Record)

View File

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1762494352859" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="22987" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M896 832a128 128 0 0 1-128 128H256a128 128 0 0 1-128-128V192a128 128 0 0 1 128-128h512a128 128 0 0 1 128 128v640zM192 768v64a64 64 0 0 0 56.512 63.552L256 896h512a64 64 0 0 0 63.552-56.512L832 832v-64H192z m448-640H512v206.912l64-38.4 64 38.464V128z m-448 576h640V192a64 64 0 0 0-56.512-63.552L768 128h-64v263.488a32 32 0 0 1-48.448 27.456L576 371.2l-79.552 47.744A32 32 0 0 1 448 391.424V128H256a64 64 0 0 0-63.552 56.512L192 192v512z" fill="#e6e6e6" p-id="22988"></path></svg>

Before

Width:  |  Height:  |  Size: 812 B

View File

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1766048712120" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6026" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M924.520311 484.074997c7.439436 0 13.884218 2.726088 19.336394 8.16496 5.437849 5.452175 8.16496 11.897981 8.16496 19.336394 0 7.452739-2.726088 13.898545-8.16496 19.336394-5.452175 5.452175-11.897981 8.16496-19.336394 8.16496l-83.363639 0c-3.437286 40.110533-13.617136 77.777411-30.508851 113.012913-16.906042 35.236526-38.673811 66.175165-65.315588 92.816942s-57.58144 48.422849-92.816942 65.315588c-35.236526 16.906042-72.915683 26.790156-113.012913 29.650297l0 84.223217c0 7.439436-2.726088 13.884218-8.16496 19.336394-5.451152 5.437849-11.896958 8.16496-19.336394 8.16496-7.452739 0-13.898545-2.726088-19.336394-8.16496-5.452175-5.452175-8.16496-11.897981-8.16496-19.336394l0-84.223217c-40.110533-2.860141-77.777411-12.743232-113.012913-29.650297-35.236526-16.892739-66.175165-38.673811-92.816942-65.315588s-48.422849-57.58144-65.315588-92.816942c-16.906042-35.236526-27.071565-72.90238-30.508851-113.012913L99.479689 539.077705c-7.452739 0-13.898545-2.711761-19.336394-8.16496-5.452175-5.437849-8.16496-11.883655-8.16496-19.336394 0-7.439436 2.712785-13.884218 8.16496-19.336394 5.437849-5.437849 11.883655-8.16496 19.336394-8.16496l83.363639 0c3.437286-40.09723 13.602809-77.777411 30.508851-113.012913 16.892739-35.236526 38.673811-66.175165 65.315588-92.816942s57.58144-48.409546 92.816942-65.315588c35.236526-16.892739 72.90238-26.77583 113.012913-29.650297L484.497623 99.05604c0-7.439436 2.712785-13.885242 8.16496-19.336394 5.437849-5.437849 11.883655-8.16496 19.336394-8.16496 7.440459 0 13.885242 2.726088 19.336394 8.16496 5.437849 5.452175 8.16496 11.896958 8.16496 19.336394l0 84.223217c40.098253 2.874467 77.777411 12.757558 113.012913 29.650297 35.236526 16.906042 66.175165 38.673811 92.816942 65.315588s48.409546 57.58144 65.315588 92.816942c16.892739 35.236526 27.071565 72.916706 30.508851 113.012913L924.520311 484.074997zM484.498646 238.281965c-32.657794 2.874467-63.167668 11.320836-91.527576 25.352411-28.360931 14.046924-53.431933 31.946596-75.198679 53.713342-21.781072 21.781072-39.680744 46.837748-53.713342 75.198679-14.045901 28.360931-22.49227 58.869782-25.352411 91.527576L484.498646 484.073974 484.498646 238.281965zM238.70459 539.077705c2.860141 32.657794 11.30651 63.166645 25.352411 91.527576 14.032598 28.360931 31.933293 53.431933 53.713342 75.198679 21.766746 21.781072 46.837748 39.680744 75.198679 53.713342 28.360931 14.046924 58.869782 22.49227 91.527576 25.352411L484.496599 539.077705 238.70459 539.077705zM539.501354 484.074997l245.793032 0c-2.874467-32.657794-11.320836-63.167668-25.352411-91.527576-14.046924-28.360931-31.946596-53.417607-53.713342-75.198679-21.780049-21.766746-46.837748-39.667441-75.198679-53.713342-28.360931-14.032598-58.869782-22.478967-91.527576-25.352411L539.502377 484.074997zM539.501354 784.870738c32.657794-2.860141 63.167668-11.30651 91.527576-25.352411 28.360931-14.032598 53.41863-31.93227 75.198679-53.713342 21.766746-21.766746 39.667441-46.837748 53.713342-75.198679 14.032598-28.360931 22.478967-58.869782 25.352411-91.527576L539.501354 539.078729 539.501354 784.870738z" p-id="6027" fill="#ffffff"></path></svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 418 B

View File

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1762485648235" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10985" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M543.378286 515.949714V104.521143a31.451429 31.451429 0 0 0-62.976 0v411.501714a125.44 125.44 0 0 0 0.292571 242.834286 31.670857 31.670857 0 0 0-0.292571 3.949714v156.745143a31.451429 31.451429 0 0 0 62.902857 0v-156.745143a31.597714 31.597714 0 0 0-0.219429-3.876571 125.513143 125.513143 0 0 0 0.292572-242.980572z m12.946285 165.814857a62.683429 62.683429 0 1 1-88.649142-88.722285 62.683429 62.683429 0 0 1 88.649142 88.722285zM229.522286 202.459429a31.597714 31.597714 0 0 0 0.292571-3.949715V104.594286a31.305143 31.305143 0 1 0-62.610286 0v93.988571c0 1.389714 0 2.706286 0.146286 4.022857a125.44 125.44 0 0 0 0 242.907429 31.670857 31.670857 0 0 0-0.146286 3.876571v470.235429a31.305143 31.305143 0 1 0 62.610286 0V449.316571a31.597714 31.597714 0 0 0-0.292571-3.803428 125.44 125.44 0 0 0 0-243.053714z m13.312 165.888a62.683429 62.683429 0 1 1-88.649143-88.722286 62.683429 62.683429 0 0 1 88.649143 88.722286zM950.857143 324.022857c0-58.587429-40.228571-107.739429-94.500572-121.563428a31.670857 31.670857 0 0 0 0.146286-3.949715V104.594286a31.305143 31.305143 0 0 0-62.610286 0v93.988571c0 1.389714 0.146286 2.706286 0.292572 4.022857a125.44 125.44 0 0 0 0 242.907429 31.670857 31.670857 0 0 0-0.292572 3.949714v470.162286a31.305143 31.305143 0 1 0 62.610286 0V449.389714c0-1.316571 0-2.56-0.146286-3.876571A125.513143 125.513143 0 0 0 950.857143 324.022857z m-81.042286 44.324572a62.683429 62.683429 0 1 1-88.649143-88.722286 62.683429 62.683429 0 0 1 88.649143 88.722286z" p-id="10986" fill="#e6e6e6"></path></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1764830990216" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5566" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M192 170.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v640a21.333333 21.333333 0 0 0 21.333333 21.333333h640a21.333333 21.333333 0 0 0 21.333333-21.333333v-640a21.333333 21.333333 0 0 0-21.333333-21.333333h-640zM85.333333 192A106.666667 106.666667 0 0 1 192 85.333333h640A106.666667 106.666667 0 0 1 938.666667 192v640a106.666667 106.666667 0 0 1-106.666667 106.666667h-640A106.666667 106.666667 0 0 1 85.333333 832v-640z" fill="#ffffff" p-id="5567"></path><path d="M173.653333 170.666667c-1.621333 5.034667-2.986667 12.373333-2.986666 21.333333v640c0 8.96 1.365333 16.298667 2.986666 21.333333h292.693334c1.621333-5.034667 2.986667-12.373333 2.986666-21.333333v-640c0-8.96-1.365333-16.298667-2.986666-21.333333H173.653333zM99.157333 127.658667C107.306667 111.530667 126.293333 85.333333 160 85.333333h320c33.706667 0 52.736 26.197333 60.8 42.325334 9.301333 18.688 13.866667 41.472 13.866667 64.341333v640c0 22.869333-4.565333 45.653333-13.866667 64.341333-8.106667 16.128-27.093333 42.325333-60.8 42.325334h-320c-33.706667 0-52.736-26.197333-60.8-42.325334C89.856 877.653333 85.333333 854.869333 85.333333 832v-640c0-22.869333 4.522667-45.653333 13.866667-64.341333z" fill="#ffffff" p-id="5568"></path><path d="M170.666667 170.666667v298.666666h298.666666V170.666667H170.666667z m-85.333334-10.666667C85.333333 118.784 118.784 85.333333 160 85.333333h320c41.216 0 74.666667 33.450667 74.666667 74.666667v320A74.666667 74.666667 0 0 1 480 554.666667h-320A74.666667 74.666667 0 0 1 85.333333 480v-320z" fill="#ffffff" p-id="5569"></path></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1763446648844" class="icon" viewBox="0 0 1321 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3570" xmlns:xlink="http://www.w3.org/1999/xlink" width="258.0078125" height="200"><path d="M1187.981 845.871H200.885V120.065C200.885 91.032 177.659 62 142.82 62s-58.064 23.226-58.064 58.065v783.87c0 29.033 23.225 58.065 58.064 58.065h1045.161c29.033 0 58.065-23.226 58.065-58.065s-29.032-58.064-58.065-58.064z" fill="#1296db" p-id="3571"></path><path d="M287.981 317.484L555.078 485.87c11.613 5.806 17.42 5.806 29.032 5.806 17.42 0 34.84-5.806 46.452-23.225l185.806-255.484 191.613 145.161c23.226 17.42 58.065 11.613 75.484-11.613 17.42-23.226 11.613-58.064-11.613-75.484L839.594 96.84c-23.226-17.42-58.064-11.613-75.484 11.613L572.497 363.935 346.046 224.581c-23.226-17.42-58.065-5.807-75.484 17.419s-5.806 58.065 17.42 75.484z m29.033 505.161c29.032 0 58.064-23.226 58.064-58.064V532.323c0-29.033-23.226-58.065-58.064-58.065s-58.065 23.226-58.065 58.065v238.064c5.807 29.032 29.032 52.258 58.065 52.258zM502.82 619.42v150.968c0 29.032 23.226 58.065 58.065 58.065s58.064-23.226 58.064-58.065V619.42c0-29.032-23.226-58.064-58.064-58.064s-58.065 29.032-58.065 58.064z" fill="#1296db" p-id="3572"></path><path d="M740.885 416.194v354.193c0 29.032 23.225 58.065 58.064 58.065s58.065-23.226 58.065-58.065V416.194c0-29.033-23.226-58.065-58.065-58.065s-58.064 29.032-58.064 58.065z m296.129 92.903c-29.033 0-58.065 23.226-58.065 58.064v203.226c0 29.032 23.226 58.065 58.065 58.065s58.064-23.226 58.064-58.065V567.161c0-29.032-29.032-58.064-58.064-58.064z" fill="#1296db" p-id="3573"></path></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -26,9 +26,8 @@ Vue.use(VueClipboard)
import permission from './utils/permission' import permission from './utils/permission'
Vue.use(permission) Vue.use(permission)
import { formatSize, guidToColor } from "./utils" import { formatSize } from "./utils"
Vue.prototype.$FormatSize = formatSize Vue.prototype.$FormatSize = formatSize
Vue.prototype.$GuidToColor = guidToColor
import Viewer from 'v-viewer' import Viewer from 'v-viewer'
import './assets/css/viewer.css' import './assets/css/viewer.css'
@ -62,8 +61,6 @@ import Onlyoffice from '@/components/Preview_onlyoffice/index'
Vue.use(Onlyoffice) Vue.use(Onlyoffice)
import Video from '@/components/Preview_video/index' import Video from '@/components/Preview_video/index'
Vue.use(Video) Vue.use(Video)
import AGR from '@/components/AGR/index'
Vue.use(AGR)
import MFA from '@/components/MFA/index' import MFA from '@/components/MFA/index'
Vue.use(MFA) Vue.use(MFA)
import FB from '@/components/feedBack/index' import FB from '@/components/feedBack/index'

View File

@ -357,18 +357,4 @@ body .el-table th.gutter {
.el-message-box__wrapper { .el-message-box__wrapper {
z-index: 9999 !important; z-index: 9999 !important;
}
.svg-readingChart {
width: 28px !important;
height: 30px !important;
margin-left: 10px;
cursor: pointer;
}
.svg-readingChart-mini {
width: 18px !important;
height: 20px !important;
vertical-align: -0.4em !important;
cursor: pointer;
} }

View File

@ -1,32 +0,0 @@
import FingerprintJS from '@fingerprintjs/fingerprintjs';
export const customAgent = () => {
return new Promise(async resolve => {
const fpPromise = await FingerprintJS.load({
monitoring: false
});
const result = await fpPromise.get({
products: ['fonts', 'screen', 'canvas'],
extendedData: true,
debug: false
})
// const filteredComponents = Object.fromEntries(
// Object.entries(result.components)
// .filter(([key, value]) => value.confidence > 0.5)
// );
resolve({
...result,
});
// fpPromise
// .then(fp => fp.get({
// products: ['fonts', 'screen', 'canvas'],
// extendedData: true,
// debug: true
// }))
// .then(result => {
// // 自定义数据转换
// });
});
}

View File

@ -196,110 +196,4 @@ export function workSpeedclose(isForce = false) {
lastPercentage = 0; lastPercentage = 0;
imageId = null; imageId = null;
percentageById = {}; percentageById = {};
}
function readDirectoryEntries(directoryReader) {
return new Promise((resolve, reject) => {
let entries = [];
function readBatch() {
directoryReader.readEntries(
(results) => {
if (results.length) {
entries = entries.concat(results);
readBatch();
} else {
resolve(entries);
}
},
(error) => reject(error)
);
}
readBatch();
});
}
export async function readEntry(entry) {
const files = [];
// 如果是文件夹,创建读取器并递归读取其内容
if (entry.isDirectory) {
const directoryReader = entry.createReader();
const entries = await readDirectoryEntries(directoryReader)
// 递归读取文件夹内的每一项
for (const subEntry of entries) {
const subFiles = await readEntry(subEntry);
files.push(...subFiles);
}
}
// 如果是文件则将其转换为File对象
else if (entry.isFile) {
const file = await new Promise((resolve, reject) => {
entry.file(resolve, reject); // entry.file()是异步的
});
files.push(file);
}
return files;
}
// 使用FNV-1a哈希算法确保相同GUID产生相同结果
function fnv1aHash(str) {
const FNV_OFFSET_BASIS = 2166136261;
const FNV_PRIME = 16777619;
let hash = FNV_OFFSET_BASIS;
for (let i = 0; i < str.length; i++) {
hash ^= str.charCodeAt(i);
hash = (hash * FNV_PRIME) >>> 0; // 使用无符号右移确保结果为无符号32位整数
}
return hash;
}
// RGB转十六进制
function rgbToHex(r, g, b) {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase();
}
// HSL转RGB函数
function hslToRgb(h, s, l) {
let r, g, b;
if (s === 0) {
r = g = b = l; // 灰色
} else {
const hue2rgb = (p, q, t) => {
if (t < 0) t += 1;
if (t > 1) t -= 1;
if (t < 1 / 6) return p + (q - p) * 6 * t;
if (t < 1 / 2) return q;
if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
return p;
};
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
const p = 2 * l - q;
r = hue2rgb(p, q, h + 1 / 3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1 / 3);
}
return { r, g, b };
}
export function guidToColor(guid) {
// 移除GUID中的连字符和花括号如果有
let cleanGuid = guid.replace(/[{}()-]/g, '');
// 计算GUID的哈希值
const hash = fnv1aHash(cleanGuid);
// 使用哈希值生成HLS颜色确保高区分度
// 将哈希值映射到0-1之间
const h = (hash & 0xFFFF) / 0xFFFF; // 使用前16位作为色相
const s = ((hash >> 16) & 0xFF) / 0xFF * 0.6 + 0.4; // 饱和度在0.4-1.0之间
const l = ((hash >> 24) & 0xFF) / 0xFF * 0.4 + 0.4; // 亮度在0.3-0.7之间,避免太暗或太亮
// 返回RGB对象
let rgb = hslToRgb(h, s, l);
let obj = {
r: Math.round(rgb.r * 255),
g: Math.round(rgb.g * 255),
b: Math.round(rgb.b * 255)
}
let str = rgbToHex(obj.r, obj.g, obj.b)
return str;
} }

View File

@ -5,7 +5,6 @@ import router from '@/router'
import WHITELIST from "./whiteList" import WHITELIST from "./whiteList"
import moment from 'moment-timezone'; import moment from 'moment-timezone';
import { encryptConfig } from "@/utils/encrypt" import { encryptConfig } from "@/utils/encrypt"
import { customAgent } from './fingerprint'
const ROUTER = require('@/router'); const ROUTER = require('@/router');
axios.defaults.withCredentials = false axios.defaults.withCredentials = false
const service = axios.create({ const service = axios.create({
@ -27,8 +26,6 @@ service.interceptors.request.use(
var language = zzSessionStorage.getItem('lang') var language = zzSessionStorage.getItem('lang')
config.headers['Accept-Language'] = language === 'en' ? 'en-US,en;q=0.5' : 'zh-CN,zh;q=0.9' config.headers['Accept-Language'] = language === 'en' ? 'en-US,en;q=0.5' : 'zh-CN,zh;q=0.9'
config.headers['TimeZoneId'] = moment.tz.guess() config.headers['TimeZoneId'] = moment.tz.guess()
let fingerprint = await customAgent()
config.headers['BrowserFingerprint'] = fingerprint.visitorId
if (config.ENCRYPT) { if (config.ENCRYPT) {
try { try {
config = await encryptConfig(config) config = await encryptConfig(config)

View File

@ -1,88 +0,0 @@
async function queryWindowManagement() {
return await navigator.permissions.query({ name: 'window-management' });;
}
async function getPermission() {
const permission = await queryWindowManagement();
console.log(permission.state, 'permission.state')
if (permission.state === "granted") { // 已经授权
return true
} else if (permission.state === "prompt") { // 询问是否授权
// 请求授权
if (navigator.permissions.request) {
navigator.permissions.request({ name: 'window-management' })
}
return false
} else if (permission.state === "denied") {
// 权限被拒绝
return false
}
}
function getScreen() {
return new Promise((resolve, reject) => {
let multiScreen = []
if (window.getScreenDetails) {
let getScreensProsime1 = window.getScreenDetails();
getScreensProsime1.then((c) => {
if (c instanceof Array) {
multiScreen = c
} else if (c instanceof Object) {
multiScreen = c.screens
} else {
multiScreen = []
}
resolve(multiScreen)
}).catch((err) => {
reject(err)
});
} else if (window.getScreens) {
let getScreensProsime = window.getScreens();
getScreensProsime.then((c) => {
if (c instanceof Array) {
multiScreen = c
} else if (c instanceof Object) {
multiScreen = c.screens
} else {
multiScreen = []
}
resolve(multiScreen)
}).catch((err) => {
reject(err)
})
}
})
}
export async function openWindow(url, name, Skip = false) {
// 判断浏览器是否兼容
// 高版本的谷歌edge不支持跨屏需要降低浏览器版本86.0版
if (!window.getScreens && !window.getScreenDetails) {
console.log('你的浏览器版本不支持多屏展示功能!');
return window.open(url, name);
}
let permission = await getPermission()
if (!permission) {
// alert('使用多屏功能请先进行授权')
if (Skip) {
return window.open(url, name);
}
return false
}
let multiScreen = await getScreen()
console.log(multiScreen, 'multiScreen')
// 判断是否2个屏幕
if (multiScreen.length < 2) {
console.log('请接入多个显示屏!');
return window.open(url, name);
}
console.log(screen, 'screen')
// 获取当前屏幕availLeft信息和所有信息比对取另一个屏幕数据
let currentAvailLeft = screen.availLeft ? screen.availLeft : '0'
let newCurr = multiScreen.find((t) => t.availLeft != currentAvailLeft)
console.log(newCurr, 'newCurr')
let fulls = ''
for (let key in newCurr) {
fulls += `${key}=${(newCurr[key] || newCurr[key] === 0) ? newCurr[key] : 0},`
}
console.log(fulls, 'fulls')
return window.open(url, name, fulls);
}

View File

@ -112,7 +112,7 @@ export default {
this.currentTime = moment().format('YYYY-MM-DD HH:mm:ss') this.currentTime = moment().format('YYYY-MM-DD HH:mm:ss')
}, },
handleTitleClick() { handleTitleClick() {
if (!screenfull.isEnabled) { if (!screenfull.enabled) {
this.$message({ this.$message({
message: 'Your browser can not work', message: 'Your browser can not work',
type: 'warning' type: 'warning'

View File

@ -83,36 +83,33 @@
{{ item.description }} {{ item.description }}
</div> </div>
<div v-if="!item.keySeries" style="padding: 1px;"> <div v-if="!item.keySeries" style="padding: 1px;">
{{ item.imageloadedArr.length <= item.instanceCount ? item.imageloadedArr.length : {{ item.imageloadedArr.length }}/{{ item.instanceCount }}
item.instanceCount }}/{{ item.instanceCount }} </div>
</div> </div>
</div>
<div v-if="showDelete" style="display: flex;flex-direction: row;justify-content: space-between;"
@click.stop="">
<div>
<span style="font-size: 12px;margin-right: 5px">{{ $t('trials:audit:table:isReading')
}}</span>
<el-switch v-model="item.isReading" size="mini"
@change="changeReadingStatus($event, item)" />
</div>
<div>
<span style="font-size: 12px;margin-right: 5px">{{ $t('trials:audit:table:isDelete')
}}</span>
<el-switch v-model="item.isDeleted" size="mini"
@change="changeDeleteStatus($event, item)" />
</div>
</div> </div>
<div
v-if="item.prefetchInstanceCount > 0 && item.prefetchInstanceCount < item.instanceCount * 100">
<el-progress
:percentage="parseInt((item.prefetchInstanceCount / item.instanceCount).toFixed(2))" />
</div>
</div> </div>
<div v-if="showDelete" style="display: flex;flex-direction: row;justify-content: space-between;"
@click.stop="">
<div>
<span style="font-size: 12px;margin-right: 5px">{{ $t('trials:audit:table:isReading')
}}</span>
<el-switch v-model="item.isReading" size="mini" @change="changeReadingStatus($event, item)" />
</div>
<div>
<span style="font-size: 12px;margin-right: 5px">{{ $t('trials:audit:table:isDelete') }}</span>
<el-switch v-model="item.isDeleted" size="mini" @change="changeDeleteStatus($event, item)" />
</div>
</div>
<div
v-if="item.prefetchInstanceCount > 0 && item.prefetchInstanceCount < item.instanceCount * 100">
<el-progress
:percentage="parseInt((item.prefetchInstanceCount / item.instanceCount).toFixed(2))" />
</div>
</div> </div>
</div> </div>
</div>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
@ -894,7 +891,6 @@ export default {
// //
this.seriesList[seriesIndex].loadStatus = true this.seriesList[seriesIndex].loadStatus = true
workSpeedclose() workSpeedclose()
localStorage.setItem("QCRiskControl", 1)
if (!this.isFromCRCUpload) { if (!this.isFromCRCUpload) {
this.loadAllImages() this.loadAllImages()
} }

View File

@ -113,35 +113,35 @@
</div> </div>
</el-tooltip> </el-tooltip>
<div style="padding: 1px;"> <div style="padding: 1px;">
{{ series.imageloadedArr.length <= series.instanceCount ? series.imageloadedArr.length : {{ series.imageloadedArr.length }}/{{ series.instanceCount }}
series.instanceCount }}/{{ series.instanceCount }} </div>
<div />
</div> </div>
<div />
</div> </div>
<div v-if="showDelete" </div>
style="display: flex;flex-direction: row;justify-content: space-between;" @click.stop=""> <div v-if="showDelete"
style="display: flex;flex-direction: row;justify-content: space-between;" @click.stop="">
<div> <div>
<span style="font-size: 12px;">{{ $t('trials:audit:table:isReading') }}</span> <span style="font-size: 12px;">{{ $t('trials:audit:table:isReading') }}</span>
<el-switch v-model="series.isReading" size="mini" <el-switch v-model="series.isReading" size="mini"
@change="changeReadingStatus($event, series)" /> @change="changeReadingStatus($event, series)" />
</div>
<div>
<span style="font-size: 12px;">{{ $t('trials:audit:table:isDelete') }}</span>
<el-switch v-model="series.isDeleted" size="mini"
@change="changeDeleteStatus($event, series)" />
</div>
</div> </div>
<!-- <div style="position: absolute;bottom: -10px;left: 0;width: 100%;"> <div>
<span style="font-size: 12px;">{{ $t('trials:audit:table:isDelete') }}</span>
<el-switch v-model="series.isDeleted" size="mini"
@change="changeDeleteStatus($event, series)" />
</div>
</div>
<!-- <div style="position: absolute;bottom: -10px;left: 0;width: 100%;">
<el-progress v-if="series.prefetchInstanceCount>0 && series.prefetchInstanceCount<series.instanceCount" :percentage="Number(series.prefetchInstanceCount/series.instanceCount)*100" /> <el-progress v-if="series.prefetchInstanceCount>0 && series.prefetchInstanceCount<series.instanceCount" :percentage="Number(series.prefetchInstanceCount/series.instanceCount)*100" />
</div> --> </div> -->
<div <div
v-if="series.prefetchInstanceCount > 0 && series.prefetchInstanceCount < series.instanceCount * 100"> v-if="series.prefetchInstanceCount > 0 && series.prefetchInstanceCount < series.instanceCount * 100">
<el-progress <el-progress
:percentage="parseInt((series.prefetchInstanceCount / series.instanceCount).toFixed(2))" /> :percentage="parseInt((series.prefetchInstanceCount / series.instanceCount).toFixed(2))" />
</div>
</div> </div>
</div>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -937,7 +937,6 @@ export default {
this.loadAllImages() this.loadAllImages()
} }
workSpeedclose() workSpeedclose()
localStorage.setItem("QCRiskControl", 1)
} }
} }
} }

View File

@ -106,16 +106,6 @@ export default {
isTrial: { isTrial: {
type: Boolean, type: Boolean,
default: false default: false
},
isExternal: {
type: Boolean,
default: false
},
ExternalList: {
type: Array,
default: () => {
return []
}
} }
}, },
data() { data() {
@ -132,8 +122,7 @@ export default {
rowData: {}, rowData: {},
list: [], list: [],
searchData: defaultSearchData(), searchData: defaultSearchData(),
title: this.$t('dictionary:signature:fileList'), title: this.$t('dictionary:signature:fileList')
loading: false
} }
}, },
watch: { watch: {
@ -142,16 +131,6 @@ export default {
this.getList() this.getList()
}, },
immediate: true, immediate: true,
},
isExternal: {
handler() {
if (this.isExternal) {
this.list = this.ExternalList
this.rowData = this.list[0] || {}
this.title = this.$t('dictionary:signature:view')
}
},
immediate: true
} }
}, },
methods: { methods: {
@ -166,7 +145,6 @@ export default {
}, },
async getList() { async getList() {
try { try {
if (this.isExternal) return
if (!this.SystemDocumentId) return false if (!this.SystemDocumentId) return false
this.loading = true this.loading = true
if (!this.isTrial) { if (!this.isTrial) {

View File

@ -191,17 +191,6 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item>
<span slot="label">
适用的标准
</span>
<el-select v-model="form.ApplyCriterionList" placeholder="" clearable multiple>
<el-option v-for="item in $d.CriterionType" :key="item.id" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-show="form.ConfigType === 'C' && title !== '复制'" :span="12"> <el-col v-show="form.ConfigType === 'C' && title !== '复制'" :span="12">
<el-form-item> <el-form-item>
<span slot="label"> <span slot="label">
@ -1019,7 +1008,6 @@ export default {
ValueCN: null, ValueCN: null,
EnumType: '', EnumType: '',
IsShowByTrialConfig: false, IsShowByTrialConfig: false,
ApplyCriterionList: [],
TrialConfigRelyFieldName: null, TrialConfigRelyFieldName: null,
Identification: null, Identification: null,
IsForwardPosition: false, IsForwardPosition: false,

View File

@ -1,194 +0,0 @@
<template>
<el-form ref="sysAgreementFrom" v-loading="loading" :model="form" label-width="140px" size="small" :rules="rules"
class="upload-temporary-file">
<div class="base-dialog-body">
<el-row>
<el-col :span="12">
<el-form-item :label="$t('dictionary:agreement:table:UserAgreementTypeEnum')" prop="UserAgreementTypeEnum"
style="width: 48%">
<el-select v-model="form.UserAgreementTypeEnum" style="width: 100%" size="small" filterable>
<el-option v-for="item of $d.UserAgreementType" :key="item.id" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('dictionary:agreement:table:FileName')" prop="FileName" style="width: 48%">
<el-input v-model="form.FileName" clearable style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('dictionary:agreement:table:FileVersion')" prop="FileVersion" style="width: 48%">
<el-input v-model="form.FileVersion" clearable style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('dictionary:agreement:table:UpdateDate')" prop="UpdateDate" style="width: 48%">
<el-date-picker v-model="form.UpdateDate" type="date"
:placeholder="$t('trials:seletctedReviews:table:selectionTime')" value-format="yyyy-MM-dd"
format="yyyy-MM-dd" clearable style="width: 100%;">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('dictionary:agreement:table:EffectiveDate')" prop="EffectiveDate" style="width: 48%">
<el-date-picker v-model="form.EffectiveDate" type="date"
:placeholder="$t('trials:seletctedReviews:table:selectionTime')" value-format="yyyy-MM-dd"
format="yyyy-MM-dd" clearable style="width: 100%;">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-form-item :label="$t('dictionary:agreement:table:FileContent')" prop="FileContent">
<div class="html_temp">
<prism-editor class="my-editor" v-model="form.FileContent" :highlight="highlighter" :line-numbers="true"
style="width: 50%;max-height: 350px;"></prism-editor>
<div v-html="form.FileContent" style="width: 45%;" class="content"></div>
</div>
</el-form-item>
<el-form-item :label="$t('dictionary:agreement:table:FileContentEn')" prop="FileEnContent">
<div class="html_temp">
<prism-editor class="my-editor" v-model="form.FileEnContent" :highlight="highlighter" :line-numbers="true"
style="width: 50%;max-height: 350px;"></prism-editor>
<div v-html="form.FileEnContent" style="width: 45%;" class="content"></div>
</div>
</el-form-item>
</div>
<div class="base-dialog-footer" style="text-align: right; margin-top: 10px">
<el-form-item style="text-align: right">
<el-button size="small" type="primary" :loading="saveBtnLoading" @click="handleSave">{{ $t('common:button:save')
}}</el-button>
</el-form-item>
</div>
</el-form>
</template>
<script>
import {
addOrUpdateUserAgreement,
} from '@/api/dictionary'
import { PrismEditor } from 'vue-prism-editor';
import 'vue-prism-editor/dist/prismeditor.min.css';
import { highlight, languages } from 'prismjs/components/prism-core';
import 'prismjs/components/prism-clike';
import 'prismjs/components/prism-javascript';
import 'prismjs/themes/prism.css';
export default {
name: 'TemplateForm',
props: {
data: {
type: Object,
default() {
return {}
},
},
},
components: { PrismEditor },
data() {
return {
form: {
Id: '',
UserAgreementTypeEnum: '',
FileName: '',
FileVersion: null,
FileContent: '\n\n\n\n',
FileEnContent: `\n\n\n\n`,
UpdateDate: '',
EffectiveDate: '',
IsCurrentVersion: false
},
rules: {
UserAgreementTypeEnum: [
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur'] },
],
FileName: [
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: ['blur'] },
],
FileVersion: [
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: ['blur'] },
],
FileContent: [
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: ['blur'] },
],
FileEnContent: [
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: ['blur'] },
],
UpdateDate: [
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur'] },
],
EffectiveDate: [
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur'] },
],
},
saveBtnLoading: false,
loading: false,
dictionaryList: {},
}
},
mounted() {
this.initForm()
},
methods: {
highlighter(code) {
return highlight(code, languages.js);
},
async initForm() {
if (Object.keys(this.data).length > 0) {
for (const k in this.form) {
if (this.data.hasOwnProperty(k)) {
this.form[k] = this.data[k]
}
}
}
},
handleSave() {
this.$refs.sysAgreementFrom.validate((valid) => {
if (!valid) return
this.saveBtnLoading = true
addOrUpdateUserAgreement(this.form)
.then((res) => {
this.saveBtnLoading = false
this.$emit('closeDialog')
this.$emit('getList')
this.$message.success(this.$t('common:message:savedSuccessfully'))
})
.catch(() => {
this.saveBtnLoading = false
})
})
},
},
}
</script>
<style lang="scss" scoped>
.html_temp {
display: flex;
justify-content: space-between;
width: 100%;
.my-editor {
border: 1px solid #333;
}
}
.base-dialog-body {
max-height: calc(100% - 60px);
}
.upload-temporary-file {
overflow-y: auto;
height: 100%;
}
.content {
max-height: 350px;
overflow-y: auto;
}
</style>

View File

@ -1,313 +0,0 @@
<template>
<BaseContainer>
<template slot="search-container">
<el-form :inline="true" size="small">
<!-- 文件类型 -->
<el-form-item :label="$t('dictionary:agreement:table:UserAgreementTypeEnum')">
<el-select v-model="searchData.UserAgreementTypeEnum" style="width: 150px">
<el-option v-for="item of $d.UserAgreementType" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<!-- 文件名称 -->
<el-form-item :label="$t('dictionary:agreement:table:FileName')">
<el-input v-model="searchData.FileName" style="width: 130px" clearable />
</el-form-item>
<!-- 版本 -->
<el-form-item :label="$t('dictionary:agreement:table:FileVersion')">
<el-input v-model="searchData.FileVersion" style="width: 130px" clearable />
</el-form-item>
<!--更新日期-->
<el-form-item :label="$t('dictionary:agreement:table:UpdateDate')">
<el-date-picker v-model="UpdateDate" @change="changeTimeList('UpdateDate')" value-format="yyyy-MM-dd"
type="daterange">
</el-date-picker>
</el-form-item>
<!--生效日期-->
<el-form-item :label="$t('dictionary:agreement:table:EffectiveDate')">
<el-date-picker v-model="EffectiveDate" @change="changeTimeList('EffectiveDate')" value-format="yyyy-MM-dd"
type="daterange">
</el-date-picker>
</el-form-item>
<!-- 当前版本 -->
<el-form-item :label="$t('dictionary:agreement:table:IsCurrentVersion')">
<el-select v-model="searchData.IsCurrentVersion" style="width: 150px">
<el-option v-for="item of $d.YesOrNo" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t('common:button:search') }}
</el-button>
<!-- 重置 -->
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
</el-form-item>
<el-button type="primary" style="float: right" size="small" @click="handleAdd">
{{ $t('common:button:new') }}
</el-button>
</el-form>
</template>
<template slot="main-container">
<el-table v-adaptive="{ bottomOffset: 60 }" v-loading="loading" :data="list" stripe height="100"
@sort-change="handleSortChange">
<el-table-column type="index" width="40" />
<!-- 文件类型 -->
<el-table-column prop="UserAgreementTypeEnum" :label="$t('dictionary:agreement:table:UserAgreementTypeEnum')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
{{
$fd(
'UserAgreementType',
scope.row.UserAgreementTypeEnum
)
}}
</template>
</el-table-column>
<!-- 文件名称 -->
<el-table-column prop="FileName" :label="$t('dictionary:agreement:table:FileName')" show-overflow-tooltip
sortable="custom" />
<!-- 版本 -->
<el-table-column prop="FileVersion" :label="$t('dictionary:agreement:table:FileVersion')" show-overflow-tooltip
sortable="custom" />
<!--内容-->
<el-table-column prop="FileContent" :label="$t('dictionary:agreement:table:FileContent')">
<template slot-scope="scope">
<el-button type="text" size="small" @click.stop="view(scope.row)">{{ $t('dictionary:agreement:button:view')
}}</el-button>
</template>
</el-table-column>
<!-- 更新日期 -->
<el-table-column prop="UpdateDate" :label="$t('dictionary:agreement:table:UpdateDate')" show-overflow-tooltip
sortable="custom">
<template slot-scope="scope">
<span>{{ scope.row.UpdateDate ? scope.row.UpdateDate.split(' ')[0] : '' }}</span>
</template>
</el-table-column>
<!-- 生效日期 -->
<el-table-column prop="EffectiveDate" :label="$t('dictionary:agreement:table:EffectiveDate')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
<span>{{ scope.row.EffectiveDate ? scope.row.EffectiveDate.split(' ')[0] : '' }}</span>
</template>
</el-table-column>
<!-- 当前版本 -->
<el-table-column prop="IsCurrentVersion" :label="$t('dictionary:agreement:table:IsCurrentVersion')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
{{
$fd(
'YesOrNo',
scope.row.IsCurrentVersion
)
}}
</template>
</el-table-column>
<!-- 创建日期 -->
<el-table-column prop="CreateTime" :label="$t('dictionary:agreement:table:CreateTime')" show-overflow-tooltip
sortable="custom" />
<!-- 修改日期 -->
<el-table-column prop="UpdateTime" :label="$t('dictionary:agreement:table:UpdateTime')" show-overflow-tooltip
sortable="custom" />
<el-table-column :label="$t('common:action:action')" width="300">
<template slot-scope="scope">
<el-button type="text" :disabled="scope.row.IsCurrentVersion" @click="setCurrentVersion(scope.row)">
{{ $t('dictionary:agreement:button:setCurrentVersion') }}
</el-button>
<el-button type="text" @click="handleEdit(scope.row)">
{{ $t('common:button:edit') }}
</el-button>
<!-- <el-button type="text" @click="handleDelete(scope.row)">
{{ $t('common:button:delete') }}
</el-button> -->
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
<!-- 新增/编辑 -->
<el-dialog v-if="editDialog.visible" :visible.sync="editDialog.visible" :close-on-click-modal="false"
:title="editDialog.title" custom-class="base-dialog-wrapper" :fullscreen="true">
<TemplateForm :data="currentRow" @closeDialog="closeDialog" @getList="getList" />
</el-dialog>
</template>
</BaseContainer>
</template>
<script>
import {
getUserAgreementList,
deleteUserAgreement,
setCurrentVersion
} from '@/api/dictionary'
import BaseContainer from '@/components/BaseContainer'
import Pagination from '@/components/Pagination'
import TemplateForm from './TemplateForm'
const searchDataDefault = () => {
return {
StartEffectiveDate: null,
EndEffectiveDate: null,
FileName: null,
FileVersion: null,
IsCurrentVersion: null,
StartUpdateDate: null,
EndUpdateDate: null,
UserAgreementTypeEnum: null,
Asc: false,
SortField: "",
PageIndex: 1,
PageSize: 20,
}
}
export default {
name: 'Agreement',
components: { BaseContainer, Pagination, TemplateForm },
data() {
return {
searchData: searchDataDefault(),
list: [],
total: 0,
currentRow: {},
editDialog: { title: '', visible: false },
loading: false,
UpdateDate: [],
EffectiveDate: []
}
},
mounted() {
this.getList()
},
computed: {
isEN() {
return this.$i18n.locale !== 'zh'
},
},
methods: {
async setCurrentVersion(row) {
try {
let data = {
Id: row.Id
}
this.loading = true
let res = await setCurrentVersion(data)
this.loading = false
if (res.IsSuccess) {
this.getList()
}
} catch (err) {
this.loading = false
console.log(err)
}
},
view(row) {
this.$AGR({
Id: row.Id,
IsEn_Us: this.isEN
})
},
changeTimeList(key) {
if (this[key]) {
this.searchData[`Start${key}`] = this[key][0]
this.searchData[`End${key}`] = this[key][1]
} else {
this.searchData.BeginCreateTime = null
this.searchData.EndCreateTime = null
}
},
handleDelete(row) {
//
this.$confirm(this.$t('dictionary:agreement:message:msg1')).then(() => {
deleteUserAgreement(row.Id).then(() => {
this.$message.success(this.$t('common:message:deletedSuccessfully'))
this.getList()
})
}).catch(() => { })
},
PreviewFile(row) {
let basePath = window.location.origin
if (window.location.protocol !== 'https:') {
basePath = 'https://irc.test.extimaging.com'
}
let data = {
name: row.NameCN,
path: basePath + row.Path,
}
this.$emit('PreviewFile', data)
},
getList() {
this.loading = true
getUserAgreementList(this.searchData)
.then((res) => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
})
.catch(() => {
this.loading = false
})
},
//
handleAdd() {
this.editDialog.title = this.$t('common:button:new')
this.currentRow = {}
this.editDialog.visible = true
},
//
async handleDownload(row) {
try {
this.loading = true
let fileName = this.isEN ? row.Name : row.NameCN;
let type = fileName
.substring(fileName.lastIndexOf('.'))
.toLocaleLowerCase()
if (!type) {
let extendName = row.Path
.substring(row.Path.lastIndexOf('.'))
.toLocaleLowerCase()
fileName += extendName
}
let res = await downLoadFile(this.OSSclientConfig.basePath + row.Path, fileName)
this.loading = false
} catch (err) {
this.loading = false
}
},
//
handleEdit(row) {
this.editDialog.title = this.$t('common:button:edit')
this.currentRow = { ...row }
this.editDialog.visible = true
},
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
},
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
closeDialog() {
this.editDialog.visible = false
},
//
handleSortChange(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
},
}
</script>
<style lang="scss" scoped>
::v-deep .search {
display: block;
}
</style>

View File

@ -3,22 +3,27 @@
<!-- 器官 --> <!-- 器官 -->
<el-tab-pane :label="$t('dictionary:template:basicData:organs')" name="organs"> <el-tab-pane :label="$t('dictionary:template:basicData:organs')" name="organs">
<OrgansTbl :criterion-id="criterionId" :is-complete-config="isCompleteConfig" /> <OrgansTbl
:criterion-id="criterionId"
:is-complete-config="isCompleteConfig"
/>
</el-tab-pane> </el-tab-pane>
<!-- 疗效评估 --> <!-- 疗效评估 -->
<el-tab-pane :label="$t('dictionary:template:basicData:efficacyAssessment')" name="efficacyAssessment"> <el-tab-pane :label="$t('dictionary:template:basicData:efficacyAssessment')" name="efficacyAssessment">
<EfficacyAssessment v-if="tabs.includes('efficacyAssessment')" :criterion-id="criterionId" <EfficacyAssessment
:criterion-type="criterionType" :is-complete-config="isCompleteConfig" /> v-if="tabs.includes('efficacyAssessment')"
:criterion-id="criterionId"
:criterion-type="criterionType"
:is-complete-config="isCompleteConfig"
/>
</el-tab-pane> </el-tab-pane>
<!-- 标准字典 --> <!-- 标准字典 -->
<el-tab-pane :label="$t('dictionary:template:basicData:criterionDictionary')" name="criterionDictionary"> <el-tab-pane :label="$t('dictionary:template:basicData:criterionDictionary')" name="criterionDictionary">
<CriterionDictionary v-if="tabs.includes('criterionDictionary')" :criterion-id="criterionId" <CriterionDictionary
:is-complete-config="isCompleteConfig" /> v-if="tabs.includes('criterionDictionary')"
</el-tab-pane> :criterion-id="criterionId"
<!-- 关键文件 --> :is-complete-config="isCompleteConfig"
<el-tab-pane :label="$t('dictionary:template:basicData:keyDocument')" name="keyDocument"> />
<KeyDocument v-if="tabs.includes('keyDocument')" :criterion-id="criterionId"
:is-complete-config="isCompleteConfig" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</template> </template>
@ -26,10 +31,9 @@
import OrgansTbl from './OrgansTbl' import OrgansTbl from './OrgansTbl'
import EfficacyAssessment from './EfficacyAssessment' import EfficacyAssessment from './EfficacyAssessment'
import CriterionDictionary from './CriterionDictionary' import CriterionDictionary from './CriterionDictionary'
import KeyDocument from './KeyDocument'
export default { export default {
name: 'CriterionsBaseData', name: 'CriterionsBaseData',
components: { OrgansTbl, EfficacyAssessment, CriterionDictionary, KeyDocument }, components: { OrgansTbl, EfficacyAssessment, CriterionDictionary },
props: { props: {
criterionId: { criterionId: {
type: String, type: String,

View File

@ -1,6 +1,6 @@
<template> <template>
<div style="position: relative"> <div style="position: relative">
<el-form size="small" :inline="true" style="position: relative;"> <el-form size="small" :inline="true" style="position: relative;">
<!-- 阅片规则 --> <!-- 阅片规则 -->
<el-divider content-position="left">{{ $t('dictionary:template:globalConfig:readingRules') }}</el-divider> <el-divider content-position="left">{{ $t('dictionary:template:globalConfig:readingRules') }}</el-divider>
<!-- 是否必须全局阅片 --> <!-- 是否必须全局阅片 -->
@ -8,38 +8,68 @@
{{ $fd('YesOrNo', IsMustGlobalReading) }} {{ $fd('YesOrNo', IsMustGlobalReading) }}
</el-form-item> </el-form-item>
<!-- 配置 --> <!-- 配置 -->
<el-button size="mini" type="primary" style="position: absolute;right: 10px;top: 15px" <el-button
v-if="Object.keys(data).length > 0 && !(data.IsCompleteConfig || data.IsBeUsed)" @click="handleAdd(1)"> size="mini"
type="primary"
style="position: absolute;right: 10px;top: 15px"
v-if="Object.keys(data).length > 0 && !(data.IsCompleteConfig || data.IsBeUsed)"
@click="handleAdd(1)"
>
{{ $t('dictionary:template:globalConfig:config') }} {{ $t('dictionary:template:globalConfig:config') }}
</el-button> </el-button>
</el-form> </el-form>
<el-form size="small" :inline="true" style="position: relative"> <el-form size="small" :inline="true" style="position: relative">
<!-- 名称 --> <!-- 名称 -->
<el-divider content-position="left">{{ $t('dictionary:template:globalConfig:name') }}</el-divider> <el-divider content-position="left">{{ $t('dictionary:template:globalConfig:name') }}</el-divider>
<!-- 配置 --> <!-- 配置 -->
<el-button size="mini" type="primary" style="position: absolute;right: 10px;top: 15px" <el-button
v-if="Object.keys(data).length > 0 && !(data.IsCompleteConfig || data.IsBeUsed)" @click="handleAdd(2)"> size="mini"
type="primary"
style="position: absolute;right: 10px;top: 15px"
v-if="Object.keys(data).length > 0 && !(data.IsCompleteConfig || data.IsBeUsed)"
@click="handleAdd(2)"
>
{{ $t('dictionary:template:globalConfig:config') }} {{ $t('dictionary:template:globalConfig:config') }}
</el-button> </el-button>
<!-- 评估更新类型 --> <!-- 评估更新类型 -->
<el-form-item :label="$t('dictionary:template:globalConfig:updateType')" style="width: 100%"> <el-form-item :label="$t('dictionary:template:globalConfig:updateType')" style="width: 100%">
</el-form-item> </el-form-item>
<el-table v-loading="loading" style="width: 100%" :data="list" stripe> <el-table
v-loading="loading"
style="width: 100%"
:data="list"
stripe
>
<!-- 序号 --> <!-- 序号 -->
<el-table-column prop="" :label="$t('dictionary:template:globalConfig:order')" width="80"> <el-table-column
prop=""
:label="$t('dictionary:template:globalConfig:order')"
width="80"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.$index + 1 }} {{scope.$index + 1}}
</template> </template>
</el-table-column> </el-table-column>
<!-- 中文值 --> <!-- 中文值 -->
<el-table-column prop="ValueCN" :label="$t('dictionary:template:globalConfig:valueCN')" show-overflow-tooltip> <el-table-column
prop="ValueCN"
:label="$t('dictionary:template:globalConfig:valueCN')"
show-overflow-tooltip
>
</el-table-column> </el-table-column>
<!-- 英文值 --> <!-- 英文值 -->
<el-table-column prop="Value" :label="$t('dictionary:template:globalConfig:value')" show-overflow-tooltip> <el-table-column
prop="Value"
:label="$t('dictionary:template:globalConfig:value')"
show-overflow-tooltip
>
</el-table-column> </el-table-column>
<!-- 是否基线评估 --> <!-- 是否基线评估 -->
<el-table-column prop="IsBaseLineUse" :label="$t('dictionary:template:globalConfig:isBaseLineUse')" <el-table-column
show-overflow-tooltip> prop="IsBaseLineUse"
:label="$t('dictionary:template:globalConfig:isBaseLineUse')"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<!-- <el-switch--> <!-- <el-switch-->
<!-- @change="(v) => {BaseLineUseChange(v, scope.row)}"--> <!-- @change="(v) => {BaseLineUseChange(v, scope.row)}"-->
@ -51,64 +81,92 @@
</template> </template>
</el-table-column> </el-table-column>
<!-- 是否随访评估 --> <!-- 是否随访评估 -->
<el-table-column prop="IsFollowVisitUse" :label="$t('dictionary:template:globalConfig:isFollowVisitUse')" <el-table-column
show-overflow-tooltip> prop="IsFollowVisitUse"
:label="$t('dictionary:template:globalConfig:isFollowVisitUse')"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<!-- <el-switch--> <!-- <el-switch-->
<!-- @change="(v) => {FollowVisitUseChange(v, scope.row)}"--> <!-- @change="(v) => {FollowVisitUseChange(v, scope.row)}"-->
<!-- v-model="scope.row.IsFollowVisitUse"--> <!-- v-model="scope.row.IsFollowVisitUse"-->
<!-- >--> <!-- >-->
<!-- </el-switch>--> <!-- </el-switch>-->
<el-tag v-if="scope.row.IsFollowVisitUse" type="primary">{{ $fd('YesOrNo', scope.row.IsFollowVisitUse) <el-tag v-if="scope.row.IsFollowVisitUse" type="primary">{{ $fd('YesOrNo', scope.row.IsFollowVisitUse) }}</el-tag>
}}</el-tag>
<el-tag v-else type="danger">{{ $fd('YesOrNo', scope.row.IsFollowVisitUse) }}</el-tag> <el-tag v-else type="danger">{{ $fd('YesOrNo', scope.row.IsFollowVisitUse) }}</el-tag>
<!-- <span>{{$fd('YesOrNo', scope.row.IsFollowVisitUse)}}</span>--> <!-- <span>{{$fd('YesOrNo', scope.row.IsFollowVisitUse)}}</span>-->
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-form> </el-form>
<base-model :config="config"> <base-model
:config="config"
>
<template slot="dialog-body"> <template slot="dialog-body">
<el-form size="small" :inline="true" label-width="130px"> <el-form size="small" :inline="true" label-width="130px">
<!-- 是否必须全局阅片 --> <!-- 是否必须全局阅片 -->
<el-form-item :label="$t('dictionary:template:globalConfig:isMustGlobalReading')" <el-form-item :label="$t('dictionary:template:globalConfig:isMustGlobalReading')" v-if="config.configType === 1">
v-if="config.configType === 1">
<el-radio-group v-model="form.IsMustGlobalReading"> <el-radio-group v-model="form.IsMustGlobalReading">
<el-radio v-for="item of $d.YesOrNo" :key="'form.IsMustGlobalReading' + item.value" :label="item.value">{{ <el-radio v-for="item of $d.YesOrNo" :key="'form.IsMustGlobalReading' + item.value" :label="item.value">{{ item.label }}</el-radio>
item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 评估更新类型 @selection-change="handleSelectionChange"--> <!-- 评估更新类型 -->
<el-form-item v-if="config.configType === 2" :label="$t('dictionary:template:globalConfig:updateType')" <el-form-item v-if="config.configType === 2" :label="$t('dictionary:template:globalConfig:updateType')" style="width: 100%">
style="width: 100%">
</el-form-item> </el-form-item>
<el-table v-if="config.configType === 2" v-loading="loading" ref="multipleTable" :data="GlobalAssessType" <el-table
stripe> v-if="config.configType === 2"
<!-- <el-table-column type="selection" width="55"> v-loading="loading"
</el-table-column> --> ref="multipleTable"
:data="GlobalAssessType"
stripe
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55">
</el-table-column>
<!-- 中文值 --> <!-- 中文值 -->
<el-table-column prop="ValueCN" :label="$t('dictionary:template:globalConfig:valueCN')" <el-table-column
show-overflow-tooltip> prop="ValueCN"
:label="$t('dictionary:template:globalConfig:valueCN')"
show-overflow-tooltip
>
</el-table-column> </el-table-column>
<!-- 英文值 --> <!-- 英文值 -->
<el-table-column prop="Value" :label="$t('dictionary:template:globalConfig:value')" show-overflow-tooltip> <el-table-column
prop="Value"
:label="$t('dictionary:template:globalConfig:value')"
show-overflow-tooltip
>
</el-table-column> </el-table-column>
<!-- 是否基线评估 --> <!-- 是否基线评估 -->
<el-table-column prop="IsBaseLineUse" :label="$t('dictionary:template:globalConfig:isBaseLineUse')" <el-table-column
show-overflow-tooltip> prop="IsBaseLineUse"
:label="$t('dictionary:template:globalConfig:isBaseLineUse')"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-switch v-model="scope.row.IsBaseLineUse" @change="() => $forceUpdate()"> <el-switch
v-model="scope.row.IsBaseLineUse"
@change="() => $forceUpdate()"
>
</el-switch> </el-switch>
<span>{{ $fd('YesOrNo', scope.row.IsBaseLineUse) }}</span> <span>{{$fd('YesOrNo', scope.row.IsBaseLineUse)}}</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- 是否随访评估 --> <!-- 是否随访评估 -->
<el-table-column prop="IsFollowVisitUse" :label="$t('dictionary:template:globalConfig:isFollowVisitUse')" <el-table-column
show-overflow-tooltip> prop="IsFollowVisitUse"
:label="$t('dictionary:template:globalConfig:isFollowVisitUse')"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-switch v-model="scope.row.IsFollowVisitUse" @change="() => $forceUpdate()"> <el-switch
v-model="scope.row.IsFollowVisitUse"
@change="() => $forceUpdate()"
>
</el-switch> </el-switch>
<span>{{ $fd('YesOrNo', scope.row.IsFollowVisitUse) }}</span> <span>{{$fd('YesOrNo', scope.row.IsFollowVisitUse)}}</span>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -168,7 +226,7 @@ export default {
mounted() { mounted() {
this.getList() this.getList()
this.getSystemGlobalInfo() this.getSystemGlobalInfo()
// this.getCriterionDictionary() this.getCriterionDictionary()
}, },
methods: { methods: {
getCriterionDictionary() { getCriterionDictionary() {
@ -183,12 +241,12 @@ export default {
getSystemGlobalInfo({ getSystemGlobalInfo({
SystemCriterionId: this.criterionId SystemCriterionId: this.criterionId
}).then(res => { }).then(res => {
this.GlobalAssessType = res.Result.DictionaryList
}) })
}, },
FollowVisitUseChange(v, row) { FollowVisitUseChange(v, row) {
this.loading = true this.loading = true
setDictionaryFollowVisitUse({ Id: row.Id, IsFollowVisitUse: v }).then(res => { setDictionaryFollowVisitUse({Id:row.Id, IsFollowVisitUse: v}).then(res => {
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$message.success(this.$t('common:message:savedSuccessfully'))
this.loading = false this.loading = false
}).catch(() => { }).catch(() => {
@ -197,7 +255,7 @@ export default {
}, },
BaseLineUseChange(v, row) { BaseLineUseChange(v, row) {
this.loading = true this.loading = true
setDictionaryBaseLineUse({ Id: row.Id, isBaseLineUse: v }).then(res => { setDictionaryBaseLineUse({Id:row.Id, isBaseLineUse: v}).then(res => {
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$message.success(this.$t('common:message:savedSuccessfully'))
this.loading = false this.loading = false
}).catch(() => { }).catch(() => {
@ -215,7 +273,6 @@ export default {
} }
}, },
handleSelectionChange(val) { handleSelectionChange(val) {
console.log(this.selectedList, 'this.selectedList')
this.selectedList = val this.selectedList = val
}, },
getList() { getList() {
@ -238,6 +295,18 @@ export default {
} else { } else {
this.config.title = this.$t('dictionary:template:globalConfig:updateType') this.config.title = this.$t('dictionary:template:globalConfig:updateType')
this.config.visible = true this.config.visible = true
this.$nextTick(() => {
var a = this.$d.GlobalAssessType.filter(v => {
return !!this.list.find(v1 => {
if (v.id === v1.DictionaryId) {
v.IsBaseLineUse = v1.IsBaseLineUse
v.IsFollowVisitUse = v1.IsFollowVisitUse
}
return v1.DictionaryId === v.id
})
})
this.toggleSelection(a)
})
} }
}, },
handleSave() { handleSave() {
@ -250,11 +319,11 @@ export default {
var params = { var params = {
SystemCriterionId: this.criterionId, SystemCriterionId: this.criterionId,
IsMustGlobalReading: this.form.IsMustGlobalReading, IsMustGlobalReading: this.form.IsMustGlobalReading,
DictionaryList: this.config.configType === 1 ? this.list : this.GlobalAssessType.map(v => { DictionaryList: this.config.configType === 1 ? this.list : this.selectedList.map(v => {
return { return {
DictionaryId: v.DictionaryId, DictionaryId: v.id,
IsBaseLineUse: v.IsBaseLineUse ? v.IsBaseLineUse : false, IsBaseLineUse: v.IsBaseLineUse,
IsFollowVisitUse: v.IsFollowVisitUse ? v.IsFollowVisitUse : false, IsFollowVisitUse: v.IsFollowVisitUse,
} }
}), }),
} }
@ -273,3 +342,5 @@ export default {
} }
} }
</script> </script>

View File

@ -1,286 +0,0 @@
<template>
<BaseContainer>
<!-- 搜索框 -->
<template slot="search-container">
<el-form :inline="true" size="mini">
<el-form-item :label="$t('dictionary:template:keyDocList:FileName')">
<el-input clearable v-model="searchData.FileName"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleSearch">
{{ $t('common:button:search') }}
</el-button>
<el-button type="primary" icon="el-icon-refresh-left" size="mini" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
</el-form-item>
<el-form-item>
<div class="upload">
<input directory accept=".pdf" type="file" name="uploadFolder" class="select-file" title=""
@change="beginScanFiles($event)" />
<div class="btn-select">
{{ $t('dictionary:template:basicData:button:selectFile') }}
</div>
</div>
</el-form-item>
</el-form>
</template>
<template slot="main-container">
<div class="drag" ref="drag" @dragover="handleDragover" @drop="handleDrop">
<el-table ref="keyDocList" v-loading="loading" v-adaptive="{ bottomOffset: 80 }" :data="list"
width="100%" style="width: 100%;min-width: 300px" stripe height="100"
@sort-change="handleSortByColumn">
<el-table-column type="index" min-width="90" />
<el-table-column prop="FileName" :label="$t('dictionary:template:keyDocList:FileName')"
show-overflow-tooltip />
<el-table-column prop="CreateTime" :label="$t('dictionary:template:keyDocList:CreateTime')"
show-overflow-tooltip />
<el-table-column :label="$t('common:action:action')" align="left" fixed="right">
<template slot-scope="scope">
<el-button circle icon="el-icon-view"
:title="$t('dictionary:template:keyDocList:button:view')"
@click.stop="view(scope.row)" />
<el-button circle icon="el-icon-delete"
:title="$t('dictionary:template:keyDocList:button:del')" @click.stop="del(scope.row)" />
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
</template>
</BaseContainer>
</template>
<script>
import { Upload } from '@/api/dictionary'
import BaseContainer from '@/components/BaseContainer'
import Pagination from '@/components/Pagination'
import { getSystemCriterionKeyFileList, addOrUpdateSystemCriterionKeyFile, deleteSystemCriterionKeyFile } from '@/api/dictionary'
import { readEntry } from '@/utils/index'
const searchDataDefault = () => {
return {
FileName: '',
PageIndex: 1,
PageSize: 20,
Asc: false,
SortField: ''
}
}
export default {
name: "KeyDocument",
components: { BaseContainer, Pagination },
props: {
criterionId: {
type: String,
required: true
},
isCompleteConfig: {
type: Boolean,
required: true
},
},
data() {
return {
searchData: searchDataDefault(),
loading: false,
list: [],
total: 0,
}
},
mounted() {
this.getList()
},
methods: {
handleDragover(e) {
e.stopPropagation();
e.preventDefault();
},
handleDrop(e) {
e.stopPropagation();
e.preventDefault();
this.beginScanFiles(e, true)
},
beforeUpload(file) {
//
if (this.checkFileSuffix(file.name)) {
this.fileList = [];
return true;
} else {
// this.$alert("word/excel");
this.$alert(this.$t("dictionary:attachment:export:alert:formatFile"));
return false;
}
},
async beginScanFiles(e, isDrop = false) {
try {
this.loading = true;
let files = []
if (isDrop) {
const items = e.dataTransfer.items;
const allFiles = []; //
//
for (const item of items) {
const entry = item.webkitGetAsEntry(); //
if (entry) {
const files = await readEntry(entry); //
allFiles.push(...files);
}
}
files = allFiles
} else {
files = [...e.target.files]
}
for (let i = 0; i < files.length; i++) {
let file = files[i]
if (!this.checkFileSuffix(file.name)) continue
const formData = new FormData();
formData.append("file", file);
let res = await Upload(formData, 5)
let data = {
FilePath: res.Result.FilePath,
FileName: file.name
}
await this.addKeyDoc(data)
}
} catch (err) {
console.log(err)
this.loading = false;
}
},
checkFileSuffix(fileName) {
var index = fileName.lastIndexOf('.')
var suffix = fileName.substring(index + 1, fileName.length)
if ('.pdf'.toLocaleLowerCase().search(suffix.toLocaleLowerCase()) === -1) {
return false
} else {
return true
}
},
async getList() {
try {
this.searchData.SystemCriterionId = this.criterionId
this.loading = true
let res = await getSystemCriterionKeyFileList(this.searchData)
this.loading = false
if (res.IsSuccess) {
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}
} catch (err) {
this.loading = false
console.log(err)
}
},
async addKeyDoc(row) {
try {
let { FileName, FilePath } = row
let data = {
FileName,
FilePath,
SystemCriterionId: this.criterionId
}
this.loading = true
let res = await addOrUpdateSystemCriterionKeyFile(data)
this.loading = false
if (res.IsSuccess) {
this.getList()
}
} catch (err) {
this.loading = false
console.log(err)
}
},
async del(row) {
try {
this.loading = true
let res = await deleteSystemCriterionKeyFile(row.Id)
this.loading = false
if (res.IsSuccess) {
this.getList()
}
} catch (err) {
console.log(err)
this.loading = false
}
},
view(row) {
this.$preview({
path: row.FilePath,
type: 'pdf',
isLocal: true,
title: row.FileName,
})
},
//
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
},
//
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.upload {
display: inline-block;
height: 30px;
width: 90px;
padding: 2px 10px;
line-height: 23px;
position: relative;
text-decoration: none;
border-radius: 3px;
overflow: hidden;
text-align: center;
background: #428bca;
border-color: #428bca;
color: #fff;
.select-file {
height: 30px;
width: 90px;
position: absolute;
overflow: hidden;
left: 0;
top: 0;
opacity: 0;
font-size: 0;
}
.btn-select {
//
width: 90px;
height: 30px;
line-height: 30px;
text-align: center;
cursor: pointer;
border-radius: 24px;
overflow: hidden;
position: absolute;
top: 0;
left: 0;
pointer-events: none; //pointer-events:none穿
}
}
</style>

View File

@ -1,86 +1,155 @@
<template> <template>
<el-form ref="tableQsForm" v-loading="loading" :model="form" size="small" :disabled="type === 'look'" :rules="rules" <el-form
label-width="130px"> ref="tableQsForm"
v-loading="loading"
:model="form"
size="small"
:disabled="type === 'look'"
:rules="rules"
label-width="130px"
>
<div class="base-dialog-body" style="height: 550px; display:flex;flex-direction: column;"> <div class="base-dialog-body" style="height: 550px; display:flex;flex-direction: column;">
<div style="height: 150px;"> <div style="height: 150px;">
<!-- 类型 --> <!-- 类型 -->
<el-form-item :label="$t('trials:readingUnit:qsList:title:type')" prop="Type"> <el-form-item :label="$t('trials:readingUnit:qsList:title:type')" prop="Type">
<el-select v-model="form.Type" @change="((val) => { qsTypeChange(val, form) })"> <el-select
<el-option v-for="item of $d.Criterion_Question_Type" v-model="form.Type"
@change="((val)=>{qsTypeChange(val, form)})"
>
<el-option
v-for="item of $d.Criterion_Question_Type"
v-show="item.value !== 'class' && item.value !== 'group' && item.value !== 'table' && item.value !== 'basicTable'" v-show="item.value !== 'class' && item.value !== 'group' && item.value !== 'table' && item.value !== 'basicTable'"
:key="item.value" :value="item.value" :label="item.label" /> :key="item.value"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 问题名称 --> <!-- 问题名称 -->
<el-form-item v-if="form.Type !== 'group'" :label="$t('trials:readingUnit:qsList:title:qsNameEn')" <el-form-item
prop="QuestionName" :rules="[ v-if="form.Type !== 'group'"
:label="$t('trials:readingUnit:qsList:title:qsNameEn')"
prop="QuestionName"
:rules="[
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }, { required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' },
{ max: form.Type === 'summary' ? 300 : 100, message: `${this.$t('common:ruleMessage:maxLength')} ${form.Type === 'summary' ? 300 : 100}` } { max: form.Type === 'summary' ? 300 : 100, message: `${this.$t('common:ruleMessage:maxLength')} ${form.Type === 'summary' ? 300 : 100}` }
]"> ]"
<el-input v-model="form.QuestionName" /> >
<el-input
v-model="form.QuestionName"
/>
</el-form-item> </el-form-item>
<!-- 问题名称EN --> <!-- 问题名称EN -->
<el-form-item v-if="form.Type !== 'group'" :label="$t('trials:readingUnit:qsList:title:qsNameEn')" <el-form-item
prop="QuestionEnName" :rules="[ v-if="form.Type !== 'group'"
:label="$t('trials:readingUnit:qsList:title:qsNameEn')"
prop="QuestionEnName"
:rules="[
{ max: form.Type === 'summary' ? 300 : 100, message: `${this.$t('common:ruleMessage:maxLength')} ${form.Type === 'summary' ? 300 : 100}` } { max: form.Type === 'summary' ? 300 : 100, message: `${this.$t('common:ruleMessage:maxLength')} ${form.Type === 'summary' ? 300 : 100}` }
]"> ]"
<el-input v-model="form.QuestionEnName" /> >
<el-input
v-model="form.QuestionEnName"
/>
</el-form-item> </el-form-item>
</div> </div>
<div style="flex: 1;overflow-y:auto;"> <div style="flex: 1;overflow-y:auto;">
<!-- 公有属性 --> <!-- 公有属性 -->
<el-divider content-position="left">{{ $t('trials:readingUnit:title:publicProperties') }}</el-divider> <el-divider content-position="left">{{$t('trials:readingUnit:title:publicProperties')}}</el-divider>
<!-- 是否显示 --> <!-- 是否显示 -->
<el-form-item v-if="form.Type !== 'group'" :label="$t('trials:readingUnit:qsList:title:isShow')" <el-form-item v-if="form.Type !== 'group'" :label="$t('trials:readingUnit:qsList:title:isShow')" prop="ShowQuestion">
prop="ShowQuestion"> <el-radio-group
<el-radio-group v-model="form.ShowQuestion" @change="((val) => { isShowQuestionChange(val, form) })"> v-model="form.ShowQuestion"
<el-radio v-for="item of $d.ShowQuestion" :key="`ShowQuestion${item.value}`" :label="item.value"> @change="((val)=>{isShowQuestionChange(val, form)})"
>
<el-radio
v-for="item of $d.ShowQuestion"
:key="`ShowQuestion${item.value}`"
:label="item.value"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 显示时依赖父问题 --> <!-- 显示时依赖父问题 -->
<el-form-item v-if="form.Type !== 'group' && form.ShowQuestion === 1" <el-form-item
:label="$t('trials:readingUnit:qsList:title:parentId')" prop="ParentId"> v-if="form.Type !== 'group' && form.ShowQuestion===1"
<el-select v-model="form.ParentId" clearable @change="((val) => { parentQuestionChange(val, form) })"> :label="$t('trials:readingUnit:qsList:title:parentId')"
<el-option v-for="item of parentOptions" :key="`ParentId${item.QuestionId}`" :label="item.QuestionName" prop="ParentId"
:value="item.QuestionId" /> >
<el-select
v-model="form.ParentId"
clearable
@change="((val)=>{parentQuestionChange(val, form)})"
>
<el-option
v-for="item of parentOptions"
:key="`ParentId${item.QuestionId}`"
:label="item.QuestionName"
:value="item.QuestionId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 显示时依赖父问题触发值 --> <!-- 显示时依赖父问题触发值 -->
<el-form-item v-if="form.ParentId && form.ShowQuestion === 1" <el-form-item v-if="form.ParentId && form.ShowQuestion===1" :label="$t('trials:readingUnit:qsList:title:parentTriggerValueList')" prop="ParentTriggerValueList">
:label="$t('trials:readingUnit:qsList:title:parentTriggerValueList')" prop="ParentTriggerValueList">
<el-select v-model="form.ParentTriggerValueList" clearable multiple> <el-select v-model="form.ParentTriggerValueList" clearable multiple>
<el-option v-for="item of parentTriggerValOptions" :key="item.id" :label="item.label" <el-option
:value="String(item.value)" /> v-for="item of parentTriggerValOptions"
:key="item.id"
:label="item.label"
:value="String(item.value)"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 是否必填 --> <!-- 是否必填 -->
<el-form-item <el-form-item v-if="form.Type !== 'group' && form.Type !== 'table' && form.Type !== 'basicTable' && form.Type !== 'summary'" :label="$t('trials:readingUnit:qsList:title:isRequired')" prop="IsRequired">
v-if="form.Type !== 'group' && form.Type !== 'table' && form.Type !== 'basicTable' && form.Type !== 'summary'" <el-radio-group
:label="$t('trials:readingUnit:qsList:title:isRequired')" prop="IsRequired"> v-model="form.IsRequired"
<el-radio-group v-model="form.IsRequired" :disabled="form.IsJudgeQuestion === true || form.ShowQuestion === 2" :disabled="form.IsJudgeQuestion===true || form.ShowQuestion===2"
@change="((val) => { isRequiredChange(val, form) })"> @change="((val)=>{isRequiredChange(val, form)})"
<el-radio v-for="item of $d.QuestionRequired" :key="`QuestionRequired${item.value}`" :label="item.value"> >
<el-radio
v-for="item of $d.QuestionRequired"
:key="`QuestionRequired${item.value}`"
:label="item.value"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 必填依赖父问题 --> <!-- 必填依赖父问题 -->
<el-form-item v-if="form.Type !== 'group' && form.IsRequired === 1" <el-form-item
:label="$t('trials:readingUnit:qsList:title:relevanceId')" prop="RelevanceId"> v-if="form.Type !== 'group' && form.IsRequired === 1"
<el-select v-model="form.RelevanceId" clearable @change="((val) => { relevanceQuestionChange(val, form) })"> :label="$t('trials:readingUnit:qsList:title:relevanceId')"
<el-option v-for="item of parentOptions" :key="`RelevanceId${item.QuestionId}`" :label="item.QuestionName" prop="RelevanceId"
:value="item.QuestionId" /> >
<el-select
v-model="form.RelevanceId"
clearable
@change="((val)=>{relevanceQuestionChange(val, form)})"
>
<el-option
v-for="item of parentOptions"
:key="`RelevanceId${item.QuestionId}`"
:label="item.QuestionName"
:value="item.QuestionId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 必填触发值 --> <!-- 必填触发值 -->
<el-form-item v-if="form.RelevanceId && form.IsRequired === 1" <el-form-item
:label="$t('trials:readingUnit:qsList:title:relevanceValueList')" prop="RelevanceValueList"> v-if="form.RelevanceId && form.IsRequired === 1"
:label="$t('trials:readingUnit:qsList:title:relevanceValueList')"
prop="RelevanceValueList"
>
<el-select v-model="form.RelevanceValueList" clearable multiple> <el-select v-model="form.RelevanceValueList" clearable multiple>
<el-option v-for="item of reParentTriggerValOptions" :key="item.id" :label="item.label" <el-option
:value="String(item.value)" /> v-for="item of reParentTriggerValOptions"
:key="item.id"
:label="item.label"
:value="String(item.value)"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 导出标识 --> <!-- 导出标识 -->
@ -105,95 +174,175 @@
</el-radio-group> </el-radio-group>
</el-form-item> --> </el-form-item> -->
<!-- 导出结果 --> <!-- 导出结果 -->
<el-form-item :label="$t('trials:readingUnit:qsList:title:ExportResult')" <el-form-item
v-if="form.Type === 'radio' || form.Type === 'select' || form.Type === 'input' || form.Type === 'textarea' || form.Type === 'number' || form.Type === 'class' || form.Type === 'calculation'"> :label="$t('trials:readingUnit:qsList:title:ExportResult')"
v-if="form.Type === 'radio' || form.Type === 'select' || form.Type === 'input' || form.Type === 'textarea' || form.Type === 'number' || form.Type === 'class' || form.Type === 'calculation'"
>
<el-select v-model="form.ExportResult" multiple> <el-select v-model="form.ExportResult" multiple>
<el-option v-for="item in CriterionDictionaryList.ExportResult" :key="`ExportResult${item.value}`" <el-option
:value="parseInt(item.Code)" :label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"> v-for="item in CriterionDictionaryList.ExportResult"
:key="`ExportResult${item.value}`"
:value="parseInt(item.Code)"
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 限制编辑 --> <!-- 限制编辑 -->
<el-form-item :label="$t('trials:readingUnit:qsList:title:limitEdit')" v-if="form.Type !== 'summary'" <el-form-item
prop="LimitEdit" :rules="[ :label="$t('trials:readingUnit:qsList:title:limitEdit')"
v-if="form.Type !== 'summary'"
prop="LimitEdit"
:rules="[
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' } { required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
]"> ]"
>
<el-radio-group v-model="form.LimitEdit"> <el-radio-group v-model="form.LimitEdit">
<el-radio v-for="item of $d.LimitEdit" :key="item.value" :label="item.value">{{ item.label }}</el-radio> <el-radio v-for="item of $d.LimitEdit" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 问题标识 --> <!-- 问题标识 -->
<el-form-item v-if="form.Type !== 'group' && form.Type !== 'summary'" <el-form-item
:label="$t('dictionary:template:criterionConfig:table:questionMark')" prop="QuestionMark"> v-if="form.Type !== 'group' && form.Type !== 'summary'"
<el-select v-model="form.QuestionMark" clearable> :label="$t('dictionary:template:criterionConfig:table:questionMark')"
<el-option v-for="item of CriterionDictionaryList.QuestionMark" :key="item.Id" :value="parseInt(item.Code)" prop="QuestionMark"
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" /> >
<el-select
v-model="form.QuestionMark"
clearable
>
<el-option
v-for="item of CriterionDictionaryList.QuestionMark"
:key="item.Id"
:value="parseInt(item.Code)"
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 注释 --> <!-- 注释 -->
<el-form-item :label="$t('trials:readingUnit:qsList:title:Remark')" prop="Remark"> <el-form-item
:label="$t('trials:readingUnit:qsList:title:Remark')"
prop="Remark"
>
<el-input v-model="form.Remark" /> <el-input v-model="form.Remark" />
</el-form-item> </el-form-item>
<!-- 序号 --> <!-- 序号 -->
<el-form-item :label="$t('trials:readingUnit:qsList:title:order')" prop="ShowOrder" :rules="[ <el-form-item
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' } :label="$t('trials:readingUnit:qsList:title:order')"
]"> prop="ShowOrder"
<el-input-number v-model="form.ShowOrder" controls-position="right" :min="0" /> :rules="[
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
]"
>
<el-input-number
v-model="form.ShowOrder"
controls-position="right"
:min="0"
/>
</el-form-item> </el-form-item>
<!-- 重复出现最大次数 --> <!-- 重复出现最大次数 -->
<el-form-item :label="$t('dictionary:template:criterionConfig:table:maxRowCount')" <el-form-item :label="$t('dictionary:template:criterionConfig:table:maxRowCount')" v-if="form.Type !== 'summary' && form.Type !== 'screenshot' && form.Type !== 'upload'">
v-if="form.Type !== 'summary' && form.Type !== 'screenshot' && form.Type !== 'upload'"> <el-input-number
<el-input-number v-model="form.MaxRowCount" controls-position="right" :min="0" :max="10" /> v-model="form.MaxRowCount"
controls-position="right"
:min="0"
:max="10"
/>
</el-form-item> </el-form-item>
<!-- 问题分类 --> <!-- 问题分类 -->
<el-form-item :label="$t('dictionary:template:criterionConfig:table:questionClassify')" <el-form-item :label="$t('dictionary:template:criterionConfig:table:questionClassify')" v-if="criterionType === 2">
v-if="criterionType === 2">
<el-select v-model="form.QuestionClassify" clearable> <el-select v-model="form.QuestionClassify" clearable>
<el-option v-for="item of $d.QuestionClassify" :key="item.id" :label="item.label" :value="item.value" /> <el-option
v-for="item of $d.QuestionClassify"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 私有属性 --> <!-- 私有属性 -->
<el-divider content-position="left">{{ $t('trials:readingUnit:title:privateProperties') }}</el-divider> <el-divider content-position="left">{{$t('trials:readingUnit:title:privateProperties')}}</el-divider>
<!-- 选项类型 --> <!-- 选项类型 -->
<el-form-item v-if="form.Type === 'select' || form.Type === 'radio' || form.Type === 'input'" <el-form-item
:label="$t('trials:readingUnit:label:QuestionGenre')" prop="TableQuestionType" :rules="[ v-if="form.Type === 'select' || form.Type === 'radio' || form.Type === 'input'"
{ required: form.Type !== 'input', message: this.$t('common:ruleMessage:select') } :label="$t('trials:readingUnit:label:QuestionGenre')"
]"> prop="TableQuestionType"
<el-radio-group v-model="form.TableQuestionType" @change="((val) => { tableQuestionTypeChange(val, form) })"> :rules="[
<el-radio v-for="item of $d.TableQuestionType" :key="item.id" :label="item.value" { required: form.Type !== 'input', message: this.$t('common:ruleMessage:select')}
:disabled="(form.Type === 'radio' && (item.value === 1 || item.value === 2)) || (form.Type === 'input' && (item.value === 0 || item.value === 3))"> ]"
>
<el-radio-group
v-model="form.TableQuestionType"
@change="((val)=>{tableQuestionTypeChange(val, form)})"
>
<el-radio
v-for="item of $d.TableQuestionType"
:key="item.id"
:label="item.value"
:disabled="(form.Type === 'radio' && (item.value===1 || item.value===2)) || (form.Type === 'input' && (item.value===0 || item.value===3))"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 选项 --> <!-- 选项 -->
<el-form-item v-if="form.TableQuestionType === 0 || form.Type === 'class'" <el-form-item
:label="$t('trials:qcCfg:table:typeValue')" prop="TypeValue"> v-if="form.TableQuestionType === 0 || form.Type === 'class'"
<el-input v-model="form.TypeValue" :placeholder="$t('trials:qcCfg:message:typeValue')" :label="$t('trials:qcCfg:table:typeValue')"
@change="typeValueChange" /> prop="TypeValue"
>
<el-input
v-model="form.TypeValue"
:placeholder="$t('trials:qcCfg:message:typeValue')"
@change="typeValueChange"
/>
</el-form-item> </el-form-item>
<!-- 关联问题 --> <!-- 关联问题 -->
<el-form-item v-if="form.TableQuestionType === 2" <el-form-item
:label="$t('dictionary:template:criterionConfig:table:dependParentId')" prop="DependParentId"> v-if="form.TableQuestionType === 2"
<el-select v-model="form.DependParentId"> :label="$t('dictionary:template:criterionConfig:table:dependParentId')"
<el-option v-for="item of parentOptions" :key="`DependParentId${item.QuestionId}`" prop="DependParentId"
:label="item.QuestionName" :value="item.QuestionId" /> >
<el-select
v-model="form.DependParentId"
>
<el-option
v-for="item of parentOptions"
:key="`DependParentId${item.QuestionId}`"
:label="item.QuestionName"
:value="item.QuestionId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 关联字段 --> <!-- 关联字段 -->
<el-form-item v-if="form.TableQuestionType === 1 || !!form.DependParentId" <el-form-item
:label="$t('dictionary:template:criterionConfig:table:dataTableColumn')" prop="DataTableColumn"> v-if="form.TableQuestionType === 1 || !!form.DependParentId"
:label="$t('dictionary:template:criterionConfig:table:dataTableColumn')"
prop="DataTableColumn"
>
<el-select v-model="form.DataTableColumn"> <el-select v-model="form.DataTableColumn">
<el-option v-for="item of CriterionDictionaryList.OrganColumn" :key="item.Id" <el-option
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" :value="item.Code" /> v-for="item of CriterionDictionaryList.OrganColumn"
:key="item.Id"
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
:value="item.Code"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 关联字典 --> <!-- 关联字典 -->
<el-form-item v-if="form.TableQuestionType === 3 || form.TableQuestionType === 2" <el-form-item
:label="$t('dictionary:template:criterionConfig:table:relatedDictionaryCode')" prop="DictionaryCode" v-if="form.TableQuestionType === 3 || form.TableQuestionType === 2"
:rules="[{ required: form.TableQuestionType === 3, message: '请选择', trigger: 'blur' }]"> :label="$t('dictionary:template:criterionConfig:table:relatedDictionaryCode')"
prop="DictionaryCode"
:rules="[{ required: form.TableQuestionType === 3, message: '请选择', trigger: 'blur' }]"
>
<el-select v-model="form.DictionaryCode"> <el-select v-model="form.DictionaryCode">
<el-option v-for="item of dicList" :key="item.Id" :label="item.Code" :value="item.Code" /> <el-option
v-for="item of dicList"
:key="item.Id"
:label="item.Code"
:value="item.Code"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 默认值 --> <!-- 默认值 -->
@ -205,23 +354,35 @@
:label="item.label" :label="item.label"
:value="item.value.toString()" :value="item.value.toString()"
/> --> /> -->
<el-option v-for="item of highlightAnswers" :key="item.Id" <el-option
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" :value="item.Code" /> v-for="item of highlightAnswers"
:key="item.Id"
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
:value="item.Code"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 默认值 --> <!-- 默认值 -->
<el-form-item v-if="form.TableQuestionType === 0" :label="$t('trials:readingUnit:qsList:title:defaultValue')"> <el-form-item v-if="form.TableQuestionType === 0" :label="$t('trials:readingUnit:qsList:title:defaultValue')">
<el-select v-model="form.DefaultValue" clearable> <el-select v-model="form.DefaultValue" clearable>
<el-option v-for="item of form.TypeValue ? form.TypeValue.split('|') : []" :key="item" :label="item" <el-option
:value="item" /> v-for="item of form.TypeValue ? form.TypeValue.split('|') : []"
:key="item"
:label="item"
:value="item"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 高亮标记值 --> <!-- 高亮标记值 -->
<el-form-item v-if="form.Type === 'select' || form.Type === 'radio' || form.Type === 'calculation'" <el-form-item v-if="form.Type === 'select' || form.Type === 'radio'" :label="$t('trials:readingUnit:qsList:title:highlightAnswers')" prop="HighlightAnswerList">
:label="$t('trials:readingUnit:qsList:title:highlightAnswers')" prop="HighlightAnswerList">
<el-select v-model="form.HighlightAnswerList" clearable multiple> <el-select v-model="form.HighlightAnswerList" clearable multiple>
<template v-if="form.TypeValue"> <template v-if="form.TypeValue">
<el-option v-for="item of form.TypeValue.split('|')" :key="item" :label="item" :value="item" /> <el-option
v-for="item of form.TypeValue.split('|')"
:key="item"
:label="item"
:value="item"
/>
</template> </template>
<template v-else-if="form.DictionaryCode"> <template v-else-if="form.DictionaryCode">
<!-- <el-option <!-- <el-option
@ -230,16 +391,24 @@
:label="item.label" :label="item.label"
:value="item.value.toString()" :value="item.value.toString()"
/> --> /> -->
<el-option v-for="item of highlightAnswers" :key="item.Id" <el-option
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" :value="item.Code" /> v-for="item of highlightAnswers"
:key="item.Id"
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
:value="item.Code"
/>
</template> </template>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 最大长度 --> <!-- 最大长度 -->
<el-form-item v-if="form.Type === 'input' || form.Type === 'textarea'" <el-form-item
:label="$t('trials:readingUnit:qsList:title:MaxAnswerLength')" prop="MaxAnswerLength" :rules="[ v-if="form.Type === 'input' || form.Type === 'textarea'"
:label="$t('trials:readingUnit:qsList:title:MaxAnswerLength')"
prop="MaxAnswerLength"
:rules="[
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' } { required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }
]"> ]"
>
<el-input-number v-model="form.MaxAnswerLength" :min="0"></el-input-number> <el-input-number v-model="form.MaxAnswerLength" :min="0"></el-input-number>
</el-form-item> </el-form-item>
<!-- 是否复制前值 --> <!-- 是否复制前值 -->
@ -256,82 +425,138 @@
/> />
</el-form-item> --> </el-form-item> -->
<!-- 数值类型 --> <!-- 数值类型 -->
<el-form-item v-if="form.Type === 'number' || form.Type === 'calculation'" <el-form-item
:label="$t('trials:readingUnit:qsList:title:valueType')" prop="ValueType" :rules="[ v-if="form.Type === 'number' || form.Type === 'calculation'"
:label="$t('trials:readingUnit:qsList:title:valueType')"
prop="ValueType"
:rules="[
{ required: true, message: this.$t('common:ruleMessage:select') } { required: true, message: this.$t('common:ruleMessage:select') }
]"> ]"
<el-radio-group v-model="form.ValueType"> >
<el-radio v-for="item of $d.ValueType" :key="item.id" :label="item.value"> <el-radio-group
v-model="form.ValueType"
>
<el-radio
v-for="item of $d.ValueType"
:key="item.id"
:label="item.value"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 单位 --> <!-- 单位 -->
<el-form-item v-if="form.Type === 'number' || form.Type === 'calculation'" <el-form-item
:label="$t('trials:readingUnit:qsList:title:unit')" prop="Unit" :rules="[ v-if="form.Type === 'number' || form.Type === 'calculation'"
:label="$t('trials:readingUnit:qsList:title:unit')"
prop="Unit"
:rules="[
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' } { required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
]"> ]"
<el-radio-group v-model="form.Unit"> >
<el-radio v-for="item of $d.ValueUnit" :key="item.id" :label="item.value"> <el-radio-group
v-model="form.Unit"
>
<el-radio
v-for="item of $d.ValueUnit"
:key="item.id"
:label="item.value"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 图表展示-->
<el-form-item v-if="form.Type === 'number' || form.Type === 'calculation'"
:label="$t('trials:readingUnit:qsList:title:ShowChartTypeEnum')" prop="ShowChartTypeEnum">
<el-radio-group v-model="form.ShowChartTypeEnum">
<el-radio v-for="item of $d.ShowChartType" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<!-- 最大上传个数 --> <!-- 最大上传个数 -->
<el-form-item v-if="form.Type === 'upload'" :label="$t('trials:readingUnit:qsList:title:imageCount')" <el-form-item
prop="ImageCount"> v-if="form.Type === 'upload'"
<el-input-number v-model="form.ImageCount" controls-position="right" :min="0" :max="10" /> :label="$t('trials:readingUnit:qsList:title:imageCount')"
prop="ImageCount"
>
<el-input-number
v-model="form.ImageCount"
controls-position="right"
:min="0"
:max="10"
/>
</el-form-item> </el-form-item>
<!-- 文件类型 --> <!-- 文件类型 -->
<el-form-item v-if="form.Type === 'upload'" :label="$t('trials:readingUnit:qsList:title:FileType')" <el-form-item
v-if="form.Type === 'upload'"
:label="$t('trials:readingUnit:qsList:title:FileType')"
prop="FileType" prop="FileType"
:rules="[{ type: 'array', required: true, message: this.$t('common:ruleMessage:specify'), trigger: ['change'] }]"> :rules="[{ type: 'array', required: true, message: this.$t('common:ruleMessage:specify'), trigger: [ 'change'] }]"
<el-checkbox-group v-model="form.FileType" @change="(v) => { >
if (v && v.includes('-1')) { <el-checkbox-group
form.FileType = ['-1'] v-model="form.FileType"
} @change="(v) => {
}"> if (v && v.includes('-1')) {
<el-checkbox v-for="item of $d.fileType" :key="`fileType${item.value}`" :value="item.value + ''" form.FileType = ['-1']
:label="item.value" :disabled="form.FileType && form.FileType.includes('-1') && item.value !== '-1'"> }
}"
>
<el-checkbox
v-for="item of $d.fileType"
:key="`fileType${item.value}`"
:value="item.value + ''"
:label="item.value"
:disabled="form.FileType && form.FileType.includes('-1') && item.value !== '-1'"
>
{{ item.label }} {{ item.label }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
<!-- 分类 --> <!-- 分类 -->
<!-- 分类数据来源 --> <!-- 分类数据来源 -->
<el-form-item v-if="form.Type === 'class'" <el-form-item
:label="$t('dictionary:template:criterionConfig:table:classifyQuestion')" prop="ClassifyTableQuestionId"> v-if="form.Type === 'class'"
:label="$t('dictionary:template:criterionConfig:table:classifyQuestion')"
prop="ClassifyTableQuestionId"
>
<el-select v-model="form.ClassifyTableQuestionId" clearable> <el-select v-model="form.ClassifyTableQuestionId" clearable>
<el-option v-for="item of Questions" :key="item.Id" :label="item.QuestionName" :value="item.Id" /> <el-option v-for="item of Questions" :key="item.Id" :label="item.QuestionName"
:value="item.Id"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 分类算法 --> <!-- 分类算法 -->
<el-form-item v-if="form.Type === 'class'" <el-form-item
:label="$t('dictionary:template:criterionConfig:table:classifyAlgorithms')" prop="ClassifyAlgorithms"> v-if="form.Type === 'class'"
:label="$t('dictionary:template:criterionConfig:table:classifyAlgorithms')"
prop="ClassifyAlgorithms"
>
<div> <div>
<el-table ref="CalculateTable" :data="ClassifyAlgorithmsList" style="margin: 10px;width: 100%" size="small"> <el-table
ref="CalculateTable"
:data="ClassifyAlgorithmsList"
style="margin: 10px;width: 100%"
size="small"
>
<!-- 运算类型 --> <!-- 运算类型 -->
<el-table-column :label="$t('trials:readingUnit:label:label')" show-overflow-tooltip min-width="70"> <el-table-column
:label="$t('trials:readingUnit:label:label')"
show-overflow-tooltip
min-width="70"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.label }} {{ scope.row.label }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 运算类型 --> <!-- 运算类型 -->
<el-table-column :label="$t('trials:readingUnit:label:gt')" show-overflow-tooltip min-width="128"> <el-table-column
:label="$t('trials:readingUnit:label:gt')"
show-overflow-tooltip
min-width="128"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input-number v-model="scope.row.gt"></el-input-number> <el-input-number v-model="scope.row.gt"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<!-- 运算类型 --> <!-- 运算类型 -->
<el-table-column :label="$t('trials:readingUnit:label:lt')" show-overflow-tooltip min-width="128"> <el-table-column
:label="$t('trials:readingUnit:label:lt')"
show-overflow-tooltip
min-width="128"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input-number v-model="scope.row.lt"></el-input-number> <el-input-number v-model="scope.row.lt"></el-input-number>
</template> </template>
@ -344,7 +569,11 @@
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;"> <div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
<el-form-item> <el-form-item>
<!-- 取消 --> <!-- 取消 -->
<el-button size="small" type="primary" @click="close"> <el-button
size="small"
type="primary"
@click="close"
>
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
@ -437,8 +666,7 @@ export default {
ClassifyAlgorithms: null, ClassifyAlgorithms: null,
// ExportIdentification: 0, // ExportIdentification: 0,
ExportResult: [], ExportResult: [],
DefaultValue: null, DefaultValue:null
ShowChartTypeEnum: 0
// IsEnable: true // IsEnable: true
}, },
rules: { rules: {
@ -449,8 +677,8 @@ export default {
// { max: 300, message: ' 300' }], // { max: 300, message: ' 300' }],
TypeValue: [{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }, TypeValue: [{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' },
{ validator: validateTypeVal, trigger: 'blur' }, { validator: validateTypeVal, trigger: 'blur' },
{ max: 200, message: `${this.$t('common:ruleMessage:maxLength')} 200` }], { max: 200, message: `${this.$t('common:ruleMessage:maxLength')} 200` }],
ShowQuestion: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }], ShowQuestion: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }],
IsRequired: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }], IsRequired: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }],
ParentId: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }], ParentId: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }],
@ -548,7 +776,7 @@ export default {
if (this.data.hasOwnProperty(k)) { if (this.data.hasOwnProperty(k)) {
if (k === 'ClassifyAlgorithms' && this.data[k] !== undefined && this.data[k] !== '') { if (k === 'ClassifyAlgorithms' && this.data[k] !== undefined && this.data[k] !== '') {
this.ClassifyAlgorithmsList = JSON.parse(this.data[k]) this.ClassifyAlgorithmsList = JSON.parse(this.data[k])
} else if (k === 'FileType') { } else if(k === 'FileType'){
this.form[k] = this.data[k].split(',') this.form[k] = this.data[k].split(',')
} else { } else {
this.form[k] = this.data[k] this.form[k] = this.data[k]
@ -564,10 +792,10 @@ export default {
if (this.parentOptions[index].QuestionGenre === 3) { if (this.parentOptions[index].QuestionGenre === 3) {
// this.parentTriggerValOptions = this.$d[this.parentOptions[index].DictionaryCode] // this.parentTriggerValOptions = this.$d[this.parentOptions[index].DictionaryCode]
let dicCode = this.parentOptions[index].DictionaryCode let dicCode = this.parentOptions[index].DictionaryCode
let res = await getCriterionDictionary({ ReadingCriterionId: this.criterionId, DictionaryCode: dicCode }) let res = await getCriterionDictionary({ReadingCriterionId: this.criterionId, DictionaryCode: dicCode})
this.parentTriggerValOptions = res.Result[dicCode].map(i => { this.parentTriggerValOptions = res.Result[dicCode].map(i=>{
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code } return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
}) })
} else { } else {
const options = [] const options = []
@ -586,9 +814,9 @@ export default {
if (this.parentOptions[i].QuestionGenre === 3) { if (this.parentOptions[i].QuestionGenre === 3) {
// this.reParentTriggerValOptions = this.$d[this.parentOptions[i].DictionaryCode] // this.reParentTriggerValOptions = this.$d[this.parentOptions[i].DictionaryCode]
let dicCode = this.parentOptions[i].DictionaryCode let dicCode = this.parentOptions[i].DictionaryCode
let res = await getCriterionDictionary({ ReadingCriterionId: this.criterionId, DictionaryCode: dicCode }) let res = await getCriterionDictionary({ReadingCriterionId: this.criterionId, DictionaryCode: dicCode})
this.reParentTriggerValOptions = res.Result[dicCode].map(i => { this.reParentTriggerValOptions = res.Result[dicCode].map(i=>{
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code } return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
}) })
} else { } else {
const options = [] const options = []
@ -675,12 +903,12 @@ export default {
if (index !== -1) { if (index !== -1) {
if (this.parentOptions[index].QuestionGenre === 3) { if (this.parentOptions[index].QuestionGenre === 3) {
// this.parentTriggerValOptions = this.$d[this.parentOptions[index].DictionaryCode] // this.parentTriggerValOptions = this.$d[this.parentOptions[index].DictionaryCode]
let dicCode = this.parentOptions[index].DictionaryCode let dicCode = this.parentOptions[index].DictionaryCode
let res = await getCriterionDictionary({ ReadingCriterionId: this.criterionId, DictionaryCode: dicCode }) let res = await getCriterionDictionary({ReadingCriterionId: this.criterionId, DictionaryCode: dicCode})
this.parentTriggerValOptions = res.Result[dicCode].map(i => { this.parentTriggerValOptions = res.Result[dicCode].map(i=>{
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code } return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
}) })
} else { } else {
const options = [] const options = []
this.parentOptions[index].TypeValue.split('|').forEach((item, index) => { this.parentOptions[index].TypeValue.split('|').forEach((item, index) => {
@ -701,10 +929,10 @@ export default {
if (this.parentOptions[index].QuestionGenre === 3) { if (this.parentOptions[index].QuestionGenre === 3) {
// this.reParentTriggerValOptions = this.$d[this.parentOptions[index].DictionaryCode] // this.reParentTriggerValOptions = this.$d[this.parentOptions[index].DictionaryCode]
let dicCode = this.parentOptions[index].DictionaryCode let dicCode = this.parentOptions[index].DictionaryCode
let res = await getCriterionDictionary({ ReadingCriterionId: this.criterionId, DictionaryCode: dicCode }) let res = await getCriterionDictionary({ReadingCriterionId: this.criterionId, DictionaryCode: dicCode})
this.reParentTriggerValOptions = res.Result[dicCode].map(i => { this.reParentTriggerValOptions = res.Result[dicCode].map(i=>{
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code } return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
}) })
} else { } else {
const options = [] const options = []
@ -765,7 +993,6 @@ export default {
// form.ExportIdentification = 0 // form.ExportIdentification = 0
form.ExportResult = [] form.ExportResult = []
form.DefaultValue = null form.DefaultValue = null
form.ShowChartTypeEnum = 0
}, },
close() { close() {
this.$emit('close') this.$emit('close')
@ -774,4 +1001,5 @@ export default {
} }
} }
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped>
</style>

View File

@ -6,45 +6,68 @@
<qc-questions v-if="activeTab == 'qc'" /> <qc-questions v-if="activeTab == 'qc'" />
</el-tab-pane> </el-tab-pane>
<!-- 阅片标准配置 --> <!-- 阅片标准配置 -->
<el-tab-pane :label="$t('dictionary:template:tab:criterionsConfig')" name="criterions"> <el-tab-pane
:label="$t('dictionary:template:tab:criterionsConfig')"
name="criterions"
>
<criterions-tmp v-if="activeTab == 'criterions'" /> <criterions-tmp v-if="activeTab == 'criterions'" />
</el-tab-pane> </el-tab-pane>
<!-- 临床数据配置 --> <!-- 临床数据配置 -->
<el-tab-pane :label="$t('dictionary:template:tab:clinicalDataConfig')" name="clinicalData"> <el-tab-pane
:label="$t('dictionary:template:tab:clinicalDataConfig')"
name="clinicalData"
>
<clinical-data v-if="activeTab == 'clinicalData'" /> <clinical-data v-if="activeTab == 'clinicalData'" />
</el-tab-pane> </el-tab-pane>
<!-- 医学审核问题配置 --> <!-- 医学审核问题配置 -->
<el-tab-pane :label="$t('dictionary:template:tab:medicalConfig')" name="medicalAudit"> <el-tab-pane
:label="$t('dictionary:template:tab:medicalConfig')"
name="medicalAudit"
>
<medical-audit v-if="activeTab == 'medicalAudit'" /> <medical-audit v-if="activeTab == 'medicalAudit'" />
</el-tab-pane> </el-tab-pane>
<!-- DICOM字段匿名化配置 --> <!-- DICOM字段匿名化配置 -->
<el-tab-pane :label="$t('dictionary:template:tab:dicomTagConfig')" name="anonymization"> <el-tab-pane
:label="$t('dictionary:template:tab:dicomTagConfig')"
name="anonymization"
>
<Anonymization v-if="activeTab == 'anonymization'" /> <Anonymization v-if="activeTab == 'anonymization'" />
</el-tab-pane> </el-tab-pane>
<!-- DICOM字段新增配置 --> <!-- DICOM字段新增配置 -->
<el-tab-pane :label="$t('dictionary:template:tab:dicomTagAddConfig')" name="increasefields"> <el-tab-pane
:label="$t('dictionary:template:tab:dicomTagAddConfig')"
name="increasefields"
>
<IncreaseFields v-if="activeTab == 'increasefields'" /> <IncreaseFields v-if="activeTab == 'increasefields'" />
</el-tab-pane> </el-tab-pane>
<!-- 邮件管理 --> <!-- 邮件管理 -->
<el-tab-pane :label="$t('dictionary:template:tab:emailConfig')" name="email"> <el-tab-pane
:label="$t('dictionary:template:tab:emailConfig')"
name="email"
>
<Email v-if="activeTab == 'email'" /> <Email v-if="activeTab == 'email'" />
</el-tab-pane> </el-tab-pane>
<!-- 签名管理 --> <!-- 签名管理 -->
<el-tab-pane :label="$t('dictionary:template:tab:signConfig')" name="sign"> <el-tab-pane
:label="$t('dictionary:template:tab:signConfig')"
name="sign"
>
<Sign v-if="activeTab == 'sign'" /> <Sign v-if="activeTab == 'sign'" />
</el-tab-pane> </el-tab-pane>
<!-- 浏览器推荐 --> <!-- 浏览器推荐 -->
<el-tab-pane :label="$t('dictionary:template:tab:browserConfig')" name="browser"> <el-tab-pane
:label="$t('dictionary:template:tab:browserConfig')"
name="browser"
>
<Browser v-if="activeTab == 'browser'" /> <Browser v-if="activeTab == 'browser'" />
</el-tab-pane> </el-tab-pane>
<!-- 文件记录 --> <!-- 文件记录 -->
<el-tab-pane :label="$t('dictionary:template:tab:fileConfig')" name="file"> <el-tab-pane
:label="$t('dictionary:template:tab:fileConfig')"
name="file"
>
<File v-if="activeTab == 'file'" /> <File v-if="activeTab == 'file'" />
</el-tab-pane> </el-tab-pane>
<!-- 用户协议 -->
<el-tab-pane :label="$t('dictionary:template:tab:agreement')" name="agreement">
<Agreement v-if="activeTab == 'agreement'" />
</el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
</template> </template>
@ -59,7 +82,6 @@ import Email from './email/index.vue'
import Sign from './sign/index.vue' import Sign from './sign/index.vue'
import Browser from './browser/index.vue' import Browser from './browser/index.vue'
import File from './file/index.vue' import File from './file/index.vue'
import Agreement from './agreement/index.vue'
export default { export default {
name: 'Questions', name: 'Questions',
components: { components: {
@ -73,7 +95,6 @@ export default {
MedicalAudit, MedicalAudit,
Browser, Browser,
File, File,
Agreement
}, },
data() { data() {
return { return {
@ -101,18 +122,16 @@ export default {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
.el-tabs__header { .el-tabs__header {
height: 40px; height: 40px;
margin-bottom: 5px; margin-bottom: 5px;
} }
.el-tabs__content { .el-tabs__content {
flex: 1; flex: 1;
.el-tab-pane { .el-tab-pane {
height: 100%; height: 100%;
} }
} }
} }
</style> </style>

View File

@ -21,19 +21,13 @@
<el-form-item :label="$t('trials:researchForm:form:verifyCode')" required> <el-form-item :label="$t('trials:researchForm:form:verifyCode')" required>
<el-col :span="18"> <el-col :span="18">
<el-form-item prop="VerificationCode"> <el-form-item prop="VerificationCode">
<div style="display: flex;justify-content: space-between;"> <el-input v-model="form.VerificationCode" autocomplete="off" />
<el-input v-model="form.VerificationCode" autocomplete="off" />
<el-button size="small" class="codeBtn" :disabled="sendDisabled" @click="handleSendCode"
style="width: 30%;margin-left: 10px;">
{{ sendTitle }}
</el-button>
</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="6" style="text-align: right"> <el-col :span="6" style="text-align: right">
<el-button size="small" type="primary" style="width: 80%" :disabled="sendDisabled"
</el-col> --> @click="handleSendCode">{{ sendTitle }}</el-button>
</el-col>
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- 校验 --> <!-- 校验 -->
@ -387,21 +381,6 @@ export default {
/*::v-deep .is-error{*/ /*::v-deep .is-error{*/
/* margin-bottom: 40px;*/ /* margin-bottom: 40px;*/
/*}*/ /*}*/
.codeBtn {
color: #409EFF;
border-color: #409EFF;
}
.codeBtn.is-disabled,
.codeBtn.is-disabled:focus,
.codeBtn.is-disabled:hover {
color: #c0c4cc;
cursor: not-allowed;
background-image: none;
background-color: #fff;
border-color: #ebeef5;
}
.is-error.my_new_pwd { .is-error.my_new_pwd {
margin-bottom: 45px; margin-bottom: 45px;
} }

View File

@ -6,9 +6,7 @@
<div class="login-body"> <div class="login-body">
<div class="login-l"> <div class="login-l">
<div class="login-logo"> <div class="login-logo">
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" /> <img src="@/assets/zzlogo-usa.png" alt="" class="usa-logo" />
<img v-else-if="NODE_ENV === 'usa'" src="@/assets/zzlogo-usa.png" alt="" class="usa-logo" />
<img v-else src="@/assets/zzlogo4.png" alt="" />
</div> </div>
<div :class="{ <div :class="{
'login-image': true, 'login-image': true,
@ -77,22 +75,13 @@
</span> --> </span> -->
</el-form-item> </el-form-item>
<!-- Login --> <!-- Login -->
<el-button :loading="loading" type="primary" :disabled="!checked" style=" <el-button :loading="loading" type="primary" style="
width: 100%; width: 100%;
margin-bottom: 10px; margin-bottom: 10px;
background-color: rgb(0, 147, 221); background-color: rgb(0, 147, 221);
" size="medium" @click.native.prevent="handleLogin"> " size="medium" @click.native.prevent="handleLogin">
{{ $t('login:button:login') }} {{ $t('login:button:login') }}
</el-button> </el-button>
<div class="PrivacyPolicy" style="font-size: 14px;">
<el-checkbox v-model="checked" style="margin-right: 5px;" />
<span>{{ $t('login:message:PrivacyPolicy') }}</span>
<span style="cursor: pointer;color:#428bca" @click="viewAgreement(0)">{{ $t('login:message:UserAgreement')
}}</span>
<span>{{ $t('login:message:and') }}</span>
<span style="cursor: pointer;color:#428bca" @click="viewAgreement(1)">{{
$t('login:message:PrivacyPolicyName') }}</span>
</div>
<div style="text-align: right"> <div style="text-align: right">
<TopLang v-if=" <TopLang v-if="
VUE_APP_OSS_CONFIG_REGION !== 'oss-us-west-1' && VUE_APP_OSS_CONFIG_REGION !== 'oss-us-west-1' &&
@ -190,9 +179,6 @@ import Vcode from 'vue-puzzle-vcode'
import browserTip from '@/views/dictionary/template/browser/tip.vue' import browserTip from '@/views/dictionary/template/browser/tip.vue'
import Img1 from '@/assets/pic-2.png' import Img1 from '@/assets/pic-2.png'
import toggleRole from '@/components/toggleRole' import toggleRole from '@/components/toggleRole'
import {
getCurrentVersionUserAgreements,
} from '@/api/dictionary'
export default { export default {
name: 'Login', name: 'Login',
components: { TopLang, Vcode, browserTip, toggleRole }, components: { TopLang, Vcode, browserTip, toggleRole },
@ -240,8 +226,6 @@ export default {
Img1, Img1,
toggleRoleVisible: false, toggleRoleVisible: false,
toggleRoleLoading: false, toggleRoleLoading: false,
Agreement: [],
checked: true
} }
}, },
computed: { computed: {
@ -270,6 +254,7 @@ export default {
zzSessionStorage.setItem('loginType', this.loginType) zzSessionStorage.setItem('loginType', this.loginType)
localStorage.setItem('location', this.location) localStorage.setItem('location', this.location)
// zh-CN navigator.language // zh-CN navigator.language
console.log(navigator.language, 'navigator.language')
if (navigator.language !== 'zh-CN' && navigator.language !== 'zh-TW') { if (navigator.language !== 'zh-CN' && navigator.language !== 'zh-TW') {
this.$i18n.locale = 'en' this.$i18n.locale = 'en'
this.setLanguage('en') this.setLanguage('en')
@ -291,30 +276,9 @@ export default {
} }
} }
this.$refs.browserTip.open() this.$refs.browserTip.open()
this.getAgreementList()
}, },
methods: { methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }), ...mapMutations({ setLanguage: 'lang/setLanguage' }),
viewAgreement(type) {
let find = this.Agreement.find(item => item.IsCurrentVersion && item.UserAgreementTypeEnum === type)
if (!find) return this.$confirm(this.$t('login:message:noAgreement').replace('xxx', this.$fd('UserAgreementType', type)))
this.$AGR({
Id: find.Id,
IsEn_Us: this.$i18n.locale !== 'zh'
})
},
getAgreementList() {
getCurrentVersionUserAgreements({
PageIndex: 1,
PageSize: 20,
IsCurrentVersion: true
})
.then((res) => {
this.Agreement = res.Result
})
.catch(() => {
})
},
openAbout() { openAbout() {
this.aboutVisible = true this.aboutVisible = true
}, },

View File

@ -18,10 +18,19 @@
</el-form-item> </el-form-item>
<!-- 中心名称 --> <!-- 中心名称 -->
<el-form-item :label="$t('trials:researchForm:form:siteName')" prop="TrialSiteId"> <el-form-item :label="$t('trials:researchForm:form:siteName')" prop="TrialSiteId">
<el-select v-model="form.TrialSiteId" filterable style="width:100%;" <el-select
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" @change="handleSiteChange"> v-model="form.TrialSiteId"
<el-option v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteAliasName" filterable
:value="item.TrialSiteId" /> style="width:100%;"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory"
@change="handleSiteChange"
>
<el-option
v-for="(item,index) of siteOptions"
:key="index"
:label="item.TrialSiteAliasName"
:value="item.TrialSiteId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 中心编号 --> <!-- 中心编号 -->
@ -33,7 +42,10 @@
<el-input v-model="form.UserName" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" /> <el-input v-model="form.UserName" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
</el-form-item> </el-form-item>
<!-- 联系电话 --> <!-- 联系电话 -->
<el-form-item :label="$t('trials:researchForm:form:contactorPhone')" prop="Phone"> <el-form-item
:label="$t('trials:researchForm:form:contactorPhone')"
prop="Phone"
>
<el-input v-model="form.Phone" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" /> <el-input v-model="form.Phone" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
</el-form-item> </el-form-item>
<!-- 联系邮箱 --> <!-- 联系邮箱 -->
@ -43,71 +55,75 @@
<!-- <el-divider /> --> <!-- <el-divider /> -->
<!-- 平均刻盘周期 --> <!-- 平均刻盘周期 -->
<el-form-item v-if="!notShowFieldList.includes('AverageEngravingCycle')" <el-form-item v-if="!notShowFieldList.includes('AverageEngravingCycle')" :label="$t('trials:researchForm:form:engravingCycle')">
:label="$t('trials:researchForm:form:engravingCycle')"> <el-input-number v-model="form.AverageEngravingCycle" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" controls-position="right" :min="0" />
<el-input-number v-model="form.AverageEngravingCycle"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" controls-position="right" :min="0" />
</el-form-item> </el-form-item>
<!-- 请确认参与本项目影像采集的影像技师具备对应的资质技师证对应设备的大型设备上岗证 --> <!-- 请确认参与本项目影像采集的影像技师具备对应的资质技师证对应设备的大型设备上岗证 -->
<el-form-item v-if="!notShowFieldList.includes('IsConfirmImagingTechnologist')" <el-form-item v-if="!notShowFieldList.includes('IsConfirmImagingTechnologist')" :label="$t('trials:researchForm:form:isQualified')">
:label="$t('trials:researchForm:form:isQualified')"> <el-radio-group v-model="form.IsConfirmImagingTechnologist" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
<el-radio-group v-model="form.IsConfirmImagingTechnologist" <el-radio
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory"> v-for="item of $d.YesOrNo"
<el-radio v-for="item of $d.YesOrNo" :key="`IsConfirmImagingTechnologist${item.value}`" :label="item.value">{{ :key="`IsConfirmImagingTechnologist${item.value}`"
item.label }}</el-radio> :label="item.value"
>{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 原因 --> <!-- 原因 -->
<el-form-item v-if="!notShowFieldList.includes('NotConfirmReson') && form.IsConfirmImagingTechnologist === false" <el-form-item
:label="$t('trials:researchForm:form:notQualifiedReason')"> v-if="!notShowFieldList.includes('NotConfirmReson') && form.IsConfirmImagingTechnologist === false"
<el-input v-model="form.NotConfirmReson" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" :label="$t('trials:researchForm:form:notQualifiedReason')"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" /> >
<el-input
v-model="form.NotConfirmReson"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory"
/>
</el-form-item> </el-form-item>
<!-- 研究单位疗效评估人员类型 --> <!-- 研究单位疗效评估人员类型 -->
<el-form-item v-if="!notShowFieldList.includes('EfficacyEvaluatorType')" <el-form-item v-if="!notShowFieldList.includes('EfficacyEvaluatorType')" :label="$t('trials:researchForm:form:staffType')">
:label="$t('trials:researchForm:form:staffType')"> <el-radio-group v-model="form.EfficacyEvaluatorType" :disabled="!(state === 0 && userTypeEnumInt === 0)|| isHistory">
<el-radio-group v-model="form.EfficacyEvaluatorType" <el-radio v-for="item of $d.EfficacyEvaluatorType" :key="`EfficacyEvaluatorType${item.value}`" :label="item.value">{{ item.label }}</el-radio>
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
<el-radio v-for="item of $d.EfficacyEvaluatorType" :key="`EfficacyEvaluatorType${item.value}`"
:label="item.value">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 是否严格按照研究单位影像手册参数完成图像采集 --> <!-- 是否严格按照研究单位影像手册参数完成图像采集 -->
<el-form-item v-if="!notShowFieldList.includes('IsFollowStudyParameters')"> <el-form-item v-if="!notShowFieldList.includes('IsFollowStudyParameters')">
<span slot="label" v-html="$t('trials:researchForm:form:isFollowStudyParam')" /> <span slot="label" v-html="$t('trials:researchForm:form:isFollowStudyParam')" />
<el-radio-group v-model="form.IsFollowStudyParameters" <el-radio-group v-model="form.IsFollowStudyParameters" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" style="margin-right: 10px;"> <el-radio v-for="item of $d.YesOrNo" :key="`IsFollowStudyParameters${item.value}`" :label="item.value">{{ item.label }}</el-radio>
<el-radio v-for="item of $d.YesOrNo" :key="`IsFollowStudyParameters${item.value}`" :label="item.value">{{
item.label }}</el-radio>
</el-radio-group> </el-radio-group>
<el-button type="primary" size="small" @click="viewManual">
{{ $t('trials:researchForm:button:viewManual') }}
</el-button>
</el-form-item> </el-form-item>
<!-- 不能严格按照研究单位影像手册参数采集图像原因 --> <!-- 不能严格按照研究单位影像手册参数采集图像原因 -->
<el-form-item v-if="!notShowFieldList.includes('NotFollowReson') && !form.IsFollowStudyParameters"> <el-form-item
v-if="!notShowFieldList.includes('NotFollowReson') && !form.IsFollowStudyParameters"
>
<span slot="label" v-html="$t('trials:researchForm:form:notFollowStudyParam')" /> <span slot="label" v-html="$t('trials:researchForm:form:notFollowStudyParam')" />
<el-input v-model="form.NotFollowReson" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" <el-input
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" /> v-model="form.NotFollowReson"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<!-- 保存 --> <!-- 保存 -->
<el-button v-if="state === 0 && userTypeEnumInt === 0 && !isHistory" type="primary" :loading="btnLoading" <el-button
size="small" @click="handleSave(false)"> v-if="state === 0 && userTypeEnumInt === 0 && !isHistory"
type="primary"
:loading="btnLoading"
size="small"
@click="handleSave(false)"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
<attachmentPreview :visible.sync="perview_visible" :isView="true" :isExternal="true" :ExternalList="ExternalList"
v-if="perview_visible" />
</el-form> </el-form>
</template> </template>
<script> <script>
import { getTrialSiteSelect, getTrialDocumentList } from '@/api/trials' import { getTrialSiteSelect } from '@/api/trials'
import { addOrUpdateTrialSiteSurvey } from '@/api/research' import { addOrUpdateTrialSiteSurvey } from '@/api/research'
import attachmentPreview from '@/views/dictionary/attachment/components/SignatureTemplate/attachmentPreview'
export default { export default {
name: 'QuestionForm', name: 'QuestionForm',
components: { attachmentPreview },
props: { props: {
isHistory: { isHistory: {
type: Boolean, type: Boolean,
@ -181,41 +197,10 @@ export default {
state: null, state: null,
userTypeEnumInt: zzSessionStorage.getItem('userTypeEnumInt') * 1, userTypeEnumInt: zzSessionStorage.getItem('userTypeEnumInt') * 1,
isShow: false, isShow: false,
notShowFieldList: [], notShowFieldList: []
perview_visible: false,
ExternalList: []
} }
}, },
methods: { methods: {
async viewManual() {
try {
let data = {
PageIndex: 1,
PageSize: 20,
TrialId: this.$route.query.trialId,
IsPublish: true,
FileTypeCode: 4,
IsDeleted: false
}
let res = await getTrialDocumentList(data)
if (res.IsSuccess) {
const { CurrentPageData } = res.Result
if (CurrentPageData.length <= 0) return this.$message.warning(this.$t("trials:researchRecord:ImageManual:message:noImageManual"))
this.ExternalList = []
CurrentPageData.forEach(item => {
let obj = {
FilePath: item.Path,
FileFormat: 'pdf',
Name: item.Name
}
this.ExternalList.push(obj)
});
this.perview_visible = true
}
} catch (err) {
console.log(err)
}
},
// //
handleSave(isAutoCommit) { handleSave(isAutoCommit) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {

View File

@ -21,15 +21,14 @@
<!-- <h4>{{ $t('trials:staffResearch:title:staff') }}</h4>--> <!-- <h4>{{ $t('trials:staffResearch:title:staff') }}</h4>-->
<!-- 历史人员 --> <!-- 历史人员 -->
<h4>{{ $t('trials:staffResearch:title:historicalStaff') }}</h4> <h4>{{ $t('trials:staffResearch:title:historicalStaff') }}</h4>
<HistoricalParticipant ref="historicalParticipant" :is-history="true" @refreshPage="refreshPage" <HistoricalParticipant ref="historicalParticipant" :is-history="true" @refreshPage="refreshPage" @getList="initPage" />
@getList="initPage" />
<!-- 新增人员 --> <!-- 新增人员 -->
<h4>{{ $t('trials:staffResearch:title:newStaff') }}</h4> <h4>{{ $t('trials:staffResearch:title:newStaff') }}</h4>
<ParticipantList ref="researchParticipants" :is-history="true" @refreshPage="refreshPage" @getList="initPage" /> <ParticipantList ref="researchParticipants" :is-history="true" @refreshPage="refreshPage" @getList="initPage" />
</el-card> </el-card>
<!-- 设备调研 --> <!-- 设备调研 -->
<el-card shadow="hover" class="mt10" v-if="siteSurveyNoteInfo.IsCloseEquipmentSurvey"> <el-card shadow="hover" class="mt10">
<h4>{{ $t('trials:equiptResearch:title:equiptResearch') }}</h4> <h4>{{ $t('trials:equiptResearch:title:equiptResearch') }}</h4>
<EquipmentList ref="researchEquipments" :is-history="true" /> <EquipmentList ref="researchEquipments" :is-history="true" />
</el-card> </el-card>
@ -54,17 +53,31 @@
</el-card> </el-card>
</div> </div>
<el-dialog v-if="rejectVisible" :visible.sync="rejectVisible" :close-on-click-modal="false" <el-dialog
:title="$t('trials:researchForm:dialogTitle:reject')" width="600px" custom-class="base-dialog-wrapper" v-if="rejectVisible"
:append-to-body="userTypeEnumInt !== 0"> :visible.sync="rejectVisible"
:close-on-click-modal="false"
:title="$t('trials:researchForm:dialogTitle:reject')"
width="600px"
custom-class="base-dialog-wrapper"
:append-to-body="userTypeEnumInt !== 0"
>
<el-form ref="rejectForm" :model="rejectForm" label-width="100px"> <el-form ref="rejectForm" :model="rejectForm" label-width="100px">
<div class="base-dialog-body"> <div class="base-dialog-body">
<!-- 驳回原因 --> <!-- 驳回原因 -->
<el-form-item :label="$t('trials:researchForm:form:rejectReson')" prop="reason" :rules="[ <el-form-item
{ required: true, message: $t('trials:researchForm:formRule:specify') } :label="$t('trials:researchForm:form:rejectReson')"
]"> prop="reason"
<el-input v-model="rejectForm.reason" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" :rules="[
style="width:100%;" /> { required: true, message: $t('trials:researchForm:formRule:specify')}
]"
>
<el-input
v-model="rejectForm.reason"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
style="width:100%;"
/>
</el-form-item> </el-form-item>
</div> </div>
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;"> <div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
@ -123,7 +136,7 @@ export default {
props: { props: {
trialSiteSurveyId: { trialSiteSurveyId: {
type: String, type: String,
default: '' required: true
} }
}, },
data() { data() {
@ -139,7 +152,7 @@ export default {
btnLoading: false, btnLoading: false,
isFullscreen: false, isFullscreen: false,
historyVisible: false, historyVisible: false,
siteSurveyNoteInfo: {} siteSurveyNoteInfo: null
} }
}, },
mounted() { mounted() {
@ -159,7 +172,6 @@ export default {
if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) { if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) {
this.siteSurveyNoteInfo = res.Result.SiteSurveyFiledConfig.ModifyFiledList.find(i => i.NeedModifyFiled === 'SiteSurveyNote') this.siteSurveyNoteInfo = res.Result.SiteSurveyFiledConfig.ModifyFiledList.find(i => i.NeedModifyFiled === 'SiteSurveyNote')
} }
this.siteSurveyNoteInfo.IsCloseEquipmentSurvey = res.Result.SiteSurveyFiledConfig.IsCloseEquipmentSurvey
var historicalArr = [] var historicalArr = []
var newArr = [] var newArr = []
res.Result.TrialSiteUserSurveyList.map(i => { res.Result.TrialSiteUserSurveyList.map(i => {
@ -229,7 +241,7 @@ export default {
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$message.success(this.$t('common:message:savedSuccessfully'))
} }
}).catch(() => { this.loading = false }) }).catch(() => { this.loading = false })
}).catch(() => { }) }).catch(() => {})
}, },
// //
generateAccount() { generateAccount() {
@ -264,7 +276,7 @@ export default {
}).catch(() => { }).catch(() => {
this.loading = false this.loading = false
}) })
}).catch(() => { }) }).catch(() => {})
}, },
// //
handleReject() { handleReject() {
@ -312,44 +324,37 @@ export default {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
.mt10{
.mt10 {
margin-top: 10px; margin-top: 10px;
} }
.header-wrapper{
.header-wrapper {
width: 70%; width: 70%;
margin: 20px auto; margin: 20px auto;
} }
.center-wrapper{
.center-wrapper {
flex: 1; flex: 1;
width: 70%; width: 70%;
margin: 0px auto; margin: 0px auto;
padding-bottom: 20px; padding-bottom: 20px;
overflow-y: auto; overflow-y: auto;
} }
::v-deep .el-card__body{
::v-deep .el-card__body {
padding: 10px; padding: 10px;
} }
// >>>.el-dialog__body{ // >>>.el-dialog__body{
// padding: 10px 20px 20px 20px; // padding: 10px 20px 20px 20px;
// } // }
::v-deep .full-dialog-container { ::v-deep .full-dialog-container{
.el-dialog__body { .el-dialog__body{
height: calc(100% - 80px); height: calc(100% - 80px);
} }
} }
::v-deep .dialog-container{
::v-deep .dialog-container {
// margin-top: 50px !important; // margin-top: 50px !important;
width: 75%; width:75%;
height: 80%; height:80%;
.el-dialog__body{
.el-dialog__body {
padding: 10px; padding: 10px;
height: calc(100% - 80px); height: calc(100% - 80px);
} }

View File

@ -6,37 +6,61 @@
{{ $t('trials:researchForm:title:question') }} {{ $t('trials:researchForm:title:question') }}
</h2> </h2>
<!-- <TopLang style="position: fixed;top: 40px;right: 40px" /> --> <!-- <TopLang style="position: fixed;top: 40px;right: 40px" /> -->
<div style="display: flex;justify-content: space-between;" v-if="!isPreview"> <div style="display: flex;justify-content: space-between;">
<div>{{ $t('trials:researchForm:title:researchSurveyStatus') }} <el-tag>{{ $fd('ResearchRecord', state) <div>{{ $t('trials:researchForm:title:researchSurveyStatus') }} <el-tag>{{ $fd('ResearchRecord', state) }}</el-tag></div>
}}</el-tag></div>
<div> <div>
<!-- 提交 --> <!-- 提交 -->
<el-button v-if="(state === 0 && userTypeEnumInt === 0)" type="primary" size="small" <el-button
@click="handleSubmit('submit')"> v-if="(state === 0 && userTypeEnumInt === 0)"
type="primary"
size="small"
@click="handleSubmit('submit')"
>
{{ $t('trials:researchForm:button:submit') }} {{ $t('trials:researchForm:button:submit') }}
</el-button> </el-button>
<!-- 审核通过 --> <!-- 审核通过 -->
<el-button v-if="(state === 1 && hasPermi(['role:spm', 'role:cpm']))" type="primary" size="small" <el-button
@click="handleSubmit('approve')"> v-if="(state === 1 && hasPermi(['role:spm','role:cpm']))"
type="primary"
size="small"
@click="handleSubmit('approve')"
>
{{ $t('trials:researchForm:button:auditPasses') }} {{ $t('trials:researchForm:button:auditPasses') }}
</el-button> </el-button>
<!-- 审核通过 --> <!-- 审核通过 -->
<el-button v-if="(state === 2 && hasPermi(['role:pm', 'role:apm']))" type="primary" size="small" <el-button
@click="generateAccount"> v-if="(state === 2 && hasPermi(['role:pm','role:apm']))"
type="primary"
size="small"
@click="generateAccount"
>
{{ $t('trials:researchForm:button:auditPasses') }} {{ $t('trials:researchForm:button:auditPasses') }}
</el-button> </el-button>
<!-- 驳回 --> <!-- 驳回 -->
<el-button <el-button
v-if="((state === 1 && hasPermi(['role:spm', 'role:cpm'])) || (state === 2 && hasPermi(['role:pm', 'role:apm'])))" v-if="((state === 1 && hasPermi(['role:spm','role:cpm'])) || (state === 2 && hasPermi(['role:pm','role:apm'])))"
type="primary" size="small" @click="handleReject"> type="primary"
size="small"
@click="handleReject"
>
{{ $t('trials:researchForm:button:auditRejected') }} {{ $t('trials:researchForm:button:auditRejected') }}
</el-button> </el-button>
<!-- 历史记录 --> <!-- 历史记录 -->
<el-button v-if="userTypeEnumInt === 0" type="primary" size="small" @click="handleHistory"> <el-button
v-if="userTypeEnumInt === 0"
type="primary"
size="small"
@click="handleHistory"
>
{{ $t('trials:researchForm:button:historicalRecord') }} {{ $t('trials:researchForm:button:historicalRecord') }}
</el-button> </el-button>
<!-- 退出 --> <!-- 退出 -->
<el-button v-if="userTypeEnumInt === 0" type="primary" size="small" @click="handleBack"> <el-button
v-if="userTypeEnumInt === 0"
type="primary"
size="small"
@click="handleBack"
>
{{ $t('trials:researchForm:button:loginOut') }} {{ $t('trials:researchForm:button:loginOut') }}
</el-button> </el-button>
</div> </div>
@ -45,26 +69,24 @@
<div class="center-wrapper"> <div class="center-wrapper">
<!-- 基本信息 --> <!-- 基本信息 -->
<el-card shadow="hover"> <el-card shadow="hover">
<BaseInfo ref="baseResearchInfo" :isPreview="isPreview" /> <BaseInfo ref="baseResearchInfo" />
</el-card> </el-card>
<!-- 人员调查 --> <!-- 人员调查 -->
<el-card shadow="hover" class="mt10"> <el-card shadow="hover" class="mt10">
<!-- 历史人员 --> <!-- 历史人员 -->
<h4>{{ $t('trials:staffResearch:title:historicalStaff') }}</h4> <h4>{{ $t('trials:staffResearch:title:historicalStaff') }}</h4>
<HistoricalParticipant ref="historicalParticipant" :isPreview="isPreview" @refreshPage="refreshPage" <HistoricalParticipant ref="historicalParticipant" @refreshPage="refreshPage" @getList="initPage" />
@getList="initPage" />
<!-- <h4>{{ $t('trials:staffResearch:title:staff') }}</h4> --> <!-- <h4>{{ $t('trials:staffResearch:title:staff') }}</h4> -->
<!-- 新增人员 --> <!-- 新增人员 -->
<h4>{{ $t('trials:staffResearch:title:newStaff') }}</h4> <h4>{{ $t('trials:staffResearch:title:newStaff') }}</h4>
<ParticipantList ref="researchParticipants" :isPreview="isPreview" @refreshPage="refreshPage" <ParticipantList ref="researchParticipants" @refreshPage="refreshPage" @getList="initPage" />
@getList="initPage" />
</el-card> </el-card>
<!-- 设备调研 --> <!-- 设备调研 -->
<el-card shadow="hover" class="mt10" v-if="siteSurveyNoteInfo.IsCloseEquipmentSurvey"> <el-card shadow="hover" class="mt10">
<h4>{{ $t('trials:equiptResearch:title:equiptResearch') }}</h4> <h4>{{ $t('trials:equiptResearch:title:equiptResearch') }}</h4>
<EquipmentList ref="researchEquipments" :isPreview="isPreview" /> <EquipmentList ref="researchEquipments" />
</el-card> </el-card>
<!-- 其他信息调研 --> <!-- 其他信息调研 -->
@ -88,17 +110,31 @@
</el-card> </el-card>
</div> </div>
<el-dialog v-if="rejectVisible" :visible.sync="rejectVisible" :close-on-click-modal="false" <el-dialog
:title="$t('trials:researchForm:dialogTitle:reject')" width="600px" custom-class="base-dialog-wrapper" v-if="rejectVisible"
append-to-body> :visible.sync="rejectVisible"
:close-on-click-modal="false"
:title="$t('trials:researchForm:dialogTitle:reject')"
width="600px"
custom-class="base-dialog-wrapper"
append-to-body
>
<el-form ref="rejectForm" :model="rejectForm" label-width="100px"> <el-form ref="rejectForm" :model="rejectForm" label-width="100px">
<div class="base-dialog-body"> <div class="base-dialog-body">
<!-- 驳回原因 --> <!-- 驳回原因 -->
<el-form-item :label="$t('trials:researchForm:form:rejectReson')" prop="reason" :rules="[ <el-form-item
{ required: true, message: $t('trials:researchForm:formRule:specify') } :label="$t('trials:researchForm:form:rejectReson')"
]"> prop="reason"
<el-input v-model="rejectForm.reason" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" :rules="[
style="width:100%;" /> { required: true, message: $t('trials:researchForm:formRule:specify')}
]"
>
<el-input
v-model="rejectForm.reason"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
style="width:100%;"
/>
</el-form-item> </el-form-item>
</div> </div>
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;"> <div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
@ -116,24 +152,30 @@
</el-form> </el-form>
</el-dialog> </el-dialog>
<el-dialog :visible.sync="historyVisible" <el-dialog
:custom-class="isFullscreen ? 'full-dialog-container' : 'dialog-container'" :close-on-click-modal="false" :visible.sync="historyVisible"
:fullscreen="isFullscreen" :show-close="false"> :custom-class="isFullscreen?'full-dialog-container':'dialog-container'"
:close-on-click-modal="false"
:fullscreen="isFullscreen"
:show-close="false"
>
<span slot="title" class="dialog-footer"> <span slot="title" class="dialog-footer">
<div style="display: flex;flex-direction: row;justify-content: space-between;"> <div style="display: flex;flex-direction: row;justify-content: space-between;">
<div> <div>
{{ $t('trials:researchForm:button:historicalRecord') }} {{ $t('trials:researchForm:button:historicalRecord') }}
</div> </div>
<div> <div>
<svg-icon :icon-class="isFullscreen ? 'exit-fullscreen' : 'fullscreen'" <svg-icon :icon-class="isFullscreen?'exit-fullscreen':'fullscreen'" style="vertical-align: baseline;cursor: pointer;font-size: 20px;" @click="isFullscreen=!isFullscreen" />
style="vertical-align: baseline;cursor: pointer;font-size: 20px;" @click="isFullscreen = !isFullscreen" /> <svg-icon icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;" @click="historyVisible = false" />
<svg-icon icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;"
@click="historyVisible = false" />
</div> </div>
</div> </div>
</span> </span>
<div style="height:100%;margin:0;"> <div style="height:100%;margin:0;">
<HistoricalRecord :trial-id="trialId" :site-id="siteId" :trial-site-survey-id="trialSiteSurveyId" /> <HistoricalRecord
:trial-id="trialId"
:site-id="siteId"
:trial-site-survey-id="trialSiteSurveyId"
/>
</div> </div>
</el-dialog> </el-dialog>
@ -152,12 +194,6 @@ import HistoricalRecord from './components/HistoricalRecord'
export default { export default {
name: 'QuestionForm', name: 'QuestionForm',
components: { BaseInfo, HistoricalParticipant, ParticipantList, EquipmentList, TopLang, HistoricalRecord }, components: { BaseInfo, HistoricalParticipant, ParticipantList, EquipmentList, TopLang, HistoricalRecord },
props: {
isPreview: {
type: Boolean,
default: false
}
},
data() { data() {
return { return {
trialId: this.$route.query.trialId, trialId: this.$route.query.trialId,
@ -172,7 +208,7 @@ export default {
btnLoading: false, btnLoading: false,
isFullscreen: false, isFullscreen: false,
historyVisible: false, historyVisible: false,
siteSurveyNoteInfo: {} siteSurveyNoteInfo: null
} }
}, },
mounted() { mounted() {
@ -193,7 +229,6 @@ export default {
if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) { if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) {
this.siteSurveyNoteInfo = res.Result.SiteSurveyFiledConfig.ModifyFiledList.find(i => i.NeedModifyFiled === 'SiteSurveyNote') this.siteSurveyNoteInfo = res.Result.SiteSurveyFiledConfig.ModifyFiledList.find(i => i.NeedModifyFiled === 'SiteSurveyNote')
} }
this.siteSurveyNoteInfo.IsCloseEquipmentSurvey = res.Result.SiteSurveyFiledConfig.IsCloseEquipmentSurvey
this.state = res.Result.TrialSiteSurvey.State this.state = res.Result.TrialSiteSurvey.State
this.siteId = res.Result.TrialSiteSurvey.TrialSiteId this.siteId = res.Result.TrialSiteSurvey.TrialSiteId
this.$refs['baseResearchInfo'].initForm(res.Result.TrialInfo, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig ? res.Result.SiteSurveyFiledConfig.NotShowFieldList : null) this.$refs['baseResearchInfo'].initForm(res.Result.TrialInfo, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig ? res.Result.SiteSurveyFiledConfig.NotShowFieldList : null)
@ -255,7 +290,7 @@ export default {
} }
} }
}).catch(() => { this.loading = false }) }).catch(() => { this.loading = false })
}).catch(() => { }) }).catch(() => {})
}, },
// //
generateAccount() { generateAccount() {
@ -290,7 +325,7 @@ export default {
}).catch(() => { }).catch(() => {
this.loading = false this.loading = false
}) })
}).catch(() => { }) }).catch(() => {})
}, },
// //
handleReject() { handleReject() {
@ -338,44 +373,37 @@ export default {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
.mt10{
.mt10 {
margin-top: 10px; margin-top: 10px;
} }
.header-wrapper{
.header-wrapper {
width: 70%; width: 70%;
margin: 20px auto; margin: 20px auto;
} }
.center-wrapper{
.center-wrapper {
flex: 1; flex: 1;
width: 70%; width: 70%;
margin: 0px auto; margin: 0px auto;
padding-bottom: 20px; padding-bottom: 20px;
overflow-y: auto; overflow-y: auto;
} }
::v-deep.el-card__body{
::v-deep.el-card__body {
padding: 10px; padding: 10px;
} }
// >>>.el-dialog__body{ // >>>.el-dialog__body{
// padding: 10px 20px 20px 20px; // padding: 10px 20px 20px 20px;
// } // }
::v-deep.full-dialog-container { ::v-deep.full-dialog-container{
.el-dialog__body { .el-dialog__body{
height: calc(100% - 80px); height: calc(100% - 80px);
} }
} }
::v-deep.dialog-container{
::v-deep.dialog-container {
// margin-top: 50px !important; // margin-top: 50px !important;
width: 75%; width:75%;
height: 80%; height:80%;
.el-dialog__body{
.el-dialog__body {
padding: 10px; padding: 10px;
height: calc(100% - 80px); height: calc(100% - 80px);
} }

View File

@ -7,8 +7,16 @@
<!-- <TopLang style="position: fixed;top: 40px;right: 40px" /> --> <!-- <TopLang style="position: fixed;top: 40px;right: 40px" /> -->
</h2> </h2>
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="resetForm" v-loading="loading" :model="form" label-width="150px" style="width:80%;margin:0 auto;" <el-form
:rules="rules" class="demo-ruleForm" size="small"> ref="resetForm"
v-loading="loading"
:model="form"
label-width="150px"
style="width:80%;margin:0 auto;"
:rules="rules"
class="demo-ruleForm"
size="small"
>
<!-- 项目编号 --> <!-- 项目编号 -->
<el-form-item :label="$t('trials:researchForm:form:trialId')"> <el-form-item :label="$t('trials:researchForm:form:trialId')">
<el-input v-model="form.TrialCode" disabled /> <el-input v-model="form.TrialCode" disabled />
@ -27,10 +35,13 @@
</el-form-item> </el-form-item>
<!-- 中心名称 --> <!-- 中心名称 -->
<el-form-item :label="$t('trials:researchForm:form:siteName')" prop="TrialSiteId"> <el-form-item :label="$t('trials:researchForm:form:siteName')" prop="TrialSiteId">
<el-select v-model="form.TrialSiteId" filterable style="width:100%;" @change="handleSiteChange" <el-select v-model="form.TrialSiteId" filterable style="width:100%;" @change="handleSiteChange">
:disabled="isUpload"> <el-option
<el-option v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteAliasName" v-for="(item,index) of siteOptions"
:value="item.TrialSiteId" /> :key="index"
:label="item.TrialSiteAliasName"
:value="item.TrialSiteId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 中心编号 --> <!-- 中心编号 -->
@ -43,14 +54,13 @@
{{ $t('trials:researchForm:button:updateQsForm') }} {{ $t('trials:researchForm:button:updateQsForm') }}
</el-link> </el-link>
<!-- 取消更新调研表 --> <!-- 取消更新调研表 -->
<el-link v-else type="primary" @click="form.IsUpdate = false; form.ReplaceUserEmailOrPhone = ''"> <el-link v-else type="primary" @click="form.IsUpdate = false;form.ReplaceUserEmailOrPhone=''">
{{ $t('trials:researchForm:button:cancelUpdateQsForm') }} {{ $t('trials:researchForm:button:cancelUpdateQsForm') }}
</el-link> </el-link>
</el-form-item> </el-form-item>
<!-- 原调研表填写人邮箱 --> <!-- 原调研表填写人邮箱 -->
<el-form-item v-if="form.IsUpdate" :label="$t('trials:researchForm:form:originalEmail')" <el-form-item v-if="form.IsUpdate" :label="$t('trials:researchForm:form:originalEmail')" prop="ReplaceUserEmailOrPhone">
prop="ReplaceUserEmailOrPhone"> <el-input v-model="form.ReplaceUserEmailOrPhone" autocomplete="new-password" />
<el-input v-model="form.ReplaceUserEmailOrPhone" autocomplete="new-password" :disabled="isUpload" />
</el-form-item> </el-form-item>
<!-- 联系邮箱 --> <!-- 联系邮箱 -->
<el-form-item :label="$t('trials:researchForm:form:contactorEmail')" prop="EmailOrPhone"> <el-form-item :label="$t('trials:researchForm:form:contactorEmail')" prop="EmailOrPhone">
@ -64,9 +74,13 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col style="width: 120px;margin-left: 10px"> <el-col style="width: 120px;margin-left: 10px">
<el-button size="small" class="codeBtn" style="width:100%;" <el-button
:disabled="sendDisabled || !form.EmailOrPhone || count > 0" @click="handleSendCode">{{ size="small"
this.$t('trials:researchForm:button:send') }} {{ sendTitle ? `${sendTitle}` : null }}</el-button> type="primary"
style="width:100%;"
:disabled="sendDisabled || !form.EmailOrPhone || count > 0"
@click="handleSendCode"
>{{ this.$t('trials:researchForm:button:send') }} {{ sendTitle ? `${sendTitle}` : null }}</el-button>
</el-col> </el-col>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -189,8 +203,7 @@ export default {
timer: null, timer: null,
msg: '', msg: '',
lang: 'zh', lang: 'zh',
isHaveSiteSurveyRecord: false, isHaveSiteSurveyRecord: false
isUpload: false
} }
}, },
computed: { computed: {
@ -208,14 +221,6 @@ export default {
this.trialId = this.$route.query.trialId this.trialId = this.$route.query.trialId
this.initPage() this.initPage()
} }
if (this.$route.query.isUpload) {
this.isUpload = true
this.form.IsUpdate = true
let { email, oldEMail, trialSiteId } = this.$route.query
if (trialSiteId) this.form.TrialSiteId = trialSiteId
if (oldEMail) this.form.ReplaceUserEmailOrPhone = oldEMail
if (email) this.form.EmailOrPhone = email
}
}, },
methods: { methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }), ...mapMutations({ setLanguage: 'lang/setLanguage' }),
@ -230,9 +235,6 @@ export default {
this.form[key] = Result[key] this.form[key] = Result[key]
} }
}) })
if (this.isUpload) {
this.handleSiteChange(this.form.TrialSiteId)
}
this.loading = false this.loading = false
}).catch(() => { this.loading = false }) }).catch(() => { this.loading = false })
}, },
@ -343,24 +345,8 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.codeBtn {
color: #409EFF;
border-color: #409EFF;
}
.codeBtn.is-disabled,
.codeBtn.is-disabled:focus,
.codeBtn.is-disabled:hover {
color: #c0c4cc;
cursor: not-allowed;
background-image: none;
background-color: #fff;
border-color: #ebeef5;
}
.question-login-wrapper { .question-login-wrapper {
padding: 20px; padding: 20px;
.box-wrapper { .box-wrapper {
width: 50%; width: 50%;
margin: 20px auto; margin: 20px auto;

View File

@ -7,20 +7,51 @@
{{ $t('trials:researchForm:form:title') }} {{ $t('trials:researchForm:form:title') }}
</h2> </h2>
<el-card shadow="hover" style="padding-top: 40px"> <el-card shadow="hover" style="padding-top: 40px">
<el-form ref="resetForm" v-loading="loading" :model="form" label-width="150px" <el-form
style="width: 80%; margin: 0 auto" :rules="rules" class="demo-ruleForm" size="small"> ref="resetForm"
v-loading="loading"
:model="form"
label-width="150px"
style="width: 80%; margin: 0 auto"
:rules="rules"
class="demo-ruleForm"
size="small"
>
<!-- 联系邮箱 --> <!-- 联系邮箱 -->
<el-form-item :label="$t('trials:researchForm:form:contactorEmail')" prop="EmailOrPhone"> <el-form-item
<el-input v-model="form.EmailOrPhone" autocomplete="new-password" @change="handleEmailChange" /> :label="$t('trials:researchForm:form:contactorEmail')"
prop="EmailOrPhone"
>
<el-input
v-model="form.EmailOrPhone"
autocomplete="new-password"
@change="handleEmailChange"
/>
</el-form-item> </el-form-item>
<!-- 验证码 --> <!-- 验证码 -->
<el-form-item :label="$t('trials:researchForm:form:verifyCode')" prop="VerificationCode"> <el-form-item
<div style="display: flex;;justify-content: space-between;"> :label="$t('trials:researchForm:form:verifyCode')"
<el-input v-model="form.VerificationCode" autocomplete="new-password" /> required
<el-button size="small" style="margin-left: 10px;" :disabled="sendDisabled" class="codeBtn" >
@click="handleSendCode">{{ this.$t('trials:researchForm:button:send') <el-col :span="20">
}}{{ count || count === 0 ? `(${count}s)` : '' }}</el-button> <el-form-item prop="VerificationCode">
</div> <el-input
v-model="form.VerificationCode"
autocomplete="new-password"
/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-button
size="small"
type="primary"
style="width: 100%"
:disabled="sendDisabled"
@click="handleSendCode"
>{{ this.$t('trials:researchForm:button:send')
}}{{ count || count === 0 ? `(${count}s)` : '' }}</el-button
>
</el-col>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<!-- 取消 --> <!-- 取消 -->
@ -28,7 +59,12 @@
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<!-- 提交 --> <!-- 提交 -->
<el-button size="small" type="primary" :loading="btnLoading" @click="onSubmit"> <el-button
size="small"
type="primary"
:loading="btnLoading"
@click="onSubmit"
>
{{ $t('common:button:submit') }} {{ $t('common:button:submit') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -180,7 +216,7 @@ export default {
this.$i18n.locale = this.$route.query.lang this.$i18n.locale = this.$route.query.lang
this.setLanguage(this.$route.query.lang) this.setLanguage(this.$route.query.lang)
}, },
mounted() { }, mounted() {},
methods: { methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }), ...mapMutations({ setLanguage: 'lang/setLanguage' }),
// //
@ -213,16 +249,21 @@ export default {
// this.$router.push({ path: `/researchForm?trialId=${this.trialId}&trialSiteSurveyId=${res.Result.TrialSiteSurveyId}` }) // this.$router.push({ path: `/researchForm?trialId=${this.trialId}&trialSiteSurveyId=${res.Result.TrialSiteSurveyId}` })
if (this.$route.query.trialId) { if (this.$route.query.trialId) {
this.$router.push({ this.$router.push({
path: `/curriculumVitae?Id=${res.Result.DoctorId ? res.Result.DoctorId : '' path: `/curriculumVitae?Id=${
}&tabActive=BasicInfo&ReviewStatus=${res.Result.ReviewStatus res.Result.DoctorId ? res.Result.DoctorId : ''
}&trialId=${this.$route.query.trialId}&lang=${this.$route.query.lang }&tabActive=BasicInfo&ReviewStatus=${
}`, res.Result.ReviewStatus
}&trialId=${this.$route.query.trialId}&lang=${
this.$route.query.lang
}`,
}) })
} else { } else {
this.$router.push({ this.$router.push({
path: `/curriculumVitae?Id=${res.Result.DoctorId ? res.Result.DoctorId : '' path: `/curriculumVitae?Id=${
}&tabActive=BasicInfo&ReviewStatus=${res.Result.ReviewStatus res.Result.DoctorId ? res.Result.DoctorId : ''
}&lang=${this.$route.query.lang}`, }&tabActive=BasicInfo&ReviewStatus=${
res.Result.ReviewStatus
}&lang=${this.$route.query.lang}`,
}) })
} }
}) })
@ -271,8 +312,9 @@ export default {
this.timer = setInterval(() => { this.timer = setInterval(() => {
if (this.count > 0 && this.count <= TIME_COUNT) { if (this.count > 0 && this.count <= TIME_COUNT) {
this.count-- this.count--
this.sendTitle = `${this.$t('trials:researchForm:button:send')}(${this.count this.sendTitle = `${this.$t('trials:researchForm:button:send')}(${
}s)` this.count
}s)`
this.sendDisabled = true this.sendDisabled = true
} else { } else {
this.sendDisabled = false this.sendDisabled = false
@ -293,7 +335,6 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.question-login-wrapper { .question-login-wrapper {
padding: 20px; padding: 20px;
.box-wrapper { .box-wrapper {
width: 50%; width: 50%;
margin: 20px auto; margin: 20px auto;
@ -301,19 +342,4 @@ export default {
color: #303133; color: #303133;
} }
} }
.codeBtn {
color: #409EFF;
border-color: #409EFF;
}
.codeBtn.is-disabled,
.codeBtn.is-disabled:focus,
.codeBtn.is-disabled:hover {
color: #c0c4cc;
cursor: not-allowed;
background-image: none;
background-color: #fff;
border-color: #ebeef5;
}
</style> </style>

View File

@ -155,17 +155,6 @@ export default {
}, },
], ],
IdCard: [ IdCard: [
{
validator: (rule, value, callback) => {
let reg = new RegExp(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/, 'ig')
if (value && !reg.test(value)) {
callback(new Error(this.$t('common:ruleMessage:pattern')))
} else {
callback()
}
},
trigger: 'blur',
},
{ {
max: 400, max: 400,
message: this.$t('form:rules:maxLength:400'), message: this.$t('form:rules:maxLength:400'),
@ -173,17 +162,6 @@ export default {
}, },
], ],
BankPhoneNum: [ BankPhoneNum: [
{
validator: (rule, value, callback) => {
let reg = new RegExp(/^\d{11}$/, 'i')
if (value && !reg.test(value)) {
callback(new Error(this.$t('common:ruleMessage:pattern')))
} else {
callback()
}
},
trigger: 'blur',
},
{ {
max: 400, max: 400,
message: this.$t('form:rules:maxLength:400'), message: this.$t('form:rules:maxLength:400'),

View File

@ -21,7 +21,7 @@
:maxlength="400" :maxlength="400"
/> />
</el-form-item> </el-form-item>
<el-form-item <!-- <el-form-item
:label="$t('system:Setting:label:Blind NameCN')" :label="$t('system:Setting:label:Blind NameCN')"
prop="BlindNameCN" prop="BlindNameCN"
> >
@ -30,7 +30,7 @@
style="width: 300px" style="width: 300px"
:maxlength="400" :maxlength="400"
/> />
</el-form-item> </el-form-item> -->
<el-form-item <el-form-item
:label="$t('system:Setting:label:Blind Publications')" :label="$t('system:Setting:label:Blind Publications')"
prop="BlindPublications" prop="BlindPublications"

View File

@ -79,7 +79,10 @@
<el-table-column prop="date" :label="$t('common:action:action')"> <el-table-column prop="date" :label="$t('common:action:action')">
<template <template
slot-scope="scope" slot-scope="scope"
v-if="scope.row.ExperienceDataType != 3" v-if="
scope.row.ExperienceDataType != 2 &&
scope.row.ExperienceDataType != 3
"
> >
<el-button <el-button
type="text" type="text"

View File

@ -211,17 +211,6 @@ export default {
}, },
], ],
IdCard: [ IdCard: [
{
validator: (rule, value, callback) => {
let reg = new RegExp(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/, 'ig')
if (value && !reg.test(value)) {
callback(new Error(this.$t('common:ruleMessage:pattern')))
} else {
callback()
}
},
trigger: 'blur',
},
{ {
max: 400, max: 400,
message: this.$t('form:rules:maxLength:400'), message: this.$t('form:rules:maxLength:400'),
@ -229,17 +218,6 @@ export default {
}, },
], ],
BankPhoneNum: [ BankPhoneNum: [
{
validator: (rule, value, callback) => {
let reg = new RegExp(/^\d{11}$/, 'i')
if (value && !reg.test(value)) {
callback(new Error(this.$t('common:ruleMessage:pattern')))
} else {
callback()
}
},
trigger: 'blur',
},
{ {
max: 400, max: 400,
message: this.$t('form:rules:maxLength:400'), message: this.$t('form:rules:maxLength:400'),

View File

@ -19,12 +19,12 @@
> >
{{ DATA.BlindName }} {{ DATA.BlindName }}
</el-form-item> </el-form-item>
<el-form-item <!-- <el-form-item
:label="$t('system:Setting:label:Blind NameCN')" :label="$t('system:Setting:label:Blind NameCN')"
style="width: 45%" style="width: 45%"
> >
{{ DATA.BlindNameCN }} {{ DATA.BlindNameCN }}
</el-form-item> </el-form-item> -->
<div style="display: flex; font-size: 14px; margin-bottom: 22px"> <div style="display: flex; font-size: 14px; margin-bottom: 22px">
<span style="display: inline-block; width: 120px; color: #000">{{ <span style="display: inline-block; width: 120px; color: #000">{{
$t('system:Setting:label:Blind Publications') $t('system:Setting:label:Blind Publications')
@ -109,19 +109,19 @@
<div class="form_title"> <div class="form_title">
{{ $t('system:Setting:title:Blinded information') }} {{ $t('system:Setting:title:Blinded information') }}
</div> </div>
<el-row> <!-- <el-row>
<el-col :span="12"> <el-col :span="12"> -->
<el-form-item <el-form-item
:label="$t('system:Setting:label:Blind Name')" :label="$t('system:Setting:label:Blind Name')"
prop="BlindName" prop="BlindName"
> >
<el-input <el-input
v-model="form.BlindName" v-model="form.BlindName"
clearable clearable
:maxlength="400" :maxlength="400"
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> <!-- </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
:label="$t('system:Setting:label:Blind NameCN')" :label="$t('system:Setting:label:Blind NameCN')"
@ -134,7 +134,7 @@
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row> -->
<el-form-item <el-form-item
:label="$t('system:Setting:label:Blind Publications')" :label="$t('system:Setting:label:Blind Publications')"
prop="BlindPublications" prop="BlindPublications"

View File

@ -2,8 +2,14 @@
<div class="curriculumVitae" v-loading="loading"> <div class="curriculumVitae" v-loading="loading">
<div class="leftMenu"> <div class="leftMenu">
<div class="title">{{ $t('curriculumVitae:menu:title') }}</div> <div class="title">{{ $t('curriculumVitae:menu:title') }}</div>
<el-menu :default-active="activeIndex" class="el-menu-demo" mode="vertical" @select="handleSelect" <el-menu
background-color="#eee" active-text-color="#000"> :default-active="activeIndex"
class="el-menu-demo"
mode="vertical"
@select="handleSelect"
background-color="#eee"
active-text-color="#000"
>
<el-menu-item index="info"> <el-menu-item index="info">
{{ $t('curriculumVitae:menu:info') }} {{ $t('curriculumVitae:menu:info') }}
</el-menu-item> </el-menu-item>
@ -64,58 +70,94 @@
</el-button> </el-button>
</div> </div>
</div> </div>
<!--个人信息-->
<div class="box" id="info"> <div class="box" id="info">
<info :DATA="{ <info
...reviewerData.BasicInfoView, :DATA="{
...reviewerData.EmploymentView, ...reviewerData.BasicInfoView,
}" :reviewerId.sync="reviewerId" :isEN="isEN" @getInfo="getDetail" /> ...reviewerData.EmploymentView,
}"
:reviewerId.sync="reviewerId"
:isEN="isEN"
@getInfo="getDetail"
/>
</div> </div>
<!--概述-->
<div class="box" id="summarize"> <div class="box" id="summarize">
<summarize :DATA="{ <summarize
...reviewerData.SummarizeInfo, :DATA="{
}" :reviewerId.sync="reviewerId" :trialId="trialId" :isEN="isEN" @getInfo="getDetail" /> ...reviewerData.SummarizeInfo,
}"
:reviewerId.sync="reviewerId"
:trialId="trialId"
:isEN="isEN"
@getInfo="getDetail"
/>
</div> </div>
<!--专业-->
<div class="box" id="specialty"> <div class="box" id="specialty">
<specialty :DATA="{ <specialty
...reviewerData.SpecialtyView, :DATA="{
}" :isEN="isEN" :reviewerId.sync="reviewerId" @getInfo="getDetail" /> ...reviewerData.SpecialtyView,
}"
:isEN="isEN"
:reviewerId.sync="reviewerId"
@getInfo="getDetail"
/>
</div> </div>
<!--教育经历-->
<div class="box" id="educationalExperience"> <div class="box" id="educationalExperience">
<educationalExperience :DATA="reviewerData.EducationList" :isEN="isEN" :reviewerId.sync="reviewerId" <educationalExperience
@getInfo="getDetail" /> :DATA="reviewerData.EducationList"
:isEN="isEN"
:reviewerId.sync="reviewerId"
@getInfo="getDetail"
/>
</div> </div>
<!--进修培训-->
<div class="box" id="continuingTraining"> <div class="box" id="continuingTraining">
<continuingTraining :DATA="reviewerData.PostgraduateList" :isEN="isEN" :reviewerId.sync="reviewerId" <continuingTraining
@getInfo="getDetail" /> :DATA="reviewerData.PostgraduateList"
:isEN="isEN"
:reviewerId.sync="reviewerId"
@getInfo="getDetail"
/>
</div> </div>
<!--科研课题-->
<div class="box" id="scientificResearchProject"> <div class="box" id="scientificResearchProject">
<scientificResearchProject :DATA="{ ...reviewerData.ResearchPublicationView }" :isEN="isEN" <scientificResearchProject
:reviewerId.sync="reviewerId" @getInfo="getDetail" /> :DATA="{ ...reviewerData.ResearchPublicationView }"
:isEN="isEN"
:reviewerId.sync="reviewerId"
@getInfo="getDetail"
/>
</div> </div>
<!--临床试验-->
<div class="box" id="clinicalTrials"> <div class="box" id="clinicalTrials">
<clinicalTrials :DATA="{ ...reviewerData.TrialExperienceView }" :isEN="isEN" :reviewerId.sync="reviewerId" <clinicalTrials
:trialId="trialId" @getInfo="getDetail" /> :DATA="{ ...reviewerData.TrialExperienceView }"
:isEN="isEN"
:reviewerId.sync="reviewerId"
:trialId="trialId"
@getInfo="getDetail"
/>
</div> </div>
<!--gcp证书-->
<div class="box" id="treatise"> <div class="box" id="treatise">
<treatise :DATA="{ ...reviewerData.ResearchPublicationView }" :isEN="isEN" :reviewerId.sync="reviewerId" <treatise
@getInfo="getDetail" /> :DATA="{ ...reviewerData.ResearchPublicationView }"
:isEN="isEN"
:reviewerId.sync="reviewerId"
@getInfo="getDetail"
/>
</div> </div>
<!--其他相关经历-->
<div class="box" id="other"> <div class="box" id="other">
<other :DATA="{ ...reviewerData.ResearchPublicationView }" :isEN="isEN" :reviewerId.sync="reviewerId" <other
@getInfo="getDetail" /> :DATA="{ ...reviewerData.ResearchPublicationView }"
:isEN="isEN"
:reviewerId.sync="reviewerId"
@getInfo="getDetail"
/>
</div> </div>
<div class="box" id="pay"> <div class="box" id="pay">
<pay :DATA="{ ...reviewerData.PaymentModeInfo }" :isEN="isEN" :reviewerId.sync="reviewerId" <pay
@getInfo="getDetail" /> :DATA="{ ...reviewerData.PaymentModeInfo }"
:isEN="isEN"
:reviewerId.sync="reviewerId"
@getInfo="getDetail"
/>
</div> </div>
<div class="box" id="setting" v-if="isPM"> <div class="box" id="setting" v-if="isPM">
<setting :isEN="isEN" :reviewerId.sync="reviewerId" /> <setting :isEN="isEN" :reviewerId.sync="reviewerId" />
@ -125,19 +167,38 @@
<!--简历附件--> <!--简历附件-->
<curriculum :isEN="isEN" :reviewerId.sync="reviewerId" /> <curriculum :isEN="isEN" :reviewerId.sync="reviewerId" />
<!--资历证书--> <!--资历证书-->
<certificate :DATA="reviewerData.AttachmentList" :isEN="isEN" :reviewerId.sync="reviewerId" <certificate
@getInfo="getDetail" /> :DATA="reviewerData.AttachmentList"
:isEN="isEN"
:reviewerId.sync="reviewerId"
@getInfo="getDetail"
/>
<!--协议--> <!--协议-->
<agreement :DATA="reviewerData.AttachmentList" :isEN="isEN" :isPM="isPM" :reviewerId.sync="reviewerId" <agreement
@getInfo="getDetail" /> :DATA="reviewerData.AttachmentList"
:isEN="isEN"
:isPM="isPM"
:reviewerId.sync="reviewerId"
@getInfo="getDetail"
/>
</div> </div>
</div> </div>
<el-dialog :visible.sync="visible" fullscreen append-to-body> <el-dialog :visible.sync="visible" fullscreen append-to-body>
<div style="height: 100%; overflow: auto"> <div style="height: 100%; overflow: auto">
<preview :isEN="isEN" :reviewerId.sync="reviewerId" :trialId="trialId" :isAll="isAll" v-if="visible" /> <preview
:isEN="isEN"
:reviewerId.sync="reviewerId"
:trialId="trialId"
:isAll="isAll"
v-if="visible"
/>
</div> </div>
</el-dialog> </el-dialog>
<holiday v-if="holidayVisible" :reviewerId.sync="reviewerId" :visible.sync="holidayVisible" /> <holiday
v-if="holidayVisible"
:reviewerId.sync="reviewerId"
:visible.sync="holidayVisible"
/>
<!-- <setting <!-- <setting
v-if="settingVisible" v-if="settingVisible"
:reviewerId.sync="reviewerId" :reviewerId.sync="reviewerId"
@ -322,14 +383,12 @@ export default {
position: relative; position: relative;
height: 100%; height: 100%;
} }
.title { .title {
line-height: 50px; line-height: 50px;
background-color: #fff; background-color: #fff;
text-align: center; text-align: center;
font-weight: bold; font-weight: bold;
} }
.leftMenu { .leftMenu {
position: absolute; position: absolute;
left: 0; left: 0;
@ -338,15 +397,12 @@ export default {
height: 100%; height: 100%;
background-color: #eee; background-color: #eee;
border-right: 1px solid #eee; border-right: 1px solid #eee;
::v-deep .el-menu { ::v-deep .el-menu {
padding: 5px 5px 0; padding: 5px 5px 0;
} }
::v-deep .is-active { ::v-deep .is-active {
background-color: #fff !important; background-color: #fff !important;
position: relative; position: relative;
&::before { &::before {
display: block; display: block;
content: ''; content: '';
@ -359,7 +415,6 @@ export default {
} }
} }
} }
.main { .main {
width: calc(100% - 300px); width: calc(100% - 300px);
height: 100%; height: 100%;
@ -368,11 +423,9 @@ export default {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
} }
.content { .content {
width: calc(100% - 300px); width: calc(100% - 300px);
padding: 0 50px 0 20px; padding: 0 50px 0 20px;
.title { .title {
line-height: 50px; line-height: 50px;
background-color: #fff; background-color: #fff;
@ -381,42 +434,35 @@ export default {
justify-content: space-between; justify-content: space-between;
} }
} }
.box { .box {
border: 1px solid #ddd; border: 1px solid #ddd;
border-radius: 3px; border-radius: 3px;
padding: 15px; padding: 15px;
margin-bottom: 20px; margin-bottom: 20px;
} }
::v-deep .noData { ::v-deep .noData {
color: #909399; color: #909399;
text-align: center; text-align: center;
} }
.rightFile { .rightFile {
width: 300px; width: 300px;
padding-right: 10px; padding-right: 10px;
::v-deep .title { ::v-deep .title {
line-height: 50px; line-height: 50px;
background-color: #fff; background-color: #fff;
text-align: left; text-align: left;
font-weight: bold; font-weight: bold;
} }
::v-deep .fileBox { ::v-deep .fileBox {
background-color: #eee; background-color: #eee;
padding: 10px; padding: 10px;
font-size: 14px; font-size: 14px;
border-radius: 3px; border-radius: 3px;
} }
::v-deep .file_title { ::v-deep .file_title {
line-height: 40px; line-height: 40px;
font-weight: bold; font-weight: bold;
} }
::v-deep .btnBox { ::v-deep .btnBox {
display: flex; display: flex;
align-items: center; align-items: center;
@ -428,23 +474,17 @@ export default {
width: 100%; width: 100%;
display: flex; display: flex;
margin-bottom: 10px; margin-bottom: 10px;
.name { .name {
width: 70%; width: 70%;
white-space: nowrap; white-space: nowrap; /* 文本不会换行,会在同一行内继续,直到遇到<br>标签为止 */
/* 文本不会换行,会在同一行内继续,直到遇到<br>标签为止 */ text-overflow: ellipsis; /* 当文本溢出包含它的容器时,显示省略号(...)来表示被截断的文本 */
text-overflow: ellipsis; overflow: hidden; /* 隐藏溢出容器的文本 */
/* 当文本溢出包含它的容器时,显示省略号(...)来表示被截断的文本 */
overflow: hidden;
/* 隐藏溢出容器的文本 */
} }
i { i {
cursor: pointer; cursor: pointer;
margin: 3px; margin: 3px;
color: #409eff; color: #409eff;
} }
.disable { .disable {
cursor: not-allowed; cursor: not-allowed;
color: #909399; color: #909399;

View File

@ -591,32 +591,9 @@
</div> </div>
</div> </div>
<div class="file" v-if="isAll && hasFile"> <div class="file" v-if="isAll && hasFile">
<div <div class="curriculum" v-if="resumeListEN && resumeListEN.length > 0">
class="curriculum"
v-if="
(resumeListCN && resumeListCN.length > 0) ||
(resumeListEN && resumeListEN.length > 0)
"
>
<div class="title">{{ $t('curriculumVitae:curriculum:title') }}</div> <div class="title">{{ $t('curriculumVitae:curriculum:title') }}</div>
<div class="fileBox"> <div class="fileBox">
<div
class="file_title"
v-if="resumeListCN && resumeListCN.length > 0"
>
{{ $t('curriculumVitae:curriculum:fileTitle:CN') }}
</div>
<template v-if="true">
<div class="file" v-for="item in resumeListCN" :key="item.Id">
<div class="name" :title="item.FileName">{{ item.FileName }}</div>
<i
class="el-icon-download"
:title="$t('common:button:download')"
@click.stop="handlePreview(item)"
/>
</div>
</template>
<div class="noData" v-else>{{ $t('curriculumVitae:noData') }}</div>
<div <div
class="file_title" class="file_title"
v-if="resumeListEN && resumeListEN.length > 0" v-if="resumeListEN && resumeListEN.length > 0"

View File

@ -1,228 +0,0 @@
<template>
<div class="detail">
<div class="attachment" v-if="Array.isArray(info.AttachmentList) && info.AttachmentList.length > 0">
<div class="box" v-for="item of info.AttachmentList" :key="item.AttachmentPath" @click="perview(item)">
<i :class="`icon icon_file icon_${item.type}`" />
<span>{{ item.AttachmentName }}</span>
</div>
<span class="downLoadTip" @click="downloadFile">{{ $t('system:email:tip:allDownLoad') }}</span>
</div>
<div class="content" v-html="info.Content"></div>
<viewer ref="picture_perview" style="margin: 0 10px"
v-if="rowData.type && ['png', 'jpg', 'jpeg'].includes(rowData.type.toLowerCase())"
:images="[`${OSSclientConfig.basePath}${rowData.AttachmentPath}`]" :options="viewerOptions">
<img v-show="false" :src="`${OSSclientConfig.basePath}${rowData.AttachmentPath}`" alt="Image" />
</viewer>
</div>
</template>
<script>
import { downLoadFile } from '@/utils/stream.js'
export default {
name: "emailDetail",
props: {
info: {
type: Object,
default: () => {
return {}
}
}
},
data() {
return {
rowData: {},
viewerOptions: {
toolbar: {
zoomIn: true,
zoomOut: true,
reset: true,
prev: false,
next: false,
rotateLeft: true,
rotateRight: true,
flipHorizontal: true,
flipVertical: true,
}
}
}
},
methods: {
//
perview(data) {
this.rowData = data
if (['.ppt',
'.pptx',
'.doc',
'.docx',
'.xls',
'.xlsx'].includes(`.${data.type.toLowerCase()}`)) {
this.$onlyOffice({
path: data.AttachmentPath,
type: data.type,
title: data.AttachmentName
})
}
if (['.jpg',
'.jpeg',
'.png'].includes(`.${data.type.toLowerCase()}`)) {
this.$refs['picture_perview'].$viewer.show()
}
if (['.pdf'].includes(`.${data.type.toLowerCase()}`)) {
this.$preview({
path: data.Path || data.AttachmentPath,
type: 'pdf',
title: data.AttachmentName,
})
}
},
async downloadFile() {
try {
let { files, name } = this.formatDownloadFile(this.info.AttachmentList)
let res = await downLoadFile(files, name, 'zip')
} catch (err) {
console.log(err)
}
},
//
formatDownloadFile(list) {
let files = [],
name = `Attachment_${new Date().getTime()}.zip`
list.forEach(item => {
let obj = {
name: item.AttachmentName,
url: this.OSSclientConfig.basePath + item.AttachmentPath,
}
files.push(obj)
})
return { files, name }
},
}
}
</script>
<style lang="scss" scoped>
.attachment {
border-bottom: 1px solid #EBEEF5;
padding: 10px 0 0 0;
display: flex;
.box {
padding: 5px 10px;
display: flex;
align-items: center;
max-width: 400px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
border-radius: 5px;
background-color: #E4E7ED;
cursor: pointer;
margin-right: 10px;
margin-bottom: 10px;
i {
margin-right: 5px;
}
}
.downLoadTip {
cursor: pointer;
font-size: 14px;
color: #409EFF;
}
}
.content {
width: 100%;
overflow: hidden;
}
.icon {
height: 20px;
width: 20px;
padding: 0px;
line-height: 20px;
margin-right: 6px;
margin-top: 6px;
}
/*文件*/
.icon_file {
width: 16px !important;
height: 16px !important;
margin-right: 6px;
background-size: inherit;
background-image: url(@/assets/0.file-16.png);
background-position: 0 0;
margin-top: -2px;
background-repeat: no-repeat;
font-style: normal;
display: inline-block;
pointer-events: none;
font-size: 85%;
}
/*文件夹*/
.icon_folder {
background-image: url(@/assets/folder_win11_small.png);
margin-top: -6px;
margin-left: 2px;
margin-right: 6px;
background-repeat: no-repeat;
}
/*docx*/
.icon_docx {
background-position: -81px -560px !important;
margin-top: 0;
margin-left: 2px;
}
/*doc*/
.icon_doc {
background-position: -81px -592px !important;
margin-top: 0;
margin-left: 2px;
}
/*xlsx*/
.icon_xlsx {
background-position: -81px -48px !important;
margin-top: 0;
margin-left: 2px;
}
/*pdf*/
.icon_pdf {
background-position: -81px -352px !important;
margin-top: 0;
margin-left: 2px;
}
/*pptx*/
.icon_pptx {
background-position: -81px -288px !important;
margin-top: 0;
margin-left: 2px;
}
/*zip*/
.icon_zip {
background-position: 0 0 !important;
margin-top: -2px;
margin-left: 2px;
}
/*ppt*/
.icon_ppt {
background-position: -81px -304px !important;
margin-top: 0;
margin-left: 2px;
}
/*xls*/
.icon_xls {
background-position: -81px -96px !important;
margin-top: 0;
margin-left: 2px;
}
</style>

View File

@ -1,256 +0,0 @@
<template>
<div class="event">
<div ref="leftContainer" class="left">
<el-form :inline="true">
<el-form-item :label="$t('system:email:search:ToRecipientName')">
<el-input v-model="searchData.ToRecipientName" clearable />
</el-form-item>
<el-form-item :label="$t('system:email:search:CcRecipientName')">
<el-input v-model="searchData.CcRecipientName" clearable />
</el-form-item>
<el-form-item :label="$t('system:email:search:EmailStateEnum')">
<el-select v-model="searchData.EmailStateEnum" clearable filterable placeholder="">
<el-option v-for="item in $d.EmailState" :key="item.id" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<!-- <el-form-item :label="$t('system:email:search:EmailStateEnum')">
<el-select v-model="searchData.EmailStateEnum" clearable filterable placeholder="">
<el-option v-for="item in $d.EmailState" :key="item.id" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item> -->
<el-form-item :label="$t('system:email:search:emailDate')">
<el-date-picker v-model="datetimerange" type="datetimerange"
:default-time="['00:00:00', '23:59:59']" :start-placeholder="$t('feedBack:search:beginTime')"
:end-placeholder="$t('feedBack:search:endTime')" value-format="yyyy-MM-dd HH:mm:ss"
@change="handleDatetimeChange" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="small" @click="getList">
{{ $t('common:button:search') }}
</el-button>
<el-button icon="el-icon-refresh-left" size="small" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
<!-- <el-button type="primary" size="small" @click="synchronizationEmail">
{{ $t('system:email:button:sync') }}
</el-button> -->
</el-form-item>
</el-form>
<el-table v-loading="loading" v-adaptive="{ bottomOffset: 45 }" height="100" :data="list" class="table"
@sort-change="handleSortByColumn">
<el-table-column type="index" width="50" />
<el-table-column :label="$t('system:email:table:messageId')" prop="MessageId" show-overflow-tooltip
sortable="custom" />
<el-table-column :label="$t('system:email:table:emailSubject')" prop="EmailSubject"
show-overflow-tooltip />
<el-table-column :label="$t('system:email:table:ToRecipientName')" prop="ToRecipientName"
show-overflow-tooltip>
<template slot-scope="scope">
<span>{{Array.isArray(scope.row.RecipientList) && scope.row.RecipientList.length > 0
? scope.row.RecipientList.filter(item => item.RecipientTypeEnum === 0).map(item =>
item.RecipientName).join(", ") : ''
}}</span>
</template>
</el-table-column>
<el-table-column :label="$t('system:email:table:CcRecipientName')" prop="CcRecipientName"
show-overflow-tooltip>
<template slot-scope="scope">
<span>{{Array.isArray(scope.row.RecipientList) && scope.row.RecipientList.length > 0
? scope.row.RecipientList.filter(item => item.RecipientTypeEnum === 1).map(item =>
item.RecipientName).join(", ") : ''
}}</span>
</template>
</el-table-column>
<el-table-column :label="$t('system:email:table:emailDate')" prop="EmailDate" show-overflow-tooltip
sortable="custom" />
<el-table-column :label="$t('system:email:table:emailStateEnum')" prop="EmailStateEnum"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
<el-tag :type="scope.row.EmailStateEnum === 1 ? 'danger' : ''">{{ $fd("EmailState",
scope.row.EmailStateEnum) }}</el-tag>
</template>
</el-table-column>
<el-table-column :label="$t('system:email:table:errorInfo')" prop="ErrorInfo" show-overflow-tooltip />
<el-table-column :label="$t('common:action:action')" prop="" show-overflow-tooltip>
<template slot-scope="scope">
<el-button type="text" @click="view(scope.row)">
{{ $t('common:button:view') }}
</el-button>
<!-- <el-button type="text" @click="resendEmail(scope.row)">
{{ $t('system:email:button:resendEmail') }}
</el-button> -->
</template>
</el-table-column>
</el-table>
<div class="pagination" style="text-align: right; margin-top: 5px">
<pagination :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
</div>
</div>
<base-model v-if="model_cfg.visible" :config="model_cfg">
<template slot="dialog-body">
<emailDetail :info="info" />
</template>
</base-model>
</div>
</template>
<script>
import { getReSendEmail, getEmailInfo } from '@/api/admin'
import Pagination from '@/components/Pagination'
import BaseModel from '@/components/BaseModel'
import emailDetail from "./detail"
const searchDataDefault = () => {
return {
// TrialId: null,
// EmailStartDate: null,
// EmailEndDate: null,
// EmailStateEnum: null,
// ToRecipientName: null,
// CcRecipientName: null,
Id: null,
Asc: false,
SortField: 'CreateTime',
PageIndex: 1,
PageSize: 20,
}
}
export default {
name: 'emailLog',
components: { Pagination, BaseModel, emailDetail },
props: {
isSystem: {
type: Boolean,
default: true
},
rowData: {
type: Object,
default: () => {
return {}
}
}
},
data() {
return {
searchData: searchDataDefault(),
list: [],
total: 0,
loading: false,
datetimerange: [],
model_cfg: { visible: false, title: '', width: '500px', fullscreen: true, appendToBody: true },
info: null,
}
},
watch: {
"rowData.Id": {
handler() {
this.getList()
}
}
},
mounted() {
this.getList()
},
methods: {
getList() {
this.loading = true
if (!this.rowData.Id) return false
this.searchData.Id = this.rowData.Id
if (!this.isSystem) this.searchData.TrialId = this.$route.query.trialId
getReSendEmail(this.searchData)
.then((res) => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
})
.catch(() => {
this.loading = false
})
},
//
async view(row) {
try {
let data = {
Id: row.Id,
TrialId: this.$route.query.trialId
// Id: "EC660000-BA37-5C60-8680-08DE1CD6931B"
}
let res = await getEmailInfo(data)
if (res.IsSuccess) {
this.info = res.Result
if (Array.isArray(this.info.AttachmentList) && this.info.AttachmentList.length > 0) {
this.info.AttachmentList.forEach(item => {
var type = item.AttachmentName
.substring(item.AttachmentName.lastIndexOf('.'))
.toLocaleLowerCase().split('.')[1];
item.type = type
})
}
this.model_cfg.visible = true
}
} catch (err) {
console.log(err)
}
},
//
handleReset() {
this.searchData = searchDataDefault()
this.datetimerange = []
this.getList()
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
handleDatetimeChange(val) {
if (val) {
this.searchData.EmailStartDate = val[0]
this.searchData.EmailEndDate = val[1]
} else {
this.searchData.EmailStartDate = ''
this.searchData.EmailEndDate = ''
}
},
},
}
</script>
<style lang="scss" scoped>
.event {
height: 100%;
box-sizing: border-box;
display: flex;
padding: 10px;
border-radius: 5px;
.left {
display: flex;
flex-direction: column;
width: 0;
flex-grow: 4;
// border-right: 1px solid #ccc;
.filter-container {
display: flex;
align-items: center;
margin: 5px;
}
.data-table {
flex: 1;
padding: 5px 0px;
}
.pagination-container {
text-align: right;
}
}
}
</style>

View File

@ -1,290 +0,0 @@
<template>
<div class="event">
<div ref="leftContainer" class="left">
<el-form :inline="true">
<el-form-item :label="$t('system:email:search:ToRecipientName')">
<el-input v-model="searchData.ToRecipientName" clearable />
</el-form-item>
<el-form-item :label="$t('system:email:search:CcRecipientName')">
<el-input v-model="searchData.CcRecipientName" clearable />
</el-form-item>
<el-form-item :label="$t('system:email:search:EmailStateEnum')">
<el-select v-model="searchData.EmailStateEnum" clearable filterable placeholder="">
<el-option v-for="item in $d.EmailState" :key="item.id" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<!-- <el-form-item :label="$t('system:email:search:EmailStateEnum')">
<el-select v-model="searchData.EmailStateEnum" clearable filterable placeholder="">
<el-option v-for="item in $d.EmailState" :key="item.id" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item> -->
<el-form-item :label="$t('system:email:search:emailDate')">
<el-date-picker v-model="datetimerange" type="datetimerange"
:default-time="['00:00:00', '23:59:59']" :start-placeholder="$t('feedBack:search:beginTime')"
:end-placeholder="$t('feedBack:search:endTime')" value-format="yyyy-MM-dd HH:mm:ss"
@change="handleDatetimeChange" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="small" @click="getList">
{{ $t('common:button:search') }}
</el-button>
<el-button icon="el-icon-refresh-left" size="small" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
<el-button type="primary" size="small" @click="synchronizationEmail">
{{ $t('system:email:button:sync') }}
</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" v-adaptive="{ bottomOffset: 45 }" height="100" :data="list" class="table"
@sort-change="handleSortByColumn">
<el-table-column type="index" width="50" />
<el-table-column :label="$t('system:email:table:messageId')" prop="MessageId" show-overflow-tooltip
sortable="custom" />
<el-table-column :label="$t('system:email:table:emailSubject')" prop="EmailSubject"
show-overflow-tooltip />
<el-table-column :label="$t('system:email:table:ToRecipientName')" prop="ToRecipientName"
show-overflow-tooltip>
<template slot-scope="scope">
<span>{{Array.isArray(scope.row.RecipientList) && scope.row.RecipientList.length > 0
? scope.row.RecipientList.filter(item => item.RecipientTypeEnum === 0).map(item =>
item.RecipientName).join(", ") : ''
}}</span>
</template>
</el-table-column>
<el-table-column :label="$t('system:email:table:CcRecipientName')" prop="CcRecipientName"
show-overflow-tooltip>
<template slot-scope="scope">
<span>{{Array.isArray(scope.row.RecipientList) && scope.row.RecipientList.length > 0
? scope.row.RecipientList.filter(item => item.RecipientTypeEnum === 1).map(item =>
item.RecipientName).join(", ") : ''
}}</span>
</template>
</el-table-column>
<el-table-column :label="$t('system:email:table:emailDate')" prop="EmailDate" show-overflow-tooltip
sortable="custom" />
<el-table-column :label="$t('system:email:table:emailStateEnum')" prop="EmailStateEnum"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
<el-tag :type="scope.row.EmailStateEnum === 1 ? 'danger' : ''">{{ $fd("EmailState",
scope.row.EmailStateEnum) }}</el-tag>
</template>
</el-table-column>
<el-table-column :label="$t('system:email:table:errorInfo')" prop="ErrorInfo" show-overflow-tooltip />
<el-table-column :label="$t('common:action:action')" fixed="right" prop="" show-overflow-tooltip
min-width="120px">
<template slot-scope="scope">
<el-button type="text" @click="view(scope.row)">
{{ $t('common:button:view') }}
</el-button>
<el-button type="text" @click="resendEmail(scope.row)">
{{ $t('system:email:button:resendEmail') }}
</el-button>
<el-button type="text" @click="openResendEmailList(scope.row)">
{{ $t('system:email:button:resendEmailList') }}
</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination" style="text-align: right; margin-top: 5px">
<pagination :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
</div>
</div>
<base-model v-if="model_cfg.visible" :config="model_cfg">
<template slot="dialog-body">
<emailDetail :info="info" />
</template>
</base-model>
<el-dialog title="" :visible.sync="resendVisible" width="30%" :fullscreen='true'>
<resendList :rowData="info" :isSystem="isSystem" />
</el-dialog>
</div>
</template>
<script>
import { getEmailLogList, resendEmail, getEmailInfo, synchronizationEmail } from '@/api/admin'
import Pagination from '@/components/Pagination'
import BaseModel from '@/components/BaseModel'
import emailDetail from "./components/detail"
import resendList from "./components/resendList"
const searchDataDefault = () => {
return {
TrialId: null,
EmailStartDate: null,
EmailEndDate: null,
EmailStateEnum: null,
ToRecipientName: null,
CcRecipientName: null,
Asc: false,
SortField: 'CreateTime',
PageIndex: 1,
PageSize: 20,
}
}
export default {
name: 'emailLog',
components: { Pagination, BaseModel, emailDetail, resendList },
props: {
isSystem: {
type: Boolean,
default: true
}
},
data() {
return {
searchData: searchDataDefault(),
list: [],
total: 0,
loading: false,
datetimerange: [],
model_cfg: { visible: false, title: '', width: '500px', fullscreen: true },
info: null,
resendVisible: false
}
},
mounted() {
this.getList()
},
methods: {
openResendEmailList(row) {
this.info = row
this.resendVisible = true
},
getList() {
this.loading = true
if (!this.isSystem) this.searchData.TrialId = this.$route.query.trialId
getEmailLogList(this.searchData)
.then((res) => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
})
.catch(() => {
this.loading = false
})
},
//
async view(row) {
try {
let data = {
Id: row.Id,
TrialId: this.$route.query.trialId
// Id: "EC660000-BA37-5C60-8680-08DE1CD6931B"
}
let res = await getEmailInfo(data)
if (res.IsSuccess) {
this.info = res.Result
if (Array.isArray(this.info.AttachmentList) && this.info.AttachmentList.length > 0) {
this.info.AttachmentList.forEach(item => {
var type = item.AttachmentName
.substring(item.AttachmentName.lastIndexOf('.'))
.toLocaleLowerCase().split('.')[1];
item.type = type
})
}
this.model_cfg.visible = true
}
} catch (err) {
console.log(err)
}
},
//
async synchronizationEmail() {
try {
let data = {
TrialId: this.$route.query.trialId
}
this.loading = true
let res = await synchronizationEmail(data)
this.loading = false
if (res.IsSuccess) {
this.getList()
this.$message.success(this.$t("system:email:message:syncSuccessfully"))
}
} catch (err) {
this.loading = false
console.log(err)
}
},
//
async resendEmail(row) {
try {
let data = {
Id: row.Id,
TrialId: this.$route.query.trialId
}
this.loading = true
let res = await resendEmail(data)
this.loading = false
if (res.IsSuccess) {
this.getList()
this.$message.success(this.$t("system:email:message:resendSuccessfully"))
}
} catch (err) {
this.loading = false
console.log(err)
}
},
//
handleReset() {
this.searchData = searchDataDefault()
this.datetimerange = []
this.getList()
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
handleDatetimeChange(val) {
if (val) {
this.searchData.EmailStartDate = val[0]
this.searchData.EmailEndDate = val[1]
} else {
this.searchData.EmailStartDate = ''
this.searchData.EmailEndDate = ''
}
},
},
}
</script>
<style lang="scss" scoped>
.event {
height: 100%;
box-sizing: border-box;
display: flex;
padding: 10px;
border-radius: 5px;
.left {
display: flex;
flex-direction: column;
width: 0;
flex-grow: 4;
// border-right: 1px solid #ccc;
.filter-container {
display: flex;
align-items: center;
margin: 5px;
}
.data-table {
flex: 1;
padding: 5px 0px;
}
.pagination-container {
text-align: right;
}
}
}
</style>

View File

@ -2,18 +2,26 @@
<base-model v-if="config.visible" :config="config"> <base-model v-if="config.visible" :config="config">
<template slot="dialog-body"> <template slot="dialog-body">
<el-table :data="curData" border style="width: 100%" size="small"> <el-table :data="curData" border style="width: 100%" size="small">
<el-table-column prop="key" :label="$t('system:loginLog:table:cfgItem')" show-overflow-tooltip /> <el-table-column
<el-table-column prop="value" :label="$t('system:loginLog:table:cfgVal')" show-overflow-tooltip> prop="key"
:label="$t('system:loginLog:table:cfgItem')"
show-overflow-tooltip
/>
<el-table-column
prop="value"
:label="$t('system:loginLog:table:cfgVal')"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button v-if="scope.row.prop === 'UserAgreementId'" type="text" size="small" <span v-if="scope.row.prop !== 'UserRoleList'">{{
@click.stop="view(scope.row)">{{
$t('dictionary:agreement:button:view')
}}</el-button>
<span v-else-if="scope.row.prop !== 'UserRoleList'">{{
scope.row.value scope.row.value
}}</span> }}</span>
<template v-else> <template v-else>
<div v-for="item in scope.row.value" :key="item.UserTypeEnum" style="margin: 0"> <div
v-for="item in scope.row.value"
:key="item.UserTypeEnum"
style="margin: 0"
>
{{ item.UserTypeShortName {{ item.UserTypeShortName
}}{{ $t('system:loginLog:form:symbol') }}{{ $t('system:loginLog:form:symbol')
}}{{ $fd('IsEnable', !item.IsUserRoleDisabled) }} }}{{ $fd('IsEnable', !item.IsUserRoleDisabled) }}
@ -66,11 +74,7 @@ export default {
'PositionName', 'PositionName',
'DepartmentName', 'DepartmentName',
'UserRoleList', 'UserRoleList',
'UserAgreementTypeEnum',
'FileVersion',
'UserAgreementId',
], ],
IsEn_Us: false
} }
}, },
computed: { computed: {
@ -83,7 +87,6 @@ export default {
let obj = JSON.parse(this.JsonObj) let obj = JSON.parse(this.JsonObj)
let curData = [] let curData = []
Object.keys(obj).forEach((key) => { Object.keys(obj).forEach((key) => {
if (key === 'IsEn_Us') this.IsEn_Us = obj[key]
if (this.curKeys.includes(key)) { if (this.curKeys.includes(key)) {
let o = { let o = {
key: this.$t(`system:loginLog:form:${key}`), key: this.$t(`system:loginLog:form:${key}`),
@ -93,23 +96,12 @@ export default {
if (key === 'Status') { if (key === 'Status') {
o.value = this.$fd('IsUserEnable', obj[key]) o.value = this.$fd('IsUserEnable', obj[key])
} }
if (key === 'UserAgreementTypeEnum') {
o.value = this.$fd('UserAgreementType', obj[key])
}
curData.push(o) curData.push(o)
} }
}) })
return curData return curData
}, },
}, },
methods: {
view(row) {
this.$AGR({
Id: row.value,
IsEn_Us: this.IsEn_Us
})
},
}
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -1,14 +1,7 @@
<template> <template>
<div class="trials-navbar" style="position: relative"> <div class="trials-navbar" style="position: relative">
<div class="leftMenu"> <div class="leftMenu">
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" /> <img src="@/assets/title-logo.png" alt="" class="title-logo" />
<img
v-else-if="NODE_ENV === 'usa'"
src="@/assets/title-logo.png"
alt=""
class="title-logo"
/>
<img v-else src="@/assets/zzlogo4.png" alt="" />
<span style="white-space: nowrap" v-if="NODE_ENV !== 'usa'"> <span style="white-space: nowrap" v-if="NODE_ENV !== 'usa'">
<!-- 中心影像系统EICS --> <!-- 中心影像系统EICS -->
{{ $t('trials:trials:title:eics') }} {{ $t('trials:trials:title:eics') }}

View File

@ -1,33 +1,72 @@
<!-- eslint-disable --> <!-- eslint-disable -->
<template> <template>
<el-form ref="trialForm" v-loading="loading" label-width="250px" :rules="trialFormRules" <el-form
class="demo-ruleForm trial-Form" :model="trialForm" label-position="right" :inline="true"> ref="trialForm"
v-loading="loading"
label-width="250px"
:rules="trialFormRules"
class="demo-ruleForm trial-Form"
:model="trialForm"
label-position="right"
:inline="true"
>
<el-row> <el-row>
<!-- 项目编号 --> <!-- 项目编号 -->
<el-form-item v-if="trialForm.Id !== ''" :label="$t('trials:trials-list:form:trialId')" prop="TrialCode"> <el-form-item
<el-input v-model="trialForm.TrialCode" @keyup.native="trialCodekeyUp" /> v-if="trialForm.Id !== ''"
:label="$t('trials:trials-list:form:trialId')"
prop="TrialCode"
>
<el-input
v-model="trialForm.TrialCode"
@keyup.native="trialCodekeyUp"
/>
</el-form-item> </el-form-item>
<!-- 项目类型 --> <!-- 项目类型 -->
<el-form-item :label="$t('trials:trials-list:form:trialType')" prop="TrialType"> <el-form-item
<el-radio-group v-model="trialForm.TrialType" :disabled="trialForm.Id !== ''"> :label="$t('trials:trials-list:form:trialType')"
<el-radio v-for="item of $d.TrialType" :disabled="isTestUser && (item.value === 1 || item.value === 2)" prop="TrialType"
:key="item.id" :label="item.value">{{ item.label }}</el-radio> >
<el-radio-group
v-model="trialForm.TrialType"
:disabled="trialForm.Id !== ''"
>
<el-radio
v-for="item of $d.TrialType"
:disabled="isTestUser && (item.value === 1 || item.value === 2)"
:key="item.id"
:label="item.value"
>{{ item.label }}</el-radio
>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- 试验名称 --> <!-- 试验名称 -->
<el-form-item :label="$t('trials:trials-list:form:experimentName')" prop="ExperimentName"> <el-form-item
<el-input v-model="trialForm.ExperimentName" type="textarea" :autosize="{ minRows: 1, maxRows: 4 }" /> :label="$t('trials:trials-list:form:experimentName')"
prop="ExperimentName"
>
<el-input
v-model="trialForm.ExperimentName"
type="textarea"
:autosize="{ minRows: 1, maxRows: 4 }"
/>
</el-form-item> </el-form-item>
<!-- 研究方案号 --> <!-- 研究方案号 -->
<el-form-item :label="$t('trials:trials-list:form:researchNumber')" prop="ResearchProgramNo"> <el-form-item
:label="$t('trials:trials-list:form:researchNumber')"
prop="ResearchProgramNo"
>
<el-input v-model="trialForm.ResearchProgramNo" /> <el-input v-model="trialForm.ResearchProgramNo" />
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- 主研单位 --> <!-- 主研单位 -->
<el-form-item :label="$t('trials:trials-list:form:researchUnit')" prop="MainResearchUnit"> <el-form-item
:label="$t('trials:trials-list:form:researchUnit')"
prop="MainResearchUnit"
>
<el-input v-model="trialForm.MainResearchUnit" /> <el-input v-model="trialForm.MainResearchUnit" />
</el-form-item> </el-form-item>
<!-- 负责人PI --> <!-- 负责人PI -->
@ -38,28 +77,63 @@
<el-row> <el-row>
<!-- 申办方 --> <!-- 申办方 -->
<el-form-item :label="$t('trials:trials-list:form:sponsor')"> <el-form-item :label="$t('trials:trials-list:form:sponsor')">
<el-select v-model="trialForm.SponsorId" filterable allow-create default-first-option clearable <el-select
@change="(value) => handleSelectChange(value, 'sponsor')" @visible-change=" v-model="trialForm.SponsorId"
filterable
allow-create
default-first-option
@change="(value) => handleSelectChange(value, 'sponsor')"
@visible-change="
(flag) => handleSelectVisibbleChange(flag, 'sponsor') (flag) => handleSelectVisibbleChange(flag, 'sponsor')
"> "
<el-option v-for="item in sponsorList" :key="item.Id" :label="item.SponsorName" :value="item.Id" /> >
<el-option
v-for="item in sponsorList"
:key="item.Id"
:label="item.SponsorName"
:value="item.Id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- CRO --> <!-- CRO -->
<el-form-item :label="$t('trials:trials-list:form:cro')"> <el-form-item :label="$t('trials:trials-list:form:cro')">
<el-select v-model="trialForm.CROId" filterable allow-create default-first-option clearable <el-select
v-model="trialForm.CROId"
filterable
allow-create
default-first-option
@change="(value) => handleSelectChange(value, 'cro')" @change="(value) => handleSelectChange(value, 'cro')"
@visible-change="(flag) => handleSelectVisibbleChange(flag, 'cro')"> @visible-change="(flag) => handleSelectVisibbleChange(flag, 'cro')"
<el-option v-for="item of croList" :key="item.Id" :label="item.CROName" :value="item.Id" /> >
<el-option
v-for="item of croList"
:key="item.Id"
:label="item.CROName"
:value="item.Id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- DeclarationType --> <!-- DeclarationType -->
<el-form-item :label="$t('trials:trials-list:form:declarationType')" prop="DeclarationTypeEnumList"> <el-form-item
<el-select v-model="trialForm.DeclarationTypeEnumList" size="small" multiple clearable :label="$t('trials:trials-list:form:declarationType')"
@change="handleDeclarationTypeChange" style="width: 100%"> prop="DeclarationTypeEnumList"
<el-option v-for="item of $d.DeclarationType" :key="item.value" :value="item.value" :label="item.label" /> >
<el-select
v-model="trialForm.DeclarationTypeEnumList"
size="small"
multiple
clearable
@change="handleDeclarationTypeChange"
style="width: 100%"
>
<el-option
v-for="item of $d.DeclarationType"
:key="item.value"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- Phase --> <!-- Phase -->
@ -71,41 +145,79 @@
:label="item.Value" :label="item.Value"
:value="item.Id" :value="item.Id"
/> --> /> -->
<el-option v-for="item of $d.Trial_Phase" :key="item.id" :label="item.label" :value="item.id" /> <el-option
v-for="item of $d.Trial_Phase"
:key="item.id"
:label="item.label"
:value="item.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- 适应症类型 IndicationType --> <!-- 适应症类型 IndicationType -->
<el-form-item :label="$t('trials:trials-list:form:indicationType')" prop="IndicationTypeId"> <el-form-item
<el-select v-model="trialForm.IndicationTypeId" @change="handleIndicationTypeChange"> :label="$t('trials:trials-list:form:indicationType')"
prop="IndicationTypeId"
>
<el-select
v-model="trialForm.IndicationTypeId"
@change="handleIndicationTypeChange"
>
<!-- <el-option <!-- <el-option
v-for="item of dictionaryList.IndicationType" v-for="item of dictionaryList.IndicationType"
:key="item.Id" :key="item.Id"
:label="item.Value" :label="item.Value"
:value="item.Id" :value="item.Id"
/> --> /> -->
<el-option v-for="item of $d.IndicationType" :key="item.id" :label="item.label" :value="item.id" /> <el-option
v-for="item of $d.IndicationType"
:key="item.id"
:label="item.label"
:value="item.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- Indication --> <!-- Indication -->
<el-form-item :label="$t('trials:trials-list:form:indication')" prop="IndicationEnum"> <el-form-item
:label="$t('trials:trials-list:form:indication')"
prop="IndicationEnum"
>
<!-- <el-input v-model="trialForm.Indication" />--> <!-- <el-input v-model="trialForm.Indication" />-->
<el-select :disabled="!trialForm.IndicationTypeId" v-if="![37, 38, 39].includes(trialForm.IndicationEnum)" <el-select
v-model="trialForm.IndicationEnum"> :disabled="!trialForm.IndicationTypeId"
<el-option v-for="item of $d.Indication" v-show="indicationGrouping === item.raw.ChildGroup" :key="item.id" v-if="![37, 38, 39].includes(trialForm.IndicationEnum)"
:label="item.label" :value="item.value" /> v-model="trialForm.IndicationEnum"
>
<el-option
v-for="item of $d.Indication"
v-show="indicationGrouping === item.raw.ChildGroup"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
<el-row v-if="[37, 38, 39].includes(trialForm.IndicationEnum)"> <el-row v-if="[37, 38, 39].includes(trialForm.IndicationEnum)">
<el-col :span="12"> <el-col :span="12">
<el-select :disabled="!trialForm.IndicationTypeId" v-model="trialForm.IndicationEnum" <el-select
style="width: 100%; margin-right: 10px"> :disabled="!trialForm.IndicationTypeId"
<el-option v-for="item of $d.Indication" v-show="indicationGrouping === item.raw.ChildGroup" v-model="trialForm.IndicationEnum"
:key="item.id" :label="item.label" :value="item.value" /> style="width: 100%; margin-right: 10px"
>
<el-option
v-for="item of $d.Indication"
v-show="indicationGrouping === item.raw.ChildGroup"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-input :disabled="!trialForm.IndicationTypeId" v-model="trialForm.Indication" /> <el-input
:disabled="!trialForm.IndicationTypeId"
v-model="trialForm.Indication"
/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
@ -120,54 +232,99 @@
:label="item.Value" :label="item.Value"
:value="item.Id" :value="item.Id"
/> --> /> -->
<el-option v-for="item of $d.Modality" :key="item.id" :label="item.label" :value="item.id" /> <el-option
v-for="item of $d.Modality"
:key="item.id"
:label="item.label"
:value="item.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- Sites --> <!-- Sites -->
<el-form-item :label="$t('trials:trials-list:form:siteCount')"> <el-form-item :label="$t('trials:trials-list:form:siteCount')">
<el-input-number v-model="trialForm.PlanSiteCount" controls-position="right" :min="0" /> <el-input-number
v-model="trialForm.PlanSiteCount"
controls-position="right"
:min="0"
/>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- Expected Patients Num --> <!-- Expected Patients Num -->
<el-form-item :label="$t('trials:trials-list:form:patientsNum')"> <el-form-item :label="$t('trials:trials-list:form:patientsNum')">
<el-input-number v-model="trialForm.ExpectedPatients" controls-position="right" :min="0" <el-input-number
@change="handleExpectedPatientsChange" /> v-model="trialForm.ExpectedPatients"
controls-position="right"
:min="0"
@change="handleExpectedPatientsChange"
/>
</el-form-item> </el-form-item>
<!-- Timepoints Per Patient --> <!-- Timepoints Per Patient -->
<el-form-item :label="$t('trials:trials-list:form:timePointsPerPatient')"> <el-form-item :label="$t('trials:trials-list:form:timePointsPerPatient')">
<el-input-number v-model="trialForm.TimePointsPerPatient" controls-position="right" :min="0" <el-input-number
@change="handleTpPerPatientChange" /> v-model="trialForm.TimePointsPerPatient"
controls-position="right"
:min="0"
@change="handleTpPerPatientChange"
/>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- Visits --> <!-- Visits -->
<el-form-item :label="$t('trials:trials-list:form:visitCount')"> <el-form-item :label="$t('trials:trials-list:form:visitCount')">
<el-input-number v-model="trialForm.PlanVisitCount" controls-position="right" :min="0" /> <el-input-number
v-model="trialForm.PlanVisitCount"
controls-position="right"
:min="0"
/>
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- Expedited --> <!-- Expedited -->
<el-form-item :label="$t('trials:trials-list:form:expedited')" prop="Expedited"> <el-form-item
:label="$t('trials:trials-list:form:expedited')"
prop="Expedited"
>
<el-select v-model="trialForm.Expedited"> <el-select v-model="trialForm.Expedited">
<el-option v-for="item in expeditedOption" :key="item.value" :label="item.label" :value="item.value" /> <el-option
v-for="item in expeditedOption"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- Turnaround Time --> <!-- Turnaround Time -->
<el-form-item :label="$t('trials:trials-list:form:projectCycle')" prop="ProjectCycle"> <el-form-item
:label="$t('trials:trials-list:form:projectCycle')"
prop="ProjectCycle"
>
<el-input v-model="trialForm.ProjectCycle" /> <el-input v-model="trialForm.ProjectCycle" />
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- Total Reviewers --> <!-- Total Reviewers -->
<el-form-item :label="$t('trials:trials-list:form:totalReviewers')"> <el-form-item :label="$t('trials:trials-list:form:totalReviewers')">
<el-input-number v-model="trialForm.TotalReviewers" controls-position="right" :min="0" /> <el-input-number
v-model="trialForm.TotalReviewers"
controls-position="right"
:min="0"
/>
</el-form-item> </el-form-item>
<!-- Type of Reviewers --> <!-- Type of Reviewers -->
<el-form-item :label="$t('trials:trials-list:form:typeofReviewers')"> <el-form-item :label="$t('trials:trials-list:form:typeofReviewers')">
<el-select v-model="trialForm.AttendedReviewerTypeEnumList" size="small" multiple clearable> <el-select
<el-option v-for="item of $d.AttendedReviewerType" :key="item.value" :value="item.value" v-model="trialForm.AttendedReviewerTypeEnumList"
:label="item.label" /> size="small"
multiple
clearable
>
<el-option
v-for="item of $d.AttendedReviewerType"
:key="item.value"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
<!-- <el-row v-if="trialForm.AttendedReviewerTypeEnumList.includes(2)">--> <!-- <el-row v-if="trialForm.AttendedReviewerTypeEnumList.includes(2)">-->
<!-- <el-col :span="12">--> <!-- <el-col :span="12">-->
@ -400,7 +557,6 @@ export default {
}, },
// CRO // CRO
async handleSelectChange(value, key) { async handleSelectChange(value, key) {
if (!value) return false
let arr = key == "sponsor" ? this.sponsorList : this.croList; let arr = key == "sponsor" ? this.sponsorList : this.croList;
let has = arr.some((item) => item.Id === value); let has = arr.some((item) => item.Id === value);
if (!has) { if (!has) {
@ -632,7 +788,6 @@ export default {
.trial-Form .el-textarea { .trial-Form .el-textarea {
width: 340px; width: 340px;
} }
.trial-Form .el-col .el-input { .trial-Form .el-col .el-input {
width: 165px; width: 165px;
margin-right: 10px; margin-right: 10px;

View File

@ -5,61 +5,135 @@
<!-- 账号信息 --> <!-- 账号信息 -->
{{ $t('trials:trials-myinfo:title:accountInfo') }} {{ $t('trials:trials-myinfo:title:accountInfo') }}
</div> </div>
<el-form label-position="right" label-width="100px" :rules="rule" :model="userForm" ref="userFormRef"> <el-form
label-position="right"
label-width="100px"
:rules="rule"
:model="userForm"
ref="userFormRef"
>
<!-- 用户名 --> <!-- 用户名 -->
<el-form-item :label="$t('trials:trials-myinfo:form:userName')" style="margin-bottom: 5px"> <el-form-item
:label="$t('trials:trials-myinfo:form:userName')"
style="margin-bottom: 5px"
>
<span>{{ user.UserName }}</span> <span>{{ user.UserName }}</span>
</el-form-item> </el-form-item>
<el-form-item label="" style="position: relative" prop="UserName"> <el-form-item label="" style="position: relative" prop="UserName">
<el-input v-model="userForm.UserName" :placeholder="$t('trials:trials-myinfo:form:userName')" /> <el-input
v-model="userForm.UserName"
:placeholder="$t('trials:trials-myinfo:form:userName')"
/>
<!-- 修改 --> <!-- 修改 -->
<el-button :disabled="!userForm.UserName" class="saveBtn" type="primary" size="small" @click="setNewUserName"> <el-button
:disabled="!userForm.UserName"
class="saveBtn"
type="primary"
size="small"
@click="setNewUserName"
>
{{ $t('trials:trials-myinfo:button:update') }} {{ $t('trials:trials-myinfo:button:update') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
<!-- 电话 --> <!-- 电话 -->
<el-form-item :label="$t('trials:trials-myinfo:form:phone')" style="margin-bottom: 5px" prop="Phone"> <el-form-item
:label="$t('trials:trials-myinfo:form:phone')"
style="margin-bottom: 5px"
prop="Phone"
>
<span>{{ user.Phone }}</span> <span>{{ user.Phone }}</span>
</el-form-item> </el-form-item>
<el-form-item label="" style="position: relative" prop="Phone"> <el-form-item label="" style="position: relative" prop="Phone">
<el-input v-model="userForm.Phone" :placeholder="$t('trials:trials-myinfo:form:phone')" /> <el-input
v-model="userForm.Phone"
:placeholder="$t('trials:trials-myinfo:form:phone')"
/>
<!-- 修改 --> <!-- 修改 -->
<el-button :disabled="!userForm.Phone" class="saveBtn" type="primary" size="small" @click="setNewPhone"> <el-button
:disabled="!userForm.Phone"
class="saveBtn"
type="primary"
size="small"
@click="setNewPhone"
>
{{ $t('trials:trials-myinfo:button:update') }} {{ $t('trials:trials-myinfo:button:update') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
<!-- 邮箱 --> <!-- 邮箱 -->
<el-form-item :label="$t('trials:trials-myinfo:form:email')" style="margin-bottom: 5px" prop="EMail"> <el-form-item
:label="$t('trials:trials-myinfo:form:email')"
style="margin-bottom: 5px"
prop="EMail"
>
<span>{{ user.EMail }}</span> <span>{{ user.EMail }}</span>
</el-form-item> </el-form-item>
<el-form-item label="" style="margin-bottom: 10px; position: relative" prop="EMail" v-if="IsCanConnectInternet"> <el-form-item
<el-input v-model="userForm.EMail" @input="handleEmailChange" label=""
:placeholder="$t('trials:trials-myinfo:form:email')" /> style="margin-bottom: 10px; position: relative"
prop="EMail"
v-if="IsCanConnectInternet"
>
<el-input
v-model="userForm.EMail"
@input="handleEmailChange"
:placeholder="$t('trials:trials-myinfo:form:email')"
/>
<el-button
class="sendCode"
:disabled="sendDisabled"
type="primary"
size="mini"
@click="sendVerificationCode"
>{{ sendTitle }}</el-button
>
</el-form-item> </el-form-item>
<el-form-item label="" style="position: relative" prop="VerificationCode" v-if="IsCanConnectInternet"> <el-form-item
<div style="display: flex;justify-content: space-between;width: 100%;"> label=""
<el-input v-model="userForm.VerificationCode" :placeholder="$t('trials:researchForm:form:verifyCode')" /> style="position: relative"
<el-button class="codeBtn" :disabled="sendDisabled" size="mini" @click="sendVerificationCode">{{ prop="VerificationCode"
sendTitle v-if="IsCanConnectInternet"
}}</el-button> >
</div> <el-input
v-model="userForm.VerificationCode"
:placeholder="$t('trials:researchForm:form:verifyCode')"
/>
<!-- 修改 --> <!-- 修改 -->
<el-button :disabled="!userForm.EMail || !userForm.VerificationCode" class="saveBtn" type="primary" <el-button
size="small" @click="setNewEmail"> :disabled="!userForm.EMail || !userForm.VerificationCode"
class="saveBtn"
type="primary"
size="small"
@click="setNewEmail"
>
{{ $t('trials:trials-myinfo:button:update') }} {{ $t('trials:trials-myinfo:button:update') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
<el-form-item :label="$t('trials:trials-myinfo:form:toggleRole')" style="position: relative" <el-form-item
prop="VerificationCode" v-if="hasRole"> :label="$t('trials:trials-myinfo:form:toggleRole')"
style="position: relative"
prop="VerificationCode"
v-if="hasRole"
>
<el-radio-group v-model="userRoleId" class="roles" v-if="hasRole"> <el-radio-group v-model="userRoleId" class="roles" v-if="hasRole">
<el-radio v-for="item in roles" :key="item.Id" :label="item.Id" :disabled="item.IsUserRoleDisabled" <el-radio
style="margin-bottom: 10px"> v-for="item in roles"
:key="item.Id"
:label="item.Id"
:disabled="item.IsUserRoleDisabled"
style="margin-bottom: 10px"
>
{{ item.UserTypeShortName }} {{ item.UserTypeShortName }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
<!-- 修改 --> <!-- 修改 -->
<el-button :disabled="!userRoleId || saveDisabled" class="saveBtn" :loading="toggleRoleLoading" type="primary" <el-button
size="small" @click="toggleRole"> :disabled="!userRoleId || saveDisabled"
class="saveBtn"
:loading="toggleRoleLoading"
type="primary"
size="small"
@click="toggleRole"
>
{{ $t('trials:trials-myinfo:button:toggleRole') }} {{ $t('trials:trials-myinfo:button:toggleRole') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -115,11 +189,11 @@ export default {
callback( callback(
lang === 'zh' lang === 'zh'
? new Error( ? new Error(
'1用户名字符长度最小为4个字符最大为16个字符只可使用字母、数字、下划线' '1用户名字符长度最小为4个字符最大为16个字符只可使用字母、数字、下划线'
) )
: new Error( : new Error(
'the username must have:1) At least 4 characters;2) At most 16 characters;3)Only letters, numbers, and underscores are allowed.' 'the username must have:1) At least 4 characters;2) At most 16 characters;3)Only letters, numbers, and underscores are allowed.'
) )
) )
} else { } else {
callback() callback()
@ -271,26 +345,9 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.codeBtn {
color: #409EFF;
border-color: #409EFF;
margin-left: 10px;
}
.codeBtn.is-disabled,
.codeBtn.is-disabled:focus,
.codeBtn.is-disabled:hover {
color: #c0c4cc;
cursor: not-allowed;
background-image: none;
background-color: #fff;
border-color: #ebeef5;
}
.el-radio-group { .el-radio-group {
margin-top: 12px; margin-top: 12px;
} }
.el-radio { .el-radio {
width: 60px; width: 60px;
} }

View File

@ -39,22 +39,7 @@
<el-input v-model="searchData.Name" clearable style="width: 120px" /> <el-input v-model="searchData.Name" clearable style="width: 120px" />
</el-form-item> </el-form-item>
<!-- 签署人 --> <!-- 签署人 -->
<el-form-item :label="$t('trials:signRecords:table:user')" v-if="!isSystem"> <el-form-item :label="$t('trials:signRecords:table:user')" v-if="!isDoc">
<el-select v-model="searchData.UserId" clearable filterable style="width: 140px">
<el-option v-for="item of userOptions" :key="item.UserId" :label="item.RealName" :value="item.UserId">
<span style="float: left">{{ item.RealName || item.FullName }}</span>
<span style="
float: right;
color: #8492a6;
font-size: 13px;
margin-left: 5px;
">
{{ item.UserName }}
</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('trials:signRecords:table:user')" v-else-if="!isDoc">
<el-select v-model="searchData.UserId" clearable filterable style="width: 140px"> <el-select v-model="searchData.UserId" clearable filterable style="width: 140px">
<el-option v-for="item of userOptions" :key="item.ConfirmUserId" :label="item.FullName" <el-option v-for="item of userOptions" :key="item.ConfirmUserId" :label="item.FullName"
:value="item.ConfirmUserId"> :value="item.ConfirmUserId">

View File

@ -1,220 +0,0 @@
<template>
<div class="ImageManual">
<div class="config">
<div style="margin-bottom: 20px;font-weight: bold;">
{{ $t("trials:researchRecord:ImageManual:BasicQuestion") }}
</div>
<el-form size="small" :model="form" style="width:80%">
<el-form-item>
<el-checkbox v-model="form.AverageEngravingCycle">
{{ $t('trials:researchForm:form:engravingCycle') }}
</el-checkbox>
</el-form-item>
<el-form-item>
<el-checkbox v-model="form.IsConfirmImagingTechnologist"
@change="(val) => handleChange(val, 'IsConfirmImagingTechnologist')">
{{ $t('trials:researchForm:form:isQualified') }}
</el-checkbox>
</el-form-item>
<el-form-item>
<el-checkbox v-model="form.EfficacyEvaluatorType">
{{ $t('trials:researchForm:form:staffType') }}
</el-checkbox>
</el-form-item>
<el-form-item>
<el-checkbox v-model="form.IsFollowStudyParameters"
@change="(val) => handleChange(val, 'IsFollowStudyParameters')">
{{ $t('trials:researchForm:form:isFollowStudyParam') }}
</el-checkbox>
</el-form-item>
</el-form>
<div style="margin-bottom: 20px;font-weight: bold;">
{{ $t("trials:researchRecord:ImageManual:TableConfiguration") }}
</div>
<el-form size="small" :model="form" style="width:80%">
<el-form-item :label="$t('trials:researchRecord:ImageManual:Equipment')">
<el-radio-group v-model="form.IsCloseEquipmentSurvey">
<el-radio :label="item.value" v-for="item in $d.YesOrNo" :key="item.id">{{ item.label
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div style="margin-bottom: 20px;font-weight: bold;">
{{ $t("trials:researchRecord:ImageManual:Precautions") }}
</div>
<el-input type="textarea" :autosize="{ minRows: 4, maxRows: 99 }" placeholder=""
v-model="form.ReplaceContent" @input="handleInput" style="width: 70%;" />
<div style="text-align: right;margin: 20px;">
<el-button type="primary" :loading="loading" size="small" @click="handleSave">
{{ $t('common:button:save') }}
</el-button>
</div>
</div>
<div class="preview">
<researchForm ref="ResearchForm" :trialSiteSurveyId="trialSiteSurveyId" />
</div>
</div>
</template>
<script>
import researchForm from '@/views/research/components/ResearchForm'
import { updateTrialExtralConfig, getTrialExtralConfig, getTrialDocumentList } from "@/api/trials"
export default {
name: "ImageManual",
components: { researchForm },
props: {
trialSiteSurveyId: {
type: String,
default: ''
}
},
data() {
return {
form: {
AverageEngravingCycle: false,
IsConfirmImagingTechnologist: false,
NotConfirmReson: false,
EfficacyEvaluatorType: false,
IsFollowStudyParameters: false,
NotFollowReson: false,
ReplaceContent: '',
ReplaceContentCN: '',
IsOpenLostVistRead: false,
IsSupportQCDownloadImage: false,
IsCloseEquipmentSurvey: true
},
obj: {
AverageEngravingCycle: false,
IsConfirmImagingTechnologist: false,
NotConfirmReson: false,
EfficacyEvaluatorType: false,
IsFollowStudyParameters: false,
NotFollowReson: false,
},
loading: false
}
},
mounted() {
this.getInfo()
},
methods: {
handleChange(val, key) {
if (key === 'IsConfirmImagingTechnologist') this.form.NotConfirmReson = val
if (key === 'IsFollowStudyParameters') this.form.NotFollowReson = val
},
handleInput(val) {
this.form.ReplaceContentCN = val
},
async getInfo() {
try {
let param = {
TrialId: this.$route.query.trialId
}
let res = await getTrialExtralConfig(param)
if (res.IsSuccess) {
Object.keys(this.form).forEach(key => {
this.form[key] = true
if (key === 'ReplaceContent' || key === 'ReplaceContentCN') this.form[key] = ''
})
this.form.IsOpenLostVistRead = res.Result.IsOpenLostVistRead
this.form.IsSupportQCDownloadImage = res.Result.IsSupportQCDownloadImage
this.form.IsCloseEquipmentSurvey = res.Result.IsCloseEquipmentSurvey
if (Array.isArray(res.Result.NotShowFieldList) && res.Result.NotShowFieldList.length > 0) {
res.Result.NotShowFieldList.forEach(key => {
this.form[key] = false
})
}
if (Array.isArray(res.Result.ModifyFiledList) && res.Result.ModifyFiledList.length > 0) {
this.form.ReplaceContent = res.Result.ModifyFiledList[0].ReplaceContent.split('<p>').join('').split('</p>').filter(item => isNaN(item)).join("\n")
this.form.ReplaceContentCN = res.Result.ModifyFiledList[0].ReplaceContentCN.split('<p>').join('').split('</p>').filter(item => isNaN(item)).join("\n")
} else {
let arr = [this.$t('trials:equiptResearch:form:item1'), this.$t('trials:equiptResearch:form:item2'), this.$t('trials:equiptResearch:form:item3'), this.$t('trials:equiptResearch:form:item4')]
this.form.ReplaceContent = arr.join("\n")
this.form.ReplaceContentCN = arr.join("\n")
}
}
} catch (err) {
console.log(err)
}
},
async getTrialDocumentList() {
try {
let data = {
PageIndex: 1,
PageSize: 20,
TrialId: this.$route.query.trialId,
IsPublish: true,
FileTypeCode: 4,
IsDeleted: false
}
let res = await getTrialDocumentList(data)
if (res.IsSuccess) {
const { CurrentPageData } = res.Result
if (CurrentPageData.length <= 0) this.$message.warning(this.$t("trials:researchRecord:ImageManual:message:noImageManual"))
}
} catch (err) {
console.log(err)
}
},
async handleSave() {
try {
let param = {
TrialId: this.$route.query.trialId
}
let data = {
IsOpenLostVistRead: this.form.IsOpenLostVistRead,
IsSupportQCDownloadImage: this.form.IsSupportQCDownloadImage,
IsCloseEquipmentSurvey: this.form.IsCloseEquipmentSurvey,
ModifyFiledList: [],
NotShowFieldList: []
}
Object.keys(this.obj).forEach(key => {
if (!this.form[key]) data.NotShowFieldList.push(key)
})
let ReplaceContent = ''
this.form.ReplaceContent.split("\n").forEach(item => {
ReplaceContent += `<p>${item}</p>`
})
let ReplaceContentCN = ''
this.form.ReplaceContentCN.split("\n").forEach(item => {
ReplaceContentCN += `<p>${item}</p>`
})
let obj = {
NeedModifyFiled: 'SiteSurveyNote',
ReplaceContent: ReplaceContent,
ReplaceContentCN: ReplaceContentCN,
}
data.ModifyFiledList.push(obj)
this.loading = true
let res = await updateTrialExtralConfig(param, data)
this.loading = false
if (res.IsSuccess) {
this.$refs.ResearchForm.initPage()
if (!data.NotShowFieldList.includes('IsFollowStudyParameters')) this.getTrialDocumentList()
}
} catch (err) {
this.loading = false
console.log(err)
}
}
}
}
</script>
<style lang="scss" scoped>
.ImageManual {
width: 100%;
height: 100%;
display: flex;
.config,
.preview {
width: 50%;
height: 100%;
overflow-y: auto;
}
.config {
border-right: 1px solid #EBEEF5;
}
}
</style>

View File

@ -5,62 +5,127 @@
<el-form :inline="true"> <el-form :inline="true">
<!-- 中心 --> <!-- 中心 -->
<el-form-item :label="$t('trials:researchRecord:table:siteId')"> <el-form-item :label="$t('trials:researchRecord:table:siteId')">
<el-select v-model="searchData.TrialSiteId" clearable filterable style="width: 120px"> <el-select
<el-option v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteCode" v-model="searchData.TrialSiteId"
:value="item.TrialSiteId" /> clearable
filterable
style="width: 120px"
>
<el-option
v-for="(item, index) of siteOptions"
:key="index"
:label="item.TrialSiteCode"
:value="item.TrialSiteId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 联系人 --> <!-- 联系人 -->
<el-form-item :label="$t('trials:researchRecord:table:contactor')"> <el-form-item :label="$t('trials:researchRecord:table:contactor')">
<el-input v-model="searchData.UserKeyInfo" class="mr" clearable :placeholder="`${$t( <el-input
'trials:researchRecord:placeholder:contactorInfo' v-model="searchData.UserKeyInfo"
)}`" style="width: 140px" /> class="mr"
clearable
:placeholder="`${$t(
'trials:researchRecord:placeholder:contactorInfo'
)}`"
style="width: 140px"
/>
</el-form-item> </el-form-item>
<!-- 初审人 --> <!-- 初审人 -->
<el-form-item :label="$t('trials:researchRecord:table:preliminaryUser')"> <el-form-item
<el-input v-model="searchData.PreliminaryUserName" class="mr" clearable style="width: 140px" /> :label="$t('trials:researchRecord:table:preliminaryUser')"
>
<el-input
v-model="searchData.PreliminaryUserName"
class="mr"
clearable
style="width: 140px"
/>
</el-form-item> </el-form-item>
<!-- 审核人 --> <!-- 审核人 -->
<el-form-item :label="$t('trials:researchRecord:table:ReviewerUser')"> <el-form-item :label="$t('trials:researchRecord:table:ReviewerUser')">
<el-input v-model="searchData.ReviewerUserName" class="mr" clearable style="width: 140px" /> <el-input
v-model="searchData.ReviewerUserName"
class="mr"
clearable
style="width: 140px"
/>
</el-form-item> </el-form-item>
<!-- 状态 --> <!-- 状态 -->
<el-form-item :label="$t('trials:researchRecord:table:status')"> <el-form-item :label="$t('trials:researchRecord:table:status')">
<el-select v-model="searchData.State" clearable filterable style="width: 120px"> <el-select
<el-option v-for="(item, index) of $d.ResearchRecord" :key="index" :label="item.label" v-model="searchData.State"
:value="item.value" /> clearable
filterable
style="width: 120px"
>
<el-option
v-for="(item, index) of $d.ResearchRecord"
:key="index"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 是否废除 --> <!-- 是否废除 -->
<el-form-item :label="$t('trials:researchRecord:table:isDeleted')"> <el-form-item :label="$t('trials:researchRecord:table:isDeleted')">
<el-select v-model="searchData.IsDeleted" clearable filterable style="width: 120px"> <el-select
<el-option v-for="item of $d.YesOrNo" v-show="item.raw.ValueCN !== ''" :key="`IsDeleted${item.value}`" v-model="searchData.IsDeleted"
:label="item.label" :value="item.value" /> clearable
filterable
style="width: 120px"
>
<el-option
v-for="item of $d.YesOrNo"
v-show="item.raw.ValueCN !== '无'"
:key="`IsDeleted${item.value}`"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 更新时间 --> <!-- 更新时间 -->
<el-form-item :label="$t('trials:researchRecord:table:updateTime')"> <el-form-item :label="$t('trials:researchRecord:table:updateTime')">
<el-date-picker v-model="searchData.DateRange" type="daterange" value-format="yyyy-MM-dd" format="yyyy-MM-dd" <el-date-picker
style="width: 250px" /> v-model="searchData.DateRange"
type="daterange"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
style="width: 250px"
/>
</el-form-item> </el-form-item>
<!-- 查询 --> <!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch"> <el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t('common:button:search') }} {{ $t('common:button:search') }}
</el-button> </el-button>
<!-- 重置 --> <!-- 重置 -->
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset"> <el-button
type="primary"
icon="el-icon-refresh-left"
@click="handleReset"
>
{{ $t('common:button:reset') }} {{ $t('common:button:reset') }}
</el-button> </el-button>
<!-- 中心人员 --> <!-- 中心人员 -->
<el-button v-hasPermi="[ <el-button
'trials:trials-panel:attachments:site-research:summary-record', v-hasPermi="[
]" type="primary" icon="el-icon-info" @click="showResearchUser"> 'trials:trials-panel:attachments:site-research:summary-record',
]"
type="primary"
icon="el-icon-info"
@click="showResearchUser"
>
{{ $t('trials:researchRecord:button:questionStaffs') }} {{ $t('trials:researchRecord:button:questionStaffs') }}
</el-button> </el-button>
<!-- 调查表链接 --> <!-- 调查表链接 -->
<el-button v-hasPermi="[ <el-button
'trials:trials-panel:attachments:site-research:questionnaire-link', v-hasPermi="[
]" type="primary" icon="el-icon-link" @click="showResearchLink"> 'trials:trials-panel:attachments:site-research:questionnaire-link',
]"
type="primary"
icon="el-icon-link"
@click="showResearchLink"
>
{{ $t('trials:researchRecord:button:questionLink') }} {{ $t('trials:researchRecord:button:questionLink') }}
</el-button> </el-button>
</el-form> </el-form>
@ -68,27 +133,61 @@
<template slot="main-container"> <template slot="main-container">
<!-- 系统文件列表 --> <!-- 系统文件列表 -->
<el-table ref="siteResearchList" v-loading="loading" v-adaptive="{ bottomOffset: 60 }" :data="list" stripe <el-table
height="100" @sort-change="handleSortByColumn"> ref="siteResearchList"
v-loading="loading"
v-adaptive="{ bottomOffset: 60 }"
:data="list"
stripe
height="100"
@sort-change="handleSortByColumn"
>
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50" />
<!-- 中心编号 --> <!-- 中心编号 -->
<el-table-column prop="TrialSiteCode" :label="$t('trials:researchRecord:table:siteId')" min-width="100" <el-table-column
sortable="custom" show-overflow-tooltip /> prop="TrialSiteCode"
:label="$t('trials:researchRecord:table:siteId')"
min-width="100"
sortable="custom"
show-overflow-tooltip
/>
<!-- 中心名称 --> <!-- 中心名称 -->
<el-table-column prop="SiteName" :label="$t('trials:researchRecord:table:siteName')" min-width="100" <el-table-column
sortable="custom" show-overflow-tooltip /> prop="SiteName"
:label="$t('trials:researchRecord:table:siteName')"
min-width="100"
sortable="custom"
show-overflow-tooltip
/>
<!-- 联系人 --> <!-- 联系人 -->
<el-table-column prop="UserName" :label="$t('trials:researchRecord:table:contactor')" min-width="100" <el-table-column
sortable="custom" show-overflow-tooltip /> prop="UserName"
:label="$t('trials:researchRecord:table:contactor')"
min-width="100"
sortable="custom"
show-overflow-tooltip
/>
<!-- 联系电话 --> <!-- 联系电话 -->
<el-table-column prop="Phone" :label="$t('trials:researchRecord:table:contactorPhone')" min-width="100" <el-table-column
show-overflow-tooltip /> prop="Phone"
:label="$t('trials:researchRecord:table:contactorPhone')"
min-width="100"
show-overflow-tooltip
/>
<!-- 联系邮箱 --> <!-- 联系邮箱 -->
<el-table-column prop="Email" :label="$t('trials:researchRecord:table:contactorEmail')" min-width="150" <el-table-column
show-overflow-tooltip /> prop="Email"
:label="$t('trials:researchRecord:table:contactorEmail')"
min-width="150"
show-overflow-tooltip
/>
<!-- 初审人 --> <!-- 初审人 -->
<el-table-column prop="preliminaryUser" :label="$t('trials:researchRecord:table:preliminaryUser')" <el-table-column
min-width="150" show-overflow-tooltip> prop="preliminaryUser"
:label="$t('trials:researchRecord:table:preliminaryUser')"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ {{
scope.row.PreliminaryUser scope.row.PreliminaryUser
@ -98,15 +197,24 @@
</template> </template>
</el-table-column> </el-table-column>
<!-- 审核人 --> <!-- 审核人 -->
<el-table-column prop="ReviewerUser" :label="$t('trials:researchRecord:table:ReviewerUser')" min-width="150" <el-table-column
show-overflow-tooltip> prop="ReviewerUser"
:label="$t('trials:researchRecord:table:ReviewerUser')"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.ReviewerUser ? scope.row.ReviewerUser.RealName : '' }} {{ scope.row.ReviewerUser ? scope.row.ReviewerUser.RealName : '' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 状态 --> <!-- 状态 -->
<el-table-column prop="State" :label="$t('trials:researchRecord:table:status')" min-width="150" <el-table-column
sortable="custom" show-overflow-tooltip> prop="State"
:label="$t('trials:researchRecord:table:status')"
min-width="150"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="scope.row.State === 0" type="primary">{{ <el-tag v-if="scope.row.State === 0" type="primary">{{
$fd('ResearchRecord', scope.row.State) $fd('ResearchRecord', scope.row.State)
@ -123,8 +231,13 @@
</template> </template>
</el-table-column> </el-table-column>
<!-- 是否废除 --> <!-- 是否废除 -->
<el-table-column prop="IsDeleted" :label="$t('trials:researchRecord:table:isDeleted')" min-width="100" <el-table-column
sortable="custom" show-overflow-tooltip> prop="IsDeleted"
:label="$t('trials:researchRecord:table:isDeleted')"
min-width="100"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="scope.row.IsDeleted" type="danger">{{ <el-tag v-if="scope.row.IsDeleted" type="danger">{{
$fd('YesOrNo', scope.row.IsDeleted) $fd('YesOrNo', scope.row.IsDeleted)
@ -135,59 +248,88 @@
</template> </template>
</el-table-column> </el-table-column>
<!-- 更新时间 --> <!-- 更新时间 -->
<el-table-column prop="UpdateTime" :label="$t('trials:researchRecord:table:updateTime')" min-width="150" <el-table-column
show-overflow-tooltip sortable="custom" /> prop="UpdateTime"
:label="$t('trials:researchRecord:table:updateTime')"
min-width="150"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column width="150"> <el-table-column width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- 查看 --> <!-- 查看 -->
<el-button :disabled="scope.row.State !== 3" circle :title="$t('common:button:view')" icon="el-icon-view" <el-button
@click="handleViewResearchList(scope.row)" /> :disabled="scope.row.State !== 3"
circle
:title="$t('common:button:view')"
icon="el-icon-view"
@click="handleViewResearchList(scope.row)"
/>
<!-- 审批 --> <!-- 审批 -->
<el-button v-hasPermi="[ <el-button
'trials:trials-panel:attachments:site-research:auidt', v-hasPermi="[
]" :disabled="scope.row.State === 0 || scope.row.State === 3 || scope.row.IsDeleted" circle 'trials:trials-panel:attachments:site-research:auidt',
:title="$t('trials:researchRecord:action:view')" icon="el-icon-s-check" ]"
@click="handleViewResearchList(scope.row)" /> :disabled="scope.row.State === 0 || scope.row.State === 3 || scope.row.IsDeleted"
circle
:title="$t('trials:researchRecord:action:view')"
icon="el-icon-s-check"
@click="handleViewResearchList(scope.row)"
/>
<!-- 废除 --> <!-- 废除 -->
<el-button v-hasPermi="[ <el-button
'trials:trials-panel:attachments:site-research:abolish', v-hasPermi="[
]" :disabled="scope.row.State !== 0 || scope.row.IsDeleted" circle 'trials:trials-panel:attachments:site-research:abolish',
:title="$t('trials:researchRecord:action:abolish')" icon="el-icon-delete" ]"
@click="handleRepealResearch(scope.row)" /> :disabled="scope.row.State !== 0 || scope.row.IsDeleted"
circle
:title="$t('trials:researchRecord:action:abolish')"
icon="el-icon-delete"
@click="handleRepealResearch(scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页组件 --> <!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" <pagination
@pagination="getList" /> class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</template> </template>
<!-- 中心人员 --> <!-- 中心人员 -->
<el-dialog v-if="researchUserVisible" :visible.sync="researchUserVisible" <el-dialog
:title="$t('trials:researchRecord:dialogTitle:questionStaff')" custom-class="base-dialog-wrapper" v-if="researchUserVisible"
:fullscreen="true"> :visible.sync="researchUserVisible"
<div class="base-modal-body" style="border: 1px solid #ccc; padding: 10px"> :title="$t('trials:researchRecord:dialogTitle:questionStaff')"
custom-class="base-dialog-wrapper"
:fullscreen="true"
>
<div
class="base-modal-body"
style="border: 1px solid #ccc; padding: 10px"
>
<Users v-if="researchUserVisible" /> <Users v-if="researchUserVisible" />
</div> </div>
</el-dialog> </el-dialog>
<!-- 调查表 --> <!-- 调查表 -->
<el-dialog v-if="researchInfoVisible" :visible.sync="researchInfoVisible" :fullscreen="true" <el-dialog
:close-on-click-modal="false"> v-if="researchInfoVisible"
:visible.sync="researchInfoVisible"
:fullscreen="true"
:close-on-click-modal="false"
>
<research-form v-if="researchInfoVisible" @refreshPage="getList" /> <research-form v-if="researchInfoVisible" @refreshPage="getList" />
</el-dialog> </el-dialog>
<!-- 调查表编辑 -->
<el-dialog v-if="ImageManualVisible" :visible.sync="ImageManualVisible" :fullscreen="true"
:close-on-click-modal="false" :title="$t('trials:researchRecord:dialogTitle:ImageManualEdit')">
<ImageManual v-if="ImageManualVisible" :trialSiteSurveyId="trialSiteSurveyId" @getList="getList" />
</el-dialog>
<!-- 调查表链接 --> <!-- 调查表链接 -->
<base-model :config="share_model"> <base-model :config="share_model">
<template slot="dialog-body"> <template slot="dialog-body">
<el-button size="small" type="primary" style="margin-bottom: 10px;" @click.stop="openImageManual">{{
$t('trials:researchRecord:label:edit')
}}</el-button>
<div style="width: 100%; display: flex"> <div style="width: 100%; display: flex">
<div class="shareLink"> <div class="shareLink">
<!-- <div> <!-- <div>
@ -199,11 +341,22 @@
<div style="margin: 10px 0"> <div style="margin: 10px 0">
<!-- 链接 --> <!-- 链接 -->
{{ $t('trials:researchRecord:label:link') }} {{ $t('trials:researchRecord:label:link') }}
<el-input ref="shareLink" v-model="shareLink" readonly type="textarea" autosize /> <el-input
ref="shareLink"
v-model="shareLink"
readonly
type="textarea"
autosize
/>
</div> </div>
<div> <div>
<!-- 复制链接 --> <!-- 复制链接 -->
<el-button type="primary" round @click="copyLink" class="shareLinkBtn"> <el-button
type="primary"
round
@click="copyLink"
class="shareLinkBtn"
>
{{ $t('trials:researchRecord:button:copyLink') }} {{ $t('trials:researchRecord:button:copyLink') }}
</el-button> </el-button>
</div> </div>
@ -238,7 +391,6 @@ import Pagination from '@/components/Pagination'
import Users from './components/users' import Users from './components/users'
import ResearchForm from '@/views/research/form' import ResearchForm from '@/views/research/form'
import BaseModel from '@/components/BaseModel' import BaseModel from '@/components/BaseModel'
import ImageManual from './components/ImageManual'
import QRCode from 'qrcodejs2' import QRCode from 'qrcodejs2'
const searchDataDefault = () => { const searchDataDefault = () => {
@ -258,7 +410,7 @@ const searchDataDefault = () => {
} }
export default { export default {
name: 'SiteResearchList', name: 'SiteResearchList',
components: { BaseContainer, Pagination, Users, ResearchForm, BaseModel, ImageManual }, components: { BaseContainer, Pagination, Users, ResearchForm, BaseModel },
data() { data() {
return { return {
searchData: searchDataDefault(), searchData: searchDataDefault(),
@ -277,9 +429,6 @@ export default {
shareLink: '', shareLink: '',
researchState: this.$d.ResearchRecord, researchState: this.$d.ResearchRecord,
qrcode: null, qrcode: null,
ImageManualVisible: false,
trialSiteSurveyId: null
} }
}, },
mounted() { mounted() {
@ -287,10 +436,6 @@ export default {
this.getSite() this.getSite()
}, },
methods: { methods: {
openImageManual() {
// if (!this.trialSiteSurveyId) return false
this.ImageManualVisible = true
},
// //
getList() { getList() {
this.loading = true this.loading = true
@ -343,7 +488,8 @@ export default {
copyLink() { copyLink() {
// //
this.$copyText( this.$copyText(
`${this.$t('trials:researchRecord:message:researchFormLink')}: ${this.shareLink `${this.$t('trials:researchRecord:message:researchFormLink')}: ${
this.shareLink
}` }`
) )
.then((res) => { .then((res) => {
@ -418,7 +564,6 @@ export default {
const trialId = this.trialId const trialId = this.trialId
this.shareLink = `${location.protocol}//${location.host}/researchLogin?trialId=${trialId}&lang=${this.$i18n.locale}` this.shareLink = `${location.protocol}//${location.host}/researchLogin?trialId=${trialId}&lang=${this.$i18n.locale}`
this.share_model.visible = true this.share_model.visible = true
// this.trialSiteSurveyId = this.list[0].Id
this.$nextTick(() => { this.$nextTick(() => {
this.creatQrCode() this.creatQrCode()
}) })
@ -466,21 +611,18 @@ export default {
padding-right: 20px; padding-right: 20px;
width: 50%; width: 50%;
position: relative; position: relative;
.shareLinkBtn { .shareLinkBtn {
position: absolute; position: absolute;
bottom: 0px; bottom: 0px;
left: 0px; left: 0px;
} }
} }
.shareCode { .shareCode {
width: 50%; width: 50%;
border-left: 1px solid #eee; border-left: 1px solid #eee;
display: flex; display: flex;
justify-content: center; justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
.qrCode { .qrCode {
width: 220px; width: 220px;
height: 220px; height: 220px;
@ -491,7 +633,6 @@ export default {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.codeBtnBox { .codeBtnBox {
margin-top: 20px; margin-top: 20px;
width: 100%; width: 100%;

View File

@ -21,7 +21,7 @@
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" @click=" <el-button type="text" @click="
go( go(
`/trialsResume?doctorId=${scope.row.DoctorId}&token=${token}&trialId=${$route.query.trialId}` `/trialsResume?doctorId=${scope.row.DoctorId}&token=${token}`
) )
">{{ scope.row.LastName }} / {{ scope.row.FirstName }}</el-button> ">{{ scope.row.LastName }} / {{ scope.row.FirstName }}</el-button>
</template> </template>

View File

@ -1,5 +1,10 @@
<template> <template>
<el-form v-if="isRender" ref="assessmentForm" :model="form" size="small"> <el-form
v-if="isRender"
ref="assessmentForm"
:model="form"
size="small"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<!-- <div v-for="qs in questions" :key="qs.Id"> <!-- <div v-for="qs in questions" :key="qs.Id">
<h4 v-if="qs.Type === 'group'">{{ qs.GroupName }}</h4> <h4 v-if="qs.Type === 'group'">{{ qs.GroupName }}</h4>
@ -37,9 +42,14 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</div> --> </div> -->
<AssessmentFormItem v-for="question of questions" :key="question.Id" :question="question" :question-form="form" <AssessmentFormItem
:readingTaskState="readingTaskState" @setFormItemData="setFormItemData" v-for="question of questions"
@resetFormItemData="resetFormItemData" /> :key="question.Id"
:question="question"
:question-form="form"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</div> </div>
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;"> <div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
@ -47,7 +57,11 @@
<el-button size="small" @click="handleCancel"> <el-button size="small" @click="handleCancel">
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<el-button size="small" type="primary" v-if="readingTaskState < 2" @click="handleSave"> <el-button
size="small"
type="primary"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -71,14 +85,6 @@ export default {
default() { default() {
return [] return []
} }
},
readingTaskState: {
type: Number,
default: 0
},
additionalAssessmentsType: {
type: String,
default: 'edit'
} }
}, },
data() { data() {
@ -120,7 +126,7 @@ export default {
} }
const res = await submitTaskAdditionalQuestion(params) const res = await submitTaskAdditionalQuestion(params)
if (res.IsSuccess) { if (res.IsSuccess) {
this.$emit('sign', this.additionalAssessmentsType) this.$emit('sign')
} }
loading.close() loading.close()
} catch (e) { } catch (e) {

View File

@ -1,39 +1,67 @@
<template> <template>
<div> <div>
<div v-if="!!question.GroupName && question.Type === 'group'"> <div
v-if="!!question.GroupName && question.Type==='group'"
>
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;font-size: 15px;"> <h4 style="color: #ddd;padding: 5px 0px;margin: 0;font-size: 15px;">
{{ language === 'en' ? question.GroupEnName : question.GroupName }} {{ language==='en'?question.GroupEnName:question.GroupName }}
</h4> </h4>
</div> </div>
<template v-else> <template v-else>
<el-form-item :label="`${language === 'en' ? question.QuestionEnName : question.QuestionName}`" <el-form-item
:prop="question.Id" :rules="[ :label="`${language==='en'?question.QuestionEnName:question.QuestionName}`"
{ :prop="question.Id"
required: true, :rules="[
message: $t('common:ruleMessage:select'), trigger: ['blur', 'change'] { required: true,
}, message: $t('common:ruleMessage:select'), trigger: ['blur', 'change']},
]" :class="[question.Type === 'group' ? 'mb' : '']"> ]"
:class="[question.Type==='group'?'mb':'']"
>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select v-if="question.Type === 'select'" v-model="questionForm[question.Id]" clearable <el-select
@change="((val) => { formItemChange(val, question) })" :disabled="readingTaskState >= 2"> v-if="question.Type==='select'"
v-model="questionForm[question.Id]"
clearable
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.DictionaryCode"> <template v-if="question.DictionaryCode">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" <el-option
:label="item.label" /> v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group v-if="question.Type === 'radio'" v-model="questionForm[question.Id]" <el-radio-group
@change="((val) => { formItemChange(val, question) })" :disabled="readingTaskState >= 2"> v-if="question.Type==='radio'"
v-model="questionForm[question.Id]"
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.DictionaryCode"> <template v-if="question.DictionaryCode">
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)"> <el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</template> </template>
<template v-else-if="question.TypeValue"> <template v-else-if="question.TypeValue">
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val"> <el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</template> </template>
@ -41,9 +69,14 @@
</el-form-item> </el-form-item>
</template> </template>
<AssessmentFormItem v-for="(item) in question.Childrens" :key="item.Id" :question="item" <AssessmentFormItem
:readingTaskState="readingTaskState" :question-form="questionForm" @setFormItemData="setFormItemData" v-for="(item) in question.Childrens"
@resetFormItemData="resetFormItemData" /> :key="item.Id"
:question="item"
:question-form="questionForm"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</div> </div>
</template> </template>
<script> <script>
@ -62,10 +95,6 @@ export default {
default() { default() {
return [] return []
} }
},
readingTaskState: {
type: Number,
default: 0
} }
}, },
data() { data() {
@ -110,7 +139,7 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.mb { .mb{
margin-bottom: 0px; margin-bottom: 0px;
} }
</style> </style>

View File

@ -1194,7 +1194,7 @@ export default {
cornerstoneTools.addToolForElement(element, cornerstoneTools.WwwcRegionTool) cornerstoneTools.addToolForElement(element, cornerstoneTools.WwwcRegionTool)
} }
if (!cornerstoneTools.getToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool)) { if (!cornerstoneTools.getToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool)) {
cornerstoneTools.addToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool, { configuration: { loop: true, } }) cornerstoneTools.addToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool)
} }
cornerstoneTools.setToolActiveForElement(element, 'StackScrollMouseWheel', {}) cornerstoneTools.setToolActiveForElement(element, 'StackScrollMouseWheel', {})
@ -1307,9 +1307,6 @@ export default {
this.isFirstLoadIns = false this.isFirstLoadIns = false
// this.initWwc() // this.initWwc()
this.imageId = instanceId this.imageId = instanceId
if (this.isInitWwwc) {
this.resetWwwc()
}
} }
this.stack.instanceId = instanceId this.stack.instanceId = instanceId
@ -1329,6 +1326,9 @@ export default {
this.scrollSyncInfo.offset = 0 this.scrollSyncInfo.offset = 0
} }
this.renderMeasuredData(e) this.renderMeasuredData(e)
if (this.isInitWwwc) {
this.resetWwwc()
}
}, },
getOrientationMarker(element) { getOrientationMarker(element) {
const enabledElement = cornerstone.getEnabledElement(element) const enabledElement = cornerstone.getEnabledElement(element)
@ -1708,7 +1708,7 @@ export default {
resetWwwc() { resetWwwc() {
// console.log('resetWwwc') // console.log('resetWwwc')
this.isInitWwwc = true this.isInitWwwc = true
// this.toolState.viewportInvert = false this.toolState.viewportInvert = false
var viewport = cornerstone.getViewport(this.canvas) var viewport = cornerstone.getViewport(this.canvas)
// viewport.invert = false // viewport.invert = false
var image = cornerstone.getImage(this.canvas) var image = cornerstone.getImage(this.canvas)
@ -1839,9 +1839,6 @@ export default {
// console.log(toolName) // console.log(toolName)
// cornerstoneTools.setToolPassiveForElement(this.canvas, toolName) // cornerstoneTools.setToolPassiveForElement(this.canvas, toolName)
// }) // })
if (toolName === 'Wwwc') {
this.isInitWwwc = false
}
this.activeToolName = toolName this.activeToolName = toolName
this.$nextTick(() => { this.$nextTick(() => {
// console.log(cornerstoneTools.isToolActiveForElement(this.canvas, 'Bidirectional')) // console.log(cornerstoneTools.isToolActiveForElement(this.canvas, 'Bidirectional'))

View File

@ -214,25 +214,56 @@
<!-- @dblclick.native="reloadViewport('CT_AXIAL')" --> <!-- @dblclick.native="reloadViewport('CT_AXIAL')" -->
<div ref="dicomContainer" class="dicom-container box box_2_2" style="position: relative;" <div ref="dicomContainer" class="dicom-container box box_2_2" style="position: relative;"
@dblclick="reloadViewport"> @dblclick="reloadViewport">
<Viewport ref="CT_AXIAL" :index="1" :active-index="activeIndex" <Viewport
:is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="ctSeries" ref="CT_AXIAL"
:rendering-engine-id="renderingEngineId" viewport-id="CT_AXIAL" :volume="ctVolume" :index="1"
:measure-datas="measureDatas" :style="1 === activeIndex ? viewportStyle : {}" :active-index="activeIndex"
@upperRangeChange="upperRangeChange" /> :is-reading-show-subject-info="isReadingShowSubjectInfo"
<Viewport ref="PT_AXIAL" :index="2" :active-index="activeIndex" :series-info="ctSeries"
:is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries" :rendering-engine-id="renderingEngineId"
:rendering-engine-id="renderingEngineId" viewport-id="PT_AXIAL" :volume="ptVolume" viewport-id="CT_AXIAL" :volume="ctVolume"
:measure-datas="measureDatas" :style="2 === activeIndex ? viewportStyle : {}" :measure-datas="measureDatas"
@upperRangeChange="upperRangeChange" /> :style="1 === activeIndex ? viewportStyle : {}"
<Viewport ref="FUSION_AXIAL" :index="3" :active-index="activeIndex" @upperRangeChange="upperRangeChange"
:is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries" />
:rendering-engine-id="renderingEngineId" viewport-id="FUSION_AXIAL" :volume="ptVolume" <Viewport
:measure-datas="measureDatas" :rgb-preset-name="rgbPresetName" :style="3 === activeIndex ? viewportStyle : {}" ref="PT_AXIAL"
@upperRangeChange="upperRangeChange" /> :index="2"
<Viewport ref="PET_MIP_CORONAL" :index="4" :active-index="activeIndex" :active-index="activeIndex"
:is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries" :is-reading-show-subject-info="isReadingShowSubjectInfo"
:rendering-engine-id="renderingEngineId" viewport-id="PET_MIP_CORONAL" :measure-datas="measureDatas" :series-info="petSeries"
:style="4 === activeIndex ? viewportStyle : {}" @upperRangeChange="upperRangeChange" /> :rendering-engine-id="renderingEngineId"
viewport-id="PT_AXIAL"
:volume="ptVolume"
:measure-datas="measureDatas"
:style="2 === activeIndex ? viewportStyle : {}"
@upperRangeChange="upperRangeChange"
/>
<Viewport
ref="FUSION_AXIAL"
:index="3"
:active-index="activeIndex"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:series-info="petSeries"
:rendering-engine-id="renderingEngineId"
viewport-id="FUSION_AXIAL"
:volume="ptVolume"
:measure-datas="measureDatas"
:rgb-preset-name="rgbPresetName"
:style="3 === activeIndex ? viewportStyle : {}"
@upperRangeChange="upperRangeChange"
/>
<Viewport
ref="PET_MIP_CORONAL"
:index="4"
:active-index="activeIndex"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:series-info="petSeries"
:rendering-engine-id="renderingEngineId"
viewport-id="PET_MIP_CORONAL" :measure-datas="measureDatas"
:style="4 === activeIndex ? viewportStyle : {}"
@upperRangeChange="upperRangeChange"
/>
</div> </div>
<!-- 表单 --> <!-- 表单 -->
<div class="form-container" style="overflow-y: auto;"> <div class="form-container" style="overflow-y: auto;">
@ -242,22 +273,19 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<TableQuestions ref="tableQuestions" @handleReadingChart="handleReadingChart" /> <TableQuestions ref="tableQuestions" />
<Questions ref="questions" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" <Questions ref="questions" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
@handleReadingChart="handleReadingChart" />
</div> </div>
</div> </div>
</div> </div>
<el-dialog v-if="customWwc.visible" :visible.sync="customWwc.visible" :close-on-click-modal="false" <el-dialog v-if="customWwc.visible" :visible.sync="customWwc.visible" :close-on-click-modal="false"
:title="customWwc.title" width="400px" custom-class="base-dialog-wrapper"> :title="customWwc.title" width="400px" custom-class="base-dialog-wrapper">
<custom-wwwc-form :ww="activeCanvasWW" :wc="activeCanvasWC" @close="customWwc.visible = false" <custom-wwwc-form :ww="activeCanvasWW" :wc="activeCanvasWC" @close="customWwc.visible = false" @setWwwc="setWwwc" />
@setWwwc="setWwwc" />
</el-dialog> </el-dialog>
<el-dialog :visible.sync="fusion.visible" :close-on-click-modal="false" :title="$t('trials:lugano:button:record')" <el-dialog :visible.sync="fusion.visible" :close-on-click-modal="false" :title="$t('trials:lugano:button:record')"
width="850px"> width="850px">
<fusion-form @close="fusion.visible = false" /> <fusion-form @close="fusion.visible = false" />
</el-dialog> </el-dialog>
<readingChart ref="readingChart" />
</div> </div>
</template> </template>
<script> <script>
@ -305,7 +333,6 @@ import vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunc
// import vtkOrientationMarkerWidget from '@kitware/vtk.js/Interaction/Widgets/OrientationMarkerWidget' // import vtkOrientationMarkerWidget from '@kitware/vtk.js/Interaction/Widgets/OrientationMarkerWidget'
import { mat4, vec3 } from 'gl-matrix' import { mat4, vec3 } from 'gl-matrix'
import html2canvas from 'html2canvas' import html2canvas from 'html2canvas'
import readingChart from '@/components/readingChart'
// import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction' // import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'
// import vtkMath from '@kitware/vtk.js/Common/Core/Math' // import vtkMath from '@kitware/vtk.js/Common/Core/Math'
// import CircleROITool from './tools/CircleROITool' // import CircleROITool from './tools/CircleROITool'
@ -393,8 +420,7 @@ export default {
Questions, Questions,
TableQuestions, TableQuestions,
CustomWwwcForm, CustomWwwcForm,
FusionForm, FusionForm
readingChart
}, },
data() { data() {
return { return {
@ -556,7 +582,6 @@ export default {
this.screenshotWindow = window.open(routeData.href, '_blank') this.screenshotWindow = window.open(routeData.href, '_blank')
}) })
window.addEventListener('beforeunload', e => { this.beforeUnloadHandler(e) }) window.addEventListener('beforeunload', e => { this.beforeUnloadHandler(e) })
document.addEventListener("click", this.foo);
}, },
beforeDestroy() { beforeDestroy() {
if (this.screenshotWindow) { if (this.screenshotWindow) {
@ -579,21 +604,7 @@ export default {
window.removeEventListener('beforeunload', e => { this.beforeUnloadHandler(e) }) window.removeEventListener('beforeunload', e => { this.beforeUnloadHandler(e) })
}, },
methods: { methods: {
handleReadingChart(row) {
let { e, data } = row
let obj = Object.assign({}, data)
obj.TrialId = this.$route.query.trialId
obj.VisitTaskId = this.$route.query.visitTaskId
let zIndex = 9
if (obj.RowIndex) {
zIndex = 9999
}
this.$refs.readingChart.init(e, obj, zIndex)
},
foo() {
if (!this.$refs.readingChart) return false
this.$refs.readingChart.foo()
},
initPage() { initPage() {
const resizeObserver = new ResizeObserver(() => { const resizeObserver = new ResizeObserver(() => {
if (element_ct.style.width) { if (element_ct.style.width) {
@ -1494,10 +1505,6 @@ export default {
await setVolumesForViewports( await setVolumesForViewports(
renderingEngine, renderingEngine,
[ [
{
volumeId: ptVolumeId,
callback: setPetColorMapTransferFunctionForVolumeActor
},
{ {
volumeId: ctVolumeId, volumeId: ctVolumeId,
callback: setCtTransferFunctionForVolumeActor callback: setCtTransferFunctionForVolumeActor
@ -1708,7 +1715,7 @@ export default {
}, },
voiChange(v) { voiChange(v) {
let viewportIds = ['FUSION_AXIAL', 'PT_AXIAL', 'PET_MIP_CORONAL'] let viewportIds = ['FUSION_AXIAL', 'PT_AXIAL', 'PET_MIP_CORONAL']
viewportIds.map(viewportId => { viewportIds.map(viewportId=>{
// const volumeId = viewportId === 'viewportId' ? ptVolumeId : ctVolumeId // const volumeId = viewportId === 'viewportId' ? ptVolumeId : ctVolumeId
const volumeId = ptVolumeId const volumeId = ptVolumeId
const voiRange = { lower: 0, upper: v } const voiRange = { lower: 0, upper: v }
@ -1731,14 +1738,14 @@ export default {
// console.log(vp.id) // console.log(vp.id)
// }) // })
}) })
}, },
async setColorMap(rgbPresetName) { async setColorMap(rgbPresetName) {
this.rgbPresetName = rgbPresetName this.rgbPresetName = rgbPresetName
let viewports = ['FUSION_AXIAL', 'PT_AXIAL', 'PET_MIP_CORONAL'] let viewports = ['FUSION_AXIAL', 'PT_AXIAL', 'PET_MIP_CORONAL']
viewports.map(v => { viewports.map(v=>{
this.$refs[v].setPreset(this.rgbPresetName) this.$refs[v].setPreset(this.rgbPresetName)
this.$refs[v].renderColorBar(this.rgbPresetName) this.$refs[v].renderColorBar(this.rgbPresetName)
this.createColorBar(this.rgbPresetName, 'colorBarCanvas', 256, 15) this.createColorBar(this.rgbPresetName, 'colorBarCanvas', 256, 15)
const renderingEngine = getRenderingEngine(renderingEngineId) const renderingEngine = getRenderingEngine(renderingEngineId)
@ -1855,8 +1862,8 @@ export default {
const renderingEngine = getRenderingEngine(renderingEngineId) const renderingEngine = getRenderingEngine(renderingEngineId)
const viewport = renderingEngine.getViewport(viewporId) const viewport = renderingEngine.getViewport(viewporId)
const { invert } = viewport.getProperties() const { invert } = viewport.getProperties()
if (this.isFusion) { if ( this.isFusion ) {
viewport.setProperties({ invert: !invert }, volumeId) viewport.setProperties({ invert: !invert }, volumeId )
} }
viewport.setProperties({ invert: !invert }) viewport.setProperties({ invert: !invert })
viewport.render() viewport.render()
@ -1980,7 +1987,7 @@ export default {
const viewport = renderingEngine.getViewport(viewportId) const viewport = renderingEngine.getViewport(viewportId)
const lower = v.wc - v.ww / 2 const lower = v.wc - v.ww / 2
const upper = v.wc + v.ww / 2 - 1 const upper = v.wc + v.ww / 2 - 1
viewport.setProperties({ voiRange: { upper: upper, lower: lower } }) viewport.setProperties({ voiRange: { upper: upper, lower: lower }})
viewport.render() viewport.render()
this.customWwc.visible = false this.customWwc.visible = false
}, },

View File

@ -1,219 +1,305 @@
<template> <template>
<div> <div>
<div v-if="!!question.GroupName && question.Type === 'group'"> <div
v-if="!!question.GroupName && question.Type==='group'"
>
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? question.GroupEnName : question.GroupName }} {{ language==='en'?question.GroupEnName:question.GroupName }}
</h4> </h4>
</div> </div>
<template v-else-if="((question.QuestionType === 56) && question.IsBaseLineTask)" /> <template v-else-if="((question.QuestionType === 56) && question.IsBaseLineTask)" />
<template v-else> <template v-else>
<el-form-item <el-form-item
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0" v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0"
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[ :label="`${question.QuestionName}`"
{ :prop="question.Id"
required: (question.IsRequired === 0 || (question.IsRequired === 1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type !== 'group' && question.Type !== 'summary', :rules="[
message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change'] { required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type!=='group' && question.Type!=='summary',
}, message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']},
]" :class="[question.Type === 'group' ? 'mb' : question.Type === 'upload' ? 'uploadWrapper' : '']"> ]"
:class="[question.Type==='group'?'mb':question.Type==='upload'?'uploadWrapper':'']"
>
<template v-if="question.QuestionType === 51 || question.QuestionType === 52"> <template v-if="question.QuestionType === 51 || question.QuestionType === 52">
<!-- question.QuestionType === 51 || question.QuestionType === 52 --> <!-- question.QuestionType === 51 || question.QuestionType === 52 -->
<div style="display: flex;flex-direction: row;justify-content: flex-start;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;">
<div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'"> <el-input
<el-input v-model="questionForm[question.Id]" disabled style="width: 120px;"> v-if="question.Type==='calculation'"
<template v-if="question.Unit" slot="append"> v-model="questionForm[question.Id]"
{{ $fd('ValueUnit', parseInt(question.Unit)) }} disabled
</template> style="width: 120px;"
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" >
class="svg-icon svg-readingChart" @click.stop="(e) => handleReadingChart({ <template v-if="question.Unit" slot="append">
e, {{ $fd('ValueUnit', parseInt(question.Unit)) }}
data: { </template>
QuestionId: question.Id, </el-input>
RowIndex: questionForm.RowIndex,
QuestionName: question.QuestionName
}
})" />
</el-input>
</div>
<!-- 测量 --> <!-- 测量 -->
<el-button <el-button v-if="(!questionForm[question.Id] && ((question.QuestionType === 51 && liverIsInsideVolume) || (question.QuestionType === 52 && lungIsInsideVolume)) && readingTaskState!== 2)" size="mini" type="text" @click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation') }}</el-button>
v-if="(!questionForm[question.Id] && ((question.QuestionType === 51 && liverIsInsideVolume) || (question.QuestionType === 52 && lungIsInsideVolume)) && readingTaskState !== 2)"
size="mini" type="text" @click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation')
}}</el-button>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume)) && readingTaskState!== 2" size="mini" type="text" style="padding: 7px 5px;margin-left:5px;" @click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button>
v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume)) && readingTaskState !== 2"
size="mini" type="text" style="padding: 7px 5px;margin-left:5px;" @click="removeAnnotation(question)">{{
$t('trials:lugano:button:clearAnnotation') }}</el-button>
<!-- 定位 --> <!-- 定位 -->
<el-button <el-button
v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume))" v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume))"
size="mini" type="text" style="padding: '7px 5px';margin-left:-5px;" size="mini"
@click="locateAnnotation(question)">{{ type="text"
$t('trials:lugano:button:locateAnnotation') }}</el-button> style="padding: '7px 5px';margin-left:-5px;"
@click="locateAnnotation(question)"
>{{ $t('trials:lugano:button:locateAnnotation') }}</el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button v-if="readingTaskState !== 2 && question.SaveEnum === 1" size="mini" type="text" <el-button v-if="readingTaskState!== 2 && question.SaveEnum === 1" size="mini" type="text" style="padding: '7px 5px';margin-left:-5px;" @click="saveAnnotation(question)">
style="padding: '7px 5px';margin-left:-5px;" @click="saveAnnotation(question)">
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
<el-button v-if="!question.IsBaseLineTask" size="mini" type="text" <el-button v-if="!question.IsBaseLineTask" size="mini" type="text" style="padding: '7px 5px';margin-left:-5px;" @click="viewAnnotations(question)">{{ $t('trials:lugano:button:suvscreenshot') }}</el-button>
style="padding: '7px 5px';margin-left:-5px;" @click="viewAnnotations(question)">{{
$t('trials:lugano:button:suvscreenshot') }}</el-button>
</div> </div>
</template> </template>
<template v-else-if="question.QuestionType === 53"> <template v-else-if="question.QuestionType === 53">
<div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'"> <el-input
<el-input v-model="questionForm[question.Id]" disabled> v-if="question.Type==='calculation'"
<template v-if="question.Unit" slot="append"> v-model="questionForm[question.Id]"
{{ $fd('ValueUnit', parseInt(question.Unit)) }} disabled
</template> >
</el-input> <template v-if="question.Unit" slot="append">
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" {{ $fd('ValueUnit', parseInt(question.Unit)) }}
@click.stop="(e) => handleReadingChart({ </template>
e, </el-input>
data: {
QuestionId: question.Id,
RowIndex: questionForm.RowIndex,
QuestionName: question.QuestionName
}
})" />
</div>
</template> </template>
<template v-else-if="question.QuestionType === 55"> <template v-else-if="question.QuestionType === 55">
<el-select v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" clearable <el-select
@change="((val) => { formItemChange(val, question) })"> v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 "
clearable
@change="((val)=>{formItemChange(val, question)})"
>
<el-option-group <el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''"> :label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''"
>
<template> <template>
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" <el-option
:label="item.label" /> v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</el-select> </el-select>
</template> </template>
<template v-else-if="question.QuestionType === 56"> <template v-else-if="question.QuestionType === 56">
<el-select v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" clearable <el-select
@change="((val) => { formItemChange(val, question) })"> v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 "
clearable
@change="((val)=>{formItemChange(val, question)})"
>
<el-option-group <el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${parseFloat(question.LastTaskAnswer) === 5 ? 'NA' : $fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''"> :label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${parseFloat(question.LastTaskAnswer) === 5 ? 'NA' : $fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''"
<template v-if="pet5PS * 1 === -1"> >
<el-option v-for="item of $d[question.DictionaryCode]" v-show="item.value !== 4" :key="item.id" <template v-if="pet5PS*1=== -1">
:value="String(item.value)" :label="item.label" /> <el-option
v-for="item of $d[question.DictionaryCode]"
v-show="item.value !== 4"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" <el-option
:label="item.label" /> v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</el-select> </el-select>
</template> </template>
<template v-else-if="question.QuestionType === 57"> <template v-else-if="question.QuestionType === 57">
<el-select v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" clearable <el-select
@change="((val) => { formItemChange(val, question) })"> v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 "
clearable
@change="((val)=>{formItemChange(val, question)})"
>
<el-option-group <el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''"> :label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''"
<template v-if="pet5PS * 1 === -1"> >
<el-option v-for="item of $d[question.DictionaryCode]" v-show="item.value !== 1" :key="item.id" <template v-if="pet5PS*1=== -1">
:value="String(item.value)" :label="item.label" /> <el-option
v-for="item of $d[question.DictionaryCode]"
v-show="item.value !== 1"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" <el-option
:label="item.label" /> v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</el-select> </el-select>
</template> </template>
<!-- 输入框 --> <!-- 输入框 -->
<el-input v-else-if="question.Type === 'input'" v-model="questionForm[question.Id]" <el-input
:disabled="readingTaskState >= 2" /> v-else-if="question.Type==='input'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
/>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea" <el-input
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2" /> v-else-if="question.Type==='textarea'"
v-model="questionForm[question.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]" <el-select
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode) || question.QuestionType === 50" :disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode) || question.QuestionType === 50"
clearable @change="((val) => { formItemChange(val, question) })"> clearable
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.TableQuestionType === 1"> <template v-if="question.TableQuestionType === 1">
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]" <el-option
:value="item[question.DataTableColumn]" /> v-for="item in organList"
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
</template> </template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3"> <template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" <el-option
:label="item.label" /> v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template <template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode"> <el-option
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" v-for="item of $d[question.DictionaryCode]"
:label="item.label" /> :key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]" <el-radio-group
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })"> v-else-if="question.Type==='radio'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.DictionaryCode"> <template v-if="question.DictionaryCode">
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)"> <el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</template> </template>
<template v-else-if="question.TypeValue"> <template v-else-if="question.TypeValue">
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val"> <el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</template> </template>
</el-radio-group> </el-radio-group>
<!-- 复选框 --> <!-- 复选框 -->
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]" <el-checkbox-group
:disabled="readingTaskState >= 2"> v-else-if="question.Type==='checkbox'"
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val"> v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<!-- 数值 --> <!-- 数值 -->
<el-input-number
<div style="display: flex;justify-content: space-between;" v-else-if="question.Type==='number'"
v-else-if="question.Type === 'calculation' || question.Type === 'number'"> v-model="questionForm[question.Id]"
<el-input-number v-if="question.Type === 'number'" v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2"
:disabled="readingTaskState >= 2" /> />
<el-input v-model="questionForm[question.Id]" disabled v-else /> <el-input
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" v-else-if="question.Type==='calculation'"
@click.stop="(e) => handleReadingChart({ v-model="questionForm[question.Id]"
e, disabled
data: { />
QuestionId: question.Id,
RowIndex: questionForm.RowIndex,
QuestionName: question.QuestionName
}
})" />
</div>
<!-- 上传图像 --> <!-- 上传图像 -->
<el-upload v-if="question.Type === 'upload'" action :accept="accept" :limit="question.ImageCount" <el-upload
:on-preview="handlePictureCardPreview" :before-upload="handleBeforeUpload" :http-request="uploadScreenshot" v-if="question.Type==='upload'"
list-type="picture-card" :on-remove="handleRemove" :file-list="fileList" action
:class="{ disabled: fileList.length >= question.ImageCount }" :disabled="readingTaskState >= 2"> :accept="accept"
:limit="question.ImageCount"
:on-preview="handlePictureCardPreview"
:before-upload="handleBeforeUpload"
:http-request="uploadScreenshot"
list-type="picture-card"
:on-remove="handleRemove"
:file-list="fileList"
:class="{disabled:fileList.length >= question.ImageCount}"
:disabled="readingTaskState >= 2"
>
<i slot="default" class="el-icon-plus" /> <i slot="default" class="el-icon-plus" />
<div slot="file" slot-scope="{file}"> <div slot="file" slot-scope="{file}">
<img class="el-upload-list__item-thumbnail" :src="OSSclientConfig.basePath + file.url" alt=""> <img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
>
<span class="el-upload-list__item-actions"> <span class="el-upload-list__item-actions">
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)"> <span
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
>
<i class="el-icon-zoom-in" /> <i class="el-icon-zoom-in" />
</span> </span>
<span v-if="readingTaskState < 2" class="el-upload-list__item-delete" @click="handleRemove(file)"> <span
v-if="readingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" /> <i class="el-icon-delete" />
</span> </span>
</span> </span>
</div> </div>
</el-upload> </el-upload>
<el-dialog v-if="question.Type === 'upload'" append-to-body :visible.sync="imgVisible" width="600px"> <el-dialog
v-if="question.Type==='upload'"
append-to-body
:visible.sync="imgVisible"
width="600px"
>
<el-image :src="imageUrl" width="100%"> <el-image :src="imageUrl" width="100%">
<div slot="placeholder" class="image-slot"> <div slot="placeholder" class="image-slot">
加载中<span class="dot">...</span> 加载中<span class="dot">...</span>
@ -223,11 +309,19 @@
</el-form-item> </el-form-item>
</template> </template>
<template v-for="item of question.Childrens"> <template v-for="item of question.Childrens">
<QuestionItem v-if="item.QuestionClassify === 0" :key="item.Id" :question="item" <QuestionItem
:reading-task-state="readingTaskState" :question-form="questionForm" :visit-task-id="visitTaskId" v-if="item.QuestionClassify === 0"
:pet5p-s="pet5PS" :lung-is-inside-volume="lungIsInsideVolume" :liver-is-inside-volume="liverIsInsideVolume" :key="item.Id"
@setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData" :question="item"
@handleReadingChart="handleReadingChart" /> :reading-task-state="readingTaskState"
:question-form="questionForm"
:visit-task-id="visitTaskId"
:pet5p-s="pet5PS"
:lung-is-inside-volume="lungIsInsideVolume"
:liver-is-inside-volume="liverIsInsideVolume"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</template> </template>
</div> </div>
</template> </template>
@ -312,9 +406,6 @@ export default {
} }
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
formItemChange(v, question) { formItemChange(v, question) {
if (question.QuestionType === 55) { if (question.QuestionType === 55) {
this.$emit('setFormItemData', { key: question.Id, val: v }) this.$emit('setFormItemData', { key: question.Id, val: v })
@ -350,7 +441,7 @@ export default {
.then(() => { .then(() => {
FusionEvent.$emit('removeAnnotation', question) FusionEvent.$emit('removeAnnotation', question)
}) })
.catch(() => { }) .catch(() => {})
}, },
locateAnnotation(question) { locateAnnotation(question) {
FusionEvent.$emit('locateAnnotation', question) FusionEvent.$emit('locateAnnotation', question)
@ -412,32 +503,26 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.mb { .mb{
margin-bottom: 0px; margin-bottom: 0px;
} }
.disabled{
.disabled {
::v-deep .el-upload--picture-card { ::v-deep .el-upload--picture-card {
display: none; display: none;
} }
} }
.uploadWrapper{
.uploadWrapper {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
} }
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner { background-color: #646464a1;
background-color: #646464a1; }
} ::v-deep .el-input-group__append, .el-input-group__prepend{
padding: 0 5px;
::v-deep .el-input-group__append, }
.el-input-group__prepend { ::v-deep .el-select.is-disabled .el-input__inner{
padding: 0 5px; background-color: #646464a1;
} }
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
</style> </style>

View File

@ -1,17 +1,29 @@
<template> <template>
<div v-loading="loading" class="ecrf-wrapper"> <div v-loading="loading" class="ecrf-wrapper">
<el-form v-if="questions.length > 0" ref="questions" size="small" :model="questionForm"> <el-form
v-if="questions.length > 0"
ref="questions"
size="small"
:model="questionForm"
>
<template v-for="question of questions"> <template v-for="question of questions">
<QuestionItem v-if="question.QuestionClassify === 0" :key="question.Id" :question="question" <QuestionItem
:question-form="questionForm" :reading-task-state="readingTaskState" :visit-task-id="visitTaskId" v-if="question.QuestionClassify === 0"
:pet5p-s="questionForm[pet5PSId]" :lung-is-inside-volume="lungIsInsideVolume" :key="question.Id"
:liver-is-inside-volume="liverIsInsideVolume" @setFormItemData="setFormItemData" :question="question"
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" /> :question-form="questionForm"
:reading-task-state="readingTaskState"
:visit-task-id="visitTaskId"
:pet5p-s="questionForm[pet5PSId]"
:lung-is-inside-volume="lungIsInsideVolume"
:liver-is-inside-volume="liverIsInsideVolume"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</template> </template>
<el-form-item v-if="readingTaskState < 2"> <el-form-item v-if="readingTaskState < 2">
<div style="text-align:right"> <div style="text-align:right">
<el-button :disabled="!questionFormChangeState" :type="questionFormChangeState ? 'primary' : null" size="mini" <el-button :disabled="!questionFormChangeState" :type="questionFormChangeState ? 'primary' : null" size="mini" @click="handleSave">{{ $t('common:button:save') }}</el-button>
@click="handleSave">{{ $t('common:button:save') }}</el-button>
</div> </div>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -120,9 +132,6 @@ export default {
FusionEvent.$off('locateAnnotation') FusionEvent.$off('locateAnnotation')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
getQuestions1() { getQuestions1() {
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId) var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
@ -130,17 +139,17 @@ export default {
this.readingTaskState = this.visitTaskList[idx].ReadingTaskState this.readingTaskState = this.visitTaskList[idx].ReadingTaskState
var questions = this.visitTaskList[idx].Questions var questions = this.visitTaskList[idx].Questions
this.questions = this.questions =
questions.map((v) => { questions.map((v) => {
if (v.QuestionClassify === 0) { if (v.QuestionClassify === 0) {
if (v.Type === 'group' && v.Childrens.length === 0) return if (v.Type === 'group' && v.Childrens.length === 0) return
if (!v.IsPage && v.Type !== 'group' && v.Type !== 'summary') { if (!v.IsPage && v.Type !== 'group' && v.Type !== 'summary') {
this.$set(this.questionForm, v.Id, v.Answer ? v.Answer : null) this.$set(this.questionForm, v.Id, v.Answer ? v.Answer : null)
}
if (v.Childrens.length > 0) {
this.setChild(v.Childrens)
}
} }
}) if (v.Childrens.length > 0) {
this.setChild(v.Childrens)
}
}
})
this.questions = questions this.questions = questions
} }
}, },
@ -176,7 +185,7 @@ export default {
this.setChild(v.Childrens) this.setChild(v.Childrens)
} }
}) })
console.log(this.questionForm, questions) console.log(this.questionForm,questions)
this.questions = questions this.questions = questions
this.setPet5PSCommentDisplay() this.setPet5PSCommentDisplay()
this.measurements = [] this.measurements = []
@ -750,43 +759,39 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.ecrf-wrapper { .ecrf-wrapper{
::v-deep .el-form-item__label { ::v-deep .el-form-item__label{
color: #c3c3c3; color: #c3c3c3;
text-align: left; text-align: left;
} }
::v-deep .el-input__inner{
::v-deep .el-input__inner { background-color: transparent;
background-color: transparent; color: #ddd;
color: #ddd; border: 1px solid #5e5e5e;
border: 1px solid #5e5e5e; }
} ::v-deep .el-textarea__inner{
background-color: transparent;
::v-deep .el-textarea__inner { color: #ddd;
background-color: transparent; border: 1px solid #5e5e5e;
color: #ddd; }
border: 1px solid #5e5e5e; ::v-deep .el-form-item{
} display: flex;
flex-direction: row;
::v-deep .el-form-item { justify-content: flex-start;
display: flex; flex-wrap: wrap;
flex-direction: row; }
justify-content: flex-start; ::v-deep .el-form-item__content{
flex-wrap: wrap; flex: 1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-form-item__content {
flex: 1;
}
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
.el-form-item__content
.el-form-item__content .el-select { .el-select{
width: 100%; width: 100%;
}
} }
}
</style> </style>

View File

@ -1,6 +1,12 @@
<template> <template>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini" <el-form
class="measurement-form"> v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -13,151 +19,184 @@
</div> </div>
</div> </div>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[ <el-form-item
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] }, :label="$t('trials:reading:title:lesionType')"
]"> prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select v-model="questionForm.LesionType" filterable <el-select
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask" v-model="questionForm.LesionType"
@change="((val) => { lesionTypeChange(val) })"> filterable
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id" <el-option
:value="item.value" :label="item.label" /> v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<template v-for="qs in questions"> <template v-for="qs in questions">
<el-form-item v-if="qs.ShowQuestion !== 2 && qs.QuestionClassify === 0" :key="qs.Id" <el-form-item
:label="`${qs.QuestionName}`" :prop="qs.Id" :rules="[ v-if="qs.ShowQuestion!==2 && qs.QuestionClassify === 0"
{ :key="qs.Id"
required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type !== 'group' && qs.Type !== 'summary', :label="`${qs.QuestionName}`"
message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change'] :prop="qs.Id"
}, :rules="[
]"> { required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary',
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
>
<!-- {{ isCurrentTaskAdd }} <!-- {{ isCurrentTaskAdd }}
{{ questionForm.IsCanEditPosition }} --> {{ questionForm.IsCanEditPosition }} -->
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-if="qs.Type==='input' || qs.Type==='number'">
<div style="display: flex;justify-content: space-between;"> <!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} -->
<!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} --> <el-input
<el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="questionForm[qs.Id]" v-if="qs.Type==='input' || qs.Type==='number'"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName))" v-model="questionForm[qs.Id]"
@change="((val) => { formItemChange(val, qs) })"> :disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName))"
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append"> @change="((val)=>{formItemChange(val, qs)})"
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} >
</template> <template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
@click.stop="(e) => handleReadingChart({ </template>
e, </el-input>
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</el-input>
</div>
</template> </template>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea" <el-input
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="!isCurrentTask || readingTaskState >= 2" v-if="qs.Type==='textarea'"
@change="((val) => { formItemChange(val, qs) })" /> v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable <el-select
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')" :placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))" :disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False'|| !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))"
@change="((val) => { formItemChange(val, qs) })"> @change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.QuestionMark === 8" #prefix> <template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;"> <span style="padding-left: 5px;">
<i class="el-icon-search" /> <i class="el-icon-search" />
</span> </span>
</template> </template>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]" <el-option
:value="item[qs.DataTableColumn]" /> v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" /> <el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]" <el-radio-group
:disabled="!isCurrentTask || readingTaskState >= 2"> v-if="qs.Type==='radio'"
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val"> v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
<template v-if="qs.QuestionMark === 20 && qs.Type === 'calculation'"> <template v-if="qs.QuestionMark === 20 && qs.Type==='calculation'">
<div style="display: flex;flex-direction: row;justify-content: flex-start;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;">
<div style="display: flex;justify-content: space-between;"> <el-input
<el-input v-if="qs.Type === 'calculation'" v-model="questionForm[qs.Id]" disabled style="width:120px;"> v-if="qs.Type==='calculation'"
<template v-if="qs.Unit" slot="append"> v-model="questionForm[qs.Id]"
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} disabled
</template> style="width:120px;"
</el-input> >
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" <template v-if="qs.Unit" slot="append">
@click.stop="(e) => handleReadingChart({ {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
e, </template>
data: { </el-input>
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</div>
<!-- <span style="color:#409eff;cursor: pointer" @click="previewImages(answers.RowId)"> <!-- <span style="color:#409eff;cursor: pointer" @click="previewImages(answers.RowId)">
{{ $t('trials:lugano:button:suvscreenshot') }} {{ $t('trials:lugano:button:suvscreenshot') }}
</span> --> </span> -->
<el-button v-if="!isBaseLineTask" type="text" @click="previewImages(answers.RowId)">{{ <el-button v-if="!isBaseLineTask" type="text" @click="previewImages(answers.RowId)">{{ $t('trials:lugano:button:suvscreenshot') }}</el-button>
$t('trials:lugano:button:suvscreenshot') }}</el-button>
</div> </div>
</template> </template>
<div style="display: flex;justify-content: space-between;" <el-input
v-else-if="qs.Type === 'calculation' && qs.QuestionMark !== 20"> v-else-if="qs.Type==='calculation' && qs.QuestionMark !== 20"
<el-input v-model="questionForm[qs.Id]" disabled> v-model="questionForm[qs.Id]"
<template v-if="qs.Unit" slot="append"> disabled
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} >
</template> <template v-if="qs.Unit" slot="append">
</el-input> {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" </template>
@click.stop="(e) => handleReadingChart({ </el-input>
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</div>
</el-form-item> </el-form-item>
</template> </template>
</div> </div>
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer" <div
style="text-align:right;margin-top:10px;"> v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button v-if="questionForm.OtherMeasureData" size="mini" @click="handleDeleteMeasureData"> <el-button
v-if="questionForm.OtherMeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete"> <el-button
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button size="mini" @click="handleSave"> <el-button
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -249,9 +288,6 @@ export default {
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm(isRerender = false) { async initForm(isRerender = false) {
const loading = this.$loading({ fullscreen: true }) const loading = this.$loading({ fullscreen: true })
this.questions.forEach(item => { this.questions.forEach(item => {
@ -305,7 +341,7 @@ export default {
await this.setMeasureData(this.answers.measureObj, true) await this.setMeasureData(this.answers.measureObj, true)
} else { } else {
if (this.questionForm.MeasureData) { if (this.questionForm.MeasureData) {
// 线 // 线
// if (this.answers.MarkTool === 'Bidirectional') { // if (this.answers.MarkTool === 'Bidirectional') {
// this.organList = [] // this.organList = []
// await this.getOrganInfoList(1) // await this.getOrganInfoList(1)
@ -410,8 +446,8 @@ export default {
type: 'warning', type: 'warning',
distinguishCancelAndClose: true distinguishCancelAndClose: true
}) })
.then(() => { }) .then(() => {})
.catch(() => { }) .catch(() => {})
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType) this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return return
} }
@ -423,7 +459,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType) this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return return
@ -750,7 +786,7 @@ export default {
this.$confirm(this.$t('trials:reading:lugano:warnning:outsideVolume'), { this.$confirm(this.$t('trials:reading:lugano:warnning:outsideVolume'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
return return
@ -764,7 +800,7 @@ export default {
this.$confirm(this.$t('trials:reading:lugano:warnning:cannotMeasuredSUV'), { this.$confirm(this.$t('trials:reading:lugano:warnning:cannotMeasuredSUV'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
return return
} }
@ -777,7 +813,7 @@ export default {
this.$confirm(this.$t('trials:reading:lugano:warnning:suvis0'), { this.$confirm(this.$t('trials:reading:lugano:warnning:suvis0'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
return return
} }
@ -1018,57 +1054,47 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-form { .measurement-form{
::v-deep .el-form-item__label { ::v-deep .el-form-item__label{
color: #c3c3c3; color: #c3c3c3;
// text-align: left; // text-align: left;
} }
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
flex-wrap: wrap; flex-wrap: wrap;
} }
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-input-group__append, .el-input-group__prepend{
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px; padding: 0 10px;
} }
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
.el-form-item__content
.el-form-item__content .el-select { .el-select{
width: 100%; width: 100%;
} }
.input-width1{
.input-width1 { width: calc(100% - 60px)!important;
width: calc(100% - 60px) !important;
} }
.input-width2{
.input-width2 {
width: 100% !important; width: 100% !important;
} }
} }
</style> </style>

View File

@ -3,88 +3,75 @@
<div class="container"> <div class="container">
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-for="(qs, index) in questions"> <template v-for="(qs,index) in questions">
<div v-if="qs.QuestionClassify === 0" :key="index" v-loading="loading" class="lesions lesions_wrapper"> <div v-if="qs.QuestionClassify === 0" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }} {{ language==='en'?qs.GroupEnName:qs.GroupName }}
</h4> </h4>
<div class="lesion_list"> <div class="lesion_list">
<template v-for="item in qs.Childrens"> <template v-for="item in qs.Childrens">
<div v-if="item.QuestionClassify === 0 && !(isBaseLineTask && item.LesionType === 2)" :key="item.Id"> <div v-if="item.QuestionClassify === 0 && !(isBaseLineTask && item.LesionType === 2)" :key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;"> <div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }} <div class="title">{{ item.QuestionName }}</div>
<svg-icon v-if="item.LesionType === 0" icon-class="readingChart" <div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0,
QuestionName: item.QuestionName
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<!-- @change="handleCollapseChange(qs.Childrens,item)" --> <!-- @change="handleCollapseChange(qs.Childrens,item)" -->
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion <el-collapse
@change="handleCollapseChange"> v-if="item.Type === 'table' && item.TableQuestions"
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`" v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)"> @contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)"
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" <div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}">
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.OrderMark, q.RowIndex) }} {{ getLesionName(item.OrderMark,q.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip <el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip <el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom">
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 50px;top: 2px;"> <div style="position: absolute;left: 50px;top: 2px;">
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; --> <!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div style="font-size: 11px;width:220px;height: 30px;"> <div style="font-size: 11px;width:220px;height: 30px;">
<div v-if="item.TableQuestions.Answers[i].lesionPart" <div
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"> v-if="item.TableQuestions.Answers[i].lesionPart"
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
:content="item.TableQuestions.Answers[i].lesionPart" placement="bottom"> >
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
<span>{{ item.TableQuestions.Answers[i].lesionPart }}</span> <span>{{ item.TableQuestions.Answers[i].lesionPart }}</span>
</el-tooltip> </el-tooltip>
</div> </div>
<div <div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
<span v-if="item.LesionType === 0"> <span v-if="item.LesionType === 0">
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
<span v-else-if="item.LesionType === 1"> <span v-else-if="item.LesionType === 1">
{{ $fd('NoTargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NoTargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
<span v-else> <span v-else>
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
</div> </div>
<div <div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px;color:red;">
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px;color:red;"> <template v-if="item.TableQuestions.Answers[i].suvMax && !isNaN(parseFloat(item.TableQuestions.Answers[i].suvMax))">
<template
v-if="item.TableQuestions.Answers[i].suvMax && !isNaN(parseFloat(item.TableQuestions.Answers[i].suvMax))">
{{ item.TableQuestions.Answers[i].suvMax }} SUV {{ item.TableQuestions.Answers[i].suvMax }} SUV
</template> </template>
</div> </div>
</div> </div>
</div> </div>
<div <div v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'" style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'"
style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<!-- 分裂 --> <!-- 分裂 -->
<!-- <el-tooltip v-show="readingTaskState<2 && !!item.TableQuestions.Answers[i].RowId && !isBaseLineTask" class="item" :content="$t('trials:reading:button:split')" placement="left"> <!-- <el-tooltip v-show="readingTaskState<2 && !!item.TableQuestions.Answers[i].RowId && !isBaseLineTask" class="item" :content="$t('trials:reading:button:split')" placement="left">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" /> <i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" />
@ -94,14 +81,25 @@
</div> </div>
</template> </template>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions" <QuestionForm
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType" :ref="`${item.Id}_${q.RowIndex}`"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)" :questions="item.TableQuestions.Questions"
:question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId" :answers="item.TableQuestions.Answers[i]"
:is-current-task="isCurrentTask" :reading-task-state="readingTaskState" :lesion-type="item.LesionType"
:is-base-line-task="isBaseLineTask" @changeLesionType="changeLesionType" :order-mark="item.OrderMark"
@resetQuestions="resetQuestions" @determineExistsUnsavedLession="determineExistsUnsavedLession" :table-questions="tableQuestions"
@close="close" @handleReadingChart="handleReadingChart" /> :row-index="String(q.RowIndex)"
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@changeLesionType="changeLesionType"
@resetQuestions="resetQuestions"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -172,9 +170,6 @@ export default {
beforeDestroy() { beforeDestroy() {
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
initList(isRerender = false) { initList(isRerender = false) {
this.loading = true this.loading = true
this.activeName = '' this.activeName = ''
@ -350,7 +345,7 @@ export default {
.then(() => { .then(() => {
this.split(rowId, questionId) this.split(rowId, questionId)
}) })
.catch(() => { }) .catch(() => {})
} else { } else {
// //
this.$confirm(this.$t('trials:reading:warnning:msg4'), { this.$confirm(this.$t('trials:reading:warnning:msg4'), {
@ -360,7 +355,7 @@ export default {
.then(() => { .then(() => {
this.split(rowId, questionId) this.split(rowId, questionId)
}) })
.catch(() => { }) .catch(() => {})
} }
} }
} }
@ -434,7 +429,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
return return
} }
@ -444,7 +439,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
} else { } else {
// saveTypeEnum: 0 // saveTypeEnum: 0
@ -587,7 +582,7 @@ export default {
// await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId }) // await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
this.questions = this.findQuestionAndRemoveLesion(this.questions, { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex }) this.questions = this.findQuestionAndRemoveLesion(this.questions, { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex })
// saveTypeEnum: 0 // saveTypeEnum: 0
var lesionObj = {} var lesionObj = { }
var questionObj = questionsObj.questionForm var questionObj = questionsObj.questionForm
// //
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType) var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
@ -822,20 +817,19 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-wrapper { .measurement-wrapper{
// .container{ // .container{
// padding: 10px; // padding: 10px;
// } // }
.title { .title{
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
font-size: 15px; font-size: 15px;
} }
.add-icon{
.add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
@ -844,49 +838,42 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
.flex-row { .flex-row{
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
background-color: #424242; background-color: #424242;
} }
.lesion_list{
.lesion_list {
position: relative; position: relative;
} }
.el-collapse{
.el-collapse { border-bottom:none;
border-bottom: none; border-top:none;
border-top: none; ::v-deep .el-collapse-item{
background-color: #000!important;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header{
::v-deep .el-collapse-item__header { background-color: #000!important;
background-color: #000 !important;
color: #ddd; color: #ddd;
border-bottom-color: #5a5a5a; border-bottom-color:#5a5a5a;
padding-left: 5px; padding-left: 5px;
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap{
::v-deep .el-collapse-item__wrap { background-color: #000!important;
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content{
::v-deep .el-collapse-item__content { width:260px;
width: 260px;
position: absolute; position: absolute;
top: 0px; top: 0px;
right: 0px; right: 0px;
@ -895,7 +882,7 @@ export default {
z-index: 1; z-index: 1;
color: #ddd; color: #ddd;
padding: 5px; padding: 5px;
background-color: #1e1e1e; background-color:#1e1e1e;
} }
} }

View File

@ -1,6 +1,12 @@
<template> <template>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini" <el-form
class="measurement-form"> v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -13,119 +19,179 @@
</div> </div>
</div> </div>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[ <el-form-item
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] }, :label="$t('trials:reading:title:lesionType')"
]"> prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select v-model="questionForm.LesionType" filterable <el-select
:disabled="!isCurrentTask || readingTaskState >= 2 || (!isBaseLineTask && !(isFirstChangeTask && (lesionType === 2 || lesionType === 5 || lesionType === 6)))" v-model="questionForm.LesionType"
@change="((val) => { lesionTypeChange(val) })"> filterable
:disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && !(isFirstChangeTask && (lesionType === 2 || lesionType === 5 || lesionType === 6)))"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-option v-for="item of $d.LesionType" <el-option
v-for="item of $d.LesionType"
v-show="(isBaseLineTask && (item.value === 0 || item.value === 1)) || (!isBaseLineTask && ((isFirstChangeTask && (item.value === 5 || item.value === 6)) || !isFirstChangeTask))" v-show="(isBaseLineTask && (item.value === 0 || item.value === 1)) || (!isBaseLineTask && ((isFirstChangeTask && (item.value === 5 || item.value === 6)) || !isFirstChangeTask))"
:key="item.id" :value="item.value" :label="item.label" /> :key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`" <el-form-item
:prop="qs.Id" :rules="[ v-for="qs in questions"
{ v-show="qs.ShowQuestion!==2"
required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type !== 'group' && qs.Type !== 'summary', :key="qs.Id"
message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change'] :label="`${qs.QuestionName}`"
}, :prop="qs.Id"
]"> :rules="[
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary',
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
>
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-if="qs.Type==='input' || qs.Type==='number'">
<div style="display: flex;justify-content: space-between;"> <el-input
<el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="questionForm[qs.Id]" v-if="qs.Type==='input' || qs.Type==='number'"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (isFirstChangeTask && (lesionType === 5 || lesionType === 6) && (qs.QuestionMark === 8 || qs.QuestionMark === 10))" v-model="questionForm[qs.Id]"
@change="((val) => { formItemChange(val, qs) })"> :disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2 ) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (isFirstChangeTask && (lesionType === 5 || lesionType === 6) && (qs.QuestionMark === 8 || qs.QuestionMark === 10 ))"
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append"> @change="((val)=>{formItemChange(val, qs)})"
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} >
</template> <template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
</el-input> {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" </template>
@click.stop="(e) => handleReadingChart({ </el-input>
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</div>
</template> </template>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea" <el-input
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2" v-if="qs.Type==='textarea'"
@change="((val) => { formItemChange(val, qs) })" /> v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2 "
@change="((val)=>{formItemChange(val, qs)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable <el-select
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')" :placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 7 && isFirstChangeTask) || (qs.QuestionMark === 8 && isFirstChangeTask)" :disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False'|| !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 7 && isFirstChangeTask ) || (qs.QuestionMark === 8 && isFirstChangeTask)"
@change="((val) => { formItemChange(val, qs) })"> @change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.QuestionMark === 8" #prefix> <template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;"> <span style="padding-left: 5px;">
<i class="el-icon-search" /> <i class="el-icon-search" />
</span> </span>
</template> </template>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]" <el-option
:value="item[qs.DataTableColumn]" /> v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option v-for="item of $d[qs.DictionaryCode]" <el-option
v-show="((lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)" v-for="item of $d[qs.DictionaryCode]"
:key="item.id" :value="item.value" :label="item.label" /> v-show="((lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isFirstChangeTask && (lesionType === 5 || lesionType ===6)">
v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isFirstChangeTask && (lesionType === 5 || lesionType === 6)"> <el-option
<el-option v-for="item of $d[qs.DictionaryCode]" v-for="item of $d[qs.DictionaryCode]"
v-show="((lesionType === 5 && item.value === 1) || (lesionType === 6 && (item.value === 0))) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)" v-show="((lesionType === 5 && item.value ===1) || (lesionType === 6 && (item.value ===0))) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id" :value="item.value" :label="item.label" /> :key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group <el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''"> :label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''"
>
<!-- 首次分裂的病灶只能选择存在 --> <!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'"> <template v-if="answers.IsFristAdd=== 'True' && answers.SplitOrMergeType === '0'">
<el-option v-for="item of $d[qs.DictionaryCode]" <el-option
v-show="((lesionType === 0 && item.value === 0) || (lesionType === 1 && item.value === 0) || (lesionType === 2 && item.value === 0) || (lesionType === 5 && item.value === 1) || (lesionType === 6 && item.value === 0) || (lesionType === 7 && item.value === 0) || (lesionType === 8 && item.value === 1)) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)" v-for="item of $d[qs.DictionaryCode]"
:key="item.id" :value="item.value" :label="item.label" /> v-show="((lesionType === 0 && item.value === 0) || (lesionType === 1 && item.value === 0 ) || (lesionType === 2 && item.value === 0 )|| (lesionType === 5 && item.value === 1 )|| (lesionType === 6 && item.value === 0 )|| (lesionType === 7 && item.value === 0 )|| (lesionType === 8 && item.value === 1 )) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="isCurrentTaskAdd === 'True' && (lesionType === 2 || lesionType === 8)"> <template v-else-if="isCurrentTaskAdd=== 'True' && (lesionType === 2 || lesionType === 8)">
<!-- 首次添加的新病灶不能为无法评估和消失 --> <!-- 首次添加的新病灶不能为无法评估和消失 -->
<el-option v-for="item of $d[qs.DictionaryCode]" <el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="(((item.value === 0 || item.value === 1) && lesionType === 2) || ((item.value === 1 || item.value === 2) && lesionType === 8)) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)" v-show="(((item.value === 0 || item.value === 1) && lesionType === 2) || ((item.value === 1 || item.value === 2) && lesionType === 8)) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id" :value="item.value" :label="item.label" /> :key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="isCurrentTaskAdd === 'False' && lesionType === 1 && answers.LastTaskState !== '4'"> <template v-else-if="isCurrentTaskAdd=== 'False' && lesionType === 1 && answers.LastTaskState !== '4'">
<el-option v-for="item of filterState($d[qs.DictionaryCode])" <el-option
v-for="item of filterState($d[qs.DictionaryCode])"
v-show="(item.value !== 5) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)" v-show="(item.value !== 5) && (crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1)"
:key="item.id" :value="item.value" :label="item.label" /> :key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="item of filterState($d[qs.DictionaryCode])" <el-option
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1" :key="item.id" v-for="item of filterState($d[qs.DictionaryCode])"
:value="item.value" :label="item.label" /> v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option v-for="item of $d[qs.DictionaryCode]" <el-option
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1" :key="item.id" v-for="item of $d[qs.DictionaryCode]"
:value="item.value" :label="item.label" /> v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.TypeValue"> <template v-else-if="qs.TypeValue">
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]" <el-radio-group
:disabled="!isCurrentTask || readingTaskState >= 2"> v-if="qs.Type==='radio'"
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val"> v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
@ -133,21 +199,33 @@
</div> </div>
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer" <div
style="text-align:right;margin-top:10px;"> v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button <el-button
v-if="questionForm.MeasureData && (!isFirstChangeTask || (isFirstChangeTask && (lesionType === 5 || lesionType === 6)))" v-if="questionForm.MeasureData && (!isFirstChangeTask || (isFirstChangeTask && (lesionType === 5 || lesionType === 6)))"
size="mini" @click="handleDeleteMeasureData"> size="mini"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button v-if="!isFirstChangeTask && isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete"> <el-button
v-if="!isFirstChangeTask && isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button v-if="(isFirstChangeTask && (lesionType === 5 || lesionType === 6)) || !isFirstChangeTask" size="mini" <el-button
@click="handleSave"> v-if="(isFirstChangeTask && (lesionType === 5 || lesionType === 6)) || !isFirstChangeTask"
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -252,9 +330,6 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal') DicomEvent.$off('handleImageQualityAbnormal')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm() { async initForm() {
const loading = this.$loading({ fullscreen: true }) const loading = this.$loading({ fullscreen: true })
this.questions.forEach(item => { this.questions.forEach(item => {
@ -300,12 +375,12 @@ export default {
await this.setMeasureData(this.answers.measureObj, true) await this.setMeasureData(this.answers.measureObj, true)
} else { } else {
if (this.questionForm.MeasureData) { if (this.questionForm.MeasureData) {
// 线 // 线
if (this.questionForm.MeasureData.type === 'Bidirectional') { if (this.questionForm.MeasureData.type === 'Bidirectional') {
this.organList = [] this.organList = []
await this.getOrganInfoList(1) await this.getOrganInfoList(1)
} else if (this.questionForm.MeasureData.type === 'Length') { } else if (this.questionForm.MeasureData.type === 'Length') {
// //
this.organList = [] this.organList = []
await this.getOrganInfoList(0) await this.getOrganInfoList(0)
} else { } else {
@ -411,8 +486,8 @@ export default {
type: 'warning', type: 'warning',
distinguishCancelAndClose: true distinguishCancelAndClose: true
}) })
.then(() => { }) .then(() => {})
.catch(() => { }) .catch(() => {})
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType) this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return return
} }
@ -425,7 +500,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType) this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return return
@ -660,7 +735,7 @@ export default {
} }
} }
} }
var status = '' var status = ''
if (lesionState) { if (lesionState) {
if (this.lesionType === 0 && lesionState === 1) { if (this.lesionType === 0 && lesionState === 1) {
@ -851,7 +926,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg19'), { this.$confirm(this.$t('trials:reading:warnning:msg19'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -863,7 +938,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg20'), { this.$confirm(this.$t('trials:reading:warnning:msg20'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -880,7 +955,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg21'), { this.$confirm(this.$t('trials:reading:warnning:msg21'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -892,7 +967,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg22'), { this.$confirm(this.$t('trials:reading:warnning:msg22'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -910,7 +985,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg23'), { this.$confirm(this.$t('trials:reading:warnning:msg23'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -922,7 +997,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg24'), { this.$confirm(this.$t('trials:reading:warnning:msg24'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -938,7 +1013,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg25'), { this.$confirm(this.$t('trials:reading:warnning:msg25'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -954,7 +1029,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg26'), { this.$confirm(this.$t('trials:reading:warnning:msg26'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -975,7 +1050,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg27'), { this.$confirm(this.$t('trials:reading:warnning:msg27'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -987,7 +1062,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg28'), { this.$confirm(this.$t('trials:reading:warnning:msg28'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1003,7 +1078,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg29'), { this.$confirm(this.$t('trials:reading:warnning:msg29'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1015,7 +1090,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg30'), { this.$confirm(this.$t('trials:reading:warnning:msg30'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1036,7 +1111,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg31'), { this.$confirm(this.$t('trials:reading:warnning:msg31'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1048,7 +1123,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg32'), { this.$confirm(this.$t('trials:reading:warnning:msg32'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1065,7 +1140,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg33'), { this.$confirm(this.$t('trials:reading:warnning:msg33'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1077,7 +1152,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg34'), { this.$confirm(this.$t('trials:reading:warnning:msg34'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1094,7 +1169,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg35'), { this.$confirm(this.$t('trials:reading:warnning:msg35'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1106,7 +1181,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg36'), { this.$confirm(this.$t('trials:reading:warnning:msg36'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1118,12 +1193,12 @@ export default {
if (this.lesionType === 1 && lesionState === 3) { if (this.lesionType === 1 && lesionState === 3) {
if (lymphNodes === 1) { if (lymphNodes === 1) {
// 使 // 使
if (!(measureData && (measureData.type === 'ArrowAnnotate' || (measureData.type === 'Bidirectional' && lesionShort < 10)))) { if (!(measureData && (measureData.type === 'ArrowAnnotate'))) {
// 使 // 使
this.$confirm(this.$t('trials:reading:warnning:msg37'), { this.$confirm(this.$t('trials:reading:warnning:msg37'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1135,7 +1210,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg38'), { this.$confirm(this.$t('trials:reading:warnning:msg38'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1152,7 +1227,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg33'), { this.$confirm(this.$t('trials:reading:warnning:msg33'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1164,7 +1239,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg34'), { this.$confirm(this.$t('trials:reading:warnning:msg34'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1181,7 +1256,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg50'), { this.$confirm(this.$t('trials:iRecist:warnning:msg50'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1193,7 +1268,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg51'), { this.$confirm(this.$t('trials:iRecist:warnning:msg51'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1210,7 +1285,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg39'), { this.$confirm(this.$t('trials:reading:warnning:msg39'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1222,7 +1297,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg40'), { this.$confirm(this.$t('trials:reading:warnning:msg40'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1239,7 +1314,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg41'), { this.$confirm(this.$t('trials:reading:warnning:msg41'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1251,7 +1326,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg42'), { this.$confirm(this.$t('trials:reading:warnning:msg42'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1268,7 +1343,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg43'), { this.$confirm(this.$t('trials:reading:warnning:msg43'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1280,7 +1355,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg44'), { this.$confirm(this.$t('trials:reading:warnning:msg44'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1292,12 +1367,12 @@ export default {
if (this.lesionType === 2 && lesionState === 3) { if (this.lesionType === 2 && lesionState === 3) {
if (lymphNodes === 1) { if (lymphNodes === 1) {
// 使 // 使
if (!(measureData && (measureData.type === 'ArrowAnnotate' || (measureData.type === 'Bidirectional' && lesionShort < 10)))) { if (!(measureData && (measureData.type === 'ArrowAnnotate'))) {
// 使 // 使
this.$confirm(this.$t('trials:reading:warnning:msg45'), { this.$confirm(this.$t('trials:reading:warnning:msg45'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1309,7 +1384,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg46'), { this.$confirm(this.$t('trials:reading:warnning:msg46'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1329,7 +1404,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg31'), { this.$confirm(this.$t('trials:iRecist:warnning:msg31'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1341,7 +1416,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg32'), { this.$confirm(this.$t('trials:iRecist:warnning:msg32'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1358,7 +1433,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg1'), { this.$confirm(this.$t('trials:iRecist:warnning:msg1'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1370,7 +1445,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg2'), { this.$confirm(this.$t('trials:iRecist:warnning:msg2'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1385,7 +1460,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg3'), { this.$confirm(this.$t('trials:iRecist:warnning:msg3'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1397,7 +1472,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg4'), { this.$confirm(this.$t('trials:iRecist:warnning:msg4'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1418,7 +1493,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg5'), { this.$confirm(this.$t('trials:iRecist:warnning:msg5'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1430,7 +1505,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg6'), { this.$confirm(this.$t('trials:iRecist:warnning:msg6'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1447,7 +1522,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg33'), { this.$confirm(this.$t('trials:iRecist:warnning:msg33'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1463,7 +1538,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg34'), { this.$confirm(this.$t('trials:iRecist:warnning:msg34'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1520,7 +1595,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg7'), { this.$confirm(this.$t('trials:iRecist:warnning:msg7'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1532,7 +1607,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg8'), { this.$confirm(this.$t('trials:iRecist:warnning:msg8'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1548,7 +1623,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg9'), { this.$confirm(this.$t('trials:iRecist:warnning:msg9'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1560,7 +1635,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg10'), { this.$confirm(this.$t('trials:iRecist:warnning:msg10'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1576,7 +1651,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg11'), { this.$confirm(this.$t('trials:iRecist:warnning:msg11'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1588,7 +1663,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg12'), { this.$confirm(this.$t('trials:iRecist:warnning:msg12'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1604,7 +1679,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg13'), { this.$confirm(this.$t('trials:iRecist:warnning:msg13'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1616,7 +1691,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg14'), { this.$confirm(this.$t('trials:iRecist:warnning:msg14'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1636,7 +1711,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg15'), { this.$confirm(this.$t('trials:iRecist:warnning:msg15'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1648,7 +1723,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg16'), { this.$confirm(this.$t('trials:iRecist:warnning:msg16'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1665,7 +1740,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg17'), { this.$confirm(this.$t('trials:iRecist:warnning:msg17'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1677,7 +1752,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg18'), { this.$confirm(this.$t('trials:iRecist:warnning:msg18'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1694,7 +1769,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg19'), { this.$confirm(this.$t('trials:iRecist:warnning:msg19'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1706,7 +1781,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg20'), { this.$confirm(this.$t('trials:iRecist:warnning:msg20'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1723,7 +1798,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg21'), { this.$confirm(this.$t('trials:iRecist:warnning:msg21'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1735,7 +1810,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg22'), { this.$confirm(this.$t('trials:iRecist:warnning:msg22'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1754,7 +1829,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg23'), { this.$confirm(this.$t('trials:iRecist:warnning:msg23'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1766,7 +1841,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg24'), { this.$confirm(this.$t('trials:iRecist:warnning:msg24'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1783,7 +1858,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg25'), { this.$confirm(this.$t('trials:iRecist:warnning:msg25'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1795,7 +1870,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg26'), { this.$confirm(this.$t('trials:iRecist:warnning:msg26'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1811,7 +1886,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg27'), { this.$confirm(this.$t('trials:iRecist:warnning:msg27'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1823,7 +1898,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg28'), { this.$confirm(this.$t('trials:iRecist:warnning:msg28'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1839,7 +1914,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg29'), { this.$confirm(this.$t('trials:iRecist:warnning:msg29'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1851,7 +1926,7 @@ export default {
this.$confirm(this.$t('trials:iRecist:warnning:msg30'), { this.$confirm(this.$t('trials:iRecist:warnning:msg30'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -2092,50 +2167,42 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-form { .measurement-form{
::v-deep .el-form-item__label { ::v-deep .el-form-item__label{
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
} }
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
.el-form-item__content
.el-form-item__content .el-select { .el-select{
width: 100%; width: 100%;
} }
.input-width1{
.input-width1 { width: calc(100% - 60px)!important;
width: calc(100% - 60px) !important;
} }
.input-width2{
.input-width2 {
width: 100% !important; width: 100% !important;
} }
} }
</style> </style>

View File

@ -8,48 +8,43 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
placement="bottom"> <i
<i class="el-icon-refresh-left" @click="resetMeasuredData" /> class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<!-- 非测量问题 --> <!-- 非测量问题 -->
<div class="lesions"> <div class="lesions">
<Questions ref="ecrf" :question-form-change-state="questionFormChangeState" <Questions
:question-form-change-num="questionFormChangeNum" :is-first-change-task="isFirstChangeTask" ref="ecrf"
@handleReadingChart="handleReadingChart" /> :question-form-change-state="questionFormChangeState"
:question-form-change-num="questionFormChangeNum"
:is-first-change-task="isFirstChangeTask"
/>
</div> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-if="questions.length > 0"> <template v-if="questions.length > 0">
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper"> <div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }} {{ language==='en'?qs.GroupEnName:qs.GroupName }}
</h4> </h4>
<div class="lesion_list"> <div class="lesion_list">
<div v-for="item in qs.Childrens" <div v-for="item in qs.Childrens" v-show="(!isConvertedTask && !(isBaseLineTask && item.LesionType === 2)) || (isConvertedTask && (isFirstChangeTask && item.LesionType !== 8) || (!isFirstChangeTask && item.LesionType !== 2))" :key="item.Id">
v-show="(!isConvertedTask && !(isBaseLineTask && item.LesionType === 2)) || (isConvertedTask && (isFirstChangeTask && item.LesionType !== 8) || (!isFirstChangeTask && item.LesionType !== 2))"
:key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;"> <div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div v-if="isFirstChangeTask && item.LesionType === 2 && readingTaskState < 2" class="title"> <div
v-if="isFirstChangeTask && item.LesionType === 2 && readingTaskState<2"
class="title"
>
{{ item.QuestionName }} {{ item.QuestionName }}
<span v-if="isFirstChangeTask && item.TableQuestions.Answers.length > 0" <span v-if="isFirstChangeTask && item.TableQuestions.Answers.length > 0" style="color:red;font-size: 12px;">{{ $t("trials:reading:dicom:IRecist:reevaluate") }}</span>
style="color:red;font-size: 12px;">{{ $t("trials:reading:dicom:IRecist:reevaluate") }}</span>
</div> </div>
<div v-else class="title"> <div v-else class="title">
{{ item.QuestionName }} {{ item.QuestionName }}
<svg-icon v-if="item.LesionType === 0" icon-class="readingChart"
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0,
QuestionName: item.QuestionName
},
})" />
</div> </div>
<div <div v-if="readingTaskState<2 && ((!isConvertedTask && (isBaseLineTask || item.LesionType === 2)) || (isConvertedTask && !isFirstChangeTask && item.LesionType === 8))" class="add-icon" @click.prevent="handleAdd(item)">
v-if="readingTaskState < 2 && ((!isConvertedTask && (isBaseLineTask || item.LesionType === 2)) || (isConvertedTask && !isFirstChangeTask && item.LesionType === 8))"
class="add-icon" @click.prevent="handleAdd(item)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
@ -57,134 +52,109 @@
111 111
</div> --> </div> -->
</div> </div>
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion <el-collapse
@change="handleCollapseChange"> v-if="item.Type === 'table' && item.TableQuestions"
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`" v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)"> @contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)"
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" <div
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }"> style="width:300px;position: relative;"
:style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}"
>
{{ getLesionName(item.OrderMark, q.RowIndex) }} {{ getLesionName(item.OrderMark,q.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip <el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip <el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom">
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div <div style="position: absolute;left: 62px;top: 2px;">
:style="{ position: 'absolute', left: item.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px' }"> <!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div <div style="font-size: 11px;width:220px;height: 30px;">
style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;"> <div
<el-tooltip v-if="item.TableQuestions.Answers[i].lesionPart"
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'" style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
class="item" effect="dark" >
:content="`${$t('trials:reading:message:fused')}${item.TableQuestions.Answers[i].SplitOrMergeLesionName}`" <el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
placement="bottom"> <span>{{ item.TableQuestions.Answers[i].lesionPart }}</span>
<div </el-tooltip>
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(item.TableQuestions.Answers[i].MergeRowId)}`" />
</div>
</el-tooltip>
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(item.TableQuestions.Answers[i].RowId)}`" />
</div> </div>
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; --> <div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
<div style="font-size: 11px;width:220px;height: 30px;"> <span v-if="item.LesionType === 0">
<div v-if="item.TableQuestions.Answers[i].lesionPart" {{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"> </span>
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" <span v-else-if="item.LesionType === 1">
:content="item.TableQuestions.Answers[i].lesionPart" placement="bottom"> {{ $fd('NoTargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
<span>{{ item.TableQuestions.Answers[i].lesionPart }}</span> </span>
</el-tooltip> <span v-else-if="item.LesionType === 2">
</div> {{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
<div </span>
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px"> <span v-else-if="item.LesionType === 5">
<span v-if="item.LesionType === 0"> {{ $fd('NewTargetLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} </span>
</span> <span v-else-if="item.LesionType === 6">
<span v-else-if="item.LesionType === 1"> {{ $fd('NewNoTargetLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NoTargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} </span>
</span> <span v-else-if="item.LesionType === 7">
<span v-else-if="item.LesionType === 2"> {{ $fd('OtherPreviousNewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} </span>
</span> <span v-else-if="item.LesionType === 8">
<span v-else-if="item.LesionType === 5"> {{ $fd('NewLesionAfterTriggeringiRECSITState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
{{ $fd('NewTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} </span>
</span> </div>
<span v-else-if="item.LesionType === 6"> <div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
{{ $fd('NewNoTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) <template v-if="item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionShort))">
}} {{ item.TableQuestions.Answers[i].lesionShort }}mm
</span> </template>
<span v-else-if="item.LesionType === 7"> <template v-else-if="!item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
{{ $fd('OtherPreviousNewLesionState', {{ item.TableQuestions.Answers[i].lesionLength }}mm
parseInt(item.TableQuestions.Answers[i].lesionState)) </template>
}}
</span>
<span v-else-if="item.LesionType === 8">
{{
$fd('NewLesionAfterTriggeringiRECSITState',
parseInt(item.TableQuestions.Answers[i].lesionState))
}}
</span>
</div>
<div
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:60px">
<template
v-if="item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionShort))">
{{ item.TableQuestions.Answers[i].lesionShort }}mm
</template>
<template
v-else-if="!item.TableQuestions.Answers[i].isLymphLesion && !isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
{{ item.TableQuestions.Answers[i].lesionLength }}mm
</template>
</div>
</div> </div>
</div> </div>
</div> </div>
<div <div v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0,1,4,5].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 5 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1) || (item.LesionType === 6 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 7 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 8 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'" style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
v-if="((item.LesionType === 0 && [0, 1, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0, 1, 4, 5].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 5 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1) || (item.LesionType === 6 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 7 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 8 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'"
style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<!-- 分裂 --> <!-- 分裂 -->
<el-tooltip <el-tooltip v-show="readingTaskState<2 && !!item.TableQuestions.Answers[i].RowId && (!isBaseLineTask && !isFirstChangeTask ) && item.TableQuestions.Answers[i].isDicomReading !== false" class="item" :content="$t('trials:reading:button:split')" placement="left">
v-show="readingTaskState < 2 && !!item.TableQuestions.Answers[i].RowId && (!isBaseLineTask && !isFirstChangeTask) && item.TableQuestions.Answers[i].isDicomReading !== false" <i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" />
class="item" :content="$t('trials:reading:button:split')" placement="left">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" />
</el-tooltip>
<!-- 融合 -->
<el-tooltip
v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '2' && ((item.LesionType === 0 && [0, 1, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))))"
class="item" :content="$t('trials:reading:button:merge')" placement="bottom">
<i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;"
@click.stop="handleMerge(item.TableQuestions.Answers[i], item.Id, item.OrderMark)" />
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions" <QuestionForm
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType" :ref="`${item.Id}_${q.RowIndex}`"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)" :questions="item.TableQuestions.Questions"
:question-name="item.QuestionName" :parent-qs-id="item.Id" :answers="item.TableQuestions.Answers[i]"
:crterion-dictionary-group="item.CrterionDictionaryGroup" :visit-task-id="visitTaskId" :lesion-type="item.LesionType"
:is-current-task="isCurrentTask" :is-first-change-task="isFirstChangeTask" :order-mark="item.OrderMark"
:is-converted-task="isConvertedTask" :reading-task-state="readingTaskState" :table-questions="tableQuestions"
:is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer" :row-index="String(q.RowIndex)"
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions" :question-name="item.QuestionName"
@close="close" @handleReadingChart="handleReadingChart" /> :parent-qs-id="item.Id"
:crterion-dictionary-group="item.CrterionDictionaryGroup"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:is-first-change-task="isFirstChangeTask"
:is-converted-task="isConvertedTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -193,35 +163,10 @@
</div> </div>
</template> </template>
</div> </div>
<el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible"
:close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px">
<div class="merge-table">
<div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
<span>{{ mergeInfo.lesionName }}</span>
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table :data="lesionData" style="width: 450px" size="small" height="200"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="45" />
<el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" />
<el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120"
show-overflow-tooltip />
</el-table>
</div>
<div slot="footer" style="text-align:right;">
<!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 -->
<el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge">
{{ $t('common:button:confirm') }}</el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { splitLesion, getCanMergeLesion, mergeLesion } from '@/api/trials' import { splitLesion } from '@/api/trials'
import { resetReadingTask } from '@/api/reading' import { resetReadingTask } from '@/api/reading'
import DicomEvent from './../DicomEvent' import DicomEvent from './../DicomEvent'
import store from '@/store' import store from '@/store'
@ -277,12 +222,7 @@ export default {
criterionType: null, criterionType: null,
subjectCode: '', subjectCode: '',
isConvertedTask: null, isConvertedTask: null,
isFirstChangeTask: null, isFirstChangeTask: null
merge: { visible: false, loading: false },
lesionData: [],
mergeInfo: {},
mergeList: []
} }
}, },
computed: { computed: {
@ -335,69 +275,6 @@ export default {
DicomEvent.$off('getUnSaveTarget') DicomEvent.$off('getUnSaveTarget')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
//
async handleMerge(answers, questionId, orderMark) {
this.lesionData = []
this.mergeList = []
this.merge.visible = true
this.mergeInfo.questionId = questionId
this.mergeInfo.mergeRowId = answers.RowId
this.mergeInfo.lesionName = this.getLesionName(orderMark, answers.RowIndex)
this.mergeInfo.lesionPart = answers.lesionPart
this.merge.loading = true
try {
const res = await getCanMergeLesion({ rowId: answers.RowId })
if (res.IsSuccess) {
this.lesionData = res.Result
}
this.merge.loading = false
} catch (e) {
console.log(e)
this.merge.loading = false
}
},
handleSelectionChange(val) {
this.mergeList = []
val.map(i => {
this.mergeList.push(i.RowId)
})
},
confirmMerge() {
// ', ?'
this.$confirm(this.$t('trials:reading:lugano:warnning:fuse'), {
type: 'warning'
}).then(() => {
this.lesionMerge()
}).catch(() => {
})
},
async lesionMerge() {
this.merge.loading = true
try {
var params = {
visitTaskId: this.visitTaskId,
questionId: this.mergeInfo.questionId,
mergeMainRowId: this.mergeInfo.mergeRowId,
mergeRowIdList: this.mergeList
}
const res = await mergeLesion(params)
if (res.IsSuccess) {
this.merge.visible = false
DicomEvent.$emit('readingPageUpdate', {})
DicomEvent.$emit('getReportInfo', true)
DicomEvent.$emit('setMeasuredToolsPassive')
this.getReadingQuestionAndAnswer()
}
this.merge.loading = false
} catch (e) {
this.merge.loading = false
console.log(e)
}
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -691,7 +568,7 @@ export default {
.then(() => { .then(() => {
this.split(rowId, questionId) this.split(rowId, questionId)
}) })
.catch(() => { }) .catch(() => {})
} else { } else {
// //
this.$confirm(this.$t('trials:reading:warnning:msg4'), { this.$confirm(this.$t('trials:reading:warnning:msg4'), {
@ -701,7 +578,7 @@ export default {
.then(() => { .then(() => {
this.split(rowId, questionId) this.split(rowId, questionId)
}) })
.catch(() => { }) .catch(() => {})
} }
} }
} }
@ -859,7 +736,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
return return
} }
@ -870,7 +747,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
} else { } else {
// saveTypeEnum: 0 // saveTypeEnum: 0
@ -1021,7 +898,7 @@ export default {
async changeLesionType(questionsObj) { async changeLesionType(questionsObj) {
await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId }) await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
// saveTypeEnum: 0 // saveTypeEnum: 0
var lesionObj = {} var lesionObj = { }
var questionObj = questionsObj.questionForm var questionObj = questionsObj.questionForm
// //
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType) var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
@ -1299,90 +1176,23 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.login-cycle { .measurement-wrapper{
width: 5px;
height: 5px;
display: inline-block;
background-color: #428bca;
border-radius: 50%;
margin-right: 2px;
margin-bottom: 2px;
}
.merge-table {
padding: 0 10px;
::v-deep.el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
.el-table--border::after,
.el-table--group::after,
.el-table::before {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
border-bottom: 1px solid #383838;
}
}
::v-deep.el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
tr:hover>td {
background-color: #1e1e1e !important;
}
}
::v-deep.el-table__empty-block {
background-color: #1e1e1e !important;
}
.merge-label {
color: #ddd;
font-size: 13px;
margin-bottom: 10px;
span {
font-size: 15px;
color: red;
}
}
}
.measurement-wrapper {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
// overflow: hidden; // overflow: hidden;
.container { .container{
padding: 10px; padding: 10px;
.basic-info{
.basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3{
h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i{
i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
font-weight: bold; font-weight: bold;
@ -1390,16 +1200,14 @@ export default {
} }
} }
} }
.title{
.title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
font-size: 15px; font-size: 15px;
} }
.add-icon{
.add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
@ -1408,49 +1216,42 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
.flex-row { .flex-row{
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
background-color: #424242; background-color: #424242;
} }
.lesion_list{
.lesion_list {
position: relative; position: relative;
} }
.el-collapse{
.el-collapse { border-bottom:none;
border-bottom: none; border-top:none;
border-top: none; ::v-deep .el-collapse-item{
background-color: #000!important;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header{
::v-deep .el-collapse-item__header { background-color: #000!important;
background-color: #000 !important;
color: #ddd; color: #ddd;
border-bottom-color: #5a5a5a; border-bottom-color:#5a5a5a;
padding-left: 5px; padding-left: 5px;
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap{
::v-deep .el-collapse-item__wrap { background-color: #000!important;
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content{
::v-deep .el-collapse-item__content { width:260px;
width: 260px;
position: absolute; position: absolute;
top: 0px; top: 0px;
right: 0px; right: 0px;
@ -1459,7 +1260,7 @@ export default {
z-index: 1; z-index: 1;
color: #ddd; color: #ddd;
padding: 5px; padding: 5px;
background-color: #1e1e1e; background-color:#1e1e1e;
} }
} }

View File

@ -18,7 +18,7 @@
<!-- 影像质量问题 --> <!-- 影像质量问题 -->
<div class="lesions"> <div class="lesions">
<Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false" <Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false"
:group-classify="1" @handleReadingChart="handleReadingChart" /> :group-classify="1" />
</div> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-if="questions.length > 0"> <template v-if="questions.length > 0">
@ -37,8 +37,7 @@
<div class="add-icon" @click.prevent="downloadTpl"> <div class="add-icon" @click.prevent="downloadTpl">
<i class="el-icon-download" /> <i class="el-icon-download" />
</div> </div>
<div class="add-icon" style="margin: 0 5px;" <div class="add-icon" style="margin: 0 5px;" @click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
@click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
<i class="el-icon-upload2" /> <i class="el-icon-upload2" />
</div> </div>
<div class="add-icon" @click.prevent="handleAddOrEdit('add', item)"> <div class="add-icon" @click.prevent="handleAddOrEdit('add', item)">
@ -101,19 +100,9 @@
@change="((val) => { formItemChange(val, item) })" /> @change="((val) => { formItemChange(val, item) })" />
</template> </template>
<template v-if="item.Type === 'number'"> <template v-if="item.Type === 'number'">
<div style="display: flex;justify-content: space-between;"> <el-input-number v-model="questionForm[item.Id]"
<el-input-number v-model="questionForm[item.Id]" :disabled="!isCurrentTask || readingTaskState >= 2" :precision="0"
:disabled="!isCurrentTask || readingTaskState >= 2" :precision="0" @change="((val) => { formItemChange(val, item) })" />
@change="((val) => { formItemChange(val, item) })" />
<svg-icon v-if="item.ShowChartTypeEnum > 0" icon-class="readingChart"
class="svg-icon svg-readingChart" @click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: item.Id,
QuestionName: item.QuestionName
}
})" />
</div>
</template> </template>
<template v-if="item.Type === 'select'"> <template v-if="item.Type === 'select'">
<el-select v-model="questionForm[item.Id]" :disabled="!isCurrentTask || readingTaskState >= 2" <el-select v-model="questionForm[item.Id]" :disabled="!isCurrentTask || readingTaskState >= 2"
@ -170,7 +159,7 @@
<el-form ref="tableQsForm" v-loading="loading" :model="qsForm" size="small"> <el-form ref="tableQsForm" v-loading="loading" :model="qsForm" size="small">
<QuestionTableFormItem v-for="item in qsList" :key="item.Id" :question="item" :question-form="qsForm" <QuestionTableFormItem v-for="item in qsList" :key="item.Id" :question="item" :question-form="qsForm"
:reading-task-state="readingTaskState" @setFormItemData="setFormItemData" :reading-task-state="readingTaskState" @setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" /> @resetFormItemData="resetFormItemData" />
<el-form-item style="text-align: right"> <el-form-item style="text-align: right">
<el-button size="small" @click="addOrEdit.visible = false"> <el-button size="small" @click="addOrEdit.visible = false">
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
@ -297,9 +286,6 @@ export default {
DicomEvent.$off('refreshQuestions') DicomEvent.$off('refreshQuestions')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {

View File

@ -1,66 +1,119 @@
<template> <template>
<div> <div>
<div v-if="!!question.GroupName && question.Type === 'group'"> <div
v-if="!!question.GroupName && question.Type==='group'"
>
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? question.GroupEnName : question.GroupName }} {{ language==='en'?question.GroupEnName:question.GroupName }}
</h4> </h4>
</div> </div>
<template v-else> <template v-else>
<el-form-item <el-form-item
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0" v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[ :label="`${question.QuestionName}`"
{ :prop="question.Id"
required: (question.IsRequired === 0 || (question.IsRequired === 1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type !== 'group' && question.Type !== 'summary', :rules="[
message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change'] { required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type!=='group' && question.Type!=='summary',
}, message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']},
]" ]"
:class="[question.Type === 'group' ? 'mb' : (question.Type === 'upload' || question.QuestionName.length > 15) ? 'uploadWrapper' : '']"> :class="[question.Type==='group' ? 'mb' : (question.Type==='upload' || question.QuestionName.length > 15) ?'uploadWrapper' : '']"
>
<!-- 输入框 --> <!-- 输入框 -->
<el-input v-if="question.Type === 'input'" v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" <el-input
@change="((val) => { formItemChange(val, question) })" /> v-if="question.Type==='input'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea" <el-input
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2" v-else-if="question.Type==='textarea'"
@change="((val) => { formItemChange(val, question) })" /> v-model="questionForm[question.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]" <el-select
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode)" :disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode)"
clearable @change="((val) => { formItemChange(val, question) })"> clearable
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.TableQuestionType === 1"> <template v-if="question.TableQuestionType === 1">
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]" <el-option
:value="item[question.DataTableColumn]" /> v-for="item in organList"
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
</template> </template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3"> <template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" <el-option
:label="item.label" /> v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template <template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode"> <el-option
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" v-for="item of $d[question.DictionaryCode]"
:label="item.label" /> :key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]" <el-radio-group
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })"> v-else-if="question.Type==='radio'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.DictionaryCode"> <template v-if="question.DictionaryCode">
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)"> <el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</template> </template>
<template v-else-if="question.TypeValue"> <template v-else-if="question.TypeValue">
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val"> <el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</template> </template>
</el-radio-group> </el-radio-group>
<!-- 复选框 --> <!-- 复选框 -->
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]" <el-checkbox-group
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })"> v-else-if="question.Type==='checkbox'"
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val"> v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
@ -91,38 +144,40 @@
/> />
</template> --> </template> -->
<!-- 数值类型 --> <!-- 数值类型 -->
<div style="display: flex;justify-content: space-between;" <el-input
v-else-if="question.Type === 'number' || question.Type === 'calculation'"> v-else-if="question.Type==='number'"
<el-input v-if="question.Type === 'number'" v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" type="number" @change="((val) => { formItemChange(val, question) })"> :disabled="readingTaskState>=2 "
<template v-if="question.Unit" slot="append"> type="number"
{{ $fd('ValueUnit', parseInt(question.Unit)) }} @change="((val)=>{formItemChange(val, question)})"
</template> >
</el-input> <template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
<el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled </template>
@change="((val) => { formItemChange(val, question) })"> </el-input>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: question.Id,
RowIndex: questionForm.RowIndex,
QuestionName: question.QuestionName
}
})" />
</div>
<el-input
v-else-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
</el-form-item> </el-form-item>
</template> </template>
<QuestionTableFormItem v-for="item in question.Childrens" :key="item.Id" :question="item" <QuestionTableFormItem
:question-form="questionForm" :reading-task-state="readingTaskState" @setFormItemData="setFormItemData" v-for="item in question.Childrens"
@resetFormItemData="resetFormItemData" /> :key="item.Id"
:question="item"
:question-form="questionForm"
:reading-task-state="readingTaskState"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</div> </div>
</template> </template>
<script> <script>
@ -159,9 +214,6 @@ export default {
this.digitPlaces = Number(localStorage.getItem('digitPlaces')) this.digitPlaces = Number(localStorage.getItem('digitPlaces'))
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
formItemChange(v, question) { formItemChange(v, question) {
if (question.Childrens && question.Childrens.length > 0) { if (question.Childrens && question.Childrens.length > 0) {
this.resetChild(question.Childrens) this.resetChild(question.Childrens)
@ -217,36 +269,29 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.mb { .mb{
margin-bottom: 0px; margin-bottom: 0px;
} }
.disabled{
.disabled {
::v-deep .el-upload--picture-card { ::v-deep .el-upload--picture-card {
display: none; display: none;
} }
} }
.uploadWrapper{
.uploadWrapper {
display: flex; display: flex;
flex-direction: column !important; flex-direction: column !important;
align-items: flex-start; align-items: flex-start;
} }
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner { background-color: #646464a1;
background-color: #646464a1; }
} ::v-deep .el-input-group__append, .el-input-group__prepend{
padding: 0 10px;
::v-deep .el-input-group__append, }
.el-input-group__prepend { ::v-deep .el-form-item__content {
padding: 0 10px; width: 100%;
} }
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-form-item__content { background-color: #646464a1;
width: 100%; }
}
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
</style> </style>

View File

@ -4,7 +4,7 @@
class="upload-excel-file" class="upload-excel-file"
> >
<!-- 文件 --> <!-- 文件 -->
<el-form-item :label="$t('trials:consistencyCheck:label:file2')"> <el-form-item :label="$t('trials:consistencyCheck:label:file')">
<div class="upload-container"> <div class="upload-container">
<el-upload <el-upload
class="upload-demo" class="upload-demo"

View File

@ -1,6 +1,12 @@
<template> <template>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini" <el-form
class="measurement-form"> v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -13,137 +19,198 @@
</div> </div>
</div> </div>
<div ref="scrollPanel" style="height: 420px;overflow-y: auto;overflow-x: hidden;" @scroll.stop="scrollHandle"> <div ref="scrollPanel" style="height: 420px;overflow-y: auto;overflow-x: hidden;" @scroll.stop="scrollHandle">
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[ <el-form-item
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] }, :label="$t('trials:reading:title:lesionType')"
]"> prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select :ref="`select_LesionType`" v-model="questionForm.LesionType" filterable <el-select
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask || answers.SplitOrMergeType === '1'" :ref="`select_LesionType`"
@change="((val) => { lesionTypeChange(val) })"> v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id" <el-option
:value="item.value" :label="item.label" /> v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`" <el-form-item
:prop="qs.Id" :rules="[ v-for="qs in questions"
{ v-show="qs.ShowQuestion!==2"
required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (qs.RelevanceValue.includes(questionForm[qs.RelevanceId]))) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type !== 'group' && qs.Type !== 'summary', :key="qs.Id"
message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change'] :label="`${qs.QuestionName}`"
}, :prop="qs.Id"
]"> :rules="[
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (qs.RelevanceValue.includes(questionForm[qs.RelevanceId]))) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary',
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
>
<!-- 输入框 --> <!-- 输入框 -->
<template v-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-if="qs.Type==='input' || qs.Type==='number'">
<div style="display: flex;justify-content: space-between;">
<el-input v-if="qs.Type === 'input' || qs.Type === 'number'" v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || answers.SplitOrMergeType === '1'"
@change="((val) => { formItemChange(val, qs) })">
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</div>
<!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} --> <!-- {{ ((qs.QuestionMark === 6 && isCurrentTaskAdd === 'False') || (qs.QuestionMark === 6 && isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition)) }} -->
<el-input
v-if="qs.Type==='input' || qs.Type==='number'"
v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || answers.SplitOrMergeType === '1'"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
</template> </template>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea" <el-input
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" v-if="qs.Type==='textarea'"
:disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'" v-model="questionForm[qs.Id]"
@change="((val) => { formItemChange(val, qs) })" /> type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="!isCurrentTask || readingTaskState>=2 || answers.SplitOrMergeType === '1'"
@change="((val)=>{formItemChange(val, qs)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<!-- :disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && qs.QuestionMark === 5 && isCurrentTaskAdd === 'False') || qs.QuestionMark === 2 || (qs.QuestionMark === 8 && !isBaseLineTask && isCurrentTaskAdd === 'False')" --> <!-- :disabled="!isCurrentTask || readingTaskState>=2 || (!isBaseLineTask && qs.QuestionMark === 5 && isCurrentTaskAdd === 'False') || qs.QuestionMark === 2 || (qs.QuestionMark === 8 && !isBaseLineTask && isCurrentTaskAdd === 'False')" -->
<el-select v-if="qs.Type === 'select'" :ref="`select_${qs.Id}`" v-model="questionForm[qs.Id]" filterable <el-select
v-if="qs.Type==='select'"
:ref="`select_${qs.Id}`"
v-model="questionForm[qs.Id]"
filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')" :placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 7 && stateDisabled) || answers.SplitOrMergeType === '1' || (qs.QuestionMark === 7 && answers.SplitOrMergeType === '3')" :disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False'|| !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 7 && stateDisabled) || answers.SplitOrMergeType === '1' || (qs.QuestionMark === 7 && answers.SplitOrMergeType === '3')"
@change="((val) => { formItemChange(val, qs) })"> @change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.QuestionMark === 8" #prefix> <template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;"> <span style="padding-left: 5px;">
<i class="el-icon-search" /> <i class="el-icon-search" />
</span> </span>
</template> </template>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]" <el-option
:value="item[qs.DataTableColumn]" /> v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option v-for="item of $d[qs.DictionaryCode]" <el-option
v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))" v-for="item of $d[qs.DictionaryCode]"
:key="item.id" :value="item.value" :label="item.label" /> v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option-group <el-option-group
:label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode, parseFloat(answers.LastTaskState))}` : ''"> :label="!isNaN(parseFloat(answers.LastTaskState)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(qs.DictionaryCode,parseFloat(answers.LastTaskState))}` : ''"
>
<!-- 首次分裂的病灶只能选择存在 --> <!-- 首次分裂的病灶只能选择存在 -->
<template v-if="answers.IsFristAdd === 'True' && answers.SplitOrMergeType === '0'"> <template v-if="answers.IsFristAdd=== 'True' && answers.SplitOrMergeType === '0'">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id" <el-option
:value="item.value" :label="item.label" /> v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<!-- 首次添加的新病灶不能为无法评估和消失 --> <!-- 首次添加的新病灶不能为无法评估和消失 -->
<template v-else-if="isCurrentTaskAdd === 'True' && lesionType === 2"> <template v-else-if="isCurrentTaskAdd=== 'True' && lesionType === 2">
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0 || item.value === 1" <el-option
:key="item.id" :value="item.value" :label="item.label" /> v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value" <el-option
:label="item.label" /> v-for="item of filterState($d[qs.DictionaryCode])"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
</el-option-group> </el-option-group>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" /> <el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]" <el-radio-group
:disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'"> v-if="qs.Type==='radio'"
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val" v-model="questionForm[qs.id]"
@change="((val) => { formItemChange(val, qs) })"> :disabled="!isCurrentTask || readingTaskState>=2 || answers.SplitOrMergeType === '1'"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
@change="((val)=>{formItemChange(val, qs)})"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
<template v-if="qs.QuestionMark === 20"> <template v-if="qs.QuestionMark === 20">
<div style="display: flex;flex-direction: row;justify-content: flex-start;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;">
<div style="display: flex;justify-content: space-between;" v-if="qs.Type === 'calculation'">
<el-input v-if="qs.Type === 'calculation'" v-model="questionForm[qs.Id]" disabled style="width:120px;" <el-input
@change="((val) => { formItemChange(val, qs) })"> v-if="qs.Type==='calculation'"
<template v-if="qs.Unit" slot="append"> v-model="questionForm[qs.Id]"
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} disabled
</template> style="width:120px;"
</el-input> @change="((val)=>{formItemChange(val, qs)})"
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" >
@click.stop="(e) => handleReadingChart({ <template v-if="qs.Unit" slot="append">
e, {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
data: { </template>
TableQuestionId: qs.Id, </el-input>
RowIndex: questionForm.RowIndex, <viewer
QuestionName: qs.QuestionName v-if="answers.OtherPicturePath"
} ref="viewer"
})" /> style="margin:0 10px;"
</div> :images="[`${OSSclientConfig.basePath}${answers.OtherPicturePath}`]"
<viewer v-if="answers.OtherPicturePath" ref="viewer" style="margin:0 10px;" >
:images="[`${OSSclientConfig.basePath}${answers.OtherPicturePath}`]">
<span style="color:#409eff;cursor: pointer" @click="previewImage()"> <span style="color:#409eff;cursor: pointer" @click="previewImage()">
{{ $t('trials:lugano:button:suvscreenshot1') }} {{ $t('trials:lugano:button:suvscreenshot1') }}
</span> </span>
<img v-show="false" crossorigin="anonymous" <img
:src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`" alt="Image"> v-show="false"
crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`"
alt="Image"
>
</viewer> </viewer>
<!-- <img <!-- <img
v-if="answers.OtherPicturePath" v-if="answers.OtherPicturePath"
@ -159,40 +226,45 @@
</div> </div>
</template> </template>
<template v-else> <template v-else>
<div style="display: flex;justify-content: space-between;" v-if="qs.Type === 'calculation'"> <el-input
<el-input v-if="qs.Type === 'calculation'" v-model="questionForm[qs.Id]" disabled v-if="qs.Type==='calculation'"
@change="((val) => { formItemChange(val, qs) })"> v-model="questionForm[qs.Id]"
<template v-if="qs.Unit" slot="append"> disabled
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} @change="((val)=>{formItemChange(val, qs)})"
</template> >
</el-input> <template v-if="qs.Unit" slot="append">
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
@click.stop="(e) => handleReadingChart({ </template>
e, </el-input>
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</div>
</template> </template>
</el-form-item> </el-form-item>
</div> </div>
<div <div
v-if="isCurrentTask && readingTaskState < 2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')" v-if="isCurrentTask && readingTaskState<2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')"
class="base-dialog-footer" style="text-align:right;margin-top:10px;"> class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button v-if="questionForm.MeasureData" size="mini" @click="handleDeleteMeasureData"> <el-button
v-if="questionForm.MeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" @click="handleDelete"> <el-button
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button size="mini" @click="handleSave"> <el-button
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -296,9 +368,6 @@ export default {
// container.removeEventListener('scroll', this.scrollHandle , true) // container.removeEventListener('scroll', this.scrollHandle , true)
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
scrollHandle() { scrollHandle() {
for (const k in this.$refs) { for (const k in this.$refs) {
if (k.indexOf('select_') === -1) continue if (k.indexOf('select_') === -1) continue
@ -436,11 +505,11 @@ export default {
if ((ldi > 15 && ldi <= 20) && (pddIncrease >= 50) && (ldiIncrease >= 5 || sdiIncrease >= 5)) { if ((ldi > 15 && ldi <= 20) && (pddIncrease >= 50) && (ldiIncrease >= 5 || sdiIncrease >= 5)) {
this.stateDisabled = true this.stateDisabled = true
} else if ((ldi > 20) && (pddIncrease >= 50) && (ldiIncrease >= 10 || sdiIncrease >= 10)) { } else if ((ldi > 20) && (pddIncrease >= 50) && (ldiIncrease >= 10 || sdiIncrease >= 10)) {
/** /**
* 当前靶病灶LDi>20 mm * 当前靶病灶LDi>20 mm
* 相比最低点PPD增加百分比 50 * 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm * 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm
**/ **/
this.stateDisabled = true this.stateDisabled = true
} else { } else {
this.stateDisabled = false this.stateDisabled = false
@ -538,8 +607,8 @@ export default {
type: 'warning', type: 'warning',
distinguishCancelAndClose: true distinguishCancelAndClose: true
}) })
.then(() => { }) .then(() => {})
.catch(() => { }) .catch(() => {})
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType) this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return return
} }
@ -552,7 +621,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType) this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return return
@ -584,7 +653,7 @@ export default {
}) })
}, },
deleteLesionInfo() { deleteLesionInfo() {
return new Promise(async (resolve, reject) => { return new Promise(async(resolve, reject) => {
const loading = this.$loading({ fullscreen: true }) const loading = this.$loading({ fullscreen: true })
var param = { var param = {
visitTaskId: this.visitTaskId, visitTaskId: this.visitTaskId,
@ -713,8 +782,8 @@ export default {
this.$set(this.questionForm, stateId, 0) this.$set(this.questionForm, stateId, 0)
} }
var lesionLength = this.getQuestionVal(0) var lesionLength = this.getQuestionVal(0)
// && this.lesionType === 0 //
if (!(this.isCurrentTaskAdd === 'True') && !this.isBaseLineTask && measureData.type === 'Bidirectional') { if (!(this.isCurrentTaskAdd === 'True') && this.lesionType === 0 && !this.isBaseLineTask && measureData.type === 'Bidirectional') {
if (isLymphLesion) { if (isLymphLesion) {
// //
if (lesionLength > 15) { if (lesionLength > 15) {
@ -741,7 +810,7 @@ export default {
if (this.lesionType === 0) { if (this.lesionType === 0) {
this.calculatePPD() this.calculatePPD()
} }
var status = '' var status = ''
if (lesionState) { if (lesionState) {
if (this.lesionType === 0 && lesionState === 1) { if (this.lesionType === 0 && lesionState === 1) {
@ -896,31 +965,31 @@ export default {
this.stateDisabled = false this.stateDisabled = false
} }
} else { } else {
/** /**
* 15mm<当前靶病灶LDi20mm * 15mm<当前靶病灶LDi20mm
* 相比最低点PPD增加百分比 50 * 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 5 mm 或者 相比PPD最低点SDi增加值5 mm * 相比PPD最低点LDi增加值 5 mm 或者 相比PPD最低点SDi增加值5 mm
**/ **/
if ((ldi > 15 && ldi <= 20) && (pddIncreaseNum >= 50) && (ldiIncrease >= 5 || sdiIncrease >= 5)) { if ((ldi > 15 && ldi <= 20) && (pddIncreaseNum >= 50) && (ldiIncrease >= 5 || sdiIncrease >= 5)) {
const stateId = this.getQuestionId(7) const stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, 4) this.$set(this.questionForm, stateId, 4)
this.stateDisabled = true this.stateDisabled = true
} else if ((ldi > 20) && (pddIncreaseNum >= 50) && (ldiIncrease >= 10 || sdiIncrease >= 10)) { } else if ((ldi > 20) && (pddIncreaseNum >= 50) && (ldiIncrease >= 10 || sdiIncrease >= 10)) {
/** /**
* 当前靶病灶LDi>20 mm * 当前靶病灶LDi>20 mm
* 相比最低点PPD增加百分比 50 * 相比最低点PPD增加百分比 50
* 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm * 相比PPD最低点LDi增加值 10 mm 或者 相比PPD最低点SDi增加值Sdi 10 mm
**/ **/
const stateId = this.getQuestionId(7) const stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, 4) this.$set(this.questionForm, stateId, 4)
this.stateDisabled = true this.stateDisabled = true
} else { } else {
// //
// const lesionState = !isNaN(parseInt(this.getQuestionVal(7))) ? parseInt(this.getQuestionVal(7)) : '' // const lesionState = !isNaN(parseInt(this.getQuestionVal(7))) ? parseInt(this.getQuestionVal(7)) : ''
// if (lesionState === 4) { // if (lesionState === 4) {
// const stateId = this.getQuestionId(7) // const stateId = this.getQuestionId(7)
// this.$set(this.questionForm, stateId, null) // this.$set(this.questionForm, stateId, null)
// } // }
this.stateDisabled = false this.stateDisabled = false
} }
} }
@ -1063,7 +1132,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState1'), { this.$confirm(this.$t('trials:lugano:message:validState1'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1074,7 +1143,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState2'), { this.$confirm(this.$t('trials:lugano:message:validState2'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1090,7 +1159,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg21'), { this.$confirm(this.$t('trials:reading:warnning:msg21'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1101,7 +1170,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState12'), { this.$confirm(this.$t('trials:lugano:message:validState12'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1118,7 +1187,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState3'), { this.$confirm(this.$t('trials:lugano:message:validState3'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1130,7 +1199,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState4'), { this.$confirm(this.$t('trials:lugano:message:validState4'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1146,7 +1215,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg25'), { this.$confirm(this.$t('trials:reading:warnning:msg25'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1165,7 +1234,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg26'), { this.$confirm(this.$t('trials:reading:warnning:msg26'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1189,7 +1258,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg27'), { this.$confirm(this.$t('trials:reading:warnning:msg27'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1201,7 +1270,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg28'), { this.$confirm(this.$t('trials:reading:warnning:msg28'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1212,13 +1281,13 @@ export default {
// 3 // 3
if (this.lesionType === 0 && lesionState === 3) { if (this.lesionType === 0 && lesionState === 3) {
if (lymphNodes === 1) { if (lymphNodes === 1) {
// 使 measureData.type === 'ArrowAnnotate' || // 使
if (!(measureData && (measureData.type === 'Bidirectional'))) { if (!(measureData && (measureData.type === 'ArrowAnnotate' || measureData.type === 'Bidirectional'))) {
// 使 // 使
this.$confirm(this.$t('trials:lugano:message:validState5'), { this.$confirm(this.$t('trials:lugano:message:validState5'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1227,7 +1296,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState6'), { this.$confirm(this.$t('trials:lugano:message:validState6'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1244,12 +1313,12 @@ export default {
// } // }
} else { } else {
// //
if (!(measureData && (measureData.type === 'ArrowAnnotate'))) { if (!(measureData && measureData.type === 'ArrowAnnotate')) {
// 使 // 使
this.$confirm(this.$t('trials:lugano:warnning:validState7'), { this.$confirm(this.$t('trials:reading:warnning:msg30'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1278,7 +1347,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState7'), { this.$confirm(this.$t('trials:lugano:message:validState7'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1290,7 +1359,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState8'), { this.$confirm(this.$t('trials:lugano:message:validState8'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1307,7 +1376,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg31'), { this.$confirm(this.$t('trials:reading:warnning:msg31'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1319,7 +1388,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState9'), { this.$confirm(this.$t('trials:lugano:message:validState9'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1336,7 +1405,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg33'), { this.$confirm(this.$t('trials:reading:warnning:msg33'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1348,7 +1417,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState10'), { this.$confirm(this.$t('trials:lugano:message:validState10'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1365,7 +1434,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg35'), { this.$confirm(this.$t('trials:reading:warnning:msg35'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1377,7 +1446,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg36'), { this.$confirm(this.$t('trials:reading:warnning:msg36'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1389,12 +1458,12 @@ export default {
if (this.lesionType === 1 && lesionState === 3) { if (this.lesionType === 1 && lesionState === 3) {
if (lymphNodes === 1) { if (lymphNodes === 1) {
// 使 // 使
if (!(measureData && (measureData.type === 'ArrowAnnotate' || (measureData.type === 'Bidirectional' && lesionLength < 15)))) { if (!(measureData && (measureData.type === 'ArrowAnnotate'))) {
// 使 // 使
this.$confirm(this.$t('trials:reading:warnning:lgmsg37'), { this.$confirm(this.$t('trials:reading:warnning:msg37'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1406,7 +1475,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg38'), { this.$confirm(this.$t('trials:reading:warnning:msg38'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1423,7 +1492,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg39'), { this.$confirm(this.$t('trials:reading:warnning:msg39'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1435,7 +1504,7 @@ export default {
this.$confirm(this.$t('trials:lugano:message:validState11'), { this.$confirm(this.$t('trials:lugano:message:validState11'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1481,7 +1550,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg43'), { this.$confirm(this.$t('trials:reading:warnning:msg43'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1493,7 +1562,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg44'), { this.$confirm(this.$t('trials:reading:warnning:msg44'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1505,12 +1574,12 @@ export default {
if (this.lesionType === 2 && lesionState === 3) { if (this.lesionType === 2 && lesionState === 3) {
if (lymphNodes === 1) { if (lymphNodes === 1) {
// 使 // 使
if (!(measureData && (measureData.type === 'ArrowAnnotate' || (measureData.type === 'Bidirectional' && lesionLength < 15)))) { if (!(measureData && (measureData.type === 'ArrowAnnotate'))) {
// 使 // 使
this.$confirm(this.$t('trials:reading:warnning:lgmsg45'), { this.$confirm(this.$t('trials:reading:warnning:msg45'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1522,7 +1591,7 @@ export default {
this.$confirm(this.$t('trials:reading:warnning:msg46'), { this.$confirm(this.$t('trials:reading:warnning:msg46'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -1768,62 +1837,51 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-form { .measurement-form{
::v-deep .el-form-item__label { ::v-deep .el-form-item__label{
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
flex-wrap: wrap; flex-wrap: wrap;
} }
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-input-group__append, .el-input-group__prepend{
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px; padding: 0 10px;
} }
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
.el-form-item__content
.el-form-item__content .el-select { .el-select{
width: 100%; width: 100%;
} }
.input-width1{
.input-width1 { width: calc(100% - 60px)!important;
width: calc(100% - 60px) !important;
} }
.input-width2{
.input-width2 {
width: 100% !important; width: 100% !important;
} }
.suv_viewer{
.suv_viewer {
::v-deep .viewer-play { ::v-deep .viewer-play {
display: none; display: none;
} }
} }
} }
</style> </style>

View File

@ -8,9 +8,11 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
placement="bottom"> <i
<i class="el-icon-refresh-left" @click="resetMeasuredData" /> class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
@ -23,135 +25,121 @@
:question-form-change-num="questionFormChangeNum" :question-form-change-num="questionFormChangeNum"
:group-classify="1" :group-classify="1"
/> --> /> -->
<Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false" <Questions
:group-classify="1" @handleReadingChart="handleReadingChart" /> ref="ecrf"
:question-form-change-state="true"
:question-form-change-num="0"
:is-qulity-issues="false"
:group-classify="1"
/>
</div> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-if="questions.length > 0 && CriterionType !== 10"> <template v-if="questions.length > 0 && CriterionType !== 10">
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper"> <div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }} {{ language==='en'?qs.GroupEnName:qs.GroupName }}
</h4> </h4>
<div class="lesion_list"> <div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id"> <div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;"> <div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }} <div class="title">{{ item.QuestionName }}</div>
<svg-icon v-if="item.LesionType === 0" icon-class="readingChart" <div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 0,
QuestionName: item.QuestionName
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<!-- @change="handleCollapseChange(qs.Childrens,item)" --> <!-- @change="handleCollapseChange(qs.Childrens,item)" -->
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion <el-collapse
@change="handleCollapseChange"> v-if="item.Type === 'table' && item.TableQuestions"
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`" v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)"> @contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)"
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" <div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}">
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.OrderMark, q.RowIndex) }} {{ getLesionName(item.OrderMark,q.RowIndex) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip <el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip <el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom">
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div <div :style="{position: 'absolute',left: item.LesionType === 1 && readingTaskState < 2?'58px':'50px',top: '2px'}">
:style="{ position: 'absolute', left: item.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px' }">
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; --> <!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div <div style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;"> <el-tooltip v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'" class="item" effect="dark" :content="`${$t('trials:reading:message:fused')}${item.TableQuestions.Answers[i].SplitOrMergeLesionName}`" placement="bottom">
<el-tooltip <div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'" <span class="login-cycle" />
class="item" effect="dark"
:content="`${$t('trials:reading:message:fused')}${item.TableQuestions.Answers[i].SplitOrMergeLesionName}`"
placement="bottom">
<div
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(item.TableQuestions.Answers[i].MergeRowId)}`" />
</div> </div>
</el-tooltip> </el-tooltip>
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'"> <div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'">
<span class="login-cycle" <span class="login-cycle" />
:style="`background-color:${$GuidToColor(item.TableQuestions.Answers[i].RowId)}`" />
</div> </div>
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" <el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
:content="item.TableQuestions.Answers[i].lesionPart" placement="bottom"> <div v-if="item.TableQuestions.Answers[i].lesionPart" style="max-width: 100px;overflow: hidden;">
<div v-if="item.TableQuestions.Answers[i].lesionPart"
style="max-width: 100px;overflow: hidden;">
{{ item.TableQuestions.Answers[i].lesionPart }} {{ item.TableQuestions.Answers[i].lesionPart }}
</div> </div>
</el-tooltip> </el-tooltip>
<div v-if="item.LesionType === 0" style="margin:0 5px;"> <div v-if="item.LesionType === 0" style="margin:0 5px;">
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div> </div>
<div v-else-if="item.LesionType === 1" style="margin:0 5px;"> <div v-else-if="item.LesionType === 1" style="margin:0 5px;">
{{ $fd('NoTargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NoTargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div> </div>
<div v-else style="margin:0 5px;"> <div v-else style="margin:0 5px;">
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div> </div>
<div v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))"> <div v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
<el-tooltip class="item" effect="dark" <el-tooltip class="item" effect="dark" :content="`${item.TableQuestions.Answers[i].lesionLength}*${item.TableQuestions.Answers[i].lesionShort}m㎡`" placement="bottom">
:content="`${item.TableQuestions.Answers[i].lesionLength}*${item.TableQuestions.Answers[i].lesionShort}m㎡`" <span>{{ item.TableQuestions.Answers[i].lesionLength }}*{{ item.TableQuestions.Answers[i].lesionShort }}m</span>
placement="bottom">
<span>{{ item.TableQuestions.Answers[i].lesionLength }}*{{
item.TableQuestions.Answers[i].lesionShort }}m</span>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
</div> </div>
<div v-if="item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False' && readingTaskState < 2" <div v-if="item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False' && readingTaskState < 2" style="position: absolute;right: 5px;top: 2px;">
style="position: absolute;right: 5px;top: 2px;">
<!-- 分裂 --> <!-- 分裂 -->
<el-tooltip <el-tooltip v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '4' && ((item.LesionType === 0 && [0,4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 1 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0))" class="item" :content="$t('trials:reading:button:split')" placement="bottom">
v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '4' && ((item.LesionType === 0 && [0, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 1 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0))" <i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" />
class="item" :content="$t('trials:reading:button:split')" placement="bottom">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" />
</el-tooltip> </el-tooltip>
<!-- 融合 --> <!-- 融合 -->
<el-tooltip <el-tooltip v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '2' && ((item.LesionType === 0 && [0,1,4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))))" class="item" :content="$t('trials:reading:button:merge')" placement="bottom">
v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '2' && ((item.LesionType === 0 && [0, 1, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))))" <i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;" @click.stop="handleMerge(item.TableQuestions.Answers[i],item.Id,item.OrderMark)" />
class="item" :content="$t('trials:reading:button:merge')" placement="bottom">
<i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;"
@click.stop="handleMerge(item.TableQuestions.Answers[i], item.Id, item.OrderMark)" />
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions" <QuestionForm
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType" :ref="`${item.Id}_${q.RowIndex}`"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)" :questions="item.TableQuestions.Questions"
:question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId" :answers="item.TableQuestions.Answers[i]"
:is-current-task="isCurrentTask" :reading-task-state="readingTaskState" :lesion-type="item.LesionType"
:is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer" :order-mark="item.OrderMark"
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions" :table-questions="tableQuestions"
@close="close" @handleReadingChart="handleReadingChart" /> :row-index="String(q.RowIndex)"
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -161,15 +149,35 @@
</template> </template>
<!-- <el-divider /> --> <!-- <el-divider /> -->
<!-- 肝脏评估 --> <!-- 肝脏评估 -->
<Questions ref="ecrf2" :question-form-change-state="true" :question-form-change-num="0" :group-classify="2" <Questions
:is-qulity-issues="false" style="margin-top:20px" :question-type="6" ref="ecrf2"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" /> :question-form-change-state="true"
:question-form-change-num="0"
:group-classify="2"
:is-qulity-issues="false"
style="margin-top:20px"
:question-type="6"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
<!-- 脾脏评估 --> <!-- 脾脏评估 -->
<Questions ref="ecrf3" :question-form-change-state="true" :question-form-change-num="0" :group-classify="3" <Questions
:is-qulity-issues="false" :question-type="7" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" /> ref="ecrf3"
:question-form-change-state="true"
:question-form-change-num="0"
:group-classify="3"
:is-qulity-issues="false"
:question-type="7"
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
</div> </div>
<el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible" <el-dialog
:close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px"> v-if="merge.visible"
v-loading="merge.loading"
:visible.sync="merge.visible"
:close-on-click-modal="false"
:title="$t('trials:reading:lugano:message:merge')"
width="500px"
>
<div class="merge-table"> <div class="merge-table">
<div class="merge-label"> <div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label> <label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
@ -177,19 +185,40 @@
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span> <span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div> </div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div> <div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table :data="lesionData" style="width: 450px" size="small" height="200" <el-table
@selection-change="handleSelectionChange"> :data="lesionData"
<el-table-column type="selection" width="45" /> style="width: 450px"
<el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" /> size="small"
<el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120" height="200"
show-overflow-tooltip /> @selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="45"
/>
<el-table-column
prop="OrderMarkName"
:label="$t('trials:reading:lugano:label:lesionNumber')"
width="100"
/>
<el-table-column
prop="Part"
:label="$t('trials:reading:lugano:label:lesionLocation')"
min-width="120"
show-overflow-tooltip
/>
</el-table> </el-table>
</div> </div>
<div slot="footer" style="text-align:right;"> <div slot="footer" style="text-align:right;">
<!-- 取消 --> <!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button> <el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 --> <!-- 确认 -->
<el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge"> <el-button
type="primary"
size="mini"
:disabled="mergeList.length === 0"
@click="confirmMerge"
>
{{ $t('common:button:confirm') }}</el-button> {{ $t('common:button:confirm') }}</el-button>
</div> </div>
</el-dialog> </el-dialog>
@ -304,7 +333,7 @@ export default {
DicomEvent.$on('split', measureData => { DicomEvent.$on('split', measureData => {
this.handleSplit(measureData.RowId, measureData.QuestionId) this.handleSplit(measureData.RowId, measureData.QuestionId)
}) })
DicomEvent.$on('refreshQuestions', async (obj) => { DicomEvent.$on('refreshQuestions', async(obj) => {
var triald = this.$router.currentRoute.query.trialId var triald = this.$router.currentRoute.query.trialId
await store.dispatch('reading/refreshDicomReadingQuestionAnswer', { trialId: triald, visitTaskId: this.visitTaskId }) await store.dispatch('reading/refreshDicomReadingQuestionAnswer', { trialId: triald, visitTaskId: this.visitTaskId })
this.$nextTick(() => { this.$nextTick(() => {
@ -313,7 +342,7 @@ export default {
this.$refs['ecrf3'].getQuestions(this.visitTaskId) this.$refs['ecrf3'].getQuestions(this.visitTaskId)
}) })
}) })
DicomEvent.$on('refreshSplitTargetLesionPDD', async (callback) => { DicomEvent.$on('refreshSplitTargetLesionPDD', async(callback) => {
const res = await getSplitPPdSum({ visitTaskId: this.visitTaskId }) const res = await getSplitPPdSum({ visitTaskId: this.visitTaskId })
this.splitTargetLesions = res.Result this.splitTargetLesions = res.Result
if (this.splitTargetLesions && this.splitTargetLesions.length > 0) { if (this.splitTargetLesions && this.splitTargetLesions.length > 0) {
@ -337,9 +366,6 @@ export default {
DicomEvent.$off('refreshQuestions') DicomEvent.$off('refreshQuestions')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -503,7 +529,7 @@ export default {
try { try {
const loading = this.$loading({ fullscreen: true }) const loading = this.$loading({ fullscreen: true })
await store.dispatch('reading/refreshReadingQuestionAndAnswer', { trialId: this.$router.currentRoute.query.trialId, visitTaskId: this.visitTaskId }).then(async () => { await store.dispatch('reading/refreshReadingQuestionAndAnswer', { trialId: this.$router.currentRoute.query.trialId, visitTaskId: this.visitTaskId }).then(async() => {
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId) var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
if (idx > -1) { if (idx > -1) {
if (this.visitTaskList[idx].ReadingQuestions.length > 0) { if (this.visitTaskList[idx].ReadingQuestions.length > 0) {
@ -535,7 +561,7 @@ export default {
}) })
}) })
}) })
}) })
await store.dispatch('reading/refreshMeasuredData', this.visitTaskId) await store.dispatch('reading/refreshMeasuredData', this.visitTaskId)
DicomEvent.$emit('getMeasureData') DicomEvent.$emit('getMeasureData')
await store.dispatch('reading/refreshDicomReadingQuestionAnswer', { trialId: this.$route.query.trialId, visitTaskId: this.visitTaskId }) await store.dispatch('reading/refreshDicomReadingQuestionAnswer', { trialId: this.$route.query.trialId, visitTaskId: this.visitTaskId })
@ -629,7 +655,7 @@ export default {
.then(() => { .then(() => {
this.split(rowId, questionId) this.split(rowId, questionId)
}) })
.catch(() => { }) .catch(() => {})
} else { } else {
// //
this.$confirm(this.$t('trials:reading:warnning:msg4'), { this.$confirm(this.$t('trials:reading:warnning:msg4'), {
@ -639,7 +665,7 @@ export default {
.then(() => { .then(() => {
this.split(rowId, questionId) this.split(rowId, questionId)
}) })
.catch(() => { }) .catch(() => {})
} }
} }
} }
@ -696,7 +722,7 @@ export default {
}) })
}, },
confirmMerge() { confirmMerge() {
// ', ?' // ', ?'
this.$confirm(this.$t('trials:reading:lugano:warnning:fuse'), { this.$confirm(this.$t('trials:reading:lugano:warnning:fuse'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
@ -849,7 +875,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
return return
} }
@ -860,7 +886,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
} else { } else {
// saveTypeEnum: 0 // saveTypeEnum: 0
@ -1000,7 +1026,7 @@ export default {
async changeLesionType(questionsObj) { async changeLesionType(questionsObj) {
await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId }) await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
// saveTypeEnum: 0 // saveTypeEnum: 0
var lesionObj = {} var lesionObj = { }
var questionObj = questionsObj.questionForm var questionObj = questionsObj.questionForm
// //
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType) var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
@ -1317,25 +1343,21 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-wrapper { .measurement-wrapper{
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
.container{
.container {
padding: 10px; padding: 10px;
.basic-info{
.basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3{
h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i{
i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
font-weight: bold; font-weight: bold;
@ -1343,16 +1365,14 @@ export default {
} }
} }
} }
.title{
.title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
font-size: 15px; font-size: 15px;
} }
.add-icon{
.add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
@ -1361,24 +1381,21 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
.flex-row { .flex-row{
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
background-color: #424242; background-color: #424242;
} }
.lesion_list{
.lesion_list {
position: relative; position: relative;
} }
.login-cycle{
.login-cycle {
width: 5px; width: 5px;
height: 5px; height: 5px;
display: inline-block; display: inline-block;
@ -1387,33 +1404,28 @@ export default {
margin-right: 2px; margin-right: 2px;
margin-bottom: 2px; margin-bottom: 2px;
} }
.el-collapse{
.el-collapse { border-bottom:none;
border-bottom: none; border-top:none;
border-top: none; ::v-deep .el-collapse-item{
background-color: #000!important;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header{
::v-deep .el-collapse-item__header { background-color: #000!important;
background-color: #000 !important;
color: #ddd; color: #ddd;
border-bottom-color: #5a5a5a; border-bottom-color:#5a5a5a;
padding-left: 5px; padding-left: 5px;
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap{
::v-deep .el-collapse-item__wrap { background-color: #000!important;
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content{
::v-deep .el-collapse-item__content { width:260px;
width: 260px;
position: absolute; position: absolute;
top: 0px; top: 0px;
right: 0px; right: 0px;
@ -1422,59 +1434,46 @@ export default {
z-index: 1; z-index: 1;
color: #ddd; color: #ddd;
padding: 5px; padding: 5px;
background-color: #1e1e1e; background-color:#1e1e1e;
} }
} }
.merge-table{
.merge-table { padding:0 10px;
padding: 0 10px; ::v-deep.el-table{
background-color: #1e1e1e !important;
::v-deep.el-table {
background-color: #1e1e1e !important;
color: #383838; color: #383838;
} }
::v-deep.el-table td.el-table__cell, .el-table th.el-table__cell.is-leaf{
::v-deep.el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838; border-bottom: 1px solid #383838;
} }
.el-table--border::after, .el-table--group::after, .el-table::before{
.el-table--border::after,
.el-table--group::after,
.el-table::before {
background-color: #1e1e1e; background-color: #1e1e1e;
} }
::v-deep.el-table__header-wrapper{
::v-deep.el-table__header-wrapper { th{
th { background-color: #1e1e1e !important;
background-color: #1e1e1e !important; color: #dfdfdf;
color: #dfdfdf; border-bottom: 1px solid #383838;
border-bottom: 1px solid #383838; }
} }
} ::v-deep.el-table__body-wrapper{
tr{
::v-deep.el-table__body-wrapper { background-color: #1e1e1e !important;
tr {
background-color: #1e1e1e !important;
color: #dfdfdf; color: #dfdfdf;
} }
tr:hover > td{
tr:hover>td { background-color: #1e1e1e !important;
background-color: #1e1e1e !important;
} }
} }
::v-deep.el-table__empty-block{
::v-deep.el-table__empty-block { background-color: #1e1e1e !important;
background-color: #1e1e1e !important;
} }
.merge-label{
.merge-label { color:#ddd;
color: #ddd;
font-size: 13px; font-size: 13px;
margin-bottom: 10px; margin-bottom: 10px;
span{
span {
font-size: 15px; font-size: 15px;
color: red; color: red;
} }

View File

@ -1,6 +1,12 @@
<template> <template>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini" <el-form
class="measurement-form"> v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -12,134 +18,183 @@
</div> </div>
</div> </div>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`" <el-form-item
:prop="qs.Id" :rules="[ v-for="qs in questions"
{ v-show="qs.ShowQuestion!==2"
required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (String(questionForm[qs.RelevanceId]) === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type !== 'group' && qs.Type !== 'summary', :key="qs.Id"
message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change'] :label="`${qs.QuestionName}`"
}, :prop="qs.Id"
]" style="flex-wrap: wrap"> :rules="[
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (String(questionForm[qs.RelevanceId]) === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary',
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
style="flex-wrap: wrap"
>
<!-- 输入框 --> <!-- 输入框 -->
<template <template v-if="(qs.Type==='input' || qs.Type==='number') && (qs.QuestionMark === 1101 || qs.QuestionMark === 1102 || qs.QuestionMark === 1103)">
v-if="(qs.Type === 'input' || qs.Type === 'number') && (qs.QuestionMark === 1101 || qs.QuestionMark === 1102 || qs.QuestionMark === 1103)">
<div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;">
<el-input v-model="questionForm[qs.Id]" disabled style="width: 100px;"> <el-input
v-model="questionForm[qs.Id]"
disabled
style="width: 100px;"
>
<template v-if="qs.Unit" slot="append"> <template v-if="qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </el-input>
<!-- 测量 --> <!-- 测量 -->
<el-button <el-button
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && !questionForm[qs.Id] && readingTaskState !== 2" v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && !questionForm[qs.Id] && readingTaskState!== 2"
size="mini" type="text" @click="addAnnotation(qs)"> size="mini"
type="text"
@click="addAnnotation(qs)"
>
{{ $t('trials:MRIPDFF:button:measure') }} {{ $t('trials:MRIPDFF:button:measure') }}
</el-button> </el-button>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button v-if="getAnnotationStatus(qs) && readingTaskState !== 2" size="mini" type="text" <el-button
style="margin-left: 0px" @click="removeAnnotation(qs)"> v-if="getAnnotationStatus(qs) && readingTaskState!== 2"
size="mini"
type="text"
style="margin-left: 0px"
@click="removeAnnotation(qs)"
>
{{ $t('trials:MRIPDFF:button:clear') }} {{ $t('trials:MRIPDFF:button:clear') }}
</el-button> </el-button>
<!-- 返回 --> <!-- 返回 -->
<el-button v-if="questionForm[qs.Id]" size="mini" type="text" style="margin-left: 0px" <el-button
@click="locateAnnotation(qs)"> v-if="questionForm[qs.Id]"
size="mini"
type="text"
style="margin-left: 0px"
@click="locateAnnotation(qs)"
>
{{ $t('trials:MRIPDFF:button:return') }} {{ $t('trials:MRIPDFF:button:return') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && questionForm[qs.Id] && readingTaskState !== 2" v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && questionForm[qs.Id] && readingTaskState!== 2"
size="mini" type="text" style="margin-left: 0px" @click="saveAnnotation(qs)"> size="mini"
type="text"
style="margin-left: 0px"
@click="saveAnnotation(qs)"
>
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip v-if="getAnnotationSaveEnum(qs) === 0" class="item" effect="dark" <el-tooltip v-if="getAnnotationSaveEnum(qs) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
:content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
</template> </template>
<template v-else-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-else-if="qs.Type==='input' || qs.Type==='number'">
<div style="display: flex;justify-content: space-between;"> <el-input
<el-input v-model="questionForm[qs.Id]" :disabled="!isCurrentTask || readingTaskState >= 2" v-model="questionForm[qs.Id]"
@change="((val) => { formItemChange(val, qs) })"> :disabled="!isCurrentTask || readingTaskState>=2"
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append"> @change="((val)=>{formItemChange(val, qs)})"
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} >
</template> <template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
</el-input> {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" </template>
@click.stop="(e) => handleReadingChart({ </el-input>
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</div>
</template> </template>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input v-else-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea" <el-input
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2" v-else-if="qs.Type==='textarea'"
@change="((val) => { formItemChange(val, qs) })" /> v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select v-else-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable <el-select
v-else-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:placeholder="$t('common:placeholder:select')" :placeholder="$t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 1106" :disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 1106"
@change="((val) => { formItemChange(val, qs) })"> @change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]" <el-option
:value="item[qs.DataTableColumn]" /> v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode"> <template v-else-if="qs.DictionaryCode">
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" /> <el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group v-else-if="qs.Type === 'radio'" v-model="questionForm[qs.Id]" <el-radio-group
:disabled="!isCurrentTask || readingTaskState >= 2 || (qs.QuestionMark === 1105 && isDisabledMeasurableRadio)" v-else-if="qs.Type==='radio'"
@change="((val) => { formItemChange(val, qs) })"> v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState>=2 || (qs.QuestionMark === 1105 && isDisabledMeasurableRadio)"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.DictionaryCode.length > 0"> <template v-if="qs.DictionaryCode.length > 0">
<el-radio v-for="item in $d[qs.DictionaryCode]" :key="item.id" :label="item.value"> <el-radio
v-for="item in $d[qs.DictionaryCode]"
:key="item.id"
:label="item.value"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</template> </template>
<template v-else-if="qs.options.length > 0"> <template v-else-if="qs.options.length > 0">
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val"> <el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</template> </template>
</el-radio-group> </el-radio-group>
<div style="display: flex;justify-content: space-between;" v-else-if="qs.Type === 'calculation'"> <!-- 自动计算 -->
<!-- 自动计算 --> <el-input
<el-input v-model="questionForm[qs.Id]" disabled @change="((val) => { formItemChange(val, qs) })"> v-else-if="qs.Type==='calculation'"
<template v-if="qs.Unit" slot="append"> v-model="questionForm[qs.Id]"
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} disabled
</template> @change="((val)=>{formItemChange(val, qs)})"
</el-input> >
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" <template v-if="qs.Unit" slot="append">
@click.stop="(e) => handleReadingChart({ {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
e, </template>
data: { </el-input>
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</div>
</el-form-item> </el-form-item>
</div> </div>
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer" <div
style="text-align:right;margin-top:10px;"> v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 保存 --> <!-- 保存 -->
<el-button size="mini" @click="handleSave"> <el-button
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -235,9 +290,6 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal') DicomEvent.$off('handleImageQualityAbnormal')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initForm() { async initForm() {
this.isRender = false this.isRender = false
this.isMeasurableId = this.getQuestionId(1105) this.isMeasurableId = this.getQuestionId(1105)
@ -451,7 +503,7 @@ export default {
const orderMarkName = this.getLesionName(this.orderMark, qs.QuestionMark) const orderMarkName = this.getLesionName(this.orderMark, qs.QuestionMark)
this.activeQuestionId = qs.Id this.activeQuestionId = qs.Id
this.activeQuestionMark = qs.QuestionMark this.activeQuestionMark = qs.QuestionMark
DicomEvent.$emit('addAnnotation', { question: qs, locateInfo: { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: orderMarkName, lesionType: null, markTool: 'Probe', readingTaskState: this.readingTaskState, isMarked: true } }) DicomEvent.$emit('addAnnotation', { question: qs, locateInfo: { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: orderMarkName, lesionType: null, markTool: 'Probe', readingTaskState: this.readingTaskState, isMarked: true }})
}, },
getAnnotationSaveEnum(qs) { getAnnotationSaveEnum(qs) {
const i = this.markList.findIndex(i => i.tableQuestionId === qs.Id) const i = this.markList.findIndex(i => i.tableQuestionId === qs.Id)
@ -540,14 +592,14 @@ export default {
if (confirm !== 'confirm') return if (confirm !== 'confirm') return
} }
// //
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: measureData.OrderMarkName, lesionType: null, isMarked: !!measureData }, async val => { DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: measureData.OrderMarkName, lesionType: null, isMarked: !!measureData }, async val => {
params = Object.assign({}, this.markList[i].measureData) params = Object.assign({}, this.markList[i].measureData)
if (val) { if (val) {
const pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val) const pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
params.PicturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : '' params.PicturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
} }
params.Answer = this.questionForm[tableQuestionId] params.Answer = this.questionForm[tableQuestionId]
params.MeasureData = JSON.stringify(this.markList[i].measureData.MeasureData) params.MeasureData = JSON.stringify(this.markList[i].measureData.MeasureData)
loading.close() loading.close()
@ -702,17 +754,17 @@ export default {
const valid = await this.$refs.measurementForm.validate() const valid = await this.$refs.measurementForm.validate()
if (!valid) return if (!valid) return
if (parseInt(this.questionForm[this.isMeasurableId]) === 1) { if (parseInt(this.questionForm[this.isMeasurableId]) === 1) {
// //
const i = this.markList.findIndex(i => i.saveEnum === 0) const i = this.markList.findIndex(i => i.saveEnum === 0)
if (i > -1) { if (i > -1) {
// //
this.$alert(this.$t('trials:MRIPDFF:message:message1')) this.$alert(this.$t('trials:MRIPDFF:message:message1'))
// this.$message.warning(this.$t('trials:MRIPDFF:message:message1')) // this.$message.warning(this.$t('trials:MRIPDFF:message:message1'))
return return
} }
} else { } else {
// //
// '' // ''
const confirm = await this.$confirm( const confirm = await this.$confirm(
this.$t('trials:MRIPDFF:message:message2'), this.$t('trials:MRIPDFF:message:message2'),
{ {
@ -765,7 +817,7 @@ export default {
} }
const res = await submitTaskRowInfo(params, 11) const res = await submitTaskRowInfo(params, 11)
if (res.IsSuccess) { if (res.IsSuccess) {
// //
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$message.success(this.$t('common:message:savedSuccessfully'))
this.$set(this.questionForm, 'saveTypeEnum', 2) this.$set(this.questionForm, 'saveTypeEnum', 2)
this.originalQuestionForm = { ...this.questionForm } this.originalQuestionForm = { ...this.questionForm }
@ -801,55 +853,45 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-form { .measurement-form{
::v-deep .el-form-item__label { ::v-deep .el-form-item__label{
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
} }
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-button--mini, .el-button--mini.is-round {
::v-deep .el-button--mini,
.el-button--mini.is-round {
padding: 7px 10px; padding: 7px 10px;
} }
::v-deep .el-input-group__append, .el-input-group__prepend {
::v-deep .el-input-group__append,
.el-input-group__prepend {
padding: 0 10px; padding: 0 10px;
} }
.el-form-item__content
.el-form-item__content .el-select { .el-select{
width: 100%; width: 100%;
} }
.input-width1{
.input-width1 { width: calc(100% - 60px)!important;
width: calc(100% - 60px) !important;
} }
.input-width2{
.input-width2 {
width: 100% !important; width: 100% !important;
} }
} }
</style> </style>

View File

@ -8,62 +8,63 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
placement="bottom"> <i
<i class="el-icon-refresh-left" @click="resetMeasuredData" /> class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<!-- 非测量问题 --> <!-- 非测量问题 -->
<div class="lesions"> <div class="lesions">
<Questions ref="ecrf" :groupClassify="1" :question-form-change-state="questionFormChangeState" <Questions ref="ecrf" :groupClassify="1" :question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum" />
:question-form-change-num="questionFormChangeNum" @handleReadingChart="handleReadingChart" />
</div> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template> <template >
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper"> <div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }} {{ language==='en'?qs.GroupEnName:qs.GroupName }}
</h4> </h4>
<div class="lesion_list"> <div class="lesion_list">
<div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id"> <div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2)" :key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;"> <div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }}</div> <div class="title">{{ item.QuestionName }}</div>
</div> </div>
<div <div style="color: #ddd;text-align: left;padding: 5px 10px;border-bottom: 1px solid #5a5a5a; font-size: 15px;">
style="color: #ddd;text-align: left;padding: 5px 10px;border-bottom: 1px solid #5a5a5a; font-size: 15px;"> <el-row >
<el-row>
<!-- 分段 --> <!-- 分段 -->
<el-col :span="14">{{ $t('trials:MRIPDFF:label:col1') }}</el-col> <el-col :span="14">{{$t('trials:MRIPDFF:label:col1')}}</el-col>
<!-- 是否可测量 --> <!-- 是否可测量 -->
<!-- <el-col :span="7">{{$t('trials:MRIPDFF:label:col2')}}</el-col> --> <!-- <el-col :span="7">{{$t('trials:MRIPDFF:label:col2')}}</el-col> -->
<!-- 平均值 --> <!-- 平均值 -->
<el-col :span="7">{{ $t('trials:MRIPDFF:label:col3') }}</el-col> <el-col :span="7">{{$t('trials:MRIPDFF:label:col3')}}</el-col>
</el-row> </el-row>
</div> </div>
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion <el-collapse
@change="handleCollapseChange"> v-if="item.Type === 'table' && item.TableQuestions"
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`" v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)"> @contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)"
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" <div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}">
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
{{ getLesionName(item.TableQuestions.Questions, q) }} {{ getLesionName(item.TableQuestions.Questions, q) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip <el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 信息不完整 --> <!-- 信息不完整 -->
<el-tooltip <el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom">
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;right: 0px;top: 2px;"> <div style="position: absolute;right: 0px;top: 2px;">
@ -72,23 +73,32 @@
<!-- <div style="display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width:95px"> <!-- <div style="display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width:95px">
{{ $fd('ReadingYesOrNo', parseInt(item.TableQuestions.Answers[i].isMeasurable)) }} {{ $fd('ReadingYesOrNo', parseInt(item.TableQuestions.Answers[i].isMeasurable)) }}
</div> --> </div> -->
<div <div style="display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width:50px">
style="display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;width:50px"> {{ isNaN(parseFloat(item.TableQuestions.Answers[i].mean)) ? item.TableQuestions.Answers[i].mean : `${item.TableQuestions.Answers[i].mean}%` }}
{{ isNaN(parseFloat(item.TableQuestions.Answers[i].mean)) ?
item.TableQuestions.Answers[i].mean : `${item.TableQuestions.Answers[i].mean}%` }}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions" <QuestionForm
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType" :ref="`${item.Id}_${q.RowIndex}`"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)" :questions="item.TableQuestions.Questions"
:question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId" :answers="item.TableQuestions.Answers[i]"
:is-current-task="isCurrentTask" :reading-task-state="readingTaskState" :lesion-type="item.LesionType"
:is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer" :order-mark="item.OrderMark"
@resetQuestions="resetQuestions" @close="close" @handleReadingChart="handleReadingChart" /> :table-questions="tableQuestions"
:row-index="String(q.RowIndex)"
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@resetQuestions="resetQuestions"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -200,9 +210,6 @@ export default {
DicomEvent.$off('getAllUnSaveLesions') DicomEvent.$off('getAllUnSaveLesions')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -262,7 +269,7 @@ export default {
for (const i in obj.anwsers) { for (const i in obj.anwsers) {
if (i === 'MeasureData' && obj.anwsers[i]) { if (i === 'MeasureData' && obj.anwsers[i]) {
} else { } else {
item.TableQuestions.Answers[idx][i] = String(obj.anwsers[i]) item.TableQuestions.Answers[idx][i] = String(obj.anwsers[i])
} }
@ -353,11 +360,11 @@ export default {
}) })
await store.dispatch('reading/refreshMeasuredData', this.visitTaskId) await store.dispatch('reading/refreshMeasuredData', this.visitTaskId)
DicomEvent.$emit('getMeasureData') DicomEvent.$emit('getMeasureData')
loading ? loading.close() : '' loading ? loading.close() : ''
resolve() resolve()
} catch (e) { } catch (e) {
console.log(e) console.log(e)
loading ? loading.close() : '' loading ? loading.close() : ''
} }
}) })
@ -376,13 +383,13 @@ export default {
}, },
checkToolCanActive(toolName) { checkToolCanActive(toolName) {
return { isCanActiveTool: true, reason: '' } return { isCanActiveTool: true, reason: '' }
}, },
getLesionName(questions, q) { getLesionName(questions, q) {
let liverSegmentStr = '' let liverSegmentStr = ''
if (!this.liverSegmentId) { if (!this.liverSegmentId) {
let i = questions.findIndex(i => i.QuestionMark === 1106) let i = questions.findIndex(i=>i.QuestionMark === 1106)
if (i === -1) return if (i === -1) return
this.liverSegmentId = questions[i].Id this.liverSegmentId = questions[i].Id
this.liverSegmentDicCode = questions[i].DictionaryCode this.liverSegmentDicCode = questions[i].DictionaryCode
@ -451,7 +458,7 @@ export default {
} }
}) })
} else { } else {
} }
}, },
async close(questionsObj) { async close(questionsObj) {
@ -518,26 +525,23 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-wrapper { .measurement-wrapper{
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
// overflow: hidden; // overflow: hidden;
.container { .container{
padding: 10px; padding: 10px;
.basic-info{
.basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3{
h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i{
i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
font-weight: bold; font-weight: bold;
@ -545,16 +549,14 @@ export default {
} }
} }
} }
.title{
.title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
font-size: 15px; font-size: 15px;
} }
.add-icon{
.add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
@ -563,49 +565,42 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
.flex-row { .flex-row{
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
background-color: #424242; background-color: #424242;
} }
.lesion_list{
.lesion_list {
position: relative; position: relative;
} }
.el-collapse{
.el-collapse { border-bottom:none;
border-bottom: none; border-top:none;
border-top: none; ::v-deep .el-collapse-item{
background-color: #000!important;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header{
::v-deep .el-collapse-item__header { background-color: #000!important;
background-color: #000 !important;
color: #ddd; color: #ddd;
border-bottom-color: #5a5a5a; border-bottom-color:#5a5a5a;
padding-left: 5px; padding-left: 5px;
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap{
::v-deep .el-collapse-item__wrap { background-color: #000!important;
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content{
::v-deep .el-collapse-item__content { width:260px;
width: 260px;
position: absolute; position: absolute;
top: 0px; top: 0px;
right: 0px; right: 0px;
@ -614,7 +609,7 @@ export default {
z-index: 1; z-index: 1;
color: #ddd; color: #ddd;
padding: 5px; padding: 5px;
background-color: #1e1e1e; background-color:#1e1e1e;
} }
} }

View File

@ -1,9 +1,14 @@
<template> <template>
<div v-loading="loading" class="manuals-wrapper"> <div v-loading="loading" class="manuals-wrapper">
<div class="left-wrapper"> <div class="left-wrapper">
<div v-if="fileList.length > 0" class="basic-content"> <div v-if="fileList.length>0" class="basic-content">
<div v-for="file in fileList" :key="file.Id" class="file-item" :class="{ activeItem: file.Id === selected.id }" <div
@click.prevent="preview(file)"> v-for="file in fileList"
:key="file.Id"
class="file-item"
:class="{activeItem:file.Id === selected.id}"
@click.prevent="preview(file)"
>
<!-- {{ file.Name }} --> <!-- {{ file.Name }} -->
<el-tooltip class="item" :content="file.Name" placement="bottom"> <el-tooltip class="item" :content="file.Name" placement="bottom">
<span>{{ file.Name }} </span> <span>{{ file.Name }} </span>
@ -16,25 +21,19 @@
</div> </div>
<div class="right-wrapper"> <div class="right-wrapper">
<div class="right-content"> <div class="right-content">
<iframe v-if="selected.filePath" <iframe v-if="selected.filePath" :src="`/static/pdfjs/web/viewer.html?file=${OSSclientConfig.basePath}${selected.filePath}?userName=${currentUser}&COMPANY=${COMPANY}`" width="100%" height="100%" frameborder="0" />
:src="`/static/pdfjs/web/viewer.html?file=${OSSclientConfig.basePath}${selected.filePath}?userName=${currentUser}&COMPANY=${COMPANY}`"
width="100%" height="100%" frameborder="0" />
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { getManualList, getTrialCriterionKeyFileList } from '@/api/trials' import { getManualList } from '@/api/trials'
export default { export default {
name: 'Manuals', name: 'Manuals',
props: { props: {
trialId: { trialId: {
type: String, type: String,
required: true required: true
},
justKeyDoc: {
type: Boolean,
default: false
} }
}, },
data() { data() {
@ -46,7 +45,7 @@ export default {
fileList: [], fileList: [],
loading: false, loading: false,
currentUser: zzSessionStorage.getItem('userName'), currentUser: zzSessionStorage.getItem('userName'),
COMPANY: process.env.VUE_APP_COMPANY_NAME COMPANY:process.env.VUE_APP_COMPANY_NAME
} }
}, },
mounted() { mounted() {
@ -55,35 +54,16 @@ export default {
methods: { methods: {
async getList() { async getList() {
this.loading = true this.loading = true
this.fileList = []
try { try {
var param = { var param = {
TrialCriterionId: this.$router.currentRoute.query.TrialReadingCriterionId, trialId: this.trialId
PageIndex: 1,
PageSize: 1000
} }
const res = await getTrialCriterionKeyFileList(param) const res = await getManualList(param)
if (res.IsSuccess) { if (res.IsSuccess) {
let list = res.Result.CurrentPageData.map(item => { this.fileList = res.Result
return { if (this.fileList.length > 0) {
Id: item.Id, this.preview(this.fileList[0])
Name: item.FileName,
Path: item.FilePath
}
})
this.fileList = [...this.fileList, ...list]
}
if (!this.justKeyDoc) {
var param = {
trialId: this.trialId
} }
const res = await getManualList(param)
if (res.IsSuccess) {
this.fileList = [...this.fileList, ...res.Result]
}
}
if (this.fileList.length > 0) {
this.preview(this.fileList[0])
} }
this.loading = false this.loading = false
} catch (e) { } catch (e) {
@ -97,43 +77,38 @@ export default {
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss">
.manuals-wrapper { .manuals-wrapper{
display: flex; display: flex;
flex-direction: row !important; flex-direction: row !important;
width: 100%; width: 100%;
height: 95%; height: 100%;
padding: 5px; padding: 5px;
overflow: hidden; overflow: hidden;
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 7px; width: 7px;
height: 7px; height: 7px;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
border-radius: 10px; border-radius: 10px;
background: #d0d0d0; background: #d0d0d0;
} }
.left-wrapper{
.left-wrapper {
box-sizing: border-box; box-sizing: border-box;
margin-right: 10px; margin-right: 10px;
height: 100%; height: 100%;
width: 300px; width: 300px;
border: 1px solid #ddd; border: 1px solid #ddd;
.basic-content { .basic-content{
height: 100%; height: 100%;
overflow: auto; overflow: auto;
} }
.basic-content-empty{
.basic-content-empty {
padding: 5px; padding: 5px;
font-size: 16px; font-size: 16px;
} }
.file-item{
.file-item {
box-sizing: border-box; box-sizing: border-box;
border-bottom: 1px solid #f3f3f3; border-bottom: 1px solid #f3f3f3;
height: 50px; height: 50px;
@ -146,21 +121,18 @@ export default {
text-overflow: ellipsis; text-overflow: ellipsis;
width: 100%; width: 100%;
} }
.activeItem{
.activeItem {
color: #428bca !important; color: #428bca !important;
border-bottom: 1px solid #f3f3f3 !important; border-bottom: 1px solid #f3f3f3 !important;
} }
} }
.right-wrapper{
.right-wrapper {
flex: 1; flex: 1;
height: 100%; height: 100%;
border: 1px solid #ddd; border: 1px solid #ddd;
} }
.right-content{
.right-content { height:100%;
height: 100%;
} }
} }

View File

@ -17,7 +17,7 @@
<!-- 影像质量问题 --> <!-- 影像质量问题 -->
<div class="lesions"> <div class="lesions">
<Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false" <Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false"
:group-classify="1" @handleReadingChart="handleReadingChart" /> :group-classify="1" />
</div> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
@ -37,8 +37,7 @@
<div class="add-icon" @click.prevent="downloadTpl(item.LesionType)"> <div class="add-icon" @click.prevent="downloadTpl(item.LesionType)">
<i class="el-icon-download" /> <i class="el-icon-download" />
</div> </div>
<div class="add-icon" style="margin: 0 5px;" <div class="add-icon" style="margin: 0 5px;" @click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
@click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
<i class="el-icon-upload2" /> <i class="el-icon-upload2" />
</div> </div>
<div class="add-icon" @click.prevent="handleAddOrEdit('add', item)"> <div class="add-icon" @click.prevent="handleAddOrEdit('add', item)">
@ -155,7 +154,7 @@
<el-form ref="tableQsForm" v-loading="loading" :model="qsForm" size="small"> <el-form ref="tableQsForm" v-loading="loading" :model="qsForm" size="small">
<QuestionTableFormItem v-for="item in qsList" :key="item.Id" :question="item" :question-form="qsForm" <QuestionTableFormItem v-for="item in qsList" :key="item.Id" :question="item" :question-form="qsForm"
:reading-task-state="readingTaskState" @setFormItemData="setFormItemData" :reading-task-state="readingTaskState" @setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" /> @resetFormItemData="resetFormItemData" />
<el-form-item style="text-align: right"> <el-form-item style="text-align: right">
<el-button size="small" @click="addOrEdit.visible = false"> <el-button size="small" @click="addOrEdit.visible = false">
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
@ -170,8 +169,7 @@
<!-- 导入 --> <!-- 导入 -->
<el-dialog v-if="upload.visible" :visible.sync="upload.visible" :close-on-click-modal="false" <el-dialog v-if="upload.visible" :visible.sync="upload.visible" :close-on-click-modal="false"
:title="upload.title" width="500px"> :title="upload.title" width="500px">
<UploadExcel :visit-task-id="visitTaskId" :lesion-type="upload.lesionType" :TableName="upload.TableName" <UploadExcel :visit-task-id="visitTaskId" :lesion-type="upload.lesionType" :TableName="upload.TableName" @close="uploadDlgClose" />
@close="uploadDlgClose" />
</el-dialog> </el-dialog>
</div> </div>
</div> </div>
@ -284,9 +282,6 @@ export default {
DicomEvent.$off('refreshQuestions') DicomEvent.$off('refreshQuestions')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {

View File

@ -1,66 +1,119 @@
<template> <template>
<div> <div>
<div v-if="!!question.GroupName && question.Type === 'group'"> <div
v-if="!!question.GroupName && question.Type==='group'"
>
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? question.GroupEnName : question.GroupName }} {{ language==='en'?question.GroupEnName:question.GroupName }}
</h4> </h4>
</div> </div>
<template v-else> <template v-else>
<el-form-item <el-form-item
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0" v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[ :label="`${question.QuestionName}`"
{ :prop="question.Id"
required: (question.IsRequired === 0 || (question.IsRequired === 1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type !== 'group' && question.Type !== 'summary', :rules="[
message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change'] { required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type!=='group' && question.Type!=='summary',
}, message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']},
]" ]"
:class="[question.Type === 'group' ? 'mb' : (question.Type === 'upload' || question.QuestionName.length > 15) ? 'uploadWrapper' : '']"> :class="[question.Type==='group' ? 'mb' : (question.Type==='upload' || question.QuestionName.length > 15) ?'uploadWrapper' : '']"
>
<!-- 输入框 --> <!-- 输入框 -->
<el-input v-if="question.Type === 'input'" v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" <el-input
@change="((val) => { formItemChange(val, question) })" /> v-if="question.Type==='input'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea" <el-input
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2" v-else-if="question.Type==='textarea'"
@change="((val) => { formItemChange(val, question) })" /> v-model="questionForm[question.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]" <el-select
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode)" :disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode)"
clearable @change="((val) => { formItemChange(val, question) })"> clearable
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.TableQuestionType === 1"> <template v-if="question.TableQuestionType === 1">
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]" <el-option
:value="item[question.DataTableColumn]" /> v-for="item in organList"
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
</template> </template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3"> <template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" <el-option
:label="item.label" /> v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template <template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode"> <el-option
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" v-for="item of $d[question.DictionaryCode]"
:label="item.label" /> :key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]" <el-radio-group
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })"> v-else-if="question.Type==='radio'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.DictionaryCode"> <template v-if="question.DictionaryCode">
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)"> <el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</template> </template>
<template v-else-if="question.TypeValue"> <template v-else-if="question.TypeValue">
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val"> <el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</template> </template>
</el-radio-group> </el-radio-group>
<!-- 复选框 --> <!-- 复选框 -->
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]" <el-checkbox-group
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })"> v-else-if="question.Type==='checkbox'"
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val"> v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2"
@change="((val)=>{formItemChange(val, question)})"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
@ -90,39 +143,41 @@
@change="((val)=>{formItemChange(val, question)})" @change="((val)=>{formItemChange(val, question)})"
/> />
</template> --> </template> -->
<div style="display: flex;justify-content: space-between;" <!-- 数值类型 -->
v-else-if="question.Type === 'calculation' || question.Type === 'number'"> <el-input
<!-- 数值类型 --> v-else-if="question.Type==='number'"
<el-input v-if="question.Type === 'number'" v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2" type="number" @change="((val) => { formItemChange(val, question) })"> :disabled="readingTaskState>=2 "
<template v-if="question.Unit" slot="append"> type="number"
{{ $fd('ValueUnit', parseInt(question.Unit)) }} @change="((val)=>{formItemChange(val, question)})"
</template> >
</el-input> <template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
<el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled </template>
@change="((val) => { formItemChange(val, question) })"> </el-input>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: question.Id,
RowIndex: questionForm.RowIndex,
QuestionName: question.QuestionName
}
})" />
</div>
<el-input
v-else-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
</el-form-item> </el-form-item>
</template> </template>
<QuestionTableFormItem v-for="item in question.Childrens" :key="item.Id" :question="item" <QuestionTableFormItem
:question-form="questionForm" :reading-task-state="readingTaskState" @setFormItemData="setFormItemData" v-for="item in question.Childrens"
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" /> :key="item.Id"
:question="item"
:question-form="questionForm"
:reading-task-state="readingTaskState"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</div> </div>
</template> </template>
<script> <script>
@ -159,9 +214,6 @@ export default {
this.digitPlaces = Number(localStorage.getItem('digitPlaces')) this.digitPlaces = Number(localStorage.getItem('digitPlaces'))
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
formItemChange(v, question) { formItemChange(v, question) {
if (question.Childrens && question.Childrens.length > 0) { if (question.Childrens && question.Childrens.length > 0) {
this.resetChild(question.Childrens) this.resetChild(question.Childrens)
@ -217,36 +269,29 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.mb { .mb{
margin-bottom: 0px; margin-bottom: 0px;
} }
.disabled{
.disabled {
::v-deep .el-upload--picture-card { ::v-deep .el-upload--picture-card {
display: none; display: none;
} }
} }
.uploadWrapper{
.uploadWrapper {
display: flex; display: flex;
flex-direction: column !important; flex-direction: column !important;
align-items: flex-start; align-items: flex-start;
} }
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner { background-color: #646464a1;
background-color: #646464a1; }
} ::v-deep .el-input-group__append, .el-input-group__prepend{
padding: 0 10px;
::v-deep .el-input-group__append, }
.el-input-group__prepend { ::v-deep .el-form-item__content {
padding: 0 10px; width: 100%;
} }
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-form-item__content { background-color: #646464a1;
width: 100%; }
}
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
</style> </style>

View File

@ -4,7 +4,7 @@
class="upload-excel-file" class="upload-excel-file"
> >
<!-- 文件 --> <!-- 文件 -->
<el-form-item :label="$t('trials:consistencyCheck:label:file3')"> <el-form-item :label="$t('trials:consistencyCheck:label:file')">
<div class="upload-container"> <div class="upload-container">
<el-upload <el-upload
class="upload-demo" class="upload-demo"

View File

@ -3,22 +3,15 @@
<div class="base-dialog-body" style="height:380px;overflow-y: auto;"> <div class="base-dialog-body" style="height:380px;overflow-y: auto;">
<el-form ref="otherForm" :model="form"> <el-form ref="otherForm" :model="form">
<!-- 自动切换下一个任务不必提示 --> <!-- 自动切换下一个任务不必提示 -->
<el-form-item :label="$t('trials:reading:label:autoSwitch')" prop="AutoCutNextTask" :rules="[ <el-form-item
{ required: true, message: $t('common:ruleMessage:select') } :label="$t('trials:reading:label:autoSwitch')"
]"> prop="AutoCutNextTask"
:rules="[
{ required: true, message: $t('common:ruleMessage:select')}
]"
>
<el-switch v-model="form.AutoCutNextTask" /> <el-switch v-model="form.AutoCutNextTask" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('trials:reading:label:MultiScreen')" prop="IsDoubleScreen" :rules="[
{ required: true, message: $t('common:ruleMessage:select') }
]">
<el-switch v-model="form.IsDoubleScreen" />
</el-form-item>
<el-form-item>
<div><span>{{ $t("trials:reading:tip:MultiScreen") }}</span><a style="color:#409EFF" href="/screen.pdf"
target="blank">{{
$t("trials:reading:tip:openFile")
}}</a></div>
</el-form-item>
</el-form> </el-form>
</div> </div>
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;"> <div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
@ -34,8 +27,7 @@ export default {
data() { data() {
return { return {
form: { form: {
AutoCutNextTask: false, AutoCutNextTask: false
IsDoubleScreen: false
}, },
loading: false loading: false
} }
@ -50,7 +42,6 @@ export default {
const res = await getAutoCutNextTask() const res = await getAutoCutNextTask()
if (res.IsSuccess) { if (res.IsSuccess) {
this.form.AutoCutNextTask = res.Result.AutoCutNextTask this.form.AutoCutNextTask = res.Result.AutoCutNextTask
this.form.IsDoubleScreen = res.Result.IsDoubleScreen
} }
this.loading = false this.loading = false
} catch (e) { } catch (e) {
@ -75,4 +66,6 @@ export default {
} }
</script> </script>
<style lang="scss"></style> <style lang="scss">
</style>

View File

@ -1,6 +1,12 @@
<template> <template>
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini" <el-form
class="measurement-form"> v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
@ -14,109 +20,177 @@
</div> </div>
</div> </div>
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[ <el-form-item
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] }, :label="$t('trials:reading:title:lesionType')"
]"> prop="LesionType"
<el-select v-model="questionForm.LesionType" filterable :disabled="true"> :rules="[
<el-option v-for="item of $d.LesionType" v-show="!(isBaseLineTask && item.value === 2)" :key="item.id" { required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
:value="item.value" :label="item.label" /> ]"
>
<el-select
v-model="questionForm.LesionType"
filterable
:disabled="true"
>
<el-option
v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`" <el-form-item
:prop="qs.Id" :rules="qs.QuestionMark === 11 ? [ v-for="qs in questions"
{ v-show="qs.ShowQuestion!==2"
required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue))) && qs.Type !== 'group' && qs.Type !== 'summary', :key="qs.Id"
message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change'] :label="`${qs.QuestionName}`"
}, { validator: validateLesionCount, trigger: ['blur', 'change'] }] : [ :prop="qs.Id"
{ :rules="qs.QuestionMark===11?[
required: (qs.IsRequired === 0 || (qs.IsRequired === 1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type !== 'group' && qs.Type !== 'summary', { required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue))) && qs.Type!=='group' && qs.Type!=='summary',
message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change'] message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']},{validator:validateLesionCount, trigger: ['blur', 'change']}]:[
}]"> { required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary',
message: ['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']}]"
>
<!-- {{ isCurrentTaskAdd }} <!-- {{ isCurrentTaskAdd }}
{{ questionForm.IsCanEditPosition }} --> {{ questionForm.IsCanEditPosition }} -->
<!-- 输入框 min="1" <!-- 输入框 min="1"
@input="questionForm[qs.Id]=questionForm[qs.Id].replace(/^(0+)|[^\d]+/g,'')"--> @input="questionForm[qs.Id]=questionForm[qs.Id].replace(/^(0+)|[^\d]+/g,'')"-->
<template v-if="qs.Type === 'input' || qs.Type === 'number'"> <template v-if="qs.Type==='input' || qs.Type==='number'">
<template v-if="qs.QuestionMark === 11"> <template v-if="qs.QuestionMark===11">
<div style="display: flex;justify-content: space-between;"> <el-input
<el-input v-model="questionForm[qs.Id]" :disabled="!isCurrentTask || readingTaskState >= 2" type="number" v-model="questionForm[qs.Id]"
@focus="focusQs = { ...qs }" @change="((val) => { formItemChange(val, qs) })"> :disabled="!isCurrentTask || readingTaskState>=2 "
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append"> type="number"
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
<svg-icon v-if="qs.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
TableQuestionId: qs.Id,
RowIndex: questionForm.RowIndex,
QuestionName: qs.QuestionName
}
})" />
</div>
@focus="focusQs = {...qs}"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
</template> </template>
<template v-else> <template v-else>
<el-input v-model="questionForm[qs.Id]" <el-input
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False') && lesionType !== 2) || qs.QuestionMark === 9 || (qs.QuestionMark === 10 && isCurrentTaskAdd === 'False')" v-model="questionForm[qs.Id]"
@focus="focusQs = { ...qs }" @change="((val) => { formItemChange(val, qs) })"> :disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False') && lesionType !== 2) || qs.QuestionMark === 9 || (qs.QuestionMark === 10 && isCurrentTaskAdd === 'False')"
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append"> @focus="focusQs = {...qs}"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }} {{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template> </template>
</el-input> </el-input>
</template> </template>
</template> </template>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea" <el-input
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2" v-if="qs.Type==='textarea'"
@change="((val) => { formItemChange(val, qs) })" /> v-model="questionForm[qs.Id]"
<el-select v-if="qs.Type === 'select'" v-model="questionForm[qs.Id]" filterable type="textarea"
:disabled="((!isBaseLineTask && qs.QuestionMark === 11) || (isBaseLineTask || lesionType === 2) && qs.QuestionMark === 7) || !isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2)" :autosize="{ minRows: 2, maxRows: 4}"
@change="((val) => { formItemChange(val, qs) })"> :disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<el-select
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:disabled="((!isBaseLineTask && qs.QuestionMark === 11) || (isBaseLineTask || lesionType === 2) && qs.QuestionMark === 7) || !isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False'|| !!answers.SplitOrMergeLesionName) && lesionType !== 2)"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.TableQuestionType === 1"> <template v-if="qs.TableQuestionType === 1">
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]" <el-option
:value="item[qs.DataTableColumn]" /> v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" /> <el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" /> <el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7"> <template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option v-for="item of $d[qs.DictionaryCode]" :key="item.id" :value="item.value" :label="item.label" /> <el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="val in qs.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]" <el-radio-group
:disabled="!isCurrentTask || readingTaskState >= 2"> v-if="qs.Type==='radio'"
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val"> v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</div> </div>
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer" <div
style="text-align:right;margin-top:10px;"> v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button v-if="questionForm.MeasureData" size="mini" style="padding:7px 10px" @click="handleDeleteMeasureData"> <el-button
v-if="questionForm.MeasureData"
size="mini"
style="padding:7px 10px"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }} {{ $t('trials:reading:button:removeMark') }}
</el-button> </el-button>
<!-- 删除 --> <!-- 删除 -->
<el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" style="margin-left: 5px;padding:7px 10px" <el-button
@click="handleDelete"> v-if="isCurrentTaskAdd !== 'False'"
size="mini"
style="margin-left: 5px;padding:7px 10px"
@click="handleDelete"
>
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button size="mini" style="margin-left: 5px;padding:7px 10px" @click="handleSave"> <el-button
size="mini"
style="margin-left: 5px;padding:7px 10px"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</div> </div>
@ -213,9 +287,6 @@ export default {
DicomEvent.$off('handleImageQualityAbnormal') DicomEvent.$off('handleImageQualityAbnormal')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
validateLesionCount(rule, value, callback) { validateLesionCount(rule, value, callback) {
// const reg = /^[1-9][0-9]?$|^100$/ // const reg = /^[1-9][0-9]?$|^100$/
// const reg = /^(0+)|[^\d]+/g // const reg = /^(0+)|[^\d]+/g
@ -576,7 +647,7 @@ export default {
this.$confirm(this.$t('trials:readingPGWC:warnning:msg2'), { this.$confirm(this.$t('trials:readingPGWC:warnning:msg2'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -589,7 +660,7 @@ export default {
this.$confirm(this.$t('trials:readingPGWC:warnning:msg3'), { this.$confirm(this.$t('trials:readingPGWC:warnning:msg3'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -601,7 +672,7 @@ export default {
this.$confirm(this.$t('trials:readingPGWC:warnning:msg4'), { this.$confirm(this.$t('trials:readingPGWC:warnning:msg4'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -613,7 +684,7 @@ export default {
this.$confirm(this.$t('trials:readingPGWC:warnning:msg5'), { this.$confirm(this.$t('trials:readingPGWC:warnning:msg5'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -625,7 +696,7 @@ export default {
this.$confirm(this.$t('trials:readingPGWC:warnning:msg6'), { this.$confirm(this.$t('trials:readingPGWC:warnning:msg6'), {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
loading.close() loading.close()
return return
@ -784,7 +855,7 @@ export default {
type: 'warning', type: 'warning',
distinguishCancelAndClose: true distinguishCancelAndClose: true
}) })
.then(async () => { .then(async() => {
// //
if (this.questionForm.MeasureData) { if (this.questionForm.MeasureData) {
var remark = this.getLesionName(this.orderMark, this.questionForm.RowIndex) var remark = this.getLesionName(this.orderMark, this.questionForm.RowIndex)
@ -793,7 +864,7 @@ export default {
DicomEvent.$emit('getMeasureData') DicomEvent.$emit('getMeasureData')
this.$emit('close', { lesionType: this.lesionType, rowIndex: this.rowIndex, visitTaskId: this.visitTaskId }) this.$emit('close', { lesionType: this.lesionType, rowIndex: this.rowIndex, visitTaskId: this.visitTaskId })
}) })
.catch(() => { }) .catch(() => {})
} else { } else {
if (this.questionForm.isSave === false) { if (this.questionForm.isSave === false) {
// '' // ''
@ -804,7 +875,7 @@ export default {
.then(() => { .then(() => {
this.$emit('close') this.$emit('close')
}) })
.catch(() => { }) .catch(() => {})
} else { } else {
this.$emit('close') this.$emit('close')
} }
@ -829,45 +900,39 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-form { .measurement-form{
::v-deep .el-form-item__label { ::v-deep .el-form-item__label{
color: #c3c3c3; color: #c3c3c3;
} }
::v-deep .el-input .el-input__inner{
::v-deep .el-input .el-input__inner {
background-color: transparent; background-color: transparent;
color: #ddd; color: #ddd;
border: 1px solid #5e5e5e; border: 1px solid #5e5e5e;
} }
::v-deep .el-form-item{
::v-deep .el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
} }
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
flex: 1; flex: 1;
} }
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1; background-color: #646464a1;
} }
.el-form-item__content
.el-form-item__content .el-select { .el-select{
width: 100%; width: 100%;
} }
.input-width1{
.input-width1 { width: calc(100% - 60px)!important;
width: calc(100% - 60px) !important;
} }
.input-width2{
.input-width2 {
width: 100% !important; width: 100% !important;
} }
} }
</style> </style>

View File

@ -8,64 +8,58 @@
<span style="margin-left:5px;">{{ taskBlindName }}</span> <span style="margin-left:5px;">{{ taskBlindName }}</span>
</h3> </h3>
<div v-if="readingTaskState < 2"> <div v-if="readingTaskState < 2">
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" <el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
placement="bottom"> <i
<i class="el-icon-refresh-left" @click="resetMeasuredData" /> class="el-icon-refresh-left"
@click="resetMeasuredData"
/>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
<!-- 非测量问题 --> <!-- 非测量问题 -->
<div class="lesions"> <div class="lesions">
<Questions ref="ecrf" :question-form-change-state="questionFormChangeState" <Questions
:question-form-change-num="questionFormChangeNum" :is-first-change-task="isFirstChangeTask" ref="ecrf"
@handleReadingChart="handleReadingChart" /> :question-form-change-state="questionFormChangeState"
:question-form-change-num="questionFormChangeNum"
:is-first-change-task="isFirstChangeTask"
/>
</div> </div>
<!-- 测量问题 --> <!-- 测量问题 -->
<template v-if="questions.length > 0"> <template v-if="questions.length > 0">
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper"> <div v-for="(qs,index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
<h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 v-if="qs.Type === 'group'" style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }} {{ language==='en'?qs.GroupEnName:qs.GroupName }}
</h4> </h4>
<div class="lesion_list"> <div class="lesion_list">
<div v-for="item in qs.Childrens" <div v-for="item in qs.Childrens" v-show="!(isBaseLineTask && item.LesionType === 2) && !(isBaseLineTask && item.LesionType === 3)" :key="item.Id">
v-show="!(isBaseLineTask && item.LesionType === 2) && !(isBaseLineTask && item.LesionType === 3)"
:key="item.Id">
<div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;"> <div v-if="item.Type === 'table'" class="flex-row" style="margin:3px 0;">
<div class="title">{{ item.QuestionName }} <div class="title">{{ item.QuestionName }}</div>
<svg-icon v-if="item.LesionType === 4" icon-class="readingChart" <div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
e,
data: {
ReportChartTypeEnum: 1,
QuestionName: item.QuestionName
},
})" />
</div>
<div v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
@click.prevent="handleAdd(item)">
<i class="el-icon-plus" /> <i class="el-icon-plus" />
</div> </div>
</div> </div>
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion <el-collapse
@change="handleCollapseChange"> v-if="item.Type === 'table' && item.TableQuestions"
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`" v-model="activeName"
accordion
@change="handleCollapseChange"
>
<el-collapse-item
v-for="(q,i) in item.TableQuestions.Answers"
:key="`${item.Id}_${q.RowIndex}`"
:name="`${item.Id}_${q.RowIndex}`" :name="`${item.Id}_${q.RowIndex}`"
@contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)"> @contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)"
>
<template slot="title"> <template slot="title">
<div style="width:300px;position: relative;" <div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}">
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }"> {{ getLesionName(item.OrderMark,q.RowIndex, qs.Childrens) }}
{{ getLesionName(item.OrderMark, q.RowIndex, qs.Childrens) }}
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip <el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
</el-tooltip> </el-tooltip>
<!-- 已更新未保存 --> <!-- 已更新未保存 -->
<el-tooltip <el-tooltip v-if="readingTaskState<2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) ===1" class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')" placement="bottom">
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 1"
class="item" effect="dark" :content="$t('trials:reading:button:incompleteInfor')"
placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 60px;top: 2px;"> <div style="position: absolute;left: 60px;top: 2px;">
@ -74,29 +68,37 @@
{{ item.TableQuestions.Answers[i].lesionPart }} {{ item.TableQuestions.Answers[i].lesionPart }}
</div> </div>
<div v-if="item.TableQuestions.Answers[i].lesionState" style="margin-left:10px;"> <div v-if="item.TableQuestions.Answers[i].lesionState" style="margin-left:10px;">
{{ $fd('EvaluationOfState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('EvaluationOfState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</div> </div>
<div v-if="item.TableQuestions.Answers[i].lesionType" <div v-if="item.TableQuestions.Answers[i].lesionType" style="margin-left:10px;margin-bottom:5px;">
style="margin-left:10px;margin-bottom:5px;">
{{ item.TableQuestions.Answers[i].lesionType }} {{ item.TableQuestions.Answers[i].lesionType }}
</div> </div>
<div <div v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionNum)) && item.LesionType === 4" style="margin-left:10px;">
v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionNum)) && item.LesionType === 4"
style="margin-left:10px;">
{{ item.TableQuestions.Answers[i].lesionNum }} {{ item.TableQuestions.Answers[i].lesionNum }}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions" <QuestionForm
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType" :ref="`${item.Id}_${q.RowIndex}`"
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)" :questions="item.TableQuestions.Questions"
:question-name="item.QuestionName" :parent-qs-id="item.Id" :visit-task-id="visitTaskId" :answers="item.TableQuestions.Answers[i]"
:is-current-task="isCurrentTask" :reading-task-state="readingTaskState" :lesion-type="item.LesionType"
:is-base-line-task="isBaseLineTask" @getReadingQuestionAndAnswer="getReadingQuestionAndAnswer" :order-mark="item.OrderMark"
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions" :table-questions="tableQuestions"
@close="close" @handleReadingChart="handleReadingChart" /> :row-index="String(q.RowIndex)"
:question-name="item.QuestionName"
:parent-qs-id="item.Id"
:visit-task-id="visitTaskId"
:is-current-task="isCurrentTask"
:reading-task-state="readingTaskState"
:is-base-line-task="isBaseLineTask"
@getReadingQuestionAndAnswer="getReadingQuestionAndAnswer"
@determineExistsUnsavedLession="determineExistsUnsavedLession"
@resetQuestions="resetQuestions"
@close="close"
/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@ -216,9 +218,6 @@ export default {
DicomEvent.$off('getUnSaveTarget') DicomEvent.$off('getUnSaveTarget')
}, },
methods: { methods: {
handleReadingChart(e) {
this.$emit('handleReadingChart', e)
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -520,7 +519,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
return return
} }
@ -531,7 +530,7 @@ export default {
this.$confirm(msg, { this.$confirm(msg, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => { } callback: action => {}
}) })
} else { } else {
var obj = { saveTypeEnum: 0 } var obj = { saveTypeEnum: 0 }
@ -799,26 +798,23 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.measurement-wrapper { .measurement-wrapper{
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
// overflow: hidden; // overflow: hidden;
.container { .container{
padding: 10px; padding: 10px;
.basic-info{
.basic-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
h3{
h3 {
color: #ddd; color: #ddd;
padding: 5px 0px; padding: 5px 0px;
margin: 0; margin: 0;
} }
i{
i {
color: #fff; color: #fff;
font-size: 22px; font-size: 22px;
font-weight: bold; font-weight: bold;
@ -826,16 +822,14 @@ export default {
} }
} }
} }
.title{
.title {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
font-size: 15px; font-size: 15px;
} }
.add-icon{
.add-icon {
padding: 5px; padding: 5px;
font-weight: bold; font-weight: bold;
color: #ddd; color: #ddd;
@ -844,49 +838,42 @@ export default {
margin-bottom: 2px; margin-bottom: 2px;
cursor: pointer; cursor: pointer;
} }
.add-icon:hover{
.add-icon:hover {
background-color: #607d8b; background-color: #607d8b;
} }
.flex-row { .flex-row{
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
background-color: #424242; background-color: #424242;
} }
.lesion_list{
.lesion_list {
position: relative; position: relative;
} }
.el-collapse{
.el-collapse { border-bottom:none;
border-bottom: none; border-top:none;
border-top: none; ::v-deep .el-collapse-item{
background-color: #000!important;
::v-deep .el-collapse-item {
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__header{
::v-deep .el-collapse-item__header { background-color: #000!important;
background-color: #000 !important;
color: #ddd; color: #ddd;
border-bottom-color: #5a5a5a; border-bottom-color:#5a5a5a;
padding-left: 5px; padding-left: 5px;
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
} }
::v-deep .el-collapse-item__wrap{
::v-deep .el-collapse-item__wrap { background-color: #000!important;
background-color: #000 !important;
color: #ddd; color: #ddd;
} }
::v-deep .el-collapse-item__content{
::v-deep .el-collapse-item__content { width:260px;
width: 260px;
position: absolute; position: absolute;
top: 0px; top: 0px;
right: 0px; right: 0px;
@ -895,9 +882,10 @@ export default {
z-index: 1; z-index: 1;
color: #ddd; color: #ddd;
padding: 5px; padding: 5px;
background-color: #1e1e1e; background-color:#1e1e1e;
} }
} }
} }
</style> </style>

View File

@ -6,54 +6,47 @@
> >
{{ question.GroupName }} {{ question.GroupName }}
</div> --> </div> -->
<div v-if="!!question.GroupName && question.Type === 'group'"> <div
v-if="!!question.GroupName && question.Type==='group'"
>
<h4 style="color: #ddd;padding: 5px 0px;margin: 0;"> <h4 style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ language === 'en' ? question.GroupEnName : question.GroupName }} {{ language==='en'?question.GroupEnName:question.GroupName }}
</h4> </h4>
</div> </div>
<template v-else-if="((question.QuestionType === 56 || question.QuestionType === 57) && question.IsBaseLineTask)" /> <template v-else-if="((question.QuestionType === 56 || question.QuestionType === 57) && question.IsBaseLineTask)" />
<template v-else> <template v-else>
<el-form-item <el-form-item
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0" v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[ :label="`${question.QuestionName}`"
{ :prop="question.Id"
required: (question.IsRequired === 0 || (question.IsRequired === 1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type !== 'group' && question.Type !== 'summary', :rules="[
message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change'] { required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && (questionForm[question.RelevanceId] === question.RelevanceValue))) && question.Type!=='group' && question.Type!=='summary',
}, message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']},
]" ]"
:class="[question.Type === 'group' ? 'mb' : (question.Type === 'upload' || question.QuestionName.length > 15) ? 'uploadWrapper' : '']"> :class="[question.Type==='group' ? 'mb' : (question.Type==='upload' || question.QuestionName.length > 15) ?'uploadWrapper' : '']"
>
<template v-if="question.QuestionType === 60 || question.QuestionType === 61"> <template v-if="question.QuestionType === 60 || question.QuestionType === 61">
<div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;"> <div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;">
<div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'">
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled
style="width: 130px;">
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart"
class="svg-icon svg-readingChart" @click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: question.Id,
QuestionName: question.QuestionName
}
})" />
</div>
<el-input
v-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
style="width: 130px;"
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<!-- 测量 --> <!-- 测量 -->
<el-button v-if="!questionForm[question.Id] && readingTaskState !== 2" size="mini" type="text" <el-button v-if="!questionForm[question.Id] && readingTaskState!== 2" size="mini" type="text" @click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation') }}</el-button>
@click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation') }}</el-button>
<!-- 清除标记 --> <!-- 清除标记 -->
<el-button v-if="questionForm[question.Id] && readingTaskState !== 2" size="mini" type="text" <el-button v-if="questionForm[question.Id]&& readingTaskState!== 2" size="mini" type="text" @click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button>
@click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button>
<!-- 定位 --> <!-- 定位 -->
<el-button v-if="questionForm[question.Id]" size="mini" type="text" @click="locateAnnotation(question)">{{ <el-button v-if="questionForm[question.Id]" size="mini" type="text" @click="locateAnnotation(question)">{{ $t('trials:lugano:button:locateAnnotation') }}</el-button>
$t('trials:lugano:button:locateAnnotation') }}</el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button v-if="readingTaskState !== 2 && question.SaveEnum === 1" size="mini" type="text" <el-button v-if="readingTaskState!== 2 && question.SaveEnum === 1" size="mini" type="text" @click="saveAnnotation(question)">
@click="saveAnnotation(question)">
<!-- 未保存 --> <!-- 未保存 -->
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" /> <i class="el-icon-warning" style="color:red" />
@ -63,101 +56,157 @@
</div> </div>
</template> </template>
<template <template v-else-if="question.QuestionType === 48 || question.QuestionType === 51 || question.QuestionType === 52 || question.QuestionType === 53">
v-else-if="question.QuestionType === 48 || question.QuestionType === 51 || question.QuestionType === 52 || question.QuestionType === 53"> <el-input
<div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'"> v-if="question.Type==='calculation'"
<el-input v-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled> v-model="questionForm[question.Id]"
<template v-if="question.Unit" slot="append"> disabled
{{ $fd('ValueUnit', parseInt(question.Unit)) }} >
</template> <template v-if="question.Unit" slot="append">
</el-input> {{ $fd('ValueUnit', parseInt(question.Unit)) }}
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart" </template>
@click.stop="(e) => handleReadingChart({ </el-input>
e,
data: {
QuestionId: question.Id,
QuestionName: question.QuestionName
}
})" />
</div>
</template> </template>
<!-- 输入框 --> <!-- 输入框 -->
<el-input v-else-if="question.Type === 'input'" v-model="questionForm[question.Id]" <el-input
v-else-if="question.Type==='input'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask" :disabled="readingTaskState >= 2 || isFirstChangeTask"
@change="((val) => { formItemChange(val, question) })" /> @change="((val)=>{formItemChange(val, question)})"
/>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input v-else-if="question.Type === 'textarea'" v-model="questionForm[question.Id]" type="textarea" <el-input
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2 || isFirstChangeTask" v-else-if="question.Type==='textarea'"
@change="((val) => { formItemChange(val, question) })" /> v-model="questionForm[question.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
maxlength="500"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
@change="((val)=>{formItemChange(val, question)})"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select v-else-if="question.Type === 'select'" v-model="questionForm[question.Id]" <el-select
v-else-if="question.Type==='select'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode) || isFirstChangeTask || question.QuestionType === 50 || question.QuestionType === 55" :disabled="readingTaskState >= 2 || ((question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode) || isFirstChangeTask || question.QuestionType === 50 || question.QuestionType === 55"
clearable @change="((val) => { formItemChange(val, question) })"> clearable
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.TableQuestionType === 1"> <template v-if="question.TableQuestionType === 1">
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]" <el-option
:value="item[question.DataTableColumn]" /> v-for="item in organList"
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
</template> </template>
<template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 47 && question.IsBaseLineTask"> <template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 47 && question.IsBaseLineTask">
<el-option v-for="item of $d[question.DictionaryCode]" <el-option
v-show="item.value === 1 || item.value === 2 || item.value === 5" :key="item.id" v-for="item of $d[question.DictionaryCode]"
:value="String(item.value)" :label="item.label" /> v-show="item.value === 1 ||item.value === 2 || item.value === 5 "
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template <template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 47 && !question.IsBaseLineTask">
v-else-if="question.QuestionGenre === 3 && question.QuestionType === 47 && !question.IsBaseLineTask">
<el-option-group <el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''"> :label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''"
<el-option v-for="item of $d[question.DictionaryCode]" >
v-show="item.value === 1 || item.value === 3 || item.value === 4 || item.value === 5" :key="item.id" <el-option
:value="String(item.value)" :label="item.label" /> v-for="item of $d[question.DictionaryCode]"
v-show="item.value === 1 ||item.value === 3|| item.value === 4 || item.value === 5"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</el-option-group> </el-option-group>
</template> </template>
<template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 49 && question.IsBaseLineTask"> <template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 49 && question.IsBaseLineTask">
<el-option v-for="item of $d[question.DictionaryCode]" <el-option
v-show="item.value === 1 || item.value === 5 || item.value === 6" :key="item.id" v-for="item of $d[question.DictionaryCode]"
:value="String(item.value)" :label="item.label" /> v-show="item.value === 1 ||item.value === 5 || item.value === 6 "
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template <template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 49 && !question.IsBaseLineTask">
v-else-if="question.QuestionGenre === 3 && question.QuestionType === 49 && !question.IsBaseLineTask">
<el-option-group <el-option-group
:label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode, parseFloat(question.LastTaskAnswer))}` : ''"> :label="!isNaN(parseFloat(question.LastTaskAnswer)) ? `${$t('trials:dicomReading:tip:lastVisitStatus')} ${$fd(question.DictionaryCode,parseFloat(question.LastTaskAnswer))}` : ''"
<el-option v-for="item of $d[question.DictionaryCode]" >
v-show="item.value === 1 || item.value === 2 || item.value === 3 || item.value === 4 || item.value === 5" <el-option
:key="item.id" :value="String(item.value)" :label="item.label" /> v-for="item of $d[question.DictionaryCode]"
v-show="item.value === 1 ||item.value === 2 || item.value === 3 || item.value === 4 || item.value === 5"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</el-option-group> </el-option-group>
</template> </template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3"> <template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" <el-option
:label="item.label" /> v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template <template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode"> <el-option
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)" v-for="item of $d[question.DictionaryCode]"
:label="item.label" /> :key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<!-- 单选 --> <!-- 单选 -->
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]" <el-radio-group
:disabled="readingTaskState >= 2 || isFirstChangeTask" @change="((val) => { formItemChange(val, question) })"> v-else-if="question.Type==='radio'"
v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.DictionaryCode"> <template v-if="question.DictionaryCode">
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)"> <el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="String(item.value)"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</template> </template>
<template v-else-if="question.TypeValue"> <template v-else-if="question.TypeValue">
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val"> <el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</template> </template>
</el-radio-group> </el-radio-group>
<!-- 复选框 --> <!-- 复选框 -->
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]" <el-checkbox-group
:disabled="readingTaskState >= 2 || isFirstChangeTask"> v-else-if="question.Type==='checkbox'"
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val"> v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
>
<el-checkbox
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
@ -168,53 +217,80 @@
:disabled="readingTaskState >= 2 || isFirstChangeTask" :disabled="readingTaskState >= 2 || isFirstChangeTask"
:precision="2" :precision="2"
/> --> /> -->
<div style="display: flex;justify-content: space-between;" <template v-else-if="question.Type==='number'">
v-else-if="question.Type === 'number' || question.Type === 'calculation'"> <el-input-number
<template v-if="question.Type === 'number'"> v-if="question.ValueType === 0"
<el-input-number v-if="question.ValueType === 0" v-model="questionForm[question.Id]" :precision="0" v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask" /> :precision="0"
<el-input-number v-else-if="question.ValueType === 3" v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2 || isFirstChangeTask"
:disabled="readingTaskState >= 2 || isFirstChangeTask" /> />
<el-input-number v-else-if="question.ValueType === 1 || question.ValueType === 2" <el-input-number
v-model="questionForm[question.Id]" :precision="digitPlaces" v-else-if="question.ValueType === 3"
:disabled="readingTaskState >= 2 || isFirstChangeTask" /> v-model="questionForm[question.Id]"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
/>
<el-input-number
v-else-if="question.ValueType === 1 || question.ValueType === 2"
v-model="questionForm[question.Id]"
:precision="digitPlaces"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
/>
</template>
<el-input
v-else-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
disabled
>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template> </template>
<el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled> </el-input>
<template v-if="question.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
</template>
</el-input>
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
@click.stop="(e) => handleReadingChart({
e,
data: {
QuestionId: question.Id,
QuestionName: question.QuestionName
}
})" />
</div>
<!-- 上传图像 --> <!-- 上传图像 -->
<el-upload v-else-if="question.Type === 'upload'" action :accept="accept" :limit="question.ImageCount" <el-upload
:on-preview="handlePictureCardPreview" :before-upload="handleBeforeUpload" :http-request="uploadScreenshot" v-else-if="question.Type==='upload'"
list-type="picture-card" :on-remove="handleRemove" :file-list="fileList" action
:class="{ disabled: fileList.length >= question.ImageCount }" :accept="accept"
:disabled="readingTaskState >= 2 || isFirstChangeTask"> :limit="question.ImageCount"
:on-preview="handlePictureCardPreview"
:before-upload="handleBeforeUpload"
:http-request="uploadScreenshot"
list-type="picture-card"
:on-remove="handleRemove"
:file-list="fileList"
:class="{disabled:fileList.length >= question.ImageCount}"
:disabled="readingTaskState >= 2 || isFirstChangeTask"
>
<i slot="default" class="el-icon-plus" /> <i slot="default" class="el-icon-plus" />
<div slot="file" slot-scope="{file}"> <div slot="file" slot-scope="{file}">
<img class="el-upload-list__item-thumbnail" :src="OSSclientConfig.basePath + file.url" alt=""> <img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
>
<span class="el-upload-list__item-actions"> <span class="el-upload-list__item-actions">
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)"> <span
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
>
<i class="el-icon-zoom-in" /> <i class="el-icon-zoom-in" />
</span> </span>
<span v-if="readingTaskState < 2" class="el-upload-list__item-delete" @click="handleRemove(file)"> <span
v-if="readingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" /> <i class="el-icon-delete" />
</span> </span>
</span> </span>
</div> </div>
</el-upload> </el-upload>
<el-dialog v-if="question.Type === 'upload'" append-to-body :visible.sync="imgVisible" width="600px"> <el-dialog
v-if="question.Type==='upload'"
append-to-body
:visible.sync="imgVisible"
width="600px"
>
<el-image :src="imageUrl" width="100%"> <el-image :src="imageUrl" width="100%">
<div slot="placeholder" class="image-slot"> <div slot="placeholder" class="image-slot">
加载中<span class="dot">...</span> 加载中<span class="dot">...</span>
@ -224,9 +300,17 @@
</el-form-item> </el-form-item>
</template> </template>
<QuestionItem v-for="(item) in question.Childrens" :key="item.Id" :question="item" <QuestionItem
:reading-task-state="readingTaskState" :is-first-change-task="isFirstChangeTask" :question-form="questionForm" v-for="(item) in question.Childrens"
:visit-task-id="visitTaskId" @setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData" /> :key="item.Id"
:question="item"
:reading-task-state="readingTaskState"
:is-first-change-task="isFirstChangeTask"
:question-form="questionForm"
:visit-task-id="visitTaskId"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</div> </div>
</template> </template>
<script> <script>
@ -339,7 +423,7 @@ export default {
.then(() => { .then(() => {
DicomEvent.$emit('removeAnnotation', question) DicomEvent.$emit('removeAnnotation', question)
}) })
.catch(() => { }) .catch(() => {})
}, },
locateAnnotation(question) { locateAnnotation(question) {
DicomEvent.$emit('locateAnnotation', question) DicomEvent.$emit('locateAnnotation', question)
@ -395,36 +479,29 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.mb { .mb{
margin-bottom: 0px; margin-bottom: 0px;
} }
.disabled{
.disabled {
::v-deep .el-upload--picture-card { ::v-deep .el-upload--picture-card {
display: none; display: none;
} }
} }
.uploadWrapper{
.uploadWrapper {
display: flex; display: flex;
flex-direction: column !important; flex-direction: column !important;
align-items: flex-start; align-items: flex-start;
} }
::v-deep .el-input.is-disabled .el-input__inner{
::v-deep .el-input.is-disabled .el-input__inner { background-color: #646464a1;
background-color: #646464a1; }
} ::v-deep .el-input-group__append, .el-input-group__prepend{
padding: 0 10px;
::v-deep .el-input-group__append, }
.el-input-group__prepend { ::v-deep .el-form-item__content {
padding: 0 10px; width: 100%;
} }
::v-deep .el-select.is-disabled .el-input__inner{
::v-deep .el-form-item__content { background-color: #646464a1;
width: 100%; }
}
::v-deep .el-select.is-disabled .el-input__inner {
background-color: #646464a1;
}
</style> </style>

Some files were not shown because too many files have changed in this diff Show More