liyubing

feat(广告): 冠名广告、视频广告、长通栏广告 和 顶部长通栏广告 大图卡 投放逻辑

@@ -12,6 +12,8 @@ export class ContentConstants { @@ -12,6 +12,8 @@ export class ContentConstants {
12 * 2:直播 12 * 2:直播
13 */ 13 */
14 static readonly TYPE_LIVE: string = "2"; 14 static readonly TYPE_LIVE: string = "2";
  15 +
  16 + static readonly TYPE_FOUR: string = "4";
15 /** 17 /**
16 * 5:专题详情 18 * 5:专题详情
17 */ 19 */
@@ -100,6 +100,9 @@ export class ProcessUtils { @@ -100,6 +100,9 @@ export class ProcessUtils {
100 case ContentConstants.TYPE_LIVE: 100 case ContentConstants.TYPE_LIVE:
101 ProcessUtils.gotoLive(content) 101 ProcessUtils.gotoLive(content)
102 break 102 break
  103 + case ContentConstants.TYPE_FOUR:
  104 + ProcessUtils.gotoDefaultWeb(content);
  105 + break
103 case ContentConstants.TYPE_AUDIO: 106 case ContentConstants.TYPE_AUDIO:
104 ProcessUtils.gotoAudio(content) 107 ProcessUtils.gotoAudio(content)
105 break; 108 break;
@@ -80,4 +80,6 @@ export interface ContentDTO { @@ -80,4 +80,6 @@ export interface ContentDTO {
80 commentInfo?: commentInfo 80 commentInfo?: commentInfo
81 //底部导航栏 id(用于频道跳转) 81 //底部导航栏 id(用于频道跳转)
82 bottomNavId:string; 82 bottomNavId:string;
  83 + // 链接类型: 0:无链接;1:内链(文章);2:外链
  84 + openType:string
83 } 85 }
@@ -21,7 +21,7 @@ export struct CardMediaInfo { @@ -21,7 +21,7 @@ export struct CardMediaInfo {
21 Row() { 21 Row() {
22 Image($r('app.media.card_play')) 22 Image($r('app.media.card_play'))
23 .mediaLogo() 23 .mediaLogo()
24 - if(this.contentDTO.videoInfo!=null){ 24 + if (this.contentDTO.videoInfo != null) {
25 Text(DateTimeUtils.getFormattedDuration(this.contentDTO.videoInfo.videoDuration * 1000)) 25 Text(DateTimeUtils.getFormattedDuration(this.contentDTO.videoInfo.videoDuration * 1000))
26 .mediaText() 26 .mediaText()
27 } 27 }
@@ -30,7 +30,7 @@ export struct CardMediaInfo { @@ -30,7 +30,7 @@ export struct CardMediaInfo {
30 // liveInfo.liveState 直播新闻-直播状态 wait待开播running直播中end已结束cancel已取消paused暂停 30 // liveInfo.liveState 直播新闻-直播状态 wait待开播running直播中end已结束cancel已取消paused暂停
31 // 显示直播信息 31 // 显示直播信息
32 Row() { 32 Row() {
33 - if(this.contentDTO.liveInfo.liveState === 'wait') { 33 + if (this.contentDTO.liveInfo.liveState === 'wait') {
34 Image($r('app.media.card_wait')) 34 Image($r('app.media.card_wait'))
35 .mediaLogo() 35 .mediaLogo()
36 Text('预约') 36 Text('预约')
@@ -45,7 +45,7 @@ export struct CardMediaInfo { @@ -45,7 +45,7 @@ export struct CardMediaInfo {
45 .mediaLogo() 45 .mediaLogo()
46 Text('回看') 46 Text('回看')
47 .mediaText() 47 .mediaText()
48 - } else if(this.contentDTO.liveInfo.liveState === 'end' && this.contentDTO.liveInfo 48 + } else if (this.contentDTO.liveInfo.liveState === 'end' && this.contentDTO.liveInfo
49 .replayUri) { 49 .replayUri) {
50 // Image($r('app.media.card_live')) 50 // Image($r('app.media.card_live'))
51 // .mediaLogo() 51 // .mediaLogo()
@@ -69,6 +69,15 @@ export struct CardMediaInfo { @@ -69,6 +69,15 @@ export struct CardMediaInfo {
69 Text(DateTimeUtils.getFormattedDuration(this.contentDTO.voiceInfo.voiceDuration * 1000)) 69 Text(DateTimeUtils.getFormattedDuration(this.contentDTO.voiceInfo.voiceDuration * 1000))
70 .mediaText() 70 .mediaText()
71 } 71 }
  72 + } else if (this.contentDTO.objectType === '4') {//广告标签
  73 + Text($r('app.string.comp_advertisement'))
  74 + .fontSize('10fp')
  75 + .fontColor($r('app.color.white'))
  76 + .width(28)
  77 + .height(16)
  78 + .backgroundColor('#4D000000')
  79 + .borderRadius(3)
  80 + .textAlign(TextAlign.Center)
72 } 81 }
73 } 82 }
74 .margin(6) 83 .margin(6)
@@ -20,14 +20,12 @@ export struct CardAdvBigImageComponent { @@ -20,14 +20,12 @@ export struct CardAdvBigImageComponent {
20 20
21 aboutToAppear(): void { 21 aboutToAppear(): void {
22 22
23 - console.error('ZZZXXXXX', '----大图卡----aboutToAppear-----')  
24 23
25 24
26 } 25 }
27 26
28 aboutToDisappear(): void { 27 aboutToDisappear(): void {
29 28
30 - console.error('ZZZXXXXX', '---大图卡-----aboutToDisappear-----')  
31 } 29 }
32 30
33 build() { 31 build() {
@@ -25,8 +25,6 @@ export struct CardAdvGanMiComponent { @@ -25,8 +25,6 @@ export struct CardAdvGanMiComponent {
25 25
26 aboutToAppear(): void { 26 aboutToAppear(): void {
27 27
28 - console.error('ZZZXXXXX', '--冠名广告------aboutToAppear-----')  
29 -  
30 let extraData = this.compDTO.matInfo.extraData 28 let extraData = this.compDTO.matInfo.extraData
31 let labelDTO = JSON.parse(extraData) as AdvExtraData 29 let labelDTO = JSON.parse(extraData) as AdvExtraData
32 this.advExtraData = labelDTO 30 this.advExtraData = labelDTO
@@ -37,7 +35,6 @@ export struct CardAdvGanMiComponent { @@ -37,7 +35,6 @@ export struct CardAdvGanMiComponent {
37 35
38 aboutToDisappear(): void { 36 aboutToDisappear(): void {
39 37
40 - console.error('ZZZXXXXX', '--冠名广告------aboutToDisappear-----')  
41 } 38 }
42 39
43 build() { 40 build() {
@@ -26,14 +26,12 @@ export struct CardAdvLongImageComponent { @@ -26,14 +26,12 @@ export struct CardAdvLongImageComponent {
26 26
27 aboutToAppear(): void { 27 aboutToAppear(): void {
28 28
29 - console.error('ZZZXXXXX', '--长通栏广告 和 顶部长通栏广告------aboutToAppear-----')  
30 29
31 this.haveTitle = this.compDTO.matInfo.advSubType === CompStyle.Card_Adv_7; 30 this.haveTitle = this.compDTO.matInfo.advSubType === CompStyle.Card_Adv_7;
32 } 31 }
33 32
34 aboutToDisappear(): void { 33 aboutToDisappear(): void {
35 34
36 - console.error('ZZZXXXXX', '--长通栏广告 和 顶部长通栏广告------aboutToDisappear-----')  
37 } 35 }
38 36
39 build() { 37 build() {
@@ -42,7 +40,7 @@ export struct CardAdvLongImageComponent { @@ -42,7 +40,7 @@ export struct CardAdvLongImageComponent {
42 40
43 //新闻标题 41 //新闻标题
44 if(this.haveTitle ){ 42 if(this.haveTitle ){
45 - Text(this.compDTO.matInfo.advTitle).bottomTextStyle().margin({ bottom: 8, }) 43 + Text(this.compDTO.matInfo.advTitle).width('100%').bottomTextStyle().margin({ bottom: 8, })
46 } 44 }
47 45
48 //长图 46 //长图
@@ -23,7 +23,6 @@ export struct CardAdvSmallImageComponent { @@ -23,7 +23,6 @@ export struct CardAdvSmallImageComponent {
23 23
24 aboutToAppear(): void { 24 aboutToAppear(): void {
25 25
26 - console.error('ZZZXXXXX', '----小图卡----aboutToAppear-----')  
27 // 计算标题文本行数 26 // 计算标题文本行数
28 let screenWith = DisplayUtils.getDeviceWidth(); 27 let screenWith = DisplayUtils.getDeviceWidth();
29 screenWith = screenWith * 0.62 28 screenWith = screenWith * 0.62
@@ -33,7 +32,6 @@ export struct CardAdvSmallImageComponent { @@ -33,7 +32,6 @@ export struct CardAdvSmallImageComponent {
33 32
34 aboutToDisappear(): void { 33 aboutToDisappear(): void {
35 34
36 - console.error('ZZZXXXXX', '---小图卡-----aboutToDisappear-----')  
37 } 35 }
38 36
39 build() { 37 build() {
@@ -22,12 +22,10 @@ export struct CardAdvThreeImageComponent { @@ -22,12 +22,10 @@ export struct CardAdvThreeImageComponent {
22 22
23 aboutToAppear(): void { 23 aboutToAppear(): void {
24 24
25 - console.error('ZZZXXXXX', '---三图卡-----aboutToAppear-----')  
26 } 25 }
27 26
28 aboutToDisappear(): void { 27 aboutToDisappear(): void {
29 28
30 - console.error('ZZZXXXXX', '----三图卡----aboutToDisappear-----')  
31 } 29 }
32 30
33 build() { 31 build() {
@@ -22,8 +22,6 @@ export struct CardAdvVideoComponent { @@ -22,8 +22,6 @@ export struct CardAdvVideoComponent {
22 @State contentDTO: ContentDTO = {} as ContentDTO 22 @State contentDTO: ContentDTO = {} as ContentDTO
23 23
24 aboutToAppear(): void { 24 aboutToAppear(): void {
25 - console.error('ZZZXXXXX', '--视频广告------aboutToAppear-----')  
26 -  
27 25
28 // this.contentDTO.objectType = '1' 26 // this.contentDTO.objectType = '1'
29 // this.contentDTO.videoInfo = { videoDuration: 1000 } as VideoInfoDTO 27 // this.contentDTO.videoInfo = { videoDuration: 1000 } as VideoInfoDTO
@@ -31,7 +29,6 @@ export struct CardAdvVideoComponent { @@ -31,7 +29,6 @@ export struct CardAdvVideoComponent {
31 29
32 aboutToDisappear(): void { 30 aboutToDisappear(): void {
33 31
34 - console.error('ZZZXXXXX', '---视频广告-----aboutToDisappear-----')  
35 } 32 }
36 33
37 build() { 34 build() {
@@ -21,7 +21,6 @@ export struct CardAdvVideoExComponent { @@ -21,7 +21,6 @@ export struct CardAdvVideoExComponent {
21 21
22 aboutToAppear(): void { 22 aboutToAppear(): void {
23 23
24 - console.error('ZZZXXXXX', '--展会广告------aboutToAppear-----')  
25 24
26 let extraData = this.compDTO.matInfo.extraData 25 let extraData = this.compDTO.matInfo.extraData
27 let labelDTO = JSON.parse(extraData) as AdvExtraData 26 let labelDTO = JSON.parse(extraData) as AdvExtraData
@@ -30,7 +29,6 @@ export struct CardAdvVideoExComponent { @@ -30,7 +29,6 @@ export struct CardAdvVideoExComponent {
30 29
31 aboutToDisappear(): void { 30 aboutToDisappear(): void {
32 31
33 - console.error('ZZZXXXXX', '----展会广告----aboutToDisappear-----')  
34 } 32 }
35 33
36 build() { 34 build() {
@@ -180,7 +180,7 @@ struct CarouselLayout01CardView { @@ -180,7 +180,7 @@ struct CarouselLayout01CardView {
180 }) 180 })
181 Column() { 181 Column() {
182 // 这里用于展示轮播图右上角信息,这里只对直播类型的展示 182 // 这里用于展示轮播图右上角信息,这里只对直播类型的展示
183 - if (this.item.objectType === '2') { 183 + if (this.item.objectType === '2' || this.item.objectType ==='4') {
184 CardMediaInfo({ contentDTO: this.item }) 184 CardMediaInfo({ contentDTO: this.item })
185 .width(CommonConstants.FULL_PARENT) 185 .width(CommonConstants.FULL_PARENT)
186 } 186 }
@@ -246,6 +246,7 @@ export struct PageComponent { @@ -246,6 +246,7 @@ export struct PageComponent {
246 this.pageModel.groupId = this.pageId; 246 this.pageModel.groupId = this.pageId;
247 this.pageModel.channelId = this.channelId; 247 this.pageModel.channelId = this.channelId;
248 this.pageModel.currentPage = 1; 248 this.pageModel.currentPage = 1;
  249 + this.pageModel.pageTotalCompSize = 0;
249 PageHelper.getInitData(this.pageModel, this.pageAdvModel) 250 PageHelper.getInitData(this.pageModel, this.pageAdvModel)
250 } 251 }
251 } 252 }
@@ -194,6 +194,7 @@ export struct SearchResultContentComponent{ @@ -194,6 +194,7 @@ export struct SearchResultContentComponent{
194 isSearch: true, 194 isSearch: true,
195 publishTimestamp:"", 195 publishTimestamp:"",
196 bottomNavId:'', 196 bottomNavId:'',
  197 + openType:''
197 } 198 }
198 199
199 this.data.push(contentDTO) 200 this.data.push(contentDTO)
1 import { CompDTO, ContentDTO, PageDTO, PageInfoDTO } from 'wdBean'; 1 import { CompDTO, ContentDTO, PageDTO, PageInfoDTO } from 'wdBean';
2 import { CompStyle, ViewType } from 'wdConstant/Index'; 2 import { CompStyle, ViewType } from 'wdConstant/Index';
3 -import { CollectionUtils, DateTimeUtils, Logger, NetworkUtil } from 'wdKit'; 3 +import { CollectionUtils, DateTimeUtils, Logger, NetworkUtil, StringUtils } from 'wdKit';
4 import { closeRefresh } from '../utils/PullDownRefresh'; 4 import { closeRefresh } from '../utils/PullDownRefresh';
5 import PageModel from './PageModel'; 5 import PageModel from './PageModel';
6 import PageViewModel from './PageViewModel'; 6 import PageViewModel from './PageViewModel';
@@ -9,6 +9,7 @@ import { CompAdvBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean'; @@ -9,6 +9,7 @@ import { CompAdvBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean';
9 import PageAdModel from './PageAdvModel'; 9 import PageAdModel from './PageAdvModel';
10 import { ArrayList } from '@kit.ArkTS'; 10 import { ArrayList } from '@kit.ArkTS';
11 import { WDViewDefaultType } from '../components/view/EmptyComponent'; 11 import { WDViewDefaultType } from '../components/view/EmptyComponent';
  12 +import { CompAdvMatInfoBean } from 'wdBean/src/main/ets/bean/adv/CompAdvInfoBean';
12 13
13 const TAG = 'PageHelper'; 14 const TAG = 'PageHelper';
14 15
@@ -21,6 +22,7 @@ export class PageHelper { @@ -21,6 +22,7 @@ export class PageHelper {
21 */ 22 */
22 async refreshUI(pageModel: PageModel, pageAdvModel: PageAdModel) { 23 async refreshUI(pageModel: PageModel, pageAdvModel: PageAdModel) {
23 pageModel.loadStrategy = 2 24 pageModel.loadStrategy = 2
  25 + pageModel.pageTotalCompSize = 0;
24 this.getPageInfo(pageModel, pageAdvModel) 26 this.getPageInfo(pageModel, pageAdvModel)
25 } 27 }
26 28
@@ -147,7 +149,7 @@ export class PageHelper { @@ -147,7 +149,7 @@ export class PageHelper {
147 * 处理页面中的广告组件信息 149 * 处理页面中的广告组件信息
148 * @param pageDto 150 * @param pageDto
149 */ 151 */
150 - private handlePageCompAdvPostion(pageCompList: ArrayList<CompDTO>, pageDto: PageDTO) { 152 + private handlePageCompAdvPostion(pageCompList: ArrayList<CompDTO>, pageModel: PageModel, pageDto: PageDTO) {
151 153
152 let compAdvList = pageDto.compAdList 154 let compAdvList = pageDto.compAdList
153 155
@@ -159,6 +161,7 @@ export class PageHelper { @@ -159,6 +161,7 @@ export class PageHelper {
159 flag = false 161 flag = false
160 } 162 }
161 163
  164 +
162 let pageCompSize = pageCompList.length // 信息流组件业务数量 165 let pageCompSize = pageCompList.length // 信息流组件业务数量
163 console.error("ZZZXXXXX", " start--->" + pageCompSize); 166 console.error("ZZZXXXXX", " start--->" + pageCompSize);
164 167
@@ -167,9 +170,11 @@ export class PageHelper { @@ -167,9 +170,11 @@ export class PageHelper {
167 } 170 }
168 171
169 if (flag) { 172 if (flag) {
  173 + let bannerAdvIndex = 0; // banner组件展示数据投放
  174 + let layoutAdvIndex = 0; //稿件投放统计
170 // 升序排序 175 // 升序排序
171 compAdvList.sort((a: CompAdvBean, b: CompAdvBean) => a.slotInfo.position - b.slotInfo.position) 176 compAdvList.sort((a: CompAdvBean, b: CompAdvBean) => a.slotInfo.position - b.slotInfo.position)
172 - console.error("ZZZXXXXX", " 排序后的广告--->" + JSON.stringify(compAdvList)); 177 + // console.error("ZZZXXXXX", " 排序后的广告--->" + JSON.stringify(compAdvList));
173 //当前日期 178 //当前日期
174 let serverTimeLong: number = DateTimeUtils.getTimeStamp(); 179 let serverTimeLong: number = DateTimeUtils.getTimeStamp();
175 for (let advBean of compAdvList) { 180 for (let advBean of compAdvList) {
@@ -192,14 +197,91 @@ export class PageHelper { @@ -192,14 +197,91 @@ export class PageHelper {
192 // 插入轮播组件的广告 197 // 插入轮播组件的广告
193 if (4 == advSubType) { 198 if (4 == advSubType) {
194 199
  200 + let position = slotInfo.position - 1;
  201 + // 检测newCompList 集合中是否有轮播组件资源
  202 + let adCompId = slotInfo.compId;
  203 + if (!StringUtils.isEmpty(adCompId)) {
  204 + for (let compBean of pageCompList) {
  205 + if (StringUtils.isEmpty(compBean.id)) {
  206 + continue
  207 + }
  208 + let compId = compBean.id.toString();
  209 + //匹配组件
  210 + if (adCompId == compId) {
  211 + // 运营位数据
  212 + let dataList = compBean.operDataList;
  213 + if (dataList != null) {
  214 +
  215 + // 数组转成 ArrayList
  216 + let changeArrayList = (dataList: ContentDTO[]) => {
  217 + let compOperData: ArrayList<ContentDTO> = new ArrayList()
  218 + for (let dataListBean of dataList) {
  219 + compOperData.add(dataListBean)
  220 + }
  221 + return compOperData
  222 + }
  223 +
  224 + let compOperData = changeArrayList(dataList)
  225 +
  226 + // 轮播组件广告数据转 业务信息
  227 + let changeContentDTO = (matInfo: CompAdvMatInfoBean) => {
  228 + let advContentBean: ContentDTO = {} as ContentDTO;
  229 + advContentBean.newsTitle = matInfo.advTitle
  230 + advContentBean.objectType = matInfo.advType == "0" ? matInfo.advType : "4"
  231 + advContentBean.coverUrl = matInfo.matImageUrl[0]
  232 + advContentBean.linkUrl = matInfo.linkUrl
  233 + advContentBean.openType = matInfo.linkType
  234 + advContentBean.corner = ''
  235 + return advContentBean
  236 + }
  237 + let advContentBean = changeContentDTO(matInfo)
  238 +
  239 + let dataListSize = dataList.length;
  240 + if (position < dataListSize) {
  241 + //dataList.add(position + bannerAdvIndex, advContentBean);
  242 + compOperData.insert(advContentBean, position + bannerAdvIndex)
  243 + } else {
  244 + compOperData.add(advContentBean);
  245 + }
  246 + bannerAdvIndex = bannerAdvIndex + 1;
  247 +
  248 + // ArrayList转成 数组
  249 + compBean.operDataList = compOperData.convertToArray()
  250 + }
  251 + }
  252 + }
  253 + }
  254 +
195 } else { 255 } else {
  256 +
  257 +
196 let advPosition = slotInfo.position //广告位置,从1开始 258 let advPosition = slotInfo.position //广告位置,从1开始
  259 + // 页面的comp总数 - 这次请求的comp总数 = 剩余comp总数
197 advPosition = advPosition - 1 260 advPosition = advPosition - 1
198 - let advComp: CompDTO = {  
199 - compStyle: CompStyle.Card_Comp_Adv,  
200 - matInfo: matInfo  
201 - } as CompDTO;  
202 - pageCompList.insert(advComp, 0) 261 +
  262 + let a = pageModel.pageTotalCompSize - pageCompSize
  263 + if (advPosition <= pageModel.pageTotalCompSize && advPosition >= a) {
  264 +
  265 + let b = advPosition - a;
  266 + console.error('ZZZXXXXX', matInfo.advSubType + '-------------' + matInfo.advTitle + " "+ advPosition + " "+a+" "+b)
  267 + if (b <= pageCompSize && b >= 0) {
  268 +
  269 + let advComp: CompDTO = {
  270 + compStyle: CompStyle.Card_Comp_Adv,
  271 + matInfo: matInfo
  272 + } as CompDTO;
  273 +
  274 + if (pageCompSize == slotInfo.position) {
  275 + pageCompList.add(advComp)
  276 + } else {
  277 + pageCompList.insert(advComp, b + layoutAdvIndex)
  278 + }
  279 +
  280 + layoutAdvIndex = layoutAdvIndex + 1;
  281 +
  282 + }
  283 + }
  284 +
203 } 285 }
204 } 286 }
205 } 287 }
@@ -241,6 +323,7 @@ export class PageHelper { @@ -241,6 +323,7 @@ export class PageHelper {
241 }) 323 })
242 } 324 }
243 325
  326 +
244 /** 327 /**
245 * 移除comp 328 * 移除comp
246 */ 329 */
@@ -259,8 +342,13 @@ export class PageHelper { @@ -259,8 +342,13 @@ export class PageHelper {
259 pageCompList.add(element) 342 pageCompList.add(element)
260 } 343 }
261 } 344 }
  345 +
  346 + pageModel.pageTotalCompSize = pageCompList.length + pageModel.pageTotalCompSize
  347 + console.error("ZZZXXXXX", " collectPageComp--->" + pageModel.pageTotalCompSize);
  348 +
262 // 处理页面广告数据,投放到页面的位置 349 // 处理页面广告数据,投放到页面的位置
263 - //this.handlePageCompAdvPostion(pageCompList, pageDto); 350 + // this.handlePageCompAdvPostion(pageCompList, pageModel, pageDto);
  351 +
264 352
265 //遍历所有组件和稿件数据 push到页面 353 //遍历所有组件和稿件数据 push到页面
266 for (let element of pageCompList) { 354 for (let element of pageCompList) {
@@ -54,6 +54,9 @@ export default class PageModel { @@ -54,6 +54,9 @@ export default class PageModel {
54 timestamp: String = '1'; 54 timestamp: String = '1';
55 55
56 56
  57 + // 记录已经展示的稿件和组件数量
  58 + pageTotalCompSize: number = 0;
  59 +
57 /** 60 /**
58 * 简单复制业务数据 61 * 简单复制业务数据
59 */ 62 */