iloom-flatten/e2e/database-validation.sql

345 lines
13 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.

-- ============================================================================
-- 全流程模拟测试 - 数据库验证脚本
-- ============================================================================
-- 用途:验证采购商下单 → 分享链接 → 纺织厂确认 → 生产流程 → 分批次入库
-- 的完整业务流程数据一致性
--
-- 执行方式:通过 meoo-cli cloud query --sql "..." 逐条执行
-- ============================================================================
-- ============================================================================
-- 阶段零:环境准备(清理旧数据,模拟首次合作)
-- ============================================================================
-- 0.1 清理旧的合作关系(模拟首次合作场景)
DELETE FROM company_relationships
WHERE purchaser_company_id = '11111111-1111-1111-1111-111111111101'
AND factory_company_id = '11111111-1111-1111-1111-111111111102';
-- 0.2 清理旧的测试计划(避免重复)
DELETE FROM production_plans WHERE plan_code = 'TEST-2026-001';
-- 0.3 清理旧的测试产品
DELETE FROM products WHERE fabric_code = 'QM-XW-280-01'
AND company_id = '11111111-1111-1111-1111-111111111101';
-- ============================================================================
-- 阶段一:采购商创建产品和生产计划
-- ============================================================================
-- 1.1 创建产品信息
INSERT INTO products (
company_id, product_name, weight, color, fabric_code, color_code,
yarn_usage_per_meter, yarn_types, yarn_ratios, raw_fabric_rolls,
raw_fabric_meters, total_stock, production_price, warp_weight,
weft_weight, total_weight
) VALUES (
'11111111-1111-1111-1111-111111111101', -- 采购商公司ID
'全棉斜纹布',
280,
'藏青',
'QM-XW-280-01',
'01',
350,
ARRAY['精梳棉纱','涤纶纱'],
ARRAY[0.7,0.3],
0,
0,
0,
18.5,
160,
120,
280
);
-- 1.2 获取刚创建的产品ID用于后续关联
-- SELECT id FROM products WHERE fabric_code = 'QM-XW-280-01'
-- AND company_id = '11111111-1111-1111-1111-111111111101';
-- 1.3 创建生产计划
INSERT INTO production_plans (
plan_code, product_name, color, fabric_code, color_code,
remark, purchaser_id, target_quantity, completed_quantity,
yarn_usage_per_meter, production_price, status, start_time, created_by
) VALUES (
'TEST-2026-001',
'全棉斜纹布',
'藏青',
'QM-XW-280-01',
'01',
'模拟测试订单',
'11111111-1111-1111-1111-111111111101', -- 采购商公司ID
10000, -- 目标产量10000米
0, -- 初始完成量为0
350, -- 每米纱用量
18.5, -- 生产采购价
'pending',
NOW(),
'a0000001-0000-0000-0000-000000000001' -- 采购商用户ID
);
-- 1.4 获取刚创建的计划ID用于后续关联
-- SELECT id FROM production_plans WHERE plan_code = 'TEST-2026-001';
-- 1.5 创建纱线配比假设计划ID为 {plan_id}
-- INSERT INTO yarn_ratios (plan_id, yarn_name, ratio, amount_per_meter, total_amount, company_id)
-- VALUES ('{plan_id}', '精梳棉纱', 0.7, 245, 2450000, '11111111-1111-1111-1111-111111111101'),
-- ('{plan_id}', '涤纶纱', 0.3, 105, 1050000, '11111111-1111-1111-1111-111111111101');
-- 1.6 创建流程节点5个标准节点
-- INSERT INTO plan_process_steps (plan_id, step_type, status, company_id)
-- VALUES ('{plan_id}', 'confirm', 'pending', '11111111-1111-1111-1111-111111111101'),
-- ('{plan_id}', 'yarn_purchase', 'pending', '11111111-1111-1111-1111-111111111101'),
-- ('{plan_id}', 'dyeing', 'pending', '11111111-1111-1111-1111-111111111101'),
-- ('{plan_id}', 'machine_start', 'pending', '11111111-1111-1111-1111-111111111101'),
-- ('{plan_id}', 'fabric_warehouse', 'pending', '11111111-1111-1111-1111-111111111101');
-- ============================================================================
-- 阶段二:生成分享链接(首次合作)
-- ============================================================================
-- 2.1 生成分享链接
-- INSERT INTO share_links (short_code, plan_id, factory_type, created_by, expires_at, status)
-- VALUES ('TEST-SIM-001', '{plan_id}', 'textile', 'a0000001-0000-0000-0000-000000000001',
-- NOW() + INTERVAL '30 minutes', 'pending');
-- ============================================================================
-- 阶段三:纺织厂点击链接并确认导入
-- ============================================================================
-- 3.1 纺织厂点击链接(更新状态为 clicked
-- UPDATE share_links SET status = 'clicked', clicked_at = NOW(), click_count = 1
-- WHERE short_code = 'TEST-SIM-001';
-- 3.2 纺织厂确认导入 - 创建工厂关联
-- INSERT INTO plan_factories (plan_id, factory_id, factory_type)
-- VALUES ('{plan_id}', '11111111-1111-1111-1111-111111111102', 'textile');
-- 3.3 更新分享链接状态为 confirmed
-- UPDATE share_links SET status = 'confirmed', responded_at = NOW(),
-- response_result = 'confirmed', used_at = NOW()
-- WHERE short_code = 'TEST-SIM-001';
-- 3.4 建立合作关系
-- INSERT INTO company_relationships (purchaser_company_id, factory_company_id, factory_type, status)
-- VALUES ('11111111-1111-1111-1111-111111111101', '11111111-1111-1111-1111-111111111102', 'textile', 'active');
-- 3.5 更新计划状态为 producing
-- UPDATE production_plans SET status = 'producing' WHERE id = '{plan_id}';
-- ============================================================================
-- 阶段四:纺织厂确认生产流程节点
-- ============================================================================
-- 4.1 确认所有流程节点5个节点全部完成
-- UPDATE plan_process_steps SET status = 'completed', timestamp = NOW(),
-- operator_id = 'a0000002-0000-0000-0000-000000000002' -- 纺织厂用户ID
-- WHERE plan_id = '{plan_id}';
-- ============================================================================
-- 阶段五分批次坯布入库3批
-- ============================================================================
-- 5.1 第1批入库3000米30匹
-- INSERT INTO inventory_records (plan_id, warehouse_id, quantity, rolls, company_id, operator_id, price_per_meter)
-- VALUES ('{plan_id}', '22222222-2222-2222-2222-222222222202', 3000, 30,
-- '11111111-1111-1111-1111-111111111102', 'a0000002-0000-0000-0000-000000000002', 18.5);
-- 5.2 第2批入库4000米40匹
-- INSERT INTO inventory_records (plan_id, warehouse_id, quantity, rolls, company_id, operator_id, price_per_meter)
-- VALUES ('{plan_id}', '22222222-2222-2222-2222-222222222202', 4000, 40,
-- '11111111-1111-1111-1111-111111111102', 'a0000002-0000-0000-0000-000000000002', 18.5);
-- 5.3 第3批入库3000米28匹
-- INSERT INTO inventory_records (plan_id, warehouse_id, quantity, rolls, company_id, operator_id, price_per_meter)
-- VALUES ('{plan_id}', '22222222-2222-2222-2222-222222222202', 3000, 28,
-- '11111111-1111-1111-1111-111111111102', 'a0000002-0000-0000-0000-000000000002', 18.5);
-- 5.4 更新计划完成状态
-- UPDATE production_plans SET completed_quantity = 10000, status = 'completed'
-- WHERE id = '{plan_id}';
-- ============================================================================
-- 阶段六:数据完整性验证查询
-- ============================================================================
-- 6.1 验证计划基本信息
SELECT
p.plan_code,
p.status,
p.target_quantity,
p.completed_quantity,
p.product_name,
p.color,
p.fabric_code,
c.name as purchaser_name
FROM production_plans p
LEFT JOIN companies c ON c.id = p.purchaser_id
WHERE p.plan_code = 'TEST-2026-001';
-- 预期结果:
-- plan_code: TEST-2026-001
-- status: completed
-- target_quantity: 10000
-- completed_quantity: 10000
-- product_name: 全棉斜纹布
-- color: 藏青
-- fabric_code: QM-XW-280-01
-- 6.2 验证流程节点完成情况
SELECT
p.plan_code,
COUNT(*) as total_steps,
SUM(CASE WHEN ps.status = 'completed' THEN 1 ELSE 0 END) as completed_steps,
ARRAY_AGG(ps.step_type || ':' || ps.status) as step_details
FROM production_plans p
LEFT JOIN plan_process_steps ps ON ps.plan_id = p.id
WHERE p.plan_code = 'TEST-2026-001'
GROUP BY p.plan_code;
-- 预期结果:
-- total_steps: 5
-- completed_steps: 5
-- step_details: {confirm:completed, yarn_purchase:completed, dyeing:completed, machine_start:completed, fabric_warehouse:completed}
-- 6.3 验证入库记录汇总
SELECT
p.plan_code,
COUNT(ir.id) as inventory_batches,
COALESCE(SUM(ir.quantity), 0) as total_meters,
COALESCE(SUM(ir.rolls), 0) as total_rolls,
AVG(ir.price_per_meter) as avg_price
FROM production_plans p
LEFT JOIN inventory_records ir ON ir.plan_id = p.id
WHERE p.plan_code = 'TEST-2026-001'
GROUP BY p.plan_code;
-- 预期结果:
-- inventory_batches: 3
-- total_meters: 10000
-- total_rolls: 98
-- avg_price: 18.5
-- 6.4 验证数据一致性completed_quantity = SUM(inventory_records.quantity)
SELECT
p.plan_code,
p.completed_quantity,
COALESCE(SUM(ir.quantity), 0) as inventory_total,
CASE
WHEN p.completed_quantity = COALESCE(SUM(ir.quantity), 0) THEN '✓ 一致'
ELSE '✗ 不一致'
END as consistency_check
FROM production_plans p
LEFT JOIN inventory_records ir ON ir.plan_id = p.id
WHERE p.plan_code = 'TEST-2026-001'
GROUP BY p.plan_code, p.completed_quantity;
-- 预期结果consistency_check = '✓ 一致'
-- 6.5 验证分享链接状态
SELECT
sl.short_code,
sl.status,
sl.factory_type,
sl.click_count,
sl.used_at IS NOT NULL as is_used,
sl.expires_at > NOW() as is_valid,
c.name as creator_company
FROM share_links sl
LEFT JOIN profiles pr ON pr.id = sl.created_by
LEFT JOIN companies c ON c.id = pr.company_id
WHERE sl.short_code = 'TEST-SIM-001';
-- 预期结果:
-- status: confirmed
-- is_used: true
-- is_valid: false (已使用)
-- 6.6 验证合作关系建立
SELECT
cr.status,
cr.factory_type,
pc.name as purchaser_company,
fc.name as factory_company,
cr.created_at
FROM company_relationships cr
LEFT JOIN companies pc ON pc.id = cr.purchaser_company_id
LEFT JOIN companies fc ON fc.id = cr.factory_company_id
WHERE cr.purchaser_company_id = '11111111-1111-1111-1111-111111111101'
AND cr.factory_company_id = '11111111-1111-1111-1111-111111111102';
-- 预期结果:
-- status: active
-- factory_type: textile
-- 6.7 验证工厂关联
SELECT
pf.factory_type,
c.name as factory_name,
pf.created_at
FROM plan_factories pf
LEFT JOIN companies c ON c.id = pf.factory_id
LEFT JOIN production_plans p ON p.id = pf.plan_id
WHERE p.plan_code = 'TEST-2026-001';
-- 预期结果:
-- factory_type: textile
-- factory_name: 示例纺织厂
-- 6.8 综合验证报告
SELECT
'=== 全流程模拟测试验证报告 ===' as section,
'' as detail
UNION ALL
SELECT
'计划编号: ' || p.plan_code,
'状态: ' || p.status
FROM production_plans p WHERE p.plan_code = 'TEST-2026-001'
UNION ALL
SELECT
'目标产量: ' || p.target_quantity || '',
'完成产量: ' || p.completed_quantity || ''
FROM production_plans p WHERE p.plan_code = 'TEST-2026-001'
UNION ALL
SELECT
'入库批次: ' || COUNT(ir.id),
'总入库量: ' || COALESCE(SUM(ir.quantity), 0) || ''
FROM production_plans p
LEFT JOIN inventory_records ir ON ir.plan_id = p.id
WHERE p.plan_code = 'TEST-2026-001'
UNION ALL
SELECT
'流程节点: ' || COUNT(ps.id),
'已完成: ' || SUM(CASE WHEN ps.status = 'completed' THEN 1 ELSE 0 END)
FROM production_plans p
LEFT JOIN plan_process_steps ps ON ps.plan_id = p.id
WHERE p.plan_code = 'TEST-2026-001'
UNION ALL
SELECT
'数据一致性: ' ||
CASE
WHEN p.completed_quantity = COALESCE((SELECT SUM(quantity) FROM inventory_records WHERE plan_id = p.id), 0)
THEN '✓ 通过'
ELSE '✗ 失败'
END,
''
FROM production_plans p WHERE p.plan_code = 'TEST-2026-001';
-- ============================================================================
-- 阶段七:清理测试数据(可选)
-- ============================================================================
-- 7.1 清理测试计划及相关数据
-- DELETE FROM inventory_records WHERE plan_id IN (SELECT id FROM production_plans WHERE plan_code = 'TEST-2026-001');
-- DELETE FROM plan_process_steps WHERE plan_id IN (SELECT id FROM production_plans WHERE plan_code = 'TEST-2026-001');
-- DELETE FROM yarn_ratios WHERE plan_id IN (SELECT id FROM production_plans WHERE plan_code = 'TEST-2026-001');
-- DELETE FROM plan_factories WHERE plan_id IN (SELECT id FROM production_plans WHERE plan_code = 'TEST-2026-001');
-- DELETE FROM share_links WHERE short_code = 'TEST-SIM-001';
-- DELETE FROM production_plans WHERE plan_code = 'TEST-2026-001';
-- DELETE FROM products WHERE fabric_code = 'QM-XW-280-01' AND company_id = '11111111-1111-1111-1111-111111111101';
-- DELETE FROM company_relationships WHERE purchaser_company_id = '11111111-1111-1111-1111-111111111101' AND factory_company_id = '11111111-1111-1111-1111-111111111102';
-- ============================================================================
-- 结束
-- ============================================================================