Commit d06426dc by 宋祥

Merge branch 'zhuyajie' into 'master'

广告投放数据监测

See merge request rays/pcloud-book!54
parents afab787a 2af2c4be
......@@ -523,7 +523,33 @@ public class BookDto extends BaseDto {
* 报名率
*/
private BigDecimal registerRate;
/**
* 点击读者量
*/
private Long clickUserNum;
/**
* 试听完成人数(完课量)
*/
private Long pilotFinishUserNum;
/**
* 试听完成比率(完课率)
*/
private BigDecimal pilotFinishRate;
/**
* 平均浏览时长
*/
private BigDecimal avgBrowseTimes;
/**
* 跳出量
*/
private Long outNum;
/**
* 跳出率
*/
private BigDecimal outRate;
public String getQrRemark() {
return qrRemark;
......@@ -1337,6 +1363,54 @@ public class BookDto extends BaseDto {
this.registerRate = registerRate;
}
public Long getClickUserNum() {
return clickUserNum;
}
public void setClickUserNum(Long clickUserNum) {
this.clickUserNum = clickUserNum;
}
public Long getPilotFinishUserNum() {
return pilotFinishUserNum;
}
public void setPilotFinishUserNum(Long pilotFinishUserNum) {
this.pilotFinishUserNum = pilotFinishUserNum;
}
public BigDecimal getPilotFinishRate() {
return pilotFinishRate;
}
public void setPilotFinishRate(BigDecimal pilotFinishRate) {
this.pilotFinishRate = pilotFinishRate;
}
public BigDecimal getAvgBrowseTimes() {
return avgBrowseTimes;
}
public void setAvgBrowseTimes(BigDecimal avgBrowseTimes) {
this.avgBrowseTimes = avgBrowseTimes;
}
public Long getOutNum() {
return outNum;
}
public void setOutNum(Long outNum) {
this.outNum = outNum;
}
public BigDecimal getOutRate() {
return outRate;
}
public void setOutRate(BigDecimal outRate) {
this.outRate = outRate;
}
@Override
public String toString() {
return "BookDto{" +
......@@ -1441,6 +1515,12 @@ public class BookDto extends BaseDto {
", secondTypeCode='" + secondTypeCode + '\'' +
", registerNum=" + registerNum +
", registerRate=" + registerRate +
", clickUserNum=" + clickUserNum +
", pilotFinishUserNum=" + pilotFinishUserNum +
", pilotFinishRate=" + pilotFinishRate +
", avgBrowseTimes=" + avgBrowseTimes +
", outNum=" + outNum +
", outRate=" + outRate +
'}';
}
}
package com.pcloud.book.group.dto;
import com.pcloud.common.dto.BaseDto;
/**
* @描述:
* @作者:zhuyajie
* @创建时间:16:33 2019/7/16
* @版本:1.0
*/
public class GroupTopicDTO extends BaseDto {
/**
* 分类标识
*/
private Long classifyId;
public Long getClassifyId() {
return classifyId;
}
public void setClassifyId(Long classifyId) {
this.classifyId = classifyId;
}
@Override
public String toString() {
return "GroupTopicDTO{" +
"classifyId=" + classifyId +
'}';
}
}
......@@ -443,4 +443,32 @@ public interface AdvertisingSpaceBiz {
*/
PageBeanNew<AdvertisingPlan> getAdvertisingPlanList(String keyword, Long partyId, Integer currentPage, Integer numPerPage);
/**
* 完课量埋点
* @param advertisingPilotRecord
*/
void addPilotTrack(AdvertisingPilotRecord advertisingPilotRecord);
/**
* 浏览时长埋点
* @param advertisingBrowseRecord
*/
String addBrowseTrack(AdvertisingBrowseRecord advertisingBrowseRecord);
/**
* 微信群广告投放详情
* @param qrcodeId
* @param statisMonth
* @param adId
* @param pageParam
* @return
*/
PageBean advertisingDistributionDetail4WechatGroup(Long qrcodeId, String statisMonth, Long adId, PageParam pageParam);
/**
* 更新曝光量
* @param qrcodeId
* @param peopleCounts
*/
void updateExposureByQrcode(Long qrcodeId, Integer peopleCounts);
}
......@@ -119,4 +119,12 @@ public interface BmBiz {
* @return
*/
Long getRegisterUserNumByAdIdQrcodeId(Long qrcodeId, Long adId, String statisMonth);
/**
* 获取书刊报名次数
* @param bookId
* @param adviserId
* @param channelId
* @return
*/
public Long getRegisterCountByBookId(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth);
}
......@@ -56,6 +56,7 @@ import com.pcloud.facade.quartz.entity.ScheduleJob;
import com.pcloud.facade.quartz.service.ScheduleService;
import com.pcloud.readercenter.wechat.entity.WechatUser;
import com.pcloud.resourcecenter.product.service.ProductService;
import com.pcloud.wechatgroup.message.dto.GroupChatCountDTO;
import com.sdk.wxgroup.SendArticleMessageVO;
import com.sdk.wxgroup.SendPicMessageVO;
import com.sdk.wxgroup.SendTextMessageVO;
......@@ -77,6 +78,8 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static com.pcloud.book.util.common.ThreadPoolUtils.SEND_MESSAGE_THREAD_POOL;
/**
* Description 广告位业务逻辑层接口实现类
* @author PENG
......@@ -157,6 +160,10 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
private ScheduleService scheduleService;
@Autowired
private BmBiz bmBiz;
@Autowired
private AdvertisingPilotRecordDao advertisingPilotRecordDao;
@Autowired
private AdvertisingBrowseRecordDao advertisingBrowseRecordDao;
private static final String ADVERTISING_PUT_PLAN_SCHEDULE_PRE = "ADVERTISING_PUT_PALN_";
......@@ -516,6 +523,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
}
}
}
//关闭广告位的出版社
List<Long> closeAgentIds = this.getCloseAgentId();
List<AdvertisingDistributionBook> list = new ArrayList<>();
for (BookAdviser bookAdviser : book.getBooks()) {
AdvertisingDistributionBook distributionBook = new AdvertisingDistributionBook();
......@@ -526,6 +535,10 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
Long agentId = adviserConsr.getAgentIdByAdviser(bookAdviser.getAdviserId());
distributionBook.setAgentId(agentId);
distributionBook.setIsBookGroup(book.getIsBookGroup());
if (!ListUtils.isEmpty(closeAgentIds) && closeAgentIds.contains(agentId)){
BookDto bookDto = bookBiz.getBaseById(bookAdviser.getBookId());
throw new BookBizException(BookBizException.PARAM_IS_ERROR, StringUtil.addBracket(bookDto.getBookName()) + "等书所属出版社未开放广告投放权限!");
}
list.add(distributionBook);
}
advertisingDistributionBookDao.batchInsert(list);
......@@ -538,7 +551,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
@Transactional(rollbackFor = Exception.class)
@ParamLog(value = "投放微信群", isAfterReturn = false)
public void distributeWechatGroup(AdvertisingDistributionBook book, Boolean isPlan) throws BizException {
if (null == book.getAdId() || ListUtils.isEmpty(book.getGroups())) {
List<DistributionWechatGroup> bookGroups = book.getGroups();
if (null == book.getAdId() || ListUtils.isEmpty(bookGroups)) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "参数有误!");
}
AdvertisingSpace advertisingSpace = advertisingSpaceDao.getById(book.getAdId());
......@@ -551,25 +565,21 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
AdvertisingSpace space = new AdvertisingSpace();
space.setId(book.getAdId());
advertisingSpaceDao.update(space);
boolean paramError = book.getGroups().stream().anyMatch(group -> null == group.getBookId()
boolean paramError = bookGroups.stream().anyMatch(group -> null == group.getBookId()
|| null == group.getChannelId() || null == group.getAdviserId() || null == group.getClassifyId() || null == group.getQrcodeId());
if (paramError) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "参数有误!");
}
// 校验广告位是否已投放微信群
List<Long> qrcodeIds = book.getGroups().stream().map(DistributionWechatGroup::getQrcodeId).collect(Collectors.toList());
/*Map<String, Object> paramMap = new HashMap<>();
paramMap.put("adId", book.getAdId());
paramMap.put("qrcodeIds", qrcodeIds);
List<Long> existIds = advertisingDistributionBookDao.checkQrcodeIdExist(paramMap);
if (!ListUtils.isEmpty(existIds) && !isPlan) {
Long qrcodeId = existIds.get(0);
GroupQrcode groupQrcode = groupQrcodeDao.getById(qrcodeId);
throw new BookBizException(BookBizException.PARAM_IS_ERROR, StringUtil.addBracket(groupQrcode.getGroupName()) + "等" + existIds.size() + "个微信群已投放该广告位!");
}*/
List<AdvertisingDistributionBook> list = new ArrayList<>();
Map<Long, Long> agentIdMap = new HashMap<>();
for (DistributionWechatGroup group : book.getGroups()) {
for (DistributionWechatGroup group : bookGroups) {
//机器人不存在,不投放广告
GroupQrcode groupQrcode = groupQrcodeDao.getById(group.getQrcodeId());
String altId = wechatGroupConsr.getSendAdRobotByGroupId(groupQrcode.getWeixinGroupId());
if (StringUtil.isEmpty(altId)) {
bookGroups.remove(group);
continue;
}
AdvertisingDistributionBook distributionBook = new AdvertisingDistributionBook();
distributionBook.setAdId(book.getAdId());
distributionBook.setBookId(group.getBookId());
......@@ -588,10 +598,54 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
distributionBook.setIsBookGroup(true);
list.add(distributionBook);
}
if (ListUtils.isEmpty(bookGroups)) {
LOGGER.info("微信群为空或机器人不在微信群,广告投放失败" + book.getGroups());
return;
}
advertisingDistributionBookDao.batchInsert(list);
//发送微信群消息
SEND_MESSAGE_THREAD_POOL.execute(() -> {
LOGGER.info("广告位投放微信群" + book);
sendWeixinAdMessage(advertisingSpace, bookGroups);
});
// 根据微信群人数埋点
List<Long> qrcodeIds = bookGroups.stream().map(DistributionWechatGroup::getQrcodeId).collect(Collectors.toList());
Map<Long, GroupQrcodeInfoDTO> map = groupQrcodeDao.listQrcodeInfoByIds(qrcodeIds);
if (!MapUtils.isEmpty(map)) {
List<AdvertisingExposureRecord> recordList = new ArrayList<>();
for (DistributionWechatGroup group : bookGroups) {
Long qrcodeId = group.getQrcodeId();
if (map.containsKey(qrcodeId)) {
GroupQrcodeInfoDTO dto = map.get(qrcodeId);
Integer userNumber = dto.getUserNumber();
AdvertisingExposureRecord record = new AdvertisingExposureRecord();
record.setAdId(book.getAdId());
record.setBookId(group.getBookId());
record.setIsBookGroup(true);
record.setAdviserId(group.getAdviserId());
record.setAgentId(agentIdMap.get(group.getAdviserId()));
record.setChannelId(group.getChannelId());
record.setFromType("WECHAT_GROUP");
record.setFromId(qrcodeId);
record.setCount(userNumber.longValue());
recordList.add(record);
}
}
if (!ListUtils.isEmpty(recordList)) {
advertisingExposureRecordDao.insert(recordList);
}
}
}
/**
* 发送微信群消息
* @param advertisingSpace
* @param groups
*/
private void sendWeixinAdMessage(AdvertisingSpace advertisingSpace, List<DistributionWechatGroup> groups){
//结算方式
AdvertisingSettlementMethodDTO methodDTO = advertisingSettlementMethodDao.getByMasterIdAndAdId(advertisingSpace.getMasterId(), advertisingSpace.getId());
for (DistributionWechatGroup group : book.getGroups()) {
for (DistributionWechatGroup group : groups) {
// 获取群信息
GroupQrcode groupQrcode = groupQrcodeDao.getById(group.getQrcodeId());
String groupId = groupQrcode.getWeixinGroupId();
......@@ -599,7 +653,7 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
// 获取机器人微信号
String altId = wechatGroupConsr.getSendAdRobotByGroupId(groupId);
if (StringUtil.isEmpty(altId)) {
altId = wechatGroupConsr.getRobotIdByGroupId(groupId);
continue;
}
if (AdPositionModeEnum.TEXT_AND_LINK.modeCode.equals(advertisingSpace.getAdPositionMode())) {
//多文字+多链接 modifyby zhuyajie
......@@ -664,31 +718,11 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
LOGGER.info("发送微信消息-纯图片" + sendPicMessageVO.toString());
WxGroupSDK.sendPicMessage(sendPicMessageVO);
}
}
// 根据微信群人数埋点
Map<Long, GroupQrcodeInfoDTO> map = groupQrcodeDao.listQrcodeInfoByIds(qrcodeIds);
if (!MapUtils.isEmpty(map)) {
List<AdvertisingExposureRecord> recordList = new ArrayList<>();
for (DistributionWechatGroup group : book.getGroups()) {
Long qrcodeId = group.getQrcodeId();
if (map.containsKey(qrcodeId)) {
GroupQrcodeInfoDTO dto = map.get(qrcodeId);
Integer userNumber = dto.getUserNumber();
AdvertisingExposureRecord record = new AdvertisingExposureRecord();
record.setAdId(book.getAdId());
record.setBookId(group.getBookId());
record.setIsBookGroup(true);
record.setAdviserId(group.getAdviserId());
record.setAgentId(agentIdMap.get(group.getAdviserId()));
record.setChannelId(group.getChannelId());
record.setFromType("WECHAT_GROUP");
record.setFromId(qrcodeId);
record.setCount(userNumber.longValue());
recordList.add(record);
}
}
if (!ListUtils.isEmpty(recordList)) {
advertisingExposureRecordDao.insert(recordList);
try {
Thread.sleep(1000);
LOGGER.info("发送微信消息-线程休眠1秒");
} catch (InterruptedException e) {
LOGGER.error("线程休眠失败" + e.getMessage());
}
}
}
......@@ -976,16 +1010,46 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
for (Object object : pageBean.getRecordList()) {
BookDto bookDto = (BookDto) object;
// 曝光量
Long exposureNum = getExposureNumByBookId(bookDto.getBookId(), bookDto.getAdviserId(), bookDto.getChannelId());
Long exposureNum = getExposureNumByBookId(bookDto.getBookId(), bookDto.getAdviserId(), bookDto.getChannelId(), null, null);
bookDto.setExposureNum(exposureNum);
// 点击量
Long clickNum = getClickNumByBookId(bookDto.getBookId(), bookDto.getAdviserId(), bookDto.getChannelId());
Long clickNum = getClickNumByBookId(bookDto.getBookId(), bookDto.getAdviserId(), bookDto.getChannelId(), null, null);
bookDto.setClickNum(clickNum);
BigDecimal clickRate = (null == bookDto.getExposureNum() || bookDto.getExposureNum().equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(bookDto.getClickNum().doubleValue() / bookDto.getExposureNum()).setScale(4, BigDecimal.ROUND_HALF_UP);
bookDto.setClickRate(clickRate);
BigDecimal income = getIncomeByBookId(bookDto.getBookId(), bookDto.getChannelId());
bookDto.setTotalIncome(income);
// 点击读者量
Long clickUserNum = advertisingClickRecordDao.getClickUserNumByBookId(null, bookDto.getBookId(), bookDto.getAdviserId(), bookDto.getChannelId(), null);
bookDto.setClickUserNum(clickUserNum);
//报名量报名率
Long registerNum = bmBiz.getRegisterCountByBookId(bookDto.getBookId(), bookDto.getAdviserId(), bookDto.getChannelId(), null, null);
BigDecimal registerRate = (null == clickNum || clickNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(registerNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
bookDto.setRegisterNum(registerNum);
bookDto.setRegisterRate(registerRate);
//完课量 完课率
Long pilotFinishUserNum = advertisingPilotRecordDao.getPilotUserNumByBookId(bookDto.getBookId(), bookDto.getAdviserId(), bookDto.getChannelId(), null, null);
BigDecimal pilotFinishRate = (null == clickUserNum || clickUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(pilotFinishUserNum.doubleValue() / clickUserNum).setScale(4, BigDecimal.ROUND_HALF_UP);
bookDto.setPilotFinishUserNum(pilotFinishUserNum);
bookDto.setPilotFinishRate(pilotFinishRate);
//行为数据(平均浏览时长 跳出量 跳出率)
Long browseTimes = advertisingBrowseRecordDao.getBrowseTimesByBook(bookDto.getBookId(), bookDto.getAdviserId(), bookDto.getChannelId(), null, null);
Long browseUserNum = advertisingBrowseRecordDao.getBrowseUserCountByBook(bookDto.getBookId(), bookDto.getAdviserId(), bookDto.getChannelId(), null, null);
BigDecimal avgBrowseTimes = (browseUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(browseTimes.doubleValue() / browseUserNum / 1000).setScale(2, BigDecimal.ROUND_HALF_UP);
bookDto.setAvgBrowseTimes(avgBrowseTimes);
Long outNum = 0L;
BigDecimal outRate = BigDecimal.ZERO;
if (null != clickNum && clickNum.compareTo(registerNum) > 0) {
outNum = clickNum - registerNum;
outRate = (clickNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(outNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
}
bookDto.setOutNum(outNum);
bookDto.setOutRate(outRate);
}
return pageBean;
}
......@@ -1001,6 +1065,14 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
if (pageBean == null || ListUtils.isEmpty(pageBean.getRecordList())) {
return new PageBean(0, 0, new ArrayList<>());
}
Object objs = (Object) pageBean.getRecordList();
List<AdGroupQrcodeDTO> dtoList = (List<AdGroupQrcodeDTO>) objs;
List<Long> qrcodeIds = dtoList.stream().filter(s -> s != null).map(AdGroupQrcodeDTO::getGroupQrcodeId).distinct().collect(Collectors.toList());
if (ListUtils.isEmpty(qrcodeIds)) {
return new PageBean(pageParam.getPageNum(), pageParam.getNumPerPage(), 0, new ArrayList<>());
}
Map<Long, GroupChatCountDTO> chatCountDTOMap = wechatGroupConsr.getChatCountByGroup(qrcodeIds, null);
for (Object object : pageBean.getRecordList()) {
AdGroupQrcodeDTO qrcodeDTO = (AdGroupQrcodeDTO) object;
// 曝光量
......@@ -1023,6 +1095,38 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
new BigDecimal(registerNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
qrcodeDTO.setRegisterNum(registerNum);
qrcodeDTO.setRegisterRate(registerRate);
//完课量 完课率
Long pilotFinishUserNum = advertisingPilotRecordDao.getPilotUserNumByQrcode(qrcodeDTO.getGroupQrcodeId(), null, null);
BigDecimal pilotFinishRate = (null == clickUserNum || clickUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(pilotFinishUserNum.doubleValue() / clickUserNum).setScale(4, BigDecimal.ROUND_HALF_UP);
qrcodeDTO.setPilotFinishUserNum(pilotFinishUserNum);
qrcodeDTO.setPilotFinishRate(pilotFinishRate);
//群活跃度
if (!MapUtils.isEmpty(chatCountDTOMap)) {
GroupChatCountDTO chatCountDTO = chatCountDTOMap.get(qrcodeDTO.getGroupQrcodeId());
if (null != chatCountDTO) {
qrcodeDTO.setActiveCount(chatCountDTO.getChatCount());
} else {
qrcodeDTO.setActiveCount(0);
}
} else {
qrcodeDTO.setActiveCount(0);
}
//行为数据(平均浏览时长 跳出量 跳出率)
Long browseTimes = advertisingBrowseRecordDao.getBrowseTimesByQrcode(qrcodeDTO.getGroupQrcodeId(), null, null);
Long browseUserNum = advertisingBrowseRecordDao.getBrowseUserCountByQrcode(qrcodeDTO.getGroupQrcodeId(), null, null);
BigDecimal avgBrowseTimes = (browseUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(browseTimes.doubleValue() / browseUserNum / 1000).setScale(2, BigDecimal.ROUND_HALF_UP);
qrcodeDTO.setAvgBrowseTimes(avgBrowseTimes);
Long outNum = 0L;
BigDecimal outRate = BigDecimal.ZERO;
if (null != clickNum && clickNum.compareTo(registerNum) > 0) {
outNum = clickNum - registerNum;
outRate = (clickNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(outNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
}
qrcodeDTO.setOutNum(outNum);
qrcodeDTO.setOutRate(outRate);
}
return pageBean;
}
......@@ -1037,7 +1141,7 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
}
/**
* 获取书刊广告位曝光量
* 获取广告位曝光量
*/
private Long getExposureNumByAdId(Long adId, Long bookId, Long adviserId, Long channelId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
......@@ -1053,17 +1157,19 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
/**
* 获取书刊广告位曝光量
*/
private Long getExposureNumByBookId(Long bookId, Long adviserId, Long channelId) {
private Long getExposureNumByBookId(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("bookId", bookId);
paramMap.put("adviserId", adviserId);
paramMap.put("channelId", channelId);
paramMap.put("adId", adId);
paramMap.put("statisMonth", statisMonth);
Long exposureNum = (Long) advertisingExposureRecordDao.getBy(paramMap, "getExposureNumByBookId");
return null == exposureNum ? 0L : exposureNum;
}
/**
* 获取书刊广告位曝光量
* 获取微信群广告位曝光量
*/
private Long getExposureNumByGroupQrcodeId(Long qrcodeId, Long adId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
......@@ -1075,7 +1181,7 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
}
/**
* 获取书刊广告位点击量
* 获取广告位点击量
*/
private Long getClickNumByAdId(Long adId, Long bookId, Long adviserId, Long channelId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
......@@ -1091,17 +1197,19 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
/**
* 获取书刊广告位点击量
*/
private Long getClickNumByBookId(Long bookId, Long adviserId, Long channelId) {
private Long getClickNumByBookId(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("bookId", bookId);
paramMap.put("adviserId", adviserId);
paramMap.put("channelId", channelId);
paramMap.put("adId", adId);
paramMap.put("statisMonth", statisMonth);
Long clickNum = (Long) advertisingClickRecordDao.getBy(paramMap, "getClickNumByBookId");
return null == clickNum ? 0L : clickNum;
}
/**
* 获取书刊广告位点击量
* 获取微信群广告位点击量
*/
private Long getClickNumByGroupQrcodeId(Long qrcodeId, Long adId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
......@@ -1135,7 +1243,7 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
}
/**
* 获取书刊广告位曝光量
* 获取广告主曝光量
*/
private Long getExposureNumByMasterId(Long masterId) {
Map<String, Object> paramMap = new HashMap<>();
......@@ -1299,22 +1407,52 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
if (null != master) {
spaceDTO.setMasterName(master.getMasterName());
}
spaceDTO.setExposureNum(getExposureNumByAdId(spaceDTO.getId(), bookId, adviserId, channelId, statisMonth));
spaceDTO.setClickNum(getClickNumByAdId(spaceDTO.getId(), bookId, adviserId, channelId, statisMonth));
spaceDTO.setExposureNum(getExposureNumByBookId(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth));
spaceDTO.setClickNum(getClickNumByBookId(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth));
BigDecimal clickRate = (null == spaceDTO.getExposureNum() || spaceDTO.getExposureNum().equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(spaceDTO.getClickNum().doubleValue() / spaceDTO.getExposureNum()).setScale(4, BigDecimal.ROUND_HALF_UP);
spaceDTO.setClickRate(clickRate);
BigDecimal income = getIncomeByAdId(spaceDTO.getId(), bookId, channelId, statisMonth);
spaceDTO.setTotalIncome(income);
// 填充广告位置名称
spaceDTO.setAdPositionName(AdPositionModeEnum.getNameByCode(spaceDTO.getAdPositionMode()));
AdvertisingSettlementMethodDTO methodDTO = advertisingSettlementMethodDao.getByMasterIdAndAdId(spaceDTO.getMasterId(), spaceDTO.getId());
if (null != methodDTO) {
spaceDTO.setSettlementMethod(methodDTO.getSettlementMethod());
}
//报名量报名率
Long clickNum = spaceDTO.getClickNum();
Long registerNum = bmBiz.getRegisterCountByAdId(spaceDTO.getId(),statisMonth,bookId,adviserId,channelId);
Long registerNum = bmBiz.getRegisterCountByBookId(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth);
BigDecimal registerRate = (null == clickNum || clickNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(registerNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
spaceDTO.setRegisterNum(registerNum);
spaceDTO.setRegisterRate(registerRate);
// 填充广告位置名称
fillAdpositionName4CommonAd(spaceDTO);
// 点击读者量
Long clickUserNum = advertisingClickRecordDao.getClickUserNumByBookId(spaceDTO.getId(), bookId, adviserId, channelId, statisMonth);
spaceDTO.setClickUserNum(clickUserNum);
//完课量 完课率
Long pilotFinishUserNum = advertisingPilotRecordDao.getPilotUserNumByBookId(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth);
BigDecimal pilotFinishRate = (null == clickUserNum || clickUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(pilotFinishUserNum.doubleValue() / clickUserNum).setScale(4, BigDecimal.ROUND_HALF_UP);
spaceDTO.setPilotFinishUserNum(pilotFinishUserNum);
spaceDTO.setPilotFinishRate(pilotFinishRate);
//行为数据(平均浏览时长 跳出量 跳出率)
Long browseTimes = advertisingBrowseRecordDao.getBrowseTimesByBook(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth);
Long browseUserNum = advertisingBrowseRecordDao.getBrowseUserCountByBook(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth);
BigDecimal avgBrowseTimes = (browseUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(browseTimes.doubleValue() / browseUserNum / 1000).setScale(2, BigDecimal.ROUND_HALF_UP);
spaceDTO.setAvgBrowseTimes(avgBrowseTimes);
Long outNum = 0L;
BigDecimal outRate = BigDecimal.ZERO;
if (null != clickNum && clickNum.compareTo(registerNum) > 0) {
outNum = clickNum - registerNum;
outRate = (clickNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(outNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
}
spaceDTO.setOutNum(outNum);
spaceDTO.setOutRate(outRate);
}
return pageBean;
}
......@@ -1333,7 +1471,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "暂无数据导出!");
}
// 字段名
String[] rowsName = {"序号", "广告位名称", "广告主", "广告位置", "投放时间", "曝光量", "点击量", "点击率", "留资量", "留资率", "累计收益"};
String[] rowsName = {"序号", "广告位名称", "广告主", "结算方式", "广告位置", "投放时间", "平均浏览时长", "跳出量", "跳出率", "曝光量", "点击量", "点击率",
"独立访客数", "留资量", "留资率", "完课量", "完课率", "累计收益"};
List<Object[]> dataList = new ArrayList<>();
Object[] objs;
for (int i = 0; i < list.size(); i++) {
......@@ -1343,25 +1482,50 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
objs[1] = spaceDTO.getAdName();
AdvertisingMaster master = advertisingMasterDao.getById(spaceDTO.getMasterId());
objs[2] = null != master ? master.getMasterName() : "";
AdvertisingSettlementMethodDTO methodDTO = advertisingSettlementMethodDao.getByMasterIdAndAdId(spaceDTO.getMasterId(), spaceDTO.getId());
String settlementMethod = "";
if (null != methodDTO) {
settlementMethod = SettlementMethodEnum.getNameByCode(methodDTO.getSettlementMethod()) + "(" + methodDTO.getSettlementMethod() + ")";
}
objs[3] = settlementMethod;
fillAdpositionName4CommonAd(spaceDTO);
objs[3] = spaceDTO.getAdPositionName();
objs[4] = DateNewUtils.formatDate(spaceDTO.getDistributionTime());
Long exposureNum = getExposureNumByAdId(spaceDTO.getId(), bookId, adviserId, channelId, statisMonth);
objs[5] = exposureNum;
Long clickNum = getClickNumByAdId(spaceDTO.getId(), bookId, adviserId, channelId, statisMonth);
objs[6] = clickNum;
objs[4] = spaceDTO.getAdPositionName();
objs[5] = DateNewUtils.formatDate(spaceDTO.getDistributionTime());
Long browseTimes = advertisingBrowseRecordDao.getBrowseTimesByBook(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth);
Long browseUserNum = advertisingBrowseRecordDao.getBrowseUserCountByBook(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth);
BigDecimal avgBrowseTimes = (browseUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(browseTimes.doubleValue() / browseUserNum / 1000).setScale(2, BigDecimal.ROUND_HALF_UP);
objs[6] = avgBrowseTimes + "秒";
Long clickNum = getClickNumByBookId(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth);
Long registerNum = bmBiz.getRegisterCountByBookId(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth);
Long outNum = 0L;
BigDecimal outRate = BigDecimal.ZERO;
if (null != clickNum && clickNum.compareTo(registerNum) > 0) {
outNum = clickNum - registerNum;
outRate = (clickNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(outNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
}
objs[7] = outNum;
objs[8] = outRate.multiply(new BigDecimal(100)) + "%";
Long exposureNum = getExposureNumByBookId(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth);
objs[9] = exposureNum;
objs[10] = clickNum;
BigDecimal clickRate = (null == exposureNum || exposureNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(clickNum.doubleValue() / exposureNum).setScale(4, BigDecimal.ROUND_HALF_UP);
objs[7] = clickRate.multiply(new BigDecimal(100)) + "%";
//报名量报名率
Long registerNum = bmBiz.getRegisterCountByAdId(spaceDTO.getId(),statisMonth,bookId,adviserId,channelId);
objs[11] = clickRate.multiply(new BigDecimal(100)) + "%";
Long clickUserNum = advertisingClickRecordDao.getClickUserNumByBookId(spaceDTO.getId(), bookId, adviserId, channelId, statisMonth);
objs[12] = clickUserNum;
BigDecimal registerRate = (null == clickNum || clickNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(registerNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
objs[8] = registerNum;
objs[9] = registerRate.multiply(new BigDecimal(100)) + "%";
objs[13] = registerNum;
objs[14] = registerRate.multiply(new BigDecimal(100)) + "%";
Long pilotFinishUserNum = advertisingPilotRecordDao.getPilotUserNumByBookId(bookId, adviserId, channelId, spaceDTO.getId(), statisMonth);
BigDecimal pilotFinishRate = (null == clickUserNum || clickUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(pilotFinishUserNum.doubleValue() / clickUserNum).setScale(4, BigDecimal.ROUND_HALF_UP);
objs[15] = pilotFinishUserNum;
objs[16] = pilotFinishRate.multiply(new BigDecimal(100)) + "%";
BigDecimal income = getIncomeByAdId(spaceDTO.getId(), bookId, channelId, statisMonth);
objs[10] = income + "元";
objs[17] = income + "元";
dataList.add(objs);
}
BookDto bookDto = bookBiz.getBaseById(bookId);
......@@ -1449,6 +1613,10 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
}
// 填充广告位置名称
spaceDTO.setAdPositionName(AdPositionModeEnum.getNameByCode(spaceDTO.getAdPositionMode()));
AdvertisingSettlementMethodDTO methodDTO = advertisingSettlementMethodDao.getByMasterIdAndAdId(spaceDTO.getMasterId(), spaceDTO.getId());
if (null != methodDTO) {
spaceDTO.setSettlementMethod(methodDTO.getSettlementMethod());
}
//报名量报名率
Long clickNum = spaceDTO.getClickNum();
Long registerNum = bmBiz.getRegisterCountByAdIdQrcodeId(spaceDTO.getId(), statisMonth, qrcodeId);
......@@ -1456,6 +1624,28 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
new BigDecimal(registerNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
spaceDTO.setRegisterNum(registerNum);
spaceDTO.setRegisterRate(registerRate);
//完课量 完课率
Long pilotFinishUserNum = advertisingPilotRecordDao.getPilotUserNumByQrcode(qrcodeId,spaceDTO.getId(),statisMonth);
Long clickUserNum = spaceDTO.getClickUserNum();
BigDecimal pilotFinishRate = (null == clickUserNum || clickUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(pilotFinishUserNum.doubleValue() / clickUserNum).setScale(4, BigDecimal.ROUND_HALF_UP);
spaceDTO.setPilotFinishUserNum(pilotFinishUserNum);
spaceDTO.setPilotFinishRate(pilotFinishRate);
//行为数据(平均浏览时长 跳出量 跳出率)
Long browseTimes = advertisingBrowseRecordDao.getBrowseTimesByQrcode(qrcodeId, spaceDTO.getId(), statisMonth);
Long browseUserNum = advertisingBrowseRecordDao.getBrowseUserCountByQrcode(qrcodeId, spaceDTO.getId(), statisMonth);
BigDecimal avgBrowseTimes = (browseUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(browseTimes.doubleValue() / browseUserNum / 1000).setScale(2, BigDecimal.ROUND_HALF_UP);
spaceDTO.setAvgBrowseTimes(avgBrowseTimes);
Long outNum = 0L;
BigDecimal outRate = BigDecimal.ZERO;
if (null != clickNum && clickNum.compareTo(registerNum) > 0) {
outNum = clickNum - registerNum;
outRate = (clickNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(outNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
}
spaceDTO.setOutNum(outNum);
spaceDTO.setOutRate(outRate);
}
return pageBean;
}
......@@ -1472,7 +1662,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "暂无数据导出!");
}
// 字段名
String[] rowsName = {"序号", "广告位名称", "广告主", "广告位置", "投放时间", "曝光量", "点击量", "点击率", "累计收益"};
String[] rowsName = {"序号", "广告位名称", "广告主", "结算方式", "广告位置", "最近投放时间", "已投放次数", "平均浏览时长", "跳出量", "跳出率", "曝光量", "点击量", "点击率",
"独立访客数", "留资量", "留资率", "完课量", "完课率", "累计收益"};
List<Object[]> dataList = new ArrayList<>();
Object[] objs;
for (int i = 0; i < list.size(); i++) {
......@@ -1482,17 +1673,53 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
objs[1] = spaceDTO.getAdName();
AdvertisingMaster master = advertisingMasterDao.getById(spaceDTO.getMasterId());
objs[2] = null != master ? master.getMasterName() : "";
objs[3] = AdPositionModeEnum.getNameByCode(spaceDTO.getAdPositionMode());
objs[4] = DateNewUtils.formatDate(spaceDTO.getDistributionTime());
Long exposureNum = getExposureNumByGroupQrcodeId(qrcodeId, spaceDTO.getId(), statisMonth);
objs[5] = exposureNum;
AdvertisingSettlementMethodDTO methodDTO = advertisingSettlementMethodDao.getByMasterIdAndAdId(spaceDTO.getMasterId(), spaceDTO.getId());
String settlementMethod = "";
if (null != methodDTO) {
settlementMethod = SettlementMethodEnum.getNameByCode(methodDTO.getSettlementMethod()) + "(" + methodDTO.getSettlementMethod() + ")";
}
objs[3] = settlementMethod;
objs[4] = AdPositionModeEnum.getNameByCode(spaceDTO.getAdPositionMode());
objs[5] = DateNewUtils.formatDate(spaceDTO.getDistributionTime());
objs[6] = spaceDTO.getDistributionNum();
Long browseTimes = advertisingBrowseRecordDao.getBrowseTimesByQrcode(qrcodeId, spaceDTO.getId(), statisMonth);
Long browseUserNum = advertisingBrowseRecordDao.getBrowseUserCountByQrcode(qrcodeId, spaceDTO.getId(), statisMonth);
BigDecimal avgBrowseTimes = (browseUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(browseTimes.doubleValue() / browseUserNum / 1000).setScale(2, BigDecimal.ROUND_HALF_UP);
objs[7] = avgBrowseTimes + "秒";
Long outNum = 0L;
BigDecimal outRate = BigDecimal.ZERO;
Long clickUserNum = 0L;
if (!AdPositionModeEnum.JUST_PIC.modeCode.equals(spaceDTO.getAdPositionMode()) && !StringUtil.isEmpty(spaceDTO.getAdLink())) {
clickUserNum = getClickUserNumByGroupQrcodeId(qrcodeId, spaceDTO.getId(), statisMonth);
}
Long clickNum = getClickNumByGroupQrcodeId(qrcodeId, spaceDTO.getId(), statisMonth);
objs[6] = clickNum;
Long registerNum = bmBiz.getRegisterCountByAdIdQrcodeId(spaceDTO.getId(), statisMonth, qrcodeId);
if (null != clickNum && clickNum.compareTo(registerNum) > 0) {
outNum = clickNum - registerNum;
outRate = (clickNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(outNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
}
objs[8] = outNum;
objs[9] = outRate.multiply(new BigDecimal(100)) + "%";
Long exposureNum = getExposureNumByGroupQrcodeId(qrcodeId, spaceDTO.getId(), statisMonth);
objs[10] = exposureNum;
objs[11] = clickNum;
BigDecimal clickRate = (null == exposureNum || exposureNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(clickNum.doubleValue() / exposureNum).setScale(2, BigDecimal.ROUND_HALF_UP);
objs[7] = clickRate.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP) + "%";
new BigDecimal(clickNum.doubleValue() / exposureNum).setScale(4, BigDecimal.ROUND_HALF_UP);
objs[12] = clickRate.multiply(new BigDecimal(100)) + "%";
objs[13] = clickUserNum;
BigDecimal registerRate = (null == clickNum || clickNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(registerNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
objs[14] = registerNum;
objs[15] = registerRate.multiply(new BigDecimal(100)) + "%";
Long pilotFinishUserNum = advertisingPilotRecordDao.getPilotUserNumByQrcode(qrcodeId, spaceDTO.getId(), statisMonth);
BigDecimal pilotFinishRate = (null == clickUserNum || clickUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(pilotFinishUserNum.doubleValue() / clickUserNum).setScale(4, BigDecimal.ROUND_HALF_UP);
objs[16] = pilotFinishUserNum;
objs[17] = pilotFinishRate.multiply(new BigDecimal(100)) + "%";
BigDecimal income = getIncomeByGroupQrcodeId(qrcodeId, spaceDTO.getId(), statisMonth);
objs[8] = income + "元";
objs[18] = income + "元";
dataList.add(objs);
}
GroupQrcode groupQrcode = groupQrcodeDao.getById(qrcodeId);
......@@ -1625,17 +1852,23 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
Long clickNum = 0L;
BigDecimal income = BigDecimal.ZERO;
Long registerNum = 0L;
Long clickUserNum = 0L;
Long pilotFinishUserNum = 0L;
if (null != spaceDTO.getBookId()) {
if (AdPositionEnum.WECHAT_GROUP_MSG.positionCode.equals(spaceDTO.getAdPosition())) {
exposureNum = getExposureNumByGroupQrcodeId(spaceDTO.getQrcodeId(), spaceDTO.getId(), statisMonth);
clickNum = getClickNumByGroupQrcodeId(spaceDTO.getQrcodeId(), spaceDTO.getId(), statisMonth);
income = getIncomeByGroupQrcodeId(spaceDTO.getQrcodeId(), spaceDTO.getId(), statisMonth);
registerNum = bmBiz.getRegisterCountByAdIdQrcodeId(spaceDTO.getId(),statisMonth,spaceDTO.getQrcodeId());
clickUserNum = advertisingClickRecordDao.getClickUserNumByQrcode(spaceDTO.getQrcodeId(),spaceDTO.getId(),statisMonth);
pilotFinishUserNum = advertisingPilotRecordDao.getPilotUserNumByQrcode(spaceDTO.getQrcodeId(),spaceDTO.getId(),statisMonth);
} else {
exposureNum = getExposureNumByAdId(spaceDTO.getId(), spaceDTO.getBookId(), spaceDTO.getAdviserId(), spaceDTO.getChannelId(), statisMonth);
clickNum = getClickNumByAdId(spaceDTO.getId(), spaceDTO.getBookId(), spaceDTO.getAdviserId(), spaceDTO.getChannelId(), statisMonth);
income = getIncomeByAdId(spaceDTO.getId(), spaceDTO.getBookId(), spaceDTO.getChannelId(), statisMonth);
registerNum = bmBiz.getRegisterCountByAdId(spaceDTO.getId(),statisMonth,spaceDTO.getBookId(),spaceDTO.getAdviserId(),spaceDTO.getChannelId());
clickUserNum = advertisingClickRecordDao.getClickUserNumByAdId(spaceDTO.getId(), spaceDTO.getBookId(), spaceDTO.getAdviserId(), spaceDTO.getChannelId(), statisMonth);
pilotFinishUserNum = advertisingPilotRecordDao.getPilotUserNumByAdId(spaceDTO.getId(), spaceDTO.getBookId(), spaceDTO.getAdviserId(), spaceDTO.getChannelId(), statisMonth);
}
}
BigDecimal clickRate = (null == exposureNum || exposureNum.equals(0L)) ? BigDecimal.ZERO :
......@@ -1649,7 +1882,16 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
new BigDecimal(registerNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
spaceDTO.setRegisterNum(registerNum);
spaceDTO.setRegisterRate(registerRate);
//点击人数、完课量完课率
spaceDTO.setClickUserNum(clickUserNum);
BigDecimal pilotFinishRate = (null == clickUserNum || clickUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(pilotFinishUserNum.doubleValue() / clickUserNum).setScale(4, BigDecimal.ROUND_HALF_UP);
spaceDTO.setPilotFinishUserNum(pilotFinishUserNum);
spaceDTO.setPilotFinishRate(pilotFinishRate);
if (!StringUtil.isEmpty(spaceDTO.getSettlementMethod())) {
spaceDTO.setSettlementMethodName(SettlementMethodEnum.getNameByCode(spaceDTO.getSettlementMethod()));
}
// 填充广告位置名称
if (AdPositionEnum.WECHAT_GROUP_MSG.positionCode.equals(spaceDTO.getAdPosition())) {
fillAdpositionName4WechatGroupAd(spaceDTO);
......@@ -2016,6 +2258,14 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
new BigDecimal(registerNum.doubleValue() / clickNum).setScale(4, BigDecimal.ROUND_HALF_UP);
masterDTO.setRegisterNum(registerNum);
masterDTO.setRegisterRate(registerRate);
//点击人数、完课量完课率
Long clickUserNum = advertisingClickRecordDao.getClickUserNumByMasterId(masterDTO.getId());
masterDTO.setClickUserNum(clickUserNum);
Long pilotFinishUserNum = advertisingPilotRecordDao.getPilotUserNumByMasterId(masterDTO.getId());
BigDecimal pilotFinishRate = (null == clickUserNum || clickUserNum.equals(0L)) ? BigDecimal.ZERO :
new BigDecimal(pilotFinishUserNum.doubleValue() / clickUserNum).setScale(4, BigDecimal.ROUND_HALF_UP);
masterDTO.setPilotFinishUserNum(pilotFinishUserNum);
masterDTO.setPilotFinishRate(pilotFinishRate);
}
return pageBean;
}
......@@ -2588,6 +2838,58 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
return page;
}
@Override
@ParamLog("完课量埋点")
public void addPilotTrack(AdvertisingPilotRecord advertisingPilotRecord) {
AdvertisingSpace space = advertisingSpaceDao.getById(advertisingPilotRecord.getAdId());
if (null == space) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "广告位不存在或已删除!");
}
if ("WECHAT_GROUP".equals(advertisingPilotRecord.getFromType())) {
BookGroup bookGroup = bookGroupDao.getById(advertisingPilotRecord.getBookGroupId());
if (null == bookGroup) {
return;
}
advertisingPilotRecord.setBookId(bookGroup.getBookId());
advertisingPilotRecord.setChannelId(bookGroup.getChannelId());
advertisingPilotRecord.setAdviserId(bookGroup.getCreateUser());
}
Long agentId = channelConsr.getParentId(advertisingPilotRecord.getChannelId());
advertisingPilotRecord.setAgentId(agentId);
if (!AdPositionEnum.APP_OR_PRODUCT.positionCode.equals(space.getAdPosition())) {
advertisingPilotRecord.setIsBookGroup(true);
} else {
advertisingPilotRecord.setIsBookGroup(false);
}
advertisingPilotRecordDao.insert(advertisingPilotRecord);
}
@Override
@ParamLog("浏览时长埋点")
public String addBrowseTrack(AdvertisingBrowseRecord advertisingBrowseRecord) {
AdvertisingSpace space = advertisingSpaceDao.getById(advertisingBrowseRecord.getAdId());
if (null == space) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "广告位不存在或已删除!");
}
if (StringUtil.isEmpty(advertisingBrowseRecord.getRecordId())) {
//新增
if ("WECHAT_GROUP".equals(advertisingBrowseRecord.getFromType())) {
BookGroup bookGroup = bookGroupDao.getById(advertisingBrowseRecord.getBookGroupId());
if (null != bookGroup) {
advertisingBrowseRecord.setBookId(bookGroup.getBookId());
advertisingBrowseRecord.setChannelId(bookGroup.getChannelId());
advertisingBrowseRecord.setAdviserId(bookGroup.getCreateUser());
}
}
String uuid = UUID.randomUUID().toString();
advertisingBrowseRecord.setRecordId(uuid);
advertisingBrowseRecordDao.insert(advertisingBrowseRecord);
return uuid;
} else {//修改
advertisingBrowseRecordDao.addBrowseTimesByRecordId(advertisingBrowseRecord.getRecordId(), advertisingBrowseRecord.getBrowseTimes());
return advertisingBrowseRecord.getRecordId();
}
}
@ParamLog("删除定时任务")
private void deleteAdvertisingPlanQuartz(List<AdvertisingPut> advertisingPuts) {
......@@ -2615,4 +2917,44 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
advertisingPutGroup.setUpdateUser(partId);
}
}
@Override
public PageBean advertisingDistributionDetail4WechatGroup(Long qrcodeId, String statisMonth, Long adId, PageParam pageParam) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("qrcodeId", qrcodeId);
paramMap.put("adId", adId);
PageBean pageBean = advertisingDistributionBookDao.listPage(pageParam, paramMap, "advertisingDistributionDetail4WechatGroup");
if (pageBean == null || ListUtils.isEmpty(pageBean.getRecordList())) {
return new PageBean(0, 0, new ArrayList<>());
}
for (Object object : pageBean.getRecordList()) {
if (null == object) {
continue;
}
AdvertisingDistributionDTO distributionDTO = (AdvertisingDistributionDTO) object;
Date distributionTime = distributionDTO.getDistributionTime();
String dateTime = DateUtils.formatDate(distributionTime, DateUtils.DATE_FORMAT_DATETIME);
String timeOnly = DateUtils.formatDate(distributionTime, "HH:mm:ss");
String dateOnly = DateUtils.formatDate(distributionTime, DateUtils.DATE_FORMAT_DATEONLY);
AdvertisingDistributionDTO dto = advertisingPutDao.getPlanByTime(adId, qrcodeId, dateTime, timeOnly, dateOnly);
distributionDTO.setAdId(adId);
if (null != dto) {
distributionDTO.setPutType(dto.getPutType());
distributionDTO.setPutTime(dto.getPutTime());
distributionDTO.setStartTime(dto.getStartTime());
distributionDTO.setEndTime(dto.getEndTime());
distributionDTO.setWeekDay(dto.getWeekDay());
} else {
distributionDTO.setPutType(PutTypeEnum.ONE.value);
distributionDTO.setPutTime(dateTime);
}
}
return pageBean;
}
@Override
public void updateExposureByQrcode(Long qrcodeId, Integer peopleCounts) {
advertisingExposureRecordDao.updateExposureByQrcode(qrcodeId, peopleCounts);
}
}
......@@ -144,7 +144,7 @@ public class BmBizImpl implements BmBiz {
@Override
public void addOptionList(List<AdvertisingBmOption> advertisingBmOptionList, Long adId) {
if (ListUtils.isEmpty(advertisingBmOptionList) || null == adId) {
return;
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "参数有误!");
}
List<Long> optionIds = bmOptionDao.getOptionIdsByAdId(adId);
for (AdvertisingBmOption bmOption : advertisingBmOptionList) {
......@@ -158,7 +158,7 @@ public class BmBizImpl implements BmBiz {
}
if (!ListUtils.isEmpty(optionIds)) {//要删除的选项
bmOptionDao.deleteByIds(optionIds);
for (Long optionId:optionIds){
for (Long optionId : optionIds) {
bmOptionItemDao.deleteByOptionId(optionId);
}
}
......@@ -171,9 +171,8 @@ public class BmBizImpl implements BmBiz {
@Override
@Transactional(rollbackFor = Exception.class)
public Long addOption(AdvertisingBmOption bmOption) throws BizException {
Long adId = bmOption.getAdId();
// 校验参数
if (null == adId || null == bmOption.getItemInputType() || null == bmOption.getItemTitle()) {
if (null == bmOption.getAdId() || StringUtil.isEmpty(bmOption.getItemInputType())
|| StringUtil.isEmpty(bmOption.getItemDataType()) || StringUtil.isEmpty(bmOption.getItemTitle())) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "参数有误!");
}
// 新增选项
......@@ -196,10 +195,11 @@ public class BmBizImpl implements BmBiz {
* @throws BizException
*/
public void addOptionItem(List<AdvertisingBmOptionItem> itemList, Long partyId, Long optionId) throws BizException {
if (itemList != null && itemList.size() > 0) {
if (ListUtils.isEmpty(itemList)) {
return;
}
Long parentId = 0L;
for (int i = 0; i < itemList.size(); i++) {
AdvertisingBmOptionItem item = itemList.get(i);
for (AdvertisingBmOptionItem item : itemList) {
item.setOptionId(optionId);
item.setCreateUser(partyId);
item.setParentId(parentId);
......@@ -210,14 +210,12 @@ public class BmBizImpl implements BmBiz {
bmOptionItemDao.insert(item);
}
}
}
/**
* 根据应用ID获取选项列表信息
* 根据广告ID获取选项列表信息
*/
@Override
public List<AdvertisingBmOption> getByAdId(Long adId)
throws BizException {
public List<AdvertisingBmOption> getByAdId(Long adId) throws BizException {
if (null == adId){
return new ArrayList<>();
}
......@@ -226,24 +224,22 @@ public class BmBizImpl implements BmBiz {
}
/**
* 应用修改选项
* 修改选项
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void modifyOption(AdvertisingBmOption bmOption) throws BizException {
Long adId = bmOption.getAdId();
Long id = bmOption.getId();
Long optionId = bmOption.getId();
// 校验参数
if (adId == null || bmOption.getItemInputType() == null
|| bmOption.getItemTitle() == null || id == null) {
if (null == bmOption.getAdId() || null == optionId || StringUtil.isEmpty(bmOption.getItemInputType())
|| StringUtil.isEmpty(bmOption.getItemDataType()) || StringUtil.isEmpty(bmOption.getItemTitle())) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "参数有误!");
}
// 修改选项
bmOption.setUpdateUser(0L);
bmOptionDao.update(bmOption);
Long optionId = bmOption.getId();
// 删除之前的选项清单
bmOptionItemDao.deleteByOptionId(id);
bmOptionItemDao.deleteByOptionId(optionId);
// 添加选项清单
addOptionItem(bmOption.getOptionItem(), bmOption.getUpdateUser(), optionId);
}
......@@ -516,6 +512,11 @@ public class BmBizImpl implements BmBiz {
@Override
public Long getRegisterUserNumByAdIdQrcodeId(Long qrcodeId, Long adId, String statisMonth) {
return bmRegisterDao.getRegisterUserNumByAdIdQrcodeId(qrcodeId,adId,statisMonth);
return bmRegisterDao.getRegisterUserNumByAdIdQrcodeId(qrcodeId, adId, statisMonth);
}
@Override
public Long getRegisterCountByBookId(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth) {
return bmRegisterDao.getRegisterCountByBookId(bookId, adviserId, channelId, adId, statisMonth);
}
}
package com.pcloud.book.advertising.dao;
import com.pcloud.book.advertising.entity.AdvertisingBrowseRecord;
import com.pcloud.common.core.dao.BaseDao;
/**
* Description 广告位浏览记录数据访问层接口
* @author zhuyajie
* @date 2019/7/11
*/
public interface AdvertisingBrowseRecordDao extends BaseDao<AdvertisingBrowseRecord> {
/**
* 更新浏览时长
* @param recordId
* @param browseTimes
*/
public void addBrowseTimesByRecordId(String recordId, Long browseTimes);
/**
* 查微信群浏览时长
* @param qrcodeId
* @param adId
* @param statisMonth
* @return
*/
Long getBrowseTimesByQrcode(Long qrcodeId, Long adId, String statisMonth);
/**
* 查微信群浏览人数
* @param qrcodeId
* @param adId
* @param statisMonth
* @return
*/
Long getBrowseUserCountByQrcode(Long qrcodeId, Long adId, String statisMonth);
/**
* 查书刊浏览时长
* @param bookId
* @param adviserId
* @param channelId
* @return
*/
Long getBrowseTimesByBook(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth);
/**
* 查书刊浏览人数
* @param bookId
* @param adviserId
* @param channelId
* @return
*/
Long getBrowseUserCountByBook(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth);
}
......@@ -46,4 +46,15 @@ public interface AdvertisingClickRecordDao extends BaseDao<AdvertisingClickRecor
* @param statisMonth @return
*/
Long getClickUserNumByAdId(Long adId, Long bookId, Long adviserId, Long channelId, String statisMonth);
/**
* 书刊点击人数
* @param adId
* @param bookId
* @param adviserId
* @param channelId
* @param statisMonth
* @return
*/
public Long getClickUserNumByBookId(Long adId, Long bookId, Long adviserId, Long channelId, String statisMonth);
}
......@@ -17,4 +17,11 @@ public interface AdvertisingExposureRecordDao extends BaseDao<AdvertisingExposur
* @return
*/
List<AdGroupQrcodeDTO> advertisingWechatGroupRankTop();
/**
* 更新之前为0的曝光量
* @param qrcodeId
* @param peopleCounts
*/
void updateExposureByQrcode(Long qrcodeId, Integer peopleCounts);
}
package com.pcloud.book.advertising.dao;
import com.pcloud.book.advertising.dto.WechatGroupClickUserDTO;
import com.pcloud.book.advertising.entity.AdvertisingClickRecord;
import com.pcloud.book.advertising.entity.AdvertisingPilotRecord;
import com.pcloud.common.core.dao.BaseDao;
import java.util.List;
import java.util.Map;
/**
* Description 广告位点击记录数据访问层接口
* @author PENG
* @date 2019/2/28
*/
public interface AdvertisingPilotRecordDao extends BaseDao<AdvertisingPilotRecord> {
/**
* 获得试听人数
* @param masterId
* @return
*/
public Long getPilotUserNumByMasterId(Long masterId);
/**
* 微信群完课量
* @param qrcodeId
* @param adId
* @param statisMonth
* @return
*/
Long getPilotUserNumByQrcode(Long qrcodeId, Long adId, String statisMonth);
/**
* 广告位完课量
* @param adId
* @param bookId
* @param adviserId
* @param channelId
* @param statisMonth
* @return
*/
Long getPilotUserNumByAdId(Long adId, Long bookId, Long adviserId, Long channelId, String statisMonth);
/**
* 书刊完课量
* @param bookId
* @param adviserId
* @param channelId
* @return
*/
Long getPilotUserNumByBookId(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth);
}
package com.pcloud.book.advertising.dao;
import com.pcloud.book.advertising.dto.AdvertisingDistributionDTO;
import com.pcloud.book.advertising.entity.AdvertisingPut;
import com.pcloud.common.core.dao.BaseDao;
......@@ -22,4 +23,14 @@ public interface AdvertisingPutDao extends BaseDao<AdvertisingPut> {
* 根据计划id结合查询
*/
List<AdvertisingPut> getListByPlanIds(List<Long> planIds);
/**
* 根据时间查发送计划
* @param adId
* @param qrcodeId
* @param dateTime
* @param timeOnly
* @return
*/
public AdvertisingDistributionDTO getPlanByTime(Long adId, Long qrcodeId, String dateTime, String timeOnly, String dateOnly);
}
......@@ -73,4 +73,13 @@ public interface BmRegisterDao extends BaseDao<AdvertisingBmRegister> {
* @return
*/
List<BmRegisterDTO> getRegisterInfoListByAdId(Long adId, String statisMonth, Long bookId, Long adviserId, Long channelId);
/**
* 获取书刊报名次数
* @param bookId
* @param adviserId
* @param channelId
* @return
*/
public Long getRegisterCountByBookId(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth);
}
package com.pcloud.book.advertising.dao.impl;
import com.pcloud.book.advertising.dao.AdvertisingBrowseRecordDao;
import com.pcloud.book.advertising.entity.AdvertisingBrowseRecord;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* @描述:浏览记录
* @作者:zhuyajie
* @创建时间:17:20 2019/7/11
* @版本:1.0
*/
@Component("advertisingBrowseRecordDao")
public class AdvertisingBrowseRecordDaoImpl extends BaseDaoImpl<AdvertisingBrowseRecord> implements AdvertisingBrowseRecordDao {
@Override
public void addBrowseTimesByRecordId(String recordId, Long browseTimes) {
Map<String, Object> map = new HashMap<>();
map.put("recordId", recordId);
map.put("browseTimes", browseTimes);
getSessionTemplate().update(getStatement("addBrowseTimesByRecordId"), map);
}
@Override
public Long getBrowseTimesByQrcode(Long qrcodeId, Long adId, String statisMonth) {
Map<String, Object> map = new HashMap<>();
map.put("qrcodeId", qrcodeId);
map.put("adId", adId);
map.put("statisMonth", statisMonth);
return getSessionTemplate().selectOne(getStatement("getBrowseTimesByQrcode"), map);
}
@Override
public Long getBrowseUserCountByQrcode(Long qrcodeId, Long adId, String statisMonth) {
Map<String, Object> map = new HashMap<>();
map.put("qrcodeId", qrcodeId);
map.put("adId", adId);
map.put("statisMonth", statisMonth);
return getSessionTemplate().selectOne(getStatement("getBrowseUserCountByQrcode"), map);
}
@Override
public Long getBrowseTimesByBook(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("bookId", bookId);
paramMap.put("adviserId", adviserId);
paramMap.put("channelId", channelId);
paramMap.put("adId", adId);
paramMap.put("statisMonth", statisMonth);
return getSessionTemplate().selectOne(getStatement("getBrowseTimesByBook"), paramMap);
}
@Override
public Long getBrowseUserCountByBook(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("bookId", bookId);
paramMap.put("adviserId", adviserId);
paramMap.put("channelId", channelId);
paramMap.put("adId", adId);
paramMap.put("statisMonth", statisMonth);
return getSessionTemplate().selectOne(getStatement("getBrowseUserCountByBook"), paramMap);
}
}
......@@ -48,10 +48,21 @@ public class AdvertisingClickRecordDaoImpl extends BaseDaoImpl<AdvertisingClickR
public Long getClickUserNumByAdId(Long adId, Long bookId, Long adviserId, Long channelId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("adId", adId);
paramMap.put("statisMonth", statisMonth);
paramMap.put("bookId", bookId);
paramMap.put("adviserId", adviserId);
paramMap.put("channelId", channelId);
paramMap.put("statisMonth", statisMonth);
return getSessionTemplate().selectOne(getStatement("getClickUserNumByAdId"), paramMap);
}
@Override
public Long getClickUserNumByBookId(Long adId, Long bookId, Long adviserId, Long channelId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("adId", adId);
paramMap.put("bookId", bookId);
paramMap.put("adviserId", adviserId);
paramMap.put("channelId", channelId);
paramMap.put("statisMonth", statisMonth);
return getSessionTemplate().selectOne(getStatement("getClickUserNumByBookId"), paramMap);
}
}
package com.pcloud.book.advertising.dao.impl;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.pcloud.book.advertising.dao.AdvertisingExposureRecordDao;
import com.pcloud.book.advertising.entity.AdvertisingExposureRecord;
import com.pcloud.book.group.dto.AdGroupQrcodeDTO;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Description 广告位曝光记录数据访问层接口实现类
* @author PENG
......@@ -22,4 +26,12 @@ public class AdvertisingExposureRecordDaoImpl extends BaseDaoImpl<AdvertisingExp
public List<AdGroupQrcodeDTO> advertisingWechatGroupRankTop() {
return super.getSqlSession().selectList(getStatement("advertisingWechatGroupRankTop"));
}
@Override
public void updateExposureByQrcode(Long qrcodeId, Integer peopleCounts) {
Map<String, Object> map = new HashMap<>();
map.put("fromId", qrcodeId);
map.put("count", peopleCounts);
getSessionTemplate().update(getStatement("updateExposureByQrcode"), map);
}
}
package com.pcloud.book.advertising.dao.impl;
import com.pcloud.book.advertising.dao.AdvertisingClickRecordDao;
import com.pcloud.book.advertising.dao.AdvertisingPilotRecordDao;
import com.pcloud.book.advertising.dto.WechatGroupClickUserDTO;
import com.pcloud.book.advertising.entity.AdvertisingClickRecord;
import com.pcloud.book.advertising.entity.AdvertisingPilotRecord;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Description 广告位试听完成记录数据访问层接口实现类
*/
@Repository("advertisingPilotRecordDao")
public class AdvertisingPilotRecordDaoImpl extends BaseDaoImpl<AdvertisingPilotRecord> implements AdvertisingPilotRecordDao {
@Override
public Long getPilotUserNumByMasterId(Long masterId) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("masterId", masterId);
Long userNum = super.getSqlSession().selectOne(getStatement("getPilotUserNumByMasterId"),paramMap);
return null == userNum ? 0L : userNum;
}
@Override
public Long getPilotUserNumByQrcode(Long qrcodeId, Long adId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("qrcodeId", qrcodeId);
paramMap.put("adId", adId);
paramMap.put("statisMonth", statisMonth);
return getSessionTemplate().selectOne(getStatement("getPilotUserNumByQrcode"), paramMap);
}
@Override
public Long getPilotUserNumByAdId(Long adId, Long bookId, Long adviserId, Long channelId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("adId", adId);
paramMap.put("bookId", bookId);
paramMap.put("adviserId", adviserId);
paramMap.put("channelId", channelId);
paramMap.put("statisMonth", statisMonth);
return getSessionTemplate().selectOne(getStatement("getPilotUserNumByAdId"), paramMap);
}
@Override
public Long getPilotUserNumByBookId(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("bookId", bookId);
paramMap.put("adviserId", adviserId);
paramMap.put("channelId", channelId);
paramMap.put("adId", adId);
paramMap.put("statisMonth", statisMonth);
return getSessionTemplate().selectOne(getStatement("getPilotUserNumByBookId"), paramMap);
}
}
package com.pcloud.book.advertising.dao.impl;
import com.pcloud.book.advertising.dao.AdvertisingPutDao;
import com.pcloud.book.advertising.dto.AdvertisingDistributionDTO;
import com.pcloud.book.advertising.entity.AdvertisingPut;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.HashMap;
......@@ -40,4 +42,15 @@ public class AdvertisingPutDaoImpl extends BaseDaoImpl<AdvertisingPut> implement
map.put("planIds", planIds);
return super.getSqlSession().selectList(getStatement("getListByPlanIds"), map);
}
@Override
public AdvertisingDistributionDTO getPlanByTime(Long adId, Long qrcodeId, String dateTime, String timeOnly, String dateOnly) {
Map<String, Object> map = new HashMap<>();
map.put("adId", adId);
map.put("qrcodeId", qrcodeId);
map.put("dateTime", dateTime);
map.put("timeOnly", timeOnly);
map.put("dateOnly", dateOnly);
return getSessionTemplate().selectOne(getStatement("getPlanByTime"), map);
}
}
......@@ -78,5 +78,16 @@ public class BmRegisterDaoImpl extends BaseDaoImpl<AdvertisingBmRegister> implem
return getSessionTemplate().selectList(getStatement("getRegisterInfoListByAdId"),map);
}
@Override
public Long getRegisterCountByBookId(Long bookId, Long adviserId, Long channelId, Long adId, String statisMonth) {
Map<String, Object> map = new HashMap<>();
map.put("bookId", bookId);
map.put("adviserId", adviserId);
map.put("channelId", channelId);
map.put("adId", adId);
map.put("statisMonth", statisMonth);
return getSessionTemplate().selectOne(getStatement("getRegisterCountByBookId"), map);
}
}
package com.pcloud.book.advertising.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.pcloud.common.dto.BaseDto;
import java.util.Date;
/**
* @描述:投放详情
* @作者:zhuyajie
* @创建时间:9:15 2019/7/17
* @版本:1.0
*/
public class AdvertisingDistributionDTO extends BaseDto{
private Long adId;
/**
* 投放时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date distributionTime;
/**
* 投放类型1:单次发送 2:每天发送 3:每周发送
*/
private Integer putType;
/**
* 计划投放开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date startTime;
/**
* 计划投放结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
/**
* 计划投放时间
*/
private String putTime;
/**
* 周几
*/
private Integer weekDay;
public Long getAdId() {
return adId;
}
public void setAdId(Long adId) {
this.adId = adId;
}
public Date getDistributionTime() {
return distributionTime;
}
public void setDistributionTime(Date distributionTime) {
this.distributionTime = distributionTime;
}
public Integer getPutType() {
return putType;
}
public void setPutType(Integer putType) {
this.putType = putType;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public String getPutTime() {
return putTime;
}
public void setPutTime(String putTime) {
this.putTime = putTime;
}
public Integer getWeekDay() {
return weekDay;
}
public void setWeekDay(Integer weekDay) {
this.weekDay = weekDay;
}
@Override
public String toString() {
return "AdvertisingDistributionDTO{" +
"adId=" + adId +
", distributionTime=" + distributionTime +
", putType=" + putType +
", startTime=" + startTime +
", endTime=" + endTime +
", putTime=" + putTime +
", weekDay=" + weekDay +
'}';
}
}
......@@ -70,6 +70,20 @@ public class AdvertisingMasterDTO extends BaseDto {
*/
private BigDecimal registerRate;
/**
* 点击用户数(独立访客数)
*/
private Long clickUserNum;
/**
* 试听完成人数(完课量)
*/
private Long pilotFinishUserNum;
/**
* 试听完成比率(完课率)
*/
private BigDecimal pilotFinishRate;
public Long getId() {
return id;
......@@ -169,6 +183,30 @@ public class AdvertisingMasterDTO extends BaseDto {
this.registerRate = registerRate;
}
public Long getClickUserNum() {
return clickUserNum;
}
public void setClickUserNum(Long clickUserNum) {
this.clickUserNum = clickUserNum;
}
public Long getPilotFinishUserNum() {
return pilotFinishUserNum;
}
public void setPilotFinishUserNum(Long pilotFinishUserNum) {
this.pilotFinishUserNum = pilotFinishUserNum;
}
public BigDecimal getPilotFinishRate() {
return pilotFinishRate;
}
public void setPilotFinishRate(BigDecimal pilotFinishRate) {
this.pilotFinishRate = pilotFinishRate;
}
@Override
public String toString() {
return "AdvertisingMasterDTO{" +
......@@ -184,6 +222,9 @@ public class AdvertisingMasterDTO extends BaseDto {
", totalIncome=" + totalIncome +
", registerNum=" + registerNum +
", registerRate=" + registerRate +
", clickUserNum=" + clickUserNum +
", pilotFinishUserNum=" + pilotFinishUserNum +
", pilotFinishRate=" + pilotFinishRate +
'}';
}
}
\ No newline at end of file
......@@ -285,6 +285,33 @@ public class AdvertisingSpaceDTO extends BaseDto {
*/
private Long adDetailFileDuration;
/**
* 试听完成人数(完课量)
*/
private Long pilotFinishUserNum;
/**
* 试听完成比率(完课率)
*/
private BigDecimal pilotFinishRate;
/**
* 平均浏览时长
*/
private BigDecimal avgBrowseTimes;
/**
* 跳出量
*/
private Long outNum;
/**
* 跳出率
*/
private BigDecimal outRate;
/**
* 投放次数
*/
private Integer distributionNum;
public Long getId() {
return id;
}
......@@ -744,6 +771,54 @@ public class AdvertisingSpaceDTO extends BaseDto {
this.adDetailFileDuration = adDetailFileDuration;
}
public Long getPilotFinishUserNum() {
return pilotFinishUserNum;
}
public void setPilotFinishUserNum(Long pilotFinishUserNum) {
this.pilotFinishUserNum = pilotFinishUserNum;
}
public BigDecimal getPilotFinishRate() {
return pilotFinishRate;
}
public void setPilotFinishRate(BigDecimal pilotFinishRate) {
this.pilotFinishRate = pilotFinishRate;
}
public BigDecimal getAvgBrowseTimes() {
return avgBrowseTimes;
}
public void setAvgBrowseTimes(BigDecimal avgBrowseTimes) {
this.avgBrowseTimes = avgBrowseTimes;
}
public Long getOutNum() {
return outNum;
}
public void setOutNum(Long outNum) {
this.outNum = outNum;
}
public BigDecimal getOutRate() {
return outRate;
}
public void setOutRate(BigDecimal outRate) {
this.outRate = outRate;
}
public Integer getDistributionNum() {
return distributionNum;
}
public void setDistributionNum(Integer distributionNum) {
this.distributionNum = distributionNum;
}
@Override
public String toString() {
return "AdvertisingSpaceDTO{" +
......@@ -804,6 +879,12 @@ public class AdvertisingSpaceDTO extends BaseDto {
", adDetailFileSize=" + adDetailFileSize +
", adDetailFileName='" + adDetailFileName + '\'' +
", adDetailFileDuration=" + adDetailFileDuration +
", pilotFinishUserNum=" + pilotFinishUserNum +
", pilotFinishRate=" + pilotFinishRate +
", avgBrowseTimes=" + avgBrowseTimes +
", outNum=" + outNum +
", outRate=" + outRate +
", distributionNum=" + distributionNum +
'}';
}
}
\ No newline at end of file
package com.pcloud.book.advertising.entity;
import com.pcloud.common.entity.BaseEntity;
import java.util.Date;
/**完整试听记录
* @author PENG
*/
public class AdvertisingBrowseRecord extends BaseEntity {
private static final long serialVersionUID = 1236769572623516883L;
/**
* 唯一标识
*/
private Long id;
/**
* 广告位ID
*/
private Long adId;
/**
* 书刊ID
*/
private Long bookId;
/**
* 二维码ID
*/
private Long sceneId;
/**
* 编辑ID
*/
private Long adviserId;
/**
* 运营ID
*/
private Long channelId;
/**
* 公众号ID
*/
private Long officialAccountId;
/**
* 来源类型
*/
private String fromType;
/**
* 来源ID
*/
private Long fromId;
/**
* 读者ID
*/
private Long wechatUserId;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建日期
*/
private Date createDay;
/**
* 创建月份
*/
private String createMonth;
/**
* 社群码ID
*/
private Long bookGroupId;
/**
* 浏览时长
*/
private Long browseTimes;
/**
* 临时标识
*/
private String tempMark;
/**
* 唯一标识
*/
private String recordId;
@Override
public Long getId() {
return id;
}
@Override
public void setId(Long id) {
this.id = id;
}
public Long getAdId() {
return adId;
}
public void setAdId(Long adId) {
this.adId = adId;
}
public Long getBookId() {
return bookId;
}
public void setBookId(Long bookId) {
this.bookId = bookId;
}
public Long getAdviserId() {
return adviserId;
}
public void setAdviserId(Long adviserId) {
this.adviserId = adviserId;
}
public Long getChannelId() {
return channelId;
}
public void setChannelId(Long channelId) {
this.channelId = channelId;
}
public Long getOfficialAccountId() {
return officialAccountId;
}
public void setOfficialAccountId(Long officialAccountId) {
this.officialAccountId = officialAccountId;
}
public String getFromType() {
return fromType;
}
public void setFromType(String fromType) {
this.fromType = fromType;
}
public Long getFromId() {
return fromId;
}
public void setFromId(Long fromId) {
this.fromId = fromId;
}
public Long getWechatUserId() {
return wechatUserId;
}
public void setWechatUserId(Long wechatUserId) {
this.wechatUserId = wechatUserId;
}
@Override
public Date getCreateTime() {
return createTime;
}
@Override
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getCreateDay() {
return createDay;
}
public void setCreateDay(Date createDay) {
this.createDay = createDay;
}
public Long getSceneId() {
return sceneId;
}
public void setSceneId(Long sceneId) {
this.sceneId = sceneId;
}
public String getCreateMonth() {
return createMonth;
}
public void setCreateMonth(String createMonth) {
this.createMonth = createMonth;
}
public Long getBookGroupId() {
return bookGroupId;
}
public void setBookGroupId(Long bookGroupId) {
this.bookGroupId = bookGroupId;
}
public Long getBrowseTimes() {
return browseTimes;
}
public void setBrowseTimes(Long browseTimes) {
this.browseTimes = browseTimes;
}
public String getTempMark() {
return tempMark;
}
public void setTempMark(String tempMark) {
this.tempMark = tempMark;
}
public String getRecordId() {
return recordId;
}
public void setRecordId(String recordId) {
this.recordId = recordId;
}
@Override
public String toString() {
return "AdvertisingBrowseRecord{" +
"id=" + id +
", adId=" + adId +
", bookId=" + bookId +
", sceneId=" + sceneId +
", adviserId=" + adviserId +
", channelId=" + channelId +
", officialAccountId=" + officialAccountId +
", fromType='" + fromType + '\'' +
", fromId=" + fromId +
", wechatUserId=" + wechatUserId +
", createTime=" + createTime +
", createDay=" + createDay +
", createMonth='" + createMonth + '\'' +
", bookGroupId=" + bookGroupId +
", browseTimes=" + browseTimes +
", tempMark='" + tempMark + '\'' +
", recordId='" + recordId + '\'' +
'}';
}
}
\ No newline at end of file
package com.pcloud.book.advertising.entity;
import com.pcloud.common.entity.BaseEntity;
import java.util.Date;
/**完整试听记录
* @author PENG
*/
public class AdvertisingPilotRecord extends BaseEntity {
private static final long serialVersionUID = 1236769572623516883L;
/**
* 唯一标识
*/
private Long id;
/**
* 广告位ID
*/
private Long adId;
/**
* 书刊ID
*/
private Long bookId;
/**
* 是否是社群书
*/
private Boolean isBookGroup;
/**
* 二维码ID
*/
private Long sceneId;
/**
* 编辑ID
*/
private Long adviserId;
/**
*出版社ID
*/
private Long agentId;
/**
* 运营ID
*/
private Long channelId;
/**
* 公众号ID
*/
private Long officialAccountId;
/**
* 来源类型
*/
private String fromType;
/**
* 来源ID
*/
private Long fromId;
/**
* 读者ID
*/
private Long wechatUserId;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建日期
*/
private Date createDay;
/**
* 创建月份
*/
private String createMonth;
/**
* 社群码ID
*/
private Long bookGroupId;
@Override
public Long getId() {
return id;
}
@Override
public void setId(Long id) {
this.id = id;
}
public Long getAdId() {
return adId;
}
public void setAdId(Long adId) {
this.adId = adId;
}
public Long getBookId() {
return bookId;
}
public void setBookId(Long bookId) {
this.bookId = bookId;
}
public Boolean getIsBookGroup() {
return isBookGroup;
}
public void setIsBookGroup(Boolean isBookGroup) {
this.isBookGroup = isBookGroup;
}
public Long getAdviserId() {
return adviserId;
}
public void setAdviserId(Long adviserId) {
this.adviserId = adviserId;
}
public Long getAgentId() {
return agentId;
}
public void setAgentId(Long agentId) {
this.agentId = agentId;
}
public Long getChannelId() {
return channelId;
}
public void setChannelId(Long channelId) {
this.channelId = channelId;
}
public Long getOfficialAccountId() {
return officialAccountId;
}
public void setOfficialAccountId(Long officialAccountId) {
this.officialAccountId = officialAccountId;
}
public String getFromType() {
return fromType;
}
public void setFromType(String fromType) {
this.fromType = fromType;
}
public Long getFromId() {
return fromId;
}
public void setFromId(Long fromId) {
this.fromId = fromId;
}
public Long getWechatUserId() {
return wechatUserId;
}
public void setWechatUserId(Long wechatUserId) {
this.wechatUserId = wechatUserId;
}
@Override
public Date getCreateTime() {
return createTime;
}
@Override
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getCreateDay() {
return createDay;
}
public void setCreateDay(Date createDay) {
this.createDay = createDay;
}
public Long getSceneId() {
return sceneId;
}
public void setSceneId(Long sceneId) {
this.sceneId = sceneId;
}
public String getCreateMonth() {
return createMonth;
}
public void setCreateMonth(String createMonth) {
this.createMonth = createMonth;
}
public Long getBookGroupId() {
return bookGroupId;
}
public void setBookGroupId(Long bookGroupId) {
this.bookGroupId = bookGroupId;
}
@Override
public String toString() {
return "AdvertisingClickRecord{" +
"id=" + id +
", adId=" + adId +
", bookId=" + bookId +
", isBookGroup=" + isBookGroup +
", sceneId=" + sceneId +
", adviserId=" + adviserId +
", agentId=" + agentId +
", channelId=" + channelId +
", officialAccountId=" + officialAccountId +
", fromType='" + fromType + '\'' +
", fromId=" + fromId +
", wechatUserId=" + wechatUserId +
", createTime=" + createTime +
", createDay=" + createDay +
", createMonth='" + createMonth + '\'' +
", bookGroupId=" + bookGroupId +
"} " + super.toString();
}
}
\ No newline at end of file
......@@ -895,4 +895,62 @@ public interface AdvertisingSpaceFacade {
@RequestParam("currentPage") Integer currentPage,
@RequestParam("numPerPage") Integer numPerPage
) throws PermissionException, BizException, JsonParseException;
/**
* 完课量埋点
* @param userInfo 用户身份信息
* @param advertisingPilotRecord 广告位试听实体
* @return
* @throws PermissionException
* @throws BizException
* @throws JsonParseException
*/
@ApiOperation(value = " 完课量埋点", httpMethod = "POST")
@RequestMapping(value = "addPilotTrack", method = RequestMethod.POST)
ResponseDto<?> addPilotTrack(@CookieValue("userInfo") String userInfo, @RequestBody @ApiParam AdvertisingPilotRecord advertisingPilotRecord)
throws PermissionException, BizException, JsonParseException;
/**
* 浏览时长埋点
* @param userInfo
* @param advertisingBrowseRecord
* @return
* @throws PermissionException
* @throws BizException
* @throws JsonParseException
*/
@ApiOperation(value = " 浏览时长埋点", httpMethod = "POST")
@RequestMapping(value = "addBrowseTrack", method = RequestMethod.POST)
ResponseDto<?> addBrowseTrack(@CookieValue("userInfo") String userInfo, @RequestBody @ApiParam AdvertisingBrowseRecord advertisingBrowseRecord)
throws PermissionException, BizException, JsonParseException;
/**
* 微信群广告位明细-投放详情
* @param token
* @param qrcodeId
* @param statisMonth
* @param currentPage
* @param numPerPage
* @param adId
* @return
* @throws PermissionException
* @throws BizException
* @throws JsonParseException
*/
@ApiOperation(value = "微信群广告位明细-投放详情", httpMethod = "GET")
@ApiImplicitParams({
@ApiImplicitParam(name = "token", value = "token", dataType = "string", paramType = "header"),
@ApiImplicitParam(name = "qrcodeId", value = "微信群ID", dataType = "Long", paramType = "query"),
@ApiImplicitParam(name = "statisMonth", value = "统计月份", dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "currentPage", value = "当前页", dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "numPerPage", value = "每页条数", dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "adId", value = "广告id", dataType = "Long", paramType = "query")
})
@RequestMapping(value = "advertisingDistributionDetail4WechatGroup", method = RequestMethod.GET)
ResponseDto<?> advertisingDistributionDetail4WechatGroup(
@RequestHeader("token") String token, @RequestParam(value = "qrcodeId", required = false) Long qrcodeId,
@RequestParam(value = "statisMonth", required = false) String statisMonth, @RequestParam(value = "currentPage", required = false) Integer currentPage,
@RequestParam(value = "numPerPage", required = false) Integer numPerPage, @RequestParam(value = "adId", required = false) Long adId) throws PermissionException, BizException, JsonParseException;
}
......@@ -8,6 +8,7 @@ import com.pcloud.book.advertising.facade.AdvertisingSpaceFacade;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.page.PageBean;
import com.pcloud.common.page.PageParam;
import com.pcloud.common.permission.PermissionException;
import com.pcloud.common.utils.SessionUtil;
......@@ -781,4 +782,102 @@ public class AdvertisingSpaceFacadeImpl implements AdvertisingSpaceFacade {
}
return new ResponseDto<>(advertisingSpaceBiz.getAdvertisingPlanList(keyword,partyId,currentPage,numPerPage));
}
/**
* 完课量埋点
*
* @param userInfo 用户身份信息
* @param advertisingPilotRecord 广告位试听实体
*/
@Override
@RequestMapping(value = "addPilotTrack", method = RequestMethod.POST)
public ResponseDto<?> addPilotTrack(@CookieValue("userInfo")String userInfo, @RequestBody @ApiParam AdvertisingPilotRecord advertisingPilotRecord) throws PermissionException, BizException, JsonParseException {
if (null == advertisingPilotRecord || null == advertisingPilotRecord.getAdId()) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!");
}
if (StringUtil.isEmpty(advertisingPilotRecord.getFromType()) || null == advertisingPilotRecord.getFromId()) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!");
}
Long sceneId = Cookie.getId(userInfo, Cookie._SCENE_ID);
Long adviserId = Cookie.getId(userInfo, Cookie._ADVISER_ID);
Long channelId = Cookie.getId(userInfo, Cookie._CHANNEL_ID);
Long officialAccountsId = Cookie.getId(userInfo, Cookie._OFFICIAL_ACCOUNTS_ID);
Long wechatUserId = Cookie.getId(userInfo, Cookie._WECHAT_USER_ID);
Long bookGroupId = Cookie.getId(userInfo, Cookie.BOOK_GROUP_ID);
if ((null == advertisingPilotRecord.getBookId() && !"WECHAT_GROUP".equals(advertisingPilotRecord.getFromType()))
|| (null == bookGroupId && "WECHAT_GROUP".equals(advertisingPilotRecord.getFromType()))) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!");
}
advertisingPilotRecord.setBookGroupId(bookGroupId);
advertisingPilotRecord.setSceneId(sceneId);
advertisingPilotRecord.setAdviserId(adviserId);
advertisingPilotRecord.setChannelId(channelId);
advertisingPilotRecord.setOfficialAccountId(officialAccountsId);
advertisingPilotRecord.setWechatUserId(wechatUserId);
advertisingSpaceBiz.addPilotTrack(advertisingPilotRecord);
return new ResponseDto<>();
}
/**
* 浏览时长埋点
* @param userInfo
* @param advertisingBrowseRecord
* @return
* @throws PermissionException
* @throws BizException
* @throws JsonParseException
*/
@Override
@RequestMapping(value = "addBrowseTrack", method = RequestMethod.POST)
public ResponseDto<?> addBrowseTrack(@CookieValue("userInfo") String userInfo, @RequestBody @ApiParam AdvertisingBrowseRecord advertisingBrowseRecord)
throws PermissionException, BizException, JsonParseException{
if (null == advertisingBrowseRecord || null == advertisingBrowseRecord.getAdId()) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!");
}
if (StringUtil.isEmpty(advertisingBrowseRecord.getFromType()) || null == advertisingBrowseRecord.getFromId()) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!");
}
Long sceneId = Cookie.getId(userInfo, Cookie._SCENE_ID);
Long adviserId = Cookie.getId(userInfo, Cookie._ADVISER_ID);
Long channelId = Cookie.getId(userInfo, Cookie._CHANNEL_ID);
Long officialAccountsId = Cookie.getId(userInfo, Cookie._OFFICIAL_ACCOUNTS_ID);
Long wechatUserId = Cookie.getId(userInfo, Cookie._WECHAT_USER_ID);
Long bookGroupId = Cookie.getId(userInfo, Cookie.BOOK_GROUP_ID);
if ((null == advertisingBrowseRecord.getBookId() && !"WECHAT_GROUP".equals(advertisingBrowseRecord.getFromType()))
|| (null == bookGroupId && "WECHAT_GROUP".equals(advertisingBrowseRecord.getFromType()))) {
throw new BookBizException(BookBizException.PARAM_IS_NULL, "参数有误!");
}
if (null == advertisingBrowseRecord.getBrowseTimes()){
throw new BookBizException(BookBizException.PARAM_IS_NULL, "缺少浏览时长!");
}
advertisingBrowseRecord.setBookGroupId(bookGroupId);
advertisingBrowseRecord.setSceneId(sceneId);
advertisingBrowseRecord.setAdviserId(adviserId);
advertisingBrowseRecord.setChannelId(channelId);
advertisingBrowseRecord.setOfficialAccountId(officialAccountsId);
advertisingBrowseRecord.setWechatUserId(wechatUserId);
return new ResponseDto<>(advertisingSpaceBiz.addBrowseTrack(advertisingBrowseRecord));
}
/**
* 微信群广告位明细-投放详情
*/
@Override
@RequestMapping(value = "advertisingDistributionDetail4WechatGroup", method = RequestMethod.GET)
public ResponseDto<?> advertisingDistributionDetail4WechatGroup(
@RequestHeader("token") String token, @RequestParam(value = "qrcodeId", required = false) Long qrcodeId,
@RequestParam(value = "statisMonth", required = false) String statisMonth, @RequestParam(value = "currentPage", required = false) Integer currentPage,
@RequestParam(value = "numPerPage", required = false) Integer numPerPage, @RequestParam(value = "adId", required = false) Long adId) throws PermissionException, BizException, JsonParseException {
if (null == qrcodeId || null == adId) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "参数有误!");
}
if (currentPage == null || numPerPage == null || currentPage < 0 || numPerPage < 0) {
throw BookBizException.PAGE_PARAM_DELETION;
}
SessionUtil.getToken4Redis(token);
PageBean pageBean = advertisingSpaceBiz.advertisingDistributionDetail4WechatGroup(qrcodeId, statisMonth, adId, new PageParam(currentPage, numPerPage));
return new ResponseDto<>(pageBean);
}
}
......@@ -136,7 +136,7 @@ public class WechatGroupConsr {
@ParamLog(value = "活跃人数与总发言数", isBefore = false, isAfterReturn = false)
public Map<Long, GroupChatCountDTO> getChatCountByGroup(List<Long> groupQrcodeIds, Long bookGroupId) throws BizException {
if (ListUtils.isEmpty(groupQrcodeIds) || bookGroupId == null) {
if (ListUtils.isEmpty(groupQrcodeIds)) {
return null;
}
try {
......
......@@ -96,7 +96,7 @@ public interface GroupQrcodeBiz {
* @Desr:更新用户数
* @Date:2019/5/28 11:47
*/
void updateUserNumber(String weixinGroupId);
void updateUserNumber(String weixinGroupId, String wxUserId);
/**
* 群信息及广告信息
......
......@@ -29,6 +29,7 @@ import com.pcloud.book.group.entity.BookGroupClassify;
import com.pcloud.book.group.entity.BookQrcodeUser;
import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.book.group.enums.RankTypeEnum;
import com.pcloud.book.group.set.GroupSet;
import com.pcloud.book.group.tools.SendWeixinRequestTools;
import com.pcloud.book.group.vo.*;
import com.pcloud.common.core.aspect.ParamLog;
......@@ -113,6 +114,8 @@ public class BookGroupClassifyBizImpl implements BookGroupClassifyBiz {
private GroupAnnouncementBiz groupAnnouncementBiz;
@Autowired
private LabelService labelService;
@Autowired
private GroupSet groupSet;
@Override
@ParamLog("新增分类")
......@@ -309,6 +312,8 @@ public class BookGroupClassifyBizImpl implements BookGroupClassifyBiz {
groupQrcodeBiz.deleteByClassifyId(classifyId);
//删除此商品对应规格
deleteSpecification(classifyDTO.getProductId(), classifyDTO.getChannelId(), classifyDTO.getProductSpecId());
//发送topic
groupSet.sendGroupClassifyDeleteTopic(classifyId);
}
@Override
......
......@@ -289,13 +289,18 @@ public class GroupQrcodeBizImpl implements GroupQrcodeBiz {
}
@Override
public void updateUserNumber(String weixinGroupId) {
String robotIdByGroupId = wechatGroupConsr.getRobotIdByGroupId(weixinGroupId);
if(robotIdByGroupId != null){
Integer peopleCounts = WxGroupSDK.getPeopleCounts(weixinGroupId, robotIdByGroupId);
public void updateUserNumber(String weixinGroupId, String wxUserId) {
if (StringUtil.isEmpty(weixinGroupId) || StringUtil.isEmpty(wxUserId)) {
return;
}
Integer peopleCounts = WxGroupSDK.getPeopleCounts(weixinGroupId,wxUserId);
if (peopleCounts != null) {
//更新用户数
groupQrcodeDao.updateUserNumber(weixinGroupId, peopleCounts);
GroupQrcode groupQrcode = groupQrcodeDao.getGroupQrcodeByGroupId(weixinGroupId);
if (null != groupQrcode) {
//更新广告曝光量
advertisingSpaceBiz.updateExposureByQrcode(groupQrcode.getId(), peopleCounts);
}
}
}
......
......@@ -118,6 +118,36 @@ public class AdGroupQrcodeDTO implements Serializable {
* 报名率
*/
private BigDecimal registerRate;
/**
* 活跃度
*/
private Integer activeCount;
/**
* 群人数
*/
private Integer userNumber;
/**
* 试听完成人数(完课量)
*/
private Long pilotFinishUserNum;
/**
* 试听完成比率(完课率)
*/
private BigDecimal pilotFinishRate;
/**
* 平均浏览时长
*/
private BigDecimal avgBrowseTimes;
/**
* 跳出量
*/
private Long outNum;
/**
* 跳出率
*/
private BigDecimal outRate;
public Long getGroupQrcodeId() {
return groupQrcodeId;
......@@ -296,6 +326,62 @@ public class AdGroupQrcodeDTO implements Serializable {
this.registerRate = registerRate;
}
public Integer getActiveCount() {
return activeCount;
}
public void setActiveCount(Integer activeCount) {
this.activeCount = activeCount;
}
public Integer getUserNumber() {
return userNumber;
}
public void setUserNumber(Integer userNumber) {
this.userNumber = userNumber;
}
public Long getPilotFinishUserNum() {
return pilotFinishUserNum;
}
public void setPilotFinishUserNum(Long pilotFinishUserNum) {
this.pilotFinishUserNum = pilotFinishUserNum;
}
public BigDecimal getPilotFinishRate() {
return pilotFinishRate;
}
public void setPilotFinishRate(BigDecimal pilotFinishRate) {
this.pilotFinishRate = pilotFinishRate;
}
public BigDecimal getAvgBrowseTimes() {
return avgBrowseTimes;
}
public void setAvgBrowseTimes(BigDecimal avgBrowseTimes) {
this.avgBrowseTimes = avgBrowseTimes;
}
public Long getOutNum() {
return outNum;
}
public void setOutNum(Long outNum) {
this.outNum = outNum;
}
public BigDecimal getOutRate() {
return outRate;
}
public void setOutRate(BigDecimal outRate) {
this.outRate = outRate;
}
@Override
public String toString() {
return "AdGroupQrcodeDTO{" +
......@@ -321,6 +407,13 @@ public class AdGroupQrcodeDTO implements Serializable {
", distributionTime=" + distributionTime +
", registerNum=" + registerNum +
", registerRate=" + registerRate +
", activeCount=" + activeCount +
", userNumber=" + userNumber +
", pilotFinishUserNum=" + pilotFinishUserNum +
", pilotFinishRate=" + pilotFinishRate +
", avgBrowseTimes=" + avgBrowseTimes +
", outNum=" + outNum +
", outRate=" + outRate +
'}';
}
}
......@@ -100,9 +100,9 @@ public class GroupQrcodeFacadeImpl implements GroupQrcodeFacade {
}
@GetMapping("updateUserNumber")
ResponseDto<?> updateUserNumber(@RequestParam("weixinGroupId") String weixinGroupId)
throws BizException{
groupQrcodeBiz.updateUserNumber(weixinGroupId);
ResponseDto<?> updateUserNumber(@RequestParam("weixinGroupId") String weixinGroupId, @RequestParam("wxUserId") String wxUserId)
throws BizException {
groupQrcodeBiz.updateUserNumber(weixinGroupId, wxUserId);
return new ResponseDto<>();
}
}
package com.pcloud.book.group.set;
import com.pcloud.book.group.dto.GroupTopicDTO;
import com.pcloud.common.core.constant.MQTopicProducer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @描述:
* @作者:zhuyajie
* @创建时间:16:26 2019/7/16
* @版本:1.0
*/
@Component("groupSet")
public class GroupSet {
private static final Logger LOGGER = LoggerFactory.getLogger(GroupSet.class);
@Autowired
private AmqpTemplate amqpTemplate;
/**
* 群分类删除topic
* @param classifyId
*/
public void sendGroupClassifyDeleteTopic(Long classifyId) {
LOGGER.info("【社群书】发送群分类删除topic,<START>");
GroupTopicDTO groupTopicDTO = new GroupTopicDTO();
groupTopicDTO.setClassifyId(classifyId);
try {
amqpTemplate.convertAndSend(MQTopicProducer.EXCHAGE, MQTopicProducer.GROUP_CLASSIFY_DELETE, groupTopicDTO);
} catch (Exception e) {
LOGGER.error("【社群书】发送群分类删除topic,<ERROR>", e);
}
LOGGER.info("【社群书】发送群分类删除topic,<END>");
}
}
package com.pcloud.book.util.common;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolUtils {
/**
* 异步导出线程池
*/
public static final ExecutorService EXPORT_THREAD_POOL = new ThreadPoolExecutor(8, 8, 0L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("export-pool-%d").build(), new ThreadPoolExecutor.CallerRunsPolicy());
/**
* 异步发送线程池
*/
public static final ThreadPoolExecutor SEND_MESSAGE_THREAD_POOL = new ThreadPoolExecutor(8, 8, 0, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("send-message-pool-%d").build(), new ThreadPoolExecutor.CallerRunsPolicy());
/**
* 异步导出线程池
*/
public static final ExecutorService OTHER_THREAD_POOL = new ThreadPoolExecutor(8, 8, 0L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("other-pool-%d").build(), new ThreadPoolExecutor.CallerRunsPolicy());
}
......@@ -15,7 +15,6 @@
<result column="update_user" property="updateUser" jdbcType="BIGINT" />
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
<collection property="optionItem" column="id"
ofType="productMatchOptionItem"
select="com.pcloud.book.advertising.dao.impl.BmOptionItemDaoImpl.getByOptionId" />
</resultMap>
......
......@@ -183,4 +183,22 @@
ORDER BY create_time DESC
</select>
<select id="getRegisterCountByBookId" parameterType="map" resultType="Long">
SELECT
count(1)
FROM
advertising_bm_register
WHERE
book_id = #{bookId}
AND adviser_id = #{adviserId}
AND channel_id = #{channelId}
AND from_type != 'WECHAT_GROUP'
<if test="adId != null">
AND ad_id = #{adId,jdbcType=BIGINT}
</if>
<if test="statisMonth != null">
AND create_month = #{statisMonth}
</if>
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="com.pcloud.book.advertising.dao.impl.AdvertisingBrowseRecordDaoImpl">
<resultMap id="BaseResultMap" type="com.pcloud.book.advertising.entity.AdvertisingBrowseRecord">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="ad_id" property="adId" jdbcType="BIGINT"/>
<result column="book_id" property="bookId" jdbcType="BIGINT"/>
<result column="scene_id" property="sceneId" jdbcType="BIGINT"/>
<result column="adviser_id" property="adviserId" jdbcType="BIGINT"/>
<result column="channel_id" property="channelId" jdbcType="BIGINT"/>
<result column="official_account_id" property="officialAccountId" jdbcType="BIGINT"/>
<result column="from_type" property="fromType" jdbcType="VARCHAR"/>
<result column="from_id" property="fromId" jdbcType="BIGINT"/>
<result column="wechat_user_id" property="wechatUserId" jdbcType="BIGINT"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<result column="create_day" property="createDay" jdbcType="DATE"/>
<result column="create_month" property="createMonth" jdbcType="VARCHAR"/>
<result column="browse_times" property="browseTimes" jdbcType="BIGINT"/>
<result column="temp_mark" property="tempMark" jdbcType="VARCHAR"/>
<result column="record_id" property="recordId" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id, ad_id, book_id, scene_id, adviser_id, channel_id, official_account_id, from_type,
from_id, wechat_user_id, create_time, create_day, create_month, browse_times, temp_mark, record_id
</sql>
<insert id="insert" parameterType="com.pcloud.book.advertising.entity.AdvertisingBrowseRecord" useGeneratedKeys="true" keyProperty="id">
insert into advertising_browse_record
<trim prefix="(" suffix=")" suffixOverrides=",">
ad_id,
book_id,
scene_id,
adviser_id,
channel_id,
official_account_id,
from_type,
from_id,
wechat_user_id,
create_time,
create_day,
create_month,
browse_times,
temp_mark,
record_id,
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
#{adId,jdbcType=BIGINT},
#{bookId,jdbcType=BIGINT},
#{sceneId,jdbcType=BIGINT},
#{adviserId,jdbcType=BIGINT},
#{channelId,jdbcType=BIGINT},
#{officialAccountId,jdbcType=BIGINT},
#{fromType,jdbcType=VARCHAR},
#{fromId,jdbcType=BIGINT},
#{wechatUserId,jdbcType=BIGINT},
NOW(),
NOW(),
DATE_FORMAT(NOW(), '%Y-%m'),
#{browseTimes},
#{tempMark},
#{recordId},
</trim>
</insert>
<update id="addBrowseTimesByRecordId" parameterType="map">
update advertising_browse_record
set browse_times = browse_times + #{browseTimes}
where record_id = #{recordId}
</update>
<select id="getBrowseTimesByQrcode" parameterType="map" resultType="Long">
SELECT
IFNULL(SUM(browse_times), 0)
FROM
advertising_browse_record
WHERE
from_id = #{qrcodeId}
AND from_type = 'WECHAT_GROUP'
<if test="adId != null">
AND ad_id = #{adId}
</if>
<if test="statisMonth != null">
AND create_month = #{statisMonth}
</if>
</select>
<select id="getBrowseUserCountByQrcode" parameterType="map" resultType="Long">
SELECT
COUNT(DISTINCT wechat_user_id)
FROM
advertising_browse_record
WHERE
from_id = #{qrcodeId}
AND from_type = 'WECHAT_GROUP'
<if test="adId != null">
AND ad_id = #{adId}
</if>
<if test="statisMonth != null">
AND create_month = #{statisMonth}
</if>
</select>
<select id="getBrowseTimesByBook" resultType="Long" parameterType="map">
SELECT
IFNULL(SUM(browse_times), 0)
FROM
advertising_browse_record
WHERE
book_id = #{bookId}
AND adviser_id = #{adviserId}
AND channel_id = #{channelId}
AND from_type != 'WECHAT_GROUP'
<if test="adId != null">
AND ad_id = #{adId}
</if>
<if test="statisMonth != null">
AND create_month = #{statisMonth}
</if>
</select>
<select id="getBrowseUserCountByBook" parameterType="map" resultType="Long">
SELECT
COUNT(DISTINCT wechat_user_id)
FROM
advertising_browse_record
WHERE
book_id = #{bookId}
AND adviser_id = #{adviserId}
AND channel_id = #{channelId}
AND from_type != 'WECHAT_GROUP'
<if test="adId != null">
AND ad_id = #{adId}
</if>
<if test="statisMonth != null">
AND create_month = #{statisMonth}
</if>
</select>
</mapper>
\ No newline at end of file
......@@ -68,6 +68,12 @@
AND adviser_id = #{adviserId}
AND channel_id = #{channelId}
AND from_type != 'WECHAT_GROUP'
<if test="adId != null">
AND ad_id = #{adId}
</if>
<if test="statisMonth != null">
AND create_month = #{statisMonth}
</if>
</select>
<select id="getClickNumByGroupQrcodeId" parameterType="map" resultType="Long">
......@@ -255,4 +261,30 @@
) AS a
</select>
<!--计算点击人数-包含userId=null-->
<select id="getClickUserNumByBookId" parameterType="map" resultType="Long">
SELECT
COUNT(1)
FROM
(
SELECT
wechat_user_id
FROM
advertising_click_record
WHERE
book_id = #{bookId}
AND adviser_id = #{adviserId}
AND channel_id = #{channelId}
AND from_type != 'WECHAT_GROUP'
<if test="adId != null">
AND ad_id = #{adId}
</if>
<if test="statisMonth != null">
and create_month = #{statisMonth}
</if>
GROUP BY
wechat_user_id
) AS a
</select>
</mapper>
\ No newline at end of file
......@@ -286,4 +286,16 @@
qrcode_id
</select>
<select id="advertisingDistributionDetail4WechatGroup" parameterType="map" resultType="com.pcloud.book.advertising.dto.AdvertisingDistributionDTO">
SELECT
distribution_time distributionTime
FROM
advertising_distribution_book
WHERE
qrcode_id = #{qrcodeId}
AND ad_id = #{adId}
ORDER BY
distribution_time DESC
</select>
</mapper>
\ No newline at end of file
......@@ -69,6 +69,12 @@
AND adviser_id = #{adviserId}
AND channel_id = #{channelId}
AND from_type != 'WECHAT_GROUP'
<if test="adId != null">
AND ad_id = #{adId}
</if>
<if test="statisMonth != null">
AND create_month = #{statisMonth}
</if>
</select>
<select id="getExposureNumByGroupQrcodeId" parameterType="map" resultType="Long">
......@@ -277,4 +283,14 @@
</set>
where id = #{id,jdbcType=BIGINT}
</update>
<update id="updateExposureByQrcode" parameterType="map">
UPDATE advertising_exposure_record
SET count = #{count}
WHERE
from_type = 'WECHAT_GROUP'
AND from_id = #{fromId}
AND count = 0
</update>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="com.pcloud.book.advertising.dao.impl.AdvertisingPilotRecordDaoImpl">
<resultMap id="BaseResultMap" type="com.pcloud.book.advertising.entity.AdvertisingPilotRecord">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="ad_id" property="adId" jdbcType="BIGINT"/>
<result column="book_id" property="bookId" jdbcType="BIGINT"/>
<result column="is_book_group" property="isBookGroup" jdbcType="BIT"/>
<result column="scene_id" property="sceneId" jdbcType="BIGINT"/>
<result column="adviser_id" property="adviserId" jdbcType="BIGINT"/>
<result column="agent_id" property="agentId" jdbcType="BIGINT"/>
<result column="channel_id" property="channelId" jdbcType="BIGINT"/>
<result column="official_account_id" property="officialAccountId" jdbcType="BIGINT"/>
<result column="from_type" property="fromType" jdbcType="VARCHAR"/>
<result column="from_id" property="fromId" jdbcType="BIGINT"/>
<result column="wechat_user_id" property="wechatUserId" jdbcType="BIGINT"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<result column="create_day" property="createDay" jdbcType="DATE"/>
<result column="create_month" property="createMonth" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id, ad_id, book_id, is_book_group, scene_id, adviser_id, agent_id, channel_id, official_account_id, from_type,
from_id, wechat_user_id, create_time, create_day, create_month
</sql>
<select id="getById" resultMap="BaseResultMap" parameterType="Long">
select
<include refid="Base_Column_List"/>
from advertising_pilot_record
where id = #{id}
</select>
<select id="getPilotUserNumByAdId" parameterType="map" resultType="Long">
SELECT
count(DISTINCT wechat_user_id)
FROM
advertising_pilot_record
WHERE
ad_id = #{adId}
<if test="bookId != null">
AND book_id = #{bookId}
AND adviser_id = #{adviserId}
AND channel_id = #{channelId}
</if>
<if test="statisMonth != null">
and create_month = #{statisMonth}
</if>
</select>
<select id="getPilotUserNumByQrcode" parameterType="map" resultType="Long">
SELECT
count(DISTINCT wechat_user_id)
FROM
advertising_pilot_record
WHERE
from_id = #{qrcodeId}
AND from_type = 'WECHAT_GROUP'
<if test="adId != null">
AND ad_id = #{adId}
</if>
<if test="statisMonth != null">
AND create_month = #{statisMonth}
</if>
AND wechat_user_id IS NOT NULL
</select>
<insert id="insert" parameterType="com.pcloud.book.advertising.entity.AdvertisingPilotRecord" useGeneratedKeys="true" keyProperty="id">
insert into advertising_pilot_record
<trim prefix="(" suffix=")" suffixOverrides=",">
ad_id,
book_id,
is_book_group,
scene_id,
adviser_id,
agent_id,
channel_id,
official_account_id,
from_type,
from_id,
wechat_user_id,
create_time,
create_day,
create_month,
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
#{adId,jdbcType=BIGINT},
#{bookId,jdbcType=BIGINT},
#{isBookGroup,jdbcType=BIT},
#{sceneId,jdbcType=BIGINT},
#{adviserId,jdbcType=BIGINT},
#{agentId,jdbcType=BIGINT},
#{channelId,jdbcType=BIGINT},
#{officialAccountId,jdbcType=BIGINT},
#{fromType,jdbcType=VARCHAR},
#{fromId,jdbcType=BIGINT},
#{wechatUserId,jdbcType=BIGINT},
NOW(),
NOW(),
DATE_FORMAT(NOW(), '%Y-%m'),
</trim>
</insert>
<update id="update" parameterType="com.pcloud.book.advertising.entity.AdvertisingPilotRecord">
update advertising_pilot_record
<set>
<if test="adId != null">
ad_id = #{adId,jdbcType=BIGINT},
</if>
<if test="bookId != null">
book_id = #{bookId,jdbcType=BIGINT},
</if>
<if test="isBookGroup != null">
is_book_group = #{isBookGroup,jdbcType=BIT},
</if>
<if test="sceneId != null">
scene_id = #{sceneId,jdbcType=BIGINT},
</if>
<if test="adviserId != null">
adviser_id = #{adviserId,jdbcType=BIGINT},
</if>
<if test="agentId != null">
agent_id = #{agentId,jdbcType=BIGINT},
</if>
<if test="channelId != null">
channel_id = #{channelId,jdbcType=BIGINT},
</if>
<if test="officialAccountId != null">
official_account_id = #{officialAccountId,jdbcType=BIGINT},
</if>
<if test="fromType != null">
from_type = #{fromType,jdbcType=VARCHAR},
</if>
<if test="fromId != null">
from_id = #{fromId,jdbcType=BIGINT},
</if>
<if test="wechatUserId != null">
wechat_user_id = #{wechatUserId,jdbcType=BIGINT},
</if>
</set>
where id = #{id,jdbcType=BIGINT}
</update>
<select id="getPilotUserNumByMasterId" parameterType="map" resultType="Long">
SELECT
COUNT(DISTINCT wechat_user_id)
FROM
advertising_pilot_record r
INNER JOIN advertising_space s ON r.ad_id = s.id
WHERE
s.master_id = #{masterId}
</select>
<select id="getPilotUserNumByBookId" parameterType="map" resultType="Long">
SELECT
count(DISTINCT wechat_user_id)
FROM
advertising_pilot_record
WHERE
book_id = #{bookId}
AND adviser_id = #{adviserId}
AND channel_id = #{channelId}
AND from_type != 'WECHAT_GROUP'
<if test="adId != null">
AND ad_id = #{adId}
</if>
<if test="statisMonth != null">
AND create_month = #{statisMonth}
</if>
</select>
</mapper>
\ No newline at end of file
......@@ -164,4 +164,41 @@
${item}
</foreach>
</select>
<!--根据发送时间查对应的发送计划-->
<resultMap id="DistributionMap" type="AdvertisingDistributionDTO">
<id column="advertising_space_id" property="adId" jdbcType="BIGINT"/>
<result column="put_type" property="putType" jdbcType="INTEGER"/>
<result column="start_time" property="startTime" jdbcType="TIMESTAMP"/>
<result column="end_time" property="endTime" jdbcType="TIMESTAMP"/>
<result column="put_time" property="putTime" jdbcType="VARCHAR"/>
<result column="week_day" property="weekDay" jdbcType="INTEGER"/>
</resultMap>
<select id="getPlanByTime" parameterType="map" resultMap="DistributionMap">
SELECT
p.advertising_space_id,
p.put_type,
p.start_time,
p.end_time,
p.put_time,
p.week_day
FROM
advertising_put p
LEFT JOIN advertising_plan_group g ON g.advertising_plan_id = p.advertising_plan_id
WHERE
g.qrcode_id = #{qrcodeId}
AND p.advertising_space_id = #{adId}
AND (
TIMEDIFF(#{timeOnly}, put_time) BETWEEN '00:00:00' AND '00:00:05'
OR
TIMEDIFF(#{dateTime},put_time) BETWEEN '00:00:00' AND '00:00:05'
)
AND
IF (
p.put_type = 3, p.week_day = WEEKDAY(#{dateOnly}) + 1, p.put_type > 0
)
LIMIT 1
</select>
</mapper>
\ No newline at end of file
......@@ -71,6 +71,7 @@
<result column="ad_detail_file_size" property="adDetailFileSize" jdbcType="BIGINT" />
<result column="ad_detail_file_name" property="adDetailFileName" jdbcType="VARCHAR" />
<result column="ad_detail_file_duration" property="adDetailFileDuration" jdbcType="BIGINT" />
<result column="settlement_method" property="settlementMethod" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
......@@ -210,6 +211,9 @@
<if test="filterTest == 1">
AND (is_test = 0 OR is_test IS NULL)
</if>
<if test="adPosition !=null">
AND ad_position = #{adPosition}
</if>
order by
create_time desc
</select>
......@@ -249,7 +253,8 @@
s.ad_pic,
s.ad_link,
s.is_open,
b.distribution_time distributionTime
MAX(b.distribution_time) distributionTime,
COUNT(1) distributionNum
FROM
advertising_distribution_book b,
advertising_space s
......@@ -257,6 +262,8 @@
b.ad_id = s.id
AND b.qrcode_id = #{qrcodeId}
AND s.ad_position = 'WECHAT_GROUP_MSG'
GROUP BY
s.id
ORDER BY
b.distribution_time DESC
</select>
......@@ -277,10 +284,13 @@
b.qrcode_id qrcodeId,
b.agent_id agentId,
b.adviser_id adviserId,
b. channel_id channelId
b.channel_id channelId,
m.settlement_method
FROM
advertising_space s
LEFT JOIN advertising_distribution_book b ON b.ad_id = s.id
LEFT JOIN advertising_settlement_method m ON s.id = m.ad_id
AND s.master_id = m.master_id
WHERE
s.master_id = #{masterId}
GROUP BY
......
......@@ -831,8 +831,15 @@
) t ON t.adviser_id = a.ADVISER_ID
AND t.channel_id = a.CHANNEL_ID
AND t.book_id = a.BOOK_ID
LEFT JOIN advertising_adviser_permission adp ON a.BOOK_ID = adp.book_id
AND a.ADVISER_ID = adp.adviser_id
AND a.CHANNEL_ID = adp.channel_id
WHERE
a.IS_MAIN_EDITOR = 1
AND (
adp.is_open IS NULL
OR adp.is_open = 1
)
<if test="adviserId != null">
AND a.ADVISER_ID = #{adviserId}
</if>
......
......@@ -496,7 +496,8 @@
),
0,
1
) isOpen
) isOpen,
g.user_number userNumber
FROM
book_group_classify c
JOIN book_group_qrcode g ON c.id = g.classify_id
......
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