PageAdvModel.ets 4.95 KB
import { PageInfoDTO,TopicDetailData } from 'wdBean/Index';
import { AdvRuleBean, CompAdvBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean';
import {  DateTimeUtils, SPHelper } from 'wdKit/Index';
import { ArrayList } from '@kit.ArkTS';
import { SpConstants } from 'wdConstant/Index';

/**
 * @Description: 处理页面的广告业务
 * @Author: lyb
 * @Email: liyubing@wondertek.com.cn
 * @CreateDate:
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
export default class PageAdModel {
  //左右挂角广告对象
  pageCornerAdv: CompAdvBean = {} as CompAdvBean
  // 挂角广告
  isShowAds: boolean = false;
  isRightAdv: number = 1;
  // 1:右边;2:左边 -> 默认右边
  pageCornerContentInfo: AdvRuleBean = {} as AdvRuleBean


  analysisAdvSource(pageInfo: PageInfoDTO) {
    this.analysisAllAdvSource(pageInfo.hasAdInfo,pageInfo.cornersAdv,pageInfo.cornersAdv2,pageInfo.id)
  }

  analysisTopicAdvSource(topicDetail: TopicDetailData) {
    this.analysisAllAdvSource(topicDetail.hasAdInfo,topicDetail.cornersAdv,topicDetail.cornersAdv2,topicDetail.id)
  }

  /**
   * 解析广告资源
   * @param pageInfo
   */
  private async analysisAllAdvSource(hasAdInfo: number,cornersAd: AdvRuleBean,cornersAd2: CompAdvBean[],id: number) {
    if (hasAdInfo === 1 && cornersAd != null) {
      // 优先展示展现中心广告
      let cornersAdv = cornersAd

      if (cornersAdv == null) {
        return
      }
      if (cornersAdv.advert == null) {
        return
      }

      if ("left_down" == cornersAdv.pos) {
        // 左边挂角广告
        this.isRightAdv = 2
      } else {
        // 右边挂角广告
        this.isRightAdv = 1

      }

      this.pageCornerContentInfo = cornersAdv;
      this.isShowAds = true

    } else if (cornersAd2 != null && cornersAd2.length > 0) {
      // 广告中心-挂角广告信息
      let cornersAdv2 = cornersAd2

      if (cornersAdv2.length == 0) {
        return
      }
      // 加工处理广告中心的广告数据
      let pageCoreAdvArray = this.treatPageInfoAdsData(cornersAdv2);

      let advLength = pageCoreAdvArray.length;
      let pageId = id.toString();
      let a = 0;
      if (advLength > 1) {
        a = await this.calPageAdvIndex(pageId,advLength)
      }
      // 获取投放
      let showCompAdvBean = pageCoreAdvArray.convertToArray()[a]

      if (showCompAdvBean.matInfo == null) {
        return
      }
      this.saveReleaseAdvIndex(pageId, a)
      //
      let slotInfo = showCompAdvBean.slotInfo;
      let postion = slotInfo.position
      if (postion == 0) {
        //左边挂角
        this.isRightAdv = 2
      } else {
        // 右边挂角
        this.isRightAdv = 1
      }
      this.pageCornerAdv = showCompAdvBean
      this.isShowAds = true
    }
  }

  /**
   *  计算投放广告的序列号
   * @param pageId
   * @param advLength
   * @returns
   */
  private async calPageAdvIndex(pageId: string , advLength: number): Promise<number>{

    let index = await this.obtainReleaseAdvIndex(pageId);
    let a = await index + 1;
    if (a >= advLength) {
      a = 0;
    }
    return  a;
  }

  /**
   *  获取已投放挂角广告的编号
   * @param pageId
   * @returns
   */
  private async obtainReleaseAdvIndex(pageId: string): Promise<number> {

    let index: number = await SPHelper.default.get(SpConstants.APP_PAGE_CORNER_ADV + pageId, -1) as number;

    return index;
  }

  /**
   *  存储已经投放广告的编号
   * @param pageId
   * @param index
   */
  private async saveReleaseAdvIndex(pageId: string, index: number) {
    await SPHelper.default.save(SpConstants.APP_PAGE_CORNER_ADV + pageId, index)
  }

  /**
   *  删除数据
   * @param pageId
   */
  private async clearHistoryAdvIndex(pageId: string){

    SPHelper.default.deleteSync(SpConstants.APP_PAGE_CORNER_ADV + pageId)

  }

  private checkPageCornerAdv(pageId: string): Promise<boolean> {
    let haveData = SPHelper.default.has(SpConstants.APP_PAGE_CORNER_ADV + pageId)
    return haveData
  }

  /**
   *  对广告中心的广告 数据按不同维度加工 筛选出符合的数据
   * @param cornersAdv2 页面的广告数据
   * @param pageId  所在页面pageid
   */
  private treatPageInfoAdsData(cornersAdv2: CompAdvBean[]): ArrayList<CompAdvBean> {

    // 按时间维度过滤出广告数据
    let compAdsArray: ArrayList<CompAdvBean> = new ArrayList();
    //当前日期
    let serverTimeLong: number = DateTimeUtils.getTimeStamp();
    for (let advBean of cornersAdv2) {
      let startLong = advBean.startTime;
      let endLong = advBean.endTime;

      if (serverTimeLong >= startLong && serverTimeLong <= endLong) {
        //符合开始时间和结束时间要求
        compAdsArray.add(advBean)
      }
    }

    //按展现优先级维度 数值越小,等级越高
    if (compAdsArray.length > 1) {
      //B、按展现优先级维度 数值越小,等级越高
      compAdsArray.sort((a: CompAdvBean, b: CompAdvBean) => a.displayPriority - b.displayPriority)
    }

    return compAdsArray;
  }
}