阅片界面及oss配置更新
parent
c08082190b
commit
182e9779d4
|
@ -400,7 +400,7 @@ export default {
|
||||||
this.dicomInfo.zoom = viewport.scale.toFixed(4)
|
this.dicomInfo.zoom = viewport.scale.toFixed(4)
|
||||||
var data = e.detail.image.data
|
var data = e.detail.image.data
|
||||||
const position = data.string('x00201041')
|
const position = data.string('x00201041')
|
||||||
this.dicomInfo.location = parseFloat(position).toFixed(2)
|
this.dicomInfo.location = position
|
||||||
},
|
},
|
||||||
getOrientationMarker(element) {
|
getOrientationMarker(element) {
|
||||||
const enabledElement = cornerstone.getEnabledElement(element)
|
const enabledElement = cornerstone.getEnabledElement(element)
|
||||||
|
|
|
@ -113,9 +113,9 @@
|
||||||
<div ref="dicomTools" class="dicom-tools">
|
<div ref="dicomTools" class="dicom-tools">
|
||||||
<!-- 布局 -->
|
<!-- 布局 -->
|
||||||
<div class="measureTool-wrapper">
|
<div class="measureTool-wrapper">
|
||||||
<div class="sideTool-title">{{$t('trials:reading:button:layout')}}</div>
|
<div class="sideTool-title">{{ $t('trials:reading:button:layout') }}</div>
|
||||||
<div class="sideTool-wrapper">
|
<div class="sideTool-wrapper">
|
||||||
<label>{{$t('trials:reading:button:layout')}}:</label>
|
<label>{{ $t('trials:reading:button:layout') }}:</label>
|
||||||
<select class="sidetool-select" style="width:90px" @change="changeLayout($event)">
|
<select class="sidetool-select" style="width:90px" @change="changeLayout($event)">
|
||||||
<option value="1x1" selected>1x1</option>
|
<option value="1x1" selected>1x1</option>
|
||||||
<option value="1x2">1x2</option>
|
<option value="1x2">1x2</option>
|
||||||
|
@ -131,7 +131,7 @@
|
||||||
</div>
|
</div>
|
||||||
<!-- 图像变换 -->
|
<!-- 图像变换 -->
|
||||||
<div class="measureTool-wrapper">
|
<div class="measureTool-wrapper">
|
||||||
<div class="sideTool-title">{{$t('trials:dicom-show:transform')}}</div>
|
<div class="sideTool-title">{{ $t('trials:dicom-show:transform') }}</div>
|
||||||
<div class="sideTool-wrapper">
|
<div class="sideTool-wrapper">
|
||||||
<button
|
<button
|
||||||
:title="$t('trials:reading:button:wwwc')"
|
:title="$t('trials:reading:button:wwwc')"
|
||||||
|
@ -236,7 +236,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="measureTool-wrapper">
|
<div class="measureTool-wrapper">
|
||||||
<!-- 播放 -->
|
<!-- 播放 -->
|
||||||
<div class="sideTool-title">{{$t('trials:dicom-show:play')}}</div>
|
<div class="sideTool-title">{{ $t('trials:dicom-show:play') }}</div>
|
||||||
<div class="sideTool-wrapper">
|
<div class="sideTool-wrapper">
|
||||||
<!-- 第一帧 -->
|
<!-- 第一帧 -->
|
||||||
<button class="btn-link" :title="$t('trials:dicom-show:firstframe')" @click="currentDicomCanvas.scrollPage(-9999)">
|
<button class="btn-link" :title="$t('trials:dicom-show:firstframe')" @click="currentDicomCanvas.scrollPage(-9999)">
|
||||||
|
@ -263,7 +263,7 @@
|
||||||
</button>
|
</button>
|
||||||
<select class="sidetool-select" style="width:60px" @change="setDicomCanvasfps($event)">
|
<select class="sidetool-select" style="width:60px" @change="setDicomCanvasfps($event)">
|
||||||
<!-- 默认值 -->
|
<!-- 默认值 -->
|
||||||
<option :value="10">{{$t('trials:dicom-show:default')}}</option>
|
<option :value="10">{{ $t('trials:dicom-show:default') }}</option>
|
||||||
<option :value="15">15</option>
|
<option :value="15">15</option>
|
||||||
<option :value="20">20</option>
|
<option :value="20">20</option>
|
||||||
<option :value="30">30</option>
|
<option :value="30">30</option>
|
||||||
|
@ -275,7 +275,7 @@
|
||||||
<div class="sideTool-title">{{ $t('trials:dicom-show:color') }}</div>
|
<div class="sideTool-title">{{ $t('trials:dicom-show:color') }}</div>
|
||||||
<div class="sideTool-wrapper">
|
<div class="sideTool-wrapper">
|
||||||
<!-- 预设窗位值 -->
|
<!-- 预设窗位值 -->
|
||||||
<label>{{$t('trials:dicom-show:dicomCanvasWwwc')}}:</label>
|
<label>{{ $t('trials:dicom-show:dicomCanvasWwwc') }}:</label>
|
||||||
<select
|
<select
|
||||||
v-model="wwwcList[currentDicomCanvasIndex]"
|
v-model="wwwcList[currentDicomCanvasIndex]"
|
||||||
class="sidetool-select"
|
class="sidetool-select"
|
||||||
|
@ -283,11 +283,11 @@
|
||||||
@change="setDicomCanvasWwwc($event)"
|
@change="setDicomCanvasWwwc($event)"
|
||||||
>
|
>
|
||||||
<!-- 默认值 -->
|
<!-- 默认值 -->
|
||||||
<option :value="-1">{{$t('trials:dicom-show:default')}}</option>
|
<option :value="-1">{{ $t('trials:dicom-show:default') }}</option>
|
||||||
<!-- 自定义 -->
|
<!-- 自定义 -->
|
||||||
<option :value="0">{{$t('trials:dicom-show:custom')}}</option>
|
<option :value="0">{{ $t('trials:dicom-show:custom') }}</option>
|
||||||
<!-- 区域窗宽 -->
|
<!-- 区域窗宽 -->
|
||||||
<option :value="1" style="border-bottom:1px solid #fff;">{{$t('trials:reading:button:wwwcRegion')}}</option>
|
<option :value="1" style="border-bottom:1px solid #fff;">{{ $t('trials:reading:button:wwwcRegion') }}</option>
|
||||||
<option :value="2">
|
<option :value="2">
|
||||||
CT Abdomen
|
CT Abdomen
|
||||||
</option>
|
</option>
|
||||||
|
@ -319,7 +319,7 @@
|
||||||
@change="setColormap($event)"
|
@change="setColormap($event)"
|
||||||
>
|
>
|
||||||
<!-- 默认值 -->
|
<!-- 默认值 -->
|
||||||
<option value>{{$t('trials:dicom-show:default')}}</option>
|
<option value>{{ $t('trials:dicom-show:default') }}</option>
|
||||||
<option
|
<option
|
||||||
v-for="(item,index) in colormapsList"
|
v-for="(item,index) in colormapsList"
|
||||||
:key="index"
|
:key="index"
|
||||||
|
|
|
@ -4,9 +4,9 @@ import store from './store'
|
||||||
import NProgress from 'nprogress'
|
import NProgress from 'nprogress'
|
||||||
import 'nprogress/nprogress.css'
|
import 'nprogress/nprogress.css'
|
||||||
import { getToken } from '@/utils/auth'
|
import { getToken } from '@/utils/auth'
|
||||||
import getPageTitle from '@/utils/get-page-title'
|
|
||||||
import { OSSclient } from './utils/oss'
|
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
|
import { OSSclient } from './utils/oss'
|
||||||
|
// import getPageTitle from '@/utils/get-page-title'
|
||||||
|
|
||||||
NProgress.configure({ showSpinner: false })
|
NProgress.configure({ showSpinner: false })
|
||||||
|
|
||||||
|
@ -19,21 +19,27 @@ router.beforeEach(async(to, from, next) => {
|
||||||
|
|
||||||
// 确定用户是否已登录
|
// 确定用户是否已登录
|
||||||
const hasToken = getToken()
|
const hasToken = getToken()
|
||||||
|
Vue.prototype.toPath = to.path
|
||||||
|
Vue.prototype.$path = []
|
||||||
if (hasToken) {
|
if (hasToken) {
|
||||||
if (to.path === '/login' || to.path === '/recompose' || to.path === '/email-recompose' || to.path === '/error' || to.path === '/ReviewersResearchForm' || to.path === '/ReviewersResearch') {
|
if (to.path === '/login' || to.path === '/recompose' || to.path === '/email-recompose' || to.path === '/error' || to.path === '/ReviewersResearchForm' || to.path === '/ReviewersResearch') {
|
||||||
|
if (to.path === '/ReviewersResearch') {
|
||||||
|
await this.$store.dispatch('user/logout')
|
||||||
|
OSSclient()
|
||||||
|
}
|
||||||
|
if (to.path === '/ReviewersResearchForm') {
|
||||||
|
OSSclient()
|
||||||
|
}
|
||||||
next()
|
next()
|
||||||
NProgress.done()
|
NProgress.done()
|
||||||
} else {
|
} else {
|
||||||
if (!Vue.prototype.OSSclient) {
|
OSSclient()
|
||||||
OSSclient()
|
|
||||||
}
|
|
||||||
const hasGetUserInfo = store.getters.name
|
const hasGetUserInfo = store.getters.name
|
||||||
if (hasGetUserInfo) {
|
if (hasGetUserInfo) {
|
||||||
next()
|
next()
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
// 获取用户信息
|
// 获取用户信息
|
||||||
// OSSclient()
|
|
||||||
await store.dispatch('user/getInfo')
|
await store.dispatch('user/getInfo')
|
||||||
const accessRoutes = await store.dispatch('permission/generateRoutes')
|
const accessRoutes = await store.dispatch('permission/generateRoutes')
|
||||||
router.addRoutes(accessRoutes)
|
router.addRoutes(accessRoutes)
|
||||||
|
@ -50,6 +56,9 @@ router.beforeEach(async(to, from, next) => {
|
||||||
/* has no token*/
|
/* has no token*/
|
||||||
if (whiteList.indexOf(to.path) !== -1) {
|
if (whiteList.indexOf(to.path) !== -1) {
|
||||||
// 在免登录whiteList中,直接进入
|
// 在免登录whiteList中,直接进入
|
||||||
|
if (to.path === '/readingDicoms' || to.path === '/noneDicomReading'){
|
||||||
|
OSSclient()
|
||||||
|
}
|
||||||
next()
|
next()
|
||||||
} else {
|
} else {
|
||||||
if (to.path === '/researchForm') {
|
if (to.path === '/researchForm') {
|
||||||
|
|
|
@ -40,6 +40,7 @@ const getters = {
|
||||||
activeSeries: state => state.reading.activeSeries,
|
activeSeries: state => state.reading.activeSeries,
|
||||||
lastCanvasTaskId: state => state.reading.lastCanvasTaskId,
|
lastCanvasTaskId: state => state.reading.lastCanvasTaskId,
|
||||||
imageQuality: state => state.reading.imageQuality,
|
imageQuality: state => state.reading.imageQuality,
|
||||||
|
imageQualityIssues: state => state.reading.imageQualityIssues,
|
||||||
language: state => state.lang.language,
|
language: state => state.lang.language,
|
||||||
TotalNeedSignSystemDocCount: state => state.user.TotalNeedSignSystemDocCount,
|
TotalNeedSignSystemDocCount: state => state.user.TotalNeedSignSystemDocCount,
|
||||||
TotalNeedSignTrialDocCount: state => state.user.TotalNeedSignTrialDocCount,
|
TotalNeedSignTrialDocCount: state => state.user.TotalNeedSignTrialDocCount,
|
||||||
|
|
|
@ -8,9 +8,10 @@ import {
|
||||||
}
|
}
|
||||||
from '@/api/trials'
|
from '@/api/trials'
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
|
import { getCustomTag } from '@/api/reading'
|
||||||
|
|
||||||
import requestPoolManager from '@/utils/request-pool'
|
import requestPoolManager from '@/utils/request-pool'
|
||||||
import { getReadingVisitStudyList } from '@/api/trials'
|
import { getReadingVisitStudyList } from '@/api/trials'
|
||||||
import { getCustomTag } from '@/api/reading'
|
|
||||||
const hangingAgreement = [
|
const hangingAgreement = [
|
||||||
{ name: 'A', row: 1, col: 1 },
|
{ name: 'A', row: 1, col: 1 },
|
||||||
{ name: 'A|A', row: 1, col: 2 },
|
{ name: 'A|A', row: 1, col: 2 },
|
||||||
|
@ -28,7 +29,8 @@ const getDefaultState = () => {
|
||||||
currentReadingTaskState: 2,
|
currentReadingTaskState: 2,
|
||||||
activeSeries: {},
|
activeSeries: {},
|
||||||
lastCanvasTaskId: '',
|
lastCanvasTaskId: '',
|
||||||
imageQuality: null
|
imageQuality: null,
|
||||||
|
imageQualityIssues: null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function getQuestions(questions) {
|
function getQuestions(questions) {
|
||||||
|
@ -154,6 +156,7 @@ const actions = {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getVisitTasks({ state }, visitTaskId) {
|
getVisitTasks({ state }, visitTaskId) {
|
||||||
|
console.log('getVisitTasks')
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
getRelatedVisitTask({ visitTaskId: visitTaskId }).then(res => {
|
getRelatedVisitTask({ visitTaskId: visitTaskId }).then(res => {
|
||||||
res.Result.forEach(item => {
|
res.Result.forEach(item => {
|
||||||
|
@ -181,6 +184,7 @@ const actions = {
|
||||||
state.activeSeries = {}
|
state.activeSeries = {}
|
||||||
state.lastCanvasTaskId = ''
|
state.lastCanvasTaskId = ''
|
||||||
state.imageQuality = null
|
state.imageQuality = null
|
||||||
|
state.imageQualityIssues = null
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -221,6 +225,7 @@ const actions = {
|
||||||
modality: series.Modality,
|
modality: series.Modality,
|
||||||
description: series.Description,
|
description: series.Description,
|
||||||
previewImageUrl: study.IsDicom ? series.ImageResizePath ? Vue.prototype.OSSclientConfig.basePath + series.ImageResizePath : `/api/series/preview/${series.Id}` : Vue.prototype.OSSclientConfig.basePath + `${series.NoneDicomFileFirstFile}`,
|
previewImageUrl: study.IsDicom ? series.ImageResizePath ? Vue.prototype.OSSclientConfig.basePath + series.ImageResizePath : `/api/series/preview/${series.Id}` : Vue.prototype.OSSclientConfig.basePath + `${series.NoneDicomFileFirstFile}`,
|
||||||
|
instanceHtmlPathList: series.InstanceHtmlPathList,
|
||||||
instanceCount: series.InstanceCount,
|
instanceCount: series.InstanceCount,
|
||||||
prefetchInstanceCount: series.InstanceCount,
|
prefetchInstanceCount: series.InstanceCount,
|
||||||
loadStatus: true,
|
loadStatus: true,
|
||||||
|
@ -228,8 +233,8 @@ const actions = {
|
||||||
studyId: study.StudyId,
|
studyId: study.StudyId,
|
||||||
studyIndex: 0,
|
studyIndex: 0,
|
||||||
seriesIndex: index,
|
seriesIndex: index,
|
||||||
|
studyCode: study.StudyCode,
|
||||||
taskBlindName: state.visitTaskList[i].TaskBlindName,
|
taskBlindName: state.visitTaskList[i].TaskBlindName,
|
||||||
taskName: state.visitTaskList[i].TaskName,
|
|
||||||
visitTaskId: obj.visitTaskId,
|
visitTaskId: obj.visitTaskId,
|
||||||
readingTaskState: state.visitTaskList[i].ReadingTaskState,
|
readingTaskState: state.visitTaskList[i].ReadingTaskState,
|
||||||
isBaseLineTask: state.visitTaskList[i].IsBaseLineTask,
|
isBaseLineTask: state.visitTaskList[i].IsBaseLineTask,
|
||||||
|
@ -274,10 +279,12 @@ const actions = {
|
||||||
obj.StudyList = []
|
obj.StudyList = []
|
||||||
var i = state.visitTaskList.findIndex(i => i.VisitId === res.Result[idx].VisitId)
|
var i = state.visitTaskList.findIndex(i => i.VisitId === res.Result[idx].VisitId)
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
state.visitTaskList.splice(i, 1)
|
// state.visitTaskList.splice(i, 1)
|
||||||
|
state.visitTaskList.splice(i, 1, obj)
|
||||||
requestPoolManager.resetCachedTask()
|
requestPoolManager.resetCachedTask()
|
||||||
|
} else {
|
||||||
|
state.visitTaskList.push(obj)
|
||||||
}
|
}
|
||||||
state.visitTaskList.push(obj)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
|
@ -314,6 +321,7 @@ const actions = {
|
||||||
getDicomReadingQuestionAnswer(params).then(res => {
|
getDicomReadingQuestionAnswer(params).then(res => {
|
||||||
state.visitTaskList[index].Questions = res.Result
|
state.visitTaskList[index].Questions = res.Result
|
||||||
state.visitTaskList[index].questionsInit = true
|
state.visitTaskList[index].questionsInit = true
|
||||||
|
state.visitTaskList[index].QuestionMarkInfoList = res.OtherInfo.QuestionMarkInfoList
|
||||||
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
resolve()
|
resolve()
|
||||||
}).catch(() => { resolve() })
|
}).catch(() => { resolve() })
|
||||||
|
@ -331,6 +339,7 @@ const actions = {
|
||||||
getDicomReadingQuestionAnswer(params).then(res => {
|
getDicomReadingQuestionAnswer(params).then(res => {
|
||||||
state.visitTaskList[index].Questions = res.Result
|
state.visitTaskList[index].Questions = res.Result
|
||||||
state.visitTaskList[index].questionsInit = true
|
state.visitTaskList[index].questionsInit = true
|
||||||
|
state.visitTaskList[index].QuestionMarkInfoList = res.OtherInfo.QuestionMarkInfoList
|
||||||
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
resolve()
|
resolve()
|
||||||
}).catch(() => { resolve() })
|
}).catch(() => { resolve() })
|
||||||
|
@ -418,60 +427,6 @@ const actions = {
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
getMeasuredData({ state }, visitTaskId) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
|
||||||
if (state.visitTaskList[index].measureDataInit) {
|
|
||||||
resolve()
|
|
||||||
} else {
|
|
||||||
getTableAnswerRowInfoList(visitTaskId).then(res => {
|
|
||||||
var arr = []
|
|
||||||
res.Result.forEach(el => {
|
|
||||||
if (el.MeasureData) {
|
|
||||||
el.MeasureData = JSON.parse(el.MeasureData)
|
|
||||||
|
|
||||||
el.MeasureData.data.remark = el.OrderMarkName
|
|
||||||
}
|
|
||||||
arr.push(el)
|
|
||||||
})
|
|
||||||
state.visitTaskList[index].MeasureData = arr
|
|
||||||
state.visitTaskList[index].measureDataInit = true
|
|
||||||
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
|
||||||
resolve()
|
|
||||||
}).catch(() => { resolve() })
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
refreshMeasuredData({ state }, visitTaskId) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
|
||||||
|
|
||||||
getTableAnswerRowInfoList(visitTaskId).then(res => {
|
|
||||||
var arr = []
|
|
||||||
res.Result.forEach(el => {
|
|
||||||
if (el.MeasureData) {
|
|
||||||
el.MeasureData = JSON.parse(el.MeasureData)
|
|
||||||
|
|
||||||
el.MeasureData.data.remark = el.OrderMarkName
|
|
||||||
}
|
|
||||||
arr.push(el)
|
|
||||||
})
|
|
||||||
state.visitTaskList[index].MeasureData = arr
|
|
||||||
state.visitTaskList[index].measureDataInit = true
|
|
||||||
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
|
||||||
resolve()
|
|
||||||
}).catch(() => { resolve() })
|
|
||||||
})
|
|
||||||
},
|
|
||||||
getNoneDicomMeasuredData({ state }, visitTaskId) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
|
||||||
var measureData = state.visitTaskList[index].MeasureData
|
|
||||||
var noneDicomMeasureData = measureData.filter(item => !item.IsDicomReading)
|
|
||||||
resolve(noneDicomMeasureData)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
getCustomizeMeasuredData({ state }, visitTaskId) {
|
getCustomizeMeasuredData({ state }, visitTaskId) {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
||||||
|
@ -495,6 +450,33 @@ const actions = {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
getMeasuredData({ state }, visitTaskId) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
||||||
|
if (state.visitTaskList[index].measureDataInit) {
|
||||||
|
resolve()
|
||||||
|
} else {
|
||||||
|
getTableAnswerRowInfoList(visitTaskId).then(res => {
|
||||||
|
var arr = []
|
||||||
|
res.Result.forEach(el => {
|
||||||
|
if (el.MeasureData) {
|
||||||
|
el.MeasureData = JSON.parse(el.MeasureData)
|
||||||
|
el.MeasureData.data.remark = el.OrderMarkName
|
||||||
|
}
|
||||||
|
if (el.OtherMeasureData) {
|
||||||
|
el.OtherMeasureData = JSON.parse(el.OtherMeasureData)
|
||||||
|
el.OtherMeasureData.data.remark = el.OrderMarkName
|
||||||
|
}
|
||||||
|
arr.push(el)
|
||||||
|
})
|
||||||
|
state.visitTaskList[index].MeasureData = arr
|
||||||
|
state.visitTaskList[index].measureDataInit = true
|
||||||
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
|
resolve()
|
||||||
|
}).catch(() => { resolve() })
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
removeCustomizeMeasuredData({ state }, obj) {
|
removeCustomizeMeasuredData({ state }, obj) {
|
||||||
return new Promise(async resolve => {
|
return new Promise(async resolve => {
|
||||||
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
||||||
|
@ -552,6 +534,98 @@ const actions = {
|
||||||
}).catch(() => { resolve() })
|
}).catch(() => { resolve() })
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
refreshMeasuredData({ state }, visitTaskId) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
||||||
|
getTableAnswerRowInfoList(visitTaskId).then(res => {
|
||||||
|
var arr = []
|
||||||
|
res.Result.forEach(el => {
|
||||||
|
if (el.MeasureData) {
|
||||||
|
el.MeasureData = JSON.parse(el.MeasureData)
|
||||||
|
el.MeasureData.data.remark = el.OrderMarkName
|
||||||
|
}
|
||||||
|
arr.push(el)
|
||||||
|
})
|
||||||
|
state.visitTaskList[index].MeasureData = arr
|
||||||
|
state.visitTaskList[index].measureDataInit = true
|
||||||
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
|
resolve()
|
||||||
|
}).catch(() => { resolve() })
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getNoneDicomMeasuredData({ state }, visitTaskId) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
||||||
|
var measureData = state.visitTaskList[index].MeasureData
|
||||||
|
var noneDicomMeasureData = measureData.filter(item => !item.IsDicomReading)
|
||||||
|
resolve(noneDicomMeasureData)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
addMeasuredData({ state }, obj) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
||||||
|
var measureData = state.visitTaskList[index].MeasureData
|
||||||
|
// var idx = measureData.findIndex(item => item.MeasureData.uuid === obj.data.MeasureData.data.uuid)
|
||||||
|
var idx = measureData.findIndex(item => item.QuestionId === obj.data.QuestionId && item.RowIndex === obj.data.RowIndex)
|
||||||
|
if (idx > -1) {
|
||||||
|
for (const k in state.visitTaskList[index].MeasureData[idx]) {
|
||||||
|
if (k !== 'Id' && obj.data[k]) {
|
||||||
|
state.visitTaskList[index].MeasureData[idx][k] = obj.data[k]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// state.visitTaskList[index].MeasureData[idx].MeasureData = obj.data.MeasureData
|
||||||
|
console.log('更新标记成功', idx)
|
||||||
|
} else {
|
||||||
|
state.visitTaskList[index].MeasureData.push(obj.data)
|
||||||
|
console.log('新增标记成功')
|
||||||
|
}
|
||||||
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
|
console.log(state.visitTaskList)
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
addOrUpdateNonTargetMeasuredData({ state }, obj) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
||||||
|
var measureData = state.visitTaskList[index].MeasureData
|
||||||
|
console.log('addOrUpdateNonTargetMeasuredData')
|
||||||
|
var idx = measureData.findIndex(item => item.QuestionId === obj.data.QuestionId && item.OrderMarkName === obj.data.OrderMarkName)
|
||||||
|
if (idx > -1) {
|
||||||
|
for (const k in state.visitTaskList[index].MeasureData[idx]) {
|
||||||
|
if (k !== 'Id' && obj.data[k]) {
|
||||||
|
state.visitTaskList[index].MeasureData[idx][k] = obj.data[k]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log('更新标记成功', idx)
|
||||||
|
} else {
|
||||||
|
state.visitTaskList[index].MeasureData.push(obj.data)
|
||||||
|
console.log('新增标记成功')
|
||||||
|
}
|
||||||
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
removeNonTargetMeasuredData({ state }, obj) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
console.log('removeNonTargetMeasuredData')
|
||||||
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
||||||
|
var measureData = state.visitTaskList[index].MeasureData
|
||||||
|
var idx = measureData.findIndex(item => item.QuestionId === obj.questionId)
|
||||||
|
if (idx > -1) {
|
||||||
|
if (measureData[idx].FristAddTaskId) {
|
||||||
|
measureData[idx].MeasureData = ''
|
||||||
|
console.log('清除标记成功', idx)
|
||||||
|
} else {
|
||||||
|
measureData.splice(idx, 1)
|
||||||
|
console.log('移除标记成功', idx)
|
||||||
|
}
|
||||||
|
state.visitTaskList[index].MeasureData = measureData
|
||||||
|
}
|
||||||
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
},
|
||||||
addCustomizeMeasuredData({ state }, obj) {
|
addCustomizeMeasuredData({ state }, obj) {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
||||||
|
@ -587,29 +661,6 @@ const actions = {
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
addMeasuredData({ state }, obj) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
|
||||||
var measureData = state.visitTaskList[index].MeasureData
|
|
||||||
// var idx = measureData.findIndex(item => item.MeasureData.uuid === obj.data.MeasureData.data.uuid)
|
|
||||||
var idx = measureData.findIndex(item => item.QuestionId === obj.data.QuestionId && item.RowIndex === obj.data.RowIndex)
|
|
||||||
if (idx > -1) {
|
|
||||||
for (const k in state.visitTaskList[index].MeasureData[idx]) {
|
|
||||||
if (k !== 'Id' && obj.data[k]) {
|
|
||||||
state.visitTaskList[index].MeasureData[idx][k] = obj.data[k]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// state.visitTaskList[index].MeasureData[idx].MeasureData = obj.data.MeasureData
|
|
||||||
console.log('更新标记成功', idx)
|
|
||||||
} else {
|
|
||||||
state.visitTaskList[index].MeasureData.push(obj.data)
|
|
||||||
console.log('新增标记成功')
|
|
||||||
}
|
|
||||||
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
|
||||||
resolve()
|
|
||||||
})
|
|
||||||
},
|
|
||||||
removeMeasuredData({ state }, obj) {
|
removeMeasuredData({ state }, obj) {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
||||||
|
@ -698,11 +749,6 @@ const actions = {
|
||||||
// var path = id.split('/')[id.split('/').length - 1]
|
// var path = id.split('/')[id.split('/').length - 1]
|
||||||
imageIds.push(`wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${path}`)
|
imageIds.push(`wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${path}`)
|
||||||
})
|
})
|
||||||
// } else {
|
|
||||||
// series.InstanceList.forEach((id) => {
|
|
||||||
// imageIds.push(`wadouri:${process.env.VUE_APP_DICOM_PATH}/instance/content/${id}`)
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e)
|
console.log(e)
|
||||||
}
|
}
|
||||||
|
@ -719,18 +765,20 @@ const actions = {
|
||||||
description: series.Description,
|
description: series.Description,
|
||||||
previewImageUrl: study.IsDicom ? series.ImageResizePath ? Vue.prototype.OSSclientConfig.basePath + series.ImageResizePath : `/api/series/preview/${series.Id}` : Vue.prototype.OSSclientConfig.basePath + `${series.NoneDicomFileFirstFile}`,
|
previewImageUrl: study.IsDicom ? series.ImageResizePath ? Vue.prototype.OSSclientConfig.basePath + series.ImageResizePath : `/api/series/preview/${series.Id}` : Vue.prototype.OSSclientConfig.basePath + `${series.NoneDicomFileFirstFile}`,
|
||||||
instanceCount: series.InstanceCount,
|
instanceCount: series.InstanceCount,
|
||||||
|
instanceHtmlPathList: series.InstanceHtmlPathList,
|
||||||
prefetchInstanceCount: 0,
|
prefetchInstanceCount: 0,
|
||||||
loadStatus: false,
|
loadStatus: false,
|
||||||
imageloadedArr: [],
|
imageloadedArr: [],
|
||||||
studyId: study.StudyId,
|
studyId: study.StudyId,
|
||||||
studyIndex: studyIndex,
|
studyIndex: studyIndex,
|
||||||
seriesIndex: seriesIndex,
|
seriesIndex: seriesIndex,
|
||||||
|
studyCode: study.StudyCode,
|
||||||
taskBlindName: state.visitTaskList[index].TaskBlindName,
|
taskBlindName: state.visitTaskList[index].TaskBlindName,
|
||||||
taskName: state.visitTaskList[index].TaskName,
|
|
||||||
visitTaskId: obj.visitTaskId,
|
visitTaskId: obj.visitTaskId,
|
||||||
readingTaskState: state.visitTaskList[index].ReadingTaskState,
|
readingTaskState: state.visitTaskList[index].ReadingTaskState,
|
||||||
isBaseLineTask: state.visitTaskList[index].IsBaseLineTask,
|
isBaseLineTask: state.visitTaskList[index].IsBaseLineTask,
|
||||||
isCurrentTask: state.visitTaskList[index].IsCurrentTask,
|
isCurrentTask: state.visitTaskList[index].IsCurrentTask,
|
||||||
|
isExistsClinicalData: state.visitTaskList[index].IsExistsClinicalData,
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
isBeMark: series.IsBeMark,
|
isBeMark: series.IsBeMark,
|
||||||
ww: series.WindowWidth,
|
ww: series.WindowWidth,
|
||||||
|
@ -768,6 +816,7 @@ const actions = {
|
||||||
// 设置当前序列状态为已下载完成
|
// 设置当前序列状态为已下载完成
|
||||||
studyList[i].SeriesList[j].loadStatus = true
|
studyList[i].SeriesList[j].loadStatus = true
|
||||||
}
|
}
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -781,6 +830,24 @@ const actions = {
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
updateSeriesList({ state }, obj) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
if (obj.visitTaskindex > -1 && obj.studyIndex > -1 && obj.seriesIndex > -1) {
|
||||||
|
var studyList = state.visitTaskList[obj.visitTaskindex].StudyList || []
|
||||||
|
if (studyList[obj.studyIndex].SeriesList[obj.seriesIndex].imageloadedArr.indexOf(obj.imageId) < 0) {
|
||||||
|
studyList[obj.studyIndex].SeriesList[obj.seriesIndex].imageloadedArr.push(obj.imageId)
|
||||||
|
++studyList[obj.studyIndex].SeriesList[obj.seriesIndex].prefetchInstanceCount
|
||||||
|
} else {
|
||||||
|
studyList[obj.studyIndex].SeriesList[obj.seriesIndex].prefetchInstanceCount = studyList[obj.studyIndex].SeriesList[obj.seriesIndex].instanceCount
|
||||||
|
// 设置当前序列状态为已下载完成
|
||||||
|
studyList[obj.studyIndex].SeriesList[obj.seriesIndex].loadStatus = true
|
||||||
|
}
|
||||||
|
state.visitTaskList[obj.visitTaskindex].StudyList = studyList
|
||||||
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
|
}
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
},
|
||||||
setStatus({ state }, obj) {
|
setStatus({ state }, obj) {
|
||||||
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
||||||
state.visitTaskList[index].IsInit = true
|
state.visitTaskList[index].IsInit = true
|
||||||
|
@ -809,6 +876,45 @@ const actions = {
|
||||||
},
|
},
|
||||||
setImageQuality({ state }, imageQuality) {
|
setImageQuality({ state }, imageQuality) {
|
||||||
state.imageQuality = isNaN(parseInt(imageQuality)) ? null : parseInt(imageQuality)
|
state.imageQuality = isNaN(parseInt(imageQuality)) ? null : parseInt(imageQuality)
|
||||||
|
},
|
||||||
|
setImageQualityIssues({ state }, imageQualityIssues) {
|
||||||
|
state.imageQualityIssues = isNaN(parseInt(imageQualityIssues)) ? null : parseInt(imageQualityIssues)
|
||||||
|
},
|
||||||
|
addQuestionMeasuredData({ state }, obj) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
||||||
|
var measureData = state.visitTaskList[index].QuestionMarkInfoList
|
||||||
|
var idx = measureData.findIndex(item => item.QuestionId === obj.data.QuestionId)
|
||||||
|
if (idx > -1) {
|
||||||
|
for (const k in state.visitTaskList[index].QuestionMarkInfoList[idx]) {
|
||||||
|
if (k !== 'Id' && obj.data[k]) {
|
||||||
|
state.visitTaskList[index].QuestionMarkInfoList[idx][k] = obj.data[k]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log('更新标记成功', idx)
|
||||||
|
} else {
|
||||||
|
state.visitTaskList[index].QuestionMarkInfoList.push(obj.data)
|
||||||
|
console.log('新增标记成功')
|
||||||
|
}
|
||||||
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
removeQuestionMeasuredData({ state }, obj) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
||||||
|
var measureData = state.visitTaskList[index].QuestionMarkInfoList
|
||||||
|
if (obj.orderMarkName) {
|
||||||
|
const i = measureData.findIndex(item => item.QuestionId === obj.questionId && item.OrderMarkName === obj.orderMarkName)
|
||||||
|
if (i > -1) {
|
||||||
|
measureData[i].MeasureData = ''
|
||||||
|
console.log('清除标记成功', i)
|
||||||
|
}
|
||||||
|
state.visitTaskList[index].QuestionMarkInfoList = measureData
|
||||||
|
}
|
||||||
|
sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
const OSS = require('ali-oss')
|
const OSS = require('ali-oss')
|
||||||
const router = require('@/router');
|
const router = require('@/router');
|
||||||
|
const Minio = require('minio')
|
||||||
const stream = require('stream')
|
const stream = require('stream')
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
const { GenerateSTS, GetObjectStoreToken } = require('../api/user.js')
|
const { GenerateSTS, GetObjectStoreToken } = require('../api/user.js')
|
||||||
|
@ -51,6 +52,43 @@ async function ossGenerateSTS() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
case 'MinIO':
|
||||||
|
let minioClient = new Minio.Client(Vue.prototype.OSSclientConfig);
|
||||||
|
Vue.prototype.OSSclient = {
|
||||||
|
put: function (objectName, object) {
|
||||||
|
return new Promise(async (resolve, reject) => {
|
||||||
|
try {
|
||||||
|
var name = objectName.split('/')[objectName.split('/').length - 1]
|
||||||
|
let _vm = router.default.app
|
||||||
|
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') {
|
||||||
|
var objectItem = objectName.split('/')
|
||||||
|
objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
|
||||||
|
objectName = objectItem.join('/')
|
||||||
|
}
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = (ex) => {
|
||||||
|
const bufferStream = new stream.PassThrough()
|
||||||
|
bufferStream.end(Buffer.from(ex.target.result))
|
||||||
|
minioClient.putObject(Vue.prototype.OSSclientConfig.bucketName, objectName, bufferStream, function(err,etag) {
|
||||||
|
if (err) {
|
||||||
|
console.log(err)
|
||||||
|
reject()
|
||||||
|
} else {
|
||||||
|
resolve({
|
||||||
|
name: objectName,
|
||||||
|
url: 'http://www.abc.com' + objectName
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
reader.readAsArrayBuffer(object);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,90 +1,70 @@
|
||||||
import * as cornerstone from 'cornerstone-core'
|
import * as cornerstone from 'cornerstone-core'
|
||||||
var taskPool = [] // 请求池
|
var taskPool = [] // 请求池
|
||||||
let numRequest = 0 // 正在执行数量
|
let numRequest = 0 // 正在执行数量
|
||||||
const maxRequest = 1 // 可配置
|
const maxRequest = 5 // 可配置
|
||||||
let taskTimer // 轮询的定时器
|
let taskTimer // 轮询的定时器
|
||||||
var pendingList =[]
|
|
||||||
var cachedTask = {} // 存放的任务数据
|
var cachedTask = {} // 存放的任务数据
|
||||||
const maxTask = 6
|
let sortType = 1
|
||||||
|
var i= 0
|
||||||
|
let startExecuteTask = null
|
||||||
// 预加载池的添加
|
let endExecuteTask = performance.now()
|
||||||
function addTaskIntoPool(task) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
taskPool.forEach(task=>{
|
|
||||||
task.priority = task.priority
|
|
||||||
})
|
|
||||||
const cache = cachedTask[task.key]
|
|
||||||
const callback = (executeRes) => {
|
|
||||||
if (executeRes.success) {
|
|
||||||
resolve(executeRes.res)
|
|
||||||
} else {
|
|
||||||
reject(executeRes.err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const priority = task.priority || 0;
|
|
||||||
if (cache) {
|
|
||||||
cache.priority = priority
|
|
||||||
task.callback =callback
|
|
||||||
} else {
|
|
||||||
task.callback =callback
|
|
||||||
cachedTask[task.key] = task
|
|
||||||
taskPool.push(task)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
// 执行下载
|
// 执行下载
|
||||||
function executeTask() {
|
async function executeTask() {
|
||||||
|
// console.log(taskPool)
|
||||||
|
endExecuteTask = performance.now()
|
||||||
|
i++
|
||||||
|
stopTaskTimer()
|
||||||
if (taskPool.length > 0) {
|
if (taskPool.length > 0) {
|
||||||
numRequest = 0
|
// let startSortTime = performance.now()
|
||||||
const executeRequest = maxRequest - numRequest
|
// if( sortType ){
|
||||||
|
// maxRequest = 6
|
||||||
|
// }
|
||||||
|
// let endSortTime = performance.now()
|
||||||
|
var requestNum = Math.min(taskPool.length, maxRequest)
|
||||||
|
const tasks = taskPool.splice(0, requestNum);
|
||||||
|
|
||||||
if (executeRequest > 0) {
|
const taskPromises = tasks.map((task) => {
|
||||||
|
return task.execute().then((result) => {
|
||||||
|
task.callback({ success: true, res: result })
|
||||||
|
|
||||||
for (let i = 0; i < executeRequest; i++) {
|
}).catch((error) => {
|
||||||
sortTaskPool()
|
task.callback({ success: true, err: error })
|
||||||
|
})
|
||||||
const task = taskPool.shift()
|
})
|
||||||
if (!task) {
|
// let starLoadTime = performance.now()
|
||||||
return
|
await Promise.all(taskPromises)
|
||||||
}
|
// let endLoadTime = performance.now()
|
||||||
numRequest++
|
// let isTest = process.env.VUE_APP_OSS_PATH === '/test/dist'
|
||||||
task.execute().then((res) => {
|
// if(i > 1 && isTest){
|
||||||
numRequest--
|
|
||||||
task.callback({ success: true, res })
|
// console.log(`第${i}次:${startExecuteTask?endExecuteTask - startExecuteTask:0}:${endSortTime - startSortTime}:${endLoadTime - starLoadTime}`)
|
||||||
executeTask()
|
// }
|
||||||
}, (err) => {
|
|
||||||
numRequest--
|
// startExecuteTask = performance.now()
|
||||||
task.callback({ success: false,err })
|
executeTask()
|
||||||
executeTask()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}else{
|
}else{
|
||||||
startTaskTimer()
|
startTaskTimer()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function sortTaskPool() {
|
function sortTaskPool() {
|
||||||
if (taskPool.length > 0) {
|
if (taskPool.length > 0) {
|
||||||
taskPool.sort((a, b) => b.priority-a.priority )
|
taskPool.sort((a, b) => b.priority-a.priority )
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 轮询检查请求池中是否有请求需要执行
|
// 轮询检查请求池中是否有请求需要执行
|
||||||
function startTaskTimer() {
|
function startTaskTimer() {
|
||||||
if(taskTimer){
|
if (taskTimer) return; // 如果已存在定时器,则不重复启动
|
||||||
clearInterval(taskTimer)
|
|
||||||
taskTimer = null
|
|
||||||
}
|
|
||||||
taskTimer = setInterval(() => {
|
taskTimer = setInterval(() => {
|
||||||
if (taskPool.length > 0) {
|
if (taskPool.length > 0) {
|
||||||
stopTaskTimer()
|
stopTaskTimer();
|
||||||
executeTask()
|
executeTask();
|
||||||
}else{
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}, 50)
|
}, 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 停止轮询
|
// 停止轮询
|
||||||
|
@ -111,6 +91,20 @@ function loadAndCacheImagePlus(imageId,seriesId, priority) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 预加载池的添加
|
||||||
|
function addTaskIntoPool(task) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const callback = (executeRes) => {
|
||||||
|
if (executeRes.success) {
|
||||||
|
resolve(executeRes.res)
|
||||||
|
} else {
|
||||||
|
reject(executeRes.err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
task.callback =callback
|
||||||
|
taskPool.push(task)
|
||||||
|
})
|
||||||
|
}
|
||||||
function removeTask(seriesId){
|
function removeTask(seriesId){
|
||||||
stopTaskTimer()
|
stopTaskTimer()
|
||||||
if (taskPool.length > 0) {
|
if (taskPool.length > 0) {
|
||||||
|
@ -118,21 +112,31 @@ function removeTask(seriesId){
|
||||||
if(taskPool[i] && taskPool[i].seriesId === seriesId){
|
if(taskPool[i] && taskPool[i].seriesId === seriesId){
|
||||||
delete cachedTask[taskPool[i].key]
|
delete cachedTask[taskPool[i].key]
|
||||||
taskPool.splice(i,1)
|
taskPool.splice(i,1)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
startTaskTimer()
|
startTaskTimer()
|
||||||
}
|
}
|
||||||
|
function changePriority(seriesId){
|
||||||
|
taskPool.map(task=>{
|
||||||
|
if(task.seriesId === seriesId){
|
||||||
|
task.priority = parseInt(new Date().getTime()) * 10
|
||||||
|
}
|
||||||
|
})
|
||||||
|
sortTaskPool()
|
||||||
|
}
|
||||||
|
function setSortType(type){
|
||||||
|
sortType = type
|
||||||
|
}
|
||||||
function resetRequestPool(){
|
function resetRequestPool(){
|
||||||
taskPool = []
|
taskPool = []
|
||||||
pendingList =[]
|
|
||||||
cachedTask = {}
|
cachedTask = {}
|
||||||
|
sortType = 1
|
||||||
}
|
}
|
||||||
function resetCachedTask(){
|
function resetCachedTask(){
|
||||||
taskPool = []
|
taskPool = []
|
||||||
pendingList =[]
|
|
||||||
cachedTask = {}
|
cachedTask = {}
|
||||||
}
|
}
|
||||||
function buildImageRequestTask(imageId,seriesId, config = {}) {
|
function buildImageRequestTask(imageId,seriesId, config = {}) {
|
||||||
|
@ -149,6 +153,9 @@ function buildImageRequestTask(imageId,seriesId, config = {}) {
|
||||||
export default {
|
export default {
|
||||||
addTaskIntoPool,
|
addTaskIntoPool,
|
||||||
executeTask,
|
executeTask,
|
||||||
|
setSortType,
|
||||||
|
sortTaskPool,
|
||||||
|
changePriority,
|
||||||
startTaskTimer,
|
startTaskTimer,
|
||||||
stopTaskTimer,
|
stopTaskTimer,
|
||||||
loadAndCacheImagePlus,
|
loadAndCacheImagePlus,
|
||||||
|
|
|
@ -371,7 +371,7 @@ export default {
|
||||||
}
|
}
|
||||||
.viewerLeftSidePanel .viewernavigatorwrapper {
|
.viewerLeftSidePanel .viewernavigatorwrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 210px;
|
width: 200px;
|
||||||
height: 84px;
|
height: 84px;
|
||||||
padding: 1px 2px 1px 8px;
|
padding: 1px 2px 1px 8px;
|
||||||
margin: 6px 0 6px 1px;
|
margin: 6px 0 6px 1px;
|
||||||
|
|
|
@ -404,7 +404,7 @@ export default {
|
||||||
}
|
}
|
||||||
.viewerContainer .viewerLeftSidePanel .viewernavigatorwrapper {
|
.viewerContainer .viewerLeftSidePanel .viewernavigatorwrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 210px;
|
width: 200px;
|
||||||
height: 84px;
|
height: 84px;
|
||||||
padding: 1px 2px 1px 8px;
|
padding: 1px 2px 1px 8px;
|
||||||
margin: 6px 0 6px 1px;
|
margin: 6px 0 6px 1px;
|
||||||
|
|
|
@ -39,12 +39,21 @@
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
name: 'CustomWwwcForm',
|
name: 'CustomWwwcForm',
|
||||||
|
props: {
|
||||||
|
ww: {
|
||||||
|
type: Number,
|
||||||
|
default: null
|
||||||
|
},
|
||||||
|
wc: {
|
||||||
|
type: Number,
|
||||||
|
default: null
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
form: {
|
form: {
|
||||||
ww: null,
|
ww: this.ww,
|
||||||
wc: null
|
wc: this.wc
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
ww: [
|
ww: [
|
||||||
|
|
|
@ -7,9 +7,8 @@
|
||||||
element-loading-background="rgba(0, 0, 0, 0.8)"
|
element-loading-background="rgba(0, 0, 0, 0.8)"
|
||||||
style="position:relative;"
|
style="position:relative;"
|
||||||
class="cornerstone-element"
|
class="cornerstone-element"
|
||||||
@contextmenu.prevent="onContextmenu"
|
|
||||||
@mousemove="sliderMousemove"
|
|
||||||
@mouseup="sliderMouseup"
|
@mouseup="sliderMouseup"
|
||||||
|
@contextmenu.prevent="onContextmenu"
|
||||||
>
|
>
|
||||||
<!-- 临床数据 -->
|
<!-- 临床数据 -->
|
||||||
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
|
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
|
||||||
|
@ -33,7 +32,7 @@
|
||||||
<i class="el-icon-caret-left" />
|
<i class="el-icon-caret-left" />
|
||||||
</div>
|
</div>
|
||||||
<div class="blind_name_wrapper">
|
<div class="blind_name_wrapper">
|
||||||
{{ stack.taskName }}
|
{{ stack.taskBlindName }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="arrw_div_wrapper"
|
class="arrw_div_wrapper"
|
||||||
|
@ -44,13 +43,13 @@
|
||||||
<i class="el-icon-caret-right" />
|
<i class="el-icon-caret-right" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-show="dicomInfo.series" class="info-series">
|
<div class="info-series">
|
||||||
<h2 v-if="isReadingShowSubjectInfo" style="color:#f44336;padding: 5px 0px;margin: 0;">{{ subjectCode }} {{ stack.taskName }}</h2>
|
<h2 v-if="isReadingShowSubjectInfo" style="color:#f44336;padding: 5px 0px;margin: 0;">{{ subjectCode }} {{ stack.taskBlindName }}</h2>
|
||||||
<div>Series: #{{ dicomInfo.series }}</div>
|
<div v-show="dicomInfo.series">Series: #{{ dicomInfo.series }}</div>
|
||||||
<div>Image: #{{ dicomInfo.frame }}</div>
|
<div>Image: #{{ dicomInfo.frame }}</div>
|
||||||
<div>{{ dicomInfo.modality }}</div>
|
<div>{{ dicomInfo.modality }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-show="dicomInfo.series" class="info-image">
|
<div class="info-image">
|
||||||
<div v-show="mousePosition.mo">
|
<div v-show="mousePosition.mo">
|
||||||
Pos: {{ mousePosition.x?mousePosition.x.toFixed(0):'' }}, {{ mousePosition.y?mousePosition.y.toFixed(0):'' }}
|
Pos: {{ mousePosition.x?mousePosition.x.toFixed(0):'' }}, {{ mousePosition.y?mousePosition.y.toFixed(0):'' }}
|
||||||
</div>
|
</div>
|
||||||
|
@ -83,7 +82,7 @@
|
||||||
<!-- <div>{{ dicomInfo.time }}</div> -->
|
<!-- <div>{{ dicomInfo.time }}</div> -->
|
||||||
</div>
|
</div>
|
||||||
<div ref="sliderBox" class="my_slider_box" style="position: absolute;right: 1px;height: calc(100% - 140px);transform: translateY(-50%);top: calc(50% - 30px);width: 10px;background: #333;cursor: pointer" @click.stop="goViewer($event)">
|
<div ref="sliderBox" class="my_slider_box" style="position: absolute;right: 1px;height: calc(100% - 140px);transform: translateY(-50%);top: calc(50% - 30px);width: 10px;background: #333;cursor: pointer" @click.stop="goViewer($event)">
|
||||||
<div :style="{top: height + '%'}" style="z-index:10;background: #9e9e9e;height: 20px;width: 100%;position: absolute;top: 0;cursor: move" @mousedown.stop="sliderMousedown($event)" />
|
<div :style="{top: height + '%'}" style="z-index:10;background: #9e9e9e;height: 20px;width: 100%;position: absolute;top: 0;cursor: move" @click.stop.prevent="() => {return}" @mousedown.stop="sliderMousedown($event)" />
|
||||||
</div>
|
</div>
|
||||||
<div style="position: absolute;left: 50%;top: 30px;color: #f44336;transform: translateX(-50%);">
|
<div style="position: absolute;left: 50%;top: 30px;color: #f44336;transform: translateX(-50%);">
|
||||||
{{ markers.top }}
|
{{ markers.top }}
|
||||||
|
@ -100,8 +99,8 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="info-instance">
|
<div class="info-instance">
|
||||||
<div v-show="dicomInfo.location">Location: {{ dicomInfo.location }}</div>
|
<div v-if="dicomInfo.location">Location: {{ `${Number(dicomInfo.location).toFixed(digitPlaces)} mm` }}</div>
|
||||||
<div v-show="dicomInfo.thick">Slice Thickness: {{ dicomInfo.thick }}mm</div>
|
<div v-show="dicomInfo.thick">Slice Thickness: {{ `${dicomInfo.thick} mm` }}</div>
|
||||||
<div v-show="dicomInfo.wwwc">WW/WL: {{ dicomInfo.wwwc }}</div>
|
<div v-show="dicomInfo.wwwc">WW/WL: {{ dicomInfo.wwwc }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -159,6 +158,7 @@ cornerstoneTools.external.cornerstoneMath = cornerstoneMath
|
||||||
cornerstoneTools.toolStyle.setToolWidth(1)
|
cornerstoneTools.toolStyle.setToolWidth(1)
|
||||||
cornerstoneTools.toolColors.setToolColor('rgb(255, 0, 0)')
|
cornerstoneTools.toolColors.setToolColor('rgb(255, 0, 0)')
|
||||||
cornerstoneTools.toolColors.setActiveColor('rgb(0, 255, 0)')
|
cornerstoneTools.toolColors.setActiveColor('rgb(0, 255, 0)')
|
||||||
|
cornerstoneTools.store.state.deleteIfHandleOutsideImage = false
|
||||||
// cornerstoneTools.init({ globalToolSyncEnabled: true })
|
// cornerstoneTools.init({ globalToolSyncEnabled: true })
|
||||||
cornerstoneTools.init()
|
cornerstoneTools.init()
|
||||||
export default {
|
export default {
|
||||||
|
@ -220,9 +220,9 @@ export default {
|
||||||
firstImageLoading: false,
|
firstImageLoading: false,
|
||||||
visitTaskId: '',
|
visitTaskId: '',
|
||||||
taskBlindName: '',
|
taskBlindName: '',
|
||||||
taskName: '',
|
|
||||||
frame: null,
|
frame: null,
|
||||||
imageRendered: false
|
imageRendered: false,
|
||||||
|
isExistsClinicalData: false
|
||||||
// preventCache: true
|
// preventCache: true
|
||||||
},
|
},
|
||||||
dicomInfo: {
|
dicomInfo: {
|
||||||
|
@ -332,13 +332,14 @@ export default {
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
console.log(cornerstoneTools)
|
||||||
this.subjectCode = this.$router.currentRoute.query.subjectCode
|
this.subjectCode = this.$router.currentRoute.query.subjectCode
|
||||||
document.addEventListener('mouseup', () => {
|
document.addEventListener('mouseup', () => {
|
||||||
this.sliderMouseup()
|
this.sliderMouseup()
|
||||||
})
|
})
|
||||||
// document.addEventListener('mousemove', () => {
|
document.addEventListener('mousemove', (e) => {
|
||||||
// this.sliderMousemove()
|
this.sliderMousemove(e)
|
||||||
// })
|
})
|
||||||
var digitPlaces = Number(localStorage.getItem('digitPlaces'))
|
var digitPlaces = Number(localStorage.getItem('digitPlaces'))
|
||||||
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
|
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
|
||||||
this.type = this.$router.currentRoute.query.type ? this.$router.currentRoute.query.type : ''
|
this.type = this.$router.currentRoute.query.type ? this.$router.currentRoute.query.type : ''
|
||||||
|
@ -375,10 +376,10 @@ export default {
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// this.canvas.addEventListener(
|
this.canvas.addEventListener(
|
||||||
// 'cornerstonetoolsmeasurementremoved',
|
'cornerstonetoolsmeasurementremoved',
|
||||||
// this.onMeasurementremoved
|
this.onMeasurementremoved
|
||||||
// )
|
)
|
||||||
// EVENTS.MOUSE_UP
|
// EVENTS.MOUSE_UP
|
||||||
this.canvas.addEventListener('cornerstonetoolsmouseup', this.mouseUp)
|
this.canvas.addEventListener('cornerstonetoolsmouseup', this.mouseUp)
|
||||||
this.canvas.addEventListener('cornerstonetoolsmousedown', this.mouseDown)
|
this.canvas.addEventListener('cornerstonetoolsmousedown', this.mouseDown)
|
||||||
|
@ -537,7 +538,7 @@ export default {
|
||||||
this.mousePosition.y = currentPoints.image.y + 1
|
this.mousePosition.y = currentPoints.image.y + 1
|
||||||
this.mousePosition.mo = stats.mo
|
this.mousePosition.mo = stats.mo
|
||||||
this.mousePosition.suv = stats.suv
|
this.mousePosition.suv = stats.suv
|
||||||
if (this.isFirstChangeTask && this.pointNearTool(e)) {
|
if ((this.isFirstChangeTask || this.disabledMarks.length > 0) && this.pointNearTool(e)) {
|
||||||
e.stopImmediatePropagation()
|
e.stopImmediatePropagation()
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
@ -553,7 +554,7 @@ export default {
|
||||||
mouseDown(e) {
|
mouseDown(e) {
|
||||||
this.image = e.detail.image
|
this.image = e.detail.image
|
||||||
var pointNearTool = this.pointNearTool(e)
|
var pointNearTool = this.pointNearTool(e)
|
||||||
if (this.isFirstChangeTask && pointNearTool) {
|
if ((this.isFirstChangeTask || this.disabledMarks.length > 0) && pointNearTool) {
|
||||||
e.stopImmediatePropagation()
|
e.stopImmediatePropagation()
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
@ -602,6 +603,15 @@ export default {
|
||||||
})
|
})
|
||||||
return arr
|
return arr
|
||||||
},
|
},
|
||||||
|
getMergeMarks(measureDatas) {
|
||||||
|
var arr = []
|
||||||
|
measureDatas.map(i => {
|
||||||
|
if ((i.LesionType === 0) && i.SplitOrMergeType === 1) {
|
||||||
|
arr.push(i.OrderMarkName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return arr
|
||||||
|
},
|
||||||
getRGBPixels(element, x, y, width, height) {
|
getRGBPixels(element, x, y, width, height) {
|
||||||
if (!element) {
|
if (!element) {
|
||||||
return
|
return
|
||||||
|
@ -650,7 +660,7 @@ export default {
|
||||||
if (PX < 0) return
|
if (PX < 0) return
|
||||||
if (PX > boxHeight) return
|
if (PX > boxHeight) return
|
||||||
var height = PX * 100 / boxHeight
|
var height = PX * 100 / boxHeight
|
||||||
var index = Math.trunc(this.stack.imageIds.length * this.height / 100)
|
var index = Math.trunc(this.stack.imageIds.length * height / 100)
|
||||||
index = index > this.stack.imageIds.length ? this.stack.imageIds.length : index < 0 ? 0 : index
|
index = index > this.stack.imageIds.length ? this.stack.imageIds.length : index < 0 ? 0 : index
|
||||||
// if (!cornerstone.imageCache.getImageLoadObject(this.stack.imageIds[index])) return
|
// if (!cornerstone.imageCache.getImageLoadObject(this.stack.imageIds[index])) return
|
||||||
this.height = height
|
this.height = height
|
||||||
|
@ -662,58 +672,68 @@ export default {
|
||||||
this.sliderInfo.isMove = false
|
this.sliderInfo.isMove = false
|
||||||
},
|
},
|
||||||
getMeasureData() {
|
getMeasureData() {
|
||||||
|
console.log('getMeasureData')
|
||||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.stack.visitTaskId)
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.stack.visitTaskId)
|
||||||
this.measureData = this.visitTaskList[idx].MeasureData
|
this.measureData = this.visitTaskList[idx].MeasureData
|
||||||
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
||||||
const imageId = this.stack.imageIds[this.stack.currentImageIdIndex]
|
const imageId = this.stack.imageIds[this.stack.currentImageIdIndex]
|
||||||
ToolStateManager.clearImageIdToolState(imageId)
|
ToolStateManager.clearImageIdToolState(imageId)
|
||||||
cornerstone.updateImage(this.canvas, true)
|
cornerstone.updateImage(this.canvas, true)
|
||||||
|
var criterionType = parseInt(localStorage.getItem('CriterionType'))
|
||||||
|
if (this.isFirstChangeTask) {
|
||||||
|
this.disabledMarks = this.getDisabledMarks(this.visitTaskList[idx].MeasureData)
|
||||||
|
} else if (criterionType === 2) {
|
||||||
|
this.disabledMarks = this.getMergeMarks(this.visitTaskList[idx].MeasureData)
|
||||||
|
} else {
|
||||||
|
this.disabledMarks = []
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
onContextmenu(event) {
|
onContextmenu(event) {
|
||||||
if (this.isBaseline || this.readingTaskState >= 2 || this.CriterionType === 10) return false
|
event.preventDefault()
|
||||||
const x = event.offsetX
|
// if (this.isBaseline || this.readingTaskState >= 2 || this.CriterionType === 10) return false
|
||||||
const y = event.offsetY
|
// const x = event.offsetX
|
||||||
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
// const y = event.offsetY
|
||||||
|
// const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
||||||
|
|
||||||
var element = cornerstone.getEnabledElement(this.canvas)
|
// var element = cornerstone.getEnabledElement(this.canvas)
|
||||||
var { imageId } = element.image
|
// var { imageId } = element.image
|
||||||
this.measuredTools.map(toolType => {
|
// this.measuredTools.map(toolType => {
|
||||||
const toolState = ToolStateManager.getImageIdToolState(imageId, toolType)
|
// const toolState = ToolStateManager.getImageIdToolState(imageId, toolType)
|
||||||
if (!toolState) return
|
// if (!toolState) return
|
||||||
var toolObj = new cornerstoneTools[`${toolType}Tool`]()
|
// var toolObj = new cornerstoneTools[`${toolType}Tool`]()
|
||||||
|
|
||||||
var i = toolState.data.findIndex(data => toolObj.pointNearTool(this.canvas, data, { x, y }, 'mouse'))
|
// var i = toolState.data.findIndex(data => toolObj.pointNearTool(this.canvas, data, { x, y }, 'mouse'))
|
||||||
if (i === -1) return false
|
// if (i === -1) return false
|
||||||
var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === toolState.data[i].uuid)
|
// var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === toolState.data[i].uuid)
|
||||||
var rowId = null
|
// var rowId = null
|
||||||
if (idx > -1) {
|
// if (idx > -1) {
|
||||||
rowId = this.measureData[idx].RowId
|
// rowId = this.measureData[idx].RowId
|
||||||
}
|
// }
|
||||||
if (rowId) {
|
// if (rowId) {
|
||||||
this.selectedLesion = toolState.data[i]
|
// this.selectedLesion = toolState.data[i]
|
||||||
this.$contextmenu({
|
// this.$contextmenu({
|
||||||
items: [
|
// items: [
|
||||||
// {
|
// // {
|
||||||
// label: 'Split',
|
// // label: 'Split',
|
||||||
// divided: true,
|
// // divided: true,
|
||||||
// onClick: () => {
|
// // onClick: () => {
|
||||||
// this.handleSplit()
|
// // this.handleSplit()
|
||||||
// }
|
// // }
|
||||||
// }
|
// // }
|
||||||
],
|
// ],
|
||||||
event,
|
// event,
|
||||||
x: event.clientX,
|
// x: event.clientX,
|
||||||
y: event.clientY,
|
// y: event.clientY,
|
||||||
customClass: 'class-a',
|
// customClass: 'class-a',
|
||||||
zIndex: 3,
|
// zIndex: 3,
|
||||||
minWidth: 100
|
// minWidth: 100
|
||||||
})
|
// })
|
||||||
return false
|
// return false
|
||||||
} else {
|
// } else {
|
||||||
return false
|
// return false
|
||||||
}
|
// }
|
||||||
})
|
// })
|
||||||
},
|
},
|
||||||
handleSplit() {
|
handleSplit() {
|
||||||
var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === this.selectedLesion.uuid)
|
var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === this.selectedLesion.uuid)
|
||||||
|
@ -769,6 +789,7 @@ export default {
|
||||||
measureData.data = toolState.data[i]
|
measureData.data = toolState.data[i]
|
||||||
measureData.type = toolType
|
measureData.type = toolType
|
||||||
measureData.thick = this.dicomInfo.thick
|
measureData.thick = this.dicomInfo.thick
|
||||||
|
measureData.location = this.dicomInfo.location
|
||||||
var uuid = toolState.data[i].uuid
|
var uuid = toolState.data[i].uuid
|
||||||
var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === uuid)
|
var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === uuid)
|
||||||
if (idx > -1) {
|
if (idx > -1) {
|
||||||
|
@ -864,6 +885,7 @@ export default {
|
||||||
renderMeasuredData(e) {
|
renderMeasuredData(e) {
|
||||||
this.stack.frame = !isNaN(parseInt(this.stack.frame)) ? parseInt(this.stack.frame) : 0
|
this.stack.frame = !isNaN(parseInt(this.stack.frame)) ? parseInt(this.stack.frame) : 0
|
||||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.stack.visitTaskId)
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.stack.visitTaskId)
|
||||||
|
if (idx === -1) return
|
||||||
this.measureData = this.visitTaskList[idx].MeasureData
|
this.measureData = this.visitTaskList[idx].MeasureData
|
||||||
const { element } = e.detail
|
const { element } = e.detail
|
||||||
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
||||||
|
@ -1015,6 +1037,7 @@ export default {
|
||||||
measureData.data = toolState.data[i]
|
measureData.data = toolState.data[i]
|
||||||
measureData.type = toolType
|
measureData.type = toolType
|
||||||
measureData.thick = this.dicomInfo.thick
|
measureData.thick = this.dicomInfo.thick
|
||||||
|
measureData.location = this.dicomInfo.location
|
||||||
measureData.ww = Math.round(viewport.voi.windowWidth)
|
measureData.ww = Math.round(viewport.voi.windowWidth)
|
||||||
measureData.wc = Math.round(viewport.voi.windowCenter)
|
measureData.wc = Math.round(viewport.voi.windowCenter)
|
||||||
measureData.data.active = false
|
measureData.data.active = false
|
||||||
|
@ -1054,15 +1077,20 @@ export default {
|
||||||
this.stack.seriesIndex = dicomSeries.seriesIndex
|
this.stack.seriesIndex = dicomSeries.seriesIndex
|
||||||
this.stack.sliceThickness = dicomSeries.sliceThickness
|
this.stack.sliceThickness = dicomSeries.sliceThickness
|
||||||
this.stack.instanceCount = dicomSeries.instanceCount
|
this.stack.instanceCount = dicomSeries.instanceCount
|
||||||
|
this.stack.isExistsClinicalData = dicomSeries.isExistsClinicalData
|
||||||
// this.measuredData = dicomSeries.measuredData
|
// this.measuredData = dicomSeries.measuredData
|
||||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === dicomSeries.visitTaskId)
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === dicomSeries.visitTaskId)
|
||||||
this.stack.visitTaskNum = this.visitTaskList[idx].VisitTaskNum
|
this.stack.visitTaskNum = this.visitTaskList[idx].VisitTaskNum
|
||||||
this.isFirstChangeTask = this.visitTaskList[idx].IsFirstChangeTask
|
this.isFirstChangeTask = this.visitTaskList[idx].IsFirstChangeTask
|
||||||
|
var criterionType = parseInt(localStorage.getItem('CriterionType'))
|
||||||
if (this.isFirstChangeTask) {
|
if (this.isFirstChangeTask) {
|
||||||
this.disabledMarks = this.getDisabledMarks(this.visitTaskList[idx].MeasureData)
|
this.disabledMarks = this.getDisabledMarks(this.visitTaskList[idx].MeasureData)
|
||||||
|
} else if (criterionType === 2) {
|
||||||
|
this.disabledMarks = this.getMergeMarks(this.visitTaskList[idx].MeasureData)
|
||||||
} else {
|
} else {
|
||||||
this.disabledMarks = []
|
this.disabledMarks = []
|
||||||
}
|
}
|
||||||
|
|
||||||
this.maxVistNum = this.visitTaskList[this.visitTaskList.length - 1].VisitTaskNum
|
this.maxVistNum = this.visitTaskList[this.visitTaskList.length - 1].VisitTaskNum
|
||||||
this.minVistNum = this.visitTaskList[0].VisitTaskNum
|
this.minVistNum = this.visitTaskList[0].VisitTaskNum
|
||||||
this.measureData = this.visitTaskList[idx].MeasureData
|
this.measureData = this.visitTaskList[idx].MeasureData
|
||||||
|
@ -1099,8 +1127,8 @@ export default {
|
||||||
// resolve()
|
// resolve()
|
||||||
// })
|
// })
|
||||||
cornerstone.loadAndCacheImage(this.stack.imageIds[this.stack.currentImageIdIndex])
|
cornerstone.loadAndCacheImage(this.stack.imageIds[this.stack.currentImageIdIndex])
|
||||||
.then(image => {
|
.then(async image => {
|
||||||
scope.onFirstImageLoaded(image)
|
await scope.onFirstImageLoaded(image)
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
@ -1113,84 +1141,86 @@ export default {
|
||||||
},
|
},
|
||||||
onFirstImageLoaded(image) {
|
onFirstImageLoaded(image) {
|
||||||
console.log('onFirstImageLoaded')
|
console.log('onFirstImageLoaded')
|
||||||
|
return new Promise(async resolve => {
|
||||||
|
const element = this.$refs.canvas
|
||||||
|
var viewport = cornerstone.getDefaultViewportForImage(this.canvas, image)
|
||||||
|
cornerstone.displayImage(this.canvas, image, viewport)
|
||||||
|
|
||||||
const element = this.$refs.canvas
|
if (!this.toolState.initialized) {
|
||||||
var viewport = cornerstone.getDefaultViewportForImage(this.canvas, image)
|
this.toolState.initialized = true
|
||||||
cornerstone.displayImage(this.canvas, image, viewport)
|
const toolButtons = document.querySelectorAll('[data-tool]')
|
||||||
|
|
||||||
if (!this.toolState.initialized) {
|
// const scope = this
|
||||||
this.toolState.initialized = true
|
Array.from(toolButtons).forEach((toolBtn) => {
|
||||||
const toolButtons = document.querySelectorAll('[data-tool]')
|
|
||||||
|
|
||||||
// const scope = this
|
|
||||||
Array.from(toolButtons).forEach((toolBtn) => {
|
|
||||||
// Add the tool
|
// Add the tool
|
||||||
const toolName = toolBtn.getAttribute('data-tool')
|
const toolName = toolBtn.getAttribute('data-tool')
|
||||||
const apiTool = cornerstoneTools[`${toolName}Tool`]
|
const apiTool = cornerstoneTools[`${toolName}Tool`]
|
||||||
if (apiTool) {
|
if (apiTool) {
|
||||||
const toolAlreadyAddedToElement = cornerstoneTools.getToolForElement(element, apiTool)
|
const toolAlreadyAddedToElement = cornerstoneTools.getToolForElement(element, apiTool)
|
||||||
|
|
||||||
if (!toolAlreadyAddedToElement) {
|
if (!toolAlreadyAddedToElement) {
|
||||||
if (toolName === 'Length') {
|
if (toolName === 'Length') {
|
||||||
cornerstoneTools.addToolForElement(element, LengthTool, { configuration: { handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces, drawHandles: true }})
|
cornerstoneTools.addToolForElement(element, LengthTool, { configuration: { handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces, drawHandles: true }})
|
||||||
} else if (toolName === 'Bidirectional') {
|
} else if (toolName === 'Bidirectional') {
|
||||||
// cornerstoneTools.addToolForElement(element, BidirectionalTool, { digits: this.digitPlaces })
|
// cornerstoneTools.addToolForElement(element, BidirectionalTool, { digits: this.digitPlaces })
|
||||||
// , handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true
|
// , handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true
|
||||||
cornerstoneTools.addToolForElement(element, BidirectionalTool, { configuration: { digits: this.digitPlaces, hideHandlesIfMoving: true }})
|
cornerstoneTools.addToolForElement(element, BidirectionalTool, { configuration: { digits: this.digitPlaces, hideHandlesIfMoving: true }})
|
||||||
} else if (toolName === 'ArrowAnnotate') {
|
} else if (toolName === 'ArrowAnnotate') {
|
||||||
cornerstoneTools.addToolForElement(element, ArrowAnnotateTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true }})
|
cornerstoneTools.addToolForElement(element, ArrowAnnotateTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true }})
|
||||||
} else if (toolName === 'RectangleRoi') {
|
} else if (toolName === 'RectangleRoi') {
|
||||||
cornerstoneTools.addToolForElement(element, RectangleRoiTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true }})
|
cornerstoneTools.addToolForElement(element, RectangleRoiTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true }})
|
||||||
} else {
|
} else {
|
||||||
cornerstoneTools.addToolForElement(element, apiTool)
|
cornerstoneTools.addToolForElement(element, apiTool)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
if (!cornerstoneTools.getToolForElement(element, cornerstoneTools.WwwcRegionTool)) {
|
||||||
|
cornerstoneTools.addToolForElement(element, cornerstoneTools.WwwcRegionTool)
|
||||||
}
|
}
|
||||||
})
|
if (!cornerstoneTools.getToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool)) {
|
||||||
if (!cornerstoneTools.getToolForElement(element, cornerstoneTools.WwwcRegionTool)) {
|
cornerstoneTools.addToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool)
|
||||||
cornerstoneTools.addToolForElement(element, cornerstoneTools.WwwcRegionTool)
|
}
|
||||||
}
|
cornerstoneTools.setToolActiveForElement(element, 'StackScrollMouseWheel', {})
|
||||||
if (!cornerstoneTools.getToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool)) {
|
|
||||||
cornerstoneTools.addToolForElement(element, cornerstoneTools.StackScrollMouseWheelTool)
|
|
||||||
}
|
|
||||||
cornerstoneTools.setToolActiveForElement(element, 'StackScrollMouseWheel', {})
|
|
||||||
|
|
||||||
if (!cornerstoneTools.getToolForElement(element, ScaleOverlayTool)) {
|
if (!cornerstoneTools.getToolForElement(element, ScaleOverlayTool)) {
|
||||||
cornerstoneTools.addToolForElement(element, ScaleOverlayTool)
|
cornerstoneTools.addToolForElement(element, ScaleOverlayTool)
|
||||||
}
|
}
|
||||||
cornerstoneTools.setToolActiveForElement(element, 'ScaleOverlay', {})
|
cornerstoneTools.setToolActiveForElement(element, 'ScaleOverlay', {})
|
||||||
cornerstoneTools.setToolActiveForElement(this.canvas, 'Zoom', {
|
cornerstoneTools.setToolActiveForElement(this.canvas, 'Zoom', {
|
||||||
mouseButtonMask: 2
|
mouseButtonMask: 2
|
||||||
})
|
})
|
||||||
cornerstoneTools.setToolActiveForElement(this.canvas, 'Pan', {
|
cornerstoneTools.setToolActiveForElement(this.canvas, 'Pan', {
|
||||||
mouseButtonMask: 4
|
mouseButtonMask: 4
|
||||||
})
|
})
|
||||||
|
|
||||||
// if (!cornerstoneTools.getToolForElement(element, OrientationMarkersTool)) {
|
// if (!cornerstoneTools.getToolForElement(element, OrientationMarkersTool)) {
|
||||||
// cornerstoneTools.addToolForElement(element, OrientationMarkersTool)
|
// cornerstoneTools.addToolForElement(element, OrientationMarkersTool)
|
||||||
// }
|
// }
|
||||||
// cornerstoneTools.setToolActiveForElement(element, 'OrientationMarkers', { })
|
// cornerstoneTools.setToolActiveForElement(element, 'OrientationMarkers', { })
|
||||||
}
|
}
|
||||||
|
|
||||||
// cornerstoneTools.addStackStateManager(this.canvas, ['stack', 'stackPrefetch', 'playClip'])
|
// cornerstoneTools.addStackStateManager(this.canvas, ['stack', 'stackPrefetch', 'playClip'])
|
||||||
cornerstoneTools.addStackStateManager(this.canvas, ['stack', 'playClip'])
|
cornerstoneTools.addStackStateManager(this.canvas, ['stack', 'playClip'])
|
||||||
cornerstoneTools.addToolState(this.canvas, 'stack', this.stack)
|
cornerstoneTools.addToolState(this.canvas, 'stack', this.stack)
|
||||||
// cornerstoneTools.stackPrefetch.enable(this.canvas)
|
// cornerstoneTools.stackPrefetch.enable(this.canvas)
|
||||||
cornerstone.updateImage(element, true)
|
cornerstone.updateImage(element, true)
|
||||||
|
|
||||||
this.stack.firstImageLoading = false
|
this.stack.firstImageLoading = false
|
||||||
this.toolState.dicomInfoVisible = true
|
this.toolState.dicomInfoVisible = true
|
||||||
var instanceId = image.imageId.split('/')[image.imageId.split('/').length - 1]
|
var instanceId = image.imageId.split('/')[image.imageId.split('/').length - 1]
|
||||||
var frame = null
|
var frame = null
|
||||||
if (instanceId.includes('?frame=')) {
|
if (instanceId.includes('?frame=')) {
|
||||||
frame = instanceId.split('?frame=')[1]
|
frame = instanceId.split('?frame=')[1]
|
||||||
instanceId = instanceId.split('?frame=')[0]
|
instanceId = instanceId.split('?frame=')[0]
|
||||||
}
|
}
|
||||||
this.stack.frame = !isNaN(parseInt(frame)) ? parseInt(frame) : 0
|
this.stack.frame = !isNaN(parseInt(frame)) ? parseInt(frame) : 0
|
||||||
instanceId = instanceId.split('.')[0]
|
instanceId = instanceId.split('.')[0]
|
||||||
this.stack.instanceId = instanceId
|
this.stack.instanceId = instanceId
|
||||||
this.height = (this.stack.currentImageIdIndex) * 100 / (this.stack.imageIds.length - 1)
|
this.height = (this.stack.currentImageIdIndex) * 100 / (this.stack.imageIds.length - 1)
|
||||||
this.resetWwwc()
|
this.resetWwwc()
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
},
|
},
|
||||||
onNewImage(e) {
|
onNewImage(e) {
|
||||||
console.log('cornerstonenewimage')
|
console.log('cornerstonenewimage')
|
||||||
|
@ -1295,20 +1325,11 @@ export default {
|
||||||
if (!imagePlane || !imagePlane.rowCosines || !imagePlane.columnCosines) {
|
if (!imagePlane || !imagePlane.rowCosines || !imagePlane.columnCosines) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const row = getOrientationString(imagePlane.rowCosines)
|
const row = getOrientationString(imagePlane.rowCosines)
|
||||||
const column = getOrientationString(imagePlane.columnCosines)
|
const column = getOrientationString(imagePlane.columnCosines)
|
||||||
const oppositeRow = invertOrientationString(row)
|
const oppositeRow = invertOrientationString(row)
|
||||||
const oppositeColumn = invertOrientationString(column)
|
const oppositeColumn = invertOrientationString(column)
|
||||||
const markers = {
|
|
||||||
top: oppositeColumn,
|
|
||||||
bottom: column,
|
|
||||||
left: oppositeRow,
|
|
||||||
right: row
|
|
||||||
}
|
|
||||||
if (!markers) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.orientationMarkers = [oppositeColumn, row, column, oppositeRow]
|
this.orientationMarkers = [oppositeColumn, row, column, oppositeRow]
|
||||||
this.originalMarkers = [oppositeColumn, row, column, oppositeRow]
|
this.originalMarkers = [oppositeColumn, row, column, oppositeRow]
|
||||||
this.setMarkers()
|
this.setMarkers()
|
||||||
|
@ -1340,6 +1361,7 @@ export default {
|
||||||
measureData.data = e.detail.measurementData
|
measureData.data = e.detail.measurementData
|
||||||
measureData.type = e.detail.toolName
|
measureData.type = e.detail.toolName
|
||||||
measureData.thick = this.dicomInfo.thick
|
measureData.thick = this.dicomInfo.thick
|
||||||
|
measureData.location = this.dicomInfo.location
|
||||||
measureData.ww = Math.round(viewport.voi.windowWidth)
|
measureData.ww = Math.round(viewport.voi.windowWidth)
|
||||||
measureData.wc = Math.round(viewport.voi.windowCenter)
|
measureData.wc = Math.round(viewport.voi.windowCenter)
|
||||||
|
|
||||||
|
@ -1356,6 +1378,7 @@ export default {
|
||||||
measureData.data = e.detail.measurementData
|
measureData.data = e.detail.measurementData
|
||||||
measureData.type = e.detail.toolName
|
measureData.type = e.detail.toolName
|
||||||
measureData.thick = this.dicomInfo.thick
|
measureData.thick = this.dicomInfo.thick
|
||||||
|
measureData.location = this.dicomInfo.location
|
||||||
measureData.ww = Math.round(viewport.voi.windowWidth)
|
measureData.ww = Math.round(viewport.voi.windowWidth)
|
||||||
measureData.wc = Math.round(viewport.voi.windowCenter)
|
measureData.wc = Math.round(viewport.voi.windowCenter)
|
||||||
const canvas = this.canvas.querySelector('canvas')
|
const canvas = this.canvas.querySelector('canvas')
|
||||||
|
@ -1435,7 +1458,7 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onMeasurementremoved(e) {
|
onMeasurementremoved(e) {
|
||||||
|
console.log('================移除病灶=================', e)
|
||||||
},
|
},
|
||||||
onMeasurementmodified(e) {
|
onMeasurementmodified(e) {
|
||||||
// 移动
|
// 移动
|
||||||
|
@ -1470,6 +1493,7 @@ export default {
|
||||||
measureData.data = measurementData
|
measureData.data = measurementData
|
||||||
measureData.type = toolType
|
measureData.type = toolType
|
||||||
measureData.thick = this.dicomInfo.thick
|
measureData.thick = this.dicomInfo.thick
|
||||||
|
measureData.location = this.dicomInfo.location
|
||||||
measureData.ww = Math.round(viewport.voi.windowWidth)
|
measureData.ww = Math.round(viewport.voi.windowWidth)
|
||||||
measureData.wc = Math.round(viewport.voi.windowCenter)
|
measureData.wc = Math.round(viewport.voi.windowCenter)
|
||||||
measureData.data.active = false
|
measureData.data.active = false
|
||||||
|
@ -1477,14 +1501,6 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// updateImage(obj) {
|
|
||||||
// // const element = this.$refs.canvas
|
|
||||||
// // this.measuredData = obj.measuredData
|
|
||||||
// // const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
|
||||||
// // var imageId = `wadouri:/api/instance/content/${obj.instanceId}`
|
|
||||||
// // ToolStateManager.clearImageIdToolState(imageId)
|
|
||||||
// // cornerstone.updateImage(element, true)
|
|
||||||
// },
|
|
||||||
debounce(callback, delay) {
|
debounce(callback, delay) {
|
||||||
let timerId
|
let timerId
|
||||||
return function() {
|
return function() {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="dicom-viewer-wrapper">
|
<div class="dicom-viewer-wrapper">
|
||||||
<div class="dicom-viewer-container">
|
<div class="dicom-viewer-container" style="position:relative">
|
||||||
<div class="dicom-tools">
|
<div class="dicom-tools">
|
||||||
<el-tooltip class="item" effect="dark" :content="`${$t('trials:reading:button:layout')}`" placement="bottom">
|
<el-tooltip class="item" effect="dark" :content="`${$t('trials:reading:button:layout')}`" placement="bottom">
|
||||||
<div class="tool-wrapper" @click.stop="showPanel($event)" @mouseleave="handleMouseout">
|
<div class="tool-wrapper" @click.stop="showPanel($event)" @mouseleave="handleMouseout">
|
||||||
|
@ -76,13 +76,13 @@
|
||||||
<!-- 调窗 -->
|
<!-- 调窗 -->
|
||||||
<!-- <div class="text">{{ $t('trials:reading:button:wwwc') }}<i class="el-icon-caret-bottom" /></div> -->
|
<!-- <div class="text">{{ $t('trials:reading:button:wwwc') }}<i class="el-icon-caret-bottom" /></div> -->
|
||||||
<div class="dropdown-content">
|
<div class="dropdown-content">
|
||||||
<ul style="width:165px;padding: 0 10px;">
|
<ul style="width:165px;">
|
||||||
|
|
||||||
<li v-for="item in wwwcArr" :key="item.label">
|
<li v-for="item in wwwcArr" :key="item.label">
|
||||||
<a href="#" @click.prevent="setDicomCanvasWwwc(item)">
|
<a href="#" @click.prevent="setDicomCanvasWwwc(item)">
|
||||||
<div v-if="item.wc" style="display:flex;flex-direction: row;justify-content: space-between;">
|
<div v-if="item.wc !== null" style="display:flex;flex-direction: row;justify-content: space-between;">
|
||||||
<div>{{ item.label }}</div>
|
<div>{{ item.label }}</div>
|
||||||
<div>{{ item.ww }}/{{ item.wc }}</div>
|
<div>{{ `${item.ww} / ${item.wc}` }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else style="text-align:left;">
|
<div v-else style="text-align:left;">
|
||||||
{{ item.label }}
|
{{ item.label }}
|
||||||
|
@ -179,7 +179,7 @@
|
||||||
<!-- 旋转 -->
|
<!-- 旋转 -->
|
||||||
<div class="text">{{ $t('trials:reading:button:rotate') }}<i class="el-icon-caret-bottom" /></div>
|
<div class="text">{{ $t('trials:reading:button:rotate') }}<i class="el-icon-caret-bottom" /></div>
|
||||||
<div class="dropdown-content">
|
<div class="dropdown-content">
|
||||||
<ul style="width:100px;padding:0 10px;">
|
<ul style="width:100px;">
|
||||||
<li v-for="rotate in rotateArr" :key="rotate.label" style="text-align:left;">
|
<li v-for="rotate in rotateArr" :key="rotate.label" style="text-align:left;">
|
||||||
<a href="#" @click.prevent="setDicomCanvasRotate(rotate.val)">{{ rotate.label }}</a>
|
<a href="#" @click.prevent="setDicomCanvasRotate(rotate.val)">{{ rotate.label }}</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -327,6 +327,7 @@
|
||||||
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
|
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
|
||||||
:current-dicom-canvas-index="currentDicomCanvasIndex"
|
:current-dicom-canvas-index="currentDicomCanvasIndex"
|
||||||
:custom-wwc-tpl="customWwcTpl"
|
:custom-wwc-tpl="customWwcTpl"
|
||||||
|
:data-canvas-uid="`dicomCanvas${i-1}`"
|
||||||
@setCornerstoneStyle="setCornerstoneStyle(i-1)"
|
@setCornerstoneStyle="setCornerstoneStyle(i-1)"
|
||||||
@setMeasureData="setMeasureData"
|
@setMeasureData="setMeasureData"
|
||||||
@modifyMeasureData="modifyMeasureData"
|
@modifyMeasureData="modifyMeasureData"
|
||||||
|
@ -362,6 +363,7 @@
|
||||||
:is-show="isShow"
|
:is-show="isShow"
|
||||||
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<RecistQuestionList
|
<RecistQuestionList
|
||||||
v-else-if="CriterionType !== 17"
|
v-else-if="CriterionType !== 17"
|
||||||
ref="measurementList"
|
ref="measurementList"
|
||||||
|
@ -369,10 +371,16 @@
|
||||||
:question-form-change-num="questionFormChangeNum"
|
:question-form-change-num="questionFormChangeNum"
|
||||||
:is-show="isShow"
|
:is-show="isShow"
|
||||||
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
||||||
@setToolPassive="setToolPassive"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- <div v-if="petct.visible" class="petct_wrapper">
|
||||||
|
<PetCt
|
||||||
|
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
||||||
|
@close="petct.visible = false"
|
||||||
|
/>
|
||||||
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-dialog
|
<el-dialog
|
||||||
|
@ -383,7 +391,7 @@
|
||||||
width="400px"
|
width="400px"
|
||||||
custom-class="base-dialog-wrapper"
|
custom-class="base-dialog-wrapper"
|
||||||
>
|
>
|
||||||
<CustomWwwcForm @close="customWwc.visible = false" @setWwwc="setWwwc" />
|
<CustomWwwcForm :ww="activeCanvasWW" :wc="activeCanvasWC" @close="customWwc.visible = false" @setWwwc="setWwwc" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
<el-dialog
|
<el-dialog
|
||||||
|
@ -440,8 +448,12 @@ import Hammer from 'hammerjs'
|
||||||
cornerstoneTools.external.cornerstone = cornerstone
|
cornerstoneTools.external.cornerstone = cornerstone
|
||||||
cornerstoneTools.external.Hammer = Hammer
|
cornerstoneTools.external.Hammer = Hammer
|
||||||
cornerstoneTools.external.cornerstoneMath = cornerstoneMath
|
cornerstoneTools.external.cornerstoneMath = cornerstoneMath
|
||||||
|
import { getDoctorShortcutKey, getUserWLTemplateList } from '@/api/user'
|
||||||
|
import { mapGetters } from 'vuex'
|
||||||
|
import store from '@/store'
|
||||||
|
import { getToken } from '@/utils/auth'
|
||||||
// import DicomCanvas from './DicomCanvas'
|
// import DicomCanvas from './DicomCanvas'
|
||||||
|
// import PetCt from './Fusion/PetCt'
|
||||||
import DicomCanvas from '@/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue'
|
import DicomCanvas from '@/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue'
|
||||||
import RecistQuestionList from './Recist/QuestionList'
|
import RecistQuestionList from './Recist/QuestionList'
|
||||||
import RecistBMQuestionList from './RecistBM/QuestionList'
|
import RecistBMQuestionList from './RecistBM/QuestionList'
|
||||||
|
@ -453,12 +465,11 @@ import Hotkeys from './Hotkeys'
|
||||||
import WL from './WL'
|
import WL from './WL'
|
||||||
import Others from './Others'
|
import Others from './Others'
|
||||||
import DicomEvent from './DicomEvent'
|
import DicomEvent from './DicomEvent'
|
||||||
import { mapGetters } from 'vuex'
|
import html2canvas from 'html2canvas'
|
||||||
import store from '@/store'
|
|
||||||
import { getDoctorShortcutKey, getUserWLTemplateList } from '@/api/user'
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DicomViewer',
|
name: 'DicomViewer',
|
||||||
components: {
|
components: {
|
||||||
|
// PetCt,
|
||||||
DicomCanvas,
|
DicomCanvas,
|
||||||
CustomWwwcForm,
|
CustomWwwcForm,
|
||||||
Manuals,
|
Manuals,
|
||||||
|
@ -468,7 +479,8 @@ export default {
|
||||||
RecistQuestionList,
|
RecistQuestionList,
|
||||||
PCWGQuestionList,
|
PCWGQuestionList,
|
||||||
RecistBMQuestionList,
|
RecistBMQuestionList,
|
||||||
IRecistQuestionList },
|
IRecistQuestionList
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
isShow: {
|
isShow: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
|
@ -565,7 +577,8 @@ export default {
|
||||||
{ label: 'CT Lungs', wc: -400, ww: 1500 },
|
{ label: 'CT Lungs', wc: -400, ww: 1500 },
|
||||||
{ label: 'CT Abdomen', wc: 60, ww: 400 },
|
{ label: 'CT Abdomen', wc: 60, ww: 400 },
|
||||||
{ label: 'CT Liver', wc: 40, ww: 400 },
|
{ label: 'CT Liver', wc: 40, ww: 400 },
|
||||||
{ label: 'CT Bone', wc: 300, ww: 1500 }
|
{ label: 'CT Bone', wc: 300, ww: 1500 },
|
||||||
|
{ label: 'CT Bone1', wc: 0, ww: 0 }
|
||||||
|
|
||||||
],
|
],
|
||||||
activeSeries: {},
|
activeSeries: {},
|
||||||
|
@ -585,12 +598,17 @@ export default {
|
||||||
activeName: '1',
|
activeName: '1',
|
||||||
customWwcTpl: [],
|
customWwcTpl: [],
|
||||||
isFullscreen: false,
|
isFullscreen: false,
|
||||||
manualsDialog: { visible: false }
|
manualsDialog: { visible: false },
|
||||||
|
studyList: [],
|
||||||
|
digitPlaces: 2,
|
||||||
|
activeCanvasWW: null,
|
||||||
|
activeCanvasWC: null,
|
||||||
|
activeTaskInfo: {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(['visitTaskList', 'currentReadingTaskState'])
|
...mapGetters(['visitTaskList', 'currentReadingTaskState', 'lastCanvasTaskId', 'imageQualityIssues'])
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
currentReadingTaskState: {
|
currentReadingTaskState: {
|
||||||
|
@ -604,16 +622,53 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
lastCanvasTaskId: {
|
||||||
|
immediate: true,
|
||||||
|
handler(v) {
|
||||||
|
// if (v) {
|
||||||
|
// console.log('lastCanvasTaskId')
|
||||||
|
// const i = this.visitTaskList.findIndex(i => i.VisitTaskId === v)
|
||||||
|
// if (i < 0) return
|
||||||
|
// var studyList = this.visitTaskList[i].StudyList || []
|
||||||
|
// studyList = studyList.filter(i => !i.IsCriticalSequence && i.Modalities.indexOf('CT') !== -1 && i.Modalities.indexOf('PT') !== -1)
|
||||||
|
// if (studyList.length === 0) return
|
||||||
|
// this.studyList = studyList
|
||||||
|
// } else {
|
||||||
|
// this.studyList = []
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
activeSeries: {
|
||||||
|
immediate: true,
|
||||||
|
handler(v) {
|
||||||
|
if (v && v.isCurrentTask && this.studyList.length === 0) {
|
||||||
|
this.activeTaskInfo.taskName = v.taskBlindName
|
||||||
|
this.activeTaskInfo.visitTaskId = v.visitTaskId
|
||||||
|
const i = this.visitTaskList.findIndex(i => i.VisitTaskId === v.visitTaskId)
|
||||||
|
if (i < 0) return
|
||||||
|
this.activeTaskInfo.visitTaskIndex = i
|
||||||
|
var studyList = this.visitTaskList[i].StudyList || []
|
||||||
|
studyList = studyList.filter(i => !i.IsCriticalSequence && i.Modalities.indexOf('CT') !== -1 && i.Modalities.indexOf('PT') !== -1)
|
||||||
|
if (studyList.length === 0) return
|
||||||
|
this.studyList = studyList
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
imageQualityIssues: {
|
||||||
|
immediate: true,
|
||||||
|
handler(v) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.getHotKeys()
|
this.getHotKeys()
|
||||||
this.getWwcTpl()
|
this.getWwcTpl()
|
||||||
// cornerstone.imageCache.setMaximumSizeBytes(0)
|
// cornerstone.imageCache.setMaximumSizeBytes(0)
|
||||||
|
|
||||||
const maximumSizeInBytes = 1024 * 1024 * 1024 // 1 GB
|
// const maximumSizeInBytes = 1024 * 1024 * 1024 // 1 GB
|
||||||
// const maximumSizeInBytes = 1024 * 1024 * 500
|
// // const maximumSizeInBytes = 1024 * 1024 * 500
|
||||||
cornerstone.imageCache.setMaximumSizeBytes(maximumSizeInBytes)
|
// cornerstone.imageCache.setMaximumSizeBytes(maximumSizeInBytes)
|
||||||
this.customWwc = { visible: false, title: this.$t('trials:reading:dagTitle:wwwcCustom') }
|
this.customWwc = { visible: false, title: this.$t('trials:reading:dagTitle:wwwcCustom') }
|
||||||
this.CriterionType = parseInt(localStorage.getItem('CriterionType'))
|
this.CriterionType = parseInt(localStorage.getItem('CriterionType'))
|
||||||
if (this.CriterionType === 10) {
|
if (this.CriterionType === 10) {
|
||||||
|
@ -627,6 +682,8 @@ export default {
|
||||||
this.colormapsList = cornerstone.colors.getColormapsList()
|
this.colormapsList = cornerstone.colors.getColormapsList()
|
||||||
this.currentDicomCanvas = this.$refs['dicomCanvas0'] ? this.$refs['dicomCanvas0'][0] : ''
|
this.currentDicomCanvas = this.$refs['dicomCanvas0'] ? this.$refs['dicomCanvas0'][0] : ''
|
||||||
this.trialId = this.$router.currentRoute.query.trialId
|
this.trialId = this.$router.currentRoute.query.trialId
|
||||||
|
var digitPlaces = Number(localStorage.getItem('digitPlaces'))
|
||||||
|
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
|
||||||
this.setCanvasStyle()
|
this.setCanvasStyle()
|
||||||
window.addEventListener('resize', this.setCanvasStyle)
|
window.addEventListener('resize', this.setCanvasStyle)
|
||||||
DicomEvent.$on('updateImage', (instanceId) => {
|
DicomEvent.$on('updateImage', (instanceId) => {
|
||||||
|
@ -646,17 +703,48 @@ export default {
|
||||||
}
|
}
|
||||||
console.log('getMeasureData')
|
console.log('getMeasureData')
|
||||||
})
|
})
|
||||||
DicomEvent.$on('getScreenshots', (callback) => {
|
DicomEvent.$on('getScreenshots', async(measuredData, callback) => {
|
||||||
var base64Str = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].getScreenshots()
|
if (this.currentDicomCanvasIndex > -1) {
|
||||||
callback(base64Str)
|
if (!measuredData) return
|
||||||
console.log('getScreenshots')
|
await this.imageLocation(measuredData)
|
||||||
|
setTimeout(async() => {
|
||||||
|
// var base64Str = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].getScreenshots()
|
||||||
|
const divForDownloadViewport = document.querySelector(
|
||||||
|
`div[data-canvas-uid="dicomCanvas${this.currentDicomCanvasIndex}"]`
|
||||||
|
)
|
||||||
|
var canvas = await html2canvas(divForDownloadViewport)
|
||||||
|
var base64Str = canvas.toDataURL('image/png', 1)
|
||||||
|
console.log('getScreenshots')
|
||||||
|
callback(base64Str)
|
||||||
|
}, 50)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
DicomEvent.$on('imageLocation', measuredData => {
|
DicomEvent.$on('imageLocation', async(measuredData) => {
|
||||||
if (!measuredData) return
|
return new Promise(async resolve => {
|
||||||
this.imageLocation(measuredData)
|
if (!measuredData) return
|
||||||
|
await this.imageLocation(measuredData)
|
||||||
|
|
||||||
console.log('imageLocation')
|
console.log('imageLocation')
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
// DicomEvent.$on('imageLocation', async(measuredData, callback) => {
|
||||||
|
// if (measuredData) {
|
||||||
|
// await this.imageLocation(measuredData)
|
||||||
|
// }
|
||||||
|
// console.log('imageLocation')
|
||||||
|
// this.$nextTick(() => {
|
||||||
|
// if (callback) {
|
||||||
|
// callback()
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// })
|
||||||
|
// DicomEvent.$on('imageLocation', measuredData => {
|
||||||
|
// if (!measuredData) return
|
||||||
|
// this.imageLocation(measuredData)
|
||||||
|
|
||||||
|
// console.log('imageLocation')
|
||||||
|
// })
|
||||||
DicomEvent.$on('setReadingState', readingTaskState => {
|
DicomEvent.$on('setReadingState', readingTaskState => {
|
||||||
this.canvasObj[this.currentDicomCanvasIndex].readingTaskState = readingTaskState
|
this.canvasObj[this.currentDicomCanvasIndex].readingTaskState = readingTaskState
|
||||||
if (this.activeTool) {
|
if (this.activeTool) {
|
||||||
|
@ -678,6 +766,24 @@ export default {
|
||||||
DicomEvent.$on('setMeasuredToolsPassive', () => {
|
DicomEvent.$on('setMeasuredToolsPassive', () => {
|
||||||
this.setMeasuredToolsPassive()
|
this.setMeasuredToolsPassive()
|
||||||
})
|
})
|
||||||
|
DicomEvent.$on('readingPageUpdate', (data) => {
|
||||||
|
if (!this.petctWindow) return
|
||||||
|
this.petctWindow.postMessage({ type: 'readingPageUpdate', data: data }, window.location)
|
||||||
|
})
|
||||||
|
DicomEvent.$on('setReadingState', (data) => {
|
||||||
|
if (!this.petctWindow) return
|
||||||
|
this.petctWindow.postMessage({ type: 'setReadingState', data: data }, window.location)
|
||||||
|
})
|
||||||
|
DicomEvent.$on('closePetct', () => {
|
||||||
|
if (this.petctWindow) {
|
||||||
|
this.petctWindow.close()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
window.addEventListener('beforeunload', () => {
|
||||||
|
if (this.petctWindow) {
|
||||||
|
this.petctWindow.close()
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
DicomEvent.$off('updateImage')
|
DicomEvent.$off('updateImage')
|
||||||
|
@ -687,6 +793,14 @@ export default {
|
||||||
DicomEvent.$off('loadImageStacks')
|
DicomEvent.$off('loadImageStacks')
|
||||||
DicomEvent.$off('loadLinkedImageStack')
|
DicomEvent.$off('loadLinkedImageStack')
|
||||||
DicomEvent.$off('setMeasuredToolsPassive')
|
DicomEvent.$off('setMeasuredToolsPassive')
|
||||||
|
DicomEvent.$off('readingPageUpdate')
|
||||||
|
DicomEvent.$off('setReadingState')
|
||||||
|
DicomEvent.$off('reload')
|
||||||
|
DicomEvent.$off('closePetct')
|
||||||
|
if (this.petctWindow) {
|
||||||
|
this.petctWindow.close()
|
||||||
|
}
|
||||||
|
window.removeEventListener('beforeunload')
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
getWwcTpl() {
|
getWwcTpl() {
|
||||||
|
@ -826,7 +940,7 @@ export default {
|
||||||
this.cornerstoneStyle = {
|
this.cornerstoneStyle = {
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
top: '72px',
|
top: '72px',
|
||||||
left: '205px',
|
left: '0px',
|
||||||
right: '350px',
|
right: '350px',
|
||||||
zIndex: 10
|
zIndex: 10
|
||||||
}
|
}
|
||||||
|
@ -1041,108 +1155,117 @@ export default {
|
||||||
|
|
||||||
// 最后一个窗口显示当前访视下病灶所在的影像序列
|
// 最后一个窗口显示当前访视下病灶所在的影像序列
|
||||||
// 其他窗口显示该病灶第一次出现的序列信息
|
// 其他窗口显示该病灶第一次出现的序列信息
|
||||||
async imageLocation(obj) {
|
imageLocation(obj) {
|
||||||
var loading = null
|
return new Promise(async resolve => {
|
||||||
var loadImagePromises = []
|
var loading = null
|
||||||
var isScrollSync = this.isScrollSync
|
var loadImagePromises = []
|
||||||
if (this.isScrollSync) {
|
var isScrollSync = this.isScrollSync
|
||||||
|
if (this.isScrollSync) {
|
||||||
// 取消滚动同步
|
// 取消滚动同步
|
||||||
this.isScrollSync = false
|
this.isScrollSync = false
|
||||||
}
|
}
|
||||||
|
|
||||||
var activeCanvasTaskId = obj.visitTaskId
|
var activeCanvasTaskId = obj.visitTaskId
|
||||||
|
|
||||||
var index = this.visitTaskList.findIndex(i => i.VisitTaskId === activeCanvasTaskId)
|
var index = this.visitTaskList.findIndex(i => i.VisitTaskId === activeCanvasTaskId)
|
||||||
if (index === -1) return
|
if (index === -1) {
|
||||||
|
resolve()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
var firstAddSeries = null
|
var firstAddSeries = null
|
||||||
var currentAddSeries = null
|
var currentAddSeries = null
|
||||||
if (this.isReadingTaskViewInOrder) {
|
if (this.isReadingTaskViewInOrder) {
|
||||||
// 有序
|
// 有序
|
||||||
// 获取病灶第一次出现的访视序列
|
// 获取病灶第一次出现的访视序列
|
||||||
var firstAddVisitTaskId = null
|
var firstAddVisitTaskId = null
|
||||||
|
|
||||||
var idx = this.visitTaskList[index].MeasureData.findIndex(item => {
|
var idx = this.visitTaskList[index].MeasureData.findIndex(item => {
|
||||||
return item.OrderMarkName === obj.lesionName
|
return item.OrderMarkName === obj.lesionName
|
||||||
})
|
})
|
||||||
if (idx > -1) {
|
if (idx > -1) {
|
||||||
firstAddVisitTaskId = this.visitTaskList[index].MeasureData[idx].FristAddTaskId
|
firstAddVisitTaskId = this.visitTaskList[index].MeasureData[idx].FristAddTaskId
|
||||||
}
|
|
||||||
if (firstAddVisitTaskId) {
|
|
||||||
var taskIdx = this.visitTaskList.findIndex(i => i.VisitTaskId === firstAddVisitTaskId)
|
|
||||||
if (taskIdx > -1 && !this.visitTaskList[taskIdx].IsInit) {
|
|
||||||
loading = this.$loading({ fullscreen: true })
|
|
||||||
if (!this.visitTaskList[taskIdx].measureDataInit) {
|
|
||||||
await store.dispatch('reading/getMeasuredData', this.visitTaskList[taskIdx].VisitTaskId)
|
|
||||||
}
|
|
||||||
if (!this.visitTaskList[taskIdx].studyListInit) {
|
|
||||||
await store.dispatch('reading/getStudyInfo', { trialId: this.trialId, subjectVisitId: this.visitTaskList[taskIdx].VisitId, visitTaskId: this.visitTaskList[taskIdx].VisitTaskId, taskBlindName: this.visitTaskList[taskIdx].TaskBlindName })
|
|
||||||
}
|
|
||||||
if (!this.visitTaskList[taskIdx].readingQuestionsInit) {
|
|
||||||
await store.dispatch('reading/getReadingQuestionAndAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[taskIdx].VisitTaskId })
|
|
||||||
}
|
|
||||||
if (!this.visitTaskList[taskIdx].questionsInit) {
|
|
||||||
await store.dispatch('reading/getDicomReadingQuestionAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[taskIdx].VisitTaskId })
|
|
||||||
}
|
|
||||||
|
|
||||||
await store.dispatch('reading/setStatus', { visitTaskId: this.visitTaskList[taskIdx].VisitTaskId })
|
|
||||||
}
|
}
|
||||||
if (this.CriterionType === 3 && obj.lesionType === 7 && obj.fromMark) {
|
if (firstAddVisitTaskId) {
|
||||||
const measureDataInfo = Object.assign({}, obj)
|
var taskIdx = this.visitTaskList.findIndex(i => i.VisitTaskId === firstAddVisitTaskId)
|
||||||
measureDataInfo.lesionName = obj.fromMark
|
if (taskIdx > -1 && !this.visitTaskList[taskIdx].IsInit) {
|
||||||
firstAddSeries = this.getSeriesInfoByMark(firstAddVisitTaskId, measureDataInfo)
|
loading = this.$loading({ fullscreen: true })
|
||||||
} else {
|
if (!this.visitTaskList[taskIdx].measureDataInit) {
|
||||||
firstAddSeries = this.getSeriesInfoByMark(firstAddVisitTaskId, obj)
|
await store.dispatch('reading/getMeasuredData', this.visitTaskList[taskIdx].VisitTaskId)
|
||||||
}
|
}
|
||||||
}
|
if (!this.visitTaskList[taskIdx].studyListInit) {
|
||||||
// 获取当前访视病灶所在的序列
|
await store.dispatch('reading/getStudyInfo', { trialId: this.trialId, subjectVisitId: this.visitTaskList[taskIdx].VisitId, visitTaskId: this.visitTaskList[taskIdx].VisitTaskId, taskBlindName: this.visitTaskList[taskIdx].TaskBlindName })
|
||||||
currentAddSeries = this.getSeriesInfoByMark(activeCanvasTaskId, obj)
|
}
|
||||||
if (!firstAddSeries && currentAddSeries) {
|
if (!this.visitTaskList[taskIdx].readingQuestionsInit) {
|
||||||
// 存在首次出现的病灶及当前病灶
|
await store.dispatch('reading/getReadingQuestionAndAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[taskIdx].VisitTaskId })
|
||||||
firstAddSeries = currentAddSeries
|
}
|
||||||
} else if (!firstAddSeries && !currentAddSeries) {
|
if (!this.visitTaskList[taskIdx].questionsInit) {
|
||||||
// 当前新病灶,且未画标记则显示当前的序列信息,不做处理
|
await store.dispatch('reading/getDicomReadingQuestionAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[taskIdx].VisitTaskId })
|
||||||
loading && loading.close()
|
}
|
||||||
this.isScrollSync = isScrollSync
|
|
||||||
this.setToolToTarget(obj)
|
|
||||||
return
|
|
||||||
} else if (firstAddSeries && !currentAddSeries) {
|
|
||||||
// 当前访视序列与首次出现病灶的序列对齐
|
|
||||||
currentAddSeries = this.getLinkedSeries(firstAddSeries, activeCanvasTaskId)
|
|
||||||
|
|
||||||
|
await store.dispatch('reading/setStatus', { visitTaskId: this.visitTaskList[taskIdx].VisitTaskId })
|
||||||
|
}
|
||||||
|
if (this.CriterionType === 3 && obj.lesionType === 7 && obj.fromMark) {
|
||||||
|
const measureDataInfo = Object.assign({}, obj)
|
||||||
|
measureDataInfo.lesionName = obj.fromMark
|
||||||
|
firstAddSeries = this.getSeriesInfoByMark(firstAddVisitTaskId, measureDataInfo)
|
||||||
|
} else {
|
||||||
|
firstAddSeries = this.getSeriesInfoByMark(firstAddVisitTaskId, obj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 获取当前访视病灶所在的序列
|
||||||
|
currentAddSeries = this.getSeriesInfoByMark(activeCanvasTaskId, obj)
|
||||||
|
if (!firstAddSeries && currentAddSeries) {
|
||||||
|
// 存在首次出现的病灶及当前病灶
|
||||||
|
firstAddSeries = currentAddSeries
|
||||||
|
} else if (!firstAddSeries && !currentAddSeries) {
|
||||||
|
// 当前新病灶,且未画标记则显示当前的序列信息,不做处理
|
||||||
|
loading && loading.close()
|
||||||
|
this.isScrollSync = isScrollSync
|
||||||
|
this.setToolToTarget(obj)
|
||||||
|
resolve()
|
||||||
|
return
|
||||||
|
} else if (firstAddSeries && !currentAddSeries) {
|
||||||
|
// 当前访视序列与首次出现病灶的序列对齐
|
||||||
|
currentAddSeries = this.getLinkedSeries(firstAddSeries, activeCanvasTaskId)
|
||||||
|
|
||||||
|
if (!currentAddSeries) {
|
||||||
|
// 未找到对齐的,则就显示当前最后一个窗口现实的序列信息
|
||||||
|
currentAddSeries = this.$refs[`dicomCanvas${this.maxCanvas - 1}`][0].series
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 无序
|
||||||
|
currentAddSeries = this.getSeriesInfoByMark(activeCanvasTaskId, obj)
|
||||||
if (!currentAddSeries) {
|
if (!currentAddSeries) {
|
||||||
// 未找到对齐的,则就显示当前最后一个窗口现实的序列信息
|
// 未找到对齐的,则就显示当前最后一个窗口现实的序列信息
|
||||||
currentAddSeries = this.$refs[`dicomCanvas${this.maxCanvas - 1}`][0].series
|
currentAddSeries = this.$refs[`dicomCanvas${this.maxCanvas - 1}`][0].series
|
||||||
}
|
}
|
||||||
|
firstAddSeries = currentAddSeries
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// 无序
|
|
||||||
currentAddSeries = this.getSeriesInfoByMark(activeCanvasTaskId, obj)
|
|
||||||
if (!currentAddSeries) {
|
|
||||||
// 未找到对齐的,则就显示当前最后一个窗口现实的序列信息
|
|
||||||
currentAddSeries = this.$refs[`dicomCanvas${this.maxCanvas - 1}`][0].series
|
|
||||||
}
|
|
||||||
firstAddSeries = currentAddSeries
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < this.maxCanvas; i++) {
|
for (let i = 0; i < this.maxCanvas; i++) {
|
||||||
if (i === this.maxCanvas - 1) {
|
if (i === this.maxCanvas - 1) {
|
||||||
loadImagePromises.push(this.$refs[`dicomCanvas${i}`][0].loadImageStack(currentAddSeries))
|
loadImagePromises.push(this.$refs[`dicomCanvas${i}`][0].loadImageStack(currentAddSeries))
|
||||||
this.currentDicomCanvasIndex = i
|
this.currentDicomCanvasIndex = i
|
||||||
this.activeSeries = currentAddSeries
|
this.activeSeries = currentAddSeries
|
||||||
store.dispatch('reading/setActiveSeries', currentAddSeries)
|
store.dispatch('reading/setActiveSeries', currentAddSeries)
|
||||||
} else {
|
} else {
|
||||||
loadImagePromises.push(this.$refs[`dicomCanvas${i}`][0].loadImageStack(firstAddSeries))
|
loadImagePromises.push(this.$refs[`dicomCanvas${i}`][0].loadImageStack(firstAddSeries))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
Promise.all(loadImagePromises)
|
||||||
Promise.all(loadImagePromises)
|
.then(() => {
|
||||||
.then(() => {
|
this.isScrollSync = isScrollSync
|
||||||
this.isScrollSync = isScrollSync
|
this.setToolToTarget(obj)
|
||||||
this.setToolToTarget(obj)
|
resolve()
|
||||||
})
|
}).catch(() => {
|
||||||
if (loading) {
|
resolve()
|
||||||
loading.close()
|
})
|
||||||
}
|
if (loading) {
|
||||||
|
loading.close()
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
setToolToTarget(obj) {
|
setToolToTarget(obj) {
|
||||||
if (obj.readingTaskState < 2 && obj.markTool && !obj.isMarked) {
|
if (obj.readingTaskState < 2 && obj.markTool && !obj.isMarked) {
|
||||||
|
@ -1440,7 +1563,6 @@ export default {
|
||||||
if (!this.wwwcList[this.currentDicomCanvasIndex]) {
|
if (!this.wwwcList[this.currentDicomCanvasIndex]) {
|
||||||
this.wwwcList[this.currentDicomCanvasIndex] = '1'
|
this.wwwcList[this.currentDicomCanvasIndex] = '1'
|
||||||
}
|
}
|
||||||
// var stack = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].stack
|
|
||||||
this.$refs['container'].focus()
|
this.$refs['container'].focus()
|
||||||
// if (stack.studyId) {
|
// if (stack.studyId) {
|
||||||
// DicomEvent.$emit('toggleVisitList', stack)
|
// DicomEvent.$emit('toggleVisitList', stack)
|
||||||
|
@ -1569,8 +1691,24 @@ export default {
|
||||||
this.$refs['measurementList'].modifyMeasuredData(data)
|
this.$refs['measurementList'].modifyMeasuredData(data)
|
||||||
this.activeTool = ''
|
this.activeTool = ''
|
||||||
},
|
},
|
||||||
saveImage() {
|
async saveImage() {
|
||||||
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].saveImage()
|
// this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].saveImage()
|
||||||
|
// canvas为转换后的Canvas对象
|
||||||
|
const divForDownloadViewport = document.querySelector(
|
||||||
|
`div[data-canvas-uid="dicomCanvas${this.currentDicomCanvasIndex}"]`
|
||||||
|
)
|
||||||
|
var canvas = await html2canvas(divForDownloadViewport)
|
||||||
|
let oImg = new Image()
|
||||||
|
oImg = canvas.toDataURL('image/png', 1)// 导出图片
|
||||||
|
var oA = document.createElement('a')
|
||||||
|
var subjectCode = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].subjectCode
|
||||||
|
var taskBlindName = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].stack.taskBlindName
|
||||||
|
var timestamp = Date.now()
|
||||||
|
oA.download = `${subjectCode}_${taskBlindName}_${timestamp}`// 设置下载的文件名,默认是'下载'
|
||||||
|
oA.href = oImg
|
||||||
|
document.body.appendChild(oA)
|
||||||
|
oA.click()
|
||||||
|
oA.remove() // 下载之后把创建的元素删除
|
||||||
},
|
},
|
||||||
// 设置窗宽/窗位
|
// 设置窗宽/窗位
|
||||||
setDicomCanvasWwwc(v) {
|
setDicomCanvasWwwc(v) {
|
||||||
|
@ -1591,6 +1729,9 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
setCustomWwwc() {
|
setCustomWwwc() {
|
||||||
|
var wwwc = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].dicomInfo.wwwc
|
||||||
|
this.activeCanvasWW = wwwc ? parseInt(wwwc.split('/')[0]) : null
|
||||||
|
this.activeCanvasWC = wwwc ? parseInt(wwwc.split('/')[1]) : null
|
||||||
this.customWwc.visible = true
|
this.customWwc.visible = true
|
||||||
},
|
},
|
||||||
setWwwc(v) {
|
setWwwc(v) {
|
||||||
|
@ -1737,11 +1878,11 @@ export default {
|
||||||
li{
|
li{
|
||||||
a{
|
a{
|
||||||
display: block;
|
display: block;
|
||||||
padding: 5px 0px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ul li:hover a{
|
ul li:hover{
|
||||||
background-color: #727272;
|
background-color: #727272;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1842,8 +1983,9 @@ export default {
|
||||||
border: 1px solid rgba(255, 255, 255, 0.21);
|
border: 1px solid rgba(255, 255, 255, 0.21);
|
||||||
position: relative;
|
position: relative;
|
||||||
&_active{
|
&_active{
|
||||||
// border: 2px solid #ffeb3b;fff
|
// border: 2px solid #ffeb3b;fff;#428bca
|
||||||
border: 1px dashed #428bca;
|
// border: 1.5px dashed #ffeb3b;
|
||||||
|
border: 1px dashed rgb(250, 250, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1880,12 +2022,12 @@ export default {
|
||||||
|
|
||||||
}
|
}
|
||||||
.personal_config {
|
.personal_config {
|
||||||
>>>.el-tabs__content{
|
/deep/ .el-tabs__content{
|
||||||
height: 450px;
|
height: 450px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
>>>.manuals-dialog-container{
|
/deep/ .manuals-dialog-container{
|
||||||
margin-top: 50px !important;
|
margin-top: 50px !important;
|
||||||
width:75%;
|
width:75%;
|
||||||
height:80%;
|
height:80%;
|
||||||
|
@ -1897,7 +2039,7 @@ export default {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
>>>.manuals-full-dialog-container{
|
/deep/ .manuals-full-dialog-container{
|
||||||
.el-dialog__body{
|
.el-dialog__body{
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
height: calc(100% - 50px) !important;
|
height: calc(100% - 50px) !important;
|
||||||
|
@ -1906,5 +2048,43 @@ export default {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.petct_wrapper{
|
||||||
|
position: absolute;
|
||||||
|
left: -205px;
|
||||||
|
right: 345px;
|
||||||
|
height: 100%;
|
||||||
|
background-color: #000000;
|
||||||
}
|
}
|
||||||
|
.series-table{
|
||||||
|
/deep/.el-table{
|
||||||
|
background-color: #1e1e1e !important;
|
||||||
|
color: #dfdfdf;
|
||||||
|
}
|
||||||
|
/deep/.el-table td.el-table__cell, .el-table th.el-table__cell.is-leaf{
|
||||||
|
border-bottom: 1px solid #dfdfdf;
|
||||||
|
}
|
||||||
|
.el-table--border::after, .el-table--group::after, .el-table::before{
|
||||||
|
background-color: #1e1e1e;
|
||||||
|
}
|
||||||
|
/deep/.el-table__header-wrapper{
|
||||||
|
th{
|
||||||
|
background-color: #1e1e1e !important;
|
||||||
|
color: #dfdfdf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/deep/.el-table__body-wrapper{
|
||||||
|
tr{
|
||||||
|
background-color: #1e1e1e !important;
|
||||||
|
color: #dfdfdf;
|
||||||
|
}
|
||||||
|
tr:hover > td{
|
||||||
|
background-color: #1e1e1e !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/deep/.el-table__empty-block{
|
||||||
|
background-color: #1e1e1e !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -479,10 +479,7 @@ export default {
|
||||||
//
|
//
|
||||||
if ((this.isBaseLineTask || this.questionForm.IsDicomReading === false) && this.questionForm.MeasureData && this.questionForm.MeasureData.type === 'ArrowAnnotate' && v === 0) {
|
if ((this.isBaseLineTask || this.questionForm.IsDicomReading === false) && this.questionForm.MeasureData && this.questionForm.MeasureData.type === 'ArrowAnnotate' && v === 0) {
|
||||||
// 当前病灶不允许设置为靶病灶
|
// 当前病灶不允许设置为靶病灶
|
||||||
let msg = this.$t('trials:reading:warnning:msg15')
|
this.$confirm(this.$t(' trials:reading:warnning:msg15'), {
|
||||||
const criterionName = this.$route.query.criterionName
|
|
||||||
msg = msg.replace('***', criterionName)
|
|
||||||
this.$confirm(msg, {
|
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
distinguishCancelAndClose: true
|
distinguishCancelAndClose: true
|
||||||
})
|
})
|
||||||
|
@ -495,8 +492,6 @@ export default {
|
||||||
var idx = this.tableQuestions.findIndex(item => item.LesionType === v)
|
var idx = this.tableQuestions.findIndex(item => item.LesionType === v)
|
||||||
if (idx > -1 && !!this.tableQuestions[idx].MaxQuestionCount && this.tableQuestions[idx].MaxQuestionCount <= this.tableQuestions[idx].TableQuestions.Answers.length) {
|
if (idx > -1 && !!this.tableQuestions[idx].MaxQuestionCount && this.tableQuestions[idx].MaxQuestionCount <= this.tableQuestions[idx].TableQuestions.Answers.length) {
|
||||||
let msg = this.$t('trials:reading:warnning:msg14')
|
let msg = this.$t('trials:reading:warnning:msg14')
|
||||||
const criterionName = this.$route.query.criterionName
|
|
||||||
msg = msg.replace('***', criterionName)
|
|
||||||
// msg = msg.replace('xxx', this.tableQuestions[idx].QuestionName)
|
// msg = msg.replace('xxx', this.tableQuestions[idx].QuestionName)
|
||||||
msg = msg.replace('xxx', this.tableQuestions[idx].MaxQuestionCount)
|
msg = msg.replace('xxx', this.tableQuestions[idx].MaxQuestionCount)
|
||||||
this.$confirm(msg, {
|
this.$confirm(msg, {
|
||||||
|
@ -524,7 +519,7 @@ export default {
|
||||||
item.Answer = this.questionForm[item.Id]
|
item.Answer = this.questionForm[item.Id]
|
||||||
arr.push(item)
|
arr.push(item)
|
||||||
})
|
})
|
||||||
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionType: this.lesionType }
|
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }
|
||||||
|
|
||||||
DicomEvent.$emit('imageLocation', obj)
|
DicomEvent.$emit('imageLocation', obj)
|
||||||
var type = null
|
var type = null
|
||||||
|
@ -895,11 +890,6 @@ export default {
|
||||||
async uploadScreenshots(fileName, file) {
|
async uploadScreenshots(fileName, file) {
|
||||||
try {
|
try {
|
||||||
file = this.convertBase64ToBlob(file)
|
file = this.convertBase64ToBlob(file)
|
||||||
// const formData = new FormData()
|
|
||||||
// formData.append('file', file)
|
|
||||||
// const result = await uploadPrintscreen(formData, this.$route.query.subjectId)
|
|
||||||
// result.url = result.Result.Path
|
|
||||||
// const result = await this.OSSclient.put(`${fileName}.png`, file)
|
|
||||||
var trialId = this.$route.query.trialId
|
var trialId = this.$route.query.trialId
|
||||||
var subjectId = this.$route.query.trialId
|
var subjectId = this.$route.query.trialId
|
||||||
const result = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${fileName}.png`, file)
|
const result = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${fileName}.png`, file)
|
||||||
|
@ -1967,77 +1957,75 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DicomEvent.$emit('getScreenshots', async val => {
|
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }, async val => {
|
||||||
// 靶病灶状态为0(存在)时,一定存在长径或者长短径(长径、十字线 )
|
// 靶病灶状态为0(存在)时,一定存在长径或者长短径(长径、十字线 )
|
||||||
// 普通靶病灶:长径大于10mm且不小于2倍层厚(基线校验)
|
// 普通靶病灶:长径大于10mm且不小于2倍层厚(基线校验)
|
||||||
// 淋巴结靶病灶:短径大于15mm且不小于2倍层厚(基线校验)
|
// 淋巴结靶病灶:短径大于15mm且不小于2倍层厚(基线校验)
|
||||||
var picturePath = ''
|
var picturePath = ''
|
||||||
if (val) {
|
if (val && measureData && this.questionForm.IsDicomReading) {
|
||||||
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
|
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
|
||||||
|
picturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
|
||||||
picturePath = pictureObj.isSuccess ? pictureObj.result.url : ''
|
}
|
||||||
|
var answers = []
|
||||||
var answers = []
|
var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/)
|
||||||
var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/)
|
for (const k in this.questionForm) {
|
||||||
for (const k in this.questionForm) {
|
if (reg.test(k)) {
|
||||||
if (reg.test(k)) {
|
if (answers.findIndex(i => i.tableQuestionId === k) === -1) {
|
||||||
if (answers.findIndex(i => i.tableQuestionId === k) === -1) {
|
answers.push({ tableQuestionId: k, answer: this.questionForm[k] })
|
||||||
answers.push({ tableQuestionId: k, answer: this.questionForm[k] })
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var params = {
|
|
||||||
questionId: this.parentQsId,
|
|
||||||
rowId: this.questionForm.RowId,
|
|
||||||
rowIndex: this.answers.RowIndex,
|
|
||||||
visitTaskId: this.visitTaskId,
|
|
||||||
trialId: this.trialId,
|
|
||||||
measureData: measureData ? JSON.stringify(measureData) : '',
|
|
||||||
answerList: answers,
|
|
||||||
isCanEditPosition: this.questionForm.IsCanEditPosition,
|
|
||||||
studyId: measureData ? this.questionForm.MeasureData.studyId : '',
|
|
||||||
seriesId: measureData ? this.questionForm.MeasureData.seriesId : '',
|
|
||||||
instanceId: measureData ? this.questionForm.MeasureData.instanceId : '',
|
|
||||||
numberOfFrames: measureData && !isNaN(parseInt(this.questionForm.MeasureData.frame)) ? parseInt(this.questionForm.MeasureData.frame) : 0,
|
|
||||||
picturePath: picturePath,
|
|
||||||
organInfoId: this.questionForm.OrganInfoId,
|
|
||||||
markTool: measureData ? measureData.type : '',
|
|
||||||
fromMark: this.answers.FromMark,
|
|
||||||
reportMark: this.answers.FromMark
|
|
||||||
}
|
|
||||||
if (this.questionForm.IsDicomReading === false) {
|
|
||||||
params.isDicomReading = false
|
|
||||||
}
|
|
||||||
if (this.deleteInfo) {
|
|
||||||
await this.deleteOldLesion(this.deleteInfo.rowId)
|
|
||||||
this.deleteInfo = null
|
|
||||||
params.rowId = ''
|
|
||||||
}
|
|
||||||
submitTableQuestion(params).then(async res => {
|
|
||||||
// 保存成功!
|
|
||||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
|
||||||
this.currentMarkTool = measureData ? measureData.type : ''
|
|
||||||
// saveTypeEnum 0:未保存过(新建病灶);1:已保存,信息不完整(随访初始化病灶/分裂病灶,通过状态判断);2:已保存,信息完整
|
|
||||||
|
|
||||||
this.$set(this.questionForm, 'saveTypeEnum', 2)
|
|
||||||
this.originalQuestionForm = { ...this.questionForm }
|
|
||||||
loading.close()
|
|
||||||
var isLymphLesion = this.getQuestionVal(2)
|
|
||||||
isLymphLesion = isLymphLesion ? parseInt(isLymphLesion) : null
|
|
||||||
var lesionOrgan = this.getQuestionVal(6)
|
|
||||||
this.$set(this.questionForm, 'RowId', res.Result.RowId)
|
|
||||||
const lesionPart = this.getQuestionVal(8)
|
|
||||||
const lesionState = Number(this.getQuestionVal(7))
|
|
||||||
this.$emit('resetQuestions', { isLymphLesion, lesionPart, lesionOrgan, lesionShort, saveTypeEnum: this.questionForm.saveTypeEnum, lesionLength, lesionState, rowIndex: this.rowIndex, rowId: res.Result.RowId, questionId: this.parentQsId, anwsers: this.questionForm })
|
|
||||||
|
|
||||||
// await store.dispatch('reading/refreshMeasuredData', this.visitTaskId)
|
|
||||||
// DicomEvent.$emit('getMeasureData')
|
|
||||||
this.$emit('close')
|
|
||||||
DicomEvent.$emit('getReportInfo', true)
|
|
||||||
DicomEvent.$emit('setMeasuredToolsPassive')
|
|
||||||
}).catch(() => { loading.close() })
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var params = {
|
||||||
|
questionId: this.parentQsId,
|
||||||
|
rowId: this.questionForm.RowId,
|
||||||
|
rowIndex: this.answers.RowIndex,
|
||||||
|
visitTaskId: this.visitTaskId,
|
||||||
|
trialId: this.trialId,
|
||||||
|
measureData: measureData ? JSON.stringify(measureData) : '',
|
||||||
|
answerList: answers,
|
||||||
|
isCanEditPosition: this.questionForm.IsCanEditPosition,
|
||||||
|
studyId: measureData ? this.questionForm.MeasureData.studyId : '',
|
||||||
|
seriesId: measureData ? this.questionForm.MeasureData.seriesId : '',
|
||||||
|
instanceId: measureData ? this.questionForm.MeasureData.instanceId : '',
|
||||||
|
numberOfFrames: measureData && !isNaN(parseInt(this.questionForm.MeasureData.frame)) ? parseInt(this.questionForm.MeasureData.frame) : 0,
|
||||||
|
picturePath: picturePath,
|
||||||
|
organInfoId: this.questionForm.OrganInfoId,
|
||||||
|
markTool: measureData ? measureData.type : '',
|
||||||
|
fromMark: this.answers.FromMark,
|
||||||
|
reportMark: this.answers.FromMark
|
||||||
|
}
|
||||||
|
if (this.questionForm.IsDicomReading === false) {
|
||||||
|
params.isDicomReading = false
|
||||||
|
}
|
||||||
|
if (this.deleteInfo) {
|
||||||
|
await this.deleteOldLesion(this.deleteInfo.rowId)
|
||||||
|
this.deleteInfo = null
|
||||||
|
params.rowId = ''
|
||||||
|
}
|
||||||
|
submitTableQuestion(params).then(async res => {
|
||||||
|
// 保存成功!
|
||||||
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
|
this.currentMarkTool = measureData ? measureData.type : ''
|
||||||
|
// saveTypeEnum 0:未保存过(新建病灶);1:已保存,信息不完整(随访初始化病灶/分裂病灶,通过状态判断);2:已保存,信息完整
|
||||||
|
|
||||||
|
this.$set(this.questionForm, 'saveTypeEnum', 2)
|
||||||
|
this.originalQuestionForm = { ...this.questionForm }
|
||||||
|
loading.close()
|
||||||
|
var isLymphLesion = this.getQuestionVal(2)
|
||||||
|
isLymphLesion = isLymphLesion ? parseInt(isLymphLesion) : null
|
||||||
|
var lesionOrgan = this.getQuestionVal(6)
|
||||||
|
this.$set(this.questionForm, 'RowId', res.Result.RowId)
|
||||||
|
const lesionPart = this.getQuestionVal(8)
|
||||||
|
const lesionState = Number(this.getQuestionVal(7))
|
||||||
|
this.$emit('resetQuestions', { isLymphLesion, lesionPart, lesionOrgan, lesionShort, saveTypeEnum: this.questionForm.saveTypeEnum, lesionLength, lesionState, rowIndex: this.rowIndex, rowId: res.Result.RowId, questionId: this.parentQsId, anwsers: this.questionForm })
|
||||||
|
|
||||||
|
// await store.dispatch('reading/refreshMeasuredData', this.visitTaskId)
|
||||||
|
// DicomEvent.$emit('getMeasureData')
|
||||||
|
this.$emit('close')
|
||||||
|
DicomEvent.$emit('getReportInfo', true)
|
||||||
|
DicomEvent.$emit('setMeasuredToolsPassive')
|
||||||
|
}).catch(() => { loading.close() })
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -2208,29 +2196,29 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.measurement-form{
|
.measurement-form{
|
||||||
>>>.el-form-item__label{
|
/deep/ .el-form-item__label{
|
||||||
color: #c3c3c3;
|
color: #c3c3c3;
|
||||||
}
|
}
|
||||||
>>>.el-input .el-input__inner{
|
/deep/ .el-input .el-input__inner{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border: 1px solid #5e5e5e;
|
border: 1px solid #5e5e5e;
|
||||||
}
|
}
|
||||||
>>>.el-form-item{
|
/deep/ .el-form-item{
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
}
|
}
|
||||||
>>>.el-form-item__content{
|
/deep/ .el-form-item__content{
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
>>>.el-input.is-disabled .el-input__inner{
|
/deep/ .el-input.is-disabled .el-input__inner{
|
||||||
background-color: #646464a1;
|
background-color: #646464a1;
|
||||||
}
|
}
|
||||||
>>>.el-select.is-disabled .el-input__inner{
|
/deep/ .el-select.is-disabled .el-input__inner{
|
||||||
background-color: #646464a1;
|
background-color: #646464a1;
|
||||||
}
|
}
|
||||||
>>>.el-button--mini, .el-button--mini.is-round {
|
/deep/ .el-button--mini, .el-button--mini.is-round {
|
||||||
padding: 7px 10px;
|
padding: 7px 10px;
|
||||||
}
|
}
|
||||||
.el-form-item__content
|
.el-form-item__content
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<div class="container" :style="{'height':height+'px'}">
|
<div class="container" :style="{'height':height+'px'}">
|
||||||
<h3 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
<h3 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
||||||
<span v-if="subjectCode">{{ subjectCode }} </span>
|
<span v-if="subjectCode">{{ subjectCode }} </span>
|
||||||
<span style="margin-left:5px;">{{ taskName }}</span>
|
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
||||||
</h3>
|
</h3>
|
||||||
<!-- 非测量问题 -->
|
<!-- 非测量问题 -->
|
||||||
<div class="lesions">
|
<div class="lesions">
|
||||||
|
@ -71,7 +71,7 @@
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<div style="position: absolute;left: 62px;top: 2px;">
|
<div style="position: absolute;left: 62px;top: 2px;">
|
||||||
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
|
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
|
||||||
<div style="font-size: 10px;width:220px;height: 30px;">
|
<div style="font-size: 11px;width:220px;height: 30px;">
|
||||||
<div
|
<div
|
||||||
v-if="item.TableQuestions.Answers[i].lesionPart"
|
v-if="item.TableQuestions.Answers[i].lesionPart"
|
||||||
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
|
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
|
||||||
|
@ -207,7 +207,6 @@ export default {
|
||||||
readingTaskState: 2,
|
readingTaskState: 2,
|
||||||
isBaseLineTask: false,
|
isBaseLineTask: false,
|
||||||
taskBlindName: '',
|
taskBlindName: '',
|
||||||
taskName: '',
|
|
||||||
tableQuestions: [],
|
tableQuestions: [],
|
||||||
isFirstRender: false,
|
isFirstRender: false,
|
||||||
criterionType: null,
|
criterionType: null,
|
||||||
|
@ -272,7 +271,6 @@ export default {
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
this.visitTaskId = this.visitTaskList[i].VisitTaskId
|
this.visitTaskId = this.visitTaskList[i].VisitTaskId
|
||||||
this.taskBlindName = this.visitTaskList[i].TaskBlindName
|
this.taskBlindName = this.visitTaskList[i].TaskBlindName
|
||||||
this.taskName = this.visitTaskList[i].TaskName
|
|
||||||
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
||||||
this.isBaseLineTask = this.visitTaskList[i].IsBaseLineTask
|
this.isBaseLineTask = this.visitTaskList[i].IsBaseLineTask
|
||||||
this.isCurrentTask = this.visitTaskList[i].IsCurrentTask
|
this.isCurrentTask = this.visitTaskList[i].IsCurrentTask
|
||||||
|
@ -735,8 +733,6 @@ export default {
|
||||||
if (!!qs.MaxQuestionCount && qs.MaxQuestionCount <= qs.TableQuestions.Answers.length) {
|
if (!!qs.MaxQuestionCount && qs.MaxQuestionCount <= qs.TableQuestions.Answers.length) {
|
||||||
let msg = this.$t('trials:reading:warnning:msg14')
|
let msg = this.$t('trials:reading:warnning:msg14')
|
||||||
// msg = msg.replace('xxx', qs.QuestionName)
|
// msg = msg.replace('xxx', qs.QuestionName)
|
||||||
const criterionName = this.$route.query.criterionName
|
|
||||||
msg = msg.replace('***', criterionName)
|
|
||||||
msg = msg.replace('xxx', qs.MaxQuestionCount)
|
msg = msg.replace('xxx', qs.MaxQuestionCount)
|
||||||
this.$confirm(msg, {
|
this.$confirm(msg, {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
|
@ -1021,7 +1017,7 @@ export default {
|
||||||
// 判断是否存在测量数据
|
// 判断是否存在测量数据
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
const refName = `${this.activeItem.activeCollapseId}_${this.activeItem.activeRowIndex}`
|
const refName = `${this.activeItem.activeCollapseId}_${this.activeItem.activeRowIndex}`
|
||||||
if ((this.$refs[refName][0].questionForm && this.$refs[refName][0].questionForm.MeasureData && measureData.data.uuid === this.$refs[refName][0].questionForm.MeasureData.data.uuid) || !this.$refs[refName][0].questionForm.MeasureData) {
|
if (!this.$refs[refName][0].questionForm.MeasureData || (this.$refs[refName][0].questionForm && this.$refs[refName][0].questionForm.MeasureData && measureData.data.uuid === this.$refs[refName][0].questionForm.MeasureData.data.uuid)) {
|
||||||
this.$refs[refName][0].setMeasureData(measureData)
|
this.$refs[refName][0].setMeasureData(measureData)
|
||||||
} else {
|
} else {
|
||||||
if (this.isBaseLineTask) {
|
if (this.isBaseLineTask) {
|
||||||
|
@ -1177,12 +1173,12 @@ export default {
|
||||||
.el-collapse{
|
.el-collapse{
|
||||||
border-bottom:none;
|
border-bottom:none;
|
||||||
border-top:none;
|
border-top:none;
|
||||||
>>>.el-collapse-item{
|
/deep/ .el-collapse-item{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__header{
|
/deep/ .el-collapse-item__header{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border-bottom-color:#5a5a5a;
|
border-bottom-color:#5a5a5a;
|
||||||
|
@ -1190,11 +1186,11 @@ export default {
|
||||||
height: 35px;
|
height: 35px;
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__wrap{
|
/deep/ .el-collapse-item__wrap{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__content{
|
/deep/ .el-collapse-item__content{
|
||||||
width:260px;
|
width:260px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0px;
|
top: 0px;
|
||||||
|
|
|
@ -79,7 +79,6 @@
|
||||||
import { on, off } from 'element-ui/src/utils/dom'
|
import { on, off } from 'element-ui/src/utils/dom'
|
||||||
import { rafThrottle, isFirefox } from 'element-ui/src/utils/util'
|
import { rafThrottle, isFirefox } from 'element-ui/src/utils/util'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
// import Vue from 'vue'
|
|
||||||
const mousewheelEventName = isFirefox() ? 'DOMMouseScroll' : 'mousewheel'
|
const mousewheelEventName = isFirefox() ? 'DOMMouseScroll' : 'mousewheel'
|
||||||
var ctx = '' // 画布上下文
|
var ctx = '' // 画布上下文
|
||||||
export default {
|
export default {
|
||||||
|
@ -243,10 +242,8 @@ export default {
|
||||||
this.isInit = true
|
this.isInit = true
|
||||||
}
|
}
|
||||||
const img = new Image() // 创建img标签
|
const img = new Image() // 创建img标签
|
||||||
|
|
||||||
img.src = this.OSSclientConfig.basePath + this.imgUrl // 添加src
|
img.src = this.OSSclientConfig.basePath + this.imgUrl // 添加src
|
||||||
img.setAttribute('crossorigin', 'anonymous')
|
img.setAttribute('crossorigin', 'anonymous')
|
||||||
// img.crossorigin = 'anonymous'
|
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
img.onload = () => {
|
img.onload = () => {
|
||||||
this.currentImg = img
|
this.currentImg = img
|
||||||
|
@ -479,7 +476,7 @@ export default {
|
||||||
e.data.handles.start.x,
|
e.data.handles.start.x,
|
||||||
e.data.handles.start.y,
|
e.data.handles.start.y,
|
||||||
e.data.handles.end.x - e.data.handles.start.x,
|
e.data.handles.end.x - e.data.handles.start.x,
|
||||||
e.data.handles.end.y - e.data.handles.start.y,
|
e.data.handles.end.y - e.data.handles.start.y
|
||||||
)
|
)
|
||||||
this.drawText(ctx, { x: e.data.handles.start.x, y: e.data.handles.start.y }, { x: e.data.handles.end.x, y: e.data.handles.end.y }, e.data.remark, this.color)
|
this.drawText(ctx, { x: e.data.handles.start.x, y: e.data.handles.start.y }, { x: e.data.handles.end.x, y: e.data.handles.end.y }, e.data.remark, this.color)
|
||||||
}
|
}
|
||||||
|
@ -511,10 +508,6 @@ export default {
|
||||||
y: e.offsetY
|
y: e.offsetY
|
||||||
}
|
}
|
||||||
// 向主窗体发送测量数据
|
// 向主窗体发送测量数据
|
||||||
// 获取截图
|
|
||||||
const canvas = document.querySelector('canvas')
|
|
||||||
var pictureBaseStr = canvas.toDataURL('image/png', 1)
|
|
||||||
this.currentDrawData.pictureBaseStr = pictureBaseStr
|
|
||||||
var data = { type: 'setMeasurement', data: this.currentDrawData }
|
var data = { type: 'setMeasurement', data: this.currentDrawData }
|
||||||
window.opener.postMessage(data, window.location)
|
window.opener.postMessage(data, window.location)
|
||||||
},
|
},
|
||||||
|
@ -584,7 +577,6 @@ export default {
|
||||||
)
|
)
|
||||||
this.drawText(ctx, { x: this.canvasMouseStart.x, y: this.canvasMouseStart.y }, { x: e.offsetX, y: e.offsetY }, this.lesionName, this.color)
|
this.drawText(ctx, { x: this.canvasMouseStart.x, y: this.canvasMouseStart.y }, { x: e.offsetX, y: e.offsetY }, this.lesionName, this.color)
|
||||||
// 生成矩形数据
|
// 生成矩形数据
|
||||||
console.log(this.imgId)
|
|
||||||
this.currentDrawData = {
|
this.currentDrawData = {
|
||||||
isDicomReading: false,
|
isDicomReading: false,
|
||||||
studyId: this.studyId,
|
studyId: this.studyId,
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
}"
|
}"
|
||||||
@click="selected(index)"
|
@click="selected(index)"
|
||||||
>
|
>
|
||||||
<img :title="item.FileName" :src="OSSclientConfig.basePath +`${item.PreviewPath}`" crossorigin="anonymous">
|
<img :title="item.FileName" :src="`${OSSclientConfig.basePath + item.Path}`" crossorigin="anonymous">
|
||||||
<p v-if="item.FileName" class="item-date">
|
<p v-if="item.FileName" class="item-date">
|
||||||
{{ `${index+1}` }}
|
{{ `${index+1}` }}
|
||||||
</p>
|
</p>
|
||||||
|
|
|
@ -268,6 +268,7 @@ export default {
|
||||||
lesionName: '',
|
lesionName: '',
|
||||||
isCurrentTaskAdd: 'False',
|
isCurrentTaskAdd: 'False',
|
||||||
splitOrMergeLesionName: '',
|
splitOrMergeLesionName: '',
|
||||||
|
lesionMark: '',
|
||||||
pictureBaseStr: '',
|
pictureBaseStr: '',
|
||||||
digitPlaces: 0,
|
digitPlaces: 0,
|
||||||
focusQs: null,
|
focusQs: null,
|
||||||
|
@ -362,6 +363,7 @@ export default {
|
||||||
this.getOrganInfoList()
|
this.getOrganInfoList()
|
||||||
this.lesionName = this.getLesionInfo(this.orderMark, this.rowIndex)
|
this.lesionName = this.getLesionInfo(this.orderMark, this.rowIndex)
|
||||||
this.isCurrentTaskAdd = this.answers.IsCurrentTaskAdd ? this.answers.IsCurrentTaskAdd : 'True'
|
this.isCurrentTaskAdd = this.answers.IsCurrentTaskAdd ? this.answers.IsCurrentTaskAdd : 'True'
|
||||||
|
this.lesionMark = this.getLesionName(this.orderMark, this.questionForm.RowIndex)
|
||||||
this.isRender = true
|
this.isRender = true
|
||||||
},
|
},
|
||||||
getLesionName(orderMark, rowIndex) {
|
getLesionName(orderMark, rowIndex) {
|
||||||
|
@ -581,10 +583,6 @@ export default {
|
||||||
async uploadScreenshots(fileName, file) {
|
async uploadScreenshots(fileName, file) {
|
||||||
try {
|
try {
|
||||||
file = this.convertBase64ToBlob(file)
|
file = this.convertBase64ToBlob(file)
|
||||||
// const formData = new FormData()
|
|
||||||
// formData.append('file', file)
|
|
||||||
// const result = await uploadPrintscreen(formData, this.$route.query.subjectId)
|
|
||||||
// result.url = result.Result.Path
|
|
||||||
var trialId = this.$route.query.trialId
|
var trialId = this.$route.query.trialId
|
||||||
var subjectId = this.$route.query.trialId
|
var subjectId = this.$route.query.trialId
|
||||||
const result = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${fileName}.png`, file)
|
const result = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${fileName}.png`, file)
|
||||||
|
@ -692,11 +690,11 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const loading = this.$loading({ fullscreen: true })
|
const loading = this.$loading({ fullscreen: true })
|
||||||
DicomEvent.$emit('getScreenshots', async val => {
|
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }, async val => {
|
||||||
var picturePath = ''
|
var picturePath = ''
|
||||||
if (val) {
|
if (val && measureData) {
|
||||||
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
|
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
|
||||||
picturePath = pictureObj.isSuccess ? pictureObj.result.url : ''
|
picturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
|
||||||
}
|
}
|
||||||
var answers = []
|
var answers = []
|
||||||
var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/)
|
var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/)
|
||||||
|
@ -879,26 +877,26 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.measurement-form{
|
.measurement-form{
|
||||||
>>>.el-form-item__label{
|
/deep/ .el-form-item__label{
|
||||||
color: #c3c3c3;
|
color: #c3c3c3;
|
||||||
}
|
}
|
||||||
>>>.el-input .el-input__inner{
|
/deep/ .el-input .el-input__inner{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border: 1px solid #5e5e5e;
|
border: 1px solid #5e5e5e;
|
||||||
}
|
}
|
||||||
>>>.el-form-item{
|
/deep/ .el-form-item{
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
}
|
}
|
||||||
>>>.el-form-item__content{
|
/deep/ .el-form-item__content{
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
>>>.el-input.is-disabled .el-input__inner{
|
/deep/ .el-input.is-disabled .el-input__inner{
|
||||||
background-color: #646464a1;
|
background-color: #646464a1;
|
||||||
}
|
}
|
||||||
>>>.el-select.is-disabled .el-input__inner{
|
/deep/ .el-select.is-disabled .el-input__inner{
|
||||||
background-color: #646464a1;
|
background-color: #646464a1;
|
||||||
}
|
}
|
||||||
.el-form-item__content
|
.el-form-item__content
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<div class="container" :style="{'height':height+'px'}">
|
<div class="container" :style="{'height':height+'px'}">
|
||||||
<h3 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
<h3 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
||||||
<span v-if="subjectCode">{{ subjectCode }} </span>
|
<span v-if="subjectCode">{{ subjectCode }} </span>
|
||||||
<span style="margin-left:5px;">{{ taskName }}</span>
|
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
||||||
</h3>
|
</h3>
|
||||||
<!-- 非测量问题 -->
|
<!-- 非测量问题 -->
|
||||||
<div class="lesions">
|
<div class="lesions">
|
||||||
|
@ -53,7 +53,7 @@
|
||||||
<i class="el-icon-warning" style="color:#ff9800" />
|
<i class="el-icon-warning" style="color:#ff9800" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<div style="position: absolute;left: 60px;top: 2px;">
|
<div style="position: absolute;left: 60px;top: 2px;">
|
||||||
<div style="display: flex;flex-direction: row;font-size: 10px;width:200px;height: 30px;">
|
<div style="display: flex;flex-direction: row;font-size: 11px;width:200px;height: 30px;">
|
||||||
<div v-if="item.TableQuestions.Answers[i].lesionPart" style="margin-left:10px;">
|
<div v-if="item.TableQuestions.Answers[i].lesionPart" style="margin-left:10px;">
|
||||||
{{ item.TableQuestions.Answers[i].lesionPart }}
|
{{ item.TableQuestions.Answers[i].lesionPart }}
|
||||||
</div>
|
</div>
|
||||||
|
@ -151,7 +151,6 @@ export default {
|
||||||
readingTaskState: 2,
|
readingTaskState: 2,
|
||||||
isBaseLineTask: false,
|
isBaseLineTask: false,
|
||||||
taskBlindName: '',
|
taskBlindName: '',
|
||||||
taskName: '',
|
|
||||||
tableQuestions: [],
|
tableQuestions: [],
|
||||||
isFirstRender: false,
|
isFirstRender: false,
|
||||||
criterionType: null,
|
criterionType: null,
|
||||||
|
@ -215,7 +214,6 @@ export default {
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
this.visitTaskId = this.visitTaskList[i].VisitTaskId
|
this.visitTaskId = this.visitTaskList[i].VisitTaskId
|
||||||
this.taskBlindName = this.visitTaskList[i].TaskBlindName
|
this.taskBlindName = this.visitTaskList[i].TaskBlindName
|
||||||
this.taskName = this.visitTaskList[i].TaskName
|
|
||||||
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
||||||
this.isBaseLineTask = this.visitTaskList[i].IsBaseLineTask
|
this.isBaseLineTask = this.visitTaskList[i].IsBaseLineTask
|
||||||
this.isCurrentTask = this.visitTaskList[i].IsCurrentTask
|
this.isCurrentTask = this.visitTaskList[i].IsCurrentTask
|
||||||
|
@ -270,7 +268,7 @@ export default {
|
||||||
// 判断是否存在测量数据
|
// 判断是否存在测量数据
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
const refName = `${this.activeItem.activeCollapseId}_${this.activeItem.activeRowIndex}`
|
const refName = `${this.activeItem.activeCollapseId}_${this.activeItem.activeRowIndex}`
|
||||||
if ((this.$refs[refName][0].questionForm && this.$refs[refName][0].questionForm.MeasureData && measureData.data.uuid === this.$refs[refName][0].questionForm.MeasureData.data.uuid) || !this.$refs[refName][0].questionForm.MeasureData) {
|
if (!this.$refs[refName][0].questionForm.MeasureData || (this.$refs[refName][0].questionForm && this.$refs[refName][0].questionForm.MeasureData && measureData.data.uuid === this.$refs[refName][0].questionForm.MeasureData.data.uuid)) {
|
||||||
this.$refs[refName][0].setMeasureData(measureData)
|
this.$refs[refName][0].setMeasureData(measureData)
|
||||||
} else {
|
} else {
|
||||||
if (this.isBaseLineTask) {
|
if (this.isBaseLineTask) {
|
||||||
|
@ -735,12 +733,12 @@ export default {
|
||||||
.el-collapse{
|
.el-collapse{
|
||||||
border-bottom:none;
|
border-bottom:none;
|
||||||
border-top:none;
|
border-top:none;
|
||||||
>>>.el-collapse-item{
|
/deep/ .el-collapse-item{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__header{
|
/deep/ .el-collapse-item__header{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border-bottom-color:#5a5a5a;
|
border-bottom-color:#5a5a5a;
|
||||||
|
@ -748,11 +746,11 @@ export default {
|
||||||
height: 35px;
|
height: 35px;
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__wrap{
|
/deep/ .el-collapse-item__wrap{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__content{
|
/deep/ .el-collapse-item__content{
|
||||||
width:260px;
|
width:260px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0px;
|
top: 0px;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
:class="{'visit-item-active': activeTaskVisitId==s.VisitTaskId}"
|
:class="{'visit-item-active': activeTaskVisitId==s.VisitTaskId}"
|
||||||
|
|
||||||
@click.prevent="handleClick(s)"
|
@click.prevent="handleClick(s)"
|
||||||
>{{ s.TaskName }}</div>
|
>{{ s.TaskBlindName }}</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -35,7 +35,6 @@
|
||||||
:trial-id="trialId"
|
:trial-id="trialId"
|
||||||
:subject-visit-id="s.VisitId"
|
:subject-visit-id="s.VisitId"
|
||||||
:task-blind-name="s.TaskBlindName"
|
:task-blind-name="s.TaskBlindName"
|
||||||
:task-name="s.TaskName"
|
|
||||||
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
||||||
@loadImageStack="loadImageStack"
|
@loadImageStack="loadImageStack"
|
||||||
@previewNoneDicoms="previewNoneDicoms"
|
@previewNoneDicoms="previewNoneDicoms"
|
||||||
|
@ -250,6 +249,7 @@ export default {
|
||||||
const loading = this.$loading({ fullscreen: true })
|
const loading = this.$loading({ fullscreen: true })
|
||||||
var i = this.visitTaskList.length - 1
|
var i = this.visitTaskList.length - 1
|
||||||
await store.dispatch('reading/getMasterSeries', { trialId: this.trialId, visitTaskId: this.visitTaskList[i].VisitTaskId, visitId: this.visitTaskList[i].VisitId })
|
await store.dispatch('reading/getMasterSeries', { trialId: this.trialId, visitTaskId: this.visitTaskList[i].VisitTaskId, visitId: this.visitTaskList[i].VisitId })
|
||||||
|
|
||||||
await store.dispatch('reading/refreshMeasuredData', this.visitTaskList[i].VisitTaskId)
|
await store.dispatch('reading/refreshMeasuredData', this.visitTaskList[i].VisitTaskId)
|
||||||
|
|
||||||
await store.dispatch('reading/getNextVisitTask', { visitTaskId: this.visitTaskId })
|
await store.dispatch('reading/getNextVisitTask', { visitTaskId: this.visitTaskId })
|
||||||
|
@ -332,14 +332,16 @@ export default {
|
||||||
if (!this.visitTaskList[index].studyListInit) {
|
if (!this.visitTaskList[index].studyListInit) {
|
||||||
await store.dispatch('reading/getStudyInfo', { trialId: this.trialId, subjectVisitId: this.visitTaskList[index].VisitId, visitTaskId: this.visitTaskList[index].VisitTaskId, taskBlindName: this.visitTaskList[index].TaskBlindName })
|
await store.dispatch('reading/getStudyInfo', { trialId: this.trialId, subjectVisitId: this.visitTaskList[index].VisitId, visitTaskId: this.visitTaskList[index].VisitTaskId, taskBlindName: this.visitTaskList[index].TaskBlindName })
|
||||||
}
|
}
|
||||||
if (!this.visitTaskList[index].readingQuestionsInit) {
|
|
||||||
await store.dispatch('reading/getReadingQuestionAndAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[index].VisitTaskId })
|
await store.dispatch('reading/getReadingQuestionAndAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[index].VisitTaskId })
|
||||||
}
|
|
||||||
if (!this.visitTaskList[index].questionsInit) {
|
if (!this.visitTaskList[index].questionsInit) {
|
||||||
await store.dispatch('reading/getDicomReadingQuestionAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[index].VisitTaskId })
|
await store.dispatch('reading/getDicomReadingQuestionAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[index].VisitTaskId })
|
||||||
}
|
}
|
||||||
|
|
||||||
await store.dispatch('reading/setStatus', { visitTaskId: this.visitTaskList[index].VisitTaskId })
|
await store.dispatch('reading/setStatus', { visitTaskId: this.visitTaskList[index].VisitTaskId })
|
||||||
|
} else if (this.visitTaskList[index].IsCurrentTask && this.visitTaskList[index].ReadingTaskState === 2) {
|
||||||
|
await store.dispatch('reading/refreshMeasuredData', this.visitTaskList[index].VisitTaskId)
|
||||||
}
|
}
|
||||||
this.activeTaskVisitId = visitTaskId
|
this.activeTaskVisitId = visitTaskId
|
||||||
this.activeTaskIndex = index
|
this.activeTaskIndex = index
|
||||||
|
@ -496,6 +498,7 @@ export default {
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
user-select: none;
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
width: 5px;
|
width: 5px;
|
||||||
height: 5px;
|
height: 5px;
|
||||||
|
@ -529,7 +532,7 @@ export default {
|
||||||
// border: 1px solid #ccc;
|
// border: 1px solid #ccc;
|
||||||
|
|
||||||
}
|
}
|
||||||
.el-tabs{
|
/deep/.el-tabs{
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
@ -540,18 +543,18 @@ export default {
|
||||||
.el-tabs__item{
|
.el-tabs__item{
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__header{
|
.el-tabs__header{
|
||||||
height: 55px;
|
height: 55px;
|
||||||
margin:0px;
|
margin:0px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__content{
|
.el-tabs__content{
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin:0px;
|
margin:0px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__item{
|
.el-tabs__item{
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -572,7 +575,7 @@ export default {
|
||||||
background-color: #607d8b!important;
|
background-color: #607d8b!important;
|
||||||
border: 1px solid #607d8b!important;
|
border: 1px solid #607d8b!important;
|
||||||
}
|
}
|
||||||
>>>.el-progress__text{
|
/deep/.el-progress__text{
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -461,10 +461,7 @@ export default {
|
||||||
//
|
//
|
||||||
if ((this.isBaseLineTask || this.questionForm.IsDicomReading === false) && this.questionForm.MeasureData && this.questionForm.MeasureData.type === 'ArrowAnnotate' && v === 0) {
|
if ((this.isBaseLineTask || this.questionForm.IsDicomReading === false) && this.questionForm.MeasureData && this.questionForm.MeasureData.type === 'ArrowAnnotate' && v === 0) {
|
||||||
// 当前病灶不允许设置为靶病灶
|
// 当前病灶不允许设置为靶病灶
|
||||||
let msg = this.$t('trials:reading:warnning:msg15')
|
this.$confirm(this.$t(' trials:reading:warnning:msg15'), {
|
||||||
const criterionName = this.$route.query.criterionName
|
|
||||||
msg = msg.replace('***', criterionName)
|
|
||||||
this.$confirm(msg, {
|
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
distinguishCancelAndClose: true
|
distinguishCancelAndClose: true
|
||||||
})
|
})
|
||||||
|
@ -478,8 +475,6 @@ export default {
|
||||||
if (idx > -1 && !!this.tableQuestions[idx].MaxQuestionCount && this.tableQuestions[idx].MaxQuestionCount <= this.tableQuestions[idx].TableQuestions.Answers.length) {
|
if (idx > -1 && !!this.tableQuestions[idx].MaxQuestionCount && this.tableQuestions[idx].MaxQuestionCount <= this.tableQuestions[idx].TableQuestions.Answers.length) {
|
||||||
let msg = this.$t('trials:reading:warnning:msg14')
|
let msg = this.$t('trials:reading:warnning:msg14')
|
||||||
// msg = msg.replace('xxx', this.tableQuestions[idx].QuestionName)
|
// msg = msg.replace('xxx', this.tableQuestions[idx].QuestionName)
|
||||||
const criterionName = this.$route.query.criterionName
|
|
||||||
msg = msg.replace('***', criterionName)
|
|
||||||
msg = msg.replace('xxx', this.tableQuestions[idx].MaxQuestionCount)
|
msg = msg.replace('xxx', this.tableQuestions[idx].MaxQuestionCount)
|
||||||
this.$confirm(msg, {
|
this.$confirm(msg, {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
|
@ -501,7 +496,7 @@ export default {
|
||||||
item.Answer = this.questionForm[item.Id] ? this.questionForm[item.Id] : ''
|
item.Answer = this.questionForm[item.Id] ? this.questionForm[item.Id] : ''
|
||||||
arr.push(item)
|
arr.push(item)
|
||||||
})
|
})
|
||||||
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionType: this.lesionType }
|
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }
|
||||||
DicomEvent.$emit('imageLocation', obj)
|
DicomEvent.$emit('imageLocation', obj)
|
||||||
var type = null
|
var type = null
|
||||||
if (this.questionForm.RowId) {
|
if (this.questionForm.RowId) {
|
||||||
|
@ -836,12 +831,8 @@ export default {
|
||||||
},
|
},
|
||||||
async uploadScreenshots(fileName, file) {
|
async uploadScreenshots(fileName, file) {
|
||||||
try {
|
try {
|
||||||
|
console.log(this.OSSclient)
|
||||||
file = this.convertBase64ToBlob(file)
|
file = this.convertBase64ToBlob(file)
|
||||||
// const formData = new FormData()
|
|
||||||
// formData.append('file', file)
|
|
||||||
// const result = await uploadPrintscreen(formData, this.$route.query.subjectId)
|
|
||||||
// result.url = result.Result.Path
|
|
||||||
// const result = await this.OSSclient.put(`${fileName}.png`, file)
|
|
||||||
var trialId = this.$route.query.trialId
|
var trialId = this.$route.query.trialId
|
||||||
var subjectId = this.$route.query.trialId
|
var subjectId = this.$route.query.trialId
|
||||||
const result = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${fileName}.png`, file)
|
const result = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${fileName}.png`, file)
|
||||||
|
@ -1329,75 +1320,75 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DicomEvent.$emit('getScreenshots', async val => {
|
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }, async val => {
|
||||||
// 靶病灶状态为0(存在)时,一定存在长径或者长短径(长径、十字线 )
|
// 靶病灶状态为0(存在)时,一定存在长径或者长短径(长径、十字线 )
|
||||||
// 普通靶病灶:长径大于10mm且不小于2倍层厚(基线校验)
|
// 普通靶病灶:长径大于10mm且不小于2倍层厚(基线校验)
|
||||||
// 淋巴结靶病灶:短径大于15mm且不小于2倍层厚(基线校验)
|
// 淋巴结靶病灶:短径大于15mm且不小于2倍层厚(基线校验)
|
||||||
|
|
||||||
var picturePath = ''
|
var picturePath = ''
|
||||||
if (val) {
|
if (val && measureData && this.questionForm.IsDicomReading) {
|
||||||
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
|
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
|
||||||
|
|
||||||
picturePath = pictureObj.isSuccess ? pictureObj.result.url : ''
|
picturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
|
||||||
|
}
|
||||||
var answers = []
|
var answers = []
|
||||||
var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/)
|
var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/)
|
||||||
for (const k in this.questionForm) {
|
for (const k in this.questionForm) {
|
||||||
if (reg.test(k)) {
|
if (reg.test(k)) {
|
||||||
if (answers.findIndex(i => i.tableQuestionId === k) === -1) {
|
if (answers.findIndex(i => i.tableQuestionId === k) === -1) {
|
||||||
answers.push({ tableQuestionId: k, answer: this.questionForm[k] })
|
answers.push({ tableQuestionId: k, answer: this.questionForm[k] })
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var params = {
|
|
||||||
questionId: this.parentQsId,
|
|
||||||
rowId: this.questionForm.RowId,
|
|
||||||
rowIndex: this.answers.RowIndex,
|
|
||||||
visitTaskId: this.visitTaskId,
|
|
||||||
trialId: this.trialId,
|
|
||||||
measureData: measureData ? JSON.stringify(measureData) : '',
|
|
||||||
answerList: answers,
|
|
||||||
isCanEditPosition: this.questionForm.IsCanEditPosition,
|
|
||||||
studyId: measureData ? this.questionForm.MeasureData.studyId : '',
|
|
||||||
seriesId: measureData ? this.questionForm.MeasureData.seriesId : '',
|
|
||||||
instanceId: measureData ? this.questionForm.MeasureData.instanceId : '',
|
|
||||||
numberOfFrames: measureData && !isNaN(parseInt(this.questionForm.MeasureData.frame)) ? parseInt(this.questionForm.MeasureData.frame) : 0,
|
|
||||||
picturePath: picturePath,
|
|
||||||
organInfoId: this.questionForm.OrganInfoId,
|
|
||||||
markTool: measureData ? measureData.type : ''
|
|
||||||
}
|
|
||||||
if (this.questionForm.IsDicomReading === false) {
|
|
||||||
params.isDicomReading = false
|
|
||||||
}
|
|
||||||
if (this.deleteInfo) {
|
|
||||||
await this.deleteOldLesion(this.deleteInfo.questionId, this.deleteInfo.rowId)
|
|
||||||
this.deleteInfo = null
|
|
||||||
params.rowId = ''
|
|
||||||
}
|
|
||||||
submitTableQuestion(params).then(async res => {
|
|
||||||
// 保存成功!
|
|
||||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
|
||||||
this.currentMarkTool = measureData ? measureData.type : ''
|
|
||||||
// saveTypeEnum 0:未保存过(新建病灶);1:已保存,信息不完整(随访初始化病灶/分裂病灶,通过状态判断);2:已保存,信息完整
|
|
||||||
|
|
||||||
this.$set(this.questionForm, 'saveTypeEnum', 2)
|
|
||||||
this.originalQuestionForm = { ...this.questionForm }
|
|
||||||
loading.close()
|
|
||||||
var isLymphLesion = this.getQuestionVal(2)
|
|
||||||
isLymphLesion = isLymphLesion ? parseInt(isLymphLesion) : null
|
|
||||||
var lesionOrgan = this.getQuestionVal(6)
|
|
||||||
this.$set(this.questionForm, 'RowId', res.Result.RowId)
|
|
||||||
const lesionPart = this.getQuestionVal(8)
|
|
||||||
const lesionState = Number(this.getQuestionVal(7))
|
|
||||||
this.$emit('resetQuestions', { isLymphLesion, lesionPart, lesionOrgan, lesionShort, saveTypeEnum: this.questionForm.saveTypeEnum, lesionLength, lesionState, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
|
|
||||||
|
|
||||||
// await store.dispatch('reading/refreshMeasuredData', this.visitTaskId)
|
|
||||||
// DicomEvent.$emit('getMeasureData')
|
|
||||||
this.$emit('close')
|
|
||||||
DicomEvent.$emit('getReportInfo', true)
|
|
||||||
DicomEvent.$emit('setMeasuredToolsPassive')
|
|
||||||
}).catch(() => { loading.close() })
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var params = {
|
||||||
|
questionId: this.parentQsId,
|
||||||
|
rowId: this.questionForm.RowId,
|
||||||
|
rowIndex: this.answers.RowIndex,
|
||||||
|
visitTaskId: this.visitTaskId,
|
||||||
|
trialId: this.trialId,
|
||||||
|
measureData: measureData ? JSON.stringify(measureData) : '',
|
||||||
|
answerList: answers,
|
||||||
|
isCanEditPosition: this.questionForm.IsCanEditPosition,
|
||||||
|
studyId: measureData ? this.questionForm.MeasureData.studyId : '',
|
||||||
|
seriesId: measureData ? this.questionForm.MeasureData.seriesId : '',
|
||||||
|
instanceId: measureData ? this.questionForm.MeasureData.instanceId : '',
|
||||||
|
numberOfFrames: measureData && !isNaN(parseInt(this.questionForm.MeasureData.frame)) ? parseInt(this.questionForm.MeasureData.frame) : 0,
|
||||||
|
picturePath: picturePath,
|
||||||
|
organInfoId: this.questionForm.OrganInfoId,
|
||||||
|
markTool: measureData ? measureData.type : ''
|
||||||
|
}
|
||||||
|
if (this.questionForm.IsDicomReading === false) {
|
||||||
|
params.isDicomReading = false
|
||||||
|
}
|
||||||
|
if (this.deleteInfo) {
|
||||||
|
await this.deleteOldLesion(this.deleteInfo.questionId, this.deleteInfo.rowId)
|
||||||
|
this.deleteInfo = null
|
||||||
|
params.rowId = ''
|
||||||
|
}
|
||||||
|
submitTableQuestion(params).then(async res => {
|
||||||
|
// 保存成功!
|
||||||
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
|
this.currentMarkTool = measureData ? measureData.type : ''
|
||||||
|
// saveTypeEnum 0:未保存过(新建病灶);1:已保存,信息不完整(随访初始化病灶/分裂病灶,通过状态判断);2:已保存,信息完整
|
||||||
|
|
||||||
|
this.$set(this.questionForm, 'saveTypeEnum', 2)
|
||||||
|
this.originalQuestionForm = { ...this.questionForm }
|
||||||
|
loading.close()
|
||||||
|
var isLymphLesion = this.getQuestionVal(2)
|
||||||
|
isLymphLesion = isLymphLesion ? parseInt(isLymphLesion) : null
|
||||||
|
var lesionOrgan = this.getQuestionVal(6)
|
||||||
|
this.$set(this.questionForm, 'RowId', res.Result.RowId)
|
||||||
|
const lesionPart = this.getQuestionVal(8)
|
||||||
|
const lesionState = Number(this.getQuestionVal(7))
|
||||||
|
this.$emit('resetQuestions', { isLymphLesion, lesionPart, lesionOrgan, lesionShort, saveTypeEnum: this.questionForm.saveTypeEnum, lesionLength, lesionState, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
|
||||||
|
|
||||||
|
// await store.dispatch('reading/refreshMeasuredData', this.visitTaskId)
|
||||||
|
// DicomEvent.$emit('getMeasureData')
|
||||||
|
this.$emit('close')
|
||||||
|
DicomEvent.$emit('getReportInfo', true)
|
||||||
|
DicomEvent.$emit('setMeasuredToolsPassive')
|
||||||
|
}).catch(() => { loading.close() })
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -1565,29 +1556,29 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.measurement-form{
|
.measurement-form{
|
||||||
>>>.el-form-item__label{
|
/deep/ .el-form-item__label{
|
||||||
color: #c3c3c3;
|
color: #c3c3c3;
|
||||||
}
|
}
|
||||||
>>>.el-input .el-input__inner{
|
/deep/ .el-input .el-input__inner{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border: 1px solid #5e5e5e;
|
border: 1px solid #5e5e5e;
|
||||||
}
|
}
|
||||||
>>>.el-form-item{
|
/deep/ .el-form-item{
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
}
|
}
|
||||||
>>>.el-form-item__content{
|
/deep/ .el-form-item__content{
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
>>>.el-input.is-disabled .el-input__inner{
|
/deep/ .el-input.is-disabled .el-input__inner{
|
||||||
background-color: #646464a1;
|
background-color: #646464a1;
|
||||||
}
|
}
|
||||||
>>>.el-select.is-disabled .el-input__inner{
|
/deep/ .el-select.is-disabled .el-input__inner{
|
||||||
background-color: #646464a1;
|
background-color: #646464a1;
|
||||||
}
|
}
|
||||||
>>>.el-button--mini, .el-button--mini.is-round {
|
/deep/ .el-button--mini, .el-button--mini.is-round {
|
||||||
padding: 7px 10px;
|
padding: 7px 10px;
|
||||||
}
|
}
|
||||||
.el-form-item__content
|
.el-form-item__content
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<div class="container" :style="{'height':height+'px'}">
|
<div class="container" :style="{'height':height+'px'}">
|
||||||
<h3 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
<h3 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
||||||
<span v-if="subjectCode">{{ subjectCode }} </span>
|
<span v-if="subjectCode">{{ subjectCode }} </span>
|
||||||
<span style="margin-left:5px;">{{ taskName }}</span>
|
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
||||||
</h3>
|
</h3>
|
||||||
<!-- 非测量问题 -->
|
<!-- 非测量问题 -->
|
||||||
<div class="lesions">
|
<div class="lesions">
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<div style="position: absolute;left: 50px;top: 2px;">
|
<div style="position: absolute;left: 50px;top: 2px;">
|
||||||
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
|
<!-- white-space: nowrap;overflow: hidden;text-overflow: ellipsis; -->
|
||||||
<div style="font-size: 10px;width:220px;height: 30px;">
|
<div style="font-size: 11px;width:220px;height: 30px;">
|
||||||
<div
|
<div
|
||||||
v-if="item.TableQuestions.Answers[i].lesionPart"
|
v-if="item.TableQuestions.Answers[i].lesionPart"
|
||||||
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
|
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
|
||||||
|
@ -172,7 +172,6 @@ export default {
|
||||||
readingTaskState: 2,
|
readingTaskState: 2,
|
||||||
isBaseLineTask: false,
|
isBaseLineTask: false,
|
||||||
taskBlindName: '',
|
taskBlindName: '',
|
||||||
taskName: '',
|
|
||||||
tableQuestions: [],
|
tableQuestions: [],
|
||||||
isFirstRender: false,
|
isFirstRender: false,
|
||||||
CriterionType: null,
|
CriterionType: null,
|
||||||
|
@ -236,7 +235,6 @@ export default {
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
this.visitTaskId = this.visitTaskList[i].VisitTaskId
|
this.visitTaskId = this.visitTaskList[i].VisitTaskId
|
||||||
this.taskBlindName = this.visitTaskList[i].TaskBlindName
|
this.taskBlindName = this.visitTaskList[i].TaskBlindName
|
||||||
this.taskName = this.visitTaskList[i].TaskName
|
|
||||||
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
||||||
this.isBaseLineTask = this.visitTaskList[i].IsBaseLineTask
|
this.isBaseLineTask = this.visitTaskList[i].IsBaseLineTask
|
||||||
this.isCurrentTask = this.visitTaskList[i].IsCurrentTask
|
this.isCurrentTask = this.visitTaskList[i].IsCurrentTask
|
||||||
|
@ -628,8 +626,6 @@ export default {
|
||||||
}
|
}
|
||||||
if (!!qs.MaxQuestionCount && qs.MaxQuestionCount <= qs.TableQuestions.Answers.length) {
|
if (!!qs.MaxQuestionCount && qs.MaxQuestionCount <= qs.TableQuestions.Answers.length) {
|
||||||
let msg = this.$t('trials:reading:warnning:msg14')
|
let msg = this.$t('trials:reading:warnning:msg14')
|
||||||
const criterionName = this.$route.query.criterionName
|
|
||||||
msg = msg.replace('***', criterionName)
|
|
||||||
// msg = msg.replace('xxx', qs.QuestionName)
|
// msg = msg.replace('xxx', qs.QuestionName)
|
||||||
msg = msg.replace('xxx', qs.MaxQuestionCount)
|
msg = msg.replace('xxx', qs.MaxQuestionCount)
|
||||||
this.$confirm(msg, {
|
this.$confirm(msg, {
|
||||||
|
@ -1058,12 +1054,12 @@ export default {
|
||||||
.el-collapse{
|
.el-collapse{
|
||||||
border-bottom:none;
|
border-bottom:none;
|
||||||
border-top:none;
|
border-top:none;
|
||||||
>>>.el-collapse-item{
|
/deep/ .el-collapse-item{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__header{
|
/deep/ .el-collapse-item__header{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border-bottom-color:#5a5a5a;
|
border-bottom-color:#5a5a5a;
|
||||||
|
@ -1071,11 +1067,11 @@ export default {
|
||||||
height: 35px;
|
height: 35px;
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__wrap{
|
/deep/ .el-collapse-item__wrap{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__content{
|
/deep/ .el-collapse-item__content{
|
||||||
width:260px;
|
width:260px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0px;
|
top: 0px;
|
||||||
|
|
|
@ -420,10 +420,7 @@ export default {
|
||||||
//
|
//
|
||||||
if ((this.isBaseLineTask || this.questionForm.IsDicomReading === false) && this.questionForm.MeasureData && this.questionForm.MeasureData.type === 'ArrowAnnotate' && v === 0) {
|
if ((this.isBaseLineTask || this.questionForm.IsDicomReading === false) && this.questionForm.MeasureData && this.questionForm.MeasureData.type === 'ArrowAnnotate' && v === 0) {
|
||||||
// 当前病灶不允许设置为靶病灶
|
// 当前病灶不允许设置为靶病灶
|
||||||
let msg = this.$t('trials:reading:warnning:msg15')
|
this.$confirm(this.$t(' trials:reading:warnning:msg15'), {
|
||||||
const criterionName = this.$route.query.criterionName
|
|
||||||
msg = msg.replace('***', criterionName)
|
|
||||||
this.$confirm(msg, {
|
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
distinguishCancelAndClose: true
|
distinguishCancelAndClose: true
|
||||||
})
|
})
|
||||||
|
@ -436,8 +433,6 @@ export default {
|
||||||
var idx = this.tableQuestions.findIndex(item => item.LesionType === v)
|
var idx = this.tableQuestions.findIndex(item => item.LesionType === v)
|
||||||
if (idx > -1 && !!this.tableQuestions[idx].MaxQuestionCount && this.tableQuestions[idx].MaxQuestionCount <= this.tableQuestions[idx].TableQuestions.Answers.length) {
|
if (idx > -1 && !!this.tableQuestions[idx].MaxQuestionCount && this.tableQuestions[idx].MaxQuestionCount <= this.tableQuestions[idx].TableQuestions.Answers.length) {
|
||||||
let msg = this.$t('trials:reading:warnning:msg14')
|
let msg = this.$t('trials:reading:warnning:msg14')
|
||||||
const criterionName = this.$route.query.criterionName
|
|
||||||
msg = msg.replace('***', criterionName)
|
|
||||||
msg = msg.replace('xxx', this.tableQuestions[idx].MaxQuestionCount)
|
msg = msg.replace('xxx', this.tableQuestions[idx].MaxQuestionCount)
|
||||||
this.$confirm(msg, {
|
this.$confirm(msg, {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
|
@ -459,7 +454,7 @@ export default {
|
||||||
item.Answer = this.questionForm[item.Id] ? this.questionForm[item.Id] : ''
|
item.Answer = this.questionForm[item.Id] ? this.questionForm[item.Id] : ''
|
||||||
arr.push(item)
|
arr.push(item)
|
||||||
})
|
})
|
||||||
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionType: this.lesionType }
|
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }
|
||||||
DicomEvent.$emit('imageLocation', obj)
|
DicomEvent.$emit('imageLocation', obj)
|
||||||
var type = null
|
var type = null
|
||||||
if (this.questionForm.RowId) {
|
if (this.questionForm.RowId) {
|
||||||
|
@ -723,11 +718,6 @@ export default {
|
||||||
async uploadScreenshots(fileName, file) {
|
async uploadScreenshots(fileName, file) {
|
||||||
try {
|
try {
|
||||||
file = this.convertBase64ToBlob(file)
|
file = this.convertBase64ToBlob(file)
|
||||||
// const formData = new FormData()
|
|
||||||
// formData.append('file', file)
|
|
||||||
// const result = await uploadPrintscreen(formData, this.$route.query.subjectId)
|
|
||||||
// result.url = result.Result.Path
|
|
||||||
// const result = await this.OSSclient.put(`${fileName}.png`, file)
|
|
||||||
var trialId = this.$route.query.trialId
|
var trialId = this.$route.query.trialId
|
||||||
var subjectId = this.$route.query.trialId
|
var subjectId = this.$route.query.trialId
|
||||||
const result = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${fileName}.png`, file)
|
const result = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${fileName}.png`, file)
|
||||||
|
@ -980,67 +970,65 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DicomEvent.$emit('getScreenshots', async val => {
|
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: this.lesionMark, lesionType: this.lesionType }, async val => {
|
||||||
var picturePath = ''
|
var picturePath = ''
|
||||||
if (val) {
|
if (val && measureData && this.questionForm.IsDicomReading) {
|
||||||
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
|
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
|
||||||
|
picturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
|
||||||
picturePath = pictureObj.isSuccess ? pictureObj.result.url : ''
|
}
|
||||||
|
var answers = []
|
||||||
var answers = []
|
var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/)
|
||||||
var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/)
|
for (const k in this.questionForm) {
|
||||||
for (const k in this.questionForm) {
|
if (reg.test(k)) {
|
||||||
if (reg.test(k)) {
|
if (answers.findIndex(i => i.tableQuestionId === k) === -1) {
|
||||||
if (answers.findIndex(i => i.tableQuestionId === k) === -1) {
|
answers.push({ tableQuestionId: k, answer: this.questionForm[k] })
|
||||||
answers.push({ tableQuestionId: k, answer: this.questionForm[k] })
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var params = {
|
|
||||||
questionId: this.parentQsId,
|
|
||||||
rowId: this.questionForm.RowId,
|
|
||||||
rowIndex: this.answers.RowIndex,
|
|
||||||
visitTaskId: this.visitTaskId,
|
|
||||||
trialId: this.trialId,
|
|
||||||
measureData: measureData ? JSON.stringify(measureData) : '',
|
|
||||||
answerList: answers,
|
|
||||||
isCanEditPosition: this.questionForm.IsCanEditPosition,
|
|
||||||
studyId: measureData ? this.questionForm.MeasureData.studyId : '',
|
|
||||||
seriesId: measureData ? this.questionForm.MeasureData.seriesId : '',
|
|
||||||
instanceId: measureData ? this.questionForm.MeasureData.instanceId : '',
|
|
||||||
numberOfFrames: measureData && !isNaN(parseInt(this.questionForm.MeasureData.frame)) ? parseInt(this.questionForm.MeasureData.frame) : 0,
|
|
||||||
picturePath: picturePath,
|
|
||||||
organInfoId: this.questionForm.OrganInfoId,
|
|
||||||
markTool: measureData ? measureData.type : ''
|
|
||||||
}
|
|
||||||
if (this.questionForm.IsDicomReading === false) {
|
|
||||||
params.isDicomReading = false
|
|
||||||
}
|
|
||||||
if (this.deleteInfo) {
|
|
||||||
await this.deleteOldLesion(this.deleteInfo.questionId, this.deleteInfo.rowId)
|
|
||||||
this.deleteInfo = null
|
|
||||||
}
|
|
||||||
submitTableQuestion(params).then(async res => {
|
|
||||||
// 保存成功!
|
|
||||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
|
||||||
this.currentMarkTool = measureData ? measureData.type : ''
|
|
||||||
// saveTypeEnum 0:未保存过(新建病灶);1:已保存,信息不完整(随访初始化病灶/分裂病灶,通过状态判断);2:已保存,信息完整
|
|
||||||
|
|
||||||
this.$set(this.questionForm, 'saveTypeEnum', 2)
|
|
||||||
this.originalQuestionForm = { ...this.questionForm }
|
|
||||||
loading.close()
|
|
||||||
|
|
||||||
var lesionOrgan = this.getQuestionVal(6)
|
|
||||||
this.$set(this.questionForm, 'RowId', res.Result.RowId)
|
|
||||||
const lesionPart = this.getQuestionVal(8)
|
|
||||||
const lesionState = Number(this.getQuestionVal(7))
|
|
||||||
this.$emit('resetQuestions', { isLymphLesion: 0, lesionPart, lesionOrgan, saveTypeEnum: this.questionForm.saveTypeEnum, lesionLength, lesionState, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
|
|
||||||
this.$emit('close')
|
|
||||||
DicomEvent.$emit('getReportInfo', true)
|
|
||||||
DicomEvent.$emit('setMeasuredToolsPassive')
|
|
||||||
}).catch(() => { loading.close() })
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var params = {
|
||||||
|
questionId: this.parentQsId,
|
||||||
|
rowId: this.questionForm.RowId,
|
||||||
|
rowIndex: this.answers.RowIndex,
|
||||||
|
visitTaskId: this.visitTaskId,
|
||||||
|
trialId: this.trialId,
|
||||||
|
measureData: measureData ? JSON.stringify(measureData) : '',
|
||||||
|
answerList: answers,
|
||||||
|
isCanEditPosition: this.questionForm.IsCanEditPosition,
|
||||||
|
studyId: measureData ? this.questionForm.MeasureData.studyId : '',
|
||||||
|
seriesId: measureData ? this.questionForm.MeasureData.seriesId : '',
|
||||||
|
instanceId: measureData ? this.questionForm.MeasureData.instanceId : '',
|
||||||
|
numberOfFrames: measureData && !isNaN(parseInt(this.questionForm.MeasureData.frame)) ? parseInt(this.questionForm.MeasureData.frame) : 0,
|
||||||
|
picturePath: picturePath,
|
||||||
|
organInfoId: this.questionForm.OrganInfoId,
|
||||||
|
markTool: measureData ? measureData.type : ''
|
||||||
|
}
|
||||||
|
if (this.questionForm.IsDicomReading === false) {
|
||||||
|
params.isDicomReading = false
|
||||||
|
}
|
||||||
|
if (this.deleteInfo) {
|
||||||
|
await this.deleteOldLesion(this.deleteInfo.questionId, this.deleteInfo.rowId)
|
||||||
|
this.deleteInfo = null
|
||||||
|
}
|
||||||
|
submitTableQuestion(params).then(async res => {
|
||||||
|
// 保存成功!
|
||||||
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
|
this.currentMarkTool = measureData ? measureData.type : ''
|
||||||
|
// saveTypeEnum 0:未保存过(新建病灶);1:已保存,信息不完整(随访初始化病灶/分裂病灶,通过状态判断);2:已保存,信息完整
|
||||||
|
|
||||||
|
this.$set(this.questionForm, 'saveTypeEnum', 2)
|
||||||
|
this.originalQuestionForm = { ...this.questionForm }
|
||||||
|
loading.close()
|
||||||
|
|
||||||
|
var lesionOrgan = this.getQuestionVal(6)
|
||||||
|
this.$set(this.questionForm, 'RowId', res.Result.RowId)
|
||||||
|
const lesionPart = this.getQuestionVal(8)
|
||||||
|
const lesionState = Number(this.getQuestionVal(7))
|
||||||
|
this.$emit('resetQuestions', { isLymphLesion: 0, lesionPart, lesionOrgan, saveTypeEnum: this.questionForm.saveTypeEnum, lesionLength, lesionState, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
|
||||||
|
this.$emit('close')
|
||||||
|
DicomEvent.$emit('getReportInfo', true)
|
||||||
|
DicomEvent.$emit('setMeasuredToolsPassive')
|
||||||
|
}).catch(() => { loading.close() })
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -1179,29 +1167,29 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.measurement-form{
|
.measurement-form{
|
||||||
>>>.el-form-item__label{
|
/deep/ .el-form-item__label{
|
||||||
color: #c3c3c3;
|
color: #c3c3c3;
|
||||||
}
|
}
|
||||||
>>>.el-input .el-input__inner{
|
/deep/ .el-input .el-input__inner{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border: 1px solid #5e5e5e;
|
border: 1px solid #5e5e5e;
|
||||||
}
|
}
|
||||||
>>>.el-form-item{
|
/deep/ .el-form-item{
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
}
|
}
|
||||||
>>>.el-form-item__content{
|
/deep/ .el-form-item__content{
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
>>>.el-input.is-disabled .el-input__inner{
|
/deep/ .el-input.is-disabled .el-input__inner{
|
||||||
background-color: #646464a1;
|
background-color: #646464a1;
|
||||||
}
|
}
|
||||||
>>>.el-select.is-disabled .el-input__inner{
|
/deep/ .el-select.is-disabled .el-input__inner{
|
||||||
background-color: #646464a1;
|
background-color: #646464a1;
|
||||||
}
|
}
|
||||||
>>>.el-button--mini, .el-button--mini.is-round {
|
/deep/ .el-button--mini, .el-button--mini.is-round {
|
||||||
padding: 7px 10px;
|
padding: 7px 10px;
|
||||||
}
|
}
|
||||||
.el-form-item__content
|
.el-form-item__content
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<div class="container" :style="{'height':height+'px'}">
|
<div class="container" :style="{'height':height+'px'}">
|
||||||
<h3 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
<h3 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;">
|
||||||
<span v-if="subjectCode">{{ subjectCode }} </span>
|
<span v-if="subjectCode">{{ subjectCode }} </span>
|
||||||
<span style="margin-left:5px;">{{ taskName }}</span>
|
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
||||||
</h3>
|
</h3>
|
||||||
<!-- 非测量问题 -->
|
<!-- 非测量问题 -->
|
||||||
<div class="lesions">
|
<div class="lesions">
|
||||||
|
@ -49,7 +49,7 @@
|
||||||
<i class="el-icon-warning" style="color:#ff9800" />
|
<i class="el-icon-warning" style="color:#ff9800" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<div style="position: absolute;left: 50px;top: 2px;">
|
<div style="position: absolute;left: 50px;top: 2px;">
|
||||||
<div style="font-size: 10px;width:220px;height: 30px;">
|
<div style="font-size: 11px;width:220px;height: 30px;">
|
||||||
<div
|
<div
|
||||||
v-if="item.TableQuestions.Answers[i].lesionPart"
|
v-if="item.TableQuestions.Answers[i].lesionPart"
|
||||||
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
|
style="margin-left:10px;display: inline-block; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width:90px"
|
||||||
|
@ -169,7 +169,6 @@ export default {
|
||||||
readingTaskState: 2,
|
readingTaskState: 2,
|
||||||
isBaseLineTask: false,
|
isBaseLineTask: false,
|
||||||
taskBlindName: '',
|
taskBlindName: '',
|
||||||
taskName: '',
|
|
||||||
tableQuestions: [],
|
tableQuestions: [],
|
||||||
isFirstRender: false,
|
isFirstRender: false,
|
||||||
CriterionType: null,
|
CriterionType: null,
|
||||||
|
@ -234,7 +233,6 @@ export default {
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
this.visitTaskId = this.visitTaskList[i].VisitTaskId
|
this.visitTaskId = this.visitTaskList[i].VisitTaskId
|
||||||
this.taskBlindName = this.visitTaskList[i].TaskBlindName
|
this.taskBlindName = this.visitTaskList[i].TaskBlindName
|
||||||
this.taskName = this.visitTaskList[i].TaskName
|
|
||||||
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
||||||
this.isBaseLineTask = this.visitTaskList[i].IsBaseLineTask
|
this.isBaseLineTask = this.visitTaskList[i].IsBaseLineTask
|
||||||
this.isCurrentTask = this.visitTaskList[i].IsCurrentTask
|
this.isCurrentTask = this.visitTaskList[i].IsCurrentTask
|
||||||
|
@ -602,8 +600,6 @@ export default {
|
||||||
}
|
}
|
||||||
if (!!qs.MaxQuestionCount && qs.MaxQuestionCount <= qs.TableQuestions.Answers.length) {
|
if (!!qs.MaxQuestionCount && qs.MaxQuestionCount <= qs.TableQuestions.Answers.length) {
|
||||||
let msg = this.$t('trials:reading:warnning:msg14')
|
let msg = this.$t('trials:reading:warnning:msg14')
|
||||||
const criterionName = this.$route.query.criterionName
|
|
||||||
msg = msg.replace('***', criterionName)
|
|
||||||
msg = msg.replace('xxx', qs.MaxQuestionCount)
|
msg = msg.replace('xxx', qs.MaxQuestionCount)
|
||||||
this.$confirm(msg, {
|
this.$confirm(msg, {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
|
@ -988,12 +984,12 @@ export default {
|
||||||
.el-collapse{
|
.el-collapse{
|
||||||
border-bottom:none;
|
border-bottom:none;
|
||||||
border-top:none;
|
border-top:none;
|
||||||
>>>.el-collapse-item{
|
/deep/ .el-collapse-item{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__header{
|
/deep/ .el-collapse-item__header{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border-bottom-color:#5a5a5a;
|
border-bottom-color:#5a5a5a;
|
||||||
|
@ -1001,11 +997,11 @@ export default {
|
||||||
height: 35px;
|
height: 35px;
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__wrap{
|
/deep/ .el-collapse-item__wrap{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__content{
|
/deep/ .el-collapse-item__content{
|
||||||
width:260px;
|
width:260px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0px;
|
top: 0px;
|
||||||
|
|
|
@ -80,12 +80,12 @@
|
||||||
<template slot="header">
|
<template slot="header">
|
||||||
<div v-if="task.IsCurrentTask">
|
<div v-if="task.IsCurrentTask">
|
||||||
<div>
|
<div>
|
||||||
{{ task.TaskName }}
|
{{ task.BlindName }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<div>
|
<div>
|
||||||
{{ task.TaskName }}
|
{{ task.BlindName }}
|
||||||
<el-button type="text" size="small" @click="previewDicoms(task)">
|
<el-button type="text" size="small" @click="previewDicoms(task)">
|
||||||
<span class="el-icon-view" />
|
<span class="el-icon-view" />
|
||||||
</el-button>
|
</el-button>
|
||||||
|
@ -93,8 +93,8 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span :style="{color: ((scope.row.isLymphNodes === 1 && scope.row.QuestionMark === 1) || (scope.row.isLymphNodes === 0 && scope.row.QuestionMark === 0)) && (scope.row.LesionType === 0 || scope.row.LesionType === 5) ? '#f66' : '#fff'}">
|
<span :style="{color: ((scope.row.isLymphNodes === 1 && scope.row.QuestionMark === 1) || (scope.row.isLymphNodes === 0 && scope.row.QuestionMark === 0)) && (scope.row.LesionType === 0 || scope.row.LesionType === 5) || (scope.row.QuestionMark === 12) ? '#f66' : '#fff'}">
|
||||||
<template v-if="task.VisitTaskId === visitTaskId && readingTaskState < 2 && [13,14,15].includes(scope.row.QuestionType)">
|
<template v-if="task.VisitTaskId === visitTaskId && readingTaskState < 2 && [13,14,15,42].includes(scope.row.QuestionType)">
|
||||||
<!-- 是否存在疾病(基线时可修改) -->
|
<!-- 是否存在疾病(基线时可修改) -->
|
||||||
<template v-if="task.IsBaseLine && scope.row.QuestionType=== 15">
|
<template v-if="task.IsBaseLine && scope.row.QuestionType=== 15">
|
||||||
<el-select
|
<el-select
|
||||||
|
@ -112,7 +112,7 @@
|
||||||
</el-select>
|
</el-select>
|
||||||
</template>
|
</template>
|
||||||
<!-- 整体肿瘤评估(非基线可修改) -->
|
<!-- 整体肿瘤评估(非基线可修改) -->
|
||||||
<template v-else-if="!task.IsBaseLine && scope.row.QuestionType=== 13">
|
<template v-else-if="!task.IsBaseLine && (scope.row.QuestionType=== 13 || scope.row.QuestionType=== 42)">
|
||||||
<el-select
|
<el-select
|
||||||
v-if="scope.row.Type==='select' && scope.row.DictionaryCode"
|
v-if="scope.row.Type==='select' && scope.row.DictionaryCode"
|
||||||
v-model="currentEvaluateResult"
|
v-model="currentEvaluateResult"
|
||||||
|
@ -172,7 +172,7 @@
|
||||||
@change="evaluateReasonChange"
|
@change="evaluateReasonChange"
|
||||||
/>
|
/>
|
||||||
<!-- 系统评估结果为:xxx,与当前调整的结果不一致,请填写调整原因 -->
|
<!-- 系统评估结果为:xxx,与当前调整的结果不一致,请填写调整原因 -->
|
||||||
<p v-if="currentEvaluateResult !== tumorEvaluate" style="width: 140px;padding:0 2px;white-space: normal;word-break: break-all;word-wrap: break-word;">{{ $t('trials:readingReport:message:msg6').replace('***', criterionName) }}<span style="color:red">{{ $fd('OverallAssessment',tumorEvaluate) }}</span>{{ $t('trials:readingReport:message:msg7') }}<span style="color:red">{{ $fd('OverallAssessment',currentEvaluateResult) }}</span>{{ $t('trials:readingReport:message:msg8') }}</p>
|
<p v-if="currentEvaluateResult !== tumorEvaluate" style="width: 140px;padding:0 2px;white-space: normal;word-break: break-all;word-wrap: break-word;">{{ $t('trials:readingReport:message:msg6') }}<span v-if="CriterionType === 2" style="color:red">{{ $fd('ImagingOverallAssessment_Lugano',tumorEvaluate) }}</span><span v-else style="color:red">{{ $fd('OverallAssessment',tumorEvaluate) }}</span>{{ $t('trials:readingReport:message:msg7') }}<span v-if="CriterionType === 2" style="color:red">{{ $fd('ImagingOverallAssessment_Lugano',currentEvaluateResult) }}</span><span v-else style="color:red">{{ $fd('OverallAssessment',currentEvaluateResult) }}</span>{{ $t('trials:readingReport:message:msg8') }}</p>
|
||||||
<p v-else-if="currentExistDisease !== isExistDisease" style="width: 140px;padding:0 2px;white-space: normal;word-break: break-all;word-wrap: break-word;">{{ $t('trials:readingReport:title:sysEvaluationRes') }}<span style="color:red">{{ $fd('ExistDisease',isExistDisease) }}</span>{{ $t('trials:readingReport:message:msg1') }}</p>
|
<p v-else-if="currentExistDisease !== isExistDisease" style="width: 140px;padding:0 2px;white-space: normal;word-break: break-all;word-wrap: break-word;">{{ $t('trials:readingReport:title:sysEvaluationRes') }}<span style="color:red">{{ $fd('ExistDisease',isExistDisease) }}</span>{{ $t('trials:readingReport:message:msg1') }}</p>
|
||||||
</template>
|
</template>
|
||||||
<!-- <template v-else>
|
<!-- <template v-else>
|
||||||
|
@ -195,7 +195,7 @@
|
||||||
<span v-else>{{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }}</span>
|
<span v-else>{{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }}</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-else-if="scope.row.QuestionType=== 13">
|
<template v-else-if="scope.row.QuestionType=== 13 || scope.row.QuestionType=== 42">
|
||||||
<el-tooltip v-if="getAnswerInfo(scope.row.Answer,task.VisitTaskId,'IsGlobalChange')" :content="`${$t('trials:reading:warnning:msg55')}${$fd(scope.row.DictionaryCode, getAnswerInfo(scope.row.Answer,task.VisitTaskId,'GlobalChangeAnswer'))}`" placement="top" effect="light">
|
<el-tooltip v-if="getAnswerInfo(scope.row.Answer,task.VisitTaskId,'IsGlobalChange')" :content="`${$t('trials:reading:warnning:msg55')}${$fd(scope.row.DictionaryCode, getAnswerInfo(scope.row.Answer,task.VisitTaskId,'GlobalChangeAnswer'))}`" placement="top" effect="light">
|
||||||
<span style="color:red;"> {{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }}</span>
|
<span style="color:red;"> {{ $fd(scope.row.DictionaryCode, scope.row.Answers[task.VisitTaskId]) }}</span>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
@ -212,7 +212,8 @@
|
||||||
{{ isNaN(parseInt(scope.row.Answers[task.VisitTaskId]))?scope.row.Answers[task.VisitTaskId]:`${scope.row.Answers[task.VisitTaskId]}` }}
|
{{ isNaN(parseInt(scope.row.Answers[task.VisitTaskId]))?scope.row.Answers[task.VisitTaskId]:`${scope.row.Answers[task.VisitTaskId]}` }}
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit">
|
<template v-else-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit">
|
||||||
{{ isNaN(parseInt(scope.row.Answers[task.VisitTaskId]))?scope.row.Answers[task.VisitTaskId]:`${scope.row.Answers[task.VisitTaskId]} ${$fd('ValueUnit',scope.row.Unit)}` }}
|
{{ `${scope.row.Answers[task.VisitTaskId]}` }}
|
||||||
|
<span v-if="scope.row.Answers[task.VisitTaskId] !== 'NA' && !isNaN(parseInt(scope.row.Answers[task.VisitTaskId]))">{{ `${$fd('ValueUnit',scope.row.Unit)}` }}</span>
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="scope.row.ValueType === 2">
|
<template v-else-if="scope.row.ValueType === 2">
|
||||||
{{ isNaN(parseInt(scope.row.Answers[task.VisitTaskId]))?scope.row.Answers[task.VisitTaskId]:`${scope.row.Answers[task.VisitTaskId]}%` }}
|
{{ isNaN(parseInt(scope.row.Answers[task.VisitTaskId]))?scope.row.Answers[task.VisitTaskId]:`${scope.row.Answers[task.VisitTaskId]}%` }}
|
||||||
|
@ -307,8 +308,7 @@ export default {
|
||||||
assessmentQuestions: [],
|
assessmentQuestions: [],
|
||||||
tLesionCount: null,
|
tLesionCount: null,
|
||||||
ntLesionCount: null,
|
ntLesionCount: null,
|
||||||
openWindow: null,
|
openWindow: null
|
||||||
criterionName: this.$route.query.criterionName
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -326,7 +326,6 @@ export default {
|
||||||
created() { this.getTableHeight() },
|
created() { this.getTableHeight() },
|
||||||
mounted() {
|
mounted() {
|
||||||
this.CriterionType = parseInt(localStorage.getItem('CriterionType'))
|
this.CriterionType = parseInt(localStorage.getItem('CriterionType'))
|
||||||
|
|
||||||
window.addEventListener('resize', () => {
|
window.addEventListener('resize', () => {
|
||||||
this.handleResize()
|
this.handleResize()
|
||||||
this.setScrollTop()
|
this.setScrollTop()
|
||||||
|
@ -363,7 +362,7 @@ export default {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
async beforeLeave() {
|
async beforeLeave() {
|
||||||
if (this.questionFormChangeState) {
|
if (this.questionFormChangeState && this.CriterionType !== 2) {
|
||||||
var msg = this.$t('trials:readingReport:message:msg5')
|
var msg = this.$t('trials:readingReport:message:msg5')
|
||||||
var isgo = await this.myConfirm(msg)
|
var isgo = await this.myConfirm(msg)
|
||||||
if (!isgo) {
|
if (!isgo) {
|
||||||
|
@ -542,9 +541,9 @@ export default {
|
||||||
this.currentExistDisease = obj.Answers[this.visitTaskId]
|
this.currentExistDisease = obj.Answers[this.visitTaskId]
|
||||||
this.answerArr.push({ id: item.QuestionId, answer: obj.Answers[this.visitTaskId], questionType: 15 })
|
this.answerArr.push({ id: item.QuestionId, answer: obj.Answers[this.visitTaskId], questionType: 15 })
|
||||||
}
|
}
|
||||||
if (item.QuestionType === 13) {
|
if (item.QuestionType === 13 || item.QuestionType === 42) {
|
||||||
this.currentEvaluateResult = obj.Answers[this.visitTaskId]
|
this.currentEvaluateResult = obj.Answers[this.visitTaskId]
|
||||||
this.answerArr.push({ id: item.QuestionId, answer: obj.Answers[this.visitTaskId], questionType: 13 })
|
this.answerArr.push({ id: item.QuestionId, answer: obj.Answers[this.visitTaskId], questionType: item.QuestionType })
|
||||||
}
|
}
|
||||||
if (item.QuestionType === 14) {
|
if (item.QuestionType === 14) {
|
||||||
this.currentTaskReason = obj.Answers[this.visitTaskId]
|
this.currentTaskReason = obj.Answers[this.visitTaskId]
|
||||||
|
@ -584,7 +583,7 @@ export default {
|
||||||
}
|
}
|
||||||
this.currentTaskReason = ''
|
this.currentTaskReason = ''
|
||||||
this.evaluateReasonChange('')
|
this.evaluateReasonChange('')
|
||||||
var idx = this.answerArr.findIndex(i => i.questionType === 13)
|
var idx = this.answerArr.findIndex(i => i.questionType === 13 || i.questionType === 42)
|
||||||
if (idx > -1) {
|
if (idx > -1) {
|
||||||
this.answerArr[idx].answer = val
|
this.answerArr[idx].answer = val
|
||||||
}
|
}
|
||||||
|
@ -691,7 +690,9 @@ export default {
|
||||||
await store.dispatch('reading/setCurrentReadingTaskState', 2)
|
await store.dispatch('reading/setCurrentReadingTaskState', 2)
|
||||||
var isAutoTask = await this.getAutoTaskVal()
|
var isAutoTask = await this.getAutoTaskVal()
|
||||||
if (isAutoTask) {
|
if (isAutoTask) {
|
||||||
DicomEvent.$emit('getNextTask')
|
// DicomEvent.$emit('reload')
|
||||||
|
// DicomEvent.$emit('getNextTask')
|
||||||
|
window.location.reload()
|
||||||
} else {
|
} else {
|
||||||
// '当前阅片任务已完成,是否进入下一个阅片任务?'
|
// '当前阅片任务已完成,是否进入下一个阅片任务?'
|
||||||
this.$confirm(this.$t('trials:readingReport:message:msg4'), {
|
this.$confirm(this.$t('trials:readingReport:message:msg4'), {
|
||||||
|
@ -699,7 +700,8 @@ export default {
|
||||||
distinguishCancelAndClose: true
|
distinguishCancelAndClose: true
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
DicomEvent.$emit('getNextTask')
|
window.location.reload()
|
||||||
|
// DicomEvent.$emit('getNextTask')
|
||||||
})
|
})
|
||||||
.catch(action => {
|
.catch(action => {
|
||||||
changeURLStatic('visitTaskId', this.visitTaskId)
|
changeURLStatic('visitTaskId', this.visitTaskId)
|
||||||
|
@ -707,6 +709,7 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
window.opener.postMessage('refreshTaskList', window.location)
|
window.opener.postMessage('refreshTaskList', window.location)
|
||||||
|
// DicomEvent.$emit('readingPageStateUpdate', { readingTaskState: 2 })
|
||||||
}
|
}
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
|
@ -728,13 +731,13 @@ export default {
|
||||||
this.openWindow.close()
|
this.openWindow.close()
|
||||||
}
|
}
|
||||||
var token = getToken()
|
var token = getToken()
|
||||||
|
var trialReadingCriterionId = this.$router.currentRoute.query.TrialReadingCriterionId
|
||||||
var subjectCode = this.$router.currentRoute.query.subjectCode
|
var subjectCode = this.$router.currentRoute.query.subjectCode
|
||||||
var subjectId = this.$router.currentRoute.query.subjectId
|
var subjectId = this.$router.currentRoute.query.subjectId
|
||||||
var trialId = this.$router.currentRoute.query.trialId
|
var trialId = this.$router.currentRoute.query.trialId
|
||||||
var isReadingTaskViewInOrder = this.$router.currentRoute.query.isReadingTaskViewInOrder
|
var isReadingTaskViewInOrder = this.$router.currentRoute.query.isReadingTaskViewInOrder
|
||||||
var criterionType = this.$router.currentRoute.query.criterionType
|
var criterionType = this.$router.currentRoute.query.criterionType
|
||||||
var readingTool = this.$router.currentRoute.query.readingTool
|
var readingTool = this.$router.currentRoute.query.readingTool
|
||||||
var trialReadingCriterionId = this.$router.currentRoute.query.TrialReadingCriterionId
|
|
||||||
var path = `/readingDicoms?TrialReadingCriterionId=${trialReadingCriterionId}&trialId=${trialId}&subjectCode=${subjectCode}&subjectId=${subjectId}&visitTaskId=${task.VisitTaskId}&isReadingTaskViewInOrder=${isReadingTaskViewInOrder}&criterionType=${criterionType}&readingTool=${readingTool}&TokenKey=${token}`
|
var path = `/readingDicoms?TrialReadingCriterionId=${trialReadingCriterionId}&trialId=${trialId}&subjectCode=${subjectCode}&subjectId=${subjectId}&visitTaskId=${task.VisitTaskId}&isReadingTaskViewInOrder=${isReadingTaskViewInOrder}&criterionType=${criterionType}&readingTool=${readingTool}&TokenKey=${token}`
|
||||||
const routeData = this.$router.resolve({ path })
|
const routeData = this.$router.resolve({ path })
|
||||||
this.openWindow = window.open(routeData.href, '_blank')
|
this.openWindow = window.open(routeData.href, '_blank')
|
||||||
|
@ -747,7 +750,7 @@ export default {
|
||||||
this.answers = []
|
this.answers = []
|
||||||
var isExistEvaluateResult = false
|
var isExistEvaluateResult = false
|
||||||
this.answerArr.map(item => {
|
this.answerArr.map(item => {
|
||||||
if (item.questionType === 13) {
|
if (item.questionType === 13 || item.questionType === 42) {
|
||||||
evaluateResult = item.answer
|
evaluateResult = item.answer
|
||||||
isExistEvaluateResult = true
|
isExistEvaluateResult = true
|
||||||
}
|
}
|
||||||
|
@ -832,57 +835,57 @@ export default {
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
border:none;
|
border:none;
|
||||||
>>>.el-card__body{
|
/deep/ .el-card__body{
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// >>>.el-table__cell{
|
// /deep/ .el-table__cell{
|
||||||
// background-color: #000;
|
// background-color: #000;
|
||||||
// color: #ffffff;
|
// color: #ffffff;
|
||||||
// }
|
// }
|
||||||
// >>>.el-table{
|
// /deep/ .el-table{
|
||||||
// background-color: #000;
|
// background-color: #000;
|
||||||
// color: #ffffff;
|
// color: #ffffff;
|
||||||
// }
|
// }
|
||||||
// >>>.el-table__cell{
|
// /deep/ .el-table__cell{
|
||||||
// background-color: #000;
|
// background-color: #000;
|
||||||
// color: #ffffff;
|
// color: #ffffff;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
>>>.el-table, .el-table__expanded-cell {
|
/deep/ .el-table, .el-table__expanded-cell {
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
|
|
||||||
>>>.el-table th, .el-table tr {
|
/deep/ .el-table th, .el-table tr {
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
>>>.el-table__body tr > td{
|
/deep/ .el-table__body tr > td{
|
||||||
background-color:#000 !important;
|
background-color:#000 !important;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
>>>.el-table__body tr:hover > td{
|
/deep/ .el-table__body tr:hover > td{
|
||||||
background-color:#858282 !important;
|
background-color:#858282 !important;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
>>>.el-table--border th.gutter:last-of-type{
|
/deep/ .el-table--border th.gutter:last-of-type{
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
>>>.el-card__header{
|
/deep/ .el-card__header{
|
||||||
border: none;
|
border: none;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
>>>.el-switch__label{
|
/deep/ .el-switch__label{
|
||||||
color:#fff;
|
color:#fff;
|
||||||
}
|
}
|
||||||
>>>.el-switch__label.is-active{
|
/deep/ .el-switch__label.is-active{
|
||||||
color: #428bca;
|
color: #428bca;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -0,0 +1,168 @@
|
||||||
|
<template>
|
||||||
|
<div v-loading="loading" class="preview-wrapper">
|
||||||
|
<div class="left-wrapper">
|
||||||
|
<div class="basic-info">
|
||||||
|
<span v-if="srInfo.SubjectCode">{{ `${srInfo.SubjectCode}` }}</span>
|
||||||
|
<span v-if="srInfo.TaskBlindName">({{ `${srInfo.TaskBlindName}` }})</span>
|
||||||
|
</div>
|
||||||
|
<div class="basic-content">
|
||||||
|
<div v-for="(item,index) in srInfo.SrList" :key="index" class="sr-wrapper">
|
||||||
|
|
||||||
|
<div class="sr-item" :class="{activeBtn:index === selectedIdx}" @click.prevent="preview(item,index)">
|
||||||
|
{{ index+1 }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- <div v-else class="basic-content-empty">
|
||||||
|
<span>{{ $t('trials:clinicaldara:title:nodata') }}</span>
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
<div class="right-wrapper">
|
||||||
|
<template v-for="item in srhtmls">
|
||||||
|
<div v-if="item.index === selectedIdx" :key="item.index" class="right-content" v-html="item.htmlData" />
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import axios from 'axios'
|
||||||
|
export default {
|
||||||
|
name: 'SrList',
|
||||||
|
props: {
|
||||||
|
srInfo: {
|
||||||
|
type: Object,
|
||||||
|
default() {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isShow: false,
|
||||||
|
selectedIdx: -1,
|
||||||
|
loading: false,
|
||||||
|
srhtmls: [],
|
||||||
|
seletedHtml: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.initList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async initList() {
|
||||||
|
if (this.srInfo.SrList.length > 0) {
|
||||||
|
this.loading = true
|
||||||
|
for (let i = 0; i < this.srInfo.SrList.length; i++) {
|
||||||
|
var htmlUrl = this.OSSclientConfig.basePath + this.srInfo.SrList[i]
|
||||||
|
var res = await axios.get(htmlUrl)
|
||||||
|
this.srhtmls.push({ index: i, htmlData: res.data })
|
||||||
|
}
|
||||||
|
this.loading = false
|
||||||
|
|
||||||
|
this.selectedIdx = 0
|
||||||
|
// this.getHtml(this.srInfo.SrList[0], 0)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getHtml(url, index) {
|
||||||
|
this.loading = true
|
||||||
|
var htmlUrl = this.OSSclientConfig.basePath + url
|
||||||
|
axios.get(htmlUrl).then(response => {
|
||||||
|
this.seletedHtml = response.data
|
||||||
|
this.srhtmls.push({ index: index, htmlData: response.data })
|
||||||
|
|
||||||
|
this.loading = false
|
||||||
|
return
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
preview(url, index) {
|
||||||
|
// var i = this.srhtmls.findIndex(i => i.index === index)
|
||||||
|
// if (i === -1) {
|
||||||
|
// this.getHtml(url, index)
|
||||||
|
// } else {
|
||||||
|
// this.seletedHtml = this.srhtmls[i].htmlData
|
||||||
|
// }
|
||||||
|
this.selectedIdx = index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.preview-wrapper{
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row !important;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 7px;
|
||||||
|
height: 7px;
|
||||||
|
}
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
border-radius: 10px;
|
||||||
|
background: #d0d0d0;
|
||||||
|
}
|
||||||
|
.left-wrapper{
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin-right: 10px;
|
||||||
|
height: 100%;
|
||||||
|
width: 150px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
|
||||||
|
.basic-info{
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: bold;
|
||||||
|
background-color: #fff;
|
||||||
|
color: #fbfbfb;
|
||||||
|
}
|
||||||
|
.activeBtn{
|
||||||
|
color: #428bca;
|
||||||
|
border-color: #428bca;
|
||||||
|
}
|
||||||
|
.basic-content{
|
||||||
|
height: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
.basic-content-empty{
|
||||||
|
padding: 5px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.sr-wrapper{
|
||||||
|
padding: 5px;
|
||||||
|
|
||||||
|
}
|
||||||
|
.sr-item{
|
||||||
|
box-sizing: border-box;
|
||||||
|
border-bottom: 2px solid #f3f3f3;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
cursor: pointer;
|
||||||
|
padding-left: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.right-wrapper{
|
||||||
|
flex: 1;
|
||||||
|
height: 100%;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
.right-content{
|
||||||
|
height:100%;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding: 0 10px;
|
||||||
|
// color: #ddd;
|
||||||
|
.footnote{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -4,7 +4,7 @@
|
||||||
{{ subjectCode }}
|
{{ subjectCode }}
|
||||||
</h4>
|
</h4>
|
||||||
<h4 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;text-align: center;background-color: #4c4c4c;margin-bottom: 5px;">
|
<h4 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;text-align: center;background-color: #4c4c4c;margin-bottom: 5px;">
|
||||||
{{ taskName }}
|
{{ taskBlindName }}
|
||||||
</h4>
|
</h4>
|
||||||
<div class="ps">
|
<div class="ps">
|
||||||
<el-collapse v-model="activeNames">
|
<el-collapse v-model="activeNames">
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
<div
|
<div
|
||||||
v-for="(series, i) in study.SeriesList"
|
v-for="(series, i) in study.SeriesList"
|
||||||
:key="i"
|
:key="i"
|
||||||
style="position:relative;margin:10px 0px;"
|
style="position:relative;margin-top:5px;"
|
||||||
series-type="current"
|
series-type="current"
|
||||||
@click="showSeriesImage(index,i,series)"
|
@click="showSeriesImage(index,i,series)"
|
||||||
>
|
>
|
||||||
|
@ -41,49 +41,44 @@
|
||||||
:class="{'series-active': i==seriesIndex && index === studyIndex}"
|
:class="{'series-active': i==seriesIndex && index === studyIndex}"
|
||||||
class="series-wrapper"
|
class="series-wrapper"
|
||||||
>
|
>
|
||||||
<!-- <el-image
|
<el-image
|
||||||
class="image-preview"
|
class="image-preview"
|
||||||
:src="series.previewImageUrl"
|
:src="series.previewImageUrl"
|
||||||
fit="fill"
|
fit="fill"
|
||||||
/> -->
|
|
||||||
<img
|
|
||||||
class="image-preview"
|
|
||||||
:src="series.previewImageUrl"
|
|
||||||
crossorigin="anonymous"
|
crossorigin="anonymous"
|
||||||
alt=""
|
/>
|
||||||
fit="fill"
|
|
||||||
>
|
|
||||||
<div class="image-desc">
|
<div class="image-desc">
|
||||||
<div class="flex-div">
|
<div class="flex-div">
|
||||||
<div v-show="!study.IsCriticalSequence">#{{ series.seriesNumber }} </div>
|
<div v-if="!study.IsCriticalSequence">#{{ series.seriesNumber }} </div>
|
||||||
<div v-if="series.isDicom && series.prefetchInstanceCount<series.instanceCount">
|
<div v-if="series.isDicom && series.prefetchInstanceCount<series.instanceCount && series.modality!== 'SR'">
|
||||||
<!-- 下载 -->
|
<!-- 下载 -->
|
||||||
<el-tooltip v-if="!series.isLoading" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
<el-tooltip v-if="!series.isLoading" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
||||||
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<!-- 暂停 -->
|
<!-- 暂停 -->
|
||||||
<el-tooltip v-else class="item" effect="dark" :content="$t('trials:reading:button:pause')" placement="bottom">
|
<!-- <el-tooltip v-else class="item" effect="dark" :content="$t('trials:reading:button:pause')" placement="bottom">
|
||||||
<i class="el-icon-video-pause" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="stopLoadSeries(series,index,i)" />
|
<i class="el-icon-video-pause" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="stopLoadSeries(series,index,i)" />
|
||||||
</el-tooltip>
|
</el-tooltip> -->
|
||||||
</div>
|
</div>
|
||||||
<el-tooltip v-else-if="series.isDicom && series.prefetchInstanceCount === 0" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
<el-tooltip v-else-if="series.isDicom && series.prefetchInstanceCount === 0 &&series.modality!== 'SR'" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
||||||
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</div>
|
</div>
|
||||||
<p v-show="series.description">
|
<p v-show="series.description">
|
||||||
<el-tooltip class="item" effect="dark" :content="series.description" placement="right">
|
<el-tooltip class="item" effect="dark" :content="series.description" placement="right">
|
||||||
<div>{{ series.description }}</div>
|
<div style="">{{ series.description }}</div>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p v-show="series.sliceThickness && !study.IsCriticalSequence">
|
<p v-show="series.sliceThickness && !study.IsCriticalSequence">
|
||||||
T: {{ series.sliceThickness }}
|
T: {{ parseFloat(series.sliceThickness).toFixed(digitPlaces) }}
|
||||||
</p>
|
</p>
|
||||||
<p v-show="series.instanceCount">
|
<p v-show="series.instanceCount">
|
||||||
{{ series.modality }}: {{ series.instanceCount }} image
|
{{ series.modality }}: {{ series.instanceCount }} image
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="flex-div">
|
<div class="flex-div">
|
||||||
<div v-if="measureData.findIndex(v=>v.SeriesId === series.seriesId && v.MeasureData) > -1">
|
<div v-if="measureData && measureData.findIndex(v=>v.SeriesId === series.seriesId && v.MeasureData) > -1">
|
||||||
<!-- 有标注 -->
|
<!-- 有标注 -->
|
||||||
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:marked')" placement="right">
|
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:marked')" placement="right">
|
||||||
<i class="el-icon-star-on" style="font-size: 16px;color: #ff5722;" />
|
<i class="el-icon-star-on" style="font-size: 16px;color: #ff5722;" />
|
||||||
|
@ -104,22 +99,47 @@
|
||||||
</el-collapse-item>
|
</el-collapse-item>
|
||||||
</el-collapse>
|
</el-collapse>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="sr-wrapper">
|
||||||
|
<el-dialog
|
||||||
|
:visible.sync="srDialogVisible"
|
||||||
|
:custom-class="isSrFullscreen?'sr-full-dialog-container':'sr-dialog-container'"
|
||||||
|
:show-close="false"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
:fullscreen="isSrFullscreen"
|
||||||
|
>
|
||||||
|
<span slot="title" class="dialog-footer">
|
||||||
|
<div style="position: absolute;right: 20px;top: 10px;">
|
||||||
|
<svg-icon :icon-class="isSrFullscreen?'exit-fullscreen':'fullscreen'" style="cursor: pointer;font-size: 20px;color:#000;" @click="isSrFullscreen=!isSrFullscreen" />
|
||||||
|
<svg-icon icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;" @click="srDialogVisible = false" />
|
||||||
|
</div>
|
||||||
|
</span>
|
||||||
|
<div style="height: 100%;margin:0;">
|
||||||
|
<SrList
|
||||||
|
v-if="srDialogVisible"
|
||||||
|
:sr-info="srInfo"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import * as dicomParser from 'dicom-parser'
|
import * as dicomParser from 'dicom-parser'
|
||||||
import * as cornerstone from 'cornerstone-core'
|
import * as cornerstone from 'cornerstone-core'
|
||||||
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
||||||
|
|
||||||
import requestPoolManager from '@/utils/request-pool'
|
import requestPoolManager from '@/utils/request-pool'
|
||||||
import DicomEvent from './DicomEvent'
|
import DicomEvent from './DicomEvent'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
|
import SrList from './SrList'
|
||||||
cornerstoneWADOImageLoader.external.dicomParser = dicomParser
|
cornerstoneWADOImageLoader.external.dicomParser = dicomParser
|
||||||
cornerstoneWADOImageLoader.external.cornerstone = cornerstone
|
cornerstoneWADOImageLoader.external.cornerstone = cornerstone
|
||||||
// const maximumSizeInBytes = 1024 * 1024 * 1024 // 1 GB
|
const maximumSizeInBytes = 1024 * 1024 * 1024 // 1 GB
|
||||||
|
cornerstone.imageCache.setMaximumSizeBytes(maximumSizeInBytes)
|
||||||
export default {
|
export default {
|
||||||
name: 'StudyList',
|
name: 'StudyList',
|
||||||
|
components: { SrList },
|
||||||
props: {
|
props: {
|
||||||
trialId: {
|
trialId: {
|
||||||
type: String,
|
type: String,
|
||||||
|
@ -141,10 +161,6 @@ export default {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: ''
|
||||||
},
|
},
|
||||||
taskName: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
isReadingShowSubjectInfo: {
|
isReadingShowSubjectInfo: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: true
|
required: true
|
||||||
|
@ -154,6 +170,7 @@ export default {
|
||||||
return {
|
return {
|
||||||
studyList: [],
|
studyList: [],
|
||||||
cachedImages: [],
|
cachedImages: [],
|
||||||
|
showSeriesList: [],
|
||||||
studyIndex: null,
|
studyIndex: null,
|
||||||
seriesIndex: null,
|
seriesIndex: null,
|
||||||
loading: false,
|
loading: false,
|
||||||
|
@ -163,9 +180,15 @@ export default {
|
||||||
activeNames: [],
|
activeNames: [],
|
||||||
seriesArr: [],
|
seriesArr: [],
|
||||||
imageList: [],
|
imageList: [],
|
||||||
loopLoadStatus: 0 // -1暂停下载 0未下载完成 1下载完成
|
loopLoadStatus: 0, // -1暂停下载 0未下载完成 1下载完成
|
||||||
|
isSrFullscreen: false,
|
||||||
|
srDialogVisible: false,
|
||||||
|
srInfo: {},
|
||||||
|
digitPlaces: 2,
|
||||||
|
visitTaskIdx: -1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(['visitTaskList', 'currentTaskId', 'activeSeries'])
|
...mapGetters(['visitTaskList', 'currentTaskId', 'activeSeries'])
|
||||||
},
|
},
|
||||||
|
@ -173,11 +196,18 @@ export default {
|
||||||
visitTaskList: {
|
visitTaskList: {
|
||||||
immediate: true,
|
immediate: true,
|
||||||
handler(val) {
|
handler(val) {
|
||||||
console.log('visitTaskList--watch')
|
|
||||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
if (idx === -1) return
|
if (idx === -1) return
|
||||||
this.measureData = this.visitTaskList[idx].MeasureData
|
this.measureData = this.visitTaskList[idx].MeasureData
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
visitTaskId: {
|
||||||
|
immediate: true,
|
||||||
|
handler(val) {
|
||||||
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
|
if (idx === -1) return
|
||||||
|
this.visitTaskIdx = idx
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// activeSeries: {
|
// activeSeries: {
|
||||||
// immediate: true,
|
// immediate: true,
|
||||||
|
@ -190,6 +220,8 @@ export default {
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.subjectCode = this.$router.currentRoute.query.subjectCode
|
this.subjectCode = this.$router.currentRoute.query.subjectCode
|
||||||
|
var digitPlaces = Number(localStorage.getItem('digitPlaces'))
|
||||||
|
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
|
||||||
DicomEvent.$on('refreshStudyListMeasureData', () => {
|
DicomEvent.$on('refreshStudyListMeasureData', () => {
|
||||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
this.measureData = this.visitTaskList[idx].MeasureData
|
this.measureData = this.visitTaskList[idx].MeasureData
|
||||||
|
@ -201,15 +233,65 @@ export default {
|
||||||
// this.studyList = this.visitTaskList[idx].StudyList
|
// this.studyList = this.visitTaskList[idx].StudyList
|
||||||
// }
|
// }
|
||||||
// })
|
// })
|
||||||
|
|
||||||
cornerstone.events.addEventListener('cornerstoneimageloaded', this.cornerstoneImageLoaded)
|
cornerstone.events.addEventListener('cornerstoneimageloaded', this.cornerstoneImageLoaded)
|
||||||
|
// cornerstone.events.addEventListener('cornerstoneimagecachefull', this.cornerstoneimagecachefull)
|
||||||
|
// cornerstone.events.addEventListener('cornerstoneimagecachechanged', this.cornerstoneimagecachechanged)
|
||||||
|
window.addEventListener('beforeunload', e => {
|
||||||
|
cornerstone.imageCache.purgeCache()
|
||||||
|
})
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
cornerstone.imageCache.purgeCache()
|
cornerstone.imageCache.purgeCache()
|
||||||
DicomEvent.$off('refreshStudyListMeasureData')
|
DicomEvent.$off('refreshStudyListMeasureData')
|
||||||
|
window.removeEventListener('beforeunload', e => { cornerstone.imageCache.purgeCache() })
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
initStudyInfo() {
|
initStudyInfo() {
|
||||||
|
const loading = this.$loading({ fullscreen: true })
|
||||||
|
// 初始化待渲染序列
|
||||||
|
this.getInitSeries().then((res) => {
|
||||||
|
requestPoolManager.startTaskTimer()
|
||||||
|
res.map((item) => {
|
||||||
|
this.loadInitialImage(item)
|
||||||
|
})
|
||||||
|
var i = res.findIndex(s => s.isCurrentTask)
|
||||||
|
if (i > -1) {
|
||||||
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
|
if (idx > -1) {
|
||||||
|
this.measureData = this.visitTaskList[idx].MeasureData
|
||||||
|
this.studyList = this.visitTaskList[idx].StudyList
|
||||||
|
var priority = parseInt(new Date().getTime())
|
||||||
|
res[i].imageIds.map(image => {
|
||||||
|
priority--
|
||||||
|
this.imageList.push({ imageId: image, seriesId: res[i].seriesId, studyIndex: res[i].studyIndex, seriesIndex: res[i].seriesIndex, visitTaskId: res[i].visitTaskId, priority })
|
||||||
|
})
|
||||||
|
|
||||||
|
// this.studyList.map((study, studyIndex) => {
|
||||||
|
// study.SeriesList.map((series, seriesIndex) => {
|
||||||
|
// if (series.modality !== 'SR') {
|
||||||
|
// series.imageIds.map(image => {
|
||||||
|
// var p = priority - seriesIndex
|
||||||
|
// if (series.seriesId === res[i].seriesId) {
|
||||||
|
// p = priority
|
||||||
|
// } else {
|
||||||
|
// --p
|
||||||
|
// }
|
||||||
|
// this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority: p })
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// })
|
||||||
|
this.loopLoad()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DicomEvent.$emit('loadImageStacks', res)
|
||||||
|
loading.close()
|
||||||
|
this.isRender = true
|
||||||
|
}).catch(() => {
|
||||||
|
loading.close()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
initStudyInfo2() {
|
||||||
console.log('initStudyInfo')
|
console.log('initStudyInfo')
|
||||||
const loading = this.$loading({ fullscreen: true })
|
const loading = this.$loading({ fullscreen: true })
|
||||||
// 初始化待渲染序列
|
// 初始化待渲染序列
|
||||||
|
@ -229,17 +311,19 @@ export default {
|
||||||
|
|
||||||
this.studyList.map((study, studyIndex) => {
|
this.studyList.map((study, studyIndex) => {
|
||||||
study.SeriesList.map((series, seriesIndex) => {
|
study.SeriesList.map((series, seriesIndex) => {
|
||||||
|
if (series.modality !== 'SR') {
|
||||||
// var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
// var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
||||||
// if (sliceThickness === 5 || series.instanceCount <= 100) {
|
// if (sliceThickness === 5 || series.instanceCount <= 100) {
|
||||||
series.imageIds.map(image => {
|
series.imageIds.map(image => {
|
||||||
let priority = 0
|
let priority = 0
|
||||||
if (series.seriesId === res[i].seriesId) {
|
if (series.seriesId === res[i].seriesId) {
|
||||||
priority = parseInt(new Date().getTime()) * 10
|
priority = parseInt(new Date().getTime()) * 10
|
||||||
} else {
|
} else {
|
||||||
priority = --p
|
priority = --p
|
||||||
}
|
}
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
})
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
this.loopLoad()
|
this.loopLoad()
|
||||||
|
@ -257,7 +341,9 @@ export default {
|
||||||
var p = parseInt(new Date().getTime())
|
var p = parseInt(new Date().getTime())
|
||||||
var imageId = seriesInfo.imageIds[seriesInfo.imageIdIndex]
|
var imageId = seriesInfo.imageIds[seriesInfo.imageIdIndex]
|
||||||
requestPoolManager.loadAndCacheImagePlus(imageId, seriesInfo.seriesId, p * 100).then(res => {
|
requestPoolManager.loadAndCacheImagePlus(imageId, seriesInfo.seriesId, p * 100).then(res => {
|
||||||
this.imageLoaded(seriesInfo, res.data.string('x0020000e'))
|
if (seriesInfo.isCurrentTask) {
|
||||||
|
this.imageLoaded({ studyIndex: seriesInfo.studyIndex, seriesIndex: seriesInfo.seriesIndex, imageId: res.imageId }, res.data.string('x0020000e'))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getStudyList() {
|
getStudyList() {
|
||||||
|
@ -513,31 +599,47 @@ export default {
|
||||||
},
|
},
|
||||||
showSeriesImage(studyIndex, seriesIndex, series) {
|
showSeriesImage(studyIndex, seriesIndex, series) {
|
||||||
if (series.isDicom) {
|
if (series.isDicom) {
|
||||||
this.studyIndex = studyIndex
|
if (series.modality === 'SR') {
|
||||||
this.seriesIndex = seriesIndex
|
this.studyIndex = studyIndex
|
||||||
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
this.seriesIndex = seriesIndex
|
||||||
var dicomStatck = this.studyList[studyIndex].SeriesList[seriesIndex]
|
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
||||||
this.$emit('loadImageStack', dicomStatck)
|
this.srDialogVisible = true
|
||||||
if (!series.loadStatus) {
|
this.srInfo = {
|
||||||
this.loopLoadStatus = -1
|
SubjectCode: series.studyCode,
|
||||||
series.isLoading = true
|
TaskBlindName: series.taskBlindName,
|
||||||
var p = parseInt(new Date().getTime())
|
SrList: series.instanceHtmlPathList
|
||||||
series.imageIds.map((imageId, i) => {
|
}
|
||||||
var priority = ''
|
} else {
|
||||||
if (i === 0) {
|
this.studyIndex = studyIndex
|
||||||
priority = parseInt(new Date().getTime()) * 10
|
this.seriesIndex = seriesIndex
|
||||||
} else {
|
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
||||||
priority = --p
|
var dicomStatck = this.studyList[studyIndex].SeriesList[seriesIndex]
|
||||||
}
|
this.$emit('loadImageStack', dicomStatck)
|
||||||
this.imageList.push({ imageId: imageId, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
if (!series.loadStatus && series.modality !== 'SR') {
|
||||||
})
|
this.loopLoadStatus = -1
|
||||||
if (this.imageList.length > 0) {
|
series.isLoading = true
|
||||||
this.loopLoadStatus = 0
|
var isAddToTakPool = false
|
||||||
this.loopLoad()
|
if (this.showSeriesList.includes(`${studyIndex}_${seriesIndex}`)) {
|
||||||
|
isAddToTakPool = true
|
||||||
|
} else {
|
||||||
|
this.showSeriesList.push(`${studyIndex}_${seriesIndex}`)
|
||||||
|
}
|
||||||
|
if (!isAddToTakPool) {
|
||||||
|
var priority = parseInt(new Date().getTime())
|
||||||
|
series.imageIds.map((imageId) => {
|
||||||
|
this.imageList.push({ imageId: imageId, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
|
})
|
||||||
|
if (this.imageList.length > 0) {
|
||||||
|
this.loopLoadStatus = 0
|
||||||
|
this.loopLoad()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
requestPoolManager.changePriority(series.seriesId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
DicomEvent.$emit('loadMeasurementList', { visitTaskId: this.visitTaskId, taskBlindName: this.taskBlindName })
|
DicomEvent.$emit('loadMeasurementList', { visitTaskId: this.visitTaskId, taskBlindName: this.taskBlindName })
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// 非Dicom预览
|
// 非Dicom预览
|
||||||
this.$emit('previewNoneDicoms', { visitTaskId: this.visitTaskId })
|
this.$emit('previewNoneDicoms', { visitTaskId: this.visitTaskId })
|
||||||
|
@ -583,21 +685,26 @@ export default {
|
||||||
store.dispatch('reading/setActiveSeries', series)
|
store.dispatch('reading/setActiveSeries', series)
|
||||||
},
|
},
|
||||||
loadImages(taskInfo) {
|
loadImages(taskInfo) {
|
||||||
const isBaseLineTask = taskInfo.IsBaseLineTask
|
// const isBaseLineTask = taskInfo.IsBaseLineTask
|
||||||
const isCurrentTask = taskInfo.IsCurrentTask
|
const isCurrentTask = taskInfo.IsCurrentTask
|
||||||
// var priority = isCurrentTask ? parseInt(new Date().getTime()) : 999
|
// var priority = isCurrentTask ? parseInt(new Date().getTime()) : 999
|
||||||
var priority = parseInt(new Date().getTime())
|
var priority = parseInt(new Date().getTime())
|
||||||
this.studyList.map((study, studyIndex) => {
|
this.studyList.map((study, studyIndex) => {
|
||||||
study.SeriesList.map((series, seriesIndex) => {
|
study.SeriesList.map((series, seriesIndex) => {
|
||||||
if (!series.loadStatus && series.isDicom) {
|
if (!series.loadStatus && series.isDicom && series.modality !== 'SR') {
|
||||||
if (isCurrentTask || isBaseLineTask) {
|
// if (isCurrentTask || isBaseLineTask) {
|
||||||
// 当前任务/基线任务下载所有影像
|
// // 当前任务/基线任务下载所有影像
|
||||||
series.imageIds.map(image => {
|
// series.imageIds.map(image => {
|
||||||
priority = priority - 1
|
// this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
// })
|
||||||
})
|
// } else if (!isBaseLineTask && !isCurrentTask && study.IsCriticalSequence) {
|
||||||
} else if (!isBaseLineTask && !isCurrentTask && study.IsCriticalSequence) {
|
// // 非当前随访任务下载关键影像
|
||||||
// 非当前随访任务下载关键影像
|
// series.imageIds.map(image => {
|
||||||
|
// this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
// 均只下载关键序列
|
||||||
|
if (!isCurrentTask && study.IsCriticalSequence) {
|
||||||
series.imageIds.map(image => {
|
series.imageIds.map(image => {
|
||||||
priority = priority - 1
|
priority = priority - 1
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
|
@ -608,47 +715,19 @@ export default {
|
||||||
})
|
})
|
||||||
this.loopLoad()
|
this.loopLoad()
|
||||||
},
|
},
|
||||||
loadImages2(taskInfo) {
|
|
||||||
var priority = parseInt(new Date().getTime())
|
|
||||||
// 当前任务只自动下载层厚为5mm 或者影像数量小于 100张
|
|
||||||
if (taskInfo.IsCurrentTask) {
|
|
||||||
this.studyList.map((study, studyIndex) => {
|
|
||||||
study.SeriesList.map((series, seriesIndex) => {
|
|
||||||
var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
|
||||||
if (sliceThickness === 5 || series.instanceCount <= 100) {
|
|
||||||
series.imageIds.map(image => {
|
|
||||||
priority = priority - 1
|
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
this.loopLoad()
|
|
||||||
} else {
|
|
||||||
// 非当前任务只自动下载关键序列
|
|
||||||
var idx = this.studyList.findIndex(study => study.IsCriticalSequence)
|
|
||||||
if (idx === -1) return
|
|
||||||
|
|
||||||
this.studyList[idx].SeriesList.forEach((series, seriesIndex) => {
|
|
||||||
if (!series.loadStatus) {
|
|
||||||
series.imageIds.map(image => {
|
|
||||||
priority--
|
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: idx, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.loopLoad()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
loopLoad() {
|
loopLoad() {
|
||||||
if (this.imageList.length > 0) {
|
if (this.imageList.length > 0) {
|
||||||
requestPoolManager.startTaskTimer()
|
// requestPoolManager.startTaskTimer()
|
||||||
this.imageList.map(image => {
|
this.imageList.map(image => {
|
||||||
requestPoolManager.loadAndCacheImagePlus(image.imageId, image.seriesId, image.priority).then(res => {
|
requestPoolManager.loadAndCacheImagePlus(image.imageId, image.seriesId, image.priority).then(res => {
|
||||||
this.imageLoaded({ visitTaskId: this.visitTaskId, imageId: image.imageId }, res.data.string('x0020000e'))
|
if (res) {
|
||||||
|
this.imageLoaded(image, res.data.string('x0020000e'))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
requestPoolManager.sortTaskPool()
|
||||||
|
|
||||||
this.imageList = []
|
this.imageList = []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -657,15 +736,26 @@ export default {
|
||||||
console.log('loadSeries')
|
console.log('loadSeries')
|
||||||
this.loopLoadStatus = -1
|
this.loopLoadStatus = -1
|
||||||
this.$set(this.studyList[studyIndex].SeriesList[seriesIndex], 'isLoading', true)
|
this.$set(this.studyList[studyIndex].SeriesList[seriesIndex], 'isLoading', true)
|
||||||
const priority = parseInt(new Date().getTime())
|
var isAddToTakPool = false
|
||||||
series.imageIds.map(image => {
|
if (this.showSeriesList.includes(`${studyIndex}_${seriesIndex}`)) {
|
||||||
if (series.imageloadedArr.indexOf(image) === -1) {
|
isAddToTakPool = true
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
} else {
|
||||||
|
this.showSeriesList.push(`${studyIndex}_${seriesIndex}`)
|
||||||
|
}
|
||||||
|
if (!isAddToTakPool) {
|
||||||
|
const priority = parseInt(new Date().getTime())
|
||||||
|
series.imageIds.map(image => {
|
||||||
|
const index = this.cachedImages.findIndex(item => item.uri === image)
|
||||||
|
if (index === -1) {
|
||||||
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (this.imageList.length > 0) {
|
||||||
|
this.loopLoadStatus = 0
|
||||||
|
this.loopLoad()
|
||||||
}
|
}
|
||||||
})
|
} else {
|
||||||
if (this.imageList.length > 0) {
|
requestPoolManager.changePriority(series.seriesId)
|
||||||
this.loopLoadStatus = 0
|
|
||||||
this.loopLoad()
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 暂停下载
|
// 暂停下载
|
||||||
|
@ -675,16 +765,33 @@ export default {
|
||||||
this.$set(this.studyList[studyIndex].SeriesList[seriesIndex], 'isLoading', false)
|
this.$set(this.studyList[studyIndex].SeriesList[seriesIndex], 'isLoading', false)
|
||||||
},
|
},
|
||||||
async imageLoaded(image, seriesUid) {
|
async imageLoaded(image, seriesUid) {
|
||||||
await store.dispatch('reading/updateStudyList', { visitTaskId: image.visitTaskId, imageId: image.imageId, seriesUid })
|
// await store.dispatch('reading/updateStudyList', { visitTaskId: image.visitTaskId, imageId: image.imageId, seriesUid })
|
||||||
|
// console.log(this.studyList[image.studyIndex].SeriesList[image.seriesIndex])
|
||||||
|
if (image.studyIndex > -1 && image.seriesIndex > -1) {
|
||||||
|
var prefetchInstanceCount = this.studyList[image.studyIndex].SeriesList[image.seriesIndex].prefetchInstanceCount
|
||||||
|
var instanceCount = this.studyList[image.studyIndex].SeriesList[image.seriesIndex].instanceCount
|
||||||
|
if (this.studyList[image.studyIndex].SeriesList[image.seriesIndex].imageloadedArr.indexOf(image.imageId) < 0) {
|
||||||
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].imageloadedArr.push(image.imageId)
|
||||||
|
prefetchInstanceCount = prefetchInstanceCount + 1
|
||||||
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].prefetchInstanceCount = prefetchInstanceCount
|
||||||
|
}
|
||||||
|
if (prefetchInstanceCount >= instanceCount) {
|
||||||
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].prefetchInstanceCount = this.studyList[image.studyIndex].SeriesList[image.seriesIndex].instanceCount
|
||||||
|
// 设置当前序列状态为已下载完成
|
||||||
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].loadStatus = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// store.dispatch('reading/updateSeriesList', { visitTaskindex: this.visitTaskIdx, studyIndex: image.studyIndex, seriesIndex: image.seriesIndex, imageId: image.imageId })
|
||||||
},
|
},
|
||||||
// instance下载成功回调
|
// instance下载成功回调
|
||||||
async cornerstoneImageLoaded(e) {
|
async cornerstoneImageLoaded(e) {
|
||||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
// var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
if (idx === -1) return
|
// if (idx === -1) return
|
||||||
this.studyList = this.visitTaskList[idx].StudyList
|
// this.studyList = this.visitTaskList[idx].StudyList
|
||||||
if (!this.studyList || this.studyList.length === 0) {
|
// if (!this.studyList || this.studyList.length === 0) {
|
||||||
return
|
// return
|
||||||
}
|
// }
|
||||||
// if (!this.visitTaskList[idx].IsInit) {
|
// if (!this.visitTaskList[idx].IsInit) {
|
||||||
// const loading = this.$loading({ fullscreen: true })
|
// const loading = this.$loading({ fullscreen: true })
|
||||||
// await store.dispatch('reading/getMeasuredData', this.visitTaskList[idx].VisitTaskId)
|
// await store.dispatch('reading/getMeasuredData', this.visitTaskList[idx].VisitTaskId)
|
||||||
|
@ -694,50 +801,58 @@ export default {
|
||||||
// await store.dispatch('reading/setStatus', { visitTaskId: this.visitTaskList[idx].VisitTaskId })
|
// await store.dispatch('reading/setStatus', { visitTaskId: this.visitTaskList[idx].VisitTaskId })
|
||||||
// loading.close()
|
// loading.close()
|
||||||
// }
|
// }
|
||||||
await store.dispatch('reading/updateStudyList', { visitTaskId: this.visitTaskId, imageId: e.detail.image.imageId, seriesUid: e.detail.image.data.string('x0020000e') })
|
// await store.dispatch('reading/updateStudyList', { visitTaskId: this.visitTaskId, imageId: e.detail.image.imageId, seriesUid: e.detail.image.data.string('x0020000e') })
|
||||||
const uri = e.detail.image.sharedCacheKey
|
// const uri = e.detail.image.sharedCacheKey
|
||||||
const index = this.cachedImages.findIndex(item => item.uri === uri)
|
// const index = this.cachedImages.findIndex(item => item.uri === uri)
|
||||||
if (index === -1) {
|
// if (index === -1) {
|
||||||
this.cachedImages.push({ uri: uri, timestamp: new Date().getTime() })
|
// this.cachedImages.push({ uri: uri, timestamp: new Date().getTime() })
|
||||||
} else {
|
// } else {
|
||||||
this.cachedImages[index].timestamp = new Date().getTime()
|
// this.cachedImages[index].timestamp = new Date().getTime()
|
||||||
}
|
// }
|
||||||
var imageId = e.detail.image.imageId
|
// var imageId = e.detail.image.imageId
|
||||||
var seriesUid = e.detail.image.data.string('x0020000e')
|
// var seriesUid = e.detail.image.data.string('x0020000e')
|
||||||
var studyIndex = -1
|
// var studyIndex = -1
|
||||||
var seriesIndex = -1
|
// var seriesIndex = -1
|
||||||
for (let i = 0; i < this.studyList.length; ++i) {
|
// for (let i = 0; i < this.studyList.length; ++i) {
|
||||||
for (let j = 0; j < this.studyList[i].SeriesList.length; ++j) {
|
// for (let j = 0; j < this.studyList[i].SeriesList.length; ++j) {
|
||||||
if (this.studyList[i].SeriesList[j].seriesUid === seriesUid) {
|
// if (this.studyList[i].SeriesList[j].seriesUid === seriesUid) {
|
||||||
studyIndex = i
|
// studyIndex = i
|
||||||
seriesIndex = j
|
// seriesIndex = j
|
||||||
break
|
// break
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
if (studyIndex > 0) break
|
// if (studyIndex > 0) break
|
||||||
}
|
// }
|
||||||
if (seriesIndex < 0) return
|
// if (seriesIndex < 0) return
|
||||||
|
|
||||||
const imageIdIndex = this.studyList[studyIndex].SeriesList[seriesIndex].imageIds.indexOf(imageId)
|
// const imageIdIndex = this.studyList[studyIndex].SeriesList[seriesIndex].imageIds.indexOf(imageId)
|
||||||
if (imageIdIndex < 0) return
|
// if (imageIdIndex < 0) return
|
||||||
if (this.studyList[studyIndex].SeriesList[seriesIndex].imageloadedArr.indexOf(imageId) < 0) {
|
// if (this.studyList[studyIndex].SeriesList[seriesIndex].imageloadedArr.indexOf(imageId) < 0) {
|
||||||
if (this.studyList[studyIndex].SeriesList[seriesIndex].prefetchInstanceCount >= this.studyList[studyIndex].SeriesList[seriesIndex].instanceCount) {
|
// if (this.studyList[studyIndex].SeriesList[seriesIndex].prefetchInstanceCount >= this.studyList[studyIndex].SeriesList[seriesIndex].instanceCount) {
|
||||||
// 设置当前序列状态为已下载完成
|
// // 设置当前序列状态为已下载完成
|
||||||
this.studyList[studyIndex].SeriesList[seriesIndex].loadStatus = true
|
// this.studyList[studyIndex].SeriesList[seriesIndex].loadStatus = true
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
},
|
||||||
|
cornerstoneimagecachechanged(e) {
|
||||||
|
const cacheInfo = cornerstone.imageCache.getCacheInfo()
|
||||||
|
console.log(cacheInfo)
|
||||||
|
},
|
||||||
|
cornerstoneimagecachefull(e) {
|
||||||
|
console.log('超过内存了')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.study-wrapper{
|
.study-wrapper{
|
||||||
>>>.el-progress-bar__inner{
|
/deep/ .el-progress-bar__inner{
|
||||||
transition: width 0s ease;
|
transition: width 0s ease;
|
||||||
}
|
}
|
||||||
width:100%;
|
width:100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
.dicom-desc{
|
.dicom-desc{
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
|
@ -754,7 +869,7 @@ export default {
|
||||||
background-color: #607d8b!important;
|
background-color: #607d8b!important;
|
||||||
border: 1px solid #607d8b!important;
|
border: 1px solid #607d8b!important;
|
||||||
}
|
}
|
||||||
>>>.el-progress__text{
|
/deep/.el-progress__text{
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
@ -791,7 +906,7 @@ export default {
|
||||||
.image-desc {
|
.image-desc {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
p{
|
p{
|
||||||
width: 100px;
|
width: 95px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
|
@ -800,7 +915,10 @@ export default {
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
div{
|
div{
|
||||||
width: 100px;
|
width: 95px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -820,18 +938,18 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.el-collapse{
|
/deep/.el-collapse{
|
||||||
border: none;
|
border: none;
|
||||||
>>>.el-collapse-item{
|
.el-collapse-item{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__content{
|
.el-collapse-item__content{
|
||||||
padding-bottom:10px;
|
padding-bottom:5px;
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__header{
|
.el-collapse-item__header{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border-bottom-color:#5a5a5a;
|
border-bottom-color:#5a5a5a;
|
||||||
|
@ -840,5 +958,33 @@ export default {
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.sr-wrapper{
|
||||||
|
/deep/.el-dialog{
|
||||||
|
background: #fff !important;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
// color: #ddd;
|
||||||
|
.el-dialog__title{
|
||||||
|
color:#fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/deep/.sr-dialog-container{
|
||||||
|
margin-top: 50px !important;
|
||||||
|
width:75%;
|
||||||
|
height:80%;
|
||||||
|
}
|
||||||
|
/deep/.el-dialog__body{
|
||||||
|
padding: 10px;
|
||||||
|
height: calc(100% - 50px);
|
||||||
|
}
|
||||||
|
.el-dialog__header{
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.sr-full-dialog-container{
|
||||||
|
/deep/.is-fullscreen .el-dialog__body{
|
||||||
|
height: calc(100% - 50px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -125,7 +125,7 @@ export default {
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.wl-container {
|
.wl-container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
// >>>.el-table{
|
// /deep/ .el-table{
|
||||||
// background-color: #1e1e1e !important;
|
// background-color: #1e1e1e !important;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ export default {
|
||||||
background-color: #1e1e1e !important;
|
background-color: #1e1e1e !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// >>>.el-table th,.el-table tr{
|
// /deep/ .el-table th,.el-table tr{
|
||||||
// background-color: #1e1e1e !important;
|
// background-color: #1e1e1e !important;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,8 @@
|
||||||
element-loading-background="rgba(0, 0, 0, 0.8)"
|
element-loading-background="rgba(0, 0, 0, 0.8)"
|
||||||
style="position:relative;"
|
style="position:relative;"
|
||||||
class="cornerstone-element"
|
class="cornerstone-element"
|
||||||
@contextmenu.prevent="onContextmenu"
|
|
||||||
@mousemove="sliderMousemove"
|
|
||||||
@mouseup="sliderMouseup"
|
@mouseup="sliderMouseup"
|
||||||
|
@contextmenu.prevent="onContextmenu"
|
||||||
>
|
>
|
||||||
<!-- 临床数据 -->
|
<!-- 临床数据 -->
|
||||||
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
|
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
|
||||||
|
@ -44,13 +43,13 @@
|
||||||
<i class="el-icon-caret-right" />
|
<i class="el-icon-caret-right" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-show="dicomInfo.series" class="info-series">
|
<div class="info-series">
|
||||||
<h2 v-if="isReadingShowSubjectInfo" style="color:#f44336;padding: 5px 0px;margin: 0;">{{ subjectCode }} {{ stack.taskBlindName }}</h2>
|
<h2 v-if="isReadingShowSubjectInfo" style="color:#f44336;padding: 5px 0px;margin: 0;">{{ subjectCode }} {{ stack.taskBlindName }}</h2>
|
||||||
<div>Series: #{{ dicomInfo.series }}</div>
|
<div v-show="dicomInfo.series">Series: #{{ dicomInfo.series }}</div>
|
||||||
<div>Image: #{{ dicomInfo.frame }}</div>
|
<div>Image: #{{ dicomInfo.frame }}</div>
|
||||||
<div>{{ dicomInfo.modality }}</div>
|
<div>{{ dicomInfo.modality }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-show="dicomInfo.series" class="info-image">
|
<div class="info-image">
|
||||||
<div v-show="mousePosition.mo">
|
<div v-show="mousePosition.mo">
|
||||||
Pos: {{ mousePosition.x?mousePosition.x.toFixed(0):'' }}, {{ mousePosition.y?mousePosition.y.toFixed(0):'' }}
|
Pos: {{ mousePosition.x?mousePosition.x.toFixed(0):'' }}, {{ mousePosition.y?mousePosition.y.toFixed(0):'' }}
|
||||||
</div>
|
</div>
|
||||||
|
@ -83,7 +82,7 @@
|
||||||
<!-- <div>{{ dicomInfo.time }}</div> -->
|
<!-- <div>{{ dicomInfo.time }}</div> -->
|
||||||
</div>
|
</div>
|
||||||
<div ref="sliderBox" class="my_slider_box" style="position: absolute;right: 1px;height: calc(100% - 140px);transform: translateY(-50%);top: calc(50% - 30px);width: 10px;background: #333;cursor: pointer" @click.stop="goViewer($event)">
|
<div ref="sliderBox" class="my_slider_box" style="position: absolute;right: 1px;height: calc(100% - 140px);transform: translateY(-50%);top: calc(50% - 30px);width: 10px;background: #333;cursor: pointer" @click.stop="goViewer($event)">
|
||||||
<div :style="{top: height + '%'}" style="z-index:10;background: #9e9e9e;height: 20px;width: 100%;position: absolute;top: 0;cursor: move" @mousedown.stop="sliderMousedown($event)" />
|
<div :style="{top: height + '%'}" style="z-index:10;background: #9e9e9e;height: 20px;width: 100%;position: absolute;top: 0;cursor: move" @click.stop.prevent="() => {return}" @mousedown.stop="sliderMousedown($event)" />
|
||||||
</div>
|
</div>
|
||||||
<div style="position: absolute;left: 50%;top: 30px;color: #f44336;transform: translateX(-50%);">
|
<div style="position: absolute;left: 50%;top: 30px;color: #f44336;transform: translateX(-50%);">
|
||||||
{{ markers.top }}
|
{{ markers.top }}
|
||||||
|
@ -335,9 +334,9 @@ export default {
|
||||||
document.addEventListener('mouseup', () => {
|
document.addEventListener('mouseup', () => {
|
||||||
this.sliderMouseup()
|
this.sliderMouseup()
|
||||||
})
|
})
|
||||||
// document.addEventListener('mousemove', () => {
|
document.addEventListener('mousemove', (e) => {
|
||||||
// this.sliderMousemove()
|
this.sliderMousemove(e)
|
||||||
// })
|
})
|
||||||
var digitPlaces = Number(localStorage.getItem('digitPlaces'))
|
var digitPlaces = Number(localStorage.getItem('digitPlaces'))
|
||||||
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
|
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
|
||||||
this.type = this.$router.currentRoute.query.type ? this.$router.currentRoute.query.type : ''
|
this.type = this.$router.currentRoute.query.type ? this.$router.currentRoute.query.type : ''
|
||||||
|
@ -478,6 +477,7 @@ export default {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
goViewer(e) {
|
goViewer(e) {
|
||||||
|
console.log('goViewer')
|
||||||
console.log(this.$refs['sliderBox'].clientHeight)
|
console.log(this.$refs['sliderBox'].clientHeight)
|
||||||
var height = e.offsetY * 100 / this.$refs['sliderBox'].clientHeight
|
var height = e.offsetY * 100 / this.$refs['sliderBox'].clientHeight
|
||||||
this.height = height
|
this.height = height
|
||||||
|
@ -566,7 +566,6 @@ export default {
|
||||||
showCancelButton: false,
|
showCancelButton: false,
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
|
|
||||||
}).catch(() => {})
|
}).catch(() => {})
|
||||||
e.stopImmediatePropagation()
|
e.stopImmediatePropagation()
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
|
@ -673,49 +672,50 @@ export default {
|
||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
onContextmenu(event) {
|
onContextmenu(event) {
|
||||||
if (this.isBaseline || this.readingTaskState >= 2 || this.CriterionType === 10) return false
|
event.preventDefault()
|
||||||
const x = event.offsetX
|
// if (this.isBaseline || this.readingTaskState >= 2 || this.CriterionType === 10) return false
|
||||||
const y = event.offsetY
|
// const x = event.offsetX
|
||||||
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
// const y = event.offsetY
|
||||||
|
// const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
||||||
|
|
||||||
var element = cornerstone.getEnabledElement(this.canvas)
|
// var element = cornerstone.getEnabledElement(this.canvas)
|
||||||
var { imageId } = element.image
|
// var { imageId } = element.image
|
||||||
this.measuredTools.map(toolType => {
|
// this.measuredTools.map(toolType => {
|
||||||
const toolState = ToolStateManager.getImageIdToolState(imageId, toolType)
|
// const toolState = ToolStateManager.getImageIdToolState(imageId, toolType)
|
||||||
if (!toolState) return
|
// if (!toolState) return
|
||||||
var toolObj = new cornerstoneTools[`${toolType}Tool`]()
|
// var toolObj = new cornerstoneTools[`${toolType}Tool`]()
|
||||||
|
|
||||||
var i = toolState.data.findIndex(data => toolObj.pointNearTool(this.canvas, data, { x, y }, 'mouse'))
|
// var i = toolState.data.findIndex(data => toolObj.pointNearTool(this.canvas, data, { x, y }, 'mouse'))
|
||||||
if (i === -1) return false
|
// if (i === -1) return false
|
||||||
var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === toolState.data[i].uuid)
|
// var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === toolState.data[i].uuid)
|
||||||
var rowId = null
|
// var rowId = null
|
||||||
if (idx > -1) {
|
// if (idx > -1) {
|
||||||
rowId = this.measureData[idx].RowId
|
// rowId = this.measureData[idx].RowId
|
||||||
}
|
// }
|
||||||
if (rowId) {
|
// if (rowId) {
|
||||||
this.selectedLesion = toolState.data[i]
|
// this.selectedLesion = toolState.data[i]
|
||||||
this.$contextmenu({
|
// this.$contextmenu({
|
||||||
items: [
|
// items: [
|
||||||
// {
|
// // {
|
||||||
// label: 'Split',
|
// // label: 'Split',
|
||||||
// divided: true,
|
// // divided: true,
|
||||||
// onClick: () => {
|
// // onClick: () => {
|
||||||
// this.handleSplit()
|
// // this.handleSplit()
|
||||||
// }
|
// // }
|
||||||
// }
|
// // }
|
||||||
],
|
// ],
|
||||||
event,
|
// event,
|
||||||
x: event.clientX,
|
// x: event.clientX,
|
||||||
y: event.clientY,
|
// y: event.clientY,
|
||||||
customClass: 'class-a',
|
// customClass: 'class-a',
|
||||||
zIndex: 3,
|
// zIndex: 3,
|
||||||
minWidth: 100
|
// minWidth: 100
|
||||||
})
|
// })
|
||||||
return false
|
// return false
|
||||||
} else {
|
// } else {
|
||||||
return false
|
// return false
|
||||||
}
|
// }
|
||||||
})
|
// })
|
||||||
},
|
},
|
||||||
handleSplit() {
|
handleSplit() {
|
||||||
var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === this.selectedLesion.uuid)
|
var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === this.selectedLesion.uuid)
|
||||||
|
@ -997,9 +997,7 @@ export default {
|
||||||
var markName = this.measureData[idx].OrderMarkName
|
var markName = this.measureData[idx].OrderMarkName
|
||||||
if (this.activeToolName === 'Eraser') {
|
if (this.activeToolName === 'Eraser') {
|
||||||
var questionInfo = this.measureData[idx]
|
var questionInfo = this.measureData[idx]
|
||||||
var markName = this.measureData[idx].MeasureData.data.remark
|
this.$emit('moveMeasureData', { measureData, questionInfo })
|
||||||
console.log(questionInfo)
|
|
||||||
this.$emit('moveMeasureData', { measureData, questionInfo, markName })
|
|
||||||
}
|
}
|
||||||
if ((this.disabledMarks.indexOf(markName) === -1 || !this.disabledMarks) && this.activeToolName !== 'Eraser') {
|
if ((this.disabledMarks.indexOf(markName) === -1 || !this.disabledMarks) && this.activeToolName !== 'Eraser') {
|
||||||
var questionInfo = this.measureData[idx]
|
var questionInfo = this.measureData[idx]
|
||||||
|
@ -1474,14 +1472,6 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// updateImage(obj) {
|
|
||||||
// // const element = this.$refs.canvas
|
|
||||||
// // this.measuredData = obj.measuredData
|
|
||||||
// // const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
|
||||||
// // var imageId = `wadouri:/api/instance/content/${obj.instanceId}`
|
|
||||||
// // ToolStateManager.clearImageIdToolState(imageId)
|
|
||||||
// // cornerstone.updateImage(element, true)
|
|
||||||
// },
|
|
||||||
debounce(callback, delay) {
|
debounce(callback, delay) {
|
||||||
let timerId
|
let timerId
|
||||||
return function() {
|
return function() {
|
||||||
|
|
|
@ -285,7 +285,7 @@
|
||||||
<div
|
<div
|
||||||
class="icon"
|
class="icon"
|
||||||
:class="[activeTool==='Eraser'?'tool_active':'']"
|
:class="[activeTool==='Eraser'?'tool_active':'']"
|
||||||
data-tool="Eraser"
|
data-tool="Zoom"
|
||||||
@click.prevent="setToolActive('Eraser',false)"
|
@click.prevent="setToolActive('Eraser',false)"
|
||||||
>
|
>
|
||||||
<svg-icon icon-class="clear" class="svg-icon" />
|
<svg-icon icon-class="clear" class="svg-icon" />
|
||||||
|
@ -381,13 +381,13 @@
|
||||||
width="600px"
|
width="600px"
|
||||||
>
|
>
|
||||||
<el-tabs v-model="activeName" class="personal_config">
|
<el-tabs v-model="activeName" class="personal_config">
|
||||||
<el-tab-pane label="热键" name="1">
|
<el-tab-pane :label="$t('trials:reading:tab:hotkeys')" name="1">
|
||||||
<Hotkeys v-if="activeName === '1'" :reading-tool="0" @reset="resetHotkeyList" />
|
<Hotkeys v-if="activeName === '1'" :reading-tool="0" @reset="resetHotkeyList" />
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane label="W/L模板" name="2">
|
<el-tab-pane :label="$t('trials:reading:tab:wlTemplate')" name="2">
|
||||||
<WL v-if="activeName === '2'" @getWwcTpl="getWwcTpl" />
|
<WL v-if="activeName === '2'" @getWwcTpl="getWwcTpl" />
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane label="其他" name="3">
|
<el-tab-pane :label="$t('trials:reading:tab:others')" name="3">
|
||||||
<Others v-if="activeName === '3'" />
|
<Others v-if="activeName === '3'" />
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
|
@ -1435,8 +1435,9 @@ export default {
|
||||||
},
|
},
|
||||||
// 删除标记
|
// 删除标记
|
||||||
moveMeasureData(data) {
|
moveMeasureData(data) {
|
||||||
this.$refs['measurementList'].moveMeasureData(data)
|
this.$confirm(this.$t('trials:trials-list:table:isDeleted') + data.questionInfo.MeasureData.data.remark + '?').then(() => {
|
||||||
// this.activeTool = ''
|
this.$refs['measurementList'].moveMeasureData(data)
|
||||||
|
})
|
||||||
},
|
},
|
||||||
saveImage() {
|
saveImage() {
|
||||||
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].saveImage()
|
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].saveImage()
|
||||||
|
@ -1749,12 +1750,12 @@ export default {
|
||||||
|
|
||||||
}
|
}
|
||||||
.personal_config {
|
.personal_config {
|
||||||
>>>.el-tabs__content{
|
/deep/ .el-tabs__content{
|
||||||
height: 450px;
|
height: 450px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
>>>.manuals-dialog-container{
|
/deep/ .manuals-dialog-container{
|
||||||
margin-top: 50px !important;
|
margin-top: 50px !important;
|
||||||
width:75%;
|
width:75%;
|
||||||
height:80%;
|
height:80%;
|
||||||
|
@ -1766,7 +1767,7 @@ export default {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
>>>.manuals-full-dialog-container{
|
/deep/ .manuals-full-dialog-container{
|
||||||
.el-dialog__body{
|
.el-dialog__body{
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
height: calc(100% - 50px) !important;
|
height: calc(100% - 50px) !important;
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
size="small"
|
size="small"
|
||||||
>
|
>
|
||||||
<el-form-item
|
<el-form-item
|
||||||
label="标记名称"
|
:label="$t('trials:reading:title:measuredDataName')"
|
||||||
prop="measuredDataName"
|
prop="measuredDataName"
|
||||||
>
|
>
|
||||||
<el-input v-model="form.measuredDataName"></el-input>
|
<el-input v-model="form.measuredDataName"></el-input>
|
||||||
|
@ -171,17 +171,16 @@ export default {
|
||||||
this.activeName = ''
|
this.activeName = ''
|
||||||
this.ecrfShow = true
|
this.ecrfShow = true
|
||||||
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
|
var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.lastCanvasTaskId)
|
||||||
|
console.log(i)
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
// for (var i = 0; this.visitTaskList.length > 0; i++) {
|
|
||||||
// console.log(this.visitTaskList,this.visitTaskList[i])
|
|
||||||
this.visitTaskId = this.visitTaskList[i].VisitTaskId
|
this.visitTaskId = this.visitTaskList[i].VisitTaskId
|
||||||
this.taskBlindName = this.visitTaskList[i].TaskBlindName
|
this.taskBlindName = this.visitTaskList[i].TaskBlindName
|
||||||
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
||||||
|
console.log(this.visitTaskList[i].IsInit)
|
||||||
if (!this.visitTaskList[i].IsInit) {
|
if (!this.visitTaskList[i].IsInit) {
|
||||||
var loading = this.$loading({ fullscreen: true })
|
var loading = this.$loading({ fullscreen: true })
|
||||||
var triald = this.trialId = this.$router.currentRoute.query.trialId
|
var triald = this.trialId = this.$router.currentRoute.query.trialId
|
||||||
if (!this.visitTaskList[i].measureDataInit) {
|
if (!this.visitTaskList[i].measureDataInit) {
|
||||||
console.log('获取到以前访视标记')
|
|
||||||
await store.dispatch('reading/getCustomizeMeasuredData', this.visitTaskList[i].VisitTaskId)
|
await store.dispatch('reading/getCustomizeMeasuredData', this.visitTaskList[i].VisitTaskId)
|
||||||
}
|
}
|
||||||
if (!this.visitTaskList[i].studyListInit) {
|
if (!this.visitTaskList[i].studyListInit) {
|
||||||
|
@ -203,7 +202,6 @@ export default {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getCustomTag() {
|
getCustomTag() {
|
||||||
|
@ -234,10 +232,8 @@ export default {
|
||||||
},
|
},
|
||||||
async moveMeasureData(measureData) {
|
async moveMeasureData(measureData) {
|
||||||
console.log('measureData', measureData)
|
console.log('measureData', measureData)
|
||||||
this.$confirm(`确定删除该标记${measureData.markName}吗`).then(async res => {
|
await store.dispatch('reading/removeCustomizeMeasuredData', { visitTaskId: this.visitTaskId, ...measureData })
|
||||||
await store.dispatch('reading/removeCustomizeMeasuredData', { visitTaskId: this.visitTaskId, ...measureData })
|
DicomEvent.$emit('updateImage')
|
||||||
DicomEvent.$emit('updateImage')
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
handleMeasuredDataCancel() {
|
handleMeasuredDataCancel() {
|
||||||
this.measuredDataVisible = false
|
this.measuredDataVisible = false
|
||||||
|
@ -290,7 +286,7 @@ export default {
|
||||||
store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 })
|
store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 })
|
||||||
DicomEvent.$emit('setReadingState', 2)
|
DicomEvent.$emit('setReadingState', 2)
|
||||||
window.opener.postMessage('refreshTaskList', window.location)
|
window.opener.postMessage('refreshTaskList', window.location)
|
||||||
this.$confirm('当前阅片任务已完成,是否进入下一个阅片任务?', {
|
this.$confirm(this.$t('trials:oncologyReview:title:msg2'), {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
distinguishCancelAndClose: true
|
distinguishCancelAndClose: true
|
||||||
})
|
})
|
||||||
|
@ -376,12 +372,12 @@ export default {
|
||||||
}
|
}
|
||||||
.el-collapse{
|
.el-collapse{
|
||||||
border-bottom:none;
|
border-bottom:none;
|
||||||
>>>.el-collapse-item{
|
/deep/ .el-collapse-item{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__header{
|
/deep/ .el-collapse-item__header{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border-bottom-color:#5a5a5a;
|
border-bottom-color:#5a5a5a;
|
||||||
|
@ -389,11 +385,11 @@ export default {
|
||||||
height: 35px;
|
height: 35px;
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__wrap{
|
/deep/ .el-collapse-item__wrap{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__content{
|
/deep/ .el-collapse-item__content{
|
||||||
width:260px;
|
width:260px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0px;
|
top: 0px;
|
||||||
|
|
|
@ -242,7 +242,8 @@ export default {
|
||||||
this.isInit = true
|
this.isInit = true
|
||||||
}
|
}
|
||||||
const img = new Image() // 创建img标签
|
const img = new Image() // 创建img标签
|
||||||
img.src = this.imgUrl // 添加src
|
img.src = this.OSSclientConfig.basePath + this.imgUrl // 添加src
|
||||||
|
img.setAttribute('crossorigin', 'anonymous')
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
img.onload = () => {
|
img.onload = () => {
|
||||||
this.currentImg = img
|
this.currentImg = img
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
/>
|
/>
|
||||||
<div ref="imagesWrapper" class="images">
|
<div ref="imagesWrapper" class="images">
|
||||||
<div v-if="noData" class="empty-text">
|
<div v-if="noData" class="empty-text">
|
||||||
<slot name="empty">暂无数据</slot>
|
<slot name="empty">{{ $t('trials:audit:message:noData') }}</slot>
|
||||||
</div>
|
</div>
|
||||||
<div v-show="!noData" class="items" :style="itemsStyle">
|
<div v-show="!noData" class="items" :style="itemsStyle">
|
||||||
<div
|
<div
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
}"
|
}"
|
||||||
@click="selected(index)"
|
@click="selected(index)"
|
||||||
>
|
>
|
||||||
<img :title="item.FileName" :src="`/api/${item.PreviewPath}`">
|
<img :title="item.FileName" :src="`${OSSclientConfig.basePath + item.Path}`">
|
||||||
<p v-if="item.FileName" class="item-date">
|
<p v-if="item.FileName" class="item-date">
|
||||||
{{ `${index+1}` }}
|
{{ `${index+1}` }}
|
||||||
</p>
|
</p>
|
||||||
|
|
|
@ -13,11 +13,16 @@
|
||||||
<div style="display: flex;justify-content: space-between;align-items: center;color:#fff;margin: 10px 0 5px">
|
<div style="display: flex;justify-content: space-between;align-items: center;color:#fff;margin: 10px 0 5px">
|
||||||
<span>{{ question.QuestionName }}</span>
|
<span>{{ question.QuestionName }}</span>
|
||||||
<el-button size="mini" v-if="readingTaskState<2" @click="openAddTableCol(question)">
|
<el-button size="mini" v-if="readingTaskState<2" @click="openAddTableCol(question)">
|
||||||
添加
|
{{ $t('common:button:add') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-table
|
<el-table
|
||||||
:data="questionForm[question.Id]">
|
:data="questionForm[question.Id]">
|
||||||
|
<el-table-column :label="$t('CustomizeQuestionFormItem:label:OrderMark')" width="60px" show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{question.OrderMark}}{{scope.$index + 1}}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
:prop="item.Id"
|
:prop="item.Id"
|
||||||
:label="item.QuestionName"
|
:label="item.QuestionName"
|
||||||
|
@ -39,7 +44,7 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
label="操作"
|
:label="$t('common:action:action')"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
width="100px"
|
width="100px"
|
||||||
v-if="readingTaskState < 2"
|
v-if="readingTaskState < 2"
|
||||||
|
@ -47,10 +52,10 @@
|
||||||
>
|
>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button type="text" size="mini" @click="openAddTableCol(question, scope.$index)">
|
<el-button type="text" size="mini" @click="openAddTableCol(question, scope.$index)">
|
||||||
编辑
|
{{$t('common:button:edit')}}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="text" size="mini" v-if="scope.row.IsCurrentTaskAdd === 'True' || !question.IsCopyLesions || IsBaseline" @click="deleteTableCol(question, scope.$index)">
|
<el-button type="text" size="mini" v-if="scope.row.IsCurrentTaskAdd === 'True' || !question.IsCopyLesions || IsBaseline" @click="deleteTableCol(question, scope.$index)">
|
||||||
删除
|
{{$t('common:button:delete')}}
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
@ -63,7 +68,7 @@
|
||||||
:prop="question.Id"
|
:prop="question.Id"
|
||||||
:rules="[
|
:rules="[
|
||||||
{ required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && (question.RelevanceValueList.includes(questionForm[question.RelevanceId])))) && question.Type!=='group' && question.Type!=='summary',
|
{ required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && (question.RelevanceValueList.includes(questionForm[question.RelevanceId])))) && question.Type!=='group' && question.Type!=='summary',
|
||||||
message: '请注明', trigger: ['blur', 'change']},
|
message: $t('common:ruleMessage:specify'), trigger: ['blur', 'change']},
|
||||||
]"
|
]"
|
||||||
:class="[question.Type==='group'?'mb':question.Type==='upload'?'uploadWrapper':'']"
|
:class="[question.Type==='group'?'mb':question.Type==='upload'?'uploadWrapper':'']"
|
||||||
>
|
>
|
||||||
|
@ -149,7 +154,12 @@
|
||||||
{{ val }}
|
{{ val }}
|
||||||
</el-checkbox>
|
</el-checkbox>
|
||||||
</el-checkbox-group>
|
</el-checkbox-group>
|
||||||
|
<!-- 自动分类 -->
|
||||||
|
<el-input
|
||||||
|
v-if="question.Type === 'class'"
|
||||||
|
v-model="questionForm[question.Id]"
|
||||||
|
disabled
|
||||||
|
/>
|
||||||
<!-- 自动计算 -->
|
<!-- 自动计算 -->
|
||||||
<!-- :precision="2" :step="0.1" :max="10" -->
|
<!-- :precision="2" :step="0.1" :max="10" -->
|
||||||
<el-input
|
<el-input
|
||||||
|
@ -171,7 +181,8 @@
|
||||||
type="number"
|
type="number"
|
||||||
v-if="question.Type === 'number' && question.DataSource !== 1"
|
v-if="question.Type === 'number' && question.DataSource !== 1"
|
||||||
@change="((val)=>{formItemNumberChange(val, question)})"
|
@change="((val)=>{formItemNumberChange(val, question)})"
|
||||||
onblur="value=parseInt(value).toFixed(parseInt(localStorage.getItem('digitPlaces')))"
|
onblur="value=parseFloat(value).toFixed(parseInt(localStorage.getItem('digitPlaces')));console.log(localStorage.getItem('digitPlaces'))"
|
||||||
|
@input="limitInput($event, questionForm, question.Id)"
|
||||||
v-model="questionForm[question.Id]"
|
v-model="questionForm[question.Id]"
|
||||||
>
|
>
|
||||||
<template slot="append" v-if="question.Unit !== 0">{{question.Unit !== 4 ? $fd('ValueUnit', question.Unit) : question.CustomUnit}}</template>
|
<template slot="append" v-if="question.Unit !== 0">{{question.Unit !== 4 ? $fd('ValueUnit', question.Unit) : question.CustomUnit}}</template>
|
||||||
|
@ -180,7 +191,8 @@
|
||||||
<el-input
|
<el-input
|
||||||
type="number"
|
type="number"
|
||||||
v-if="question.Type === 'number' && question.DataSource === 1"
|
v-if="question.Type === 'number' && question.DataSource === 1"
|
||||||
onblur="value=parseInt(value).toFixed(parseInt(localStorage.getItem('digitPlaces')))"
|
onblur="value=parseFloat(value).toFixed(parseInt(localStorage.getItem('digitPlaces')));console.log(localStorage.getItem('digitPlaces'))"
|
||||||
|
@input="limitInput($event, questionForm, question.Id)"
|
||||||
:disabled="question.DataSource === 1"
|
:disabled="question.DataSource === 1"
|
||||||
v-model="questionForm[question.Id]"
|
v-model="questionForm[question.Id]"
|
||||||
>
|
>
|
||||||
|
@ -190,41 +202,42 @@
|
||||||
<!-- 上传图像 -->
|
<!-- 上传图像 -->
|
||||||
<el-upload
|
<el-upload
|
||||||
v-if="question.Type==='upload'"
|
v-if="question.Type==='upload'"
|
||||||
:action="accept"
|
:action="question.FileType"
|
||||||
:limit="question.ImageCount"
|
:limit="question.ImageCount"
|
||||||
:on-preview="handlePictureCardPreview"
|
:on-preview="handlePictureCardPreview"
|
||||||
:before-upload="handleBeforeUpload"
|
:before-upload="(file) => {return handleBeforeUpload(file, question.FileType)}"
|
||||||
:http-request="uploadScreenshot"
|
:http-request="uploadScreenshot"
|
||||||
list-type="picture-card"
|
|
||||||
:on-remove="handleRemove"
|
:on-remove="handleRemove"
|
||||||
:file-list="fileList"
|
:file-list="fileList"
|
||||||
:class="{disabled:fileList.length >= question.ImageCount}"
|
:class="{disabled:fileList.length >= question.ImageCount}"
|
||||||
>
|
>
|
||||||
<i slot="default" class="el-icon-plus" />
|
<el-button slot="default" class="el-icon-plus">
|
||||||
<div slot="file" slot-scope="{file}">
|
{{this.$t('common:button:upload')}}
|
||||||
<img
|
</el-button>
|
||||||
class="el-upload-list__item-thumbnail"
|
<!-- <div slot="file" slot-scope="{file}">-->
|
||||||
crossOrigin="Anonymous"
|
<!-- <div class="el-upload-list__item-name"></div>-->
|
||||||
:src="OSSclientConfig.basePath + file.url"
|
<!--<!– <img–>-->
|
||||||
alt=""
|
<!--<!– class="el-upload-list__item-thumbnail"–>-->
|
||||||
>
|
<!--<!– :src="OSSclientConfig.basePath + file.url"–>-->
|
||||||
<span class="el-upload-list__item-actions">
|
<!--<!– alt=""–>-->
|
||||||
<span
|
<!--<!– >–>-->
|
||||||
class="el-upload-list__item-preview"
|
<!-- <span class="el-upload-list__item-actions">-->
|
||||||
@click="handlePictureCardPreview(file)"
|
<!-- <span-->
|
||||||
>
|
<!-- class="el-upload-list__item-preview"-->
|
||||||
<i class="el-icon-zoom-in" />
|
<!-- @click="handlePictureCardPreview(file)"-->
|
||||||
</span>
|
<!-- >-->
|
||||||
|
<!-- <i class="el-icon-zoom-in" />-->
|
||||||
|
<!-- </span>-->
|
||||||
|
|
||||||
<span
|
<!-- <span-->
|
||||||
v-if="readingTaskState < 2"
|
<!-- v-if="readingTaskState < 2"-->
|
||||||
class="el-upload-list__item-delete"
|
<!-- class="el-upload-list__item-delete"-->
|
||||||
@click="handleRemove(file)"
|
<!-- @click="handleRemove(file)"-->
|
||||||
>
|
<!-- >-->
|
||||||
<i class="el-icon-delete" />
|
<!-- <i class="el-icon-delete" />-->
|
||||||
</span>
|
<!-- </span>-->
|
||||||
</span>
|
<!-- </span>-->
|
||||||
</div>
|
<!-- </div>-->
|
||||||
</el-upload>
|
</el-upload>
|
||||||
<el-dialog
|
<el-dialog
|
||||||
v-if="question.Type==='upload'"
|
v-if="question.Type==='upload'"
|
||||||
|
@ -232,7 +245,7 @@
|
||||||
:visible.sync="imgVisible"
|
:visible.sync="imgVisible"
|
||||||
width="600px"
|
width="600px"
|
||||||
>
|
>
|
||||||
<el-image :src="imageUrl" crossOrigin="Anonymous" width="100%">
|
<el-image :src="imageUrl" width="100%">
|
||||||
<div slot="placeholder" class="image-slot">
|
<div slot="placeholder" class="image-slot">
|
||||||
加载中<span class="dot">...</span>
|
加载中<span class="dot">...</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -280,7 +293,7 @@
|
||||||
:visit-task-id="visitTaskId"
|
:visit-task-id="visitTaskId"
|
||||||
:criterion-id="criterionId"
|
:criterion-id="criterionId"
|
||||||
:type="addOrEdit.type"
|
:type="addOrEdit.type"
|
||||||
:CalculationList="CalculationList"
|
:CalculationList="CalculationTabelList"
|
||||||
@formItemTableNumberChange="formItemTableNumberChange"
|
@formItemTableNumberChange="formItemTableNumberChange"
|
||||||
@setFormItemData="setFormItemData"
|
@setFormItemData="setFormItemData"
|
||||||
@resetFormItemData="resetFormItemData"
|
@resetFormItemData="resetFormItemData"
|
||||||
|
@ -360,7 +373,8 @@ export default {
|
||||||
loading: false,
|
loading: false,
|
||||||
RowIndex: 0,
|
RowIndex: 0,
|
||||||
RowId: null,
|
RowId: null,
|
||||||
digitPlaces: 0
|
digitPlaces: 0,
|
||||||
|
CalculationTabelList: []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
@ -378,17 +392,32 @@ export default {
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.digitPlaces = localStorage.getItem('digitPlaces') ? parseInt(localStorage.getItem('digitPlaces')) : 0
|
this.digitPlaces = localStorage.getItem('digitPlaces') ? parseInt(localStorage.getItem('digitPlaces')) : 0
|
||||||
|
if (this.question.Type === 'class') {
|
||||||
|
this.ClassifyAlgorithmsList = JSON.parse(this.question.ClassifyAlgorithms)
|
||||||
|
}
|
||||||
|
setInterval(()=> {
|
||||||
|
if (this.question.Type === 'class') {
|
||||||
|
let o = this.ClassifyAlgorithmsList.find(v => {
|
||||||
|
return this.questionForm[this.question.ClassifyQuestionId] >= v.gt && this.questionForm[this.question.ClassifyQuestionId] < v.lt
|
||||||
|
})
|
||||||
|
if (this.questionForm[this.question.ClassifyQuestionId]) {
|
||||||
|
this.questionForm[this.question.Id] = o ? o.label : null
|
||||||
|
} else {
|
||||||
|
this.questionForm[this.question.Id] = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 300)
|
||||||
if (this.question.Type === 'upload') {
|
if (this.question.Type === 'upload') {
|
||||||
if (this.questionForm[this.question.Id]) {
|
if (this.questionForm[this.question.Id]) {
|
||||||
this.urls = this.questionForm[this.question.Id].split('|')
|
this.urls = this.questionForm[this.question.Id].split('|')
|
||||||
this.fileList = []
|
this.fileList = []
|
||||||
this.urls.map(url => {
|
this.urls.map((url, index) => {
|
||||||
this.fileList.push({ name: '', url: `/${url}` })
|
this.fileList.push({ name: `${this.$t('trials:emailManageCfg:title:fileName')}${index + 1}`, url: `${url}` })
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.question.Type === 'table') {
|
if (this.question.Type === 'table') {
|
||||||
// this.getQuestionCalculateRelation()
|
this.getQuestionCalculateRelation()
|
||||||
if (this.questionForm[this.question.Id]) {
|
if (this.questionForm[this.question.Id]) {
|
||||||
this.QuestionsForm = {}
|
this.QuestionsForm = {}
|
||||||
this.question.TableQuestions.Questions.forEach(v => {
|
this.question.TableQuestions.Questions.forEach(v => {
|
||||||
|
@ -402,8 +431,17 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
limitInput(value, a, b) {
|
||||||
|
if (value.indexOf('.') > -1) {
|
||||||
|
if (value.split('.')[1].length >= this.digitPlaces) {
|
||||||
|
this.$set(a, b, parseFloat(value).toFixed(this.digitPlaces))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
},
|
||||||
deleteTableCol(row, index) {
|
deleteTableCol(row, index) {
|
||||||
this.$confirm('确定要删除该行表格问题吗?').then(() => {
|
console.log(row)
|
||||||
|
this.$confirm(this.$t('trials:uploadNonDicoms:message:msg1')).then(() => {
|
||||||
const loading = this.$loading({ fullscreen: true })
|
const loading = this.$loading({ fullscreen: true })
|
||||||
var param = {
|
var param = {
|
||||||
visitTaskId: this.visitTaskId,
|
visitTaskId: this.visitTaskId,
|
||||||
|
@ -461,7 +499,7 @@ export default {
|
||||||
this.QuestionsForm.RowIndex = this.questionForm[this.question.Id].length + 1
|
this.QuestionsForm.RowIndex = this.questionForm[this.question.Id].length + 1
|
||||||
}
|
}
|
||||||
submitTableQuestion(params).then(async res => {
|
submitTableQuestion(params).then(async res => {
|
||||||
this.$message.success('保存成功!')
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
this.QuestionsForm.RowId = res.Result.RowId
|
this.QuestionsForm.RowId = res.Result.RowId
|
||||||
this.save()
|
this.save()
|
||||||
loading.close()
|
loading.close()
|
||||||
|
@ -479,10 +517,9 @@ export default {
|
||||||
},
|
},
|
||||||
getQuestionCalculateRelation() {
|
getQuestionCalculateRelation() {
|
||||||
getQuestionCalculateRelation({
|
getQuestionCalculateRelation({
|
||||||
TrialReadingCriterionId: this.criterionId,
|
|
||||||
ReadingQuestionId: this.question.Id
|
ReadingQuestionId: this.question.Id
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
this.CalculationList = res.Result
|
this.CalculationTabelList = res.Result
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
save() {
|
save() {
|
||||||
|
@ -648,7 +685,7 @@ export default {
|
||||||
},
|
},
|
||||||
openAddTableCol(row, index) {
|
openAddTableCol(row, index) {
|
||||||
this.addOrEdit.visible = true
|
this.addOrEdit.visible = true
|
||||||
this.addOrEdit.title = row.QuestionName + '表格问题'
|
this.addOrEdit.title = row.QuestionName + this.$t('trials:readingUnit:qsList:title:tableQs')
|
||||||
this.QuestionsList = row.TableQuestions.Questions
|
this.QuestionsList = row.TableQuestions.Questions
|
||||||
this.AnswersList = row.TableQuestions.Answers
|
this.AnswersList = row.TableQuestions.Answers
|
||||||
if (!index && index !== 0) {
|
if (!index && index !== 0) {
|
||||||
|
@ -706,6 +743,7 @@ export default {
|
||||||
this.$emit('setFormItemData', obj)
|
this.$emit('setFormItemData', obj)
|
||||||
},
|
},
|
||||||
async uploadScreenshot(param) {
|
async uploadScreenshot(param) {
|
||||||
|
console.log('uploadScreenshot')
|
||||||
if (!this.visitTaskId) return
|
if (!this.visitTaskId) return
|
||||||
const loading = this.$loading({
|
const loading = this.$loading({
|
||||||
target: document.querySelector('.ecrf-wrapper'),
|
target: document.querySelector('.ecrf-wrapper'),
|
||||||
|
@ -722,22 +760,33 @@ export default {
|
||||||
this.urls.push(this.$getObjectName(res.url))
|
this.urls.push(this.$getObjectName(res.url))
|
||||||
this.$emit('setFormItemData', { key: this.question.Id, val: this.urls.length > 0 ? this.urls.join('|') : '' })
|
this.$emit('setFormItemData', { key: this.question.Id, val: this.urls.length > 0 ? this.urls.join('|') : '' })
|
||||||
loading.close()
|
loading.close()
|
||||||
|
// uploadReadingAnswerImage(this.$route.query.trialId, this.visitTaskId, formData).then(res => {
|
||||||
|
// if (res.IsSuccess) {
|
||||||
|
// this.fileList.push({ url: `/api/${res.Result.Path}` })
|
||||||
|
// this.urls.push(res.Result.Path)
|
||||||
|
// this.$emit('setFormItemData', { key: this.question.Id, val: this.urls.length > 0 ? this.urls.join('|') : '' })
|
||||||
|
// }
|
||||||
|
// loading.close()
|
||||||
|
// }).catch(() => {
|
||||||
|
// loading.close()
|
||||||
|
// })
|
||||||
},
|
},
|
||||||
handleBeforeUpload(file) {
|
handleBeforeUpload(file, accept) {
|
||||||
// 检测文件类型是否符合要求
|
// 检测文件类型是否符合要求
|
||||||
if (this.checkFileSuffix(file.name)) {
|
console.log('handleBeforeUpload', file)
|
||||||
// this.fileList = []
|
if (this.checkFileSuffix(file.name, accept) || accept === '-1') {
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
const msg = this.$t('trials:adReview:title:msg4').replace('xxx', this.accept)
|
const msg = this.$t('trials:adReview:title:msg4').replace('xxx', accept)
|
||||||
this.$alert(msg)
|
this.$alert(msg)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
console.log(file)
|
||||||
},
|
},
|
||||||
checkFileSuffix(fileName) {
|
checkFileSuffix(fileName, accept) {
|
||||||
var index = fileName.lastIndexOf('.')
|
var index = fileName.lastIndexOf('.')
|
||||||
var suffix = fileName.substring(index + 1, fileName.length)
|
var suffix = fileName.substring(index + 1, fileName.length)
|
||||||
if (this.accept.toLocaleLowerCase().search(suffix.toLocaleLowerCase()) === -1) {
|
if (accept.toLocaleLowerCase().search(suffix.toLocaleLowerCase()) === -1) {
|
||||||
return false
|
return false
|
||||||
} else {
|
} else {
|
||||||
return true
|
return true
|
||||||
|
@ -750,10 +799,13 @@ export default {
|
||||||
},
|
},
|
||||||
// 删除图片
|
// 删除图片
|
||||||
handleRemove(file, fileList) {
|
handleRemove(file, fileList) {
|
||||||
this.imageUrl = ''
|
console.log('handleRemove')
|
||||||
this.fileList.splice(this.fileList.findIndex(f => f.url === file.url), 1)
|
if (file && file.status === "success") {
|
||||||
this.urls.splice(this.fileList.findIndex(f => f === file.url), 1)
|
this.imageUrl = ''
|
||||||
this.$emit('setFormItemData', { key: this.question.Id, val: this.urls.length > 0 ? this.urls.join('|') : '' })
|
this.fileList.splice(this.fileList.findIndex(f => f.url === file.url), 1)
|
||||||
|
this.urls.splice(this.fileList.findIndex(f => f === file.url), 1)
|
||||||
|
this.$emit('setFormItemData', { key: this.question.Id, val: this.urls.length > 0 ? this.urls.join('|') : '' })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -762,13 +814,34 @@ export default {
|
||||||
.my_dialog{
|
.my_dialog{
|
||||||
.criterion-form-item{
|
.criterion-form-item{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
>>>.el-form-item__content{
|
/deep/ .el-form-item__content{
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
///deep/ .el-input-goup__append{
|
||||||
|
// background-color: transparent;
|
||||||
|
// color: #ddd;
|
||||||
|
// border: 1px solid #5e5e5e;
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/deep/ .el-form-item__label{
|
||||||
|
color: #c3c3c3;
|
||||||
|
}
|
||||||
|
/deep/ .el-radio__label{
|
||||||
|
color: #c3c3c3;
|
||||||
|
}
|
||||||
|
/deep/ .el-input-group__append{
|
||||||
|
background: #000;
|
||||||
|
color: #ddd;
|
||||||
|
border: 1px solid #5e5e5e;
|
||||||
|
}
|
||||||
|
/deep/ .el-input .el-input__inner{
|
||||||
|
background-color: transparent;
|
||||||
|
color: #ddd;
|
||||||
|
border: 1px solid #5e5e5e;
|
||||||
|
}
|
||||||
.criterion-form-item{
|
.criterion-form-item{
|
||||||
>>>.criterion-form-item .el-form-item{
|
/deep/ .criterion-form-item .el-form-item{
|
||||||
display: block;
|
display: block;
|
||||||
.el-form-item__label{
|
.el-form-item__label{
|
||||||
display: block;
|
display: block;
|
||||||
|
@ -776,16 +849,13 @@ export default {
|
||||||
float: none;
|
float: none;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
.el-input--small .el-input__inner{
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.el-form-item{
|
.el-form-item{
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
>>>.el-form-item__content{
|
/deep/ .el-form-item__content{
|
||||||
}
|
}
|
||||||
.el-input{
|
.el-input{
|
||||||
width:100%;
|
width:100%;
|
||||||
|
@ -794,7 +864,7 @@ export default {
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
}
|
}
|
||||||
.disabled{
|
.disabled{
|
||||||
>>>.el-upload--picture-card {
|
/deep/ .el-upload--picture-card {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -804,10 +874,16 @@ export default {
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
>>>.el-table__body-wrapper::-webkit-scrollbar{
|
/deep/ .el-table__body-wrapper::-webkit-scrollbar{
|
||||||
height: 10px!important;
|
height: 10px!important;
|
||||||
}
|
}
|
||||||
>>>.el-table__fixed-right::before{
|
/deep/ .el-table__fixed-right::before{
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
/deep/ .el-upload-list__item-name{
|
||||||
|
color: #0a84ff;
|
||||||
|
.el-icon-document{
|
||||||
|
color: #0a84ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -140,7 +140,6 @@
|
||||||
<div slot="file" slot-scope="{file}">
|
<div slot="file" slot-scope="{file}">
|
||||||
<img
|
<img
|
||||||
class="el-upload-list__item-thumbnail"
|
class="el-upload-list__item-thumbnail"
|
||||||
crossOrigin="Anonymous"
|
|
||||||
:src="OSSclientConfig.basePath + file.url"
|
:src="OSSclientConfig.basePath + file.url"
|
||||||
alt=""
|
alt=""
|
||||||
>
|
>
|
||||||
|
@ -236,11 +235,11 @@ export default {
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.question.Type === 'upload') {
|
if (this.question.Type === 'upload') {
|
||||||
if (this.questionForm[this.question.Id]) {
|
if (this.questionForm[this.question.Id]) {
|
||||||
|
this.accept = this.question.Accept
|
||||||
this.urls = this.questionForm[this.question.Id].split('|')
|
this.urls = this.questionForm[this.question.Id].split('|')
|
||||||
this.fileList = []
|
this.fileList = []
|
||||||
|
|
||||||
this.urls.map(url => {
|
this.urls.map(url => {
|
||||||
this.fileList.push({ name: '', url: `/${url}` })
|
this.fileList.push({ name: '', url: `/api/${url}` })
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -273,11 +272,9 @@ export default {
|
||||||
lock: true,
|
lock: true,
|
||||||
spinner: 'el-icon-loading'
|
spinner: 'el-icon-loading'
|
||||||
})
|
})
|
||||||
var fileName = param.file.name
|
var file = await this.fileToBlob(param.file)
|
||||||
let file = await this.fileToBlob(param.file)
|
const res = await this.OSSclient.put(`/${this.trialId}/ReadAttachment/${this.subjectId}/${this.visitTaskId}/${param.file.name}`, file)
|
||||||
let res = await this.OSSclient.put(`/${this.$route.query.trialId}/Customize/${this.visitTaskId}/${fileName}`, file)
|
this.fileList.push({ name: param.file.name, url: this.$getObjectName(res.url) })
|
||||||
this.fileList.push({ name: `${this.$t('trials:emailManageCfg:title:fileName')}${this.fileList.length + 1}`, url: this.$getObjectName(res.url) })
|
|
||||||
console.log('fileList', this.fileList)
|
|
||||||
this.urls.push(this.$getObjectName(res.url))
|
this.urls.push(this.$getObjectName(res.url))
|
||||||
this.$emit('setFormItemData', { key: this.question.Id, val: this.urls.length > 0 ? this.urls.join('|') : '' })
|
this.$emit('setFormItemData', { key: this.question.Id, val: this.urls.length > 0 ? this.urls.join('|') : '' })
|
||||||
loading.close()
|
loading.close()
|
||||||
|
@ -288,11 +285,13 @@ export default {
|
||||||
// this.fileList = []
|
// this.fileList = []
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
this.$alert(`必须是 ${this.accept} 格式`)
|
const msg = this.$t('trials:adReview:title:msg4').replace('xxx', this.accept)
|
||||||
|
this.$alert(msg)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
checkFileSuffix(fileName) {
|
checkFileSuffix(fileName) {
|
||||||
|
console.log(this.accept)
|
||||||
var index = fileName.lastIndexOf('.')
|
var index = fileName.lastIndexOf('.')
|
||||||
var suffix = fileName.substring(index + 1, fileName.length)
|
var suffix = fileName.substring(index + 1, fileName.length)
|
||||||
if (this.accept.toLocaleLowerCase().search(suffix.toLocaleLowerCase()) === -1) {
|
if (this.accept.toLocaleLowerCase().search(suffix.toLocaleLowerCase()) === -1) {
|
||||||
|
@ -321,7 +320,7 @@ export default {
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
}
|
}
|
||||||
.disabled{
|
.disabled{
|
||||||
>>>.el-upload--picture-card {
|
/deep/ .el-upload--picture-card {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -330,10 +329,10 @@ export default {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
>>>.el-input.is-disabled .el-input__inner{
|
/deep/ .el-input.is-disabled .el-input__inner{
|
||||||
background-color: #646464a1;
|
background-color: #646464a1;
|
||||||
}
|
}
|
||||||
>>>.el-select.is-disabled .el-input__inner{
|
/deep/ .el-select.is-disabled .el-input__inner{
|
||||||
background-color: #646464a1;
|
background-color: #646464a1;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
:prop="question.Id"
|
:prop="question.Id"
|
||||||
:rules="[
|
:rules="[
|
||||||
{ required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && !!~question.RelevanceValueList.indexOf(questionForm[question.RelevanceId]))) && question.Type!=='group' && question.Type!=='summary',
|
{ required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && !!~question.RelevanceValueList.indexOf(questionForm[question.RelevanceId]))) && question.Type!=='group' && question.Type!=='summary',
|
||||||
message: '请注明', trigger: ['blur', 'change']},
|
message: $t('common:ruleMessage:select'), trigger: ['blur', 'change']},
|
||||||
]"
|
]"
|
||||||
:class="[question.Type==='group'?'mb':question.Type==='upload'?'uploadWrapper':'']"
|
:class="[question.Type==='group'?'mb':question.Type==='upload'?'uploadWrapper':'']"
|
||||||
>
|
>
|
||||||
|
@ -150,7 +150,6 @@
|
||||||
<div slot="file" slot-scope="{file}">
|
<div slot="file" slot-scope="{file}">
|
||||||
<img
|
<img
|
||||||
class="el-upload-list__item-thumbnail"
|
class="el-upload-list__item-thumbnail"
|
||||||
crossOrigin="Anonymous"
|
|
||||||
:src="OSSclientConfig.basePath + file.url"
|
:src="OSSclientConfig.basePath + file.url"
|
||||||
alt=""
|
alt=""
|
||||||
>
|
>
|
||||||
|
@ -178,9 +177,9 @@
|
||||||
:visible.sync="imgVisible"
|
:visible.sync="imgVisible"
|
||||||
width="600px"
|
width="600px"
|
||||||
>
|
>
|
||||||
<el-image :src="imageUrl" crossOrigin="Anonymous" width="100%">
|
<el-image :src="imageUrl" width="100%">
|
||||||
<div slot="placeholder" class="image-slot">
|
<div slot="placeholder" class="image-slot">
|
||||||
加载中<span class="dot">...</span>
|
{{$t('trials:readingUnit:qsList:message:loading')}}<span class="dot">...</span>
|
||||||
</div>
|
</div>
|
||||||
</el-image>
|
</el-image>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
@ -212,6 +211,12 @@ export default {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
|
CalculationList: {
|
||||||
|
type: Array,
|
||||||
|
default() {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
},
|
||||||
readingTaskState: {
|
readingTaskState: {
|
||||||
type: Number,
|
type: Number,
|
||||||
required: true
|
required: true
|
||||||
|
@ -225,6 +230,16 @@ export default {
|
||||||
default: 'add'
|
default: 'add'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
calculationValue: {
|
||||||
|
get() {
|
||||||
|
return this.questionForm[this.question.Id]
|
||||||
|
},
|
||||||
|
set() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
addOrEdit: { visible: false, title: '' },
|
addOrEdit: { visible: false, title: '' },
|
||||||
|
@ -239,14 +254,27 @@ export default {
|
||||||
digitPlaces: 0
|
digitPlaces: 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// watch: {
|
||||||
|
// questionForm: {
|
||||||
|
// deep: true,
|
||||||
|
// immediate: true,
|
||||||
|
// handler(v) {
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// },
|
||||||
watch: {
|
watch: {
|
||||||
questionForm: {
|
questionForm: {
|
||||||
deep: true,
|
deep: true,
|
||||||
immediate: true,
|
immediate: true,
|
||||||
handler(v) {
|
handler(v, oldv) {
|
||||||
|
try {
|
||||||
|
if (!v[this.question.Id] || !oldv[this.question.Id]) return
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
this.formItemNumberChange(this.question.Id, false)
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.digitPlaces = localStorage.getItem('digitPlaces') ? parseInt(localStorage.getItem('digitPlaces')) : 0
|
this.digitPlaces = localStorage.getItem('digitPlaces') ? parseInt(localStorage.getItem('digitPlaces')) : 0
|
||||||
|
@ -255,7 +283,7 @@ export default {
|
||||||
this.urls = this.questionForm[this.question.Id].split('|')
|
this.urls = this.questionForm[this.question.Id].split('|')
|
||||||
this.fileList = []
|
this.fileList = []
|
||||||
this.urls.map(url => {
|
this.urls.map(url => {
|
||||||
this.fileList.push({ name: '', url: `/${url}` })
|
this.fileList.push({ name: '', url: `${url}` })
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -272,7 +300,7 @@ export default {
|
||||||
},
|
},
|
||||||
openAddTableCol(row) {
|
openAddTableCol(row) {
|
||||||
this.addOrEdit.visible = true
|
this.addOrEdit.visible = true
|
||||||
this.addOrEdit.title = row.QuestionName + '表格问题'
|
this.addOrEdit.title = row.QuestionName + this.$t('trials:readingUnit:qsList:title:tableQs')
|
||||||
this.QuestionsList = row.TableQuestions.Questions
|
this.QuestionsList = row.TableQuestions.Questions
|
||||||
this.AnswersList = row.TableQuestions.Answers
|
this.AnswersList = row.TableQuestions.Answers
|
||||||
this.QuestionsForm = {}
|
this.QuestionsForm = {}
|
||||||
|
@ -314,8 +342,95 @@ export default {
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
logic(rules, num = 0) {
|
||||||
|
try {
|
||||||
|
if (rules.CalculateQuestionList.length === 0) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
var count = 0
|
||||||
|
var maxList = [], minList = []
|
||||||
|
rules.CalculateQuestionList.forEach((o, i) => {
|
||||||
|
if (rules.CustomCalculateMark > 4) {
|
||||||
|
if (i !== 0) {
|
||||||
|
switch (rules.CustomCalculateMark) {
|
||||||
|
case 7:
|
||||||
|
count += parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
if (i === rules.CalculateQuestionList.length - 1) {
|
||||||
|
num = count / rules.CalculateQuestionList.length
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
maxList.push(this.questionForm[o.TableQuestionId])
|
||||||
|
if (i === rules.CalculateQuestionList.length - 1) {
|
||||||
|
num = Math.max(...maxList)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
minList.push(this.questionForm[o.TableQuestionId])
|
||||||
|
if (i === rules.CalculateQuestionList.length - 1) {
|
||||||
|
num = Math.min(...minList)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
maxList.push(this.questionForm[o.TableQuestionId])
|
||||||
|
minList.push(this.questionForm[o.TableQuestionId])
|
||||||
|
count = parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
num = parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (i !== 0) {
|
||||||
|
switch (rules.CustomCalculateMark) {
|
||||||
|
case 1:
|
||||||
|
num += parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
num -= parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
num *= parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (parseFloat(this.questionForm[o.TableQuestionId]) === 0) {
|
||||||
|
num = 0
|
||||||
|
} else {
|
||||||
|
num /= parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
num = parseFloat(this.questionForm[o.TableQuestionId])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
var digitPlaces = parseInt(localStorage.getItem('digitPlaces'))
|
||||||
|
if (rules.ValueType === 2) {
|
||||||
|
num = num * 100
|
||||||
|
}
|
||||||
|
return num.toFixed(digitPlaces)
|
||||||
|
},
|
||||||
formItemNumberChange(v, question) {
|
formItemNumberChange(v, question) {
|
||||||
this.$emit('formItemTableNumberChange', v, question)
|
console.log(this.CalculationList)
|
||||||
|
this.CalculationList.forEach((v, i) => {
|
||||||
|
console.log('v', v)
|
||||||
|
var find = v.CalculateQuestionList.filter(o => {
|
||||||
|
return o.QuestionId === question.Id
|
||||||
|
})
|
||||||
|
console.log('find', find)
|
||||||
|
// find的自动计算值number
|
||||||
|
if (find) {
|
||||||
|
var num = this.logic(v)
|
||||||
|
console.log(num)
|
||||||
|
if (num !== false) {
|
||||||
|
this.$set(this.questionForm, v.QuestionId, num)
|
||||||
|
// this.$emit('setFormItemData', { key: v.QuestionId, val: num })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// this.$emit('formItemTableNumberChange', v, question)
|
||||||
},
|
},
|
||||||
resetChild(obj) {
|
resetChild(obj) {
|
||||||
obj.forEach(i => {
|
obj.forEach(i => {
|
||||||
|
@ -344,6 +459,7 @@ export default {
|
||||||
var subjectId = this.$route.query.trialId
|
var subjectId = this.$route.query.trialId
|
||||||
var file = await this.fileToBlob(param.file)
|
var file = await this.fileToBlob(param.file)
|
||||||
const res = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${param.file.name}`, file)
|
const res = await this.OSSclient.put(`/${trialId}/Read/${subjectId}/Visit/${param.file.name}`, file)
|
||||||
|
console.log(res)
|
||||||
this.fileList.push({ name: param.file.name, path: this.$getObjectName(res.url), url: this.$getObjectName(res.url)})
|
this.fileList.push({ name: param.file.name, path: this.$getObjectName(res.url), url: this.$getObjectName(res.url)})
|
||||||
this.urls.push(this.$getObjectName(res.url))
|
this.urls.push(this.$getObjectName(res.url))
|
||||||
this.$emit('setFormTableItemData', this.question.Id, this.urls.length > 0 ? this.urls.join('|') : '')
|
this.$emit('setFormTableItemData', this.question.Id, this.urls.length > 0 ? this.urls.join('|') : '')
|
||||||
|
@ -386,7 +502,7 @@ export default {
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.my_dialog{
|
.my_dialog{
|
||||||
.criterion-form-item{
|
.criterion-form-item{
|
||||||
>>>.el-form-item__content{
|
/deep/ .el-form-item__content{
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -397,7 +513,7 @@ export default {
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
>>>.el-form-item__content{
|
/deep/ .el-form-item__content{
|
||||||
width: 500px;
|
width: 500px;
|
||||||
}
|
}
|
||||||
.el-input{
|
.el-input{
|
||||||
|
@ -407,7 +523,7 @@ export default {
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
}
|
}
|
||||||
.disabled{
|
.disabled{
|
||||||
>>>.el-upload--picture-card {
|
/deep/ .el-upload--picture-card {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,9 +219,7 @@ export default {
|
||||||
await store.dispatch('reading/getVisitTasks', this.visitTaskId)
|
await store.dispatch('reading/getVisitTasks', this.visitTaskId)
|
||||||
var index = this.visitTaskList.findIndex(i => i.IsCurrentTask)
|
var index = this.visitTaskList.findIndex(i => i.IsCurrentTask)
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
for (let i = 0; i < this.visitTaskList.length ; i++) {
|
await store.dispatch('reading/getCustomizeMeasuredData', this.visitTaskList[index].VisitTaskId)
|
||||||
await store.dispatch('reading/getCustomizeMeasuredData', this.visitTaskList[i].VisitTaskId)
|
|
||||||
}
|
|
||||||
await store.dispatch('reading/getStudyInfo', { trialId: this.trialId, subjectVisitId: this.visitTaskList[index].VisitId, visitTaskId: this.visitTaskList[index].VisitTaskId, taskBlindName: this.visitTaskList[index].TaskBlindName })
|
await store.dispatch('reading/getStudyInfo', { trialId: this.trialId, subjectVisitId: this.visitTaskList[index].VisitId, visitTaskId: this.visitTaskList[index].VisitTaskId, taskBlindName: this.visitTaskList[index].TaskBlindName })
|
||||||
await store.dispatch('reading/getReadingQuestionAndAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[index].VisitTaskId })
|
await store.dispatch('reading/getReadingQuestionAndAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[index].VisitTaskId })
|
||||||
await store.dispatch('reading/getDicomReadingQuestionAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[index].VisitTaskId })
|
await store.dispatch('reading/getDicomReadingQuestionAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[index].VisitTaskId })
|
||||||
|
@ -501,31 +499,31 @@ export default {
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
border:none;
|
border:none;
|
||||||
}
|
}
|
||||||
>>>.el-table, .el-table__expanded-cell {
|
/deep/ .el-table, .el-table__expanded-cell {
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
|
|
||||||
>>>.el-table th, .el-table tr {
|
/deep/ .el-table th, .el-table tr {
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
>>>.el-table__body tr > td{
|
/deep/ .el-table__body tr > td{
|
||||||
background-color:#000 !important;
|
background-color:#000 !important;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
>>>.el-table__body tr:hover > td{
|
/deep/ .el-table__body tr:hover > td{
|
||||||
background-color:#858282 !important;
|
background-color:#858282 !important;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
>>>.el-table--border th.gutter:last-of-type{
|
/deep/ .el-table--border th.gutter:last-of-type{
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
>>>.el-card__header{
|
/deep/ .el-card__header{
|
||||||
border: none;
|
border: none;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
@ -581,18 +579,18 @@ export default {
|
||||||
.el-tabs__item{
|
.el-tabs__item{
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__header{
|
/deep/ .el-tabs__header{
|
||||||
height: 55px;
|
height: 55px;
|
||||||
margin:0px;
|
margin:0px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__content{
|
/deep/ .el-tabs__content{
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin:0px;
|
margin:0px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__item{
|
/deep/ .el-tabs__item{
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -613,7 +611,7 @@ export default {
|
||||||
background-color: #607d8b!important;
|
background-color: #607d8b!important;
|
||||||
border: 1px solid #607d8b!important;
|
border: 1px solid #607d8b!important;
|
||||||
}
|
}
|
||||||
>>>.el-progress__text{
|
/deep/ .el-progress__text{
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,6 +148,9 @@
|
||||||
<template v-else-if="scope.row.ValueType === 2">
|
<template v-else-if="scope.row.ValueType === 2">
|
||||||
{{ isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId])) ? questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]:`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]} %` }}
|
{{ isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId])) ? questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]:`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]} %` }}
|
||||||
</template>
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
{{ isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId])) ? questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]:`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]}` }}
|
||||||
|
</template>
|
||||||
</span>
|
</span>
|
||||||
<el-input
|
<el-input
|
||||||
v-else-if="scope.row.DataSource !== 1 && scope.row.Type==='number' && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
v-else-if="scope.row.DataSource !== 1 && scope.row.Type==='number' && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||||
|
@ -168,6 +171,9 @@
|
||||||
<template v-else-if="scope.row.ValueType === 2">
|
<template v-else-if="scope.row.ValueType === 2">
|
||||||
{{ isNaN(parseInt(questionForm[scope.row.QuestionId])) ? questionForm[scope.row.QuestionId]:`${questionForm[scope.row.QuestionId]} %` }}
|
{{ isNaN(parseInt(questionForm[scope.row.QuestionId])) ? questionForm[scope.row.QuestionId]:`${questionForm[scope.row.QuestionId]} %` }}
|
||||||
</template>
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
{{ isNaN(parseInt(questionForm[scope.row.QuestionId])) ? questionForm[scope.row.QuestionId] : questionForm[scope.row.QuestionId]}}
|
||||||
|
</template>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -703,7 +709,7 @@ export default {
|
||||||
},
|
},
|
||||||
handleResize() {
|
handleResize() {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.$refs.reportList && this.$refs.reportList.doLayout()
|
this.$refs.reportList.doLayout()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
// 关闭签名框
|
// 关闭签名框
|
||||||
|
@ -739,7 +745,7 @@ export default {
|
||||||
store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 })
|
store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 })
|
||||||
DicomEvent.$emit('setReadingState', 2)
|
DicomEvent.$emit('setReadingState', 2)
|
||||||
window.opener.postMessage('refreshTaskList', window.location)
|
window.opener.postMessage('refreshTaskList', window.location)
|
||||||
this.$confirm('当前阅片任务已完成,是否进入下一个阅片任务?', {
|
this.$confirm(this.$t('trials:oncologyReview:title:msg2'), {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
distinguishCancelAndClose: true
|
distinguishCancelAndClose: true
|
||||||
})
|
})
|
||||||
|
@ -752,7 +758,8 @@ export default {
|
||||||
// this.$router.push({
|
// this.$router.push({
|
||||||
// path: `/readingPage?subjectCode=${subjectCode}&subjectId=${subjectId}&trialId=${trialId}&TokenKey=${token}`
|
// path: `/readingPage?subjectCode=${subjectCode}&subjectId=${subjectId}&trialId=${trialId}&TokenKey=${token}`
|
||||||
// })
|
// })
|
||||||
DicomEvent.$emit('getNextTask')
|
// DicomEvent.$emit('getNextTask')
|
||||||
|
window.location.reload()
|
||||||
})
|
})
|
||||||
.catch(action => {
|
.catch(action => {
|
||||||
|
|
||||||
|
@ -845,61 +852,61 @@ export default {
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
border:none;
|
border:none;
|
||||||
}
|
}
|
||||||
// >>>.el-table__cell{
|
// /deep/ .el-table__cell{
|
||||||
// background-color: #000;
|
// background-color: #000;
|
||||||
// color: #ffffff;
|
// color: #ffffff;
|
||||||
// }
|
// }
|
||||||
// >>>.el-table{
|
// /deep/ .el-table{
|
||||||
// background-color: #000;
|
// background-color: #000;
|
||||||
// color: #ffffff;
|
// color: #ffffff;
|
||||||
// }
|
// }
|
||||||
// >>>.el-table__cell{
|
// /deep/ .el-table__cell{
|
||||||
// background-color: #000;
|
// background-color: #000;
|
||||||
// color: #ffffff;
|
// color: #ffffff;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
>>>.el-table, .el-table__expanded-cell {
|
/deep/ .el-table, .el-table__expanded-cell {
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
|
|
||||||
>>>.el-table th, .el-table tr {
|
/deep/ .el-table th, .el-table tr {
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
>>>.el-table__body tr > td{
|
/deep/ .el-table__body tr > td{
|
||||||
background-color:#000 !important;
|
background-color:#000 !important;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
>>>.el-table__body tr:hover > td{
|
/deep/ .el-table__body tr:hover > td{
|
||||||
background-color:#858282 !important;
|
background-color:#858282 !important;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color:#444444;
|
border-color:#444444;
|
||||||
}
|
}
|
||||||
>>>.el-table--border th.gutter:last-of-type{
|
/deep/ .el-table--border th.gutter:last-of-type{
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
>>>.el-card__header{
|
/deep/ .el-card__header{
|
||||||
border: none;
|
border: none;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
>>>.el-upload-list--picture-card .el-upload-list__item{
|
/deep/ .el-upload-list--picture-card .el-upload-list__item{
|
||||||
width: 30px;
|
width: 30px;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
}
|
}
|
||||||
>>>.el-upload--picture-card{
|
/deep/ .el-upload--picture-card{
|
||||||
width: 30px;
|
width: 30px;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
>>>.el-switch__label{
|
/deep/ .el-switch__label{
|
||||||
color:#fff;
|
color:#fff;
|
||||||
}
|
}
|
||||||
>>>.el-switch__label.is-active{
|
/deep/ .el-switch__label.is-active{
|
||||||
color: #428bca;
|
color: #428bca;
|
||||||
}
|
}
|
||||||
.uploadWrapper{
|
.uploadWrapper{
|
||||||
|
|
|
@ -88,6 +88,7 @@ name: "CustomizeReportPageUpload",
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.urls = this.initUrl === '' ? [] : this.initUrl.split('|')
|
this.urls = this.initUrl === '' ? [] : this.initUrl.split('|')
|
||||||
|
console.log(this.visitTaskId, this.urls)
|
||||||
this.fileList = []
|
this.fileList = []
|
||||||
this.urls.map(url => {
|
this.urls.map(url => {
|
||||||
this.fileList.push({ name: '', url: `${url}` })
|
this.fileList.push({ name: '', url: `${url}` })
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
<div
|
<div
|
||||||
v-for="(series, i) in study.SeriesList"
|
v-for="(series, i) in study.SeriesList"
|
||||||
:key="i"
|
:key="i"
|
||||||
style="position:relative;margin:10px 0px;"
|
style="position:relative;margin-top:5px;"
|
||||||
series-type="current"
|
series-type="current"
|
||||||
@click="showSeriesImage(index,i,series)"
|
@click="showSeriesImage(index,i,series)"
|
||||||
>
|
>
|
||||||
|
@ -45,21 +45,22 @@
|
||||||
class="image-preview"
|
class="image-preview"
|
||||||
:src="series.previewImageUrl"
|
:src="series.previewImageUrl"
|
||||||
fit="fill"
|
fit="fill"
|
||||||
|
crossorigin="anonymous"
|
||||||
/>
|
/>
|
||||||
<div class="image-desc">
|
<div class="image-desc">
|
||||||
<div class="flex-div">
|
<div class="flex-div">
|
||||||
<div>#{{ series.seriesNumber }} </div>
|
<div v-if="!study.IsCriticalSequence">#{{ series.seriesNumber }} </div>
|
||||||
<div v-if="series.isDicom && series.prefetchInstanceCount<series.instanceCount">
|
<div v-if="series.isDicom && series.prefetchInstanceCount<series.instanceCount && series.modality!== 'SR'">
|
||||||
<!-- 下载 -->
|
<!-- 下载 -->
|
||||||
<el-tooltip v-if="!series.isLoading" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
<el-tooltip v-if="!series.isLoading" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
||||||
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<!-- 暂停 -->
|
<!-- 暂停 -->
|
||||||
<el-tooltip v-else class="item" effect="dark" :content="$t('trials:reading:button:pause')" placement="bottom">
|
<!-- <el-tooltip v-else class="item" effect="dark" :content="$t('trials:reading:button:pause')" placement="bottom">
|
||||||
<i class="el-icon-video-pause" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="stopLoadSeries(series,index,i)" />
|
<i class="el-icon-video-pause" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="stopLoadSeries(series,index,i)" />
|
||||||
</el-tooltip>
|
</el-tooltip> -->
|
||||||
</div>
|
</div>
|
||||||
<el-tooltip v-else-if="series.prefetchInstanceCount === 0" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
<el-tooltip v-else-if="series.isDicom && series.prefetchInstanceCount === 0 &&series.modality!== 'SR'" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
||||||
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
@ -69,15 +70,15 @@
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p v-show="series.sliceThickness">
|
<p v-show="series.sliceThickness && !study.IsCriticalSequence">
|
||||||
T: {{ series.sliceThickness }}
|
T: {{ parseFloat(series.sliceThickness).toFixed(digitPlaces) }}
|
||||||
</p>
|
</p>
|
||||||
<p v-show="series.instanceCount">
|
<p v-show="series.instanceCount">
|
||||||
{{ series.modality }}: {{ series.instanceCount }} image
|
{{ series.modality }}: {{ series.instanceCount }} image
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="flex-div">
|
<div class="flex-div">
|
||||||
<div v-if="measureData && measureData.findIndex(v=>v.SeriesId === series.seriesId) > -1">
|
<div v-if="measureData && measureData.findIndex(v=>v.SeriesId === series.seriesId && v.MeasureData) > -1">
|
||||||
<!-- 有标注 -->
|
<!-- 有标注 -->
|
||||||
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:marked')" placement="right">
|
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:marked')" placement="right">
|
||||||
<i class="el-icon-star-on" style="font-size: 16px;color: #ff5722;" />
|
<i class="el-icon-star-on" style="font-size: 16px;color: #ff5722;" />
|
||||||
|
@ -98,22 +99,47 @@
|
||||||
</el-collapse-item>
|
</el-collapse-item>
|
||||||
</el-collapse>
|
</el-collapse>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="sr-wrapper">
|
||||||
|
<el-dialog
|
||||||
|
:visible.sync="srDialogVisible"
|
||||||
|
:custom-class="isSrFullscreen?'sr-full-dialog-container':'sr-dialog-container'"
|
||||||
|
:show-close="false"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
:fullscreen="isSrFullscreen"
|
||||||
|
>
|
||||||
|
<span slot="title" class="dialog-footer">
|
||||||
|
<div style="position: absolute;right: 20px;top: 10px;">
|
||||||
|
<svg-icon :icon-class="isSrFullscreen?'exit-fullscreen':'fullscreen'" style="cursor: pointer;font-size: 20px;color:#000;" @click="isSrFullscreen=!isSrFullscreen" />
|
||||||
|
<svg-icon icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;" @click="srDialogVisible = false" />
|
||||||
|
</div>
|
||||||
|
</span>
|
||||||
|
<div style="height: 100%;margin:0;">
|
||||||
|
<SrList
|
||||||
|
v-if="srDialogVisible"
|
||||||
|
:sr-info="srInfo"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import * as dicomParser from 'dicom-parser'
|
import * as dicomParser from 'dicom-parser'
|
||||||
import * as cornerstone from 'cornerstone-core'
|
import * as cornerstone from 'cornerstone-core'
|
||||||
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
||||||
|
|
||||||
import requestPoolManager from '@/utils/request-pool'
|
import requestPoolManager from '@/utils/request-pool'
|
||||||
import DicomEvent from './../components/DicomEvent'
|
import DicomEvent from './../components/DicomEvent'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
|
import SrList from './../components/SrList'
|
||||||
cornerstoneWADOImageLoader.external.dicomParser = dicomParser
|
cornerstoneWADOImageLoader.external.dicomParser = dicomParser
|
||||||
cornerstoneWADOImageLoader.external.cornerstone = cornerstone
|
cornerstoneWADOImageLoader.external.cornerstone = cornerstone
|
||||||
// const maximumSizeInBytes = 1024 * 1024 * 1024 // 1 GB
|
const maximumSizeInBytes = 1024 * 1024 * 1024 // 1 GB
|
||||||
|
cornerstone.imageCache.setMaximumSizeBytes(maximumSizeInBytes)
|
||||||
export default {
|
export default {
|
||||||
name: 'StudyList',
|
name: 'StudyList',
|
||||||
|
components: { SrList },
|
||||||
props: {
|
props: {
|
||||||
trialId: {
|
trialId: {
|
||||||
type: String,
|
type: String,
|
||||||
|
@ -144,6 +170,7 @@ export default {
|
||||||
return {
|
return {
|
||||||
studyList: [],
|
studyList: [],
|
||||||
cachedImages: [],
|
cachedImages: [],
|
||||||
|
showSeriesList: [],
|
||||||
studyIndex: null,
|
studyIndex: null,
|
||||||
seriesIndex: null,
|
seriesIndex: null,
|
||||||
loading: false,
|
loading: false,
|
||||||
|
@ -153,9 +180,15 @@ export default {
|
||||||
activeNames: [],
|
activeNames: [],
|
||||||
seriesArr: [],
|
seriesArr: [],
|
||||||
imageList: [],
|
imageList: [],
|
||||||
loopLoadStatus: 0 // -1暂停下载 0未下载完成 1下载完成
|
loopLoadStatus: 0, // -1暂停下载 0未下载完成 1下载完成
|
||||||
|
isSrFullscreen: false,
|
||||||
|
srDialogVisible: false,
|
||||||
|
srInfo: {},
|
||||||
|
digitPlaces: 2,
|
||||||
|
visitTaskIdx: -1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(['visitTaskList', 'currentTaskId', 'activeSeries'])
|
...mapGetters(['visitTaskList', 'currentTaskId', 'activeSeries'])
|
||||||
},
|
},
|
||||||
|
@ -167,6 +200,14 @@ export default {
|
||||||
if (idx === -1) return
|
if (idx === -1) return
|
||||||
this.measureData = this.visitTaskList[idx].MeasureData
|
this.measureData = this.visitTaskList[idx].MeasureData
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
visitTaskId: {
|
||||||
|
immediate: true,
|
||||||
|
handler(val) {
|
||||||
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
|
if (idx === -1) return
|
||||||
|
this.visitTaskIdx = idx
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// activeSeries: {
|
// activeSeries: {
|
||||||
// immediate: true,
|
// immediate: true,
|
||||||
|
@ -179,10 +220,8 @@ export default {
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.subjectCode = this.$router.currentRoute.query.subjectCode
|
this.subjectCode = this.$router.currentRoute.query.subjectCode
|
||||||
// DicomEvent.$on('getMeasureData', () => {
|
var digitPlaces = Number(localStorage.getItem('digitPlaces'))
|
||||||
// var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
|
||||||
// this.measureData = this.visitTaskList[idx].MeasureData
|
|
||||||
// })
|
|
||||||
|
|
||||||
// DicomEvent.$on('setReadingState', readingTaskState => {
|
// DicomEvent.$on('setReadingState', readingTaskState => {
|
||||||
// var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
// var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
|
@ -190,12 +229,12 @@ export default {
|
||||||
// this.studyList = this.visitTaskList[idx].StudyList
|
// this.studyList = this.visitTaskList[idx].StudyList
|
||||||
// }
|
// }
|
||||||
// })
|
// })
|
||||||
|
|
||||||
cornerstone.events.addEventListener('cornerstoneimageloaded', this.cornerstoneImageLoaded)
|
cornerstone.events.addEventListener('cornerstoneimageloaded', this.cornerstoneImageLoaded)
|
||||||
|
// cornerstone.events.addEventListener('cornerstoneimagecachefull', this.cornerstoneimagecachefull)
|
||||||
|
// cornerstone.events.addEventListener('cornerstoneimagecachechanged', this.cornerstoneimagecachechanged)
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
cornerstone.imageCache.purgeCache()
|
cornerstone.imageCache.purgeCache()
|
||||||
// DicomEvent.$off('getMeasureData')
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
initStudyInfo() {
|
initStudyInfo() {
|
||||||
|
@ -208,7 +247,54 @@ export default {
|
||||||
})
|
})
|
||||||
var i = res.findIndex(s => s.isCurrentTask)
|
var i = res.findIndex(s => s.isCurrentTask)
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
var p = this.visitTaskId === this.currentTaskId ? parseInt(new Date().getTime()) : 999 // 非当前任务,符合自动下载的权重次之
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
|
if (idx > -1) {
|
||||||
|
this.measureData = this.visitTaskList[idx].MeasureData
|
||||||
|
this.studyList = this.visitTaskList[idx].StudyList
|
||||||
|
var priority = parseInt(new Date().getTime())
|
||||||
|
res[i].imageIds.map(image => {
|
||||||
|
priority--
|
||||||
|
this.imageList.push({ imageId: image, seriesId: res[i].seriesId, studyIndex: res[i].studyIndex, seriesIndex: res[i].seriesIndex, visitTaskId: res[i].visitTaskId, priority })
|
||||||
|
})
|
||||||
|
|
||||||
|
// this.studyList.map((study, studyIndex) => {
|
||||||
|
// study.SeriesList.map((series, seriesIndex) => {
|
||||||
|
// if (series.modality !== 'SR') {
|
||||||
|
// series.imageIds.map(image => {
|
||||||
|
// var p = priority - seriesIndex
|
||||||
|
// if (series.seriesId === res[i].seriesId) {
|
||||||
|
// p = priority
|
||||||
|
// } else {
|
||||||
|
// --p
|
||||||
|
// }
|
||||||
|
// this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority: p })
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// })
|
||||||
|
this.loopLoad()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DicomEvent.$emit('loadImageStacks', res)
|
||||||
|
loading.close()
|
||||||
|
this.isRender = true
|
||||||
|
}).catch(() => {
|
||||||
|
loading.close()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
initStudyInfo2() {
|
||||||
|
console.log('initStudyInfo')
|
||||||
|
const loading = this.$loading({ fullscreen: true })
|
||||||
|
// 初始化待渲染序列
|
||||||
|
this.getInitSeries().then((res) => {
|
||||||
|
requestPoolManager.startTaskTimer()
|
||||||
|
res.map((item) => {
|
||||||
|
this.loadInitialImage(item)
|
||||||
|
})
|
||||||
|
var i = res.findIndex(s => s.isCurrentTask)
|
||||||
|
if (i > -1) {
|
||||||
|
var p = parseInt(new Date().getTime())
|
||||||
|
// var p = this.visitTaskId === this.currentTaskId ? parseInt(new Date().getTime()) : 999 // 非当前任务,符合自动下载的权重次之
|
||||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
if (idx > -1) {
|
if (idx > -1) {
|
||||||
this.measureData = this.visitTaskList[idx].MeasureData
|
this.measureData = this.visitTaskList[idx].MeasureData
|
||||||
|
@ -216,7 +302,8 @@ export default {
|
||||||
|
|
||||||
this.studyList.map((study, studyIndex) => {
|
this.studyList.map((study, studyIndex) => {
|
||||||
study.SeriesList.map((series, seriesIndex) => {
|
study.SeriesList.map((series, seriesIndex) => {
|
||||||
var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
if (series.modality !== 'SR') {
|
||||||
|
// var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
||||||
// if (sliceThickness === 5 || series.instanceCount <= 100) {
|
// if (sliceThickness === 5 || series.instanceCount <= 100) {
|
||||||
series.imageIds.map(image => {
|
series.imageIds.map(image => {
|
||||||
let priority = 0
|
let priority = 0
|
||||||
|
@ -227,26 +314,31 @@ export default {
|
||||||
}
|
}
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
})
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
this.loopLoad()
|
this.loopLoad()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DicomEvent.$emit('loadImageStacks', res)
|
DicomEvent.$emit('loadImageStacks', res)
|
||||||
|
loading.close()
|
||||||
|
this.isRender = true
|
||||||
|
}).catch(() => {
|
||||||
|
loading.close()
|
||||||
})
|
})
|
||||||
this.isRender = true
|
|
||||||
loading.close()
|
|
||||||
},
|
},
|
||||||
// 获取初始化序列信息
|
// 获取初始化序列信息
|
||||||
loadInitialImage(seriesInfo) {
|
loadInitialImage(seriesInfo) {
|
||||||
var p = parseInt(new Date().getTime())
|
var p = parseInt(new Date().getTime())
|
||||||
var imageId = seriesInfo.imageIds[seriesInfo.imageIdIndex]
|
var imageId = seriesInfo.imageIds[seriesInfo.imageIdIndex]
|
||||||
requestPoolManager.loadAndCacheImagePlus(imageId, seriesInfo.seriesId, p * 100).then(res => {
|
requestPoolManager.loadAndCacheImagePlus(imageId, seriesInfo.seriesId, p * 100).then(res => {
|
||||||
this.imageLoaded(seriesInfo, res.data.string('x0020000e'))
|
if (seriesInfo.isCurrentTask) {
|
||||||
|
this.imageLoaded({ studyIndex: seriesInfo.studyIndex, seriesIndex: seriesInfo.seriesIndex, imageId: res.imageId }, res.data.string('x0020000e'))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getStudyList() {
|
getStudyList() {
|
||||||
|
console.log('getStudyList')
|
||||||
if (!this.isRender) {
|
if (!this.isRender) {
|
||||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
if (idx > -1 && this.visitTaskList[idx].StudyList && this.visitTaskList[idx].StudyList.length > 0) {
|
if (idx > -1 && this.visitTaskList[idx].StudyList && this.visitTaskList[idx].StudyList.length > 0) {
|
||||||
|
@ -318,7 +410,8 @@ export default {
|
||||||
} else {
|
} else {
|
||||||
const sIdx = this.studyList.findIndex(s => s.IsDicom)
|
const sIdx = this.studyList.findIndex(s => s.IsDicom)
|
||||||
const series = this.studyList[sIdx].SeriesList[0]
|
const series = this.studyList[sIdx].SeriesList[0]
|
||||||
series.imageIdIndex = Math.floor(series.imageIds.length / 2) - 1
|
const imageIdIndex = Math.floor(series.imageIds.length / 2)
|
||||||
|
series.imageIdIndex = imageIdIndex > 0 ? imageIdIndex - 1 : 0
|
||||||
seriesList.push(series)
|
seriesList.push(series)
|
||||||
this.studyIndex = sIdx
|
this.studyIndex = sIdx
|
||||||
this.seriesIndex = 0
|
this.seriesIndex = 0
|
||||||
|
@ -383,7 +476,7 @@ export default {
|
||||||
idx > -1 ? seriesInfo = seriesList[idx] : seriesInfo = seriesList[0]
|
idx > -1 ? seriesInfo = seriesList[idx] : seriesInfo = seriesList[0]
|
||||||
}
|
}
|
||||||
if (seriesInfo) {
|
if (seriesInfo) {
|
||||||
let index = Math.floor(seriesInfo.imageIds.length * ((baseObj.series.imageIdIndex+ 1) / baseObj.series.imageIds.length))
|
const index = Math.floor(seriesInfo.imageIds.length * ((baseObj.series.imageIdIndex + 1) / baseObj.series.imageIds.length))
|
||||||
seriesInfo.imageIdIndex = index > 0 ? index - 1 : 0
|
seriesInfo.imageIdIndex = index > 0 ? index - 1 : 0
|
||||||
obj.studyIndex = seriesInfo.studyIndex
|
obj.studyIndex = seriesInfo.studyIndex
|
||||||
obj.seriesIndex = seriesInfo.seriesIndex
|
obj.seriesIndex = seriesInfo.seriesIndex
|
||||||
|
@ -436,7 +529,9 @@ export default {
|
||||||
if (seriesObj) {
|
if (seriesObj) {
|
||||||
obj.studyIndex = seriesObj.studyIndex
|
obj.studyIndex = seriesObj.studyIndex
|
||||||
obj.seriesIndex = seriesObj.seriesIdx
|
obj.seriesIndex = seriesObj.seriesIdx
|
||||||
seriesObj.series.imageIdIndex = Math.floor(seriesObj.series.imageIds.length / 2) - 1
|
const imageIdIndex = Math.floor(seriesObj.series.imageIds.length / 2)
|
||||||
|
|
||||||
|
seriesObj.series.imageIdIndex = imageIdIndex > 0 ? imageIdIndex - 1 : 0
|
||||||
obj.series = seriesObj.series
|
obj.series = seriesObj.series
|
||||||
obj.seriesId = seriesObj.series.seriesId
|
obj.seriesId = seriesObj.series.seriesId
|
||||||
obj.isMarked = false
|
obj.isMarked = false
|
||||||
|
@ -445,11 +540,11 @@ export default {
|
||||||
if (sIdx > -1) {
|
if (sIdx > -1) {
|
||||||
// 判断是否存在层厚为5的序列,否则显示第一个检查的第一个序列
|
// 判断是否存在层厚为5的序列,否则显示第一个检查的第一个序列
|
||||||
const series = studyList[sIdx].SeriesList[0]
|
const series = studyList[sIdx].SeriesList[0]
|
||||||
var imageIdIndex = Math.floor(series.imageIds.length / 2) - 1
|
var imageIdIndex = series.imageIds.length > 1 ? Math.floor(series.imageIds.length / 2) - 1 : 0
|
||||||
obj.studyIndex = sIdx
|
obj.studyIndex = sIdx
|
||||||
obj.seriesIndex = 0
|
obj.seriesIndex = 0
|
||||||
obj.series = series
|
obj.series = series
|
||||||
obj.series.imageIdIndex = imageIdIndex
|
obj.series.imageIdIndex = imageIdIndex >= 0 ? imageIdIndex : 0
|
||||||
obj.seriesId = series.seriesId
|
obj.seriesId = series.seriesId
|
||||||
obj.isMarked = false
|
obj.isMarked = false
|
||||||
}
|
}
|
||||||
|
@ -495,31 +590,47 @@ export default {
|
||||||
},
|
},
|
||||||
showSeriesImage(studyIndex, seriesIndex, series) {
|
showSeriesImage(studyIndex, seriesIndex, series) {
|
||||||
if (series.isDicom) {
|
if (series.isDicom) {
|
||||||
this.studyIndex = studyIndex
|
if (series.modality === 'SR') {
|
||||||
this.seriesIndex = seriesIndex
|
this.studyIndex = studyIndex
|
||||||
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
this.seriesIndex = seriesIndex
|
||||||
var dicomStatck = this.studyList[studyIndex].SeriesList[seriesIndex]
|
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
||||||
this.$emit('loadImageStack', dicomStatck)
|
this.srDialogVisible = true
|
||||||
if (!series.loadStatus) {
|
this.srInfo = {
|
||||||
this.loopLoadStatus = -1
|
SubjectCode: series.studyCode,
|
||||||
series.isLoading = true
|
TaskBlindName: series.taskBlindName,
|
||||||
var p = parseInt(new Date().getTime())
|
SrList: series.instanceHtmlPathList
|
||||||
series.imageIds.map((imageId, i) => {
|
}
|
||||||
var priority = ''
|
} else {
|
||||||
if (i === 0) {
|
this.studyIndex = studyIndex
|
||||||
priority = parseInt(new Date().getTime()) * 10
|
this.seriesIndex = seriesIndex
|
||||||
} else {
|
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
||||||
priority = --p
|
var dicomStatck = this.studyList[studyIndex].SeriesList[seriesIndex]
|
||||||
}
|
this.$emit('loadImageStack', dicomStatck)
|
||||||
this.imageList.push({ imageId: imageId, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
if (!series.loadStatus && series.modality !== 'SR') {
|
||||||
})
|
this.loopLoadStatus = -1
|
||||||
if (this.imageList.length > 0) {
|
series.isLoading = true
|
||||||
this.loopLoadStatus = 0
|
var isAddToTakPool = false
|
||||||
this.loopLoad()
|
if (this.showSeriesList.includes(`${studyIndex}_${seriesIndex}`)) {
|
||||||
|
isAddToTakPool = true
|
||||||
|
} else {
|
||||||
|
this.showSeriesList.push(`${studyIndex}_${seriesIndex}`)
|
||||||
|
}
|
||||||
|
if (!isAddToTakPool) {
|
||||||
|
var priority = parseInt(new Date().getTime())
|
||||||
|
series.imageIds.map((imageId) => {
|
||||||
|
this.imageList.push({ imageId: imageId, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
|
})
|
||||||
|
if (this.imageList.length > 0) {
|
||||||
|
this.loopLoadStatus = 0
|
||||||
|
this.loopLoad()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
requestPoolManager.changePriority(series.seriesId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
DicomEvent.$emit('loadMeasurementList', { visitTaskId: this.visitTaskId, taskBlindName: this.taskBlindName })
|
DicomEvent.$emit('loadMeasurementList', { visitTaskId: this.visitTaskId, taskBlindName: this.taskBlindName })
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// 非Dicom预览
|
// 非Dicom预览
|
||||||
this.$emit('previewNoneDicoms', { visitTaskId: this.visitTaskId })
|
this.$emit('previewNoneDicoms', { visitTaskId: this.visitTaskId })
|
||||||
|
@ -564,40 +675,27 @@ export default {
|
||||||
this.loadImages(this.visitTaskList[idx])
|
this.loadImages(this.visitTaskList[idx])
|
||||||
store.dispatch('reading/setActiveSeries', series)
|
store.dispatch('reading/setActiveSeries', series)
|
||||||
},
|
},
|
||||||
loadImages1(taskInfo) {
|
|
||||||
var priority = taskInfo.IsCurrentTask ? parseInt(new Date().getTime()) : 999
|
|
||||||
|
|
||||||
this.studyList.map((study, studyIndex) => {
|
|
||||||
study.SeriesList.map((series, seriesIndex) => {
|
|
||||||
if (!series.loadStatus) {
|
|
||||||
var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
|
||||||
if (series.isBeMark || sliceThickness === 5 || series.instanceCount <= 100) {
|
|
||||||
series.imageIds.map(image => {
|
|
||||||
priority = priority - 1
|
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
this.loopLoad()
|
|
||||||
},
|
|
||||||
loadImages(taskInfo) {
|
loadImages(taskInfo) {
|
||||||
const isBaseLineTask = taskInfo.IsBaseLineTask
|
// const isBaseLineTask = taskInfo.IsBaseLineTask
|
||||||
const isCurrentTask = taskInfo.IsCurrentTask
|
const isCurrentTask = taskInfo.IsCurrentTask
|
||||||
// var priority = isCurrentTask ? parseInt(new Date().getTime()) : 999
|
// var priority = isCurrentTask ? parseInt(new Date().getTime()) : 999
|
||||||
var priority = parseInt(new Date().getTime())
|
var priority = parseInt(new Date().getTime())
|
||||||
this.studyList.map((study, studyIndex) => {
|
this.studyList.map((study, studyIndex) => {
|
||||||
study.SeriesList.map((series, seriesIndex) => {
|
study.SeriesList.map((series, seriesIndex) => {
|
||||||
if (!series.loadStatus && series.isDicom) {
|
if (!series.loadStatus && series.isDicom && series.modality !== 'SR') {
|
||||||
if (isCurrentTask || isBaseLineTask) {
|
// if (isCurrentTask || isBaseLineTask) {
|
||||||
// 当前任务/基线任务下载所有影像
|
// // 当前任务/基线任务下载所有影像
|
||||||
series.imageIds.map(image => {
|
// series.imageIds.map(image => {
|
||||||
priority = priority - 1
|
// this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
// })
|
||||||
})
|
// } else if (!isBaseLineTask && !isCurrentTask && study.IsCriticalSequence) {
|
||||||
} else if (!isBaseLineTask && !isCurrentTask && study.IsCriticalSequence) {
|
// // 非当前随访任务下载关键影像
|
||||||
// 非当前随访任务下载关键影像
|
// series.imageIds.map(image => {
|
||||||
|
// this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
// 均只下载关键序列
|
||||||
|
if (!isCurrentTask && study.IsCriticalSequence) {
|
||||||
series.imageIds.map(image => {
|
series.imageIds.map(image => {
|
||||||
priority = priority - 1
|
priority = priority - 1
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
|
@ -608,47 +706,16 @@ export default {
|
||||||
})
|
})
|
||||||
this.loopLoad()
|
this.loopLoad()
|
||||||
},
|
},
|
||||||
loadImages2(taskInfo) {
|
|
||||||
var priority = parseInt(new Date().getTime())
|
|
||||||
// 当前任务只自动下载层厚为5mm 或者影像数量小于 100张
|
|
||||||
if (taskInfo.IsCurrentTask) {
|
|
||||||
this.studyList.map((study, studyIndex) => {
|
|
||||||
study.SeriesList.map((series, seriesIndex) => {
|
|
||||||
var sliceThickness = isNaN(parseInt(series.sliceThickness)) ? null : parseInt(series.sliceThickness)
|
|
||||||
if (sliceThickness === 5 || series.instanceCount <= 100) {
|
|
||||||
series.imageIds.map(image => {
|
|
||||||
priority = priority - 1
|
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
this.loopLoad()
|
|
||||||
} else {
|
|
||||||
// 非当前任务只自动下载关键序列
|
|
||||||
var idx = this.studyList.findIndex(study => study.IsCriticalSequence)
|
|
||||||
if (idx === -1) return
|
|
||||||
|
|
||||||
this.studyList[idx].SeriesList.forEach((series, seriesIndex) => {
|
|
||||||
if (!series.loadStatus) {
|
|
||||||
series.imageIds.map(image => {
|
|
||||||
priority--
|
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: idx, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.loopLoad()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
loopLoad() {
|
loopLoad() {
|
||||||
if (this.imageList.length > 0) {
|
if (this.imageList.length > 0) {
|
||||||
requestPoolManager.startTaskTimer()
|
// requestPoolManager.startTaskTimer()
|
||||||
this.imageList.map(image => {
|
this.imageList.map(image => {
|
||||||
requestPoolManager.loadAndCacheImagePlus(image.imageId, image.seriesId, image.priority).then(res => {
|
requestPoolManager.loadAndCacheImagePlus(image.imageId, image.seriesId, image.priority).then(res => {
|
||||||
this.imageLoaded(image, res.data.string('x0020000e'))
|
this.imageLoaded(image, res.data.string('x0020000e'))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
requestPoolManager.sortTaskPool()
|
||||||
|
|
||||||
this.imageList = []
|
this.imageList = []
|
||||||
}
|
}
|
||||||
|
@ -658,15 +725,26 @@ export default {
|
||||||
console.log('loadSeries')
|
console.log('loadSeries')
|
||||||
this.loopLoadStatus = -1
|
this.loopLoadStatus = -1
|
||||||
this.$set(this.studyList[studyIndex].SeriesList[seriesIndex], 'isLoading', true)
|
this.$set(this.studyList[studyIndex].SeriesList[seriesIndex], 'isLoading', true)
|
||||||
const priority = parseInt(new Date().getTime())
|
var isAddToTakPool = false
|
||||||
series.imageIds.map(image => {
|
if (this.showSeriesList.includes(`${studyIndex}_${seriesIndex}`)) {
|
||||||
if (series.imageloadedArr.indexOf(image) === -1) {
|
isAddToTakPool = true
|
||||||
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
} else {
|
||||||
|
this.showSeriesList.push(`${studyIndex}_${seriesIndex}`)
|
||||||
|
}
|
||||||
|
if (!isAddToTakPool) {
|
||||||
|
const priority = parseInt(new Date().getTime())
|
||||||
|
series.imageIds.map(image => {
|
||||||
|
const index = this.cachedImages.findIndex(item => item.uri === image)
|
||||||
|
if (index === -1) {
|
||||||
|
this.imageList.push({ imageId: image, seriesId: series.seriesId, studyIndex: studyIndex, seriesIndex: seriesIndex, visitTaskId: series.visitTaskId, priority })
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (this.imageList.length > 0) {
|
||||||
|
this.loopLoadStatus = 0
|
||||||
|
this.loopLoad()
|
||||||
}
|
}
|
||||||
})
|
} else {
|
||||||
if (this.imageList.length > 0) {
|
requestPoolManager.changePriority(series.seriesId)
|
||||||
this.loopLoadStatus = 0
|
|
||||||
this.loopLoad()
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 暂停下载
|
// 暂停下载
|
||||||
|
@ -676,59 +754,94 @@ export default {
|
||||||
this.$set(this.studyList[studyIndex].SeriesList[seriesIndex], 'isLoading', false)
|
this.$set(this.studyList[studyIndex].SeriesList[seriesIndex], 'isLoading', false)
|
||||||
},
|
},
|
||||||
async imageLoaded(image, seriesUid) {
|
async imageLoaded(image, seriesUid) {
|
||||||
await store.dispatch('reading/updateStudyList', { visitTaskId: image.visitTaskId, imageId: image.imageId, seriesUid })
|
// await store.dispatch('reading/updateStudyList', { visitTaskId: image.visitTaskId, imageId: image.imageId, seriesUid })
|
||||||
|
// console.log(this.studyList[image.studyIndex].SeriesList[image.seriesIndex])
|
||||||
|
if (image.studyIndex > -1 && image.seriesIndex > -1) {
|
||||||
|
var prefetchInstanceCount = this.studyList[image.studyIndex].SeriesList[image.seriesIndex].prefetchInstanceCount
|
||||||
|
var instanceCount = this.studyList[image.studyIndex].SeriesList[image.seriesIndex].instanceCount
|
||||||
|
if (this.studyList[image.studyIndex].SeriesList[image.seriesIndex].imageloadedArr.indexOf(image.imageId) < 0) {
|
||||||
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].imageloadedArr.push(image.imageId)
|
||||||
|
prefetchInstanceCount = prefetchInstanceCount + 1
|
||||||
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].prefetchInstanceCount = prefetchInstanceCount
|
||||||
|
}
|
||||||
|
if (prefetchInstanceCount >= instanceCount) {
|
||||||
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].prefetchInstanceCount = this.studyList[image.studyIndex].SeriesList[image.seriesIndex].instanceCount
|
||||||
|
// 设置当前序列状态为已下载完成
|
||||||
|
this.studyList[image.studyIndex].SeriesList[image.seriesIndex].loadStatus = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// store.dispatch('reading/updateSeriesList', { visitTaskindex: this.visitTaskIdx, studyIndex: image.studyIndex, seriesIndex: image.seriesIndex, imageId: image.imageId })
|
||||||
},
|
},
|
||||||
// instance下载成功回调
|
// instance下载成功回调
|
||||||
async cornerstoneImageLoaded(e) {
|
async cornerstoneImageLoaded(e) {
|
||||||
await store.dispatch('reading/updateStudyList', { visitTaskId: this.visitTaskId, imageId: e.detail.image.imageId, seriesUid: e.detail.image.data.string('x0020000e') })
|
// var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
||||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.visitTaskId)
|
// if (idx === -1) return
|
||||||
this.studyList = this.visitTaskList[idx].StudyList
|
// this.studyList = this.visitTaskList[idx].StudyList
|
||||||
if (!this.studyList || this.studyList.length === 0) {
|
// if (!this.studyList || this.studyList.length === 0) {
|
||||||
return
|
// return
|
||||||
}
|
// }
|
||||||
const uri = e.detail.image.sharedCacheKey
|
// if (!this.visitTaskList[idx].IsInit) {
|
||||||
const index = this.cachedImages.findIndex(item => item.uri === uri)
|
// const loading = this.$loading({ fullscreen: true })
|
||||||
if (index === -1) {
|
// await store.dispatch('reading/getMeasuredData', this.visitTaskList[idx].VisitTaskId)
|
||||||
this.cachedImages.push({ uri: uri, timestamp: new Date().getTime() })
|
// await store.dispatch('reading/getStudyInfo', { trialId: this.trialId, subjectVisitId: this.visitTaskList[idx].VisitId, visitTaskId: this.visitTaskList[idx].VisitTaskId, taskBlindName: this.visitTaskList[idx].TaskBlindName })
|
||||||
} else {
|
// await store.dispatch('reading/getReadingQuestionAndAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[idx].VisitTaskId })
|
||||||
this.cachedImages[index].timestamp = new Date().getTime()
|
// await store.dispatch('reading/getDicomReadingQuestionAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[idx].VisitTaskId })
|
||||||
}
|
// await store.dispatch('reading/setStatus', { visitTaskId: this.visitTaskList[idx].VisitTaskId })
|
||||||
var imageId = e.detail.image.imageId
|
// loading.close()
|
||||||
var seriesUid = e.detail.image.data.string('x0020000e')
|
// }
|
||||||
var studyIndex = -1
|
// await store.dispatch('reading/updateStudyList', { visitTaskId: this.visitTaskId, imageId: e.detail.image.imageId, seriesUid: e.detail.image.data.string('x0020000e') })
|
||||||
var seriesIndex = -1
|
// const uri = e.detail.image.sharedCacheKey
|
||||||
for (let i = 0; i < this.studyList.length; ++i) {
|
// const index = this.cachedImages.findIndex(item => item.uri === uri)
|
||||||
for (let j = 0; j < this.studyList[i].SeriesList.length; ++j) {
|
// if (index === -1) {
|
||||||
if (this.studyList[i].SeriesList[j].seriesUid === seriesUid) {
|
// this.cachedImages.push({ uri: uri, timestamp: new Date().getTime() })
|
||||||
studyIndex = i
|
// } else {
|
||||||
seriesIndex = j
|
// this.cachedImages[index].timestamp = new Date().getTime()
|
||||||
break
|
// }
|
||||||
}
|
// var imageId = e.detail.image.imageId
|
||||||
}
|
// var seriesUid = e.detail.image.data.string('x0020000e')
|
||||||
if (studyIndex > 0) break
|
// var studyIndex = -1
|
||||||
}
|
// var seriesIndex = -1
|
||||||
if (seriesIndex < 0) return
|
// for (let i = 0; i < this.studyList.length; ++i) {
|
||||||
|
// for (let j = 0; j < this.studyList[i].SeriesList.length; ++j) {
|
||||||
|
// if (this.studyList[i].SeriesList[j].seriesUid === seriesUid) {
|
||||||
|
// studyIndex = i
|
||||||
|
// seriesIndex = j
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (studyIndex > 0) break
|
||||||
|
// }
|
||||||
|
// if (seriesIndex < 0) return
|
||||||
|
|
||||||
const imageIdIndex = this.studyList[studyIndex].SeriesList[seriesIndex].imageIds.indexOf(imageId)
|
// const imageIdIndex = this.studyList[studyIndex].SeriesList[seriesIndex].imageIds.indexOf(imageId)
|
||||||
if (imageIdIndex < 0) return
|
// if (imageIdIndex < 0) return
|
||||||
if (this.studyList[studyIndex].SeriesList[seriesIndex].imageloadedArr.indexOf(imageId) < 0) {
|
// if (this.studyList[studyIndex].SeriesList[seriesIndex].imageloadedArr.indexOf(imageId) < 0) {
|
||||||
if (this.studyList[studyIndex].SeriesList[seriesIndex].prefetchInstanceCount >= this.studyList[studyIndex].SeriesList[seriesIndex].instanceCount) {
|
// if (this.studyList[studyIndex].SeriesList[seriesIndex].prefetchInstanceCount >= this.studyList[studyIndex].SeriesList[seriesIndex].instanceCount) {
|
||||||
// 设置当前序列状态为已下载完成
|
// // 设置当前序列状态为已下载完成
|
||||||
this.studyList[studyIndex].SeriesList[seriesIndex].loadStatus = true
|
// this.studyList[studyIndex].SeriesList[seriesIndex].loadStatus = true
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
},
|
||||||
|
cornerstoneimagecachechanged(e) {
|
||||||
|
const cacheInfo = cornerstone.imageCache.getCacheInfo()
|
||||||
|
console.log(cacheInfo)
|
||||||
|
},
|
||||||
|
cornerstoneimagecachefull(e) {
|
||||||
|
console.log('超过内存了')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.study-wrapper{
|
.study-wrapper{
|
||||||
>>>.el-progress-bar__inner{
|
/deep/ .el-progress-bar__inner{
|
||||||
transition: width 0s ease;
|
transition: width 0s ease;
|
||||||
}
|
}
|
||||||
width:100%;
|
width:100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
.dicom-desc{
|
.dicom-desc{
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
|
@ -745,7 +858,7 @@ export default {
|
||||||
background-color: #607d8b!important;
|
background-color: #607d8b!important;
|
||||||
border: 1px solid #607d8b!important;
|
border: 1px solid #607d8b!important;
|
||||||
}
|
}
|
||||||
>>>.el-progress__text{
|
/deep/.el-progress__text{
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
@ -782,7 +895,7 @@ export default {
|
||||||
.image-desc {
|
.image-desc {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
p{
|
p{
|
||||||
width: 100px;
|
width: 95px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
|
@ -791,7 +904,10 @@ export default {
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
div{
|
div{
|
||||||
width: 100px;
|
width: 95px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -811,18 +927,18 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.el-collapse{
|
/deep/.el-collapse{
|
||||||
border: none;
|
border: none;
|
||||||
>>>.el-collapse-item{
|
.el-collapse-item{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__content{
|
.el-collapse-item__content{
|
||||||
padding-bottom:10px;
|
padding-bottom:5px;
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
}
|
}
|
||||||
>>>.el-collapse-item__header{
|
.el-collapse-item__header{
|
||||||
background-color: #000!important;
|
background-color: #000!important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border-bottom-color:#5a5a5a;
|
border-bottom-color:#5a5a5a;
|
||||||
|
@ -831,5 +947,33 @@ export default {
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.sr-wrapper{
|
||||||
|
/deep/.el-dialog{
|
||||||
|
background: #fff !important;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
// color: #ddd;
|
||||||
|
.el-dialog__title{
|
||||||
|
color:#fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/deep/.sr-dialog-container{
|
||||||
|
margin-top: 50px !important;
|
||||||
|
width:75%;
|
||||||
|
height:80%;
|
||||||
|
}
|
||||||
|
/deep/.el-dialog__body{
|
||||||
|
padding: 10px;
|
||||||
|
height: calc(100% - 50px);
|
||||||
|
}
|
||||||
|
.el-dialog__header{
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.sr-full-dialog-container{
|
||||||
|
/deep/.is-fullscreen .el-dialog__body{
|
||||||
|
height: calc(100% - 50px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -117,7 +117,7 @@ export default {
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.wl-container {
|
.wl-container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
// >>>.el-table{
|
// /deep/ .el-table{
|
||||||
// background-color: #1e1e1e !important;
|
// background-color: #1e1e1e !important;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
@ -141,7 +141,7 @@ export default {
|
||||||
background-color: #1e1e1e !important;
|
background-color: #1e1e1e !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// >>>.el-table th,.el-table tr{
|
// /deep/ .el-table th,.el-table tr{
|
||||||
// background-color: #1e1e1e !important;
|
// background-color: #1e1e1e !important;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
|
@ -118,11 +118,9 @@
|
||||||
:visit-task-id="cdVisitTaskId"
|
:visit-task-id="cdVisitTaskId"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<span v-if="!closeCDVisible" slot="footer" class="dialog-footer">
|
||||||
<span slot="footer" class="dialog-footer">
|
|
||||||
<!-- 确认 -->
|
<!-- 确认 -->
|
||||||
<el-button type="primary" @click="handleReturnCD">{{$t('trials:medicalFeedback:title:feedback')}}</el-button>
|
<el-button type="primary" @click="handleConfirmCD">{{ $t('trials:reading:button:confirm') }}</el-button>
|
||||||
<el-button v-if="!closeCDVisible" type="primary" @click="handleConfirmCD">{{ $t('trials:reading:button:confirm') }}</el-button>
|
|
||||||
</span>
|
</span>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
|
@ -139,7 +137,7 @@
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<!-- 您确定当前访视的整体评估结果为PD。根据《独立影像评估章程》,该访视进入iRECIST阅片环节。请对新病灶进行重新评估: -->
|
<!-- 您确定当前访视的整体评估结果为PD。根据《独立影像评估章程》,该访视进入iRECIST阅片环节。请对新病灶进行重新评估: -->
|
||||||
{{ $t('trials:iRecist:warnning:msg45').replace('***', criterionName) }}
|
{{ $t('trials:iRecist:warnning:msg45') }}
|
||||||
</div>
|
</div>
|
||||||
<div style="color: #f44336;font-size: 12px;margin: 5px;">
|
<div style="color: #f44336;font-size: 12px;margin: 5px;">
|
||||||
<!-- (1)新病灶可转为:新靶病灶、新非靶病灶、其它既往新病灶。 -->
|
<!-- (1)新病灶可转为:新靶病灶、新非靶病灶、其它既往新病灶。 -->
|
||||||
|
@ -164,73 +162,11 @@
|
||||||
<el-button type="primary" @click="tipVisible = false">{{ $t('trials:reading:button:confirm') }}</el-button>
|
<el-button type="primary" @click="tipVisible = false">{{ $t('trials:reading:button:confirm') }}</el-button>
|
||||||
</span>
|
</span>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
<el-dialog
|
|
||||||
:visible.sync="returnCDVisible"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
width="500px"
|
|
||||||
>
|
|
||||||
<span slot="title" class="dialog-footer">
|
|
||||||
临床资料反馈({{subjectCode}}|{{ taskBlindName }})
|
|
||||||
</span>
|
|
||||||
<div>
|
|
||||||
<el-form ref="questions"
|
|
||||||
:model="form">
|
|
||||||
<el-form-item label-width="100px" label="请说明" prop="content">
|
|
||||||
<el-input type="textarea"
|
|
||||||
v-model="form.content"
|
|
||||||
:autosize="{ minRows: 2, maxRows: 4}">
|
|
||||||
</el-input>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<div style="padding-left:100px;font-size: 12px;color:#f66;margin-bottom: 10px">
|
|
||||||
<span class="el-icon-info"></span>提交后您的反馈会以邮件形式通知CRC、CRA及PM
|
|
||||||
</div>
|
|
||||||
<span @click="returnHistory" style="padding-left:100px;padding-top:10px;text-decoration: underline;color:#409eff;font-size: 12px;cursor: pointer">
|
|
||||||
反馈历史
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<span slot="footer" class="dialog-footer">
|
|
||||||
<!-- 确认 -->
|
|
||||||
<el-button type="primary" @click="addClinicalDataDialog">发送</el-button>
|
|
||||||
</span>
|
|
||||||
</el-dialog>
|
|
||||||
<el-dialog
|
|
||||||
:visible.sync="historyVisible"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
width="600px"
|
|
||||||
>
|
|
||||||
<span slot="title" class="dialog-footer">
|
|
||||||
反馈历史({{subjectCode}}|{{ taskBlindName }})
|
|
||||||
</span>
|
|
||||||
<div>
|
|
||||||
<el-table
|
|
||||||
ref="filesTable"
|
|
||||||
:data="tableList"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
type="index"
|
|
||||||
width="50"
|
|
||||||
/>
|
|
||||||
<el-table-column
|
|
||||||
prop="Content"
|
|
||||||
label="内容"
|
|
||||||
/>
|
|
||||||
<el-table-column
|
|
||||||
prop="CreateTime"
|
|
||||||
label="提交时间"
|
|
||||||
width="180"
|
|
||||||
/>
|
|
||||||
</el-table>
|
|
||||||
</div>
|
|
||||||
<span slot="footer" class="dialog-footer">
|
|
||||||
<!-- 确认 -->
|
|
||||||
<el-button type="primary" @click="historyVisible = false">关闭</el-button>
|
|
||||||
</span>
|
|
||||||
</el-dialog>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getNextTask, readClinicalData, verifyDefaultQuestionBeAnswer, addClinicalDataDialog, getClinicalDataDialog } from '@/api/trials'
|
import { getNextTask, readClinicalData, verifyDefaultQuestionBeAnswer } from '@/api/trials'
|
||||||
import ReadPage from './components/ReadPage'
|
import ReadPage from './components/ReadPage'
|
||||||
import CustomizeReadPage from './customize/CustomizeReadPage'
|
import CustomizeReadPage from './customize/CustomizeReadPage'
|
||||||
import ReportPage from './components/ReportPage'
|
import ReportPage from './components/ReportPage'
|
||||||
|
@ -243,6 +179,7 @@ import DicomEvent from './components/DicomEvent'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { getToken } from '@/utils/auth'
|
import { getToken } from '@/utils/auth'
|
||||||
import { changeURLStatic } from '@/utils/history.js'
|
import { changeURLStatic } from '@/utils/history.js'
|
||||||
|
import requestPoolManager from '@/utils/request-pool'
|
||||||
export default {
|
export default {
|
||||||
name: 'Reading',
|
name: 'Reading',
|
||||||
components: {
|
components: {
|
||||||
|
@ -257,6 +194,7 @@ export default {
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
isClinicalDataShow: false,
|
||||||
activeName: '',
|
activeName: '',
|
||||||
tabs: [],
|
tabs: [],
|
||||||
trialId: '',
|
trialId: '',
|
||||||
|
@ -287,17 +225,12 @@ export default {
|
||||||
isFullscreen: false,
|
isFullscreen: false,
|
||||||
tipVisible: false,
|
tipVisible: false,
|
||||||
closeCDVisible: false,
|
closeCDVisible: false,
|
||||||
criterionName: this.$route.query.criterionName,
|
cdVisitTaskId: ''
|
||||||
returnCDVisible: false,
|
|
||||||
taskBlindName: null,
|
|
||||||
historyVisible: false,
|
|
||||||
tableList: [],
|
|
||||||
form: {
|
|
||||||
content: ''
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
requestPoolManager.resetRequestPool()
|
||||||
|
requestPoolManager.setSortType(0)
|
||||||
DicomEvent.$on('questionFormChange', (v) => {
|
DicomEvent.$on('questionFormChange', (v) => {
|
||||||
if (this.questionFormChangeNum !== 0) {
|
if (this.questionFormChangeNum !== 0) {
|
||||||
this.questionFormChangeState = v
|
this.questionFormChangeState = v
|
||||||
|
@ -349,31 +282,11 @@ export default {
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
DicomEvent.$off('getNextTask')
|
DicomEvent.$off('getNextTask')
|
||||||
DicomEvent.$emit('resetOpenWindow')
|
|
||||||
DicomEvent.$off('previewCD')
|
DicomEvent.$off('previewCD')
|
||||||
|
DicomEvent.$emit('resetOpenWindow')
|
||||||
window.removeEventListener('beforeunload', this.handleWindowClose)
|
window.removeEventListener('beforeunload', this.handleWindowClose)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
returnHistory() {
|
|
||||||
this.historyVisible = true
|
|
||||||
getClinicalDataDialog(this.visitTaskId).then(res => {
|
|
||||||
this.tableList = res.Result
|
|
||||||
})
|
|
||||||
},
|
|
||||||
addClinicalDataDialog() {
|
|
||||||
if (!this.form.content) {
|
|
||||||
this.$message.error('请说明情况!')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
addClinicalDataDialog(this.visitTaskId, this.form.content).then(res => {
|
|
||||||
this.$message.success('反馈成功')
|
|
||||||
this.form.content = ''
|
|
||||||
this.returnCDVisible = false
|
|
||||||
})
|
|
||||||
},
|
|
||||||
handleReturnCD() {
|
|
||||||
this.returnCDVisible = true
|
|
||||||
},
|
|
||||||
getTaskInfo(flag = 0) {
|
getTaskInfo(flag = 0) {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
var param = {
|
var param = {
|
||||||
|
@ -386,20 +299,19 @@ export default {
|
||||||
|
|
||||||
getNextTask(param).then(async res => {
|
getNextTask(param).then(async res => {
|
||||||
this.isShow = false
|
this.isShow = false
|
||||||
if (res.Result.ReadingTaskState !== 2) {
|
|
||||||
window.opener.postMessage('refreshTaskList', window.location)
|
|
||||||
}
|
|
||||||
this.visitTaskId = res.Result.VisitTaskId
|
this.visitTaskId = res.Result.VisitTaskId
|
||||||
// DicomEvent.$emit('getCustomTableQuestionAnswer', res.Result.VisitTaskId)
|
// DicomEvent.$emit('getCustomTableQuestionAnswer', res.Result.VisitTaskId)
|
||||||
if (this.subjectId !== res.Result.SubjectId) {
|
if (this.subjectId !== res.Result.SubjectId) {
|
||||||
store.dispatch('reading/resetVisitTasks')
|
store.dispatch('reading/resetVisitTasks')
|
||||||
var token = getToken()
|
var token = getToken()
|
||||||
window.location.href = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${res.Result.SubjectCode}&subjectId=${res.Result.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}&isNewSubject=1`
|
window.location.href = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${res.Result.SubjectCode}&subjectId=${res.Result.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}&isNewSubject=1`
|
||||||
|
return
|
||||||
} else if (!this.isReadingTaskViewInOrder || res.Result.ReadingCategory !== 1) {
|
} else if (!this.isReadingTaskViewInOrder || res.Result.ReadingCategory !== 1) {
|
||||||
store.dispatch('reading/resetVisitTasks')
|
store.dispatch('reading/resetVisitTasks')
|
||||||
if (this.firstTaskReadingCategory) {
|
if (this.firstTaskReadingCategory) {
|
||||||
const token = getToken()
|
const token = getToken()
|
||||||
window.location.href = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${res.Result.SubjectCode}&subjectId=${res.Result.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
window.location.href = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${res.Result.SubjectCode}&subjectId=${res.Result.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.subjectId = res.Result.SubjectId
|
this.subjectId = res.Result.SubjectId
|
||||||
|
@ -423,6 +335,7 @@ export default {
|
||||||
if (this.isExistsClinicalData && this.isNeedReadClinicalData && !this.isReadClinicalData) {
|
if (this.isExistsClinicalData && this.isNeedReadClinicalData && !this.isReadClinicalData) {
|
||||||
this.isFullscreen = false
|
this.isFullscreen = false
|
||||||
this.dialogVisible = true
|
this.dialogVisible = true
|
||||||
|
this.cdVisitTaskId = this.visitTaskId
|
||||||
}
|
}
|
||||||
if (res.Result.ReadingCategory === 1) {
|
if (res.Result.ReadingCategory === 1) {
|
||||||
this.activeName = 'read'
|
this.activeName = 'read'
|
||||||
|
@ -437,7 +350,6 @@ export default {
|
||||||
DicomEvent.$emit('resetOpenWindow')
|
DicomEvent.$emit('resetOpenWindow')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.isShow = true
|
this.isShow = true
|
||||||
this.loading = false
|
this.loading = false
|
||||||
|
@ -453,14 +365,12 @@ export default {
|
||||||
beforeLeaveCustomize(activeName, oldActiveName) {
|
beforeLeaveCustomize(activeName, oldActiveName) {
|
||||||
if (oldActiveName === 'read') {
|
if (oldActiveName === 'read') {
|
||||||
this.isShow = true
|
this.isShow = true
|
||||||
this.tabs.push(activeName)
|
|
||||||
DicomEvent.$emit('getReportInfo', true)
|
DicomEvent.$emit('getReportInfo', true)
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.$refs.reportPage.setScrollTop(1)
|
this.$refs.reportPage.setScrollTop(1)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
this.tabs.push(activeName)
|
this.isShow = false
|
||||||
// this.isShow = false
|
|
||||||
}
|
}
|
||||||
return Promise.resolve(true)
|
return Promise.resolve(true)
|
||||||
},
|
},
|
||||||
|
@ -582,7 +492,7 @@ export default {
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
>>>.el-message-box__headerbtn{
|
/deep/.el-message-box__headerbtn{
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.dicom-container{
|
.dicom-container{
|
||||||
|
@ -592,7 +502,7 @@ export default {
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
.el-tabs{
|
/deep/.el-tabs{
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -600,38 +510,38 @@ export default {
|
||||||
.el-tabs__item{
|
.el-tabs__item{
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__header{
|
.el-tabs__header{
|
||||||
height: 50px;
|
height: 50px;
|
||||||
margin:0px;
|
margin:0px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__content{
|
.el-tabs__content{
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin:0px;
|
margin:0px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__item{
|
.el-tabs__item{
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
>>>.el-tab-pane{
|
.el-tab-pane{
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
>>>.hot-keys-label{
|
/deep/.hot-keys-label{
|
||||||
color: #dfdfdf !important;
|
color: #dfdfdf !important;
|
||||||
}
|
}
|
||||||
>>>.shortcut-key-input span{
|
/deep/.shortcut-key-input span{
|
||||||
color: #dfdfdf !important;
|
color: #dfdfdf !important;
|
||||||
}
|
}
|
||||||
// >>>.el-dialog{
|
// /deep/ .el-dialog{
|
||||||
// background: #1e1e1e;
|
// background: #1e1e1e;
|
||||||
// >>>.el-dialog__body{
|
// /deep/ .el-dialog__body{
|
||||||
// padding: 10px;
|
// padding: 10px;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// }
|
// }
|
||||||
>>>.el-dialog{
|
/deep/.el-dialog{
|
||||||
background: #1e1e1e;
|
background: #1e1e1e;
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
@ -652,13 +562,13 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
>>>.dialog-container{
|
/deep/.dialog-container{
|
||||||
margin-top: 50px !important;
|
margin-top: 50px !important;
|
||||||
width:75%;
|
width:75%;
|
||||||
height:80%;
|
height:80%;
|
||||||
}
|
}
|
||||||
>>>.el-dialog__body{
|
/deep/.el-dialog__body{
|
||||||
padding: 10px;
|
padding: 20px;
|
||||||
height: calc(100% - 120px);
|
height: calc(100% - 120px);
|
||||||
}
|
}
|
||||||
.el-dialog__header{
|
.el-dialog__header{
|
||||||
|
@ -667,7 +577,7 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
.full-dialog-container{
|
.full-dialog-container{
|
||||||
>>>.is-fullscreen .el-dialog__body{
|
/deep/.is-fullscreen .el-dialog__body{
|
||||||
height: calc(100% - 120px);
|
height: calc(100% - 120px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -209,7 +209,7 @@ export default {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
}
|
}
|
||||||
>>>.el-card__body{
|
/deep/ .el-card__body{
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,7 +223,7 @@ export default {
|
||||||
width:240px;
|
width:240px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
>>>.el-card__body{
|
/deep/ .el-card__body{
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -242,18 +242,18 @@ export default {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
>>>.el-tabs{
|
/deep/ .el-tabs{
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display:flex;
|
display:flex;
|
||||||
|
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__header{
|
/deep/ .el-tabs__header{
|
||||||
height: 40px;
|
height: 40px;
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
>>>.el-tabs__content{
|
/deep/ .el-tabs__content{
|
||||||
flex: 1;
|
flex: 1;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
|
@ -285,7 +285,7 @@ export default {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
>>>.el-card__body{
|
/deep/ .el-card__body{
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ const name = defaultSettings.title || 'HIRS' // page title
|
||||||
|
|
||||||
// eslint-disable-next-line no-undef
|
// eslint-disable-next-line no-undef
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
transpileDependencies: ['minio'],
|
||||||
publicPath: process.env.NODE_ENV === 'development' || process.env.VUE_APP_OSS_CONFIG_BUCKET === 'zyypacs-usa' ? process.env.VUE_APP_BASE_PATH : `${process.env.VUE_FILE_PATH}${process.env.VUE_APP_OSS_PATH}${distDate}/`,
|
publicPath: process.env.NODE_ENV === 'development' || process.env.VUE_APP_OSS_CONFIG_BUCKET === 'zyypacs-usa' ? process.env.VUE_APP_BASE_PATH : `${process.env.VUE_FILE_PATH}${process.env.VUE_APP_OSS_PATH}${distDate}/`,
|
||||||
outputDir: 'dist',
|
outputDir: 'dist',
|
||||||
assetsDir: 'static',
|
assetsDir: 'static',
|
||||||
|
|
Loading…
Reference in New Issue