闫增涛
2024-09-18 c96612e8a63ecef9590be0f8b5199277ec94e5b9
packageBookService/pages/bookServices/detail/buyResource/index.js
@@ -1,108 +1,268 @@
// packageBookService/pages/bookServices/detail/buyResource/index.js
const app = getApp()
const app = getApp();
Page({
  /**
   * 页面的初始数据
   */
  data: {
    barHeight: '',
    navBarHeight: '',
    barHeight: "",
    navBarHeight: "",
    learn: [],
    openLearnids: [],
    bookId: '',
    loading: false,
    bookId: "",
    loading: true,
    shoppingList: [],
    shoppingCartGetId: [],
    methodId: [],
    paymentPage: false,
    superior: false,
    checkAllState: true,
    productLinkPath: '',
    refCode: '',
    naData: false,
    bookRefCode: []
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.getBookInfo(options.bookId);
    const systInfo = wx.getSystemInfoSync();
    const menu = wx.getMenuButtonBoundingClientRect(); // 胶囊信息
    const navBarHeight = (menu.top - systInfo.statusBarHeight) * 2 + menu.height; // 导航栏高度
    const navBarHeight =
      (menu.top - systInfo.statusBarHeight) * 2 + menu.height; // 导航栏高度
    this.setData({
      barHeight: systInfo.statusBarHeight,
      navBarHeight: navBarHeight,
      bookId: options.bookId
      bookId: options.bookId,
      productLinkPath: options.productLinkPath,
      refCode: options.refCode
    });
    this.getResourceClass()
    console.log(options);
    this.getResourceData({ productLinkPath: options.productLinkPath, refCode: options.refCode })
    this.getShoppingCartProductGet()
    this.getBookInfo(options.bookId)
    this.getShoppingCartProductGet();
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
  },
  onReady() {},
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
  },
  onShow() {},
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
  },
  onHide() {},
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  },
  onUnload() {},
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
  },
  onPullDownRefresh() {},
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
  },
  onReachBottom() {},
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {
  onShareAppMessage() {},
  onShareTimeline() {},
  changeCheckAll(e) {
    this.setData({
      checkAllState: e.detail.value,
    });
  },
  goBack() {
    wx.navigateBack()
    wx.navigateBack();
  },
  //  获取教学资源  云学习  云测试
  getResourceData(type) {
  // 获取所有子项数量
  getChildrenItem(data) {
    let num = 0
    function getNum(data) {
      for (let index = 0; index < data.length; index++) {
        const item = data[index];
        if (item.sysType == 'CmsItem') {
          num += 1
        } else if (item.sysType == 'CmsFolder') {
          if (item.children && item.children.length)
            getNum(item.children)
        }
      }
    }
    getNum(data)
    return num
  },
  // 给·目录添加子项数量
  changeResourceChildren(list) {
    const changeList = (list) => {
      for (let index = 0; index < list.length; index++) {
        const item = list[index];
        if (item.sysType == 'CmsFolder' && item.children && item.children.length) {
          item.childrenItem = this.getChildrenItem([item])
          changeList(item.children)
        } else if (item.sysType == 'CmsFolder' && item.children && !item.children.length) {
          item.childrenItem = 0
        } else if (item.sysType == 'CmsFolder' && !item.children) {
          item.childrenItem = 0
        }
      }
    }
    changeList(list)
    return list
  },
  // 扁平化数据转换tree
  getTreeList(rootList, newArr, path) {
    for (const item of rootList) {
      if (path == item.productLinkPath.replace('\\' + item.id, '')) {
        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 = this.insertAndSortObjectsByProductLinkPath(newArr, item)
        // 插进数组后 从原数据中删除
        rootList = rootList.filter(nitem => nitem.id != item.id)
      }
    }
    //给数组里面再添加一个children的空数组
    for (const i of newArr) {
      i.children = []
      this.getTreeList(rootList, 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 => newObj.id < obj.id);
    // 如果没有找到合适的位置,则放在数组末尾
    if (insertIndex === -1) {
      insertIndex = array.length;
    }
    // 插入新对象到数组
    array.splice(insertIndex, 0, newObj);
    // 测试6 正式5
    // 对数组进行排序
    array.sort((a, b) => {
      if (a.id < b.id) return -1;
      if (a.id > b.id) return 1;
      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;
  },
  // 递归树结构,如果父级有销售方式(有效期),去掉所有子集的销售方式
  clearTreeSealmethod(clearSaleMethod, tree) {
    for (let item of tree) {
      const saleData = item.saleMethod &&
        item.saleMethod.length ?
        item.saleMethod.find((citem) => citem.SaleType == 'Normal') : null
      if (
        ((saleData && new Date(saleData.EndDate).getTime() >= new Date().getTime() && new Date(saleData.BeginDate).getTime() <= new Date().getTime()) ||
          clearSaleMethod) && item.children && item.children.length
      ) {
        item.children.forEach((ditem) => (ditem.saleMethod = []))
      }
      if (item.children && item.children.length)
        this.clearTreeSealmethod(
          saleData && new Date(saleData.EndDate).getTime() >= new Date().getTime() && new Date(saleData.BeginDate).getTime() <= new Date().getTime(),
          item.children
        )
    }
    return tree
  },
  // 勾选禁用
  handleTreeCheck(tree) {
    for (const item of tree) {
      const saleData = item.saleMethod &&
        item.saleMethod.length ?
        item.saleMethod.find((citem) => citem.SaleType == 'Normal') : undefined
      if (saleData && new Date(saleData.EndDate).getTime() >= new Date().getTime() && new Date(saleData.BeginDate).getTime() <= new Date().getTime()) {
        item.disabled = false
      } else {
        item.disabled = true
      }
      if (item.children && item.children.length) this.handleTreeCheck(item.children)
    }
    return tree
  },
  //  获取云学习
  getResourceDataList(type) {
    this.setData({
      loading: true,
      noResources: false
    })
      noResources: false,
    });
    let query = {
      path: '*',
      queryType: '*',
      productId: this.data.bookId,
      productId: this.data.bookDetail.id,
      cmsPath: type.productLinkPath,
      cmsType: '*',
      itemFields: {
        SysType: 'CmsFolder',
        // 资源类型,试读文件,是否允许下载等参数
        learnSelectType: [],
        selectType: [],
        freeFile: [],
        file: [],
        protectedFile: [],
        resourcesClassification: [],
        isDownload: [],
        jsek_resourceBrief: [],
@@ -114,136 +274,60 @@
        size: 999
      },
    }
    app.MG.store
      .getProductDetail(query)
      .then(async (res) => {
        if (!res.datas.cmsDatas[0].datas.length) {
          return this.setData({
            noResources: true,
            loading: false
          })
        }
        //教学资源 云学习
        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
              })
              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
              })
              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
          })
        } 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)
    app.MG.store.getProductDetail(query).then((res) => {
      if (!res.datas.cmsDatas[0].datas.length) {
        return this.setData({
          noResources: true,
          loading: false,
        });
      }
    }
    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: []
      },
      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
      let list = []
      res.datas.cmsDatas[0].datas.forEach((item) => {
        item.checked = false;
        // if (item.sysType == 'CmsItem') {
        //   item.isbuy = this.resourceIsBuy(item);
        //   item.isShopCar = this.isShoppingCart(item);
        // }
      });
      // 显示 需要购买的和需要免费领取的
      this.getTreeList(res.datas.cmsDatas[0].datas, list, query.cmsPath)
      list = this.ensureTreeConsistency(list)
      list = this.changeResourceChildren(list)
      list = this.clearTreeSealmethod(false, list)
      list = this.handleTreeCheck(list)
      this.handleTreeData(list).forEach(item => {
        item.isbuy = this.resourceIsBuy(item);
        item.isShopCar = this.isShoppingCart(item);
      })
      // 网页 不能下载 私有文件
      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
        }
      }
      console.log('修改后云', list);
      let result = [];
      let arr = res.datas.cmsDatas[0].datas.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,
      });
    })
    data.datas.cmsDatas[0].datas.forEach(item => {
      item.checked = false
      item.isbuy = this.resourceIsBuy(item)
      item.isShopCar = this.isShoppingCart(item)
    })
    return data.datas.cmsDatas[0].datas
  },
  getBookInfo(id) {
    this.setData({
      "mockData'.id": 0,
      "mockData.price": 0,
      "mockData.count": 0
    })
  async getBookInfo(id) {
    const query = {
      path: '*',
      queryType: '*',
      path: "*",
      queryType: "*",
      productId: id,
      favoriteTypes: 'FavoriteBookCity',
      favoriteTypes: "FavoriteBookCity",
      itemFields: {
        'SysType=': 'CmsFolder',
        "SysType=": "CmsFolder",
      },
      coverSize: {
        height: 300,
@@ -269,11 +353,15 @@
        freeEpubPage: [], //epub试读百分比
      },
    };
    app.MG.store.getProductDetail(query).then(async (res) => {
    await app.MG.store.getProductDetail(query).then(async (res) => {
      this.setData({
        bookDetail: res.datas,
        buyIdList: res.datas.purchasedSaleMethodIdList
        buyIdList: res.datas.purchasedSaleMethodIdList,
      });
      this.getResourceDataList({
        productLinkPath: this.data.productLinkPath,
        refCode: this.data.refCode,
      })
    });
  },
@@ -283,87 +371,291 @@
      start: 0,
      size: 999,
      filterList: [],
      searchList: []
    }
      searchList: [],
    };
    app.MG.store.getShoppingCartProductList(query).then((res) => {
      const list = []
      const list = [];
      res.datas.forEach((item) => {
        list.push(item.saleMethod.id)
      })
        list.push(item.saleMethod.id);
      });
      this.setData({
        shoppingList: res.datas,
        shoppingCartGetId: list
      })
    })
        shoppingCartGetId: list,
      });
    });
  },
  // 判断资源是否购买
  resourceIsBuy(data) {
    if (data.saleMethod && data.saleMethod.length) {
      const isSHow = this.data.buyIdList.some((item) => item == data.saleMethod[0].Id)
      return !isSHow
      const saleData = data.saleMethod.find((item) => item.SaleType == 'Normal')
      if (saleData.State == 'Disable') return false
      const isShow = this.data.buyIdList.some(
        (item) => item == saleData.Id
      );
      // 已经购买
      if (isShow) return false
      // 未购买,查看销售方式是否过期
      if (!isShow) {
        const flag = new Date(saleData.EndDate).getTime() >= new Date().getTime() &&
          new Date(saleData.BeginDate).getTime() <= new Date().getTime()
        if (flag) {
          // 为过期 ,需要购买
          return true
        } else {
          // 已过期 无需购买
          return false
        }
      }
    } else {
      return false
      return false;
    }
  },
  // 判断资源加入购物车按钮是否显示
  isShoppingCart(data) {
    if (data.saleMethod && data.saleMethod.length) {
      if (data.saleMethod[0].Price <= 0) return false
      const saleData = data.saleMethod.find((item) => item.SaleType == 'Normal')
      // 先判断是否免费
      if (saleData.Price <= 0) return false
      // 再判断是否购买
      const isBuy = this.data.buyIdList.some((item) => item == data.saleMethod[0].Id)
      const isBuy = this.data.buyIdList.some((item) => item == saleData.Id)
      if (isBuy) {
        // 购买了
        return false
      } else {
        // 判断是否加入购物车
        const isSHow = this.data.shoppingCartGetId.some((item) => item == data.saleMethod[0].Id)
        return !isSHow
        const isShow = this.data.shoppingCartGetId.some((item) => item == saleData.Id)
        if (isShow) return false
        // 未购买,查看销售方式是否过期
        if (!isShow) {
          const flag = new Date(saleData.EndDate).getTime() >= new Date().getTime() &&
            new Date(saleData.BeginDate).getTime() <= new Date().getTime()
          if (flag) {
            // 为过期 ,需要购买
            return true
          } else {
            // 已过期 无需购买
            return false
          }
        }
      }
      // 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
      return false;
    }
  },
  // 获取展开项
  findChildIds(data, result) {
    let index = 0
    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)
        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.childrenCount > 0) {
                result.push(childrenItme.id)
                index += 1
              const childrenItme = item.children[j];
              if (item.children && item.children.length > 0) {
                result.push(childrenItme.id);
                index += 1;
              }
            } else {
              break
              break;
            }
          }
        } else if (item.childrenCount > 0) {
          result.push(item.id)
          index += 1
        } else if (item.children && item.children.length > 0) {
          result.push(item.id);
          index += 1;
        }
      } else {
        break
        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() {
    if (!this.data.learn.length) {
      return wx.showToast({
        icon: "error",
        title: '暂无数据',
      })
    }
    // 修改后方法
    const checkData = this.handleTreeData(this.data.learn).filter(item => item.checked == true)
    console.log('选中', checkData);
    // 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.length) {
    //   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
    })
  },
  checkAll() {
    const child = this.selectComponent('#tree')
    child.checkAll()
  // 单个勾选事件
  changeResourceChecked(e) {
    const id = e.detail.id
    const updated = this.checkResoucrceInfo(this.data.learn, id)
    this.setData({
      learn: updated
    })
  },
  upDateShopCar(id, tree) {
    for (let item of tree) {
      if (item.id == id) {
        item.isShopCar = false
      } else {
        if (item.children && item.children.length) this.upDateShopCar(id, item.children)
      }
    }
    return tree
  },
  // 更新购物车图标
  updateCloudLearning(e) {
    const {
      id
    } = e.detail
    console.log(id);
    const list = this.upDateShopCar(id, this.data.learn)
    this.setData({
      learn: list
    })
  }
})
});