function display(value, fallback = '-') { if (value === undefined || value === null || value === '') return fallback return String(value) } function formatTime(time = Date.now()) { return new Date(Number(time) || Date.now()).toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) } function formatSecondsToMinSec(totalSeconds) { const seconds = Number(totalSeconds) || 0 if (seconds <= 0) return '-' const minutes = Math.floor(seconds / 60) const remain = Math.floor(seconds % 60) return `${minutes}分${String(remain).padStart(2, '0')}秒` } function calculatePace(seconds, kilometers) { const totalSeconds = Number(seconds) || 0 const distance = Number(kilometers) || 0 if (totalSeconds <= 0 || distance <= 0) return '-' const paceInSeconds = totalSeconds / distance const minutes = Math.floor(paceInSeconds / 60) const remain = Math.round(paceInSeconds % 60) return `${minutes}'${String(remain).padStart(2, '0')}''` } function divider() { return '\n---\n' } function kv(label, value) { return `> **${label}**:${display(value)}` } function buildUpdateSuccess(data = {}) { const autoNote = Number(data.auto_run) === 0 ? '当前未开启自动乐跑。如需跑步,请登录 RunForge 后手动发起。' : '已为您开启自动乐跑,系统将按计划代为完成跑步任务,请留意后续提醒。' return [ `## ✅ 乐跑账号信息已更新`, '', `${display(data.name, '同学')},您的乐跑账号登录信息已更新成功。`, divider(), kv('学号', data.account), kv('年级', data.grade_id), kv('学院', data.academy_name), kv('更新时间', formatTime()), divider(), `**自动乐跑状态** \n${autoNote}`, '', `> 请在当前登录乐跑账号的设备上使用「智慧体育」小程序;请勿在其他设备登录该小程序,以免登录状态失效并需重新绑定。` ].join('\n') } function buildRunSuccess(data = {}) { const targetCount = Number(data.target_count) || 0 const totalNum = Number(data.total_num) || 0 const timeSec = Number(data.time ?? data.used_time) || 0 const distanceKm = Number(data.distance) || 0 const goalLines = targetCount > 0 ? [kv('目标次数', `${targetCount} 次`), kv('累计次数', `${totalNum} 次`)] : [kv('累计次数', `${totalNum} 次`)] return [ `## ✅ 乐跑成功通知`, '', `${display(data.name, '同学')},系统已成功代您完成一次乐跑。`, divider(), kv('学号', data.account), kv('跑区', data.pass_tit || data.run_zone_name), kv('用时', formatSecondsToMinSec(timeSec)), kv('平均配速', calculatePace(timeSec, distanceKm)), kv('距离', distanceKm > 0 ? `${distanceKm} km` : '-'), ...goalLines, kv('完成时间', formatTime()), divider(), `> 若已开启自动乐跑,请勿在除更新乐跑账号信息以外的其他设备登录「智慧体育」小程序,以免登录状态失效。` ].join('\n') } function buildRunFail(data = {}) { return [ `## ❌ 乐跑未能完成`, '', `${display(data.name || data.account, '同学')},系统在尝试执行乐跑任务时未成功。`, divider(), kv('学号', data.account), kv('时间', formatTime()), kv('原因', data.reason || '系统繁忙,请稍后再试'), divider(), `> 若为登录失效,请在 RunForge 乐跑登录器中重新完成登录后再试。若问题持续存在,请联系 RunForge 客服并说明学号与失败时间。` ].join('\n') } function buildTargetComplete(data = {}) { return [ `## 🏁 乐跑目标已全部完成`, '', `${display(data.name || data.account, '同学')},您设定的乐跑目标已全部完成,系统已为您关闭自动乐跑功能。`, divider(), kv('学号', data.account), kv('目标次数', `${display(data.target_count, 0)} 次`), kv('累计次数', `${display(data.total_num, 0)} 次`), kv('完成时间', formatTime()), divider(), `如仍需跑步,可在 RunForge 中按需重新开启相关功能。` ].join('\n') } module.exports = { buildUpdateSuccess, buildRunSuccess, buildRunFail, buildTargetComplete }