-- ============================================================ -- 进销存(erp)—— 菜单配置(yz_system_menu) -- 幂等脚本:按 path 判重,重复执行不会产生重复菜单 -- 执行:mysql -h -P -u -p --default-character-set=utf8mb4 < erp_menus.sql -- ============================================================ -- 目标结构(「大类」= 模块根下一层目录,会作为移动端功能页的分组标题; -- 「小类」= 叶子菜单,渲染为功能卡片): -- 工作台 -> 工作台(复用已有仪表盘页面 /apps/erp/dashboard) -- 基础资料 -> 商品 / 供应商 / 客户 / 仓库 -- 采购管理 -> 采购订单 / 采购入库 / 采购退货 -- 销售管理 -> 销售订单 / 销售出库 / 销售退货 -- 库存管理 -> 入库 / 出库 / 调拨 / 盘点 / 库存查询 -- 财务管理 -> 应收 / 应付 / 收付款 -- 报表中心 -> 报表中心 -- 系统管理 -> 系统管理 / 账套管理(账套列表)/ 基础设置 -- -- 字段说明: -- type 1=目录(大类),2=页面(小类) -- views '[2]' 租户端:Web 租户后台与移动端共用同一份菜单 -- platforms 留 NULL:展示端继承 erp 模块配置 -- 未实现的页面 component_path 留空:Web 端为空白页,移动端落到「功能开发中」占位页 -- icon 完整 Font Awesome 类名;移动端必须落在 uniapp/utils/fa-icons.js 白名单内才显示 SET @erp_id := ( SELECT id FROM yz_system_menu WHERE path = '/apps/erp' AND delete_time IS NULL LIMIT 1 ); -- ---------- 1. 八个大类(目录) ---------- INSERT INTO yz_system_menu (pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark) SELECT @erp_id, '工作台', '/apps/erp/workbench', NULL, 'fa-solid fa-gauge', 1, 1, 1, '[2]', 1, 'system', '进销存大类:工作台' FROM DUAL WHERE @erp_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/workbench' AND delete_time IS NULL) x); INSERT INTO yz_system_menu (pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark) SELECT @erp_id, '基础资料', '/apps/erp/basic', NULL, 'fa-solid fa-database', 2, 1, 1, '[2]', 1, 'system', '进销存大类:基础资料' FROM DUAL WHERE @erp_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/basic' AND delete_time IS NULL) x); INSERT INTO yz_system_menu (pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark) SELECT @erp_id, '采购管理', '/apps/erp/purchase', NULL, 'fa-solid fa-cart-shopping', 3, 1, 1, '[2]', 1, 'system', '进销存大类:采购管理' FROM DUAL WHERE @erp_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/purchase' AND delete_time IS NULL) x); INSERT INTO yz_system_menu (pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark) SELECT @erp_id, '销售管理', '/apps/erp/sales', NULL, 'fa-solid fa-tags', 4, 1, 1, '[2]', 1, 'system', '进销存大类:销售管理' FROM DUAL WHERE @erp_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/sales' AND delete_time IS NULL) x); INSERT INTO yz_system_menu (pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark) SELECT @erp_id, '库存管理', '/apps/erp/stock', NULL, 'fa-solid fa-warehouse', 5, 1, 1, '[2]', 1, 'system', '进销存大类:库存管理' FROM DUAL WHERE @erp_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/stock' AND delete_time IS NULL) x); INSERT INTO yz_system_menu (pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark) SELECT @erp_id, '财务管理', '/apps/erp/finance', NULL, 'fa-solid fa-coins', 6, 1, 1, '[2]', 1, 'system', '进销存大类:财务管理' FROM DUAL WHERE @erp_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/finance' AND delete_time IS NULL) x); INSERT INTO yz_system_menu (pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark) SELECT @erp_id, '报表中心', '/apps/erp/report', NULL, 'fa-solid fa-chart-column', 7, 1, 1, '[2]', 1, 'system', '进销存大类:报表中心' FROM DUAL WHERE @erp_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/report' AND delete_time IS NULL) x); INSERT INTO yz_system_menu (pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark) SELECT @erp_id, '系统管理', '/apps/erp/system', NULL, 'fa-solid fa-gears', 8, 1, 1, '[2]', 1, 'system', '进销存大类:系统管理' FROM DUAL WHERE @erp_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/system' AND delete_time IS NULL) x); -- 取回八个大类的ID,供小类挂载 SET @erp_workbench := (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/workbench' AND delete_time IS NULL LIMIT 1); SET @erp_basic := (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/basic' AND delete_time IS NULL LIMIT 1); SET @erp_system := (SELECT id FROM yz_system_menu WHERE path = '/apps/erp/system' AND delete_time IS NULL LIMIT 1); -- ---------- 2. 已有菜单迁入新树(避免同一功能出现两份) ---------- -- 仪表盘 -> 工作台大类,并更名为「工作台」;路由与页面文件不变 UPDATE yz_system_menu SET pid = @erp_workbench, title = '工作台', sort = 1, update_time = NOW() WHERE delete_time IS NULL AND path = '/apps/erp/dashboard' AND @erp_workbench IS NOT NULL; -- 供应商列表 / 客户列表 -> 基础资料大类,去掉「列表」后缀;路由与页面文件不变 UPDATE yz_system_menu SET pid = @erp_basic, title = '供应商', sort = 2, update_time = NOW() WHERE delete_time IS NULL AND path = '/apps/erp/suppliers' AND @erp_basic IS NOT NULL; UPDATE yz_system_menu SET pid = @erp_basic, title = '客户', sort = 3, update_time = NOW() WHERE delete_time IS NULL AND path = '/apps/erp/customers' AND @erp_basic IS NOT NULL; -- 账套管理 / 基础设置 -> 系统管理大类 UPDATE yz_system_menu SET pid = @erp_system, sort = 2, update_time = NOW() WHERE delete_time IS NULL AND pid = @erp_id AND title = '账套管理' AND @erp_system IS NOT NULL; UPDATE yz_system_menu SET pid = @erp_system, sort = 3, update_time = NOW() WHERE delete_time IS NULL AND pid = @erp_id AND title = '基础设置' AND @erp_system IS NOT NULL; -- ---------- 3. 新增小类(页面) ---------- DROP TEMPORARY TABLE IF EXISTS tmp_erp_leaf; CREATE TEMPORARY TABLE tmp_erp_leaf ( parent_path VARCHAR(200) NOT NULL, title VARCHAR(50) NOT NULL, path VARCHAR(200) NOT NULL, icon VARCHAR(100) NOT NULL, sort INT NOT NULL, remark VARCHAR(500) NOT NULL, PRIMARY KEY (path) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; INSERT INTO tmp_erp_leaf (parent_path, title, path, icon, sort, remark) VALUES ('/apps/erp/basic', '商品', '/apps/erp/basic/product', 'fa-solid fa-box', 1, '商品档案'), ('/apps/erp/basic', '仓库', '/apps/erp/basic/warehouse', 'fa-solid fa-boxes-packing', 4, '仓库档案'), ('/apps/erp/purchase', '采购订单', '/apps/erp/purchase/order', 'fa-solid fa-file-invoice', 1, '采购订单'), ('/apps/erp/purchase', '采购入库', '/apps/erp/purchase/inbound', 'fa-solid fa-dolly', 2, '采购入库单'), ('/apps/erp/purchase', '采购退货', '/apps/erp/purchase/return', 'fa-solid fa-rotate-left', 3, '采购退货单'), ('/apps/erp/sales', '销售订单', '/apps/erp/sales/order', 'fa-solid fa-file-signature', 1, '销售订单'), ('/apps/erp/sales', '销售出库', '/apps/erp/sales/outbound', 'fa-solid fa-truck-fast', 2, '销售出库单'), ('/apps/erp/sales', '销售退货', '/apps/erp/sales/return', 'fa-solid fa-arrow-right-arrow-left',3, '销售退货单'), ('/apps/erp/stock', '入库', '/apps/erp/stock/inbound', 'fa-solid fa-box-open', 1, '其他入库'), ('/apps/erp/stock', '出库', '/apps/erp/stock/outbound', 'fa-solid fa-truck', 2, '其他出库'), ('/apps/erp/stock', '调拨', '/apps/erp/stock/transfer', 'fa-solid fa-right-left', 3, '仓库调拨'), ('/apps/erp/stock', '盘点', '/apps/erp/stock/taking', 'fa-solid fa-clipboard-check', 4, '库存盘点'), ('/apps/erp/stock', '库存查询', '/apps/erp/stock/query', 'fa-solid fa-magnifying-glass', 5, '库存查询'), ('/apps/erp/finance', '应收', '/apps/erp/finance/receivable', 'fa-solid fa-file-invoice-dollar', 1, '应收账款'), ('/apps/erp/finance', '应付', '/apps/erp/finance/payable', 'fa-solid fa-money-check-dollar', 2, '应付账款'), ('/apps/erp/finance', '收付款', '/apps/erp/finance/payment', 'fa-solid fa-cash-register', 3, '收付款单'), ('/apps/erp/report', '报表中心', '/apps/erp/report/index', 'fa-solid fa-chart-line', 1, '进销存报表'), ('/apps/erp/system', '系统管理', '/apps/erp/system/index', 'fa-solid fa-sliders', 1, '进销存系统设置'); INSERT INTO yz_system_menu (pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark) SELECT p.id, t.title, t.path, NULL, t.icon, t.sort, 1, 1, '[2]', 2, 'system', t.remark FROM tmp_erp_leaf t JOIN yz_system_menu p ON p.path = t.parent_path AND p.delete_time IS NULL LEFT JOIN yz_system_menu e ON e.path = t.path AND e.delete_time IS NULL WHERE e.id IS NULL; DROP TEMPORARY TABLE IF EXISTS tmp_erp_leaf; -- 补图标:迁移过来的菜单原本没有图标,移动端会退化成兜底图标,这里只填空值、不覆盖已有配置 UPDATE yz_system_menu SET icon = 'fa-solid fa-store', update_time = NOW() WHERE delete_time IS NULL AND path = '/apps/erp/suppliers' AND (icon IS NULL OR icon = ''); UPDATE yz_system_menu SET icon = 'fa-solid fa-address-book', update_time = NOW() WHERE delete_time IS NULL AND path = '/apps/erp/customers' AND (icon IS NULL OR icon = ''); UPDATE yz_system_menu SET icon = 'fa-solid fa-book-bookmark', update_time = NOW() WHERE delete_time IS NULL AND pid = @erp_system AND title = '账套管理' AND (icon IS NULL OR icon = ''); -- ---------- 4. 清理被搬空的两级旧目录(供应商管理 / 客户管理) ---------- -- 子菜单已迁走(供应商列表 / 客户列表),留着会变成空分组。 -- 先取出「已无子菜单」的旧目录ID,再按ID软删除:MySQL 不允许在 UPDATE 的子查询里读同一张表。 SET @erp_empty_dir := NULL; SELECT GROUP_CONCAT(d.id) INTO @erp_empty_dir FROM yz_system_menu d LEFT JOIN yz_system_menu c ON c.pid = d.id AND c.delete_time IS NULL WHERE d.pid = @erp_id AND d.delete_time IS NULL AND d.title IN ('供应商管理', '客户管理') AND d.path IN ('/apps/erp/supplier', '/apps/erp/customer') AND c.id IS NULL; UPDATE yz_system_menu SET delete_time = NOW(), status = 0 WHERE delete_time IS NULL AND FIND_IN_SET(id, IFNULL(@erp_empty_dir, '')); -- ---------- 5. 结果校验(大类 + 其下小类) ---------- SELECT d.sort AS 大类序号, d.title AS 大类, IFNULL(m.title, '(无)') AS 小类, m.sort AS 小类序号, m.path AS 路径, m.icon AS 图标, m.component_path AS 页面文件 FROM yz_system_menu d LEFT JOIN yz_system_menu m ON m.pid = d.id AND m.delete_time IS NULL WHERE d.pid = @erp_id AND d.delete_time IS NULL ORDER BY d.sort, m.sort, m.id;