فهرست منبع

Merge remote-tracking branch 'origin/master' into lih

# Conflicts:
#	yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/controller/WxController.java
#	yt-ios-lemon/lemon-ios-service/src/main/resources/mapper/AdRecordMapper.xml
hidewnd 1 هفته پیش
والد
کامیت
4344eab806

+ 151 - 70
ReadMe.md

@@ -49,6 +49,61 @@
 
 服务部署根目录: `/data/www/app/ytpm/`
 
+
+> 服务端口记录表
+
+```shell
+gateway             25001
+oauth               25520
+agent               25521
+middle              25715
+risk                25522
+###### Android #######
+lime                25801
+nofeeds             25718
+allusion            25021
+calculator          25823
+emoticons           25826
+arithmetic          25809
+countstep           25818
+vitality            25024
+proverb             25901
+algebraic           25817
+idiom               25819
+adage               25020
+answer              25821
+arena               25902
+carp                25828
+dtw                 25822
+diary               25825
+funarith            25022
+irun                25815
+mileage             25025
+raisepig            25816
+picking             25023
+summary             25824
+typing              25904
+lemon               25827
+walk                25820
+walking             25908
+palaces             25830
+reactivity          25831
+walkeking           25832
+graphic             25833
+adventure           25834
+poetry              25835
+quick               25836
+###### IOS #######
+lemonios            25903
+gollumios           25929
+warehouseios        25013
+maintainios         25101
+linefunios          25102
+sortingios          25027
+guardios            25028
+deliveryios         25029
+```
+
 #### 核心服务
 
 ```shell
@@ -86,7 +141,8 @@ nohup java -Xms512m -Xmx1024m -jar -noverify yt-oauth.jar > oauth.log 2>&1 &
 ```
 
 
-#### 青柠记账 lime
+
+#### Android: 青柠记账 lime
 
 ```shell
 # 青柠记账 lime-service
@@ -109,7 +165,7 @@ question-service.jar > lime.log 2>&1 &
 
 
 
-#### Nofeeds nofeeds
+#### Android: Nofeeds nofeeds
 
 ```shell
 # nofeeds-service
@@ -131,7 +187,7 @@ question-service.jar > nofeeds.log 2>&1 &
 
 
 
-#### 典故问答王 allusion
+#### Android: 典故问答王 allusion
 
 ```shell
 # 典故问答王 allusion-service
@@ -154,7 +210,7 @@ question-service.jar > allusion.log 2>&1 &
 
 
 
-#### 计数计算器 calculator
+#### Android: 计数计算器 calculator
 
 ```shell
 # 计数计算器 calculator-service
@@ -175,7 +231,7 @@ question-service.jar > calculator.log 2>&1 &
 
 
 
-#### 斗图表情大师 emoticons
+#### Android: 斗图表情大师 emoticons
 
 ```shell
 # 斗图表情大师 emoticons-service
@@ -196,7 +252,7 @@ question-service.jar > emoticons.log 2>&1 &
 
 
 
-#### 算术小达人 arithmetic
+#### Android: 算术小达人 arithmetic
 
 ```shell
 # 算术小达人 arithmetic-service
@@ -219,7 +275,7 @@ question-service.jar > arithmetic.log 2>&1 &
 
 
 
-#### 计步趣健身 countstep
+#### Android: 计步趣健身 countstep
 
 ```shell
 # 计步趣健身 countstep-service
@@ -241,7 +297,7 @@ question-service.jar > countstep.log 2>&1 &
 
 
 
-#### 元气算术能手 vitality
+#### Android: 元气算术能手 vitality
 
 ```shell
 # 元气算术能手 vitality-service
@@ -263,7 +319,7 @@ question-service.jar > vitality.log 2>&1 &
 
 
 
-#### 谚语知识赛 proverb
+#### Android: 谚语知识赛 proverb
 
 ```shell
 # 谚语知识赛 proverb-service
@@ -284,7 +340,7 @@ question-service.jar > proverb.log 2>&1 &
 
 
 
-#### 代数式能手 algebraic
+#### Android: 代数式能手 algebraic
 
 ```shell
 # 代数式能手 algebraic-service
@@ -305,7 +361,7 @@ question-service.jar > algebraic.log 2>&1 &
 
 
 
-#### 成语趣解释 idiom
+#### Android: 成语趣解释 idiom
 
 ```shell
 # 成语趣解释 idiom
@@ -325,10 +381,7 @@ question-service.jar > idiom.log 2>&1 &
 ```
 
 
