多帧影像质控更改
continuous-integration/drone/push Build encountered an error
Details
continuous-integration/drone/push Build encountered an error
Details
parent
5dbddbea57
commit
efb88b7ad1
|
@ -1081,6 +1081,13 @@ export function setSeriesStatus(trialId, subjectVisitId, studyId, seriesId, stat
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function setInstanceStatus(trialId, subjectVisitId, seriesId, instanceId, state) {
|
||||||
|
return request({
|
||||||
|
url: `/QCOperation/setInstanceState/${trialId}/${subjectVisitId}/${seriesId}/${instanceId}/${state}`,
|
||||||
|
method: 'put'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function getVisitQCStudyAndSeriesList(subjectVisitId) {
|
export function getVisitQCStudyAndSeriesList(subjectVisitId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/QCList/getVisitQCStudyAndSeriesList/${subjectVisitId}`,
|
url: `/QCList/getVisitQCStudyAndSeriesList/${subjectVisitId}`,
|
||||||
|
|
|
@ -52,10 +52,14 @@
|
||||||
</div>
|
</div>
|
||||||
<div v-if="item.isExistMutiFrames && item.instanceCount > 1">
|
<div v-if="item.isExistMutiFrames && item.instanceCount > 1">
|
||||||
<el-popover
|
<el-popover
|
||||||
|
v-model="visible"
|
||||||
placement="right"
|
placement="right"
|
||||||
trigger="hover"
|
trigger="manual"
|
||||||
popper-class="instance_frame_wrapper"
|
popper-class="instance_frame_wrapper"
|
||||||
>
|
>
|
||||||
|
<div style="text-align: right;">
|
||||||
|
<i class="el-icon-circle-close" style="font-size: 20px;cursor: pointer;color:#ddd;" @click="visible = false" />
|
||||||
|
</div>
|
||||||
<div class="frame_list">
|
<div class="frame_list">
|
||||||
<div
|
<div
|
||||||
v-for="(instance, idx) in item.instanceInfoList"
|
v-for="(instance, idx) in item.instanceInfoList"
|
||||||
|
@ -66,11 +70,27 @@
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<div>{{ instance.InstanceNumber }}</div>
|
<div>{{ instance.InstanceNumber }}</div>
|
||||||
<div>{{ `${instance.NumberOfFrames > 0 ? instance.NumberOfFrames : 1} frame` }}</div>
|
<div>
|
||||||
|
{{ `${instance.NumberOfFrames > 0 ? instance.NumberOfFrames : 1} frame` }}
|
||||||
|
</div>
|
||||||
|
<div v-if="showDelete">
|
||||||
|
<span>{{ $t('trials:audit:table:isDelete') }}</span>
|
||||||
|
<el-switch
|
||||||
|
v-model="instance.IsDeleted"
|
||||||
|
size="mini"
|
||||||
|
@change="changeInstanceDeleteStatus($event, item, instance)"
|
||||||
|
/>
|
||||||
|
<span style="margin-left:10px;">{{ $t('trials:audit:table:isReading') }}</span>
|
||||||
|
<el-switch
|
||||||
|
v-model="instance.IsReading"
|
||||||
|
size="mini"
|
||||||
|
@change="changeInstanceReadingStatus($event, item, instance)"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<i slot="reference" class="el-icon-connection" style="font-size: 15px;cursor: pointer;" />
|
</div>
|
||||||
|
<i slot="reference" class="el-icon-connection" style="font-size: 15px;cursor: pointer;" @click="visible = !visible" />
|
||||||
</el-popover>
|
</el-popover>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -138,13 +158,13 @@ import * as cornerstone from 'cornerstone-core'
|
||||||
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
||||||
import dicomViewer from '@/components/Dicom/DicomViewer'
|
import dicomViewer from '@/components/Dicom/DicomViewer'
|
||||||
import { getStudyInfo, getSeriesList } from '@/api/reading'
|
import { getStudyInfo, getSeriesList } from '@/api/reading'
|
||||||
import { getInstanceList, getPatientSeriesList, setSeriesStatus } from '@/api/trials'
|
import { getInstanceList, getPatientSeriesList, setSeriesStatus, setInstanceStatus } from '@/api/trials'
|
||||||
|
|
||||||
import requestPoolManager from '@/utils/request-pool'
|
import requestPoolManager from '@/utils/request-pool'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { changeURLStatic } from '@/utils/history.js'
|
import { changeURLStatic } from '@/utils/history.js'
|
||||||
import metaDataProvider from '@/utils/metaDataProvider'
|
import metaDataProvider from '@/utils/metaDataProvider'
|
||||||
cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 });
|
cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 })
|
||||||
var config = {
|
var config = {
|
||||||
maxWebWorkers: 4,
|
maxWebWorkers: 4,
|
||||||
startWebWorkersOnDemand: true,
|
startWebWorkersOnDemand: true,
|
||||||
|
@ -196,7 +216,8 @@ export default {
|
||||||
imageList: [],
|
imageList: [],
|
||||||
showSeriesList: [],
|
showSeriesList: [],
|
||||||
currentLoadIns: [],
|
currentLoadIns: [],
|
||||||
isFromCRCUpload: false
|
isFromCRCUpload: false,
|
||||||
|
visible: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created: function() {
|
created: function() {
|
||||||
|
@ -384,8 +405,8 @@ export default {
|
||||||
if (!res.Result || (res.Result && res.Result.length === 0)) return
|
if (!res.Result || (res.Result && res.Result.length === 0)) return
|
||||||
var seriesInstanceUid = res.Result[0].SeriesInstanceUid
|
var seriesInstanceUid = res.Result[0].SeriesInstanceUid
|
||||||
var sliceThickness = res.Result[0].SliceThickness
|
var sliceThickness = res.Result[0].SliceThickness
|
||||||
var isReading = res.Result[0].IsReading
|
var isReading = res.OtherInfo.IsReading
|
||||||
var isDeleted = res.Result[0].IsDeleted
|
var isDeleted = res.OtherInfo.IsDeleted
|
||||||
var seriesList = []
|
var seriesList = []
|
||||||
var imageIds = []
|
var imageIds = []
|
||||||
let isExistMutiFrames = false
|
let isExistMutiFrames = false
|
||||||
|
@ -403,7 +424,7 @@ export default {
|
||||||
imageIds.push(path)
|
imageIds.push(path)
|
||||||
imageId = path
|
imageId = path
|
||||||
}
|
}
|
||||||
instanceInfoList.push({ Id: instance.Id, InstanceNumber: instance.InstanceNumber, NumberOfFrames: instance.NumberOfFrames, Path: instance.Path, ImageId: imageId })
|
instanceInfoList.push({ Id: instance.Id, InstanceNumber: instance.InstanceNumber, NumberOfFrames: instance.NumberOfFrames, Path: instance.Path, ImageId: imageId, IsDeleted: instance.IsDeleted, IsReading: instance.IsReading })
|
||||||
})
|
})
|
||||||
seriesList.push({
|
seriesList.push({
|
||||||
trialId,
|
trialId,
|
||||||
|
@ -671,6 +692,73 @@ export default {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
async changeInstanceReadingStatus(callback, series, instance) {
|
||||||
|
let statusStr = ''
|
||||||
|
if (callback) {
|
||||||
|
statusStr = this.$t('trials:audit:label:setSeriesReading')
|
||||||
|
instance.IsReading = false
|
||||||
|
} else {
|
||||||
|
statusStr = this.$t('trials:audit:label:setSeriesNotReading')
|
||||||
|
instance.IsReading = true
|
||||||
|
}
|
||||||
|
var message = this.$t('trials:audit:message:changeSeriesStatus').replace('xxx', statusStr)
|
||||||
|
message = message.replace('yyy', this.$fd('YesOrNo', !instance.IsReading))
|
||||||
|
const confirm = await this.$confirm(
|
||||||
|
message,
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (confirm !== 'confirm') return
|
||||||
|
const state = instance.IsReading ? 1 : 2
|
||||||
|
this.loading = true
|
||||||
|
try {
|
||||||
|
const res = await setInstanceStatus(series.trialId, series.subjectVisitId, series.seriesId, instance.Id, state)
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
instance.IsReading = !instance.IsReading
|
||||||
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
|
window.opener.postMessage({ type: 'refreshSeriesList', data: '' }, window.location)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async changeInstanceDeleteStatus(callback, series, instance) {
|
||||||
|
let statusStr = ''
|
||||||
|
if (callback) {
|
||||||
|
statusStr = this.$t('trials:audit:label:setSeriesDeleted')
|
||||||
|
instance.IsDeleted = false
|
||||||
|
} else {
|
||||||
|
statusStr = this.$t('trials:audit:label:setSeriesNotDelete')
|
||||||
|
instance.IsDeleted = true
|
||||||
|
}
|
||||||
|
var message = this.$t('trials:audit:message:changeSeriesStatus').replace('xxx', statusStr)
|
||||||
|
message = message.replace('yyy', this.$fd('YesOrNo', !instance.IsDeleted))
|
||||||
|
const confirm = await this.$confirm(
|
||||||
|
message,
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (confirm !== 'confirm') return
|
||||||
|
|
||||||
|
const state = instance.IsDeleted ? 5 : 4
|
||||||
|
this.loading = true
|
||||||
|
try {
|
||||||
|
const res = await setInstanceStatus(series.trialId, series.subjectVisitId, series.seriesId, instance.Id, state)
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
instance.IsDeleted = !instance.IsDeleted
|
||||||
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
|
window.opener.postMessage({ type: 'refreshSeriesList', data: '' }, window.location)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
loadAllImages() {
|
loadAllImages() {
|
||||||
const seriesIndex = this.seriesList.findIndex(i => i.loadStatus === false)
|
const seriesIndex = this.seriesList.findIndex(i => i.loadStatus === false)
|
||||||
if (seriesIndex === -1) return
|
if (seriesIndex === -1) return
|
||||||
|
@ -948,8 +1036,8 @@ export default {
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
}
|
}
|
||||||
.frame_content{
|
.frame_content{
|
||||||
height: 50px;
|
/* height: 50px; */
|
||||||
padding: 5px;
|
padding: 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
|
@ -59,10 +59,15 @@
|
||||||
<div>#{{ series.seriesNumber }}</div>
|
<div>#{{ series.seriesNumber }}</div>
|
||||||
<div v-if="series.isExistMutiFrames && series.instanceCount > 1">
|
<div v-if="series.isExistMutiFrames && series.instanceCount > 1">
|
||||||
<el-popover
|
<el-popover
|
||||||
|
v-model="visible"
|
||||||
placement="right"
|
placement="right"
|
||||||
trigger="hover"
|
trigger="manual"
|
||||||
popper-class="instance_frame_wrapper"
|
popper-class="instance_frame_wrapper"
|
||||||
>
|
>
|
||||||
|
<div style="text-align: right;">
|
||||||
|
<i class="el-icon-circle-close" style="font-size: 20px;cursor: pointer;color:#ddd;" @click="visible = false" />
|
||||||
|
</div>
|
||||||
|
<div class="frame_list">
|
||||||
<div
|
<div
|
||||||
v-for="(instance, idx) in series.instanceInfoList"
|
v-for="(instance, idx) in series.instanceInfoList"
|
||||||
:key="instance.Id"
|
:key="instance.Id"
|
||||||
|
@ -82,11 +87,28 @@
|
||||||
</div> -->
|
</div> -->
|
||||||
<div>
|
<div>
|
||||||
<div>{{ instance.InstanceNumber }}</div>
|
<div>{{ instance.InstanceNumber }}</div>
|
||||||
<div>{{ `${instance.NumberOfFrames > 0 ? instance.NumberOfFrames : 1} frame` }}</div>
|
<div>
|
||||||
|
{{ `${instance.NumberOfFrames > 0 ? instance.NumberOfFrames : 1} frame` }}
|
||||||
|
</div>
|
||||||
|
<div v-if="showDelete">
|
||||||
|
<span>{{ $t('trials:audit:table:isDelete') }}</span>
|
||||||
|
<el-switch
|
||||||
|
v-model="instance.IsDeleted"
|
||||||
|
size="mini"
|
||||||
|
@change="changeInstanceDeleteStatus($event, series, instance)"
|
||||||
|
/>
|
||||||
|
<span style="margin-left:10px;">{{ $t('trials:audit:table:isReading') }}</span>
|
||||||
|
<el-switch
|
||||||
|
v-model="instance.IsReading"
|
||||||
|
size="mini"
|
||||||
|
@change="changeInstanceReadingStatus($event, series, instance)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<i slot="reference" class="el-icon-connection" style="font-size: 15px;cursor: pointer;" />
|
</div>
|
||||||
|
<i slot="reference" class="el-icon-connection" style="font-size: 15px;cursor: pointer;" @click="visible = !visible" />
|
||||||
</el-popover>
|
</el-popover>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -143,7 +165,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane :label="$t('trials:dicom-show:relatedVisit')" name="relation-study" class="pane-relation-wrapper" v-if="!visitTaskId">
|
<el-tab-pane v-if="!visitTaskId" :label="$t('trials:dicom-show:relatedVisit')" name="relation-study" class="pane-relation-wrapper">
|
||||||
<div class="viewerSidethumbinner">
|
<div class="viewerSidethumbinner">
|
||||||
<el-collapse v-model="relationActiveName" @change="handelRelationActiveChange">
|
<el-collapse v-model="relationActiveName" @change="handelRelationActiveChange">
|
||||||
<el-collapse-item v-for="(study,studyIndex) in relationStudyList" :key="`${study.StudyId}`" :name="`${study.StudyId}`">
|
<el-collapse-item v-for="(study,studyIndex) in relationStudyList" :key="`${study.StudyId}`" :name="`${study.StudyId}`">
|
||||||
|
@ -197,7 +219,7 @@
|
||||||
<div v-if="seriesItem.isExistMutiFrames && seriesItem.instanceCount > 1">
|
<div v-if="seriesItem.isExistMutiFrames && seriesItem.instanceCount > 1">
|
||||||
<el-popover
|
<el-popover
|
||||||
placement="right"
|
placement="right"
|
||||||
trigger="hover"
|
trigger="click"
|
||||||
popper-class="instance_frame_wrapper"
|
popper-class="instance_frame_wrapper"
|
||||||
>
|
>
|
||||||
<div class="frame_list">
|
<div class="frame_list">
|
||||||
|
@ -260,13 +282,13 @@ import * as cornerstone from 'cornerstone-core'
|
||||||
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
||||||
import dicomViewer from '@/components/Dicom/DicomViewer'
|
import dicomViewer from '@/components/Dicom/DicomViewer'
|
||||||
import { getVisitStudyList, getAllRelationStudyList, getSeriesList } from '@/api/reading'
|
import { getVisitStudyList, getAllRelationStudyList, getSeriesList } from '@/api/reading'
|
||||||
import { setSeriesStatus } from '@/api/trials'
|
import { setSeriesStatus, setInstanceStatus } from '@/api/trials'
|
||||||
import { getTaskUploadedDicomStudyList } from '@/api/reading'
|
import { getTaskUploadedDicomStudyList } from '@/api/reading'
|
||||||
import requestPoolManager from '@/utils/request-pool'
|
import requestPoolManager from '@/utils/request-pool'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { changeURLStatic } from '@/utils/history.js'
|
import { changeURLStatic } from '@/utils/history.js'
|
||||||
import metaDataProvider from '@/utils/metaDataProvider'
|
import metaDataProvider from '@/utils/metaDataProvider'
|
||||||
cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 });
|
cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 })
|
||||||
// import * as cornerstoneTools from 'cornerstone-tools'
|
// import * as cornerstoneTools from 'cornerstone-tools'
|
||||||
var config = {
|
var config = {
|
||||||
maxWebWorkers: 4,
|
maxWebWorkers: 4,
|
||||||
|
@ -306,7 +328,8 @@ export default {
|
||||||
currentLoadIns: [],
|
currentLoadIns: [],
|
||||||
isFromCRCUpload: false,
|
isFromCRCUpload: false,
|
||||||
visitTaskId: null,
|
visitTaskId: null,
|
||||||
page: ''
|
page: '',
|
||||||
|
visible: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -595,6 +618,73 @@ export default {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
async changeInstanceReadingStatus(callback, series, instance) {
|
||||||
|
let statusStr = ''
|
||||||
|
if (callback) {
|
||||||
|
statusStr = this.$t('trials:audit:label:setSeriesReading')
|
||||||
|
instance.IsReading = false
|
||||||
|
} else {
|
||||||
|
statusStr = this.$t('trials:audit:label:setSeriesNotReading')
|
||||||
|
instance.IsReading = true
|
||||||
|
}
|
||||||
|
var message = this.$t('trials:audit:message:changeSeriesStatus').replace('xxx', statusStr)
|
||||||
|
message = message.replace('yyy', this.$fd('YesOrNo', !instance.IsReading))
|
||||||
|
const confirm = await this.$confirm(
|
||||||
|
message,
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (confirm !== 'confirm') return
|
||||||
|
const state = instance.IsReading ? 1 : 2
|
||||||
|
this.loading = true
|
||||||
|
try {
|
||||||
|
const res = await setInstanceStatus(series.trialId, series.subjectVisitId, series.seriesId, instance.Id, state)
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
instance.IsReading = !instance.IsReading
|
||||||
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
|
window.opener.postMessage({ type: 'refreshSeriesList', data: '' }, window.location)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async changeInstanceDeleteStatus(callback, series, instance) {
|
||||||
|
let statusStr = ''
|
||||||
|
if (callback) {
|
||||||
|
statusStr = this.$t('trials:audit:label:setSeriesDeleted')
|
||||||
|
instance.IsDeleted = false
|
||||||
|
} else {
|
||||||
|
statusStr = this.$t('trials:audit:label:setSeriesNotDelete')
|
||||||
|
instance.IsDeleted = true
|
||||||
|
}
|
||||||
|
var message = this.$t('trials:audit:message:changeSeriesStatus').replace('xxx', statusStr)
|
||||||
|
message = message.replace('yyy', this.$fd('YesOrNo', !instance.IsDeleted))
|
||||||
|
const confirm = await this.$confirm(
|
||||||
|
message,
|
||||||
|
{
|
||||||
|
type: 'warning',
|
||||||
|
distinguishCancelAndClose: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (confirm !== 'confirm') return
|
||||||
|
|
||||||
|
const state = instance.IsDeleted ? 5 : 4
|
||||||
|
this.loading = true
|
||||||
|
try {
|
||||||
|
const res = await setInstanceStatus(series.trialId, series.subjectVisitId, series.seriesId, instance.Id, state)
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
instance.IsDeleted = !instance.IsDeleted
|
||||||
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
|
window.opener.postMessage({ type: 'refreshSeriesList', data: '' }, window.location)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
// 切换关联检查Tab时获取关联检查信息
|
// 切换关联检查Tab时获取关联检查信息
|
||||||
async handleTabClick(tab, event) {
|
async handleTabClick(tab, event) {
|
||||||
if (tab.name === 'relation-study' && this.relationStudyList.length <= 0) {
|
if (tab.name === 'relation-study' && this.relationStudyList.length <= 0) {
|
||||||
|
@ -978,9 +1068,21 @@ export default {
|
||||||
border: 1px solid #2c2c2c;
|
border: 1px solid #2c2c2c;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
.frame_list{
|
||||||
|
max-height: 500px;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
.instance_frame_wrapper ::-webkit-scrollbar {
|
||||||
|
width: 7px;
|
||||||
|
height: 7px;
|
||||||
|
}
|
||||||
|
.instance_frame_wrapper ::-webkit-scrollbar-thumb {
|
||||||
|
border-radius: 10px;
|
||||||
|
background: #d0d0d0;
|
||||||
|
}
|
||||||
.frame_content{
|
.frame_content{
|
||||||
height: 50px;
|
/* height: 50px; */
|
||||||
padding: 5px;
|
padding: 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
Loading…
Reference in New Issue