浏览代码

ADS后台修改

marxjaw 2 月之前
父节点
当前提交
cdb862319d

+ 2 - 0
yt-common/src/main/java/com/ytpm/agent/view/AgentAppView.java

@@ -125,4 +125,6 @@ public class AgentAppView {
     private String superiorName;
     @ApiModelProperty("出包码")
     private Integer appCode;
+    @ApiModelProperty("服务名称")
+    private String serviceName;
 }

+ 14 - 0
yt-common/src/main/java/com/ytpm/agent/view/FeignServeAppView.java

@@ -0,0 +1,14 @@
+package com.ytpm.agent.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("远程服务调用类")
+public class FeignServeAppView {
+    @ApiModelProperty("服务名")
+    private String serviceName;
+    @ApiModelProperty("应用ID")
+    private String appIds;
+}

+ 3 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/dao/ApkMapper.java

@@ -3,6 +3,7 @@ package com.ytpm.middle.dao;
 import com.ytpm.agent.model.YtApp;
 import com.ytpm.agent.param.AppListParam;
 import com.ytpm.agent.view.AgentAppView;
+import com.ytpm.agent.view.FeignServeAppView;
 import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
 
@@ -45,4 +46,6 @@ public interface ApkMapper {
      * 根据母包ID查询子包
      */
     List<AgentAppView> queryBySuperiorId(@Param("superiorId") String superiorId);
+
+    List<FeignServeAppView> queryServeAndApp();
 }

+ 14 - 11
yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/ApkServiceImpl.java

@@ -1,34 +1,31 @@
 package com.ytpm.middle.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.ytpm.agent.model.YtApp;
-import com.ytpm.agent.model.YtPlatformUserApp;
 import com.ytpm.agent.param.AppListParam;
 import com.ytpm.agent.param.AppParam;
 import com.ytpm.agent.view.AgentAppView;
-import com.ytpm.app.enums.AppTypeEnums;
-import com.ytpm.app.model.YtAppDefaultConfig;
 import com.ytpm.app.view.WxDefaultConfig;
-import com.ytpm.feign.AppFeign;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
 import com.ytpm.middle.dao.ApkMapper;
-import com.ytpm.middle.dao.AppMapper;
 import com.ytpm.middle.dao.RiskMapper;
 import com.ytpm.middle.service.ApkService;
 import com.ytpm.middle.util.AliOSSUtil;
-import com.ytpm.middle.view.AppListVO;
+import com.ytpm.middle.util.FeignClientInvoker;
 import com.ytpm.middle.view.MiddleUserInfo;
 import com.ytpm.risk.model.YtRiskConfig;
 import com.ytpm.risk.model.YtRiskTemplate;
 import com.ytpm.risk.model.YtRiskTemplateConfig;
 import com.ytpm.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
