فهرست منبع

feat:调整游客登陆风控流程,重写风控规则344,345

hidewnd 2 ماه پیش
والد
کامیت
eefc4a91e1
19فایلهای تغییر یافته به همراه166 افزوده شده و 135 حذف شده
  1. 2 2
      yt-adage/adage-service/src/main/java/com/ytpm/adage/controller/AdController.java
  2. 2 2
      yt-adage/adage-service/src/main/java/com/ytpm/adage/controller/VisitorController.java
  3. 1 1
      yt-adage/adage-service/src/main/java/com/ytpm/adage/controller/WxController.java
  4. 3 1
      yt-adage/adage-service/src/main/java/com/ytpm/adage/dao/AdRecordMapper.java
  5. 1 1
      yt-adage/adage-service/src/main/java/com/ytpm/adage/dao/AppUserMapper.java
  6. 9 1
      yt-adage/adage-service/src/main/java/com/ytpm/adage/service/AdService.java
  7. 11 2
      yt-adage/adage-service/src/main/java/com/ytpm/adage/service/impl/AdServiceImpl.java
  8. 20 19
      yt-adage/adage-service/src/main/java/com/ytpm/adage/service/impl/VisitorLoginServiceImpl.java
  9. 9 4
      yt-adage/adage-service/src/main/resources/mapper/AdRecordMapper.xml
  10. 2 1
      yt-adage/adage-service/src/main/resources/mapper/AppUserMapper.xml
  11. 0 5
      yt-common/src/main/java/com/ytpm/agent/view/UserAdStaticsVo.java
  12. 3 0
      yt-common/src/main/java/com/ytpm/app/model/YtDyzUser.java
  13. 5 0
      yt-common/src/main/java/com/ytpm/app/param/VisitorLoginParam.java
  14. 14 25
      yt-common/src/main/java/com/ytpm/handle/AbstractLoginService.java
  15. 2 2
      yt-common/src/main/java/com/ytpm/handle/LoginServiceFactory.java
  16. 28 8
      yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/ApkServiceImpl.java
  17. 0 6
      yt-risk/risk-manage/src/main/java/com/ytpm/controller/PublicApiController.java
  18. 0 7
      yt-risk/risk-manage/src/main/java/com/ytpm/service/RiskService.java
  19. 54 48
      yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

+ 2 - 2
yt-adage/adage-service/src/main/java/com/ytpm/adage/controller/AdController.java

@@ -1,8 +1,8 @@
 package com.ytpm.adage.controller;
 
+import com.ytpm.adage.service.AdService;
 import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.agent.view.AgentTopCountView;
-import com.ytpm.adage.service.AdService;
 import com.ytpm.agent.view.UserAdStaticsVo;
 import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.general.Result;
