- hours.ts POST /direct-add:
· 不再复用单一『【补录】直接加义工时长』活动(之前 start_time
硬编码 2024-01-01 00:00 会在所有活动列表/详情里显示错时间)
· 改为每次提交取 SQLite datetime('now','+8 hours') 真实 UTC+8 时刻,
活动标题按日期拼接:『【补录】YYYY-MM-DD 直接加义工时长』
· start_time / end_time 都设为提交这一刻的 YYYY-MM-DD HH:MM,
同一日内多次提交会复用同日期活动;不同日期自动建独立活动
· 响应额外返回 direct_add_activity_title / direct_add_activity_time
便于前端以后 toast 里显示
- 新增容错:last_insert_rowid() 取不到活动就 ROLLBACK + 返回 500,
防止 hours 行悬挂到无效 activity_id
This commit is contained in:
@@ -36,7 +36,7 @@ router.post('/batch', authMiddleware, (req: AuthRequest, res: Response) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const DIRECT_ADD_TITLE = '【补录】直接加义工时长';
|
const DIRECT_ADD_TITLE_PREFIX = '【补录】';
|
||||||
|
|
||||||
router.post('/direct-add', authMiddleware, (req: AuthRequest, res: Response) => {
|
router.post('/direct-add', authMiddleware, (req: AuthRequest, res: Response) => {
|
||||||
const { items } = req.body || {};
|
const { items } = req.body || {};
|
||||||
@@ -68,13 +68,21 @@ router.post('/direct-add', authMiddleware, (req: AuthRequest, res: Response) =>
|
|||||||
return res.status(400).json({ error: errors.join(';') });
|
return res.status(400).json({ error: errors.join(';') });
|
||||||
}
|
}
|
||||||
db.execCompat('BEGIN');
|
db.execCompat('BEGIN');
|
||||||
let act = db.prepareCompat('SELECT * FROM activities WHERE title = ?').get(DIRECT_ADD_TITLE) as any;
|
const nowLocal = (db.prepareCompat(`SELECT datetime('now','+8 hours') AS ts`).get() as any)?.ts || new Date().toISOString().slice(0, 19).replace('T', ' ');
|
||||||
|
const dayStr = String(nowLocal).slice(0, 10);
|
||||||
|
const actTitle = `${DIRECT_ADD_TITLE_PREFIX}${dayStr} 直接加义工时长`;
|
||||||
|
let act = db.prepareCompat('SELECT * FROM activities WHERE title = ? AND DATE(start_time) = ?').get(actTitle, dayStr) as any;
|
||||||
if (!act) {
|
if (!act) {
|
||||||
|
const timeStr = String(nowLocal).slice(0, 16);
|
||||||
db.prepareCompat(`
|
db.prepareCompat(`
|
||||||
INSERT INTO activities (title, content, start_time, end_time)
|
INSERT INTO activities (title, content, start_time, end_time)
|
||||||
VALUES (?, ?, ?, ?)
|
VALUES (?, ?, ?, ?)
|
||||||
`).run(DIRECT_ADD_TITLE, '管理台直接补录义工时长,不绑定真实活动', '2024-01-01 00:00', '2099-12-31 23:59');
|
`).run(actTitle, `管理台于 ${timeStr} 直接补录义工时长,不绑定真实活动`, timeStr, timeStr);
|
||||||
act = db.prepareCompat('SELECT * FROM activities WHERE title = ?').get(DIRECT_ADD_TITLE) as any;
|
act = db.prepareCompat('SELECT * FROM activities WHERE id = last_insert_rowid()').get() as any;
|
||||||
|
}
|
||||||
|
if (!act) {
|
||||||
|
db.execCompat('ROLLBACK');
|
||||||
|
return res.status(500).json({ error: '无法创建补录活动记录' });
|
||||||
}
|
}
|
||||||
const insert = db.prepareCompat(`
|
const insert = db.prepareCompat(`
|
||||||
INSERT INTO hours (activity_id, user_id, hours, remark)
|
INSERT INTO hours (activity_id, user_id, hours, remark)
|
||||||
@@ -100,6 +108,8 @@ router.post('/direct-add', authMiddleware, (req: AuthRequest, res: Response) =>
|
|||||||
total_hours: results.reduce((s, r) => s + r.hours, 0),
|
total_hours: results.reduce((s, r) => s + r.hours, 0),
|
||||||
results,
|
results,
|
||||||
direct_add_activity_id: act.id,
|
direct_add_activity_id: act.id,
|
||||||
|
direct_add_activity_title: act.title,
|
||||||
|
direct_add_activity_time: act.start_time,
|
||||||
});
|
});
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
try { db.execCompat('ROLLBACK'); } catch {}
|
try { db.execCompat('ROLLBACK'); } catch {}
|
||||||
|
|||||||
Reference in New Issue
Block a user