import { LocalData, getStorage, setStorage, setClass } from '@/utils/global' import store from '../store/store.js'; const url_sync = getApp().globalData.request_url+'/portrait-api/getSync' //获取所有资源接口 const url_confirm = getApp().globalData.request_url+'/portrait-api/getSyncConfirm' //同步结果回送 const url_updateSwap = getApp().globalData.request_url+'/portrait-api/swapUpdate' //更新轮播图 //下载列表 let listBook = [] let listDoc = [] let listVideo = [] let listTheme = [] let listVr = [] //当前下载的个数 let videoIndex = 0 let videochildIndex= 0 let bookIndex = 0 let docIndex = 0 let themeIndex = 0 let vrIndex = 0 //当前下载 成功 的个数 let videodown = 0 let bookdown = 0 let docdown = 0 let themedown = 0 let vrdown = 0 let aiyxliburl="https://qiniu.aiyxlib.com/"; let targetPath ; //存储本地文件路径 let overtime=0; //超时次数 let curVideoDir = 0; //视频子集下载 let backPics = [] //轮播图 let currentSyncNum=0; //总共更新下载资源数 let serialNum=uni.getStorageSync('serialNum')||''; //分类列表 let bookClass let docClass let videoClass let themeClass let vrClass //删除列表 let delBook = [] let delDoc = [] let delVideo = [] let delTheme = [] let delVr = [] //获取所有资源 const Sync = { start: function(){ serialNum=uni.getStorageSync('serialNum')||''; // console.log(777, serialNum) showLoading('正在加载') try{ uni.request({ url:`${url_sync}?serialNumber=${serialNum}`, method: 'POST', success: (res) => { console.log(res) uni.hideLoading() let {errCode, data} = res.data if(errCode == 0){ listBook = data.listBook listDoc = data.listDoc listVideo = data.listVideo listTheme = data.listTheme listVr = data.listVr delBook = data.delEbook delDoc = data.delDoc delTheme = data.delTheme delVr = data.delVr delVideo = data.delVideo let classMap = data.classOrderMap; bookClass = classMap[0] ? classMap[0] : []; docClass = classMap[1] ? classMap[1] : []; videoClass = classMap[2] ? classMap[2] : []; themeClass = classMap[3] ? classMap[3] : []; vrClass = classMap[4] ? classMap[4] : []; //当前下载 成功 的个数 videodown = 0 bookdown = 0 docdown = 0 themedown = 0 vrdown = 0 //当前下载到第几个 videoIndex = 0 videochildIndex= 0 bookIndex = 0 docIndex = 0 themeIndex = 0 vrIndex = 0 aiyxliburl=data.url currentSyncNum=data.currentSyncNum console.log(aiyxliburl) // console.log('2222', JSON.stringify(classMap)) //删除 delRes() //正式存储 syncQueue() }else{ uni.showToast({ title: '资源请求失败', icon:'none', duration: 2500 }); } }, fail: (e) => { console.log('fail: ', e) uni.hideLoading() uni.showToast({ title: '接口请求失败', icon:'none', duration: 2000 }); } }) }catch(e){ console.log(e) } } } function syncQueue() { // console.log(bookIndex, docIndex,themeIndex,vrIndex,videoIndex) if(bookIndex < listBook.length ){ showLoading('获取图书:' + (bookIndex) + ' / ' + listBook.length) targetPath = "_doc/book/"; getResource(listBook[bookIndex],0) }else if(docIndex < listDoc.length ){ showLoading('获取阅文:' + (docIndex) + ' / ' + listDoc.length) targetPath = "_doc/doc/"; getResource(listDoc[docIndex],1) }else if(themeIndex < listTheme.length){ showLoading('获取阅刊: ' + (themeIndex) + ' / ' + listTheme.length) targetPath = "_doc/theme/"; getResource(listTheme[themeIndex],3) }else if(vrIndex < listVr.length){ showLoading('获取VR: ' + (vrIndex) + ' / ' + listVr.length) targetPath = "_doc/theme/"; getResource(listVr[vrIndex],4) }else if(videoIndex < listVideo.length){ targetPath = "_doc/video/"; getResource(listVideo[videoIndex],2) } else{ uni.hideLoading() //更新轮播图 updateSwap() } } //下载封面 function getResource(resList,savetype) { const that = this; let coverState=resList.coverState||resList.coverCollectionState; console.log("coverState: " + coverState); if(!coverState && resList.cover){ let onurl=aiyxliburl+resList.cover; // console.log("onurl: " + onurl); try { let dtask = plus.downloader.createDownload( onurl, { filename: targetPath }, function (d, status) { if (status==200) { resList.cover = resList.cover.split(".")[0]+".jpg"; console.log("Download success: " + resList.cover); switch(savetype){ case 0://读书 bookIndex++; bookdown++; store.commit("bookData", bookdown); store.commit("bookFalse", listBook.length-bookdown); break; case 1://阅文 docIndex++; docdown++; store.commit("docData", docdown); store.commit("docFalse", listDoc.length-docdown); break; case 3://阅刊 themeIndex++; themedown++; store.commit("themeData", themedown); store.commit("themeFalse", listTheme.length-themedown); break; case 4://vr vrIndex++; vrdown++; store.commit("vrData", vrdown); store.commit("vrFalse", listVr.length-vrdown); break; case 2://视频 videoIndex++; break; } if(savetype == 2){ curVideoDir = 0 resList.coverCollectionState = true; // console.log(resList); getVideoDirectory(resList) }else{ resList.coverState = true; syncPush(resList,savetype) syncQueue() } } else { syncQueue() if(savetype == 2){ let videofalse=store.state.videofalse+resList.directory.length; store.commit("videoFalse", videofalse); } console.log("Download failed: " + status); } } ); dtask.start(); } catch (error) { syncQueue() console.log("Download failed: " + error); } }else{ switch(savetype){ case 0://读书 bookIndex++; break; case 1://阅文 docIndex++; break; case 3://阅刊 themeIndex++; break; case 4://vr vrIndex++; break; case 2://视频 videoIndex++; break; } console.log(coverState ); syncQueue() // resList.localCover =targetPath+resList.cover; } } //同步推送下载 function syncPush(entity,savetype) { // console.log(entity) let param = { belongVideoName: entity.name, //(父)资源名称 coverState: entity.coverState||entity.coverCollectionState, //封面下载状况 failType: 0, //失败类别 0成功 1失败 2超时 ok: true, //(是否操作成功) fileName:entity.cover, //封面地址 resourceId: entity.baseId, //资源id sn: serialNum, //设备序列号 state: 1, //1.编辑 2.删除 classId:entity.classId, //资源类型 typeId: savetype,//资源类别 0图书 1阅文 2视频 3阅刊 4vr (子视频不填) videoState: entity.videoCollectionState||""//视频是否下载(子视频是否全部下载) } // console.log(param) syncRequest(param,entity,savetype) } //同步推送下载子视频 function syncPushvideo(entity,viedochild,type) { // console.log(entity,viedochild) if(type==0){ videodown++; store.commit("videoData", videodown); }else{ store.state.videofalse++; } let reason type==0 ? reason="" : type==1 ? reason="失败" : reason="超时" let param = { belongVideoName: entity.name, //(父)资源名称 coverState: viedochild.coverState, //封面下载状况 failType: type, //失败类别 0成功 1失败 2超时 fileName:viedochild.cover, //封面地址 lastWrongReason: reason, ok: true, //(是否操作成功) resourceId: entity.baseId, //资源id sn: serialNum, //设备序列号 state: 1, //1.编辑 2.删除 videoId: viedochild.id,//子视频资源id videoName: viedochild.name, //子视频名称 belongId: viedochild.belongId,//父集合资源id videoState: viedochild.videoState//视频是否下载(子视频是否全部下载) } console.log(param) syncRequest(param,entity,6) } //同步接口请求 function syncRequest(param,entity,savetype) { uni.request({ url:url_confirm, data:param, method: 'POST', success: (res) => { console.log(res) if(res.data.errCode==0){ switch(savetype){ case 0: LocalData.book=categoryFiles(LocalData.book, entity, bookClass) // console.log('存进分类书列表:', LocalData.book) break; case 1: LocalData.doc=categoryFiles(LocalData.doc, entity, docClass) break; case 3: LocalData.theme=categoryFiles(LocalData.theme, entity, themeClass) break; case 4: LocalData.vr=categoryFiles(LocalData.vr, entity, vrClass) break; case 2: LocalData.video=categoryFiles(LocalData.video, entity, videoClass) break; } setStorage(LocalData) // console.log(LocalData) console.log('向后台返回成功') }else{ console.log(res.data.errMsg) } }, fail: (err) => { uni.hideLoading() uni.showToast({ title: '推送失败: ' + err, icon:none, duration: 2000 }) } }) } //存进分类列表 function categoryFiles(locData, curData, classArray) { // console.log("存进分类",locData) if(locData.length < 1||locData==null){ locData.push({id:0, name: '全部', order: -1, list:[]}) classArray.forEach((classItem) => { classItem.list=[]; locData.push(classItem) }) console.log(locData) categoryFiles(locData, curData, classArray) }else{ locData.forEach((classItem) => { if(curData.classId==classItem.id){ classItem.list.push(curData) // console.log(classItem.list) } if(classItem.id==0){ classItem.list.push(curData) // console.log(classItem) } }) } locData = locData.sort((a,b) => { return a.order < b.order }) return locData } function getVideoDirectory (video) { let directory = video.directory // console.log("directory", directory) if(video.videoCollectionState){ console.log(videoIndex) syncQueue() return ; } curVideoDir++; if(curVideoDir <= directory.length){ console.log(386) showLoading('获取视频:' + ((videoIndex-1)*1+((curVideoDir/directory.length).toFixed(1))*1) +'/ ' + listVideo.length) getFile(video, directory[curVideoDir-1]) return } uni.hideLoading() video.videoCollectionState=video.directory.every((x)=> { return x.videoState; }); console.log("402--", video.videoCollectionState) syncPush(video,2) syncQueue() } //下载视频子集封面 function getFile (video, dir) { if(dir.cover && !dir.coverState){ let onurl=aiyxliburl+dir.cover; try { let dtask = plus.downloader.createDownload( onurl, { filename: targetPath }, function (d, status) { // console.log(d.filename, status); // 下载完成 if (status==200) { dir.cover = dir.cover.split(".")[0]+".jpg"; dir.coverState = true; // console.log("Download success: " + listVideo[videoIndex].directory[curVideoDir].localCover); } else {dir.localCover ="";} } ); dtask.start(); } catch (error) { dir.localCover =""; console.log("Download failed: " + error); } } if(dir.url && !dir.videoState){ // console.log('dlVideo', dir.url) let p1 = new Promise((resolve, reject) => { getFilevideo (video, dir,resolve) }); let p2 = new Promise((resolve, reject) => { setTimeout(function () { resolve(2); }, 600000); }); Promise.race([p1, p2]).then( (data) => { if (data == 2) { //超时计次,跳过 that.overtime++; if (that.overtime > 2) { // 超时3次,退出更新? store.commit("falsepop", true); }else{ getVideoDirectory(video) syncPushvideo(video,dir,2) } } // console.log(data); }, (err) => { console.log(err); } ); }else{ getVideoDirectory(video) } } //下载视频子集 function getFilevideo (video, dir,resolve) { console.log("下载视频子集",curVideoDir) let onurl=aiyxliburl+dir.url; try { let dtask = plus.downloader.createDownload( onurl, { filename: targetPath }, function (d, status) { console.log(d.filename, status); resolve(1); //下载成功返回Promise状态 // 下载完成 if (status==200) { dir.localUrl = d.filename; dir.videoState = true; // console.log("Download: " ,video.directory[curVideoDir]); getVideoDirectory(video) syncPushvideo(video,dir,0) } else { dir.localUrl ="" getVideoDirectory(video) syncPushvideo(video,dir,1) } } ); dtask.start(); } catch (error) { dir.localUrl ="" getVideoDirectory(video) console.log("Download failed: " + error); } } function updateSwap() { // showLoading('同步轮播图...') uni.request({ url:`${url_updateSwap}?sn=${serialNum}`, method: 'POST', success: (res) => { // console.log(res) if(res.data.errCode == 0){ let {data, h5ReaderUrl} = res.data console.log(res.data) uni.setStorageSync('deviceTitle', data.title) uni.setStorageSync('h5ReaderUrl', h5ReaderUrl) curVideoDir = 0; if(data.bgUrls!=null){ backPics = [] getSwapPic(data.bgUrls) }else{ if(currentSyncNum){ store.commit("downpop", true); }else{ uni.showToast({ title: '已有全部最新资源~', icon:'none', duration: 3000 }); } } } }, fail: (err) => { uni.showToast({ title:'轮播图同步失败', icon:'none' }) } }) } function getSwapPic(pics) { if(curVideoDir < pics.length){ showLoading('更新轮播图' + (curVideoDir + 1) + ' / ' + pics.length) let onurl = pics[curVideoDir] let bantPath="_doc/theme/"; try { let dtask = plus.downloader.createDownload( onurl, { filename: bantPath }, function (d, status) { if (status==200) { backPics.push(d.filename) curVideoDir ++ getSwapPic(pics) uni.hideLoading() } else { getSwapPic(pics) console.log("Download failed: " + status); } } ); dtask.start(); } catch (error) { getSwapPic(pics) console.log("Download failed: " + error); } }else{ // console.log('9999', backPics) uni.setStorageSync('backPics', backPics) if(currentSyncNum){ store.commit("downpop", true); }else{ uni.showToast({ title: '轮播图已更新', icon:'none', duration: 3000 }); } } } //删除 function delRes() { console.log('删除') if(delBook && delBook.length > 0){ console.log(delBook) delResObject(LocalData.book, delBook,0) } if(delDoc && delDoc.length > 0){ // console.log(delDoc) delResObject(LocalData.doc, delDoc,1) } if(delTheme && delTheme.length > 0){ delResObject(LocalData.theme, delTheme,3) } if(delVr && delVr.length > 0){ delResObject(LocalData.vr, delVr,4) } if(delVideo && delVideo.length > 0){ delResObject(LocalData.video, delVideo,2) } } function delResObject(locallist, items,savetype){ let classindex; let listindex; console.log(items) items.forEach((arr, num)=>{ locallist.forEach((x, index)=>{ if(x.id==arr.classId){ classindex=index; x.list.forEach((y, ind, b)=>{ if(y.baseId==arr.resourceId){ listindex=ind; locallist[classindex].list.splice(listindex,1) // console.log(locallist) // setStorage(LocalData) syncPushdel(items,savetype) } }) } }) locallist[0].list.forEach((x, index)=>{ if(x.baseId==arr.resourceId){ locallist[0].list.splice(index,1) // debugger // console.log(index,LocalData.book) setStorage(LocalData) } }) }) } //同步推送删除 function syncPushdel(entity,savetype) { let param = { belongVideoName: entity.name||"", //(父)资源名称 coverState: entity.coverState||entity.coverCollectionState, //封面下载状况 failType: 0, //失败类别 0成功 1失败 2超时 fileName:entity.fileName, //封面地址 ok: true, //(是否操作成功) resourceId: entity.resourceId, //资源id sn: serialNum, //设备序列号 state: 2, //1.编辑 2.删除 classId:entity.classId, //资源类型 typeId: savetype, videoState: true,//视频是否下载(子视频是否全部下载) } // console.log(param) uni.request({ url:url_confirm, data:param, method: 'POST', success: (res) => { console.log(res) if(res.data.errCode==0){ setStorage(LocalData) }else{ console.log(res.data.errMsg) } }, fail: (err) => { console.log(err) } }) } const showLoading = function(str) { uni.showLoading({ title:str, mask:true }) } export { Sync, delRes }