闫增涛
2024-09-04 bfdd1a936731cf9b5f0d2c78d363cbb0ec93d941
packageBookService/pages/bookServices/detail/index.js
@@ -4,12 +4,16 @@
import {
  loginInfo
} from "../../../../assets/js/login";
import FormData from '../../../../utils/formdata/index.js';
const app = getApp();
Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 进页面默认切换  展开的id
    // defaultactiveTeachid  教学资源
    // defaultactiveLearnid  云学习
    bookId: "",
    barHeight: "",
    navBarHeight: "",
@@ -35,6 +39,7 @@
    teach: [],
    learn: [],
    test: [],
    jslx: true,
    openTeachids: [],
    openLearnids: [],
    openTestids: [],
@@ -80,6 +85,7 @@
    electronicBookList: [], //样书单电子书
    paperBookCount: 0, //纸质书剩余次数
    ebookCount: 0, //电子书剩余次数
    resourceCodeList: [], // 资源refcode列表
    userInfo: {},
    pageLoading: true,
    fileInfo: {
@@ -154,7 +160,18 @@
    ],
    showIndex: '',
    successOrderNumber: '',
    applicationState: '' // 电子样书申请状态
    applicationState: '', // 电子样书申请状态
    dialogBox: false,
    resourceInfo: {
      resourceName: '',
      fileType: '',
      description: '',
      agree: false
    },
    fileList: [],
    isShowUp: true,
    protocolShow: false,
    protocolTxt: ''
  },
  resetTree: function (e) {
@@ -187,7 +204,7 @@
      title: options.name,
    })
    this.getBookInfo(options.id);
    this.getResourceClass(); // 获取资源所属分类
    // this.getResourceClass(); // 获取资源所属分类
    const token = wx.getStorageSync(app.config.tokenKey);
    if (token) {
      this.getShoppingCartProductGet();
@@ -373,6 +390,7 @@
        dangdangLink: [],
        weidianLink: [],
        content: [],
        catalogue: [],
        authorIntroduction: [],
        // isApplyPaperBook: [],
        // isApplyEBook: [],
@@ -385,7 +403,7 @@
      },
    };
    app.MG.store.getProductDetail(query).then(async (res) => {
      console.log(res.datas, 'res.datas');
      this.getResourceCode(id, res.datas.rootCmsItemId)
      this.setData({
        bookDetail: res.datas,
        buyIdList: res.datas.purchasedSaleMethodIdList,
@@ -405,14 +423,19 @@
      this.getSubTtem();
      // 获取图书分类
      if (res.datas.bookClassification) {
        let classData = []
        const bookClassification = JSON.parse(res.datas.bookClassification);
        if (Array.isArray(bookClassification) && bookClassification.length) {
          for (let index = 0; index < bookClassification.length; index++) {
            const element = bookClassification[index];
            const iconType = element[0];
            const classType = element[1];
            await this.getBookClass(iconType, classType);
            classData.push({
              iconType,
              classType
            })
          }
          await this.getBookClass(classData);
        }
      }
@@ -452,8 +475,28 @@
        ),
      });
      console.log("图书信息", this.data.bookClass);
    });
  },
  getResourceCode(bookId, cmsId) {
    let query = {
      path: '*',
      queryType: '*',
      productId: bookId,
      cmsPath: cmsId,
      itemFields: {
        SysType: 'Cms'
      },
      pading: {
        start: 99,
        size: 0
      }
    }
    app.MG.store.getProductDetail(query).then((res) => {
      this.setData({
        resourceCodeList: res.datas.cmsDatas[0].datas
      })
      // console.log('图书资源', res.datas.cmsDatas[0].datas)
    })
  },
  //请求子商品的文件
  getSubTtem() {
@@ -571,28 +614,37 @@
    });
  },
  // 获取图书分类
  async getBookClass(iconType, classType) {
  async getBookClass(list) {
    let name = "";
    const query = {
      refCodes: ["bookClassification"],
    };
    await app.MG.store.getProductTypeField(query).then((res) => {
      JSON.parse(res[0].config).option.forEach((item) => {
        if (item.value == iconType) {
          item.child.forEach((citem) => {
            if (citem.value == classType) {
              const flag = this.data.bookClass.findIndex((ditem) => ditem == citem.name)
              if (flag == -1) {
                let list = this.data.bookClass
                list.push(citem.name)
                this.setData({
                  bookClass: list
                })
              }
      for (let aindex = 0; aindex < list.length; aindex++) {
        const aitem = list[aindex];
        const iconType = aitem.iconType
        const classType = aitem.classType
        JSON.parse(res[0].config).option.forEach((item) => {
          if (item.value == iconType) {
            if (item.child && item.child.length) {
              item.child.forEach((citem) => {
                if (citem.value == classType) {
                  const flag = this.data.bookClass.findIndex((ditem) => ditem == citem.name)
                  if (flag == -1) {
                    let list = this.data.bookClass
                    list.push(citem.name)
                    this.setData({
                      bookClass: list
                    })
                  }
                }
              });
            }
          });
        }
      });
          }
        });
      }
    });
  },
  // 收藏
@@ -644,8 +696,6 @@
      this.setData({
        showIndex: '1'
      })
    console.log(this.data.bookDetail.icon, '0111111');
    console.log(this.data.bookDetail.name, '45688');
  },
  // 跳转网店
  goShop(e) {
@@ -671,7 +721,7 @@
      const checkData = this.data.cmsDatas.find(
        (item) => item.refCode == e.detail.value
      );
      if (!this.data.resourceClassList.length) this.getResourceClass()
      if (checkData) {
        if (e.detail.value == "jsek_cloudLearning") {
          this.setData({
@@ -772,7 +822,7 @@
  },
  // 扁平化数据转换tree
  getTreeList(rootList, pathLength, newArr, path, addNum) {
  getTreeList(rootList, pathLength, newArr, path) {
    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)) {
@@ -790,13 +840,17 @@
        }
        // newArr.push(item)
        // 在插入过程中对数据进行排序
        newArr = this.insertAndSortObjectsByProductLinkPath(newArr, item, addNum)
        newArr = this.insertAndSortObjectsByProductLinkPath(newArr, item)
        // 插进数组后 从原数据中删除
        rootList = rootList.filter(nitem => nitem.id != item.id)
      }
    }
    //给数组里面再添加一个children的空数组
    // let addnum1 = pathLength - path.length == 6 ? 6 : 7
    for (const i of newArr) {
      i.children = []
      this.getTreeList(rootList, pathLength + addNum, i.children, i.productLinkPath, addNum)
      let addnum1 = i.productLinkPath.length - path.length == 6 ? 6 : 7
      this.getTreeList(rootList, pathLength + addnum1, i.children, i.productLinkPath)
      if (i.children.length == 0) {
        delete i.children
      }
@@ -821,10 +875,9 @@
  },
  // 排序数组 按照productLinkPath
  insertAndSortObjectsByProductLinkPath(array, newObj, addNum) {
  insertAndSortObjectsByProductLinkPath(array, newObj) {
    // 查找新对象应该插入的位置  
    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)));
    let insertIndex = array.findIndex(obj => Number(newObj.productLinkPath.substring(newObj.productLinkPath.lastIndexOf('\\') + 1, newObj.productLinkPath.length)) < Number(obj.productLinkPath.substring(obj.productLinkPath.lastIndexOf('\\') + 1, obj.productLinkPath.length)));
    // 如果没有找到合适的位置,则放在数组末尾  
    if (insertIndex === -1) {
      insertIndex = array.length;
@@ -834,10 +887,10 @@
    // 测试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))) {
      if (Number(a.productLinkPath.substring(a.productLinkPath.lastIndexOf('\\') + 1, a.productLinkPath.length)) < Number(b.productLinkPath.substring(b.productLinkPath.lastIndexOf('\\') + 1, 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))) {
      if (Number(a.productLinkPath.substring(a.productLinkPath.lastIndexOf('\\') + 1, a.productLinkPath.length)) > Number(b.productLinkPath.substring(b.productLinkPath.lastIndexOf('\\') + 1, b.productLinkPath.length))) {
        return 1;
      }
      // a must be equal to b  
@@ -879,7 +932,7 @@
        size: 999
      },
    }
    app.MG.store.getProductDetail(query).then((res) => {
    app.MG.store.getProductDetailNoChildren(query).then((res) => {
      if (!res.datas.cmsDatas[0].datas.length) {
        return this.setData({
          noResources: true,
@@ -912,7 +965,19 @@
            learnPath: type.productLinkPath
          })
          const dataList = res.datas.cmsDatas[0].datas
          if (dataList.length) {
          // 先判断是否否买云学习整个目录
          let couldId = null
          let codeData = null
          if (this.data.resourceCodeList.length) {
            codeData = this.data.resourceCodeList.find(item => item.refCode == 'jsek_cloudLearning')
            if (codeData && codeData.saleMethod && codeData.saleMethod.length)
              couldId = codeData.saleMethod[0].Id
          }
          if (couldId) {
            this.setData({
              isGoBuyResource: this.data.buyIdList.indexOf(couldId) > -1 ? false : true
            })
          } else if (dataList.length) {
            const tag = dataList.findIndex(item => item.saleMethod.length && item.saleMethod[0].Price > 0)
            this.setData({
              isGoBuyResource: tag > -1 ? true : false
@@ -923,19 +988,21 @@
            })
          }
        }
        const addNum = query.cmsPath.length > 12 ? 7 : query.cmsPath.length > 14 ? 8 : 6
        const addNum = query.cmsPath.length > 10 ? 7 : query.cmsPath.length > 13 ? 8 : 6
        const num = query.cmsPath.length + addNum
        this.getTreeList(res.datas.cmsDatas[0].datas, num, list, '\\', addNum)
        this.getTreeList(res.datas.cmsDatas[0].datas, num, list, '\\')
        list = this.ensureTreeConsistency(list)
        list = this.changeResourceChildren(list)
        console.log('修改后云', list);
        let result = [];
        if (type.refCode == "jsek_teachingResources") {
          this.findChildIds(list, result);
          // const newUSeList = this.deleteTreeData(list, result)
          // console.log('树剔除', result, newUSeList);
          // console.log('树加一', this.increaseTreeData(list, newUSeList, 16094));
          this.setData({
            teach: list,
            loading: false,
            openTeachids: result,
            loading: false,
            teach: list,
          });
        } else if (type.refCode == "jsek_cloudLearning") {
          let arr = this.handleTreeData(list).filter(
@@ -960,15 +1027,16 @@
  },
  //  获取 云测试
  getResourceData(type) {
    this.setData({
    var that = this
    that.setData({
      loading: true,
      noResources: false,
    });
    let query = {
      path: "*",
      queryType: "*",
      storeInfo: this.data.options.storeInfo,
      productId: this.data.bookDetail.id,
      storeInfo: that.data.options.storeInfo,
      productId: that.data.bookDetail.id,
      cmsPath: type.productLinkPath,
      cmsType: '*',
      itemFields: {
@@ -995,37 +1063,57 @@
        if (type.refCode == "questionBank") {
          let data = []
          let result = [];
          if (this.data.options.storeInfo == 'jsek_jslx') {
          const isTSFW = res.datas.cmsDatas[0].datas.filter(
            (item) =>
            item.type == 'questionBankFolder' &&
            (item.name == '填空题' ||
              item.name == '判断题' ||
              item.name == '单选题' ||
              item.name == '多选题' ||
              item.name == '简答题')
          )
          if (that.data.options.storeInfo == 'jsek_jslx') {
            data = res.datas.cmsDatas[0].datas.filter((item) => item.type == 'questionBankFolder');
            if (data.length > 0) {
              this.setData({
              that.setData({
                test: data,
                loading: false,
                openTeachids: result,
              });
            } else {
              this.setData({
              that.setData({
                noResources: true,
                loading: false,
              });
            }
          } else {
            data = res.datas.cmsDatas[0].datas.filter((item) => item.type == 'questionBankFolder' && item.childrenFolderCount > 0);
            if (isTSFW.length > 0) {
              data = res.datas.cmsDatas[0].datas.filter((item) => item.type == 'questionBankFolder' && item.childrenFolderCount > 0)
              that.setData({
                jslx: false,
              });
            } else {
              data = res.datas.cmsDatas[0].datas.filter((item) => item.type == 'questionBankFolder')
              that.setData({
                jslx: true,
              });
            }
            if (data.length > 0) {
              let list = []
              // 测试 6位// 正式 5位//  测试调用传20,内部7  正式调用传17 内部传6
              const addNum = query.cmsPath.length > 12 ? 7 : query.cmsPath.length > 14 ? 8 : 6
              const addNum = query.cmsPath.length > 10 ? 7 : query.cmsPath.length > 13 ? 8 : 6
              const num = query.cmsPath.length + addNum
              this.getTreeList(data, num, list, '\\', addNum)
              list = this.ensureTreeConsistency(list)
              this.findChildIds(list[0].children, result);
              this.setData({
                test: list[0].children,
              that.getTreeList(data, num, list, '\\')
              list = that.ensureTreeConsistency(list)
              that.findChildIds(list[0].children, result);
              that.setData({
                test: list.length == 1 && list[0].name == '题库' ? list[0].children : list,
                loading: false,
                openTeachids: result,
              });
            } else {
              this.setData({
              that.setData({
                noResources: true,
                loading: false,
              });
@@ -1129,7 +1217,7 @@
      for (let i = 0; i < data.length; i++) {
        if (index < 3) {
          const item = data[i]
          if (item.childrenFolderCount > 0) {
          if (item.children && item.children.length > 0) {
            result.push(item.id)
            if (item.children) {
              for (let j = 0; j < item.children.length; j++) {
@@ -1247,9 +1335,7 @@
            url,
          });
        }
      } else {
        console.log(222);
      }
      } else {}
    } else {
      wx.showToast({
        title: "商品不在有效期",
@@ -1552,7 +1638,16 @@
  },
  // 判断资源是否购买
  resourceIsBuy(data) {
    if (data.saleMethod && data.saleMethod.length) {
    let couldId = null
    let codeData = null
    if (this.data.resourceCodeList.length) {
      codeData = this.data.resourceCodeList.find(item => item.refCode == 'jsek_cloudLearning')
      if (codeData && codeData.saleMethod && codeData.saleMethod.length)
        couldId = codeData.saleMethod[0].Id
    }
    if (couldId) {
      return this.data.buyIdList.indexOf(couldId) > -1 ? false : true
    } else if (data.saleMethod && data.saleMethod.length) {
      const isSHow = this.data.buyIdList.some(
        (item) => item == data.saleMethod[0].Id
      );
@@ -1598,7 +1693,16 @@
  },
  // 判断资源加入购物车按钮是否显示
  isShoppingCart(data) {
    if (data.saleMethod && data.saleMethod.length) {
    let couldId = null
    let codeData = null
    if (this.data.resourceCodeList.length) {
      codeData = this.data.resourceCodeList.find(item => item.refCode == 'jsek_cloudLearning')
      if (codeData && codeData.saleMethod && codeData.saleMethod.length)
        couldId = codeData.saleMethod[0].Id
    }
    if (couldId) {
      return this.data.buyIdList.indexOf(couldId) > -1 ? false : true
    } else if (data.saleMethod && data.saleMethod.length) {
      if (data.saleMethod[0].Price <= 0) return false;
      // 再判断是否购买
      const isBuy = this.data.buyIdList.some(
@@ -2210,7 +2314,6 @@
            });
            return false;
          } else if (isApply.state == 'Normal') {
            console.log(isApply.state, "isApply.state")
            const flag = new Date(isApply.feedBack.endDate + ' 23:59:59').getTime() > new Date().getTime()
            if (flag) {
              wx.showToast({
@@ -2415,4 +2518,274 @@
      teach: tree,
    });
  },
});
  // 剔除树结构多余,只保留初始需要展开的
  // 第一步:保留树结构前两层,并将展开项加入数组
  deleteTreeData(list, openids) {
    let resultList = []
    for (let index = 0; index < list.length; index++) {
      const item = list[index];
      if (item.children.length > 0) {
        for (let cindex = 0; cindex < item.children.length; cindex++) {
          const citem = item.children[cindex];
          citem.children = []
        }
      }
      resultList.push(item)
    }
    for (let index = 0; index < openids.length; index++) {
      const id = openids[index];
      // 展开项加入数组
      this.increaseTreeData(list, resultList, id)
    }
    return resultList
  },
  // 传递ids,将需要展开的id的children 赋值
  increaseTreeData(treeList, list, openid) {
    let num = 0;
    // let useData = treeList.find(item => item.id == openid)
    for (let index = 0; index < treeList.length; index++) {
      const item = treeList[index];
      if (item.id == openid && num >= 3) {
        let useArr = item.children ? item.children : []
        this.changeList(list, openid, useArr)
      } else {
        num += 1
        this.increaseTreeData(item.children, list, openid)
      }
    }
  },
  // 递归前两层,找出需要展开的
  changeList(isList, id, childrenList) {
    for (let dindex = 0; dindex < isList.length; dindex++) {
      const ditem = isList[dindex];
      if (ditem.id == id) {
        ditem.children = childrenList
        return true
      } else {
        this.changeList(ditem.children, id, childrenList)
      }
    }
    return childrenList
  },
  uploadFile(e) {
    console.log(123)
    this.setData({
      dialogBox: true,
      isShowUp: true
    });
  },
  closeDialog() {
    this.setData({
      dialogBox: false,
    });
  },
  onCloseProtocol() {
    this.setData({
      protocolShow: false,
    });
  },
  onVisibleChange(e) {
    this.setData({
      protocolShow: e.detail.visible,
    });
  },
  //查看协议
  getAgreement() {
    let query = {
      path: 'jsek_protocol',
      fields: {
        content: [],
      }
    }
    app.MG.resource.getItem(query).then((res) => {
      try {
        const data = res.datas.find((e) => e.refCode == 'jsek_authorizationAndConsentLetter')
        this.setData({
          protocolTxt: data && data.content ? data.content : '暂无协议',
          protocolShow: true
        });
      } catch (error) {
        this.setData({
          protocolTxt: '暂无协议',
          protocolShow: true,
        });
      }
    })
  },
  onNameInput(e) {
    console.log(e.detail.value)
    this.setData({
      'resourceInfo.resourceName': e.detail.value,
    });
  },
  onFileTypeInput(e) {
    this.setData({
      'resourceInfo.fileType': e.detail.value,
    });
  },
  textareaChange(e) {
    this.setData({
      'resourceInfo.description': e.detail.value,
    });
  },
  onChange() {
    if (this.data.resourceInfo.agree) {
      this.setData({
        'resourceInfo.agree': false,
      });
    } else {
      this.setData({
        'resourceInfo.agree': true,
      });
    }
  },
  uploadPicture() {
    var that = this;
    wx.chooseMessageFile({
      count: 1,
      type: 'file',
      success(res) {
        const isLt2M = res.tempFiles[0].size / 1024 / 1024 < 50
        if (!isLt2M) {
          return wx.showToast({
            title: "上传文件大小不能超过 50MB!",
            icon: "none",
            duration: 1000,
          });
        }
        const FileName = res.tempFiles[0].name.split('.')[0]
        const Extension = res.tempFiles[0].name.split('.')[1]
        var medioType = ''
        const audioData = ['mp3', 'mp3']
        const videoData = ['mp4', 'avi']
        const pdfData = ['pdf']
        const Compression = ['rar', 'zip']
        const pictureData = ['jpg', 'png']
        if (audioData.indexOf(Extension) > -1) {
          medioType = '音频'
        } else if (videoData.indexOf(Extension) > -1) {
          medioType = '视频'
        } else if (pdfData.indexOf(Extension) > -1) {
          medioType = 'PDF'
        } else if (Compression.indexOf(Extension) > -1) {
          medioType = '资源包'
        } else if (pictureData.indexOf(Extension) > -1) {
          medioType = '图片'
        } else {
          medioType = '其他'
        }
        wx.getFileSystemManager().getFileInfo({
          filePath: res.tempFiles[0].path, //选择图片返回的相对路径
          // encoding: 'binary', //编码格式
          success: ress => {
            //成功的回调
            let md5 = ress.digest;
            let formData = new FormData();
            formData.append('Md5', md5);
            formData.append('FileName', FileName);
            formData.append('FileType', res.tempFiles[0].type);
            formData.appendFile("file", res.tempFiles[0].path);
            const data = formData.getData();
            let _token = wx.getStorageSync(app.config.tokenKey);
            let header = {};
            if (_token == null) {
              header["Authorization"] = `Basic ${Base64.encode(website.clientId + ":" + website.clientSecret)}`;
            } else {
              header["Authorization"] = `Bearer ` + _token;
            }
            new Promise((resolve, reject) => {
              wx.request({
                url: app.config.requestCtx + '/file/api/ApiUpload',
                method: 'POST',
                header: {
                  'content-type': data.contentType,
                  ...header
                },
                data: data.buffer,
                success(res1) {
                  resolve(res1.data);
                  if (res1.data) {
                    let file = [{
                      name: res.tempFiles[0].name,
                      md5: md5,
                      type: medioType,
                      FileType: Extension
                    }]
                    that.setData({
                      "resourceInfo.resourceName": FileName,
                      "resourceInfo.fileType": medioType,
                      fileList: file,
                      isShowUp: false
                    })
                  }
                }
              })
            })
          }
        })
      }
    })
  },
  handleRemove(e) {
    console.log(e)
    let md5 = e.currentTarget.dataset.md5
    for (let i = 0; i < this.data.fileList.length; i++) {
      if (this.data.fileList.md5 == md5) {
        this.data.fileList.splice(i, 1)
      }
    }
    this.setData({
      isShowUp: true,
    });
  },
  confirmM() {
    if (this.data.resourceInfo.resourceName == '') {
      return wx.showToast({
        icon: "error",
        title: "请填写资源名称",
      });
    }
    if (this.data.resourceInfo.fileType == '') {
      return wx.showToast({
        icon: "error",
        title: "请填写资源类型",
      });
    }
    if (!this.data.fileList.length) {
      return wx.showToast({
        icon: "error",
        title: "请上传资源文件",
      });
    }
    if (!this.data.resourceInfo.agree) {
      return wx.showToast({
        icon: "none",
        title: "请同意《授权同意书》!",
      });
    }
    let query = {
      topicIdOrRefCode: "uploadFiles",
      name: this.data.bookDetail.name,
      content: JSON.stringify(JSON.parse(JSON.stringify(this.data.fileList))),
      type: 'UserSubmit',
      description: this.data.resourceInfo.description,
      cmsTypeRefCode: '',
      newDataListRequest: []
    }
    app.MG.ugc.newTopicMessage(query).then((res) => {
      wx.showToast({
        icon: "success",
        title: "请上传资源文件",
      });
      this.setData({
        dialogBox: false,
      });
    })
  }
})