You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

177 lines
4.6 KiB

<template>
<el-dialog
title="填写表单"
top="1vh"
width="calc(220mm + 600px)"
:visible.sync="visible"
append-to-body
>
<div class="dialog-container">
<!-- 表单内容 -->
<div class="crf-container" style="width: 220mm;">
<hm-crf v-if="crfVisible" ref="hmCrf" :value="content" class="hmPreview" :js-arr="jsArr" />
</div>
<!-- 填充数据 -->
<div class="crf-data" style="width: calc(100% - 220mm);">
<template v-if="examData.length>0">
<div v-for="(item,index) in examData" :key="index">
<crf-data
v-if="crfDataVisible&&item.exams.length>0"
v-model="item.value"
:exam-name="item.name"
:list="item.exams"
/>
</div>
</template>
<template v-else>
<el-empty description="没有可用的填充数据" />
</template>
</div>
</div>
<template slot="footer">
<!-- <el-button @click="visible = false">{{ $t('cancel') }}</el-button> -->
<el-button type="primary" @click="fillCrf">{{ '一键填充' }}</el-button>
<el-button type="primary" @click="submit">{{ '保存' }}</el-button>
</template>
</el-dialog>
</template>
<script>
const Base64 = require('js-base64').Base64
import hmCrf from '../hm-crf/load-content.vue'
import crfData from './crf-data.vue'
import { formatDate } from '@/utils/index.js'
export default {
components: { hmCrf, crfData },
data() {
return {
visible: false,
crfVisible: false,
crfDataVisible: false,
jsArr: [],
inputDate: formatDate(new Date(), 'yyyy-MM-dd'),
id: '',
crfId: '',
patientIdNumber: '',
// CRF内容,填充用
content: '',
// 获取的检查数据,【item.value】为v-model绑定值,即用于填充左侧iframe
examData: []
}
},
mounted() { },
methods: {
init() {
this.visible = true
this.crfVisible = false
this.crfDataVisible = false
this.$nextTick(() => {
// 加载
this.$http.get('/crf/form', { params: { id: this.id }}).then(({ data: res }) => {
if (res.data) {
this.content = Base64.decode(res.data.content)
this.crfVisible = true
}
})
// 获取数据填充数据
this.$http.get('/crf/fillData', {
params: {
crfId: this.crfId,
idNumber: this.patientIdNumber
}
}).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
if (res.data) {
this.examData = res.data
this.crfDataVisible = true
}
}).catch(() => { })
})
},
fillCrf() {
// 过滤数据
const dataSelect = []
let fillItemList = []
this.examData.forEach(item => {
if (item.value) {
dataSelect.push(item.value)
if (item.value.data) {
const examItemList = item.value.data.map((obj, index, arr) => {
obj.recId = item.value.recId
obj.time = item.value.time
return obj
})
fillItemList = fillItemList.concat(examItemList)
}
}
})
const ifr = this.$refs.hmCrf.$el
const ifrWin = ifr.contentWindow
ifrWin.dataFill(fillItemList)
},
submit() {
const ifr = this.$refs.hmCrf.$el
const ifrDoc = ifr.contentWindow.document || ifr.contentDocument
const body = ifrDoc.getElementsByTagName('body')[0]
const crfContent = body.innerHTML
this.$http.put('/crf/form', {
formId: this.id,
dataContent: Base64.encode(crfContent)
}).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
this.$emit('refreshData')
}
})
})
}
}
}
</script>
<style lang="scss" scoped>
.dialog-container {
height: calc(100vh - 1vh - 54px - 70px);
// 表单
.crf-container {
display: inline-block;
vertical-align: top;
height: 100%;
// border: 1px solid;
padding: 10px 0;
text-align: center;
background: #606266;
.hmPreview {
background: #fff;
height: 100%;
}
}
// 匹配数据
.crf-data {
display: inline-block;
vertical-align: top;
height: 100%;
overflow: auto;
padding: 0 20px 0 20px;
}
}
// .btn-fill {
// margin-right: calc(100% - 960px - 160px);
// }
</style>