系统标准阅片bug修复及非dicom阅片更改

uat
caiyiling 2025-03-06 11:01:46 +08:00
parent 067162e1d7
commit 1265cef6f9
10 changed files with 396 additions and 372 deletions

View File

@ -4,6 +4,7 @@
<div> <div>
</div> </div>
<div> <div>
<!-- 配置 -->
<el-button <el-button
size="mini" size="mini"
type="primary" type="primary"
@ -11,7 +12,7 @@
@click="handleAdd" @click="handleAdd"
style="margin-right: 10px;" style="margin-right: 10px;"
> >
配置 {{ $t('dictionary:template:criterionDictionary:button:config') }}
</el-button> </el-button>
</div> </div>
</div> </div>
@ -21,55 +22,63 @@
:data="list" :data="list"
stripe stripe
> >
<!-- 序号 -->
<el-table-column <el-table-column
prop="" prop=""
label="序号" label=""
width="50" width="50"
> >
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.$index + 1}} {{scope.$index + 1}}
</template> </template>
</el-table-column> </el-table-column>
<!-- 字典表名 -->
<el-table-column <el-table-column
prop="Code" prop="Code"
label="字典表名" :label="$t('dictionary:template:criterionDictionary:table:code')"
show-overflow-tooltip show-overflow-tooltip
> >
</el-table-column> </el-table-column>
<!-- 描述 -->
<el-table-column <el-table-column
prop="Description" prop="Description"
label="描述" :label="$t('dictionary:template:criterionDictionary:table:description')"
show-overflow-tooltip show-overflow-tooltip
> >
</el-table-column> </el-table-column>
<!-- 子项数量 -->
<el-table-column <el-table-column
prop="Count" prop="Count"
label="子项数量" :label="$t('dictionary:template:criterionDictionary:table:count')"
show-overflow-tooltip show-overflow-tooltip
> >
</el-table-column> </el-table-column>
<!-- 排序 -->
<el-table-column <el-table-column
prop="ShowOrder" prop="ShowOrder"
label="排序" :label="$t('dictionary:template:criterionDictionary:table:showOrder')"
show-overflow-tooltip show-overflow-tooltip
> >
</el-table-column> </el-table-column>
<!-- 操作 -->
<el-table-column <el-table-column
prop="Description" prop="Description"
label="操作" :label="$t('common:action:action')"
show-overflow-tooltip show-overflow-tooltip
> >
<template slot-scope="scope"> <template slot-scope="scope">
<!-- 配置 -->
<el-button size="small" :disabled="isCompleteConfig" type="primary" @click="openChildren(scope.row)"> <el-button size="small" :disabled="isCompleteConfig" type="primary" @click="openChildren(scope.row)">
配置 {{ $t('dictionary:template:criterionDictionary:button:config') }}
</el-button> </el-button>
<!-- 删除 -->
<el-button <el-button
type="danger" type="danger"
size="small" size="small"
:disabled="isCompleteConfig" :disabled="isCompleteConfig"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
> >
删除 {{ $t('common:button:delete') }}
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
@ -122,21 +131,24 @@
{{ scope.$index + 1}} {{ scope.$index + 1}}
</template> </template>
</el-table-column> </el-table-column>
<!-- 字典表名 -->
<el-table-column <el-table-column
prop="Code" prop="Code"
label="字典表名" :label="$t('dictionary:template:criterionDictionary:table:code')"
show-overflow-tooltip show-overflow-tooltip
> >
</el-table-column> </el-table-column>
<!-- 描述 -->
<el-table-column <el-table-column
prop="Description" prop="Description"
label="描述" :label="$t('dictionary:template:criterionDictionary:table:description')"
show-overflow-tooltip show-overflow-tooltip
> >
</el-table-column> </el-table-column>
<!-- 排序 -->
<el-table-column <el-table-column
prop="ShowOrder" prop="ShowOrder"
label="排序" :label="$t('dictionary:template:criterionDictionary:table:showOrder')"
show-overflow-tooltip show-overflow-tooltip
> >
</el-table-column> </el-table-column>
@ -170,7 +182,6 @@ export default {
rowData: {}, rowData: {},
activeName: '0', activeName: '0',
addOrEdit: { visible: false, title: '' }, addOrEdit: { visible: false, title: '' },
preview: { visible: false, title: 'eCRF预览' },
config: { visible: false, title: '全局配置' }, config: { visible: false, title: '全局配置' },
drawer_cfg: { drawerChild: false, parentId: '', title: '' }, drawer_cfg: { drawerChild: false, parentId: '', title: '' },
drawer_cfg2: { drawerChild: false, parentId: '', title: '' }, drawer_cfg2: { drawerChild: false, parentId: '', title: '' },

View File

@ -54,7 +54,7 @@
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span style="margin-left:auto"> <!-- <span style="margin-left:auto">
<el-button <el-button
v-if="!isCompleteConfig" v-if="!isCompleteConfig"
type="primary" type="primary"
@ -63,7 +63,7 @@
> >
{{ $t('common:button:new') }} {{ $t('common:button:new') }}
</el-button> </el-button>
</span> </span> -->
</template> </template>

View File

@ -680,7 +680,7 @@ export default {
measureData.data.uuid = `${measureData.instanceId}-${measureData.data.remark}` measureData.data.uuid = `${measureData.instanceId}-${measureData.data.remark}`
} else { } else {
this.$set(this.questionForm, 'IsDicomReading', true) this.$set(this.questionForm, 'IsDicomReading', true)
const lesionState = this.getQuestionVal(7)
// 线 // 线
if (this.isBaseLineTask && !lesionState) { if (this.isBaseLineTask && !lesionState) {
const stateId = this.getQuestionId(7) const stateId = this.getQuestionId(7)
@ -735,7 +735,7 @@ export default {
} }
} }
} }
const lesionState = this.getQuestionVal(7)
var status = '' var status = ''
if (lesionState) { if (lesionState) {
if (this.lesionType === 0 && lesionState === 1) { if (this.lesionType === 0 && lesionState === 1) {

View File

@ -775,7 +775,7 @@ export default {
measureData.data.uuid = `${measureData.instanceId}-${measureData.data.remark}` measureData.data.uuid = `${measureData.instanceId}-${measureData.data.remark}`
} else { } else {
this.$set(this.questionForm, 'IsDicomReading', true) this.$set(this.questionForm, 'IsDicomReading', true)
const lesionState = this.getQuestionVal(7)
// 线 // 线
if (this.isBaseLineTask && !lesionState) { if (this.isBaseLineTask && !lesionState) {
const stateId = this.getQuestionId(7) const stateId = this.getQuestionId(7)
@ -810,7 +810,7 @@ export default {
if (this.lesionType === 0) { if (this.lesionType === 0) {
this.calculatePPD() this.calculatePPD()
} }
const lesionState = this.getQuestionVal(7)
var status = '' var status = ''
if (lesionState) { if (lesionState) {
if (this.lesionType === 0 && lesionState === 1) { if (this.lesionType === 0 && lesionState === 1) {

View File

@ -645,7 +645,7 @@ export default {
measureData.data.uuid = `${measureData.instanceId}-${measureData.data.remark}` measureData.data.uuid = `${measureData.instanceId}-${measureData.data.remark}`
} else { } else {
this.$set(this.questionForm, 'IsDicomReading', true) this.$set(this.questionForm, 'IsDicomReading', true)
const lesionState = this.getQuestionVal(7)
// 线 // 线
if (this.isBaseLineTask && !lesionState) { if (this.isBaseLineTask && !lesionState) {
const stateId = this.getQuestionId(7) const stateId = this.getQuestionId(7)
@ -673,7 +673,7 @@ export default {
} }
} }
const lesionState = this.getQuestionVal(7)
var status = '' var status = ''
if (lesionState) { if (lesionState) {
if (this.lesionType === 0 && lesionState === 1) { if (this.lesionType === 0 && lesionState === 1) {

View File

@ -571,6 +571,7 @@ export default {
measureData.data.uuid = `${measureData.instanceId}-${measureData.data.remark}` measureData.data.uuid = `${measureData.instanceId}-${measureData.data.remark}`
} else { } else {
this.$set(this.questionForm, 'IsDicomReading', true) this.$set(this.questionForm, 'IsDicomReading', true)
const lesionState = this.getQuestionVal(7)
// 线 // 线
if (this.isBaseLineTask && !lesionState) { if (this.isBaseLineTask && !lesionState) {
const stateId = this.getQuestionId(7) const stateId = this.getQuestionId(7)
@ -599,7 +600,7 @@ export default {
} }
} }
const lesionState = this.getQuestionVal(7)
var status = '' var status = ''
if (lesionState) { if (lesionState) {
if (this.lesionType === 0 && lesionState === 1) { if (this.lesionType === 0 && lesionState === 1) {

View File

@ -1,76 +1,347 @@
<template> <template>
<div v-loading="loading" class="reading-viewer-container"> <div ref="container" v-loading="loading" class="none-dicom-reading-container">
<!-- 访视阅片 --> <!-- 访视阅片 -->
<visit-review v-if="taskInfo && taskInfo.ReadingCategory=== 1" /> <div v-if="isShow && readingCategory && readingCategory=== 1" class="reading-wrapper">
<el-tabs v-model="activeName" :before-leave="beforeLeave">
<!-- 阅片 -->
<el-tab-pane :label="$t('trials:reading:tabTitle:review')" name="read">
<VisitReview
:trial-id="trialId"
:subject-id="subjectId"
:subject-code="subjectCode"
:visit-task-id="visitTaskId"
:task-blind-name="taskBlindName"
:reading-category="readingCategory"
:readingTool="readingTool"
:criterionType="criterionType"
:isExistsClinicalData="isExistsClinicalData"
:isReadingShowSubjectInfo="isReadingShowSubjectInfo"
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
:iseCRFShowInDicomReading="iseCRFShowInDicomReading"
@previewCD="previewCD"
/>
</el-tab-pane>
<!-- 报告 -->
<el-tab-pane :label="$t('trials:reading:tabTitle:report')" name="report" v-if="!iseCRFShowInDicomReading">
<Report
v-if="tabs.includes('report')"
ref="reportPage"
:trialId="trialId"
:visit-task-id="visitTaskId"
:subject-id="subjectId"
:readingTool="readingTool"
:criterionType="criterionType"
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
/>
</el-tab-pane>
</el-tabs>
</div>
<!-- 全局阅片 --> <!-- 全局阅片 -->
<global-review v-else-if="taskInfo && taskInfo.ReadingCategory=== 2" /> <GlobalReview
v-else-if="isShow && readingCategory && readingCategory === 2"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="visitTaskId"
:reading-category="readingCategory"
:subject-code="subjectCode"
:task-blind-name="taskBlindName"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-show-previous-results="isReadingShowPreviousResults"
:is-exists-clinical-data="isExistsClinicalData"
/>
<!-- 裁判阅片 --> <!-- 裁判阅片 -->
<ad-review v-else-if="taskInfo && taskInfo.ReadingCategory=== 4" /> <AdReview
v-else-if="isShow && readingCategory && readingCategory === 4"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="visitTaskId"
:reading-category="readingCategory"
:subject-code="subjectCode"
:task-blind-name="taskBlindName"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-show-previous-results="isReadingShowPreviousResults"
:is-exists-clinical-data="isExistsClinicalData"
/>
<!-- 肿瘤学阅片 --> <!-- 肿瘤学阅片 -->
<oncology-review v-else-if="taskInfo && taskInfo.ReadingCategory=== 5" /> <OncologyReview
v-else-if="isShow && readingCategory && readingCategory === 5"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="visitTaskId"
:reading-category="readingCategory"
:subject-code="subjectCode"
:task-blind-name="taskBlindName"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-show-previous-results="isReadingShowPreviousResults"
:is-exists-clinical-data="isExistsClinicalData"
/>
<el-dialog
:visible.sync="dialogVisible"
:custom-class="isFullscreen?'full-dialog-container':'dialog-container'"
:show-close="false"
:close-on-click-modal="false"
:fullscreen="isFullscreen"
>
<span slot="title" class="dialog-footer">
<!-- 当前阅片任务存在临床数据请查看若已查看请点击确认 -->
<span v-if="!closeCDVisible">{{ $t('trials:reading:dagTitle:msg1') }}</span>
<div style="position: absolute;right: 20px;top: 10px;">
<svg-icon :icon-class="isFullscreen?'exit-fullscreen':'fullscreen'" style="cursor: pointer;font-size: 20px;" @click="isFullscreen=!isFullscreen" />
<svg-icon v-if="closeCDVisible" icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;" @click="dialogVisible = false" />
</div>
</span>
<div style="height: 100%;margin:0;display: flex;flex-direction: column;">
<ClinicalData
v-if="dialogVisible"
style="flex: 1"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="cdVisitTaskId"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
/>
<div v-if="!closeCDVisible" style="text-align:right">
<el-button type="primary" @click="handleConfirmCD">{{ $t('trials:reading:button:confirm') }}</el-button>
</div>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { getNextTask } from '@/api/trials' import { getNextTask, readClinicalData } from '@/api/trials'
import store from '@/store' import store from '@/store'
import VisitReview from '@/views/trials/trials-panel/reading/visit-review' import { changeURLStatic } from '@/utils/history.js'
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
import Report from './components/Report'
import VisitReview from './components/VisitReview'
import GlobalReview from '@/views/trials/trials-panel/reading/global-review' import GlobalReview from '@/views/trials/trials-panel/reading/global-review'
import AdReview from '@/views/trials/trials-panel/reading/ad-review' import AdReview from '@/views/trials/trials-panel/reading/ad-review'
import ClinicalData from '@/views/trials/trials-panel/reading/clinical-data'
// import { getToken } from '@/utils/auth'
import OncologyReview from '@/views/trials/trials-panel/reading/oncology-review' import OncologyReview from '@/views/trials/trials-panel/reading/oncology-review'
export default { export default {
name: 'ReadingViewer', name: 'NoneDicomReading',
components: { components: {
VisitReview, VisitReview,
GlobalReview, Report,
AdReview, AdReview,
OncologyReview GlobalReview,
OncologyReview,
ClinicalData
}, },
data() { data() {
return { return {
taskInfo: null, loading: false,
loading: false readingCategory: null,
subjectId: '',
visitTaskId: '',
trialId: '',
subjectCode: '',
taskBlindName: '',
isReadingShowSubjectInfo: false,
isReadingShowPreviousResults: false,
isReadingTaskViewInOrder: false,
isExistsClinicalData: false,
isNeedReadClinicalData: false,
isReadClinicalData: false,
iseCRFShowInDicomReading: false,
criterionType: null,
readingTool: null,
isNewSubject: null,
dialogVisible: false,
closeCDVisible: false,
cdVisitTaskId: '',
isFullscreen: false,
// dialogH: 0,
isShow: false,
activeName:'',
tabs: []
} }
}, },
mounted() { mounted() {
DicomEvent.$on('getNextTask', () => {
this.getTaskInfo()
})
this.trialId = this.$router.currentRoute.query.trialId
this.subjectCode = this.$router.currentRoute.query.subjectCode
this.subjectId = this.$router.currentRoute.query.subjectId
this.visitTaskId = this.$router.currentRoute.query.visitTaskId
this.isReadingShowSubjectInfo = this.$router.currentRoute.query.isReadingShowSubjectInfo
this.isReadingShowPreviousResults = this.$router.currentRoute.query.isReadingShowPreviousResults
this.isReadingTaskViewInOrder = JSON.parse(this.$router.currentRoute.query.isReadingTaskViewInOrder)
this.criterionType = this.$router.currentRoute.query.criterionType
this.readingTool = this.$router.currentRoute.query.readingTool
this.isNewSubject = this.$router.currentRoute.query.isNewSubject
if (this.isNewSubject && this.isReadingTaskViewInOrder) {
const message = this.$t('trials:reading:noneDicom:message:startRead').replace('xxx', this.subjectCode)
this.$message.success(message)
changeURLStatic('isNewSubject', '')
}
if (this.$router.currentRoute.query.TokenKey) {
store.dispatch('user/setToken', this.$router.currentRoute.query.TokenKey)
changeURLStatic('TokenKey', '')
}
this.getTaskInfo() this.getTaskInfo()
this.dialogH = this.$refs['container'].clientHeight - 250 + 'px'
window.addEventListener('resize', () => { this.dialogH = this.$refs['container'].clientHeight - 250 + 'px' })
},
beforeDestroy() {
DicomEvent.$off('getNextTask')
}, },
methods: { methods: {
async getTaskInfo() { getTaskInfo() {
this.loading = true this.loading = true
try { var param = {
const params = { subjectId: this.subjectId,
subjectId: this.$route.query.subjectId, trialId: this.trialId,
trialId: this.$route.query.trialId, subjectCode: this.subjectCode,
subjectCode: this.$route.query.subjectCode, visitTaskId: this.$router.currentRoute.query.visitTaskId,
visitTaskId: this.$route.query.visitTaskId, trialReadingCriterionId: this.$router.currentRoute.query.TrialReadingCriterionId
trialReadingCriterionId: this.$route.query.TrialReadingCriterionId }
} this.isShow = false
const res = await getNextTask(params) getNextTask(param).then(res => {
this.taskInfo = res.Result this.readingCategory = res.Result.ReadingCategory
localStorage.setItem('taskInfo', JSON.stringify(res.Result)) // if (this.subjectId !== res.Result.SubjectId && this.isReadingTaskViewInOrder) {
// if (res.Result.IsExistsClinicalData && res.Result.IsNeedReadClinicalData && !res.Result.IsReadClinicalData) { // store.dispatch('reading/resetVisitTasks')
// this.isFullscreen = false // var token = getToken()
// this.dialogVisible = true // window.location.href = `/noneDicomReading?trialId=${this.trialId}&subjectCode=${res.Result.SubjectCode}&subjectId=${res.Result.SubjectId}&isReadingShowPreviousResults=${this.isReadingShowPreviousResults}&isReadingShowSubjectInfo=${this.isReadingShowSubjectInfo}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&isNewSubject=1&isReadingTaskViewInOrder=${res.Result.IsReadingTaskViewInOrder}&TokenKey=${token}`
// this.cdVisitTaskId = res.Result.visitTaskId
// } // }
// this.$nextTick(() => { if (res.Result.ReadingCategory === 1) {
// if (res.Result.IsFirstChangeTask && res.Result.ReadingTaskState === 0) { this.activeName = 'read'
// this.tipVisible = true this.tabs = [this.activeName]
// } }
// }) this.subjectId = res.Result.SubjectId
this.visitTaskId = res.Result.VisitTaskId
this.subjectCode = res.Result.SubjectCode
this.taskBlindName = res.Result.TaskBlindName
this.isExistsClinicalData = res.Result.IsExistsClinicalData
this.isReadClinicalData = res.Result.IsReadClinicalData
this.isNeedReadClinicalData = res.Result.IsNeedReadClinicalData
this.iseCRFShowInDicomReading = res.Result.IseCRFShowInDicomReading
this.isReadingTaskViewInOrder = res.Result.IsReadingTaskViewInOrder
this.isReadingShowSubjectInfo = res.Result.IsReadingShowSubjectInfo
this.isReadingShowPreviousResults = res.Result.IsReadingShowPreviousResults
this.digitPlaces = res.Result.DigitPlaces
localStorage.setItem('digitPlaces', 2)
this.$nextTick(() => {
if (this.isExistsClinicalData && this.isNeedReadClinicalData && !this.isReadClinicalData) {
this.isFullscreen = false
this.dialogVisible = true
this.cdVisitTaskId = this.visitTaskId
}
})
this.isShow = true
this.loading = false this.loading = false
}).catch(() => { this.loading = false })
},
previewCD(taskId) {
this.closeCDVisible = true
this.isFullscreen = false
this.dialogVisible = true
this.cdVisitTaskId = taskId
this.dialogVisible = true
},
async handleConfirmCD() {
this.loading = true
var visitTaskId = this.visitTaskId
try {
await readClinicalData({ visitTaskId })
this.loading = false
this.dialogVisible = false
this.isReadClinicalData = true
} catch (e) { } catch (e) {
console.log(e)
store.dispatch('reading/setCurrentReadingTaskState', 2)
this.loading = false this.loading = false
} }
} },
beforeLeave(activeName, oldActiveName) {
if (!this.tabs.includes(activeName)) {
this.tabs.push(activeName)
}
if (oldActiveName === 'read') {
this.$nextTick(() => {
if (this.$refs.reportPage) {
// DicomEvent.$emit('getReportInfo', true)
this.$refs.reportPage.setScrollTop(1)
}
})
}
return Promise.resolve(true)
},
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.reading-viewer-container { .none-dicom-reading-container{
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex;
flex-direction: column;
.el-dialog{
margin-top: 0px !important;
::v-deep .el-dialog__wrapper{
margin-top: 0px !important;
}
::v-deep .el-dialog__body{
padding: 10px;
}
}
.reading-wrapper{
width: 100%;
height: 100%;
padding: 0 10px;
box-sizing: border-box;
::v-deep.el-tabs{
box-sizing: border-box;
height: 100%;
display: flex;
flex-direction: column;
.el-tabs__item{
// color: #fff;
}
.el-tabs__header{
height: 50px;
margin:0px;
box-sizing: border-box;
}
.el-tabs__content{
flex: 1;
margin:0px;
box-sizing: border-box;
}
.el-tabs__item{
// color: #fff;
}
.el-tab-pane{
height: 100%;
}
}
}
::v-deep.dialog-container{
margin-top: 50px !important;
width:75%;
height:80%;
}
::v-deep.el-dialog__body{
padding: 20px 20px 0 20px;
height: calc(100% - 70px);
}
.el-dialog__header{
position: relative;
}
} }
.full-dialog-container{
::v-deep.is-fullscreen .el-dialog__body{
height: calc(100% - 70px);
}
}
</style> </style>

View File

@ -1,347 +1,76 @@
<template> <template>
<div ref="container" v-loading="loading" class="none-dicom-reading-container"> <div v-loading="loading" class="reading-viewer-container">
<!-- 访视阅片 --> <!-- 访视阅片 -->
<div v-if="isShow && readingCategory && readingCategory=== 1" class="reading-wrapper"> <visit-review v-if="taskInfo && taskInfo.ReadingCategory=== 1" />
<el-tabs v-model="activeName" :before-leave="beforeLeave">
<!-- 阅片 -->
<el-tab-pane :label="$t('trials:reading:tabTitle:review')" name="read">
<VisitReview
:trial-id="trialId"
:subject-id="subjectId"
:subject-code="subjectCode"
:visit-task-id="visitTaskId"
:task-blind-name="taskBlindName"
:reading-category="readingCategory"
:readingTool="readingTool"
:criterionType="criterionType"
:isExistsClinicalData="isExistsClinicalData"
:isReadingShowSubjectInfo="isReadingShowSubjectInfo"
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
:iseCRFShowInDicomReading="iseCRFShowInDicomReading"
@previewCD="previewCD"
/>
</el-tab-pane>
<!-- 报告 -->
<el-tab-pane :label="$t('trials:reading:tabTitle:report')" name="report" v-if="!iseCRFShowInDicomReading">
<Report
v-if="tabs.includes('report')"
ref="reportPage"
:trialId="trialId"
:visit-task-id="visitTaskId"
:subject-id="subjectId"
:readingTool="readingTool"
:criterionType="criterionType"
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
/>
</el-tab-pane>
</el-tabs>
</div>
<!-- 全局阅片 --> <!-- 全局阅片 -->
<GlobalReview <global-review v-else-if="taskInfo && taskInfo.ReadingCategory=== 2" />
v-else-if="isShow && readingCategory && readingCategory === 2"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="visitTaskId"
:reading-category="readingCategory"
:subject-code="subjectCode"
:task-blind-name="taskBlindName"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-show-previous-results="isReadingShowPreviousResults"
:is-exists-clinical-data="isExistsClinicalData"
/>
<!-- 裁判阅片 --> <!-- 裁判阅片 -->
<AdReview <ad-review v-else-if="taskInfo && taskInfo.ReadingCategory=== 4" />
v-else-if="isShow && readingCategory && readingCategory === 4"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="visitTaskId"
:reading-category="readingCategory"
:subject-code="subjectCode"
:task-blind-name="taskBlindName"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-show-previous-results="isReadingShowPreviousResults"
:is-exists-clinical-data="isExistsClinicalData"
/>
<!-- 肿瘤学阅片 --> <!-- 肿瘤学阅片 -->
<OncologyReview <oncology-review v-else-if="taskInfo && taskInfo.ReadingCategory=== 5" />
v-else-if="isShow && readingCategory && readingCategory === 5"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="visitTaskId"
:reading-category="readingCategory"
:subject-code="subjectCode"
:task-blind-name="taskBlindName"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-show-previous-results="isReadingShowPreviousResults"
:is-exists-clinical-data="isExistsClinicalData"
/>
<el-dialog
:visible.sync="dialogVisible"
:custom-class="isFullscreen?'full-dialog-container':'dialog-container'"
:show-close="false"
:close-on-click-modal="false"
:fullscreen="isFullscreen"
>
<span slot="title" class="dialog-footer">
<!-- 当前阅片任务存在临床数据请查看若已查看请点击确认 -->
<span v-if="!closeCDVisible">{{ $t('trials:reading:dagTitle:msg1') }}</span>
<div style="position: absolute;right: 20px;top: 10px;">
<svg-icon :icon-class="isFullscreen?'exit-fullscreen':'fullscreen'" style="cursor: pointer;font-size: 20px;" @click="isFullscreen=!isFullscreen" />
<svg-icon v-if="closeCDVisible" icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;" @click="dialogVisible = false" />
</div>
</span>
<div style="height: 100%;margin:0;display: flex;flex-direction: column;">
<ClinicalData
v-if="dialogVisible"
style="flex: 1"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="cdVisitTaskId"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
/>
<div v-if="!closeCDVisible" style="text-align:right">
<el-button type="primary" @click="handleConfirmCD">{{ $t('trials:reading:button:confirm') }}</el-button>
</div>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { getNextTask, readClinicalData } from '@/api/trials' import { getNextTask } from '@/api/trials'
import store from '@/store' import store from '@/store'
import { changeURLStatic } from '@/utils/history.js' import VisitReview from '@/views/trials/trials-panel/reading/visit-review'
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
import Report from './components/Report'
import VisitReview from './components/VisitReview'
import GlobalReview from '@/views/trials/trials-panel/reading/global-review' import GlobalReview from '@/views/trials/trials-panel/reading/global-review'
import AdReview from '@/views/trials/trials-panel/reading/ad-review' import AdReview from '@/views/trials/trials-panel/reading/ad-review'
import ClinicalData from '@/views/trials/trials-panel/reading/clinical-data'
// import { getToken } from '@/utils/auth'
import OncologyReview from '@/views/trials/trials-panel/reading/oncology-review' import OncologyReview from '@/views/trials/trials-panel/reading/oncology-review'
export default { export default {
name: 'NoneDicomReading', name: 'ReadingViewer',
components: { components: {
VisitReview, VisitReview,
Report,
AdReview,
GlobalReview, GlobalReview,
OncologyReview, AdReview,
ClinicalData OncologyReview
}, },
data() { data() {
return { return {
loading: false, taskInfo: null,
readingCategory: null, loading: false
subjectId: '',
visitTaskId: '',
trialId: '',
subjectCode: '',
taskBlindName: '',
isReadingShowSubjectInfo: false,
isReadingShowPreviousResults: false,
isReadingTaskViewInOrder: false,
isExistsClinicalData: false,
isNeedReadClinicalData: false,
isReadClinicalData: false,
iseCRFShowInDicomReading: false,
criterionType: null,
readingTool: null,
isNewSubject: null,
dialogVisible: false,
closeCDVisible: false,
cdVisitTaskId: '',
isFullscreen: false,
// dialogH: 0,
isShow: false,
activeName:'',
tabs: []
} }
}, },
mounted() { mounted() {
DicomEvent.$on('getNextTask', () => {
this.getTaskInfo()
})
this.trialId = this.$router.currentRoute.query.trialId
this.subjectCode = this.$router.currentRoute.query.subjectCode
this.subjectId = this.$router.currentRoute.query.subjectId
this.visitTaskId = this.$router.currentRoute.query.visitTaskId
this.isReadingShowSubjectInfo = this.$router.currentRoute.query.isReadingShowSubjectInfo
this.isReadingShowPreviousResults = this.$router.currentRoute.query.isReadingShowPreviousResults
this.isReadingTaskViewInOrder = JSON.parse(this.$router.currentRoute.query.isReadingTaskViewInOrder)
this.criterionType = this.$router.currentRoute.query.criterionType
this.readingTool = this.$router.currentRoute.query.readingTool
this.isNewSubject = this.$router.currentRoute.query.isNewSubject
if (this.isNewSubject && this.isReadingTaskViewInOrder) {
const message = this.$t('trials:reading:noneDicom:message:startRead').replace('xxx', this.subjectCode)
this.$message.success(message)
changeURLStatic('isNewSubject', '')
}
if (this.$router.currentRoute.query.TokenKey) {
store.dispatch('user/setToken', this.$router.currentRoute.query.TokenKey)
changeURLStatic('TokenKey', '')
}
this.getTaskInfo() this.getTaskInfo()
this.dialogH = this.$refs['container'].clientHeight - 250 + 'px'
window.addEventListener('resize', () => { this.dialogH = this.$refs['container'].clientHeight - 250 + 'px' })
},
beforeDestroy() {
DicomEvent.$off('getNextTask')
}, },
methods: { methods: {
getTaskInfo() { async getTaskInfo() {
this.loading = true this.loading = true
var param = {
subjectId: this.subjectId,
trialId: this.trialId,
subjectCode: this.subjectCode,
visitTaskId: this.$router.currentRoute.query.visitTaskId,
trialReadingCriterionId: this.$router.currentRoute.query.TrialReadingCriterionId
}
this.isShow = false
getNextTask(param).then(res => {
this.readingCategory = res.Result.ReadingCategory
// if (this.subjectId !== res.Result.SubjectId && this.isReadingTaskViewInOrder) {
// store.dispatch('reading/resetVisitTasks')
// var token = getToken()
// window.location.href = `/noneDicomReading?trialId=${this.trialId}&subjectCode=${res.Result.SubjectCode}&subjectId=${res.Result.SubjectId}&isReadingShowPreviousResults=${this.isReadingShowPreviousResults}&isReadingShowSubjectInfo=${this.isReadingShowSubjectInfo}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&isNewSubject=1&isReadingTaskViewInOrder=${res.Result.IsReadingTaskViewInOrder}&TokenKey=${token}`
// }
if (res.Result.ReadingCategory === 1) {
this.activeName = 'read'
this.tabs = [this.activeName]
}
this.subjectId = res.Result.SubjectId
this.visitTaskId = res.Result.VisitTaskId
this.subjectCode = res.Result.SubjectCode
this.taskBlindName = res.Result.TaskBlindName
this.isExistsClinicalData = res.Result.IsExistsClinicalData
this.isReadClinicalData = res.Result.IsReadClinicalData
this.isNeedReadClinicalData = res.Result.IsNeedReadClinicalData
this.iseCRFShowInDicomReading = res.Result.IseCRFShowInDicomReading
this.isReadingTaskViewInOrder = res.Result.IsReadingTaskViewInOrder
this.isReadingShowSubjectInfo = res.Result.IsReadingShowSubjectInfo
this.isReadingShowPreviousResults = res.Result.IsReadingShowPreviousResults
this.digitPlaces = res.Result.DigitPlaces
localStorage.setItem('digitPlaces', 2)
this.$nextTick(() => {
if (this.isExistsClinicalData && this.isNeedReadClinicalData && !this.isReadClinicalData) {
this.isFullscreen = false
this.dialogVisible = true
this.cdVisitTaskId = this.visitTaskId
}
})
this.isShow = true
this.loading = false
}).catch(() => { this.loading = false })
},
previewCD(taskId) {
this.closeCDVisible = true
this.isFullscreen = false
this.dialogVisible = true
this.cdVisitTaskId = taskId
this.dialogVisible = true
},
async handleConfirmCD() {
this.loading = true
var visitTaskId = this.visitTaskId
try { try {
await readClinicalData({ visitTaskId }) const params = {
subjectId: this.$route.query.subjectId,
trialId: this.$route.query.trialId,
subjectCode: this.$route.query.subjectCode,
visitTaskId: this.$route.query.visitTaskId,
trialReadingCriterionId: this.$route.query.TrialReadingCriterionId
}
const res = await getNextTask(params)
this.taskInfo = res.Result
localStorage.setItem('taskInfo', JSON.stringify(res.Result))
// if (res.Result.IsExistsClinicalData && res.Result.IsNeedReadClinicalData && !res.Result.IsReadClinicalData) {
// this.isFullscreen = false
// this.dialogVisible = true
// this.cdVisitTaskId = res.Result.visitTaskId
// }
// this.$nextTick(() => {
// if (res.Result.IsFirstChangeTask && res.Result.ReadingTaskState === 0) {
// this.tipVisible = true
// }
// })
this.loading = false this.loading = false
this.dialogVisible = false
this.isReadClinicalData = true
} catch (e) { } catch (e) {
console.log(e)
store.dispatch('reading/setCurrentReadingTaskState', 2)
this.loading = false this.loading = false
} }
}, }
beforeLeave(activeName, oldActiveName) {
if (!this.tabs.includes(activeName)) {
this.tabs.push(activeName)
}
if (oldActiveName === 'read') {
this.$nextTick(() => {
if (this.$refs.reportPage) {
// DicomEvent.$emit('getReportInfo', true)
this.$refs.reportPage.setScrollTop(1)
}
})
}
return Promise.resolve(true)
},
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.none-dicom-reading-container{ .reading-viewer-container {
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex;
flex-direction: column;
.el-dialog{
margin-top: 0px !important;
::v-deep .el-dialog__wrapper{
margin-top: 0px !important;
}
::v-deep .el-dialog__body{
padding: 10px;
}
}
.reading-wrapper{
width: 100%;
height: 100%;
padding: 0 10px;
box-sizing: border-box;
::v-deep.el-tabs{
box-sizing: border-box;
height: 100%;
display: flex;
flex-direction: column;
.el-tabs__item{
// color: #fff;
}
.el-tabs__header{
height: 50px;
margin:0px;
box-sizing: border-box;
}
.el-tabs__content{
flex: 1;
margin:0px;
box-sizing: border-box;
}
.el-tabs__item{
// color: #fff;
}
.el-tab-pane{
height: 100%;
}
}
}
::v-deep.dialog-container{
margin-top: 50px !important;
width:75%;
height:80%;
}
::v-deep.el-dialog__body{
padding: 20px 20px 0 20px;
height: calc(100% - 70px);
}
.el-dialog__header{
position: relative;
}
} }
.full-dialog-container{
::v-deep.is-fullscreen .el-dialog__body{
height: calc(100% - 70px);
}
}
</style> </style>

View File

@ -51,11 +51,18 @@
<!-- 自由曲线 --> <!-- 自由曲线 -->
<div <div
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'PlanarFreehandROI' ? 'tool-item-active' : '']" :class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'PlanarFreehandROI' ? 'tool-item-active' : '']"
:title="$t('trials:dicom-show:Eraser')" :title="$t('trials:reading:button:planarFreehandROI')"
@click.prevent="setAnnotateToolActive('PlanarFreehandROI')" @click.prevent="setAnnotateToolActive('PlanarFreehandROI')"
> >
<svg-icon icon-class="polygon" class="svg-icon" /> <svg-icon icon-class="polygon" class="svg-icon" />
</div> </div>
<div
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '', activeTool === 'Eraser' ? 'tool-item-active' : '']"
:title="$t('trials:dicom-show:Eraser')"
@click.prevent="setAnnotateToolActive('Eraser')"
>
<svg-icon icon-class="clear" class="svg-icon" />
</div>
<!-- 截图 --> <!-- 截图 -->
<!-- <div <!-- <div
class="tool-item" class="tool-item"
@ -357,7 +364,10 @@ export default {
return doneChangingTextCallback(await this.customPrompt()) return doneChangingTextCallback(await this.customPrompt())
} }
}) })
toolGroup.addTool(PlanarFreehandROITool.toolName) toolGroup.addTool(PlanarFreehandROITool.toolName, {
allowOpenContours: false
// cachedStats: false
})
toolGroup.addTool(EraserTool.toolName) toolGroup.addTool(EraserTool.toolName)
toolGroup.setToolActive(StackScrollTool.toolName, { toolGroup.setToolActive(StackScrollTool.toolName, {
bindings: [{ mouseButton: MouseBindings.Wheel }] bindings: [{ mouseButton: MouseBindings.Wheel }]
@ -675,6 +685,7 @@ export default {
const { annotation } = e.detail const { annotation } = e.detail
if (!annotation) return if (!annotation) return
if (!annotation.annotationId) return if (!annotation.annotationId) return
if (!annotation.data.contour.closed) return
const i = this.viewportInfos.findIndex(i => i.index === this.activeCanvasIndex) const i = this.viewportInfos.findIndex(i => i.index === this.activeCanvasIndex)
if (i === -1) return if (i === -1) return
if (this.viewportInfos[i].taskInfo.VisitTaskId !== this.taskInfo.VisitTaskId) return if (this.viewportInfos[i].taskInfo.VisitTaskId !== this.taskInfo.VisitTaskId) return
@ -693,13 +704,14 @@ export default {
} }
await addNoneDicomMark(params) await addNoneDicomMark(params)
// //
this.$message.success(this.$t('common:message:savedSuccessfully')) // this.$message.success(this.$t('common:message:savedSuccessfully'))
}, },
async annotationCompletedListener(e) { async annotationCompletedListener(e) {
console.log('Completed') console.log('Completed')
if (this.readingTaskState === 2) return if (this.readingTaskState === 2) return
const { annotation } = e.detail const { annotation } = e.detail
if (!annotation) return if (!annotation) return
if (!annotation.data.contour.closed) return
const i = this.viewportInfos.findIndex(i => i.index === this.activeCanvasIndex) const i = this.viewportInfos.findIndex(i => i.index === this.activeCanvasIndex)
if (i === -1) return if (i === -1) return
if (this.viewportInfos[i].taskInfo.VisitTaskId !== this.taskInfo.VisitTaskId) return if (this.viewportInfos[i].taskInfo.VisitTaskId !== this.taskInfo.VisitTaskId) return
@ -719,7 +731,7 @@ export default {
const res = await addNoneDicomMark(params) const res = await addNoneDicomMark(params)
annotation.annotationId = res.Result annotation.annotationId = res.Result
// //
this.$message.success(this.$t('common:message:savedSuccessfully')) // this.$message.success(this.$t('common:message:savedSuccessfully'))
}, },
debounce(callback, delay) { debounce(callback, delay) {
let timerId let timerId

View File

@ -44,7 +44,7 @@ export default function hardcodedMetaDataProvider(type, imageId, imageIds) {
columnCosines: [0, 1, 0], columnCosines: [0, 1, 0],
// setting useDefaultValues to true signals the calibration values above cannot be trusted // setting useDefaultValues to true signals the calibration values above cannot be trusted
// and units should be displayed in pixels // and units should be displayed in pixels
usingDefaultValues: true usingDefaultValues: false
} }
return imagePlaneModule return imagePlaneModule