feat: AI 图片记账、自定义交易渠道与淘宝/京东账单导入
- AI 图片记账:多图上传由视觉模型识别,SSE 实时推送进度,提取 rawData,按「类型+金额+时间」检测重复,支持缩略图与来源图片查看 - 自定义交易渠道:新增 t_channel 与渠道管理页,支持新建/改名/删除,并接入统计、导出与 AI 查询/记账/建议提示词 - AI 建议:单条建议新增交易渠道推荐(推荐已有渠道 / AI 新建渠道) - 账单导入:新增淘宝(xlsx)、京东(CSV)解析器 - 交易:新增批量创建接口,导入时按去重键兜底跳过重复 - 运行目录统一经 AppHome 解析,图片与数据文件落盘规范化 - 前端:AI 记账方式偏好记忆、AI 按钮与输入框对齐、来源图片弹窗支持加载原图
This commit is contained in:
@@ -39,6 +39,8 @@ export default {
|
||||
cash: { zh: '现金', en: 'Cash', ja: '現金' },
|
||||
bank: { zh: '银行卡', en: 'Bank Card', ja: '銀行カード' },
|
||||
meituan: { zh: '美团', en: 'Meituan', ja: 'Meituan' },
|
||||
taobao: { zh: '淘宝', en: 'Taobao', ja: 'Taobao' },
|
||||
jd: { zh: '京东', en: 'JD', ja: 'JD' },
|
||||
cmb: { zh: '招商银行', en: 'China Merchants Bank', ja: '招商銀行' },
|
||||
bocom: { zh: '交通银行', en: 'Bank of Communications', ja: '交通銀行' },
|
||||
},
|
||||
@@ -404,6 +406,10 @@ export default {
|
||||
remarkUnhide: { zh: '取消隐藏', en: 'Unhide', ja: '非表示を解除' },
|
||||
rawData: { zh: '原始数据', en: 'Raw Data', ja: '元データ' },
|
||||
rawDataTitle: { zh: '原始账单数据', en: 'Raw Bill Data', ja: '元の明細データ' },
|
||||
sourceImages: { zh: '来源图片', en: 'Source Images', ja: '元の画像' },
|
||||
viewImages: { zh: '查看({count})', en: 'View ({count})', ja: '表示({count})' },
|
||||
loadOriginal: { zh: '加载原图', en: 'Load Original', ja: '元画像を読み込む' },
|
||||
originalImage: { zh: '原图', en: 'Original', ja: '元画像' },
|
||||
createdTime: { zh: '创建时间:{time}', en: 'Created: {time}', ja: '作成日時:{time}' },
|
||||
editRecord: { zh: '编辑记录', en: 'Edit Record', ja: '記録を編集' },
|
||||
addRecordTitle: { zh: '新增记录', en: 'Add Record', ja: '記録を追加' },
|
||||
@@ -492,6 +498,23 @@ export default {
|
||||
deleteConfirm: { zh: '删除后将从所有交易记录中移除该标签,确定删除吗?', en: 'This tag will be removed from all transactions. Delete it?', ja: '削除するとすべての取引記録からこのタグが外れます。削除してもよろしいですか?' },
|
||||
},
|
||||
|
||||
// 交易渠道管理(用户自定义)
|
||||
channel: {
|
||||
title: { zh: '交易渠道管理', en: 'Channel Management', ja: '取引チャネル管理' },
|
||||
add: { zh: '新建渠道', en: 'New Channel', ja: 'チャネルを追加' },
|
||||
addTitle: { zh: '新建渠道', en: 'New Channel', ja: 'チャネルを追加' },
|
||||
editTitle: { zh: '重命名渠道', en: 'Rename Channel', ja: 'チャネル名を変更' },
|
||||
name: { zh: '渠道名称', en: 'Channel name', ja: 'チャネル名' },
|
||||
namePlaceholder: { zh: '请输入渠道名称', en: 'Enter channel name', ja: 'チャネル名を入力してください' },
|
||||
nameRequired: { zh: '请输入渠道名称', en: 'Please enter a channel name', ja: 'チャネル名を入力してください' },
|
||||
usage: { zh: '使用账单数', en: 'Used by', ja: '使用件数' },
|
||||
usageCount: { zh: '{count} 笔账单', en: '{count} record(s)', ja: '{count} 件' },
|
||||
unused: { zh: '未使用', en: 'Unused', ja: '未使用' },
|
||||
deleteConfirm: { zh: '确定删除渠道「{name}」吗?', en: 'Delete channel "{name}"?', ja: 'チャネル「{name}」を削除しますか?' },
|
||||
hint: { zh: '自定义渠道可用于记账与筛选;删除前需确保没有任何账单使用该渠道,改名不影响历史账单。', en: 'Custom channels can be used in entries and filters. A channel can only be deleted when no transaction uses it; renaming does not affect existing records.', ja: 'カスタムチャネルは記帳や絞り込みに利用できます。取引で使用中のチャネルは削除できません。名前の変更は既存の記録に影響しません。' },
|
||||
manageEntry: { zh: '渠道管理', en: 'Channels', ja: 'チャネル管理' },
|
||||
},
|
||||
|
||||
// 规则管理
|
||||
rule: {
|
||||
title: { zh: '规则管理', en: 'Rules', ja: 'ルール管理' },
|
||||
@@ -532,6 +555,8 @@ export default {
|
||||
billTypeALIPAY: { zh: '支付宝', en: 'Alipay', ja: 'Alipay' },
|
||||
billTypeWECHAT: { zh: '微信', en: 'WeChat', ja: 'WeChat' },
|
||||
billTypeMEITUAN: { zh: '美团', en: 'Meituan', ja: 'Meituan' },
|
||||
billTypeTAOBAO: { zh: '淘宝', en: 'Taobao', ja: 'Taobao' },
|
||||
billTypeJD: { zh: '京东', en: 'JD', ja: 'JD' },
|
||||
billTypeCMB: { zh: '招商银行', en: 'China Merchants Bank', ja: '招商銀行' },
|
||||
billTypeBOCOM: { zh: '交通银行', en: 'Bank of Communications', ja: '交通銀行' },
|
||||
billFile: { zh: '账单文件:', en: 'Bill file:', ja: '明細ファイル:' },
|
||||
@@ -541,6 +566,8 @@ export default {
|
||||
exportHintALIPAY: { zh: '导出路径:支付宝 App → 我的 → 账单 → 开具交易流水证明 / 账单导出,选择 CSV 格式。', en: 'Export path: Alipay App → Me → Bills → Issue Transaction Record / Export Bill, choose CSV format.', ja: 'エクスポート手順:Alipay アプリ → マイ → 請求 → 取引履歴証明の発行 / 明細のエクスポート で CSV 形式を選択。' },
|
||||
exportHintWECHAT: { zh: '导出路径:微信 App → 我 → 服务 → 钱包 → 账单 → 常见问题 → 下载账单 → 用于个人对账,选择 xlsx 格式。', en: 'Export path: WeChat App → Me → Services → Wallet → Bills → FAQ → Download Bills → For personal reconciliation, choose xlsx format.', ja: 'エクスポート手順:WeChat アプリ → 自分 → サービス → ウォレット → 請求 → よくある質問 → 請求書のダウンロード → 個人の照合用 で xlsx 形式を選択。' },
|
||||
exportHintMEITUAN: { zh: '导出路径:美团 App → 我的 → 钱包 → 账单 → 开具账单证明(申请记录),选择 CSV 格式并设置解压密码。', en: 'Export path: Meituan App → Me → Wallet → Bills → Issue Bill Certificate (Application Record), choose CSV format and set an archive password.', ja: 'エクスポート手順:Meituan アプリ → マイ → ウォレット → 請求 → 請求証明の発行(申請履歴)で CSV 形式を選択し、解凍パスワードを設定。' },
|
||||
exportHintTAOBAO: { zh: '导出路径:淘宝网页版 → 我的淘宝 → 我的订单 → 已买到的宝贝 → 导出订单,下载 xlsx。', en: 'Export path: Taobao web → My Taobao → My Orders → Purchased Items → Export Orders, download as xlsx.', ja: 'エクスポート手順:Taobao ウェブ版 → マイ淘宝 → マイ注文 → 購入済み商品 → 注文をエクスポート で xlsx をダウンロード。' },
|
||||
exportHintJD: { zh: '导出路径:京东 App → 我的 → 设置 → 账单 → 右上角「…」→ 账单导出,设置接收邮箱后提交,从邮件下载 CSV(解压密码见邮件说明)。', en: 'Export path: JD App → Me → Settings → Bills → top-right "…" → Bill Export, set a receiving email and submit, then download the CSV from the email (archive password is in the email).', ja: 'エクスポート手順:JD アプリ → マイ → 設定 → 請求 → 右上の「…」→ 請求エクスポート で受信メールを設定して送信し、メールから CSV をダウンロード(解凍パスワードはメールに記載)。' },
|
||||
exportHintCMB: { zh: '导出路径:招商银行 App → 我的 → 全部 → 交易流水,支持 CSV 或 PDF 格式导出(如需压缩包请设置解压密码)。', en: 'Export path: China Merchants Bank App → Me → All → Transaction Records; CSV or PDF is supported (set an archive password if zipped).', ja: 'エクスポート手順:招商銀行アプリ → マイ → すべて → 取引明細。CSV または PDF 形式に対応(圧縮する場合は解凍パスワードを設定)。' },
|
||||
exportHintBOCOM: { zh: '导出路径:交通银行 App → 我的 → 银行卡 → 交易明细,选择查询时间段后导出 Excel(xls)。', en: 'Export path: Bank of Communications App → Me → Bank Cards → Transaction Details, choose a date range and export Excel (xls).', ja: 'エクスポート手順:交通銀行アプリ → マイ → 銀行カード → 取引明細 で期間を選択し Excel(xls)でエクスポート。' },
|
||||
parse: { zh: '解析', en: 'Parse', ja: '解析' },
|
||||
@@ -608,6 +635,7 @@ export default {
|
||||
apiKeyKeep: { zh: '已配置,留空表示不修改', en: 'Configured; leave blank to keep unchanged', ja: '設定済み。空欄のままにすると変更されません' },
|
||||
baseUrl: { zh: '接口地址', en: 'Base URL', ja: 'エンドポイント' },
|
||||
model: { zh: '模型', en: 'Model', ja: 'モデル' },
|
||||
visionModel: { zh: '视觉模型', en: 'Vision model', ja: 'ビジョンモデル' },
|
||||
save: { zh: '保存', en: 'Save', ja: '保存' },
|
||||
test: { zh: '测试连接', en: 'Test connection', ja: '接続テスト' },
|
||||
saveSuccess: { zh: '保存成功', en: 'Saved successfully', ja: '保存しました' },
|
||||
@@ -631,6 +659,8 @@ export default {
|
||||
aggregated: { zh: '已聚合为 {groups} 类、共 {count} 条记录', en: 'Aggregated into {groups} groups, {count} records in total', ja: '{groups} グループ、合計 {count} 件の記録に集約しました' },
|
||||
applySuccess: { zh: '已应用 {count} 条建议', en: 'Applied {count} suggestions', ja: '{count} 件の提案を適用しました' },
|
||||
oneApplied: { zh: '已应用 AI 推荐分类', en: 'AI category applied', ja: 'AI が提案したカテゴリを適用しました' },
|
||||
channelApplied: { zh: '已应用 AI 推荐渠道', en: 'AI channel applied', ja: 'AI が提案したチャネルを適用しました' },
|
||||
noChannelSuggestion: { zh: '未找到合适的渠道建议', en: 'No channel suggestion', ja: '適切なチャネル提案が見つかりません' },
|
||||
tagApplied: { zh: '已应用 AI 推荐标签', en: 'AI tags applied', ja: 'AI が提案したタグを適用しました' },
|
||||
applyFailed: { zh: '应用建议失败', en: 'Failed to apply suggestions', ja: '提案の適用に失敗しました' },
|
||||
applyHint: { zh: '将覆盖分类并追加标签;标记「新建」的分类/标签会在确认后创建', en: 'Categories will be overwritten and tags appended; items marked "New" will be created after confirmation.', ja: 'カテゴリは上書き、タグは追加されます。「新規」の項目は確定後に作成されます。' },
|
||||
@@ -682,6 +712,15 @@ export default {
|
||||
exists: { zh: '已存在同名分类,已为你选中', en: 'A same-name category exists and has been selected', ja: '同名のカテゴリが存在するため選択しました' },
|
||||
needInfo: { zh: '请先填写备注或金额,便于生成分类', en: 'Please fill in a remark or amount first', ja: 'カテゴリ生成のため、先に備考または金額を入力してください' },
|
||||
},
|
||||
newChannel: {
|
||||
button: { zh: 'AI 新建', en: 'AI New', ja: 'AI で新規作成' },
|
||||
hint: { zh: 'AI 建议新渠道:', en: 'AI suggests:', ja: 'AI の提案する新チャネル:' },
|
||||
save: { zh: '保存并选用', en: 'Save & Select', ja: '保存して選択' },
|
||||
saved: { zh: '已创建并选用新渠道', en: 'Channel created and selected', ja: '新しいチャネルを作成して選択しました' },
|
||||
exists: { zh: '已存在同名渠道,已为你选中', en: 'A same-name channel exists and has been selected', ja: '同名のチャネルが存在するため選択しました' },
|
||||
needInfo: { zh: '请先填写备注或金额,便于生成渠道', en: 'Please fill in a remark or amount first', ja: 'チャネル生成のため、先に備考または金額を入力してください' },
|
||||
failed: { zh: 'AI 未能生成渠道,请重试', en: 'AI failed to generate a channel', ja: 'AI がチャネルを生成できませんでした' },
|
||||
},
|
||||
newTag: {
|
||||
button: { zh: 'AI 新建', en: 'AI New', ja: 'AI で新規作成' },
|
||||
hint: { zh: 'AI 建议新标签:', en: 'AI suggests tag:', ja: 'AI の提案する新タグ:' },
|
||||
@@ -725,6 +764,40 @@ export default {
|
||||
parse: { zh: '解析', en: 'Parse', ja: '解析' },
|
||||
emptyInput: { zh: '请输入记账内容', en: 'Please enter the transaction description', ja: '記帳内容を入力してください' },
|
||||
failed: { zh: 'AI 记账解析失败', en: 'Failed to parse the transaction', ja: 'AI 記帳の解析に失敗しました' },
|
||||
textTab: { zh: '文字记账', en: 'Text Entry', ja: 'テキスト入力' },
|
||||
imageTab: { zh: '图片记账', en: 'Image Entry', ja: '画像入力' },
|
||||
imageHint: { zh: '上传一至多张账单或支付截图(最多 5 张),AI 会一次性识别其中的每一笔交易,确认后导入。', en: 'Upload one to several bill or payment screenshots (up to 5); AI recognizes every transaction in one pass for you to confirm and import.', ja: '請求書や支払いのスクリーンショットを1〜複数枚(最大5枚)アップロードすると、AI が各取引をまとめて認識します。確認して取り込んでください。' },
|
||||
upload: { zh: '上传图片(可多选)', en: 'Upload images (multiple)', ja: '画像をアップロード(複数可)' },
|
||||
uploadTip: { zh: '支持 JPEG/PNG/GIF/WebP,单张不超过 10MB,最多 5 张', en: 'JPEG/PNG/GIF/WebP, up to 10MB each, max 5 images', ja: 'JPEG/PNG/GIF/WebP、1枚10MBまで、最大5枚' },
|
||||
pasteHint: { zh: '也可直接按 Ctrl+V(Mac 为 ⌘V)粘贴剪贴板中的图片', en: 'You can also press Ctrl+V (⌘V on Mac) to paste an image from the clipboard', ja: 'Ctrl+V(Mac は ⌘V)でクリップボードの画像を貼り付けることもできます' },
|
||||
pasteSuccess: { zh: '已粘贴剪贴板中的图片', en: 'Pasted the image from clipboard', ja: 'クリップボードの画像を貼り付けました' },
|
||||
parseImage: { zh: '识别图片', en: 'Recognize', ja: '画像を解析' },
|
||||
recognizing: { zh: '正在识别图片,请稍候…', en: 'Recognizing, please wait…', ja: '画像を解析中です。しばらくお待ちください…' },
|
||||
progressTitle: { zh: '识别进度', en: 'Progress', ja: '進捗' },
|
||||
imageFailed: { zh: 'AI 图片记账解析失败', en: 'Failed to parse the image', ja: 'AI 画像記帳の解析に失敗しました' },
|
||||
noRecord: { zh: '未从图片中识别到有效交易', en: 'No valid transactions recognized from the image', ja: '画像から有効な取引を認識できませんでした' },
|
||||
resultTitle: { zh: '图片记账结果', en: 'Image Entry Result', ja: '画像記帳の結果' },
|
||||
resultHint: { zh: '请核对识别结果,勾选后导入;可直接编辑类型、金额、分类与备注。', en: 'Review the results, edit type/amount/category/remark, then import the selected ones.', ja: '認識結果を確認し、種別・金額・カテゴリ・備考を編集して、選択した項目を取り込んでください。' },
|
||||
importSelected: { zh: '导入勾选({count})', en: 'Import selected ({count})', ja: '選択項目を取り込む({count})' },
|
||||
importSuccess: { zh: '已导入 {count} 条记录', en: 'Imported {count} record(s)', ja: '{count} 件を取り込みました' },
|
||||
importFailed: { zh: '导入失败', en: 'Import failed', ja: '取り込みに失敗しました' },
|
||||
selectAtLeastOne: { zh: '请至少勾选一条记录', en: 'Please select at least one record', ja: '少なくとも1件の記録を選択してください' },
|
||||
viewImage: { zh: '查看原图', en: 'View image', ja: '元画像を表示' },
|
||||
col: {
|
||||
source: { zh: '来源图', en: 'Source', ja: '元画像' },
|
||||
duplicate: { zh: '重复', en: 'Duplicate', ja: '重複' },
|
||||
type: { zh: '类型', en: 'Type', ja: '種別' },
|
||||
amount: { zh: '金额', en: 'Amount', ja: '金額' },
|
||||
category: { zh: '分类', en: 'Category', ja: 'カテゴリ' },
|
||||
channel: { zh: '渠道', en: 'Channel', ja: 'チャネル' },
|
||||
time: { zh: '时间', en: 'Time', ja: '日時' },
|
||||
remark: { zh: '备注', en: 'Remark', ja: '備考' },
|
||||
tags: { zh: '标签', en: 'Tags', ja: 'タグ' },
|
||||
rawData: { zh: '原始数据', en: 'Raw Data', ja: '元データ' },
|
||||
},
|
||||
sourceImageLabel: { zh: '图 {index}', en: 'Image {index}', ja: '画像 {index}' },
|
||||
duplicate: { zh: '疑似重复', en: 'Duplicate', ja: '重複の疑い' },
|
||||
maxImages: { zh: '单次最多上传 {count} 张图片', en: 'Up to {count} images per upload', ja: '1回に最大 {count} 枚までアップロードできます' },
|
||||
},
|
||||
column: {
|
||||
record: { zh: '记录', en: 'Record', ja: '記録' },
|
||||
|
||||
Reference in New Issue
Block a user