// pages/digitalCourses/digitalCoursesDetails/index.js const app = getApp() import moment from 'moment' import Toast from "tdesign-miniprogram/toast"; import { loginInfo } from '../../../assets/js/login'; Page({ /** * 页面的初始数据 */ data: { loading: true, digitalsData: {}, expire: false, //商品或子商品销售方式是否过期 isBuy: false, tabValue: 0, learnResourceIcon: { name: "/static/images/digitalTextbooks/shengshu-t@2x.png", }, learnResourceClickIcon: { name: "/static/images/digitalTextbooks/zhengshu-t-click@3x.png", }, briefIcon: { name: "/static/images/digitalTextbooks/jibenxinxi-t@2x.png", }, briefIconClick: { name: "/static/images/digitalTextbooks/jibenxinxi-t-click@3x.png", }, courseLearning: { name: "/static/images/digitalCourses/jiaoxueziyuan@2x.png" }, courseLearningClick: { name: "/static/images/digitalCourses/jiaoxueziyuan.png" }, learningNotes: { name: "/static/images/digitalCourses/biji/icon@2x.png" }, learningNotesClick: { name: "/static/images/bookService/detail/biji-click-icon.png", }, onlineQuestioning: { name: "/static/images/digitalCourses/tiwen@2x.png" }, onlineQuestioningClick: { name: "/static/images/digitalCourses/tiwen-click@2x.png" }, dialogBox: false, lecturerList: [], selectActive: 'learn', learnList: [], testList: [], openTeachids: [], onlineQuestionsList: [], //分页 page: 1, limit: 6, questionTotalCount: 0, bottomLoading: false, isMoreData: false, noteList: [], notePage: 1, noteLimit: 6, noteTotalCount: 0, images: [], visible: false, showIndex: false, closeBtn: false, deleteBtn: false, bookId: '', playerList: [], worksInfo: [], isCertificate: {}, isLearn: false, isTest: false, }, formatDate(dateString) { if (!dateString) { return ""; } const match = dateString.match( /^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/ ); if (!match) { throw new Error("Invalid date format"); } const [, year, month, day, hours, minutes, seconds] = match; const date = new Date( parseInt(year, 10), parseInt(month, 10) - 1, parseInt(day, 10), parseInt(hours, 10), parseInt(minutes, 10), parseInt(seconds, 10) ); if (isNaN(date.getTime())) { throw new Error("Invalid date"); } // 由于小程序环境可能不支持 Intl.DateTimeFormat,我们使用简化的格式化方法 const formatted = `${year}年${this.formatMonth(month)}`; return formatted; }, formatMonth(month) { const months = [ "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月", ]; return months[parseInt(month, 10) - 1]; }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { this.setData({ bookId: options.id }) this.digitalCoursesDetailsGet(options.id) this.getPlayerList() this.getResource() }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady() { }, /** * 生命周期函数--监听页面显示 */ onShow() { }, /** * 生命周期函数--监听页面隐藏 */ onHide() { }, /** * 生命周期函数--监听页面卸载 */ onUnload() { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh() { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom() { }, /** * 用户点击右上角分享 */ onShareAppMessage() { }, //获取视频学习 getPlayerList() { app.MG.identity .getUserKey({ domain: 'videoPlayer', keys: [this.data.bookId] }) .then((res) => { if (res.length > 0) { this.setData({ playerList: JSON.parse(res[0].value) }) console.log(this.data.playerList, "playerList") } }) }, digitalCoursesDetailsGet(digitalTextId) { let query = { path: '*', queryType: '*', productId: digitalTextId, storeInfo: 'jsek_digitalCourses', coverSize: { height: 300 }, fields: { seriesName: [], author: [], isbn: [], publicationDate: [], speaker: [], bookClassification: [], paperPrice: [], JDLink: [], tmallLink: [], dangdangLink: [], weidianLink: [], content: [], authorIntroduction: [], isApplyBook: [], isSell: [], pdf: [], protectedEpub: [], probationPage: [], //pdf试读页数 freeEpubPage: [], courseLeader: [], affiliatedUnit: [], publishingUnit: [], classHours: [], productLinkPath: [], //epub试读百分比 } } app.MG.store.getProductDetail(query).then(res => { console.log(res); if (res.datas.purchasedSaleMethodIdList.includes(res.datas.defaultSaleMethodId)) { this.setData({ isBuy: true }) } else { this.setData({ isBuy: false }) } let times = new Date(res.datas.defaultSaleMethod.endDate).getTime() let startTime = new Date(res.datas.defaultSaleMethod.beginDate).getTime() if (times < new Date().getTime() || new Date().getTime() < startTime) { this.setData({ expire: true }) } else { this.setData({ expire: res.false }) } res.datas.publicationDate = this.formatDate(res.datas.publicationDate) res.datas.price = res.datas.price.toFixed(2) wx.setNavigationBarTitle({ title: res.datas.name, }) let lecturer = [] if (res.datas.datas.speaker && res.datas.datas.speaker.length > 0) { res.datas.datas.speaker.forEach(item => { if (res.datas.subItems && res.datas.subItems.QueryCms.length > 0) { res.datas.subItems.QueryCms.forEach(item1 => { if (JSON.parse(item.Data.Value).items[0] == item1.id) { lecturer.push({ name: item1.name, icon: item1.icon ? item1.icon : '', description: item1.description ? item1.description : '', }) } }) } }) } this.setData({ lecturerList: lecturer, digitalsData: res.datas, loading: false }) }) }, onTabsChange(event) { const value = event.detail.value this.setData({ tabValue: value }) console.log(this.data.tabValue); if (this.data.tabValue == 2) { this.getResource() } if (this.data.tabValue == 3) { this.selectComponent("#note").getNoteList(); } if (this.data.tabValue == 4) { this.selectComponent("#question").getDataList(); } }, selectChange(event) { console.log(event) const value = event.target.dataset.value this.setData({ selectActive: value }) this.getResource() }, getResource() { let query = { storeInfo: app.config.digitalCourses, path: '*', queryType: '*', productId: this.data.digitalsData.id, cmsPath: this.data.digitalsData.rootCmsItemId + '', cmsType: '*', itemFields: { SysType: 'CmsFolder', selectType: [], freeFile: [], file: [], protectedFile: [], resourcesClassification: [], isDownload: [], jsek_resourceBrief: [], jsek_link: [], jsek_questionBank: [], learnSelectType: [] }, pading: { start: 99, size: 0 } } app.MG.store.getProductDetail(query).then((res) => { let test = [] let learn = [] let learnItemList = [] if (res.datas.cmsDatas[0].datas.length > 0) { res.datas.cmsDatas[0].datas.forEach((item) => { if (item.type == 'questionBankFolder' || item.type == 'questionBankItem') { test.push(item) } else if (item.type != "resourceItem") { this.data.playerList.forEach(pItem => { if (pItem.cmsItemId == item.id) { item.progress = pItem.progress } }) learn.push(item) } if (item.type == 'productItem') { learnItemList.push(item) } }) if (this.data.selectActive === 'learn') { let list = [] // 测试 6位// 正式 5位// 测试调用传20,内部7 正式调用传17 内部传6 let addNum = query.cmsPath.length > 5 ? 7 : query.cmsPath.length > 6 ? 8 : 6 const num = query.cmsPath.length + addNum if (learn.some((item) => item.sysType == 'CmsFolder')) { this.getTreeList(learn, num, list, '\\', addNum) list = this.ensureTreeConsistency(list) } else { list = learn } let result = []; this.findChildIds(list, result) if (list.length > 0) { this.setData({ learnList: list, openTeachids: result, }); } } else { const data = test.filter( (item) => item.type == 'questionBankFolder' && item.childrenFolderCount > 0 ) if (data.length > 0) { let list = [] let addNum = query.cmsPath.length > 5 ? 7 : query.cmsPath.length > 6 ? 8 : 6 const num = query.cmsPath.length + addNum this.getTreeList(data, num, list, '\\', addNum) list = this.ensureTreeConsistency(list) let result = []; this.findChildIds(list[0].children, result) this.setData({ testList: list[0].children, openTeachids: result, }); } } //判断资源是否学习完成 if (learnItemList.length == playerList.value.length) { let data = playerList.value.filter((ditem) => ditem.progress != '100') if (data) { this.setData({ isLearn: false, }); } else { this.setData({ isLearn: true, }); } } else { this.setData({ isLearn: false, }); } } }) }, // 扁平化数据转换tree getTreeList(rootList, pathLength, newArr, path, addNum) { for (const item of rootList) { // 此处原本 item.productLinkPath.length == pathLength 但 productLinkPath 长度个别书存在4、5位交错 if ((pathLength - item.productLinkPath.length >= 0 && pathLength - item.productLinkPath.length <= 3) && item.productLinkPath.includes(path)) { 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 } } // newArr.push(item) // 在插入过程中对数据进行排序 newArr = this.insertAndSortObjectsByProductLinkPath(newArr, item, addNum) } } //给数组里面再添加一个children的空数组 for (const i of newArr) { i.children = [] this.getTreeList(rootList, pathLength + addNum, i.children, i.productLinkPath, addNum) 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, addNum) { // 查找新对象应该插入的位置 let insertIndex = array.findIndex(obj => Number(newObj.productLinkPath.substring(newObj.productLinkPath.length - addNum, newObj.productLinkPath.length)) < Number(obj.productLinkPath.substring(obj.productLinkPath.length - addNum, 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 - addNum, a.productLinkPath.length)) < Number(b.productLinkPath.substring(b.productLinkPath.length - addNum, b.productLinkPath.length))) { return -1; } if (Number(a.productLinkPath.substring(a.productLinkPath.length - addNum, a.productLinkPath.length)) > Number(b.productLinkPath.substring(b.productLinkPath.length - addNum, b.productLinkPath.length))) { return 1; } // a must be equal to b return 0; }); // 返回更新后的数组 return array; }, // 获取展开项 findChildIds(data, result) { let index = 0 for (let i = 0; i < data.length; i++) { if (index < 3) { const item = data[i] if (item.childrenFolderCount > 0) { result.push(item.id) for (let j = 0; j < item.children.length; j++) { if (index < 3) { const childrenItme = item.children[j] if (item.childrenCount > 0) { result.push(childrenItme.id) index += 1 } } else { break } } } else if (item.childrenCount > 0) { result.push(item.id) index += 1 } } else { break } } }, //学习笔记 //在线提问 // 图书添加购物车 async addBookShopcCar() { if (!this.data.expire) { const shoppingCartGetId = []; let query = { start: 0, size: 9999, filterList: [], searchList: [], }; const res = await app.MG.store.getShoppingCartProductList(query); res.datas.forEach((item) => { shoppingCartGetId.push(item.saleMethod.id); }); const determine = shoppingCartGetId.some( (item) => item == this.data.digitalsData.defaultSaleMethodId ); if (!determine) { let query = { requests: [{ saleMethodId: this.data.digitalsData.defaultSaleMethodId, storeEventId: null, agentCode: "电子书", }, ], }; const addRes = app.MG.store.addShoppingCart(query); this.showSuccessToast(); } else { Toast({ context: this, selector: "#t-toast", message: "该书已在购物车,请勿重复添加", theme: "warning", direction: "column", }); } } else { wx.showToast({ title: "商品不在有效期", icon: "none", duration: 1000, }); } }, showSuccessToast() { Toast({ context: this, selector: "#t-toast", message: "添加成功", theme: "success", direction: "column", }); }, //购买按钮 async buyBtn() { if (!this.data.expire) { let bookOrdersId = ""; let query = { remarks: "电子书", requests: [{ saleMethodId: this.data.digitalsData.defaultSaleMethodId, count: 1, }, ], }; // 发起订单初始化请求并等待结果 const res = await app.MG.store.initOrder(query); // 获取订单号并赋值给 orderNumber.value console.log(res, 'res456'); bookOrdersId = res.orderNumber; // 检查订单号是否存在 if (bookOrdersId) { if (this.data.digitalsData.price == "0.00") { app.MG.store .confirmOrder({ orderNum: bookOrdersId, }) .then((res) => { if (res) { wx.showToast({ title: "领取成功", icon: "none", duration: 1000, }); this.getBookInfo(this.data.bookDetail.id); } }); } else { const url = "/pages/cart/paymentPage/index?orderNumber=" + bookOrdersId + '&onNorderSaleMethod=' + res.saleMethodLinks[0].orderSaleMethod.id; wx.navigateTo({ url, }); } } else { console.log(222); } } else { wx.showToast({ title: "商品不在有效期", icon: "none", duration: 1000, }); } }, closeDialog() { const { dialogKey } = this.data; this.setData({ [dialogKey]: false }); }, //申请证书 //获取字段 getType() { app.MG.resource.getCmsTypeByRefCode({ refCodes: ['jsek_courseCertificate'] }).then((res) => { this.setData({ worksInfo: res[0].cmsTypeLinks[0].children, }) }) }, getCertificateList() { const data = { start: 0, size: 9999, topicIdOrRefCode: 'applyCourseCertificate', appRefCode: config.appRefCode, sort: { type: 'Desc', field: 'CreateDate' } } app.MG.ugc.getTopicMessageList(data).then((res) => { res.datas.map((item) => { item.content = JSON.parse(item.content) if (item.content.id == this.data.bookId) { this.setData({ isCertificate: item }) } }) }) }, onCertificate() { if (!this.data.isBuy) { wx.showToast({ title: "请先购买,体验完整服务", icon: "none", duration: 1000, }); } var page = getCurrentPages().pop(); // 获取当前页面实例 page.setData({ // 动态设置禁止滚动的样式 disableScrollStyle: 'overflow: hidden;' }); this.setData({ dialogBox: true, scrollJudge: '' }) }, closeDialog() { this.setData({ dialogBox: false, scrollJudge: true }) }, confirmM() { this.setData({ dialogBox: false, scrollJudge: true }) }, setCoolect() { // 首页测试登录功能,后续注释 // 检查登录状态 const token = wx.getStorageSync(app.config.tokenKey) if (!token) { loginInfo(app, (data) => { // 如果不是第一次登录,会执行回调 if (data) { if (this.data.digitalsData.isFavourite) { app.MG.store .delProductLink({ productIds: [this.data.digitalsData.id], linkType: 'Favoriteclass' }) .then(() => { this.setData({ "digitalsData.isFavourite": false }) }) } else { let params = { productIds: [this.data.digitalsData.id], linkType: 'Favoriteclass' } app.MG.store.addProductLink(params).then((res) => { this.setData({ "digitalsData.isFavourite": true }) }) } } else { // 出现错误,返回false } }) } else { if (this.data.digitalsData.isFavourite) { app.MG.store .delProductLink({ productIds: [this.data.digitalsData.id], linkType: 'Favoriteclass' }) .then(() => { this.setData({ "digitalsData.isFavourite": false }) }) } else { let params = { productIds: [this.data.digitalsData.id], linkType: 'Favoriteclass' } app.MG.store.addProductLink(params).then((res) => { this.setData({ "digitalsData.isFavourite": true }) }) } } }, //证书查看 onClick1() { this.setData({ images: ['/static/images/certificate/cbzs.jpg'], showIndex: true, visible: true, }) }, onClick2() { this.setData({ images: ['/static/images/certificate/rzzs.jpg'], showIndex: true, visible: true, }) }, onClose(e) { const { trigger } = e.detail; console.log(trigger); this.setData({ visible: false, }); }, })