{"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]}