irc_web/.svn/pristine/f3/f3921b9c64de9f0fbf71e24584a...

1109 lines
45 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-form
v-if="isRender"
ref="measurementForm"
v-loading="loading"
:model="questionForm"
size="mini"
class="measurement-form"
>
<div class="base-dialog-body">
<div style="display: flex;justify-content: space-between;">
<h3 v-if="questionName" style="color: #ddd;padding: 5px 0px;margin: 0;">
{{ lesionName }}
</h3>
<!-- 关闭 -->
<div>
<i class="el-icon-circle-close" style="font-size: 25px;cursor: pointer;" @click="handleClose" />
</div>
</div>
<el-form-item
:label="$t('trials:reading:title:lesionType')"
prop="LesionType"
:rules="[
{ required:true,message: $t('common:ruleMessage:select'), trigger: ['blur']},
]"
>
<!-- 下拉框 -->
<el-select
v-model="questionForm.LesionType"
filterable
:disabled="!isCurrentTask || readingTaskState>=2 || !isBaseLineTask"
@change="((val)=>{lesionTypeChange(val)})"
>
<el-option
v-for="item of $d.LesionType"
v-show="!(isBaseLineTask && item.value === 2)"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</el-select>
</el-form-item>
<el-form-item
v-for="qs in questions"
v-show="qs.ShowQuestion!==2"
:key="qs.Id"
:label="`${qs.QuestionName}`"
:prop="qs.Id"
:rules="[
{ required: (qs.IsRequired === 0 || (qs.IsRequired ===1 && qs.RelevanceId && (questionForm[qs.RelevanceId] === qs.RelevanceValue)) || (qs.QuestionMark === 6 && questionForm.IsCanEditPosition === true) || (questionForm.IsCanEditPosition && qs.QuestionMark === 10)) && qs.Type!=='group' && qs.Type!=='summary',
message:['radio', 'select', 'checkbox'].includes(qs.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur','change']},
]"
>
<!-- 输入框 -->
<template v-if="qs.Type==='input' || qs.Type==='number'">
<el-input
v-if="qs.Type==='input' || qs.Type==='number'"
v-model="questionForm[qs.Id]"
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName) && lesionType !== 2) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || !!answers.SplitOrMergeLesionName))"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="(qs.QuestionMark===0 || qs.QuestionMark===1) && qs.Unit" slot="append">
{{ $fd('ValueUnit', parseInt(qs.Unit)) }}
</template>
</el-input>
</template>
<!-- 多行文本输入框 -->
<el-input
v-if="qs.Type==='textarea'"
v-model="questionForm[qs.Id]"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!isCurrentTask || readingTaskState>=2"
@change="((val)=>{formItemChange(val, qs)})"
/>
<!-- 下拉框 -->
<el-select
v-if="qs.Type==='select'"
v-model="questionForm[qs.Id]"
filterable
:placeholder="qs.QuestionMark === 8 ? $t('common:placeholder:selectorsearch') : $t('common:placeholder:select')"
:disabled="!isCurrentTask || readingTaskState>=2 || qs.QuestionMark === 0 || qs.QuestionMark === 1 || qs.QuestionMark === 2 || qs.QuestionMark === 5 || (qs.QuestionMark === 6 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))|| (qs.QuestionMark === 8 && (isCurrentTaskAdd === 'False'|| !!answers.SplitOrMergeLesionName)) || (qs.QuestionMark === 10 && (isCurrentTaskAdd === 'False' || (isCurrentTaskAdd === 'True' && !questionForm.IsCanEditPosition) || !!answers.SplitOrMergeLesionName))"
@change="((val)=>{formItemChange(val, qs)})"
>
<template v-if="qs.QuestionMark === 8" #prefix>
<span style="padding-left: 5px;">
<i class="el-icon-search" />
</span>
</template>
<template v-if="qs.TableQuestionType === 1">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[qs.DataTableColumn]"
:value="item[qs.DataTableColumn]"
/>
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && isBaseLineTask">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="(lesionType === 0 && item.value ===0) || (lesionType === 1 && (item.value ===0))"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark === 7 && !isBaseLineTask">
<template v-if="isCurrentTaskAdd=== 'True' && lesionType === 2">
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-show="item.value === 0 || item.value === 1"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template>
<el-option
v-for="item of $d[qs.DictionaryCode]"
v-else
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template>
<template v-else-if="qs.DictionaryCode && qs.QuestionMark !== 7">
<el-option
v-for="item of $d[qs.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template>
<template v-else>
<el-option
v-for="val in qs.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
/>
</template>
</el-select>
<!-- 单选 -->
<el-radio-group
v-if="qs.Type==='radio'"
v-model="questionForm[qs.id]"
:disabled="!isCurrentTask || readingTaskState>=2"
>
<el-radio
v-for="val in qs.options.split('|')"
:key="val"
:label="val"
>
{{ val }}
</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div
v-if="isCurrentTask && readingTaskState<2"
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<!-- 清除标记 -->
<el-button
v-if="questionForm.MeasureData"
size="mini"
@click="handleDeleteMeasureData"
>
{{ $t('trials:reading:button:removeMark') }}
</el-button>
<!-- 删除 -->
<el-button
v-if="isCurrentTaskAdd !== 'False'"
size="mini"
@click="handleDelete"
>
{{ $t('common:button:delete') }}
</el-button>
<!-- 保存 -->
<el-button
size="mini"
@click="handleSave"
>
{{ $t('common:button:save') }}
</el-button>
</div>
</el-form>
</template>
<script>
import { submitTableQuestion, deleteReadingRowAnswer } from '@/api/trials'
import { uploadPrintscreen } from '@/api/reading'
import DicomEvent from './../DicomEvent'
import store from '@/store'
export default {
name: 'MeasurementForm',
props: {
questions: {
type: Array,
default() { return [] }
},
answers: {
type: Object,
default() { return {} }
},
lesionType: {
type: Number,
required: true
},
visitTaskId: {
type: String,
required: true
},
parentQsId: {
type: String,
required: true
},
isCurrentTask: {
type: Boolean,
required: true
},
readingTaskState: {
type: Number,
required: true
},
isBaseLineTask: {
type: Boolean,
required: true
},
orderMark: {
type: String,
default: ''
},
questionName: {
type: String,
required: true
},
rowIndex: {
type: String,
required: true
},
tableQuestions: {
type: Array,
default() { return [] }
}
},
data() {
return {
questionForm: {},
loading: false,
trialId: '',
organList: [],
originalQuestionForm: {},
isRender: false,
toolType: '',
lesionName: '',
isCurrentTaskAdd: 'False',
splitOrMergeLesionName: '',
lesionMark: '',
deleteInfo: null,
pictureBaseStr: ''
}
},
mounted() {
this.trialId = this.$route.query.trialId
this.initForm()
},
methods: {
async initForm() {
const loading = this.$loading({ fullscreen: true })
this.questions.forEach(item => {
var val = this.answers[item.Id]
if (item.DictionaryCode) {
val = this.answers[item.Id] ? Number(this.answers[item.Id]) : ''
}
if (this.isBaseLineTask && item.QuestionMark === 7 && this.lesionType === 0) {
val = 0
}
if (this.isBaseLineTask && item.QuestionMark === 7 && this.lesionType === 1) {
val = 0
}
this.$set(this.questionForm, item.Id, val)
})
this.$set(this.questionForm, 'MeasureData', this.answers.MeasureData ? JSON.parse(this.answers.MeasureData) : '')
this.$set(this.questionForm, 'RowIndex', this.answers.RowIndex ? this.answers.RowIndex : '')
this.$set(this.questionForm, 'RowId', this.answers.RowId ? this.answers.RowId : '')
this.$set(this.questionForm, 'OrganInfoId', this.answers.OrganInfoId ? this.answers.OrganInfoId : '')
// saveTypeEnum 0未保存过新建病灶1已保存信息不完整随访初始化病灶/分裂病灶通过状态判断2已保存信息完整
var lesionState = this.getQuestionVal(7)
if (this.questionForm.RowId) {
this.$set(this.questionForm, 'saveTypeEnum', isNaN(parseInt(lesionState)) ? 1 : 2)
} else {
this.$set(this.questionForm, 'saveTypeEnum', 0)
}
this.$set(this.questionForm, 'IsCanEditPosition', this.answers.IsCanEditPosition === 'True')
this.$set(this.questionForm, 'IsDicomReading', this.answers.IsDicomReading !== 'False')
this.toolType = this.questionForm.MeasureData ? this.questionForm.MeasureData.type : ''
if (!this.questionForm.LesionType) {
this.$set(this.questionForm, 'LesionType', this.lesionType)
}
this.originalQuestionForm = { ...this.questionForm }
// this.lesionType === 0 && this.questionForm.MeasureData
if (this.answers.measureObj) {
await this.setMeasureData(this.answers.measureObj, true)
} else {
this.organList = []
await this.getOrganInfoList()
}
this.lesionName = this.getLesionInfo(this.orderMark, this.rowIndex)
this.isCurrentTaskAdd = this.answers.IsCurrentTaskAdd ? this.answers.IsCurrentTaskAdd : 'True'
this.lesionMark = this.getLesionName(this.orderMark, this.questionForm.RowIndex)
this.isRender = true
loading.close()
},
getLesionName(orderMark, rowIndex) {
var lessionName = ''
var rowIndexArr = rowIndex.split('.')
var x = parseInt(rowIndexArr[0])
var y = parseInt(rowIndexArr[1])
if (y > 0) {
y = String.fromCharCode(parseInt(rowIndexArr[1]) - 1 + 65 + 32)
lessionName = `${orderMark}${String(x).padStart(2, '0')}${y}`
} else {
lessionName = `${orderMark}${String(x).padStart(2, '0')}`
}
return lessionName
},
getLesionInfo(orderMark, rowIndex) {
var arr = []
var lessionName = ''
var rowIndexArr = rowIndex.split('.')
var x = parseInt(rowIndexArr[0])
var y = parseInt(rowIndexArr[1])
if (y > 0) {
y = String.fromCharCode(parseInt(rowIndexArr[1]) - 1 + 65 + 32)
lessionName = `${orderMark}${String(x).padStart(2, '0')}${y}`
arr.push(lessionName)
} else {
lessionName = `${orderMark}${String(x).padStart(2, '0')}`
arr.push(lessionName)
}
if (this.answers.SplitOrMergeLesionName && parseInt(this.answers.SplitOrMergeType) === 0) {
arr.push(`(Split from ${this.answers.SplitOrMergeLesionName})`)
}
return arr.join(' ')
},
getQuestionId(questionMark) {
var idx = this.questions.findIndex(i => i.QuestionMark === questionMark)
if (idx > -1) {
return this.questions[idx].Id
} else {
return ''
}
},
handleLocation() {
DicomEvent.$emit('imageLocation', this.questionForm)
},
getOrganInfoList() {
return new Promise(async resolve => {
if (!sessionStorage.getItem('organList')) {
await store.dispatch('reading/getOrganInfo', this.visitTaskId)
}
var organList = sessionStorage.getItem('organList') ? JSON.parse(sessionStorage.getItem('organList')) : []
var idx = organList.findIndex(i => i.LesionType === this.lesionType)
if (idx > -1) {
organList = organList[idx].OrganList
this.organList = organList.filter((item) => item.IsLymphNodes === 0)
}
resolve()
})
},
async lesionTypeChange(v) {
this.$emit('determineExistsUnsavedLession', async val => {
if (val) {
// 基线时靶病灶只能用直径和长短径标注非dicom文件的标注不能作为靶病灶
//
if ((this.isBaseLineTask || this.questionForm.IsDicomReading === false) && this.questionForm.MeasureData && this.questionForm.MeasureData.type === 'ArrowAnnotate' && v === 0) {
// 当前病灶不允许设置为靶病灶
this.$confirm(this.$t(' trials:reading:warnning:msg15'), {
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => {})
.catch(() => {})
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
}
// 判断是否超过该病灶类型个数的最大值
var idx = this.tableQuestions.findIndex(item => item.LesionType === v)
if (idx > -1 && !!this.tableQuestions[idx].MaxQuestionCount && this.tableQuestions[idx].MaxQuestionCount <= this.tableQuestions[idx].TableQuestions.Answers.length) {
let msg = this.$t('trials:reading:warnning:msg14')
msg = msg.replace('xxx', this.tableQuestions[idx].MaxQuestionCount)
this.$confirm(msg, {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
return
}
var arr = []
this.questionForm[this.getQuestionId(8)] = ''
this.questionForm[this.getQuestionId(5)] = ''
this.questionForm[this.getQuestionId(4)] = ''
this.questionForm[this.getQuestionId(6)] = ''
this.questionForm[this.getQuestionId(2)] = ''
this.questions.forEach(item => {
item.Answer = this.questionForm[item.Id] ? this.questionForm[item.Id] : ''
arr.push(item)
})
var obj = { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionType: this.lesionType }
DicomEvent.$emit('imageLocation', obj)
var type = null
if (this.questionForm.RowId) {
type = 1
} else {
type = 0
}
DicomEvent.$emit('changeLesionType', { questionForm: arr, oldLesionType: this.lesionType, newLesionType: v, rowIndex: this.questionForm.RowIndex, questionId: this.parentQsId, measureData: this.questionForm.MeasureData, type, rowId: this.questionForm.RowId })
} else {
this.$set(this.questionForm, 'LesionType', this.originalQuestionForm.LesionType)
}
})
},
deleteLesionInfo() {
return new Promise((resolve, reject) => {
const loading = this.$loading({ fullscreen: true })
var param = {
visitTaskId: this.visitTaskId,
questionId: this.parentQsId,
rowId: this.questionForm.RowId
}
deleteReadingRowAnswer(param)
.then(async res => {
if (res.IsSuccess) {
DicomEvent.$emit('getReportInfo', true)
}
loading.close()
resolve()
}).catch(() => {
loading.close()
reject()
})
})
},
async formItemChange(v, question) {
if (question.QuestionMark === 8 && question.RelationQuestions.length > 0) {
// 当选择部位时,联动器官、位置、是否淋巴结问题答案
var index = this.organList.findIndex(item => item[question.DataTableColumn] === v)
if (index > -1) {
var selected = this.organList[index]
question.RelationQuestions.map(qs => {
var val = selected[qs.DataTableColumn]
this.$set(this.questionForm, qs.Id, val)
})
this.$set(this.questionForm, 'OrganInfoId', selected.OrganInfoId)
this.$set(this.questionForm, 'IsCanEditPosition', selected['IsCanEditPosition'])
} else {
question.RelationQuestions.map(qs => {
this.$set(this.questionForm, qs.Id, '')
})
}
}
// saveTypeEnum 0未保存过新建病灶1已保存信息不完整随访初始化病灶/分裂病灶通过状态判断2已保存信息完整
if (this.questionForm.RowId) {
this.$set(this.questionForm, 'saveTypeEnum', 1)
} else {
this.$set(this.questionForm, 'saveTypeEnum', 0)
}
const lesionPart = this.getQuestionVal(8)
const lesionOrgan = this.getQuestionVal(6)
const lesionLength = !isNaN(parseInt(this.getQuestionVal(0))) ? this.getQuestionVal(0) : ''
const lesionState = !isNaN(parseInt(this.getQuestionVal(7))) ? parseInt(this.getQuestionVal(7)) : ''
this.$emit('resetQuestions', { isLymphLesion: 0, lesionPart, lesionOrgan, lesionState, saveTypeEnum: this.questionForm.saveTypeEnum, lesionLength, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
if (question.QuestionMark === 7) {
var status = ''
if (this.lesionType === 0 && lesionState === 1) {
status = 'T'
}
if ((this.lesionType === 0 && lesionState === 3) || (this.lesionType === 1 && lesionState === 3) || (this.lesionType === 2 && lesionState === 3)) {
status = 'D'
}
if (this.questionForm.measureData) {
this.questionForm.measureData.status = status
}
await store.dispatch('reading/updateMeasureDataStatus', { visitTaskId: this.visitTaskId, rowIndex: this.rowIndex, questionId: this.parentQsId, status })
DicomEvent.$emit('getMeasureData')
}
},
setMeasureData(measureData, isInit = false) {
return new Promise(resolve => {
if (measureData) {
if (measureData.pictureBaseStr) {
this.pictureBaseStr = measureData.pictureBaseStr
measureData.pictureBaseStr = ''
}
// 获取长径(0)
var lengthObj = this.questions.find(i => i.QuestionMark === 0)
if (measureData.type === 'Length') {
var length = measureData.data.length
this.$set(this.questionForm, lengthObj.Id, length)
} else if (measureData.type === 'ArrowAnnotate') {
this.$set(this.questionForm, lengthObj.Id, '')
}
var data = {}
if (measureData.isDicomReading === false) {
this.$set(this.questionForm, 'IsDicomReading', false)
data = {
Id: '',
IsDicomReading: false,
StudyId: measureData.studyId,
InstanceId: measureData.instanceId,
SeriesId: measureData.seriesId,
MeasureData: measureData,
QuestionId: this.parentQsId,
RowIndex: this.questionForm.RowIndex,
RowId: this.questionForm.RowId,
VisitTaskId: this.visitTaskId
}
measureData.data.uuid = `${measureData.instanceId}-${measureData.data.remark}`
} else {
this.$set(this.questionForm, 'IsDicomReading', true)
// 设置默认值
// 状态为空时,靶病灶长径>0mm自动给“存在”状态
var lesionLength = !isNaN(parseInt(this.getQuestionVal(0))) ? this.getQuestionVal(0) : ''
if (!this.isBaseLineTask && this.lesionType === 0 && lesionLength > 0) {
const stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, 0)
}
// 基线时,默认状态都为存在
if (this.isBaseLineTask && !lesionState) {
const stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, 0)
}
const lesionState = !isNaN(parseInt(this.getQuestionVal(7))) ? parseInt(this.getQuestionVal(7)) : ''
var status = ''
if (lesionState) {
if (this.lesionType === 0 && lesionState === 1) {
status = 'T'
}
if ((this.lesionType === 0 && lesionState === 3) || (this.lesionType === 1 && lesionState === 3) || (this.lesionType === 2 && lesionState === 3)) {
status = 'D'
}
}
measureData.data.status = status
measureData.data.remark = this.getLesionName(this.orderMark, this.questionForm.RowIndex)
data = {
Id: '',
IsDicomReading: true,
StudyId: measureData.studyId,
InstanceId: measureData.instanceId,
SeriesId: measureData.seriesId,
MeasureData: measureData,
QuestionId: this.parentQsId,
RowIndex: this.questionForm.RowIndex,
RowId: this.questionForm.RowId,
VisitTaskId: this.visitTaskId,
frame: isNaN(parseInt(measureData.frame)) ? 0 : measureData.frame
}
}
// Store.$emit('addTemporaryMeasuredData', data)
store.dispatch('reading/addMeasuredData', { visitTaskId: this.visitTaskId, data: data })
if (!this.questionForm.IsDicomReading) {
DicomEvent.$emit('addNoneDicomMeasureData', measureData)
}
DicomEvent.$emit('getMeasureData', val => {
this.pictureBaseStr = val
})
}
if (!isInit) {
// saveTypeEnum 0未保存过新建病灶1已保存信息不完整随访初始化病灶/分裂病灶,通过状态判断)
if (this.questionForm.RowId) {
this.$set(this.questionForm, 'saveTypeEnum', 1)
} else {
this.$set(this.questionForm, 'saveTypeEnum', 0)
}
}
this.$set(this.questionForm, 'MeasureData', measureData)
const lesionPart = this.getQuestionVal(8)
const lesionOrgan = this.getQuestionVal(6)
const lesionL = !isNaN(parseInt(this.getQuestionVal(0))) ? this.getQuestionVal(0) : ''
var lesionState = !isNaN(parseInt(this.getQuestionVal(7))) ? parseInt(this.getQuestionVal(7)) : ''
this.$emit('resetQuestions', { isLymphLesion: 0, lesionPart, lesionOrgan, lesionLength: lesionL, lesionState, saveTypeEnum: this.questionForm.saveTypeEnum, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
this.toolType = measureData.type
resolve()
})
},
returnFloat(num) {
if (num) return
var value = Math.round(parseFloat(num) * 100) / 100
var s = value.toString().split('.')
if (s.length === 1) {
value = value.toString() + '.00'
return value
}
if (s.length > 1) {
if (s[1].length < 2) {
value = value.toString() + '0'
}
return value
}
},
getQuestionVal(questionMark) {
var idx = this.questions.findIndex(i => i.QuestionMark === questionMark)
if (idx > -1) {
var questionId = this.questions[idx].Id
return this.questionForm[questionId]
} else {
return ''
}
},
setDeleteInfo(deleteInfo) {
this.deleteInfo = deleteInfo
},
deleteOldLesion(questionId, rowId) {
return new Promise((resolve, reject) => {
var param = {
visitTaskId: this.visitTaskId,
questionId: questionId,
rowId: rowId
}
deleteReadingRowAnswer(param)
.then(async res => {
resolve()
}).catch(() => {
})
})
},
async uploadScreenshots(fileName, file) {
try {
file = this.convertBase64ToBlob(file)
const formData = new FormData()
formData.append('file', file)
const result = await uploadPrintscreen(formData, this.$route.query.subjectId)
result.url = result.Result.Path
// const result = await this.OSSclient.put(`${fileName}.png`, file)
return { isSuccess: true, result: result }
} catch (e) {
console.log(e)
return { isSuccess: false, result: e }
}
},
convertBase64ToBlob(imageEditorBase64) {
var base64Arr = imageEditorBase64.split(',')
var imgtype = ''
var base64String = ''
if (base64Arr.length > 1) {
// 如果是图片base64去掉头信息
base64String = base64Arr[1]
imgtype = base64Arr[0].substring(
base64Arr[0].indexOf(':') + 1,
base64Arr[0].indexOf(';')
)
}
// 将base64解码
var bytes = atob(base64String)
// var bytes = base64;
var bytesCode = new ArrayBuffer(bytes.length)
// 转换为类型化数组
var byteArray = new Uint8Array(bytesCode)
// 将base64转换为ascii码
for (var i = 0; i < bytes.length; i++) {
byteArray[i] = bytes.charCodeAt(i)
}
// 生成Blob对象文件对象
return new Blob([bytesCode], { type: imgtype })
},
handleSave() {
this.$refs.measurementForm.validate(async valid => {
if (!valid) return
const loading = this.$loading({ fullscreen: true })
var measureData = this.questionForm.MeasureData
var lesionState = this.getQuestionVal(7)
var lesionLength = !isNaN(parseInt(this.getQuestionVal(0))) ? this.getQuestionVal(0) : ''
if (this.isBaseLineTask) {
// 基线
// 靶病灶且状态为存在0
if (this.lesionType === 0 && lesionState === 0) {
// 靶病灶 直径测量工具 长径须大于等于10mm且不小于2倍层厚
if (!(measureData && measureData.type === 'Length' && lesionLength >= 10 && (measureData.thick && lesionLength >= 2 * measureData.thick || !measureData.thick))) {
// 评估状态为存在的靶病灶需使用直径测量工具添加标记长径须大于10mm且不小于2倍层厚
this.$confirm('评估状态为存在的靶病灶需使用直径测量工具添加标记长径须大于10mm且不小于2倍层厚', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
// 非靶病灶且状态为存在0
if (this.lesionType === 1 && lesionState === 0) {
if (!(measureData && (measureData.type === 'Length' || measureData.type === 'RectangleRoi'))) {
// 评估状态为存在的非靶病灶需使用直径测量工具或矩形工具添加标记!
this.$confirm('评估状态为存在的非靶病灶需使用直径测量工具或矩形工具添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
} else {
// 非基线
// 靶病灶且状态为存在0
if (this.lesionType === 0 && lesionState === 0) {
if (!(measureData && measureData.type === 'Length')) {
// `评估状态为存在的靶病灶需使用直径测量工具添加标记!`
this.$confirm('评估状态为存在的靶病灶需使用直径测量工具添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
// 靶病灶且状态为太小1
if (this.lesionType === 0 && lesionState === 1) {
if (!(measureData && (measureData.type === 'ArrowAnnotate'))) {
// 评估状态为太小的靶病灶需使用箭头工具添加标记!
this.$confirm('评估状态为太小的靶病灶需使用箭头工具添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
} else if (measureData && measureData.type === 'ArrowAnnotate') {
const lengthId = this.getQuestionId(0)
this.$set(this.questionForm, lengthId, 5)
lesionLength = 5
}
}
// 靶病灶且状态为无法评估2
if (this.lesionType === 0 && lesionState === 2) {
if (measureData) {
// 状态为无法评估的靶病灶不需要添加标记!
this.$confirm('状态为无法评估的靶病灶不需要添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
// 靶病灶且状态为消失3
if (this.lesionType === 0 && lesionState === 3) {
if (!(measureData && measureData.type === 'ArrowAnnotate')) {
// 评估状态为消失的靶病灶只能使用箭头工具添加标记!
this.$confirm('评估状态为消失的靶病灶只能使用箭头工具添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
} else if (measureData && measureData.type === 'ArrowAnnotate') {
const lId = this.getQuestionId(0)
this.$set(this.questionForm, lId, 0)
lesionLength = 0
}
}
// 非靶病灶且状态为存在0
if (this.lesionType === 1 && lesionState === 0) {
if (!(measureData && (measureData.type === 'Length' || measureData.type === 'RectangleRoi'))) {
// 评估状态为存在的非靶病灶需使用直径测量工具或箭头工具添加标记!
this.$confirm('评估状态为存在的非靶病灶需使用直径测量工具或箭头工具添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
// 非靶病灶且状态为显著增大1
if (this.lesionType === 1 && lesionState === 1) {
if (!(measureData && (measureData.type === 'Length' || measureData.type === 'RectangleRoi'))) {
// 评估状态为显著增大的非靶病灶需使用直径测量工具或矩形工具添加标记!
this.$confirm('评估状态为显著增大的非靶病灶需使用直径测量工具或矩形工具添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
// 非靶病灶且状态为无法评估2
if (this.lesionType === 1 && lesionState === 2) {
if (measureData) {
// 评估状态为无法评估的非靶病灶不需要添加标记!
this.$confirm('评估状态为无法评估的非靶病灶不需要添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
// 非靶病灶且状态为消失3
if (this.lesionType === 1 && lesionState === 3) {
if (!(measureData && (measureData.type === 'ArrowAnnotate'))) {
// 评估状态为消失的非靶病灶需使用箭头工具添加标记!
this.$confirm('评估状态为消失的非靶病灶需使用箭头工具添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
// 新病灶且状态为存在0
if (this.lesionType === 2 && lesionState === 0) {
if (!(measureData && (measureData.type === 'Length' || measureData.type === 'ArrowAnnotate'))) {
// 评估状态为存在的新病灶需使用直径测量工具或箭头工具添加标记!
this.$confirm('评估状态为存在的新病灶需使用直径测量工具或箭头工具添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
// 新病灶且状态为疑似1
if (this.lesionType === 2 && lesionState === 1) {
if (!(measureData && (measureData.type === 'Length' || measureData.type === 'ArrowAnnotate'))) {
// `评估状态为疑似的新病灶需使用直径测量工具或箭头工具添加标记!`
this.$confirm('评估状态为疑似的新病灶需使用直径测量工具或箭头工具添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
// 新病灶且状态为无法评估2
if (this.lesionType === 2 && lesionState === 2) {
if (measureData) {
// 评估状态为无法评估的新病灶不需要添加标记!
this.$confirm('评估状态为无法评估的新病灶不需要添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
// 新病灶且状态为消失3
if (this.lesionType === 2 && lesionState === 3) {
if (!(measureData && (measureData.type === 'ArrowAnnotate'))) {
// 评估状态为消失的新病灶需使用箭头工具添加标记!
this.$confirm('评估状态为消失的新病灶需使用箭头工具添加标记!', {
type: 'warning',
showCancelButton: false,
callback: action => {}
})
loading.close()
return
}
}
}
DicomEvent.$emit('getScreenshots', async val => {
var picturePath = ''
if (val) {
var pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
picturePath = pictureObj.isSuccess ? pictureObj.result.url : ''
var answers = []
var reg = new RegExp(/^[0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{12}$/)
for (const k in this.questionForm) {
if (reg.test(k)) {
if (answers.findIndex(i => i.tableQuestionId === k) === -1) {
answers.push({ tableQuestionId: k, answer: this.questionForm[k] })
}
}
}
var params = {
questionId: this.parentQsId,
rowId: this.questionForm.RowId,
rowIndex: this.answers.RowIndex,
visitTaskId: this.visitTaskId,
trialId: this.trialId,
measureData: measureData ? JSON.stringify(measureData) : '',
answerList: answers,
isCanEditPosition: this.questionForm.IsCanEditPosition,
studyId: measureData ? this.questionForm.MeasureData.studyId : '',
seriesId: measureData ? this.questionForm.MeasureData.seriesId : '',
instanceId: measureData ? this.questionForm.MeasureData.instanceId : '',
numberOfFrames: measureData && !isNaN(parseInt(this.questionForm.MeasureData.frame)) ? parseInt(this.questionForm.MeasureData.frame) : 0,
picturePath: picturePath,
organInfoId: this.questionForm.OrganInfoId
}
if (this.questionForm.IsDicomReading === false) {
params.isDicomReading = false
}
if (this.deleteInfo) {
await this.deleteOldLesion(this.deleteInfo.questionId, this.deleteInfo.rowId)
this.deleteInfo = null
}
submitTableQuestion(params).then(async res => {
// 保存成功!
this.$message.success(this.$t('common:message:savedSuccessfully'))
// saveTypeEnum 0未保存过新建病灶1已保存信息不完整随访初始化病灶/分裂病灶通过状态判断2已保存信息完整
this.$set(this.questionForm, 'saveTypeEnum', 2)
this.originalQuestionForm = { ...this.questionForm }
loading.close()
var lesionOrgan = this.getQuestionVal(6)
this.$set(this.questionForm, 'RowId', res.Result.RowId)
const lesionPart = this.getQuestionVal(8)
const lesionState = Number(this.getQuestionVal(7))
this.$emit('resetQuestions', { isLymphLesion: 0, lesionPart, lesionOrgan, saveTypeEnum: this.questionForm.saveTypeEnum, lesionLength, lesionState, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
this.$emit('close')
DicomEvent.$emit('getReportInfo', true)
}).catch(() => { loading.close() })
}
})
})
},
handleDeleteMeasureData() {
// 是否确认清除标记?
this.$confirm(this.$t('trials:reading:warnning:msg47'), {
type: 'warning',
distinguishCancelAndClose: true
})
.then(async() => {
// 重置长短径 和 状态
var lengId = this.getQuestionId(0)
this.$set(this.questionForm, lengId, '')
var stateId = this.getQuestionId(7)
this.$set(this.questionForm, stateId, '')
// saveTypeEnum 0未保存过新建病灶1已保存信息不完整随访初始化病灶/分裂病灶,通过状态判断)
if (this.questionForm.RowId) {
this.$set(this.questionForm, 'saveTypeEnum', 1)
} else {
this.$set(this.questionForm, 'saveTypeEnum', 0)
}
await store.dispatch('reading/removeMeasuredData', { visitTaskId: this.visitTaskId, measureData: this.questionForm.MeasureData, questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex })
DicomEvent.$emit('getMeasureData')
const lesionPart = this.getQuestionVal(8)
const lesionOrgan = this.getQuestionVal(6)
const lesionLength = ''
const lesionState = !isNaN(parseInt(this.getQuestionVal(7))) ? parseInt(this.getQuestionVal(7)) : ''
if (!this.questionForm.IsDicomReading) {
DicomEvent.$emit('removeNoneDicomMeasureData', this.questionForm.MeasureData)
}
this.$set(this.questionForm, 'IsDicomReading', true)
this.$set(this.questionForm, 'MeasureData', '')
this.$emit('resetQuestions', { isLymphLesion: 0, lesionPart, lesionOrgan, lesionState, saveTypeEnum: this.questionForm.saveTypeEnum, lesionLength, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
})
.catch(() => {})
},
handleDelete() {
// 是否确认删除?
this.$confirm(this.$t('trials:reading:warnning:msg48'), {
type: 'warning',
distinguishCancelAndClose: true
})
.then(async() => {
if (this.questionForm.RowId) {
const loading = this.$loading({ fullscreen: true })
var param = {
visitTaskId: this.visitTaskId,
questionId: this.parentQsId,
rowId: this.questionForm.RowId
}
deleteReadingRowAnswer(param)
.then(async res => {
loading.close()
if (res.IsSuccess) {
if (this.questionForm.MeasureData) {
await store.dispatch('reading/removeMeasuredData', { visitTaskId: this.visitTaskId, measureData: this.questionForm.MeasureData, questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex })
}
if (!this.questionForm.IsDicomReading && this.questionForm.MeasureData) {
DicomEvent.$emit('removeNoneDicomMeasureData', this.questionForm.MeasureData)
}
this.$emit('close', { lesionType: this.lesionType, rowIndex: this.rowIndex, visitTaskId: this.visitTaskId })
DicomEvent.$emit('getReportInfo', true)
this.$message.success(this.$t('common:message:deletedSuccessfully'))
loading.close()
}
}).catch(() => { loading.close() })
} else {
if (!this.questionForm.IsDicomReading && this.questionForm.MeasureData) {
DicomEvent.$emit('removeNoneDicomMeasureData', this.questionForm.MeasureData)
}
this.$emit('close', { lesionType: this.lesionType, rowIndex: this.rowIndex, visitTaskId: this.visitTaskId })
}
})
},
handleClose() {
if (!this.questionForm.RowId) {
// '当前病灶为新建病灶,未保存。如果关闭窗口,将会删除病灶信息,是否继续?'
this.$confirm(this.$t('trials:reading:warnning:msg49'), {
type: 'warning',
distinguishCancelAndClose: true
})
.then(async() => {
// 移除新建病灶并关闭窗口
if (this.questionForm.MeasureData) {
await store.dispatch('reading/removeMeasuredData', { visitTaskId: this.visitTaskId, measureData: this.questionForm.MeasureData, questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex })
}
DicomEvent.$emit('getMeasureData')
this.$emit('close', { lesionType: this.lesionType, rowIndex: this.rowIndex, visitTaskId: this.visitTaskId })
})
.catch(() => {})
} else {
// saveTypeEnum 0未保存过新建病灶1已保存信息不完整随访初始化病灶/分裂病灶,通过状态判断)
if (this.questionForm.saveTypeEnum === 1) {
this.$emit('close')
} else {
this.$emit('close')
}
}
}
}
}
</script>
<style lang="scss" scoped>
.measurement-form{
>>>.el-form-item__label{
color: #c3c3c3;
}
>>>.el-input .el-input__inner{
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
>>>.el-form-item{
display: flex;
flex-direction: row;
justify-content: flex-start;
}
>>>.el-form-item__content{
flex: 1;
}
>>>.el-input.is-disabled .el-input__inner{
background-color: #646464a1;
}
>>>.el-select.is-disabled .el-input__inner{
background-color: #646464a1;
}
>>>.el-button--mini, .el-button--mini.is-round {
padding: 7px 10px;
}
.el-form-item__content
.el-select{
width: 100%;
}
.input-width1{
width: calc(100% -60px)!important;
}
.input-width2{
width: 100% !important;
}
}
</style>