Files
makemd/dashboard/src/services/logisticsDataSource.ts
wurenzhi 2748456d8a refactor(services): 重构服务文件结构,将服务按功能分类到不同目录
- 将服务文件按功能分类到core、ai、analytics、security等目录
- 修复logger导入路径问题,统一使用相对路径
- 更新相关文件的导入路径引用
- 添加新的批量操作组件导出文件
- 修复dashboard页面中的类型错误
- 添加dotenv依赖到package.json
2026-03-25 13:46:26 +08:00

248 lines
8.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { http } from './http';
/**
* [MOCK] 物流管理数据<E695B0>? * AI注意: 这是Mock实现不是真实业务逻辑
* 仅在USE_MOCK=true时启<E697B6>? */
export interface LogisticsProvider {
id: string;
name: string;
code: string;
status: 'ACTIVE' | 'INACTIVE';
apiEndpoint?: string;
createdAt: string;
updatedAt: string;
}
export interface Shipment {
id: string;
orderId: string;
trackingNumber: string;
provider: string;
status: 'PENDING' | 'PICKED_UP' | 'IN_TRANSIT' | 'OUT_FOR_DELIVERY' | 'DELIVERED' | 'FAILED';
origin: string;
destination: string;
estimatedDelivery: string;
actualDelivery?: string;
createdAt: string;
updatedAt: string;
}
export interface TrackingEvent {
id: string;
shipmentId: string;
status: string;
location: string;
description: string;
timestamp: string;
}
export interface FreightQuote {
id: string;
channel: string;
carrier: string;
name: string;
basePrice: number;
pricePerKg: number;
pricePerVol: number;
estimatedDays: number;
totalPrice: number;
fuelSurcharge: number;
remoteAreaSurcharge: number;
customsDuty: number;
insurance: number;
totalWithDuty: number;
}
export interface ILogisticsDataSource {
fetchProviders(): Promise<LogisticsProvider[]>;
createProvider(data: Partial<LogisticsProvider>): Promise<LogisticsProvider>;
updateProvider(id: string, data: Partial<LogisticsProvider>): Promise<LogisticsProvider>;
deleteProvider(id: string): Promise<void>;
fetchShipments(params?: { status?: string; provider?: string }): Promise<Shipment[]>;
createShipment(data: Partial<Shipment>): Promise<Shipment>;
updateShipment(id: string, data: Partial<Shipment>): Promise<Shipment>;
fetchTrackingEvents(shipmentId: string): Promise<TrackingEvent[]>;
calculateFreight(params: { origin: string; destination: string; weight: number; dimensions: { length: number; width: number; height: number } }): Promise<{ provider: string; cost: number; estimatedDays: number }[]>;
}
class MockLogisticsDataSource implements ILogisticsDataSource {
private providers: LogisticsProvider[] = [
{ id: '1', name: 'FedEx', code: 'FEDEX', status: 'ACTIVE', createdAt: '2026-03-01', updatedAt: '2026-03-01' },
{ id: '2', name: 'UPS', code: 'UPS', status: 'ACTIVE', createdAt: '2026-03-01', updatedAt: '2026-03-01' },
{ id: '3', name: 'DHL', code: 'DHL', status: 'ACTIVE', createdAt: '2026-03-01', updatedAt: '2026-03-01' },
];
private shipments: Shipment[] = [
{
id: '1',
orderId: 'ORD-2026-001',
trackingNumber: 'FX123456789',
provider: 'FEDEX',
status: 'IN_TRANSIT',
origin: 'Los Angeles, CA',
destination: 'New York, NY',
estimatedDelivery: '2026-03-20',
createdAt: '2026-03-15',
updatedAt: '2026-03-16',
},
];
private trackingEvents: TrackingEvent[] = [
{ id: '1', shipmentId: '1', status: 'PICKED_UP', location: 'Los Angeles, CA', description: 'Package picked up', timestamp: '2026-03-15T10:00:00Z' },
{ id: '2', shipmentId: '1', status: 'IN_TRANSIT', location: 'Phoenix, AZ', description: 'In transit', timestamp: '2026-03-16T08:00:00Z' },
];
async fetchProviders(): Promise<LogisticsProvider[]> {
await new Promise(resolve => setTimeout(resolve, 300));
return [...this.providers];
}
async createProvider(data: Partial<LogisticsProvider>): Promise<LogisticsProvider> {
await new Promise(resolve => setTimeout(resolve, 300));
const newProvider: LogisticsProvider = {
id: `${Date.now()}`,
name: data.name || '',
code: data.code || '',
status: 'ACTIVE',
createdAt: new Date().toISOString().split('T')[0],
updatedAt: new Date().toISOString().split('T')[0],
...data,
};
this.providers.push(newProvider);
return newProvider;
}
async updateProvider(id: string, data: Partial<LogisticsProvider>): Promise<LogisticsProvider> {
await new Promise(resolve => setTimeout(resolve, 300));
const index = this.providers.findIndex(p => p.id === id);
if (index === -1) throw new Error('Provider not found');
this.providers[index] = { ...this.providers[index], ...data, updatedAt: new Date().toISOString().split('T')[0] };
return this.providers[index];
}
async deleteProvider(id: string): Promise<void> {
await new Promise(resolve => setTimeout(resolve, 300));
const index = this.providers.findIndex(p => p.id === id);
if (index !== -1) {
this.providers.splice(index, 1);
}
}
async fetchShipments(params?: { status?: string; provider?: string }): Promise<Shipment[]> {
await new Promise(resolve => setTimeout(resolve, 300));
let result = [...this.shipments];
if (params?.status) {
result = result.filter(s => s.status === params.status);
}
if (params?.provider) {
result = result.filter(s => s.provider === params.provider);
}
return result;
}
async createShipment(data: Partial<Shipment>): Promise<Shipment> {
await new Promise(resolve => setTimeout(resolve, 300));
const newShipment: Shipment = {
id: `${Date.now()}`,
orderId: data.orderId || '',
trackingNumber: `FX${Date.now()}`,
provider: data.provider || 'FEDEX',
status: 'PENDING',
origin: data.origin || '',
destination: data.destination || '',
estimatedDelivery: data.estimatedDelivery || '',
createdAt: new Date().toISOString().split('T')[0],
updatedAt: new Date().toISOString().split('T')[0],
...data,
};
this.shipments.push(newShipment);
return newShipment;
}
async updateShipment(id: string, data: Partial<Shipment>): Promise<Shipment> {
await new Promise(resolve => setTimeout(resolve, 300));
const index = this.shipments.findIndex(s => s.id === id);
if (index === -1) throw new Error('Shipment not found');
this.shipments[index] = { ...this.shipments[index], ...data, updatedAt: new Date().toISOString().split('T')[0] };
return this.shipments[index];
}
async fetchTrackingEvents(shipmentId: string): Promise<TrackingEvent[]> {
await new Promise(resolve => setTimeout(resolve, 300));
return this.trackingEvents.filter(e => e.shipmentId === shipmentId);
}
async calculateFreight(params: { origin: string; destination: string; weight: number; dimensions: { length: number; width: number; height: number } }): Promise<{ provider: string; cost: number; estimatedDays: number }[]> {
await new Promise(resolve => setTimeout(resolve, 500));
return [
{ provider: 'FEDEX', cost: 15.99, estimatedDays: 3 },
{ provider: 'UPS', cost: 18.50, estimatedDays: 2 },
{ provider: 'DHL', cost: 22.00, estimatedDays: 1 },
];
}
}
class ApiLogisticsDataSource implements ILogisticsDataSource {
private baseUrl = '/api/logistics';
async fetchProviders(): Promise<LogisticsProvider[]> {
const response = await http.post(`${this.baseUrl}/providers`);
return response.data;
}
async createProvider(data: Partial<LogisticsProvider>): Promise<LogisticsProvider> {
const response = await http.post(`${this.baseUrl}/providers`, data);
return response.data;
}
async updateProvider(id: string, data: Partial<LogisticsProvider>): Promise<LogisticsProvider> {
const response = await http.put(`${this.baseUrl}/providers/${id}`, data);
return response.data;
}
async deleteProvider(id: string): Promise<void> {
const response = await http.post(`${this.baseUrl}/providers/${id}`);
}
async fetchShipments(params?: { status?: string; provider?: string }): Promise<Shipment[]> {
const response = await http.get(`${this.baseUrl}/shipments?${new URLSearchParams(params as any)}`);
return response.data;
}
async createShipment(data: Partial<Shipment>): Promise<Shipment> {
const response = await http.post(`${this.baseUrl}/shipments`, data);
return response.data;
}
async updateShipment(id: string, data: Partial<Shipment>): Promise<Shipment> {
const response = await http.put(`${this.baseUrl}/shipments/${id}`, data);
return response.data;
}
async fetchTrackingEvents(shipmentId: string): Promise<TrackingEvent[]> {
const response = await http.post(`${this.baseUrl}/shipments/${shipmentId}/tracking`);
return response.data;
}
async calculateFreight(params: { origin: string; destination: string; weight: number; dimensions: { length: number; width: number; height: number } }): Promise<{ provider: string; cost: number; estimatedDays: number }[]> {
const response = await http.post(`${this.baseUrl}/freight/calculate`, params);
return response.data;
}
}
const useMock = process.env.NODE_ENV === 'development' || process.env.REACT_APP_USE_MOCK === 'true';
export const logisticsDataSource: ILogisticsDataSource = useMock
? new MockLogisticsDataSource()
: new ApiLogisticsDataSource();