From caa2358bbddd2b901b16af6bcfe036a62019ff66 Mon Sep 17 00:00:00 2001 From: zhaoxing <2558691827@qq.com> Date: Sun, 8 Nov 2026 11:22:55 +0800 Subject: [PATCH] =?UTF-8?q?fix(consignment):=20=E5=8F=91=E5=B8=83=E5=90=8E?= =?UTF-8?q?=E5=8D=B3=E6=97=B6=E5=88=B7=E6=96=B0=E5=AF=84=E5=8D=96=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E4=B8=8A=E9=99=90=E5=8D=A0=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/worker/WorkerConsignmentPage.tsx | 21 ++++++--- .../tests/consignment-publish-limits.test.ts | 43 +++++++++++++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/apps/frontend/src/pages/worker/WorkerConsignmentPage.tsx b/apps/frontend/src/pages/worker/WorkerConsignmentPage.tsx index b8c6b493..4dcc148a 100644 --- a/apps/frontend/src/pages/worker/WorkerConsignmentPage.tsx +++ b/apps/frontend/src/pages/worker/WorkerConsignmentPage.tsx @@ -198,11 +198,11 @@ export default function WorkerConsignmentPage() { }), }) - // 已发布的分类寄卖配置 → 打手端动态 tab + // 已发布的分类寄卖配置 → 打手端动态 tab。 + // activeQuantity(在售+待审核占用)是动态值:不设 staleTime,进入页面/窗口聚焦都拉最新。 const consignmentProfilesQuery = useQuery({ queryKey: ['worker-consignment-profiles'], queryFn: () => fetchWorkerConsignmentProfiles(), - staleTime: 60_000, }) const consignmentProfiles = consignmentProfilesQuery.data?.data.profiles || [] const selectedProfile: WorkerConsignmentProfile | null = @@ -247,10 +247,12 @@ export default function WorkerConsignmentPage() { const contactSupporters = consignmentContactsQuery.data?.data.items || [] const firstContactSupporterId = contactSupporters[0]?.id ?? null - // 切换标签页时自动刷新最新数据 + // 切换标签页时自动刷新最新数据;回到发布页时同步刷新各分类占用(activeQuantity) useEffect(() => { if (activeTab === 'records') { void queryClient.invalidateQueries({ queryKey: ['worker-my-consignments'] }) + } else { + void queryClient.invalidateQueries({ queryKey: ['worker-consignment-profiles'] }) } void queryClient.invalidateQueries({ queryKey: ['worker-profile'] }) }, [activeTab, queryClient]) @@ -586,7 +588,12 @@ export default function WorkerConsignmentPage() { setPriceState({ status: 'idle' }) lastPriceQueryKeyRef.current = '' setIntakeImages({}) - await Promise.all([myConsignmentsQuery.refetch(), profileQuery.refetch()]) + await Promise.all([ + myConsignmentsQuery.refetch(), + profileQuery.refetch(), + // 发布后立即刷新各分类占用,否则同一页面连续发布仍显示发布前的剩余额度 + consignmentProfilesQuery.refetch(), + ]) setRecordFilter('reviewing') setActiveTab('records') } catch (err: any) { @@ -1123,8 +1130,10 @@ export default function WorkerConsignmentPage() {
diff --git a/apps/frontend/tests/consignment-publish-limits.test.ts b/apps/frontend/tests/consignment-publish-limits.test.ts index 1844435c..02404ad5 100644 --- a/apps/frontend/tests/consignment-publish-limits.test.ts +++ b/apps/frontend/tests/consignment-publish-limits.test.ts @@ -59,3 +59,46 @@ test('打手端发布页:价格与数量限制必须走同一套规则', () => assert.ok(page.includes('quantityLimit.blocked'), '达到上限时必须禁用提交') assert.ok(page.includes('quantityLimit.activeQuantity'), '必须带入当前在售/待审核件数') }) + +test('打手端发布页:发布成功、切回发布 tab、手动刷新都会同步最新寄售占用', () => { + const page = readFileSync( + fileURLToPath(new URL('../src/pages/worker/WorkerConsignmentPage.tsx', import.meta.url)), + 'utf8', + ) + + // 含 activeQuantity 的配置查询不能有缓存,否则发布后仍显示旧额度 + const queryStart = page.indexOf('const consignmentProfilesQuery = useQuery({') + const queryEnd = page.indexOf('const consignmentProfiles =', queryStart) + assert.ok(queryStart > 0 && queryEnd > queryStart, '必须存在寄卖配置查询') + assert.ok( + !page.slice(queryStart, queryEnd).includes('staleTime'), + '含 activeQuantity 的配置查询不得设置 staleTime', + ) + + // 发布成功后必须刷新配置占用,否则同一页面连续发布仍按旧额度提示 + const publishStart = page.indexOf('async function handlePublishSubmit') + const publishEnd = page.indexOf('function resolveActionSubmissionId') + assert.ok(publishStart > 0 && publishEnd > publishStart, '必须存在发布提交处理函数') + assert.ok( + page.slice(publishStart, publishEnd).includes('consignmentProfilesQuery.refetch()'), + '发布成功后必须刷新寄卖配置占用', + ) + + // 切回「发布寄卖」tab 时必须失效缓存(客服审核/驳回后占用会变) + const effectStart = page.indexOf('切换标签页时自动刷新最新数据') + const effectEnd = page.indexOf('// 后端已按「一件货一行」聚合') + assert.ok(effectStart > 0 && effectEnd > effectStart, '必须存在切 tab 刷新逻辑') + assert.ok( + page.slice(effectStart, effectEnd).includes("queryKey: ['worker-consignment-profiles']"), + '切回发布 tab 必须失效寄卖配置缓存', + ) + + // 顶部「刷新」按钮必须同时刷新寄卖记录与剩余额度 + const refreshStart = page.indexOf('loading={myConsignmentsQuery.isFetching') + const refreshEnd = page.indexOf('刷新', refreshStart) + assert.ok(refreshStart > 0 && refreshEnd > refreshStart, '必须存在顶部刷新按钮') + assert.ok( + page.slice(refreshStart, refreshEnd).includes('consignmentProfilesQuery.refetch()'), + '手动刷新必须同步刷新剩余寄卖额度', + ) +})