@@ -36,7 +33,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
@@ -52,12 +48,12 @@ public class ApkServiceImpl implements ApkService {
     private ApkMapper apkMapper;
     @Resource
     private RiskMapper riskMapper;
-    @Resource
-    private AppFeign appFeign;
     @Value("${risk.config.initEcpm}")
     private String initEcpm;
     @Value("${risk.config.initRevenue}")
     private String initRevenue;
+    @Autowired
+    private FeignClientInvoker feignInvoker;
 
     /**
      * 查询应用列表
@@ -67,7 +63,14 @@ public class ApkServiceImpl implements ApkService {
         PageHelper.startPage(appListParam.getPage(), appListParam.getLimit());
         List<AgentAppView> views = apkMapper.searchAppList(appListParam);
         String appIds = views.stream().map(AgentAppView::getAppId).collect(Collectors.joining(","));
-        List<WxDefaultConfig> configs = appFeign.getConfigs(appIds);
+        List<String> serviceList = views.stream().map(AgentAppView::getServiceName).distinct().collect(Collectors.toList());
+        List<WxDefaultConfig> configs = new ArrayList<>();
+        for (String serve : serviceList) {
+           Object o = feignInvoker.invoke(serve, "getConfigs", appIds);
+            if(Objects.isNull(o))continue;
+            List<WxDefaultConfig> configList = JSONArray.parseArray(JSON.toJSONString(o), WxDefaultConfig.class);
+            configs.addAll(configList);
+        }
         Map<String, Integer> appTypeMap = configs.stream().collect(Collectors.toMap(WxDefaultConfig::getAppId, WxDefaultConfig::getAppType));
         //分析OSS实时日志统计下载次数
         Map<String, Integer> countDownloadMap = AliOSSUtil.getCountDownload(

+ 17 - 6
yt-middle/middle-platform/src/main/java/com/ytpm/middle/service/impl/CountServiceImpl.java

@@ -3,13 +3,16 @@ package com.ytpm.middle.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.ytpm.agent.view.AgentAppView;
+import com.ytpm.agent.view.FeignServeAppView;
 import com.ytpm.feign.AppFeign;
 import com.ytpm.general.Result;
 import com.ytpm.middle.dao.ApkMapper;
 import com.ytpm.middle.dao.EnterpriseMapper;
 import com.ytpm.middle.dao.RiskMapper;
 import com.ytpm.middle.service.CountService;
+import com.ytpm.middle.util.FeignClientInvoker;
 import com.ytpm.middle.util.RedisUtil;
 import com.ytpm.middle.view.AppRankingListVO;
 import com.ytpm.middle.view.AppUserHourVO;
@@ -18,6 +21,7 @@ import com.ytpm.middle.view.DashboardRankingListVO;
 import com.ytpm.middle.view.DashboardRevenueVO;
 import com.ytpm.middle.view.DashboardRiskVO;
 import com.ytpm.middle.view.DashboardTopCountVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
@@ -37,6 +41,8 @@ public class CountServiceImpl implements CountService {
     private EnterpriseMapper enterpriseMapper;
     @Resource
     private ApkMapper apkMapper;
+    @Autowired
+    private FeignClientInvoker feignInvoker;
     @Resource
     private AppFeign appFeign;
     @Resource
@@ -56,13 +62,18 @@ public class CountServiceImpl implements CountService {
         DashboardTopCountVo vo = new DashboardTopCountVo();
         vo.setAgentCount(enterpriseMapper.countEnterprise());
         vo.setApkCount(apkMapper.countApk());
-        Map<String, BigDecimal> map = appFeign.getAdCount(apkMapper.getAppIds());
-        if(!map.isEmpty()){
-            BigDecimal adCount = map.get("adCount");
-            BigDecimal revenue = map.get("expectRevenue");
-            vo.setAdCount(Objects.isNull(adCount) ? 0 : adCount.intValue());
-            vo.setExpectRevenue(Objects.isNull(revenue) ? BigDecimal.ZERO : revenue);
+        List<FeignServeAppView> appViews = apkMapper.queryServeAndApp();
+        Map<String, String> serveMap = appViews.stream().collect(Collectors.toMap(FeignServeAppView::getServiceName, FeignServeAppView::getAppIds));
+        BigDecimal resultAdCount = new BigDecimal(0);
+        BigDecimal resultRevenue = new BigDecimal(0);
+        for (Map.Entry<String, String> entry : serveMap.entrySet()) {
+            Object o = feignInvoker.invoke(entry.getKey(), "getAdCount",entry.getValue());
+            JSONObject object = JSONObject.parseObject(JSON.toJSONString(o));
+            resultAdCount = resultAdCount.add(object.getBigDecimal("adCount"));
+            resultRevenue = resultRevenue.add(object.getBigDecimal("expectRevenue"));
         }
+        vo.setAdCount(resultAdCount.intValue());
+        vo.setExpectRevenue(resultRevenue);
         return Result.resultObjOk(vo);
     }
 

+ 89 - 0
yt-middle/middle-platform/src/main/java/com/ytpm/middle/util/FeignClientInvoker.java

@@ -0,0 +1,89 @@
+package com.ytpm.middle.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;
+    }
+}

+ 10 - 0
yt-middle/middle-platform/src/main/resources/mapper/ApkMapper.xml

@@ -8,6 +8,7 @@
         ya.app_name,
         ya.superior_id,
         pua.app_name superiorName,
+        pua.service_name,
         ya.user_id,
         ya.app_type,
         ya.apk_url,
@@ -75,6 +76,15 @@
         from yt_app
         where enabled = 1 and superior_id = #{superiorId}
     </select>
+    <select id="queryServeAndApp" resultType="com.ytpm.agent.view.FeignServeAppView">
+        select
+            pua.service_name,
+            group_concat(a.app_id) appIds
+        from yt_platform_user_app pua
+        left join yt_app a on pua.app_id = a.superior_id and a.apk_url is not null
+        where pua.service_name is not null and pua.user_id is not null
+        group by pua.service_name
+    </select>
 
     <insert id="insertOne">
         insert into yt_app

+ 0 - 1
yt-risk/risk-manage/src/main/resources/bootstrap.yml

@@ -3,7 +3,6 @@ server:
 #  port: 25523
 spring:
   profiles:
-
     active: prod
 ---
 spring: