|
|
|
@ -49,18 +49,18 @@
|
|
|
|
|
/>
|
|
|
|
|
<div class="image-desc">
|
|
|
|
|
<div class="flex-div">
|
|
|
|
|
<div>#{{ series.seriesNumber }} </div>
|
|
|
|
|
<div v-if="series.isDicom && series.prefetchInstanceCount<series.instanceCount">
|
|
|
|
|
<div v-if="!study.IsCriticalSequence">#{{ series.seriesNumber }} </div>
|
|
|
|
|
<div v-if="series.isDicom && series.prefetchInstanceCount<series.instanceCount && series.modality!== 'SR'">
|
|
|
|
|
<!-- 下载 -->
|
|
|
|
|
<el-tooltip v-if="!series.isLoading" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
|
|
|
|
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
|
|
|
|
</el-tooltip>
|
|
|
|
|
<!-- 暂停 -->
|
|
|
|
|
<el-tooltip v-else class="item" effect="dark" :content="$t('trials:reading:button:pause')" placement="bottom">
|
|
|
|
|
<!-- <el-tooltip v-else class="item" effect="dark" :content="$t('trials:reading:button:pause')" placement="bottom">
|
|
|
|
|
<i class="el-icon-video-pause" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="stopLoadSeries(series,index,i)" />
|
|
|
|
|
</el-tooltip>
|
|
|
|
|
</el-tooltip> -->
|
|
|
|
|
</div>
|
|
|
|
|
<el-tooltip v-else-if="series.prefetchInstanceCount === 0" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
|
|
|
|
<el-tooltip v-else-if="series.isDicom && series.prefetchInstanceCount === 0 &&series.modality!== 'SR'" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
|
|
|
|
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
|
|
|
|
</el-tooltip>
|
|
|
|
|
</div>
|
|
|
|
@ -70,15 +70,15 @@
|
|
|
|
|
</el-tooltip>
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p v-show="series.sliceThickness">
|
|
|
|
|
T: {{ series.sliceThickness }}
|
|
|
|
|
<p v-show="series.sliceThickness && !study.IsCriticalSequence">
|
|
|
|
|
T: {{ parseFloat(series.sliceThickness).toFixed(digitPlaces) }}
|
|
|
|
|
</p>
|
|
|
|
|
<p v-show="series.instanceCount">
|
|
|
|
|
{{ series.modality }}: {{ series.instanceCount }} image
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<div class="flex-div">
|
|
|
|
|
<div v-if="measureData && measureData.findIndex(v=>v.SeriesId === series.seriesId) > -1">
|
|
|
|
|
<div v-if="measureData.findIndex(v=>v.SeriesId === series.seriesId && v.MeasureData) > -1">
|
|
|
|
|
<!-- 有标注 -->
|
|
|
|
|
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:marked')" placement="right">
|
|
|
|
|
<i class="el-icon-star-on" style="font-size: 16px;color: #ff5722;" />
|
|
|
|
@ -99,22 +99,47 @@
|
|
|
|
|
</el-collapse-item>
|
|
|
|
|
</el-collapse>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="sr-wrapper">
|
|
|
|
|
<el-dialog
|
|
|
|
|
:visible.sync="srDialogVisible"
|
|
|
|
|
:custom-class="isSrFullscreen?'sr-full-dialog-container':'sr-dialog-container'"
|
|
|
|
|
:show-close="false"
|
|
|
|
|
:close-on-click-modal="false"
|
|
|
|
|
:fullscreen="isSrFullscreen"
|
|
|
|
|
>
|
|
|
|
|
<span slot="title" class="dialog-footer">
|
|
|
|
|
<div style="position: absolute;right: 20px;top: 10px;">
|
|
|
|
|
<svg-icon :icon-class="isSrFullscreen?'exit-fullscreen':'fullscreen'" style="cursor: pointer;font-size: 20px;color:#000;" @click="isSrFullscreen=!isSrFullscreen" />
|
|
|
|
|
<svg-icon icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;" @click="srDialogVisible = false" />
|
|
|
|
|
</div>
|
|
|
|
|
</span>
|
|
|
|
|
<div style="height: 100%;margin:0;">
|
|
|
|
|
<SrList
|
|
|
|
|
v-if="srDialogVisible"
|
|
|
|
|
:sr-info="srInfo"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
<script>
|
|
|
|
|
import * as dicomParser from 'dicom-parser'
|
|
|
|
|
import * as cornerstone from 'cornerstone-core'
|
|
|
|
|
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
|
|
|
|
|
|
|
|
|
import requestPoolManager from '@/utils/request-pool'
|
|
|
|
|
import DicomEvent from './../components/DicomEvent'
|
|
|
|
|
import { mapGetters } from 'vuex'
|
|
|
|
|
import store from '@/store'
|
|
|
|
|
import SrList from './../components/SrList'
|
|
|
|
|
cornerstoneWADOImageLoader.external.dicomParser = dicomParser
|
|
|
|
|
cornerstoneWADOImageLoader.external.cornerstone = cornerstone
|
|
|
|
|
// const maximumSizeInBytes = 1024 * 1024 * 1024 // 1 GB
|
|
|
|
|
const maximumSizeInBytes = 1024 * 1024 * 1024 // 1 GB
|
|
|
|
|
cornerstone.imageCache.setMaximumSizeBytes(maximumSizeInBytes)
|
|
|
|
|
export default {
|
|
|
|
|
name: 'StudyList',
|
|
|
|
|
components: { SrList },
|
|
|
|
|
props: {
|
|
|
|
|
trialId: {
|
|
|
|
|
type: String,
|
|
|
|
@ -145,6 +170,7 @@ export default {
|
|
|
|
|
return {
|
|
|
|
|
studyList: [],
|
|
|
|
|
cachedImages: [],
|
|
|
|
|
showSeriesList: [],
|
|
|
|
|
studyIndex: null,
|
|
|
|
|
seriesIndex: null,
|
|
|
|
|
loading: false,
|
|
|
|
@ -154,9 +180,15 @@ export default {
|
|
|
|
|
activeNames: [],
|
|
|
|
|
seriesArr: [],
|
|
|
|
|
imageList: [],
|
|
|
|
|
loopLoadStatus: 0 // -1暂停下载 0未下载完成 1下载完成
|
|
|
|
|
loopLoadStatus: 0, // -1暂停下载 0未下载完成 1下载完成
|
|
|
|
|
isSrFullscreen: false,
|
|
|
|
|
srDialogVisible: false,
|
|
|
|
|
srInfo: {},
|
|
|
|
|
digitPlaces: 2,
|
|
|
|
|
visitTaskIdx: -1
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
computed: {
|
|
|
|
|
...mapGetters(['visitTaskList', 'currentTaskId', 'activeSeries'])
|
|
|
|
|
},
|
|
|
|
@ -168,6 +200,14 @@ export default {
|
|
|
|
|
if (idx === -1) return
|
|
|
|
|
this.measureData = this.visitTaskList[idx].MeasureData
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
visitTaskId: {
|
|
|
|
|
immediate: true,
|
|
|
|
|
handler(val) {
|
|
|
|
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
|
|
|
|
if (idx === -1) return
|
|
|
|
|
this.visitTaskIdx = idx
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// activeSeries: {
|
|
|
|
|
// immediate: true,
|
|
|
|
@ -180,10 +220,8 @@ export default {
|
|
|
|
|
},
|
|
|
|
|
mounted() {
|
|
|
|
|
this.subjectCode = this.$router.currentRoute.query.subjectCode
|
|
|
|
|
// DicomEvent.$on('getMeasureData', () => {
|
|
|
|
|
// var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
|
|
|
|
// this.measureData = this.visitTaskList[idx].MeasureData
|
|
|
|
|
// })
|
|
|
|
|
var digitPlaces = Number(localStorage.getItem('digitPlaces'))
|
|
|
|
|
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
|
|
|
|
|
|
|
|
|
|
// DicomEvent.$on('setReadingState', readingTaskState => {
|
|
|
|
|
// var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
|
|
|
@ -191,12 +229,12 @@ export default {
|
|
|
|
|
// this.studyList = this.visitTaskList[idx].StudyList
|
|
|
|
|
// }
|
|
|
|
|
// })
|
|
|
|
|
|
|
|
|
|
cornerstone.events.addEventListener('cornerstoneimageloaded', this.cornerstoneImageLoaded)
|
|
|
|
|
// cornerstone.events.addEventListener('cornerstoneimagecachefull', this.cornerstoneimagecachefull)
|
|
|
|
|
// cornerstone.events.addEventListener('cornerstoneimagecachechanged', this.cornerstoneimagecachechanged)
|
|
|
|
|
},
|
|
|
|
|
beforeDestroy() {
|
|
|
|
|
cornerstone.imageCache.purgeCache()
|
|
|
|
|
// DicomEvent.$off('getMeasureData')
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
initStudyInfo() {
|
|
|
|
@ -209,7 +247,54 @@ export default {
|
|
|
|
|
})
|
|
|
|
|
var i = res.findIndex(s => s.isCurrentTask)
|
|
|
|
|
if (i > -1) {
|
|
|
|
|
var p = this.visitTaskId === this.currentTaskId ? parseInt(new Date().getTime()) : 999 // 非当前任务,符合自动下载的权重次之
|
|
|
|
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
|
|
|
|
if (idx > -1) {
|
|
|
|
|
this.measureData = this.visitTaskList[idx].MeasureData
|
|
|
|
|
this.studyList = this.visitTaskList[idx].StudyList
|
|
|
|
|
var priority = parseInt(new Date().getTime())
|
|
|
|
|
res[i].imageIds.map(image => {
|
|
|
|
|
priority--
|
|
|
|
|
this.imageList.push({ imageId: image, seriesId: res[i].seriesId, studyIndex: res[i].studyIndex, seriesIndex: res[i].seriesIndex, visitTaskId: res[i].visitTaskId, priority })
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// this.studyList.map((study, studyIndex) => {
|
|
|
|
|
// study.SeriesList.map((series, seriesIndex) => {
|
|
|
|
|
// if (series.modality !== 'SR') {
|
|
|
|
|
// series.imageIds.map(image => {
|
|
|
|
|
// var p = priority - seriesIndex
|
|
|
|
|
// if (series.seriesId === res[i].seriesId) {
|
|
|
|
|
// p = priority
|
|
|
|
|
// } else {
|
|
|
|
|
// --p
|
|
|
|
|
// }
|
|
|
|
|
// this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority: p })
|
|
|
|
|
// })
|
|
|
|
|
// }
|
|
|
|
|
// })
|
|
|
|
|
// })
|
|
|
|
|
this.loopLoad()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
DicomEvent.$emit('loadImageStacks', res)
|
|
|
|
|
loading.close()
|
|
|
|
|
this.isRender = true
|
|
|
|
|
}).catch(() => {
|
|
|
|
|
loading.close()
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
initStudyInfo2() {
|
|
|
|
|
console.log('initStudyInfo')
|
|
|
|
|
const loading = this.$loading({ fullscreen: true })
|
|
|
|
|
// 初始化待渲染序列
|
|
|
|
|
this.getInitSeries().then((res) => {
|
|
|
|
|
requestPoolManager.startTaskTimer()
|
|
|
|
|
res.map((item) => {
|
|
|
|
|
this.loadInitialImage(item)
|
|
|
|
|
})
|
|
|
|
|
var i = res.findIndex(s => s.isCurrentTask)
|
|
|
|
|
if (i > -1) {
|
|
|
|
|
var p = parseInt(new Date().getTime())
|
|
|
|
|
// var p = this.visitTaskId === this.currentTaskId ? parseInt(new Date().getTime()) : 999 // 非当前任务,符合自动下载的权重次之
|
|
|
|
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
|
|
|
|
if (idx > -1) {
|
|
|
|
|
this.measureData = this.visitTaskList[idx].MeasureData
|
|
|
|
@ -217,7 +302,8 @@ export default {
|
|
|
|
|
|
|
|
|
|
this.studyList.map((study, studyIndex) => {
|
|
|
|
|
study.SeriesList.map((series, seriesIndex) => {
|
|
|
|
|
var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
|
|
|
|
if (series.modality !== 'SR') {
|
|
|
|
|
// var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
|
|
|
|
// if (sliceThickness === 5 || series.instanceCount <= 100) {
|
|
|
|
|
series.imageIds.map(image => {
|
|
|
|
|
let priority = 0
|
|
|
|
@ -228,26 +314,31 @@ export default {
|
|
|
|
|
}
|
|
|
|
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
this.loopLoad()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
DicomEvent.$emit('loadImageStacks', res)
|
|
|
|
|
loading.close()
|
|
|
|
|
this.isRender = true
|
|
|
|
|
}).catch(() => {
|
|
|
|
|
loading.close()
|
|
|
|
|
})
|
|
|
|
|
this.isRender = true
|
|
|
|
|
loading.close()
|
|
|
|
|
},
|
|
|
|
|
// 获取初始化序列信息
|
|
|
|
|
loadInitialImage(seriesInfo) {
|
|
|
|
|
var p = parseInt(new Date().getTime())
|
|
|
|
|
var imageId = seriesInfo.imageIds[seriesInfo.imageIdIndex]
|
|
|
|
|
requestPoolManager.loadAndCacheImagePlus(imageId, seriesInfo.seriesId, p * 100).then(res => {
|
|
|
|
|
this.imageLoaded(seriesInfo, res.data.string('x0020000e'))
|
|
|
|
|
if (seriesInfo.isCurrentTask) {
|
|
|
|
|
this.imageLoaded({ studyIndex: seriesInfo.studyIndex, seriesIndex: seriesInfo.seriesIndex, imageId: res.imageId }, res.data.string('x0020000e'))
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
getStudyList() {
|
|
|
|
|
console.log('getStudyList')
|
|
|
|
|
if (!this.isRender) {
|
|
|
|
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
|
|
|
|
if (idx > -1 && this.visitTaskList[idx].StudyList && this.visitTaskList[idx].StudyList.length > 0) {
|
|
|
|
@ -319,7 +410,8 @@ export default {
|
|
|
|
|
} else {
|
|
|
|
|
const sIdx = this.studyList.findIndex(s => s.IsDicom)
|
|
|
|
|
const series = this.studyList[sIdx].SeriesList[0]
|
|
|
|
|
series.imageIdIndex = Math.floor(series.imageIds.length / 2) - 1
|
|
|
|
|
const imageIdIndex = Math.floor(series.imageIds.length / 2)
|
|
|
|
|
series.imageIdIndex = imageIdIndex > 0 ? imageIdIndex - 1 : 0
|
|
|
|
|
seriesList.push(series)
|
|
|
|
|
this.studyIndex = sIdx
|
|
|
|
|
this.seriesIndex = 0
|
|
|
|
@ -384,7 +476,7 @@ export default {
|
|
|
|
|
idx > -1 ? seriesInfo = seriesList[idx] : seriesInfo = seriesList[0]
|
|
|
|
|
}
|
|
|
|
|
if (seriesInfo) {
|
|
|
|
|
let index = Math.floor(seriesInfo.imageIds.length * ((baseObj.series.imageIdIndex+ 1) / baseObj.series.instanceCount))
|
|
|
|
|
const index = Math.floor(seriesInfo.imageIds.length * ((baseObj.series.imageIdIndex + 1) / baseObj.series.instanceCount))
|
|
|
|
|
seriesInfo.imageIdIndex = index > 0 ? index - 1 : 0
|
|
|
|
|
obj.studyIndex = seriesInfo.studyIndex
|
|
|
|
|
obj.seriesIndex = seriesInfo.seriesIndex
|
|
|
|
@ -437,7 +529,9 @@ export default {
|
|
|
|
|
if (seriesObj) {
|
|
|
|
|
obj.studyIndex = seriesObj.studyIndex
|
|
|
|
|
obj.seriesIndex = seriesObj.seriesIdx
|
|
|
|
|
seriesObj.series.imageIdIndex = Math.floor(seriesObj.series.imageIds.length / 2) - 1
|
|
|
|
|
const imageIdIndex = Math.floor(seriesObj.series.imageIds.length / 2)
|
|
|
|
|
|
|
|
|
|
seriesObj.series.imageIdIndex = imageIdIndex > 0 ? imageIdIndex - 1 : 0
|
|
|
|
|
obj.series = seriesObj.series
|
|
|
|
|
obj.seriesId = seriesObj.series.seriesId
|
|
|
|
|
obj.isMarked = false
|
|
|
|
@ -446,11 +540,11 @@ export default {
|
|
|
|
|
if (sIdx > -1) {
|
|
|
|
|
// 判断是否存在层厚为5的序列,否则显示第一个检查的第一个序列
|
|
|
|
|
const series = studyList[sIdx].SeriesList[0]
|
|
|
|
|
var imageIdIndex = Math.floor(series.imageIds.length / 2) - 1
|
|
|
|
|
var imageIdIndex = series.imageIds.length > 1 ? Math.floor(series.imageIds.length / 2) - 1 : 0
|
|
|
|
|
obj.studyIndex = sIdx
|
|
|
|
|
obj.seriesIndex = 0
|
|
|
|
|
obj.series = series
|
|
|
|
|
obj.series.imageIdIndex = imageIdIndex
|
|
|
|
|
obj.series.imageIdIndex = imageIdIndex >= 0 ? imageIdIndex : 0
|
|
|
|
|
obj.seriesId = series.seriesId
|
|
|
|
|
obj.isMarked = false
|
|
|
|
|
}
|
|
|
|
@ -496,31 +590,47 @@ export default {
|
|
|
|
|
},
|
|
|
|
|
showSeriesImage(studyIndex, seriesIndex, series) {
|
|
|
|
|
if (series.isDicom) {
|
|
|
|
|
this.studyIndex = studyIndex
|
|
|
|
|
this.seriesIndex = seriesIndex
|
|
|
|
|
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
|
|
|
|
var dicomStatck = this.studyList[studyIndex].SeriesList[seriesIndex]
|
|
|
|
|
this.$emit('loadImageStack', dicomStatck)
|
|
|
|
|
if (!series.loadStatus) {
|
|
|
|
|
this.loopLoadStatus = -1
|
|
|
|
|
series.isLoading = true
|
|
|
|
|
var p = parseInt(new Date().getTime())
|
|
|
|
|
series.imageIds.map((imageId, i) => {
|
|
|
|
|
var priority = ''
|
|
|
|
|
if (i === 0) {
|
|
|
|
|
priority = parseInt(new Date().getTime()) * 10
|
|
|
|
|
} else {
|
|
|
|
|
priority = --p
|
|
|
|
|
}
|
|
|
|
|
this.imageList.push({ imageId: imageId, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
})
|
|
|
|
|
if (this.imageList.length > 0) {
|
|
|
|
|
this.loopLoadStatus = 0
|
|
|
|
|
this.loopLoad()
|
|
|
|
|
if (series.modality === 'SR') {
|
|
|
|
|
this.studyIndex = studyIndex
|
|
|
|
|
this.seriesIndex = seriesIndex
|
|
|
|
|
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
|
|
|
|
this.srDialogVisible = true
|
|
|
|
|
this.srInfo = {
|
|
|
|
|
SubjectCode: series.studyCode,
|
|
|
|
|
TaskBlindName: series.taskBlindName,
|
|
|
|
|
SrList: series.instanceHtmlPathList
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
this.studyIndex = studyIndex
|
|
|
|
|
this.seriesIndex = seriesIndex
|
|
|
|
|
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
|
|
|
|
var dicomStatck = this.studyList[studyIndex].SeriesList[seriesIndex]
|
|
|
|
|
this.$emit('loadImageStack', dicomStatck)
|
|
|
|
|
if (!series.loadStatus && series.modality !== 'SR') {
|
|
|
|
|
this.loopLoadStatus = -1
|
|
|
|
|
series.isLoading = true
|
|
|
|
|
var isAddToTakPool = false
|
|
|
|
|
if (this.showSeriesList.includes(`${studyIndex}_${seriesIndex}`)) {
|
|
|
|
|
isAddToTakPool = true
|
|
|
|
|
} else {
|
|
|
|
|
this.showSeriesList.push(`${studyIndex}_${seriesIndex}`)
|
|
|
|
|
}
|
|
|
|
|
if (!isAddToTakPool) {
|
|
|
|
|
var priority = parseInt(new Date().getTime())
|
|
|
|
|
series.imageIds.map((imageId) => {
|
|
|
|
|
this.imageList.push({ imageId: imageId, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
})
|
|
|
|
|
if (this.imageList.length > 0) {
|
|
|
|
|
this.loopLoadStatus = 0
|
|
|
|
|
this.loopLoad()
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
requestPoolManager.changePriority(series.seriesId)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DicomEvent.$emit('loadMeasurementList', { visitTaskId: this.visitTaskId, taskBlindName: this.taskBlindName })
|
|
|
|
|
DicomEvent.$emit('loadMeasurementList', { visitTaskId: this.visitTaskId, taskBlindName: this.taskBlindName })
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 非Dicom预览
|
|
|
|
|
this.$emit('previewNoneDicoms', { visitTaskId: this.visitTaskId })
|
|
|
|
@ -565,40 +675,27 @@ export default {
|
|
|
|
|
this.loadImages(this.visitTaskList[idx])
|
|
|
|
|
store.dispatch('reading/setActiveSeries', series)
|
|
|
|
|
},
|
|
|
|
|
loadImages1(taskInfo) {
|
|
|
|
|
var priority = taskInfo.IsCurrentTask ? parseInt(new Date().getTime()) : 999
|
|
|
|
|
|
|
|
|
|
this.studyList.map((study, studyIndex) => {
|
|
|
|
|
study.SeriesList.map((series, seriesIndex) => {
|
|
|
|
|
if (!series.loadStatus) {
|
|
|
|
|
var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
|
|
|
|
if (series.isBeMark || sliceThickness === 5 || series.instanceCount <= 100) {
|
|
|
|
|
series.imageIds.map(image => {
|
|
|
|
|
priority = priority - 1
|
|
|
|
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
this.loopLoad()
|
|
|
|
|
},
|
|
|
|
|
loadImages(taskInfo) {
|
|
|
|
|
const isBaseLineTask = taskInfo.IsBaseLineTask
|
|
|
|
|
// const isBaseLineTask = taskInfo.IsBaseLineTask
|
|
|
|
|
const isCurrentTask = taskInfo.IsCurrentTask
|
|
|
|
|
// var priority = isCurrentTask ? parseInt(new Date().getTime()) : 999
|
|
|
|
|
var priority = parseInt(new Date().getTime())
|
|
|
|
|
this.studyList.map((study, studyIndex) => {
|
|
|
|
|
study.SeriesList.map((series, seriesIndex) => {
|
|
|
|
|
if (!series.loadStatus && series.isDicom) {
|
|
|
|
|
if (isCurrentTask || isBaseLineTask) {
|
|
|
|
|
// 当前任务/基线任务下载所有影像
|
|
|
|
|
series.imageIds.map(image => {
|
|
|
|
|
priority = priority - 1
|
|
|
|
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
})
|
|
|
|
|
} else if (!isBaseLineTask && !isCurrentTask && study.IsCriticalSequence) {
|
|
|
|
|
// 非当前随访任务下载关键影像
|
|
|
|
|
if (!series.loadStatus && series.isDicom && series.modality !== 'SR') {
|
|
|
|
|
// if (isCurrentTask || isBaseLineTask) {
|
|
|
|
|
// // 当前任务/基线任务下载所有影像
|
|
|
|
|
// series.imageIds.map(image => {
|
|
|
|
|
// this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
// })
|
|
|
|
|
// } else if (!isBaseLineTask && !isCurrentTask && study.IsCriticalSequence) {
|
|
|
|
|
// // 非当前随访任务下载关键影像
|
|
|
|
|
// series.imageIds.map(image => {
|
|
|
|
|
// this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
// })
|
|
|
|
|
// }
|
|
|
|
|
// 均只下载关键序列
|
|
|
|
|
if (!isCurrentTask && study.IsCriticalSequence) {
|
|
|
|
|
series.imageIds.map(image => {
|
|
|
|
|
priority = priority - 1
|
|
|
|
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
@ -609,47 +706,16 @@ export default {
|
|
|
|
|
})
|
|
|
|
|
this.loopLoad()
|
|
|
|
|
},
|
|
|
|
|
loadImages2(taskInfo) {
|
|
|
|
|
var priority = parseInt(new Date().getTime())
|
|
|
|
|
// 当前任务只自动下载层厚为5mm 或者影像数量小于 100张
|
|
|
|
|
if (taskInfo.IsCurrentTask) {
|
|
|
|
|
this.studyList.map((study, studyIndex) => {
|
|
|
|
|
study.SeriesList.map((series, seriesIndex) => {
|
|
|
|
|
var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
|
|
|
|
if (sliceThickness === 5 || series.instanceCount <= 100) {
|
|
|
|
|
series.imageIds.map(image => {
|
|
|
|
|
priority = priority - 1
|
|
|
|
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
this.loopLoad()
|
|
|
|
|
} else {
|
|
|
|
|
// 非当前任务只自动下载关键序列
|
|
|
|
|
var idx = this.studyList.findIndex(study => study.IsCriticalSequence)
|
|
|
|
|
if (idx === -1) return
|
|
|
|
|
|
|
|
|
|
this.studyList[idx].SeriesList.forEach((series, seriesIndex) => {
|
|
|
|
|
if (!series.loadStatus) {
|
|
|
|
|
series.imageIds.map(image => {
|
|
|
|
|
priority--
|
|
|
|
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: idx, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
this.loopLoad()
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
loopLoad() {
|
|
|
|
|
if (this.imageList.length > 0) {
|
|
|
|
|
requestPoolManager.startTaskTimer()
|
|
|
|
|
// requestPoolManager.startTaskTimer()
|
|
|
|
|
this.imageList.map(image => {
|
|
|
|
|
requestPoolManager.loadAndCacheImagePlus(image.imageId, image.seriesId, image.priority).then(res => {
|
|
|
|
|
this.imageLoaded(image, res.data.string('x0020000e'))
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
requestPoolManager.sortTaskPool()
|
|
|
|
|
|
|
|
|
|
this.imageList = []
|
|
|
|
|
}
|
|
|
|
@ -659,15 +725,26 @@ export default {
|
|
|
|
|
console.log('loadSeries')
|
|
|
|
|
this.loopLoadStatus = -1
|
|
|
|
|
this.$set(this.studyList[studyIndex].SeriesList[seriesIndex], 'isLoading', true)
|
|
|
|
|
const priority = parseInt(new Date().getTime())
|
|
|
|
|
series.imageIds.map(image => {
|
|
|
|
|
if (series.imageloadedArr.indexOf(image) === -1) {
|
|
|
|
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
var isAddToTakPool = false
|
|
|
|
|
if (this.showSeriesList.includes(`${studyIndex}_${seriesIndex}`)) {
|
|
|
|
|
isAddToTakPool = true
|
|
|
|
|
} else {
|
|
|
|
|
this.showSeriesList.push(`${studyIndex}_${seriesIndex}`)
|
|
|
|
|
}
|
|
|
|
|
if (!isAddToTakPool) {
|
|
|
|
|
const priority = parseInt(new Date().getTime())
|
|
|
|
|
series.imageIds.map(image => {
|
|
|
|
|
const index = this.cachedImages.findIndex(item => item.uri === image)
|
|
|
|
|
if (index === -1) {
|
|
|
|
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
if (this.imageList.length > 0) {
|
|
|
|
|
this.loopLoadStatus = 0
|
|
|
|
|
this.loopLoad()
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
if (this.imageList.length > 0) {
|
|
|
|
|
this.loopLoadStatus = 0
|
|
|
|
|
this.loopLoad()
|
|
|
|
|
} else {
|
|
|
|
|
requestPoolManager.changePriority(series.seriesId)
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// 暂停下载
|
|
|
|
@ -677,47 +754,81 @@ export default {
|
|
|
|
|
this.$set(this.studyList[studyIndex].SeriesList[seriesIndex], 'isLoading', false)
|
|
|
|
|
},
|
|
|
|
|
async imageLoaded(image, seriesUid) {
|
|
|
|
|
await store.dispatch('reading/updateStudyList', { visitTaskId: image.visitTaskId, imageId: image.imageId, seriesUid })
|
|
|
|
|
// await store.dispatch('reading/updateStudyList', { visitTaskId: image.visitTaskId, imageId: image.imageId, seriesUid })
|
|
|
|
|
// console.log(this.studyList[image.studyIndex].SeriesList[image.seriesIndex])
|
|
|
|
|
if (image.studyIndex > -1 && image.seriesIndex > -1) {
|
|
|
|
|
var prefetchInstanceCount = this.studyList[image.studyIndex].SeriesList[image.seriesIndex].prefetchInstanceCount
|
|
|
|
|
var instanceCount = this.studyList[image.studyIndex].SeriesList[image.seriesIndex].instanceCount
|
|
|
|
|
if (this.studyList[image.studyIndex].SeriesList[image.seriesIndex].imageloadedArr.indexOf(image.imageId) < 0) {
|
|
|
|
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].imageloadedArr.push(image.imageId)
|
|
|
|
|
prefetchInstanceCount = prefetchInstanceCount + 1
|
|
|
|
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].prefetchInstanceCount = prefetchInstanceCount
|
|
|
|
|
}
|
|
|
|
|
if (prefetchInstanceCount >= instanceCount) {
|
|
|
|
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].prefetchInstanceCount = this.studyList[image.studyIndex].SeriesList[image.seriesIndex].instanceCount
|
|
|
|
|
// 设置当前序列状态为已下载完成
|
|
|
|
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].loadStatus = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// store.dispatch('reading/updateSeriesList', { visitTaskindex: this.visitTaskIdx, studyIndex: image.studyIndex, seriesIndex: image.seriesIndex, imageId: image.imageId })
|
|
|
|
|
},
|
|
|
|
|
// instance下载成功回调
|
|
|
|
|
async cornerstoneImageLoaded(e) {
|
|
|
|
|
await store.dispatch('reading/updateStudyList', { visitTaskId: this.visitTaskId, imageId: e.detail.image.imageId, seriesUid: e.detail.image.data.string('x0020000e') })
|
|
|
|
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
|
|
|
|
this.studyList = this.visitTaskList[idx].StudyList
|
|
|
|
|
if (!this.studyList || this.studyList.length === 0) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
const uri = e.detail.image.sharedCacheKey
|
|
|
|
|
const index = this.cachedImages.findIndex(item => item.uri === uri)
|
|
|
|
|
if (index === -1) {
|
|
|
|
|
this.cachedImages.push({ uri: uri, timestamp: new Date().getTime() })
|
|
|
|
|
} else {
|
|
|
|
|
this.cachedImages[index].timestamp = new Date().getTime()
|
|
|
|
|
}
|
|
|
|
|
var imageId = e.detail.image.imageId
|
|
|
|
|
var seriesUid = e.detail.image.data.string('x0020000e')
|
|
|
|
|
var studyIndex = -1
|
|
|
|
|
var seriesIndex = -1
|
|
|
|
|
for (let i = 0; i < this.studyList.length; ++i) {
|
|
|
|
|
for (let j = 0; j < this.studyList[i].SeriesList.length; ++j) {
|
|
|
|
|
if (this.studyList[i].SeriesList[j].seriesUid === seriesUid) {
|
|
|
|
|
studyIndex = i
|
|
|
|
|
seriesIndex = j
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (studyIndex > 0) break
|
|
|
|
|
}
|
|
|
|
|
if (seriesIndex < 0) return
|
|
|
|
|
// var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
|
|
|
|
// if (idx === -1) return
|
|
|
|
|
// this.studyList = this.visitTaskList[idx].StudyList
|
|
|
|
|
// if (!this.studyList || this.studyList.length === 0) {
|
|
|
|
|
// return
|
|
|
|
|
// }
|
|
|
|
|
// if (!this.visitTaskList[idx].IsInit) {
|
|
|
|
|
// const loading = this.$loading({ fullscreen: true })
|
|
|
|
|
// await store.dispatch('reading/getMeasuredData', this.visitTaskList[idx].VisitTaskId)
|
|
|
|
|
// await store.dispatch('reading/getStudyInfo', { trialId: this.trialId, subjectVisitId: this.visitTaskList[idx].VisitId, visitTaskId: this.visitTaskList[idx].VisitTaskId, taskBlindName: this.visitTaskList[idx].TaskBlindName })
|
|
|
|
|
// await store.dispatch('reading/getReadingQuestionAndAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[idx].VisitTaskId })
|
|
|
|
|
// await store.dispatch('reading/getDicomReadingQuestionAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[idx].VisitTaskId })
|
|
|
|
|
// await store.dispatch('reading/setStatus', { visitTaskId: this.visitTaskList[idx].VisitTaskId })
|
|
|
|
|
// loading.close()
|
|
|
|
|
// }
|
|
|
|
|
// await store.dispatch('reading/updateStudyList', { visitTaskId: this.visitTaskId, imageId: e.detail.image.imageId, seriesUid: e.detail.image.data.string('x0020000e') })
|
|
|
|
|
// const uri = e.detail.image.sharedCacheKey
|
|
|
|
|
// const index = this.cachedImages.findIndex(item => item.uri === uri)
|
|
|
|
|
// if (index === -1) {
|
|
|
|
|
// this.cachedImages.push({ uri: uri, timestamp: new Date().getTime() })
|
|
|
|
|
// } else {
|
|
|
|
|
// this.cachedImages[index].timestamp = new Date().getTime()
|
|
|
|
|
// }
|
|
|
|
|
// var imageId = e.detail.image.imageId
|
|
|
|
|
// var seriesUid = e.detail.image.data.string('x0020000e')
|
|
|
|
|
// var studyIndex = -1
|
|
|
|
|
// var seriesIndex = -1
|
|
|
|
|
// for (let i = 0; i < this.studyList.length; ++i) {
|
|
|
|
|
// for (let j = 0; j < this.studyList[i].SeriesList.length; ++j) {
|
|
|
|
|
// if (this.studyList[i].SeriesList[j].seriesUid === seriesUid) {
|
|
|
|
|
// studyIndex = i
|
|
|
|
|
// seriesIndex = j
|
|
|
|
|
// break
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// if (studyIndex > 0) break
|
|
|
|
|
// }
|
|
|
|
|
// if (seriesIndex < 0) return
|
|
|
|
|
|
|
|
|
|
const imageIdIndex = this.studyList[studyIndex].SeriesList[seriesIndex].imageIds.indexOf(imageId)
|
|
|
|
|
if (imageIdIndex < 0) return
|
|
|
|
|
if (this.studyList[studyIndex].SeriesList[seriesIndex].imageloadedArr.indexOf(imageId) < 0) {
|
|
|
|
|
if (this.studyList[studyIndex].SeriesList[seriesIndex].prefetchInstanceCount >= this.studyList[studyIndex].SeriesList[seriesIndex].instanceCount) {
|
|
|
|
|
// 设置当前序列状态为已下载完成
|
|
|
|
|
this.studyList[studyIndex].SeriesList[seriesIndex].loadStatus = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// const imageIdIndex = this.studyList[studyIndex].SeriesList[seriesIndex].imageIds.indexOf(imageId)
|
|
|
|
|
// if (imageIdIndex < 0) return
|
|
|
|
|
// if (this.studyList[studyIndex].SeriesList[seriesIndex].imageloadedArr.indexOf(imageId) < 0) {
|
|
|
|
|
// if (this.studyList[studyIndex].SeriesList[seriesIndex].prefetchInstanceCount >= this.studyList[studyIndex].SeriesList[seriesIndex].instanceCount) {
|
|
|
|
|
// // 设置当前序列状态为已下载完成
|
|
|
|
|
// this.studyList[studyIndex].SeriesList[seriesIndex].loadStatus = true
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
},
|
|
|
|
|
cornerstoneimagecachechanged(e) {
|
|
|
|
|
const cacheInfo = cornerstone.imageCache.getCacheInfo()
|
|
|
|
|
console.log(cacheInfo)
|
|
|
|
|
},
|
|
|
|
|
cornerstoneimagecachefull(e) {
|
|
|
|
|
console.log('超过内存了')
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -730,6 +841,7 @@ export default {
|
|
|
|
|
width:100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
overflow-x: hidden;
|
|
|
|
|
.dicom-desc{
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
font-size: 13px;
|
|
|
|
@ -746,7 +858,7 @@ export default {
|
|
|
|
|
background-color: #607d8b!important;
|
|
|
|
|
border: 1px solid #607d8b!important;
|
|
|
|
|
}
|
|
|
|
|
/deep/ .el-progress__text{
|
|
|
|
|
/deep/.el-progress__text{
|
|
|
|
|
color: #ccc;
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
}
|
|
|
|
@ -812,18 +924,18 @@ export default {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.el-collapse{
|
|
|
|
|
/deep/.el-collapse{
|
|
|
|
|
border: none;
|
|
|
|
|
/deep/ .el-collapse-item{
|
|
|
|
|
.el-collapse-item{
|
|
|
|
|
background-color: #000!important;
|
|
|
|
|
color: #ddd;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
/deep/ .el-collapse-item__content{
|
|
|
|
|
.el-collapse-item__content{
|
|
|
|
|
padding-bottom:5px;
|
|
|
|
|
background-color: #000!important;
|
|
|
|
|
}
|
|
|
|
|
/deep/ .el-collapse-item__header{
|
|
|
|
|
.el-collapse-item__header{
|
|
|
|
|
background-color: #000!important;
|
|
|
|
|
color: #ddd;
|
|
|
|
|
border-bottom-color:#5a5a5a;
|
|
|
|
@ -832,5 +944,33 @@ export default {
|
|
|
|
|
line-height: 20px;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.sr-wrapper{
|
|
|
|
|
/deep/.el-dialog{
|
|
|
|
|
background: #fff !important;
|
|
|
|
|
border: 1px solid #ddd;
|
|
|
|
|
// color: #ddd;
|
|
|
|
|
.el-dialog__title{
|
|
|
|
|
color:#fff;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/deep/.sr-dialog-container{
|
|
|
|
|
margin-top: 50px !important;
|
|
|
|
|
width:75%;
|
|
|
|
|
height:80%;
|
|
|
|
|
}
|
|
|
|
|
/deep/.el-dialog__body{
|
|
|
|
|
padding: 10px;
|
|
|
|
|
height: calc(100% - 50px);
|
|
|
|
|
}
|
|
|
|
|
.el-dialog__header{
|
|
|
|
|
position: relative;
|
|
|
|
|
}
|
|
|
|
|
.sr-full-dialog-container{
|
|
|
|
|
/deep/.is-fullscreen .el-dialog__body{
|
|
|
|
|
height: calc(100% - 50px);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</style>
|
|
|
|
|