FormAdd.vue 5.95 KB
<template>
  <div>
    <el-page-header @back="$emit('back')" content="表单配置"> </el-page-header>
    <el-form label-width="80px" size="small" style="margin-top: 10px" inline>
      <el-form-item label="表单名称">
        <el-input
          v-model="name"
          placeholder="请输入表单名称"
          style="width: 280px"
        ></el-input>
      </el-form-item>
      <el-form-item label="数据表">
        <el-select
          clearable
          filterable
          default-first-option
          v-model="tableCode"
          @change="tableCodeChange"
        >
          <el-option
            v-for="opt in tableList"
            :key="opt.code"
            :label="opt.name"
            :value="opt.code"
          >
          </el-option>
        </el-select>
      </el-form-item>
    </el-form>

    <avue-form-design
      ref="form"
      style="height: 82vh"
      :options="options"
      :showGithubStar="false"
      :include-fields="['tabs', 'group', 'title', 'dynamic']"
      :toolbar="[formEdit.type === 1 ? '' : 'save', 'preview', 'clear']"
      :custom-fields="customFields"
      :table-name="tableName"
      @handleSave="handleSave"
      @filterField="filterField"
    ></avue-form-design>
  </div>
</template>

<script>
import {
  getFieldListByCode,
  addForm,
  getFormDetail,
  getHistoryInfo,
} from "@/api/field"
import { getTableList } from "@/api/database"

export default {
  name: "FormAdd",
  props: {
    formEdit: {
      type: Object,
    },
    dbId: {},
  },
  data() {
    return {
      tableList: [],
      disabled: false,
      name: "",
      options: {},
      tableCode: "",
      tableName: null,
      customFields: [],
      customOldFields: [],
    }
  },

  methods: {
    getTableList() {
      if (!this.dbId) return
      getTableList(this.dbId).then((res) => {
        this.tableList = res.data
      })
    },
    // 获取数据表字段
    tableCodeChange(tableCode) {
      if (!tableCode) return
      this.$refs.form.customFieldsLoading = this.disabled = true
      const tableList = this.tableList
      this.tableName =
        tableList.find((_) => _.value === tableCode) &&
        tableList.find((_) => _.value === tableCode).label
      getFieldListByCode({ tableCode })
        .then((res) => {
          if (res.code === 1) {
            const customOldFields = []
            const d = res.data
            d.forEach((item) => {
              if (!item.jsonStr) return
              const field = JSON.parse(item.jsonStr)
              if (field.id) delete field.id
              customOldFields.push({
                ...field,
                tableName: item.tableName,
                tableCode: item.tableCode,
                tableId: item.tableId,
              })
            })

            this.customOldFields = customOldFields.map((_) => {
              return {
                ..._,
                notFilter: tableCode === "data_lab_detail", //  data_lab_detail 字段可以重复
              }
            })
            this.filterField()

            this.$refs.form.customFieldsLoading = this.disabled = false
          }
        })
        .catch(() => {
          this.$refs.form.customFieldsLoading = this.disabled = false
        })
    },
    // 字段和表单已有字段对比 过滤
    async filterField() {
      const { fieldList } = await this.getData()
      this.customFields = this.customOldFields.filter((field) => {
        return field.notFilter || !fieldList.find((_) => _.prop === field.prop)
      })
    },
    // 获取当前表单中数据
    async getData() {
      const form = {
        id: this.formEdit.id,
        formJson: "",
        name: this.name,
        dbId: this.dbId,
      }
      let fieldList = []
      form["formJson"] = await this.$refs.form.getData("string")
      const d = await this.$refs.form.getData()
      this.formatColumn(d.column).forEach((item) => {
        if (!fieldList.find((_) => _.prop === item.prop)) {
          fieldList.push(item)
        }
      })
      if (d.group) {
        d.group.forEach((g) => {
          this.formatColumn(g.column).forEach((item) => {
            if (!fieldList.find((_) => _.prop === item.prop)) {
              fieldList.push(item)
            }
          })
        })
      }
      return { form, fieldList }
    },
    // 提取字段list
    formatColumn(column) {
      const fieldList = []
      const deepFn = function (column = [], parent) {
        column.forEach((c) => {
          if (c.type === "dynamic") {
            const childColumn = c.children.column
            if (childColumn && childColumn.length > 0) {
              deepFn(childColumn, c)
            }
          }
          if (c.type === "group") {
            const childColumn = c.children.column
            if (childColumn && childColumn.length > 0) {
              deepFn(childColumn)
            }
          } else if (c.type !== "title") {
            fieldList.push({
              ...c,
              parentCode: parent && parent.prop,
              fieldCode: c.prop,
              fieldName: c.label,
            })
          }
        })
      }
      deepFn(column)
      return fieldList
    },

    // 保存数据
    async handleSave() {
      if (!this.name) {
        this.$message.warning("请输入表单名称")
        return
      }
      const data = await this.getData()
      const { fieldList } = data
      if (!fieldList.length) {
        this.$message.warning("没有可以保存的数据")
        return
      }
      addForm(data).then((res) => {
        if (res.code === 1) {
          this.$emit("back", true)
        }
      })
    },
    initForm() {
      const { id, type } = this.formEdit
      if (!id) return
      const API = type === 1 ? getHistoryInfo : getFormDetail
      API(id).then((res) => {
        if (res.code === 1) {
          this.options = res.data.formJson
          this.name = res.data.name
        }
      })
    },
  },
  created() {
    this.initForm()
    this.getTableList()
  },
}
</script>

<style lang="scss" scoped></style>