Bläddra i källkod

Merge remote-tracking branch 'origin/master'

marxjaw 1 månad sedan
förälder
incheckning
8ea2fb4717
22 ändrade filer med 1036 tillägg och 120 borttagningar
  1. 530 98
      ReadMe.md
  2. 5 0
      yt-agent/agent-service/src/main/java/com/ytpm/dao/AppMapper.java
  3. 5 1
      yt-agent/agent-service/src/main/java/com/ytpm/service/impl/AgentAppServiceImpl.java
  4. 0 4
      yt-agent/agent-service/src/main/java/com/ytpm/service/impl/AgentDitchServiceImpl.java
  5. 14 1
      yt-agent/agent-service/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java
  6. 8 2
      yt-agent/agent-service/src/main/resources/mapper/AppMapper.xml
  7. 4 0
      yt-common/src/main/java/com/ytpm/app/param/DyzAdRecordParam.java
  8. 99 0
      yt-gateway/src/main/resources/logback.xml
  9. 3 5
      yt-ios-lemon/lemon-ios-feign/src/main/java/com/ytpm/lemonios/feign/base/BaseFeign.java
  10. 9 0
      yt-ios-lemon/lemon-ios-feign/src/main/java/com/ytpm/lemonios/feign/feign/GollumIosFeign.java
  11. 9 0
      yt-ios-lemon/lemon-ios-feign/src/main/java/com/ytpm/lemonios/feign/feign/LemonIosFeign.java
  12. 4 0
      yt-ios-lemon/lemon-ios-service/pom.xml
  13. 8 2
      yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/config/interceptor/HttpInterceptor.java
  14. 27 3
      yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/controller/WxController.java
  15. 11 1
      yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/service/impl/AdServiceImpl.java
  16. 2 1
      yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/service/impl/DitchServiceImpl.java
  17. 2 1
      yt-ios-lemon/lemon-ios-service/src/main/resources/bootstrap.yml
  18. 2 0
      yt-ios-lemon/lemon-ios-service/src/main/resources/mapper/AdRecordMapper.xml
  19. 279 0
      yt-ios-lemon/lemon-ios-service/src/test/java/com/ytpm/test/GenerateTest.java
  20. 2 1
      yt-question/yt-question-feign/src/main/java/com/ytpm/question/base/BaseFeign.java
  21. 9 0
      yt-question/yt-question-feign/src/main/java/com/ytpm/question/feign/AdventureFeign.java
  22. 4 0
      yt-question/yt-question-service/src/main/resources/bootstrap.yml

+ 530 - 98
ReadMe.md

@@ -47,28 +47,11 @@
 
 ## 服务部署
 
+服务部署根目录: `/data/www/app/ytpm/`
 
+#### 核心服务
 
 ```shell
-# 1.进入部署目录
-cd /data/www/app/ytpm/[service]
-# 2.检查服务是否已部署
-ps -ef|grep -s [service]
-# 3.前往nacos下线当前实例
-# 4.查询实例日志,观察服务已停止接受请求
-tail -fn 100 [service].log
-# 5.关闭当前实例
-# 6.启动实例:
-#####################
-
-# gateway
-nohup java -jar -Xms1024m -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 &
-
-# oauth 
-nohup java -Xms512m -Xmx1024m -jar -noverify yt-oauth.jar > oauth.log 2>&1 &
-
 # risk-manager
 nohup java -jar -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
 -XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1ReservePercent=10 \
@@ -84,234 +67,683 @@ nohup java -jar -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressed
 -XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1ReservePercent=10 \
 -XX:MaxGCPauseMillis=300 agent-service.jar > agent.log 2>&1 &
 
-#####################
+# gateway
+nohup java -jar -Xms512m -Xmx1024m yt-gateway.jar > /dev/null 2>&1 &
+
+# oauth
+nohup java -Xms512m -Xmx1024m -jar -noverify yt-oauth.jar > oauth.log 2>&1 &
+```
 
