Codex Assistant
1 天以前 ba94ceae1315174798ae1967ef62268c6d16cd5b
wx/pages/project/detail.js
@@ -5,18 +5,12 @@
  data: {
    projectId: '',
    projectDetail: null,
    timeline: [],
    ratingStats: null,
    loading: true,
    error: '',
    statusText: '',
    genderText: '',
    educationText: '',
    timelineLoading: false,
    timelineError: '',
    showRatingDetail: false,
    ratingDetail: null,
    ratingDetailLoading: false,
    ratingDetailError: ''
    educationText: ''
  },
  onLoad(options) {
@@ -41,33 +35,48 @@
        error: ''
      })
      // 调用API获取项目详情
      const projectDetail = await this.getProjectDetailFromAPI(this.data.projectId)
      if (!projectDetail) {
        throw new Error('项目详情获取失败')
      }
      if (projectDetail) {
        // 处理文件大小显示
      if (projectDetail.submissionFiles) {
        projectDetail.submissionFiles.forEach(file => {
          file.fileSizeText = this.formatFileSize(file.fileSize)
            // 字段已经是正确的名称,无需映射
            // fullUrl, fullThumbUrl, fileSize, fileExt 都是正确的字段名
          })
        }
        // 获取评分统计
        const ratingStats = await this.getRatingStatsFromAPI(this.data.projectId)
        // 处理评分时间显示
        if (ratingStats && ratingStats.judgeRatings) {
          ratingStats.judgeRatings.forEach(rating => {
            if (rating.ratingTime) {
              rating.ratingTimeText = this.formatDateTime(rating.ratingTime)
            }
        })
      }
      this.setData({
        projectDetail,
          ratingStats,
        statusText: this.getStatusText(projectDetail.state),
        genderText: this.getGenderText(projectDetail.playerInfo?.gender),
        educationText: this.getEducationText(projectDetail.playerInfo?.education)
          educationText: this.getEducationText(projectDetail.playerInfo?.education),
          loading: false
      })
      await this.loadProjectTimeline(this.data.projectId)
      } else {
        throw new Error('项目详情获取失败')
      }
    } catch (error) {
      console.error('加载项目详情失败:', error)
      this.setData({
        error: error.message || '加载失败,请重试'
        error: error.message || '加载失败,请重试',
        loading: false
      })
    } finally {
      this.setData({ loading: false })
    }
  },
