ts-guoguo-mcp-server
Version:
裹裹寄件服务MCP Server - TypeScript版本,基于Model Context Protocol的寄件服务集成工具
333 lines • 14.4 kB
JavaScript
import { OrderStatus, ServiceType, } from "../types/index.js";
import { HTTPClient } from "../utils/http-client.js";
import { logger } from "../utils/logger.js";
/**
* 订单服务
*/
export class OrderService {
config;
constructor(config) {
this.config = config;
}
/**
* 创建寄件订单
*/
async createShippingOrder(request) {
try {
if (this.config.useMock) {
return this.createMockOrder(request);
}
const httpClient = new HTTPClient(this.config);
const orderData = {
sender: {
name: request.sender_name,
phone: request.sender_phone,
address: request.sender_address,
},
receiver: {
name: request.receiver_name,
phone: request.receiver_phone,
address: request.receiver_address,
},
package: {
type: request.package_type,
weight: request.package_weight,
size: request.package_size,
},
service_type: request.service_type,
};
const response = await httpClient.post("/mcp/api/v1/orders", orderData);
if (response.success) {
const data = response.data || {};
return {
status: "success",
data: {
order_id: data.orderId || data.order_id,
estimated_cost: data.estimatedCost || data.estimated_cost,
estimated_delivery: data.estimatedDelivery || data.estimated_delivery,
pickup_time: data.pickupTime || data.pickup_time || "24小时内安排取件",
tracking_number: data.trackingNumber || data.tracking_number || data.orderId || data.order_id,
},
};
}
else {
return {
status: "error",
error_code: response.errorCode || response.code || "API_ERROR",
message: response.errorMsg || response.message || "API调用失败",
};
}
}
catch (error) {
logger.error(`创建订单失败: ${error}`);
return {
status: "error",
error_code: "CREATE_ORDER_ERROR",
message: `创建订单失败: ${error instanceof Error ? error.message : String(error)}`,
};
}
}
/**
* 查询订单列表
*/
async listShippingOrders(request) {
try {
if (this.config.useMock) {
return this.getMockOrderList(request);
}
const httpClient = new HTTPClient(this.config);
const params = {
page_size: request.page_size,
page_number: request.page_number,
};
if (request.start_date)
params.start_date = request.start_date;
if (request.end_date)
params.end_date = request.end_date;
if (request.status)
params.status = request.status;
const response = await httpClient.get("/mcp/api/v1/orders", params);
if (response.success) {
const data = response.data || {};
return {
status: "success",
data: {
orders: data.orders || [],
pagination: {
total_count: data.totalCount || 0,
total_pages: data.totalPages || 0,
current_page: data.currentPage || request.page_number,
page_size: data.pageSize || request.page_size,
has_next: data.hasNext || false,
has_prev: data.hasPrev || false,
},
},
};
}
else {
return {
status: "error",
error_code: response.errorCode || response.code || "API_ERROR",
message: response.errorMsg || response.message || "API调用失败",
};
}
}
catch (error) {
logger.error(`查询订单列表失败: ${error}`);
return {
status: "error",
error_code: "LIST_ORDERS_ERROR",
message: `查询订单列表失败: ${error instanceof Error ? error.message : String(error)}`,
};
}
}
/**
* 获取订单详情
*/
async getOrderDetail(orderId, detailLevel = "basic") {
try {
if (this.config.useMock) {
return this.getMockOrderDetail(orderId, detailLevel);
}
const httpClient = new HTTPClient(this.config);
const params = { detail_level: detailLevel };
const response = await httpClient.get(`/mcp/api/v1/orders/${orderId}`, params);
if (response.success) {
const data = response.data || {};
const result = {
order_info: data.orderInfo || data.order_info,
sender_info: data.senderInfo || data.sender_info,
receiver_info: data.receiverInfo || data.receiver_info,
package_info: data.packageInfo || data.package_info,
};
if (detailLevel === "full" && (data.trackingHistory || data.tracking_history)) {
result.tracking_history = data.trackingHistory || data.tracking_history;
}
return {
status: "success",
data: result,
};
}
else {
return {
status: "error",
error_code: response.errorCode || response.code || "API_ERROR",
message: response.errorMsg || response.message || "API调用失败",
};
}
}
catch (error) {
logger.error(`查询订单详情失败: ${error}`);
return {
status: "error",
error_code: "GET_ORDER_ERROR",
message: `查询订单详情失败: ${error instanceof Error ? error.message : String(error)}`,
};
}
}
/**
* 创建模拟订单
*/
createMockOrder(request) {
logger.info("使用模拟数据创建订单");
// 模拟费用计算
const baseCost = 10.0;
const weightCost = request.package_weight * 5.0;
const serviceMultiplier = { 标准: 1.0, 快速: 1.5, 经济: 0.8 }[request.service_type] || 1.0;
const estimatedCost = Math.round((baseCost + weightCost) * serviceMultiplier * 100) / 100;
// 模拟配送时间计算
const deliveryHours = { 标准: 48, 快速: 24, 经济: 72 }[request.service_type] || 48;
const estimatedDelivery = new Date(Date.now() + deliveryHours * 60 * 60 * 1000).toISOString().split('T')[0] + ' ' + new Date(Date.now() + deliveryHours * 60 * 60 * 1000).toTimeString().split(' ')[0];
// 生成订单号
const orderId = `SF${new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14)}`;
return {
status: "success",
data: {
order_id: orderId,
estimated_cost: estimatedCost,
estimated_delivery: estimatedDelivery,
pickup_time: "24小时内安排取件",
tracking_number: orderId,
},
};
}
/**
* 获取模拟订单列表
*/
getMockOrderList(request) {
logger.info("使用模拟数据查询订单列表");
const mockOrders = [
{
order_id: "SF2024001",
sender: { name: "张三", phone: "13800138001", address: "北京市朝阳区中关村大街1号" },
receiver: { name: "李四", phone: "13800138002", address: "上海市浦东新区陆家嘴环路1000号" },
package: { type: "文件", weight: 0.5, size: "30x20x5" },
service_type: ServiceType.EXPRESS,
status: OrderStatus.DELIVERED,
create_time: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),
estimated_delivery: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(),
actual_delivery: new Date(Date.now() - 6 * 60 * 60 * 1000).toISOString(),
cost: 25.0,
},
{
order_id: "SF2024002",
sender: { name: "王五", phone: "13800138003", address: "广州市天河区珠江新城花城大道85号" },
receiver: { name: "赵六", phone: "13800138004", address: "深圳市南山区深南大道10000号" },
package: { type: "电子产品", weight: 1.2, size: "25x15x10" },
service_type: ServiceType.STANDARD,
status: OrderStatus.IN_TRANSIT,
create_time: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(),
estimated_delivery: new Date(Date.now() + 12 * 60 * 60 * 1000).toISOString(),
cost: 15.0,
},
];
// 应用过滤条件
let filteredOrders = mockOrders;
if (request.status) {
filteredOrders = filteredOrders.filter((order) => order.status === request.status);
}
if (request.start_date) {
const startDate = new Date(request.start_date);
filteredOrders = filteredOrders.filter((order) => new Date(order.create_time) >= startDate);
}
if (request.end_date) {
const endDate = new Date(request.end_date);
endDate.setDate(endDate.getDate() + 1);
filteredOrders = filteredOrders.filter((order) => new Date(order.create_time) < endDate);
}
// 分页处理
const totalCount = filteredOrders.length;
const totalPages = Math.ceil(totalCount / request.page_size);
const startIndex = (request.page_number - 1) * request.page_size;
const endIndex = startIndex + request.page_size;
const pageOrders = filteredOrders.slice(startIndex, endIndex);
return {
status: "success",
data: {
orders: pageOrders,
pagination: {
total_count: totalCount,
total_pages: totalPages,
current_page: request.page_number,
page_size: request.page_size,
has_next: request.page_number < totalPages,
has_prev: request.page_number > 1,
},
},
};
}
/**
* 获取模拟订单详情
*/
getMockOrderDetail(orderId, detailLevel) {
logger.info(`使用模拟数据查询订单详情: ${orderId}`);
// 简单的模拟数据查找
const mockOrder = {
order_id: orderId,
sender: { name: "张三", phone: "13800138001", address: "北京市朝阳区中关村大街1号" },
receiver: { name: "李四", phone: "13800138002", address: "上海市浦东新区陆家嘴环路1000号" },
package: { type: "文件", weight: 0.5, size: "30x20x5" },
service_type: ServiceType.EXPRESS,
status: OrderStatus.DELIVERED,
create_time: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),
estimated_delivery: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(),
actual_delivery: new Date(Date.now() - 6 * 60 * 60 * 1000).toISOString(),
cost: 25.0,
};
const result = {
order_info: {
order_id: mockOrder.order_id,
status: mockOrder.status,
create_time: mockOrder.create_time,
service_type: mockOrder.service_type,
estimated_delivery: mockOrder.estimated_delivery,
actual_delivery: mockOrder.actual_delivery,
cost: mockOrder.cost,
},
sender_info: mockOrder.sender,
receiver_info: mockOrder.receiver,
package_info: mockOrder.package,
};
if (detailLevel === "full") {
result.tracking_history = [
{
time: mockOrder.create_time,
status: "订单创建",
location: mockOrder.sender.address,
description: "订单已创建,等待取件",
},
{
time: new Date(new Date(mockOrder.create_time).getTime() + 2 * 60 * 60 * 1000).toISOString(),
status: "已取件",
location: mockOrder.sender.address,
description: "快递员已取件",
},
{
time: new Date(new Date(mockOrder.create_time).getTime() + 12 * 60 * 60 * 1000).toISOString(),
status: "运输中",
location: "中转站",
description: "包裹正在运输途中",
},
{
time: new Date(new Date(mockOrder.create_time).getTime() + 36 * 60 * 60 * 1000).toISOString(),
status: "派送中",
location: mockOrder.receiver.address,
description: "包裹已到达目的地,正在派送",
},
];
if (mockOrder.actual_delivery) {
result.tracking_history.push({
time: mockOrder.actual_delivery,
status: "已签收",
location: mockOrder.receiver.address,
description: `包裹已由${mockOrder.receiver.name}签收`,
});
}
}
return {
status: "success",
data: result,
};
}
}
//# sourceMappingURL=order.js.map