Procházet zdrojové kódy

feat: 答题服务新增接口:延迟保存广告记录

hidewnd před 3 týdny
rodič
revize
5d9e4a1b8a

+ 28 - 0
yt-common/src/main/java/com/ytpm/app/param/DyzAdRecordDelayParam.java

@@ -0,0 +1,28 @@
+package com.ytpm.app.param;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author lih
+ * @date 2025-10-14 17:41
+ */
+@Data
+@ApiModel("延迟保存广告记录入参")
+public class DyzAdRecordDelayParam implements Serializable {
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("登陆前/登陆后")
+    private Integer loginStatus;
+
+    @ApiModelProperty("暂存广告记录")
+    private List<DyzAdRecordParam> adRecords;
+
+}

+ 1 - 1
yt-common/src/main/java/com/ytpm/general/Result.java

@@ -23,7 +23,7 @@ public class Result<T> implements Serializable {
      *
      * @return
      */
-    public static <T> Result resultOk(String msg) {
+    public static <T> Result<T> resultOk(String msg) {
         return resultOk(msg, null);
     }
     /**

+ 11 - 1
yt-question/yt-question-service/src/main/java/com/ytpm/question/controller/AdController.java

@@ -2,6 +2,7 @@ package com.ytpm.question.controller;
 
 import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.agent.view.AgentTopCountView;
+import com.ytpm.app.param.DyzAdRecordDelayParam;
 import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.general.Result;
 import com.ytpm.middle.view.DashboardRankingListVO;
@@ -38,10 +39,19 @@ public class AdController {
      */
     @ApiOperation("保存")
     @PostMapping("/saveRecord")
-    public Result<?> saveRecord(@RequestBody DyzAdRecordParam param) {
+    public Result<String> saveRecord(@RequestBody DyzAdRecordParam param) {
         return adService.saveRecord(param);
     }
 
+    /**
+     * 保存广告记录
+     */
+    @ApiOperation("延迟保存广告记录")
+    @PostMapping("/saveRecord/delay")
+    public Result<String> delaySaveRecord(@RequestBody DyzAdRecordDelayParam param) {
+        return adService.delaySaveRecord(param);
+    }
+
     /**
      * 根据应用ID查询广告数
      */

+ 4 - 0
yt-question/yt-question-service/src/main/java/com/ytpm/question/dao/AdRecordMapper.java

@@ -19,11 +19,15 @@ public interface AdRecordMapper {
      */
     void addOne(YtDyzAdRecord adRecord);
 
+    void batchAdd(@Param("adRecords") List<YtDyzAdRecord> adRecords);
+
     /**
      * 保存游客广告记录
      */
     void addOneVisitor(YtDyzAdRecord adRecord);
 
+    void batchAddVisitor(@Param("adRecords") List<YtDyzAdRecord> adRecords);
+
     /**
      * 查询用户的广告记录
      */

+ 4 - 1
yt-question/yt-question-service/src/main/java/com/ytpm/question/service/AdService.java

@@ -4,6 +4,7 @@ import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.agent.view.AgentTopCountView;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.DyzAdRecordDelayParam;
 import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.general.Result;
 import com.ytpm.middle.view.DashboardRankingListVO;
@@ -18,7 +19,9 @@ public interface AdService {
     /**
      * 保存广告记录
      */
-    Result<?> saveRecord(DyzAdRecordParam param);
+    Result<String> saveRecord(DyzAdRecordParam param);
+
+    Result<String> delaySaveRecord(DyzAdRecordDelayParam param);
 
     /**
      * 根据应用查询广告数量

+ 56 - 3
yt-question/yt-question-service/src/main/java/com/ytpm/question/service/impl/AdServiceImpl.java

@@ -1,5 +1,7 @@
 package com.ytpm.question.service.impl;
 
+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;
@@ -11,6 +13,7 @@ import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.agent.view.AgentTopCountView;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.DyzAdRecordDelayParam;
 import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.app.view.WxDefaultConfig;
 import com.ytpm.feign.RiskFeign;
@@ -70,15 +73,15 @@ public class AdServiceImpl implements AdService {
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Result<?> saveRecord(DyzAdRecordParam param) {
+    public Result<String> saveRecord(DyzAdRecordParam param) {
         YtDyzUser user = appUserMapper.selectPrimaryKey(param.getUserId());
-        log.debug(StrUtil.format("[saveRecord] userId:{} revenue:{} ", param.getUserId(), param.getRevenue()));
         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.debug(StrUtil.format("[saveRecord] userId:{} revenue:{} ", param.getUserId(), param.getRevenue()));
         saveRecordAndChangeUser(param, user);
         //调用风控广告校验
         if (AdSourceTypeEnum.rewarded_video.getAdSourceType() == param.getAdSourceType()) {
@@ -87,7 +90,7 @@ public class AdServiceImpl implements AdService {
             user.setPowerLimitTip(format);
             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());
                 // 766处理
                 if ("766".contains(result.getMessage())) {
                     resultObj.setData(result.getMessage());
@@ -107,6 +110,56 @@ public class AdServiceImpl implements AdService {
         return split[RandomUtil.randomInt(split.length)];
     }
 
+
+
+    @Override
+    public Result<String> delaySaveRecord(DyzAdRecordDelayParam param) {
+        YtDyzUser 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<YtDyzAdRecord> saveList = new ArrayList<>();
+            BigDecimal totalRevenue = BigDecimal.ZERO;
+            for (DyzAdRecordParam adParam : param.getAdRecords()) {
+                insertEntity = new YtDyzAdRecord();
+                if (Objects.isNull(adParam.getBeginTime()) || "null".equals(adParam.getBeginTime())) {
+                    if ("null".equals(adParam.getBeginTime())) {
+                        log.warn("param beginTime is null !");
+                    }
+                    insertEntity.setBeginTime(adParam.getFinishTime());
+                }
+                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)) {
+                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);
+    }
+
+
     /**
      * 根据应用查询广告数量
      */

+ 87 - 0
yt-question/yt-question-service/src/main/resources/mapper/AdRecordMapper.xml

@@ -42,6 +42,49 @@
                 #{appId}
             )
     </insert>
+
+    <insert id="batchAdd">
+        insert into yt_dyz_ad_record
+        (
+            record_id,
+            user_id,
+            nick_name,
+            placement_id,
+            ad_source_id,
+            revenue,
+            network_form_id,
+            network_name,
+            network_placement_id,
+            begin_time,
+            finish_time,
+            result_json,
+            ad_source_index,
+            ad_source_type,
+            ecpm,
+            app_id
+        )
+        values
+        <foreach collection="adRecords" item="item" separator=",">
+            (
+            #{item.recordId},
+            #{item.userId},
+            #{item.nickName},
+            #{item.placementId},
+            #{item.adSourceId},
+            #{item.revenue},
+            #{item.networkFormId},
+            #{item.networkName},
+            #{item.networkPlacementId},
+            ifnull(#{item.beginTime}, now()),
+            ifnull(#{item.finishTime}, now()),
+            #{item.resultJson},
+            #{item.adSourceIndex},
+            #{item.adSourceType},
+            #{item.ecpm},
+            #{item.appId}
+            )
+        </foreach>
+    </insert>
     <insert id="addOneVisitor">
         insert into yt_dyz_ad_record_visitor
         (
@@ -82,6 +125,50 @@
                 #{appId}
             )
     </insert>
+    <insert id="batchAddVisitor">
+        insert into yt_dyz_ad_record_visitor
+        (
+            record_id,
+            user_id,
+            nick_name,
+            placement_id,
+            ad_source_id,
+            revenue,
+            network_form_id,
+            network_name,
+            network_placement_id,
+            begin_time,
+            finish_time,
+            result_json,
+            ad_source_index,
+            ad_source_type,
+            ecpm,
+            app_id
+        )
+        values
+        <foreach collection="adRecords" item="item" separator=",">
+            (
+            #{item.recordId},
+            #{item.userId},
+            #{item.nickName},
+            #{item.placementId},
+            #{item.adSourceId},
+            #{item.revenue},
+            #{item.networkFormId},
+            #{item.networkName},
+            #{item.networkPlacementId},
+            ifnull(#{item.beginTime}, now()),
+            ifnull(#{item.finishTime}, now()),
+            #{item.resultJson},
+            #{item.adSourceIndex},
+            #{item.adSourceType},
+            #{item.ecpm},
+            #{item.appId}
+            )
+        </foreach>
+
+    </insert>
+
     <select id="countByAppIds" resultType="java.lang.Integer">
         select
         count(record_id)