gaoluyang
7 天以前 d69b6efcab519bd320f3ba74f95269d6b32f0422
chore(sql,docs): 补菜单脚本与业务流程图更新

- cfwj_menu_align_20261102.sql:菜单对标技术方案,未涉及的页面仅隐藏不删除
- mes_bom_menu_20261102.sql:物料BOM维护/工序管理/工艺路线菜单与权限
- 业务可视化文档同步生产流程变更

Co-Authored-By: Claude Code <noreply@anthropic.com>
已添加2个文件
已修改2个文件
562 ■■■■■ 文件已修改
docs/project-business/data/flows.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/mermaid/04-production-flow.mmd 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/cfwj_menu_align_20261102.sql 373 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/mes_bom_menu_20261102.sql 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/project-business/data/flows.json
@@ -22,9 +22,10 @@
       {"stage": "退货", "action": "IQC ä¸åˆæ ¼é€€è´§â†’供应商退货出库(选料锁定到订单行);报废走 NCR", "roles": ["仓管"]},
       {"stage": "付款", "action": "采购入库完成即向入库单创建人+管理员发站内信(含入库单号/采购订单号/订单金额),提醒财务按来票生成付款单;采购来票(FPD, AI OCR, â‰¤è®¢å•总价) â†’ ä»˜æ¬¾å•(FKD å…³è”来票+附件, â‰¤æ¥ç¥¨é‡‘额) BPM å®¡æ‰¹", "roles": ["财务", "审批人"]}]},
    {"id": "production", "name": "生产流程", "mermaid": "mermaid/04-production-flow.mmd", "color": "#e0b34f",
     "summary": "销售订单驱动 MPS â†’ ä¸‹å‘工单 â†’ æŒ‰å·¥è‰ºè·¯çº¿æ‹†å·¥åºä»»åŠ¡ â†’ é¢†æ–™/线边备料 â†’ æŠ¥å·¥(工序顺序硬校验+BPM) â†’ å€’冲消耗/产出入库/IPQC â†’ æœ«é“工序回写进度 â†’ è‡ªåŠ¨å®Œå·¥ â†’ ProductionFinishedEvent å›žå†™é”€å”®è®¢å•。",
     "summary": "销售订单驱动 MPS â†’ æäº¤å®¡æ ¸(协同办公 BPM) â†’ ä¸‹å‘工单 â†’ æŒ‰å·¥è‰ºè·¯çº¿æ‹†å·¥åºä»»åŠ¡ â†’ é¢†æ–™/线边备料 â†’ æŠ¥å·¥(工序顺序硬校验+BPM) â†’ å€’冲消耗/产出入库/IPQC â†’ æœ«é“工序回写进度 â†’ è‡ªåŠ¨å®Œå·¥ â†’ ProductionFinishedEvent å›žå†™é”€å”®è®¢å•。",
     "steps": [
       {"stage": "计划", "action": "MPS åˆ›å»º(手工或销售订单自动)→下发或合并下发为工单", "roles": ["计划员"]},
       {"stage": "基础数据", "action": "生产基础数据维护:产品BOM(物料BOM维护页「BOM ç»„成」)与工艺路线投料BOM(按产品×工序,优先于产品BOM);MPS è¾…料明细、工单辅料预览均按 BOM å±•开并校验可用库存,未维护 BOM æ—¶æ˜Žç»†ä¸ºç©ºå¹¶æç¤ºå…ˆé…ç½®ï¼Œä¸å†æŠŠæˆå“è‡ªèº«å½“成辅料", "roles": ["生产管理员"]},
       {"stage": "计划", "action": "MPS åˆ›å»º(手工或销售订单自动)→提交审核进入协同办公(mes-pro-mps-audit)审批,驳回/撤回回草稿→审核通过后下发或合并下发为工单", "roles": ["计划员", "生产管理员"]},
       {"stage": "派工", "action": "工单确认按工艺路线逐工序生成任务,可指派/暂停/取消", "roles": ["车间主任"]},
       {"stage": "备料", "action": "生产领料单出库或线边虚拟库备料", "roles": ["仓管"]},
       {"stage": "报工", "action": "提交报工:上一道工序未报满直接拦截;启用 BPM èµ°å®¡æ‰¹", "roles": ["操作工"]},
docs/project-business/mermaid/04-production-flow.mmd
@@ -1,9 +1,15 @@
flowchart TD
  P0[销售订单明细 needProduction=1] -->|审批通过自动创建| P1[MPS ä¸»ç”Ÿäº§è®¡åˆ’·草稿0→已下发1]
  P1 -->|下发或合并下发| P2[生产工单·草稿0→已确认1<br/>工厂/车间为生产主体]
  MD1[物料BOM维护·产品BOM组成<br/>mes_md_product_bom] -->|单耗| P2M
  MD2[工艺路线投料BOM·按产品×工序<br/>mes_pro_route_product_bom] -->|优先于产品BOM| P2M
  P0[销售订单明细 needProduction=1] -->|审批通过自动创建| P1[MPS ä¸»ç”Ÿäº§è®¡åˆ’·草稿0]
  P1 -->|提交审核·启动 mes-pro-mps-audit| P1A[协同办公审批·审核中4]
  P1A -->|驳回/撤回→草稿0| P1
  P1A -->|审批通过·已审核5| P1B[MPS å·²å®¡æ ¸5]
  P1B -->|下发或合并下发| P2[生产工单·草稿0→已确认1<br/>工厂/车间为生产主体]
  P2 -->|按工艺路线工序自动生成| P3[生产任务×N·预备0→生产中1→部分完成2→完成4·可暂停9]
  P2 -->|启动生产·写实际开工时间与开工人| P2S[生产中·状态仍为已确认1]
  P2 -->|按产品+数量预览辅料需求| P2M[辅料需求与可用库存校验<br/>不足提示先行采购·不阻断建单]
  P2 -->|按产品+数量预览辅料需求| P2M[辅料需求与可用库存校验<br/>按BOM展开·不足提示先行采购·不阻断建单]
  P1B -->|辅料明细| P2M
  P3 --> P4[生产领料·正常领料类型1]
  P4 -->|提交→拣货→完成·扣减库存并转入线边虚拟库| P4
  P4 --> P4S[补领辅料·领料类型2·必须填补领原因]
sql/mysql/cfwj_menu_align_20261102.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,373 @@
-- =====================================================================
-- è¯šå‘五金菜单对标《附件一:技术方案-诚发五金(2026)》
-- ç›®æ ‡ï¼šä¾§è¾¹æ çš„ 7 ä¸ªä¸šåŠ¡æ¨¡å—åŠå…¶å­èœå•ä¸Žæ–¹æ¡ˆç« èŠ‚æ ‡é¢˜ä¸€è‡´ï¼›
--       æ–¹æ¡ˆæœªæ¶‰åŠçš„æ ‡å‡†å“é¡µé¢åªéšè—ï¼ˆvisible=0),不删除数据;
--       å·¥å•助手为 APP,本次不建菜单。
-- é€‚用库:诚发五金本地库 CFWJ(单租户,脚本不含 tenant_id)
-- å¹‚等:可重复执行;执行前整表备份到 system_menu_bak_20261102
-- æ³¨æ„ï¼šåªè°ƒæ•´ type=1/2;type=3 æŒ‰é’®ä¸ç§»åŠ¨ã€ä¸éšè—ï¼ŒæŽ¥å£æƒé™ä¸å—å½±å“ã€‚
-- =====================================================================
SET NAMES utf8mb4;
-- ==================== 0. å¤‡ä»½ï¼ˆDDL ä¼šéšå¼æäº¤ï¼Œå¿…须放在事务外) ====================
CREATE TABLE IF NOT EXISTS `system_menu_bak_20261102` AS SELECT * FROM `system_menu`;
START TRANSACTION;
-- ==================== 1. å®šä½ 7 ä¸ªä¸šåŠ¡æ¨¡å— ====================
SET @plan_id = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND parent_id = 0 AND name = '计划排程' ORDER BY id LIMIT 1);
SET @prod_id = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND parent_id = 0 AND name = '生产管控' ORDER BY id LIMIT 1);
SET @dev_id  = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND parent_id = 0 AND name = '设备管理' ORDER BY id LIMIT 1);
SET @pur_id  = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND parent_id = 0 AND name = '采购管理' ORDER BY id LIMIT 1);
SET @wms_id  = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND parent_id = 0 AND name = '仓储物流' ORDER BY id LIMIT 1);
SET @sale_id = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND parent_id = 0 AND name = '营销管理' ORDER BY id LIMIT 1);
SET @hrm_id  = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND parent_id = 0 AND name = '人力资源' ORDER BY id LIMIT 1);
-- ==================== 2. è®¡åˆ’排程 ====================
-- 1.1 è®¡åˆ’查询与筛选 / 1.2 æ–°å¢žç”Ÿäº§è®¡åˆ’ / 1.3 è®¡åˆ’列表管理 â†’ åŒä¸€ä¸ªã€Œç”Ÿäº§è®¡åˆ’」页面
UPDATE `system_menu` SET `name` = '生产计划', `parent_id` = @plan_id, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 602504;
-- ==================== 3. ç”Ÿäº§ç®¡æŽ§ ====================
-- 2.1 ç”Ÿäº§å·¥å•
UPDATE `system_menu` SET `name` = '生产工单', `parent_id` = @prod_id, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 5530;
-- 2.1③「查看执行情况」依赖报工数据:保留生产报工页面(方案未单列,作为工单执行的配套页)
UPDATE `system_menu` SET `name` = '生产报工', `parent_id` = @prod_id, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 5550;
-- 2.2 é¢†æ–™ç®¡ç†ï¼ˆç›®å½•:领料出库 / ä½™æ–™å…¥åº“)
-- è¯´æ˜Žï¼šæ–¹æ¡ˆ 2.2②「补领辅料」与 2.2①「领料出库」在同一张领料单上完成
--       ï¼ˆåŒé¡µé¢ç”¨ã€Œé¢†æ–™ç±»åž‹ã€åŒºåˆ†ï¼Œå·¥å…·æ å·²æœ‰ã€Œè¡¥é¢†è¾…料」按钮),合并为「领料出库」一个菜单,不重复建菜单。
SET @issue_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @prod_id AND name = '领料管理' ORDER BY id LIMIT 1);
INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT '领料管理', '', 1, 3, @prod_id, 'issue', 'ep:box', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE @issue_dir IS NULL;
SET @issue_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @prod_id AND name = '领料管理' ORDER BY id LIMIT 1);
UPDATE `system_menu` SET `name` = '领料出库', `parent_id` = @issue_dir, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 5805;
UPDATE `system_menu` SET `name` = '余料入库', `parent_id` = @issue_dir, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 5840;
-- 2.3 ç”Ÿäº§ä¸»ä½“等基础设置不单列菜单,归入支撑模块「基础数据」;方案未列的生产排产隐藏
SET @basic_id = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND parent_id = 0 AND name = '基础数据' ORDER BY id LIMIT 1);
UPDATE `system_menu` SET `name` = '工厂设置', `parent_id` = @basic_id, `sort` = 10,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 1075495;
UPDATE `system_menu` SET `name` = '车间设置', `parent_id` = @basic_id, `sort` = 11,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5160;
UPDATE `system_menu` SET `name` = '工作站设置', `parent_id` = @basic_id, `sort` = 12,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5170;
-- è®¾å¤‡ç±»åž‹åŒå±žåŸºç¡€ä¸»æ•°æ®ï¼Œå½’入「基础数据」
UPDATE `system_menu` SET `name` = '设备类型', `parent_id` = @basic_id, `sort` = 13,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5310;
-- æ¸…空后的旧目录/生产排产隐藏
UPDATE `system_menu` SET `visible` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` IN (5101, 5700, 5540);
-- ==================== 4. è®¾å¤‡ç®¡ç† ====================
-- 3.1 è®¾å¤‡åŸºç¡€ä¿¡æ¯ç®¡ç†ï¼ˆè®¾å¤‡å°è´¦ï¼‰
UPDATE `system_menu` SET `name` = '设备基础信息管理', `parent_id` = @dev_id, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 5320;
-- 3.2 è®¾å¤‡çŠ¶æ€ä¸Žæ—¥å¸¸æ“ä½œï¼ˆç›®å½•ï¼šè®¾å¤‡å€Ÿç”¨ / ç»´ä¿®å•)
SET @dev_daily_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @dev_id AND name = '设备状态与日常操作' ORDER BY id LIMIT 1);
INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT '设备状态与日常操作', '', 1, 2, @dev_id, 'daily', 'ep:switch', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE @dev_daily_dir IS NULL;
SET @dev_daily_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @dev_id AND name = '设备状态与日常操作' ORDER BY id LIMIT 1);
UPDATE `system_menu` SET `name` = '设备借用', `parent_id` = @dev_daily_dir, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 1075514;
UPDATE `system_menu` SET `name` = '维修单', `parent_id` = @dev_daily_dir, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 5370;
-- 3.3 è®¾å¤‡ç»´æŠ¤ä¸Žæ£€ä¿®ç®¡ç†ï¼ˆç›®å½•:点检保养项目 / æ–¹æ¡ˆ / ç‚¹æ£€è®°å½• / ä¿å…»è®°å½•)
SET @dev_maint_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @dev_id AND name = '设备维护与检修管理' ORDER BY id LIMIT 1);
INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT '设备维护与检修管理', '', 1, 3, @dev_id, 'maintenance', 'ep:tools', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE @dev_maint_dir IS NULL;
SET @dev_maint_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @dev_id AND name = '设备维护与检修管理' ORDER BY id LIMIT 1);
UPDATE `system_menu` SET `name` = '点检保养项目', `parent_id` = @dev_maint_dir, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 5330;
UPDATE `system_menu` SET `name` = '点检保养方案', `parent_id` = @dev_maint_dir, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 5350;
UPDATE `system_menu` SET `name` = '点检记录', `parent_id` = @dev_maint_dir, `sort` = 3,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 5360;
UPDATE `system_menu` SET `name` = '保养记录', `parent_id` = @dev_maint_dir, `sort` = 4,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 5340;
-- 3.4 æ•°æ®å·¥å…·ä¸Žæ‰¹é‡æ“ä½œï¼ˆè®¾å¤‡ç»Ÿè®¡åˆ†æžï¼‰
UPDATE `system_menu` SET `name` = '数据工具与批量操作', `parent_id` = @dev_id, `sort` = 4,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 1075521;
-- ==================== 5. é‡‡è´­ç®¡ç† ====================
-- 4.1 ä¾›åº”商管理(目录:供应商档案 / åˆåŒç®¡ç†ï¼‰
UPDATE `system_menu` SET `name` = '供应商管理', `parent_id` = @pur_id, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 602524;
UPDATE `system_menu` SET `name` = '供应商档案', `parent_id` = 602524, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 602525;
UPDATE `system_menu` SET `name` = '合同管理', `parent_id` = 602524, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 1075523;
-- 4.2 é‡‡è´­ä¸‹å•
UPDATE `system_menu` SET `name` = '采购下单', `parent_id` = @pur_id, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 1075529;
-- 4.3 é‡‡è´­ç”³è¯·å•(目录:申请单列表 / é‡‡è´­ç”³è¯·ç»Ÿè®¡ï¼‰
SET @req_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @pur_id AND name = '采购申请单' ORDER BY id LIMIT 1);
INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT '采购申请单', '', 1, 3, @pur_id, 'request-bill', 'ep:document-add', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE @req_dir IS NULL;
SET @req_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @pur_id AND name = '采购申请单' ORDER BY id LIMIT 1);
UPDATE `system_menu` SET `name` = '申请单列表', `parent_id` = @req_dir, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 602498;
UPDATE `system_menu` SET `name` = '采购申请统计', `parent_id` = @req_dir, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 1075536;
-- 4.4 ç”³è¯·é‡‡è´­å•
UPDATE `system_menu` SET `name` = '申请采购单', `parent_id` = @pur_id, `sort` = 4,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 1075530;
-- 4.5 é‡‡è´­è®¢å•
UPDATE `system_menu` SET `name` = '采购订单', `parent_id` = @pur_id, `sort` = 5,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW()
WHERE `id` = 2666;
-- ==================== 6. ä»“储物流 ====================
-- 5.1 ä»“库管理(目录)
SET @wh_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @wms_id AND name = '仓库管理' ORDER BY id LIMIT 1);
INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT '仓库管理', '', 1, 1, @wms_id, 'warehouse-manage', 'ep:house', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE @wh_dir IS NULL;
SET @wh_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @wms_id AND name = '仓库管理' ORDER BY id LIMIT 1);
UPDATE `system_menu` SET `name` = '仓库设置', `parent_id` = @wh_dir, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5781;
UPDATE `system_menu` SET `name` = '库存现有量', `parent_id` = @wh_dir, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5786;
UPDATE `system_menu` SET `name` = '库存预警', `parent_id` = @wh_dir, `sort` = 3,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 1075538;
UPDATE `system_menu` SET `name` = '转移调拨', `parent_id` = @wh_dir, `sort` = 4,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5922;
UPDATE `system_menu` SET `name` = '盘点方案', `parent_id` = @wh_dir, `sort` = 5,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5951;
UPDATE `system_menu` SET `name` = '盘点任务', `parent_id` = @wh_dir, `sort` = 6,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5957;
UPDATE `system_menu` SET `name` = '库存事务流水', `parent_id` = @wh_dir, `sort` = 7,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 602476;
-- 5.2 å‡ºå…¥åº“管理(目录)
SET @io_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @wms_id AND name = '出入库管理' ORDER BY id LIMIT 1);
INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT '出入库管理', '', 1, 2, @wms_id, 'in-out', 'ep:sort', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE @io_dir IS NULL;
SET @io_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @wms_id AND name = '出入库管理' ORDER BY id LIMIT 1);
UPDATE `system_menu` SET `name` = '采购入库', `parent_id` = @io_dir, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5798;
UPDATE `system_menu` SET `name` = '产品入库', `parent_id` = @io_dir, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5819;
UPDATE `system_menu` SET `name` = '发货通知', `parent_id` = @io_dir, `sort` = 3,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5867;
UPDATE `system_menu` SET `name` = '销售出库', `parent_id` = @io_dir, `sort` = 4,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5970;
-- 5.3 åˆ†æ‹£é…é€
UPDATE `system_menu` SET `name` = '分拣配送', `parent_id` = @wms_id, `sort` = 3,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 1075543;
-- ==================== 7. è¥é”€ç®¡ç† ====================
-- 6.1 å¼€å• + 6.2 è®¢å•管理:同一张销售订单(「新增」即代客/窗口开单),合并为「订单管理」一个菜单,不重复建菜单。
UPDATE `system_menu` SET `name` = '订单管理', `parent_id` = @sale_id, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 2638;
-- 6.3 é€€è´§ç®¡ç†
UPDATE `system_menu` SET `name` = '退货管理', `parent_id` = @sale_id, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 5847;
-- 6.4 æŠ¥ä»·å•
UPDATE `system_menu` SET `name` = '报价单', `parent_id` = @sale_id, `sort` = 3,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 602512;
-- 6.5 é¢„订货管理
UPDATE `system_menu` SET `name` = '预订货管理', `parent_id` = @sale_id, `sort` = 4,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 1075568;
-- 6.6 å®¢æˆ·ç®¡ç†
UPDATE `system_menu` SET `name` = '客户管理', `parent_id` = @sale_id, `sort` = 5,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 2391;
-- 6.7 é”€å”®ç»Ÿè®¡ï¼ˆç›®å½•)
UPDATE `system_menu` SET `name` = '销售统计', `parent_id` = @sale_id, `sort` = 6,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 2560;
UPDATE `system_menu` SET `name` = '销售款统计', `parent_id` = 2560, `sort` = 6,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 1075574;
-- ==================== 8. äººåŠ›èµ„æº ====================
UPDATE `system_menu` SET `name` = '合同管理', `parent_id` = @hrm_id, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 1063105;
UPDATE `system_menu` SET `name` = '资产管理', `parent_id` = @hrm_id, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 1075548;
UPDATE `system_menu` SET `name` = '员工管理', `parent_id` = @hrm_id, `sort` = 3,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 6006;
UPDATE `system_menu` SET `name` = '办公用品管理', `parent_id` = @hrm_id, `sort` = 4,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 1075557;
-- 7.5 ç»„织机构管理(目录:部门管理 / å²—位管理)
SET @org_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @hrm_id AND name = '组织机构管理' ORDER BY id LIMIT 1);
INSERT INTO `system_menu` (`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT '组织机构管理', '', 1, 5, @hrm_id, 'organization', 'ep:office-building', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE @org_dir IS NULL;
SET @org_dir = (SELECT id FROM `system_menu` WHERE deleted = b'0' AND type = 1 AND parent_id = @hrm_id AND name = '组织机构管理' ORDER BY id LIMIT 1);
UPDATE `system_menu` SET `name` = '部门管理', `parent_id` = @org_dir, `sort` = 1,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 103;
UPDATE `system_menu` SET `name` = '岗位管理', `parent_id` = @org_dir, `sort` = 2,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 104;
-- 7.6 è´¦å·ç®¡ç†
UPDATE `system_menu` SET `name` = '账号管理', `parent_id` = @hrm_id, `sort` = 6,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 100;
-- 7.7 äººäº‹å®¡æ‰¹ç®¡ç†
UPDATE `system_menu` SET `name` = '人事审批管理', `parent_id` = @hrm_id, `sort` = 7,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 6002;
-- 7.8 è€ƒå‹¤ç®¡ç†
UPDATE `system_menu` SET `name` = '考勤管理', `parent_id` = @hrm_id, `sort` = 8,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 6010;
-- 7.9 è–ªèµ„管理
UPDATE `system_menu` SET `name` = '薪资管理', `parent_id` = @hrm_id, `sort` = 9,
    `status` = 0, `visible` = b'1', `deleted` = b'0', `updater` = '1', `update_time` = NOW() WHERE `id` = 6020;
