Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 65e4192312 |
Binary file not shown.
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 1.8 KiB |
+1
-2
@@ -98,7 +98,6 @@ import timeTag from '@/components/timeTag'
|
|||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import i18n from './lang'
|
import i18n from './lang'
|
||||||
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
import DicomEvent from '@/views/trials/trials-panel/reading/dicoms/components/DicomEvent'
|
||||||
import WHITELIST from "./utils/whiteList"
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'App',
|
||||||
components: {
|
components: {
|
||||||
@@ -157,7 +156,7 @@ export default {
|
|||||||
// },
|
// },
|
||||||
methods: {
|
methods: {
|
||||||
getIsLock() {
|
getIsLock() {
|
||||||
if (zzSessionStorage.getItem('isLock') === 'true' && !WHITELIST.includes(this.$route.path)) {
|
if (zzSessionStorage.getItem('isLock') === 'true') {
|
||||||
this.isLock = true
|
this.isLock = true
|
||||||
} else {
|
} else {
|
||||||
this.isLock = false
|
this.isLock = false
|
||||||
|
|||||||
@@ -480,32 +480,3 @@ export function getNoneDicomMarkList(data) {
|
|||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getFilterTableQuestion(data) {
|
|
||||||
return request({
|
|
||||||
url: `/ReadingImageTask/getFilterTableQuestion`,
|
|
||||||
method: 'post',
|
|
||||||
data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
export function deleteImageCache(params) {
|
|
||||||
return request({
|
|
||||||
url: `/Study/deleteImageCache`,
|
|
||||||
method: 'delete',
|
|
||||||
params
|
|
||||||
})
|
|
||||||
}
|
|
||||||
export function getAnonymizeInfo(params) {
|
|
||||||
return request({
|
|
||||||
url: `/Study/getAnonymizeInfo`,
|
|
||||||
method: 'get',
|
|
||||||
params
|
|
||||||
})
|
|
||||||
}
|
|
||||||
export function updateModality(params) {
|
|
||||||
return request({
|
|
||||||
url: `/Study/updateModality`,
|
|
||||||
method: 'put',
|
|
||||||
params
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -4523,23 +4523,3 @@ export function addOrUpdateCommonUploadRecord(data) {
|
|||||||
data,
|
data,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getInspectionById(data) {
|
|
||||||
return request({
|
|
||||||
url: `/Inspection/getInspectionById`,
|
|
||||||
method: 'post',
|
|
||||||
data,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function setJsonDetail(data) {
|
|
||||||
return request({
|
|
||||||
url: `/Inspection/setJsonDetail`,
|
|
||||||
method: 'post',
|
|
||||||
data,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 225 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 320 KiB After Width: | Height: | Size: 353 KiB |
@@ -213,10 +213,6 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
getInfo() {
|
|
||||||
var image = cornerstone.getImage(this.canvas)
|
|
||||||
return image
|
|
||||||
},
|
|
||||||
loadImageStack(dicomSeries, text = '') {
|
loadImageStack(dicomSeries, text = '') {
|
||||||
this.tip = text
|
this.tip = text
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
|||||||
@@ -296,13 +296,6 @@
|
|||||||
<option v-for="(item, index) in colormapsList" :key="index" :value="item.id">{{ item.name }}</option>
|
<option v-for="(item, index) in colormapsList" :key="index" :value="item.id">{{ item.name }}</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="sideTool-wrapper">
|
|
||||||
<label for="Replacement" style="display: inline-block;color: #fff;line-height: 20px;cursor: pointer;">
|
|
||||||
替换
|
|
||||||
</label>
|
|
||||||
<input type="file" id="Replacement" @change="beginScanFiles($event, 'replace')" style="display: none;">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 患者信息 -->
|
<!-- 患者信息 -->
|
||||||
@@ -389,7 +382,6 @@ import {
|
|||||||
editPatientInfo
|
editPatientInfo
|
||||||
} from '@/api/trials'
|
} from '@/api/trials'
|
||||||
import { setPTClinicalDataForInstance, clearPTClinicalDataCache } from '@/utils/ptClinicalDataCache'
|
import { setPTClinicalDataForInstance, clearPTClinicalDataCache } from '@/utils/ptClinicalDataCache'
|
||||||
import { changeFile } from "@/views/trials/trials-panel/reading/dicoms/components/upload.js"
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DicomsViewer',
|
name: 'DicomsViewer',
|
||||||
components: {
|
components: {
|
||||||
@@ -408,14 +400,6 @@ export default {
|
|||||||
modality: {
|
modality: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: ''
|
||||||
},
|
|
||||||
SeriesList: {
|
|
||||||
type: Array,
|
|
||||||
default: () => []
|
|
||||||
},
|
|
||||||
currentSeriesIndex: {
|
|
||||||
type: Number,
|
|
||||||
default: -1
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@@ -499,9 +483,7 @@ export default {
|
|||||||
},
|
},
|
||||||
formLoading: false,
|
formLoading: false,
|
||||||
type: '',
|
type: '',
|
||||||
isEdit: 0,
|
isEdit: 0
|
||||||
fileKey: null,
|
|
||||||
file: null,
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -529,19 +511,6 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
beginScanFiles(e, key) {
|
|
||||||
this.fileKey = key
|
|
||||||
this.file = e.target.files[0]
|
|
||||||
let image = this.$refs[this.activeItem].getInfo()
|
|
||||||
let study = {
|
|
||||||
seriesList: this.SeriesList,
|
|
||||||
currentSeriesIndex: this.currentSeriesIndex
|
|
||||||
}
|
|
||||||
this.$emit("update:loading", true)
|
|
||||||
changeFile('CRC', this.file, study, image)
|
|
||||||
|
|
||||||
// DicomEvent.$emit('getStudyFile')
|
|
||||||
},
|
|
||||||
setToolsPassive() {
|
setToolsPassive() {
|
||||||
const elements = document.querySelectorAll('.dicom-item')
|
const elements = document.querySelectorAll('.dicom-item')
|
||||||
const scope = this
|
const scope = this
|
||||||
|
|||||||
@@ -141,10 +141,6 @@ export default {
|
|||||||
type: Number,
|
type: Number,
|
||||||
default: 2,
|
default: 2,
|
||||||
},
|
},
|
||||||
isReading: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -446,9 +442,6 @@ export default {
|
|||||||
let params = {
|
let params = {
|
||||||
TrialImageDownloadId: this.downloadId,
|
TrialImageDownloadId: this.downloadId,
|
||||||
}
|
}
|
||||||
if (this.isReading) {
|
|
||||||
params.VisitTaskId = this.TaskId
|
|
||||||
}
|
|
||||||
await downloadImageSuccess(params)
|
await downloadImageSuccess(params)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
|
|||||||
@@ -43,8 +43,7 @@
|
|||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<div class="btnBox">
|
<div class="btnBox">
|
||||||
<!--上传--->
|
<!--上传--->
|
||||||
<form id="inputForm" :ref="`uploadForm_${scope.row.Id}`" enctype="multipart/form-data"
|
<form id="inputForm" :ref="`uploadForm_${scope.row.Id}`" enctype="multipart/form-data" v-if="!forbid">
|
||||||
v-if="!forbid && (!isReading || isDownloaded)">
|
|
||||||
<div class="form-group" style="margin-right: 10px">
|
<div class="form-group" style="margin-right: 10px">
|
||||||
<div :id="`directoryInputWrapper_${scope.row.Id}`" class="btn btn-link file-input">
|
<div :id="`directoryInputWrapper_${scope.row.Id}`" class="btn btn-link file-input">
|
||||||
<el-button circle icon="el-icon-upload2" :disabled="btnLoading" :loading="btnLoading"
|
<el-button circle icon="el-icon-upload2" :disabled="btnLoading" :loading="btnLoading"
|
||||||
@@ -61,15 +60,17 @@
|
|||||||
scope.row.UploadStudyList.length <= 0
|
scope.row.UploadStudyList.length <= 0
|
||||||
" @click.stop="handleViewReadingImages(scope.row)" :title="$t('upload:dicom:button:preview')" />
|
" @click.stop="handleViewReadingImages(scope.row)" :title="$t('upload:dicom:button:preview')" />
|
||||||
<!--删除--->
|
<!--删除--->
|
||||||
<el-button circle icon="el-icon-delete" :title="$t('upload:dicom:button:delete')"
|
<el-button circle :disabled="!scope.row.UploadStudyList ||
|
||||||
@click.stop="remove(scope.row)" />
|
scope.row.UploadStudyList.length <= 0 ||
|
||||||
|
scope.row.ReadingTaskState === 2
|
||||||
|
" icon="el-icon-delete" :title="$t('upload:dicom:button:delete')" @click.stop="remove(scope.row)" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<div style="margin: 10px 0" class="top">
|
<div style="margin: 10px 0" class="top">
|
||||||
<span>{{ $t('upload:dicom:uploadTitle') }}</span>
|
<span>{{ $t('upload:dicom:uploadTitle') }}</span>
|
||||||
<div class="btnBox" v-if="!forbid && (!isReading || isDownloaded)">
|
<div class="btnBox" v-if="!forbid">
|
||||||
<span style="margin-right: 10px">{{ $store.state.trials.uploadTip }}</span>
|
<span style="margin-right: 10px">{{ $store.state.trials.uploadTip }}</span>
|
||||||
<form id="inputForm" ref="uploadForm" enctype="multipart/form-data">
|
<form id="inputForm" ref="uploadForm" enctype="multipart/form-data">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -378,14 +379,6 @@ export default {
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
isReading: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
StudyInstanceUID: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
'study-view': studyView,
|
'study-view': studyView,
|
||||||
@@ -435,8 +428,7 @@ export default {
|
|||||||
openSubjectVisitId: null,
|
openSubjectVisitId: null,
|
||||||
openVisitTaskId: null,
|
openVisitTaskId: null,
|
||||||
TrialModality: [],
|
TrialModality: [],
|
||||||
IsReadingTaskViewInOrder: 2,
|
IsReadingTaskViewInOrder: 2
|
||||||
isDownloaded: false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async mounted() {
|
async mounted() {
|
||||||
@@ -479,7 +471,6 @@ export default {
|
|||||||
let res = await getSubjectImageUploadList(params)
|
let res = await getSubjectImageUploadList(params)
|
||||||
this.loading = false
|
this.loading = false
|
||||||
if (res.IsSuccess) {
|
if (res.IsSuccess) {
|
||||||
this.isDownloaded = res.OtherInfo.IsIRImageDownloaded
|
|
||||||
this.TrialModality = res.OtherInfo.TrialModality.split('|')
|
this.TrialModality = res.OtherInfo.TrialModality.split('|')
|
||||||
this.IsReadingTaskViewInOrder = res.OtherInfo.IsReadingTaskViewInOrder || res.OtherInfo.IsReadingTaskViewInOrder === 0 ? res.OtherInfo.IsReadingTaskViewInOrder : 2
|
this.IsReadingTaskViewInOrder = res.OtherInfo.IsReadingTaskViewInOrder || res.OtherInfo.IsReadingTaskViewInOrder === 0 ? res.OtherInfo.IsReadingTaskViewInOrder : 2
|
||||||
this.StudyInstanceUidList = []
|
this.StudyInstanceUidList = []
|
||||||
@@ -957,7 +948,7 @@ export default {
|
|||||||
var instanceItem = instanceList.find(function (item) {
|
var instanceItem = instanceList.find(function (item) {
|
||||||
return item.instanceUid === instanceUid
|
return item.instanceUid === instanceUid
|
||||||
})
|
})
|
||||||
if (!false) {
|
if (!instanceItem) {
|
||||||
var date = data.string('x00080023')
|
var date = data.string('x00080023')
|
||||||
var time = data.string('x00080033')
|
var time = data.string('x00080033')
|
||||||
var instanceTime = ''
|
var instanceTime = ''
|
||||||
@@ -1086,12 +1077,11 @@ export default {
|
|||||||
async verifyStudy() {
|
async verifyStudy() {
|
||||||
this.btnLoading = true
|
this.btnLoading = true
|
||||||
var studyList = []
|
var studyList = []
|
||||||
let scope = this
|
|
||||||
this.selectArr.forEach((item) => {
|
this.selectArr.forEach((item) => {
|
||||||
item.dicomInfo.uploadFileSize = 0
|
item.dicomInfo.uploadFileSize = 0
|
||||||
if (!item.uploadState.selected) {
|
if (!item.uploadState.selected) {
|
||||||
studyList.push({
|
studyList.push({
|
||||||
studyInstanceUid: scope.isReading && scope.StudyInstanceUID ? scope.StudyInstanceUID : item.dicomInfo.studyUid,
|
studyInstanceUid: item.dicomInfo.studyUid,
|
||||||
studyDate: item.dicomInfo.studyTime,
|
studyDate: item.dicomInfo.studyTime,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1186,7 +1176,7 @@ export default {
|
|||||||
let t = setInterval(() => {
|
let t = setInterval(() => {
|
||||||
dicomUploadInProgress({
|
dicomUploadInProgress({
|
||||||
trialId: scope.trialId,
|
trialId: scope.trialId,
|
||||||
studyInstanceUid: scope.isReading && scope.StudyInstanceUID ? scope.StudyInstanceUID : dicomInfo.studyUid,
|
studyInstanceUid: dicomInfo.studyUid,
|
||||||
VisitTaskId: dicomInfo.visitTaskId,
|
VisitTaskId: dicomInfo.visitTaskId,
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
console.log(dicomInfo.visitTaskId)
|
console.log(dicomInfo.visitTaskId)
|
||||||
@@ -1213,7 +1203,7 @@ export default {
|
|||||||
dicomInfo.RadiopharmaceuticalStartTime,
|
dicomInfo.RadiopharmaceuticalStartTime,
|
||||||
|
|
||||||
studyId: dicomInfo.studyId,
|
studyId: dicomInfo.studyId,
|
||||||
studyInstanceUid: scope.isReading && scope.StudyInstanceUID ? scope.StudyInstanceUID : dicomInfo.studyUid,
|
studyInstanceUid: dicomInfo.studyUid,
|
||||||
studyTime: dicomInfo.studyTime,
|
studyTime: dicomInfo.studyTime,
|
||||||
description: dicomInfo.description,
|
description: dicomInfo.description,
|
||||||
seriesCount: dicomInfo.seriesNum,
|
seriesCount: dicomInfo.seriesNum,
|
||||||
@@ -1254,60 +1244,58 @@ export default {
|
|||||||
try {
|
try {
|
||||||
let o = v.instanceList[ii]
|
let o = v.instanceList[ii]
|
||||||
let name = `${v.instanceList[ii].file.webkitRelativePath}_${v.instanceList[ii].instanceUid}`
|
let name = `${v.instanceList[ii].file.webkitRelativePath}_${v.instanceList[ii].instanceUid}`
|
||||||
// if (o.isReUpload) {
|
if (o.isReUpload) {
|
||||||
// dicomInfo.failedFileCount++
|
dicomInfo.failedFileCount++
|
||||||
// dicomInfo.uploadFileSize += o.file.size
|
dicomInfo.uploadFileSize += o.file.size
|
||||||
// Record.Existed.push(name)
|
Record.Existed.push(name)
|
||||||
// Record.FileCount++
|
Record.FileCount++
|
||||||
// }
|
} else if (o.myPath) {
|
||||||
// else if (o.myPath) {
|
instanceList.push({
|
||||||
// instanceList.push({
|
studyInstanceUid: dicomInfo.studyUid,
|
||||||
// studyInstanceUid: dicomInfo.studyUid,
|
seriesInstanceUid: v.seriesUid,
|
||||||
// seriesInstanceUid: v.seriesUid,
|
SOPClassUID: o.SOPClassUID,
|
||||||
// SOPClassUID: o.SOPClassUID,
|
TransferSytaxUID: o.TransferSytaxUID,
|
||||||
// TransferSytaxUID: o.TransferSytaxUID,
|
MediaStorageSOPInstanceUID:
|
||||||
// MediaStorageSOPInstanceUID:
|
o.MediaStorageSOPInstanceUID,
|
||||||
// o.MediaStorageSOPInstanceUID,
|
MediaStorageSOPClassUID:
|
||||||
// MediaStorageSOPClassUID:
|
o.MediaStorageSOPClassUID,
|
||||||
// o.MediaStorageSOPClassUID,
|
sopInstanceUid: o.instanceUid,
|
||||||
// sopInstanceUid: o.instanceUid,
|
instanceNumber: o.instanceNumber,
|
||||||
// instanceNumber: o.instanceNumber,
|
instanceTime: o.instanceTime,
|
||||||
// instanceTime: o.instanceTime,
|
imageRows: o.imageRows,
|
||||||
// imageRows: o.imageRows,
|
imageColumns: o.imageColumns,
|
||||||
// imageColumns: o.imageColumns,
|
sliceLocation: o.sliceLocation,
|
||||||
// sliceLocation: o.sliceLocation,
|
sliceThickness: o.sliceThickness,
|
||||||
// sliceThickness: o.sliceThickness,
|
numberOfFrames: o.numberOfFrames,
|
||||||
// numberOfFrames: o.numberOfFrames,
|
pixelSpacing: o.pixelSpacing,
|
||||||
// pixelSpacing: o.pixelSpacing,
|
imagerPixelSpacing: o.imagerPixelSpacing,
|
||||||
// imagerPixelSpacing: o.imagerPixelSpacing,
|
frameOfReferenceUID: o.frameOfReferenceUID,
|
||||||
// frameOfReferenceUID: o.frameOfReferenceUID,
|
windowCenter: o.windowCenter,
|
||||||
// windowCenter: o.windowCenter,
|
windowWidth: o.windowWidth,
|
||||||
// windowWidth: o.windowWidth,
|
path: o.myPath,
|
||||||
// path: o.myPath,
|
FileSize: o.FileSize,
|
||||||
// FileSize: o.FileSize,
|
|
||||||
|
|
||||||
// PhotometricInterpretation:
|
PhotometricInterpretation:
|
||||||
// o.PhotometricInterpretation,
|
o.PhotometricInterpretation,
|
||||||
// BitsAllocated: o.BitsAllocated,
|
BitsAllocated: o.BitsAllocated,
|
||||||
// PixelRepresentation: o.PixelRepresentation,
|
PixelRepresentation: o.PixelRepresentation,
|
||||||
// RescaleIntercept: o.RescaleIntercept,
|
RescaleIntercept: o.RescaleIntercept,
|
||||||
// RescaleSlope: o.RescaleSlope,
|
RescaleSlope: o.RescaleSlope,
|
||||||
// ImagePositionPatient: o.ImagePositionPatient,
|
ImagePositionPatient: o.ImagePositionPatient,
|
||||||
// ImageOrientationPatient:
|
ImageOrientationPatient:
|
||||||
// o.ImageOrientationPatient,
|
o.ImageOrientationPatient,
|
||||||
// SequenceOfUltrasoundRegions:
|
SequenceOfUltrasoundRegions:
|
||||||
// o.SequenceOfUltrasoundRegions,
|
o.SequenceOfUltrasoundRegions,
|
||||||
// FrameTime: o.FrameTime,
|
FrameTime: o.FrameTime,
|
||||||
// CorrectedImage: o.CorrectedImage,
|
CorrectedImage: o.CorrectedImage,
|
||||||
// Units: o.Units,
|
Units: o.Units,
|
||||||
// DecayCorrection: o.DecayCorrection,
|
DecayCorrection: o.DecayCorrection,
|
||||||
// EncapsulatedDocument: o.EncapsulatedDocument,
|
EncapsulatedDocument: o.EncapsulatedDocument,
|
||||||
// })
|
})
|
||||||
// Record.Uploaded.push(name)
|
Record.Uploaded.push(name)
|
||||||
// dicomInfo.failedFileCount++
|
dicomInfo.failedFileCount++
|
||||||
// Record.FileCount++
|
Record.FileCount++
|
||||||
// }
|
} else {
|
||||||
// else {
|
|
||||||
let path = `/${params.trialId}/Image/${params.subjectId
|
let path = `/${params.trialId}/Image/${params.subjectId
|
||||||
}/${params.subjectVisitId}/${dicomInfo.visitTaskId
|
}/${params.subjectVisitId}/${dicomInfo.visitTaskId
|
||||||
}/${scope.getGuid(
|
}/${scope.getGuid(
|
||||||
@@ -1333,18 +1321,7 @@ export default {
|
|||||||
file: o.file,
|
file: o.file,
|
||||||
speed: true,
|
speed: true,
|
||||||
},
|
},
|
||||||
scope.isReading && scope.StudyInstanceUID ? {
|
null,
|
||||||
AnonymizeFixedList: [
|
|
||||||
{
|
|
||||||
Element: '000D',
|
|
||||||
Group: '0020',
|
|
||||||
ReplaceValue: scope.StudyInstanceUID,
|
|
||||||
Id: 'StudyInstanceUID'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
AnonymizeNotFixedList: [],
|
|
||||||
DicomStoreInfo: {}
|
|
||||||
} : null,
|
|
||||||
(percentage, checkpoint, lastPer) => {
|
(percentage, checkpoint, lastPer) => {
|
||||||
dicomInfo.uploadFileSize +=
|
dicomInfo.uploadFileSize +=
|
||||||
checkpoint.size * (percentage - lastPer)
|
checkpoint.size * (percentage - lastPer)
|
||||||
@@ -1410,7 +1387,7 @@ export default {
|
|||||||
}
|
}
|
||||||
if (res && res.url) {
|
if (res && res.url) {
|
||||||
instanceList.push({
|
instanceList.push({
|
||||||
studyInstanceUid: scope.isReading && scope.StudyInstanceUID ? scope.StudyInstanceUID : dicomInfo.studyUid,
|
studyInstanceUid: dicomInfo.studyUid,
|
||||||
seriesInstanceUid: v.seriesUid,
|
seriesInstanceUid: v.seriesUid,
|
||||||
sopInstanceUid: o.instanceUid,
|
sopInstanceUid: o.instanceUid,
|
||||||
SOPClassUID: o.SOPClassUID,
|
SOPClassUID: o.SOPClassUID,
|
||||||
@@ -1459,7 +1436,7 @@ export default {
|
|||||||
Record.Failed.push(name)
|
Record.Failed.push(name)
|
||||||
Record.FileCount++
|
Record.FileCount++
|
||||||
}
|
}
|
||||||
// }
|
}
|
||||||
resolve1()
|
resolve1()
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e)
|
console.log(e)
|
||||||
@@ -1477,7 +1454,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
params.study.seriesList.push({
|
params.study.seriesList.push({
|
||||||
studyInstanceUid: scope.isReading && scope.StudyInstanceUID ? scope.StudyInstanceUID : dicomInfo.studyUid,
|
studyInstanceUid: dicomInfo.studyUid,
|
||||||
seriesInstanceUid: v.seriesUid,
|
seriesInstanceUid: v.seriesUid,
|
||||||
seriesNumber: v.seriesNumber,
|
seriesNumber: v.seriesNumber,
|
||||||
seriesTime: v.seriesTime,
|
seriesTime: v.seriesTime,
|
||||||
|
|||||||
@@ -6,13 +6,12 @@
|
|||||||
<el-tab-pane :label="$t('uploadDicomAndNonedicom:label:dicom')" name="dicom">
|
<el-tab-pane :label="$t('uploadDicomAndNonedicom:label:dicom')" name="dicom">
|
||||||
<dicomFile v-if="activeName === 'dicom'" :SubjectId="SubjectId" :SubjectCode="SubjectCode"
|
<dicomFile v-if="activeName === 'dicom'" :SubjectId="SubjectId" :SubjectCode="SubjectCode"
|
||||||
:Criterion="Criterion" :TaskId="VisitTaskId" :isUpload.sync="isUpload"
|
:Criterion="Criterion" :TaskId="VisitTaskId" :isUpload.sync="isUpload"
|
||||||
:isReadingTaskViewInOrder="isReadingTaskViewInOrder" :IsImageSegment="IsImageSegment" :forbid="forbid"
|
:isReadingTaskViewInOrder="isReadingTaskViewInOrder" :IsImageSegment="IsImageSegment" :forbid="forbid" />
|
||||||
:isReading="isReading" :StudyInstanceUID="StudyInstanceUID" />
|
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane :label="$t('uploadDicomAndNonedicom:label:nonedicom')" name="nonedicom">
|
<el-tab-pane :label="$t('uploadDicomAndNonedicom:label:nonedicom')" name="nonedicom">
|
||||||
<nonedicomFile v-if="activeName === 'nonedicom'" :SubjectId="SubjectId" :SubjectCode="SubjectCode"
|
<nonedicomFile v-if="activeName === 'nonedicom'" :SubjectId="SubjectId" :SubjectCode="SubjectCode"
|
||||||
:Criterion="Criterion" :VisitTaskId="VisitTaskId" :isUpload.sync="isUpload" :IsImageSegment="IsImageSegment"
|
:Criterion="Criterion" :VisitTaskId="VisitTaskId" :isUpload.sync="isUpload" :IsImageSegment="IsImageSegment"
|
||||||
:isReadingTaskViewInOrder="isReadingTaskViewInOrder" :forbid="forbid" :isReading="isReading" />
|
:isReadingTaskViewInOrder="isReadingTaskViewInOrder" :forbid="forbid" />
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
@@ -59,14 +58,6 @@ export default {
|
|||||||
IsImageSegment: {
|
IsImageSegment: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
|
||||||
isReading: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
StudyInstanceUID: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|||||||
@@ -111,9 +111,11 @@
|
|||||||
:title="$t('upload:nonedicom:button:preview')" @click.stop="handlePreviewNoneDicomFiles(scope.row)" />
|
:title="$t('upload:nonedicom:button:preview')" @click.stop="handlePreviewNoneDicomFiles(scope.row)" />
|
||||||
<!--上传--->
|
<!--上传--->
|
||||||
<el-button circle icon="el-icon-upload2" :title="$t('upload:nonedicom:button:upload')" v-if="!forbid"
|
<el-button circle icon="el-icon-upload2" :title="$t('upload:nonedicom:button:upload')" v-if="!forbid"
|
||||||
@click.native.prevent="handleUpload(scope.row)" :disabled="isReading && !isDownloaded" />
|
@click.native.prevent="handleUpload(scope.row)" />
|
||||||
<!--删除--->
|
<!--删除--->
|
||||||
<el-button circle icon="el-icon-delete" :title="$t('upload:nonedicom:button:delete')"
|
<el-button :disabled="scope.row.UploadedFileCount <= 0 ||
|
||||||
|
scope.row.ReadingTaskState === 2
|
||||||
|
" circle icon="el-icon-delete" :title="$t('upload:nonedicom:button:delete')"
|
||||||
@click.stop="remove(scope.row)" />
|
@click.stop="remove(scope.row)" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -268,10 +270,6 @@ export default {
|
|||||||
type: Number,
|
type: Number,
|
||||||
default: 0,
|
default: 0,
|
||||||
},
|
},
|
||||||
isReading: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -293,8 +291,7 @@ export default {
|
|||||||
BodyPart: {},
|
BodyPart: {},
|
||||||
relationInfo: {
|
relationInfo: {
|
||||||
ImageFormatList: []
|
ImageFormatList: []
|
||||||
},
|
}
|
||||||
isDownloaded: false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@@ -351,7 +348,6 @@ export default {
|
|||||||
if (res.IsSuccess) {
|
if (res.IsSuccess) {
|
||||||
this.list = res.Result
|
this.list = res.Result
|
||||||
this.relationInfo = res.OtherInfo
|
this.relationInfo = res.OtherInfo
|
||||||
this.isDownloaded = res.OtherInfo.IsIRImageDownloaded
|
|
||||||
this.faccept = []
|
this.faccept = []
|
||||||
this.relationInfo.ImageFormatList.forEach((item) => {
|
this.relationInfo.ImageFormatList.forEach((item) => {
|
||||||
this.faccept.push(`.${item}`)
|
this.faccept.push(`.${item}`)
|
||||||
|
|||||||
@@ -92,13 +92,8 @@ router.beforeEach(async (to, from, next) => {
|
|||||||
await store.dispatch('user/getUserInfo')
|
await store.dispatch('user/getUserInfo')
|
||||||
const accessRoutes = await store.dispatch('permission/generateRoutes')
|
const accessRoutes = await store.dispatch('permission/generateRoutes')
|
||||||
resetRouter()
|
resetRouter()
|
||||||
if (accessRoutes.length > 0) {
|
|
||||||
router.addRoutes(accessRoutes)
|
router.addRoutes(accessRoutes)
|
||||||
next({ ...to, replace: true })
|
next({ ...to, replace: true })
|
||||||
} else {
|
|
||||||
next()
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
// 删除token并进入登录页面以重新登录
|
// 删除token并进入登录页面以重新登录
|
||||||
|
|||||||
@@ -149,11 +149,6 @@ export const constantRoutes = [
|
|||||||
hidden: true,
|
hidden: true,
|
||||||
component: () => import('@/views/trials/trials-panel/reading/dicoms/none-dicoms')
|
component: () => import('@/views/trials/trials-panel/reading/dicoms/none-dicoms')
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: '/ecrfList',
|
|
||||||
hidden: true,
|
|
||||||
component: () => import('@/views/trials/trials-panel/reading/dicoms/components/TableList')
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
path: '/readingPage',
|
path: '/readingPage',
|
||||||
name: 'readingPage',
|
name: 'readingPage',
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
// eslint-disable-next-line no-undef
|
// eslint-disable-next-line no-undef
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
||||||
title: 'EIC lmaging Trial Management System',
|
title: 'HASC lmaging Trial Management System',
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {boolean} true | false
|
* @type {boolean} true | false
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ export const anonymization = function (file, config) {
|
|||||||
try {
|
try {
|
||||||
const reader = new FileReader()
|
const reader = new FileReader()
|
||||||
let AnonymizeFixedList = config.AnonymizeFixedList
|
let AnonymizeFixedList = config.AnonymizeFixedList
|
||||||
console.log(AnonymizeFixedList, 'AnonymizeFixedList')
|
|
||||||
let AnonymizeNotFixedList = config.AnonymizeNotFixedList
|
let AnonymizeNotFixedList = config.AnonymizeNotFixedList
|
||||||
let DicomStoreInfo = config.DicomStoreInfo
|
let DicomStoreInfo = config.DicomStoreInfo
|
||||||
reader.onload = async (event) => {
|
reader.onload = async (event) => {
|
||||||
@@ -16,11 +15,9 @@ export const anonymization = function (file, config) {
|
|||||||
let dataset = dcmjs.data.DicomMessage.readFile(buffer)
|
let dataset = dcmjs.data.DicomMessage.readFile(buffer)
|
||||||
for (var i = 0; i < AnonymizeFixedList.length; i++) {
|
for (var i = 0; i < AnonymizeFixedList.length; i++) {
|
||||||
let AnonymizeFixed = AnonymizeFixedList[i]
|
let AnonymizeFixed = AnonymizeFixedList[i]
|
||||||
if (!dataset.dict.hasOwnProperty(`${AnonymizeFixed.Group + AnonymizeFixed.Element}`) && !dataset.meta.hasOwnProperty(`${AnonymizeFixed.Group + AnonymizeFixed.Element}`)) continue
|
if (!dataset.dict.hasOwnProperty(`${AnonymizeFixed.Group + AnonymizeFixed.Element}`)) continue
|
||||||
if (dataset.dict[AnonymizeFixed.Group + AnonymizeFixed.Element]) {
|
if (dataset.dict[AnonymizeFixed.Group + AnonymizeFixed.Element]) {
|
||||||
dataset.dict[AnonymizeFixed.Group + AnonymizeFixed.Element].Value[0] = AnonymizeFixed.ReplaceValue
|
dataset.dict[AnonymizeFixed.Group + AnonymizeFixed.Element].Value[0] = AnonymizeFixed.ReplaceValue
|
||||||
} else if (dataset.meta[AnonymizeFixed.Group + AnonymizeFixed.Element]) {
|
|
||||||
dataset.meta[AnonymizeFixed.Group + AnonymizeFixed.Element].Value[0] = AnonymizeFixed.ReplaceValue
|
|
||||||
} else {
|
} else {
|
||||||
dataset.dict[AnonymizeFixed.Group + AnonymizeFixed.Element] = {
|
dataset.dict[AnonymizeFixed.Group + AnonymizeFixed.Element] = {
|
||||||
vr: AnonymizeFixed.ValueRepresentation,
|
vr: AnonymizeFixed.ValueRepresentation,
|
||||||
@@ -63,7 +60,7 @@ export const anonymization = function (file, config) {
|
|||||||
let newDicomFile = dataset.write() // fragmentMultiframe 原始数据是否进行分割
|
let newDicomFile = dataset.write() // fragmentMultiframe 原始数据是否进行分割
|
||||||
const bufferArray = new Uint8Array(newDicomFile)
|
const bufferArray = new Uint8Array(newDicomFile)
|
||||||
const blob = new Blob([bufferArray], { type: 'application/octet-stream' })
|
const blob = new Blob([bufferArray], { type: 'application/octet-stream' })
|
||||||
resolve({ blob, pixelDataElement, Modality: dataset.dict['00080060'].Value[0] })
|
resolve({ blob, pixelDataElement })
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(file, 'warning')
|
console.log(file, 'warning')
|
||||||
console.log(err)
|
console.log(err)
|
||||||
|
|||||||
@@ -12,8 +12,7 @@ export const dcmUpload = async function (data, config, progressFn, fileInfo) {
|
|||||||
let res = await Vue.prototype.OSSclient.multipartUpload(Object.assign(data, { file: blob.blob }), progressFn, fileInfo)
|
let res = await Vue.prototype.OSSclient.multipartUpload(Object.assign(data, { file: blob.blob }), progressFn, fileInfo)
|
||||||
resolve({
|
resolve({
|
||||||
...res,
|
...res,
|
||||||
image: blob.pixelDataElement,
|
image: blob.pixelDataElement
|
||||||
Modality: blob.Modality
|
|
||||||
})
|
})
|
||||||
// let OSSclientA = await OSSclient
|
// let OSSclientA = await OSSclient
|
||||||
// let blob = await encoder(file)
|
// let blob = await encoder(file)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import defaultSettings from '@/settings'
|
import defaultSettings from '@/settings'
|
||||||
|
|
||||||
const title = defaultSettings.title || 'EIC lmaging Trial Management System'
|
const title = defaultSettings.title || 'HASC lmaging Trial Management System'
|
||||||
|
|
||||||
export default function getPageTitle(pageTitle) {
|
export default function getPageTitle(pageTitle) {
|
||||||
if (pageTitle) {
|
if (pageTitle) {
|
||||||
|
|||||||
+7
-7
@@ -40,7 +40,7 @@ async function ossGenerateSTS() {
|
|||||||
return new Promise(async (resolve, reject) => {
|
return new Promise(async (resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
let _vm = router.default.app
|
let _vm = router.default.app
|
||||||
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload' && _vm._route.path !== '/readingDicoms' && _vm._route.path !== '/showdicom') {
|
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') {
|
||||||
var objectItem = objectName.split('/')
|
var objectItem = objectName.split('/')
|
||||||
// objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
|
// objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
|
||||||
objectItem[objectItem.length - 1] = `${objectItem[objectItem.length - 1].substring(
|
objectItem[objectItem.length - 1] = `${objectItem[objectItem.length - 1].substring(
|
||||||
@@ -57,7 +57,7 @@ async function ossGenerateSTS() {
|
|||||||
const trialId = urlParams.get('trialId')
|
const trialId = urlParams.get('trialId')
|
||||||
if (Object.keys(fileInfo).length !== 0) {
|
if (Object.keys(fileInfo).length !== 0) {
|
||||||
fileInfo.fileType = mimeTypeToExt(fileInfo.fileType)
|
fileInfo.fileType = mimeTypeToExt(fileInfo.fileType)
|
||||||
let params = Object.assign({ path: objectName }, fileInfo)
|
let params = Object.assign({path: objectName}, fileInfo)
|
||||||
addOrUpdateFileUploadRecord(params)
|
addOrUpdateFileUploadRecord(params)
|
||||||
} else if (trialId) {
|
} else if (trialId) {
|
||||||
const fileName = objectName.split('/').pop()
|
const fileName = objectName.split('/').pop()
|
||||||
@@ -97,7 +97,7 @@ async function ossGenerateSTS() {
|
|||||||
OSSclient = new OSS(Vue.prototype.OSSclientConfig);
|
OSSclient = new OSS(Vue.prototype.OSSclientConfig);
|
||||||
}
|
}
|
||||||
let _vm = router.default.app
|
let _vm = router.default.app
|
||||||
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload' && _vm._route.path !== '/readingDicoms' && _vm._route.path !== '/showdicom') {
|
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') {
|
||||||
var objectItem = data.path.split('/')
|
var objectItem = data.path.split('/')
|
||||||
// objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
|
// objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
|
||||||
objectItem[objectItem.length - 1] = `${objectItem[objectItem.length - 1].substring(
|
objectItem[objectItem.length - 1] = `${objectItem[objectItem.length - 1].substring(
|
||||||
@@ -114,7 +114,7 @@ async function ossGenerateSTS() {
|
|||||||
const trialId = urlParams.get('trialId')
|
const trialId = urlParams.get('trialId')
|
||||||
if (Object.keys(fileInfo).length !== 0) {
|
if (Object.keys(fileInfo).length !== 0) {
|
||||||
fileInfo.fileType = mimeTypeToExt(fileInfo.fileType)
|
fileInfo.fileType = mimeTypeToExt(fileInfo.fileType)
|
||||||
let params = Object.assign({ path: data.path }, fileInfo)
|
let params = Object.assign({path: data.path}, fileInfo)
|
||||||
addOrUpdateFileUploadRecord(params)
|
addOrUpdateFileUploadRecord(params)
|
||||||
} else if (trialId) {
|
} else if (trialId) {
|
||||||
const fileName = data.path.split('/').pop()
|
const fileName = data.path.split('/').pop()
|
||||||
@@ -151,7 +151,7 @@ async function ossGenerateSTS() {
|
|||||||
try {
|
try {
|
||||||
var name = objectName.split('/')[objectName.split('/').length - 1]
|
var name = objectName.split('/')[objectName.split('/').length - 1]
|
||||||
let _vm = router.default.app
|
let _vm = router.default.app
|
||||||
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload' && _vm._route.path !== '/readingDicoms' && _vm._route.path !== '/showdicom') {
|
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') {
|
||||||
var objectItem = objectName.split('/')
|
var objectItem = objectName.split('/')
|
||||||
objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
|
objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
|
||||||
objectName = objectItem.join('/')
|
objectName = objectItem.join('/')
|
||||||
@@ -225,7 +225,7 @@ function uploadAWS(aws, data, progress, fileInfo) {
|
|||||||
const { file, path } = data;
|
const { file, path } = data;
|
||||||
if (!file || !path) return reject('file and path be required');
|
if (!file || !path) return reject('file and path be required');
|
||||||
let _vm = router.default.app
|
let _vm = router.default.app
|
||||||
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload' && _vm._route.path !== '/readingDicoms' && _vm._route.path !== '/showdicom') {
|
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') {
|
||||||
var objectItem = data.path.split('/')
|
var objectItem = data.path.split('/')
|
||||||
// objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
|
// objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
|
||||||
objectItem[objectItem.length - 1] = `${objectItem[objectItem.length - 1].substring(
|
objectItem[objectItem.length - 1] = `${objectItem[objectItem.length - 1].substring(
|
||||||
@@ -246,7 +246,7 @@ function uploadAWS(aws, data, progress, fileInfo) {
|
|||||||
const trialId = urlParams.get('trialId')
|
const trialId = urlParams.get('trialId')
|
||||||
if (Object.keys(fileInfo).length !== 0) {
|
if (Object.keys(fileInfo).length !== 0) {
|
||||||
fileInfo.fileType = mimeTypeToExt(fileInfo.fileType)
|
fileInfo.fileType = mimeTypeToExt(fileInfo.fileType)
|
||||||
let params = Object.assign({ path: decodeUtf8(curPath) }, fileInfo)
|
let params = Object.assign({path: decodeUtf8(curPath)}, fileInfo)
|
||||||
addOrUpdateFileUploadRecord(params)
|
addOrUpdateFileUploadRecord(params)
|
||||||
} else if (trialId) {
|
} else if (trialId) {
|
||||||
const fileName = decodeUtf8(curPath).split('/').pop()
|
const fileName = decodeUtf8(curPath).split('/').pop()
|
||||||
|
|||||||
@@ -118,9 +118,6 @@ service.interceptors.response.use(
|
|||||||
if (res.IsSuccess) {
|
if (res.IsSuccess) {
|
||||||
return Promise.resolve(res)
|
return Promise.resolve(res)
|
||||||
} else if (res.IsSuccess === false) {
|
} else if (res.IsSuccess === false) {
|
||||||
if (res.Code === -4) {
|
|
||||||
return Promise.resolve(res)
|
|
||||||
}
|
|
||||||
if (res.Code !== 5) {
|
if (res.Code !== 5) {
|
||||||
MessageBox.confirm(res.ErrorMessage, {
|
MessageBox.confirm(res.ErrorMessage, {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
const WHITELIST = ['/', "/curriculumVitae", 'researchDetail_m', '/researchForm', '/ReviewersResearch', '/login', '/link_expired', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/researchLogin_m', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms', '/ecrfList']
|
const WHITELIST = ['/', "/curriculumVitae", 'researchDetail_m', '/researchForm', '/ReviewersResearch', '/login', '/link_expired', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/researchLogin_m', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms']
|
||||||
export default WHITELIST
|
export default WHITELIST
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="dashboard">
|
<div class="dashboard">
|
||||||
<div class="dashboard-header">
|
<div class="dashboard-header">
|
||||||
<h1>
|
<h1>
|
||||||
<a href="#" @click="handleTitleClick">GRR Real-Time IRC Information</a>
|
<a href="#" @click="handleTitleClick">GRR Real-Time HASC Information</a>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="dashboard">
|
<div class="dashboard">
|
||||||
<div class="dashboard-header">
|
<div class="dashboard-header">
|
||||||
<h1>Extimaging Real-Time IRC Information</h1>
|
<!-- <h1>Extimaging Real-Time HASC Information</h1> -->
|
||||||
<div>
|
<div>
|
||||||
<span>{{ currentTime }}</span>
|
<span>{{ currentTime }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -125,8 +125,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="viewerContent">
|
<div class="viewerContent">
|
||||||
<dicom-viewer id="dicomViewer" ref="dicomViewer" style="height:100%" :loading.sync="loading"
|
<dicom-viewer id="dicomViewer" ref="dicomViewer" style="height:100%" :loading.sync="loading"
|
||||||
:modality="modality" :Comparison.sync="isComparison" :SeriesList="seriesList"
|
:modality="modality" :Comparison.sync="isComparison" @loadStudy="loadStudy" />
|
||||||
:currentSeriesIndex="currentSeriesIndex" @loadStudy="loadStudy" />
|
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="viewerRightSidePanel">
|
<!-- <div class="viewerRightSidePanel">
|
||||||
<dicom-tools />
|
<dicom-tools />
|
||||||
@@ -180,7 +179,7 @@ export default {
|
|||||||
description: '',
|
description: '',
|
||||||
seriesCount: 0,
|
seriesCount: 0,
|
||||||
seriesList: [],
|
seriesList: [],
|
||||||
currentSeriesIndex: 0,
|
currentSeriesIndex: -1,
|
||||||
arr: [],
|
arr: [],
|
||||||
activeName: 'first',
|
activeName: 'first',
|
||||||
tpList: [],
|
tpList: [],
|
||||||
@@ -254,11 +253,6 @@ export default {
|
|||||||
})
|
})
|
||||||
workSpeedclose(true)
|
workSpeedclose(true)
|
||||||
},
|
},
|
||||||
watch: {
|
|
||||||
currentSeriesIndex() {
|
|
||||||
console.log(this.currentSeriesIndex, 'currentSeriesIndex')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
async updateImageResizePath(data) {
|
async updateImageResizePath(data) {
|
||||||
try {
|
try {
|
||||||
@@ -359,14 +353,13 @@ export default {
|
|||||||
i.ImageId = imageId
|
i.ImageId = imageId
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
var subjectVisitId = this.$router.currentRoute.query.subjectVisitId ? this.$router.currentRoute.query.subjectVisitId : item.SubjectVisitId
|
var subjectVisitId = this.$router.currentRoute.query.subjectVisitId
|
||||||
var studyId = this.$router.currentRoute.query.studyId
|
var studyId = this.$router.currentRoute.query.studyId
|
||||||
var trialId = this.$router.currentRoute.query.trialId
|
var trialId = this.$router.currentRoute.query.trialId
|
||||||
seriesList.push({
|
seriesList.push({
|
||||||
trialId,
|
trialId,
|
||||||
subjectVisitId,
|
subjectVisitId,
|
||||||
studyId,
|
studyId,
|
||||||
subjectId: item.SubjectId,
|
|
||||||
imageIds: imageIds,
|
imageIds: imageIds,
|
||||||
instanceInfoList: item.InstanceInfoList,
|
instanceInfoList: item.InstanceInfoList,
|
||||||
seriesId: item.Id,
|
seriesId: item.Id,
|
||||||
@@ -422,13 +415,12 @@ export default {
|
|||||||
i.ImageId = imageId
|
i.ImageId = imageId
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
var subjectVisitId = this.$router.currentRoute.query.subjectVisitId ? this.$router.currentRoute.query.subjectVisitId : item.SubjectVisitId
|
var subjectVisitId = this.$router.currentRoute.query.subjectVisitId
|
||||||
var studyId = this.$router.currentRoute.query.studyId
|
var studyId = this.$router.currentRoute.query.studyId
|
||||||
var trialId = this.$router.currentRoute.query.trialId
|
var trialId = this.$router.currentRoute.query.trialId
|
||||||
seriesList.push({
|
seriesList.push({
|
||||||
trialId,
|
trialId,
|
||||||
subjectVisitId,
|
subjectVisitId,
|
||||||
subjectId: item.SubjectId,
|
|
||||||
studyId,
|
studyId,
|
||||||
imageIds: imageIds,
|
imageIds: imageIds,
|
||||||
instanceInfoList: item.InstanceInfoList,
|
instanceInfoList: item.InstanceInfoList,
|
||||||
@@ -1205,7 +1197,6 @@ export default {
|
|||||||
border-color: #213a54 !important;
|
border-color: #213a54 !important;
|
||||||
background-color: #213a54;
|
background-color: #213a54;
|
||||||
}
|
}
|
||||||
|
|
||||||
.frame_content_active {
|
.frame_content_active {
|
||||||
border-color: #213a54 !important;
|
border-color: #213a54 !important;
|
||||||
background-color: #213a54;
|
background-color: #213a54;
|
||||||
|
|||||||
+13
-14
@@ -5,28 +5,27 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="login-body">
|
<div class="login-body">
|
||||||
<div class="login-l">
|
<div class="login-l">
|
||||||
<div class="login-logo">
|
<!-- <div class="login-logo">
|
||||||
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" />
|
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" />
|
||||||
<img v-else-if="NODE_ENV === 'usa'" src="@/assets/zzlogo-usa.png" alt="" class="usa-logo" />
|
<img v-else-if="NODE_ENV === 'usa'" src="@/assets/zzlogo-usa.png" alt="" class="usa-logo" />
|
||||||
<img v-else src="@/assets/zzlogo4.png" alt="" />
|
<img v-else src="@/assets/zzlogo2.png" alt="" />
|
||||||
</div>
|
</div> -->
|
||||||
<div :class="{
|
<div :class="{
|
||||||
'login-image': true,
|
'login-image': true,
|
||||||
'login-image-usa': true,
|
'login-image-usa': true,
|
||||||
}">
|
}">
|
||||||
<svg-icon icon-class="login-bg" style="width: 90%; height: 90%" />
|
<!-- <svg-icon icon-class="login-bg" style="width: 90%; height: 90%" /> -->
|
||||||
<!-- <img src="@/assets/login-bg.png" v-else /> -->
|
<img src="@/assets/login-bg.png" style=" height: 80%" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="login-r">
|
<div class="login-r">
|
||||||
<div class="title-container">
|
<div class="title-container">
|
||||||
<!-- IRC Management System -->
|
<!-- HASC Management System -->
|
||||||
<div v-if="NODE_ENV === 'usa'">
|
<div v-if="NODE_ENV === 'usa'">
|
||||||
<svg-icon icon-class="login-logo" style="width: 300px; height: 94px" />
|
<svg-icon icon-class="login-logo" style="width: 300px; height: 94px" />
|
||||||
</div>
|
</div>
|
||||||
<div class="title" v-else>
|
<div class="title" v-else>
|
||||||
<img src="@/assets/system.png" alt=""
|
<img src="@/assets/system.png" alt="" :style="{ height: isEN ? '50px' : '55px' }" />
|
||||||
:style="{ width: isEN ? '180px' : '200px', height: isEN ? '60px' : '65px' }" />
|
|
||||||
<div :style="`font-size:${isEN ? '28px' : '35px'}`">{{ $t('login:title:system') }}</div>
|
<div :style="`font-size:${isEN ? '28px' : '35px'}`">{{ $t('login:title:system') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -111,17 +110,17 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="language === 'zh'" class="login-footer">
|
<div v-if="language === 'zh'" class="login-footer">
|
||||||
<span>Copyright © {{ new Date().getFullYear() }} 上海展影医疗科技有限公司
|
<span>Copyright © {{ new Date().getFullYear() }} 上海禾安枢信息科技有限公司
|
||||||
版权所有</span>
|
版权所有</span>
|
||||||
<span> | </span>
|
<span> | </span>
|
||||||
<a target="_blank" href="https://beian.miit.gov.cn/">
|
<!-- <a target="_blank" href="https://beian.miit.gov.cn/">
|
||||||
<span> 沪ICP备2021037850-2 </span>
|
<span> 沪ICP备2021037850-2 </span>
|
||||||
</a>
|
</a>
|
||||||
<span> | </span>
|
<span> | </span>
|
||||||
<a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31011002005859">
|
<a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31011002005859">
|
||||||
<img src="@/assets/filing.png" />
|
<img src="@/assets/filing.png" />
|
||||||
<span>沪公网安备 31011002005859号</span>
|
<span>沪公网安备 31011002005859号</span>
|
||||||
</a>
|
</a> -->
|
||||||
<a @click="openAbout">
|
<a @click="openAbout">
|
||||||
<span style="color: #428bca">关于</span>
|
<span style="color: #428bca">关于</span>
|
||||||
</a>
|
</a>
|
||||||
@@ -162,16 +161,16 @@
|
|||||||
V{{ $version.IsEnv_US ? $version.Version_US : $version.Version }}
|
V{{ $version.IsEnv_US ? $version.Version_US : $version.Version }}
|
||||||
</p>
|
</p>
|
||||||
<p style="margin-bottom: 20px" v-if="language === 'zh'">
|
<p style="margin-bottom: 20px" v-if="language === 'zh'">
|
||||||
Copyright © {{ new Date().getFullYear() }} 上海展影医疗科技有限公司
|
Copyright © {{ new Date().getFullYear() }} 上海禾安枢信息科技有限公司
|
||||||
版权所有
|
版权所有
|
||||||
</p>
|
</p>
|
||||||
<p style="margin-bottom: 20px" v-else-if="NODE_ENV === 'usa'">
|
<p style="margin-bottom: 20px" v-else-if="NODE_ENV === 'usa'">
|
||||||
© {{ new Date().getFullYear() }} Elevate Imaging Inc.
|
© {{ new Date().getFullYear() }} Elevate Imaging Inc.
|
||||||
</p>
|
</p>
|
||||||
<p style="margin-bottom: 20px" v-else>
|
<!-- <p style="margin-bottom: 20px" v-else>
|
||||||
Copyright © {{ new Date().getFullYear() }} Shanghai Extensive Imaging
|
Copyright © {{ new Date().getFullYear() }} Shanghai Extensive Imaging
|
||||||
Inc.
|
Inc.
|
||||||
</p>
|
</p> -->
|
||||||
<!-- <div style="margin-bottom: 20px" v-if="NODE_ENV === 'usa'">
|
<!-- <div style="margin-bottom: 20px" v-if="NODE_ENV === 'usa'">
|
||||||
<img style="width: 180px" src="@/assets/zzlogo-usa.png" alt="" />
|
<img style="width: 180px" src="@/assets/zzlogo-usa.png" alt="" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -50,9 +50,6 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="v.fileType.includes('zip')" class="content flex_col">
|
|
||||||
<img :title="v.FileName" crossorigin="anonymous" :src="zipImg" height="100%"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="Anonymous" v-if="isAnonymous">
|
<div class="Anonymous" v-if="isAnonymous">
|
||||||
@@ -161,7 +158,6 @@ import hardcodedMetaDataProvider from '@/views/trials/trials-panel/reading/visit
|
|||||||
import registerWebImageLoader from '@/views/trials/trials-panel/reading/visit-review/js/registerWebImageLoader'
|
import registerWebImageLoader from '@/views/trials/trials-panel/reading/visit-review/js/registerWebImageLoader'
|
||||||
import Note_RectangleRoiTool from '@/views/trials/trials-panel/reading/dicoms3D/components/tools/Note_RectangleRoiTool'
|
import Note_RectangleRoiTool from '@/views/trials/trials-panel/reading/dicoms3D/components/tools/Note_RectangleRoiTool'
|
||||||
import { noneDicomStudyMaskImage, noneDicomStudyUndoMaskImage } from "@/api/reading"
|
import { noneDicomStudyMaskImage, noneDicomStudyUndoMaskImage } from "@/api/reading"
|
||||||
import zipImg from '@/assets/zip.png'
|
|
||||||
const { ViewportType } = Enums
|
const { ViewportType } = Enums
|
||||||
const renderingEngineId = 'myRenderingEngine'
|
const renderingEngineId = 'myRenderingEngine'
|
||||||
const {
|
const {
|
||||||
@@ -225,7 +221,7 @@ export default {
|
|||||||
activeTool: '',
|
activeTool: '',
|
||||||
imageType: ['image/jpeg', 'image/jpg', 'image/bmp', 'image/png'],
|
imageType: ['image/jpeg', 'image/jpg', 'image/bmp', 'image/png'],
|
||||||
loading: false,
|
loading: false,
|
||||||
isFitToWindowMode: true,
|
isFitToWindowMode: false,
|
||||||
trialId: null,
|
trialId: null,
|
||||||
activeName: '1',
|
activeName: '1',
|
||||||
tools: [],
|
tools: [],
|
||||||
@@ -235,8 +231,7 @@ export default {
|
|||||||
tip: [
|
tip: [
|
||||||
this.$t('DicomViewer:anonymous:after'),
|
this.$t('DicomViewer:anonymous:after'),
|
||||||
this.$t('DicomViewer:anonymous:before')
|
this.$t('DicomViewer:anonymous:before')
|
||||||
],
|
]
|
||||||
zipImg
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|||||||
@@ -42,9 +42,6 @@
|
|||||||
<el-image v-else-if="
|
<el-image v-else-if="
|
||||||
!!~k.FileType.indexOf('mp4')
|
!!~k.FileType.indexOf('mp4')
|
||||||
" style="width: 100%; height: 100%" :src="mp4" fit="contain" crossorigin="anonymous" />
|
" style="width: 100%; height: 100%" :src="mp4" fit="contain" crossorigin="anonymous" />
|
||||||
<el-image v-else-if="
|
|
||||||
!!~k.FileType.indexOf('zip')
|
|
||||||
" style="width: 100%; height: 100%" :src="zipImg" fit="contain" crossorigin="anonymous" />
|
|
||||||
</div>
|
</div>
|
||||||
<div class="file-text" :title="k.FileName">
|
<div class="file-text" :title="k.FileName">
|
||||||
{{ k.FileName }}
|
{{ k.FileName }}
|
||||||
@@ -76,7 +73,6 @@ import { getNoneDicomStudyList, setNodicomStudyState } from '@/api/trials'
|
|||||||
import FileNameSorter from "@/utils/customSort"
|
import FileNameSorter from "@/utils/customSort"
|
||||||
import pdf from '@/assets/pdf.png'
|
import pdf from '@/assets/pdf.png'
|
||||||
import mp4 from '@/assets/mp4.png'
|
import mp4 from '@/assets/mp4.png'
|
||||||
import zipImg from '@/assets/zip.jpg'
|
|
||||||
export default {
|
export default {
|
||||||
name: 'StudyList',
|
name: 'StudyList',
|
||||||
props: {
|
props: {
|
||||||
@@ -102,7 +98,6 @@ export default {
|
|||||||
studyList: [],
|
studyList: [],
|
||||||
pdf,
|
pdf,
|
||||||
mp4,
|
mp4,
|
||||||
zipImg,
|
|
||||||
BodyPart: {},
|
BodyPart: {},
|
||||||
subjectVisitId: '',
|
subjectVisitId: '',
|
||||||
studyId: '',
|
studyId: '',
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="share-image-container">
|
<div class="share-image-container">
|
||||||
<div class="share-image-banner">
|
<div class="share-image-banner">
|
||||||
<h2 style="text-align:center;">IRC Management System</h2>
|
<h2 style="text-align:center;">HASC Management System</h2>
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<h4>请输入提取码:</h4>
|
<h4>请输入提取码:</h4>
|
||||||
<el-form ref="validateForm" :inline="true" :rules="rules" :model="form">
|
<el-form ref="validateForm" :inline="true" :rules="rules" :model="form">
|
||||||
|
|||||||
@@ -302,13 +302,13 @@ export default {
|
|||||||
// 发件人邮箱地址
|
// 发件人邮箱地址
|
||||||
"FromEmail": "test@extimaging.com",
|
"FromEmail": "test@extimaging.com",
|
||||||
// 发件人显示名称
|
// 发件人显示名称
|
||||||
"FromName": "Test IRC Imaging System",
|
"FromName": "Test HASC Imaging System",
|
||||||
//SMTP授权码
|
//SMTP授权码
|
||||||
"AuthorizationCode": "SHzyyl2021",
|
"AuthorizationCode": "SHzyyl2021",
|
||||||
//系统对外访问地址
|
//系统对外访问地址
|
||||||
"SiteUrl": "http://irc.test.extimaging.com/login",
|
"SiteUrl": "http://irc.test.extimaging.com/login",
|
||||||
//系统简称-致性核查使用
|
//系统简称-致性核查使用
|
||||||
"SystemShortName": "IRC",
|
"SystemShortName": "HASC",
|
||||||
// 组织英文名称-添加用户默认值
|
// 组织英文名称-添加用户默认值
|
||||||
"OrganizationName": "ExtImaging",
|
"OrganizationName": "ExtImaging",
|
||||||
// 组织中文名称
|
// 组织中文名称
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ export default {
|
|||||||
updateUser(this.user)
|
updateUser(this.user)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
this.isDisabled = false
|
this.isDisabled = false
|
||||||
this.$message.success(this.$t("common:message:updatedSuccessfully"))
|
this.$message.success('Updated successfully')
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
this.isDisabled = false
|
this.isDisabled = false
|
||||||
@@ -190,7 +190,7 @@ export default {
|
|||||||
this.user.Id = res.Result.Id
|
this.user.Id = res.Result.Id
|
||||||
this.user.UserCode = res.Result.UserCode
|
this.user.UserCode = res.Result.UserCode
|
||||||
this.$emit('getUserId', res.Result.Id)
|
this.$emit('getUserId', res.Result.Id)
|
||||||
this.$message.success(this.$t("common:message:addedSuccessfully"))
|
this.$message.success('Added successfully')
|
||||||
this.$router.push({ path: '/system/user/list' })
|
this.$router.push({ path: '/system/user/list' })
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
@@ -308,63 +308,63 @@ export default {
|
|||||||
UserWorkLanguage: [
|
UserWorkLanguage: [
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: this.$t("common:ruleMessage:select"),
|
message: 'Please Select',
|
||||||
trigger: ['blur', 'change'],
|
trigger: ['blur', 'change'],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
Roles: [
|
Roles: [
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: this.$t("common:ruleMessage:select"),
|
message: 'Please Select',
|
||||||
trigger: ['blur', 'change'],
|
trigger: ['blur', 'change'],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
IsZhiZhun: [
|
IsZhiZhun: [
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: this.$t("common:ruleMessage:select"),
|
message: 'Please Select',
|
||||||
trigger: ['blur', 'change'],
|
trigger: ['blur', 'change'],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
OrganizationName: [
|
OrganizationName: [
|
||||||
{ required: true, message: this.$t("common:ruleMessage:specify"), trigger: 'blur' },
|
{ required: true, message: 'Please specify', trigger: 'blur' },
|
||||||
],
|
],
|
||||||
LastName: [
|
LastName: [
|
||||||
{ required: true, message: this.$t("common:ruleMessage:specify"), trigger: 'blur' },
|
{ required: true, message: 'Please specify', trigger: 'blur' },
|
||||||
{ max: 50, message: this.$t("trials:researchForm:formRule:maxLength") },
|
{ max: 50, message: 'The maximum length is 50' },
|
||||||
],
|
],
|
||||||
FirstName: [
|
FirstName: [
|
||||||
{ required: true, message: this.$t("common:ruleMessage:specify"), trigger: 'blur' },
|
{ required: true, message: 'Please specify', trigger: 'blur' },
|
||||||
{ max: 50, message: this.$t("trials:researchForm:formRule:maxLength") },
|
{ max: 50, message: 'The maximum length is 50' },
|
||||||
],
|
],
|
||||||
Phone: [
|
Phone: [
|
||||||
{
|
{
|
||||||
max: 20,
|
max: 20,
|
||||||
min: 7,
|
min: 7,
|
||||||
message: this.$t("system:userInfo:ruleMessage:length7to20"),
|
message: 'The length is 7 to 20',
|
||||||
trigger: ['blur'],
|
trigger: ['blur'],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
EMail: [
|
EMail: [
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: this.$t("common:ruleMessage:specify"),
|
message: 'Please input the email address',
|
||||||
trigger: 'blur',
|
trigger: 'blur',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// type: 'email',
|
// type: 'email',
|
||||||
pattern: new RegExp(this.$reg().EmailRegexStr),
|
pattern: new RegExp(this.$reg().EmailRegexStr),
|
||||||
message: this.$t("trials:site:ruleMessage:correctEmail"),
|
message: 'Please input the correct email address',
|
||||||
trigger: ['blur'],
|
trigger: ['blur'],
|
||||||
},
|
},
|
||||||
{ max: 50, message: this.$t("trials:researchForm:formRule:maxLength") },
|
{ max: 50, message: 'The maximum length is 50' },
|
||||||
],
|
],
|
||||||
Sex: [{ required: true, message: this.$t("common:ruleMessage:specify"), trigger: 'blur' }],
|
Sex: [{ required: true, message: 'Please specify', trigger: 'blur' }],
|
||||||
Status: [
|
Status: [
|
||||||
{ required: true, message: this.$t("common:ruleMessage:specify"), trigger: 'blur' },
|
{ required: true, message: 'Please specify', trigger: 'blur' },
|
||||||
],
|
],
|
||||||
DepartmentName: [{ max: 50, message: this.$t("trials:researchForm:formRule:maxLength") }],
|
DepartmentName: [{ max: 50, message: 'The maximum length is 50' }],
|
||||||
PositionName: [{ max: 50, message: this.$t("trials:researchForm:formRule:maxLength") }],
|
PositionName: [{ max: 50, message: 'The maximum length is 50' }],
|
||||||
},
|
},
|
||||||
userTypeOptions: [],
|
userTypeOptions: [],
|
||||||
isDisabled: false,
|
isDisabled: false,
|
||||||
|
|||||||
@@ -1675,10 +1675,7 @@ export default {
|
|||||||
cornerstone.getDefaultViewportForImage(this.canvas, image)
|
cornerstone.getDefaultViewportForImage(this.canvas, image)
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
getInfo() {
|
|
||||||
var image = cornerstone.getImage(this.canvas)
|
|
||||||
return image
|
|
||||||
},
|
|
||||||
toggleDicomInfo() {
|
toggleDicomInfo() {
|
||||||
this.toolState.dicomInfoVisible = !this.toolState.dicomInfoVisible
|
this.toolState.dicomInfoVisible = !this.toolState.dicomInfoVisible
|
||||||
if (this.toolState.dicomInfoVisible) {
|
if (this.toolState.dicomInfoVisible) {
|
||||||
|
|||||||
@@ -219,8 +219,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
|
||||||
<el-popover v-model="keySeriesPopoverVisible" placement="bottom" trigger="click"
|
<el-popover v-model="keySeriesPopoverVisible" placement="bottom" trigger="click" popper-class="key-series-popper"
|
||||||
popper-class="key-series-popper" @show="showKeySeriesPanel">
|
@show="showKeySeriesPanel">
|
||||||
<ul class="key-series-list">
|
<ul class="key-series-list">
|
||||||
<li v-if="keyStack && keyStack.taskBlindName" class="key-series-header">
|
<li v-if="keyStack && keyStack.taskBlindName" class="key-series-header">
|
||||||
<div class="key-series-header-top">
|
<div class="key-series-header-top">
|
||||||
@@ -422,7 +422,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-tooltip v-if="trialCriterion.ImageUploadEnum > 0"
|
<el-tooltip v-if="trialCriterion.ImageUploadEnum > 0 && currentReadingTaskState < 2" v-hasPermi="['role:ir']"
|
||||||
class="item" effect="dark" :content="$t('trials:reading:button:upload')" placement="bottom">
|
class="item" effect="dark" :content="$t('trials:reading:button:upload')" placement="bottom">
|
||||||
<div class="tool-wrapper">
|
<div class="tool-wrapper">
|
||||||
<div class="icon" @click.prevent="openUploadImage('upload')">
|
<div class="icon" @click.prevent="openUploadImage('upload')">
|
||||||
@@ -431,7 +431,15 @@
|
|||||||
<div class="text">{{ $t('trials:reading:button:upload') }}</div>
|
<div class="text">{{ $t('trials:reading:button:upload') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip v-if="trialCriterion.ImageDownloadEnum > 0" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
<el-tooltip v-if="trialCriterion.ImageDownloadEnum > 0" v-hasPermi="[
|
||||||
|
'role:ir',
|
||||||
|
'role:mim',
|
||||||
|
'role:mc',
|
||||||
|
'role:pm',
|
||||||
|
'role:apm',
|
||||||
|
'role:ea',
|
||||||
|
'role:qa',
|
||||||
|
]" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
||||||
<div class="tool-wrapper">
|
<div class="tool-wrapper">
|
||||||
<div class="icon" @click.prevent="openUploadImage('download')">
|
<div class="icon" @click.prevent="openUploadImage('download')">
|
||||||
<i class="el-icon-download svg-icon" />
|
<i class="el-icon-download svg-icon" />
|
||||||
@@ -439,10 +447,6 @@
|
|||||||
<div class="text">{{ $t('trials:reading:button:download') }}</div>
|
<div class="text">{{ $t('trials:reading:button:download') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<label for="Replacement" style="color: #fff;cursor: pointer;">
|
|
||||||
替换
|
|
||||||
</label>
|
|
||||||
<input type="file" id="Replacement" @change="beginScanFiles($event, 'replace')" style="display: none;">
|
|
||||||
<div style="margin-left:auto;">
|
<div style="margin-left:auto;">
|
||||||
<div style="padding:5px;display: flex;">
|
<div style="padding:5px;display: flex;">
|
||||||
<!-- 手册 -->
|
<!-- 手册 -->
|
||||||
@@ -592,7 +596,7 @@
|
|||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<!-- 其他 -->
|
<!-- 其他 -->
|
||||||
<el-tab-pane :label="$t('trials:reading:tab:others')" name="3">
|
<el-tab-pane :label="$t('trials:reading:tab:others')" name="3">
|
||||||
<Others v-if="activeName === '3'" :imageToolType="1" />
|
<Others v-if="activeName === '3'" :imageToolType="1"/>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
|
|
||||||
@@ -704,11 +708,10 @@
|
|||||||
</el-dialog>
|
</el-dialog>
|
||||||
<upload-dicom-and-nonedicom v-if="uploadImageVisible" :subject-id="uploadSubjectId"
|
<upload-dicom-and-nonedicom v-if="uploadImageVisible" :subject-id="uploadSubjectId"
|
||||||
:subject-code="uploadSubjectCode" :criterion="uploadTrialCriterion" :visible.sync="uploadImageVisible"
|
:subject-code="uploadSubjectCode" :criterion="uploadTrialCriterion" :visible.sync="uploadImageVisible"
|
||||||
:visit-task-id="taskId" :is-reading-task-view-in-order="isReadingTaskViewInOrder" :isReading="true"
|
:visit-task-id="taskId" :is-reading-task-view-in-order="isReadingTaskViewInOrder" />
|
||||||
:StudyInstanceUID="StudyInstanceUID" />
|
|
||||||
<download-dicom-and-nonedicom v-if="downloadImageVisible" :subject-id="uploadSubjectId"
|
<download-dicom-and-nonedicom v-if="downloadImageVisible" :subject-id="uploadSubjectId"
|
||||||
:subject-code="uploadSubjectCode" :criterion="uploadTrialCriterion" :task-id="taskId"
|
:subject-code="uploadSubjectCode" :criterion="uploadTrialCriterion" :task-id="taskId"
|
||||||
:visible.sync="downloadImageVisible" :isReading="true" />
|
:visible.sync="downloadImageVisible" />
|
||||||
<!-- 签名框 -->
|
<!-- 签名框 -->
|
||||||
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px"
|
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px"
|
||||||
custom-class="base-dialog-wrapper">
|
custom-class="base-dialog-wrapper">
|
||||||
@@ -764,8 +767,6 @@ import const_ from '@/const/sign-code'
|
|||||||
import { changeURLStatic } from '@/utils/history.js'
|
import { changeURLStatic } from '@/utils/history.js'
|
||||||
import SystemInfo from "@/utils/systemInfo";
|
import SystemInfo from "@/utils/systemInfo";
|
||||||
import md5 from 'js-md5'
|
import md5 from 'js-md5'
|
||||||
import { changeFile } from "./upload.js"
|
|
||||||
import dcmjs from '@/utils/dcmUpload/dcmjs'
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DicomViewer',
|
name: 'DicomViewer',
|
||||||
components: {
|
components: {
|
||||||
@@ -844,10 +845,6 @@ export default {
|
|||||||
default() {
|
default() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
},
|
|
||||||
Loading: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -981,10 +978,7 @@ export default {
|
|||||||
fullScreenWidth: window.innerWidth - 570 + 'px',
|
fullScreenWidth: window.innerWidth - 570 + 'px',
|
||||||
fullScreenHeight: window.innerHeight - 130 + 'px',
|
fullScreenHeight: window.innerHeight - 130 + 'px',
|
||||||
|
|
||||||
ManualsClose: false,
|
ManualsClose: false
|
||||||
fileKey: null,
|
|
||||||
file: null,
|
|
||||||
StudyInstanceUID: null
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -1219,12 +1213,6 @@ export default {
|
|||||||
this.AspectRatio = windowWidth / windowHeight
|
this.AspectRatio = windowWidth / windowHeight
|
||||||
};
|
};
|
||||||
this.getSystemInfoReading()
|
this.getSystemInfoReading()
|
||||||
DicomEvent.$on('sendStudyFile', (study) => {
|
|
||||||
let image = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].getInfo()
|
|
||||||
study.visitTaskList = this.visitTaskList
|
|
||||||
this.$emit("update:Loading", true)
|
|
||||||
changeFile('IR', this.file, study, image)
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
DicomEvent.$off('updateImage')
|
DicomEvent.$off('updateImage')
|
||||||
@@ -1248,11 +1236,6 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
beginScanFiles(e, key) {
|
|
||||||
this.fileKey = key
|
|
||||||
this.file = e.target.files[0]
|
|
||||||
DicomEvent.$emit('getStudyFile')
|
|
||||||
},
|
|
||||||
handleReadingChart(e) {
|
handleReadingChart(e) {
|
||||||
this.$emit('handleReadingChart', e)
|
this.$emit('handleReadingChart', e)
|
||||||
},
|
},
|
||||||
@@ -1300,10 +1283,6 @@ export default {
|
|||||||
if (idx > -1) {
|
if (idx > -1) {
|
||||||
this.taskId = this.visitTaskList[idx].VisitTaskId
|
this.taskId = this.visitTaskList[idx].VisitTaskId
|
||||||
}
|
}
|
||||||
let image = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].getInfo()
|
|
||||||
let dataset = dcmjs.data.DicomMessage.readFile(image.data.byteArray.buffer)
|
|
||||||
this.StudyInstanceUID = dataset.dict['0020000D'].Value[0]
|
|
||||||
dataset = null
|
|
||||||
this.uploadSubjectCode = localStorage.getItem("subjectCode")
|
this.uploadSubjectCode = localStorage.getItem("subjectCode")
|
||||||
this.uploadSubjectId = localStorage.getItem("subjectId")
|
this.uploadSubjectId = localStorage.getItem("subjectId")
|
||||||
this.uploadTrialCriterion = this.trialCriterion
|
this.uploadTrialCriterion = this.trialCriterion
|
||||||
@@ -1472,7 +1451,7 @@ export default {
|
|||||||
// } catch (err) {
|
// } catch (err) {
|
||||||
// console.error(err)
|
// console.error(err)
|
||||||
// }
|
// }
|
||||||
const series = this.getSeriesInfoByMark(visitTaskId, { lesionName: kf.MarkName })
|
const series = this.getSeriesInfoByMark(visitTaskId, {lesionName: kf.MarkName})
|
||||||
if (!series) return
|
if (!series) return
|
||||||
this.loadImageStack(series)
|
this.loadImageStack(series)
|
||||||
},
|
},
|
||||||
@@ -2517,7 +2496,7 @@ export default {
|
|||||||
this.readingTaskState = 2
|
this.readingTaskState = 2
|
||||||
await store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 })
|
await store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 })
|
||||||
await store.dispatch('reading/setCurrentReadingTaskState', 2)
|
await store.dispatch('reading/setCurrentReadingTaskState', 2)
|
||||||
const res = await getAutoCutNextTask({ imageToolType: 1 })
|
const res = await getAutoCutNextTask({imageToolType: 1})
|
||||||
var isAutoTask = res.Result.AutoCutNextTask
|
var isAutoTask = res.Result.AutoCutNextTask
|
||||||
if (isAutoTask) {
|
if (isAutoTask) {
|
||||||
window.location.reload()
|
window.location.reload()
|
||||||
@@ -2630,7 +2609,7 @@ export default {
|
|||||||
await this.$confirm(this.$t('trials:lugano:fusionDialog:message:checkSeries'), this.$t('trials:lugano:fusionDialog:warning'), {
|
await this.$confirm(this.$t('trials:lugano:fusionDialog:message:checkSeries'), this.$t('trials:lugano:fusionDialog:warning'), {
|
||||||
showCancelButton: false,
|
showCancelButton: false,
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
}).catch(() => { })
|
}).catch(() => {})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (this.ctSeriesInfo.instanceCount > 400) {
|
if (this.ctSeriesInfo.instanceCount > 400) {
|
||||||
|
|||||||
@@ -33,21 +33,17 @@
|
|||||||
<div v-for="item in qs.Childrens" :key="item.Id">
|
<div v-for="item in qs.Childrens" :key="item.Id">
|
||||||
<div v-if="item.Type === 'basicTable'" class="flex-row" style="margin:3px 0;">
|
<div v-if="item.Type === 'basicTable'" class="flex-row" style="margin:3px 0;">
|
||||||
<div class="title">{{ item.QuestionName }}</div>
|
<div class="title">{{ item.QuestionName }}</div>
|
||||||
<div v-if="item.LesionType === 104">
|
<div v-if="item.LesionType === 104 && readingTaskState < 2">
|
||||||
<div
|
<div class="add-icon" @click.prevent="downloadTpl">
|
||||||
class="add-icon" @click.prevent="downloadTpl" v-if="readingTaskState < 2">
|
|
||||||
<i class="el-icon-download" />
|
<i class="el-icon-download" />
|
||||||
</div>
|
</div>
|
||||||
<div class="add-icon" style="margin: 0 5px;"
|
<div class="add-icon" style="margin: 0 5px;"
|
||||||
@click.prevent="uploadTpl(item.LesionType, item.QuestionName)" v-if="readingTaskState < 2">
|
@click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
|
||||||
<i class="el-icon-upload2" />
|
<i class="el-icon-upload2" />
|
||||||
</div>
|
</div>
|
||||||
<div class="add-icon" @click.prevent="handleAddOrEdit('add', item)" v-if="readingTaskState < 2">
|
<div class="add-icon" @click.prevent="handleAddOrEdit('add', item)">
|
||||||
<i class="el-icon-plus" />
|
<i class="el-icon-plus" />
|
||||||
</div>
|
</div>
|
||||||
<div class="add-icon" @click.prevent="handleView(item)">
|
|
||||||
<i class="el-icon-view" />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -226,7 +222,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import { saveTaskQuestion, submitTableQuestion, deleteReadingRowAnswer } from '@/api/trials'
|
import { saveTaskQuestion, submitTableQuestion, deleteReadingRowAnswer } from '@/api/trials'
|
||||||
import { resetReadingTask, getIVUSTemplate } from '@/api/reading'
|
import { resetReadingTask, getIVUSTemplate } from '@/api/reading'
|
||||||
import { getToken } from '@/utils/auth'
|
|
||||||
import DicomEvent from './../DicomEvent'
|
import DicomEvent from './../DicomEvent'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
@@ -289,8 +284,7 @@ export default {
|
|||||||
sRoiEndDistanceId: '',
|
sRoiEndDistanceId: '',
|
||||||
sRoiDistanceId: '',
|
sRoiDistanceId: '',
|
||||||
rowSaveLoadingMap: {},
|
rowSaveLoadingMap: {},
|
||||||
dialogSaveLoading: false,
|
dialogSaveLoading: false
|
||||||
childWindows: []
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -330,13 +324,11 @@ export default {
|
|||||||
DicomEvent.$on('refreshQuestions', _ => {
|
DicomEvent.$on('refreshQuestions', _ => {
|
||||||
this.refreshQuestions()
|
this.refreshQuestions()
|
||||||
})
|
})
|
||||||
window.addEventListener('beforeunload', this.closeAllChildWindows)
|
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
DicomEvent.$off('setCollapseActive')
|
DicomEvent.$off('setCollapseActive')
|
||||||
DicomEvent.$off('getUnSaveTarget')
|
DicomEvent.$off('getUnSaveTarget')
|
||||||
DicomEvent.$off('refreshQuestions')
|
DicomEvent.$off('refreshQuestions')
|
||||||
window.removeEventListener('beforeunload', this.closeAllChildWindows)
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleReadingChart(e) {
|
handleReadingChart(e) {
|
||||||
@@ -747,24 +739,6 @@ export default {
|
|||||||
this.addOrEdit.visible = true
|
this.addOrEdit.visible = true
|
||||||
this.addOrEdit.lesionType = row.LesionType
|
this.addOrEdit.lesionType = row.LesionType
|
||||||
},
|
},
|
||||||
handleView(item) {
|
|
||||||
localStorage.setItem('taskBlindName', this.taskBlindName)
|
|
||||||
localStorage.setItem('isReadingShowSubjectInfo', this.isReadingShowSubjectInfo)
|
|
||||||
let token = getToken()
|
|
||||||
let routeData = this.$router.resolve({ path: `/ecrfList?trialId=${this.$route.query.trialId}&visitTaskId=${this.visitTaskId}&questionId=${item.Id}&TokenKey=${token}` })
|
|
||||||
const win = window.open(routeData.href, '_blank')
|
|
||||||
if (win) {
|
|
||||||
this.childWindows.push(win)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
closeAllChildWindows() {
|
|
||||||
this.childWindows.forEach(win => {
|
|
||||||
if (win && !win.closed) {
|
|
||||||
win.close()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.childWindows = []
|
|
||||||
},
|
|
||||||
async saveFormData() {
|
async saveFormData() {
|
||||||
if (this.dialogSaveLoading) return
|
if (this.dialogSaveLoading) return
|
||||||
this.dialogSaveLoading = true
|
this.dialogSaveLoading = true
|
||||||
|
|||||||
@@ -33,20 +33,17 @@
|
|||||||
<div v-for="item in qs.Childrens" :key="item.Id">
|
<div v-for="item in qs.Childrens" :key="item.Id">
|
||||||
<div v-if="item.Type === 'basicTable'" class="flex-row" style="margin:3px 0;">
|
<div v-if="item.Type === 'basicTable'" class="flex-row" style="margin:3px 0;">
|
||||||
<div class="title">{{ item.QuestionName }}</div>
|
<div class="title">{{ item.QuestionName }}</div>
|
||||||
<div v-if="(item.LesionType === 104)">
|
<div v-if="(item.LesionType === 104) && readingTaskState < 2">
|
||||||
<div class="add-icon" @click.prevent="downloadTpl(item.LesionType)" v-if="readingTaskState < 2">
|
<div class="add-icon" @click.prevent="downloadTpl(item.LesionType)">
|
||||||
<i class="el-icon-download" />
|
<i class="el-icon-download" />
|
||||||
</div>
|
</div>
|
||||||
<div class="add-icon" style="margin: 0 5px;"
|
<div class="add-icon" style="margin: 0 5px;"
|
||||||
@click.prevent="uploadTpl(item.LesionType, item.QuestionName)" v-if="readingTaskState < 2">
|
@click.prevent="uploadTpl(item.LesionType, item.QuestionName)">
|
||||||
<i class="el-icon-upload2" />
|
<i class="el-icon-upload2" />
|
||||||
</div>
|
</div>
|
||||||
<div class="add-icon" @click.prevent="handleAddOrEdit('add', item)" v-if="readingTaskState < 2">
|
<div class="add-icon" @click.prevent="handleAddOrEdit('add', item)">
|
||||||
<i class="el-icon-plus" />
|
<i class="el-icon-plus" />
|
||||||
</div>
|
</div>
|
||||||
<div class="add-icon" @click.prevent="handleView(item)">
|
|
||||||
<i class="el-icon-view" />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -227,7 +224,6 @@ import { saveTaskQuestion, submitTableQuestion, deleteReadingRowAnswer } from '@
|
|||||||
import { resetReadingTask, getOCTFCTTemplate, getOCTLipidAngleTemplate } from '@/api/reading'
|
import { resetReadingTask, getOCTFCTTemplate, getOCTLipidAngleTemplate } from '@/api/reading'
|
||||||
import DicomEvent from './../DicomEvent'
|
import DicomEvent from './../DicomEvent'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { getToken } from '@/utils/auth'
|
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import Questions from './../Questions'
|
import Questions from './../Questions'
|
||||||
import QuestionTableFormItem from './QuestionTableFormItem'
|
import QuestionTableFormItem from './QuestionTableFormItem'
|
||||||
@@ -289,8 +285,7 @@ export default {
|
|||||||
sRoiEndDistanceId: '',
|
sRoiEndDistanceId: '',
|
||||||
sRoiDistanceId: '',
|
sRoiDistanceId: '',
|
||||||
rowSaveLoadingMap: {},
|
rowSaveLoadingMap: {},
|
||||||
dialogSaveLoading: false,
|
dialogSaveLoading: false
|
||||||
childWindows: []
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -330,13 +325,11 @@ export default {
|
|||||||
DicomEvent.$on('refreshQuestions', _ => {
|
DicomEvent.$on('refreshQuestions', _ => {
|
||||||
this.refreshQuestions()
|
this.refreshQuestions()
|
||||||
})
|
})
|
||||||
window.addEventListener('beforeunload', this.closeAllChildWindows)
|
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
DicomEvent.$off('setCollapseActive')
|
DicomEvent.$off('setCollapseActive')
|
||||||
DicomEvent.$off('getUnSaveTarget')
|
DicomEvent.$off('getUnSaveTarget')
|
||||||
DicomEvent.$off('refreshQuestions')
|
DicomEvent.$off('refreshQuestions')
|
||||||
window.removeEventListener('beforeunload', this.closeAllChildWindows)
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleReadingChart(e) {
|
handleReadingChart(e) {
|
||||||
@@ -762,27 +755,6 @@ export default {
|
|||||||
this.addOrEdit.visible = true
|
this.addOrEdit.visible = true
|
||||||
this.addOrEdit.lesionType = row.LesionType
|
this.addOrEdit.lesionType = row.LesionType
|
||||||
},
|
},
|
||||||
handleView(item) {
|
|
||||||
if (this.openWindow) {
|
|
||||||
this.openWindow.close()
|
|
||||||
}
|
|
||||||
localStorage.setItem('taskBlindName', this.taskBlindName)
|
|
||||||
localStorage.setItem('isReadingShowSubjectInfo', this.isReadingShowSubjectInfo)
|
|
||||||
let token = getToken()
|
|
||||||
let routeData = this.$router.resolve({ path: `/ecrfList?trialId=${this.$route.query.trialId}&visitTaskId=${this.visitTaskId}&questionId=${item.Id}&TokenKey=${token}` })
|
|
||||||
const win = window.open(routeData.href, '_blank')
|
|
||||||
if (win) {
|
|
||||||
this.childWindows.push(win)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
closeAllChildWindows() {
|
|
||||||
this.childWindows.forEach(win => {
|
|
||||||
if (win && !win.closed) {
|
|
||||||
win.close()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.childWindows = []
|
|
||||||
},
|
|
||||||
async saveFormData() {
|
async saveFormData() {
|
||||||
if (this.dialogSaveLoading) return
|
if (this.dialogSaveLoading) return
|
||||||
this.dialogSaveLoading = true
|
this.dialogSaveLoading = true
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="dicom-container" v-loading="loading">
|
<div class="dicom-container">
|
||||||
<div :class="{ 'dicom-list': true, studyHide: !studyShow }">
|
<div :class="{ 'dicom-list': true, studyHide: !studyShow }">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="related-study-wrapper">
|
<div class="related-study-wrapper">
|
||||||
@@ -27,8 +27,7 @@
|
|||||||
class="study-wrapper">
|
class="study-wrapper">
|
||||||
<StudyList v-if="selectArr.includes(s.VisitTaskId)" :ref="s.VisitTaskId" :visit-task-id="s.VisitTaskId"
|
<StudyList v-if="selectArr.includes(s.VisitTaskId)" :ref="s.VisitTaskId" :visit-task-id="s.VisitTaskId"
|
||||||
:trial-id="trialId" :subject-visit-id="s.VisitId" :task-blind-name="s.TaskBlindName"
|
:trial-id="trialId" :subject-visit-id="s.VisitId" :task-blind-name="s.TaskBlindName"
|
||||||
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
:is-reading-show-subject-info="isReadingShowSubjectInfo" :is-reading-task-view-in-order="isReadingTaskViewInOrder" @loadImageStack="loadImageStack"
|
||||||
:is-reading-task-view-in-order="isReadingTaskViewInOrder" @loadImageStack="loadImageStack"
|
|
||||||
@previewNoneDicoms="previewNoneDicoms" />
|
@previewNoneDicoms="previewNoneDicoms" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -39,7 +38,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="dicom-viewer">
|
<div class="dicom-viewer">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<DicomViewer v-if="activeTaskVisitId" ref="dicomViewer" :is-show="isShow" :Loading.sync="loading"
|
<DicomViewer v-if="activeTaskVisitId" ref="dicomViewer" :is-show="isShow"
|
||||||
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
|
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
|
||||||
:is-exists-clinical-data="isExistsClinicalData" :is-exists-no-dicom-file="isExistsNoDicomFile"
|
:is-exists-clinical-data="isExistsClinicalData" :is-exists-no-dicom-file="isExistsNoDicomFile"
|
||||||
:is-reading-show-subject-info="isReadingShowSubjectInfo" :studyShow="studyShow"
|
:is-reading-show-subject-info="isReadingShowSubjectInfo" :studyShow="studyShow"
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading" class="study-wrapper">
|
<div v-loading="loading" class="study-wrapper">
|
||||||
<h4 v-if="isReadingShowSubjectInfo"
|
<h4 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;text-align: center;background-color: #4c4c4c;">
|
||||||
style="color: #ddd;padding: 5px 0px;margin: 0;text-align: center;background-color: #4c4c4c;">
|
|
||||||
{{ subjectCode }}
|
{{ subjectCode }}
|
||||||
</h4>
|
</h4>
|
||||||
<h4 v-if="isReadingShowSubjectInfo"
|
<h4 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;text-align: center;background-color: #4c4c4c;margin-bottom: 5px;">
|
||||||
style="color: #ddd;padding: 5px 0px;margin: 0;text-align: center;background-color: #4c4c4c;margin-bottom: 5px;">
|
|
||||||
{{ taskBlindName }}
|
{{ taskBlindName }}
|
||||||
</h4>
|
</h4>
|
||||||
<div class="ps">
|
<div class="ps">
|
||||||
@@ -16,18 +14,21 @@
|
|||||||
<!-- 关键序列 -->
|
<!-- 关键序列 -->
|
||||||
{{ $t('trials:reading:title:keySeries') }}
|
{{ $t('trials:reading:title:keySeries') }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="dicom-desc" style="white-space: normal;">
|
<div
|
||||||
|
v-else
|
||||||
|
class="dicom-desc"
|
||||||
|
style="white-space: normal;"
|
||||||
|
>
|
||||||
<div>
|
<div>
|
||||||
<div style="text-overflow: ellipsis;overflow: hidden;">
|
<div style="text-overflow: ellipsis;overflow: hidden;">
|
||||||
|
|
||||||
<span v-if="taskInfo && taskInfo.IsShowStudyName && study.StudyName" :title="study.StudyName">
|
<span v-if="taskInfo && taskInfo.IsShowStudyName && study.StudyName" :title="study.StudyName">
|
||||||
{{ study.StudyName }}
|
{{study.StudyName}}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span class="study-meta-line" :title="study.Modalities">
|
<span class="study-meta-line" :title="study.Modalities">
|
||||||
<span v-if="isReadingTaskViewInOrder !== 0" class="study-code" :title="study.StudyCode">{{
|
<span v-if="isReadingTaskViewInOrder !== 0" class="study-code" :title="study.StudyCode">{{ study.StudyCode }}</span>
|
||||||
study.StudyCode }}</span>
|
|
||||||
<span class="study-modality">{{ study.Modalities }}({{ study.SeriesCount }})</span>
|
<span class="study-modality">{{ study.Modalities }}({{ study.SeriesCount }})</span>
|
||||||
<span class="patient-info" v-if="['PT、CT', 'CT、PT', 'PET-CT'].includes(study.Modalities)">
|
<span class="patient-info" v-if="['PT、CT', 'CT、PT', 'PET-CT'].includes(study.Modalities)">
|
||||||
<el-popover placement="right-start" trigger="hover" popper-class="patient-info-popper">
|
<el-popover placement="right-start" trigger="hover" popper-class="patient-info-popper">
|
||||||
@@ -62,57 +63,67 @@
|
|||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="study.Description" class="study-desc-text" :title="study.Description">{{ study.Description }}
|
<div v-if="study.Description" class="study-desc-text" :title="study.Description">{{ study.Description }}</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div class="series">
|
<div class="series">
|
||||||
<div v-for="(series, i) in study.SeriesList" :key="i" style="position:relative;margin-top:5px;"
|
<div
|
||||||
series-type="current" @click="showSeriesImage(index, i, series)">
|
v-for="(series, i) in study.SeriesList"
|
||||||
|
:key="i"
|
||||||
|
style="position:relative;margin-top:5px;"
|
||||||
|
series-type="current"
|
||||||
|
@click="showSeriesImage(index,i,series)"
|
||||||
|
>
|
||||||
|
|
||||||
<div :class="{ 'series-active': i == seriesIndex && index === studyIndex }" class="series-wrapper">
|
<div
|
||||||
<el-image class="image-preview" :src="series.previewImageUrl" fit="fill" crossorigin="anonymous" />
|
:class="{'series-active': i==seriesIndex && index === studyIndex}"
|
||||||
|
class="series-wrapper"
|
||||||
|
>
|
||||||
|
<el-image
|
||||||
|
class="image-preview"
|
||||||
|
:src="series.previewImageUrl"
|
||||||
|
fit="fill"
|
||||||
|
crossorigin="anonymous"
|
||||||
|
/>
|
||||||
<div class="image-desc">
|
<div class="image-desc">
|
||||||
<div class="flex-div">
|
<div class="flex-div">
|
||||||
<div style="width: 40px;display: flex;flex-direction: row;justify-content: space-between;">
|
<div style="width: 40px;display: flex;flex-direction: row;justify-content: space-between;">
|
||||||
<div v-if="!study.IsCriticalSequence">#{{ series.seriesNumber }}</div>
|
<div v-if="!study.IsCriticalSequence">#{{ series.seriesNumber }}</div>
|
||||||
<div
|
<div v-if="series.isDicom && series.prefetchInstanceCount<series.instanceCount * 100 && series.modality!== 'SR'">
|
||||||
v-if="series.isDicom && series.prefetchInstanceCount < series.instanceCount * 100 && series.modality !== 'SR'">
|
|
||||||
<!-- 下载 -->
|
<!-- 下载 -->
|
||||||
<el-tooltip v-if="!series.isLoading" class="item" effect="dark"
|
<el-tooltip v-if="!series.isLoading" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
||||||
: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>
|
||||||
<el-tooltip
|
<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">
|
||||||
v-else-if="series.isDicom && series.prefetchInstanceCount === 0 && series.modality !== 'SR'"
|
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
||||||
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)" />
|
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="series.isExistMutiFrames && series.instanceCount > 1">
|
<div v-if="series.isExistMutiFrames && series.instanceCount > 1">
|
||||||
<el-popover placement="right" trigger="hover" popper-class="instance_frame_wrapper">
|
<el-popover
|
||||||
|
placement="right"
|
||||||
|
trigger="hover"
|
||||||
|
popper-class="instance_frame_wrapper"
|
||||||
|
>
|
||||||
<div class="frame_list">
|
<div class="frame_list">
|
||||||
<div v-for="(instance, idx) in series.instanceInfoList" :key="instance.Id"
|
<div
|
||||||
class="frame_content" :class="{ 'frame_content_active': activeInstanceId === instance.Id }"
|
v-for="(instance, idx) in series.instanceInfoList"
|
||||||
:style="{ 'margin-bottom': idx < series.instanceInfoList.length - 1 ? '5px' : '0px' }"
|
:key="instance.Id"
|
||||||
@click.stop="showMultiFrames(index, series, i, instance)">
|
class="frame_content"
|
||||||
|
:class="{ 'frame_content_active': activeInstanceId === instance.Id }"
|
||||||
|
:style="{'margin-bottom':idx<series.instanceInfoList.length-1? '5px':'0px'}"
|
||||||
|
@click.stop="showMultiFrames(index,series, i, instance)"
|
||||||
|
>
|
||||||
<div>
|
<div>
|
||||||
<div>{{ instance.InstanceNumber }}</div>
|
<div>{{ instance.InstanceNumber }}</div>
|
||||||
<div>{{ `${instance.NumberOfFrames > 0 ? instance.KeyFramesList.length > 0 ?
|
<div>{{ `${instance.NumberOfFrames > 0 ? instance.KeyFramesList.length > 0 ? instance.KeyFramesList.length : instance.NumberOfFrames : 1} frame` }}</div>
|
||||||
instance.KeyFramesList.length : instance.NumberOfFrames : 1} frame` }}</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<i slot="reference" class="el-icon-connection"
|
<i slot="reference" class="el-icon-connection" style="font-size: 15px;cursor: pointer;color: #ffeb3b;" />
|
||||||
style="font-size: 15px;cursor: pointer;color: #ffeb3b;" />
|
|
||||||
</el-popover>
|
</el-popover>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -134,11 +145,9 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="flex-div">
|
<div class="flex-div">
|
||||||
<div
|
<div v-if="measureData && measureData.findIndex(v=>v.SeriesId === series.seriesId && v.MeasureData) > -1">
|
||||||
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')"
|
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:marked')" placement="right">
|
||||||
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;" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
|
||||||
@@ -146,10 +155,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div v-if="series.isDicom && series.prefetchInstanceCount>0 && series.prefetchInstanceCount<series.instanceCount * 100" style="width: 100%;">
|
||||||
v-if="series.isDicom && series.prefetchInstanceCount > 0 && series.prefetchInstanceCount < series.instanceCount * 100"
|
<el-progress
|
||||||
style="width: 100%;">
|
:percentage="parseInt((series.prefetchInstanceCount / series.instanceCount).toFixed(2))"
|
||||||
<el-progress :percentage="parseInt((series.prefetchInstanceCount / series.instanceCount).toFixed(2))" />
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -159,19 +168,24 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="sr-wrapper">
|
<div class="sr-wrapper">
|
||||||
<el-dialog :visible.sync="srDialogVisible"
|
<el-dialog
|
||||||
:custom-class="isSrFullscreen ? 'sr-full-dialog-container' : 'sr-dialog-container'" :show-close="false"
|
:visible.sync="srDialogVisible"
|
||||||
:close-on-click-modal="false" :fullscreen="isSrFullscreen">
|
: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">
|
<span slot="title" class="dialog-footer">
|
||||||
<div style="position: absolute;right: 20px;top: 10px;">
|
<div style="position: absolute;right: 20px;top: 10px;">
|
||||||
<svg-icon :icon-class="isSrFullscreen ? 'exit-fullscreen' : 'fullscreen'"
|
<svg-icon :icon-class="isSrFullscreen?'exit-fullscreen':'fullscreen'" style="cursor: pointer;font-size: 20px;color:#000;" @click="isSrFullscreen=!isSrFullscreen" />
|
||||||
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" />
|
||||||
<svg-icon icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;"
|
|
||||||
@click="srDialogVisible = false" />
|
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
<div style="height: 100%;margin:0;">
|
<div style="height: 100%;margin:0;">
|
||||||
<SrList v-if="srDialogVisible" :sr-info="srInfo" />
|
<SrList
|
||||||
|
v-if="srDialogVisible"
|
||||||
|
:sr-info="srInfo"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
@@ -282,9 +296,6 @@ export default {
|
|||||||
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
|
||||||
})
|
})
|
||||||
DicomEvent.$on("getStudyFile", () => {
|
|
||||||
DicomEvent.$emit('sendStudyFile', { studyList: this.studyList, studyIndex: this.studyIndex, seriesIndex: this.seriesIndex, visitTaskId: this.visitTaskId })
|
|
||||||
})
|
|
||||||
|
|
||||||
// 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)
|
||||||
@@ -309,7 +320,7 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
debounce(fn, delay) {
|
debounce(fn, delay) {
|
||||||
let timer = null
|
let timer = null
|
||||||
return function () {
|
return function() {
|
||||||
const context = this
|
const context = this
|
||||||
const args = arguments
|
const args = arguments
|
||||||
clearTimeout(timer)
|
clearTimeout(timer)
|
||||||
@@ -323,7 +334,7 @@ export default {
|
|||||||
// 初始化待渲染序列
|
// 初始化待渲染序列
|
||||||
this.getInitSeries().then((res) => {
|
this.getInitSeries().then((res) => {
|
||||||
requestPoolManager.startTaskTimer()
|
requestPoolManager.startTaskTimer()
|
||||||
res.map(async (item) => {
|
res.map(async(item) => {
|
||||||
// this.loadInitialImage(item)
|
// this.loadInitialImage(item)
|
||||||
const imageId = item.imageIds[item.imageIdIndex]
|
const imageId = item.imageIds[item.imageIdIndex]
|
||||||
const p = parseInt(new Date().getTime())
|
const p = parseInt(new Date().getTime())
|
||||||
@@ -445,8 +456,8 @@ export default {
|
|||||||
this.studyIndex = obj.studyIndex
|
this.studyIndex = obj.studyIndex
|
||||||
this.seriesIndex = obj.seriesIndex
|
this.seriesIndex = obj.seriesIndex
|
||||||
seriesList.push(obj.series)
|
seriesList.push(obj.series)
|
||||||
this.activeNames = [`${this.studyList[this.studyIndex].StudyId}`]
|
this.activeNames = [`${this.studyList[ this.studyIndex].StudyId}`]
|
||||||
this.studyList[obj.studyIndex].SeriesList[obj.seriesIndex].isFirstRender = true
|
this.studyList[ obj.studyIndex].SeriesList[obj.seriesIndex].isFirstRender = true
|
||||||
} else {
|
} else {
|
||||||
if (this.studyList.length > 0) {
|
if (this.studyList.length > 0) {
|
||||||
// 初始化问题表单
|
// 初始化问题表单
|
||||||
@@ -483,7 +494,7 @@ export default {
|
|||||||
this.studyIndex = secondObj.studyIndex
|
this.studyIndex = secondObj.studyIndex
|
||||||
this.seriesIndex = secondObj.seriesIndex
|
this.seriesIndex = secondObj.seriesIndex
|
||||||
seriesList.push(secondObj.series)
|
seriesList.push(secondObj.series)
|
||||||
this.studyList[secondObj.studyIndex].SeriesList[secondObj.seriesIndex].isFirstRender = true
|
this.studyList[ secondObj.studyIndex].SeriesList[secondObj.seriesIndex].isFirstRender = true
|
||||||
this.studyIndex = secondObj.studyIndex
|
this.studyIndex = secondObj.studyIndex
|
||||||
this.seriesIndex = secondObj.seriesIndex
|
this.seriesIndex = secondObj.seriesIndex
|
||||||
|
|
||||||
@@ -516,7 +527,7 @@ export default {
|
|||||||
// const instanceList = seriesList[srIdx].instanceList
|
// const instanceList = seriesList[srIdx].instanceList
|
||||||
const imageIds = seriesList[srIdx].imageIds
|
const imageIds = seriesList[srIdx].imageIds
|
||||||
// const filterStr = seriesList[srIdx].isExistMutiFrames ? `frame=${measureDatas[i].MeasureData.frame}&instanceId=${measureDatas[i].InstanceId}` : `instanceId=${measureDatas[i].InstanceId}`
|
// const filterStr = seriesList[srIdx].isExistMutiFrames ? `frame=${measureDatas[i].MeasureData.frame}&instanceId=${measureDatas[i].InstanceId}` : `instanceId=${measureDatas[i].InstanceId}`
|
||||||
let instanceIndex = seriesList[srIdx].instanceInfoList.findIndex(k => k.Id === measureDatas[i].InstanceId)
|
let instanceIndex = seriesList[srIdx].instanceInfoList.findIndex(k=>k.Id === measureDatas[i].InstanceId)
|
||||||
let filterStr = ''
|
let filterStr = ''
|
||||||
if (instanceIndex > -1 && seriesList[srIdx].isExistMutiFrames) {
|
if (instanceIndex > -1 && seriesList[srIdx].isExistMutiFrames) {
|
||||||
if (seriesList[srIdx].instanceInfoList[instanceIndex].NumberOfFrames > 0) {
|
if (seriesList[srIdx].instanceInfoList[instanceIndex].NumberOfFrames > 0) {
|
||||||
@@ -600,7 +611,7 @@ export default {
|
|||||||
// const instanceList = seriesList[srIdx].imageIds
|
// const instanceList = seriesList[srIdx].imageIds
|
||||||
const imageIds = seriesList[srIdx].imageIds
|
const imageIds = seriesList[srIdx].imageIds
|
||||||
// const filterStr = seriesList[srIdx].isExistMutiFrames ? `frame=${measureDatas[mIdx].MeasureData.frame}&instanceId=${measureDatas[mIdx].InstanceId}` : `instanceId=${measureDatas[mIdx].InstanceId}`
|
// const filterStr = seriesList[srIdx].isExistMutiFrames ? `frame=${measureDatas[mIdx].MeasureData.frame}&instanceId=${measureDatas[mIdx].InstanceId}` : `instanceId=${measureDatas[mIdx].InstanceId}`
|
||||||
let instanceIndex = seriesList[srIdx].instanceInfoList.findIndex(i => i.Id === measureDatas[mIdx].InstanceId)
|
let instanceIndex = seriesList[srIdx].instanceInfoList.findIndex(i=>i.Id === measureDatas[mIdx].InstanceId)
|
||||||
let filterStr = ''
|
let filterStr = ''
|
||||||
if (instanceIndex > -1 && seriesList[srIdx].isExistMutiFrames) {
|
if (instanceIndex > -1 && seriesList[srIdx].isExistMutiFrames) {
|
||||||
if (seriesList[srIdx].instanceInfoList[instanceIndex].NumberOfFrames > 0) {
|
if (seriesList[srIdx].instanceInfoList[instanceIndex].NumberOfFrames > 0) {
|
||||||
@@ -957,17 +968,15 @@ export default {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.study-wrapper {
|
.study-wrapper{
|
||||||
::v-deep .el-progress-bar__inner {
|
::v-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;
|
overflow-x: hidden;
|
||||||
|
.dicom-desc{
|
||||||
.dicom-desc {
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
@@ -976,7 +985,6 @@ export default {
|
|||||||
white-space: normal;
|
white-space: normal;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
.study-meta-line {
|
.study-meta-line {
|
||||||
// display: grid;
|
// display: grid;
|
||||||
// grid-template-columns: minmax(0, 1fr) auto;
|
// grid-template-columns: minmax(0, 1fr) auto;
|
||||||
@@ -986,7 +994,6 @@ export default {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.study-meta-main {
|
.study-meta-main {
|
||||||
display: block;
|
display: block;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
@@ -994,13 +1001,11 @@ export default {
|
|||||||
overflow-wrap: anywhere;
|
overflow-wrap: anywhere;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.study-code,
|
.study-code,
|
||||||
.study-modality {
|
.study-modality {
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
margin: 0 2px;
|
margin: 0 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.study-desc-text {
|
.study-desc-text {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -1012,23 +1017,19 @@ export default {
|
|||||||
overflow-anchor: none;
|
overflow-anchor: none;
|
||||||
touch-action: auto;
|
touch-action: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.series-active {
|
.series-active {
|
||||||
background-color: #607d8b !important;
|
background-color: #607d8b!important;
|
||||||
border: 1px solid #607d8b !important;
|
border: 1px solid #607d8b!important;
|
||||||
}
|
}
|
||||||
|
::v-deep .el-progress__text{
|
||||||
::v-deep .el-progress__text {
|
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
.series{
|
||||||
.series {
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
|
|
||||||
.series-wrapper {
|
.series-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -1041,13 +1042,11 @@ export default {
|
|||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
border: 1px solid #404040;
|
border: 1px solid #404040;
|
||||||
background-color: #3a3a3a;
|
background-color: #3a3a3a;
|
||||||
|
.el-progress__text{
|
||||||
.el-progress__text {
|
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
.el-progress-bar{
|
||||||
.el-progress-bar {
|
padding-right:0px;
|
||||||
padding-right: 0px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.image-preview {
|
.image-preview {
|
||||||
@@ -1056,11 +1055,9 @@ export default {
|
|||||||
border: 2px solid #252525;
|
border: 2px solid #252525;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.image-desc {
|
.image-desc {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
|
p{
|
||||||
p {
|
|
||||||
width: 95px;
|
width: 95px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -1069,8 +1066,7 @@ export default {
|
|||||||
color: #ddd;
|
color: #ddd;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
|
div{
|
||||||
div {
|
|
||||||
width: 95px;
|
width: 95px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -1078,8 +1074,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.flex-div{
|
||||||
.flex-div {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
@@ -1096,25 +1091,21 @@ export default {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
::v-deep .el-collapse{
|
||||||
::v-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:5px;
|
||||||
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;
|
||||||
padding-left: 1px;
|
padding-left: 1px;
|
||||||
min-height: 40px;
|
min-height: 40px;
|
||||||
height: auto;
|
height: auto;
|
||||||
@@ -1123,42 +1114,35 @@ export default {
|
|||||||
padding-top: 6px;
|
padding-top: 6px;
|
||||||
padding-bottom: 6px;
|
padding-bottom: 6px;
|
||||||
}
|
}
|
||||||
|
.el-collapse-item__arrow{
|
||||||
.el-collapse-item__arrow {
|
|
||||||
align-self: flex-start;
|
align-self: flex-start;
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.sr-wrapper{
|
||||||
.sr-wrapper {
|
::v-deep .el-dialog{
|
||||||
::v-deep .el-dialog {
|
|
||||||
background: #fff !important;
|
background: #fff !important;
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
|
|
||||||
// color: #ddd;
|
// color: #ddd;
|
||||||
.el-dialog__title {
|
.el-dialog__title{
|
||||||
color: #fff;
|
color:#fff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
::v-deep .sr-dialog-container{
|
||||||
::v-deep .sr-dialog-container {
|
|
||||||
margin-top: 50px !important;
|
margin-top: 50px !important;
|
||||||
width: 75%;
|
width:75%;
|
||||||
height: 80%;
|
height:80%;
|
||||||
}
|
}
|
||||||
|
::v-deep .el-dialog__body{
|
||||||
::v-deep .el-dialog__body {
|
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
height: calc(100% - 50px);
|
height: calc(100% - 50px);
|
||||||
}
|
}
|
||||||
|
.el-dialog__header{
|
||||||
.el-dialog__header {
|
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
.sr-full-dialog-container{
|
||||||
.sr-full-dialog-container {
|
::v-deep .is-fullscreen .el-dialog__body{
|
||||||
::v-deep .is-fullscreen .el-dialog__body {
|
|
||||||
height: calc(100% - 50px);
|
height: calc(100% - 50px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1166,29 +1150,25 @@ export default {
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<style>
|
<style>
|
||||||
.instance_frame_wrapper {
|
.instance_frame_wrapper{
|
||||||
min-width: 120px;
|
min-width: 120px;
|
||||||
background-color: #2c2c2c;
|
background-color: #2c2c2c;
|
||||||
border: 1px solid #2c2c2c;
|
border: 1px solid #2c2c2c;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
.frame_list{
|
||||||
.frame_list {
|
|
||||||
max-height: 500px;
|
max-height: 500px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.instance_frame_wrapper ::-webkit-scrollbar {
|
.instance_frame_wrapper ::-webkit-scrollbar {
|
||||||
width: 7px;
|
width: 7px;
|
||||||
height: 7px;
|
height: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.instance_frame_wrapper ::-webkit-scrollbar-thumb {
|
.instance_frame_wrapper ::-webkit-scrollbar-thumb {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
}
|
}
|
||||||
|
.frame_content{
|
||||||
.frame_content {
|
|
||||||
height: 50px;
|
height: 50px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -1197,7 +1177,6 @@ export default {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
border: 1px solid #404040;
|
border: 1px solid #404040;
|
||||||
}
|
}
|
||||||
|
|
||||||
.frame_content:hover {
|
.frame_content:hover {
|
||||||
/* font-weight: bold; */
|
/* font-weight: bold; */
|
||||||
/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */
|
/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */
|
||||||
@@ -1206,7 +1185,6 @@ export default {
|
|||||||
border-color: #213a54 !important;
|
border-color: #213a54 !important;
|
||||||
background-color: #213a54;
|
background-color: #213a54;
|
||||||
}
|
}
|
||||||
|
|
||||||
.frame_content_active {
|
.frame_content_active {
|
||||||
border-color: #213a54 !important;
|
border-color: #213a54 !important;
|
||||||
background-color: #213a54;
|
background-color: #213a54;
|
||||||
@@ -1219,7 +1197,6 @@ export default {
|
|||||||
line-height: 1;
|
line-height: 1;
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.patient-info-popper {
|
.patient-info-popper {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
@@ -1244,7 +1221,7 @@ export default {
|
|||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.patient-info-popper .patient-info-row+.patient-info-row {
|
.patient-info-popper .patient-info-row + .patient-info-row {
|
||||||
margin-top: 4px;
|
margin-top: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,115 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="table-list-container" v-loading="loading">
|
|
||||||
<h3 v-if="isReadingShowSubjectInfo">
|
|
||||||
<span v-if="subjectCode">{{ subjectCode }} </span>
|
|
||||||
<span style="margin-left:5px;">{{ taskBlindName }}</span>
|
|
||||||
</h3>
|
|
||||||
<h3 v-if="tableQuestion && tableQuestion.GroupName">
|
|
||||||
{{ language === 'en' ? tableQuestion.GroupEnName : tableQuestion.GroupName }}
|
|
||||||
</h3>
|
|
||||||
<h4 v-if="tableQuestion && tableQuestion.QuestionName">
|
|
||||||
{{ tableQuestion.QuestionName }}
|
|
||||||
</h4>
|
|
||||||
<el-table
|
|
||||||
v-if="tableQuestion && tableQuestion.Type === 'basicTable' && tableQuestion.TableQuestions"
|
|
||||||
:ref="tableQuestion.Id"
|
|
||||||
:data="tableQuestion.TableQuestions.Answers"
|
|
||||||
height="100%"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
v-for="q of tableQuestion.TableQuestions.Questions"
|
|
||||||
:key="q.Id"
|
|
||||||
:prop="q.Id"
|
|
||||||
:label="q.QuestionName"
|
|
||||||
show-overflow-tooltip>
|
|
||||||
<template slot-scope="scope">
|
|
||||||
<span v-if="q.Unit > 0 && !isNaN(parseFloat(scope.row[q.Id]))">
|
|
||||||
{{ `${scope.row[q.Id]} ${$fd('ValueUnit', parseInt(q.Unit))}` }}
|
|
||||||
</span>
|
|
||||||
<span v-else-if="q.DictionaryCode">
|
|
||||||
{{`${scope.row[q.Id] instanceof Array ? scope.row[q.Id].map(item => $fd(q.DictionaryCode,
|
|
||||||
parseInt(item))).join(',') : $fd(q.DictionaryCode, parseInt(scope.row[q.Id]))}`}}
|
|
||||||
</span>
|
|
||||||
<span v-else-if="q.OptionTypeEnum === 1">
|
|
||||||
{{ `${scope.row[q.Id] instanceof Array ? scope.row[q.Id].join(',') : scope.row[q.Id]}` }}
|
|
||||||
</span>
|
|
||||||
<span v-else>
|
|
||||||
{{ `${scope.row[q.Id]}` }}
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<script>
|
|
||||||
import { getFilterTableQuestion } from '@/api/reading'
|
|
||||||
import store from '@/store'
|
|
||||||
import { mapGetters } from 'vuex'
|
|
||||||
import { changeURLStatic } from '@/utils/history.js'
|
|
||||||
export default {
|
|
||||||
name: 'DicomTableList',
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
isReadingShowSubjectInfo: false,
|
|
||||||
subjectCode: null,
|
|
||||||
taskBlindName: null,
|
|
||||||
questionId: null,
|
|
||||||
tableQuestion: null,
|
|
||||||
loading: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
...mapGetters(['language'])
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
if (this.$route.query.TokenKey) {
|
|
||||||
store.dispatch('user/setToken', this.$route.query.TokenKey)
|
|
||||||
changeURLStatic('TokenKey', '')
|
|
||||||
}
|
|
||||||
this.subjectCode = localStorage.getItem('subjectCode')
|
|
||||||
this.taskBlindName = localStorage.getItem('taskBlindName')
|
|
||||||
this.isReadingShowSubjectInfo = localStorage.getItem('isReadingShowSubjectInfo')
|
|
||||||
this.getList()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
async getList() {
|
|
||||||
try {
|
|
||||||
this.loading = true
|
|
||||||
let params = {
|
|
||||||
trialId: this.$route.query.trialId,
|
|
||||||
visitTaskId: this.$route.query.visitTaskId,
|
|
||||||
questionId: this.$route.query.questionId
|
|
||||||
}
|
|
||||||
let res = await getFilterTableQuestion(params)
|
|
||||||
if (res.IsSuccess) {
|
|
||||||
this.tableQuestion = res.Result
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e)
|
|
||||||
} finally {
|
|
||||||
this.loading = false
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
resetList() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.table-list-container {
|
|
||||||
height: 100%;
|
|
||||||
padding: 0 10px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3, h4 {
|
|
||||||
flex-shrink: 0;
|
|
||||||
margin: 10px 0 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -1,205 +0,0 @@
|
|||||||
import { dcmUpload } from '@/utils/dcmUpload/dcmUpload'
|
|
||||||
import dcmjs from '@/utils/dcmUpload/dcmjs'
|
|
||||||
import { deleteImageCache, getAnonymizeInfo, updateModality } from '@/api/reading'
|
|
||||||
import * as dicomParser from 'dicom-parser'
|
|
||||||
import * as cornerstone from 'cornerstone-core'
|
|
||||||
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
|
||||||
var config = {
|
|
||||||
maxWebWorkers: 4,
|
|
||||||
startWebWorkersOnDemand: true,
|
|
||||||
taskConfiguration: {
|
|
||||||
decodeTask: {
|
|
||||||
initializeCodecsOnStartup: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
cornerstoneWADOImageLoader.webWorkerManager.initialize(config)
|
|
||||||
cornerstoneWADOImageLoader.external.dicomParser = dicomParser
|
|
||||||
cornerstoneWADOImageLoader.external.cornerstone = cornerstone
|
|
||||||
import Vue from 'vue'
|
|
||||||
function dicomToPng(imageId, width, height) {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
cornerstone.loadImage(imageId).then(async (image) => {
|
|
||||||
let canvas = document.createElement('canvas')
|
|
||||||
canvas.width = (width * 60) / height
|
|
||||||
canvas.height = 60
|
|
||||||
if (image) {
|
|
||||||
cornerstone.renderToCanvas(canvas, image)
|
|
||||||
// 将 Canvas 图像对象转换为 PNG 格式
|
|
||||||
let blob = await canvasToBlob(canvas)
|
|
||||||
resolve(blob)
|
|
||||||
} else {
|
|
||||||
resolve()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}).catch((reason) => {
|
|
||||||
reason()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function canvasToBlob(canvas) {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
canvas.toBlob((blob) => {
|
|
||||||
resolve(blob)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
async function UpdateModality(params) {
|
|
||||||
try {
|
|
||||||
let res = await updateModality(params)
|
|
||||||
if (res.IsSuccess) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async function getAnonymize(VisitTaskId, SubjectVisitId) {
|
|
||||||
try {
|
|
||||||
let params = {}
|
|
||||||
if (VisitTaskId) {
|
|
||||||
params.VisitTaskId = VisitTaskId
|
|
||||||
} else {
|
|
||||||
params.SubjectVisitId = SubjectVisitId
|
|
||||||
}
|
|
||||||
let res = await getAnonymizeInfo(params)
|
|
||||||
if (res.IsSuccess) {
|
|
||||||
return res.Result
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async function deleteCache(path) {
|
|
||||||
try {
|
|
||||||
let params = {
|
|
||||||
path
|
|
||||||
}
|
|
||||||
let res = await deleteImageCache(params)
|
|
||||||
if (res.IsSuccess) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 0002,0003 MediaStorageSOPInstanceUID
|
|
||||||
* 0008,0018 SOPInstanceUID
|
|
||||||
* 0020,000D StudyInstanceUID
|
|
||||||
* 0020,000E SeriesInstanceUID
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export async function changeFile(key, file, study, image) {
|
|
||||||
// console.log(image, 'image')
|
|
||||||
// return console.log(study, 'study')
|
|
||||||
let dataset = dcmjs.data.DicomMessage.readFile(image.data.byteArray.buffer)
|
|
||||||
// console.log(dataset, 'dataset')
|
|
||||||
let MediaStorageSOPInstanceUID = dataset.meta['00020003'].Value[0]
|
|
||||||
let SOPInstanceUID = dataset.dict['00080018'].Value[0]
|
|
||||||
let StudyInstanceUID = dataset.dict['0020000D'].Value[0]
|
|
||||||
let SeriesInstanceUID = dataset.dict['0020000E'].Value[0]
|
|
||||||
// let Modality = dataset.dict['00080060'].Value[0]
|
|
||||||
let { visitTaskId, visitTaskList = [], studyList, studyIndex, seriesIndex, seriesList, currentSeriesIndex } = study
|
|
||||||
let series = key === 'IR' ? studyList[studyIndex].SeriesList[seriesIndex] : seriesList[currentSeriesIndex]
|
|
||||||
console.log(series, 'seriesId')
|
|
||||||
let index = visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
|
||||||
let config = null
|
|
||||||
if (key === 'IR') {
|
|
||||||
config = await getAnonymize(visitTaskId)
|
|
||||||
} else {
|
|
||||||
config = await getAnonymize(null, series.subjectVisitId)
|
|
||||||
}
|
|
||||||
if (!config) return false
|
|
||||||
config.AnonymizeFixedList.push({
|
|
||||||
Element: '0003',
|
|
||||||
Group: '0002',
|
|
||||||
ReplaceValue: MediaStorageSOPInstanceUID,
|
|
||||||
Id: 'MediaStorageSOPInstanceUID'
|
|
||||||
})
|
|
||||||
config.AnonymizeFixedList.push({
|
|
||||||
Element: '0018',
|
|
||||||
Group: '0008',
|
|
||||||
ReplaceValue: SOPInstanceUID,
|
|
||||||
Id: 'SOPInstanceUID'
|
|
||||||
})
|
|
||||||
config.AnonymizeFixedList.push({
|
|
||||||
Element: '000D',
|
|
||||||
Group: '0020',
|
|
||||||
ReplaceValue: StudyInstanceUID,
|
|
||||||
Id: 'StudyInstanceUID'
|
|
||||||
})
|
|
||||||
config.AnonymizeFixedList.push({
|
|
||||||
Element: '000E',
|
|
||||||
Group: '0020',
|
|
||||||
ReplaceValue: SeriesInstanceUID,
|
|
||||||
Id: 'SeriesInstanceUID'
|
|
||||||
})
|
|
||||||
let uploadBatchId = Vue.prototype.$guid()
|
|
||||||
let path = image.imageId.split(`wadouri:${Vue.prototype.OSSclientConfig.basePath}`)[1].split("?")[0]
|
|
||||||
let res = await dcmUpload(
|
|
||||||
{
|
|
||||||
path: path,
|
|
||||||
file: file,
|
|
||||||
speed: true,
|
|
||||||
},
|
|
||||||
config,
|
|
||||||
(percentage, checkpoint, lastPer) => {
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fileName: file.name,
|
|
||||||
fileSize: file.size,
|
|
||||||
fileType: 'application/dicom',
|
|
||||||
uploadBatchId: uploadBatchId,
|
|
||||||
batchDataType: 1,
|
|
||||||
// trialId: params.trialId,
|
|
||||||
subjectId: key === 'IR' ? localStorage.getItem("subjectId") : series.subjectId,
|
|
||||||
subjectVisitId: key === 'IR' ? visitTaskList[index].VisitId : series.subjectVisitId,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
if (!res || !res.url) return false
|
|
||||||
let Modality = res.Modality
|
|
||||||
let fileId =
|
|
||||||
cornerstoneWADOImageLoader.wadouri.fileManager.add(
|
|
||||||
file
|
|
||||||
)
|
|
||||||
let blob = await dicomToPng(
|
|
||||||
fileId,
|
|
||||||
image.columns,
|
|
||||||
image.rows
|
|
||||||
)
|
|
||||||
let thumbnailPath = series.previewImageUrl.split(Vue.prototype.OSSclientConfig.basePath)[1]
|
|
||||||
let OSSclient = Vue.prototype.OSSclient
|
|
||||||
try {
|
|
||||||
let seriesRes = await OSSclient.put(thumbnailPath, blob, {
|
|
||||||
fileName: thumbnailPath.split('/')[thumbnailPath.split('/').length - 1],
|
|
||||||
fileSize: blob.size,
|
|
||||||
fileType: 'image/jpeg',
|
|
||||||
uploadBatchId: uploadBatchId,
|
|
||||||
batchDataType: 2,
|
|
||||||
// trialId: params.trialId,
|
|
||||||
subjectId: key === 'IR' ? localStorage.getItem("subjectId") : series.subjectId,
|
|
||||||
subjectVisitId: key === 'IR' ? visitTaskList[index].VisitId : series.subjectVisitId,
|
|
||||||
})
|
|
||||||
console.log(seriesRes, 'seriesRes')
|
|
||||||
if (!seriesRes || !seriesRes.url) return false
|
|
||||||
res = await Promise.all([deleteCache(path), deleteCache(thumbnailPath)])
|
|
||||||
if (!res) return false
|
|
||||||
let params = {
|
|
||||||
Modality,
|
|
||||||
SeriesId: series.seriesId,
|
|
||||||
IsCRCReplace: key === 'IR' ? false : true
|
|
||||||
}
|
|
||||||
res = await UpdateModality(params)
|
|
||||||
if (!res) return false
|
|
||||||
window.location.reload(true)
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -477,10 +477,6 @@ export default {
|
|||||||
DicomEvent.$off('updateImage')
|
DicomEvent.$off('updateImage')
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
getInfo() {
|
|
||||||
var image = cornerstone.getImage(this.canvas)
|
|
||||||
return image
|
|
||||||
},
|
|
||||||
goViewer(e) {
|
goViewer(e) {
|
||||||
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
|
||||||
|
|||||||
@@ -309,8 +309,10 @@
|
|||||||
<div class="text">{{ $t('trials:reading:button:reset') }}</div>
|
<div class="text">{{ $t('trials:reading:button:reset') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip v-if="trialCriterion.ImageUploadEnum > 0" class="item" effect="dark"
|
<el-tooltip v-if="
|
||||||
:content="$t('trials:reading:button:upload')" placement="bottom">
|
trialCriterion.ImageUploadEnum > 0 && currentReadingTaskState < 2
|
||||||
|
" v-hasPermi="['role:ir']" class="item" effect="dark" :content="$t('trials:reading:button:upload')"
|
||||||
|
placement="bottom">
|
||||||
<div class="tool-wrapper">
|
<div class="tool-wrapper">
|
||||||
<div class="icon" @click.prevent="openUploadImage('upload')">
|
<div class="icon" @click.prevent="openUploadImage('upload')">
|
||||||
<i class="el-icon-upload2 svg-icon" />
|
<i class="el-icon-upload2 svg-icon" />
|
||||||
@@ -318,8 +320,15 @@
|
|||||||
<div class="text">{{ $t('trials:reading:button:upload') }}</div>
|
<div class="text">{{ $t('trials:reading:button:upload') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip v-if="trialCriterion.ImageDownloadEnum > 0" class="item" effect="dark"
|
<el-tooltip v-if="trialCriterion.ImageDownloadEnum > 0" v-hasPermi="[
|
||||||
:content="$t('trials:reading:button:download')" placement="bottom">
|
'role:ir',
|
||||||
|
'role:mim',
|
||||||
|
'role:mc',
|
||||||
|
'role:pm',
|
||||||
|
'role:apm',
|
||||||
|
'role:ea',
|
||||||
|
'role:qa',
|
||||||
|
]" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
||||||
<div class="tool-wrapper">
|
<div class="tool-wrapper">
|
||||||
<div class="icon" @click.prevent="openUploadImage('download')">
|
<div class="icon" @click.prevent="openUploadImage('download')">
|
||||||
<i class="el-icon-download svg-icon" />
|
<i class="el-icon-download svg-icon" />
|
||||||
@@ -327,10 +336,7 @@
|
|||||||
<div class="text">{{ $t('trials:reading:button:download') }}</div>
|
<div class="text">{{ $t('trials:reading:button:download') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<label for="Replacement" style="color: #fff;cursor: pointer;">
|
|
||||||
替换
|
|
||||||
</label>
|
|
||||||
<input type="file" id="Replacement" @change="beginScanFiles($event, 'replace')" style="display: none;">
|
|
||||||
<div style="margin-left: auto">
|
<div style="margin-left: auto">
|
||||||
<div style="display: flex;">
|
<div style="display: flex;">
|
||||||
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:handbooks')" placement="bottom"
|
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:handbooks')" placement="bottom"
|
||||||
@@ -405,7 +411,7 @@
|
|||||||
<WL v-if="activeName === '2'" @getWwcTpl="getWwcTpl" />
|
<WL v-if="activeName === '2'" @getWwcTpl="getWwcTpl" />
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane :label="$t('trials:reading:tab:others')" name="3">
|
<el-tab-pane :label="$t('trials:reading:tab:others')" name="3">
|
||||||
<Others v-if="activeName === '3'" :imageToolType="1" />
|
<Others v-if="activeName === '3'" :imageToolType="1"/>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
@@ -442,10 +448,10 @@
|
|||||||
/> -->
|
/> -->
|
||||||
<upload-dicom-and-nonedicom v-if="uploadImageVisible" :SubjectId="uploadSubjectId" :SubjectCode="uploadSubjectCode"
|
<upload-dicom-and-nonedicom v-if="uploadImageVisible" :SubjectId="uploadSubjectId" :SubjectCode="uploadSubjectCode"
|
||||||
:Criterion="uploadTrialCriterion" :visible.sync="uploadImageVisible" :VisitTaskId="taskId"
|
:Criterion="uploadTrialCriterion" :visible.sync="uploadImageVisible" :VisitTaskId="taskId"
|
||||||
:isReadingTaskViewInOrder="isReadingTaskViewInOrder" :StudyInstanceUID="StudyInstanceUID" :isReading="true" />
|
:isReadingTaskViewInOrder="isReadingTaskViewInOrder" />
|
||||||
<download-dicom-and-nonedicom v-if="downloadImageVisible" :SubjectId="uploadSubjectId"
|
<download-dicom-and-nonedicom v-if="downloadImageVisible" :SubjectId="uploadSubjectId"
|
||||||
:SubjectCode="uploadSubjectCode" :Criterion="uploadTrialCriterion" :TaskId="taskId"
|
:SubjectCode="uploadSubjectCode" :Criterion="uploadTrialCriterion" :TaskId="taskId"
|
||||||
:visible.sync="downloadImageVisible" :isReading="true" />
|
:visible.sync="downloadImageVisible" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
@@ -472,8 +478,6 @@ import { getDoctorShortcutKey, getUserWLTemplateList } from '@/api/user'
|
|||||||
import uploadDicomAndNonedicom from '@/components/uploadDicomAndNonedicom'
|
import uploadDicomAndNonedicom from '@/components/uploadDicomAndNonedicom'
|
||||||
import downloadDicomAndNonedicom from '@/components/downloadDicomAndNonedicom'
|
import downloadDicomAndNonedicom from '@/components/downloadDicomAndNonedicom'
|
||||||
import { getCriterionReadingInfo, setReadKeyFile } from '@/api/trials'
|
import { getCriterionReadingInfo, setReadKeyFile } from '@/api/trials'
|
||||||
import { changeFile } from "@/views/trials/trials-panel/reading/dicoms/components/upload.js"
|
|
||||||
import dcmjs from '@/utils/dcmUpload/dcmjs'
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DicomViewer',
|
name: 'DicomViewer',
|
||||||
components: {
|
components: {
|
||||||
@@ -679,10 +683,7 @@ export default {
|
|||||||
fullScreenWidth: window.innerWidth - 570 + 'px',
|
fullScreenWidth: window.innerWidth - 570 + 'px',
|
||||||
fullScreenHeight: window.innerHeight - 128 + 'px',
|
fullScreenHeight: window.innerHeight - 128 + 'px',
|
||||||
|
|
||||||
ManualsClose: false,
|
ManualsClose: false
|
||||||
fileKey: null,
|
|
||||||
file: null,
|
|
||||||
StudyInstanceUID: null
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -855,12 +856,6 @@ export default {
|
|||||||
this.loadLinkedImageStack(seriesInfo)
|
this.loadLinkedImageStack(seriesInfo)
|
||||||
console.log('loadLinkedImageStack')
|
console.log('loadLinkedImageStack')
|
||||||
})
|
})
|
||||||
DicomEvent.$on('sendStudyFile', (study) => {
|
|
||||||
let image = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].getInfo()
|
|
||||||
study.visitTaskList = this.visitTaskList
|
|
||||||
this.$emit("update:Loading", true)
|
|
||||||
changeFile('IR', this.file, study, image)
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
DicomEvent.$off('updateImage')
|
DicomEvent.$off('updateImage')
|
||||||
@@ -871,11 +866,6 @@ export default {
|
|||||||
DicomEvent.$off('loadLinkedImageStack')
|
DicomEvent.$off('loadLinkedImageStack')
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
beginScanFiles(e, key) {
|
|
||||||
this.fileKey = key
|
|
||||||
this.file = e.target.files[0]
|
|
||||||
DicomEvent.$emit('getStudyFile')
|
|
||||||
},
|
|
||||||
handleReadingChart(e) {
|
handleReadingChart(e) {
|
||||||
this.$emit('handleReadingChart', e)
|
this.$emit('handleReadingChart', e)
|
||||||
},
|
},
|
||||||
@@ -908,11 +898,6 @@ export default {
|
|||||||
if (idx > -1) {
|
if (idx > -1) {
|
||||||
this.taskId = this.visitTaskList[idx].VisitTaskId
|
this.taskId = this.visitTaskList[idx].VisitTaskId
|
||||||
}
|
}
|
||||||
let image = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].getInfo()
|
|
||||||
let dataset = dcmjs.data.DicomMessage.readFile(image.data.byteArray.buffer)
|
|
||||||
this.StudyInstanceUID = dataset.dict['0020000D'].Value[0]
|
|
||||||
dataset = null
|
|
||||||
console.log(this.StudyInstanceUID, 'StudyInstanceUID')
|
|
||||||
this.uploadSubjectCode = localStorage.getItem("subjectCode")
|
this.uploadSubjectCode = localStorage.getItem("subjectCode")
|
||||||
this.uploadSubjectId = localStorage.getItem("subjectId")
|
this.uploadSubjectId = localStorage.getItem("subjectId")
|
||||||
this.uploadTrialCriterion = this.trialCriterion
|
this.uploadTrialCriterion = this.trialCriterion
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ export default {
|
|||||||
immediate: true,
|
immediate: true,
|
||||||
handler(val) {
|
handler(val) {
|
||||||
if (val) {
|
if (val) {
|
||||||
this.readingTaskState = 1
|
this.readingTaskState = val
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -169,7 +169,7 @@ 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.readingTaskState = 1
|
this.readingTaskState = this.visitTaskList[i].ReadingTaskState
|
||||||
console.log(this.visitTaskList[i].IsInit)
|
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 })
|
||||||
@@ -306,9 +306,9 @@ export default {
|
|||||||
}
|
}
|
||||||
this.signVisible = false
|
this.signVisible = false
|
||||||
// 设置当前任务阅片状态为已读
|
// 设置当前任务阅片状态为已读
|
||||||
this.readingTaskState = 1
|
this.readingTaskState = 2
|
||||||
store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 1 })
|
store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 })
|
||||||
DicomEvent.$emit('setReadingState', 1)
|
DicomEvent.$emit('setReadingState', 2)
|
||||||
window.opener.postMessage('refreshTaskList', window.location)
|
window.opener.postMessage('refreshTaskList', window.location)
|
||||||
this.$confirm(this.$t('trials:oncologyReview:title:msg2'), {
|
this.$confirm(this.$t('trials:oncologyReview:title:msg2'), {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading" style="min-height: 500px;">
|
<div v-loading="loading" style="min-height: 500px;">
|
||||||
<el-form v-if="isRender" ref="questions" size="small" :model="questionForm">
|
<el-form v-if="isRender" ref="questions" size="small" :model="questionForm" :disabled="readingTaskState >= 2">
|
||||||
<template>
|
<template>
|
||||||
<QuestionFormItem v-for="question of questions" :key="question.Id" :visitTaskId="visitTaskId"
|
<QuestionFormItem v-for="question of questions" :key="question.Id" :visitTaskId="visitTaskId"
|
||||||
:question="question" :question-form="questionForm" :reading-task-state="readingTaskState"
|
:question="question" :question-form="questionForm" :reading-task-state="readingTaskState"
|
||||||
@@ -112,8 +112,8 @@ export default {
|
|||||||
VisitTaskId: visitTaskId ? visitTaskId : this.visitTaskId
|
VisitTaskId: visitTaskId ? visitTaskId : this.visitTaskId
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
this.IsBaseline = res.OtherInfo.IsBaseline
|
this.IsBaseline = res.OtherInfo.IsBaseline
|
||||||
this.readingTaskState = 1
|
this.readingTaskState = res.OtherInfo.ReadingTaskState
|
||||||
DicomEvent.$emit('setReadingState', 1)
|
DicomEvent.$emit('setReadingState', res.OtherInfo.ReadingTaskState)
|
||||||
res.Result.SinglePage.map((v) => {
|
res.Result.SinglePage.map((v) => {
|
||||||
if (v.Type === 'group' && v.Childrens.length === 0) return
|
if (v.Type === 'group' && v.Childrens.length === 0) return
|
||||||
if (!v.IsPage && v.Type !== 'group' && v.Type !== 'summary' && v.Type !== 'table' && v.Type !== 'basicTable' && v.Type !== 'number') {
|
if (!v.IsPage && v.Type !== 'group' && v.Type !== 'summary' && v.Type !== 'table' && v.Type !== 'basicTable' && v.Type !== 'number') {
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading" class="study-wrapper">
|
<div v-loading="loading" class="study-wrapper">
|
||||||
<h4 v-if="isReadingShowSubjectInfo"
|
<h4 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;text-align: center;background-color: #4c4c4c;">
|
||||||
style="color: #ddd;padding: 5px 0px;margin: 0;text-align: center;background-color: #4c4c4c;">
|
|
||||||
{{ subjectCode }}
|
{{ subjectCode }}
|
||||||
</h4>
|
</h4>
|
||||||
<h4 v-if="isReadingShowSubjectInfo"
|
<h4 v-if="isReadingShowSubjectInfo" style="color: #ddd;padding: 5px 0px;margin: 0;text-align: center;background-color: #4c4c4c;margin-bottom: 5px;">
|
||||||
style="color: #ddd;padding: 5px 0px;margin: 0;text-align: center;background-color: #4c4c4c;margin-bottom: 5px;">
|
|
||||||
{{ taskBlindName }}
|
{{ taskBlindName }}
|
||||||
</h4>
|
</h4>
|
||||||
<div class="ps">
|
<div class="ps">
|
||||||
@@ -16,8 +14,11 @@
|
|||||||
<!-- 关键序列 -->
|
<!-- 关键序列 -->
|
||||||
{{ $t('trials:reading:title:keySeries') }}
|
{{ $t('trials:reading:title:keySeries') }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="dicom-desc"
|
<div
|
||||||
style="width: 150px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
|
v-else
|
||||||
|
class="dicom-desc"
|
||||||
|
style="width: 150px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;"
|
||||||
|
>
|
||||||
<div>
|
<div>
|
||||||
<div style="text-overflow: ellipsis;overflow: hidden;" v-if="!study.StudyName">
|
<div style="text-overflow: ellipsis;overflow: hidden;" v-if="!study.StudyName">
|
||||||
<span :title="study.StudyCode">{{ study.StudyCode }}</span>
|
<span :title="study.StudyCode">{{ study.StudyCode }}</span>
|
||||||
@@ -26,51 +27,63 @@
|
|||||||
<div style="text-overflow: ellipsis;overflow: hidden;" v-else>
|
<div style="text-overflow: ellipsis;overflow: hidden;" v-else>
|
||||||
<span :title="study.StudyCode">{{ study.StudyCode }}</span>
|
<span :title="study.StudyCode">{{ study.StudyCode }}</span>
|
||||||
<span v-if="taskInfo && taskInfo.IsShowStudyName" :title="study.StudyName">
|
<span v-if="taskInfo && taskInfo.IsShowStudyName" :title="study.StudyName">
|
||||||
{{ study.StudyName }}
|
{{study.StudyName}}
|
||||||
</span>
|
</span>
|
||||||
<div>{{ study.Modalities }} ({{ study.SeriesCount }})</div>
|
<div>{{ study.Modalities }} ({{ study.SeriesCount }})</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="text-overflow: ellipsis;overflow: hidden;" :title="study.Description">{{ study.Description
|
<div style="text-overflow: ellipsis;overflow: hidden;" :title="study.Description">{{ study.Description }}</div>
|
||||||
}}</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div class="series">
|
<div class="series">
|
||||||
<div v-for="(series, i) in study.SeriesList" :key="i" style="position:relative;margin-top:5px;"
|
<div
|
||||||
series-type="current" @click="showSeriesImage(index, i, series)">
|
v-for="(series, i) in study.SeriesList"
|
||||||
|
:key="i"
|
||||||
|
style="position:relative;margin-top:5px;"
|
||||||
|
series-type="current"
|
||||||
|
@click="showSeriesImage(index,i,series)"
|
||||||
|
>
|
||||||
|
|
||||||
<div :class="{ 'series-active': i == seriesIndex && index === studyIndex }" class="series-wrapper">
|
<div
|
||||||
<el-image class="image-preview" :src="series.previewImageUrl" fit="fill" crossorigin="anonymous" />
|
:class="{'series-active': i==seriesIndex && index === studyIndex}"
|
||||||
|
class="series-wrapper"
|
||||||
|
>
|
||||||
|
<el-image
|
||||||
|
class="image-preview"
|
||||||
|
:src="series.previewImageUrl"
|
||||||
|
fit="fill"
|
||||||
|
crossorigin="anonymous"
|
||||||
|
/>
|
||||||
<div class="image-desc">
|
<div class="image-desc">
|
||||||
<div class="flex-div">
|
<div class="flex-div">
|
||||||
<div style="width: 40px;display: flex;flex-direction: row;justify-content: space-between;">
|
<div style="width: 40px;display: flex;flex-direction: row;justify-content: space-between;">
|
||||||
<div v-if="!study.IsCriticalSequence">#{{ series.seriesNumber }}</div>
|
<div v-if="!study.IsCriticalSequence">#{{ series.seriesNumber }}</div>
|
||||||
<div
|
<div v-if="series.isDicom && series.prefetchInstanceCount<series.instanceCount * 100 && series.modality!== 'SR'">
|
||||||
v-if="series.isDicom && series.prefetchInstanceCount < series.instanceCount * 100 && series.modality !== 'SR'">
|
|
||||||
<!-- 下载 -->
|
<!-- 下载 -->
|
||||||
<el-tooltip v-if="!series.isLoading" class="item" effect="dark"
|
<el-tooltip v-if="!series.isLoading" class="item" effect="dark" :content="$t('trials:reading:button:download')" placement="bottom">
|
||||||
: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>
|
||||||
<el-tooltip
|
<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">
|
||||||
v-else-if="series.isDicom && series.prefetchInstanceCount === 0 && series.modality !== 'SR'"
|
<i class="el-icon-video-play" style="font-size: 18px;margin-right: 5px;color: #ffeb3b;cursor: pointer;" @click.stop="loadSeries(series,index,i)" />
|
||||||
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)" />
|
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="series.isExistMutiFrames && series.instanceCount > 1">
|
<div v-if="series.isExistMutiFrames && series.instanceCount > 1">
|
||||||
<el-popover placement="right" trigger="hover" popper-class="instance_frame_wrapper">
|
<el-popover
|
||||||
|
placement="right"
|
||||||
|
trigger="hover"
|
||||||
|
popper-class="instance_frame_wrapper"
|
||||||
|
>
|
||||||
<div class="frame_list">
|
<div class="frame_list">
|
||||||
<div v-for="(instance, idx) in series.instanceInfoList" :key="instance.Id"
|
<div
|
||||||
class="frame_content" :class="{ 'frame_content_active': activeInstanceId === instance.Id }"
|
v-for="(instance, idx) in series.instanceInfoList"
|
||||||
:style="{ 'margin-bottom': idx < series.instanceInfoList.length - 1 ? '5px' : '0px' }"
|
:key="instance.Id"
|
||||||
@click.stop="showMultiFrames(index, series, i, instance)">
|
class="frame_content"
|
||||||
|
:class="{ 'frame_content_active': activeInstanceId === instance.Id }"
|
||||||
|
:style="{'margin-bottom':idx<series.instanceInfoList.length-1? '5px':'0px'}"
|
||||||
|
@click.stop="showMultiFrames(index,series, i, instance)"
|
||||||
|
>
|
||||||
<!-- <div>
|
<!-- <div>
|
||||||
<img
|
<img
|
||||||
class="image-preview"
|
class="image-preview"
|
||||||
@@ -83,14 +96,12 @@
|
|||||||
</div> -->
|
</div> -->
|
||||||
<div>
|
<div>
|
||||||
<div>{{ instance.InstanceNumber }}</div>
|
<div>{{ instance.InstanceNumber }}</div>
|
||||||
<div>{{ `${instance.NumberOfFrames > 0 ? instance.KeyFramesList.length > 0 ?
|
<div>{{ `${instance.NumberOfFrames > 0 ? instance.KeyFramesList.length > 0 ? instance.KeyFramesList.length : instance.NumberOfFrames : 1} frame` }}</div>
|
||||||
instance.KeyFramesList.length : instance.NumberOfFrames : 1} frame` }}</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<i slot="reference" class="el-icon-connection"
|
<i slot="reference" class="el-icon-connection" style="font-size: 15px;cursor: pointer;color: #ffeb3b;" />
|
||||||
style="font-size: 15px;cursor: pointer;color: #ffeb3b;" />
|
|
||||||
</el-popover>
|
</el-popover>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -110,11 +121,9 @@
|
|||||||
{{ series.modality }}: {{ series.instanceCount }} image
|
{{ series.modality }}: {{ series.instanceCount }} image
|
||||||
</p>
|
</p>
|
||||||
<div class="flex-div">
|
<div class="flex-div">
|
||||||
<div
|
<div v-if="measureData && measureData.findIndex(v=>v.SeriesId === series.seriesId && v.MeasureData) > -1">
|
||||||
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')"
|
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:marked')" placement="right">
|
||||||
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;" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
|
||||||
@@ -122,10 +131,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div v-if="series.isDicom && series.prefetchInstanceCount>0 && series.prefetchInstanceCount<series.instanceCount * 100" style="width: 100%;">
|
||||||
v-if="series.isDicom && series.prefetchInstanceCount > 0 && series.prefetchInstanceCount < series.instanceCount * 100"
|
<el-progress
|
||||||
style="width: 100%;">
|
:percentage="parseInt((series.prefetchInstanceCount / series.instanceCount).toFixed(2))"
|
||||||
<el-progress :percentage="parseInt((series.prefetchInstanceCount / series.instanceCount).toFixed(2))" />
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -135,19 +144,24 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="sr-wrapper">
|
<div class="sr-wrapper">
|
||||||
<el-dialog :visible.sync="srDialogVisible"
|
<el-dialog
|
||||||
:custom-class="isSrFullscreen ? 'sr-full-dialog-container' : 'sr-dialog-container'" :show-close="false"
|
:visible.sync="srDialogVisible"
|
||||||
:close-on-click-modal="false" :fullscreen="isSrFullscreen">
|
: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">
|
<span slot="title" class="dialog-footer">
|
||||||
<div style="position: absolute;right: 20px;top: 10px;">
|
<div style="position: absolute;right: 20px;top: 10px;">
|
||||||
<svg-icon :icon-class="isSrFullscreen ? 'exit-fullscreen' : 'fullscreen'"
|
<svg-icon :icon-class="isSrFullscreen?'exit-fullscreen':'fullscreen'" style="cursor: pointer;font-size: 20px;color:#000;" @click="isSrFullscreen=!isSrFullscreen" />
|
||||||
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" />
|
||||||
<svg-icon icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;"
|
|
||||||
@click="srDialogVisible = false" />
|
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
<div style="height: 100%;margin:0;">
|
<div style="height: 100%;margin:0;">
|
||||||
<SrList v-if="srDialogVisible" :sr-info="srInfo" />
|
<SrList
|
||||||
|
v-if="srDialogVisible"
|
||||||
|
:sr-info="srInfo"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
@@ -252,9 +266,6 @@ export default {
|
|||||||
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
|
||||||
})
|
})
|
||||||
DicomEvent.$on("getStudyFile", () => {
|
|
||||||
DicomEvent.$emit('sendStudyFile', { studyList: this.studyList, studyIndex: this.studyIndex, seriesIndex: this.seriesIndex, visitTaskId: this.visitTaskId })
|
|
||||||
})
|
|
||||||
// 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)
|
||||||
// if (idx > -1) {
|
// if (idx > -1) {
|
||||||
@@ -271,7 +282,7 @@ export default {
|
|||||||
// 初始化待渲染序列
|
// 初始化待渲染序列
|
||||||
this.getInitSeries().then((res) => {
|
this.getInitSeries().then((res) => {
|
||||||
requestPoolManager.startTaskTimer()
|
requestPoolManager.startTaskTimer()
|
||||||
res.map(async (item) => {
|
res.map(async(item) => {
|
||||||
let imageId = item.imageIds[item.imageIdIndex]
|
let imageId = item.imageIds[item.imageIdIndex]
|
||||||
const p = parseInt(new Date().getTime())
|
const p = parseInt(new Date().getTime())
|
||||||
// requestPoolManager.loadAndCacheImagePlus(imageId, item.seriesId, p * 100)
|
// requestPoolManager.loadAndCacheImagePlus(imageId, item.seriesId, p * 100)
|
||||||
@@ -379,15 +390,15 @@ export default {
|
|||||||
this.seriesIndex = seriesArr[1].seriesIndex
|
this.seriesIndex = seriesArr[1].seriesIndex
|
||||||
this.activeNames = [`${seriesArr[1].studyId}`]
|
this.activeNames = [`${seriesArr[1].studyId}`]
|
||||||
}
|
}
|
||||||
} else if (this.visitTaskList[idx].IsBaseLineTask || isReadingTaskViewInOrder === 0) {
|
} else if (this.visitTaskList[idx].IsBaseLineTask || isReadingTaskViewInOrder === 0){
|
||||||
// 基线
|
// 基线
|
||||||
const obj = this.getFirstMarkedSeries(this.visitTaskList[idx].MeasureData, [...this.visitTaskList[idx].StudyList])
|
const obj = this.getFirstMarkedSeries(this.visitTaskList[idx].MeasureData, [...this.visitTaskList[idx].StudyList])
|
||||||
if (Object.keys(obj).length !== 0) {
|
if (Object.keys(obj).length !== 0) {
|
||||||
this.studyIndex = obj.studyIndex
|
this.studyIndex = obj.studyIndex
|
||||||
this.seriesIndex = obj.seriesIndex
|
this.seriesIndex = obj.seriesIndex
|
||||||
seriesList.push(obj.series)
|
seriesList.push(obj.series)
|
||||||
this.activeNames = [`${this.studyList[this.studyIndex].StudyId}`]
|
this.activeNames = [`${this.studyList[ this.studyIndex].StudyId}`]
|
||||||
this.studyList[obj.studyIndex].SeriesList[obj.seriesIndex].isFirstRender = true
|
this.studyList[ obj.studyIndex].SeriesList[obj.seriesIndex].isFirstRender = true
|
||||||
} else {
|
} else {
|
||||||
// 初始化问题表单
|
// 初始化问题表单
|
||||||
if (this.studyList.length > 0) {
|
if (this.studyList.length > 0) {
|
||||||
@@ -419,7 +430,7 @@ export default {
|
|||||||
this.studyIndex = secondObj.studyIndex
|
this.studyIndex = secondObj.studyIndex
|
||||||
this.seriesIndex = secondObj.seriesIndex
|
this.seriesIndex = secondObj.seriesIndex
|
||||||
seriesList.push(secondObj.series)
|
seriesList.push(secondObj.series)
|
||||||
this.studyList[secondObj.studyIndex].SeriesList[secondObj.seriesIndex].isFirstRender = true
|
this.studyList[ secondObj.studyIndex].SeriesList[secondObj.seriesIndex].isFirstRender = true
|
||||||
this.studyIndex = secondObj.studyIndex
|
this.studyIndex = secondObj.studyIndex
|
||||||
this.seriesIndex = secondObj.seriesIndex
|
this.seriesIndex = secondObj.seriesIndex
|
||||||
|
|
||||||
@@ -453,7 +464,7 @@ export default {
|
|||||||
// const isIdx = instanceList.findIndex(is => is.includes(measureDatas[i].InstanceId))
|
// const isIdx = instanceList.findIndex(is => is.includes(measureDatas[i].InstanceId))
|
||||||
const imageIds = seriesList[srIdx].imageIds
|
const imageIds = seriesList[srIdx].imageIds
|
||||||
// let filterStr = seriesList[srIdx].isExistMutiFrames ? `frame=${measureDatas[i].MeasureData.frame}&instanceId=${measureDatas[i].InstanceId}` : `instanceId=${measureDatas[i].InstanceId}`
|
// let filterStr = seriesList[srIdx].isExistMutiFrames ? `frame=${measureDatas[i].MeasureData.frame}&instanceId=${measureDatas[i].InstanceId}` : `instanceId=${measureDatas[i].InstanceId}`
|
||||||
let instanceIndex = seriesList[srIdx].instanceInfoList.findIndex(k => k.Id === measureDatas[i].InstanceId)
|
let instanceIndex = seriesList[srIdx].instanceInfoList.findIndex(k=>k.Id === measureDatas[i].InstanceId)
|
||||||
let filterStr = ''
|
let filterStr = ''
|
||||||
if (instanceIndex > -1 && seriesList[srIdx].isExistMutiFrames) {
|
if (instanceIndex > -1 && seriesList[srIdx].isExistMutiFrames) {
|
||||||
if (seriesList[srIdx].instanceInfoList[instanceIndex].NumberOfFrames > 0) {
|
if (seriesList[srIdx].instanceInfoList[instanceIndex].NumberOfFrames > 0) {
|
||||||
@@ -537,7 +548,7 @@ export default {
|
|||||||
// const instanceList = seriesList[srIdx].instanceList
|
// const instanceList = seriesList[srIdx].instanceList
|
||||||
// const isIdx = instanceList.findIndex(is => is.includes(measureDatas[mIdx].InstanceId))
|
// const isIdx = instanceList.findIndex(is => is.includes(measureDatas[mIdx].InstanceId))
|
||||||
const imageIds = seriesList[srIdx].imageIds
|
const imageIds = seriesList[srIdx].imageIds
|
||||||
let instanceIndex = seriesList[srIdx].instanceInfoList.findIndex(i => i.Id === measureDatas[mIdx].InstanceId)
|
let instanceIndex = seriesList[srIdx].instanceInfoList.findIndex(i=>i.Id === measureDatas[mIdx].InstanceId)
|
||||||
let filterStr = ''
|
let filterStr = ''
|
||||||
if (instanceIndex > -1 && seriesList[srIdx].isExistMutiFrames) {
|
if (instanceIndex > -1 && seriesList[srIdx].isExistMutiFrames) {
|
||||||
if (seriesList[srIdx].instanceInfoList[instanceIndex].NumberOfFrames > 0) {
|
if (seriesList[srIdx].instanceInfoList[instanceIndex].NumberOfFrames > 0) {
|
||||||
@@ -647,7 +658,7 @@ export default {
|
|||||||
this.studyIndex = studyIndex
|
this.studyIndex = studyIndex
|
||||||
this.seriesIndex = seriesIndex
|
this.seriesIndex = seriesIndex
|
||||||
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
||||||
var dicomStatck = Object.assign({}, this.studyList[studyIndex].SeriesList[seriesIndex])
|
var dicomStatck = Object.assign({},this.studyList[studyIndex].SeriesList[seriesIndex])
|
||||||
|
|
||||||
dicomStatck.imageIdIndex = 0
|
dicomStatck.imageIdIndex = 0
|
||||||
this.$emit('loadImageStack', dicomStatck)
|
this.$emit('loadImageStack', dicomStatck)
|
||||||
@@ -696,7 +707,7 @@ export default {
|
|||||||
this.studyIndex = studyIndex
|
this.studyIndex = studyIndex
|
||||||
this.seriesIndex = seriesIndex
|
this.seriesIndex = seriesIndex
|
||||||
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
this.studyList[studyIndex].SeriesList[seriesIndex].measureData = this.measureData
|
||||||
var dicomStatck = Object.assign({}, this.studyList[studyIndex].SeriesList[seriesIndex])
|
var dicomStatck = Object.assign({},this.studyList[studyIndex].SeriesList[seriesIndex])
|
||||||
const imageIds = []
|
const imageIds = []
|
||||||
if (instanceInfo.KeyFramesList.length > 0) {
|
if (instanceInfo.KeyFramesList.length > 0) {
|
||||||
instanceInfo.KeyFramesList.map(i => {
|
instanceInfo.KeyFramesList.map(i => {
|
||||||
@@ -856,17 +867,15 @@ export default {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.study-wrapper {
|
.study-wrapper{
|
||||||
::v-deep .el-progress-bar__inner {
|
::v-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;
|
overflow-x: hidden;
|
||||||
|
.dicom-desc{
|
||||||
.dicom-desc {
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
@@ -878,23 +887,19 @@ export default {
|
|||||||
overflow-anchor: none;
|
overflow-anchor: none;
|
||||||
touch-action: auto;
|
touch-action: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.series-active {
|
.series-active {
|
||||||
background-color: #607d8b !important;
|
background-color: #607d8b!important;
|
||||||
border: 1px solid #607d8b !important;
|
border: 1px solid #607d8b!important;
|
||||||
}
|
}
|
||||||
|
::v-deep .el-progress__text{
|
||||||
::v-deep .el-progress__text {
|
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
.series{
|
||||||
.series {
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
|
|
||||||
.series-wrapper {
|
.series-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -907,13 +912,11 @@ export default {
|
|||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
border: 1px solid #404040;
|
border: 1px solid #404040;
|
||||||
background-color: #3a3a3a;
|
background-color: #3a3a3a;
|
||||||
|
.el-progress__text{
|
||||||
.el-progress__text {
|
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
.el-progress-bar{
|
||||||
.el-progress-bar {
|
padding-right:0px;
|
||||||
padding-right: 0px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.image-preview {
|
.image-preview {
|
||||||
@@ -922,11 +925,9 @@ export default {
|
|||||||
border: 2px solid #252525;
|
border: 2px solid #252525;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.image-desc {
|
.image-desc {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
|
p{
|
||||||
p {
|
|
||||||
width: 95px;
|
width: 95px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -935,8 +936,7 @@ export default {
|
|||||||
color: #ddd;
|
color: #ddd;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
|
div{
|
||||||
div {
|
|
||||||
width: 95px;
|
width: 95px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -944,8 +944,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.flex-div{
|
||||||
.flex-div {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
@@ -961,89 +960,76 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
::v-deep .el-collapse{
|
||||||
::v-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:5px;
|
||||||
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;
|
||||||
padding-left: 5px;
|
padding-left: 5px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.sr-wrapper{
|
||||||
.sr-wrapper {
|
::v-deep .el-dialog{
|
||||||
::v-deep .el-dialog {
|
|
||||||
background: #fff !important;
|
background: #fff !important;
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
|
|
||||||
// color: #ddd;
|
// color: #ddd;
|
||||||
.el-dialog__title {
|
.el-dialog__title{
|
||||||
color: #fff;
|
color:#fff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
::v-deep .sr-dialog-container{
|
||||||
::v-deep .sr-dialog-container {
|
|
||||||
margin-top: 50px !important;
|
margin-top: 50px !important;
|
||||||
width: 75%;
|
width:75%;
|
||||||
height: 80%;
|
height:80%;
|
||||||
}
|
}
|
||||||
|
::v-deep .el-dialog__body{
|
||||||
::v-deep .el-dialog__body {
|
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
height: calc(100% - 50px);
|
height: calc(100% - 50px);
|
||||||
}
|
}
|
||||||
|
.el-dialog__header{
|
||||||
.el-dialog__header {
|
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
.sr-full-dialog-container{
|
||||||
.sr-full-dialog-container {
|
::v-deep .is-fullscreen .el-dialog__body{
|
||||||
::v-deep .is-fullscreen .el-dialog__body {
|
|
||||||
height: calc(100% - 50px);
|
height: calc(100% - 50px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
<style>
|
<style>
|
||||||
.instance_frame_wrapper {
|
.instance_frame_wrapper{
|
||||||
min-width: 120px;
|
min-width: 120px;
|
||||||
background-color: #2c2c2c;
|
background-color: #2c2c2c;
|
||||||
border: 1px solid #2c2c2c;
|
border: 1px solid #2c2c2c;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
.frame_list{
|
||||||
.frame_list {
|
|
||||||
max-height: 500px;
|
max-height: 500px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.instance_frame_wrapper ::-webkit-scrollbar {
|
.instance_frame_wrapper ::-webkit-scrollbar {
|
||||||
width: 7px;
|
width: 7px;
|
||||||
height: 7px;
|
height: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.instance_frame_wrapper ::-webkit-scrollbar-thumb {
|
.instance_frame_wrapper ::-webkit-scrollbar-thumb {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
}
|
}
|
||||||
|
.frame_content{
|
||||||
.frame_content {
|
|
||||||
height: 50px;
|
height: 50px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -1052,7 +1038,6 @@ export default {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
border: 1px solid #404040;
|
border: 1px solid #404040;
|
||||||
}
|
}
|
||||||
|
|
||||||
.frame_content:hover {
|
.frame_content:hover {
|
||||||
/* font-weight: bold; */
|
/* font-weight: bold; */
|
||||||
/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */
|
/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */
|
||||||
@@ -1061,7 +1046,6 @@ export default {
|
|||||||
border-color: #213a54 !important;
|
border-color: #213a54 !important;
|
||||||
background-color: #213a54;
|
background-color: #213a54;
|
||||||
}
|
}
|
||||||
|
|
||||||
.frame_content_active {
|
.frame_content_active {
|
||||||
border-color: #213a54 !important;
|
border-color: #213a54 !important;
|
||||||
background-color: #213a54;
|
background-color: #213a54;
|
||||||
|
|||||||
@@ -619,14 +619,6 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-dialog.cd-dialog-container {
|
|
||||||
.el-input.is-disabled .el-input__inner {
|
|
||||||
background-color: rgb(245, 247, 250);
|
|
||||||
color: #666;
|
|
||||||
border: 1px solid #dcdfe6;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .dialog-container {
|
::v-deep .dialog-container {
|
||||||
|
|||||||
@@ -12,9 +12,7 @@
|
|||||||
{ required: true, message: $t('common:ruleMessage:select'), trigger: 'blur' }
|
{ required: true, message: $t('common:ruleMessage:select'), trigger: 'blur' }
|
||||||
]">
|
]">
|
||||||
<el-select v-model="fusionForm.studyId" clearable @change="handleStudyIdChange">
|
<el-select v-model="fusionForm.studyId" clearable @change="handleStudyIdChange">
|
||||||
<el-option v-for="item in studyList" :key="item.StudyId"
|
<el-option v-for="item in studyList" :key="item.StudyId" :label="item.StudyCode" :value="item.StudyId" />
|
||||||
:label="taskInfo.IsReadingTaskViewInOrder !== 0 ? item.StudyCode : `${item.Modalities}(${item.SeriesCount})`"
|
|
||||||
:value="item.StudyId" />
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 融合图像 -->
|
<!-- 融合图像 -->
|
||||||
@@ -113,12 +111,10 @@ export default {
|
|||||||
ctSeries: [],
|
ctSeries: [],
|
||||||
petSeries: [],
|
petSeries: [],
|
||||||
petctWindow: null,
|
petctWindow: null,
|
||||||
digitPlaces: 2,
|
digitPlaces: 2
|
||||||
taskInfo: {}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.taskInfo = JSON.parse(sessionStorage.getItem('taskInfo'))
|
|
||||||
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.initForm()
|
this.initForm()
|
||||||
|
|||||||
@@ -187,7 +187,6 @@ export default {
|
|||||||
originalMarkers: [],
|
originalMarkers: [],
|
||||||
markers: { top: '', right: '', bottom: '', left: '' },
|
markers: { top: '', right: '', bottom: '', left: '' },
|
||||||
playClipState: false,
|
playClipState: false,
|
||||||
clipFramesPerSecond: null,
|
|
||||||
wwwcIdx: 2,
|
wwwcIdx: 2,
|
||||||
presetName: '',
|
presetName: '',
|
||||||
volumeId: null,
|
volumeId: null,
|
||||||
@@ -626,22 +625,6 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
syncViewportStaticState() {
|
|
||||||
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
|
||||||
if (!renderingEngine) return
|
|
||||||
const viewport = renderingEngine.getViewport(this.viewportId)
|
|
||||||
if (!viewport) return
|
|
||||||
|
|
||||||
this.getOrientationMarker()
|
|
||||||
const toolGroup =
|
|
||||||
cornerstoneTools.ToolGroupManager.getToolGroupForViewport(
|
|
||||||
this.viewportId,
|
|
||||||
this.renderingEngineId
|
|
||||||
) || cornerstoneTools.ToolGroupManager.getToolGroup(this.viewportId)
|
|
||||||
if (toolGroup) {
|
|
||||||
toolGroup.setToolEnabled('ScaleOverlay')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
setFullScreen(index) {
|
setFullScreen(index) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
||||||
@@ -744,33 +727,14 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
toggleClipPlay(isPlay, framesPerSecond) {
|
toggleClipPlay(isPlay, framesPerSecond) {
|
||||||
|
this.playClipState = isPlay
|
||||||
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
||||||
if (!renderingEngine) return
|
|
||||||
const viewport = renderingEngine.getViewport(this.viewportId)
|
const viewport = renderingEngine.getViewport(this.viewportId)
|
||||||
if (!viewport?.element) return
|
|
||||||
|
|
||||||
const parsedFramesPerSecond = Number(framesPerSecond)
|
|
||||||
const nextFramesPerSecond = Number.isFinite(parsedFramesPerSecond)
|
|
||||||
? parsedFramesPerSecond
|
|
||||||
: (this.clipFramesPerSecond || 15)
|
|
||||||
const isSameSpeedWhilePlaying = this.playClipState &&
|
|
||||||
isPlay &&
|
|
||||||
this.clipFramesPerSecond === nextFramesPerSecond
|
|
||||||
|
|
||||||
if (isPlay) {
|
if (isPlay) {
|
||||||
if (isSameSpeedWhilePlaying) return
|
cornerstoneTools.utilities.cine.playClip(viewport.element, { framesPerSecond, loop: true })
|
||||||
|
|
||||||
cornerstoneTools.utilities.cine.playClip(viewport.element, {
|
|
||||||
framesPerSecond: nextFramesPerSecond,
|
|
||||||
loop: true,
|
|
||||||
waitForRendered: 1
|
|
||||||
})
|
|
||||||
this.clipFramesPerSecond = nextFramesPerSecond
|
|
||||||
this.playClipState = true
|
|
||||||
} else {
|
} else {
|
||||||
cornerstoneTools.utilities.cine.stopClip(viewport.element)
|
cornerstoneTools.utilities.cine.stopClip(viewport.element)
|
||||||
this.clipFramesPerSecond = null
|
|
||||||
this.playClipState = false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
scrollPage(type) {
|
scrollPage(type) {
|
||||||
@@ -1161,7 +1125,6 @@ export default {
|
|||||||
|
|
||||||
}
|
}
|
||||||
viewport.render()
|
viewport.render()
|
||||||
this.syncViewportStaticState()
|
|
||||||
if (this.currentVoiUpper > 0) {
|
if (this.currentVoiUpper > 0) {
|
||||||
this.voiChange(this.currentVoiUpper)
|
this.voiChange(this.currentVoiUpper)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -284,7 +284,7 @@
|
|||||||
<svg-icon icon-class="lastframe" class="svg-icon" />
|
<svg-icon icon-class="lastframe" class="svg-icon" />
|
||||||
</div>
|
</div>
|
||||||
<select v-model="fps" :title="$t('trials:dicom-show:speed')" class="select-wrapper"
|
<select v-model="fps" :title="$t('trials:dicom-show:speed')" class="select-wrapper"
|
||||||
@change="handleClipFpsChange">
|
:disabled="clipPlaying">
|
||||||
<!-- 默认值 -->
|
<!-- 默认值 -->
|
||||||
<option :value="5">5</option>
|
<option :value="5">5</option>
|
||||||
<option :value="10">10</option>
|
<option :value="10">10</option>
|
||||||
@@ -320,7 +320,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tool-item" :title="$t('trials:reading:button:upload')"
|
<div class="tool-item" :title="$t('trials:reading:button:upload')"
|
||||||
v-if="trialCriterion.ImageUploadEnum > 0" v-hasPermi="['role:ir']">
|
v-if="trialCriterion.ImageUploadEnum > 0 && readingTaskState < 2" v-hasPermi="['role:ir']">
|
||||||
<div class="tool-wrapper">
|
<div class="tool-wrapper">
|
||||||
<div class="icon" @click.prevent="openUploadImage('upload')">
|
<div class="icon" @click.prevent="openUploadImage('upload')">
|
||||||
<i class="el-icon-upload2 svg-icon" />
|
<i class="el-icon-upload2 svg-icon" />
|
||||||
@@ -582,11 +582,10 @@
|
|||||||
:renderingEngineId="renderingEngineId" :visitInfo="taskInfo" /> -->
|
:renderingEngineId="renderingEngineId" :visitInfo="taskInfo" /> -->
|
||||||
<upload-dicom-and-nonedicom v-if="uploadImageVisible" :subject-id="uploadSubjectId"
|
<upload-dicom-and-nonedicom v-if="uploadImageVisible" :subject-id="uploadSubjectId"
|
||||||
:subject-code="uploadSubjectCode" :criterion="uploadTrialCriterion" :visible.sync="uploadImageVisible"
|
:subject-code="uploadSubjectCode" :criterion="uploadTrialCriterion" :visible.sync="uploadImageVisible"
|
||||||
:visit-task-id="taskId" :is-reading-task-view-in-order="isReadingTaskViewInOrder" :isReading="true" />
|
:visit-task-id="taskId" :is-reading-task-view-in-order="isReadingTaskViewInOrder" />
|
||||||
<download-dicom-and-nonedicom v-if="downloadImageVisible" :subject-id="uploadSubjectId"
|
<download-dicom-and-nonedicom v-if="downloadImageVisible" :subject-id="uploadSubjectId"
|
||||||
:subject-code="uploadSubjectCode" :criterion="uploadTrialCriterion" :task-id="taskId"
|
:subject-code="uploadSubjectCode" :criterion="uploadTrialCriterion" :task-id="taskId"
|
||||||
:visible.sync="downloadImageVisible" :is-reading-task-view-in-order="isReadingTaskViewInOrder"
|
:visible.sync="downloadImageVisible" :is-reading-task-view-in-order="isReadingTaskViewInOrder" />
|
||||||
:isReading="true" />
|
|
||||||
<readingChart ref="readingChart" />
|
<readingChart ref="readingChart" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -1222,7 +1221,12 @@ export default {
|
|||||||
this.selectArr.push(item.VisitTaskId)
|
this.selectArr.push(item.VisitTaskId)
|
||||||
}
|
}
|
||||||
if (item.IsCurrentTask) {
|
if (item.IsCurrentTask) {
|
||||||
this.syncMarkedSeriesIds(annotations)
|
this.markedSeriesIds = []
|
||||||
|
annotations.map(i => {
|
||||||
|
if (i.MeasureData && i.MeasureData.seriesId) {
|
||||||
|
this.markedSeriesIds.push(i.MeasureData.seriesId)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2048,7 +2052,7 @@ export default {
|
|||||||
|
|
||||||
// this.$refs['ecrf'].setAnnotation({ annotation, toolName: annotation.metadata.toolName })
|
// this.$refs['ecrf'].setAnnotation({ annotation, toolName: annotation.metadata.toolName })
|
||||||
this.$refs[`ecrf_${this.lastViewportTaskId}`][0].setAnnotation({ annotation, toolName: annotation.metadata.toolName })
|
this.$refs[`ecrf_${this.lastViewportTaskId}`][0].setAnnotation({ annotation, toolName: annotation.metadata.toolName })
|
||||||
this.syncMarkedSeriesIdsFromState(series.TaskInfo.VisitTaskId)
|
this.markedSeriesIds.push(series.Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setToolsPassive()
|
this.setToolsPassive()
|
||||||
@@ -2083,14 +2087,16 @@ export default {
|
|||||||
throw errorMsg
|
throw errorMsg
|
||||||
}
|
}
|
||||||
if (annotation.visitTaskId === this.taskInfo.VisitTaskId && annotation.seriesId) {
|
if (annotation.visitTaskId === this.taskInfo.VisitTaskId && annotation.seriesId) {
|
||||||
this.syncMarkedSeriesIdsFromState(annotation.visitTaskId)
|
const index = this.markedSeriesIds.indexOf(annotation.seriesId)
|
||||||
|
if (index !== -1) {
|
||||||
|
this.markedSeriesIds.splice(index, 1)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const errorMsg = { message: 'annotation Not allowed to operate' }
|
const errorMsg = { message: 'annotation Not allowed to operate' }
|
||||||
throw errorMsg
|
throw errorMsg
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
cornerstoneTools.annotation.state.addAnnotation(annotation)
|
cornerstoneTools.annotation.state.addAnnotation(annotation)
|
||||||
this.syncMarkedSeriesIdsFromState(annotation.visitTaskId)
|
|
||||||
const renderingEngine = getRenderingEngine(renderingEngineId)
|
const renderingEngine = getRenderingEngine(renderingEngineId)
|
||||||
for (let i = 0; i < this.cells.length; i++) {
|
for (let i = 0; i < this.cells.length; i++) {
|
||||||
const viewportId = `${this.viewportKey}-${i}`
|
const viewportId = `${this.viewportKey}-${i}`
|
||||||
@@ -2127,7 +2133,7 @@ export default {
|
|||||||
annotation.sliceThickness = series.SliceThickness
|
annotation.sliceThickness = series.SliceThickness
|
||||||
annotation.numberOfFrames = isNaN(parseInt(params.frame)) ? null : parseInt(params.frame)
|
annotation.numberOfFrames = isNaN(parseInt(params.frame)) ? null : parseInt(params.frame)
|
||||||
annotation.markTool = annotation.metadata.toolName
|
annotation.markTool = annotation.metadata.toolName
|
||||||
this.syncMarkedSeriesIdsFromState(series.TaskInfo.VisitTaskId)
|
this.markedSeriesIds.push(series.Id)
|
||||||
const operateStateEnum = this.$refs[`ecrf_${this.taskInfo.VisitTaskId}`][0].operateStateEnum
|
const operateStateEnum = this.$refs[`ecrf_${this.taskInfo.VisitTaskId}`][0].operateStateEnum
|
||||||
const markName = await this.customPrompt(!this.isNumber(operateStateEnum))
|
const markName = await this.customPrompt(!this.isNumber(operateStateEnum))
|
||||||
|
|
||||||
@@ -2269,7 +2275,10 @@ export default {
|
|||||||
if (!res.IsSuccess) throw ''
|
if (!res.IsSuccess) throw ''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.syncMarkedSeriesIdsFromState(annotation.visitTaskId)
|
const index = this.markedSeriesIds.indexOf(annotation.seriesId)
|
||||||
|
if (index !== -1) {
|
||||||
|
this.markedSeriesIds.splice(index, 1)
|
||||||
|
}
|
||||||
const renderingEngine = getRenderingEngine(renderingEngineId)
|
const renderingEngine = getRenderingEngine(renderingEngineId)
|
||||||
for (let i = 0; i < this.cells.length; i++) {
|
for (let i = 0; i < this.cells.length; i++) {
|
||||||
const viewportId = `${this.viewportKey}-${i}`
|
const viewportId = `${this.viewportKey}-${i}`
|
||||||
@@ -2282,7 +2291,6 @@ export default {
|
|||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
cornerstoneTools.annotation.state.addAnnotation(annotation)
|
cornerstoneTools.annotation.state.addAnnotation(annotation)
|
||||||
this.syncMarkedSeriesIdsFromState(annotation.visitTaskId)
|
|
||||||
const renderingEngine = getRenderingEngine(renderingEngineId)
|
const renderingEngine = getRenderingEngine(renderingEngineId)
|
||||||
for (let i = 0; i < this.cells.length; i++) {
|
for (let i = 0; i < this.cells.length; i++) {
|
||||||
const viewportId = `${this.viewportKey}-${i}`
|
const viewportId = `${this.viewportKey}-${i}`
|
||||||
@@ -2359,22 +2367,6 @@ export default {
|
|||||||
this.$set(this.visitTaskList[taskIdx], 'Annotations', annotations)
|
this.$set(this.visitTaskList[taskIdx], 'Annotations', annotations)
|
||||||
this.$set(this.visitTaskList[taskIdx], 'AnnotationUIDs', annotationUIDs)
|
this.$set(this.visitTaskList[taskIdx], 'AnnotationUIDs', annotationUIDs)
|
||||||
},
|
},
|
||||||
collectMarkedSeriesIds(list = []) {
|
|
||||||
return [...new Set(
|
|
||||||
list
|
|
||||||
.map(item => item?.MeasureData?.seriesId || item?.seriesId)
|
|
||||||
.filter(Boolean)
|
|
||||||
)]
|
|
||||||
},
|
|
||||||
syncMarkedSeriesIds(list = []) {
|
|
||||||
this.markedSeriesIds = this.collectMarkedSeriesIds(list)
|
|
||||||
},
|
|
||||||
syncMarkedSeriesIdsFromState(visitTaskId = this.taskInfo?.VisitTaskId) {
|
|
||||||
const annotations = cornerstoneTools.annotation.state.getAllAnnotations().filter(item => {
|
|
||||||
return item.visitTaskId === visitTaskId && item.seriesId
|
|
||||||
})
|
|
||||||
this.syncMarkedSeriesIds(annotations)
|
|
||||||
},
|
|
||||||
async resetAnnotations(visitTaskId) {
|
async resetAnnotations(visitTaskId) {
|
||||||
if (this.readingTaskState === 2) return
|
if (this.readingTaskState === 2) return
|
||||||
const taskIdx = this.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
const taskIdx = this.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
|
||||||
@@ -2409,9 +2401,9 @@ export default {
|
|||||||
if (i.MeasureData) {
|
if (i.MeasureData) {
|
||||||
const annotation = i.MeasureData
|
const annotation = i.MeasureData
|
||||||
cornerstoneTools.annotation.state.addAnnotation(annotation)
|
cornerstoneTools.annotation.state.addAnnotation(annotation)
|
||||||
|
this.markedSeriesIds.push(annotation.seriesId)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
this.syncMarkedSeriesIds(annotations)
|
|
||||||
const renderingEngine = getRenderingEngine(renderingEngineId)
|
const renderingEngine = getRenderingEngine(renderingEngineId)
|
||||||
for (let i = 0; i < this.cells.length; i++) {
|
for (let i = 0; i < this.cells.length; i++) {
|
||||||
const viewportId = `${this.viewportKey}-${i}`
|
const viewportId = `${this.viewportKey}-${i}`
|
||||||
@@ -3423,15 +3415,6 @@ export default {
|
|||||||
this.clipPlaying = !this.clipPlaying
|
this.clipPlaying = !this.clipPlaying
|
||||||
this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].toggleClipPlay(isPlay, this.fps)
|
this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].toggleClipPlay(isPlay, this.fps)
|
||||||
},
|
},
|
||||||
handleClipFpsChange() {
|
|
||||||
if (!this.clipPlaying) return
|
|
||||||
|
|
||||||
const activeViewportRef = this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`]
|
|
||||||
const activeViewport = activeViewportRef && activeViewportRef[0]
|
|
||||||
if (!activeViewport || typeof activeViewport.toggleClipPlay !== 'function') return
|
|
||||||
|
|
||||||
activeViewport.toggleClipPlay(true, this.fps)
|
|
||||||
},
|
|
||||||
// 获取窗宽窗位模板
|
// 获取窗宽窗位模板
|
||||||
async getWwcTpl() {
|
async getWwcTpl() {
|
||||||
try {
|
try {
|
||||||
@@ -4054,10 +4037,8 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!this.isActiveViewportAtMeasureLocation(obj.annotation)) {
|
|
||||||
this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setSeriesInfo(series, true)
|
this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setSeriesInfo(series, true)
|
||||||
this.$refs[series.TaskInfo.VisitTaskId][0].setSeriesActive(series.StudyIndex, series.SeriesIndex)
|
this.$refs[series.TaskInfo.VisitTaskId][0].setSeriesActive(series.StudyIndex, series.SeriesIndex)
|
||||||
}
|
|
||||||
setTimeout(async () => {
|
setTimeout(async () => {
|
||||||
const divForDownloadViewport = document.querySelector(
|
const divForDownloadViewport = document.querySelector(
|
||||||
`div[data-viewport-uid="${this.viewportKey}-${this.activeViewportIndex}"]`
|
`div[data-viewport-uid="${this.viewportKey}-${this.activeViewportIndex}"]`
|
||||||
@@ -4068,48 +4049,9 @@ export default {
|
|||||||
}, 200)
|
}, 200)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getMeasureImageLocation(measureData = {}) {
|
|
||||||
const referencedImageId = measureData?.metadata?.referencedImageId
|
|
||||||
const referencedImageParams = referencedImageId ? this.getInstanceInfo(referencedImageId) : {}
|
|
||||||
return {
|
|
||||||
visitTaskId: measureData.visitTaskId,
|
|
||||||
studyId: measureData.studyId || measureData.StudyId,
|
|
||||||
seriesId: measureData.seriesId || measureData.SeriesId,
|
|
||||||
instanceId: measureData.instanceId || measureData.InstanceId || referencedImageParams.instanceId || null,
|
|
||||||
frame: measureData.numberOfFrames ?? measureData.NumberOfFrames ?? referencedImageParams.frame
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getActiveViewportImageLocation() {
|
|
||||||
const viewportRef = this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`]?.[0]
|
|
||||||
const currentSeries = viewportRef?.series
|
|
||||||
if (!currentSeries) return null
|
|
||||||
const renderingEngine = getRenderingEngine(renderingEngineId)
|
|
||||||
const viewport = renderingEngine?.getViewport(`${this.viewportKey}-${this.activeViewportIndex}`)
|
|
||||||
const currentImageId = viewport?.getCurrentImageId?.()
|
|
||||||
const currentImageParams = currentImageId ? this.getInstanceInfo(currentImageId) : {}
|
|
||||||
return {
|
|
||||||
visitTaskId: currentSeries.TaskInfo?.VisitTaskId,
|
|
||||||
studyId: currentSeries.StudyId,
|
|
||||||
seriesId: currentSeries.Id,
|
|
||||||
instanceId: currentImageParams.instanceId || null,
|
|
||||||
frame: currentImageParams.frame
|
|
||||||
}
|
|
||||||
},
|
|
||||||
isActiveViewportAtMeasureLocation(measureData) {
|
|
||||||
const targetLocation = this.getMeasureImageLocation(measureData)
|
|
||||||
const currentLocation = this.getActiveViewportImageLocation()
|
|
||||||
if (!currentLocation || !targetLocation.seriesId) return false
|
|
||||||
if (targetLocation.visitTaskId && currentLocation.visitTaskId !== targetLocation.visitTaskId) return false
|
|
||||||
if (targetLocation.studyId && currentLocation.studyId !== targetLocation.studyId) return false
|
|
||||||
if (currentLocation.seriesId !== targetLocation.seriesId) return false
|
|
||||||
if (targetLocation.instanceId && currentLocation.instanceId !== targetLocation.instanceId) return false
|
|
||||||
return currentLocation.frame === targetLocation.frame
|
|
||||||
},
|
|
||||||
async getScreenshots(measureData, callback) {
|
async getScreenshots(measureData, callback) {
|
||||||
if (measureData) {
|
if (measureData) {
|
||||||
if (!this.isActiveViewportAtMeasureLocation(measureData.annotation)) {
|
|
||||||
await this.imageLocation(measureData)
|
await this.imageLocation(measureData)
|
||||||
}
|
|
||||||
const divForDownloadViewport = document.querySelector(
|
const divForDownloadViewport = document.querySelector(
|
||||||
`div[data-viewport-uid="${this.viewportKey}-${this.activeViewportIndex}"]`
|
`div[data-viewport-uid="${this.viewportKey}-${this.activeViewportIndex}"]`
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,8 +4,7 @@
|
|||||||
<el-form-item :label="$t('segment:form:label:studyName')" prop="taskBlindName">
|
<el-form-item :label="$t('segment:form:label:studyName')" prop="taskBlindName">
|
||||||
<el-select v-model="form.studyId" clearable @change="(e) => handleChange(e, 'study')"
|
<el-select v-model="form.studyId" clearable @change="(e) => handleChange(e, 'study')"
|
||||||
@clear="(e) => handleClear(e, 'study')">
|
@clear="(e) => handleClear(e, 'study')">
|
||||||
<el-option v-for="item in studyList" :key="item.StudyId"
|
<el-option v-for="item in studyList" :key="item.StudyId" :label="item.StudyCode"
|
||||||
:label="taskInfo.IsReadingTaskViewInOrder !== 0 ? item.StudyCode : `${item.Modalities}(${item.SeriesCount})`"
|
|
||||||
:value="item.StudyId" />
|
:value="item.StudyId" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -88,13 +87,12 @@ export default {
|
|||||||
}, trigger: ['blur', 'change']
|
}, trigger: ['blur', 'change']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
taskInfo: {}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
// mounted() {
|
||||||
this.taskInfo = JSON.parse(sessionStorage.getItem('taskInfo'))
|
// this.init()
|
||||||
},
|
// },
|
||||||
methods: {
|
methods: {
|
||||||
setSeries(series) {
|
setSeries(series) {
|
||||||
this.series = series
|
this.series = series
|
||||||
|
|||||||
@@ -150,8 +150,6 @@ export default {
|
|||||||
originalMarkers: [],
|
originalMarkers: [],
|
||||||
markers: { top: '', right: '', bottom: '', left: '' },
|
markers: { top: '', right: '', bottom: '', left: '' },
|
||||||
playClipState: false,
|
playClipState: false,
|
||||||
clipFramesPerSecond: null,
|
|
||||||
toggleClipPlayTimer: null,
|
|
||||||
wwwcIdx: 2,
|
wwwcIdx: 2,
|
||||||
loading: false,
|
loading: false,
|
||||||
forceFitToWindow: false,
|
forceFitToWindow: false,
|
||||||
@@ -171,10 +169,6 @@ export default {
|
|||||||
this.resizeObserver.unobserve(this.element)
|
this.resizeObserver.unobserve(this.element)
|
||||||
this.resizeObserver.disconnect()
|
this.resizeObserver.disconnect()
|
||||||
}
|
}
|
||||||
if (this.toggleClipPlayTimer) {
|
|
||||||
clearInterval(this.toggleClipPlayTimer)
|
|
||||||
this.toggleClipPlayTimer = null
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
initViewport() {
|
initViewport() {
|
||||||
@@ -216,11 +210,12 @@ export default {
|
|||||||
this.imageInfo.imageOrientationPatient = imagePlaneModule.imageOrientationPatient
|
this.imageInfo.imageOrientationPatient = imagePlaneModule.imageOrientationPatient
|
||||||
this.imageInfo.imagePositionPatient = imagePlaneModule.imagePositionPatient
|
this.imageInfo.imagePositionPatient = imagePlaneModule.imagePositionPatient
|
||||||
this.imageInfo.location = imagePlaneModule.sliceLocation
|
this.imageInfo.location = imagePlaneModule.sliceLocation
|
||||||
|
// this.imageInfo.wwwc = `${Math.round(detail.image.windowWidth)}/${Math.round(detail.image.windowCenter)}`
|
||||||
this.getOrientationMarker()
|
this.getOrientationMarker()
|
||||||
const toolGroup = cornerstoneTools.ToolGroupManager.getToolGroup(this.viewportId)
|
this.$emit('renderAnnotations', this.series)
|
||||||
if (toolGroup) {
|
const toolGroupId = this.viewportId
|
||||||
|
const toolGroup = cornerstoneTools.ToolGroupManager.getToolGroup(toolGroupId)
|
||||||
toolGroup.setToolEnabled('ScaleOverlay')
|
toolGroup.setToolEnabled('ScaleOverlay')
|
||||||
}
|
|
||||||
},
|
},
|
||||||
imageRendered(e) {
|
imageRendered(e) {
|
||||||
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
||||||
@@ -317,61 +312,14 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
toggleClipPlay(isPlay, framesPerSecond) {
|
toggleClipPlay(isPlay, framesPerSecond) {
|
||||||
|
this.playClipState = isPlay
|
||||||
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
||||||
if (!renderingEngine) return
|
|
||||||
const viewport = renderingEngine.getViewport(this.viewportId)
|
const viewport = renderingEngine.getViewport(this.viewportId)
|
||||||
if (!viewport?.element) return
|
|
||||||
|
|
||||||
const parsedFramesPerSecond = Number(framesPerSecond)
|
|
||||||
const nextFramesPerSecond = Number.isFinite(parsedFramesPerSecond)
|
|
||||||
? parsedFramesPerSecond
|
|
||||||
: (this.clipFramesPerSecond || 15)
|
|
||||||
const isSameSpeedWhilePlaying = this.playClipState &&
|
|
||||||
isPlay &&
|
|
||||||
this.clipFramesPerSecond === nextFramesPerSecond
|
|
||||||
|
|
||||||
if (isPlay) {
|
if (isPlay) {
|
||||||
if (isSameSpeedWhilePlaying) return
|
cornerstoneTools.utilities.cine.playClip(viewport.element, { framesPerSecond, loop: true })
|
||||||
|
|
||||||
cornerstoneTools.utilities.cine.stopClip(viewport.element)
|
|
||||||
if (this.toggleClipPlayTimer) {
|
|
||||||
clearInterval(this.toggleClipPlayTimer)
|
|
||||||
this.toggleClipPlayTimer = null
|
|
||||||
}
|
|
||||||
|
|
||||||
const frameInterval = Math.max(16, Math.round(1000 / nextFramesPerSecond))
|
|
||||||
this.toggleClipPlayTimer = setInterval(() => {
|
|
||||||
const imageIds = viewport.getImageIds()
|
|
||||||
if (!imageIds?.length) return
|
|
||||||
|
|
||||||
let index = viewport.getCurrentImageIdIndex() + 1
|
|
||||||
if (index > imageIds.length - 1) {
|
|
||||||
index = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
csUtils.jumpToSlice(viewport.element, {
|
|
||||||
imageIndex: index,
|
|
||||||
debounceLoading: false
|
|
||||||
})
|
|
||||||
}, frameInterval)
|
|
||||||
this.clipFramesPerSecond = nextFramesPerSecond
|
|
||||||
this.playClipState = true
|
|
||||||
} else {
|
} else {
|
||||||
cornerstoneTools.utilities.cine.stopClip(viewport.element)
|
cornerstoneTools.utilities.cine.stopClip(viewport.element)
|
||||||
if (this.toggleClipPlayTimer) {
|
|
||||||
clearInterval(this.toggleClipPlayTimer)
|
|
||||||
this.toggleClipPlayTimer = null
|
|
||||||
}
|
|
||||||
this.clipFramesPerSecond = null
|
|
||||||
this.playClipState = false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
syncViewportStaticState() {
|
|
||||||
this.getOrientationMarker()
|
|
||||||
this.$emit('renderAnnotations', this.series)
|
|
||||||
const toolGroup = cornerstoneTools.ToolGroupManager.getToolGroup(this.viewportId)
|
|
||||||
if (toolGroup) {
|
|
||||||
toolGroup.setToolEnabled('ScaleOverlay')
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
scrollPage(type) {
|
scrollPage(type) {
|
||||||
@@ -391,13 +339,7 @@ export default {
|
|||||||
}
|
}
|
||||||
// viewport.setImageIdIndex(newImageIdIndex)
|
// viewport.setImageIdIndex(newImageIdIndex)
|
||||||
csUtils.jumpToSlice(viewport.element, { imageIndex: newImageIdIndex })
|
csUtils.jumpToSlice(viewport.element, { imageIndex: newImageIdIndex })
|
||||||
if (this.toggleClipPlayTimer) {
|
|
||||||
clearInterval(this.toggleClipPlayTimer)
|
|
||||||
this.toggleClipPlayTimer = null
|
|
||||||
}
|
|
||||||
cornerstoneTools.utilities.cine.stopClip(viewport.element)
|
cornerstoneTools.utilities.cine.stopClip(viewport.element)
|
||||||
this.clipFramesPerSecond = null
|
|
||||||
this.playClipState = false
|
|
||||||
},
|
},
|
||||||
setZoom(ratio) {
|
setZoom(ratio) {
|
||||||
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
||||||
@@ -490,7 +432,6 @@ export default {
|
|||||||
}
|
}
|
||||||
this.prefetchMetadataInformation(obj.ImageIds, obj.Modality)
|
this.prefetchMetadataInformation(obj.ImageIds, obj.Modality)
|
||||||
await viewport.setStack(this.series.Stack, obj.SliceIndex)
|
await viewport.setStack(this.series.Stack, obj.SliceIndex)
|
||||||
this.syncViewportStaticState()
|
|
||||||
|
|
||||||
viewport.render()
|
viewport.render()
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
+2
-2
@@ -24,7 +24,7 @@
|
|||||||
<template v-if="rerender">
|
<template v-if="rerender">
|
||||||
<QuestionFormItem v-for="question of questions" :key="question.Id" :visit-task-id="visitTaskId"
|
<QuestionFormItem v-for="question of questions" :key="question.Id" :visit-task-id="visitTaskId"
|
||||||
:isNoneDicom="isNoneDicom" :question="question" :question-form="questionForm"
|
:isNoneDicom="isNoneDicom" :question="question" :question-form="questionForm"
|
||||||
:reading-task-state="1" :criterion-id="criterionId" :calculation-list="calculationList"
|
:reading-task-state="readingTaskState" :criterion-id="criterionId" :calculation-list="calculationList"
|
||||||
:question-mark-info-list="questionMarkInfoList" :questions-mark-status="questionsMarkStatus"
|
:question-mark-info-list="questionMarkInfoList" :questions-mark-status="questionsMarkStatus"
|
||||||
:questionsSegmentMarkStatus="questionsSegmentMarkStatus" :is-baseline="isBaseLineTask"
|
:questionsSegmentMarkStatus="questionsSegmentMarkStatus" :is-baseline="isBaseLineTask"
|
||||||
@resetFormItemData="resetFormItemData" @setFormItemData="setFormItemData" @getQuestions="getQuestions"
|
@resetFormItemData="resetFormItemData" @setFormItemData="setFormItemData" @getQuestions="getQuestions"
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
@handleReadingChart="handleReadingChart" @saveSegmentBindingAndAnswer="saveSegmentBindingAndAnswer" />
|
@handleReadingChart="handleReadingChart" @saveSegmentBindingAndAnswer="saveSegmentBindingAndAnswer" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-form-item>
|
<el-form-item v-if="readingTaskState < 2">
|
||||||
<div class="action-bar">
|
<div class="action-bar">
|
||||||
<!-- <i class="el-icon-warning feedback-icon" @click="openFeedBackTable"
|
<!-- <i class="el-icon-warning feedback-icon" @click="openFeedBackTable"
|
||||||
:style="{ color: taskInfo && taskInfo.IsExistUnprocessedFeedback ? '#ffeb3b' : '#fff' }" /> -->
|
:style="{ color: taskInfo && taskInfo.IsExistUnprocessedFeedback ? '#ffeb3b' : '#fff' }" /> -->
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ export default {
|
|||||||
return i
|
return i
|
||||||
})
|
})
|
||||||
this.$set(this.visitTaskList[taskIdx], 'Annotations', annotations)
|
this.$set(this.visitTaskList[taskIdx], 'Annotations', annotations)
|
||||||
this.$refs[visitTaskId][0].initCurrentMaredFiles(annotations)
|
this.$refs[visitTaskId][0].initCurrentMaredFiles()
|
||||||
this.$refs.fileViewer.resetAnnotations({ annotations, visitTaskId })
|
this.$refs.fileViewer.resetAnnotations({ annotations, visitTaskId })
|
||||||
},
|
},
|
||||||
setReadingTaskState(state) {
|
setReadingTaskState(state) {
|
||||||
|
|||||||
@@ -97,7 +97,6 @@ export default {
|
|||||||
this.taskInfo = JSON.parse(localStorage.getItem('taskInfo'))
|
this.taskInfo = JSON.parse(localStorage.getItem('taskInfo'))
|
||||||
this.BodyPart.Bodypart = await this.$getBodyPart(this.$route.query.trialId)
|
this.BodyPart.Bodypart = await this.$getBodyPart(this.$route.query.trialId)
|
||||||
this.studyList = this.decorateStudyList(this.visitTaskInfo.StudyList || [])
|
this.studyList = this.decorateStudyList(this.visitTaskInfo.StudyList || [])
|
||||||
this.initCurrentMaredFiles(this.visitTaskInfo.Annotations)
|
|
||||||
if (this.studyList.length === 0) return
|
if (this.studyList.length === 0) return
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.activeStudy(this.studyList[0].Id)
|
this.activeStudy(this.studyList[0].Id)
|
||||||
@@ -111,26 +110,8 @@ export default {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'visitTaskInfo.Annotations': {
|
|
||||||
handler(annotations) {
|
|
||||||
this.initCurrentMaredFiles(annotations)
|
|
||||||
},
|
|
||||||
deep: true
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
buildCurrentMarkedFiles(annotations = []) {
|
|
||||||
return annotations.reduce((result, item) => {
|
|
||||||
const fileId = item?.NoneDicomFileId
|
|
||||||
if (!fileId) return result
|
|
||||||
if (!Object.hasOwn(result, fileId)) {
|
|
||||||
result[fileId] = { count: 1 }
|
|
||||||
} else {
|
|
||||||
result[fileId].count++
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}, {})
|
|
||||||
},
|
|
||||||
decorateStudyList(studyList = []) {
|
decorateStudyList(studyList = []) {
|
||||||
return studyList.map(study => ({
|
return studyList.map(study => ({
|
||||||
...study,
|
...study,
|
||||||
@@ -223,9 +204,6 @@ export default {
|
|||||||
if (type === 'remove') {
|
if (type === 'remove') {
|
||||||
if (Object.hasOwn(this.currentMarkedFiles, fileId)) {
|
if (Object.hasOwn(this.currentMarkedFiles, fileId)) {
|
||||||
this.currentMarkedFiles[fileId].count--
|
this.currentMarkedFiles[fileId].count--
|
||||||
if (this.currentMarkedFiles[fileId].count <= 0) {
|
|
||||||
this.$delete(this.currentMarkedFiles, fileId)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (type === 'add') {
|
} else if (type === 'add') {
|
||||||
if (!Object.hasOwn(this.currentMarkedFiles, fileId)) {
|
if (!Object.hasOwn(this.currentMarkedFiles, fileId)) {
|
||||||
@@ -236,8 +214,15 @@ export default {
|
|||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
initCurrentMaredFiles(annotations = this.visitTaskInfo.Annotations || []) {
|
initCurrentMaredFiles() {
|
||||||
this.currentMarkedFiles = this.buildCurrentMarkedFiles(annotations)
|
this.currentMarkedFiles = {}
|
||||||
|
this.visitTaskInfo.Annotations.map(i => {
|
||||||
|
if (!Object.hasOwn(this.currentMarkedFiles, i.NoneDicomFileId)) {
|
||||||
|
this.$set(this.currentMarkedFiles, i.NoneDicomFileId, { count: 1 })
|
||||||
|
} else {
|
||||||
|
this.currentMarkedFiles[i.NoneDicomFileId].count++
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,142 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="json-editor" v-loading="loading">
|
|
||||||
<div class="header">
|
|
||||||
<!-- <span class="title">JSON 编辑</span> -->
|
|
||||||
<el-button type="primary" size="mini" icon="el-icon-check" @click="save">
|
|
||||||
{{ $t('common:button:save') }}
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
<div class="json">
|
|
||||||
<json-node
|
|
||||||
:node-key="'root'"
|
|
||||||
:node-value="jsonData"
|
|
||||||
:is-root="true"
|
|
||||||
@update="handleUpdate"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { getInspectionById, setJsonDetail } from '@/api/trials'
|
|
||||||
import JsonNode from './JsonNode.vue'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'JsonEditor',
|
|
||||||
components: { JsonNode },
|
|
||||||
props: {
|
|
||||||
id: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
loading: false,
|
|
||||||
jsonData: {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.getJsonData()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
handleUpdate({ path, value }) {
|
|
||||||
const target = this.getTarget(path.slice(0, -1))
|
|
||||||
this.$set(target, path[path.length - 1], value)
|
|
||||||
},
|
|
||||||
getTarget(path) {
|
|
||||||
let t = this.jsonData
|
|
||||||
path.forEach(k => { t = t[k] })
|
|
||||||
return t
|
|
||||||
},
|
|
||||||
parseValue(val) {
|
|
||||||
if (typeof val === 'string') {
|
|
||||||
try {
|
|
||||||
const parsed = JSON.parse(val)
|
|
||||||
if (parsed && typeof parsed === 'object') {
|
|
||||||
return JSON.parse(JSON.stringify(parsed))
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.warn(e.message)
|
|
||||||
}
|
|
||||||
return {}
|
|
||||||
}
|
|
||||||
return val ? JSON.parse(JSON.stringify(val)) : {}
|
|
||||||
},
|
|
||||||
async getJsonData() {
|
|
||||||
try {
|
|
||||||
this.loading = true
|
|
||||||
const res = await getInspectionById({ id: this.id })
|
|
||||||
if (res.IsSuccess) {
|
|
||||||
this.jsonData = this.parseValue(res.Result.JsonDetail)
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err)
|
|
||||||
} finally {
|
|
||||||
this.loading = false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
isValidJsonObject(obj) {
|
|
||||||
if (obj === null || typeof obj !== 'object') return false
|
|
||||||
try {
|
|
||||||
JSON.stringify(obj)
|
|
||||||
return true
|
|
||||||
} catch (e) {
|
|
||||||
console.warn(e.message)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
safeClone(obj) {
|
|
||||||
if (this.isValidJsonObject(obj)) {
|
|
||||||
return JSON.parse(JSON.stringify(obj))
|
|
||||||
}
|
|
||||||
return {}
|
|
||||||
},
|
|
||||||
async save() {
|
|
||||||
try {
|
|
||||||
this.loading = true
|
|
||||||
const result = this.safeClone(this.jsonData)
|
|
||||||
const res = await setJsonDetail({ id: this.id, jsonDetail: JSON.stringify(result) })
|
|
||||||
if (res.IsSuccess) {
|
|
||||||
this.$emit('getList')
|
|
||||||
this.$emit('close')
|
|
||||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err)
|
|
||||||
} finally {
|
|
||||||
this.loading = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.json-editor {
|
|
||||||
font-family: Consolas, Monaco, monospace;
|
|
||||||
font-size: 13px;
|
|
||||||
line-height: 2;
|
|
||||||
padding: 12px;
|
|
||||||
background: #fafafa;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
.header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-end;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
padding-bottom: 8px;
|
|
||||||
border-bottom: 1px solid #ebeef5;
|
|
||||||
}
|
|
||||||
.title {
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #303133;
|
|
||||||
}
|
|
||||||
.json {
|
|
||||||
max-height: 50vh;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="node" :style="{ paddingLeft: depth * 20 + 'px' }">
|
|
||||||
<span v-if="!isRoot" class="key">
|
|
||||||
{{ isArray ? `[${nodeKey}]` : `"${nodeKey}"` }}:
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<!-- 对象 -->
|
|
||||||
<template v-if="isObject">
|
|
||||||
<span class="bracket">{</span>
|
|
||||||
<div class="children">
|
|
||||||
<json-node
|
|
||||||
v-for="(v, k) in nodeValue"
|
|
||||||
:key="k"
|
|
||||||
:node-key="k"
|
|
||||||
:node-value="v"
|
|
||||||
:depth="depth + 1"
|
|
||||||
:parent-path="currentPath"
|
|
||||||
@update="$emit('update', $event)"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<span class="bracket">}</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<!-- 数组 -->
|
|
||||||
<template v-else-if="isArray">
|
|
||||||
<span class="bracket">[</span>
|
|
||||||
<div class="children">
|
|
||||||
<json-node
|
|
||||||
v-for="(item, i) in nodeValue"
|
|
||||||
:key="i"
|
|
||||||
:node-key="i"
|
|
||||||
:node-value="item"
|
|
||||||
:depth="depth + 1"
|
|
||||||
:parent-path="currentPath"
|
|
||||||
@update="$emit('update', $event)"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<span class="bracket">]</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<!-- 文本 -->
|
|
||||||
<el-input
|
|
||||||
v-else-if="valueType === 'string'"
|
|
||||||
v-model="editVal"
|
|
||||||
size="mini"
|
|
||||||
style="width: 300px"
|
|
||||||
@blur="emitUpdate"
|
|
||||||
@keyup.enter.native="emitUpdate"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- 数字 -->
|
|
||||||
<el-input-number
|
|
||||||
v-else-if="valueType === 'number'"
|
|
||||||
v-model="editVal"
|
|
||||||
size="mini"
|
|
||||||
style="width: 140px"
|
|
||||||
@blur="emitUpdate"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- 布尔值 -->
|
|
||||||
<el-switch
|
|
||||||
v-else-if="valueType === 'boolean'"
|
|
||||||
v-model="editVal"
|
|
||||||
size="small"
|
|
||||||
@change="emitUpdate"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- null -->
|
|
||||||
<el-tag v-else size="mini" type="info">null</el-tag>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'JsonNode',
|
|
||||||
props: {
|
|
||||||
nodeKey: [String, Number],
|
|
||||||
nodeValue: [Object, Array, String, Number, Boolean],
|
|
||||||
depth: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
},
|
|
||||||
isRoot: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
parentPath: {
|
|
||||||
type: Array,
|
|
||||||
default: () => []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return { editVal: this.nodeValue }
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
isObject() {
|
|
||||||
return this.nodeValue && typeof this.nodeValue === 'object' && !Array.isArray(this.nodeValue)
|
|
||||||
},
|
|
||||||
isArray() {
|
|
||||||
return Array.isArray(this.nodeValue)
|
|
||||||
},
|
|
||||||
valueType() {
|
|
||||||
if (this.nodeValue === null) return 'null'
|
|
||||||
return typeof this.nodeValue
|
|
||||||
},
|
|
||||||
currentPath() {
|
|
||||||
return this.isRoot ? [] : [...this.parentPath, this.nodeKey]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
nodeValue(v) { this.editVal = v }
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
emitUpdate() {
|
|
||||||
this.$emit('update', { path: this.currentPath, value: this.editVal })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.node {
|
|
||||||
padding-bottom: 5px;
|
|
||||||
}
|
|
||||||
.key {
|
|
||||||
color: #c7254e;
|
|
||||||
margin-right: 4px;
|
|
||||||
}
|
|
||||||
.bracket {
|
|
||||||
color: #e6a23c;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.children {
|
|
||||||
padding-left: 4px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -194,9 +194,6 @@
|
|||||||
<el-button type="text" @click="lookDetails(scope.row)">
|
<el-button type="text" @click="lookDetails(scope.row)">
|
||||||
{{ $t('trials:auditRecord:action:detail') }}
|
{{ $t('trials:auditRecord:action:detail') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="text" @click="edit(scope.row)">
|
|
||||||
{{ $t('common:button:edit') }}
|
|
||||||
</el-button>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -625,20 +622,6 @@
|
|||||||
<!-- :src="openImageUrl"-->
|
<!-- :src="openImageUrl"-->
|
||||||
<!-- style="width: 50px;height: 50px; cursor:pointer">-->
|
<!-- style="width: 50px;height: 50px; cursor:pointer">-->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<!-- <json-editor v-model="data" /> -->
|
|
||||||
<el-dialog
|
|
||||||
v-if="editDialogVisible"
|
|
||||||
:visible.sync="editDialogVisible"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
:title="$t('common:button:edit') + `${$i18n.locale === 'zh' ? '(' + editRow.DescriptionCN + ')' : '( ' + editRow.Description + ' )'}`"
|
|
||||||
width="720px"
|
|
||||||
custom-class="base-dialog-wrapper">
|
|
||||||
<json-editor
|
|
||||||
:id="editRow.Id"
|
|
||||||
@close="editDialogVisible = false"
|
|
||||||
@getList="getList"
|
|
||||||
/>
|
|
||||||
</el-dialog>
|
|
||||||
</template>
|
</template>
|
||||||
</BaseContainer>
|
</BaseContainer>
|
||||||
</template>
|
</template>
|
||||||
@@ -647,12 +630,11 @@
|
|||||||
import {
|
import {
|
||||||
getTrialSiteSelect,
|
getTrialSiteSelect,
|
||||||
getTrialVisitStageSelect,
|
getTrialVisitStageSelect,
|
||||||
getTrialCriterionList,
|
getTrialCriterionList
|
||||||
} from '@/api/trials'
|
} from '@/api/trials'
|
||||||
import { getInspectionList, getInspectionJsonDataList } from '@/api/trials/inspection'
|
import { getInspectionList, getInspectionJsonDataList } from '@/api/trials/inspection'
|
||||||
import { getFrontAuditConfigList, getAuditConfigChildList, getModuleTypeDescriptionList, setInspectionEnumValue, getModuleTypeList } from '@/api/dictionary/checkConfig'
|
import { getFrontAuditConfigList, getAuditConfigChildList, getModuleTypeDescriptionList, setInspectionEnumValue, getModuleTypeList } from '@/api/dictionary/checkConfig'
|
||||||
import Pagination from '@/components/Pagination'
|
import Pagination from '@/components/Pagination'
|
||||||
import JsonEditor from './components/JsonEditor'
|
|
||||||
import BaseContainer from '@/components/BaseContainer'
|
import BaseContainer from '@/components/BaseContainer'
|
||||||
import BaseModel from '@/components/BaseModel'
|
import BaseModel from '@/components/BaseModel'
|
||||||
import { getToken } from '@/utils/auth'
|
import { getToken } from '@/utils/auth'
|
||||||
@@ -688,7 +670,7 @@ const searchDataDefault = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
export default {
|
export default {
|
||||||
components: { BaseContainer, Pagination, JsonEditor, BaseModel },
|
components: { BaseContainer, Pagination, BaseModel },
|
||||||
dicts: ['OptType', 'ModuleType', 'ChildrenType'],
|
dicts: ['OptType', 'ModuleType', 'ChildrenType'],
|
||||||
data() {
|
data() {
|
||||||
|
|
||||||
@@ -726,10 +708,7 @@ export default {
|
|||||||
imagesList: [],
|
imagesList: [],
|
||||||
moduleTypeList: [],
|
moduleTypeList: [],
|
||||||
list2_total: 0,
|
list2_total: 0,
|
||||||
list2_searchData: {},
|
list2_searchData: {}
|
||||||
editDialogVisible: false,
|
|
||||||
jsonData: null,
|
|
||||||
editRow: null
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -1367,12 +1346,7 @@ export default {
|
|||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
})
|
})
|
||||||
},
|
}
|
||||||
edit(row) {
|
|
||||||
this.editRow = Object.assign({}, row)
|
|
||||||
this.editDialogVisible = true
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -105,7 +105,6 @@
|
|||||||
<el-button icon="el-icon-delete" :title="$t('trials:uploadedDicoms:action:delete')" circle
|
<el-button icon="el-icon-delete" :title="$t('trials:uploadedDicoms:action:delete')" circle
|
||||||
:disabled="!isAfresh && data.SubmitState === 2 && data.SubmitTime && moment(data.SubmitTime).isAfter(moment(scope.row.UploadedTime))"
|
:disabled="!isAfresh && data.SubmitState === 2 && data.SubmitTime && moment(data.SubmitTime).isAfter(moment(scope.row.UploadedTime))"
|
||||||
@click="handleDeleteStudy(scope.row)" />
|
@click="handleDeleteStudy(scope.row)" />
|
||||||
<el-button icon="el-icon-upload2" title="上传" circle @click="upload(scope.row)" />
|
|
||||||
<!-- <el-button-->
|
<!-- <el-button-->
|
||||||
<!-- icon="el-icon-toilet-paper"-->
|
<!-- icon="el-icon-toilet-paper"-->
|
||||||
<!-- circle-->
|
<!-- circle-->
|
||||||
@@ -424,8 +423,7 @@
|
|||||||
<DicomPreview :uid="uid" :studyList="uploadQueues" />
|
<DicomPreview :uid="uid" :studyList="uploadQueues" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
<!--pet-ct临床数据上传-->
|
<!--pet-ct临床数据上传-->
|
||||||
<el-dialog v-if="petVisible" :show-close="true" :close-on-click-modal="false" :visible.sync="petVisible"
|
<el-dialog v-if="petVisible" :show-close="true" :close-on-click-modal="false" :visible.sync="petVisible" append-to-body>
|
||||||
append-to-body>
|
|
||||||
<uploadPetClinicalData :subject-visit-id="data.Id" :data="data" :studyData="studyData" :allow-add-or-edit="true"
|
<uploadPetClinicalData :subject-visit-id="data.Id" :data="data" :studyData="studyData" :allow-add-or-edit="true"
|
||||||
@getStudyInfo="getStudyInfo" />
|
@getStudyInfo="getStudyInfo" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
@@ -652,7 +650,6 @@ export default {
|
|||||||
BodyPart: {},
|
BodyPart: {},
|
||||||
|
|
||||||
isClose: false,
|
isClose: false,
|
||||||
StudyInstanceUID: null
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -685,10 +682,6 @@ export default {
|
|||||||
this.OSSclient.close()
|
this.OSSclient.close()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
upload(row) {
|
|
||||||
this.StudyInstanceUID = row.StudyInstanceUid
|
|
||||||
this.$refs.pathClear.click()
|
|
||||||
},
|
|
||||||
handleDragover(e) {
|
handleDragover(e) {
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@@ -1151,7 +1144,7 @@ export default {
|
|||||||
var instanceItem = instanceList.find(function (item) {
|
var instanceItem = instanceList.find(function (item) {
|
||||||
return item.instanceUid === instanceUid
|
return item.instanceUid === instanceUid
|
||||||
})
|
})
|
||||||
if (!false) {
|
if (!instanceItem) {
|
||||||
var date = data.string('x00080023')
|
var date = data.string('x00080023')
|
||||||
var time = data.string('x00080033')
|
var time = data.string('x00080033')
|
||||||
var instanceTime = ''
|
var instanceTime = ''
|
||||||
@@ -1281,12 +1274,11 @@ export default {
|
|||||||
verifyStudy() {
|
verifyStudy() {
|
||||||
this.btnLoading = true
|
this.btnLoading = true
|
||||||
var studyList = []
|
var studyList = []
|
||||||
let scope = this
|
|
||||||
this.selectArr.forEach((item) => {
|
this.selectArr.forEach((item) => {
|
||||||
item.dicomInfo.uploadFileSize = 0
|
item.dicomInfo.uploadFileSize = 0
|
||||||
if (!item.uploadState.selected) {
|
if (!item.uploadState.selected) {
|
||||||
studyList.push({
|
studyList.push({
|
||||||
studyInstanceUid: scope.StudyInstanceUID ? scope.StudyInstanceUID : item.dicomInfo.studyUid,
|
studyInstanceUid: item.dicomInfo.studyUid,
|
||||||
studyDate: item.dicomInfo.studyTime,
|
studyDate: item.dicomInfo.studyTime,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1301,8 +1293,6 @@ export default {
|
|||||||
batchVerifyStudyAllowUpload(param)
|
batchVerifyStudyAllowUpload(param)
|
||||||
.then(async (res) => {
|
.then(async (res) => {
|
||||||
var messageArr = []
|
var messageArr = []
|
||||||
res.Result = []
|
|
||||||
console.log(res)
|
|
||||||
res.Result.forEach((item) => {
|
res.Result.forEach((item) => {
|
||||||
const i = this.uploadQueues.findIndex(
|
const i = this.uploadQueues.findIndex(
|
||||||
(value) => value.dicomInfo.studyUid === item.StudyInstanceUid
|
(value) => value.dicomInfo.studyUid === item.StudyInstanceUid
|
||||||
@@ -1485,21 +1475,8 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
// 上传影像并归档
|
// 上传影像并归档
|
||||||
archiveStudy(index, config = {}) {
|
archiveStudy(index, config) {
|
||||||
var scope = this
|
var scope = this
|
||||||
try {
|
|
||||||
if (!config.AnonymizeFixedList) config.AnonymizeFixedList = []
|
|
||||||
config.AnonymizeFixedList.push(
|
|
||||||
{
|
|
||||||
Element: '000D',
|
|
||||||
Group: '0020',
|
|
||||||
ReplaceValue: scope.StudyInstanceUID,
|
|
||||||
Id: 'StudyInstanceUID'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
} catch (err) {
|
|
||||||
console.log(err)
|
|
||||||
}
|
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
try {
|
try {
|
||||||
preArchiveDicomStudy({
|
preArchiveDicomStudy({
|
||||||
@@ -1529,7 +1506,7 @@ export default {
|
|||||||
let t = setInterval(() => {
|
let t = setInterval(() => {
|
||||||
dicomUploadInProgress({
|
dicomUploadInProgress({
|
||||||
trialId: scope.trialId,
|
trialId: scope.trialId,
|
||||||
studyInstanceUid: scope.StudyInstanceUID ? scope.StudyInstanceUID : dicomInfo.studyUid,
|
studyInstanceUid: dicomInfo.studyUid,
|
||||||
}).then((res) => { })
|
}).then((res) => { })
|
||||||
}, 5000)
|
}, 5000)
|
||||||
scope.myInterval.push(t)
|
scope.myInterval.push(t)
|
||||||
@@ -1554,7 +1531,7 @@ export default {
|
|||||||
dicomInfo.RadiopharmaceuticalStartTime,
|
dicomInfo.RadiopharmaceuticalStartTime,
|
||||||
|
|
||||||
studyId: dicomInfo.studyId,
|
studyId: dicomInfo.studyId,
|
||||||
studyInstanceUid: scope.StudyInstanceUID ? scope.StudyInstanceUID : dicomInfo.studyUid,
|
studyInstanceUid: dicomInfo.studyUid,
|
||||||
studyTime: dicomInfo.studyTime,
|
studyTime: dicomInfo.studyTime,
|
||||||
description: dicomInfo.description,
|
description: dicomInfo.description,
|
||||||
seriesCount: dicomInfo.seriesNum,
|
seriesCount: dicomInfo.seriesNum,
|
||||||
@@ -1595,60 +1572,58 @@ export default {
|
|||||||
try {
|
try {
|
||||||
let o = v.instanceList[ii]
|
let o = v.instanceList[ii]
|
||||||
let name = `${v.instanceList[ii].file.webkitRelativePath}_${v.instanceList[ii].instanceUid}`
|
let name = `${v.instanceList[ii].file.webkitRelativePath}_${v.instanceList[ii].instanceUid}`
|
||||||
// if (o.isReUpload) {
|
if (o.isReUpload) {
|
||||||
// dicomInfo.failedFileCount++
|
dicomInfo.failedFileCount++
|
||||||
// dicomInfo.uploadFileSize += o.file.size
|
dicomInfo.uploadFileSize += o.file.size
|
||||||
// Record.Existed.push(name)
|
Record.Existed.push(name)
|
||||||
// Record.FileCount++
|
Record.FileCount++
|
||||||
// }
|
} else if (o.myPath) {
|
||||||
// else if (o.myPath) {
|
instanceList.push({
|
||||||
// instanceList.push({
|
studyInstanceUid: dicomInfo.studyUid,
|
||||||
// studyInstanceUid: dicomInfo.studyUid,
|
seriesInstanceUid: v.seriesUid,
|
||||||
// seriesInstanceUid: v.seriesUid,
|
SOPClassUID: o.SOPClassUID,
|
||||||
// SOPClassUID: o.SOPClassUID,
|
TransferSytaxUID: o.TransferSytaxUID,
|
||||||
// TransferSytaxUID: o.TransferSytaxUID,
|
MediaStorageSOPInstanceUID:
|
||||||
// MediaStorageSOPInstanceUID:
|
o.MediaStorageSOPInstanceUID,
|
||||||
// o.MediaStorageSOPInstanceUID,
|
MediaStorageSOPClassUID:
|
||||||
// MediaStorageSOPClassUID:
|
o.MediaStorageSOPClassUID,
|
||||||
// o.MediaStorageSOPClassUID,
|
sopInstanceUid: o.instanceUid,
|
||||||
// sopInstanceUid: o.instanceUid,
|
instanceNumber: o.instanceNumber,
|
||||||
// instanceNumber: o.instanceNumber,
|
instanceTime: o.instanceTime,
|
||||||
// instanceTime: o.instanceTime,
|
imageRows: o.imageRows,
|
||||||
// imageRows: o.imageRows,
|
imageColumns: o.imageColumns,
|
||||||
// imageColumns: o.imageColumns,
|
sliceLocation: o.sliceLocation,
|
||||||
// sliceLocation: o.sliceLocation,
|
sliceThickness: o.sliceThickness,
|
||||||
// sliceThickness: o.sliceThickness,
|
numberOfFrames: o.numberOfFrames,
|
||||||
// numberOfFrames: o.numberOfFrames,
|
pixelSpacing: o.pixelSpacing,
|
||||||
// pixelSpacing: o.pixelSpacing,
|
imagerPixelSpacing: o.imagerPixelSpacing,
|
||||||
// imagerPixelSpacing: o.imagerPixelSpacing,
|
frameOfReferenceUID: o.frameOfReferenceUID,
|
||||||
// frameOfReferenceUID: o.frameOfReferenceUID,
|
windowCenter: o.windowCenter,
|
||||||
// windowCenter: o.windowCenter,
|
windowWidth: o.windowWidth,
|
||||||
// windowWidth: o.windowWidth,
|
path: o.myPath,
|
||||||
// path: o.myPath,
|
FileSize: o.FileSize,
|
||||||
// FileSize: o.FileSize,
|
|
||||||
|
|
||||||
// PhotometricInterpretation:
|
PhotometricInterpretation:
|
||||||
// o.PhotometricInterpretation,
|
o.PhotometricInterpretation,
|
||||||
// BitsAllocated: o.BitsAllocated,
|
BitsAllocated: o.BitsAllocated,
|
||||||
// PixelRepresentation: o.PixelRepresentation,
|
PixelRepresentation: o.PixelRepresentation,
|
||||||
// RescaleIntercept: o.RescaleIntercept,
|
RescaleIntercept: o.RescaleIntercept,
|
||||||
// RescaleSlope: o.RescaleSlope,
|
RescaleSlope: o.RescaleSlope,
|
||||||
// ImagePositionPatient: o.ImagePositionPatient,
|
ImagePositionPatient: o.ImagePositionPatient,
|
||||||
// ImageOrientationPatient:
|
ImageOrientationPatient:
|
||||||
// o.ImageOrientationPatient,
|
o.ImageOrientationPatient,
|
||||||
// SequenceOfUltrasoundRegions:
|
SequenceOfUltrasoundRegions:
|
||||||
// o.SequenceOfUltrasoundRegions,
|
o.SequenceOfUltrasoundRegions,
|
||||||
// FrameTime: o.FrameTime,
|
FrameTime: o.FrameTime,
|
||||||
// CorrectedImage: o.CorrectedImage,
|
CorrectedImage: o.CorrectedImage,
|
||||||
// Units: o.Units,
|
Units: o.Units,
|
||||||
// DecayCorrection: o.DecayCorrection,
|
DecayCorrection: o.DecayCorrection,
|
||||||
// EncapsulatedDocument: o.EncapsulatedDocument,
|
EncapsulatedDocument: o.EncapsulatedDocument,
|
||||||
// })
|
})
|
||||||
// Record.Uploaded.push(name)
|
Record.Uploaded.push(name)
|
||||||
// dicomInfo.failedFileCount++
|
dicomInfo.failedFileCount++
|
||||||
// Record.FileCount++
|
Record.FileCount++
|
||||||
// }
|
} else {
|
||||||
// else {
|
|
||||||
let path = `/${params.trialId}/Image/${params.subjectId
|
let path = `/${params.trialId}/Image/${params.subjectId
|
||||||
}/${params.subjectVisitId}/${dicomInfo.studyUid
|
}/${params.subjectVisitId}/${dicomInfo.studyUid
|
||||||
}/${scope.getGuid(
|
}/${scope.getGuid(
|
||||||
@@ -1737,7 +1712,7 @@ export default {
|
|||||||
}
|
}
|
||||||
if (res && res.url) {
|
if (res && res.url) {
|
||||||
instanceList.push({
|
instanceList.push({
|
||||||
studyInstanceUid: scope.StudyInstanceUID ? scope.StudyInstanceUID : dicomInfo.studyUid,
|
studyInstanceUid: dicomInfo.studyUid,
|
||||||
seriesInstanceUid: v.seriesUid,
|
seriesInstanceUid: v.seriesUid,
|
||||||
SOPClassUID: o.SOPClassUID,
|
SOPClassUID: o.SOPClassUID,
|
||||||
TransferSytaxUID: o.TransferSytaxUID,
|
TransferSytaxUID: o.TransferSytaxUID,
|
||||||
@@ -1786,7 +1761,7 @@ export default {
|
|||||||
Record.Failed.push(name)
|
Record.Failed.push(name)
|
||||||
Record.FileCount++
|
Record.FileCount++
|
||||||
}
|
}
|
||||||
// }
|
}
|
||||||
resolve1()
|
resolve1()
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e)
|
console.log(e)
|
||||||
@@ -1804,7 +1779,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
params.study.seriesList.push({
|
params.study.seriesList.push({
|
||||||
studyInstanceUid: scope.StudyInstanceUID ? scope.StudyInstanceUID : dicomInfo.studyUid,
|
studyInstanceUid: dicomInfo.studyUid,
|
||||||
seriesInstanceUid: v.seriesUid,
|
seriesInstanceUid: v.seriesUid,
|
||||||
seriesNumber: v.seriesNumber,
|
seriesNumber: v.seriesNumber,
|
||||||
seriesTime: v.seriesTime,
|
seriesTime: v.seriesTime,
|
||||||
|
|||||||
@@ -300,7 +300,19 @@
|
|||||||
<!-- 审核完成时间 -->
|
<!-- 审核完成时间 -->
|
||||||
<el-table-column prop="AuditTime" :label="$t('trials:crcUpload:table:auditTime')" show-overflow-tooltip
|
<el-table-column prop="AuditTime" :label="$t('trials:crcUpload:table:auditTime')" show-overflow-tooltip
|
||||||
width="170" />
|
width="170" />
|
||||||
<el-table-column :label="$t('common:action:action')" width="250" fixed="right">
|
<el-table-column v-if="
|
||||||
|
hasPermi(
|
||||||
|
[
|
||||||
|
'trials:trials-panel:visit:crc-upload:upload',
|
||||||
|
'trials:trials-panel:visit:crc-upload:submit',
|
||||||
|
'trials:trials-panel:visit:crc-upload:edit',
|
||||||
|
'trials:trials-panel:visit:crc-upload:delete',
|
||||||
|
'trials:trials-panel:visit:crc-upload:back',
|
||||||
|
'trials:trials-panel:visit:crc-upload:authBack'
|
||||||
|
],
|
||||||
|
'||'
|
||||||
|
)
|
||||||
|
" :label="$t('common:action:action')" width="250" fixed="right">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<!-- 上传 -->
|
<!-- 上传 -->
|
||||||
<el-button v-hasPermi="['trials:trials-panel:visit:crc-upload:upload']" icon="el-icon-upload2" :disabled="!isOCTorIVUS && (scope.row.SubmitState * 1 === 2 ||
|
<el-button v-hasPermi="['trials:trials-panel:visit:crc-upload:upload']" icon="el-icon-upload2" :disabled="!isOCTorIVUS && (scope.row.SubmitState * 1 === 2 ||
|
||||||
@@ -308,8 +320,10 @@
|
|||||||
scope.row.IsLostVisit || (scope.row.IsSubjectQuit && scope.row.SubmitState * 1 !== 2))
|
scope.row.IsLostVisit || (scope.row.IsSubjectQuit && scope.row.SubmitState * 1 !== 2))
|
||||||
" circle :title="$t('trials:crcUpload:action:upload')" @click="CRChandleUpload(scope.row)" />
|
" circle :title="$t('trials:crcUpload:action:upload')" @click="CRChandleUpload(scope.row)" />
|
||||||
<!-- 上传2 -->
|
<!-- 上传2 -->
|
||||||
<el-button icon="el-icon-upload2"
|
<el-button icon="el-icon-upload2" v-hasPermi="['trials:trials-panel:visit:crc-upload:upload2']" :disabled="!isOCTorIVUS && (scope.row.SubmitState * 1 === 2 ||
|
||||||
circle :title="$t('trials:crcUpload:action:upload')" @click="CRChandleUpload2(scope.row)" />
|
scope.row.VisitExecuted === 2 ||
|
||||||
|
scope.row.IsLostVisit || (scope.row.IsSubjectQuit && scope.row.SubmitState * 1 !== 2))
|
||||||
|
" circle :title="$t('trials:crcUpload:action:upload')" @click="CRChandleUpload2(scope.row)" />
|
||||||
<!-- 提交 -->
|
<!-- 提交 -->
|
||||||
<el-button v-hasPermi="['trials:trials-panel:visit:crc-upload:submit']" icon="el-icon-check" :disabled="scope.row.AuditState * 1 > 0 ||
|
<el-button v-hasPermi="['trials:trials-panel:visit:crc-upload:submit']" icon="el-icon-check" :disabled="scope.row.AuditState * 1 > 0 ||
|
||||||
scope.row.SubmitState * 1 !== 1 ||
|
scope.row.SubmitState * 1 !== 1 ||
|
||||||
|
|||||||
+2
-2
@@ -11,7 +11,7 @@ const webpack = require('webpack')
|
|||||||
const defaultSettings = require('./src/settings.js')
|
const defaultSettings = require('./src/settings.js')
|
||||||
const moment = require('moment')
|
const moment = require('moment')
|
||||||
var distDate = moment(new Date()).format('YYYY-MM-DD')
|
var distDate = moment(new Date()).format('YYYY-MM-DD')
|
||||||
const name = process.env.NODE_ENV === 'usa' ? 'Imaging Trial Management System' : defaultSettings.title || 'EIC lmaging Trial Management System' // page title
|
const name = process.env.NODE_ENV === 'usa' ? 'Imaging Trial Management System' : defaultSettings.title || 'HASC lmaging Trial Management System' // page title
|
||||||
// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
|
// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
|
||||||
// eslint-disable-next-line no-undef
|
// eslint-disable-next-line no-undef
|
||||||
module.exports = defineConfig({
|
module.exports = defineConfig({
|
||||||
@@ -52,7 +52,7 @@ module.exports = defineConfig({
|
|||||||
},
|
},
|
||||||
|
|
||||||
'/api': {
|
'/api': {
|
||||||
target: 'http://192.168.3.99:6100',
|
target: 'http://106.14.89.110:30000',
|
||||||
// target: 'http://101.132.253.119:7010', // uat
|
// target: 'http://101.132.253.119:7010', // uat
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
secure: false,
|
secure: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user