event.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import { loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth'
  2. import { getEventPlay, type BackendEventPlayResult } from '../../utils/backendApi'
  3. import { formatBackendPlayActionText, formatBackendPlayStatusText } from '../../utils/backendPlayCopy'
  4. type EventPageData = {
  5. eventId: string
  6. loading: boolean
  7. titleText: string
  8. summaryText: string
  9. releaseText: string
  10. actionText: string
  11. statusText: string
  12. variantModeText: string
  13. variantSummaryText: string
  14. presentationText: string
  15. contentBundleText: string
  16. }
  17. function formatAssignmentMode(mode?: string | null): string {
  18. if (mode === 'manual') {
  19. return '手动选择'
  20. }
  21. if (mode === 'random') {
  22. return '随机分配'
  23. }
  24. if (mode === 'server-assigned') {
  25. return '后台指定'
  26. }
  27. return '默认单赛道'
  28. }
  29. function formatVariantSummary(result: BackendEventPlayResult): string {
  30. const variants = result.play.courseVariants || []
  31. if (!variants.length) {
  32. return '当前未声明额外赛道版本'
  33. }
  34. const selectable = variants.filter((item) => item.selectable !== false)
  35. const preview = variants.slice(0, 3).map((item) => item.routeCode || item.name).join(' / ')
  36. const suffix = variants.length > 3 ? ' / ...' : ''
  37. return `${variants.length} 条赛道,可选 ${selectable.length} 条:${preview}${suffix}`
  38. }
  39. function formatPresentationSummary(result: BackendEventPlayResult): string {
  40. const currentPresentation = result.currentPresentation
  41. if (!currentPresentation) {
  42. return '当前未声明展示版本'
  43. }
  44. const presentationId = currentPresentation.presentationId || '--'
  45. const templateKey = currentPresentation.templateKey || '--'
  46. const version = currentPresentation.version || '--'
  47. return `${presentationId} / ${templateKey} / ${version}`
  48. }
  49. function formatContentBundleSummary(result: BackendEventPlayResult): string {
  50. const currentContentBundle = result.currentContentBundle
  51. if (!currentContentBundle) {
  52. return '当前未声明内容包版本'
  53. }
  54. const bundleId = currentContentBundle.bundleId || '--'
  55. const bundleType = currentContentBundle.bundleType || '--'
  56. const version = currentContentBundle.version || '--'
  57. return `${bundleId} / ${bundleType} / ${version}`
  58. }
  59. function getAccessToken(): string | null {
  60. const app = getApp<IAppOption>()
  61. const tokens = app.globalData && app.globalData.backendAuthTokens
  62. ? app.globalData.backendAuthTokens
  63. : loadBackendAuthTokens()
  64. return tokens && tokens.accessToken ? tokens.accessToken : null
  65. }
  66. Page({
  67. data: {
  68. eventId: '',
  69. loading: false,
  70. titleText: '活动详情',
  71. summaryText: '未加载',
  72. releaseText: '--',
  73. actionText: '--',
  74. statusText: '待加载',
  75. variantModeText: '--',
  76. variantSummaryText: '--',
  77. presentationText: '--',
  78. contentBundleText: '--',
  79. } as EventPageData,
  80. onLoad(query: { eventId?: string }) {
  81. const eventId = query && query.eventId ? decodeURIComponent(query.eventId) : ''
  82. if (!eventId) {
  83. this.setData({
  84. statusText: '缺少 eventId',
  85. })
  86. return
  87. }
  88. this.setData({ eventId })
  89. this.loadEventPlay(eventId)
  90. },
  91. async loadEventPlay(eventId?: string) {
  92. const targetEventId = eventId || this.data.eventId
  93. const accessToken = getAccessToken()
  94. if (!accessToken) {
  95. wx.redirectTo({ url: '/pages/login/login' })
  96. return
  97. }
  98. this.setData({
  99. loading: true,
  100. statusText: '正在加载活动上下文',
  101. })
  102. try {
  103. const result = await getEventPlay({
  104. baseUrl: loadBackendBaseUrl(),
  105. eventId: targetEventId,
  106. accessToken,
  107. })
  108. this.applyEventPlay(result)
  109. } catch (error) {
  110. const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
  111. this.setData({
  112. loading: false,
  113. statusText: `活动加载失败:${message}`,
  114. })
  115. }
  116. },
  117. applyEventPlay(result: BackendEventPlayResult) {
  118. this.setData({
  119. loading: false,
  120. titleText: result.event.displayName,
  121. summaryText: result.event.summary || '暂无活动简介',
  122. releaseText: result.resolvedRelease
  123. ? `${result.resolvedRelease.configLabel} / ${result.resolvedRelease.releaseId}`
  124. : '当前无可用 release',
  125. actionText: formatBackendPlayActionText(result.play.primaryAction, result.play.reason),
  126. statusText: formatBackendPlayStatusText(result.play.canLaunch, result.play.primaryAction, result.play.reason),
  127. variantModeText: formatAssignmentMode(result.play.assignmentMode),
  128. variantSummaryText: formatVariantSummary(result),
  129. presentationText: formatPresentationSummary(result),
  130. contentBundleText: formatContentBundleSummary(result),
  131. })
  132. },
  133. handleRefresh() {
  134. this.loadEventPlay()
  135. },
  136. async handleLaunch() {
  137. wx.navigateTo({
  138. url: `/pages/event-prepare/event-prepare?eventId=${encodeURIComponent(this.data.eventId)}`,
  139. })
  140. },
  141. })