<template>
  <div class="container">
    <direct-search
      ref="form"
      :label-position="'right'"
      :forms="searchList"
      :style="{ textAlign: 'left' }"
      @handleSearch="handleFormSearch"
    />
    <el-table-self
      ref="table"
      :table-data="tableData"
      :columns="columns"
      :list-loading="listLoading"
      :current-page="pageIndex"
      :total-count="total"
      :page-sizes="pageSizes"
      :page-size="pageSize"
      @pageSizeChange="handleSizeChange"
      @currentPageChange="handleCurrentChange"
    />
    <dialog-form
      width="450px"
      :close-modal="false"
      ref="dialog"
      :title="formEdit.id ? '编辑' : '新增'"
      :form-edit="formEdit"
      :form-data="formData"
      @handleConfirm="handleConfirm"
    ></dialog-form>
  </div>
</template>

<script>
import paginationMixin from "@/components/TabComponents/mixin"
import {
  getGroupFormPage,
  addGroupForm,
  delGroupForm,
  getGroupDeptList,
} from "@/api/coop-group.js"
import { getFormList } from "@/api/field.js"

export default {
  name: "GroupForm",
  mixins: [paginationMixin],
  props: {
    groupId: String,
  },
  data() {
    const formList = []
    // { isPublish: 1 }
    getFormList().then((res) => {
      if (res.code === 1) {
        res.data &&
          res.data.forEach((item) => {
            formList.push({
              label: item.name,
              value: item.id,
            })
          })
      }
    })
    return {
      listLoading: false,
      // 查询列表
      searchList: [
        {
          label: "名称",
          type: "input",
          prop: "tabName",
          placeholder: "请输入名称",
        },
        {
          type: "button",
          value: "查询",
          icon: "el-icon-search",
        },
        {
          type: "button",
          color: "primary",
          icon: "el-icon-plus",
          value: "添加",
          func: this.handleAdd,
        },
      ],
      columns: [
        {
          label: "表单名称",
          minWidth: 120,
          value: "tabName",
        },

        {
          label: "表单原名称",
          minWidth: 120,
          value: "formName",
        },

        {
          label: "机构名称",
          minWidth: 120,
          value: "orgName",
        },
        {
          label: "科室",
          minWidth: 100,
          value: "deptName",
        },
        {
          label: "类型",
          minWidth: 100,
          value: "type",
          formatter: (row) => {
            return this.$handle.formatDicList(
              this.dictMap["formType"],
              row.type
            )
          },
        },
        {
          label: "填报次数",
          minWidth: 80,
          value: "fillType",
          formatter: (row) => {
            return row.fillType === 1 ? "多次" : "单次"
          },
        },
        {
          label: "操作",
          width: 160,
          fixed: "right",
          operType: "button",
          operations: [
            {
              func: this.handleCopyAdd,
              formatter(row) {
                return {
                  label: "复制新增",
                  type: "text",
                }
              },
            },
            {
              func: this.handleAdd,
              formatter(row) {
                return {
                  label: "编辑",
                  type: "text",
                }
              },
            },
            {
              func: this.handleDel,
              style: {
                color: "#F56C6C",
              },
              formatter(row) {
                return {
                  label: "删除",
                  type: "text",
                }
              },
            },
          ],
        },
      ],
      tableData: [],
      cacheForm: {},
      formData: [
        {
          type: "select",
          label: "表单",
          placeholder: "请选择配置表单",
          prop: "formId",
          opts: formList,
          disabled: false,
          rules: [{ required: true, message: "请选择配置表单" }],
        },
        {
          type: "input",
          label: "表单重命名",
          placeholder: "请输入表单重命名",
          prop: "tabName",
          rules: [{ required: true, message: "请输入表单重命名" }],
        },
        {
          type: "select",
          label: "类型",
          placeholder: "请选择类型",
          prop: "type",
          optsFormatter: () => {
            return this.dictMap && this.dictMap["formType"]
          },
          rules: [{ required: true, message: "请选择类型" }],
        },

        {
          type: "select",
          label: "填报方式",
          placeholder: "请选择填报方式",
          prop: "fillType",
          opts: [
            {
              label: "单次",
              value: 0,
            },
            {
              label: "多次",
              value: 1,
            },
          ],
          rules: [{ required: true, message: "请选择填报方式" }],
        },
        {
          type: "select",
          label: "机构/科室",
          placeholder: "请选择机构/科室",
          prop: "deptId",
          opts: [],
        },

        {
          type: "select",
          label: "对照模板",
          prop: "screenTpl",
          optsFormatter: () => {
            return this.dictMap && this.dictMap["screen_contrast"]
          },
        },
        //用于查询同屏对照数据参数
        {
          type: "input",
          label: "同屏对照参数",
          placeholder: "多个参数英文分号分隔",
          prop: "screenParam",
        },
        {
          type: "number",
          label: "排序",
          prop: "sort",
        },
      ],
      formEdit: {},
    }
  },
  watch: {
    groupId(groupId) {
      if (groupId) {
        this.handleFormSearch({ groupId })
        this.getGroupDeptList()
      } else {
        this.tableData = []
      }
    },
  },

  methods: {
    getGroupDeptList() {
      getGroupDeptList({ groupId: this.groupId }).then((res) => {
        if (res.code === 1) {
          const list = []
          const d = res.data
          d &&
            d.forEach((item) => {
              list.push({
                ...item,
                label: item.orgName + "/" + item.deptName,
                value: item.deptId,
              })
            })
          this.formData[2].opts = list
        }
      })
    },

    handleCopyAdd(row) {
      const data = Object.assign({}, row)
      delete data.id
      this.handleAdd(data)
    },

    handleAdd(row) {
      this.formData[0].disabled = row.id ? true : false
      this.formEdit = Object.assign({}, row)
      if (!this.groupId) {
        this.$message.warning("请先选择协作组")
        return
      }
      this.$refs.dialog.open()
    },
    handleConfirm(form) {
      const formList = this.formData[0].opts
      const deptList = this.formData[2].opts
      const orgRow =
        (deptList.find((_) => _.value === form.deptId) &&
          deptList.find((_) => _.value === form.deptId)) ||
        {}
      const data = Object.assign(form, {
        deptName: orgRow.deptName,
        orgName: orgRow.orgName,
        orgId: orgRow.orgId,
        formName: this.$handle.formatDicList(formList, form.formId),
        groupId: this.groupId,
      })
      addGroupForm(data).then((res) => {
        if (res.code === 1) {
          this.$message.success("添加成功")
          this.handleSearch()
          this.$refs.dialog.close()
        }
      })
    },
    handleDel(row) {
      this.$confirm(`是否删除【${row.tabName || ""}】?`, "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          delGroupForm(row.id).then((res) => {
            if (res.code === 1) {
              this.$message({
                type: "success",
                message: "删除成功!",
              })
              this.handleSearch()
            }
          })
        })
        .catch(() => {})
    },

    // 查询
    handleFormSearch(form) {
      this.pageIndex = 1
      this.handleSearch(form)
    },
    handleSearch(form) {
      const params = Object.assign(this.cacheForm, form)
      this.listLoading = true
      for (let key in params) {
        if (params[key] === "") {
          delete params[key]
        }
      }
      params.current = this.pageIndex
      params.size = this.pageSize
      getGroupFormPage(params).then((res) => {
        this.listLoading = false
        if (res.code === 1) {
          const d = res.data
          this.tableData = d.records || []
          this.total = Number(d.total)
        }
      })
    },
  },
}
</script>
