{"remainingRequest":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\xq-web-bpm\\src\\components\\form\\FormNavigator.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\src\\components\\form\\FormNavigator.vue","mtime":1675071992022},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":["//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\r\nimport request from '@/request.js'\r\nimport form from '@/api/form.js'\r\nimport {mapState} from 'vuex'\r\nimport {Base64} from 'js-base64'\r\nimport controlsApi from '@/api/controlsConfig.js'\r\nimport {Message} from 'element-ui'\r\n\r\nexport default {\r\n  props: ['widgetForm', 'formData', 'formId'],\r\n  data() {\r\n    return {\r\n      leftSpan: 13, //引入脚本左侧宽度\r\n      rightSpan: 9, //引入脚本右侧宽度\r\n      asideShowLeft: true, //引入脚本左侧默认显示\r\n      asideShowRight: true, //引入脚本右侧默认显示\r\n      params: null,\r\n      dialogFormVisible: false, //查看表单数据dialog\r\n      dialogincluddingFileVisible: false, //引入脚本dialog\r\n      historyRecordVisible: false, //表单历史记录dialog\r\n      newVersionConfig: false,\r\n      formHtmlUrl: '', //获取表单HTML url\r\n      formHtml: '', //获取表单HTML\r\n      formExpand:\"\",//表单json数据\r\n      tableData: [], //表单历史记录列表数据\r\n      pageResult: {\r\n        page: 1,\r\n        pageSize: 10,\r\n        total: 0,\r\n        showTotal: true\r\n      },\r\n      includeFiles: {diyFile: '', diyCss: '', diyJs: ''}, //引入脚本和样式对象\r\n      cmOptions: {\r\n        value: '',\r\n        mode: 'vue',\r\n        readOnly: false,\r\n        smartIndent: true,\r\n        tabSize: 2,\r\n        theme: 'base16-light',\r\n        lineNumbers: true,\r\n        line: true\r\n      },\r\n      cmOptions2: {\r\n        value: '',\r\n        mode: 'javascript',\r\n        readOnly: false,\r\n        smartIndent: true,\r\n        tabSize: 2,\r\n        theme: 'base16-light',\r\n        lineNumbers: true,\r\n        line: true\r\n      },\r\n      clickCount: 0,\r\n      publishTimer: null,\r\n    }\r\n  },\r\n  computed: {\r\n    ...mapState({\r\n      currentUser: state => state.login.currentUser\r\n    }),\r\n    title: function() {\r\n      return this.formData.formType == 'pc' ? 'PC表单设计' : '手机表单设计'\r\n    }\r\n  },\r\n  watch: {\r\n    asideShowLeft: function(newVal, oldVal) {\r\n      if (newVal != oldVal) {\r\n        this.asideshowHandler()\r\n      }\r\n    },\r\n    asideShowRight: function(newVal, oldVal) {\r\n      if (newVal != oldVal) {\r\n        this.asideshowHandler()\r\n      }\r\n    }\r\n  },\r\n  methods: {\r\n    asideshowHandler() {\r\n      if (this.asideShowLeft && !this.asideShowRight) {\r\n        this.leftSpan = 22\r\n        this.rightSpan = 0\r\n      }\r\n      if (!this.asideShowLeft && this.asideShowRight) {\r\n        this.leftSpan = 0\r\n        this.rightSpan = 22\r\n      }\r\n      if (!this.asideShowLeft && !this.asideShowRight) {\r\n        this.leftSpan = 0\r\n        this.rightSpan = 0\r\n      }\r\n      if (this.asideShowLeft && this.asideShowRight) {\r\n        this.leftSpan = 13\r\n        this.rightSpan = 9\r\n      }\r\n    },\r\n    fileOnChange(file, fileList) {\r\n      this.$confirm('导入后会覆盖掉之前选择的数据建模,以导入文件的绑定信息为准, 是否继续?', '提示', {\r\n        confirmButtonText: '确定',\r\n        cancelButtonText: '取消',\r\n        type: 'warning'\r\n      })\r\n        .then(() => {\r\n          var reader = new FileReader()\r\n          reader.readAsText(file.raw)\r\n          let _this = this\r\n          reader.onload = function() {\r\n            let json = JSON.parse(this.result)\r\n            _this.$emit('load-local', json)\r\n          }\r\n        })\r\n        .catch(() => {})\r\n    },\r\n    //表单返回\r\n    formBack() {\r\n      this.$confirm('您确认离开当前编辑页面？', '现在离开，内容不会自动保存', {\r\n        cancelButtonText: '取消',\r\n        confirmButtonText: '确定',\r\n        type: 'warning',\r\n        closeOnClickModal: false\r\n      }).then(() => {\r\n        this.$emit('close-dialog')\r\n      })\r\n    },\r\n    //查看表单数据\r\n    getFormHistoryRecord(row) {\r\n      const this_ = this\r\n      this_.dialogFormVisible = true\r\n      request.get('${form}/form/form/v1/getFormHistoryRecord?id=' + row.id).then(function(rep) {\r\n        if (rep) {\r\n          this_.formHtml = row.formHtml\r\n        }\r\n      })\r\n    },\r\n    //恢复表单数据\r\n    updateFormHistoryRecord(row) {\r\n      const this_ = this\r\n      request.get('${form}/form/form/v1/updateFormHistoryRecord?id=' + row.id).then(function(rep) {\r\n        if (rep.data.state) {\r\n          Message.success(rep.data.message)\r\n          // let param = {\r\n          //   pageBean: {page: 1, pageSize: 20, showTotal: true},\r\n          //   querys: [\r\n          //     {\r\n          //       property: 'formId',\r\n          //       value: row.formId,\r\n          //       operation: 'EQUAL',\r\n          //       relation: 'AND'\r\n          //     }\r\n          //   ]\r\n          // }\r\n          // this_.loadData(param)\r\n          this_.$emit('close-dialog')\r\n        }\r\n      })\r\n    },\r\n    //删除表单数据\r\n    delFormHistoryRecord(row) {\r\n      const this_ = this\r\n      request.remove('${form}/form/form/v1/delFormHistoryRecord?id=' + row.id).then(function(rep) {\r\n        if (rep.data.state) {\r\n          Message.success('删除成功')\r\n          let param = {\r\n            pageBean: {page: 1, pageSize: 20, showTotal: true},\r\n            querys: [\r\n              {\r\n                property: 'formId',\r\n                value: row.formId,\r\n                operation: 'EQUAL',\r\n                relation: 'AND'\r\n              }\r\n            ]\r\n          }\r\n          this_.loadData(param)\r\n        }\r\n      })\r\n    },\r\n    variablesClick(data) {\r\n      this.includeFiles.diyJs += data.value\r\n    },\r\n    //加载表单历史记录列表数据\r\n    loadData(param, cb) {\r\n      const this_ = this\r\n      let queryUrl = '${form}/form/form/v1/formHistoryRecordlistJson'\r\n      let pageBean = {\r\n        pageBean: param.pageBean,\r\n        querys: [\r\n          {\r\n            property: 'formId',\r\n            value: this_.formData.id, // 兼容旧数据\r\n            operation: 'EQUAL',\r\n            relation: 'OR'\r\n          },\r\n          {\r\n            property: 'formKey',\r\n            value: this_.formData.formKey,\r\n            operation: 'EQUAL',\r\n            relation: 'OR'\r\n          }\r\n        ]\r\n      }\r\n      request\r\n        .post(queryUrl, pageBean)\r\n        .then(response => {\r\n          this_.tableData = response.data.rows\r\n          this_.pageResult = {\r\n            page: response.data.page,\r\n            pageSize: response.data.pageSize,\r\n            total: response.data.total\r\n          }\r\n        })\r\n        .finally(() => cb && cb())\r\n    },\r\n    //打开引入表单历史记录列表对话框\r\n    historyRecord() {\r\n      const this_ = this\r\n      this_.historyRecordVisible = true\r\n      let param = {\r\n        pageBean: {page: 1, pageSize: 10, showTotal: true},\r\n        querys: [\r\n          {\r\n            property: 'formId',\r\n            value: this_.formData.id,\r\n            operation: 'EQUAL',\r\n            relation: 'AND'\r\n          }\r\n        ]\r\n      }\r\n      this_.loadData(param)\r\n    },\r\n    afterformHtml(data) {\r\n      if (data && data.bpmForm) {\r\n        this.formHtml = data.bpmForm.formHtml\r\n        this.formExpand = data.bpmForm.expand\r\n        this.includeFiles.diyJs = data.bpmForm.diyJs || ''\r\n      }\r\n    },\r\n    //打开引入脚本对话框\r\n    includdingFile(formId) {\r\n      if (!formId) {\r\n        formId = this.formData.id\r\n      }\r\n      this.dialogincluddingFileVisible = true\r\n      this.formHtmlUrl = '/form/form/v1/previewDesignVue?formId=' + formId\r\n      this.includeFiles = this.formData.includeFiles\r\n        ? Base64.decode(this.formData.includeFiles, 'utf-8')\r\n        : {diyFile: ' ', diyCss: ' ', diyJs: ' '}\r\n    },\r\n    //引入脚本和样式对象保存\r\n    includeFilesOk() {\r\n      if (!this.formHtml) {\r\n        this.$message.warning('模板HTML不能为空！')\r\n        return\r\n      }\r\n      this.dialogincluddingFileVisible = false\r\n      form\r\n        .saveFormJs({\r\n          formId: this.formData.id,\r\n          diyJs: this.includeFiles.diyJs,\r\n          formHtml: Base64.encode(this.formHtml, 'utf-8'),\r\n          formExpand:Base64.encode(this.formExpand, 'utf-8')\r\n        })\r\n        .then(resp => {\r\n          if (resp.state) {\r\n            this.$message.success(resp.message)\r\n          }\r\n        })\r\n    },\r\n    //布局字段中嵌入了布局字段的情况\r\n    isSave(list) {\r\n      let flag = false\r\n      //不需要绑定表单属性的控件\r\n      let ctrlTypeList = [\r\n        'grid',\r\n        'text',\r\n        'accordion',\r\n        'tab',\r\n        'immediate-single',\r\n        'immediate-textarea',\r\n        'image',\r\n        'iframe',\r\n        'amap',\r\n        'dataView',\r\n        'table'\r\n      ]\r\n      for (let i = 0; i < list.length; i++) {\r\n        if (list[i].ctrlType == 'grid' || list[i].ctrlType == 'accordion' || list[i].ctrlType == 'tab') {\r\n          for (let j = 0; j < list[i].columns.length; j++) {\r\n            if (list[i].columns[j].list.length > 0) {\r\n              for (let k = 0; k < list[i].columns[j].list.length; k++) {\r\n                if (\r\n                  list[i].columns[j].list[k].name == '' &&\r\n                  ctrlTypeList.indexOf(list[i].columns[j].list[k].ctrlType) == -1 &&\r\n                  !list[i].columns[j].list[k].options.noBindModel\r\n                ) {\r\n                  this.$message.error('【' + list[i].desc + '中的' + list[i].columns[j].list[k].desc + '】未绑定属性值')\r\n                  flag = true\r\n                  return flag\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      return flag\r\n    },\r\n    getPostData() {\r\n      if (this.widgetForm.list.length == 0) {\r\n        this.$message.error('请拖拽表单控件')\r\n        return\r\n      }\r\n      //不需要绑定表单属性的控件\r\n      let ctrlTypeList = [\r\n        'grid',\r\n        'text',\r\n        'accordion',\r\n        'tab',\r\n        'immediate-single',\r\n        'immediate-textarea',\r\n        'image',\r\n        'iframe',\r\n        'amap',\r\n        'dataView',\r\n        'table'\r\n      ]\r\n      let amap = 0\r\n      for (let i = 0; i < this.widgetForm.list.length; i++) {\r\n        if (this.widgetForm.list[i].ctrlType == 'amap') {\r\n          amap++\r\n          if (amap > 1) {\r\n            this.$message({\r\n              type: 'error',\r\n              message: '表单中只能存在一个地图控件!'\r\n            })\r\n            return\r\n          }\r\n        }\r\n        if (\r\n          this.widgetForm.list[i].ctrlType == 'grid' ||\r\n          this.widgetForm.list[i].ctrlType == 'accordion' ||\r\n          this.widgetForm.list[i].ctrlType == 'tab'\r\n        ) {\r\n          for (let j = 0; j < this.widgetForm.list[i].columns.length; j++) {\r\n            if (this.widgetForm.list[i].columns[j].span.length > 20) {\r\n              this.$message({\r\n                message: 'tab布局控件第' + (j + 1) + '个标签配置项字符长度超出20！',\r\n                type: 'error'\r\n              })\r\n              return\r\n            }\r\n            if (this.widgetForm.list[i].columns[j].list.length > 0) {\r\n              for (let k = 0; k < this.widgetForm.list[i].columns[j].list.length; k++) {\r\n                if (this.widgetForm.list[i].columns[j].list[k].ctrlType == 'amap') {\r\n                  amap++\r\n                  if (amap > 1) {\r\n                    this.widgetForm.list[i].columns[j].list.splice(k, 1)\r\n                    this.$message({\r\n                      type: 'error',\r\n                      message: '已存在高德地图控件!'\r\n                    })\r\n                    return\r\n                  }\r\n                }\r\n                //判断布局字段中是否嵌入了布局字段\r\n                if (\r\n                  this.widgetForm.list[i].columns[j].list[k].name == '' &&\r\n                  (this.widgetForm.list[i].columns[j].list[k].ctrlType == 'grid' ||\r\n                    this.widgetForm.list[i].columns[j].list[k].ctrlType == 'accordion' ||\r\n                    this.widgetForm.list[i].columns[j].list[k].ctrlType == 'tab')\r\n                ) {\r\n                  let flag = this.isSave(this.widgetForm.list[i].columns[j].list) //布局字段中嵌入了布局字段\r\n                  if (flag) {\r\n                    return\r\n                  }\r\n                } else if (\r\n                  this.widgetForm.list[i].columns[j].list[k].name == '' &&\r\n                  ctrlTypeList.indexOf(this.widgetForm.list[i].columns[j].list[k].ctrlType) == -1 &&\r\n                  !this.widgetForm.list[i].columns[j].list[k].options.noBindModel\r\n                ) {\r\n                  this.$message.error(\r\n                    '【' + this.widgetForm.list[i].desc + '中的' + this.widgetForm.list[i].columns[j].list[k].desc + '】未绑定属性值'\r\n                  )\r\n                  return\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      var resp = this.judgeWidgetFormList(this.widgetForm.list)\r\n      if (resp) {\r\n        const formDef = {\r\n          expand: JSON.stringify(this.widgetForm),\r\n          rev: this.formData.rev\r\n        }\r\n        formDef.name = this.formData.name\r\n        formDef.key = this.formData.formKey\r\n        formDef.type = this.formData.typeName\r\n        formDef.typeId = this.formData.typeId\r\n        if (this.formData.defId) {\r\n          formDef.id = this.formData.defId\r\n        }\r\n        let bpmFormVo = {\r\n          bpmFormDef: formDef,\r\n          bpmForm: this.formData\r\n        }\r\n        if (this.newVersionConfig) {\r\n          bpmFormVo.newForm = 'newForm'\r\n        }\r\n        return bpmFormVo\r\n      }\r\n    },\r\n    publish(i) {\r\n      if (i == 1) {\r\n        this.save()\r\n      }\r\n      i++\r\n      if (this.isPublish) {\r\n        this.$http.post('${form}/form/form/v1/publish', {}, {formId: this.formId}).then(response => {\r\n          if (response.data.state) {\r\n            this.$message({\r\n              type: 'success',\r\n              message: response.data.message\r\n            })\r\n            this.formData.status = 'deploy';\r\n            //清除定时器\r\n            if(this.publishTimer) {\r\n              clearTimeout(this.publishTimer);\r\n              this.publishTimer = null;\r\n            }\r\n            this.$emit('close-dialog');\r\n          }\r\n        })\r\n      } else {\r\n        this.publishTimer = setTimeout(() => this.publish(i), 500)\r\n      }\r\n    },\r\n    newVersion() {\r\n      this.newVersionConfig = true\r\n      this.save()\r\n    },\r\n    save(param) {\r\n      this.notPublish = true\r\n      if (param) {\r\n        this.notPublish = false\r\n      }\r\n      //先校验表单的基本属性\r\n      this.$emit('saveValidate')\r\n    },\r\n    saveEnd() {\r\n      let params = this.getPostData()\r\n      this.newVersionConfig = false\r\n      if (params) {\r\n        const this_ = this\r\n        //保存表单是先判断是否有表单模板，没有表单模板先初始化表单模板\r\n        form.isTemplateByAlias('fieldControl').then(resp => {\r\n          if (resp.data.value != undefined) {\r\n            //保存表单\r\n            this_.saveForm(params, this_)\r\n          } else {\r\n            //初始化表单模板\r\n            form.initTemplate().then(response => {\r\n              if (response.data.state) {\r\n                //保存表单\r\n                this_.saveForm(params, this_)\r\n              }\r\n            })\r\n          }\r\n        })\r\n      }\r\n    },\r\n    //保存表单\r\n    saveForm(params, this_) {\r\n      if (this.clickCount > 0) {\r\n        this.$message({\r\n          type: 'warning',\r\n          message: '操作过快，请两秒钟后再进行尝试！'\r\n        })\r\n        return false\r\n      }\r\n      if (this.clickCount == 0) {\r\n        ++this.clickCount\r\n        request.post('${form}/form/form/v1/saveForm', params).then(\r\n          response => {\r\n            this_.$message.success(response.data.message)\r\n            this_.$emit('close-dialog', response.data.value)\r\n            if (this.notPublish) {\r\n              this.isPublish = true\r\n            }\r\n            setTimeout(() => {\r\n              this.clickCount = 0\r\n            }, 2000)\r\n          },\r\n          error => {\r\n            this.$message.error(error.response.data.message || '表单保存失败！请检查表单模板是否正确')\r\n            this.isPublish = false\r\n            setTimeout(() => {\r\n              this.clickCount = 0\r\n            }, 2000)\r\n          }\r\n        )\r\n      }\r\n    },\r\n    previewForm() {\r\n      if (this.currentUser && this.currentUser.account) {\r\n        let routeUrl = this.$router.resolve({\r\n          path: '/previewForm/' + this.formId\r\n        });\r\n        // todo lj  如果要单独处理手机表单 再处理\r\n        // if (this.formData.formType == 'pc') {\r\n        //   url = window.context.front + '/previewForm/' + this.formId + '?token=' + this.currentUser.token\r\n        //   // Base64.encode(this.currentUser.account);\r\n        // } else {\r\n        //   routeUrl = window.context.mobile + '/previewForm/' + this.formId + '?token=' + this.currentUser.token\r\n        //   // Base64.encode(this.currentUser.account);\r\n        // }\r\n        window.open(routeUrl.href, '_blank')\r\n      }\r\n    },\r\n    genHtml() {\r\n      request.post('${form}/form/form/v1/generateFrom', this.getPostData()).then(response => {\r\n        this.$message.success(response.data.message)\r\n        this.$emit('close-dialog')\r\n      })\r\n    },\r\n    editHtml() {},\r\n    isUpload() {},\r\n    addStyle(listValue) {\r\n      if (listValue.columns.length > 2) {\r\n        listValue.columns.forEach((v, i) => {\r\n          if (v.style && v.style.includes('border')) {\r\n            if (i < listValue.columns.length - 1 && !v.style.includes('border-right: none')) {\r\n              v.style += ' border-right: none; '\r\n            }\r\n          }\r\n        })\r\n      }\r\n    },\r\n\r\n    judgeWidgetFormList(widgetFormList) {\r\n      // 判断表单当中，有必须绑定属性的控件没有绑定属性\r\n      let resultVal = true\r\n      let fieldList = []\r\n      for (var i = 0; i < widgetFormList.length; i++) {\r\n        var listValue = this.widgetForm.list[i]\r\n        if (listValue.columns) {\r\n          this.addStyle(listValue)\r\n          // 栅格布局的字段保存  tab 折叠\r\n          for (var j = 0; j < listValue.columns.length; j++) {\r\n            var listValue1 = []\r\n            //非布局字段\r\n            var fieldListValue1 = listValue.columns[j].list.filter(c => {\r\n              !controlsApi.isLayoutComponents(c.ctrlType) && !c.options.noBindModel && c.options.noBindModel != undefined\r\n            })\r\n            listValue1 = listValue1.concat(fieldListValue1)\r\n            //栅格-折叠-tab布局/表格布局\r\n            var gridListValue1 = listValue.columns[j].list.filter(c => c.ctrlType == 'grid' || c.ctrlType == 'table' || c.ctrlType == 'tab' || c.ctrlType == 'accordion')\r\n            for (let k = 0; k < gridListValue1.length; k++) {\r\n              //栅格-折叠-tab布局\r\n              var columnsObj = gridListValue1[k].columns\r\n              if(columnsObj){\r\n                for (let l = 0; l < columnsObj.length; l++) {\r\n                  var list = columnsObj[l].list\r\n                  list = list.filter(c => {\r\n                    if(c.ctrlType==\"table\"){\r\n                      c.rows.forEach(item => {\r\n                        item.cols.forEach(obj => {\r\n                          listValue1 = listValue1.concat(obj.list)\r\n                        })\r\n                      })\r\n                    }else{\r\n                      var obj = c.columns;\r\n                      if(obj){\r\n                        for (let l = 0; l < obj.length; l++) {\r\n                          var list = obj[l].list\r\n                          list = list.filter(n => {\r\n                            return !n.options.noBindModel\r\n                          })\r\n                          listValue1 = listValue1.concat(list)\r\n                        }\r\n                      }\r\n                    }\r\n                  })\r\n                  listValue1 = listValue1.concat(list)\r\n                }\r\n              }\r\n              //表格布局\r\n              if(!columnsObj){\r\n                columnsObj = gridListValue1[k].rows\r\n                columnsObj.forEach(item => {\r\n                  item.cols.forEach(obj => {\r\n                    listValue1 = listValue1.concat(obj.list)\r\n                  })\r\n                })\r\n              }\r\n            }\r\n            fieldList = fieldList.concat(listValue1)\r\n            //子表布局\r\n            var subtableListValue1 = listValue.columns[j].list.filter(c => c.ctrlType == 'subtable' || c.ctrlType == 'subDiv')\r\n\r\n            for (let k = 0; k < subtableListValue1.length; k++) {\r\n              var subObj = subtableListValue1[k]\r\n              if (subObj.list) {\r\n                if (!this.subUnique(subObj)) {\r\n                  return false\r\n                }\r\n              }\r\n            }\r\n            resultVal = this.validateFields(listValue1)\r\n            if (!resultVal) {\r\n              return false\r\n            }\r\n\r\n            //数据视图\r\n            var dataViewListValue1 = listValue.columns[j].list.filter(c => c.ctrlType == 'dataView')\r\n\r\n            for (let h = 0; h < dataViewListValue1.length; h++) {\r\n              var dataView = dataViewListValue1[h]\r\n              if (dataView.templateKey == '') {\r\n                this.$message.error('请绑定表单列表')\r\n                return false\r\n              }\r\n            }\r\n\r\n            for (let f = 0; f < fieldList.length; f++) {\r\n              for (let v = 0; v < listValue.columns[j].list.length; v++) {\r\n                if (listValue.columns[j].list[v].fieldPath == fieldList[f].fieldPath && fieldList[f].target) {\r\n                  this.$message.error('字段属性【' + fieldList[f].title + '】,绑定了多个布局控件')\r\n                  return false\r\n                }\r\n              }\r\n            }\r\n            // if (listValue.ctrlType == \"grid\") {\r\n            fieldList = fieldList.concat(listValue.columns[j].list)\r\n            // }\r\n          }\r\n        } else if (listValue.list) {\r\n          let _this = this\r\n          let fieldNum = 0\r\n          try {\r\n            listValue.list.forEach((v, index) => {\r\n              if ((listValue.ctrlType == 'subtable' || listValue.ctrlType == 'subDiv') && fieldNum == 0) {\r\n                if (v.ctrlType != 'sunDiv' && v.ctrlType != 'suntable') {\r\n                  fieldNum++\r\n                } else if (listValue.list.length - 1 == index && fieldNum == 0) {\r\n                  throw new Error('请给子表添加字段!')\r\n                }\r\n              }\r\n              if (v.ctrlType == 'grid') {\r\n                _this.addStyle(v)\r\n              }\r\n            })\r\n          } catch (e) {\r\n            this.$message({type: 'error', message: e.message})\r\n            return false\r\n          }\r\n          var res = this.subUnique(listValue)\r\n          if (!res) {\r\n            return false\r\n          }\r\n        } else if ((!listValue.options || !listValue.options.noBindModel) && !listValue.rows) {\r\n          fieldList.push(listValue)\r\n          // 不使用布局\r\n          resultVal = this.validateField(listValue)\r\n          if (!resultVal) {\r\n            break\r\n          }\r\n        } else if (listValue.rows && listValue.rows.length > 0) {\r\n          listValue.rows.forEach(item => {\r\n            item.cols.forEach(obj => {\r\n              fieldList = fieldList.concat(obj.list)\r\n            })\r\n          })\r\n          // 表格布局\r\n          resultVal = this.validateRowFields(listValue)\r\n          if (!resultVal) {\r\n            break\r\n          }\r\n        } else if (listValue.templateKey) {\r\n          if (listValue.templateKey == '') {\r\n            //数据视图\r\n            this.$message.error('请绑定表单列表')\r\n            return false\r\n          }\r\n        }\r\n      }\r\n      let obj = this.unique(fieldList)\r\n      if (this.unique(fieldList)) {\r\n        let repeatArray = fieldList.filter(item => {\r\n          return item.fieldPath === obj.fieldPath\r\n        })\r\n        let desc = ''\r\n        let title = repeatArray[0].title\r\n        if (!title) {\r\n          title = repeatArray[0].fieldPath\r\n        }\r\n        repeatArray.forEach(item => {\r\n          desc = desc + item.desc + ','\r\n        })\r\n        this.$message.error('属性【' + title + '】,绑定了多个控件')\r\n        return false\r\n      }\r\n      return resultVal\r\n    },\r\n    subUnique(listValue) {\r\n      let res = true\r\n      if (!listValue.options.boSubEntity) {\r\n        this.$message.error(listValue.desc + '请绑定实体')\r\n        return false\r\n      }\r\n      if (listValue.list.length == 0) {\r\n        this.$message.error(listValue.desc + '请至少绑定一个子表字段')\r\n        return false\r\n      }\r\n      //获取孙表字段\r\n      let sunList = listValue.list.filter(c => c.ctrlType == 'suntable' || c.ctrlType == 'sunDiv')\r\n      for (let k = 0; k < sunList.length; k++) {\r\n        if (!sunList[k].options.boSubEntity) {\r\n          this.$message.error(sunList[k].desc + '请绑定实体')\r\n          return false\r\n        }\r\n        if (sunList[k].list.length == 0) {\r\n          this.$message.error(sunList[k].desc + '请至少绑定一个孙表字段')\r\n          return false\r\n        }\r\n        let sunFieldList = this.getField(sunList[k])\r\n        if (this.unique(sunFieldList)) {\r\n          let repeatArray = sunFieldList.filter(item => {\r\n            return item.fieldPath === obj.fieldPath\r\n          })\r\n          let desc = ''\r\n          let title = repeatArray[0].title\r\n          if (!title) {\r\n            title = repeatArray[0].fieldPath\r\n          }\r\n          repeatArray.forEach(item => {\r\n            desc = desc + item.desc + ','\r\n          })\r\n          this.$message.error(listValue.desc + '孙表中属性【' + title + '】,绑定了多个控件【' + desc + '】,只能绑定一个')\r\n          return false\r\n        }\r\n        if (!this.validateFields(sunFieldList)) {\r\n          return false\r\n        }\r\n      }\r\n\r\n      let subFieldList = this.getField(listValue)\r\n      let obj = this.unique(subFieldList)\r\n      if (obj) {\r\n        let repeatArray = subFieldList.filter(item => {\r\n          return item.fieldPath === obj.fieldPath\r\n        })\r\n        let desc = ''\r\n        let title = repeatArray[0].title\r\n        if (!title) {\r\n          title = repeatArray[0].fieldPath\r\n        }\r\n        repeatArray.forEach(item => {\r\n          desc = desc + item.desc + ','\r\n        })\r\n        this.$message.error(listValue.desc + '子表中属性【' + title + '】,绑定了多个控件【' + desc + '】,只能绑定一个')\r\n        return false\r\n      }\r\n      if (!this.validateFields(subFieldList)) {\r\n        return false\r\n      }\r\n      return res\r\n    },\r\n    getField(listValue) {\r\n      //获取布局中栅格布局\r\n      let gridListValue1 = listValue.list.filter(c => c.ctrlType == 'grid')\r\n      //获取布局中基础字段\r\n      let subFieldList = listValue.list.filter(c => c.ctrlType != 'grid' && (c.ctrlType != 'suntable' || c.ctrlType != 'sunDiv'))\r\n      for (let k = 0; k < gridListValue1.length; k++) {\r\n        let columnsObj = gridListValue1[k].columns\r\n        for (let l = 0; l < columnsObj.length; l++) {\r\n          let list = columnsObj[l].list\r\n          subFieldList = subFieldList.concat(list)\r\n        }\r\n      }\r\n      return subFieldList\r\n    },\r\n    unique(arr) {\r\n      var hash = {}\r\n      for (let i = 0; i < arr.length; i++) {\r\n        if (arr[i].fieldPath && hash[arr[i].fieldPath]) {\r\n          return arr[i]\r\n        }\r\n        hash[arr[i].fieldPath] = true\r\n      }\r\n      return false\r\n    },\r\n    validateRowFields(field) {\r\n      let resultVal = true\r\n      for (var k = 0; k < field.rows.length; k++) {\r\n        let cols = field.rows[k].cols\r\n        for (var c = 0; c < cols.length; c++) {\r\n          for (let l = 0; l < cols[c].list.length; l++) {\r\n            resultVal = this.validateField(cols[c].list[l])\r\n            if (!resultVal) {\r\n              return false\r\n            }\r\n          }\r\n        }\r\n      }\r\n      return true\r\n    },\r\n    validateFields(fields) {\r\n      let resultVal = true\r\n      for (var k = 0; k < fields.length; k++) {\r\n        resultVal = this.validateField(fields[k])\r\n        if (!resultVal) {\r\n          return false\r\n        }\r\n      }\r\n      return true\r\n    },\r\n    validateField(field) {\r\n      if ((!field.options || !field.options.noBindModel) && field.name == '') {\r\n        this.$message.error('请绑定属性值')\r\n        return false\r\n      }\r\n      if (field.ctrlType == 'selector' && !field.options.selector.type.alias) {\r\n        this.$message.error('选择器控件请绑定选择器')\r\n        return false\r\n      }\r\n      return true\r\n    }\r\n  }\r\n}\r\n",null]}