result.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth'
  2. import { getSessionResult } from '../../utils/backendApi'
  3. import type { MapEngineResultSnapshot } from '../../engine/map/mapEngine'
  4. type ResultPageData = {
  5. sessionId: string
  6. statusText: string
  7. sessionTitleText: string
  8. sessionSubtitleText: string
  9. rows: Array<{ label: string; value: string }>
  10. }
  11. function getAccessToken(): string | null {
  12. const app = getApp<IAppOption>()
  13. const tokens = app.globalData && app.globalData.backendAuthTokens
  14. ? app.globalData.backendAuthTokens
  15. : loadBackendAuthTokens()
  16. return tokens && tokens.accessToken ? tokens.accessToken : null
  17. }
  18. function formatValue(value: unknown): string {
  19. if (value === null || value === undefined || value === '') {
  20. return '--'
  21. }
  22. return String(value)
  23. }
  24. function formatRouteSummary(input: {
  25. variantName?: string | null
  26. routeCode?: string | null
  27. }): string {
  28. if (input.variantName && input.routeCode) {
  29. return `${input.variantName} / ${input.routeCode}`
  30. }
  31. if (input.variantName) {
  32. return input.variantName
  33. }
  34. if (input.routeCode) {
  35. return input.routeCode
  36. }
  37. return '默认赛道'
  38. }
  39. Page({
  40. data: {
  41. sessionId: '',
  42. statusText: '准备加载结果',
  43. sessionTitleText: '结果页',
  44. sessionSubtitleText: '未加载',
  45. rows: [],
  46. } as ResultPageData,
  47. onLoad(query: { sessionId?: string }) {
  48. const sessionId = query && query.sessionId ? decodeURIComponent(query.sessionId) : ''
  49. this.setData({ sessionId })
  50. this.applyPendingResultSnapshot()
  51. if (sessionId) {
  52. this.loadSingleResult(sessionId)
  53. return
  54. }
  55. this.setData({
  56. statusText: '未提供单局会话,已跳转历史结果',
  57. })
  58. wx.redirectTo({
  59. url: '/pages/results/results',
  60. })
  61. },
  62. applyPendingResultSnapshot() {
  63. const app = getApp<IAppOption>()
  64. const snapshot = app.globalData && app.globalData.pendingResultSnapshot
  65. ? app.globalData.pendingResultSnapshot as MapEngineResultSnapshot
  66. : null
  67. if (!snapshot) {
  68. return
  69. }
  70. this.setData({
  71. statusText: '正在加载结果',
  72. sessionTitleText: snapshot.title,
  73. sessionSubtitleText: snapshot.subtitle,
  74. rows: [
  75. { label: snapshot.heroLabel, value: snapshot.heroValue },
  76. ...snapshot.rows.map((row) => ({
  77. label: row.label,
  78. value: row.value,
  79. })),
  80. ],
  81. })
  82. if (app.globalData) {
  83. app.globalData.pendingResultSnapshot = null
  84. }
  85. },
  86. async loadSingleResult(sessionId: string) {
  87. const accessToken = getAccessToken()
  88. if (!accessToken) {
  89. wx.redirectTo({ url: '/pages/login/login' })
  90. return
  91. }
  92. this.setData({
  93. statusText: '正在加载单局结果',
  94. })
  95. try {
  96. const result = await getSessionResult({
  97. baseUrl: loadBackendBaseUrl(),
  98. accessToken,
  99. sessionId,
  100. })
  101. this.setData({
  102. statusText: '单局结果加载完成',
  103. sessionTitleText: result.session.eventName || result.session.eventDisplayName || result.session.eventId || result.session.id || result.session.sessionId,
  104. sessionSubtitleText: `${result.session.status || result.session.sessionStatus} / ${result.result.status} / ${formatRouteSummary(result.session)}`,
  105. rows: [
  106. { label: '赛道版本', value: formatRouteSummary(result.session) },
  107. { label: '最终得分', value: formatValue(result.result.finalScore) },
  108. { label: '最终用时(秒)', value: formatValue(result.result.finalDurationSec) },
  109. { label: '完成点数', value: formatValue(result.result.completedControls) },
  110. { label: '总点数', value: formatValue(result.result.totalControls) },
  111. { label: '累计里程(m)', value: formatValue(result.result.distanceMeters) },
  112. { label: '平均速度(km/h)', value: formatValue(result.result.averageSpeedKmh) },
  113. { label: '最大心率', value: formatValue(result.result.maxHeartRateBpm) },
  114. ],
  115. })
  116. } catch (error) {
  117. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  118. this.setData({
  119. statusText: `结果加载失败:${message}`,
  120. })
  121. }
  122. },
  123. handleBackToList() {
  124. wx.redirectTo({
  125. url: '/pages/results/results',
  126. })
  127. },
  128. })