feat: 智能复核添加快捷确认功能
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "web",
|
||||
"private": true,
|
||||
"version": "1.2.0",
|
||||
"version": "1.2.1",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite dev",
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user