PageViewModel.ets 10.2 KB
import { NavigationBodyDTO, PageDTO,InteractDataDTO,ContentBean, InteractParam,CompDTO,
  MorningEveningPaperDTO } from 'wdBean';
import { CollectionUtils, Logger, ResourcesUtils, StringUtils } from 'wdKit';
import { ResponseDTO, } from 'wdNetwork';
import { PageRepository } from '../repository/PageRepository';
import { BaseViewModel } from './BaseViewModel';

const TAG = 'PageViewModel';
/**
 * mock数据开关,默认关。
 * mock数据是本地json数据,可自行修改内容(‘entry\src\main\resources\rawfile\’目录)
 */
const mock_switch = false;

/**
 * 处理返回后的数据
 */
export class PageViewModel extends BaseViewModel {
  getLogTag() {
    return TAG;
  }

  /**
   * get Nav Data from Resource .
   *
   * @return BottomNavBean[] Nav Data List
   */
  async getBottomNavData(context: Context): Promise<NavigationBodyDTO> {
    Logger.info(TAG, `getBottomNavData start`);
    if (mock_switch) {
      return this.getBottomNavDataMock(context);
    }
    return this.getNavData();
  }

  async getBottomNavDataMock(context: Context): Promise<NavigationBodyDTO> {
    Logger.info(TAG, `getBottomNavDataMock start`);
    let compRes: ResponseDTO<NavigationBodyDTO> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<NavigationBodyDTO>>(context, 'bottom_nav.json');
    if (!compRes || !compRes.data) {
      Logger.info(TAG, `getBottomNavDataMock compRes bottomNavList is empty`);
      return {} as NavigationBodyDTO
    }
    Logger.info(TAG, `getBottomNavDataMock getResourcesJsonSync compRes : ${JSON.stringify(compRes)}`);
    return compRes.data
  }

  private getNavData(): Promise<NavigationBodyDTO> {
    return new Promise<NavigationBodyDTO>((success, error) => {
      Logger.info(TAG, `getNavData start`);
      PageRepository.fetchNavigationDataApi().then((navResDTO: ResponseDTO<NavigationBodyDTO>) => {
        if (!navResDTO || !navResDTO.data) {
          Logger.error(TAG, 'getNavData then navResDTO is empty');
          error('navResDTO is empty');
          return
        }
        if (navResDTO.code != 0) {
          Logger.error(TAG, `getNavData then code:${navResDTO.code}, message:${navResDTO.message}`);
          error('navResDTO Response Code is failure');
          return
        }
        // let navResStr = JSON.stringify(navResDTO);
        Logger.info(TAG, "getNavData then,navResDTO.timestamp:" + navResDTO.timestamp);
        success(navResDTO.data);
      }).catch((err: Error) => {
        Logger.error(TAG, `fetchNavigationDataApi catch, error.name : ${err.name},  error.message:${err.message}`);
        error(err);
      })
    })
  }

  /**
   * Get PageDTO data.
   *
   * @return {GroupDTO} compRes.data
   */
  private async getPageData1(currentPage: number, context: Context): Promise<PageDTO> {
    if (currentPage > 1) {
      // 加载更多,返回无数据
      return {} as PageDTO
    }
    let compRes: ResponseDTO<PageDTO> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<PageDTO>>(context, 'comp_list0.json');
    if (!compRes || !compRes.data) {
      Logger.info(TAG, `getCompList compRes is empty`);
      return {} as PageDTO
    }
    Logger.info(TAG, `getCompList getResourcesJson compRes : ${JSON.stringify(compRes)}`);
    return compRes.data
  }

  /**
   * 获取【早晚报】数据
   */
  async getMorningEveningPaperData(pageId: string): Promise<MorningEveningPaperDTO> {
    Logger.debug(TAG, 'getPageData pageId: ' + pageId);
    // if (mock_switch) {
    //   return this.getPageData3(currentPage, context);
    // }

    return new Promise<MorningEveningPaperDTO>((success, error) => {
      PageRepository.fetchMorningEveningPaperData(pageId)
        .then((resDTO: ResponseDTO<MorningEveningPaperDTO>) => {
          if (!resDTO || !resDTO.data) {
            Logger.error(TAG, 'getNavData then resDTO is empty');
            error('resDTO is empty');
            return
          }
          if (resDTO.code != 0) {
            Logger.error(TAG, `getNavData then code:${resDTO.code}, message:${resDTO.message}`);
            error('resDTO Response Code is failure');
            return
          }
          Logger.info(TAG, "getNavData then,resDTO.timestamp:" + resDTO.timestamp);
          success(resDTO.data);
        })
        .catch((err: Error) => {
          Logger.error(TAG, `getPageData catch, error.name : ${err.name},  error.message:${err.message}`);
          error(err);
        })
    })
  }

  private async getPageData2(context: Context): Promise<PageDTO> {
    let compRes: ResponseDTO<PageDTO> | null = await ResourcesUtils.getResourcesJson<ResponseDTO<PageDTO>>(context, 'comp_list2.json');
    if (!compRes || !compRes.data) {
      Logger.info(TAG, `getCompList compRes is empty`);
      return {} as PageDTO
    }
    // router.push('')
    Logger.info(TAG, `getCompList getResourcesJson compRes : ${JSON.stringify(compRes)}`);
    return compRes.data
  }

