统一业务台账首屏布局(05-30-fix-payment-ledger-layout-consistency)

这个提交包含在:
2026-05-30 21:44:16 +08:00
父节点 eea2af7718
当前提交 16fd9bdf52
共修改 25 个文件,包含 834 行新增和 543 行删除
+18 -37
查看文件
@@ -109,15 +109,11 @@ export function InventoryChecksPage() {
});
useEffect(() => {
const nextId = inventoryChecksQuery.data?.items?.[0]?.id ?? "";
if (!selectedCheckId && nextId) {
setSelectedCheckId(nextId);
}
if (selectedCheckId && inventoryChecksQuery.data?.items?.some((item) => item.id === selectedCheckId)) {
if (!selectedCheckId) {
return;
}
if (nextId !== selectedCheckId) {
setSelectedCheckId(nextId);
if (!inventoryChecksQuery.data?.items?.some((item) => item.id === selectedCheckId)) {
setSelectedCheckId("");
}
}, [inventoryChecksQuery.data?.items, selectedCheckId]);
@@ -247,7 +243,6 @@ export function InventoryChecksPage() {
<PageScaffold className="space-y-6">
<PageHeader
title="资产盘点"
subtitle="按任务执行盘点:先确定范围,再启动、扫码/录入、核对结果并确认完成。"
actions={
<Button
type="button"
@@ -260,30 +255,20 @@ export function InventoryChecksPage() {
}
/>
<section className="ops-status-strip grid gap-4 md:grid-cols-4" data-testid="inventory-check-summary">
<div className="finance-metric-card">
<div className="text-sm text-zinc-500">盘点任务</div>
<div className="mt-1 text-2xl font-semibold text-zinc-900">{inventoryStats.total}</div>
<div className="mt-1 text-xs text-zinc-500">按季度或事件触发</div>
</div>
<div className="finance-metric-card">
<div className="text-sm text-zinc-500">草稿</div>
<div className="mt-1 text-2xl font-semibold text-zinc-900">{inventoryStats.draft}</div>
<div className="mt-1 text-xs text-zinc-500">待启动后录入</div>
</div>
<div className="finance-metric-card">
<div className="text-sm text-zinc-500">盘点中</div>
<div className="mt-1 text-2xl font-semibold text-zinc-900">{inventoryStats.counting}</div>
<div className="mt-1 text-xs text-zinc-500">可扫码或手工录入</div>
</div>
<div className="finance-metric-card">
<div className="text-sm text-zinc-500">已完成</div>
<div className="mt-1 text-2xl font-semibold text-zinc-900">{inventoryStats.completed}</div>
<div className="mt-1 text-xs text-zinc-500">保留差异和备注</div>
</div>
<section className="flex flex-wrap gap-2" data-testid="inventory-check-summary">
{[
["全部", inventoryStats.total],
["草稿", inventoryStats.draft],
["盘点中", inventoryStats.counting],
["已完成", inventoryStats.completed],
].map(([label, value]) => (
<span key={label} className="rounded-full border border-zinc-200 bg-white px-3 py-1 text-sm text-zinc-700">
{label} <span className="font-semibold text-zinc-900">{value}</span>
</span>
))}
</section>
<div className="grid gap-6 xl:grid-cols-[360px_minmax(0,1fr)]">
<div className={selectedCheck ? "grid gap-6 xl:grid-cols-[360px_minmax(0,1fr)]" : "grid gap-6"}>
<div className="card-std space-y-4 p-6">
<h3 className="text-base font-semibold text-zinc-900">新建盘点任务</h3>
<div className="space-y-2">
@@ -338,7 +323,7 @@ export function InventoryChecksPage() {
<TableRow
data-testid="inventory-row"
key={item.id}
className={item.id === selectedCheckId ? "bg-zinc-50 cursor-pointer" : "cursor-pointer"}
className="cursor-pointer"
onClick={() => setSelectedCheckId(item.id)}
>
<TableCell className="font-medium text-zinc-900">{item.checkNo}</TableCell>
@@ -358,17 +343,12 @@ export function InventoryChecksPage() {
</div>
</div>
{selectedCheck ? (
<div className="card-std space-y-4 p-6">
{inventoryChecksQuery.isLoading ? <TableSkeleton columns={3} rows={6} /> : null}
{inventoryChecksQuery.isError ? (
<p className="rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-600">{resolveError(inventoryChecksQuery.error)}</p>
) : null}
{!inventoryChecksQuery.isLoading && !selectedCheck ? (
<div className="rounded-lg border border-dashed border-zinc-300 p-8 text-center text-sm text-zinc-500">
请先创建或选择盘点任务。
</div>
) : null}
{selectedCheck ? (
<>
<div className="flex items-center justify-between gap-3">
@@ -464,6 +444,7 @@ export function InventoryChecksPage() {
</>
) : null}
</div>
) : null}
</div>
<ActionConfirmDialog
open={confirmCompleteCheck}