results.ts 3.3 KB

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