feat: 初始化项目结构并添加核心功能模块
- 新增文档模板和导航结构 - 实现服务器基础API路由和控制器 - 添加扩展插件配置和前端框架 - 引入多租户和权限管理模块 - 集成日志和数据库配置 - 添加核心业务模型和类型定义
This commit is contained in:
257
server/src/api/routes/trade.ts
Normal file
257
server/src/api/routes/trade.ts
Normal file
@@ -0,0 +1,257 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user