import { Router } from 'express'; import { requirePermission } from '../../core/guards/rbac.guard'; import { requireTraceContext } from '../../core/guards/trace-context.guard'; import { AutonomousSettlementService } from '../../core/pipeline/AutonomousSettlementService'; import { SourcingRoutingService } from '../../domains/Trade/SourcingRoutingService'; import { TradeService } from '../../domains/Trade/TradeService'; import { AutonomousEcoService } from '../../services/AutonomousEcoService'; import { AutonomousSourcingService } from '../../services/AutonomousSourcingService'; import { DecentralizedArbitrationService } from '../../services/DecentralizedArbitrationService'; import { EcoValueSharingService } from '../../services/EcoValueSharingService'; import { FulfillmentConsensusService } from '../../services/FulfillmentConsensusService'; import { InventoryService } from '../../services/InventoryService'; import { SovereigntyReputationService } from '../../services/SovereigntyReputationService'; import { WarehouseService } from '../../services/WarehouseService'; const router = Router(); /** * [BIZ_SOV_05] 发布匿名声誉评价 */ router.post('/reputation/publish', requireTraceContext, requirePermission('trade:write'), async (req, res) => { try { const { tenantId, traceId } = (req as any).traceContext; const { targetEntityId, rating, feedback, orderVolume } = req.body; await SovereigntyReputationService.publishAnonymousRating( tenantId, targetEntityId, rating, feedback, traceId, orderVolume ); res.json({ success: true, message: 'Reputation published anonymously' }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [BIZ_SOV_05] 获取实体声誉报告 */ router.get('/reputation/:entityId/report', requireTraceContext, requirePermission('trade:read'), async (req, res) => { try { const { entityId } = req.params; const report = await SovereigntyReputationService.getReputationReport(entityId); if (!report) { return res.status(404).json({ success: false, error: 'No reputation data found for this entity' }); } res.json({ success: true, data: report }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [BIZ_SOV_02] 去中心化贸易纠纷仲裁 */ router.post('/arbitration/start', requireTraceContext, requirePermission('trade:admin'), async (req, res) => { try { const { tenantId, traceId } = (req as any).traceContext; const { disputeId } = req.body; await DecentralizedArbitrationService.startArbitration(tenantId, disputeId, traceId); res.json({ success: true, message: 'Decentralized arbitration process started' }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); router.get('/arbitration/history', requireTraceContext, requirePermission('trade:read'), async (req, res) => { try { const { tenantId } = (req as any).traceContext; const history = await DecentralizedArbitrationService.getArbitrationHistory(tenantId); res.json({ success: true, data: history }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [BIZ_TRADE_20] 物流履约去中心化共识 */ router.post('/fulfillment/consensus/event', requireTraceContext, requirePermission('trade:write'), async (req, res) => { try { const { traceId } = (req as any).traceContext; const { orderId, nodeId, eventType, signature } = req.body; await FulfillmentConsensusService.registerNodeEvent(orderId, nodeId, eventType, signature, traceId); res.json({ success: true, message: 'Node verification event registered' }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); router.get('/fulfillment/:orderId/consensus', requireTraceContext, requirePermission('trade:read'), async (req, res) => { try { const { orderId } = req.params; const chain = await FulfillmentConsensusService.getConsensusChain(orderId); res.json({ success: true, data: chain }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [BIZ_SUP_15] 多源供应比价与路由优化 (Sourcing Optimization) */ router.post('/sourcing/optimize', requireTraceContext, requirePermission('trade:read'), async (req, res) => { try { const { tenantId } = (req as any).traceContext; const { productTitle, imageUrl, targetQuantity, maxDays, priority } = req.body; const result = await SourcingRoutingService.optimizeSourcing({ productTitle, imageUrl, targetQuantity, maxDays, priority, tenantId }); res.json({ success: true, data: result }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [BIZ_ECO_03] 自治寻源与自动签约 */ router.post('/sourcing/autonomous/start', requireTraceContext, requirePermission('trade:write'), async (req, res) => { try { const { tenantId, traceId } = (req as any).traceContext; const { category } = req.body; await AutonomousSourcingService.startSourcing(tenantId, category, traceId); res.json({ success: true, message: 'Autonomous sourcing and contracting triggered' }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); router.get('/sourcing/contracts', requireTraceContext, requirePermission('trade:read'), async (req, res) => { try { const { tenantId } = (req as any).traceContext; const contracts = await AutonomousEcoService.getContracts(tenantId); res.json({ success: true, data: contracts }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [BIZ_ECO_02] 供应商价值共享博弈 */ router.post('/eco/share/calculate', requireTraceContext, requirePermission('trade:admin'), async (req, res) => { try { const { tenantId, traceId } = (req as any).traceContext; const { supplierId, totalProfit } = req.body; const amount = await EcoValueSharingService.calculateAndShare(tenantId, supplierId, totalProfit, traceId); res.json({ success: true, data: { sharedAmount: amount } }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); router.get('/eco/share/history', requireTraceContext, requirePermission('trade:read'), async (req, res) => { try { const { tenantId } = (req as any).traceContext; const history = await EcoValueSharingService.getSharingHistory(tenantId); res.json({ success: true, data: report }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [BIZ_SOV_10] 触发自治结算 */ router.post('/settlement/trigger', requireTraceContext, requirePermission('finance:write'), async (req, res) => { try { const { tenantId } = (req as any).traceContext; const { targetTenantId, amount, currency, fulfillmentHash } = req.body; const settlementId = await AutonomousSettlementService.triggerSettlement({ sourceTenantId: tenantId, targetTenantId, amount, currency, fulfillmentHash }); res.json({ success: true, data: { settlementId } }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [CORE_TRADE_01] 获取仓库列表 */ router.get('/warehouses', requireTraceContext, async (req, res) => { try { const { tenantId } = (req as any).traceContext; const warehouses = await WarehouseService.listWarehouses(tenantId); res.json({ success: true, data: warehouses }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [CORE_TRADE_01] 创建仓库 */ router.post('/warehouses', requireTraceContext, async (req, res) => { try { const { tenantId } = (req as any).traceContext; const { id, name, type, countryCode, address } = req.body; const warehouseId = await WarehouseService.createWarehouse({ id, tenantId, name, type, countryCode, address }); res.json({ success: true, data: { warehouseId } }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [BIZ_TRADE_02] 创建调拨单 */ router.post('/transfers', requireTraceContext, async (req, res) => { try { const { tenantId, traceId } = (req as any).traceContext; const { productId, skuId, fromWarehouseId, toWarehouseId, quantity } = req.body; const transferId = await TradeService.createTransferOrder({ tenantId, productId, skuId, fromWarehouseId, toWarehouseId, quantity, traceId }); res.json({ success: true, data: { transferId } }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); /** * [FE_INV_01] 全球库存分布热力图 API */ router.get('/inventory/hotmap', requireTraceContext, requirePermission('inventory:read'), async (req, res) => { try { const { tenantId } = (req as any).traceContext; const data = await InventoryService.getInventoryHotmap(tenantId); res.json({ success: true, data }); } catch (err: any) { res.status(500).json({ success: false, error: err.message }); } }); export default router;