| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- 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
- }
|