liyubing

feat(信息流):一行两图卡业务数据转换成本地 稿件数据 Card_Comp_Zh_Grid_Layout-02

... ... @@ -39,7 +39,7 @@ export const enum CompStyle {
Zh_Single_Column_10 = 'Zh_Single_Column-10', //18 服务组合卡
Zh_Single_Column_11 = 'Zh_Single_Column-11', //19 问政组合卡
Zh_Grid_Layout_01 = 'Zh_Grid_Layout-01', //4 信息流组合卡
Zh_Grid_Layout_02 = 'Zh_Grid_Layout-02', //7 双列流小视频,一行两图卡
Zh_Grid_Layout_02 = 'Zh_Grid_Layout-02', //7 双列流小视频,一行两图卡 ->标题
Zh_Grid_Layout_03 = 'Zh_Grid_Layout-03', //11 金刚位卡
Card_01 = '1', // 小图卡
Card_02 = '2', // 大图卡
... ... @@ -80,5 +80,7 @@ export const enum CompStyle {
/**
* 本地稿件和组件样式
*/
Card_Comp_Adv = 'card_comp_adv', //
Card_Comp_Adv = 'card_comp_adv', // 信息流广告稿件
Card_Comp_Zh_Grid_Layout_02 = 'Card_Comp_Zh_Grid_Layout-02', // 一行两列卡业务内容
}
... ...
... ... @@ -238,7 +238,6 @@ export class ProcessUtils {
}
Logger.debug(TAG, `gotoWeb, ${content.objectId}`)
}
... ...
... ... @@ -7,10 +7,11 @@ import { VoiceInfoDTO } from '../detail/VoiceInfoDTO';
import { RmhInfoDTO } from '../detail/RmhInfoDTO';
import { commentInfo } from './commentInfo';
import { BaseDTO } from '../component/BaseDTO';
import { LiveRoomDataBean } from '../live/LiveRoomDataBean';
@Observed
export class ContentDTO implements BaseDTO {
shareFlag?:string='1';
shareFlag?: string = '1';
appStyle: string = '';
cityCode: string = '';
coverSize: string = '';
... ... @@ -62,8 +63,7 @@ export class ContentDTO implements BaseDTO {
videoInfo: VideoInfoDTO = {} as VideoInfoDTO; // 视频新闻信息【BFF聚合】,视频非原片+清晰度最高的
newsSummary: string = ''; //appstyle:2 ,新闻详情
contentText?: string ='';
contentText?: string = '';
// 二次请求接口,返回的数据,这里组装到content里;
interactData?: InteractDataDTO;
hasMore: number = -1;
... ... @@ -85,6 +85,10 @@ export class ContentDTO implements BaseDTO {
// 链接类型: 0:无链接;1:内链(文章);2:外链
openType: string = '';
extra: string = ''
/*
本地辅助字段
*/
liveRoomDataBean?: LiveRoomDataBean // 批查获取到的直播观看人数
static clone(old: ContentDTO): ContentDTO {
let content = new ContentDTO();
... ...
... ... @@ -42,6 +42,16 @@ export interface PageInfoDTO {
pageAdList:CompAdvBean[]
md5:string
/*
信息流页面,最后一个楼层的最后一个组件的信息源
lastCompSourceType = 0 从楼层接口获取数据(compinfor)
= 1 表示 直播回看数据源
*/
lastCompSourceType: number
}
export interface ChannelInfoDTO {
... ...
... ... @@ -8,6 +8,8 @@ import { Card5Component } from './cardview/Card5Component';
import { AdvCardParser } from './cardViewAdv/AdvCardParser';
import { ZhCarouselLayout01 } from './compview/ZhCarouselLayout01';
import { ZhGridLayout02 } from './compview/ZhGridLayout02';
import { ZhGridLayout02News } from './compview/ZhGridLayout02News';
import { ZhGridLayout02NewsContent } from './compview/ZhGridLayout02NewsContent';
import { ZhGridLayout03 } from './compview/ZhGridLayout03';
import { ZhSingleColumn04 } from './compview/ZhSingleColumn04';
import { ZhSingleColumn05 } from './compview/ZhSingleColumn05';
... ... @@ -37,12 +39,10 @@ export struct CompParser {
build() {
Column() {
if (this.compDTO.name != "月度排行卡") {
this.componentBuilder();
}
}
}
@Builder
componentBuilder() {
... ... @@ -75,9 +75,14 @@ export struct CompParser {
} else if (this.compDTO.compStyle === CompStyle.Zh_Single_Row_03) {
ZhSingleRow03({ compDTO: this.compDTO })
Divider().strokeWidth(1).color('#f5f5f5').padding({ left: 16, right: 16 })
} else if (this.compDTO.compStyle === CompStyle.Zh_Grid_Layout_02) {
ZhGridLayout02({ compDTO: this.compDTO })
Divider().strokeWidth(1).color('#f5f5f5').padding({ left: 16, right: 16 })
} else if (this.compDTO.compStyle === CompStyle.Zh_Grid_Layout_02) { //双列流小视频,一行两图卡 ->标题
//ZhGridLayout02({ compDTO: this.compDTO })
ZhGridLayout02News({ compDTO: this.compDTO })
// Divider().strokeWidth(1).color('#f5f5f5').padding({ left: 16, right: 16 })
} else if (this.compDTO.compStyle === CompStyle.Card_Comp_Zh_Grid_Layout_02) { //双列流小视频,一行两图卡
ZhGridLayout02NewsContent({ compDTO: this.compDTO })
} else if (this.compDTO.compStyle === CompStyle.Zh_Grid_Layout_03) {
ZhGridLayout03({ compDTO: this.compDTO })
Divider().strokeWidth(1).color('#f5f5f5').padding({ left: 16, right: 16 })
... ... @@ -105,7 +110,7 @@ export struct CompParser {
// ZhSingleColumn05({ compDTO: compDTO })
// Divider().strokeWidth(1).color('#f5f5f5').padding({ left: 16, right: 16 })
} else if (this.compDTO.compStyle === CompStyle.Zh_Single_Column_09) {
Divider().strokeWidth(3).color('#ffffff').padding({ left: 16, right: 16 }).margin({top: -3})
Divider().strokeWidth(3).color('#ffffff').padding({ left: 16, right: 16 }).margin({ top: -3 })
Divider().strokeWidth(6).color('#f5f5f5')
ZhSingleColumn09({ compDTO: this.compDTO })
Divider().strokeWidth(6).color('#f5f5f5')
... ...
import { CompDTO, ContentDTO, LiveRoomDataBean } from 'wdBean';
import { CommonConstants } from 'wdConstant/Index';
import { Logger } from 'wdKit/Index';
import { ProcessUtils } from 'wdRouter';
import PageViewModel from '../../viewmodel/PageViewModel';
import { onlyWifiLoadImg } from '../../utils/lazyloadImg';
/**
* 双图卡 的标题组件
*
*/
@Component
export struct ZhGridLayout02News {
@State compDTO: CompDTO = new CompDTO
aboutToAppear() {
}
build() {
Column() {
Row() {
Image($r("app.media.redLine"))
.width(3)
.height(16)
.margin({ right: 4 })
Text(this.compDTO.objectTitle)
.fontSize($r("app.float.font_size_17"))
.fontColor($r("app.color.color_222222"))
.fontWeight(600)
}
.justifyContent(FlexAlign.Start)
.margin({ top: 16, bottom: 8 })
.width(CommonConstants.FULL_WIDTH)
}
.width(CommonConstants.FULL_WIDTH)
.padding({ left: 16, right: 16 })
}
}
... ...
import { CompDTO, ContentDTO, LiveRoomDataBean } from 'wdBean';
import { CommonConstants } from 'wdConstant/Index';
import { Logger } from 'wdKit/Index';
import { ProcessUtils } from 'wdRouter';
import PageViewModel from '../../viewmodel/PageViewModel';
import { onlyWifiLoadImg } from '../../utils/lazyloadImg';
let listSize: number = 2;
/**
* 双图卡 的标题组件
*
*/
@Component
export struct ZhGridLayout02NewsContent {
@ObjectLink compDTO: CompDTO
@State loadImg: boolean = false;
async aboutToAppear(): Promise<void> {
this.loadImg = await onlyWifiLoadImg();
}
build() {
if (this.compDTO != undefined) {
GridRow({
gutter: { x: 12, y: 13 },
columns: { sm: listSize, md: 2 },
breakpoints: { value: ['320vp', '520vp', '840vp'] }
}) {
ForEach(this.compDTO.operDataList, (item: ContentDTO, index: number) => {
GridCol() {
this.buildItemCard(item);
}
})
}.width("100%").padding({ left: 16, right: 16 })
}
}
@Builder
buildItemCard(item: ContentDTO) {
Column() {
Stack({ alignContent: Alignment.BottomEnd }) {
Image(this.loadImg ? item.fullColumnImgUrls[0].url : '')
.backgroundColor(0xf5f5f5)
.width('100%')
.height(95)
.borderRadius(4)
if (item.liveRoomDataBean != null && item.liveRoomDataBean.pv > 0) {
Text(this.computeShowNum(item.liveRoomDataBean.pv))
.fontSize('11vp')
.fontWeight(400)
.fontColor(Color.White)
.margin({
right: '5vp',
bottom: '5vp'
})
}
}
Text(item.newsTitle)
.margin({ top: '6',bottom:'10' })
.fontSize(13)
.maxLines(2)
.textOverflow({ overflow: TextOverflow.Ellipsis })
}
.width('100%')
.onClick(() => {
ProcessUtils.processPage(item)
})
}
private computeShowNum(count: number): string {
if (count >= 10000) {
let num = (count / 10000).toFixed(1)
if (Number(num.substring(num.length - 1)) == 0) {
num = num.substring(0, num.length - 2)
}
return num + '万人参加'
}
return `${count}人参加`
}
}
... ...
import { CompDTO, ContentDTO, InteractDataDTO, LiveReviewDTO, PageDTO, PageInfoDTO } from 'wdBean';
import { CompDTO, ContentDTO, InteractDataDTO, LiveReviewDTO, LiveRoomDataBean, PageDTO, PageInfoDTO } from 'wdBean';
import { CompStyle, ViewType } from 'wdConstant/Index';
import { CollectionUtils, DateTimeUtils, LazyDataSource, Logger, NetworkUtil, StringUtils } from 'wdKit';
import { closeRefresh } from '../utils/PullDownRefresh';
... ... @@ -75,7 +75,7 @@ export class PageHelper {
// 清空comp列表
pageModel.compList.clear()
}
this.analysisPageGroupCompData(pageModel,pageDto, pageInfo, index == pageInfo.groups.length - 1)
this.analysisPageGroupCompData(pageDto, pageInfo)
Logger.error("ZZZXXXXX", '楼层id-end--》' + pageModel.groupId + ' 楼层 comp数量=' + pageDto.compList.length);
}
... ... @@ -178,14 +178,31 @@ export class PageHelper {
// await,确保groups接口顺序执行
let pageDto = await PageViewModel.getPageGroupCompData(pageModel.bizCopy()) as PageDTO
let index = pageInfo.groups.indexOf(group)
if (index == 0) {
// 清空comp列表
pageModel.compList.clear()
// 解析楼层组件
this.analysisPageGroupCompData(pageDto, pageInfo)
// 最后一个楼层,特殊处理
if (index == pageInfo.groups.length - 1) {
// 检测楼层最后一个组件业务数据是否需要通过访问接口获取
let comp: CompDTO = pageDto.compList[pageDto.compList.length - 1]
// 直播回放,需要二次请求数据
if (comp.compStyle == CompStyle.Zh_Grid_Layout_02) {
pageInfo.lastCompSourceType = 1
let listReviewDtoBean = await PageViewModel.getLiveReviewUrl(1, 20) as LiveReviewDTO
Logger.error("ZZZXXXXX", 'getLiveReviewData------1---' + listReviewDtoBean.list.length);
// 创建一行两图卡组件
this.createDoubleColumComp(listReviewDtoBean, pageInfo)
Logger.error("ZZZXXXXX", 'getLiveReviewData-----2----' + listReviewDtoBean.list.length);
} else {
pageInfo.lastCompSourceType = 0
}
// // 保存缓存
// CacheData.saveCacheData(CacheData.compGroupInfoDataCacheKey + pageModel.pageId + pageModel.groupId, pageDto,
// pageDto.md5)
}
this.analysisPageGroupCompData(pageModel,pageDto, pageInfo, index == pageInfo.groups.length - 1)
Logger.error("ZZZXXXXX", '楼层id-end--》' + pageModel.groupId + ' 楼层 comp数量=' + pageDto.compList.length);
}
... ... @@ -196,9 +213,11 @@ export class PageHelper {
// 处理页面广告数据,投放到页面的位置
this.handlePageCompAdvPostion(pageInfo.oneRequestPageGroupCompList, pageModel, pageInfo.pageAdList);
// 清空comp列表
pageModel.compList.clear()
//遍历所有组件和稿件数据 push到页面
for (let element of pageInfo.oneRequestPageGroupCompList) {
pageModel.compList.push(CompDTO.createNewsBean(element))
pageModel.compList.push(element)
}
// 批查互动数据
... ... @@ -225,26 +244,11 @@ export class PageHelper {
* @param pageInfo 信息流页面信息
* @param isLastGroup pageDto信息是不是最后一个楼层
*/
private async analysisPageGroupCompData(pageModel: PageModel,pageDto: PageDTO, pageInfo: PageInfoDTO, isLastGroup: boolean) {
private async analysisPageGroupCompData(pageDto: PageDTO, pageInfo: PageInfoDTO) {
if (pageDto && pageDto.compList && pageDto.compList.length > 0) {
let pageCompList: ArrayList<CompDTO> = new ArrayList() // 收集楼层组件、稿件和本地组件容器
// 遍历楼层的组件数据
pageDto.compList.forEach((element: CompDTO) => {
let contentInfo: ContentDTO = CollectionUtils.getElement(element.operDataList, 0);
//移除音频 和 活动
if (contentInfo && (contentInfo.objectType === '13' || contentInfo.objectType === '3')) {
Logger.debug(TAG, 'getGroupData 移除音频 和 活动');
} else {
// 暂时屏蔽活动和音频详情入口
if (element.operDataList[0]?.objectType === '3' || element.operDataList[0]?.objectType === '13') {
} else {
pageCompList.add(element)
}
}
})
let pageCompList = this.factoryCompArray(pageDto.compList)
// pageInfor 记录
pageCompList.forEach((comp: CompDTO) => {
pageInfo.oneRequestPageGroupCompList.add(comp)
... ... @@ -255,19 +259,6 @@ export class PageHelper {
pageInfo.pageAdList.push(...pageDto.compAdList)
}
// 检测最后一个楼层是否有一行两图卡
if (isLastGroup) {
// 最后一个楼层,特殊处理
// 检测楼层最后一个组件业务数据是否需要通过访问接口获取
let comp: CompDTO = pageDto.compList[pageDto.compList.length - 1]
// 直播回放,需要二次请求数据
if ( comp.compStyle == CompStyle.Zh_Grid_Layout_02) {
// 这个comp,数据自己二次请求,自己分页处理,这里加flag,将page层滑动及loadmore ui去掉
pageModel.contentNeedScroll = true
//this.getLiveReviewData(pageInfo,comp)
}
}
}
}
... ... @@ -295,8 +286,16 @@ export class PageHelper {
promptAction.showToast({ message: err });
})
} else {
if (pageModel.pageInfo.lastCompSourceType == 1) {
// 加载更多 走 直播回看接口
this.getLiveReviewData(pageModel, pageModel.pageInfo)
} else {
// 默认加载更多走 楼层接口
PageViewModel.getPageGroupCompData(pageModel.bizCopy())
.then((data: PageDTO) => {
if (data == null || data.compList == null || data.compList.length == 0) {
pageModel.hasMore = false;
} else {
... ... @@ -314,6 +313,7 @@ export class PageHelper {
})
}
}
}
/**
... ... @@ -321,9 +321,34 @@ export class PageHelper {
*/
private loadMorePageComp(pageModel: PageModel, pageDto: PageDTO) {
let pageCompList: ArrayList<CompDTO> = new ArrayList() // 收集页面组件、稿件和本地组件容器
let pageCompList = this.factoryCompArray(pageDto.compList) // 收集页面组件、稿件和本地组件容器
// pageInfor 记录
pageModel.pageInfo.oneRequestPageGroupCompList.clear()
pageCompList.forEach((comp: CompDTO) => {
pageModel.pageInfo.oneRequestPageGroupCompList.add(comp)
})
// 记录
pageModel.pageTotalCompSize = pageCompList.length + pageModel.pageTotalCompSize
// 处理页面广告数据,投放到页面的位置
this.handlePageCompAdvPostion(pageCompList, pageModel, pageDto.compAdList);
//遍历所有组件和稿件数据 push到页面
for (let element of pageCompList) {
pageModel.compList.push(element)
}
pageDto.compList.forEach((element: CompDTO) => {
}
/**
* 加工 组件数组信息
* @param compList
* @returns
*/
private factoryCompArray(compList: CompDTO[]): ArrayList<CompDTO> {
let pageCompList: ArrayList<CompDTO> = new ArrayList() // 收集页面组件、稿件和本地组件容器
compList.forEach((element: CompDTO) => {
let contentInfo: ContentDTO = CollectionUtils.getElement(element.operDataList, 0);
//移除音频 和 活动
if (contentInfo && (contentInfo.objectType === '13' || contentInfo.objectType === '3')) {
... ... @@ -332,22 +357,17 @@ export class PageHelper {
// 暂时屏蔽活动和音频详情入口
if (element.operDataList[0]?.objectType === '3' || element.operDataList[0]?.objectType === '13') {
} else {
pageCompList.add(element)
if (element.name == "月度排行卡") {
} else {
pageCompList.add(CompDTO.createNewsBean(element))
}
}
}
})
// 记录
pageModel.pageTotalCompSize = pageCompList.length + pageModel.pageTotalCompSize
// 处理页面广告数据,投放到页面的位置
this.handlePageCompAdvPostion(pageCompList, pageModel, pageDto.compAdList);
//遍历所有组件和稿件数据 push到页面
for (let element of pageCompList) {
pageModel.compList.push(CompDTO.createNewsBean(element))
}
return pageCompList
}
/**
... ... @@ -356,6 +376,8 @@ export class PageHelper {
* @param pageModel
*/
private allCompBatchRequest(compList: CompDTO[], pageModel: PageModel) {
// 批查人数
PageViewModel.getInteractData(compList).then((data: InteractDataDTO[]) => {
// 刷新,替换所有数据
this.resetInteract(data, pageModel.compList)
... ... @@ -366,6 +388,9 @@ export class PageHelper {
}
})
// 批查直播观看人数
// this.getLiveRoomDataInfo(compList)
// 测试数据
// setTimeout(() => {
// let index = 1
... ... @@ -381,6 +406,59 @@ export class PageHelper {
}
/**
* 直播回看的批查数据
* @param list
* @param compList
*/
private getLiveRoomDataInfo(compList: CompDTO[]) {
let list: ContentDTO[] = []
compList.forEach((comp: CompDTO) => {
if (comp.compStyle == CompStyle.Card_Comp_Zh_Grid_Layout_02) {
list.push(...comp.operDataList)
}
})
let time = DateTimeUtils.getTimeStamp().toString()
const reserveIds = this.getLiveDetailIds(list)
PageViewModel.getLiveRoomBatchInfo(reserveIds).then((result) => {
if (result && result.length > 0) {
result.forEach((bean: LiveRoomDataBean) => {
for (let item of list) {
if (item.objectId == bean.liveId.toString()) {
item.liveRoomDataBean = bean
outer: for (let compBean of compList) {
for (let contentBean of compBean.operDataList) {
if (contentBean === item) {
compBean.timestamp = time
break outer
}
}
}
break
}
}
})
}
}).catch(() => {
})
}
/**
* 获取直播详情id入参
* @param list
* @returns
*/
private getLiveDetailIds(list: ContentDTO[]): string {
let idList: string[] = []
list.forEach(item => {
idList.push(item.objectId)
});
return idList.join(',')
}
/**
* 刷新互动数据到compList
* @param interact 批查互动数据结果
* @param compList comp list
... ... @@ -560,12 +638,99 @@ export class PageHelper {
/**
* 获取直播回看数据
*/
private async getLiveReviewData(pageInfo: PageInfoDTO,comp: CompDTO) {
private async getLiveReviewData(pageModel: PageModel, pageInfo: PageInfoDTO) {
let currentPage = 1
let currentPage = pageModel.currentPage
let pageSize = 20
let listReviewDtoBean = await PageViewModel.getLiveReviewUrl(currentPage, pageSize) as LiveReviewDTO
Logger.error("ZZZXXXXX", 'getLiveReviewData---------'+listReviewDtoBean.list.length);
PageViewModel.getLiveReviewUrl(currentPage, pageSize).then((liveReviewDTO) => {
if (liveReviewDTO == null || liveReviewDTO.list == null || liveReviewDTO.list.length == 0) {
pageModel.hasMore = false;
} else {
pageInfo.oneRequestPageGroupCompList.clear()
// 直接认为有分页,一直加载分页。直到没有数据,再停止
pageModel.currentPage++;
pageModel.hasMore = true;
let haveMoveContent = false
//获取当前页面最后一个组件
let lastIndex = pageModel.compList.totalCount() - 1
let lastComp = pageModel.compList.getData(lastIndex) as CompDTO
// 一行两图卡,需要从奇数 补齐成偶数内容
if (lastComp.compStyle == CompStyle.Card_Comp_Zh_Grid_Layout_02) {
let operLength = lastComp.operDataList.length
Logger.error("ZZZXXXXX", 'getLiveReviewData------1---operLength=' + operLength);
// 最后一个组件的业务数据是奇数,需要从获取更多的业务数据中补一个数据
if (operLength === 1) {
lastComp.operDataList.push(liveReviewDTO.list[0])
// 更新某个组件
pageModel.compList.updateItem(lastComp, lastIndex)
// 移走新获取的数据中第一条数据
liveReviewDTO.list.splice(0, 1)
}
}
this.createDoubleColumComp(liveReviewDTO, pageInfo)
// 统计页面的总的组件和稿件数量
pageModel.pageTotalCompSize = pageInfo.oneRequestPageGroupCompList.length + pageModel.pageTotalCompSize
//遍历所有组件和稿件数据 push到页面
for (let element of pageInfo.oneRequestPageGroupCompList) {
pageModel.compList.push(element)
}
// 批查直播观看人数
// if (haveMoveContent) {
// // 把当前获取到的直播回看数据
// liveReviewDTO.list.push(lastComp.operDataList[1])
// pageInfo.oneRequestPageGroupCompList.add(lastComp)
// }
// this.getLiveRoomDataInfo(liveReviewDTO.list, pageInfo.oneRequestPageGroupCompList)
}
}).catch((err: string | Resource) => {
promptAction.showToast({ message: err });
})
}
/**
* 创建一行两图卡 自定义的业务稿件
* @param listReviewDtoBean
* @param pageInfo
*/
private async createDoubleColumComp(listReviewDtoBean: LiveReviewDTO, pageInfo: PageInfoDTO, test?: boolean) {
/*
两个业务 内容 配置一个comp
*/
let length = listReviewDtoBean.list.length
Logger.error("ZZZXXXXX", 'createDoubleColumComp------1---test=' + test + " length=" + length);
if (test) {
// 偶数变成奇数
if (length % 2 === 0) {
listReviewDtoBean.list.splice(length - 1, 1)
length = listReviewDtoBean.list.length
}
}
for (let i = 0; i < length; i = i + 2) {
let sliceArray: ContentDTO[]
let j = i + 2
if (j < length) {
sliceArray = listReviewDtoBean.list.slice(i, j)
} else {
sliceArray = listReviewDtoBean.list.slice(i)
}
// 创建一行两图卡 自定义的业务稿件
let doubleColumnLiveReviewComp = new CompDTO()
doubleColumnLiveReviewComp.compStyle = CompStyle.Card_Comp_Zh_Grid_Layout_02
let operDataList: ContentDTO[] = sliceArray
doubleColumnLiveReviewComp.operDataList = operDataList
pageInfo.oneRequestPageGroupCompList.add(doubleColumnLiveReviewComp)
}
}
}
... ...