-- ============================================= -- MES 生产管控 - 批次生产管理 + 赋码管理(一袋一码)初始化脚本 -- 包含:生产批次表、批次人员配置表、托盘码表、袋码赋码表、 -- 批次号自动编码规则、字典数据、菜单权限 -- MySQL 8.4 适用 -- ============================================= SET NAMES utf8mb4; -- ---------------------------- -- 1. 生产批次表(人—机—种) -- ---------------------------- CREATE TABLE IF NOT EXISTS `mes_pro_batch` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号', `code` VARCHAR(64) NOT NULL COMMENT '批次号(自动生成:前缀+日期+产线+品种+流水号)', `item_id` BIGINT NOT NULL COMMENT '品种(产品物料)编号,关联 mdm_item.id', `line_code` VARCHAR(32) DEFAULT NULL COMMENT '产线编码(手填,参与批次号生成)', `line_name` VARCHAR(64) DEFAULT NULL COMMENT '产线名称(手填)', `machinery_id` BIGINT DEFAULT NULL COMMENT '生产设备编号(机),关联 mes_dv_machinery.id', `work_order_id` BIGINT DEFAULT NULL COMMENT '关联生产工单编号,关联 mes_pro_work_order.id', `produce_date` DATETIME DEFAULT NULL COMMENT '生产日期', `plan_quantity` DECIMAL(24, 6) DEFAULT NULL COMMENT '计划数量', `owner_user_id` BIGINT DEFAULT NULL COMMENT '责任人用户编号(责任落实到人),关联 system_users.id', `bag_quantity` INT NOT NULL DEFAULT 0 COMMENT '已生成袋码数量(一袋一码)', `pallet_quantity` INT NOT NULL DEFAULT 0 COMMENT '已生成托盘码数量', `status` TINYINT NOT NULL DEFAULT 10 COMMENT '批次状态(字典 mes_pro_batch_status:10 草稿 20 生产中 30 已完成 40 已作废)', `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注', `creator` VARCHAR(64) DEFAULT '' COMMENT '创建者', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` VARCHAR(64) DEFAULT '' COMMENT '更新者', `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_code` (`code`), KEY `idx_item_id` (`item_id`), KEY `idx_work_order_id` (`work_order_id`), KEY `idx_status` (`status`) ) ENGINE = InnoDB COMMENT = 'MES 生产批次'; -- ---------------------------- -- 2. 批次生产人员配置表(责任落实到人) -- ---------------------------- CREATE TABLE IF NOT EXISTS `mes_pro_batch_worker` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号', `batch_id` BIGINT NOT NULL COMMENT '生产批次编号,关联 mes_pro_batch.id', `user_id` BIGINT NOT NULL COMMENT '生产人员用户编号,关联 system_users.id', `worker_type` TINYINT NOT NULL COMMENT '岗位类型(字典 mes_pro_batch_worker_type:10 组长 20 操作工 30 包装工 40 质检员 50 其他)', `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', `creator` VARCHAR(64) DEFAULT '' COMMENT '创建者', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` VARCHAR(64) DEFAULT '' COMMENT '更新者', `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), KEY `idx_batch_id` (`batch_id`), KEY `idx_user_id` (`user_id`) ) ENGINE = InnoDB COMMENT = 'MES 生产批次人员配置'; -- ---------------------------- -- 3. 托盘码表(与批次号自动关联) -- ---------------------------- CREATE TABLE IF NOT EXISTS `mes_pro_pallet` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号', `code` VARCHAR(64) NOT NULL COMMENT '托盘码(批次号-P+托盘序号,全局唯一)', `batch_id` BIGINT NOT NULL COMMENT '生产批次编号,关联 mes_pro_batch.id', `batch_code` VARCHAR(64) DEFAULT NULL COMMENT '批次号(冗余,便于展示)', `pallet_no` INT NOT NULL COMMENT '批次内托盘序号', `capacity` INT DEFAULT NULL COMMENT '可装袋数(袋/托盘)', `bag_count` INT NOT NULL DEFAULT 0 COMMENT '已绑定袋码数量', `status` TINYINT NOT NULL DEFAULT 10 COMMENT '状态(字典 mes_pro_pallet_status:10 启用 20 作废)', `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', `creator` VARCHAR(64) DEFAULT '' COMMENT '创建者', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` VARCHAR(64) DEFAULT '' COMMENT '更新者', `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_code` (`code`), KEY `idx_batch_id` (`batch_id`) ) ENGINE = InnoDB COMMENT = 'MES 托盘码'; -- ---------------------------- -- 4. 袋码赋码表(一袋一码,二维码数据包) -- ---------------------------- CREATE TABLE IF NOT EXISTS `mes_pro_bag_code` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号', `uuid` VARCHAR(32) DEFAULT NULL COMMENT '生成组 UUID(标记同一次生成的数据包)', `code` VARCHAR(64) NOT NULL COMMENT '袋码(二维码内容:批次号-袋序号,全局唯一)', `bag_no` INT NOT NULL COMMENT '批次内袋序号', `batch_id` BIGINT NOT NULL COMMENT '生产批次编号,关联 mes_pro_batch.id', `batch_code` VARCHAR(64) DEFAULT NULL COMMENT '批次号(冗余,便于展示)', `item_id` BIGINT DEFAULT NULL COMMENT '品种(产品物料)编号(冗余自批次)', `pallet_id` BIGINT DEFAULT NULL COMMENT '绑定托盘编号,关联 mes_pro_pallet.id', `pallet_code` VARCHAR(64) DEFAULT NULL COMMENT '托盘码(冗余,便于展示)', `status` TINYINT NOT NULL DEFAULT 10 COMMENT '状态(字典 mes_pro_bag_code_status:10 已生成 20 已导出印刷 30 已作废)', `print_time` DATETIME DEFAULT NULL COMMENT '导出(交付印刷)时间', `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', `creator` VARCHAR(64) DEFAULT '' COMMENT '创建者', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater` VARCHAR(64) DEFAULT '' COMMENT '更新者', `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_code` (`code`), KEY `idx_batch_id` (`batch_id`), KEY `idx_uuid` (`uuid`), KEY `idx_pallet_id` (`pallet_id`) ) ENGINE = InnoDB COMMENT = 'MES 袋码赋码(一袋一码)'; -- ---------------------------- -- 5. 批次号自动编码规则:PRO_BATCH_CODE -- 结构:固定字符(PC) + 日期(yyyyMMdd) + 输入字符(产线编码+品种编码) + 流水号(3位,按日循环) -- 示例:PC20260818L01NY001 -- ---------------------------- INSERT INTO `mes_md_auto_code_rule` (`code`, `name`, `description`, `max_length`, `padded`, `padded_char`, `padded_method`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) SELECT 'PRO_BATCH_CODE', '生产批次编码', '生产批次号:前缀+日期+产线+品种+流水号', 24, b'0', NULL, NULL, 0, '批次生产管理模块批次号', '1', NOW(), '1', NOW(), b'0' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM mes_md_auto_code_rule WHERE code = 'PRO_BATCH_CODE' AND deleted = 0) t); -- 规则分段(整体幂等:仅当该规则尚无任何分段时一次性插入 4 段) INSERT INTO `mes_md_auto_code_part` (`rule_id`, `sort`, `type`, `length`, `date_format`, `fix_character`, `serial_start_no`, `serial_step`, `cycle_flag`, `cycle_method`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) SELECT r.id, t.sort, t.type, t.length, t.date_format, t.fix_character, t.serial_start_no, t.serial_step, t.cycle_flag, t.cycle_method, t.remark, '1', NOW(), '1', NOW(), b'0' FROM mes_md_auto_code_rule r JOIN ( SELECT 1 AS sort, 3 AS type, 2 AS length, NULL AS date_format, 'PC' AS fix_character, NULL AS serial_start_no, NULL AS serial_step, b'0' AS cycle_flag, NULL AS cycle_method, '固定前缀' AS remark UNION ALL SELECT 2, 2, 8, 'yyyyMMdd', NULL, NULL, NULL, b'0', NULL, '生产日期' UNION ALL SELECT 3, 1, 8, NULL, NULL, NULL, NULL, b'0', NULL, '产线编码+品种编码(输入字符)' UNION ALL SELECT 4, 4, 3, NULL, NULL, 1, 1, b'1', 3, '流水号(按日循环)' ) t WHERE r.code = 'PRO_BATCH_CODE' AND r.deleted = 0 AND NOT EXISTS (SELECT 1 FROM mes_md_auto_code_part p WHERE p.rule_id = r.id AND p.deleted = 0); -- ---------------------------- -- 6. 字典类型 + 字典数据 -- ---------------------------- INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) SELECT 'MES 生产批次状态', 'mes_pro_batch_status', 0, '批次生产管理', '1', NOW(), '1', NOW(), b'0' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_dict_type WHERE type = 'mes_pro_batch_status' AND deleted = 0) t); INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) SELECT 'MES 批次人员岗位类型', 'mes_pro_batch_worker_type', 0, '批次生产人员配置', '1', NOW(), '1', NOW(), b'0' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_dict_type WHERE type = 'mes_pro_batch_worker_type' AND deleted = 0) t); INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) SELECT 'MES 袋码状态', 'mes_pro_bag_code_status', 0, '赋码管理(一袋一码)', '1', NOW(), '1', NOW(), b'0' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_dict_type WHERE type = 'mes_pro_bag_code_status' AND deleted = 0) t); INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) SELECT 'MES 托盘码状态', 'mes_pro_pallet_status', 0, '托盘码管理', '1', NOW(), '1', NOW(), b'0' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM (SELECT id FROM system_dict_type WHERE type = 'mes_pro_pallet_status' AND deleted = 0) t); -- 字典数据(显式 ID,避免冲突) INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1065350, 1, '草稿', '10', 'mes_pro_batch_status', 0, 'info', '', '1', NOW(), '1', NOW(), b'0'), (1065351, 2, '生产中', '20', 'mes_pro_batch_status', 0, 'primary', '', '1', NOW(), '1', NOW(), b'0'), (1065352, 3, '已完成', '30', 'mes_pro_batch_status', 0, 'success', '', '1', NOW(), '1', NOW(), b'0'), (1065353, 4, '已作废', '40', 'mes_pro_batch_status', 0, 'danger', '', '1', NOW(), '1', NOW(), b'0'), (1065354, 1, '组长', '10', 'mes_pro_batch_worker_type', 0, 'primary', '', '1', NOW(), '1', NOW(), b'0'), (1065355, 2, '操作工', '20', 'mes_pro_batch_worker_type', 0, 'default', '', '1', NOW(), '1', NOW(), b'0'), (1065356, 3, '包装工', '30', 'mes_pro_batch_worker_type', 0, 'default', '', '1', NOW(), '1', NOW(), b'0'), (1065357, 4, '质检员', '40', 'mes_pro_batch_worker_type', 0, 'warning', '', '1', NOW(), '1', NOW(), b'0'), (1065358, 5, '其他', '50', 'mes_pro_batch_worker_type', 0, 'info', '', '1', NOW(), '1', NOW(), b'0'), (1065359, 1, '已生成', '10', 'mes_pro_bag_code_status', 0, 'info', '', '1', NOW(), '1', NOW(), b'0'), (1065360, 2, '已导出印刷', '20', 'mes_pro_bag_code_status', 0, 'success', '', '1', NOW(), '1', NOW(), b'0'), (1065361, 3, '已作废', '30', 'mes_pro_bag_code_status', 0, 'danger', '', '1', NOW(), '1', NOW(), b'0'), (1065362, 1, '启用', '10', 'mes_pro_pallet_status', 0, 'primary', '', '1', NOW(), '1', NOW(), b'0'), (1065363, 2, '作废', '20', 'mes_pro_pallet_status', 0, 'danger', '', '1', NOW(), '1', NOW(), b'0'); -- ---------------------------- -- 7. 菜单与按钮权限(挂在 5700 生产管理 下) -- ---------------------------- -- 批次生产管理 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`) VALUES (602612, '批次生产管理', '', 2, 10, 5700, 'batch', 'ep:collection-tag', 'mes/pro/batch/index', 'MesProBatch', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); 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`) VALUES (602613, '生产批次查询', 'mes:pro-batch:query', 3, 1, 602612, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602614, '生产批次创建', 'mes:pro-batch:create', 3, 2, 602612, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602615, '生产批次更新', 'mes:pro-batch:update', 3, 3, 602612, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602616, '生产批次删除', 'mes:pro-batch:delete', 3, 4, 602612, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602617, '生产批次导出', 'mes:pro-batch:export', 3, 5, 602612, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); -- 赋码管理(一袋一码) 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`) VALUES (602618, '赋码管理', '', 2, 11, 5700, 'bag-code', 'ep:connection', 'mes/pro/bagCode/index', 'MesProBagCode', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); 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`) VALUES (602619, '袋码查询', 'mes:pro-bag-code:query', 3, 1, 602618, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602620, '生成二维码数据包', 'mes:pro-bag-code:generate', 3, 2, 602618, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602621, '袋码删除', 'mes:pro-bag-code:delete', 3, 3, 602618, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602622, '袋码导出', 'mes:pro-bag-code:export', 3, 4, 602618, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602623, '袋码绑定托盘', 'mes:pro-bag-code:bind', 3, 5, 602618, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); -- 托盘码管理 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`) VALUES (602624, '托盘码管理', '', 2, 12, 5700, 'pallet', 'ep:box', 'mes/pro/pallet/index', 'MesProPallet', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); 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`) VALUES (602625, '托盘码查询', 'mes:pro-pallet:query', 3, 1, 602624, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602626, '托盘码生成', 'mes:pro-pallet:create', 3, 2, 602624, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602627, '托盘码删除', 'mes:pro-pallet:delete', 3, 3, 602624, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), (602628, '托盘码导出', 'mes:pro-pallet:export', 3, 4, 602624, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');