event.ts 6.8 KB

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