From 7f1971310aa80bc2bdeaf11a0d2bcfd725b30f39 Mon Sep 17 00:00:00 2001
From: fujunling <2984387807@qq.com>
Date: 星期四, 08 六月 2023 15:26:25 +0800
Subject: [PATCH] fjl

---
 Source/UBCS-WEB/src/components/FormTemplate/index.vue |  352 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 310 insertions(+), 42 deletions(-)

diff --git a/Source/UBCS-WEB/src/components/FormTemplate/index.vue b/Source/UBCS-WEB/src/components/FormTemplate/index.vue
index 10b6e40..a5e99a0 100644
--- a/Source/UBCS-WEB/src/components/FormTemplate/index.vue
+++ b/Source/UBCS-WEB/src/components/FormTemplate/index.vue
@@ -1,42 +1,310 @@
-<template>
-  <div>
-  </div>
-</template>
-
-<script>
-  import { getFormTemplate } from '../../api/common';
-  export default {
-    name: 'FormTemplate',
-    props: {
-      visible: {
-        type: Boolean,
-        default: false
-      },
-    },
-    created() {
-      this.getFormTemplate()
-    },
-    data() {
-      return {
-        load: false
-      }
-    },
-    methods: {
-      getFormTemplate() {
-        this.load = true
-        getFormTemplate({
-          templateOid: '78B8C7C5-A042-0B96-FE6D-65421451782A',
-          codeClassifyOid: '4524E801-6CC6-92E8-1AC3-2AB9604E8F96'
-        }).then(res => {
-          console.log(res);
-        }).catch(err => {
-          console.log(err);
-        })
-      }
-    }
-  }
-</script>
-
-<style lang='less' scoped>
-
-</style>
\ No newline at end of file
+<template>
+  <el-dialog
+    :visible.sync="dialogVisible"
+    v-if="dialogVisible"
+    v-dialogDrag
+    top="0vh"
+    :title="title"
+    class="avue-dialog avue-dialog--top"
+    :width="width"
+    append-to-body
+    @opened="openDialog"
+  >
+    <FormTempalte
+      v-bind="$attrs"
+      :visible="visible"
+      :type="type"
+      :rowOid="rowOid"
+      :templateOid="templateOid"
+      ref="FormTempalte"
+      @getFormData="getFormData"
+    ></FormTempalte>
+
+    <div
+      class="tab_box"
+      v-if="
+        type !== 'detail' &&
+        dialogVisible &&
+        (showCodeApply || showResembleQuery)
+      "
+    >
+      <el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
+        <el-tab-pane label="鐮佸�肩敵璇�" name="codeApply" v-if="showCodeApply">
+          <FormTempalte
+            v-bind="$attrs"
+            :type="type"
+            :selfColumnType="selfColumnType"
+            :selfColumnConfig="selfColumnConfig"
+            ref="CodeApply"
+            @getFormData="getFormData"
+          ></FormTempalte>
+        </el-tab-pane>
+        <el-tab-pane
+          label="鐩镐技椤规煡璇�"
+          name="resembleQuery"
+          v-if="showResembleQuery"
+        >
+          <ResembleQuery
+            v-bind="$attrs"
+            ref="resembleQueryRef"
+            :hasResemble="this.hasResemble"
+            :column="this.resembleTableColumn"
+            :codeClassifyOid="codeClassifyOid"
+            :form="this.form"
+            :templateOid="templateOid"
+          ></ResembleQuery>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+    <div class="avue-dialog__footer" v-if="type !== 'detail'">
+      <el-button @click="close()">鍙� 娑�</el-button>
+      <el-button @click="submit()" type="primary" :loading="submitBtnLoading"
+        >纭� 瀹�</el-button
+      >
+      <el-button
+        @click="resembleQuerySubmit"
+        type="primary"
+        v-if="showResembleQuery"
+        >鐩镐技鍍忔煡璇�</el-button
+      >
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { getCodeRule, getFormTemplate } from "@/api/formTemplate.js";
+import FormTempalte from "./FormTempalte";
+import ResembleQuery from "./ResembleQuery";
+export default {
+  name: "FormTemplateDialog",
+  components: { ResembleQuery, FormTempalte },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false,
+    },
+    type: {
+      type: String,
+      default: "add",
+    },
+    title: {
+      type: String,
+      default: "缂栫爜鐢宠",
+    },
+    width: {
+      type: String,
+      default: "80%",
+    },
+    rowOid: "",
+    codeClassifyOid: {
+      type: String,
+      default: "",
+    },
+    templateOid: {
+      type: String,
+      default: "",
+    },
+  },
+  data() {
+    return {
+      loading: false,
+      submitBtnLoading: false,
+      hasResemble: false,
+      resembleTableColumn: [],
+      secVOList: [],
+      form: {},
+      activeName: "codeApply",
+      showCodeApply: true,
+      showResembleQuery: true,
+      selfColumnType: {
+        codefixedsec: "combox",
+        codeclassifysec: "refer",
+        codevariablesec: "text",
+        coderefersec: "refer",
+      },
+      selfColumnConfig: {
+        function: {
+          required: this.isRequired,
+          dicData: this.getOptionList,
+          type: this.getType,
+        },
+        exchange: {
+          text: "name",
+          field: "oid",
+          prop: "oid",
+          showField: "name",
+          parentClassifySecOid: "parentClassifySecOid",
+          label: "name",
+          maxlength: "codeSecLength",
+          data: "fixedValueVOList",
+        },
+        directVoluation: {
+          search: true,
+          props: {
+            label: "id",
+            value: "id",
+          },
+        },
+      },
+    };
+  },
+  created() {},
+  computed: {
+    dialogVisible: {
+      get() {
+        return this.visible;
+      },
+      set(val) {
+        this.$emit("update:visible", val);
+      },
+    },
+  },
+  methods: {
+    openDialog() {
+      this.getFormTemplate();
+      if (this.type === 'add') {
+        this.getCodeRule();
+      }
+    },
+    close() {
+      this.dialogVisible = false;
+    },
+    // 鎺ュ彛鑾峰彇琛ㄥ崟鏁版嵁
+    getFormTemplate() {
+      getFormTemplate({
+        templateOid: this.templateOid,
+        codeClassifyOid: this.codeClassifyOid,
+      })
+        .then((res) => {
+          if (res.status === 200) {
+            this.hasResemble =
+              res.data.resembleTableVO &&
+              res.data.resembleTableVO.cols &&
+              res.data.resembleTableVO.cols.length > 0;
+            this.resembleTableColumn = res.data.resembleTableVO.cols || [];
+            if (this.hasResemble) {
+              this.activeName = 'resembleQuery'
+              this.showResembleQuery = true
+            }
+            this.$refs.FormTempalte.templateRender(res.data.formDefineVO.items);
+          }
+        })
+        .catch((err) => {
+          this.loading = false;
+          console.log(err);
+        });
+    },
+    // 鑾峰彇鐮佸�肩敵璇锋暟鎹�
+    getCodeRule() {
+      getCodeRule({ codeClassifyOid: this.codeClassifyOid }).then((res) => {
+        if (res.data && res.data.code === 200) {
+          const typeList = [
+            "codefixedsec",
+            "codeclassifysec",
+            "codevariablesec",
+            "coderefersec",
+          ];
+          this.secVOList = (res.data.data.secVOList || []).filter((item) =>
+            typeList.includes(item)
+          );
+          this.$nextTick(() => {
+            if (this.secVOList.length > 0 && this.type === 'add') {
+              this.showCodeApply = true
+              this.activeName = 'codeApply'
+              this.$refs.CodeApply.templateRender(this.secVOList);
+            } else {
+              this.showCodeApply = false
+            }
+          });
+        }
+      });
+    },
+    getFormData(form) {
+      this.form = form;
+    },
+    resembleQuerySubmit() {
+      this.activeName = "resembleQuery";
+      this.$refs.resembleQueryRef.resembleQuery(this.form);
+    },
+    handleClick() {
+      if (this.activeName === "resembleQuery") {
+        this.resembleQuerySubmit();
+      }
+    },
+    async submit() {
+      // 杩涜琛ㄥ崟鏍¢獙
+      const formValidate = await this.$refs.FormTempalte.validate();
+      if (!formValidate) return;
+      let codeValidate = true;
+      // 杩涜鐮佸�肩敵璇锋牎楠�
+      if (this.showCodeApply) {
+        codeValidate = await this.$refs.codeApply.validate();
+        if (!codeValidate) return;
+      }
+      // 杩涜鐩镐技椤规煡璇�
+      const resembleQueryList = await this.$refs.resembleQueryRef.resembleQuery(
+        this.form
+      );
+      if (resembleQueryList.length === 0) {
+        this.$emit("submit", this.form);
+      } else {
+        this.$confirm(
+          `璇ョ墿鏂欏凡鏈�${resembleQueryList.length}鏉$浉浼兼暟鎹紝鏄惁缁х画淇濆瓨锛焋,
+          "闇�瑕佹偍纭",
+          {
+            confirmButtonText: "纭畾",
+            cancelButtonText: "鍙栨秷",
+            type: "warning",
+          }
+        )
+          .then(() => {
+            this.$emit("submit", this.form);
+          })
+          .catch(() => {});
+      }
+    },
+    getType(item) {
+      return this.selfColumnType[item.sectype];
+    },
+    isRequired(item) {
+      return item.nullableFlag != "true";
+    },
+    getOptionList(item) {
+      if (
+        Array.isArray(item.fixedValueVOList) &&
+        item.fixedValueVOList.length > 0
+      ) {
+        const configAttr = {
+          key: "id",
+          value: "id",
+        };
+        const optionList = item.fixedValueVOList.map((item) => {
+          for (const key in configAttr) {
+            if (Object.hasOwnProperty.call(configAttr, key)) {
+              const element = configAttr[key];
+              item[key] = item[element];
+            }
+          }
+          return item;
+        });
+        return optionList;
+      } else {
+        return [];
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.key_attr_icon {
+  font-size: 24px;
+  position: relative;
+  top: 2px;
+  color: red;
+}
+// 瑙e喅swich缁勪欢涓嶅瀭鐩村眳涓殑闂
+/deep/ .el-switch {
+  vertical-align: baseline;
+}
+</style>

--
Gitblit v1.9.3