- Updated user information retrieval to support store-specific points and ladder user data. - Refactored store initialization logic to prioritize last selected store. - Improved API endpoints for fetching matches and user data, ensuring compatibility with store context. - Adjusted UI components to display store-related information consistently across various pages. - Enhanced error handling and data fetching logic for better user experience.
368 lines
9.5 KiB
JavaScript
368 lines
9.5 KiB
JavaScript
const app = getApp();
|
||
const util = require("../../../utils/util");
|
||
|
||
Page({
|
||
data: {
|
||
userInfo: null,
|
||
ladderUser: null,
|
||
currentStore: null,
|
||
ongoingMatches: [], // 正在进行中的比赛
|
||
pendingGames: [], // 待确认的比赛
|
||
recentMatches: [], // 最近比赛(用于预览前10场)
|
||
},
|
||
|
||
onLoad() {
|
||
this.initData();
|
||
},
|
||
|
||
onShow() {
|
||
this.initData();
|
||
},
|
||
|
||
async onPullDownRefresh() {
|
||
try {
|
||
await this.initData();
|
||
} finally {
|
||
wx.stopPullDownRefresh();
|
||
}
|
||
},
|
||
|
||
async initData() {
|
||
// 检查是否已登录(有 token)
|
||
if (!app.globalData.token) {
|
||
// 未登录,跳转到用户页面进行登录
|
||
wx.switchTab({ url: "/pages/user/index" });
|
||
return;
|
||
}
|
||
|
||
// 每次显示页面时重新获取门店和天梯信息
|
||
try {
|
||
await app.ensureCurrentStore();
|
||
// 如果有门店,获取该门店的天梯信息
|
||
if (app.globalData.currentStore && app.globalData.currentStore.storeId) {
|
||
await app.getLadderUser(app.globalData.currentStore.storeId);
|
||
}
|
||
} catch (e) {
|
||
console.error("获取门店/天梯信息失败:", e);
|
||
}
|
||
|
||
this.refreshData();
|
||
},
|
||
|
||
refreshData() {
|
||
this.setData({
|
||
userInfo: app.globalData.userInfo,
|
||
ladderUser: app.globalData.ladderUser,
|
||
currentStore: app.globalData.currentStore,
|
||
});
|
||
|
||
if (app.globalData.ladderUser) {
|
||
this.fetchOngoingMatches();
|
||
this.fetchPendingGames();
|
||
this.fetchRecentMatches();
|
||
}
|
||
},
|
||
|
||
// 获取正在进行中的比赛
|
||
async fetchOngoingMatches() {
|
||
try {
|
||
const res = await app.request("/api/match/ongoing", {
|
||
store_id: this.data.currentStore
|
||
? this.data.currentStore.storeId
|
||
: null,
|
||
});
|
||
this.setData({ ongoingMatches: res.data || [] });
|
||
} catch (e) {
|
||
console.error("获取进行中比赛失败:", e);
|
||
}
|
||
},
|
||
|
||
// 手动刷新天梯信息
|
||
async refreshLadderInfo() {
|
||
wx.showLoading({ title: "刷新中..." });
|
||
|
||
try {
|
||
// 重新获取门店信息
|
||
await app.ensureCurrentStore();
|
||
|
||
// 重新获取天梯信息
|
||
if (app.globalData.currentStore && app.globalData.currentStore.storeId) {
|
||
await app.getLadderUser(app.globalData.currentStore.storeId);
|
||
}
|
||
|
||
this.refreshData();
|
||
wx.hideLoading();
|
||
|
||
if (app.globalData.ladderUser) {
|
||
wx.showToast({ title: "已加入天梯", icon: "success" });
|
||
} else {
|
||
wx.showToast({ title: "暂未开通天梯", icon: "none" });
|
||
}
|
||
} catch (e) {
|
||
wx.hideLoading();
|
||
console.error("刷新天梯信息失败:", e);
|
||
wx.showToast({ title: "刷新失败", icon: "none" });
|
||
}
|
||
},
|
||
|
||
async fetchPendingGames() {
|
||
try {
|
||
const res = await app.request("/api/match/pending-confirm", {
|
||
store_id: this.data.currentStore
|
||
? this.data.currentStore.storeId
|
||
: null,
|
||
});
|
||
this.setData({ pendingGames: res.data || [] });
|
||
} catch (e) {
|
||
console.error("获取待确认比赛失败:", e);
|
||
}
|
||
},
|
||
|
||
// 获取最近比赛(近7天,最多10场,用于比赛页预览)
|
||
async fetchRecentMatches() {
|
||
try {
|
||
const storeId = this.data.currentStore
|
||
? this.data.currentStore.storeId
|
||
: null;
|
||
const res = await app.request("/api/match/display-list", {
|
||
store_id: storeId,
|
||
days: 7,
|
||
limit: 10,
|
||
});
|
||
const raw = res.data || [];
|
||
const recentMatches = raw.map((item) => {
|
||
const time = item.startTime || item.createdAt || item.endTime || null;
|
||
const stageName = item.stageName || "";
|
||
const statusName = item.statusName || "";
|
||
const showStage = !!stageName && stageName !== statusName;
|
||
|
||
let statusType = "pending";
|
||
switch (item.status) {
|
||
case 1:
|
||
statusType = "ongoing";
|
||
break;
|
||
case 2:
|
||
statusType = "finished";
|
||
break;
|
||
case 3:
|
||
statusType = "cancelled";
|
||
break;
|
||
default:
|
||
statusType = "pending";
|
||
}
|
||
|
||
return Object.assign({}, item, {
|
||
timeText: time ? util.formatDate(time) : "",
|
||
stageName,
|
||
statusName,
|
||
showStage,
|
||
statusType,
|
||
});
|
||
});
|
||
this.setData({ recentMatches });
|
||
} catch (e) {
|
||
console.error("获取最近比赛失败:", e);
|
||
}
|
||
},
|
||
|
||
startChallenge() {
|
||
if (!this.data.ladderUser) {
|
||
wx.showToast({ title: "请先加入天梯系统", icon: "none" });
|
||
return;
|
||
}
|
||
if (!this.data.currentStore || !this.data.currentStore.storeId) {
|
||
wx.showToast({ title: "请先选择门店", icon: "none" });
|
||
wx.navigateTo({ url: "/pages/store/index" });
|
||
return;
|
||
}
|
||
|
||
wx.scanCode({
|
||
onlyFromCamera: false,
|
||
scanType: ["qrCode"],
|
||
success: async (res) => {
|
||
const memberCode = res.result;
|
||
this.checkAndChallenge(memberCode);
|
||
},
|
||
fail: (err) => {
|
||
if (err.errMsg !== "scanCode:fail cancel") {
|
||
wx.showToast({ title: "扫码失败", icon: "none" });
|
||
}
|
||
},
|
||
});
|
||
},
|
||
|
||
async checkAndChallenge(memberCode) {
|
||
wx.showLoading({ title: "检查中..." });
|
||
|
||
try {
|
||
const res = await app.request(
|
||
`/api/match/challenge/check/${memberCode}`,
|
||
{
|
||
store_id: this.data.currentStore.storeId,
|
||
},
|
||
);
|
||
|
||
wx.hideLoading();
|
||
|
||
if (!res.data.canChallenge) {
|
||
wx.showModal({
|
||
title: "无法挑战",
|
||
content: res.data.reason,
|
||
showCancel: false,
|
||
});
|
||
return;
|
||
}
|
||
|
||
// 显示确认弹窗
|
||
const target = res.data.targetUser;
|
||
wx.showModal({
|
||
title: "确认挑战",
|
||
content: `确定要向 ${target.ladderUser.realName}(Lv${target.ladderUser.level}, 战力${target.ladderUser.powerScore}) 发起挑战吗?`,
|
||
success: async (modalRes) => {
|
||
if (modalRes.confirm) {
|
||
await this.createChallenge(memberCode);
|
||
}
|
||
},
|
||
});
|
||
} catch (e) {
|
||
wx.hideLoading();
|
||
console.error("检查挑战失败:", e);
|
||
}
|
||
},
|
||
|
||
async createChallenge(memberCode) {
|
||
wx.showLoading({ title: "发起挑战中..." });
|
||
|
||
try {
|
||
const res = await app.request(
|
||
"/api/match/challenge/create",
|
||
{
|
||
store_id: this.data.currentStore.storeId,
|
||
target_member_code: memberCode,
|
||
},
|
||
"POST",
|
||
);
|
||
|
||
wx.hideLoading();
|
||
wx.showToast({ title: "挑战已发起", icon: "success" });
|
||
|
||
// 跳转到挑战赛详情页面
|
||
if (res.data && res.data.matchId) {
|
||
setTimeout(() => {
|
||
wx.navigateTo({
|
||
url: `/pages/match/challenge-detail/index?id=${res.data.matchId}`,
|
||
});
|
||
}, 1500);
|
||
}
|
||
} catch (e) {
|
||
wx.hideLoading();
|
||
console.error("发起挑战失败:", e);
|
||
const errorMsg =
|
||
e.message || (e.data && e.data.message) || "发起挑战失败";
|
||
wx.showToast({ title: errorMsg, icon: "none", duration: 2000 });
|
||
}
|
||
},
|
||
|
||
joinRankingMatch() {
|
||
if (!this.data.ladderUser) {
|
||
wx.showToast({ title: "请先加入天梯系统", icon: "none" });
|
||
return;
|
||
}
|
||
|
||
wx.scanCode({
|
||
onlyFromCamera: false,
|
||
scanType: ["qrCode"],
|
||
success: async (res) => {
|
||
const matchCode = res.result;
|
||
wx.showLoading({ title: "加入中..." });
|
||
|
||
try {
|
||
const joinRes = await app.request(
|
||
"/api/match/ranking/join",
|
||
{
|
||
match_code: matchCode,
|
||
},
|
||
"POST",
|
||
);
|
||
|
||
wx.hideLoading();
|
||
wx.showToast({ title: "加入成功", icon: "success" });
|
||
|
||
// 跳转到排位赛详情
|
||
wx.navigateTo({
|
||
url: `/pages/match/ranking/index?code=${matchCode}`,
|
||
});
|
||
} catch (e) {
|
||
wx.hideLoading();
|
||
console.error("加入排位赛失败:", e);
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
if (err.errMsg !== "scanCode:fail cancel") {
|
||
wx.showToast({ title: "扫码失败", icon: "none" });
|
||
}
|
||
},
|
||
});
|
||
},
|
||
|
||
goToStore() {
|
||
wx.navigateTo({ url: "/pages/store/index" });
|
||
},
|
||
|
||
// 跳转到最近比赛列表页
|
||
goToRecentMatches() {
|
||
wx.navigateTo({ url: "/pages/match/recent/index" });
|
||
},
|
||
|
||
// 跳转到比赛详情
|
||
goToMatchDetail(e) {
|
||
const match = e.currentTarget.dataset.match;
|
||
if (match.type === 1) {
|
||
// 挑战赛详情
|
||
wx.navigateTo({
|
||
url: `/pages/match/challenge-detail/index?id=${match.id}`,
|
||
});
|
||
} else {
|
||
// 排位赛详情
|
||
wx.navigateTo({
|
||
url: `/pages/match/ranking/index?code=${match.matchCode}`,
|
||
});
|
||
}
|
||
},
|
||
|
||
confirmGame(e) {
|
||
const game = e.currentTarget.dataset.game;
|
||
|
||
wx.showModal({
|
||
title: "确认比分",
|
||
content: `确认比分 ${game.myScore} : ${game.opponentScore} 吗?`,
|
||
confirmText: "确认",
|
||
cancelText: "有争议",
|
||
success: async (res) => {
|
||
wx.showLoading({ title: "处理中..." });
|
||
|
||
try {
|
||
await app.request(
|
||
"/api/match/challenge/confirm-score",
|
||
{
|
||
game_id: game.id,
|
||
confirm: res.confirm,
|
||
},
|
||
"POST",
|
||
);
|
||
|
||
wx.hideLoading();
|
||
wx.showToast({
|
||
title: res.confirm ? "确认成功" : "已标记争议",
|
||
icon: "success",
|
||
});
|
||
this.fetchPendingGames();
|
||
} catch (e) {
|
||
wx.hideLoading();
|
||
console.error("确认比分失败:", e);
|
||
}
|
||
},
|
||
});
|
||
},
|
||
});
|