{"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\\PropertyPanel.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\xq-web-bpm\\src\\components\\form\\PropertyPanel.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//\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//\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 form from '@/api/form.js'\r\nimport {Base64} from 'js-base64'\r\nimport deepmerge from 'deepmerge'\r\nimport {advanceComponents, basicComponents, layoutComponents} from '@/api/controlsConfig.js'\r\nimport LayoutProperty from '@/components/form/LayoutProperty.vue'\r\nimport AdvancedProperty from '@/components/form/AdvancedProperty.vue'\r\nimport BasicsProperty from '@/components/form/BasicsProperty.vue'\r\nimport htEditor from '@/components/common/HtEditor.vue'\r\nimport i18nMessageEdit from '@/components/system/I18nMessageEdit.vue'\r\nimport WidgetFormBus from '@/components/form/bus/WidgetFormBus.js'\r\nimport utils from '@/hotent-ui-util.js'\r\n\r\nconst EipSysTypeSelector = () => import('@/components/selector/EipSysTypeSelector.vue')\r\nexport default {\r\n  name: 'property-panel',\r\n  props: ['data', 'boDefData', 'formData', 'mainBoFields', 'subTables', 'sunTablesMap'],\r\n  components: {\r\n    LayoutProperty,\r\n    AdvancedProperty,\r\n    BasicsProperty,\r\n    htEditor,\r\n    i18nMessageEdit,\r\n    EipSysTypeSelector\r\n  },\r\n  data() {\r\n    return {\r\n      formCollapseActiveNames: 'formBasic',\r\n      basicComponents,\r\n      layoutComponents,\r\n      advanceComponents,\r\n      copyAdvanceComponents: '',\r\n      activeTabName: 'field',\r\n      avtiveCollapseName: 'basic',\r\n      field: this.data,\r\n      formObj: this.formData,\r\n      dialogincluddingFileVisible: false, //引入脚本dialog\r\n      formSettingVisible: false, //表单配置dialog\r\n      formSetting: {\r\n        align: 'right',\r\n        customColon: false,\r\n        fontColor: 'rgb(150, 151, 153)'\r\n      },\r\n      formHtmlUrl: '', //获取表单HTML url\r\n      formHtml: '',//表单html数据\r\n      formExpand:\"\",//表单json数据\r\n      isWatch: false,\r\n      includeFiles: {diyFile: '', diyCss: '', diyJs: ''}, //引入脚本和样式对象\r\n      tableFields: [],\r\n      filterListType: ['number', 'currency', 'date', 'amap'],\r\n      clobFieldList:[\"textarea\",\"dialog\",\"imageViewer\",\"related-process\",\r\n                          \"signature\",\"button\",\"immediate-single\",\"immediate-textarea\",\r\n                          \"milepost\",\"eip-cascader\",\"dataView\",\"text\",\r\n                          \"QRcode\",\"iframe\",\"image\"],//大文本类型字段允许绑定的控件\r\n      allBoData: [],\r\n      formVarData: [],\r\n      returnData: [],\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      i18nMessageKey: '',\r\n      createKeyMap: {\r\n        text: true,\r\n        image: true,\r\n        'immediate-single': true,\r\n        'immediate-textarea': true\r\n      },\r\n      sunTables: [],\r\n      currentBoSubEntity: '',\r\n      fieldIndexData: {},\r\n      noAttrFieldList:[],\r\n    }\r\n  },\r\n  created() {\r\n    const me_ = this;\r\n    //表单初始化时收集无属性控件字段\r\n    WidgetFormBus.$on(\"initNoAttrField\", (obj) => {\r\n      if(this.isNoAttrField(obj) && obj.tableName){\r\n        me_.noAttrFieldListChange(obj, true);\r\n      }\r\n    });\r\n  },\r\n  methods: {\r\n    //重置表单配置信息\r\n    formSettingReset() {\r\n      this.formSetting = {\r\n        align: 'right',\r\n        customColon: false,\r\n        fontColor: 'rgb(150, 151, 153)'\r\n      }\r\n      this.formData.formSetting = ''\r\n    },\r\n    //打开表单配置弹框\r\n    formSettingClick() {\r\n      if (this.formData.formSetting) {\r\n        this.formSetting = JSON.parse(this.formData.formSetting)\r\n      }\r\n      this.formSettingVisible = true\r\n    },\r\n    //保存表单配置信息\r\n    formSettingOk() {\r\n      this.formData.formSetting = JSON.stringify(this.formSetting)\r\n      this.formSettingVisible = false\r\n    },\r\n    saveValidate() {\r\n      const this_ = this\r\n      utils\r\n        .validateForm(this, 'editBpmForm')\r\n        .then(() => {\r\n          //手机表单保存时 表单类型指定为手机表单类型\r\n          if (this_.formData.formType && this_.formData.formType != 'mobile') {\r\n            this_.formData.formType = 'pc'\r\n          }\r\n          // this.formData.name = this.formData.formName;\r\n          this_.$emit('saveEnd')\r\n        })\r\n        .catch(reason => {\r\n          let rules = reason.map(obj => {\r\n            return obj.rule\r\n          }) \r\n          if(this_.formData && this_.formData.typeName && \r\n            this_.formData.name && this_.formData.formKey){\r\n              if (rules.includes('isExist')) {\r\n                this.$message.error('表单别名重复')\r\n              }else if (rules.includes('regex')) {\r\n                this.$message.error('只能输入字母、数字、下划线，且以字母开头')\r\n              }\r\n          }else{\r\n            //获取到报错后的规则数组\r\n            if (rules.includes('required')) {\r\n              this.$message.error('请完整填写表单内容')\r\n            } else if (rules.includes('isExist')) {\r\n              this.$message.error('表单别名重复')\r\n            }\r\n          }\r\n          this.activeTabName = 'form'\r\n        })\r\n    },\r\n    filterFields(obj) {\r\n      if((obj.columnType==\"clob\" || obj.dataType==\"clob\") && this.clobFieldList.indexOf(this.field.ctrlType)==-1){\r\n        return false;\r\n      }\r\n      if (this.filterListType.indexOf(this.field.ctrlType) > -1) {\r\n        if(this.field.ctrlType==\"date\" && this.field.options.dataType!=\"date\"){\r\n          this.field.options.dataType = \"date\";\r\n        }\r\n        return obj.dataType == this.field.options.dataType\r\n      } else if (obj.nodeType == 'sub') {\r\n        return false\r\n      } else {\r\n        return true\r\n      }\r\n    },\r\n    //高级控件\r\n    filterAdvanceFields(obj) {\r\n      //子/孙表不能选择的控件类型 返回false 不能选择\r\n      let types = ['dataView', 'QRcode', 'milepost']\r\n      if (this.field.boSubEntity && types.includes(obj.ctrlType)) {\r\n        return false\r\n      }\r\n      return true\r\n    },\r\n    //常用控件\r\n    filterFieldsByCurrentField(obj) {\r\n      //子/孙表不能选择的控件类型 返回false 不能选择\r\n      let types = ['related-process', 'amap']\r\n      if (this.field.boSubEntity && types.includes(obj.ctrlType)) {\r\n        return false\r\n      }\r\n      if (!obj.options.dataType) {\r\n        return true\r\n      }\r\n      if (!this.field.options){\r\n        return true\r\n      }\r\n      if (!this.field.options.dataType) {\r\n        return true\r\n      }\r\n      if (this.field.options.dataType == obj.options.dataType) {\r\n        return true\r\n      }\r\n      let dataTypes = obj.options.dataType.split('|')\r\n      if (dataTypes.indexOf('string') != -1) {\r\n        dataTypes.push('varchar')\r\n        dataTypes.push('nvarchar')\r\n      }\r\n      // 数字控件不能绑定日期控件\r\n      if (this.field.options.dataType == 'number') {\r\n        return obj.options.dataType != 'date'\r\n      }\r\n      // 日期控件不能绑定数字控件\r\n      if (this.field.options.dataType == 'date') {\r\n        return obj.options.dataType != 'number'\r\n      }\r\n      // 大文本类型默认多行文本\r\n      if (this.field.options.dataType == 'clob') {\r\n        if(obj.ctrlType == 'textarea'){\r\n          return true;\r\n        }\r\n      }\r\n      // 字符串类型可以选择所有字段\r\n      let charArr = ['string', 'varchar', 'nvarchar']\r\n      // 需要兼容以前的代码  this.field.options.dataType == \"\"\r\n      let result = this.field.options.dataType.split('|').filter(item => {\r\n        return dataTypes.indexOf(item) != -1 || charArr.indexOf(item) != -1\r\n      })\r\n\r\n      if (result && result.length >= 1) {\r\n        return true\r\n      }\r\n      return false\r\n    },\r\n    /**\r\n     * 新旧属性的替换,并保留原有的双向绑定,\r\n     * 具体逻辑为:\r\n     * 1.新属性有值的,旧属性没有的,新增\r\n     * 2.新属性没有的,旧属性有的,删除\r\n     * 3.新属性有的,旧属性也有,,则保留旧属性(desc等一些特殊key 需要特殊逻辑处理)\r\n     */\r\n    attributeToReplace(oldV, newV) {\r\n      for (let key in oldV) {\r\n        //2.新属性没有的,旧属性有的,删除\r\n        if (key !=\"key\" &&  newV[key] === undefined && (oldV[key] || oldV[key]===\"\")) {\r\n          delete oldV[key]\r\n        }\r\n      }\r\n      for (let key in newV) {\r\n        let value = newV[key]\r\n        //1.新属性有值的,旧属性没有的,新增\r\n        if (oldV[key] === undefined || oldV[key] === '') {\r\n          this.$set(oldV, key, value);\r\n          //3.新属性有的,旧属性也有,,则保留旧属性(options等一些特殊key 需要特殊逻辑处理)\r\n        } else {\r\n          if (key === 'options') {\r\n            // 保留绑定的dataType\r\n            let boDataType = oldV[key].dataType\r\n            oldV[key] = value\r\n            if (boDataType) {\r\n              oldV[key].dataType = boDataType\r\n            }\r\n          }\r\n        }\r\n      }\r\n      //旧属性有值 和新属性的值不一样 要重置\r\n      for (let keys in oldV){\r\n        if (!(oldV[keys] instanceof Object)){\r\n        \tif (oldV[keys]!=newV[keys] && newV[keys]!=undefined){\r\n\t\t        oldV[keys]=newV[keys];\r\n\t        }\r\n        }\r\n      }\r\n    },\r\n    //切换控件类型对应改变属性\r\n    changeCtrlType(isClean) {\r\n      const me_ = this\r\n      const selectObj = deepmerge({}, me_.field, {clone: true})\r\n      basicComponents.forEach(item => {\r\n        if (me_.field.ctrlType == item.ctrlType) {\r\n          // me_.field = deepmerge({}, item, { clone: true });\r\n          let i = deepmerge({}, item, {clone: true})\r\n          i.parentNodeType = me_.data.parentNodeType\r\n          i.boSubEntity = me_.data.boSubEntity\r\n          me_.attributeToReplace(me_.field, i)\r\n\r\n          me_.field.key = me_.data.key\r\n          if (!isClean) {\r\n            me_.field.boDefId = selectObj.boDefId\r\n            me_.field.target = selectObj.target\r\n            me_.field.boAttrId = selectObj.boAttrId\r\n            me_.field.fieldPath = selectObj.fieldPath\r\n            me_.field.name = selectObj.name\r\n            me_.field.desc = selectObj.desc\r\n            me_.field.title = selectObj.desc\r\n            me_.field.entId = selectObj.entId\r\n            me_.field.boDefAlias = selectObj.boDefAlias\r\n            me_.field.tableName = selectObj.tableName\r\n            me_.field.columnType = selectObj.columnType\r\n            me_.field.options.format = selectObj.options.format\r\n            me_.field.options.inputFormat = selectObj.options.format\r\n            me_.field.options.decimalDigits = selectObj.decimalLen\r\n            me_.field.options.maxDecimalDigits = selectObj.decimalLen\r\n          }\r\n          //me_.$emit(\"data:update\",  me_.field);\r\n          //WidgetFormBus.$emit(\"changeCtrlType\", me_.field);\r\n        }\r\n      })\r\n      advanceComponents.forEach(item => {\r\n        if (me_.field.ctrlType == item.ctrlType) {\r\n          // me_.field = deepmerge({}, item, { clone: true });\r\n          let e = deepmerge({}, item, {clone: true})\r\n          e.parentNodeType = me_.data.parentNodeType\r\n          e.boSubEntity = me_.data.boSubEntity\r\n          me_.attributeToReplace(me_.field, e)\r\n          me_.field.key = me_.data.key\r\n          if (!isClean) {\r\n            me_.field.boDefId = selectObj.boDefId\r\n            me_.field.target = selectObj.target\r\n            me_.field.boAttrId = selectObj.boAttrId\r\n            me_.field.fieldPath = selectObj.fieldPath\r\n            me_.field.name = selectObj.name\r\n            me_.field.desc = selectObj.desc\r\n            me_.field.title = selectObj.desc\r\n            me_.field.entId = selectObj.entId\r\n            me_.field.boDefAlias = selectObj.boDefAlias\r\n            me_.field.tableName = selectObj.tableName\r\n            me_.field.columnType = selectObj.columnType\r\n            me_.field.options.format = selectObj.format\r\n            me_.field.options.inputFormat = selectObj.format\r\n            me_.field.options.decimalDigits = selectObj.decimalLen\r\n            me_.field.options.maxDecimalDigits = selectObj.decimalLen\r\n          }\r\n          // WidgetFormBus.$emit(\"changeCtrlType\", me_.field);\r\n        }\r\n      })\r\n      me_.$nextTick(() => {\r\n        me_.$emit('update:data', me_.field)\r\n      })\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    variablesClick(data) {\r\n      this.includeFiles.diyJs += data.value\r\n    },\r\n    afterformHtml(data) {\r\n      this.formExpand = data.bpmForm.formExpand\r\n      this.formHtml = data.bpmForm.formHtml\r\n      this.includeFiles.diyJs = data.bpmForm.diyJs\r\n    },\r\n    includdingFile() {\r\n      this.dialogincluddingFileVisible = true\r\n      this.formHtmlUrl = '/form/form/v1/previewDesignVue?formId=' + this.formData.id\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    handleClick(tab, event) {\r\n      console.info(tab)\r\n    },\r\n    // 改变地图地址绑定的字段 设置fieldPath\r\n    changeMap(value) {\r\n      let selectObj = null\r\n      this.tableFields.forEach(boData => {\r\n        if (!selectObj) {\r\n          selectObj = boData.children.find(opt => opt.name === value)\r\n          if (selectObj) {\r\n            selectObj.boDefAlias = boData.boDefAlias || boData.fieldPath.split('.')[0]\r\n            selectObj.tableName = boData.name\r\n          }\r\n        }\r\n      })\r\n      this.field.options.addressMap = selectObj.path + '.' + selectObj.name\r\n    },\r\n    // 改变绑定的字段 设置fieldPath\r\n    change(value) {\r\n      let selectObj = null\r\n      this.fieldIndexData = {}\r\n      this.tableFields.forEach(boData => {\r\n        boData.children.forEach((v, i) => {\r\n          let keyName = v.name\r\n          if (value.indexOf('.') != -1) {\r\n            keyName = v.path + '.' + v.name\r\n          }\r\n          if (v.isRequired && keyName == value) {\r\n            if (!this.fieldIndexData.fieldName) {\r\n              this.fieldIndexData.fieldName = v.fieldName\r\n              this.fieldIndexData.index = i\r\n            }\r\n          }\r\n        })\r\n        if (!selectObj) {\r\n          selectObj = boData.children.find(opt => opt.name === value)\r\n          if (value.indexOf('.') != -1) {\r\n            selectObj = boData.children.find(opt => opt.path + '.' + opt.name === value)\r\n          }\r\n\r\n          if (selectObj) {\r\n            selectObj.boDefAlias = boData.boDefAlias || boData.path.split('.')[0]\r\n            selectObj.tableName = boData.name\r\n          }\r\n        }\r\n      })\r\n\r\n      if (!selectObj) {\r\n        if (this.field.parentNodeType == 'sub') {\r\n          this.field.fieldPath = 'item.' + value\r\n          this.field.name = 'item.' + value\r\n        } else {\r\n          this.$message.warning('只允许子表绑定虚拟字段')\r\n        }\r\n        return\r\n      }\r\n\r\n      this.field.boDefId = selectObj.boDefId\r\n      this.field.boAttrId = selectObj.id\r\n      if (this.field.parentNodeType == 'sub') {\r\n        this.field.fieldPath = 'item.' + selectObj.name\r\n      } else {\r\n        this.field.fieldPath = selectObj.path + '.' + selectObj.name\r\n      }\r\n\r\n      this.field.options.dataType = selectObj.dataType\r\n\r\n      this.field.name = selectObj.name\r\n      this.field.desc = selectObj.desc\r\n      this.field.title = selectObj.desc\r\n      this.field.entId = selectObj.entId\r\n      this.field.boDefAlias = selectObj.boDefAlias\r\n      this.field.tableName = selectObj.tableName\r\n      this.field.columnType = selectObj.columnType\r\n      if (selectObj.dataType == 'date') {\r\n        this.field.options.format = selectObj.format\r\n        this.field.options.inputFormat = selectObj.format\r\n      } else if (selectObj.dataType == 'number') {\r\n        this.field.options.maxDecimalDigits = selectObj.decimalLen\r\n        this.field.options.decimalDigits = selectObj.decimalLen\r\n      }\r\n    },\r\n    //给无属性控件设置关联ent属性\r\n    changeNoAttrFile(value){\r\n      let _this = this;\r\n      this.tableFields.forEach(ent =>{\r\n        if(ent.name == value){\r\n          _this.$set(_this.field,'entId',ent.id);\r\n          _this.$set(_this.field,'boDefId',ent.boDefId);\r\n        }\r\n      });\r\n    },\r\n    isChangeWatch() {\r\n      this.isWatch = true\r\n    },\r\n    editI18nMessage(after) {\r\n      this.i18nMessageKey = this.field.fieldPath || this.field.path\r\n      if (this.createKeyMap[this.field.ctrlType]) {\r\n        this.i18nMessageKey = this.formData.formKey + '.' + this.field.ctrlType + Math.random() * 5000\r\n      }\r\n      if (this.i18nMessageKey && after) {\r\n        this.i18nMessageKey += after\r\n      }\r\n      this.$refs.i18nMessageEdit.handleOpen()\r\n    },\r\n    afterSaveI18n(data) {\r\n      data.key = data.key.replace('$', '#')\r\n      if (data.prop.endsWith('placeholder')) {\r\n        this.field.options.placeholder = data.key\r\n        this.field.options.placeholder_zh = data.desc\r\n      } else if (data.prop.endsWith('tip')) {\r\n        this.tooltip = data.key\r\n      } else {\r\n        this.field.desc = data.key\r\n        this.field.desc_zh = data.desc\r\n      }\r\n    },\r\n    isNoAttrField(field){\r\n      if(!field){\r\n        field = this.field;\r\n      }\r\n      if(field.ctrlType=='text' || field.ctrlType=='immediate-single' || field.ctrlType=='immediate-textarea' ||\r\n        (field.ctrlType=='button' && !field.options.bindEventjson.isShowInput)){\r\n        return true;\r\n      }\r\n      return false;\r\n    },\r\n    noAttrFieldListChange(field, isAdd){//无属性控件的变化实时其更新联动列表\r\n      let inList = false;\r\n      this.noAttrFieldList.forEach(item =>{\r\n        if(item.key === field.key){\r\n          if(isAdd){\r\n            inList = true;\r\n          }else{\r\n            this.noAttrFieldList.remove(item);\r\n            return ;\r\n          }\r\n        }\r\n      })\r\n      if(isAdd && !inList){\r\n        if(field.ctrlType == 'button'){\r\n          field.desc = field.options.bindEventjson.name;\r\n        }\r\n        this.noAttrFieldList.push(field);\r\n      }\r\n    }\r\n  },\r\n  watch: {\r\n    data(val) {\r\n      this.field = val\r\n    },\r\n    field: {\r\n      handler(val) {\r\n        // 下拉框 多选isMultiple 属性废弃 使用options.multiple属性 为了兼容以前的代码 将isMultiple true 值赋值给 options.multiple属性\r\n        if (val.ctrlType == 'select' && val.isMultiple) {\r\n          val.options.multiple = true\r\n          val.isMultiple = false\r\n        }\r\n\r\n        if (val.parentNodeType == 'sub' || val.parentNodeType == 'sun') {\r\n          if (val.boSubEntity) {\r\n            this.currentBoSubEntity = val.boSubEntity\r\n            this.tableFields = this.subTables.filter(item => item.name === val.boSubEntity)\r\n            if (this.tableFields.length > 0) {\r\n              for (let e = 0; e < this.tableFields.length; e++) {\r\n                if (this.tableFields[e].children.length > 0) {\r\n                  for (let w = 0; w < this.tableFields[e].children.length; w++) {\r\n                    this.tableFields[e].children[w].keyName = this.tableFields[e].children[w].name\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n\r\n          //如果是孙表，则选取子表里的孙表供选择绑定\r\n          if ((val.ctrlType == 'suntable' || val.ctrlType == 'sunDiv') && this.currentBoSubEntity) {\r\n            this.sunTables = this.sunTablesMap[this.currentBoSubEntity] || []\r\n          }\r\n          //如果是孙表里的控件，则找到这个一个孙表供其选择属性\r\n          if (val.parentNodeType == 'sun') {\r\n            for (const subName in this.sunTablesMap) {\r\n              let sunTabs = this.sunTablesMap[subName]\r\n              if (sunTabs) {\r\n                sunTabs.forEach(sunTab => {\r\n                  if (sunTab.name == this.currentBoSubEntity) {\r\n                    this.tableFields = [sunTab]\r\n                  }\r\n                })\r\n                if (this.tableFields.length > 0) {\r\n                  for (let o = 0; o < this.tableFields.length; o++) {\r\n                    if (this.tableFields[o].children.length > 0) {\r\n                      for (let h = 0; h < this.tableFields[o].children.length; h++) {\r\n                        this.tableFields[o].children[h].keyName = this.tableFields[o].children[h].name\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n        } else {\r\n          if (this.mainBoFields.length > 0) {\r\n            for (let y = 0; y < this.mainBoFields.length; y++) {\r\n              if (this.mainBoFields[y].children.length > 0) {\r\n                for (let t = 0; t < this.mainBoFields[y].children.length; t++) {\r\n                  this.mainBoFields[y].children[t].keyName =\r\n                    this.mainBoFields[y].children[t].path + '.' + this.mainBoFields[y].children[t].name\r\n                }\r\n              }\r\n            }\r\n          }\r\n          if (val && val.ctrlType == 'time') {\r\n            this.tableFields = JSON.parse(JSON.stringify(this.mainBoFields))\r\n            this.tableFields.forEach(table => {\r\n              if (table.children) {\r\n                let newFileds = []\r\n                table.children = table.children.filter(f => f.dataType != 'date' && f.dataType != 'number')\r\n              }\r\n            })\r\n          } else {\r\n            this.mainBoFields.forEach(item => {\r\n              for (let q = 0; q < item.children.length; q++) {\r\n                for (let i = 0; i < item.children.length - 1 - q; i++) {\r\n                  if (item.children[i].index > item.children[i + 1].index) {\r\n                    let temp = item.children[i]\r\n                    item.children[i] = item.children[i + 1]\r\n                    item.children[i + 1] = temp\r\n                  }\r\n                }\r\n              }\r\n            })\r\n            this.tableFields = this.mainBoFields\r\n          }\r\n        }\r\n        //合并数组对象\r\n        let allBoData = []\r\n        let formVarData = []\r\n        let returnData = [] //对话框返回值选择的字段信息 主表对应主表，子表对应子表，孙表对应孙表。\r\n        let returnTypes = ['select', 'dropdown', 'dialog']\r\n        if (((val.ctrlType == 'suntable' || val.ctrlType == 'sunDiv') && this.currentBoSubEntity) || val.parentNodeType == 'sun') {\r\n          this.mainBoFields.forEach(mainBoField => {\r\n            formVarData.push({...mainBoField})\r\n            allBoData.push({...mainBoField})\r\n          })\r\n          if (this.sunTables && this.sunTables.length > 0) {\r\n            this.sunTables.forEach(sunTable => {\r\n              if (val.parentNodeType == 'sun') {\r\n                if (sunTable.name == val.boSubEntity) {\r\n                  allBoData.push({...sunTable})\r\n                  formVarData.push({...sunTable})\r\n                  returnData.push({...sunTable})\r\n                }\r\n              } else {\r\n                allBoData.push({...sunTable})\r\n                formVarData.push({...sunTable})\r\n                returnData.push({...sunTable})\r\n              }\r\n            })\r\n          }\r\n        } else {\r\n          if (val.parentNodeType != 'sub' && returnTypes.includes(val.ctrlType)) {\r\n            //添加主表字段\r\n            this.mainBoFields.forEach(mainBoField => {\r\n              returnData.push({...mainBoField})\r\n            })\r\n          } else if (val.parentNodeType == 'sub' && returnTypes.includes(val.ctrlType)) {\r\n            //添加子表字段\r\n            this.subTables.forEach(subTable => {\r\n              returnData.push({...subTable})\r\n            })\r\n          }\r\n          //添加主表字段\r\n          this.mainBoFields.forEach(mainBoField => {\r\n            allBoData.push({...mainBoField})\r\n          })\r\n          this.subTables.forEach(subTable => {\r\n            allBoData.push({...subTable})\r\n            let sunTabs = this.sunTablesMap[subTable.name]\r\n            if (sunTabs) {\r\n              sunTabs.forEach(sunTab => {\r\n                allBoData.push({...sunTab})\r\n              })\r\n            }\r\n          })\r\n          formVarData = allBoData\r\n        }\r\n        //判断无属性控件 按钮\r\n        if(this.isNoAttrField() &&  \r\n          this.tableFields && this.tableFields.length>0){\r\n          if(!val.name){\r\n            this.$set(val,'name','c_'+val.key);\r\n          }\r\n          if(!val.boDefAlias){\r\n            this.$set(val,'boDefAlias',this.tableFields[0].boDefAlias);\r\n          }\r\n          if(!val.tableName){\r\n            this.$set(val,'tableName',this.tableFields[0].name);\r\n            this.changeNoAttrFile(this.tableFields[0].name);\r\n          }\r\n          this.noAttrFieldListChange(val, true);\r\n        }else if(val.ctrlType == 'button' && val.options.bindEventjson.isShowInput){\r\n          this.noAttrFieldListChange(val, false);\r\n        }\r\n\r\n\r\n        this.allBoData = allBoData\r\n        this.formVarData = formVarData\r\n        this.returnData = returnData\r\n        this.$emit('update:data', val)\r\n        //通过模板生成的表单字段需更改为 建模别名.字段名 （解决2个不同的建模，但主表建模字段一样）\r\n        if (val.target && val.parentNodeType != 'sub' && val.parentNodeType != 'sun') {\r\n          val.target = val.boDefAlias + '.' + val.name\r\n        }\r\n      },\r\n      deep: true\r\n    },\r\n    'field.ctrlType': {\r\n      handler(newVal, oldVal) {\r\n        if (oldVal == undefined || newVal == undefined || newVal == oldVal) {\r\n          return\r\n        }\r\n        if (!this.isWatch) {\r\n          return\r\n        }\r\n        if (oldVal == 'number' || oldVal == 'currency') {\r\n          if (newVal == 'date' || newVal == 'time') {\r\n            this.changeCtrlType(true)\r\n          } else {\r\n            this.changeCtrlType(false)\r\n          }\r\n        } else if (oldVal == 'date' || oldVal == 'time') {\r\n          if (newVal == 'number' || newVal == 'currency') {\r\n            this.changeCtrlType(true)\r\n          } else {\r\n            this.changeCtrlType(false)\r\n          }\r\n        } else if (newVal == 'select') {\r\n          this.changeCtrlType(false)\r\n        } else {\r\n          if (newVal == 'number' || newVal == 'currency') {\r\n            if (this.field.columnType == 'number') {\r\n              this.changeCtrlType(false)\r\n            } else {\r\n              this.changeCtrlType(true)\r\n            }\r\n          } else if (newVal == 'date' || newVal == 'time') {\r\n            if (this.field.columnType == 'date') {\r\n              this.changeCtrlType(false)\r\n            } else {\r\n              this.changeCtrlType(true)\r\n            }\r\n          } else {\r\n            this.changeCtrlType(false)\r\n          }\r\n        }\r\n        this.isWatch = false\r\n      }\r\n    }\r\n  },\r\n  mounted() {\r\n    // 声明\r\n    this.$validator = this.$root.$validator\r\n    // 复制高级字段列表\r\n    this.copyAdvanceComponents = this.advanceComponents.slice()\r\n  },\r\n  destroyed() {}\r\n}\r\n",null]}