自定义阅片更改及非dicom阅片添加个性化配置
continuous-integration/drone/push Build is passing Details

uat
caiyiling 2025-03-21 15:03:21 +08:00
parent 6b10d07e2a
commit 272c28a988
6 changed files with 310 additions and 234 deletions

View File

@ -76,7 +76,7 @@
<el-input <el-input
v-if="question.Type==='input'" v-if="question.Type==='input'"
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
:disabled="question.TableQuestionType === 2" :disabled="question.TableQuestionType === 2 || readingTaskState === 2"
/> />
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input
@ -84,13 +84,14 @@
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
type="textarea" type="textarea"
:autosize="{ minRows: 2, maxRows: 4}" :autosize="{ minRows: 2, maxRows: 4}"
:disabled="readingTaskState === 2"
/> />
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select
v-if="question.Type==='select'" v-if="question.Type==='select'"
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
clearable clearable
:disabled="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode" :disabled="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode || readingTaskState === 2"
@change="((val)=>{formItemChange(val, question)})" @change="((val)=>{formItemChange(val, question)})"
> >
<template v-if="question.TableQuestionType === 1"> <template v-if="question.TableQuestionType === 1">
@ -132,6 +133,7 @@
v-if="question.Type==='radio'" v-if="question.Type==='radio'"
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
@change="((val)=>{formItemChange(val, question)})" @change="((val)=>{formItemChange(val, question)})"
:disabled="readingTaskState === 2"
> >
<el-radio <el-radio
v-for="val in question.TypeValue.split('|')" v-for="val in question.TypeValue.split('|')"
@ -145,6 +147,7 @@
<el-checkbox-group <el-checkbox-group
v-if="question.Type==='checkbox'" v-if="question.Type==='checkbox'"
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
:disabled="readingTaskState === 2"
> >
<el-checkbox <el-checkbox
v-for="val in question.TypeValue.split('|')" v-for="val in question.TypeValue.split('|')"
@ -158,12 +161,12 @@
<el-input <el-input
v-if="question.Type === 'class' && question.ClassifyShowType === 1" v-if="question.Type === 'class' && question.ClassifyShowType === 1"
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
:disabled="!question.ClassifyEditType" :disabled="!question.ClassifyEditType || readingTaskState === 2"
/> />
<el-select <el-select
v-if="question.Type === 'class' && question.ClassifyShowType === 2" v-if="question.Type === 'class' && question.ClassifyShowType === 2"
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
:disabled="!question.ClassifyEditType" :disabled="!question.ClassifyEditType || readingTaskState === 2"
@change="(val) => { formItemChange(val, question) }" @change="(val) => { formItemChange(val, question) }"
> >
<el-option <el-option
@ -176,7 +179,7 @@
<el-radio-group <el-radio-group
v-if="question.Type === 'class' && question.ClassifyShowType === 3" v-if="question.Type === 'class' && question.ClassifyShowType === 3"
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
:disabled="!question.ClassifyEditType" :disabled="!question.ClassifyEditType || readingTaskState === 2"
@change="(val) => { formItemChange(val, question) }" @change="(val) => { formItemChange(val, question) }"
> >
<el-radio <el-radio
@ -190,7 +193,7 @@
<el-input <el-input
v-if="question.Type === 'class' && question.ClassifyShowType === 4" v-if="question.Type === 'class' && question.ClassifyShowType === 4"
type="number" type="number"
:disabled="!question.ClassifyEditType" :disabled="!question.ClassifyEditType || readingTaskState === 2"
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
@change="(val) => { formItemNumberChange(val, question) }" @change="(val) => { formItemNumberChange(val, question) }"
/> />
@ -215,6 +218,7 @@
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
clearable clearable
@change="(val) => { formItemNumberChange(val, question) }" @change="(val) => { formItemNumberChange(val, question) }"
:disabled="readingTaskState === 2"
> >
<el-option <el-option
v-for="val in question.TypeValue.split('|')" v-for="val in question.TypeValue.split('|')"
@ -229,6 +233,7 @@
@change="(val) => { formItemNumberChange(val, question) }" @change="(val) => { formItemNumberChange(val, question) }"
@blur="handleBlur(questionForm[question.Id], questionForm, question.Id)" @blur="handleBlur(questionForm[question.Id], questionForm, question.Id)"
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
:disabled="readingTaskState === 2"
> >
<!-- <template slot="append">1</template> --> <!-- <template slot="append">1</template> -->
<template slot="append" v-if="question.Unit !== 0">{{question.Unit !== 4 ? $fd('ValueUnit', question.Unit) : question.CustomUnit}}</template> <template slot="append" v-if="question.Unit !== 0">{{question.Unit !== 4 ? $fd('ValueUnit', question.Unit) : question.CustomUnit}}</template>
@ -238,7 +243,7 @@
type="number" type="number"
v-if="question.Type === 'number' && !question.TypeValue && question.DataSource === 1" v-if="question.Type === 'number' && !question.TypeValue && question.DataSource === 1"
@blur="handleBlur(questionForm[question.Id], questionForm, question.Id)" @blur="handleBlur(questionForm[question.Id], questionForm, question.Id)"
:disabled="question.DataSource === 1" :disabled="question.DataSource === 1 || readingTaskState === 2"
v-model="questionForm[question.Id]" v-model="questionForm[question.Id]"
> >
<!-- <template slot="append">2</template> --> <!-- <template slot="append">2</template> -->
@ -248,6 +253,7 @@
<!-- 上传图像 --> <!-- 上传图像 -->
<el-upload <el-upload
v-if="question.Type==='upload'" v-if="question.Type==='upload'"
:disabled="readingTaskState === 2"
action action
:accept="question.FileType" :accept="question.FileType"
:limit="question.ImageCount === 0 ? 100 : question.ImageCount" :limit="question.ImageCount === 0 ? 100 : question.ImageCount"
@ -258,7 +264,7 @@
:file-list="fileList" :file-list="fileList"
:class="{disabled:question.ImageCount === 0 ? false : fileList.length >= question.ImageCount}" :class="{disabled:question.ImageCount === 0 ? false : fileList.length >= question.ImageCount}"
> >
<el-button slot="default" class="el-icon-plus"> <el-button slot="default" class="el-icon-plus" v-if="readingTaskState < 2">
{{this.$t('common:button:upload')}} {{this.$t('common:button:upload')}}
</el-button> </el-button>
</el-upload> </el-upload>
@ -446,6 +452,13 @@ export default {
this.formItemNumberChange(this.question.Id, false) this.formItemNumberChange(this.question.Id, false)
} }
}, },
readingTaskState: {
deep: true,
immediate: true,
handler(v, oldv) {
console.log(v)
}
}
}, },
mounted() { mounted() {
var digitPlaces = Number(localStorage.getItem('digitPlaces')) var digitPlaces = Number(localStorage.getItem('digitPlaces'))

View File

@ -194,7 +194,7 @@
</template> </template>
</template> </template>
<template v-else-if="task.VisitTaskId === visitTaskId && scope.row.Type === 'upload'"> <template v-else-if="task.VisitTaskId === visitTaskId && scope.row.Type === 'upload'">
<CustomizeReportPageUpload <customize-report-page-upload
v-if="scope.row.Type==='upload' && (scope.row.xfIndex || scope.row.xfIndex === 0)" v-if="scope.row.Type==='upload' && (scope.row.xfIndex || scope.row.xfIndex === 0)"
:visitTaskId="visitTaskId" :visitTaskId="visitTaskId"
:question="scope.row" :question="scope.row"
@ -202,8 +202,8 @@
:readingTaskState="readingTaskState" :readingTaskState="readingTaskState"
:initUrl="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]" :initUrl="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]"
@setImageUrl="(url) => {setImageUrl(scope.row.QuestionId, scope.row.xfIndex, scope.row.TableQuestionId, url, scope.row.RowId)}" @setImageUrl="(url) => {setImageUrl(scope.row.QuestionId, scope.row.xfIndex, scope.row.TableQuestionId, url, scope.row.RowId)}"
></CustomizeReportPageUpload> ></customize-report-page-upload>
<CustomizeReportPageUpload <customize-report-page-upload
v-else-if="scope.row.Type==='upload'" v-else-if="scope.row.Type==='upload'"
:visitTaskId="visitTaskId" :visitTaskId="visitTaskId"
:question="scope.row" :question="scope.row"
@ -211,25 +211,25 @@
:readingTaskState="readingTaskState" :readingTaskState="readingTaskState"
:initUrl="questionForm[scope.row.QuestionId]" :initUrl="questionForm[scope.row.QuestionId]"
@setImageUrl="(url) => {setImageUrl(scope.row.QuestionId, scope.row.xfIndex, scope.row.TableQuestionId, url)}" @setImageUrl="(url) => {setImageUrl(scope.row.QuestionId, scope.row.xfIndex, scope.row.TableQuestionId, url)}"
></CustomizeReportPageUpload> ></customize-report-page-upload>
</template> </template>
<template v-else-if="scope.row.Type === 'upload'"> <template v-else-if="scope.row.Type === 'upload'">
<CustomizeReportPageUpload <customize-report-page-upload
v-if="scope.row.Type==='upload' && (scope.row.xfIndex || scope.row.xfIndex === 0)" v-if="scope.row.Type==='upload' && (scope.row.xfIndex || scope.row.xfIndex === 0)"
:visitTaskId="visitTaskId" :visitTaskId="visitTaskId"
:question="scope.row" :question="scope.row"
:task="task" :task="task"
:readingTaskState="readingTaskState" :readingTaskState="readingTaskState"
:initUrl="scope.row.Answers[task.VisitTaskId]" :initUrl="scope.row.Answers[task.VisitTaskId]"
></CustomizeReportPageUpload> ></customize-report-page-upload>
<CustomizeReportPageUpload <customize-report-page-upload
v-else-if="scope.row.Type==='upload'" v-else-if="scope.row.Type==='upload'"
:visitTaskId="visitTaskId" :visitTaskId="visitTaskId"
:question="scope.row" :question="scope.row"
:task="task" :task="task"
:readingTaskState="readingTaskState" :readingTaskState="readingTaskState"
:initUrl="scope.row.Answers[task.VisitTaskId]" :initUrl="scope.row.Answers[task.VisitTaskId]"
></CustomizeReportPageUpload> ></customize-report-page-upload>
</template> </template>
<template v-else-if="scope.row.QuestionType=== 22"> <template v-else-if="scope.row.QuestionType=== 22">
{{ scope.row.Answers[task.VisitTaskId] === '-1' ? '未知' : scope.row.Answers[task.VisitTaskId] }} {{ scope.row.Answers[task.VisitTaskId] === '-1' ? '未知' : scope.row.Answers[task.VisitTaskId] }}
@ -276,6 +276,7 @@
<script> <script>
import { changeCalculationAnswer, getReadingReportEvaluation, changeDicomReadingQuestionAnswer, submitDicomVisitTask, verifyVisitTaskQuestions, getQuestionCalculateRelation } from '@/api/trials' import { changeCalculationAnswer, getReadingReportEvaluation, changeDicomReadingQuestionAnswer, submitDicomVisitTask, verifyVisitTaskQuestions, getQuestionCalculateRelation } from '@/api/trials'
import { setSkipReadingCache } from '@/api/reading' import { setSkipReadingCache } from '@/api/reading'
import { getAutoCutNextTask } from '@/api/user'
import DicomEvent from './../components/DicomEvent' import DicomEvent from './../components/DicomEvent'
import CustomizeReportPageUpload from './CustomizeReportPageUpload' import CustomizeReportPageUpload from './CustomizeReportPageUpload'
import const_ from '@/const/sign-code' import const_ from '@/const/sign-code'
@ -736,15 +737,16 @@ export default {
} }
}, },
// //
signConfirm(signInfo) { async signConfirm(signInfo) {
this.loading = true this.loading = true
var params = { try {
data: { var params = {
visitTaskId: this.visitTaskId data: {
}, visitTaskId: this.visitTaskId
signInfo: signInfo },
} signInfo: signInfo
submitDicomVisitTask(params).then(res => { }
let res = await submitDicomVisitTask(params)
if (res.IsSuccess) { if (res.IsSuccess) {
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$message.success(this.$t('common:message:savedSuccessfully'))
if (this.$refs['signForm']) { if (this.$refs['signForm']) {
@ -752,41 +754,36 @@ export default {
} }
this.signVisible = false this.signVisible = false
// window.location.reload()
// window.opener.postMessage('refreshTaskList', window.location)
// //
this.readingTaskState = 2 this.readingTaskState = 2
store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 }) store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 })
DicomEvent.$emit('setReadingState', 2) DicomEvent.$emit('setReadingState', 2)
window.opener.postMessage('refreshTaskList', window.location) window.opener.postMessage('refreshTaskList', window.location)
this.$confirm(this.$t('trials:oncologyReview:title:msg2'), { const res = await getAutoCutNextTask()
type: 'warning', let isAutoTask = res.Result.AutoCutNextTask
distinguishCancelAndClose: true if (isAutoTask) {
}) window.location.reload()
} else {
this.$confirm(this.$t('trials:oncologyReview:title:msg2'), {
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => { .then(() => {
// var token = getToken()
// var subjectCode = this.$router.currentRoute.query.subjectCode
// var subjectId = this.$router.currentRoute.query.subjectId
// var trialId = this.$router.currentRoute.query.trialId
// this.$router.push({
// path: `/readingPage?subjectCode=${subjectCode}&subjectId=${subjectId}&trialId=${trialId}&TokenKey=${token}`
// })
// DicomEvent.$emit('getNextTask')
window.location.reload() window.location.reload()
}) })
.catch(action => { .catch(action => {
}) })
}
} }
this.loading = false this.loading = false
}).catch(() => { } catch(e) {
this.loading = false this.loading = false
if (this.$refs['signForm'] && this.$refs['signForm'].btnLoading) { if (this.$refs['signForm'] && this.$refs['signForm'].btnLoading) {
this.$refs['signForm'].btnLoading = false this.$refs['signForm'].btnLoading = false
} }
}) }
}, },
previewDicoms(task) { previewDicoms(task) {
var token = getToken() var token = getToken()

View File

@ -5,28 +5,28 @@
<!-- 全局阅片 --> <!-- 全局阅片 -->
<global-review <global-review
v-else-if="taskInfo && taskInfo.ReadingCategory=== 2" v-else-if="taskInfo && taskInfo.ReadingCategory=== 2"
:trialId="trialId" :trial-id="trialId"
:subjectId="taskInfo.SubjectId" :subject-id="taskInfo.SubjectId"
:visitTaskId="taskInfo.VisitTaskId" :visit-task-id="taskInfo.VisitTaskId"
:readingCategory="taskInfo.ReadingCategory" :reading-category="taskInfo.ReadingCategory"
:subjectCode="taskInfo.SubjectCode" :subject-code="taskInfo.SubjectCode"
:taskBlindName="taskInfo.TaskBlindName" :task-blind-name="taskInfo.TaskBlindName"
:isReadingShowSubjectInfo="taskInfo.IsReadingShowSubjectInfo" :is-reading-show-subject-info="taskInfo.IsReadingShowSubjectInfo"
:isReadingShowPreviousResults="taskInfo.IsReadingShowPreviousResults" :is-reading-show-previous-results="taskInfo.IsReadingShowPreviousResults"
:isExistsClinicalData="taskInfo.IsExistsClinicalData" :is-exists-clinical-data="taskInfo.IsExistsClinicalData"
/> />
<!-- 裁判阅片 --> <!-- 裁判阅片 -->
<ad-review <ad-review
v-else-if="taskInfo && taskInfo.ReadingCategory=== 4" v-else-if="taskInfo && taskInfo.ReadingCategory=== 4"
:trialId="trialId" :trial-id="trialId"
:subjectId="taskInfo.SubjectId" :subject-id="taskInfo.SubjectId"
:visitTaskId="taskInfo.VisitTaskId" :visit-task-id="taskInfo.VisitTaskId"
:readingCategory="taskInfo.ReadingCategory" :reading-category="taskInfo.ReadingCategory"
:subjectCode="taskInfo.SubjectCode" :subject-code="taskInfo.SubjectCode"
:taskBlindName="taskInfo.TaskBlindName" :task-blind-name="taskInfo.TaskBlindName"
:isReadingShowSubjectInfo="taskInfo.IsReadingShowSubjectInfo" :is-reading-show-subject-info="taskInfo.IsReadingShowSubjectInfo"
:isReadingShowPreviousResults="taskInfo.IsReadingShowPreviousResults" :is-reading-show-previous-results="taskInfo.IsReadingShowPreviousResults"
:isExistsClinicalData="taskInfo.IsExistsClinicalData" :is-exists-clinical-data="taskInfo.IsExistsClinicalData"
/> />
<!-- 肿瘤学阅片 --> <!-- 肿瘤学阅片 -->
<!-- <oncology-review v-else-if="taskInfo && taskInfo.ReadingCategory=== 5" /> --> <!-- <oncology-review v-else-if="taskInfo && taskInfo.ReadingCategory=== 5" /> -->
@ -134,7 +134,7 @@ export default {
} catch (e) { } catch (e) {
this.loading = false this.loading = false
} }
}, }
} }
} }
</script> </script>
@ -148,7 +148,7 @@ export default {
height:80%; height:80%;
} }
::v-deep .el-dialog__body{ ::v-deep .el-dialog__body{
padding: 20px 20px 0 20px; padding: 10px;
height: calc(100% - 70px); height: calc(100% - 70px);
} }
.el-dialog__header{ .el-dialog__header{

View File

@ -1,11 +1,11 @@
<template> <template>
<div v-loading="loading" class="ecrf-list-container"> <div v-loading="loading" class="ecrf-list-container">
<el-form <el-form
v-if="taskInfo"
ref="questions" ref="questions"
size="small" size="small"
:model="questionForm" :model="questionForm"
class="ecrf-form" class="ecrf-form"
v-if="taskInfo"
> >
<!-- <FormItem <!-- <FormItem
v-for="question of questions" v-for="question of questions"
@ -19,18 +19,18 @@
@resetFormItemData="resetFormItemData" @resetFormItemData="resetFormItemData"
/> --> /> -->
<QuestionFormItem <QuestionFormItem
v-for="question of questions" v-for="question of questions"
:key="question.Id" :key="question.Id"
:visitTaskId="visitTaskId" :visit-task-id="visitTaskId"
:question="question" :question="question"
:question-form="questionForm" :question-form="questionForm"
:reading-task-state="readingTaskState" :reading-task-state="readingTaskState"
:criterion-id="criterionId" :criterion-id="criterionId"
:CalculationList="calculationList" :calculation-list="calculationList"
:IsBaseline="isBaseline" :is-baseline="isBaseline"
@resetFormItemData="resetFormItemData" @resetFormItemData="resetFormItemData"
@setFormItemData="setFormItemData" @setFormItemData="setFormItemData"
/> />
<el-form-item v-if="readingTaskState < 2"> <el-form-item v-if="readingTaskState < 2">
<div style="text-align:center;"> <div style="text-align:center;">
@ -67,7 +67,7 @@
<script> <script>
import { getCustomTableQuestionAnswer, changeDicomReadingQuestionAnswer, getTrialReadingQuestion, saveVisitTaskQuestions, submitVisitTaskQuestionsInDto, getQuestionCalculateRelation } from '@/api/trials' import { getCustomTableQuestionAnswer, changeDicomReadingQuestionAnswer, submitVisitTaskQuestionsInDto, getQuestionCalculateRelation } from '@/api/trials'
import { setSkipReadingCache } from '@/api/reading' import { setSkipReadingCache } from '@/api/reading'
import const_ from '@/const/sign-code' import const_ from '@/const/sign-code'
import store from '@/store' import store from '@/store'
@ -125,6 +125,7 @@ export default {
currentTaskState: { currentTaskState: {
immediate: true, immediate: true,
handler(state) { handler(state) {
console.log(state)
if (state === 2) { if (state === 2) {
this.readingTaskState = 2 this.readingTaskState = 2
} }
@ -154,7 +155,7 @@ export default {
this.$set(this.questionForm, v.Id, v.TableQuestions.Answers) this.$set(this.questionForm, v.Id, v.TableQuestions.Answers)
} }
if (v.Type === 'class') { if (v.Type === 'class') {
this.classArr.push({triggerId: v.ClassifyQuestionId, classId: v.Id, classifyAlgorithms: v.ClassifyAlgorithms, classifyType: v.ClassifyType}) this.classArr.push({ triggerId: v.ClassifyQuestionId, classId: v.Id, classifyAlgorithms: v.ClassifyAlgorithms, classifyType: v.ClassifyType })
} }
if (v.Type === 'number') { if (v.Type === 'number') {
this.$set(this.questionForm, v.Id, v.Answer === '' ? '' : parseFloat(v.Answer).toFixed(this.digitPlaces)) this.$set(this.questionForm, v.Id, v.Answer === '' ? '' : parseFloat(v.Answer).toFixed(this.digitPlaces))
@ -166,17 +167,14 @@ export default {
this.questions = res.Result.SinglePage this.questions = res.Result.SinglePage
this.loading = false this.loading = false
} }
} catch (e) {
} catch(e) {
console.log(e) console.log(e)
this.loading = false this.loading = false
} }
}, },
setChild(obj) { setChild(obj) {
obj.forEach(i => { obj.forEach(i => {
if (i.Type !== 'group' && i.Type !== 'summary' && i.Id && i.Type !== 'table' && i.Type !== 'basicTable') { if (i.Type !== 'group' && i.Type !== 'summary' && i.Id && i.Type !== 'table' && i.Type !== 'basicTable') {
this.$set(this.questionForm, i.Id, i.Answer) this.$set(this.questionForm, i.Id, i.Answer)
} }
if (i.Type === 'table' || i.Type === 'basicTable') { if (i.Type === 'table' || i.Type === 'basicTable') {
@ -190,7 +188,7 @@ export default {
this.$set(this.questionForm, i.Id, i.TableQuestions.Answers) this.$set(this.questionForm, i.Id, i.TableQuestions.Answers)
} }
if (i.Type === 'class') { if (i.Type === 'class') {
this.classArr.push({triggerId: i.ClassifyQuestionId, classId: i.Id, classifyAlgorithms: i.ClassifyAlgorithms, classifyType: i.ClassifyType}) this.classArr.push({ triggerId: i.ClassifyQuestionId, classId: i.Id, classifyAlgorithms: i.ClassifyAlgorithms, classifyType: i.ClassifyType })
} }
if (i.Type === 'number') { if (i.Type === 'number') {
this.$set(this.questionForm, i.Id, i.Answer === '' ? '' : parseFloat(i.Answer).toFixed(this.digitPlaces)) this.$set(this.questionForm, i.Id, i.Answer === '' ? '' : parseFloat(i.Answer).toFixed(this.digitPlaces))
@ -223,14 +221,14 @@ export default {
visitTaskId: this.visitTaskId, visitTaskId: this.visitTaskId,
answers: answers answers: answers
} }
let res = await changeDicomReadingQuestionAnswer(params) const res = await changeDicomReadingQuestionAnswer(params)
if (res.IsSuccess) { if (res.IsSuccess) {
if (isMsg) { if (isMsg) {
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$message.success(this.$t('common:message:savedSuccessfully'))
} }
this.loading = false this.loading = false
} }
} catch(e) { } catch (e) {
this.loading = false this.loading = false
} }
}, },
@ -381,20 +379,24 @@ export default {
::v-deep .el-table--border th.gutter:last-of-type { ::v-deep .el-table--border th.gutter:last-of-type {
border: none; border: none;
} }
::v-deep .el-dialog__header { ::v-deep .el-dialog{
background-color: #000; background: #1e1e1e;
color: #fff; border: 1px solid #ddd;
.el-dialog__title { color: #ddd;
color: #fff; .el-dialog__title{
color:#fff;
}
.el-input .el-input__inner{
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
.el-input.is-disabled .el-input__inner{
background-color: #646464a1;
}
.el-form-item__label{
color: #dfdfdf
} }
}
::v-deep .el-dialog__body {
background-color: #000;
color: #fff;
}
::v-deep .el-dialog__footer {
background-color: #000;
color: #fff;
} }
} }
</style> </style>

View File

@ -2,104 +2,110 @@
<div class="none-dicom-viewer"> <div class="none-dicom-viewer">
<!-- tools --> <!-- tools -->
<div class="tools-wrapper"> <div class="tools-wrapper">
<!-- 布局 --> <div class="tools-left">
<div class="tool-item" :title="$t('trials:reading:button:layout')"> <!-- 布局 -->
<el-dropdown @command="handleCommand"> <div class="tool-item" :title="$t('trials:reading:button:layout')">
<span class="el-dropdown-link"> <el-dropdown @command="handleCommand">
<svg-icon icon-class="layout" class="svg-icon" /><i class="el-icon-arrow-down el-icon--right" /> <span class="el-dropdown-link">
</span> <svg-icon icon-class="layout" class="svg-icon" /><i class="el-icon-arrow-down el-icon--right" />
<el-dropdown-menu slot="dropdown"> </span>
<el-dropdown-item command="1*1">1*1</el-dropdown-item> <el-dropdown-menu slot="dropdown">
<el-dropdown-item command="1*2">1*2</el-dropdown-item> <el-dropdown-item command="1*1">1*1</el-dropdown-item>
<el-dropdown-item command="2*2">2*2</el-dropdown-item> <el-dropdown-item command="1*2">1*2</el-dropdown-item>
</el-dropdown-menu> <el-dropdown-item command="2*2">2*2</el-dropdown-item>
</el-dropdown> </el-dropdown-menu>
</div> </el-dropdown>
<!-- 缩放 --> </div>
<div <!-- 缩放 -->
:class="['tool-item', activeTool === 'Zoom' ? 'tool-item-active' : '']" <div
:title="$t('trials:reading:button:zoom')" :class="['tool-item', activeTool === 'Zoom' ? 'tool-item-active' : '']"
@click.prevent="setToolActive('Zoom')" :title="$t('trials:reading:button:zoom')"
> @click.prevent="setToolActive('Zoom')"
<svg-icon icon-class="magnifier" class="svg-icon" /> >
</div> <svg-icon icon-class="magnifier" class="svg-icon" />
<!-- 移动 --> </div>
<div <!-- 移动 -->
:class="['tool-item', activeTool === 'Pan' ? 'tool-item-active' : '']" <div
:title="$t('trials:reading:button:move')" :class="['tool-item', activeTool === 'Pan' ? 'tool-item-active' : '']"
@click.prevent="setToolActive('Pan')" :title="$t('trials:reading:button:move')"
> @click.prevent="setToolActive('Pan')"
<svg-icon icon-class="move" class="svg-icon" /> >
</div> <svg-icon icon-class="move" class="svg-icon" />
<!-- 旋转 --> </div>
<div <!-- 旋转 -->
:class="['tool-item', activeTool === 'PlanarRotate' ? 'tool-item-active' : '']" <div
:title="$t('trials:reading:button:rotate')" :class="['tool-item', activeTool === 'PlanarRotate' ? 'tool-item-active' : '']"
@click.prevent="setToolActive('PlanarRotate')" :title="$t('trials:reading:button:rotate')"
> @click.prevent="setToolActive('PlanarRotate')"
<svg-icon icon-class="rotate" class="svg-icon" /> >
</div> <svg-icon icon-class="rotate" class="svg-icon" />
<!-- 箭头工具 --> </div>
<div <!-- 箭头工具 -->
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'ArrowAnnotate' ? 'tool-item-active' : '']" <div
:title="$t('trials:reading:button:arrowAnnotate')" :class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'ArrowAnnotate' ? 'tool-item-active' : '']"
@click.prevent="setAnnotateToolActive('ArrowAnnotate')" :title="$t('trials:reading:button:arrowAnnotate')"
> @click.prevent="setAnnotateToolActive('ArrowAnnotate')"
<svg-icon icon-class="arrow" class="svg-icon" /> >
</div> <svg-icon icon-class="arrow" class="svg-icon" />
<!-- 矩形工具 --> </div>
<div <!-- 矩形工具 -->
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'RectangleROI' ? 'tool-item-active' : '']" <div
:title="$t('trials:dicom-show:RectangleRoi')" :class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'RectangleROI' ? 'tool-item-active' : '']"
@click.prevent="setAnnotateToolActive('RectangleROI')" :title="$t('trials:dicom-show:RectangleRoi')"
> @click.prevent="setAnnotateToolActive('RectangleROI')"
<svg-icon icon-class="rectangle" class="svg-icon" /> >
</div> <svg-icon icon-class="rectangle" class="svg-icon" />
<!-- 自由曲线 --> </div>
<div <!-- 自由曲线 -->
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'PlanarFreehandROI' ? 'tool-item-active' : '']" <div
:title="$t('trials:reading:button:planarFreehandROI')" :class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'PlanarFreehandROI' ? 'tool-item-active' : '']"
@click.prevent="setAnnotateToolActive('PlanarFreehandROI')" :title="$t('trials:reading:button:planarFreehandROI')"
> @click.prevent="setAnnotateToolActive('PlanarFreehandROI')"
<svg-icon icon-class="polygon" class="svg-icon" /> >
</div> <svg-icon icon-class="polygon" class="svg-icon" />
<!-- <div </div>
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'SplineROITool' ? 'tool-item-active' : '']" <!-- <div
:title="$t('trials:reading:button:SplineROITool')" :class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'SplineROITool' ? 'tool-item-active' : '']"
@click.prevent="setAnnotateToolActive('SplineROITool')" :title="$t('trials:reading:button:SplineROITool')"
> @click.prevent="setAnnotateToolActive('SplineROITool')"
<svg-icon icon-class="polygon" class="svg-icon" /> >
</div> --> <svg-icon icon-class="polygon" class="svg-icon" />
</div> -->
<div <div
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'Eraser' ? 'tool-item-active' : '']" :class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'Eraser' ? 'tool-item-active' : '']"
:title="$t('trials:dicom-show:Eraser')" :title="$t('trials:dicom-show:Eraser')"
@click.prevent="setAnnotateToolActive('Eraser')" @click.prevent="setAnnotateToolActive('Eraser')"
> >
<svg-icon icon-class="clear" class="svg-icon" /> <svg-icon icon-class="clear" class="svg-icon" />
</div>
<div
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'Length' ? 'tool-item-active' : '']"
:title="$t('trials:nondicom-show:scale')"
@click.prevent="setAnnotateToolActive('Length')"
>
<svg-icon icon-class="length" class="svg-icon" />
</div>
<!-- 截图 -->
<!-- <div
class="tool-item"
:title="$t('trials:reading:button:screenShot')"
@click.prevent="saveImage"
>
<svg-icon icon-class="image" class="svg-icon" />
</div> -->
<!-- 重置 -->
<div
class="tool-item"
:title="$t('trials:reading:button:reset')"
@click.prevent="resetViewport"
>
<svg-icon icon-class="refresh" class="svg-icon" />
</div>
</div> </div>
<div
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'Length' ? 'tool-item-active' : '']" <div>
:title="$t('trials:nondicom-show:scale')" <el-button type="text" @click="previewConfig">{{ $t('trials:reading:button:customCfg') }}</el-button>
@click.prevent="setAnnotateToolActive('Length')"
>
<svg-icon icon-class="length" class="svg-icon" />
</div>
<!-- 截图 -->
<!-- <div
class="tool-item"
:title="$t('trials:reading:button:screenShot')"
@click.prevent="saveImage"
>
<svg-icon icon-class="image" class="svg-icon" />
</div> -->
<!-- 重置 -->
<div
class="tool-item"
:title="$t('trials:reading:button:reset')"
@click.prevent="resetViewport"
>
<svg-icon icon-class="refresh" class="svg-icon" />
</div> </div>
</div> </div>
<!-- viewports --> <!-- viewports -->
@ -237,6 +243,16 @@
<el-button type="primary" @click="saveForm">{{ $t('common:button:save') }}</el-button> <el-button type="primary" @click="saveForm">{{ $t('common:button:save') }}</el-button>
</span> </span>
</el-dialog> </el-dialog>
<el-dialog
v-if="personalConfigDialog.visible"
:visible.sync="personalConfigDialog.visible"
:close-on-click-modal="false"
:title="personalConfigDialog.title"
width="600px"
>
<Others />
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
@ -258,6 +274,7 @@ import hardcodedMetaDataProvider from './../js/hardcodedMetaDataProvider'
import registerWebImageLoader from './../js/registerWebImageLoader' import registerWebImageLoader from './../js/registerWebImageLoader'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import store from '@/store' import store from '@/store'
import Others from '@/views/trials/trials-panel/reading/dicoms/components/Others'
const { ViewportType } = Enums const { ViewportType } = Enums
const renderingEngineId = 'myRenderingEngine' const renderingEngineId = 'myRenderingEngine'
const { const {
@ -278,6 +295,7 @@ const {
const { MouseBindings, Events: toolsEvents } = csToolsEnums const { MouseBindings, Events: toolsEvents } = csToolsEnums
export default { export default {
name: 'ImageViewer', name: 'ImageViewer',
components: { Others },
props: { props: {
relatedStudyInfo: { relatedStudyInfo: {
type: Object, type: Object,
@ -310,6 +328,7 @@ export default {
imageType: ['image/jpeg', 'image/jpg', 'image/bmp', 'image/png'], imageType: ['image/jpeg', 'image/jpg', 'image/bmp', 'image/png'],
digitPlaces: 2, digitPlaces: 2,
dialogVisible: false, dialogVisible: false,
personalConfigDialog: { visible: false, title: this.$t('trials:reading:button:customCfg') }, //
form: { form: {
length: null, length: null,
annotationObj: {} annotationObj: {}
@ -1180,6 +1199,9 @@ export default {
// //
viewCD(id) { viewCD(id) {
this.$emit('previewCD', id) this.$emit('previewCD', id)
},
previewConfig() {
this.personalConfigDialog.visible = true
} }
} }
} }
@ -1194,11 +1216,17 @@ export default {
.tools-wrapper { .tools-wrapper {
height: 50px; height: 50px;
display: flex; display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center; align-items: center;
border-bottom: 1px solid #727272; border-bottom: 1px solid #727272;
color: #ddd; color: #ddd;
padding: 0 5px;
.tools-left {
flex: 1;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
.tool-item { .tool-item {
padding: 5px; padding: 5px;
margin: 0 5px; margin: 0 5px;
@ -1317,5 +1345,24 @@ export default {
} }
} }
} }
::v-deep .el-dialog{
background: #1e1e1e;
border: 1px solid #ddd;
color: #ddd;
.el-dialog__title{
color:#fff;
}
.el-input .el-input__inner{
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
.el-input.is-disabled .el-input__inner{
background-color: #646464a1;
}
.el-form-item__label{
color: #dfdfdf
}
}
} }
</style> </style>

View File

@ -172,7 +172,7 @@
</template> </template>
<template v-else-if="scope.row.Type==='upload' && scope.row.Answers[task.VisitTaskId]"> <template v-else-if="scope.row.Type==='upload' && scope.row.Answers[task.VisitTaskId]">
<span v-for="(url,index) in scope.row.Answers[task.VisitTaskId].split('|')" :key="url" style="margin-left: 5px;"> <span v-for="(url,index) in scope.row.Answers[task.VisitTaskId].split('|')" :key="url" style="margin-left: 5px;">
<el-button v-if="scope.row.Answers[task.VisitTaskId]" type="text" @click="preview(url)"> <el-button v-if="scope.row.Answers[task.VisitTaskId]" type="text" @click="preview(url)">
{{ `${$t('trials:noneDicom:title:attachment')}${index + 1}` }} {{ `${$t('trials:noneDicom:title:attachment')}${index + 1}` }}
</el-button> </el-button>
</span> </span>
@ -239,6 +239,7 @@
<script> <script>
import { changeCalculationAnswer, getReadingReportEvaluation, submitDicomVisitTask, verifyVisitTaskQuestions, getQuestionCalculateRelation } from '@/api/trials' import { changeCalculationAnswer, getReadingReportEvaluation, submitDicomVisitTask, verifyVisitTaskQuestions, getQuestionCalculateRelation } from '@/api/trials'
import { setSkipReadingCache } from '@/api/reading' import { setSkipReadingCache } from '@/api/reading'
import { getAutoCutNextTask } from '@/api/user'
import const_ from '@/const/sign-code' import const_ from '@/const/sign-code'
import SignForm from '@/views/trials/components/newSignForm' import SignForm from '@/views/trials/components/newSignForm'
import PreviewFile from '@/components/PreviewFile/index' import PreviewFile from '@/components/PreviewFile/index'
@ -618,15 +619,16 @@ export default {
} }
}, },
// //
signConfirm(signInfo) { async signConfirm(signInfo) {
this.loading = true this.loading = true
var params = { try {
data: { var params = {
visitTaskId: this.visitTaskId data: {
}, visitTaskId: this.visitTaskId
signInfo: signInfo },
} signInfo: signInfo
submitDicomVisitTask(params).then(res => { }
const res = await submitDicomVisitTask(params)
if (res.IsSuccess) { if (res.IsSuccess) {
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$message.success(this.$t('common:message:savedSuccessfully'))
if (this.$refs['signForm']) { if (this.$refs['signForm']) {
@ -634,43 +636,39 @@ export default {
} }
this.signVisible = false this.signVisible = false
// window.location.reload()
// window.opener.postMessage('refreshTaskList', window.location)
// //
this.readingTaskState = 2 this.readingTaskState = 2
this.taskInfo.ReadingTaskState = 2 this.taskInfo.ReadingTaskState = 2
localStorage.setItem('taskInfo', JSON.stringify(this.taskInfo)) localStorage.setItem('taskInfo', JSON.stringify(this.taskInfo))
store.dispatch('noneDicomReview/setCurrentTaskState', 2) store.dispatch('noneDicomReview/setCurrentTaskState', 2)
// DicomEvent.$emit('setReadingState', 2)
window.opener.postMessage('refreshTaskList', window.location) window.opener.postMessage('refreshTaskList', window.location)
this.$confirm(this.$t('trials:oncologyReview:title:msg2'), { const res = await getAutoCutNextTask()
type: 'warning', const isAutoTask = res.Result.AutoCutNextTask
distinguishCancelAndClose: true if (isAutoTask) {
}) window.location.reload()
.then(() => { } else {
// var token = getToken() // ''
// var subjectCode = this.$router.currentRoute.query.subjectCode this.$confirm(this.$t('trials:readingReport:message:msg4'), {
// var subjectId = this.$router.currentRoute.query.subjectId type: 'warning',
// var trialId = this.$router.currentRoute.query.trialId distinguishCancelAndClose: true
// this.$router.push({
// path: `/readingPage?subjectCode=${subjectCode}&subjectId=${subjectId}&trialId=${trialId}&TokenKey=${token}`
// })
// DicomEvent.$emit('getNextTask')
window.location.reload()
})
.catch(action => {
}) })
.then(() => {
window.location.reload()
})
.catch(action => {
// changeURLStatic('visitTaskId', this.visitTaskId)
})
}
} }
this.loading = false this.loading = false
}).catch(() => { } catch (e) {
console.log(e)
this.loading = false this.loading = false
if (this.$refs['signForm'] && this.$refs['signForm'].btnLoading) { if (this.$refs['signForm'] && this.$refs['signForm'].btnLoading) {
this.$refs['signForm'].btnLoading = false this.$refs['signForm'].btnLoading = false
} }
}) }
}, },
previewDicoms(task) { previewDicoms(task) {
var token = getToken() var token = getToken()
@ -822,6 +820,25 @@ export default {
height: 30px; height: 30px;
line-height: 40px; line-height: 40px;
} }
::v-deep .el-dialog{
background: #1e1e1e;
border: 1px solid #ddd;
color: #ddd;
.el-dialog__title{
color:#fff;
}
.el-input .el-input__inner{
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
.el-input.is-disabled .el-input__inner{
background-color: #646464a1;
}
.el-form-item__label{
color: #dfdfdf
}
}
} }
::v-deep .el-switch__label{ ::v-deep .el-switch__label{
color:#fff; color:#fff;