Merge branch 'main' into uat_us
commit
3bf3503c99
|
|
@ -4457,4 +4457,13 @@ export function amendmentPatientInfo(data) {
|
|||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
//修改临床数据后 将签名状态变更为未签名
|
||||
export function updateReadModuleClinicalData(data) {
|
||||
return request({
|
||||
url: `/ReadingClinicalData/updateReadModuleClinicalData`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
|
@ -1218,7 +1218,7 @@ export default {
|
|||
|
||||
|
||||
|
||||
.btnBox {
|
||||
.dicom-tools .btnBox {
|
||||
display: inline-block;
|
||||
width: 80px;
|
||||
text-align: center;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@
|
|||
</el-switch>
|
||||
<span style="margin-left: 5px;">{{
|
||||
$t('trials:reading:Segmentations:title:InactiveSegmentationsShow')
|
||||
}}</span>
|
||||
}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<template v-if="segmentList.length > 0">
|
||||
|
|
@ -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">
|
||||
<svg-icon :icon-class="!item.bidirectionalView ? 'eye' : 'eye-open'"
|
||||
style="color:#000;margin-right: 5px;cursor: pointer;"
|
||||
@click.stop="viewBidirectional([item], !item.bidirectionalView)" />
|
||||
<svg-icon icon-class="jumpto" style="color:#000;cursor: pointer;"
|
||||
@click.stop="jumpBidirectional(item)" />
|
||||
<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)"
|
||||
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)"
|
||||
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++
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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'))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue