- admin:OrdersHub/UsersHub、Commerce/Ops/Enterprise Hub、MpAnalytics、Feishu/小程序配置面板、鉴权存储 - api:Analytics、DataMigration、FeishuLeadWebhook、mp 事件迁移 SQL - 微信/抖音小程序:analytics 上报与相关页面调整 - 开发文档与 scripts 补充 Made-with: Cursor
144 lines
3.8 KiB
JavaScript
144 lines
3.8 KiB
JavaScript
// pages/test/pdp.js
|
|
const { pdpQuestions, shuffleQuestions } = require('../../utils/questions')
|
|
const { pdpDescriptions } = require('../../utils/descriptions')
|
|
const app = getApp()
|
|
|
|
Page({
|
|
data: {
|
|
questions: [],
|
|
currentIndex: 0,
|
|
currentQuestion: null,
|
|
answers: {},
|
|
selectedAnswer: null,
|
|
total: pdpQuestions.length,
|
|
answeredCount: 0,
|
|
progress: 0,
|
|
timeRemaining: 15 * 60,
|
|
formatTime: '15:00',
|
|
isSubmitting: false
|
|
},
|
|
|
|
timer: null,
|
|
|
|
onLoad() {
|
|
const questions = shuffleQuestions(pdpQuestions)
|
|
this.setData({ questions, currentQuestion: questions[0] })
|
|
this.startTimer()
|
|
},
|
|
|
|
onUnload() {
|
|
if (this.timer) clearInterval(this.timer)
|
|
},
|
|
|
|
startTimer() {
|
|
this.timer = setInterval(() => {
|
|
let time = this.data.timeRemaining - 1
|
|
if (time <= 0) {
|
|
clearInterval(this.timer)
|
|
this.submitTest()
|
|
return
|
|
}
|
|
const minutes = Math.floor(time / 60)
|
|
const seconds = time % 60
|
|
this.setData({
|
|
timeRemaining: time,
|
|
formatTime: `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`
|
|
})
|
|
}, 1000)
|
|
},
|
|
|
|
getEmoji(value) {
|
|
const emojis = { Tiger: '🐅', Peacock: '🦚', Koala: '🐨', Owl: '🦉', Chameleon: '🦎' }
|
|
return emojis[value] || '🔹'
|
|
},
|
|
|
|
selectAnswer(e) {
|
|
const value = e.currentTarget.dataset.value
|
|
const questionId = this.data.currentQuestion.id
|
|
let answers = { ...this.data.answers }
|
|
answers[questionId] = value
|
|
|
|
this.setData({
|
|
selectedAnswer: value,
|
|
answers: answers,
|
|
answeredCount: Object.keys(answers).length,
|
|
progress: (Object.keys(answers).length / this.data.total) * 100
|
|
})
|
|
|
|
setTimeout(() => {
|
|
if (this.data.currentIndex < this.data.total - 1) {
|
|
this.nextQuestion()
|
|
} else {
|
|
this.submitTest()
|
|
}
|
|
}, 300)
|
|
},
|
|
|
|
prevQuestion() {
|
|
if (this.data.currentIndex > 0) {
|
|
const newIndex = this.data.currentIndex - 1
|
|
const newQuestion = this.data.questions[newIndex]
|
|
this.setData({
|
|
currentIndex: newIndex,
|
|
currentQuestion: newQuestion,
|
|
selectedAnswer: this.data.answers[newQuestion.id] || null
|
|
})
|
|
}
|
|
},
|
|
|
|
nextQuestion() {
|
|
if (this.data.currentIndex < this.data.total - 1) {
|
|
const newIndex = this.data.currentIndex + 1
|
|
const newQuestion = this.data.questions[newIndex]
|
|
this.setData({
|
|
currentIndex: newIndex,
|
|
currentQuestion: newQuestion,
|
|
selectedAnswer: this.data.answers[newQuestion.id] || null
|
|
})
|
|
}
|
|
},
|
|
|
|
submitTest() {
|
|
if (this.data.isSubmitting) return
|
|
if (this.timer) {
|
|
clearInterval(this.timer)
|
|
this.timer = null
|
|
}
|
|
this.setData({ isSubmitting: true })
|
|
|
|
const scores = { Tiger: 0, Peacock: 0, Koala: 0, Owl: 0, Chameleon: 0 }
|
|
Object.values(this.data.answers).forEach(value => {
|
|
if (scores.hasOwnProperty(value)) scores[value]++
|
|
})
|
|
|
|
const total = Object.values(scores).reduce((sum, v) => sum + v, 0)
|
|
const percentages = {}
|
|
Object.keys(scores).forEach(key => {
|
|
percentages[key] = Math.round((scores[key] / total) * 100)
|
|
})
|
|
|
|
const dominantType = Object.entries(scores).sort((a, b) => b[1] - a[1])[0][0]
|
|
const secondaryType = Object.entries(scores).sort((a, b) => b[1] - a[1])[1][0]
|
|
|
|
const resultData = {
|
|
scores,
|
|
percentages,
|
|
dominantType,
|
|
secondaryType,
|
|
description: pdpDescriptions[dominantType],
|
|
testDuration: 15 * 60 - this.data.timeRemaining,
|
|
completedAt: new Date().toISOString(),
|
|
// 便于后端留存完整答题过程
|
|
answers: this.data.answers
|
|
}
|
|
|
|
// 本地缓存 + 全局缓存
|
|
wx.setStorageSync('pdpResult', resultData)
|
|
if (app && typeof app.saveTestResult === 'function') {
|
|
app.saveTestResult('pdp', resultData)
|
|
}
|
|
|
|
wx.redirectTo({ url: '/pages/result/pdp' })
|
|
}
|
|
})
|