66 lines
2.2 KiB
TypeScript
66 lines
2.2 KiB
TypeScript
|
|
import { logger } from '../../utils/logger';
|
|||
|
|
import { SupplyChainService } from '../../services/SupplyChainService';
|
|||
|
|
import { InventoryForecastService } from '../../services/InventoryForecastService';
|
|||
|
|
import { DynamicPricingService } from '../../services/DynamicPricingService';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* [V31.3] Shadow Auditing Service
|
|||
|
|
* @description AI-2 (Internal) 负责对 AI-1 和 AI-3 的核心功能进行影子测试(最小冒烟测试),确保逻辑闭环。
|
|||
|
|
*/
|
|||
|
|
export class ShadowAuditService {
|
|||
|
|
/**
|
|||
|
|
* 执行全量影子测试
|
|||
|
|
*/
|
|||
|
|
static async runAllAudits(tenantId: string) {
|
|||
|
|
logger.info(`[ShadowAudit] Starting full audit for tenant: ${tenantId}`);
|
|||
|
|
|
|||
|
|
const results = {
|
|||
|
|
routing: await this.auditRouting(tenantId),
|
|||
|
|
forecast: await this.auditForecast(tenantId),
|
|||
|
|
pricing: await this.auditPricing(tenantId)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
logger.info(`[ShadowAudit] Audit complete: ${JSON.stringify(results)}`);
|
|||
|
|
return results;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* [AI-1] 供应路由测试 (BIZ_SUP_15)
|
|||
|
|
*/
|
|||
|
|
private static async auditRouting(tenantId: string) {
|
|||
|
|
try {
|
|||
|
|
// 验证寻源建议是否能正常生成且记录因果链
|
|||
|
|
const result = await SupplyChainService.traceSourceFactory(tenantId, 'TEST-PROD-001', 'https://example.com/image.jpg');
|
|||
|
|
return { status: 'PASSED', suggestionId: result.suggestionId };
|
|||
|
|
} catch (err: any) {
|
|||
|
|
return { status: 'FAILED', error: err.message };
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* [AI-3] 销量预测测试 (BIZ_INV_10)
|
|||
|
|
*/
|
|||
|
|
private static async auditForecast(tenantId: string) {
|
|||
|
|
try {
|
|||
|
|
// 验证补货建议是否能正常生成
|
|||
|
|
const result = await InventoryForecastService.predictReplenishment(tenantId, 'TEST-PROD-001');
|
|||
|
|
return { status: 'PASSED', replenishmentQty: result.suggestedQty };
|
|||
|
|
} catch (err: any) {
|
|||
|
|
return { status: 'FAILED', error: err.message };
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* [AI-1] 动态调价测试 (BIZ_MKT_30)
|
|||
|
|
*/
|
|||
|
|
private static async auditPricing(tenantId: string) {
|
|||
|
|
try {
|
|||
|
|
// 验证调价审计是否记录
|
|||
|
|
const result = await DynamicPricingService.auditPrices(tenantId);
|
|||
|
|
return { status: 'PASSED', count: result.length };
|
|||
|
|
} catch (err: any) {
|
|||
|
|
return { status: 'FAILED', error: err.message };
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|