irc_web/.svn/pristine/fa/faada664bdb1cda2b8bd7ee3805...

2913 lines
109 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container">
<div class="ImageReviewTask-list app-container">
<el-collapse v-model="activeNames">
<el-form ref="qualifiedForm" :model="reportResult">
<el-form-item
prop="Qualified"
label="Qualified for Review:"
label-width="200px"
:rules="[{ required: true, message: '', trigger: 'blur' }]"
>
<el-radio-group v-model="reportResult.Qualified" :disabled="isReportSaved">
<el-radio :label="true">Qualified</el-radio>
<el-radio :label="false">Non-Qualified</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<el-collapse-item
name="Non-lymphNodeTarget"
title="Non-nodular Target Lesions (Non-lymph Node Target Lesions)"
disabled
>
<div class="toolbar">
<span style="margin-right: 20px">Lesions Operate:</span>
<el-button
type="primary"
size="small"
:disabled="nonlymphNodeTargetMergeDisable || isReportSaved"
@click="nonlymphNodeTargetMerge"
>Merge</el-button>
<span style="margin-right: 20px">SplitCount:</span>
<el-input
v-model="nonlymphNodeTargetSplitCount"
placeholder="Split Count"
:disabled="nonlymphNodeTargetSplitDisable || isReportSaved"
class="mr"
style="width: 80px"
size="small"
type="number"
min="2"
/>
<el-button
type="primary"
size="small"
:disabled="nonlymphNodeTargetSplitDisable || isReportSaved"
@click="nonlymphNodeTargetSplit"
>Split</el-button>
</div>
<el-table
ref="nonlymphNodeTargetBLTable"
:data="BLNonlymphNodeTargetList"
stripe
size="small"
@selection-change="handleNonlymphNodeTargetListSelectionChange"
>
<el-table-column label="BaseLine">
<el-table-column type="index" width="40" />
<el-table-column
type="selection"
align="left"
width="50"
:selectable="canNonlymphNodeTargetOpt"
/>
<el-table-column
prop="TULNKID"
label="Lesion No"
show-overflow-tooltip
min-width="60"
/>
<el-table-column prop="Anatomy" label="Anatomy" show-overflow-tooltip min-width="80">
<template slot-scope="scope">
{{
(scope.row.TULOC || '') +
' ' +
(scope.row.TULAT || '') +
' ' +
(scope.row.TUDIR || '')
}}
</template>
</el-table-column>
<el-table-column
prop="LocDescription"
label="Anatomy Description"
min-width="120"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-input
v-model="scope.row.LocDescription"
type="text"
placeholder
size="small"
clearable
:disabled="
scope.row.VISITNUM != pageTPInfo.VisitNum || isReportSaved
"
/>
</template>
</el-table-column>
<!-- <el-table-column
prop="Note"
label="Comments"
show-overflow-tooltip
min-width="60"
>
<template slot-scope="scope">
<el-input
type="text"
v-model="scope.row.Note"
placeholder=""
size="small"
clearable
:disabled="scope.row.VISITNUM != pageTPInfo.VisitNum"
></el-input>
</template>
</el-table-column>-->
</el-table-column>
<el-table-column label="Current Timepoint:">
<el-table-column label="Current scan has covered" min-width="150">
<template slot-scope="scope">
<el-select
v-model="scope.row.CurrentLesion.CoveredLesion"
style="width: 100%"
size="small"
clearable
:disabled="
scope.row.VISITNUM == 1
? NonlymphNodeTargetSplitOrMergeArray.some(
(currentValue) =>
currentValue.TULNKID.indexOf(scope.row.TULNKID) !=
-1
)
: false || isReportSaved
"
@change="
nonlymphNodeTargetCoveredLesionChange(
scope.row.CurrentLesion
)
"
>
<el-option :value="true" label="YES" />
<el-option :value="false" label="NO" />
</el-select>
</template>
</el-table-column>
<el-table-column label="Long Axis Measurement(mm)" min-width="150">
<template slot-scope="scope">
<el-select
v-model="scope.row.CurrentLesion.TRORRES"
clearable
style="width: 100%"
size="small"
:disabled="
(scope.row.VISITNUM == 1
? NonlymphNodeTargetSplitOrMergeArray.some(
(currentValue) =>
currentValue.TULNKID.indexOf(scope.row.TULNKID) !=
-1
)
: false) ||
isReportSaved ||
scope.row.CurrentLesion.CoveredLesion == false
"
@change="nonlymphNodeTargetMeasurementChange(scope.row)"
>
<el-option
v-for="item in VisitNonlymphNodeTargetList"
:key="item.value"
:label="
item.TRORRES +
' ' +
item.TULOC +
' ' +
item.TULAT +
' ' +
item.TUDIR
"
:value="item.TRORRES"
:disabled="item.HasSelected"
/>
</el-select>
</template>
</el-table-column>
<el-table-column prop="Note" label="Comments" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<el-input
v-model="scope.row.CurrentLesion.Note"
type="text"
placeholder
size="small"
clearable
:disabled="
(scope.row.VISITNUM == 1
? NonlymphNodeTargetSplitOrMergeArray.some(
(currentValue) =>
currentValue.TULNKID.indexOf(scope.row.TULNKID) !=
-1
)
: false) ||
isReportSaved ||
scope.row.CurrentLesion.CoveredLesion == false
"
/>
</template>
</el-table-column>
<el-table-column label="Action" min-width="40" fixed="right">
<template slot-scope="scope">
<el-button
v-if="scope.row.VISITNUM == pageTPInfo.VisitNum"
type="text"
size="small"
:disabled="isReportSaved"
@click="handlenonlymphNodeTargetDelete(scope.row)"
>Delete</el-button>
</template>
</el-table-column>
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item
title="Nodular Target Lesions (Lymph Node Target Lesions)"
name="LymphNodeTarget"
disabled
>
<div class="toolbar">
<span style="margin-right: 20px">Lesions Operate:</span>
<el-button
type="primary"
size="small"
:disabled="lymphNodeTargetMergeDisable || isReportSaved"
@click="lymphNodeTargetMerge"
>Merge</el-button>
<span style="margin-right: 20px">SplitCount:</span>
<el-input
v-model="lymphNodeTargetSplitCount"
placeholder="Split Count"
:disabled="lymphNodeTargetSplitDisable || isReportSaved"
style="width: 80px"
class="mr"
size="small"
type="number"
min="2"
/>
<el-button
type="primary"
size="small"
:disabled="lymphNodeTargetSplitDisable || isReportSaved"
@click="lymphNodeTargetSplit"
>Split</el-button>
</div>
<el-table
ref="lymphNodeTargetBLTable"
:data="BLLymphNodeTargetList"
stripe
size="small"
@selection-change="handleLymphNodeTargetListSelectionChange"
>
<el-table-column label="BaseLine">
<el-table-column type="index" width="60" />
<el-table-column
type="selection"
align="left"
width="50"
:selectable="canLymphNodeTargetOpt"
/>
<el-table-column
prop="TULNKID"
label="Lesion No"
show-overflow-tooltip
min-width="50"
/>
<el-table-column prop="Anatomy" label="Anatomy" show-overflow-tooltip min-width="80">
<template slot-scope="scope">
{{
(scope.row.TULOC || '') +
' ' +
(scope.row.TULAT || '') +
' ' +
(scope.row.TUDIR || '')
}}
</template>
</el-table-column>
<el-table-column
prop="LocDescription"
label="Anatomy Description"
min-width="120"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-input
v-model="scope.row.LocDescription"
type="text"
placeholder
size="small"
clearable
:disabled="
scope.row.VISITNUM != pageTPInfo.VisitNum || isReportSaved
"
/>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="Current Timepoint">
<el-table-column label="Current scan has covered" min-width="150">
<template slot-scope="scope">
<el-select
v-model="scope.row.CurrentLesion.CoveredLesion"
style="width: 100%"
size="small"
:disabled="
scope.row.VISITNUM == 1
? LymphNodeTargetSplitOrMergeArray.some(
(currentValue) =>
currentValue.TULNKID.indexOf(scope.row.TULNKID) !=
-1
)
: false || isReportSaved
"
@change="
lymphNodeTargetCoveredLesionChange(
scope.row.CurrentLesion
)
"
>
<el-option :value="true" label="YES" />
<el-option :value="false" label="NO" />
</el-select>
</template>
</el-table-column>
<el-table-column label="Short Axis Measurement(mm)" min-width="150">
<template slot-scope="scope">
<el-select
v-model="scope.row.CurrentLesion.TRORRES"
clearable
style="width: 100%"
size="small"
:disabled="
(scope.row.VISITNUM == 1
? LymphNodeTargetSplitOrMergeArray.some(
(currentValue) =>
currentValue.TULNKID.indexOf(scope.row.TULNKID) !=
-1
)
: false) ||
isReportSaved ||
scope.row.CurrentLesion.CoveredLesion == false
"
@change="lymphNodeTargetMeasurementChange(scope.row)"
>
<el-option
v-for="item in VisitLymphNodeTargetList"
:key="item.value"
:label="
item.TRORRES +
' ' +
item.TULOC +
' ' +
item.TULAT +
' ' +
item.TUDIR
"
:value="item.TRORRES"
:disabled="item.HasSelected"
/>
</el-select>
</template>
</el-table-column>
<el-table-column prop="Note" label="Comments" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<el-input
v-model="scope.row.CurrentLesion.Note"
type="text"
placeholder
size="small"
:disabled="
(scope.row.VISITNUM == 1
? LymphNodeTargetSplitOrMergeArray.some(
(currentValue) =>
currentValue.TULNKID.indexOf(scope.row.TULNKID) !=
-1
)
: false) ||
isReportSaved ||
scope.row.CurrentLesion.CoveredLesion == false
"
/>
</template>
</el-table-column>
<el-table-column label="Action" min-width="40" fixed="right">
<template slot-scope="scope">
<el-button
v-if="scope.row.VISITNUM == pageTPInfo.VisitNum"
type="text"
size="small"
:disabled="isReportSaved"
@click="handlelymphNodeTargetDelete(scope.row)"
>Delete</el-button>
</template>
</el-table-column>
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item title="Non-target Lesion" name="Non-targetLesion" disabled>
<el-table ref="nontargetLesionTable" :data="BLNontargetLesionList" stripe size="small">
<el-table-column label="BaseLine">
<el-table-column type="index" width="60" />
<el-table-column
prop="TULNKID"
label="Lesion No"
show-overflow-tooltip
min-width="100"
/>
<el-table-column prop="Anatomy" label="Anatomy" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
{{
scope.row.TULOC +
' ' +
scope.row.TULAT +
' ' +
scope.row.TUDIR
}}
</template>
</el-table-column>
<el-table-column
prop="LocDescription"
label="Anatomy Description"
show-overflow-tooltip
min-width="120"
/>
<el-table-column prop="Note" label="Comments" show-overflow-tooltip min-width="100" />
</el-table-column>
<el-table-column label="Current Timepoint">
<el-table-column label="Lesion Assessment" min-width="120">
<template slot-scope="scope">
<el-input
v-model="scope.row.CurrentLesion.TRORRES"
type="text"
placeholder
size="small"
:disabled="isReportSaved"
/>
</template>
</el-table-column>
<el-table-column
prop="TRORRESU"
label="Lesion status"
show-overflow-tooltip
min-width="120"
>
<template slot-scope="scope">
<el-select
v-model="scope.row.CurrentLesion.TRORRESU"
size="small"
style="width: 100%"
clearable
class="mr"
@change="nonTargetLesionStatusChange()"
>
<el-option value="Exist" label="Exist" />
<el-option value="Disappear" label="Disappear" />
<el-option value="Identify progress" label="Identify progress" />
</el-select>
<!-- <el-input
v-model="scope.row.CurrentLesion.TRORRESU"
type="text"
placeholder
size="small"
:disabled="isReportSaved"
/>-->
</template>
</el-table-column>
<el-table-column prop="Note" label="Comments" show-overflow-tooltip min-width="120">
<template slot-scope="scope">
<el-input
v-model="scope.row.CurrentLesion.Note"
type="text"
placeholder
size="small"
:disabled="isReportSaved"
/>
</template>
</el-table-column>
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item title="Previous New Lesion" name="PreviousNewLesion" disabled>
<el-table ref="previousNewLesionTable" :data="PreviousNewLesionList" stripe size="small">
<el-table-column label="First">
<el-table-column type="index" width="60" />
<el-table-column
prop="TULNKID"
label="Lesion No"
show-overflow-tooltip
min-width="100"
/>
<el-table-column prop="Anatomy" label="Anatomy" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
{{
scope.row.TULOC +
' ' +
scope.row.TULAT +
' ' +
scope.row.TUDIR
}}
</template>
</el-table-column>
<el-table-column
prop="LocDescription"
label="Anatomy Description"
show-overflow-tooltip
min-width="120"
/>
<el-table-column prop="Note" label="Comments" show-overflow-tooltip min-width="100" />
</el-table-column>
<el-table-column label="Current Timepoint">
<el-table-column label="Lesion Assessment" min-width="120">
<template slot-scope="scope">
<el-input
v-model="scope.row.CurrentLesion.TRORRES"
type="text"
placeholder
size="small"
:disabled="isReportSaved"
/>
</template>
</el-table-column>
<el-table-column
prop="VisitTRORRESU"
label="Lesion status"
show-overflow-tooltip
min-width="120"
>
<template slot-scope="scope">
<!-- <el-input
v-model="scope.row.CurrentLesion.TRORRESU"
type="text"
placeholder
size="small"
:disabled="isReportSaved"
/>-->
<el-select
v-model="scope.row.CurrentLesion.TRORRESU"
size="small"
style="width: 100%"
clearable
class="mr"
>
<el-option value="Exist" label="Exist" />
<el-option value="Disappear" label="Disappear" />
<el-option value="Identify progress" label="Identify progress" />
</el-select>
</template>
</el-table-column>
<el-table-column
prop="VisitNote"
label="Comments"
show-overflow-tooltip
min-width="120"
>
<template slot-scope="scope">
<el-input
v-model="scope.row.CurrentLesion.Note"
type="text"
placeholder
size="small"
:disabled="isReportSaved"
/>
</template>
</el-table-column>
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item title="Equivocal New Lesion" name="EquivocalNewLesion" disabled>
<el-table
ref="equivocalNewLesionTable"
:data="EquivocalNewLesionList"
stripe
size="small"
>
<el-table-column type="index" width="60" />
<el-table-column
prop="TULNKID"
label="Lesion No"
show-overflow-tooltip
min-width="100"
/>
<el-table-column prop="Anatomy" label="Anatomy" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
{{
scope.row.TULOC +
' ' +
scope.row.TULAT +
' ' +
scope.row.TUDIR
}}
</template>
</el-table-column>
<el-table-column
prop="LocDescription"
label="Anatomy Description"
show-overflow-tooltip
min-width="120"
>
<template slot-scope="scope">
<el-input
v-model="scope.row.LocDescription"
:disabled="isReportSaved"
type="text"
placeholder
size="small"
clearable
/>
</template>
</el-table-column>
<el-table-column prop="Note" label="Comments" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<el-input
v-model="scope.row.Note"
:disabled="isReportSaved"
type="text"
placeholder
size="small"
clearable
/>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item title="Unequivocal New Lesion" name="UnequivocalNewLesion" disabled>
<el-table
ref="unequivocalNewLesionTable"
:data="UnequivocalNewLesionList"
stripe
size="small"
>
<el-table-column type="index" width="60" />
<el-table-column
prop="TULNKID"
label="Lesion No"
show-overflow-tooltip
min-width="100"
/>
<el-table-column prop="Anatomy" label="Anatomy" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
{{
scope.row.TULOC +
' ' +
scope.row.TULAT +
' ' +
scope.row.TUDIR
}}
</template>
</el-table-column>
<el-table-column
prop="LocDescription"
label="Anatomy Description"
show-overflow-tooltip
min-width="120"
>
<template slot-scope="scope">
<el-input
v-model="scope.row.LocDescription"
:disabled="isReportSaved"
type="text"
placeholder
size="small"
clearable
/>
</template>
</el-table-column>
<el-table-column prop="Note" label="Comments" show-overflow-tooltip min-width="100">
<template slot-scope="scope">
<el-input
v-model="scope.row.Note"
:disabled="isReportSaved"
type="text"
placeholder
size="small"
clearable
/>
</template>
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item title="Measurements Calculation" name="MeasurementsCalculation" disabled>
<el-row>
<el-col :span="6">
<div class="grid-content bg-purple">Sum of Diameter(SOD)(mm) :{{ SumOfDiameter }}</div>
</el-col>
<el-col :span="6">
<div
class="grid-content bg-purple-light"
>Non-nodular Lesions SOD(mm) :{{ NonnodularLesionsSOD }}</div>
</el-col>
<el-col :span="6">
<div class="grid-content bg-purple">Baseline SOD :{{ BaselineSOD }}</div>
</el-col>
<el-col :span="6">
<div class="grid-content bg-purple">Baseline SOD % change :{{ BaselineSODChange }}</div>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<div class="grid-content bg-purple-light">
Timepoint of Nadir SOD :{{
TimepointOfNadirSOD + '(' + MinVisitInfo.MinSum + ')'
}}
</div>
</el-col>
<el-col :span="6">
<div
class="grid-content bg-purple-light"
>Nadir SOD increase(mm) :{{ NadirSODIncrease }}</div>
</el-col>
<el-col :span="6">
<div
class="grid-content bg-purple-light"
>Nadir SOD % increase :{{ NadirSODIncreasePercent }}</div>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="Efficacy Assessment" name="EfficacyAssessment" disabled>
<el-form ref="efficacyAssessmentForm" :model="efficacyAssessment" label-width="100px">
<el-row>
<el-col :span="6">
<el-form-item
prop="TargetLesion"
label="Target Lesion"
label-width="150px"
:rules="[{ required: false, message: '', trigger: 'blur' }]"
>
<el-select
v-model="efficacyAssessment.TargetLesion"
:disabled="isReportSaved"
clearable
size="small"
@change="targetLesionAssessmentChange"
>
<el-option value="CR" label="完全缓解(CR)" />
<el-option value="PR" label=" 部分缓解(PR)" />
<el-option value="PD" label=" 疾病进展(PD)" />
<el-option value="SD" label="疾病稳定(SD)" />
<el-option value="NE" label="不可评估(NE)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="18">
<el-form-item
v-if="efficacyAssessment.RequireTargetLesionNote"
prop="TargetLesionNote"
label="Note: "
:rules="[{ required: true, message: '', trigger: 'blur' }]"
>
<el-input v-model="efficacyAssessment.TargetLesionNote" size="small" minlength="2" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item
prop="Non_targetLesion"
label="Non-target Lesion"
label-width="150px"
:rules="[{ required: true, message: '', trigger: 'blur' }]"
>
<el-select
v-model="efficacyAssessment.Non_targetLesion"
:disabled="isReportSaved"
clearable
size="small"
@change="
non_targetLesionAssessmentChange(
efficacyAssessment.Non_targetLesion
)
"
>
<el-option value="CR" label="完全缓解(CR)" />
<el-option value="Non-CR/Non-PD" label="非完全缓解/非疾病进展(Non-CR/Non-PD)" />
<el-option value="PD" label=" 疾病进展(PD)" />
<el-option value="NE" label="不可评估(NE)" />
</el-select>
</el-form-item>
</el-col>
<el-col v-if="efficacyAssessment.RequireNon_targetLesionNote" :span="18">
<el-form-item
prop="Non_targetLesionNote"
label="Note: "
:rules="[{ required: true, message: '', trigger: 'blur' }]"
>
<el-input
v-model="efficacyAssessment.Non_targetLesionNote"
size="small"
minlength="2"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item
prop="OverallAssessment"
label="Overall Assessment"
label-width="150px"
:rules="[{ required: true, message: '', trigger: 'blur' }]"
>
<el-select
v-model="efficacyAssessment.OverallAssessment"
:disabled="isReportSaved"
clearable
size="small"
@change="
overallAssessmentChange(
efficacyAssessment.OverallAssessment
)
"
>
<el-option value="CR" label="完全缓解(CR)" />
<el-option value="PR" label=" 部分缓解(PR)" />
<el-option value="PD" label=" 疾病进展(PD)" />
<el-option value="SD" label="疾病稳定(SD)" />
<el-option value="NE" label="不可评估(NE)" />
</el-select>
</el-form-item>
</el-col>
<el-col v-if="efficacyAssessment.RequireOverallAssessmentNote" :span="18">
<el-form-item
label="Note: "
prop="OverallAssessmentNote"
:rules="[{ required: true, message: '', trigger: 'blur' }]"
>
<el-input
v-model="efficacyAssessment.OverallAssessmentNote"
size="small"
minlength="2"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- Note: <el-input v-model="efficacyAssessment.efficacyAssessmentNote" size="small"></el-input> -->
</el-collapse-item>
<el-collapse-item title="Comments" name="Comments" disabled>
<el-form ref="commentsForm" :model="reportResult" label-width="100px" :inline="true">
<el-form-item
prop="DiseaseProgression"
label="Disease Progression"
label-width="150px"
:rules="[{ required: true, message: '', trigger: 'blur' }]"
>
<el-input
v-model="reportResult.DiseaseProgression"
:disabled="isReportSaved"
type="textarea"
size="small"
/>
</el-form-item>
<el-form-item prop="DiseaseProgression" label="NotEvaluable" label-width="100px">
<el-input
v-model="reportResult.NotEvaluable"
:disabled="isReportSaved"
type="textarea"
size="small"
/>
</el-form-item>
<el-form-item prop="Timepoint" label="Timepoint" label-width="100px">
<el-input
v-model="reportResult.Timepoint"
:disabled="isReportSaved"
type="textarea"
size="small"
/>
</el-form-item>
</el-form>
</el-collapse-item>
</el-collapse>
<div id="footer">
<el-button
type="primary"
style="float: left; margin-left: 500px"
:disabled="isReportSaved"
@click="addVistLine"
>Save</el-button>
<el-button
type="primary"
style="float: right; margin-right: 600px"
:disabled="isReportSaved"
@click="submiteReport"
>Submit Report</el-button>
</div>
</div>
</div>
</template>
<script>
import {
getVisitLineLesion,
saveVisitReport,
submiteReport,
saveImageLabelList,
getImageLabelList
} from '@/api/reading'
export default {
name: 'WorkloadTask',
// eslint-disable-next-line vue/require-prop-types
props: ['globalRowVisitNum', 'visitTpCode'],
data() {
return {
isReportSaved: false,
pageTPInfo: '',
efficacyAssessment: {
TargetLesion: '',
RequireTargetLesionNote: false,
Non_targetLesion: '',
RequireNon_targetLesionNote: false,
OverallAssessment: '',
RequireOverallAssessmentNote: false,
efficacyAssessmentNote: ''
},
previousOverallAssessment: {
visitName: '',
overallAssessment: ''
},
measurementsCalculation: {
SumOfDiameter: '',
NonnodularLesionsSOD: '',
BaselineSODChange: '',
BaselineSOD: '',
NadirSODIncrease: '',
NadirSODIncreasePercent: '',
TimepointOfNadirSOD: ''
},
activeNames: [
'ImageQualityAssessment',
'Non-lymphNodeTarget',
'LymphNodeTarget',
'Non-targetLesion',
'EfficacyAssessment',
'Comments',
'PreviousNewLesion',
'EquivocalNewLesion',
'UnequivocalNewLesion',
'MeasurementsCalculation'
],
// localStorageData: [
// { TRORRES: 10, TULOC: 'lung', TULAT: 'left', TUDIR: 'ddd' },
// { TRORRES: 11, TULOC: 'lung', TULAT: 'right', TUDIR: 'ccc' },
// ],
VisitNontargetLesionList: [],
VisitNonlymphNodeTargetList: [],
VisitLymphNodeTargetList: [],
nonlymphNodeTargetSplitCount: 0,
nonlymphNodeTargetDisableIds: [],
nonlymphNodeTargetSelectArray: [],
BLNonlymphNodeTargetList: [],
nonlymphNodeTargetMergeDisable: true,
nonlymphNodeTargetSplitDisable: true,
lymphNodeTargetSplitCount: 0,
lymphNodeTargetDisableIds: [],
lymphNodeTargetSelectArray: [],
BLLymphNodeTargetList: [],
lymphNodeTargetMergeDisable: true,
lymphNodeTargetSplitDisable: true,
BLNontargetLesionList: [],
PreviousNewLesionList: [],
EquivocalNewLesionList: [
// {
// TRORRES: 10,
// TULOC: 'kk',
// TULAT: 'left',
// TUDIR: 'ddd',
// LocDescription: 'Equivocal1',
// Note: 'Equivocal1'
// },
// {
// TRORRES: 10,
// TULOC: 'gg',
// TULAT: 'left',
// TUDIR: 'ddd',
// LocDescription: 'Equivocal1',
// Note: 'Equivocal2'
// }
],
UnequivocalNewLesionList: [
// {
// TRORRES: 10,
// TULOC: 'kk',
// TULAT: 'left',
// TUDIR: 'ddd',
// LocDescription: 'Unequivocal2',
// Note: 'Unequivocal2'
// },
// {
// TRORRES: 10,
// TULOC: 'gg',
// TULAT: 'left',
// TUDIR: 'ddd',
// LocDescription: 'Unequivocal1',
// Note: 'Unequivocal1'
// }
],
imageLabelList: [],
imageDataHasUpdate: false,
reportResult: {
Qualified: '',
DiseaseProgression: '',
NotEvaluable: '',
Timepoint: '',
TrialCode: '',
SubjectCode: '',
VisitNum: '',
VisitName: '',
DiseaseSituation: '',
Comment: '',
TPId: '',
DicomStudyId: ''
},
MinVisitInfo: {
MinSum: 0,
MinVistName: ''
}
}
},
computed: {
NonlymphNodeTargetSplitOrMergeArray: function() {
return this.BLNonlymphNodeTargetList.filter(
(element) =>
element.VISITNUM === this.pageTPInfo.VisitNum ||
element.TULNKID.indexOf('/') !== -1 ||
element.TULNKID.indexOf('.') !== -1
)
},
LymphNodeTargetSplitOrMergeArray: function() {
return this.BLLymphNodeTargetList.filter(
(element) =>
element.VISITNUM === this.pageTPInfo.VisitNum ||
element.TULNKID.indexOf('/') !== -1 ||
element.TULNKID.indexOf('.') !== -1
)
},
SumOfDiameter: function() {
let sum = 0
this.BLNonlymphNodeTargetList.forEach(
(element) => (sum += Number(element.CurrentLesion.TRORRES))
)
this.BLLymphNodeTargetList.forEach(
(element) => (sum += Number(element.CurrentLesion.TRORRES))
)
return sum.toFixed(1)
},
NonnodularLesionsSOD() {
let sum = 0
this.BLNonlymphNodeTargetList.forEach(
(element) => (sum += Number(element.CurrentLesion.TRORRES))
)
// this.measurementsCalculation.NonnodularLesionsSOD = sum
return sum.toFixed(1)
},
BaselineSODChange: function() {
let visitSum = 0
let blSum = 0
this.BLNonlymphNodeTargetList.forEach((element) => {
visitSum += Number(element.CurrentLesion.TRORRES)
blSum += Number(element.TRORRES)
})
this.BLLymphNodeTargetList.forEach((element) => {
visitSum += Number(element.CurrentLesion.TRORRES)
blSum += Number(element.TRORRES)
})
return (((visitSum - blSum) * 100) / blSum).toFixed(1) + '%'
},
BaselineSOD: function() {
let blSum = 0
this.BLNonlymphNodeTargetList.forEach((element) => {
blSum += Number(element.TRORRES)
})
this.BLLymphNodeTargetList.forEach((element) => {
blSum += Number(element.TRORRES)
})
return blSum
},
NadirSODIncrease: function() {
let visitSum = 0
// let blSum = 0
this.BLNonlymphNodeTargetList.forEach((element) => {
visitSum += Number(element.CurrentLesion.TRORRES)
// blSum += Number(element.TRORRES)
})
this.BLLymphNodeTargetList.forEach((element) => {
visitSum += Number(element.CurrentLesion.TRORRES)
// blSum += Number(element.TRORRES)
})
const historyMinSum = this.MinVisitInfo.MinSum
return (visitSum - historyMinSum).toFixed(1)
},
NadirSODIncreasePercent: function() {
let visitSum = 0
this.BLNonlymphNodeTargetList.forEach((element) => {
visitSum += Number(element.CurrentLesion.TRORRES)
})
this.BLLymphNodeTargetList.forEach((element) => {
visitSum += Number(element.CurrentLesion.TRORRES)
})
return ((visitSum * 100) / this.NadirSODIncrease).toFixed(1) + '%'
},
TimepointOfNadirSOD: function() {
return this.MinVisitInfo.MinVistName
}
},
created() {
this.pageTPInfo = this.$route.query
// 处理global页面进来
if (this.globalRowVisitNum) {
this.pageTPInfo.VisitNum = this.globalRowVisitNum
this.pageTPInfo.WorkloadCode = this.visitTpCode
}
this.isReportSaved = this.pageTPInfo.Status === 80
this.reportResult.TpCode = this.pageTPInfo.WorkloadCode
this.reportResult.TrialCode = this.pageTPInfo.TrialCode
this.reportResult.SubjectCode = this.pageTPInfo.SubjectCode
this.reportResult.VisitNum = this.pageTPInfo.VisitNum
this.reportResult.VisitName = this.pageTPInfo.VisitName
this.reportResult.TPId = this.pageTPInfo.WorkloadId
this.reportResult.DicomStudyId = this.pageTPInfo.StudyId
getVisitLineLesion(
this.pageTPInfo.TrialCode,
this.pageTPInfo.SubjectCode,
this.pageTPInfo.VisitNum,
this.pageTPInfo.WorkloadCode
).then((res) => {
this.BLNonlymphNodeTargetList = res.Result.BLLesionList.filter(
(t) => t.LesionType === 1
)
this.BLLymphNodeTargetList = res.Result.BLLesionList.filter(
(t) => t.LesionType === 2
)
this.BLNontargetLesionList = res.Result.BLLesionList.filter(
(t) => t.LesionType === 3
)
this.MinVisitInfo = res.Result.MinVisitInfo
this.reportResult.TpCode = this.pageTPInfo.WorkloadCode
this.reportResult = res.Result.ReportResult
? res.Result.ReportResult
: this.reportResult
// 恢复疗效表单
this.efficacyAssessment = res.Result.Efficacy
this.efficacyAssessment.RequireOverallAssessmentNote =
this.efficacyAssessment.OverallAssessmentNote.length > 0
this.efficacyAssessment.RequireTargetLesionNote =
this.efficacyAssessment.TargetLesionNote.length > 0
this.efficacyAssessment.RequireNon_targetLesionNote =
this.efficacyAssessment.Non_targetLesionNote.length > 0
this.PreviousNewLesionList = res.Result.PreviousNewLesionList
this.EquivocalNewLesionList =
res.Result.EquivocalNewLesionList.length !== 0
? res.Result.EquivocalNewLesionList
: this.EquivocalNewLesionList
this.UnequivocalNewLesionList =
res.Result.UnequivocalNewLesionList.length !== 0
? res.Result.UnequivocalNewLesionList
: this.UnequivocalNewLesionList
getImageLabelList(this.pageTPInfo.WorkloadCode).then((res) => {
if (res.Result.length > 0) {
res.Result.forEach((item) => {
this.imageLabelList.push(JSON.parse(item.LabelValue))
})
this.handelImageLabelDataLogic(this.imageLabelList)
}
})
})
},
mounted() {
const that = this
window.addEventListener('storage', function(e) {
// 判断是影像界面 设置了数据 设置的key而且一定是'measureData' 防止其他界面操作localStorage 从而进入
if (e.url.indexOf('baseLine') !== -1 && e.key === 'measureData') {
const measureData = JSON.parse(e.newValue)
const tpData = measureData[that.pageTPInfo.WorkloadCode]
if (measureData) {
that.imageDataHasUpdate = true
that.imageLabelList = []
tpData.forEach((t) => that.imageLabelList.push(t))
that.handelImageLabelDataLogic(tpData)
// 删除localStorage本次数据
delete measureData[that.pageTPInfo.WorkloadCode]
localStorage.setItem('measureData', JSON.stringify(measureData))
}
}
})
},
methods: {
nonTargetLesionStatusChange() {
this.efficacyAssessment.Non_targetLesion = ''
this.efficacyAssessment.OverallAssessment = ''
},
targetLesionAssessmentChange(selectValue) {
// clear 操作 不用填写Note
if (!selectValue) {
this.efficacyAssessment.RequireTargetLesionNote = false
return
}
// 当前访视 非淋巴结长径和
let longNonlymphNodeTargetSum = 0
// 基线 非淋巴结长径和
let longBaseNonlymphNodeTargetSum = 0
let nonLymphNodeTargetSelectCount = 0
// 当前访视 巴结长径和
let shortLymphNodeTargetSum = 0
// 基线 淋巴结长径和
let shortBaselymphNodeTargetSum = 0
let lymphNodeTargetSelectCount = 0
this.BLNonlymphNodeTargetList.forEach((element) => {
if (element.CurrentLesion.TRORRES) {
nonLymphNodeTargetSelectCount++
longNonlymphNodeTargetSum += Number(element.CurrentLesion.TRORRES)
}
if (element.TRORRES) {
longBaseNonlymphNodeTargetSum += Number(element.TRORRES)
}
})
let allLymphNodeLessThan10 = true
this.BLLymphNodeTargetList.forEach((element) => {
if (element.CurrentLesion.TRORRES) {
// 给基线选择了对应的病灶数量
lymphNodeTargetSelectCount++
shortLymphNodeTargetSum += Number(element.CurrentLesion.TRORRES)
if (element.CurrentLesion.TRORRES >= 10) { allLymphNodeLessThan10 = false }
}
if (element.TRORRES) {
shortBaselymphNodeTargetSum += Number(element.TRORRES)
}
})
if (
lymphNodeTargetSelectCount === 0 &&
nonLymphNodeTargetSelectCount === 0 &&
this.BLNonlymphNodeTargetList.length +
this.BLLymphNodeTargetList.length >
0
) {
this.$alert(
'基线有测量数据,当前未给基线的病灶选择访视数据,请确认',
'提示',
{
confirmButtonText: '确定'
}
)
}
// 完全缓解 所有非结节靶病灶消失即非结节靶病灶的长径总和为0mm所有靶淋巴结病灶的短径必须减少至10 mm
if (selectValue === 'CR') {
if (longNonlymphNodeTargetSum > 0 || allLymphNodeLessThan10 === false) {
this.$confirm(
'完全缓解一般指的是非结节靶病灶的长径总和为0mm、所有靶淋巴结病灶的短径必须减少至10 mm,坚持自己的选择?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
)
.then(() => {
this.efficacyAssessment.RequireTargetLesionNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.TargetLesion = ''
this.efficacyAssessment.TargetLesionNote = ''
this.efficacyAssessment.RequireTargetLesionNote = false
})
return
}
} else if (selectValue === 'PR') { // 靶病灶总径与基线相比减低至少30%
const percent =
(longBaseNonlymphNodeTargetSum +
shortBaselymphNodeTargetSum -
shortLymphNodeTargetSum -
longNonlymphNodeTargetSum) /
(longBaseNonlymphNodeTargetSum + shortBaselymphNodeTargetSum)
if (percent < 0.3) {
this.$confirm(
'部分缓解一般指的是靶病灶总径与基线相比减低至少30%. 当前为:' +
(percent * 100).toFixed(2) +
'%. 坚持自己的选择?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
)
.then(() => {
this.efficacyAssessment.RequireTargetLesionNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.TargetLesion = ''
this.efficacyAssessment.TargetLesionNote = ''
this.efficacyAssessment.RequireTargetLesionNote = false
})
}
} else if (selectValue === 'PD') {
// 疾病进展PD 以靶病灶直径之和的最小值为参照直径和增加≥20%且必须满足直径和的绝对值增加至少5 mm。
const minPercent =
(longBaseNonlymphNodeTargetSum +
shortBaselymphNodeTargetSum -
this.MinVisitInfo.MinSum) /
this.MinVisitInfo.MinSum
const min =
longBaseNonlymphNodeTargetSum +
shortBaselymphNodeTargetSum -
this.MinVisitInfo.MinSum
if (!(minPercent >= 0.2 && min > 5)) {
this.$confirm(
'疾病进展PD一般指的是以靶病灶直径之和的最小值为参照直径和增加≥20%且必须满足直径和的绝对值增加至少5 mm. 当前直径和增加:' +
minPercent * 100 +
'%.坚持自己的选择?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
)
.then(() => {
this.efficacyAssessment.RequireTargetLesionNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.TargetLesion = ''
this.efficacyAssessment.TargetLesionNote = ''
this.efficacyAssessment.RequireTargetLesionNote = false
})
}
} else if (selectValue === 'SD') {
// 疾病稳定SD 介于PR及PD之间
const percent =
(longBaseNonlymphNodeTargetSum +
shortBaselymphNodeTargetSum -
shortLymphNodeTargetSum -
longNonlymphNodeTargetSum) /
(longBaseNonlymphNodeTargetSum + shortBaselymphNodeTargetSum)
const minPercent =
(longBaseNonlymphNodeTargetSum +
shortBaselymphNodeTargetSum -
this.MinVisitInfo.MinSum) /
this.MinVisitInfo.MinSum
const min =
longBaseNonlymphNodeTargetSum +
shortBaselymphNodeTargetSum -
this.MinVisitInfo.MinSum
if (!(percent < 0.3 || minPercent < 0.2 || min < 5)) {
this.$confirm(
'疾病稳定SD介于PR及PD之间.坚持自己的选择?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
)
.then(() => {
this.efficacyAssessment.RequireTargetLesionNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.TargetLesion = ''
this.efficacyAssessment.TargetLesionNote = ''
this.efficacyAssessment.RequireTargetLesionNote = false
})
}
}
// 无充分的数据,又无法确定病情进展
// else if (selectValue == 'NE') {
// } else {
// }
},
non_targetLesionAssessmentChange(selectValue) {
// clear 操作 不用填写Note
if (!selectValue) {
this.efficacyAssessment.RequireNon_targetLesionNote = false
return
}
let non_targetLesionSelectCount = 0
this.BLNontargetLesionList.forEach((element) => {
if (element.CurrentLesion.TRORRESU) non_targetLesionSelectCount++
})
if (non_targetLesionSelectCount !== this.BLNontargetLesionList.length) {
this.$alert('当前未填写完基线的非靶病灶选择访视数据,请确认', '提示', {
confirmButtonText: '确定'
})
return
}
if (this.BLNontargetLesionList.length > 0) {
const disappearArray = this.BLNontargetLesionList.filter(
(t) => t.CurrentLesion.TRORRESU === 'Disappear'
).map((obj, index) => {
return obj.CurrentLesion.TRORRESU
})
// 完全缓解 所有非靶病灶消失且肿瘤标记物恢复至正常水平。所有淋巴结无病理性意义短径10 mm
if (selectValue === 'CR') {
if (disappearArray.length !== this.BLNontargetLesionList.length) {
this.$confirm(
'完全缓解一般指的是:所有非靶病灶消失.坚持自己的选择?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
)
.then(() => {
this.efficacyAssessment.RequireNon_targetLesionNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.Non_targetLesion = ''
this.efficacyAssessment.Non_targetLesionNote = ''
this.efficacyAssessment.RequireNon_targetLesionNote = false
})
}
} else if (selectValue === 'Non-CR/Non-PD') {
// Non-CR/Non-PD 存在一个或多个非靶病灶和/或持续存在,肿瘤标记物水平超出正常水平。
const existArray = this.BLNontargetLesionList.filter(
(t) => t.CurrentLesion.TRORRESU === 'Exist'
).map((obj, index) => {
return obj.CurrentLesion.TRORRESU
})
if (existArray.length < 1) {
this.$confirm(
'部分缓解一般指的是:存在一个或多个非靶病灶持续存在.坚持自己的选择?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
)
.then(() => {
this.efficacyAssessment.RequireNon_targetLesionNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.Non_targetLesion = ''
this.efficacyAssessment.Non_targetLesionNote = ''
this.efficacyAssessment.RequireNon_targetLesionNote = false
})
}
} else if (selectValue === 'PD') {
// 疾病进展PD 已存在的非靶病灶出现明确进展。
const progressArray = this.BLNontargetLesionList.filter(
(t) => t.CurrentLesion.TRORRESU === 'Identify progress'
).map((obj, index) => {
return obj.CurrentLesion.TRORRESU
})
if (progressArray.length === 0) {
this.$confirm(
'疾病进展一般指的是:已存在的非靶病灶出现明确进展.坚持自己的选择?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
)
.then(() => {
this.efficacyAssessment.RequireNon_targetLesionNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.Non_targetLesion = ''
this.efficacyAssessment.Non_targetLesionNote = ''
this.efficacyAssessment.RequireNon_targetLesionNote = false
})
}
}
// 不可评估NE 无充分的数据,又无法确定病情进展
// else if (selectValue == 'NE') {
// } else {
// }
}
},
overallAssessmentChange(selectValue) {
// clear 操作 不用填写Note
if (!selectValue) {
this.efficacyAssessment.RequireOverallAssessmentNote = false
return
}
const hasNewLession = this.UnequivocalNewLesionList.length === 0
// 有靶病灶
if (
this.BLNonlymphNodeTargetList.length +
this.BLNontargetLesionList.length >
0
) {
if (
!this.efficacyAssessment.Non_targetLesion ||
!this.efficacyAssessment.TargetLesion
) {
this.$alert(
'请先选择靶病灶和非靶病灶评估结果后,再选择总体疗效',
'提示',
{
confirmButtonText: '确定'
}
)
this.efficacyAssessment.OverallAssessment = ''
return
}
// 前两条 非靶病灶是Na 或者是CR
if (
this.efficacyAssessment.TargetLesion === 'CR' &&
(this.BLNontargetLesionList.length === 0 ||
this.efficacyAssessment.Non_targetLesion === 'CR') &&
hasNewLession === false &&
this.efficacyAssessment.OverallAssessment !== 'CR'
) {
this.$confirm('按照规则,总体疗效应为CR.坚持自己的选择?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.efficacyAssessment.RequireOverallAssessmentNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.OverallAssessment = ''
this.efficacyAssessment.OverallAssessmentNote = ''
this.efficacyAssessment.RequireOverallAssessmentNote = false
})
}
// 3-4条
if (
this.efficacyAssessment.TargetLesion === 'CR' &&
(this.efficacyAssessment.Non_targetLesion === 'Non-CR/Non-PD' ||
this.efficacyAssessment.Non_targetLesion === 'NE') &&
hasNewLession === false &&
this.efficacyAssessment.OverallAssessment !== 'PR'
) {
this.$confirm('按照规则,总体疗效应为PR.坚持自己的选择?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.efficacyAssessment.RequireOverallAssessmentNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.OverallAssessment = ''
this.efficacyAssessment.OverallAssessmentNote = ''
this.efficacyAssessment.RequireOverallAssessmentNote = false
})
}
// 5条
if (
this.efficacyAssessment.TargetLesion === 'PR' &&
(this.efficacyAssessment.Non_targetLesion !== 'PD' ||
this.efficacyAssessment.Non_targetLesion === 'NE') &&
hasNewLession === false &&
this.efficacyAssessment.OverallAssessment !== 'PR'
) {
this.$confirm('按照规则,总体疗效应为PR.坚持自己的选择?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.efficacyAssessment.RequireOverallAssessmentNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.OverallAssessment = ''
this.efficacyAssessment.OverallAssessmentNote = ''
this.efficacyAssessment.RequireOverallAssessmentNote = false
})
}
// 6
if (
this.efficacyAssessment.TargetLesion === 'SD' &&
(this.efficacyAssessment.Non_targetLesion !== 'PD' ||
this.efficacyAssessment.Non_targetLesion === 'NE') &&
hasNewLession === false &&
this.efficacyAssessment.OverallAssessment !== 'SD'
) {
this.$confirm('按照规则,总体疗效应为SD.坚持自己的选择?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.efficacyAssessment.RequireOverallAssessmentNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.OverallAssessment = ''
this.efficacyAssessment.OverallAssessmentNote = ''
this.efficacyAssessment.RequireOverallAssessmentNote = false
})
}
// 7
if (
this.efficacyAssessment.TargetLesion === 'NE' &&
this.efficacyAssessment.Non_targetLesion !== 'PD' &&
hasNewLession === false &&
this.efficacyAssessment.OverallAssessment !== 'NE'
) {
this.$confirm('按照规则,总体疗效应为NE.坚持自己的选择?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.efficacyAssessment.RequireOverallAssessmentNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.OverallAssessment = ''
this.efficacyAssessment.OverallAssessmentNote = ''
this.efficacyAssessment.RequireOverallAssessmentNote = false
})
}
// 最后三条
if (
(this.efficacyAssessment.TargetLesion === 'PD' ||
this.efficacyAssessment.Non_targetLesion === 'PD' ||
hasNewLession) &&
this.efficacyAssessment.OverallAssessment !== 'PD'
) {
this.$confirm('按照规则,总体疗效应为PD.坚持自己的选择?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.efficacyAssessment.RequireOverallAssessmentNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.OverallAssessment = ''
this.efficacyAssessment.OverallAssessmentNote = ''
this.efficacyAssessment.RequireOverallAssessmentNote = false
})
}
} else {
// 无靶病灶
if (!this.efficacyAssessment.Non_targetLesion) {
this.$alert('请先选择非靶病灶评估结果后,再选择总体疗效', '提示', {
confirmButtonText: '确定'
})
this.efficacyAssessment.OverallAssessment = ''
return
}
if (
this.efficacyAssessment.Non_targetLesion === 'CR' &&
hasNewLession === false &&
this.efficacyAssessment.OverallAssessment !== 'CR'
) {
this.$confirm('按照规则,总体疗效应为CR.坚持自己的选择?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.efficacyAssessment.RequireOverallAssessmentNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.OverallAssessment = ''
this.efficacyAssessment.OverallAssessmentNote = ''
this.efficacyAssessment.RequireOverallAssessmentNote = false
})
}
if (
this.efficacyAssessment.Non_targetLesion === 'Non-CR/Non-PD' &&
hasNewLession === false &&
this.efficacyAssessment.OverallAssessment !== 'Non-CR/Non-PD'
) {
this.$confirm(
'按照规则,总体疗效应为Non-CR/Non-PD.坚持自己的选择?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
)
.then(() => {
this.efficacyAssessment.RequireOverallAssessmentNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.OverallAssessment = ''
this.efficacyAssessment.OverallAssessmentNote = ''
this.efficacyAssessment.RequireOverallAssessmentNote = false
})
}
if (
this.efficacyAssessment.Non_targetLesion === 'NE' &&
hasNewLession === false &&
this.efficacyAssessment.OverallAssessment !== 'NE'
) {
this.$confirm('按照规则,总体疗效应为NE.坚持自己的选择?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.efficacyAssessment.RequireOverallAssessmentNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.OverallAssessment = ''
this.efficacyAssessment.OverallAssessmentNote = ''
this.efficacyAssessment.RequireOverallAssessmentNote = false
})
}
// 表格倒数两个 当有新病灶或者 非靶病灶 是不能明确的PD 时候 总体评估是PD
if (
(hasNewLession || this.efficacyAssessment.Non_targetLesion === 'PD') &&
this.efficacyAssessment.OverallAssessment !== 'PD'
) {
this.$confirm('按照规则,总体疗效应为PD.坚持自己的选择?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
this.efficacyAssessment.RequireOverallAssessmentNote = true
this.$forceUpdate()
})
.catch(() => {
this.efficacyAssessment.OverallAssessment = ''
this.efficacyAssessment.OverallAssessmentNote = ''
this.efficacyAssessment.RequireOverallAssessmentNote = false
})
}
}
},
// 处理填充下拉框数据 数据来源 1、影像界面推过来 2、 表单页面自己获取
// 处理的逻辑包括 1、影像界面推过来时填写的Note 不被冲掉 2、 下拉框的禁用逻辑
handelImageLabelDataLogic(imageData) {
const that = this
const tpData = imageData
const lesionType1 = tpData.filter((t) => t.lesionType === 1)
const lesionType2 = tpData.filter((t) => t.lesionType === 2)
const lesionType3 = tpData.filter((t) => t.lesionType === 3)
const lesionType4 = tpData.filter((t) => t.lesionType === 4)
const lesionType5 = tpData.filter((t) => t.lesionType === 5)
if (lesionType1.length > 0) {
lesionType1.forEach((element) => {
const location = element.lesionLocation.split('-')
element.TRORRES = element.lesionValue.substring(
0,
element.lesionValue.length - 2
)
element.TULOC = location[0] || ''
element.TULAT = location[1] || ''
element.TUDIR = location[2] || ''
element.HasSelected = false
})
that.VisitNonlymphNodeTargetList = lesionType1
// 处理下拉款禁用逻辑
that.VisitNonlymphNodeTargetList.forEach((el) => {
that.BLNonlymphNodeTargetList.forEach((bL) => {
if (
bL.CurrentLesion.TRORRES &&
bL.CurrentLesion.TRORRES === el.TRORRES
) {
el.HasSelected = true
}
})
})
}
if (lesionType2.length > 0) {
lesionType2.forEach((element) => {
const location = element.lesionLocation.split('-')
element.TRORRES = element.lesionValue.substring(
0,
element.lesionValue.length - 2
)
element.TULOC = location[0] || ''
element.TULAT = location[1] || ''
element.TUDIR = location[2] || ''
element.HasSelected = false
})
that.VisitLymphNodeTargetList = lesionType2
// 处理下拉款禁用逻辑
that.VisitLymphNodeTargetList.forEach((el) => {
that.BLLymphNodeTargetList.forEach((bL) => {
if (
bL.CurrentLesion.TRORRES &&
bL.CurrentLesion.TRORRES === el.TRORRES
) {
el.HasSelected = true
}
})
})
}
if (lesionType3.length > 0) {
lesionType3.forEach((element) => {
const location = element.lesionLocation.split('-')
element.TULOC = location[0] || ''
element.TULAT = location[1] || ''
element.TUDIR = location[2] || ''
})
// that.BLNontargetLesionList = lesionType3
}
if (lesionType4.length > 0) {
lesionType4.forEach((element) => {
const location = element.lesionLocation.split('-')
element.TULOC = location[0] || ''
element.TULAT = location[1] || ''
element.TUDIR = location[2] || ''
})
that.EquivocalNewLesionList = lesionType4
}
if (lesionType5.length > 0) {
lesionType5.forEach((element) => {
const location = element.lesionLocation.split('-')
element.TULOC = location[0] || ''
element.TULAT = location[1] || ''
element.TUDIR = location[2] || ''
})
that.UnequivocalNewLesionList = lesionType5
}
},
// 分裂或者添加 病灶得删除操作 --非淋巴结靶病灶
handlenonlymphNodeTargetDelete(row) {
this.BLNonlymphNodeTargetList = this.BLNonlymphNodeTargetList.filter(
(t) => t.TULNKID !== row.TULNKID
)
},
nonlymphNodeTargetCoveredLesionChange(currentLesion) {
this.VisitNonlymphNodeTargetList.forEach((el) => {
if (el.TRORRES === currentLesion.TRORRES) {
el.HasSelected = false
}
})
currentLesion.TRORRES = ''
currentLesion.Note = ''
},
lymphNodeTargetCoveredLesionChange(currentLesion) {
this.VisitLymphNodeTargetList.forEach((el) => {
if (el.TRORRES === currentLesion.TRORRES) {
el.HasSelected = false
}
})
currentLesion.TRORRES = ''
currentLesion.Note = ''
},
// 选择测量值得校验操作 --非淋巴结靶病灶
nonlymphNodeTargetMeasurementChange(row) {
this.efficacyAssessment.TargetLesion = ''
this.efficacyAssessment.OverallAssessment = ''
// 当选择了测量值的时候才进行验证
if (row.CurrentLesion.TRORRES) {
// 保留一份拷贝 当清除的时候清除下拉框状态
row.CurrentLesion.TRORRESCopy = row.CurrentLesion.TRORRES
const imageData = this.VisitNonlymphNodeTargetList.filter(
(t) => t.TRORRES === row.CurrentLesion.TRORRES
)[0]
// 分裂和合并得不校验
if (row.VISITNUM === this.pageTPInfo.VisitNum) {
// 界面显示病灶位置
row.TULOC = imageData.TULOC
row.TULAT = imageData.TULAT
row.TUDIR = imageData.TUDIR
} else {
if (
row.TULOC !== imageData.TULOC ||
row.TULAT !== imageData.TULAT ||
row.TUDIR !== imageData.TUDIR
) {
// 病灶部位何位置不一致,提示 确认 则设置已选择 不能选择了 否则,取消该选项
this.$confirm(
`BaseLine: ${
row.TULOC + ' ' + row.TULAT + ' ' + row.TUDIR
} Current: ${
imageData.TULOC + ' ' + imageData.TULAT + ' ' + imageData.TUDIR
},confirm ?`,
'tips',
{
confirmButtonText: 'Confirm',
cancelButtonText: 'Cancel',
type: 'warning'
}
)
.then(() => {
this.VisitNonlymphNodeTargetList.forEach((el) => {
if (el.TRORRES === row.CurrentLesion.TRORRES) {
el.HasSelected = true
}
})
})
.catch(() => {
row.CurrentLesion.TRORRES = ''
this.VisitNonlymphNodeTargetList.forEach((el) => {
if (el.TRORRES === row.CurrentLesion.TRORRESCopy) {
el.HasSelected = false
}
})
})
} else {
this.VisitNonlymphNodeTargetList.forEach((el) => {
if (el.TRORRES === row.CurrentLesion.TRORRES) {
el.HasSelected = true
}
})
}
}
} else {
// 当取消测量值的时候 清除下拉框状态
this.VisitNonlymphNodeTargetList.forEach((el) => {
if (el.TRORRES === row.CurrentLesion.TRORRESCopy) {
el.HasSelected = false
}
})
}
// 处理下拉款禁用逻辑 重新执行一遍(为了 下拉框切换的时候,不知道上一个值)
this.VisitNonlymphNodeTargetList.forEach((el) => {
el.HasSelected = false
this.BLNonlymphNodeTargetList.forEach((bL) => {
if (
bL.CurrentLesion.TRORRES &&
bL.CurrentLesion.TRORRES === el.TRORRES
) {
el.HasSelected = true
}
})
})
},
// 分裂按钮操作 --非淋巴结靶病灶
nonlymphNodeTargetSplit() {
// 数组中添加分裂的项目
const count = parseInt(this.nonlymphNodeTargetSplitCount)
if (count === 0 || count === 1) {
return
}
// 分裂的项如果提前录入了数据 此时清空 然后禁用
const splitItem = this.BLNonlymphNodeTargetList.filter(
(t) => t.TUSEQ === this.nonlymphNodeTargetSelectArray[0]
)[0]
splitItem.CurrentLesion.CoveredLesion = ''
splitItem.CurrentLesion.Note = ''
splitItem.CurrentLesion.TRORRES = ''
for (let index = 1; index <= count; index++) {
this.BLNonlymphNodeTargetList.push({
TULNKID: splitItem.TULNKID + '.' + index,
TUGRPID: splitItem.TULNKID,
VISITNUM: this.pageTPInfo.VisitNum,
CurrentLesion: {
Note: this.nonlymphNodeTargetSelectArray[0] + 'split' + index
}
})
}
this.nonlymphNodeTargetSplitCount = 0
this.$refs.nonlymphNodeTargetBLTable.clearSelection()
},
// 合并按钮操作 --非淋巴结靶病灶
nonlymphNodeTargetMerge() {
const tULNKIDArray = []
// 合并的项如果提前录入了数据 此时清空 然后禁用
this.nonlymphNodeTargetSelectArray.forEach((element) => {
const mergeItem = this.BLNonlymphNodeTargetList.filter(
(t) => t.TUSEQ === element
)[0]
mergeItem.CurrentLesion.CoveredLesion = ''
mergeItem.CurrentLesion.Note = ''
mergeItem.CurrentLesion.TRORRES = ''
tULNKIDArray.push(mergeItem.TULNKID)
})
// 数组中添加合并的项目
this.BLNonlymphNodeTargetList.push({
VISITNUM: this.pageTPInfo.VisitNum,
TULNKID: tULNKIDArray.join('/'),
CurrentLesion: {
Note: this.nonlymphNodeTargetSelectArray.join('/') + 'Merge'
}
})
this.$refs.nonlymphNodeTargetBLTable.clearSelection()
},
// 合并 分裂按钮禁用控制逻辑 --非淋巴结靶病灶
handleNonlymphNodeTargetListSelectionChange(val) {
const arr = []
for (let index = 0; index < val.length; index++) {
arr.push(val[index].TUSEQ)
}
this.nonlymphNodeTargetSelectArray = arr
if (this.nonlymphNodeTargetSelectArray.length >= 2) {
this.nonlymphNodeTargetSplitDisable = true
this.nonlymphNodeTargetMergeDisable = false
} else if (this.nonlymphNodeTargetSelectArray.length === 1) {
this.nonlymphNodeTargetSplitDisable = false
this.nonlymphNodeTargetMergeDisable = true
} else {
this.nonlymphNodeTargetSplitDisable = true
this.nonlymphNodeTargetMergeDisable = true
}
},
// 下拉框禁用逻辑 --非淋巴结靶病灶
canNonlymphNodeTargetOpt(row) {
let flag = true
if (row.VISITNUM === this.pageTPInfo.VisitNum) {
// 分裂或者合并的没有序号 不能勾选 防止合并或者分裂操作
flag = false
}
this.NonlymphNodeTargetSplitOrMergeArray.forEach((t) => {
if (t.TULNKID.indexOf(row.TULNKID) !== -1) {
flag = false
}
})
return flag
},
// 分裂或者添加 病灶得删除操作 --淋巴结靶病灶
handlelymphNodeTargetDelete(row) {
this.BLLymphNodeTargetList = this.BLLymphNodeTargetList.filter(
(t) => t.TULNKID !== row.TULNKID
)
},
// 选择测量值得校验操作 --淋巴结靶病灶
lymphNodeTargetMeasurementChange(row) {
this.efficacyAssessment.TargetLesion = ''
this.efficacyAssessment.OverallAssessment = ''
// 当选择了测量值的时候才进行验证
if (row.CurrentLesion.TRORRES) {
// 保留一份拷贝 当清除的时候清除下拉框状态
row.CurrentLesion.TRORRESCopy = row.CurrentLesion.TRORRES
const imageData = this.VisitLymphNodeTargetList.filter(
(t) => t.TRORRES === row.CurrentLesion.TRORRES
)[0]
// 分裂和合并得不校验
if (row.VISITNUM === this.pageTPInfo.VisitNum) {
// 界面显示病灶位置
row.TULOC = imageData.TULOC
row.TULAT = imageData.TULAT
row.TUDIR = imageData.TUDIR
} else {
if (
row.TULOC !== imageData.TULOC ||
row.TULAT !== imageData.TULAT ||
row.TUDIR !== imageData.TUDIR
) {
// 病灶部位何位置不一致,提示 确认 则设置已选择 不能选择了 否则,取消该选项
this.$confirm(
`BaseLine: ${
row.TULOC + ' ' + row.TULAT + ' ' + row.TUDIR
} Current: ${
imageData.TULOC + ' ' + imageData.TULAT + ' ' + imageData.TUDIR
},confirm ?`,
'tips',
{
confirmButtonText: 'Confirm',
cancelButtonText: 'Cancel',
type: 'warning'
}
)
.then(() => {
this.VisitLymphNodeTargetList.forEach((el) => {
if (el.TRORRES === row.CurrentLesion.TRORRES) {
el.HasSelected = true
}
})
return
})
.catch(() => {
row.CurrentLesion.TRORRES = ''
this.VisitLymphNodeTargetList.forEach((el) => {
if (el.TRORRES === row.CurrentLesion.TRORRESCopy) {
el.HasSelected = false
}
})
return
})
} else {
this.VisitLymphNodeTargetList.forEach((el) => {
if (el.TRORRES === row.CurrentLesion.TRORRES) {
el.HasSelected = true
}
})
}
}
} else {
// 当取消测量值的时候 清除下拉框状态
this.VisitLymphNodeTargetList.forEach((el) => {
if (el.TRORRES === row.CurrentLesion.TRORRESCopy) {
el.HasSelected = false
}
})
}
// 处理下拉款禁用逻辑 重新执行一遍(为了 下拉框切换的时候,不知道上一个值)
this.VisitLymphNodeTargetList.forEach((el) => {
el.HasSelected = false
this.BLLymphNodeTargetList.forEach((bL) => {
if (
bL.CurrentLesion.TRORRES &&
bL.CurrentLesion.TRORRES === el.TRORRES
) {
el.HasSelected = true
}
})
})
},
// 淋巴结靶病灶 --分裂按钮操作
lymphNodeTargetSplit() {
// 数组中添加分裂的项目
const count = parseInt(this.lymphNodeTargetSplitCount)
if (count === 0 || count === 1) {
return
}
// 分裂的项如果提前录入了数据 此时清空 然后禁用
const splitItem = this.BLLymphNodeTargetList.filter(
(t) => t.TUSEQ === this.lymphNodeTargetSelectArray[0]
)[0]
splitItem.CurrentLesion.CoveredLesion = ''
splitItem.CurrentLesion.Note = ''
splitItem.CurrentLesion.TRORRES = ''
for (let index = 1; index <= count; index++) {
this.BLLymphNodeTargetList.push({
VISITNUM: this.pageTPInfo.VisitNum,
TULNKID: splitItem.TULNKID + '.' + index,
TUGRPID: splitItem.TULNKID,
CurrentLesion: {
Note: this.lymphNodeTargetSelectArray[0] + 'split' + index
}
})
}
this.lymphNodeTargetSplitCount = 0
this.$refs.lymphNodeTargetBLTable.clearSelection()
},
// 淋巴结靶病灶 -- 合并按钮操作
lymphNodeTargetMerge() {
const tULNKIDArray = []
// 合并的项如果提前录入了数据 此时清空 然后禁用
this.lymphNodeTargetSelectArray.forEach((element) => {
const mergeItem = this.BLLymphNodeTargetList.filter(
(t) => t.TUSEQ === element
)[0]
mergeItem.CurrentLesion.CoveredLesion = ''
mergeItem.CurrentLesion.Note = ''
mergeItem.CurrentLesion.TRORRES = ''
tULNKIDArray.push(mergeItem.TULNKID)
})
// 数组中添加合并的项目
this.BLLymphNodeTargetList.push({
VISITNUM: this.pageTPInfo.VisitNum,
TULNKID: tULNKIDArray.join('/'),
CurrentLesion: {
Note: this.lymphNodeTargetSelectArray.join('/') + 'Merge'
}
})
this.$refs.lymphNodeTargetBLTable.clearSelection()
},
// 淋巴结靶病灶-- 合并 分裂按钮禁用控制逻辑
handleLymphNodeTargetListSelectionChange(val) {
const arr = []
for (let index = 0; index < val.length; index++) {
arr.push(val[index].TUSEQ)
}
this.lymphNodeTargetSelectArray = arr
if (this.lymphNodeTargetSelectArray.length >= 2) {
this.lymphNodeTargetSplitDisable = true
this.lymphNodeTargetMergeDisable = false
} else if (this.lymphNodeTargetSelectArray.length === 1) {
this.lymphNodeTargetSplitDisable = false
this.lymphNodeTargetMergeDisable = true
} else {
this.lymphNodeTargetSplitDisable = true
this.lymphNodeTargetMergeDisable = true
}
},
// 淋巴结靶病灶 -- 下拉框禁用逻辑
canLymphNodeTargetOpt(row) {
let flag = true
if (row.VISITNUM === this.pageTPInfo.VisitNum) {
// 分裂或者合并的没有序号 不能勾选 防止合并或者分裂操作
flag = false
}
this.LymphNodeTargetSplitOrMergeArray.forEach((t) => {
if (t.TULNKID.indexOf(row.TULNKID) !== -1) {
flag = false
}
})
return flag
},
submiteReport() {
submiteReport(this.pageTPInfo.WorkloadId).then((res) => {
this.$message.success('Report saved successfully')
this.isReportSaved = true
})
},
saveImageLabel() {
const param = {}
param.TpCode = this.pageTPInfo.WorkloadCode
param.ImageLabelList = []
this.imageLabelList.forEach((element) => {
param.ImageLabelList.push({
StudyId: this.pageTPInfo.StudyId,
LabelValue: JSON.stringify(element),
SeriesId: element.seriesId,
InstanceId: element.instanceId
})
})
saveImageLabelList(param).then((res) => {
this.imageDataHasUpdate = false
this.$message.success('saved imgeLable successfully')
})
},
// 非靶病灶 end
addVistLine() {
const that = this
let a = true
let b = true
let c = true
this.$refs.qualifiedForm.validate((valid) => {
if (!valid) {
a = false
return
}
})
this.$refs.commentsForm.validate((valid) => {
if (!valid) {
b = false
return
}
})
this.$refs.efficacyAssessmentForm.validate((valid) => {
if (!valid) {
c = false
return
}
})
if (a && b && c) {
// 纯粹的测量信息 tr
const postTRArray = []
// 分裂或者合并的 tu tr信息
const lessionArray = []
this.BLNonlymphNodeTargetList.forEach((element) => {
// 非淋巴结靶病灶
// 属于新病灶
if (element.VISITNUM === this.pageTPInfo.VisitNum) {
lessionArray.push({
LesionType: 1, // 病灶类型
STUDYID: this.pageTPInfo.TrialCode, // 项目Id
USUBJID: this.pageTPInfo.SubjectCode, // 受试者Id
TUSPID: this.pageTPInfo.Sponsor,
// TUSEQ="" //病灶序号 不传递
TUGRPID: element.TUGRPID, // 病灶分组
// TUREFID:"" //医学影像 ID
TULNKID: element.TULNKID, // 关联测量结果及TUGRPID一起标识分裂及合并
TUTESTCD: 'TUMIDENT',
TUTEST: 'Tumor Identification',
TUORRES: 'TARGET', // 标识结果 1target 2None target 3 New
TUSTRESC: 'TARGET',
TUNAM: 'zhizhun', // /完成肿瘤标识的供应商名称或标识
LocDescription: element.LocDescription, // 部位描述
TULOC: element.TULOC, // 解剖学位置
TULAT: element.TULAT, // 左侧 右侧。。。
TUDIR: element.TUDIR, // 方向
TUPORTOT: '', // 更详细的分布,安排,分配的修饰语, 比如,全部的,单一的,部分的,多数的。
TUMETHOD: '', // 标识肿瘤的方法
TUEVAL: '', // 评估者的角色。 例如:研究者,独立评估者。
TUEVALID: '', // 这个特定的评估者变量是与 TUEVAL一起使用来提供更详 细的信息
TUACPTFL: '', // 双人阅片 这个标帜用来认定能够被接受的一条评估记录。
VISITNUM: this.pageTPInfo.VisitNum,
VISIT: this.pageTPInfo.VisitName,
VISITDY: 0,
EPOCH: '', // 时期
TUDTC: '', // 检查日期
TUDY: 0, // 检查日
TRTESTCD: '', // 检查简称
TRTEST: '', // 检查项名称
TRORRES: element.CurrentLesion.TRORRES, // 原始结果
TRORRESU: '', // 原始单位
TRSTRESC: '', // 标准化结果
TRSTRESN: 0, // 标准化结果N
TRSTRESU: '', // // 标准化单位
TRSTAT: '', // 未做状态
TRREASND: '', // 未做原因
Note: element.CurrentLesion.Note,
TRGRPID: '', // 用于关联域内同一受试者的一组相关记录
TRDTC: '', // 检查日期
TRDY: 0, // 检查日
CoveredLesion: element.CurrentLesion.CoveredLesion
})
} else if (
element.VISITNUM !== this.pageTPInfo.VisitNum &&
element.CurrentLesion.CoveredLesion
) {
postTRArray.push({
STUDYID: this.pageTPInfo.TrialCode, // 项目Id
TRSPID: this.pageTPInfo.Sponsor,
DOMAIN: '',
USUBJID: this.pageTPInfo.SubjectCode, // 受试者Id
// TRSEQ: "",
TRGRPID: '',
TRREFID: '', // 内部或外部的肿瘤/病灶标识
TRLNKID: element.TULNKID, // 链接在肿瘤/病灶标识域TU内单一肿瘤的标识记录结果的标识符
TRLNKGRP: '', // 用于组合/链接所用于RS 域中的疗效评估记录的测量/评估
TRTESTCD: '', // 检查项简称
TRTEST: '', // 检查项名称
TRORRES: element.CurrentLesion.TRORRES, // 原始结果
TRORRESU: element.CurrentLesion.TRORRESU, // 原始单位
TRSTRESC: '', // 标准化结果
TRSTRESN: 0, // 标准化结果N
TRSTRESU: '', // 标准化单位
TRSTAT: '', // 未作状态
TRREASND: '', // 未作原因
TRNAM: '', // 供应商名称
TRMETHOD: '', // 检查方法
TREVAL: '', // 评估者
TREVALID: '', // 评估者标识符
TRACPTFL: '', // 这个标帜用来认定能够被接受的一条评估记录
VISITNUM: this.pageTPInfo.VisitNum,
VISIT: this.pageTPInfo.VisitName,
VISITDY: 0,
EPOCH: '', // 时期
TRDTC: '', // 检查日期
TRDY: 0, // 检查日
Note: element.CurrentLesion.Note,
CoveredLesion: element.CurrentLesion.CoveredLesion
})
}
})
this.BLLymphNodeTargetList.forEach((element) => {
// 淋巴结靶病灶
// 1、新病灶
if (element.VISITNUM === this.pageTPInfo.VisitNum) {
lessionArray.push({
LesionType: 2, // 病灶类型
STUDYID: this.pageTPInfo.TrialCode, // 项目Id
USUBJID: this.pageTPInfo.SubjectCode, // 受试者Id
TUSPID: this.pageTPInfo.Sponsor,
// TUSEQ="" //病灶序号 不传递
TUGRPID: element.TUGRPID, // 病灶分组
// TUREFID:"" //医学影像 ID
TULNKID: element.TULNKID, // 关联测量结果及TUGRPID一起标识分裂及合并
TUTESTCD: 'TUMIDENT',
TUTEST: 'Tumor Identification',
TUORRES: 'TARGET', // 标识结果 1target 2None target 3 New
TUSTRESC: 'TARGET',
TUNAM: 'zhizhun', // /完成肿瘤标识的供应商名称或标识
LocDescription: element.LocDescription, // 部位描述
TULOC: element.TULOC, // 解剖学位置
TULAT: element.TULAT, // 左侧 右侧。。。
TUDIR: element.TUDIR, // 方向
TUPORTOT: '', // 更详细的分布,安排,分配的修饰语, 比如,全部的,单一的,部分的,多数的。
TUMETHOD: '', // 标识肿瘤的方法
TUEVAL: '', // 评估者的角色。 例如:研究者,独立评估者。
TUEVALID: '', // 这个特定的评估者变量是与 TUEVAL一起使用来提供更详 细的信息
TUACPTFL: '', // 双人阅片 这个标帜用来认定能够被接受的一条评估记录。
VISITNUM: this.pageTPInfo.VisitNum,
VISIT: this.pageTPInfo.VisitName,
VISITDY: 0,
EPOCH: '', // 时期
TUDTC: '', // 检查日期
TUDY: 0, // 检查日
TRTESTCD: '', // 检查简称
TRTEST: '', // 检查项名称
TRORRES: element.CurrentLesion.TRORRES, // 原始结果
TRORRESU: '', // 原始单位
TRSTRESC: '', // 标准化结果
TRSTRESN: 0, // 标准化结果N
TRSTRESU: '', // // 标准化单位
TRSTAT: '', // 未做状态
TRREASND: '', // 未做原因
Note: element.CurrentLesion.Note,
TRGRPID: '', // 用于关联域内同一受试者的一组相关记录
TRDTC: '', // 检查日期
TRDY: 0, // 检查日
CoveredLesion: element.CurrentLesion.CoveredLesion
})
} else if (
element.VISITNUM !== this.pageTPInfo.VisitNum &&
element.CurrentLesion.CoveredLesion
) {
postTRArray.push({
STUDYID: this.pageTPInfo.TrialCode, // 项目Id
TRSPID: this.pageTPInfo.Sponsor,
DOMAIN: '',
USUBJID: this.pageTPInfo.SubjectCode, // 受试者Id
// TRSEQ: "",
TRGRPID: '',
TRREFID: '', // 内部或外部的肿瘤/病灶标识
TRLNKID: element.TULNKID, // 链接在肿瘤/病灶标识域TU内单一肿瘤的标识记录结果的标识符
TRLNKGRP: '', // 用于组合/链接所用于RS 域中的疗效评估记录的测量/评估
TRTESTCD: '', // 检查项简称
TRTEST: '', // 检查项名称
TRORRES: element.CurrentLesion.TRORRES, // 原始结果
TRORRESU: element.CurrentLesion.TRORRESU, // 原始单位
TRSTRESC: '', // 标准化结果
TRSTRESN: 0, // 标准化结果N
TRSTRESU: '', // 标准化单位
TRSTAT: '', // 未作状态
TRREASND: '', // 未作原因
TRNAM: '', // 供应商名称
TRMETHOD: '', // 检查方法
TREVAL: '', // 评估者
TREVALID: '', // 评估者标识符
TRACPTFL: '', // 这个标帜用来认定能够被接受的一条评估记录
VISITNUM: this.pageTPInfo.VisitNum,
VISIT: this.pageTPInfo.VisitName,
VISITDY: 0,
EPOCH: '', // 时期
TRDTC: '', // 检查日期
TRDY: 0, // 检查日
Note: element.CurrentLesion.Note,
CoveredLesion: element.CurrentLesion.CoveredLesion
})
}
})
// 非靶病灶
this.BLNontargetLesionList.forEach((element) => {
postTRArray.push({
STUDYID: this.pageTPInfo.TrialCode, // 项目Id
TRSPID: this.pageTPInfo.Sponsor,
DOMAIN: '',
USUBJID: this.pageTPInfo.SubjectCode, // 受试者Id
// TRSEQ: "",
TRGRPID: '',
TRREFID: '', // 内部或外部的肿瘤/病灶标识
TRLNKID: element.TULNKID, // 链接在肿瘤/病灶标识域TU内单一肿瘤的标识记录结果的标识符
TRLNKGRP: '', // 用于组合/链接所用于RS 域中的疗效评估记录的测量/评估
TRTESTCD: '', // 检查项简称
TRTEST: '', // 检查项名称
TRORRES: element.CurrentLesion.TRORRES, // 原始结果
TRORRESU: element.CurrentLesion.TRORRESU, // 原始单位
TRSTRESC: '', // 标准化结果
TRSTRESN: 0, // 标准化结果N
TRSTRESU: '', // 标准化单位
TRSTAT: '', // 未作状态
TRREASND: '', // 未作原因
TRNAM: '', // 供应商名称
TRMETHOD: '', // 检查方法
TREVAL: '', // 评估者
TREVALID: '', // 评估者标识符
TRACPTFL: '', // 这个标帜用来认定能够被接受的一条评估记录
VISITNUM: this.pageTPInfo.VisitNum,
VISIT: this.pageTPInfo.VisitName,
VISITDY: 0,
EPOCH: '', // 时期
TRDTC: '', // 检查日期
TRDY: 0, // 检查日
Note: element.CurrentLesion.Note
})
})
// PreviousNewLesionList
this.PreviousNewLesionList.forEach((element) => {
postTRArray.push({
STUDYID: this.pageTPInfo.TrialCode, // 项目Id
TRSPID: this.pageTPInfo.Sponsor,
DOMAIN: '',
USUBJID: this.pageTPInfo.SubjectCode, // 受试者Id
// TRSEQ: "",
TRGRPID: '',
TRREFID: '', // 内部或外部的肿瘤/病灶标识
TRLNKID: element.TULNKID, // 链接在肿瘤/病灶标识域TU内单一肿瘤的标识记录结果的标识符
TRLNKGRP: '', // 用于组合/链接所用于RS 域中的疗效评估记录的测量/评估
TRTESTCD: '', // 检查项简称
TRTEST: '', // 检查项名称
TRORRES: element.CurrentLesion.TRORRES, // 原始结果
TRORRESU: element.CurrentLesion.TRORRESU, // 原始单位
TRSTRESC: '', // 标准化结果
TRSTRESN: 0, // 标准化结果N
TRSTRESU: '', // 标准化单位
TRSTAT: '', // 未作状态
TRREASND: '', // 未作原因
TRNAM: '', // 供应商名称
TRMETHOD: '', // 检查方法
TREVAL: '', // 评估者
TREVALID: '', // 评估者标识符
TRACPTFL: '', // 这个标帜用来认定能够被接受的一条评估记录
VISITNUM: this.pageTPInfo.VisitNum,
VISIT: this.pageTPInfo.VisitName,
VISITDY: 0,
EPOCH: '', // 时期
TRDTC: '', // 检查日期
TRDY: 0, // 检查日
Note: element.CurrentLesion.Note
})
})
// Equivocal New Lesion
this.EquivocalNewLesionList.forEach((element) => {
lessionArray.push({
LesionType: 4, // 病灶类型
STUDYID: this.pageTPInfo.TrialCode, // 项目Id
USUBJID: this.pageTPInfo.SubjectCode, // 受试者Id
TUSPID: this.pageTPInfo.Sponsor,
// TUSEQ="" //病灶序号 不传递
TUGRPID: element.TUGRPID, // 病灶分组
// TUREFID:"" //医学影像 ID
TULNKID: element.TULNKID, // 关联测量结果及TUGRPID一起标识分裂及合并
TUTESTCD: 'TUMIDENT',
TUTEST: 'Tumor Identification',
TUORRES: '', // 标识结果 1target 2None target 3 New
TUSTRESC: '',
TUNAM: '', // /完成肿瘤标识的供应商名称或标识
LocDescription: element.LocDescription, // 部位描述
TULOC: element.TULOC, // 解剖学位置
TULAT: element.TULAT, // 左侧 右侧。。。
TUDIR: element.TUDIR, // 方向
TUPORTOT: '', // 更详细的分布,安排,分配的修饰语, 比如,全部的,单一的,部分的,多数的。
TUMETHOD: '', // 标识肿瘤的方法
TUEVAL: '', // 评估者的角色。 例如:研究者,独立评估者。
TUEVALID: '', // 这个特定的评估者变量是与 TUEVAL一起使用来提供更详 细的信息
TUACPTFL: '', // 双人阅片 这个标帜用来认定能够被接受的一条评估记录。
VISITNUM: this.pageTPInfo.VisitNum,
VISIT: this.pageTPInfo.VisitName,
VISITDY: 0,
EPOCH: '', // 时期
TUDTC: '', // 检查日期
TUDY: 0, // 检查日
TRTESTCD: '', // 检查简称
TRTEST: '', // 检查项名称
TRORRES: element.TRORRES, // 原始结果
TRORRESU: '', // 原始单位
TRSTRESC: '', // 标准化结果
TRSTRESN: 0, // 标准化结果N
TRSTRESU: '', // // 标准化单位
TRSTAT: '', // 未做状态
TRREASND: '', // 未做原因
Note: element.Note,
TRGRPID: '', // 用于关联域内同一受试者的一组相关记录
TRDTC: '', // 检查日期
TRDY: 0 // 检查日
})
})
// Unequivocal New Lesion
this.UnequivocalNewLesionList.forEach((element) => {
lessionArray.push({
LesionType: 5, // 病灶类型
STUDYID: this.pageTPInfo.TrialCode, // 项目Id
USUBJID: this.pageTPInfo.SubjectCode, // 受试者Id
TUSPID: this.pageTPInfo.Sponsor,
// TUSEQ="" //病灶序号 不传递
TUGRPID: element.TUGRPID, // 病灶分组
// TUREFID:"" //医学影像 ID
TULNKID: element.TULNKID, // 关联测量结果及TUGRPID一起标识分裂及合并
TUTESTCD: 'TUMIDENT',
TUTEST: 'Tumor Identification',
TUORRES: '', // 标识结果 1target 2None target 3 New
TUSTRESC: '',
TUNAM: '', // /完成肿瘤标识的供应商名称或标识
LocDescription: element.LocDescription, // 部位描述
TULOC: element.TULOC, // 解剖学位置
TULAT: element.TULAT, // 左侧 右侧。。。
TUDIR: element.TUDIR, // 方向
TUPORTOT: '', // 更详细的分布,安排,分配的修饰语, 比如,全部的,单一的,部分的,多数的。
TUMETHOD: '', // 标识肿瘤的方法
TUEVAL: '', // 评估者的角色。 例如:研究者,独立评估者。
TUEVALID: '', // 这个特定的评估者变量是与 TUEVAL一起使用来提供更详 细的信息
TUACPTFL: '', // 双人阅片 这个标帜用来认定能够被接受的一条评估记录。
VISITNUM: this.pageTPInfo.VisitNum,
VISIT: this.pageTPInfo.VisitName,
VISITDY: 0,
EPOCH: '', // 时期
TUDTC: '', // 检查日期
TUDY: 0, // 检查日
TRTESTCD: '', // 检查简称
TRTEST: '', // 检查项名称
TRORRES: element.TRORRES, // 原始结果
TRORRESU: '', // 原始单位
TRSTRESC: '', // 标准化结果
TRSTRESN: 0, // 标准化结果N
TRSTRESU: '', // // 标准化单位
TRSTAT: '', // 未做状态
TRREASND: '', // 未做原因
Note: element.Note,
TRGRPID: '', // 用于关联域内同一受试者的一组相关记录
TRDTC: '', // 检查日期
TRDY: 0 // 检查日
})
})
// Efficacy Assessment
const rsArray = []
const efficacyAssessmentTarget = {
StudyGuid: this.pageTPInfo.StudyId,
TrialGuid: this.pageTPInfo.TrialId,
SubjectGuid: this.pageTPInfo.SubjectId,
STUDYID: this.pageTPInfo.TrialCode, // 项目Id
DOMAIN: '',
USUBJID: this.pageTPInfo.SubjectCode, // 受试者Id
// RSSEQ: "",
RSGRPID: '',
RSREFID: '', // 内部或外部的肿瘤/病灶标识,
RSSPID: this.pageTPInfo.Sponsor, // 申办者定义的参考编码。
RSLNKID: '', // 用来把相同肿瘤的为了决定反应结果的(在肿瘤/病灶测量域中的)适当测量记录与对反应的评估链接起来。
RSLNKGRP: '', // 用于链接肿瘤疗效评估与TR 域中相关测量/评估记录。
RSTESTCD: 'TRGRESP', // 评估项简称
RSTEST: 'Target Response', // 评估项名称
RSCAT: '', // 类别
RSORRES: this.efficacyAssessment.TargetLesion, // 原始结果
RSSTRESC: this.efficacyAssessment.TargetLesion, // 标准化结果
RSSTAT: '', // 未作状态
RSREASND: '', // 未作原因
RSNAM: '', // 实验室/供应商名称
RSEVAL: '', // 评估者
RSEVALID: '', // 评估者标识符
RSACPTFL: '', // 记录接受标帜
VISITNUM: this.pageTPInfo.VisitNum,
VISIT: this.pageTPInfo.VisitName,
VISITDY: 0,
EPOCH: '', // 时期
RSDTC: '', // 检查日期/时间
RSDY: 0 // 检查日
}
const efficacyAssessmentNontarget = JSON.parse(
JSON.stringify(efficacyAssessmentTarget)
)
efficacyAssessmentTarget.Note = this.efficacyAssessment.TargetLesionNote
efficacyAssessmentNontarget.RSTESTCD = 'NTRGRESP'
efficacyAssessmentNontarget.RSTEST = 'Non-target Response'
efficacyAssessmentNontarget.RSORRES = this.efficacyAssessment.Non_targetLesion
efficacyAssessmentNontarget.RSSTRESC = this.efficacyAssessment.Non_targetLesion
efficacyAssessmentNontarget.Note = this.efficacyAssessment.Non_targetLesionNote
const efficacyAssessmentOverall = JSON.parse(
JSON.stringify(efficacyAssessmentTarget)
)
efficacyAssessmentOverall.RSTESTCD = 'OVRLRESP'
efficacyAssessmentOverall.RSTEST = 'Overall Response'
efficacyAssessmentOverall.RSORRES = this.efficacyAssessment.OverallAssessment
efficacyAssessmentOverall.RSSTRESC = this.efficacyAssessment.OverallAssessment
efficacyAssessmentOverall.Note = this.efficacyAssessment.OverallAssessmentNote
rsArray.push(efficacyAssessmentTarget)
rsArray.push(efficacyAssessmentNontarget)
rsArray.push(efficacyAssessmentOverall)
// Measurements Calculation
const calculation = {
STUDYID: this.pageTPInfo.TrialCode, // 项目Id
TRSPID: this.pageTPInfo.Sponsor,
DOMAIN: '',
USUBJID: this.pageTPInfo.SubjectCode, // 受试者Id
TRGRPID: '',
TRREFID: '', // 内部或外部的肿瘤/病灶标识
TRLNKID: '', // 链接在肿瘤/病灶标识域TU内单一肿瘤的标识记录结果的标识符
TRLNKGRP: '', // 用于组合/链接所用于RS 域中的疗效评估记录的测量/评估
TRTESTCD: '', // 检查项简称
TRTEST: '', // 检查项名称
TRORRES: '', // 原始结果
TRORRESU: '', // 原始单位
TRSTRESC: '', // 标准化结果
TRSTRESN: 0, // 标准化结果N
TRSTRESU: '', // 标准化单位
TRSTAT: '', // 未作状态
TRREASND: '', // 未作原因
TRNAM: '', // 供应商名称
TRMETHOD: '', // 检查方法
TREVAL: '', // 评估者
TREVALID: '', // 评估者标识符
TRACPTFL: '', // 这个标帜用来认定能够被接受的一条评估记录
VISITNUM: this.pageTPInfo.VisitNum,
VISIT: this.pageTPInfo.VisitName,
VISITDY: 0,
EPOCH: '', // 时期
TRDTC: '', // 检查日期
TRDY: 0, // 检查日
Note: ''
}
const SumOfDiameterCalculation = JSON.parse(JSON.stringify(calculation))
SumOfDiameterCalculation.TRTEST = 'Sum of Diameter'
SumOfDiameterCalculation.TRTESTCD = 'SUMDIAM'
SumOfDiameterCalculation.TRORRES = this.SumOfDiameter
const NonnodularLesionsSODCalculation = JSON.parse(
JSON.stringify(calculation)
)
NonnodularLesionsSODCalculation.TRTEST =
'Sum Diameters of Non Lymph NodeTumors'
NonnodularLesionsSODCalculation.TRTESTCD = 'SUMNLNLD'
NonnodularLesionsSODCalculation.TRORRES = this.NonnodularLesionsSOD
postTRArray.push(SumOfDiameterCalculation)
postTRArray.push(NonnodularLesionsSODCalculation)
this.$confirm('Sure fill in all the information?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
}).then(() => {
saveVisitReport({
LesionInformation: lessionArray,
TrList: postTRArray,
ReportResult: this.reportResult,
RSList: rsArray,
PreviousOverallAssessment: this.previousOverallAssessment
}).then((res) => {
// this.isReportSaved = true
this.$message.success('added successfully')
})
})
if (that.imageDataHasUpdate) {
that.saveImageLabel()
}
}
}
}
}
</script>
<style lang="scss">
.ImageReviewTask-list {
height: 100%;
.el-collapse-item.is-disabled .el-collapse-item__header {
color: black;
font-weight: bold;
}
.el-collapse-item__header {
background-color: #f0f0f0;
height: 40px;
line-height: 50px;
padding: 0 5px;
}
.el-collapse-item__wrap {
padding: 0 5px;
}
.el-collapse {
margin-bottom: 100px;
}
.toolbar {
margin: 5px 0px;
.mr {
margin-right: 5px;
width: 130px;
}
}
#footer {
position: fixed;
bottom: 30px;
width: 100%;
// height: 30px; /*脚部的高度*/
// background: #6cf;
clear: both;
}
}
</style>