@@ -95,7 +95,7 @@ public class AdController {
 
     @ApiOperation("查询用户广告收益统计广告数据")
     @GetMapping("/getUerAdStatics")
-    public List<UserAdStaticsVo> getUerAdStatics(@RequestParam(name = "appId")String appId, @RequestParam(name = "userId")String userId){
+    public UserAdStaticsVo getUerAdStatics(@RequestParam(name = "appId") String appId, @RequestParam(name = "userId") String userId) {
         return adService.getUerAdStatics(appId, userId);
     }
 

+ 2 - 2
yt-adage/adage-service/src/main/java/com/ytpm/adage/controller/VisitorController.java

@@ -3,7 +3,7 @@ package com.ytpm.adage.controller;
 import com.ytpm.adage.dao.AppUserMapper;
 import com.ytpm.app.enums.LoginType;
 import com.ytpm.app.model.YtDyzUser;
-import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.param.VisitorLoginParam;
 import com.ytpm.general.Result;
 import com.ytpm.handle.LoginServiceFactory;
 import io.swagger.annotations.Api;
@@ -40,7 +40,7 @@ public class VisitorController {
     @PostMapping("/login")
     @ApiOperation("游客登录")
     @Transactional(rollbackFor = Exception.class)
-    public Result<YtDyzUser> visitorLogin(@RequestBody WxLoginParam param, HttpServletRequest request) {
+    public Result<YtDyzUser> visitorLogin(@RequestBody VisitorLoginParam param, HttpServletRequest request) {
         return loginServiceFactory.login(LoginType.VISITOR, param, request);
     }
 

+ 1 - 1
yt-adage/adage-service/src/main/java/com/ytpm/adage/controller/WxController.java

@@ -51,7 +51,7 @@ public class WxController {
 
     @ApiOperation("获取微信默认配置项")
     @GetMapping("/defaultConfig")
-    public Result<WxDefaultConfig> getWxDefaultConfig(int appType) {
+    public Result<WxDefaultConfig> getWxDefaultConfig(@RequestParam("appType") Integer appType) {
         WxDefaultConfig config = appUserMapper.getDefaultConfig(appType);
         if (Objects.isNull(config)) {
             return Result.resultErr("应用类型有误!");

+ 3 - 1
yt-adage/adage-service/src/main/java/com/ytpm/adage/dao/AdRecordMapper.java

@@ -46,6 +46,8 @@ public interface AdRecordMapper {
      */
     List<YtDyzAdRecord> getTodayRecord(@Param("appIds")String appIds,@Param("firstDay")String firstDay,@Param("lastDay")String lastDay);
 
-    List<UserAdStaticsVo> getUerAdStatics(@Param("appId") String appId, @Param("userId") String userId);
+    UserAdStaticsVo getUerAdStatics(@Param("appId") String appId, @Param("userId") String userId);
 
+
+    List<YtDyzAdRecord> selectRecordByIds(@Param("ids") List<String> adRecordIds);
 }

+ 1 - 1
yt-adage/adage-service/src/main/java/com/ytpm/adage/dao/AppUserMapper.java

@@ -88,7 +88,7 @@ public interface AppUserMapper {
     /**
      * 根据应用类型查询应用默认配置
      */
-    WxDefaultConfig getDefaultConfig(@Param("appType") int appType);
+    WxDefaultConfig getDefaultConfig(@Param("appType") Integer appType);
 
     /**
      * 根据微信openid查询用户

+ 9 - 1
yt-adage/adage-service/src/main/java/com/ytpm/adage/service/AdService.java

@@ -3,6 +3,8 @@ package com.ytpm.adage.service;
 import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.agent.view.AgentTopCountView;
 import com.ytpm.agent.view.UserAdStaticsVo;
+import com.ytpm.app.model.YtDyzAdRecord;
+import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.general.Result;
 import com.ytpm.middle.view.DashboardRankingListVO;
@@ -48,5 +50,11 @@ public interface AdService {
      */
     List<AgentAdGroupStaticsVO> getAgentProfit(String appIds);
 
-    List<UserAdStaticsVo> getUerAdStatics(String appId, String userId);
+    UserAdStaticsVo getUerAdStatics(String appId, String userId);
+
+    //    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+    String saveRecordAndChangeUser(DyzAdRecordParam param, YtDyzUser user);
+
+    List<YtDyzAdRecord> queryRecordByIds(List<String> adRecordIds);
+
 }

+ 11 - 2
yt-adage/adage-service/src/main/java/com/ytpm/adage/service/impl/AdServiceImpl.java

@@ -42,6 +42,7 @@ import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -290,7 +291,7 @@ public class AdServiceImpl implements AdService {
     }
 
     @Override
-    public List<UserAdStaticsVo> getUerAdStatics(String appId, String userId) {
+    public UserAdStaticsVo getUerAdStatics(String appId, String userId) {
         return adRecordMapper.getUerAdStatics(appId, userId);
     }
 
@@ -299,7 +300,8 @@ public class AdServiceImpl implements AdService {
      *  始终创建新的事务以保障子方法的独立事务
      */
 //    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
-    public void saveRecordAndChangeUser(DyzAdRecordParam param,YtDyzUser user) {
+    @Override
+    public String saveRecordAndChangeUser(DyzAdRecordParam param, YtDyzUser user) {
         //增加广告记录
         YtDyzAdRecord adRecord = new YtDyzAdRecord();
         if(Objects.isNull(param.getBeginTime())){
@@ -315,5 +317,12 @@ public class AdServiceImpl implements AdService {
         dyzUser.setTotalVideo(Objects.isNull(user.getTotalVideo())?1:(user.getTotalVideo()+1));
         dyzUser.setTotalIncome(user.getTotalIncome().add(param.getRevenue()));
         appUserMapper.updateUser(dyzUser);
+
+        return adRecord.getRecordId();
+    }
+
+    @Override
+    public List<YtDyzAdRecord> queryRecordByIds(List<String> adRecordIds) {
+        return adRecordMapper.selectRecordByIds(adRecordIds);
     }
 }

+ 20 - 19
yt-adage/adage-service/src/main/java/com/ytpm/adage/service/impl/VisitorLoginServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ytpm.adage.service.impl;
 
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
@@ -8,11 +9,14 @@ import com.ytpm.adage.dao.AppUserMapper;
 import com.ytpm.adage.dao.LoginRecordMapper;
 import com.ytpm.adage.dao.QuestionMapper;
 import com.ytpm.adage.redis.RedisService;
+import com.ytpm.adage.service.AdService;
 import com.ytpm.agent.enums.UserStatusEnum;
 import com.ytpm.app.enums.LoginType;
 import com.ytpm.app.model.YtDyzLoginRecord;
 import com.ytpm.app.model.YtDyzUser;
+import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.app.param.LoginParam;
+import com.ytpm.app.param.VisitorLoginParam;
 import com.ytpm.app.view.WxDefaultConfig;
 import com.ytpm.constant.StrConstant;
 import com.ytpm.feign.RiskFeign;
@@ -25,6 +29,7 @@ import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -48,6 +53,8 @@ public class VisitorLoginServiceImpl extends AbstractLoginService  {
     private RiskFeign riskFeign;
     @Autowired
     private RedisService redisService;
+    @Autowired
+    private AdService adService;
 
     @Override
     protected WxDefaultConfig getLoginConfig(Integer appType) {
@@ -149,26 +156,20 @@ public class VisitorLoginServiceImpl extends AbstractLoginService  {
         old.setLoginRecordList(loginRecordMapper.getLoginRecords(old.getUserId()));
     }
 
-    @Override
-    protected void afterVisitorRegistryUser(LoginParam loginParam, YtDyzUser ytDyzUser) {
-        super.afterVisitorRegistryUser(loginParam, ytDyzUser);
-        checkEcPmAndRevenue(ytDyzUser);
-    }
 
-    @Override
-    protected void beforeDeadWithUserCrud(LoginParam loginParam, YtDyzUser ytDyzUser, Map<String, Object> paramMap) {
-        super.beforeDeadWithUserCrud(loginParam, ytDyzUser, paramMap);
-        checkEcPmAndRevenue(ytDyzUser);
-    }
-
-    /**
-     * 新增风控 相关广告源记录 ecpm  和预估收益 小于 各自 阈值,登陆返回 301
-     * @param ytDyzUser 登陆用户信息
-     */
-    private void checkEcPmAndRevenue(YtDyzUser ytDyzUser){
-        Result<?> result = riskFeign.checkVisitorLogin(ytDyzUser);
-        if (result == null || result.getCode() != 200) {
-            throw new CommonException(result == null ? "feign invoke Fail!" : result.getMessage());
+    // 仅保存登陆时的三条广告信息 并传入登陆实体用于后续 risk风控校验
+    protected void saveVisitorAdRecord(YtDyzUser ytDyzUser, LoginParam loginParam) {
+        super.saveVisitorAdRecord(ytDyzUser, loginParam);
+        VisitorLoginParam visitorLoginParam = (VisitorLoginParam) loginParam;
+        List<DyzAdRecordParam> preAdList = visitorLoginParam.getPreAdList();
+        List<String> adRecordIds = new ArrayList<>();
+        if (CollUtil.isNotEmpty(preAdList)) {
+            for (DyzAdRecordParam adRecordParam : preAdList) {
+                String recordId = adService.saveRecordAndChangeUser(adRecordParam, ytDyzUser);
+                adRecordIds.add(recordId);
+            }
         }
+        ytDyzUser.setPreAdRecordList(adService.queryRecordByIds(adRecordIds));
     }
+
 }

+ 9 - 4
yt-adage/adage-service/src/main/resources/mapper/AdRecordMapper.xml

@@ -143,14 +143,19 @@
         select
             user_id,
             app_id,
-            ad_source_type,
             count(record_id) as record_count,
             sum(ecpm) as ecpm,
             sum(revenue) as revenue
         from yt_dyz_ad_record ydar
         where ad_source_type in (0, 2, 4)
-        and app_id = #{appId} and user_id = #{userId}
-        group by user_id, app_id, ad_source_type
-
+        and user_id = #{userId} and app_id = #{appId}
+        group by user_id, app_id
+        limit 1
+    </select>
+    <select id="selectRecordByIds" resultType="com.ytpm.app.model.YtDyzAdRecord">
+        select
+            record_id, user_id, app_id, nick_name, placement_id, ad_source_id, ad_source_type, ad_source_index, revenue, ecpm, network_form_id, network_name, network_placement_id, finish_time, begin_time, result_json
+        from yt_dyz_ad_record
+        where record_id in <foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach>
     </select>
 </mapper>

+ 2 - 1
yt-adage/adage-service/src/main/resources/mapper/AppUserMapper.xml

@@ -366,7 +366,8 @@
     <select id="getDefaultConfig" resultType="com.ytpm.app.view.WxDefaultConfig">
         select
             config_id, config_name, open_id appId, secret, app_id platformAppId, app_key platformAppSecret, app_type,user_path,login_path,ad_path,answer_path,power_path
-                     ,can_simulator,taku_app_id,taku_key,taku_banner_pid,taku_interstitial_pid,taku_reward_pid,taku_native_pid,can_use_adb,can_accumulation,can_use_float,can_use_root,ditch_id,power_wait_time,interstitial_interval_time
+                     ,can_simulator,taku_app_id,taku_key,taku_banner_pid,taku_interstitial_pid,taku_reward_pid,taku_native_pid,can_use_adb,can_accumulation,can_use_float,can_use_root,ditch_id,power_wait_time,interstitial_interval_time,
+            low_value_tops, brush_tip
         from yt_app_default_config
         where app_type = #{appType}
     </select>

+ 0 - 5
yt-common/src/main/java/com/ytpm/agent/view/UserAdStaticsVo.java

@@ -25,9 +25,6 @@ public class UserAdStaticsVo {
     @ApiModelProperty("应用ID")
     private String appId;
 
-    @ApiModelProperty("广告源类型")
-    private String adSourceType;
-
     @ApiModelProperty("广告记录数")
     private Integer totalRecord;
 
@@ -36,6 +33,4 @@ public class UserAdStaticsVo {
 
     @ApiModelProperty("总预估ecpm")
     private BigDecimal totalEcpm;
-
-
 }

+ 3 - 0
yt-common/src/main/java/com/ytpm/app/model/YtDyzUser.java

@@ -141,4 +141,7 @@ public class YtDyzUser extends PageMeta {
 
     @ApiModelProperty(value = "是否已达到体力上限")
     private Boolean ifPowerLimit;
+
+    @ApiModelProperty(value = "登陆前三条广告记录")
+    List<YtDyzAdRecord> preAdRecordList;
 }

+ 5 - 0
yt-common/src/main/java/com/ytpm/app/param/VisitorLoginParam.java

@@ -2,9 +2,12 @@ package com.ytpm.app.param;
 
 
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 /**
  * @author lih
  * @date 2025/9/8
@@ -14,5 +17,7 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = false)
 public class VisitorLoginParam extends LoginParam{
 
+    @ApiModelProperty(name = "登陆前广告记录")
+    List<DyzAdRecordParam> preAdList;
 
 }

+ 14 - 25
yt-common/src/main/java/com/ytpm/handle/AbstractLoginService.java

@@ -17,13 +17,11 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.CollectionUtils;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Objects;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * <p>登陆模板</p>
@@ -133,59 +131,50 @@ public abstract class AbstractLoginService {
             beforeRegistryUser(loginParam, paramMap);
             ytDyzUser = new YtDyzUser();
             registryUser(loginParam, ytDyzUser, paramMap);
-            //注册后回调
-            afterVisitorRegistryUser(loginParam, ytDyzUser);
         } else {
             // 查询当前设备当前渠道是否存在该用户
             ytDyzUser = queryUserByDeviceAndDitch(loginParam.getDeviceId(), loginParam.getDitchId());
             if(ytDyzUser == null) {
-                YtDyzUser user = ytDyzUsers.stream()
-                        .sorted(Comparator.comparing(YtDyzUser::getRegistryTime).reversed())
-                        .collect(Collectors.toList()).get(0);
-                visitorCheckRegRisk(user);
                 ytDyzUser = new YtDyzUser();
                 registryUser(loginParam, ytDyzUser, paramMap);
             }
             //当前渠道已有用户,校验用户是否处于风控中 & 更新用户信息
             beforeDeadWithUserCrud(loginParam, ytDyzUser, paramMap);
+            //如果当前登录是本日第一次登录则登录天数+1
             deadWithUserCrud(loginParam, ytDyzUser, paramMap);
         }
+        // 保存广告信息
+        saveVisitorAdRecord(ytDyzUser, loginParam);
         return ytDyzUser;
     }
 
-    protected void afterVisitorRegistryUser(LoginParam loginParam, YtDyzUser ytDyzUser) {
-
-    }
+    // 游客登陆时保存传递记录
+    protected void saveVisitorAdRecord(YtDyzUser ytDyzUser, LoginParam loginParam) {
 
-    private void visitorCheckRegRisk(YtDyzUser user) {
-        Result<?> result = remoteCheckRegRisk(user);
-        if (result == null) {
-            throw new CommonException("feign invoke Fail!");
-        }
-        if (result.getCode() != 200) {
-            throw new CommonException(result.getMessage());
-        }
     }
 
 
-
-
+    /**
+     * 根据设备及渠道ID查询用户
+     */
     protected abstract YtDyzUser queryUserByDeviceAndDitch(String deviceId, Long ditchId);
 
 
+    /**
+     * 第三方登陆调用处理及参数传递
+     */
     protected Map<String, Object> setThirdPartyLoginInfo(LoginParam loginParam, WxDefaultConfig defaultConfig,
                                                          HttpServletRequest request) {
         Map<String, Object> map = new HashMap<>();
-
         return map;
     }
 
 
-    // 获取登陆默认配置
+    /**
+     * 获取登陆默认配置
+     */
     protected abstract WxDefaultConfig getLoginConfig(Integer appType);
 
-
-
     /**
      * 根据登陆配置信息 查询系统用户记录
      * @param loginParam 登陆参数

+ 2 - 2
yt-common/src/main/java/com/ytpm/handle/LoginServiceFactory.java

@@ -3,7 +3,7 @@ package com.ytpm.handle;
 
 import com.ytpm.app.enums.LoginType;
 import com.ytpm.app.model.YtDyzUser;
-import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.param.LoginParam;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import com.ytpm.general.StatusCode;
@@ -46,7 +46,7 @@ public class LoginServiceFactory {
         return service;
     }
 
-    public Result<YtDyzUser> login(LoginType loginType, WxLoginParam param, HttpServletRequest request) {
+    public Result<YtDyzUser> login(LoginType loginType, LoginParam param, HttpServletRequest request) {
         try {
             AbstractLoginService loginService = getLoginService(loginType);
             YtDyzUser ytDyzUser = loginService.loginHandle(param, request);

+ 28 - 8
yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/ApkServiceImpl.java

@@ -213,6 +213,7 @@ public class ApkServiceImpl implements ApkService {
         addTemp323(param, loginUser);
         addTemp333(param, loginUser);
         addTemp344(param, loginUser);
+        addTemp345(param, loginUser);
         // 平均收益风控
         addTemp766(param, loginUser);
         // 任务完成数风控
@@ -292,18 +293,16 @@ public class ApkServiceImpl implements ApkService {
     }
 
     private void addTemp344(AppParam param, MiddleUserInfo loginUser) {
-        // 风控规则 游客模式用户开屏广告累计ecpm<{},累计预估收益<{}
-        // 风控规则 游客模式用户横幅累计ecpm<{},累计预估收益<{}
-        // 风控规则 游客模式用户原生(信息流)累计ecpm<{},累计预估收益<{}
+        // 风控规则 开屏广告、横幅、原生(信息流)总预估收益<{}
         String appId = param.getAppId();
         String agentId = param.getUserId();
         List<YtRiskConfig> configs = new ArrayList<>();
-        createTemp344ByAdType(param, configs, "0", "信息流");
-        createTemp344ByAdType(param, configs, "2", "横幅");
-        createTemp344ByAdType(param, configs, "4", "开屏");
+        YtRiskConfig riskConfig = createRiskConfig(param.getUserId(), "revenueLimit",
+                StrUtil.format("开屏广告、横幅、原生(信息流)总预估收益>{},", initVisitorEcpmLimit), initVisitorEcpmLimit, 4);
+        configs.add(riskConfig);
         String templateId = IdUtil.getSnowflakeNextIdStr();
-        String content = configs.stream().map(YtRiskConfig::getFieldDesc).collect(Collectors.joining(""));
-        YtRiskTemplate template = new YtRiskTemplate(templateId, "游客用户收益限制", content,
+        YtRiskTemplate template = new YtRiskTemplate(templateId, "游客用户总预估收益限制",
+                StrUtil.format("开屏广告、横幅、原生(信息流)总预估收益>{},", initVisitorEcpmLimit),
                 appId + "-344", agentId, 2, appId,
                 new Date(), loginUser.getUserId(), null, null,
                 1, 1, 1);
@@ -314,6 +313,27 @@ public class ApkServiceImpl implements ApkService {
         riskMapper.relativeApp(appId, param.getAppName(), template.getTemplateId(), loginUser.getNickName(), loginUser.getUserId());
     }
 
+    private void addTemp345(AppParam param, MiddleUserInfo loginUser) {
+        // 风控规则 开屏广告、横幅、原生(信息流)总ecpm<{}
+        String appId = param.getAppId();
+        String agentId = param.getUserId();
+        List<YtRiskConfig> configs = new ArrayList<>();
+        YtRiskConfig riskConfig = createRiskConfig(param.getUserId(), "ecpmLimit",
+                StrUtil.format("开屏广告、横幅、原生(信息流)总ecpm<{},", initVisitorEcpmLimit), initVisitorEcpmLimit, 4);
+        configs.add(riskConfig);
+        String templateId = IdUtil.getSnowflakeNextIdStr();
+        YtRiskTemplate template = new YtRiskTemplate(templateId, "游客用户总ecpm限制",
+                StrUtil.format("开屏广告、横幅、原生(信息流)总ecpm<{},", initVisitorEcpmLimit),
+                appId + "-345", agentId, 2, appId,
+                new Date(), loginUser.getUserId(), null, null,
+                0, 1, 1);
+        riskMapper.insertTemplate(template);
+        // 风控模板关联配置项
+        bindTempConfig(loginUser, template, configs);
+        //风控模版关联应用
+        riskMapper.relativeApp(appId, param.getAppName(), template.getTemplateId(), loginUser.getNickName(), loginUser.getUserId());
+    }
+
     private void createTemp344ByAdType(AppParam param, List<YtRiskConfig> configs, String adSourceType, String typeName){
         YtRiskConfig riskConfig;
         riskConfig = createRiskConfig(param.getUserId(), StrUtil.format("ecpmLimit_{}", adSourceType),

+ 0 - 6
yt-risk/risk-manage/src/main/java/com/ytpm/controller/PublicApiController.java

@@ -101,10 +101,4 @@ public class PublicApiController {
     public Result<?> checkLoginRisk(@RequestBody YtDyzUser dyzUser){
         return riskService.checkLoginRisk(dyzUser);
     }
-
-    @ApiOperation("校验游客登录风控配置")
-    @PostMapping("/checkVisitorLogin")
-    public Result<?> checkVisitorLogin(@RequestBody YtDyzUser dyzUser){
-        return riskService.checkVisitorLogin(dyzUser);
-    }
 }

+ 0 - 7
yt-risk/risk-manage/src/main/java/com/ytpm/service/RiskService.java

@@ -16,9 +16,7 @@ import com.ytpm.risk.view.RiskConfigListView;
 import com.ytpm.risk.view.RiskConfigView;
 import com.ytpm.risk.view.RiskDeblockingListView;
 import com.ytpm.risk.view.RiskTemplateView;
-import org.apache.ibatis.annotations.Param;
 
-import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -130,11 +128,6 @@ public interface RiskService {
      */
     Result<?> checkLoginRisk(YtDyzUser dyzUser);
 
-    /**
-     * 游客用户风控配置 344
-     */
-    Result<?> checkVisitorLogin(YtDyzUser dyzUser);
-
     /**
      * 校验用户广告风控 766
      */

+ 54 - 48
yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

@@ -23,7 +23,6 @@ import com.ytpm.agent.model.YtPlatformUserApp;
 import com.ytpm.agent.view.AgentAppClassView;
 import com.ytpm.agent.view.AgentEnableAppView;
 import com.ytpm.agent.view.AgentUserInfo;
-import com.ytpm.agent.view.UserAdStaticsVo;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzLoginRecord;
 import com.ytpm.app.model.YtDyzUser;
@@ -1060,15 +1059,20 @@ public class RiskServiceImpl implements RiskService {
      */
     @Override
     public Result<?> checkLoginRisk(YtDyzUser dyzUser) {
-        RiskTemplateView view= configMapper.getByCode(dyzUser.getAppId()+"-323");
-        checkVisitor323(dyzUser,view);
-        return Result.resultOk(RepMessage.RISK_SUCCESS);
+        // 20250908 移除游客登陆校验
+//        // 游客登陆风控校验
+//        RiskTemplateView view = configMapper.getByCode(dyzUser.getAppId() + "-323");
+//        checkVisitor323(dyzUser, view);
+        // 游客用户总收益校验
+        boolean checkResult = checkVisitorRisk(dyzUser);
+        return checkResult ? Result.resultOk(RepMessage.RISK_SUCCESS) : Result.resultErr(RepMessage.ALREADY_RISK_USER);
     }
 
     /**
      * 校验游客登录323规则
      */
     private void checkVisitor323(YtDyzUser dyzUser, RiskTemplateView view) {
+        if(view != null && view.getEnabled() != 1) return;
         List<RiskConfigView> configList = view == null ? Collections.emptyList() : view.getConfigList();
         Map<String, String> configMap = configList.stream().collect(
                 Collectors.toMap(RiskConfigView::getFieldName, RiskConfigView::getConfigVal));
@@ -1078,13 +1082,57 @@ public class RiskServiceImpl implements RiskService {
         //根据用户所属应用查询该应用母包openid查询用户信息
         YtApp ytApp = appMapper.selectRiskApp(dyzUser.getAppId());
         YtPlatformUserApp userApp =  appMapper.selectParentApp(ytApp.getSuperiorId());
-        Object o = feignInvoker.invoke(userApp.getServiceName(),"getLoginDitchCount",dyzUser.getDeviceId(),hours);
+        Object o = feignInvoker.invoke(userApp.getServiceName(), "getLoginDitchCount", dyzUser.getDeviceId(), hours);
         int ditchCount = (int)o;
         //三天内注册的渠道数小于预设的渠道数通过校验,否则风控锁定用户
         if(ditchCount<uidCount)return;
         riskLockUser(dyzUser,"323",hours+"小时内登录渠道已达上限",getTipsMsg());
     }
 
+
+    /**
+     * 344/345 游客模式登陆前三条广告收益 风控校验<br>
+     * 原生(信息流)+ 开屏广告 + 横幅对应 总预估收益 小于 阈值时,校验失败
+     * @param dyzUser 该设备同应用的最新一条注册用户信息
+     */
+    private boolean checkVisitorRisk(YtDyzUser dyzUser) {
+        RiskTemplateView view = configMapper.getByCode(dyzUser.getAppId() + "-344");
+        RiskTemplateView view2 = configMapper.getByCode(dyzUser.getAppId() + "-345");
+        boolean checkResult = true;
+        if((view != null && view.getEnabled() == 1) || (view2 != null && view2.getEnabled() == 1)) {
+            //根据用户所属应用查询该应用母包openid查询用户信息
+            // 查询数据
+            BigDecimal totalRevenue = BigDecimal.ZERO;
+            BigDecimal totalEcpm = BigDecimal.ZERO;
+            if (CollUtil.isNotEmpty(dyzUser.getPreAdRecordList())) {
+                for (YtDyzAdRecord adRecord : dyzUser.getPreAdRecordList()) {
+                    totalRevenue = adRecord.getRevenue() == null ? totalRevenue : totalRevenue.add(adRecord.getRevenue());
+                    totalEcpm = adRecord.getEcpm() == null ? totalEcpm : totalEcpm.add(adRecord.getEcpm());
+                }
+            }
+            // 校验总预估收益
+            if (view != null && view.getEnabled() == 1) {
+                BigDecimal limitValue = getLimitValue(view, "revenueLimit");
+                checkResult = totalRevenue.compareTo(limitValue) >= 0;
+            }
+            // 校验总ecpm
+            if (view2 != null && view2.getEnabled() == 1) {
+                BigDecimal limitValue = getLimitValue(view, "ecpmLimit");
+                checkResult = checkResult && totalEcpm.compareTo(limitValue) >= 0;
+            }
+        }
+        return checkResult;
+    }
+
+    private BigDecimal getLimitValue(RiskTemplateView view, String configCode){
+        List<RiskConfigView> configList = view == null ? Collections.emptyList() : view.getConfigList();
+        Map<String, String> configMap = configList.stream()
+                .filter(item -> item.getMulty() != null && item.getMulty() == 4)
+                .collect(Collectors.toMap(RiskConfigView::getFieldName, RiskConfigView::getConfigVal,
+                        (o1,o2)-> o2));
+        return new BigDecimal(configMap.getOrDefault(configCode, "0"));
+    }
+
     /**
      * 333 注册风控可配置
      *  需求要求改为小时控制
@@ -1112,14 +1160,6 @@ public class RiskServiceImpl implements RiskService {
         return Result.resultErr(hours+RepMessage.DITCH_REG_LIMIT);
     }
 
-
-    @Override
-    public Result<?> checkVisitorLogin(YtDyzUser dyzUser) {
-        RiskTemplateView view = configMapper.getByCode(dyzUser.getAppId() + "-344");
-        return checkVisitor344(dyzUser,view)
-                ? Result.resultOk(RepMessage.RISK_SUCCESS) : Result.resultErr(RepMessage.ALREADY_RISK_USER);
-    }
-
     @Override
     public Result<?> checkAdRisk766(YtDyzUser dyzUser) {
         YtPlatformUserApp userApp;
@@ -1127,7 +1167,7 @@ public class RiskServiceImpl implements RiskService {
             userApp =  appMapper.selectParentApp(dyzUser.getAppId());
         } else {
             YtApp ytApp = appMapper.selectRiskApp(dyzUser.getAppId());
-            userApp =  appMapper.selectParentApp(ytApp.getSuperiorId());
+            userApp = appMapper.selectParentApp(ytApp.getSuperiorId());
         }
         Object o = feignInvoker.invoke(userApp.getServiceName(), "adRecords", dyzUser.getUserId(),
                 AdSourceTypeEnum.rewarded_video.getAdSourceType());
@@ -1151,39 +1191,5 @@ public class RiskServiceImpl implements RiskService {
         return Result.resultOk(RepMessage.QUERY_SUCCESS);
     }
 
-    /**
-     * 344 游客模式登陆用户风控校验<br>
-     * 原生(信息流)、开屏广告、横幅对应 ecpm 和预估收益 小于 阈值时,校验失败
-     * @param dyzUser 该设备同应用的最新一条注册用户信息
-     * @param view 当前校验的设备登录的应用风控配置
-     */
-    private boolean checkVisitor344(YtDyzUser dyzUser, RiskTemplateView view) {
-        //根据用户所属应用查询该应用母包openid查询用户信息
-        List<RiskConfigView> configList = view == null ? Collections.emptyList() : view.getConfigList();
-        Map<String, String> configMap = configList.stream()
-                .filter(item -> item.getMulty() != null && item.getMulty() == 4)
-                .collect(Collectors.toMap(RiskConfigView::getFieldName, RiskConfigView::getConfigVal,
-                (o1,o2)-> o2));
-        //根据用户所属应用查询该应用母包openid查询用户信息
-        YtApp ytApp = appMapper.selectRiskApp(dyzUser.getAppId());
-        YtPlatformUserApp userApp = appMapper.selectParentApp(ytApp.getSuperiorId());
-        Object result = feignInvoker.invoke(userApp.getServiceName(), "getUerAdStatics", dyzUser.getAppId(), dyzUser.getUserId());
-        boolean checkResult = true;
-        if (result != null) {
-            List<UserAdStaticsVo> userAdStaticsVos = JSONArray.parseArray(JSONObject.toJSONString(result), UserAdStaticsVo.class);
-            for (UserAdStaticsVo userAdStaticsVo : userAdStaticsVos) {
-                String ecpmKey = StrUtil.format("ecpmLimit_{}", userAdStaticsVo.getAdSourceType());
-                String revenueKey = StrUtil.format("revenueLimit_{}", userAdStaticsVo.getAdSourceType());
-                checkResult = checkResult && limitCompare(userAdStaticsVo.getTotalEcpm(), ecpmKey, configMap);
-                checkResult = checkResult && limitCompare(userAdStaticsVo.getTotalRevenue(), revenueKey, configMap);
-            }
-        }
-        return checkResult;
-    }
-
-    private boolean limitCompare(BigDecimal totalValue, String limitKey,  Map<String, String> configMap) {
-        BigDecimal limitValue = new BigDecimal(configMap.getOrDefault(limitKey, "0"));
-        return totalValue == null || totalValue.compareTo(limitValue) <= 0;
-    }
 
 }