Compare commits
44 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
8cef0141a4 | |
|
|
88a7634ed3 | |
|
|
60415e41d1 | |
|
|
d7e85aa766 | |
|
|
ef4d6420f3 | |
|
|
b6ffcd3d6b | |
|
|
914a6af94a | |
|
|
fee7e80929 | |
|
|
d065b8b2c1 | |
|
|
52445f3791 | |
|
|
c4f8e08b91 | |
|
|
f7968667f6 | |
|
|
24303b208d | |
|
|
296c251847 | |
|
|
3b9e5cddb7 | |
|
|
d11092338d | |
|
|
848427ac3c | |
|
|
d70cffe306 | |
|
|
0cd44bf4c6 | |
|
|
a2939e52b2 | |
|
|
99e6f700c3 | |
|
|
45c50bf67d | |
|
|
19e3177e23 | |
|
|
437010c0f7 | |
|
|
01b3d6e85e | |
|
|
cb032485e1 | |
|
|
4b771a9d70 | |
|
|
86321d8405 | |
|
|
b9f3b24608 | |
|
|
bde8a7d572 | |
|
|
267ee60fc2 | |
|
|
ef891857c4 | |
|
|
787f6425e0 | |
|
|
4929bb594d | |
|
|
4b9c2a073b | |
|
|
861c7022b9 | |
|
|
21e0568b90 | |
|
|
ffc9372c25 | |
|
|
a58a6e4931 | |
|
|
6ac94ec1a0 | |
|
|
ddc175961c | |
|
|
098a838c1e | |
|
|
6bb7d47511 | |
|
|
8e641300d2 |
6
.env.usa
|
|
@ -2,7 +2,11 @@
|
|||
ENV = 'usa'
|
||||
NODE_ENV = 'usa'
|
||||
# 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:否
|
||||
VUE_APP_LOGIN_FOR_PERMISSION = true
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
ENV = 'usa'
|
||||
NODE_ENV = 'usa'
|
||||
# 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:否
|
||||
VUE_APP_LOGIN_FOR_PERMISSION = true
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
@ -6,6 +6,7 @@
|
|||
"build": "vue-cli-service build",
|
||||
"build:prod": "vue-cli-service build --mode prod",
|
||||
"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_prod": "vue-cli-service build --mode usa_prod",
|
||||
"pre": "vue-cli-service build --mode pre",
|
||||
|
|
@ -20,7 +21,6 @@
|
|||
"@cornerstonejs/core": "^2.19.7",
|
||||
"@cornerstonejs/dicom-image-loader": "^2.19.7",
|
||||
"@cornerstonejs/tools": "^2.19.7",
|
||||
"@fingerprintjs/fingerprintjs": "^4.6.2",
|
||||
"@icr/polyseg-wasm": "^0.4.0",
|
||||
"@microsoft/signalr": "^8.0.7",
|
||||
"@riophae/vue-treeselect": "^0.4.0",
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 21 KiB |
|
|
@ -350,43 +350,3 @@ export function getUserJoinedTrialList(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
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1403,74 +1403,3 @@ export function batchUpdateEmail(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'
|
||||
})
|
||||
}
|
||||
|
|
@ -255,14 +255,6 @@ export function getCommonJudgeRatioList_Export(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) {
|
||||
return requestDownload({
|
||||
|
|
|
|||
|
|
@ -294,28 +294,3 @@ export function readingImport(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
|
||||
})
|
||||
}
|
||||
|
|
@ -26,11 +26,8 @@ export function getTrialSurveyInitInfo(trialId) {
|
|||
|
||||
export function getSiteSurveyInfo(trialId, id) {
|
||||
return request({
|
||||
url: `/TrialSiteSurvey/getSiteSurveyInfo/${trialId}`,
|
||||
method: 'get',
|
||||
params: {
|
||||
TrialsiteSurveyId: id
|
||||
}
|
||||
url: `/TrialSiteSurvey/getSiteSurveyInfo/${trialId}/${id}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1203,13 +1203,7 @@ export function getConsistencyVerificationList(param) {
|
|||
data: param
|
||||
})
|
||||
}
|
||||
export function getConsistencyCheckFileList(param) {
|
||||
return request({
|
||||
url: `/QCList/getConsistencyCheckFileList`,
|
||||
method: 'post',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getCheckChallengeDialogList(subjectVisitId) {
|
||||
return request({
|
||||
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()
|
||||
formData.append('file', file)
|
||||
return request({
|
||||
url: `/QCOperation/UploadVisitCheckExcel/${trialId}?isFullCheck=${isFullCheck}`,
|
||||
url: `/QCOperation/UploadVisitCheckExcel/${trialId}`,
|
||||
method: 'post',
|
||||
data: formData
|
||||
})
|
||||
|
|
@ -2839,13 +2833,7 @@ export function getSplitPPdSum(param) {
|
|||
data: param
|
||||
})
|
||||
}
|
||||
export function getSplitPPdSumNoPet(param) {
|
||||
return request({
|
||||
url: `/LuganoWithoutPETCalculate/getSplitPPdSum`,
|
||||
method: 'post',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
export function submitDicomVisitTask(param) {
|
||||
return request({
|
||||
url: `/Inspection/ReadingImageTask/SubmitDicomVisitTask`,
|
||||
|
|
@ -2884,13 +2872,7 @@ export function getIsSuvMaxLesion(param) {
|
|||
data: param
|
||||
})
|
||||
}
|
||||
export function getIsSuvMaxLesionNoPet(param) {
|
||||
return request({
|
||||
url: `/LuganoWithoutPETCalculate/getIsSuvMaxLesion`,
|
||||
method: 'post',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getCanChooseNotMerge(param) {
|
||||
return request({
|
||||
url: `/LuganoCalculate/getCanChooseNotMerge`,
|
||||
|
|
@ -2898,13 +2880,6 @@ export function getCanChooseNotMerge(param) {
|
|||
data: param
|
||||
})
|
||||
}
|
||||
export function getCanChooseNotMergeNoPet(param) {
|
||||
return request({
|
||||
url: `/LuganoWithoutPETCalculate/getCanChooseNotMerge`,
|
||||
method: 'post',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function saveTaskQuestion(saveQuestionType, param) {
|
||||
return request({
|
||||
url: `/SaveTaskQuestion/${saveQuestionType}`,
|
||||
|
|
@ -3628,24 +3603,13 @@ export function getSplenicState(visitTaskId, spleenLength) {
|
|||
method: 'post'
|
||||
})
|
||||
}
|
||||
export function getSplenicStateNoPet(visitTaskId, spleenLength) {
|
||||
return request({
|
||||
url: `/LuganoWithoutPETCalculate/getSplenicState?visitTaskId=${visitTaskId}&spleenLength=${spleenLength}`,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
export function getSplenicVerify(visitTaskId) {
|
||||
return request({
|
||||
url: `/LuganoCalculate/getSplenicVerify?visitTaskId=${visitTaskId}`,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
export function getSplenicVerifyNoPet(visitTaskId) {
|
||||
return request({
|
||||
url: `/LuganoWithoutPETCalculate/getSplenicVerify?visitTaskId=${visitTaskId}`,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
export function uploadTrialSiteSurveyUser(trialId, baseUrl, routeUrl, param) {
|
||||
return request({
|
||||
url: `/TrialSiteSurvey/UploadTrialSiteSurveyUser?trialId=${trialId}&baseUrl=${baseUrl}&routeUrl=${routeUrl}`,
|
||||
|
|
@ -4318,92 +4282,3 @@ export function deleteAuditRecord(auditRecordId) {
|
|||
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
|
||||
})
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
};
|
||||
|
|
@ -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>
|
||||
|
|
@ -1,11 +1,25 @@
|
|||
<template>
|
||||
<!--MFA-->
|
||||
<el-dialog v-if="visible" :visible.sync="visible" width="540px" :close-on-click-modal="false" append-to-body center
|
||||
:show-close="status === 'login'" @close="cancel">
|
||||
<el-dialog
|
||||
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">
|
||||
{{ status === "login" ? $t("mfa:title") : $t("mfa:lock:title") }}
|
||||
</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">
|
||||
<i class="el-icon-warning" style="color: #409eff"></i>
|
||||
|
|
@ -17,13 +31,18 @@
|
|||
</el-form-item>
|
||||
<!-- 验证码 -->
|
||||
<el-form-item :label="$t('mfa:form:MFACode')" prop="Code">
|
||||
<div style="display: flex;justify-content: space-between;width: 90%;">
|
||||
<el-input :placeholder="$t('mfa:form:input:placeholder:Codes')" v-model="form.Code" />
|
||||
<el-button size="small" @click.stop="sendMFACode" :disabled="flag || sendFlag" style="margin-left: 10px;"
|
||||
class="codeBtn">{{
|
||||
flag ?
|
||||
`${$t("mfa:form:sendMFACodeCountDown")} (${second}s)` : $t("mfa:form:sendMFACode") }}</el-button>
|
||||
</div>
|
||||
<el-input
|
||||
:placeholder="$t('mfa:form:input:placeholder:Codes')"
|
||||
v-model="form.Code"
|
||||
style="width: 240px; margin-right: 10px"
|
||||
/>
|
||||
<el-button
|
||||
type="primary"
|
||||
size="small"
|
||||
@click.stop="sendMFACode"
|
||||
:disabled="flag || sendFlag"
|
||||
>{{ flag ? `${second}s` : $t("mfa:form:sendMFACode") }}</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer">
|
||||
|
|
@ -32,16 +51,19 @@
|
|||
{{ $t("mfa:button:cancel") }}
|
||||
</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"
|
||||
? $t("mfa:button:save")
|
||||
: $t("mfa:lock:button:save")
|
||||
}}
|
||||
</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>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
|
@ -64,7 +86,6 @@ export default {
|
|||
IdentityUserId: null,
|
||||
EMail: null,
|
||||
username: null,
|
||||
isRemember: true
|
||||
},
|
||||
rules: {
|
||||
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: {
|
||||
open(data) {
|
||||
let { UserId, status, username, EMail } = data;
|
||||
|
|
@ -180,21 +189,6 @@ export default {
|
|||
};
|
||||
</script>
|
||||
<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 {
|
||||
width: 86%;
|
||||
margin: auto;
|
||||
|
|
@ -204,12 +198,10 @@ export default {
|
|||
line-height: 30px;
|
||||
border-radius: 5px;
|
||||
background-color: #eee;
|
||||
|
||||
i {
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .el-dialog__header {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import Preview from "./index.vue";
|
|||
const PreviewConstructor = Vue.extend(Preview);
|
||||
|
||||
const preview = options => {
|
||||
const { path, type, title, isLocal = false } = options;
|
||||
const { path, type, title } = options;
|
||||
if (!path) throw `path is requred.but ${path}`
|
||||
const id = `Preview_${new Date().getTime()}`;
|
||||
const instance = new PreviewConstructor();
|
||||
|
|
@ -12,7 +12,7 @@ const preview = options => {
|
|||
instance.vm = instance.$mount();
|
||||
if (instance.vm.visible) return;
|
||||
document.body.appendChild(instance.vm.$el);
|
||||
instance.vm.open(path, type, title, isLocal);
|
||||
instance.vm.open(path, type, title);
|
||||
instance.vm.$on("closed", () => {
|
||||
document.body.removeChild(instance.vm.$el);
|
||||
instance.vm.$destroy();
|
||||
|
|
|
|||
|
|
@ -1,8 +1,15 @@
|
|||
<template>
|
||||
<el-dialog v-if="visible" :visible.sync="visible" :title="title" :fullscreen="true" append-to-body
|
||||
custom-class="base-dialog-wrapper" @close="handleClose">
|
||||
<el-dialog
|
||||
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">
|
||||
<PreviewFile v-if="visible" :file-path="path" :file-type="type" :is-local="isLocal" />
|
||||
<PreviewFile v-if="visible" :file-path="path" :file-type="type" />
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
|
@ -17,15 +24,13 @@ export default {
|
|||
path: null,
|
||||
type: null,
|
||||
title: null,
|
||||
isLocal: false
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
open(path, type, title, isLocal) {
|
||||
open(path, type, title) {
|
||||
this.path = path;
|
||||
this.type = type;
|
||||
this.title = title;
|
||||
this.isLocal = isLocal;
|
||||
this.visible = true;
|
||||
},
|
||||
handleClose() {
|
||||
|
|
|
|||
|
|
@ -5,17 +5,16 @@
|
|||
<!-- <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="`/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" />
|
||||
<!-- <pdf-->
|
||||
<!-- v-else-if="fileType.indexOf('pdf') !== -1"-->
|
||||
<!-- :src="`/static/pdfjs/web/viewer.html?file=${filePath}`">-->
|
||||
<!-- </pdf>-->
|
||||
<video :src="`${isLocal ? window.location.origin : OSSclientConfig.basePath}${filePath}`"
|
||||
style="width: 100%;height: 99%;" autoplay controls controlsList="nodownload"
|
||||
v-else-if="fileType.indexOf('mp4') !== -1"></video>
|
||||
<video :src="`${OSSclientConfig.basePath}${filePath}`" style="width: 100%;height: 99%;" autoplay controls
|
||||
controlsList="nodownload" v-else-if="fileType.indexOf('mp4') !== -1"></video>
|
||||
<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" />
|
||||
<!-- <div v-else>
|
||||
{{ $t('common:message:downloadFile') }}
|
||||
|
|
@ -44,17 +43,12 @@ export default {
|
|||
type: String,
|
||||
default: ''
|
||||
},
|
||||
isLocal: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
currentUser: zzSessionStorage.getItem('userName'),
|
||||
COMPANY: process.env.VUE_APP_COMPANY_NAME,
|
||||
onlyOffice_url: process.env.VUE_APP_ONLYOFFICE_URL,
|
||||
window,
|
||||
onlyOffice_url: process.env.VUE_APP_ONLYOFFICE_URL
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
click() {
|
||||
if (!screenfull.isEnabled) {
|
||||
if (!screenfull.enabled) {
|
||||
this.$message({
|
||||
message: 'you browser can not work',
|
||||
type: 'warning'
|
||||
|
|
@ -35,12 +35,12 @@ export default {
|
|||
this.isFullscreen = screenfull.isFullscreen
|
||||
},
|
||||
init() {
|
||||
if (screenfull.isEnabled) {
|
||||
if (screenfull.enabled) {
|
||||
screenfull.on('change', this.change)
|
||||
}
|
||||
},
|
||||
destroy() {
|
||||
if (screenfull.isEnabled) {
|
||||
if (screenfull.enabled) {
|
||||
screenfull.off('change', this.change)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -730,13 +730,6 @@ export default {
|
|||
fileList: [],
|
||||
dicomInfo: {
|
||||
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'),
|
||||
DicomStudyTime: data.string('x00080030'),
|
||||
studyUid: studyUid,
|
||||
|
|
@ -849,9 +842,6 @@ export default {
|
|||
)
|
||||
seriesItem = {
|
||||
seriesUid: seriesUid,
|
||||
RadiopharmaceuticalInformationSequence: data.string('x00540016') || "",
|
||||
AcquisitionDate: data.string('x00080022') || "",
|
||||
|
||||
DicomSeriesDate: data.string('x00080021'),
|
||||
DicomSeriesTime: data.string('x00080031'),
|
||||
seriesNumber: data.intString('x00200011') || 1,
|
||||
|
|
@ -892,20 +882,6 @@ export default {
|
|||
instanceTime = time ? `${date} ${time}` : `${date} 00:00:00`
|
||||
}
|
||||
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,
|
||||
SOPClassUID: data.string('x00080016'),
|
||||
TransferSytaxUID: data.string('x00020010'),
|
||||
|
|
@ -1122,13 +1098,6 @@ export default {
|
|||
DicomStudyDate: dicomInfo.DicomStudyDate,
|
||||
DicomStudyTime: dicomInfo.DicomStudyTime,
|
||||
seriesList: [],
|
||||
|
||||
Manufacturer: dicomInfo.Manufacturer,
|
||||
ManufacturerModelName: dicomInfo.ManufacturerModelName,
|
||||
DeviceSerialNumber: dicomInfo.DeviceSerialNumber,
|
||||
DeviceUID: dicomInfo.DeviceUID,
|
||||
SoftwareVersions: dicomInfo.SoftwareVersions,
|
||||
PatientWeight: dicomInfo.PatientWeight,
|
||||
},
|
||||
}
|
||||
let arr = []
|
||||
|
|
@ -1171,20 +1140,6 @@ export default {
|
|||
windowWidth: o.windowWidth,
|
||||
path: o.myPath,
|
||||
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)
|
||||
dicomInfo.failedFileCount++
|
||||
|
|
@ -1269,20 +1224,6 @@ export default {
|
|||
windowWidth: o.windowWidth,
|
||||
path: scope.$getObjectName(res.url),
|
||||
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)
|
||||
Record.Uploaded.push(name)
|
||||
|
|
@ -1331,9 +1272,6 @@ export default {
|
|||
bodyPartExamined: dicomInfo.bodyPart,
|
||||
instanceList: instanceList,
|
||||
ImageResizePath: ImageResizePath,
|
||||
|
||||
RadiopharmaceuticalInformationSequence: v.RadiopharmaceuticalInformationSequence,
|
||||
AcquisitionDate: v.AcquisitionDate,
|
||||
})
|
||||
}
|
||||
let text = JSON.stringify(Record)
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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 |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 418 B |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -26,9 +26,8 @@ Vue.use(VueClipboard)
|
|||
import permission from './utils/permission'
|
||||
Vue.use(permission)
|
||||
|
||||
import { formatSize, guidToColor } from "./utils"
|
||||
import { formatSize } from "./utils"
|
||||
Vue.prototype.$FormatSize = formatSize
|
||||
Vue.prototype.$GuidToColor = guidToColor
|
||||
|
||||
import Viewer from 'v-viewer'
|
||||
import './assets/css/viewer.css'
|
||||
|
|
@ -62,8 +61,6 @@ import Onlyoffice from '@/components/Preview_onlyoffice/index'
|
|||
Vue.use(Onlyoffice)
|
||||
import Video from '@/components/Preview_video/index'
|
||||
Vue.use(Video)
|
||||
import AGR from '@/components/AGR/index'
|
||||
Vue.use(AGR)
|
||||
import MFA from '@/components/MFA/index'
|
||||
Vue.use(MFA)
|
||||
import FB from '@/components/feedBack/index'
|
||||
|
|
|
|||
|
|
@ -358,17 +358,3 @@ body .el-table th.gutter {
|
|||
.el-message-box__wrapper {
|
||||
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;
|
||||
}
|
||||
|
|
@ -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 => {
|
||||
// // 自定义数据转换
|
||||
|
||||
// });
|
||||
});
|
||||
}
|
||||
|
|
@ -197,109 +197,3 @@ export function workSpeedclose(isForce = false) {
|
|||
imageId = null;
|
||||
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;
|
||||
}
|
||||
|
|
@ -5,7 +5,6 @@ import router from '@/router'
|
|||
import WHITELIST from "./whiteList"
|
||||
import moment from 'moment-timezone';
|
||||
import { encryptConfig } from "@/utils/encrypt"
|
||||
import { customAgent } from './fingerprint'
|
||||
const ROUTER = require('@/router');
|
||||
axios.defaults.withCredentials = false
|
||||
const service = axios.create({
|
||||
|
|
@ -27,8 +26,6 @@ service.interceptors.request.use(
|
|||
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['TimeZoneId'] = moment.tz.guess()
|
||||
let fingerprint = await customAgent()
|
||||
config.headers['BrowserFingerprint'] = fingerprint.visitorId
|
||||
if (config.ENCRYPT) {
|
||||
try {
|
||||
config = await encryptConfig(config)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -112,7 +112,7 @@ export default {
|
|||
this.currentTime = moment().format('YYYY-MM-DD HH:mm:ss')
|
||||
},
|
||||
handleTitleClick() {
|
||||
if (!screenfull.isEnabled) {
|
||||
if (!screenfull.enabled) {
|
||||
this.$message({
|
||||
message: 'Your browser can not work',
|
||||
type: 'warning'
|
||||
|
|
|
|||
|
|
@ -83,8 +83,8 @@
|
|||
{{ item.description }}
|
||||
</div>
|
||||
<div v-if="!item.keySeries" style="padding: 1px;">
|
||||
{{ item.imageloadedArr.length <= item.instanceCount ? item.imageloadedArr.length :
|
||||
item.instanceCount }}/{{ item.instanceCount }} </div>
|
||||
{{ item.imageloadedArr.length }}/{{ item.instanceCount }}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -94,14 +94,11 @@
|
|||
<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)" />
|
||||
<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)" />
|
||||
<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
|
||||
|
|
@ -894,7 +891,6 @@ export default {
|
|||
// 设置当前序列状态为已下载完成
|
||||
this.seriesList[seriesIndex].loadStatus = true
|
||||
workSpeedclose()
|
||||
localStorage.setItem("QCRiskControl", 1)
|
||||
if (!this.isFromCRCUpload) {
|
||||
this.loadAllImages()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -113,8 +113,8 @@
|
|||
</div>
|
||||
</el-tooltip>
|
||||
<div style="padding: 1px;">
|
||||
{{ series.imageloadedArr.length <= series.instanceCount ? series.imageloadedArr.length :
|
||||
series.instanceCount }}/{{ series.instanceCount }} </div>
|
||||
{{ series.imageloadedArr.length }}/{{ series.instanceCount }}
|
||||
</div>
|
||||
<div />
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -937,7 +937,6 @@ export default {
|
|||
this.loadAllImages()
|
||||
}
|
||||
workSpeedclose()
|
||||
localStorage.setItem("QCRiskControl", 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -106,16 +106,6 @@ export default {
|
|||
isTrial: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
isExternal: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
ExternalList: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return []
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
|
|
@ -132,8 +122,7 @@ export default {
|
|||
rowData: {},
|
||||
list: [],
|
||||
searchData: defaultSearchData(),
|
||||
title: this.$t('dictionary:signature:fileList'),
|
||||
loading: false
|
||||
title: this.$t('dictionary:signature:fileList')
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
|
|
@ -142,16 +131,6 @@ export default {
|
|||
this.getList()
|
||||
},
|
||||
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: {
|
||||
|
|
@ -166,7 +145,6 @@ export default {
|
|||
},
|
||||
async getList() {
|
||||
try {
|
||||
if (this.isExternal) return
|
||||
if (!this.SystemDocumentId) return false
|
||||
this.loading = true
|
||||
if (!this.isTrial) {
|
||||
|
|
|
|||
|
|
@ -191,17 +191,6 @@
|
|||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</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-form-item>
|
||||
<span slot="label">
|
||||
|
|
@ -1019,7 +1008,6 @@ export default {
|
|||
ValueCN: null,
|
||||
EnumType: '',
|
||||
IsShowByTrialConfig: false,
|
||||
ApplyCriterionList: [],
|
||||
TrialConfigRelyFieldName: null,
|
||||
Identification: null,
|
||||
IsForwardPosition: false,
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -1,143 +1,251 @@
|
|||
<template>
|
||||
<el-form ref="clinicalDataForm" v-loading="loading" :model="form" size="small" :rules="rules"
|
||||
:disabled="type === 'look'" label-width="220px">
|
||||
<el-form
|
||||
ref="clinicalDataForm"
|
||||
v-loading="loading"
|
||||
:model="form"
|
||||
size="small"
|
||||
:rules="rules"
|
||||
:disabled="type === 'look'"
|
||||
label-width="220px"
|
||||
>
|
||||
<div class="base-dialog-body" style="height: 550px; display:flex;flex-direction: column;">
|
||||
<div style="height: 150px;">
|
||||
<!-- 类型 -->
|
||||
<el-form-item :label="$t('trials:readingUnit:qsList:title:type')" prop="Type">
|
||||
<el-select v-model="form.Type" clearable @change="
|
||||
<el-select
|
||||
v-model="form.Type"
|
||||
clearable
|
||||
@change="
|
||||
(val) => {
|
||||
typeChange(val, form)
|
||||
}
|
||||
">
|
||||
<el-option v-for="item of $d.Criterion_Question_Type" v-show="item.value !== 'class'" :key="item.value"
|
||||
:value="item.value" :label="item.label" />
|
||||
"
|
||||
>
|
||||
<el-option
|
||||
v-for="item of $d.Criterion_Question_Type"
|
||||
v-show="item.value !== 'class'"
|
||||
:key="item.value"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 分组名称 -->
|
||||
<el-form-item v-if="form.Type === 'group'" :label="$t('trials:readingUnit:qsList:title:groupName')"
|
||||
prop="GroupName">
|
||||
<el-form-item
|
||||
v-if="form.Type === 'group'"
|
||||
:label="$t('trials:readingUnit:qsList:title:groupName')"
|
||||
prop="GroupName"
|
||||
>
|
||||
<el-input v-model="form.GroupName" />
|
||||
</el-form-item>
|
||||
<!-- 分组名称(EN) -->
|
||||
<el-form-item v-if="form.Type === 'group'" :label="$t('dictionary:template:criterionConfig:title:groupNameEn')"
|
||||
prop="GroupEnName">
|
||||
<el-form-item
|
||||
v-if="form.Type === 'group'"
|
||||
:label="$t('dictionary:template:criterionConfig:title:groupNameEn')"
|
||||
prop="GroupEnName"
|
||||
>
|
||||
<el-input v-model="form.GroupEnName" />
|
||||
</el-form-item>
|
||||
<!-- 问题名称 -->
|
||||
<el-form-item v-if="form.Type !== 'group'" :label="$t('trials:readingUnit:qsList:title:qsName')"
|
||||
prop="QuestionName" :rules="[
|
||||
<el-form-item
|
||||
v-if="form.Type !== 'group'"
|
||||
:label="$t('trials:readingUnit:qsList:title:qsName')"
|
||||
prop="QuestionName"
|
||||
:rules="[
|
||||
{ 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}` }
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-input v-model="form.QuestionName" />
|
||||
</el-form-item>
|
||||
<!-- 问题名称(EN) -->
|
||||
<el-form-item v-if="form.Type !== 'group'" :label="$t('dictionary:template:criterionConfig:title:qsNameEn')"
|
||||
prop="QuestionEnName" :rules="[
|
||||
<el-form-item
|
||||
v-if="form.Type !== 'group'"
|
||||
:label="$t('dictionary:template:criterionConfig:title:qsNameEn')"
|
||||
prop="QuestionEnName"
|
||||
:rules="[
|
||||
{ max: form.Type === 'summary' ? 300 : 100, message: `${this.$t('common:ruleMessage:maxLength')} ${form.Type === 'summary' ? 300 : 100}` }
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-input v-model="form.QuestionEnName" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
<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:qsGroupName')" :rules="[
|
||||
<el-form-item
|
||||
v-if="form.Type !== 'group'"
|
||||
:label="$t('trials:readingUnit:qsList:title:qsGroupName')"
|
||||
:rules="[
|
||||
{ required: form.ShowQuestion === 1 ? false : true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
|
||||
]">
|
||||
<el-select v-model="form.GroupId" clearable :disabled="isParentExistGroup">
|
||||
<el-option v-for="group of groupOptions" :key="group.GroupId" :label="group.GroupName"
|
||||
:value="group.GroupId" />
|
||||
]"
|
||||
>
|
||||
<el-select
|
||||
v-model="form.GroupId"
|
||||
clearable
|
||||
:disabled="isParentExistGroup"
|
||||
>
|
||||
<el-option
|
||||
v-for="group of groupOptions"
|
||||
:key="group.GroupId"
|
||||
:label="group.GroupName"
|
||||
:value="group.GroupId"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 是否显示 -->
|
||||
<el-form-item v-if="form.Type !== 'group'" :label="$t('trials:readingUnit:qsList:title:isShow')"
|
||||
prop="ShowQuestion">
|
||||
<el-radio-group v-model="form.ShowQuestion" @change="
|
||||
<el-form-item
|
||||
v-if="form.Type !== 'group'"
|
||||
:label="$t('trials:readingUnit:qsList:title:isShow')"
|
||||
prop="ShowQuestion"
|
||||
>
|
||||
<el-radio-group
|
||||
v-model="form.ShowQuestion"
|
||||
@change="
|
||||
(val) => {
|
||||
isShowQuestionChange(val, form)
|
||||
}
|
||||
">
|
||||
<el-radio v-for="item of $d.ShowQuestion" :key="`ShowQuestion${item.value}`" :label="item.value">
|
||||
"
|
||||
>
|
||||
<el-radio
|
||||
v-for="item of $d.ShowQuestion"
|
||||
:key="`ShowQuestion${item.value}`"
|
||||
:label="item.value"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 显示时依赖父问题 -->
|
||||
<el-form-item v-if="form.Type !== 'group' && form.ShowQuestion === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:parentId')" prop="ParentId">
|
||||
<el-select v-model="form.ParentId" clearable @change="
|
||||
<el-form-item
|
||||
v-if="form.Type !== 'group' && form.ShowQuestion === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:parentId')"
|
||||
prop="ParentId"
|
||||
>
|
||||
<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-option
|
||||
v-for="item of parentOptions"
|
||||
:key="`ParentId${item.QuestionId}`"
|
||||
:label="item.QuestionName"
|
||||
:value="item.QuestionId"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 显示时依赖父问题触发值 -->
|
||||
<el-form-item v-if="form.ParentId && form.ShowQuestion === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:parentTriggerValueList')" prop="ParentTriggerValueList">
|
||||
<el-form-item
|
||||
v-if="form.ParentId && form.ShowQuestion === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:parentTriggerValueList')"
|
||||
prop="ParentTriggerValueList"
|
||||
>
|
||||
<el-select v-model="form.ParentTriggerValueList" clearable multiple>
|
||||
<el-option v-for="item of parentTriggerValOptions" :key="item.value" :label="item.label"
|
||||
:value="item.value + ''" />
|
||||
<el-option
|
||||
v-for="item of parentTriggerValOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value + ''"
|
||||
/>
|
||||
</el-select>
|
||||
</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">
|
||||
<el-radio-group v-model="form.IsRequired" :disabled="form.IsJudgeQuestion === true || form.ShowQuestion === 2"
|
||||
:label="$t('trials:readingUnit:qsList:title:isRequired')" prop="IsRequired"
|
||||
>
|
||||
<el-radio-group
|
||||
v-model="form.IsRequired"
|
||||
:disabled="form.IsJudgeQuestion === true || form.ShowQuestion === 2"
|
||||
@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 }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 必填依赖父问题 -->
|
||||
<el-form-item v-if="form.Type !== 'group' && form.IsRequired === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:relevanceId')" prop="RelevanceId">
|
||||
<el-select v-model="form.RelevanceId" clearable @change="
|
||||
<el-form-item
|
||||
v-if="form.Type !== 'group' && form.IsRequired === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:relevanceId')"
|
||||
prop="RelevanceId"
|
||||
>
|
||||
<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-option
|
||||
v-for="item of parentOptions"
|
||||
:key="`RelevanceId${item.QuestionId}`"
|
||||
:label="item.QuestionName"
|
||||
:value="item.QuestionId"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 必填触发值 -->
|
||||
<el-form-item v-if="form.RelevanceId && form.IsRequired === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:relevanceValueList')" prop="RelevanceValueList">
|
||||
<el-form-item
|
||||
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-option v-for="item of reParentTriggerValOptions" :key="item.id" :label="item.label"
|
||||
:value="item.value + ''" />
|
||||
<el-option
|
||||
v-for="item of reParentTriggerValOptions"
|
||||
:key="item.id"
|
||||
:label="item.label"
|
||||
:value="item.value + ''"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 是否裁判问题 -->
|
||||
<el-form-item v-if="
|
||||
<el-form-item
|
||||
v-if="
|
||||
form.Type === 'select' ||
|
||||
form.Type === 'radio' ||
|
||||
form.Type === 'calculation' ||
|
||||
form.Type === 'number'
|
||||
" :label="$t('trials:readingUnit:qsList:title:isJudgeQuestion')" prop="IsJudgeQuestion" :rules="[
|
||||
"
|
||||
:label="$t('trials:readingUnit:qsList:title:isJudgeQuestion')"
|
||||
prop="IsJudgeQuestion"
|
||||
:rules="[
|
||||
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
|
||||
]">
|
||||
<el-radio-group v-model="form.IsJudgeQuestion" @change="
|
||||
]"
|
||||
>
|
||||
<el-radio-group
|
||||
v-model="form.IsJudgeQuestion"
|
||||
@change="
|
||||
(val) => {
|
||||
isJudgeQuestionChange(val, form)
|
||||
}
|
||||
">
|
||||
<el-radio v-for="item of $d.YesOrNo" :key="`YesOrNo${item.value}`" :label="item.value">{{ item.label
|
||||
}}</el-radio>
|
||||
"
|
||||
>
|
||||
<el-radio
|
||||
v-for="item of $d.YesOrNo"
|
||||
:key="`YesOrNo${item.value}`"
|
||||
:label="item.value"
|
||||
>{{ item.label }}</el-radio
|
||||
>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="导出标识"
|
||||
|
|
@ -161,274 +269,471 @@
|
|||
</el-radio-group>
|
||||
</el-form-item> -->
|
||||
<!-- 导出结果 -->
|
||||
<el-form-item :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-form-item
|
||||
: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-option v-for="item in CriterionDictionaryList.ExportResult" :key="item.Id" :value="parseInt(item.Code)"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value">
|
||||
<el-option
|
||||
v-for="item in CriterionDictionaryList.ExportResult"
|
||||
:key="item.Id"
|
||||
:value="parseInt(item.Code)"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 限制编辑 -->
|
||||
<el-form-item :label="$t('trials:readingUnit:qsList:title:limitEdit')"
|
||||
<el-form-item
|
||||
:label="$t('trials:readingUnit:qsList:title:limitEdit')"
|
||||
v-if="form.Type === 'radio' || form.Type === 'select' || form.Type === 'input' || form.Type === 'textarea' || form.Type === 'upload' || form.Type === 'number' || form.Type === 'screenshot'"
|
||||
prop="LimitEdit" :rules="[
|
||||
prop="LimitEdit"
|
||||
:rules="[
|
||||
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-radio-group v-model="form.LimitEdit">
|
||||
<el-radio v-for="item of $d.LimitEdit" :key="`LimitEdit${item.value}`" :label="item.value">{{ item.label
|
||||
}}</el-radio>
|
||||
<el-radio
|
||||
v-for="item of $d.LimitEdit"
|
||||
:key="`LimitEdit${item.value}`"
|
||||
:label="item.value"
|
||||
>{{ item.label }}</el-radio
|
||||
>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<!-- 全局阅片是否显示 -->
|
||||
<el-form-item :label="$t('trials:readingUnit:qsList:title:globalReadingShowType')" prop="GlobalReadingShowType"
|
||||
<el-form-item
|
||||
:label="$t('trials:readingUnit:qsList:title:globalReadingShowType')"
|
||||
prop="GlobalReadingShowType"
|
||||
:rules="[
|
||||
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-radio-group v-model="form.GlobalReadingShowType">
|
||||
<el-radio v-for="item of $d.GlobalReadingShowType" :key="item.id" :label="item.value">{{ item.label
|
||||
}}</el-radio>
|
||||
<el-radio
|
||||
v-for="item of $d.GlobalReadingShowType"
|
||||
:key="item.id"
|
||||
:label="item.value"
|
||||
>{{ item.label }}</el-radio
|
||||
>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<!-- 问题标识 -->
|
||||
<el-form-item :label="$t('dictionary:template:criterionConfig:table:questionType')"
|
||||
v-if="form.Type !== 'group' && form.Type !== 'summary'" prop="QuestionType">
|
||||
<el-form-item
|
||||
:label="$t('dictionary:template:criterionConfig:table:questionType')"
|
||||
v-if="form.Type !== 'group' && form.Type !== 'summary'"
|
||||
prop="QuestionType"
|
||||
>
|
||||
<el-select v-model="form.QuestionType" clearable>
|
||||
<el-option v-for="item of CriterionDictionaryList.QuestionType" :key="item.Id" :value="parseInt(item.Code)"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" />
|
||||
<el-option
|
||||
v-for="item of CriterionDictionaryList.QuestionType"
|
||||
:key="item.Id"
|
||||
:value="parseInt(item.Code)"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 是否在阅片页面显示 -->
|
||||
<el-form-item :label="$t('trials:readingUnit:qsList:title:isShowInDicom')" prop="IsShowInDicom" :rules="[
|
||||
<el-form-item
|
||||
:label="$t('trials:readingUnit:qsList:title:isShowInDicom')"
|
||||
prop="IsShowInDicom"
|
||||
:rules="[
|
||||
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-radio-group v-model="form.IsShowInDicom">
|
||||
<el-radio v-for="item of $d.YesOrNo" :key="`YesOrNo${item.value}`" :label="item.value">{{ item.label
|
||||
}}</el-radio>
|
||||
<el-radio
|
||||
v-for="item of $d.YesOrNo"
|
||||
:key="`YesOrNo${item.value}`"
|
||||
:label="item.value"
|
||||
>{{ item.label }}</el-radio
|
||||
>
|
||||
</el-radio-group>
|
||||
</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-form-item>
|
||||
<!-- 序号 -->
|
||||
<el-form-item :label="$t('trials:readingUnit:qsList:title:order')" prop="ShowOrder" :rules="[
|
||||
<el-form-item
|
||||
:label="$t('trials:readingUnit:qsList:title:order')"
|
||||
prop="ShowOrder"
|
||||
:rules="[
|
||||
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
|
||||
]">
|
||||
<el-input-number v-model="form.ShowOrder" controls-position="right" :min="0" />
|
||||
]"
|
||||
>
|
||||
<el-input-number
|
||||
v-model="form.ShowOrder"
|
||||
controls-position="right"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- 适用于Lugano 2014标准 -->
|
||||
<!-- 问题分类 -->
|
||||
<el-form-item :label="$t('dictionary:template:criterionConfig:table:questionClassify')"
|
||||
v-if="form.Type !== 'group' && criterionType === 2">
|
||||
<el-form-item :label="$t('dictionary:template:criterionConfig:table:questionClassify')" v-if="form.Type !== 'group' && criterionType === 2">
|
||||
<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-form-item>
|
||||
<!-- 适用于iRECST标准 -->
|
||||
<!-- 转化显示类型 -->
|
||||
<el-form-item :label="$t('dictionary:template:criterionConfig:table:convertType')" prop="ConvertShowType"
|
||||
v-if="criterionType === 3">
|
||||
<el-form-item :label="$t('dictionary:template:criterionConfig:table:convertType')" prop="ConvertShowType" v-if="criterionType === 3">
|
||||
<el-radio-group v-model="form.ConvertShowType">
|
||||
<el-radio v-for="item of $d.ConvertShowType" :key="item.id" :label="item.value">
|
||||
<el-radio
|
||||
v-for="item of $d.ConvertShowType"
|
||||
:key="item.id"
|
||||
:label="item.value"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</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="
|
||||
<el-form-item
|
||||
v-if="
|
||||
form.Type === 'select' ||
|
||||
form.Type === 'radio' ||
|
||||
form.Type === 'calculation'
|
||||
" :label="$t('trials:readingUnit:label:QuestionGenre')" prop="QuestionGenre"
|
||||
:rules="[{ required: form.Type !== 'calculation', message: this.$t('common:ruleMessage:select') }]">
|
||||
<el-radio-group v-model="form.QuestionGenre" @change="
|
||||
"
|
||||
:label="$t('trials:readingUnit:label:QuestionGenre')"
|
||||
prop="QuestionGenre"
|
||||
:rules="[{ required: form.Type !== 'calculation', message: this.$t('common:ruleMessage:select') }]"
|
||||
>
|
||||
<el-radio-group
|
||||
v-model="form.QuestionGenre"
|
||||
@change="
|
||||
(val) => {
|
||||
questionGenreChange(val, form)
|
||||
}
|
||||
">
|
||||
"
|
||||
>
|
||||
<el-radio :label="-1"> {{ this.$t('common:title:none') }} </el-radio>
|
||||
<el-radio v-for="item of $d.TableQuestionType" v-show="item.value === 0 || item.value === 3" :key="item.id"
|
||||
:label="item.value">
|
||||
<el-radio
|
||||
v-for="item of $d.TableQuestionType"
|
||||
v-show="item.value === 0 || item.value === 3"
|
||||
:key="item.id"
|
||||
:label="item.value"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<!-- 选项 -->
|
||||
<el-form-item v-if="form.QuestionGenre === 0 || form.Type === 'class'"
|
||||
:label="$t('trials:qcCfg:table:typeValue')" prop="TypeValue">
|
||||
<el-input v-model="form.TypeValue" :placeholder="$t('trials:qcCfg:message:typeValue')"
|
||||
@change="typeValueChange" />
|
||||
<el-form-item
|
||||
v-if="form.QuestionGenre === 0 || form.Type === 'class'"
|
||||
:label="$t('trials:qcCfg:table:typeValue')"
|
||||
prop="TypeValue"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.TypeValue"
|
||||
:placeholder="$t('trials:qcCfg:message:typeValue')"
|
||||
@change="typeValueChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 关联字典 -->
|
||||
<el-form-item v-if="form.QuestionGenre === 3" :label="$t('trials:readingUnit:label:DictionaryCode')"
|
||||
prop="DictionaryCode">
|
||||
<el-select v-model="form.DictionaryCode" clearable @change="
|
||||
<el-form-item
|
||||
v-if="form.QuestionGenre === 3"
|
||||
:label="$t('trials:readingUnit:label:DictionaryCode')"
|
||||
prop="DictionaryCode"
|
||||
>
|
||||
<el-select
|
||||
v-model="form.DictionaryCode"
|
||||
clearable
|
||||
@change="
|
||||
() => {
|
||||
form.DefaultValue = null
|
||||
}
|
||||
">
|
||||
<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-form-item>
|
||||
<!-- 默认值 -->
|
||||
<el-form-item v-if="form.QuestionGenre === 3" :label="$t('trials:readingUnit:qsList:title:defaultValue')">
|
||||
<el-select v-model="form.DefaultValue" clearable>
|
||||
<el-option v-for="item of highlightAnswers" :key="item.Id"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" :value="item.Code" />
|
||||
<el-option
|
||||
v-for="item of highlightAnswers"
|
||||
:key="item.Id"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
|
||||
:value="item.Code"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 默认值 -->
|
||||
<el-form-item v-if="form.QuestionGenre === 0" :label="$t('trials:readingUnit:qsList:title:defaultValue')">
|
||||
<el-select v-model="form.DefaultValue" clearable>
|
||||
<el-option v-for="item of form.TypeValue ? form.TypeValue.split('|') : []" :key="item" :label="item"
|
||||
:value="item" />
|
||||
<el-option
|
||||
v-for="item of form.TypeValue ? form.TypeValue.split('|') : []"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:value="item"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 高亮标记值 -->
|
||||
<el-form-item v-if="form.Type === 'select' || form.Type === 'radio' || form.Type === 'calculation'"
|
||||
:label="$t('trials:readingUnit:qsList:title:highlightAnswers')" prop="HighlightAnswerList">
|
||||
<el-form-item
|
||||
v-if="form.Type === 'select' || form.Type === 'radio'"
|
||||
:label="$t('trials:readingUnit:qsList:title:highlightAnswers')"
|
||||
prop="HighlightAnswerList"
|
||||
>
|
||||
<el-select v-model="form.HighlightAnswerList" clearable multiple>
|
||||
<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 v-else-if="form.DictionaryCode">
|
||||
<el-option v-for="item of highlightAnswers" :key="item.Id"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" :value="item.Code" />
|
||||
<el-option
|
||||
v-for="item of highlightAnswers"
|
||||
:key="item.Id"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
|
||||
:value="item.Code"
|
||||
/>
|
||||
</template>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 分组标识 -->
|
||||
<el-form-item :label="$t('dictionary:template:criterionConfig:table:groupClassify')"
|
||||
v-if="form.Type === 'group'" prop="GroupClassify">
|
||||
<el-form-item
|
||||
:label="$t('dictionary:template:criterionConfig:table:groupClassify')"
|
||||
v-if="form.Type === 'group'"
|
||||
prop="GroupClassify"
|
||||
>
|
||||
<el-select v-model="form.GroupClassify" clearable>
|
||||
<el-option v-for="item of groupClassifyList" :key="item.Id" :value="parseInt(item.Code)"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" />
|
||||
<el-option
|
||||
v-for="item of groupClassifyList"
|
||||
:key="item.Id"
|
||||
:value="parseInt(item.Code)"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 最大长度 -->
|
||||
<el-form-item v-if="form.Type === 'input' || form.Type === 'textarea'"
|
||||
:label="$t('trials:readingUnit:qsList:title:MaxAnswerLength')" prop="MaxAnswerLength" :rules="[
|
||||
<el-form-item
|
||||
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' }
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-input-number v-model="form.MaxAnswerLength" :min="0"></el-input-number>
|
||||
</el-form-item>
|
||||
<!-- 最大行数 -->
|
||||
<el-form-item v-if="form.Type === 'table' || form.Type === 'basicTable'"
|
||||
:label="$t('trials:readingUnit:qsList:title:maxQuestionCount')" prop="MaxQuestionCount" :rules="[
|
||||
<el-form-item
|
||||
v-if="form.Type === 'table' || form.Type === 'basicTable'"
|
||||
:label="$t('trials:readingUnit:qsList:title:maxQuestionCount')"
|
||||
prop="MaxQuestionCount"
|
||||
:rules="[
|
||||
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }
|
||||
]">
|
||||
<el-input-number v-model="form.MaxQuestionCount" controls-position="right" :min="0" :max="10" />
|
||||
]"
|
||||
>
|
||||
<el-input-number
|
||||
v-model="form.MaxQuestionCount"
|
||||
controls-position="right"
|
||||
:min="0"
|
||||
:max="10"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.Type === 'table' || form.Type === 'basicTable'"
|
||||
:label="$t('trials:readingUnit:qsList:title:orderMark')">
|
||||
<el-form-item v-if="form.Type === 'table' || form.Type === 'basicTable'" :label="$t('trials:readingUnit:qsList:title:orderMark')">
|
||||
<el-input v-model="form.OrderMark" />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 数值类型 -->
|
||||
<el-form-item 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') }]">
|
||||
<el-form-item
|
||||
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') }]"
|
||||
>
|
||||
<el-radio-group v-model="form.ValueType">
|
||||
<el-radio v-for="item of $d.ValueType" :key="item.id" :label="item.value">
|
||||
<el-radio
|
||||
v-for="item of $d.ValueType"
|
||||
:key="item.id"
|
||||
:label="item.value"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 单位 -->
|
||||
<el-form-item v-if="form.Type === 'number' || form.Type === 'calculation'"
|
||||
:label="$t('trials:readingUnit:qsList:title:unit')" prop="Unit" :rules="[
|
||||
<el-form-item
|
||||
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' }
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-radio-group v-model="form.Unit">
|
||||
<el-radio v-for="item of $d.ValueUnit" :key="item.id" :label="item.value">
|
||||
<el-radio
|
||||
v-for="item of $d.ValueUnit"
|
||||
:key="item.id"
|
||||
:label="item.value"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</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 === 'table'" :label="$t('dictionary:template:criterionConfig:table:tableType')"
|
||||
prop="LesionType">
|
||||
<el-form-item
|
||||
v-if="form.Type === 'table'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:tableType')"
|
||||
prop="LesionType"
|
||||
>
|
||||
<el-select v-model="form.LesionType" clearable>
|
||||
<el-option v-for="item of lesionTypes" :key="item.Code" :value="parseInt(item.Code)"
|
||||
:label="$fd('LesionType', parseInt(item.Code))" />
|
||||
<el-option
|
||||
v-for="item of lesionTypes"
|
||||
:key="item.Code"
|
||||
:value="parseInt(item.Code)"
|
||||
:label="$fd('LesionType', parseInt(item.Code))"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 表格类型标识 -->
|
||||
<el-form-item v-if="form.Type === 'basicTable'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:tableType')" prop="LesionType">
|
||||
<el-form-item
|
||||
v-if="form.Type === 'basicTable'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:tableType')"
|
||||
prop="LesionType"
|
||||
>
|
||||
<el-select v-model="form.LesionType" clearable>
|
||||
<el-option v-for="item of lesionTypeList" :key="item.Id" :value="parseInt(item.Code)"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" />
|
||||
<el-option
|
||||
v-for="item of lesionTypeList"
|
||||
:key="item.Id"
|
||||
:value="parseInt(item.Code)"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 关联字典 -->
|
||||
<el-form-item v-if="form.Type === 'table' || form.Type === 'basicTable'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:relatedDictionaryCode')">
|
||||
<el-select v-model="form.DictionaryCode" clearable @change="
|
||||
<el-form-item
|
||||
v-if="form.Type === 'table' || form.Type === 'basicTable'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:relatedDictionaryCode')"
|
||||
>
|
||||
<el-select
|
||||
v-model="form.DictionaryCode"
|
||||
clearable
|
||||
@change="
|
||||
() => {
|
||||
form.DefaultValue = null
|
||||
}
|
||||
">
|
||||
<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-form-item>
|
||||
<!-- 最大上传个数 -->
|
||||
<el-form-item v-if="form.Type === 'upload'" :label="$t('trials:readingUnit:qsList:title:imageCount')">
|
||||
<el-input-number v-model="form.ImageCount" controls-position="right" :min="0" :max="10" />
|
||||
<el-form-item
|
||||
v-if="form.Type === 'upload'"
|
||||
:label="$t('trials:readingUnit:qsList:title:imageCount')"
|
||||
>
|
||||
<el-input-number
|
||||
v-model="form.ImageCount"
|
||||
controls-position="right"
|
||||
:min="0"
|
||||
:max="10"
|
||||
/>
|
||||
</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"
|
||||
:rules="[{ type: 'array', required: true, message: this.$t('common:ruleMessage:specify'), trigger: ['change'] }]">
|
||||
<el-checkbox-group v-model="form.FileType" @change="(v) => {
|
||||
: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')) {
|
||||
form.FileType = ['-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'">
|
||||
}"
|
||||
>
|
||||
<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 }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
<!-- 分类数据来源 -->
|
||||
<el-form-item v-if="form.Type === 'class'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:classifyQuestion')" prop="ClassifyQuestionId">
|
||||
<el-form-item
|
||||
v-if="form.Type === 'class'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:classifyQuestion')"
|
||||
prop="ClassifyQuestionId"
|
||||
>
|
||||
<el-select v-model="form.ClassifyQuestionId" 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-form-item>
|
||||
<!-- 分类算法 -->
|
||||
<el-form-item v-if="form.Type === 'class'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:classifyAlgorithms')" prop="ClassifyAlgorithms">
|
||||
<el-form-item
|
||||
v-if="form.Type === 'class'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:classifyAlgorithms')"
|
||||
prop="ClassifyAlgorithms"
|
||||
>
|
||||
<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">
|
||||
{{ scope.row.label }}
|
||||
</template>
|
||||
</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">
|
||||
<el-input-number v-model="scope.row.gt"></el-input-number>
|
||||
</template>
|
||||
</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">
|
||||
<el-input-number v-model="scope.row.lt"></el-input-number>
|
||||
</template>
|
||||
|
|
@ -442,11 +747,21 @@
|
|||
<div class="base-dialog-footer" style="text-align: right; margin-top: 10px">
|
||||
<el-form-item>
|
||||
<!-- 取消 -->
|
||||
<el-button :disabled="btnLoading" size="small" type="primary" @click="close">
|
||||
<el-button
|
||||
:disabled="btnLoading"
|
||||
size="small"
|
||||
type="primary"
|
||||
@click="close"
|
||||
>
|
||||
{{ $t('common:button:cancel') }}
|
||||
</el-button>
|
||||
<!-- 保存 -->
|
||||
<el-button size="small" type="primary" :loading="btnLoading" @click="save">
|
||||
<el-button
|
||||
size="small"
|
||||
type="primary"
|
||||
:loading="btnLoading"
|
||||
@click="save"
|
||||
>
|
||||
{{ $t('common:button:save') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
|
|
@ -548,7 +863,6 @@ export default {
|
|||
FileType: [],
|
||||
ClassifyQuestionId: null,
|
||||
ClassifyAlgorithms: null,
|
||||
ShowChartTypeEnum: 0
|
||||
},
|
||||
rules: {
|
||||
Type: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }],
|
||||
|
|
@ -696,7 +1010,7 @@ export default {
|
|||
if (this.data.hasOwnProperty(k)) {
|
||||
if (k === 'ClassifyAlgorithms' && this.data[k] !== undefined && 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(',')
|
||||
} else {
|
||||
this.form[k] = this.data[k]
|
||||
|
|
@ -719,10 +1033,10 @@ export default {
|
|||
// this.parentTriggerValOptions =
|
||||
// this.$d[this.parentOptions[index].DictionaryCode]
|
||||
let dicCode = this.parentOptions[index].DictionaryCode
|
||||
let res = await getCriterionDictionary({ ReadingCriterionId: this.data.ReadingQuestionCriterionSystemId, DictionaryCode: dicCode })
|
||||
let res = await getCriterionDictionary({ReadingCriterionId: this.data.ReadingQuestionCriterionSystemId,DictionaryCode: dicCode})
|
||||
|
||||
this.parentTriggerValOptions = res.Result[dicCode].map(i => {
|
||||
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code }
|
||||
this.parentTriggerValOptions = res.Result[dicCode].map(i=>{
|
||||
return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
|
||||
})
|
||||
|
||||
} else {
|
||||
|
|
@ -745,9 +1059,9 @@ export default {
|
|||
// this.reParentTriggerValOptions =
|
||||
// this.$d[this.parentOptions[index].DictionaryCode]
|
||||
let dicCode = this.parentOptions[index].DictionaryCode
|
||||
let res = await getCriterionDictionary({ ReadingCriterionId: this.data.ReadingQuestionCriterionSystemId, DictionaryCode: dicCode })
|
||||
this.reParentTriggerValOptions = res.Result[dicCode].map(i => {
|
||||
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code }
|
||||
let res = await getCriterionDictionary({ReadingCriterionId: this.data.ReadingQuestionCriterionSystemId,DictionaryCode: dicCode})
|
||||
this.reParentTriggerValOptions = res.Result[dicCode].map(i=>{
|
||||
return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
|
||||
})
|
||||
} else {
|
||||
const options = []
|
||||
|
|
@ -875,7 +1189,6 @@ export default {
|
|||
data.HighlightAnswerList = []
|
||||
// data.ExportIdentification = 0
|
||||
data.ExportResult = []
|
||||
data.ShowChartTypeEnum = 0
|
||||
data.FileType = []
|
||||
data.ClassifyQuestionId = null
|
||||
data.ClassifyAlgorithms = null
|
||||
|
|
@ -950,10 +1263,10 @@ export default {
|
|||
// this.reParentTriggerValOptions =
|
||||
// this.$d[this.parentOptions[index].DictionaryCode]
|
||||
let dicCode = this.parentOptions[index].DictionaryCode
|
||||
let res = await getCriterionDictionary({ ReadingCriterionId: this.data.ReadingQuestionCriterionSystemId, DictionaryCode: dicCode })
|
||||
let res = await getCriterionDictionary({ReadingCriterionId: this.data.ReadingQuestionCriterionSystemId,DictionaryCode: dicCode})
|
||||
|
||||
this.reParentTriggerValOptions = res.Result[dicCode].map(i => {
|
||||
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code }
|
||||
this.reParentTriggerValOptions = res.Result[dicCode].map(i=>{
|
||||
return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
|
||||
})
|
||||
} else {
|
||||
var options = []
|
||||
|
|
@ -997,4 +1310,5 @@ export default {
|
|||
},
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped></style>
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -3,22 +3,27 @@
|
|||
<!-- 器官 -->
|
||||
<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 :label="$t('dictionary:template:basicData:efficacyAssessment')" name="efficacyAssessment">
|
||||
<EfficacyAssessment v-if="tabs.includes('efficacyAssessment')" :criterion-id="criterionId"
|
||||
:criterion-type="criterionType" :is-complete-config="isCompleteConfig" />
|
||||
<EfficacyAssessment
|
||||
v-if="tabs.includes('efficacyAssessment')"
|
||||
:criterion-id="criterionId"
|
||||
:criterion-type="criterionType"
|
||||
:is-complete-config="isCompleteConfig"
|
||||
/>
|
||||
</el-tab-pane>
|
||||
<!-- 标准字典 -->
|
||||
<el-tab-pane :label="$t('dictionary:template:basicData:criterionDictionary')" name="criterionDictionary">
|
||||
<CriterionDictionary v-if="tabs.includes('criterionDictionary')" :criterion-id="criterionId"
|
||||
:is-complete-config="isCompleteConfig" />
|
||||
</el-tab-pane>
|
||||
<!-- 关键文件 -->
|
||||
<el-tab-pane :label="$t('dictionary:template:basicData:keyDocument')" name="keyDocument">
|
||||
<KeyDocument v-if="tabs.includes('keyDocument')" :criterion-id="criterionId"
|
||||
:is-complete-config="isCompleteConfig" />
|
||||
<CriterionDictionary
|
||||
v-if="tabs.includes('criterionDictionary')"
|
||||
:criterion-id="criterionId"
|
||||
:is-complete-config="isCompleteConfig"
|
||||
/>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</template>
|
||||
|
|
@ -26,10 +31,9 @@
|
|||
import OrgansTbl from './OrgansTbl'
|
||||
import EfficacyAssessment from './EfficacyAssessment'
|
||||
import CriterionDictionary from './CriterionDictionary'
|
||||
import KeyDocument from './KeyDocument'
|
||||
export default {
|
||||
name: 'CriterionsBaseData',
|
||||
components: { OrgansTbl, EfficacyAssessment, CriterionDictionary, KeyDocument },
|
||||
components: { OrgansTbl, EfficacyAssessment, CriterionDictionary },
|
||||
props: {
|
||||
criterionId: {
|
||||
type: String,
|
||||
|
|
|
|||
|
|
@ -8,8 +8,13 @@
|
|||
{{ $fd('YesOrNo', IsMustGlobalReading) }}
|
||||
</el-form-item>
|
||||
<!-- 配置 -->
|
||||
<el-button 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)">
|
||||
<el-button
|
||||
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') }}
|
||||
</el-button>
|
||||
</el-form>
|
||||
|
|
@ -17,29 +22,54 @@
|
|||
<!-- 名称 -->
|
||||
<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"
|
||||
v-if="Object.keys(data).length > 0 && !(data.IsCompleteConfig || data.IsBeUsed)" @click="handleAdd(2)">
|
||||
<el-button
|
||||
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') }}
|
||||
</el-button>
|
||||
<!-- 评估更新类型 -->
|
||||
<el-form-item :label="$t('dictionary:template:globalConfig:updateType')" style="width: 100%">
|
||||
</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">
|
||||
{{ scope.$index + 1 }}
|
||||
{{scope.$index + 1}}
|
||||
</template>
|
||||
</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 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 prop="IsBaseLineUse" :label="$t('dictionary:template:globalConfig:isBaseLineUse')"
|
||||
show-overflow-tooltip>
|
||||
<el-table-column
|
||||
prop="IsBaseLineUse"
|
||||
:label="$t('dictionary:template:globalConfig:isBaseLineUse')"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<!-- <el-switch-->
|
||||
<!-- @change="(v) => {BaseLineUseChange(v, scope.row)}"-->
|
||||
|
|
@ -51,64 +81,92 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<!-- 是否随访评估 -->
|
||||
<el-table-column prop="IsFollowVisitUse" :label="$t('dictionary:template:globalConfig:isFollowVisitUse')"
|
||||
show-overflow-tooltip>
|
||||
<el-table-column
|
||||
prop="IsFollowVisitUse"
|
||||
:label="$t('dictionary:template:globalConfig:isFollowVisitUse')"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<!-- <el-switch-->
|
||||
<!-- @change="(v) => {FollowVisitUseChange(v, scope.row)}"-->
|
||||
<!-- v-model="scope.row.IsFollowVisitUse"-->
|
||||
<!-- >-->
|
||||
<!-- </el-switch>-->
|
||||
<el-tag v-if="scope.row.IsFollowVisitUse" type="primary">{{ $fd('YesOrNo', scope.row.IsFollowVisitUse)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.IsFollowVisitUse" type="primary">{{ $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>-->
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-form>
|
||||
<base-model :config="config">
|
||||
<base-model
|
||||
:config="config"
|
||||
>
|
||||
<template slot="dialog-body">
|
||||
<el-form size="small" :inline="true" label-width="130px">
|
||||
<!-- 是否必须全局阅片 -->
|
||||
<el-form-item :label="$t('dictionary:template:globalConfig:isMustGlobalReading')"
|
||||
v-if="config.configType === 1">
|
||||
<el-form-item :label="$t('dictionary:template:globalConfig:isMustGlobalReading')" v-if="config.configType === 1">
|
||||
<el-radio-group v-model="form.IsMustGlobalReading">
|
||||
<el-radio v-for="item of $d.YesOrNo" :key="'form.IsMustGlobalReading' + item.value" :label="item.value">{{
|
||||
item.label }}</el-radio>
|
||||
<el-radio v-for="item of $d.YesOrNo" :key="'form.IsMustGlobalReading' + item.value" :label="item.value">{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<!-- 评估更新类型 @selection-change="handleSelectionChange"-->
|
||||
<el-form-item v-if="config.configType === 2" :label="$t('dictionary:template:globalConfig:updateType')"
|
||||
style="width: 100%">
|
||||
<!-- 评估更新类型 -->
|
||||
<el-form-item v-if="config.configType === 2" :label="$t('dictionary:template:globalConfig:updateType')" style="width: 100%">
|
||||
</el-form-item>
|
||||
<el-table v-if="config.configType === 2" v-loading="loading" ref="multipleTable" :data="GlobalAssessType"
|
||||
stripe>
|
||||
<!-- <el-table-column type="selection" width="55">
|
||||
</el-table-column> -->
|
||||
<el-table
|
||||
v-if="config.configType === 2"
|
||||
v-loading="loading"
|
||||
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')"
|
||||
show-overflow-tooltip>
|
||||
<el-table-column
|
||||
prop="ValueCN"
|
||||
:label="$t('dictionary:template:globalConfig:valueCN')"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
</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 prop="IsBaseLineUse" :label="$t('dictionary:template:globalConfig:isBaseLineUse')"
|
||||
show-overflow-tooltip>
|
||||
<el-table-column
|
||||
prop="IsBaseLineUse"
|
||||
:label="$t('dictionary:template:globalConfig:isBaseLineUse')"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<el-switch v-model="scope.row.IsBaseLineUse" @change="() => $forceUpdate()">
|
||||
<el-switch
|
||||
v-model="scope.row.IsBaseLineUse"
|
||||
@change="() => $forceUpdate()"
|
||||
>
|
||||
</el-switch>
|
||||
<span>{{ $fd('YesOrNo', scope.row.IsBaseLineUse) }}</span>
|
||||
<span>{{$fd('YesOrNo', scope.row.IsBaseLineUse)}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 是否随访评估 -->
|
||||
<el-table-column prop="IsFollowVisitUse" :label="$t('dictionary:template:globalConfig:isFollowVisitUse')"
|
||||
show-overflow-tooltip>
|
||||
<el-table-column
|
||||
prop="IsFollowVisitUse"
|
||||
:label="$t('dictionary:template:globalConfig:isFollowVisitUse')"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<el-switch v-model="scope.row.IsFollowVisitUse" @change="() => $forceUpdate()">
|
||||
<el-switch
|
||||
v-model="scope.row.IsFollowVisitUse"
|
||||
@change="() => $forceUpdate()"
|
||||
>
|
||||
</el-switch>
|
||||
<span>{{ $fd('YesOrNo', scope.row.IsFollowVisitUse) }}</span>
|
||||
<span>{{$fd('YesOrNo', scope.row.IsFollowVisitUse)}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
|
@ -168,7 +226,7 @@ export default {
|
|||
mounted() {
|
||||
this.getList()
|
||||
this.getSystemGlobalInfo()
|
||||
// this.getCriterionDictionary()
|
||||
this.getCriterionDictionary()
|
||||
},
|
||||
methods: {
|
||||
getCriterionDictionary() {
|
||||
|
|
@ -183,12 +241,12 @@ export default {
|
|||
getSystemGlobalInfo({
|
||||
SystemCriterionId: this.criterionId
|
||||
}).then(res => {
|
||||
this.GlobalAssessType = res.Result.DictionaryList
|
||||
|
||||
})
|
||||
},
|
||||
FollowVisitUseChange(v, row) {
|
||||
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.loading = false
|
||||
}).catch(() => {
|
||||
|
|
@ -197,7 +255,7 @@ export default {
|
|||
},
|
||||
BaseLineUseChange(v, row) {
|
||||
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.loading = false
|
||||
}).catch(() => {
|
||||
|
|
@ -215,7 +273,6 @@ export default {
|
|||
}
|
||||
},
|
||||
handleSelectionChange(val) {
|
||||
console.log(this.selectedList, 'this.selectedList')
|
||||
this.selectedList = val
|
||||
},
|
||||
getList() {
|
||||
|
|
@ -238,6 +295,18 @@ export default {
|
|||
} else {
|
||||
this.config.title = this.$t('dictionary:template:globalConfig:updateType')
|
||||
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() {
|
||||
|
|
@ -250,11 +319,11 @@ export default {
|
|||
var params = {
|
||||
SystemCriterionId: this.criterionId,
|
||||
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 {
|
||||
DictionaryId: v.DictionaryId,
|
||||
IsBaseLineUse: v.IsBaseLineUse ? v.IsBaseLineUse : false,
|
||||
IsFollowVisitUse: v.IsFollowVisitUse ? v.IsFollowVisitUse : false,
|
||||
DictionaryId: v.id,
|
||||
IsBaseLineUse: v.IsBaseLineUse,
|
||||
IsFollowVisitUse: v.IsFollowVisitUse,
|
||||
}
|
||||
}),
|
||||
}
|
||||
|
|
@ -273,3 +342,5 @@ export default {
|
|||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -1,86 +1,155 @@
|
|||
<template>
|
||||
<el-form ref="tableQsForm" v-loading="loading" :model="form" size="small" :disabled="type === 'look'" :rules="rules"
|
||||
label-width="130px">
|
||||
<el-form
|
||||
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 style="height: 150px;">
|
||||
<!-- 类型 -->
|
||||
<el-form-item :label="$t('trials:readingUnit:qsList:title:type')" prop="Type">
|
||||
<el-select v-model="form.Type" @change="((val) => { qsTypeChange(val, form) })">
|
||||
<el-option v-for="item of $d.Criterion_Question_Type"
|
||||
<el-select
|
||||
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'"
|
||||
:key="item.value" :value="item.value" :label="item.label" />
|
||||
:key="item.value"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 问题名称 -->
|
||||
<el-form-item v-if="form.Type !== 'group'" :label="$t('trials:readingUnit:qsList:title:qsNameEn')"
|
||||
prop="QuestionName" :rules="[
|
||||
<el-form-item
|
||||
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' },
|
||||
{ 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>
|
||||
<!-- 问题名称(EN) -->
|
||||
<el-form-item v-if="form.Type !== 'group'" :label="$t('trials:readingUnit:qsList:title:qsNameEn')"
|
||||
prop="QuestionEnName" :rules="[
|
||||
<el-form-item
|
||||
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}` }
|
||||
]">
|
||||
<el-input v-model="form.QuestionEnName" />
|
||||
]"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.QuestionEnName"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<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')"
|
||||
prop="ShowQuestion">
|
||||
<el-radio-group v-model="form.ShowQuestion" @change="((val) => { isShowQuestionChange(val, form) })">
|
||||
<el-radio v-for="item of $d.ShowQuestion" :key="`ShowQuestion${item.value}`" :label="item.value">
|
||||
<el-form-item v-if="form.Type !== 'group'" :label="$t('trials:readingUnit:qsList:title:isShow')" prop="ShowQuestion">
|
||||
<el-radio-group
|
||||
v-model="form.ShowQuestion"
|
||||
@change="((val)=>{isShowQuestionChange(val, form)})"
|
||||
>
|
||||
<el-radio
|
||||
v-for="item of $d.ShowQuestion"
|
||||
:key="`ShowQuestion${item.value}`"
|
||||
:label="item.value"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 显示时依赖父问题 -->
|
||||
<el-form-item v-if="form.Type !== 'group' && form.ShowQuestion === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:parentId')" prop="ParentId">
|
||||
<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-form-item
|
||||
v-if="form.Type !== 'group' && form.ShowQuestion===1"
|
||||
:label="$t('trials:readingUnit:qsList:title:parentId')"
|
||||
prop="ParentId"
|
||||
>
|
||||
<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-form-item>
|
||||
<!-- 显示时依赖父问题触发值 -->
|
||||
<el-form-item v-if="form.ParentId && form.ShowQuestion === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:parentTriggerValueList')" prop="ParentTriggerValueList">
|
||||
<el-form-item v-if="form.ParentId && form.ShowQuestion===1" :label="$t('trials:readingUnit:qsList:title:parentTriggerValueList')" prop="ParentTriggerValueList">
|
||||
<el-select v-model="form.ParentTriggerValueList" clearable multiple>
|
||||
<el-option v-for="item of parentTriggerValOptions" :key="item.id" :label="item.label"
|
||||
:value="String(item.value)" />
|
||||
<el-option
|
||||
v-for="item of parentTriggerValOptions"
|
||||
:key="item.id"
|
||||
:label="item.label"
|
||||
:value="String(item.value)"
|
||||
/>
|
||||
</el-select>
|
||||
</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">
|
||||
<el-radio-group v-model="form.IsRequired" :disabled="form.IsJudgeQuestion === true || form.ShowQuestion === 2"
|
||||
@change="((val) => { isRequiredChange(val, form) })">
|
||||
<el-radio v-for="item of $d.QuestionRequired" :key="`QuestionRequired${item.value}`" :label="item.value">
|
||||
<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">
|
||||
<el-radio-group
|
||||
v-model="form.IsRequired"
|
||||
:disabled="form.IsJudgeQuestion===true || form.ShowQuestion===2"
|
||||
@change="((val)=>{isRequiredChange(val, form)})"
|
||||
>
|
||||
<el-radio
|
||||
v-for="item of $d.QuestionRequired"
|
||||
:key="`QuestionRequired${item.value}`"
|
||||
:label="item.value"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<!-- 必填依赖父问题 -->
|
||||
<el-form-item v-if="form.Type !== 'group' && form.IsRequired === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:relevanceId')" prop="RelevanceId">
|
||||
<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-form-item
|
||||
v-if="form.Type !== 'group' && form.IsRequired === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:relevanceId')"
|
||||
prop="RelevanceId"
|
||||
>
|
||||
<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-form-item>
|
||||
<!-- 必填触发值 -->
|
||||
<el-form-item v-if="form.RelevanceId && form.IsRequired === 1"
|
||||
:label="$t('trials:readingUnit:qsList:title:relevanceValueList')" prop="RelevanceValueList">
|
||||
<el-form-item
|
||||
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-option v-for="item of reParentTriggerValOptions" :key="item.id" :label="item.label"
|
||||
:value="String(item.value)" />
|
||||
<el-option
|
||||
v-for="item of reParentTriggerValOptions"
|
||||
:key="item.id"
|
||||
:label="item.label"
|
||||
:value="String(item.value)"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 导出标识 -->
|
||||
|
|
@ -105,95 +174,175 @@
|
|||
</el-radio-group>
|
||||
</el-form-item> -->
|
||||
<!-- 导出结果 -->
|
||||
<el-form-item :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-form-item
|
||||
: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-option v-for="item in CriterionDictionaryList.ExportResult" :key="`ExportResult${item.value}`"
|
||||
:value="parseInt(item.Code)" :label="$i18n.locale === 'zh' ? item.ValueCN : item.Value">
|
||||
<el-option
|
||||
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-select>
|
||||
</el-form-item>
|
||||
<!-- 限制编辑 -->
|
||||
<el-form-item :label="$t('trials:readingUnit:qsList:title:limitEdit')" v-if="form.Type !== 'summary'"
|
||||
prop="LimitEdit" :rules="[
|
||||
<el-form-item
|
||||
: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' }
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<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-group>
|
||||
</el-form-item>
|
||||
<!-- 问题标识 -->
|
||||
<el-form-item v-if="form.Type !== 'group' && form.Type !== 'summary'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:questionMark')" prop="QuestionMark">
|
||||
<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-form-item
|
||||
v-if="form.Type !== 'group' && form.Type !== 'summary'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:questionMark')"
|
||||
prop="QuestionMark"
|
||||
>
|
||||
<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-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-form-item>
|
||||
<!-- 序号 -->
|
||||
<el-form-item :label="$t('trials:readingUnit:qsList:title:order')" prop="ShowOrder" :rules="[
|
||||
<el-form-item
|
||||
:label="$t('trials:readingUnit:qsList:title:order')"
|
||||
prop="ShowOrder"
|
||||
:rules="[
|
||||
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
|
||||
]">
|
||||
<el-input-number v-model="form.ShowOrder" controls-position="right" :min="0" />
|
||||
]"
|
||||
>
|
||||
<el-input-number
|
||||
v-model="form.ShowOrder"
|
||||
controls-position="right"
|
||||
:min="0"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- 重复出现最大次数 -->
|
||||
<el-form-item :label="$t('dictionary:template:criterionConfig:table:maxRowCount')"
|
||||
v-if="form.Type !== 'summary' && form.Type !== 'screenshot' && form.Type !== 'upload'">
|
||||
<el-input-number v-model="form.MaxRowCount" controls-position="right" :min="0" :max="10" />
|
||||
<el-form-item :label="$t('dictionary:template:criterionConfig:table:maxRowCount')" v-if="form.Type !== 'summary' && form.Type !== 'screenshot' && form.Type !== 'upload'">
|
||||
<el-input-number
|
||||
v-model="form.MaxRowCount"
|
||||
controls-position="right"
|
||||
:min="0"
|
||||
:max="10"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- 问题分类 -->
|
||||
<el-form-item :label="$t('dictionary:template:criterionConfig:table:questionClassify')"
|
||||
v-if="criterionType === 2">
|
||||
<el-form-item :label="$t('dictionary:template:criterionConfig:table:questionClassify')" v-if="criterionType === 2">
|
||||
<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-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'"
|
||||
:label="$t('trials:readingUnit:label:QuestionGenre')" prop="TableQuestionType" :rules="[
|
||||
{ required: form.Type !== 'input', message: this.$t('common:ruleMessage:select') }
|
||||
]">
|
||||
<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))">
|
||||
<el-form-item
|
||||
v-if="form.Type === 'select' || form.Type === 'radio' || form.Type === 'input'"
|
||||
:label="$t('trials:readingUnit:label:QuestionGenre')"
|
||||
prop="TableQuestionType"
|
||||
:rules="[
|
||||
{ required: form.Type !== 'input', message: this.$t('common:ruleMessage:select')}
|
||||
]"
|
||||
>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<!-- 选项 -->
|
||||
<el-form-item v-if="form.TableQuestionType === 0 || form.Type === 'class'"
|
||||
:label="$t('trials:qcCfg:table:typeValue')" prop="TypeValue">
|
||||
<el-input v-model="form.TypeValue" :placeholder="$t('trials:qcCfg:message:typeValue')"
|
||||
@change="typeValueChange" />
|
||||
<el-form-item
|
||||
v-if="form.TableQuestionType === 0 || form.Type === 'class'"
|
||||
:label="$t('trials:qcCfg:table:typeValue')"
|
||||
prop="TypeValue"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.TypeValue"
|
||||
:placeholder="$t('trials:qcCfg:message:typeValue')"
|
||||
@change="typeValueChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- 关联问题 -->
|
||||
<el-form-item v-if="form.TableQuestionType === 2"
|
||||
:label="$t('dictionary:template:criterionConfig:table:dependParentId')" prop="DependParentId">
|
||||
<el-select v-model="form.DependParentId">
|
||||
<el-option v-for="item of parentOptions" :key="`DependParentId${item.QuestionId}`"
|
||||
:label="item.QuestionName" :value="item.QuestionId" />
|
||||
<el-form-item
|
||||
v-if="form.TableQuestionType === 2"
|
||||
:label="$t('dictionary:template:criterionConfig:table:dependParentId')"
|
||||
prop="DependParentId"
|
||||
>
|
||||
<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-form-item>
|
||||
<!-- 关联字段 -->
|
||||
<el-form-item v-if="form.TableQuestionType === 1 || !!form.DependParentId"
|
||||
:label="$t('dictionary:template:criterionConfig:table:dataTableColumn')" prop="DataTableColumn">
|
||||
<el-form-item
|
||||
v-if="form.TableQuestionType === 1 || !!form.DependParentId"
|
||||
:label="$t('dictionary:template:criterionConfig:table:dataTableColumn')"
|
||||
prop="DataTableColumn"
|
||||
>
|
||||
<el-select v-model="form.DataTableColumn">
|
||||
<el-option v-for="item of CriterionDictionaryList.OrganColumn" :key="item.Id"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" :value="item.Code" />
|
||||
<el-option
|
||||
v-for="item of CriterionDictionaryList.OrganColumn"
|
||||
:key="item.Id"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
|
||||
:value="item.Code"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 关联字典 -->
|
||||
<el-form-item v-if="form.TableQuestionType === 3 || form.TableQuestionType === 2"
|
||||
:label="$t('dictionary:template:criterionConfig:table:relatedDictionaryCode')" prop="DictionaryCode"
|
||||
:rules="[{ required: form.TableQuestionType === 3, message: '请选择', trigger: 'blur' }]">
|
||||
<el-form-item
|
||||
v-if="form.TableQuestionType === 3 || form.TableQuestionType === 2"
|
||||
:label="$t('dictionary:template:criterionConfig:table:relatedDictionaryCode')"
|
||||
prop="DictionaryCode"
|
||||
:rules="[{ required: form.TableQuestionType === 3, message: '请选择', trigger: 'blur' }]"
|
||||
>
|
||||
<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-form-item>
|
||||
<!-- 默认值 -->
|
||||
|
|
@ -205,23 +354,35 @@
|
|||
:label="item.label"
|
||||
:value="item.value.toString()"
|
||||
/> -->
|
||||
<el-option v-for="item of highlightAnswers" :key="item.Id"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" :value="item.Code" />
|
||||
<el-option
|
||||
v-for="item of highlightAnswers"
|
||||
:key="item.Id"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
|
||||
:value="item.Code"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 默认值 -->
|
||||
<el-form-item v-if="form.TableQuestionType === 0" :label="$t('trials:readingUnit:qsList:title:defaultValue')">
|
||||
<el-select v-model="form.DefaultValue" clearable>
|
||||
<el-option v-for="item of form.TypeValue ? form.TypeValue.split('|') : []" :key="item" :label="item"
|
||||
:value="item" />
|
||||
<el-option
|
||||
v-for="item of form.TypeValue ? form.TypeValue.split('|') : []"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:value="item"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 高亮标记值 -->
|
||||
<el-form-item v-if="form.Type === 'select' || form.Type === 'radio' || form.Type === 'calculation'"
|
||||
:label="$t('trials:readingUnit:qsList:title:highlightAnswers')" prop="HighlightAnswerList">
|
||||
<el-form-item v-if="form.Type === 'select' || form.Type === 'radio'" :label="$t('trials:readingUnit:qsList:title:highlightAnswers')" prop="HighlightAnswerList">
|
||||
<el-select v-model="form.HighlightAnswerList" clearable multiple>
|
||||
<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 v-else-if="form.DictionaryCode">
|
||||
<!-- <el-option
|
||||
|
|
@ -230,16 +391,24 @@
|
|||
:label="item.label"
|
||||
:value="item.value.toString()"
|
||||
/> -->
|
||||
<el-option v-for="item of highlightAnswers" :key="item.Id"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value" :value="item.Code" />
|
||||
<el-option
|
||||
v-for="item of highlightAnswers"
|
||||
:key="item.Id"
|
||||
:label="$i18n.locale === 'zh' ? item.ValueCN : item.Value"
|
||||
:value="item.Code"
|
||||
/>
|
||||
</template>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 最大长度 -->
|
||||
<el-form-item v-if="form.Type === 'input' || form.Type === 'textarea'"
|
||||
:label="$t('trials:readingUnit:qsList:title:MaxAnswerLength')" prop="MaxAnswerLength" :rules="[
|
||||
<el-form-item
|
||||
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' }
|
||||
]">
|
||||
]"
|
||||
>
|
||||
<el-input-number v-model="form.MaxAnswerLength" :min="0"></el-input-number>
|
||||
</el-form-item>
|
||||
<!-- 是否复制前值 -->
|
||||
|
|
@ -256,82 +425,138 @@
|
|||
/>
|
||||
</el-form-item> -->
|
||||
<!-- 数值类型 -->
|
||||
<el-form-item v-if="form.Type === 'number' || form.Type === 'calculation'"
|
||||
:label="$t('trials:readingUnit:qsList:title:valueType')" prop="ValueType" :rules="[
|
||||
<el-form-item
|
||||
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') }
|
||||
]">
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 单位 -->
|
||||
<el-form-item v-if="form.Type === 'number' || form.Type === 'calculation'"
|
||||
:label="$t('trials:readingUnit:qsList:title:unit')" prop="Unit" :rules="[
|
||||
<el-form-item
|
||||
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' }
|
||||
]">
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</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')"
|
||||
prop="ImageCount">
|
||||
<el-input-number v-model="form.ImageCount" controls-position="right" :min="0" :max="10" />
|
||||
<el-form-item
|
||||
v-if="form.Type === 'upload'"
|
||||
: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 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"
|
||||
:rules="[{ type: 'array', required: true, message: this.$t('common:ruleMessage:specify'), trigger: ['change'] }]">
|
||||
<el-checkbox-group v-model="form.FileType" @change="(v) => {
|
||||
: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')) {
|
||||
form.FileType = ['-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'">
|
||||
}"
|
||||
>
|
||||
<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 }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
<!-- 分类 -->
|
||||
<!-- 分类数据来源 -->
|
||||
<el-form-item v-if="form.Type === 'class'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:classifyQuestion')" prop="ClassifyTableQuestionId">
|
||||
<el-form-item
|
||||
v-if="form.Type === 'class'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:classifyQuestion')"
|
||||
prop="ClassifyTableQuestionId"
|
||||
>
|
||||
<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-form-item>
|
||||
<!-- 分类算法 -->
|
||||
<el-form-item v-if="form.Type === 'class'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:classifyAlgorithms')" prop="ClassifyAlgorithms">
|
||||
<el-form-item
|
||||
v-if="form.Type === 'class'"
|
||||
:label="$t('dictionary:template:criterionConfig:table:classifyAlgorithms')"
|
||||
prop="ClassifyAlgorithms"
|
||||
>
|
||||
<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">
|
||||
{{ scope.row.label }}
|
||||
</template>
|
||||
</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">
|
||||
<el-input-number v-model="scope.row.gt"></el-input-number>
|
||||
</template>
|
||||
</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">
|
||||
<el-input-number v-model="scope.row.lt"></el-input-number>
|
||||
</template>
|
||||
|
|
@ -344,7 +569,11 @@
|
|||
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
|
||||
<el-form-item>
|
||||
<!-- 取消 -->
|
||||
<el-button size="small" type="primary" @click="close">
|
||||
<el-button
|
||||
size="small"
|
||||
type="primary"
|
||||
@click="close"
|
||||
>
|
||||
{{ $t('common:button:cancel') }}
|
||||
</el-button>
|
||||
<!-- 保存 -->
|
||||
|
|
@ -437,8 +666,7 @@ export default {
|
|||
ClassifyAlgorithms: null,
|
||||
// ExportIdentification: 0,
|
||||
ExportResult: [],
|
||||
DefaultValue: null,
|
||||
ShowChartTypeEnum: 0
|
||||
DefaultValue:null
|
||||
// IsEnable: true
|
||||
},
|
||||
rules: {
|
||||
|
|
@ -548,7 +776,7 @@ export default {
|
|||
if (this.data.hasOwnProperty(k)) {
|
||||
if (k === 'ClassifyAlgorithms' && this.data[k] !== undefined && 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(',')
|
||||
} else {
|
||||
this.form[k] = this.data[k]
|
||||
|
|
@ -564,10 +792,10 @@ export default {
|
|||
if (this.parentOptions[index].QuestionGenre === 3) {
|
||||
// this.parentTriggerValOptions = this.$d[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 => {
|
||||
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code }
|
||||
this.parentTriggerValOptions = res.Result[dicCode].map(i=>{
|
||||
return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
|
||||
})
|
||||
} else {
|
||||
const options = []
|
||||
|
|
@ -586,9 +814,9 @@ export default {
|
|||
if (this.parentOptions[i].QuestionGenre === 3) {
|
||||
// this.reParentTriggerValOptions = this.$d[this.parentOptions[i].DictionaryCode]
|
||||
let dicCode = this.parentOptions[i].DictionaryCode
|
||||
let res = await getCriterionDictionary({ ReadingCriterionId: this.criterionId, DictionaryCode: dicCode })
|
||||
this.reParentTriggerValOptions = res.Result[dicCode].map(i => {
|
||||
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code }
|
||||
let res = await getCriterionDictionary({ReadingCriterionId: this.criterionId, DictionaryCode: dicCode})
|
||||
this.reParentTriggerValOptions = res.Result[dicCode].map(i=>{
|
||||
return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
|
||||
})
|
||||
} else {
|
||||
const options = []
|
||||
|
|
@ -676,10 +904,10 @@ export default {
|
|||
if (this.parentOptions[index].QuestionGenre === 3) {
|
||||
// this.parentTriggerValOptions = this.$d[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 => {
|
||||
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code }
|
||||
this.parentTriggerValOptions = res.Result[dicCode].map(i=>{
|
||||
return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
|
||||
})
|
||||
} else {
|
||||
const options = []
|
||||
|
|
@ -701,10 +929,10 @@ export default {
|
|||
if (this.parentOptions[index].QuestionGenre === 3) {
|
||||
// this.reParentTriggerValOptions = this.$d[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 => {
|
||||
return { id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code }
|
||||
this.reParentTriggerValOptions = res.Result[dicCode].map(i=>{
|
||||
return {id: i.Id, label: this.$i18n.locale === 'zh' ? i.ValueCN : i.Value, value: i.Code}
|
||||
})
|
||||
} else {
|
||||
const options = []
|
||||
|
|
@ -765,7 +993,6 @@ export default {
|
|||
// form.ExportIdentification = 0
|
||||
form.ExportResult = []
|
||||
form.DefaultValue = null
|
||||
form.ShowChartTypeEnum = 0
|
||||
},
|
||||
close() {
|
||||
this.$emit('close')
|
||||
|
|
@ -774,4 +1001,5 @@ export default {
|
|||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped></style>
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -6,45 +6,68 @@
|
|||
<qc-questions v-if="activeTab == 'qc'" />
|
||||
</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'" />
|
||||
</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'" />
|
||||
</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'" />
|
||||
</el-tab-pane>
|
||||
<!-- 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'" />
|
||||
</el-tab-pane>
|
||||
<!-- 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'" />
|
||||
</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'" />
|
||||
</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'" />
|
||||
</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'" />
|
||||
</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'" />
|
||||
</el-tab-pane>
|
||||
<!-- 用户协议 -->
|
||||
<el-tab-pane :label="$t('dictionary:template:tab:agreement')" name="agreement">
|
||||
<Agreement v-if="activeTab == 'agreement'" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -59,7 +82,6 @@ import Email from './email/index.vue'
|
|||
import Sign from './sign/index.vue'
|
||||
import Browser from './browser/index.vue'
|
||||
import File from './file/index.vue'
|
||||
import Agreement from './agreement/index.vue'
|
||||
export default {
|
||||
name: 'Questions',
|
||||
components: {
|
||||
|
|
@ -73,7 +95,6 @@ export default {
|
|||
MedicalAudit,
|
||||
Browser,
|
||||
File,
|
||||
Agreement
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
|
@ -101,18 +122,16 @@ export default {
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.el-tabs__header {
|
||||
height: 40px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.el-tabs__content {
|
||||
flex: 1;
|
||||
|
||||
.el-tab-pane {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
|
|
|||
|
|
@ -21,19 +21,13 @@
|
|||
<el-form-item :label="$t('trials:researchForm:form:verifyCode')" required>
|
||||
<el-col :span="18">
|
||||
<el-form-item prop="VerificationCode">
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<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-col>
|
||||
<!-- <el-col :span="6" style="text-align: right">
|
||||
|
||||
</el-col> -->
|
||||
<el-col :span="6" style="text-align: right">
|
||||
<el-button size="small" type="primary" style="width: 80%" :disabled="sendDisabled"
|
||||
@click="handleSendCode">{{ sendTitle }}</el-button>
|
||||
</el-col>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<!-- 校验 -->
|
||||
|
|
@ -387,21 +381,6 @@ export default {
|
|||
/*::v-deep .is-error{*/
|
||||
/* 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 {
|
||||
margin-bottom: 45px;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,9 +6,7 @@
|
|||
<div class="login-body">
|
||||
<div class="login-l">
|
||||
<div class="login-logo">
|
||||
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" />
|
||||
<img v-else-if="NODE_ENV === 'usa'" src="@/assets/zzlogo-usa.png" alt="" class="usa-logo" />
|
||||
<img v-else src="@/assets/zzlogo4.png" alt="" />
|
||||
<img src="@/assets/zzlogo-usa.png" alt="" class="usa-logo" />
|
||||
</div>
|
||||
<div :class="{
|
||||
'login-image': true,
|
||||
|
|
@ -77,22 +75,13 @@
|
|||
</span> -->
|
||||
</el-form-item>
|
||||
<!-- Login -->
|
||||
<el-button :loading="loading" type="primary" :disabled="!checked" style="
|
||||
<el-button :loading="loading" type="primary" style="
|
||||
width: 100%;
|
||||
margin-bottom: 10px;
|
||||
background-color: rgb(0, 147, 221);
|
||||
" size="medium" @click.native.prevent="handleLogin">
|
||||
{{ $t('login:button:login') }}
|
||||
</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">
|
||||
<TopLang v-if="
|
||||
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 Img1 from '@/assets/pic-2.png'
|
||||
import toggleRole from '@/components/toggleRole'
|
||||
import {
|
||||
getCurrentVersionUserAgreements,
|
||||
} from '@/api/dictionary'
|
||||
export default {
|
||||
name: 'Login',
|
||||
components: { TopLang, Vcode, browserTip, toggleRole },
|
||||
|
|
@ -240,8 +226,6 @@ export default {
|
|||
Img1,
|
||||
toggleRoleVisible: false,
|
||||
toggleRoleLoading: false,
|
||||
Agreement: [],
|
||||
checked: true
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -270,6 +254,7 @@ export default {
|
|||
zzSessionStorage.setItem('loginType', this.loginType)
|
||||
localStorage.setItem('location', this.location)
|
||||
// zh-CN navigator.language
|
||||
console.log(navigator.language, 'navigator.language')
|
||||
if (navigator.language !== 'zh-CN' && navigator.language !== 'zh-TW') {
|
||||
this.$i18n.locale = 'en'
|
||||
this.setLanguage('en')
|
||||
|
|
@ -291,30 +276,9 @@ export default {
|
|||
}
|
||||
}
|
||||
this.$refs.browserTip.open()
|
||||
this.getAgreementList()
|
||||
},
|
||||
methods: {
|
||||
...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() {
|
||||
this.aboutVisible = true
|
||||
},
|
||||
|
|
|
|||
|
|
@ -18,10 +18,19 @@
|
|||
</el-form-item>
|
||||
<!-- 中心名称 -->
|
||||
<el-form-item :label="$t('trials:researchForm:form:siteName')" prop="TrialSiteId">
|
||||
<el-select v-model="form.TrialSiteId" filterable 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
|
||||
v-model="form.TrialSiteId"
|
||||
filterable
|
||||
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-form-item>
|
||||
<!-- 中心编号 -->
|
||||
|
|
@ -33,7 +42,10 @@
|
|||
<el-input v-model="form.UserName" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
|
||||
</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-form-item>
|
||||
<!-- 联系邮箱 -->
|
||||
|
|
@ -43,71 +55,75 @@
|
|||
|
||||
<!-- <el-divider /> -->
|
||||
<!-- 平均刻盘周期(天) -->
|
||||
<el-form-item v-if="!notShowFieldList.includes('AverageEngravingCycle')"
|
||||
: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-form-item v-if="!notShowFieldList.includes('AverageEngravingCycle')" :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-form-item>
|
||||
<!-- 请确认参与本项目影像采集的影像技师具备对应的资质(如:“技师证”,对应设备的“大型设备上岗证”) -->
|
||||
<el-form-item v-if="!notShowFieldList.includes('IsConfirmImagingTechnologist')"
|
||||
:label="$t('trials:researchForm:form:isQualified')">
|
||||
<el-radio-group v-model="form.IsConfirmImagingTechnologist"
|
||||
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
|
||||
<el-radio v-for="item of $d.YesOrNo" :key="`IsConfirmImagingTechnologist${item.value}`" :label="item.value">{{
|
||||
item.label }}</el-radio>
|
||||
<el-form-item v-if="!notShowFieldList.includes('IsConfirmImagingTechnologist')" :label="$t('trials:researchForm:form:isQualified')">
|
||||
<el-radio-group v-model="form.IsConfirmImagingTechnologist" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
|
||||
<el-radio
|
||||
v-for="item of $d.YesOrNo"
|
||||
:key="`IsConfirmImagingTechnologist${item.value}`"
|
||||
:label="item.value"
|
||||
>{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<!-- 原因 -->
|
||||
<el-form-item v-if="!notShowFieldList.includes('NotConfirmReson') && form.IsConfirmImagingTechnologist === false"
|
||||
:label="$t('trials:researchForm:form:notQualifiedReason')">
|
||||
<el-input v-model="form.NotConfirmReson" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
|
||||
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
|
||||
<el-form-item
|
||||
v-if="!notShowFieldList.includes('NotConfirmReson') && form.IsConfirmImagingTechnologist === false"
|
||||
:label="$t('trials:researchForm:form:notQualifiedReason')"
|
||||
>
|
||||
<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 v-if="!notShowFieldList.includes('EfficacyEvaluatorType')"
|
||||
:label="$t('trials:researchForm:form:staffType')">
|
||||
<el-radio-group v-model="form.EfficacyEvaluatorType"
|
||||
: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-form-item v-if="!notShowFieldList.includes('EfficacyEvaluatorType')" :label="$t('trials:researchForm:form:staffType')">
|
||||
<el-radio-group v-model="form.EfficacyEvaluatorType" :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-form-item>
|
||||
<!-- 是否严格按照研究单位影像手册参数完成图像采集 -->
|
||||
<el-form-item v-if="!notShowFieldList.includes('IsFollowStudyParameters')">
|
||||
<span slot="label" v-html="$t('trials:researchForm:form:isFollowStudyParam')" />
|
||||
<el-radio-group v-model="form.IsFollowStudyParameters"
|
||||
: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-group v-model="form.IsFollowStudyParameters" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
|
||||
<el-radio v-for="item of $d.YesOrNo" :key="`IsFollowStudyParameters${item.value}`" :label="item.value">{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
<el-button type="primary" size="small" @click="viewManual">
|
||||
{{ $t('trials:researchForm:button:viewManual') }}
|
||||
</el-button>
|
||||
</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')" />
|
||||
<el-input v-model="form.NotFollowReson" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
|
||||
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
|
||||
<el-input
|
||||
v-model="form.NotFollowReson"
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 2, maxRows: 4}"
|
||||
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<!-- 保存 -->
|
||||
<el-button v-if="state === 0 && userTypeEnumInt === 0 && !isHistory" type="primary" :loading="btnLoading"
|
||||
size="small" @click="handleSave(false)">
|
||||
<el-button
|
||||
v-if="state === 0 && userTypeEnumInt === 0 && !isHistory"
|
||||
type="primary"
|
||||
:loading="btnLoading"
|
||||
size="small"
|
||||
@click="handleSave(false)"
|
||||
>
|
||||
{{ $t('common:button:save') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<attachmentPreview :visible.sync="perview_visible" :isView="true" :isExternal="true" :ExternalList="ExternalList"
|
||||
v-if="perview_visible" />
|
||||
</el-form>
|
||||
</template>
|
||||
<script>
|
||||
import { getTrialSiteSelect, getTrialDocumentList } from '@/api/trials'
|
||||
import { getTrialSiteSelect } from '@/api/trials'
|
||||
import { addOrUpdateTrialSiteSurvey } from '@/api/research'
|
||||
import attachmentPreview from '@/views/dictionary/attachment/components/SignatureTemplate/attachmentPreview'
|
||||
export default {
|
||||
name: 'QuestionForm',
|
||||
components: { attachmentPreview },
|
||||
props: {
|
||||
isHistory: {
|
||||
type: Boolean,
|
||||
|
|
@ -181,41 +197,10 @@ export default {
|
|||
state: null,
|
||||
userTypeEnumInt: zzSessionStorage.getItem('userTypeEnumInt') * 1,
|
||||
isShow: false,
|
||||
notShowFieldList: [],
|
||||
perview_visible: false,
|
||||
ExternalList: []
|
||||
notShowFieldList: []
|
||||
}
|
||||
},
|
||||
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) {
|
||||
return new Promise((resolve, reject) => {
|
||||
|
|
|
|||
|
|
@ -21,15 +21,14 @@
|
|||
<!-- <h4>{{ $t('trials:staffResearch:title:staff') }}</h4>-->
|
||||
<!-- 历史人员 -->
|
||||
<h4>{{ $t('trials:staffResearch:title:historicalStaff') }}</h4>
|
||||
<HistoricalParticipant ref="historicalParticipant" :is-history="true" @refreshPage="refreshPage"
|
||||
@getList="initPage" />
|
||||
<HistoricalParticipant ref="historicalParticipant" :is-history="true" @refreshPage="refreshPage" @getList="initPage" />
|
||||
<!-- 新增人员 -->
|
||||
<h4>{{ $t('trials:staffResearch:title:newStaff') }}</h4>
|
||||
<ParticipantList ref="researchParticipants" :is-history="true" @refreshPage="refreshPage" @getList="initPage" />
|
||||
</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>
|
||||
<EquipmentList ref="researchEquipments" :is-history="true" />
|
||||
</el-card>
|
||||
|
|
@ -54,17 +53,31 @@
|
|||
</el-card>
|
||||
</div>
|
||||
|
||||
<el-dialog v-if="rejectVisible" :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-dialog
|
||||
v-if="rejectVisible"
|
||||
: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">
|
||||
<div class="base-dialog-body">
|
||||
<!-- 驳回原因 -->
|
||||
<el-form-item :label="$t('trials:researchForm:form:rejectReson')" prop="reason" :rules="[
|
||||
{ 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
|
||||
:label="$t('trials:researchForm:form:rejectReson')"
|
||||
prop="reason"
|
||||
:rules="[
|
||||
{ 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>
|
||||
</div>
|
||||
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
|
||||
|
|
@ -123,7 +136,7 @@ export default {
|
|||
props: {
|
||||
trialSiteSurveyId: {
|
||||
type: String,
|
||||
default: ''
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
|
|
@ -139,7 +152,7 @@ export default {
|
|||
btnLoading: false,
|
||||
isFullscreen: false,
|
||||
historyVisible: false,
|
||||
siteSurveyNoteInfo: {}
|
||||
siteSurveyNoteInfo: null
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
|
@ -159,7 +172,6 @@ export default {
|
|||
if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) {
|
||||
this.siteSurveyNoteInfo = res.Result.SiteSurveyFiledConfig.ModifyFiledList.find(i => i.NeedModifyFiled === 'SiteSurveyNote')
|
||||
}
|
||||
this.siteSurveyNoteInfo.IsCloseEquipmentSurvey = res.Result.SiteSurveyFiledConfig.IsCloseEquipmentSurvey
|
||||
var historicalArr = []
|
||||
var newArr = []
|
||||
res.Result.TrialSiteUserSurveyList.map(i => {
|
||||
|
|
@ -229,7 +241,7 @@ export default {
|
|||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||
}
|
||||
}).catch(() => { this.loading = false })
|
||||
}).catch(() => { })
|
||||
}).catch(() => {})
|
||||
},
|
||||
// 生成账号
|
||||
generateAccount() {
|
||||
|
|
@ -264,7 +276,7 @@ export default {
|
|||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
}).catch(() => { })
|
||||
}).catch(() => {})
|
||||
},
|
||||
// 驳回
|
||||
handleReject() {
|
||||
|
|
@ -312,44 +324,37 @@ export default {
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
|
||||
.mt10 {
|
||||
.mt10{
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.header-wrapper {
|
||||
.header-wrapper{
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
}
|
||||
|
||||
.center-wrapper {
|
||||
.center-wrapper{
|
||||
flex: 1;
|
||||
width: 70%;
|
||||
margin: 0px auto;
|
||||
padding-bottom: 20px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
::v-deep .el-card__body {
|
||||
::v-deep .el-card__body{
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
// >>>.el-dialog__body{
|
||||
// padding: 10px 20px 20px 20px;
|
||||
// }
|
||||
|
||||
::v-deep .full-dialog-container {
|
||||
.el-dialog__body {
|
||||
::v-deep .full-dialog-container{
|
||||
.el-dialog__body{
|
||||
height: calc(100% - 80px);
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .dialog-container {
|
||||
::v-deep .dialog-container{
|
||||
// margin-top: 50px !important;
|
||||
width: 75%;
|
||||
height: 80%;
|
||||
|
||||
.el-dialog__body {
|
||||
width:75%;
|
||||
height:80%;
|
||||
.el-dialog__body{
|
||||
padding: 10px;
|
||||
height: calc(100% - 80px);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,37 +6,61 @@
|
|||
{{ $t('trials:researchForm:title:question') }}
|
||||
</h2>
|
||||
<!-- <TopLang style="position: fixed;top: 40px;right: 40px" /> -->
|
||||
<div style="display: flex;justify-content: space-between;" v-if="!isPreview">
|
||||
<div>{{ $t('trials:researchForm:title:researchSurveyStatus') }} <el-tag>{{ $fd('ResearchRecord', state)
|
||||
}}</el-tag></div>
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<div>{{ $t('trials:researchForm:title:researchSurveyStatus') }} <el-tag>{{ $fd('ResearchRecord', state) }}</el-tag></div>
|
||||
<div>
|
||||
<!-- 提交 -->
|
||||
<el-button v-if="(state === 0 && userTypeEnumInt === 0)" type="primary" size="small"
|
||||
@click="handleSubmit('submit')">
|
||||
<el-button
|
||||
v-if="(state === 0 && userTypeEnumInt === 0)"
|
||||
type="primary"
|
||||
size="small"
|
||||
@click="handleSubmit('submit')"
|
||||
>
|
||||
{{ $t('trials:researchForm:button:submit') }}
|
||||
</el-button>
|
||||
<!-- 审核通过 -->
|
||||
<el-button v-if="(state === 1 && hasPermi(['role:spm', 'role:cpm']))" type="primary" size="small"
|
||||
@click="handleSubmit('approve')">
|
||||
<el-button
|
||||
v-if="(state === 1 && hasPermi(['role:spm','role:cpm']))"
|
||||
type="primary"
|
||||
size="small"
|
||||
@click="handleSubmit('approve')"
|
||||
>
|
||||
{{ $t('trials:researchForm:button:auditPasses') }}
|
||||
</el-button>
|
||||
<!-- 审核通过 -->
|
||||
<el-button v-if="(state === 2 && hasPermi(['role:pm', 'role:apm']))" type="primary" size="small"
|
||||
@click="generateAccount">
|
||||
<el-button
|
||||
v-if="(state === 2 && hasPermi(['role:pm','role:apm']))"
|
||||
type="primary"
|
||||
size="small"
|
||||
@click="generateAccount"
|
||||
>
|
||||
{{ $t('trials:researchForm:button:auditPasses') }}
|
||||
</el-button>
|
||||
<!-- 驳回 -->
|
||||
<el-button
|
||||
v-if="((state === 1 && hasPermi(['role:spm', 'role:cpm'])) || (state === 2 && hasPermi(['role:pm', 'role:apm'])))"
|
||||
type="primary" size="small" @click="handleReject">
|
||||
v-if="((state === 1 && hasPermi(['role:spm','role:cpm'])) || (state === 2 && hasPermi(['role:pm','role:apm'])))"
|
||||
type="primary"
|
||||
size="small"
|
||||
@click="handleReject"
|
||||
>
|
||||
{{ $t('trials:researchForm:button:auditRejected') }}
|
||||
</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') }}
|
||||
</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') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
|
@ -45,26 +69,24 @@
|
|||
<div class="center-wrapper">
|
||||
<!-- 基本信息 -->
|
||||
<el-card shadow="hover">
|
||||
<BaseInfo ref="baseResearchInfo" :isPreview="isPreview" />
|
||||
<BaseInfo ref="baseResearchInfo" />
|
||||
</el-card>
|
||||
|
||||
<!-- 人员调查 -->
|
||||
<el-card shadow="hover" class="mt10">
|
||||
<!-- 历史人员 -->
|
||||
<h4>{{ $t('trials:staffResearch:title:historicalStaff') }}</h4>
|
||||
<HistoricalParticipant ref="historicalParticipant" :isPreview="isPreview" @refreshPage="refreshPage"
|
||||
@getList="initPage" />
|
||||
<HistoricalParticipant ref="historicalParticipant" @refreshPage="refreshPage" @getList="initPage" />
|
||||
<!-- <h4>{{ $t('trials:staffResearch:title:staff') }}</h4> -->
|
||||
<!-- 新增人员 -->
|
||||
<h4>{{ $t('trials:staffResearch:title:newStaff') }}</h4>
|
||||
<ParticipantList ref="researchParticipants" :isPreview="isPreview" @refreshPage="refreshPage"
|
||||
@getList="initPage" />
|
||||
<ParticipantList ref="researchParticipants" @refreshPage="refreshPage" @getList="initPage" />
|
||||
</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>
|
||||
<EquipmentList ref="researchEquipments" :isPreview="isPreview" />
|
||||
<EquipmentList ref="researchEquipments" />
|
||||
</el-card>
|
||||
|
||||
<!-- 其他信息调研 -->
|
||||
|
|
@ -88,17 +110,31 @@
|
|||
</el-card>
|
||||
</div>
|
||||
|
||||
<el-dialog v-if="rejectVisible" :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-dialog
|
||||
v-if="rejectVisible"
|
||||
: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">
|
||||
<div class="base-dialog-body">
|
||||
<!-- 驳回原因 -->
|
||||
<el-form-item :label="$t('trials:researchForm:form:rejectReson')" prop="reason" :rules="[
|
||||
{ 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
|
||||
:label="$t('trials:researchForm:form:rejectReson')"
|
||||
prop="reason"
|
||||
:rules="[
|
||||
{ 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>
|
||||
</div>
|
||||
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
|
||||
|
|
@ -116,24 +152,30 @@
|
|||
</el-form>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :visible.sync="historyVisible"
|
||||
:custom-class="isFullscreen ? 'full-dialog-container' : 'dialog-container'" :close-on-click-modal="false"
|
||||
:fullscreen="isFullscreen" :show-close="false">
|
||||
<el-dialog
|
||||
:visible.sync="historyVisible"
|
||||
:custom-class="isFullscreen?'full-dialog-container':'dialog-container'"
|
||||
:close-on-click-modal="false"
|
||||
:fullscreen="isFullscreen"
|
||||
:show-close="false"
|
||||
>
|
||||
<span slot="title" class="dialog-footer">
|
||||
<div style="display: flex;flex-direction: row;justify-content: space-between;">
|
||||
<div>
|
||||
{{ $t('trials:researchForm:button:historicalRecord') }}
|
||||
</div>
|
||||
<div>
|
||||
<svg-icon :icon-class="isFullscreen ? 'exit-fullscreen' : 'fullscreen'"
|
||||
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="isFullscreen?'exit-fullscreen':'fullscreen'" 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" />
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
<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>
|
||||
</el-dialog>
|
||||
|
||||
|
|
@ -152,12 +194,6 @@ import HistoricalRecord from './components/HistoricalRecord'
|
|||
export default {
|
||||
name: 'QuestionForm',
|
||||
components: { BaseInfo, HistoricalParticipant, ParticipantList, EquipmentList, TopLang, HistoricalRecord },
|
||||
props: {
|
||||
isPreview: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
trialId: this.$route.query.trialId,
|
||||
|
|
@ -172,7 +208,7 @@ export default {
|
|||
btnLoading: false,
|
||||
isFullscreen: false,
|
||||
historyVisible: false,
|
||||
siteSurveyNoteInfo: {}
|
||||
siteSurveyNoteInfo: null
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
|
@ -193,7 +229,6 @@ export default {
|
|||
if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) {
|
||||
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.siteId = res.Result.TrialSiteSurvey.TrialSiteId
|
||||
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(() => { })
|
||||
}).catch(() => {})
|
||||
},
|
||||
// 生成账号
|
||||
generateAccount() {
|
||||
|
|
@ -290,7 +325,7 @@ export default {
|
|||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
}).catch(() => { })
|
||||
}).catch(() => {})
|
||||
},
|
||||
// 驳回
|
||||
handleReject() {
|
||||
|
|
@ -338,44 +373,37 @@ export default {
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
|
||||
.mt10 {
|
||||
.mt10{
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.header-wrapper {
|
||||
.header-wrapper{
|
||||
width: 70%;
|
||||
margin: 20px auto;
|
||||
}
|
||||
|
||||
.center-wrapper {
|
||||
.center-wrapper{
|
||||
flex: 1;
|
||||
width: 70%;
|
||||
margin: 0px auto;
|
||||
padding-bottom: 20px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
::v-deep.el-card__body {
|
||||
::v-deep.el-card__body{
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
// >>>.el-dialog__body{
|
||||
// padding: 10px 20px 20px 20px;
|
||||
// }
|
||||
|
||||
::v-deep.full-dialog-container {
|
||||
.el-dialog__body {
|
||||
::v-deep.full-dialog-container{
|
||||
.el-dialog__body{
|
||||
height: calc(100% - 80px);
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep.dialog-container {
|
||||
::v-deep.dialog-container{
|
||||
// margin-top: 50px !important;
|
||||
width: 75%;
|
||||
height: 80%;
|
||||
|
||||
.el-dialog__body {
|
||||
width:75%;
|
||||
height:80%;
|
||||
.el-dialog__body{
|
||||
padding: 10px;
|
||||
height: calc(100% - 80px);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,8 +7,16 @@
|
|||
<!-- <TopLang style="position: fixed;top: 40px;right: 40px" /> -->
|
||||
</h2>
|
||||
<el-card shadow="hover">
|
||||
<el-form 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
|
||||
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-input v-model="form.TrialCode" disabled />
|
||||
|
|
@ -27,10 +35,13 @@
|
|||
</el-form-item>
|
||||
<!-- 中心名称 -->
|
||||
<el-form-item :label="$t('trials:researchForm:form:siteName')" prop="TrialSiteId">
|
||||
<el-select v-model="form.TrialSiteId" filterable style="width:100%;" @change="handleSiteChange"
|
||||
:disabled="isUpload">
|
||||
<el-option v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteAliasName"
|
||||
:value="item.TrialSiteId" />
|
||||
<el-select v-model="form.TrialSiteId" filterable style="width:100%;" @change="handleSiteChange">
|
||||
<el-option
|
||||
v-for="(item,index) of siteOptions"
|
||||
:key="index"
|
||||
:label="item.TrialSiteAliasName"
|
||||
:value="item.TrialSiteId"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 中心编号 -->
|
||||
|
|
@ -43,14 +54,13 @@
|
|||
{{ $t('trials:researchForm:button:updateQsForm') }}
|
||||
</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') }}
|
||||
</el-link>
|
||||
</el-form-item>
|
||||
<!-- 原调研表填写人邮箱 -->
|
||||
<el-form-item v-if="form.IsUpdate" :label="$t('trials:researchForm:form:originalEmail')"
|
||||
prop="ReplaceUserEmailOrPhone">
|
||||
<el-input v-model="form.ReplaceUserEmailOrPhone" autocomplete="new-password" :disabled="isUpload" />
|
||||
<el-form-item v-if="form.IsUpdate" :label="$t('trials:researchForm:form:originalEmail')" prop="ReplaceUserEmailOrPhone">
|
||||
<el-input v-model="form.ReplaceUserEmailOrPhone" autocomplete="new-password" />
|
||||
</el-form-item>
|
||||
<!-- 联系邮箱 -->
|
||||
<el-form-item :label="$t('trials:researchForm:form:contactorEmail')" prop="EmailOrPhone">
|
||||
|
|
@ -64,9 +74,13 @@
|
|||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col style="width: 120px;margin-left: 10px">
|
||||
<el-button size="small" class="codeBtn" style="width:100%;"
|
||||
:disabled="sendDisabled || !form.EmailOrPhone || count > 0" @click="handleSendCode">{{
|
||||
this.$t('trials:researchForm:button:send') }} {{ sendTitle ? `${sendTitle}` : null }}</el-button>
|
||||
<el-button
|
||||
size="small"
|
||||
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-form-item>
|
||||
<el-form-item>
|
||||
|
|
@ -189,8 +203,7 @@ export default {
|
|||
timer: null,
|
||||
msg: '',
|
||||
lang: 'zh',
|
||||
isHaveSiteSurveyRecord: false,
|
||||
isUpload: false
|
||||
isHaveSiteSurveyRecord: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -208,14 +221,6 @@ export default {
|
|||
this.trialId = this.$route.query.trialId
|
||||
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: {
|
||||
...mapMutations({ setLanguage: 'lang/setLanguage' }),
|
||||
|
|
@ -230,9 +235,6 @@ export default {
|
|||
this.form[key] = Result[key]
|
||||
}
|
||||
})
|
||||
if (this.isUpload) {
|
||||
this.handleSiteChange(this.form.TrialSiteId)
|
||||
}
|
||||
this.loading = false
|
||||
}).catch(() => { this.loading = false })
|
||||
},
|
||||
|
|
@ -343,24 +345,8 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<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 {
|
||||
padding: 20px;
|
||||
|
||||
.box-wrapper {
|
||||
width: 50%;
|
||||
margin: 20px auto;
|
||||
|
|
|
|||
|
|
@ -7,20 +7,51 @@
|
|||
{{ $t('trials:researchForm:form:title') }}
|
||||
</h2>
|
||||
<el-card shadow="hover" style="padding-top: 40px">
|
||||
<el-form 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
|
||||
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-input v-model="form.EmailOrPhone" autocomplete="new-password" @change="handleEmailChange" />
|
||||
<el-form-item
|
||||
: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 :label="$t('trials:researchForm:form:verifyCode')" prop="VerificationCode">
|
||||
<div style="display: flex;;justify-content: space-between;">
|
||||
<el-input v-model="form.VerificationCode" autocomplete="new-password" />
|
||||
<el-button size="small" style="margin-left: 10px;" :disabled="sendDisabled" class="codeBtn"
|
||||
@click="handleSendCode">{{ this.$t('trials:researchForm:button:send')
|
||||
}}{{ count || count === 0 ? `(${count}s)` : '' }}</el-button>
|
||||
</div>
|
||||
<el-form-item
|
||||
:label="$t('trials:researchForm:form:verifyCode')"
|
||||
required
|
||||
>
|
||||
<el-col :span="20">
|
||||
<el-form-item prop="VerificationCode">
|
||||
<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>
|
||||
<!-- 取消 -->
|
||||
|
|
@ -28,7 +59,12 @@
|
|||
{{ $t('common:button:cancel') }}
|
||||
</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') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
|
|
@ -180,7 +216,7 @@ export default {
|
|||
this.$i18n.locale = this.$route.query.lang
|
||||
this.setLanguage(this.$route.query.lang)
|
||||
},
|
||||
mounted() { },
|
||||
mounted() {},
|
||||
methods: {
|
||||
...mapMutations({ setLanguage: 'lang/setLanguage' }),
|
||||
// 提交
|
||||
|
|
@ -213,15 +249,20 @@ export default {
|
|||
// this.$router.push({ path: `/researchForm?trialId=${this.trialId}&trialSiteSurveyId=${res.Result.TrialSiteSurveyId}` })
|
||||
if (this.$route.query.trialId) {
|
||||
this.$router.push({
|
||||
path: `/curriculumVitae?Id=${res.Result.DoctorId ? res.Result.DoctorId : ''
|
||||
}&tabActive=BasicInfo&ReviewStatus=${res.Result.ReviewStatus
|
||||
}&trialId=${this.$route.query.trialId}&lang=${this.$route.query.lang
|
||||
path: `/curriculumVitae?Id=${
|
||||
res.Result.DoctorId ? res.Result.DoctorId : ''
|
||||
}&tabActive=BasicInfo&ReviewStatus=${
|
||||
res.Result.ReviewStatus
|
||||
}&trialId=${this.$route.query.trialId}&lang=${
|
||||
this.$route.query.lang
|
||||
}`,
|
||||
})
|
||||
} else {
|
||||
this.$router.push({
|
||||
path: `/curriculumVitae?Id=${res.Result.DoctorId ? res.Result.DoctorId : ''
|
||||
}&tabActive=BasicInfo&ReviewStatus=${res.Result.ReviewStatus
|
||||
path: `/curriculumVitae?Id=${
|
||||
res.Result.DoctorId ? res.Result.DoctorId : ''
|
||||
}&tabActive=BasicInfo&ReviewStatus=${
|
||||
res.Result.ReviewStatus
|
||||
}&lang=${this.$route.query.lang}`,
|
||||
})
|
||||
}
|
||||
|
|
@ -271,7 +312,8 @@ export default {
|
|||
this.timer = setInterval(() => {
|
||||
if (this.count > 0 && this.count <= TIME_COUNT) {
|
||||
this.count--
|
||||
this.sendTitle = `${this.$t('trials:researchForm:button:send')}(${this.count
|
||||
this.sendTitle = `${this.$t('trials:researchForm:button:send')}(${
|
||||
this.count
|
||||
}s)`
|
||||
this.sendDisabled = true
|
||||
} else {
|
||||
|
|
@ -293,7 +335,6 @@ export default {
|
|||
<style lang="scss" scoped>
|
||||
.question-login-wrapper {
|
||||
padding: 20px;
|
||||
|
||||
.box-wrapper {
|
||||
width: 50%;
|
||||
margin: 20px auto;
|
||||
|
|
@ -301,19 +342,4 @@ export default {
|
|||
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>
|
||||
|
|
|
|||
|
|
@ -155,17 +155,6 @@ export default {
|
|||
},
|
||||
],
|
||||
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,
|
||||
message: this.$t('form:rules:maxLength:400'),
|
||||
|
|
@ -173,17 +162,6 @@ export default {
|
|||
},
|
||||
],
|
||||
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,
|
||||
message: this.$t('form:rules:maxLength:400'),
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
:maxlength="400"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
<!-- <el-form-item
|
||||
:label="$t('system:Setting:label:Blind NameCN')"
|
||||
prop="BlindNameCN"
|
||||
>
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
style="width: 300px"
|
||||
:maxlength="400"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form-item> -->
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind Publications')"
|
||||
prop="BlindPublications"
|
||||
|
|
|
|||
|
|
@ -79,7 +79,10 @@
|
|||
<el-table-column prop="date" :label="$t('common:action:action')">
|
||||
<template
|
||||
slot-scope="scope"
|
||||
v-if="scope.row.ExperienceDataType != 3"
|
||||
v-if="
|
||||
scope.row.ExperienceDataType != 2 &&
|
||||
scope.row.ExperienceDataType != 3
|
||||
"
|
||||
>
|
||||
<el-button
|
||||
type="text"
|
||||
|
|
|
|||
|
|
@ -211,17 +211,6 @@ export default {
|
|||
},
|
||||
],
|
||||
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,
|
||||
message: this.$t('form:rules:maxLength:400'),
|
||||
|
|
@ -229,17 +218,6 @@ export default {
|
|||
},
|
||||
],
|
||||
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,
|
||||
message: this.$t('form:rules:maxLength:400'),
|
||||
|
|
|
|||
|
|
@ -19,12 +19,12 @@
|
|||
>
|
||||
{{ DATA.BlindName }}
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
<!-- <el-form-item
|
||||
:label="$t('system:Setting:label:Blind NameCN')"
|
||||
style="width: 45%"
|
||||
>
|
||||
{{ DATA.BlindNameCN }}
|
||||
</el-form-item>
|
||||
</el-form-item> -->
|
||||
<div style="display: flex; font-size: 14px; margin-bottom: 22px">
|
||||
<span style="display: inline-block; width: 120px; color: #000">{{
|
||||
$t('system:Setting:label:Blind Publications')
|
||||
|
|
@ -109,8 +109,8 @@
|
|||
<div class="form_title">
|
||||
{{ $t('system:Setting:title:Blinded information') }}
|
||||
</div>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<!-- <el-row>
|
||||
<el-col :span="12"> -->
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind Name')"
|
||||
prop="BlindName"
|
||||
|
|
@ -121,7 +121,7 @@
|
|||
:maxlength="400"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- </el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind NameCN')"
|
||||
|
|
@ -134,7 +134,7 @@
|
|||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-row> -->
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind Publications')"
|
||||
prop="BlindPublications"
|
||||
|
|
|
|||
|
|
@ -2,8 +2,14 @@
|
|||
<div class="curriculumVitae" v-loading="loading">
|
||||
<div class="leftMenu">
|
||||
<div class="title">{{ $t('curriculumVitae:menu:title') }}</div>
|
||||
<el-menu :default-active="activeIndex" class="el-menu-demo" mode="vertical" @select="handleSelect"
|
||||
background-color="#eee" active-text-color="#000">
|
||||
<el-menu
|
||||
:default-active="activeIndex"
|
||||
class="el-menu-demo"
|
||||
mode="vertical"
|
||||
@select="handleSelect"
|
||||
background-color="#eee"
|
||||
active-text-color="#000"
|
||||
>
|
||||
<el-menu-item index="info">
|
||||
{{ $t('curriculumVitae:menu:info') }}
|
||||
</el-menu-item>
|
||||
|
|
@ -64,58 +70,94 @@
|
|||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<!--个人信息-->
|
||||
<div class="box" id="info">
|
||||
<info :DATA="{
|
||||
<info
|
||||
:DATA="{
|
||||
...reviewerData.BasicInfoView,
|
||||
...reviewerData.EmploymentView,
|
||||
}" :reviewerId.sync="reviewerId" :isEN="isEN" @getInfo="getDetail" />
|
||||
}"
|
||||
:reviewerId.sync="reviewerId"
|
||||
:isEN="isEN"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
<!--概述-->
|
||||
<div class="box" id="summarize">
|
||||
<summarize :DATA="{
|
||||
<summarize
|
||||
:DATA="{
|
||||
...reviewerData.SummarizeInfo,
|
||||
}" :reviewerId.sync="reviewerId" :trialId="trialId" :isEN="isEN" @getInfo="getDetail" />
|
||||
}"
|
||||
:reviewerId.sync="reviewerId"
|
||||
:trialId="trialId"
|
||||
:isEN="isEN"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
<!--专业-->
|
||||
<div class="box" id="specialty">
|
||||
<specialty :DATA="{
|
||||
<specialty
|
||||
:DATA="{
|
||||
...reviewerData.SpecialtyView,
|
||||
}" :isEN="isEN" :reviewerId.sync="reviewerId" @getInfo="getDetail" />
|
||||
}"
|
||||
:isEN="isEN"
|
||||
:reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
<!--教育经历-->
|
||||
<div class="box" id="educationalExperience">
|
||||
<educationalExperience :DATA="reviewerData.EducationList" :isEN="isEN" :reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail" />
|
||||
<educationalExperience
|
||||
:DATA="reviewerData.EducationList"
|
||||
:isEN="isEN"
|
||||
:reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
<!--进修培训-->
|
||||
<div class="box" id="continuingTraining">
|
||||
<continuingTraining :DATA="reviewerData.PostgraduateList" :isEN="isEN" :reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail" />
|
||||
<continuingTraining
|
||||
:DATA="reviewerData.PostgraduateList"
|
||||
:isEN="isEN"
|
||||
:reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
<!--科研课题-->
|
||||
<div class="box" id="scientificResearchProject">
|
||||
<scientificResearchProject :DATA="{ ...reviewerData.ResearchPublicationView }" :isEN="isEN"
|
||||
:reviewerId.sync="reviewerId" @getInfo="getDetail" />
|
||||
<scientificResearchProject
|
||||
:DATA="{ ...reviewerData.ResearchPublicationView }"
|
||||
:isEN="isEN"
|
||||
:reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
<!--临床试验-->
|
||||
<div class="box" id="clinicalTrials">
|
||||
<clinicalTrials :DATA="{ ...reviewerData.TrialExperienceView }" :isEN="isEN" :reviewerId.sync="reviewerId"
|
||||
:trialId="trialId" @getInfo="getDetail" />
|
||||
<clinicalTrials
|
||||
:DATA="{ ...reviewerData.TrialExperienceView }"
|
||||
:isEN="isEN"
|
||||
:reviewerId.sync="reviewerId"
|
||||
:trialId="trialId"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
<!--gcp证书-->
|
||||
<div class="box" id="treatise">
|
||||
<treatise :DATA="{ ...reviewerData.ResearchPublicationView }" :isEN="isEN" :reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail" />
|
||||
<treatise
|
||||
:DATA="{ ...reviewerData.ResearchPublicationView }"
|
||||
:isEN="isEN"
|
||||
:reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
<!--其他相关经历-->
|
||||
<div class="box" id="other">
|
||||
<other :DATA="{ ...reviewerData.ResearchPublicationView }" :isEN="isEN" :reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail" />
|
||||
<other
|
||||
:DATA="{ ...reviewerData.ResearchPublicationView }"
|
||||
:isEN="isEN"
|
||||
:reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
<div class="box" id="pay">
|
||||
<pay :DATA="{ ...reviewerData.PaymentModeInfo }" :isEN="isEN" :reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail" />
|
||||
<pay
|
||||
:DATA="{ ...reviewerData.PaymentModeInfo }"
|
||||
:isEN="isEN"
|
||||
:reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
<div class="box" id="setting" v-if="isPM">
|
||||
<setting :isEN="isEN" :reviewerId.sync="reviewerId" />
|
||||
|
|
@ -125,19 +167,38 @@
|
|||
<!--简历附件-->
|
||||
<curriculum :isEN="isEN" :reviewerId.sync="reviewerId" />
|
||||
<!--资历证书-->
|
||||
<certificate :DATA="reviewerData.AttachmentList" :isEN="isEN" :reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail" />
|
||||
<certificate
|
||||
:DATA="reviewerData.AttachmentList"
|
||||
:isEN="isEN"
|
||||
:reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
<!--协议-->
|
||||
<agreement :DATA="reviewerData.AttachmentList" :isEN="isEN" :isPM="isPM" :reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail" />
|
||||
<agreement
|
||||
:DATA="reviewerData.AttachmentList"
|
||||
:isEN="isEN"
|
||||
:isPM="isPM"
|
||||
:reviewerId.sync="reviewerId"
|
||||
@getInfo="getDetail"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<el-dialog :visible.sync="visible" fullscreen append-to-body>
|
||||
<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>
|
||||
</el-dialog>
|
||||
<holiday v-if="holidayVisible" :reviewerId.sync="reviewerId" :visible.sync="holidayVisible" />
|
||||
<holiday
|
||||
v-if="holidayVisible"
|
||||
:reviewerId.sync="reviewerId"
|
||||
:visible.sync="holidayVisible"
|
||||
/>
|
||||
<!-- <setting
|
||||
v-if="settingVisible"
|
||||
:reviewerId.sync="reviewerId"
|
||||
|
|
@ -322,14 +383,12 @@ export default {
|
|||
position: relative;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.title {
|
||||
line-height: 50px;
|
||||
background-color: #fff;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.leftMenu {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
|
|
@ -338,15 +397,12 @@ export default {
|
|||
height: 100%;
|
||||
background-color: #eee;
|
||||
border-right: 1px solid #eee;
|
||||
|
||||
::v-deep .el-menu {
|
||||
padding: 5px 5px 0;
|
||||
}
|
||||
|
||||
::v-deep .is-active {
|
||||
background-color: #fff !important;
|
||||
position: relative;
|
||||
|
||||
&::before {
|
||||
display: block;
|
||||
content: '';
|
||||
|
|
@ -359,7 +415,6 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.main {
|
||||
width: calc(100% - 300px);
|
||||
height: 100%;
|
||||
|
|
@ -368,11 +423,9 @@ export default {
|
|||
display: flex;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.content {
|
||||
width: calc(100% - 300px);
|
||||
padding: 0 50px 0 20px;
|
||||
|
||||
.title {
|
||||
line-height: 50px;
|
||||
background-color: #fff;
|
||||
|
|
@ -381,42 +434,35 @@ export default {
|
|||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
|
||||
.box {
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
padding: 15px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
::v-deep .noData {
|
||||
color: #909399;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.rightFile {
|
||||
width: 300px;
|
||||
padding-right: 10px;
|
||||
|
||||
::v-deep .title {
|
||||
line-height: 50px;
|
||||
background-color: #fff;
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
::v-deep .fileBox {
|
||||
background-color: #eee;
|
||||
padding: 10px;
|
||||
font-size: 14px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
::v-deep .file_title {
|
||||
line-height: 40px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
::v-deep .btnBox {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
@ -428,23 +474,17 @@ export default {
|
|||
width: 100%;
|
||||
display: flex;
|
||||
margin-bottom: 10px;
|
||||
|
||||
.name {
|
||||
width: 70%;
|
||||
white-space: nowrap;
|
||||
/* 文本不会换行,会在同一行内继续,直到遇到<br>标签为止 */
|
||||
text-overflow: ellipsis;
|
||||
/* 当文本溢出包含它的容器时,显示省略号(...)来表示被截断的文本 */
|
||||
overflow: hidden;
|
||||
/* 隐藏溢出容器的文本 */
|
||||
white-space: nowrap; /* 文本不会换行,会在同一行内继续,直到遇到<br>标签为止 */
|
||||
text-overflow: ellipsis; /* 当文本溢出包含它的容器时,显示省略号(...)来表示被截断的文本 */
|
||||
overflow: hidden; /* 隐藏溢出容器的文本 */
|
||||
}
|
||||
|
||||
i {
|
||||
cursor: pointer;
|
||||
margin: 3px;
|
||||
color: #409eff;
|
||||
}
|
||||
|
||||
.disable {
|
||||
cursor: not-allowed;
|
||||
color: #909399;
|
||||
|
|
|
|||
|
|
@ -591,32 +591,9 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="file" v-if="isAll && hasFile">
|
||||
<div
|
||||
class="curriculum"
|
||||
v-if="
|
||||
(resumeListCN && resumeListCN.length > 0) ||
|
||||
(resumeListEN && resumeListEN.length > 0)
|
||||
"
|
||||
>
|
||||
<div class="curriculum" v-if="resumeListEN && resumeListEN.length > 0">
|
||||
<div class="title">{{ $t('curriculumVitae:curriculum:title') }}</div>
|
||||
<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
|
||||
class="file_title"
|
||||
v-if="resumeListEN && resumeListEN.length > 0"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -2,18 +2,26 @@
|
|||
<base-model v-if="config.visible" :config="config">
|
||||
<template slot="dialog-body">
|
||||
<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 prop="value" :label="$t('system:loginLog:table:cfgVal')" show-overflow-tooltip>
|
||||
<el-table-column
|
||||
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">
|
||||
<el-button v-if="scope.row.prop === 'UserAgreementId'" type="text" size="small"
|
||||
@click.stop="view(scope.row)">{{
|
||||
$t('dictionary:agreement:button:view')
|
||||
}}</el-button>
|
||||
<span v-else-if="scope.row.prop !== 'UserRoleList'">{{
|
||||
<span v-if="scope.row.prop !== 'UserRoleList'">{{
|
||||
scope.row.value
|
||||
}}</span>
|
||||
<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
|
||||
}}{{ $t('system:loginLog:form:symbol')
|
||||
}}{{ $fd('IsEnable', !item.IsUserRoleDisabled) }}
|
||||
|
|
@ -66,11 +74,7 @@ export default {
|
|||
'PositionName',
|
||||
'DepartmentName',
|
||||
'UserRoleList',
|
||||
'UserAgreementTypeEnum',
|
||||
'FileVersion',
|
||||
'UserAgreementId',
|
||||
],
|
||||
IsEn_Us: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -83,7 +87,6 @@ export default {
|
|||
let obj = JSON.parse(this.JsonObj)
|
||||
let curData = []
|
||||
Object.keys(obj).forEach((key) => {
|
||||
if (key === 'IsEn_Us') this.IsEn_Us = obj[key]
|
||||
if (this.curKeys.includes(key)) {
|
||||
let o = {
|
||||
key: this.$t(`system:loginLog:form:${key}`),
|
||||
|
|
@ -93,23 +96,12 @@ export default {
|
|||
if (key === 'Status') {
|
||||
o.value = this.$fd('IsUserEnable', obj[key])
|
||||
}
|
||||
if (key === 'UserAgreementTypeEnum') {
|
||||
o.value = this.$fd('UserAgreementType', obj[key])
|
||||
}
|
||||
curData.push(o)
|
||||
}
|
||||
})
|
||||
return curData
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
view(row) {
|
||||
this.$AGR({
|
||||
Id: row.value,
|
||||
IsEn_Us: this.IsEn_Us
|
||||
})
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
|
|
|
|||
|
|
@ -1,14 +1,7 @@
|
|||
<template>
|
||||
<div class="trials-navbar" style="position: relative">
|
||||
<div class="leftMenu">
|
||||
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" />
|
||||
<img
|
||||
v-else-if="NODE_ENV === 'usa'"
|
||||
src="@/assets/title-logo.png"
|
||||
alt=""
|
||||
class="title-logo"
|
||||
/>
|
||||
<img v-else src="@/assets/zzlogo4.png" alt="" />
|
||||
<img src="@/assets/title-logo.png" alt="" class="title-logo" />
|
||||
<span style="white-space: nowrap" v-if="NODE_ENV !== 'usa'">
|
||||
<!-- 中心影像系统(EICS) -->
|
||||
{{ $t('trials:trials:title:eics') }}
|
||||
|
|
|
|||
|
|
@ -1,33 +1,72 @@
|
|||
<!-- eslint-disable -->
|
||||
<template>
|
||||
<el-form ref="trialForm" v-loading="loading" label-width="250px" :rules="trialFormRules"
|
||||
class="demo-ruleForm trial-Form" :model="trialForm" label-position="right" :inline="true">
|
||||
<el-form
|
||||
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-form-item 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
|
||||
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 :label="$t('trials:trials-list:form:trialType')" prop="TrialType">
|
||||
<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-form-item
|
||||
:label="$t('trials:trials-list:form:trialType')"
|
||||
prop="TrialType"
|
||||
>
|
||||
<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-form-item>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<!-- 试验名称 -->
|
||||
<el-form-item :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
|
||||
: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 :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-form-item>
|
||||
</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-form-item>
|
||||
<!-- 负责人PI -->
|
||||
|
|
@ -38,28 +77,63 @@
|
|||
<el-row>
|
||||
<!-- 申办方 -->
|
||||
<el-form-item :label="$t('trials:trials-list:form:sponsor')">
|
||||
<el-select v-model="trialForm.SponsorId" filterable allow-create default-first-option clearable
|
||||
@change="(value) => handleSelectChange(value, 'sponsor')" @visible-change="
|
||||
<el-select
|
||||
v-model="trialForm.SponsorId"
|
||||
filterable
|
||||
allow-create
|
||||
default-first-option
|
||||
@change="(value) => handleSelectChange(value, 'sponsor')"
|
||||
@visible-change="
|
||||
(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-form-item>
|
||||
<!-- 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')"
|
||||
@visible-change="(flag) => handleSelectVisibbleChange(flag, 'cro')">
|
||||
<el-option v-for="item of croList" :key="item.Id" :label="item.CROName" :value="item.Id" />
|
||||
@visible-change="(flag) => handleSelectVisibbleChange(flag, 'cro')"
|
||||
>
|
||||
<el-option
|
||||
v-for="item of croList"
|
||||
:key="item.Id"
|
||||
:label="item.CROName"
|
||||
:value="item.Id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<!-- DeclarationType -->
|
||||
<el-form-item :label="$t('trials:trials-list:form:declarationType')" prop="DeclarationTypeEnumList">
|
||||
<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-form-item
|
||||
:label="$t('trials:trials-list:form:declarationType')"
|
||||
prop="DeclarationTypeEnumList"
|
||||
>
|
||||
<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-form-item>
|
||||
<!-- Phase -->
|
||||
|
|
@ -71,41 +145,79 @@
|
|||
:label="item.Value"
|
||||
: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-form-item>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<!-- 适应症类型 IndicationType -->
|
||||
<el-form-item :label="$t('trials:trials-list:form:indicationType')" prop="IndicationTypeId">
|
||||
<el-select v-model="trialForm.IndicationTypeId" @change="handleIndicationTypeChange">
|
||||
<el-form-item
|
||||
:label="$t('trials:trials-list:form:indicationType')"
|
||||
prop="IndicationTypeId"
|
||||
>
|
||||
<el-select
|
||||
v-model="trialForm.IndicationTypeId"
|
||||
@change="handleIndicationTypeChange"
|
||||
>
|
||||
<!-- <el-option
|
||||
v-for="item of dictionaryList.IndicationType"
|
||||
:key="item.Id"
|
||||
:label="item.Value"
|
||||
: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-form-item>
|
||||
<!-- 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-select :disabled="!trialForm.IndicationTypeId" v-if="![37, 38, 39].includes(trialForm.IndicationEnum)"
|
||||
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
|
||||
:disabled="!trialForm.IndicationTypeId"
|
||||
v-if="![37, 38, 39].includes(trialForm.IndicationEnum)"
|
||||
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-row v-if="[37, 38, 39].includes(trialForm.IndicationEnum)">
|
||||
<el-col :span="12">
|
||||
<el-select :disabled="!trialForm.IndicationTypeId" v-model="trialForm.IndicationEnum"
|
||||
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
|
||||
:disabled="!trialForm.IndicationTypeId"
|
||||
v-model="trialForm.IndicationEnum"
|
||||
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-col>
|
||||
<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-row>
|
||||
</el-form-item>
|
||||
|
|
@ -120,54 +232,99 @@
|
|||
:label="item.Value"
|
||||
: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-form-item>
|
||||
<!-- Sites -->
|
||||
<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-row>
|
||||
<el-row>
|
||||
<!-- Expected Patients Num -->
|
||||
<el-form-item :label="$t('trials:trials-list:form:patientsNum')">
|
||||
<el-input-number v-model="trialForm.ExpectedPatients" controls-position="right" :min="0"
|
||||
@change="handleExpectedPatientsChange" />
|
||||
<el-input-number
|
||||
v-model="trialForm.ExpectedPatients"
|
||||
controls-position="right"
|
||||
:min="0"
|
||||
@change="handleExpectedPatientsChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- Timepoints Per Patient -->
|
||||
<el-form-item :label="$t('trials:trials-list:form:timePointsPerPatient')">
|
||||
<el-input-number v-model="trialForm.TimePointsPerPatient" controls-position="right" :min="0"
|
||||
@change="handleTpPerPatientChange" />
|
||||
<el-input-number
|
||||
v-model="trialForm.TimePointsPerPatient"
|
||||
controls-position="right"
|
||||
:min="0"
|
||||
@change="handleTpPerPatientChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<!-- Visits -->
|
||||
<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-row>
|
||||
<el-row>
|
||||
<!-- 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-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-form-item>
|
||||
<!-- 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-form-item>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<!-- Total Reviewers -->
|
||||
<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>
|
||||
<!-- Type of Reviewers -->
|
||||
<el-form-item :label="$t('trials:trials-list:form:typeofReviewers')">
|
||||
<el-select v-model="trialForm.AttendedReviewerTypeEnumList" size="small" multiple clearable>
|
||||
<el-option v-for="item of $d.AttendedReviewerType" :key="item.value" :value="item.value"
|
||||
:label="item.label" />
|
||||
<el-select
|
||||
v-model="trialForm.AttendedReviewerTypeEnumList"
|
||||
size="small"
|
||||
multiple
|
||||
clearable
|
||||
>
|
||||
<el-option
|
||||
v-for="item of $d.AttendedReviewerType"
|
||||
:key="item.value"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</el-select>
|
||||
<!-- <el-row v-if="trialForm.AttendedReviewerTypeEnumList.includes(2)">-->
|
||||
<!-- <el-col :span="12">-->
|
||||
|
|
@ -400,7 +557,6 @@ export default {
|
|||
},
|
||||
// 申办方与CRO新增
|
||||
async handleSelectChange(value, key) {
|
||||
if (!value) return false
|
||||
let arr = key == "sponsor" ? this.sponsorList : this.croList;
|
||||
let has = arr.some((item) => item.Id === value);
|
||||
if (!has) {
|
||||
|
|
@ -632,7 +788,6 @@ export default {
|
|||
.trial-Form .el-textarea {
|
||||
width: 340px;
|
||||
}
|
||||
|
||||
.trial-Form .el-col .el-input {
|
||||
width: 165px;
|
||||
margin-right: 10px;
|
||||
|
|
|
|||
|
|
@ -5,61 +5,135 @@
|
|||
<!-- 账号信息 -->
|
||||
{{ $t('trials:trials-myinfo:title:accountInfo') }}
|
||||
</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>
|
||||
</el-form-item>
|
||||
<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') }}
|
||||
</el-button>
|
||||
</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>
|
||||
</el-form-item>
|
||||
<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') }}
|
||||
</el-button>
|
||||
</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>
|
||||
</el-form-item>
|
||||
<el-form-item label="" 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-form-item
|
||||
label=""
|
||||
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 label="" style="position: relative" prop="VerificationCode" v-if="IsCanConnectInternet">
|
||||
<div style="display: flex;justify-content: space-between;width: 100%;">
|
||||
<el-input v-model="userForm.VerificationCode" :placeholder="$t('trials:researchForm:form:verifyCode')" />
|
||||
<el-button class="codeBtn" :disabled="sendDisabled" size="mini" @click="sendVerificationCode">{{
|
||||
sendTitle
|
||||
}}</el-button>
|
||||
</div>
|
||||
<el-form-item
|
||||
label=""
|
||||
style="position: relative"
|
||||
prop="VerificationCode"
|
||||
v-if="IsCanConnectInternet"
|
||||
>
|
||||
<el-input
|
||||
v-model="userForm.VerificationCode"
|
||||
:placeholder="$t('trials:researchForm:form:verifyCode')"
|
||||
/>
|
||||
<!-- 修改 -->
|
||||
<el-button :disabled="!userForm.EMail || !userForm.VerificationCode" class="saveBtn" type="primary"
|
||||
size="small" @click="setNewEmail">
|
||||
<el-button
|
||||
:disabled="!userForm.EMail || !userForm.VerificationCode"
|
||||
class="saveBtn"
|
||||
type="primary"
|
||||
size="small"
|
||||
@click="setNewEmail"
|
||||
>
|
||||
{{ $t('trials:trials-myinfo:button:update') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('trials:trials-myinfo:form:toggleRole')" style="position: relative"
|
||||
prop="VerificationCode" v-if="hasRole">
|
||||
<el-form-item
|
||||
: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 v-for="item in roles" :key="item.Id" :label="item.Id" :disabled="item.IsUserRoleDisabled"
|
||||
style="margin-bottom: 10px">
|
||||
<el-radio
|
||||
v-for="item in roles"
|
||||
:key="item.Id"
|
||||
:label="item.Id"
|
||||
:disabled="item.IsUserRoleDisabled"
|
||||
style="margin-bottom: 10px"
|
||||
>
|
||||
{{ item.UserTypeShortName }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
<!-- 修改 -->
|
||||
<el-button :disabled="!userRoleId || saveDisabled" class="saveBtn" :loading="toggleRoleLoading" type="primary"
|
||||
size="small" @click="toggleRole">
|
||||
<el-button
|
||||
:disabled="!userRoleId || saveDisabled"
|
||||
class="saveBtn"
|
||||
:loading="toggleRoleLoading"
|
||||
type="primary"
|
||||
size="small"
|
||||
@click="toggleRole"
|
||||
>
|
||||
{{ $t('trials:trials-myinfo:button:toggleRole') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
|
|
@ -271,26 +345,9 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<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 {
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
.el-radio {
|
||||
width: 60px;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,22 +39,7 @@
|
|||
<el-input v-model="searchData.Name" clearable style="width: 120px" />
|
||||
</el-form-item>
|
||||
<!-- 签署人 -->
|
||||
<el-form-item :label="$t('trials:signRecords:table:user')" v-if="!isSystem">
|
||||
<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-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.ConfirmUserId" :label="item.FullName"
|
||||
:value="item.ConfirmUserId">
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -5,62 +5,127 @@
|
|||
<el-form :inline="true">
|
||||
<!-- 中心 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:siteId')">
|
||||
<el-select v-model="searchData.TrialSiteId" clearable filterable style="width: 120px">
|
||||
<el-option v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteCode"
|
||||
:value="item.TrialSiteId" />
|
||||
<el-select
|
||||
v-model="searchData.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-form-item>
|
||||
<!-- 联系人 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:contactor')">
|
||||
<el-input v-model="searchData.UserKeyInfo" class="mr" clearable :placeholder="`${$t(
|
||||
<el-input
|
||||
v-model="searchData.UserKeyInfo"
|
||||
class="mr"
|
||||
clearable
|
||||
:placeholder="`${$t(
|
||||
'trials:researchRecord:placeholder:contactorInfo'
|
||||
)}`" style="width: 140px" />
|
||||
)}`"
|
||||
style="width: 140px"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- 初审人 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:preliminaryUser')">
|
||||
<el-input v-model="searchData.PreliminaryUserName" class="mr" clearable style="width: 140px" />
|
||||
<el-form-item
|
||||
:label="$t('trials:researchRecord:table:preliminaryUser')"
|
||||
>
|
||||
<el-input
|
||||
v-model="searchData.PreliminaryUserName"
|
||||
class="mr"
|
||||
clearable
|
||||
style="width: 140px"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- 审核人 -->
|
||||
<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 :label="$t('trials:researchRecord:table:status')">
|
||||
<el-select v-model="searchData.State" clearable filterable style="width: 120px">
|
||||
<el-option v-for="(item, index) of $d.ResearchRecord" :key="index" :label="item.label"
|
||||
:value="item.value" />
|
||||
<el-select
|
||||
v-model="searchData.State"
|
||||
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-form-item>
|
||||
<!-- 是否废除 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:isDeleted')">
|
||||
<el-select v-model="searchData.IsDeleted" 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
|
||||
v-model="searchData.IsDeleted"
|
||||
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-form-item>
|
||||
<!-- 更新时间 -->
|
||||
<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"
|
||||
style="width: 250px" />
|
||||
<el-date-picker
|
||||
v-model="searchData.DateRange"
|
||||
type="daterange"
|
||||
value-format="yyyy-MM-dd"
|
||||
format="yyyy-MM-dd"
|
||||
style="width: 250px"
|
||||
/>
|
||||
</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">
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-refresh-left"
|
||||
@click="handleReset"
|
||||
>
|
||||
{{ $t('common:button:reset') }}
|
||||
</el-button>
|
||||
<!-- 中心人员 -->
|
||||
<el-button v-hasPermi="[
|
||||
<el-button
|
||||
v-hasPermi="[
|
||||
'trials:trials-panel:attachments:site-research:summary-record',
|
||||
]" type="primary" icon="el-icon-info" @click="showResearchUser">
|
||||
]"
|
||||
type="primary"
|
||||
icon="el-icon-info"
|
||||
@click="showResearchUser"
|
||||
>
|
||||
{{ $t('trials:researchRecord:button:questionStaffs') }}
|
||||
</el-button>
|
||||
<!-- 调查表链接 -->
|
||||
<el-button v-hasPermi="[
|
||||
<el-button
|
||||
v-hasPermi="[
|
||||
'trials:trials-panel:attachments:site-research:questionnaire-link',
|
||||
]" type="primary" icon="el-icon-link" @click="showResearchLink">
|
||||
]"
|
||||
type="primary"
|
||||
icon="el-icon-link"
|
||||
@click="showResearchLink"
|
||||
>
|
||||
{{ $t('trials:researchRecord:button:questionLink') }}
|
||||
</el-button>
|
||||
</el-form>
|
||||
|
|
@ -68,27 +133,61 @@
|
|||
|
||||
<template slot="main-container">
|
||||
<!-- 系统文件列表 -->
|
||||
<el-table ref="siteResearchList" v-loading="loading" v-adaptive="{ bottomOffset: 60 }" :data="list" stripe
|
||||
height="100" @sort-change="handleSortByColumn">
|
||||
<el-table
|
||||
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 prop="TrialSiteCode" :label="$t('trials:researchRecord:table:siteId')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip />
|
||||
<el-table-column
|
||||
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"
|
||||
sortable="custom" show-overflow-tooltip />
|
||||
<el-table-column
|
||||
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"
|
||||
sortable="custom" show-overflow-tooltip />
|
||||
<el-table-column
|
||||
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"
|
||||
show-overflow-tooltip />
|
||||
<el-table-column
|
||||
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"
|
||||
show-overflow-tooltip />
|
||||
<el-table-column
|
||||
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')"
|
||||
min-width="150" show-overflow-tooltip>
|
||||
<el-table-column
|
||||
prop="preliminaryUser"
|
||||
:label="$t('trials:researchRecord:table:preliminaryUser')"
|
||||
min-width="150"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
{{
|
||||
scope.row.PreliminaryUser
|
||||
|
|
@ -98,15 +197,24 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<!-- 审核人 -->
|
||||
<el-table-column prop="ReviewerUser" :label="$t('trials:researchRecord:table:ReviewerUser')" min-width="150"
|
||||
show-overflow-tooltip>
|
||||
<el-table-column
|
||||
prop="ReviewerUser"
|
||||
:label="$t('trials:researchRecord:table:ReviewerUser')"
|
||||
min-width="150"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.ReviewerUser ? scope.row.ReviewerUser.RealName : '' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 状态 -->
|
||||
<el-table-column prop="State" :label="$t('trials:researchRecord:table:status')" min-width="150"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<el-table-column
|
||||
prop="State"
|
||||
:label="$t('trials:researchRecord:table:status')"
|
||||
min-width="150"
|
||||
sortable="custom"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.State === 0" type="primary">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
|
|
@ -123,8 +231,13 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<!-- 是否废除 -->
|
||||
<el-table-column prop="IsDeleted" :label="$t('trials:researchRecord:table:isDeleted')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<el-table-column
|
||||
prop="IsDeleted"
|
||||
:label="$t('trials:researchRecord:table:isDeleted')"
|
||||
min-width="100"
|
||||
sortable="custom"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.IsDeleted" type="danger">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
|
|
@ -135,59 +248,88 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<!-- 更新时间 -->
|
||||
<el-table-column prop="UpdateTime" :label="$t('trials:researchRecord:table:updateTime')" min-width="150"
|
||||
show-overflow-tooltip sortable="custom" />
|
||||
<el-table-column
|
||||
prop="UpdateTime"
|
||||
:label="$t('trials:researchRecord:table:updateTime')"
|
||||
min-width="150"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
/>
|
||||
<el-table-column width="150">
|
||||
<template slot-scope="scope">
|
||||
<!-- 查看 -->
|
||||
<el-button :disabled="scope.row.State !== 3" circle :title="$t('common:button:view')" icon="el-icon-view"
|
||||
@click="handleViewResearchList(scope.row)" />
|
||||
<el-button
|
||||
: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
|
||||
v-hasPermi="[
|
||||
'trials:trials-panel:attachments:site-research:auidt',
|
||||
]" :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)" />
|
||||
]"
|
||||
: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
|
||||
v-hasPermi="[
|
||||
'trials:trials-panel:attachments:site-research:abolish',
|
||||
]" :disabled="scope.row.State !== 0 || scope.row.IsDeleted" circle
|
||||
: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>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页组件 -->
|
||||
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
|
||||
@pagination="getList" />
|
||||
<pagination
|
||||
class="page"
|
||||
:total="total"
|
||||
:page.sync="searchData.PageIndex"
|
||||
:limit.sync="searchData.PageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<!-- 中心人员 -->
|
||||
<el-dialog v-if="researchUserVisible" :visible.sync="researchUserVisible"
|
||||
: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">
|
||||
<el-dialog
|
||||
v-if="researchUserVisible"
|
||||
:visible.sync="researchUserVisible"
|
||||
: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" />
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 调查表 -->
|
||||
<el-dialog v-if="researchInfoVisible" :visible.sync="researchInfoVisible" :fullscreen="true"
|
||||
:close-on-click-modal="false">
|
||||
<el-dialog
|
||||
v-if="researchInfoVisible"
|
||||
:visible.sync="researchInfoVisible"
|
||||
:fullscreen="true"
|
||||
:close-on-click-modal="false"
|
||||
>
|
||||
<research-form v-if="researchInfoVisible" @refreshPage="getList" />
|
||||
</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">
|
||||
<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 class="shareLink">
|
||||
<!-- <div>
|
||||
|
|
@ -199,11 +341,22 @@
|
|||
<div style="margin: 10px 0">
|
||||
<!-- 链接: -->
|
||||
{{ $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>
|
||||
<!-- 复制链接 -->
|
||||
<el-button type="primary" round @click="copyLink" class="shareLinkBtn">
|
||||
<el-button
|
||||
type="primary"
|
||||
round
|
||||
@click="copyLink"
|
||||
class="shareLinkBtn"
|
||||
>
|
||||
{{ $t('trials:researchRecord:button:copyLink') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
|
@ -238,7 +391,6 @@ import Pagination from '@/components/Pagination'
|
|||
import Users from './components/users'
|
||||
import ResearchForm from '@/views/research/form'
|
||||
import BaseModel from '@/components/BaseModel'
|
||||
import ImageManual from './components/ImageManual'
|
||||
import QRCode from 'qrcodejs2'
|
||||
|
||||
const searchDataDefault = () => {
|
||||
|
|
@ -258,7 +410,7 @@ const searchDataDefault = () => {
|
|||
}
|
||||
export default {
|
||||
name: 'SiteResearchList',
|
||||
components: { BaseContainer, Pagination, Users, ResearchForm, BaseModel, ImageManual },
|
||||
components: { BaseContainer, Pagination, Users, ResearchForm, BaseModel },
|
||||
data() {
|
||||
return {
|
||||
searchData: searchDataDefault(),
|
||||
|
|
@ -277,9 +429,6 @@ export default {
|
|||
shareLink: '',
|
||||
researchState: this.$d.ResearchRecord,
|
||||
qrcode: null,
|
||||
|
||||
ImageManualVisible: false,
|
||||
trialSiteSurveyId: null
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
|
@ -287,10 +436,6 @@ export default {
|
|||
this.getSite()
|
||||
},
|
||||
methods: {
|
||||
openImageManual() {
|
||||
// if (!this.trialSiteSurveyId) return false
|
||||
this.ImageManualVisible = true
|
||||
},
|
||||
// 获取系统文件数据
|
||||
getList() {
|
||||
this.loading = true
|
||||
|
|
@ -343,7 +488,8 @@ export default {
|
|||
copyLink() {
|
||||
// 中心调研表链接
|
||||
this.$copyText(
|
||||
`${this.$t('trials:researchRecord:message:researchFormLink')}: ${this.shareLink
|
||||
`${this.$t('trials:researchRecord:message:researchFormLink')}: ${
|
||||
this.shareLink
|
||||
}`
|
||||
)
|
||||
.then((res) => {
|
||||
|
|
@ -418,7 +564,6 @@ export default {
|
|||
const trialId = this.trialId
|
||||
this.shareLink = `${location.protocol}//${location.host}/researchLogin?trialId=${trialId}&lang=${this.$i18n.locale}`
|
||||
this.share_model.visible = true
|
||||
// this.trialSiteSurveyId = this.list[0].Id
|
||||
this.$nextTick(() => {
|
||||
this.creatQrCode()
|
||||
})
|
||||
|
|
@ -466,21 +611,18 @@ export default {
|
|||
padding-right: 20px;
|
||||
width: 50%;
|
||||
position: relative;
|
||||
|
||||
.shareLinkBtn {
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
left: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.shareCode {
|
||||
width: 50%;
|
||||
border-left: 1px solid #eee;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.qrCode {
|
||||
width: 220px;
|
||||
height: 220px;
|
||||
|
|
@ -491,7 +633,6 @@ export default {
|
|||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.codeBtnBox {
|
||||
margin-top: 20px;
|
||||
width: 100%;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
<template slot-scope="scope">
|
||||
<el-button type="text" @click="
|
||||
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>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
<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 v-for="qs in questions" :key="qs.Id">
|
||||
<h4 v-if="qs.Type === 'group'">{{ qs.GroupName }}</h4>
|
||||
|
|
@ -37,9 +42,14 @@
|
|||
</el-select>
|
||||
</el-form-item>
|
||||
</div> -->
|
||||
<AssessmentFormItem v-for="question of questions" :key="question.Id" :question="question" :question-form="form"
|
||||
:readingTaskState="readingTaskState" @setFormItemData="setFormItemData"
|
||||
@resetFormItemData="resetFormItemData" />
|
||||
<AssessmentFormItem
|
||||
v-for="question of questions"
|
||||
:key="question.Id"
|
||||
:question="question"
|
||||
:question-form="form"
|
||||
@setFormItemData="setFormItemData"
|
||||
@resetFormItemData="resetFormItemData"
|
||||
/>
|
||||
|
||||
</div>
|
||||
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
|
||||
|
|
@ -47,7 +57,11 @@
|
|||
<el-button size="small" @click="handleCancel">
|
||||
{{ $t('common:button:cancel') }}
|
||||
</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') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
|
|
@ -71,14 +85,6 @@ export default {
|
|||
default() {
|
||||
return []
|
||||
}
|
||||
},
|
||||
readingTaskState: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
additionalAssessmentsType: {
|
||||
type: String,
|
||||
default: 'edit'
|
||||
}
|
||||
},
|
||||
data() {
|
||||
|
|
@ -120,7 +126,7 @@ export default {
|
|||
}
|
||||
const res = await submitTaskAdditionalQuestion(params)
|
||||
if (res.IsSuccess) {
|
||||
this.$emit('sign', this.additionalAssessmentsType)
|
||||
this.$emit('sign')
|
||||
}
|
||||
loading.close()
|
||||
} catch (e) {
|
||||
|
|
|
|||
|
|
@ -1,39 +1,67 @@
|
|||
<template>
|
||||
<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;">
|
||||
{{ language === 'en' ? question.GroupEnName : question.GroupName }}
|
||||
{{ language==='en'?question.GroupEnName:question.GroupName }}
|
||||
</h4>
|
||||
</div>
|
||||
<template v-else>
|
||||
<el-form-item :label="`${language === 'en' ? question.QuestionEnName : question.QuestionName}`"
|
||||
:prop="question.Id" :rules="[
|
||||
{
|
||||
required: true,
|
||||
message: $t('common:ruleMessage:select'), trigger: ['blur', 'change']
|
||||
},
|
||||
]" :class="[question.Type === 'group' ? 'mb' : '']">
|
||||
<el-form-item
|
||||
:label="`${language==='en'?question.QuestionEnName:question.QuestionName}`"
|
||||
:prop="question.Id"
|
||||
:rules="[
|
||||
{ required: true,
|
||||
message: $t('common:ruleMessage:select'), trigger: ['blur', 'change']},
|
||||
]"
|
||||
:class="[question.Type==='group'?'mb':'']"
|
||||
>
|
||||
<!-- 下拉框 -->
|
||||
<el-select v-if="question.Type === 'select'" v-model="questionForm[question.Id]" clearable
|
||||
@change="((val) => { formItemChange(val, question) })" :disabled="readingTaskState >= 2">
|
||||
<el-select
|
||||
v-if="question.Type==='select'"
|
||||
v-model="questionForm[question.Id]"
|
||||
clearable
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<template v-if="question.DictionaryCode">
|
||||
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
|
||||
:label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<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>
|
||||
</el-select>
|
||||
<!-- 单选 -->
|
||||
<el-radio-group v-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
|
||||
@change="((val) => { formItemChange(val, question) })" :disabled="readingTaskState >= 2">
|
||||
<el-radio-group
|
||||
v-if="question.Type==='radio'"
|
||||
v-model="questionForm[question.Id]"
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
|
|
@ -41,9 +69,14 @@
|
|||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<AssessmentFormItem v-for="(item) in question.Childrens" :key="item.Id" :question="item"
|
||||
:readingTaskState="readingTaskState" :question-form="questionForm" @setFormItemData="setFormItemData"
|
||||
@resetFormItemData="resetFormItemData" />
|
||||
<AssessmentFormItem
|
||||
v-for="(item) in question.Childrens"
|
||||
:key="item.Id"
|
||||
:question="item"
|
||||
:question-form="questionForm"
|
||||
@setFormItemData="setFormItemData"
|
||||
@resetFormItemData="resetFormItemData"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
|
@ -62,10 +95,6 @@ export default {
|
|||
default() {
|
||||
return []
|
||||
}
|
||||
},
|
||||
readingTaskState: {
|
||||
type: Number,
|
||||
default: 0
|
||||
}
|
||||
},
|
||||
data() {
|
||||
|
|
@ -110,7 +139,7 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.mb {
|
||||
.mb{
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -1194,7 +1194,7 @@ export default {
|
|||
cornerstoneTools.addToolForElement(element, cornerstoneTools.WwwcRegionTool)
|
||||
}
|
||||
if (!cornerstoneTools.getToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool)) {
|
||||
cornerstoneTools.addToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool, { configuration: { loop: true, } })
|
||||
cornerstoneTools.addToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool)
|
||||
}
|
||||
cornerstoneTools.setToolActiveForElement(element, 'StackScrollMouseWheel', {})
|
||||
|
||||
|
|
@ -1307,9 +1307,6 @@ export default {
|
|||
this.isFirstLoadIns = false
|
||||
// this.initWwc()
|
||||
this.imageId = instanceId
|
||||
if (this.isInitWwwc) {
|
||||
this.resetWwwc()
|
||||
}
|
||||
}
|
||||
|
||||
this.stack.instanceId = instanceId
|
||||
|
|
@ -1329,6 +1326,9 @@ export default {
|
|||
this.scrollSyncInfo.offset = 0
|
||||
}
|
||||
this.renderMeasuredData(e)
|
||||
if (this.isInitWwwc) {
|
||||
this.resetWwwc()
|
||||
}
|
||||
},
|
||||
getOrientationMarker(element) {
|
||||
const enabledElement = cornerstone.getEnabledElement(element)
|
||||
|
|
@ -1708,7 +1708,7 @@ export default {
|
|||
resetWwwc() {
|
||||
// console.log('resetWwwc')
|
||||
this.isInitWwwc = true
|
||||
// this.toolState.viewportInvert = false
|
||||
this.toolState.viewportInvert = false
|
||||
var viewport = cornerstone.getViewport(this.canvas)
|
||||
// viewport.invert = false
|
||||
var image = cornerstone.getImage(this.canvas)
|
||||
|
|
@ -1839,9 +1839,6 @@ export default {
|
|||
// console.log(toolName)
|
||||
// cornerstoneTools.setToolPassiveForElement(this.canvas, toolName)
|
||||
// })
|
||||
if (toolName === 'Wwwc') {
|
||||
this.isInitWwwc = false
|
||||
}
|
||||
this.activeToolName = toolName
|
||||
this.$nextTick(() => {
|
||||
// console.log(cornerstoneTools.isToolActiveForElement(this.canvas, 'Bidirectional'))
|
||||
|
|
|
|||
|
|
@ -214,25 +214,56 @@
|
|||
<!-- @dblclick.native="reloadViewport('CT_AXIAL')" -->
|
||||
<div ref="dicomContainer" class="dicom-container box box_2_2" style="position: relative;"
|
||||
@dblclick="reloadViewport">
|
||||
<Viewport ref="CT_AXIAL" :index="1" :active-index="activeIndex"
|
||||
:is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="ctSeries"
|
||||
:rendering-engine-id="renderingEngineId" viewport-id="CT_AXIAL" :volume="ctVolume"
|
||||
:measure-datas="measureDatas" :style="1 === activeIndex ? viewportStyle : {}"
|
||||
@upperRangeChange="upperRangeChange" />
|
||||
<Viewport ref="PT_AXIAL" :index="2" :active-index="activeIndex"
|
||||
:is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries"
|
||||
: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" />
|
||||
<Viewport
|
||||
ref="CT_AXIAL"
|
||||
:index="1"
|
||||
:active-index="activeIndex"
|
||||
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
||||
:series-info="ctSeries"
|
||||
:rendering-engine-id="renderingEngineId"
|
||||
viewport-id="CT_AXIAL" :volume="ctVolume"
|
||||
:measure-datas="measureDatas"
|
||||
:style="1 === activeIndex ? viewportStyle : {}"
|
||||
@upperRangeChange="upperRangeChange"
|
||||
/>
|
||||
<Viewport
|
||||
ref="PT_AXIAL"
|
||||
:index="2"
|
||||
:active-index="activeIndex"
|
||||
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
||||
:series-info="petSeries"
|
||||
: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 class="form-container" style="overflow-y: auto;">
|
||||
|
|
@ -242,22 +273,19 @@
|
|||
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
||||
</h3>
|
||||
|
||||
<TableQuestions ref="tableQuestions" @handleReadingChart="handleReadingChart" />
|
||||
<Questions ref="questions" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
|
||||
@handleReadingChart="handleReadingChart" />
|
||||
<TableQuestions ref="tableQuestions" />
|
||||
<Questions ref="questions" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<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">
|
||||
<custom-wwwc-form :ww="activeCanvasWW" :wc="activeCanvasWC" @close="customWwc.visible = false"
|
||||
@setWwwc="setWwwc" />
|
||||
<custom-wwwc-form :ww="activeCanvasWW" :wc="activeCanvasWC" @close="customWwc.visible = false" @setWwwc="setWwwc" />
|
||||
</el-dialog>
|
||||
<el-dialog :visible.sync="fusion.visible" :close-on-click-modal="false" :title="$t('trials:lugano:button:record')"
|
||||
width="850px">
|
||||
<fusion-form @close="fusion.visible = false" />
|
||||
</el-dialog>
|
||||
<readingChart ref="readingChart" />
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
|
@ -305,7 +333,6 @@ import vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunc
|
|||
// import vtkOrientationMarkerWidget from '@kitware/vtk.js/Interaction/Widgets/OrientationMarkerWidget'
|
||||
import { mat4, vec3 } from 'gl-matrix'
|
||||
import html2canvas from 'html2canvas'
|
||||
import readingChart from '@/components/readingChart'
|
||||
// import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'
|
||||
// import vtkMath from '@kitware/vtk.js/Common/Core/Math'
|
||||
// import CircleROITool from './tools/CircleROITool'
|
||||
|
|
@ -393,8 +420,7 @@ export default {
|
|||
Questions,
|
||||
TableQuestions,
|
||||
CustomWwwcForm,
|
||||
FusionForm,
|
||||
readingChart
|
||||
FusionForm
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
|
@ -556,7 +582,6 @@ export default {
|
|||
this.screenshotWindow = window.open(routeData.href, '_blank')
|
||||
})
|
||||
window.addEventListener('beforeunload', e => { this.beforeUnloadHandler(e) })
|
||||
document.addEventListener("click", this.foo);
|
||||
},
|
||||
beforeDestroy() {
|
||||
if (this.screenshotWindow) {
|
||||
|
|
@ -579,21 +604,7 @@ export default {
|
|||
window.removeEventListener('beforeunload', e => { this.beforeUnloadHandler(e) })
|
||||
},
|
||||
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() {
|
||||
const resizeObserver = new ResizeObserver(() => {
|
||||
if (element_ct.style.width) {
|
||||
|
|
@ -1494,10 +1505,6 @@ export default {
|
|||
await setVolumesForViewports(
|
||||
renderingEngine,
|
||||
[
|
||||
{
|
||||
volumeId: ptVolumeId,
|
||||
callback: setPetColorMapTransferFunctionForVolumeActor
|
||||
},
|
||||
{
|
||||
volumeId: ctVolumeId,
|
||||
callback: setCtTransferFunctionForVolumeActor
|
||||
|
|
@ -1708,7 +1715,7 @@ export default {
|
|||
},
|
||||
voiChange(v) {
|
||||
let viewportIds = ['FUSION_AXIAL', 'PT_AXIAL', 'PET_MIP_CORONAL']
|
||||
viewportIds.map(viewportId => {
|
||||
viewportIds.map(viewportId=>{
|
||||
// const volumeId = viewportId === 'viewportId' ? ptVolumeId : ctVolumeId
|
||||
const volumeId = ptVolumeId
|
||||
const voiRange = { lower: 0, upper: v }
|
||||
|
|
@ -1736,7 +1743,7 @@ export default {
|
|||
async setColorMap(rgbPresetName) {
|
||||
this.rgbPresetName = rgbPresetName
|
||||
let viewports = ['FUSION_AXIAL', 'PT_AXIAL', 'PET_MIP_CORONAL']
|
||||
viewports.map(v => {
|
||||
viewports.map(v=>{
|
||||
this.$refs[v].setPreset(this.rgbPresetName)
|
||||
this.$refs[v].renderColorBar(this.rgbPresetName)
|
||||
this.createColorBar(this.rgbPresetName, 'colorBarCanvas', 256, 15)
|
||||
|
|
@ -1855,8 +1862,8 @@ export default {
|
|||
const renderingEngine = getRenderingEngine(renderingEngineId)
|
||||
const viewport = renderingEngine.getViewport(viewporId)
|
||||
const { invert } = viewport.getProperties()
|
||||
if (this.isFusion) {
|
||||
viewport.setProperties({ invert: !invert }, volumeId)
|
||||
if ( this.isFusion ) {
|
||||
viewport.setProperties({ invert: !invert }, volumeId )
|
||||
}
|
||||
viewport.setProperties({ invert: !invert })
|
||||
viewport.render()
|
||||
|
|
@ -1980,7 +1987,7 @@ export default {
|
|||
const viewport = renderingEngine.getViewport(viewportId)
|
||||
const lower = v.wc - v.ww / 2
|
||||
const upper = v.wc + v.ww / 2 - 1
|
||||
viewport.setProperties({ voiRange: { upper: upper, lower: lower } })
|
||||
viewport.setProperties({ voiRange: { upper: upper, lower: lower }})
|
||||
viewport.render()
|
||||
this.customWwc.visible = false
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,219 +1,305 @@
|
|||
<template>
|
||||
<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;">
|
||||
{{ language === 'en' ? question.GroupEnName : question.GroupName }}
|
||||
{{ language==='en'?question.GroupEnName:question.GroupName }}
|
||||
</h4>
|
||||
</div>
|
||||
<template v-else-if="((question.QuestionType === 56) && question.IsBaseLineTask)" />
|
||||
<template v-else>
|
||||
<el-form-item
|
||||
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
|
||||
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[
|
||||
{
|
||||
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' : '']">
|
||||
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0"
|
||||
:label="`${question.QuestionName}`"
|
||||
:prop="question.Id"
|
||||
:rules="[
|
||||
{ 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':'']"
|
||||
>
|
||||
<template v-if="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;justify-content: space-between;" v-if="question.Type === 'calculation'">
|
||||
<el-input v-model="questionForm[question.Id]" disabled style="width: 120px;">
|
||||
<el-input
|
||||
v-if="question.Type==='calculation'"
|
||||
v-model="questionForm[question.Id]"
|
||||
disabled
|
||||
style="width: 120px;"
|
||||
>
|
||||
<template v-if="question.Unit" slot="append">
|
||||
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
|
||||
</template>
|
||||
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart"
|
||||
class="svg-icon svg-readingChart" @click.stop="(e) => handleReadingChart({
|
||||
e,
|
||||
data: {
|
||||
QuestionId: question.Id,
|
||||
RowIndex: questionForm.RowIndex,
|
||||
QuestionName: question.QuestionName
|
||||
}
|
||||
})" />
|
||||
</el-input>
|
||||
</div>
|
||||
|
||||
<!-- 测量 -->
|
||||
<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 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
|
||||
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 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
|
||||
v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume))"
|
||||
size="mini" type="text" style="padding: '7px 5px';margin-left:-5px;"
|
||||
@click="locateAnnotation(question)">{{
|
||||
$t('trials:lugano:button:locateAnnotation') }}</el-button>
|
||||
size="mini"
|
||||
type="text"
|
||||
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"
|
||||
style="padding: '7px 5px';margin-left:-5px;" @click="saveAnnotation(question)">
|
||||
<el-button v-if="readingTaskState!== 2 && question.SaveEnum === 1" size="mini" type="text" style="padding: '7px 5px';margin-left:-5px;" @click="saveAnnotation(question)">
|
||||
<!-- 未保存 -->
|
||||
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
|
||||
<i class="el-icon-warning" style="color:red" />
|
||||
</el-tooltip>
|
||||
{{ $t('common:button:save') }}
|
||||
</el-button>
|
||||
<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>
|
||||
<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>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else-if="question.QuestionType === 53">
|
||||
<div style="display: flex;justify-content: space-between;" v-if="question.Type === 'calculation'">
|
||||
<el-input v-model="questionForm[question.Id]" disabled>
|
||||
<el-input
|
||||
v-if="question.Type==='calculation'"
|
||||
v-model="questionForm[question.Id]"
|
||||
disabled
|
||||
>
|
||||
<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,
|
||||
RowIndex: questionForm.RowIndex,
|
||||
QuestionName: question.QuestionName
|
||||
}
|
||||
})" />
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<template v-else-if="question.QuestionType === 55">
|
||||
<el-select v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" clearable
|
||||
@change="((val) => { formItemChange(val, question) })">
|
||||
<el-select
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2 "
|
||||
clearable
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<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>
|
||||
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
|
||||
:label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
</el-option-group>
|
||||
</el-select>
|
||||
</template>
|
||||
<template v-else-if="question.QuestionType === 56">
|
||||
<el-select v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" clearable
|
||||
@change="((val) => { formItemChange(val, question) })">
|
||||
<el-select
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2 "
|
||||
clearable
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<el-option-group
|
||||
: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"
|
||||
:value="String(item.value)" :label="item.label" />
|
||||
: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"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
|
||||
:label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
</el-option-group>
|
||||
</el-select>
|
||||
</template>
|
||||
<template v-else-if="question.QuestionType === 57">
|
||||
<el-select v-model="questionForm[question.Id]" :disabled="readingTaskState >= 2" clearable
|
||||
@change="((val) => { formItemChange(val, question) })">
|
||||
<el-select
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2 "
|
||||
clearable
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<el-option-group
|
||||
: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"
|
||||
:value="String(item.value)" :label="item.label" />
|
||||
: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"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
|
||||
:label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
</el-option-group>
|
||||
</el-select>
|
||||
</template>
|
||||
<!-- 输入框 -->
|
||||
<el-input v-else-if="question.Type === 'input'" v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2" />
|
||||
<el-input
|
||||
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"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2" />
|
||||
<el-input
|
||||
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"
|
||||
clearable @change="((val) => { formItemChange(val, question) })">
|
||||
clearable
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<template v-if="question.TableQuestionType === 1">
|
||||
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
|
||||
:value="item[question.DataTableColumn]" />
|
||||
<el-option
|
||||
v-for="item in organList"
|
||||
:key="item.Id"
|
||||
:label="item[question.DataTableColumn]"
|
||||
:value="item[question.DataTableColumn]"
|
||||
/>
|
||||
</template>
|
||||
<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)"
|
||||
:label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<template
|
||||
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
|
||||
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
|
||||
:label="item.label" />
|
||||
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<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>
|
||||
</el-select>
|
||||
<!-- 单选 -->
|
||||
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })">
|
||||
<el-radio-group
|
||||
v-else-if="question.Type==='radio'"
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2"
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-radio-group>
|
||||
<!-- 复选框 -->
|
||||
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2">
|
||||
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
|
||||
<el-checkbox-group
|
||||
v-else-if="question.Type==='checkbox'"
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2"
|
||||
>
|
||||
<el-checkbox
|
||||
v-for="val in question.TypeValue.split('|')"
|
||||
:key="val"
|
||||
:label="val"
|
||||
>
|
||||
{{ val }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
<!-- 数值 -->
|
||||
|
||||
<div style="display: flex;justify-content: space-between;"
|
||||
v-else-if="question.Type === 'calculation' || question.Type === 'number'">
|
||||
<el-input-number v-if="question.Type === 'number'" v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2" />
|
||||
<el-input v-model="questionForm[question.Id]" disabled v-else />
|
||||
<svg-icon v-if="question.ShowChartTypeEnum > 0" icon-class="readingChart" class="svg-icon svg-readingChart"
|
||||
@click.stop="(e) => handleReadingChart({
|
||||
e,
|
||||
data: {
|
||||
QuestionId: question.Id,
|
||||
RowIndex: questionForm.RowIndex,
|
||||
QuestionName: question.QuestionName
|
||||
}
|
||||
})" />
|
||||
</div>
|
||||
|
||||
<el-input-number
|
||||
v-else-if="question.Type==='number'"
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2"
|
||||
/>
|
||||
<el-input
|
||||
v-else-if="question.Type==='calculation'"
|
||||
v-model="questionForm[question.Id]"
|
||||
disabled
|
||||
/>
|
||||
<!-- 上传图像 -->
|
||||
<el-upload v-if="question.Type === 'upload'" action :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">
|
||||
<el-upload
|
||||
v-if="question.Type==='upload'"
|
||||
action
|
||||
: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" />
|
||||
<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-preview" @click="handlePictureCardPreview(file)">
|
||||
<span
|
||||
class="el-upload-list__item-preview"
|
||||
@click="handlePictureCardPreview(file)"
|
||||
>
|
||||
<i class="el-icon-zoom-in" />
|
||||
</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" />
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</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%">
|
||||
<div slot="placeholder" class="image-slot">
|
||||
加载中<span class="dot">...</span>
|
||||
|
|
@ -223,11 +309,19 @@
|
|||
</el-form-item>
|
||||
</template>
|
||||
<template v-for="item of question.Childrens">
|
||||
<QuestionItem v-if="item.QuestionClassify === 0" :key="item.Id" :question="item"
|
||||
: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"
|
||||
@handleReadingChart="handleReadingChart" />
|
||||
<QuestionItem
|
||||
v-if="item.QuestionClassify === 0"
|
||||
:key="item.Id"
|
||||
:question="item"
|
||||
: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>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -312,9 +406,6 @@ export default {
|
|||
}
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
formItemChange(v, question) {
|
||||
if (question.QuestionType === 55) {
|
||||
this.$emit('setFormItemData', { key: question.Id, val: v })
|
||||
|
|
@ -350,7 +441,7 @@ export default {
|
|||
.then(() => {
|
||||
FusionEvent.$emit('removeAnnotation', question)
|
||||
})
|
||||
.catch(() => { })
|
||||
.catch(() => {})
|
||||
},
|
||||
locateAnnotation(question) {
|
||||
FusionEvent.$emit('locateAnnotation', question)
|
||||
|
|
@ -412,32 +503,26 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.mb {
|
||||
.mb{
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
.disabled{
|
||||
::v-deep .el-upload--picture-card {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.uploadWrapper {
|
||||
.uploadWrapper{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
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;
|
||||
}
|
||||
|
||||
::v-deep .el-input-group__append,
|
||||
.el-input-group__prepend {
|
||||
}
|
||||
::v-deep .el-input-group__append, .el-input-group__prepend{
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
::v-deep .el-select.is-disabled .el-input__inner {
|
||||
}
|
||||
::v-deep .el-select.is-disabled .el-input__inner{
|
||||
background-color: #646464a1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -1,17 +1,29 @@
|
|||
<template>
|
||||
<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">
|
||||
<QuestionItem v-if="question.QuestionClassify === 0" :key="question.Id" :question="question"
|
||||
: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" @handleReadingChart="handleReadingChart" />
|
||||
<QuestionItem
|
||||
v-if="question.QuestionClassify === 0"
|
||||
:key="question.Id"
|
||||
:question="question"
|
||||
: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>
|
||||
<el-form-item v-if="readingTaskState < 2">
|
||||
<div style="text-align:right">
|
||||
<el-button :disabled="!questionFormChangeState" :type="questionFormChangeState ? 'primary' : null" size="mini"
|
||||
@click="handleSave">{{ $t('common:button:save') }}</el-button>
|
||||
<el-button :disabled="!questionFormChangeState" :type="questionFormChangeState ? 'primary' : null" size="mini" @click="handleSave">{{ $t('common:button:save') }}</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
|
@ -120,9 +132,6 @@ export default {
|
|||
FusionEvent.$off('locateAnnotation')
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
getQuestions1() {
|
||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||
|
||||
|
|
@ -176,7 +185,7 @@ export default {
|
|||
this.setChild(v.Childrens)
|
||||
}
|
||||
})
|
||||
console.log(this.questionForm, questions)
|
||||
console.log(this.questionForm,questions)
|
||||
this.questions = questions
|
||||
this.setPet5PSCommentDisplay()
|
||||
this.measurements = []
|
||||
|
|
@ -750,43 +759,39 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.ecrf-wrapper {
|
||||
.ecrf-wrapper{
|
||||
|
||||
::v-deep .el-form-item__label {
|
||||
::v-deep .el-form-item__label{
|
||||
color: #c3c3c3;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
::v-deep .el-input__inner {
|
||||
::v-deep .el-input__inner{
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-textarea__inner {
|
||||
::v-deep .el-textarea__inner{
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
::v-deep .el-form-item{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
::v-deep .el-form-item__content{
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-button--mini,
|
||||
.el-button--mini.is-round {
|
||||
::v-deep .el-button--mini, .el-button--mini.is-round {
|
||||
padding: 7px 10px;
|
||||
}
|
||||
|
||||
.el-form-item__content .el-select {
|
||||
.el-form-item__content
|
||||
.el-select{
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
<template>
|
||||
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
|
||||
class="measurement-form">
|
||||
<el-form
|
||||
v-if="isRender"
|
||||
ref="measurementForm"
|
||||
v-loading="loading"
|
||||
:model="questionForm"
|
||||
size="mini"
|
||||
class="measurement-form"
|
||||
>
|
||||
<div class="base-dialog-body">
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
||||
|
|
@ -13,151 +19,184 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
|
||||
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
|
||||
]">
|
||||
<el-form-item
|
||||
: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
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask"
|
||||
@change="((val) => { lesionTypeChange(val) })">
|
||||
<el-select
|
||||
v-model="questionForm.LesionType"
|
||||
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"
|
||||
:value="item.value" :label="item.label" />
|
||||
<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-form-item>
|
||||
|
||||
<template v-for="qs in questions">
|
||||
<el-form-item v-if="qs.ShowQuestion !== 2 && qs.QuestionClassify === 0" :key="qs.Id"
|
||||
: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']
|
||||
},
|
||||
]">
|
||||
<el-form-item
|
||||
v-if="qs.ShowQuestion!==2 && qs.QuestionClassify === 0"
|
||||
:key="qs.Id"
|
||||
: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']},
|
||||
]"
|
||||
>
|
||||
<!-- {{ isCurrentTaskAdd }}
|
||||
{{ questionForm.IsCanEditPosition }} -->
|
||||
|
||||
<!-- 输入框 -->
|
||||
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<template v-if="qs.Type==='input' || qs.Type==='number'">
|
||||
<!-- {{ ((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))"
|
||||
@change="((val) => { formItemChange(val, qs) })">
|
||||
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
|
||||
<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))"
|
||||
@change="((val)=>{formItemChange(val, qs)})"
|
||||
>
|
||||
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
|
||||
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
|
||||
</template>
|
||||
<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
|
||||
}
|
||||
})" />
|
||||
</el-input>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<!-- 多行文本输入框 -->
|
||||
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="!isCurrentTask || readingTaskState >= 2"
|
||||
@change="((val) => { formItemChange(val, qs) })" />
|
||||
<el-input
|
||||
v-if="qs.Type==='textarea'"
|
||||
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')"
|
||||
: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) })">
|
||||
: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)})"
|
||||
>
|
||||
<template v-if="qs.QuestionMark === 8" #prefix>
|
||||
<span style="padding-left: 5px;">
|
||||
<i class="el-icon-search" />
|
||||
</span>
|
||||
</template>
|
||||
<template v-if="qs.TableQuestionType === 1">
|
||||
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
|
||||
:value="item[qs.DataTableColumn]" />
|
||||
<el-option
|
||||
v-for="item in organList"
|
||||
:key="item.Id"
|
||||
:label="item[qs.DataTableColumn]"
|
||||
:value="item[qs.DataTableColumn]"
|
||||
/>
|
||||
</template>
|
||||
<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 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>
|
||||
|
||||
</el-select>
|
||||
<!-- 单选 -->
|
||||
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2">
|
||||
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
|
||||
<el-radio-group
|
||||
v-if="qs.Type==='radio'"
|
||||
v-model="questionForm[qs.id]"
|
||||
:disabled="!isCurrentTask || readingTaskState>=2"
|
||||
>
|
||||
<el-radio
|
||||
v-for="val in qs.options.split('|')"
|
||||
:key="val"
|
||||
:label="val"
|
||||
>
|
||||
{{ val }}
|
||||
</el-radio>
|
||||
</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;justify-content: space-between;">
|
||||
<el-input v-if="qs.Type === 'calculation'" v-model="questionForm[qs.Id]" disabled style="width:120px;">
|
||||
<el-input
|
||||
v-if="qs.Type==='calculation'"
|
||||
v-model="questionForm[qs.Id]"
|
||||
disabled
|
||||
style="width:120px;"
|
||||
>
|
||||
<template v-if="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>
|
||||
|
||||
<!-- <span style="color:#409eff;cursor: pointer" @click="previewImages(answers.RowId)">
|
||||
{{ $t('trials:lugano:button:suvscreenshot') }}
|
||||
</span> -->
|
||||
<el-button v-if="!isBaseLineTask" type="text" @click="previewImages(answers.RowId)">{{
|
||||
$t('trials:lugano:button:suvscreenshot') }}</el-button>
|
||||
<el-button v-if="!isBaseLineTask" type="text" @click="previewImages(answers.RowId)">{{ $t('trials:lugano:button:suvscreenshot') }}</el-button>
|
||||
</div>
|
||||
</template>
|
||||
<div style="display: flex;justify-content: space-between;"
|
||||
v-else-if="qs.Type === 'calculation' && qs.QuestionMark !== 20">
|
||||
<el-input v-model="questionForm[qs.Id]" disabled>
|
||||
<el-input
|
||||
v-else-if="qs.Type==='calculation' && qs.QuestionMark !== 20"
|
||||
v-model="questionForm[qs.Id]"
|
||||
disabled
|
||||
>
|
||||
<template v-if="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>
|
||||
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
|
||||
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
|
||||
style="text-align:right;margin-top:10px;">
|
||||
<div
|
||||
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') }}
|
||||
</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') }}
|
||||
</el-button>
|
||||
<!-- 保存 -->
|
||||
<el-button size="mini" @click="handleSave">
|
||||
<el-button
|
||||
size="mini"
|
||||
@click="handleSave"
|
||||
>
|
||||
{{ $t('common:button:save') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
|
@ -249,9 +288,6 @@ export default {
|
|||
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
async initForm(isRerender = false) {
|
||||
const loading = this.$loading({ fullscreen: true })
|
||||
this.questions.forEach(item => {
|
||||
|
|
@ -410,8 +446,8 @@ export default {
|
|||
type: 'warning',
|
||||
distinguishCancelAndClose: true
|
||||
})
|
||||
.then(() => { })
|
||||
.catch(() => { })
|
||||
.then(() => {})
|
||||
.catch(() => {})
|
||||
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
|
||||
return
|
||||
}
|
||||
|
|
@ -423,7 +459,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
|
||||
return
|
||||
|
|
@ -750,7 +786,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:lugano:warnning:outsideVolume'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
|
||||
return
|
||||
|
|
@ -764,7 +800,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:lugano:warnning:cannotMeasuredSUV'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
return
|
||||
}
|
||||
|
|
@ -777,7 +813,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:lugano:warnning:suvis0'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
return
|
||||
}
|
||||
|
|
@ -1018,57 +1054,47 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.measurement-form {
|
||||
::v-deep .el-form-item__label {
|
||||
.measurement-form{
|
||||
::v-deep .el-form-item__label{
|
||||
color: #c3c3c3;
|
||||
// text-align: left;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
::v-deep .el-input .el-input__inner{
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
::v-deep .el-form-item{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
::v-deep .el-form-item__content{
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
::v-deep .el-input.is-disabled .el-input__inner{
|
||||
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;
|
||||
}
|
||||
|
||||
::v-deep .el-select.is-disabled .el-input__inner {
|
||||
::v-deep .el-select.is-disabled .el-input__inner{
|
||||
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;
|
||||
}
|
||||
|
||||
.el-form-item__content .el-select {
|
||||
.el-form-item__content
|
||||
.el-select{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.input-width1 {
|
||||
width: calc(100% - 60px) !important;
|
||||
.input-width1{
|
||||
width: calc(100% - 60px)!important;
|
||||
}
|
||||
|
||||
.input-width2 {
|
||||
.input-width2{
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -3,88 +3,75 @@
|
|||
|
||||
<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">
|
||||
<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>
|
||||
<div class="lesion_list">
|
||||
<template v-for="item in qs.Childrens">
|
||||
<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 class="title">{{ 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 v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
|
||||
@click.prevent="handleAdd(item)">
|
||||
<div class="title">{{ item.QuestionName }}</div>
|
||||
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
|
||||
<i class="el-icon-plus" />
|
||||
</div>
|
||||
</div>
|
||||
<!-- @change="handleCollapseChange(qs.Childrens,item)" -->
|
||||
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
|
||||
@change="handleCollapseChange">
|
||||
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
|
||||
<el-collapse
|
||||
v-if="item.Type === 'table' && item.TableQuestions"
|
||||
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}`"
|
||||
@contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
|
||||
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)"
|
||||
>
|
||||
<template slot="title">
|
||||
<div style="width:300px;position: relative;"
|
||||
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
|
||||
<div 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
|
||||
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
|
||||
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
|
||||
<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">
|
||||
<i class="el-icon-warning" style="color:red" />
|
||||
</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">
|
||||
<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">
|
||||
<i class="el-icon-warning" style="color:#ff9800" />
|
||||
</el-tooltip>
|
||||
<div style="position: absolute;left: 50px;top: 2px;">
|
||||
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
|
||||
<div style="font-size: 11px;width:220px;height: 30px;">
|
||||
<div v-if="item.TableQuestions.Answers[i].lesionPart"
|
||||
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px">
|
||||
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
|
||||
:content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
|
||||
<div
|
||||
v-if="item.TableQuestions.Answers[i].lesionPart"
|
||||
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
|
||||
>
|
||||
<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>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div
|
||||
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
|
||||
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
|
||||
<span v-if="item.LesionType === 0">
|
||||
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
{{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
</span>
|
||||
<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 v-else>
|
||||
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
{{ $fd('NewLesionState',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;color:red;">
|
||||
<template
|
||||
v-if="item.TableQuestions.Answers[i].suvMax && !isNaN(parseFloat(item.TableQuestions.Answers[i].suvMax))">
|
||||
<div 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))">
|
||||
{{ item.TableQuestions.Answers[i].suvMax }} SUV
|
||||
</template>
|
||||
</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);">
|
||||
<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);">
|
||||
<!-- 分裂 -->
|
||||
<!-- <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)" />
|
||||
|
|
@ -94,14 +81,25 @@
|
|||
</div>
|
||||
|
||||
</template>
|
||||
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
|
||||
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
|
||||
:order-mark="item.OrderMark" :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" @changeLesionType="changeLesionType"
|
||||
@resetQuestions="resetQuestions" @determineExistsUnsavedLession="determineExistsUnsavedLession"
|
||||
@close="close" @handleReadingChart="handleReadingChart" />
|
||||
<QuestionForm
|
||||
:ref="`${item.Id}_${q.RowIndex}`"
|
||||
:questions="item.TableQuestions.Questions"
|
||||
:answers="item.TableQuestions.Answers[i]"
|
||||
:lesion-type="item.LesionType"
|
||||
:order-mark="item.OrderMark"
|
||||
: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"
|
||||
@changeLesionType="changeLesionType"
|
||||
@resetQuestions="resetQuestions"
|
||||
@determineExistsUnsavedLession="determineExistsUnsavedLession"
|
||||
@close="close"
|
||||
/>
|
||||
</el-collapse-item>
|
||||
|
||||
</el-collapse>
|
||||
|
|
@ -172,9 +170,6 @@ export default {
|
|||
beforeDestroy() {
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
initList(isRerender = false) {
|
||||
this.loading = true
|
||||
this.activeName = ''
|
||||
|
|
@ -350,7 +345,7 @@ export default {
|
|||
.then(() => {
|
||||
this.split(rowId, questionId)
|
||||
})
|
||||
.catch(() => { })
|
||||
.catch(() => {})
|
||||
} else {
|
||||
// 是否确认分裂
|
||||
this.$confirm(this.$t('trials:reading:warnning:msg4'), {
|
||||
|
|
@ -360,7 +355,7 @@ export default {
|
|||
.then(() => {
|
||||
this.split(rowId, questionId)
|
||||
})
|
||||
.catch(() => { })
|
||||
.catch(() => {})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -434,7 +429,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
return
|
||||
}
|
||||
|
|
@ -444,7 +439,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
} else {
|
||||
// saveTypeEnum: 0
|
||||
|
|
@ -587,7 +582,7 @@ export default {
|
|||
// 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 })
|
||||
// saveTypeEnum: 0
|
||||
var lesionObj = {}
|
||||
var lesionObj = { }
|
||||
var questionObj = questionsObj.questionForm
|
||||
// 切换到新的病灶集合
|
||||
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
|
||||
|
|
@ -822,20 +817,19 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.measurement-wrapper {
|
||||
.measurement-wrapper{
|
||||
|
||||
// .container{
|
||||
// padding: 10px;
|
||||
// }
|
||||
.title {
|
||||
.title{
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
.add-icon{
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
|
|
@ -844,49 +838,42 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
.add-icon:hover{
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
||||
.flex-row {
|
||||
.flex-row{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
.lesion_list{
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.el-collapse {
|
||||
border-bottom: none;
|
||||
border-top: none;
|
||||
|
||||
::v-deep .el-collapse-item {
|
||||
background-color: #000 !important;
|
||||
.el-collapse{
|
||||
border-bottom:none;
|
||||
border-top:none;
|
||||
::v-deep .el-collapse-item{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__header {
|
||||
background-color: #000 !important;
|
||||
::v-deep .el-collapse-item__header{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
border-bottom-color: #5a5a5a;
|
||||
border-bottom-color:#5a5a5a;
|
||||
padding-left: 5px;
|
||||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
::v-deep .el-collapse-item__wrap{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
::v-deep .el-collapse-item__content{
|
||||
width:260px;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
|
|
@ -895,7 +882,7 @@ export default {
|
|||
z-index: 1;
|
||||
color: #ddd;
|
||||
padding: 5px;
|
||||
background-color: #1e1e1e;
|
||||
background-color:#1e1e1e;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
<template>
|
||||
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
|
||||
class="measurement-form">
|
||||
<el-form
|
||||
v-if="isRender"
|
||||
ref="measurementForm"
|
||||
v-loading="loading"
|
||||
:model="questionForm"
|
||||
size="mini"
|
||||
class="measurement-form"
|
||||
>
|
||||
<div class="base-dialog-body">
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
||||
|
|
@ -13,119 +19,179 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<el-form-item :label="$t('trials:reading:title:lesionType')" prop="LesionType" :rules="[
|
||||
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
|
||||
]">
|
||||
<el-form-item
|
||||
: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
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || (!isBaseLineTask && !(isFirstChangeTask && (lesionType === 2 || lesionType === 5 || lesionType === 6)))"
|
||||
@change="((val) => { lesionTypeChange(val) })">
|
||||
<el-select
|
||||
v-model="questionForm.LesionType"
|
||||
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))"
|
||||
:key="item.id" :value="item.value" :label="item.label" />
|
||||
:key="item.id"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :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']
|
||||
},
|
||||
]">
|
||||
<el-form-item
|
||||
v-for="qs in questions"
|
||||
v-show="qs.ShowQuestion!==2"
|
||||
:key="qs.Id"
|
||||
: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'">
|
||||
<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)) || (isFirstChangeTask && (lesionType === 5 || lesionType === 6) && (qs.QuestionMark === 8 || qs.QuestionMark === 10))"
|
||||
@change="((val) => { formItemChange(val, qs) })">
|
||||
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
|
||||
<template v-if="qs.Type==='input' || qs.Type==='number'">
|
||||
<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)) || (isFirstChangeTask && (lesionType === 5 || lesionType === 6) && (qs.QuestionMark === 8 || qs.QuestionMark === 10 ))"
|
||||
@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>
|
||||
</template>
|
||||
<!-- 多行文本输入框 -->
|
||||
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
|
||||
@change="((val) => { formItemChange(val, qs) })" />
|
||||
<el-input
|
||||
v-if="qs.Type==='textarea'"
|
||||
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')"
|
||||
: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) })">
|
||||
: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)})"
|
||||
>
|
||||
<template v-if="qs.QuestionMark === 8" #prefix>
|
||||
<span style="padding-left: 5px;">
|
||||
<i class="el-icon-search" />
|
||||
</span>
|
||||
</template>
|
||||
<template v-if="qs.TableQuestionType === 1">
|
||||
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
|
||||
:value="item[qs.DataTableColumn]" />
|
||||
<el-option
|
||||
v-for="item in organList"
|
||||
:key="item.Id"
|
||||
:label="item[qs.DataTableColumn]"
|
||||
:value="item[qs.DataTableColumn]"
|
||||
/>
|
||||
</template>
|
||||
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
|
||||
<el-option v-for="item of $d[qs.DictionaryCode]"
|
||||
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" />
|
||||
<el-option
|
||||
v-for="item of $d[qs.DictionaryCode]"
|
||||
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
|
||||
v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isFirstChangeTask && (lesionType === 5 || lesionType === 6)">
|
||||
<el-option 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)"
|
||||
:key="item.id" :value="item.value" :label="item.label" />
|
||||
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isFirstChangeTask && (lesionType === 5 || lesionType ===6)">
|
||||
<el-option
|
||||
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)"
|
||||
:key="item.id"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
|
||||
<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'">
|
||||
<el-option v-for="item of $d[qs.DictionaryCode]"
|
||||
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 v-if="answers.IsFristAdd=== 'True' && answers.SplitOrMergeType === '0'">
|
||||
<el-option
|
||||
v-for="item of $d[qs.DictionaryCode]"
|
||||
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 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)"
|
||||
:key="item.id" :value="item.value" :label="item.label" />
|
||||
:key="item.id"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<template v-else-if="isCurrentTaskAdd === 'False' && lesionType === 1 && answers.LastTaskState !== '4'">
|
||||
<el-option v-for="item of filterState($d[qs.DictionaryCode])"
|
||||
<template v-else-if="isCurrentTaskAdd=== 'False' && lesionType === 1 && answers.LastTaskState !== '4'">
|
||||
<el-option
|
||||
v-for="item of filterState($d[qs.DictionaryCode])"
|
||||
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 v-else>
|
||||
<el-option v-for="item of filterState($d[qs.DictionaryCode])"
|
||||
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1" :key="item.id"
|
||||
:value="item.value" :label="item.label" />
|
||||
<el-option
|
||||
v-for="item of filterState($d[qs.DictionaryCode])"
|
||||
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1"
|
||||
:key="item.id"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
</el-option-group>
|
||||
</template>
|
||||
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
|
||||
<el-option v-for="item of $d[qs.DictionaryCode]"
|
||||
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1" :key="item.id"
|
||||
:value="item.value" :label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[qs.DictionaryCode]"
|
||||
v-show="crterionDictionaryGroup.indexOf(item.raw.CrterionDictionaryGroup) > -1"
|
||||
:key="item.id"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<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>
|
||||
|
||||
</el-select>
|
||||
<!-- 单选 -->
|
||||
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2">
|
||||
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
|
||||
<el-radio-group
|
||||
v-if="qs.Type==='radio'"
|
||||
v-model="questionForm[qs.id]"
|
||||
:disabled="!isCurrentTask || readingTaskState>=2"
|
||||
>
|
||||
<el-radio
|
||||
v-for="val in qs.options.split('|')"
|
||||
:key="val"
|
||||
:label="val"
|
||||
>
|
||||
{{ val }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
|
|
@ -133,21 +199,33 @@
|
|||
|
||||
</div>
|
||||
|
||||
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
|
||||
style="text-align:right;margin-top:10px;">
|
||||
<div
|
||||
v-if="isCurrentTask && readingTaskState<2"
|
||||
class="base-dialog-footer"
|
||||
style="text-align:right;margin-top:10px;"
|
||||
>
|
||||
<!-- 清除标记 -->
|
||||
<el-button
|
||||
v-if="questionForm.MeasureData && (!isFirstChangeTask || (isFirstChangeTask && (lesionType === 5 || lesionType === 6)))"
|
||||
size="mini" @click="handleDeleteMeasureData">
|
||||
size="mini"
|
||||
@click="handleDeleteMeasureData"
|
||||
>
|
||||
{{ $t('trials:reading:button:removeMark') }}
|
||||
</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') }}
|
||||
</el-button>
|
||||
<!-- 保存 -->
|
||||
<el-button v-if="(isFirstChangeTask && (lesionType === 5 || lesionType === 6)) || !isFirstChangeTask" size="mini"
|
||||
@click="handleSave">
|
||||
<el-button
|
||||
v-if="(isFirstChangeTask && (lesionType === 5 || lesionType === 6)) || !isFirstChangeTask"
|
||||
size="mini"
|
||||
@click="handleSave"
|
||||
>
|
||||
{{ $t('common:button:save') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
|
@ -252,9 +330,6 @@ export default {
|
|||
DicomEvent.$off('handleImageQualityAbnormal')
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
async initForm() {
|
||||
const loading = this.$loading({ fullscreen: true })
|
||||
this.questions.forEach(item => {
|
||||
|
|
@ -411,8 +486,8 @@ export default {
|
|||
type: 'warning',
|
||||
distinguishCancelAndClose: true
|
||||
})
|
||||
.then(() => { })
|
||||
.catch(() => { })
|
||||
.then(() => {})
|
||||
.catch(() => {})
|
||||
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
|
||||
return
|
||||
}
|
||||
|
|
@ -425,7 +500,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
|
||||
return
|
||||
|
|
@ -851,7 +926,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg19'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -863,7 +938,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg20'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -880,7 +955,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg21'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -892,7 +967,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg22'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -910,7 +985,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg23'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -922,7 +997,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg24'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -938,7 +1013,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg25'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -954,7 +1029,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg26'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -975,7 +1050,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg27'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -987,7 +1062,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg28'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1003,7 +1078,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg29'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1015,7 +1090,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg30'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1036,7 +1111,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg31'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1048,7 +1123,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg32'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1065,7 +1140,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg33'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1077,7 +1152,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg34'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1094,7 +1169,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg35'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1106,7 +1181,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg36'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1118,12 +1193,12 @@ export default {
|
|||
if (this.lesionType === 1 && lesionState === 3) {
|
||||
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'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1135,7 +1210,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg38'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1152,7 +1227,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg33'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1164,7 +1239,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg34'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1181,7 +1256,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg50'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1193,7 +1268,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg51'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1210,7 +1285,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg39'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1222,7 +1297,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg40'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1239,7 +1314,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg41'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1251,7 +1326,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg42'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1268,7 +1343,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg43'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1280,7 +1355,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg44'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1292,12 +1367,12 @@ export default {
|
|||
if (this.lesionType === 2 && lesionState === 3) {
|
||||
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'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1309,7 +1384,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg46'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1329,7 +1404,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg31'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1341,7 +1416,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg32'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1358,7 +1433,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg1'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1370,7 +1445,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg2'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1385,7 +1460,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg3'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1397,7 +1472,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg4'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1418,7 +1493,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg5'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1430,7 +1505,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg6'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1447,7 +1522,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg33'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1463,7 +1538,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg34'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1520,7 +1595,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg7'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1532,7 +1607,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg8'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1548,7 +1623,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg9'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1560,7 +1635,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg10'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1576,7 +1651,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg11'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1588,7 +1663,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg12'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1604,7 +1679,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg13'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1616,7 +1691,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg14'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1636,7 +1711,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg15'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1648,7 +1723,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg16'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1665,7 +1740,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg17'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1677,7 +1752,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg18'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1694,7 +1769,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg19'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1706,7 +1781,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg20'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1723,7 +1798,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg21'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1735,7 +1810,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg22'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1754,7 +1829,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg23'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1766,7 +1841,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg24'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1783,7 +1858,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg25'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1795,7 +1870,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg26'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1811,7 +1886,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg27'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1823,7 +1898,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg28'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1839,7 +1914,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg29'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1851,7 +1926,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:iRecist:warnning:msg30'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -2092,50 +2167,42 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.measurement-form {
|
||||
::v-deep .el-form-item__label {
|
||||
.measurement-form{
|
||||
::v-deep .el-form-item__label{
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
::v-deep .el-input .el-input__inner{
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
::v-deep .el-form-item{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
::v-deep .el-form-item__content{
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
::v-deep .el-input.is-disabled .el-input__inner{
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
::v-deep .el-select.is-disabled .el-input__inner {
|
||||
::v-deep .el-select.is-disabled .el-input__inner{
|
||||
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;
|
||||
}
|
||||
|
||||
.el-form-item__content .el-select {
|
||||
.el-form-item__content
|
||||
.el-select{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.input-width1 {
|
||||
width: calc(100% - 60px) !important;
|
||||
.input-width1{
|
||||
width: calc(100% - 60px)!important;
|
||||
}
|
||||
|
||||
.input-width2 {
|
||||
.input-width2{
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -8,48 +8,43 @@
|
|||
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
||||
</h3>
|
||||
<div v-if="readingTaskState < 2">
|
||||
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
|
||||
placement="bottom">
|
||||
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
|
||||
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
|
||||
<i
|
||||
class="el-icon-refresh-left"
|
||||
@click="resetMeasuredData"
|
||||
/>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 非测量问题 -->
|
||||
<div class="lesions">
|
||||
<Questions ref="ecrf" :question-form-change-state="questionFormChangeState"
|
||||
:question-form-change-num="questionFormChangeNum" :is-first-change-task="isFirstChangeTask"
|
||||
@handleReadingChart="handleReadingChart" />
|
||||
<Questions
|
||||
ref="ecrf"
|
||||
:question-form-change-state="questionFormChangeState"
|
||||
:question-form-change-num="questionFormChangeNum"
|
||||
:is-first-change-task="isFirstChangeTask"
|
||||
/>
|
||||
</div>
|
||||
<!-- 测量问题 -->
|
||||
<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;">
|
||||
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }}
|
||||
{{ language==='en'?qs.GroupEnName:qs.GroupName }}
|
||||
</h4>
|
||||
<div class="lesion_list">
|
||||
<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">
|
||||
<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">
|
||||
<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 }}
|
||||
<span v-if="isFirstChangeTask && item.TableQuestions.Answers.length > 0"
|
||||
style="color:red;font-size: 12px;">{{ $t("trials:reading:dicom:IRecist:reevaluate") }}</span>
|
||||
<span v-if="isFirstChangeTask && item.TableQuestions.Answers.length > 0" style="color:red;font-size: 12px;">{{ $t("trials:reading:dicom:IRecist:reevaluate") }}</span>
|
||||
</div>
|
||||
<div v-else class="title">
|
||||
{{ 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
|
||||
v-if="readingTaskState < 2 && ((!isConvertedTask && (isBaseLineTask || item.LesionType === 2)) || (isConvertedTask && !isFirstChangeTask && item.LesionType === 8))"
|
||||
class="add-icon" @click.prevent="handleAdd(item)">
|
||||
<div 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" />
|
||||
</div>
|
||||
|
||||
|
|
@ -57,134 +52,109 @@
|
|||
111
|
||||
</div> -->
|
||||
</div>
|
||||
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
|
||||
@change="handleCollapseChange">
|
||||
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
|
||||
<el-collapse
|
||||
v-if="item.Type === 'table' && item.TableQuestions"
|
||||
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}`"
|
||||
@contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
|
||||
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)"
|
||||
>
|
||||
<template slot="title">
|
||||
<div style="width:300px;position: relative;"
|
||||
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
|
||||
<div
|
||||
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
|
||||
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
|
||||
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
|
||||
<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">
|
||||
<i class="el-icon-warning" style="color:red" />
|
||||
</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">
|
||||
<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">
|
||||
<i class="el-icon-warning" style="color:#ff9800" />
|
||||
</el-tooltip>
|
||||
<div
|
||||
:style="{ position: 'absolute', left: item.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px' }">
|
||||
<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;">
|
||||
<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">
|
||||
<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>
|
||||
</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 style="position: absolute;left: 62px;top: 2px;">
|
||||
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
|
||||
<div style="font-size: 11px;width:220px;height: 30px;">
|
||||
<div v-if="item.TableQuestions.Answers[i].lesionPart"
|
||||
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px">
|
||||
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
|
||||
:content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
|
||||
<div
|
||||
v-if="item.TableQuestions.Answers[i].lesionPart"
|
||||
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
|
||||
>
|
||||
<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>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div
|
||||
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
|
||||
<div style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
|
||||
<span v-if="item.LesionType === 0">
|
||||
{{ $fd('TargetState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
{{ $fd('TargetState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
</span>
|
||||
<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 v-else-if="item.LesionType === 2">
|
||||
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
{{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
</span>
|
||||
<span v-else-if="item.LesionType === 5">
|
||||
{{ $fd('NewTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
{{ $fd('NewTargetLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
</span>
|
||||
<span v-else-if="item.LesionType === 6">
|
||||
{{ $fd('NewNoTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState))
|
||||
}}
|
||||
{{ $fd('NewNoTargetLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
</span>
|
||||
<span v-else-if="item.LesionType === 7">
|
||||
{{ $fd('OtherPreviousNewLesionState',
|
||||
parseInt(item.TableQuestions.Answers[i].lesionState))
|
||||
}}
|
||||
{{ $fd('OtherPreviousNewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
</span>
|
||||
<span v-else-if="item.LesionType === 8">
|
||||
{{
|
||||
$fd('NewLesionAfterTriggeringiRECSITState',
|
||||
parseInt(item.TableQuestions.Answers[i].lesionState))
|
||||
}}
|
||||
{{ $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))">
|
||||
<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))">
|
||||
<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
|
||||
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);">
|
||||
<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);">
|
||||
<!-- 分裂 -->
|
||||
<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">
|
||||
<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 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">
|
||||
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" />
|
||||
</el-tooltip>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
|
||||
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
|
||||
:order-mark="item.OrderMark" :table-questions="tableQuestions" :row-index="String(q.RowIndex)"
|
||||
:question-name="item.QuestionName" :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" @handleReadingChart="handleReadingChart" />
|
||||
<QuestionForm
|
||||
:ref="`${item.Id}_${q.RowIndex}`"
|
||||
:questions="item.TableQuestions.Questions"
|
||||
:answers="item.TableQuestions.Answers[i]"
|
||||
:lesion-type="item.LesionType"
|
||||
:order-mark="item.OrderMark"
|
||||
:table-questions="tableQuestions"
|
||||
:row-index="String(q.RowIndex)"
|
||||
:question-name="item.QuestionName"
|
||||
: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>
|
||||
|
|
@ -193,35 +163,10 @@
|
|||
</div>
|
||||
</template>
|
||||
</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>
|
||||
</template>
|
||||
<script>
|
||||
import { splitLesion, getCanMergeLesion, mergeLesion } from '@/api/trials'
|
||||
import { splitLesion } from '@/api/trials'
|
||||
import { resetReadingTask } from '@/api/reading'
|
||||
import DicomEvent from './../DicomEvent'
|
||||
import store from '@/store'
|
||||
|
|
@ -277,12 +222,7 @@ export default {
|
|||
criterionType: null,
|
||||
subjectCode: '',
|
||||
isConvertedTask: null,
|
||||
isFirstChangeTask: null,
|
||||
|
||||
merge: { visible: false, loading: false },
|
||||
lesionData: [],
|
||||
mergeInfo: {},
|
||||
mergeList: []
|
||||
isFirstChangeTask: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -335,69 +275,6 @@ export default {
|
|||
DicomEvent.$off('getUnSaveTarget')
|
||||
},
|
||||
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() {
|
||||
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
|
||||
if (i > -1) {
|
||||
|
|
@ -691,7 +568,7 @@ export default {
|
|||
.then(() => {
|
||||
this.split(rowId, questionId)
|
||||
})
|
||||
.catch(() => { })
|
||||
.catch(() => {})
|
||||
} else {
|
||||
// 是否确认分裂
|
||||
this.$confirm(this.$t('trials:reading:warnning:msg4'), {
|
||||
|
|
@ -701,7 +578,7 @@ export default {
|
|||
.then(() => {
|
||||
this.split(rowId, questionId)
|
||||
})
|
||||
.catch(() => { })
|
||||
.catch(() => {})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -859,7 +736,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
return
|
||||
}
|
||||
|
|
@ -870,7 +747,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
} else {
|
||||
// saveTypeEnum: 0
|
||||
|
|
@ -1021,7 +898,7 @@ export default {
|
|||
async changeLesionType(questionsObj) {
|
||||
await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
|
||||
// saveTypeEnum: 0
|
||||
var lesionObj = {}
|
||||
var lesionObj = { }
|
||||
var questionObj = questionsObj.questionForm
|
||||
// 切换到新的病灶集合
|
||||
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
|
||||
|
|
@ -1299,90 +1176,23 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.login-cycle {
|
||||
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 {
|
||||
.measurement-wrapper{
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
// overflow: hidden;
|
||||
|
||||
.container {
|
||||
.container{
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
.basic-info{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
h3{
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
i{
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1390,16 +1200,14 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
.title{
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
.add-icon{
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
|
|
@ -1408,49 +1216,42 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
.add-icon:hover{
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
||||
.flex-row {
|
||||
.flex-row{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
.lesion_list{
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.el-collapse {
|
||||
border-bottom: none;
|
||||
border-top: none;
|
||||
|
||||
::v-deep .el-collapse-item {
|
||||
background-color: #000 !important;
|
||||
.el-collapse{
|
||||
border-bottom:none;
|
||||
border-top:none;
|
||||
::v-deep .el-collapse-item{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__header {
|
||||
background-color: #000 !important;
|
||||
::v-deep .el-collapse-item__header{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
border-bottom-color: #5a5a5a;
|
||||
border-bottom-color:#5a5a5a;
|
||||
padding-left: 5px;
|
||||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
::v-deep .el-collapse-item__wrap{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
::v-deep .el-collapse-item__content{
|
||||
width:260px;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
|
|
@ -1459,7 +1260,7 @@ export default {
|
|||
z-index: 1;
|
||||
color: #ddd;
|
||||
padding: 5px;
|
||||
background-color: #1e1e1e;
|
||||
background-color:#1e1e1e;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
<!-- 影像质量问题 -->
|
||||
<div class="lesions">
|
||||
<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>
|
||||
<!-- 测量问题 -->
|
||||
<template v-if="questions.length > 0">
|
||||
|
|
@ -37,8 +37,7 @@
|
|||
<div class="add-icon" @click.prevent="downloadTpl">
|
||||
<i class="el-icon-download" />
|
||||
</div>
|
||||
<div class="add-icon" style="margin: 0 5px;"
|
||||
@click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
|
||||
<div class="add-icon" style="margin: 0 5px;" @click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
|
||||
<i class="el-icon-upload2" />
|
||||
</div>
|
||||
<div class="add-icon" @click.prevent="handleAddOrEdit('add', item)">
|
||||
|
|
@ -101,19 +100,9 @@
|
|||
@change="((val) => { formItemChange(val, item) })" />
|
||||
</template>
|
||||
<template v-if="item.Type === 'number'">
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<el-input-number v-model="questionForm[item.Id]"
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2" :precision="0"
|
||||
@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 v-if="item.Type === 'select'">
|
||||
<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">
|
||||
<QuestionTableFormItem v-for="item in qsList" :key="item.Id" :question="item" :question-form="qsForm"
|
||||
:reading-task-state="readingTaskState" @setFormItemData="setFormItemData"
|
||||
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" />
|
||||
@resetFormItemData="resetFormItemData" />
|
||||
<el-form-item style="text-align: right">
|
||||
<el-button size="small" @click="addOrEdit.visible = false">
|
||||
{{ $t('common:button:cancel') }}
|
||||
|
|
@ -297,9 +286,6 @@ export default {
|
|||
DicomEvent.$off('refreshQuestions')
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
async initList() {
|
||||
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
|
||||
if (i > -1) {
|
||||
|
|
|
|||
|
|
@ -1,66 +1,119 @@
|
|||
<template>
|
||||
<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;">
|
||||
{{ language === 'en' ? question.GroupEnName : question.GroupName }}
|
||||
{{ language==='en'?question.GroupEnName:question.GroupName }}
|
||||
</h4>
|
||||
</div>
|
||||
<template v-else>
|
||||
<el-form-item
|
||||
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
|
||||
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[
|
||||
{
|
||||
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']
|
||||
},
|
||||
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
|
||||
:label="`${question.QuestionName}`"
|
||||
:prop="question.Id"
|
||||
:rules="[
|
||||
{ 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"
|
||||
@change="((val) => { formItemChange(val, question) })" />
|
||||
<el-input
|
||||
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"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2"
|
||||
@change="((val) => { formItemChange(val, question) })" />
|
||||
<el-input
|
||||
v-else-if="question.Type==='textarea'"
|
||||
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)"
|
||||
clearable @change="((val) => { formItemChange(val, question) })">
|
||||
clearable
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<template v-if="question.TableQuestionType === 1">
|
||||
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
|
||||
:value="item[question.DataTableColumn]" />
|
||||
<el-option
|
||||
v-for="item in organList"
|
||||
:key="item.Id"
|
||||
:label="item[question.DataTableColumn]"
|
||||
:value="item[question.DataTableColumn]"
|
||||
/>
|
||||
</template>
|
||||
<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)"
|
||||
:label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<template
|
||||
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
|
||||
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
|
||||
:label="item.label" />
|
||||
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<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>
|
||||
</el-select>
|
||||
<!-- 单选 -->
|
||||
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })">
|
||||
<el-radio-group
|
||||
v-else-if="question.Type==='radio'"
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2"
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-radio-group>
|
||||
<!-- 复选框 -->
|
||||
<el-checkbox-group v-else-if="question.Type === 'checkbox'" 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">
|
||||
<el-checkbox-group
|
||||
v-else-if="question.Type==='checkbox'"
|
||||
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 }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
|
|
@ -91,38 +144,40 @@
|
|||
/>
|
||||
</template> -->
|
||||
<!-- 数值类型 -->
|
||||
<div style="display: flex;justify-content: space-between;"
|
||||
v-else-if="question.Type === 'number' || question.Type === 'calculation'">
|
||||
<el-input v-if="question.Type === 'number'" v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2" type="number" @change="((val) => { formItemChange(val, question) })">
|
||||
<el-input
|
||||
v-else-if="question.Type==='number'"
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState>=2 "
|
||||
type="number"
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<template v-if="question.Unit" slot="append">
|
||||
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
|
||||
</template>
|
||||
</el-input>
|
||||
|
||||
<el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled
|
||||
@change="((val) => { formItemChange(val, question) })">
|
||||
<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>
|
||||
<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-form-item>
|
||||
</template>
|
||||
|
||||
<QuestionTableFormItem v-for="item in question.Childrens" :key="item.Id" :question="item"
|
||||
:question-form="questionForm" :reading-task-state="readingTaskState" @setFormItemData="setFormItemData"
|
||||
@resetFormItemData="resetFormItemData" />
|
||||
<QuestionTableFormItem
|
||||
v-for="item in question.Childrens"
|
||||
:key="item.Id"
|
||||
:question="item"
|
||||
:question-form="questionForm"
|
||||
:reading-task-state="readingTaskState"
|
||||
@setFormItemData="setFormItemData"
|
||||
@resetFormItemData="resetFormItemData"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
|
@ -159,9 +214,6 @@ export default {
|
|||
this.digitPlaces = Number(localStorage.getItem('digitPlaces'))
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
formItemChange(v, question) {
|
||||
if (question.Childrens && question.Childrens.length > 0) {
|
||||
this.resetChild(question.Childrens)
|
||||
|
|
@ -217,36 +269,29 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.mb {
|
||||
.mb{
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
.disabled{
|
||||
::v-deep .el-upload--picture-card {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.uploadWrapper {
|
||||
.uploadWrapper{
|
||||
display: flex;
|
||||
flex-direction: column !important;
|
||||
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;
|
||||
}
|
||||
|
||||
::v-deep .el-input-group__append,
|
||||
.el-input-group__prepend {
|
||||
}
|
||||
::v-deep .el-input-group__append, .el-input-group__prepend{
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
}
|
||||
::v-deep .el-form-item__content {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
::v-deep .el-select.is-disabled .el-input__inner {
|
||||
}
|
||||
::v-deep .el-select.is-disabled .el-input__inner{
|
||||
background-color: #646464a1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
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">
|
||||
<el-upload
|
||||
class="upload-demo"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
<template>
|
||||
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
|
||||
class="measurement-form">
|
||||
<el-form
|
||||
v-if="isRender"
|
||||
ref="measurementForm"
|
||||
v-loading="loading"
|
||||
:model="questionForm"
|
||||
size="mini"
|
||||
class="measurement-form"
|
||||
>
|
||||
<div class="base-dialog-body">
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<h3 v-if="lesionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
||||
|
|
@ -13,137 +19,198 @@
|
|||
</div>
|
||||
</div>
|
||||
<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="[
|
||||
{ required: true, message: $t('common:ruleMessage:select'), trigger: ['blur'] },
|
||||
]">
|
||||
<el-form-item
|
||||
: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
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
|
||||
@change="((val) => { lesionTypeChange(val) })">
|
||||
<el-select
|
||||
:ref="`select_LesionType`"
|
||||
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"
|
||||
:value="item.value" :label="item.label" />
|
||||
<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-form-item>
|
||||
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :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']
|
||||
},
|
||||
]">
|
||||
<el-form-item
|
||||
v-for="qs in questions"
|
||||
v-show="qs.ShowQuestion!==2"
|
||||
:key="qs.Id"
|
||||
: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'">
|
||||
<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">
|
||||
<template v-if="qs.Type==='input' || qs.Type==='number'">
|
||||
<!-- {{ ((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>
|
||||
<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)) }} -->
|
||||
|
||||
</template>
|
||||
<!-- 多行文本输入框 -->
|
||||
<el-input v-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500"
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || answers.SplitOrMergeType === '1'"
|
||||
@change="((val) => { formItemChange(val, qs) })" />
|
||||
<el-input
|
||||
v-if="qs.Type==='textarea'"
|
||||
v-model="questionForm[qs.Id]"
|
||||
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')" -->
|
||||
|
||||
<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')"
|
||||
: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) })">
|
||||
: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)})"
|
||||
>
|
||||
<template v-if="qs.QuestionMark === 8" #prefix>
|
||||
<span style="padding-left: 5px;">
|
||||
<i class="el-icon-search" />
|
||||
</span>
|
||||
</template>
|
||||
<template v-if="qs.TableQuestionType === 1">
|
||||
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
|
||||
:value="item[qs.DataTableColumn]" />
|
||||
<el-option
|
||||
v-for="item in organList"
|
||||
:key="item.Id"
|
||||
:label="item[qs.DataTableColumn]"
|
||||
:value="item[qs.DataTableColumn]"
|
||||
/>
|
||||
</template>
|
||||
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
|
||||
<el-option v-for="item of $d[qs.DictionaryCode]"
|
||||
v-show="(lesionType === 0 && item.value === 0) || (lesionType === 1 && (item.value === 0))"
|
||||
:key="item.id" :value="item.value" :label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[qs.DictionaryCode]"
|
||||
v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))"
|
||||
:key="item.id"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
|
||||
<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'">
|
||||
<el-option v-for="item of $d[qs.DictionaryCode]" v-show="item.value === 0" :key="item.id"
|
||||
:value="item.value" :label="item.label" />
|
||||
<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"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<!-- 首次添加的新病灶不能为无法评估和消失 -->
|
||||
<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"
|
||||
:key="item.id" :value="item.value" :label="item.label" />
|
||||
<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"
|
||||
:key="item.id"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-option v-for="item of filterState($d[qs.DictionaryCode])" :key="item.id" :value="item.value"
|
||||
:label="item.label" />
|
||||
<el-option
|
||||
v-for="item of filterState($d[qs.DictionaryCode])"
|
||||
:key="item.id"
|
||||
:value="item.value"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
</el-option-group>
|
||||
</template>
|
||||
<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 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>
|
||||
|
||||
</el-select>
|
||||
<!-- 单选 -->
|
||||
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
|
||||
: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) })">
|
||||
<el-radio-group
|
||||
v-if="qs.Type==='radio'"
|
||||
v-model="questionForm[qs.id]"
|
||||
: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 }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
<template v-if="qs.QuestionMark === 20">
|
||||
<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;"
|
||||
@change="((val) => { formItemChange(val, qs) })">
|
||||
|
||||
<el-input
|
||||
v-if="qs.Type==='calculation'"
|
||||
v-model="questionForm[qs.Id]"
|
||||
disabled
|
||||
style="width:120px;"
|
||||
@change="((val)=>{formItemChange(val, qs)})"
|
||||
>
|
||||
<template v-if="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>
|
||||
<viewer v-if="answers.OtherPicturePath" ref="viewer" style="margin:0 10px;"
|
||||
: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()">
|
||||
{{ $t('trials:lugano:button:suvscreenshot1') }}
|
||||
</span>
|
||||
<img v-show="false" crossorigin="anonymous"
|
||||
:src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`" alt="Image">
|
||||
<img
|
||||
v-show="false"
|
||||
crossorigin="anonymous"
|
||||
:src="`${OSSclientConfig.basePath}${answers.OtherPicturePath}`"
|
||||
alt="Image"
|
||||
>
|
||||
</viewer>
|
||||
<!-- <img
|
||||
v-if="answers.OtherPicturePath"
|
||||
|
|
@ -159,40 +226,45 @@
|
|||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<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
|
||||
@change="((val) => { formItemChange(val, qs) })">
|
||||
<el-input
|
||||
v-if="qs.Type==='calculation'"
|
||||
v-model="questionForm[qs.Id]"
|
||||
disabled
|
||||
@change="((val)=>{formItemChange(val, qs)})"
|
||||
>
|
||||
<template v-if="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>
|
||||
|
||||
</template>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div
|
||||
v-if="isCurrentTask && readingTaskState < 2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')"
|
||||
class="base-dialog-footer" style="text-align:right;margin-top:10px;">
|
||||
v-if="isCurrentTask && readingTaskState<2 && (answers.SplitOrMergeType !== '1' && answers.SplitOrMergeType !== '3')"
|
||||
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') }}
|
||||
</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') }}
|
||||
</el-button>
|
||||
<!-- 保存 -->
|
||||
<el-button size="mini" @click="handleSave">
|
||||
<el-button
|
||||
size="mini"
|
||||
@click="handleSave"
|
||||
>
|
||||
{{ $t('common:button:save') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
|
@ -296,9 +368,6 @@ export default {
|
|||
// container.removeEventListener('scroll', this.scrollHandle , true)
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
scrollHandle() {
|
||||
for (const k in this.$refs) {
|
||||
if (k.indexOf('select_') === -1) continue
|
||||
|
|
@ -538,8 +607,8 @@ export default {
|
|||
type: 'warning',
|
||||
distinguishCancelAndClose: true
|
||||
})
|
||||
.then(() => { })
|
||||
.catch(() => { })
|
||||
.then(() => {})
|
||||
.catch(() => {})
|
||||
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
|
||||
return
|
||||
}
|
||||
|
|
@ -552,7 +621,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
|
||||
return
|
||||
|
|
@ -584,7 +653,7 @@ export default {
|
|||
})
|
||||
},
|
||||
deleteLesionInfo() {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
return new Promise(async(resolve, reject) => {
|
||||
const loading = this.$loading({ fullscreen: true })
|
||||
var param = {
|
||||
visitTaskId: this.visitTaskId,
|
||||
|
|
@ -713,8 +782,8 @@ export default {
|
|||
this.$set(this.questionForm, stateId, 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 (lesionLength > 15) {
|
||||
|
|
@ -1063,7 +1132,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState1'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1074,7 +1143,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState2'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1090,7 +1159,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg21'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1101,7 +1170,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState12'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1118,7 +1187,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState3'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1130,7 +1199,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState4'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1146,7 +1215,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg25'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1165,7 +1234,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg26'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1189,7 +1258,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg27'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1201,7 +1270,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg28'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1212,13 +1281,13 @@ export default {
|
|||
// 靶病灶且状态为消失(3)
|
||||
if (this.lesionType === 0 && lesionState === 3) {
|
||||
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'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1227,7 +1296,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState6'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1244,12 +1313,12 @@ export default {
|
|||
// }
|
||||
} 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',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1278,7 +1347,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState7'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1290,7 +1359,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState8'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1307,7 +1376,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg31'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1319,7 +1388,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState9'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1336,7 +1405,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg33'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1348,7 +1417,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState10'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1365,7 +1434,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg35'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1377,7 +1446,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg36'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1389,12 +1458,12 @@ export default {
|
|||
if (this.lesionType === 1 && lesionState === 3) {
|
||||
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',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1406,7 +1475,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg38'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1423,7 +1492,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg39'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1435,7 +1504,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:lugano:message:validState11'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1481,7 +1550,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg43'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1493,7 +1562,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg44'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1505,12 +1574,12 @@ export default {
|
|||
if (this.lesionType === 2 && lesionState === 3) {
|
||||
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',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1522,7 +1591,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:reading:warnning:msg46'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -1768,62 +1837,51 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.measurement-form {
|
||||
::v-deep .el-form-item__label {
|
||||
.measurement-form{
|
||||
::v-deep .el-form-item__label{
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
::v-deep .el-input .el-input__inner{
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
::v-deep .el-form-item{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
::v-deep .el-form-item__content{
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
::v-deep .el-input.is-disabled .el-input__inner{
|
||||
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;
|
||||
}
|
||||
|
||||
::v-deep .el-select.is-disabled .el-input__inner {
|
||||
::v-deep .el-select.is-disabled .el-input__inner{
|
||||
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;
|
||||
}
|
||||
|
||||
.el-form-item__content .el-select {
|
||||
.el-form-item__content
|
||||
.el-select{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.input-width1 {
|
||||
width: calc(100% - 60px) !important;
|
||||
.input-width1{
|
||||
width: calc(100% - 60px)!important;
|
||||
}
|
||||
|
||||
.input-width2 {
|
||||
.input-width2{
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.suv_viewer {
|
||||
.suv_viewer{
|
||||
::v-deep .viewer-play {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -8,9 +8,11 @@
|
|||
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
||||
</h3>
|
||||
<div v-if="readingTaskState < 2">
|
||||
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
|
||||
placement="bottom">
|
||||
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
|
||||
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
|
||||
<i
|
||||
class="el-icon-refresh-left"
|
||||
@click="resetMeasuredData"
|
||||
/>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -23,135 +25,121 @@
|
|||
:question-form-change-num="questionFormChangeNum"
|
||||
:group-classify="1"
|
||||
/> -->
|
||||
<Questions ref="ecrf" :question-form-change-state="true" :question-form-change-num="0" :is-qulity-issues="false"
|
||||
:group-classify="1" @handleReadingChart="handleReadingChart" />
|
||||
<Questions
|
||||
ref="ecrf"
|
||||
:question-form-change-state="true"
|
||||
:question-form-change-num="0"
|
||||
:is-qulity-issues="false"
|
||||
:group-classify="1"
|
||||
/>
|
||||
</div>
|
||||
<!-- 测量问题 -->
|
||||
<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;">
|
||||
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }}
|
||||
{{ language==='en'?qs.GroupEnName:qs.GroupName }}
|
||||
</h4>
|
||||
<div class="lesion_list">
|
||||
<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 class="title">{{ 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 v-if="readingTaskState < 2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon"
|
||||
@click.prevent="handleAdd(item)">
|
||||
<div class="title">{{ item.QuestionName }}</div>
|
||||
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
|
||||
<i class="el-icon-plus" />
|
||||
</div>
|
||||
</div>
|
||||
<!-- @change="handleCollapseChange(qs.Childrens,item)" -->
|
||||
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
|
||||
@change="handleCollapseChange">
|
||||
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
|
||||
<el-collapse
|
||||
v-if="item.Type === 'table' && item.TableQuestions"
|
||||
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}`"
|
||||
@contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
|
||||
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)"
|
||||
>
|
||||
<template slot="title">
|
||||
<div style="width:300px;position: relative;"
|
||||
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
|
||||
<div 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
|
||||
v-if="readingTaskState < 2 && parseInt(item.TableQuestions.Answers[i].saveTypeEnum) === 0"
|
||||
class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
|
||||
<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">
|
||||
<i class="el-icon-warning" style="color:red" />
|
||||
</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">
|
||||
<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">
|
||||
<i class="el-icon-warning" style="color:#ff9800" />
|
||||
</el-tooltip>
|
||||
<div
|
||||
:style="{ position: 'absolute', left: item.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px' }">
|
||||
<div :style="{position: 'absolute',left: item.LesionType === 1 && readingTaskState < 2?'58px':'50px',top: '2px'}">
|
||||
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
|
||||
|
||||
<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;">
|
||||
<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">
|
||||
<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 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">
|
||||
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
|
||||
<span class="login-cycle" />
|
||||
</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)}`" />
|
||||
<span class="login-cycle" />
|
||||
</div>
|
||||
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark"
|
||||
:content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
|
||||
<div v-if="item.TableQuestions.Answers[i].lesionPart"
|
||||
style="max-width: 100px;overflow: hidden;">
|
||||
<el-tooltip v-if="!!item.TableQuestions.Answers[i].lesionPart" class="item" effect="dark" :content="item.TableQuestions.Answers[i].lesionPart" placement="bottom">
|
||||
<div v-if="item.TableQuestions.Answers[i].lesionPart" style="max-width: 100px;overflow: hidden;">
|
||||
{{ item.TableQuestions.Answers[i].lesionPart }}
|
||||
</div>
|
||||
</el-tooltip>
|
||||
<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 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 v-else style="margin:0 5px;">
|
||||
{{ $fd('NewLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
{{ $fd('NewLesionState',parseInt(item.TableQuestions.Answers[i].lesionState)) }}
|
||||
</div>
|
||||
<div v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionLength))">
|
||||
<el-tooltip class="item" effect="dark"
|
||||
:content="`${item.TableQuestions.Answers[i].lesionLength}*${item.TableQuestions.Answers[i].lesionShort}m㎡`"
|
||||
placement="bottom">
|
||||
<span>{{ item.TableQuestions.Answers[i].lesionLength }}*{{
|
||||
item.TableQuestions.Answers[i].lesionShort }}m㎡</span>
|
||||
<el-tooltip class="item" effect="dark" :content="`${item.TableQuestions.Answers[i].lesionLength}*${item.TableQuestions.Answers[i].lesionShort}m㎡`" placement="bottom">
|
||||
<span>{{ item.TableQuestions.Answers[i].lesionLength }}*{{ item.TableQuestions.Answers[i].lesionShort }}m㎡</span>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False' && readingTaskState < 2"
|
||||
style="position: absolute;right: 5px;top: 2px;">
|
||||
<div v-if="item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False' && readingTaskState < 2" style="position: absolute;right: 5px;top: 2px;">
|
||||
<!-- 分裂 -->
|
||||
<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">
|
||||
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
|
||||
@click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" />
|
||||
<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">
|
||||
<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 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>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
|
||||
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
|
||||
:order-mark="item.OrderMark" :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"
|
||||
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
|
||||
@close="close" @handleReadingChart="handleReadingChart" />
|
||||
<QuestionForm
|
||||
:ref="`${item.Id}_${q.RowIndex}`"
|
||||
:questions="item.TableQuestions.Questions"
|
||||
:answers="item.TableQuestions.Answers[i]"
|
||||
:lesion-type="item.LesionType"
|
||||
:order-mark="item.OrderMark"
|
||||
: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"
|
||||
@determineExistsUnsavedLession="determineExistsUnsavedLession"
|
||||
@resetQuestions="resetQuestions"
|
||||
@close="close"
|
||||
/>
|
||||
</el-collapse-item>
|
||||
|
||||
</el-collapse>
|
||||
|
|
@ -161,15 +149,35 @@
|
|||
</template>
|
||||
<!-- <el-divider /> -->
|
||||
<!-- 肝脏评估 -->
|
||||
<Questions ref="ecrf2" :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="ecrf2"
|
||||
: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"
|
||||
:is-qulity-issues="false" :question-type="7" @setNonTargetMeasurementStatus="setNonTargetMeasurementStatus" />
|
||||
<Questions
|
||||
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>
|
||||
<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">
|
||||
<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>
|
||||
|
|
@ -177,19 +185,40 @@
|
|||
<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
|
||||
: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">
|
||||
<el-button
|
||||
type="primary"
|
||||
size="mini"
|
||||
:disabled="mergeList.length === 0"
|
||||
@click="confirmMerge"
|
||||
>
|
||||
{{ $t('common:button:confirm') }}</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
|
@ -304,7 +333,7 @@ export default {
|
|||
DicomEvent.$on('split', measureData => {
|
||||
this.handleSplit(measureData.RowId, measureData.QuestionId)
|
||||
})
|
||||
DicomEvent.$on('refreshQuestions', async (obj) => {
|
||||
DicomEvent.$on('refreshQuestions', async(obj) => {
|
||||
var triald = this.$router.currentRoute.query.trialId
|
||||
await store.dispatch('reading/refreshDicomReadingQuestionAnswer', { trialId: triald, visitTaskId: this.visitTaskId })
|
||||
this.$nextTick(() => {
|
||||
|
|
@ -313,7 +342,7 @@ export default {
|
|||
this.$refs['ecrf3'].getQuestions(this.visitTaskId)
|
||||
})
|
||||
})
|
||||
DicomEvent.$on('refreshSplitTargetLesionPDD', async (callback) => {
|
||||
DicomEvent.$on('refreshSplitTargetLesionPDD', async(callback) => {
|
||||
const res = await getSplitPPdSum({ visitTaskId: this.visitTaskId })
|
||||
this.splitTargetLesions = res.Result
|
||||
if (this.splitTargetLesions && this.splitTargetLesions.length > 0) {
|
||||
|
|
@ -337,9 +366,6 @@ export default {
|
|||
DicomEvent.$off('refreshQuestions')
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
async initList() {
|
||||
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
|
||||
if (i > -1) {
|
||||
|
|
@ -503,7 +529,7 @@ export default {
|
|||
try {
|
||||
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)
|
||||
if (idx > -1) {
|
||||
if (this.visitTaskList[idx].ReadingQuestions.length > 0) {
|
||||
|
|
@ -629,7 +655,7 @@ export default {
|
|||
.then(() => {
|
||||
this.split(rowId, questionId)
|
||||
})
|
||||
.catch(() => { })
|
||||
.catch(() => {})
|
||||
} else {
|
||||
// 是否确认分裂
|
||||
this.$confirm(this.$t('trials:reading:warnning:msg4'), {
|
||||
|
|
@ -639,7 +665,7 @@ export default {
|
|||
.then(() => {
|
||||
this.split(rowId, questionId)
|
||||
})
|
||||
.catch(() => { })
|
||||
.catch(() => {})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -849,7 +875,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
return
|
||||
}
|
||||
|
|
@ -860,7 +886,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
} else {
|
||||
// saveTypeEnum: 0
|
||||
|
|
@ -1000,7 +1026,7 @@ export default {
|
|||
async changeLesionType(questionsObj) {
|
||||
await store.dispatch('reading/removeReadingQuestionAndAnswer', { lesionType: questionsObj.oldLesionType, rowIndex: questionsObj.rowIndex, visitTaskId: this.visitTaskId })
|
||||
// saveTypeEnum: 0
|
||||
var lesionObj = {}
|
||||
var lesionObj = { }
|
||||
var questionObj = questionsObj.questionForm
|
||||
// 切换到新的病灶集合
|
||||
var targetObj = this.tableQuestions.find(item => item.LesionType === questionsObj.newLesionType)
|
||||
|
|
@ -1317,25 +1343,21 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.measurement-wrapper {
|
||||
.measurement-wrapper{
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
|
||||
.container {
|
||||
.container{
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
.basic-info{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
h3{
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
i{
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
|
|
@ -1343,16 +1365,14 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
.title{
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
.add-icon{
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
|
|
@ -1361,24 +1381,21 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
.add-icon:hover{
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
||||
.flex-row {
|
||||
.flex-row{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
.lesion_list{
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.login-cycle {
|
||||
.login-cycle{
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
display: inline-block;
|
||||
|
|
@ -1387,33 +1404,28 @@ export default {
|
|||
margin-right: 2px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.el-collapse {
|
||||
border-bottom: none;
|
||||
border-top: none;
|
||||
|
||||
::v-deep .el-collapse-item {
|
||||
background-color: #000 !important;
|
||||
.el-collapse{
|
||||
border-bottom:none;
|
||||
border-top:none;
|
||||
::v-deep .el-collapse-item{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__header {
|
||||
background-color: #000 !important;
|
||||
::v-deep .el-collapse-item__header{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
border-bottom-color: #5a5a5a;
|
||||
border-bottom-color:#5a5a5a;
|
||||
padding-left: 5px;
|
||||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
::v-deep .el-collapse-item__wrap{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
::v-deep .el-collapse-item__content{
|
||||
width:260px;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
|
|
@ -1422,59 +1434,46 @@ export default {
|
|||
z-index: 1;
|
||||
color: #ddd;
|
||||
padding: 5px;
|
||||
background-color: #1e1e1e;
|
||||
background-color:#1e1e1e;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.merge-table {
|
||||
padding: 0 10px;
|
||||
|
||||
::v-deep.el-table {
|
||||
.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 {
|
||||
::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 {
|
||||
.el-table--border::after, .el-table--group::after, .el-table::before{
|
||||
background-color: #1e1e1e;
|
||||
}
|
||||
|
||||
::v-deep.el-table__header-wrapper {
|
||||
th {
|
||||
::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 {
|
||||
::v-deep.el-table__body-wrapper{
|
||||
tr{
|
||||
background-color: #1e1e1e !important;
|
||||
color: #dfdfdf;
|
||||
}
|
||||
|
||||
tr:hover>td {
|
||||
tr:hover > td{
|
||||
background-color: #1e1e1e !important;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep.el-table__empty-block {
|
||||
::v-deep.el-table__empty-block{
|
||||
background-color: #1e1e1e !important;
|
||||
}
|
||||
|
||||
.merge-label {
|
||||
color: #ddd;
|
||||
.merge-label{
|
||||
color:#ddd;
|
||||
font-size: 13px;
|
||||
margin-bottom: 10px;
|
||||
|
||||
span {
|
||||
span{
|
||||
font-size: 15px;
|
||||
color: red;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
<template>
|
||||
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
|
||||
class="measurement-form">
|
||||
<el-form
|
||||
v-if="isRender"
|
||||
ref="measurementForm"
|
||||
v-loading="loading"
|
||||
:model="questionForm"
|
||||
size="mini"
|
||||
class="measurement-form"
|
||||
>
|
||||
<div class="base-dialog-body">
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
||||
|
|
@ -12,134 +18,183 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
|
||||
:prop="qs.Id" :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">
|
||||
<el-form-item
|
||||
v-for="qs in questions"
|
||||
v-show="qs.ShowQuestion!==2"
|
||||
:key="qs.Id"
|
||||
:label="`${qs.QuestionName}`"
|
||||
:prop="qs.Id"
|
||||
: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
|
||||
v-if="(qs.Type === 'input' || qs.Type === 'number') && (qs.QuestionMark === 1101 || qs.QuestionMark === 1102 || qs.QuestionMark === 1103)">
|
||||
<template 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;">
|
||||
<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">
|
||||
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
|
||||
</template>
|
||||
</el-input>
|
||||
<!-- 测量 -->
|
||||
<el-button
|
||||
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && !questionForm[qs.Id] && readingTaskState !== 2"
|
||||
size="mini" type="text" @click="addAnnotation(qs)">
|
||||
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && !questionForm[qs.Id] && readingTaskState!== 2"
|
||||
size="mini"
|
||||
type="text"
|
||||
@click="addAnnotation(qs)"
|
||||
>
|
||||
{{ $t('trials:MRIPDFF:button:measure') }}
|
||||
</el-button>
|
||||
<!-- 清除标记 -->
|
||||
<el-button v-if="getAnnotationStatus(qs) && readingTaskState !== 2" size="mini" type="text"
|
||||
style="margin-left: 0px" @click="removeAnnotation(qs)">
|
||||
<el-button
|
||||
v-if="getAnnotationStatus(qs) && readingTaskState!== 2"
|
||||
size="mini"
|
||||
type="text"
|
||||
style="margin-left: 0px"
|
||||
@click="removeAnnotation(qs)"
|
||||
>
|
||||
{{ $t('trials:MRIPDFF:button:clear') }}
|
||||
</el-button>
|
||||
<!-- 返回 -->
|
||||
<el-button v-if="questionForm[qs.Id]" size="mini" type="text" style="margin-left: 0px"
|
||||
@click="locateAnnotation(qs)">
|
||||
<el-button
|
||||
v-if="questionForm[qs.Id]"
|
||||
size="mini"
|
||||
type="text"
|
||||
style="margin-left: 0px"
|
||||
@click="locateAnnotation(qs)"
|
||||
>
|
||||
{{ $t('trials:MRIPDFF:button:return') }}
|
||||
</el-button>
|
||||
<!-- 保存 -->
|
||||
<el-button
|
||||
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && questionForm[qs.Id] && readingTaskState !== 2"
|
||||
size="mini" type="text" style="margin-left: 0px" @click="saveAnnotation(qs)">
|
||||
v-if="questionForm[isMeasurableId] && parseInt(questionForm[isMeasurableId]) === 1 && questionForm[qs.Id] && readingTaskState!== 2"
|
||||
size="mini"
|
||||
type="text"
|
||||
style="margin-left: 0px"
|
||||
@click="saveAnnotation(qs)"
|
||||
>
|
||||
<!-- 未保存 -->
|
||||
<el-tooltip v-if="getAnnotationSaveEnum(qs) === 0" class="item" effect="dark"
|
||||
:content="$t('trials:reading:button:unsaved')" placement="bottom">
|
||||
<el-tooltip v-if="getAnnotationSaveEnum(qs) === 0" class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
|
||||
<i class="el-icon-warning" style="color:red" />
|
||||
</el-tooltip>
|
||||
{{ $t('common:button:save') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else-if="qs.Type === 'input' || qs.Type === 'number'">
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<el-input v-model="questionForm[qs.Id]" :disabled="!isCurrentTask || readingTaskState >= 2"
|
||||
@change="((val) => { formItemChange(val, qs) })">
|
||||
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
|
||||
<template v-else-if="qs.Type==='input' || qs.Type==='number'">
|
||||
<el-input
|
||||
v-model="questionForm[qs.Id]"
|
||||
:disabled="!isCurrentTask || readingTaskState>=2"
|
||||
@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>
|
||||
</template>
|
||||
<!-- 多行文本输入框 -->
|
||||
<el-input v-else-if="qs.Type === 'textarea'" v-model="questionForm[qs.Id]" type="textarea"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="!isCurrentTask || readingTaskState >= 2"
|
||||
@change="((val) => { formItemChange(val, qs) })" />
|
||||
<el-input
|
||||
v-else-if="qs.Type==='textarea'"
|
||||
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')"
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || qs.QuestionMark === 1106"
|
||||
@change="((val) => { formItemChange(val, qs) })">
|
||||
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 1106"
|
||||
@change="((val)=>{formItemChange(val, qs)})"
|
||||
>
|
||||
<template v-if="qs.TableQuestionType === 1">
|
||||
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
|
||||
:value="item[qs.DataTableColumn]" />
|
||||
<el-option
|
||||
v-for="item in organList"
|
||||
:key="item.Id"
|
||||
:label="item[qs.DataTableColumn]"
|
||||
:value="item[qs.DataTableColumn]"
|
||||
/>
|
||||
</template>
|
||||
<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 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>
|
||||
|
||||
</el-select>
|
||||
<!-- 单选 -->
|
||||
<el-radio-group v-else-if="qs.Type === 'radio'" v-model="questionForm[qs.Id]"
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2 || (qs.QuestionMark === 1105 && isDisabledMeasurableRadio)"
|
||||
@change="((val) => { formItemChange(val, qs) })">
|
||||
<el-radio-group
|
||||
v-else-if="qs.Type==='radio'"
|
||||
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">
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-radio-group>
|
||||
<div style="display: flex;justify-content: space-between;" v-else-if="qs.Type === 'calculation'">
|
||||
<!-- 自动计算 -->
|
||||
<el-input v-model="questionForm[qs.Id]" disabled @change="((val) => { formItemChange(val, qs) })">
|
||||
<el-input
|
||||
v-else-if="qs.Type==='calculation'"
|
||||
v-model="questionForm[qs.Id]"
|
||||
disabled
|
||||
@change="((val)=>{formItemChange(val, qs)})"
|
||||
>
|
||||
<template v-if="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>
|
||||
|
||||
</el-form-item>
|
||||
|
||||
</div>
|
||||
|
||||
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
|
||||
style="text-align:right;margin-top:10px;">
|
||||
<div
|
||||
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') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
|
@ -235,9 +290,6 @@ export default {
|
|||
DicomEvent.$off('handleImageQualityAbnormal')
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
async initForm() {
|
||||
this.isRender = false
|
||||
this.isMeasurableId = this.getQuestionId(1105)
|
||||
|
|
@ -451,7 +503,7 @@ export default {
|
|||
const orderMarkName = this.getLesionName(this.orderMark, qs.QuestionMark)
|
||||
this.activeQuestionId = qs.Id
|
||||
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) {
|
||||
const i = this.markList.findIndex(i => i.tableQuestionId === qs.Id)
|
||||
|
|
@ -801,55 +853,45 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.measurement-form {
|
||||
::v-deep .el-form-item__label {
|
||||
.measurement-form{
|
||||
::v-deep .el-form-item__label{
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
::v-deep .el-input .el-input__inner{
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
::v-deep .el-form-item{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
::v-deep .el-form-item__content{
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
::v-deep .el-input.is-disabled .el-input__inner{
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
::v-deep .el-select.is-disabled .el-input__inner {
|
||||
::v-deep .el-select.is-disabled .el-input__inner{
|
||||
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;
|
||||
}
|
||||
|
||||
::v-deep .el-input-group__append,
|
||||
.el-input-group__prepend {
|
||||
::v-deep .el-input-group__append, .el-input-group__prepend {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.el-form-item__content .el-select {
|
||||
.el-form-item__content
|
||||
.el-select{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.input-width1 {
|
||||
width: calc(100% - 60px) !important;
|
||||
.input-width1{
|
||||
width: calc(100% - 60px)!important;
|
||||
}
|
||||
|
||||
.input-width2 {
|
||||
.input-width2{
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -8,62 +8,63 @@
|
|||
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
||||
</h3>
|
||||
<div v-if="readingTaskState < 2">
|
||||
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
|
||||
placement="bottom">
|
||||
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
|
||||
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
|
||||
<i
|
||||
class="el-icon-refresh-left"
|
||||
@click="resetMeasuredData"
|
||||
/>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 非测量问题 -->
|
||||
<div class="lesions">
|
||||
<Questions ref="ecrf" :groupClassify="1" :question-form-change-state="questionFormChangeState"
|
||||
:question-form-change-num="questionFormChangeNum" @handleReadingChart="handleReadingChart" />
|
||||
<Questions ref="ecrf" :groupClassify="1" :question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum" />
|
||||
</div>
|
||||
<!-- 测量问题 -->
|
||||
<template>
|
||||
<div v-for="(qs, index) in questions" :key="index" v-loading="loading" class="lesions lesions_wrapper">
|
||||
<template >
|
||||
<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;">
|
||||
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }}
|
||||
{{ language==='en'?qs.GroupEnName:qs.GroupName }}
|
||||
</h4>
|
||||
<div class="lesion_list">
|
||||
<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 class="title">{{ item.QuestionName }}</div>
|
||||
</div>
|
||||
<div
|
||||
style="color: #ddd;text-align: left;padding: 5px 10px;border-bottom: 1px solid #5a5a5a; font-size: 15px;">
|
||||
<el-row>
|
||||
<div style="color: #ddd;text-align: left;padding: 5px 10px;border-bottom: 1px solid #5a5a5a; font-size: 15px;">
|
||||
<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:col3') }}</el-col>
|
||||
<el-col :span="7">{{$t('trials:MRIPDFF:label:col3')}}</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
|
||||
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
|
||||
@change="handleCollapseChange">
|
||||
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
|
||||
<el-collapse
|
||||
v-if="item.Type === 'table' && item.TableQuestions"
|
||||
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}`"
|
||||
@contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
|
||||
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)"
|
||||
>
|
||||
<template slot="title">
|
||||
<div style="width:300px;position: relative;"
|
||||
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
|
||||
<div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}">
|
||||
|
||||
{{ getLesionName(item.TableQuestions.Questions, q) }}
|
||||
<!-- 未保存 -->
|
||||
<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">
|
||||
<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">
|
||||
<i class="el-icon-warning" style="color:red" />
|
||||
</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">
|
||||
<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">
|
||||
<i class="el-icon-warning" style="color:#ff9800" />
|
||||
</el-tooltip>
|
||||
<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">
|
||||
{{ $fd('ReadingYesOrNo', parseInt(item.TableQuestions.Answers[i].isMeasurable)) }}
|
||||
</div> -->
|
||||
<div
|
||||
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}%` }}
|
||||
<div 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}%` }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
|
||||
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
|
||||
:order-mark="item.OrderMark" :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" @handleReadingChart="handleReadingChart" />
|
||||
<QuestionForm
|
||||
:ref="`${item.Id}_${q.RowIndex}`"
|
||||
:questions="item.TableQuestions.Questions"
|
||||
:answers="item.TableQuestions.Answers[i]"
|
||||
:lesion-type="item.LesionType"
|
||||
:order-mark="item.OrderMark"
|
||||
: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>
|
||||
|
|
@ -200,9 +210,6 @@ export default {
|
|||
DicomEvent.$off('getAllUnSaveLesions')
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
async initList() {
|
||||
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
|
||||
if (i > -1) {
|
||||
|
|
@ -382,7 +389,7 @@ export default {
|
|||
getLesionName(questions, q) {
|
||||
let liverSegmentStr = ''
|
||||
if (!this.liverSegmentId) {
|
||||
let i = questions.findIndex(i => i.QuestionMark === 1106)
|
||||
let i = questions.findIndex(i=>i.QuestionMark === 1106)
|
||||
if (i === -1) return
|
||||
this.liverSegmentId = questions[i].Id
|
||||
this.liverSegmentDicCode = questions[i].DictionaryCode
|
||||
|
|
@ -518,26 +525,23 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.measurement-wrapper {
|
||||
.measurement-wrapper{
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
// overflow: hidden;
|
||||
|
||||
.container {
|
||||
.container{
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
.basic-info{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
h3{
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
i{
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
|
|
@ -545,16 +549,14 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
.title{
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
.add-icon{
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
|
|
@ -563,49 +565,42 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
.add-icon:hover{
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
||||
.flex-row {
|
||||
.flex-row{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
.lesion_list{
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.el-collapse {
|
||||
border-bottom: none;
|
||||
border-top: none;
|
||||
|
||||
::v-deep .el-collapse-item {
|
||||
background-color: #000 !important;
|
||||
.el-collapse{
|
||||
border-bottom:none;
|
||||
border-top:none;
|
||||
::v-deep .el-collapse-item{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__header {
|
||||
background-color: #000 !important;
|
||||
::v-deep .el-collapse-item__header{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
border-bottom-color: #5a5a5a;
|
||||
border-bottom-color:#5a5a5a;
|
||||
padding-left: 5px;
|
||||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
::v-deep .el-collapse-item__wrap{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
::v-deep .el-collapse-item__content{
|
||||
width:260px;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
|
|
@ -614,7 +609,7 @@ export default {
|
|||
z-index: 1;
|
||||
color: #ddd;
|
||||
padding: 5px;
|
||||
background-color: #1e1e1e;
|
||||
background-color:#1e1e1e;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,14 @@
|
|||
<template>
|
||||
<div v-loading="loading" class="manuals-wrapper">
|
||||
<div class="left-wrapper">
|
||||
<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 }"
|
||||
@click.prevent="preview(file)">
|
||||
<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}"
|
||||
@click.prevent="preview(file)"
|
||||
>
|
||||
<!-- {{ file.Name }} -->
|
||||
<el-tooltip class="item" :content="file.Name" placement="bottom">
|
||||
<span>{{ file.Name }} </span>
|
||||
|
|
@ -16,25 +21,19 @@
|
|||
</div>
|
||||
<div class="right-wrapper">
|
||||
<div class="right-content">
|
||||
<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" />
|
||||
<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" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { getManualList, getTrialCriterionKeyFileList } from '@/api/trials'
|
||||
import { getManualList } from '@/api/trials'
|
||||
export default {
|
||||
name: 'Manuals',
|
||||
props: {
|
||||
trialId: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
justKeyDoc: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
|
|
@ -46,7 +45,7 @@ export default {
|
|||
fileList: [],
|
||||
loading: false,
|
||||
currentUser: zzSessionStorage.getItem('userName'),
|
||||
COMPANY: process.env.VUE_APP_COMPANY_NAME
|
||||
COMPANY:process.env.VUE_APP_COMPANY_NAME
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
|
@ -55,36 +54,17 @@ export default {
|
|||
methods: {
|
||||
async getList() {
|
||||
this.loading = true
|
||||
this.fileList = []
|
||||
try {
|
||||
var param = {
|
||||
TrialCriterionId: this.$router.currentRoute.query.TrialReadingCriterionId,
|
||||
PageIndex: 1,
|
||||
PageSize: 1000
|
||||
}
|
||||
const res = await getTrialCriterionKeyFileList(param)
|
||||
if (res.IsSuccess) {
|
||||
let list = res.Result.CurrentPageData.map(item => {
|
||||
return {
|
||||
Id: item.Id,
|
||||
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]
|
||||
}
|
||||
}
|
||||
this.fileList = res.Result
|
||||
if (this.fileList.length > 0) {
|
||||
this.preview(this.fileList[0])
|
||||
}
|
||||
}
|
||||
this.loading = false
|
||||
} catch (e) {
|
||||
this.loading = false
|
||||
|
|
@ -97,43 +77,38 @@ export default {
|
|||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.manuals-wrapper {
|
||||
<style lang="scss">
|
||||
.manuals-wrapper{
|
||||
display: flex;
|
||||
flex-direction: row !important;
|
||||
width: 100%;
|
||||
height: 95%;
|
||||
height: 100%;
|
||||
padding: 5px;
|
||||
overflow: hidden;
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
border-radius: 10px;
|
||||
background: #d0d0d0;
|
||||
}
|
||||
|
||||
.left-wrapper {
|
||||
.left-wrapper{
|
||||
box-sizing: border-box;
|
||||
margin-right: 10px;
|
||||
height: 100%;
|
||||
width: 300px;
|
||||
border: 1px solid #ddd;
|
||||
|
||||
.basic-content {
|
||||
.basic-content{
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.basic-content-empty {
|
||||
.basic-content-empty{
|
||||
padding: 5px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.file-item {
|
||||
.file-item{
|
||||
box-sizing: border-box;
|
||||
border-bottom: 1px solid #f3f3f3;
|
||||
height: 50px;
|
||||
|
|
@ -146,21 +121,18 @@ export default {
|
|||
text-overflow: ellipsis;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.activeItem {
|
||||
.activeItem{
|
||||
color: #428bca !important;
|
||||
border-bottom: 1px solid #f3f3f3 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.right-wrapper {
|
||||
.right-wrapper{
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.right-content {
|
||||
height: 100%;
|
||||
.right-content{
|
||||
height:100%;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
<!-- 影像质量问题 -->
|
||||
<div class="lesions">
|
||||
<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>
|
||||
|
||||
<!-- 测量问题 -->
|
||||
|
|
@ -37,8 +37,7 @@
|
|||
<div class="add-icon" @click.prevent="downloadTpl(item.LesionType)">
|
||||
<i class="el-icon-download" />
|
||||
</div>
|
||||
<div class="add-icon" style="margin: 0 5px;"
|
||||
@click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
|
||||
<div class="add-icon" style="margin: 0 5px;" @click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
|
||||
<i class="el-icon-upload2" />
|
||||
</div>
|
||||
<div class="add-icon" @click.prevent="handleAddOrEdit('add', item)">
|
||||
|
|
@ -155,7 +154,7 @@
|
|||
<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"
|
||||
:reading-task-state="readingTaskState" @setFormItemData="setFormItemData"
|
||||
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" />
|
||||
@resetFormItemData="resetFormItemData" />
|
||||
<el-form-item style="text-align: right">
|
||||
<el-button size="small" @click="addOrEdit.visible = false">
|
||||
{{ $t('common:button:cancel') }}
|
||||
|
|
@ -170,8 +169,7 @@
|
|||
<!-- 导入 -->
|
||||
<el-dialog v-if="upload.visible" :visible.sync="upload.visible" :close-on-click-modal="false"
|
||||
:title="upload.title" width="500px">
|
||||
<UploadExcel :visit-task-id="visitTaskId" :lesion-type="upload.lesionType" :TableName="upload.TableName"
|
||||
@close="uploadDlgClose" />
|
||||
<UploadExcel :visit-task-id="visitTaskId" :lesion-type="upload.lesionType" :TableName="upload.TableName" @close="uploadDlgClose" />
|
||||
</el-dialog>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -284,9 +282,6 @@ export default {
|
|||
DicomEvent.$off('refreshQuestions')
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
async initList() {
|
||||
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
|
||||
if (i > -1) {
|
||||
|
|
|
|||
|
|
@ -1,66 +1,119 @@
|
|||
<template>
|
||||
<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;">
|
||||
{{ language === 'en' ? question.GroupEnName : question.GroupName }}
|
||||
{{ language==='en'?question.GroupEnName:question.GroupName }}
|
||||
</h4>
|
||||
</div>
|
||||
<template v-else>
|
||||
<el-form-item
|
||||
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
|
||||
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[
|
||||
{
|
||||
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']
|
||||
},
|
||||
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
|
||||
:label="`${question.QuestionName}`"
|
||||
:prop="question.Id"
|
||||
:rules="[
|
||||
{ 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"
|
||||
@change="((val) => { formItemChange(val, question) })" />
|
||||
<el-input
|
||||
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"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2"
|
||||
@change="((val) => { formItemChange(val, question) })" />
|
||||
<el-input
|
||||
v-else-if="question.Type==='textarea'"
|
||||
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)"
|
||||
clearable @change="((val) => { formItemChange(val, question) })">
|
||||
clearable
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<template v-if="question.TableQuestionType === 1">
|
||||
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
|
||||
:value="item[question.DataTableColumn]" />
|
||||
<el-option
|
||||
v-for="item in organList"
|
||||
:key="item.Id"
|
||||
:label="item[question.DataTableColumn]"
|
||||
:value="item[question.DataTableColumn]"
|
||||
/>
|
||||
</template>
|
||||
<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)"
|
||||
:label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<template
|
||||
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
|
||||
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
|
||||
:label="item.label" />
|
||||
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<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>
|
||||
</el-select>
|
||||
<!-- 单选 -->
|
||||
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2" @change="((val) => { formItemChange(val, question) })">
|
||||
<el-radio-group
|
||||
v-else-if="question.Type==='radio'"
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2"
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-radio-group>
|
||||
<!-- 复选框 -->
|
||||
<el-checkbox-group v-else-if="question.Type === 'checkbox'" 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">
|
||||
<el-checkbox-group
|
||||
v-else-if="question.Type==='checkbox'"
|
||||
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 }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
|
|
@ -90,39 +143,41 @@
|
|||
@change="((val)=>{formItemChange(val, question)})"
|
||||
/>
|
||||
</template> -->
|
||||
<div style="display: flex;justify-content: space-between;"
|
||||
v-else-if="question.Type === 'calculation' || question.Type === 'number'">
|
||||
<!-- 数值类型 -->
|
||||
<el-input v-if="question.Type === 'number'" v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2" type="number" @change="((val) => { formItemChange(val, question) })">
|
||||
<el-input
|
||||
v-else-if="question.Type==='number'"
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState>=2 "
|
||||
type="number"
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<template v-if="question.Unit" slot="append">
|
||||
{{ $fd('ValueUnit', parseInt(question.Unit)) }}
|
||||
</template>
|
||||
</el-input>
|
||||
|
||||
<el-input v-else-if="question.Type === 'calculation'" v-model="questionForm[question.Id]" disabled
|
||||
@change="((val) => { formItemChange(val, question) })">
|
||||
<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>
|
||||
<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-form-item>
|
||||
</template>
|
||||
|
||||
<QuestionTableFormItem v-for="item in question.Childrens" :key="item.Id" :question="item"
|
||||
:question-form="questionForm" :reading-task-state="readingTaskState" @setFormItemData="setFormItemData"
|
||||
@resetFormItemData="resetFormItemData" @handleReadingChart="handleReadingChart" />
|
||||
<QuestionTableFormItem
|
||||
v-for="item in question.Childrens"
|
||||
:key="item.Id"
|
||||
:question="item"
|
||||
:question-form="questionForm"
|
||||
:reading-task-state="readingTaskState"
|
||||
@setFormItemData="setFormItemData"
|
||||
@resetFormItemData="resetFormItemData"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
|
@ -159,9 +214,6 @@ export default {
|
|||
this.digitPlaces = Number(localStorage.getItem('digitPlaces'))
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
formItemChange(v, question) {
|
||||
if (question.Childrens && question.Childrens.length > 0) {
|
||||
this.resetChild(question.Childrens)
|
||||
|
|
@ -217,36 +269,29 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.mb {
|
||||
.mb{
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
.disabled{
|
||||
::v-deep .el-upload--picture-card {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.uploadWrapper {
|
||||
.uploadWrapper{
|
||||
display: flex;
|
||||
flex-direction: column !important;
|
||||
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;
|
||||
}
|
||||
|
||||
::v-deep .el-input-group__append,
|
||||
.el-input-group__prepend {
|
||||
}
|
||||
::v-deep .el-input-group__append, .el-input-group__prepend{
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
}
|
||||
::v-deep .el-form-item__content {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
::v-deep .el-select.is-disabled .el-input__inner {
|
||||
}
|
||||
::v-deep .el-select.is-disabled .el-input__inner{
|
||||
background-color: #646464a1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
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">
|
||||
<el-upload
|
||||
class="upload-demo"
|
||||
|
|
|
|||
|
|
@ -3,22 +3,15 @@
|
|||
<div class="base-dialog-body" style="height:380px;overflow-y: auto;">
|
||||
<el-form ref="otherForm" :model="form">
|
||||
<!-- 自动切换下一个任务不必提示 -->
|
||||
<el-form-item :label="$t('trials:reading:label:autoSwitch')" prop="AutoCutNextTask" :rules="[
|
||||
{ required: true, message: $t('common:ruleMessage:select') }
|
||||
]">
|
||||
<el-form-item
|
||||
:label="$t('trials:reading:label:autoSwitch')"
|
||||
prop="AutoCutNextTask"
|
||||
:rules="[
|
||||
{ required: true, message: $t('common:ruleMessage:select')}
|
||||
]"
|
||||
>
|
||||
<el-switch v-model="form.AutoCutNextTask" />
|
||||
</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>
|
||||
</div>
|
||||
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
|
||||
|
|
@ -34,8 +27,7 @@ export default {
|
|||
data() {
|
||||
return {
|
||||
form: {
|
||||
AutoCutNextTask: false,
|
||||
IsDoubleScreen: false
|
||||
AutoCutNextTask: false
|
||||
},
|
||||
loading: false
|
||||
}
|
||||
|
|
@ -50,7 +42,6 @@ export default {
|
|||
const res = await getAutoCutNextTask()
|
||||
if (res.IsSuccess) {
|
||||
this.form.AutoCutNextTask = res.Result.AutoCutNextTask
|
||||
this.form.IsDoubleScreen = res.Result.IsDoubleScreen
|
||||
}
|
||||
this.loading = false
|
||||
} catch (e) {
|
||||
|
|
@ -75,4 +66,6 @@ export default {
|
|||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss"></style>
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
<template>
|
||||
<el-form v-if="isRender" ref="measurementForm" v-loading="loading" :model="questionForm" size="mini"
|
||||
class="measurement-form">
|
||||
<el-form
|
||||
v-if="isRender"
|
||||
ref="measurementForm"
|
||||
v-loading="loading"
|
||||
:model="questionForm"
|
||||
size="mini"
|
||||
class="measurement-form"
|
||||
>
|
||||
<div class="base-dialog-body">
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
||||
|
|
@ -14,109 +20,177 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<el-form-item :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 :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-form-item
|
||||
: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
|
||||
: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-form-item>
|
||||
<el-form-item v-for="qs in questions" v-show="qs.ShowQuestion !== 2" :key="qs.Id" :label="`${qs.QuestionName}`"
|
||||
:prop="qs.Id" :rules="qs.QuestionMark === 11 ? [
|
||||
{
|
||||
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']
|
||||
}, { 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']
|
||||
}]">
|
||||
<el-form-item
|
||||
v-for="qs in questions"
|
||||
v-show="qs.ShowQuestion!==2"
|
||||
:key="qs.Id"
|
||||
:label="`${qs.QuestionName}`"
|
||||
:prop="qs.Id"
|
||||
:rules="qs.QuestionMark===11?[
|
||||
{ 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']},{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 }}
|
||||
{{ questionForm.IsCanEditPosition }} -->
|
||||
|
||||
<!-- 输入框 min="1"
|
||||
@input="questionForm[qs.Id]=questionForm[qs.Id].replace(/^(0+)|[^\d]+/g,'')"-->
|
||||
<template v-if="qs.Type === 'input' || qs.Type === 'number'">
|
||||
<template v-if="qs.QuestionMark === 11">
|
||||
<div style="display: flex;justify-content: space-between;">
|
||||
<el-input v-model="questionForm[qs.Id]" :disabled="!isCurrentTask || readingTaskState >= 2" type="number"
|
||||
@focus="focusQs = { ...qs }" @change="((val) => { formItemChange(val, qs) })">
|
||||
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
|
||||
<template v-if="qs.Type==='input' || qs.Type==='number'">
|
||||
<template v-if="qs.QuestionMark===11">
|
||||
<el-input
|
||||
v-model="questionForm[qs.Id]"
|
||||
:disabled="!isCurrentTask || readingTaskState>=2 "
|
||||
type="number"
|
||||
|
||||
@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>
|
||||
<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>
|
||||
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-input 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') && lesionType !== 2) || qs.QuestionMark === 9 || (qs.QuestionMark === 10 && isCurrentTaskAdd === 'False')"
|
||||
@focus="focusQs = { ...qs }" @change="((val) => { formItemChange(val, qs) })">
|
||||
<template v-if="(qs.QuestionMark === 0 || qs.QuestionMark === 1) && qs.Unit" slot="append">
|
||||
<el-input
|
||||
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') && lesionType !== 2) || qs.QuestionMark === 9 || (qs.QuestionMark === 10 && isCurrentTaskAdd === 'False')"
|
||||
@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>
|
||||
<!-- 多行文本输入框 -->
|
||||
<el-input v-if="qs.Type === 'textarea'" 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
|
||||
: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) })">
|
||||
<el-input
|
||||
v-if="qs.Type==='textarea'"
|
||||
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
|
||||
: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">
|
||||
<el-option v-for="item in organList" :key="item.Id" :label="item[qs.DataTableColumn]"
|
||||
:value="item[qs.DataTableColumn]" />
|
||||
<el-option
|
||||
v-for="item in organList"
|
||||
:key="item.Id"
|
||||
:label="item[qs.DataTableColumn]"
|
||||
:value="item[qs.DataTableColumn]"
|
||||
/>
|
||||
</template>
|
||||
<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 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 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 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>
|
||||
|
||||
</el-select>
|
||||
<!-- 单选 -->
|
||||
<el-radio-group v-if="qs.Type === 'radio'" v-model="questionForm[qs.id]"
|
||||
:disabled="!isCurrentTask || readingTaskState >= 2">
|
||||
<el-radio v-for="val in qs.options.split('|')" :key="val" :label="val">
|
||||
<el-radio-group
|
||||
v-if="qs.Type==='radio'"
|
||||
v-model="questionForm[qs.id]"
|
||||
:disabled="!isCurrentTask || readingTaskState>=2"
|
||||
>
|
||||
<el-radio
|
||||
v-for="val in qs.options.split('|')"
|
||||
:key="val"
|
||||
:label="val"
|
||||
>
|
||||
{{ val }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
</div>
|
||||
<div v-if="isCurrentTask && readingTaskState < 2" class="base-dialog-footer"
|
||||
style="text-align:right;margin-top:10px;">
|
||||
<div
|
||||
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') }}
|
||||
</el-button>
|
||||
<!-- 删除 -->
|
||||
<el-button v-if="isCurrentTaskAdd !== 'False'" size="mini" style="margin-left: 5px;padding:7px 10px"
|
||||
@click="handleDelete">
|
||||
<el-button
|
||||
v-if="isCurrentTaskAdd !== 'False'"
|
||||
size="mini"
|
||||
style="margin-left: 5px;padding:7px 10px"
|
||||
@click="handleDelete"
|
||||
>
|
||||
{{ $t('common:button:delete') }}
|
||||
</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') }}
|
||||
</el-button>
|
||||
</div>
|
||||
|
|
@ -213,9 +287,6 @@ export default {
|
|||
DicomEvent.$off('handleImageQualityAbnormal')
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
validateLesionCount(rule, value, callback) {
|
||||
// const reg = /^[1-9][0-9]?$|^100$/
|
||||
// const reg = /^(0+)|[^\d]+/g
|
||||
|
|
@ -576,7 +647,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:readingPGWC:warnning:msg2'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -589,7 +660,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:readingPGWC:warnning:msg3'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -601,7 +672,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:readingPGWC:warnning:msg4'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -613,7 +684,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:readingPGWC:warnning:msg5'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -625,7 +696,7 @@ export default {
|
|||
this.$confirm(this.$t('trials:readingPGWC:warnning:msg6'), {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
loading.close()
|
||||
return
|
||||
|
|
@ -784,7 +855,7 @@ export default {
|
|||
type: 'warning',
|
||||
distinguishCancelAndClose: true
|
||||
})
|
||||
.then(async () => {
|
||||
.then(async() => {
|
||||
// 移除新建病灶并关闭窗口
|
||||
if (this.questionForm.MeasureData) {
|
||||
var remark = this.getLesionName(this.orderMark, this.questionForm.RowIndex)
|
||||
|
|
@ -793,7 +864,7 @@ export default {
|
|||
DicomEvent.$emit('getMeasureData')
|
||||
this.$emit('close', { lesionType: this.lesionType, rowIndex: this.rowIndex, visitTaskId: this.visitTaskId })
|
||||
})
|
||||
.catch(() => { })
|
||||
.catch(() => {})
|
||||
} else {
|
||||
if (this.questionForm.isSave === false) {
|
||||
// '当前病灶信息有更新,未保存,是否继续?'
|
||||
|
|
@ -804,7 +875,7 @@ export default {
|
|||
.then(() => {
|
||||
this.$emit('close')
|
||||
})
|
||||
.catch(() => { })
|
||||
.catch(() => {})
|
||||
} else {
|
||||
this.$emit('close')
|
||||
}
|
||||
|
|
@ -829,45 +900,39 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.measurement-form {
|
||||
::v-deep .el-form-item__label {
|
||||
.measurement-form{
|
||||
::v-deep .el-form-item__label{
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
::v-deep .el-input .el-input__inner {
|
||||
::v-deep .el-input .el-input__inner{
|
||||
background-color: transparent;
|
||||
color: #ddd;
|
||||
border: 1px solid #5e5e5e;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
::v-deep .el-form-item{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
::v-deep .el-form-item__content{
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
::v-deep .el-input.is-disabled .el-input__inner {
|
||||
::v-deep .el-input.is-disabled .el-input__inner{
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
::v-deep .el-select.is-disabled .el-input__inner {
|
||||
::v-deep .el-select.is-disabled .el-input__inner{
|
||||
background-color: #646464a1;
|
||||
}
|
||||
|
||||
.el-form-item__content .el-select {
|
||||
.el-form-item__content
|
||||
.el-select{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.input-width1 {
|
||||
width: calc(100% - 60px) !important;
|
||||
.input-width1{
|
||||
width: calc(100% - 60px)!important;
|
||||
}
|
||||
|
||||
.input-width2 {
|
||||
.input-width2{
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -8,64 +8,58 @@
|
|||
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
||||
</h3>
|
||||
<div v-if="readingTaskState < 2">
|
||||
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')"
|
||||
placement="bottom">
|
||||
<i class="el-icon-refresh-left" @click="resetMeasuredData" />
|
||||
<el-tooltip class="item" effect="dark" :content="$t('trials:dicomReading:message:confirmReset')" placement="bottom">
|
||||
<i
|
||||
class="el-icon-refresh-left"
|
||||
@click="resetMeasuredData"
|
||||
/>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 非测量问题 -->
|
||||
<div class="lesions">
|
||||
<Questions ref="ecrf" :question-form-change-state="questionFormChangeState"
|
||||
:question-form-change-num="questionFormChangeNum" :is-first-change-task="isFirstChangeTask"
|
||||
@handleReadingChart="handleReadingChart" />
|
||||
<Questions
|
||||
ref="ecrf"
|
||||
:question-form-change-state="questionFormChangeState"
|
||||
:question-form-change-num="questionFormChangeNum"
|
||||
:is-first-change-task="isFirstChangeTask"
|
||||
/>
|
||||
</div>
|
||||
<!-- 测量问题 -->
|
||||
<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;">
|
||||
{{ language === 'en' ? qs.GroupEnName : qs.GroupName }}
|
||||
{{ language==='en'?qs.GroupEnName:qs.GroupName }}
|
||||
</h4>
|
||||
<div class="lesion_list">
|
||||
<div v-for="item in qs.Childrens"
|
||||
v-show="!(isBaseLineTask && item.LesionType === 2) && !(isBaseLineTask && item.LesionType === 3)"
|
||||
:key="item.Id">
|
||||
<div v-for="item in qs.Childrens" 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 class="title">{{ item.QuestionName }}
|
||||
<svg-icon v-if="item.LesionType === 4" icon-class="readingChart"
|
||||
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)">
|
||||
<div class="title">{{ item.QuestionName }}</div>
|
||||
<div v-if="readingTaskState<2 && (isBaseLineTask || item.LesionType === 2)" class="add-icon" @click.prevent="handleAdd(item)">
|
||||
<i class="el-icon-plus" />
|
||||
</div>
|
||||
</div>
|
||||
<el-collapse v-if="item.Type === 'table' && item.TableQuestions" v-model="activeName" accordion
|
||||
@change="handleCollapseChange">
|
||||
<el-collapse-item v-for="(q, i) in item.TableQuestions.Answers" :key="`${item.Id}_${q.RowIndex}`"
|
||||
<el-collapse
|
||||
v-if="item.Type === 'table' && item.TableQuestions"
|
||||
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}`"
|
||||
@contextmenu.prevent.native="collapseRightClick($event, q, item.Id, q.RowIndex)">
|
||||
@contextmenu.prevent.native="collapseRightClick($event,q,item.Id,q.RowIndex)"
|
||||
>
|
||||
<template slot="title">
|
||||
<div style="width:300px;position: relative;"
|
||||
:style="{ color: (activeName === item.Id + q.RowIndex ? '#ffeb3b' : '#fff') }">
|
||||
{{ getLesionName(item.OrderMark, q.RowIndex, qs.Childrens) }}
|
||||
<div style="width:300px;position: relative;" :style="{color:(activeName===item.Id+q.RowIndex?'#ffeb3b':'#fff')}">
|
||||
{{ getLesionName(item.OrderMark,q.RowIndex, qs.Childrens) }}
|
||||
<!-- 未保存 -->
|
||||
<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">
|
||||
<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">
|
||||
<i class="el-icon-warning" style="color:red" />
|
||||
</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">
|
||||
<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">
|
||||
<i class="el-icon-warning" style="color:#ff9800" />
|
||||
</el-tooltip>
|
||||
<div style="position: absolute;left: 60px;top: 2px;">
|
||||
|
|
@ -74,29 +68,37 @@
|
|||
{{ item.TableQuestions.Answers[i].lesionPart }}
|
||||
</div>
|
||||
<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 v-if="item.TableQuestions.Answers[i].lesionType"
|
||||
style="margin-left:10px;margin-bottom:5px;">
|
||||
<div v-if="item.TableQuestions.Answers[i].lesionType" style="margin-left:10px;margin-bottom:5px;">
|
||||
{{ item.TableQuestions.Answers[i].lesionType }}
|
||||
</div>
|
||||
<div
|
||||
v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionNum)) && item.LesionType === 4"
|
||||
style="margin-left:10px;">
|
||||
<div v-if="!isNaN(parseInt(item.TableQuestions.Answers[i].lesionNum)) && item.LesionType === 4" style="margin-left:10px;">
|
||||
{{ item.TableQuestions.Answers[i].lesionNum }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<QuestionForm :ref="`${item.Id}_${q.RowIndex}`" :questions="item.TableQuestions.Questions"
|
||||
:answers="item.TableQuestions.Answers[i]" :lesion-type="item.LesionType"
|
||||
:order-mark="item.OrderMark" :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"
|
||||
@determineExistsUnsavedLession="determineExistsUnsavedLession" @resetQuestions="resetQuestions"
|
||||
@close="close" @handleReadingChart="handleReadingChart" />
|
||||
<QuestionForm
|
||||
:ref="`${item.Id}_${q.RowIndex}`"
|
||||
:questions="item.TableQuestions.Questions"
|
||||
:answers="item.TableQuestions.Answers[i]"
|
||||
:lesion-type="item.LesionType"
|
||||
:order-mark="item.OrderMark"
|
||||
: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"
|
||||
@determineExistsUnsavedLession="determineExistsUnsavedLession"
|
||||
@resetQuestions="resetQuestions"
|
||||
@close="close"
|
||||
/>
|
||||
</el-collapse-item>
|
||||
|
||||
</el-collapse>
|
||||
|
|
@ -216,9 +218,6 @@ export default {
|
|||
DicomEvent.$off('getUnSaveTarget')
|
||||
},
|
||||
methods: {
|
||||
handleReadingChart(e) {
|
||||
this.$emit('handleReadingChart', e)
|
||||
},
|
||||
async initList() {
|
||||
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
|
||||
if (i > -1) {
|
||||
|
|
@ -520,7 +519,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
return
|
||||
}
|
||||
|
|
@ -531,7 +530,7 @@ export default {
|
|||
this.$confirm(msg, {
|
||||
type: 'warning',
|
||||
showCancelButton: false,
|
||||
callback: action => { }
|
||||
callback: action => {}
|
||||
})
|
||||
} else {
|
||||
var obj = { saveTypeEnum: 0 }
|
||||
|
|
@ -799,26 +798,23 @@ export default {
|
|||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.measurement-wrapper {
|
||||
.measurement-wrapper{
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
// overflow: hidden;
|
||||
|
||||
.container {
|
||||
.container{
|
||||
padding: 10px;
|
||||
|
||||
.basic-info {
|
||||
.basic-info{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
h3 {
|
||||
h3{
|
||||
color: #ddd;
|
||||
padding: 5px 0px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
i {
|
||||
i{
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
|
|
@ -826,16 +822,14 @@ export default {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
.title{
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
font-size: 15px;
|
||||
|
||||
}
|
||||
|
||||
.add-icon {
|
||||
.add-icon{
|
||||
padding: 5px;
|
||||
font-weight: bold;
|
||||
color: #ddd;
|
||||
|
|
@ -844,49 +838,42 @@ export default {
|
|||
margin-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.add-icon:hover {
|
||||
.add-icon:hover{
|
||||
background-color: #607d8b;
|
||||
}
|
||||
|
||||
.flex-row {
|
||||
.flex-row{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
background-color: #424242;
|
||||
|
||||
}
|
||||
|
||||
.lesion_list {
|
||||
.lesion_list{
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.el-collapse {
|
||||
border-bottom: none;
|
||||
border-top: none;
|
||||
|
||||
::v-deep .el-collapse-item {
|
||||
background-color: #000 !important;
|
||||
.el-collapse{
|
||||
border-bottom:none;
|
||||
border-top:none;
|
||||
::v-deep .el-collapse-item{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__header {
|
||||
background-color: #000 !important;
|
||||
::v-deep .el-collapse-item__header{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
border-bottom-color: #5a5a5a;
|
||||
border-bottom-color:#5a5a5a;
|
||||
padding-left: 5px;
|
||||
height: 35px;
|
||||
line-height: 35px;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__wrap {
|
||||
background-color: #000 !important;
|
||||
::v-deep .el-collapse-item__wrap{
|
||||
background-color: #000!important;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
::v-deep .el-collapse-item__content {
|
||||
width: 260px;
|
||||
::v-deep .el-collapse-item__content{
|
||||
width:260px;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
|
|
@ -895,9 +882,10 @@ export default {
|
|||
z-index: 1;
|
||||
color: #ddd;
|
||||
padding: 5px;
|
||||
background-color: #1e1e1e;
|
||||
background-color:#1e1e1e;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
|
|
|
|||
|
|
@ -6,54 +6,47 @@
|
|||
>
|
||||
{{ question.GroupName }}
|
||||
</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;">
|
||||
{{ language === 'en' ? question.GroupEnName : question.GroupName }}
|
||||
{{ language==='en'?question.GroupEnName:question.GroupName }}
|
||||
</h4>
|
||||
</div>
|
||||
<template v-else-if="((question.QuestionType === 56 || question.QuestionType === 57) && question.IsBaseLineTask)" />
|
||||
<template v-else>
|
||||
|
||||
<el-form-item
|
||||
v-if="(question.ShowQuestion === 1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion === 0"
|
||||
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[
|
||||
{
|
||||
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']
|
||||
},
|
||||
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
|
||||
:label="`${question.QuestionName}`"
|
||||
:prop="question.Id"
|
||||
:rules="[
|
||||
{ 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">
|
||||
<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;">
|
||||
|
||||
<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-button v-if="!questionForm[question.Id] && readingTaskState !== 2" size="mini" type="text"
|
||||
@click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation') }}</el-button>
|
||||
<el-button v-if="!questionForm[question.Id] && readingTaskState!== 2" size="mini" type="text" @click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation') }}</el-button>
|
||||
<!-- 清除标记 -->
|
||||
<el-button v-if="questionForm[question.Id] && readingTaskState !== 2" size="mini" type="text"
|
||||
@click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button>
|
||||
<el-button v-if="questionForm[question.Id]&& readingTaskState!== 2" size="mini" type="text" @click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button>
|
||||
<!-- 定位 -->
|
||||
<el-button v-if="questionForm[question.Id]" size="mini" type="text" @click="locateAnnotation(question)">{{
|
||||
$t('trials:lugano:button:locateAnnotation') }}</el-button>
|
||||
<el-button v-if="questionForm[question.Id]" size="mini" type="text" @click="locateAnnotation(question)">{{ $t('trials:lugano:button:locateAnnotation') }}</el-button>
|
||||
<!-- 保存 -->
|
||||
<el-button v-if="readingTaskState !== 2 && question.SaveEnum === 1" size="mini" type="text"
|
||||
@click="saveAnnotation(question)">
|
||||
<el-button v-if="readingTaskState!== 2 && question.SaveEnum === 1" size="mini" type="text" @click="saveAnnotation(question)">
|
||||
<!-- 未保存 -->
|
||||
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
|
||||
<i class="el-icon-warning" style="color:red" />
|
||||
|
|
@ -63,101 +56,157 @@
|
|||
</div>
|
||||
</template>
|
||||
|
||||
<template
|
||||
v-else-if="question.QuestionType === 48 || question.QuestionType === 51 || question.QuestionType === 52 || question.QuestionType === 53">
|
||||
<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>
|
||||
<template v-else-if="question.QuestionType === 48 || question.QuestionType === 51 || question.QuestionType === 52 || question.QuestionType === 53">
|
||||
<el-input
|
||||
v-if="question.Type==='calculation'"
|
||||
v-model="questionForm[question.Id]"
|
||||
disabled
|
||||
>
|
||||
<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>
|
||||
|
||||
</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"
|
||||
@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"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }" maxlength="500" :disabled="readingTaskState >= 2 || isFirstChangeTask"
|
||||
@change="((val) => { formItemChange(val, question) })" />
|
||||
<el-input
|
||||
v-else-if="question.Type==='textarea'"
|
||||
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"
|
||||
clearable @change="((val) => { formItemChange(val, question) })">
|
||||
clearable
|
||||
@change="((val)=>{formItemChange(val, question)})"
|
||||
>
|
||||
<template v-if="question.TableQuestionType === 1">
|
||||
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
|
||||
:value="item[question.DataTableColumn]" />
|
||||
<el-option
|
||||
v-for="item in organList"
|
||||
:key="item.Id"
|
||||
:label="item[question.DataTableColumn]"
|
||||
:value="item[question.DataTableColumn]"
|
||||
/>
|
||||
</template>
|
||||
<template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 47 && question.IsBaseLineTask">
|
||||
<el-option v-for="item of $d[question.DictionaryCode]"
|
||||
v-show="item.value === 1 || item.value === 2 || item.value === 5" :key="item.id"
|
||||
:value="String(item.value)" :label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
v-show="item.value === 1 ||item.value === 2 || item.value === 5 "
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</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-group
|
||||
: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"
|
||||
:value="String(item.value)" :label="item.label" />
|
||||
: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"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</el-option-group>
|
||||
</template>
|
||||
<template v-else-if="question.QuestionGenre === 3 && question.QuestionType === 49 && question.IsBaseLineTask">
|
||||
<el-option v-for="item of $d[question.DictionaryCode]"
|
||||
v-show="item.value === 1 || item.value === 5 || item.value === 6" :key="item.id"
|
||||
:value="String(item.value)" :label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
v-show="item.value === 1 ||item.value === 5 || item.value === 6 "
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</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-group
|
||||
: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"
|
||||
:key="item.id" :value="String(item.value)" :label="item.label" />
|
||||
: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"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</el-option-group>
|
||||
</template>
|
||||
<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)"
|
||||
:label="item.label" />
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<template
|
||||
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
|
||||
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="String(item.value)"
|
||||
:label="item.label" />
|
||||
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
|
||||
<el-option
|
||||
v-for="item of $d[question.DictionaryCode]"
|
||||
:key="item.id"
|
||||
:value="String(item.value)"
|
||||
:label="item.label"
|
||||
/>
|
||||
</template>
|
||||
<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>
|
||||
</el-select>
|
||||
<!-- 单选 -->
|
||||
<el-radio-group v-else-if="question.Type === 'radio'" v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2 || isFirstChangeTask" @change="((val) => { formItemChange(val, question) })">
|
||||
<el-radio-group
|
||||
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">
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
<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 }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-radio-group>
|
||||
<!-- 复选框 -->
|
||||
<el-checkbox-group v-else-if="question.Type === 'checkbox'" v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2 || isFirstChangeTask">
|
||||
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
|
||||
<el-checkbox-group
|
||||
v-else-if="question.Type==='checkbox'"
|
||||
v-model="questionForm[question.Id]"
|
||||
:disabled="readingTaskState >= 2 || isFirstChangeTask"
|
||||
>
|
||||
<el-checkbox
|
||||
v-for="val in question.TypeValue.split('|')"
|
||||
:key="val"
|
||||
:label="val"
|
||||
>
|
||||
{{ val }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
|
|
@ -168,53 +217,80 @@
|
|||
:disabled="readingTaskState >= 2 || isFirstChangeTask"
|
||||
:precision="2"
|
||||
/> -->
|
||||
<div style="display: flex;justify-content: space-between;"
|
||||
v-else-if="question.Type === 'number' || question.Type === 'calculation'">
|
||||
<template v-if="question.Type === 'number'">
|
||||
<el-input-number v-if="question.ValueType === 0" v-model="questionForm[question.Id]" :precision="0"
|
||||
:disabled="readingTaskState >= 2 || isFirstChangeTask" />
|
||||
<el-input-number v-else-if="question.ValueType === 3" 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 v-else-if="question.Type==='number'">
|
||||
<el-input-number
|
||||
v-if="question.ValueType === 0"
|
||||
v-model="questionForm[question.Id]"
|
||||
:precision="0"
|
||||
:disabled="readingTaskState >= 2 || isFirstChangeTask"
|
||||
/>
|
||||
<el-input-number
|
||||
v-else-if="question.ValueType === 3"
|
||||
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>
|
||||
<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>
|
||||
</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"
|
||||
: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">
|
||||
<el-upload
|
||||
v-else-if="question.Type==='upload'"
|
||||
action
|
||||
: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 || isFirstChangeTask"
|
||||
>
|
||||
<i slot="default" class="el-icon-plus" />
|
||||
<div slot="file" slot-scope="{file}">
|
||||
<img class="el-upload-list__item-thumbnail" :src="OSSclientConfig.basePath + file.url" alt="">
|
||||
<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-preview" @click="handlePictureCardPreview(file)">
|
||||
<span
|
||||
class="el-upload-list__item-preview"
|
||||
@click="handlePictureCardPreview(file)"
|
||||
>
|
||||
<i class="el-icon-zoom-in" />
|
||||
</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" />
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</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%">
|
||||
<div slot="placeholder" class="image-slot">
|
||||
加载中<span class="dot">...</span>
|
||||
|
|
@ -224,9 +300,17 @@
|
|||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<QuestionItem v-for="(item) in question.Childrens" :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" />
|
||||
<QuestionItem
|
||||
v-for="(item) in question.Childrens"
|
||||
: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>
|
||||
</template>
|
||||
<script>
|
||||
|
|
@ -339,7 +423,7 @@ export default {
|
|||
.then(() => {
|
||||
DicomEvent.$emit('removeAnnotation', question)
|
||||
})
|
||||
.catch(() => { })
|
||||
.catch(() => {})
|
||||
},
|
||||
locateAnnotation(question) {
|
||||
DicomEvent.$emit('locateAnnotation', question)
|
||||
|
|
@ -395,36 +479,29 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.mb {
|
||||
.mb{
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
.disabled{
|
||||
::v-deep .el-upload--picture-card {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.uploadWrapper {
|
||||
.uploadWrapper{
|
||||
display: flex;
|
||||
flex-direction: column !important;
|
||||
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;
|
||||
}
|
||||
|
||||
::v-deep .el-input-group__append,
|
||||
.el-input-group__prepend {
|
||||
}
|
||||
::v-deep .el-input-group__append, .el-input-group__prepend{
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
::v-deep .el-form-item__content {
|
||||
}
|
||||
::v-deep .el-form-item__content {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
::v-deep .el-select.is-disabled .el-input__inner {
|
||||
}
|
||||
::v-deep .el-select.is-disabled .el-input__inner{
|
||||
background-color: #646464a1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||