统一业务台账首屏布局(05-30-fix-payment-ledger-layout-consistency)
这个提交包含在:
@@ -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}
|
||||
|
||||
在新工单中引用
屏蔽一个用户