-- 销售订单模块新增字段(2026-05-11) -- 说明: -- 1) 脚本按“存在则跳过,不存在则新增”执行,可重复执行。 -- 2) 物料号统一字段为 material_no;若历史存在 material,会回填到 material_no。 SET @db_name = DATABASE(); -- ---------------------------- -- sales_ledger 新增字段 -- ---------------------------- SELECT COUNT(*) INTO @cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger' AND COLUMN_NAME = 'order_type'; SET @sql = IF(@cnt = 0, 'ALTER TABLE sales_ledger ADD COLUMN order_type VARCHAR(64) NULL COMMENT ''订单类型''', 'SELECT ''skip: sales_ledger.order_type exists'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT COUNT(*) INTO @cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger' AND COLUMN_NAME = 'order_line'; SET @sql = IF(@cnt = 0, 'ALTER TABLE sales_ledger ADD COLUMN order_line VARCHAR(64) NULL COMMENT ''订单行''', 'SELECT ''skip: sales_ledger.order_line exists'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT COUNT(*) INTO @cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger' AND COLUMN_NAME = 'demand_date'; SET @sql = IF(@cnt = 0, 'ALTER TABLE sales_ledger ADD COLUMN demand_date DATE NULL COMMENT ''需求日期''', 'SELECT ''skip: sales_ledger.demand_date exists'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------- -- sales_ledger_product 新增字段 -- ---------------------------- SELECT COUNT(*) INTO @cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger_product' AND COLUMN_NAME = 'delivery_quantity'; SET @sql = IF(@cnt = 0, 'ALTER TABLE sales_ledger_product ADD COLUMN delivery_quantity DECIMAL(18,6) NULL COMMENT ''交货数量''', 'SELECT ''skip: sales_ledger_product.delivery_quantity exists'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT COUNT(*) INTO @cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger_product' AND COLUMN_NAME = 'remaining_quantity'; SET @sql = IF(@cnt = 0, 'ALTER TABLE sales_ledger_product ADD COLUMN remaining_quantity DECIMAL(18,6) NULL COMMENT ''剩余数量''', 'SELECT ''skip: sales_ledger_product.remaining_quantity exists'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT COUNT(*) INTO @cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger_product' AND COLUMN_NAME = 'sub_inventory'; SET @sql = IF(@cnt = 0, 'ALTER TABLE sales_ledger_product ADD COLUMN sub_inventory VARCHAR(128) NULL COMMENT ''子库存''', 'SELECT ''skip: sales_ledger_product.sub_inventory exists'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT COUNT(*) INTO @cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger_product' AND COLUMN_NAME = 'location'; SET @sql = IF(@cnt = 0, 'ALTER TABLE sales_ledger_product ADD COLUMN location VARCHAR(128) NULL COMMENT ''货位''', 'SELECT ''skip: sales_ledger_product.location exists'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT COUNT(*) INTO @cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger_product' AND COLUMN_NAME = 'is_spray'; SET @sql = IF(@cnt = 0, 'ALTER TABLE sales_ledger_product ADD COLUMN is_spray TINYINT(1) NULL COMMENT ''是否喷砂''', 'SELECT ''skip: sales_ledger_product.is_spray exists'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT COUNT(*) INTO @cnt FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger_product' AND COLUMN_NAME = 'material_no'; SET @sql = IF(@cnt = 0, 'ALTER TABLE sales_ledger_product ADD COLUMN material_no VARCHAR(128) NULL COMMENT ''物料号''', 'SELECT ''skip: sales_ledger_product.material_no exists'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ---------------------------- -- 历史数据兼容:material -> material_no -- ---------------------------- SELECT COUNT(*) INTO @has_old_material FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger_product' AND COLUMN_NAME = 'material'; SELECT COUNT(*) INTO @has_new_material_no FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'sales_ledger_product' AND COLUMN_NAME = 'material_no'; SET @sql = IF(@has_old_material = 1 AND @has_new_material_no = 1, 'UPDATE sales_ledger_product SET material_no = material WHERE (material_no IS NULL OR material_no = '''') AND material IS NOT NULL', 'SELECT ''skip: material -> material_no backfill'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 可选:确认前端/后端都已切换后,再评估是否删除旧列 material -- ALTER TABLE sales_ledger_product DROP COLUMN material;