lugano病灶融合

uat_us
caiyiling 2024-02-20 15:54:22 +08:00
parent ee8b630806
commit 6e95127522
4 changed files with 184 additions and 18 deletions

View File

@ -3519,3 +3519,18 @@ export function getTrialSiteSurveySelectList(param) {
data: param
})
}
export function getCanMergeLesion(param) {
return request({
url: `/ReadingImageTask/getCanMergeLesion`,
method: 'post',
data: param
})
}
export function mergeLesion(param) {
return request({
url: `/ReadingImageTask/mergeLesion`,
method: 'post',
data: param
})
}

View File

@ -14,7 +14,7 @@
<!-- 临床数据 -->
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:clinicalData')" placement="bottom">
<svg-icon icon-class="documentation" class="svg-icon"/>
<svg-icon icon-class="documentation" class="svg-icon" />
</el-tooltip>
</div>
@ -223,7 +223,7 @@ export default {
taskBlindName: '',
frame: null,
imageRendered: false,
isExistsClinicalData:false
isExistsClinicalData: false
// preventCache: true
},
dicomInfo: {
@ -539,7 +539,7 @@ export default {
this.mousePosition.y = currentPoints.image.y + 1
this.mousePosition.mo = stats.mo
this.mousePosition.suv = stats.suv
if (this.isFirstChangeTask && this.pointNearTool(e)) {
if ((this.isFirstChangeTask || this.disabledMarks.length > 0) && this.pointNearTool(e)) {
e.stopImmediatePropagation()
e.stopPropagation()
e.preventDefault()
@ -555,7 +555,7 @@ export default {
mouseDown(e) {
this.image = e.detail.image
var pointNearTool = this.pointNearTool(e)
if (this.isFirstChangeTask && pointNearTool) {
if ((this.isFirstChangeTask || this.disabledMarks.length > 0) && pointNearTool) {
e.stopImmediatePropagation()
e.stopPropagation()
e.preventDefault()
@ -604,6 +604,15 @@ export default {
})
return arr
},
getMergeMarks(measureDatas) {
var arr = []
measureDatas.map(i => {
if ((i.LesionType === 0) && i.SplitOrMergeType === 1) {
arr.push(i.OrderMarkName)
}
})
return arr
},
getRGBPixels(element, x, y, width, height) {
if (!element) {
return
@ -1064,11 +1073,15 @@ export default {
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === dicomSeries.visitTaskId)
this.stack.visitTaskNum = this.visitTaskList[idx].VisitTaskNum
this.isFirstChangeTask = this.visitTaskList[idx].IsFirstChangeTask
var criterionType = parseInt(localStorage.getItem('CriterionType'))
if (this.isFirstChangeTask) {
this.disabledMarks = this.getDisabledMarks(this.visitTaskList[idx].MeasureData)
} else if (criterionType === 2) {
this.disabledMarks = this.getMergeMarks(this.visitTaskList[idx].MeasureData)
} else {
this.disabledMarks = []
}
this.maxVistNum = this.visitTaskList[this.visitTaskList.length - 1].VisitTaskNum
this.minVistNum = this.visitTaskList[0].VisitTaskNum
this.measureData = this.visitTaskList[idx].MeasureData

View File

@ -30,7 +30,7 @@
<el-select
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask"
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask || answers.SplitOrMergeType === '1'"
:popper-append-to-body="lesionType === 0 ? false :true"
@change="((val)=>{lesionTypeChange(val)})"
>
@ -63,7 +63,7 @@
<el-input
v-if="qs.Type==='input' || qs.Type==='number'"
v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName))"
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName)) || answers.SplitOrMergeType === '1'"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
@ -77,7 +77,7 @@
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
:disabled="!isCurrentTask || readingTaskState>=2 || answers.SplitOrMergeType === '1'"
@change="((val)=>{formItemChange(val, qs)})"
/>
<!-- 下拉框 -->
@ -88,7 +88,7 @@
v-model="questionForm[qs.Id]"
filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False'|| !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 7 && stateDisabled)"
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False'|| !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 7 && stateDisabled) || answers.SplitOrMergeType === '1'"
:popper-append-to-body="lesionType === 0 ? false :true"
@change="((val)=>{formItemChange(val, qs)})"
>
@ -166,7 +166,7 @@
<el-radio-group
v-if="qs.Type==='radio'"
v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
:disabled="!isCurrentTask || readingTaskState>=2 || answers.SplitOrMergeType === '1'"
>
<el-radio
v-for="val in qs.options.split('|')"
@ -234,7 +234,7 @@
</el-form-item>
</div>
<div
v-if="isCurrentTask && readingTaskState<2"
v-if="isCurrentTask && readingTaskState<2 && answers.SplitOrMergeType !== '1'"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>

View File

@ -87,16 +87,16 @@
</div>
</div>
<div v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'" style="position: absolute;right: 5px;top: 2px;">
<div v-if="item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'" style="position: absolute;right: 5px;top: 2px;">
<!-- 分裂 -->
<el-tooltip v-show="!!item.TableQuestions.Answers[i].RowId" class="item" :content="$t('trials:reading:button:split')" placement="bottom">
<el-tooltip v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '1' && ((item.LesionType === 0 && [0,4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 1 && [0,1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0))" class="item" :content="$t('trials:reading:button:split')" placement="bottom">
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId,item.Id)" />
</el-tooltip>
<!-- 融合 -->
<!-- <el-tooltip v-show="!!item.TableQuestions.Answers[i].RowId " class="item" :content="$t('trials:reading:button:merge')" placement="bottom">
<i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;" />
</el-tooltip> -->
<el-tooltip v-show="!!item.TableQuestions.Answers[i].RowId && item.TableQuestions.Answers[i].SplitOrMergeType !== '2' && ((item.LesionType === 0 && [0,1,4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))))" class="item" :content="$t('trials:reading:button:merge')" placement="bottom">
<i class="iconfont icon-24gl-merge" style="color:#fff;font-size: 16px;" @click.stop="handleMerge(item.TableQuestions.Answers[i],item.Id,item.OrderMark)" />
</el-tooltip>
</div>
</div>
@ -149,10 +149,62 @@
@setNonTargetMeasurementStatus="setNonTargetMeasurementStatus"
/>
</div>
<el-dialog
v-if="merge.visible"
v-loading="merge.loading"
:visible.sync="merge.visible"
:close-on-click-modal="false"
title="靶病灶融合"
width="500px"
>
<div class="merge-table">
<div class="merge-label">
<label>当前病灶 </label>
<span>{{ mergeInfo.lesionName }}</span>
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div>
<div class="merge-label"><label>请选择融合病灶 </label></div>
<el-table
:data="lesionData"
style="width: 450px"
size="mini"
height="200"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="45"
/>
<el-table-column
prop="OrderMarkName"
label="编号"
width="80"
/>
<el-table-column
prop="Part"
label="部位"
min-width="120"
show-overflow-tooltip
/>
</el-table>
</div>
<div slot="footer" style="text-align:right;">
<!-- 确认 -->
<el-button
type="primary"
size="mini"
:disabled="mergeList.length === 0"
@click="confirmMerge"
>
{{ $t('common:button:confirm') }}</el-button>
<!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { splitLesion, getSplitPPdSum } from '@/api/trials'
import { splitLesion, getSplitPPdSum, getCanMergeLesion, mergeLesion } from '@/api/trials'
import DicomEvent from './../DicomEvent'
import store from '@/store'
import { mapGetters } from 'vuex'
@ -209,7 +261,11 @@ export default {
subjectCode: '',
isNonTargetMeasurement: false,
splitTargetLesions: [],
lesionTypeQuestionId: ''
lesionTypeQuestionId: '',
merge: { visible: false, loading: false },
lesionData: [],
mergeInfo: {},
mergeList: []
}
},
computed: {
@ -288,7 +344,6 @@ export default {
},
methods: {
async initList() {
console.log('initList')
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) {
this.visitTaskId = this.visitTaskList[i].VisitTaskId
@ -613,6 +668,53 @@ export default {
})
})
},
//
handleMerge(answers, questionId, orderMark) {
this.lesionData = []
this.merge.visible = true
this.mergeInfo.questionId = questionId
this.mergeInfo.mergeRowId = answers.RowId
this.mergeInfo.lesionName = this.getLesionName(orderMark, answers.RowIndex)
this.mergeInfo.lesionPart = answers.lesionPart
this.merge.loading = true
getCanMergeLesion({ rowId: answers.RowId }).then(res => {
this.lesionData = res.Result
this.merge.loading = false
}).catch(() => { this.merge.loading = false })
},
handleSelectionChange(val) {
this.mergeList = []
val.map(i => {
this.mergeList.push(i.RowId)
})
},
confirmMerge() {
this.$confirm('融合后将无法撤销, 是否继续?', '提示', {
type: 'warning'
}).then(() => {
this.lesionMerge()
}).catch(() => {
})
},
lesionMerge() {
this.merge.loading = true
var params = {
visitTaskId: this.visitTaskId,
questionId: this.mergeInfo.questionId,
mergeRowId: this.mergeInfo.mergeRowId,
meltingInToLesionList: this.mergeList
}
mergeLesion(params).then(res => {
this.merge.loading = false
this.merge.visible = false
DicomEvent.$emit('readingPageUpdate', {})
DicomEvent.$emit('getReportInfo', true)
DicomEvent.$emit('setMeasuredToolsPassive')
this.getReadingQuestionAndAnswer()
//
}).catch(() => { this.merge.loading = false })
},
isCanActiveTool(toolName) {
this.isNonTargetMeasurement = false
this.getUnSaveTarget()
@ -1233,5 +1335,41 @@ export default {
}
}
.merge-table{
padding:0 10px;
/deep/.el-table{
background-color: #1e1e1e !important;
color: #dfdfdf;
}
/deep/.el-table td.el-table__cell, .el-table th.el-table__cell.is-leaf{
border-bottom: 1px solid #dfdfdf;
}
.el-table--border::after, .el-table--group::after, .el-table::before{
background-color: #1e1e1e;
}
/deep/.el-table__header-wrapper{
th{
background-color: #1e1e1e !important;
color: #dfdfdf;
}
}
/deep/.el-table__body-wrapper{
tr{
background-color: #1e1e1e !important;
color: #dfdfdf;
}
tr:hover > td{
background-color: #1e1e1e !important;
}
}
/deep/.el-table__empty-block{
background-color: #1e1e1e !important;
}
.merge-label{
color:#ddd;
font-size: 13px;
margin-bottom: 10px;
}
}
}
</style>