feat: 扩展账单导入(zip/美团/招行/交行)并新增批量删除与动态支付方式

- 账单导入支持 zip 压缩包,加密包自动检测并弹窗输入解压密码(引入 zip4j)
- 新增美团、招商银行、交通银行账单解析器及对应账单类型
- 支付方式列表改为后端动态获取,前端筛选与新增/编辑表单动态渲染
- 支付方式筛选从「更多筛选」移至常用筛选栏,移除「银行卡」选项
- 收支记录支持多选批量删除
- 补充相关三语文案并透传业务错误码
This commit is contained in:
2026-09-19 02:46:35 +08:00
parent c69e76ed4c
commit 9981e77bf1
18 changed files with 1558 additions and 55 deletions
+4 -1
View File
@@ -34,7 +34,10 @@ request.interceptors.response.use(
}
})
}
return Promise.reject(new Error(data.message || '请求失败'))
// 在 Error 上保留业务错误码,便于调用方按 code 做差异化处理
const bizError: any = new Error(data.message || '请求失败')
bizError.code = data.code
return Promise.reject(bizError)
}
return data
},
+17 -4
View File
@@ -3,6 +3,11 @@ import request from './request'
import axios from 'axios'
import { useUserStore } from '../store/user'
/** 获取系统支持的支付方式编码列表(含账单导入来源与人工支付方式) */
export function getPaymentMethods() {
return request.get('/transaction/payment-methods')
}
/** 分页获取交易记录列表,支持按类型、分类、支付方式、时间范围、计入统计、金额区间多选筛选 */
export function getTransactionPage(params: {
page?: number
@@ -57,6 +62,11 @@ export function deleteTransaction(id: number) {
return request.delete(`/transaction/${id}`)
}
/** 批量删除交易记录,返回实际删除数量 */
export function batchDeleteTransactions(ids: number[]) {
return request.delete('/transaction/batch', { data: { ids } })
}
/** 切换指定交易记录的"计入统计"标记 */
export function toggleTransactionStats(id: number, includeInStats: boolean) {
return request.put(`/transaction/${id}/stats`, { includeInStats })
@@ -67,8 +77,8 @@ export function toggleRemarkHidden(id: number, remarkHidden: boolean) {
return request.put(`/transaction/${id}/remark-hidden`, { remarkHidden })
}
/** 支持的账单类型,当前支持支付宝与微信 */
export type BillType = 'ALIPAY' | 'WECHAT'
/** 支持的账单类型,当前支持支付宝、微信、美团、招商银行与交通银行 */
export type BillType = 'ALIPAY' | 'WECHAT' | 'MEITUAN' | 'CMB' | 'BOCOM'
/** 账单解析结果行 */
export interface ParsedBillRow {
@@ -106,11 +116,14 @@ export interface BillImportItem {
rawData: string | null
}
/** 解析账单文件(不落库),返回预览数据 */
export function parseBill(file: File, billType: BillType) {
/** 解析账单文件(不落库),返回预览数据;支持 zip 压缩包,加密时需传解压密码 */
export function parseBill(file: File, billType: BillType, password?: string) {
const formData = new FormData()
formData.append('file', file)
formData.append('billType', billType)
if (password) {
formData.append('password', password)
}
return request.post('/transaction/import/parse', formData)
}