ソースを参照

风控修改动态调用feign

marxjaw 2 ヶ月 前
コミット
906e21afa9

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

@@ -1,92 +1,16 @@
 package com.ytpm.feign;
 
 import com.ytpm.app.model.YtDyzUser;
-import com.ytpm.app.param.AppQueryUserTodayTimeParam;
-import com.ytpm.app.param.AppUserQueryParam;
 import com.ytpm.feign.fallback.RiskFeignFallBack;
 import com.ytpm.general.Result;
-import com.ytpm.general.ResultTable;
-import com.ytpm.risk.param.RiskBannedListParam;
-import com.ytpm.risk.param.RiskBannedParam;
-import com.ytpm.risk.param.RiskConfigParam;
-import com.ytpm.risk.param.RiskDeblockingListParam;
-import com.ytpm.risk.param.RiskRelativeAppParam;
-import com.ytpm.risk.param.RiskUserStatusParam;
-import com.ytpm.risk.view.RiskBannedListView;
-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.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
 
 @FeignClient(name = "risk-manage", fallback = RiskFeignFallBack.class)
 public interface RiskFeign {
-
-    @GetMapping("/riskManage/forbidLogin")
-    Result<?> lockUser(@RequestParam("userId")String userId,@RequestParam("appId")String appId);
-
-    @PostMapping("/riskManage/banned")
-    Result<?> banned(@RequestBody RiskBannedParam param);
-
-    @PostMapping("/riskConfig/list")
-    ResultTable<RiskConfigListView> getConfigList(@RequestBody RiskConfigParam param);
-
-    @PostMapping("/riskManage/bannedList")
-    ResultTable<RiskBannedListView> bannedList(@RequestBody RiskBannedListParam param);
-
-    @PostMapping("/riskManage/deblockingList")
-    ResultTable<RiskDeblockingListView> deblockingList(@RequestBody RiskDeblockingListParam param);
-
-    @PostMapping("/riskManage/changeUserStatus")
-    Result<?> changeUserStatus(@RequestBody RiskUserStatusParam param);
-
-    @PostMapping("/riskManage/relativeApp")
-    Result<?> relativeApp(@RequestBody RiskRelativeAppParam param);
-
-    @PostMapping("/riskConfig/saveConfig")
-    Result<?> saveConfig(@RequestBody RiskConfigParam param);
-
-    @PostMapping("/riskConfig/updateConfig")
-    Result<?> updateConfig(@RequestBody RiskConfigParam param);
-
-    @GetMapping("/riskConfig/options")
-    ResultTable<RiskConfigView> getRiskConfig(@RequestParam("appIds")String appIds);
-
-    @GetMapping("/riskConfig/getByNode")
-    ResultTable<RiskConfigView> getByNode(@RequestParam("effectNode")Integer effectNode);
-
-    @GetMapping("/riskConfig/enabledConfig")
-    Result<?> isEnabledConfig(@RequestParam("templateId")String templateId);
-
-    @GetMapping("/riskConfig/templateView")
-    Result<RiskTemplateView> templateView(@RequestParam("templateId")String templateId);
-
     @PostMapping("/public/checkRisk")
     Result<?> checkRisk(@RequestBody YtDyzUser ytDyzUser);
-
-    @GetMapping("/public/getRiskCondition")
-    Result<RiskTemplateView> getRiskCondition(@RequestParam("app_id")String appId, @RequestParam("access_secret")String secret);
-
-    @GetMapping("/public/getRiskByCode")
-    Result<RiskTemplateView> getRiskByCode(@RequestParam("code")String code);
-
     @PostMapping("/public/checkAdRisk")
     Result<?> checkAdRisk(@RequestBody YtDyzUser ytDyzUser);
-
-    @PostMapping("/riskManage/queryBanned")
-    Result<Map<String, Integer>> queryBanned(@RequestBody AppUserQueryParam appUserQueryParam);
-
-    @PostMapping ("/riskManage/queryBannedByHourToday")
-    Result<Map<String, int[]>> queryBannedByHourToday(@RequestBody AppQueryUserTodayTimeParam appQueryUserTodayTimeParam);
-
-    @PostMapping("/public/batchAudit")
-    void batchAudit(@RequestParam(value = "userList") List<YtDyzUser> userList);
 }

+ 0 - 34
yt-risk/risk-manage/src/main/java/com/ytpm/controller/RiskManageController.java

