Compare commits

...

9 Commits
main ... stable

Author SHA1 Message Date
zhuotianyuan 99335ef4f8 fix(订单列表): 修复物流公司默认值和邮箱地址处理逻辑
修复最优物流显示为最佳物流的问题,并移除默认值
修正origin邮箱地址不应被split的处理逻辑
2026-01-29 11:47:37 +08:00
zhuotianyuan b04e6954b5 feat(订单列表): 添加最优物流作为默认快递公司选项 2026-01-28 08:45:41 +00:00
zhuotianyuan 7db92c6771 fix(订单列表): 移除默认的快递公司字段 2026-01-28 08:45:41 +00:00
zhuotianyuan 3c7a5d815e feat(订单): 添加快递公司选择字段并优化发货信息处理
在发货表单中添加快递公司选择字段,支持多种快递公司选项
优化发货信息处理逻辑,包括邮件地址和联系信息的正确处理
2026-01-28 08:45:41 +00:00
zhuotianyuan 9263841890 feat(api): 添加订单相关接口和站点管理功能
添加订单相关接口包括获取订单项列表和关联订单功能
新增站点管理的创建、禁用、获取、列表和更新接口
更新类型定义以支持新功能
2026-01-26 10:56:00 +00:00
黄珑 e6075f174c Fix: 客户管理补充手机号搜索 2026-01-22 18:01:42 +08:00
zhuotianyuan 84ec4f5895 fix(订单列表): 将默认发货平台从uniuni改为freightwaves 2026-01-21 16:16:34 +08:00
zhuotianyuan 82e0df6d43 feat(订单列表): 添加发货平台选择功能
在发货弹窗中新增发货平台选择字段,默认值为uniuni,并添加必填校验规则
2026-01-21 16:12:12 +08:00
黄珑 2245c71702 Fix: 显示sitename错误临时补丁 2025-12-30 18:14:53 +08:00
6 changed files with 281 additions and 35 deletions

View File

