feat: 添加对站点的配置页面 #29
|
|
@ -124,7 +124,7 @@ export default defineConfig({
|
|||
},
|
||||
],
|
||||
},
|
||||
// 新增:订阅管理路由分组(权限复用 canSeeOrder)
|
||||
// 新增:订阅管理路由分组(权限复用 canSeeOrder)
|
||||
{
|
||||
name: '订阅管理',
|
||||
path: '/subscription',
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ import { usercontrollerGetuser } from './servers/api/user';
|
|||
dayjs.locale('zh-cn');
|
||||
|
||||
// 全局初始化数据配置,用于 Layout 用户信息和权限初始化
|
||||
// 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate
|
||||
// 更多信息见文档:https://umijs.org/docs/api/runtime-config#getinitialstate
|
||||
export async function getInitialState(): Promise<{
|
||||
user?: Record<string, any>;
|
||||
categoryList?: ProSchemaValueEnumObj;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import { useEffect, useState } from 'react';
|
|||
import FingerprintJS from '@fingerprintjs/fingerprintjs';
|
||||
|
||||
/**
|
||||
* Hook: 获取设备指纹(visitorId)
|
||||
* Hook: 获取设备指纹(visitorId)
|
||||
*/
|
||||
export function useDeviceFingerprint() {
|
||||
const [fingerprint, setFingerprint] = useState<string | null>(null);
|
||||
|
|
|
|||
|
|
@ -7,24 +7,24 @@ import dayjs from 'dayjs';
|
|||
import { ordercontrollerGetordersales } from '@/servers/api/order';
|
||||
import { sitecontrollerAll } from '@/servers/api/site';
|
||||
|
||||
// 列表行数据结构(订单商品聚合)
|
||||
// 列表行数据结构(订单商品聚合)
|
||||
interface OrderItemAggRow {
|
||||
externalProductId: number; // 商品ID(来自 WooCommerce 产品ID)
|
||||
externalVariationId: number; // 变体ID(来自 WooCommerce 变体ID)
|
||||
externalProductId: number; // 商品ID(来自 WooCommerce 产品ID)
|
||||
externalVariationId: number; // 变体ID(来自 WooCommerce 变体ID)
|
||||
name: string; // 商品名称
|
||||
totalQuantity: number; // 总售出数量(时间范围内)
|
||||
totalOrders: number; // 涉及订单数(去重)
|
||||
firstOrderCount: number; // 客户首单次数(该商品)
|
||||
secondOrderCount: number; // 客户第二次购买次数(该商品)
|
||||
thirdOrderCount: number; // 客户第三次购买次数(该商品)
|
||||
moreThirdOrderCount: number; // 客户超过三次购买次数(该商品)
|
||||
totalQuantity: number; // 总售出数量(时间范围内)
|
||||
totalOrders: number; // 涉及订单数(去重)
|
||||
firstOrderCount: number; // 客户首单次数(该商品)
|
||||
secondOrderCount: number; // 客户第二次购买次数(该商品)
|
||||
thirdOrderCount: number; // 客户第三次购买次数(该商品)
|
||||
moreThirdOrderCount: number; // 客户超过三次购买次数(该商品)
|
||||
}
|
||||
|
||||
const OrderItemsPage: React.FC = () => {
|
||||
const actionRef = useRef<ActionType>();
|
||||
const { message } = App.useApp();
|
||||
|
||||
// 列配置(中文标题,符合当前项目风格;显示英文默认语言可后续走国际化)
|
||||
// 列配置(中文标题,符合当前项目风格;显示英文默认语言可后续走国际化)
|
||||
const columns: ProColumns<OrderItemAggRow>[] = [
|
||||
{
|
||||
title: '商品名称',
|
||||
|
|
@ -85,7 +85,7 @@ const OrderItemsPage: React.FC = () => {
|
|||
dataIndex: 'siteId',
|
||||
valueType: 'select',
|
||||
request: async () => {
|
||||
// 拉取站点列表(后台 /site/all)
|
||||
// 拉取站点列表(后台 /site/all)
|
||||
const { data = [] } = await sitecontrollerAll();
|
||||
return (data || []).map((item: any) => ({ label: item.siteName, value: item.id }));
|
||||
},
|
||||
|
|
@ -103,12 +103,12 @@ const OrderItemsPage: React.FC = () => {
|
|||
},
|
||||
];
|
||||
|
||||
// 表格请求方法:调用 /order/getOrderSales 接口并设置 isSource=true 获取订单项聚合
|
||||
// 表格请求方法:调用 /order/getOrderSales 接口并设置 isSource=true 获取订单项聚合
|
||||
const request: ProTableProps<OrderItemAggRow>['request'] = async (params:any) => {
|
||||
try {
|
||||
const { current = 1, pageSize = 10, siteId, name } = params as any;
|
||||
const [startDate, endDate] = (params as any).dateRange || [];
|
||||
// 调用后端接口(isSource=true 表示按订单项聚合)
|
||||
// 调用后端接口(isSource=true 表示按订单项聚合)
|
||||
const resp = await ordercontrollerGetordersales({
|
||||
current,
|
||||
pageSize,
|
||||
|
|
|
|||
|
|
@ -824,7 +824,7 @@ const Detail: React.FC<{
|
|||
return (
|
||||
<div>
|
||||
<div>
|
||||
company:
|
||||
company:
|
||||
<span>
|
||||
{record?.shipping?.company ||
|
||||
record?.billing?.company ||
|
||||
|
|
@ -832,7 +832,7 @@ const Detail: React.FC<{
|
|||
</span>
|
||||
</div>
|
||||
<div>
|
||||
first_name:
|
||||
first_name:
|
||||
<span>
|
||||
{record?.shipping?.first_name ||
|
||||
record?.billing?.first_name ||
|
||||
|
|
@ -840,7 +840,7 @@ const Detail: React.FC<{
|
|||
</span>
|
||||
</div>
|
||||
<div>
|
||||
last_name:
|
||||
last_name:
|
||||
<span>
|
||||
{record?.shipping?.last_name ||
|
||||
record?.billing?.last_name ||
|
||||
|
|
@ -848,7 +848,7 @@ const Detail: React.FC<{
|
|||
</span>
|
||||
</div>
|
||||
<div>
|
||||
country:
|
||||
country:
|
||||
<span>
|
||||
{record?.shipping?.country ||
|
||||
record?.billing?.country ||
|
||||
|
|
@ -856,19 +856,19 @@ const Detail: React.FC<{
|
|||
</span>
|
||||
</div>
|
||||
<div>
|
||||
state:
|
||||
state:
|
||||
<span>
|
||||
{record?.shipping?.state || record?.billing?.state || '-'}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
city:
|
||||
city:
|
||||
<span>
|
||||
{record?.shipping?.city || record?.billing?.city || '-'}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
postcode:
|
||||
postcode:
|
||||
<span>
|
||||
{record?.shipping?.postcode ||
|
||||
record?.billing?.postcode ||
|
||||
|
|
@ -876,13 +876,13 @@ const Detail: React.FC<{
|
|||
</span>
|
||||
</div>
|
||||
<div>
|
||||
phone:
|
||||
phone:
|
||||
<span>
|
||||
{record?.shipping?.phone || record?.billing?.phone || '-'}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
address_1:
|
||||
address_1:
|
||||
<span>
|
||||
{record?.shipping?.address_1 ||
|
||||
record?.billing?.address_1 ||
|
||||
|
|
@ -902,7 +902,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>
|
||||
|
|
@ -926,7 +926,7 @@ const Detail: React.FC<{
|
|||
<ul>
|
||||
{record?.sales?.map((item: any) => (
|
||||
<li key={item.id}>
|
||||
{item.name}:{item.quantity}
|
||||
{item.name}:{item.quantity}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
|
|
@ -1039,7 +1039,7 @@ const Detail: React.FC<{
|
|||
: []
|
||||
}
|
||||
>
|
||||
<div>订单号: {v?.orderIds?.join(',')}</div>
|
||||
<div>订单号: {v?.orderIds?.join(',')}</div>
|
||||
{v?.items?.map((item) => (
|
||||
<div>
|
||||
{item.name}: {item.quantity}
|
||||
|
|
|
|||
|
|
@ -192,7 +192,7 @@ const ListPage: React.FC = () => {
|
|||
<div>
|
||||
{record?.first_hot_purchase?.map((v) => (
|
||||
<div>
|
||||
产品名称:{v.name} 用户数:{v.user_count}
|
||||
产品名称:{v.name} 用户数:{v.user_count}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
|
@ -206,7 +206,7 @@ const ListPage: React.FC = () => {
|
|||
<div>
|
||||
{record?.second_hot_purchase?.map((v) => (
|
||||
<div>
|
||||
产品名称:{v.name} 用户数:{v.user_count}
|
||||
产品名称:{v.name} 用户数:{v.user_count}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
|
@ -220,7 +220,7 @@ const ListPage: React.FC = () => {
|
|||
<div>
|
||||
{record?.third_hot_purchase?.map((v) => (
|
||||
<div>
|
||||
产品名称:{v.name} 用户数:{v.user_count}
|
||||
产品名称:{v.name} 用户数:{v.user_count}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ const ListPage: React.FC = () => {
|
|||
}}
|
||||
columns={columns}
|
||||
dateFormatter="number"
|
||||
footer={() => `总计: ${total}`}
|
||||
footer={() => `总计: ${total}`}
|
||||
toolBarRender={() => [
|
||||
<Button
|
||||
type="primary"
|
||||
|
|
|
|||
|
|
@ -245,7 +245,7 @@ const CreateForm: React.FC<{
|
|||
/>
|
||||
<ProFormDependency name={['items']}>
|
||||
{({ items }) => {
|
||||
return '数量:' + items?.reduce((acc, cur) => acc + cur.quantity, 0);
|
||||
return '数量:' + items?.reduce((acc, cur) => acc + cur.quantity, 0);
|
||||
}}
|
||||
</ProFormDependency>
|
||||
<ProFormList<API.PurchaseOrderItem>
|
||||
|
|
@ -428,7 +428,7 @@ const UpdateForm: React.FC<{
|
|||
<ProFormDependency name={['items']}>
|
||||
{({ items }) => {
|
||||
return (
|
||||
'数量:' + items?.reduce((acc, cur) => acc + cur.quantity, 0)
|
||||
'数量:' + items?.reduce((acc, cur) => acc + cur.quantity, 0)
|
||||
);
|
||||
}}
|
||||
</ProFormDependency>
|
||||
|
|
|
|||
|
|
@ -289,7 +289,7 @@ const CreateForm: React.FC<{
|
|||
}}>引用</Button>} />
|
||||
<ProFormDependency name={['items']}>
|
||||
{({ items }) => {
|
||||
return '数量:' + (items?.reduce?.((acc, cur) => acc + cur.quantity, 0)||0);
|
||||
return '数量:' + (items?.reduce?.((acc, cur) => acc + cur.quantity, 0)||0);
|
||||
}}
|
||||
</ProFormDependency>
|
||||
<ProFormList
|
||||
|
|
@ -465,7 +465,7 @@ const UpdateForm: React.FC<{
|
|||
<ProFormTextArea name="note" label="备注" />
|
||||
<ProFormDependency name={['items']}>
|
||||
{({ items }) => {
|
||||
return '数量:' + items?.reduce?.((acc, cur) => acc + cur.quantity, 0);
|
||||
return '数量:' + items?.reduce?.((acc, cur) => acc + cur.quantity, 0);
|
||||
}}
|
||||
</ProFormDependency>
|
||||
<ProFormList
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ import {
|
|||
import { sitecontrollerAll } from '@/servers/api/site';
|
||||
|
||||
/**
|
||||
* 订阅状态枚举(用于筛选与展示)
|
||||
* 订阅状态枚举(用于筛选与展示)
|
||||
* 保持与后端同步的原始状态值
|
||||
*/
|
||||
const SUBSCRIPTION_STATUS_ENUM: Record<string, { text: string }> = {
|
||||
|
|
@ -29,10 +29,10 @@ const SUBSCRIPTION_STATUS_ENUM: Record<string, { text: string }> = {
|
|||
};
|
||||
|
||||
/**
|
||||
* 订阅列表页:展示、筛选、触发订阅同步
|
||||
* 订阅列表页:展示、筛选、触发订阅同步
|
||||
*/
|
||||
const ListPage: React.FC = () => {
|
||||
// 表格操作引用:用于在同步后触发表格刷新
|
||||
// 表格操作引用:用于在同步后触发表格刷新
|
||||
const actionRef = useRef<ActionType>();
|
||||
const { message } = App.useApp();
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ const ListPage: React.FC = () => {
|
|||
const [drawerTitle, setDrawerTitle] = useState('详情');
|
||||
const [relatedOrders, setRelatedOrders] = useState<any[]>([]);
|
||||
|
||||
// 表格列定义(尽量与项目风格保持一致)
|
||||
// 表格列定义(尽量与项目风格保持一致)
|
||||
const columns: ProColumns<API.Subscription>[] = [
|
||||
{
|
||||
title: '站点',
|
||||
|
|
@ -144,14 +144,14 @@ const ListPage: React.FC = () => {
|
|||
message.warning('该订阅缺少父订单号');
|
||||
return;
|
||||
}
|
||||
// 通过父订单号查询关联订单(模糊匹配)
|
||||
// 通过父订单号查询关联订单(模糊匹配)
|
||||
const resp = await request('/order/getOrderByNumber', {
|
||||
method: 'POST',
|
||||
data: { number: parentNumber },
|
||||
});
|
||||
const { success, data, message: errMsg } = resp as any;
|
||||
if (!success) throw new Error(errMsg || '获取失败');
|
||||
// 仅保留与父订单号完全一致的订单(避免模糊匹配误入)
|
||||
// 仅保留与父订单号完全一致的订单(避免模糊匹配误入)
|
||||
const candidates: any[] = (Array.isArray(data) ? data : []).filter(
|
||||
(c: any) => String(c?.externalOrderId) === parentNumber
|
||||
);
|
||||
|
|
@ -213,10 +213,10 @@ const ListPage: React.FC = () => {
|
|||
};
|
||||
}}
|
||||
columns={columns}
|
||||
// 工具栏:订阅同步入口
|
||||
// 工具栏:订阅同步入口
|
||||
toolBarRender={() => [<SyncForm key="sync" tableRef={actionRef} />]}
|
||||
/>
|
||||
{/* 关联订单抽屉:展示订单号、关系、时间、状态与金额 */}
|
||||
{/* 关联订单抽屉:展示订单号、关系、时间、状态与金额 */}
|
||||
<Drawer
|
||||
open={drawerOpen}
|
||||
title={drawerTitle}
|
||||
|
|
@ -230,7 +230,7 @@ const ListPage: React.FC = () => {
|
|||
<List.Item>
|
||||
<List.Item.Meta
|
||||
title={`#${item?.externalOrderId || '-'}`}
|
||||
description={`关系:${item?.relationship || '-'},站点:${item?.siteName || '-'}`}
|
||||
description={`关系:${item?.relationship || '-'},站点:${item?.siteName || '-'}`}
|
||||
/>
|
||||
<div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
|
||||
<span>{item?.date_created ? dayjs(item.date_created).format('YYYY-MM-DD HH:mm') : '-'}</span>
|
||||
|
|
@ -249,7 +249,7 @@ const ListPage: React.FC = () => {
|
|||
};
|
||||
|
||||
/**
|
||||
* 同步订阅抽屉表单:选择站点后触发同步
|
||||
* 同步订阅抽屉表单:选择站点后触发同步
|
||||
*/
|
||||
const SyncForm: React.FC<{
|
||||
tableRef: React.MutableRefObject<ActionType | undefined>;
|
||||
|
|
@ -267,7 +267,7 @@ const SyncForm: React.FC<{
|
|||
autoFocusFirstInput
|
||||
drawerProps={{ destroyOnHidden: true }}
|
||||
/**
|
||||
* 提交逻辑:
|
||||
* 提交逻辑:
|
||||
* 1. 必填校验由 ProForm + rules 保证
|
||||
* 2. 调用同步接口,失败时友好提示
|
||||
* 3. 成功后刷新列表
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import {
|
|||
import { ActionType, ProDescriptions } from '@ant-design/pro-components';
|
||||
import { CopyOutlined, DeleteFilled } from '@ant-design/icons';
|
||||
|
||||
// 服务器 API 引用(保持与原 index.tsx 一致)
|
||||
// 服务器 API 引用(保持与原 index.tsx 一致)
|
||||
import {
|
||||
ordercontrollerChangestatus,
|
||||
ordercontrollerGetorderdetail,
|
||||
|
|
@ -27,21 +27,21 @@ import { formatShipmentState, formatSource } from '@/utils/format';
|
|||
import RelatedOrders from './RelatedOrders';
|
||||
import { ORDER_STATUS_ENUM } from '@/constants';
|
||||
|
||||
// 中文注释:为保持原文件结构简单,此处从 index.tsx 引入的子组件仍由原文件导出或保持原状
|
||||
// 中文注释:为保持原文件结构简单,此处从 index.tsx 引入的子组件仍由原文件导出或保持原状
|
||||
// 若后续需要彻底解耦,可将 OrderNote / Shipping / SalesChange 也独立到文件
|
||||
// 当前按你的要求仅抽离详情 Drawer
|
||||
|
||||
type OrderRecord = API.Order;
|
||||
|
||||
interface OrderDetailDrawerProps {
|
||||
tableRef: React.MutableRefObject<ActionType | undefined>; // 中文注释:列表刷新引用
|
||||
orderId: number; // 中文注释:订单主键 ID
|
||||
record: OrderRecord; // 中文注释:订单行记录
|
||||
open: boolean; // 中文注释:是否打开抽屉
|
||||
onClose: () => void; // 中文注释:关闭抽屉回调
|
||||
setActiveLine: (id: number) => void; // 中文注释:高亮当前行
|
||||
OrderNoteComponent: React.ComponentType<any>; // 中文注释:备注组件(从外部注入)
|
||||
SalesChangeComponent: React.ComponentType<any>; // 中文注释:换货组件(从外部注入)
|
||||
tableRef: React.MutableRefObject<ActionType | undefined>; // 中文注释:列表刷新引用
|
||||
orderId: number; // 中文注释:订单主键 ID
|
||||
record: OrderRecord; // 中文注释:订单行记录
|
||||
open: boolean; // 中文注释:是否打开抽屉
|
||||
onClose: () => void; // 中文注释:关闭抽屉回调
|
||||
setActiveLine: (id: number) => void; // 中文注释:高亮当前行
|
||||
OrderNoteComponent: React.ComponentType<any>; // 中文注释:备注组件(从外部注入)
|
||||
SalesChangeComponent: React.ComponentType<any>; // 中文注释:换货组件(从外部注入)
|
||||
}
|
||||
|
||||
const OrderDetailDrawer: React.FC<OrderDetailDrawerProps> = ({
|
||||
|
|
@ -57,7 +57,7 @@ const OrderDetailDrawer: React.FC<OrderDetailDrawerProps> = ({
|
|||
const { message } = App.useApp();
|
||||
const ref = useRef<ActionType>();
|
||||
|
||||
// 中文注释:加载详情数据(与 index.tsx 中完全保持一致)
|
||||
// 中文注释:加载详情数据(与 index.tsx 中完全保持一致)
|
||||
const initRequest = async () => {
|
||||
const { data, success }: API.OrderDetailRes = await ordercontrollerGetorderdetail({ orderId });
|
||||
if (!success || !data) return { data: {} } as any;
|
||||
|
|
@ -84,7 +84,7 @@ const OrderDetailDrawer: React.FC<OrderDetailDrawerProps> = ({
|
|||
size="large"
|
||||
onClose={onClose}
|
||||
footer={[
|
||||
// 中文注释:备注组件(外部传入以避免循环依赖)
|
||||
// 中文注释:备注组件(外部传入以避免循环依赖)
|
||||
<OrderNoteComponent key="order-note" id={orderId} descRef={ref} />,
|
||||
...(['after_sale_pending', 'pending_reshipment'].includes(
|
||||
record.orderStatus,
|
||||
|
|
@ -241,21 +241,21 @@ const OrderDetailDrawer: React.FC<OrderDetailDrawerProps> = ({
|
|||
<ProDescriptions.Item label="客户备注" dataIndex="customer_note" span={3} />
|
||||
<ProDescriptions.Item label="发货信息" span={3} render={(_, r: any) => (
|
||||
<div>
|
||||
<div>company:<span>{r?.shipping?.company || r?.billing?.company || '-'}</span></div>
|
||||
<div>first_name:<span>{r?.shipping?.first_name || r?.billing?.first_name || '-'}</span></div>
|
||||
<div>last_name:<span>{r?.shipping?.last_name || r?.billing?.last_name || '-'}</span></div>
|
||||
<div>country:<span>{r?.shipping?.country || r?.billing?.country || '-'}</span></div>
|
||||
<div>state:<span>{r?.shipping?.state || r?.billing?.state || '-'}</span></div>
|
||||
<div>city:<span>{r?.shipping?.city || r?.billing?.city || '-'}</span></div>
|
||||
<div>postcode:<span>{r?.shipping?.postcode || r?.billing?.postcode || '-'}</span></div>
|
||||
<div>phone:<span>{r?.shipping?.phone || r?.billing?.phone || '-'}</span></div>
|
||||
<div>address_1:<span>{r?.shipping?.address_1 || r?.billing?.address_1 || '-'}</span></div>
|
||||
<div>company:<span>{r?.shipping?.company || r?.billing?.company || '-'}</span></div>
|
||||
<div>first_name:<span>{r?.shipping?.first_name || r?.billing?.first_name || '-'}</span></div>
|
||||
<div>last_name:<span>{r?.shipping?.last_name || r?.billing?.last_name || '-'}</span></div>
|
||||
<div>country:<span>{r?.shipping?.country || r?.billing?.country || '-'}</span></div>
|
||||
<div>state:<span>{r?.shipping?.state || r?.billing?.state || '-'}</span></div>
|
||||
<div>city:<span>{r?.shipping?.city || r?.billing?.city || '-'}</span></div>
|
||||
<div>postcode:<span>{r?.shipping?.postcode || r?.billing?.postcode || '-'}</span></div>
|
||||
<div>phone:<span>{r?.shipping?.phone || r?.billing?.phone || '-'}</span></div>
|
||||
<div>address_1:<span>{r?.shipping?.address_1 || r?.billing?.address_1 || '-'}</span></div>
|
||||
</div>
|
||||
)} />
|
||||
<ProDescriptions.Item label="原始订单" span={3} render={(_, r: any) => (
|
||||
<ul>
|
||||
{(r?.items || []).map((item: any) => (
|
||||
<li key={item.id}>{item.name}:{item.quantity}</li>
|
||||
<li key={item.id}>{item.name}:{item.quantity}</li>
|
||||
))}
|
||||
</ul>
|
||||
)} />
|
||||
|
|
@ -265,7 +265,7 @@ const OrderDetailDrawer: React.FC<OrderDetailDrawerProps> = ({
|
|||
<ProDescriptions.Item label="订单内容" span={3} render={(_, r: any) => (
|
||||
<ul>
|
||||
{(r?.sales || []).map((item: any) => (
|
||||
<li key={item.id}>{item.name}:{item.quantity}</li>
|
||||
<li key={item.id}>{item.name}:{item.quantity}</li>
|
||||
))}
|
||||
</ul>
|
||||
)} />
|
||||
|
|
@ -310,7 +310,7 @@ const OrderDetailDrawer: React.FC<OrderDetailDrawerProps> = ({
|
|||
</Popconfirm>
|
||||
] : [] }
|
||||
>
|
||||
<div>订单号: {Array.isArray(v?.orderIds) ? v.orderIds.join(',') : '-'}</div>
|
||||
<div>订单号: {Array.isArray(v?.orderIds) ? v.orderIds.join(',') : '-'}</div>
|
||||
{Array.isArray(v?.items) && v.items.map((item: any) => (
|
||||
<div key={item.id}>{item.name}: {item.quantity}</div>
|
||||
))}
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@ dayjs.extend(relativeTime);
|
|||
|
||||
/**
|
||||
* RelatedOrders 表格组件
|
||||
* 用于展示订单详情中的关联数据(订阅/订单),按统一表格样式渲染
|
||||
* 中文注释:本组件将订阅与订单统一归一化为五列展示,便于快速浏览
|
||||
* 用于展示订单详情中的关联数据(订阅/订单),按统一表格样式渲染
|
||||
* 中文注释:本组件将订阅与订单统一归一化为五列展示,便于快速浏览
|
||||
*/
|
||||
const RelatedOrders: React.FC<{ data?: any[] }> = ({ data = [] }) => {
|
||||
const rows = (Array.isArray(data) ? data : []).map((it: any) => {
|
||||
|
|
@ -29,7 +29,7 @@ const RelatedOrders: React.FC<{ data?: any[] }> = ({ data = [] }) => {
|
|||
|
||||
return (
|
||||
<div style={{ width: '100%' }}>
|
||||
{/* 表头(英文文案,符合国际化默认英文的要求) */}
|
||||
{/* 表头(英文文案,符合国际化默认英文的要求) */}
|
||||
<div style={{ display: 'grid', gridTemplateColumns: '1.5fr 1fr 1fr 1fr 1fr', padding: '8px 0', fontWeight: 600 }}>
|
||||
<div>订单编号</div>
|
||||
<div>关系</div>
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ interface OrderItemRow {
|
|||
const OrdersPage: React.FC = () => {
|
||||
const actionRef = useRef<ActionType>();
|
||||
const { message } = App.useApp();
|
||||
// 抽屉状态:改为复用订单详情抽屉组件
|
||||
// 抽屉状态:改为复用订单详情抽屉组件
|
||||
const [detailOpen, setDetailOpen] = useState(false);
|
||||
const [detailRecord, setDetailRecord] = useState<any | null>(null);
|
||||
const [detailOrderId, setDetailOrderId] = useState<number | null>(null);
|
||||
|
|
@ -149,7 +149,7 @@ const OrdersPage: React.FC = () => {
|
|||
}}
|
||||
toolBarRender={false}
|
||||
/>
|
||||
{/* 订阅关联:直接使用订单详情抽屉组件 */}
|
||||
{/* 订阅关联:直接使用订单详情抽屉组件 */}
|
||||
{detailRecord && detailOrderId !== null && (
|
||||
<OrderDetailDrawer
|
||||
open={detailOpen}
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -965,7 +965,7 @@ declare namespace API {
|
|||
| 'pending-cancel';
|
||||
/** 客户邮箱 */
|
||||
customer_email?: string;
|
||||
/** 关键字(订阅ID、邮箱等) */
|
||||
/** 关键字(订阅ID、邮箱等) */
|
||||
keyword?: string;
|
||||
};
|
||||
|
||||
|
|
@ -1345,7 +1345,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 +1376,7 @@ declare namespace API {
|
|||
| 'pending-cancel';
|
||||
/** 客户邮箱 */
|
||||
customer_email?: string;
|
||||
/** 关键字(订阅ID、邮箱等) */
|
||||
/** 关键字(订阅ID、邮箱等) */
|
||||
keyword?: string;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ declare namespace BaseType {
|
|||
type EnumTransformOptions {
|
||||
value: string; // 用于作为 value 的字段名
|
||||
label: string; // 用于作为 text 的字段名
|
||||
status?: string | undefined; // 可选:用于设置状态的字段名
|
||||
color?: string | undefined; // 可选:用于设置颜色的字段名
|
||||
status?: string | undefined; // 可选:用于设置状态的字段名
|
||||
color?: string | undefined; // 可选:用于设置颜色的字段名
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue