233 lines
8.3 KiB
Vue
233 lines
8.3 KiB
Vue
<template>
|
||
<div class="study-info">
|
||
<div class="functions" style="text-align: right">
|
||
<!-- 预览 -->
|
||
<el-button type="primary" size="small" :disabled="studyList.length === 0" icon="el-icon-view"
|
||
@click="handlePreviewAllFiles">
|
||
{{ $t('trials:audit:action:preview') }}
|
||
</el-button>
|
||
</div>
|
||
<el-table v-loading="studyLoading" :data="studyList" style="width: 100%" height="300"
|
||
:row-class-name="tableRowClassName" @selection-change="handleSelectionChange"
|
||
:default-sort="{ prop: 'UploadedTime', order: 'ascending' }">
|
||
<!-- 检查编号 -->
|
||
<el-table-column prop="StudyCode" :label="$t('trials:audit:table:studyId')" min-width="80" show-overflow-tooltip
|
||
sortable />
|
||
<!-- <!– 检查类型 –>-->
|
||
<!-- <el-table-column-->
|
||
<!-- prop="Modalities"-->
|
||
<!-- :label="$t('trials:audit:table:modality')"-->
|
||
<!-- min-width="80"-->
|
||
<!-- show-overflow-tooltip-->
|
||
<!-- />-->
|
||
<!-- <!– 检查部位 –>-->
|
||
<!-- <el-table-column-->
|
||
<!-- prop="BodyPartExamined"-->
|
||
<!-- :label="$t('trials:audit:table:bodyPart')"-->
|
||
<!-- min-width="100"-->
|
||
<!-- show-overflow-tooltip-->
|
||
<!-- >-->
|
||
<!-- <template slot-scope="scope">-->
|
||
<!-- {{ getBodyPart(scope.row.BodyPartExamined) }}-->
|
||
<!-- </template>-->
|
||
<!-- </el-table-column>-->
|
||
<!-- <!– 检查类型 –>-->
|
||
<!-- 检查名称 -->
|
||
<el-table-column v-if="relationInfo.IsShowStudyName" prop="StudyName" :label="$t('trials:audit:table:StudyName')"
|
||
sortable />
|
||
<el-table-column prop="ModalityForEdit" :label="$t('trials:audit:table:modality')" sortable />
|
||
<!-- 检查类型 -->
|
||
<el-table-column prop="Modalities" :label="$t('trials:audit:table:modality1')" sortable />
|
||
<!-- 检查部位 -->
|
||
<el-table-column prop="BodyPartForEdit" :label="$t('trials:uploadedDicoms:table:bodyPart')" min-width="100"
|
||
show-overflow-tooltip sortable>
|
||
<template slot-scope="scope">
|
||
{{ getBodyPart(scope.row.BodyPartForEdit, scope.row.BodyPartForEditOther) }}
|
||
</template>
|
||
</el-table-column>
|
||
<!-- 序列数量 -->
|
||
<el-table-column prop="SeriesCount" :label="$t('trials:audit:table:seriesCount')" min-width="100"
|
||
show-overflow-tooltip sortable />
|
||
<!-- 图像数量 -->
|
||
<el-table-column prop="InstanceCount" :label="$t('trials:audit:table:instanceCount')" min-width="100"
|
||
show-overflow-tooltip sortable />
|
||
<!-- 检查日期 -->
|
||
<el-table-column prop="StudyTime" :label="$t('trials:audit:table:studyDate')" min-width="120"
|
||
show-overflow-tooltip sortable>
|
||
<template slot-scope="scope">
|
||
{{ moment(scope.row.StudyTime).format('YYYY-MM-DD') }}
|
||
</template>
|
||
</el-table-column>
|
||
<!-- 更新时间 -->
|
||
<el-table-column prop="UpdateTime" :label="$t('trials:audit:table:studyUpdateTime')" min-width="80"
|
||
show-overflow-tooltip sortable />
|
||
<!-- 上传时间 -->
|
||
<el-table-column prop="UploadedTime" :label="$t('trials:audit:table:studyUploadTime')" min-width="80"
|
||
show-overflow-tooltip sortable />
|
||
<el-table-column :label="$t('common:action:action')" min-width="100" fixed="right">
|
||
<template slot-scope="scope">
|
||
<!-- 预览 -->
|
||
<el-button icon="el-icon-view" :disabled="scope.row.SeriesCount === 0 || scope.row.IsDeleted"
|
||
:title="$t('trials:audit:action:preview')" circle @click="handleViewStudy(scope.row)" />
|
||
<!-- 预览PET-CT数据 -->
|
||
<el-button icon="el-icon-folder" :title="$t('trials:audit:tab:clinicalData')" v-if="
|
||
['PT、CT', 'CT、PT', 'PET-CT'].includes(scope.row.Modalities) &&
|
||
relationInfo.IsHaveStudyClinicalData
|
||
" circle :disabled="scope.row.IsDeleted" @click="handlePreviewClinicalData(scope.row)" />
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
<!--pet-ct临床数据预览-->
|
||
<el-dialog v-if="petVisible" :show-close="true" :visible.sync="petVisible" append-to-body>
|
||
<uploadPetClinicalData :subject-visit-id="data.Id" :data="data" :studyData="rowData" :allow-add-or-edit="false" />
|
||
</el-dialog>
|
||
</div>
|
||
</template>
|
||
<script>
|
||
import { getSubjectVisitUploadedStudyList, deleteStudyList } from '@/api/trials'
|
||
import { getToken } from '@/utils/auth'
|
||
import uploadPetClinicalData from '@/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue'
|
||
import moment from 'moment'
|
||
export default {
|
||
name: 'StudyInfo',
|
||
components: { uploadPetClinicalData },
|
||
props: {
|
||
data: {
|
||
type: Object,
|
||
default() {
|
||
return {}
|
||
},
|
||
},
|
||
},
|
||
data() {
|
||
return {
|
||
userTypeEnumInt: zzSessionStorage.getItem('userTypeEnumInt') * 1,
|
||
deleteArr: [],
|
||
studyLoading: false,
|
||
studyList: [],
|
||
trialId: this.$route.query.trialId,
|
||
moment,
|
||
// pet-ct临床数据
|
||
petVisible: false,
|
||
rowData: {},
|
||
relationInfo: {},
|
||
BodyPart: {},
|
||
}
|
||
},
|
||
async created() {
|
||
this.BodyPart.Bodypart = await this.$getBodyPart(this.$route.query.trialId)
|
||
this.getStudyInfo()
|
||
},
|
||
methods: {
|
||
// 预览临床数据
|
||
handlePreviewClinicalData(row) {
|
||
this.rowData = row
|
||
this.petVisible = true
|
||
},
|
||
getStudyInfo() {
|
||
this.studyLoading = true
|
||
getSubjectVisitUploadedStudyList(this.data.Id)
|
||
.then((res) => {
|
||
this.studyList = res.Result
|
||
this.relationInfo = res.OtherInfo
|
||
this.studyLoading = false
|
||
})
|
||
.catch(() => {
|
||
this.studyLoading = false
|
||
})
|
||
},
|
||
// 批量删除
|
||
handleBatchDelete() {
|
||
this.$confirm(this.$t('trials:qcCheck:message:delete'), {
|
||
type: 'warning',
|
||
distinguishCancelAndClose: true,
|
||
})
|
||
.then(() => {
|
||
this.studyLoading = true
|
||
deleteStudyList(this.trialId, this.data.Id, this.deleteArr)
|
||
.then((res) => {
|
||
if (res.IsSuccess) {
|
||
this.getStudyInfo()
|
||
this.$emit('getList')
|
||
this.$message.success(
|
||
this.$t('trials:qcCheck:message:deletedSuccessfully')
|
||
)
|
||
}
|
||
})
|
||
.catch(() => {
|
||
this.studyLoading = true
|
||
})
|
||
})
|
||
.catch(() => { })
|
||
},
|
||
// 预览所有影像
|
||
handlePreviewAllFiles() {
|
||
var token = getToken()
|
||
const routeData = this.$router.resolve({
|
||
path: `/showvisitdicoms?trialId=${this.data.TrialId}&visitInfo=${this.data.VisitName}(${this.data.VisitNum})&subjectVisitId=${this.data.Id}&TokenKey=${token}`,
|
||
})
|
||
window.open(routeData.href, '_blank')
|
||
},
|
||
// 预览影像
|
||
handleViewStudy(row) {
|
||
var token = getToken()
|
||
const routeData = this.$router.resolve({
|
||
path: `/showdicom?studyId=${row.StudyId}&TokenKey=${token}&type=Study`,
|
||
})
|
||
window.open(routeData.href, '_blank')
|
||
},
|
||
getBodyPart(bodyPart, other) {
|
||
if (!bodyPart && !other) 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', this.BodyPart, 'Name')
|
||
})
|
||
if (other) {
|
||
newArr.push(other)
|
||
}
|
||
newArr = newArr.filter(Boolean)
|
||
return newArr.join(' | ')
|
||
},
|
||
// 获取勾选项
|
||
handleSelectionChange(val) {
|
||
this.deleteArr = []
|
||
val.forEach((item) => {
|
||
this.deleteArr.push(item.StudyId)
|
||
})
|
||
},
|
||
// 设置已删除行勾选状态
|
||
hasDeleted(row) {
|
||
if (row.IsDeleted) {
|
||
return false
|
||
} else {
|
||
return true
|
||
}
|
||
},
|
||
// 设置已删除序列行样式
|
||
tableRowClassName({ row, rowIndex }) {
|
||
if (row.IsDeleted) {
|
||
return 'delete-row'
|
||
} else {
|
||
return ''
|
||
}
|
||
},
|
||
},
|
||
}
|
||
</script>
|
||
<style lang="scss">
|
||
.study-info {
|
||
.delete-row {
|
||
text-decoration-line: line-through;
|
||
color: #c0c4cc;
|
||
}
|
||
}
|
||
</style>
|