-- ==================== 9. ä¸ºæ–°èœå•补角色映射(按同级已有菜单复制) ====================
-- é¢†æ–™ç®¡ç†ç›®å½•:复制「领料出库」的角色
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, @issue_dir, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
WHERE rm.`menu_id` = 5805
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = @issue_dir);
-- é‡‡è´­ç”³è¯·å•目录:复制「采购申请」的角色
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, @req_dir, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
WHERE rm.`menu_id` = 602498
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = @req_dir);
-- ç»„织机构管理目录:复制「部门管理」的角色
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, @org_dir, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
WHERE rm.`menu_id` = 103
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = @org_dir);
-- è®¾å¤‡çŠ¶æ€ä¸Žæ—¥å¸¸æ“ä½œç›®å½•ï¼šå¤åˆ¶ã€Œè®¾å¤‡åŸºç¡€ä¿¡æ¯ç®¡ç†ã€çš„è§’è‰²
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, @dev_daily_dir, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
WHERE rm.`menu_id` = 5320
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = @dev_daily_dir);
-- è®¾å¤‡ç»´æŠ¤ä¸Žæ£€ä¿®ç®¡ç†ç›®å½•:复制「设备基础信息管理」的角色
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, @dev_maint_dir, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
WHERE rm.`menu_id` = 5320
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = @dev_maint_dir);
-- ä»“库管理目录:复制「仓库设置」的角色
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, @wh_dir, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
WHERE rm.`menu_id` = 5781
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = @wh_dir);
-- å‡ºå…¥åº“管理目录:复制「采购入库」的角色
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, @io_dir, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
WHERE rm.`menu_id` = 5798
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = @io_dir);
-- ==================== 10. éšè—æ–¹æ¡ˆæœªæ¶‰åŠçš„页面 ====================
DROP TEMPORARY TABLE IF EXISTS `tmp_keep_menu`;
CREATE TEMPORARY TABLE `tmp_keep_menu` (`id` bigint NOT NULL PRIMARY KEY);
INSERT INTO `tmp_keep_menu` (`id`) VALUES
-- è®¡åˆ’排程
(@plan_id), (602504),
-- ç”Ÿäº§ç®¡æŽ§
(@prod_id), (5530), (5550), (@issue_dir), (5805), (5840),
-- è®¾å¤‡ç®¡ç†
(@dev_id), (5320), (@dev_daily_dir), (1075514), (5370),
(@dev_maint_dir), (5330), (5350), (5360), (5340), (1075521),
-- é‡‡è´­ç®¡ç†ï¼ˆé‡‡è´­ä¸‹å•已并入采购订单页签、申请采购单已并入采购申请单页签,均隐藏)
(@pur_id), (602524), (602525), (1075523),
(@req_dir), (602498), (1075536), (2666),
-- ä»“储物流
(@wms_id), (@wh_dir), (5781), (5786), (1075538), (5922), (5951), (5957), (602476),
(@io_dir), (5798), (5819), (5867), (5970), (1075543),
-- è¥é”€ç®¡ç†
(@sale_id), (2638), (5847), (602512), (1075568), (2391),
(2560), (2712), (2561), (2736), (2737), (2738), (1075574),
-- äººåŠ›èµ„æº
(@hrm_id), (1063105), (1075548), (6006), (1075557),
(@org_dir), (103), (104), (100), (6002), (6003), (6004), (6005), (1065211),
(6010), (6013), (6011), (6012), (6014), (6015), (6016), (6017),
(6020), (6021), (6022), (6023), (602445), (602449), (6024);
-- è®¡ç®— 7 ä¸ªä¸šåŠ¡æ¨¡å—ä¸‹çš„å…¨éƒ¨ç›®å½•/菜单
DROP TEMPORARY TABLE IF EXISTS `tmp_business_menu`;
CREATE TEMPORARY TABLE `tmp_business_menu` (`id` bigint NOT NULL PRIMARY KEY);
INSERT INTO `tmp_business_menu` (`id`)
WITH RECURSIVE tree AS (
    SELECT `id` FROM `system_menu`
    WHERE `deleted` = b'0' AND `parent_id` = 0
      AND `id` IN (@plan_id, @prod_id, @dev_id, @pur_id, @wms_id, @sale_id, @hrm_id)
    UNION ALL
    SELECT m.`id` FROM `system_menu` m
    JOIN tree t ON m.`parent_id` = t.`id`
    WHERE m.`deleted` = b'0'
)
SELECT `id` FROM tree;
-- ä¿ç•™é¡¹å¯è§
UPDATE `system_menu` SET `visible` = b'1', `status` = 0
WHERE `deleted` = b'0' AND `type` IN (1, 2)
  AND `id` IN (SELECT `id` FROM `tmp_keep_menu`);
