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

const TAG = 'PageHelper';

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

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

  /**
   * 进页面请求数据
   */
  async getInitData(pageModel: PageModel, pageAdvModel: PageAdModel) {
    pageModel.loadStrategy = 1
    let netStatus = NetworkUtil.isNetConnected()
    if (netStatus) {
      this.getPageInfo(pageModel, pageAdvModel)
    } else {
      pageModel.viewType = ViewType.EMPTY;
      pageModel.emptyType = WDViewDefaultType.WDViewDefaultType_NoNetwork;
    }
  }

  getPageInfo(pageModel: PageModel, pageAdvModel: PageAdModel) {
    pageModel.currentPage = 1;
    PageViewModel.getPageInfo(pageModel.pageId).then(pageInfo => {
      if (pageInfo == null) {
        pageModel.viewType = ViewType.EMPTY;
        pageModel.emptyType = WDViewDefaultType.WDViewDefaultType_NoListContent;
        return;
      }
      pageModel.pageInfo = pageInfo;
      //解析广告资源
      pageAdvModel.analysisAdvSource(pageInfo);
      this.parseGroup(pageModel)
    }).catch(() => {
      pageModel.viewType = ViewType.EMPTY;
      pageModel.emptyType = WDViewDefaultType.WDViewDefaultType_ContentFailed;
    })
  }


  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;
      pageModel.emptyType = WDViewDefaultType.WDViewDefaultType_NoListContent;

    }
  }

  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 (isLastGroup) {
        // 认为分页只会在最后一个group里
        pageModel.currentPage++;
      }
      // pageModel.currentPage++;
      pageModel.hasMore = true;

      //移除音频 和 活动
      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>, pageModel: PageModel, 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) {
      let bannerAdvIndex = 0; // banner组件展示数据投放
      let layoutAdvIndex = 0; //稿件投放统计
      // 升序排序
      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) {

              let position = slotInfo.position - 1;
              // 检测newCompList 集合中是否有轮播组件资源
              let adCompId = slotInfo.compId;
              if (!StringUtils.isEmpty(adCompId)) {
                for (let compBean of pageCompList) {
                  if (StringUtils.isEmpty(compBean.id)) {
                    continue
                  }
                  let compId = compBean.id.toString();
                  //匹配组件
                  if (adCompId == compId) {
                    // 运营位数据
                    let dataList = compBean.operDataList;
                    if (dataList != null) {

                      // 数组转成 ArrayList
                      let changeArrayList = (dataList: ContentDTO[]) => {
                        let compOperData: ArrayList<ContentDTO> = new ArrayList()
                        for (let dataListBean of dataList) {
                          compOperData.add(dataListBean)
                        }
                        return compOperData
                      }

                      let compOperData = changeArrayList(dataList)

                      // 轮播组件广告数据转 业务信息
                      let changeContentDTO = (matInfo: CompAdvMatInfoBean) => {
                        let advContentBean: ContentDTO = {} as ContentDTO;
                        advContentBean.newsTitle = matInfo.advTitle
                        advContentBean.objectType = matInfo.advType == "0" ? matInfo.advType : "4"
                        advContentBean.coverUrl = matInfo.matImageUrl[0]
                        advContentBean.linkUrl = matInfo.linkUrl
                        advContentBean.openType = matInfo.linkType
                        advContentBean.corner = ''
                        return advContentBean
                      }
                      let advContentBean = changeContentDTO(matInfo)

                      let dataListSize = dataList.length;
                      if (position < dataListSize) {
                        //dataList.add(position + bannerAdvIndex, advContentBean);
                        compOperData.insert(advContentBean, position + bannerAdvIndex)
                      } else {
                        compOperData.add(advContentBean);
                      }
                      bannerAdvIndex = bannerAdvIndex + 1;

                      // ArrayList转成 数组
                      compBean.operDataList = compOperData.convertToArray()
                    }
                  }
                }
              }

            } else {


              let advPosition = slotInfo.position //广告位置,从1开始
              // 页面的comp总数 - 这次请求的comp总数 = 剩余comp总数
              advPosition = advPosition - 1

              let a = pageModel.pageTotalCompSize - pageCompSize
              if (advPosition <= pageModel.pageTotalCompSize && advPosition >= a) {

                let b = advPosition - a;
                console.error('ZZZXXXXX', matInfo.advSubType + '-------------' + matInfo.advTitle + "  "+ advPosition + "  "+a+"  "+b)
                if (b <= pageCompSize && b >= 0) {

                  let advComp: CompDTO = {
                    compStyle: CompStyle.Card_Comp_Adv,
                    matInfo: matInfo
                  } as CompDTO;

                  if (pageCompSize == slotInfo.position) {
                    pageCompList.add(advComp)
                  } else {
                    pageCompList.insert(advComp, b + layoutAdvIndex)
                  }

                  layoutAdvIndex = layoutAdvIndex + 1;

                }
              }

            }
          }
        }

      }

    }
    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 {
          // 直接认为有分页,一直加载分页。直到没有数据,再停止
          pageModel.currentPage++;
          pageModel.hasMore = true;
          let sizeBefore: number = pageModel.compList.size();

          //移除音频 和 活动
          this.collectPageComp(pageModel, data)
          //
          // pageModel.compList.push(...data.compList)
          PageViewModel.getInteractData(pageModel.compList.getDataArray()).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)
      }
    }

    pageModel.pageTotalCompSize = pageCompList.length + pageModel.pageTotalCompSize
    console.error("ZZZXXXXX", " collectPageComp--->" + pageModel.pageTotalCompSize);

    // 处理页面广告数据,投放到页面的位置
   // this.handlePageCompAdvPostion(pageCompList, pageModel, pageDto);


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


  }
}


let pageHelper = new PageHelper();

export default pageHelper as PageHelper;