Files
MES/yawei-mes/.sql/2026-02-05_v1.6.037_周启威_生产计划改进.sql
2026-04-02 10:39:03 +08:00

259 lines
12 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =====================================================
-- 生产计划优化 v1.6.037
-- 作者: 周启威
-- 日期: 2026-02-25
-- 说明: 优化生产计划创建流程,支持多订单批量处理
-- =====================================================
-- -----------------------------------------------------
-- 1. 生产计划表扩展字段(如果不存在)
-- -----------------------------------------------------
-- 添加计划周期字段
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND column_name = 'schedule_cycle';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pro_plan` ADD COLUMN `schedule_cycle` varchar(20) DEFAULT NULL COMMENT ''计划周期year=年计划,month=月计划,week=周计划'' AFTER `plan_type`',
'SELECT ''Column schedule_cycle already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加计划年份字段
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND column_name = 'plan_year';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pro_plan` ADD COLUMN `plan_year` int DEFAULT NULL COMMENT ''计划年份'' AFTER `schedule_cycle`',
'SELECT ''Column plan_year already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加月份字段
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND column_name = 'month_number';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pro_plan` ADD COLUMN `month_number` int DEFAULT NULL COMMENT ''月份1-12'' AFTER `plan_year`',
'SELECT ''Column month_number already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加周数字段
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND column_name = 'week_number';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pro_plan` ADD COLUMN `week_number` int DEFAULT NULL COMMENT ''周数1-53'' AFTER `month_number`',
'SELECT ''Column week_number already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加开始时间字段(如果不存在)
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND column_name = 'start_time';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pro_plan` ADD COLUMN `start_time` datetime DEFAULT NULL COMMENT ''开始时间'' AFTER `week_number`',
'SELECT ''Column start_time already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加结束时间字段(如果不存在)
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND column_name = 'end_time';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pro_plan` ADD COLUMN `end_time` datetime DEFAULT NULL COMMENT ''结束时间'' AFTER `start_time`',
'SELECT ''Column end_time already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加关联订单ID列表字段
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND column_name = 'related_order_ids';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `pro_plan` ADD COLUMN `related_order_ids` text DEFAULT NULL COMMENT ''关联订单ID列表JSON格式'' AFTER `plan_analysis`',
'SELECT ''Column related_order_ids already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- -----------------------------------------------------
-- 2. 添加索引优化查询性能
-- -----------------------------------------------------
-- 计划周期索引
SET @index_exists = 0;
SELECT COUNT(*) INTO @index_exists FROM information_schema.statistics
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND index_name = 'idx_schedule_cycle';
SET @sql = IF(@index_exists = 0,
'ALTER TABLE `pro_plan` ADD INDEX `idx_schedule_cycle` (`schedule_cycle`)',
'SELECT ''Index idx_schedule_cycle already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 年份+周数索引
SET @index_exists = 0;
SELECT COUNT(*) INTO @index_exists FROM information_schema.statistics
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND index_name = 'idx_year_week';
SET @sql = IF(@index_exists = 0,
'ALTER TABLE `pro_plan` ADD INDEX `idx_year_week` (`plan_year`, `week_number`)',
'SELECT ''Index idx_year_week already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 年份+月份索引
SET @index_exists = 0;
SELECT COUNT(*) INTO @index_exists FROM information_schema.statistics
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND index_name = 'idx_year_month';
SET @sql = IF(@index_exists = 0,
'ALTER TABLE `pro_plan` ADD INDEX `idx_year_month` (`plan_year`, `month_number`)',
'SELECT ''Index idx_year_month already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 工序路线索引(如果不存在)
SET @index_exists = 0;
SELECT COUNT(*) INTO @index_exists FROM information_schema.statistics
WHERE table_schema = DATABASE() AND table_name = 'pro_plan' AND index_name = 'idx_route_id';
SET @sql = IF(@index_exists = 0,
'ALTER TABLE `pro_plan` ADD INDEX `idx_route_id` (`route_id`)',
'SELECT ''Index idx_route_id already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- -----------------------------------------------------
-- 3. 产品表验证和索引优化
-- -----------------------------------------------------
-- 验证产品表中是否存在route_id字段默认工序路线ID
-- 该字段已存在于md_material表中用于存储产品的默认工序路线
-- 如果不存在,则添加该字段
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'md_material' AND column_name = 'route_id';
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `md_material` ADD COLUMN `route_id` bigint DEFAULT NULL COMMENT ''默认工序路线ID'' AFTER `update_time`',
'SELECT ''Column route_id already exists in md_material'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 为产品表的route_id字段创建索引优化工序路线查询性能
SET @index_exists = 0;
SELECT COUNT(*) INTO @index_exists FROM information_schema.statistics
WHERE table_schema = DATABASE() AND table_name = 'md_material' AND index_name = 'idx_material_route_id';
SET @sql = IF(@index_exists = 0,
'ALTER TABLE `md_material` ADD INDEX `idx_material_route_id` (`route_id`)',
'SELECT ''Index idx_material_route_id already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- -----------------------------------------------------
-- 4. 工单表验证和索引优化
-- -----------------------------------------------------
-- 验证工单表中是否存在source_type字段来源类型
-- 该字段已存在于pro_workorder表中用于标识工单的来源如"plan"表示来自计划)
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'pro_workorder' AND column_name = 'source_type';
SELECT IF(@col_exists > 0,
'Column source_type exists in pro_workorder',
'WARNING: Column source_type does NOT exist in pro_workorder') AS verification_result;
-- 验证工单表中是否存在source_info字段来源信息
-- 该字段已存在于pro_workorder表中用于存储计划ID和订单信息JSON格式
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'pro_workorder' AND column_name = 'source_info';
SELECT IF(@col_exists > 0,
'Column source_info exists in pro_workorder',
'WARNING: Column source_info does NOT exist in pro_workorder') AS verification_result;
-- 为source_type字段创建索引优化按来源类型查询工单的性能
SET @index_exists = 0;
SELECT COUNT(*) INTO @index_exists FROM information_schema.statistics
WHERE table_schema = DATABASE() AND table_name = 'pro_workorder' AND index_name = 'idx_source_type';
SET @sql = IF(@index_exists = 0,
'ALTER TABLE `pro_workorder` ADD INDEX `idx_source_type` (`source_type`)',
'SELECT ''Index idx_source_type already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 为material_id字段创建索引如果不存在优化按产品查询工单的性能
-- 注意:该索引可能已存在,脚本会自动检查
SET @index_exists = 0;
SELECT COUNT(*) INTO @index_exists FROM information_schema.statistics
WHERE table_schema = DATABASE() AND table_name = 'pro_workorder' AND index_name = 'idx_workorder_material';
SET @sql = IF(@index_exists = 0,
'ALTER TABLE `pro_workorder` ADD INDEX `idx_workorder_material` (`material_id`)',
'SELECT ''Index idx_workorder_material already exists'' AS message');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- -----------------------------------------------------
-- 5. 更新计划周期字典数据(如果不存在)
-- -----------------------------------------------------
-- 检查并插入年计划字典
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
SELECT 0, '年计划', 'year', 'pro_schedule_cycle', '', 'danger', 'N', '0', 'admin', NOW(), '按年制定的生产计划'
WHERE NOT EXISTS (
SELECT 1 FROM sys_dict_data WHERE dict_type = 'pro_schedule_cycle' AND dict_value = 'year'
);
-- 检查并插入周计划字典
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
SELECT 1, '周计划', 'week', 'pro_schedule_cycle', '', 'primary', 'N', '0', 'admin', NOW(), '按周制定的生产计划'
WHERE NOT EXISTS (
SELECT 1 FROM sys_dict_data WHERE dict_type = 'pro_schedule_cycle' AND dict_value = 'week'
);
-- 检查并插入月计划字典
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
SELECT 2, '月计划', 'month', 'pro_schedule_cycle', '', 'success', 'N', '0', 'admin', NOW(), '按月制定的生产计划'
WHERE NOT EXISTS (
SELECT 1 FROM sys_dict_data WHERE dict_type = 'pro_schedule_cycle' AND dict_value = 'month'
);
-- -----------------------------------------------------
-- 6. 说明
-- -----------------------------------------------------
-- 本次优化不新增表,使用现有表结构:
-- - pro_plan: 生产计划表(扩展字段)
-- - pro_workorder: 工单主表已验证source_type和source_info字段存在用于关联计划
-- - pro_workorder_entry: 工单子表(工序明细)
-- - pro_report: 报工单表(报工记录)
--
-- 字段验证结果:
-- - pro_workorder.source_type: 已存在,用于标识工单来源(如"plan"
-- - pro_workorder.source_info: 已存在用于存储计划ID和订单信息JSON格式
-- - md_material.route_id: 已验证/添加用于存储产品的默认工序路线ID
--
-- 多订单处理方式:
-- - plan_analysis字段存储JSON格式的多订单分析数据
-- - related_order_ids字段存储关联的订单ID列表
-- - 每个订单生成一个工单通过source_type="plan"和source_info关联到计划
-- - 工单子表记录每个工序的明细
-- - 报工单记录每个工序的报工情况
--
-- 索引优化:
-- - pro_plan: 添加schedule_cycle、year_week、year_month、route_id索引
-- - md_material: 添加route_id索引
-- - pro_workorder: 添加source_type索引优化按来源类型查询性能