391 lines
12 KiB
Vue
391 lines
12 KiB
Vue
<template>
|
||
<div v-loading="loading" class="img-container">
|
||
<el-card class="box-card left">
|
||
<div v-if="otherInfo && otherInfo.IsReadingShowSubjectInfo" class="title">
|
||
<span>{{ $t('trials:auditRecord:table:subject') }}:{{ otherInfo.SubjectCode }} </span>
|
||
<span>({{ otherInfo.TaskBlindName }})</span>
|
||
</div>
|
||
<el-tabs v-model="activeName" @tab-click="handleClick">
|
||
<el-tab-pane :label="$t('trials:clinicaldara:title:currentTask')" name="first" class="left-content">
|
||
<div>
|
||
<!-- 检查层级 -->
|
||
<div v-for="(study,i) in studyList" :key="study.CodeView">
|
||
<div class="study-desc">
|
||
<span>{{ study.CodeView }}</span>
|
||
<span style="margin:0 5px">{{ study.Modality }}</span>
|
||
<span>{{ getBodyPart(study.BodyPart) }}</span>
|
||
</div>
|
||
<!-- 文件层级 -->
|
||
<div v-if="study.NoneDicomStudyFileList.length === 0" class="empty-text">
|
||
<slot name="empty">{{ $t('trials:audit:message:noData') }}</slot>
|
||
</div>
|
||
<div v-else id="imgList" style="height:100%;">
|
||
<div
|
||
v-for="(item,j) in study.NoneDicomStudyFileList"
|
||
:id="`img${item.Id}`"
|
||
:key="item.Id"
|
||
:class="{
|
||
'is-boxActive': item.Id === currentFileId
|
||
}"
|
||
class="img-box"
|
||
@click="selected(item,i,j,true)"
|
||
>
|
||
{{ `${j+1}. ${item.FileName}` }}
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</el-tab-pane>
|
||
<el-tab-pane v-if="showOtherTask === true" :label="$t('trials:clinicaldara:title:relatedTask')" name="second">
|
||
<div style="height:100%;">
|
||
<!-- 文件层级 -->
|
||
<div v-if="associatedList.length === 0" class="empty-text">
|
||
<slot name="empty">{{ $t('trials:audit:message:noData') }}</slot>
|
||
</div>
|
||
<div v-else>
|
||
<div
|
||
v-for="(task,j) in associatedList"
|
||
:key="task.VisitTaskId"
|
||
:class="{
|
||
'is-boxActive': task.VisitTaskId === currentTaskId
|
||
}"
|
||
class="img-box"
|
||
@click="handleImageRead(task)"
|
||
>
|
||
{{ `${j+1}. ${task.TaskBlindName}` }}
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</el-tab-pane>
|
||
</el-tabs>
|
||
|
||
</el-card>
|
||
<!-- 预览图像 -->
|
||
<el-card class="box-card right">
|
||
<div style="width:100%;height: 100%;">
|
||
<Preview
|
||
v-if="previewImage.imgList.length > 0"
|
||
ref="previewImage"
|
||
style="width:100%;"
|
||
:preview-image="previewImage"
|
||
:value="currentStudyFileIndex"
|
||
@selectedImg="selectedImg"
|
||
/>
|
||
</div>
|
||
|
||
</el-card>
|
||
|
||
<el-card class="box-card" style="width:400px;height:100%;padding: 10px;margin-left:10px;overflow-y: auto;">
|
||
<div style="text-align:right;">
|
||
<el-button
|
||
v-if="otherInfo && otherInfo.IsExistsClinicalData"
|
||
type="text"
|
||
@click="previewCD"
|
||
>
|
||
{{ $t('trials:crcUpload:label:clinicalData') }}
|
||
</el-button>
|
||
</div>
|
||
<Criterions
|
||
v-if="otherInfo && visitTaskId!== '' && subjectId!== '' && readingCategory!==null && readingCategory!==4"
|
||
:trial-id="trialId"
|
||
:subject-id="subjectId"
|
||
:visit-task-id="visitTaskId"
|
||
:criterion-id="otherInfo.TrialCriterionId"
|
||
/>
|
||
</el-card>
|
||
</div>
|
||
|
||
</template>
|
||
|
||
<script>
|
||
import { getReadingImageFile, getReadingPastResultList } from '@/api/trials'
|
||
import { getToken } from '@/utils/auth'
|
||
import Preview from '@/views/none-dicom-show/components/preview'
|
||
import Criterions from './Criterions'
|
||
export default {
|
||
name: 'VisitReview',
|
||
components: {
|
||
Preview,
|
||
Criterions
|
||
},
|
||
props: {
|
||
trialId: {
|
||
type: String,
|
||
required: true
|
||
},
|
||
subjectId: {
|
||
type: String,
|
||
required: true
|
||
},
|
||
subjectCode: {
|
||
type: String,
|
||
required: true
|
||
},
|
||
visitTaskId: {
|
||
type: String,
|
||
required: true
|
||
},
|
||
readingCategory: {
|
||
type: Number,
|
||
required: true
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
activeName: 'first',
|
||
currentFileId: '',
|
||
currentStudyIndex: 0,
|
||
currentStudyFileIndex: 0,
|
||
pageSize: 0, // 一页展示的图片数
|
||
previewImage: {
|
||
imgList: [],
|
||
index: 0, // 当前点击的图片的索引
|
||
infinite: true, // 是否可以循环切换
|
||
popup: true, // 弹窗的显示隐藏
|
||
studyCode: '',
|
||
modality: '',
|
||
bodyPart: ''
|
||
},
|
||
previewVisible: false,
|
||
studyList: [],
|
||
loading: false,
|
||
isRenderAssocicatedTasks: false,
|
||
associatedList: [],
|
||
currentTaskId: '',
|
||
otherInfo: null,
|
||
isReadingShowPreviousResults: false,
|
||
bp: []
|
||
}
|
||
},
|
||
computed: {
|
||
showOtherTask() {
|
||
return this.otherInfo && this.otherInfo.IsReadingShowPreviousResults && this.isReadingShowPreviousResults
|
||
}
|
||
},
|
||
async mounted() {
|
||
this.bp = await this.$getBodyPart(this.$route.query.trialId)
|
||
this.isReadingShowPreviousResults = this.$router.currentRoute.query.isReadingShowPreviousResults !== undefined ? this.$router.currentRoute.query.isReadingShowPreviousResults : true
|
||
|
||
this.getNoneDicomList(this.isReadingShowPreviousResults)
|
||
},
|
||
methods: {
|
||
// 获取非Dicom检查信息
|
||
getNoneDicomList() {
|
||
this.loading = true
|
||
var param = {
|
||
subjectId: this.subjectId,
|
||
trialId: this.trialId,
|
||
visistTaskId: this.visitTaskId
|
||
}
|
||
getReadingImageFile(param).then(res => {
|
||
this.otherInfo = res.OtherInfo
|
||
if (res.Result.length > 0) {
|
||
this.studyList = res.Result
|
||
const studyIndex = this.studyList.findIndex(item => {
|
||
return item.NoneDicomStudyFileList.length > 0
|
||
})
|
||
if (studyIndex > -1) {
|
||
var fileObj = this.studyList[studyIndex]['NoneDicomStudyFileList']
|
||
this.selected(fileObj[0], studyIndex, 0, true)
|
||
}
|
||
} else {
|
||
// this.$alert('当前影像存在问题,请联系PM!')
|
||
}
|
||
this.loading = false
|
||
}).catch(() => { this.loading = false })
|
||
},
|
||
selected(file, studyIndex, fileIndex, isChangeSub = false) {
|
||
this.currentFileId = file.Id
|
||
this.currentStudyIndex = studyIndex
|
||
this.previewImage.imgList = this.studyList[studyIndex].NoneDicomStudyFileList
|
||
this.currentStudyFileIndex = fileIndex
|
||
this.previewImage.index = fileIndex
|
||
this.previewImage.studyCode = this.studyList[studyIndex].CodeView
|
||
this.previewImage.bodyPart = this.studyList[studyIndex].BodyPart
|
||
this.previewImage.modality = this.studyList[studyIndex].Modality
|
||
this.$nextTick(() => {
|
||
if (isChangeSub) {
|
||
this.$refs['previewImage'].selected(fileIndex)
|
||
}
|
||
})
|
||
},
|
||
selectedImg(fileIndex) {
|
||
if (this.studyList.length > 0) {
|
||
this.currentStudyFileIndex = fileIndex
|
||
this.currentFileId = this.studyList[this.currentStudyIndex].NoneDicomStudyFileList[fileIndex].Id
|
||
this.previewImage.index = fileIndex
|
||
this.previewImage.studyCode = this.studyList[this.currentStudyIndex].CodeView
|
||
this.previewImage.bodyPart = this.studyList[this.currentStudyIndex].BodyPart
|
||
this.previewImage.modality = this.studyList[this.currentStudyIndex].Modality
|
||
this.$nextTick(() => {
|
||
const target = document.getElementById(`img${this.currentFileId}`)
|
||
const parent = document.getElementsByClassName('left-content')[0]
|
||
parent.scrollTop = target.offsetTop - parent.offsetTop
|
||
})
|
||
}
|
||
},
|
||
preview() {
|
||
this.previewVisible = true
|
||
},
|
||
handleClick(tab) {
|
||
if (tab.name === 'second' && !this.isRenderAssocicatedTasks) {
|
||
this.getAssociatedTask()
|
||
}
|
||
},
|
||
getAssociatedTask() {
|
||
this.loading = true
|
||
var param = {
|
||
trialId: this.trialId,
|
||
subjectId: this.subjectId,
|
||
visitTaskId: this.visitTaskId
|
||
}
|
||
getReadingPastResultList(param).then(res => {
|
||
this.associatedList = res.Result
|
||
this.isRenderAssocicatedTasks = true
|
||
this.loading = false
|
||
}).catch(() => {
|
||
this.loading = false
|
||
})
|
||
},
|
||
handleImageRead(task) {
|
||
this.currentTaskId = task.VisitTaskId
|
||
var criterionType = this.$router.currentRoute.query.criterionType
|
||
var readingTool = this.$router.currentRoute.query.readingTool
|
||
var isReadingTaskViewInOrder = this.$router.currentRoute.query.isReadingTaskViewInOrder
|
||
var trialReadingCriterionId = this.$router.currentRoute.query.TrialReadingCriterionId
|
||
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 routeData = this.$router.resolve({
|
||
// path: `/readingPage?subjectId=${this.subjectId}&trialId=${this.trialId}&visitTaskId=${task.VisitTaskId}&TokenKey=${token}`
|
||
// })
|
||
const routeData = this.$router.resolve({ path })
|
||
window.open(routeData.href, '_blank')
|
||
},
|
||
previewCD() {
|
||
var token = getToken()
|
||
const routeData = this.$router.resolve({
|
||
path: `/clinicalData?subjectId=${this.subjectId}&trialId=${this.trialId}&visitTaskId=${this.visitTaskId}&TokenKey=${token}`
|
||
})
|
||
window.open(routeData.href, '_blank')
|
||
},
|
||
getBodyPart(bodyPart) {
|
||
if (!bodyPart) return ''
|
||
var separator = ','
|
||
if (bodyPart.indexOf('|') > -1) {
|
||
separator = '|'
|
||
} else if (bodyPart.indexOf(',') > -1) {
|
||
separator = ','
|
||
} else if (bodyPart.indexOf(',') > -1) {
|
||
separator = ','
|
||
}
|
||
var arr = bodyPart.split(separator)
|
||
var newArr = arr.map(i => {
|
||
return this.$fd('Bodypart', i.trim(), 'Code', { Bodypart: this.bp }, 'Name')
|
||
})
|
||
return newArr.join(' | ')
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.img-container{
|
||
flex: 1;
|
||
width: 100%;
|
||
height: 100%;
|
||
padding: 10px;
|
||
display: flex;
|
||
::-webkit-scrollbar {
|
||
width: 7px;
|
||
height: 7px;
|
||
}
|
||
::-webkit-scrollbar-thumb {
|
||
border-radius: 10px;
|
||
background: #d0d0d0;
|
||
}
|
||
/deep/ .el-card__body{
|
||
padding: 0px;
|
||
}
|
||
}
|
||
.study-desc{
|
||
padding: 10px 5px;
|
||
line-height: 1;
|
||
background-color: #ebebeb;
|
||
font-weight: 500;
|
||
}
|
||
.left{
|
||
width:240px;
|
||
height: 100%;
|
||
|
||
/deep/ .el-card__body{
|
||
height: 100%;
|
||
width: 100%;
|
||
display: flex;
|
||
flex-direction: column;
|
||
}
|
||
.title{
|
||
height: 40px;
|
||
line-height: 40px;
|
||
border: 1ppx solid;
|
||
border: 1px solid #ebe7e7;
|
||
padding-left: 10px;
|
||
background-color: #4e4e4e;
|
||
color: #ffffff;
|
||
}
|
||
.left-content{
|
||
flex: 1;
|
||
overflow-y: auto;
|
||
}
|
||
/deep/ .el-tabs{
|
||
height: 100%;
|
||
display:flex;
|
||
|
||
flex-direction: column;
|
||
}
|
||
/deep/ .el-tabs__header{
|
||
height: 40px;
|
||
padding: 0 5px;
|
||
margin-bottom: 5px;
|
||
}
|
||
/deep/ .el-tabs__content{
|
||
flex: 1;
|
||
overflow-y: auto;
|
||
padding: 0 5px;
|
||
}
|
||
.img-box{
|
||
// position: relative;
|
||
display: inline-block;
|
||
box-sizing: border-box;
|
||
border-bottom: 2px solid #f3f3f3;
|
||
width: 180px;
|
||
height: 50px;
|
||
line-height: 50px;
|
||
cursor: pointer;
|
||
// margin-bottom: 5px;
|
||
padding-left: 5px;
|
||
}
|
||
.img-box:nth-last-child(1){
|
||
margin-bottom: 0px;
|
||
}
|
||
.is-boxActive {
|
||
// border-color: #409eff;
|
||
color: #409eff;
|
||
}
|
||
.is-boxActiv:after {
|
||
opacity: 0;
|
||
}
|
||
}
|
||
.right{
|
||
flex: 1;
|
||
height: 100%;
|
||
margin-left: 10px;
|
||
/deep/ .el-card__body{
|
||
height: 100%;
|
||
width: 100%;
|
||
}
|
||
}
|
||
|
||
</style>
|