From 6ec846472d001a0920646c89ca4b5a1453947d09 Mon Sep 17 00:00:00 2001 From: xiayebo <364530740@qq.com> Date: Thu, 25 Dec 2025 17:18:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2025-12-25-add-bank-report/proposal.md | 18 + .../specs/bank-report/spec.md | 66 +++ .../2025-12-25-add-bank-report/tasks.md | 30 ++ openspec/specs/bank-report/spec.md | 70 +++ src/pages.json | 40 +- src/pages/me/me.vue | 5 - src/pagesBank/api/index.ts | 1 + src/pagesBank/api/report.ts | 22 + src/pagesBank/dashboard/index.vue | 1 + src/pagesBank/me/index.vue | 12 +- src/pagesBank/mock/index.ts | 1 + src/pagesBank/mock/report.ts | 119 +++++ src/pagesBank/report/download.vue | 461 ++++++++++++++++++ src/pagesBank/report/list.vue | 217 +++++++++ src/typings/bank.ts | 30 ++ 15 files changed, 1078 insertions(+), 15 deletions(-) create mode 100644 openspec/changes/archive/2025-12-25-add-bank-report/proposal.md create mode 100644 openspec/changes/archive/2025-12-25-add-bank-report/specs/bank-report/spec.md create mode 100644 openspec/changes/archive/2025-12-25-add-bank-report/tasks.md create mode 100644 openspec/specs/bank-report/spec.md create mode 100644 src/pagesBank/api/report.ts create mode 100644 src/pagesBank/mock/report.ts create mode 100644 src/pagesBank/report/download.vue create mode 100644 src/pagesBank/report/list.vue diff --git a/openspec/changes/archive/2025-12-25-add-bank-report/proposal.md b/openspec/changes/archive/2025-12-25-add-bank-report/proposal.md new file mode 100644 index 0000000..d8e80e7 --- /dev/null +++ b/openspec/changes/archive/2025-12-25-add-bank-report/proposal.md @@ -0,0 +1,18 @@ +# Change: Add Bank Report Download Feature + +## Why +银行端需要报表统计与下载功能,以便银行工作人员能够按不同维度(支行、网点、部门、人员、客户等)查看和导出业务数据,支持按日、月、季或自定义时间范围筛选,提升数据分析和决策效率。 + +## What Changes +- 新增报表列表页面,展示四大类报表(多维统计、访客报表、营销报表、权益管理) +- 新增报表下载页面,支持日期维度筛选和 Excel 文件下载 +- 添加报表相关的 mock 数据和 API 接口 +- 在银行端仪表盘添加报表功能入口 + +## Impact +- Affected specs: 新增 `bank-report` capability +- Affected code: + - 新增 `src/pagesBank/report/` 目录及相关页面 + - 新增 `src/pagesBank/api/report.ts` API 接口 + - 新增 `src/pagesBank/mock/report.ts` mock 数据 + - 修改 `src/pagesBank/dashboard/index.vue` 添加报表入口 \ No newline at end of file diff --git a/openspec/changes/archive/2025-12-25-add-bank-report/specs/bank-report/spec.md b/openspec/changes/archive/2025-12-25-add-bank-report/specs/bank-report/spec.md new file mode 100644 index 0000000..b009852 --- /dev/null +++ b/openspec/changes/archive/2025-12-25-add-bank-report/specs/bank-report/spec.md @@ -0,0 +1,66 @@ +## ADDED Requirements + +### Requirement: Report List Display +系统 SHALL 在银行端提供报表列表页面,展示所有可供下载的报表清单,分为四个主要板块:多维统计、访客报表、营销报表、权益管理。 + +#### Scenario: User views report list +- **WHEN** 用户访问报表列表页面 +- **THEN** 系统显示四个报表分类板块 +- **AND** 每个板块包含对应的报表条目 +- **AND** 所有报表条目均可点击 + +#### Scenario: Report categories display correctly +- **WHEN** 报表列表页面加载完成 +- **THEN** 多维统计板块显示:按支行统计、按网点统计、按部门统计、按人员统计、按客户统计 +- **AND** 访客报表板块显示:支行访客报表、网点访客报表、人员访客报表 +- **AND** 营销报表板块显示:小额贷业绩报表、小额贷营销汇总、消费贷营销报表、三农部支行汇总、三农部营销报表、公司部营销汇总表 +- **AND** 权益管理板块显示:我赠送的记录、全员赠送记录、权益二维码 + +### Requirement: Report Navigation +系统 SHALL 支持用户从报表列表页面点击任意报表条目跳转至报表下载页面,并传递报表类型标识。 + +#### Scenario: User clicks report item +- **WHEN** 用户点击报表列表中的任意报表条目 +- **THEN** 系统跳转至报表下载页面 +- **AND** 传递所选报表的类型标识(ID 或名称)至下载页面 + +### Requirement: Report Download Page +系统 SHALL 提供报表下载页面,支持日期维度筛选和 Excel 文件下载。 + +#### Scenario: Download page displays with default date +- **WHEN** 用户进入报表下载页面 +- **THEN** 页面顶部显示日期维度筛选区(按日、按月、按季、自定义) +- **AND** 默认选中"按日"选项 +- **AND** 显示当前系统日期(默认为 2025-12-25) +- **AND** 显示"EXCEL"格式标识 +- **AND** 显示"点击下载"按钮 +- **AND** 页面底部显示使用帮助说明 + +#### Scenario: User changes date dimension +- **WHEN** 用户切换日期维度选项(按日/按月/按季/自定义) +- **THEN** 系统更新日期显示格式 +- **AND** 用户可根据选定的维度修改日期 + +#### Scenario: User downloads report +- **WHEN** 用户选择日期并点击"点击下载"按钮 +- **THEN** 系统发起下载请求 +- **AND** 模拟文件生成过程 +- **AND** 显示下载成功提示 +- **AND** 提示用户可以点击手机右上角的【...】进行转发或保存文件 + +### Requirement: Report Data Mock +系统 SHALL 使用 mock 数据模拟报表下载功能,无需真实后端接口。 + +#### Scenario: Mock data generation +- **WHEN** 用户请求下载报表 +- **THEN** 系统使用 mock 数据模拟文件生成 +- **AND** 模拟下载延迟(约 500ms) +- **AND** 返回下载成功状态 + +### Requirement: Report Entry in Dashboard +系统 SHALL 在银行端仪表盘添加报表功能入口。 + +#### Scenario: Dashboard displays report entry +- **WHEN** 用户访问银行端仪表盘 +- **THEN** 快捷操作区域显示"报表下载"入口 +- **AND** 点击入口跳转至报表列表页面 \ No newline at end of file diff --git a/openspec/changes/archive/2025-12-25-add-bank-report/tasks.md b/openspec/changes/archive/2025-12-25-add-bank-report/tasks.md new file mode 100644 index 0000000..5a0ea14 --- /dev/null +++ b/openspec/changes/archive/2025-12-25-add-bank-report/tasks.md @@ -0,0 +1,30 @@ +## 1. 数据层实现 +- [ ] 1.1 创建报表类型定义(`src/typings/bank.ts` 添加 ReportType、ReportCategory 等类型) +- [ ] 1.2 创建报表 mock 数据(`src/pagesBank/mock/report.ts`) +- [ ] 1.3 创建报表 API 接口(`src/pagesBank/api/report.ts`) + +## 2. 报表列表页面 +- [ ] 2.1 创建报表列表页面(`src/pagesBank/report/list.vue`) +- [ ] 2.2 实现报表分类展示(多维统计、访客报表、营销报表、权益管理) +- [ ] 2.3 实现报表条目点击跳转逻辑 + +## 3. 报表下载页面 +- [ ] 3.1 创建报表下载页面(`src/pagesBank/report/download.vue`) +- [ ] 3.2 实现日期维度筛选组件(按日、按月、按季、自定义) +- [ ] 3.3 实现日期选择器(使用 wot-design-uni 组件) +- [ ] 3.4 实现下载按钮和下载逻辑 +- [ ] 3.5 添加使用帮助说明文案 + +## 4. 仪表盘集成 +- [ ] 4.1 修改银行端仪表盘(`src/pagesBank/dashboard/index.vue`) +- [ ] 4.2 在快捷操作区域添加"报表下载"入口 + +## 5. 类型定义更新 +- [ ] 5.1 更新 `src/typings/bank.ts` 添加报表相关类型 + +## 6. 验证与测试 +- [ ] 6.1 验证报表列表页面正常显示 +- [ ] 6.2 验证报表跳转逻辑正确 +- [ ] 6.3 验证日期筛选功能正常 +- [ ] 6.4 验证下载功能模拟成功 +- [ ] 6.5 验证仪表盘入口正常跳转 \ No newline at end of file diff --git a/openspec/specs/bank-report/spec.md b/openspec/specs/bank-report/spec.md new file mode 100644 index 0000000..2763a0e --- /dev/null +++ b/openspec/specs/bank-report/spec.md @@ -0,0 +1,70 @@ +# bank-report Specification + +## Purpose +TBD - created by archiving change add-bank-report. Update Purpose after archive. +## Requirements +### Requirement: Report List Display +系统 SHALL 在银行端提供报表列表页面,展示所有可供下载的报表清单,分为四个主要板块:多维统计、访客报表、营销报表、权益管理。 + +#### Scenario: User views report list +- **WHEN** 用户访问报表列表页面 +- **THEN** 系统显示四个报表分类板块 +- **AND** 每个板块包含对应的报表条目 +- **AND** 所有报表条目均可点击 + +#### Scenario: Report categories display correctly +- **WHEN** 报表列表页面加载完成 +- **THEN** 多维统计板块显示:按支行统计、按网点统计、按部门统计、按人员统计、按客户统计 +- **AND** 访客报表板块显示:支行访客报表、网点访客报表、人员访客报表 +- **AND** 营销报表板块显示:小额贷业绩报表、小额贷营销汇总、消费贷营销报表、三农部支行汇总、三农部营销报表、公司部营销汇总表 +- **AND** 权益管理板块显示:我赠送的记录、全员赠送记录、权益二维码 + +### Requirement: Report Navigation +系统 SHALL 支持用户从报表列表页面点击任意报表条目跳转至报表下载页面,并传递报表类型标识。 + +#### Scenario: User clicks report item +- **WHEN** 用户点击报表列表中的任意报表条目 +- **THEN** 系统跳转至报表下载页面 +- **AND** 传递所选报表的类型标识(ID 或名称)至下载页面 + +### Requirement: Report Download Page +系统 SHALL 提供报表下载页面,支持日期维度筛选和 Excel 文件下载。 + +#### Scenario: Download page displays with default date +- **WHEN** 用户进入报表下载页面 +- **THEN** 页面顶部显示日期维度筛选区(按日、按月、按季、自定义) +- **AND** 默认选中"按日"选项 +- **AND** 显示当前系统日期(默认为 2025-12-25) +- **AND** 显示"EXCEL"格式标识 +- **AND** 显示"点击下载"按钮 +- **AND** 页面底部显示使用帮助说明 + +#### Scenario: User changes date dimension +- **WHEN** 用户切换日期维度选项(按日/按月/按季/自定义) +- **THEN** 系统更新日期显示格式 +- **AND** 用户可根据选定的维度修改日期 + +#### Scenario: User downloads report +- **WHEN** 用户选择日期并点击"点击下载"按钮 +- **THEN** 系统发起下载请求 +- **AND** 模拟文件生成过程 +- **AND** 显示下载成功提示 +- **AND** 提示用户可以点击手机右上角的【...】进行转发或保存文件 + +### Requirement: Report Data Mock +系统 SHALL 使用 mock 数据模拟报表下载功能,无需真实后端接口。 + +#### Scenario: Mock data generation +- **WHEN** 用户请求下载报表 +- **THEN** 系统使用 mock 数据模拟文件生成 +- **AND** 模拟下载延迟(约 500ms) +- **AND** 返回下载成功状态 + +### Requirement: Report Entry in Dashboard +系统 SHALL 在银行端仪表盘添加报表功能入口。 + +#### Scenario: Dashboard displays report entry +- **WHEN** 用户访问银行端仪表盘 +- **THEN** 快捷操作区域显示"报表下载"入口 +- **AND** 点击入口跳转至报表列表页面 + diff --git a/src/pages.json b/src/pages.json index 33192d7..5fdd2b3 100644 --- a/src/pages.json +++ b/src/pages.json @@ -252,6 +252,36 @@ "navigationBarTitleText": "客户详情" } }, + { + "path": "customer/transaction-list", + "style": { + "navigationBarTitleText": "交易记录" + } + }, + { + "path": "customer/withdraw-list", + "style": { + "navigationBarTitleText": "提现记录" + } + }, + { + "path": "me/index", + "style": { + "navigationBarTitleText": "银行中心" + } + }, + { + "path": "report/list", + "style": { + "navigationBarTitleText": "报表列表" + } + }, + { + "path": "report/download", + "style": { + "navigationBarTitleText": "报表下载" + } + }, { "path": "visit/list", "style": { @@ -261,19 +291,13 @@ { "path": "visit/create", "style": { - "navigationBarTitleText": "创建拜访计划" + "navigationBarTitleText": "创建拜访" } }, { "path": "visit/detail", "style": { - "navigationBarTitleText": "拜访计划详情" - } - }, - { - "path": "me/index", - "style": { - "navigationBarTitleText": "银行中心" + "navigationBarTitleText": "拜访详情" } } ] diff --git a/src/pages/me/me.vue b/src/pages/me/me.vue index 4d519e7..5efcc55 100644 --- a/src/pages/me/me.vue +++ b/src/pages/me/me.vue @@ -205,11 +205,6 @@ function handleLogout() { - - - 我要借钱 - - 助贷申请进度 diff --git a/src/pagesBank/api/index.ts b/src/pagesBank/api/index.ts index 6d239f4..e0dea1d 100644 --- a/src/pagesBank/api/index.ts +++ b/src/pagesBank/api/index.ts @@ -17,6 +17,7 @@ import { mockVisitPlans, mockMarketingProducts } from '../mock' +export { getReportList, downloadReport } from './report' /** 获取银行端首页统计 */ export function getBankStats(): Promise { diff --git a/src/pagesBank/api/report.ts b/src/pagesBank/api/report.ts new file mode 100644 index 0000000..df70c8d --- /dev/null +++ b/src/pagesBank/api/report.ts @@ -0,0 +1,22 @@ +import type { ReportType, ReportDownloadParams } from '@/typings/bank' +import { mockReportList } from '../mock' + +/** 获取报表列表 */ +export function getReportList(): Promise { + return new Promise((resolve) => { + setTimeout(() => { + resolve(mockReportList) + }, 300) + }) +} + +/** 下载报表 */ +export function downloadReport(params: ReportDownloadParams): Promise { + return new Promise((resolve) => { + setTimeout(() => { + // 模拟文件生成和下载过程 + console.log('下载报表:', params) + resolve(true) + }, 500) + }) +} \ No newline at end of file diff --git a/src/pagesBank/dashboard/index.vue b/src/pagesBank/dashboard/index.vue index 7caf951..984103b 100644 --- a/src/pagesBank/dashboard/index.vue +++ b/src/pagesBank/dashboard/index.vue @@ -17,6 +17,7 @@ const quickActions = [ { icon: 'i-carbon-group', label: '客户管理', path: '/pagesBank/customer/list' }, { icon: 'i-carbon-calendar', label: '拜访计划', path: '/pagesBank/visit/list' }, { icon: 'i-carbon-add', label: '创建拜访', path: '/pagesBank/visit/create' }, + { icon: 'i-carbon-document-download', label: '报表', path: '/pagesBank/report/list' }, { icon: 'i-carbon-settings', label: '设置', path: '/pagesBank/me/index' }, ] diff --git a/src/pagesBank/me/index.vue b/src/pagesBank/me/index.vue index ae7bc61..29ba5eb 100644 --- a/src/pagesBank/me/index.vue +++ b/src/pagesBank/me/index.vue @@ -12,12 +12,20 @@ const userStore = useUserStore() const config = CLIENT_TYPE_CONFIG[ClientType.BANK] const menuList = [ - { icon: 'i-carbon-report', label: '数据报表' }, + { icon: 'i-carbon-report', label: '数据报表', path: '/pagesBank/report/list' }, { icon: 'i-carbon-settings', label: '系统设置' }, { icon: 'i-carbon-help', label: '帮助中心' }, { icon: 'i-carbon-information', label: '关于我们' }, ] +function handleMenuClick(item: { label: string; path?: string }) { + if (item.path) { + uni.navigateTo({ url: item.path }) + } else { + uni.showToast({ title: '功能开发中', icon: 'none' }) + } +} + function handleLogout() { uni.showModal({ title: '提示', @@ -48,7 +56,7 @@ function handleLogout() { - + {{ item.label }} diff --git a/src/pagesBank/mock/index.ts b/src/pagesBank/mock/index.ts index 544743c..b40eb6c 100644 --- a/src/pagesBank/mock/index.ts +++ b/src/pagesBank/mock/index.ts @@ -7,6 +7,7 @@ import type { MarketingProduct } from '@/typings/bank' import { AuditStatus, AuditType, VisitStatus } from '@/typings/bank' +export { mockReportList, reportCategoryInfo } from './report' // 统计数据 Mock export const mockBankStats: BankStats = { diff --git a/src/pagesBank/mock/report.ts b/src/pagesBank/mock/report.ts new file mode 100644 index 0000000..275e945 --- /dev/null +++ b/src/pagesBank/mock/report.ts @@ -0,0 +1,119 @@ +import type { ReportType } from '@/typings/bank' +import { ReportCategory } from '@/typings/bank' + +/** 报表列表 Mock 数据 */ +export const mockReportList: ReportType[] = [ + // 多维统计 + { + id: 'R001', + name: '按支行统计', + category: ReportCategory.MULTI_DIMENSION + }, + { + id: 'R002', + name: '按网点统计', + category: ReportCategory.MULTI_DIMENSION + }, + { + id: 'R003', + name: '按部门统计', + category: ReportCategory.MULTI_DIMENSION + }, + { + id: 'R004', + name: '按人员统计', + category: ReportCategory.MULTI_DIMENSION + }, + { + id: 'R005', + name: '按客户统计', + category: ReportCategory.MULTI_DIMENSION + }, + // 访客报表 + { + id: 'R006', + name: '支行访客报表', + category: ReportCategory.VISITOR + }, + { + id: 'R007', + name: '网点访客报表', + category: ReportCategory.VISITOR + }, + { + id: 'R008', + name: '人员访客报表', + category: ReportCategory.VISITOR + }, + // 营销报表 + { + id: 'R009', + name: '小额贷业绩报表', + category: ReportCategory.MARKETING + }, + { + id: 'R010', + name: '小额贷营销汇总', + category: ReportCategory.MARKETING + }, + { + id: 'R011', + name: '消费贷营销报表', + category: ReportCategory.MARKETING + }, + { + id: 'R012', + name: '三农部支行汇总', + category: ReportCategory.MARKETING + }, + { + id: 'R013', + name: '三农部营销报表', + category: ReportCategory.MARKETING + }, + { + id: 'R014', + name: '公司部营销汇总表', + category: ReportCategory.MARKETING + }, + // 权益管理 + { + id: 'R015', + name: '我赠送的记录', + category: ReportCategory.BENEFIT + }, + { + id: 'R016', + name: '全员赠送记录', + category: ReportCategory.BENEFIT + }, + { + id: 'R017', + name: '权益二维码', + category: ReportCategory.BENEFIT + } +] + +/** 报表分类信息 */ +export const reportCategoryInfo = { + [ReportCategory.MULTI_DIMENSION]: { + name: '多维统计', + icon: 'i-carbon-chart-cluster-bar', + color: '#00c05a' + }, + [ReportCategory.VISITOR]: { + name: '访客报表', + icon: 'i-carbon-user-multiple', + color: '#4d80f0' + }, + [ReportCategory.MARKETING]: { + name: '营销报表', + icon: 'i-carbon-ibm-watson-natural-language-understanding', + color: '#ff8f0d' + }, + [ReportCategory.BENEFIT]: { + name: '权益管理', + icon: 'i-carbon-gift', + color: '#fa4350' + } +} \ No newline at end of file diff --git a/src/pagesBank/report/download.vue b/src/pagesBank/report/download.vue new file mode 100644 index 0000000..9d8171a --- /dev/null +++ b/src/pagesBank/report/download.vue @@ -0,0 +1,461 @@ + + + + + \ No newline at end of file diff --git a/src/pagesBank/report/list.vue b/src/pagesBank/report/list.vue new file mode 100644 index 0000000..78636ba --- /dev/null +++ b/src/pagesBank/report/list.vue @@ -0,0 +1,217 @@ + + + + + \ No newline at end of file diff --git a/src/typings/bank.ts b/src/typings/bank.ts index 10fdb57..a15a595 100644 --- a/src/typings/bank.ts +++ b/src/typings/bank.ts @@ -100,6 +100,36 @@ export interface CompleteVisitPlanParams { photos: string[] } +/** 报表分类 */ +export enum ReportCategory { + MULTI_DIMENSION = 'multi_dimension', // 多维统计 + VISITOR = 'visitor', // 访客报表 + MARKETING = 'marketing', // 营销报表 + BENEFIT = 'benefit', // 权益管理 +} + +/** 日期维度 */ +export enum DateDimension { + DAY = 'day', // 按日 + MONTH = 'month', // 按月 + QUARTER = 'quarter', // 按季 + CUSTOM = 'custom', // 自定义 +} + +/** 报表类型 */ +export interface ReportType { + id: string + name: string + category: ReportCategory +} + +/** 报表下载参数 */ +export interface ReportDownloadParams { + reportId: string + dimension: DateDimension + date: string +} + /** 银行统计指标 */ export interface BankStats { pendingAuditStore: number // 待审核商户