@ -125,7 +125,7 @@ const ListPage: React.FC = () => {
{
title: 'phone',
dataIndex: 'phone',
hideInSearch: true,
hideInSearch: false,
render: (_, record) => record?.billing.phone || record?.shipping.phone,
},
{

View File

@ -83,6 +83,7 @@ import Item from 'antd/es/list/Item';
import RelatedOrders from '../../Subscription/Orders/RelatedOrders';
import React, { useMemo, useRef, useState } from 'react';
import { printPDF } from '@/utils/util';
import dayjs from 'dayjs';
const ListPage: React.FC = () => {
const actionRef = useRef<ActionType>();
@ -129,7 +130,7 @@ const ListPage: React.FC = () => {
label: '已申请退款',
},
{
key: 'refund_approved',
label: "已退款",
// label: '退款申请已通过',
@ -173,7 +174,7 @@ const ListPage: React.FC = () => {
hideInTable: true,
valueType: 'dateRange',
},
{
title: '订阅',
dataIndex: 'isSubscription',
@ -195,13 +196,26 @@ const ListPage: React.FC = () => {
value: item.id,
}));
},
render: (_, record) => {
const siteNameArr = {
1: 'Togovape',
2: 'CanPouches',
3: 'ZYN-Pouches',
4: 'Togopouches',
5: 'Yoonepouches',
6: 'CanPouches_co',
7: 'Canadapouch',
8: 'Zoltpouches'
};
return siteNameArr[record.siteId];
}
},
{
title: '订单包含',
dataIndex: 'keyword',
hideInTable: true,
},
{
{
title: '订单ID',
dataIndex: 'externalOrderId',
},
@ -239,7 +253,7 @@ const ListPage: React.FC = () => {
dataIndex: 'billing_phone',
render: (_, record) => record.shipping?.phone || record.billing?.phone,
},
{
{
title: '换货次数',
dataIndex: 'exchange_frequency',
hideInSearch: true,
@ -905,7 +919,7 @@ const Detail: React.FC<{
<ul>
{record?.items?.map((item: any) => (
<li key={item.id}>
{item.name}:{item.quantity}
{item.name}:{item.quantity}
</li>
))}
</ul>
@ -913,13 +927,13 @@ const Detail: React.FC<{
}}
/>
{/* 显示 related order */}
<ProDescriptions.Item
label="关联"
span={3}
render={(_, record) => {
return <RelatedOrders data={record?.related} />;
}}
/>
<ProDescriptions.Item
label="关联"
span={3}
render={(_, record) => {
return <RelatedOrders data={record?.related} />;
}}
/>
{/* 订单内容 */}
<ProDescriptions.Item
label="订单内容"
@ -1183,7 +1197,17 @@ const Shipping: React.FC<{
const [rates, setRates] = useState<API.RateDTO[]>([]);
const [ratesLoading, setRatesLoading] = useState(false);
const { message } = App.useApp();
const [shipmentPlatforms, setShipmentPlatforms] = useState([
{ label: 'uniuni', value: 'uniuni' },
{ label: 'tms.freightwaves', value: 'freightwaves' },
]);
const [courierCompany, setCourierCompany] = useState([
{ label: '最佳物流', value: '' },
{ label: 'UNIUNI', value: 'UNIUNI' },
{ label: 'PuroYYZ', value: 'PuroYYZ' },
{ label: 'CPYYZ', value: 'CPYYZ' },
{ label: 'UPSYYZ7000NEW', value: 'UPSYYZ7000NEW' },
]);
return (
<ModalForm
formRef={formRef}
@ -1234,6 +1258,8 @@ const Shipping: React.FC<{
let shipmentInfo = localStorage.getItem('shipmentInfo');
if (shipmentInfo) shipmentInfo = JSON.parse(shipmentInfo);
return {
shipmentPlatform: 'freightwaves',
courierCompany: '',
...data,
// payment_method_id: shipmentInfo?.payment_method_id,
stockPointId: shipmentInfo?.stockPointId,
@ -1260,7 +1286,7 @@ const Shipping: React.FC<{
},
origin: {
name: data?.siteName,
email_addresses: data?.email,
email_addresses: shipmentInfo?.email_addresses,
contact_name: data?.siteName,
phone_number: shipmentInfo?.phone_number,
address: {
@ -1297,7 +1323,7 @@ const Shipping: React.FC<{
}}
onFinish={async ({ customer_note, notes, items, details, externalOrderId, ...data }) => {
details.origin.email_addresses =
details.origin.email_addresses.split(',');
details.origin.email_addresses;
details.destination.email_addresses =
details.destination.email_addresses.split(',');
details.destination.phone_number.number =
@ -1327,6 +1353,7 @@ const Shipping: React.FC<{
postal_code: details.origin.address.postal_code,
address_line_1: details.origin.address.address_line_1,
phone_number: details.origin.phone_number,
email_addresses: details.origin.email_addresses,
}),
);
@ -1347,6 +1374,26 @@ const Shipping: React.FC<{
}
}}
>
<Row gutter={16}>
<Col span={8}>
<ProFormSelect
name="shipmentPlatform"
label="发货平台"
options={shipmentPlatforms}
placeholder="请选择发货平台"
rules={[{ required: true, message: '请选择一个选项' }]}
/>
</Col>
<Col span={8}>
<ProFormSelect
name="courierCompany"
label="快递公司"
options={courierCompany}
placeholder="请选择快递公司"
/>
</Col>
</Row>
<ProFormText
label="订单号"
readonly
@ -1908,7 +1955,7 @@ const Shipping: React.FC<{
const originEmail = details.origin.email_addresses;
const destinationEmail = details.destination.email_addresses;
details.origin.email_addresses =
details.origin.email_addresses.split(',');
details.origin.email_addresses;
details.destination.email_addresses =
details.destination.email_addresses.split(',');
details.destination.phone_number.number =
@ -1917,6 +1964,7 @@ const Shipping: React.FC<{
const res =
await logisticscontrollerGetshipmentfee(
{
shipmentPlatform: data.shipmentPlatform,
stockPointId: data.stockPointId,
sender: details.origin.contact_name,
@ -2012,14 +2060,14 @@ const SalesChange: React.FC<{
[],
);
// setOptions(
// data.sales?.map((item) => ({
// label: item.name,
// value: item.sku,
// })) || [],
// );
return { ...data};
return { ...data };
}}
onFinish={async (formData: any) => {
const { sales } = formData;
@ -2033,14 +2081,14 @@ const SalesChange: React.FC<{
return true;
}}
>
<ProFormList
<ProFormList
label="换货订单"
name="items"
>
<ProForm.Group>
<ProFormSelect
params={{ }}
params={{}}
request={async ({ keyWords }) => {
try {
const { data } = await wpproductcontrollerSearchproducts({
@ -2079,7 +2127,7 @@ const SalesChange: React.FC<{
precision: 0,
}}
/>
</ProForm.Group>
</ProFormList>
@ -2089,7 +2137,7 @@ const SalesChange: React.FC<{
>
<ProForm.Group>
<ProFormSelect
params={{}}
request={async ({ keyWords }) => {

View File

@ -1,7 +1,7 @@
// @ts-ignore
/* eslint-disable */
// API 更新时间:
// API 唯一标识:
// API 更新时间
// API 唯一标识
import * as customer from './customer';
import * as logistics from './logistics';
import * as order from './order';

View File

@ -30,6 +30,20 @@ export async function ordercontrollerDelorder(
});
}
/** 此处后端没有提供注释 GET /order/${param0}/related */
export async function ordercontrollerGetrelatedbyorder(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ordercontrollerGetrelatedbyorderParams,
options?: { [key: string]: any },
) {
const { orderId: param0, ...queryParams } = params;
return request<any>(`/order/${param0}/related`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 此处后端没有提供注释 POST /order/createNote */
export async function ordercontrollerCreatenote(
body: API.CreateOrderNoteDTO,
@ -60,6 +74,36 @@ export async function ordercontrollerGetorderbynumber(
});
}
/** 此处后端没有提供注释 GET /order/getOrderItemList */
export async function ordercontrollerGetorderitemlist(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ordercontrollerGetorderitemlistParams,
options?: { [key: string]: any },
) {
return request<any>('/order/getOrderItemList', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /order/getOrderItems */
export async function ordercontrollerGetorderitems(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ordercontrollerGetorderitemsParams,
options?: { [key: string]: any },
) {
return request<any>('/order/getOrderItems', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /order/getOrders */
export async function ordercontrollerGetorders(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)

View File

@ -9,3 +9,78 @@ export async function sitecontrollerAll(options?: { [key: string]: any }) {
...(options || {}),
});
}
/** 此处后端没有提供注释 POST /site/create */
export async function sitecontrollerCreate(
body: API.CreateSiteDTO,
options?: { [key: string]: any },
) {
return request<any>('/site/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 此处后端没有提供注释 PUT /site/disable/${param0} */
export async function sitecontrollerDisable(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.sitecontrollerDisableParams,
body: API.DisableSiteDTO,
options?: { [key: string]: any },
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/site/disable/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /site/get/${param0} */
export async function sitecontrollerGet(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.sitecontrollerGetParams,
options?: { [key: string]: any },
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/site/get/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /site/list */
export async function sitecontrollerList(options?: { [key: string]: any }) {
return request<any>('/site/list', {
method: 'GET',
...(options || {}),
});
}
/** 此处后端没有提供注释 PUT /site/update/${param0} */
export async function sitecontrollerUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.sitecontrollerUpdateParams,
body: API.UpdateSiteDTO,
options?: { [key: string]: any },
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/site/update/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || {}),
});
}

View File

@ -82,6 +82,8 @@ declare namespace API {
items?: PurchaseOrderItem[];
};
type CreateSiteDTO = {};
type CreateStockPointDTO = {
name?: string;
location?: string;
@ -134,6 +136,8 @@ declare namespace API {
SignatureRequirementEnum?: any;
};
type DisableSiteDTO = {};
type Location = {
name?: string;
address?: Address;
@ -299,6 +303,32 @@ declare namespace API {
orderId: number;
};
type ordercontrollerGetorderitemlistParams = {
/** 页码 */
current?: number;
/** 每页大小 */
pageSize?: number;
siteId?: string;
name?: string;
externalProductId?: string;
externalVariationId?: string;
startDate?: string;
endDate?: string;
};
type ordercontrollerGetorderitemsParams = {
isSource?: boolean;
exceptPackage?: boolean;
/** 页码 */
current?: number;
/** 每页大小 */
pageSize?: number;
siteId?: string;
name?: string;
startDate?: string;
endDate?: string;
};
type ordercontrollerGetordersalesParams = {
isSource?: boolean;
exceptPackage?: boolean;
@ -338,6 +368,12 @@ declare namespace API {
| 'return-approved'
| 'return-cancelled';
payment_method?: string;
/** 仅订阅订单(父订阅订单或包含订阅商品) */
isSubscriptionOnly?: boolean;
};
type ordercontrollerGetrelatedbyorderParams = {
orderId: number;
};
type ordercontrollerRefundorderParams = {
@ -437,8 +473,17 @@ declare namespace API {
subtotal_tax?: number;
total?: number;
total_tax?: number;
tax_class?: string;
taxes?: any;
meta_data?: any;
sku?: string;
global_unique_id?: string;
price?: number;
image?: Record<string, any>;
parent_name?: string;
bundled_by?: string;
bundled_item_title?: string;
bundled_items?: any;
/** 创建时间 */
createdAt: string;
/** 更新时间 */
@ -570,7 +615,7 @@ declare namespace API {
startDate?: string;
endDate?: string;
keyword?: string;
siteId?: string;
siteId?: number;
purchaseType?: 'all' | 'first_purchase' | 'repeat_purchase';
orderType?: 'all' | 'cpc' | 'non_cpc';
brand?: 'all' | 'zyn' | 'yoone' | 'zolt';
@ -867,6 +912,21 @@ declare namespace API {
| 'return-approved'
| 'return-cancelled';
payment_method?: string;
/** 仅订阅订单(父订阅订单或包含订阅商品) */
isSubscriptionOnly?: boolean;
};
type QueryOrderItemDTO = {
/** 页码 */
current?: number;
/** 每页大小 */
pageSize?: number;
siteId?: string;
name?: string;
externalProductId?: string;
externalVariationId?: string;
startDate?: string;
endDate?: string;
};
type QueryOrderSalesDTO = {
@ -918,6 +978,8 @@ declare namespace API {
isActive?: boolean;
};
type QuerySiteDTO = {};
type QueryStockDTO = {
/** 页码 */
current?: number;
@ -965,7 +1027,7 @@ declare namespace API {
| 'pending-cancel';
/** 客户邮箱 */
customer_email?: string;
/** 关键字(订阅ID、邮箱等) */
/** 关键字订阅ID、邮箱等 */
keyword?: string;
};
@ -1047,12 +1109,14 @@ declare namespace API {
details?: ShippingDetailsDTO;
stockPointId?: number;
orderIds?: number[];
shipmentPlatform?: string;
};
type ShipmentFeeBookDTO = {
shipmentPlatform?: string;
stockPointId?: number;
sender?: string;
startPhone?: string;
startPhone?: Record<string, any>;
startPostalCode?: string;
pickupAddress?: string;
shipperCountryCode?: string;
@ -1070,6 +1134,7 @@ declare namespace API {
dimensionUom?: string;
weight?: number;
weightUom?: string;
address_id?: number;
};
type ShippingAddress = {
@ -1111,17 +1176,29 @@ declare namespace API {
/** 站点 ID */
id?: string;
/** 站点 URL */
wpApiUrl?: string;
apiUrl?: string;
/** 站点 rest key */
consumerKey?: string;
/** 站点 rest 秘钥 */
consumerSecret?: string;
/** 站点名 */
siteName?: string;
/** 站点邮箱 */
email?: string;
/** 站点邮箱密码 */
emailPswd?: string;
/** 平台类型 */
type?: 'woocommerce' | 'shopyy';
/** SKU 前缀 */
skuPrefix?: string;
};
type sitecontrollerDisableParams = {
id: string;
};
type sitecontrollerGetParams = {
id: string;
};
type sitecontrollerUpdateParams = {
id: string;
};
type SkuItemDTO = {
@ -1345,7 +1422,7 @@ declare namespace API {
billing_interval?: number;
customer_id?: number;
customer_email?: string;
/** 父订单/父订阅ID(如有) */
/** 父订单/父订阅ID(如有) */
parent_id?: number;
start_date?: string;
trial_end?: string;
@ -1376,7 +1453,7 @@ declare namespace API {
| 'pending-cancel';
/** 客户邮箱 */
customer_email?: string;
/** 关键字(订阅ID、邮箱等) */
/** 关键字订阅ID、邮箱等 */
keyword?: string;
};
@ -1446,6 +1523,8 @@ declare namespace API {
items?: PurchaseOrderItem[];
};
type UpdateSiteDTO = {};
type UpdateStockDTO = {
stockPointId?: number;
productSku?: string;