const { query } = require('../lib/db') const { ok, fail } = require('../lib/response') const { requireUser } = require('../lib/auth') const { writeLog } = require('../lib/log') function toMysqlDate(value) { if (!value) return null const d = new Date(value) if (Number.isNaN(d.getTime())) return null return d.toISOString().slice(0, 19).replace('T', ' ') } function register(router) { function limitClause(pageSize, offset) { return ' LIMIT ' + Number(pageSize) + ' OFFSET ' + Number(offset) } router.get('/api/v1/treatment/history', async ctx => { const user = await requireUser(ctx) if (!user) return fail(1001, 'invalid_token') const page = Math.max(1, parseInt(ctx.query.page, 10) || 1) const pageSize = Math.min(Math.max(1, parseInt(ctx.query.page_size, 10) || 20), 100) const offset = (page - 1) * pageSize const total = await query('SELECT COUNT(*) AS total FROM treatment_records WHERE user_id = :user_id', { user_id: user.user_id }) const records = await query('SELECT * FROM treatment_records WHERE user_id = :user_id ORDER BY created_at DESC' + limitClause(pageSize, offset), { user_id: user.user_id }) return ok({ total: total[0].total, page, page_size: pageSize, records }) }) router.post('/api/v1/treatment/sync', async ctx => { const user = await requireUser(ctx) if (!user) return fail(1001, 'invalid_token') const d = ctx.body || {} if (!d.device_id) return fail(2001, 'device_id required') const sessionId = d.session_id || 'SESS' + Date.now() await query( `INSERT INTO treatment_records (session_id, device_id, user_id, start_time, end_time, regions, total_duration_ms, mode, avg_pd, battery, temperature, wavelength, brightness, pd_json) VALUES (:session_id, :device_id, :user_id, :start_time, :end_time, :regions, :total_duration_ms, :mode, :avg_pd, :battery, :temperature, :wavelength, :brightness, :pd_json) ON DUPLICATE KEY UPDATE end_time = VALUES(end_time), total_duration_ms = VALUES(total_duration_ms), avg_pd = VALUES(avg_pd), battery = VALUES(battery), temperature = VALUES(temperature), pd_json = VALUES(pd_json)`, { session_id: sessionId, device_id: d.device_id, user_id: user.user_id, start_time: toMysqlDate(d.start_time), end_time: toMysqlDate(d.end_time), regions: Array.isArray(d.regions) ? d.regions.join(',') : String(d.regions || ''), total_duration_ms: parseInt(d.total_duration_ms, 10) || 0, mode: parseInt(d.mode, 10) || 0, avg_pd: Number(d.avg_pd) || 0, battery: d.battery == null ? null : parseInt(d.battery, 10), temperature: d.temperature == null ? null : parseInt(d.temperature, 10), wavelength: d.wavelength == null ? null : parseInt(d.wavelength, 10), brightness: d.brightness == null ? null : parseInt(d.brightness, 10), pd_json: JSON.stringify(d.pd_values || {}) } ) await query('UPDATE devices SET battery = COALESCE(:battery, battery), temperature = COALESCE(:temperature, temperature), last_online_at = NOW() WHERE device_id = :device_id', { device_id: d.device_id, battery: d.battery == null ? null : parseInt(d.battery, 10), temperature: d.temperature == null ? null : parseInt(d.temperature, 10) }) await writeLog({ user_id: user.user_id, action: 'treatment_sync', detail: '同步护理记录: ' + sessionId, ip: ctx.ip }) return ok({ record_id: sessionId }) }) } module.exports = register