feat: 新增多项功能并优化多个页面交互

1. 新增批量修改钢卷合同接口与合同批量转单功能
2. 优化KLPTable多选列默认位置与物料预警查询交互
3. 升级CoilTable支持多选与自定义操作栏
4. 新增菜单导出功能
5. 优化钢卷面板列宽与操作按钮文案
This commit is contained in:
2026-06-24 17:51:14 +08:00
parent fa84bae4f2
commit a4f8ecb48b
8 changed files with 255 additions and 75 deletions

View File

@@ -45,6 +45,15 @@
@click="toggleExpandAll"
>展开/折叠</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@@ -278,6 +287,7 @@ import { listMenu, getMenu, delMenu, addMenu, updateMenu } from "@/api/system/me
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import IconSelect from "@/components/IconSelect";
import * as XLSX from 'xlsx';
export default {
name: "Menu",
@@ -446,6 +456,71 @@ export default {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出菜单(仅可见且未停用的菜单,父节点被过滤则子节点一并排除) */
handleExport() {
// 菜单类型映射
const menuTypeMap = { M: '目录', C: '菜单', F: '按钮' };
// 递归过滤:只保留 visible='0'(显示) && status='0'(正常) 的节点
const filterTree = (nodes) => {
return nodes
.filter(node => node.visible === '0' && node.status === '0')
.map(node => ({
...node,
children: node.children ? filterTree(node.children) : []
}));
};
// 递归展平为一维数组,缩进体现层级
const flattenTree = (nodes, level = 0, result = []) => {
nodes.forEach(node => {
const prefix = '\u3000'.repeat(level); // 全角空格缩进
result.push({
menuName: prefix + node.menuName,
menuType: menuTypeMap[node.menuType] || node.menuType,
icon: node.icon || '',
orderNum: node.orderNum,
perms: node.perms || '',
component: node.component || '',
status: '正常',
createTime: node.createTime || ''
});
if (node.children && node.children.length > 0) {
flattenTree(node.children, level + 1, result);
}
});
return result;
};
const filtered = filterTree(this.menuList);
const flatData = flattenTree(filtered);
if (flatData.length === 0) {
this.$modal.msgWarning('没有可导出的菜单数据');
return;
}
// 构建 Excel 数据
const wsData = [
['菜单名称', '菜单类型', '图标', '排序', '权限标识', '组件路径', '状态', '创建时间'],
...flatData.map(item => [
item.menuName, item.menuType, item.icon,
item.orderNum, item.perms, item.component,
item.status, item.createTime
])
];
const ws = XLSX.utils.aoa_to_sheet(wsData);
ws['!cols'] = [
{ wch: 30 }, { wch: 10 }, { wch: 12 },
{ wch: 8 }, { wch: 25 }, { wch: 30 },
{ wch: 8 }, { wch: 20 }
];
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, '菜单列表');
XLSX.writeFile(wb, '菜单列表.xlsx');
}
}
};