From 6d97ecbcc7a27311d810cc1fbc8b696bf673667d Mon Sep 17 00:00:00 2001 From: tikkhun Date: Wed, 31 Dec 2025 14:56:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=AE=A2=E5=8D=95):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD=E5=B9=B6?= =?UTF-8?q?=E6=89=A9=E5=B1=95API=E7=B1=BB=E5=9E=8B=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 扩展订单列表API的类型定义,增加时间范围查询参数和分组选项 修改订单导出功能,直接返回CSV文件流供下载 为订单详情添加更多字段类型定义,包括支付时间、客户IP等 --- src/pages/Order/List/index.tsx | 429 +++++++++++++++++---------------- src/servers/api/typings.d.ts | 85 ++++++- 2 files changed, 303 insertions(+), 211 deletions(-) diff --git a/src/pages/Order/List/index.tsx b/src/pages/Order/List/index.tsx index f4dc9ce..3409ccf 100644 --- a/src/pages/Order/List/index.tsx +++ b/src/pages/Order/List/index.tsx @@ -76,6 +76,7 @@ import { } from 'antd'; import React, { useMemo, useRef, useState } from 'react'; import RelatedOrders from '../../Subscription/Orders/RelatedOrders'; +import { request } from '@umijs/max'; const ListPage: React.FC = () => { const actionRef = useRef(); @@ -504,15 +505,25 @@ const ListPage: React.FC = () => { title="批量导出" description="确认导出选中的订单吗?" onConfirm={async () => { + console.log(selectedRowKeys); try { - const { success, message: errMsg } = - await ordercontrollerExportorder({ + const res = await request('/order/order/export', { + method: 'GET', + params: { ids: selectedRowKeys, - }); - if (!success) { - throw new Error(errMsg); + } + }); + if (res?.success && res?.data?.csv) { + const blob = new Blob([res.data.csv], { type: 'text/csv;charset=utf-8;' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'customers.csv'; + a.click(); + URL.revokeObjectURL(url); + } else { + message.error(res.message || '导出失败'); } - message.success('导出成功'); actionRef.current?.reload(); setSelectedRowKeys([]); } catch (error: any) { @@ -616,36 +627,36 @@ const Detail: React.FC<{ ) ? [] : [ - , - , - ]), + const { + success, + message: errMsg, + data, + } = await ordercontrollerSyncorderbyid({ + siteId: record.siteId, + orderId: record.externalOrderId, + }); + if (!success) { + throw new Error(errMsg); + } + showSyncResult(data as SyncResultData, '订单'); + tableRef.current?.reload(); + } catch (error: any) { + message.error(error?.message || '同步失败'); + } + }} + > + 同步订单 + , + ]), // ...(['processing', 'pending_reshipment'].includes(record.orderStatus) // ? [ // , @@ -664,152 +675,152 @@ const Detail: React.FC<{ 'pending_refund', ].includes(record.orderStatus) ? [ - , - { - try { - if (!record.id) { - message.error('订单ID不存在'); - return; - } - const { success, message: errMsg } = - await ordercontrollerChangestatus( - { - id: record.id, - }, - { - status: 'after_sale_pending', - }, - ); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - } catch (error: any) { - message.error(error.message); + , + { + try { + if (!record.id) { + message.error('订单ID不存在'); + return; } - }} - > - - , - ] + const { success, message: errMsg } = + await ordercontrollerChangestatus( + { + id: record.id, + }, + { + status: 'after_sale_pending', + }, + ); + if (!success) { + throw new Error(errMsg); + } + tableRef.current?.reload(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + , + ] : []), ...(record.orderStatus === 'after_sale_pending' ? [ - , - { - try { - if (!record.id) { - message.error('订单ID不存在'); - return; - } - const { success, message: errMsg } = - await ordercontrollerCancelorder({ + , + { + try { + if (!record.id) { + message.error('订单ID不存在'); + return; + } + const { success, message: errMsg } = + await ordercontrollerCancelorder({ + id: record.id, + }); + if (!success) { + throw new Error(errMsg); + } + tableRef.current?.reload(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + , + , + { + try { + if (!record.id) { + message.error('订单ID不存在'); + return; + } + const { success, message: errMsg } = + await ordercontrollerRefundorder({ + id: record.id, + }); + if (!success) { + throw new Error(errMsg); + } + tableRef.current?.reload(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + , + , + { + try { + if (!record.id) { + message.error('订单ID不存在'); + return; + } + const { success, message: errMsg } = + await ordercontrollerCompletedorder({ + id: record.id, + }); + if (!success) { + throw new Error(errMsg); + } + tableRef.current?.reload(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + , + , + { + try { + const { success, message: errMsg } = + await ordercontrollerChangestatus( + { id: record.id, - }); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - } catch (error: any) { - message.error(error.message); + }, + { + status: 'pending_reshipment', + }, + ); + if (!success) { + throw new Error(errMsg); } - }} - > - - , - , - { - try { - if (!record.id) { - message.error('订单ID不存在'); - return; - } - const { success, message: errMsg } = - await ordercontrollerRefundorder({ - id: record.id, - }); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - } catch (error: any) { - message.error(error.message); - } - }} - > - - , - , - { - try { - if (!record.id) { - message.error('订单ID不存在'); - return; - } - const { success, message: errMsg } = - await ordercontrollerCompletedorder({ - id: record.id, - }); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - } catch (error: any) { - message.error(error.message); - } - }} - > - - , - , - { - try { - const { success, message: errMsg } = - await ordercontrollerChangestatus( - { - id: record.id, - }, - { - status: 'pending_reshipment', - }, - ); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - } catch (error: any) { - message.error(error.message); - } - }} - > - - , - ] + tableRef.current?.reload(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + , + ] : []), ]} > @@ -1071,31 +1082,31 @@ const Detail: React.FC<{ } actions={ v.state === 'waiting-for-scheduling' || - v.state === 'waiting-for-transit' + v.state === 'waiting-for-transit' ? [ - { - try { - const { success, message: errMsg } = - await logisticscontrollerDelshipment({ - id: v.id, - }); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - initRequest(); - } catch (error: any) { - message.error(error.message); + { + try { + const { success, message: errMsg } = + await logisticscontrollerDelshipment({ + id: v.id, + }); + if (!success) { + throw new Error(errMsg); } - }} - > - - 取消运单 - , - ] + tableRef.current?.reload(); + initRequest(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + 取消运单 + , + ] : [] } > @@ -1483,16 +1494,16 @@ const Shipping: React.FC<{ - // value && value.length > 0 - // ? Promise.resolve() - // : Promise.reject('至少需要一个商品'), - // }, - // ]} + // rules={[ + // { + // required: true, + // message: '至少需要一个商品', + // validator: (_, value) => + // value && value.length > 0 + // ? Promise.resolve() + // : Promise.reject('至少需要一个商品'), + // }, + // ]} > diff --git a/src/servers/api/typings.d.ts b/src/servers/api/typings.d.ts index 9acc9d2..be6e9b5 100644 --- a/src/servers/api/typings.d.ts +++ b/src/servers/api/typings.d.ts @@ -452,7 +452,7 @@ declare namespace API { /** 站点ID */ site_id?: number; /** 原始ID */ - origin_id?: number; + origin_id?: string; /** 站点创建时间 */ site_created_at?: string; /** 站点更新时间 */ @@ -988,6 +988,7 @@ declare namespace API { purchaseType?: 'all' | 'first_purchase' | 'repeat_purchase'; orderType?: 'all' | 'cpc' | 'non_cpc'; brand?: 'all' | 'zyn' | 'yoone' | 'zolt'; + grouping?: 'day' | 'week' | 'month'; }; type OrderStatusCountDTO = { @@ -1156,6 +1157,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1669,6 +1674,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1683,6 +1692,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1697,6 +1710,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1711,6 +1728,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1725,6 +1746,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1739,6 +1764,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1758,6 +1787,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1778,6 +1811,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1796,6 +1833,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1820,6 +1861,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1844,6 +1889,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1858,6 +1907,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1872,6 +1925,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -1891,6 +1948,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -2398,6 +2459,8 @@ declare namespace API { email?: string; /** 电话 */ phone?: string; + /** 配送方式 */ + method_title?: string; }; type UnifiedCategoryDTO = { @@ -2535,6 +2598,8 @@ declare namespace API { status?: string; /** 货币 */ currency?: string; + /** 货币符号 */ + currency_symbol?: string; /** 总金额 */ total?: string; /** 客户ID */ @@ -2543,6 +2608,8 @@ declare namespace API { customer_name?: string; /** 客户邮箱 */ email?: string; + /** 客户邮箱 */ + customer_email?: string; /** 订单项(具体的商品) */ line_items?: UnifiedOrderLineItemDTO[]; /** 销售项(兼容前端) */ @@ -2573,6 +2640,16 @@ declare namespace API { coupon_lines?: UnifiedCouponLineDTO[]; /** 物流追踪信息 */ tracking?: UnifiedOrderTrackingDTO[]; + /** 支付时间 */ + date_paid?: string; + /** 客户IP地址 */ + customer_ip_address?: string; + /** UTM来源 */ + utm_source?: string; + /** 设备类型 */ + device_type?: string; + /** 来源类型 */ + source_type?: string; }; type UnifiedOrderLineItemDTO = { @@ -2801,6 +2878,10 @@ declare namespace API { page?: number; /** 每页数量 */ per_page?: number; + /** 查询时间范围开始 */ + after?: string; + /** 查询时间范围结束 */ + before?: string; /** 搜索关键词 */ search?: string; /** 过滤条件对象 */ @@ -2916,7 +2997,7 @@ declare namespace API { /** 站点ID */ site_id?: number; /** 原始ID */ - origin_id?: number; + origin_id?: string; /** 邮箱 */ email?: string; /** 名字 */