-# nofeeds-service
-nohup java -jar -Xms1024m -Xmx1024m -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/nofeeds.hprof \
-nofeeds-service.jar > nofeeds.log 2>&1 &
 
+#### 青柠记账 lime
 
+```shell
 # 青柠记账 lime-service
+# 10.206.16.10
+# 10.206.16.11
+
 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/lime.hprof \
-lime-service.jar > lime.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-lime/lime.hprof \
+question-service.jar > lime.log 2>&1 &
+
+
+# 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/lime.hprof \
+# lime-service.jar > lime.log 2>&1 &
+```
+
+
+
+#### Nofeeds nofeeds
+
+```shell
+# nofeeds-service
+# 10.206.16.11
+# 10.206.16.15
+
+nohup java -jar -Xms1024m -Xmx1024m -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-nofeeds/nofeeds.hprof \
+question-service.jar > nofeeds.log 2>&1 &
+
+# ohup java -jar -Xms1024m -Xmx1024m -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/nofeeds.hprof \
+# nofeeds-service.jar > nofeeds.log 2>&1 &
+```
+
+
 
-#######################
+#### 典故问答王 allusion
 
+```shell
 # 典故问答王 allusion-service
+# 10.206.0.3
+# 10.206.0.13
 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/allusion.hprof \
 allusion-service.jar > allusion.log 2>&1 &
 
+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-allusion/allusion.hprof \
+question-service.jar > allusion.log 2>&1 &
+```
+
+
+
+#### 计数计算器 calculator
 
+```shell
 # 计数计算器 calculator-service
+# 10.206.0.3
+# 10.206.16.15
 nohup java -jar -Xms1024m -Xmx1024m -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/calculator.hprof \
-calculator-service.jar > calculator.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-calculator/calculator.hprof \
+question-service.jar > calculator.log 2>&1 &
+
+#nohup java -jar -Xms1024m -Xmx1024m -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/calculator.hprof \
+#calculator-service.jar > calculator.log 2>&1 &
+```
+
 
 
+#### 斗图表情大师 emoticons
+
+```shell
 # 斗图表情大师 emoticons-service
+# 10.206.0.3
+# 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/emoticons.hprof \
-emoticons-service.jar > emoticons.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-emoticons/emoticons.hprof \
+question-service.jar > emoticons.log 2>&1 &
+
+#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/emoticons.hprof \
+#emoticons-service.jar > emoticons.log 2>&1 &
+```
+
 
-# algebraic-service.jar
-nohup java -jar -Xms1024m -Xmx1024m -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/algebraic.hprof \
-algebraic-service.jar > algebraic.log 2>&1 &
 
+#### 算术小达人 arithmetic
 
+```shell
 # 算术小达人 arithmetic-service
+# 10.206.16.11
+# 10.206.0.8
+
 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/arithmetic.hprof \
-arithmetic-service.jar > arithmetic.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-arithmetic/arithmetic.hprof \
+question-service.jar > arithmetic.log 2>&1 &
+
+#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/arithmetic.hprof \
+#arithmetic-service.jar > arithmetic.log 2>&1 &
+
+```
+
+
 
+#### 计步趣健身 countstep
 
+```shell
 # 计步趣健身 countstep-service
+# 10.206.0.3
+# 10.206.0.13
+
 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/countstep.hprof \
-countstep-service.jar > countstep.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-countstep/countstep.hprof \
+question-service.jar > countstep.log 2>&1 &
+
+#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/countstep.hprof \
+#countstep-service.jar > countstep.log 2>&1 &
+```
+
 
 
+#### 元气算术能手 vitality
+
+```shell
 # 元气算术能手 vitality-service
+# 10.206.0.3
+# 10.206.0.13
+
 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/vitality.hprof \
-vitality-service.jar > vitality.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-vitality/vitality.hprof \
+question-service.jar > vitality.log 2>&1 &
+
+#nohup java -jar -Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=512M -XX:+UseCompressedOops \
+#-XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 \
+#-XX:G1ReservePercent=10 -XX:MaxGCPauseMillis=300 \
+#-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/vitality.hprof \
+#vitality-service.jar > vitality.log 2>&1 &
+```
 
 
-# 小锦鲤 carp-service
-nohup java -jar -Xms1024m -Xmx1024m -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/carp.hprof \
-carp-service.jar > carp.log 2>&1 &
 
+#### 谚语知识赛 proverb
 
-# 谚语知识赛 proverb-service.
+```shell
+# 谚语知识赛 proverb-service
+# 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/proverb.hprof \
-proverb-service.jar > proverb.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-proverb/proverb.hprof \
+question-service.jar > proverb.log 2>&1 &
+
+#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/proverb.hprof \
+#proverb-service.jar > proverb.log 2>&1 &
+```
+
 
 
-# 谚语变形记 adage-service
+#### 代数式能手 algebraic
+
+```shell
+# 代数式能手 algebraic-service
+# 10.206.0.11
+# 10.206.0.13
 nohup java -jar -Xms1024m -Xmx1024m -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/adage.hprof \
-adage-service.jar > adage.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-algebraic/algebraic.hprof \
+question-service.jar > algebraic.log 2>&1 &
+
+#nohup java -jar -Xms1024m -Xmx1024m -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/algebraic.hprof \
+#algebraic-service.jar > algebraic.log 2>&1 &
+```
 
 
-# 好运答题王 dtw-service
-nohup java -jar -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+
+#### 成语趣解释 idiom
+
+```shell
+# 成语趣解释 idiom
+# 10.206.0.3
+# 10.206.16.11
+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/dtw.hprof \
-dtw-service.jar > dtw.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-idiom/idiom.hprof \
+question-service.jar > idiom.log 2>&1 &
+
+#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/idiom.hprof \
+#idiom-service.jar > idiom.log 2>&1 &
+```
 
 
-# 咕噜日记 diary-service
+
+
+
+#### 谚语变形记 adage
+
+```shell
+# 谚语变形记 adage
+# 10.206.0.11
+# 10.206.0.13
 nohup java -jar -Xms1024m -Xmx1024m -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/diary.hprof \
-diary-service.jar > diary.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-adage/adage.hprof \
+question-service.jar > adage.log 2>&1 &
+
+#nohup java -jar -Xms1024m -Xmx1024m -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/adage.hprof \
+#adage-service.jar > adage.log 2>&1 &
+```
+
 
 
+#### 答题达人 answer
+
+```shell
 # 答题达人 answer-service
+# 10.206.0.8
+# 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/answer.hprof \
-answer-service.jar > answer.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-answer/answer.hprof \
+question-service.jar > answer.log 2>&1 &
+
+#nohup java -jar -Xms3072m -Xmx3072m -XX:MaxMetaspaceSize=512M -XX:+UseCompressedOops \
+#-XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 \
+#-XX:G1ReservePercent=10 -XX:MaxGCPauseMillis=300 \
+#-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/answer.hprof \
+#answer-service.jar > answer.log 2>&1 &
+```
 
+#### 歇后语擂台 arena
 
-# 代数式能手 algebraic-service
+```shell
+# 歇后语擂台 arena-service
+# 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-arena/arena.hprof \
+question-service.jar > arena.log 2>&1 &
+
+#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/arena.hprof \
+#arena-service.jar > arena.log 2>&1 &
+```
+
+
+
+#### 小锦鲤 carp
+
+```shell
+# 小锦鲤 carp-service
+# 10.206.0.11
+# 10.206.0.13
 nohup java -jar -Xms1024m -Xmx1024m -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/algebraic.hprof \
-algebraic-service.jar > algebraic.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-carp/carp.hprof \
+question-service.jar > carp.log 2>&1 &
+
+#nohup java -jar -Xms1024m -Xmx1024m -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/carp.hprof \
+#carp-service.jar > carp.log 2>&1 &
+```
 
