151 lines
4.9 KiB
JavaScript
151 lines
4.9 KiB
JavaScript
/**
|
||
完成课程学习 首次完成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': // 06:AI问答,仅弹徽章弹窗
|
||
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
|
||
};
|
||
} |