feat: 添加对站点的配置页面 #29
|
|
@ -0,0 +1,55 @@
|
|||
import React from 'react';
|
||||
import { Empty, Tag } from 'antd';
|
||||
import dayjs from 'dayjs';
|
||||
import relativeTime from 'dayjs/plugin/relativeTime';
|
||||
|
||||
dayjs.extend(relativeTime);
|
||||
|
||||
/**
|
||||
* RelatedOrders 表格组件
|
||||
* 用于展示订单详情中的关联数据(订阅/订单),按统一表格样式渲染
|
||||
* 中文注释:本组件将订阅与订单统一归一化为五列展示,便于快速浏览
|
||||
*/
|
||||
const RelatedOrders: React.FC<{ data?: any[] }> = ({ data = [] }) => {
|
||||
const rows = (Array.isArray(data) ? data : []).map((it: any) => {
|
||||
const isSubscription = !!it?.externalSubscriptionId || !!it?.billing_period || !!it?.line_items;
|
||||
const number = isSubscription ? `#${it?.externalSubscriptionId || it?.id}` : `#${it?.externalOrderId || it?.id}`;
|
||||
const relationship = isSubscription ? 'Subscription' : 'Order';
|
||||
const dateRaw = it?.start_date || it?.date_created || it?.createdAt || it?.updatedAt;
|
||||
const dateText = dateRaw ? dayjs(dateRaw).fromNow() : '-';
|
||||
const status = (isSubscription ? it?.status : it?.orderStatus) || '-';
|
||||
const statusLower = String(status).toLowerCase();
|
||||
const color = statusLower === 'active' ? 'green' : statusLower === 'cancelled' ? 'red' : 'default';
|
||||
const totalNum = Number(it?.total || 0);
|
||||
const totalText = isSubscription ? `$${totalNum.toFixed(2)} / ${it?.billing_period || 'period'}` : `$${totalNum.toFixed(2)}`;
|
||||
return { key: `${isSubscription ? 'sub' : 'order'}-${it?.id}`, number, relationship, dateText, status, color, totalText };
|
||||
});
|
||||
|
||||
if (rows.length === 0) return <Empty description="暂无关联" />;
|
||||
|
||||
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>
|
||||
<div>日期</div>
|
||||
<div>状态</div>
|
||||
<div>金额</div>
|
||||
</div>
|
||||
<div>
|
||||
{rows.map((r) => (
|
||||
<div key={r.key} style={{ display: 'grid', gridTemplateColumns: '1.5fr 1fr 1fr 1fr 1fr', padding: '6px 0', borderTop: '1px solid #f0f0f0' }}>
|
||||
<div><a>{r.number}</a></div>
|
||||
<div>{r.relationship}</div>
|
||||
<div style={{ color: '#1677ff' }}>{r.dateText}</div>
|
||||
<div><Tag color={r.color}>{r.status}</Tag></div>
|
||||
<div>{r.totalText}</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default RelatedOrders;
|
||||
|
|
@ -77,9 +77,10 @@ import {
|
|||
Space,
|
||||
Tabs,
|
||||
TabsProps,
|
||||
Tag,
|
||||
} from 'antd';
|
||||
import Item from 'antd/es/list/Item';
|
||||
import dayjs from 'dayjs';
|
||||
import RelatedOrders from './RelatedOrders';
|
||||
import React, { useMemo, useRef, useState } from 'react';
|
||||
import { printPDF } from '@/utils/util';
|
||||
|
||||
|
|
@ -172,9 +173,16 @@ const ListPage: React.FC = () => {
|
|||
hideInTable: true,
|
||||
valueType: 'dateRange',
|
||||
},
|
||||
|
||||
{
|
||||
title: '订单号',
|
||||
dataIndex: 'externalOrderId',
|
||||
title: '订阅',
|
||||
dataIndex: 'isSubscription',
|
||||
hideInSearch: true,
|
||||
render: (_, record) => {
|
||||
const related = Array.isArray((record as any)?.related) ? (record as any).related : [];
|
||||
const isSub = related.some((it) => it?.externalSubscriptionId || it?.billing_period || it?.line_items);
|
||||
return <Tag color={isSub ? 'green' : 'default'}>{isSub ? '是' : '否'}</Tag>;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '站点',
|
||||
|
|
@ -885,6 +893,7 @@ const Detail: React.FC<{
|
|||
);
|
||||
}}
|
||||
/>
|
||||
{/* 原始订单 */}
|
||||
<ProDescriptions.Item
|
||||
label="原始订单"
|
||||
span={3}
|
||||
|
|
@ -900,22 +909,15 @@ const Detail: React.FC<{
|
|||
);
|
||||
}}
|
||||
/>
|
||||
{/* TODO 显示 related order */}
|
||||
<ProDescriptions.Item
|
||||
label="关联订单"
|
||||
span={3}
|
||||
render={(_, record) => {
|
||||
return (
|
||||
<ul>
|
||||
{record?.related?.map((item: any) => (
|
||||
<li key={item.id}>
|
||||
{JSON.stringify(item)}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
);
|
||||
}}
|
||||
/>
|
||||
{/* 显示 related order */}
|
||||
<ProDescriptions.Item
|
||||
label="关联"
|
||||
span={3}
|
||||
render={(_, record) => {
|
||||
return <RelatedOrders data={record?.related} />;
|
||||
}}
|
||||
/>
|
||||
{/* 订单内容 */}
|
||||
<ProDescriptions.Item
|
||||
label="订单内容"
|
||||
span={3}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ import { App, Tag, Button, Drawer, List } from 'antd';
|
|||
import dayjs from 'dayjs';
|
||||
import { ordercontrollerGetorders } from '@/servers/api/order';
|
||||
import { sitecontrollerAll } from '@/servers/api/site';
|
||||
import { request } from 'umi';
|
||||
|
||||
interface OrderItemRow {
|
||||
id: number;
|
||||
|
|
|
|||
Loading…
Reference in New Issue