-
-
-
-#### 谚语变形记 adage
+#### Android: 谚语变形记 adage
 
 ```shell
 # 谚语变形记 adage
@@ -349,7 +402,7 @@ question-service.jar > adage.log 2>&1 &
 
 
 
-#### 答题达人 answer
+#### Android: 答题达人 answer
 
 ```shell
 # 答题达人 answer-service
@@ -368,7 +421,8 @@ question-service.jar > answer.log 2>&1 &
 #answer-service.jar > answer.log 2>&1 &
 ```
 
-#### 歇后语擂台 arena
+
+#### Android: 歇后语擂台 arena
 
 ```shell
 # 歇后语擂台 arena-service
@@ -389,7 +443,7 @@ question-service.jar > arena.log 2>&1 &
 
 
 
-#### 小锦鲤 carp
+#### Android: 小锦鲤 carp
 
 ```shell
 # 小锦鲤 carp-service
@@ -410,7 +464,7 @@ question-service.jar > carp.log 2>&1 &
 
 
 
-#### 好运答题王 dtw
+#### Android: 好运答题王 dtw
 
 ```shell
 # 好运答题王 dtw-service
@@ -431,7 +485,7 @@ question-service.jar > dtw.log 2>&1 &
 
 
 
-#### 咕噜日记 diary
+#### Android: 咕噜日记 diary
 
 ```shell
 # 咕噜日记 diary-service
@@ -452,7 +506,7 @@ question-service.jar > diary.log 2>&1 &
 
 
 
-#### 天天趣算术 funarith
+#### Android: 天天趣算术 funarith
 
 ```shell
 # 天天趣算术 funarith
@@ -473,7 +527,7 @@ question-service.jar > funarith.log 2>&1 &
 
 
 
-#### 每天爱跑步 irun
+#### Android: 每天爱跑步 irun
 
 ```bash
 # 每天爱跑步 irun
@@ -494,7 +548,7 @@ question-service.jar > irun.log 2>&1 &
 
 
 
-#### 宠物里程表 mileage
+#### Android: 宠物里程表 mileage
 
 ```shell
 # 宠物里程表 mileage
@@ -516,7 +570,7 @@ question-service.jar > mileage.log 2>&1 &
 
 
 
-#### 全民养猪 raisepig
+#### Android: 全民养猪 raisepig
 
 ```shell
 # 全民养猪 raisepig
@@ -536,8 +590,7 @@ question-service.jar > raisepig.log 2>&1 &
 ```
 
 
-
-#### 找茬挑战王 picking
+#### Android: 找茬挑战王 picking
 
 ```shell
 # 找茬挑战王 picking
@@ -559,7 +612,7 @@ question-service.jar > picking.log 2>&1 &
 
 
 
-#### 归物迹 summary
+#### Android: 归物迹 summary
 
 ```shell
 # 归物迹 summary
@@ -580,7 +633,7 @@ question-service.jar > summary.log 2>&1 &
 
 
 
-#### 打字训练营 typing
+#### Android: 打字训练营 typing
 
 ```shell
 # 打字训练营 typing
@@ -601,7 +654,7 @@ question-service.jar > typing.log 2>&1 &
 
 
 
-#### 青柠檬记账 lemon
+#### Android: 青柠檬记账 lemon
 
 ```shell
 # 青柠檬记账 lemon
@@ -622,7 +675,7 @@ question-service.jar > lemon.log 2>&1 &
 
 
 
-#### 走路趣计步 walk
+#### Android: 走路趣计步 walk
 
 ```shell
 # 走路趣计步 walk
@@ -644,7 +697,7 @@ question-service.jar > walk.log 2>&1 &
 
 
 
-#### 全民爱走路 walking
+#### Android: 全民爱走路 walking
 
 ```shell
 # 全民爱走路 walking
@@ -663,7 +716,7 @@ nohup java -jar -Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=256M -XX:+UseCompressed
 walking-service.jar > walking.log 2>&1 &
 ```
 
-#### 九宫格挑战 palaces
+#### Android: 九宫格挑战 palaces
 
 ```shell
 # 九宫格挑战 palaces
@@ -678,7 +731,7 @@ question-service.jar > palaces.log 2>&1 &
 
 
 
-#### 极速反应力 reactivity
+#### Android: 极速反应力 reactivity
 
 ```shell
 # 极速反应力 reactivity
@@ -694,7 +747,7 @@ question-service.jar > reactivity.log 2>&1 &
 
 
 
-#### 走路王者 walkeking
+#### Android: 走路王者 walkeking
 
 ```shell
 # 走路王者 walkeking
