92 lines
3.6 KiB
TypeScript
92 lines
3.6 KiB
TypeScript
|
|
import { ConsumerOrderService } from './domains/Trade/ConsumerOrderService';
|
||
|
|
import db from './config/database';
|
||
|
|
import { DomainBootstrap } from './core/runtime/DomainBootstrap';
|
||
|
|
import { DomainRegistry } from './core/runtime/DomainRegistry';
|
||
|
|
|
||
|
|
async function testOrchestrator() {
|
||
|
|
console.log('🚀 Testing Order Orchestrator & Auto-Heal (BIZ_ORD_05)...');
|
||
|
|
|
||
|
|
try {
|
||
|
|
await DomainBootstrap.init();
|
||
|
|
await DomainRegistry.bootstrap();
|
||
|
|
await ConsumerOrderService.initTable();
|
||
|
|
|
||
|
|
const tenantId = 'test-tenant';
|
||
|
|
const shopId = 'test-shop';
|
||
|
|
|
||
|
|
// 1. 创建测试订单 (包含 PO Box 异常)
|
||
|
|
console.log('--- Test 1: Logistics Forbidden Zone ---');
|
||
|
|
const orderId1 = await ConsumerOrderService.syncPlatformOrder({
|
||
|
|
tenant_id: tenantId,
|
||
|
|
shop_id: shopId,
|
||
|
|
platform: 'AMAZON',
|
||
|
|
site: 'US',
|
||
|
|
platform_order_id: 'AMZ-1001',
|
||
|
|
customer_name: 'John Doe',
|
||
|
|
shipping_address: { city: 'NY', address: 'PO Box 1234' },
|
||
|
|
items: [{ sku: 'SKU-001', quantity: 1, price: 50 }],
|
||
|
|
total_amount: 50,
|
||
|
|
status: 'PAID'
|
||
|
|
});
|
||
|
|
|
||
|
|
const order1 = await db('cf_consumer_orders').where({ id: orderId1 }).first();
|
||
|
|
console.log(`Order 1 Status: ${order1.status}, Reason: ${order1.exception_reason}`);
|
||
|
|
if (order1.status === 'EXCEPTION' && order1.exception_reason.includes('Forbidden zone')) {
|
||
|
|
console.log('✅ Forbidden zone detection verified');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 2. 创建高价值订单
|
||
|
|
console.log('\n--- Test 2: High Value Audit ---');
|
||
|
|
const orderId2 = await ConsumerOrderService.syncPlatformOrder({
|
||
|
|
tenant_id: tenantId,
|
||
|
|
shop_id: shopId,
|
||
|
|
platform: 'SHOPIFY',
|
||
|
|
site: 'US',
|
||
|
|
platform_order_id: 'SHP-2002',
|
||
|
|
customer_name: 'Rich Client',
|
||
|
|
shipping_address: { city: 'LA', address: '123 Luxury St' },
|
||
|
|
items: [{ sku: 'GOLD-SKU', quantity: 1, price: 6000 }],
|
||
|
|
total_amount: 6000,
|
||
|
|
status: 'PAID'
|
||
|
|
});
|
||
|
|
|
||
|
|
const order2 = await db('cf_consumer_orders').where({ id: orderId2 }).first();
|
||
|
|
console.log(`Order 2 Status: ${order2.status}, Reason: ${order2.exception_reason}`);
|
||
|
|
if (order2.status === 'EXCEPTION' && order2.exception_reason.includes('High value')) {
|
||
|
|
console.log('✅ High value audit verified');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 3. 模拟异常自愈 (手动触发)
|
||
|
|
console.log('\n--- Test 3: Auto-Heal (Stock Out) ---');
|
||
|
|
// 先手动设置一个订单为 EXCEPTION (Stock Out)
|
||
|
|
const orderId3 = await ConsumerOrderService.syncPlatformOrder({
|
||
|
|
tenant_id: tenantId,
|
||
|
|
shop_id: shopId,
|
||
|
|
platform: 'ALIEXPRESS',
|
||
|
|
site: 'US',
|
||
|
|
platform_order_id: 'ALI-3003',
|
||
|
|
items: [{ sku: 'OUT-OF-STOCK', quantity: 1, price: 20, mainImage: 'https://example.com/item.jpg' }],
|
||
|
|
total_amount: 20,
|
||
|
|
status: 'PAID'
|
||
|
|
});
|
||
|
|
|
||
|
|
// 强制触发自愈逻辑 (假设 runHealthCheck 已经识别了异常,这里我们手动调用 attemptAutoHeal 来验证寻源)
|
||
|
|
// 注意:在真实代码中,这是由 runHealthCheck 触发的
|
||
|
|
await ConsumerOrderService.transitionStatus(tenantId, orderId3, 'EXCEPTION', 'Stock out');
|
||
|
|
await (ConsumerOrderService as any).attemptAutoHeal(tenantId, orderId3, 'STOCK_OUT');
|
||
|
|
|
||
|
|
const order3 = await db('cf_consumer_orders').where({ id: orderId3 }).first();
|
||
|
|
console.log(`Order 3 Status: ${order3.status}, Auto-Heal: ${order3.auto_heal_status}, Reason: ${order3.exception_reason}`);
|
||
|
|
if (order3.auto_heal_status === 'HEALED' && order3.status === 'PROCESSING') {
|
||
|
|
console.log('✅ Auto-heal via rerouting verified');
|
||
|
|
}
|
||
|
|
|
||
|
|
} catch (error) {
|
||
|
|
console.error('❌ Test failed:', error);
|
||
|
|
} finally {
|
||
|
|
await db.destroy();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
testOrchestrator();
|