PageHelper.ets 8.72 KB
import { PageDTO, CompDTO, PageInfoDTO, ContentDTO } from 'wdBean';
import { CompStyle, ViewType } from 'wdConstant/Index';
import { CollectionUtils, DateTimeUtils, Logger } from 'wdKit';
import { closeRefresh } from '../utils/PullDownRefresh';
import PageModel from './PageModel';
import PageViewModel from './PageViewModel';
import { promptAction } from '@kit.ArkUI';
import { AdvRuleBean, CompAdvBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean';
import PageAdModel from './PageAdvModel';
import { ArrayList } from '@kit.ArkTS';

const TAG = 'PageHelper';

/**
 * 处理返回后的数据
 */
export class PageHelper {
  /**
   * 刷新数据
   */
  async refreshUI(pageModel: PageModel, pageAdvModel: PageAdModel) {
    pageModel.loadStrategy = 2
    this.getPageInfo(pageModel, pageAdvModel)
  }

  /**
   * 分页加载
   */
  async loadMore(pageModel: PageModel) {
    pageModel.loadStrategy = 3
    // 暂只支持comp分页加载,节目分页加载的得完善框架(如直播回看节目数据分页)
    this.compLoadMore(pageModel)
  }

  /**
   * 进页面请求数据
   */
  async getInitData(pageModel: PageModel, pageAdvModel: PageAdModel) {
    pageModel.loadStrategy = 1
    this.getPageInfo(pageModel, pageAdvModel)
  }

  async getPageInfo(pageModel: PageModel, pageAdvModel: PageAdModel) {
    pageModel.currentPage = 1;
    let pageInfo = await PageViewModel.getPageInfo(pageModel.pageId);
    if (pageInfo == null) {
      pageModel.viewType = ViewType.EMPTY;
      return;
    }
    pageModel.pageInfo = pageInfo;
    //解析广告资源
    pageAdvModel.analysisAdvSource(pageInfo)

    this.parseGroup(pageModel)

  }


  async parseGroup(pageModel: PageModel) {
    let pageInfo: PageInfoDTO = pageModel.pageInfo
    pageModel.groupList = []
    pageModel.groupList.push(...pageInfo.groups)
    for (const group of pageInfo.groups) {
      pageModel.isRecGroup = group.groupStrategy === 1;
      pageModel.groupId = group.id;
      if (pageModel.isRecGroup) {
        pageModel.pageSize = 10
      } else {
        pageModel.pageSize = 20
      }
      pageModel.groupData = group
      // await,确保groups接口顺序执行
      let pageDto = await PageViewModel.getPageData(pageModel.bizCopy()) as PageDTO
      let index = pageInfo.groups.indexOf(group)
      if (index == 0) {
        // 清空comp列表
        pageModel.compList.clear()
      }
      this.getGroupData(pageModel, pageDto, index == pageInfo.groups.length - 1)


    }
    if (pageModel.compList.isEmpty()) {
      // 没数据,展示空页面
      Logger.debug(TAG, 'aboutToAppear, data response page ' + pageModel.pageId + ', comp list is empty.');
      pageModel.viewType = ViewType.EMPTY;
    }
  }

  private async getGroupData(pageModel: PageModel, pageDto: PageDTO, isLastGroup: boolean) {
    pageModel.timestamp = DateTimeUtils.getTimeStamp().toString()
    if (pageDto && pageDto.compList && pageDto.compList.length > 0) {
      pageModel.viewType = ViewType.LOADED;
      let sizeBefore: number = pageModel.compList.size();
      if (pageDto.compList.length === pageModel.pageSize) {
        pageModel.currentPage++;
        pageModel.hasMore = true;
      } else {
        pageModel.hasMore = false;
      }

      //移除音频 和 活动
      this.collectPageComp(pageModel, pageDto)


      // pageModel.compList.push(...pageDto.compList)

      // TODO 暂时去掉互动数据,待优化。(主要是互动数据返回,如何渲染到ui上)
      // TODO updateItems(sizeBefore, data),这里可能有时序问题,导致覆盖别的group数据,需要优化,考虑精准替换
      // 二次请求,批查互动数据
      // PageViewModel.getInteractData(pageDto.compList).then((data: CompDTO[]) => {
      //   // 刷新,替换所有数据
      //   // pageModel.compList.replaceAll(...data)
      //   pageModel.compList.updateItems(sizeBefore, data)
      //   pageModel.timestamp = DateTimeUtils.getTimeStamp().toString()
      // })
      // content级别的展现加载丢给comp自己,这里只需要处理屏蔽分页加载,pageModel.pageScroll
      if (isLastGroup) {
        closeRefresh(pageModel, true);
        // 最后一个楼层,特殊处理
        // 检测楼层最后一个组件业务数据是否需要通过访问接口获取
        let comp: CompDTO = pageDto.compList[pageDto.compList.length - 1]
        let compSize = CollectionUtils.getListSize(comp.operDataList)
        // 直播回放,需要二次请求数据
        if (compSize <= 0 && comp.compStyle == CompStyle.Zh_Grid_Layout_02) {
          // 这个comp,数据自己二次请求,自己分页处理,这里加flag,将page层滑动及loadmore ui去掉
          pageModel.contentNeedScroll = true
        }
      }
    }
  }


  /**
   *   处理页面中的广告组件信息
   * @param pageDto
   */
  private handlePageCompAdvPostion(pageCompList: ArrayList<CompDTO>, pageDto: PageDTO) {

    let compAdvList = pageDto.compAdList

    let flag = true;
    if (compAdvList == null) {
      flag = false
    }
    if (compAdvList.length == 0) {
      flag = false
    }

    let pageCompSize = pageCompList.length // 信息流组件业务数量
    console.error("ZZZXXXXX", " start--->" + pageCompSize);

    if (pageCompSize == 0) {
      flag = false
    }

    if (flag) {
      // 升序排序
      compAdvList.sort((a: CompAdvBean, b: CompAdvBean) => a.slotInfo.position - b.slotInfo.position)
      console.error("ZZZXXXXX", " 排序后的广告--->" + JSON.stringify(compAdvList));
      //当前日期
      let serverTimeLong: number = DateTimeUtils.getTimeStamp();
      for (let advBean of compAdvList) {
        let slotInfo = advBean.slotInfo

        if (slotInfo != null) {
          // 广告有效日期
          let startLong = advBean.startTime;
          let endLong = advBean.endTime;
          //符合开始时间和结束时间要求
          if (serverTimeLong >= startLong && serverTimeLong <= endLong) {

            let matInfo = advBean.matInfo
            if (matInfo == null) {
              continue
            }

            let advSubType = matInfo.advSubType

            // 插入轮播组件的广告
            if (4 == advSubType) {

            } else {
              let advPosition = slotInfo.position //广告位置,从1开始
              advPosition = advPosition - 1
              let advComp: CompDTO = {
                compStyle: CompStyle.Card_Comp_Adv,
                matInfo: matInfo
              } as CompDTO;
              pageCompList.insert(advComp, 0)
            }
          }
        }

      }

    }
    console.error("ZZZXXXXX", " end--->" + pageCompList.length);
  }


  /**
   * comp加载更多,分页加载
   */
  private compLoadMore(pageModel: PageModel) {
    PageViewModel.getPageData(pageModel.bizCopy())
      .then((data: PageDTO) => {
        pageModel.timestamp = DateTimeUtils.getTimeStamp().toString()
        if (data == null || data.compList == null || data.compList.length == 0) {
          pageModel.hasMore = false;
        } else {
          if (data.compList.length == pageModel.pageSize) {
            pageModel.currentPage++;
            pageModel.hasMore = true;
          } else {
            pageModel.hasMore = false;
          }
          let sizeBefore: number = pageModel.compList.size();

          //移除音频 和 活动
          this.collectPageComp(pageModel, data)
          //
          // pageModel.compList.push(...data.compList)
          PageViewModel.getInteractData(data.compList).then((data: CompDTO[]) => {
            // 刷新,替换所有数据
            pageModel.compList.updateItems(sizeBefore, data)
            pageModel.timestamp = DateTimeUtils.getTimeStamp().toString()
          })
        }
      }).catch((err: string | Resource) => {
      promptAction.showToast({ message: err });
    })
  }

  /**
   * 移除comp
   */
  private collectPageComp(pageModel: PageModel, pageDto: PageDTO) {

    let pageCompList: ArrayList<CompDTO> = new ArrayList() // 收集页面组件、稿件和本地组件容器

    let datas = pageDto.compList
    for (let index = 0; index < datas.length; index++) {
      const element = datas[index];
      let contentInfo: ContentDTO = CollectionUtils.getElement(element.operDataList, 0);
      //移除音频 和 活动
      if (contentInfo && (contentInfo.objectType === '13' || contentInfo.objectType === '3')) {
        Logger.debug(TAG, 'getGroupData 移除音频 和 活动');
      } else {
        pageCompList.add(element)
      }
    }
    // 处理页面广告数据,投放到页面的位置
    //this.handlePageCompAdvPostion(pageCompList, pageDto);

    //遍历所有组件和稿件数据 push到页面
    for (let element of pageCompList) {
      pageModel.compList.push(element)
    }


  }
}


let pageHelper = new PageHelper();

export default pageHelper as PageHelper;