非dicom阅片添加报告页面
parent
bfe86e6868
commit
beeadfbdeb
|
@ -1,17 +1,15 @@
|
||||||
<template>
|
<template>
|
||||||
<!-- <el-tabs v-model="activeName" v-loading="loading" style="min-height:500px">-->
|
|
||||||
<!-- <el-tab-pane-->
|
|
||||||
<!-- v-for="criterion in criterions"-->
|
|
||||||
<!-- :key="criterion.ReadingQuestionCriterionTrialId"-->
|
|
||||||
<!-- :label="criterion.ReadingQuestionCriterionTrialName"-->
|
|
||||||
<!-- :name="criterion.ReadingQuestionCriterionTrialId"-->
|
|
||||||
<!-- >-->
|
|
||||||
<div v-loading="loading" style="min-height:500px">
|
<div v-loading="loading" style="min-height:500px">
|
||||||
|
<h3 v-if="isReadingShowSubjectInfo" style="padding: 5px 0px;margin: 0;">
|
||||||
|
<span v-if="subjectCode">{{ subjectCode }} </span>
|
||||||
|
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
||||||
|
</h3>
|
||||||
<ECRF
|
<ECRF
|
||||||
:trial-id="trialId"
|
:trial-id="trialId"
|
||||||
:subject-id="subjectId"
|
:subject-id="subjectId"
|
||||||
:criterion-id="criterionId"
|
:criterion-id="criterionId"
|
||||||
:visit-task-id="visitTaskId"
|
:visit-task-id="visitTaskId"
|
||||||
|
:iseCRFShowInDicomReading="iseCRFShowInDicomReading"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -43,6 +41,22 @@ export default {
|
||||||
criterionId: {
|
criterionId: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
subjectCode: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
taskBlindName: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
isReadingShowSubjectInfo: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
iseCRFShowInDicomReading: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|
|
@ -77,13 +77,13 @@
|
||||||
|
|
||||||
<el-form-item v-if="readingTaskState < 2">
|
<el-form-item v-if="readingTaskState < 2">
|
||||||
<div style="text-align:center;">
|
<div style="text-align:center;">
|
||||||
<el-button type="primary" @click="skipTask">
|
<el-button type="primary" @click="skipTask" v-if="iseCRFShowInDicomReading">
|
||||||
{{ $t('trials:readingReport:button:skip') }}
|
{{ $t('trials:readingReport:button:skip') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="primary" @click="handleSave">
|
<el-button type="primary" @click="handleSave">
|
||||||
{{ $t('common:button:save') }}
|
{{ $t('common:button:save') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="primary" @click="handleSubmit">
|
<el-button type="primary" @click="handleSubmit" v-if="iseCRFShowInDicomReading">
|
||||||
{{ $t('common:button:submit') }}
|
{{ $t('common:button:submit') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -116,7 +116,7 @@ import const_ from '@/const/sign-code'
|
||||||
import FormItem from './FormItem'
|
import FormItem from './FormItem'
|
||||||
import SignForm from '@/views/trials/components/newSignForm'
|
import SignForm from '@/views/trials/components/newSignForm'
|
||||||
// import { getToken } from '@/utils/auth'
|
// import { getToken } from '@/utils/auth'
|
||||||
// import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
||||||
export default {
|
export default {
|
||||||
name: 'ECRF',
|
name: 'ECRF',
|
||||||
components: {
|
components: {
|
||||||
|
@ -139,6 +139,10 @@ export default {
|
||||||
visitTaskId: {
|
visitTaskId: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
iseCRFShowInDicomReading: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
@ -158,6 +162,9 @@ export default {
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.getQuestions()
|
this.getQuestions()
|
||||||
|
DicomEvent.$on('refreshQuestionAnswer', _ => {
|
||||||
|
this.getQuestions()
|
||||||
|
})
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async getQuestions() {
|
async getQuestions() {
|
||||||
|
@ -243,6 +250,7 @@ export default {
|
||||||
try {
|
try {
|
||||||
const res = await saveVisitTaskQuestions(params)
|
const res = await saveVisitTaskQuestions(params)
|
||||||
if (res.IsSuccess) {
|
if (res.IsSuccess) {
|
||||||
|
DicomEvent.$emit('getReportInfo', true)
|
||||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
}
|
}
|
||||||
this.loading = false
|
this.loading = false
|
||||||
|
@ -285,6 +293,7 @@ export default {
|
||||||
const res = await submitVisitTaskQuestionsInDto(params)
|
const res = await submitVisitTaskQuestionsInDto(params)
|
||||||
this.loading = false
|
this.loading = false
|
||||||
if (res.IsSuccess) {
|
if (res.IsSuccess) {
|
||||||
|
DicomEvent.$emit('getReportInfo', true)
|
||||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
this.isEdit = false
|
this.isEdit = false
|
||||||
this.$refs['signForm'].btnLoading = false
|
this.$refs['signForm'].btnLoading = false
|
||||||
|
|
|
@ -0,0 +1,934 @@
|
||||||
|
<template>
|
||||||
|
<div class="report-wrapper">
|
||||||
|
<el-card v-loading="loading" shadow="never" style="display:flex;flex-direction: column;">
|
||||||
|
<div slot="header" class="clearfix report-header">
|
||||||
|
<h3 style="margin:0;padding:0;">{{ $t('trials:readingReport:title:eicrf') }}</h3>
|
||||||
|
<div style="margin-left:auto">
|
||||||
|
<!-- <el-switch
|
||||||
|
v-model="isShowDetail"
|
||||||
|
:active-text="$t('trials:readingReport:title:expandDetails')"
|
||||||
|
:inactive-text="$t('trials:readingReport:title:collapseDetails')"
|
||||||
|
style="margin-right:5px"
|
||||||
|
@change="handleShowDetail"
|
||||||
|
/> -->
|
||||||
|
<el-button
|
||||||
|
v-if="readingTaskState<2"
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
@click="skipTask"
|
||||||
|
>
|
||||||
|
<!-- 跳过 -->
|
||||||
|
{{ $t('trials:readingReport:button:skip') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button v-if="readingTaskState<2" type="primary" size="small" @click="getReportInfo">{{$t('trials:readingReport:button:refresh')}}</el-button>
|
||||||
|
<el-button v-if="readingTaskState<2" type="primary" size="small" @click="handleSave(true)">{{$t('common:button:save')}}</el-button>
|
||||||
|
<el-button v-if="readingTaskState<2" type="primary" size="small" @click="handleConfirm">{{$t('common:button:submit')}}</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="flex: 1">
|
||||||
|
<el-table
|
||||||
|
ref="reportList"
|
||||||
|
v-adaptive="{bottomOffset:0}"
|
||||||
|
:data="taskQuestions"
|
||||||
|
v-if="taskQuestions.length > 0"
|
||||||
|
row-key="Id"
|
||||||
|
border
|
||||||
|
default-expand-all
|
||||||
|
height="100"
|
||||||
|
:tree-props="{children: 'Childrens', hasChildren: 'hasChildren'}"
|
||||||
|
size="mini"
|
||||||
|
>
|
||||||
|
<el-table-column
|
||||||
|
prop=""
|
||||||
|
label=""
|
||||||
|
show-overflow-tooltip
|
||||||
|
width="350px"
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span v-if="scope.row.QuestionName">{{ scope.row.BlindName ? scope.row.QuestionName : scope.row.QuestionName }}</span>
|
||||||
|
<span
|
||||||
|
v-else
|
||||||
|
style="font-weight: bold;font-size: 16px;color: #f44336;"
|
||||||
|
>
|
||||||
|
{{ scope.row.GroupName }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
v-for="task in visitTaskList"
|
||||||
|
:key="task.VisitTaskId"
|
||||||
|
prop="date"
|
||||||
|
show-overflow-tooltip
|
||||||
|
width="200px"
|
||||||
|
>
|
||||||
|
<template slot="header">
|
||||||
|
<div v-if="task.IsCurrentTask">
|
||||||
|
{{ task.BlindName }}
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<div>
|
||||||
|
{{ task.BlindName }}
|
||||||
|
<el-button type="text" size="small" @click="previewDicoms(task)">
|
||||||
|
<span class="el-icon-view"></span>
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
<!-- <div v-if="task.LatestScanDate">-->
|
||||||
|
<!-- {{ task.LatestScanDate.split(' ')[0] }}-->
|
||||||
|
<!-- </div>-->
|
||||||
|
<!-- {{ `(影像点击跳转)` }} -->
|
||||||
|
<!-- {{ $t('trials:readingReport:button:jump') }}-->
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<template v-if="readingTaskState<2 && task.VisitTaskId === visitTaskId && (scope.row.Type==='input' || scope.row.Type==='number' || scope.row.Type==='select' || scope.row.Type==='textarea' || scope.row.Type==='radio')">
|
||||||
|
<template>
|
||||||
|
<!-- 输入框 -->
|
||||||
|
<div>
|
||||||
|
<template v-if="!((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)">
|
||||||
|
</template>
|
||||||
|
<el-input
|
||||||
|
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && (scope.row.Type==='input' || scope.row.Type==='textarea') && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||||
|
v-model="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]"
|
||||||
|
size="mini"
|
||||||
|
/>
|
||||||
|
<span v-else-if="questionForm[scope.row.QuestionId] instanceof Array && (scope.row.Type==='input' || scope.row.Type==='textarea')">
|
||||||
|
{{questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]}}
|
||||||
|
</span>
|
||||||
|
<el-input
|
||||||
|
v-else-if="(scope.row.Type==='input' || scope.row.Type==='textarea') && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||||
|
v-model="questionForm[scope.row.QuestionId]"
|
||||||
|
size="mini"
|
||||||
|
/>
|
||||||
|
<span v-else-if="scope.row.Type==='input' || scope.row.Type==='textarea'">
|
||||||
|
{{questionForm[scope.row.QuestionId]}}
|
||||||
|
</span>
|
||||||
|
<el-select
|
||||||
|
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && (scope.row.Type==='select' || scope.row.Type==='radio') && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||||
|
v-model="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]"
|
||||||
|
size="mini"
|
||||||
|
clearable
|
||||||
|
>
|
||||||
|
<template>
|
||||||
|
<el-option
|
||||||
|
v-for="val in scope.row.TypeValue.split('|')"
|
||||||
|
:key="val"
|
||||||
|
:label="val"
|
||||||
|
:value="val"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-select>
|
||||||
|
<span v-else-if="questionForm[scope.row.QuestionId] instanceof Array && scope.row.Type==='select'">
|
||||||
|
{{questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]}}
|
||||||
|
</span>
|
||||||
|
<el-select
|
||||||
|
v-else-if="(scope.row.Type==='select' || scope.row.Type==='radio') && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||||
|
v-model="questionForm[scope.row.QuestionId]"
|
||||||
|
size="mini"
|
||||||
|
clearable
|
||||||
|
>
|
||||||
|
<template>
|
||||||
|
<el-option
|
||||||
|
v-for="val in scope.row.TypeValue.split('|')"
|
||||||
|
:key="val"
|
||||||
|
:label="val"
|
||||||
|
:value="val"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-select>
|
||||||
|
<span v-else-if="scope.row.Type==='select' || scope.row.Type==='radio'">
|
||||||
|
{{questionForm[scope.row.QuestionId]}}
|
||||||
|
</span>
|
||||||
|
<el-input
|
||||||
|
v-else-if="scope.row.DataSource !== 1 && questionForm[scope.row.QuestionId] instanceof Array && scope.row.Type==='number' && (scope.row.xfIndex || scope.row.xfIndex === 0) && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||||
|
v-model="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]"
|
||||||
|
:disabled="scope.row.DataSource === 1"
|
||||||
|
onblur="value=parseFloat(value).toFixed(parseInt(localStorage.getItem('digitPlaces')))"
|
||||||
|
@input="limitInput($event, questionForm[scope.row.QuestionId][scope.row.xfIndex], scope.row.TableQuestionId)"
|
||||||
|
size="mini"
|
||||||
|
@focus="() => {questionId = scope.row.QuestionId}"
|
||||||
|
>
|
||||||
|
<template slot="append" v-if="scope.row.Unit !== 0">{{scope.row.Unit !== 4 ? $fd('ValueUnit', scope.row.Unit) : scope.row.CustomUnit}}</template>
|
||||||
|
<template slot="append" v-else-if="scope.row.ValueType === 2">%</template>
|
||||||
|
</el-input>
|
||||||
|
<span v-else-if="questionForm[scope.row.QuestionId] instanceof Array && scope.row.Type==='number' && (scope.row.xfIndex || scope.row.xfIndex === 0)">
|
||||||
|
<template v-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit">
|
||||||
|
{{ isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]))? questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]:`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]} ${scope.row.Unit !== 4 ? $fd('ValueUnit',scope.row.Unit) : scope.row.CustomUnit}` }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="scope.row.ValueType === 2">
|
||||||
|
{{ isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId])) ? questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]:`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]} %` }}
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
{{ isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId])) ? questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]:`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]}` }}
|
||||||
|
</template>
|
||||||
|
</span>
|
||||||
|
<el-input
|
||||||
|
v-else-if="scope.row.DataSource !== 1 && scope.row.Type==='number' && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||||
|
v-model="questionForm[scope.row.QuestionId]"
|
||||||
|
:disabled="scope.row.DataSource === 1"
|
||||||
|
onblur="value=parseFloat(value).toFixed(parseInt(localStorage.getItem('digitPlaces')))"
|
||||||
|
@input="limitInput($event, questionForm, scope.row.QuestionId)"
|
||||||
|
size="mini"
|
||||||
|
@focus="() => {questionId = scope.row.QuestionId}"
|
||||||
|
>
|
||||||
|
<template slot="append" v-if="scope.row.Unit !== 0">{{scope.row.Unit !== 4 ? $fd('ValueUnit', scope.row.Unit) : scope.row.CustomUnit}}</template>
|
||||||
|
<template slot="append" v-else-if="scope.row.ValueType === 2">%</template>
|
||||||
|
</el-input>
|
||||||
|
<span v-else-if="scope.row.Type==='number'">
|
||||||
|
<template v-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit">
|
||||||
|
{{ isNaN(parseInt(questionForm[scope.row.QuestionId]))? questionForm[scope.row.QuestionId]:`${questionForm[scope.row.QuestionId]} ${scope.row.Unit !== 4 ? $fd('ValueUnit',scope.row.Unit) : scope.row.CustomUnit}` }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="scope.row.ValueType === 2">
|
||||||
|
{{ isNaN(parseInt(questionForm[scope.row.QuestionId])) ? questionForm[scope.row.QuestionId]:`${questionForm[scope.row.QuestionId]} %` }}
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
{{ isNaN(parseInt(questionForm[scope.row.QuestionId])) ? questionForm[scope.row.QuestionId] : questionForm[scope.row.QuestionId]}}
|
||||||
|
</template>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="task.VisitTaskId === visitTaskId && scope.row.Type === 'upload'">
|
||||||
|
<UploadFile
|
||||||
|
v-if="scope.row.Type==='upload' && (scope.row.xfIndex || scope.row.xfIndex === 0)"
|
||||||
|
:visitTaskId="visitTaskId"
|
||||||
|
:question="scope.row"
|
||||||
|
:task="task"
|
||||||
|
:readingTaskState="readingTaskState"
|
||||||
|
: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)}"
|
||||||
|
></UploadFile>
|
||||||
|
<UploadFile
|
||||||
|
v-else-if="scope.row.Type==='upload'"
|
||||||
|
:visitTaskId="visitTaskId"
|
||||||
|
:question="scope.row"
|
||||||
|
:task="task"
|
||||||
|
:readingTaskState="readingTaskState"
|
||||||
|
:initUrl="questionForm[scope.row.QuestionId]"
|
||||||
|
@setImageUrl="(url) => {setImageUrl(scope.row.QuestionId, scope.row.xfIndex, scope.row.TableQuestionId, url)}"
|
||||||
|
></UploadFile>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="scope.row.Type === 'upload'">
|
||||||
|
<UploadFile
|
||||||
|
v-if="scope.row.Type==='upload' && (scope.row.xfIndex || scope.row.xfIndex === 0)"
|
||||||
|
:visitTaskId="visitTaskId"
|
||||||
|
:question="scope.row"
|
||||||
|
:task="task"
|
||||||
|
:readingTaskState="readingTaskState"
|
||||||
|
:initUrl="scope.row.Answers[task.VisitTaskId]"
|
||||||
|
></UploadFile>
|
||||||
|
<UploadFile
|
||||||
|
v-else-if="scope.row.Type==='upload'"
|
||||||
|
:visitTaskId="visitTaskId"
|
||||||
|
:question="scope.row"
|
||||||
|
:task="task"
|
||||||
|
:readingTaskState="readingTaskState"
|
||||||
|
:initUrl="scope.row.Answers[task.VisitTaskId]"
|
||||||
|
></UploadFile>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="scope.row.QuestionType=== 22">
|
||||||
|
{{ scope.row.Answers[task.VisitTaskId] === '-1' ? '未知' : scope.row.Answers[task.VisitTaskId] }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="scope.row.DictionaryCode">
|
||||||
|
{{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="CriterionType === 10">
|
||||||
|
{{ isNaN(parseInt(scope.row.Answers[task.VisitTaskId]))?scope.row.Answers[task.VisitTaskId]:`${scope.row.Answers[task.VisitTaskId]}` }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="!((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)">
|
||||||
|
</template>
|
||||||
|
<template v-else-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit">
|
||||||
|
{{ isNaN(parseInt(scope.row.Answers[task.VisitTaskId]))?scope.row.Answers[task.VisitTaskId]:`${scope.row.Answers[task.VisitTaskId]} ${scope.row.Unit !== 4 ? $fd('ValueUnit',scope.row.Unit) : scope.row.CustomUnit}` }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="scope.row.ValueType === 2">
|
||||||
|
{{ isNaN(parseInt(scope.row.Answers[task.VisitTaskId])) ? scope.row.Answers[task.VisitTaskId]:`${scope.row.Answers[task.VisitTaskId]} %` }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="scope.row.Answers && scope.row.Answers.hasOwnProperty(task.VisitTaskId)">
|
||||||
|
{{ scope.row.Answers[task.VisitTaskId] }}
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<!-- 签名框 -->
|
||||||
|
<el-dialog
|
||||||
|
v-if="signVisible"
|
||||||
|
:visible.sync="signVisible"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
width="600px"
|
||||||
|
custom-class="base-dialog-wrapper"
|
||||||
|
>
|
||||||
|
<div slot="title">
|
||||||
|
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span>
|
||||||
|
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${ currentUser })` }}</span>
|
||||||
|
</div>
|
||||||
|
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { changeCalculationAnswer, getReadingReportEvaluation, changeDicomReadingQuestionAnswer, submitDicomVisitTask, verifyVisitTaskQuestions, getQuestionCalculateRelation } from '@/api/trials'
|
||||||
|
import { setSkipReadingCache } from '@/api/reading'
|
||||||
|
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
||||||
|
import UploadFile from './UploadFile'
|
||||||
|
import const_ from '@/const/sign-code'
|
||||||
|
import SignForm from '@/views/trials/components/newSignForm'
|
||||||
|
import { getToken } from '@/utils/auth'
|
||||||
|
import store from '@/store'
|
||||||
|
export default {
|
||||||
|
name: 'Report',
|
||||||
|
components: { SignForm, UploadFile },
|
||||||
|
props: {
|
||||||
|
trialId: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
visitTaskId: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
subjectId: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
readingTool: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
criterionType: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
isReadingTaskViewInOrder: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
currentUser: zzSessionStorage.getItem('userName'),
|
||||||
|
signVisible: false,
|
||||||
|
signCode: null,
|
||||||
|
visitTaskList: [],
|
||||||
|
taskQuestions: [],
|
||||||
|
loading: false,
|
||||||
|
answers: [],
|
||||||
|
readingTaskState: 2,
|
||||||
|
tumorEvaluate: null,
|
||||||
|
currentEvaluateResult: null,
|
||||||
|
isExistDisease: null,
|
||||||
|
currentExistDisease: null,
|
||||||
|
currentTaskReason: '',
|
||||||
|
answerArr: [],
|
||||||
|
questions: [],
|
||||||
|
isShowDetail: false,
|
||||||
|
CriterionType: 0,
|
||||||
|
CalculationList: [],
|
||||||
|
TrialReadingCriterionId: null,
|
||||||
|
tableAnswers: {},
|
||||||
|
questionForm: {},
|
||||||
|
questionId: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
questionForm: {
|
||||||
|
deep: true,
|
||||||
|
immediate: true,
|
||||||
|
handler(v, oldv) {
|
||||||
|
try {
|
||||||
|
if (!v[this.questionId] || !oldv[this.questionId]) return
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
this.formItemNumberChange(this.questionId, false)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
taskQuestions() {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.setScrollTop()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async mounted() {
|
||||||
|
this.CriterionType = parseInt(localStorage.getItem('CriterionType'))
|
||||||
|
this.digitPlaces = parseInt(localStorage.getItem('digitPlaces'))
|
||||||
|
this.TrialReadingCriterionId = this.$route.query.TrialReadingCriterionId
|
||||||
|
window.addEventListener('resize', () => {
|
||||||
|
this.handleResize()
|
||||||
|
this.setScrollTop()
|
||||||
|
})
|
||||||
|
DicomEvent.$on('getReportInfo', isRefresh => {
|
||||||
|
if (!isRefresh) return
|
||||||
|
this.getReportInfo()
|
||||||
|
})
|
||||||
|
await this.getQuestionCalculateRelation()
|
||||||
|
this.getReportInfo()
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
DicomEvent.$off('getReportInfo')
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
limitInput(value, a, b) {
|
||||||
|
if (value.indexOf('.') > -1) {
|
||||||
|
if (value.split('.')[1].length >= this.digitPlaces) {
|
||||||
|
this.$set(a, b, parseFloat(value).toFixed(this.digitPlaces))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setImageUrl(qid, index, tqid, url, RowId) {
|
||||||
|
if (index || index === 0) {
|
||||||
|
// 表格问题
|
||||||
|
this.$set(this.questionForm[qid][index], tqid, url)
|
||||||
|
this.$set(this.questionForm[qid][index], tqid + '_RowId', RowId)
|
||||||
|
// this.questionForm[qid][index][tqid] = url
|
||||||
|
} else {
|
||||||
|
// 非表格问题
|
||||||
|
this.questionForm[qid] = url
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getTagterAnswers(list, questionId) {
|
||||||
|
let Answers
|
||||||
|
list.forEach(v => {
|
||||||
|
if (v.QuestionId === questionId) {
|
||||||
|
return Object.assign({}, v.Answers)
|
||||||
|
} else if (v.Childrens.length > 0){
|
||||||
|
return this.getTagterAnswers(v.Childrens, questionId)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
formItemNumberChange(questionId, isTable) {
|
||||||
|
if (isTable) {
|
||||||
|
this.CalculationList.forEach((v, i) => {
|
||||||
|
var find = v.CalculateQuestionList.filter(o => {
|
||||||
|
return o.QuestionId === questionId
|
||||||
|
})
|
||||||
|
// find的自动计算值number
|
||||||
|
if (find) {
|
||||||
|
var num = this.logic(v)
|
||||||
|
if (num !== false) {
|
||||||
|
this.$set(this.questionForm, v.QuestionId, num)
|
||||||
|
// this.$emit('setFormItemData', { key: v.QuestionId, val: num })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.CalculationList.forEach(v => {
|
||||||
|
var find = v.CalculateQuestionList.filter(o => {
|
||||||
|
return o.TableQuestionId === questionId
|
||||||
|
})
|
||||||
|
// find的自动计算值number
|
||||||
|
if (find) {
|
||||||
|
var num = this.logic(v)
|
||||||
|
if (num !== false) {
|
||||||
|
this.$set(this.questionForm, v.QuestionId, num)
|
||||||
|
// this.$emit('setFormItemData', { key: v.QuestionId, val: num })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// this.$emit('formItemNumberChange')
|
||||||
|
},
|
||||||
|
getTableAnswers(QuestionId, list) {
|
||||||
|
var arr = []
|
||||||
|
window.xfList = list
|
||||||
|
list.forEach((v, i) => {
|
||||||
|
var obj = {}
|
||||||
|
v.Childrens.forEach((o) => {
|
||||||
|
this.$set(o, 'xfIndex', i)
|
||||||
|
obj[o.TableQuestionId + '_RowId'] = o.RowId
|
||||||
|
obj[o.TableQuestionId] = o.Answers[this.visitTaskId]
|
||||||
|
})
|
||||||
|
arr.push(obj)
|
||||||
|
})
|
||||||
|
return arr
|
||||||
|
},
|
||||||
|
InitVisitTaskQuestionForm() {
|
||||||
|
this.taskQuestions.map((v, i) => {
|
||||||
|
if (v.Type === 'group' && v.Childrens.length === 0 && v.Type !== 'table') return
|
||||||
|
if (!v.IsPage && v.Type !== 'group' && v.Type !== 'summary' && v.Type !== 'table' && v.Type !== 'number') {
|
||||||
|
this.$set(this.questionForm, v.QuestionId, v.Answers[this.visitTaskId])
|
||||||
|
}
|
||||||
|
if (v.Type === 'table') {
|
||||||
|
var tableAnswers = this.getTableAnswers(v.QuestionId, v.Childrens, i)
|
||||||
|
this.$set(this.questionForm, v.QuestionId, tableAnswers)
|
||||||
|
// this.$set(v, 'xfIndex', i)
|
||||||
|
}
|
||||||
|
if (v.Type === 'number') {
|
||||||
|
this.$set(this.questionForm, v.QuestionId, v.Answers[this.visitTaskId] === '' ? parseFloat(0).toFixed(this.digitPlaces) : v.Answers[this.visitTaskId])
|
||||||
|
}
|
||||||
|
if (v.Childrens.length > 0) {
|
||||||
|
this.setChild(v.Childrens)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.formItemNumberChange(this.questionId, false)
|
||||||
|
},
|
||||||
|
setChild(obj) {
|
||||||
|
obj.forEach((i, index) => {
|
||||||
|
if (i.Type !== 'group' && i.Type !== 'summary' && i.Id && i.Type !== 'table') {
|
||||||
|
this.$set(this.questionForm, i.QuestionId, i.Answers[this.visitTaskId])
|
||||||
|
}
|
||||||
|
if (i.Type === 'table') {
|
||||||
|
var tableAnswers = this.getTableAnswers(i.QuestionId, i.Childrens, index)
|
||||||
|
this.$set(this.questionForm, i.QuestionId, tableAnswers)
|
||||||
|
}
|
||||||
|
if (i.Type === 'number') {
|
||||||
|
this.$set(this.questionForm, i.QuestionId, i.Answers[this.visitTaskId] === '' ? parseFloat(0).toFixed(this.digitPlaces) : i.Answers[this.visitTaskId])
|
||||||
|
}
|
||||||
|
if (i.Childrens && i.Childrens.length > 0 && i.Type !== 'table') {
|
||||||
|
this.setChild(i.Childrens)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getQuestionCalculateRelation() {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
getQuestionCalculateRelation({
|
||||||
|
TrialReadingCriterionId: this.TrialReadingCriterionId
|
||||||
|
}).then(res => {
|
||||||
|
this.CalculationList = res.Result
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
logic(rules, num = 0) {
|
||||||
|
try {
|
||||||
|
if (rules.CalculateQuestionList.length === 0) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
rules.CalculateQuestionList.forEach((o, i) => {
|
||||||
|
if (i === 0) {
|
||||||
|
if (rules.CustomCalculateMark > 4) {
|
||||||
|
switch (rules.CustomCalculateMark) {
|
||||||
|
case 5:
|
||||||
|
this.questionForm[o.QuestionId].forEach((q, qi) => {
|
||||||
|
if (qi === 0) {
|
||||||
|
num = parseFloat(q[o.TableQuestionId])
|
||||||
|
} else {
|
||||||
|
num *= parseFloat(q[o.TableQuestionId])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
this.questionForm[o.QuestionId].forEach((q, qi) => {
|
||||||
|
if (qi === 0) {
|
||||||
|
num = isNaN(parseFloat(q[o.TableQuestionId])) ? null : parseFloat(q[o.TableQuestionId])
|
||||||
|
} else {
|
||||||
|
num += isNaN(parseFloat(q[o.TableQuestionId])) ? null : parseFloat(q[o.TableQuestionId])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
this.questionForm[o.QuestionId].forEach((q, qi) => {
|
||||||
|
if (qi === 0) {
|
||||||
|
num = parseFloat(q[o.TableQuestionId])
|
||||||
|
} else {
|
||||||
|
num += parseFloat(q[o.TableQuestionId])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
num = this.questionForm[o.QuestionId].length === 0 ? 0 : num / this.questionForm[o.QuestionId].length
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
var arr = []
|
||||||
|
this.questionForm[o.QuestionId].forEach(q => {
|
||||||
|
arr.push(q[o.TableQuestionId])
|
||||||
|
})
|
||||||
|
num = arr.length === 0 ? 0 : Math.max(...arr)
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
var arr = []
|
||||||
|
this.questionForm[o.QuestionId].forEach(q => {
|
||||||
|
arr.push(q[o.TableQuestionId])
|
||||||
|
})
|
||||||
|
num = arr.length === 0 ? 0 : Math.min(...arr)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
num = parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (rules.CustomCalculateMark) {
|
||||||
|
case 1:
|
||||||
|
num += parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
num -= parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
num *= parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
num /= parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
// num /= parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
var digitPlaces = parseInt(localStorage.getItem('digitPlaces'))
|
||||||
|
if (rules.ValueType === 2) {
|
||||||
|
num = num * 100
|
||||||
|
}
|
||||||
|
return isNaN(num) ? '' : isFinite(num) ? num.toFixed(digitPlaces) : '∞'
|
||||||
|
},
|
||||||
|
getReportInfo() {
|
||||||
|
this.loading = true
|
||||||
|
var params = {
|
||||||
|
visitTaskId: this.visitTaskId,
|
||||||
|
trialId: this.$router.currentRoute.query.trialId
|
||||||
|
}
|
||||||
|
this.taskQuestions = []
|
||||||
|
getReadingReportEvaluation(params).then(res => {
|
||||||
|
this.readingTaskState = res.Result.ReadingTaskState
|
||||||
|
this.tumorEvaluate = res.Result.CalculateResult.TumorEvaluate ? parseInt(res.Result.CalculateResult.TumorEvaluate) : null
|
||||||
|
this.isExistDisease = res.Result.CalculateResult.IsExistDisease ? parseInt(res.Result.CalculateResult.IsExistDisease) : null
|
||||||
|
this.answerArr = []
|
||||||
|
this.questions = res.Result.TaskQuestions.concat()
|
||||||
|
var taskQuestions = this.getQuestions(res.Result.TaskQuestions, !this.isShowDetail, null, null)
|
||||||
|
taskQuestions.forEach(item => {
|
||||||
|
this.$set(this.taskQuestions, this.taskQuestions.length, item)
|
||||||
|
})
|
||||||
|
this.visitTaskList = res.Result.VisitTaskList
|
||||||
|
this.InitVisitTaskQuestionForm()
|
||||||
|
this.handleResize()
|
||||||
|
this.setScrollTop()
|
||||||
|
this.loading = false
|
||||||
|
}).catch(() => { this.loading = false })
|
||||||
|
},
|
||||||
|
setScrollTop(a) {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if(this.$refs.reportList){
|
||||||
|
this.$refs.reportList.bodyWrapper.scrollTop = this.$refs.reportList.bodyWrapper.scrollHeight
|
||||||
|
this.$refs.reportList.bodyWrapper.scrollTop = this.$refs.reportList.bodyWrapper.scrollHeight
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},50)
|
||||||
|
},
|
||||||
|
getQuestions(questions, isNTFilterLength, lesionType, isLymphNodes) {
|
||||||
|
const arr = []
|
||||||
|
if (questions.length !== 0) {
|
||||||
|
questions.forEach((item) => {
|
||||||
|
// 过滤病灶标识 病灶名称 部位 器官 位置 是否淋巴结
|
||||||
|
// 非靶病灶和新病灶 过滤长径和短径信息
|
||||||
|
// 非淋巴结靶病灶 过滤短径
|
||||||
|
|
||||||
|
lesionType = item.LesionType
|
||||||
|
var filterArr = []
|
||||||
|
if ((item.LesionType === 1 || item.LesionType === 2) && isNTFilterLength) {
|
||||||
|
filterArr = [0, 1, 3, 4, 5, 6, 2, 8, 10]
|
||||||
|
} else {
|
||||||
|
filterArr = [3, 4, 5, 6, 2, 8, 10]
|
||||||
|
}
|
||||||
|
if (lesionType === 0 && isLymphNodes === 0 && !this.isShowDetail && this.CriterionType === 1) {
|
||||||
|
filterArr.push(1)
|
||||||
|
}
|
||||||
|
if (!(filterArr.includes(item.QuestionMark))) {
|
||||||
|
const obj = item
|
||||||
|
this.$set(obj, 'Answers', {})
|
||||||
|
// obj.Answers = {}
|
||||||
|
if (item.RowIndex > 0) {
|
||||||
|
var idx = item.Childrens.findIndex(i => i.QuestionMark === 8)
|
||||||
|
var idxLoc = item.Childrens.findIndex(i => i.QuestionMark === 10)
|
||||||
|
|
||||||
|
if (idx > -1) {
|
||||||
|
if (item.Childrens[idx].Answer.length > 0) {
|
||||||
|
var k = item.Childrens[idx].Answer.findIndex(v => v.Answer !== '')
|
||||||
|
var part = ''
|
||||||
|
if (obj.IsCanEditPosition) {
|
||||||
|
part = `${item.Childrens[idx].Answer[k].Answer}--${item.Childrens[idxLoc].Answer[k].Answer}`
|
||||||
|
} else {
|
||||||
|
part = `${item.Childrens[idx].Answer[k].Answer}`
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.SplitOrMergeLesionName && k > -1) {
|
||||||
|
obj.QuestionName = `${obj.QuestionName} --${part} (Split from ${item.SplitOrMergeLesionName})`
|
||||||
|
// obj.QuestionName = `${obj.QuestionName} `
|
||||||
|
} else if (!item.SplitOrMergeLesionName && k > -1) {
|
||||||
|
obj.QuestionName = `${obj.QuestionName} --${part}`
|
||||||
|
// obj.QuestionName = `${obj.QuestionName} `
|
||||||
|
} else {
|
||||||
|
obj.QuestionName = `${obj.QuestionName} `
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.CriterionType === 1) {
|
||||||
|
var idxLymphNode = item.Childrens.findIndex(i => i.QuestionMark === 2)
|
||||||
|
if (idxLymphNode > -1) {
|
||||||
|
isLymphNodes = item.Childrens[idxLymphNode].Answer[k].Answer ? parseInt(item.Childrens[idxLymphNode].Answer[k].Answer) : null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var digitPlaces = parseInt(localStorage.getItem('digitPlaces')) || 0
|
||||||
|
item.Answer.forEach(i => {
|
||||||
|
if (item.DictionaryCode) {
|
||||||
|
this.$set(obj.Answers, i.VisitTaskId, i.Answer ? parseInt(i.Answer) : null)
|
||||||
|
// obj.Answers[i.VisitTaskId] = i.Answer ? parseInt(i.Answer) : null
|
||||||
|
} else {
|
||||||
|
if (item.Type === 'number') {
|
||||||
|
this.$set(obj.Answers, i.VisitTaskId, isNaN(parseFloat(i.Answer)) ? i.Answer : parseFloat(i.Answer).toFixed(digitPlaces))
|
||||||
|
} else {
|
||||||
|
this.$set(obj.Answers, i.VisitTaskId, i.Answer)
|
||||||
|
}
|
||||||
|
// obj.Answers[i.VisitTaskId] = i.Answer
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (item.Childrens.length >= 1) {
|
||||||
|
obj.Childrens = this.getQuestions(item.Childrens, isNTFilterLength, lesionType, isLymphNodes)
|
||||||
|
}
|
||||||
|
arr.push(obj)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return arr
|
||||||
|
},
|
||||||
|
handleShowDetail(val) {
|
||||||
|
this.getReportInfo()
|
||||||
|
// this.taskQuestions = this.getQuestions(res.Result.TaskQuestions, !this.isShowDetail, null)
|
||||||
|
},
|
||||||
|
handleExistDiseaseChange(val) {
|
||||||
|
// this.currentExistDisease = parseInt(val)
|
||||||
|
|
||||||
|
if (val === this.isExistDisease && this.tumorEvaluate === this.currentEvaluateResult) {
|
||||||
|
this.currentTaskReason = ''
|
||||||
|
this.evaluateReasonChange('')
|
||||||
|
}
|
||||||
|
var idx = this.answerArr.findIndex(i => i.questionType === 15)
|
||||||
|
if (idx > -1) {
|
||||||
|
this.answerArr[idx].answer = val
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleEvaluateResultChange(val) {
|
||||||
|
// this.currentEvaluateResult = parseInt(val)
|
||||||
|
if (val === this.tumorEvaluate && this.isExistDisease === this.currentExistDisease) {
|
||||||
|
this.currentTaskReason = ''
|
||||||
|
this.evaluateReasonChange('')
|
||||||
|
}
|
||||||
|
var idx = this.answerArr.findIndex(i => i.questionType === 13)
|
||||||
|
if (idx > -1) {
|
||||||
|
this.answerArr[idx].answer = val
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
evaluateReasonChange(val) {
|
||||||
|
var idx = this.answerArr.findIndex(i => i.questionType === 14)
|
||||||
|
if (idx > -1) {
|
||||||
|
this.answerArr[idx].answer = val
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async handleConfirm() {
|
||||||
|
await this.handleSave(false)
|
||||||
|
await this.verifyVisitTaskQuestions()
|
||||||
|
const { ImageAssessmentReportConfirmation } = const_.processSignature
|
||||||
|
this.signCode = ImageAssessmentReportConfirmation
|
||||||
|
this.signVisible = true
|
||||||
|
},
|
||||||
|
verifyVisitTaskQuestions() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.loading = true
|
||||||
|
verifyVisitTaskQuestions({ visitTaskId: this.visitTaskId }).then(res => {
|
||||||
|
this.loading = false
|
||||||
|
resolve()
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
reject()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleResize() {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.reportList.doLayout()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 关闭签名框
|
||||||
|
closeSignDialog(isSign, signInfo) {
|
||||||
|
if (isSign) {
|
||||||
|
this.signConfirm(signInfo)
|
||||||
|
} else {
|
||||||
|
this.signVisible = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 签名并确认
|
||||||
|
signConfirm(signInfo) {
|
||||||
|
this.loading = true
|
||||||
|
var params = {
|
||||||
|
data: {
|
||||||
|
visitTaskId: this.visitTaskId
|
||||||
|
},
|
||||||
|
signInfo: signInfo
|
||||||
|
}
|
||||||
|
submitDicomVisitTask(params).then(res => {
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
|
if (this.$refs['signForm']) {
|
||||||
|
this.$refs['signForm'].btnLoading = false
|
||||||
|
}
|
||||||
|
|
||||||
|
this.signVisible = false
|
||||||
|
// window.location.reload()
|
||||||
|
// window.opener.postMessage('refreshTaskList', window.location)
|
||||||
|
|
||||||
|
// 设置当前任务阅片状态为已读
|
||||||
|
this.readingTaskState = 2
|
||||||
|
store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 })
|
||||||
|
DicomEvent.$emit('setReadingState', 2)
|
||||||
|
window.opener.postMessage('refreshTaskList', window.location)
|
||||||
|
this.$confirm(this.$t('trials:oncologyReview:title:msg2'), {
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
})
|
||||||
|
.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()
|
||||||
|
})
|
||||||
|
.catch(action => {
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.loading = false
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
if (this.$refs['signForm'] && this.$refs['signForm'].btnLoading) {
|
||||||
|
this.$refs['signForm'].btnLoading = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
previewDicoms(task) {
|
||||||
|
var token = getToken()
|
||||||
|
// var subjectCode = this.$router.currentRoute.query.subjectCode
|
||||||
|
var subjectCode = localStorage.getItem('subjectCode')
|
||||||
|
var subjectId = this.subjectId
|
||||||
|
var trialId = this.trialId
|
||||||
|
var isReadingTaskViewInOrder = this.isReadingTaskViewInOrder
|
||||||
|
var criterionType = this.criterionType
|
||||||
|
var readingTool = this.readingTool
|
||||||
|
var trialReadingCriterionId = this.$router.currentRoute.query.TrialReadingCriterionId
|
||||||
|
var path = `/readingDicoms?TrialReadingCriterionId=${trialReadingCriterionId}&trialId=${trialId}&subjectCode=${subjectCode}&subjectId=${subjectId}&visitTaskId=${task.VisitTaskId}&isReadingTaskViewInOrder=${isReadingTaskViewInOrder}&criterionType=${criterionType}&readingTool=${readingTool}&TokenKey=${token}`
|
||||||
|
const routeData = this.$router.resolve({ path })
|
||||||
|
window.open(routeData.href, '_blank')
|
||||||
|
},
|
||||||
|
handleSave(isPrompt) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.loading = true
|
||||||
|
var answers = []
|
||||||
|
var tableQuestionAnswer = []
|
||||||
|
for (const k in this.questionForm) {
|
||||||
|
if (this.questionForm[k] instanceof Array) {
|
||||||
|
this.questionForm[k].forEach((v, i) => {
|
||||||
|
Object.keys(v).forEach(o => {
|
||||||
|
if (o.indexOf('_RowId') === -1) {
|
||||||
|
tableQuestionAnswer.push({
|
||||||
|
questionId: k,
|
||||||
|
answer: v[o],
|
||||||
|
tableQuestionId: o,
|
||||||
|
rowId: v[o+'_RowId']
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
// tableQuestionAnswer.push({})
|
||||||
|
} else {
|
||||||
|
answers.push({ questionId: k, answer: this.questionForm[k].toString() })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var params = {
|
||||||
|
visitTaskId: this.visitTaskId,
|
||||||
|
questionAnswer: answers,
|
||||||
|
tableQuestionAnswer: tableQuestionAnswer
|
||||||
|
}
|
||||||
|
changeCalculationAnswer(params).then(res => {
|
||||||
|
if (isPrompt) {
|
||||||
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
|
}
|
||||||
|
DicomEvent.$emit('refreshQuestionAnswer')
|
||||||
|
this.loading = false
|
||||||
|
resolve()
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
reject()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
async skipTask() {
|
||||||
|
try {
|
||||||
|
// 是否确认跳过?
|
||||||
|
const confirm = await this.$confirm(
|
||||||
|
this.$t('trials:readingReport:message:skipConfirm'),
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (confirm !== 'confirm') return
|
||||||
|
this.loading = true
|
||||||
|
const res = await setSkipReadingCache({ visitTaskId: this.visitTaskId })
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
window.location.reload()
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.report-wrapper{
|
||||||
|
|
||||||
|
height: 100%;
|
||||||
|
// background-color: #fff;
|
||||||
|
// background-color: #000;
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 7px;
|
||||||
|
height: 7px;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
border-radius: 10px;
|
||||||
|
// background: #d0d0d0;
|
||||||
|
}
|
||||||
|
.report-header{
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.el-card{
|
||||||
|
// background-color: #000;
|
||||||
|
// color: #ffffff;
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
/deep/ .el-table--border th.gutter:last-of-type{
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
/deep/ .el-card__header{
|
||||||
|
border: none;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
/deep/ .el-upload-list--picture-card .el-upload-list__item{
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
}
|
||||||
|
/deep/ .el-upload--picture-card{
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/deep/ .el-switch__label.is-active{
|
||||||
|
color: #428bca;
|
||||||
|
}
|
||||||
|
.uploadWrapper{
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,167 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-upload
|
||||||
|
:action="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:readingTaskState >= 2 || (fileList.length >= question.ImageCount) || (task.VisitTaskId !== visitTaskId) || question.IsShowInDicom || ((task.IsBaseLine && question.LimitEdit === 2) || (!task.IsBaseLine && question.LimitEdit === 1))}"
|
||||||
|
:disabled="readingTaskState >= 2 || task.VisitTaskId !== visitTaskId || question.IsShowInDicom || ((task.IsBaseLine && question.LimitEdit === 2) || (!task.IsBaseLine && question.LimitEdit === 1))"
|
||||||
|
>
|
||||||
|
<i slot="default" class="el-icon-plus" />
|
||||||
|
<div slot="file" slot-scope="{file}">
|
||||||
|
<viewer
|
||||||
|
:ref="file.url"
|
||||||
|
:images="[imageUrl]"
|
||||||
|
style="
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
class="el-upload-list__item-thumbnail"
|
||||||
|
:src="OSSclientConfig.basePath + file.url"
|
||||||
|
crossOrigin="anonymous"
|
||||||
|
alt=""
|
||||||
|
style="max-width: 100%; max-height: 100%"
|
||||||
|
/>
|
||||||
|
<span class="el-upload-list__item-actions">
|
||||||
|
<span
|
||||||
|
class="el-upload-list__item-preview"
|
||||||
|
@click="handlePictureCardPreview(file)"
|
||||||
|
>
|
||||||
|
<i class="el-icon-zoom-in" />
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span
|
||||||
|
v-if="readingTaskState < 2"
|
||||||
|
class="el-upload-list__item-delete"
|
||||||
|
@click="handleRemove(file)"
|
||||||
|
>
|
||||||
|
<i class="el-icon-delete" />
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</viewer>
|
||||||
|
</div>
|
||||||
|
</el-upload>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "UploadFile",
|
||||||
|
props: {
|
||||||
|
task: {
|
||||||
|
Type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
question: {
|
||||||
|
Type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
visitTaskId: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
readingTaskState: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
initUrl: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
imgVisible: false,
|
||||||
|
imageUrl: null,
|
||||||
|
accept: '.png,.jpg,.jpeg',
|
||||||
|
fileList: [],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.urls = this.initUrl === '' ? [] : this.initUrl.split('|')
|
||||||
|
console.log(this.visitTaskId, this.urls)
|
||||||
|
this.fileList = []
|
||||||
|
this.urls.map(url => {
|
||||||
|
this.fileList.push({ name: '', url: `${url}` })
|
||||||
|
})
|
||||||
|
console.log(this.fileList)
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
checkFileSuffix(fileName) {
|
||||||
|
var index = fileName.lastIndexOf('.')
|
||||||
|
var suffix = fileName.substring(index + 1, fileName.length)
|
||||||
|
if (this.accept.toLocaleLowerCase().search(suffix.toLocaleLowerCase()) === -1) {
|
||||||
|
return false
|
||||||
|
} else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async uploadScreenshot(param) {
|
||||||
|
if (!this.visitTaskId) return
|
||||||
|
const loading = this.$loading({
|
||||||
|
target: document.querySelector('.ecrf-wrapper'),
|
||||||
|
fullscreen: false,
|
||||||
|
lock: true,
|
||||||
|
text: 'Loading',
|
||||||
|
spinner: 'el-icon-loading'
|
||||||
|
})
|
||||||
|
var trialId = this.$route.query.trialId
|
||||||
|
var subjectId = this.$route.query.trialId
|
||||||
|
var file = await this.fileToBlob(param.file)
|
||||||
|
const res = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${param.file.name}`, file)
|
||||||
|
console.log(res)
|
||||||
|
this.fileList.push({ name: param.file.name, path: this.$getObjectName(res.url), url: this.$getObjectName(res.url)})
|
||||||
|
this.urls.push(this.$getObjectName(res.url))
|
||||||
|
this.$emit('setImageUrl', this.urls.length > 0 ? this.urls.join('|') : '')
|
||||||
|
loading.close()
|
||||||
|
},
|
||||||
|
handleBeforeUpload(file) {
|
||||||
|
// 检测文件类型是否符合要求
|
||||||
|
if (this.checkFileSuffix(file.name)) {
|
||||||
|
// this.fileList = []
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
this.$alert(`必须是 ${this.accept} 格式`)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 预览图片
|
||||||
|
handlePictureCardPreview(file) {
|
||||||
|
var suffix = file.url.substring(file.url.lastIndexOf(".")+1)
|
||||||
|
suffix = suffix ? suffix.toLowerCase() : ''
|
||||||
|
if (suffix === 'doc' || suffix === 'docx' || suffix === 'pdf'){
|
||||||
|
window.open(this.OSSclientConfig.basePath + file.url,'_blank')
|
||||||
|
}else{
|
||||||
|
this.imageUrl = this.OSSclientConfig.basePath + file.url
|
||||||
|
// this.imgVisible = true
|
||||||
|
this.$refs[file.url].$viewer.show()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 删除图片
|
||||||
|
handleRemove(file, fileList) {
|
||||||
|
this.imageUrl = ''
|
||||||
|
this.fileList.splice(this.fileList.findIndex(f => f.url === file.url), 1)
|
||||||
|
this.urls.splice(this.fileList.findIndex(f => f === file.url), 1)
|
||||||
|
this.$emit('setFormItemData', { key: this.question.Id, val: this.urls.length > 0 ? this.urls.join('|') : '' })
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.disabled{
|
||||||
|
/deep/ .el-upload--picture-card {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,9 +1,9 @@
|
||||||
<template>
|
<template>
|
||||||
<div v-loading="loading" class="img-container">
|
<div v-loading="loading" class="img-container">
|
||||||
<el-card class="box-card left">
|
<el-card class="box-card left">
|
||||||
<div v-if="otherInfo && otherInfo.IsReadingShowSubjectInfo" class="title">
|
<div v-if="isReadingShowSubjectInfo" class="title">
|
||||||
<span>{{ $t('trials:auditRecord:table:subject') }}:{{ otherInfo.SubjectCode }} </span>
|
<h4>{{ subjectCode }} </h4>
|
||||||
<span>({{ otherInfo.TaskBlindName }})</span>
|
<h4>{{ taskBlindName }}</h4>
|
||||||
</div>
|
</div>
|
||||||
<el-tabs v-model="activeName" @tab-click="handleClick">
|
<el-tabs v-model="activeName" @tab-click="handleClick">
|
||||||
<el-tab-pane :label="$t('trials:clinicaldara:title:currentTask')" name="first" class="left-content">
|
<el-tab-pane :label="$t('trials:clinicaldara:title:currentTask')" name="first" class="left-content">
|
||||||
|
@ -93,6 +93,10 @@
|
||||||
:subject-id="subjectId"
|
:subject-id="subjectId"
|
||||||
:visit-task-id="visitTaskId"
|
:visit-task-id="visitTaskId"
|
||||||
:criterion-id="otherInfo.TrialCriterionId"
|
:criterion-id="otherInfo.TrialCriterionId"
|
||||||
|
:subjectCode="subjectCode"
|
||||||
|
:taskBlindName="taskBlindName"
|
||||||
|
:isReadingShowSubjectInfo="isReadingShowSubjectInfo"
|
||||||
|
:iseCRFShowInDicomReading="iseCRFShowInDicomReading"
|
||||||
/>
|
/>
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
|
@ -127,9 +131,33 @@ export default {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
|
taskBlindName: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
readingCategory: {
|
readingCategory: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
isReadingShowSubjectInfo: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
readingTool: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
criterionType: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
isReadingTaskViewInOrder: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
iseCRFShowInDicomReading: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
@ -156,7 +184,8 @@ export default {
|
||||||
currentTaskId: '',
|
currentTaskId: '',
|
||||||
otherInfo: null,
|
otherInfo: null,
|
||||||
isReadingShowPreviousResults: false,
|
isReadingShowPreviousResults: false,
|
||||||
bp: []
|
bp: [],
|
||||||
|
openWindow: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -170,6 +199,11 @@ export default {
|
||||||
|
|
||||||
this.getNoneDicomList(this.isReadingShowPreviousResults)
|
this.getNoneDicomList(this.isReadingShowPreviousResults)
|
||||||
},
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
if (this.openWindow) {
|
||||||
|
this.openWindow.close()
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// 获取非Dicom检查信息
|
// 获取非Dicom检查信息
|
||||||
getNoneDicomList() {
|
getNoneDicomList() {
|
||||||
|
@ -250,18 +284,21 @@ export default {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
handleImageRead(task) {
|
handleImageRead(task) {
|
||||||
|
if (this.openWindow) {
|
||||||
|
this.openWindow.close()
|
||||||
|
}
|
||||||
this.currentTaskId = task.VisitTaskId
|
this.currentTaskId = task.VisitTaskId
|
||||||
var criterionType = this.$router.currentRoute.query.criterionType
|
var criterionType = this.criterionType
|
||||||
var readingTool = this.$router.currentRoute.query.readingTool
|
var readingTool = this.readingTool
|
||||||
var isReadingTaskViewInOrder = this.$router.currentRoute.query.isReadingTaskViewInOrder
|
var isReadingTaskViewInOrder = this.isReadingTaskViewInOrder
|
||||||
var trialReadingCriterionId = this.$router.currentRoute.query.TrialReadingCriterionId
|
var trialReadingCriterionId = this.$router.currentRoute.query.TrialReadingCriterionId
|
||||||
var token = getToken()
|
var token = getToken()
|
||||||
const path = `/noneDicomReading?TrialReadingCriterionId=${trialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${this.subjectCode}&subjectId=${this.subjectId}&isReadingTaskViewInOrder=${isReadingTaskViewInOrder}&criterionType=${criterionType}&readingTool=${readingTool}&TokenKey=${token}`
|
const path = `/noneDicomReading?TrialReadingCriterionId=${trialReadingCriterionId}&trialId=${this.trialId}&visitTaskId=${task.VisitTaskId}&subjectCode=${this.subjectCode}&subjectId=${this.subjectId}&isReadingTaskViewInOrder=${isReadingTaskViewInOrder}&criterionType=${criterionType}&readingTool=${readingTool}&TokenKey=${token}`
|
||||||
// const routeData = this.$router.resolve({
|
// const routeData = this.$router.resolve({
|
||||||
// path: `/readingPage?subjectId=${this.subjectId}&trialId=${this.trialId}&visitTaskId=${task.VisitTaskId}&TokenKey=${token}`
|
// path: `/readingPage?subjectId=${this.subjectId}&trialId=${this.trialId}&visitTaskId=${task.VisitTaskId}&TokenKey=${token}`
|
||||||
// })
|
// })
|
||||||
const routeData = this.$router.resolve({ path })
|
const routeData = this.$router.resolve({ path })
|
||||||
window.open(routeData.href, '_blank')
|
this.openWindow = window.open(routeData.href, '_blank')
|
||||||
},
|
},
|
||||||
previewCD() {
|
previewCD() {
|
||||||
var token = getToken()
|
var token = getToken()
|
||||||
|
@ -295,7 +332,7 @@ export default {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
padding: 10px;
|
padding-bottom: 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
width: 7px;
|
width: 7px;
|
||||||
|
@ -326,13 +363,19 @@ export default {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
.title{
|
.title{
|
||||||
height: 40px;
|
// height: 40px;
|
||||||
line-height: 40px;
|
// line-height: 40px;
|
||||||
border: 1ppx solid;
|
border: 1ppx solid;
|
||||||
border: 1px solid #ebe7e7;
|
border: 1px solid #ebe7e7;
|
||||||
padding-left: 10px;
|
// padding-left: 10px;
|
||||||
background-color: #4e4e4e;
|
background-color: #4e4e4e;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
|
h4{
|
||||||
|
padding: 5px 0px;
|
||||||
|
margin: 0;
|
||||||
|
text-align: center;
|
||||||
|
background-color: #4c4c4c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.left-content{
|
.left-content{
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|
|
@ -1,15 +1,40 @@
|
||||||
<template>
|
<template>
|
||||||
<div ref="container" v-loading="loading" class="none-dicom-reading-container">
|
<div ref="container" v-loading="loading" class="none-dicom-reading-container">
|
||||||
<!-- 访视阅片 -->
|
<!-- 访视阅片 -->
|
||||||
<VisitReview
|
<div v-if="isShow && readingCategory && readingCategory=== 1" class="reading-wrapper">
|
||||||
v-if="isShow && readingCategory && readingCategory=== 1"
|
<el-tabs v-model="activeName" :before-leave="beforeLeave">
|
||||||
:trial-id="trialId"
|
<!-- 阅片 -->
|
||||||
:subject-id="subjectId"
|
<el-tab-pane :label="$t('trials:reading:tabTitle:review')" name="read">
|
||||||
:subject-code="subjectCode"
|
<VisitReview
|
||||||
:visit-task-id="visitTaskId"
|
:trial-id="trialId"
|
||||||
:reading-category="readingCategory"
|
:subject-id="subjectId"
|
||||||
:is-exists-clinical-data="isExistsClinicalData"
|
:subject-code="subjectCode"
|
||||||
/>
|
:visit-task-id="visitTaskId"
|
||||||
|
:task-blind-name="taskBlindName"
|
||||||
|
:reading-category="readingCategory"
|
||||||
|
:readingTool="readingTool"
|
||||||
|
:criterionType="criterionType"
|
||||||
|
:isReadingShowSubjectInfo="isReadingShowSubjectInfo"
|
||||||
|
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
|
||||||
|
:iseCRFShowInDicomReading="iseCRFShowInDicomReading"
|
||||||
|
/>
|
||||||
|
</el-tab-pane>
|
||||||
|
<!-- 报告 -->
|
||||||
|
<el-tab-pane :label="$t('trials:reading:tabTitle:report')" name="report" v-if="!iseCRFShowInDicomReading">
|
||||||
|
<Report
|
||||||
|
v-if="tabs.includes('report')"
|
||||||
|
ref="reportPage"
|
||||||
|
:trialId="trialId"
|
||||||
|
:visit-task-id="visitTaskId"
|
||||||
|
:subject-id="subjectId"
|
||||||
|
:readingTool="readingTool"
|
||||||
|
:criterionType="criterionType"
|
||||||
|
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
|
||||||
|
/>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- 全局阅片 -->
|
<!-- 全局阅片 -->
|
||||||
<GlobalReview
|
<GlobalReview
|
||||||
v-else-if="isShow && readingCategory && readingCategory === 2"
|
v-else-if="isShow && readingCategory && readingCategory === 2"
|
||||||
|
@ -83,6 +108,7 @@ import { getNextTask, readClinicalData } from '@/api/trials'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { changeURLStatic } from '@/utils/history.js'
|
import { changeURLStatic } from '@/utils/history.js'
|
||||||
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
||||||
|
import Report from './components/Report'
|
||||||
import VisitReview from './components/VisitReview'
|
import VisitReview from './components/VisitReview'
|
||||||
import GlobalReview from '@/views/trials/trials-panel/reading/global-review'
|
import GlobalReview from '@/views/trials/trials-panel/reading/global-review'
|
||||||
import AdReview from '@/views/trials/trials-panel/reading/ad-review'
|
import AdReview from '@/views/trials/trials-panel/reading/ad-review'
|
||||||
|
@ -93,6 +119,7 @@ export default {
|
||||||
name: 'NoneDicomReading',
|
name: 'NoneDicomReading',
|
||||||
components: {
|
components: {
|
||||||
VisitReview,
|
VisitReview,
|
||||||
|
Report,
|
||||||
AdReview,
|
AdReview,
|
||||||
GlobalReview,
|
GlobalReview,
|
||||||
OncologyReview,
|
OncologyReview,
|
||||||
|
@ -113,12 +140,15 @@ export default {
|
||||||
isExistsClinicalData: false,
|
isExistsClinicalData: false,
|
||||||
isNeedReadClinicalData: false,
|
isNeedReadClinicalData: false,
|
||||||
isReadClinicalData: false,
|
isReadClinicalData: false,
|
||||||
|
iseCRFShowInDicomReading: false,
|
||||||
criterionType: null,
|
criterionType: null,
|
||||||
readingTool: null,
|
readingTool: null,
|
||||||
isNewSubject: null,
|
isNewSubject: null,
|
||||||
dialogVisible: false,
|
dialogVisible: false,
|
||||||
dialogH: 0,
|
dialogH: 0,
|
||||||
isShow: false
|
isShow: false,
|
||||||
|
activeName:'',
|
||||||
|
tabs: []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -169,6 +199,10 @@ export default {
|
||||||
// var token = getToken()
|
// var token = getToken()
|
||||||
// window.location.href = `/noneDicomReading?trialId=${this.trialId}&subjectCode=${res.Result.SubjectCode}&subjectId=${res.Result.SubjectId}&isReadingShowPreviousResults=${this.isReadingShowPreviousResults}&isReadingShowSubjectInfo=${this.isReadingShowSubjectInfo}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&isNewSubject=1&isReadingTaskViewInOrder=${res.Result.IsReadingTaskViewInOrder}&TokenKey=${token}`
|
// window.location.href = `/noneDicomReading?trialId=${this.trialId}&subjectCode=${res.Result.SubjectCode}&subjectId=${res.Result.SubjectId}&isReadingShowPreviousResults=${this.isReadingShowPreviousResults}&isReadingShowSubjectInfo=${this.isReadingShowSubjectInfo}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&isNewSubject=1&isReadingTaskViewInOrder=${res.Result.IsReadingTaskViewInOrder}&TokenKey=${token}`
|
||||||
// }
|
// }
|
||||||
|
if (res.Result.ReadingCategory === 1) {
|
||||||
|
this.activeName = 'read'
|
||||||
|
this.tabs = [this.activeName]
|
||||||
|
}
|
||||||
this.subjectId = res.Result.SubjectId
|
this.subjectId = res.Result.SubjectId
|
||||||
this.visitTaskId = res.Result.VisitTaskId
|
this.visitTaskId = res.Result.VisitTaskId
|
||||||
this.subjectCode = res.Result.SubjectCode
|
this.subjectCode = res.Result.SubjectCode
|
||||||
|
@ -176,7 +210,8 @@ export default {
|
||||||
this.isExistsClinicalData = res.Result.IsExistsClinicalData
|
this.isExistsClinicalData = res.Result.IsExistsClinicalData
|
||||||
this.isReadClinicalData = res.Result.IsReadClinicalData
|
this.isReadClinicalData = res.Result.IsReadClinicalData
|
||||||
this.isNeedReadClinicalData = res.Result.IsNeedReadClinicalData
|
this.isNeedReadClinicalData = res.Result.IsNeedReadClinicalData
|
||||||
|
this.iseCRFShowInDicomReading = res.Result.IseCRFShowInDicomReading
|
||||||
|
this.isReadingTaskViewInOrder = res.Result.IsReadingTaskViewInOrder
|
||||||
this.isReadingShowSubjectInfo = res.Result.IsReadingShowSubjectInfo
|
this.isReadingShowSubjectInfo = res.Result.IsReadingShowSubjectInfo
|
||||||
this.isReadingShowPreviousResults = res.Result.IsReadingShowPreviousResults
|
this.isReadingShowPreviousResults = res.Result.IsReadingShowPreviousResults
|
||||||
this.digitPlaces = res.Result.DigitPlaces
|
this.digitPlaces = res.Result.DigitPlaces
|
||||||
|
@ -201,7 +236,21 @@ export default {
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
beforeLeave(activeName, oldActiveName) {
|
||||||
|
if (!this.tabs.includes(activeName)) {
|
||||||
|
this.tabs.push(activeName)
|
||||||
|
}
|
||||||
|
if (oldActiveName === 'read') {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (this.$refs.reportPage) {
|
||||||
|
// DicomEvent.$emit('getReportInfo', true)
|
||||||
|
this.$refs.reportPage.setScrollTop(1)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return Promise.resolve(true)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -221,7 +270,38 @@ export default {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.reading-wrapper{
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 0 10px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
/deep/.el-tabs{
|
||||||
|
box-sizing: border-box;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
.el-tabs__item{
|
||||||
|
// color: #fff;
|
||||||
|
}
|
||||||
|
.el-tabs__header{
|
||||||
|
height: 50px;
|
||||||
|
margin:0px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.el-tabs__content{
|
||||||
|
flex: 1;
|
||||||
|
margin:0px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.el-tabs__item{
|
||||||
|
// color: #fff;
|
||||||
|
}
|
||||||
|
.el-tab-pane{
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
/deep/ .dialog-container{
|
/deep/ .dialog-container{
|
||||||
margin-top: 50px !important;
|
margin-top: 50px !important;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue