224 lines
8.8 KiB
Transact-SQL
224 lines
8.8 KiB
Transact-SQL
-- ============================================================
|
|
-- 订单数据迁移验证脚本
|
|
-- Feature: database-migration, Property 2: 数据记录数一致性
|
|
-- Feature: database-migration, Property 4: 财务数据一致性
|
|
-- Validates: Requirements 3.5, 11.1, 11.3
|
|
-- ============================================================
|
|
|
|
SET NOCOUNT ON;
|
|
|
|
PRINT '========================================';
|
|
PRINT '订单数据迁移验证报告';
|
|
PRINT '执行时间: ' + CONVERT(VARCHAR, GETDATE(), 120);
|
|
PRINT '========================================';
|
|
PRINT '';
|
|
|
|
-- ============================================================
|
|
-- 1. 验证记录数一致性 (Property 2)
|
|
-- ============================================================
|
|
PRINT '1. 验证记录数一致性';
|
|
PRINT '----------------------------------------';
|
|
|
|
DECLARE @orders_count INT;
|
|
DECLARE @order_items_count INT;
|
|
DECLARE @order_items_recovery_count INT;
|
|
DECLARE @order_items_send_count INT;
|
|
|
|
-- 预期值 (来自 MySQL 源数据库)
|
|
DECLARE @expected_orders INT = 15;
|
|
DECLARE @expected_order_items INT = 67;
|
|
DECLARE @expected_order_items_recovery INT = 8;
|
|
DECLARE @expected_order_items_send INT = 0;
|
|
|
|
SELECT @orders_count = COUNT(*) FROM orders;
|
|
SELECT @order_items_count = COUNT(*) FROM order_items;
|
|
SELECT @order_items_recovery_count = COUNT(*) FROM order_items_recovery;
|
|
SELECT @order_items_send_count = COUNT(*) FROM order_items_send;
|
|
|
|
PRINT 'orders 表: 预期 ' + CAST(@expected_orders AS VARCHAR) + ' 条, 实际 ' + CAST(@orders_count AS VARCHAR) + ' 条 ' +
|
|
CASE WHEN @orders_count = @expected_orders THEN '✓ 通过' ELSE '✗ 失败' END;
|
|
PRINT 'order_items 表: 预期 ' + CAST(@expected_order_items AS VARCHAR) + ' 条, 实际 ' + CAST(@order_items_count AS VARCHAR) + ' 条 ' +
|
|
CASE WHEN @order_items_count = @expected_order_items THEN '✓ 通过' ELSE '✗ 失败' END;
|
|
PRINT 'order_items_recovery 表: 预期 ' + CAST(@expected_order_items_recovery AS VARCHAR) + ' 条, 实际 ' + CAST(@order_items_recovery_count AS VARCHAR) + ' 条 ' +
|
|
CASE WHEN @order_items_recovery_count = @expected_order_items_recovery THEN '✓ 通过' ELSE '✗ 失败' END;
|
|
PRINT 'order_items_send 表: 预期 ' + CAST(@expected_order_items_send AS VARCHAR) + ' 条, 实际 ' + CAST(@order_items_send_count AS VARCHAR) + ' 条 ' +
|
|
CASE WHEN @order_items_send_count = @expected_order_items_send THEN '✓ 通过' ELSE '✗ 失败' END;
|
|
|
|
PRINT '';
|
|
|
|
-- ============================================================
|
|
-- 2. 验证订单金额一致性 (Property 4)
|
|
-- ============================================================
|
|
PRINT '2. 验证订单金额一致性';
|
|
PRINT '----------------------------------------';
|
|
|
|
DECLARE @total_order_amount DECIMAL(18,2);
|
|
DECLARE @total_use_money DECIMAL(18,2);
|
|
DECLARE @total_use_integral DECIMAL(18,2);
|
|
DECLARE @total_use_money2 DECIMAL(18,2);
|
|
|
|
-- 预期值 (来自 MySQL 源数据库计算)
|
|
DECLARE @expected_total_order_amount DECIMAL(18,2) = 722.10;
|
|
|
|
SELECT @total_order_amount = SUM(order_total) FROM orders;
|
|
SELECT @total_use_money = SUM(use_money) FROM orders;
|
|
SELECT @total_use_integral = SUM(use_integral) FROM orders;
|
|
SELECT @total_use_money2 = SUM(use_money2) FROM orders;
|
|
|
|
PRINT '订单总金额 (order_total): ' + CAST(@total_order_amount AS VARCHAR) + ' 元 ' +
|
|
CASE WHEN @total_order_amount = @expected_total_order_amount THEN '✓ 通过' ELSE '✗ 失败 (预期: ' + CAST(@expected_total_order_amount AS VARCHAR) + ')' END;
|
|
PRINT '使用余额总额 (use_money): ' + CAST(@total_use_money AS VARCHAR) + ' 元';
|
|
PRINT '使用积分总额 (use_integral): ' + CAST(@total_use_integral AS VARCHAR) + ' 元';
|
|
PRINT '使用积分2总额 (use_money2): ' + CAST(@total_use_money2 AS VARCHAR) + ' 元';
|
|
|
|
PRINT '';
|
|
|
|
-- ============================================================
|
|
-- 3. 验证回收金额一致性 (Property 4)
|
|
-- ============================================================
|
|
PRINT '3. 验证回收金额一致性';
|
|
PRINT '----------------------------------------';
|
|
|
|
DECLARE @total_recovery_money DECIMAL(18,2);
|
|
DECLARE @total_recovery_count INT;
|
|
|
|
-- 预期值 (来自 MySQL 源数据库计算)
|
|
DECLARE @expected_recovery_money DECIMAL(18,2) = 112.00;
|
|
DECLARE @expected_recovery_count INT = 9;
|
|
|
|
SELECT @total_recovery_money = SUM(money) FROM order_items_recovery;
|
|
SELECT @total_recovery_count = SUM(count) FROM order_items_recovery;
|
|
|
|
PRINT '回收总金额: ' + CAST(ISNULL(@total_recovery_money, 0) AS VARCHAR) + ' 元 ' +
|
|
CASE WHEN ISNULL(@total_recovery_money, 0) = @expected_recovery_money THEN '✓ 通过' ELSE '✗ 失败 (预期: ' + CAST(@expected_recovery_money AS VARCHAR) + ')' END;
|
|
PRINT '回收总数量: ' + CAST(ISNULL(@total_recovery_count, 0) AS VARCHAR) + ' 件 ' +
|
|
CASE WHEN ISNULL(@total_recovery_count, 0) = @expected_recovery_count THEN '✓ 通过' ELSE '✗ 失败 (预期: ' + CAST(@expected_recovery_count AS VARCHAR) + ')' END;
|
|
|
|
PRINT '';
|
|
|
|
-- ============================================================
|
|
-- 4. 验证支付方式组合字段完整性 (Requirements 3.5)
|
|
-- ============================================================
|
|
PRINT '4. 验证支付方式组合字段完整性';
|
|
PRINT '----------------------------------------';
|
|
|
|
DECLARE @payment_fields_count INT;
|
|
|
|
SELECT @payment_fields_count = COUNT(*)
|
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
WHERE TABLE_NAME = 'orders'
|
|
AND COLUMN_NAME IN ('use_money', 'use_integral', 'use_score', 'use_coupon', 'use_money2', 'use_draw', 'use_item_card');
|
|
|
|
IF @payment_fields_count >= 7
|
|
PRINT '✓ 支付方式组合字段完整 (' + CAST(@payment_fields_count AS VARCHAR) + '/7)';
|
|
ELSE
|
|
PRINT '✗ 支付方式组合字段不完整 (' + CAST(@payment_fields_count AS VARCHAR) + '/7)';
|
|
|
|
PRINT '';
|
|
|
|
-- ============================================================
|
|
-- 5. 验证订单与订单详情关联
|
|
-- ============================================================
|
|
PRINT '5. 验证订单与订单详情关联';
|
|
PRINT '----------------------------------------';
|
|
|
|
DECLARE @orphan_items INT;
|
|
|
|
SELECT @orphan_items = COUNT(*)
|
|
FROM order_items oi
|
|
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.id = oi.order_id);
|
|
|
|
IF @orphan_items = 0
|
|
PRINT '✓ 所有订单详情都有对应的订单记录';
|
|
ELSE
|
|
PRINT '✗ 存在 ' + CAST(@orphan_items AS VARCHAR) + ' 条孤立的订单详情记录';
|
|
|
|
PRINT '';
|
|
|
|
-- ============================================================
|
|
-- 6. 验证时间戳转换正确性 (Property 3)
|
|
-- ============================================================
|
|
PRINT '6. 验证时间戳转换正确性';
|
|
PRINT '----------------------------------------';
|
|
|
|
-- 抽样验证: 检查 created_at 是否与 addtime 转换一致
|
|
DECLARE @timestamp_mismatch INT;
|
|
|
|
SELECT @timestamp_mismatch = COUNT(*)
|
|
FROM orders
|
|
WHERE ABS(DATEDIFF(SECOND, created_at, DATEADD(SECOND, addtime, '1970-01-01'))) > 1;
|
|
|
|
IF @timestamp_mismatch = 0
|
|
PRINT '✓ 所有订单的时间戳转换正确';
|
|
ELSE
|
|
PRINT '✗ 存在 ' + CAST(@timestamp_mismatch AS VARCHAR) + ' 条时间戳转换不一致的记录';
|
|
|
|
PRINT '';
|
|
|
|
-- ============================================================
|
|
-- 7. 验证订单状态分布
|
|
-- ============================================================
|
|
PRINT '7. 验证订单状态分布';
|
|
PRINT '----------------------------------------';
|
|
|
|
SELECT
|
|
status AS '订单状态',
|
|
COUNT(*) AS '数量',
|
|
CASE status
|
|
WHEN 0 THEN '待支付'
|
|
WHEN 1 THEN '已支付'
|
|
WHEN 2 THEN '已取消'
|
|
ELSE '其他'
|
|
END AS '状态说明'
|
|
FROM orders
|
|
GROUP BY status
|
|
ORDER BY status;
|
|
|
|
PRINT '';
|
|
|
|
-- ============================================================
|
|
-- 8. 验证订单详情状态分布
|
|
-- ============================================================
|
|
PRINT '8. 验证订单详情状态分布';
|
|
PRINT '----------------------------------------';
|
|
|
|
SELECT
|
|
status AS '详情状态',
|
|
COUNT(*) AS '数量',
|
|
CASE status
|
|
WHEN 0 THEN '待处理'
|
|
WHEN 1 THEN '已回收'
|
|
WHEN 2 THEN '已发货'
|
|
ELSE '其他'
|
|
END AS '状态说明'
|
|
FROM order_items
|
|
GROUP BY status
|
|
ORDER BY status;
|
|
|
|
PRINT '';
|
|
|
|
-- ============================================================
|
|
-- 验证总结
|
|
-- ============================================================
|
|
PRINT '========================================';
|
|
PRINT '验证总结';
|
|
PRINT '========================================';
|
|
|
|
DECLARE @all_passed BIT = 1;
|
|
|
|
IF @orders_count <> @expected_orders SET @all_passed = 0;
|
|
IF @order_items_count <> @expected_order_items SET @all_passed = 0;
|
|
IF @order_items_recovery_count <> @expected_order_items_recovery SET @all_passed = 0;
|
|
IF @order_items_send_count <> @expected_order_items_send SET @all_passed = 0;
|
|
IF @total_order_amount <> @expected_total_order_amount SET @all_passed = 0;
|
|
IF @orphan_items > 0 SET @all_passed = 0;
|
|
IF @timestamp_mismatch > 0 SET @all_passed = 0;
|
|
|
|
IF @all_passed = 1
|
|
PRINT '✓ 所有验证项目通过!';
|
|
ELSE
|
|
PRINT '✗ 部分验证项目失败,请检查上述详细信息';
|
|
|
|
PRINT '';
|
|
PRINT '验证完成!';
|