智慧画屏客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

691 lines
17 KiB

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
}