Compare commits

...

9 Commits

12 changed files with 221 additions and 38 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "EICS", "name": "EICS",
"version": "1.0.0", "version": "1.3.2",
"scripts": { "scripts": {
"dev": "vue-cli-service serve --open", "dev": "vue-cli-service serve --open",
"build": "vue-cli-service build", "build": "vue-cli-service build",

View File

@ -124,7 +124,7 @@
IRC Imaging System IRC Imaging System
</p> </p>
<p style="margin-bottom: 20px"> <p style="margin-bottom: 20px">
V1.3.1.001 V1.3.2.001
</p> </p>
<p style="margin-bottom: 20px" v-if="language === 'zh'"> <p style="margin-bottom: 20px" v-if="language === 'zh'">
Copyright © {{ new Date().getFullYear() }} 上海展影医疗科技有限公司 版权所有 Copyright © {{ new Date().getFullYear() }} 上海展影医疗科技有限公司 版权所有

View File

@ -14,7 +14,7 @@
<!-- 临床数据 --> <!-- 临床数据 -->
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)"> <div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:clinicalData')" placement="bottom"> <el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:clinicalData')" placement="bottom">
<svg-icon icon-class="159" class="svg-icon" /> <svg-icon icon-class="documentation" class="svg-icon"/>
</el-tooltip> </el-tooltip>
</div> </div>
@ -222,7 +222,8 @@ export default {
visitTaskId: '', visitTaskId: '',
taskBlindName: '', taskBlindName: '',
frame: null, frame: null,
imageRendered: false imageRendered: false,
isExistsClinicalData:false
// preventCache: true // preventCache: true
}, },
dicomInfo: { dicomInfo: {
@ -1058,6 +1059,7 @@ export default {
this.stack.seriesIndex = dicomSeries.seriesIndex this.stack.seriesIndex = dicomSeries.seriesIndex
this.stack.sliceThickness = dicomSeries.sliceThickness this.stack.sliceThickness = dicomSeries.sliceThickness
this.stack.instanceCount = dicomSeries.instanceCount this.stack.instanceCount = dicomSeries.instanceCount
this.stack.isExistsClinicalData = dicomSeries.isExistsClinicalData
// this.measuredData = dicomSeries.measuredData // this.measuredData = dicomSeries.measuredData
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === dicomSeries.visitTaskId) var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === dicomSeries.visitTaskId)
this.stack.visitTaskNum = this.visitTaskList[idx].VisitTaskNum this.stack.visitTaskNum = this.visitTaskList[idx].VisitTaskNum

View File

@ -482,7 +482,7 @@ export default {
idx > -1 ? seriesInfo = seriesList[idx] : seriesInfo = seriesList[0] idx > -1 ? seriesInfo = seriesList[idx] : seriesInfo = seriesList[0]
} }
if (seriesInfo) { if (seriesInfo) {
const index = Math.floor(seriesInfo.imageIds.length * ((baseObj.series.imageIdIndex + 1) / baseObj.series.instanceCount)) const index = Math.floor(seriesInfo.imageIds.length * ((baseObj.series.imageIdIndex + 1) / baseObj.series.imageIds.length))
seriesInfo.imageIdIndex = index > 0 ? index - 1 : 0 seriesInfo.imageIdIndex = index > 0 ? index - 1 : 0
obj.studyIndex = seriesInfo.studyIndex obj.studyIndex = seriesInfo.studyIndex
obj.seriesIndex = seriesInfo.seriesIndex obj.seriesIndex = seriesInfo.seriesIndex

View File

@ -11,6 +11,13 @@
@mouseup="sliderMouseup" @mouseup="sliderMouseup"
@contextmenu.prevent="onContextmenu" @contextmenu.prevent="onContextmenu"
> >
<!-- 临床数据 -->
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:clinicalData')" placement="bottom">
<svg-icon icon-class="documentation" class="svg-icon"/>
</el-tooltip>
</div>
<!-- 切换访视 --> <!-- 切换访视 -->
<div <div
v-if="stack.imageRendered && isReadingTaskViewInOrder" v-if="stack.imageRendered && isReadingTaskViewInOrder"
@ -214,7 +221,8 @@ export default {
visitTaskId: '', visitTaskId: '',
taskBlindName: '', taskBlindName: '',
frame: null, frame: null,
imageRendered: false imageRendered: false,
isExistsClinicalData:false
// preventCache: true // preventCache: true
}, },
dicomInfo: { dicomInfo: {
@ -1042,6 +1050,7 @@ export default {
this.stack.seriesIndex = dicomSeries.seriesIndex this.stack.seriesIndex = dicomSeries.seriesIndex
this.stack.sliceThickness = dicomSeries.sliceThickness this.stack.sliceThickness = dicomSeries.sliceThickness
this.stack.instanceCount = dicomSeries.instanceCount this.stack.instanceCount = dicomSeries.instanceCount
this.stack.isExistsClinicalData = dicomSeries.isExistsClinicalData
// this.measuredData = dicomSeries.measuredData // this.measuredData = dicomSeries.measuredData
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === dicomSeries.visitTaskId) var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === dicomSeries.visitTaskId)
this.stack.visitTaskNum = this.visitTaskList[idx].VisitTaskNum this.stack.visitTaskNum = this.visitTaskList[idx].VisitTaskNum
@ -1920,6 +1929,12 @@ export default {
e.stopImmediatePropagation() e.stopImmediatePropagation()
e.stopPropagation() e.stopPropagation()
e.preventDefault() e.preventDefault()
},
handleViewCD(e) {
DicomEvent.$emit('previewCD', this.stack.visitTaskId)
e.stopImmediatePropagation()
e.stopPropagation()
e.preventDefault()
} }
} }
@ -2008,7 +2023,15 @@ export default {
font-size: 14px; font-size: 14px;
} }
} }
.info-cd{
position: absolute;
left: 10px;
top: 5px;
text-align: left;
color: #ddd;
font-size: 18px;
cursor: pointer;
}
.info-series { .info-series {
position: absolute; position: absolute;
left: 10px; left: 10px;

View File

@ -18,6 +18,11 @@
</div> </div>
<el-table <el-table
:data="questionForm[question.Id]"> :data="questionForm[question.Id]">
<el-table-column :label="$t('CustomizeQuestionFormItem:label:OrderMark')" width="60px" show-overflow-tooltip>
<template slot-scope="scope">
{{question.OrderMark}}{{scope.$index + 1}}
</template>
</el-table-column>
<el-table-column <el-table-column
:prop="item.Id" :prop="item.Id"
:label="item.QuestionName" :label="item.QuestionName"
@ -288,7 +293,7 @@
:visit-task-id="visitTaskId" :visit-task-id="visitTaskId"
:criterion-id="criterionId" :criterion-id="criterionId"
:type="addOrEdit.type" :type="addOrEdit.type"
:CalculationList="CalculationList" :CalculationList="CalculationTabelList"
@formItemTableNumberChange="formItemTableNumberChange" @formItemTableNumberChange="formItemTableNumberChange"
@setFormItemData="setFormItemData" @setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData" @resetFormItemData="resetFormItemData"
@ -368,7 +373,8 @@ export default {
loading: false, loading: false,
RowIndex: 0, RowIndex: 0,
RowId: null, RowId: null,
digitPlaces: 0 digitPlaces: 0,
CalculationTabelList: []
} }
}, },
watch: { watch: {
@ -411,7 +417,7 @@ export default {
} }
} }
if (this.question.Type === 'table') { if (this.question.Type === 'table') {
// this.getQuestionCalculateRelation() this.getQuestionCalculateRelation()
if (this.questionForm[this.question.Id]) { if (this.questionForm[this.question.Id]) {
this.QuestionsForm = {} this.QuestionsForm = {}
this.question.TableQuestions.Questions.forEach(v => { this.question.TableQuestions.Questions.forEach(v => {
@ -511,10 +517,9 @@ export default {
}, },
getQuestionCalculateRelation() { getQuestionCalculateRelation() {
getQuestionCalculateRelation({ getQuestionCalculateRelation({
TrialReadingCriterionId: this.criterionId,
ReadingQuestionId: this.question.Id ReadingQuestionId: this.question.Id
}).then(res => { }).then(res => {
this.CalculationList = res.Result this.CalculationTabelList = res.Result
}) })
}, },
save() { save() {

View File

@ -211,6 +211,12 @@ export default {
type: String, type: String,
required: true required: true
}, },
CalculationList: {
type: Array,
default() {
return []
}
},
readingTaskState: { readingTaskState: {
type: Number, type: Number,
required: true required: true
@ -248,14 +254,27 @@ export default {
digitPlaces: 0 digitPlaces: 0
} }
}, },
// watch: {
// questionForm: {
// deep: true,
// immediate: true,
// handler(v) {
//
// }
// }
// },
watch: { watch: {
questionForm: { questionForm: {
deep: true, deep: true,
immediate: true, immediate: true,
handler(v) { handler(v, oldv) {
try {
if (!v[this.question.Id] || !oldv[this.question.Id]) return
} catch (e) {
}
this.formItemNumberChange(this.question.Id, false)
} }
} },
}, },
mounted() { mounted() {
this.digitPlaces = localStorage.getItem('digitPlaces') ? parseInt(localStorage.getItem('digitPlaces')) : 0 this.digitPlaces = localStorage.getItem('digitPlaces') ? parseInt(localStorage.getItem('digitPlaces')) : 0
@ -323,8 +342,95 @@ export default {
} else { } else {
} }
}, },
logic(rules, num = 0) {
try {
if (rules.CalculateQuestionList.length === 0) {
return false
}
var count = 0
var maxList = [], minList = []
rules.CalculateQuestionList.forEach((o, i) => {
if (rules.CustomCalculateMark > 4) {
if (i !== 0) {
switch (rules.CustomCalculateMark) {
case 7:
count += parseFloat(this.questionForm[o.TableQuestionId])
if (i === rules.CalculateQuestionList.length - 1) {
num = count / rules.CalculateQuestionList.length
}
break;
case 8:
maxList.push(this.questionForm[o.TableQuestionId])
if (i === rules.CalculateQuestionList.length - 1) {
num = Math.max(...maxList)
}
break;
case 9:
minList.push(this.questionForm[o.TableQuestionId])
if (i === rules.CalculateQuestionList.length - 1) {
num = Math.min(...minList)
}
break;
}
} else {
maxList.push(this.questionForm[o.TableQuestionId])
minList.push(this.questionForm[o.TableQuestionId])
count = parseFloat(this.questionForm[o.TableQuestionId])
num = parseFloat(this.questionForm[o.TableQuestionId])
}
} else {
if (i !== 0) {
switch (rules.CustomCalculateMark) {
case 1:
num += parseFloat(this.questionForm[o.TableQuestionId])
break;
case 2:
num -= parseFloat(this.questionForm[o.TableQuestionId])
break;
case 3:
num *= parseFloat(this.questionForm[o.TableQuestionId])
break;
case 4:
if (parseFloat(this.questionForm[o.TableQuestionId]) === 0) {
num = 0
} else {
num /= parseFloat(this.questionForm[o.TableQuestionId])
}
break;
}
} else {
num = parseFloat(this.questionForm[o.TableQuestionId])
}
}
})
} catch (e) {
console.log(e)
}
var digitPlaces = parseInt(localStorage.getItem('digitPlaces'))
if (rules.ValueType === 2) {
num = num * 100
}
return num.toFixed(digitPlaces)
},
formItemNumberChange(v, question) { formItemNumberChange(v, question) {
this.$emit('formItemTableNumberChange', v, question) console.log(this.CalculationList)
this.CalculationList.forEach((v, i) => {
console.log('v', v)
var find = v.CalculateQuestionList.filter(o => {
return o.QuestionId === question.Id
})
console.log('find', find)
// findnumber
if (find) {
var num = this.logic(v)
console.log(num)
if (num !== false) {
this.$set(this.questionForm, v.QuestionId, num)
// this.$emit('setFormItemData', { key: v.QuestionId, val: num })
}
}
})
// this.$emit('formItemTableNumberChange', v, question)
}, },
resetChild(obj) { resetChild(obj) {
obj.forEach(i => { obj.forEach(i => {

View File

@ -476,7 +476,7 @@ export default {
idx > -1 ? seriesInfo = seriesList[idx] : seriesInfo = seriesList[0] idx > -1 ? seriesInfo = seriesList[idx] : seriesInfo = seriesList[0]
} }
if (seriesInfo) { if (seriesInfo) {
const index = Math.floor(seriesInfo.imageIds.length * ((baseObj.series.imageIdIndex + 1) / baseObj.series.instanceCount)) const index = Math.floor(seriesInfo.imageIds.length * ((baseObj.series.imageIdIndex + 1) / baseObj.series.imageIds.length))
seriesInfo.imageIdIndex = index > 0 ? index - 1 : 0 seriesInfo.imageIdIndex = index > 0 ? index - 1 : 0
obj.studyIndex = seriesInfo.studyIndex obj.studyIndex = seriesInfo.studyIndex
obj.seriesIndex = seriesInfo.seriesIndex obj.seriesIndex = seriesInfo.seriesIndex

View File

@ -447,8 +447,8 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-if="(form.QuestionGenre === 0 || form.QuestionGenre === null) && (form.Type === 'select' || form.Type === 'radio') && isFromSystem" v-if="(form.Type === 'select' || form.Type === 'radio') && isFromSystem"
:label="$t('trials:qcCfg:table:typeValue')" :label="$t('trials:readingUnit:qsList:title:defaultValue')"
> >
<el-select v-model="form.DefaultValue" clearable> <el-select v-model="form.DefaultValue" clearable>
<el-option <el-option
@ -459,6 +459,15 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item
v-if="(form.Type === 'number') && !isFromSystem"
:label="$t('trials:readingUnit:qsList:title:defaultValue')"
>
<el-input
:disabled="form.DataSource === 1"
v-model="form.DefaultValue"
/>
</el-form-item>
<!-- 分组 --> <!-- 分组 -->
<el-form-item <el-form-item
v-if="form.Type !== 'group'" v-if="form.Type !== 'group'"

View File

@ -69,6 +69,21 @@
v-model="form.IsCopy" v-model="form.IsCopy"
/> />
</el-form-item> </el-form-item>
<!-- 问题数据来源 -->
<el-form-item v-if="form.Type === 'number'" :label="$t('trials:readingUnit:qsList:title:dataSource')"
prop="DataSource">
<el-radio-group
v-model="form.DataSource"
>
<el-radio
v-for="item of $d.DataSource"
:key="`DataSource${item.value}`"
:label="item.value"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item <el-form-item
v-if="form.Type === 'number'" v-if="form.Type === 'number'"
:label="$t('trials:readingUnit:qsList:title:valueType')" :label="$t('trials:readingUnit:qsList:title:valueType')"
@ -135,14 +150,26 @@
style="line-height: 40px;" style="line-height: 40px;"
@change="(v) => CustomCalculateMarkChange(v)" @change="(v) => CustomCalculateMarkChange(v)"
> >
<el-radio <div>
v-for="item of $d.CustomCalculateMark" <el-radio
v-if="item.value <= 4" v-for="item of $d.CustomCalculateMark"
:key="`CustomCalculateMark${item.value}`" v-show="item.value <= 4"
:label="item.value" :key="`CustomCalculateMark${item.value}`"
> :label="item.value"
{{ item.label }} >
</el-radio> {{ item.label }}
</el-radio>
</div>
<div>
<el-radio
v-for="item of $d.CustomCalculateMark"
v-show="item.value > 6"
:key="`CustomCalculateMark${item.value}`"
:label="item.value"
>
{{ item.label }}
</el-radio>
</div>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-table <el-table
@ -174,16 +201,12 @@
min-width="180" min-width="180"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-select v-if="!scope.row.IsTable" v-model="scope.row.TableQuestionId" clearable> <el-select v-model="scope.row.TableQuestionId" clearable>
<el-option v-for="item of Questions" :key="item.QuestionId" :label="item.QuestionName" :value="item.QuestionId" /> <el-option v-for="item of Questions" :key="item.QuestionId" :label="item.QuestionName" :value="item.QuestionId" />
</el-select> </el-select>
<el-select v-if="scope.row.IsTable" v-model="scope.row.TableQuestionId" clearable>
<el-option v-for="item of !scope.row.QuestionId ? [] : tableQuestions.find(v => v.QuestionId === scope.row.QuestionId).TableQuestions" :key="item.QuestionId" :label="item.QuestionName" :value="item.QuestionId" />
</el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
v-if="form.CustomCalculateMark <= 4"
:label="$t('common:action:action')" :label="$t('common:action:action')"
prop="TableQuestionId" prop="TableQuestionId"
show-overflow-tooltip show-overflow-tooltip
@ -620,7 +643,20 @@ export default {
} }
} }
} }
// for (const k in this.form) {
// if (k === 'CalculateQuestions' && this.data[k] !== undefined) {
// console.log(this.data[k])
// this.form[k] = JSON.parse(this.data[k])
// console.log('CalculateQuestions', this.form[k])
// } else if (k === 'ClassifyAlgorithms' && this.data[k] !== undefined && this.data[k] !== '') {
// this.ClassifyAlgorithmsList = JSON.parse(this.data[k])
// console.log(11111, this.form)
// } else {
// if (this.data.hasOwnProperty(k)) {
// this.form[k] = this.data[k]
// }
// }
// }
if (this.form.ParentId) { if (this.form.ParentId) {
var index = this.parentOptions.findIndex(item => { var index = this.parentOptions.findIndex(item => {
return item.QuestionId === this.form.ParentId return item.QuestionId === this.form.ParentId

View File

@ -491,7 +491,7 @@
</el-tab-pane> </el-tab-pane>
<!-- 临床数据采集 --> <!-- 临床数据采集 -->
<el-tab-pane <el-tab-pane
v-if="rowData.IsBaseLine && otherInfo.ClinicalInformationTransmissionEnum > 0 && otherInfo.IsHaveSubjectClinicalData" v-if="rowData.IsBaseLine && (otherInfo.IsHaveSubjectClinicalData || otherInfo.IsHaveVisitClinicalData)"
:label="$t('trials:uploadClinicalData:tab:uploadClinicalData')" :label="$t('trials:uploadClinicalData:tab:uploadClinicalData')"
name="clinical-data" name="clinical-data"
> >
@ -499,7 +499,7 @@
</el-tab-pane> </el-tab-pane>
<!-- 临床数据采集2 --> <!-- 临床数据采集2 -->
<el-tab-pane <el-tab-pane
v-if="!rowData.IsBaseLine && otherInfo.ClinicalInformationTransmissionEnum > 0 && otherInfo.IsHaveVisitClinicalData" v-if="!rowData.IsBaseLine && otherInfo.IsHaveVisitClinicalData"
:label="$t('trials:uploadClinicalData:tab:uploadClinicalData')" :label="$t('trials:uploadClinicalData:tab:uploadClinicalData')"
name="clinical-data" name="clinical-data"
> >
@ -572,10 +572,11 @@
<UploadNonDicomFiles v-if="rowData.Id" :data="rowData" :subject-visit-id="rowData.Id" :body-parts="otherInfo.BodyPartTypes" :modalities="otherInfo.Modalitys" :allow-add-or-edit="false" @getList="getList"/> <UploadNonDicomFiles v-if="rowData.Id" :data="rowData" :subject-visit-id="rowData.Id" :body-parts="otherInfo.BodyPartTypes" :modalities="otherInfo.Modalitys" :allow-add-or-edit="false" @getList="getList"/>
</el-card> </el-card>
<!-- 临床数据 --> <!-- 临床数据 -->
<h4 v-if="rowData.IsBaseLine && otherInfo.ClinicalInformationTransmissionEnum > 0 && otherInfo.IsHaveSubjectClinicalData" class="box-title" style="margin-top:10px;"> <!-- 基线显示受试者级别和方式级别的临床数据 -->
<h4 v-if="rowData.IsBaseLine && otherInfo.ClinicalInformationTransmissionEnum > 0 && (otherInfo.IsHaveSubjectClinicalData || otherInfo.IsHaveVisitClinicalData)" class="box-title" style="margin-top:10px;">
{{ $t('trials:crcUpload:label:clinicalData') }} {{ $t('trials:crcUpload:label:clinicalData') }}
</h4> </h4>
<el-card v-if="rowData.IsBaseLine && otherInfo.ClinicalInformationTransmissionEnum > 0 && otherInfo.IsHaveSubjectClinicalData" class="box-card"> <el-card v-if="rowData.IsBaseLine && otherInfo.ClinicalInformationTransmissionEnum > 0 && (otherInfo.IsHaveSubjectClinicalData || otherInfo.IsHaveVisitClinicalData)" class="box-card">
<UploadClinicalData v-if="rowData.Id && rowData.IsBaseLine" :enum-type="otherInfo.ClinicalInformationTransmissionEnum" :allow-add-or-edit="false" :data="rowData" :subject-visit-id="rowData.Id" @getList="getList" /> <UploadClinicalData v-if="rowData.Id && rowData.IsBaseLine" :enum-type="otherInfo.ClinicalInformationTransmissionEnum" :allow-add-or-edit="false" :data="rowData" :subject-visit-id="rowData.Id" @getList="getList" />
</el-card> </el-card>
<h4 v-if="!rowData.IsBaseLine && otherInfo.ClinicalInformationTransmissionEnum > 0 && otherInfo.IsHaveVisitClinicalData" class="box-title" style="margin-top:10px;"> <h4 v-if="!rowData.IsBaseLine && otherInfo.ClinicalInformationTransmissionEnum > 0 && otherInfo.IsHaveVisitClinicalData" class="box-title" style="margin-top:10px;">

View File

@ -63,7 +63,8 @@ module.exports = {
// target: 'http://123.56.181.144:8000/api', // 国内测试环境 // target: 'http://123.56.181.144:8000/api', // 国内测试环境
// target: 'http://123.56.94.154:8079', // 国内测试环境2 // target: 'http://123.56.94.154:8079', // 国内测试环境2
// target: 'http://123.56.94.154:7000', // 国内测试环境2 // target: 'http://123.56.94.154:7000', // 国内测试环境2
target: 'http://123.56.94.154:30668', target: 'http://123.56.94.154:30000',
// target: 'http://47.117.164.182:7060/',
// target: 'http://123.56.181.144:7000', // target: 'http://123.56.181.144:7000',
changeOrigin: true, changeOrigin: true,
secure: false, secure: false,