Compare commits
2 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
4c642cd814 | |
|
|
9dcbad7616 |
|
|
@ -4523,3 +4523,23 @@ 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,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -955,7 +955,7 @@ export default {
|
||||||
var instanceItem = instanceList.find(function (item) {
|
var instanceItem = instanceList.find(function (item) {
|
||||||
return item.instanceUid === instanceUid
|
return item.instanceUid === instanceUid
|
||||||
})
|
})
|
||||||
if (!instanceItem) {
|
if (!false) {
|
||||||
var date = data.string('x00080023')
|
var date = data.string('x00080023')
|
||||||
var time = data.string('x00080033')
|
var time = data.string('x00080033')
|
||||||
var instanceTime = ''
|
var instanceTime = ''
|
||||||
|
|
@ -1251,58 +1251,60 @@ 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) {
|
// }
|
||||||
instanceList.push({
|
// else if (o.myPath) {
|
||||||
studyInstanceUid: dicomInfo.studyUid,
|
// instanceList.push({
|
||||||
seriesInstanceUid: v.seriesUid,
|
// studyInstanceUid: dicomInfo.studyUid,
|
||||||
SOPClassUID: o.SOPClassUID,
|
// seriesInstanceUid: v.seriesUid,
|
||||||
TransferSytaxUID: o.TransferSytaxUID,
|
// SOPClassUID: o.SOPClassUID,
|
||||||
MediaStorageSOPInstanceUID:
|
// TransferSytaxUID: o.TransferSytaxUID,
|
||||||
o.MediaStorageSOPInstanceUID,
|
// MediaStorageSOPInstanceUID:
|
||||||
MediaStorageSOPClassUID:
|
// o.MediaStorageSOPInstanceUID,
|
||||||
o.MediaStorageSOPClassUID,
|
// MediaStorageSOPClassUID:
|
||||||
sopInstanceUid: o.instanceUid,
|
// o.MediaStorageSOPClassUID,
|
||||||
instanceNumber: o.instanceNumber,
|
// sopInstanceUid: o.instanceUid,
|
||||||
instanceTime: o.instanceTime,
|
// instanceNumber: o.instanceNumber,
|
||||||
imageRows: o.imageRows,
|
// instanceTime: o.instanceTime,
|
||||||
imageColumns: o.imageColumns,
|
// imageRows: o.imageRows,
|
||||||
sliceLocation: o.sliceLocation,
|
// imageColumns: o.imageColumns,
|
||||||
sliceThickness: o.sliceThickness,
|
// sliceLocation: o.sliceLocation,
|
||||||
numberOfFrames: o.numberOfFrames,
|
// sliceThickness: o.sliceThickness,
|
||||||
pixelSpacing: o.pixelSpacing,
|
// numberOfFrames: o.numberOfFrames,
|
||||||
imagerPixelSpacing: o.imagerPixelSpacing,
|
// pixelSpacing: o.pixelSpacing,
|
||||||
frameOfReferenceUID: o.frameOfReferenceUID,
|
// imagerPixelSpacing: o.imagerPixelSpacing,
|
||||||
windowCenter: o.windowCenter,
|
// frameOfReferenceUID: o.frameOfReferenceUID,
|
||||||
windowWidth: o.windowWidth,
|
// windowCenter: o.windowCenter,
|
||||||
path: o.myPath,
|
// windowWidth: o.windowWidth,
|
||||||
FileSize: o.FileSize,
|
// path: o.myPath,
|
||||||
|
// 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(
|
||||||
|
|
@ -1443,7 +1445,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)
|
||||||
|
|
|
||||||
|
|
@ -309,9 +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="
|
<el-tooltip
|
||||||
trialCriterion.ImageUploadEnum > 0 && currentReadingTaskState < 2
|
v-if="trialCriterion.ImageUploadEnum > 0"
|
||||||
" v-hasPermi="['role:ir']" class="item" effect="dark" :content="$t('trials:reading:button:upload')"
|
class="item" effect="dark"
|
||||||
|
:content="$t('trials:reading:button:upload')"
|
||||||
placement="bottom">
|
placement="bottom">
|
||||||
<div class="tool-wrapper">
|
<div class="tool-wrapper">
|
||||||
<div class="icon" @click.prevent="openUploadImage('upload')">
|
<div class="icon" @click.prevent="openUploadImage('upload')">
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,7 @@ export default {
|
||||||
immediate: true,
|
immediate: true,
|
||||||
handler(val) {
|
handler(val) {
|
||||||
if (val) {
|
if (val) {
|
||||||
this.readingTaskState = val
|
this.readingTaskState = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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 = this.visitTaskList[i].ReadingTaskState
|
this.readingTaskState = 1
|
||||||
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 = 2
|
this.readingTaskState = 1
|
||||||
store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 2 })
|
store.dispatch('reading/setVisitTaskReadingTaskState', { visitTaskId: this.visitTaskId, readingTaskState: 1 })
|
||||||
DicomEvent.$emit('setReadingState', 2)
|
DicomEvent.$emit('setReadingState', 1)
|
||||||
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',
|
||||||
|
|
|
||||||
|
|
@ -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" :disabled="readingTaskState >= 2">
|
<el-form v-if="isRender" ref="questions" size="small" :model="questionForm">
|
||||||
<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 = res.OtherInfo.ReadingTaskState
|
this.readingTaskState = 1
|
||||||
DicomEvent.$emit('setReadingState', res.OtherInfo.ReadingTaskState)
|
DicomEvent.$emit('setReadingState', 1)
|
||||||
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') {
|
||||||
|
|
|
||||||
|
|
@ -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 && readingTaskState < 2" v-hasPermi="['role:ir']">
|
v-if="trialCriterion.ImageUploadEnum > 0" 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" />
|
||||||
|
|
|
||||||
|
|
@ -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="readingTaskState" :criterion-id="criterionId" :calculation-list="calculationList"
|
:reading-task-state="1" :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 v-if="readingTaskState < 2">
|
<el-form-item>
|
||||||
<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' }" /> -->
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,142 @@
|
||||||
|
<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>
|
||||||
|
|
@ -0,0 +1,136 @@
|
||||||
|
<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,6 +194,9 @@
|
||||||
<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>
|
||||||
|
|
@ -622,6 +625,20 @@
|
||||||
<!-- :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>
|
||||||
|
|
@ -630,11 +647,12 @@
|
||||||
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'
|
||||||
|
|
@ -670,7 +688,7 @@ const searchDataDefault = () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export default {
|
export default {
|
||||||
components: { BaseContainer, Pagination, BaseModel },
|
components: { BaseContainer, Pagination, JsonEditor, BaseModel },
|
||||||
dicts: ['OptType', 'ModuleType', 'ChildrenType'],
|
dicts: ['OptType', 'ModuleType', 'ChildrenType'],
|
||||||
data() {
|
data() {
|
||||||
|
|
||||||
|
|
@ -708,7 +726,10 @@ export default {
|
||||||
imagesList: [],
|
imagesList: [],
|
||||||
moduleTypeList: [],
|
moduleTypeList: [],
|
||||||
list2_total: 0,
|
list2_total: 0,
|
||||||
list2_searchData: {}
|
list2_searchData: {},
|
||||||
|
editDialogVisible: false,
|
||||||
|
jsonData: null,
|
||||||
|
editRow: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
|
@ -1346,7 +1367,12 @@ export default {
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
})
|
})
|
||||||
}
|
},
|
||||||
|
edit(row) {
|
||||||
|
this.editRow = Object.assign({}, row)
|
||||||
|
this.editDialogVisible = true
|
||||||
|
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -1144,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 (!instanceItem) {
|
if (!false) {
|
||||||
var date = data.string('x00080023')
|
var date = data.string('x00080023')
|
||||||
var time = data.string('x00080033')
|
var time = data.string('x00080033')
|
||||||
var instanceTime = ''
|
var instanceTime = ''
|
||||||
|
|
@ -1572,58 +1572,60 @@ 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) {
|
// }
|
||||||
instanceList.push({
|
// else if (o.myPath) {
|
||||||
studyInstanceUid: dicomInfo.studyUid,
|
// instanceList.push({
|
||||||
seriesInstanceUid: v.seriesUid,
|
// studyInstanceUid: dicomInfo.studyUid,
|
||||||
SOPClassUID: o.SOPClassUID,
|
// seriesInstanceUid: v.seriesUid,
|
||||||
TransferSytaxUID: o.TransferSytaxUID,
|
// SOPClassUID: o.SOPClassUID,
|
||||||
MediaStorageSOPInstanceUID:
|
// TransferSytaxUID: o.TransferSytaxUID,
|
||||||
o.MediaStorageSOPInstanceUID,
|
// MediaStorageSOPInstanceUID:
|
||||||
MediaStorageSOPClassUID:
|
// o.MediaStorageSOPInstanceUID,
|
||||||
o.MediaStorageSOPClassUID,
|
// MediaStorageSOPClassUID:
|
||||||
sopInstanceUid: o.instanceUid,
|
// o.MediaStorageSOPClassUID,
|
||||||
instanceNumber: o.instanceNumber,
|
// sopInstanceUid: o.instanceUid,
|
||||||
instanceTime: o.instanceTime,
|
// instanceNumber: o.instanceNumber,
|
||||||
imageRows: o.imageRows,
|
// instanceTime: o.instanceTime,
|
||||||
imageColumns: o.imageColumns,
|
// imageRows: o.imageRows,
|
||||||
sliceLocation: o.sliceLocation,
|
// imageColumns: o.imageColumns,
|
||||||
sliceThickness: o.sliceThickness,
|
// sliceLocation: o.sliceLocation,
|
||||||
numberOfFrames: o.numberOfFrames,
|
// sliceThickness: o.sliceThickness,
|
||||||
pixelSpacing: o.pixelSpacing,
|
// numberOfFrames: o.numberOfFrames,
|
||||||
imagerPixelSpacing: o.imagerPixelSpacing,
|
// pixelSpacing: o.pixelSpacing,
|
||||||
frameOfReferenceUID: o.frameOfReferenceUID,
|
// imagerPixelSpacing: o.imagerPixelSpacing,
|
||||||
windowCenter: o.windowCenter,
|
// frameOfReferenceUID: o.frameOfReferenceUID,
|
||||||
windowWidth: o.windowWidth,
|
// windowCenter: o.windowCenter,
|
||||||
path: o.myPath,
|
// windowWidth: o.windowWidth,
|
||||||
FileSize: o.FileSize,
|
// path: o.myPath,
|
||||||
|
// 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(
|
||||||
|
|
@ -1761,7 +1763,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)
|
||||||
|
|
|
||||||
|
|
@ -300,19 +300,7 @@
|
||||||
<!-- 审核完成时间 -->
|
<!-- 审核完成时间 -->
|
||||||
<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 v-if="
|
<el-table-column :label="$t('common:action:action')" width="250" fixed="right">
|
||||||
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 ||
|
||||||
|
|
@ -320,10 +308,8 @@
|
||||||
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" v-hasPermi="['trials:trials-panel:visit:crc-upload:upload2']" :disabled="!isOCTorIVUS && (scope.row.SubmitState * 1 === 2 ||
|
<el-button icon="el-icon-upload2"
|
||||||
scope.row.VisitExecuted === 2 ||
|
circle :title="$t('trials:crcUpload:action:upload')" @click="CRChandleUpload2(scope.row)" />
|
||||||
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 ||
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue