主要变更: - 将独立的 web-finance 应用整合到 web-antd 主应用中 - 重命名 backend-mock 为 backend,增强后端功能 - 新增财务模块 API 端点(账户、预算、类别、交易) - 增强财务仪表板和报表功能 - 添加 SQLite 数据存储支持和财务数据导入脚本 - 优化路由结构,删除冗余的 finance-system 模块 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
96 lines
2.6 KiB
TypeScript
96 lines
2.6 KiB
TypeScript
import * as fs from 'node:fs';
|
|
|
|
const INPUT_CSV = '/Users/fuwuqi/Downloads/Telegram Desktop/控天-控天_完全修正.csv';
|
|
const OUTPUT_CSV = '/Users/fuwuqi/Downloads/Telegram Desktop/控天-控天_完全修正_带分类.csv';
|
|
|
|
// 智能分类函数
|
|
function getCategory(project: string): string {
|
|
const desc = project.toLowerCase();
|
|
|
|
// 工资
|
|
if (desc.includes('工资') || desc.match(/amy|天天|碧桂园|皇|香缇卡|财务|客服|小哥|代理ip|sy|超鹏|小白/)) {
|
|
return '工资';
|
|
}
|
|
|
|
// 佣金/返佣
|
|
if (desc.includes('佣金') || desc.includes('返佣')) {
|
|
return '佣金/返佣';
|
|
}
|
|
|
|
// 分红
|
|
if (desc.includes('分红') || desc.includes('散户')) {
|
|
return '分红';
|
|
}
|
|
|
|
// 服务器/技术
|
|
if (desc.match(/服务器|技术|chatgpt|openai|ai|接口|ip|nat|宝塔|cdn|oss|google|翻译|openrouter|deepseek|claude|cursor|bolt|硅基|chatwoot/)) {
|
|
return '服务器/技术';
|
|
}
|
|
|
|
// 广告推广
|
|
if (desc.match(/广告|推广|地推|投放|打流量/)) {
|
|
return '广告推广';
|
|
}
|
|
|
|
// 软件/工具
|
|
if (desc.match(/会员|007|u盘|processon|飞机|虚拟卡|小红卡|信用卡|cloudflare|uizard|esim/)) {
|
|
return '软件/工具';
|
|
}
|
|
|
|
// 固定资产
|
|
if (desc.match(/买车|电脑|笔记本|显示器|rog|硬盘|服务器.*购买|iphone|路由器|展示屏/)) {
|
|
return '固定资产';
|
|
}
|
|
|
|
// 退款
|
|
if (desc.includes('退款') || desc.includes('退费') || desc.includes('退')) {
|
|
return '退款';
|
|
}
|
|
|
|
// 借款/转账
|
|
if (desc.match(/借|转给|龙腾|投资款|换.*铢|换美金|换现金|报销|房租|生活费|办公室|出差|接待|保关|测试|开工红包/)) {
|
|
return '借款/转账';
|
|
}
|
|
|
|
// 其他支出
|
|
return '其他支出';
|
|
}
|
|
|
|
// 读取并处理CSV
|
|
const content = fs.readFileSync(INPUT_CSV, 'utf-8');
|
|
const lines = content.split('\n');
|
|
|
|
// 修改表头,添加"分类"列
|
|
const header = lines[0];
|
|
const newHeader = header.trimEnd() + ',分类\n';
|
|
|
|
// 处理每一行数据
|
|
const newLines = [newHeader];
|
|
|
|
for (let i = 1; i < lines.length; i++) {
|
|
const line = lines[i];
|
|
if (!line.trim()) {
|
|
newLines.push(line);
|
|
continue;
|
|
}
|
|
|
|
const columns = line.split(',');
|
|
if (columns.length < 2) {
|
|
newLines.push(line);
|
|
continue;
|
|
}
|
|
|
|
const project = columns[1]?.trim() || '';
|
|
const category = getCategory(project);
|
|
|
|
// 添加分类列
|
|
const newLine = line.trimEnd() + ',' + category + '\n';
|
|
newLines.push(newLine);
|
|
}
|
|
|
|
// 写入新文件
|
|
fs.writeFileSync(OUTPUT_CSV, newLines.join(''));
|
|
|
|
console.log(`✓ 已生成带分类的CSV文件: ${OUTPUT_CSV}`);
|
|
console.log(`共处理 ${lines.length - 1} 条记录`);
|