|
@@ -0,0 +1,246 @@
|
|
|
|
+import {
|
|
|
|
+ useUserCache
|
|
|
|
+} from "@/utils/userCache.js"
|
|
|
|
+import * as kcApi from "@/api/kecheng.js"
|
|
|
|
+
|
|
|
|
+export function useKechengTools() {
|
|
|
|
+ const {
|
|
|
|
+ saveCache,
|
|
|
|
+ getCache,
|
|
|
|
+ removeCache
|
|
|
|
+ } = useUserCache();
|
|
|
|
+
|
|
|
|
+ function getCurKjIndex(kjId, operId) {
|
|
|
|
+ const arrKecheng = getKechengDataFromHistory(operId);
|
|
|
|
+ for (let zi = 0; zi < arrKecheng.length; zi++) {
|
|
|
|
+ for (let ji = 0; ji < arrKecheng[zi].jieList.length; ji++) {
|
|
|
|
+ if (arrKecheng[zi].jieList[ji].kejianList.some(kj => kj.kjId == kjId)) {
|
|
|
|
+ return {
|
|
|
|
+ zhangIndex: zi,
|
|
|
|
+ jieIndex: ji
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function mergeProgress(backData, historyData) {
|
|
|
|
+ const curData = JSON.parse(JSON.stringify(historyData));
|
|
|
|
+ backData.forEach((item, zhangIndex) => {
|
|
|
|
+ item.jieList.forEach((jieItem, jieIndex) => {
|
|
|
|
+ jieItem.kejianList.forEach((kjItem, kjIndex) => {
|
|
|
|
+ const backCurJie = backData[zhangIndex].jieList[jieIndex].kejianList[
|
|
|
|
+ kjIndex];
|
|
|
|
+
|
|
|
|
+ // 大于等于100 的进度以后台为准
|
|
|
|
+ if (kjItem.maxProcess >= 100) {
|
|
|
|
+ curData[zhangIndex].jieList[jieIndex].kejianList[kjIndex] = backCurJie;
|
|
|
|
+ } else if (curData[zhangIndex].jieList[jieIndex].kejianList[kjIndex]
|
|
|
|
+ .maxProcess == 100) {
|
|
|
|
+ // 前台缓存进度为100 使用后台进度
|
|
|
|
+ // alert('前台缓存进度为100 使用后台进度')
|
|
|
|
+ curData[zhangIndex].jieList[jieIndex].kejianList[kjIndex] = backCurJie;
|
|
|
|
+ }
|
|
|
|
+ curData[zhangIndex].jieList[jieIndex].kejianList[kjIndex].lockFlag =
|
|
|
|
+ backCurJie.lockFlag;
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+ return curData;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function saveKechengData(operId, data) {
|
|
|
|
+ saveCache('SectionInfo' + operId, 'arrKecheng', data)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getKechengDataFromHistory(operId) {
|
|
|
|
+ return getCache('SectionInfo' + operId, 'arrKecheng')
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function saveKechengSectionPage(operId, data) {
|
|
|
|
+ saveCache('SectionInfo' + operId, 'sectionPage', data)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getKechengSectionPageFromHistory(operId) {
|
|
|
|
+ return getCache('SectionInfo' + operId, 'sectionPage')
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function initCourseProgressAll(operId) {
|
|
|
|
+ let arrKecheng = getCache('SectionInfo' + operId, 'arrKecheng');
|
|
|
|
+ // 判断是否有课程信息
|
|
|
|
+ if (!arrKecheng || arrKecheng.length === 0) {
|
|
|
|
+ throw new Error('initCourseProgress业务逻辑错误: arrKecheng 异常');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (const chapter of arrKecheng) {
|
|
|
|
+ for (const section of chapter.jieList) {
|
|
|
|
+ let kejianArr = section.kejianList;
|
|
|
|
+ if (kejianArr && kejianArr.length > 0) {
|
|
|
|
+ for (const kejian of kejianArr) {
|
|
|
|
+ if (!kejian.maxProcess) {
|
|
|
|
+ kejian.curProcess = 0;
|
|
|
|
+ kejian.maxProcess = 0;
|
|
|
|
+ kejian.hasFinished = false;
|
|
|
|
+ } else if (kejian.maxProcess < 100) {
|
|
|
|
+ kejian.hasFinished = false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ saveCache('SectionInfo' + operId, 'arrKecheng', arrKecheng);
|
|
|
|
+ return arrKecheng;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function saveCourseProgress(cur, total, operId, code, type) {
|
|
|
|
+ let sectionPage = getCache('SectionInfo' + operId, 'sectionPage');
|
|
|
|
+ let arrKecheng = getCache('SectionInfo' + operId, 'arrKecheng');
|
|
|
|
+
|
|
|
|
+ let section = arrKecheng[sectionPage.iChapter].jieList[sectionPage.iSection];
|
|
|
|
+
|
|
|
|
+ for (const kejian of section.kejianList) {
|
|
|
|
+ if (kejian.kjId === sectionPage.kjId) {
|
|
|
|
+ // video或audio的end为100,其他情况最大99
|
|
|
|
+ if (code === 'end') {
|
|
|
|
+ kejian['curProcess'] = 100;
|
|
|
|
+ kejian['maxProcess'] = 100;
|
|
|
|
+ } else if (type === 'other') {
|
|
|
|
+ // 除了音视频以外的课件
|
|
|
|
+ kejian['curProcess'] = 100;
|
|
|
|
+ kejian['maxProcess'] = 100;
|
|
|
|
+ } else {
|
|
|
|
+ // 0 ~ 99
|
|
|
|
+ kejian['curProcess'] = parseInt(cur / total * 100) >= 100 ?
|
|
|
|
+ 99 :
|
|
|
|
+ parseInt(cur / total * 100);
|
|
|
|
+
|
|
|
|
+ kejian['maxProcess'] = kejian['curProcess'] > kejian['maxProcess'] ?
|
|
|
|
+ kejian['curProcess'] :
|
|
|
|
+ kejian['maxProcess'];
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ saveCache('SectionInfo' + operId, 'arrKecheng', arrKecheng);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function getCourseProgress(total) {
|
|
|
|
+ let sectionPage = getCache('SectionInfo', 'sectionPage');
|
|
|
|
+ let arrKecheng = getCache('SectionInfo', 'arrKecheng');
|
|
|
|
+ let section = getSection(arrKecheng, sectionPage.iChapter, sectionPage.iSection);
|
|
|
|
+
|
|
|
|
+ for (const kejian of section.kejianList) {
|
|
|
|
+ if (kejian.kjId === sectionPage.kjId) {
|
|
|
|
+ return {
|
|
|
|
+ cur: total * parseFloat(kejian['curProcess']) / 100,
|
|
|
|
+ max: total * parseFloat(kejian['maxProcess']) / 100,
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function updateSectionProgress(operId, code, type, callback) {
|
|
|
|
+
|
|
|
|
+ let sectionPage = getCache('SectionInfo' + operId, 'sectionPage');
|
|
|
|
+ let arrKecheng = getCache('SectionInfo' + operId, 'arrKecheng');
|
|
|
|
+
|
|
|
|
+ if (sectionPage && sectionPage.finish) {
|
|
|
|
+ console.log('已经结束,不再保存进度')
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let kejianList = arrKecheng[sectionPage.iChapter].jieList[sectionPage.iSection].kejianList;
|
|
|
|
+ let kejianIndex = kejianList.findIndex(item => item.kjId === sectionPage.kjId);
|
|
|
|
+
|
|
|
|
+ const optX = {
|
|
|
|
+ zhangIndex: sectionPage.iChapter,
|
|
|
|
+ jieIndex: sectionPage.iSection,
|
|
|
|
+ kejianIndex: kejianIndex,
|
|
|
|
+ kjId: sectionPage.kjId,
|
|
|
|
+ operId: sectionPage.operId,
|
|
|
|
+ process: kejianList[kejianIndex].maxProcess,
|
|
|
|
+ customLoadingSwitch: false,
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ saveCache('SectionInfo' + operId, 'arrKecheng', arrKecheng);
|
|
|
|
+ const saveOpt = {
|
|
|
|
+ kejianList: kejianList,
|
|
|
|
+ kejianIndex: kejianIndex,
|
|
|
|
+ arrKecheng: arrKecheng,
|
|
|
|
+ optX: optX,
|
|
|
|
+ };
|
|
|
|
+ // 音视频end
|
|
|
|
+ if (code === 'end') {
|
|
|
|
+ kcApi.getClientKechengSave(optX).then(res => {
|
|
|
|
+ // 接口正常执行
|
|
|
|
+ if (res.code === 0) {
|
|
|
|
+ // 音视频end事件
|
|
|
|
+ kejianList[kejianIndex].curProcess = 100;
|
|
|
|
+ kejianList[kejianIndex].maxProcess = 100;
|
|
|
|
+ arrKecheng[optX.zhangIndex].jieList[optX.jieIndex].kejianList[optX.kejianIndex]
|
|
|
|
+ .hasFinished = true;
|
|
|
|
+ saveCache('SectionInfo' + operId, 'arrKecheng', arrKecheng);
|
|
|
|
+ if (res.data.finish === true) {
|
|
|
|
+ // 整个课程学完 data为true
|
|
|
|
+ uni.showToast({
|
|
|
|
+ title: "课程已学完!"
|
|
|
|
+ })
|
|
|
|
+ sectionPage.finish = true;
|
|
|
|
+ saveCache('SectionInfo' + operId, 'sectionPage', sectionPage);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ saveInterfaceAbnormal(saveOpt, 99);
|
|
|
|
+ callback(99)
|
|
|
|
+ }
|
|
|
|
+ }).catch(err => {
|
|
|
|
+ saveInterfaceAbnormal(saveOpt, 99);
|
|
|
|
+ callback(99)
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ // 其他情况(音视频一秒一保存)
|
|
|
|
+ getTskcSave(optX).then(res => {
|
|
|
|
+ if (res.code === 0) {
|
|
|
|
+ if (res.data.finish === true) {
|
|
|
|
+ uni.showToast({
|
|
|
|
+ title: "课程已学完!"
|
|
|
|
+ })
|
|
|
|
+ sectionPage.finish = true;
|
|
|
|
+ saveCache('SectionInfo' + operId, 'sectionPage', sectionPage);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function saveInterfaceAbnormal(saveOpt, jindu) {
|
|
|
|
+ const {
|
|
|
|
+ kejianList,
|
|
|
|
+ kejianIndex,
|
|
|
|
+ arrKecheng,
|
|
|
|
+ optX,
|
|
|
|
+ operId
|
|
|
|
+ } = saveOpt;
|
|
|
|
+ kejianList[kejianIndex].curProcess = jindu;
|
|
|
|
+ kejianList[kejianIndex].maxProcess = jindu;
|
|
|
|
+ arrKecheng[optX.zhangIndex].jieList[optX.jieIndex].kejianList[optX.kejianIndex].hasFinished = false;
|
|
|
|
+ saveCache('SectionInfo' + operId, 'arrKecheng', arrKecheng);
|
|
|
|
+ uni.redirectTo({
|
|
|
|
+ url:"/pages/client/Kecheng/list"
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return {
|
|
|
|
+ getCurKjIndex,
|
|
|
|
+ saveKechengData,
|
|
|
|
+ getKechengDataFromHistory,
|
|
|
|
+ saveKechengSectionPage,
|
|
|
|
+ getKechengSectionPageFromHistory,
|
|
|
|
+ mergeProgress,
|
|
|
|
+ initCourseProgressAll,
|
|
|
|
+ saveCourseProgress,
|
|
|
|
+ getCourseProgress,
|
|
|
|
+ updateSectionProgress,
|
|
|
|
+ saveInterfaceAbnormal
|
|
|
|
+ }
|
|
|
|
+}
|