-- ä¸šåŠ¡æ¨¡å—å†…æ–¹æ¡ˆæœªæ¶‰åŠçš„é¡µé¢éšè—
UPDATE `system_menu` SET `visible` = b'0'
WHERE `deleted` = b'0' AND `type` IN (1, 2)
  AND `id` IN (SELECT `id` FROM `tmp_business_menu`)
  AND `id` NOT IN (SELECT `id` FROM `tmp_keep_menu`);
DROP TEMPORARY TABLE IF EXISTS `tmp_keep_menu`;
DROP TEMPORARY TABLE IF EXISTS `tmp_business_menu`;
COMMIT;
-- ==================== éªŒè¯ ====================
-- 1) ä¸€çº§èœå•
SELECT `id`, `name`, `sort`, `visible` FROM `system_menu`
WHERE `deleted` = b'0' AND `parent_id` = 0 AND `type` = 1 ORDER BY `sort`;
-- 2) ä¸šåŠ¡æ¨¡å—äºŒçº§èœå•
SELECT p.`name` AS module, m.`id`, m.`name`, m.`type`, m.`sort`, m.`visible`
FROM `system_menu` m JOIN `system_menu` p ON p.`id` = m.`parent_id`
WHERE m.`deleted` = b'0' AND m.`type` IN (1, 2)
  AND p.`parent_id` = 0 AND p.`id` IN (@plan_id, @prod_id, @dev_id, @pur_id, @wms_id, @sale_id, @hrm_id)
