diff --git a/server/src/routes/hours.ts b/server/src/routes/hours.ts index c8aa058..af576ad 100644 --- a/server/src/routes/hours.ts +++ b/server/src/routes/hours.ts @@ -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 {}