feat: 智能复核添加快捷确认功能

This commit is contained in:
CHE LIANG ZHAO
2026-01-26 13:04:04 +08:00
parent 6e3756b2e1
commit 7b2d6a9fbb
4 changed files with 143 additions and 175 deletions

View File

@@ -1,7 +1,7 @@
{
"name": "web",
"private": true,
"version": "1.2.0",
"version": "1.2.1",
"type": "module",
"scripts": {
"dev": "vite dev",

View File

@@ -7,12 +7,14 @@
import * as Table from '$lib/components/ui/table';
import BillDetailDrawer from '$lib/components/analysis/BillDetailDrawer.svelte';
import { cleanedBillToUIBill, type UIBill } from '$lib/models/bill';
import { updateBill } from '$lib/api';
import Loader2 from '@lucide/svelte/icons/loader-2';
import AlertCircle from '@lucide/svelte/icons/alert-circle';
import AlertTriangle from '@lucide/svelte/icons/alert-triangle';
import Clock from '@lucide/svelte/icons/clock';
import PartyPopper from '@lucide/svelte/icons/party-popper';
import RefreshCw from '@lucide/svelte/icons/refresh-cw';
import Check from '@lucide/svelte/icons/check';
let isLoading = $state(true);
let errorMessage = $state('');
@@ -20,6 +22,9 @@
let allBills = $state<CleanedBill[]>([]);
let filterLevel = $state<'all' | 'HIGH' | 'LOW'>('all');
// 快捷确认按钮的加载状态 (记录ID -> 是否在加载)
let confirmingBills = $state<Map<string, boolean>>(new Map());
onMount(() => {
loadReviewData();
});
@@ -88,6 +93,48 @@
drawerOpen = true;
}
// 快捷确认(仅清除 review_level不修改其他字段
async function quickConfirm(record: CleanedBill, event: Event) {
// 阻止事件冒泡,避免触发行点击
event.stopPropagation();
if (confirmingBills.get(record.id)) return;
// 设置加载状态
confirmingBills.set(record.id, true);
confirmingBills = new Map(confirmingBills);
try {
const resp = await updateBill(record.id, { review_level: '' });
if (resp.result) {
// 从列表中移除该记录
const index = allBills.findIndex(r => r.id === record.id);
if (index !== -1) {
allBills.splice(index, 1);
allBills = [...allBills];
}
// 更新统计数据
if (reviewStats) {
reviewStats = {
...reviewStats,
total: Math.max(0, reviewStats.total - 1),
high: record.review_level === 'HIGH' ? Math.max(0, reviewStats.high - 1) : reviewStats.high,
low: record.review_level === 'LOW' ? Math.max(0, reviewStats.low - 1) : reviewStats.low
};
}
}
} catch (err) {
console.error('快捷确认失败:', err);
// 这里可以添加错误提示
} finally {
// 清除加载状态
confirmingBills.delete(record.id);
confirmingBills = new Map(confirmingBills);
}
}
// 复核完成后从列表中移除该记录
function handleBillUpdate(updated: UIBill, original: UIBill) {
// 更新后 review_level 已被清除,从列表中移除
@@ -254,6 +301,7 @@
<Table.Head>收/支</Table.Head>
<Table.Head class="text-right">金额</Table.Head>
<Table.Head class="w-[80px]">优先级</Table.Head>
<Table.Head class="w-[100px] text-center">操作</Table.Head>
</Table.Row>
</Table.Header>
<Table.Body>
@@ -287,6 +335,23 @@
{record.review_level}
</Badge>
</Table.Cell>
<Table.Cell class="text-center">
<Button
size="sm"
variant="outline"
class="h-7 px-2 text-xs"
onclick={(e) => quickConfirm(record, e)}
disabled={confirmingBills.get(record.id) || false}
title="确认分类正确"
>
{#if confirmingBills.get(record.id)}
<Loader2 class="h-3 w-3 animate-spin" />
{:else}
<Check class="h-3 w-3 mr-1" />
确认
{/if}
</Button>
</Table.Cell>
</Table.Row>
{/each}
</Table.Body>