Commit 516b90be by 阮思源

群资源数据统计

parent 2b767dae
package com.pcloud.book.consumer.settlement; package com.pcloud.book.consumer.settlement;
import com.pcloud.common.core.aspect.ParamLog; import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException; import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.ResponseHandleUtil; import com.pcloud.common.utils.ResponseHandleUtil;
...@@ -9,9 +10,11 @@ import com.pcloud.settlementcenter.record.service.SettlementService; ...@@ -9,9 +10,11 @@ import com.pcloud.settlementcenter.record.service.SettlementService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@Component("settlementConsr") @Component("settlementConsr")
...@@ -37,4 +40,19 @@ public class SettlementConsr { ...@@ -37,4 +40,19 @@ public class SettlementConsr {
} }
return null; return null;
} }
@ParamLog(value = "根据条件获取收益", isBefore = false, isAfterReturn = false)
public Map<Long, BigDecimal> getAdviserIncomeByCondition(List<Long> ids, String type, Long partyId, Long groupQrcodeId, Long bookGroupId) throws BizException {
Map<Long, BigDecimal> map = new HashMap<>();
if (ListUtils.isEmpty(ids) || partyId == null) {
return map;
}
try {
ResponseEntity<ResponseDto<Map<Long, BigDecimal>>> responseEntityP = settlementService.getAdviserIncomeByCondition(ids, type, partyId, groupQrcodeId, bookGroupId);
map = ResponseHandleUtil.parseMap(responseEntityP, Long.class, BigDecimal.class);
} catch (Exception e) {
LOGGER.error("获取收益.[getAdviserIncomeByCondition]:" + e.getMessage(), e);
}
return map;
}
} }
package com.pcloud.book.consumer.trade; package com.pcloud.book.consumer.trade;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException; import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.ResponseHandleUtil; import com.pcloud.common.utils.ResponseHandleUtil;
import com.pcloud.facade.tradecenter.dto.GroupMoneyDto;
import com.pcloud.facade.tradecenter.dto.QrGroupBuyDetailDto; import com.pcloud.facade.tradecenter.dto.QrGroupBuyDetailDto;
import com.pcloud.facade.tradecenter.dto.WechatGroupDto;
import com.pcloud.facade.tradecenter.service.OrderFormService; import com.pcloud.facade.tradecenter.service.OrderFormService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -41,4 +46,27 @@ public class TradeConsr { ...@@ -41,4 +46,27 @@ public class TradeConsr {
} }
return null; return null;
} }
/**
* 获取交易额
* @param wechatGroupDto
* @return
* @throws BizException
*/
public Map<Long, GroupMoneyDto> getQrGroupSaleMoney(WechatGroupDto wechatGroupDto) throws BizException {
Map<Long, GroupMoneyDto> map = new HashMap<>();
if (wechatGroupDto == null) {
return map;
}
try {
ResponseEntity<ResponseDto<Map<Long, GroupMoneyDto>>> responseEntityP = orderFormService.getQrGroupSaleMoney(wechatGroupDto);
map = ResponseHandleUtil.parseMap(responseEntityP, Long.class, GroupMoneyDto.class);
} catch (Exception e) {
LOGGER.error("获取交易额.[getQrGroupSaleMoney]:" + e.getMessage(), e);
}
if (map == null) {
map = new HashMap<>();
}
return map;
}
} }
package com.pcloud.book.group.biz;
import com.pcloud.book.group.entity.AppClickRecord;
public interface AppClickRecordBiz {
/**
* 新增点击记录
* @param appClickRecord
* @return
*/
Long createAppClickRecord(AppClickRecord appClickRecord);
}
package com.pcloud.book.group.biz; package com.pcloud.book.group.biz;
import com.pcloud.book.book.dto.BookDto; import com.pcloud.book.book.dto.BookDto;
import com.pcloud.book.group.dto.AppStatisticsDTO;
import com.pcloud.book.group.dto.BookGroupDTO; import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.QrcodeNameAndProIdDTO; import com.pcloud.book.group.dto.QrcodeNameAndProIdDTO;
import com.pcloud.book.group.entity.BookGroup; import com.pcloud.book.group.entity.BookGroup;
...@@ -197,6 +198,17 @@ public interface BookGroupBiz { ...@@ -197,6 +198,17 @@ public interface BookGroupBiz {
*/ */
Boolean isHaveQrcode(Long bookId, Long channelId, Long adviserId); Boolean isHaveQrcode(Long bookId, Long channelId, Long adviserId);
/**
* 获取应用作品统计
* @param currentPage
* @param numPerPage
* @param bookGroupId
* @param qrcodeId
* @return
*/
PageBeanNew<AppStatisticsDTO> getAppStatistics(Integer currentPage, Integer numPerPage, Long bookGroupId, Long qrcodeId, Long partyId);
/** /**
* 社群码导出 * 社群码导出
* @param paramMap * @param paramMap
......
package com.pcloud.book.group.biz.impl;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.group.biz.AppClickRecordBiz;
import com.pcloud.book.group.dao.AppClickRecordDao;
import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.entity.AppClickRecord;
import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.utils.string.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Description
* @Author ruansiyuan
* @Date 2019/5/30 11:58
**/
@Component("appClickRecordBiz")
public class AppClickRecordBizImpl implements AppClickRecordBiz {
@Autowired
private AppClickRecordDao appClickRecordDao;
@Autowired
private GroupQrcodeDao groupQrcodeDao;
@ParamLog("新增应用作品点击记录")
@Override
public Long createAppClickRecord(AppClickRecord appClickRecord) {
if (appClickRecord.getQrcodeId() == null) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "群id不能为空");
}
if (appClickRecord.getClassifyId() == null) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "分类id不能为空!");
}
if (appClickRecord.getBookGroupId() == null) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "社群书id不能为空!");
}
if (appClickRecord.getServeId() == null) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "应用id或作品id不能为空!");
}
if (StringUtil.isEmpty(appClickRecord.getServeType())) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "类型不能为空(APP或PRODUCT)!");
}
GroupQrcode groupQrcode = groupQrcodeDao.getById(appClickRecord.getQrcodeId());
if (groupQrcode != null) {
appClickRecord.setQrcodeId(groupQrcode.getId());
}
appClickRecordDao.insert(appClickRecord);
return appClickRecord.getId();
}
}
...@@ -7,11 +7,18 @@ import com.pcloud.book.book.biz.BookBiz; ...@@ -7,11 +7,18 @@ import com.pcloud.book.book.biz.BookBiz;
import com.pcloud.book.book.dao.BookDao; import com.pcloud.book.book.dao.BookDao;
import com.pcloud.book.book.dto.BookDto; import com.pcloud.book.book.dto.BookDto;
import com.pcloud.book.book.set.BookSet; import com.pcloud.book.book.set.BookSet;
import com.pcloud.book.consumer.app.AppConsr;
import com.pcloud.book.consumer.channel.QrcodeSceneConsr; import com.pcloud.book.consumer.channel.QrcodeSceneConsr;
import com.pcloud.book.consumer.resource.ProductConsr;
import com.pcloud.book.consumer.settlement.SettlementConsr;
import com.pcloud.book.consumer.trade.TradeConsr;
import com.pcloud.book.consumer.user.AdviserConsr; import com.pcloud.book.consumer.user.AdviserConsr;
import com.pcloud.book.group.biz.BookGroupBiz; import com.pcloud.book.group.biz.BookGroupBiz;
import com.pcloud.book.group.biz.BookGroupClassifyBiz; import com.pcloud.book.group.biz.BookGroupClassifyBiz;
import com.pcloud.book.group.dao.AppClickRecordDao;
import com.pcloud.book.group.dao.AppTouchRecordDao;
import com.pcloud.book.group.dao.BookGroupDao; import com.pcloud.book.group.dao.BookGroupDao;
import com.pcloud.book.group.dto.AppStatisticsDTO;
import com.pcloud.book.group.dto.BookGroupDTO; import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.BookGroupStatisticDTO; import com.pcloud.book.group.dto.BookGroupStatisticDTO;
import com.pcloud.book.group.dto.QrcodeNameAndProIdDTO; import com.pcloud.book.group.dto.QrcodeNameAndProIdDTO;
...@@ -35,8 +42,12 @@ import com.pcloud.common.utils.QrcodeUtils; ...@@ -35,8 +42,12 @@ import com.pcloud.common.utils.QrcodeUtils;
import com.pcloud.common.utils.ResponseHandleUtil; import com.pcloud.common.utils.ResponseHandleUtil;
import com.pcloud.common.utils.string.StringUtil; import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.common.utils.zip.CompressUtils; import com.pcloud.common.utils.zip.CompressUtils;
import com.pcloud.facade.tradecenter.dto.GroupMoneyDto;
import com.pcloud.facade.tradecenter.dto.WechatGroupDto;
import com.pcloud.labelcenter.label.service.LabelService; import com.pcloud.labelcenter.label.service.LabelService;
import com.pcloud.resourcecenter.product.dto.AddAppProductParamDTO; import com.pcloud.resourcecenter.product.dto.AddAppProductParamDTO;
import com.pcloud.resourcecenter.product.dto.ProductDto;
import com.pcloud.resourcecenter.product.dto.ProductTypeDto;
import com.pcloud.resourcecenter.product.dto.UpdateAppProductParamDTO; import com.pcloud.resourcecenter.product.dto.UpdateAppProductParamDTO;
import com.pcloud.resourcecenter.product.entity.Product; import com.pcloud.resourcecenter.product.entity.Product;
import com.pcloud.resourcecenter.product.service.ProductService; import com.pcloud.resourcecenter.product.service.ProductService;
...@@ -99,6 +110,18 @@ public class BookGroupBizImpl implements BookGroupBiz { ...@@ -99,6 +110,18 @@ public class BookGroupBizImpl implements BookGroupBiz {
@Autowired @Autowired
private QrcodeSceneConsr qrcodeSceneConsr; private QrcodeSceneConsr qrcodeSceneConsr;
@Autowired @Autowired
private AppTouchRecordDao appTouchRecordDao;
@Autowired
private AppClickRecordDao appClickRecordDao;
@Autowired
private SettlementConsr settlementConsr;
@Autowired
private TradeConsr tradeConsr;
@Autowired
private AppConsr appConsr;
@Autowired
private ProductConsr productConsr;
@Autowired
private MessageBiz messageBiz; private MessageBiz messageBiz;
...@@ -492,6 +515,111 @@ public class BookGroupBizImpl implements BookGroupBiz { ...@@ -492,6 +515,111 @@ public class BookGroupBizImpl implements BookGroupBiz {
} }
} }
@ParamLog("获取应用统计")
@Override
public PageBeanNew<AppStatisticsDTO> getAppStatistics(Integer currentPage, Integer numPerPage, Long bookGroupId, Long qrcodeId, Long partyId) {
PageParam pageParam = new PageParam(currentPage, numPerPage);
Map<String, Object> map = new HashMap<>();
map.put("bookGroupId", bookGroupId);
map.put("qrcodeId", qrcodeId);
PageBeanNew<AppStatisticsDTO> pageBeanNew = appTouchRecordDao.listPageNew(pageParam, map, "getAppTouchStatistics");
List<AppStatisticsDTO> appStatisticsDTOS = pageBeanNew.getRecordList();
if (ListUtils.isEmpty(appStatisticsDTOS)) {
return pageBeanNew;
}
List<Long> serveIds = appStatisticsDTOS.stream().filter(s -> s.getServeId() != null).map(AppStatisticsDTO::getServeId).collect(Collectors.toList());
//获取点击次数
List<AppStatisticsDTO> appClickStatisticsDTOS = appClickRecordDao.getClickStatisticsByServeIds(serveIds, qrcodeId, bookGroupId);
Map<Long, Integer> clickCountMap = new HashMap<>();
if (!ListUtils.isEmpty(appClickStatisticsDTOS)) {
for (AppStatisticsDTO in : appClickStatisticsDTOS) {
clickCountMap.put(in.getServeId(), in.getClickCount());
}
}
List<Long> productIds = appStatisticsDTOS.stream().filter(s -> s.getServeId() != null && "PRODUCT".equalsIgnoreCase(s.getServeType())).map(AppStatisticsDTO::getServeId).collect(Collectors.toList());
List<Long> appIds = appStatisticsDTOS.stream().filter(s -> s.getServeId() != null && "APP".equalsIgnoreCase(s.getServeType())).map(AppStatisticsDTO::getServeId).collect(Collectors.toList());
//获取详情
Map<Long, AppDto> appDtoMap = appConsr.mapByIds(appIds);
Map<Long, ProductDto> productDtoMap = productConsr.getProBasesByIds(productIds);
//结算接口
Map<Long, BigDecimal> productIncomeMap = settlementConsr.getAdviserIncomeByCondition(productIds, "PRODUCT", partyId, qrcodeId, bookGroupId);
Map<Long, BigDecimal> appIncomeMap = settlementConsr.getAdviserIncomeByCondition(appIds, "APP", partyId, qrcodeId, bookGroupId);
//交易接口
WechatGroupDto wechatGroupDtoP = new WechatGroupDto();
wechatGroupDtoP.setBookGroupId(bookGroupId);
wechatGroupDtoP.setIds(productIds);
wechatGroupDtoP.setPartyId(partyId);
wechatGroupDtoP.setType("PRODUCT");
wechatGroupDtoP.setQrcodeId(qrcodeId);
WechatGroupDto wechatGroupDtoA = new WechatGroupDto();
wechatGroupDtoA.setBookGroupId(bookGroupId);
wechatGroupDtoA.setIds(appIds);
wechatGroupDtoA.setPartyId(partyId);
wechatGroupDtoA.setType("APP");
Map<Long, GroupMoneyDto> productSaleMap = tradeConsr.getQrGroupSaleMoney(wechatGroupDtoP);
Map<Long, GroupMoneyDto> appSaleMap = tradeConsr.getQrGroupSaleMoney(wechatGroupDtoA);
for (AppStatisticsDTO appStatisticsDTO : appStatisticsDTOS) {
Long id = appStatisticsDTO.getServeId();
String type = appStatisticsDTO.getServeType();
Integer clickCount = clickCountMap.get(id);
if (clickCount == null) {
clickCount = 0;
}
appStatisticsDTO.setClickCount(clickCount);
Integer buyCount = 0;
Double incomeAmount = 0D;
Double saleAmount = 0D;
if ("PRODUCT".equalsIgnoreCase(type)) {
if (productIncomeMap.get(id) != null) {
incomeAmount = productIncomeMap.get(id).doubleValue();
}
appStatisticsDTO.setIncomeAmount(incomeAmount);
if (productSaleMap.get(id) != null) {
saleAmount = productSaleMap.get(id).getSaleMoney();
buyCount = productSaleMap.get(id).getSaleCount().intValue();
}
appStatisticsDTO.setSaleAmount(saleAmount);
appStatisticsDTO.setBuyCount(buyCount);
if (productDtoMap != null && productDtoMap.get(id) != null) {
ProductDto productDto = productDtoMap.get(id);
appStatisticsDTO.setServeName(productDto.getProductName());
appStatisticsDTO.setImage(productDto.getCoverImg());
ProductTypeDto productTypeDto = productDto.getProductTypeDto();
if (productTypeDto != null) {
appStatisticsDTO.setTypeName(productTypeDto.getTypeName());
}
}
}
if ("APP".equalsIgnoreCase(type)) {
if (appIncomeMap.get(id) != null) {
incomeAmount = appIncomeMap.get(id).doubleValue();
}
appStatisticsDTO.setIncomeAmount(incomeAmount);
GroupMoneyDto groupMoneyDtoApp = appSaleMap.get(id);
if (groupMoneyDtoApp != null) {
saleAmount = groupMoneyDtoApp.getSaleMoney();
buyCount = groupMoneyDtoApp.getSaleCount().intValue();
}
appStatisticsDTO.setSaleAmount(saleAmount);
appStatisticsDTO.setBuyCount(buyCount);
if (appDtoMap != null && appDtoMap.get(id) != null) {
AppDto appDto = appDtoMap.get(id);
appStatisticsDTO.setTypeName(appDto.getTypeName());
appStatisticsDTO.setServeName(appDto.getTitle());
appStatisticsDTO.setImage(appDto.getSquareImg());
}
}
if (buyCount == null || buyCount == 0 || clickCount == null || clickCount == 0) {
appStatisticsDTO.setBuyRate(0D);
} else {
appStatisticsDTO.setBuyRate(new BigDecimal(buyCount.doubleValue() / clickCount).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
}
}
return pageBeanNew;
}
@Override @Override
public void exportGroupQrcode4Adviser(Map<String, Object> paramMap, Long adviserId) { public void exportGroupQrcode4Adviser(Map<String, Object> paramMap, Long adviserId) {
EXECUTOR_SINGLE_SERVICE.execute(() -> { EXECUTOR_SINGLE_SERVICE.execute(() -> {
......
package com.pcloud.book.group.dao;
import com.pcloud.book.group.dto.AppStatisticsDTO;
import com.pcloud.book.group.entity.AppClickRecord;
import com.pcloud.common.core.dao.BaseDao;
import java.util.List;
public interface AppClickRecordDao extends BaseDao<AppClickRecord> {
/**
* 根据作品或应用id集合获取统计
*/
List<AppStatisticsDTO> getClickStatisticsByServeIds(List<Long> serveIds, Long qrcodeId, Long bookGroupId);
}
package com.pcloud.book.group.dao;
import com.pcloud.book.group.entity.AppTouchRecord;
import com.pcloud.common.core.dao.BaseDao;
public interface AppTouchRecordDao extends BaseDao<AppTouchRecord> {
}
package com.pcloud.book.group.dao.impl;
import com.pcloud.book.group.dao.AppClickRecordDao;
import com.pcloud.book.group.dto.AppStatisticsDTO;
import com.pcloud.book.group.entity.AppClickRecord;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Description
* @Author ruansiyuan
* @Date 2019/5/29 17:43
**/
@Component("appClickRecordDao")
public class AppClickRecordDaoImpl extends BaseDaoImpl<AppClickRecord> implements AppClickRecordDao {
@Override
public List<AppStatisticsDTO> getClickStatisticsByServeIds(List<Long> serveIds, Long qrcodeId, Long bookGroupId) {
Map<String, Object> map = new HashMap<>();
map.put("qrcodeId", qrcodeId);
map.put("bookGroupId", bookGroupId);
map.put("serveIds", serveIds);
return this.getSqlSession().selectList(this.getStatement("getClickStatisticsByServeIds"), map);
}
}
package com.pcloud.book.group.dao.impl;
import com.pcloud.book.group.dao.AppTouchRecordDao;
import com.pcloud.book.group.entity.AppTouchRecord;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component;
/**
* @Description
* @Author ruansiyuan
* @Date 2019/5/29 17:43
**/
@Component("appTouchRecordDao")
public class AppTouchRecordDaoImpl extends BaseDaoImpl<AppTouchRecord> implements AppTouchRecordDao {
}
package com.pcloud.book.group.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
/**
* @Description
* @Author ruansiyuan
* @Date 2019/5/30 15:27
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class AppStatisticsDTO implements Serializable {
private static final long serialVersionUID = -6223419228204706366L;
@ApiModelProperty("应用或作品id")
private Long serveId;
@ApiModelProperty("应用或作品名称")
private String serveName;
@ApiModelProperty("类型")
private String serveType;
@ApiModelProperty("应用或作品类型名称")
private String typeName;
@ApiModelProperty("应用或作品图片")
private String image;
@ApiModelProperty("推送次数")
private Integer pushCount;
@ApiModelProperty("点击次数")
private Integer clickCount;
@ApiModelProperty("购买次数")
private Integer buyCount;
@ApiModelProperty("购买率")
private Double buyRate;
@ApiModelProperty("销售总额")
private Double saleAmount;
@ApiModelProperty("收益总额")
private Double incomeAmount;
public Long getServeId() {
return serveId;
}
public void setServeId(Long serveId) {
this.serveId = serveId;
}
public String getServeName() {
return serveName;
}
public void setServeName(String serveName) {
this.serveName = serveName;
}
public String getServeType() {
return serveType;
}
public void setServeType(String serveType) {
this.serveType = serveType;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public Integer getPushCount() {
return pushCount;
}
public void setPushCount(Integer pushCount) {
this.pushCount = pushCount;
}
public Integer getClickCount() {
return clickCount;
}
public void setClickCount(Integer clickCount) {
this.clickCount = clickCount;
}
public Integer getBuyCount() {
return buyCount;
}
public void setBuyCount(Integer buyCount) {
this.buyCount = buyCount;
}
public Double getBuyRate() {
return buyRate;
}
public void setBuyRate(Double buyRate) {
this.buyRate = buyRate;
}
public Double getSaleAmount() {
return saleAmount;
}
public void setSaleAmount(Double saleAmount) {
this.saleAmount = saleAmount;
}
public Double getIncomeAmount() {
return incomeAmount;
}
public void setIncomeAmount(Double incomeAmount) {
this.incomeAmount = incomeAmount;
}
@Override
public String toString() {
return "AppStatisticsDTO{" +
"serveId=" + serveId +
", serveName='" + serveName + '\'' +
", serveType='" + serveType + '\'' +
", typeName='" + typeName + '\'' +
", image='" + image + '\'' +
", pushCount=" + pushCount +
", clickCount=" + clickCount +
", buyCount=" + buyCount +
", buyRate=" + buyRate +
", saleAmount=" + saleAmount +
", incomeAmount=" + incomeAmount +
'}';
}
}
package com.pcloud.book.group.entity;
import com.pcloud.common.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
/**
* @Description
* @Author ruansiyuan
* @Date 2019/5/29 17:32
**/
public class AppClickRecord extends BaseEntity {
private static final long serialVersionUID = 2905228127427560635L;
@ApiModelProperty("社群书id")
private Long bookGroupId;
@ApiModelProperty("分类id")
private Long classifyId;
@ApiModelProperty("群id")
private Long qrcodeId;
@ApiModelProperty("微信群id")
private String weixinGroupId;
@ApiModelProperty("应用或作品id")
private Long serveId;
@ApiModelProperty("类型")
private String serveType;
public Long getBookGroupId() {
return bookGroupId;
}
public void setBookGroupId(Long bookGroupId) {
this.bookGroupId = bookGroupId;
}
public Long getClassifyId() {
return classifyId;
}
public void setClassifyId(Long classifyId) {
this.classifyId = classifyId;
}
public Long getQrcodeId() {
return qrcodeId;
}
public void setQrcodeId(Long qrcodeId) {
this.qrcodeId = qrcodeId;
}
public String getWeixinGroupId() {
return weixinGroupId;
}
public void setWeixinGroupId(String weixinGroupId) {
this.weixinGroupId = weixinGroupId;
}
public Long getServeId() {
return serveId;
}
public void setServeId(Long serveId) {
this.serveId = serveId;
}
public String getServeType() {
return serveType;
}
public void setServeType(String serveType) {
this.serveType = serveType;
}
@Override
public String toString() {
return "AppClickRecord{" +
"bookGroupId=" + bookGroupId +
", classifyId=" + classifyId +
", qrcodeId=" + qrcodeId +
", weixinGroupId='" + weixinGroupId + '\'' +
", serveId=" + serveId +
", serveType='" + serveType + '\'' +
"} " + super.toString();
}
}
package com.pcloud.book.group.entity;
import com.pcloud.common.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
/**
* @Description
* @Author ruansiyuan
* @Date 2019/5/29 17:32
**/
public class AppTouchRecord extends BaseEntity {
private static final long serialVersionUID = 2905228127427560635L;
@ApiModelProperty("社群书id")
private Long bookGroupId;
@ApiModelProperty("分类id")
private Long classifyId;
@ApiModelProperty("群id")
private Long qrcodeId;
@ApiModelProperty("微信群id")
private String weixinGroupId;
@ApiModelProperty("应用或作品id")
private Long serveId;
@ApiModelProperty("类型")
private String serveType;
@ApiModelProperty("触发类型:1欢迎语,2关键词,3群发")
private Integer touchType;
public Long getBookGroupId() {
return bookGroupId;
}
public void setBookGroupId(Long bookGroupId) {
this.bookGroupId = bookGroupId;
}
public Long getClassifyId() {
return classifyId;
}
public void setClassifyId(Long classifyId) {
this.classifyId = classifyId;
}
public Long getQrcodeId() {
return qrcodeId;
}
public void setQrcodeId(Long qrcodeId) {
this.qrcodeId = qrcodeId;
}
public String getWeixinGroupId() {
return weixinGroupId;
}
public void setWeixinGroupId(String weixinGroupId) {
this.weixinGroupId = weixinGroupId;
}
public Long getServeId() {
return serveId;
}
public void setServeId(Long serveId) {
this.serveId = serveId;
}
public String getServeType() {
return serveType;
}
public void setServeType(String serveType) {
this.serveType = serveType;
}
public Integer getTouchType() {
return touchType;
}
public void setTouchType(Integer touchType) {
this.touchType = touchType;
}
@Override
public String toString() {
return "AppTouchRecord{" +
"bookGroupId=" + bookGroupId +
", classifyId=" + classifyId +
", qrcodeId=" + qrcodeId +
", weixinGroupId='" + weixinGroupId + '\'' +
", serveId=" + serveId +
", serveType='" + serveType + '\'' +
", touchType=" + touchType +
"} " + super.toString();
}
}
package com.pcloud.book.group.enums;
/**
* 触发类型
*/
public enum TouchTypeEnum {
/**
* 欢迎语
*/
GUIDE(1),
/**
* 关键词
*/
KEYWORD(2),
/**
* 群发
*/
PUSH(3);
public final Integer value;
TouchTypeEnum(Integer value) {
this.value = value;
}
}
package com.pcloud.book.group.facade;
import com.pcloud.book.group.entity.AppClickRecord;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@Api(description = "应用作品点击记录")
public interface AppClickRecordFacade {
@ApiOperation("新增应用作品点击记录")
@PostMapping("createAppClickRecord")
ResponseDto<?> createAppClickRecord(
@RequestBody @ApiParam("应用点击记录模型") AppClickRecord appClickRecord
) throws BizException;
}
...@@ -186,6 +186,16 @@ public interface BookGroupFacade { ...@@ -186,6 +186,16 @@ public interface BookGroupFacade {
@RequestMapping(value = "isSpecialAgent", method = RequestMethod.GET) @RequestMapping(value = "isSpecialAgent", method = RequestMethod.GET)
ResponseDto<Boolean> isSpecialAgent(@RequestHeader("token") String token) throws BizException, PermissionException, JsonParseException; ResponseDto<Boolean> isSpecialAgent(@RequestHeader("token") String token) throws BizException, PermissionException, JsonParseException;
@ApiOperation("获取应用作品统计")
@GetMapping("getAppStatistics")
ResponseDto<?> getAppStatistics(
@RequestHeader("token") String token,
@RequestParam("currentPage") Integer currentPage,
@RequestParam("numPerPage") Integer numPerPage,
@RequestParam("bookGroupId") Long bookGroupId,
@RequestParam(value = "qrcodeId",required = false) Long qrcodeId
) throws BizException, PermissionException, JsonParseException;
@ApiOperation(value = "导出社群码(编辑)", httpMethod = "GET") @ApiOperation(value = "导出社群码(编辑)", httpMethod = "GET")
@ApiImplicitParams({ @ApiImplicitParams({
......
package com.pcloud.book.group.facade.impl;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.group.biz.AppClickRecordBiz;
import com.pcloud.book.group.entity.AppClickRecord;
import com.pcloud.book.group.facade.AppClickRecordFacade;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description
* @Author ruansiyuan
* @Date 2019/5/30 12:00
**/
@RestController("appClickRecordFacade")
@RequestMapping("appClickRecord")
public class AppClickRecordFacadeImpl implements AppClickRecordFacade {
@Autowired
private AppClickRecordBiz appClickRecordBiz;
@ApiOperation("新增应用作品点击记录")
@PostMapping("createAppClickRecord")
@Override
public ResponseDto<?> createAppClickRecord(
@RequestBody @ApiParam("应用点击记录模型") AppClickRecord appClickRecord
) throws BizException {
if (appClickRecord==null){
throw new BookBizException(BookBizException.PARAM_IS_ERROR,"参数为空!");
}
return new ResponseDto<>(appClickRecordBiz.createAppClickRecord(appClickRecord));
}
}
...@@ -265,6 +265,26 @@ public class BookGroupFacadeImpl implements BookGroupFacade { ...@@ -265,6 +265,26 @@ public class BookGroupFacadeImpl implements BookGroupFacade {
return new ResponseDto<Boolean>(bookGroupBiz.isSpecialAgent(agentId)); return new ResponseDto<Boolean>(bookGroupBiz.isSpecialAgent(agentId));
} }
@ApiOperation("获取应用作品统计")
@GetMapping("getAppStatistics")
@Override
public ResponseDto<?> getAppStatistics(
@RequestHeader("token") String token,
@RequestParam("currentPage") Integer currentPage,
@RequestParam("numPerPage") Integer numPerPage,
@RequestParam("bookGroupId") Long bookGroupId,
@RequestParam(value = "qrcodeId",required = false) Long qrcodeId
) throws BizException, PermissionException {
Long partyId=(Long) SessionUtil.getVlaue(token, SessionUtil.PARTY_ID);
if (currentPage==null||currentPage<0||numPerPage==null||numPerPage<=0){
throw new BookBizException(BookBizException.PARAM_IS_ERROR,"分页参数错误!");
}
if (bookGroupId==null){
throw new BookBizException(BookBizException.PARAM_IS_ERROR,"社群码id不能为空!");
}
return new ResponseDto<>(bookGroupBiz.getAppStatistics(currentPage,numPerPage,bookGroupId,qrcodeId,partyId));
}
@Override @Override
@ApiOperation(value = "导出社群码(编辑)", httpMethod = "GET") @ApiOperation(value = "导出社群码(编辑)", httpMethod = "GET")
@RequestMapping(value = "exportGroupQrcode4Adviser", method = RequestMethod.GET) @RequestMapping(value = "exportGroupQrcode4Adviser", method = RequestMethod.GET)
......
package com.pcloud.book.keywords.biz; package com.pcloud.book.keywords.biz;
import com.pcloud.book.keywords.dto.KeywordDTO; import com.pcloud.book.keywords.dto.KeywordDTO;
import com.pcloud.book.keywords.dto.KeywordStatisticsDTO;
import com.pcloud.book.keywords.vo.KeywordVO; import com.pcloud.book.keywords.vo.KeywordVO;
import com.pcloud.book.keywords.vo.ListKeywordParam; import com.pcloud.book.keywords.vo.ListKeywordParam;
import com.pcloud.book.keywords.vo.ListKeywordVO; import com.pcloud.book.keywords.vo.ListKeywordVO;
...@@ -72,4 +73,13 @@ public interface BookKeywordBiz { ...@@ -72,4 +73,13 @@ public interface BookKeywordBiz {
*/ */
void sendKeywordMessage(String content, String weixinGroupId, String userWxId); void sendKeywordMessage(String content, String weixinGroupId, String userWxId);
/**
* 关键词统计
* @param currentPage
* @param numPerPage
* @param bookGroupId
* @param weixinGroupId
* @return
*/
PageBeanNew<KeywordStatisticsDTO> getKeywordStatistics(Integer currentPage, Integer numPerPage, Long bookGroupId, String weixinGroupId);
} }
...@@ -9,9 +9,14 @@ import com.pcloud.book.consumer.resource.ProductConsr; ...@@ -9,9 +9,14 @@ import com.pcloud.book.consumer.resource.ProductConsr;
import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr; import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.group.biz.BookGroupClassifyBiz; import com.pcloud.book.group.biz.BookGroupClassifyBiz;
import com.pcloud.book.group.biz.GroupQrcodeBiz; import com.pcloud.book.group.biz.GroupQrcodeBiz;
import com.pcloud.book.group.dao.AppTouchRecordDao;
import com.pcloud.book.group.dao.BookGroupDao; import com.pcloud.book.group.dao.BookGroupDao;
import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.dto.BookGroupDTO; import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO; import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO;
import com.pcloud.book.group.entity.AppTouchRecord;
import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.book.group.enums.TouchTypeEnum;
import com.pcloud.book.group.tools.SendWeixinRequestTools; import com.pcloud.book.group.tools.SendWeixinRequestTools;
import com.pcloud.book.group.vo.GroupQrcodeBaseInfoVO; import com.pcloud.book.group.vo.GroupQrcodeBaseInfoVO;
import com.pcloud.book.keywords.biz.BookGuideBiz; import com.pcloud.book.keywords.biz.BookGuideBiz;
...@@ -30,9 +35,6 @@ import com.pcloud.book.keywords.vo.UpdateGuideVO; ...@@ -30,9 +35,6 @@ import com.pcloud.book.keywords.vo.UpdateGuideVO;
import com.pcloud.channelcenter.wechat.dto.AccountSettingDto; import com.pcloud.channelcenter.wechat.dto.AccountSettingDto;
import com.pcloud.common.core.aspect.ParamLog; import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.utils.ListUtils; import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.cache.redis.JedisClusterUtils;
import com.pcloud.common.utils.string.StringUtil;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DataIntegrityViolationException;
...@@ -69,9 +71,13 @@ public class BookGuideBizImpl implements BookGuideBiz { ...@@ -69,9 +71,13 @@ public class BookGuideBizImpl implements BookGuideBiz {
@Autowired @Autowired
private GroupQrcodeBiz groupQrcodeBiz; private GroupQrcodeBiz groupQrcodeBiz;
@Autowired @Autowired
private AppTouchRecordDao appTouchRecordDao;
@Autowired
private BookClockCheck bookClockCheck; private BookClockCheck bookClockCheck;
@Autowired @Autowired
private BookClockKeywordDao bookClockKeywordDao; private BookClockKeywordDao bookClockKeywordDao;
@Autowired
private GroupQrcodeDao groupQrcodeDao;
@Override @Override
@ParamLog("新增欢迎语") @ParamLog("新增欢迎语")
...@@ -221,6 +227,8 @@ public class BookGuideBizImpl implements BookGuideBiz { ...@@ -221,6 +227,8 @@ public class BookGuideBizImpl implements BookGuideBiz {
handleUrl(replyMessages, wechatInfo, classifyQrcodeInfo); handleUrl(replyMessages, wechatInfo, classifyQrcodeInfo);
//推送消息 //推送消息
SendWeixinRequestTools.sendGuideMessage(replyMessages, robotId, weixinGroupId); SendWeixinRequestTools.sendGuideMessage(replyMessages, robotId, weixinGroupId);
//新增欢迎语应用触发记录
addGuideAppTouchRecord(replyMessages,weixinGroupId,classifyQrcodeInfo.getBookGroupId(),classifyQrcodeInfo.getClassifyId());
} }
SendWeixinRequestTools.sendKeywordsInfo(keywords, robotId, weixinGroupId); SendWeixinRequestTools.sendKeywordsInfo(keywords, robotId, weixinGroupId);
if (bookGuide != null && bookGuide.getIsRecommend() != null && bookGuide.getIsRecommend() == 1) { if (bookGuide != null && bookGuide.getIsRecommend() != null && bookGuide.getIsRecommend() == 1) {
...@@ -253,6 +261,28 @@ public class BookGuideBizImpl implements BookGuideBiz { ...@@ -253,6 +261,28 @@ public class BookGuideBizImpl implements BookGuideBiz {
} }
} }
/**
* 新增欢迎语应用触发记录
*/
private void addGuideAppTouchRecord(List<ReplyMessageVO> replyMessages, String weixinGroupId, Long bookGroupId, Long classifyId) {
for (ReplyMessageVO replyMessageVO:replyMessages){
if (ReplyTypeEnum.APP.value.equals(replyMessageVO.getReplyType())){
AppTouchRecord appTouchRecord = new AppTouchRecord();
appTouchRecord.setServeId(replyMessageVO.getServeId());
appTouchRecord.setServeType(replyMessageVO.getServeType());
appTouchRecord.setTouchType(TouchTypeEnum.GUIDE.value);
appTouchRecord.setBookGroupId(bookGroupId);
appTouchRecord.setClassifyId(classifyId);
GroupQrcode groupQrcode = groupQrcodeDao.getGroupQrcodeByGroupId(weixinGroupId);
if (groupQrcode != null) {
appTouchRecord.setQrcodeId(groupQrcode.getId());
}
appTouchRecord.setWeixinGroupId(weixinGroupId);
appTouchRecordDao.insert(appTouchRecord);
}
}
}
@ParamLog("处理地址") @ParamLog("处理地址")
private void handleUrl(List<ReplyMessageVO> replyMessages, AccountSettingDto accountSettingDto, GroupClassifyQrcodeDTO groupClassifyQrcodeDTO) { private void handleUrl(List<ReplyMessageVO> replyMessages, AccountSettingDto accountSettingDto, GroupClassifyQrcodeDTO groupClassifyQrcodeDTO) {
if (ListUtils.isEmpty(replyMessages)) { if (ListUtils.isEmpty(replyMessages)) {
......
...@@ -5,15 +5,21 @@ import com.pcloud.book.consumer.channel.QrcodeSceneConsr; ...@@ -5,15 +5,21 @@ import com.pcloud.book.consumer.channel.QrcodeSceneConsr;
import com.pcloud.book.consumer.resource.ProductConsr; import com.pcloud.book.consumer.resource.ProductConsr;
import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr; import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.group.biz.BookGroupClassifyBiz; import com.pcloud.book.group.biz.BookGroupClassifyBiz;
import com.pcloud.book.group.dao.AppTouchRecordDao;
import com.pcloud.book.group.dao.BookGroupDao; import com.pcloud.book.group.dao.BookGroupDao;
import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.dto.BookGroupDTO; import com.pcloud.book.group.dto.BookGroupDTO;
import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO; import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO;
import com.pcloud.book.group.entity.AppTouchRecord;
import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.book.group.enums.TouchTypeEnum;
import com.pcloud.book.group.tools.SendWeixinRequestTools; import com.pcloud.book.group.tools.SendWeixinRequestTools;
import com.pcloud.book.keywords.biz.BookKeywordBiz; import com.pcloud.book.keywords.biz.BookKeywordBiz;
import com.pcloud.book.keywords.dao.BookKeywordDao; import com.pcloud.book.keywords.dao.BookKeywordDao;
import com.pcloud.book.keywords.dao.BookKeywordRecordDao; import com.pcloud.book.keywords.dao.BookKeywordRecordDao;
import com.pcloud.book.keywords.dao.KeywordDao; import com.pcloud.book.keywords.dao.KeywordDao;
import com.pcloud.book.keywords.dto.KeywordDTO; import com.pcloud.book.keywords.dto.KeywordDTO;
import com.pcloud.book.keywords.dto.KeywordStatisticsDTO;
import com.pcloud.book.keywords.dto.ReplyKeywordDTO; import com.pcloud.book.keywords.dto.ReplyKeywordDTO;
import com.pcloud.book.keywords.entity.BookKeyword; import com.pcloud.book.keywords.entity.BookKeyword;
import com.pcloud.book.keywords.entity.BookKeywordRecord; import com.pcloud.book.keywords.entity.BookKeywordRecord;
...@@ -40,10 +46,13 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -40,10 +46,13 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* @author lily * @author lily
...@@ -67,6 +76,10 @@ public class BookKeywordBizImpl implements BookKeywordBiz { ...@@ -67,6 +76,10 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
private BookKeywordRecordDao bookKeywordRecordDao; private BookKeywordRecordDao bookKeywordRecordDao;
@Autowired @Autowired
private ProductConsr productConsr; private ProductConsr productConsr;
@Autowired
private AppTouchRecordDao appTouchRecordDao;
@Autowired
private GroupQrcodeDao groupQrcodeDao;
@Override @Override
@ParamLog("新增关键词") @ParamLog("新增关键词")
...@@ -222,10 +235,12 @@ public class BookKeywordBizImpl implements BookKeywordBiz { ...@@ -222,10 +235,12 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
} else { } else {
JedisClusterUtils.setJson("BOOK:KEYWORD:" + weixinGroupId + "-" + replyKeywordDTO.getKeywordId(), replyKeywordDTO.getKeywordId(), 10); JedisClusterUtils.setJson("BOOK:KEYWORD:" + weixinGroupId + "-" + replyKeywordDTO.getKeywordId(), replyKeywordDTO.getKeywordId(), 10);
insertBookKeywordRecord(classifyQrcodeInfo, replyKeywordDTO.getKeywordId(), userWxId, weixinGroupId, true); insertBookKeywordRecord(classifyQrcodeInfo, replyKeywordDTO.getKeywordId(), userWxId, weixinGroupId, true);
} }
//获取推送消息机器人 //获取推送消息机器人
String robotId = wechatGroupConsr.getRobotIdByGroupId(weixinGroupId); String robotId = wechatGroupConsr.getRobotIdByGroupId(weixinGroupId);
SendWeixinRequestTools.sendKeywordMessage(replyKeywordDTO, robotId, weixinGroupId); SendWeixinRequestTools.sendKeywordMessage(replyKeywordDTO, robotId, weixinGroupId);
//新增关键词触发记录
addKeywordAppTouchRecord(replyKeywordDTO, weixinGroupId, classifyQrcodeInfo.getClassifyId(), classifyQrcodeInfo.getBookGroupId());
//第一推送关键词消息埋点 //第一推送关键词消息埋点
String keywordsKey = "BOOK:FIRSTKEYWORD:" + DateUtils.getShortDateStr() + "-" + weixinGroupId; String keywordsKey = "BOOK:FIRSTKEYWORD:" + DateUtils.getShortDateStr() + "-" + weixinGroupId;
Boolean isSend = JedisClusterUtils.getJson(keywordsKey, Boolean.class); Boolean isSend = JedisClusterUtils.getJson(keywordsKey, Boolean.class);
...@@ -242,6 +257,29 @@ public class BookKeywordBizImpl implements BookKeywordBiz { ...@@ -242,6 +257,29 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
} }
} }
/**
* 关键词应用触发记录
*/
private void addKeywordAppTouchRecord(ReplyKeywordDTO replyKeywordDTO, String weixinGroupId, Long classifyId, Long bookGroupId) {
if (ReplyTypeEnum.APP.value.equals(replyKeywordDTO.getReplyType())) {
Keyword keyword = keywordDao.getById(replyKeywordDTO.getKeywordId());
if (keyword != null) {
AppTouchRecord appTouchRecord = new AppTouchRecord();
appTouchRecord.setServeId(keyword.getServeId());
appTouchRecord.setServeType(keyword.getServeType());
appTouchRecord.setTouchType(TouchTypeEnum.KEYWORD.value);
appTouchRecord.setBookGroupId(bookGroupId);
appTouchRecord.setClassifyId(classifyId);
GroupQrcode groupQrcode = groupQrcodeDao.getGroupQrcodeByGroupId(weixinGroupId);
if (groupQrcode != null) {
appTouchRecord.setQrcodeId(groupQrcode.getId());
}
appTouchRecord.setWeixinGroupId(weixinGroupId);
appTouchRecordDao.insert(appTouchRecord);
}
}
}
private void insertBookKeywordRecord(GroupClassifyQrcodeDTO classifyQrcodeInfo, Long keywordId, String userWxId, String weixinGroupId, Boolean isSend) { private void insertBookKeywordRecord(GroupClassifyQrcodeDTO classifyQrcodeInfo, Long keywordId, String userWxId, String weixinGroupId, Boolean isSend) {
BookKeywordRecord bookKeywordRecord = new BookKeywordRecord(); BookKeywordRecord bookKeywordRecord = new BookKeywordRecord();
BeanUtils.copyProperties(classifyQrcodeInfo, bookKeywordRecord); BeanUtils.copyProperties(classifyQrcodeInfo, bookKeywordRecord);
...@@ -251,4 +289,59 @@ public class BookKeywordBizImpl implements BookKeywordBiz { ...@@ -251,4 +289,59 @@ public class BookKeywordBizImpl implements BookKeywordBiz {
bookKeywordRecord.setSend(isSend); bookKeywordRecord.setSend(isSend);
bookKeywordRecordDao.insert(bookKeywordRecord); bookKeywordRecordDao.insert(bookKeywordRecord);
} }
@Override
public PageBeanNew<KeywordStatisticsDTO> getKeywordStatistics(Integer currentPage, Integer numPerPage, Long bookGroupId, String weixinGroupId) {
PageParam pageParam = new PageParam(currentPage, numPerPage);
Map<String, Object> map = new HashMap<>();
map.put("bookGroupId", bookGroupId);
//分页获取关键词,创建时间,名称信息
PageBeanNew<KeywordStatisticsDTO> pageBeanNew = bookKeywordDao.listPageNew(pageParam, map, "getKeywordInfoByBookGroupId");
List<KeywordStatisticsDTO> keywordStatisticsDTOS = pageBeanNew.getRecordList();
if (ListUtils.isEmpty(keywordStatisticsDTOS)) {
return pageBeanNew;
}
List<Long> keywordIds = keywordStatisticsDTOS.stream().filter(s -> s.getKeywordId() != null).map(KeywordStatisticsDTO::getKeywordId).collect(Collectors.toList());
//获取关键词累计触发次数,最近一次触发时间
List<KeywordStatisticsDTO> keywordStatisticsDTOSForOther = bookKeywordRecordDao.getKeywordStatistics(bookGroupId, weixinGroupId, keywordIds);
Map<Long, KeywordStatisticsDTO> otherMap = new HashMap<>();
if (!ListUtils.isEmpty(keywordStatisticsDTOSForOther)) {
for (KeywordStatisticsDTO in : keywordStatisticsDTOSForOther) {
otherMap.put(in.getKeywordId(), in);
}
}
//获取最近7天的触发次数
Date startDate = DateUtils.addDay(new Date(), -7);
List<KeywordStatisticsDTO> keywordStatisticsDTOSForTime = bookKeywordRecordDao.getKeywordStatisticsByTime(bookGroupId, weixinGroupId, keywordIds, startDate);
Map<Long, Integer> weekTouchCountMap = new HashMap<>();
if (!ListUtils.isEmpty(keywordStatisticsDTOSForOther)) {
for (KeywordStatisticsDTO in : keywordStatisticsDTOSForTime) {
weekTouchCountMap.put(in.getKeywordId(), in.getWeekTouchCount());
}
}
for (KeywordStatisticsDTO keywordStatisticsDTO : keywordStatisticsDTOS) {
Long keywordId = keywordStatisticsDTO.getKeywordId();
KeywordStatisticsDTO other = otherMap.get(keywordId);
if (other == null) {
//如果记录表里面没有就填充0
keywordStatisticsDTO.setTouchCount(0);
keywordStatisticsDTO.setWeekTouchCount(0);
keywordStatisticsDTO.setAvgDayTouchCount(0D);
} else {
//计算,填充
keywordStatisticsDTO.setTouchCount(other.getTouchCount());
keywordStatisticsDTO.setLastTouchTime(other.getLastTouchTime());
keywordStatisticsDTO.setWeekTouchCount(weekTouchCountMap.get(keywordId));
Date createDate = keywordStatisticsDTO.getKeywordCreateDate();
int days = (int) (DateUtils.getDayEnd(new Date()).getTime() - DateUtils.getDayEnd(createDate).getTime()) / 1000 / 60 / 60 / 24;
if (days <= 0) {
days = 1;
}
Double avgTouchCount = (double) keywordStatisticsDTO.getTouchCount() / (double) days;
keywordStatisticsDTO.setAvgDayTouchCount(new BigDecimal(avgTouchCount).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
}
}
return pageBeanNew;
}
} }
package com.pcloud.book.keywords.dao; package com.pcloud.book.keywords.dao;
import com.pcloud.book.keywords.dto.KeywordStatisticsDTO;
import com.pcloud.book.keywords.dto.KeywordUserCountDTO; import com.pcloud.book.keywords.dto.KeywordUserCountDTO;
import com.pcloud.book.keywords.entity.BookKeywordRecord; import com.pcloud.book.keywords.entity.BookKeywordRecord;
import com.pcloud.common.core.dao.BaseDao; import com.pcloud.common.core.dao.BaseDao;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -18,4 +20,23 @@ public interface BookKeywordRecordDao extends BaseDao<BookKeywordRecord> { ...@@ -18,4 +20,23 @@ public interface BookKeywordRecordDao extends BaseDao<BookKeywordRecord> {
* @Date:2019/5/15 16:42 * @Date:2019/5/15 16:42
*/ */
Map<Long, KeywordUserCountDTO> listKeywordUseCount(List<Long> qrcodeIds); Map<Long, KeywordUserCountDTO> listKeywordUseCount(List<Long> qrcodeIds);
/**
* 获得统计
* @param bookGroupId
* @param weixinGroupId
* @param keywordIds
* @return
*/
List<KeywordStatisticsDTO> getKeywordStatistics(Long bookGroupId, String weixinGroupId, List<Long> keywordIds);
/**
* 根据时间获取触发次数
* @param bookGroupId
* @param weixinGroupId
* @param keywordIds
* @param startDate
* @return
*/
List<KeywordStatisticsDTO> getKeywordStatisticsByTime(Long bookGroupId, String weixinGroupId, List<Long> keywordIds, Date startDate);
} }
package com.pcloud.book.keywords.dao.impl; package com.pcloud.book.keywords.dao.impl;
import com.pcloud.book.keywords.dao.BookKeywordRecordDao; import com.pcloud.book.keywords.dao.BookKeywordRecordDao;
import com.pcloud.book.keywords.dto.KeywordStatisticsDTO;
import com.pcloud.book.keywords.dto.KeywordUserCountDTO; import com.pcloud.book.keywords.dto.KeywordUserCountDTO;
import com.pcloud.book.keywords.entity.BookKeywordRecord; import com.pcloud.book.keywords.entity.BookKeywordRecord;
import com.pcloud.common.core.dao.BaseDaoImpl; import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -20,4 +23,23 @@ public class BookKeywordRecordDaoImpl extends BaseDaoImpl<BookKeywordRecord> imp ...@@ -20,4 +23,23 @@ public class BookKeywordRecordDaoImpl extends BaseDaoImpl<BookKeywordRecord> imp
public Map<Long, KeywordUserCountDTO> listKeywordUseCount(List<Long> qrcodeIds) { public Map<Long, KeywordUserCountDTO> listKeywordUseCount(List<Long> qrcodeIds) {
return this.getSqlSession().selectMap(this.getStatement("listKeywordUseCount"), qrcodeIds, "qrcodeId"); return this.getSqlSession().selectMap(this.getStatement("listKeywordUseCount"), qrcodeIds, "qrcodeId");
} }
@Override
public List<KeywordStatisticsDTO> getKeywordStatistics(Long bookGroupId, String weixinGroupId, List<Long> keywordIds) {
Map<String,Object> map=new HashMap<>();
map.put("bookGroupId",bookGroupId);
map.put("weixinGroupId",weixinGroupId);
map.put("keywordIds",keywordIds);
return this.getSqlSession().selectList(this.getStatement("getKeywordStatistics"), map);
}
@Override
public List<KeywordStatisticsDTO> getKeywordStatisticsByTime(Long bookGroupId, String weixinGroupId, List<Long> keywordIds, Date startDate) {
Map<String,Object> map=new HashMap<>();
map.put("bookGroupId",bookGroupId);
map.put("weixinGroupId",weixinGroupId);
map.put("keywordIds",keywordIds);
map.put("startDate",startDate);
return this.getSqlSession().selectList(this.getStatement("getKeywordStatisticsByTime"), map);
}
} }
package com.pcloud.book.keywords.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
/**
* @Description
* @Author ruansiyuan
* @Date 2019/5/28 14:38
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class KeywordStatisticsDTO implements Serializable {
private static final long serialVersionUID = -1982118870769572480L;
@ApiModelProperty("关键词id")
private Long keywordId;
@ApiModelProperty("关键词")
private String keyword;
@ApiModelProperty("累计触发次数")
private Integer touchCount;
@ApiModelProperty("最近7天触发次数")
private Integer weekTouchCount;
@ApiModelProperty("日平均触发次数")
private Double avgDayTouchCount;
@ApiModelProperty("最近触发时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date lastTouchTime;
@ApiModelProperty("关键词创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date keywordCreateDate;
public Long getKeywordId() {
return keywordId;
}
public void setKeywordId(Long keywordId) {
this.keywordId = keywordId;
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
public Integer getTouchCount() {
return touchCount;
}
public void setTouchCount(Integer touchCount) {
this.touchCount = touchCount;
}
public Integer getWeekTouchCount() {
return weekTouchCount;
}
public void setWeekTouchCount(Integer weekTouchCount) {
this.weekTouchCount = weekTouchCount;
}
public Double getAvgDayTouchCount() {
return avgDayTouchCount;
}
public void setAvgDayTouchCount(Double avgDayTouchCount) {
this.avgDayTouchCount = avgDayTouchCount;
}
public Date getLastTouchTime() {
return lastTouchTime;
}
public void setLastTouchTime(Date lastTouchTime) {
this.lastTouchTime = lastTouchTime;
}
public Date getKeywordCreateDate() {
return keywordCreateDate;
}
public void setKeywordCreateDate(Date keywordCreateDate) {
this.keywordCreateDate = keywordCreateDate;
}
@Override
public String toString() {
return "KeywordStatisticsDTO{" +
"keywordId=" + keywordId +
", keyword='" + keyword + '\'' +
", touchCount=" + touchCount +
", weekTouchCount=" + weekTouchCount +
", avgDayTouchCount=" + avgDayTouchCount +
", lastTouchTime=" + lastTouchTime +
", keywordCreateDate=" + keywordCreateDate +
'}';
}
}
...@@ -96,5 +96,14 @@ public interface BookKeywordFacade { ...@@ -96,5 +96,14 @@ public interface BookKeywordFacade {
ResponseDto<PageBeanNew<ListKeywordVO>> listKeywordsByClassify(@RequestHeader("token") String token, @RequestBody ListKeywordParam listKeywordParam) ResponseDto<PageBeanNew<ListKeywordVO>> listKeywordsByClassify(@RequestHeader("token") String token, @RequestBody ListKeywordParam listKeywordParam)
throws BizException; throws BizException;
@ApiOperation("获取关键词统计列表")
@GetMapping("getKeywordStatistics")
ResponseDto<?> getKeywordStatistics(
@RequestHeader("token") String token,
@RequestParam("currentPage") Integer currentPage,
@RequestParam("numPerPage") Integer numPerPage,
@RequestParam("bookGroupId") Long bookGroupId,
@RequestParam(value = "weixinGroupId",required = false) String weixinGroupId
) throws BizException, PermissionException;
} }
package com.pcloud.book.keywords.facade.impl; package com.pcloud.book.keywords.facade.impl;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.keywords.biz.BookKeywordBiz; import com.pcloud.book.keywords.biz.BookKeywordBiz;
import com.pcloud.book.keywords.facade.BookKeywordFacade; import com.pcloud.book.keywords.facade.BookKeywordFacade;
import com.pcloud.book.keywords.vo.KeywordVO; import com.pcloud.book.keywords.vo.KeywordVO;
...@@ -14,6 +15,7 @@ import com.pcloud.common.page.PageBeanNew; ...@@ -14,6 +15,7 @@ import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.permission.PermissionException; import com.pcloud.common.permission.PermissionException;
import com.pcloud.common.utils.SessionUtil; import com.pcloud.common.utils.SessionUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -87,4 +89,24 @@ public class BookKeywordFacadeImpl implements BookKeywordFacade { ...@@ -87,4 +89,24 @@ public class BookKeywordFacadeImpl implements BookKeywordFacade {
PageBeanNew<ListKeywordVO> pageBeanNew = bookKeywordBiz.listKeywordsByClassify(listKeywordParam); PageBeanNew<ListKeywordVO> pageBeanNew = bookKeywordBiz.listKeywordsByClassify(listKeywordParam);
return new ResponseDto<>(pageBeanNew); return new ResponseDto<>(pageBeanNew);
} }
@ApiOperation("获取关键词统计列表")
@GetMapping("getKeywordStatistics")
@Override
public ResponseDto<?> getKeywordStatistics(
@RequestHeader("token") String token,
@RequestParam("currentPage") Integer currentPage,
@RequestParam("numPerPage") Integer numPerPage,
@RequestParam("bookGroupId") Long bookGroupId,
@RequestParam(value = "weixinGroupId",required = false) String weixinGroupId
) throws BizException, PermissionException {
SessionUtil.getVlaue(token, SessionUtil.PARTY_ID);
if (currentPage==null||currentPage<0||numPerPage==null||numPerPage<=0){
throw new BookBizException(BookBizException.PARAM_IS_ERROR,"分页参数错误!");
}
if (bookGroupId==null){
throw new BookBizException(BookBizException.PARAM_IS_ERROR,"社群码id不能为空!");
}
return new ResponseDto<>(bookKeywordBiz.getKeywordStatistics(currentPage,numPerPage,bookGroupId,weixinGroupId));
}
} }
...@@ -8,18 +8,19 @@ import com.pcloud.book.consumer.channel.QrcodeSceneConsr; ...@@ -8,18 +8,19 @@ import com.pcloud.book.consumer.channel.QrcodeSceneConsr;
import com.pcloud.book.consumer.resource.ProductConsr; import com.pcloud.book.consumer.resource.ProductConsr;
import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr; import com.pcloud.book.consumer.wechatgroup.WechatGroupConsr;
import com.pcloud.book.group.biz.BookGroupClassifyBiz; import com.pcloud.book.group.biz.BookGroupClassifyBiz;
import com.pcloud.book.group.dao.AppTouchRecordDao;
import com.pcloud.book.group.dao.BookGroupClassifyDao; import com.pcloud.book.group.dao.BookGroupClassifyDao;
import com.pcloud.book.group.dao.GroupQrcodeDao; import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.dto.ClassifyDTO; import com.pcloud.book.group.dto.ClassifyDTO;
import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO; import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO;
import com.pcloud.book.group.entity.AppTouchRecord;
import com.pcloud.book.group.entity.GroupQrcode; import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.book.group.enums.TouchTypeEnum;
import com.pcloud.book.group.tools.SendWeixinRequestTools; import com.pcloud.book.group.tools.SendWeixinRequestTools;
import com.pcloud.book.push.biz.PushBiz; import com.pcloud.book.push.biz.PushBiz;
import com.pcloud.book.push.check.PushCheck; import com.pcloud.book.push.check.PushCheck;
import com.pcloud.book.push.dao.*; import com.pcloud.book.push.dao.*;
import com.pcloud.book.push.dto.PushDTO; import com.pcloud.book.push.dto.*;
import com.pcloud.book.push.dto.PushGroupDTO;
import com.pcloud.book.push.dto.PushRecordDTO;
import com.pcloud.book.push.entity.*; import com.pcloud.book.push.entity.*;
import com.pcloud.book.push.enums.ItemTypeEnum; import com.pcloud.book.push.enums.ItemTypeEnum;
import com.pcloud.book.push.enums.PushStatusEnum; import com.pcloud.book.push.enums.PushStatusEnum;
...@@ -88,6 +89,8 @@ public class PushBizImpl implements PushBiz { ...@@ -88,6 +89,8 @@ public class PushBizImpl implements PushBiz {
private QrcodeSceneConsr qrcodeSceneConsr; private QrcodeSceneConsr qrcodeSceneConsr;
@Autowired @Autowired
private BookGroupClassifyDao bookGroupClassifyDao; private BookGroupClassifyDao bookGroupClassifyDao;
@Autowired
private AppTouchRecordDao appTouchRecordDao;
private static final String PUSH_SCHEDULE_PRE="BOOK_GROUP_PUSH_"; private static final String PUSH_SCHEDULE_PRE="BOOK_GROUP_PUSH_";
...@@ -297,6 +300,8 @@ public class PushBizImpl implements PushBiz { ...@@ -297,6 +300,8 @@ public class PushBizImpl implements PushBiz {
sendArticleMessageVO.setTitle(appDto.getTitle()); sendArticleMessageVO.setTitle(appDto.getTitle());
sendArticleMessageVO.setPushGroupRecordId(pushGroupRecordId); sendArticleMessageVO.setPushGroupRecordId(pushGroupRecordId);
WxGroupSDK.sendArticleMessage(sendArticleMessageVO); WxGroupSDK.sendArticleMessage(sendArticleMessageVO);
//新增群发应用作品触发记录
addPushAppTouchRecord(pushItem, groupId, classifyDTO.getId(), classifyDTO.getBookGroupId());
} }
} }
if (pushItem.getProductId() != null) { if (pushItem.getProductId() != null) {
...@@ -316,6 +321,8 @@ public class PushBizImpl implements PushBiz { ...@@ -316,6 +321,8 @@ public class PushBizImpl implements PushBiz {
sendArticleMessageVO.setTitle(productDto.getProductName()); sendArticleMessageVO.setTitle(productDto.getProductName());
sendArticleMessageVO.setPushGroupRecordId(pushGroupRecordId); sendArticleMessageVO.setPushGroupRecordId(pushGroupRecordId);
WxGroupSDK.sendArticleMessage(sendArticleMessageVO); WxGroupSDK.sendArticleMessage(sendArticleMessageVO);
//新增群发应用作品触发记录
addPushAppTouchRecord(pushItem, groupId, classifyDTO.getId(), classifyDTO.getBookGroupId());
} }
} }
} }
...@@ -330,6 +337,30 @@ public class PushBizImpl implements PushBiz { ...@@ -330,6 +337,30 @@ public class PushBizImpl implements PushBiz {
} }
} }
/**
* 新增群发应用作品触发记录
*/
private void addPushAppTouchRecord(PushItem pushItem, String weixinGroupId, Long classifyId, Long bookGroupId) {
AppTouchRecord appTouchRecord = new AppTouchRecord();
if (pushItem.getAppId() != null) {
appTouchRecord.setServeId(pushItem.getAppId());
appTouchRecord.setServeType("APP");
}
if (pushItem.getProductId() != null) {
appTouchRecord.setServeId(pushItem.getProductId());
appTouchRecord.setServeType("PRODUCT");
}
appTouchRecord.setTouchType(TouchTypeEnum.PUSH.value);
appTouchRecord.setBookGroupId(bookGroupId);
appTouchRecord.setClassifyId(classifyId);
GroupQrcode groupQrcode = groupQrcodeDao.getGroupQrcodeByGroupId(weixinGroupId);
if (groupQrcode != null) {
appTouchRecord.setQrcodeId(groupQrcode.getId());
}
appTouchRecord.setWeixinGroupId(weixinGroupId);
appTouchRecordDao.insert(appTouchRecord);
}
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ParamLog("更新群发") @ParamLog("更新群发")
@Override @Override
......
<?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.group.dao.impl.AppClickRecordDaoImpl">
<resultMap id="BaseResultMap" type="com.pcloud.book.group.entity.AppClickRecord">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="book_group_id" property="bookGroupId" jdbcType="BIGINT"/>
<result column="classify_id" property="classifyId" jdbcType="BIGINT"/>
<result column="qrcode_id" property="qrcodeId" jdbcType="BIGINT"/>
<result column="weixin_group_id" property="weixinGroupId" jdbcType="VARCHAR"/>
<result column="serve_id" property="serveId" jdbcType="BIGINT"/>
<result column="serve_type" property="serveType" jdbcType="VARCHAR"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id, book_group_id, classify_id, qrcode_id, weixin_group_id, serve_id, serve_type, create_time
</sql>
<insert id="insert" parameterType="com.pcloud.book.group.entity.AppTouchRecord" useGeneratedKeys="true"
keyProperty="id">
insert into app_click_record
<trim prefix="(" suffix=")" suffixOverrides=",">
book_group_id,
classify_id,
qrcode_id,
weixin_group_id,
serve_id,
serve_type,
create_time
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
#{bookGroupId,jdbcType=BIGINT},
#{classifyId,jdbcType=BIGINT},
#{qrcodeId,jdbcType=BIGINT},
#{weixinGroupId,jdbcType=VARCHAR},
#{serveId,jdbcType=BIGINT},
#{serveType,jdbcType=VARCHAR},
NOW(),
</trim>
</insert>
<!--根据作品或应用id集合获取统计-->
<select id="getClickStatisticsByServeIds" parameterType="map" resultType="com.pcloud.book.group.dto.AppStatisticsDTO">
SELECT
t.serve_id serveId,
count(1) clickCount
FROM
app_click_record t
WHERE
t.serve_id IN
<foreach collection="serveIds" index="index" item="item" close=")" open="(" separator=",">
#{item}
</foreach>
<if test="bookGroupId!=null">
AND t.book_group_id = #{bookGroupId}
</if>
<if test="qrcodeId!=null">
AND t.qrcode_id = #{qrcodeId}
</if>
GROUP BY
t.serve_id
</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.group.dao.impl.AppTouchRecordDaoImpl">
<resultMap id="BaseResultMap" type="com.pcloud.book.group.entity.AppTouchRecord">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="book_group_id" property="bookGroupId" jdbcType="BIGINT"/>
<result column="classify_id" property="classifyId" jdbcType="BIGINT"/>
<result column="qrcode_id" property="qrcodeId" jdbcType="BIGINT"/>
<result column="weixin_group_id" property="weixinGroupId" jdbcType="VARCHAR"/>
<result column="serve_id" property="serveId" jdbcType="BIGINT"/>
<result column="serve_type" property="serveType" jdbcType="VARCHAR"/>
<result column="touch_type" property="touchType" jdbcType="INTEGER"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id, book_group_id, classify_id, qrcode_id, weixin_group_id, serve_id, serve_type, touch_type, create_time
</sql>
<insert id="insert" parameterType="com.pcloud.book.group.entity.AppTouchRecord" useGeneratedKeys="true"
keyProperty="id">
insert into app_touch_record
<trim prefix="(" suffix=")" suffixOverrides=",">
book_group_id,
classify_id,
qrcode_id,
weixin_group_id,
serve_id,
serve_type,
touch_type,
create_time
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
#{bookGroupId,jdbcType=BIGINT},
#{classifyId,jdbcType=BIGINT},
#{qrcodeId,jdbcType=BIGINT},
#{weixinGroupId,jdbcType=VARCHAR},
#{serveId,jdbcType=BIGINT},
#{serveType,jdbcType=VARCHAR},
#{touchType,jdbcType=INTEGER},
NOW(),
</trim>
</insert>
<!--获取应用统计数据-->
<select id="getAppTouchStatistics" parameterType="map" resultType="com.pcloud.book.group.dto.AppStatisticsDTO">
SELECT
t.serve_id serveId,
t.serve_type serveType,
COUNT(1) pushCount
FROM
app_touch_record t
WHERE 1=1
<if test="bookGroupId!=null">
AND t.book_group_id =#{bookGroupId}
</if>
<if test="qrcodeId!=null">
AND t.qrcode_id =#{qrcodeId}
</if>
GROUP BY
t.serve_id
order by t.create_time desc
</select>
</mapper>
\ No newline at end of file
...@@ -194,4 +194,20 @@ ...@@ -194,4 +194,20 @@
AND book_group_id = #{bookGroupId} AND book_group_id = #{bookGroupId}
</select> </select>
<!--根据社群书id获取关键词统计-->
<select id="getKeywordInfoByBookGroupId" parameterType="map" resultType="com.pcloud.book.keywords.dto.KeywordStatisticsDTO">
SELECT
t.keyword_id as keywordId,
t.create_time as keywordCreateDate,
t.is_warehouse as isWarehouse,
t.warehouse_id as warehouseId,
t2.keywords as keyword
FROM
book_keyword t
INNER JOIN keyword t2 on t.keyword_id=t2.id
WHERE
t.is_delete = 0
AND t.book_group_id = #{bookGroupId}
order by t.create_time desc
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -54,4 +54,51 @@ ...@@ -54,4 +54,51 @@
weixin_qrcode_id weixin_qrcode_id
</select> </select>
<!--获得统计-->
<select id="getKeywordStatistics" parameterType="map" resultType="com.pcloud.book.keywords.dto.KeywordStatisticsDTO">
SELECT
t.keyword_id keywordId,
COUNT(t.id) touchCount,
MAX(t.create_time) lastTouchTime
FROM
book_keyword_record t
WHERE
t.keyword_id IN
<foreach collection="keywordIds" separator="," open="(" close=")" item="item" index="index">
#{item}
</foreach>
<if test="bookGroupId!=null">
AND t.book_group_id = #{bookGroupId}
</if>
<if test="weixinGroupId!=null">
AND t.weixin_group_id = #{weixinGroupId}
</if>
GROUP BY
t.keyword_id
</select>
<!--根据时间获取触发次数-->
<select id="getKeywordStatisticsByTime" parameterType="map" resultType="com.pcloud.book.keywords.dto.KeywordStatisticsDTO">
SELECT
t.keyword_id keywordId,
COUNT(t.id) weekTouchCount
FROM
book_keyword_record t
WHERE
t.keyword_id IN
<foreach collection="keywordIds" separator="," open="(" close=")" item="item" index="index">
#{item}
</foreach>
<if test="bookGroupId!=null">
AND t.book_group_id = #{bookGroupId}
</if>
<if test="weixinGroupId!=null">
AND t.weixin_group_id = #{weixinGroupId}
</if>
<if test="startDate!=null">
AND t.create_time>#{startDate}
</if>
GROUP BY
t.keyword_id
</select>
</mapper> </mapper>
\ No newline at end of file
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