| import detailMethods from './detailMethods.js'; | 
| //业务处理方法,全部可以由开发覆盖 | 
| import serviceFilter from './serviceFilter.js'; | 
| let methods = { | 
|   //当添加扩展组件gridHeader/gridBody/gridFooter及明细modelHeader/modelBody/modelFooter时, | 
|   //如果要获取父级Vue对象,请使用此方法进行回调 | 
|   parentCall(fun) { | 
|     if (typeof fun != 'function') { | 
|       return console.log('扩展组件需要传入一个回调方法才能获取父级Vue对象'); | 
|     } | 
|     fun(this); | 
|   }, | 
|   getCurrentAction() { | 
|     if (this.currentReadonly) { | 
|       return ''; | 
|     } | 
|     return '--' + (this.currentAction == this.const.ADD ? '新增' : '编辑'); | 
|   }, | 
|   quickSearchKeyPress($event) { | 
|     //查询字段为input时,按回车查询 | 
|     if ($event.keyCode == 13) { | 
|       if (this.searchFormFields[this.singleSearch.field] != '') { | 
|         this.search(); | 
|       } | 
|     } | 
|   }, | 
|   getButtons() { | 
|     //生成ViewGrid界面的操作按钮及更多选项 | 
|     let searchIndex = this.buttons.findIndex((x) => { | 
|       return x.value == 'Search'; | 
|     }); | 
|     //添加高级查询 | 
|     let hasOneFormItem = | 
|       this.searchFormOptions.length == 1 && | 
|       this.searchFormOptions[0].length == 1; | 
|     if (searchIndex != -1 && !hasOneFormItem) { | 
|       this.buttons.splice(searchIndex + 1, 0, { | 
|         icon: this.fiexdSearchForm ? 'el-icon-refresh-left' : 'el-icon-search', | 
|         name: this.fiexdSearchForm ? '重置' : '高级查询', | 
|         plain: true, | 
|         type: this.buttons[searchIndex].type, | 
|         onClick: () => { | 
|           if (this.fiexdSearchForm) { | 
|             return this.resetSearch(); | 
|           } | 
|           this.searchBoxShow = !this.searchBoxShow; | 
|         } | 
|       }); | 
|     } | 
|     if (hasOneFormItem) { | 
|       this.fiexdSearchForm = false; | 
|     } | 
|     this.maxBtnLength += searchIndex == -1 ? 0 : 1; | 
|     // if (this.buttons.length <= this.maxBtnLength) { | 
|     //   return this.buttons; | 
|     // } | 
|     // let btns = this.buttons.slice(0, this.maxBtnLength); | 
|     // btns[this.maxBtnLength - 1].last = true; | 
|     // return btns; | 
|   }, | 
|   extendBtn(btns, source) { | 
|     //btns权限按钮,source为扩展按钮 | 
|     if (!btns || !(source && source instanceof Array)) { | 
|       return; | 
|     } | 
|     //source通过在表的扩展js文件中buttons对应按钮的属性index决定按钮所放位置 | 
|     source.forEach((x) => { | 
|       //通过按钮的Index属性,放到指定的位置 | 
|       btns.splice(x.index == undefined ? btns.length : x.index, 0, x); | 
|     }); | 
|     // if (this.extend.buttons.view) { | 
|     //     this.extend.buttons.view.forEach((x) => { | 
|     //         //通过按钮的Index属性,放到指定的位置 | 
|     //         this.buttons.splice(x.index == undefined ? this.buttons.length : x.index, 0, x); | 
|     //     }) | 
|     // } | 
|   }, | 
|   initBoxButtons() { | 
|     //初始化ViewGird与弹出框/明细表按钮 | 
|     let path = this.$route.path; | 
|     //通过菜单获取用户所对应菜单需要显示的按钮 | 
|     let permissionButtons = this.permission.getButtons( | 
|       path, | 
|       null, | 
|       this.extend.tableAction, | 
|       this.table.name | 
|     ); | 
|     if (permissionButtons) { | 
|       //2020.03.31添加深拷贝按钮组 | 
|       permissionButtons.forEach((p) => { | 
|         let _obj = {}; | 
|         for (const key in p) { | 
|           _obj[key] = p[key]; | 
|         } | 
|         this.buttons.push(_obj); | 
|       }); | 
|       // this.buttons.push(...permissionButtons); | 
|     } | 
|     if (!this.extend) { | 
|       this.extend = {}; | 
|     } | 
|     if (!this.extend.buttons) { | 
|       this.extend.buttons = {}; | 
|     } | 
|     //查询界面扩展按钮(扩展按钮可自行通过设置按钮的Index属性显示到具体位置) | 
|     if (this.extend.buttons.view) { | 
|       this.extendBtn(this.buttons, this.extend.buttons.view); | 
|     } | 
|   | 
|     //弹出框按钮 | 
|     let boxButtons = []; | 
|   | 
|     let saveBtn = this.buttons.some((x) => { | 
|       if ( | 
|         x.value && | 
|         (x.value.toLowerCase() == this.const.ADD.toLowerCase() || | 
|           x.value.toLowerCase() == this.const.EDIT.toLowerCase()) | 
|       ) | 
|         return true; | 
|     }); | 
|     this.currentReadonly = !saveBtn; | 
|     //从表表格操作按钮 | 
|     let detailGridButtons = { | 
|       name: '刷新', | 
|       type: 'info', | 
|       icon: 'el-icon-refresh', | 
|       onClick() { | 
|         //如果明细表当前的状态为新建时,禁止刷新 | 
|         if (this.currentAction == this.const.ADD) { | 
|           return; | 
|         } | 
|         this.refreshRow(); | 
|       } | 
|     }; | 
|   | 
|     let importExcel = this.buttons.some((x) => { | 
|       if (x.value == this.const.IMPORT) return true; | 
|     }); | 
|     //如果有导入权限,则需要初始化导入组件 | 
|     if (importExcel) { | 
|       this.upload.url = this.getUrl(this.const.IMPORT); | 
|       //定义下载模板的文件名 | 
|       this.upload.template.fileName = this.table.cnName; | 
|       //定义下载模板的Url路径 | 
|       this.upload.template.url = | 
|         this.http.ipAddress + this.getUrl(this.const.DOWNLOADTEMPLATE, true); | 
|     } | 
|   | 
|     // disabled | 
|     //如果当前角色没有编辑或新建功能,查看明细时字段设置全部只读 | 
|     //只有明细表,将明细表也设置为不可能编辑,并且不显示添加行、删除行 | 
|     if (!saveBtn) { | 
|       this.editFormOptions.forEach((row) => { | 
|         row.forEach((x) => { | 
|           x.disabled = true; | 
|         }); | 
|       }); | 
|       //没有新增编辑权限的,弹出框都设置为只读 | 
|       this.detail.columns.forEach((column) => { | 
|         if (column.hasOwnProperty('edit')) { | 
|           column.readonly = true; | 
|           // row['edit'] = false; | 
|         } | 
|       }); | 
|       //弹出框扩展按钮 | 
|       this.extendBtn(boxButtons, this.extend.buttons.box); | 
|       //弹出弹框按钮(2020.04.21),没有编辑或新建权限时,也可以通过buttons属性添加自定义弹出框按钮 | 
|       this.boxButtons.push(...boxButtons); | 
|       this.detailOptions.buttons.push(detailGridButtons); | 
|       this.detailOptions.buttons.forEach((button) => { | 
|         if (!button.hasOwnProperty('hidden')) { | 
|           button.hidden = false; | 
|         } | 
|       }); | 
|       //弹出框扩展明细表按钮 | 
|       this.extendBtn(this.detailOptions.buttons, this.extend.buttons.detail); | 
|   | 
|       return boxButtons; | 
|     } | 
|   | 
|     this.detailOptions.edit = true; | 
|     boxButtons.push( | 
|       ...[ | 
|         { | 
|           name: '保 存', | 
|           icon: 'el-icon-check', | 
|           type: 'danger', | 
|           disabled: false, | 
|           value: 'save', | 
|           onClick() { | 
|             this.save(); | 
|           } | 
|         } | 
|         // { | 
|         //   name: '重 置', | 
|         //   icon: 'el-icon-refresh-right', | 
|         //   type: 'primary', | 
|         //   disabled: false, | 
|         //   onClick() { | 
|         //     this.resetEdit(); | 
|         //   } | 
|         // } | 
|       ] | 
|     ); | 
|     //从表表格操作按钮 | 
|     this.detailOptions.buttons.push( | 
|       ...[ | 
|         { | 
|           name: '添加行', | 
|           icon: 'el-icon-plus', | 
|           type: 'primary', | 
|           hidden: false, | 
|           plain: true, | 
|           onClick() { | 
|             this.addRow(); | 
|           } | 
|         }, | 
|         { | 
|           type: 'danger', | 
|           plain: true, | 
|           name: '删除行', | 
|           hidden: false, | 
|           icon: 'el-icon-delete', | 
|           onClick() { | 
|             this.delRow(); | 
|           } | 
|         }, | 
|         //2022.01.08增加明细表导入导出功能 | 
|         //注意需要重写后台明细表接口的导入与下载模板、导出的权限,Sys_DictionaryListController.cs/SellOrderListController.cs | 
|         { | 
|           type: 'danger', | 
|           plain: true, | 
|           name: '导入', | 
|           value: 'import', | 
|           hidden: false, | 
|           icon: 'el-icon-upload2', | 
|           onClick() { | 
|             this.upload.url = `${this.http.ipAddress}api/${this.detail.table}/${this.const.IMPORT}?table=1`; | 
|             this.upload.template.url = `${this.http.ipAddress}api/${this.detail.table}/${this.const.DOWNLOADTEMPLATE}`; | 
|             //定义下载模板的文件名 | 
|             this.upload.template.fileName = this.detail.cnName; | 
|             this.upload.excel = true; | 
|           } | 
|         }, | 
|         { | 
|           type: 'danger', | 
|           plain: true, | 
|           name: '导出', | 
|           value: 'export', | 
|           icon: 'el-icon-download', | 
|           hidden: false, | 
|           onClick() { | 
|             this.export(true); | 
|           } | 
|         } | 
|       ] | 
|     ); | 
|     this.detailOptions.buttons.forEach((button) => { | 
|       if (button.hasOwnProperty('hidden')) { | 
|         button.hidden = false; | 
|       } | 
|     }); | 
|     //弹出框扩展按钮 | 
|     this.extendBtn(boxButtons, this.extend.buttons.box); | 
|   | 
|     //弹出框扩展明细表按钮 | 
|     this.detailOptions.buttons.push(detailGridButtons); | 
|     this.extendBtn(this.detailOptions.buttons, this.extend.buttons.detail); | 
|   | 
|     //弹出弹框按钮 | 
|     this.boxButtons.push(...boxButtons); | 
|   }, | 
|   onClick(click) { | 
|     click.apply(this); | 
|   }, | 
|   changeDropdown(btnName, v1) { | 
|     let button = this.buttons.filter((x) => { | 
|       return x.name == btnName; | 
|     }); | 
|     if (button && button.length > 0) { | 
|       button[0].onClick.apply(this); | 
|     } | 
|   }, | 
|   emptyValue(value) { | 
|     if (typeof value == 'string' && value.trim() === '') { | 
|       return true; | 
|     } | 
|     if (value instanceof Array && !value.length) { | 
|       return true; | 
|     } | 
|     return value === null || value === undefined || value === ''; | 
|   }, | 
|   getSearchParameters() { | 
|     //获取查询参数 | 
|     // 2020.09.11增加固定查询表单,如果设置固定了查询表单,点击查询时,不再关闭 | 
|     if (!this.fiexdSearchForm) { | 
|       this.searchBoxShow = false; | 
|     } | 
|   | 
|     let query = { wheres: [] }; | 
|     for (const key in this.searchFormFields) { | 
|       let value = this.searchFormFields[key]; | 
|       if (this.emptyValue(value)) continue; | 
|   | 
|       if (typeof value == 'number') { | 
|         value = value + ''; | 
|       } | 
|       let displayType = this.getSearchItem(key); | 
|   | 
|       //联级只保留选中节点的最后一个值 | 
|       if (displayType == 'cascader') { | 
|         //查询下面所有的子节点,如:选中的是父节点,应该查询下面所有的节点数据--待完 | 
|         value = value.length ? value[value.length - 1] + '' : ''; | 
|       } | 
|       //2021.05.02增加区间查询 | 
|       if ( | 
|         typeof value == 'string' || | 
|         ['date', 'datetime', 'range'].indexOf(displayType) == -1 | 
|       ) { | 
|         query.wheres.push({ | 
|           name: key, | 
|           value: | 
|             typeof value == 'string' ? (value + '').trim() : value.join(','), | 
|           displayType: displayType | 
|         }); | 
|         continue; | 
|       } | 
|       for (let index = 0; index < value.length; index++) { | 
|         if (!this.emptyValue(value[index])) { | 
|           query.wheres.push({ | 
|             name: key, | 
|             value: (value[index] + '').trim(), | 
|             displayType: (() => { | 
|               if (['date', 'datetime', 'range'].indexOf(displayType) != -1) { | 
|                 return index ? 'lessorequal' : 'thanorequal'; | 
|               } | 
|               return displayType; | 
|             })() | 
|           }); | 
|         } | 
|       } | 
|     } | 
|     return query; | 
|   }, | 
|   search() { | 
|     //查询 | 
|     // let query = this.getSearchParameters(); | 
|     // this.$refs.table.load(query, true); | 
|     this.$refs.table.load(null, true); | 
|   }, | 
|   loadTableBefore(param, callBack) { | 
|     //查询前设置查询条件及分页信息 | 
|     let query = this.getSearchParameters(); | 
|     if (query) { | 
|       param = Object.assign(param, query); | 
|     } | 
|   | 
|     if (this.$route.query.viewflow && this.$route.query.id) { | 
|       param.wheres.push({ | 
|         name: this.table.key, | 
|         value: this.$route.query.id | 
|       }); | 
|     } | 
|     // if (this.isViewFlow() && data && data.length) { | 
|     //   let query = JSON.parse(JSON.stringify(this.$route.query)); | 
|     //   query.viewflow = 0; | 
|     //   this.$router.replace({ path: this.$route.path, query: query }); | 
|     //   this.$nextTick(() => { | 
|     //     this.getWorkFlowSteps(data[0]); | 
|     //   }); | 
|     // } | 
|     let status = this.searchBefore(param); | 
|     callBack(status); | 
|   }, | 
|   | 
|   loadTableAfter(data, callBack, result) { | 
|     //查询后 | 
|     //2020.10.30增加查询后返回所有的查询信息 | 
|     let status = this.searchAfter(data, result); | 
|     callBack(status); | 
|     //自动弹出框审批详情 | 
|   }, | 
|   loadDetailTableBefore(param, callBack) { | 
|     //明细查询前 | 
|     //新建时禁止加载明细 | 
|     if (this.currentAction == this.const.ADD) { | 
|       callBack(false); | 
|       return false; | 
|     } | 
|     let status = this.searchDetailBefore(param); | 
|     callBack(status); | 
|   }, | 
|   loadDetailTableAfter(data, callBack) { | 
|     //明细查询后 | 
|     let status = this.searchDetailAfter(data); | 
|     callBack(status); | 
|   }, | 
|   getSearchItem(field) { | 
|     //获取查询的参数 | 
|     let data; | 
|     for (let index = 0; index < this.searchFormOptions.length; index++) { | 
|       if (data) return data.type; | 
|       const item = this.searchFormOptions[index]; | 
|       data = item.find((x) => { | 
|         return x.field == field; | 
|       }); | 
|     } | 
|   | 
|     return (data || {}).type; | 
|   }, | 
|   resetSearch() { | 
|     //重置查询对象 | 
|     this.resetSearchForm(); | 
|     //2020.10.17增加重置后方法 | 
|     this.resetSearchFormAfter && this.resetSearchFormAfter(); | 
|   }, | 
|   resetEdit() { | 
|     //重置编辑的数据 | 
|     let isEdit = this.currentAction != this.const.ADD; | 
|     //重置之前 | 
|     if (!this[isEdit ? 'resetUpdateFormBefore' : 'resetAddFormBefore']()) { | 
|       return; | 
|     } | 
|     let objKey = {}; | 
|     //编辑状态下,不需要重置主键,创建时间创建人 | 
|     if (isEdit) { | 
|       objKey[this.table.key] = this.editFormFields[this.table.key]; | 
|     } | 
|     this.resetEditForm(objKey); | 
|     //重置之后 | 
|   | 
|     if (!this[isEdit ? 'resetUpdateFormAfter' : 'resetAddFormAfter']()) { | 
|       return; | 
|     } | 
|   }, | 
|   resetSearchForm(sourceObj) { | 
|     //重置查询表 | 
|     this.resetForm('searchForm', sourceObj); | 
|   }, | 
|   resetEditForm(sourceObj) { | 
|     if (this.hasDetail && this.$refs.detail) { | 
|       // this.$refs.detail.rowData.splice(0); | 
|       this.$refs.detail.reset(); | 
|     } | 
|     this.resetForm('form', sourceObj); | 
|     if (this.$refs.form && this.$refs.form.$refs.volform) { | 
|       setTimeout(() => { | 
|         this.$refs.form.$refs.volform.clearValidate(); | 
|       }, 100); | 
|     } | 
|   }, | 
|   getKeyValueType(formData, isEditForm) { | 
|     try { | 
|       let keyLeft = (isEditForm ? 'e' : 's') + '_b_'; | 
|       formData.forEach((item) => { | 
|         item.forEach((x) => { | 
|           if (this.keyValueType.hasOwnProperty(keyLeft + x.field)) { | 
|             return true; | 
|           } | 
|           let data; | 
|           if (x.type == 'switch') { | 
|             this.keyValueType[x.field] = 1; | 
|           } else if (x.bind && x.bind.data) { | 
|             data = x.bind.data; | 
|           } else if (x.data) { | 
|             if (x.data instanceof Array) { | 
|               data = x.data; | 
|             } else if (x.data.data && x.data.data instanceof Array) { | 
|               data = x.data.data; | 
|             } | 
|           } | 
|           if ( | 
|             data && | 
|             data.length > 0 && | 
|             !this.keyValueType.hasOwnProperty(x.field) | 
|           ) { | 
|             this.keyValueType[x.field] = data[0].key; | 
|             this.keyValueType[keyLeft + x.field] = x.type; | 
|           } | 
|         }); | 
|       }); | 
|     } catch (error) { | 
|       console.log(error.message); | 
|     } | 
|   }, | 
|   resetForm(formName, sourceObj) { | 
|     //   return; | 
|     //重置表单数据 | 
|     if (this.$refs[formName]) { | 
|       this.$refs[formName].reset(); | 
|     } | 
|   | 
|     if (!sourceObj) return; | 
|     let form, keyLeft; | 
|     if (formName == 'searchForm') { | 
|       form = this.searchFormFields; | 
|       keyLeft = 's' + '_b_'; | 
|     } else { | 
|       form = this.editFormFields; | 
|       keyLeft = 'e' + '_b_'; | 
|     } | 
|     //获取数据源的data类型,否则如果数据源data的key是数字,重置的值是字符串就无法绑定值 | 
|     if (!this.keyValueType._dinit) { | 
|       this.getKeyValueType(this.editFormOptions, true); | 
|       this.getKeyValueType(this.searchFormOptions, false); | 
|       this.keyValueType._dinit = true; | 
|     } | 
|     var _cascaderParentTree; | 
|     for (const key in form) { | 
|       if (sourceObj.hasOwnProperty(key)) { | 
|         let newVal = sourceObj[key]; | 
|         let kv_type = this.keyValueType[keyLeft + key]; | 
|   | 
|         if ( | 
|           kv_type == 'selectList' || | 
|           kv_type == 'checkbox' || | 
|           kv_type == 'cascader' || | 
|           kv_type == 'treeSelect' | 
|         ) { | 
|           // 2020.05.31增加iview组件Cascader | 
|           // 2020.11.01增加iview组件Cascader表单重置时查询所有的父节点 | 
|           if (kv_type == 'cascader' || kv_type == 'treeSelect') { | 
|             var treeDic = this.dicKeys.find((dic) => { | 
|               return dic.fileds && dic.fileds.indexOf(key) != -1; | 
|             }); | 
|   | 
|             if (treeDic && treeDic.orginData && treeDic.orginData.length) { | 
|               let keyIsNum = typeof treeDic.orginData[0].id == 'number'; | 
|   | 
|               if (kv_type == 'cascader') { | 
|                 newVal = keyIsNum ? newVal * 1 || 0 : newVal + ''; | 
|                 if (kv_type == 'cascader') { | 
|                   _cascaderParentTree = this.base.getTreeAllParent( | 
|                     newVal, | 
|                     treeDic.orginData | 
|                   ); | 
|                   if (_cascaderParentTree) { | 
|                     newVal = _cascaderParentTree.map((x) => { | 
|                       return x.id; | 
|                     }); | 
|                   } | 
|                 } | 
|               } else { | 
|                 if (newVal === null || newVal === undefined) { | 
|                   newVal = []; | 
|                 } else if (typeof newVal == 'string') { | 
|                   newVal = newVal.split(','); | 
|                 } | 
|                 if (keyIsNum) { | 
|                   if (Array.isArray(newVal)) { | 
|                     newVal = newVal.map((x) => { | 
|                       return x * 1 || 0; | 
|                     }); | 
|                   } | 
|                 } else if (typeof newVal == 'number') { | 
|                   newVal = [newVal + '']; | 
|                 } | 
|               } | 
|             } else { | 
|               newVal = [newVal]; | 
|             } | 
|           } else if ( | 
|             newVal != '' && | 
|             newVal != undefined && | 
|             typeof newVal == 'string' | 
|           ) { | 
|             newVal = newVal.split(','); | 
|           } else if (kv_type == 'checkbox') { | 
|             newVal = []; | 
|           } | 
|         } else if ( | 
|           this.keyValueType.hasOwnProperty(key) && | 
|           typeof this.keyValueType[key] == 'number' && | 
|           newVal * 1 == newVal | 
|         ) { | 
|           newVal = newVal * 1; | 
|         } else { | 
|           if (newVal == null || newVal == undefined) { | 
|             newVal = ''; | 
|           } else if (this.numberFields.indexOf(key) != -1) { | 
|             newVal = newVal * 1 || 0; | 
|           } else { | 
|             newVal += ''; | 
|           } | 
|         } | 
|         if (newVal instanceof Array) { | 
|           if (form[key]) { | 
|             form[key] = []; | 
|           } | 
|           form[key] = newVal; | 
|         } else { | 
|           form[key] = newVal; | 
|         } | 
|       } else { | 
|         form[key] = form[key] instanceof Array ? [] : ''; | 
|       } | 
|     } | 
|   }, | 
|   onBtnClick(param) { | 
|     this[param.method](param.data); | 
|   }, | 
|   refresh() { | 
|     //刷新 | 
|     this.search(); | 
|     // this.$refs.table.load(); | 
|   }, | 
|   saveBefore(formData) { | 
|     return true; | 
|   }, | 
|   saveAfter(formData, result) { | 
|     return true; | 
|   }, | 
|   save() { | 
|     //新增或编辑时保存 | 
|     // if (!this.$refs.form.validate()) return; | 
|     this.$refs.form.validate((result) => { | 
|       if (result) { | 
|         this.saveExecute(); | 
|       } | 
|     }); | 
|   }, | 
|   async saveExecute() { | 
|     let editFormFields = {}; | 
|     //上传文件以逗号隔开 | 
|     for (const key in this.editFormFields) { | 
|       if ( | 
|         this.uploadfiled && | 
|         this.uploadfiled.length > 0 && | 
|         this.uploadfiled.indexOf(key) != -1 && | 
|         this.editFormFields[key] instanceof Array | 
|       ) { | 
|         let allPath = this.editFormFields[key].map((x) => { | 
|           return x.path; | 
|         }); | 
|         editFormFields[key] = allPath.join(','); | 
|       } else if (typeof this.editFormFields[key] == 'function') { | 
|         try { | 
|           editFormFields[key] = this.editFormFields[key](); | 
|         } catch (error) { } | 
|       } else { | 
|         //2021.05.30修复下拉框清除数据后后台不能保存的问题 | 
|         if ( | 
|           this.editFormFields[key] === undefined && | 
|           this.dicKeys.some((x) => { | 
|             return x.fileds && x.fileds.indexOf(key) != -1; | 
|           }) | 
|         ) { | 
|           editFormFields[key] = null; | 
|         } else { | 
|           editFormFields[key] = this.editFormFields[key]; | 
|         } | 
|       } | 
|     } | 
|     //将数组转换成string | 
|     //2020.11.01增加级联处理 | 
|     for (const key in editFormFields) { | 
|       if (editFormFields[key] instanceof Array) { | 
|         var iscascader = this.dicKeys.some((x) => { | 
|           return ( | 
|             x.type == 'cascader' && x.fileds && x.fileds.indexOf(key) != -1 | 
|           ); | 
|         }); | 
|         if (iscascader && editFormFields[key].length) { | 
|           editFormFields[key] = | 
|             editFormFields[key][editFormFields[key].length - 1]; | 
|         } else { | 
|           editFormFields[key] = editFormFields[key].join(','); | 
|         } | 
|       } | 
|     } | 
|   | 
|     let formData = { | 
|       mainData: editFormFields, | 
|       detailData: null, | 
|       delKeys: null | 
|     }; | 
|   | 
|     //获取明细数据(前台数据明细未做校验,待完.后台已经校验) | 
|     if (this.hasDetail) { | 
|       formData.detailData = this.$refs.detail.rowData; | 
|       let _fields = this.detail.columns | 
|         .filter((c) => { | 
|           return ( | 
|             c.type == 'selectList' || (c.edit && c.edit.type == 'selectList') | 
|           ); | 
|         }) | 
|         .map((c) => { | 
|           return c.field; | 
|         }); | 
|       //2022.06.20增加保存时对明细表下拉框多选的判断 | 
|       if (_fields.length) { | 
|         formData.detailData = JSON.parse(JSON.stringify(formData.detailData)); | 
|         formData.detailData.forEach((row) => { | 
|           for (let index = 0; index < _fields.length; index++) { | 
|             const _field = _fields[index]; | 
|             if (Array.isArray(row[_field])) { | 
|               row[_field] = row[_field].join(','); | 
|             } | 
|           } | 
|         }); | 
|       } | 
|     } | 
|     if (this.detailOptions.delKeys.length > 0) { | 
|       formData.delKeys = this.detailOptions.delKeys; | 
|     } | 
|     //保存前拦截 | 
|     let _currentIsAdd = this.currentAction == this.const.ADD; | 
|     if (_currentIsAdd) { | 
|       //2020.12.06增加新建前异步处理方法 | 
|       //2021.08.16修复异步语法写错的问题 | 
|       if (!this.addBefore(formData) || !(await this.addBeforeAsync(formData))) | 
|         return; | 
|     } else { | 
|       //2020.12.06增加修改前异步处理方法 | 
|       if ( | 
|         !this.updateBefore(formData) || | 
|         !(await this.updateBeforeAsync(formData)) | 
|       ) | 
|         return; | 
|     } | 
|     let url = this.getUrl(this.currentAction); | 
|     this.http.post(url, formData, true).then((x) => { | 
|       //保存后 | 
|       if (_currentIsAdd) { | 
|         if (!this.addAfter(x)) return; | 
|         //连续添加 | 
|         if (this.continueAdd && x.status) { | 
|           this.$success(x.message); | 
|           //新建 | 
|           this.currentAction = this.const.ADD; | 
|           this.currentRow = {}; | 
|           this.resetAdd(); | 
|           this.refresh(); | 
|           return; | 
|         } | 
|       } else { | 
|         if (!this.updateAfter(x)) return; | 
|       } | 
|       if (!x.status) return this.$error(x.message); | 
|       this.$success(x.message || '操作成功'); | 
|       //如果保存成功后需要关闭编辑框,直接返回不处理后面 | 
|       if (this.boxOptions.saveClose) { | 
|         this.boxModel = false; | 
|         //2020.12.27如果是编辑保存后不重置分页页数,刷新页面时还是显示当前页的数据 | 
|         this.$refs.table.load(null, _currentIsAdd); | 
|         //this.refresh(); | 
|         return; | 
|       } | 
|       let resultRow; | 
|       if (typeof x.data == 'string' && x.data != '') { | 
|         resultRow = JSON.parse(x.data); | 
|       } else { | 
|         resultRow = x.data; | 
|       } | 
|   | 
|       if (this.currentAction == this.const.ADD) { | 
|         //  this.currentRow=x.data; | 
|         this.editFormFields[this.table.key] = ''; | 
|         this.currentAction = this.const.EDIT; | 
|         this.currentRow = resultRow.data; | 
|       } | 
|       this.resetEditForm(resultRow.data); | 
|       // console.log(resultRow); | 
|       if (this.hasDetail) { | 
|         this.detailOptions.delKeys = []; | 
|         if (resultRow.list) { | 
|           this.$refs.detail.rowData.push(...resultRow.list); | 
|         } | 
|       } | 
|       this.$refs.table.load(null, _currentIsAdd); | 
|       // this.refresh(); | 
|     }); | 
|   }, | 
|   del(rows) { | 
|     if (rows) { | 
|       if (!(rows instanceof Array)) { | 
|         rows = [rows]; | 
|       } | 
|     } else { | 
|       rows = this.$refs.table.getSelected(); | 
|     } | 
|     //删除数据 | 
|   | 
|     if (!rows || rows.length == 0) return this.$error('请选择要删除的行!'); | 
|     let delKeys = rows.map((x) => { | 
|       return x[this.table.key]; | 
|     }); | 
|     if (!delKeys || delKeys.length == 0) | 
|       return this.$error('没有获取要删除的行数据!'); | 
|     //删除前 | 
|     if (!this.delBefore(delKeys, rows)) { | 
|       return; | 
|     } | 
|     let tigger = false; | 
|     this.$confirm('确认要删除选择的数据吗?', '警告', { | 
|       confirmButtonText: '确定', | 
|       cancelButtonText: '取消', | 
|       type: 'warning', | 
|       center: true | 
|     }).then(() => { | 
|       if (tigger) return; | 
|       tigger = true; | 
|       let url = this.getUrl(this.const.DEL); | 
|       this.http.post(url, delKeys, '正在删除数据....').then((x) => { | 
|         if (!x.status) return this.$error(x.message); | 
|         this.$success("删除成功"); | 
|         //删除后 | 
|         if (!this.delAfter(x)) { | 
|           return; | 
|         } | 
|         this.refresh(); | 
|       }); | 
|     }); | 
|   }, | 
|   async modelOpenBeforeAsync(row) { | 
|     return true; | 
|   }, | 
|   async initBox() { | 
|     //2022.01.08增加新建时隐藏明细表导出功能 | 
|     this.detailOptions.buttons.forEach((x) => { | 
|       if (x.value == 'export') { | 
|         x.hidden = this.currentAction == 'Add'; | 
|       } | 
|     }); | 
|     //初始化新建、编辑的弹出框 | 
|     if (!(await this.modelOpenBeforeAsync(this.currentRow))) return false; | 
|     this.modelOpenBefore(this.currentRow); | 
|     if (!this.boxInit) { | 
|       this.boxInit = true; | 
|       this.boxModel = true; | 
|       // this.detailUrl = this.url; | 
|     } | 
|     return true; | 
|   }, | 
|   setEditForm(row) { | 
|     // if (this.remoteColumns.length == 0 || !rows || rows.length == 0) return; | 
|     let remoteColumns = this.$refs.table.remoteColumns; | 
|     remoteColumns.forEach((column) => { | 
|       this.editFormOptions.forEach((option) => { | 
|         option.forEach((x) => { | 
|           if (x.field == column.field) { | 
|             x.data.data = Object.assign([], x.data, column.bind.data); | 
|           } | 
|         }); | 
|       }); | 
|     }); | 
|     this.editFormFields; | 
|     //重置编辑表单数据 | 
|     this.editFormFields[this.table.key] = row[this.table.key]; | 
|   | 
|     this.resetEditForm(row); | 
|     this.currentAction = this.const.EDIT; | 
|     this.boxModel = true; | 
|   }, | 
|   async linkData(row, column) { | 
|     this.boxOptions.title = this.table.cnName + '(编辑)'; | 
|     //点击table单元格快捷链接显示编辑数据 | 
|     this.currentAction = this.const.EDIT; | 
|     this.currentRow = row; | 
|     if (!(await this.initBox())) return; | 
|     this.resetDetailTable(row); | 
|     this.setEditForm(row); | 
|     this.setContinueAdd(false); | 
|     //设置远程查询表单的默认key/value | 
|     this.getRemoteFormDefaultKeyValue(); | 
|     //点击编辑按钮弹出框后,可以在此处写逻辑,如,从后台获取数据 | 
|     this.modelOpenProcess(row); | 
|   }, | 
|   setContinueAdd(isAdd) { | 
|     if (!this.continueAdd) return; | 
|     var _button = this.boxButtons.find((x) => { | 
|       return x.value == 'save'; | 
|     }); | 
|     if (_button) { | 
|       _button.name = isAdd ? this.continueAddName : '保 存'; | 
|     } | 
|   }, | 
|   resetAdd() { | 
|     if (this.hasDetail) { | 
|       this.$refs.detail && | 
|         //  this.$refs.detail.rowData && | 
|         this.$refs.detail.reset(); | 
|     } | 
|     let obj = {}; | 
|     //如果有switch标签,默认都设置为否 | 
|     this.editFormOptions.forEach((x) => { | 
|       x.forEach((item) => { | 
|         if (item.type == 'switch') { | 
|           obj[item.field] = 0; | 
|         } | 
|       }); | 
|     }); | 
|     this.resetEditForm(obj); | 
|   }, | 
|   async add() { | 
|     this.boxOptions.title = this.table.cnName + '(新建)'; | 
|     //新建 | 
|     this.currentAction = this.const.ADD; | 
|     this.currentRow = {}; | 
|     if (!(await this.initBox())) return; | 
|   | 
|     this.resetAdd(); | 
|     this.setContinueAdd(true); | 
|     //  this.resetEditForm(); | 
|     this.boxModel = true; | 
|     //点击新建按钮弹出框后,可以在此处写逻辑,如,从后台获取数据 | 
|     this.modelOpenProcess(); | 
|     // this.modelOpenAfter(); | 
|   }, | 
|   async edit(rows) { | 
|     this.boxOptions.title = '编辑'; | 
|     //编辑 | 
|     this.currentAction = this.const.EDIT; | 
|     if (rows) { | 
|       if (!(rows instanceof Array)) { | 
|         rows = [rows]; | 
|       } | 
|     } else { | 
|       rows = this.$refs.table.getSelected(); | 
|     } | 
|     if (rows.length == 0) { | 
|       return this.$error('请选择要编辑的行!'); | 
|     } | 
|     if (rows.length != 1) { | 
|       return this.$error('只能选择一行数据进行编辑!'); | 
|     } | 
|     //记录当前编辑的行 | 
|     this.currentRow = rows[0]; | 
|     //初始化弹出框 | 
|     if (!(await this.initBox())) return; | 
|     this.setContinueAdd(false); | 
|     //重置表单 | 
|     this.resetDetailTable(); | 
|   | 
|     //设置当前的数据到表单上 | 
|     this.setEditForm(rows[0]); | 
|     //设置远程查询表单的默认key/value | 
|     this.getRemoteFormDefaultKeyValue(); | 
|     //点击编辑按钮弹出框后,可以在此处写逻辑,如,从后台获取数据 | 
|     this.modelOpenProcess(rows[0]); | 
|     // this.modelOpenAfter(rows[0]); | 
|   }, | 
|   getRemoteFormDefaultKeyValue() { | 
|     //设置表单远程数据源的默认key.value | 
|     if (this.currentAction != this.const.EDIT || this.remoteKeys.length == 0) | 
|       return; | 
|     this.editFormOptions.forEach((x, xIndex) => { | 
|       x.forEach((item, yIndex) => { | 
|         if (item.remote) { | 
|           let column = this.columns.find((x) => { | 
|             return x.bind && x.bind.key == item.dataKey; | 
|           }); | 
|           if (!column) return; | 
|           let key = this.currentRow[item.field]; | 
|           let obj = column.bind.data.find((x) => { | 
|             return x.key == key; | 
|           }); | 
|           // obj ? obj.value : key如果没有查到数据源,直接使用原数据 | 
|           item.data = [{ key: key, value: obj ? obj.value : key }]; | 
|           this.editFormOptions[xIndex].splice(yIndex, 1, item); | 
|           // this.$set(item, 'data', [{ key: key + '', value: obj.value }]) | 
|           //  item.data = [{ key: key + '', value: obj.value }]; | 
|         } | 
|       }); | 
|     }); | 
|   }, | 
|   modelOpenProcess(row) { | 
|     this.$nextTick(() => { | 
|       this.modelOpenAfter(row); | 
|     }); | 
|     return; | 
|     // if (!this.$refs.form) { | 
|     //     let timeOut = setTimeout(x => { | 
|     //         this.modelOpenAfter(row); | 
|     //     }, 500) | 
|     //     return; | 
|     // } | 
|     // this.modelOpenAfter(row); | 
|   }, | 
|   import() { | 
|     //导入(上传excel),弹出导入组件UploadExcel.vue | 
|     this.upload.excel = true; | 
|     this.$refs.upload_excel && this.$refs.upload_excel.reset(); | 
|   }, | 
|   download(url, fileName) { | 
|     //下载导出的文件 | 
|     let xmlResquest = new XMLHttpRequest(); | 
|     xmlResquest.open('GET', url, true); | 
|     xmlResquest.setRequestHeader('Content-type', 'application/json'); | 
|     xmlResquest.setRequestHeader( | 
|       'Authorization', | 
|       this.$store.getters.getToken() | 
|     ); | 
|     let elink = this.$refs.export; | 
|     xmlResquest.responseType = 'blob'; | 
|     xmlResquest.onload = function (oEvent) { | 
|       if (xmlResquest.status != 200) { | 
|         this.$error('下载文件出错了..'); | 
|         return; | 
|       } | 
|       let content = xmlResquest.response; | 
|       //  let elink = this.$refs.export;//document.createElement("a"); | 
|       elink.download = fileName; //+".xlsx"; | 
|       // elink.style.display = "none"; | 
|       let blob = new Blob([content]); | 
|       elink.href = URL.createObjectURL(blob); | 
|       //  document.body.appendChild(elink); | 
|       elink.click(); | 
|       //  document.body.removeChild(elink); | 
|     }; | 
|     xmlResquest.send(); | 
|   }, | 
|   getFileName(isDetail) { | 
|     //2021.01.08增加导出excel时自定义文件名 | 
|     if (isDetail) { | 
|       return this.detail.cnName + '.xlsx'; | 
|     } | 
|     return this.table.cnName + '.xlsx'; | 
|   }, | 
|   export(isDetail) { | 
|     //导出 | 
|     let url, query, param; | 
|     if (isDetail) { | 
|       //明细表导出时如果是新建状态,禁止导出 | 
|       if (this.currentAction == 'Add') { | 
|         return; | 
|       } | 
|       url = `api/${this.detail.table}/${this.const.EXPORT}`; | 
|       param = { | 
|         wheres: [ | 
|           { name: this.table.key, value: this.editFormFields[this.table.key] } | 
|         ] | 
|       }; | 
|     } else { | 
|       //主表导出 | 
|       url = this.getUrl(this.const.EXPORT); | 
|       query = this.getSearchParameters(); | 
|       param = { order: this.pagination.order, wheres: query.wheres || [] }; | 
|     } | 
|     //2020.06.25增加导出前处理 | 
|     if (!isDetail && !this.exportBefore(param)) { | 
|       return; | 
|     } | 
|   | 
|     if (param.wheres && typeof param.wheres == 'object') { | 
|       param.wheres = JSON.stringify(param.wheres); | 
|     } | 
|     let $http = this.http; | 
|     //2022.09.26增加自定义导出文件名 | 
|     let fileName = this.downloadFileName || this.getFileName(isDetail); | 
|     //2021.01.08优化导出功能 | 
|     $http | 
|       .post(url, param, '正在导出数据....', { responseType: 'blob' }) | 
|       .then((content) => { | 
|         const blob = new Blob([content]); | 
|         if ('download' in document.createElement('a')) { | 
|           // 非IE下载 | 
|           const elink = document.createElement('a'); | 
|           elink.download = fileName; | 
|           elink.style.display = 'none'; | 
|           elink.href = URL.createObjectURL(blob); | 
|           document.body.appendChild(elink); | 
|           elink.click(); | 
|           URL.revokeObjectURL(elink.href); | 
|           document.body.removeChild(elink); | 
|         } else { | 
|           // IE10+下载 | 
|           navigator.msSaveBlob(blob, fileName); | 
|         } | 
|       }); | 
|     //.then(result => { | 
|     // if (!result.status) { | 
|     //   return this.$error(result.message); | 
|     // } | 
|     // let path = this.getUrl(this.const.DOWNLOAD); | 
|     // path = path[0] == "/" ? path.substring(1) : path; | 
|     // this.download( | 
|     //   $http.ipAddress + path + "?path=" + result.data, | 
|     //   this.table.cnName + ".xlsx" // filePath | 
|     // ); | 
|     ///  window.open($http.ipAddress + path + "?fileName=" + filePath, "_self"); | 
|     // }); | 
|   }, | 
|   getSelectRows() { | 
|     //获取选中的行 | 
|     return this.$refs.table.getSelected(); | 
|   }, | 
|   getDetailSelectRows() { | 
|     //或获取明细选中的行 | 
|     if (!this.$refs.detail) { | 
|       return []; | 
|     } | 
|     return this.$refs.detail.getSelected(); | 
|   }, | 
|   audit() { | 
|     //审核弹出框 | 
|     let rows = this.$refs.table.getSelected(); | 
|     if (rows.length == 0) return this.$error('请选择要审核的行!'); | 
|     let auditStatus = Object.keys(rows[0]).find(x => { return x.toLowerCase() === 'auditstatus' }); | 
|     if (!auditStatus) { | 
|       return this.$message.error(`表必须包括审核字段【AuditStatus】,并且是int类型`) | 
|     } | 
|     // let checkStatus = rows.every((x) => { | 
|     //   return this.$global.audit.status.some(c => { return c === x[auditStatus] || !x[auditStatus] }) | 
|     // }); | 
|     // if (!checkStatus) return this.$error('只能选择待审批或审核中的数据!'); | 
|     this.$refs.audit.open(rows); | 
|   }, | 
|   saveAudit(params, rows, callback) { | 
|   | 
|     //保存审核 | 
|     let keys = rows.map(x => { return x[this.table.key] }); | 
|     if (!this.auditBefore(keys, rows)) { | 
|       return; | 
|     } | 
|     let url = `${this.getUrl(this.const.AUDIT)}?auditReason=${params.reason}&auditStatus=${params.value}` | 
|     this.http.post(url, keys, '审核中....').then((x) => { | 
|       if (!this.auditAfter(x, keys)) { | 
|         return; | 
|       } | 
|       if (!x.status) return this.$error(x.message); | 
|   | 
|       callback && callback(x); | 
|       this.$success(x.message); | 
|       this.refresh(); | 
|     }); | 
|   }, | 
|   viewModelCancel() { | 
|     //查看表结构 | 
|     this.viewModel = false; | 
|   }, | 
|   initFormOptions(formOptions, keys, formFields, isEdit) { | 
|     //初始化查询、编辑对象的下拉框数据源、图片上传链接地址 | 
|     //let defaultOption = { key: "", value: "请选择" }; | 
|     //有上传的字段 | 
|     //2020.05.03新增 | 
|     //编辑数据源的类型 | 
|     formOptions.forEach((item) => { | 
|       item.forEach((d) => { | 
|         if (d.type == 'number') { | 
|           //2022.08.22优化表单类型为number时的默认值 | 
|           if (formFields[d.field] === '') { | 
|             formFields[d.field] = undefined; | 
|           } | 
|           this.numberFields.push(d.field); | 
|         } | 
|         if ( | 
|           d.type == 'img' || | 
|           d.type == 'excel' || | 
|           d.type == 'file' || | 
|           d.columnType == 'img' | 
|         ) { | 
|           d.url = this.http.ipAddress + 'api' + this.table.url + 'Upload'; | 
|           this.uploadfiled.push(d.field); | 
|         } | 
|         if (!d.dataKey) return true; | 
|         //2022.02.20强制开启联级可以选择某个节点 | 
|         if (d.type == 'cascader' && !d.hasOwnProperty('changeOnSelect')) { | 
|           //强制开启联级可以选择某个节点 | 
|           d.changeOnSelect = true; | 
|         } | 
|         //开启远程搜索 | 
|         if (d.remote) { | 
|           this.remoteKeys.push(d.dataKey); | 
|           d.data = []; //{ dicNo: d.dataKey, data: [] }; | 
|           return true; | 
|         } | 
|         //2020.05.03增加编辑表单对checkbox的支持 | 
|         if (d.type == 'checkbox' && !(formFields[d.field] instanceof Array)) { | 
|           formFields[d.field] = []; | 
|         } | 
|         if (keys.indexOf(d.dataKey) == -1) { | 
|           //2020.05.03增加记录编辑字段的数据源类型 | 
|   | 
|           keys.push(d.dataKey); | 
|           //2020.05.03修复查询表单与编辑表单type类型变成强一致性的问题 | 
|           //this.dicKeys.push({ dicNo: d.dataKey, data: [], type: d.type }); | 
|           //  2020.11.01增加iview组件Cascader数据源存储 | 
|           let _dic = { | 
|             dicNo: d.dataKey, | 
|             data: [], | 
|             fileds: [d.field], | 
|             orginData: [] | 
|           }; | 
|           if (d.type == 'cascader') { | 
|             _dic.type = 'cascader'; | 
|           } | 
|           if (isEdit) { | 
|             _dic['e_type'] = d.type; | 
|           } | 
|           this.dicKeys.push(_dic); | 
|         } else if (d.type == 'cascader') { | 
|           this.dicKeys.forEach((x) => { | 
|             if (x.dicNo == d.dataKey) { | 
|               x.type = 'cascader'; | 
|               x.fileds.push(d.field); | 
|             } | 
|           }); | 
|         } | 
|         if (d.type != 'cascader') { | 
|           //2020.01.30移除内部表单formOptions数据源配置格式data.data,所有参数改为与组件api格式相同 | 
|           Object.assign( | 
|             d, | 
|             this.dicKeys.filter((f) => { | 
|               return f.dicNo == d.dataKey; | 
|             })[0], | 
|             { type: d.type } | 
|           ); | 
|         } | 
|       }); | 
|     }); | 
|   }, | 
|   //初始table与明细表的数据源指向dicKeys对象,再去后台加载数据源 | 
|   initColumns(scoure, dicKeys, keys) { | 
|     if (!scoure || !(scoure instanceof Array)) return; | 
|     scoure.forEach((item) => { | 
|       if (!item.bind || (item.bind.data && item.bind.data.length > 0)) | 
|         return true; | 
|       let key = item.bind.key || item.bind.dicNo; | 
|       if (this.remoteKeys.indexOf(key) != -1) { | 
|         item.bind.remote = true; | 
|         return true; | 
|       } | 
|       if (this.hasKeyField.indexOf(item.field) == -1) { | 
|         this.hasKeyField.push(item.field); | 
|       } | 
|       var dic = dicKeys.filter((x) => { | 
|         return x.dicNo == key; | 
|       }); | 
|       if (!dic || dic.length == 0) { | 
|         dicKeys.push({ dicNo: key, data: [] }); | 
|         dic = [dicKeys[dicKeys.length - 1]]; | 
|         keys.push(key); | 
|       } | 
|       //2020.11.01增加级联处理 | 
|       if (dic[0].type == 'cascader' || dic[0].type == 'treeSelect') { | 
|         item.bind = { data: dic[0].orginData, type: 'select', key: key }; | 
|       } else { | 
|         item.bind = dic[0]; | 
|       } | 
|       //2020.05.03优化table数据源checkbox与select类型从编辑列中选取 | 
|       item.bind.type = item.bind.e_type || 'string'; | 
|     }); | 
|   }, | 
|   bindOptions(dic) { | 
|     //绑定下拉框的数据源 | 
|     //绑定后台的字典数据 | 
|     dic.forEach((d) => { | 
|       if (d.data.length >= (this.select2Count || 500)) { | 
|         if ( | 
|           !this.dicKeys.some((x) => { | 
|             return ( | 
|               x.dicNo == d.dicNo && | 
|               (x.type == 'cascader' || x.type == 'treeSelect') | 
|             ); | 
|           }) | 
|         ) { | 
|           d.data.forEach((item) => { | 
|             item.label = item.value; | 
|             item.value = item.key; | 
|           }); | 
|         } | 
|       } | 
|       this.dicKeys.forEach((x) => { | 
|         if (x.dicNo != d.dicNo) return true; | 
|         //2020.10.26增加级联数据源绑定处理 | 
|         if (x.type == 'cascader' || x.type == 'treeSelect') { | 
|           // x.data=d.data; | 
|           //生成tree结构 | 
|           let _data = JSON.parse(JSON.stringify(d.data)); | 
|           //2022.04.04增加级联字典数据源刷新后table没有变化的问题 | 
|           this.columns.forEach((column) => { | 
|             if (column.bind && column.bind.key == d.dicNo) { | 
|               column.bind.data = d.data; | 
|             } | 
|           }); | 
|           let arr = this.base.convertTree(_data, (node, data, isRoot) => { | 
|             if (!node.inited) { | 
|               node.inited = true; | 
|               node.label = node.value; | 
|               node.value = node.key; | 
|             } | 
|           }); | 
|           x.data.push(...arr); | 
|           x.orginData.push(...d.data); | 
|           //2021.10.17修复查询级联不能绑定数据源的问题 | 
|           this.searchFormOptions.forEach((searhcOption) => { | 
|             searhcOption.forEach((_option) => { | 
|               if (_option.type == 'cascader' && _option.dataKey == x.dicNo) { | 
|                 _option.data = arr; | 
|                 _option.orginData = d.data; | 
|               } | 
|             }); | 
|           }); | 
|           //2021.10.17修复级联不能二级刷新的问题 | 
|           this.editFormOptions.forEach((editOption) => { | 
|             editOption.forEach((_option) => { | 
|               if ( | 
|                 (_option.type == 'cascader' || _option.type == 'treeSelect') && | 
|                 _option.dataKey == x.dicNo | 
|               ) { | 
|                 _option.data = arr; | 
|                 _option.orginData = d.data; | 
|               } | 
|             }); | 
|           }); | 
|         } else if (d.data.length > 0 && !d.data[0].hasOwnProperty('key')) { | 
|           let source = d.data, | 
|             newSource = new Array(source.length); | 
|           for (let index = 0; index < source.length; index++) { | 
|             newSource[index] = { | 
|               //默认从字典数据读出来的key都是string类型,但如果数据从sql中查询的可能为非string,否是async-validator需要重置设置格式 | 
|               key: source['key'] + '', //source[index][x.config.valueField] + "", | 
|               value: source['value'] //source[index][x.config.textField] | 
|             }; | 
|           } | 
|   | 
|           x.data.push(...newSource); | 
|         } else { | 
|           //2020.06.06,如果是selectList数据源使用的自定义sql并且key是数字,强制转换成字符串 | 
|           if ( | 
|             x.e_type == 'selectList' && | 
|             d.data.length > 0 && | 
|             typeof d.data[0].key == 'number' | 
|           ) { | 
|             d.data.forEach((c) => { | 
|               c.key = c.key + ''; | 
|             }); | 
|           } | 
|           x.data.push(...d.data); | 
|         } | 
|         if ( | 
|           this.singleSearch && | 
|           this.singleSearch.dataKey && | 
|           this.singleSearch.dataKey == x.dicNo | 
|         ) { | 
|           this.singleSearch.data.splice(0, 1, ...x.data); | 
|         } | 
|       }); | 
|     }); | 
|   }, | 
|   getUrl(action, ingorPrefix) { | 
|     //是否忽略前缀/  获取操作的url | 
|     return (!ingorPrefix ? '/' : '') + 'api' + this.table.url + action; | 
|   }, | 
|   | 
|   initDicKeys() { | 
|     //初始化字典数据 | 
|     let keys = []; | 
|     //2022.04.17优化重新加载数据源 | 
|     this.dicKeys.forEach((item) => { | 
|       item.data.splice(0); | 
|       item.orginData && item.orginData.splice(0); | 
|     }); | 
|     //this.dicKeys.splice(0); | 
|     //初始化编辑数据源,默认为一个空数组,如果要求必填设置type=number/decimal的最小值 | 
|     this.initFormOptions(this.editFormOptions, keys, this.editFormFields, true); | 
|     //初始化查询数据源,默认为一个空数组 | 
|     this.initFormOptions( | 
|       this.searchFormOptions, | 
|       keys, | 
|       this.searchFormFields, | 
|       false | 
|     ); | 
|     //查询日期设置为可选开始与结果日期 | 
|     this.searchFormOptions.forEach((item) => { | 
|       item.forEach((x) => { | 
|         if (x.type == 'date' || x.type == 'datetime') x.range = true; | 
|       }); | 
|     }); | 
|     //初始化datatable表数据源,默认为一个空数组,dicKeys为界面所有的数据字典编号 | 
|     this.initColumns(this.columns, this.dicKeys, keys); | 
|     //2021.05.23默认开启查询页面所有字段排序,如果不需要排序,在onInited遍历columns设置sort=false | 
|     //2021.09.25移除强制排序功能 | 
|     // this.columns.forEach(x => { | 
|     //   x.sort = x.render ? false : true; | 
|     // }) | 
|     if (this.detailOptions && this.detailOptions.columns) { | 
|       this.initColumns(this.detailOptions.columns, this.dicKeys, keys); | 
|     } | 
|     //初始化快速查询字段,默认使用代码生成器配置的第一个查询字段 | 
|     if (this.searchFormOptions.length > 0) { | 
|       this.singleSearch = { | 
|         dataKey: this.searchFormOptions[0][0].dataKey, | 
|         dicNo: this.searchFormOptions[0][0].dicNo, | 
|         field: this.searchFormOptions[0][0].field, | 
|         title: this.searchFormOptions[0][0].title, | 
|         type: this.searchFormOptions[0][0].type, | 
|         data: [] | 
|       }; | 
|       // this.singleSearch = this.searchFormOptions[0][0]; | 
|     } | 
|     if (keys.length == 0) return; | 
|     let $this = this; | 
|     this.http.post('/api/Sys_Dictionary/GetVueDictionary', keys).then((dic) => { | 
|   | 
|       $this.bindOptions(dic); | 
|       //2022.04.04增加字典加载完成方法 | 
|       $this.dicInited && $this.dicInited(dic); | 
|     }); | 
|   }, | 
|   setFiexdColumn(columns, containerWidth) { | 
|     //计算整个table的宽度,根据宽度决定是否启用第一行显示的列为固定列 | 
|     //2021.09.21移除强制固定第一列 | 
|     // let columnsWidth = 0; | 
|     // columns.forEach(x => { | 
|     //   if (!x.hidden && x.width) { | 
|     //     columnsWidth += x.width; | 
|     //   } | 
|     // }); | 
|     // //启用第一列为固定列 | 
|     // if (columnsWidth > containerWidth) { | 
|     //   let firstColumn = columns.find(x => !x.hidden); | 
|     //   if (firstColumn) { | 
|     //     firstColumn.fixed = true; | 
|     //   } | 
|     // } | 
|   }, | 
|   initBoxHeightWidth() { | 
|     //初始化弹出框的高度与宽度 | 
|     let clientHeight = document.documentElement.clientHeight; | 
|     //弹出框高度至少250px | 
|     clientHeight = clientHeight < 250 ? 250 : clientHeight; | 
|     let clientWidth = document.documentElement.clientWidth; | 
|     if ( | 
|       this.editFormOptions.some((x) => { | 
|         return x.some((item) => { | 
|           return item.type == 'editor'; | 
|         }); | 
|       }) | 
|     ) { | 
|       this.editor.uploadImgUrl = this.getUrl('upload'); | 
|       this.boxOptions.height = clientHeight * 0.8; | 
|       this.boxOptions.width = clientWidth * 0.8; | 
|     } else { | 
|       if (this.boxOptions.height) { | 
|         //如果高度与宽度超过了获取到的可见高宽度,则设为默认的90%高宽 | 
|         if (this.boxOptions.height > clientHeight * 0.8) { | 
|           this.boxOptions.height = clientHeight * 0.8; | 
|         } | 
|       } | 
|       if (this.boxOptions.width) { | 
|         //如果高度与宽度超过了获取到的可见高宽度,则设为默认的90%高宽 | 
|         if (this.boxOptions.width > clientWidth * 0.8) { | 
|           this.boxOptions.width = clientWidth * 0.8; | 
|         } | 
|       } | 
|     } | 
|     //计算整个table的宽度,根据宽度决定是否启用第一行显示的列为固定列 | 
|     let maxTableWidth = clientWidth - 270; | 
|     this.setFiexdColumn(this.columns, maxTableWidth); | 
|   | 
|     this.height = this.tableHeight || clientHeight - 206; | 
|     this.url = this.getUrl(this.const.PAGE); | 
|     //计算弹出框的高与宽度 | 
|     //如果有明细表,高度与宽带设置为0.9/0.82 | 
|     if (this.detail.columns && this.detail.columns.length > 0) { | 
|       this.hasDetail = true; | 
|       clientWidth = clientWidth * 0.8; | 
|       clientHeight = clientHeight * 0.85; | 
|       if (!this.detailOptions.height) { | 
|         this.detailOptions.height = | 
|           clientHeight - this.editFormOptions.length * 36 - 234; | 
|         this.detailOptions.height = | 
|           this.detailOptions.height < 240 ? 240 : this.detailOptions.height; | 
|       } | 
|   | 
|       this.detailOptions.columns = this.detail.columns; | 
|       this.detailOptions.pagination.sortName = this.detail.sortName; | 
|       this.detailOptions.cnName = this.detail.cnName; | 
|       this.detailOptions.key = this.detail.key; | 
|       this.detailOptions.url = this.getUrl('getDetailPage'); | 
|       //计算弹出框整个table的宽度,根据宽度决定是否启用第一行显示的列为固定列 | 
|       this.setFiexdColumn(this.detail.columns, clientWidth); | 
|     } else { | 
|       let maxColumns = 1; //最大列数,根据列计算弹框的宽度 | 
|       this.editFormOptions.forEach((x) => { | 
|         if (x.length > maxColumns) maxColumns = x.length; | 
|       }); | 
|       let maxHeightRate = 0.7, | 
|         maxWidthRate = 0.5; | 
|       maxWidthRate = maxColumns / 10 + 0.3; | 
|       maxHeightRate = (this.editFormOptions.length || 1) * 0.1 + 0.03; | 
|       maxHeightRate = maxHeightRate > 0.9 ? 0.9 : maxHeightRate; | 
|       clientWidth = clientWidth * maxWidthRate; | 
|       clientHeight = clientHeight * maxHeightRate; | 
|       // this.boxOptions.width = clientWidth * maxWidthRate; | 
|       // this.boxOptions.height = clientHeight * maxHeightRate; | 
|     } | 
|     if (!this.boxOptions.height) { | 
|       this.boxOptions.height = clientHeight + 10; | 
|     } | 
|     if (!this.boxOptions.width) { | 
|       this.boxOptions.width = clientWidth + 30; | 
|     } | 
|   }, | 
|   rowOnChange(row) { | 
|     this.rowChange(row); | 
|   }, | 
|   rowChange(row) { | 
|     //选中行checkbox行事件 | 
|   }, | 
|   rowOnClick({ row, column, event }) { | 
|     this.rowClick({ row, column, event }); | 
|   }, | 
|   rowClick({ row, column, event }) { | 
|     // 点击行事件(2020.11.07) | 
|   }, | 
|   rowOnDbClick({ row, column, event }) { | 
|     this.rowDbClick({ row, column, event }); | 
|   }, | 
|   rowDbClick({ row, column, event }) { | 
|     // 双击击行事件(2021.05.23) | 
|   }, | 
|   $error(message) { | 
|     this.$message.error(message); | 
|     // this.$message({ | 
|     //   type: 'error', | 
|     //   content: message, | 
|     //   duration: 5 | 
|     // }); | 
|   }, | 
|   $success(message) { | 
|     this.$message.success(message); | 
|   }, | 
|   setFiexdSearchForm(visiable) { | 
|     //2020.09.011增加固定查询表单功能,visiable=true默认将查询表单展开 | 
|     this.fiexdSearchForm = true; | 
|     let refreshBtn = this.buttons.find((x) => x.name == '刷 新'); | 
|     if (visiable) { | 
|       this.searchBoxShow = true; | 
|     } | 
|     if (refreshBtn) { | 
|       refreshBtn.name = '重 置'; | 
|       refreshBtn.onClick = function () { | 
|         this.resetSearch(); | 
|       }; | 
|     } | 
|   }, | 
|   tableBeginEdit(row, column, index) { | 
|     //2021.03.19是否开启查询界面表格双击编辑结束方法,返回false不会结束编辑 | 
|     return this.beginEdit(row, column, index); | 
|   }, | 
|   beginEdit(row, column, index) { | 
|     //2021.03.19是否开启查询界面表格双击编辑结束方法,返回false不会结束编辑 | 
|     return true; | 
|   }, | 
|   tableEndEditBefore(row, column, index) { | 
|     return this.endEditBefore(row, column, index); | 
|   }, | 
|   endEditBefore(row, column, index) { | 
|     //2021.03.19是否开启查询界面表格双击编辑结束方法,返回false不会结束编辑 | 
|     return true; | 
|   }, | 
|   filterPermission(tableName, permission) { | 
|     //2021.03.19判断是否有某个表的按钮权限 | 
|     //:["Search","Add","Delete","Update","Import","Export","Upload","Audit"] | 
|     const _result = (this.$store.state.permission || []).find((x) => { | 
|       return x.url == '/' + tableName; | 
|     }); | 
|     return _result && _result.permission.some((x) => x == permission); | 
|   }, | 
|   destroyed() { | 
|     //2021.04.11增加vue页面销毁方法,路由必须设置keepLive:false,设置方法见:前端开发文档-》[禁用页面缓存keepAlive] | 
|   }, | 
|   loadTreeTableChildren(tree, treeNode, resolve) { | 
|     this.loadTreeChildren.call(this, tree, treeNode, resolve); | 
|   }, | 
|   loadTreeChildren(tree, treeNode, resolve) { | 
|     //树形结构加载子节点(2021.05.02),在onInit中设置了rowKey主键字段后才会生效 | 
|     return resolve([]); | 
|   }, | 
|   importDetailAfter(data) { | 
|     //2022.01.08增加明细表导入后处理 | 
|   }, | 
|   importExcelAfter(data) { | 
|     //2022.01.08增加明细表导入后方法判断 | 
|   | 
|     if (!data.status) { | 
|       return; // this.$message.error(data.message); | 
|     } | 
|     //明细表导入 | 
|     if (this.boxModel) { | 
|       if (data.data) { | 
|         data.data = JSON.parse(data.data); | 
|       } else { | 
|         data.data = []; | 
|       } | 
|       data.data.forEach((x) => { | 
|         x[this.detail.key] = undefined; | 
|         x[this.table.key] = undefined; | 
|       }); | 
|       this.importDetailAfter(data); //增加明细表导入后处理 | 
|       this.$refs.detail.rowData.unshift(...data.data); | 
|       this.upload.excel = false; | 
|       return; | 
|     } | 
|     this.importAfter(data); | 
|   }, | 
|   onGridModelClose(iconClick) { | 
|     if (this.isBoxAudit) { | 
|       this.initFormOptionType(false); | 
|     } | 
|     this.isBoxAudit = false; | 
|     this.onModelClose(iconClick); | 
|   }, | 
|   initAuditColumn() { | 
|   | 
|   }, | 
|   getWorkFlowSteps(row) { | 
|     let table = this.table.url.replaceAll('/', ''); | 
|     let url = `api/Sys_WorkFlow/getSteps?tableName=${table}&id=${row[this.table.key] | 
|       }`; | 
|     this.http.get(url, {}, true).then((result) => { | 
|       this.workFlowSteps.splice(0); | 
|       //有可能没有配置审批流程 | 
|       if (!result.list || !result.list.length) { | 
|         result.list = []; | 
|         this.auditParam.showAction = true; | 
|         this.auditParam.height = 240; | 
|         this.auditParam.showViewButton = row.AuditStatus == 0; | 
|       } else { | 
|         this.auditParam.showAction = result.list.some((c) => { | 
|           return c.isCurrentUser; | 
|         }); | 
|         this.auditParam.height = 511; | 
|         this.auditParam.showViewButton = true; | 
|       } | 
|       this.auditParam.reason = ''; | 
|       this.auditParam.status = -1; | 
|       this.auditParam.value = -1; | 
|       if (result.his) { | 
|         result.his.forEach((item) => { | 
|           item.auditStatus = this.getAuditStatus(item.auditStatus); | 
|         }); | 
|       } | 
|   | 
|       this.auditParam.auditHis = result.his; | 
|       this.workFlowSteps.push(...result.list); | 
|       this.isBoxAudit = true; | 
|       this.initFormOptionType(true); | 
|       this.edit(row); | 
|       this.boxOptions.title = '审核'; | 
|     }); | 
|   }, | 
|   initFormOptionType(isReadonly) { | 
|     this.editFormOptions.forEach((options) => { | 
|       options.forEach((option) => { | 
|         if (isReadonly) { | 
|           if (!option.readonly) { | 
|             this.formFieldsType.push(option.field); | 
|             option.readonly = true; | 
|           } | 
|         } else { | 
|           if (this.formFieldsType.indexOf(option.field) != -1) { | 
|             option.readonly = false; | 
|           } | 
|         } | 
|       }); | 
|     }); | 
|   }, | 
|   getAuditStatus(status) { | 
|     let data = this.auditParam.data.find((x) => { | 
|       return x.value == status; | 
|     }); | 
|     if (!data) { | 
|       return '-'; | 
|       //   return `审核值不正确:${status}` | 
|     } | 
|     return data.text; | 
|   }, | 
|   initFlowQuery() { | 
|     if (this.$route.query.viewflow) { | 
|       this.$refs.table && this.search(); | 
|     } | 
|   }, | 
|   fullscreen(full) { //弹出框全屏方法 | 
|   | 
|   } | 
| }; | 
| import customColumns from './ViewGridCustomColumn.js'; | 
| //合并扩展方法 | 
| methods = Object.assign(methods, detailMethods, serviceFilter, customColumns); | 
| export default methods; |