// pages/resourceDetails/document/index.js import Toast from 'tdesign-miniprogram/toast/index'; const app = getApp() import { loginInfo } from '../../../../assets/js/login'; import XLSX from '../../../../utils/xlsx.mini.min'; Page({ /** * 页面的初始数据 */ data: { visible: false, showIndex: false, closeBtn: false, deleteBtn: false, images: [], webpageSrc: '', navBarHeight: '', barHeight: '', activeId: '', storeInfo: '', bookId: '', bookName: '', cmsId: '', parentName: '', parentProductLinkPath: '', productLinkPath: '', isBuy: false, showData: '', titleName: '', selectType: '', learnSelectType: '', zipData: '', naturalResources: [], titleName: '', pdfDatA: [], startTime: "", //进入页面当前时间 pauseTime: 0, //暂停时间 formPath: '', applyState: '', deadline: '', lzoomFlag: false, //定义 缩放事件 节流阀,防止一次缩放触发两次缩放事件 distance: 0, //记录手指移动距离 scale: 1, //定义初始化的页面缩放大小 newScale: 1, //记录新的页面缩放大小 pdfSrc: '', buyIdList: [], buyList: [], learnClassData: null, isLearnDataBuy: false, bookDetail: null, learnStartTime: 0, learnTimeList: [], learnTimeData: 0, threeLeveData: [], selectTypeData: '', promptVisable: false, showMd5: '', confirmBtn: { content: '确定', variant: 'base', }, }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { wx.setNavigationBarTitle({ title: '资源详情' }); const systInfo = wx.getSystemInfoSync(); const menu = wx.getMenuButtonBoundingClientRect(); // 胶囊信息 const navBarHeight = (menu.top - systInfo.statusBarHeight) * 2 + menu.height; // 导航栏高度 this.setData({ navBarHeight: navBarHeight, barHeight: systInfo.statusBarHeight, activeId: options.activeId, bookId: options.bookId, bookName: options.bookName, storeInfo: options.storeInfo, cmsId: options.cmsId, parentName: options.parentName, parentProductLinkPath: options.parentProductLinkPath, productLinkPath: options.productLinkPath, applyState: options.applyState, deadline: options.deadline, formPath: options.formPath, source: options.source, }) if (options.formPath == 'jsek_cloudLearning') { this.setData({ learnStartTime: Date.now(), }) this.getLearnTime() } this.getBookInfo(this.data.bookId) }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady() {}, /** * 生命周期函数--监听页面显示 */ onShow() { this.setData({ startTime: Date.now() }) }, /** * 生命周期函数--监听页面隐藏 */ onHide() { this.setData({ pauseTime: Date.now() }) if (wx.getStorageSync(app.config.tokenKey)) { let duration = this.data.pauseTime - this.data.startTime this.count(duration) if (this.data.formPath == 'jsek_cloudLearning') { let cloudDuration = this.data.pauseTime - this.data.learnStartTime this.cloudCount(cloudDuration) } } }, /** * 生命周期函数--监听页面卸载 */ onUnload() { this.setData({ pauseTime: Date.now() }) if (wx.getStorageSync(app.config.tokenKey)) { let duration = this.data.pauseTime - this.data.startTime this.count(duration) if (this.data.formPath == 'jsek_cloudLearning') { let cloudDuration = this.data.pauseTime - this.data.learnStartTime this.cloudCount(cloudDuration) } } }, count(timeStr) { const data = { appRefCode: app.config.appRefCode, type: 'LearningTime', //统计类型--阅读时长 data: timeStr + '', //统计内容--时长毫秒 event: 'LearningTime', sysType: 'App' } //阅读商品的id if (this.data.bookId) { data.productId = this.data.bookId } //阅读资源的id if (this.data.cmsId) { data.cmsItemId = this.data.cmsId } app.MG.job.newJobWithApiNewEvent(data).then((res) => {}) }, getLearnTime() { app.MG.identity .getUserKey({ domain: 'cloudLearningTime', keys: [this.data.bookId] }) .then((res) => { if (res.length > 0) { if (JSON.parse(res[0].value) && JSON.parse(res[0].value).length > 0) { this.setData({ learnTimeList: JSON.parse(res[0].value), learnTimeData: JSON.parse(res[0].value)[0].learnTime, }) } else { this.setData({ learnTimeList: [], learnTimeData: 0 }) } } }) }, cloudCount(timeStr) { let time = Number(this.data.learnTimeData) + Number(timeStr) this.setData({ learnTimeList: [{ learnTime: time }], }) app.MG.identity .setUserKey({ setKeyRequests: [{ domain: 'cloudLearningTime', key: this.data.bookId, value: JSON.stringify(this.data.learnTimeList) }] }) .then((res) => { console.log(timeStr, '学习时长') }) }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh() {}, /** * 页面上拉触底事件的处理函数 */ onReachBottom() {}, /** * 用户点击右上角分享 */ onShareAppMessage() {}, onShareTimeline() {}, goBack() { wx.navigateBack() }, // 获取图书详情 getBookInfo(id) { const query = { path: "*", queryType: "*", productId: id, favoriteTypes: "FavoriteBookCity", itemFields: { "SysType=": "CmsFolder", }, coverSize: { height: 1, }, fields: {}, }; if (this.data.storeInfo) query['storeInfo'] = this.data.storeInfo app.MG.store.getProductDetail(query).then(async (res) => { this.setData({ bookDetail: res.datas }) this.resourceDetailsData(); }); }, // 判断当前目标是否已购买 async getCmsDataByQrcode() { const query = { cmsItemId: Number(this.data.activeId) }; return app.MG.file.checkCmsItem(query) }, resourceDetailsData() { wx.showLoading({ title: '正在加载...', }); let query = { path: '*', queryType: '*', cmsType: '*', productId: this.data.bookId, cmsPath: this.data.bookDetail.rootCmsItemId, itemFields: { selectType: [], freeFile: [], file: [], protectedFile: [], resourcesClassification: [], isDownload: [], jsek_resourceBrief: [], jsek_link: [], jsek_questionBank: [], learnSelectType: [] }, pading: { start: 0, size: 999 } } if (this.data.storeInfo) { query.storeInfo = this.data.storeInfo } app.MG.store.getProductDetail(query).then(async (res) => { let linkData = this.data.productLinkPath.split("\\"); linkData.reverse() let dataList = linkData.map(item => { let data = res.datas.cmsDatas[0].datas.find(citem => citem.id == item); if (data) return data; }) let isBuy = 1; // ###这里的逻辑是从最子层开始判断,最子层的salemethod优先级最高,如果将云学习的salemethod优先级设为最高,需要在判断前,将dataList中的云学习通过refcode滤出,先判断云学习,再判断后续的代码 for (let i = 0; i < dataList.length; i++) { const dataItem = dataList[i]; if (dataItem) { if (dataItem.saleMethod.length > 0) { isBuy = 2; if (this.data.bookDetail.purchasedSaleMethodIdList.indexOf(dataItem.saleMethod[0].Id) > -1 || dataItem.saleMethod[0].Price == 0) { isBuy = 3; break; } else { break; } } } } if (isBuy == 2) { // 未购买 if (dataList[0].freeFile) { this.handleTeachData(dataList[0], true) } else { wx.hideLoading(); wx.showModal({ title: '温馨提示', content: '该资源未购买,将返回购买', success: (res) => { if (res.confirm) { if (this.data.source == 'qrcode') { wx.navigateTo({ url: `/packageBookService/pages/bookServices/detail/index?id=${this.data.bookDetail.id}&name=${this.data.bookDetail.name}&tabValue=${this.data.formPath}`, }); } else { wx.navigateBack() } } } }) } } else { this.handleTeachData(dataList[0], false) } }) }, //zpi文件下载 onDownloadButton() { const item = this.data.zipData; if (this.data.applyState !== 'Normal') { if (!this.data.deadline == '永久') { const flag = new Date(this.data.deadline) > new Date() return wx.showToast({ icon: 'none', title: '请先申请下载', }) } } if (!item || !item.file || !item.protectedFile) { wx.showToast({ title: '文件信息缺失', icon: 'none' }); return; } let file = item.file ? item.file : item.protectedFile const downloadUrl = app.config.requestCtx + '/file/api/ApiDownload?md5=' + file; wx.showLoading({ title: '正在下载...', }); wx.downloadFile({ url: downloadUrl, success(res) { if (res.statusCode === 200) { // 下载成功,可以在这里进行一些操作,例如预览、保存等 // 这里以保存文件到系统为例 wx.saveFile({ tempFilePath: res.tempFilePath, success(saveRes) { wx.hideLoading(); wx.showToast({ title: '保存成功', }); // 获取保存后的文件路径 const savedFilePath = saveRes.savedFilePath; // 可以在这里进行后续操作,例如打开文件 wx.openDocument({ filePath: savedFilePath, success: function () { console.log('打开文档成功') }, fail: function (error) { console.error('打开文档失败', error); } }); }, fail() { wx.hideLoading(); wx.showToast({ title: '保存失败', icon: 'none' }); } }); } else { wx.hideLoading(); wx.showToast({ title: '下载失败', icon: 'none' }); } }, fail() { wx.hideLoading(); wx.showToast({ title: '下载失败', icon: 'none' }); } }); }, //刚进来的时候调用 handleTeachData(item, isTry) { this.setData({ titleName: item.name, selectType: item.selectType, learnSelectType: item.learnSelectType, }) let that = this //图片 if (item.selectType == 'picture' || item.learnSelectType == 'picture') { let file = isTry ? item.freeFile : item.protectedFile || item.file this.setData({ showData: app.config.requestCtx + '/file/api/ApiDownload?md5=' + file, }) wx.hideLoading(); } // 下载文件zip if (item.selectType == 'zip' || item.learnSelectType == 'zip') { this.setData({ zipData: item }) wx.hideLoading(); } //网页 if (item.selectType == 'webpage' || item.learnSelectType == 'webpage') { this.setData({ webpageSrc: item.jsek_link }) wx.hideLoading(); } //文档等 if (item.selectType == 'document' || item.selectType == 'pdf' || item.learnSelectType == 'document' || item.learnSelectType == 'pdf') { let md5 = isTry ? item.freeFile : item.protectedFile || item.file || item.freeFile if (item.fileMap[md5]?.extension == 'xlsx' || item.fileMap[md5]?.extension == 'xls') { this.setData({ selectTypeData: 'excel', showMd5: md5, }) wx.request({ url: app.config.requestCtx + '/file/api/ApiDownload?md5=' + md5, method: 'GET', // 请求方式 responseType: 'arraybuffer', // 指定返回类型为 arraybuffer success: (res) => { if (res.statusCode === 200) { let data = new Uint8Array(res.data) let workbook = XLSX.read(data, { type: 'array' }) let worksheet = workbook.Sheets[workbook.SheetNames[0]] let innerHTML = XLSX.utils.sheet_to_json(worksheet) console.log(innerHTML) that.setData({ naturalResources: innerHTML }) wx.hideLoading(); } else { console.error('请求失败', res.statusCode); } }, fail: function (err) { console.error('请求失败', err); } }); } else { app.MG.file.getPdfInfo({ md5: md5 }).then((res) => { let naturalResources = [] if (res && res.totalPages) { for (let i = 0; i < res.totalPages; i++) { const src = app.config.requestCtx + '/file/GetPdfPageImage?md5=' + md5 + '&index=' + (i + 1) + '&dpi=300' naturalResources.push(src) } } this.setData({ naturalResources }) wx.hideLoading(); }) } } }, onClick() { this.setData({ images: [ this.data.showData, // 'https://tdesign.gtimg.com/mobile/demos/swiper2.png', ], showIndex: true, visible: true, }); }, onChange(e) { const { index } = e.detail; console.log('change', index); }, onDelete(e) { const { index } = e.detail; Toast({ context: this, selector: '#t-toast', message: `删除第${index + 1}个`, }); }, onClose(e) { const { trigger } = e.detail; this.setData({ visible: false, }); }, //预览图片,放大预览 preview(event) { let urls = [event.currentTarget.dataset.src] wx.previewImage({ urls: urls // 需要预览的图片http链接列表 }) }, // 判断当前点击的数据是否购买 cmsItemIsBuy(item) { let flag = false // 买了 if (this.data.buyList.length) { if (this.data.buyList.some(citem => item.productLinkPath.includes(citem.productLinkPath))) flag = true } else { // 没买且无销售方式 if (!item.saleMethod.length) { flag = true } else { // 没买且销售方式过期//没买,销售方式价格为0 const itemSaleMethod = item.saleMethod.find(citem => citem.SaleType == 'Normal') if (new Date().getTime() > new Date(itemSaleMethod.EndDate).getTime() || itemSaleMethod.Price == 0) flag = true } } return flag }, // scrolltolower(e) { const activeData = this.data.threeLeveData.find(item => item.id == this.data.activeId) const flag = this.data.naturalResources.some(item => item.includes(activeData.freeFile)) if ((this.data.showMd5 == activeData.freeFile || flag) && activeData.protectedFile) this.setData({ promptVisable: true }) }, // 提示弹窗关闭 closePromapDialog() { this.setData({ promptVisable: false }) if (this.data.source == 'qrcode') { wx.navigateTo({ url: `/packageBookService/pages/bookServices/detail/index?id=${this.data.bookDetail.id}&name=${this.data.bookDetail.name}&tabValue=${this.data.formPath}`, }); } else { wx.navigateBack() } } })