Commit 4460fc29 by 郑永强

feat: [1004590] 广告投放系统

parent 55b1a1a7
......@@ -231,6 +231,12 @@
</dependency>
<dependency>
<groupId>com.pcloud.facade</groupId>
<artifactId>pcloud-facade-advertising</artifactId>
<version>${pcloud-facade.version}</version>
</dependency>
<dependency>
<groupId>fakepath</groupId>
<artifactId>jbarcode</artifactId>
<version>0.2.8</version>
......
......@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.pcloud.advertising.advertising.dto.AdvertisingSpaceDTO;
import com.pcloud.advertising.advertising.dto.AdvertisingSpaceItemDTO;
import com.pcloud.appcenter.app.dto.AppDto;
import com.pcloud.book.applet.biz.AppletBannerBiz;
import com.pcloud.book.applet.biz.AppletNewsBiz;
......@@ -20,6 +22,7 @@ import com.pcloud.book.applet.entity.AppletUserBookcase;
import com.pcloud.book.applet.enums.AppletRecordTypeEnum;
import com.pcloud.book.applet.mapper.AppletBannerRecordMapper;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.consumer.advsertising.AdvertisingConsr;
import com.pcloud.book.consumer.app.AppConsr;
import com.pcloud.book.consumer.channel.QrcodeSceneConsr;
import com.pcloud.book.consumer.resource.ProductConsr;
......@@ -92,6 +95,8 @@ public class AppletBannerBizImpl implements AppletBannerBiz {
private ScheduleService scheduleService;
@Autowired
private RightsSettingBannerBiz rightsSettingBannerBiz;
@Autowired
private AdvertisingConsr advertisingConsr;
@Override
......@@ -339,9 +344,73 @@ public class AppletBannerBizImpl implements AppletBannerBiz {
PageBeanNew<AppletBannerDTO> pageBeanNew = listBanner(currentPage, numPerPage, showState, agentId);
// 依据当前用户正在读的书,所属分类获取最新上架的资讯
processFillType(pageBeanNew.getRecordList(), wechatUserId);
// 填充广告banner
this.fillAdvertising(pageBeanNew.getRecordList());
return pageBeanNew;
}
private void fillAdvertising(List<AppletBannerDTO> recordList) {
try {
// 获取广告
List<AdvertisingSpaceDTO> appletAdvertisingList = advertisingConsr.getAppletAdvertising();
if(CollUtil.isEmpty(appletAdvertisingList)){
return;
}
for (AdvertisingSpaceDTO dto : appletAdvertisingList) {
List<AdvertisingSpaceItemDTO> itemList = dto.getAdvertisingSpaceItemList();
if(CollUtil.isEmpty(dto.getAdvertisingSpaceItemList())){
return;
}
for (AdvertisingSpaceItemDTO itemDTO : itemList) {
AppletBannerDTO bannerDTO = new AppletBannerDTO();
// 广告相关字段
bannerDTO.setIsAdvertising(true);
bannerDTO.setSeq(0);
bannerDTO.setShowState(true);
bannerDTO.setBannerPic(itemDTO.getAdPic());
bannerDTO.setJumpType(toJumpType(itemDTO.getBookJumpType()));
bannerDTO.setJumpUrl(itemDTO.getAdLink());
if(Objects.equals(bannerDTO.getJumpType(), 4)){
ServeItemInfoDTO build = ServeItemInfoDTO.builder().serveId(itemDTO.getServeId()).serveType(getServeType(itemDTO.getServeType()))
.serveName(itemDTO.getServeName()).servePic(itemDTO.getServePic()).transverseImg(itemDTO.getTransverseImg())
.resultUrl(itemDTO.getResultUrl()).hasThirdLink(itemDTO.getHasThirdLink())
.serveTypeName(itemDTO.getServeTypeName()).build();
bannerDTO.setAppItem(build);
}
// 广告埋点相关字段
bannerDTO.setMasterId(dto.getMasterId());
bannerDTO.setAdvertisingSpaceId(dto.getId());
bannerDTO.setAdvertisingSpaceItemId(itemDTO.getId());
bannerDTO.setAdPosition(dto.getAdPosition());
recordList.add(0, bannerDTO);
}
}
} catch (Exception e){
log.error("[fillAdvertising] banner 填充广告失败,err:{}", e.getMessage(), e);
}
}
private Integer getServeType(String serveTypeCode) {
if(AppletRecordTypeEnum.PRODUCT.name().equalsIgnoreCase(serveTypeCode)){
return AppletRecordTypeEnum.PRODUCT.value;
}
if(AppletRecordTypeEnum.APP.name().equalsIgnoreCase(serveTypeCode)){
return AppletRecordTypeEnum.APP.value;
}
return null;
}
Integer toJumpType(Integer bookJumpType){
if(bookJumpType == 0){
return 2;
} else if (bookJumpType == 1){
return 5;
} else if (bookJumpType == 2){
return 4;
}
return null;
}
private void processFillType(List<AppletBannerDTO> recordList, Long wechatUserId) {
if (CollUtil.isEmpty(recordList)) {
return;
......
......@@ -63,4 +63,21 @@ public class AppletBannerDTO extends BaseDto {
)
@ApiModelProperty("下架时间")
private Date endTime;
@ApiModelProperty("是否是广告")
private Boolean isAdvertising;
@ApiModelProperty("广告主id")
private Long masterId;
@ApiModelProperty("广告位ID")
private Long advertisingSpaceId;
@ApiModelProperty("广告详情id")
private Long advertisingSpaceItemId;
@ApiModelProperty("广告位置")
private String adPosition;
}
......@@ -29,6 +29,9 @@ public class PcloudAdviserBookVO implements Serializable {
@ApiModelProperty("ISBN")
private String isbn;
@ApiModelProperty("序号")
private String serialNumber;
@ApiModelProperty("图书封面")
private String coverImg;
......
package com.pcloud.book.consumer.advsertising;
import cn.hutool.core.collection.CollUtil;
import com.pcloud.advertising.advertising.dto.AdvertisingSpaceDTO;
import com.pcloud.advertising.advertising.service.AdvertisingService;
import com.pcloud.appcenter.app.dto.AppDto;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.consumer.app.AppConsr;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.utils.ResponseHandleUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository("advertisingConsr")
public class AdvertisingConsr {
private static final Logger LOGGER = LoggerFactory.getLogger(AppConsr.class);
@Autowired
private AdvertisingService advertisingService;
/**
* 获取小程序广告
*/
public List<AdvertisingSpaceDTO> getAppletAdvertising() throws BizException {
List<AdvertisingSpaceDTO> list;
try {
ResponseEntity<ResponseDto<List<AdvertisingSpaceDTO>>> appletAdvertisingEntity = advertisingService.getAppletAdvertising();
list = ResponseHandleUtil.parseList(appletAdvertisingEntity, AdvertisingSpaceDTO.class);
if(CollUtil.isEmpty(list)){
return CollUtil.toList();
}
} catch (BizException e) {
LOGGER.warn("获取小程序广告[advertisingService.getAppletAdvertising]:" + e.getMessage(), e);
throw new BizException(e.getCode(), e.getMessage());
} catch (Exception e) {
LOGGER.error("获取小程序广告[advertisingService.getAppletAdvertising]:" + e.getMessage(), e);
throw new BookBizException(BookBizException.INVOKE_USER_ERROR, "获取小程序广告失败~!");
}
return list;
}
/**
* 获取H5广告
*/
public List<AdvertisingSpaceDTO> getH5Advertising(Long bookId, Long adviserId, Long channelId) {
List<AdvertisingSpaceDTO> list;
try {
ResponseEntity<ResponseDto<List<AdvertisingSpaceDTO>>> appletAdvertisingEntity = advertisingService.getH5Advertising(bookId, adviserId, channelId);
list = ResponseHandleUtil.parseList(appletAdvertisingEntity, AdvertisingSpaceDTO.class);
if(CollUtil.isEmpty(list)){
return CollUtil.toList();
}
} catch (BizException e) {
LOGGER.warn("获取H5广告[advertisingService.getH5Advertising]:" + e.getMessage(), e);
throw new BizException(e.getCode(), e.getMessage());
} catch (Exception e) {
LOGGER.error("获取H5广告[advertisingService.getH5Advertising]:" + e.getMessage(), e);
throw new BookBizException(BookBizException.INVOKE_USER_ERROR, "获取H5广告失败~!");
}
return list;
}
}
......@@ -56,7 +56,7 @@ public interface ResourcePageBiz {
* @date:2021/3/29 11:49
* * @param null
*/
List<ResourceColumnAndServeVO> getColumnAndServeListByPageId(Long resourcePageId, Boolean isWechat);
List<ResourceColumnAndServeVO> getColumnAndServeListByPageId(Long resourcePageId, Boolean isWechat, Long bookId, Long adviserId, Long channelId);
/**
* 根据书刊查资源页基本配置
* @author:zhuyajie
......
......@@ -4,6 +4,9 @@ import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeException;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.core.collection.CollUtil;
import com.pcloud.advertising.advertising.dto.AdvertisingSpaceDTO;
import com.pcloud.advertising.advertising.dto.AdvertisingSpaceItemDTO;
import com.pcloud.appcenter.app.dto.AppDto;
import com.pcloud.book.applet.biz.AppletBooklistBiz;
import com.pcloud.book.applet.biz.AppletThirdResourcesBiz;
......@@ -15,6 +18,7 @@ import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.book.biz.BookBiz;
import com.pcloud.book.book.dto.BookDto;
import com.pcloud.book.book.vo.BookLinkVO;
import com.pcloud.book.consumer.advsertising.AdvertisingConsr;
import com.pcloud.book.consumer.app.AppConsr;
import com.pcloud.book.consumer.channel.QrcodeSceneConsr;
import com.pcloud.book.consumer.raystask.AdviserTaskConsr;
......@@ -81,6 +85,7 @@ import com.pcloud.common.utils.NumberUtil;
import com.pcloud.common.utils.QrcodeUtils;
import com.pcloud.common.utils.UUIDUitl;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.message.common.enums.YesNoEnums;
import com.pcloud.resourcecenter.product.dto.ProductDto;
import com.pcloud.usercenter.party.adviser.dto.AdviserBaseInfoDto;
......@@ -156,6 +161,8 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
private ResourcePageCollectDao resourcePageCollectDao;
@Autowired
private AdviserTaskConsr adviserTaskConsr;
@Autowired
private AdvertisingConsr advertisingConsr;
@Override
public Long updateResourcePage(UpdateResourcePageVO updateResourcePageVO) {
......@@ -528,20 +535,16 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
}
@Override
public List<ResourceColumnAndServeVO> getColumnAndServeListByPageId(Long resourcePageId, Boolean isWechat) {
public List<ResourceColumnAndServeVO> getColumnAndServeListByPageId(Long resourcePageId, Boolean isWechat, Long bookId, Long adviserId, Long channelId) {
List<ResourceColumnAndServeVO> serveVOS = resourcePageColumnDao.getColumnListByPageId(resourcePageId);
if (ListUtils.isEmpty(serveVOS)) {
return new ArrayList<>();
}
if (CollUtil.isNotEmpty(serveVOS)) {
List<ResourcePageItemVO> itemVOList;
if (isWechat) {
itemVOList = resourcePageItemDao.getResourcePageItemByPageId(resourcePageId, true);
} else {
itemVOList = resourcePageItemDao.getResourcePageItemByPageId(resourcePageId, null);
}
if (ListUtils.isEmpty(itemVOList)) {
return serveVOS;
}
if (CollUtil.isNotEmpty(itemVOList)) {
Map<String, List<ResourcePageItemVO>> listMap = itemVOList.stream().collect(Collectors.groupingBy(ResourcePageItemVO::getServeType));
for (Map.Entry<String, List<ResourcePageItemVO>> entry : listMap.entrySet()) {
this.fillResourceByType(entry.getValue(), isWechat, entry.getKey());
......@@ -564,9 +567,68 @@ public class ResourcePageBizImpl implements ResourcePageBiz {
columnAndServeVO.setLogoUrl(itemVOS.get(0).getLogoUrl());
}
}
}
}
if(CollUtil.isEmpty(serveVOS)){
serveVOS = CollUtil.toList();
}
// 填充广告
this.fillAdvertising(serveVOS, bookId, adviserId, channelId);
return serveVOS;
}
/**
* 填充广告
*/
private void fillAdvertising(List<ResourceColumnAndServeVO> serveVOS, Long bookId, Long adviserId, Long channelId) {
if(serveVOS == null || bookId == null || adviserId == null || channelId == null){
return;
}
try {
List<AdvertisingSpaceDTO> h5Advertising = advertisingConsr.getH5Advertising(bookId, adviserId, channelId);
if(CollUtil.isEmpty(h5Advertising)){
return;
}
for (AdvertisingSpaceDTO adDto : h5Advertising) {
List<AdvertisingSpaceItemDTO> itemList = adDto.getAdvertisingSpaceItemList();
if(CollUtil.isEmpty(itemList)){
continue;
}
ResourceColumnAndServeVO serveVO = new ResourceColumnAndServeVO();
serveVO.setIsAdvertising(true);
serveVO.setColumnFormat(2); // 宽图
serveVO.setColumnSeq(0);
serveVO.setShowMore(YesNoEnums.NO.code);
serveVO.setThemeStyle(adDto.getThemeStyle());
serveVO.setAdPosition(adDto.getAdPosition());
serveVO.setMasterId(adDto.getMasterId());
serveVO.setAdvertisingSpaceId(adDto.getId());
serveVO.setAdvertisingItemList(itemList);
AdvertisingSpaceItemDTO item = itemList.get(0);
if("H5_SERVE_RESOURCE".equalsIgnoreCase(adDto.getAdPosition())){
serveVO.setColumnName(item.getColumnTitle());
serveVO.setColumnMarker(item.getColumnMarker());
serveVO.setColumnSeq(getColumnSeq(item.getColumnSeq()));
} else {
serveVO.setColumnName(item.getAdTitle());
}
serveVOS.add(serveVO);
}
} catch (Exception e){
log.error("[fillAdvertising] H5 填充广告失败,err:{}", e.getMessage(), e);
}
}
private Integer getColumnSeq(Integer columnSeq) {
if(columnSeq == null){
return 0;
}
if(columnSeq == -1){
return 9999;
}
return columnSeq;
}
@ParamLog("按类型填充资源")
private void fillResourceByType(List<ResourcePageItemVO> itemVOS, Boolean isWechat, String serveType) {
if (ListUtils.isEmpty(itemVOS)) {
......
......@@ -69,7 +69,7 @@ public class ResourcePageFacade {
public ResponseDto<?> getColumnAndServeListByPageId(@RequestHeader("token") String token,
@RequestParam("resourcePageId") Long resourcePageId){
SessionUtil.getVlaue(token, SessionUtil.PARTY_ID);
return new ResponseDto<>(resourcePageBiz.getColumnAndServeListByPageId(resourcePageId, false));
return new ResponseDto<>(resourcePageBiz.getColumnAndServeListByPageId(resourcePageId, false, null, null, null));
}
@ApiOperation("客户端-根据书刊查资源页基本配置")
......@@ -85,9 +85,12 @@ public class ResourcePageFacade {
@ApiOperation("客户端-根据页面id查资源页栏目及资源")
@GetMapping("getColumnAndServeListByPageId4Wechat")
public ResponseDto<?> getColumnAndServeListByPageId4Wechat(@CookieValue("userInfo") String userInfo,
@RequestParam("resourcePageId") Long resourcePageId){
@RequestParam("resourcePageId") Long resourcePageId,
@RequestParam(value = "bookId", required = false) Long bookId,
@RequestParam(value = "adviserId", required = false) Long adviserId,
@RequestParam(value = "channelId", required = false) Long channelId){
Cookie.getId(userInfo,Cookie._WECHAT_USER_ID);
return new ResponseDto<>(resourcePageBiz.getColumnAndServeListByPageId(resourcePageId, true));
return new ResponseDto<>(resourcePageBiz.getColumnAndServeListByPageId(resourcePageId, true, bookId, adviserId, channelId));
}
@ApiOperation("客户端分页查栏目资源")
......
package com.pcloud.book.group.vo;
import com.pcloud.advertising.advertising.dto.AdvertisingSpaceItemDTO;
import com.pcloud.common.dto.BaseDto;
import java.util.List;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
......@@ -62,4 +64,28 @@ public class ResourceColumnAndServeVO extends BaseDto{
* 图片位图片
*/
private String logoUrl;
@ApiModelProperty("栏目标识")
private String columnMarker;
@ApiModelProperty("是否是广告")
private Boolean isAdvertising;
@ApiModelProperty("广告主id")
private Long masterId;
@ApiModelProperty("广告位ID")
private Long advertisingSpaceId;
@ApiModelProperty("广告详情id")
private Long advertisingSpaceItemId;
@ApiModelProperty("广告位置")
private String adPosition;
@ApiModelProperty("广告位置")
private Integer themeStyle;
@ApiModelProperty("广告配置项信息")
private List<AdvertisingSpaceItemDTO> advertisingItemList;
}
......@@ -1201,7 +1201,7 @@ public class RightsSettingBizImpl implements RightsSettingBiz {
if (null == resourcePageVO || null == resourcePageVO.getId()) {
return;
}
List<ResourceColumnAndServeVO> serveVOList = resourcePageBiz.getColumnAndServeListByPageId(resourcePageVO.getId(), false);
List<ResourceColumnAndServeVO> serveVOList = resourcePageBiz.getColumnAndServeListByPageId(resourcePageVO.getId(), false, null, null, null);
UpdateResourceColumnVO columnVO = new UpdateResourceColumnVO();
columnVO.setColumnFormat(3);
columnVO.setColumnName("精品资讯");
......
......@@ -654,6 +654,7 @@
b.BOOK_NAME bookName,
b.COVER_IMG coverImg,
b.ISBN isbn,
b.SERIAL_NUMBER serialNumber,
ba.BOOK_ADVISER_ID bookAdviserId
FROM
`book_adviser` ba
......@@ -669,8 +670,6 @@
)
</if>
AND b.IS_DELETE = 0
GROUP BY
ba.BOOK_ADVISER_ID
ORDER BY
ba.CREATED_DATE DESC
</select>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment