Jelajahi Sumber

Merge branch 'pro' of http://git.mokasz.com/liuwei/launch-webFlux-platform into pro

volta 2 tahun lalu
induk
melakukan
e9f4da7b0b

+ 5 - 1
launch-admin/src/main/java/com/webflux/launchadmin/global/GlobalExceptionHandler.java

@@ -14,6 +14,8 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 import org.springframework.web.multipart.MaxUploadSizeExceededException;
+import org.springframework.web.reactive.resource.NoResourceFoundException;
+import org.springframework.web.server.MethodNotAllowedException;
 import org.springframework.web.server.MissingRequestValueException;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
@@ -71,7 +73,9 @@ public class GlobalExceptionHandler {
 
     @ExceptionHandler(Exception.class)
     public Mono<RW<Object>> handleException(ServerWebExchange exchange, Exception e) {
-        if (e instanceof BaseException) {
+        if (e instanceof BaseException
+                || e instanceof NoResourceFoundException
+                || e instanceof MethodNotAllowedException) {
             try {
                 Map<String, Object> logger = new HashMap<>();
                 MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();

+ 52 - 57
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/PlanNewCommonOutController.java

@@ -7,15 +7,18 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
-import com.alibaba.fastjson.JSON;
 import com.plumelog.core.util.LogExceptionStackTrace;
 import com.webflux.launchadmin.global.BaseException;
-import com.webflux.launchadmin.mysql.controller.planNew.req.*;
+import com.webflux.launchadmin.mysql.controller.planNew.req.KefuRequest;
+import com.webflux.launchadmin.mysql.controller.planNew.req.OutDomainRequest;
+import com.webflux.launchadmin.mysql.controller.planNew.req.PlanNewCommonMaterialReq;
+import com.webflux.launchadmin.mysql.controller.planNew.req.PlanNewCommonShareReq;
 import com.webflux.launchadmin.mysql.controller.planNew.res.*;
 import com.webflux.launchadmin.mysql.controller.takeawayController.res.TakeawayH5Data;
 import com.webflux.launchadmin.mysql.entity.groupUsers.GroupUsers;
 import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNew;
 import com.webflux.launchadmin.mysql.entity.planNew.*;
+import com.webflux.launchadmin.mysql.service.planNew.PlanServiceInterface;
 import com.webflux.launchadmin.mysql.service.planNew.goGenerate.GoGenerateService;
 import com.webflux.launchadmin.mysql.service.planNew.ipAnalyze.IpAnalyzeServiceInterface;
 import com.webflux.launchadmin.mysql.service.planNew.structure.GoRequest;
@@ -24,18 +27,12 @@ import com.webflux.launchadmin.mysql.service.takeaway.TakeawayServicesInterface;
 import com.webflux.launchcommon.returnObj.RStatus;
 import com.webflux.launchcommon.utils.StringUtils;
 import jakarta.annotation.Resource;
-import jakarta.json.Json;
 import lombok.extern.slf4j.Slf4j;
-import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
-import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
-import org.springframework.data.redis.core.ReactiveRedisTemplate;
-import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.data.relational.core.query.Criteria;
 import org.springframework.data.relational.core.query.Query;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.*;
 import reactor.core.publisher.Mono;
 
@@ -62,22 +59,22 @@ public class PlanNewCommonOutController {
     @Resource
     private GoGenerateService goGenerateService;
     @Resource
-    private ReactiveRedisTemplate<String, String> reactiveRedisTemplate;
-    @Resource
-    private RedisTemplate<String, String> redisTemplate;
+    private StringRedisTemplate stringRedisTemplate;
     @Resource
     private TakeawayServicesInterface takeawayServicesInterface;
     @Resource
     private IpAnalyzeServiceInterface ipAnalyzeServiceInterface;
+    @Resource
+    private PlanServiceInterface planServiceInterface;
     private static final ConcurrentHashMap<String, Integer> MAP = new ConcurrentHashMap<>();
 
-    @Scheduled(cron = "1 1 4 * * ?")
-    @SchedulerLock(name = "launch:PlanNewCommonOutController:clearUserContextHashMap", lockAtLeastFor = "PT5S", lockAtMostFor = "PT15M")
-    public void clearUserContextHashMap() {
-        log.info("清空计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》开始");
-        MAP.clear();
-        log.info("清空计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》 结束");
-    }
+    // @Scheduled(cron = "1 1 4 * * ?")
+    // @SchedulerLock(name = "launch:PlanNewCommonOutController:clearUserContextHashMap", lockAtLeastFor = "PT5S", lockAtMostFor = "PT15M")
+    // public void clearUserContextHashMap() {
+    //     log.info("清空计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》开始");
+    //     MAP.clear();
+    //     log.info("清空计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》 结束");
+    // }
 
     /**
      * 通过 code 获取计划配置H5信息
@@ -88,8 +85,8 @@ public class PlanNewCommonOutController {
     @GetMapping("getPlanNewCommonH5")
     public Mono<RStatus<byte[]>> getPlanNewCommonH5(@RequestParam("code") String code) {
         Mono<PlanNewCommon> planNewCommonMono = template.selectOne(Query.query(Criteria.where("code").is(code)), PlanNewCommon.class)
-                .switchIfEmpty(Mono.error(new BaseException("计划code异常:" + ExceptionUtils.getStackTrace(new Exception()))))
-                .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString())));
+                .switchIfEmpty(Mono.error(new BaseException("计划code异")))
+                .onErrorResume(throwable -> Mono.error(new BaseException("计划code异")));
         Mono<PlanNewCommonRes> resMono = planNewCommonMono.flatMap(f -> {
             // 群成员
             Mono<List<GroupUserRes>> groupUserResMono = Mono.just(new ArrayList<>());
@@ -97,16 +94,16 @@ public class PlanNewCommonOutController {
             Mono<List<Image>> imageMono = template.select(Query.query(Criteria.where("type").is(1)
                             .and("group_type_id").is(f.groupId())
                             .and("deleted_at").isNull()), Image.class)
-                    .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString()))).collectList();
+                    .onErrorResume(throwable -> Mono.error(new BaseException("获取群封面异常"))).collectList();
             // 群名称
             Mono<List<Material>> textMono = template.select(Query.query(Criteria.where("type").is(4)
                             .and("deleted_at").isNull()
                             .and("group_type_id").is(f.groupId())), Material.class)
-                    .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString()))).collectList();
+                    .onErrorResume(throwable -> Mono.error(new BaseException("获取群名称异常"))).collectList();
             if (3 == f.type()) {
                 // 交友裂变, 需要群成员
                 Mono<List<GroupUsers>> groupUsersMono = template.select(Query.query(Criteria.where("group_users_type").is(f.groupId())).limit(14), GroupUsers.class)
-                        .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString()))).collectList();
+                        .onErrorResume(throwable -> Mono.error(new BaseException("获取群成员异常"))).collectList();
                 groupUserResMono = groupUsersMono.flatMap(groupUsers -> {
                     List<GroupUserRes> groupUserResList = groupUsers.stream().map(groupUsers1 -> {
                         GroupUserRes groupUserRes = new GroupUserRes();
@@ -178,7 +175,7 @@ public class PlanNewCommonOutController {
     public Mono<RStatus<byte[]>> kefuList(@RequestBody KefuRequest request) {
         Mono<PlanNewCommon> code = template.selectOne(Query.query(Criteria.where("code").is(request.getCode())), PlanNewCommon.class)
                 .switchIfEmpty(Mono.error(new BaseException("code查询返回结构为空")))
-                .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString())));
+                .onErrorResume(throwable -> Mono.error(new BaseException("code查询返回结构为空")));
         Mono<DataListsKefu> dataListsKefuMono = code.flatMap(planNew -> {
             Mono<List<Image>> image = template.select(Query.query(Criteria.where("type").is(5)
                             .and("deleted_at").isNull()
@@ -186,13 +183,13 @@ public class PlanNewCommonOutController {
                     .collectList()
                     .switchIfEmpty(Mono.error(new BaseException(StrUtil.format("通过计划groupId:{}查询Image返回结构为空", planNew.groupId()))))
                     .onErrorResume(throwable ->
-                            Mono.error(new Exception(StrUtil.format("通过计划groupId:{}查询Image返回结果error:{}", planNew.groupId(), LogExceptionStackTrace.erroStackTrace(throwable).toString()))));
+                            Mono.error(new BaseException(StrUtil.format("通过计划groupId:{}查询Image返回结果error:{}", planNew.groupId(), LogExceptionStackTrace.erroStackTrace(throwable).toString()))));
             Mono<List<Material>> text = template.select(Query.query(Criteria.where("type").is(11)
                             .and("group_type_id").is(planNew.groupId())
                             .and("deleted_at").isNull()), Material.class)
                     .switchIfEmpty(Mono.error(new BaseException(StrUtil.format("通过计划groupId:{}查询Material返回结构为空", planNew.groupId()))))
                     .onErrorResume(throwable ->
-                            Mono.error(new Exception(StrUtil.format("通过计划groupId:{}查询Material返回结果error:{}", planNew.groupId(), LogExceptionStackTrace.erroStackTrace(throwable).toString()))))
+                            Mono.error(new BaseException(StrUtil.format("通过计划groupId:{}查询Material返回结果error:{}", planNew.groupId(), LogExceptionStackTrace.erroStackTrace(throwable).toString()))))
                     .collectList();
             Mono<List<H5ImageAndText>> arrayListMono = Mono.zip(Mono.just(planNew), image, text).flatMap(f -> {
                 // H5ImageAndText
@@ -201,7 +198,7 @@ public class PlanNewCommonOutController {
                 List<Image> t3 = f.getT2();
                 List<Material> t4 = f.getT3();
                 if (t3.size() < integer || t4.size() < integer) {
-                    throw new BaseException("图片或文字素材小于计划设置数");
+                    return Mono.error(new BaseException("图片或文字素材小于计划设置数"));
                 }
                 ArrayList<Long> listImg = new ArrayList<>();
                 ArrayList<Long> listTxt = new ArrayList<>();
@@ -287,7 +284,7 @@ public class PlanNewCommonOutController {
         Mono<PlanNew> code1 = template
                 .selectOne(Query.query(Criteria.where("code").is(request.getCode())), PlanNew.class)
                 .switchIfEmpty(Mono.error(new BaseException("计划code异常 返回结果为空")))
-                .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString())));
+                .onErrorResume(throwable -> Mono.error(new BaseException("计划code异常" + throwable.getMessage())));
         Mono<DomainSelectRes> domainSelectResMono1 = code1.flatMap(f -> {
             Mono<String> stringMono;
             if (f.transferPageBl() == 1 && Objects.nonNull(f.transferPageDomain())) {
@@ -297,7 +294,7 @@ public class PlanNewCommonOutController {
                                 .and("type").is(5)
                                 .and("deleted_at").isNull()), DomainSelect.class)
                         .switchIfEmpty(Mono.error(new BaseException("transferPageDomain 域名查詢為空 group_type_id:::" + f.transferPageDomain())))
-                        .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString()))).collectList().flatMap(fff -> {
+                        .onErrorResume(throwable -> Mono.error(new BaseException("transferPageDomain 域名查詢為空 group_type_id:::" + f.transferPageDomain()))).collectList().flatMap(fff -> {
                             if (!fff.isEmpty()) {
                                 DomainSelect domainSelect = fff.get(RandomUtil.randomInt(0, fff.size()));
                                 String string = RandomUtil.randomString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 6);
@@ -305,7 +302,7 @@ public class PlanNewCommonOutController {
                                 return Mono.just(string + "." + domain1);
 
                             } else {
-                                throw new BaseException("transferPageDomain 中轉域名查詢為空 group_type_id:::" + f.transferPageDomain());
+                                return Mono.error(new BaseException("transferPageDomain 中轉域名查詢為空 group_type_id:::" + f.transferPageDomain()));
                             }
                         });
             } else {
@@ -319,14 +316,14 @@ public class PlanNewCommonOutController {
                                 .and("type").is(4)
                                 .and("deleted_at").isNull()), DomainSelect.class)
                         .switchIfEmpty(Mono.error(new BaseException("backgroupDomain 域名查询为空 group_type_id" + f.backgroupDomain())))
-                        .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString()))).collectList().flatMap(fff -> {
+                        .onErrorResume(throwable -> Mono.error(new BaseException("backgroupDomain 域名查询为空 group_type_id" + f.backgroupDomain()))).collectList().flatMap(fff -> {
                             if (!fff.isEmpty()) {
                                 DomainSelect domainSelect = fff.get(RandomUtil.randomInt(0, fff.size()));
                                 String string = RandomUtil.randomString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 6);
                                 String domain1 = domainSelect.domain();
                                 return Mono.just(string + "." + domain1);
                             } else {
-                                throw new BaseException("backgroupDomain 背景域名查詢為空 group_type_id" + f.backgroupDomain());
+                                return Mono.error(new BaseException("backgroupDomain 背景域名查詢為空 group_type_id" + f.backgroupDomain()));
                             }
                         });
             } else {
@@ -338,7 +335,7 @@ public class PlanNewCommonOutController {
                             .and("type").is(request.getType())
                             .and("deleted_at").isNull()), DomainSelect.class)
                     .switchIfEmpty(Mono.error(new BaseException("查询domain 返回结果为空")))
-                    .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString()))).collectList().flatMap(fm -> {
+                    .onErrorResume(throwable -> Mono.error(new BaseException("查询domain 返回结果为空"))).collectList().flatMap(fm -> {
                         //  DomainSelectRes domainSelectRes = new DomainSelectRes();
                         int i = RandomUtil.randomInt(0, fm.size());
                         String domain = fm.get(i).domain();
@@ -365,14 +362,14 @@ public class PlanNewCommonOutController {
     private Mono<RStatus<DomainSelectRes>> getListeningPlan(OutDomainRequest request) {
         Mono<ListeningPlanNew> code1 = template.selectOne(Query.query(Criteria.where("code").is(request.getCode())), ListeningPlanNew.class)
                 .switchIfEmpty(Mono.error(new BaseException("计划code异常 返回结果为空")))
-                .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString())));
+                .onErrorResume(throwable -> Mono.error(new BaseException("计划code异常")));
         Mono<DomainSelectRes> domainSelectResMono1 = code1.flatMap(f -> template.select(Query.query(Criteria
                         .where("group_type_id").is(f.groupId())
                         .and("status").is(1)
                         .and("type").is(request.getType())
                         .and("deleted_at").isNull()), DomainSelect.class)
                 .switchIfEmpty(Mono.error(new BaseException("查询domain 返回结果为空")))
-                .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString()))).collectList()
+                .onErrorResume(throwable -> Mono.error(new BaseException("查询domain 返回结果为空"))).collectList()
                 .flatMap(fm -> {
                     DomainSelectRes domainSelectRes = new DomainSelectRes();
                     int i = RandomUtil.randomInt(0, fm.size());
@@ -400,7 +397,7 @@ public class PlanNewCommonOutController {
                             .and("deleted_at").isNull()
                             .and("type").is(request.getType())), DomainSelect.class)
                     .switchIfEmpty(Mono.error(new BaseException("查询domain 返回结果为空")))
-                    .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString())))
+                    .onErrorResume(throwable -> Mono.error(new BaseException("查询domain 返回结果为空")))
                     .collectList().flatMap(fm -> {
                         int i = RandomUtil.randomInt(0, fm.size());
                         String domain = fm.get(i).domain();
@@ -416,14 +413,14 @@ public class PlanNewCommonOutController {
                             .and("type").is(5)
                             .and("deleted_at").isNull()), DomainSelect.class)
                     .switchIfEmpty(Mono.error(new BaseException("transferPageDomain 域名查詢為空 group_type_id:::" + request.getTransferPageDomain())))
-                    .onErrorResume(throwable -> Mono.error(new Exception(throwable.getMessage()))).collectList().flatMap(fff -> {
+                    .onErrorResume(throwable -> Mono.error(new BaseException(throwable.getMessage()))).collectList().flatMap(fff -> {
                         if (!fff.isEmpty()) {
                             DomainSelect domainSelect = fff.get(RandomUtil.randomInt(0, fff.size()));
                             String string = RandomUtil.randomString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 6);
                             String domain1 = domainSelect.domain();
                             return Mono.just(string + "." + domain1);
                         } else {
-                            throw new BaseException("transferPageDomain 中轉域名查詢為空 group_type_id:::" + request.getTransferPageDomain());
+                            return Mono.error(new BaseException("transferPageDomain 中轉域名查詢為空 group_type_id:::" + request.getTransferPageDomain()));
                         }
                     });
         } else {
@@ -437,14 +434,14 @@ public class PlanNewCommonOutController {
                             .and("type").is(4)
                             .and("deleted_at").isNull()), DomainSelect.class)
                     .switchIfEmpty(Mono.error(new BaseException("backgroupDomain 域名查询为空 group_type_id" + request.getBackgroupDomain())))
-                    .onErrorResume(throwable -> Mono.error(new Exception(throwable.getMessage()))).collectList().flatMap(fff -> {
+                    .onErrorResume(throwable -> Mono.error(new BaseException(throwable.getMessage()))).collectList().flatMap(fff -> {
                         if (!fff.isEmpty()) {
                             DomainSelect domainSelect = fff.get(RandomUtil.randomInt(0, fff.size()));
                             String string = RandomUtil.randomString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 6);
                             String domain1 = domainSelect.domain();
                             return Mono.just(string + "." + domain1);
                         } else {
-                            throw new BaseException("backgroupDomain 背景域名查詢為空 group_type_id" + request.getBackgroupDomain());
+                            return Mono.error(new BaseException("backgroupDomain 背景域名查詢為空 group_type_id" + request.getBackgroupDomain()));
                         }
                     });
         } else {
@@ -473,7 +470,7 @@ public class PlanNewCommonOutController {
                             .and("deleted_at").isNull()
                             .and("type").is(request.getType())), DomainSelect.class)
                     .switchIfEmpty(Mono.error(new BaseException("查询domain 返回结果为空")))
-                    .onErrorResume(throwable -> Mono.error(new Exception(throwable.getMessage())))
+                    .onErrorResume(throwable -> Mono.error(new BaseException(throwable.getMessage())))
                     .collectList().flatMap(fm -> {
                         int i = RandomUtil.randomInt(0, fm.size());
                         String domain = fm.get(i).domain();
@@ -501,7 +498,7 @@ public class PlanNewCommonOutController {
     public Mono<RStatus<PlanNewCommonMaterialRes>> getCommonMaterial(@RequestBody PlanNewCommonMaterialReq request) {
         Mono<PlanNewCommon> planNewCommonMono = template.selectOne(Query.query(Criteria.where("code").is(request.getCode())), PlanNewCommon.class)
                 .switchIfEmpty(Mono.error(new BaseException("计划code异常 返回结果为空")))
-                .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString())));
+                .onErrorResume(throwable -> Mono.error(new BaseException("计划code异常")));
         Mono<PlanNewCommonMaterialRes> materialResMono = planNewCommonMono.flatMap(plan -> {
             // 群音频
             Mono<Audio> groupAudio = this.getAudio(request.getAudioId());
@@ -515,7 +512,7 @@ public class PlanNewCommonOutController {
                 returnLoop = template.selectOne(Query.query(Criteria.where("id").is(request.getReturnLoopId())
                                 .and("deleted_at").isNull()), ReturnLoop.class)
                         .switchIfEmpty(Mono.just(getReturnLoop()))
-                        .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString())));
+                        .onErrorResume(throwable -> Mono.error(new BaseException("查询返回广告异常")));
             }
             // 分享背景组
             Mono<List<BackgroupImageItem>> backgroupImageItemMono;
@@ -525,13 +522,13 @@ public class PlanNewCommonOutController {
                 backgroupImageItemMono = template.select(Query.query(Criteria
                                 .where("group_id").is(request.getBackgroundGroupId())), BackgroupImageItem.class).collectList()
                         .switchIfEmpty(Mono.just(List.of()))
-                        .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString())));
+                        .onErrorResume(throwable -> Mono.error(new BaseException("查询分享背景组异常")));
             }
             Mono<TakeawayH5Data> takeaway;
             if (Objects.nonNull(request.getTakeawayId()) && request.getTakeawayId() > 0) {
                 takeaway = takeawayServicesInterface.getTakeaway(request.getTakeawayId())
                         .switchIfEmpty(Mono.just(new TakeawayH5Data()))
-                        .onErrorResume(e -> Mono.error(new BaseException("查询外卖模版数据异常:::" + LogExceptionStackTrace.erroStackTrace(e).toString())));
+                        .onErrorResume(e -> Mono.error(new BaseException("查询外卖模版数据异常:::" + e.getMessage())));
             } else {
                 takeaway = Mono.just(new TakeawayH5Data());
             }
@@ -595,17 +592,15 @@ public class PlanNewCommonOutController {
      */
     @PostMapping("planCommonShare")
     public Mono<RStatus<PlanNewCommonShareRes>> planCommonShare(@RequestBody PlanNewCommonShareReq request) {
-        if (MAP.containsKey(request.getUnique())) {
-            Integer integer = MAP.get(request.getUnique());
-            MAP.put(request.getUnique(), integer + 1);
-            request.setUserVisits(integer + 1);
-        } else {
-            MAP.put(request.getUnique(), 0);
-            request.setUserVisits(0);
+        if (request.getCode() == null || request.getCode().isEmpty()) {
+            throw new BaseException("code不能为空");
         }
+        Integer visits = planServiceInterface.setUserVisitsToRedis(request.getUnique(), request.getCode());
+        request.setUserVisits(visits);
+
         Mono<PlanNewCommon> planNewCommonMono = template.selectOne(Query.query(Criteria.where("code").is(request.getCode())), PlanNewCommon.class)
                 .switchIfEmpty(Mono.error(new BaseException(" code错误")))
-                .onErrorResume(throwable -> Mono.error(new Exception(LogExceptionStackTrace.erroStackTrace(throwable).toString())));
+                .onErrorResume(throwable -> Mono.error(new BaseException(" code错误")));
         Mono<PlanNewCommonShareRes> resMono = planNewCommonMono.flatMap(plan -> {
             Mono<StringBuilder> stringBuilderMono;
             boolean isQs = Objects.nonNull(request.getWx_user_id()) && !request.getWx_user_id().isEmpty();
@@ -645,7 +640,7 @@ public class PlanNewCommonOutController {
                             int v = userVisits % qs.size();
                             res.setQsSetting(qs.get(v));
                             if (f.getT6().toString().isEmpty()) {
-                                throw new BaseException("计划链接 查询匹配域名为空");
+                                return Mono.error(new BaseException("计划链接 查询匹配域名为空"));
                             }
                             res.setLink(f.getT6().toString());
                         } else {
@@ -667,7 +662,7 @@ public class PlanNewCommonOutController {
                             int v = userVisits % fx.size();
                             res.setFxSetting(fx.get(v));
                             if (f.getT6().toString().isEmpty()) {
-                                throw new BaseException("计划链接 查询匹配域名为空");
+                                return Mono.error(new BaseException("计划链接 查询匹配域名为空"));
                             }
                             res.setLink(f.getT6().toString());
                         } else {
@@ -721,7 +716,7 @@ public class PlanNewCommonOutController {
                 try {
                     jsonObject1 = JSONUtil.parseObj(ret);
                 } catch (Exception e) {
-                    throw new BaseException(e.getMessage() + "---" + JSONUtil.parseObj(goRequest) + " error:" + LogExceptionStackTrace.erroStackTrace(e).toString());
+                    return Mono.error(new BaseException(e.getMessage() + "---" + JSONUtil.parseObj(goRequest) + " error:" + LogExceptionStackTrace.erroStackTrace(e).toString()));
                 }
                 if (jsonObject1.containsKey("code") && jsonObject1.get("code", Integer.class) == 0 && jsonObject1.containsKey("data")) {
                     JSONObject data = jsonObject1.get("data", JSONObject.class);
@@ -795,7 +790,7 @@ public class PlanNewCommonOutController {
             try {
                 jsonObject = JSONUtil.parseObj(posterTemplate);
             } catch (Exception e) {
-                throw new BaseException(e.getMessage() + "---" + posterTemplate + " error:" + LogExceptionStackTrace.erroStackTrace(e).toString());
+                return Mono.error(new BaseException(e.getMessage() + "---" + posterTemplate + " error:" + LogExceptionStackTrace.erroStackTrace(e).toString()));
             }
             GoRequest goRequest = new GoRequest();
             BeanUtil.copyProperties(jsonObject, goRequest);

+ 15 - 15
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/PlanNewOutController.java

@@ -14,6 +14,7 @@ import com.webflux.launchadmin.mysql.controller.planNew.req.*;
 import com.webflux.launchadmin.mysql.controller.planNew.res.*;
 import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNew;
 import com.webflux.launchadmin.mysql.entity.planNew.*;
+import com.webflux.launchadmin.mysql.service.planNew.PlanServiceInterface;
 import com.webflux.launchadmin.mysql.service.planNew.goGenerate.GoGenerateService;
 import com.webflux.launchadmin.mysql.service.planNew.ipAnalyze.IpAnalyzeServiceInterface;
 import com.webflux.launchadmin.mysql.service.planNew.structure.GoRequest;
@@ -68,18 +69,19 @@ public class PlanNewOutController {
     @Autowired
     private StringRedisTemplate stringRedisTemplate;
 
-
+    @Resource
+    private PlanServiceInterface planServiceInterface;
 
     private static final ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<String,Integer>();
 
     //清空用户Map数据
-    @Scheduled(cron="1 1 4 * * ?")
-    @SchedulerLock(name = "launch:PlanNewOutController:clearUserContextMap", lockAtLeastFor = "PT5S", lockAtMostFor = "PT15M")
-    public void clearUserContextMap(){
-        log.info("清空计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》开始");
-        map.clear();
-        log.info("清空计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》 结束");
-    }
+    // @Scheduled(cron="1 1 4 * * ?")
+    // @SchedulerLock(name = "launch:PlanNewOutController:clearUserContextMap", lockAtLeastFor = "PT5S", lockAtMostFor = "PT15M")
+    // public void clearUserContextMap(){
+    //     log.info("清空计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》开始");
+    //     map.clear();
+    //     log.info("清空计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》 结束");
+    // }
 
     /**
      * 获取二维码缓存信息
@@ -550,14 +552,12 @@ public class PlanNewOutController {
      */
     @PostMapping("hftInfo")
     public Mono<RStatus<DataLists0>> hftInfo(@RequestBody HftRequest request){
-        if(map.containsKey(request.getUnique())){
-            Integer integer = map.get(request.getUnique());
-            map.put(request.getUnique(),integer+1);
-            request.setUserVisits(integer+1);
-        }else {
-            map.put(request.getUnique(),0);
-            request.setUserVisits(0);
+        if (request.getCode() == null || request.getCode().isEmpty()) {
+            throw new BaseException("code不能为空");
         }
+        Integer visits = planServiceInterface.setUserVisitsToRedis(request.getUnique(), request.getCode());
+        request.setUserVisits(visits);
+
         Mono<PlanNew> code0 = template.selectOne(Query.query(Criteria.where("code").is(request.getCode())), PlanNew.class)
                 .switchIfEmpty(Mono.error(new BaseException(" code错误")))
                 .onErrorResume(throwable -> Mono.error(new BaseException(throwable.getMessage())));

+ 15 - 14
launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/listening/ListeningPlanServiceImpl.java

@@ -20,6 +20,7 @@ import com.webflux.launchadmin.mysql.entity.listening.ListeningAudio;
 import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNew;
 import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNewBackgroupPoster;
 import com.webflux.launchadmin.mysql.entity.planNew.*;
+import com.webflux.launchadmin.mysql.service.planNew.PlanServiceInterface;
 import com.webflux.launchadmin.mysql.service.planNew.goGenerate.GoGenerateService;
 import com.webflux.launchadmin.mysql.service.planNew.structure.GoRequest;
 import com.webflux.launchadmin.mysql.service.planNew.structure.Item;
@@ -52,6 +53,8 @@ public class ListeningPlanServiceImpl implements ListeningPlanServiceInterface{
     private GoGenerateService goGenerateService;
     @Resource
     private R2dbcEntityTemplate template;
+    @Resource
+    private PlanServiceInterface planServiceInterface;
     @Override
     public Mono<RStatus<Paged<ListeningPlanNewRes2>>> page(PlanReqPage request, Criteria criteria) {
         Query query = Query.query(criteria);
@@ -415,23 +418,21 @@ public class ListeningPlanServiceImpl implements ListeningPlanServiceInterface{
     }
     private static final ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<>();
     //清空用户Map数据
-    @Scheduled(cron="1 2 4 * * ?")
-    @SchedulerLock(name = "launch:ListeningPlanServiceImpl:clearUserContextMap", lockAtLeastFor = "PT5S", lockAtMostFor = "PT15M")
-    public void clearUserContextMap(){
-        log.info("清空听书裂变计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》开始");
-        map.clear();
-        log.info("空听书裂变计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》 结束");
-    }
+    // @Scheduled(cron="1 2 4 * * ?")
+    // @SchedulerLock(name = "launch:ListeningPlanServiceImpl:clearUserContextMap", lockAtLeastFor = "PT5S", lockAtMostFor = "PT15M")
+    // public void clearUserContextMap(){
+    //     log.info("清空听书裂变计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》开始");
+    //     map.clear();
+    //     log.info("空听书裂变计划-H5用户Map数据》》》》》》》》》》》》》》》》》》》》》》 结束");
+    // }
     @Override
     public Mono<RStatus<DataListsShare>> share(OutListeningShareRequest request) {
-        if(map.containsKey(request.getUnique())){
-            Integer integer = map.get(request.getUnique());
-            map.put(request.getUnique(),integer+1);
-            request.setUserVisits(integer+1);
-        }else {
-            map.put(request.getUnique(),0);
-            request.setUserVisits(0);
+        if (request.getCode() == null || request.getCode().isEmpty()) {
+            throw new BaseException("code不能为空");
         }
+        Integer visits = planServiceInterface.setUserVisitsToRedis(request.getUnique(), request.getCode());
+        request.setUserVisits(visits);
+
         Mono<ListeningPlanNew> code1 = template.selectOne(Query.query(Criteria.where("code")
                 .is(request.getCode())), ListeningPlanNew.class)
                 .switchIfEmpty(Mono.error(new BaseException("hello!!! code错误")))

+ 27 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/planNew/PlanServiceImpl.java

@@ -9,19 +9,26 @@ import com.webflux.launchadmin.mysql.entity.planNew.PlanNewCommon;
 import com.webflux.launchadmin.mysql.entity.planNew.PosterTemplate;
 import com.webflux.launchcommon.returnObj.Paged;
 import com.webflux.launchcommon.returnObj.RStatus;
+import com.weblux.launchredis.utils.RedisKey;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.data.relational.core.query.Criteria;
 import org.springframework.data.relational.core.query.Query;
 import org.springframework.stereotype.Service;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.Comparator;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -35,6 +42,8 @@ public class PlanServiceImpl implements PlanServiceInterface {
 
     @Resource
     private R2dbcEntityTemplate template;
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
 
     @Override
     public Mono<RStatus<Paged<ListeningPlanNewRes2>>> page(PlanReqPage request, Criteria criteria) {
@@ -79,4 +88,22 @@ public class PlanServiceImpl implements PlanServiceInterface {
         return RStatus.successList(pagedMono);
     }
 
+    @Override
+    public Integer setUserVisitsToRedis(String unique, String code) {
+        String redisKey = RedisKey.H5_USER_UNIQUE + unique;
+        Integer integer = 0;
+        if (Boolean.TRUE.equals(stringRedisTemplate.hasKey(redisKey))){
+            Object val = stringRedisTemplate.opsForHash().get(unique, code);
+            if (val != null) {
+                integer = Integer.getInteger(val.toString());
+                integer = integer + 1;
+            }
+        }
+        stringRedisTemplate.opsForHash().put(redisKey, code, integer.toString());
+        // 设置过期时间
+        LocalDateTime expireTime = LocalDateTime.of(LocalDate.now().plusDays(1), LocalTime.of(4,0));
+        long minute = Duration.between(LocalDateTime.now(), expireTime).toMinutes();
+        stringRedisTemplate.expire(redisKey, minute, TimeUnit.MINUTES);
+        return integer;
+    }
 }

+ 1 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/planNew/PlanServiceInterface.java

@@ -13,4 +13,5 @@ import reactor.core.publisher.Mono;
 public interface PlanServiceInterface {
     Mono<RStatus<Paged<ListeningPlanNewRes2>>> page(PlanReqPage request, Criteria criteria);
 
+    Integer setUserVisitsToRedis(String unique, String code);
 }

+ 3 - 0
launch-redis/src/main/java/com/weblux/launchredis/utils/RedisKey.java

@@ -29,4 +29,7 @@ public class RedisKey {
 
     //.域名相信信息
     public final static String DOMAIN_INFO = "sync_domain_info";
+
+    /** H5客户缓存 */
+    public final static String H5_USER_UNIQUE = "h5_user_unique:";
 }