|
|
import { ref, computed, watch } from 'vue'; import { useLotteryStore } from '../../../store/lottery' // 路径根据实际情况调整
import { drawLottery } from '../../../api/API'; // 导入新的抽奖接口
function getRandomInt(max) { return Math.floor(Math.random() * max); }
const lotteryStore = useLotteryStore(); const winners = computed({ get: () => lotteryStore.winners, set: (val) => lotteryStore.setWinners(val), });
// 用watch监听winners的变化
// watch(winners, (newVal) => {
// console.log('winners', newVal);
// winners.value = newVal;
// });
export function useLotteryEngine(dataManager, renderer3D) { const isLotting = ref(false); const lotteryStore = useLotteryStore(); // 只获取一次
async function executeLottery() { if (isLotting.value) return; isLotting.value = true; dataManager.setLotteryStatus(true); await dataManager.saveData(); changePrize(); // 重置卡片动画
await renderer3D.resetCard([]); // 计算本次应该抽奖的人数
const currentPrizeIndex = dataManager.state.currentPrizeIndex; const prize = dataManager.state.basicData.prizes[currentPrizeIndex]; const luckyUsers = dataManager.state.basicData.luckyUsers[currentPrizeIndex] || []; const remainingPrizeCount = prize.count - luckyUsers.length; // 奖品剩余数量
const basePerCount = dataManager.state.config.EACH_COUNT[currentPrizeIndex] || 1; const actualPerCount = Math.min(basePerCount, remainingPrizeCount); // 取最小值
console.log('executeLottery - currentPrizeIndex:', currentPrizeIndex, 'prize:', prize, 'basePerCount:', basePerCount, 'remainingPrizeCount:', remainingPrizeCount, 'actualPerCount:', actualPerCount); // 请求后端进行抽奖
try { const lotteryData = { gradeId: prize.gradeId, prizeId: prize.prizeId, perWin: basePerCount, remainNum: prize.remainNum }; console.log('请求后端抽奖,参数:', lotteryData); const response = await drawLottery(lotteryData); console.log('response', response); winners.value = response.data.data; console.log('抽奖的winners', winners.value); // winners.value = response.data;
console.log('后端抽奖返回结果:', response); if (response && response.data.data && Array.isArray(response.data.data)) { // 后端返回中奖用户数据
const currentLuckys = response.data.data.map(item => ({ jwcode: item.jwcode, username: item.username })); console.log('后端返回的中奖用户:', currentLuckys); // 生成随机卡片索引用于显示
const totalCards = dataManager.getTotalCards(); let selectedCardIndex = []; for (let i = 0; i < currentLuckys.length; i++) { let cardIndex = getRandomInt(totalCards); while (selectedCardIndex.includes(cardIndex)) { cardIndex = getRandomInt(totalCards); } selectedCardIndex.push(cardIndex); } console.log('executeLottery - selectedCardIndex:', selectedCardIndex, 'currentLuckys:', currentLuckys); dataManager.state.currentLuckys = currentLuckys; // 保存中奖用户到对应奖品
if (!dataManager.state.basicData.luckyUsers[currentPrizeIndex]) { dataManager.state.basicData.luckyUsers[currentPrizeIndex] = []; } dataManager.state.basicData.luckyUsers[currentPrizeIndex].push(...currentLuckys); // 更新轮次信息
dataManager.updateCurrentRound(); // 展示中奖动画
console.log('executeLottery - calling selectCard'); await renderer3D.selectCard?.(selectedCardIndex, currentLuckys); console.log('executeLottery - selectCard completed'); } else { console.error('后端抽奖返回数据格式错误:', response); throw new Error('抽奖失败:后端返回数据格式错误'); } } catch (error) { console.error('抽奖请求失败:', error); // 如果后端请求失败,可以回退到前端随机抽奖逻辑
console.log('回退到前端随机抽奖逻辑'); const totalCards = dataManager.getTotalCards(); const leftUsers = dataManager.state.basicData.leftUsers; let selectedCardIndex = []; let currentLuckys = []; let leftCount = leftUsers.length; // 随机抽取中奖用户和卡片索引
for (let i = 0; i < actualPerCount && leftCount > 0; i++) { const luckyId = getRandomInt(leftCount); const selectedUser = leftUsers.splice(luckyId, 1)[0]; // 确保数据格式一致
currentLuckys.push({ jwcode: selectedUser.jwcode || selectedUser[0] || "", username: selectedUser.username || selectedUser[1] || "", company: selectedUser.company || selectedUser[2] || "PSST" }); leftCount--; let cardIndex = getRandomInt(totalCards); while (selectedCardIndex.includes(cardIndex)) { cardIndex = getRandomInt(totalCards); } selectedCardIndex.push(cardIndex); } console.log('executeLottery - selectedCardIndex:', selectedCardIndex, 'currentLuckys:', currentLuckys); dataManager.state.currentLuckys = currentLuckys; // 保存中奖用户到对应奖品
if (!dataManager.state.basicData.luckyUsers[currentPrizeIndex]) { dataManager.state.basicData.luckyUsers[currentPrizeIndex] = []; } dataManager.state.basicData.luckyUsers[currentPrizeIndex].push(...currentLuckys); // 更新轮次信息
dataManager.updateCurrentRound(); // 展示中奖动画
console.log('executeLottery - calling selectCard'); await renderer3D.selectCard?.(selectedCardIndex, currentLuckys); console.log('executeLottery - selectCard completed'); } // 抽奖完成后更新奖品列表数据
try { await dataManager.updatePrizeList(); console.log('抽奖完成后奖品列表已更新'); } catch (error) { console.error('更新奖品列表失败:', error); } dataManager.setLotteryStatus(false); isLotting.value = false; }
function performLottery() { // 已合并到 executeLottery
}
function changePrize() { // 可根据中奖情况切换奖品
dataManager.updateCurrentPrize(); }
async function resetLottery() { if (isLotting.value) return; dataManager.resetAllData(); renderer3D.addHighlight && renderer3D.addHighlight(); lotteryStore.setLotteryState('idle'); // 直接用
await renderer3D.resetCard([]); await dataManager.resetData(); // 重置轮次
dataManager.state.currentRound = 1; renderer3D.switchScreen && renderer3D.switchScreen('enter'); }
return { isLotting, executeLottery, performLottery, changePrize, resetLottery }; }
|