纵隔血池、肝脏血池、脾尖、脾底标记保存优化

uat_us
caiyiling 2024-03-22 13:26:04 +08:00
parent a51d613633
commit 994598c216
18 changed files with 563 additions and 277 deletions

View File

@ -1127,8 +1127,8 @@ export default {
// resolve()
// })
cornerstone.loadAndCacheImage(this.stack.imageIds[this.stack.currentImageIdIndex])
.then(image => {
scope.onFirstImageLoaded(image)
.then(async image => {
await scope.onFirstImageLoaded(image)
resolve()
})
.catch((error) => {
@ -1141,7 +1141,7 @@ export default {
},
onFirstImageLoaded(image) {
console.log('onFirstImageLoaded')
return new Promise(async resolve => {
const element = this.$refs.canvas
var viewport = cornerstone.getDefaultViewportForImage(this.canvas, image)
cornerstone.displayImage(this.canvas, image, viewport)
@ -1219,6 +1219,8 @@ export default {
this.stack.instanceId = instanceId
this.height = (this.stack.currentImageIdIndex) * 100 / (this.stack.imageIds.length - 1)
this.resetWwwc()
resolve()
})
},
onNewImage(e) {
console.log('cornerstonenewimage')

View File

@ -828,7 +828,7 @@ export default {
activeSeries: {
immediate: true,
handler(v) {
if (v) {
if (v && v.isCurrentTask && this.studyList.length === 0) {
this.activeTaskInfo.taskName = v.taskBlindName
this.activeTaskInfo.visitTaskId = v.visitTaskId
const i = this.visitTaskList.findIndex(i => i.VisitTaskId === v.visitTaskId)
@ -838,8 +838,6 @@ export default {
studyList = studyList.filter(i => !i.IsCriticalSequence && i.Modalities.indexOf('CT') !== -1 && i.Modalities.indexOf('PT') !== -1)
if (studyList.length === 0) return
this.studyList = studyList
} else {
this.studyList = []
}
}
}
@ -887,24 +885,48 @@ export default {
}
console.log('getMeasureData')
})
DicomEvent.$on('getScreenshots', async(callback) => {
DicomEvent.$on('getScreenshots', async(measuredData, callback) => {
if (this.currentDicomCanvasIndex > -1) {
if (!measuredData) return
await this.imageLocation(measuredData)
setTimeout(async() => {
// var base64Str = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].getScreenshots()
const divForDownloadViewport = document.querySelector(
`div[data-canvas-uid="dicomCanvas${this.currentDicomCanvasIndex}"]`
)
var canvas = await html2canvas(divForDownloadViewport)
var base64Str = canvas.toDataURL('image/png', 1)
callback(base64Str)
}
console.log('getScreenshots')
callback(base64Str)
}, 50)
}
})
DicomEvent.$on('imageLocation', measuredData => {
DicomEvent.$on('imageLocation', async(measuredData) => {
return new Promise(async resolve => {
if (!measuredData) return
this.imageLocation(measuredData)
await this.imageLocation(measuredData)
console.log('imageLocation')
resolve()
})
})
// DicomEvent.$on('imageLocation', async(measuredData, callback) => {
// if (measuredData) {
// await this.imageLocation(measuredData)
// }
// console.log('imageLocation')
// this.$nextTick(() => {
// if (callback) {
// callback()
// }
// })
// })
// DicomEvent.$on('imageLocation', measuredData => {
// if (!measuredData) return
// this.imageLocation(measuredData)
// console.log('imageLocation')
// })
DicomEvent.$on('setReadingState', readingTaskState => {
this.canvasObj[this.currentDicomCanvasIndex].readingTaskState = readingTaskState
if (this.activeTool) {
@ -934,6 +956,11 @@ export default {
if (!this.petctWindow) return
this.petctWindow.postMessage({ type: 'setReadingState', data: data }, window.location)
})
DicomEvent.$on('reload', () => {
if (this.petctWindow) {
this.petctWindow.close()
}
})
},
beforeDestroy() {
DicomEvent.$off('updateImage')
@ -945,6 +972,7 @@ export default {
DicomEvent.$off('setMeasuredToolsPassive')
DicomEvent.$off('readingPageUpdate')
DicomEvent.$off('setReadingState')
DicomEvent.$off('reload')
if (this.petctWindow) {
this.petctWindow.close()
}
@ -1302,7 +1330,8 @@ export default {
// 访
//
async imageLocation(obj) {
imageLocation(obj) {
return new Promise(async resolve => {
var loading = null
var loadImagePromises = []
var isScrollSync = this.isScrollSync
@ -1314,7 +1343,10 @@ export default {
var activeCanvasTaskId = obj.visitTaskId
var index = this.visitTaskList.findIndex(i => i.VisitTaskId === activeCanvasTaskId)
if (index === -1) return
if (index === -1) {
resolve()
return
}
var firstAddSeries = null
var currentAddSeries = null
@ -1366,6 +1398,7 @@ export default {
loading && loading.close()
this.isScrollSync = isScrollSync
this.setToolToTarget(obj)
resolve()
return
} else if (firstAddSeries && !currentAddSeries) {
// 访
@ -1400,10 +1433,14 @@ export default {
.then(() => {
this.isScrollSync = isScrollSync
this.setToolToTarget(obj)
resolve()
}).catch(() => {
resolve()
})
if (loading) {
loading.close()
}
})
},
setToolToTarget(obj) {
if (obj.readingTaskState < 2 && obj.markTool && !obj.isMarked) {

View File

@ -75,7 +75,10 @@ export default {
translateX: 0,
pageSize: 0, //
previewImages: [],
imgSize: { width: '120px', height: '120px' }
imgSize: { width: '120px', height: '120px' },
lesionId: '',
visitTaskId: '',
questionType: null
}
},
computed: {
@ -112,7 +115,10 @@ export default {
store.dispatch('user/setToken', this.$route.query.TokenKey)
changeURLStatic('TokenKey', '')
}
this.lesionId = this.$route.query.rowId
this.lesionId = this.$route.query.rowId ? this.$route.query.rowId : ''
this.visitTaskId = this.$route.query.visitTaskId ? this.$route.query.visitTaskId : ''
var questionType = this.$route.query.questionType
this.questionType = questionType ? Number(questionType) : null
this.initPage()
},
methods: {
@ -128,7 +134,7 @@ export default {
getScreenshot() {
return new Promise(resolve => {
const loading = this.$loading({ fullscreen: true })
getPreviousOtherPicturePath({ rowId: this.lesionId }).then(res => {
getPreviousOtherPicturePath({ rowId: this.lesionId, visitTaskId: this.visitTaskId, questionType: this.questionType }).then(res => {
this.previewImages = res.Result
if (this.previewImages.length === 0) {
this.$alert(this.$t('trials:lugano:message:noScreenshot'), this.$t('trials:lugano:message:warnTip'), {

View File

@ -483,6 +483,7 @@ export default {
{ label: this.$t('trials:reading:button:rotateTurnRight'), val: 5 }// 90
],
isCurrentTask: false,
isBaseLineTask: false,
ctSeries: {},
petSeries: {},
renderingEngineId: renderingEngineId,
@ -562,6 +563,7 @@ export default {
this.subjectCode = this.$route.query.subjectCode
this.taskBlindName = this.$route.query.taskBlindName
this.isCurrentTask = this.$route.query.isCurrentTask === 'true'
this.isBaseLineTask = this.$route.query.isCurrentTask === 'true'
this.customWwc = { visible: false, title: this.$t('trials:reading:dagTitle:wwwcCustom') }
const digitPlaces = parseInt(this.$route.query.digitPlaces)
this.digitPlaces = digitPlaces === -1 ? 2 : digitPlaces
@ -606,9 +608,10 @@ export default {
console.log('imageLocation')
this.imageLocation(obj)
})
FusionEvent.$on('getScreenshots', async(callback) => {
FusionEvent.$on('getScreenshots', async(measuredData, callback) => {
// var base64Str = await this.$refs['FUSION_AXIAL'].getScreenshots()
const loading = this.$loading({ fullscreen: true })
await this.imageLocation(measuredData)
const divForDownloadViewport = document.querySelector(
'.dicom-container'
)
@ -712,8 +715,9 @@ export default {
const debouncedCallback = this.debounce((e) => {
const { annotation } = e.detail
const { remark } = annotation.data
if (this.initAnnotations.length > 0 && this.initAnnotations[0].orderMark === remark && !this.initAnnotations[0].isInit) {
this.initAnnotations[0].isInit = true
var idx = this.initAnnotations.findIndex(i => i.orderMark === remark)
if (this.initAnnotations.length > 0 && idx > -1 && this.initAnnotations[idx].orderMark === remark && !this.initAnnotations[idx].isInit) {
this.initAnnotations[idx].isInit = true
} else {
this.onAnnotationModified(e)
}
@ -1972,8 +1976,13 @@ export default {
})
},
imageLocation(obj) {
return new Promise(resolve => {
console.log('imageLocation')
this.setToolToTarget(obj)
if (!obj.otherMeasureData) return
if (!obj.otherMeasureData) {
resolve()
return
}
this.isLocate = true
const { metadata } = obj.otherMeasureData
var imageArr = metadata.referencedImageId.split('/')
@ -1986,14 +1995,14 @@ export default {
if (index > -1) {
viewportId = 'PT_AXIAL'
this.$refs[viewportId].scroll(index)
return
}
index = this.ctSeries.instanceList.findIndex(i => i === instanceId)
if (index > -1) {
viewportId = 'CT_AXIAL'
this.$refs[viewportId].scroll(index)
return
}
resolve()
})
},
setToolToTarget(obj) {
var toolGroupIds = [ctToolGroupId, ptToolGroupId, fusionToolGroupId]

View File

@ -35,16 +35,24 @@
<!-- 测量 -->
<el-button v-if="(!questionForm[question.Id] && ((question.QuestionType === 51 && liverIsInsideVolume) || (question.QuestionType === 52 && lungIsInsideVolume)) && readingTaskState!== 2)" size="mini" type="text" @click="addAnnotation(question)">{{ $t('trials:lugano:button:addAnnotation') }}</el-button>
<!-- 清除标记 -->
<el-button v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume)) && readingTaskState!== 2" size="mini" type="text" style="padding: 7px 5px;" @click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button>
<el-button v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume)) && readingTaskState!== 2" size="mini" type="text" style="padding: 7px 5px;margin-left:5px;" @click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button>
<!-- 定位 -->
<el-button
v-if="(questionForm[question.Id] || (question.QuestionType === 51 && !liverIsInsideVolume) || (question.QuestionType === 52 && !lungIsInsideVolume))"
size="mini"
type="text"
style="padding: '7px 5px'"
:style="{marginLeft: readingTaskState!== 2?'-5px':'5px'}"
style="padding: '7px 5px';margin-left:-5px;"
@click="locateAnnotation(question)"
>{{ $t('trials:lugano:button:locateAnnotation') }}</el-button>
<!-- 保存 -->
<el-button v-if="questionForm[question.Id] && readingTaskState!== 2 && question.SaveEnum === 1" size="mini" type="text" style="padding: '7px 5px';margin-left:-5px;" @click="saveAnnotation(question)">
<!-- 未保存 -->
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" />
</el-tooltip>
{{ $t('common:button:save') }}
</el-button>
<el-button v-if="!question.IsBaseLineTask" size="mini" type="text" style="padding: '7px 5px';margin-left:-5px;" @click="viewAnnotations(question)">{{ $t('trials:lugano:button:suvscreenshot') }}</el-button>
</div>
</template>
<template v-else-if="question.QuestionType === 53">
@ -339,11 +347,16 @@ export default {
FusionEvent.$emit('removeAnnotation', question)
})
.catch(() => {})
},
locateAnnotation(question) {
FusionEvent.$emit('locateAnnotation', question)
},
saveAnnotation(question) {
FusionEvent.$emit('saveAnnotation', question)
},
viewAnnotations(question) {
FusionEvent.$emit('viewAnnotations', question)
},
async uploadScreenshot(param) {
if (!this.visitTaskId) return
const loading = this.$loading({

View File

@ -33,9 +33,11 @@
<script>
import { saveImageQuality, getDicomReadingQuestionAnswer, getReadingCalculationData } from '@/api/trials'
import { getToken } from '@/utils/auth'
import QuestionItem from './QuestionItem'
import { mapGetters } from 'vuex'
import FusionEvent from './FusionEvent'
export default {
name: 'ECRF',
components: {
@ -103,6 +105,7 @@ export default {
this.resetSuvQuestions()
})
FusionEvent.$on('addAnnotation', obj => {
this.$set(obj, 'SaveEnum', 0)
this.addAnnotation(obj)
})
FusionEvent.$on('removeAnnotation', obj => {
@ -111,6 +114,13 @@ export default {
FusionEvent.$on('locateAnnotation', obj => {
this.locateAnnotation(obj)
})
FusionEvent.$on('saveAnnotation', obj => {
this.saveAnnotation(obj)
})
FusionEvent.$on('viewAnnotations', obj => {
console.log('viewAnnotations')
this.viewAnnotations(obj)
})
},
beforeDestroy() {
FusionEvent.$off('refreshQuestions')
@ -193,10 +203,12 @@ export default {
if (i.QuestionType === 51) {
// SUVmax(51);
this.liverSuvmaxId = i.Id
this.$set(i, 'SaveEnum', 0)
}
if (i.QuestionType === 52) {
// SUVmax(52);
this.lungSuvmaxId = i.Id
this.$set(i, 'SaveEnum', 0)
}
if (i.QuestionType === 53) {
// SUVmax;
@ -223,18 +235,7 @@ export default {
handleSave() {
this.$refs['questions'].validate((valid) => {
if (!valid) return
if (!this.lungIsInsideVolume || !this.liverIsInsideVolume) {
//
this.$alert(this.$t('trials:reading:lugano:warnning:outsideVolume'), this.$t('trials:lugano:fusionDialog:warning'), {
callback: action => {
this.$message({
type: 'info',
message: `action: ${action}`
})
}
})
return
}
// SUVmax
const liverSUVmax = !isNaN(parseFloat(this.questionForm[this.liverSuvmaxId])) ? parseFloat(this.questionForm[this.liverSuvmaxId]) : 0
// SUVmax
@ -268,22 +269,22 @@ export default {
for (const k in this.questionForm) {
answers.push({ id: k, answer: this.questionForm[k] })
}
var questionMarkInfoList = []
this.measurements.forEach(item => {
var i = Object.assign({}, item)
if (i.OtherMeasureData) {
for (const k in i.OtherMeasureData.data.cachedStats) {
i.OtherMeasureData.data.cachedStats[k].pointsInShape = []
}
i.OtherMeasureData = JSON.stringify(i.OtherMeasureData)
}
// var questionMarkInfoList = []
// this.measurements.forEach(item => {
// var i = Object.assign({}, item)
// if (i.OtherMeasureData) {
// for (const k in i.OtherMeasureData.data.cachedStats) {
// i.OtherMeasureData.data.cachedStats[k].pointsInShape = []
// }
// i.OtherMeasureData = JSON.stringify(i.OtherMeasureData)
// }
questionMarkInfoList.push(i)
})
// questionMarkInfoList.push(i)
// })
var params = {
visitTaskId: this.visitTaskId,
answers: answers,
questionMarkInfoList
answers: answers
// questionMarkInfoList
}
saveImageQuality(params).then(async res => {
this.$message.success(this.$t('common:message:savedSuccessfully'))
@ -336,6 +337,70 @@ export default {
FusionEvent.$emit('imageLocation', { otherMeasureData: otherMeasureData })
},
saveAnnotation(question) {
if (!this.lungIsInsideVolume || !this.liverIsInsideVolume) {
//
this.$alert(this.$t('trials:reading:lugano:warnning:outsideVolume'), this.$t('trials:lugano:fusionDialog:warning'), {
callback: action => {
this.$message({
type: 'info',
message: `action: ${action}`
})
}
})
return
}
const loading = this.$loading({ fullscreen: true })
//
var answers = []
var questionMarkInfoList = []
var annotationObj = this.measurements.find(i => i.QuestionType === question.QuestionType)
if (!annotationObj) {
loading.close()
return
}
FusionEvent.$emit('getScreenshots', { otherMeasureData: annotationObj.OtherMeasureData }, async val => {
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
var picturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
if (annotationObj && annotationObj.OtherMeasureData) {
var otherMeasureData = Object.assign({}, annotationObj.OtherMeasureData)
for (const k in otherMeasureData.data.cachedStats) {
otherMeasureData.data.cachedStats[k].pointsInShape = []
}
annotationObj.OtherMeasureData = JSON.stringify(otherMeasureData)
annotationObj.OtherPicturePath = picturePath
questionMarkInfoList.push(annotationObj)
}
for (const k in this.questionForm) {
if (k === question.Id) {
answers.push({ id: k, answer: this.questionForm[k] })
break
}
}
var params = {
visitTaskId: this.visitTaskId,
answers,
questionMarkInfoList
}
saveImageQuality(params).then(async res => {
this.$message.success(this.$t('common:message:savedSuccessfully'))
loading.close()
this.$set(question, 'SaveEnum', 0)
window.opener.postMessage({ type: 'petctLesionUpdate' }, window.location)
}).catch(() => {
loading.close()
})
})
},
viewAnnotations(question) {
var token = getToken()
var subjectCode = this.$route.query.subjectCode
var path = `/historyScreenshot?&subjectCode=${subjectCode}&visitTaskId=${this.visitTaskId}&questionType=${question.QuestionType}&TokenKey=${token}`
const routeData = this.$router.resolve({ path })
window.open(routeData.href, '_blank')
},
setMeasuredData(measurement) {
if (measurement.data.isHandleOutsideImage) {
this.setOutsideMeasuredData(measurement)
@ -374,6 +439,19 @@ export default {
}
FusionEvent.$emit('addOrUpdateAnnotations', { data })
this.questionFormChangeState = true
this.setQuestionStatus(this.questions, this.measurements[idx].QuestionType)
}
},
setQuestionStatus(obj, questionType) {
console.log(obj, questionType)
for (let i = 0; i < obj.length; i++) {
if (obj[i].QuestionType === questionType) {
this.$set(obj[i], 'SaveEnum', 1)
break
}
if (obj[i].Childrens && obj[i].Childrens.length > 0) {
this.setQuestionStatus(obj[i].Childrens, questionType)
}
}
},
setOutsideMeasuredData(measurement) {
@ -415,6 +493,7 @@ export default {
}
FusionEvent.$emit('addOrUpdateAnnotations', { data })
this.questionFormChangeState = true
this.setQuestionStatus(this.questions, this.measurements[idx].QuestionType)
},
clearMeasuredData(remark) {
var idx = this.measurements.findIndex(i => i.OrderMarkName === remark)
@ -538,6 +617,45 @@ export default {
this.setSuvChild(i.Childrens)
}
})
},
async uploadScreenshots(fileName, file) {
try {
file = this.convertBase64ToBlob(file)
var trialId = this.$route.query.trialId
var subjectId = this.$route.query.trialId
const result = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${fileName}.png`, file)
return { isSuccess: true, result: result }
} catch (e) {
console.log(e)
return { isSuccess: false, result: e }
}
},
convertBase64ToBlob(imageEditorBase64) {
var base64Arr = imageEditorBase64.split(',')
var imgtype = ''
var base64String = ''
if (base64Arr.length > 1) {
// base64
base64String = base64Arr[1]
imgtype = base64Arr[0].substring(
base64Arr[0].indexOf(':') + 1,
base64Arr[0].indexOf(';')
)
}
// base64
var bytes = atob(base64String)
// var bytes = base64;
var bytesCode = new ArrayBuffer(bytes.length)
//
var byteArray = new Uint8Array(bytesCode)
// base64ascii
for (var i = 0; i < bytes.length; i++) {
byteArray[i] = bytes.charCodeAt(i)
}
// Blob
return new Blob([bytesCode], { type: imgtype })
}
}
}

View File

@ -794,7 +794,7 @@ export default {
otherMeasureData.data.cachedStats[k].pointsInShape = []
}
}
FusionEvent.$emit('getScreenshots', async val => {
FusionEvent.$emit('getScreenshots', { otherMeasureData: this.questionForm.OtherMeasureData }, async val => {
// 0线
// 10mm2线
// 15mm2线

View File

@ -205,11 +205,17 @@ export default {
document.addEventListener('mouseup', () => {
this.sliderMouseup()
})
// document.addEventListener('mousewheel', (e) => {
// this.mousewheel(e)
// })
},
destroyed() {
},
methods: {
// mousewheel(e){
// console.log(e)
// },
handleVolumeNewImage(e) {
const { imageIndex } = e.detail
this.seriesInfo.imageIdIndex = imageIndex
@ -297,6 +303,7 @@ export default {
var zoom = viewport.getZoom()
if (!zoom) return
this.imageInfo.zoom = zoom.toFixed(4)
// console.log(e)
},
handleVOIModified(e) {
renderingEngine = getRenderingEngine(this.renderingEngineId)

View File

@ -519,7 +519,7 @@ export default {
item.Answer = this.questionForm[item.Id]
arr.push(item)
})
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionType: this.lesionType }
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }
DicomEvent.$emit('imageLocation', obj)
var type = null
@ -1957,7 +1957,7 @@ export default {
}
}
DicomEvent.$emit('getScreenshots', async val => {
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }, async val => {
// 0线
// 10mm2线
// 15mm2线

View File

@ -640,7 +640,7 @@ export default {
item.Answer = this.questionForm[item.Id] ? this.questionForm[item.Id] : ''
arr.push(item)
})
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionType: this.lesionType }
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }
DicomEvent.$emit('imageLocation', obj)
var type = null
if (this.questionForm.RowId) {
@ -1653,8 +1653,13 @@ export default {
}
}
}
// DicomEvent.$emit('imageLocation', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionName, lesionType: this.lesionType }, () => {
// console.log(11111)
DicomEvent.$emit('getScreenshots', async val => {
// })
// await DicomEvent.$emit('imageLocation', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionName, lesionType: this.lesionType })
// console.log(5555)
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }, async val => {
// 0线
// 10mm2线
// 15mm2线

View File

@ -690,7 +690,7 @@ export default {
}
}
const loading = this.$loading({ fullscreen: true })
DicomEvent.$emit('getScreenshots', async val => {
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }, async val => {
var picturePath = ''
if (val && measureData) {
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)

View File

@ -15,6 +15,7 @@
</div>
<template v-else-if="((question.QuestionType === 56 || question.QuestionType === 57) && question.IsBaseLineTask)" />
<template v-else>
<el-form-item
v-if="(question.ShowQuestion===1 && question.ParentTriggerValueList.includes(String(questionForm[question.ParentId]))) || question.ShowQuestion===0 "
:label="`${question.QuestionName}`"
@ -26,7 +27,8 @@
:class="[question.Type==='group'?'mb':question.Type==='upload'?'uploadWrapper':'']"
>
<template v-if="question.QuestionType === 60 || question.QuestionType === 61">
<div style="display: flex;flex-direction: row;justify-content: flex-start;">
<div style="display: flex;flex-direction: row;justify-content: flex-start;align-items: center;">
<el-input
v-if="question.Type==='calculation'"
v-model="questionForm[question.Id]"
@ -42,7 +44,15 @@
<!-- 清除标记 -->
<el-button v-if="questionForm[question.Id]&& readingTaskState!== 2" size="mini" type="text" @click="removeAnnotation(question)">{{ $t('trials:lugano:button:clearAnnotation') }}</el-button>
<!-- 定位 -->
<el-button v-if="questionForm[question.Id]" size="mini" type="text" style="margin-left: -5px;" @click="locateAnnotation(question)">{{ $t('trials:lugano:button:locateAnnotation') }}</el-button>
<el-button v-if="questionForm[question.Id]" size="mini" type="text" @click="locateAnnotation(question)">{{ $t('trials:lugano:button:locateAnnotation') }}</el-button>
<!-- 保存 -->
<el-button v-if="questionForm[question.Id] && readingTaskState!== 2 && question.SaveEnum === 1" size="mini" type="text" @click="saveAnnotation(question)">
<!-- 未保存 -->
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:unsaved')" placement="bottom">
<i class="el-icon-warning" style="color:red" />
</el-tooltip>
{{ $t('common:button:save') }}
</el-button>
</div>
</template>
@ -361,6 +371,9 @@ export default {
addAnnotation(question) {
DicomEvent.$emit('addAnnotation', question)
},
saveAnnotation(question) {
DicomEvent.$emit('saveAnnotation', question)
},
removeAnnotation(question) {
DicomEvent.$emit('locateAnnotation', question)
//

View File

@ -113,24 +113,31 @@ export default {
DicomEvent.$on('setReadingState', readingTaskState => {
this.readingTaskState = readingTaskState
})
DicomEvent.$on('handleSaveQuestions', readingTaskState => {
this.handleSave()
})
if (this.groupClassify === 3) {
DicomEvent.$on('addAnnotation', obj => {
this.$set(obj, 'SaveEnum', 1)
this.addAnnotation(obj)
})
DicomEvent.$on('removeAnnotation', obj => {
this.removeAnnotation(obj)
})
DicomEvent.$on('saveAnnotation', obj => {
this.saveAnnotation(obj)
})
DicomEvent.$on('locateAnnotation', obj => {
this.locateAnnotation(obj)
})
}
},
beforeDestroy() {
DicomEvent.$off('setReadingState')
if (this.groupClassify === 3) {
DicomEvent.$off('addAnnotation')
DicomEvent.$off('removeAnnotation')
DicomEvent.$off('saveAnnotation')
DicomEvent.$off('locateAnnotation')
}
},
methods: {
async getQuestions(visitTaskId) {
@ -227,10 +234,12 @@ export default {
if (i.QuestionType === 60) {
//
this.spleenTopId = i.Id
this.$set(i, 'SaveEnum', 0)
}
if (i.QuestionType === 61) {
//
this.spleenBottomId = i.Id
this.$set(i, 'SaveEnum', 0)
}
}
if (i.Childrens && i.Childrens.length > 0) {
@ -276,10 +285,6 @@ export default {
this.loading = true
var answers = []
var imageQuality = null
if (this.groupClassify === 3) {
await this.uploadScreenshot()
}
for (const k in this.questionForm) {
answers.push({ id: k, answer: this.questionForm[k] })
if (k === this.imageQualityId) {
@ -291,17 +296,17 @@ export default {
answers: answers
}
if (this.groupClassify === 3) {
var questionMarkInfoList = []
this.measurements.forEach(item => {
var i = Object.assign({}, item)
if (i.MeasureData) {
i.MeasureData = JSON.stringify(i.MeasureData)
}
questionMarkInfoList.push(i)
})
params.questionMarkInfoList = questionMarkInfoList
}
// if (this.groupClassify === 3) {
// var questionMarkInfoList = []
// this.measurements.forEach(item => {
// var i = Object.assign({}, item)
// if (i.MeasureData) {
// i.MeasureData = JSON.stringify(i.MeasureData)
// }
// questionMarkInfoList.push(i)
// })
// params.questionMarkInfoList = questionMarkInfoList
// }
saveImageQuality(params).then(async res => {
this.$message.success(this.$t('common:message:savedSuccessfully'))
@ -359,16 +364,6 @@ export default {
return { isSuccess: false, result: e }
}
},
//
async uploadScreenshot() {
for (let i = 0; i < this.measurements.length; i++) {
if (this.measurements[i].pictureBaseStr) {
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, this.measurements[i].pictureBaseStr)
this.measurements[i].PicturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
this.measurements[i].pictureBaseStr = ''
}
}
},
async uploadScreenshots(fileName, file) {
try {
file = this.convertBase64ToBlob(file)
@ -436,6 +431,73 @@ export default {
this.setSpleenCommentDisplay()
this.formChanged = true
},
saveAnnotation(question) {
this.loading = true
//
var answers = []
var questionMarkInfoList = []
var annotationObj = this.measurements.find(i => i.QuestionType === question.QuestionType)
if (!annotationObj) {
this.loading = false
return
}
DicomEvent.$emit('getScreenshots', { questionId: annotationObj.Id, visitTaskId: this.visitTaskId, lesionName: annotationObj.OrderMarkName, markTool: annotationObj.MarkTool, readingTaskState: this.readingTaskState, isMarked: !!annotationObj.MeasureData }, async val => {
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
var picturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
if (annotationObj && annotationObj.MeasureData) {
annotationObj.MeasureData = JSON.stringify(annotationObj.MeasureData)
annotationObj.PicturePath = picturePath
questionMarkInfoList.push(annotationObj)
}
for (const k in this.questionForm) {
if (k === question.Id) {
answers.push({ id: k, answer: this.questionForm[k] })
break
}
}
var params = {
visitTaskId: this.visitTaskId,
answers,
questionMarkInfoList
}
saveImageQuality(params).then(async res => {
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.loading = false
this.$set(question, 'SaveEnum', 0)
DicomEvent.$emit('getReportInfo', true)
}).catch(() => {
this.loading = false
})
})
// if (this.criterionType === 2 && this.groupClassify === 3) {
// var currentSpleenStatus = this.questionForm[this.spleenStatusId]
// var currentSpleenLength = this.questionForm[this.spleenLengthId]
// currentSpleenStatus = isNaN(parseInt(currentSpleenStatus)) ? null : parseInt(currentSpleenStatus)
// var stIdx = this.measurements.findIndex(i => i.QuestionType === 60)
// var slIdx = this.measurements.findIndex(i => i.QuestionType === 60)
// if (currentSpleenLength && currentSpleenStatus === 5) {
// // '!'
// this.$alert(this.$t('trials:lugano:message:validSpleen1'), this.$t('trials:lugano:fusionDialog:warning'), {
// callback: _ => {}
// })
// } else if (currentSpleenStatus === 5 && ((stIdx > -1 && this.measurements[stIdx].MeasureData) || (slIdx > -1 && this.measurements[slIdx].MeasureData))) {
// //
// this.$alert(this.$t('trials:lugano:message:validSpleen1'), this.$t('trials:lugano:fusionDialog:warning'), {
// callback: _ => {}
// })
// } else if (((stIdx > -1 && this.measurements[stIdx].MeasureData) || (slIdx > -1 && this.measurements[slIdx].MeasureData)) && !currentSpleenLength) {
// this.$alert(this.$t('trials:lugano:message:validSpleen2'), this.$t('trials:lugano:fusionDialog:warning'), {
// callback: _ => {}
// })
// } else {
// this.saveQuestionsList()
// }
// } else {
// this.saveQuestionsList()
// }
// this.saveQuestionsList()
},
locateAnnotation(obj) {
const { Id } = obj
var idx = this.measurements.findIndex(i => i.QuestionId === Id)
@ -504,6 +566,19 @@ export default {
DicomEvent.$emit('questionFormChange', true)
}
this.formChanged = true
this.setQuestionStatus(this.questions, this.measurements[idx].QuestionType)
},
setQuestionStatus(obj, questionType) {
console.log(obj, questionType)
for (let i = 0; i < obj.length; i++) {
if (obj[i].QuestionType === questionType) {
this.$set(obj[i], 'SaveEnum', 1)
break
}
if (obj[i].Childrens && obj[i].Childrens.length > 0) {
this.setQuestionStatus(obj[i].Childrens, questionType)
}
}
},
getSpleenL() {
var length = null

View File

@ -496,7 +496,7 @@ export default {
item.Answer = this.questionForm[item.Id] ? this.questionForm[item.Id] : ''
arr.push(item)
})
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionType: this.lesionType }
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }
DicomEvent.$emit('imageLocation', obj)
var type = null
if (this.questionForm.RowId) {
@ -1319,7 +1319,7 @@ export default {
}
}
DicomEvent.$emit('getScreenshots', async val => {
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }, async val => {
// 0线
// 10mm2线
// 15mm2线

View File

@ -454,7 +454,7 @@ export default {
item.Answer = this.questionForm[item.Id] ? this.questionForm[item.Id] : ''
arr.push(item)
})
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionType: this.lesionType }
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }
DicomEvent.$emit('imageLocation', obj)
var type = null
if (this.questionForm.RowId) {
@ -970,7 +970,7 @@ export default {
}
}
DicomEvent.$emit('getScreenshots', async val => {
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }, async val => {
var picturePath = ''
if (val && measureData) {
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)

View File

@ -690,6 +690,7 @@ export default {
await store.dispatch('reading/setCurrentReadingTaskState', 2)
var isAutoTask = await this.getAutoTaskVal()
if (isAutoTask) {
DicomEvent.$emit('reload')
// DicomEvent.$emit('getNextTask')
window.location.reload()
} else {

View File

@ -78,7 +78,7 @@
</p>
<div class="flex-div">
<div v-if="measureData.findIndex(v=>v.SeriesId === series.seriesId && v.MeasureData) > -1">
<div v-if="measureData && 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;" />
@ -718,7 +718,7 @@ export default {
// requestPoolManager.startTaskTimer()
this.imageList.map(image => {
requestPoolManager.loadAndCacheImagePlus(image.imageId, image.seriesId, image.priority).then(res => {
if(res){
if (res) {
this.imageLoaded(image, res.data.string('x0020000e'))
}
})

View File

@ -78,7 +78,7 @@
</p>
<div class="flex-div">
<div v-if="measureData.findIndex(v=>v.SeriesId === series.seriesId && v.MeasureData) > -1">
<div v-if="measureData && 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;" />