| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- import { loadBackendAuthTokens, loadBackendBaseUrl } from '../../utils/backendAuth'
- import { getEventPlay, type BackendEventPlayResult } from '../../utils/backendApi'
- import { formatBackendPlayActionText, formatBackendPlayStatusText } from '../../utils/backendPlayCopy'
- import { reportBackendClientLog } from '../../utils/backendClientLogs'
- type EventPageData = {
- eventId: string
- loading: boolean
- titleText: string
- summaryText: string
- releaseText: string
- actionText: string
- statusText: string
- variantModeText: string
- variantSummaryText: string
- presentationText: string
- contentBundleText: string
- }
- function formatAssignmentMode(mode?: string | null): string {
- if (mode === 'manual') {
- return '手动选择'
- }
- if (mode === 'random') {
- return '随机分配'
- }
- if (mode === 'server-assigned') {
- return '后台指定'
- }
- return '默认单赛道'
- }
- function formatVariantSummary(result: BackendEventPlayResult): string {
- const variants = result.play.courseVariants || []
- if (!variants.length) {
- return '当前未声明额外赛道版本'
- }
- const selectable = variants.filter((item) => item.selectable !== false)
- const preview = variants.slice(0, 3).map((item) => item.routeCode || item.name).join(' / ')
- const suffix = variants.length > 3 ? ' / ...' : ''
- return `${variants.length} 条赛道,可选 ${selectable.length} 条:${preview}${suffix}`
- }
- function formatPresentationSummary(result: BackendEventPlayResult): string {
- const currentPresentation = result.currentPresentation
- if (!currentPresentation) {
- return '当前发布 release 未绑定展示版本,或当前尚未发布'
- }
- const presentationId = currentPresentation.presentationId || '--'
- const templateKey = currentPresentation.templateKey || '--'
- const version = currentPresentation.version || '--'
- return `${presentationId} / ${templateKey} / ${version}`
- }
- function formatContentBundleSummary(result: BackendEventPlayResult): string {
- const currentContentBundle = result.currentContentBundle
- if (!currentContentBundle) {
- return '当前发布 release 未绑定内容包版本,或当前尚未发布'
- }
- const bundleId = currentContentBundle.bundleId || '--'
- const bundleType = currentContentBundle.bundleType || '--'
- const version = currentContentBundle.version || '--'
- return `${bundleId} / ${bundleType} / ${version}`
- }
- function getAccessToken(): string | null {
- const app = getApp<IAppOption>()
- const tokens = app.globalData && app.globalData.backendAuthTokens
- ? app.globalData.backendAuthTokens
- : loadBackendAuthTokens()
- return tokens && tokens.accessToken ? tokens.accessToken : null
- }
- Page({
- data: {
- eventId: '',
- loading: false,
- titleText: '活动详情',
- summaryText: '未加载',
- releaseText: '--',
- actionText: '--',
- statusText: '待加载',
- variantModeText: '--',
- variantSummaryText: '--',
- presentationText: '--',
- contentBundleText: '--',
- } as EventPageData,
- onLoad(query: { eventId?: string }) {
- const eventId = query && query.eventId ? decodeURIComponent(query.eventId) : ''
- if (!eventId) {
- this.setData({
- statusText: '缺少 eventId',
- })
- return
- }
- this.setData({ eventId })
- this.loadEventPlay(eventId)
- },
- async loadEventPlay(eventId?: string) {
- const targetEventId = eventId || this.data.eventId
- const accessToken = getAccessToken()
- if (!accessToken) {
- wx.redirectTo({ url: '/pages/login/login' })
- return
- }
- this.setData({
- loading: true,
- statusText: '正在加载活动上下文',
- })
- try {
- const result = await getEventPlay({
- baseUrl: loadBackendBaseUrl(),
- eventId: targetEventId,
- accessToken,
- })
- this.applyEventPlay(result)
- } catch (error) {
- const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
- this.setData({
- loading: false,
- statusText: `活动加载失败:${message}`,
- })
- }
- },
- applyEventPlay(result: BackendEventPlayResult) {
- const assignmentMode = result.play.assignmentMode ? result.play.assignmentMode : null
- reportBackendClientLog({
- level: 'info',
- category: 'event-play',
- message: 'event play loaded',
- eventId: result.event.id || this.data.eventId || '',
- releaseId: result.resolvedRelease && result.resolvedRelease.releaseId
- ? result.resolvedRelease.releaseId
- : '',
- manifestUrl: result.resolvedRelease && result.resolvedRelease.manifestUrl
- ? result.resolvedRelease.manifestUrl
- : '',
- details: {
- pageEventId: this.data.eventId || '',
- resultEventId: result.event.id || '',
- primaryAction: result.play.primaryAction || '',
- detailStatus: result.play.reason || '',
- detailCanLaunch: result.play.canLaunch,
- detailCurrentPresentation: result.currentPresentation
- ? `${result.currentPresentation.presentationId || '--'} / ${result.currentPresentation.templateKey || '--'} / ${result.currentPresentation.version || '--'}`
- : '',
- detailCurrentContentBundle: result.currentContentBundle
- ? `${result.currentContentBundle.bundleId || '--'} / ${result.currentContentBundle.bundleType || '--'} / ${result.currentContentBundle.version || '--'}`
- : '',
- assignmentMode,
- variantCount: result.play.courseVariants ? result.play.courseVariants.length : 0,
- },
- })
- this.setData({
- loading: false,
- titleText: result.event.displayName,
- summaryText: result.event.summary || '暂无活动简介',
- releaseText: result.resolvedRelease
- ? `${result.resolvedRelease.configLabel} / ${result.resolvedRelease.releaseId}`
- : '当前无可用 release',
- actionText: formatBackendPlayActionText(result.play.primaryAction, result.play.reason),
- statusText: formatBackendPlayStatusText(result.play.canLaunch, result.play.primaryAction, result.play.reason),
- variantModeText: formatAssignmentMode(result.play.assignmentMode),
- variantSummaryText: formatVariantSummary(result),
- presentationText: formatPresentationSummary(result),
- contentBundleText: formatContentBundleSummary(result),
- })
- },
- handleRefresh() {
- this.loadEventPlay()
- },
- async handleLaunch() {
- wx.navigateTo({
- url: `/pages/event-prepare/event-prepare?eventId=${encodeURIComponent(this.data.eventId)}`,
- })
- },
- })
|