下载进度提示

main
wangxiaoshuang 2025-12-11 16:24:37 +08:00
parent edb03fef23
commit b661a51ec2
6 changed files with 1068 additions and 159 deletions

View File

@ -80,7 +80,25 @@
placement="bottom"> placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 62px;top: 2px;"> <div
:style="{ position: 'absolute', left: item.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px' }">
<div
style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
<el-tooltip
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'"
class="item" effect="dark"
:content="`${$t('trials:reading:message:fused')}${item.TableQuestions.Answers[i].SplitOrMergeLesionName}`"
placement="bottom">
<div
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(item.TableQuestions.Answers[i].MergeRowId)}`" />
</div>
</el-tooltip>
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(item.TableQuestions.Answers[i].RowId)}`" />
</div>
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; --> <!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div style="font-size: 11px;width:220px;height: 30px;"> <div style="font-size: 11px;width:220px;height: 30px;">
<div v-if="item.TableQuestions.Answers[i].lesionPart" <div v-if="item.TableQuestions.Answers[i].lesionPart"
@ -105,7 +123,8 @@
{{ $fd('NewTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NewTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }}
</span> </span>
<span v-else-if="item.LesionType === 6"> <span v-else-if="item.LesionType === 6">
{{ $fd('NewNoTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState)) }} {{ $fd('NewNoTargetLesionState', parseInt(item.TableQuestions.Answers[i].lesionState))
}}
</span> </span>
<span v-else-if="item.LesionType === 7"> <span v-else-if="item.LesionType === 7">
{{ $fd('OtherPreviousNewLesionState', {{ $fd('OtherPreviousNewLesionState',
@ -132,8 +151,10 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<div <div
v-if="((item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0, 1, 4, 5].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 5 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1) || (item.LesionType === 6 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 7 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 8 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'" v-if="((item.LesionType === 0 && [0, 1, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 0 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 1 && [0, 1, 4, 5].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 2 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 5 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1) || (item.LesionType === 6 && [0, 1].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (item.LesionType === 7 && parseInt(item.TableQuestions.Answers[i].lesionState) === 0) || (item.LesionType === 8 && parseInt(item.TableQuestions.Answers[i].lesionState) === 1)) && item.TableQuestions.Answers[i].IsCurrentTaskAdd === 'False'"
style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);"> style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<!-- 分裂 --> <!-- 分裂 -->
<el-tooltip <el-tooltip
@ -142,6 +163,13 @@
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" <i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" /> @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" />
</el-tooltip> </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>
</div> </div>
@ -165,10 +193,35 @@
</div> </div>
</template> </template>
</div> </div>
<el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible"
:close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px">
<div class="merge-table">
<div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
<span>{{ mergeInfo.lesionName }}</span>
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table :data="lesionData" style="width: 450px" size="small" height="200"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="45" />
<el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" />
<el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120"
show-overflow-tooltip />
</el-table>
</div>
<div slot="footer" style="text-align:right;">
<!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 -->
<el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge">
{{ $t('common:button:confirm') }}</el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { splitLesion } from '@/api/trials' import { splitLesion, getCanMergeLesion, mergeLesion } from '@/api/trials'
import { resetReadingTask } from '@/api/reading' import { resetReadingTask } from '@/api/reading'
import DicomEvent from './../DicomEvent' import DicomEvent from './../DicomEvent'
import store from '@/store' import store from '@/store'
@ -224,7 +277,12 @@ export default {
criterionType: null, criterionType: null,
subjectCode: '', subjectCode: '',
isConvertedTask: null, isConvertedTask: null,
isFirstChangeTask: null isFirstChangeTask: null,
merge: { visible: false, loading: false },
lesionData: [],
mergeInfo: {},
mergeList: []
} }
}, },
computed: { computed: {
@ -280,6 +338,66 @@ export default {
handleReadingChart(e) { handleReadingChart(e) {
this.$emit('handleReadingChart', e) this.$emit('handleReadingChart', e)
}, },
//
async handleMerge(answers, questionId, orderMark) {
this.lesionData = []
this.mergeList = []
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
try {
const res = await getCanMergeLesion({ rowId: answers.RowId })
if (res.IsSuccess) {
this.lesionData = res.Result
}
this.merge.loading = false
} catch (e) {
console.log(e)
this.merge.loading = false
}
},
handleSelectionChange(val) {
this.mergeList = []
val.map(i => {
this.mergeList.push(i.RowId)
})
},
confirmMerge() {
// ', ?'
this.$confirm(this.$t('trials:reading:lugano:warnning:fuse'), {
type: 'warning'
}).then(() => {
this.lesionMerge()
}).catch(() => {
})
},
async lesionMerge() {
this.merge.loading = true
try {
var params = {
visitTaskId: this.visitTaskId,
questionId: this.mergeInfo.questionId,
mergeMainRowId: this.mergeInfo.mergeRowId,
mergeRowIdList: this.mergeList
}
const res = await mergeLesion(params)
if (res.IsSuccess) {
this.merge.visible = false
DicomEvent.$emit('readingPageUpdate', {})
DicomEvent.$emit('getReportInfo', true)
DicomEvent.$emit('setMeasuredToolsPassive')
this.getReadingQuestionAndAnswer()
}
this.merge.loading = false
} catch (e) {
this.merge.loading = false
console.log(e)
}
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -1181,6 +1299,70 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.login-cycle {
width: 5px;
height: 5px;
display: inline-block;
background-color: #428bca;
border-radius: 50%;
margin-right: 2px;
margin-bottom: 2px;
}
.merge-table {
padding: 0 10px;
::v-deep.el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
.el-table--border::after,
.el-table--group::after,
.el-table::before {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
border-bottom: 1px solid #383838;
}
}
::v-deep.el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
tr:hover>td {
background-color: #1e1e1e !important;
}
}
::v-deep.el-table__empty-block {
background-color: #1e1e1e !important;
}
.merge-label {
color: #ddd;
font-size: 13px;
margin-bottom: 10px;
span {
font-size: 15px;
color: red;
}
}
}
.measurement-wrapper { .measurement-wrapper {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;

View File

@ -68,7 +68,25 @@
placement="bottom"> placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 50px;top: 2px;"> <div
:style="{ position: 'absolute', left: item.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px' }">
<div
style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
<el-tooltip
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'"
class="item" effect="dark"
:content="`${$t('trials:reading:message:fused')}${item.TableQuestions.Answers[i].SplitOrMergeLesionName}`"
placement="bottom">
<div
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(item.TableQuestions.Answers[i].MergeRowId)}`" />
</div>
</el-tooltip>
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(item.TableQuestions.Answers[i].RowId)}`" />
</div>
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; --> <!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
<div style="font-size: 11px;width:220px;height: 30px;"> <div style="font-size: 11px;width:220px;height: 30px;">
<div v-if="item.TableQuestions.Answers[i].lesionPart" <div v-if="item.TableQuestions.Answers[i].lesionPart"
@ -103,8 +121,10 @@
</div> </div>
</div> </div>
</div> </div>
</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'" v-if="((item.LesionType === 0 && [0, 1, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (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;transform: rotateY(180deg);"> style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<!-- 分裂 --> <!-- 分裂 -->
<el-tooltip <el-tooltip
@ -113,6 +133,13 @@
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" <i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" /> @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" />
</el-tooltip> </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>
</div> </div>
@ -134,10 +161,35 @@
</div> </div>
</template> </template>
</div> </div>
<el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible"
:close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px">
<div class="merge-table">
<div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
<span>{{ mergeInfo.lesionName }}</span>
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table :data="lesionData" style="width: 450px" size="small" height="200"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="45" />
<el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" />
<el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120"
show-overflow-tooltip />
</el-table>
</div>
<div slot="footer" style="text-align:right;">
<!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 -->
<el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge">
{{ $t('common:button:confirm') }}</el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { splitLesion } from '@/api/trials' import { splitLesion, getCanMergeLesion, mergeLesion } from '@/api/trials'
import { resetReadingTask } from '@/api/reading' import { resetReadingTask } from '@/api/reading'
import DicomEvent from './../DicomEvent' import DicomEvent from './../DicomEvent'
import store from '@/store' import store from '@/store'
@ -191,7 +243,12 @@ export default {
tableQuestions: [], tableQuestions: [],
isFirstRender: false, isFirstRender: false,
CriterionType: null, CriterionType: null,
subjectCode: '' subjectCode: '',
merge: { visible: false, loading: false },
lesionData: [],
mergeInfo: {},
mergeList: []
} }
}, },
computed: { computed: {
@ -248,6 +305,66 @@ export default {
handleReadingChart(e) { handleReadingChart(e) {
this.$emit('handleReadingChart', e) this.$emit('handleReadingChart', e)
}, },
//
async handleMerge(answers, questionId, orderMark) {
this.lesionData = []
this.mergeList = []
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
try {
const res = await getCanMergeLesion({ rowId: answers.RowId })
if (res.IsSuccess) {
this.lesionData = res.Result
}
this.merge.loading = false
} catch (e) {
console.log(e)
this.merge.loading = false
}
},
handleSelectionChange(val) {
this.mergeList = []
val.map(i => {
this.mergeList.push(i.RowId)
})
},
confirmMerge() {
// ', ?'
this.$confirm(this.$t('trials:reading:lugano:warnning:fuse'), {
type: 'warning'
}).then(() => {
this.lesionMerge()
}).catch(() => {
})
},
async lesionMerge() {
this.merge.loading = true
try {
var params = {
visitTaskId: this.visitTaskId,
questionId: this.mergeInfo.questionId,
mergeMainRowId: this.mergeInfo.mergeRowId,
mergeRowIdList: this.mergeList
}
const res = await mergeLesion(params)
if (res.IsSuccess) {
this.merge.visible = false
DicomEvent.$emit('readingPageUpdate', {})
DicomEvent.$emit('getReportInfo', true)
DicomEvent.$emit('setMeasuredToolsPassive')
this.getReadingQuestionAndAnswer()
}
this.merge.loading = false
} catch (e) {
this.merge.loading = false
console.log(e)
}
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -1066,6 +1183,70 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.login-cycle {
width: 5px;
height: 5px;
display: inline-block;
background-color: #428bca;
border-radius: 50%;
margin-right: 2px;
margin-bottom: 2px;
}
.merge-table {
padding: 0 10px;
::v-deep.el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
.el-table--border::after,
.el-table--group::after,
.el-table::before {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
border-bottom: 1px solid #383838;
}
}
::v-deep.el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
tr:hover>td {
background-color: #1e1e1e !important;
}
}
::v-deep.el-table__empty-block {
background-color: #1e1e1e !important;
}
.merge-label {
color: #ddd;
font-size: 13px;
margin-bottom: 10px;
span {
font-size: 15px;
color: red;
}
}
}
.measurement-wrapper { .measurement-wrapper {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;

View File

@ -66,7 +66,25 @@
placement="bottom"> placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 50px;top: 2px;"> <div
:style="{ position: 'absolute', left: item.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px' }">
<div
style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
<el-tooltip
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'"
class="item" effect="dark"
:content="`${$t('trials:reading:message:fused')}${item.TableQuestions.Answers[i].SplitOrMergeLesionName}`"
placement="bottom">
<div
v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '1' || item.TableQuestions.Answers[i].SplitOrMergeType === '3'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(item.TableQuestions.Answers[i].MergeRowId)}`" />
</div>
</el-tooltip>
<div v-if="item.TableQuestions.Answers[i].SplitOrMergeType === '4'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(item.TableQuestions.Answers[i].RowId)}`" />
</div>
<div style="font-size: 11px;width:220px;height: 30px;"> <div style="font-size: 11px;width:220px;height: 30px;">
<div v-if="item.TableQuestions.Answers[i].lesionPart" <div v-if="item.TableQuestions.Answers[i].lesionPart"
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"> style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px">
@ -96,8 +114,10 @@
</div> </div>
</div> </div>
</div> </div>
</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'" v-if="((item.LesionType === 0 && [0, 1, 4].includes(parseInt(item.TableQuestions.Answers[i].lesionState))) || (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;transform: rotateY(180deg);"> style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<!-- 分裂 --> <!-- 分裂 -->
<el-tooltip <el-tooltip
@ -106,6 +126,13 @@
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" <i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" /> @click.stop="handleSplit(item.TableQuestions.Answers[i].RowId, item.Id)" />
</el-tooltip> </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>
</div> </div>
@ -127,10 +154,35 @@
</div> </div>
</template> </template>
</div> </div>
<el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible"
:close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px">
<div class="merge-table">
<div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
<span>{{ mergeInfo.lesionName }}</span>
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table :data="lesionData" style="width: 450px" size="small" height="200"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="45" />
<el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" />
<el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120"
show-overflow-tooltip />
</el-table>
</div>
<div slot="footer" style="text-align:right;">
<!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 -->
<el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge">
{{ $t('common:button:confirm') }}</el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { splitLesion } from '@/api/trials' import { splitLesion, getCanMergeLesion, mergeLesion } from '@/api/trials'
import { resetReadingTask } from '@/api/reading' import { resetReadingTask } from '@/api/reading'
import DicomEvent from './../DicomEvent' import DicomEvent from './../DicomEvent'
@ -185,7 +237,12 @@ export default {
tableQuestions: [], tableQuestions: [],
isFirstRender: false, isFirstRender: false,
CriterionType: null, CriterionType: null,
subjectCode: '' subjectCode: '',
merge: { visible: false, loading: false },
lesionData: [],
mergeInfo: {},
mergeList: []
} }
}, },
computed: { computed: {
@ -243,6 +300,66 @@ export default {
handleReadingChart(e) { handleReadingChart(e) {
this.$emit('handleReadingChart', e) this.$emit('handleReadingChart', e)
}, },
//
async handleMerge(answers, questionId, orderMark) {
this.lesionData = []
this.mergeList = []
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
try {
const res = await getCanMergeLesion({ rowId: answers.RowId })
if (res.IsSuccess) {
this.lesionData = res.Result
}
this.merge.loading = false
} catch (e) {
console.log(e)
this.merge.loading = false
}
},
handleSelectionChange(val) {
this.mergeList = []
val.map(i => {
this.mergeList.push(i.RowId)
})
},
confirmMerge() {
// ', ?'
this.$confirm(this.$t('trials:reading:lugano:warnning:fuse'), {
type: 'warning'
}).then(() => {
this.lesionMerge()
}).catch(() => {
})
},
async lesionMerge() {
this.merge.loading = true
try {
var params = {
visitTaskId: this.visitTaskId,
questionId: this.mergeInfo.questionId,
mergeMainRowId: this.mergeInfo.mergeRowId,
mergeRowIdList: this.mergeList
}
const res = await mergeLesion(params)
if (res.IsSuccess) {
this.merge.visible = false
DicomEvent.$emit('readingPageUpdate', {})
DicomEvent.$emit('getReportInfo', true)
DicomEvent.$emit('setMeasuredToolsPassive')
this.getReadingQuestionAndAnswer()
}
this.merge.loading = false
} catch (e) {
this.merge.loading = false
console.log(e)
}
},
async initList() { async initList() {
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId) var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
if (i > -1) { if (i > -1) {
@ -993,6 +1110,70 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.login-cycle {
width: 5px;
height: 5px;
display: inline-block;
background-color: #428bca;
border-radius: 50%;
margin-right: 2px;
margin-bottom: 2px;
}
.merge-table {
padding: 0 10px;
::v-deep.el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
.el-table--border::after,
.el-table--group::after,
.el-table::before {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
border-bottom: 1px solid #383838;
}
}
::v-deep.el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
tr:hover>td {
background-color: #1e1e1e !important;
}
}
::v-deep.el-table__empty-block {
background-color: #1e1e1e !important;
}
.merge-label {
color: #ddd;
font-size: 13px;
margin-bottom: 10px;
span {
font-size: 15px;
color: red;
}
}
}
.measurement-wrapper { .measurement-wrapper {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;

View File

@ -163,7 +163,7 @@
<!-- MPR --> <!-- MPR -->
<div class="tool-item" :title="`${$t('trials:reading:button:mpr')}`" @click.prevent="openMPRViewport()" <div class="tool-item" :title="`${$t('trials:reading:button:mpr')}`" @click.prevent="openMPRViewport()"
v-if="criterionType === 0 && readingTool === 0"> v-if="criterionType === 0 && readingTool === 0">
<svg-icon icon-class="mpr" class="svg-icon" style="transform: rotate(180deg);"/> <svg-icon icon-class="mpr" class="svg-icon" style="transform: rotate(180deg);" />
</div> </div>
<!--融合--> <!--融合-->
<div v-if="readingTool === 2" class="tool-item" :title="$t('trials:lugano:button:fusion')" <div v-if="readingTool === 2" class="tool-item" :title="$t('trials:lugano:button:fusion')"
@ -343,7 +343,7 @@
:last-viewport-task-id="lastViewportTaskId" :visit-info="s" @removeAnnotation="removeAnnotation" :last-viewport-task-id="lastViewportTaskId" :visit-info="s" @removeAnnotation="removeAnnotation"
@getScreenshots="getScreenshots" @setMarkName="setMarkName" @imageLocation="imageLocation" @getScreenshots="getScreenshots" @setMarkName="setMarkName" @imageLocation="imageLocation"
@resetAnnotations="resetAnnotations" @getAnnotations="getAnnotations" @setToolToTarget="setToolToTarget" @resetAnnotations="resetAnnotations" @getAnnotations="getAnnotations" @setToolToTarget="setToolToTarget"
@handleReadingChart="handleReadingChart" /> @handleReadingChart="handleReadingChart" @setReadingToolPassive="setReadingToolPassive" />
<recisit <recisit
v-else-if="lastViewportTaskId && criterionType === 1 && lastViewportTaskIds.includes(s.VisitTaskId)" v-else-if="lastViewportTaskId && criterionType === 1 && lastViewportTaskIds.includes(s.VisitTaskId)"
:ref="`ecrf_${s.VisitTaskId}`" :ref="`ecrf_${s.VisitTaskId}`"
@ -351,7 +351,7 @@
:last-viewport-task-id="lastViewportTaskId" :visit-info="s" @removeAnnotation="removeAnnotation" :last-viewport-task-id="lastViewportTaskId" :visit-info="s" @removeAnnotation="removeAnnotation"
@getScreenshots="getScreenshots" @setMarkName="setMarkName" @imageLocation="imageLocation" @getScreenshots="getScreenshots" @setMarkName="setMarkName" @imageLocation="imageLocation"
@resetAnnotations="resetAnnotations" @getAnnotations="getAnnotations" @setToolToTarget="setToolToTarget" @resetAnnotations="resetAnnotations" @getAnnotations="getAnnotations" @setToolToTarget="setToolToTarget"
@handleReadingChart="handleReadingChart" /> @handleReadingChart="handleReadingChart" @setReadingToolPassive="setReadingToolPassive" />
<customize-question-list <customize-question-list
v-else-if="lastViewportTaskId && criterionType === 0 && lastViewportTaskIds.includes(s.VisitTaskId)" v-else-if="lastViewportTaskId && criterionType === 0 && lastViewportTaskIds.includes(s.VisitTaskId)"
:ref="`ecrf_${s.VisitTaskId}`" :ref="`ecrf_${s.VisitTaskId}`"

View File

@ -77,7 +77,25 @@
placement="bottom"> placement="bottom">
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div style="position: absolute;left: 50px;top: 2px;"> <div
:style="{ position: 'absolute', left: table.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px' }">
<div
style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
<el-tooltip
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType === '1' || innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType === '3'"
class="item" effect="dark"
:content="`${$t('trials:reading:message:fused')}${innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeLesionName}`"
placement="bottom">
<div
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType === '1' || innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType === '3'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(innerFormData[`${table.Id}_${answer.RowIndex}`].MergeRowId)}`" />
</div>
</el-tooltip>
<div v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType === '4'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)}`" />
</div>
<div style="font-size: 11px;width:220px;height: 30px;"> <div style="font-size: 11px;width:220px;height: 30px;">
<div v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart" <div v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart"
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px" style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
@ -88,7 +106,8 @@
style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px"> style="display: inline-block;margin-left:5px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:50px">
<span v-if="table.LesionType === 0"> <span v-if="table.LesionType === 0">
{{ {{
$fd('TargetState', parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)) $fd('TargetState',
parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))
}} }}
</span> </span>
<span v-else-if="table.LesionType === 1"> <span v-else-if="table.LesionType === 1">
@ -117,9 +136,11 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- 分裂 --> <!-- 分裂 -->
<div <div
v-if="((table.LesionType === 0 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0) || (table.LesionType === 1 && [0, 1].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0)) && innerFormData[`${table.Id}_${answer.RowIndex}`].IsCurrentTaskAdd === 'False'" v-if="((table.LesionType === 0 && [0, 1, 4].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 0 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0) || (table.LesionType === 1 && [0, 1].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0)) && innerFormData[`${table.Id}_${answer.RowIndex}`].IsCurrentTaskAdd === 'False'"
style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);"> style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<el-tooltip <el-tooltip
v-show="readingTaskState < 2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && !isBaseLineTask && innerFormData[`${table.Id}_${answer.RowIndex}`].IsDicomReading !== false" v-show="readingTaskState < 2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && !isBaseLineTask && innerFormData[`${table.Id}_${answer.RowIndex}`].IsDicomReading !== false"
@ -127,6 +148,13 @@
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" <i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="lesionSplit(table.Id, innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)" /> @click.stop="lesionSplit(table.Id, innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)" />
</el-tooltip> </el-tooltip>
<!-- 融合 -->
<el-tooltip
v-show="readingTaskState < 2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType !== '2' && table.LesionType === 0 && [0, 1, 4].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].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(innerFormData[`${table.Id}_${answer.RowIndex}`], table.Id, table.OrderMark)" />
</el-tooltip>
</div> </div>
</div> </div>
@ -164,6 +192,31 @@
</div> </div>
</template> </template>
</div> </div>
<el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible"
:close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px">
<div class="merge-table">
<div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
<span>{{ mergeInfo.lesionName }}</span>
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table :data="lesionData" style="width: 450px" size="small" height="200"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="45" />
<el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" />
<el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120"
show-overflow-tooltip />
</el-table>
</div>
<div slot="footer" style="text-align:right;">
<!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 -->
<el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge">
{{ $t('common:button:confirm') }}</el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
@ -174,7 +227,9 @@ import {
saveTaskQuestion, saveTaskQuestion,
submitTableQuestion, submitTableQuestion,
deleteReadingRowAnswer, deleteReadingRowAnswer,
splitLesion splitLesion,
getCanMergeLesion,
mergeLesion
} from '@/api/trials' } from '@/api/trials'
import { resetReadingTask, setSkipReadingCache } from '@/api/reading' import { resetReadingTask, setSkipReadingCache } from '@/api/reading'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
@ -221,7 +276,13 @@ export default {
deleteTargetInfo: null, deleteTargetInfo: null,
digitPlaces: 2, digitPlaces: 2,
imageQualityId: '', imageQualityId: '',
imageQualityIssuesId: '' imageQualityIssuesId: '',
merge: { visible: false, loading: false },
lesionData: [],
mergeInfo: {},
mergeList: []
} }
}, },
computed: { computed: {
@ -258,6 +319,66 @@ export default {
handleReadingChart(e) { handleReadingChart(e) {
this.$emit('handleReadingChart', e) this.$emit('handleReadingChart', e)
}, },
//
async handleMerge(answers, questionId, orderMark) {
this.lesionData = []
this.mergeList = []
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
try {
const res = await getCanMergeLesion({ rowId: answers.RowId })
if (res.IsSuccess) {
this.lesionData = res.Result
}
this.merge.loading = false
} catch (e) {
console.log(e)
this.merge.loading = false
}
},
handleSelectionChange(val) {
this.mergeList = []
val.map(i => {
this.mergeList.push(i.RowId)
})
},
confirmMerge() {
// ', ?'
this.$confirm(this.$t('trials:reading:lugano:warnning:fuse'), {
type: 'warning'
}).then(() => {
this.lesionMerge()
}).catch(() => {
})
},
async lesionMerge() {
this.merge.loading = true
try {
var params = {
visitTaskId: this.visitTaskId,
questionId: this.mergeInfo.questionId,
mergeMainRowId: this.mergeInfo.mergeRowId,
mergeRowIdList: this.mergeList
}
const res = await mergeLesion(params)
if (res.IsSuccess) {
this.merge.visible = false
// DicomEvent.$emit('readingPageUpdate', {})
// DicomEvent.$emit('getReportInfo', true)
DicomEvent.$emit('setReadingToolPassive')
this.getTableQuestions()
}
this.merge.loading = false
} catch (e) {
this.merge.loading = false
console.log(e)
}
},
// //
async getOrganList() { async getOrganList() {
try { try {
@ -1841,6 +1962,70 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.login-cycle {
width: 5px;
height: 5px;
display: inline-block;
background-color: #428bca;
border-radius: 50%;
margin-right: 2px;
margin-bottom: 2px;
}
.merge-table {
padding: 0 10px;
::v-deep.el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
.el-table--border::after,
.el-table--group::after,
.el-table::before {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
border-bottom: 1px solid #383838;
}
}
::v-deep.el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
tr:hover>td {
background-color: #1e1e1e !important;
}
}
::v-deep.el-table__empty-block {
background-color: #1e1e1e !important;
}
.merge-label {
color: #ddd;
font-size: 13px;
margin-bottom: 10px;
span {
font-size: 15px;
color: red;
}
}
}
.questionList-wrapper { .questionList-wrapper {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;

View File

@ -80,8 +80,25 @@
<i class="el-icon-warning" style="color:#ff9800" /> <i class="el-icon-warning" style="color:#ff9800" />
</el-tooltip> </el-tooltip>
<div <div
:style="{ position: 'absolute', left: '50px', top: '2px', color: innerFormData[`${table.Id}_${answer.RowIndex}`].IntrahepaticLesion ? '#5fb4ff' : '#fff' }"> :style="{ position: 'absolute', left: table.LesionType === 1 && readingTaskState < 2 ? '58px' : '50px', top: '2px', color: innerFormData[`${table.Id}_${answer.RowIndex}`].IntrahepaticLesion ? '#5fb4ff' : '#fff' }">
<div style="font-size: 11px;width:220px;height: 30px;">
<div
style="font-size: 11px;width:210px;height: 30px;display: flex;justify-content: flex-start;flex-wrap: nowrap;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
<el-tooltip
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType === '1' || innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType === '3'"
class="item" effect="dark"
:content="`${$t('trials:reading:message:fused')}${innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeLesionName}`"
placement="bottom">
<div
v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType === '1' || innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType === '3'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(innerFormData[`${table.Id}_${answer.RowIndex}`].MergeRowId)}`" />
</div>
</el-tooltip>
<div v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType === '4'">
<span class="login-cycle"
:style="`background-color:${$GuidToColor(innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)}`" />
</div>
<div v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart" <div v-if="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart"
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px" style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
:title="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart"> :title="innerFormData[`${table.Id}_${answer.RowIndex}`].LesionPart">
@ -122,7 +139,7 @@
</div> </div>
<!-- 分裂 --> <!-- 分裂 -->
<div <div
v-if="((table.LesionType === 0 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0) || (table.LesionType === 1 && [0, 1].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0)) && innerFormData[`${table.Id}_${answer.RowIndex}`].IsCurrentTaskAdd === 'False'" v-if="((table.LesionType === 0 && [0, 1, 4].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState)))) || ((table.LesionType === 0 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0) || (table.LesionType === 1 && [0, 1].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState))) || (table.LesionType === 2 && parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].LesionState) === 0)) && innerFormData[`${table.Id}_${answer.RowIndex}`].IsCurrentTaskAdd === 'False'"
style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);"> style="position: absolute;right: 5px;top: 2px;transform: rotateY(180deg);">
<el-tooltip <el-tooltip
v-show="readingTaskState < 2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && !isBaseLineTask && innerFormData[`${table.Id}_${answer.RowIndex}`].IsDicomReading !== false" v-show="readingTaskState < 2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && !isBaseLineTask && innerFormData[`${table.Id}_${answer.RowIndex}`].IsDicomReading !== false"
@ -130,6 +147,13 @@
<i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;" <i class="iconfont icon-24gl-split" style="color:#fff;font-size: 16px;"
@click.stop="lesionSplit(table.Id, innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)" /> @click.stop="lesionSplit(table.Id, innerFormData[`${table.Id}_${answer.RowIndex}`].RowId)" />
</el-tooltip> </el-tooltip>
<!-- 融合 -->
<el-tooltip
v-show="readingTaskState < 2 && !!innerFormData[`${table.Id}_${answer.RowIndex}`].RowId && innerFormData[`${table.Id}_${answer.RowIndex}`].SplitOrMergeType !== '2' && table.LesionType === 0 && [0, 1, 4].includes(parseInt(innerFormData[`${table.Id}_${answer.RowIndex}`].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(innerFormData[`${table.Id}_${answer.RowIndex}`], table.Id, table.OrderMark)" />
</el-tooltip>
</div> </div>
</div> </div>
@ -167,6 +191,31 @@
</div> </div>
</template> </template>
</div> </div>
<el-dialog v-if="merge.visible" v-loading="merge.loading" :visible.sync="merge.visible"
:close-on-click-modal="false" :title="$t('trials:reading:lugano:message:merge')" width="500px">
<div class="merge-table">
<div class="merge-label">
<label>{{ $t('trials:reading:lugano:label:currentLesion') }}</label>
<span>{{ mergeInfo.lesionName }}</span>
<span style="margin-left:10px">{{ mergeInfo.lesionPart }}</span>
</div>
<div class="merge-label"><label>{{ $t('trials:reading:lugano:label:selectLesion') }}</label></div>
<el-table :data="lesionData" style="width: 450px" size="small" height="200"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="45" />
<el-table-column prop="OrderMarkName" :label="$t('trials:reading:lugano:label:lesionNumber')" width="100" />
<el-table-column prop="Part" :label="$t('trials:reading:lugano:label:lesionLocation')" min-width="120"
show-overflow-tooltip />
</el-table>
</div>
<div slot="footer" style="text-align:right;">
<!-- 取消 -->
<el-button size="mini" @click="merge.visible = false">{{ $t('common:button:cancel') }}</el-button>
<!-- 确认 -->
<el-button type="primary" size="mini" :disabled="mergeList.length === 0" @click="confirmMerge">
{{ $t('common:button:confirm') }}</el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
@ -177,7 +226,9 @@ import {
saveTaskQuestion, saveTaskQuestion,
submitTableQuestion, submitTableQuestion,
deleteReadingRowAnswer, deleteReadingRowAnswer,
splitLesion splitLesion,
getCanMergeLesion,
mergeLesion
} from '@/api/trials' } from '@/api/trials'
import { resetReadingTask, setSkipReadingCache } from '@/api/reading' import { resetReadingTask, setSkipReadingCache } from '@/api/reading'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
@ -223,7 +274,12 @@ export default {
deleteTargetInfo: null, deleteTargetInfo: null,
digitPlaces: 2, digitPlaces: 2,
imageQualityId: '', imageQualityId: '',
imageQualityIssuesId: '' imageQualityIssuesId: '',
merge: { visible: false, loading: false },
lesionData: [],
mergeInfo: {},
mergeList: []
} }
}, },
computed: { computed: {
@ -259,6 +315,66 @@ export default {
handleReadingChart(e) { handleReadingChart(e) {
this.$emit('handleReadingChart', e) this.$emit('handleReadingChart', e)
}, },
//
async handleMerge(answers, questionId, orderMark) {
this.lesionData = []
this.mergeList = []
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
try {
const res = await getCanMergeLesion({ rowId: answers.RowId })
if (res.IsSuccess) {
this.lesionData = res.Result
}
this.merge.loading = false
} catch (e) {
console.log(e)
this.merge.loading = false
}
},
handleSelectionChange(val) {
this.mergeList = []
val.map(i => {
this.mergeList.push(i.RowId)
})
},
confirmMerge() {
// ', ?'
this.$confirm(this.$t('trials:reading:lugano:warnning:fuse'), {
type: 'warning'
}).then(() => {
this.lesionMerge()
}).catch(() => {
})
},
async lesionMerge() {
this.merge.loading = true
try {
var params = {
visitTaskId: this.visitTaskId,
questionId: this.mergeInfo.questionId,
mergeMainRowId: this.mergeInfo.mergeRowId,
mergeRowIdList: this.mergeList
}
const res = await mergeLesion(params)
if (res.IsSuccess) {
this.merge.visible = false
// DicomEvent.$emit('readingPageUpdate', {})
// DicomEvent.$emit('getReportInfo', true)
DicomEvent.$emit('setReadingToolPassive')
this.getTableQuestions()
}
this.merge.loading = false
} catch (e) {
this.merge.loading = false
console.log(e)
}
},
// //
async getOrganList() { async getOrganList() {
try { try {
@ -1930,6 +2046,70 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.login-cycle {
width: 5px;
height: 5px;
display: inline-block;
background-color: #428bca;
border-radius: 50%;
margin-right: 2px;
margin-bottom: 2px;
}
.merge-table {
padding: 0 10px;
::v-deep.el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
.el-table--border::after,
.el-table--group::after,
.el-table::before {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
border-bottom: 1px solid #383838;
}
}
::v-deep.el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
tr:hover>td {
background-color: #1e1e1e !important;
}
}
::v-deep.el-table__empty-block {
background-color: #1e1e1e !important;
}
.merge-label {
color: #ddd;
font-size: 13px;
margin-bottom: 10px;
span {
font-size: 15px;
color: red;
}
}
}
.questionList-wrapper { .questionList-wrapper {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;