  async getPageData(pageId: string, groupId: string, channelId: string, currentPage: number
    , pageSize: number, context: Context): Promise<PageDTO> {
    Logger.debug(TAG, 'getPageData pageId: ' + pageId);
    if (mock_switch) {
      return this.getPageData1(currentPage, context);
    }
    return new Promise<PageDTO>((success, error) => {
      PageRepository.fetchPageData(pageId, groupId, channelId, currentPage, pageSize)
        .then((resDTO: ResponseDTO<PageDTO>) => {
          if (!resDTO || !resDTO.data) {
            Logger.error(TAG, 'getNavData then resDTO is empty');
            error('resDTO is empty');
            return
          }
          if (resDTO.code != 0) {
            Logger.error(TAG, `getNavData then code:${resDTO.code}, message:${resDTO.message}`);
            error('resDTO Response Code is failure');
            return
          }
          Logger.info(TAG, "getNavData then,resDTO.timestamp:" + resDTO.timestamp);
          success(resDTO.data);
        })
        .catch((err: Error) => {
          Logger.error(TAG, `getPageData catch, error.name : ${err.name},  error.message:${err.message}`);
          error(err);
        })
    })
  }

  async getInteractData(compList: CompDTO[]) {
    let param: InteractParam = this.getInteractParams(compList);
    const SIZE = 20;
    // 批查接口,参数size限制20,这里截断分批查询,0,20;20,40...
    let count = Math.ceil(param.contentList.length / SIZE);
    let promises: Array<Promise<InteractDataDTO[]>> = new Array;
    if (count == 1) {
      let promise: Promise<InteractDataDTO[]> = this.createInteractDataPromise(param);
      promises.push(promise);
    } else {
      for (let i = 1; i <= count; i++) {
        // 将查询参数截断(参数限制20个),分批请求接口
        let subList = new Array<ContentBean>();
        let start = 0;
        let end = 0;
        if (i == count) {
          start = (i - 1) * SIZE;
          end = param.contentList.length;
          subList = CollectionUtils.getSubElements(param.contentList, start, end)
        } else {
          start = (i - 1) * SIZE;
          end = start + SIZE;
          subList = CollectionUtils.getSubElements(param.contentList, start, end)
        }
        let subParam: InteractParam = {} as InteractParam;
        subParam.contentList = subList;
        let promise: Promise<InteractDataDTO[]> = this.createInteractDataPromise(subParam);
        promises.push(promise);
      }
    }

    return new Promise<CompDTO[]>((success, error) => {
      Promise.all(promises).then((result) => {
        if (!CollectionUtils.isArray(result)) {
          success(compList);
          return;
        }

        let allInteractDataList: Array<InteractDataDTO> = new Array();
        result.forEach((value: InteractDataDTO[]) => {
          if (value != null && value.length > 0) {
            allInteractDataList.push(...value);
          }
        })
        // 批查全部完成,统一设置到comp里
        this.resetInteract(allInteractDataList, compList);
        success(compList);
      })
    })
  }

  private createInteractDataPromise(param: InteractParam) {
    return new Promise<InteractDataDTO[]>((success, error) => {
      PageRepository.fetchInteractData(param).then((resDTO: ResponseDTO<InteractDataDTO[]>) => {
        if (!resDTO || !resDTO.data) {
          Logger.info(TAG, "getInteractData then,resDTO.timeStamp:" + resDTO.timestamp);
          success([]);
          return;
        }
        success(resDTO.data);
      }).catch((err: Error) => {
        Logger.error(TAG, `getInteractData catch, error.name : ${err.name},  error.message:${err.message}`);
        // 无论是否成功(暂不做重试),都回调结果,通知刷新数据
        success([]);
      })
    });
  }

  private resetInteract(interact: InteractDataDTO[], compList: CompDTO[]) {
    if (interact == null || interact.length == 0) {
      return
    }
    interact.forEach((interactData) => {
      let id = interactData.contentId;
      outer: for (let i = 0; i < compList.length; i++) {
        let comp = compList[i];
        if (comp == null || comp.operDataList == null || comp.operDataList.length == 0) {
          continue;
        }
        for (let j = 0; j < comp.operDataList.length; j++) {
          let content = comp.operDataList[j];
          if (content == null) {
            continue;
          }
          if (id == content.objectId) {
            content.interactData = interactData;
            // TODO 测试代码,待删除
            // content.interactData.likeNum = Math.floor(Math.random() * Math.floor(999));;
            break outer;
          }
        }
      }
    })
  }

  private getInteractParams(compList: CompDTO[]): InteractParam {
    if (compList == null || compList.length == 0) {
      return {} as InteractParam;
    }

    let param: InteractParam = {} as InteractParam;
    param.contentList = new Array<ContentBean>();
    compList.forEach((value) => {
      let contentList = value.operDataList;
      if (contentList != null && contentList.length > 0) {
        contentList.forEach((v) => {
          if (StringUtils.isNotEmpty(v.objectId)) {
            let bean = {} as ContentBean;
            bean.contentId = v.objectId;
            bean.contentType = v.objectType;
            param.contentList.push(bean);
          }
        })
      }
    })
    return param;
  }
}


let pageViewModel = new PageViewModel();

export default pageViewModel as PageViewModel;