@@ -53,10 +53,6 @@ public class RiskManageController {
     @Resource
     private RiskService riskService;
 
-    @Resource
-    private AppFeign appFeign;
-
-
     /**
      * 用户禁登
      */
@@ -122,36 +118,6 @@ public class RiskManageController {
         return riskService.relativeApp(param);
     }
 
-    /**
-     * 查询封禁数和封号数
-     */
-    @ApiOperation("查询封禁数和封号数")
-    @PostMapping("/queryBanned")
-    public Result<Map<String, Integer>> queryBanned(@RequestBody AppUserQueryParam appUserQueryParam) {
-        Map<String, Integer> map = new HashMap<>();
-        List<YtPlatformBanned> bannedList =
-                riskService.queryBannedRecordGroupByUserId(appUserQueryParam.getStartTime(), appUserQueryParam.getEndTime(),appUserQueryParam.getAppIdList());
-
-        if (CollUtil.isNotEmpty(bannedList)){
-            AppUserTodayBannedParam appUserTodayBannedParam = new AppUserTodayBannedParam();
-            appUserTodayBannedParam.setStartTime(appUserQueryParam.getStartTime());
-            appUserTodayBannedParam.setEndTime(appUserQueryParam.getEndTime());
-            appUserTodayBannedParam.setUserIdList(bannedList.stream().map(YtPlatformBanned::getUserId).collect(Collectors.toList()));
-            List<YtDyzUser> ytDyzUsers = appFeign.queryTodayBanned(appUserTodayBannedParam);
-            if (CollUtil.isNotEmpty(ytDyzUsers)){
-                map.put("lock", ytDyzUsers.size());
-            }
-            else {
-                map.put("lock", 0);
-            }
-        }
-        else {
-            map.put("lock", 0);
-        }
-            map.put("risk", 0);
-        return Result.resultObjOk(map);
-    }
-
     @ApiOperation("查询今日每小时的封禁数和封控数(按封禁记录时间)")
     @PostMapping ("/queryBannedByHourToday")
     public Result<Map<String, int[]>> queryBannedByHourToday(@RequestBody AppQueryUserTodayTimeParam appQueryUserTodayTimeParam) {

+ 19 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/dao/AppMapper.java

@@ -0,0 +1,19 @@
+package com.ytpm.dao;
+
+import com.ytpm.agent.model.YtApp;
+import com.ytpm.agent.model.YtPlatformUserApp;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface AppMapper {
+    /**
+     * 应用ID查询应用
+     */
+    YtApp selectRiskApp(@Param("appId") String appId);
+
+    /**
+     * 查询上级应用
+     */
+    YtPlatformUserApp selectParentApp(@Param("appId")String appId);
+}

+ 31 - 87
yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

@@ -8,24 +8,30 @@ import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.ytpm.advertise.enums.AdSourceTypeEnum;
+import com.ytpm.agent.model.YtApp;
 import com.ytpm.agent.model.YtPlatformBanned;
 import com.ytpm.agent.model.YtPlatformDeblocking;
+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.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzLoginRecord;
 import com.ytpm.app.model.YtDyzUser;
-import com.ytpm.app.param.AppUserParam;
 import com.ytpm.custom.CustomField;
+import com.ytpm.dao.AppMapper;
 import com.ytpm.dao.DictMapper;
 import com.ytpm.dao.RiskConfigMapper;
 import com.ytpm.dao.RiskManageMapper;
 import com.ytpm.dao.RiskUserMapper;
 import com.ytpm.feign.AppFeign;
+import com.ytpm.general.PageMeta;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
@@ -48,6 +54,7 @@ import com.ytpm.risk.view.RiskConfigView;
 import com.ytpm.risk.view.RiskDeblockingListView;
 import com.ytpm.risk.view.RiskTemplateView;
 import com.ytpm.service.RiskService;
+import com.ytpm.util.FeignClientInvoker;
 import com.ytpm.util.RedisService;
 import com.ytpm.util.ReflectUtil;
 import io.swagger.annotations.ApiModelProperty;
@@ -73,9 +80,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @Slf4j(topic = "风控服务")
@@ -83,6 +87,8 @@ import java.util.stream.Collectors;
 @RefreshScope
 public class RiskServiceImpl extends ReflectUtil implements RiskService {
 
+    @Autowired
+    private FeignClientInvoker feignInvoker;
     @Value("${risk.banned.defaultLimit}")
     private Integer defaultLimit;
     @Value("${risk.banned.defaultReason}")
@@ -95,14 +101,12 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
     private RiskUserMapper riskUserMapper;
     @Resource
     private RiskManageMapper riskManageMapper;
-    @Resource
-    private AppFeign appFeign;
-    @Autowired
-    private IRunFeign iRunFeign;
     @Value("${risk.banned.tips}")
     private String tips;
     @Resource
     private RedisService redisService;
+    @Resource
+    private AppMapper appMapper;
     /**
      * 查询配置字段选项
      */
@@ -264,70 +268,12 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
         PageHelper.startPage(param.getPage(),param.getLimit());
         List<RiskBannedListView> bannedList = riskManageMapper.getBannedList(param);
         if(CollUtil.isNotEmpty(bannedList)){
-            setBannedLoginInfo(bannedList);
+//            setBannedLoginInfo(bannedList);
         }
         return ResultTable.resultTableOk(new PageInfo<RiskBannedListView>(bannedList));
     }
 
-    /**
-     * 查询登录记录并设置信息
-     */
-    private void setBannedLoginInfo(List<RiskBannedListView> bannedList) {
-        String userIds = bannedList.stream().map(
-                RiskBannedListView::getUserId).distinct().collect(Collectors.joining(","));
-        AppUserParam appUserParam = new AppUserParam();
-        appUserParam.setUserIds(userIds);
-        List<YtDyzUser> data = appFeign.getUserList(appUserParam);
-        List<YtDyzUser> irunData = iRunFeign.getUserList(appUserParam).getData();
-        if(CollUtil.isNotEmpty(irunData)){data.addAll(irunData);}
-        Map<String, YtDyzUser> collect = data.stream().collect(Collectors.toMap(YtDyzUser::getUserId, o->o));
-        for (RiskBannedListView view : bannedList) {
-            if(!collect.containsKey(view.getUserId()))continue;
-            YtDyzUser dyzUser = collect.get(view.getUserId());
-            List<YtDyzLoginRecord> recordList = dyzUser.getLoginRecordList();
-            if(CollUtil.isNotEmpty(recordList)){
-                view.setPhoneModel(recordList.get(0).getDeviceModel());
-                view.setPhoneBrand(recordList.get(0).getDeviceBrand());
-                view.setIpAddr(recordList.get(0).getIpAddr());
-                view.setCommunicationOperator(recordList.get(0).getOperator());
-            }
-            view.setPlatformId(dyzUser.getPlatformId());
-            view.setChannelId(dyzUser.getUserId());
-            view.setUserId(dyzUser.getUserId());
-            view.setNickName(dyzUser.getNickName());
-            view.setRegistryTime(dyzUser.getRegistryTime());
-            view.setLastLoginIp(dyzUser.getLastLoginIp());
-            view.setLastLoginTime(dyzUser.getLastLoginTime());
-            view.setUserStatus(dyzUser.getUserStatus());
-        }
-    }
-
-    /**
-     * 设置解封用户信息
-     */
-    private void setDeblockLoginInfo(List<RiskDeblockingListView> deblockingList,RiskDeblockingListParam param) {
-        String userIds = deblockingList.stream().map(
-                RiskDeblockingListView::getUserId).distinct().collect(Collectors.joining(","));
-        AppUserParam appUserParam = new AppUserParam();
-        appUserParam.setUserIds(userIds);
-        appUserParam.setLoginTimeBegin(param.getLoginTimeBegin());
-        appUserParam.setLoginTimeEnd(param.getLoginTimeEnd());
-        List<YtDyzUser> data = appFeign.getUserList(appUserParam);
-        List<YtDyzUser> irunData = iRunFeign.getUserList(appUserParam).getData();
-        if(CollUtil.isNotEmpty(irunData)){data.addAll(irunData);}
-        Map<String, YtDyzUser> collect = data.stream().collect(Collectors.toMap(YtDyzUser::getUserId, o->o));
-        for (RiskDeblockingListView view : deblockingList) {
-            if(!collect.containsKey(view.getUserId()))continue;
-            YtDyzUser dyzUser = collect.get(view.getUserId());
-            view.setPlatformId(dyzUser.getPlatformId());
-            view.setChannelId(dyzUser.getUserId());
-            view.setUserId(dyzUser.getUserId());
-            view.setNickName(dyzUser.getNickName());
-            view.setRegistryTime(dyzUser.getRegistryTime());
-            view.setLastLoginTime(dyzUser.getLastLoginTime());
-            view.setUserStatus(dyzUser.getUserStatus());
-        }
-    }
+
     /**
      * 查询解封记录
      */
@@ -336,7 +282,7 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
         PageHelper.startPage(param.getPage(),param.getLimit());
         List<RiskDeblockingListView> deblockingList = riskManageMapper.getDeblockingList(param);
         if(CollUtil.isNotEmpty(deblockingList)){
-            setDeblockLoginInfo(deblockingList,param);
+//            setDeblockLoginInfo(deblockingList,param);
         }
         return ResultTable.resultTableOk(new PageInfo<RiskDeblockingListView>(deblockingList));
     }
@@ -458,12 +404,12 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
      */
     private void checkRisk322(YtDyzUser dyzUser) {
         RiskTemplateView view = configMapper.getByCode("322");
-        //根据openid查询用户信息
-        List<YtDyzUser> dyzUsers = appFeign.queryByOpenid(dyzUser.getWxOpenId());
-        List<YtDyzUser> irunUsers = iRunFeign.queryByOpenid(dyzUser.getWxOpenId());
-        if(CollUtil.isNotEmpty(irunUsers)){
-            dyzUsers.addAll(irunUsers);
-        }
+        //根据用户所属应用查询该应用母包openid查询用户信息
+        YtApp ytApp = appMapper.selectRiskApp(dyzUser.getAppId());
+        YtPlatformUserApp userApp =  appMapper.selectParentApp(ytApp.getSuperiorId());
+        Object o = feignInvoker.invoke(userApp.getServiceName(),"queryByOpenid",dyzUser.getWxOpenId());
+        List<YtDyzUser> dyzUsers = JSONArray.parseArray(JSON.toJSONString(o), YtDyzUser.class);
+
         List<RiskConfigView> configList = view.getConfigList();
         Map<String, String> configMap = configList.stream().collect(
                 Collectors.toMap(RiskConfigView::getFieldName, RiskConfigView::getConfigVal));
@@ -538,27 +484,25 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
         if(CollUtil.isNotEmpty(vo)){
             return Result.resultOk(RepMessage.QUERY_SUCCESS);
         }
-        ResultTable<YtDyzAdRecord> table = appFeign.adRecords(dyzUser.getUserId(),AdSourceTypeEnum.rewarded_video.getAdSourceType());
-        List<YtDyzAdRecord> records = table.getData();
-        List<YtDyzAdRecord> irunData = iRunFeign.adRecords(dyzUser.getUserId(),AdSourceTypeEnum.rewarded_video.getAdSourceType()).getData();
-        if(CollUtil.isNotEmpty(irunData)){records.addAll(irunData);}
-
-        if(CollUtil.isEmpty(records)){
+        YtApp ytApp = appMapper.selectRiskApp(dyzUser.getAppId());
+        YtPlatformUserApp userApp =  appMapper.selectParentApp(ytApp.getSuperiorId());
+        Object o = feignInvoker.invoke(userApp.getServiceName(),"adRecords",dyzUser.getUserId(),AdSourceTypeEnum.rewarded_video.getAdSourceType());
+        JSONObject object = JSON.parseObject(JSON.toJSONString(o));
+        List<YtDyzAdRecord> adRecords = JSONArray.parseArray(object.getString("data"), YtDyzAdRecord.class);
+        if(CollUtil.isEmpty(adRecords)){
             return Result.resultOk(RepMessage.QUERY_SUCCESS);
         }
         //过滤出当日的激励视频数据 按照时间正序排以便筛选每日前几条激励视频
-        records = records.stream().filter(s->
+        adRecords = adRecords.stream().filter(s->
             DateUtil.isSameDay(DateUtil.parse(s.getFinishTime()), new Date())
         ).sorted(Comparator.comparing(YtDyzAdRecord::getFinishTime)).collect(Collectors.toList());
         //校验风控742规则
         RiskTemplateView ecpmLimit= configMapper.getByCode(dyzUser.getAppId()+"-742");
-        checkRisk742(ecpmLimit,dyzUser,records);
+        checkRisk742(ecpmLimit,dyzUser,adRecords);
         //校验风控746规则
-        if(!records.isEmpty() && records.size()>1){
-            checkRisk746(dyzUser,records);
+        if(!adRecords.isEmpty() && adRecords.size()>1){
+            checkRisk746(dyzUser,adRecords);
         }
-        //查询用户所在app是否配置其他风控规则
-//        checkCustomRisk(dyzUser,EffectNodeEnum.ADSOURCE.getNode(),table.getData());
         return Result.resultOk(RepMessage.QUERY_SUCCESS);
     }
 

+ 89 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/util/FeignClientInvoker.java

@@ -0,0 +1,89 @@
+package com.ytpm.util;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * FeignClient公共调用类
+ * @author Marx
+ * @date 2025/8/19 17:22
+ */
+@Component
+public class FeignClientInvoker {
+
+    private final ApplicationContext applicationContext;
+    private final Map<String, Object> feignClientCache = new HashMap<>();
+    private final Map<String, Method> methodCache = new HashMap<>();
+
+    public FeignClientInvoker(ApplicationContext applicationContext) {
+        this.applicationContext = applicationContext;
+    }
+
+    /**
+     * 动态调用FeignClient方法
+     * @param serviceName FeignClient的name属性值
+     * @param methodName 要调用的方法名
+     * @param args 方法参数
+     * @return 调用结果
+     */
+    public Object invoke(String serviceName, String methodName, Object... args) {
+        try {
+            // 1. 获取FeignClient实例
+            Object feignClient = getFeignClient(serviceName);
+            
+            // 2. 获取目标方法
+            Method method = getTargetMethod(feignClient, methodName, args);
+            
+            // 3. 执行方法调用
+            return method.invoke(feignClient, args);
+        } catch (Exception e) {
+            throw new RuntimeException("调用FeignClient失败: " + serviceName, e);
+        }
+    }
+
+    private Object getFeignClient(String serviceName) {
+        // 优先从缓存获取
+        if (feignClientCache.containsKey(serviceName)) {
+            return feignClientCache.get(serviceName);
+        }
+        
+        // 动态查找标注@FeignClient的Bean
+        Map<String, Object> feignClients = applicationContext.getBeansWithAnnotation(FeignClient.class);
+        for (Object bean : feignClients.values()) {
+            FeignClient annotation = bean.getClass().getInterfaces()[0].getAnnotation(FeignClient.class);
+            if (annotation != null && serviceName.equals(annotation.name())) {
+                feignClientCache.put(serviceName, bean);
+                return bean;
+            }
+        }
+        throw new IllegalArgumentException("未找到服务: " + serviceName);
+    }
+
+    private Method getTargetMethod(Object feignClient, String methodName, Object[] args) 
+        throws NoSuchMethodException {
+        
+        String cacheKey = feignClient.getClass().getName() + "#" + methodName;
+        
+        // 缓存命中直接返回
+        if (methodCache.containsKey(cacheKey)) {
+            return methodCache.get(cacheKey);
+        }
+        
+        // 获取参数类型
+        Class<?>[] argTypes = new Class[args.length];
+        for (int i = 0; i < args.length; i++) {
+            argTypes[i] = args[i].getClass();
+        }
+        
+        // 反射获取方法
+        Method method = feignClient.getClass().getMethod(methodName, argTypes);
+        methodCache.put(cacheKey, method);
+        
+        return method;
+    }
+}

+ 17 - 0
yt-risk/risk-manage/src/main/resources/mapper/AppMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.AppMapper">
+
+    <select id="selectRiskApp" resultType="com.ytpm.agent.model.YtApp">
+        select
+            app_id, app_key, app_name, user_id, app_type, apk_url, qr_code, version_code, update_tips, enabled, store_on_sale, store_type, store_url, package_name, domain, category, sub_category, coppa, screen_orientation, ccpa, feign_path, ditch_id, ditch_name, superior_id
+        from yt_app
+        where app_id = #{appId}
+    </select>
+    <select id="selectParentApp" resultType="com.ytpm.agent.model.YtPlatformUserApp">
+        select
+            app_id, app_name, user_id, app_type, detail_url, package_name, domain, issued_time, wx_app_id, wx_secret, sale_price, grant_type, charge_status, feign_class_path, service_name, create_time, create_user_id, update_time, update_user_id, available
+        from yt_platform_user_app
+        where app_id = #{appId}
+    </select>
+</mapper>