style: 统一中文标点符号为英文格式

This commit is contained in:
tikkhun 2025-11-21 17:16:30 +08:00
parent 7234c4ae55
commit 429a844563
16 changed files with 83 additions and 83 deletions

View File

@ -124,7 +124,7 @@ export default defineConfig({
},
],
},
// 新增:订阅管理路由分组(权限复用 canSeeOrder
// 新增:订阅管理路由分组(权限复用 canSeeOrder)
{
name: '订阅管理',
path: '/subscription',

View File

@ -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;

View File

@ -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);

View File

@ -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,

View File

@ -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}

View File

@ -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>

View File

@ -157,7 +157,7 @@ const ListPage: React.FC = () => {
}}
columns={columns}
dateFormatter="number"
footer={() => `总计 ${total}`}
footer={() => `总计: ${total}`}
toolBarRender={() => [
<Button
type="primary"

View File

@ -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>

View File

@ -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

View File

@ -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.

View File

@ -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>
))}

View File

@ -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>

View File

@ -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}

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

@ -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;
};

4
typings.d.ts vendored
View File

@ -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; // 可选:用于设置颜色的字段名
}
}