Browse Source

广告记录风控优化

marxjaw 4 months ago
parent
commit
78f4dccb1f

+ 5 - 1
yt-app/app-service/src/main/java/com/ytpm/service/impl/AdServiceImpl.java

@@ -11,6 +11,7 @@ import com.ytpm.dao.AppUserMapper;
 import com.ytpm.feign.RiskFeign;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
+import com.ytpm.handle.CustomerException;
 import com.ytpm.service.AdService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,7 +55,10 @@ public class AdServiceImpl implements AdService {
         dyzUser.setTotalIncome(user.getTotalIncome().add(param.getRevenue()));
         appUserMapper.updateUser(dyzUser);
         //调用风控广告校验
-        riskFeign.checkAdRisk(param.getUserId(),param.getRevenue());
+        Result<?> result = riskFeign.checkAdRisk(param.getUserId(),param.getRevenue());
+        if(result.getCode()!=200){
+            throw new CustomerException(result.getMessage());
+        }
         return Result.resultOk(RepMessage.SAVE_SUCCESS);
     }
 }

+ 1 - 1
yt-risk/risk-feign/src/main/java/com/ytpm/feign/RiskFeign.java

@@ -74,5 +74,5 @@ public interface RiskFeign {
     Result<RiskTemplateView> getRiskByCode(@RequestParam("code")String code);
 
     @GetMapping("/public/checkAdRisk")
-    void checkAdRisk(@RequestParam("userId")String userId,@RequestParam("revenue")BigDecimal revenue);
+    Result<?> checkAdRisk(@RequestParam("userId")String userId,@RequestParam("revenue")BigDecimal revenue);
 }

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

@@ -54,8 +54,8 @@ public class PublicApiController {
      */
     @ApiOperation("校验广告的默认风控配置")
     @GetMapping("/checkAdRisk")
-    public void checkAdRisk(@RequestParam("userId")String userId,@RequestParam("revenue") BigDecimal revenue){
-        riskService.checkAdRisk(userId,revenue);
+    public Result<?> checkAdRisk(@RequestParam("userId")String userId,@RequestParam("revenue") BigDecimal revenue){
+       return riskService.checkAdRisk(userId,revenue);
     }
 
 }

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

@@ -90,5 +90,5 @@ public interface RiskService {
     /**
      * 校验广告的默认风控配置
      */
-    void checkAdRisk(String userId, BigDecimal revenue);
+    Result<?> checkAdRisk(String userId, BigDecimal revenue);
 }

+ 21 - 16
yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

@@ -461,7 +461,7 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
      * 校验广告的默认风控配置
      */
     @Override
-    public void checkAdRisk(String userId,BigDecimal userRevenue) {
+    public Result<?> checkAdRisk(String userId,BigDecimal userRevenue) {
         ResultTable<YtDyzAdRecord> table = appFeign.adRecords(userId);
         List<YtDyzAdRecord> records = table.getData();
         //校验风控742规则
@@ -469,6 +469,7 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
         checkRisk742(ecpmLimit,userId,records);
         //校验风控746规则
         checkRisk746(userId,records,userRevenue);
+        return Result.resultOk(RepMessage.QUERY_SUCCESS);
     }
 
     /**
@@ -489,11 +490,11 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
         }
         //判断当日获得收益的广告达到预设数值,触发风控规则
         int rewardCount = Integer.parseInt(revenueMap.get("rewardCount"));
-        if(rewardCount>=incomeCount){
+        if(incomeCount>=rewardCount){
             BigDecimal income = new BigDecimal(revenueMap.get("income"));
             //获取最先的两条
             BigDecimal reduce = revenues.stream().map(YtDyzAdRecord::getRevenue).reduce(BigDecimal.ZERO, BigDecimal::add);
-            if(income.compareTo(reduce)<0){
+            if(reduce.compareTo(income)<0){
                 riskLockUser(userId, "746","系统判定小于最低收益限制","用户已被风控,风控编码:746");
             }
         }
@@ -510,15 +511,16 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
         ++adCount;
         //判断当日观看视频数已经达到风控条件预设的视频数
         int firstAdCount = Integer.parseInt(limitMap.get("firstAdCount"));
-        if(firstAdCount>=adCount){
-            //判断存在ecpm小于预设值 达到预设条数时触发风控
-            int haveCount = Integer.parseInt(limitMap.get("haveCount"));
+        if(adCount>=firstAdCount){
+            //过滤出ecpm值小于预设值的视频数
+            int ecpm = Integer.parseInt(limitMap.get("ecpm"));
             long count = records.stream().filter(
-                    s -> (s.getEcpm().compareTo(BigDecimal.valueOf(haveCount))) > 0).count();
+                    s -> (s.getEcpm().compareTo(BigDecimal.valueOf(ecpm))) < 0).count();
             int exact = Math.toIntExact(count);
-            if(count>exact){
+            //判断小于预设值的视频数超出预设次数
+            int haveCount = Integer.parseInt(limitMap.get("haveCount"));
+            if(exact>haveCount){
                 riskLockUser(userId, "742","系统判定激励视频ecpm值过低","用户已被风控,风控编码:742");
-
             }
         }
     }
@@ -527,14 +529,17 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
      * 风控锁定用户
      */
     private void riskLockUser(String userId, String riskCode, String tempName, String errMsg) {
-        YtDyzUser next = new YtDyzUser();
-        next.setUserId(userId);
-        next.setUserStatus(UserStatusEnum.LOCK.getCode());
-        next.setRiskCode(riskCode);
-        next.setRiskReason(tempName);
-        appFeign.updateUserInfo(next);
-        //创建一次性定时任务用于24小时后解锁用户
+        //懒得引入mq,因而利用线程池创建延迟定时任务修改用户状态,主线程继续执行,避免循环调用产生的死锁
         ScheduledExecutorService scheduled  = Executors.newSingleThreadScheduledExecutor();
+        scheduled.schedule(()->{
+            YtDyzUser next = new YtDyzUser();
+            next.setUserId(userId);
+            next.setUserStatus(UserStatusEnum.LOCK.getCode());
+            next.setRiskCode(riskCode);
+            next.setRiskReason(tempName);
+            appFeign.updateUserInfo(next);
+        },300,TimeUnit.MILLISECONDS);
+        //创建一次性定时任务用于24小时后解锁用户
         scheduled.schedule(()->{
             YtDyzUser user = new YtDyzUser();
             user.setUserId(userId);