- 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) => {
|
||||
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(';') });
|
||||
}
|
||||
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) {
|
||||
const timeStr = String(nowLocal).slice(0, 16);
|
||||
db.prepareCompat(`
|
||||
INSERT INTO activities (title, content, start_time, end_time)
|
||||
VALUES (?, ?, ?, ?)
|
||||
`).run(DIRECT_ADD_TITLE, '管理台直接补录义工时长,不绑定真实活动', '2024-01-01 00:00', '2099-12-31 23:59');
|
||||
act = db.prepareCompat('SELECT * FROM activities WHERE title = ?').get(DIRECT_ADD_TITLE) as any;
|
||||
`).run(actTitle, `管理台于 ${timeStr} 直接补录义工时长,不绑定真实活动`, timeStr, timeStr);
|
||||
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(`
|
||||
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),
|
||||
results,
|
||||
direct_add_activity_id: act.id,
|
||||
direct_add_activity_title: act.title,
|
||||
direct_add_activity_time: act.start_time,
|
||||
});
|
||||
} catch (e: any) {
|
||||
try { db.execCompat('ROLLBACK'); } catch {}
|
||||
|
||||
Reference in New Issue
Block a user