非dicom阅片问题绑定标记
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
5565b1389d
commit
7426be2e50
|
|
@ -294,3 +294,12 @@ export function readingImport(param) {
|
||||||
data: param
|
data: param
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 非dicom阅片保存标记
|
||||||
|
export function saveAnswerAndBindingNoneDicomMark(param) {
|
||||||
|
return request({
|
||||||
|
url: `/ReadingImageTask/saveAnswerAndBindingNoneDicomMark`,
|
||||||
|
method: 'post',
|
||||||
|
data: param
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
import { getCustomTableQuestionAnswer, changeDicomReadingQuestionAnswer, submitVisitTaskQuestionsInDto, verifyVisitTaskQuestions, getQuestionCalculateRelation, saveTaskQuestion } from '@/api/trials'
|
import { getCustomTableQuestionAnswer, changeDicomReadingQuestionAnswer, submitVisitTaskQuestionsInDto, verifyVisitTaskQuestions, getQuestionCalculateRelation, saveTaskQuestion } from '@/api/trials'
|
||||||
import { setSkipReadingCache, resetReadingTask, saveTableQuestionMark } from '@/api/reading'
|
import { setSkipReadingCache, resetReadingTask, saveTableQuestionMark, saveAnswerAndBindingNoneDicomMark } from '@/api/reading'
|
||||||
import const_ from '@/const/sign-code'
|
import const_ from '@/const/sign-code'
|
||||||
import QuestionFormItem from './QuestionFormItem'
|
import QuestionFormItem from './QuestionFormItem'
|
||||||
import SignForm from '@/views/trials/components/newSignForm'
|
import SignForm from '@/views/trials/components/newSignForm'
|
||||||
|
|
@ -76,6 +76,10 @@ export default {
|
||||||
readingTaskState: {
|
readingTaskState: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
isNoneDicom: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|
@ -127,7 +131,8 @@ export default {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
try {
|
try {
|
||||||
const param = {
|
const param = {
|
||||||
visitTaskId: this.visitTaskId
|
visitTaskId: this.visitTaskId,
|
||||||
|
IsDicomReading: !this.isNoneDicom
|
||||||
}
|
}
|
||||||
const res = await getCustomTableQuestionAnswer(param)
|
const res = await getCustomTableQuestionAnswer(param)
|
||||||
if (res.IsSuccess) {
|
if (res.IsSuccess) {
|
||||||
|
|
@ -154,7 +159,11 @@ export default {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
this.questions = res.Result.SinglePage
|
this.questions = res.Result.SinglePage
|
||||||
|
if (this.isNoneDicom) {
|
||||||
|
this.$emit("setIsHaveBindingQuestion", res.OtherInfo.IsHaveBindingQuestion)
|
||||||
|
}
|
||||||
this.questionsMarkStatus = {}
|
this.questionsMarkStatus = {}
|
||||||
|
this.questionMarkInfoList = []
|
||||||
this.questionMarkInfoList = res.OtherInfo.QuestionMarkInfoList.map(i => {
|
this.questionMarkInfoList = res.OtherInfo.QuestionMarkInfoList.map(i => {
|
||||||
if (i.RowId) {
|
if (i.RowId) {
|
||||||
this.$set(this.questionsMarkStatus, `${i.RowId}_${i.TableQuestionId}`, { isMarked: i.MeasureData !== '', isSaved: true, OrderMarkName: i.OrderMarkName })
|
this.$set(this.questionsMarkStatus, `${i.RowId}_${i.TableQuestionId}`, { isMarked: i.MeasureData !== '', isSaved: true, OrderMarkName: i.OrderMarkName })
|
||||||
|
|
@ -353,162 +362,6 @@ export default {
|
||||||
const i = this.questionMarkInfoList.findIndex(i => i.MeasureData && i.MeasureData.annotationUID === annotation.annotationUID)
|
const i = this.questionMarkInfoList.findIndex(i => i.MeasureData && i.MeasureData.annotationUID === annotation.annotationUID)
|
||||||
return i > -1
|
return i > -1
|
||||||
},
|
},
|
||||||
// async operateImageMarker(obj) {
|
|
||||||
// this.operateStateEnum = obj.operateStateEnum
|
|
||||||
// this.isTableQuestion = obj.question.IsTableQuestion ? true : false
|
|
||||||
// this.imageTool = obj.question.ImageTool
|
|
||||||
// this.imageToolAttribute = obj.question.ImageToolAttribute
|
|
||||||
// this.operateQuestionId = obj.question.Id
|
|
||||||
// this.operateRowId = obj.question.RowId
|
|
||||||
// this.operateParentQsId = obj.question.ParentQsId
|
|
||||||
// if (obj.operateStateEnum === 0) {
|
|
||||||
// // 绑定标记
|
|
||||||
// this.$emit('setReadingToolPassive')
|
|
||||||
// } else if (obj.operateStateEnum === 1) {
|
|
||||||
// // 添加标记
|
|
||||||
// this.$emit('setReadingToolActive', obj.question.ImageTool)
|
|
||||||
// } else if (obj.operateStateEnum === 2) {
|
|
||||||
// // 查看标记
|
|
||||||
// let i = -1
|
|
||||||
// if (this.isTableQuestion) {
|
|
||||||
// if (this.operateRowId) {
|
|
||||||
// i = this.questionMarkInfoList.findIndex(i => i.TableQuestionId === obj.question.Id && i.RowId === this.operateRowId)
|
|
||||||
// } else {
|
|
||||||
// i = this.questionMarkInfoList.findIndex(i => i.TableQuestionId === obj.question.Id && !i.RowId)
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// i = this.questionMarkInfoList.findIndex(i => i.QuestionId === obj.question.Id)
|
|
||||||
// }
|
|
||||||
// if (i > -1) {
|
|
||||||
// const annotation = this.questionMarkInfoList[i].MeasureData
|
|
||||||
// this.$emit('viewCustomAnnotationSeries', { visitTaskId: this.visitTaskId, annotation })
|
|
||||||
// }
|
|
||||||
// } else if (obj.operateStateEnum === 3) {
|
|
||||||
// // 更改标记
|
|
||||||
// this.$emit('setReadingToolPassive')
|
|
||||||
// } else if (obj.operateStateEnum === 4) {
|
|
||||||
// this.$emit('setReadingToolPassive')
|
|
||||||
// // 移除标记
|
|
||||||
// let i = -1
|
|
||||||
// let questionMarkInfo = {}
|
|
||||||
// if (this.isTableQuestion) {
|
|
||||||
// if (this.operateRowId) {
|
|
||||||
// i = this.questionMarkInfoList.findIndex(i => i.TableQuestionId === obj.question.Id && i.RowId === this.operateRowId)
|
|
||||||
// } else {
|
|
||||||
// i = this.questionMarkInfoList.findIndex(i => i.TableQuestionId === obj.question.Id && !i.RowId)
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// this.$set(this.questionForm, obj.question.Id, '')
|
|
||||||
// i = this.questionMarkInfoList.findIndex(i => i.QuestionId === obj.question.Id)
|
|
||||||
// }
|
|
||||||
// if (i === -1) return
|
|
||||||
// this.questionMarkInfoList[i].MeasureData = ''
|
|
||||||
// this.questionMarkInfoList[i].StudyId = ''
|
|
||||||
// this.questionMarkInfoList[i].SeriesId = ''
|
|
||||||
// this.questionMarkInfoList[i].InstanceId = ''
|
|
||||||
// questionMarkInfo = this.questionMarkInfoList[i]
|
|
||||||
// questionMarkInfo.isMarked = false
|
|
||||||
// questionMarkInfo.isSaved = false
|
|
||||||
// this.$set(this.questionsMarkStatus, this.operateRowId ? `${this.operateRowId}_${obj.question.Id}` : obj.question.Id, questionMarkInfo)
|
|
||||||
// } else if (obj.operateStateEnum === 5) {
|
|
||||||
// // 保存外层标记
|
|
||||||
// this.loading = true
|
|
||||||
// try {
|
|
||||||
// const answers = []
|
|
||||||
// answers.push({ id: obj.question.Id, answer: this.questionForm[obj.question.Id] })
|
|
||||||
// const markInfo = []
|
|
||||||
// const i = this.questionMarkInfoList.findIndex(i => i.QuestionId === this.operateQuestionId)
|
|
||||||
// if (i > -1) {
|
|
||||||
// const obj = Object.assign({}, this.questionMarkInfoList[i])
|
|
||||||
// obj.MeasureData = obj.MeasureData ? JSON.stringify(obj.MeasureData) : ''
|
|
||||||
// markInfo.push(obj)
|
|
||||||
// }
|
|
||||||
// // 上传截图
|
|
||||||
// const params = {
|
|
||||||
// visitTaskId: this.visitTaskId,
|
|
||||||
// answers: answers,
|
|
||||||
// questionMarkInfoList: markInfo
|
|
||||||
// }
|
|
||||||
// await saveTaskQuestion(-10, params)
|
|
||||||
|
|
||||||
// this.$set(this.questionsMarkStatus, obj.question.Id, {isMarked: this.questionMarkInfoList[i].MeasureData ? true : false, isSaved: true})
|
|
||||||
// this.loading = false
|
|
||||||
// } catch (e) {
|
|
||||||
// console.log(e)
|
|
||||||
// this.loading = false
|
|
||||||
// }
|
|
||||||
// } else if (obj.operateStateEnum === 6) {
|
|
||||||
// // 更改数值内容
|
|
||||||
// let questionMarkInfo = {}
|
|
||||||
// if (this.isTableQuestion) {
|
|
||||||
// questionMarkInfo.isMarked = false
|
|
||||||
// questionMarkInfo.isSaved = false
|
|
||||||
// } else {
|
|
||||||
// questionMarkInfo.isMarked = false
|
|
||||||
// questionMarkInfo.isSaved = false
|
|
||||||
// }
|
|
||||||
// this.$set(this.questionsMarkStatus, this.operateRowId ? `${this.operateRowId}_obj.question.Id` : obj.question.Id, questionMarkInfo)
|
|
||||||
// } else if (obj.operateStateEnum === 7) {
|
|
||||||
// // 保存表格问题标记
|
|
||||||
// const loading = this.$loading({ fullscreen: true })
|
|
||||||
// try {
|
|
||||||
// let annotation = null
|
|
||||||
// if (!this.operateRowId && obj.rowId && obj.question.ParentQsId) {
|
|
||||||
// this.operateRowId = obj.rowId
|
|
||||||
// this.questionMarkInfoList.forEach(item => {
|
|
||||||
// if (item.QuestionId === obj.question.ParentQsId && !item.RowId) {
|
|
||||||
// item.RowId = obj.rowId
|
|
||||||
// let questionMarkStatus = Object.assign({}, this.questionsMarkStatus[item.TableQuestionId])
|
|
||||||
// delete this.questionsMarkStatus[item.TableQuestionId]
|
|
||||||
// if (item.TableQuestionId === this.operateQuestionId) {
|
|
||||||
// annotation = item.MeasureData
|
|
||||||
// this.$set(this.questionsMarkStatus, `${obj.rowId}_${item.TableQuestionId}`, questionMarkStatus)
|
|
||||||
// } else {
|
|
||||||
// this.$set(this.questionsMarkStatus, `${obj.rowId}_${item.TableQuestionId}`, {isMarked: item.MeasureData ? true : false, isSaved: false})
|
|
||||||
// }
|
|
||||||
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// } else if (this.operateRowId && this.operateQuestionId) {
|
|
||||||
// const i = this.questionMarkInfoList.findIndex(i => i.RowId === this.operateRowId && i.TableQuestionId === this.operateQuestionId)
|
|
||||||
// if (i === -1) return
|
|
||||||
// annotation = this.questionMarkInfoList[i].MeasureData
|
|
||||||
// }
|
|
||||||
// let picturePath = ''
|
|
||||||
// if (annotation) {
|
|
||||||
// // 上传截图
|
|
||||||
// const base64Str = await this.getScreenshots({ visitTaskId: this.visitTaskId, annotation })
|
|
||||||
// const pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, base64Str)
|
|
||||||
// picturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
|
|
||||||
// }
|
|
||||||
// let params = {
|
|
||||||
// Answer: obj.answer,
|
|
||||||
// VisitTaskId: this.visitTaskId,
|
|
||||||
// QuestionId: obj.question.ParentQsId,
|
|
||||||
// InstanceId: annotation ? annotation.instanceId : '',
|
|
||||||
// SeriesId: annotation ? annotation.seriesId : '',
|
|
||||||
// StudyId: annotation ? annotation.studyId : '',
|
|
||||||
// MarkTool: annotation ? annotation.markTool : '',
|
|
||||||
// PicturePath: picturePath,
|
|
||||||
// NumberOfFrames: annotation ? annotation.numberOfFrames : null,
|
|
||||||
// MeasureData: annotation ? JSON.stringify(annotation) : '',
|
|
||||||
// QuestionType: 0,
|
|
||||||
// OrderMarkName: annotation ? annotation.data.label : '',
|
|
||||||
// RowId: this.operateRowId,
|
|
||||||
// TableQuestionId: this.operateQuestionId,
|
|
||||||
// RowIndex: obj.rowIndex
|
|
||||||
// }
|
|
||||||
// // 保存标记
|
|
||||||
// await saveTableQuestionMark(params, -10)
|
|
||||||
// this.$set(this.questionsMarkStatus, `${this.operateRowId}_${this.operateQuestionId}`, {isMarked: annotation ? true : false, isSaved: true})
|
|
||||||
// this.resetOperateState()
|
|
||||||
// loading.close()
|
|
||||||
// } catch(e) {
|
|
||||||
// console.log(e)
|
|
||||||
// loading.close()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
async operateImageMarker(obj) {
|
async operateImageMarker(obj) {
|
||||||
const STATE = {
|
const STATE = {
|
||||||
BIND: 0, // 绑定标记
|
BIND: 0, // 绑定标记
|
||||||
|
|
@ -538,9 +391,9 @@ export default {
|
||||||
[STATE.VIEW]: this.handleViewAnnotation,
|
[STATE.VIEW]: this.handleViewAnnotation,
|
||||||
[STATE.CHANGE]: () => this.$emit('setReadingToolPassive'),
|
[STATE.CHANGE]: () => this.$emit('setReadingToolPassive'),
|
||||||
[STATE.REMOVE]: this.handleRemoveAnnotation,
|
[STATE.REMOVE]: this.handleRemoveAnnotation,
|
||||||
[STATE.SAVE_OUTER]: this.handleSaveOuterQuestions,
|
[STATE.SAVE_OUTER]: this.isNoneDicom ? this.handleSaveNoneDicomOuterQuestions : this.handleSaveOuterQuestions,
|
||||||
[STATE.UPDATE]: this.handleUpdateValue,
|
[STATE.UPDATE]: this.handleUpdateValue,
|
||||||
[STATE.SAVE_TABLE]: this.handleSaveTableQuestions
|
[STATE.SAVE_TABLE]: this.isNoneDicom ? this.handleSaveNoneDicomTableQuestions : this.handleSaveTableQuestions
|
||||||
}
|
}
|
||||||
|
|
||||||
const handler = stateHandlers[operateStateEnum]
|
const handler = stateHandlers[operateStateEnum]
|
||||||
|
|
@ -574,6 +427,73 @@ export default {
|
||||||
isSaved: false,
|
isSaved: false,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
async handleSaveNoneDicomOuterQuestions(obj) {
|
||||||
|
this.loading = true;
|
||||||
|
try {
|
||||||
|
const answers = [{ QuestionId: obj.question.Id, answer: this.questionForm[obj.question.Id] }]
|
||||||
|
const markInfo = []
|
||||||
|
const index = this.questionMarkInfoList.findIndex(
|
||||||
|
item => item.QuestionId === this.operateQuestionId
|
||||||
|
)
|
||||||
|
|
||||||
|
if (index > -1) {
|
||||||
|
const item = { ...this.questionMarkInfoList[index] }
|
||||||
|
item.MeasureData = item.MeasureData ? JSON.stringify(item.MeasureData) : ''
|
||||||
|
markInfo.push(item)
|
||||||
|
markInfo[0].PicturePath = ''
|
||||||
|
}
|
||||||
|
let annotation = null
|
||||||
|
if (!this.operateRowId && obj.rowId) {
|
||||||
|
this.operateRowId = obj.rowId
|
||||||
|
// this.updateQuestionsMarkStatus(obj)
|
||||||
|
}
|
||||||
|
annotation = this.getAnnotationByRow(obj.question.Id, false)
|
||||||
|
// 截图上传
|
||||||
|
let picturePath = obj.picturePath
|
||||||
|
if (annotation) {
|
||||||
|
const base64Str = await this.getScreenshots({
|
||||||
|
visitTaskId: this.visitTaskId,
|
||||||
|
annotation
|
||||||
|
})
|
||||||
|
if (!picturePath) {
|
||||||
|
const pictureObj = await this.uploadScreenshots(`${Date.now()}`, base64Str)
|
||||||
|
picturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
|
||||||
|
}
|
||||||
|
markInfo[0].PicturePath = picturePath
|
||||||
|
}
|
||||||
|
if (markInfo && markInfo.length > 0) {
|
||||||
|
markInfo[0].MarkId = annotation ? annotation.annotationUID : null
|
||||||
|
}
|
||||||
|
await saveAnswerAndBindingNoneDicomMark({
|
||||||
|
visitTaskId: this.visitTaskId,
|
||||||
|
StudyId: annotation.studyId,
|
||||||
|
NoneDicomFileId: annotation.noneDicomFileId,
|
||||||
|
...answers[0],
|
||||||
|
...markInfo[0]
|
||||||
|
})
|
||||||
|
this.loading = false
|
||||||
|
this.$set(this.questionsMarkStatus, obj.question.Id, {
|
||||||
|
isMarked: !!this.questionMarkInfoList[index]?.MeasureData,
|
||||||
|
isSaved: true,
|
||||||
|
OrderMarkName: index > -1 ? this.questionMarkInfoList[index].OrderMarkName : ''
|
||||||
|
})
|
||||||
|
this.resetOperateState()
|
||||||
|
if (annotation) {
|
||||||
|
for (let i = 0; i < this.questionMarkInfoList.length; i++) {
|
||||||
|
const item = this.questionMarkInfoList[i]
|
||||||
|
if (!item.MeasureData || item.MeasureData.annotationUID !== annotation.annotationUID) continue
|
||||||
|
const isTableMode = item.TableQuestionId
|
||||||
|
if (!isTableMode && this.questionsMarkStatus[item.QuestionId] && !this.questionsMarkStatus[item.QuestionId].isSaved && this.questionsMarkStatus[item.QuestionId].isMarked) {
|
||||||
|
DicomEvent.$emit('operateImageMarker', { QuestionId: item.QuestionId, operateStateEnum: 5, picturePath })
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err)
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
async handleSaveOuterQuestions(obj) {
|
async handleSaveOuterQuestions(obj) {
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
try {
|
try {
|
||||||
|
|
@ -647,6 +567,65 @@ export default {
|
||||||
isSaved: false,
|
isSaved: false,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
async handleSaveNoneDicomTableQuestions(obj) {
|
||||||
|
const loading = this.$loading({ fullscreen: true })
|
||||||
|
try {
|
||||||
|
let annotation = null
|
||||||
|
if (!this.operateRowId && obj.rowId && obj.question.ParentQsId) {
|
||||||
|
this.operateRowId = obj.rowId
|
||||||
|
this.updateQuestionsMarkStatus(obj)
|
||||||
|
}
|
||||||
|
annotation = this.getAnnotationByRow(this.operateRowId)
|
||||||
|
// 截图上传
|
||||||
|
let picturePath = obj.picturePath
|
||||||
|
if (annotation && !picturePath) {
|
||||||
|
const base64Str = await this.getScreenshots({
|
||||||
|
visitTaskId: this.visitTaskId,
|
||||||
|
annotation
|
||||||
|
})
|
||||||
|
const pictureObj = await this.uploadScreenshots(`${Date.now()}`, base64Str)
|
||||||
|
picturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
|
||||||
|
}
|
||||||
|
await saveAnswerAndBindingNoneDicomMark({
|
||||||
|
Answer: obj.answer,
|
||||||
|
VisitTaskId: this.visitTaskId,
|
||||||
|
QuestionId: obj.question.ParentQsId,
|
||||||
|
...(annotation ? {
|
||||||
|
StudyId: annotation.studyId,
|
||||||
|
MarkTool: annotation.markTool,
|
||||||
|
MeasureData: JSON.stringify(annotation),
|
||||||
|
OrderMarkName: annotation.data.label,
|
||||||
|
NoneDicomFileId: annotation.noneDicomFileId,
|
||||||
|
} : {}),
|
||||||
|
Path: picturePath ? picturePath : '',
|
||||||
|
QuestionType: 0,
|
||||||
|
RowId: this.operateRowId,
|
||||||
|
TableQuestionId: this.operateQuestionId,
|
||||||
|
RowIndex: obj.rowIndex,
|
||||||
|
MarkId: annotation ? annotation.annotationUID : null
|
||||||
|
})
|
||||||
|
this.$set(this.questionsMarkStatus,
|
||||||
|
`${this.operateRowId}_${this.operateQuestionId}`,
|
||||||
|
{ isMarked: !!annotation, isSaved: true, OrderMarkName: annotation ? annotation.data.label : '' }
|
||||||
|
)
|
||||||
|
this.resetOperateState()
|
||||||
|
if (annotation) {
|
||||||
|
for (let i = 0; i < this.questionMarkInfoList.length; i++) {
|
||||||
|
const item = this.questionMarkInfoList[i]
|
||||||
|
if (!item.MeasureData || item.MeasureData.annotationUID !== annotation.annotationUID) continue
|
||||||
|
const isTableMode = item.TableQuestionId
|
||||||
|
if (isTableMode && ((this.questionsMarkStatus[`${item.RowId}_${item.TableQuestionId}`] && !this.questionsMarkStatus[`${item.RowId}_${item.TableQuestionId}`].isSaved && this.questionsMarkStatus[`${item.RowId}_${item.TableQuestionId}`].isMarked) || (this.questionsMarkStatus[`${item.TableQuestionId}`] && !this.questionsMarkStatus[`${item.TableQuestionId}`].isSaved && this.questionsMarkStatus[`${item.TableQuestionId}`].isMarked))) {
|
||||||
|
DicomEvent.$emit('operateImageMarkerTable', { QuestionId: item.TableQuestionId, operateStateEnum: 7, picturePath })
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error('表格保存失败:', e)
|
||||||
|
} finally {
|
||||||
|
loading.close()
|
||||||
|
}
|
||||||
|
},
|
||||||
async handleSaveTableQuestions(obj) {
|
async handleSaveTableQuestions(obj) {
|
||||||
const loading = this.$loading({ fullscreen: true })
|
const loading = this.$loading({ fullscreen: true })
|
||||||
try {
|
try {
|
||||||
|
|
@ -772,7 +751,6 @@ export default {
|
||||||
&& item.RowId !== this.operateRowId && item.RowId
|
&& item.RowId !== this.operateRowId && item.RowId
|
||||||
)
|
)
|
||||||
// && this.operateRowId
|
// && this.operateRowId
|
||||||
console.log(conflictIndex)
|
|
||||||
if (conflictIndex > -1) {
|
if (conflictIndex > -1) {
|
||||||
//该标记已绑定到其他行,不能更改绑定!
|
//该标记已绑定到其他行,不能更改绑定!
|
||||||
this.$alert(this.$t("dicom3D:CustomizeQuestionList:alert:markIsbind"))
|
this.$alert(this.$t("dicom3D:CustomizeQuestionList:alert:markIsbind"))
|
||||||
|
|
@ -808,6 +786,7 @@ export default {
|
||||||
StudyId: annotation.studyId,
|
StudyId: annotation.studyId,
|
||||||
MarkTool: annotation.metadata.toolName,
|
MarkTool: annotation.metadata.toolName,
|
||||||
PicturePath: '',
|
PicturePath: '',
|
||||||
|
Path: annotation.path,
|
||||||
NumberOfFrames: annotation.numberOfFrames,
|
NumberOfFrames: annotation.numberOfFrames,
|
||||||
MeasureData: annotation,
|
MeasureData: annotation,
|
||||||
RowId: this.operateRowId || '',
|
RowId: this.operateRowId || '',
|
||||||
|
|
@ -956,11 +935,33 @@ export default {
|
||||||
const hasProp = cachedStats
|
const hasProp = cachedStats
|
||||||
&& Object.prototype.hasOwnProperty.call(cachedStats, prop)
|
&& Object.prototype.hasOwnProperty.call(cachedStats, prop)
|
||||||
if (!hasProp) return null
|
if (!hasProp) return null
|
||||||
const value = cachedStats[prop]
|
let value = cachedStats[prop]
|
||||||
|
if (this.isNoneDicom && annotation.ps) {
|
||||||
|
let ps = annotation.ps
|
||||||
|
if (prop === 'area') value = this.reRound(value * ps * ps, this.digitPlaces)
|
||||||
|
if (prop === 'length' || prop === 'perimeter') value = this.reRound(value * ps, this.digitPlaces)
|
||||||
|
}
|
||||||
return value !== null
|
return value !== null
|
||||||
? parseFloat(value).toFixed(this.digitPlaces)
|
? parseFloat(value).toFixed(this.digitPlaces)
|
||||||
: value
|
: value
|
||||||
},
|
},
|
||||||
|
reRound(result, finalPrecision) {
|
||||||
|
if (typeof result === 'string' && result.includes(', ')) {
|
||||||
|
const numStrs = result.split(', ')
|
||||||
|
const processed = numStrs.map(str => this.processSingle(str, finalPrecision))
|
||||||
|
return processed.join(', ')
|
||||||
|
}
|
||||||
|
return this.processSingle(result, finalPrecision)
|
||||||
|
},
|
||||||
|
processSingle(str, precision) {
|
||||||
|
const num = parseFloat(str)
|
||||||
|
if (isNaN(num)) return 'NaN'
|
||||||
|
|
||||||
|
// 保留原极小值处理逻辑
|
||||||
|
if (Math.abs(num) < 0.0001) return str
|
||||||
|
const factor = 10 ** precision
|
||||||
|
return (Math.round(num * factor + 0.0000001) / factor).toFixed(precision)
|
||||||
|
},
|
||||||
unBindAnnotationToQuestion(obj) {
|
unBindAnnotationToQuestion(obj) {
|
||||||
const { markTableQuestions = [], questionId } = obj || {}
|
const { markTableQuestions = [], questionId } = obj || {}
|
||||||
const { questionMarkInfoList, questionsMarkStatus } = this
|
const { questionMarkInfoList, questionsMarkStatus } = this
|
||||||
|
|
@ -1123,6 +1124,26 @@ export default {
|
||||||
// this.setMeasuredData(event.data.data)
|
// this.setMeasuredData(event.data.data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
questionsMarkStatus: {
|
||||||
|
handler() {
|
||||||
|
let saved = true
|
||||||
|
Object.keys(this.questionsMarkStatus).forEach(key => {
|
||||||
|
if (!this.questionsMarkStatus[key].isSaved) saved = false
|
||||||
|
})
|
||||||
|
this.$emit('setSaved', saved)
|
||||||
|
},
|
||||||
|
deep: true,
|
||||||
|
immediate: true
|
||||||
|
},
|
||||||
|
// questionMarkInfoList: {
|
||||||
|
// handler() {
|
||||||
|
// console.log(this.questionMarkInfoList, 'questionMarkInfoList')
|
||||||
|
// },
|
||||||
|
// deep: true,
|
||||||
|
// immediate: true
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="dropdown-content">
|
<div class="dropdown-content">
|
||||||
<!--v-if="readingTaskState < 2"-->
|
<!--v-if="readingTaskState < 2"-->
|
||||||
<ul style="width:100px;">
|
<ul style="width:100px;">
|
||||||
<li v-for="i in customizeStandardsNoneDicom" :key="i.toolName" style="text-align:left;">
|
<li v-for="i in customizeStandardsNoneDicom" :key="i.toolName" style="text-align:left;">
|
||||||
<a href="#" @click.prevent="setAnnotateToolActive(i.toolName)">
|
<a href="#" @click.prevent="setAnnotateToolActive(i.toolName)">
|
||||||
<svg-icon :icon-class="i.icon" class="svg-icon" style="margin-right: 5px;" />
|
<svg-icon :icon-class="i.icon" class="svg-icon" style="margin-right: 5px;" />
|
||||||
|
|
@ -234,6 +234,7 @@
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { addNoneDicomMark, deleteTrialFileType, getCriterionReadingInfo } from '@/api/trials'
|
import { addNoneDicomMark, deleteTrialFileType, getCriterionReadingInfo } from '@/api/trials'
|
||||||
|
import html2canvas from 'html2canvas'
|
||||||
import {
|
import {
|
||||||
RenderingEngine,
|
RenderingEngine,
|
||||||
Enums,
|
Enums,
|
||||||
|
|
@ -296,6 +297,12 @@ export default {
|
||||||
default() {
|
default() {
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
ecrf: {
|
||||||
|
type: Object,
|
||||||
|
default() {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|
@ -342,7 +349,8 @@ export default {
|
||||||
uploadStatus: 'upload',
|
uploadStatus: 'upload',
|
||||||
taskId: '',
|
taskId: '',
|
||||||
isReadingTaskViewInOrder: null,
|
isReadingTaskViewInOrder: null,
|
||||||
trialCriterion: {}
|
trialCriterion: {},
|
||||||
|
saveCustomAnnotationTimer: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|
@ -607,7 +615,17 @@ export default {
|
||||||
toolGroup.setToolPassive(EraserTool.toolName)
|
toolGroup.setToolPassive(EraserTool.toolName)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
lengthscaleToolDisabled(saved) {
|
||||||
|
const viewportIds = ['canvas-0', 'canvas-1', 'canvas-2', 'canvas-3']
|
||||||
|
viewportIds.forEach(toolGroupId => {
|
||||||
|
const toolGroup = ToolGroupManager.getToolGroup(toolGroupId)
|
||||||
|
if (saved) {
|
||||||
|
toolGroup.setToolPassive(LengthscaleTool.toolName)
|
||||||
|
} else {
|
||||||
|
toolGroup.setToolEnabled(LengthscaleTool.toolName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
// 加载图片回调
|
// 加载图片回调
|
||||||
stackNewImage(e) {
|
stackNewImage(e) {
|
||||||
const { detail } = e
|
const { detail } = e
|
||||||
|
|
@ -919,96 +937,201 @@ export default {
|
||||||
toolsEvents.ANNOTATION_REMOVED,
|
toolsEvents.ANNOTATION_REMOVED,
|
||||||
this.annotationRemovedListener
|
this.annotationRemovedListener
|
||||||
)
|
)
|
||||||
|
eventTarget.addEventListener(
|
||||||
|
toolsEvents.ANNOTATION_SELECTION_CHANGE,
|
||||||
|
this.annotationSelectionChangeListener
|
||||||
|
)
|
||||||
},
|
},
|
||||||
async annotationRemovedListener(e) {
|
async annotationRemovedListener(e) {
|
||||||
const { annotation } = e.detail
|
const { annotation } = e.detail
|
||||||
try {
|
try {
|
||||||
if (!annotation) return
|
// if ( this.resetAnnotation && this.isFusion ) return false
|
||||||
if (this.readingTaskState === 2 && !annotation.annotationId) {
|
if (!annotation) return false
|
||||||
cornerstoneTools.annotation.state.removeAnnotation(annotation.annotationUID)
|
if (annotation.metadata.toolName === 'Lengthscale') {
|
||||||
return false
|
await this.$confirm(
|
||||||
|
this.$t('trials:trials-list:table:LengthscaleIsDeleted')
|
||||||
|
)
|
||||||
|
const errorMsg = { message: 'Lengthscale Not delete' }
|
||||||
|
throw errorMsg
|
||||||
}
|
}
|
||||||
|
if (this.readingTaskState === 2 && !annotation.data.label && annotation.metadata.toolName !== 'Lengthscale') return false
|
||||||
if (this.readingTaskState === 2) {
|
if (this.readingTaskState === 2) {
|
||||||
const errorMsg = { message: 'annotation Not allowed to operate' }
|
const errorMsg = { message: 'annotation Not allowed to operate' }
|
||||||
throw errorMsg
|
throw errorMsg
|
||||||
}
|
}
|
||||||
if (annotation.annotationId) {
|
const i = this.tools.findIndex(i => i.toolName === annotation.metadata.toolName)
|
||||||
await deleteTrialFileType(annotation.annotationId)
|
if (i === -1 && annotation.metadata.toolName !== 'Lengthscale') {
|
||||||
} else {
|
// 临时标记
|
||||||
cornerstoneTools.annotation.state.removeAnnotation(annotation.annotationUID)
|
return
|
||||||
}
|
}
|
||||||
const renderingEngine = getRenderingEngine(renderingEngineId)
|
if (annotation.visitTaskId === this.taskInfo.VisitTaskId) {
|
||||||
const viewport = renderingEngine.getViewport(`canvas-${this.activeCanvasIndex}`)
|
this.$emit('getEcrf', { type: "verifyAnnotationIsBound", VisitTaskId: annotation.visitTaskId, annotation })
|
||||||
viewport.render()
|
this.$nextTick(async () => {
|
||||||
const i = this.viewportInfos.findIndex(i => i.index === this.activeCanvasIndex)
|
try {
|
||||||
const imageId = annotation.metadata.referencedImageId
|
const isBound = this.ecrf.isBound
|
||||||
const path = imageId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
if (isBound && this.activeTool === 'Eraser') {
|
||||||
const fileList = this.viewportInfos[i].fileList
|
// '该标记已与问题进行绑定,不允许删除!'
|
||||||
const fileIndex = fileList.findIndex(f => f.Path === path)
|
this.$alert(this.$t('dicom3D:ReadPage:alert:MarkToQuestionNoDel'))
|
||||||
if (annotation.metadata.toolName === 'Lengthscale') {
|
const errorMsg = { message: 'annotation Not allowed to operate' }
|
||||||
this.$emit('setPS', { NoneDicomFileId: fileList[fileIndex].Id, Path: fileList[fileIndex].Path, PS: null })
|
throw errorMsg
|
||||||
|
} else if (this.activeTool === 'Eraser') {
|
||||||
|
await this.$confirm(
|
||||||
|
this.$t('trials:trials-list:table:isDeleted') +
|
||||||
|
annotation.data.label +
|
||||||
|
'?'
|
||||||
|
)
|
||||||
|
if (annotation.id) {
|
||||||
|
let res = await deleteTrialFileType(annotation.id)
|
||||||
|
if (!res.IsSuccess) throw ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const renderingEngine = getRenderingEngine(renderingEngineId)
|
||||||
|
for (let i = 0; i < this.cells.length; i++) {
|
||||||
|
const viewportId = `canvas-${i}`
|
||||||
|
const viewport = renderingEngine.getViewport(viewportId)
|
||||||
|
viewport.render()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const errorMsg = { message: 'annotation Not allowed to operate' }
|
||||||
|
throw errorMsg
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
cornerstoneTools.annotation.state.addAnnotation(annotation)
|
||||||
|
const renderingEngine = getRenderingEngine(renderingEngineId)
|
||||||
|
for (let i = 0; i < this.cells.length; i++) {
|
||||||
|
const viewportId = `canvas-${i}`
|
||||||
|
const viewport = renderingEngine.getViewport(viewportId)
|
||||||
|
viewport.render()
|
||||||
|
}
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
cornerstoneTools.annotation.state.addAnnotation(annotation)
|
cornerstoneTools.annotation.state.addAnnotation(annotation)
|
||||||
const renderingEngine = getRenderingEngine(renderingEngineId)
|
const renderingEngine = getRenderingEngine(renderingEngineId)
|
||||||
const viewport = renderingEngine.getViewport(`canvas-${this.activeCanvasIndex}`)
|
for (let i = 0; i < this.cells.length; i++) {
|
||||||
viewport.render()
|
const viewportId = `canvas-${i}`
|
||||||
|
const viewport = renderingEngine.getViewport(viewportId)
|
||||||
|
viewport.render()
|
||||||
|
}
|
||||||
console.log(e)
|
console.log(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
async annotationModifiedListener(e) {
|
async annotationModifiedListener(e) {
|
||||||
console.log('Modified')
|
console.log('Modified')
|
||||||
if (this.readingTaskState === 2) return
|
if (this.readingTaskState === 2) return
|
||||||
const { annotation } = e.detail
|
const { annotation } = e.detail
|
||||||
|
if (!annotation.highlighted) return
|
||||||
if (!annotation) return
|
if (!annotation) return
|
||||||
if (!annotation.annotationId) return
|
// if (!annotation.annotationId) return
|
||||||
if (annotation.metadata.toolName === 'PlanarFreehandROI' && !annotation.data.contour.closed) return
|
let i = this.tools.findIndex(i => i.toolName === annotation.metadata.toolName)
|
||||||
const i = this.viewportInfos.findIndex(i => i.index === this.activeCanvasIndex)
|
if (i === -1 && annotation.metadata.toolName !== 'Lengthscale') {
|
||||||
if (i === -1) return
|
this.setToolsPassive()
|
||||||
if (this.viewportInfos[i].taskInfo.VisitTaskId !== this.taskInfo.VisitTaskId) return
|
return
|
||||||
|
}
|
||||||
|
i = this.viewportInfos.findIndex(i => i.index === this.activeCanvasIndex)
|
||||||
const imageId = annotation.metadata.referencedImageId
|
const imageId = annotation.metadata.referencedImageId
|
||||||
const path = imageId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
const path = imageId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
||||||
const fileList = this.viewportInfos[i].fileList
|
const fileList = this.viewportInfos[i].fileList
|
||||||
const fileIndex = fileList.findIndex(f => f.Path === path)
|
const fileIndex = fileList.findIndex(f => f.Path === path)
|
||||||
if (fileIndex === -1) return
|
if (fileIndex === -1) return
|
||||||
|
annotation.path = path
|
||||||
|
let ps = null
|
||||||
|
let psIndex = this.psArr.findIndex(i => i.Path === path)
|
||||||
|
if (psIndex > -1 && this.psArr[i].PS) {
|
||||||
|
ps = parseFloat(this.psArr[i].PS).toFixed(3)
|
||||||
|
}
|
||||||
|
annotation.ps = ps
|
||||||
|
if (!annotation.data.label && annotation.metadata.toolName !== 'Lengthscale') return
|
||||||
|
if (annotation.metadata.toolName === 'PlanarFreehandROI' && !annotation.data.contour.closed) return
|
||||||
if (annotation.metadata.toolName === 'Lengthscale') {
|
if (annotation.metadata.toolName === 'Lengthscale') {
|
||||||
const value = annotation.data.l
|
const value = annotation.data.l
|
||||||
|
let ps = 1
|
||||||
if (value) {
|
if (value) {
|
||||||
const cachedStats = Object.keys(annotation.data.cachedStats)
|
const cachedStats = Object.keys(annotation.data.cachedStats)
|
||||||
const ps = value / annotation.data.cachedStats[cachedStats[0]].length
|
ps = value / annotation.data.cachedStats[cachedStats[0]].length
|
||||||
annotation.data.ps = ps
|
annotation.data.ps = ps
|
||||||
this.$emit('setPS', { NoneDicomFileId: fileList[fileIndex].Id, Path: fileList[fileIndex].Path, PS: ps })
|
this.$emit('setPS', { NoneDicomFileId: fileList[fileIndex].Id, Path: fileList[fileIndex].Path, PS: ps, OldPS: 1 })
|
||||||
}
|
}
|
||||||
this.setToolsPassive()
|
this.setToolsPassive()
|
||||||
|
if (this.customizeStandardsNoneDicom.find(item => item.toolName === annotation.metadata?.toolName)) return false
|
||||||
|
if (this.saveCustomAnnotationTimer) {
|
||||||
|
clearTimeout(this.saveCustomAnnotationTimer)
|
||||||
|
this.saveCustomAnnotationTimer = null
|
||||||
|
}
|
||||||
|
let psIndex = this.psArr.findIndex(p => p.NoneDicomFileId === fileList[fileIndex].Id)
|
||||||
|
let OldPS = 1
|
||||||
|
if (psIndex > -1) {
|
||||||
|
OldPS = this.psArr[i].OldPS
|
||||||
|
}
|
||||||
|
console.log(OldPS, ps)
|
||||||
|
let Proportion = ps / OldPS
|
||||||
|
return this.saveCustomAnnotationTimer = setTimeout(async () => {
|
||||||
|
console.log(this.ecrf.IsHaveBindingQuestion, 'this.ecrf.IsHaveBindingQuestion')
|
||||||
|
if (OldPS === ps || !this.ecrf.IsHaveBindingQuestion) {
|
||||||
|
this.saveCustomAnnotation(annotation)
|
||||||
|
} else {
|
||||||
|
await this.$confirm(
|
||||||
|
this.$t('trials:trials-list:table:allQuestionChange')
|
||||||
|
).then(() => {
|
||||||
|
this.saveCustomAnnotation(annotation, Proportion)
|
||||||
|
})
|
||||||
|
.catch(action => {
|
||||||
|
this.saveCustomAnnotation(annotation, -1)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, 500)
|
||||||
}
|
}
|
||||||
if (this.customizeStandardsNoneDicom.find(item => item.toolName === annotation.metadata?.toolName)) return false
|
this.$emit("getEcrf", { type: "getOperateStateEnum", VisitTaskId: this.taskInfo.VisitTaskId })
|
||||||
const params = {
|
this.$emit('getEcrf', { type: "verifyAnnotationIsBound", VisitTaskId: this.taskInfo.VisitTaskId, annotation })
|
||||||
id: annotation.annotationId,
|
this.$nextTick(() => {
|
||||||
visitTaskId: this.viewportInfos[i].taskInfo.VisitTaskId,
|
const operateStateEnum = this.ecrf.operateStateEnum
|
||||||
studyId: this.viewportInfos[i].studyId,
|
const isBound = this.ecrf.isBound
|
||||||
noneDicomFileId: fileList[fileIndex].Id,
|
if (isBound || this.isNumber(operateStateEnum)) {
|
||||||
path: fileList[fileIndex].Path,
|
console.log(isBound, this.isNumber(operateStateEnum))
|
||||||
measureData: JSON.stringify(annotation)
|
this.$emit('getEcrf', { type: "updateAnnotationToQuestion", VisitTaskId: this.taskInfo.VisitTaskId, annotation })
|
||||||
}
|
} else {
|
||||||
await addNoneDicomMark(params)
|
if (this.saveCustomAnnotationTimer) {
|
||||||
// 保存成功
|
clearTimeout(this.saveCustomAnnotationTimer)
|
||||||
// this.$message.success(this.$t('common:message:savedSuccessfully'))
|
this.saveCustomAnnotationTimer = null
|
||||||
|
}
|
||||||
|
this.saveCustomAnnotationTimer = setTimeout(() => { this.saveCustomAnnotation(annotation) }, 1000)
|
||||||
|
}
|
||||||
|
this.setToolsPassive()
|
||||||
|
})
|
||||||
},
|
},
|
||||||
async annotationCompletedListener(e) {
|
async annotationCompletedListener(e) {
|
||||||
console.log('Completed')
|
console.log('Completed')
|
||||||
if (this.readingTaskState === 2) return
|
if (this.readingTaskState === 2) return
|
||||||
const { annotation } = e.detail
|
const { annotation } = e.detail
|
||||||
if (!annotation) return
|
if (!annotation) return
|
||||||
if (annotation.metadata.toolName === 'PlanarFreehandROI' && !annotation.data.contour.closed) return
|
|
||||||
const i = this.viewportInfos.findIndex(i => i.index === this.activeCanvasIndex)
|
const i = this.viewportInfos.findIndex(i => i.index === this.activeCanvasIndex)
|
||||||
if (i === -1) return
|
let INDEX = this.tools.findIndex(i => i.toolName === annotation.metadata.toolName)
|
||||||
|
if ((INDEX === -1 && annotation.metadata.toolName !== 'Lengthscale') || i === -1) {
|
||||||
|
this.setToolsPassive()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (annotation.metadata.toolName === 'PlanarFreehandROI' && !annotation.data.contour.closed) return
|
||||||
if (this.viewportInfos[i].taskInfo.VisitTaskId !== this.taskInfo.VisitTaskId) return
|
if (this.viewportInfos[i].taskInfo.VisitTaskId !== this.taskInfo.VisitTaskId) return
|
||||||
const imageId = annotation.metadata.referencedImageId
|
const imageId = annotation.metadata.referencedImageId
|
||||||
const path = imageId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
const path = imageId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
||||||
const fileList = this.viewportInfos[i].fileList
|
const fileList = this.viewportInfos[i].fileList
|
||||||
const fileIndex = fileList.findIndex(f => f.Path === path)
|
const fileIndex = fileList.findIndex(f => f.Path === path)
|
||||||
if (fileIndex === -1) return
|
if (fileIndex === -1) return
|
||||||
|
annotation.path = path
|
||||||
|
let ps = null
|
||||||
|
let psIndex = this.psArr.findIndex(i => i.Path === path)
|
||||||
|
if (psIndex > -1 && this.psArr[i].PS) {
|
||||||
|
ps = parseFloat(this.psArr[i].PS).toFixed(3)
|
||||||
|
}
|
||||||
|
annotation.ps = ps
|
||||||
|
annotation.markTool = annotation.metadata.toolName
|
||||||
|
annotation.visitTaskId = this.viewportInfos[i].taskInfo.VisitTaskId
|
||||||
|
annotation.studyId = this.viewportInfos[i].studyId
|
||||||
|
annotation.noneDicomFileId = this.viewportInfos[i].fileList[this.viewportInfos[i].currentImageIdIndex].Id
|
||||||
if (annotation.metadata.toolName === 'Lengthscale') {
|
if (annotation.metadata.toolName === 'Lengthscale') {
|
||||||
this.form.annotationObj = {
|
this.form.annotationObj = {
|
||||||
id: '',
|
id: '',
|
||||||
|
|
@ -1025,23 +1148,139 @@ export default {
|
||||||
this.setToolsPassive()
|
this.setToolsPassive()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (this.customizeStandardsNoneDicom.find(item => item.toolName === annotation.metadata?.toolName)) return false
|
// this.markedSeriesIds.push(series.Id)
|
||||||
const params = {
|
this.$emit('getEcrf', { type: "getOperateStateEnum", VisitTaskId: this.taskInfo.VisitTaskId })
|
||||||
id: '',
|
|
||||||
visitTaskId: this.viewportInfos[i].taskInfo.VisitTaskId,
|
|
||||||
studyId: this.viewportInfos[i].studyId,
|
|
||||||
noneDicomFileId: fileList[fileIndex].Id,
|
|
||||||
path: fileList[fileIndex].Path,
|
|
||||||
measureData: JSON.stringify(annotation)
|
|
||||||
}
|
|
||||||
const res = await addNoneDicomMark(params)
|
|
||||||
annotation.annotationId = res.Result
|
|
||||||
|
|
||||||
const renderingEngine = getRenderingEngine(renderingEngineId)
|
this.$nextTick(async () => {
|
||||||
const viewport = renderingEngine.getViewport(`canvas-${this.activeCanvasIndex}`)
|
const operateStateEnum = this.ecrf.operateStateEnum
|
||||||
viewport.render()
|
const markName = await this.customPrompt(!this.isNumber(operateStateEnum))
|
||||||
// 保存成功
|
|
||||||
// this.$message.success(this.$t('common:message:savedSuccessfully'))
|
if (markName) {
|
||||||
|
annotation.data.label = markName
|
||||||
|
if (annotation.metadata.toolName === 'ArrowAnnotate') {
|
||||||
|
annotation.data.text = markName
|
||||||
|
}
|
||||||
|
if (this.isNumber(operateStateEnum)) {
|
||||||
|
this.$emit('getEcrf', { type: "bindAnnotationToQuestion", VisitTaskId: this.taskInfo.VisitTaskId, annotation })
|
||||||
|
} else {
|
||||||
|
if (this.saveCustomAnnotationTimer) {
|
||||||
|
clearTimeout(this.saveCustomAnnotationTimer)
|
||||||
|
this.saveCustomAnnotationTimer = null
|
||||||
|
}
|
||||||
|
this.saveCustomAnnotationTimer = setTimeout(() => { this.saveCustomAnnotation(annotation) }, 500)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// if (this.isNumber(operateStateEnum)) {
|
||||||
|
// this.removeAnnotation(annotation)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
annotationSelectionChangeListener(e) {
|
||||||
|
console.log('selection')
|
||||||
|
if (this.readingTaskState === 2) return
|
||||||
|
const { detail } = e
|
||||||
|
const annotations = cornerstoneTools.annotation.state.getAllAnnotations()
|
||||||
|
const i = annotations.findIndex(i => i.annotationUID === detail.selection[0])
|
||||||
|
if (i > -1) {
|
||||||
|
if (annotations[i].visitTaskId !== this.taskInfo.VisitTaskId) {
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
this.$emit('getEcrf', { type: "bindAnnotationToQuestion", VisitTaskId: this.taskInfo.VisitTaskId, annotation: annotations[i] })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async saveCustomAnnotation(annotation, ps = null) {
|
||||||
|
try {
|
||||||
|
const measureData = Object.assign({}, annotation)
|
||||||
|
const params = {}
|
||||||
|
const i = this.viewportInfos.findIndex(i => i.index === this.activeCanvasIndex)
|
||||||
|
await this.getScreenshots({
|
||||||
|
visitTaskId: this.taskInfo.VisitTaskId,
|
||||||
|
annotation
|
||||||
|
}, async (base64Str) => {
|
||||||
|
const pictureObj = await this.uploadScreenshots(`${Date.now()}`, base64Str)
|
||||||
|
let picturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
|
||||||
|
if (annotation.id) params.Id = annotation.id
|
||||||
|
if (!isNaN(parseFloat(ps))) params.Proportion = ps
|
||||||
|
params.PicturePath = picturePath
|
||||||
|
params.Path = annotation.path || ''
|
||||||
|
params.MarkTool = measureData.markTool
|
||||||
|
params.OrderMarkName = measureData.data.label
|
||||||
|
params.VisitTaskId = this.taskInfo.VisitTaskId
|
||||||
|
params.StudyId = annotation.studyId
|
||||||
|
params.NoneDicomFileId = annotation.noneDicomFileId
|
||||||
|
params.MeasureData = JSON.stringify(measureData)
|
||||||
|
params.MarkId = annotation.annotationUID
|
||||||
|
const res = await addNoneDicomMark(params)
|
||||||
|
annotation.markId = params.MarkId
|
||||||
|
annotation.id = res.Result
|
||||||
|
if (!isNaN(parseFloat(ps))) this.$emit('getEcrf', { type: "getQuestions", VisitTaskId: this.taskInfo.VisitTaskId })
|
||||||
|
})
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getScreenshots(measureData, callback) {
|
||||||
|
if (measureData) {
|
||||||
|
console.log(measureData, 'measureData')
|
||||||
|
// await this.imageLocation(measureData)
|
||||||
|
this.viewCustomAnnotation(measureData)
|
||||||
|
const divForDownloadViewport = document.querySelector(
|
||||||
|
`div[data-viewport-uid="canvas-${this.activeCanvasIndex}"]`
|
||||||
|
)
|
||||||
|
const canvas = await html2canvas(divForDownloadViewport)
|
||||||
|
const base64Str = canvas.toDataURL('image/png', 1)
|
||||||
|
callback(base64Str)
|
||||||
|
} else {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
viewCustomAnnotation(obj) {
|
||||||
|
const i = this.viewportInfos.findIndex(i => i.taskInfo.VisitTaskId === obj.visitTaskId)
|
||||||
|
const imageId = obj.annotation.metadata.referencedImageId
|
||||||
|
const path = imageId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
||||||
|
const fileList = this.viewportInfos[i].fileList
|
||||||
|
const fileIndex = fileList.findIndex(f => f.Path === path)
|
||||||
|
let o = { fileInfo: fileList[fileIndex], fileList, visitTaskInfo: this.viewportInfos[i].taskInfo, studyId: this.viewportInfos[i].studyId }
|
||||||
|
this.setActiveCanvasImages(o)
|
||||||
|
},
|
||||||
|
async uploadScreenshots(fileName, file) {
|
||||||
|
try {
|
||||||
|
file = this.convertBase64ToBlob(file)
|
||||||
|
const trialId = this.$route.query.trialId
|
||||||
|
const taskInfo = JSON.parse(localStorage.getItem('taskInfo'))
|
||||||
|
const subjectId = taskInfo.SubjectId
|
||||||
|
const result = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/${this.visitTaskId}/${fileName}.png`, file)
|
||||||
|
return { isSuccess: true, result: result }
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
return { isSuccess: false, result: e }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
convertBase64ToBlob(imageEditorBase64) {
|
||||||
|
const base64Arr = imageEditorBase64.split(',')
|
||||||
|
let imgtype = ''
|
||||||
|
let base64String = ''
|
||||||
|
if (base64Arr.length > 1) {
|
||||||
|
base64String = base64Arr[1]
|
||||||
|
imgtype = base64Arr[0].substring(
|
||||||
|
base64Arr[0].indexOf(':') + 1,
|
||||||
|
base64Arr[0].indexOf(';')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
const bytes = atob(base64String)
|
||||||
|
const bytesCode = new ArrayBuffer(bytes.length)
|
||||||
|
const byteArray = new Uint8Array(bytesCode)
|
||||||
|
for (let i = 0; i < bytes.length; i++) {
|
||||||
|
byteArray[i] = bytes.charCodeAt(i)
|
||||||
|
}
|
||||||
|
return new Blob([bytesCode], { type: imgtype })
|
||||||
|
},
|
||||||
|
isNumber(value) {
|
||||||
|
return typeof value === 'number' && value !== null && !isNaN(value)
|
||||||
},
|
},
|
||||||
async saveForm() {
|
async saveForm() {
|
||||||
const validate = await this.$refs.lengthForm.validate()
|
const validate = await this.$refs.lengthForm.validate()
|
||||||
|
|
@ -1050,32 +1289,45 @@ export default {
|
||||||
const annotation = this.form.annotationObj.annotation
|
const annotation = this.form.annotationObj.annotation
|
||||||
const fileList = this.form.annotationObj.fileList
|
const fileList = this.form.annotationObj.fileList
|
||||||
const fileIndex = this.form.annotationObj.fileIndex
|
const fileIndex = this.form.annotationObj.fileIndex
|
||||||
|
let ps = 1
|
||||||
if (value) {
|
if (value) {
|
||||||
annotation.data.l = parseFloat(value)
|
annotation.data.l = parseFloat(value)
|
||||||
const cachedStats = Object.keys(annotation.data.cachedStats)
|
const cachedStats = Object.keys(annotation.data.cachedStats)
|
||||||
const ps = parseFloat(value) / annotation.data.cachedStats[cachedStats[0]].length
|
ps = parseFloat(value) / annotation.data.cachedStats[cachedStats[0]].length
|
||||||
annotation.data.ps = ps
|
annotation.data.ps = ps
|
||||||
this.$emit('setPS', { NoneDicomFileId: fileList[fileIndex].Id, Path: fileList[fileIndex].Path, PS: ps })
|
this.$emit('setPS', { NoneDicomFileId: fileList[fileIndex].Id, Path: fileList[fileIndex].Path, PS: ps, OldPS: 1 })
|
||||||
} else {
|
} else {
|
||||||
cornerstoneTools.annotation.state.removeAnnotation(annotation.annotationUID)
|
cornerstoneTools.annotation.state.removeAnnotation(annotation.annotationUID)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (this.customizeStandardsNoneDicom.find(item => item.toolName === annotation.metadata?.toolName)) return false
|
if (this.customizeStandardsNoneDicom.find(item => item.toolName === annotation.metadata?.toolName)) return false
|
||||||
const params = {
|
|
||||||
id: '',
|
|
||||||
visitTaskId: this.form.annotationObj.visitTaskId,
|
|
||||||
studyId: this.form.annotationObj.studyId,
|
|
||||||
noneDicomFileId: this.form.annotationObj.noneDicomFileId,
|
|
||||||
path: this.form.annotationObj.path,
|
|
||||||
measureData: JSON.stringify(annotation)
|
|
||||||
}
|
|
||||||
const res = await addNoneDicomMark(params)
|
|
||||||
annotation.annotationId = res.Result
|
|
||||||
|
|
||||||
const renderingEngine = getRenderingEngine(renderingEngineId)
|
|
||||||
const viewport = renderingEngine.getViewport(`canvas-${this.activeCanvasIndex}`)
|
|
||||||
viewport.render()
|
|
||||||
this.dialogVisible = false
|
this.dialogVisible = false
|
||||||
|
if (this.saveCustomAnnotationTimer) {
|
||||||
|
clearTimeout(this.saveCustomAnnotationTimer)
|
||||||
|
this.saveCustomAnnotationTimer = null
|
||||||
|
}
|
||||||
|
let psIndex = this.psArr.findIndex(p => p.NoneDicomFileId === fileList[fileIndex].Id)
|
||||||
|
let OldPS = 1
|
||||||
|
if (psIndex > -1) {
|
||||||
|
OldPS = this.psArr[psIndex].OldPS
|
||||||
|
}
|
||||||
|
console.log(OldPS, 'OldPS')
|
||||||
|
let Proportion = ps / OldPS
|
||||||
|
return this.saveCustomAnnotationTimer = setTimeout(async () => {
|
||||||
|
if (!this.ecrf.IsHaveBindingQuestion) {
|
||||||
|
this.saveCustomAnnotation(annotation)
|
||||||
|
} else {
|
||||||
|
await this.$confirm(
|
||||||
|
this.$t('trials:trials-list:table:allQuestionChange')
|
||||||
|
).then(() => {
|
||||||
|
this.saveCustomAnnotation(annotation, Proportion)
|
||||||
|
})
|
||||||
|
.catch(action => {
|
||||||
|
this.saveCustomAnnotation(annotation, -1)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, 500)
|
||||||
|
this.saveCustomAnnotationTimer = setTimeout(() => { this.saveCustomAnnotation(annotation) }, 500)
|
||||||
},
|
},
|
||||||
getLengthscaleToolTextLines(data, targetId) {
|
getLengthscaleToolTextLines(data, targetId) {
|
||||||
const cachedVolumeStats = data.cachedStats[targetId]
|
const cachedVolumeStats = data.cachedStats[targetId]
|
||||||
|
|
@ -1087,6 +1339,9 @@ export default {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const textLines = []
|
const textLines = []
|
||||||
|
if (data.label) {
|
||||||
|
textLines.push(data.label)
|
||||||
|
}
|
||||||
textLines.push(`P: ${parseFloat(length).toFixed(this.digitPlaces)} ${unit}`)
|
textLines.push(`P: ${parseFloat(length).toFixed(this.digitPlaces)} ${unit}`)
|
||||||
if (data.l) {
|
if (data.l) {
|
||||||
textLines.push(`L: ${parseFloat(data.l).toFixed(this.digitPlaces)} mm`)
|
textLines.push(`L: ${parseFloat(data.l).toFixed(this.digitPlaces)} mm`)
|
||||||
|
|
@ -1097,7 +1352,7 @@ export default {
|
||||||
// 直线工具注释
|
// 直线工具注释
|
||||||
getLengthToolTextLines(data, targetId) {
|
getLengthToolTextLines(data, targetId) {
|
||||||
const cachedVolumeStats = data.cachedStats[targetId]
|
const cachedVolumeStats = data.cachedStats[targetId]
|
||||||
const { length, unit } = cachedVolumeStats
|
let { length, unit } = cachedVolumeStats
|
||||||
if (length === undefined || length === null || isNaN(length)) {
|
if (length === undefined || length === null || isNaN(length)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -1108,6 +1363,9 @@ export default {
|
||||||
ps = parseFloat(this.psArr[i].PS).toFixed(3)
|
ps = parseFloat(this.psArr[i].PS).toFixed(3)
|
||||||
}
|
}
|
||||||
const textLines = []
|
const textLines = []
|
||||||
|
if (data.label) {
|
||||||
|
textLines.push(data.label)
|
||||||
|
}
|
||||||
if (ps) {
|
if (ps) {
|
||||||
textLines.push(`${this.reRound(csUtils.roundNumber(length * ps), this.digitPlaces)} mm`)
|
textLines.push(`${this.reRound(csUtils.roundNumber(length * ps), this.digitPlaces)} mm`)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1131,6 +1389,9 @@ export default {
|
||||||
} = cachedVolumeStats || {}
|
} = cachedVolumeStats || {}
|
||||||
|
|
||||||
const textLines = []
|
const textLines = []
|
||||||
|
if (data.label) {
|
||||||
|
textLines.push(data.label)
|
||||||
|
}
|
||||||
let ps = null
|
let ps = null
|
||||||
const path = targetId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
const path = targetId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
||||||
const i = this.psArr.findIndex(i => i.Path === path)
|
const i = this.psArr.findIndex(i => i.Path === path)
|
||||||
|
|
@ -1180,6 +1441,9 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
const textLines = []
|
const textLines = []
|
||||||
|
if (data.label) {
|
||||||
|
textLines.push(data.label)
|
||||||
|
}
|
||||||
let ps = null
|
let ps = null
|
||||||
const path = targetId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
const path = targetId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
||||||
const i = this.psArr.findIndex(i => i.Path === path)
|
const i = this.psArr.findIndex(i => i.Path === path)
|
||||||
|
|
@ -1216,6 +1480,9 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
const textLines = []
|
const textLines = []
|
||||||
|
if (data.label) {
|
||||||
|
textLines.push(data.label)
|
||||||
|
}
|
||||||
let ps = null
|
let ps = null
|
||||||
const path = targetId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
const path = targetId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
||||||
const i = this.psArr.findIndex(i => i.Path === path)
|
const i = this.psArr.findIndex(i => i.Path === path)
|
||||||
|
|
@ -1242,6 +1509,9 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
const textLines = []
|
const textLines = []
|
||||||
|
if (data.label) {
|
||||||
|
textLines.push(data.label)
|
||||||
|
}
|
||||||
let ps = null
|
let ps = null
|
||||||
const path = targetId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
const path = targetId.split(`web:${this.OSSclientConfig.basePath}`)[1]
|
||||||
const i = this.psArr.findIndex(i => i.Path === path)
|
const i = this.psArr.findIndex(i => i.Path === path)
|
||||||
|
|
@ -1300,16 +1570,77 @@ export default {
|
||||||
viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true })
|
viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true })
|
||||||
renderingEngine.render()
|
renderingEngine.render()
|
||||||
},
|
},
|
||||||
// 箭头工具输入标记名称自定义弹窗
|
resetAnnotations({ annotations, visitTaskId }) {
|
||||||
async customPrompt() {
|
// 移除病灶
|
||||||
|
const arr = cornerstoneTools.annotation.state.getAllAnnotations()
|
||||||
|
arr.map(i => {
|
||||||
|
if (i.visitTaskId === visitTaskId) {
|
||||||
|
cornerstoneTools.annotation.state.removeAnnotation(i.annotationUID)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
annotations.map(i => {
|
||||||
|
if (i.MeasureData) {
|
||||||
|
const annotation = i.MeasureData
|
||||||
|
cornerstoneTools.annotation.state.addAnnotation(annotation)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const renderingEngine = getRenderingEngine(renderingEngineId)
|
||||||
|
for (let i = 0; i < this.cells.length; i++) {
|
||||||
|
const viewportId = `canvas-${i}`
|
||||||
|
const viewport = renderingEngine.getViewport(viewportId)
|
||||||
|
viewport.render()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 输入标记名称自定义弹窗
|
||||||
|
async customPrompt(isShowCancelButton = true) {
|
||||||
try {
|
try {
|
||||||
|
const that = this
|
||||||
// 请输入标记名称
|
// 请输入标记名称
|
||||||
const { value } = await this.$prompt(this.$t('trials:noneDicom:message:msg1'))
|
let message = this.$t('trials:noneDicom:message:msg1')
|
||||||
|
// if (isShowCancelButton) {
|
||||||
|
// message = `<div><p>${this.$t('trials:noneDicom:message:msg1')}</p><p style='font-size:12px' class='customPromptTip'>${this.$t('trials:noneDicom:message:saveTip')}</p></div>`
|
||||||
|
// }
|
||||||
|
const { value } = await this.$prompt(message, '', {
|
||||||
|
showClose: false,
|
||||||
|
cancelButtonText: isShowCancelButton ? this.$t('trials:reading:button:temporarySave') : this.$t('common:button:cancel'),
|
||||||
|
confirmButtonText: isShowCancelButton ? this.$t('trials:reading:button:enduringSave') : this.$t('trials:reading:button:relevancy'),
|
||||||
|
// showCancelButton: isShowCancelButton,
|
||||||
|
// dangerouslyUseHTMLString: isShowCancelButton,
|
||||||
|
inputValidator: (res) => {
|
||||||
|
if (!res) {
|
||||||
|
return isShowCancelButton ? this.$t('trials:noneDicom:message:saveTip') : this.$t('trials:noneDicom:message:saveTipByRelevancy')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
inputErrorMessage: this.$t('trials:noneDicom:message:saveTip'),
|
||||||
|
showCancelButton: true,
|
||||||
|
closeOnClickModal: false,
|
||||||
|
closeOnPressEscape: false,
|
||||||
|
beforeClose: (action, instance, done) => {
|
||||||
|
if (action === 'confirm') {
|
||||||
|
const value = instance.inputValue
|
||||||
|
if (!value) {
|
||||||
|
that.$message.error(this.$t('trials:customReading:error:validMarkName1'))
|
||||||
|
} else if (this.validMarkName(value)) {
|
||||||
|
that.$message.error(this.$t('trials:customReading:error:validMarkName'))
|
||||||
|
} else {
|
||||||
|
done()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
done()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
return value
|
return value
|
||||||
} catch {
|
} catch (err) {
|
||||||
|
console.log(err)
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
validMarkName(markName) {
|
||||||
|
const annotations = cornerstoneTools.annotation.state.getAllAnnotations()
|
||||||
|
const i = annotations.findIndex(i => i.visitTaskId === this.taskInfo.VisitTaskId && i.data.label === markName)
|
||||||
|
return i > -1
|
||||||
|
},
|
||||||
// 滚动条
|
// 滚动条
|
||||||
clickSlider(e, index) {
|
clickSlider(e, index) {
|
||||||
const height = e.offsetY * 100 / this.$refs[`sliderBox-${index}`][0].clientHeight
|
const height = e.offsetY * 100 / this.$refs[`sliderBox-${index}`][0].clientHeight
|
||||||
|
|
|
||||||
|
|
@ -35,13 +35,13 @@
|
||||||
@toggleTask="toggleTask"
|
@toggleTask="toggleTask"
|
||||||
@toggleImage="toggleImage"
|
@toggleImage="toggleImage"
|
||||||
/> -->
|
/> -->
|
||||||
<file-viewer ref="fileViewer" :related-study-info="relatedStudyInfo" :ps-arr="psArr"
|
<file-viewer ref="fileViewer" :related-study-info="relatedStudyInfo" :ps-arr="psArr" :ecrf="ecrf"
|
||||||
@toggleTaskByViewer="toggleTaskByViewer" @toggleTask="toggleTask" @toggleImage="toggleImage"
|
@toggleTaskByViewer="toggleTaskByViewer" @toggleTask="toggleTask" @toggleImage="toggleImage"
|
||||||
@previewCD="previewCD" @setPS="setPS" />
|
@previewCD="previewCD" @setPS="setPS" @getEcrf="getEcrf" />
|
||||||
</div>
|
</div>
|
||||||
<!-- 表单 -->
|
<!-- 表单 -->
|
||||||
<div class="right-panel">
|
<div class="right-panel">
|
||||||
<div v-if="taskInfo && taskInfo.IsReadingShowSubjectInfo" class="text-info">
|
<!-- <div v-if="taskInfo && taskInfo.IsReadingShowSubjectInfo" class="text-info">
|
||||||
<h3>
|
<h3>
|
||||||
<span v-if="currentVisitInfo && currentVisitInfo.SubjectCode">
|
<span v-if="currentVisitInfo && currentVisitInfo.SubjectCode">
|
||||||
{{ currentVisitInfo.SubjectCode }}
|
{{ currentVisitInfo.SubjectCode }}
|
||||||
|
|
@ -50,15 +50,20 @@
|
||||||
{{ currentVisitInfo.TaskBlindName }}
|
{{ currentVisitInfo.TaskBlindName }}
|
||||||
</span>
|
</span>
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div> -->
|
||||||
<!-- <ecrf-list
|
<!-- <ecrf-list
|
||||||
v-if="currentVisitInfo"
|
v-if="currentVisitInfo"
|
||||||
:visit-task-info="currentVisitInfo"
|
:visit-task-info="currentVisitInfo"
|
||||||
/> -->
|
/> -->
|
||||||
<customize-question-list v-if="currentVisitInfo.VisitTaskId" :ref="`ecrf_1`" :reading-task-state="1"
|
<div v-for="s in visitTaskList" v-show="lastViewportTaskId === s.VisitTaskId" :key="s.VisitTaskId"
|
||||||
:visit-info="currentVisitInfo" @resetAnnotations="resetAnnotations" @setReadingTaskState="setReadingTaskState"
|
style="height: 100%;">
|
||||||
@viewCustomAnnotationSeries="viewCustomAnnotationSeries" @getCustomScreenshots="getCustomScreenshots"
|
<customize-question-list v-if="lastViewportTaskId" :ref="`ecrf_${s.VisitTaskId}`" :isNoneDicom="true"
|
||||||
@setReadingToolActive="setReadingToolActive" @setReadingToolPassive="setReadingToolPassive" />
|
:reading-task-state="readingTaskState" :visit-info="currentVisitInfo" @resetAnnotations="resetAnnotations"
|
||||||
|
@setReadingTaskState="setReadingTaskState" @viewCustomAnnotationSeries="viewCustomAnnotationSeries"
|
||||||
|
@getCustomScreenshots="getCustomScreenshots" @setReadingToolActive="setReadingToolActive"
|
||||||
|
@setReadingToolPassive="setReadingToolPassive" @setSaved="setSaved"
|
||||||
|
@setIsHaveBindingQuestion="setIsHaveBindingQuestion" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-dialog :visible.sync="clinicalDataVisible"
|
<el-dialog :visible.sync="clinicalDataVisible"
|
||||||
|
|
@ -125,7 +130,11 @@ export default {
|
||||||
isClinicalDataFullscreen: false,
|
isClinicalDataFullscreen: false,
|
||||||
trialId: '',
|
trialId: '',
|
||||||
cdVisitTaskId: '',
|
cdVisitTaskId: '',
|
||||||
psArr: []
|
psArr: [],
|
||||||
|
readingTaskState: 0,
|
||||||
|
ecrf: {
|
||||||
|
IsHaveBindingQuestion: false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|
@ -147,29 +156,73 @@ export default {
|
||||||
mounted() {
|
mounted() {
|
||||||
this.taskInfo = JSON.parse(localStorage.getItem('taskInfo'))
|
this.taskInfo = JSON.parse(localStorage.getItem('taskInfo'))
|
||||||
this.trialId = this.$route.query.trialId
|
this.trialId = this.$route.query.trialId
|
||||||
|
this.readingTaskState = this.taskInfo.ReadingTaskState
|
||||||
this.getRelatedTask()
|
this.getRelatedTask()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
resetAnnotations() { },
|
getEcrf(data) {
|
||||||
setReadingTaskState() { },
|
let { type } = data
|
||||||
viewCustomAnnotationSeries() { },
|
if (type === 'getOperateStateEnum') {
|
||||||
getCustomScreenshots() { },
|
this.ecrf.operateStateEnum = this.$refs[`ecrf_${data.VisitTaskId}`][0].operateStateEnum
|
||||||
setReadingToolPassive() { },
|
}
|
||||||
|
if (type === 'bindAnnotationToQuestion') {
|
||||||
|
this.$refs[`ecrf_${data.VisitTaskId}`][0].bindAnnotationToQuestion(data.annotation)
|
||||||
|
}
|
||||||
|
if (type === 'updateAnnotationToQuestion') {
|
||||||
|
this.$refs[`ecrf_${data.VisitTaskId}`][0].updateAnnotationToQuestion(data.annotation)
|
||||||
|
}
|
||||||
|
if (type === 'verifyAnnotationIsBound') {
|
||||||
|
this.ecrf.isBound = this.$refs[`ecrf_${data.VisitTaskId}`][0].verifyAnnotationIsBound(data.annotation)
|
||||||
|
}
|
||||||
|
if (type === 'getQuestions') {
|
||||||
|
this.ecrf.isBound = this.$refs[`ecrf_${data.VisitTaskId}`][0].getQuestions()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setSaved(saved) {
|
||||||
|
this.$refs.fileViewer.lengthscaleToolDisabled(saved)
|
||||||
|
},
|
||||||
|
setIsHaveBindingQuestion(flag) {
|
||||||
|
this.ecrf.IsHaveBindingQuestion = flag
|
||||||
|
},
|
||||||
|
async resetAnnotations(visitTaskId) {
|
||||||
|
if (this.readingTaskState === 2) return
|
||||||
|
const taskIdx = this.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
||||||
|
if (taskIdx === -1) return
|
||||||
|
if (!this.visitTaskList[taskIdx].IsCurrentTask) return
|
||||||
|
// 获取标注信息
|
||||||
|
let res = await getNoneDicomMarkListOutDto({ visitTaskId: visitTaskId })
|
||||||
|
|
||||||
|
const annotations = res.Result.NoneDicomMarkList.map(i => {
|
||||||
|
if (typeof i.MeasureData === 'string' && i.MeasureData) {
|
||||||
|
i.MeasureData = JSON.parse(i.MeasureData)
|
||||||
|
i.MeasureData.markId = i.MarkId
|
||||||
|
i.MeasureData.id = i.Id
|
||||||
|
}
|
||||||
|
this.psArr = []
|
||||||
|
if (i.MeasureData.metadata.toolName === 'Lengthscale' && this.psArr.findIndex(p => p.NoneDicomFileId === i.NoneDicomFileId) === -1) {
|
||||||
|
this.psArr.push({ NoneDicomFileId: i.NoneDicomFileId, Path: i.Path, PS: i.MeasureData.data.ps, OldPS: i.MeasureData.data.ps })
|
||||||
|
}
|
||||||
|
return i
|
||||||
|
})
|
||||||
|
this.$set(this.visitTaskList[taskIdx], 'Annotations', annotations)
|
||||||
|
// this.$refs.fileViewer.resetAnnotations({ annotations, visitTaskId })
|
||||||
|
},
|
||||||
|
setReadingTaskState(state) {
|
||||||
|
this.readingTaskState = state
|
||||||
|
},
|
||||||
|
viewCustomAnnotationSeries(obj) {
|
||||||
|
this.$refs.fileViewer.viewCustomAnnotation(obj)
|
||||||
|
},
|
||||||
|
getCustomScreenshots(obj, callback) {
|
||||||
|
this.$refs.fileViewer.getScreenshots(obj, callback)
|
||||||
|
},
|
||||||
|
setReadingToolPassive() {
|
||||||
|
this.$refs.fileViewer.setToolsPassive()
|
||||||
|
},
|
||||||
setReadingToolActive(toolName) {
|
setReadingToolActive(toolName) {
|
||||||
if (this.readingTaskState === 2) return
|
if (this.readingTaskState === 2) return
|
||||||
if (this.activeTool === toolName) return
|
if (this.activeTool === toolName) return
|
||||||
const series = this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].series
|
this.$refs.fileViewer.setToolActive(toolName)
|
||||||
if (series && series.TaskInfo.VisitTaskId && series.TaskInfo.VisitTaskId === this.taskInfo.VisitTaskId) {
|
|
||||||
const toolGroupId = `${this.viewportKey}-${this.activeViewportIndex}`
|
|
||||||
const toolGroup = ToolGroupManager.getToolGroup(toolGroupId)
|
|
||||||
if (this.activeTool) {
|
|
||||||
toolGroup.setToolPassive(this.activeTool)
|
|
||||||
}
|
|
||||||
toolGroup.setToolActive(toolName, {
|
|
||||||
bindings: [{ mouseButton: MouseBindings.Primary }]
|
|
||||||
})
|
|
||||||
this.activeTool = toolName
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
// 获取关联任务信息
|
// 获取关联任务信息
|
||||||
async getRelatedTask() {
|
async getRelatedTask() {
|
||||||
|
|
@ -254,9 +307,11 @@ export default {
|
||||||
const arr = res.Result.NoneDicomMarkList.map(i => {
|
const arr = res.Result.NoneDicomMarkList.map(i => {
|
||||||
if (typeof i.MeasureData === 'string') {
|
if (typeof i.MeasureData === 'string') {
|
||||||
i.MeasureData = JSON.parse(i.MeasureData)
|
i.MeasureData = JSON.parse(i.MeasureData)
|
||||||
|
i.MeasureData.markId = i.MarkId
|
||||||
|
i.MeasureData.id = i.Id
|
||||||
}
|
}
|
||||||
if (i.MeasureData.metadata.toolName === 'Lengthscale' && this.psArr.findIndex(p => p.NoneDicomFileId === i.NoneDicomFileId) === -1) {
|
if (i.MeasureData.metadata.toolName === 'Lengthscale' && this.psArr.findIndex(p => p.NoneDicomFileId === i.NoneDicomFileId) === -1) {
|
||||||
this.psArr.push({ NoneDicomFileId: i.NoneDicomFileId, Path: i.Path, PS: i.MeasureData.data.ps })
|
this.psArr.push({ NoneDicomFileId: i.NoneDicomFileId, Path: i.Path, PS: i.MeasureData.data.ps, OldPS: i.MeasureData.data.ps })
|
||||||
}
|
}
|
||||||
return i
|
return i
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue