UNPKG

ts-guoguo-mcp-server

Version:

裹裹寄件服务MCP Server - TypeScript版本,基于Model Context Protocol的寄件服务集成工具

333 lines 14.4 kB
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