Bläddra i källkod

feat: ads及risk远程调用广告记录优化

hidewnd 1 månad sedan
förälder
incheckning
1241c5a7c0

+ 4 - 3
yt-agent/agent-service/src/main/java/com/ytpm/controller/YtAppUserController.java

@@ -1,5 +1,6 @@
 package com.ytpm.controller;
 
+import com.ytpm.agent.param.AdRecordListParam;
 import com.ytpm.agent.param.AuditUserParam;
 import com.ytpm.agent.view.AgentUserInfo;
 import com.ytpm.app.param.YtAppUserListParam;
@@ -59,10 +60,10 @@ public class YtAppUserController {
     /**
      * 查询用户的ecpm
      */
-    @GetMapping("/ecpm")
+    @PostMapping("/ecpm")
     @ApiOperation(value = "查询用户ecpm数据")
-    public ResultTable<YtUserEcpmListView> ecpmList(@RequestParam("appId")String appId,@RequestParam(name = "userId", required = true) String userId, @RequestParam(name = "adsourceType",required = false)Integer adsourceType){
-        return appUserService.ecpmList(appId,userId,adsourceType);
+    public ResultTable<YtUserEcpmListView> ecpmList(@RequestBody AdRecordListParam param){
+        return appUserService.ecpmList(param);
     }
 
     /**

+ 2 - 2
yt-agent/agent-service/src/main/java/com/ytpm/service/YtAppUserService.java

@@ -1,5 +1,6 @@
 package com.ytpm.service;
 
+import com.ytpm.agent.param.AdRecordListParam;
 import com.ytpm.agent.param.AuditUserParam;
 import com.ytpm.agent.view.AgentUserInfo;
 import com.ytpm.app.param.YtAppUserListParam;
@@ -11,7 +12,6 @@ import com.ytpm.general.ResultTable;
 import com.ytpm.middle.view.MessageVO;
 
 import java.math.BigDecimal;
-import java.util.List;
 
 
 public interface YtAppUserService {
@@ -30,7 +30,7 @@ public interface YtAppUserService {
     /**
      * 查询用户的ecpm列表
      */
-    ResultTable<YtUserEcpmListView> ecpmList(String appId,String userId,Integer adsourceType);
+    ResultTable<YtUserEcpmListView> ecpmList(AdRecordListParam param);
 
     /**
      * 根据时间统计收益

+ 33 - 3
yt-agent/agent-service/src/main/java/com/ytpm/service/impl/YtAppUserServiceImpl.java

@@ -5,8 +5,10 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageInfo;
+import com.ytpm.agent.enums.AdRecordEnum;
 import com.ytpm.agent.model.YtApp;
 import com.ytpm.agent.model.YtPlatformUserApp;
+import com.ytpm.agent.param.AdRecordListParam;
 import com.ytpm.agent.param.AuditCheckParam;
 import com.ytpm.agent.param.AuditUserParam;
 import com.ytpm.agent.view.AgentUserInfo;
@@ -137,16 +139,44 @@ public class YtAppUserServiceImpl implements YtAppUserService {
      * 查询用户的ecpm
      */
     @Override
-    public ResultTable<YtUserEcpmListView> ecpmList(String appId,String userId,Integer adsourceType) {
-        YtApp ytApp = appMapper.selectPrimary(appId);
+    public ResultTable<YtUserEcpmListView> ecpmList(AdRecordListParam param) {
+        ResultTable<YtUserEcpmListView> resultTable = new  ResultTable<>();
+        try {
+            resultTable = ecpmListV2(param);
+        } catch (Exception e) {
+            // 兼容旧服务包
+            resultTable = ecpmListV1(param);
+        }
+        return resultTable;
+    }
+
+    private ResultTable<YtUserEcpmListView> ecpmListV1(AdRecordListParam param) {
+        YtApp ytApp = appMapper.selectPrimary(param.getAppId());
         YtPlatformUserApp app = agentAppMapper.selectByPrimaryKey(ytApp.getSuperiorId());
-        Object o = feignInvoker.invoke(app.getServiceName(), "adRecords", userId,Objects.isNull(adsourceType)?888:adsourceType);
+        if (Objects.isNull(param.getAdsourceType())) {
+            param.setAdsourceType("888");
+        }
+        Object o = feignInvoker.invoke(app.getServiceName(), "adRecords", param.getUserId(), Integer.parseInt(param.getAdsourceType()));
         JSONObject object = JSONObject.parseObject(JSON.toJSONString(o));
         List<YtDyzAdRecord> records = JSONArray.parseArray(object.getString("data"), YtDyzAdRecord.class);
         PageMeta pageMeta = JSON.parseObject(object.getString("pageMeta"), PageMeta.class);
         return new ResultTable(StatusCode.OK,RepMessage.QUERY_SUCCESS,records,pageMeta);
     }
 
+    private ResultTable<YtUserEcpmListView> ecpmListV2(AdRecordListParam param) {
+        YtApp ytApp = appMapper.selectPrimary(param.getAppId());
+        YtPlatformUserApp app = agentAppMapper.selectByPrimaryKey(ytApp.getSuperiorId());
+        if (Objects.isNull(param.getLoginStatus())) {
+            param.setLoginStatus(AdRecordEnum.LOGIN_AFTER.getCode());
+        }
+        Object o = feignInvoker.invoke(app.getServiceName(), "adRecordsPage", param);
+        JSONObject object = JSONObject.parseObject(JSON.toJSONString(o));
+        List<YtDyzAdRecord> records = JSONArray.parseArray(object.getString("data"), YtDyzAdRecord.class);
+        PageMeta pageMeta = JSON.parseObject(object.getString("pageMeta"), PageMeta.class);
+        return new ResultTable(StatusCode.OK, RepMessage.QUERY_SUCCESS, records, pageMeta);
+    }
+
+
     /**
      * 根据时间统计收益
      */

+ 25 - 0
yt-common/src/main/java/com/ytpm/app/param/AdRecordStatisticParam.java

@@ -0,0 +1,25 @@
+package com.ytpm.app.param;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author lih
+ * @date 2025-09-12 18:23
+ */
+@Data
+public class AdRecordStatisticParam {
+
+    @ApiModelProperty("用户Id")
+    private String userId;
+
+    @ApiModelProperty("广告来源类型")
+    private Integer adSourceType;
+
+    @ApiModelProperty("统计开始时间")
+    private Date startTime;
+
+}

+ 4 - 0
yt-lime/lime-feign/src/main/java/com/ytpm/lime/feign/LimeFeign.java

@@ -7,6 +7,7 @@ import com.ytpm.agent.view.AgentTopCountView;
 import com.ytpm.app.model.YtAppDefaultConfig;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AdRecordStatisticParam;
 import com.ytpm.app.param.AppQueryUserTodayTimeParam;
 import com.ytpm.app.param.AppUserParam;
 import com.ytpm.app.param.AppUserQueryParam;
@@ -55,6 +56,9 @@ public interface LimeFeign {
     @GetMapping("/user/adRecords/page")
     ResultTable<YtDyzAdRecord> adRecordsPage(@RequestBody AdRecordListParam param);
 
+    @GetMapping("/user/adRecords/count/month")
+    Result<Integer> queryRecordMonthCount(@RequestBody AdRecordStatisticParam param);
+
     @PostMapping("/user/queryUserByTime")
     List<YtDyzUser> queryUserByTime(@RequestBody AppUserQueryParam appUserQueryParam);
 

+ 19 - 0
yt-lime/lime-service/src/main/java/com/ytpm/lime/controller/UserController.java

@@ -14,6 +14,7 @@ import com.ytpm.agent.view.AgentAuditCheckVO;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzLoginRecord;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AdRecordStatisticParam;
 import com.ytpm.app.param.AppQueryUserTodayTimeParam;
 import com.ytpm.app.param.AppUserParam;
 import com.ytpm.app.param.AppUserQueryParam;
@@ -48,6 +49,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -207,6 +209,23 @@ public class UserController {
         return ResultTable.resultTableOk(new PageInfo<>(adrecords));
     }
 
+    /**
+     * 查询广告记录统计数
+     */
+    @GetMapping("/adRecords/count/month")
+    public Result<Integer> queryRecordMonthCount(@RequestBody AdRecordStatisticParam param) {
+        // 统计起始时间为空,则默认查询当月信息
+        if (param.getStartTime() == null) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(new Date());
+            calendar.set(Calendar.DAY_OF_MONTH, 1);
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
+            calendar.set(Calendar.MINUTE, 0);
+            calendar.set(Calendar.SECOND, 0);
+            param.setStartTime(calendar.getTime());
+        }
+        return Result.resultObjOk(adRecordMapper.getRecordMonthCount(param));
+    }
 
     @PostMapping("/queryUserByTime")
     public List<YtDyzUser> queryUserByTime(@RequestBody AppUserQueryParam appUserQueryParam) {

+ 7 - 0
yt-lime/lime-service/src/main/java/com/ytpm/lime/dao/AdRecordMapper.java

@@ -2,6 +2,7 @@ package com.ytpm.lime.dao;
 
 import com.ytpm.agent.param.AdRecordListParam;
 import com.ytpm.app.model.YtDyzAdRecord;
+import com.ytpm.app.param.AdRecordStatisticParam;
 import com.ytpm.app.param.YtAppUserListParam;
 import com.ytpm.middle.view.AppRevenueHourVO;
 import org.apache.ibatis.annotations.Mapper;
@@ -56,4 +57,10 @@ public interface AdRecordMapper {
     List<YtDyzAdRecord> getTodayRecord(@Param("appIds")String appIds,@Param("firstDay")String firstDay,@Param("lastDay")String lastDay);
 
     List<YtDyzAdRecord> selectRecordByIds(@Param("loginStatus") Integer loginStatus, @Param("ids") List<String> adRecordIds);
+
+    /**
+     * 查询用户广告记录统计数
+     */
+    Integer getRecordMonthCount(@Param("param") AdRecordStatisticParam param);
+
 }

+ 14 - 6
yt-lime/lime-service/src/main/java/com/ytpm/lime/service/impl/AdServiceImpl.java

@@ -321,12 +321,20 @@ public class AdServiceImpl implements AdService {
         } else {
             adRecordMapper.addOne(adRecord);
         }
-        //修改用户信息, 广告次数+1  总收益 + revenue
-        YtDyzUser dyzUser = new YtDyzUser();
-        dyzUser.setUserId(user.getUserId());
-        dyzUser.setTotalVideo(Objects.isNull(user.getTotalVideo())?1:(user.getTotalVideo()+1));
-        dyzUser.setTotalIncome(user.getTotalIncome().add(param.getRevenue()));
-        appUserMapper.updateUser(dyzUser);
+        boolean updateUserTotal = true;
+        // 游客登陆下 激励视频广告记录不算入用户统计
+        if (AdRecordEnum.LOGIN_BEFORE.getCode().equals(param.getLoginStatus())
+                && AdSourceTypeEnum.rewarded_video.getAdSourceType() == param.getAdSourceType()) {
+            updateUserTotal = false;
+        }
+        if (updateUserTotal) {
+            //修改用户信息, 广告次数+1  总收益 + revenue
+            YtDyzUser dyzUser = new YtDyzUser();
+            dyzUser.setUserId(user.getUserId());
+            dyzUser.setTotalVideo(Objects.isNull(user.getTotalVideo()) ? 1 : (user.getTotalVideo() + 1));
+            dyzUser.setTotalIncome(user.getTotalIncome().add(param.getRevenue()));
+            appUserMapper.updateUser(dyzUser);
+        }
         return adRecord.getRecordId();
     }
 

+ 15 - 2
yt-lime/lime-service/src/main/resources/mapper/AdRecordMapper.xml

@@ -93,9 +93,10 @@
     </select>
     <select id="getByUserId" resultType="com.ytpm.app.model.YtDyzAdRecord">
         select
-        record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name, network_placement_id, finish_time, begin_time,result_json,ad_source_type,ad_source_index,ecpm
+        record_id, user_id,app_id, nick_name, placement_id, ad_source_id, revenue, network_form_id, network_name,
+        network_placement_id, finish_time, begin_time,result_json,ad_source_type,ad_source_index,ecpm
         from yt_dyz_ad_record
-        where user_id = #{userId}
+        where user_id = #{userId} and DATE_FORMAT(finish_time, '%Y-%m-%d') = DATE_FORMAT(now(), '%Y-%m-%d')
         <if test="adsourceType != null and adsourceType!=888">
             and ad_source_type = #{adsourceType}
         </if>
@@ -208,4 +209,16 @@
         </if>
         where record_id in <foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach>
     </select>
+    <select id="getRecordMonthCount" resultType="java.lang.Integer">
+        SELECT count(record_id) as counts
+        FROM yt_dyz_ad_record
+        where user_id=#{param.userId} and revenue > 0
+        <if test="param.adSourceType != null and adsourceType!=888">
+            and ad_source_type = #{param.adSourceType}
+        </if>
+        <if test="param.startTime != null">
+            and finish_time > #{param.startTime}
+        </if>
+    </select>
+
 </mapper>

+ 27 - 10
yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

@@ -27,6 +27,7 @@ import com.ytpm.app.enums.LoginType;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzLoginRecord;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.AdRecordStatisticParam;
 import com.ytpm.custom.CustomField;
 import com.ytpm.dao.AppMapper;
 import com.ytpm.dao.DictMapper;
@@ -549,9 +550,9 @@ public class RiskServiceImpl implements RiskService {
             return Result.resultOk(RepMessage.QUERY_SUCCESS);
         }
         try {
-            // 校验风控767规则
-            checkRisk767(dyzUser, adRecords);
-            // 校验风控768规则
+            // 校验风控767规则 月记录数
+            checkRisk767(dyzUser, adRecords, userApp);
+            // 校验风控768规则,小时内记录数
             checkRisk768(dyzUser, adRecords);
             //过滤出当日的激励视频数据 按照时间正序排以便筛选每日前几条激励视频
             adRecords = adRecords.stream().filter(s ->
@@ -599,7 +600,7 @@ public class RiskServiceImpl implements RiskService {
      * 校验默认风控规则767
      * {monthCount}月内,获得奖励的激励视频数>{monthTaskLimit}
      */
-    private void checkRisk767(YtDyzUser dyzUser, List<YtDyzAdRecord> adRecords) {
+    private void checkRisk767(YtDyzUser dyzUser, List<YtDyzAdRecord> adRecords, YtPlatformUserApp userApp) {
         RiskTemplateView riskTempView = configMapper.getByCode(dyzUser.getAppId() + "-767");
         if (riskTempView == null || riskTempView.getEnabled() != 1) return;
         Map<String, String> riskConfigMap = getRsihConfigMap(riskTempView);
@@ -607,13 +608,29 @@ public class RiskServiceImpl implements RiskService {
         int monthTaskLimit = Integer.parseInt(riskConfigMap.getOrDefault("monthTaskLimit", "0"));
         if (monthCount > 0 && monthTaskLimit > 0) {
             Date limitStartDate = DateUtil.offset(new Date(), DateField.MONTH, -monthCount);
-            List<YtDyzAdRecord> revenues = adRecords.stream().filter(
-                            s -> Objects.nonNull(s.getRevenue()) && (s.getRevenue().compareTo(BigDecimal.ZERO)) > 0)
-                    .filter(item -> DateUtil.parse(item.getFinishTime()).after(limitStartDate))
-                    .collect(Collectors.toList());
-            if (revenues.size() > monthTaskLimit) {
+            int recordCount = 0;
+            try {
+                AdRecordStatisticParam param = new AdRecordStatisticParam();
+                param.setUserId(dyzUser.getUserId());
+                param.setAdSourceType(AdSourceTypeEnum.rewarded_video.getAdSourceType());
+                param.setStartTime(limitStartDate);
+                Object o = feignInvoker.invoke(userApp.getServiceName(), "queryRecordMonthCount", param);
+                JSONObject object = JSON.parseObject(JSON.toJSONString(o));
+                if (object.get("data") != null) {
+                    recordCount = Integer.parseInt(object.get("data").toString());
+                }
+            } catch (Exception e) {
+                log.warn("下游服务未实现接口 queryRecordMonthCount,使用原有逻辑");
+                List<YtDyzAdRecord> revenues = adRecords.stream().filter(
+                                s -> Objects.nonNull(s.getRevenue()) && (s.getRevenue().compareTo(BigDecimal.ZERO)) > 0)
+                        .filter(item -> DateUtil.parse(item.getFinishTime()).after(limitStartDate))
+                        .collect(Collectors.toList());
+                recordCount = revenues.size();
+            }
+            if (recordCount > monthTaskLimit) {
+                log.warn(StrUtil.format("[risk 767] adRecord count[{}]  > limit[{}]", recordCount, monthTaskLimit));
                 String format = StrUtil.emptyToDefault(dyzUser.getPowerLimitTip(), "当前设备完成任务次数过多,请{}后重试!");
-                throw new CommonException(StrUtil.format(format,StrUtil.format("{}月", monthCount)));
+                throw new CommonException(StrUtil.format(format, StrUtil.format("{}月", monthCount)));
             }
         }
     }