Files
makemd/server/src/services/InventoryDistributionService.ts

60 lines
2.1 KiB
TypeScript
Raw Normal View History

import db from '../config/database';
import { logger } from '../utils/logger';
import { WarehouseService } from './WarehouseService';
export interface StockDistributionAdvice {
tenantId: string;
productId: string;
fromWarehouseId: string;
toWarehouseId: string;
suggestedQuantity: number;
reason: string;
}
/**
* [BIZ_TRADE_09]
* @description
*/
export class InventoryDistributionService {
/**
* (BIZ_TRADE_09)
*/
static async generateDistributionAdvice(tenantId: string): Promise<StockDistributionAdvice[]> {
logger.info(`[InventoryDist] Analyzing demand for Tenant: ${tenantId}`);
const advices: StockDistributionAdvice[] = [];
// 1. 获取所有热销商品及区域需求分布
// 模拟基于订单历史的需求热力分析
const products = await db('cf_product').where({ tenant_id: tenantId }).limit(10);
for (const product of products) {
const advice = await this.analyzeProductDistribution(tenantId, product.id);
if (advice) advices.push(advice);
}
return advices;
}
private static async analyzeProductDistribution(tenantId: string, productId: string): Promise<StockDistributionAdvice | null> {
// 模拟分析:如果该商品在欧洲销量占比 > 40%,但库存全在国内仓,则建议移仓
const inventory = await db('cf_inventory').where({ tenant_id: tenantId, product_id: productId });
const localStock = inventory.find(i => i.warehouse_id === 'DEFAULT' || i.warehouse_id === 'LOCAL_01');
const overseasStock = inventory.find(i => i.warehouse_id === 'OVERSEAS_EU_01');
if (localStock && localStock.available_stock > 100 && (!overseasStock || overseasStock.available_stock < 20)) {
return {
tenantId,
productId,
fromWarehouseId: localStock.warehouse_id,
toWarehouseId: 'OVERSEAS_EU_01',
suggestedQuantity: 50,
reason: 'High demand detected in EU region. Forward positioning suggested to reduce delivery time.'
};
}
return null;
}
}