-# 歇后语擂台 arena-service
-nohup java -jar -Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+
+
+#### 好运答题王 dtw
+
+```shell
+# 好运答题王 dtw-service
+# 10.206.0.13
+# 10.206.16.15
+nohup java -jar -Xms1024m -Xmx1024m -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/arena.hprof \
-arena-service.jar > arena.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-dtw/dtw.hprof \
+question-service.jar > dtw.log 2>&1 &
+
+#nohup java -jar -Xms1024m -Xmx1024m -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/dtw.hprof \
+#dtw-service.jar > dtw.log 2>&1 &
+```
 
 
-# 天天趣算术 funarith
-nohup java -jar -Xms3072m -Xmx3072m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+
+#### 咕噜日记 diary
+
+```shell
+# 咕噜日记 diary-service
+# 10.206.0.3
+# 10.206.0.11
+nohup java -jar -Xms1024m -Xmx1024m -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/funarith.hprof \
-funarith-service.jar > funarith.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-diary/diary.hprof \
+question-service.jar > diary.log 2>&1 &
+
+#nohup java -jar -Xms1024m -Xmx1024m -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/diary.hprof \
+#diary-service.jar > diary.log 2>&1 &
+```
 
 
-# 成语趣解释 idiom
-nohup java -jar -Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+
+#### 天天趣算术 funarith
+
+```shell
+# 天天趣算术 funarith
+# 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/idiom.hprof \
-idiom-service.jar > idiom.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-funarith/funarith.hprof \
+question-service.jar > funarith.log 2>&1 &
+
+#nohup java -jar -Xms3072m -Xmx3072m -XX:MaxMetaspaceSize=512M -XX:+UseCompressedOops \
+#-XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 \
+#-XX:G1ReservePercent=10 -XX:MaxGCPauseMillis=300 \
+#-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/funarith.hprof \
+#funarith-service.jar > funarith.log 2>&1 &
+```
 
 
+
+#### 每天爱跑步 irun
+
+```bash
 # 每天爱跑步 irun
+# 10.206.0.13
+# 10.206.16.10
 nohup java -jar -Xms1024m -Xmx1024m -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/irun.hprof \
-irun-service.jar > irun.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-irun/irun.hprof \
+question-service.jar > irun.log 2>&1 &
+
+#nohup java -jar -Xms1024m -Xmx1024m -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/irun.hprof \
+#irun-service.jar > irun.log 2>&1 &
+```
 
 
+
+#### 宠物里程表 mileage
+
+```shell
 # 宠物里程表 mileage
+# 10.206.16.11
+# 10.206.16.15
 nohup java -jar -Xms4096m -Xmx4096m -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/mileage.hprof \
-mileage-service.jar > mileage.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-mileage/mileage.hprof \
+question-service.jar > mileage.log 2>&1 &
+
+#nohup java -jar -Xms4096m -Xmx4096m -XX:MaxMetaspaceSize=512M -XX:+UseCompressedOops \
+#-XX:+UseG1GC -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35 \
+#-XX:G1ReservePercent=10 -XX:MaxGCPauseMillis=300 \
+#-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/mileage.hprof \
+#mileage-service.jar > mileage.log 2>&1 &
+
+```
+
 
 
+#### 全民养猪 raisepig
+
+```shell
 # 全民养猪 raisepig
+# 10.206.0.3
+# 10.206.0.11
 nohup java -jar -Xms1024m -Xmx1024m -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/raisepig.hprof \
-raisepig-service.jar > raisepig.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-raisepig/raisepig.hprof \
+question-service.jar > raisepig.log 2>&1 &
+
+#nohup java -jar -Xms1024m -Xmx1024m -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/raisepig.hprof \
+#raisepig-service.jar > raisepig.log 2>&1 &
+```
+
 
 
+#### 找茬挑战王 picking
+
+```shell
 # 找茬挑战王 picking
+# 10.206.0.3
+# 10.206.0.11
 nohup java -jar -Xms1024m -Xmx1024m -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/picking.hprof \
-picking-service.jar > picking.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-picking/picking.hprof \
+question-service.jar > picking.log 2>&1 &
 
+#nohup java -jar -Xms1024m -Xmx1024m -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/picking.hprof \
+#picking-service.jar > picking.log 2>&1 &
+
+```
 
+
+
+#### 归物迹 summary
+
+```shell
 # 归物迹 summary
+# 10.206.0.11
+# 10.206.0.12
 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/summary.hprof \
-summary-service.jar > summary.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-summary/summary.hprof \
+question-service.jar > summary.log 2>&1 &
+
+#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/summary.hprof \
+#summary-service.jar > summary.log 2>&1 &
+```
+
+
 
+#### 打字训练营 typing
 
-  # 打字训练营 typing
+```shell
+# 打字训练营 typing
+# 10.206.16.10
+# 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/typing.hprof \
-typing-service.jar > typing.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-typing/typing.hprof \
+question-service.jar > typing.log 2>&1 &
+
+#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/typing.hprof \
+#typing-service.jar > typing.log 2>&1 &
+```
+
+
 
+#### 青柠檬记账 lemon
 
+```shell
 # 青柠檬记账 lemon
+# 10.206.0.3
 nohup java -jar -Xms1024m -Xmx1024m -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/lemon.hprof \
-lemon-service.jar > lemon.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-lemon/lemon.hprof \
+question-service.jar > lemon.log 2>&1 &
+
+#nohup java -jar -Xms1024m -Xmx1024m -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/lemon.hprof \
+#lemon-service.jar > lemon.log 2>&1 &
+
+```
+
 
 
+#### 走路趣计步 walk
+
+```shell
 # 走路趣计步 walk
+# 10.206.0.11
+# 10.206.16.15
 nohup java -jar -Xms1024m -Xmx1024m -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/walk.hprof \
-walk-service.jar > walk.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-walk/walk.hprof \
+question-service.jar > walk.log 2>&1 &
+
+#nohup java -jar -Xms1024m -Xmx1024m -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/walk.hprof \
+#walk-service.jar > walk.log 2>&1 &
+
+```
 
 
+
+#### 全民爱走路 walking
+
+```shell
 # 全民爱走路 walking
+# 10.206.16.10
+# 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-walking/walking.hprof \
+question-service.jar > walking.log 2>&1 &
+
 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/walking.hprof \
 walking-service.jar > walking.log 2>&1 &
+```
+
+#### 九宫格挑战 palaces
+
+```shell
+# 九宫格挑战 palaces
+# 10.206.0.12
+# 10.206.16.10
+nohup java -jar -Xms1024m -Xmx1024m -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-palaces/palaces.hprof \
+question-service.jar > palaces.log 2>&1 &
+```
+
+
+
+#### 极速反应力 reactivity
+
+```shell
+# 极速反应力 reactivity
+nohup java -jar -Xms1024m -Xmx1024m -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-reactivity/reactivity.hprof \
+question-service.jar > reactivity.log 2>&1 &
+
+```
+
+
+
+#### 走路王者 walkeking
+
+```shell
+# 走路王者 walkeking
+# 10.206.16.10
+# 10.206.16.11
+nohup java -jar -Xms1024m -Xmx1024m -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-walkeking/walkeking.hprof \
+question-service.jar > walkeking.log 2>&1 &
+```
+
 
 
+#### 逻辑谜 graphic
 
