Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details

uat_us
caiyiling 2026-04-22 11:09:56 +08:00
commit 838ab975cc
4 changed files with 1761 additions and 842 deletions

View File

@ -12,16 +12,33 @@
<!--受试者--> <!--受试者-->
<el-table-column prop="SubjectCode" :label="$t('upload:dicom:table:subjectCode')" sortable /> <el-table-column prop="SubjectCode" :label="$t('upload:dicom:table:subjectCode')" sortable />
<!--访视名称--> <!--访视名称-->
<el-table-column prop="VisitName" :label="$t('download:table:VisitName')" v-if="IsImageSegment" sortable /> <el-table-column
prop="VisitName"
:label="$t('download:table:VisitName')"
v-if="IsImageSegment"
sortable
/>
<!--任务名称--> <!--任务名称-->
<el-table-column prop="TaskBlindName" :label="$t('upload:dicom:table:taskBlindName')" v-else sortable /> <el-table-column
prop="TaskBlindName"
:label="$t('upload:dicom:table:taskBlindName')"
v-else
sortable
/>
<!--原始检查数--> <!--原始检查数-->
<el-table-column prop="OrginalStudyList" :label="$t('upload:dicom:table:orginalStudyListNum')"> <el-table-column
prop="OrginalStudyList"
:label="$t('upload:dicom:table:orginalStudyListNum')"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button v-if=" <el-button
v-if="
scope.row.OrginalStudyList && scope.row.OrginalStudyList &&
scope.row.OrginalStudyList.length >= 1 scope.row.OrginalStudyList.length >= 1
" type="text" @click="handleOpenDialog(scope.row, 'OrginalStudyList')"> "
type="text"
@click="handleOpenDialog(scope.row, 'OrginalStudyList')"
>
<span>{{ scope.row.OrginalStudyList.length }}</span> <span>{{ scope.row.OrginalStudyList.length }}</span>
</el-button> </el-button>
<span v-else>0</span> <span v-else>0</span>
@ -30,9 +47,13 @@
<!--后处理检查数--> <!--后处理检查数-->
<el-table-column prop="UploadStudyList" :label="$t('upload:dicom:table:uploadStudyListNum')"> <el-table-column prop="UploadStudyList" :label="$t('upload:dicom:table:uploadStudyListNum')">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button v-if=" <el-button
v-if="
scope.row.UploadStudyList && scope.row.UploadStudyList.length >= 1 scope.row.UploadStudyList && scope.row.UploadStudyList.length >= 1
" type="text" @click="handleOpenDialog(scope.row, 'UploadStudyList', true)"> "
type="text"
@click="handleOpenDialog(scope.row, 'UploadStudyList', true)"
>
<span>{{ scope.row.UploadStudyList.length }}</span> <span>{{ scope.row.UploadStudyList.length }}</span>
</el-button> </el-button>
<span v-else>0</span> <span v-else>0</span>
@ -42,27 +63,57 @@
<template slot-scope="scope"> <template slot-scope="scope">
<div class="btnBox"> <div class="btnBox">
<!--上传---> <!--上传--->
<form id="inputForm" :ref="`uploadForm_${scope.row.Id}`" enctype="multipart/form-data" v-if="!forbid"> <form
id="inputForm"
:ref="`uploadForm_${scope.row.Id}`"
enctype="multipart/form-data"
v-if="!forbid"
>
<div class="form-group" style="margin-right: 10px"> <div class="form-group" style="margin-right: 10px">
<div :id="`directoryInputWrapper_${scope.row.Id}`" class="btn btn-link file-input"> <div :id="`directoryInputWrapper_${scope.row.Id}`" class="btn btn-link file-input">
<el-button circle icon="el-icon-upload2" :disabled="btnLoading" :loading="btnLoading" <el-button
:title="$t('upload:dicom:button:upload')" /> circle
<input :title="$t('upload:dicom:button:upload')" type="file" :name="`file_${scope.row.VisitTaskId}`" icon="el-icon-upload2"
:ref="`pathClear_${scope.row.VisitTaskId}`" :disabled="btnLoading" webkitdirectory multiple @change=" :disabled="btnLoading"
:loading="btnLoading"
:title="$t('upload:dicom:button:upload')"
/>
<input
:title="$t('upload:dicom:button:upload')"
type="file"
:name="`file_${scope.row.VisitTaskId}`"
:ref="`pathClear_${scope.row.VisitTaskId}`"
:disabled="btnLoading"
webkitdirectory
multiple
@change="
($event) => beginScanFiles($event, scope.row.VisitTaskId) ($event) => beginScanFiles($event, scope.row.VisitTaskId)
" /> "
/>
</div> </div>
</div> </div>
</form> </form>
<!--预览---> <!--预览--->
<el-button circle icon="el-icon-view" :disabled="!scope.row.UploadStudyList || <el-button
circle
icon="el-icon-view"
:disabled="!scope.row.UploadStudyList ||
scope.row.UploadStudyList.length <= 0 scope.row.UploadStudyList.length <= 0
" @click.stop="handleViewReadingImages(scope.row)" :title="$t('upload:dicom:button:preview')" /> "
@click.stop="handleViewReadingImages(scope.row)"
:title="$t('upload:dicom:button:preview')"
/>
<!--删除---> <!--删除--->
<el-button circle :disabled="!scope.row.UploadStudyList || <el-button
circle
:disabled="!scope.row.UploadStudyList ||
scope.row.UploadStudyList.length <= 0 || scope.row.UploadStudyList.length <= 0 ||
scope.row.ReadingTaskState === 2 scope.row.ReadingTaskState === 2
" icon="el-icon-delete" :title="$t('upload:dicom:button:delete')" @click.stop="remove(scope.row)" /> "
icon="el-icon-delete"
:title="$t('upload:dicom:button:delete')"
@click.stop="remove(scope.row)"
/>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
@ -70,32 +121,49 @@
<div style="margin: 10px 0" class="top"> <div style="margin: 10px 0" class="top">
<span>{{ $t('upload:dicom:uploadTitle') }}</span> <span>{{ $t('upload:dicom:uploadTitle') }}</span>
<div class="btnBox" v-if="!forbid"> <div class="btnBox" v-if="!forbid">
<span style="margin-right: 10px"> <span style="margin-right: 10px">{{ $store.state.trials.uploadTip }}</span>
{{ $store.state.trials.uploadTip }}
</span>
<form id="inputForm" ref="uploadForm" enctype="multipart/form-data"> <form id="inputForm" ref="uploadForm" enctype="multipart/form-data">
<div class="form-group"> <div class="form-group">
<div id="directoryInputWrapper" class="btn btn-link file-input"> <div id="directoryInputWrapper" class="btn btn-link file-input">
<el-button type="primary" :disabled="btnLoading" :loading="btnLoading" size="mini"> <el-button
{{ $t('upload:dicom:button:batchUpload') }} type="primary"
</el-button> :disabled="btnLoading"
<input type="file" name="file" ref="pathClear" :disabled="btnLoading" webkitdirectory multiple title="" :loading="btnLoading"
@change="beginScanFiles($event)" /> size="mini"
>{{ $t('upload:dicom:button:batchUpload') }}</el-button>
<input
type="file"
name="file"
ref="pathClear"
:disabled="btnLoading"
webkitdirectory
multiple
title
@change="beginScanFiles($event)"
/>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
<!--上传列表--> <!--上传列表-->
<el-table ref="dicomFilesTable" v-adaptive="{ bottomOffset: 80 }" height="100" :data="uploadQueues" <el-table
class="dicomFiles-table" @selection-change="handleSelectionChange"> ref="dicomFilesTable"
v-adaptive="{ bottomOffset: 80 }"
height="100"
:data="uploadQueues"
class="dicomFiles-table"
@selection-change="handleSelectionChange"
>
<el-table-column type="index" width="40" /> <el-table-column type="index" width="40" />
<el-table-column min-width="200" show-overflow-tooltip> <el-table-column min-width="200" show-overflow-tooltip>
<template slot="header"> <template slot="header">
<el-tooltip placement="top"> <el-tooltip placement="top">
<div slot="content"> <div slot="content">
{{ $t('trials:uploadDicomList:table:studyDetail1') }}<br /> {{ $t('trials:uploadDicomList:table:studyDetail1') }}
{{ $t('trials:uploadDicomList:table:studyDetail2') }}<br /> <br />
{{ $t('trials:uploadDicomList:table:studyDetail2') }}
<br />
{{ $t('trials:uploadedDicoms:table:studyDate') }} {{ $t('trials:uploadedDicoms:table:studyDate') }}
</div> </div>
<span>{{ $t('trials:uploadDicomList:table:studyInfo') }}</span> <span>{{ $t('trials:uploadDicomList:table:studyInfo') }}</span>
@ -105,13 +173,16 @@
<div style="line-height: 15px"> <div style="line-height: 15px">
<div> <div>
<div> <div>
<span v-if="scope.row.dicomInfo.accNumber"><span style="font-weight: 500">Acc:</span> <span v-if="scope.row.dicomInfo.accNumber">
{{ scope.row.dicomInfo.accNumber }}</span> <span style="font-weight: 500">Acc:</span>
{{ scope.row.dicomInfo.accNumber }}
</span>
<span v-else style="color: #f44336">N/A</span> <span v-else style="color: #f44336">N/A</span>
</div> </div>
<div style="display: inline-block; margin-right: 2px"> <div style="display: inline-block; margin-right: 2px">
<span v-if="scope.row.dicomInfo.modality.length > 0"> <span
{{ scope.row.dicomInfo.modality.join('、') }},</span> v-if="scope.row.dicomInfo.modality.length > 0"
>{{ scope.row.dicomInfo.modality.join('、') }},</span>
<span v-else style="color: #f44336">N/A,</span> <span v-else style="color: #f44336">N/A,</span>
</div> </div>
<div style="display: inline-block; margin-right: 2px"> <div style="display: inline-block; margin-right: 2px">
@ -126,20 +197,15 @@
<div> <div>
<div style="display: inline-block; margin-right: 2px"> <div style="display: inline-block; margin-right: 2px">
<span v-if="scope.row.dicomInfo.bodyPart"> <span v-if="scope.row.dicomInfo.bodyPart">{{ scope.row.dicomInfo.bodyPart }},</span>
{{ scope.row.dicomInfo.bodyPart }},
</span>
<span v-else style="color: #f44336">N/A,</span> <span v-else style="color: #f44336">N/A,</span>
</div> </div>
<div style="display: inline-block"> <div style="display: inline-block">
<span v-if="scope.row.dicomInfo.description"> <span v-if="scope.row.dicomInfo.description">{{ scope.row.dicomInfo.description }}</span>
{{ scope.row.dicomInfo.description }}</span>
<span v-else style="color: #f44336">N/A</span> <span v-else style="color: #f44336">N/A</span>
</div> </div>
</div> </div>
<div> <div>{{ scope.row.dicomInfo.studyTime }}</div>
{{ scope.row.dicomInfo.studyTime }}
</div>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
@ -147,8 +213,10 @@
<template slot="header"> <template slot="header">
<el-tooltip placement="top"> <el-tooltip placement="top">
<div slot="content"> <div slot="content">
{{ $t('trials:uploadDicomList:table:pId') }}<br /> {{ $t('trials:uploadDicomList:table:pId') }}
{{ $t('trials:uploadDicomList:table:patientName') }}<br /> <br />
{{ $t('trials:uploadDicomList:table:patientName') }}
<br />
{{ $t('trials:uploadDicomList:table:pInfo') }} {{ $t('trials:uploadDicomList:table:pInfo') }}
</div> </div>
<span>{{ $t('trials:uploadDicomList:table:patientInfo') }}</span> <span>{{ $t('trials:uploadDicomList:table:patientInfo') }}</span>
@ -157,8 +225,11 @@
<template slot-scope="scope"> <template slot-scope="scope">
<div style="line-height: 15px"> <div style="line-height: 15px">
<div> <div>
<span v-if="scope.row.dicomInfo.patientId"><span style="font-weight: 500">PID: </span>{{ <span v-if="scope.row.dicomInfo.patientId">
scope.row.dicomInfo.patientId }}</span> <span style="font-weight: 500">PID:</span>
{{
scope.row.dicomInfo.patientId }}
</span>
<span v-else style="color: #f44336">N/A</span> <span v-else style="color: #f44336">N/A</span>
</div> </div>
<div> <div>
@ -187,9 +258,11 @@
}}, }},
</span> </span>
<span :class="[ <span
:class="[
scope.row.dicomInfo.patientBirthDate ? '' : 'colorOfRed', scope.row.dicomInfo.patientBirthDate ? '' : 'colorOfRed',
]"> ]"
>
{{ {{
scope.row.dicomInfo.patientBirthDate scope.row.dicomInfo.patientBirthDate
? scope.row.dicomInfo.patientBirthDate ? scope.row.dicomInfo.patientBirthDate
@ -200,14 +273,20 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('trials:uploadDicomList:table:failedFileCount')" min-width="150" <el-table-column
show-overflow-tooltip> :label="$t('trials:uploadDicomList:table:failedFileCount')"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-progress color="#409eff" :percentage="( <el-progress
color="#409eff"
:percentage="(
(scope.row.dicomInfo.uploadFileSize * 100) / (scope.row.dicomInfo.uploadFileSize * 100) /
(scope.row.dicomInfo.fileSize ? scope.row.dicomInfo.fileSize : 1) (scope.row.dicomInfo.fileSize ? scope.row.dicomInfo.fileSize : 1)
).toFixed(2) * 1 ).toFixed(2) * 1
" /> "
/>
<span> <span>
{{ $t('trials:uploadDicomList:table:uploadNow') {{ $t('trials:uploadDicomList:table:uploadNow')
}}{{ scope.row.dicomInfo.failedFileCount }}/{{ }}{{ scope.row.dicomInfo.failedFileCount }}/{{
@ -222,87 +301,128 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('trials:uploadDicomList:table:status')" min-width="140" show-overflow-tooltip> <el-table-column
:label="$t('trials:uploadDicomList:table:status')"
min-width="140"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if=" <span
v-if="
!scope.row.dicomInfo.failedFileCount && !scope.row.dicomInfo.failedFileCount &&
!scope.row.dicomInfo.isInit !scope.row.dicomInfo.isInit
"> "
{{ $t('trials:uploadDicomList:table:status1') }}</span> >{{ $t('trials:uploadDicomList:table:status1') }}</span>
<span style="color: #409eff" v-else-if=" <span
style="color: #409eff"
v-else-if="
!scope.row.dicomInfo.failedFileCount && !scope.row.dicomInfo.failedFileCount &&
scope.row.dicomInfo.isInit && scope.row.dicomInfo.isInit &&
btnLoading btnLoading
">{{ $t('trials:uploadDicomList:table:status2') }}</span> "
<span style="color: #409eff" v-else-if=" >{{ $t('trials:uploadDicomList:table:status2') }}</span>
<span
style="color: #409eff"
v-else-if="
scope.row.dicomInfo.failedFileCount < scope.row.dicomInfo.failedFileCount <
scope.row.dicomInfo.fileCount && !scope.row.uploadState.record scope.row.dicomInfo.fileCount && !scope.row.uploadState.record
">{{ $t('trials:uploadDicomList:table:status2') }}</span> "
<span style="color: #2cc368" v-else-if=" >{{ $t('trials:uploadDicomList:table:status2') }}</span>
<span
style="color: #2cc368"
v-else-if="
scope.row.dicomInfo.failedFileCount === scope.row.dicomInfo.failedFileCount ===
scope.row.dicomInfo.fileCount scope.row.dicomInfo.fileCount
">{{ $t('trials:uploadDicomList:table:status3') }}</span> "
<span style="color: #f66" v-else-if=" >{{ $t('trials:uploadDicomList:table:status3') }}</span>
<span
style="color: #f66"
v-else-if="
scope.row.uploadState.record && scope.row.uploadState.record &&
scope.row.uploadState.record.fileCount === 0 scope.row.uploadState.record.fileCount === 0
">{{ $t('trials:uploadDicomList:table:status5') }}</span> "
<span style="color: #f66" v-else>{{ >{{ $t('trials:uploadDicomList:table:status5') }}</span>
<span style="color: #f66" v-else>
{{
$t('trials:uploadDicomList:table:Failed') $t('trials:uploadDicomList:table:Failed')
}}</span> }}
</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('trials:uploadDicomList:table:record')" min-width="140" show-overflow-tooltip> <el-table-column
:label="$t('trials:uploadDicomList:table:record')"
min-width="140"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-tooltip placement="top" v-if="scope.row.uploadState.record"> <el-tooltip placement="top" v-if="scope.row.uploadState.record">
<div slot="content"> <div slot="content">
<div style="max-height: 500px; overflow-y: auto"> <div style="max-height: 500px; overflow-y: auto">
{{ $t('trials:uploadDicomList:table:Existed') }}: {{ $t('trials:uploadDicomList:table:Existed') }}:
<div v-if="scope.row.uploadState.record.Existed.length"> <div v-if="scope.row.uploadState.record.Existed.length">
<div v-for="item of scope.row.uploadState.record.Existed" :key="item" <div
style="font-size: 12px; color: #baa72a"> v-for="item of scope.row.uploadState.record.Existed"
{{ item }} :key="item"
</div> style="font-size: 12px; color: #baa72a"
>{{ item }}</div>
</div> </div>
<div v-else>&nbsp;</div> <div v-else>&nbsp;</div>
{{ $t('trials:uploadDicomList:table:Uploaded') }}: {{ $t('trials:uploadDicomList:table:Uploaded') }}:
<div v-if="scope.row.uploadState.record.Uploaded.length"> <div v-if="scope.row.uploadState.record.Uploaded.length">
<div v-for="item of scope.row.uploadState.record.Uploaded" :key="item" <div
style="font-size: 12px; color: #24b837"> v-for="item of scope.row.uploadState.record.Uploaded"
{{ item }} :key="item"
</div> style="font-size: 12px; color: #24b837"
>{{ item }}</div>
</div> </div>
<div v-else>&nbsp;</div> <div v-else>&nbsp;</div>
<br /> <br />
{{ $t('trials:uploadDicomList:table:Failed') }}: {{ $t('trials:uploadDicomList:table:Failed') }}:
<div v-if="scope.row.uploadState.record.Failed.length"> <div v-if="scope.row.uploadState.record.Failed.length">
<div v-for="item of scope.row.uploadState.record.Failed" :key="item" <div
style="font-size: 12px; color: #f66"> v-for="item of scope.row.uploadState.record.Failed"
{{ item }} :key="item"
</div> style="font-size: 12px; color: #f66"
>{{ item }}</div>
</div> </div>
<div v-else>&nbsp;</div> <div v-else>&nbsp;</div>
</div> </div>
</div> </div>
<el-button size="mini" style="cursor: pointer"> <el-button size="mini" style="cursor: pointer">
<span style="font-size: 12px; color: #baa72a">{{ <span style="font-size: 12px; color: #baa72a">
{{
scope.row.uploadState.record.Existed.length scope.row.uploadState.record.Existed.length
}}</span> }}
</span>
/ /
<span style="font-size: 12px; color: #24b837">{{ <span style="font-size: 12px; color: #24b837">
{{
scope.row.uploadState.record.Uploaded.length scope.row.uploadState.record.Uploaded.length
}}</span> }}
</span>
/ /
<span style="font-size: 12px; color: #f66">{{ <span style="font-size: 12px; color: #f66">
{{
scope.row.uploadState.record.Failed.length scope.row.uploadState.record.Failed.length
}}</span> }}
</span>
</el-button> </el-button>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<study-view v-if="model_cfg.visible" :model_cfg="model_cfg" :IsDicom="true" :bodyPart="bodyPart" <study-view
:subjectVisitId="openSubjectVisitId" :modelList="modelList" :isUpload="openIsUpload" v-if="model_cfg.visible"
:visitTaskId="openVisitTaskId" :TrialModality="TrialModality" @getList="getList" /> :model_cfg="model_cfg"
:IsDicom="true"
:bodyPart="bodyPart"
:subjectVisitId="openSubjectVisitId"
:modelList="modelList"
:isUpload="openIsUpload"
:visitTaskId="openVisitTaskId"
:TrialModality="TrialModality"
@getList="getList"
/>
</div> </div>
</template> </template>
<script> <script>
@ -374,7 +494,7 @@ export default {
IsImageSegment: { IsImageSegment: {
type: Boolean, type: Boolean,
default: false, default: false,
} },
}, },
components: { components: {
'study-view': studyView, 'study-view': studyView,
@ -456,8 +576,10 @@ export default {
} }
if (this.IsImageSegment) { if (this.IsImageSegment) {
params.IsImageSegmentLabel = true params.IsImageSegmentLabel = true
} } else if (
else if (this.Criterion.CriterionType == 19 || this.Criterion.CriterionType == 20) { this.Criterion.CriterionType == 19 ||
this.Criterion.CriterionType == 20
) {
params.IsImageSegmentLabel = false params.IsImageSegmentLabel = false
} }
this.loading = true this.loading = true
@ -544,7 +666,9 @@ export default {
this.openIsUpload = isUpload this.openIsUpload = isUpload
this.openSubjectVisitId = item.SubjectVisitId || item.SourceSubjectVisitId this.openSubjectVisitId = item.SubjectVisitId || item.SourceSubjectVisitId
this.openVisitTaskId = item.VisitTaskId this.openVisitTaskId = item.VisitTaskId
this.model_cfg.title = `${item.SubjectCode || ''} > ${this.IsImageSegment ? item.VisitName : item.TaskBlindName}` this.model_cfg.title = `${item.SubjectCode || ''} > ${
this.IsImageSegment ? item.VisitName : item.TaskBlindName
}`
this.modelList = item[list] this.modelList = item[list]
this.model_cfg.visible = true this.model_cfg.visible = true
}, },
@ -646,7 +770,10 @@ export default {
for (let i = 0; i < checkFiles.length; i++) { for (let i = 0; i < checkFiles.length; i++) {
let item = checkFiles[i] let item = checkFiles[i]
var dicom = await parseDicom(item, ['StudyInstanceUid', 'Modality']) var dicom = await parseDicom(item, ['StudyInstanceUid', 'Modality'])
if (!!~this.errStudyUidList.indexOf(dicom.StudyInstanceUid) || (this.IsImageSegment && dicom.Modality !== 'IVUS')) { if (
!!~this.errStudyUidList.indexOf(dicom.StudyInstanceUid) ||
(this.IsImageSegment && dicom.Modality !== 'IVUS')
) {
this.hasOtherStudy = true this.hasOtherStudy = true
checkFiles.splice(i, 1) checkFiles.splice(i, 1)
i-- i--
@ -713,7 +840,8 @@ export default {
var studyUid = data.string('x0020000d') var studyUid = data.string('x0020000d')
if (!studyUid) return resolve() if (!studyUid) return resolve()
var pixelDataElement = data.elements.x7fe00010 var pixelDataElement = data.elements.x7fe00010
if (!pixelDataElement && modality !== 'SR' && modality !== 'ECG') return resolve() if (!pixelDataElement && modality !== 'SR' && modality !== 'ECG')
return resolve()
var studyIndex = 0 var studyIndex = 0
while ( while (
studyIndex < scope.uploadQueues.length && studyIndex < scope.uploadQueues.length &&
@ -810,14 +938,38 @@ export default {
}, },
}) })
} }
if (!scope.uploadQueues[studyIndex].dicomInfo.RadionuclideTotalDose) { if (
!scope.uploadQueues[studyIndex].dicomInfo.RadionuclideTotalDose
) {
let dataset = dcmjs.data.DicomMessage.readFile(e.target.result) let dataset = dcmjs.data.DicomMessage.readFile(e.target.result)
let RadionuclideTotalDose = dataset.dict['00540016'].Value[0]['00181074'].Value[0] if (
let RadionuclideHalfLife = dataset.dict['00540016'].Value[0]['00181075'].Value[0] dataset.dict['00540016'] &&
let RadiopharmaceuticalStartTime = dataset.dict['00540016'].Value[0]['00181072'].Value[0] dataset.dict['00540016'].Value &&
scope.uploadQueues[studyIndex].dicomInfo.RadionuclideTotalDose = RadionuclideTotalDose dataset.dict['00540016'].Value[0]
scope.uploadQueues[studyIndex].dicomInfo.RadionuclideHalfLife = RadionuclideHalfLife ) {
scope.uploadQueues[studyIndex].dicomInfo.RadiopharmaceuticalStartTime = RadiopharmaceuticalStartTime let RadionuclideTotalDose = dataset.dict['00540016'].Value[0][
'00181074'
]
? dataset.dict['00540016'].Value[0]['00181074'].Value[0]
: null
let RadionuclideHalfLife = dataset.dict['00540016'].Value[0][
'00181075'
]
? dataset.dict['00540016'].Value[0]['00181075'].Value[0]
: null
let RadiopharmaceuticalStartTime = dataset.dict['00540016']
.Value[0]['00181072']
? dataset.dict['00540016'].Value[0]['00181072'].Value[0]
: null
scope.uploadQueues[studyIndex].dicomInfo.RadionuclideTotalDose =
RadionuclideTotalDose
scope.uploadQueues[studyIndex].dicomInfo.RadionuclideHalfLife =
RadionuclideHalfLife
scope.uploadQueues[
studyIndex
].dicomInfo.RadiopharmaceuticalStartTime =
RadiopharmaceuticalStartTime
}
} }
var modality = scope.uploadQueues[studyIndex].dicomInfo.modality var modality = scope.uploadQueues[studyIndex].dicomInfo.modality
var currentModality = data.string('x00080060') var currentModality = data.string('x00080060')
@ -886,8 +1038,9 @@ export default {
) )
seriesItem = { seriesItem = {
seriesUid: seriesUid, seriesUid: seriesUid,
RadiopharmaceuticalInformationSequence: data.string('x00540016') || "", RadiopharmaceuticalInformationSequence:
AcquisitionDate: data.string('x00080022') || "", data.string('x00540016') || '',
AcquisitionDate: data.string('x00080022') || '',
DicomSeriesDate: data.string('x00080021'), DicomSeriesDate: data.string('x00080021'),
DicomSeriesTime: data.string('x00080031'), DicomSeriesTime: data.string('x00080031'),
@ -1095,16 +1248,19 @@ export default {
var scope = this var scope = this
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
try { try {
let subjectVisitId = null; let subjectVisitId = null
if (scope.VisitTaskId) { if (scope.VisitTaskId) {
scope.StudyInstanceUidList.forEach(item => { scope.StudyInstanceUidList.forEach((item) => {
if (item.VisitTaskId === scope.VisitTaskId) { if (item.VisitTaskId === scope.VisitTaskId) {
subjectVisitId = item.SourceSubjectVisitId subjectVisitId = item.SourceSubjectVisitId
} }
}) })
} else { } else {
scope.StudyInstanceUidList.forEach(item => { scope.StudyInstanceUidList.forEach((item) => {
if (item.StudyInstanceUid === scope.uploadQueues[index].dicomInfo.studyUid) { if (
item.StudyInstanceUid ===
scope.uploadQueues[index].dicomInfo.studyUid
) {
subjectVisitId = item.SourceSubjectVisitId subjectVisitId = item.SourceSubjectVisitId
} }
}) })
@ -1156,7 +1312,8 @@ export default {
study: { study: {
RadionuclideTotalDose: dicomInfo.RadionuclideTotalDose, RadionuclideTotalDose: dicomInfo.RadionuclideTotalDose,
RadionuclideHalfLife: dicomInfo.RadionuclideHalfLife, RadionuclideHalfLife: dicomInfo.RadionuclideHalfLife,
RadiopharmaceuticalStartTime: dicomInfo.RadiopharmaceuticalStartTime, RadiopharmaceuticalStartTime:
dicomInfo.RadiopharmaceuticalStartTime,
studyId: dicomInfo.studyId, studyId: dicomInfo.studyId,
studyInstanceUid: dicomInfo.studyUid, studyInstanceUid: dicomInfo.studyUid,
@ -1211,8 +1368,10 @@ export default {
seriesInstanceUid: v.seriesUid, seriesInstanceUid: v.seriesUid,
SOPClassUID: o.SOPClassUID, SOPClassUID: o.SOPClassUID,
TransferSytaxUID: o.TransferSytaxUID, TransferSytaxUID: o.TransferSytaxUID,
MediaStorageSOPInstanceUID: o.MediaStorageSOPInstanceUID, MediaStorageSOPInstanceUID:
MediaStorageSOPClassUID: o.MediaStorageSOPClassUID, o.MediaStorageSOPInstanceUID,
MediaStorageSOPClassUID:
o.MediaStorageSOPClassUID,
sopInstanceUid: o.instanceUid, sopInstanceUid: o.instanceUid,
instanceNumber: o.instanceNumber, instanceNumber: o.instanceNumber,
instanceTime: o.instanceTime, instanceTime: o.instanceTime,
@ -1229,14 +1388,17 @@ export default {
path: o.myPath, path: o.myPath,
FileSize: o.FileSize, FileSize: o.FileSize,
PhotometricInterpretation: o.PhotometricInterpretation, PhotometricInterpretation:
o.PhotometricInterpretation,
BitsAllocated: o.BitsAllocated, BitsAllocated: o.BitsAllocated,
PixelRepresentation: o.PixelRepresentation, PixelRepresentation: o.PixelRepresentation,
RescaleIntercept: o.RescaleIntercept, RescaleIntercept: o.RescaleIntercept,
RescaleSlope: o.RescaleSlope, RescaleSlope: o.RescaleSlope,
ImagePositionPatient: o.ImagePositionPatient, ImagePositionPatient: o.ImagePositionPatient,
ImageOrientationPatient: o.ImageOrientationPatient, ImageOrientationPatient:
SequenceOfUltrasoundRegions: o.SequenceOfUltrasoundRegions, o.ImageOrientationPatient,
SequenceOfUltrasoundRegions:
o.SequenceOfUltrasoundRegions,
FrameTime: o.FrameTime, FrameTime: o.FrameTime,
CorrectedImage: o.CorrectedImage, CorrectedImage: o.CorrectedImage,
Units: o.Units, Units: o.Units,
@ -1247,8 +1409,10 @@ export default {
dicomInfo.failedFileCount++ dicomInfo.failedFileCount++
Record.FileCount++ Record.FileCount++
} else { } else {
let path = `/${params.trialId}/Image/${params.subjectId let path = `/${params.trialId}/Image/${
}/${params.subjectVisitId}/${dicomInfo.visitTaskId params.subjectId
}/${params.subjectVisitId}/${
dicomInfo.visitTaskId
}/${scope.getGuid( }/${scope.getGuid(
dicomInfo.studyUid + dicomInfo.studyUid +
v.seriesUid + v.seriesUid +
@ -1256,8 +1420,10 @@ export default {
params.trialId params.trialId
)}` )}`
if (scope.IsImageSegment) { if (scope.IsImageSegment) {
path = `/${params.trialId}/Image/${params.subjectId path = `/${params.trialId}/Image/${
}/${params.subjectVisitId}/AnnotationImage/${dicomInfo.visitTaskId params.subjectId
}/${params.subjectVisitId}/AnnotationImage/${
dicomInfo.visitTaskId
}/${scope.getGuid( }/${scope.getGuid(
dicomInfo.studyUid + dicomInfo.studyUid +
v.seriesUid + v.seriesUid +
@ -1290,7 +1456,7 @@ export default {
batchDataType: 5, batchDataType: 5,
trialId: params.trialId, trialId: params.trialId,
subjectId: params.subjectId, subjectId: params.subjectId,
subjectVisitId: params.subjectVisitId subjectVisitId: params.subjectVisitId,
} }
) )
if (!res || !res.url) { if (!res || !res.url) {
@ -1323,7 +1489,7 @@ export default {
batchDataType: 6, batchDataType: 6,
trialId: params.trialId, trialId: params.trialId,
subjectId: params.subjectId, subjectId: params.subjectId,
subjectVisitId: params.subjectVisitId subjectVisitId: params.subjectVisitId,
} }
) )
if (seriesRes && seriesRes.url) { if (seriesRes && seriesRes.url) {
@ -1343,8 +1509,10 @@ export default {
sopInstanceUid: o.instanceUid, sopInstanceUid: o.instanceUid,
SOPClassUID: o.SOPClassUID, SOPClassUID: o.SOPClassUID,
TransferSytaxUID: o.TransferSytaxUID, TransferSytaxUID: o.TransferSytaxUID,
MediaStorageSOPInstanceUID: o.MediaStorageSOPInstanceUID, MediaStorageSOPInstanceUID:
MediaStorageSOPClassUID: o.MediaStorageSOPClassUID, o.MediaStorageSOPInstanceUID,
MediaStorageSOPClassUID:
o.MediaStorageSOPClassUID,
instanceNumber: o.instanceNumber, instanceNumber: o.instanceNumber,
instanceTime: o.instanceTime, instanceTime: o.instanceTime,
imageRows: o.imageRows, imageRows: o.imageRows,
@ -1360,14 +1528,17 @@ export default {
path: scope.$getObjectName(res.url), path: scope.$getObjectName(res.url),
FileSize: o.FileSize, FileSize: o.FileSize,
PhotometricInterpretation: o.PhotometricInterpretation, PhotometricInterpretation:
o.PhotometricInterpretation,
BitsAllocated: o.BitsAllocated, BitsAllocated: o.BitsAllocated,
PixelRepresentation: o.PixelRepresentation, PixelRepresentation: o.PixelRepresentation,
RescaleIntercept: o.RescaleIntercept, RescaleIntercept: o.RescaleIntercept,
RescaleSlope: o.RescaleSlope, RescaleSlope: o.RescaleSlope,
ImagePositionPatient: o.ImagePositionPatient, ImagePositionPatient: o.ImagePositionPatient,
ImageOrientationPatient: o.ImageOrientationPatient, ImageOrientationPatient:
SequenceOfUltrasoundRegions: o.SequenceOfUltrasoundRegions, o.ImageOrientationPatient,
SequenceOfUltrasoundRegions:
o.SequenceOfUltrasoundRegions,
FrameTime: o.FrameTime, FrameTime: o.FrameTime,
CorrectedImage: o.CorrectedImage, CorrectedImage: o.CorrectedImage,
Units: o.Units, Units: o.Units,
@ -1422,7 +1593,8 @@ export default {
instanceList: instanceList, instanceList: instanceList,
ImageResizePath: ImageResizePath, ImageResizePath: ImageResizePath,
RadiopharmaceuticalInformationSequence: v.RadiopharmaceuticalInformationSequence, RadiopharmaceuticalInformationSequence:
v.RadiopharmaceuticalInformationSequence,
AcquisitionDate: v.AcquisitionDate, AcquisitionDate: v.AcquisitionDate,
}) })
} }
@ -1465,10 +1637,7 @@ export default {
} }
let OSSclient = scope.OSSclient let OSSclient = scope.OSSclient
try { try {
let seriesRes = await OSSclient.put( let seriesRes = await OSSclient.put(thumbnailPath, blob, {
thumbnailPath,
blob,
{
fileName: `${v.seriesUid}.jpg`, fileName: `${v.seriesUid}.jpg`,
fileSize: blob.size, fileSize: blob.size,
fileType: 'image/jpeg', fileType: 'image/jpeg',
@ -1476,9 +1645,8 @@ export default {
batchDataType: 6, batchDataType: 6,
trialId: params.trialId, trialId: params.trialId,
subjectId: params.subjectId, subjectId: params.subjectId,
subjectVisitId: params.subjectVisitId subjectVisitId: params.subjectVisitId,
} })
)
if (seriesRes && seriesRes.url) { if (seriesRes && seriesRes.url) {
o.ImageResizePath = scope.$getObjectName(seriesRes.url) o.ImageResizePath = scope.$getObjectName(seriesRes.url)
} }
@ -1591,7 +1759,11 @@ export default {
var token = getToken() var token = getToken()
let trialId = this.$route.query.trialId let trialId = this.$route.query.trialId
const routeData = this.$router.resolve({ const routeData = this.$router.resolve({
path: `/showvisitdicoms?page=upload&trialId=${trialId}&visitTaskId=${this.IsImageSegment ? 'undefined' : row.VisitTaskId}&subjectVisitId=${row.SourceSubjectVisitId}&isReading=1&TokenKey=${token}`, path: `/showvisitdicoms?page=upload&trialId=${trialId}&visitTaskId=${
this.IsImageSegment ? 'undefined' : row.VisitTaskId
}&subjectVisitId=${
row.SourceSubjectVisitId
}&isReading=1&TokenKey=${token}`,
}) })
this.open = window.open(routeData.href, '_blank') this.open = window.open(routeData.href, '_blank')
}, },

View File

@ -8,25 +8,48 @@
<!-- 跳过 --> <!-- 跳过 -->
{{ $t('trials:readingReport:button:skip') }} {{ $t('trials:readingReport:button:skip') }}
</el-button> </el-button>
<el-button v-if="readingTaskState < 2" type="primary" size="small" @click="getReportInfo">{{ <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('trials:readingReport:button:refresh') }}
$t('common:button:save') }}</el-button> </el-button>
<el-button v-if="readingTaskState < 2" type="primary" size="small" @click="handleConfirm">{{ <el-button
$t('common:button:submit') }}</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> </div>
<div style="flex: 1"> <div style="flex: 1">
<el-table v-if="taskQuestions.length > 0" ref="reportList" v-adaptive="{ bottomOffset: 0 }" <el-table
:data="taskQuestions" row-key="Id" border default-expand-all height="100" v-if="taskQuestions.length > 0"
:tree-props="{ children: 'Childrens', hasChildren: 'hasChildren' }" size="mini"> ref="reportList"
<el-table-column prop="" label="" show-overflow-tooltip width="350px"> v-adaptive="{ bottomOffset: 0 }"
:data="taskQuestions"
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"> <template slot-scope="scope">
<span v-if="scope.row.QuestionName">{{ scope.row.BlindName ? scope.row.QuestionName : <span v-if="scope.row.QuestionName">
{{ scope.row.BlindName ? scope.row.QuestionName :
scope.row.QuestionName }} scope.row.QuestionName }}
<svg-icon <svg-icon
v-if="scope.row.ShowChartTypeEnum > 0 || (scope.row.LesionType === 0 && scope.row.ReportLayType === 1)" v-if="scope.row.ShowChartTypeEnum > 0 || (scope.row.LesionType === 0 && scope.row.ReportLayType === 1)"
icon-class="readingChart" class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({ icon-class="readingChart"
class="svg-icon svg-readingChart-mini"
@click.stop="(e) => handleReadingChart({
e, e,
data: { data: {
QuestionId: scope.row.RowIndex ? null : scope.row.QuestionId, QuestionId: scope.row.RowIndex ? null : scope.row.QuestionId,
@ -35,19 +58,24 @@
ReportChartTypeEnum: scope.row.LesionType === 0 && scope.row.ReportLayType === 1 ? 0 : null, ReportChartTypeEnum: scope.row.LesionType === 0 && scope.row.ReportLayType === 1 ? 0 : null,
QuestionName: scope.row.QuestionName QuestionName: scope.row.QuestionName
} }
})" /> })"
</span> />
<span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">
{{ scope.row.GroupName }}
</span> </span>
<span
v-else
style="font-weight: bold;font-size: 16px;color: #f44336;"
>{{ scope.row.GroupName }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-for="task in visitTaskList" :key="task.VisitTaskId" prop="date" show-overflow-tooltip <el-table-column
width="200px"> v-for="task in visitTaskList"
:key="task.VisitTaskId"
prop="date"
show-overflow-tooltip
width="200px"
>
<template slot="header"> <template slot="header">
<div v-if="task.IsCurrentTask"> <div v-if="task.IsCurrentTask">{{ task.BlindName }}</div>
{{ task.BlindName }}
</div>
<div v-else> <div v-else>
<div> <div>
{{ task.BlindName }} {{ task.BlindName }}
@ -59,37 +87,49 @@
</template> </template>
<template slot-scope="scope"> <template slot-scope="scope">
<template <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')"> 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')"
>
<!-- 输入框 --> <!-- 输入框 -->
<div> <div>
<template <template
v-if="!((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)" /> v-if="!((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
/>
<el-input <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-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]" v-model="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]"
size="mini" /> size="mini"
/>
<span <span
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && (scope.row.Type === 'input' || scope.row.Type === 'textarea')"> 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] }} >{{ questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId] }}</span>
</span>
<el-input <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-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" /> v-model="questionForm[scope.row.QuestionId]"
<span v-else-if="scope.row.Type === 'input' || scope.row.Type === 'textarea'"> size="mini"
{{ questionForm[scope.row.QuestionId] }} />
</span> <span
v-else-if="scope.row.Type === 'input' || scope.row.Type === 'textarea'"
>{{ questionForm[scope.row.QuestionId] }}</span>
<el-select <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-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]" v-model="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]"
size="mini" clearable :multiple="scope.row.OptionTypeEnum === 1"> size="mini"
clearable
:multiple="scope.row.OptionTypeEnum === 1"
>
<template> <template>
<el-option v-for="val in scope.row.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in scope.row.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<span <span
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && questionForm[scope.row.QuestionId][scope.row.xfIndex] && (scope.row.Type === 'select' || scope.row.Type === 'radio')"> v-else-if="questionForm[scope.row.QuestionId] instanceof Array && questionForm[scope.row.QuestionId][scope.row.xfIndex] && (scope.row.Type === 'select' || scope.row.Type === 'radio')"
>
{{ {{
Array.isArray(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]) Array.isArray(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId])
? ?
questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId].join(',') : questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId].join(',') :
@ -98,10 +138,18 @@
</span> </span>
<el-select <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-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 v-model="questionForm[scope.row.QuestionId]"
:multiple="scope.row.OptionTypeEnum === 1"> size="mini"
clearable
:multiple="scope.row.OptionTypeEnum === 1"
>
<template> <template>
<el-option v-for="val in scope.row.TypeValue.split('|')" :key="val" :label="val" :value="val" /> <el-option
v-for="val in scope.row.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template> </template>
</el-select> </el-select>
<span v-else-if="scope.row.Type === 'select' || scope.row.Type === 'radio'"> <span v-else-if="scope.row.Type === 'select' || scope.row.Type === 'radio'">
@ -114,16 +162,23 @@
<el-input <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-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]" v-model="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]"
:disabled="scope.row.DataSource === 1" size="mini" :disabled="scope.row.DataSource === 1"
size="mini"
@blur="limitBlur(questionForm[scope.row.QuestionId][scope.row.xfIndex], scope.row.TableQuestionId, scope.row.ValueType)" @blur="limitBlur(questionForm[scope.row.QuestionId][scope.row.xfIndex], scope.row.TableQuestionId, scope.row.ValueType)"
@focus="() => { questionId = scope.row.QuestionId }"> @focus="() => { questionId = scope.row.QuestionId }"
<template v-if="scope.row.Unit !== 0" slot="append">{{ scope.row.Unit !== 4 ? $fd('ValueUnit', >
scope.row.Unit) : scope.row.CustomUnit }}</template> <template v-if="scope.row.Unit !== 0" slot="append">
{{ scope.row.Unit !== 4 ? $fd('ValueUnit',
scope.row.Unit) : scope.row.CustomUnit }}
</template>
<template v-else-if="scope.row.ValueType === 2" slot="append">%</template> <template v-else-if="scope.row.ValueType === 2" slot="append">%</template>
</el-input> </el-input>
<span <span
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && scope.row.Type === 'number' && (scope.row.xfIndex || scope.row.xfIndex === 0)"> 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"> >
<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])) isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]))
? ?
@ -150,15 +205,22 @@
</span> </span>
<el-input <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-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" size="mini" v-model="questionForm[scope.row.QuestionId]"
:disabled="scope.row.DataSource === 1"
size="mini"
@blur="limitBlur(questionForm, scope.row.QuestionId, scope.row.ValueType)" @blur="limitBlur(questionForm, scope.row.QuestionId, scope.row.ValueType)"
@focus="() => { questionId = scope.row.QuestionId }"> @focus="() => { questionId = scope.row.QuestionId }"
<template v-if="scope.row.Unit !== 0" slot="append">{{ scope.row.Unit !== 4 ? $fd('ValueUnit', >
scope.row.Unit) : scope.row.CustomUnit }}</template> <template v-if="scope.row.Unit !== 0" slot="append">
{{ scope.row.Unit !== 4 ? $fd('ValueUnit',
scope.row.Unit) : scope.row.CustomUnit }}
</template>
<template v-else-if="scope.row.ValueType === 2" slot="append">%</template> <template v-else-if="scope.row.ValueType === 2" slot="append">%</template>
</el-input> </el-input>
<span v-else-if="scope.row.Type === 'number'"> <span v-else-if="scope.row.Type === 'number'">
<template v-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit"> <template
v-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit"
>
{{ isNaN(parseInt(questionForm[scope.row.QuestionId])) ? {{ isNaN(parseInt(questionForm[scope.row.QuestionId])) ?
questionForm[scope.row.QuestionId] : `${questionForm[scope.row.QuestionId]} ${scope.row.Unit !== 4 questionForm[scope.row.QuestionId] : `${questionForm[scope.row.QuestionId]} ${scope.row.Unit !== 4
? ?
@ -175,12 +237,19 @@
</span> </span>
</div> </div>
</template> </template>
<template v-else-if="scope.row.Type === 'upload' && scope.row.Answers[task.VisitTaskId]"> <template
<span v-for="(url, index) in scope.row.Answers[task.VisitTaskId].split('|')" :key="url" v-else-if="scope.row.Type === 'upload' && scope.row.Answers[task.VisitTaskId]"
style="margin-left: 5px;"> >
<el-button v-if="scope.row.Answers[task.VisitTaskId]" type="text" @click="preview(url)"> <span
{{ `${$t('trials:noneDicom:title:attachment')}${index + 1}` }} v-for="(url, index) in scope.row.Answers[task.VisitTaskId].split('|')"
</el-button> :key="url"
style="margin-left: 5px;"
>
<el-button
v-if="scope.row.Answers[task.VisitTaskId]"
type="text"
@click="preview(url)"
>{{ `${$t('trials:noneDicom:title:attachment')}${index + 1}` }}</el-button>
</span> </span>
</template> </template>
<template v-else-if="scope.row.DictionaryCode"> <template v-else-if="scope.row.DictionaryCode">
@ -196,8 +265,11 @@
}} }}
</template> </template>
<template <template
v-else-if="!((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)" /> v-else-if="!((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
<template v-else-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit"> />
<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] : isNaN(parseInt(scope.row.Answers[task.VisitTaskId])) ? scope.row.Answers[task.VisitTaskId] :
`${scope.row.Answers[task.VisitTaskId]} `${scope.row.Answers[task.VisitTaskId]}
@ -207,9 +279,9 @@
{{ isNaN(parseInt(scope.row.Answers[task.VisitTaskId])) ? {{ isNaN(parseInt(scope.row.Answers[task.VisitTaskId])) ?
scope.row.Answers[task.VisitTaskId] : `${scope.row.Answers[task.VisitTaskId]} %` }} scope.row.Answers[task.VisitTaskId] : `${scope.row.Answers[task.VisitTaskId]} %` }}
</template> </template>
<template v-else-if="scope.row.Answers && scope.row.Answers.hasOwnProperty(task.VisitTaskId)"> <template
{{ scope.row.Answers[task.VisitTaskId] }} v-else-if="scope.row.Answers && scope.row.Answers.hasOwnProperty(task.VisitTaskId)"
</template> >{{ scope.row.Answers[task.VisitTaskId] }}</template>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -217,33 +289,49 @@
</el-card> </el-card>
<!-- 签名框 --> <!-- 签名框 -->
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px" <el-dialog
custom-class="base-dialog-wrapper"> v-if="signVisible"
:visible.sync="signVisible"
:close-on-click-modal="false"
width="600px"
custom-class="base-dialog-wrapper"
>
<div slot="title"> <div slot="title">
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span> <span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span>
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${currentUser})` }}</span> <span
style="font-size:12px;margin-left:5px"
>{{ `(${$t('common:label:sign')}${currentUser})` }}</span>
</div> </div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" /> <SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog> </el-dialog>
<!-- 预览文件 --> <!-- 预览文件 -->
<viewer ref="picture_perview_customizeReportPage" style="margin: 0 10px" <viewer
ref="picture_perview_customizeReportPage"
style="margin: 0 10px"
v-if="currentType && ['png', 'jpg', 'jpeg'].includes(currentType.toLowerCase())" v-if="currentType && ['png', 'jpg', 'jpeg'].includes(currentType.toLowerCase())"
:images="[`${OSSclientConfig.basePath}${currentPath}`]" :options="viewerOptions"> :images="[`${OSSclientConfig.basePath}${currentPath}`]"
:options="viewerOptions"
>
<img v-show="false" :src="`${OSSclientConfig.basePath}${currentPath}`" alt="Image" /> <img v-show="false" :src="`${OSSclientConfig.basePath}${currentPath}`" alt="Image" />
</viewer> </viewer>
<readingChart ref="readingChart_report" /> <readingChart ref="readingChart_report" />
</div> </div>
</template> </template>
<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 { 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 { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import { openWindow } from "@/utils/splitScreen"; import { openWindow } from '@/utils/splitScreen'
import readingChart from '@/components/readingChart' import readingChart from '@/components/readingChart'
export default { export default {
name: 'CustomizeReportPage', name: 'CustomizeReportPage',
@ -275,7 +363,6 @@ export default {
currentPath: '', currentPath: '',
currentType: '', currentType: '',
viewerOptions: { viewerOptions: {
toolbar: { toolbar: {
zoomIn: true, zoomIn: true,
@ -287,8 +374,8 @@ export default {
rotateRight: true, rotateRight: true,
flipHorizontal: true, flipHorizontal: true,
flipVertical: true, flipVertical: true,
} },
} },
} }
}, },
watch: { watch: {
@ -298,11 +385,10 @@ export default {
handler(v, oldv) { handler(v, oldv) {
try { try {
if (!v[this.questionId] || !oldv[this.questionId]) return if (!v[this.questionId] || !oldv[this.questionId]) return
} catch (e) { } catch (e) {}
}
this.formItemNumberChange(this.questionId, false) this.formItemNumberChange(this.questionId, false)
} },
} },
}, },
async mounted() { async mounted() {
this.taskInfo = JSON.parse(sessionStorage.getItem('taskInfo')) this.taskInfo = JSON.parse(sessionStorage.getItem('taskInfo'))
@ -318,7 +404,7 @@ export default {
}) })
await this.getQuestionCalculateRelation() await this.getQuestionCalculateRelation()
this.getReportInfo() this.getReportInfo()
document.addEventListener("click", this.foo); document.addEventListener('click', this.foo)
}, },
methods: { methods: {
handleReadingChart(row) { handleReadingChart(row) {
@ -359,7 +445,7 @@ export default {
} }
}, },
getTagterAnswers(list, questionId) { getTagterAnswers(list, questionId) {
list.forEach(v => { list.forEach((v) => {
if (v.QuestionId === questionId) { if (v.QuestionId === questionId) {
return Object.assign({}, v.Answers) return Object.assign({}, v.Answers)
} else if (v.Childrens.length > 0) { } else if (v.Childrens.length > 0) {
@ -370,7 +456,7 @@ export default {
formItemNumberChange(questionId, isTable) { formItemNumberChange(questionId, isTable) {
if (isTable) { if (isTable) {
this.CalculationList.forEach((v, i) => { this.CalculationList.forEach((v, i) => {
var find = v.CalculateQuestionList.filter(o => { var find = v.CalculateQuestionList.filter((o) => {
return o.QuestionId === questionId return o.QuestionId === questionId
}) })
// findnumber // findnumber
@ -383,8 +469,8 @@ export default {
} }
}) })
} else { } else {
this.CalculationList.forEach(v => { this.CalculationList.forEach((v) => {
var find = v.CalculateQuestionList.filter(o => { var find = v.CalculateQuestionList.filter((o) => {
return o.TableQuestionId === questionId return o.TableQuestionId === questionId
}) })
// findnumber // findnumber
@ -415,9 +501,26 @@ export default {
}, },
InitVisitTaskQuestionForm() { InitVisitTaskQuestionForm() {
this.taskQuestions.map((v, i) => { this.taskQuestions.map((v, i) => {
if (v.Type === 'group' && v.Childrens.length === 0 && v.Type !== 'table' && v.Type !== 'basicTable') return if (
if (!v.IsPage && v.Type !== 'group' && v.Type !== 'summary' && v.Type !== 'table' && v.Type !== 'basicTable' && v.Type !== 'number') { v.Type === 'group' &&
this.$set(this.questionForm, v.QuestionId, v.Answers[this.visitTaskId]) v.Childrens.length === 0 &&
v.Type !== 'table' &&
v.Type !== 'basicTable'
)
return
if (
!v.IsPage &&
v.Type !== 'group' &&
v.Type !== 'summary' &&
v.Type !== 'table' &&
v.Type !== 'basicTable' &&
v.Type !== 'number'
) {
this.$set(
this.questionForm,
v.QuestionId,
v.Answers[this.visitTaskId]
)
} }
if (v.Type === 'table' || v.Type === 'basicTable') { if (v.Type === 'table' || v.Type === 'basicTable') {
var tableAnswers = this.getTableAnswers(v.QuestionId, v.Childrens, i) var tableAnswers = this.getTableAnswers(v.QuestionId, v.Childrens, i)
@ -427,11 +530,16 @@ export default {
if (v.Type === 'number') { if (v.Type === 'number') {
let val = null let val = null
if (v.ValueType === 0) { if (v.ValueType === 0) {
val = isNaN(parseFloat(v.Answers[this.visitTaskId])) ? v.Answers[this.visitTaskId] : parseInt(v.Answers[this.visitTaskId]) val = isNaN(parseFloat(v.Answers[this.visitTaskId]))
? v.Answers[this.visitTaskId]
: parseInt(v.Answers[this.visitTaskId])
} else if (v.ValueType === 3) { } else if (v.ValueType === 3) {
val = v.Answers[this.visitTaskId] val = v.Answers[this.visitTaskId]
} else { } else {
val = v.Answers[this.visitTaskId] === '' ? null : v.Answers[this.visitTaskId] val =
v.Answers[this.visitTaskId] === ''
? null
: v.Answers[this.visitTaskId]
} }
this.$set(this.questionForm, v.QuestionId, val) this.$set(this.questionForm, v.QuestionId, val)
} }
@ -443,41 +551,66 @@ export default {
}, },
setChild(obj) { setChild(obj) {
obj.forEach((i, index) => { obj.forEach((i, index) => {
if (i.Type !== 'group' && i.Type !== 'summary' && i.Id && i.Type !== 'table' && i.Type !== 'basicTable') { if (
this.$set(this.questionForm, i.QuestionId, i.Answers[this.visitTaskId]) i.Type !== 'group' &&
i.Type !== 'summary' &&
i.Id &&
i.Type !== 'table' &&
i.Type !== 'basicTable'
) {
this.$set(
this.questionForm,
i.QuestionId,
i.Answers[this.visitTaskId]
)
} }
if (i.Type === 'table' || i.Type === 'basicTable') { if (i.Type === 'table' || i.Type === 'basicTable') {
var tableAnswers = this.getTableAnswers(i.QuestionId, i.Childrens, index) var tableAnswers = this.getTableAnswers(
i.QuestionId,
i.Childrens,
index
)
this.$set(this.questionForm, i.QuestionId, tableAnswers) this.$set(this.questionForm, i.QuestionId, tableAnswers)
} }
if (i.Type === 'number') { if (i.Type === 'number') {
let val = null let val = null
if (i.ValueType === 0) { if (i.ValueType === 0) {
val = isNaN(parseFloat(i.Answers[this.visitTaskId])) ? i.Answers[this.visitTaskId] : parseInt(i.Answers[this.visitTaskId]) val = isNaN(parseFloat(i.Answers[this.visitTaskId]))
? i.Answers[this.visitTaskId]
: parseInt(i.Answers[this.visitTaskId])
} else if (i.ValueType === 3) { } else if (i.ValueType === 3) {
val = i.Answers[this.visitTaskId] val = i.Answers[this.visitTaskId]
} else { } else {
val = i.Answers[this.visitTaskId] === '' ? null : i.Answers[this.visitTaskId] val =
i.Answers[this.visitTaskId] === ''
? null
: i.Answers[this.visitTaskId]
} }
this.$set(this.questionForm, i.QuestionId, val) this.$set(this.questionForm, i.QuestionId, val)
} }
if (i.Childrens && i.Childrens.length > 0 && i.Type !== 'table' && i.Type !== 'basicTable') { if (
i.Childrens &&
i.Childrens.length > 0 &&
i.Type !== 'table' &&
i.Type !== 'basicTable'
) {
this.setChild(i.Childrens) this.setChild(i.Childrens)
} }
}) })
}, },
getQuestionCalculateRelation() { getQuestionCalculateRelation() {
return new Promise(resolve => { return new Promise((resolve) => {
getQuestionCalculateRelation({ getQuestionCalculateRelation({
TrialReadingCriterionId: this.TrialReadingCriterionId TrialReadingCriterionId: this.TrialReadingCriterionId,
}).then(res => { }).then((res) => {
this.CalculationList = res.Result this.CalculationList = res.Result
resolve() resolve()
}) })
}) })
}, },
logic(rules, num = 0) { logic(rules, num = 0) {
let isNE = false, isNAN = false let isNE = false,
isNAN = false
try { try {
if (rules.CalculateQuestionList.length === 0) { if (rules.CalculateQuestionList.length === 0) {
return false return false
@ -511,9 +644,13 @@ export default {
this.questionForm[o.QuestionId].forEach((q, qi) => { this.questionForm[o.QuestionId].forEach((q, qi) => {
if (!isNaN(parseFloat(q[o.TableQuestionId]))) { if (!isNaN(parseFloat(q[o.TableQuestionId]))) {
if (qi === 0) { if (qi === 0) {
num = isNaN(parseFloat(q[o.TableQuestionId])) ? null : parseFloat(q[o.TableQuestionId]) num = isNaN(parseFloat(q[o.TableQuestionId]))
? null
: parseFloat(q[o.TableQuestionId])
} else { } else {
num += isNaN(parseFloat(q[o.TableQuestionId])) ? null : parseFloat(q[o.TableQuestionId]) num += isNaN(parseFloat(q[o.TableQuestionId]))
? null
: parseFloat(q[o.TableQuestionId])
} }
} else { } else {
isNAN = true isNAN = true
@ -538,11 +675,14 @@ export default {
isNE = true isNE = true
} }
}) })
num = this.questionForm[o.QuestionId].length === 0 ? 0 : num / this.questionForm[o.QuestionId].length num =
this.questionForm[o.QuestionId].length === 0
? 0
: num / this.questionForm[o.QuestionId].length
break break
case 8: case 8:
const arr = [] const arr = []
this.questionForm[o.QuestionId].forEach(q => { this.questionForm[o.QuestionId].forEach((q) => {
if (!isNaN(parseFloat(q[o.TableQuestionId]))) { if (!isNaN(parseFloat(q[o.TableQuestionId]))) {
arr.push(q[o.TableQuestionId]) arr.push(q[o.TableQuestionId])
} else { } else {
@ -557,7 +697,7 @@ export default {
break break
case 9: case 9:
const arr1 = [] const arr1 = []
this.questionForm[o.QuestionId].forEach(q => { this.questionForm[o.QuestionId].forEach((q) => {
if (!isNaN(parseFloat(q[o.TableQuestionId]))) { if (!isNaN(parseFloat(q[o.TableQuestionId]))) {
arr.push(q[o.TableQuestionId]) arr.push(q[o.TableQuestionId])
} else { } else {
@ -568,15 +708,16 @@ export default {
} }
}) })
num = arr1.length === 0 ? 0 : Math.min(...arr1) num = arr1.length === 0 ? 0 : Math.min(...arr1)
break; break
case 15: case 15:
if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) { if (
!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))
) {
num = Math.abs(this.questionForm[o.TableQuestionId]) num = Math.abs(this.questionForm[o.TableQuestionId])
} } else {
else {
isNAN = true isNAN = true
} }
break; break
} }
} else { } else {
if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) { if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) {
@ -584,7 +725,6 @@ export default {
} else { } else {
isNAN = true isNAN = true
} }
} }
} else { } else {
switch (rules.CustomCalculateMark) { switch (rules.CustomCalculateMark) {
@ -627,47 +767,60 @@ export default {
} else { } else {
isNAN = true isNAN = true
} }
num = dataArr.length === 0 ? 0 : dataArr.reduce((acc, curr) => { num =
return acc + (typeof curr === "number" ? curr : 0); dataArr.length === 0
}, 0) / dataArr.length; ? 0
break; : dataArr.reduce((acc, curr) => {
return acc + (typeof curr === 'number' ? curr : 0)
}, 0) / dataArr.length
break
case 11: case 11:
if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) { if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) {
dataArr.push(parseFloat(this.questionForm[o.TableQuestionId])) dataArr.push(parseFloat(this.questionForm[o.TableQuestionId]))
} else { } else {
isNAN = true isNAN = true
} }
num = Math.max(...dataArr); num = Math.max(...dataArr)
break; break
case 12: case 12:
if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) { if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) {
dataArr.push(parseFloat(this.questionForm[o.TableQuestionId])) dataArr.push(parseFloat(this.questionForm[o.TableQuestionId]))
} else { } else {
isNAN = true isNAN = true
} }
num = Math.min(...dataArr); num = Math.min(...dataArr)
break; break
case 13: case 13:
if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) { if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) {
dataArr.push(parseFloat(this.questionForm[o.TableQuestionId])) dataArr.push(parseFloat(this.questionForm[o.TableQuestionId]))
} else { } else {
isNAN = true isNAN = true
} }
num = dataArr.length === 0 ? 0 : dataArr.reduce((acc, curr) => acc && curr) ? 1 : 0 num =
break; dataArr.length === 0
? 0
: dataArr.reduce((acc, curr) => acc && curr)
? 1
: 0
break
case 14: case 14:
if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) { if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) {
dataArr.push(parseFloat(this.questionForm[o.TableQuestionId])) dataArr.push(parseFloat(this.questionForm[o.TableQuestionId]))
} else { } else {
isNAN = true isNAN = true
} }
num = dataArr.length === 0 ? 0 : dataArr.reduce((acc, curr) => acc || curr, 0) ? 1 : 0; num =
break; dataArr.length === 0
? 0
: dataArr.reduce((acc, curr) => acc || curr, 0)
? 1
: 0
break
case 15: case 15:
if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) { if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) {
num = Math.abs(this.questionForm[o.TableQuestionId]) num = Math.abs(this.questionForm[o.TableQuestionId])
} }
break; break
} }
} }
}) })
@ -683,28 +836,36 @@ export default {
if (rules.ValueType === 2) { if (rules.ValueType === 2) {
num = num * 100 num = num * 100
} }
return isNaN(num) ? '' : isFinite(num) ? num.toFixed(this.digitPlaces) : '∞' return isNaN(num)
? ''
: isFinite(num)
? num.toFixed(this.digitPlaces)
: '∞'
}, },
getReportInfo() { getReportInfo() {
this.loading = true this.loading = true
var params = { var params = {
visitTaskId: this.visitTaskId, visitTaskId: this.visitTaskId,
trialId: this.trialId trialId: this.trialId,
} }
this.taskQuestions = [] this.taskQuestions = []
getReadingReportEvaluation(params).then(res => { getReadingReportEvaluation(params)
.then((res) => {
this.readingTaskState = res.Result.ReadingTaskState this.readingTaskState = res.Result.ReadingTaskState
this.answerArr = [] this.answerArr = []
this.questions = res.Result.TaskQuestions.concat() this.questions = res.Result.TaskQuestions.concat()
var taskQuestions = this.getQuestions(res.Result.TaskQuestions) var taskQuestions = this.getQuestions(res.Result.TaskQuestions)
taskQuestions.forEach(item => { taskQuestions.forEach((item) => {
this.$set(this.taskQuestions, this.taskQuestions.length, item) this.$set(this.taskQuestions, this.taskQuestions.length, item)
}) })
this.visitTaskList = res.Result.VisitTaskList this.visitTaskList = res.Result.VisitTaskList
this.InitVisitTaskQuestionForm() this.InitVisitTaskQuestionForm()
this.handleResize() this.handleResize()
this.loading = false this.loading = false
}).catch(() => { this.loading = false }) })
.catch(() => {
this.loading = false
})
}, },
getQuestions(questions) { getQuestions(questions) {
try { try {
@ -713,29 +874,39 @@ export default {
questions.forEach((item) => { questions.forEach((item) => {
const obj = item const obj = item
this.$set(obj, 'Answers', {}) this.$set(obj, 'Answers', {})
item.Answer.forEach(i => { item.Answer.forEach((i) => {
if (item.DictionaryCode) { if (item.DictionaryCode) {
if (item.Type === 'select' && item.OptionTypeEnum === 1) { if (item.Type === 'select' && item.OptionTypeEnum === 1) {
let val = i.Answer ? JSON.parse(i.Answer) : [] let val = i.Answer ? JSON.parse(i.Answer) : []
this.$set(obj.Answers, i.VisitTaskId, val) this.$set(obj.Answers, i.VisitTaskId, val)
} else { } else {
this.$set(obj.Answers, i.VisitTaskId, i.Answer ? parseInt(i.Answer) : null) this.$set(
obj.Answers,
i.VisitTaskId,
i.Answer ? parseInt(i.Answer) : null
)
} }
// obj.Answers[i.VisitTaskId] = i.Answer ? parseInt(i.Answer) : null // obj.Answers[i.VisitTaskId] = i.Answer ? parseInt(i.Answer) : null
} else { } else {
if (item.Type === 'number') { if (item.Type === 'number') {
let val = null let val = null
if (item.ValueType === 0) { if (item.ValueType === 0) {
val = isNaN(parseFloat(i.Answer)) ? i.Answer : parseInt(i.Answer) val = isNaN(parseFloat(i.Answer))
? i.Answer
: parseInt(i.Answer)
} else if (item.ValueType === 3) { } else if (item.ValueType === 3) {
val = i.Answer val = i.Answer
} else { } else {
val = isNaN(parseFloat(i.Answer)) ? i.Answer : parseFloat(i.Answer).toFixed(this.digitPlaces) val = isNaN(parseFloat(i.Answer))
? i.Answer
: parseFloat(i.Answer).toFixed(this.digitPlaces)
} }
this.$set(obj.Answers, i.VisitTaskId, val) this.$set(obj.Answers, i.VisitTaskId, val)
} else if (item.Type === 'select' && item.OptionTypeEnum === 1) { } else if (
item.Type === 'select' &&
item.OptionTypeEnum === 1
) {
let val = i.Answer ? JSON.parse(i.Answer) : [] let val = i.Answer ? JSON.parse(i.Answer) : []
this.$set(obj.Answers, i.VisitTaskId, val) this.$set(obj.Answers, i.VisitTaskId, val)
} else { } else {
@ -754,7 +925,6 @@ export default {
} catch (err) { } catch (err) {
console.log(err) console.log(err)
} }
}, },
handleShowDetail(val) { handleShowDetail(val) {
this.getReportInfo() this.getReportInfo()
@ -770,10 +940,12 @@ export default {
verifyVisitTaskQuestions() { verifyVisitTaskQuestions() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.loading = true this.loading = true
verifyVisitTaskQuestions({ visitTaskId: this.visitTaskId }).then(res => { verifyVisitTaskQuestions({ visitTaskId: this.visitTaskId })
.then((res) => {
this.loading = false this.loading = false
resolve() resolve()
}).catch(() => { })
.catch(() => {
this.loading = false this.loading = false
reject() reject()
}) })
@ -798,9 +970,9 @@ export default {
try { try {
var params = { var params = {
data: { data: {
visitTaskId: this.visitTaskId visitTaskId: this.visitTaskId,
}, },
signInfo: signInfo signInfo: signInfo,
} }
const res = await submitDicomVisitTask(params) const res = await submitDicomVisitTask(params)
if (res.IsSuccess) { if (res.IsSuccess) {
@ -823,12 +995,12 @@ export default {
// '' // ''
this.$confirm(this.$t('trials:readingReport:message:msg4'), { this.$confirm(this.$t('trials:readingReport:message:msg4'), {
type: 'warning', type: 'warning',
distinguishCancelAndClose: true distinguishCancelAndClose: true,
}) })
.then(() => { .then(() => {
window.location.reload() window.location.reload()
}) })
.catch(action => { .catch((action) => {
// changeURLStatic('visitTaskId', this.visitTaskId) // changeURLStatic('visitTaskId', this.visitTaskId)
}) })
} }
@ -847,16 +1019,26 @@ export default {
this.openWindow.close() this.openWindow.close()
} }
var token = getToken() var token = getToken()
var trialReadingCriterionId = this.$router.currentRoute.query.TrialReadingCriterionId var trialReadingCriterionId =
this.$router.currentRoute.query.TrialReadingCriterionId
// var subjectCode = this.$router.currentRoute.query.subjectCode // var subjectCode = this.$router.currentRoute.query.subjectCode
var subjectCode = localStorage.getItem('subjectCode') var subjectCode = localStorage.getItem('subjectCode')
var subjectId = this.$router.currentRoute.query.subjectId var subjectId = this.$router.currentRoute.query.subjectId
var trialId = this.$router.currentRoute.query.trialId var trialId = this.$router.currentRoute.query.trialId
var isReadingTaskViewInOrder = this.$router.currentRoute.query.isReadingTaskViewInOrder var isReadingTaskViewInOrder =
this.$router.currentRoute.query.isReadingTaskViewInOrder
var criterionType = this.$router.currentRoute.query.criterionType var criterionType = this.$router.currentRoute.query.criterionType
var readingTool = this.$router.currentRoute.query.readingTool var readingTool = this.$router.currentRoute.query.readingTool
var path = `/readingDicoms?TrialReadingCriterionId=${trialReadingCriterionId}&trialId=${trialId}&subjectCode=${subjectCode}&subjectId=${subjectId}&visitTaskId=${task.VisitTaskId}&isReadingTaskViewInOrder=${isReadingTaskViewInOrder}&criterionType=${criterionType}&readingTool=${readingTool}&TokenKey=${token}` 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 }) const routeData = this.$router.resolve({ path })
let a = document.createElement('a')
a.href = routeData.href
a.target = '_blank'
a.rel = 'noopener noreferrer'
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
return false
const res = await getAutoCutNextTask() const res = await getAutoCutNextTask()
let IsDoubleScreen = false let IsDoubleScreen = false
if (res.IsSuccess) { if (res.IsSuccess) {
@ -865,17 +1047,23 @@ export default {
if (IsDoubleScreen) { if (IsDoubleScreen) {
this.openWindow = await openWindow(routeData.href) this.openWindow = await openWindow(routeData.href)
if (!this.openWindow) { if (!this.openWindow) {
let html = `<div><span>${this.$t("trials:reading:tip:MultiScreen2")}</span><a style="color:#409EFF" let html = `<div><span>${this.$t(
'trials:reading:tip:MultiScreen2'
)}</span><a style="color:#409EFF"
href="/screen.pdf" href="/screen.pdf"
target="blank">${this.$t("trials:reading:tip:openFile")}</a></div>` target="blank">${this.$t(
let confirm = await this.$confirm(html, '', { dangerouslyUseHTMLString: true }) 'trials:reading:tip:openFile'
)}</a></div>`
let confirm = await this.$confirm(html, '', {
dangerouslyUseHTMLString: true,
})
if (!confirm) return false if (!confirm) return false
this.openWindow = await openWindow(routeData.href, '', true) this.openWindow = await openWindow(routeData.href, '', true)
} }
} else { } else {
this.openWindow = await openWindow(routeData.href, '', true, true) // this.openWindow = await openWindow(routeData.href, '', true, true)
}
// this.openWindow = window.open(routeData.href, '_blank') // this.openWindow = window.open(routeData.href, '_blank')
}
}, },
handleSave(isPrompt) { handleSave(isPrompt) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -885,13 +1073,13 @@ export default {
for (const k in this.questionForm) { for (const k in this.questionForm) {
if (this.questionForm[k] instanceof Array) { if (this.questionForm[k] instanceof Array) {
this.questionForm[k].forEach((v, i) => { this.questionForm[k].forEach((v, i) => {
Object.keys(v).forEach(o => { Object.keys(v).forEach((o) => {
if (o.indexOf('_RowId') === -1) { if (o.indexOf('_RowId') === -1) {
tableQuestionAnswer.push({ tableQuestionAnswer.push({
questionId: k, questionId: k,
answer: v[o], answer: v[o],
tableQuestionId: o, tableQuestionId: o,
rowId: v[o + '_RowId'] rowId: v[o + '_RowId'],
}) })
} }
}) })
@ -904,16 +1092,18 @@ export default {
var params = { var params = {
visitTaskId: this.visitTaskId, visitTaskId: this.visitTaskId,
questionAnswer: answers, questionAnswer: answers,
tableQuestionAnswer: tableQuestionAnswer tableQuestionAnswer: tableQuestionAnswer,
} }
changeCalculationAnswer(params).then(res => { changeCalculationAnswer(params)
.then((res) => {
if (isPrompt) { if (isPrompt) {
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$message.success(this.$t('common:message:savedSuccessfully'))
} }
// DicomEvent.$emit('refreshQuestionAnswer') // DicomEvent.$emit('refreshQuestionAnswer')
this.loading = false this.loading = false
resolve() resolve()
}).catch(() => { })
.catch(() => {
this.loading = false this.loading = false
reject() reject()
}) })
@ -926,7 +1116,7 @@ export default {
this.$t('trials:readingReport:message:skipConfirm'), this.$t('trials:readingReport:message:skipConfirm'),
{ {
type: 'warning', type: 'warning',
distinguishCancelAndClose: true distinguishCancelAndClose: true,
} }
) )
if (confirm !== 'confirm') return if (confirm !== 'confirm') return
@ -947,21 +1137,20 @@ export default {
const arr = path.split('.') const arr = path.split('.')
this.currentType = arr[arr.length - 1] this.currentType = arr[arr.length - 1]
// this.previewVisible = true // this.previewVisible = true
if (['.ppt', if (
'.pptx', ['.ppt', '.pptx', '.doc', '.docx', '.xls', '.xlsx'].includes(
'.doc', `.${this.currentType.toLowerCase()}`
'.docx', )
'.xls', ) {
'.xlsx'].includes(`.${this.currentType.toLowerCase()}`)) {
this.$onlyOffice({ this.$onlyOffice({
path: path, path: path,
type: this.currentType, type: this.currentType,
title: this.$t('trials:readingReport:title:preview') title: this.$t('trials:readingReport:title:preview'),
}) })
} }
if (['.jpg', if (
'.jpeg', ['.jpg', '.jpeg', '.png'].includes(`.${this.currentType.toLowerCase()}`)
'.png'].includes(`.${this.currentType.toLowerCase()}`)) { ) {
this.$nextTick(() => { this.$nextTick(() => {
this.$refs['picture_perview_customizeReportPage'].$viewer.show() this.$refs['picture_perview_customizeReportPage'].$viewer.show()
}) })
@ -970,16 +1159,15 @@ export default {
this.$preview({ this.$preview({
path: path, path: path,
type: 'pdf', type: 'pdf',
title: this.$t('trials:readingReport:title:preview') title: this.$t('trials:readingReport:title:preview'),
}) })
} }
} },
} },
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.report-wrapper { .report-wrapper {
height: 100%; height: 100%;
// background-color: #fff; // background-color: #fff;
background-color: #000; background-color: #000;
@ -1074,7 +1262,7 @@ export default {
} }
.el-form-item__label { .el-form-item__label {
color: #dfdfdf color: #dfdfdf;
} }
} }
} }