@@ -709,7 +762,7 @@ question-service.jar > walkeking.log 2>&1 &
 
 
 
-#### 逻辑谜 graphic
+#### Android: 逻辑谜 graphic
 
 ````bash
 # 逻辑谜 graphic-service
@@ -722,7 +775,7 @@ nohup java -jar -Xms2024m -Xmx2024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressed
 question-service.jar > graphic.log 2>&1 &
 ````
 
-#### 色彩大冒险 adventure
+#### Android: 色彩大冒险 adventure
 
 ```shell
 # 色彩大冒险 adventure
@@ -735,7 +788,7 @@ nohup java -jar -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressed
 question-service.jar > adventure.log 2>&1 &
 ```
 
-#### 古诗填空秀 poetry
+#### Android: 古诗填空秀 poetry
 
 ```shell
 # 古诗填空秀 poetry-service
@@ -748,21 +801,7 @@ nohup java -jar -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=256M -XX:+UseCompressed
 question-service.jar > poetry.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 &
-```
-
-
-#### 速算大比拼 quick
+#### Android: 速算大比拼 quick
 
 ```shell
 # 速算大比拼 quick-service
@@ -777,7 +816,20 @@ question-service.jar > quick.log 2>&1 &
 ```
 
 
-#### 咕噜日记ios gollumios
+#### IOS: 青柠檬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: 咕噜日记ios gollumios
 
 ```shell
 # 咕噜日记ios gollumios
@@ -788,67 +840,96 @@ nohup java -jar -Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=256M -XX:+UseCompressed
 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-ios-gollum/gollumios.hprof \
 gollumios-service.jar > gollumios.log 2>&1 &
 ```
-#### 盒小仓ios warehouseios
+
+
+
+#### IOS: 盒小仓ios warehouseios
 
 ```shell
 # 盒小仓ios warehouseios
+# 10.206.0.3
 # 10.206.16.10
-nohup java -jar -Xms3072m -Xmx3072m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+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-ios-warehouse/warehouseios.hprof \
-warehouseios-service.jar > warehouseios.log 2>&1 &
+lemonios-service.jar > warehouseios.log 2>&1 &
+
 ```
 
-#### maintainios maintainios
+#### IOS: maintainios maintainios
 
 ```shell
 # maintainios maintainios
+# 10.206.0.3
 # 10.206.16.10
-nohup java -jar -Xms3072m -Xmx3072m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+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-ios-maintain/maintainios.hprof \
-maintainios-service.jar > maintainios.log 2>&1 &
+lemonios-service.jar > maintainios.log 2>&1 &
+
 ```
 
-#### linefunios linefunios
+
+#### IOS: linefunios linefunios
 
 ```shell
 # linefunios linefunios
 # 10.206.16.10
-nohup java -jar -Xms3072m -Xmx3072m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+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-ios-linefun/lemonios.hprof \
-lemonios-service.jar > lemonios.log 2>&1 &
+lemonios-service.jar > linefunios.log 2>&1 &
+
 ```
 
-#### sortingios sortingios
+
+#### IOS: sortingios sortingios
 
 ```shell
 # sortingios sortingios
 # 10.206.16.10
-nohup java -jar -Xms3072m -Xmx3072m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+# 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-ios-sorting/lemonios.hprof \
-lemonios-service.jar > lemonios.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-ios-sorting/sortingios.hprof \
+lemonios-service.jar > sortingios.log 2>&1 &
+
 ```
 
-#### guardios guardios
+
+#### IOS: guardios guardios
 
 ```shell
 # guardios guardios
 # 10.206.0.3
-nohup java -jar -Xms3072m -Xmx3072m -XX:MaxMetaspaceSize=256M -XX:+UseCompressedOops \
+# 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-ios-guard/lemonios.hprof \
-lemonios-service.jar > lemonios.log 2>&1 &
+-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/www/app/ytpm/service-ios-guard/guardios.hprof \
+lemonios-service.jar > guardios.log 2>&1 &
+
 ```
 
 
+#### IOS: deliveryios deliveryios
+
+```shell
+# deliveryios
+# 10.206.0.3
+# 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-ios-delivery/deliveryios.hprof \
+lemonios-service.jar > deliveryios.log 2>&1 &
+
+```
+
 
 ## 数据处理
 

+ 2 - 0
yt-common/src/main/java/com/ytpm/app/param/IosLoginParam.java