+````bash
+# 逻辑谜 graphic-service
+# 10.206.16.10
+# 10.206.0.13
+nohup java -jar -Xms2024m -Xmx2024m -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-graphic/graphic.hprof \
+question-service.jar > graphic.log 2>&1 &
+````
+
+#### 色彩大冒险 adventure
+
+```shell
+# 色彩大冒险 adventure
+# 10.206.16.10
+nohup java -jar -Xms1024m -Xmx1024m -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-adventure/adventure.hprof \
+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 &
+```
+
+
 
 ## 数据处理
 

+ 5 - 0
yt-agent/agent-service/src/main/java/com/ytpm/dao/AppMapper.java

@@ -46,6 +46,11 @@ public interface AppMapper {
      */
     YtApp getByDitchIdAndSuperiorId(@Param("ditchId") Long ditchId, @Param("superiorId") String superiorId);
 
+    /**
+     * 根据子包名称查询子包
+     */
+    YtApp getByAppName(@Param("appName") String appName);
+
     List<YtApp> getBySuperiorId(@Param("superiorId") String superiorId);
 
     /**

+ 5 - 1
yt-agent/agent-service/src/main/java/com/ytpm/service/impl/AgentAppServiceImpl.java

@@ -113,10 +113,14 @@ public class AgentAppServiceImpl implements AgentAppService {
             appMapper.updateOne(app);
         }else{
             //同一个应用同一个渠道只能出一个包
-            YtApp exist =  appMapper.getByDitchIdAndSuperiorId(param.getDitchId(),param.getSuperiorId());
+            YtApp exist = appMapper.getByDitchIdAndSuperiorId(param.getDitchId(),param.getSuperiorId());
             if(Objects.nonNull(exist)){
                 throw new CustomerException("该渠道已存在:"+exist.getAppName()+", 请选择其他渠道");
             }
+            exist = appMapper.getByAppName(param.getAppName());
+            if(Objects.nonNull(exist)){
+                throw new CustomerException("已存同名应用名称:"+exist.getAppName()+", 请重新填写");
+            }
             app.setAppId(IdUtil.fastSimpleUUID());
             app.setUserId(userId);
             app.setEnabled(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 - 1
yt-agent/agent-service/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

@@ -55,6 +55,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -296,7 +297,7 @@ public class RiskServiceImpl implements RiskService {
                 log.setOldValue(oldValue);
                 log.setNewValue(listParam.getConfigVal());
                 log.setOperator(param.getChannelId());
-                log.setOperatorName(param.getChannelId());
+                log.setOperatorName(param.getOperatorName());
                 logs.add(log);
             }
         }
@@ -346,6 +347,18 @@ public class RiskServiceImpl implements RiskService {
         newTemp.setUpdateTime(new Date());
         newTemp.setEnabled(enabled == 0?1:0);
         riskMapper.updateByTempId(newTemp);
+        if (!Objects.equals(newTemp.getEnabled(), template.getEnabled())) {
+            // 风控启用或关闭 增加日志记录
+            YtRiskTemplateLog log = new YtRiskTemplateLog();
+            log.setTemplateId(templateId);
+            log.setTemplateCode(template.getTemplateCode());
+            log.setConfigId("enabled");
+            log.setOldValue(template.getEnabled().toString());
+            log.setNewValue(newTemp.getEnabled().toString());
+            log.setOperator(newTemp.getChannelId());
+            log.setOperatorName(newTemp.getChannelId());
+            riskMapper.addRiskTemplateLog(Collections.singletonList(log));
+        }
         return Result.resultOk(RepMessage.MODIFY_SUCCESS);
     }
     /**

+ 8 - 2
yt-agent/agent-service/src/main/resources/mapper/AppMapper.xml

@@ -202,12 +202,18 @@
         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 superior_id = #{superiorId} and ditch_id = #{ditchId}
+        where superior_id = #{superiorId} and ditch_id = #{ditchId} and enabled = 1
     </select>
     <select id="getBySuperiorId" 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 superior_id = #{superiorId}
+        where superior_id = #{superiorId} and enabled = 1
+    </select>
+    <select id="getByAppName" 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_name = #{appName} and enabled = 1
     </select>
 </mapper>

+ 4 - 0
yt-common/src/main/java/com/ytpm/app/param/DyzAdRecordParam.java

@@ -33,6 +33,10 @@ public class DyzAdRecordParam {
     private String beginTime;
     @ApiModelProperty("完成时间")
     private String finishTime;
+    @ApiModelProperty("开始时间时间戳")
+    private Long begintimestamp;
+    @ApiModelProperty("完成时间时间戳")
+    private Long finishtimestamp;
     @ApiModelProperty("当天观看广告次数")
     private int adCount;
     @ApiModelProperty("Taku预估eCPM 对应adsource_price")

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

@@ -0,0 +1,99 @@
+<?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.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/info.${server.name}.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </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.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/warn.${server.name}.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </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.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.${server.name}.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </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>

+ 3 - 5
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/base/BaseFeign.java

@@ -1,4 +1,4 @@
-package com.ytpm.lemonios.feign;
+package com.ytpm.lemonios.feign.base;
 
 import com.ytpm.agent.model.YtApp;
 import com.ytpm.agent.model.YtDitch;
@@ -19,7 +19,6 @@ import com.ytpm.general.ResultTable;
 import com.ytpm.middle.view.DashboardRankingListVO;
 import com.ytpm.middle.view.DashboardRevenueVO;
 import com.ytpm.middle.view.DashboardRiskVO;
-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;
@@ -29,10 +28,9 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
-@FeignClient(name = "lemonios-service")
-public interface LemonIosFeign {
+public interface BaseFeign {
     @GetMapping("/visitor/getLoginDitchCount")
-    int getLoginDitchCount(@RequestParam("deviceId")String deviceId,@RequestParam("hours")Integer hours);
+    int getLoginDitchCount(@RequestParam("deviceId")String deviceId, @RequestParam("hours")Integer hours);
     @GetMapping("/visitor/getDitchCount")
     int getDitchCount(@RequestParam("deviceId")String deviceId,@RequestParam("hours")Integer hours);
     @GetMapping("/user/getMonthRegistryUser")

+ 9 - 0
yt-ios-lemon/lemon-ios-feign/src/main/java/com/ytpm/lemonios/feign/feign/GollumIosFeign.java

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

+ 9 - 0
yt-ios-lemon/lemon-ios-feign/src/main/java/com/ytpm/lemonios/feign/feign/LemonIosFeign.java

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

+ 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>

+ 8 - 2
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/config/interceptor/HttpInterceptor.java

@@ -1,5 +1,7 @@
 package com.ytpm.lemonios.config.interceptor;
 
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
@@ -8,16 +10,19 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.Date;
 
+@Slf4j
 @Component
 public class HttpInterceptor implements HandlerInterceptor {
 
+    @Value("${spring.application.name-zh:}")
+    private String applicationNameZh;
+
     @Override
     public boolean preHandle(HttpServletRequest request,
                              HttpServletResponse response, Object obj) throws Exception {
         // 获取客户端IP地址
         String clientIp = getClientIp(request);
-        System.out.println("青柠檬IOS接收客户端" + clientIp + "发起用户请求");
-        // 可以在这里添加更多的逻辑,比如记录日志等
+        log.info("{}收到来自客户端[{}]的用户请求", applicationNameZh, clientIp);
         return true;
     }
 
@@ -28,6 +33,7 @@ public class HttpInterceptor implements HandlerInterceptor {
         }
         return xfHeader.split(",")[0]; // 可能会有多个IP,这里取第一个逗号前的IP
     }
+
     /**
      * 请求处理之后调用;在视图渲染之前,controller处理之后。
      */

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

@@ -31,6 +31,8 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 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.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
@@ -45,6 +47,7 @@ import java.util.Objects;
 @Slf4j
 @Api(tags = "微信开放能力模块")
 @RestController
+@RefreshScope
 @RequestMapping("/wx")
 public class WxController {
     private final static String GRANT_TYPE = "authorization_code";
@@ -58,6 +61,8 @@ public class WxController {
     private AppUserService appUserService;
     @Autowired
     private DitchMapper ditchMapper;
+    @Value("${yt.ios.appid:}")
+    private String appId;
 
     @PostMapping("/login")
     @ApiOperation("微信登录")
@@ -135,18 +140,37 @@ 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("a689ab630d3e62");
+        user.setAppId(appId);
         Result<?> result = riskFeign.checkLoginRisk(user);
         if (result.getCode() != 200) {
             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());

+ 11 - 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;
 
     /**
      * 保存广告记录
@@ -67,8 +69,12 @@ public class AdServiceImpl implements AdService {
                 param.setBeginTime(param.getFinishTime());
             }
             BeanUtils.copyProperties(param, adRecord);
+            if (param.getBegintimestamp() != null && param.getFinishtimestamp() != null) {
+                adRecord.setBeginTime(DateUtil.format(new Date(param.getBegintimestamp()), "yyyy-MM-dd HH:mm:ss"));
+                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);
@@ -300,6 +306,10 @@ public class AdServiceImpl implements AdService {
             param.setBeginTime(param.getFinishTime());
         }
         BeanUtils.copyProperties(param, adRecord);
+        if (param.getBegintimestamp() != null && param.getFinishtimestamp() != null) {
+            adRecord.setBeginTime(DateUtil.format(new Date(param.getBegintimestamp()), "yyyy-MM-dd HH:mm:ss"));
+            adRecord.setFinishTime(DateUtil.format(new Date(param.getFinishtimestamp()), "yyyy-MM-dd HH:mm:ss"));
+        }
         adRecord.setIosId(param.getIosId());
         adRecord.setRecordId(IdUtil.fastSimpleUUID());
         adRecord.setUserId(user.getUserId());

+ 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 - 1
yt-ios-lemon/lemon-ios-service/src/main/resources/bootstrap.yml

@@ -4,7 +4,8 @@ spring:
   main:
     allow-bean-definition-overriding: true
   application:
-    name: lemonios-service
+    name: gollumios-service
+    name-zh: '咕噜记账IOS'
   profiles:
     active: local
 yt:

+ 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")));
+        }
+    }
+}

+ 2 - 1
yt-question/yt-question-feign/src/main/java/com/ytpm/question/base/BaseFeign.java

@@ -21,6 +21,7 @@ import com.ytpm.general.ResultTable;
 import com.ytpm.middle.view.DashboardRankingListVO;
 import com.ytpm.middle.view.DashboardRevenueVO;
 import com.ytpm.middle.view.DashboardRiskVO;
+import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -120,7 +121,7 @@ public interface BaseFeign {
     @PostMapping("/user/getRevenueByTime")
     BigDecimal getRevenueByTime(@RequestBody YtAppUserListParam param);
 
-    @PostMapping("/wx/delDefaultConfig")
+    @GetMapping("/wx/delDefaultConfig")
     void delAppConfig(@RequestParam("appId") String appId);
 
     @PostMapping("/user/unLockUser")

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

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

+ 4 - 0
yt-question/yt-question-service/src/main/resources/bootstrap.yml

@@ -30,6 +30,8 @@ spring:
     #name-zh: '天天趣算术'
     #name: idiom-service
     #name-zh: '成语趣解释'
+    #name: irun-service
+    #name-zh: '每天爱跑步'
     #name: lemon-service
     #name-zh: '青柠檬记账'
     name: lime-service
@@ -62,6 +64,8 @@ spring:
     #name-zh: '走路王者'
     #name: graphic-service
     #name-zh: '图形逻辑王'
+    #name: adventure-service
+    #name-zh: '色彩大冒险'
   profiles:
     # 当前为本地模式
     active: local