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;