@@ -146,174 +155,37 @@
    }
  },
  async loadProjectTimeline(activityPlayerId) {
    if (!activityPlayerId) {
      return
  // 获取评分统计
  async getRatingStatsFromAPI(projectId) {
    // 暂时返回空的评分数据,避免GraphQL查询错误
    // TODO: 需要后端提供合适的评分统计查询接口
    try {
      return {
        averageScore: null,
        ratingCount: 0,
        judgeRatings: []
    }
    const idNumber = Number(activityPlayerId)
    const variables = {
      activityPlayerId: Number.isNaN(idNumber) ? activityPlayerId : idNumber
    } catch (error) {
      throw error
    }
  },
    this.setData({
      timelineLoading: true,
      timelineError: ''
    })
  // 获取评委评分详情
  async getJudgeRatingDetail(activityPlayerId, judgeId) {
    const query = `
      query ProjectStageTimeline($activityPlayerId: ID!) {
        projectStageTimeline(activityPlayerId: $activityPlayerId) {
          activityId
          activityName
          stages {
            stageId
            stageName
            matchTime
            sortOrder
            participated
            activityPlayerId
            averageScore
            ratingCount
            hasRating
            latestRatingTime
          }
      query GetJudgeRatingDetail($activityPlayerId: ID!, $judgeId: ID!) {
        judgeRatingDetail(activityPlayerId: $activityPlayerId, judgeId: $judgeId) {
          remark
        }
      }
    `
    try {
      const result = await app.graphqlRequest(query, variables)
      const projectStageTimeline = result && result.projectStageTimeline ? result.projectStageTimeline : null
      const stages = projectStageTimeline && projectStageTimeline.stages ? projectStageTimeline.stages : []
      const timeline = stages.map(stage => {
        const hasScore = stage.hasRating && stage.averageScore !== null && stage.averageScore !== undefined
        let scoreText = '未参赛'
        if (stage.participated) {
          scoreText = hasScore ? `平均分:${Number(stage.averageScore).toFixed(2)}` : '未评分'
        }
        return {
          ...stage,
          matchTimeText: stage.matchTime ? this.formatDateTime(stage.matchTime) : '',
          scoreText,
          displayAverageScore: hasScore ? Number(stage.averageScore).toFixed(2) : null,
          isClickable: stage.participated && hasScore && !!stage.activityPlayerId
        }
      })
      this.setData({
        timeline,
        timelineLoading: false
      })
      const result = await app.graphqlRequest(query, { activityPlayerId, judgeId })
      return result.judgeRatingDetail
    } catch (error) {
      console.error('加载阶段时间轴失败:', error)
      this.setData({
        timelineError: error.message || '时间轴加载失败',
        timelineLoading: false
      })
      throw error
    }
  },
  async fetchStageRatingDetail(activityPlayerId) {
    const idNumber = Number(activityPlayerId)
    const variables = {
      activityPlayerId: Number.isNaN(idNumber) ? activityPlayerId : idNumber
    }
    const query = `
      query StageJudgeRatings($activityPlayerId: ID!) {
        stageJudgeRatings(activityPlayerId: $activityPlayerId) {
          activityPlayerId
          stageId
          stageName
          matchTime
          ratingCount
          averageScore
          judgeRatings {
            judgeId
            judgeName
            totalScore
            feedback
            ratingTime
          }
        }
      }
    `
    const result = await app.graphqlRequest(query, variables)
    const detail = result && result.stageJudgeRatings ? result.stageJudgeRatings : null
    const sourceJudgeRatings = detail && detail.judgeRatings ? detail.judgeRatings : []
    const judgeRatings = sourceJudgeRatings.map(item => ({
      ...item,
      totalScoreText: item.totalScore !== null && item.totalScore !== undefined ? `${Number(item.totalScore).toFixed(2)}分` : '未评分',
      ratingTimeText: item.ratingTime ? this.formatDateTime(item.ratingTime) : ''
    }))
    const averageScoreValue = detail && detail.averageScore !== undefined && detail.averageScore !== null
      ? detail.averageScore
      : null
    return {
      activityPlayerId: detail && detail.activityPlayerId ? detail.activityPlayerId : variables.activityPlayerId,
      stageId: detail && detail.stageId ? detail.stageId : null,
      stageName: detail && detail.stageName ? detail.stageName : '阶段信息',
      matchTime: detail && detail.matchTime ? detail.matchTime : null,
      matchTimeText: detail && detail.matchTime ? this.formatDateTime(detail.matchTime) : '',
      ratingCount: detail && detail.ratingCount ? detail.ratingCount : 0,
      averageScore: averageScoreValue,
      averageScoreText: averageScoreValue !== null ? Number(averageScoreValue).toFixed(2) : '暂无评分',
      judgeRatings
    }
  },
  async openStageDetail(e) {
    const { playerId } = e.currentTarget.dataset
    const clickable = e.currentTarget.dataset.clickable === true || e.currentTarget.dataset.clickable === 'true'
    const participated = e.currentTarget.dataset.participated === true || e.currentTarget.dataset.participated === 'true'
    if (!playerId || !participated) {
      return
    }
    if (!clickable) {
      wx.showToast({
        title: '暂无评分',
        icon: 'none'
      })
      return
    }
    this.setData({
      showRatingDetail: true,
      ratingDetailLoading: true,
      ratingDetailError: '',
      ratingDetail: { judgeRatings: [] }
    })
    try {
      const detail = await this.fetchStageRatingDetail(playerId)
      this.setData({
        ratingDetail: detail,
        ratingDetailLoading: false
      })
    } catch (error) {
      console.error('加载阶段评分详情失败:', error)
      this.setData({
        ratingDetailError: error.message || '加载失败',
        ratingDetailLoading: false
      })
    }
  },
  closeStageDetail() {
    this.setData({
      showRatingDetail: false,
      ratingDetail: null,
      ratingDetailError: ''
    })
  },
  // 预览文件