Files
tra-app/src/components/points-and-badge/usePointsAndBadge.js
T

151 lines
4.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
完成课程学习 首次完成1分 每天最多获取5分 完成课程学习 crsId 02 完成调用 杨航
完成课程练习 首次完成1分 每天最多获取5分 完成课程练习 crsId 04 完成练习调用 田岩 已完成
通过课程考试 首次完成1分 每天最多获取5分 通过课程考试 crsId 03 通过调用 田岩 已完成
完成考试中心考试 首次完成1分 每天最多获取5分 完成考试中心考试 papersId 05 完成调用 田岩 已完成
完成竞赛PK 每次1分 每天最多获取5分 完成竞赛PK 11 完成调用 田岩 已完成
获取AI问答 次数徽章 06 建立ws完成调用 杨航
通过AI陪练练习 每次1分 每天最多获取5分 通过AI陪练练习 07 通过调用 杨航
通过AI陪练考试 每次1分 每天最多获取5分 通过AI陪练考试 08 通过调用 杨航
签到 每日1积分,
第七天5积分,
第30天20积分,
断签从第一天计算。 签到完成 田岩
*/
import {
addPointsByTask
} from '@/api/pointsAndRank.js'
import {
ref,
nextTick
} from 'vue'
import {
pop_up_time
} from '@/enum';
export default function usePointsAndBadge() {
const badgeRef = ref(null);
const pointsRef = ref(null);
/**
* 处理积分和徽章弹窗逻辑(提取的独立方法)
* @param {number} points - 积分值
* @param {Array} pointsBadges - 积分关联的徽章列表
* @param {Function} complete - 完成回调函数
* @param {any} res - 接口返回数据
*/
const handlePointsBadgePopup = (points, pointsBadges, complete = () => {}, res = {}) => {
// AI问答仅弹徽章弹窗
if (points?.length > 0) {
// 普通场景:先弹积分弹窗,再弹徽章弹窗
pointsRef.value?.open(points, pointsBadges, (status, pointsList, badgesList) => {
pointsRef.value.close();
if(pointsList.length > 0) {
setTimeout(() => {
pointsRef.value?.open(pointsList, badgesList, (status, pointsList,
badgesList) => {
pointsRef.value.close();
// 有徽章则弹徽章弹窗,否则直接完成
if (badgesList?.length > 0) {
nextTick(() => {
setTimeout(() => {
badgeRef.value.open(pointsList,
badgesList, () => {
badgeRef.value.close();
complete(true, '积分获取成功',
res);
});
}, pop_up_time);
});
} else {
complete(true, '积分获取成功', res);
}
});
}, 300)
} else if (badgesList?.length > 0) {
// 有徽章则弹徽章弹窗,否则直接完成
nextTick(() => {
setTimeout(() => {
badgeRef.value.open(pointsList, badgesList, () => {
badgeRef.value.close();
complete(true, '积分获取成功', res);
});
}, pop_up_time);
});
} else {
complete(true, '积分获取成功', res);
}
});
} else if (pointsBadges?.length > 0) {
badgeRef.value.open([], pointsBadges, () => {
badgeRef.value.close();
complete(true, '积分获取成功', res);
});
} else {
complete(false, '积分接口返回数据异常', res);
}
};
/**
* 积分和徽章处理主方法
* @param {string} type - 任务类型(04:课程练习,06:AI问答,其他:普通任务)
* @param {string|null} taskId - 任务ID
* @param {Function} complete - 完成回调(status, message, data
*/
const pointAndBadgesRun = async (type, taskId = '', complete = () => {}) => {
try {
console.log('调用积分接口');
const res = await addPointsByTask({
type,
taskId
});
// 防御性处理:确保res.body存在
if (!res?.body) {
complete(false, '积分接口返回数据异常', res);
return;
}
const {
points,
pointsBadges,
message = ''
} = res.body;
// const points = [{
// "changePoints": 1,
// "message": '学习时长累计1小时'
// },
// {
// "changePoints": 10,
// "message": '完成课程学习'
// }
// ]
// 分支逻辑:按类型处理
switch (type) {
case '04': // 04:课程练习,自定义返回逻辑,不弹弹窗
complete(true, '', res.body); // 补充回调,避免调用方等待
return;
case '06': // 06AI问答,仅弹徽章弹窗
if (pointsBadges?.length > 0) {
handlePointsBadgePopup(points, pointsBadges, complete, res);
} else {
complete(true, '', res);
}
return;
// 其他类型:弹积分+徽章弹窗
default:
handlePointsBadgePopup(points, pointsBadges, complete, res);
return;
}
} catch (error) {
// 细化错误信息:区分网络错误/接口错误
const errorMsg = error?.message || '积分获取失败';
complete(false, `积分获取失败:${errorMsg}`, error);
}
};
return {
pointAndBadgesRun,
handlePointsBadgePopup,
badgeRef,
pointsRef
};
}