results.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import { loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth'
  2. import { getMyResults, type BackendSessionResultView } from '../../utils/backendApi'
  3. type ResultsPageData = {
  4. loading: boolean
  5. statusText: string
  6. results: Array<{
  7. sessionId: string
  8. eventId: string
  9. titleText: string
  10. statusText: string
  11. scoreText: string
  12. routeText: string
  13. runtimeText: string
  14. }>
  15. }
  16. function getAccessToken(): string | null {
  17. const app = getApp<IAppOption>()
  18. const tokens = app.globalData && app.globalData.backendAuthTokens
  19. ? app.globalData.backendAuthTokens
  20. : loadBackendAuthTokens()
  21. return tokens && tokens.accessToken ? tokens.accessToken : null
  22. }
  23. function formatRouteSummary(result: BackendSessionResultView): string {
  24. const session = result.session
  25. if (session.variantName && session.routeCode) {
  26. return `${session.variantName} / ${session.routeCode}`
  27. }
  28. if (session.variantName) {
  29. return session.variantName
  30. }
  31. if (session.routeCode) {
  32. return session.routeCode
  33. }
  34. return '默认赛道'
  35. }
  36. function formatRuntimeSummary(result: BackendSessionResultView): string {
  37. const runtime = result.session.runtime
  38. if (!runtime) {
  39. return '运行对象 --'
  40. }
  41. const placeText = runtime.placeName || runtime.placeId || '--'
  42. const mapText = runtime.mapName || runtime.mapId || '--'
  43. const variantText = runtime.courseVariantId || result.session.variantName || result.session.variantId || '--'
  44. return `地点 ${placeText} / 地图 ${mapText} / 赛道 ${variantText}`
  45. }
  46. function buildResultCardView(result: BackendSessionResultView) {
  47. return {
  48. sessionId: result.session.id,
  49. eventId: result.session.eventId || '',
  50. titleText: result.session.eventName || result.session.id,
  51. statusText: `${result.result.status} / ${result.session.status}`,
  52. scoreText: `得分 ${result.result.finalScore || '--'} / 用时 ${result.result.finalDurationSec || '--'}s`,
  53. routeText: `赛道 ${formatRouteSummary(result)}`,
  54. runtimeText: formatRuntimeSummary(result),
  55. }
  56. }
  57. Page({
  58. data: {
  59. loading: false,
  60. statusText: '准备加载历史结果',
  61. results: [],
  62. } as ResultsPageData,
  63. onLoad() {
  64. this.loadResults()
  65. },
  66. onShow() {
  67. this.loadResults()
  68. },
  69. async loadResults() {
  70. const accessToken = getAccessToken()
  71. if (!accessToken) {
  72. wx.redirectTo({ url: '/pages/login/login' })
  73. return
  74. }
  75. this.setData({
  76. loading: true,
  77. statusText: '正在加载历史结果',
  78. })
  79. try {
  80. const results = await getMyResults({
  81. baseUrl: loadBackendBaseUrl(),
  82. accessToken,
  83. limit: 20,
  84. })
  85. this.setData({
  86. loading: false,
  87. statusText: `历史结果加载完成,共 ${results.length} 条`,
  88. results: results.map(buildResultCardView),
  89. })
  90. } catch (error) {
  91. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  92. this.setData({
  93. loading: false,
  94. statusText: `历史结果加载失败:${message}`,
  95. })
  96. }
  97. },
  98. handleOpenResult(event: WechatMiniprogram.TouchEvent) {
  99. const sessionId = event.currentTarget.dataset.sessionId as string | undefined
  100. if (!sessionId) {
  101. return
  102. }
  103. wx.navigateTo({
  104. url: `/pages/result/result?sessionId=${encodeURIComponent(sessionId)}`,
  105. })
  106. },
  107. handleOpenEvent(event: WechatMiniprogram.TouchEvent) {
  108. const eventId = event.currentTarget.dataset.eventId as string | undefined
  109. if (!eventId) {
  110. wx.showToast({
  111. title: '当前结果未关联活动',
  112. icon: 'none',
  113. })
  114. return
  115. }
  116. wx.navigateTo({
  117. url: `/pages/event/event?eventId=${encodeURIComponent(eventId)}`,
  118. })
  119. },
  120. })