ORDER BY p.`sort`, m.`sort`;
sql/mysql/mes_bom_menu_20261102.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
-- =============================================
-- MES ç”Ÿäº§åŸºç¡€æ•°æ®ï¼šç‰©æ–™BOM维护 / å·¥åºç®¡ç† / å·¥è‰ºè·¯çº¿ èœå•与权限
-- èƒŒæ™¯ï¼šMPS è¾…料明细、工单辅料预览按 BOM å±•开计算,但维护入口未挂菜单:
--   1) ç‰©æ–™BOM维护 â†’ MES ç‰©æ–™é¡µï¼ˆå«ã€ŒBOM ç»„成」页签),维护产品 BOM(mes_md_product_bom)
--   2) å·¥åºç®¡ç†   â†’ ç»´æŠ¤ç”Ÿäº§å·¥åºï¼ˆmes_pro_process),工艺路线必须挂工序
--   3) å·¥è‰ºè·¯çº¿   â†’ ç»´æŠ¤è·¯çº¿ã€äº§å‡ºäº§å“ã€å·¥åºæŠ•料(mes_pro_route_*),路线投料优先于产品 BOM
-- å¯é‡å¤æ‰§è¡Œï¼Œä¸åŒ…含 tenant_id(项目不使用多租户)
-- =============================================
START TRANSACTION;
-- =============================================
-- 0. ç›®å½•:生产基础数据(不存在时补建,挂在 ç”Ÿäº§ç®¡æŽ§ ä¸‹ï¼‰
-- =============================================
SET @prod_root = (SELECT id FROM system_menu WHERE deleted = b'0' AND name = '生产管控' AND parent_id = 0 LIMIT 1);
SET @base_dir = (SELECT id FROM system_menu WHERE deleted = b'0' AND name = '生产基础数据' AND parent_id = @prod_root LIMIT 1);
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '生产基础数据', '', 1, 1, @prod_root, 'md', 'ep:data-analysis', NULL, NULL, 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @prod_root IS NOT NULL AND @base_dir IS NULL;
SET @base_dir = (SELECT id FROM system_menu WHERE deleted = b'0' AND name = '生产基础数据' AND parent_id = @prod_root LIMIT 1);
-- ç›®å½•此前可能是隐藏状态(visible=0)或停用状态(status<>0),会导致子菜单在侧边栏完全不显示,统一置为显示、启用
UPDATE system_menu
SET visible = b'1', status = 0, updater = '1', update_time = NOW()
WHERE deleted = b'0' AND id = @base_dir AND (visible = b'0' OR status <> 0);
-- =============================================
-- 1. é¡µé¢èœå•
-- =============================================
-- 1.1 ç‰©æ–™BOM维护(MES ç‰©æ–™é¡µï¼Œç¼–辑弹窗内含「BOM ç»„成」页签)
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '物料BOM维护', '', 2, 1, @base_dir, 'item-bom', 'ep:box', 'mes/md/item/index', NULL, 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @base_dir IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND component = 'mes/md/item/index');
-- 1.2 å·¥åºç®¡ç†
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工序管理', '', 2, 2, @base_dir, 'process', 'ep:operation', 'mes/pro/process/index', NULL, 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @base_dir IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND component = 'mes/pro/process/index');
-- 1.3 å·¥è‰ºè·¯çº¿ï¼ˆå«äº§å‡ºäº§å“ã€å·¥åºã€å·¥åºæŠ•料)
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工艺路线', '', 2, 3, @base_dir, 'route', 'ep:guide', 'mes/pro/route/index', NULL, 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @base_dir IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND component = 'mes/pro/route/index');
SET @page_item = (SELECT id FROM system_menu WHERE deleted = b'0' AND component = 'mes/md/item/index' ORDER BY id LIMIT 1);
SET @page_process = (SELECT id FROM system_menu WHERE deleted = b'0' AND component = 'mes/pro/process/index' ORDER BY id LIMIT 1);
SET @page_route = (SELECT id FROM system_menu WHERE deleted = b'0' AND component = 'mes/pro/route/index' ORDER BY id LIMIT 1);
-- =============================================
-- 2. æŒ‰é’®æƒé™
-- =============================================
-- 2.1 ç‰©æ–™BOM维护(BOM ç»„成的增删改与物料导出共用 mes:md-item:* æƒé™ç ï¼‰
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '物料BOM-新增', 'mes:md-item:create', 3, 1, @page_item, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_item IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:md-item:create');
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '物料BOM-编辑', 'mes:md-item:update', 3, 2, @page_item, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_item IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:md-item:update');
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '物料BOM-删除', 'mes:md-item:delete', 3, 3, @page_item, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_item IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:md-item:delete');
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '物料BOM-导出', 'mes:md-item:export', 3, 4, @page_item, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_item IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:md-item:export');
-- 2.2 å·¥åºç®¡ç†
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工序-新增', 'mes:pro-process:create', 3, 1, @page_process, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_process IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:pro-process:create');
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工序-编辑', 'mes:pro-process:update', 3, 2, @page_process, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_process IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:pro-process:update');
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工序-删除', 'mes:pro-process:delete', 3, 3, @page_process, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_process IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:pro-process:delete');
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工序-导出', 'mes:pro-process:export', 3, 4, @page_process, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_process IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:pro-process:export');
-- 2.3 å·¥è‰ºè·¯çº¿ï¼ˆäº§å“ã€å·¥åºã€å·¥åºæŠ•料的新增/修改统一使用 mes:pro-route:update)
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工艺路线-新增', 'mes:pro-route:create', 3, 1, @page_route, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_route IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:pro-route:create');
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工艺路线-编辑', 'mes:pro-route:update', 3, 2, @page_route, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_route IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:pro-route:update');
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工艺路线-删除', 'mes:pro-route:delete', 3, 3, @page_route, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_route IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:pro-route:delete');
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工艺路线-导出', 'mes:pro-route:export', 3, 4, @page_route, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_route IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:pro-route:export');
INSERT INTO system_menu(id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT (SELECT IFNULL(MAX(id), 0) + 1 FROM system_menu), '工艺路线-导入', 'mes:pro-route:import', 3, 5, @page_route, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL
WHERE @page_route IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM system_menu WHERE deleted = b'0' AND permission = 'mes:pro-route:import');
-- =============================================
-- 3. æŽˆæƒ
--    ç”Ÿäº§ç®¡ç†å‘˜(SC)、经理(JL):全部
--    ç”Ÿäº§å‘˜(SCY):查看 + ç¼–辑/导出(不授予新增、删除、导入)
-- =============================================
INSERT INTO system_role_menu(role_id, menu_id, creator, create_time, updater, update_time, deleted)
SELECT r.id, m.id, '1', NOW(), '1', NOW(), b'0'
FROM system_role r
JOIN system_menu m ON m.deleted = b'0' AND (
        m.id = @base_dir
     OR m.parent_id IN (@page_item, @page_process, @page_route)
     OR m.id IN (@page_item, @page_process, @page_route))
    -- æ–°å¢ž/删除/导入属于管理动作,生产员不授予(见下方单独授权段)
    AND COALESCE(m.permission, '') NOT IN ('mes:md-item:create', 'mes:md-item:delete',
                                           'mes:pro-process:create', 'mes:pro-process:delete',
                                           'mes:pro-route:create', 'mes:pro-route:delete', 'mes:pro-route:import')
WHERE r.deleted = b'0' AND r.code IN ('SC', 'SCY', 'JL')
  AND NOT EXISTS (SELECT 1 FROM system_role_menu rm
                  WHERE rm.role_id = r.id AND rm.menu_id = m.id AND rm.deleted = b'0');
INSERT INTO system_role_menu(role_id, menu_id, creator, create_time, updater, update_time, deleted)
SELECT r.id, m.id, '1', NOW(), '1', NOW(), b'0'
FROM system_role r
JOIN system_menu m ON m.deleted = b'0'
    AND m.permission IN ('mes:md-item:create', 'mes:md-item:delete',
                         'mes:pro-process:create', 'mes:pro-process:delete',
                         'mes:pro-route:create', 'mes:pro-route:delete', 'mes:pro-route:import')
WHERE r.deleted = b'0' AND r.code IN ('SC', 'JL')
  AND NOT EXISTS (SELECT 1 FROM system_role_menu rm
                  WHERE rm.role_id = r.id AND rm.menu_id = m.id AND rm.deleted = b'0');
COMMIT;