@@ -35,4 +35,6 @@ public class IosLoginParam {
     private String iconUrl;
     @ApiModelProperty(value = "手机信息json")
     private String phoneJson;
+    @ApiModelProperty(value = "幂等ID")
+    private String requestId;
 }

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

@@ -26,6 +26,7 @@ import com.ytpm.general.StatusCode;
 import com.ytpm.lemonios.dao.AdRecordMapper;
 import com.ytpm.lemonios.dao.AppUserMapper;
 import com.ytpm.lemonios.dao.DitchMapper;
+import com.ytpm.lemonios.redis.RedisService;
 import com.ytpm.lemonios.service.AppUserService;
 import com.ytpm.util.HttpClientUtil;
 import io.swagger.annotations.Api;
@@ -48,6 +49,7 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.TimeUnit;
 
 
 @Slf4j
@@ -67,6 +69,8 @@ public class WxController {
     private AppUserService appUserService;
     @Resource
     private DitchMapper ditchMapper;
+    @Resource
+    private RedisService redisService;
     @Value("${yt.ios.appid:}")
     private String appId;
 
@@ -100,6 +104,30 @@ public class WxController {
         return Result.resultOk(RepMessage.LOGIN_SUCCESS, old);
     }
 
+    @ApiOperation("获取IOS登陆幂等Token")
+    @GetMapping("/get/requestId")
+    public Result<String> getRequestId(@RequestParam("ditchId") String ditchId, @RequestParam("iosId") String iosId){
+        String redisKey = StrUtil.format("visitor:requestId:{}:{}", ditchId, iosId);
+        String requestId = "";
+        if (redisService.hasKey(redisKey)) {
+            requestId = redisService.getStr(redisKey);
+        }
+        if (StrUtil.isEmpty(requestId)) {
+            requestId = IdUtil.fastSimpleUUID();
+            boolean setSuccess = redisService.setIfAbsent(redisKey, requestId, 1, TimeUnit.MINUTES);
+            if (!setSuccess) {
+                requestId = redisService.getStr(redisKey);
+                if (StrUtil.isEmpty(requestId)) {
+                    requestId = IdUtil.fastSimpleUUID();
+                    redisService.setTimeOutMinutesStr(redisKey, requestId, 1);
+                } else {
+                    redisService.expire(redisKey, 1, TimeUnit.MINUTES);
+                }
+            }
+        }
+        return Result.resultObjOk(requestId);
+    }
+
     @PostMapping("/iosLogin")
     @ApiOperation("IOS登录")
     @Transactional
@@ -118,16 +146,28 @@ public class WxController {
         if (Objects.isNull(defaultConfig)) {
             return new Result<>(StatusCode.ACCESS_ERR, "登录失败,未找到相应配置!");
         }
+        // 幂等请求校验
+        if (StrUtil.isNotEmpty(param.getRequestId())) {
+            String redisKey = StrUtil.format("visitor:requestId:{}:{}", param.getDitchId(), param.getIosId());
+            if (!redisService.hasKey(redisKey)) {
+                return new Result<>(StatusCode.ACCESS_ERR, "登录失败,重复请求!");
+            }
+            String cacheKey = redisService.getStr(redisKey);
+            if (!StrUtil.equals(cacheKey, param.getRequestId())) {
+                return new Result<>(StatusCode.ACCESS_ERR, "登录失败,重复请求!");
+            }
+            redisService.del(redisKey);
+        }
         IosUserInfo userInfo = setIosUserInfo(param);
-        param.setLoginIp(HttpClientUtil.getClientIp(request));
+        param.setLoginIp(getClientIp(request));
         YtDyzUser old = appUserService.crudForNewTransIos(param, userInfo, LoginType.IOS.getTypeName());
         //调用风控服务校验默认风控配置
         old.setRiskCode("313");
         Result<?> result = riskFeign.checkRisk(old);
-        if(result.getCode()!=200){
-            return new Result<>(StatusCode.ACCESS_ERR,result.getMessage());
+        if (result.getCode() != 200) {
+            return new Result<>(StatusCode.ACCESS_ERR, result.getMessage());
         }
-        if (old.getLastLoginTime() != null && old.getRegistryTime() != null){
+        if (old.getLastLoginTime() != null && old.getRegistryTime() != null) {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             old.setLastLoginTimeStr(sdf.format(old.getLastLoginTime()));
             old.setRegistryTimeStr(sdf.format(old.getRegistryTime()));
@@ -148,6 +188,7 @@ public class WxController {
         //2.拿3条记录 设置到user
         // TODO 当前仅截取最新三条记录,可能遗漏本次登陆前的风控记录(停落时间过长记录超过三条)
         List<YtDyzAdRecord> adRecordList = recordMapper.getByIosIdBeforeLogin(param.getIosId());
+
         user.setPreAdRecordList(adRecordList);
         user.setLoginType(LoginType.VISITOR);
         user.setAppId(appId);

+ 55 - 24
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/monitor/RedisKeyExpirationListener.java

@@ -1,18 +1,19 @@
 package com.ytpm.lemonios.monitor;
 
+import cn.hutool.core.util.StrUtil;
 import com.ytpm.agent.enums.UserStatusEnum;
 import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.feign.RiskFeign;
 import com.ytpm.lemonios.dao.AppUserMapper;
 import com.ytpm.risk.enums.BannedTypeEnum;
 import lombok.extern.slf4j.Slf4j;
-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.data.redis.connection.Message;
 import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+import org.springframework.lang.NonNull;
 import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.annotation.Resource;
 import java.util.Objects;
@@ -27,9 +28,15 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
 
     @Resource
     private AppUserMapper appUserMapper;
-    @Autowired
+    @Resource
     private RiskFeign riskFeign;
 
+    @Value("${spring.application.name:}")
+    private String applicationName;
+
+    private static final String FLAG_LOCK = "lock";
+    private static final String FLAG_UNLOCK = "unlock";
+
     /**
      * Creates new {@link } for {@code __keyevent@*__:expired} messages.
      *
@@ -38,42 +45,66 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
     public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
         super(listenerContainer);
     }
- 
+
     /**
      * 监听redis过期的 key 进行处理
      */
     @Override
-    public void onMessage(Message message, byte[] pattern) {
+    public void onMessage(@NonNull Message message, byte[] pattern) {
         String key = String.valueOf(message);
-        log.error("App-Service 发现预定风控用户:{}",key);
-        if(key.startsWith("lock_")){
+        // 全局监听
+        if (key.startsWith("lock_") || key.startsWith("unlock_")) {
             String[] arr = key.split("_");
-            lockUser(arr[1], UserStatusEnum.RISK.getCode());
+            if (arr.length < 2) {
+                return;
+            }
+            handleUserLock(key, arr[1], arr[0]);
         }
-        /**
-         * 用户解锁
-         */
-        if(key.startsWith("unlock_")){
+        // 仅限自身服务的监听
+        String serviceKey = StrUtil.replace(applicationName, "-service", "");
+        if (key.startsWith(serviceKey)) {
             String[] arr = key.split("_");
-            YtDyzUser dyzUser = new YtDyzUser();
-            dyzUser.setUserId(arr[1]);
-            dyzUser.setUserStatus(1);
-            appUserMapper.updateUser(dyzUser);
-            riskFeign.addBlockingRecord(arr[1]);
+            if (arr.length < 3) {
+                return;
+            }
+            handleUserLock(key, arr[2], arr[1]);
+        }
+    }
+
+    private void handleUserLock(String key, String userId, String flag) {
+        YtDyzUser dyzUser = appUserMapper.selectPrimaryKey(userId);
+        if (Objects.nonNull(dyzUser)) {
+            log.info("App-Service 发现预定风控用户:{}", key);
+            // 用户锁定
+            if (FLAG_LOCK.equals(flag)) {
+                lockUser(dyzUser, UserStatusEnum.RISK.getCode());
+            }
+            // 用户解锁
+            if (FLAG_UNLOCK.equals(flag)) {
+                unLockUser(dyzUser);
+            }
         }
     }
 
     /**
      * 锁定用户
      */
-     private void lockUser(@RequestParam("userId")String userId, @RequestParam("userStatus")Integer userStatus){
-        YtDyzUser dyzUser = appUserMapper.selectPrimaryKey(userId);
+    private void lockUser(YtDyzUser dyzUser, Integer userStatus) {
         YtDyzUser newUser = new YtDyzUser();
-        newUser.setUserId(userId);
+        newUser.setUserId(dyzUser.getUserId());
         newUser.setUserStatus(userStatus);
-        newUser.setRiskReason(BannedTypeEnum.CHANNEL.getDesc()+"禁止登录");
-        if(Objects.nonNull(dyzUser)){
-            appUserMapper.updateUser(newUser);
-        }
+        newUser.setRiskReason(BannedTypeEnum.CHANNEL.getDesc() + "禁止登录");
+        appUserMapper.updateUser(newUser);
+    }
+
+    /**
+     * 解锁用户
+     */
+    private void unLockUser(YtDyzUser dyzUser) {
+        YtDyzUser newUser = new YtDyzUser();
+        newUser.setUserId(dyzUser.getUserId());
+        newUser.setUserStatus(UserStatusEnum.NORMAL.getCode());
+        appUserMapper.updateUser(newUser);
+        riskFeign.addBlockingRecord(dyzUser.getUserId());
     }
 }

+ 11 - 3
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/redis/RedisService.java

@@ -103,6 +103,10 @@ public class RedisService {
         valOpsStr.set(key,val,timeOut, TimeUnit.MINUTES);
     }
 
+    public boolean setIfAbsent(String key, String val ,long timeOut, TimeUnit timeUnit){
+        return Boolean.TRUE.equals(valOpsStr.setIfAbsent(key, val, timeOut, timeUnit));
+    }
+
     /**
      * 删除指定key
      * @param key
@@ -115,9 +119,13 @@ public class RedisService {
      * 设置指定key值的超时时间
      * @param key
      */
-    public void expire(String key,long timeOut){
-        TimeUnit timeUnit=TimeUnit.MILLISECONDS;
-        stringRedisTemplate.expire(key,timeOut, timeUnit);
+    public void expire(String key, long timeOut) {
+        TimeUnit timeUnit = TimeUnit.MILLISECONDS;
+        stringRedisTemplate.expire(key, timeOut, timeUnit);
+    }
+
+    public void expire(String key, long timeOut, TimeUnit timeUnit) {
+        stringRedisTemplate.expire(key, timeOut, timeUnit);
     }
 
     /**

+ 2 - 2
yt-middle/middle-platform/src/main/java/com/ytpm/middle/util/AliOSSUtil.java

@@ -91,8 +91,8 @@ public class AliOSSUtil {
      */
     public static com.aliyun.sls20201230.Client createClient() throws Exception {
         com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
-                .setAccessKeyId("LTAI5tQQ57pTXeFHacavoJMq")
-                .setAccessKeySecret("TZX8QPD81w1magxBxVpnRJ3NFHEAoS");
+                .setAccessKeyId("LTAI5tJ92xiwYeRdWgdjRG2V")
+                .setAccessKeySecret("8EDDgYJOzwnICV7FvPHLuD9l2q3QAS");
         config.endpoint = "cn-nanjing.log.aliyuncs.com";
         return new com.aliyun.sls20201230.Client(config);
     }

+ 11 - 1
yt-question/yt-question-service/src/main/java/com/ytpm/question/controller/VisitorController.java

@@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 游客登陆
@@ -55,7 +56,16 @@ public class VisitorController {
         }
         if (StrUtil.isEmpty(requestId)) {
             requestId = IdUtil.fastSimpleUUID();
-            redisService.setTimeOutMinutesStr(redisKey, requestId, 1);
+            boolean setSuccess = redisService.setIfAbsent(redisKey, requestId, 1, TimeUnit.MINUTES);
+            if (!setSuccess) {
+                requestId = redisService.getStr(redisKey);
+                if (StrUtil.isEmpty(requestId)) {
+                    requestId = IdUtil.fastSimpleUUID();
+                    redisService.setTimeOutMinutesStr(redisKey, requestId, 1);
+                } else {
+                    redisService.expire(redisKey, 1, TimeUnit.MINUTES);
+                }
+            }
         }
         return Result.resultObjOk(requestId);
     }

+ 8 - 0
yt-question/yt-question-service/src/main/java/com/ytpm/question/redis/RedisService.java

@@ -106,6 +106,10 @@ public class RedisService {
         stringRedisTemplate.opsForValue().set(key, val, timeOut, TimeUnit.MINUTES);
     }
 
+    public boolean setIfAbsent(String key, String val ,long timeOut, TimeUnit timeUnit){
+        return Boolean.TRUE.equals(valOpsObj.setIfAbsent(key, val, timeOut, timeUnit));
+    }
+
     /**
      * 删除指定key
      *
@@ -125,6 +129,10 @@ public class RedisService {
         stringRedisTemplate.expire(key, timeOut, timeUnit);
     }
 
+    public void expire(String key, long timeOut, TimeUnit timeUnit) {
+        stringRedisTemplate.expire(key, timeOut, timeUnit);
+    }
+
     /**
      * 根据前缀批量删除
      *