Procházet zdrojové kódy

Merge branch 'master' into lih

hidewnd před 1 měsícem
rodič
revize
5716271ac1

+ 24 - 5
ReadMe.md

@@ -52,7 +52,7 @@
 #### 核心服务
 
 ```shell
-# risk-manageer
+# risk-manager
 nohup java -jar -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
 -XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1ReservePercent=10 \
 -XX:MaxGCPauseMillis=300 risk-manage.jar > risk.log 2>&1 &
@@ -68,11 +68,9 @@ nohup java -jar -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressed
 -XX:MaxGCPauseMillis=300 agent-service.jar > agent.log 2>&1 &
 
 # gateway
-nohup java -jar -Xmn500m -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
--XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1ReservePercent=10 \
--XX:MaxGCPauseMillis=300 yt-gateway.jar > gateway.log 2>&1 &
+nohup java -jar -Xms512m -Xmx1024m yt-gateway.jar > /dev/null 2>&1 &
 
-# oauth 
+# oauth
 nohup java -Xms512m -Xmx1024m -jar -noverify yt-oauth.jar > oauth.log 2>&1 &
 ```
 
@@ -721,8 +719,29 @@ nohup java -jar -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressed
 question-service.jar > adventure.log 2>&1 &
 ```
 
+#### 青柠檬ios lemonios
+
+```shell
+# 青柠檬ios lemonios
+# 10.206.16.11  10.206.16.15
+nohup java -jar -Xms3072m -Xmx3072m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+-XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 \
+-XX:G1ReservePercent=10 -XX:MaxGCPauseMillis=300 \
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-ios-lemon/lemonios.hprof \
+lemonios-service.jar > lemonios.log 2>&1 &
+```
 
+#### 咕噜日记ios gollumios
 
+```shell
+# 咕噜日记ios gollumios
+# 10.206.16.11  10.206.16.15
+nohup java -jar -Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+-XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 \
+-XX:G1ReservePercent=10 -XX:MaxGCPauseMillis=300 \
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-ios-gollum/gollumios.hprof \
+gollumios-service.jar > gollumios.log 2>&1 &
+```
 
 
 

+ 0 - 4
yt-agent/agent-service/src/main/java/com/ytpm/service/impl/AgentDitchServiceImpl.java

@@ -11,7 +11,6 @@ import com.ytpm.dao.AppMapper;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
-import com.ytpm.lemonios.feign.LemonIosFeign;
 import com.ytpm.service.AgentDitchService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -30,9 +29,6 @@ public class AgentDitchServiceImpl implements AgentDitchService {
     @Resource
     private AppMapper appMapper;
 
-    @Resource
-    private LemonIosFeign lemonIosFeign;
-
 
     @Override
     public ResultTable<AgentDitchView> ditchList(DitchListParam param) {

+ 14 - 0
yt-common/src/main/java/com/ytpm/util/DateUtil.java

@@ -4,6 +4,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.util.Calendar;
 import java.util.Date;
 
 public class DateUtil {
@@ -59,6 +60,19 @@ public class DateUtil {
         ).atTime(23, 59, 59);
         return localDateTimeToDate(monthEnd);
     }
+    // 获取本周周一
+    public static Date getWeekStart() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+        return calendar.getTime();
+    }
+
+    //获取本周周日
+    public static Date getWeekEnd() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+        return calendar.getTime();
+    }
 
     private static Date localDateTimeToDate(LocalDateTime localDateTime) {
         return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

+ 105 - 0
yt-gateway/src/main/resources/logback.xml

@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!--服务名-->
+    <property name="server.name" value="yt-gateway" />
+    <!-- 日志存放路径 -->
+    <property name="log.path" value="logs/yt-gateway" />
+    <!-- 日志输出格式 -->
+    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- 系统日志输出 -->
+    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/info.${server.name}.log</file>
+        <!-- 循环策略:基于时间和大小创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/info.${server.name}.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <!-- 日志最大的历史 30 天 -->
+            <maxHistory>30</maxHistory>
+            <!-- 单个文件最大体积 -->
+            <maxFileSize>20MB</maxFileSize>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <appender name="file_warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/warn.${server.name}.log</file>
+        <!-- 循环策略:基于时间和大小创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/warn.${server.name}.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <!-- 日志最大的历史 30 天 -->
+            <maxHistory>30</maxHistory>
+            <!-- 单个文件最大体积 -->
+            <maxFileSize>20MB</maxFileSize>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>WARN</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/error.${server.name}.log</file>
+        <!-- 循环策略:基于时间和大小创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.${server.name}.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
+            <!-- 日志最大的历史 30 天 -->
+            <maxHistory>30</maxHistory>
+            <!-- 单个文件最大体积 -->
+            <maxFileSize>20MB</maxFileSize>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统模块日志级别控制  -->
+    <logger name="com.ytpm" level="info" />
+    <!-- Spring日志级别控制  -->
+    <logger name="org.springframework" level="warn" />
+
+    <root level="info">
+        <appender-ref ref="console" />
+    </root>
+
+    <!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+</configuration>

+ 1 - 1
yt-ios-lemon/lemon-ios-feign/src/main/java/com/ytpm/lemonios/feign/GollumIosFeign.java → yt-ios-lemon/lemon-ios-feign/src/main/java/com/ytpm/lemonios/feign/feign/GollumIosFeign.java

@@ -1,4 +1,4 @@
-package com.ytpm.lemonios.feign;
+package com.ytpm.lemonios.feign.feign;
 
 import com.ytpm.lemonios.feign.base.BaseFeign;
 import org.springframework.cloud.openfeign.FeignClient;

+ 1 - 1
yt-ios-lemon/lemon-ios-feign/src/main/java/com/ytpm/lemonios/feign/LemonIosFeign.java → yt-ios-lemon/lemon-ios-feign/src/main/java/com/ytpm/lemonios/feign/feign/LemonIosFeign.java

@@ -1,4 +1,4 @@
-package com.ytpm.lemonios.feign;
+package com.ytpm.lemonios.feign.feign;
 
 import com.ytpm.lemonios.feign.base.BaseFeign;
 import org.springframework.cloud.openfeign.FeignClient;

+ 4 - 0
yt-ios-lemon/lemon-ios-service/pom.xml

@@ -16,6 +16,10 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
     <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>

+ 21 - 2
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/controller/WxController.java

@@ -140,7 +140,26 @@ public class WxController {
             IosUserInfo userInfo = setIosUserInfo(param);
             user = appUserService.crudForNewTransIos(param, userInfo);
         }
+        //2.拿3条记录 设置到user
         List<YtDyzAdRecord> adRecordList = recordMapper.getByIosIdBeforeLogin(param.getIosId());
+        List<YtDyzAdRecord> newAdRecordList = new ArrayList<>();
+        if (adRecordList != null && !adRecordList.isEmpty()) {
+            for (YtDyzAdRecord adRecord : adRecordList) {
+                if (adRecord.getAdSourceType() == 0){
+                    newAdRecordList.add(adRecord);
+                }
+                if (adRecord.getAdSourceType() == 2){
+                    newAdRecordList.add(adRecord);
+                }
+                if (adRecord.getAdSourceType() == 4){
+                    newAdRecordList.add(adRecord);
+                }
+            }
+        }
+        if (CollUtil.isEmpty(newAdRecordList) || newAdRecordList.size() < 3) {
+            WxDefaultConfig defaultConfig = appUserMapper.getLastDefaultConfig();
+            return Result.resultErr(defaultConfig.getLowValueTip());
+        }
         user.setPreAdRecordList(adRecordList);
         user.setLoginType(LoginType.VISITOR);
         user.setAppId(appId);
@@ -149,9 +168,9 @@ public class WxController {
             String errorMessage = result.getMessage();
             if (user.getLoginType() == LoginType.VISITOR && RepMessage.RISK_VISITOR_LOWER_VALUE.equals(errorMessage)) {
                 WxDefaultConfig defaultConfig = appUserMapper.getLastDefaultConfig();
-                throw new CommonException(StrUtil.emptyToDefault(defaultConfig.getLowValueTip(), errorMessage));
+                return Result.resultErr(StrUtil.emptyToDefault(defaultConfig.getLowValueTip(), errorMessage));
             }
-            throw new CommonException(errorMessage);
+            return Result.resultErr(errorMessage);
         }
         YtDyzUser newUser = new YtDyzUser();
         newUser.setUserId(user.getUserId());

+ 3 - 1
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/service/impl/AdServiceImpl.java

@@ -51,6 +51,8 @@ public class AdServiceImpl implements AdService {
     private String tips;
     @Autowired
     private RiskFeign riskFeign;
+    @Value("${yt.ios.appid:}")
+    private String appId;
 
     /**
      * 保存广告记录
@@ -72,7 +74,7 @@ public class AdServiceImpl implements AdService {
                 adRecord.setFinishTime(DateUtil.format(new Date(param.getFinishtimestamp()), "yyyy-MM-dd HH:mm:ss"));
             }
             adRecord.setIosId(param.getIosId());
-            adRecord.setAppId("251be4dff0fd408fbc1fe2c47bf515eb");
+            adRecord.setAppId(appId);
             adRecord.setRecordId(IdUtil.fastSimpleUUID());
             adRecord.setNetworkName(AdPlatformTypeEnum.getDesc(Integer.parseInt(param.getNetworkFormId())));
             adRecordMapper.addOneVisitor(adRecord);

+ 2 - 1
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/service/impl/DitchServiceImpl.java

@@ -28,7 +28,8 @@ public class DitchServiceImpl implements DitchService {
     @Override
     public Integer save(YtApp app) {
         YtDitch ytDitch = new YtDitch();
-        ytDitch.setDitchName(app.getAppName());
+        ytDitch.setDitchId(app.getDitchId());
+        ytDitch.setDitchName(app.getDitchName());
         ytDitch.setUserId(app.getUserId());
         ytDitch.setAppId(app.getAppId());
         ytDitch.setAppType(app.getAppType().toString());

+ 2 - 0
yt-ios-lemon/lemon-ios-service/src/main/resources/mapper/AdRecordMapper.xml

@@ -138,6 +138,8 @@
             record_id, user_id,app_id,ios_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_visitor
         where ios_id = #{iosId}
+        ORDER BY finish_time DESC
+        limit 3
     </select>
     <select id="getByUserByParam" resultType="com.ytpm.app.model.YtDyzAdRecord">
         select

+ 279 - 0
yt-ios-lemon/lemon-ios-service/src/test/java/com/ytpm/test/GenerateTest.java

@@ -0,0 +1,279 @@
+package com.ytpm.test;
+
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ytpm.agent.param.AppParam;
+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 org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author lih
+ * @date 2025-09-09 16:32
+ */
+public class GenerateTest {
+
+
+    @Test
+    public void test() {
+        System.out.println("  ");
+        MiddleUserInfo userInfo = new MiddleUserInfo();
+        userInfo.setUserId("yt_agent_1972558716489269248");
+        userInfo.setNickName("易推-苏洵");
+        generateTest("咕噜咕噜", "7587e10fda4b4e82b698cc7515b9b425", userInfo);
+
+    }
+
+    public void generateTest(String appName, String appId, MiddleUserInfo loginUser) {
+        AppParam param = new AppParam();
+        param.setAppId(appId);
+        param.setAppName(appName);
+        param.setUserId(loginUser.getUserId());
+        addTemp344(param, loginUser);
+        addTemp345(param, loginUser);
+        addTemp766(param, loginUser);
+        addTemp767(param, loginUser);
+        addTemp768(param, loginUser);
+
+//        addTemp742(param, loginUser);
+//        addTemp746(param, loginUser);
+    }
+
+    private void addTemp746(AppParam param, MiddleUserInfo loginUser) {
+        String initRevenue = "0.15";
+        String appId = param.getAppId();
+        String agentId = param.getUserId();
+
+        List<YtRiskConfig> configs = new ArrayList<>();
+
+        YtRiskConfig config = createRiskConfig(param.getUserId(), "rewardCount", "当日前2条获得奖励的激励视频", "2",2);
+        configs.add(config);
+            config = createRiskConfig(param.getUserId(), "income", "总收益为<"+initRevenue, initRevenue,4);
+        configs.add(config);
+
+        String templateId = IdUtil.getSnowflakeNextIdStr();
+        YtRiskTemplate template = new YtRiskTemplate(templateId,"最低收益限制",
+                "当日前2条获得奖励的激励视频,总收益为<"+initRevenue,appId+"-746",agentId,
+                2,appId,new Date(),loginUser.getUserId(),null,
+                null,1,1,1);
+        createTemplate(template);
+
+        // 风控模板关联配置项
+        bindTempConfig(loginUser, template, configs);
+        //风控模版关联应用
+        createRelation(template, loginUser, param.getAppName());
+    }
+
+    private void addTemp742(AppParam param, MiddleUserInfo loginUser) {
+        String initEcpm = "20";
+        String appId = param.getAppId();
+        String agentId = param.getUserId();
+        List<YtRiskConfig> configs = new ArrayList<>();
+
+        YtRiskConfig config = createRiskConfig(param.getUserId(), "firstAdCount", "当日前4条激励视频", "4",2);
+        configs.add(config);
+
+        config = createRiskConfig(param.getUserId(), "haveCount", "有2条", "2",2);
+        configs.add(config);
+
+        config = createRiskConfig(param.getUserId(), "ecpm", "ecpm值为<"+initEcpm, initEcpm,4);
+        configs.add(config);
+
+        String templateId = IdUtil.getSnowflakeNextIdStr();
+        YtRiskTemplate template = new YtRiskTemplate(templateId,"激励视频ecpm值控制",
+                "当日前4条激励视频,有2条,ecpm值为<"+initEcpm,appId+"-742",agentId,
+                2,appId,new Date(),loginUser.getUserId(),null,
+                null,1,1,1);
+        createTemplate(template);
+        // 风控模板关联配置项
+        bindTempConfig(loginUser, template, configs);
+        //风控模版关联应用
+        createRelation(template, loginUser, param.getAppName());
+    }
+
+
+
+    private void addTemp344(AppParam param, MiddleUserInfo loginUser) {
+        String initVisitorRevenueLimit = "0.04";
+        // 风控规则 开屏广告、横幅、原生(信息流)总预估收益<'{}'
+        String appId = param.getAppId();
+        String agentId = param.getUserId();
+        List<YtRiskConfig> configs = new ArrayList<>();
+        YtRiskConfig riskConfig = createRiskConfig(param.getUserId(), "revenueLimit",
+                StrUtil.format("开屏广告、横幅、原生(信息流)总预估收益<{},", initVisitorRevenueLimit), initVisitorRevenueLimit, 4);
+        configs.add(riskConfig);
+        String templateId = IdUtil.getSnowflakeNextIdStr();
+        YtRiskTemplate template = new YtRiskTemplate(templateId, "游客用户总预估收益限制",
+                StrUtil.format("开屏广告、横幅、原生(信息流)总预估收益<{},", initVisitorRevenueLimit),
+                appId + "-344", agentId, 2, appId,
+                new Date(), loginUser.getUserId(), null, null,
+                1, 1, 1);
+        createTemplate(template);
+        // 风控模板关联配置项
+        bindTempConfig(loginUser, template, configs);
+        //风控模版关联应用
+        createRelation(template, loginUser, param.getAppName());
+    }
+
+    private void addTemp345(AppParam param, MiddleUserInfo loginUser) {
+        String initVisitorEcpmLimit = "20";
+        // 风控规则 开屏广告、横幅、原生(信息流)总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);
+        createTemplate(template);
+        // 风控模板关联配置项
+        bindTempConfig(loginUser, template, configs);
+        //风控模版关联应用
+        createRelation(template, loginUser, param.getAppName());
+    }
+
+    private void addTemp768(AppParam param, MiddleUserInfo loginUser) {
+        // 每{}小时用户获得完成{}个获得奖励的激励视频
+        String initHourCount = "3";
+        String initHourTaskLimit = "10";
+        String appId = param.getAppId();
+        String agentId = param.getUserId();
+        Date currentDate = new Date();
+        List<YtRiskConfig> configs = new ArrayList<>();
+        YtRiskConfig riskConfig;
+        riskConfig = createRiskConfig(agentId, "hourCount",
+                StrUtil.format("{}小时内,", initHourCount), initHourCount, 2);
+        configs.add(riskConfig);
+        riskConfig = createRiskConfig(agentId, "hourTaskLimit",
+                StrUtil.format("获得奖励的激励视频数>{}", initHourTaskLimit), initHourTaskLimit, 3);
+        configs.add(riskConfig);
+        String templateId = IdUtil.getSnowflakeNextIdStr();
+        YtRiskTemplate template = new YtRiskTemplate(templateId, "小时区间任务数完成限制",
+                StrUtil.format("{}小时内,获得奖励的激励视频数>{}", initHourCount, initHourTaskLimit),
+                appId + "-768", agentId, 2, appId,
+                currentDate, loginUser.getUserId(), null, null,
+                1, 1, 1);
+        createTemplate(template);
+        // 风控模板关联配置项
+        bindTempConfig(loginUser, template, configs);
+        //风控模版关联应用
+        createRelation(template, loginUser, param.getAppName());
+    }
+
+
+    private void addTemp767(AppParam param, MiddleUserInfo loginUser) {
+        // 风控规则 每{}月用户获得{}个获得奖励的激励视频
+        String initMonthCount = "1";
+        String initMonthTaskLimit = "80";
+
+        String appId = param.getAppId();
+        String agentId = param.getUserId();
+        Date currentDate = new Date();
+        List<YtRiskConfig> configs = new ArrayList<>();
+        YtRiskConfig riskConfig;
+        riskConfig = createRiskConfig(agentId, "monthCount",
+                StrUtil.format("{}月内", initMonthCount), initMonthCount, 2);
+        configs.add(riskConfig);
+        riskConfig = createRiskConfig(agentId, "monthTaskLimit",
+                StrUtil.format("获得奖励的激励视频数>{}", initMonthTaskLimit), initMonthTaskLimit, 3);
+        configs.add(riskConfig);
+        String templateId = IdUtil.getSnowflakeNextIdStr();
+        YtRiskTemplate template = new YtRiskTemplate(templateId, "月区间任务完成数限制",
+                StrUtil.format("{}月内,获得奖励的激励视频数>{}", initMonthCount, initMonthTaskLimit),
+                appId + "-767", agentId, 2, appId,
+                currentDate, loginUser.getUserId(), null, null,
+                1, 1, 1);
+        createTemplate(template);
+        // 风控模板关联配置项
+        bindTempConfig(loginUser, template, configs);
+        //风控模版关联应用
+        createRelation(template, loginUser, param.getAppName());
+    }
+
+    private void addTemp766(AppParam param, MiddleUserInfo loginUser) {
+        // 风控规则:当用户完成广告类型 激励视频  {}个 数时,获取近期{} * {} 条收益(平均取整)平均值 ,低于预设值 {} 时,
+        String initAdCompletedCount = "10";
+        String initFirstCount = "4";
+        String initAverageRevenue = "0.12";
+
+        String appId = param.getAppId();
+        String agentId = param.getUserId();
+        Date currentDate = new Date();
+        List<YtRiskConfig> configs = new ArrayList<>();
+        YtRiskConfig riskConfig;
+        riskConfig = createRiskConfig(agentId, "adCompletedCount",
+                StrUtil.format("当日用户获得{}个获得奖励的激励视频,"), initAdCompletedCount, 2);
+        configs.add(riskConfig);
+        riskConfig = createRiskConfig(agentId, "firstCount",
+                StrUtil.format("最后{}个获得奖励的激励视频", initFirstCount), initFirstCount, 2);
+        configs.add(riskConfig);
+        riskConfig = createRiskConfig(agentId, "averageRevenue",
+                StrUtil.format("平均收益<{}", initAverageRevenue), initAverageRevenue, 4);
+        configs.add(riskConfig);
+        String templateId = IdUtil.getSnowflakeNextIdStr();
+        String templateContent = StrUtil.format("当日用户获得{}个获得奖励的激励视频,最后{}个获得奖励的激励视频平均收益<{}",
+                initAdCompletedCount, initFirstCount, initAverageRevenue);
+        YtRiskTemplate template = new YtRiskTemplate(templateId,"成本收益限制", templateContent,
+                appId + "-766", agentId, 2, appId,
+                currentDate, loginUser.getUserId(),null, null,
+                1,1,1);
+        createTemplate(template);
+        // 风控模板关联配置项
+        bindTempConfig(loginUser, template, configs);
+        //风控模版关联应用
+        createRelation(template, loginUser, param.getAppName());
+    }
+
+    private void createTemplate(YtRiskTemplate template) {
+        //        riskMapper.insertTemplate(template);
+        System.out.println(StrUtil.format("insert into yt_risk_template (template_id,template_name, template_content, template_code, channel_id, effect_node, app_id,all_satisfy, create_time,create_user_id, enabled, can_modify ) " +
+                        " values ('{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}' );\n", template.getTemplateId(), template.getTemplateName(), template.getTemplateContent(), template.getTemplateCode(),
+                template.getChannelId(), template.getEffectNode(), template.getAppId(), template.getAllSatisfy(), DateUtil.format(template.getCreateTime(), "yyyy-MM-dd HH:mm:ss"), template.getCreateUserId(), template.getEnabled(), template.getCanModify()));
+    }
+
+    private void createRelation(YtRiskTemplate template, MiddleUserInfo loginUser, String appName) {
+        //        riskMapper.relativeApp(appId, param.getAppName(), template.getTemplateId(), loginUser.getNickName(), loginUser.getUserId());
+        System.out.println(StrUtil.format("insert into yt_cofig_app (template_id, app_id, app_name, operator, operator_name, operator_time) values ('{}','{}','{}','{}','{}',now());\n",
+                template.getTemplateId(), template.getAppId(), appName, loginUser.getUserId(), loginUser.getNickName()));
+    }
+
+    /**
+     * 创建输出框类型配置项
+     */
+    private YtRiskConfig createRiskConfig(String agentId, String fieldName, String filedDesc, String initVal, Integer multi) {
+        String configId = IdUtil.getSnowflakeNextIdStr();
+        YtRiskConfig config = new YtRiskConfig(configId, agentId, fieldName, filedDesc, 1, initVal, multi);
+//        riskMapper.insertConfigItem(config);
+        System.out.println(StrUtil.format("insert into yt_risk_config (config_id,field_name,field_desc,config_type,config_val,multy,channel_id ) values ('{}','{}','{}',{},'{}',{},'{}');\n",
+                config.getConfigId(), config.getFieldName(), config.getFieldDesc(), config.getConfigType(), config.getConfigVal(), config.getMulty(), config.getChannelId()));
+        return config;
+    }
+
+    /**
+     * 绑定模板配置项
+     */
+    private void bindTempConfig(MiddleUserInfo loginUser, YtRiskTemplate template, List<YtRiskConfig> configs) {
+        YtRiskTemplateConfig templateConfig;
+        Date currentDate = new Date();
+        for (YtRiskConfig config : configs) {
+            templateConfig = new YtRiskTemplateConfig(template.getTemplateId(), config.getConfigId(),
+                    loginUser.getUserId(), loginUser.getNickName(), currentDate);
+//            riskMapper.insertTempConfig(templateConfig);
+            System.out.println(StrUtil.format("insert into yt_risk_template_config (template_id,config_id,operator,operator_time,operator_name) values('{}','{}','{}','{}','{}');\n",
+                    templateConfig.getTemplateId(), templateConfig.getConfigId(), templateConfig.getOperator(), DateUtil.format(templateConfig.getOperatorTime(), "yyyy-MM-dd HH:mm:ss")));
+        }
+    }
+}

+ 9 - 0
yt-question/yt-question-feign/src/main/java/com/ytpm/question/feign/PoetryFeign.java

@@ -0,0 +1,9 @@
+package com.ytpm.question.feign;
+
+import com.ytpm.question.base.BaseFeign;
+import org.springframework.cloud.openfeign.FeignClient;
+
+@FeignClient(name = "poetry-service")
+public interface PoetryFeign extends BaseFeign {
+
+}

+ 2 - 2
yt-question/yt-question-service/src/main/java/com/ytpm/question/dao/AppUserMapper.java

@@ -130,12 +130,12 @@ public interface AppUserMapper {
     /**
      * 查询应用排行榜
      */
-    List<AppRankingListVO> getAppRanking(@Param("sortBy") int sortBy,@Param("limit") int limit);
+    List<AppRankingListVO> getAppRanking(@Param("beginTime") Date beginTime,@Param("endTime") Date endTime,@Param("limit") int limit);
 
     /**
      * 查询用户排行榜数据
      */
-    List<UserRankingListVO> getUserRanking(@Param("sortBy") int sortBy,@Param("limit") int limit);
+    List<UserRankingListVO> getUserRanking(@Param("beginTime") Date beginTime,@Param("endTime") Date endTime,@Param("limit") int limit);
 
     /**
      * 根据应用查询用户数量

+ 19 - 2
yt-question/yt-question-service/src/main/java/com/ytpm/question/service/impl/AdServiceImpl.java

@@ -29,6 +29,7 @@ import com.ytpm.question.dao.AdRecordMapper;
 import com.ytpm.question.dao.AppUserMapper;
 import com.ytpm.question.service.AdService;
 import com.ytpm.question.view.AgentNetworkAgg;
+import com.ytpm.util.DateUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,6 +42,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -121,13 +123,28 @@ public class AdServiceImpl implements AdService {
 
     /**
      * 查询排行榜信息
+     * @param sortBy 1-当日 2-本周 3-本月
      */
     @Override
     public DashboardRankingListVO queryRankingList(Integer sortBy, Integer limit) {
+        Date beginTime,endTime;
+        switch (sortBy) {
+            case 1:
+                beginTime = DateUtil.getTodayStart();
+                endTime = DateUtil.getTodayEnd();
+                break;
+            case 2:
+                beginTime = DateUtil.getWeekStart();
+                endTime = DateUtil.getWeekEnd();
+                break;
+            default:
+                beginTime = DateUtil.getMonthStart();
+                endTime = DateUtil.getMonthEnd();
+        }
         //查询前五个应用名称 当日收益  用户数量
-        List<AppRankingListVO> appRankingList = appUserMapper.getAppRanking(sortBy, limit);
+        List<AppRankingListVO> appRankingList = appUserMapper.getAppRanking(beginTime,endTime, limit);
         //查询前五个用户  所属应用  视频数 总收益 ecpm
-        List<UserRankingListVO> userRankingList = appUserMapper.getUserRanking(sortBy, limit);
+        List<UserRankingListVO> userRankingList = appUserMapper.getUserRanking(beginTime,endTime, limit);
         return new DashboardRankingListVO(appRankingList, userRankingList);
     }
 

+ 4 - 30
yt-question/yt-question-service/src/main/resources/mapper/AppUserMapper.xml

@@ -542,21 +542,8 @@
         FROM
         yt_dyz_ad_record ar
         JOIN yt_dyz_user u ON ar.user_id = u.user_id
-        <where>
-            <if test="sortBy != null">
-                <choose>
-                    <when test="sortBy == 1">
-                        DATE_FORMAT( ar.finish_time, '%Y-%m-%d' ) = CURRENT_DATE()
-                    </when>
-                    <when test=" sortBy == 2">
-                        YEARWEEK( ar.finish_time, 1 ) = YEARWEEK(now(),1)
-                    </when>
-                    <otherwise>
-                        DATE_FORMAT( ar.finish_time, '%Y-%m' ) = DATE_FORMAT(NOW(), '%Y-%m')
-                    </otherwise>
-                </choose>
-            </if>
-        </where>
+        WHERE ar.finish_time >= #{beginTime}
+        AND ar.finish_time <![CDATA[<=]]> #{endTime}
         GROUP BY
         u.app_id
         ORDER BY
@@ -573,21 +560,8 @@
         FROM
         yt_dyz_ad_record ar
         JOIN yt_dyz_user u ON ar.user_id = u.user_id
-        <where>
-            <if test="sortBy != null">
-                <choose>
-                    <when test="sortBy == 1">
-                        DATE_FORMAT( ar.finish_time, '%Y-%m-%d' ) = CURRENT_DATE()
-                    </when>
-                    <when test=" sortBy == 2">
-                        YEARWEEK( ar.finish_time, 1 ) = YEARWEEK(now(),1)
-                    </when>
-                    <otherwise>
-                        DATE_FORMAT( ar.finish_time, '%Y-%m' ) = DATE_FORMAT(NOW(), '%Y-%m')
-                    </otherwise>
-                </choose>
-            </if>
-        </where>
+        WHERE ar.finish_time >= #{beginTime}
+          AND ar.finish_time <![CDATA[<=]]> #{endTime}
         GROUP BY ar.user_id
         ORDER BY
         sum( ar.revenue ) DESC