fix(huya): 协作台账固定序号并支持表头排序

This commit is contained in:
yml2213
2026-10-17 16:05:11 +08:00
parent fcc2fbdc09
commit fe1f959648
5 changed files with 161 additions and 10 deletions
+3
View File
@@ -1459,6 +1459,9 @@ export interface HuyaCollabOrderQuery {
gift_name?: string;
keyword?: string;
include_void?: boolean;
/** 服务端排序字段(后端白名单) */
sort_by?: string;
sort_order?: 'asc' | 'desc';
page?: number;
page_size?: number;
}
+80 -6
View File
@@ -105,6 +105,32 @@ const CK_META: Record<string, { label: string; color: string }> = {
disabled: { label: '已停用', color: 'warning' },
};
/** 表头排序字段(后端白名单):seq = 固定创建序号;点击一次正序,再点一次反序。 */
type CollabSortKey =
| 'seq'
| 'order_no'
| 'shop'
| 'owner'
| 'bind'
| 'gift_name'
| 'status'
| 'uid'
| 'ck_status'
| 'updated_at';
type CollabSortOrder = 'ascend' | 'descend';
const COLLAB_SORT_KEYS: ReadonlySet<string> = new Set<CollabSortKey>([
'seq',
'order_no',
'shop',
'owner',
'bind',
'gift_name',
'status',
'uid',
'ck_status',
'updated_at',
]);
const ACTION_LABELS: Record<string, string> = {
'huya:collab:create': '新建',
'huya:collab:update': '编辑',
@@ -397,6 +423,9 @@ export default function HuyaCollabPage() {
const [giftNames, setGiftNames] = useState<string[]>([]);
const [shopModalOpen, setShopModalOpen] = useState(false);
const [filters, setFilters] = useState<HuyaCollabOrderQuery>({ include_void: false });
// 默认按固定创建序号正序:老单在上、新单永远追加在最后。
const [sortKey, setSortKey] = useState<CollabSortKey>('seq');
const [sortOrder, setSortOrder] = useState<CollabSortOrder>('ascend');
const [realtimePending, setRealtimePending] = useState(false);
const [selectedIds, setSelectedIds] = useState<number[]>([]);
@@ -461,7 +490,13 @@ export default function HuyaCollabPage() {
if (!silent) setLoading(true);
try {
const [list, nextSummary, nextOwners, nextShops, nextGiftNames] = await Promise.all([
huyaApi.listCollabOrders({ ...filters, page, page_size: pageSize }),
huyaApi.listCollabOrders({
...filters,
sort_by: sortKey,
sort_order: sortOrder === 'descend' ? 'desc' : 'asc',
page,
page_size: pageSize,
}),
huyaApi.collabOrdersSummary(),
withMeta ? huyaApi.collabOrderOwners() : Promise.resolve(null),
withMeta ? huyaApi.listCollabShops() : Promise.resolve(null),
@@ -480,7 +515,7 @@ export default function HuyaCollabPage() {
} finally {
setLoading(false);
}
}, [filters, page, pageSize]);
}, [filters, page, pageSize, sortKey, sortOrder]);
useEffect(() => { void load(); }, [load]);
@@ -1194,16 +1229,28 @@ export default function HuyaCollabPage() {
? `礼包用本地缓存(${giftOptions.length} 个${giftCacheLabel ? ` · ${giftCacheLabel}` : ''}),要更新点「强制刷新礼包」`
: (ckPreview?.gifts_message || '');
// 表头排序:一次正序、再点反序(Table 上限制 sortDirections,不会出现「第三次取消」)。
const sortProps = (key: CollabSortKey) => ({
key,
sorter: true,
sortOrder: sortKey === key ? sortOrder : null,
showSorterTooltip: { title: '点击正序,再点一次反序' },
});
const columns: TableProps<HuyaCollabOrder>['columns'] = [
{
title: '序号', width: 70, fixed: 'left', align: 'center',
render: (_, __, index) => (
// 跨页连续:第 2 页第 1 行 = pageSize + 1
<Text type="secondary">{(page - 1) * pageSize + index + 1}</Text>
title: '序号', width: 76, fixed: 'left', align: 'center',
...sortProps('seq'),
render: (_, row) => (
// 序号 = 创建时分配的固定 id:不管切换排序、筛选还是翻页都不会重排。
<Tooltip title="创建序号,固定不变;新单会追加在最后">
<Text type="secondary">{row.id}</Text>
</Tooltip>
),
},
{
title: '订单编号', dataIndex: 'order_no', width: 170, fixed: 'left',
...sortProps('order_no'),
render: (value: string, row) => (
<Space direction="vertical" size={0}>
<Text copyable={{ text: value }} strong>{value}</Text>
@@ -1213,6 +1260,7 @@ export default function HuyaCollabPage() {
},
{
title: '店铺', dataIndex: 'shop', width: 120,
...sortProps('shop'),
render: (value: string, row) => (
<Popover
trigger="click"
@@ -1236,6 +1284,7 @@ export default function HuyaCollabPage() {
},
{
title: '负责人', dataIndex: 'owner_id', width: 130,
...sortProps('owner'),
render: (value: number | null, row) => (
<Select
size="small" variant="borderless" style={{ width: '100%' }}
@@ -1247,6 +1296,7 @@ export default function HuyaCollabPage() {
},
{
title: '绑定账号 / 角色', width: 210,
...sortProps('bind'),
render: (_, row) => (
<Space direction="vertical" size={0}>
<Text strong>{row.bind_game_account || <Text type="secondary">未读到</Text>}</Text>
@@ -1339,6 +1389,7 @@ export default function HuyaCollabPage() {
},
{
title: '礼包 / 备注', width: 160,
...sortProps('gift_name'),
render: (_, row) => (
<Space direction="vertical" size={0} style={{ width: '100%' }}>
<EditableText value={row.gift_name} disabled={!canEdit} placeholder="+ 礼包名"
@@ -1350,6 +1401,7 @@ export default function HuyaCollabPage() {
},
{
title: '状态', dataIndex: 'status', width: 130,
...sortProps('status'),
render: (value: HuyaCollabStatus, row) => (
<Space direction="vertical" size={2}>
<Tag color={STATUS_META[value]?.color}>{row.status_label || STATUS_META[value]?.label || value}</Tag>
@@ -1366,6 +1418,7 @@ export default function HuyaCollabPage() {
},
{
title: '虎牙号', width: 160,
...sortProps('uid'),
render: (_, row) => (
<Space direction="vertical" size={0}>
<Text>{row.uid || <Text type="secondary">未贴 CK</Text>}</Text>
@@ -1375,6 +1428,7 @@ export default function HuyaCollabPage() {
},
{
title: 'CK 状态', dataIndex: 'ck_status', width: 170,
...sortProps('ck_status'),
render: (value: string, row) => (
<Space direction="vertical" size={2} style={{ width: '100%' }}>
<Tag color={CK_META[value]?.color}>{row.ck_status_label || CK_META[value]?.label || value}</Tag>
@@ -1420,6 +1474,7 @@ export default function HuyaCollabPage() {
},
{
title: '最后改动', width: 160,
...sortProps('updated_at'),
render: (_, row) => (
<Space direction="vertical" size={0}>
<Text>{row.updated_by_name || '-'}</Text>
@@ -1682,6 +1737,25 @@ export default function HuyaCollabPage() {
columns={columns}
dataSource={rows}
scroll={{ x: 1800, y: 'calc(100vh - 460px)' }}
sortDirections={['ascend', 'descend']}
onChange={(_pagination, _filters, sorter, extra) => {
if (extra.action !== 'sort') return;
const current = Array.isArray(sorter) ? sorter[0] : sorter;
const nextOrder = current?.order;
const nextKey = String(current?.columnKey ?? '');
// 只在白名单命中时切换;排序状态变了必须回第一页,否则会停在一个空页。
if (
(nextOrder === 'ascend' || nextOrder === 'descend')
&& COLLAB_SORT_KEYS.has(nextKey)
) {
setSortKey(nextKey as CollabSortKey);
setSortOrder(nextOrder);
} else {
setSortKey('seq');
setSortOrder('ascend');
}
setPage(1);
}}
rowSelection={canEdit ? {
selectedRowKeys: selectedIds,
onChange: (keys) => setSelectedIds(keys.map(Number)),