From dff302aae8b04147cef48e8b90cf64a5372933df Mon Sep 17 00:00:00 2001 From: chenghuan Date: Wed, 14 Jan 2026 09:24:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(statistics):=20=E6=B7=BB=E5=8A=A0=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=88=86=E6=9E=90=E6=A8=A1=E5=9D=97=EF=BC=9A=E5=A4=A9?= =?UTF-8?q?=E5=8C=BB=E5=B8=81=E3=80=81=E5=AE=9E=E7=89=A9=E3=80=81=E5=9F=B9?= =?UTF-8?q?=E8=AE=AD=E7=8F=AD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增天医币、实物和培训班报表页面 - 添加统计相关API接口 - 配置统计分析路由 - 优化SheetFooter和DialogFooter组件样式 --- apps/finance/src/api/statistics/index.ts | 33 ++++ .../src/router/routes/modules/statistics.ts | 45 ++++++ .../src/views/statistics/physical/report.vue | 125 +++++++++++++++ .../src/views/statistics/tianyibi/report.vue | 149 ++++++++++++++++++ .../views/statistics/trainingClass/report.vue | 126 +++++++++++++++ apps/finance/src/views/test.vue | 15 +- .../menu-ui/src/components/menu-item.vue | 25 +-- .../shadcn-ui/src/ui/dialog/DialogFooter.vue | 6 +- .../shadcn-ui/src/ui/sheet/SheetFooter.vue | 6 +- .../common-ui/src/ui/profile/profile.vue | 18 +-- packages/effects/layouts/src/basic/layout.vue | 23 ++- 11 files changed, 511 insertions(+), 60 deletions(-) create mode 100644 apps/finance/src/api/statistics/index.ts create mode 100644 apps/finance/src/router/routes/modules/statistics.ts create mode 100644 apps/finance/src/views/statistics/physical/report.vue create mode 100644 apps/finance/src/views/statistics/tianyibi/report.vue create mode 100644 apps/finance/src/views/statistics/trainingClass/report.vue diff --git a/apps/finance/src/api/statistics/index.ts b/apps/finance/src/api/statistics/index.ts new file mode 100644 index 0000000..bcc917e --- /dev/null +++ b/apps/finance/src/api/statistics/index.ts @@ -0,0 +1,33 @@ +import { requestClient } from '#/api/request'; + +export const statisticsApi = { + /** + * 获取天医币报表列表 + */ + getReportTianyibi: (data: { month?: string; year: number }) => { + return requestClient.post('common/statistics/pointStatistics', data); + }, + + /** + * 获取实物报表列表 + */ + getPhysicalStatistics: (data: { month?: string; year: number }) => { + return requestClient.post('common/statistics/physicalStatistics', data); + }, + + /** + * 获取培训班报表列表 + */ + getTrainingClassStatistics: (data: { month?: string; year: number }) => { + return requestClient.post('common/statistics/trainingClassStatistics', data); + }, + + /** + * 下载天医币报表 + */ + downloadReportTianyibi: (data: { date: string }) => { + return requestClient.post('/common/import/getImportFile', data, { + responseType: 'blob', + }); + }, +}; diff --git a/apps/finance/src/router/routes/modules/statistics.ts b/apps/finance/src/router/routes/modules/statistics.ts new file mode 100644 index 0000000..a12a4f7 --- /dev/null +++ b/apps/finance/src/router/routes/modules/statistics.ts @@ -0,0 +1,45 @@ +import type { RouteRecordRaw } from 'vue-router'; + +const routes: RouteRecordRaw[] = [ + { + meta: { + icon: 'mdi:chart-areaspline', + keepAlive: true, + order: 1000, + title: '统计分析', + }, + name: 'Statistics', + path: '/statistics', + children: [ + { + meta: { + title: '天医币报表', + keepAlive: true, + }, + name: 'TianyibiReport', + path: '/statistics/tianyibi-report', + component: () => import('#/views/statistics/tianyibi/report.vue'), + }, + { + meta: { + title: '实物报表', + keepAlive: true, + }, + name: 'PhysicalReport', + path: '/statistics/physical-report', + component: () => import('#/views/statistics/physical/report.vue'), + }, + { + meta: { + title: '培训班报表', + keepAlive: true, + }, + name: 'TrainingClassReport', + path: '/statistics/training-class-report', + component: () => import('#/views/statistics/trainingClass/report.vue'), + }, + ], + }, +]; + +export default routes; diff --git a/apps/finance/src/views/statistics/physical/report.vue b/apps/finance/src/views/statistics/physical/report.vue new file mode 100644 index 0000000..479c658 --- /dev/null +++ b/apps/finance/src/views/statistics/physical/report.vue @@ -0,0 +1,125 @@ + + + + diff --git a/apps/finance/src/views/statistics/tianyibi/report.vue b/apps/finance/src/views/statistics/tianyibi/report.vue new file mode 100644 index 0000000..1c10d4b --- /dev/null +++ b/apps/finance/src/views/statistics/tianyibi/report.vue @@ -0,0 +1,149 @@ + + + + diff --git a/apps/finance/src/views/statistics/trainingClass/report.vue b/apps/finance/src/views/statistics/trainingClass/report.vue new file mode 100644 index 0000000..5ff7139 --- /dev/null +++ b/apps/finance/src/views/statistics/trainingClass/report.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/apps/finance/src/views/test.vue b/apps/finance/src/views/test.vue index b41f2a7..dcc585b 100644 --- a/apps/finance/src/views/test.vue +++ b/apps/finance/src/views/test.vue @@ -1,14 +1,7 @@ - -import { TabPane, Tabs } from 'ant-design-vue'; - -const activeKey = ref(1); - + + diff --git a/packages/@core/ui-kit/menu-ui/src/components/menu-item.vue b/packages/@core/ui-kit/menu-ui/src/components/menu-item.vue index 691c25c..c602b89 100644 --- a/packages/@core/ui-kit/menu-ui/src/components/menu-item.vue +++ b/packages/@core/ui-kit/menu-ui/src/components/menu-item.vue @@ -27,19 +27,12 @@ const subMenu = useSubMenuContext(); const { parentMenu, parentPaths } = useMenu(); const active = computed(() => props.path === rootMenu?.activePath); -const menuIcon = computed(() => - active.value ? props.activeIcon || props.icon : props.icon, -); +const menuIcon = computed(() => (active.value ? props.activeIcon || props.icon : props.icon)); -const isTopLevelMenuItem = computed( - () => parentMenu.value?.type.name === 'Menu', -); +const isTopLevelMenuItem = computed(() => parentMenu.value?.type.name === 'Menu'); const collapseShowTitle = computed( - () => - rootMenu.props?.collapseShowTitle && - isTopLevelMenuItem.value && - rootMenu.props.collapse, + () => rootMenu.props?.collapseShowTitle && isTopLevelMenuItem.value && rootMenu.props.collapse, ); const showTooltip = computed( @@ -92,11 +85,7 @@ onBeforeUnmount(() => { role="menuitem" @click.stop="handleClick" > - +