-- ============================================================================= -- 袋码绑定托盘(免先录生产批次)—— 数据库脚本 -- 日期:2026-10-16 -- 关联提交:66517edf feat(mes): 袋码绑定托盘免先录生产批次 -- -- 【结论】本次改动 **不需要任何 DDL,也不需要新增菜单/权限数据**。 -- 本脚本只做部署前自检与回归核对,直接执行即可,不产生任何结构变更。 -- -- 依据: -- 1. 新接口 GET /mes/pro/pallet/bindable-list 复用已有权限 mes:pro-pallet:query -- (system_menu.id = 602625),未引入新权限码,故无需 INSERT system_menu / -- system_role_menu。 -- 2. 该接口只查询 mes_pro_pallet 的现有列: -- status / item_id / batch_id / batch_code / code / temp_code / bag_count / deleted, -- 未新增表、列或索引。 -- 3. 「绑定托盘」的写路径(含未录批次袋码自动补录批次)复用既有 -- mes_pro_bag_code / mes_pro_pallet / mes_pro_batch 列,无结构变化。 -- ============================================================================= -- ----------------------------------------------------------------------------- -- 自检 1:新接口依赖的权限已存在且启用(期望返回 1 行,status = 0) -- ----------------------------------------------------------------------------- SELECT id, name, permission, type, status FROM system_menu WHERE permission = 'mes:pro-pallet:query'; -- ----------------------------------------------------------------------------- -- 自检 2:接口用到的 mes_pro_pallet 列齐全(期望返回 9 行) -- ----------------------------------------------------------------------------- SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mes_pro_pallet' AND COLUMN_NAME IN ( 'id', 'status', 'item_id', 'batch_id', 'batch_code', 'code', 'temp_code', 'bag_count', 'deleted' ) ORDER BY COLUMN_NAME; -- ----------------------------------------------------------------------------- -- 自检 3:确认「绑定托盘」按钮权限与托盘查询权限的持有角色 -- 说明:bindable-list 需要 mes:pro-pallet:query;绑定按钮需要 mes:pro-bag-code:update。 -- 若某角色此前能正常打开「绑定托盘」弹窗并拉到托盘下拉,说明它已持有 -- mes:pro-pallet:query(旧实现下拉走的也是托盘查询接口),无需补授权。 -- 超级管理员(super_admin)走放行逻辑,不体现在 system_role_menu 中。 -- ----------------------------------------------------------------------------- SELECT r.id AS role_id, r.name AS role_name, r.code AS role_code, m.permission FROM system_role r JOIN system_role_menu rm ON rm.role_id = r.id JOIN system_menu m ON m.id = rm.menu_id WHERE m.permission IN ('mes:pro-pallet:query', 'mes:pro-bag-code:update') ORDER BY r.id, m.permission; -- ----------------------------------------------------------------------------- -- 可选授权:仅当需要给「非超级管理员角色」开通赋码管理时执行(默认无需执行) -- 把 @role_id 换成目标角色编号;已授权的菜单由 NOT EXISTS 跳过,可重复执行。 -- ----------------------------------------------------------------------------- -- SET @role_id = 2; -- -- INSERT INTO system_role_menu (role_id, menu_id, creator, create_time, updater, update_time, deleted) -- SELECT @role_id, m.id, 'admin', NOW(), 'admin', NOW(), b'0' -- FROM system_menu m -- WHERE m.permission = 'mes:pro-pallet:query' -- AND NOT EXISTS ( -- SELECT 1 FROM system_role_menu rm -- WHERE rm.role_id = @role_id AND rm.menu_id = m.id -- ); -- ----------------------------------------------------------------------------- -- 回归核对:批次汇总字段与明细是否一致 -- 改造后「未录批次袋码绑到某批次的正式托盘」会自动补录批次,需确认 -- mes_pro_batch.bag_quantity / pallet_quantity 与明细同步。 -- 用法:把 @batch_id 换成验证用批次编号,对比绑定操作前后的输出。 -- 期望:bag_quantity = 实际有效袋码数,pallet_quantity = 实际托盘数。 -- ----------------------------------------------------------------------------- -- SET @batch_id = 123; -- -- SELECT b.id, -- b.code, -- b.status, -- b.item_id, -- b.bag_quantity AS 批次登记袋数, -- (SELECT COUNT(*) FROM mes_pro_bag_code bc -- WHERE bc.batch_id = b.id AND bc.deleted = b'0' AND bc.status <> 30) AS 实际有效袋码数, -- b.pallet_quantity AS 批次登记托盘数, -- (SELECT COUNT(*) FROM mes_pro_pallet p -- WHERE p.batch_id = b.id AND p.deleted = b'0') AS 实际托盘数 -- FROM mes_pro_batch b -- WHERE b.id = @batch_id; -- ----------------------------------------------------------------------------- -- 回归核对:找出「托盘有批次、袋码却无批次」的漏补录数据 -- 正常应为 0 行。若存在,说明有袋码挂在某批次的托盘上却没录入批次。 -- ----------------------------------------------------------------------------- SELECT p.id AS pallet_id, p.code AS pallet_code, p.batch_id, p.batch_code, COUNT(bc.id) AS 未录批次袋码数 FROM mes_pro_pallet p JOIN mes_pro_bag_code bc ON bc.pallet_id = p.id AND bc.deleted = b'0' AND bc.batch_id IS NULL WHERE p.deleted = b'0' AND p.batch_id IS NOT NULL GROUP BY p.id, p.code, p.batch_id, p.batch_code;