Merge branch 'main' into uat_us

uat_us
wangxiaoshuang 2026-04-30 16:33:38 +08:00
commit 3bf3503c99
9 changed files with 186 additions and 82 deletions

View File

@ -4458,3 +4458,12 @@ export function amendmentPatientInfo(data) {
data
})
}
//修改临床数据后 将签名状态变更为未签名
export function updateReadModuleClinicalData(data) {
return request({
url: `/ReadingClinicalData/updateReadModuleClinicalData`,
method: 'post',
data
})
}

View File

@ -1218,7 +1218,7 @@ export default {
.btnBox {
.dicom-tools .btnBox {
display: inline-block;
width: 80px;
text-align: center;

View File

@ -17,7 +17,7 @@
<div
v-else
class="dicom-desc"
style="width: 150px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;"
style="width: 135px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;"
>
<div>
<div style="text-overflow: ellipsis;overflow: hidden;" v-if="!study.StudyName">
@ -32,7 +32,37 @@
<div>{{ study.Modalities }} ({{ study.SeriesCount }})</div>
</div>
<div style="text-overflow: ellipsis;overflow: hidden;" :title="study.Description">{{ study.Description }}</div>
<div class="patient-info" v-if="['PT、CT', 'CT、PT', 'PET-CT'].includes(study.Modalities)">
<el-popover placement="right-start" trigger="hover" popper-class="patient-info-popper">
<h4>{{ $t('trials:ptData:title') }}</h4>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:patientSex') }}</label>
<span>{{ study.PatientSex }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:patientWeight') }}</label>
<span>{{ study.PatientWeight }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:totalDose') }}</label>
<span>{{ study.RadionuclideTotalDose }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:halfLife') }}</label>
<span>{{ study.RadionuclideHalfLife }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:injectTime') }}</label>
<span>{{ study.RadiopharmaceuticalStartTime }}</span>
</div>
<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>
@ -99,37 +129,7 @@
<el-tooltip class="item" effect="dark" :content="series.description" placement="right">
<div style="">{{ series.description }}</div>
</el-tooltip>
<div class="patient-info" style="position: absolute;right: 0;top: 30px;" v-if="['PT','PET'].includes(series.modality)">
<el-popover placement="right" trigger="hover" popper-class="patient-info-popper">
<h4>{{ $t('trials:ptData:title') }}</h4>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:patientSex') }}</label>
<span>{{ study.PatientSex }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:patientWeight') }}</label>
<span>{{ study.PatientWeight }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:totalDose') }}</label>
<span>{{ study.RadionuclideTotalDose }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:halfLife') }}</label>
<span>{{ study.RadionuclideHalfLife }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:injectTime') }}</label>
<span>{{ study.RadiopharmaceuticalStartTime }}</span>
</div>
<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>
</p>
<p v-show="series.sliceThickness && !study.IsCriticalSequence">
@ -1140,6 +1140,10 @@ export default {
}
</style>
<style lang="scss">
.patient-info {
// display: inline-block;
text-align: right;
}
.patient-info-popper {
font-size: 12px;
color: #ddd;

View File

@ -145,6 +145,7 @@ export default {
}
},
async handleChange(e, key) {
this.handleClear(e, key)
if (key === 'study') {
this.seriesList = this.studyList.find(item => item.StudyId === this.form.studyId).SeriesArr
this.form.seriesId = null

View File

@ -163,7 +163,8 @@
<i class="el-icon-warning-outline" style="color:red;margin-right: 5px;"
:title="$t('trials:reading:Segmentations:tip:segmentationIsNotSave')"
v-if="!curSegmentGroup.isSaved"></i>
<el-button type="success" size="small" :disabled="saveLoading || isMPR"
<el-button type="success" size="small"
:disabled="saveLoading || isMPR || curSegmentGroup.isSaved"
@click="saveSegmentGroup([curSegmentGroup])">
{{ $t("trials:reading:Segmentations:button:save") }}
</el-button>
@ -186,21 +187,39 @@
<div class="messageBox">
<el-popover placement="left" :title="item.SegmentLabel" width="200" trigger="hover">
<div class="Bidirectionalbox">
<div class="BidirectionalBtn" @click.stop="addTip(item)"
<!-- <div class="BidirectionalBtn" @click.stop="addTip(item)"
v-if="!item.bidirectional">
{{ $t('trials:reading:Segmentations:button:getBidirectional') }}
</div>
<template v-else>
</div> -->
<template>
<div class="num">
<span>L:{{ Number(item.bidirectional.maxMajor).toFixed(2) }} mm</span>
<span>S:{{ Number(item.bidirectional.maxMinor).toFixed(2) }} mm</span>
<span>L: {{
item.bidirectional && item.bidirectional.maxMajor
? Number(item.bidirectional.maxMajor).toFixed(2) : ' '
}} mm</span>
<span>S: {{
item.bidirectional && item.bidirectional.maxMinor
? Number(item.bidirectional.maxMinor).toFixed(2) : ' '
}} mm</span>
</div>
<div class="btnBox">
<div
:title="!item.bidirectionalView ? $t('trials:reading:Segmentations:button:eye') : $t('trials:reading:Segmentations:button:eye-open')">
<svg-icon :icon-class="!item.bidirectionalView ? 'eye' : 'eye-open'"
style="color:#000;margin-right: 5px;cursor: pointer;"
@click.stop="viewBidirectional([item], !item.bidirectionalView)" />
@click.stop="viewBidirectional([item], !item.bidirectionalView)"
v-if="item.bidirectional" />
</div>
<div :title="$t('trials:reading:Segmentations:button:jumpto')">
<svg-icon icon-class="jumpto" style="color:#000;cursor: pointer;"
@click.stop="jumpBidirectional(item)" />
@click.stop="jumpBidirectional(item)"
v-if="item.bidirectional" />
</div>
<i class="el-icon-plus" style="color:#000;cursor: pointer;"
v-if="!item.bidirectional"
:title="$t('trials:reading:Segmentations:button:getBidirectional')"
@click.stop="addTip(item)" />
</div>
</template>
</div>
@ -253,7 +272,8 @@
</el-collapse-item>
</el-collapse>
<div class="saveBtnBox" v-if="readingTaskState < 2 && segmentList && segmentList.length > 1">
<el-button type="success" size="small" :disabled="saveLoading || isMPR" @click="saveSegmentGroup()">
<el-button type="success" size="small" :disabled="saveLoading || isMPR || curSegmentGroup.isSaved"
@click="saveSegmentGroup()">
{{ $t("trials:reading:Segmentations:button:saveAll") }}
</el-button>
</div>
@ -746,7 +766,7 @@ export default {
return name
},
getSegmentName(arr, num = 1) {
let defaultSegmentName = arr[0].SegmentLabel
let defaultSegmentName = this.trialCriterion && this.trialCriterion.DefaultSegmentName && this.trialCriterion.DefaultSegmentName.SegmentNameList && this.trialCriterion.DefaultSegmentName.SegmentNameList.length > 0 ? this.trialCriterion.DefaultSegmentName.SegmentNameList[0] : arr[0].SegmentLabel
let name = defaultSegmentName + num
let has = arr.find(item => item.SegmentLabel === name)
num++

View File

@ -32,6 +32,37 @@
<span :title="study.Modalities">{{ `${study.Modalities} (${study.SeriesCount})` }}</span>
</div>
</template>
<div class="patient-info" v-if="['PT、CT', 'CT、PT', 'PET-CT'].includes(study.Modalities)">
<el-popover placement="right-start" trigger="hover" popper-class="patient-info-popper">
<h4>{{ $t('trials:ptData:title') }}</h4>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:patientSex') }}</label>
<span>{{ study.PatientSex }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:patientWeight') }}</label>
<span>{{ study.PatientWeight }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:totalDose') }}</label>
<span>{{ study.RadionuclideTotalDose }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:halfLife') }}</label>
<span>{{ study.RadionuclideHalfLife }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:injectTime') }}</label>
<span>{{ study.RadiopharmaceuticalStartTime }}</span>
</div>
<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 v-else>
@ -74,39 +105,9 @@
#{{ series.SeriesNumber }}
</div>
<div v-if="series.Description" class="text-desc" :title="series.Description" style="position: relative;">
<div v-if="series.Description" class="text-desc" :title="series.Description">
{{ series.Description }}
<div class="patient-info" style="position: absolute;right: 0;top: 0;" v-if="['PT','PET'].includes(series.Modality)">
<el-popover placement="right" trigger="hover" popper-class="patient-info-popper">
<h4>{{ $t('trials:ptData:title') }}</h4>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:patientSex') }}</label>
<span>{{ study.PatientSex }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:patientWeight') }}</label>
<span>{{ study.PatientWeight }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:totalDose') }}</label>
<span>{{ study.RadionuclideTotalDose }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:halfLife') }}</label>
<span>{{ study.RadionuclideHalfLife }}</span>
</div>
<div class="patient-info-row">
<label>{{ $t('trials:ptData:label:injectTime') }}</label>
<span>{{ study.RadiopharmaceuticalStartTime }}</span>
</div>
<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 v-if="series.SliceThickness && !study.IsCriticalSequence" class="text-desc">
T: {{ parseFloat(series.SliceThickness).toFixed(digitPlaces) }}
@ -262,6 +263,10 @@ export default {
}
</script>
<style lang="scss">
.patient-info {
// display: inline-block;
text-align: right;
}
.patient-info-popper {
font-size: 12px;
color: #ddd;
@ -294,6 +299,7 @@ export default {
color: #bbb;
// font-weight: 600;
white-space: nowrap;
// text-align: right;
}
.patient-info-popper span {

View File

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

View File

@ -143,6 +143,15 @@
scope.row.IsSign ||
scope.row.UploadRole === 0
" @click="handleDelete(scope.row)" />
<!-- 更新 临床数据已签名阅片状态待阅片 -->
<el-button
v-hasPermi="['trials:trials-panel:subject:readingPeriod:edit']"
circle
:title="$t('trials:readingPeriod:cd:action:update')" icon="el-icon-refresh"
:disabled="
!scope.row.IsSign ||
scope.row.UploadRole === 0 || data.ReadingStatus > 4"
@click="handleUpdateStatus(scope.row)" />
</template>
</el-table-column>
</el-table>
@ -285,6 +294,15 @@
scope.row.IsSign ||
scope.row.UploadRole === 0
" @click="handleDelete(scope.row)" />
<!-- 更新 临床数据已签名阅片状态待阅片 -->
<el-button
v-hasPermi="['trials:trials-panel:subject:readingPeriod:edit']"
circle
:title="$t('trials:readingPeriod:cd:action:update')" icon="el-icon-refresh"
:disabled="
!scope.row.IsSign ||
scope.row.UploadRole === 0 || data.ReadingStatus > 4"
@click="handleUpdateStatus(scope.row)" />
</template>
</el-table-column>
</el-table>
@ -328,6 +346,7 @@ import {
getTrialClinicalDataSelect,
getConsistencyAnalysisReadingClinicalDataList,
signConsistencyAnalysisReadingClinicalData,
updateReadModuleClinicalData
} from '@/api/trials'
import AddOrEditCD from './AddOrEditCD'
import Verification from './Verification'
@ -658,6 +677,28 @@ export default {
})
.catch(() => { })
},
async handleUpdateStatus(row) {
try {
const confirm = await this.$confirm(this.$t('trials:readingPeriod:cd:message:updateCDStatus'), {
type: 'warning',
distinguishCancelAndClose: true,
})
if (confirm === 'confirm') {
this.loading = true
let res = await updateReadModuleClinicalData({readingClinicalDataId: row.Id})
this.loading = false
if (res.IsSuccess) {
this.getList()
this.$message.success(this.$t('common:message:savedSuccessfully'))
}
} else {
this.subjectPeriod.visible = true
}
} catch(e) {
this.loading = false
console.log(e)
}
},
handleSign(from) {
// this.currentData = { ...row }
this.currentData.IsBlind = from.IsBlind

View File

@ -382,7 +382,7 @@
<el-dialog v-if="subjectPeriod.visible" :title="subjectPeriod.title" :visible.sync="subjectPeriod.visible"
width="500px" custom-class="base-dialog-wrapper" :close-on-click-modal="false">
<SubjectPR :trial-reading-criterion-id="TrialReadingCriterionId" :trial-id="trialId" :data="param"
@close="() => { subjectPeriod.visible = false }" @getList="getList" />
@close="subjectPeriodClose" @getList="getList" />
</el-dialog>
<!-- 编辑受试者阅片期 -->
<el-dialog v-if="subjectPeriodEdit.visible" :title="subjectPeriodEdit.title"
@ -527,6 +527,29 @@ export default {
? this.$t('trials:readingPeriod:dialogTitle:addSubjectPR')
: this.$t('trials:readingPeriod:dialogTitle:addSubjectTumorPR')
},
async subjectPeriodClose(obj) {
this.subjectPeriod.visible = false
if (typeof obj !== 'object' || obj === null) return
if (this.param.ReadingSetType === 0 && this.isClinicalReading) {
try {
const res = await this.$confirm(this.$t('trials:readingPeriod:message:msg1'), {
type: 'warning',
distinguishCancelAndClose: true,
})
if (res === 'confirm') {
this.param.ReadingSetType = 1
this.param.VisitStageId = obj.visitStageId
this.subjectPeriod = { visible: true, title: this.$t('trials:readingPeriod:dialogTitle:addSubjectTumorPR') }
} else {
this.subjectPeriod.visible = true
}
} catch(e) {
console.log(e)
}
}
},
handleEdit(row, type) {
this.param = { ...type }
this.param.VisitStageId = this.param.CutOffVisitId