阅片前对影像进行靶段标注
continuous-integration/drone/push Build encountered an error
Details
continuous-integration/drone/push Build encountered an error
Details
parent
64cec20d7d
commit
20c257be4f
|
|
@ -4281,4 +4281,13 @@ export function deleteAuditRecord(auditRecordId) {
|
||||||
url: `/AuditDocument/deleteAuditRecord/${auditRecordId}`,
|
url: `/AuditDocument/deleteAuditRecord/${auditRecordId}`,
|
||||||
method: 'delete'
|
method: 'delete'
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 靶段标注列表
|
||||||
|
export function getTrialSubjectVisitMarkList(data) {
|
||||||
|
return request({
|
||||||
|
url: `/DownloadAndUpload/getTrialSubjectVisitMarkList`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -34,9 +34,12 @@
|
||||||
<!--受试者-->
|
<!--受试者-->
|
||||||
<el-table-column :label="$t('download:table:subjectCode')" min-width="130" prop="SubjectCode"
|
<el-table-column :label="$t('download:table:subjectCode')" min-width="130" prop="SubjectCode"
|
||||||
show-overflow-tooltip />
|
show-overflow-tooltip />
|
||||||
|
<!--访视名称-->
|
||||||
|
<el-table-column prop="VisitName" :label="$t('download:table:VisitName')" sortable="custom"
|
||||||
|
v-if="IsImageSegment" />
|
||||||
<!--任务名称-->
|
<!--任务名称-->
|
||||||
<el-table-column :label="$t('download:table:taskName')" min-width="130" show-overflow-tooltip prop="TaskBlindName"
|
<el-table-column :label="$t('download:table:taskName')" min-width="130" show-overflow-tooltip prop="TaskBlindName"
|
||||||
sortable />
|
sortable v-else />
|
||||||
<!--检查类型-->
|
<!--检查类型-->
|
||||||
<el-table-column :label="$t('download:table:studyType')" min-width="130" show-overflow-tooltip prop="IsDicom"
|
<el-table-column :label="$t('download:table:studyType')" min-width="130" show-overflow-tooltip prop="IsDicom"
|
||||||
sortable>
|
sortable>
|
||||||
|
|
@ -126,6 +129,10 @@ export default {
|
||||||
return {}
|
return {}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
IsImageSegment: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
@ -157,6 +164,7 @@ export default {
|
||||||
this.bodyPart.Bodypart = await this.$getBodyPart(this.$route.query.trialId)
|
this.bodyPart.Bodypart = await this.$getBodyPart(this.$route.query.trialId)
|
||||||
this.getList()
|
this.getList()
|
||||||
this.title = `Download Images:${this.SubjectCode}(${this.Criterion.TrialReadingCriterionName})`
|
this.title = `Download Images:${this.SubjectCode}(${this.Criterion.TrialReadingCriterionName})`
|
||||||
|
if (this.IsImageSegment) this.title = `Download Images:${this.SubjectCode}`
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
store.dispatch('trials/setUnLock', false)
|
store.dispatch('trials/setUnLock', false)
|
||||||
|
|
@ -175,6 +183,12 @@ export default {
|
||||||
if (this.TaskId) {
|
if (this.TaskId) {
|
||||||
this.searchData.VisitTaskId = this.TaskId
|
this.searchData.VisitTaskId = this.TaskId
|
||||||
}
|
}
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
this.searchData.IsImageSegmentLabel = true
|
||||||
|
}
|
||||||
|
else if (this.Criterion.CriterionType == 19 || this.Criterion.CriterionType == 20) {
|
||||||
|
this.searchData.IsImageSegmentLabel = false
|
||||||
|
}
|
||||||
this.loading = true
|
this.loading = true
|
||||||
let res = await getSubjectImageDownloadSelectList(this.searchData)
|
let res = await getSubjectImageDownloadSelectList(this.searchData)
|
||||||
this.loading = false
|
this.loading = false
|
||||||
|
|
@ -257,6 +271,12 @@ export default {
|
||||||
data.NoneDicomStudyIdList = [...data.NoneDicomStudyIdList, ...arr]
|
data.NoneDicomStudyIdList = [...data.NoneDicomStudyIdList, ...arr]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
data.IsImageSegmentLabel = true
|
||||||
|
}
|
||||||
|
else if (this.Criterion.CriterionType == 19 || this.Criterion.CriterionType == 20) {
|
||||||
|
data.IsImageSegmentLabel = false
|
||||||
|
}
|
||||||
this.btnLoading = true
|
this.btnLoading = true
|
||||||
let res = await getIRReadingDownloadStudyInfo(data)
|
let res = await getIRReadingDownloadStudyInfo(data)
|
||||||
this.btnLoading = false
|
this.btnLoading = false
|
||||||
|
|
@ -286,13 +306,18 @@ export default {
|
||||||
formatDownloadFile(list) {
|
formatDownloadFile(list) {
|
||||||
let files = [],
|
let files = [],
|
||||||
name = `${list[0].SubjectCode}_${new Date().getTime()}.zip`
|
name = `${list[0].SubjectCode}_${new Date().getTime()}.zip`
|
||||||
if (this.IsReadingTaskViewInOrder === 1) {
|
if (this.IsImageSegment) {
|
||||||
name = `${list[0].SubjectCode}_${list[0].TaskBlindName}.zip`
|
name = `${list[0].SubjectCode}_${list[0].VisitName}.zip`
|
||||||
}
|
} else {
|
||||||
if (this.IsReadingTaskViewInOrder === 0) {
|
if (this.IsReadingTaskViewInOrder === 1) {
|
||||||
// name = `${list[0].TaskBlindName}.zip`
|
name = `${list[0].SubjectCode}_${list[0].TaskBlindName}.zip`
|
||||||
name = `${list[0].SubjectCode}_${list[0].TaskBlindName}.zip`
|
}
|
||||||
|
if (this.IsReadingTaskViewInOrder === 0) {
|
||||||
|
// name = `${list[0].TaskBlindName}.zip`
|
||||||
|
name = `${list[0].SubjectCode}_${list[0].TaskBlindName}.zip`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
list.forEach((data) => {
|
list.forEach((data) => {
|
||||||
if (data.StudyList && data.StudyList.length > 0) {
|
if (data.StudyList && data.StudyList.length > 0) {
|
||||||
let StudyList = data.StudyList
|
let StudyList = data.StudyList
|
||||||
|
|
@ -304,7 +329,14 @@ export default {
|
||||||
}/DICOMDIR`,
|
}/DICOMDIR`,
|
||||||
url: this.OSSclientConfig.basePath + study.StudyDIRPath,
|
url: this.OSSclientConfig.basePath + study.StudyDIRPath,
|
||||||
}
|
}
|
||||||
if (this.IsReadingTaskViewInOrder === 0) {
|
if (this.IsImageSegment) {
|
||||||
|
obj = {
|
||||||
|
name: `${data.SubjectCode}/${data.VisitName
|
||||||
|
}/${this.$fd('IsDicom', true)}/${study.StudyCode
|
||||||
|
}/DICOMDIR`,
|
||||||
|
url: this.OSSclientConfig.basePath + study.StudyDIRPath,
|
||||||
|
}
|
||||||
|
} else if (this.IsReadingTaskViewInOrder === 0) {
|
||||||
obj = {
|
obj = {
|
||||||
name: `${data.TaskBlindName}/${this.$fd(
|
name: `${data.TaskBlindName}/${this.$fd(
|
||||||
'IsDicom',
|
'IsDicom',
|
||||||
|
|
@ -330,7 +362,15 @@ export default {
|
||||||
url: this.OSSclientConfig.basePath + instance.Path,
|
url: this.OSSclientConfig.basePath + instance.Path,
|
||||||
IsEncapsulated: instance.IsEncapsulated
|
IsEncapsulated: instance.IsEncapsulated
|
||||||
}
|
}
|
||||||
if (this.IsReadingTaskViewInOrder === 0) {
|
if (this.IsImageSegment) {
|
||||||
|
obj = {
|
||||||
|
name: `${data.SubjectCode}/${data.VisitName
|
||||||
|
}/${this.$fd('IsDicom', true)}/${study.StudyCode
|
||||||
|
}/IMAGE/${fileName}`,
|
||||||
|
url: this.OSSclientConfig.basePath + instance.Path,
|
||||||
|
IsEncapsulated: instance.IsEncapsulated
|
||||||
|
}
|
||||||
|
} else if (this.IsReadingTaskViewInOrder === 0) {
|
||||||
obj = {
|
obj = {
|
||||||
name: `${data.TaskBlindName}/${this.$fd(
|
name: `${data.TaskBlindName}/${this.$fd(
|
||||||
'IsDicom',
|
'IsDicom',
|
||||||
|
|
@ -360,7 +400,16 @@ export default {
|
||||||
)}/${study.StudyCode}/${item.FileName}`,
|
)}/${study.StudyCode}/${item.FileName}`,
|
||||||
url: this.OSSclientConfig.basePath + item.Path,
|
url: this.OSSclientConfig.basePath + item.Path,
|
||||||
}
|
}
|
||||||
if (this.IsReadingTaskViewInOrder === 0) {
|
if (this.IsImageSegment) {
|
||||||
|
obj = {
|
||||||
|
name: `${data.SubjectCode}/${data.VisitName}/${this.$fd(
|
||||||
|
'IsDicom',
|
||||||
|
false
|
||||||
|
)}/${study.StudyCode}/${item.FileName}`,
|
||||||
|
url: this.OSSclientConfig.basePath + item.Path,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (this.IsReadingTaskViewInOrder === 0) {
|
||||||
obj = {
|
obj = {
|
||||||
name: `${data.TaskBlindName}/${this.$fd(
|
name: `${data.TaskBlindName}/${this.$fd(
|
||||||
'IsDicom',
|
'IsDicom',
|
||||||
|
|
@ -390,6 +439,9 @@ export default {
|
||||||
},
|
},
|
||||||
handleOpenDialog(item) {
|
handleOpenDialog(item) {
|
||||||
this.model_cfg.title = `${item.SubjectCode || ''} > ${item.TaskBlindName}`
|
this.model_cfg.title = `${item.SubjectCode || ''} > ${item.TaskBlindName}`
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
this.model_cfg.title = `${item.SubjectCode || ''} > ${item.VisitName}`
|
||||||
|
}
|
||||||
if (item.IsDicom) {
|
if (item.IsDicom) {
|
||||||
this.modelList = item.DicomStudyList
|
this.modelList = item.DicomStudyList
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -363,12 +363,17 @@ export default {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 0,
|
default: 0,
|
||||||
},
|
},
|
||||||
|
IsImageSegment: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
'study-view': studyView,
|
'study-view': studyView,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
loading: false,
|
||||||
list: [],
|
list: [],
|
||||||
StudyInstanceUidList: [],
|
StudyInstanceUidList: [],
|
||||||
SopInstanceUidList: [],
|
SopInstanceUidList: [],
|
||||||
|
|
@ -439,6 +444,12 @@ export default {
|
||||||
if (this.TaskId) {
|
if (this.TaskId) {
|
||||||
params.VisitTaskId = this.TaskId
|
params.VisitTaskId = this.TaskId
|
||||||
}
|
}
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
this.searchData.IsImageSegmentLabel = true
|
||||||
|
}
|
||||||
|
else if (this.Criterion.CriterionType == 19 || this.Criterion.CriterionType == 20) {
|
||||||
|
this.searchData.IsImageSegmentLabel = false
|
||||||
|
}
|
||||||
this.loading = true
|
this.loading = true
|
||||||
let res = await getSubjectImageUploadList(params)
|
let res = await getSubjectImageUploadList(params)
|
||||||
this.loading = false
|
this.loading = false
|
||||||
|
|
@ -536,6 +547,9 @@ export default {
|
||||||
if (this.VisitTaskId) {
|
if (this.VisitTaskId) {
|
||||||
data.VisitTaskId = this.VisitTaskId
|
data.VisitTaskId = this.VisitTaskId
|
||||||
}
|
}
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
data.IsImageSegmentLabel = true
|
||||||
|
}
|
||||||
let res = await verifyIRStudyAllowUpload(data)
|
let res = await verifyIRStudyAllowUpload(data)
|
||||||
if (res.IsSuccess) {
|
if (res.IsSuccess) {
|
||||||
return res.Result
|
return res.Result
|
||||||
|
|
@ -562,8 +576,9 @@ export default {
|
||||||
confirmMessage = null
|
confirmMessage = null
|
||||||
for (let i = 0; i < checkFiles.length; i++) {
|
for (let i = 0; i < checkFiles.length; i++) {
|
||||||
let item = checkFiles[i]
|
let item = checkFiles[i]
|
||||||
var dicom = await parseDicom(item, 'StudyInstanceUid')
|
var dicom = await parseDicom(item, ['StudyInstanceUid', 'Modality'])
|
||||||
if (!dicom.StudyInstanceUid) continue
|
if (!dicom.StudyInstanceUid) continue
|
||||||
|
if (this.IsImageSegment && dicom.Modality !== 'US') continue
|
||||||
let has = true,
|
let has = true,
|
||||||
has2 = false,
|
has2 = false,
|
||||||
has3 = false
|
has3 = false
|
||||||
|
|
@ -1153,6 +1168,16 @@ export default {
|
||||||
o.instanceUid +
|
o.instanceUid +
|
||||||
params.trialId
|
params.trialId
|
||||||
)}`
|
)}`
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
path = `/${params.trialId}/Image/${params.subjectId
|
||||||
|
}/${params.subjectVisitId}/AnnotationImage/${dicomInfo.visitTaskId
|
||||||
|
}/${scope.getGuid(
|
||||||
|
dicomInfo.studyUid +
|
||||||
|
v.seriesUid +
|
||||||
|
o.instanceUid +
|
||||||
|
params.trialId
|
||||||
|
)}`
|
||||||
|
}
|
||||||
if (scope.isClose) return
|
if (scope.isClose) return
|
||||||
let res = await dcmUpload(
|
let res = await dcmUpload(
|
||||||
{
|
{
|
||||||
|
|
@ -1186,6 +1211,9 @@ export default {
|
||||||
o.imageRows
|
o.imageRows
|
||||||
)
|
)
|
||||||
let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.visitTaskId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
|
let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.visitTaskId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/AnnotationImage/${dicomInfo.visitTaskId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
|
||||||
|
}
|
||||||
let OSSclient = scope.OSSclient
|
let OSSclient = scope.OSSclient
|
||||||
let seriesRes = await OSSclient.put(
|
let seriesRes = await OSSclient.put(
|
||||||
thumbnailPath,
|
thumbnailPath,
|
||||||
|
|
@ -1277,6 +1305,9 @@ export default {
|
||||||
let text = JSON.stringify(Record)
|
let text = JSON.stringify(Record)
|
||||||
let logJsonBlob = scope.generateTxtFile(text)
|
let logJsonBlob = scope.generateTxtFile(text)
|
||||||
let logJsonObjectName = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.visitTaskId}/${dicomInfo.studyUid}/${params.studyMonitorId}.txt`
|
let logJsonObjectName = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.visitTaskId}/${dicomInfo.studyUid}/${params.studyMonitorId}.txt`
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
logJsonObjectName = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/AnnotationImage/${dicomInfo.visitTaskId}/${dicomInfo.studyUid}/${params.studyMonitorId}.txt`
|
||||||
|
}
|
||||||
let logRes
|
let logRes
|
||||||
try {
|
try {
|
||||||
logRes = await scope.OSSclient.put(
|
logRes = await scope.OSSclient.put(
|
||||||
|
|
@ -1305,6 +1336,9 @@ export default {
|
||||||
v.instanceList[0].imageRows
|
v.instanceList[0].imageRows
|
||||||
)
|
)
|
||||||
let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
|
let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/AnnotationImage/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
|
||||||
|
}
|
||||||
let OSSclient = scope.OSSclient
|
let OSSclient = scope.OSSclient
|
||||||
try {
|
try {
|
||||||
let seriesRes = await OSSclient.put(thumbnailPath, blob)
|
let seriesRes = await OSSclient.put(thumbnailPath, blob)
|
||||||
|
|
@ -1322,6 +1356,9 @@ export default {
|
||||||
if (scope.isClose) return false
|
if (scope.isClose) return false
|
||||||
console.log(params)
|
console.log(params)
|
||||||
params.VisitTaskId = dicomInfo.visitTaskId
|
params.VisitTaskId = dicomInfo.visitTaskId
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
params.IsImageSegmentLabel = true
|
||||||
|
}
|
||||||
addOrUpdateArchiveTaskStudy(params)
|
addOrUpdateArchiveTaskStudy(params)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (dicomInfo.failedFileCount === dicomInfo.fileCount) {
|
if (dicomInfo.failedFileCount === dicomInfo.fileCount) {
|
||||||
|
|
|
||||||
|
|
@ -1,40 +1,17 @@
|
||||||
<template>
|
<template>
|
||||||
<el-dialog
|
<el-dialog :visible.sync="visible" :fullscreen="true" :close-on-click-modal="false" :before-close="beforeClose"
|
||||||
:visible.sync="visible"
|
:append-to-body="true" class="uploadDicomAndNonedicom">
|
||||||
:fullscreen="true"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
:before-close="beforeClose"
|
|
||||||
:append-to-body="true"
|
|
||||||
class="uploadDicomAndNonedicom"
|
|
||||||
>
|
|
||||||
<span slot="title">{{ title }}</span>
|
<span slot="title">{{ title }}</span>
|
||||||
<el-tabs type="border-card" v-model="activeName">
|
<el-tabs type="border-card" v-model="activeName">
|
||||||
<el-tab-pane
|
<el-tab-pane :label="$t('uploadDicomAndNonedicom:label:dicom')" name="dicom">
|
||||||
:label="$t('uploadDicomAndNonedicom:label:dicom')"
|
<dicomFile v-if="activeName === 'dicom'" :SubjectId="SubjectId" :SubjectCode="SubjectCode"
|
||||||
name="dicom"
|
:Criterion="Criterion" :TaskId="VisitTaskId" :isUpload.sync="isUpload"
|
||||||
>
|
:isReadingTaskViewInOrder="isReadingTaskViewInOrder" :IsImageSegment="IsImageSegment" />
|
||||||
<dicomFile
|
|
||||||
v-if="activeName === 'dicom'"
|
|
||||||
:SubjectId="SubjectId"
|
|
||||||
:SubjectCode="SubjectCode"
|
|
||||||
:Criterion="Criterion"
|
|
||||||
:TaskId="VisitTaskId"
|
|
||||||
:isUpload.sync="isUpload"
|
|
||||||
:isReadingTaskViewInOrder="isReadingTaskViewInOrder"
|
|
||||||
/>
|
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane
|
<el-tab-pane :label="$t('uploadDicomAndNonedicom:label:nonedicom')" name="nonedicom">
|
||||||
:label="$t('uploadDicomAndNonedicom:label:nonedicom')"
|
<nonedicomFile v-if="activeName === 'nonedicom'" :SubjectId="SubjectId" :SubjectCode="SubjectCode"
|
||||||
name="nonedicom"
|
:Criterion="Criterion" :VisitTaskId="VisitTaskId" :isUpload.sync="isUpload"
|
||||||
>
|
:IsImageSegment="IsImageSegment" />
|
||||||
<nonedicomFile
|
|
||||||
v-if="activeName === 'nonedicom'"
|
|
||||||
:SubjectId="SubjectId"
|
|
||||||
:SubjectCode="SubjectCode"
|
|
||||||
:Criterion="Criterion"
|
|
||||||
:VisitTaskId="VisitTaskId"
|
|
||||||
:isUpload.sync="isUpload"
|
|
||||||
/>
|
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
@ -74,6 +51,10 @@ export default {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 0,
|
default: 0,
|
||||||
},
|
},
|
||||||
|
IsImageSegment: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
@ -84,6 +65,7 @@ export default {
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.title = `Upload Images:${this.SubjectCode}(${this.Criterion.TrialReadingCriterionName})`
|
this.title = `Upload Images:${this.SubjectCode}(${this.Criterion.TrialReadingCriterionName})`
|
||||||
|
if (this.IsImageSegment) this.title = `Upload Images:${this.SubjectCode}`
|
||||||
store.dispatch('trials/setUnLock', true)
|
store.dispatch('trials/setUnLock', true)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
@ -103,11 +85,13 @@ export default {
|
||||||
::v-deep.el-tabs--left .el-tabs__header.is-left {
|
::v-deep.el-tabs--left .el-tabs__header.is-left {
|
||||||
margin-right: 0;
|
margin-right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.uploadDicomAndNonedicom {
|
.uploadDicomAndNonedicom {
|
||||||
::v-deep.el-tabs--border-card > .el-tabs__header .el-tabs__item {
|
::v-deep.el-tabs--border-card>.el-tabs__header .el-tabs__item {
|
||||||
color: #909399;
|
color: #909399;
|
||||||
}
|
}
|
||||||
::v-deep.el-tabs--border-card > .el-tabs__header .el-tabs__item.is-active {
|
|
||||||
|
::v-deep.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active {
|
||||||
color: #428bca;
|
color: #428bca;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
border-right-color: #dcdfe6;
|
border-right-color: #dcdfe6;
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,11 @@
|
||||||
@sort-change="handleSortByColumn" :default-sort="{ prop: 'TaskBlindName', order: 'descending' }">
|
@sort-change="handleSortByColumn" :default-sort="{ prop: 'TaskBlindName', order: 'descending' }">
|
||||||
<!--受试者-->
|
<!--受试者-->
|
||||||
<el-table-column prop="SubjectCode" :label="$t('upload:nonedicom:table:subject')" />
|
<el-table-column prop="SubjectCode" :label="$t('upload:nonedicom:table:subject')" />
|
||||||
|
<!--访视名称-->
|
||||||
|
<el-table-column prop="VisitName" :label="$t('upload:nonedicom:table:VisitName')" sortable="custom"
|
||||||
|
v-if="IsImageSegment" />
|
||||||
<!--任务名称-->
|
<!--任务名称-->
|
||||||
<el-table-column prop="TaskBlindName" :label="$t('upload:nonedicom:table:taskName')" sortable="custom" />
|
<el-table-column prop="TaskBlindName" :label="$t('upload:nonedicom:table:taskName')" sortable="custom" v-else />
|
||||||
<!--检查类型-->
|
<!--检查类型-->
|
||||||
<el-table-column prop="Modality" :label="$t('upload:nonedicom:table:molityType')" sortable="custom">
|
<el-table-column prop="Modality" :label="$t('upload:nonedicom:table:molityType')" sortable="custom">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
@ -104,7 +107,7 @@
|
||||||
: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')"
|
<el-button circle icon="el-icon-upload2" :title="$t('upload:nonedicom:button:upload')"
|
||||||
@click.native.prevent="handleUpload(scope.row)" />
|
@click.native.prevent="handleUpload(scope.row)" v-if="scope.row.Modality !== 'IVUS'" />
|
||||||
<!--删除--->
|
<!--删除--->
|
||||||
<el-button :disabled="scope.row.UploadedFileCount <= 0 ||
|
<el-button :disabled="scope.row.UploadedFileCount <= 0 ||
|
||||||
scope.row.ReadingTaskState === 2
|
scope.row.ReadingTaskState === 2
|
||||||
|
|
@ -248,6 +251,10 @@ export default {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
IsImageSegment: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
@ -311,6 +318,12 @@ export default {
|
||||||
if (this.VisitTaskId) {
|
if (this.VisitTaskId) {
|
||||||
this.searchData.VisitTaskId = this.VisitTaskId
|
this.searchData.VisitTaskId = this.VisitTaskId
|
||||||
}
|
}
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
this.searchData.IsImageSegmentLabel = true
|
||||||
|
}
|
||||||
|
else if (this.Criterion.CriterionType == 19 || this.Criterion.CriterionType == 20) {
|
||||||
|
this.searchData.IsImageSegmentLabel = false
|
||||||
|
}
|
||||||
this.loading = true
|
this.loading = true
|
||||||
let res = await getIRUploadTaskNoneDicomStudyList(this.searchData)
|
let res = await getIRUploadTaskNoneDicomStudyList(this.searchData)
|
||||||
this.loading = false
|
this.loading = false
|
||||||
|
|
@ -534,9 +547,15 @@ export default {
|
||||||
let file = this.fileList.filter((item) => item.id === arr[index].id)[0]
|
let file = this.fileList.filter((item) => item.id === arr[index].id)[0]
|
||||||
file.status = 1
|
file.status = 1
|
||||||
let path = `/${this.$route.query.trialId}/TaskImage/${this.currentRow.SubjectId
|
let path = `/${this.$route.query.trialId}/TaskImage/${this.currentRow.SubjectId
|
||||||
}/${this.currentRow.VisitTaskId}/${this.$guid()}${file.name
|
}/${this.currentRow.SourceSubjectVisitId}/${this.currentRow.VisitTaskId}/${this.$guid()}${file.name
|
||||||
.substring(file.name.lastIndexOf('.'))
|
.substring(file.name.lastIndexOf('.'))
|
||||||
.toLocaleLowerCase()}`
|
.toLocaleLowerCase()}`
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
path = `/${this.$route.query.trialId}/TaskImage/${this.currentRow.SubjectId
|
||||||
|
}/${this.currentRow.SourceSubjectVisitId}/AnnotationImage/${this.currentRow.VisitTaskId}/${this.$guid()}${file.name
|
||||||
|
.substring(file.name.lastIndexOf('.'))
|
||||||
|
.toLocaleLowerCase()}`
|
||||||
|
}
|
||||||
file.curPath = path
|
file.curPath = path
|
||||||
const fileData = await this.fileToBlob(file.file)
|
const fileData = await this.fileToBlob(file.file)
|
||||||
let res = await this.fileToOss(path, fileData, file)
|
let res = await this.fileToOss(path, fileData, file)
|
||||||
|
|
@ -620,6 +639,9 @@ export default {
|
||||||
params.RecordPath = RecordPath.path
|
params.RecordPath = RecordPath.path
|
||||||
params.FailedFileCount = RecordPath.Record.Failed.length
|
params.FailedFileCount = RecordPath.Record.Failed.length
|
||||||
}
|
}
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
params.IsImageSegmentLabel = true
|
||||||
|
}
|
||||||
uploadNoneDicomFile(params)
|
uploadNoneDicomFile(params)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (!isReLoad) {
|
if (!isReLoad) {
|
||||||
|
|
@ -658,7 +680,10 @@ export default {
|
||||||
})
|
})
|
||||||
let text = JSON.stringify(Record)
|
let text = JSON.stringify(Record)
|
||||||
let logJsonBlob = this.generateTxtFile(text)
|
let logJsonBlob = this.generateTxtFile(text)
|
||||||
let logJsonObjectName = `/${this.$route.query.trialId}/TaskImage/${this.currentRow.SubjectId}/${this.currentRow.VisitTaskId}/${this.studyMonitorId}.txt`
|
let logJsonObjectName = `/${this.$route.query.trialId}/TaskImage/${this.currentRow.SubjectId}/${this.currentRow.SourceSubjectVisitId}/${this.currentRow.VisitTaskId}/${this.studyMonitorId}.txt`
|
||||||
|
if (this.IsImageSegment) {
|
||||||
|
logJsonObjectName = `/${this.$route.query.trialId}/TaskImage/${this.currentRow.SubjectId}/${this.currentRow.SourceSubjectVisitId}/AnnotationImage/${this.currentRow.VisitTaskId}/${this.studyMonitorId}.txt`
|
||||||
|
}
|
||||||
let logRes
|
let logRes
|
||||||
try {
|
try {
|
||||||
logRes = await this.OSSclient.put(logJsonObjectName, logJsonBlob)
|
logRes = await this.OSSclient.put(logJsonObjectName, logJsonBlob)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,160 @@
|
||||||
|
<template>
|
||||||
|
<BaseContainer>
|
||||||
|
<div slot="main-container">
|
||||||
|
<el-table v-adaptive="{ bottomOffset: 75 }" :data="list" stripe height="100" @sort-change="handleSortChange"
|
||||||
|
v-loading="loading">
|
||||||
|
<el-table-column type="index" width="40" align="left" />
|
||||||
|
<el-table-column prop="IsUrgent" :label="$t('trials:consistencyCheck:table:isUrgent')"
|
||||||
|
show-overflow-tooltip min-width="100">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="scope.row.IsUrgent
|
||||||
|
? 'danger' : 'primary'
|
||||||
|
">{{ $fd('YesOrNo', scope.row.IsUrgent) }}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<!-- 受试者编号 -->
|
||||||
|
<el-table-column prop="SubjectCode" min-width="100"
|
||||||
|
:label="$t('trials:pendingReadingTasks:table:subjectCode')" show-overflow-tooltip
|
||||||
|
sortable="custom" />
|
||||||
|
<!-- 访视数量 -->
|
||||||
|
<el-table-column prop="VisitCount" :label="$t('trials:pendingReadingTasks:table:VisitCount')"
|
||||||
|
show-overflow-tooltip />
|
||||||
|
<!-- dicom检查数量 -->
|
||||||
|
<el-table-column prop="DicomStudyCount" :label="$t('trials:pendingReadingTasks:table:DicomStudyCount')"
|
||||||
|
show-overflow-tooltip />
|
||||||
|
<!-- 非dicom检查数量 -->
|
||||||
|
<el-table-column prop="NoneDicomStudyCount"
|
||||||
|
:label="$t('trials:pendingReadingTasks:table:NoneDicomStudyCount')" show-overflow-tooltip />
|
||||||
|
<!-- 标记访视数量 -->
|
||||||
|
<el-table-column prop="MarkVisitCount" :label="$t('trials:pendingReadingTasks:table:MarkVisitCount')"
|
||||||
|
show-overflow-tooltip />
|
||||||
|
<!-- 标记dicom检查数量 -->
|
||||||
|
<el-table-column prop="MarkDicomStudyCount"
|
||||||
|
:label="$t('trials:pendingReadingTasks:table:MarkDicomStudyCount')" show-overflow-tooltip />
|
||||||
|
<!-- 标记非dicom检查数量 -->
|
||||||
|
<el-table-column prop="MarkNoneDicomStudyCount"
|
||||||
|
:label="$t('trials:pendingReadingTasks:table:MarkNoneDicomStudyCount')" show-overflow-tooltip />
|
||||||
|
<el-table-column :label="$t('common:action:action')" width="250" fixed="right">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<!-- 阅片 -->
|
||||||
|
<!-- <el-button :disabled="scope.row.ExistReadingApply" circle :title="scope.row.ExistReadingApply
|
||||||
|
? $t(
|
||||||
|
'trials:pendingReadingTasks:button:ExistReadingApply'
|
||||||
|
)
|
||||||
|
: $t('trials:pendingReadingTasks:button:review')
|
||||||
|
" icon="el-icon-edit-outline" @click="handleReadImage(scope.row)" /> -->
|
||||||
|
<!-- 上传 -->
|
||||||
|
<el-button v-hasPermi="['role:ir']" circle icon="el-icon-upload2"
|
||||||
|
:title="$t('trials:pendingReadingTasks:button:upload')"
|
||||||
|
@click="openUploadImage(scope.row, 'upload')" />
|
||||||
|
<!-- 下载 -->
|
||||||
|
<el-button v-hasPermi="['role:ir']" circle icon="el-icon-download"
|
||||||
|
:title="$t('trials:pendingReadingTasks:button:download')"
|
||||||
|
@click="openUploadImage(scope.row, 'download')" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
|
||||||
|
@pagination="getList" />
|
||||||
|
</div>
|
||||||
|
<upload-dicom-and-nonedicom v-if="uploadImageVisible" :SubjectId="uploadSubjectId"
|
||||||
|
:SubjectCode="uploadSubjectCode" :Criterion="uploadTrialCriterion" :visible.sync="uploadImageVisible"
|
||||||
|
:IsImageSegment="true" />
|
||||||
|
<download-dicom-and-nonedicom v-if="downloadImageVisible" :SubjectId="uploadSubjectId"
|
||||||
|
:SubjectCode="uploadSubjectCode" :Criterion="uploadTrialCriterion" :visible.sync="downloadImageVisible"
|
||||||
|
:IsImageSegment="true" />
|
||||||
|
</BaseContainer>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import BaseContainer from '@/components/BaseContainer'
|
||||||
|
import uploadDicomAndNonedicom from '@/components/uploadDicomAndNonedicom'
|
||||||
|
import downloadDicomAndNonedicom from '@/components/downloadDicomAndNonedicom'
|
||||||
|
import Pagination from '@/components/Pagination'
|
||||||
|
import { getTrialSubjectVisitMarkList } from "@/api/trials"
|
||||||
|
const searchDataDefault = () => {
|
||||||
|
return {
|
||||||
|
SubjectCode: '',
|
||||||
|
PageIndex: 1,
|
||||||
|
PageSize: 20,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default {
|
||||||
|
name: "TargetSection",
|
||||||
|
components: {
|
||||||
|
BaseContainer,
|
||||||
|
Pagination,
|
||||||
|
'upload-dicom-and-nonedicom': uploadDicomAndNonedicom,
|
||||||
|
'download-dicom-and-nonedicom': downloadDicomAndNonedicom,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
TrialReadingCriterionId: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
trialCriterionList: {
|
||||||
|
type: Array,
|
||||||
|
default: () => {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
searchData: searchDataDefault(),
|
||||||
|
loading: false,
|
||||||
|
list: [],
|
||||||
|
total: 0,
|
||||||
|
|
||||||
|
// 上传
|
||||||
|
downloadImageVisible: false,
|
||||||
|
uploadImageVisible: false,
|
||||||
|
uploadSubjectId: null,
|
||||||
|
uploadSubjectCode: null,
|
||||||
|
uploadTrialCriterion: {},
|
||||||
|
uploadStatus: 'upload',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async getList() {
|
||||||
|
try {
|
||||||
|
this.searchData.TrialId = this.$route.query.trialId
|
||||||
|
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId
|
||||||
|
this.loading = true
|
||||||
|
let res = await getTrialSubjectVisitMarkList(this.searchData)
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
this.list = res.Result.CurrentPageData
|
||||||
|
this.total = res.Result.TotalCount
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 排序
|
||||||
|
handleSortChange(column) {
|
||||||
|
if (column.order === 'ascending') {
|
||||||
|
this.searchData.Asc = true
|
||||||
|
} else {
|
||||||
|
this.searchData.Asc = false
|
||||||
|
}
|
||||||
|
this.searchData.SortField = column.prop
|
||||||
|
this.searchData.PageIndex = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
// 打开上传下载弹框
|
||||||
|
openUploadImage(item, status) {
|
||||||
|
this.uploadSubjectCode = item.SubjectCode
|
||||||
|
this.uploadSubjectId = item.SubjectId
|
||||||
|
let trialCriterion = this.trialCriterionList.find(item => item.TrialReadingCriterionId === this.TrialReadingCriterionId)
|
||||||
|
this.uploadTrialCriterion = trialCriterion
|
||||||
|
this.uploadStatus = status
|
||||||
|
this[`${status}ImageVisible`] = true
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
|
|
@ -1,272 +1,152 @@
|
||||||
<template>
|
<template>
|
||||||
<BaseContainer
|
<BaseContainer v-loading="loading" class="reading-task">
|
||||||
v-loading="loading"
|
<el-tabs v-if="TrialReadingCriterionId" v-model="TrialReadingCriterionId" type="border-card">
|
||||||
class="reading-task"
|
<el-tab-pane v-for="item of trialCriterionList" :key="item.TrialReadingCriterionId"
|
||||||
>
|
:label="item.TrialReadingCriterionName" :name="item.TrialReadingCriterionId">
|
||||||
<el-tabs
|
<div v-if="
|
||||||
v-if="TrialReadingCriterionId"
|
(isReadingTaskViewInOrder === 1 ||
|
||||||
v-model="TrialReadingCriterionId"
|
isReadingTaskViewInOrder === 2) &&
|
||||||
type="border-card"
|
TrialReadingCriterionId === item.TrialReadingCriterionId
|
||||||
>
|
">
|
||||||
<el-tab-pane
|
|
||||||
v-for="item of trialCriterionList"
|
|
||||||
:key="item.TrialReadingCriterionId"
|
|
||||||
:label="item.TrialReadingCriterionName"
|
|
||||||
:name="item.TrialReadingCriterionId"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-if="
|
|
||||||
(isReadingTaskViewInOrder === 1 ||
|
|
||||||
isReadingTaskViewInOrder === 2) &&
|
|
||||||
TrialReadingCriterionId === item.TrialReadingCriterionId
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<div slot="search-container">
|
<div slot="search-container">
|
||||||
<el-form :inline="true">
|
<el-form :inline="true">
|
||||||
<!-- 受试者编号 -->
|
<!-- 受试者编号 -->
|
||||||
<el-form-item
|
<el-form-item :label="$t('trials:pendingReadingTasks:table:subjectCode')">
|
||||||
:label="$t('trials:pendingReadingTasks:table:subjectCode')"
|
<el-input v-model="searchData.SubjectCode" style="width: 130px" clearable />
|
||||||
>
|
|
||||||
<el-input
|
|
||||||
v-model="searchData.SubjectCode"
|
|
||||||
style="width: 130px"
|
|
||||||
clearable
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<!-- 查询 -->
|
<!-- 查询 -->
|
||||||
<el-button
|
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
|
||||||
type="primary"
|
|
||||||
icon="el-icon-search"
|
|
||||||
@click="handleSearch"
|
|
||||||
>
|
|
||||||
{{ $t('common:button:search') }}
|
{{ $t('common:button:search') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<!-- 重置 -->
|
<!-- 重置 -->
|
||||||
<el-button
|
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
|
||||||
type="primary"
|
|
||||||
icon="el-icon-refresh-left"
|
|
||||||
@click="handleReset"
|
|
||||||
>
|
|
||||||
{{ $t('common:button:reset') }}
|
{{ $t('common:button:reset') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<!-- 靶段标注 -->
|
||||||
|
<el-button type="primary" @click="() => TargetSection_visible = true"
|
||||||
|
v-if="item.CriterionType === 19 || item.CriterionType === 20">
|
||||||
|
{{ $t('trials:pendingReadingTasks:button:TargetSection') }}
|
||||||
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
<div slot="main-container">
|
<div slot="main-container">
|
||||||
<el-table
|
<el-table v-adaptive="{ bottomOffset: 75 }" :data="list" stripe height="100"
|
||||||
v-adaptive="{ bottomOffset: 75 }"
|
@sort-change="handleSortChange">
|
||||||
:data="list"
|
|
||||||
stripe
|
|
||||||
height="100"
|
|
||||||
@sort-change="handleSortChange"
|
|
||||||
>
|
|
||||||
<el-table-column type="index" width="40" align="left" />
|
<el-table-column type="index" width="40" align="left" />
|
||||||
<el-table-column
|
<el-table-column prop="IsUrgent" :label="$t('trials:consistencyCheck:table:isUrgent')"
|
||||||
prop="IsUrgent"
|
show-overflow-tooltip min-width="100">
|
||||||
:label="$t('trials:consistencyCheck:table:isUrgent')"
|
|
||||||
show-overflow-tooltip
|
|
||||||
min-width="100"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-tooltip
|
<el-tooltip class="item" effect="dark" :content="$t('trials:pendingReadingTasks:table:feedbackmsg')"
|
||||||
class="item"
|
placement="bottom" v-if="scope.row.IsExistUnprocessedFeedback">
|
||||||
effect="dark"
|
<i v-if="scope.row.IsExistUnprocessedFeedback" class="el-icon-warning"
|
||||||
:content="$t('trials:pendingReadingTasks:table:feedbackmsg')"
|
style="color: #f44336; font-size: 16px" />
|
||||||
placement="bottom"
|
|
||||||
v-if="scope.row.IsExistUnprocessedFeedback"
|
|
||||||
>
|
|
||||||
<i
|
|
||||||
v-if="scope.row.IsExistUnprocessedFeedback"
|
|
||||||
class="el-icon-warning"
|
|
||||||
style="color: #f44336; font-size: 16px"
|
|
||||||
/>
|
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tag
|
<el-tag :type="scope.row.UrgentColor === 1
|
||||||
:type="
|
? 'danger'
|
||||||
scope.row.UrgentColor === 1
|
: scope.row.UrgentColor === 2
|
||||||
? 'danger'
|
? 'warning'
|
||||||
: scope.row.UrgentColor === 2
|
: 'primary'
|
||||||
? 'warning'
|
">{{ $fd('YesOrNo', scope.row.IsUrgent) }}</el-tag>
|
||||||
: 'primary'
|
|
||||||
"
|
|
||||||
>{{ $fd('YesOrNo', scope.row.IsUrgent) }}</el-tag
|
|
||||||
>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 受试者编号 -->
|
<!-- 受试者编号 -->
|
||||||
<el-table-column
|
<el-table-column prop="SubjectCode" min-width="100"
|
||||||
prop="SubjectCode"
|
:label="$t('trials:pendingReadingTasks:table:subjectCode')" show-overflow-tooltip sortable="custom" />
|
||||||
min-width="100"
|
|
||||||
:label="$t('trials:pendingReadingTasks:table:subjectCode')"
|
|
||||||
show-overflow-tooltip
|
|
||||||
sortable="custom"
|
|
||||||
/>
|
|
||||||
<!-- 剩余阅片量 -->
|
<!-- 剩余阅片量 -->
|
||||||
<el-table-column
|
<el-table-column prop="UnReadCanReadTaskCount" min-width="100" :label="$t('trials:pendingReadingTasks:table:remainingReadingVolume')
|
||||||
prop="UnReadCanReadTaskCount"
|
" show-overflow-tooltip sortable="custom" />
|
||||||
min-width="100"
|
<el-table-column prop="UrgentCount" :label="$t('trials:sysDocBeSigned:table:UrgentCount')"
|
||||||
:label="
|
show-overflow-tooltip min-width="100" sortable="custom">
|
||||||
$t('trials:pendingReadingTasks:table:remainingReadingVolume')
|
|
||||||
"
|
|
||||||
show-overflow-tooltip
|
|
||||||
sortable="custom"
|
|
||||||
/>
|
|
||||||
<el-table-column
|
|
||||||
prop="UrgentCount"
|
|
||||||
:label="$t('trials:sysDocBeSigned:table:UrgentCount')"
|
|
||||||
show-overflow-tooltip
|
|
||||||
min-width="100"
|
|
||||||
sortable="custom"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span
|
<span :style="{
|
||||||
:style="{
|
color:
|
||||||
color:
|
scope.row.UrgentColor === 1
|
||||||
scope.row.UrgentColor === 1
|
? '#F56C6C'
|
||||||
? '#F56C6C'
|
: scope.row.UrgentColor === 2
|
||||||
: scope.row.UrgentColor === 2
|
|
||||||
? '#E6A23C'
|
? '#E6A23C'
|
||||||
: '#409EFF',
|
: '#409EFF',
|
||||||
}"
|
}">{{ scope.row.UrgentCount }}</span>
|
||||||
>{{ scope.row.UrgentCount }}</span
|
|
||||||
>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 建议完成时间 -->
|
<!-- 建议完成时间 -->
|
||||||
<el-table-column
|
<el-table-column prop="SuggesteFinishedTime" min-width="100" :label="$t('trials:pendingReadingTasks:table:suggestedCompletionTime')
|
||||||
prop="SuggesteFinishedTime"
|
" show-overflow-tooltip sortable="custom">
|
||||||
min-width="100"
|
|
||||||
:label="
|
|
||||||
$t('trials:pendingReadingTasks:table:suggestedCompletionTime')
|
|
||||||
"
|
|
||||||
show-overflow-tooltip
|
|
||||||
sortable="custom"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.SuggesteFinishedTime.split(':')[0] + ':00:00' }}
|
{{ scope.row.SuggesteFinishedTime.split(':')[0] + ':00:00' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column :label="$t('common:action:action')" width="250" fixed="right">
|
||||||
:label="$t('common:action:action')"
|
|
||||||
width="250"
|
|
||||||
fixed="right"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<!-- 阅片 -->
|
<!-- 阅片 -->
|
||||||
<el-button
|
<el-button :disabled="scope.row.ExistReadingApply" circle :title="scope.row.ExistReadingApply
|
||||||
:disabled="scope.row.ExistReadingApply"
|
? $t(
|
||||||
circle
|
'trials:pendingReadingTasks:button:ExistReadingApply'
|
||||||
:title="
|
)
|
||||||
scope.row.ExistReadingApply
|
: $t('trials:pendingReadingTasks:button:review')
|
||||||
? $t(
|
" icon="el-icon-edit-outline" @click="handleReadImage(scope.row)" />
|
||||||
'trials:pendingReadingTasks:button:ExistReadingApply'
|
|
||||||
)
|
|
||||||
: $t('trials:pendingReadingTasks:button:review')
|
|
||||||
"
|
|
||||||
icon="el-icon-edit-outline"
|
|
||||||
@click="handleReadImage(scope.row)"
|
|
||||||
/>
|
|
||||||
<!-- 上传 -->
|
<!-- 上传 -->
|
||||||
<el-button
|
<el-button v-if="
|
||||||
v-if="
|
item.ImageUploadEnum > 0 &&
|
||||||
item.ImageUploadEnum > 0 &&
|
item.IsReadingTaskViewInOrder > 1 &&
|
||||||
item.IsReadingTaskViewInOrder > 1 &&
|
!scope.row.IsSubjectJudge
|
||||||
!scope.row.IsSubjectJudge
|
" v-hasPermi="['role:ir']" circle icon="el-icon-upload2"
|
||||||
"
|
|
||||||
v-hasPermi="['role:ir']"
|
|
||||||
circle
|
|
||||||
icon="el-icon-upload2"
|
|
||||||
:title="$t('trials:pendingReadingTasks:button:upload')"
|
:title="$t('trials:pendingReadingTasks:button:upload')"
|
||||||
@click="openUploadImage(scope.row, item, 'upload')"
|
@click="openUploadImage(scope.row, item, 'upload')" />
|
||||||
/>
|
|
||||||
<!-- 下载 -->
|
<!-- 下载 -->
|
||||||
<el-button
|
<el-button v-if="
|
||||||
v-if="
|
item.ImageDownloadEnum > 0 &&
|
||||||
item.ImageDownloadEnum > 0 &&
|
item.IsReadingTaskViewInOrder > 1 &&
|
||||||
item.IsReadingTaskViewInOrder > 1 &&
|
!scope.row.IsSubjectJudge
|
||||||
!scope.row.IsSubjectJudge
|
" v-hasPermi="['role:ir']" circle icon="el-icon-download"
|
||||||
"
|
|
||||||
v-hasPermi="['role:ir']"
|
|
||||||
circle
|
|
||||||
icon="el-icon-download"
|
|
||||||
:title="$t('trials:pendingReadingTasks:button:download')"
|
:title="$t('trials:pendingReadingTasks:button:download')"
|
||||||
@click="openUploadImage(scope.row, item, 'download')"
|
@click="openUploadImage(scope.row, item, 'download')" />
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<pagination
|
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
|
||||||
class="page"
|
@pagination="getList" />
|
||||||
:total="total"
|
|
||||||
:page.sync="searchData.PageIndex"
|
|
||||||
:limit.sync="searchData.PageSize"
|
|
||||||
@pagination="getList"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div v-else-if="
|
||||||
v-else-if="
|
isReadingTaskViewInOrder === 0 &&
|
||||||
isReadingTaskViewInOrder === 0 &&
|
TrialReadingCriterionId === item.TrialReadingCriterionId
|
||||||
TrialReadingCriterionId === item.TrialReadingCriterionId
|
">
|
||||||
"
|
|
||||||
>
|
|
||||||
<el-descriptions :column="2" border style="width: 800px">
|
<el-descriptions :column="2" border style="width: 800px">
|
||||||
<!-- 剩余任务量 -->
|
<!-- 剩余任务量 -->
|
||||||
<el-descriptions-item
|
<el-descriptions-item :label="$t('trials:pendingReadingTasks:table:remainingTaskVolume')
|
||||||
:label="
|
" :label-style="{ width: '200px' }">
|
||||||
$t('trials:pendingReadingTasks:table:remainingTaskVolume')
|
|
||||||
"
|
|
||||||
:label-style="{ width: '200px' }"
|
|
||||||
>
|
|
||||||
<el-tag size="small" type="danger">{{
|
<el-tag size="small" type="danger">{{
|
||||||
randomReadInfo.UnReadTaskCount
|
randomReadInfo.UnReadTaskCount
|
||||||
}}</el-tag>
|
}}</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<!-- 剩余裁判量 -->
|
<!-- 剩余裁判量 -->
|
||||||
<el-descriptions-item
|
<el-descriptions-item :label="$t('trials:pendingReadingTasks:table:amountOfJudgesRemaining')
|
||||||
:label="
|
" :label-style="{ width: '200px' }">
|
||||||
$t('trials:pendingReadingTasks:table:amountOfJudgesRemaining')
|
|
||||||
"
|
|
||||||
:label-style="{ width: '200px' }"
|
|
||||||
>
|
|
||||||
<el-tag size="small" type="danger">{{
|
<el-tag size="small" type="danger">{{
|
||||||
randomReadInfo.UnReadJudgeTaskCount
|
randomReadInfo.UnReadJudgeTaskCount
|
||||||
}}</el-tag>
|
}}</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<!-- 已完成任务量 -->
|
<!-- 已完成任务量 -->
|
||||||
<el-descriptions-item
|
<el-descriptions-item :label="$t('trials:pendingReadingTasks:table:amountOfCompletedTasks')
|
||||||
:label="
|
" :label-style="{ width: '200px' }">
|
||||||
$t('trials:pendingReadingTasks:table:amountOfCompletedTasks')
|
|
||||||
"
|
|
||||||
:label-style="{ width: '200px' }"
|
|
||||||
>
|
|
||||||
<el-tag size="small">{{ randomReadInfo.FinishTaskCount }}</el-tag>
|
<el-tag size="small">{{ randomReadInfo.FinishTaskCount }}</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<!-- 已完成裁判量 -->
|
<!-- 已完成裁判量 -->
|
||||||
<el-descriptions-item
|
<el-descriptions-item :label="$t('trials:pendingReadingTasks:table:numberOfJudgesCompleted')
|
||||||
:label="
|
" :label-style="{ width: '200px' }">
|
||||||
$t('trials:pendingReadingTasks:table:numberOfJudgesCompleted')
|
|
||||||
"
|
|
||||||
:label-style="{ width: '200px' }"
|
|
||||||
>
|
|
||||||
<el-tag size="small">{{
|
<el-tag size="small">{{
|
||||||
randomReadInfo.FinishJudgeTaskCount
|
randomReadInfo.FinishJudgeTaskCount
|
||||||
}}</el-tag>
|
}}</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item>
|
<el-descriptions-item>
|
||||||
<!-- 开始随机阅片 -->
|
<!-- 开始随机阅片 -->
|
||||||
<el-button
|
<el-button type="primary" size="small" :disabled="randomReadInfo.UnReadTaskCount +
|
||||||
type="primary"
|
randomReadInfo.UnReadJudgeTaskCount ===
|
||||||
size="small"
|
0
|
||||||
:disabled="
|
" @click="handleOutOfOrderReading">
|
||||||
randomReadInfo.UnReadTaskCount +
|
|
||||||
randomReadInfo.UnReadJudgeTaskCount ===
|
|
||||||
0
|
|
||||||
"
|
|
||||||
@click="handleOutOfOrderReading"
|
|
||||||
>
|
|
||||||
{{ $t('trials:pendingReadingTasks:button:beginRandomReview') }}
|
{{ $t('trials:pendingReadingTasks:button:beginRandomReview') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
|
|
@ -282,21 +162,17 @@
|
||||||
:status="uploadStatus"
|
:status="uploadStatus"
|
||||||
@getList="getList"
|
@getList="getList"
|
||||||
/> -->
|
/> -->
|
||||||
<upload-dicom-and-nonedicom
|
<upload-dicom-and-nonedicom v-if="uploadImageVisible" :SubjectId="uploadSubjectId" :SubjectCode="uploadSubjectCode"
|
||||||
v-if="uploadImageVisible"
|
:Criterion="uploadTrialCriterion" :isReadingTaskViewInOrder="isReadingTaskViewInOrder"
|
||||||
:SubjectId="uploadSubjectId"
|
:visible.sync="uploadImageVisible" />
|
||||||
:SubjectCode="uploadSubjectCode"
|
<download-dicom-and-nonedicom v-if="downloadImageVisible" :SubjectId="uploadSubjectId"
|
||||||
:Criterion="uploadTrialCriterion"
|
:SubjectCode="uploadSubjectCode" :Criterion="uploadTrialCriterion" :visible.sync="downloadImageVisible" />
|
||||||
:isReadingTaskViewInOrder="isReadingTaskViewInOrder"
|
<el-dialog :title="$t('trials:pendingReadingTasks:button:TargetSection')" :visible.sync="TargetSection_visible"
|
||||||
:visible.sync="uploadImageVisible"
|
:fullscreen="true">
|
||||||
/>
|
<TargetSection v-if="TargetSection_visible" :TrialReadingCriterionId="TrialReadingCriterionId"
|
||||||
<download-dicom-and-nonedicom
|
:trialCriterionList="trialCriterionList" />
|
||||||
v-if="downloadImageVisible"
|
</el-dialog>
|
||||||
:SubjectId="uploadSubjectId"
|
|
||||||
:SubjectCode="uploadSubjectCode"
|
|
||||||
:Criterion="uploadTrialCriterion"
|
|
||||||
:visible.sync="downloadImageVisible"
|
|
||||||
/>
|
|
||||||
</BaseContainer>
|
</BaseContainer>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
|
|
@ -308,6 +184,7 @@ import uploadDicomAndNonedicom from '@/components/uploadDicomAndNonedicom'
|
||||||
import downloadDicomAndNonedicom from '@/components/downloadDicomAndNonedicom'
|
import downloadDicomAndNonedicom from '@/components/downloadDicomAndNonedicom'
|
||||||
import Pagination from '@/components/Pagination'
|
import Pagination from '@/components/Pagination'
|
||||||
import { getToken } from '@/utils/auth'
|
import { getToken } from '@/utils/auth'
|
||||||
|
import TargetSection from "./components/TargetSection"
|
||||||
const searchDataDefault = () => {
|
const searchDataDefault = () => {
|
||||||
return {
|
return {
|
||||||
SubjectCode: '',
|
SubjectCode: '',
|
||||||
|
|
@ -322,6 +199,7 @@ export default {
|
||||||
Pagination,
|
Pagination,
|
||||||
'upload-dicom-and-nonedicom': uploadDicomAndNonedicom,
|
'upload-dicom-and-nonedicom': uploadDicomAndNonedicom,
|
||||||
'download-dicom-and-nonedicom': downloadDicomAndNonedicom,
|
'download-dicom-and-nonedicom': downloadDicomAndNonedicom,
|
||||||
|
TargetSection
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
@ -347,6 +225,8 @@ export default {
|
||||||
uploadSubjectCode: null,
|
uploadSubjectCode: null,
|
||||||
uploadTrialCriterion: {},
|
uploadTrialCriterion: {},
|
||||||
uploadStatus: 'upload',
|
uploadStatus: 'upload',
|
||||||
|
|
||||||
|
TargetSection_visible: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
|
@ -438,7 +318,7 @@ export default {
|
||||||
var path = ''
|
var path = ''
|
||||||
if (this.readingTool === 0 || this.readingTool === 2) {
|
if (this.readingTool === 0 || this.readingTool === 2) {
|
||||||
if (this.criterionType === 0 && this.trialId === '08dd28b3-6843-fc05-0242-ac1301000000') {
|
if (this.criterionType === 0 && this.trialId === '08dd28b3-6843-fc05-0242-ac1301000000') {
|
||||||
path = `/fusion?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&studyId=62b3dfc4-1e04-4180-910d-fe595f398361&ctseriesId=1bd24f53-d419-32e5-92d4-2b04640aaa65&ptseriesId=2b7b128d-8c3f-8357-ad14-e38f3acbbdff&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&TokenKey=${token}&lang=${this.$i18n.locale}`
|
path = `/fusion?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&studyId=62b3dfc4-1e04-4180-910d-fe595f398361&ctseriesId=1bd24f53-d419-32e5-92d4-2b04640aaa65&ptseriesId=2b7b128d-8c3f-8357-ad14-e38f3acbbdff&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&TokenKey=${token}&lang=${this.$i18n.locale}`
|
||||||
} else {
|
} else {
|
||||||
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
||||||
}
|
}
|
||||||
|
|
@ -468,7 +348,7 @@ export default {
|
||||||
)
|
)
|
||||||
var token = getToken()
|
var token = getToken()
|
||||||
var path = ''
|
var path = ''
|
||||||
if (this.readingTool === 0 || this.readingTool === 2 ) {
|
if (this.readingTool === 0 || this.readingTool === 2) {
|
||||||
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
||||||
} else {
|
} else {
|
||||||
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`
|
||||||
|
|
@ -500,11 +380,12 @@ export default {
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.reading-task{
|
.reading-task {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
::v-deep.search {
|
|
||||||
padding: 0px !important;
|
::v-deep.search {
|
||||||
}
|
padding: 0px !important;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue