|
|
@@ -1,9 +1,12 @@
|
|
|
package com.ytpm.novel.service.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
import cn.hutool.core.util.RandomUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.ytpm.advertise.enums.AdPlatformTypeEnum;
|
|
|
import com.ytpm.advertise.enums.AdSourceTypeEnum;
|
|
|
import com.ytpm.agent.enums.AdRecordEnum;
|
|
|
@@ -13,6 +16,7 @@ import com.ytpm.agent.view.AgentTopCountView;
|
|
|
import com.ytpm.app.model.YtDyzAdRecord;
|
|
|
import com.ytpm.app.model.YtNovelAdRecord;
|
|
|
import com.ytpm.app.model.YtNovelUser;
|
|
|
+import com.ytpm.app.param.DyzAdRecordDelayParam;
|
|
|
import com.ytpm.app.param.DyzAdRecordParam;
|
|
|
import com.ytpm.feign.RiskFeign;
|
|
|
import com.ytpm.general.RepMessage;
|
|
|
@@ -31,9 +35,10 @@ import com.ytpm.novel.dao.AdRecordMapper;
|
|
|
import com.ytpm.novel.dao.AppUserMapper;
|
|
|
import com.ytpm.novel.dao.NovelAdRecordMapper;
|
|
|
import com.ytpm.novel.model.param.NovelAdRecordParam;
|
|
|
-import com.ytpm.novel.service.AdService;
|
|
|
import com.ytpm.novel.model.view.AgentNetworkAgg;
|
|
|
+import com.ytpm.novel.service.AdService;
|
|
|
import com.ytpm.novel.service.AppUserService;
|
|
|
+import com.ytpm.util.DateUtil;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
@@ -79,7 +84,7 @@ public class AdServiceImpl implements AdService {
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public Result<?> saveRecord(DyzAdRecordParam param) {
|
|
|
+ public Result<String> saveRecord(DyzAdRecordParam param) {
|
|
|
YtNovelUser user = appUserMapper.selectPrimaryKey(param.getUserId());
|
|
|
log.debug(StrUtil.format("[saveRecord] userId:{} revenue:{} ", param.getUserId(), param.getRevenue()));
|
|
|
if (Objects.isNull(user)) {
|
|
|
@@ -93,7 +98,7 @@ public class AdServiceImpl implements AdService {
|
|
|
if (AdSourceTypeEnum.rewarded_video.getAdSourceType() == param.getAdSourceType()) {
|
|
|
Result<?> result = riskFeign.checkAdRisk(user);
|
|
|
if (result.getCode() != 200) {
|
|
|
- Result<Object> resultObj = new Result<>(StatusCode.ACCESS_ERR, getTipsMsg());
|
|
|
+ Result<String> resultObj = new Result<>(StatusCode.ACCESS_ERR, getTipsMsg());
|
|
|
if ("766".contains(result.getMessage())) {
|
|
|
// 成本收益限制处理返回值 766
|
|
|
resultObj.setData(result.getMessage());
|
|
|
@@ -113,6 +118,84 @@ public class AdServiceImpl implements AdService {
|
|
|
return split[RandomUtil.randomInt(split.length)];
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Result<String> delaySaveRecord(DyzAdRecordDelayParam param) {
|
|
|
+ YtNovelUser user = appUserMapper.selectPrimaryKey(param.getUserId());
|
|
|
+ if (Objects.isNull(user)) {
|
|
|
+ return Result.resultOk(RepMessage.SAVE_SUCCESS);
|
|
|
+ }
|
|
|
+ if (!UserStatusEnum.NORMAL.getCode().equals(user.getUserStatus())) {
|
|
|
+ return new Result<>(StatusCode.ACCESS_ERR, getTipsMsg());
|
|
|
+ }
|
|
|
+ log.info("[delaySaveRecord] userId:{}", param.getUserId());
|
|
|
+ if (CollectionUtil.isNotEmpty(param.getAdRecords())) {
|
|
|
+ YtDyzAdRecord insertEntity;
|
|
|
+ List<String> filter = new ArrayList<>();
|
|
|
+ List<YtDyzAdRecord> saveList = new ArrayList<>();
|
|
|
+ BigDecimal totalRevenue = BigDecimal.ZERO;
|
|
|
+ for (DyzAdRecordParam adParam : param.getAdRecords()) {
|
|
|
+ handleTimeNull(adParam);
|
|
|
+ String takuAdId = null;
|
|
|
+ if (StrUtil.isNotEmpty(adParam.getResultJson())) {
|
|
|
+ JSONObject json = JSONObject.parseObject(adParam.getResultJson());
|
|
|
+ takuAdId = json.getString("id");
|
|
|
+ }
|
|
|
+ // 广告数据校验 重复数据过滤
|
|
|
+ if (StrUtil.isNotEmpty(takuAdId)) {
|
|
|
+ if (filter.contains(takuAdId)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ YtDyzAdRecord record = adRecordMapper.getByTakuAdId(user.getUserId(), takuAdId);
|
|
|
+ if (record != null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ filter.add(takuAdId);
|
|
|
+ }
|
|
|
+ insertEntity = new YtDyzAdRecord();
|
|
|
+ BeanUtils.copyProperties(adParam, insertEntity);
|
|
|
+ insertEntity.setRecordId(IdUtil.fastSimpleUUID());
|
|
|
+ insertEntity.setUserId(user.getUserId());
|
|
|
+ insertEntity.setNetworkName(AdPlatformTypeEnum.getDesc(Integer.parseInt(adParam.getNetworkFormId())));
|
|
|
+ saveList.add(insertEntity);
|
|
|
+ if (AdRecordEnum.LOGIN_BEFORE.getCode().equals(param.getLoginStatus())
|
|
|
+ && AdSourceTypeEnum.rewarded_video.getAdSourceType() == adParam.getAdSourceType()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (insertEntity.getRevenue() != null) {
|
|
|
+ totalRevenue = totalRevenue.add(insertEntity.getRevenue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (CollUtil.isNotEmpty(saveList)) {
|
|
|
+ log.info("[delaySaveRecord] saveCount:{}, {}", saveList.size(), saveList.stream().map(YtDyzAdRecord::getRecordId).collect(Collectors.joining(",")));
|
|
|
+ if (param.getLoginStatus() != null && AdRecordEnum.LOGIN_BEFORE.getCode().equals(param.getLoginStatus())) {
|
|
|
+ adRecordMapper.batchAddVisitor(saveList);
|
|
|
+ } else {
|
|
|
+ adRecordMapper.batchAdd(saveList);
|
|
|
+ }
|
|
|
+ appUserMapper.updateTotal(user.getUserId(), saveList.size(), totalRevenue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Result.resultOk(RepMessage.SAVE_SUCCESS);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理传入广告记录 beginTime FinishTime可能为null的情况
|
|
|
+ */
|
|
|
+ private void handleTimeNull(DyzAdRecordParam param) {
|
|
|
+ param.setFinishTime(verifyTimeParam("finishTime", param.getFinishTime(), null));
|
|
|
+ param.setBeginTime(verifyTimeParam("beginTime", param.getBeginTime(), param.getFinishTime()));
|
|
|
+ }
|
|
|
+
|
|
|
+ private String verifyTimeParam(String fieldName, String value, String defaultValue) {
|
|
|
+ if (Objects.isNull(value) || "null".equals(value)) {
|
|
|
+ if ("null".equals(value)) {
|
|
|
+ log.warn("param[{}] value '{}' is null !", fieldName, value);
|
|
|
+ }
|
|
|
+ return StrUtil.isEmpty(defaultValue) ? DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss") : defaultValue;
|
|
|
+ }
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 根据应用查询广告数量
|
|
|
*/
|
|
|
@@ -290,12 +373,7 @@ public class AdServiceImpl implements AdService {
|
|
|
public String saveRecordAndChangeUser(DyzAdRecordParam param, YtNovelUser user) {
|
|
|
//增加广告记录
|
|
|
YtDyzAdRecord adRecord = new YtDyzAdRecord();
|
|
|
- if (Objects.isNull(param.getBeginTime()) || "null".equals(param.getBeginTime())) {
|
|
|
- if ("null".equals(param.getBeginTime())) {
|
|
|
- log.warn("param beginTime is null !");
|
|
|
- }
|
|
|
- param.setBeginTime(param.getFinishTime());
|
|
|
- }
|
|
|
+ handleTimeNull(param);
|
|
|
BeanUtils.copyProperties(param, adRecord);
|
|
|
adRecord.setRecordId(IdUtil.fastSimpleUUID());
|
|
|
adRecord.setNetworkName(AdPlatformTypeEnum.getDesc(Integer.parseInt(param.getNetworkFormId())));
|
|
|
@@ -304,12 +382,9 @@ public class AdServiceImpl implements AdService {
|
|
|
} else {
|
|
|
adRecordMapper.addOne(adRecord);
|
|
|
}
|
|
|
- boolean updateUserTotal = true;
|
|
|
+ boolean updateUserTotal = !AdRecordEnum.LOGIN_BEFORE.getCode().equals(param.getLoginStatus())
|
|
|
+ || AdSourceTypeEnum.rewarded_video.getAdSourceType() != param.getAdSourceType();
|
|
|
// 游客登陆下 激励视频广告记录不算入用户统计
|
|
|
- if (AdRecordEnum.LOGIN_BEFORE.getCode().equals(param.getLoginStatus())
|
|
|
- && AdSourceTypeEnum.rewarded_video.getAdSourceType() == param.getAdSourceType()) {
|
|
|
- updateUserTotal = false;
|
|
|
- }
|
|
|
if (updateUserTotal) {
|
|
|
//修改用户信息, 广告次数+1 总收益 + revenue
|
|
|
if (param.getRevenue() == null) {
|
|
|
@@ -342,7 +417,7 @@ public class AdServiceImpl implements AdService {
|
|
|
BigDecimal redPackRevenue = BigDecimal.ZERO;
|
|
|
if (userRevenueRate != null) {
|
|
|
record.setRevenueRate(userRevenueRate.toPlainString());
|
|
|
- if(record.getRevenue() != null && record.getRevenue().compareTo(BigDecimal.ZERO) > 0){
|
|
|
+ if (record.getRevenue() != null && record.getRevenue().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
redPackRevenue = record.getRevenue().multiply(userRevenueRate).setScale(5, RoundingMode.HALF_UP);
|
|
|
}
|
|
|
}
|