event.ts 6.4 KB

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