From 98f68c47b05ba0ffd597d6459cfbba25447cf828 Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Thu, 14 May 2026 15:43:28 +0000 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E6=9B=B4=E6=96=B0=E4=BE=A7?= =?UTF-8?q?=E8=BE=B9=E6=A0=8F=E7=BB=84=E4=BB=B6=E5=92=8C=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E5=8F=B0=E7=BB=84=E4=BB=B6=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E5=AF=BC=E8=88=AA=E5=92=8C=E4=B8=9A=E5=8A=A1=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/business/PersonalWorkbench.vue | 161 +++++++++++++++++- web/src/components/layout/SidebarRail.vue | 29 +--- 2 files changed, 158 insertions(+), 32 deletions(-) diff --git a/web/src/components/business/PersonalWorkbench.vue b/web/src/components/business/PersonalWorkbench.vue index 487b886..3dc3ecf 100644 --- a/web/src/components/business/PersonalWorkbench.vue +++ b/web/src/components/business/PersonalWorkbench.vue @@ -59,11 +59,11 @@ -
+
-

今日待办

+

报销待办

{{ todoAlertCount }}
@@ -113,6 +113,58 @@
+ +
+
+
+

应收管理

+ {{ receivableAlertCount }} +
+ +
+ +
+
+
+ +
+ +
+ {{ item.title }} +

{{ item.date }}

+
+ + {{ item.amount }} + {{ item.status }} +
+
+
+ +
+
+
+

应付管理

+ {{ payableAlertCount }} +
+ +
+ +
+
+
+ +
+ +
+ {{ item.title }} +

{{ item.date }}

+
+ + {{ item.amount }} + {{ item.status }} +
+
+
@@ -154,6 +206,13 @@ const props = defineProps({ const emit = defineEmits(['openAssistant']) const { currentUser } = useSystemState() + +// 判断是否为财务人员 +const isFinanceUser = computed(() => { + const user = currentUser.value || {} + const roleCodes = Array.isArray(user.roleCodes) ? user.roleCodes : [] + return roleCodes.includes('finance') || roleCodes.includes('accountant') || user.isAdmin +}) const { toast } = useToast() const assistantDraft = ref('') const fileInputRef = ref(null) @@ -233,7 +292,9 @@ function emitAssistant(payload) { } async function loadLatestConversation() { - const payload = await fetchLatestConversation(resolveCurrentUserId(), SESSION_TYPE_EXPENSE) + const payload = await fetchLatestConversation(resolveCurrentUserId(), SESSION_TYPE_EXPENSE, { + preferRecoverable: true + }) return payload?.found ? payload.conversation || null : null } @@ -361,6 +422,76 @@ const progressItems = [ const progressAlertCount = progressItems.filter((item) => item.status !== '已到账').length +const receivableItems = [ + { + id: 'receivable-1', + title: '客户服务费收入', + amount: '¥15,800', + date: '2026-05-10', + status: '待收款', + tone: 'info', + icon: 'mdi mdi-account-cash-outline', + color: '#f59e0b' + }, + { + id: 'receivable-2', + title: '项目进度款', + amount: '¥42,600', + date: '2026-05-08', + status: '部分收款', + tone: 'success', + icon: 'mdi mdi-cash-multiple', + color: '#10b981' + }, + { + id: 'receivable-3', + title: '咨询服务费', + amount: '¥8,900', + date: '2026-05-05', + status: '逾期提醒', + tone: 'info', + icon: 'mdi mdi-bell-alert', + color: '#ef4444' + } +] + +const receivableAlertCount = receivableItems.filter((item) => item.status === '逾期提醒' || item.status === '待收款').length + +const payableItems = [ + { + id: 'payable-1', + title: '供应商采购款', + amount: '¥28,500', + date: '2026-05-12', + status: '待付款', + tone: 'info', + icon: 'mdi mdi-truck-outline', + color: '#3b82f6' + }, + { + id: 'payable-2', + title: '房租物业费', + amount: '¥12,800', + date: '2026-05-15', + status: '待审批', + tone: 'success', + icon: 'mdi mdi-office-building', + color: '#6366f1' + }, + { + id: 'payable-3', + title: '软件服务费', + amount: '¥3,600', + date: '2026-05-01', + status: '已付款', + tone: 'mint', + icon: 'mdi mdi-server', + color: '#10b981' + } +] + +const payableAlertCount = payableItems.filter((item) => item.status === '待付款' || item.status === '待审批').length + const policyItems = [ { name: '差旅报销管理办法(2026版)', @@ -725,6 +856,11 @@ watch( gap: 20px; } +.workbench-grid.finance-grid { + grid-template-columns: repeat(4, 1fr); + gap: 16px; +} + .list-panel, .policy-panel { padding: 20px 22px; @@ -974,6 +1110,11 @@ watch( .policy-row { grid-template-columns: 1.8fr 1.8fr 1fr; } + + .workbench-grid.finance-grid { + grid-template-columns: repeat(2, 1fr); + gap: 16px; + } } @media (max-width: 1440px) { @@ -1040,7 +1181,8 @@ watch( width: 176px; } - .workbench-grid { + .workbench-grid, + .workbench-grid.finance-grid { grid-template-columns: 1fr; } } @@ -1107,6 +1249,14 @@ watch( justify-self: start; } + .workbench-grid.finance-grid { + gap: 16px; + } + + .workbench-grid.finance-grid .list-panel { + padding: 16px 18px; + } + .policy-table { border: 0; border-radius: 0; @@ -1129,5 +1279,4 @@ watch( } } - - + diff --git a/web/src/components/layout/SidebarRail.vue b/web/src/components/layout/SidebarRail.vue index 512acf9..7208d79 100644 --- a/web/src/components/layout/SidebarRail.vue +++ b/web/src/components/layout/SidebarRail.vue @@ -8,9 +8,6 @@ {{ displayCompanyName }} -