From f8fe13b6f7d8ad1ae53e7bf6a6cf83f584d52a4d Mon Sep 17 00:00:00 2001
From: fujunling <2984387807@qq.com>
Date: 星期二, 06 六月 2023 17:39:24 +0800
Subject: [PATCH] 动态表单组件重构

---
 Source/UBCS-WEB/src/components/FormTemplate/index.vue |  207 ++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 161 insertions(+), 46 deletions(-)

diff --git a/Source/UBCS-WEB/src/components/FormTemplate/index.vue b/Source/UBCS-WEB/src/components/FormTemplate/index.vue
index f99d7b4..6009b7e 100644
--- a/Source/UBCS-WEB/src/components/FormTemplate/index.vue
+++ b/Source/UBCS-WEB/src/components/FormTemplate/index.vue
@@ -14,9 +14,7 @@
       :visible="visible"
       :type="type"
       :rowOid="rowOid"
-      v-if="dialogVisible"
       ref="FormTempalte"
-      @getFormTemplateEnd="getFormTemplate"
       @getFormData="getFormData"
     ></FormTempalte>
 
@@ -30,11 +28,14 @@
     >
       <el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
         <el-tab-pane label="鐮佸�肩敵璇�" name="codeApply" v-if="showCodeApply">
-          <CodeApply
-            ref="CodeApply"
+          <FormTempalte
             v-bind="$attrs"
-            @getCodeRuleOid="getCodeRuleOid"
-          ></CodeApply>
+            :type="type"
+            :selfColumnType="selfColumnType"
+            :selfColumnConfig="selfColumnConfig"
+            ref="CodeApply"
+            @getFormData="getFormData"
+          ></FormTempalte>
         </el-tab-pane>
         <el-tab-pane
           label="鐩镐技椤规煡璇�"
@@ -46,7 +47,9 @@
             ref="resembleQueryRef"
             :hasResemble="this.hasResemble"
             :column="this.resembleTableColumn"
+            :codeClassifyOid="codeClassifyOid"
             :form="this.form"
+            :templateOid="templateOid"
           ></ResembleQuery>
         </el-tab-pane>
       </el-tabs>
@@ -67,12 +70,12 @@
 </template>
 
 <script>
+import { getCodeRule, getFormTemplate } from "@/api/formTemplate.js";
 import FormTempalte from "./FormTempalte";
 import ResembleQuery from "./ResembleQuery";
-import CodeApply from "./CodeApply";
 export default {
   name: "FormTemplateDialog",
-  components: { ResembleQuery, FormTempalte, CodeApply },
+  components: { ResembleQuery, FormTempalte },
   props: {
     visible: {
       type: Boolean,
@@ -90,7 +93,15 @@
       type: String,
       default: "80%",
     },
-    rowOid: ''
+    rowOid: "",
+    codeClassifyOid: {
+      type: String,
+      default: "",
+    },
+    templateOid: {
+      type: String,
+      default: "",
+    },
   },
   data() {
     return {
@@ -100,7 +111,39 @@
       resembleTableColumn: [],
       secVOList: [],
       form: {},
-      activeName: "",
+      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() {},
@@ -113,65 +156,137 @@
         this.$emit("update:visible", val);
       },
     },
-    showCodeApply() {
-      // 娴嬭瘯鏁版嵁灞曠ず
-      // if (this.type === "add") {
-      //   if (this.hasResemble && this.secVOList.length === 0) {
-      //     return false;
-      //   }
-      // } else {
-      //   return false;
-      // }
-      return true;
-    },
-    showResembleQuery() {
-      return this.hasResemble;
-    },
   },
   methods: {
     openDialog() {
-      this.$nextTick(() => {
-        this.$refs.FormTempalte.init();
-        this.$refs.CodeApply.getCodeRule();
-      });
+      this.getFormTemplate();
+      this.getCodeRule();
     },
     close() {
       this.dialogVisible = false;
     },
-    getCodeRuleOid(data) {
-      this.secVOList = data.secVOList;
+    // 鎺ュ彛鑾峰彇琛ㄥ崟鏁版嵁
+    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);
+        });
     },
-    getFormTemplate(data) {
-      this.hasResemble =
-        data.resembleTableVO &&
-        data.resembleTableVO.cols &&
-        data.resembleTableVO.cols.length > 0;
-      this.resembleTableColumn = data.resembleTableVO.cols || [];
-      this.activeName =
-        (this.showCodeApply && "codeApply") ||
-        (this.showResembleQuery && "resembleQuery");
+    // 鑾峰彇鐮佸�肩敵璇锋暟鎹�
+    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()
+      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();
+        codeValidate = await this.$refs.codeApply.validate();
+        if (!codeValidate) return;
       }
-      this.$emit("submit", {
-        form: this.form,
-        flag: formValidate && codeValidate,
-      });
+      // 杩涜鐩镐技椤规煡璇�
+      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 [];
+      }
     },
   },
 };

--
Gitblit v1.9.3