// packageBookService/pages/bookServices/detail/buyResource/index.js
|
const app = getApp();
|
Page({
|
/**
|
* 页面的初始数据
|
*/
|
data: {
|
barHeight: "",
|
navBarHeight: "",
|
learn: [],
|
openLearnids: [],
|
bookId: "",
|
loading: true,
|
shoppingList: [],
|
shoppingCartGetId: [],
|
methodId: [],
|
paymentPage: false,
|
superior: false,
|
checkAllState: true,
|
productLinkPath: '',
|
refCode: '',
|
haider: false
|
},
|
|
/**
|
* 生命周期函数--监听页面加载
|
*/
|
onLoad(options) {
|
this.getBookInfo(options.bookId);
|
const systInfo = wx.getSystemInfoSync();
|
const menu = wx.getMenuButtonBoundingClientRect(); // 胶囊信息
|
const navBarHeight =
|
(menu.top - systInfo.statusBarHeight) * 2 + menu.height; // 导航栏高度
|
this.setData({
|
barHeight: systInfo.statusBarHeight,
|
navBarHeight: navBarHeight,
|
bookId: options.bookId,
|
productLinkPath: options.productLinkPath,
|
refCode: options.refCode
|
});
|
this.getResourceClass();
|
this.getShoppingCartProductGet();
|
},
|
|
/**
|
* 生命周期函数--监听页面初次渲染完成
|
*/
|
onReady() {},
|
|
/**
|
* 生命周期函数--监听页面显示
|
*/
|
onShow() {},
|
|
/**
|
* 生命周期函数--监听页面隐藏
|
*/
|
onHide() {},
|
|
/**
|
* 生命周期函数--监听页面卸载
|
*/
|
onUnload() {},
|
|
/**
|
* 页面相关事件处理函数--监听用户下拉动作
|
*/
|
onPullDownRefresh() {},
|
|
/**
|
* 页面上拉触底事件的处理函数
|
*/
|
onReachBottom() {},
|
|
/**
|
* 用户点击右上角分享
|
*/
|
onShareAppMessage() {},
|
changeCheckAll(e) {
|
this.setData({
|
checkAllState: e.detail.value,
|
});
|
},
|
goBack() {
|
wx.navigateBack();
|
},
|
|
// 扁平化数据转换tree
|
getTreeList(rootList, pathLength, newArr, path) {
|
for (const item of rootList) {
|
if (item.productLinkPath.length == pathLength && item.productLinkPath.includes(path)) {
|
item.checked = false;
|
if (item.sysType == 'CmsItem') {
|
if (item.selectType == 'webpage') {
|
item.disabled = true
|
} else {
|
if (item.isDownload != 1) {
|
item.disabled = true
|
}
|
}
|
if (item.file && item.fileMap && item.fileMap[item.file]) {
|
if (item.fileMap[item.file].protectType == 'Private') item.disabled = true
|
}
|
|
item.isbuy = this.isShowNeedBuy(item);
|
item.isShopCar = this.isShoppingCart(item);
|
}
|
// newArr.push(item)
|
// 在插入过程中对数据进行排序
|
newArr = this.insertAndSortObjectsByProductLinkPath(newArr, item)
|
}
|
}
|
//给数组里面再添加一个children的空数组
|
for (const i of newArr) {
|
i.children = []
|
this.getTreeList(rootList, pathLength + 6, i.children, i.productLinkPath)
|
if (i.children.length == 0) {
|
delete i.children
|
}
|
}
|
return newArr
|
},
|
|
// 去除树结构多余项
|
ensureTreeConsistency(tree) {
|
for (let index = 0; index < tree.length; index++) {
|
const item = tree[index];
|
if (item.children && item.children.length) {
|
const isFloder = item.children.findIndex(citem => citem.sysType == 'CmsFolder')
|
const isItem = item.children.findIndex(citem => citem.sysType == 'CmsItem')
|
if (isFloder > -1 && isItem > -1) {
|
item.children = item.children.filter(ditem => ditem.sysType == 'CmsItem')
|
}
|
this.ensureTreeConsistency(item.children)
|
}
|
}
|
return tree
|
},
|
|
// 排序数组 按照productLinkPath
|
insertAndSortObjectsByProductLinkPath(array, newObj) {
|
// 查找新对象应该插入的位置
|
let insertIndex = array.findIndex(obj => Number(newObj.productLinkPath.substring(newObj.productLinkPath.length - 6, newObj.productLinkPath.length)) < Number(obj.productLinkPath.substring(obj.productLinkPath.length - 6, obj.productLinkPath.length)));
|
|
// 如果没有找到合适的位置,则放在数组末尾
|
if (insertIndex === -1) {
|
insertIndex = array.length;
|
}
|
// 插入新对象到数组
|
array.splice(insertIndex, 0, newObj);
|
// 测试6 正式5
|
// 对数组进行排序
|
array.sort((a, b) => {
|
if (Number(a.productLinkPath.substring(a.productLinkPath.length - 5, a.productLinkPath.length)) < Number(b.productLinkPath.substring(b.productLinkPath.length - 5, b.productLinkPath.length))) {
|
return -1;
|
}
|
if (Number(a.productLinkPath.substring(a.productLinkPath.length - 5, a.productLinkPath.length)) > Number(b.productLinkPath.substring(b.productLinkPath.length - 5, b.productLinkPath.length))) {
|
return 1;
|
}
|
// a must be equal to b
|
return 0;
|
});
|
|
// 返回更新后的数组
|
return array;
|
},
|
|
// 遍历树结构转换为数组方法
|
handleTreeData(array) {
|
const flattenedArray = [];
|
array.forEach((node) => {
|
// 将当前节点添加到展开的数组中
|
flattenedArray.push(node);
|
// 递归处理子节点
|
if (node.children && node.children.length > 0) {
|
const childrenArray = this.handleTreeData(node.children);
|
flattenedArray.push(...childrenArray);
|
}
|
});
|
return flattenedArray.filter((item) => item.sysType == "CmsItem");
|
},
|
|
// 教学资源 云学习 获取
|
getResourceDataList(type) {
|
this.setData({
|
loading: true,
|
noResources: false,
|
});
|
let query = {
|
path: '*',
|
queryType: '*',
|
productId: this.data.bookDetail.id,
|
cmsPath: type.productLinkPath,
|
cmsType: '*',
|
itemFields: {
|
SysType: 'CmsFolder',
|
// 资源类型,试读文件,是否允许下载等参数
|
selectType: [],
|
freeFile: [],
|
file: [],
|
protectedFile: [],
|
resourcesClassification: [],
|
isDownload: [],
|
jsek_resourceBrief: [],
|
jsek_link: [],
|
jsek_questionBank: []
|
},
|
pading: {
|
start: 0,
|
size: 999
|
},
|
}
|
app.MG.store.getProductDetail(query).then((res) => {
|
if (!res.datas.cmsDatas[0].datas.length) {
|
return this.setData({
|
noResources: true,
|
loading: false,
|
haider: true,
|
});
|
}
|
let list = []
|
// 测试 6位// 正式 5位// 测试调用传20,内部7 正式调用传17 内部传6
|
//教学资源 云学习
|
if (
|
type.refCode == "jsek_teachingResources" ||
|
type.refCode == "jsek_cloudLearning"
|
) {
|
res.datas.cmsDatas[0].datas.forEach((item) => {
|
item.checked = false;
|
if (item.sysType == 'CmsItem') {
|
// 教学资源 类型名称赋值
|
this.data.resourceClassList.forEach((type) => {
|
if (type.value == item.resourcesClassification)
|
item.resourceClass = type.name;
|
});
|
if (this.data.tabValue == "jsek_teachingResources") {} else if (this.data.tabValue == "jsek_cloudLearning") {
|
item.isbuy = this.isShowNeedBuy(item);
|
item.isShopCar = this.isShoppingCart(item);
|
}
|
}
|
});
|
this.getTreeList(res.datas.cmsDatas[0].datas, 17, list, '\\')
|
list = this.ensureTreeConsistency(list)
|
console.log('修改后云', list);
|
let result = [];
|
if (type.refCode == "jsek_teachingResources") {
|
this.findChildIds(list, result);
|
this.setData({
|
teach: list,
|
loading: false,
|
openTeachids: result,
|
});
|
} else if (type.refCode == "jsek_cloudLearning") {
|
let arr = this.handleTreeData(list).filter(
|
(item) => item.saleMethod[0]
|
);
|
let freeIds = arr.filter((item) => {
|
return item.saleMethod[0].Price == 0;
|
});
|
if (!freeIds.length)
|
this.setData({
|
isshowDrawBtn: false,
|
});
|
this.findChildIds(list, result);
|
this.setData({
|
learn: list,
|
loading: false,
|
openLearnids: result,
|
haider: true,
|
});
|
}
|
}
|
})
|
},
|
|
// 获取教学资源 云学习 云测试
|
getResourceData(type) {
|
this.setData({
|
loading: true,
|
noResources: false,
|
});
|
let query = {
|
path: "*",
|
queryType: "*",
|
productId: this.data.bookId,
|
cmsPath: type.productLinkPath,
|
itemFields: {
|
SysType: "CmsFolder",
|
// 资源类型,试读文件,是否允许下载等参数
|
selectType: [],
|
freeFile: [],
|
file: [],
|
resourcesClassification: [],
|
isDownload: [],
|
jsek_resourceBrief: [],
|
jsek_link: [],
|
jsek_questionBank: [],
|
},
|
pading: {
|
start: 0,
|
size: 999,
|
},
|
};
|
app.MG.store
|
.getProductDetail(query)
|
.then(async (res) => {
|
if (!res.datas.cmsDatas[0].datas.length) {
|
return this.setData({
|
noResources: true,
|
loading: false,
|
haider: true,
|
});
|
}
|
//教学资源 云学习
|
if (
|
type.refCode == "jsek_teachingResources" ||
|
type.refCode == "jsek_cloudLearning"
|
) {
|
if (res.datas.cmsDatas[0].datas.length > 0) {
|
res.datas.cmsDatas[0].datas.forEach((item) => {
|
(item.checked = false), (item.checkAll = true);
|
});
|
const list = await this.getAllResource(res.datas.cmsDatas[0].datas);
|
if (type.refCode == "jsek_teachingResources") {
|
this.setData({
|
teach: list,
|
loading: false,
|
haider: true
|
});
|
this.findChildIds(this.data.teach, (this.data.openTeachids = []));
|
} else if (type.refCode == "jsek_cloudLearning") {
|
const result = [];
|
res.datas.cmsDatas[0].datas.forEach((item) => {
|
item.checked = false;
|
});
|
this.findChildIds(list, result);
|
this.setData({
|
learn: list,
|
loading: false,
|
openLearnids: result,
|
haider: true
|
});
|
}
|
console.log(list, '云學習');
|
} else {
|
// 无数据
|
}
|
} else if (type.refCode == "jsek_questionBank") {
|
// const list = await this.getAllResource(res.datas.cmsDatas[0].datas)
|
this.setData({
|
test: res.datas.cmsDatas[0].datas,
|
loading: false,
|
haider: true
|
});
|
} else {
|
console.log("其他");
|
}
|
})
|
.catch((e) => {
|
console.log(e);
|
});
|
},
|
// 获取tag下所有资源
|
async getAllResource(data) {
|
if (!data.length) return false;
|
for (let i = 0; i < data.length; i++) {
|
let item = data[i];
|
if (item.sysType == "CmsFolder" && item.childrenCount > 0) {
|
item.children = [];
|
item.children = await this.getFolderItem(item.productLinkPath);
|
await this.getAllResource(item.children);
|
}
|
}
|
return data;
|
},
|
// 获取资源接口
|
async getFolderItem(path) {
|
let query = {
|
path: "*",
|
queryType: "*",
|
productId: this.data.bookId,
|
cmsPath: path,
|
itemFields: {
|
SysType: "CmsFolder",
|
// 资源类型,试读文件,是否允许下载等参数
|
selectType: [],
|
freeFile: [],
|
file: [],
|
protectedFile: [],
|
resourcesClassification: [],
|
isDownload: [],
|
jsek_resourceBrief: [],
|
jsek_link: [],
|
accessType: [],
|
learnSelectType: [],
|
},
|
pading: {
|
start: 0,
|
size: 999,
|
},
|
};
|
const data = await app.MG.store.getProductDetail(query);
|
data.datas.cmsDatas[0].datas.forEach((item) => {
|
this.data.resourceClassList.forEach((type) => {
|
if (type.value == item.resourcesClassification)
|
item.resourceClass = type.name;
|
});
|
// 网页 不能下载 私有文件
|
if (item.sysType == "CmsItem") {
|
if (item.selectType == "webpage") {
|
item.disabled = true;
|
} else {
|
if (item.isDownload != 1) {
|
item.disabled = true;
|
}
|
}
|
if (item.file) {
|
if (item.fileMap[item.file].protectType == "Private")
|
item.disabled = true;
|
}
|
}
|
});
|
data.datas.cmsDatas[0].datas.forEach((item) => {
|
item.checked = false;
|
item.isbuy = this.isShowNeedBuy(item);
|
item.isShopCar = this.isShoppingCart(item);
|
});
|
return data.datas.cmsDatas[0].datas;
|
},
|
async getBookInfo(id) {
|
this.setData({
|
"mockData'.id": 0,
|
"mockData.price": 0,
|
"mockData.count": 0,
|
});
|
const query = {
|
path: "*",
|
queryType: "*",
|
productId: id,
|
favoriteTypes: "FavoriteBookCity",
|
itemFields: {
|
"SysType=": "CmsFolder",
|
},
|
coverSize: {
|
height: 300,
|
},
|
fields: {
|
seriesName: [],
|
author: [],
|
isbn: [],
|
publicationDate: [],
|
bookClassification: [],
|
paperPrice: [],
|
JDLink: [],
|
tmallLink: [],
|
dangdangLink: [],
|
weidianLink: [],
|
content: [],
|
authorIntroduction: [],
|
isApplyBook: [],
|
isSell: [],
|
pdf: [],
|
protectedEpub: [],
|
probationPage: [], //pdf试读页数
|
freeEpubPage: [], //epub试读百分比
|
},
|
};
|
await app.MG.store.getProductDetail(query).then(async (res) => {
|
this.setData({
|
bookDetail: res.datas,
|
buyIdList: res.datas.purchasedSaleMethodIdList,
|
});
|
// this.getResourceData({
|
// productLinkPath: this.data.productLinkPath,
|
// refCode: this.data.refCode,
|
// });
|
this.getResourceDataList({
|
productLinkPath: this.data.productLinkPath,
|
refCode: this.data.refCode,
|
})
|
});
|
|
},
|
// 获取已购买商品
|
getShoppingCartProductGet() {
|
let query = {
|
start: 0,
|
size: 999,
|
filterList: [],
|
searchList: [],
|
};
|
app.MG.store.getShoppingCartProductList(query).then((res) => {
|
const list = [];
|
res.datas.forEach((item) => {
|
list.push(item.saleMethod.id);
|
});
|
this.setData({
|
shoppingList: res.datas,
|
shoppingCartGetId: list,
|
});
|
});
|
},
|
// 判断资源是否购买
|
resourceIsBuy(data) {
|
if (data.saleMethod && data.saleMethod.length) {
|
const isSHow = this.data.buyIdList.some(
|
(item) => item == data.saleMethod[0].Id
|
);
|
return !isSHow;
|
} else {
|
return false;
|
}
|
},
|
|
isShowNeedBuy(data) {
|
if (data.saleMethod && data.saleMethod.length) {
|
const isSHow = this.data.buyIdList.some(
|
(item) => item == data.saleMethod[0].Id
|
);
|
if (isSHow) {
|
return false;
|
} else {
|
return data.saleMethod[0].price > 0 ? true : false;
|
}
|
return !isSHow;
|
} else {
|
return false;
|
}
|
},
|
// 判断资源加入购物车按钮是否显示
|
isShoppingCart(data) {
|
if (data.saleMethod && data.saleMethod.length) {
|
if (data.saleMethod[0].Price <= 0) return false;
|
// 再判断是否购买
|
const isBuy = this.data.buyIdList.some(
|
(item) => item == data.saleMethod[0].Id
|
);
|
if (isBuy) {
|
// 购买了
|
return false;
|
} else {
|
// 判断是否加入购物车
|
const isSHow = this.data.shoppingCartGetId.some(
|
(item) => item == data.saleMethod[0].Id
|
);
|
return !isSHow;
|
}
|
} else {
|
return false;
|
}
|
},
|
// 获取展开项
|
findChildIds(data, result) {
|
let index = 0;
|
for (let i = 0; i < data.length; i++) {
|
if (index < 3) {
|
const item = data[i];
|
if (item.children && item.children.length > 0) {
|
result.push(item.id);
|
for (let j = 0; j < item.children.length; j++) {
|
if (index < 3) {
|
const childrenItme = item.children[j];
|
if (item.children && item.children.length > 0) {
|
result.push(childrenItme.id);
|
index += 1;
|
}
|
} else {
|
break;
|
}
|
}
|
} else if (item.children && item.children.length > 0) {
|
result.push(item.id);
|
index += 1;
|
}
|
} else {
|
break;
|
}
|
}
|
},
|
// 获取资源所属分类
|
getResourceClass() {
|
let query = {
|
refCodes: ["resourcesClassification"],
|
};
|
app.MG.store.getProductTypeField(query).then((res) => {
|
this.setData({
|
resourceClassList: JSON.parse(res[0].config).option,
|
});
|
});
|
},
|
checkAll() {
|
const child = this.selectComponent("#tree");
|
child.checkAll();
|
},
|
//购买按钮
|
batchPurchase() {
|
let saleMethodIds = [];
|
let requests = [];
|
let item = [];
|
let selectAllId = [];
|
const child = this.selectComponent("#tree");
|
item = child.data.superiorPurchaseSaleMethodId;
|
const sonItem = child.data.sonPurchaseSaleMethodId;
|
let selectAll = child.data.selectAll;
|
if (selectAll) {
|
selectAll.forEach((item) => {
|
if (item.saleMethod != 0) {
|
selectAllId.push(item.saleMethod[0].Id);
|
}
|
});
|
app.MG.store
|
.initOrder({
|
requests: selectAllId.map((id) => ({
|
saleMethodId: id,
|
count: 1,
|
})),
|
})
|
.then((res) => {
|
if (res) {
|
wx.navigateTo({
|
url: "/pages/cart/paymentPage/index?orderNumber=" + res.orderNumber,
|
});
|
selectAllId = [];
|
child.setData({
|
selectAll: [],
|
});
|
}
|
});
|
}
|
if (item) {
|
// 拿到id
|
item.forEach((items) => {
|
if (items.saleMethod != 0) {
|
saleMethodIds.push(items.saleMethod[0].Id);
|
}
|
});
|
app.MG.store
|
.initOrder({
|
requests: saleMethodIds.map((id) => ({
|
saleMethodId: id,
|
count: 1,
|
})),
|
})
|
.then((res) => {
|
if (res) {
|
wx.navigateTo({
|
url: "/pages/cart/paymentPage/index?orderNumber=" + res.orderNumber,
|
});
|
|
child.setData({
|
superiorPurchaseSaleMethodId: [], // 使用setData方法清空sonPurchaseSaleMethodId数据
|
});
|
}
|
});
|
}
|
if (item.length == 0 && sonItem) {
|
app.MG.store
|
.initOrder({
|
requests: sonItem.map((id) => ({
|
saleMethodId: id,
|
count: 1,
|
})),
|
})
|
.then((res) => {
|
if (res) {
|
wx.navigateTo({
|
url: "/pages/cart/paymentPage/index?orderNumber=" + res.orderNumber,
|
});
|
this.setData({
|
paymentPage: true,
|
});
|
child.setData({
|
sonPurchaseSaleMethodId: [], // 使用setData方法清空sonPurchaseSaleMethodId数据
|
});
|
}
|
});
|
}
|
},
|
|
// 章节勾选方法
|
findAndUpdateItemsByIds(tree, ids, state) {
|
function findAndUpdate(node) {
|
if (ids.includes(node.id)) {
|
// console.log(node, 'node');
|
node.checked = state; // 将目标项的 check 属性设置为 true
|
}
|
if (node.children && node.children.length > 0) {
|
for (let child of node.children) {
|
findAndUpdate(child); // 递归处理子节点
|
}
|
}
|
}
|
for (let node of tree) {
|
findAndUpdate(node); // 对每个顶层节点执行查找和更新操作
|
}
|
// console.log(tree, 'tree345');
|
return tree; // 返回修改后的完整数组
|
},
|
// 单个勾选方法
|
checkResoucrceInfo(tree, id) {
|
function findAndUpdate(node) {
|
if (node.sysType == "CmsFolder" && node.children.length > 0) {
|
for (let index = 0; index < node.children.length; index++) {
|
const element = node.children[index];
|
findAndUpdate(element);
|
}
|
} else if (id == node.id && node.sysType == "CmsItem") {
|
node.checked = !node.checked; // 将目标项的 check 属性设置为 true
|
}
|
}
|
for (let node of tree) {
|
findAndUpdate(node); // 对每个顶层节点执行查找和更新操作
|
}
|
return tree; // 返回修改后的完整数组
|
},
|
// 章节勾选事件
|
changeListChecked(e) {
|
const ids = e.detail.ids
|
const state = e.detail.flag
|
const updated = this.findAndUpdateItemsByIds(this.data.learn, ids, state)
|
this.setData({
|
learn: updated
|
})
|
},
|
// 单个勾选事件
|
changeResourceChecked(e) {
|
const id = e.detail.id
|
const updated = this.checkResoucrceInfo(this.data.learn, id)
|
this.setData({
|
learn: updated
|
})
|
}
|
});
|