<template> <el-container> <el-main v-loading="pageLoading" class="transition-box"> <i v-if="contrast" :class="asideShow ? 'el-icon-s-unfold' : 'el-icon-s-fold'" :title="asideShow ? '收起' : '展开'" class="arrow" @click="asideShow = !asideShow" ></i> <el-empty v-if="isEmpty" description="暂无数据"></el-empty> <template v-if="!isEmpty"> <!-- 多次记录 --> <el-row v-if="form.fillType === 1"> <tags-scroll-bar v-if="repeatedlyList.length > 0" :tags-list="repeatedlyList" :props="{ label: 'time' }" ref="tags" @change="changeRepeate" :disabled="disabled" @add="handleAdd" ></tags-scroll-bar> </el-row> <el-row class="header"> <template v-if="formData.percent.autoPercent"> <span class="label">自动采集完整度:</span> <span class="value">{{ formData.percent.autoPercent }}%</span> </template> <template v-if="formData.percent.personalPercent"> <span class="label">人工补录完整度:</span> <span class="value" >{{ formData.percent.personalPercent }}%</span ></template > <span class="label"> 仅显示重要字段 :</span> <span class="value"> <el-switch v-model="isShowImprotant" @change="imFieldChange"> </el-switch> </span> </el-row> <div class="my-form" ref="my-form" :class="externalScroll ? 'no-scroll' : ''" > <custom-form ref="form" @scrollTop="scrollTop" :options="widgetFormPreview" @handleConfirm="handleConfirm" :form-edit="formData.formEdit" ></custom-form> </div> </template> </el-main> <el-aside :width="sideWidth" class="transition-box" :class="{ hidden: !asideShow }" v-if="contrast" > <div class="side-content"></div> </el-aside> </el-container> </template> <script> import { getPatientDetail, getRecordList } from "@/api/patient.js" import { getFormDetail } from "@/api/field" import CustomForm from "@/components/FormComponents/CustomForm/index" import TagsScrollBar from "@/components/TagsScrollBar/index" export default { name: "FormTab", props: { externalScroll: Boolean, //外部滚动 disabled: Boolean, contrast: Boolean, //同屏对照 form: Object, patientId: String, patientStandbyId: String, getAll: Boolean, // 获取页面所有数据 }, components: { CustomForm, TagsScrollBar }, provide() { return { formId: this.form.formId, getPatientId: () => { return this.patientId || this.patientStandbyId }, } }, data() { return { btnType: "", isShowImprotant: false, asideShow: true, widgetFormPreview: {}, formData: { formEdit: {}, percent: {}, formRecordId: null, }, loading: false, formloading: false, repeatedlyList: [], formCacheList: [], } }, // mixins: [resizeMixin], computed: { isEmpty() { return !(Object.keys(this.widgetFormPreview) || this.widgetFormPreview) .length }, sideWidth() { return this.asideShow ? "200px" : "0px" }, pageLoading() { return this.loading || this.formloading }, }, methods: { initData() { this.formData.formRecordId = null this.formCacheList = [] this.getPatientDetail() if (this.form.fillType === 1) { this.$nextTick(() => { this.$refs.form && this.$refs.form.resetForm() }) this.getRecordList() } }, scrollTop() { this.$refs["my-form"].scrollTop = 0 }, handleAdd() { this.$refs.form && this.$refs.form.resetForm() this.formData = { formEdit: {}, percent: {}, formRecordId: null, } }, // 切换时间 changeRepeate(index) { const item = this.repeatedlyList[index] if (item.id === this.formData.formRecordId) return const data = this.formCacheList.find((_) => _.formRecordId === item.id) if (data) { this.$refs.form && this.$refs.form.resetForm() this.formData = data return } this.formData.formRecordId = item.id this.getPatientDetail() }, imFieldChange(val) { this.$refs.form.imFieldChange(val) }, initForm() { this.formloading = true if (this.form.formJson) { const obj = eval("(" + this.form.formJson + ")") if (this.disabled) { obj.menuBtn = false obj.disabled = true obj.detail = true } setTimeout(() => { this.widgetFormPreview = obj this.formloading = false }, 100) return } getFormDetail(this.form.formId) .then((res) => { if (res.code === 1 && res.data) { const formJson = res.data.formJson this.$emit("setFormJson", formJson) const obj = eval("(" + formJson + ")") if (this.disabled) { obj.menuBtn = false obj.disabled = true obj.detail = true } this.widgetFormPreview = obj } }) .finally(() => { this.formloading = false }) }, handleConfirm(data, done) { this.$emit( "handleConfirm", { data, formId: this.form.formId, patientId: this.patientId || this.patientStandbyId, formRecordId: this.formData.formRecordId, }, done, (res) => { // 多次填写的表单新增时,获取最新数据 if (this.form.fillType === 1 && !this.formData.formRecordId) { this.getRecordList(res.data.formRecordId) } this.formatData(res, this.form.fillType !== 1) } ) }, getPatientDetail() { this.$nextTick(() => { this.$refs.form && this.$refs.form.resetForm() }) if (!this.patientId || this.form.silent) return this.loading = true getPatientDetail({ patientId: this.patientId, formId: this.form.formId, formRecordId: this.formData.formRecordId, }) .then((res) => { this.formatData(res) }) .finally(() => { this.loading = false }) }, formatData(res, cache) { const d = res.data || {} const form = d.data || {} if (form["YZZKJC"] && typeof form["YZZKJC"] === "string") { form["YZZKJC"] = JSON.parse(form["YZZKJC"]) } if (!cache) { this.formData.formEdit = form } this.formData.formRecordId = d.formRecordId this.formData.percent = d.percent || {} const index = this.formCacheList.findIndex( (_) => _.formRecordId === d.formRecordId ) if (index > -1) { this.formCacheList.splice(index, 1, this.deepClone(this.formData)) } else { this.formCacheList.push(this.deepClone(this.formData)) } }, getRecordList(formRecordId) { if (!this.patientId) return getRecordList({ patientId: this.patientId, formId: this.form.formId, }).then((res) => { this.repeatedlyList = res.data.map((_, index) => { return { ..._, time: _.createTime, } }) this.$nextTick(() => { const el = this.$refs.tags if (el) { el.tabActive = formRecordId || (this.repeatedlyList[0] && this.repeatedlyList[0].id) } }) }) }, }, created() { this.initForm() if (this.getAll) { // 监听patientId 获取页面所有数据 this.$watch( "patientId", () => { this.initData() }, { immediate: true } ) } else { // 监听form.silent 获取当前tab页数据 this.$watch( "form.silent", () => { this.initData() }, { immediate: true } ) } }, } </script> <style scoped lang="scss"> .el-main { position: relative; padding: 0; .arrow { position: absolute; right: 0; top: 0; cursor: pointer; font-size: 22px; z-index: 9; } .header { box-shadow: 0 1px 4px rgb(0 21 41 / 8%); padding-right: 20px; position: relative; font-size: 15px; } } .el-aside { padding-left: 10px; border-left: 1px solid #ccc; .side-content { // height: calc(100vh - #{"272px"}); // overflow: auto; } } .my-form { height: calc(100vh - #{"270px"}); overflow-y: auto; padding-top: 20px; position: relative; &::-webkit-scrollbar-thumb { background-color: #fff; } &:hover::-webkit-scrollbar-thumb { background-color: rgba(0, 0, 0, 0.4); } &.no-scroll { height: auto; } } .label { font-size: 14px; color: #8492a6; line-height: 38px; float: left; margin-right: 20px; } .value { font-size: 14px; line-height: 38px; float: left; font-weight: 600; margin-right: 50px; } .el-slider { float: left; width: 150px; } .transition-box { transition: all 0.2s; &.hidden { opacity: 0; height: 0px; } } </style>