备份:PWA配置前的完整版本

包含所有最新开发的功能和修复,作为PWA正确配置前的备份点。
This commit is contained in:
a273825743
2026-06-13 12:44:48 +08:00
parent 5fd19822a2
commit 706dcc24eb
83 changed files with 26590 additions and 13379 deletions
+29 -4
View File
@@ -236,8 +236,14 @@ router.post('/batch', authenticate, async (req, res) => {
for (let i = 0; i < records.length; i++) {
const r = records[i];
try {
if (!r.txn_type || !r.category_level1 || !r.category_level2 || !r.amount_original || !r.record_date) {
errors.push({ row: i + 1, message: '缺少必填字段' });
const missingFields = [];
if (!r.txn_type) missingFields.push('收支类型');
if (!r.category_level1) missingFields.push('一级分类');
if (!r.category_level2) missingFields.push('二级分类');
if (!r.amount_original) missingFields.push('金额');
if (!r.record_date) missingFields.push('日期');
if (missingFields.length > 0) {
errors.push({ row: i + 1, message: `缺少必填字段: ${missingFields.join(', ')}`, data: r });
continue;
}
@@ -246,15 +252,34 @@ router.post('/batch', authenticate, async (req, res) => {
let projectId = r.project_id || null;
if (!projectId && r.project_name) {
// 先精确匹配
const projResult = await db.query("SELECT id FROM projects WHERE name = $1", [r.project_name]);
if (projResult.rows.length > 0) {
projectId = projResult.rows[0].id;
} else {
// 模糊匹配:去除空格后比较
const fuzzyResult = await db.query(
"SELECT id, name FROM projects WHERE REPLACE(name, ' ', '') = REPLACE($1, ' ', '')",
[r.project_name]
);
if (fuzzyResult.rows.length > 0) {
projectId = fuzzyResult.rows[0].id;
} else {
// 包含匹配
const likeResult = await db.query(
"SELECT id, name FROM projects WHERE name LIKE '%' || $1 || '%' OR $1 LIKE '%' || name || '%'",
[r.project_name]
);
if (likeResult.rows.length > 0) {
projectId = likeResult.rows[0].id;
}
}
}
}
let userId = r.user_id || null;
if (!userId && r.user_name) {
const userResult = await db.query("SELECT id FROM users WHERE name = $1", [r.user_name]);
const userResult = await db.query("SELECT id FROM users WHERE name = $1 OR username = $1", [r.user_name]);
if (userResult.rows.length > 0) {
userId = userResult.rows[0].id;
}
@@ -280,7 +305,7 @@ router.post('/batch', authenticate, async (req, res) => {
);
results.push(result.rows[0]);
} catch (err) {
errors.push({ row: i + 1, message: err.message });
errors.push({ row: i + 1, message: err.message, data: { txn_type: r.txn_type, category_level1: r.category_level1, category_level2: r.category_level2, project_name: r.project_name, amount: r.amount_original } });
}
}