Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details

main
wangxiaoshuang 2026-05-06 13:28:04 +08:00
commit 00e03c782d
6 changed files with 145 additions and 99 deletions

View File

@ -140,7 +140,7 @@
</div> </div>
</el-tooltip> </el-tooltip>
<!-- 伪彩 --> <!-- 伪彩 -->
<colorMap v-show="isFusion" ref="colorMap" :unit="fusionOverlayModality === 'NM' ? 'counts' : 'g/ml'" <colorMap v-show="isFusion" ref="colorMap" :unit="fusionOverlayModality === 'NM' ? '' : 'g/ml'"
:modality="fusionOverlayModality" @setColorMap="setColorMap" @voiChange="voiChange" /> :modality="fusionOverlayModality" @setColorMap="setColorMap" @voiChange="voiChange" />
<!-- 截屏 --> <!-- 截屏 -->

View File

@ -6,7 +6,7 @@
> >
<div :id="`viewport${index}`" ref="viewportCanvas" style="height: 100%;width:100%" /> <div :id="`viewport${index}`" ref="viewportCanvas" style="height: 100%;width:100%" />
<!-- 序列信息 --> <!-- 序列信息 -->
<div <div
v-if="seriesInfo.taskBlindName" v-if="seriesInfo.taskBlindName"
class="seriesInfo_wrapper" class="seriesInfo_wrapper"
:style="{color:index%2 == 1 ? '#ddd' : '#666'}" :style="{color:index%2 == 1 ? '#ddd' : '#666'}"
@ -81,7 +81,7 @@
{{ markers.left }} {{ markers.left }}
</div> </div>
<div v-if="presetName" class="color_bar"> <div v-if="presetName" class="color_bar">
<canvas id="colorBar_Canvas" /> <canvas ref="colorBarCanvas" />
</div> </div>
<div v-if="index === 4" id="rotateBar" ref="rotateBar" class="rotate_slider_box" @click.stop="clickRotate($event)"> <div v-if="index === 4" id="rotateBar" ref="rotateBar" class="rotate_slider_box" @click.stop="clickRotate($event)">
<div id="rotateSlider" :style="{left: rotateBarLeft + 'px'}" class="box" @click.stop.prevent="() => {return}" @mousedown.stop="rotateBarMousedown($event)" /> <div id="rotateSlider" :style="{left: rotateBarLeft + 'px'}" class="box" @click.stop.prevent="() => {return}" @mousedown.stop="rotateBarMousedown($event)" />
@ -162,6 +162,10 @@ export default {
default() { default() {
return [] return []
} }
},
rgbPresetName: {
type: String,
default: ''
} }
}, },
data() { data() {
@ -203,6 +207,16 @@ export default {
handler(v) { handler(v) {
console.log('activeIndex ', v) console.log('activeIndex ', v)
} }
},
rgbPresetName: {
immediate: true,
handler(v) {
this.presetName = v || ''
if (!this.presetName) return
this.$nextTick(() => {
this.renderColorBar(this.presetName)
})
}
} }
}, },
mounted() { mounted() {
@ -574,7 +588,8 @@ export default {
colorMap = getColormap(presetName) colorMap = getColormap(presetName)
} }
const rgbPoints = colorMap.RGBPoints const rgbPoints = colorMap.RGBPoints
const canvas = document.getElementById('colorBar_Canvas') const canvas = this.$refs.colorBarCanvas
if (!canvas) return
const ctx = canvas.getContext('2d') const ctx = canvas.getContext('2d')
const canvasWidth = 160 const canvasWidth = 160
const canvasHeight = 5 const canvasHeight = 5

View File

@ -20,49 +20,49 @@
style="width: 135px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;" style="width: 135px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;"
> >
<div> <div>
<div style="text-overflow: ellipsis;overflow: hidden;" v-if="!study.StudyName"> <div style="text-overflow: ellipsis;overflow: hidden;">
<span :title="study.StudyCode">{{ study.StudyCode }}</span> <span :title="study.StudyCode">{{ study.StudyCode }}</span>
<span style="margin-left: 5px;">{{ study.Modalities }} ({{ study.SeriesCount }})</span> <span v-if="taskInfo && taskInfo.IsShowStudyName && study.StudyName" :title="study.StudyName" style="margin-left: 5px;">
</div>
<div style="text-overflow: ellipsis;overflow: hidden;" v-else>
<span :title="study.StudyCode">{{ study.StudyCode }}</span>
<span v-if="taskInfo && taskInfo.IsShowStudyName" :title="study.StudyName" style="margin: 0 5px">
{{study.StudyName}} {{study.StudyName}}
</span> </span>
<div>{{ study.Modalities }} ({{ study.SeriesCount }})</div>
</div> </div>
<div style="text-overflow: ellipsis;overflow: hidden;" :title="study.Description">{{ study.Description }}</div> <div style="text-overflow: ellipsis;overflow: hidden;">
<div class="patient-info" v-if="['PT、CT', 'CT、PT', 'PET-CT'].includes(study.Modalities)"> <span class="study-meta-line" :title="study.Modalities">
<el-popover placement="right-start" trigger="hover" popper-class="patient-info-popper"> <span>{{ study.Modalities }} ({{ study.SeriesCount }})</span>
<h4>{{ $t('trials:ptData:title') }}</h4> <span class="patient-info" v-if="['PT、CT', 'CT、PT', 'PET-CT'].includes(study.Modalities)">
<div class="patient-info-row"> <el-popover placement="right-start" trigger="hover" popper-class="patient-info-popper">
<label>{{ $t('trials:ptData:label:patientSex') }}</label> <h4>{{ $t('trials:ptData:title') }}</h4>
<span>{{ study.PatientSex }}</span> <div class="patient-info-row">
</div> <label>{{ $t('trials:ptData:label:patientSex') }}</label>
<div class="patient-info-row"> <span>{{ study.PatientSex }}</span>
<label>{{ $t('trials:ptData:label:patientWeight') }}</label> </div>
<span>{{ study.PatientWeight }}</span> <div class="patient-info-row">
</div> <label>{{ $t('trials:ptData:label:patientWeight') }}</label>
<div class="patient-info-row"> <span>{{ study.PatientWeight }}</span>
<label>{{ $t('trials:ptData:label:totalDose') }}</label> </div>
<span>{{ study.RadionuclideTotalDose }}</span> <div class="patient-info-row">
</div> <label>{{ $t('trials:ptData:label:totalDose') }}</label>
<div class="patient-info-row"> <span>{{ study.RadionuclideTotalDose }}</span>
<label>{{ $t('trials:ptData:label:halfLife') }}</label> </div>
<span>{{ study.RadionuclideHalfLife }}</span> <div class="patient-info-row">
</div> <label>{{ $t('trials:ptData:label:halfLife') }}</label>
<div class="patient-info-row"> <span>{{ study.RadionuclideHalfLife }}</span>
<label>{{ $t('trials:ptData:label:injectTime') }}</label> </div>
<span>{{ study.RadiopharmaceuticalStartTime }}</span> <div class="patient-info-row">
</div> <label>{{ $t('trials:ptData:label:injectTime') }}</label>
<div class="patient-info-row"> <span>{{ study.RadiopharmaceuticalStartTime }}</span>
<label>{{ $t('trials:ptData:label:acquisitionTime') }}</label> </div>
<span>{{ study.AcquisitionTime }}</span> <div class="patient-info-row">
</div> <label>{{ $t('trials:ptData:label:acquisitionTime') }}</label>
<i slot="reference" class="el-icon-document" <span>{{ study.AcquisitionTime }}</span>
style="font-size: 15px;cursor: pointer;color: #f5f7fa;" /> </div>
</el-popover> <i slot="reference" class="el-icon-document"
style="font-size: 15px;cursor: pointer;color: #f5f7fa;" />
</el-popover>
</span>
</span>
</div> </div>
<div v-if="study.Description" class="study-desc-text" :title="study.Description">{{ study.Description }}</div>
</div> </div>
</div> </div>
@ -974,6 +974,18 @@ export default {
color: #d0d0d0; color: #d0d0d0;
padding: 2px; padding: 2px;
} }
.study-meta-line {
display: inline-flex;
align-items: center;
gap: 6px;
vertical-align: middle;
}
.study-desc-text {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.ps { .ps {
overflow-anchor: none; overflow-anchor: none;
@ -1069,7 +1081,16 @@ export default {
color: #ddd; color: #ddd;
border-bottom-color:#5a5a5a; border-bottom-color:#5a5a5a;
padding-left: 5px; padding-left: 5px;
height: 40px; min-height: 40px;
height: auto;
line-height: 20px;
align-items: flex-start;
padding-top: 6px;
padding-bottom: 6px;
}
.el-collapse-item__arrow{
align-self: flex-start;
margin-top: 2px;
line-height: 20px; line-height: 20px;
} }
} }
@ -1141,8 +1162,9 @@ export default {
</style> </style>
<style lang="scss"> <style lang="scss">
.patient-info { .patient-info {
// display: inline-block; display: inline-flex;
text-align: right; align-items: center;
line-height: 1;
} }
.patient-info-popper { .patient-info-popper {
font-size: 12px; font-size: 12px;

View File

@ -14,54 +14,47 @@
<el-collapse-item :key="`${study.StudyId}`" :name="`${study.StudyId}`" v-if="!study.IsCriticalSequence"> <el-collapse-item :key="`${study.StudyId}`" :name="`${study.StudyId}`" v-if="!study.IsCriticalSequence">
<template slot="title"> <template slot="title">
<div v-if="readingTool !== 3 || !study.IsCriticalSequence" class="dicom-desc"> <div v-if="readingTool !== 3 || !study.IsCriticalSequence" class="dicom-desc">
<template v-if="taskInfo && taskInfo.IsShowStudyName"> <div style="text-overflow: ellipsis;overflow: hidden;">
<div style="text-overflow: ellipsis;overflow: hidden;"> <span :title="study.StudyCode">{{ study.StudyCode }}</span>
<span :title="study.StudyCode">{{ study.StudyCode }}</span> <span v-if="taskInfo && taskInfo.IsShowStudyName && study.StudyName" :title="study.StudyName" style="margin-left: 5px;">
<span v-if="study.StudyName" :title="study.StudyName" style="margin-left: 5px;">{{ study.StudyName {{ study.StudyName }}
}}</span> </span>
<span v-else :title="study.Modalities" style="margin-left: 5px;">{{ `${study.Modalities} </div>
(${study.SeriesCount})` }}</span> <div style="text-overflow: ellipsis;overflow: hidden;">
</div> <span class="study-meta-line" :title="study.Modalities">
<div v-if="study.StudyName" style="text-overflow: ellipsis;overflow: hidden;"> <span>{{ `${study.Modalities} (${study.SeriesCount})` }}</span>
<span :title="study.Modalities">{{ `${study.Modalities} (${study.SeriesCount})` }}</span> <span class="patient-info" v-if="['PT、CT', 'CT、PT', 'PET-CT'].includes(study.Modalities)">
</div> <el-popover placement="right-start" trigger="hover" popper-class="patient-info-popper">
</template> <h4>{{ $t('trials:ptData:title') }}</h4>
<template v-else-if="taskInfo && !taskInfo.IsShowStudyName"> <div class="patient-info-row">
<div style="text-overflow: ellipsis;overflow: hidden;"> <label>{{ $t('trials:ptData:label:patientSex') }}</label>
<span :title="study.StudyCode">{{ study.StudyCode }}</span> <span>{{ study.PatientSex }}</span>
<span :title="study.Modalities">{{ `${study.Modalities} (${study.SeriesCount})` }}</span> </div>
</div> <div class="patient-info-row">
</template> <label>{{ $t('trials:ptData:label:patientWeight') }}</label>
<div class="patient-info" v-if="['PT、CT', 'CT、PT', 'PET-CT'].includes(study.Modalities)"> <span>{{ study.PatientWeight }}</span>
<el-popover placement="right-start" trigger="hover" popper-class="patient-info-popper"> </div>
<h4>{{ $t('trials:ptData:title') }}</h4> <div class="patient-info-row">
<div class="patient-info-row"> <label>{{ $t('trials:ptData:label:totalDose') }}</label>
<label>{{ $t('trials:ptData:label:patientSex') }}</label> <span>{{ study.RadionuclideTotalDose }}</span>
<span>{{ study.PatientSex }}</span> </div>
</div> <div class="patient-info-row">
<div class="patient-info-row"> <label>{{ $t('trials:ptData:label:halfLife') }}</label>
<label>{{ $t('trials:ptData:label:patientWeight') }}</label> <span>{{ study.RadionuclideHalfLife }}</span>
<span>{{ study.PatientWeight }}</span> </div>
</div> <div class="patient-info-row">
<div class="patient-info-row"> <label>{{ $t('trials:ptData:label:injectTime') }}</label>
<label>{{ $t('trials:ptData:label:totalDose') }}</label> <span>{{ study.RadiopharmaceuticalStartTime }}</span>
<span>{{ study.RadionuclideTotalDose }}</span> </div>
</div> <div class="patient-info-row">
<div class="patient-info-row"> <label>{{ $t('trials:ptData:label:acquisitionTime') }}</label>
<label>{{ $t('trials:ptData:label:halfLife') }}</label> <span>{{ study.AcquisitionTime }}</span>
<span>{{ study.RadionuclideHalfLife }}</span> </div>
</div> <i slot="reference" class="el-icon-document"
<div class="patient-info-row"> style="font-size: 15px;cursor: pointer;color: #f5f7fa;" />
<label>{{ $t('trials:ptData:label:injectTime') }}</label> </el-popover>
<span>{{ study.RadiopharmaceuticalStartTime }}</span> </span>
</div> </span>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:acquisitionTime') }}</label>
<span>{{ study.AcquisitionTime }}</span>
</div>
<i slot="reference" class="el-icon-document"
style="font-size: 15px;cursor: pointer;color: #f5f7fa;" />
</el-popover>
</div> </div>
</div> </div>
@ -265,10 +258,10 @@ export default {
} }
</script> </script>
<style lang="scss"> <style lang="scss">
.patient-info { // .patient-info {
// display: inline-block; // // display: inline-block;
text-align: right; // // text-align: right;
} // }
.patient-info-popper { .patient-info-popper {
font-size: 12px; font-size: 12px;
@ -343,6 +336,17 @@ export default {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.study-meta-line {
display: inline-flex;
align-items: center;
gap: 6px;
vertical-align: middle;
}
.patient-info {
display: inline-flex;
align-items: center;
line-height: 1;
}
.ps { .ps {
flex: 1; flex: 1;
@ -427,8 +431,12 @@ export default {
color: #ddd; color: #ddd;
border-bottom-color: #5a5a5a; border-bottom-color: #5a5a5a;
padding-left: 5px; padding-left: 5px;
// height: 50px; min-height: 40px;
height: auto;
line-height: 20px; line-height: 20px;
align-items: flex-start;
padding-top: 6px;
padding-bottom: 6px;
} }
} }

View File

@ -138,7 +138,7 @@ export default {
addReadModule(this.form).then(res => { addReadModule(this.form).then(res => {
this.btnLoading = false this.btnLoading = false
this.$emit('getList') this.$emit('getList')
this.$emit('close', {visitStageId: this.form.VisitStageId}) this.$emit('close', {visitStageId: this.form.VisitStageId, expirationVisitNum: this.form.ExpirationVisitNum})
this.form.Name = null this.form.Name = null
this.form.VisitStageId = null this.form.VisitStageId = null
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$message.success(this.$t('common:message:savedSuccessfully'))

View File

@ -540,6 +540,7 @@ export default {
if (res === 'confirm') { if (res === 'confirm') {
this.param.ReadingSetType = 1 this.param.ReadingSetType = 1
this.param.VisitStageId = obj.visitStageId this.param.VisitStageId = obj.visitStageId
this.param.ExpirationVisitNum = obj.expirationVisitNum
this.subjectPeriod = { visible: true, title: this.$t('trials:readingPeriod:dialogTitle:addSubjectTumorPR') } this.subjectPeriod = { visible: true, title: this.$t('trials:readingPeriod:dialogTitle:addSubjectTumorPR') }
} else { } else {
this.subjectPeriod.visible = true this.subjectPeriod.visible = true