diff --git a/src/main/java/com/xiang/ApplicationInit.java b/src/main/java/com/xiang/ApplicationInit.java index 3246791..34c512e 100644 --- a/src/main/java/com/xiang/ApplicationInit.java +++ b/src/main/java/com/xiang/ApplicationInit.java @@ -2,9 +2,11 @@ package com.xiang; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.xiang.common.enums.RedisKeyConstant; import com.xiang.common.enums.ScheduleEnums; import com.xiang.common.pojo.schedule.ScheduleOpeningConfigDO; import com.xiang.common.service.IScheduleOpeningConfigService; +import com.xiang.common.utils.RedisService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -28,6 +30,7 @@ import java.util.stream.Collectors; public class ApplicationInit implements ApplicationRunner { private final IScheduleOpeningConfigService scheduleOpeningConfigService; + private final RedisService redisService; @Override public void run(ApplicationArguments args) throws Exception { @@ -35,6 +38,10 @@ public class ApplicationInit implements ApplicationRunner { log.info("开始加载任务配置!"); loadScheduleTask(); log.info("任务配置加载完成!"); + + log.info("redis key 加载开始!"); + loadRedisKey(); + log.info("redis key 加载结束!"); } private void loadScheduleTask() { @@ -63,4 +70,8 @@ public class ApplicationInit implements ApplicationRunner { scheduleOpeningConfigService.saveBatch(list); } } + + private void loadRedisKey() { + redisService.set(RedisKeyConstant.JNTYZX_SUBSCRIBE_TIME_KEY, "18:00"); + } } diff --git a/src/main/java/com/xiang/common/config/RedisConfig.java b/src/main/java/com/xiang/common/config/RedisConfig.java index ad5657a..2d007f6 100644 --- a/src/main/java/com/xiang/common/config/RedisConfig.java +++ b/src/main/java/com/xiang/common/config/RedisConfig.java @@ -7,11 +7,17 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.RedisPassword; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; +import java.time.Duration; + @Configuration public class RedisConfig { @Bean @@ -35,7 +41,6 @@ public class RedisConfig { template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); - template.afterPropertiesSet(); return template; } @@ -44,4 +49,18 @@ public class RedisConfig { public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) { return new StringRedisTemplate(factory); } + + @Bean + public RedisConnectionFactory redisConnectionFactory(RedisProperties props) { + RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); + config.setHostName(props.getHost()); + config.setPort(Integer.parseInt(props.getPort())); + config.setPassword(RedisPassword.of(props.getPassword())); + config.setDatabase(props.getDatabase()); + + LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() + .commandTimeout(Duration.ofSeconds(3)) + .build(); + return new LettuceConnectionFactory(config, clientConfig); + } } diff --git a/src/main/java/com/xiang/common/enums/RedisKeyConstant.java b/src/main/java/com/xiang/common/enums/RedisKeyConstant.java index 6117a59..1e2a78a 100644 --- a/src/main/java/com/xiang/common/enums/RedisKeyConstant.java +++ b/src/main/java/com/xiang/common/enums/RedisKeyConstant.java @@ -29,6 +29,8 @@ public class RedisKeyConstant { return JNTYZX_VENUE_SUBSCRIBE_KEY + placeName + ":" + getDate(); } + public static final String JNTYZX_SUBSCRIBE_TIME_KEY = "jntyzx:subscribe:time"; + public static String getDate() { LocalDate now = LocalDate.now(); return ":" + DateUtils.getDateFromDate(now); diff --git a/src/main/java/com/xiang/service/module/jntyzx/miniapp/schedule/JntyzxUserInfoConfigTask.java b/src/main/java/com/xiang/service/module/jntyzx/miniapp/schedule/JntyzxUserInfoConfigTask.java index c232807..066d356 100644 --- a/src/main/java/com/xiang/service/module/jntyzx/miniapp/schedule/JntyzxUserInfoConfigTask.java +++ b/src/main/java/com/xiang/service/module/jntyzx/miniapp/schedule/JntyzxUserInfoConfigTask.java @@ -1,6 +1,8 @@ package com.xiang.service.module.jntyzx.miniapp.schedule; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.google.common.collect.Lists; +import com.xiang.common.enums.RedisKeyConstant; import com.xiang.common.enums.ScheduleEnums; import com.xiang.common.factory.JntyzxDingTalkFactory; import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate; @@ -11,6 +13,7 @@ import com.xiang.common.pojo.schedule.TaskResult; import com.xiang.common.service.IScheduleOpeningConfigService; import com.xiang.common.service.IScheduleRunLogService; import com.xiang.common.utils.DateUtils; +import com.xiang.common.utils.RedisService; import com.xiang.service.module.jntyzx.miniapp.service.IUserInfoService; import com.xiang.service.module.jntyzx.miniapp.service.IUserTokenInfoService; import com.xiang.service.module.jntyzx.miniapp.service.IVenueService; @@ -34,18 +37,21 @@ public class JntyzxUserInfoConfigTask extends BaseScheduleTaskTemplate { private final IVenueService venueService; private final IUserInfoService userInfoService; private final JntyzxDingTalkFactory jntyzxDingTalkFactory; + private final RedisService redisService; public JntyzxUserInfoConfigTask(IScheduleOpeningConfigService scheduleOpeningConfigService, IScheduleRunLogService scheduleRunLogService, IUserTokenInfoService userTokenInfoService, IVenueService venueService, IUserInfoService userInfoService, - JntyzxDingTalkFactory jntyzxDingTalkFactory) { + JntyzxDingTalkFactory jntyzxDingTalkFactory, + RedisService redisService) { super(scheduleOpeningConfigService, scheduleRunLogService); this.userTokenInfoService = userTokenInfoService; this.venueService = venueService; this.userInfoService = userInfoService; this.jntyzxDingTalkFactory = jntyzxDingTalkFactory; + this.redisService = redisService; } @Override @@ -72,14 +78,20 @@ public class JntyzxUserInfoConfigTask extends BaseScheduleTaskTemplate { taskResult.setSummary("无可用场地"); return taskResult; } - venueInfoDOS = venueInfoDOS.stream() - .filter(VenueInfoUtils::get11213VenueInfo4Mor) - .sorted(Comparator.comparing(item -> VenueInfoUtils.sortVenueInfo(item.getPlaceName()))) - .toList(); + + String time = (String) redisService.get(RedisKeyConstant.JNTYZX_SUBSCRIBE_TIME_KEY); + if (StringUtils.isBlank(time)) { + time = "18:00"; + } + String finalTime = time; + venueInfoDOS = VenueInfoUtils.filterVenueList(finalTime, venueInfoDOS); if (CollectionUtils.isEmpty(venueInfoDOS)) { taskResult.setSummary("无可用场地"); return taskResult; } + venueInfoDOS = venueInfoDOS.stream() + .sorted(Comparator.comparing(item -> VenueInfoUtils.sortVenueInfo(item.getPlaceName()))) + .toList(); List users = userTokenInfoService.getCanOrderUser(); if (CollectionUtils.isEmpty(users)) { diff --git a/src/main/java/com/xiang/service/module/jntyzx/miniapp/schedule/JtVenueSubscribeTask.java b/src/main/java/com/xiang/service/module/jntyzx/miniapp/schedule/JtVenueSubscribeTask.java index 6ed10b6..3785e3f 100644 --- a/src/main/java/com/xiang/service/module/jntyzx/miniapp/schedule/JtVenueSubscribeTask.java +++ b/src/main/java/com/xiang/service/module/jntyzx/miniapp/schedule/JtVenueSubscribeTask.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; @@ -108,9 +109,10 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate { UserTokenInfoDO userTokenInfoDO = userMap.get(userInfoDO.getName()); List venueInfoDOList = venueInfoMap.get(userInfoDO.getPlaceName()); if (CollectionUtils.isEmpty(venueInfoDOList)) { + logger.info("用户:{}查询不到场地信息:{}", userInfoDO.getName(), userInfoDO.getPlaceName()); continue; } - venueInfoDOList = VenueInfoUtils.filterVenueList(userInfoDO.getSiteTimeName(), venueInfoDOS); + venueInfoDOList = VenueInfoUtils.filterVenueList(userInfoDO.getSiteTimeName(), venueInfoDOList); if (CollectionUtils.isEmpty(venueInfoDOList)) { logger.info("用户:{}无场地信息:{},时间:{}", userInfoDO.getName(), userInfoDO.getPlaceName(), userInfoDO.getSiteTimeName()); continue; @@ -125,9 +127,12 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate { LocalTime targetTime = LocalTime.parse("09:00:10"); Duration duration = Duration.between(currentTime, targetTime); long milliseconds = duration.toMillis(); + if (milliseconds <= 0) { + milliseconds = 0; + } List finalVenueInfoDOList = venueInfoDOList; -// executorService.schedule(() -> { - for (int i = 0; i < 10; i++) { + executorService.schedule(() -> { + for (int i = 0; i < 3; i++) { String valid = (String) redisService.get(RedisKeyConstant.getVenueSubscribeKey(placeName)); if (StringUtils.isNotBlank(valid)) { break; @@ -137,12 +142,12 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate { break; } try { - Thread.sleep(1250); + Thread.sleep(2000); } catch (InterruptedException e) { log.error("睡眠失败~~~"); } } -// }, milliseconds, TimeUnit.MILLISECONDS); + }, milliseconds, TimeUnit.MILLISECONDS); } } diff --git a/src/main/java/com/xiang/service/module/jntyzx/miniapp/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/xiang/service/module/jntyzx/miniapp/service/impl/OrderInfoServiceImpl.java index 004e686..d2729d4 100644 --- a/src/main/java/com/xiang/service/module/jntyzx/miniapp/service/impl/OrderInfoServiceImpl.java +++ b/src/main/java/com/xiang/service/module/jntyzx/miniapp/service/impl/OrderInfoServiceImpl.java @@ -76,10 +76,10 @@ public class OrderInfoServiceImpl implements IJtOrderService { orderCreateInfoManage.save(orderInfoDO); } } - dingTalkFactory.sendMsg("用户" + userTokenInfoDO.getName() + "预订场地号:" + venueInfoDOS.get(0).getPlaceName() + "结果返回:" + JSON.toJSONString(orderResp)); + dingTalkFactory.sendMsg("用户" + userTokenInfoDO.getName() + "小程序预订场地号:" + venueInfoDOS.get(0).getPlaceName() + "结果返回:" + JSON.toJSONString(orderResp)); return true; } else { - dingTalkFactory.sendMsg("用户" + userTokenInfoDO.getName() + "预订场地号:" + venueInfoDOS.get(0).getPlaceName() + "结果返回:" + JSON.toJSONString(orderResp)); + dingTalkFactory.sendMsg("用户" + userTokenInfoDO.getName() + "小程序预订场地号:" + venueInfoDOS.get(0).getPlaceName() + "结果返回:" + JSON.toJSONString(orderResp)); if (orderResp.getMessage().contains("锁卡")) { log.info("有锁卡风险,不在请求,用户:{}", userTokenInfoDO.getName()); throw new BusinessException("即将锁卡,不再请求"); @@ -93,6 +93,10 @@ public class OrderInfoServiceImpl implements IJtOrderService { log.info("该场地已被人预定,更换场地, 用户:{}", userTokenInfoDO.getName()); redisService.set(RedisKeyConstant.getVenueSubscribeKey(venueInfoDOS.get(0).getPlaceName()), "true"); } + if (orderResp.getMessage().contains("预约场地不能超过2个")) { + log.info("用户:{}已经预约场地", userTokenInfoDO.getName()); + throw new BusinessException("用户已经预约场地"); + } return false; } } diff --git a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbOrderTask.java b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbOrderTask.java index 8f83c64..e5de3d5 100644 --- a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbOrderTask.java +++ b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbOrderTask.java @@ -138,7 +138,7 @@ public class ZlbOrderTask extends BaseScheduleTaskTemplate { log.info("订单接口返回结果==> \n {}", response); JSONObject jsonObject = JSONObject.parseObject(response); if (jsonObject.getInteger("code") == 200) { - jntyzxDingTalkFactory.sendMsg(name + "订单接口下单返回成功请2分钟内付款√√√√√√场地号:" + placeName + "时间:" + siteTimeName); + jntyzxDingTalkFactory.sendMsg(name + "zlb订单接口下单返回成功请2分钟内付款√√√√√√场地号:" + placeName + "时间:" + siteTimeName); JSONObject data = jsonObject.getJSONObject("data"); String orderId = data.getString("orderId"); log.info("{}订单{}创建成功", name, orderId); @@ -149,7 +149,7 @@ public class ZlbOrderTask extends BaseScheduleTaskTemplate { } if (jsonObject.getInteger("code") == 500) { if (jsonObject.getString("message").contains("已被售出")) { - jntyzxDingTalkFactory.sendMsg(name + "订单接口下单返回失败❌❌❌场地号:" + placeName + "已被售出"); + jntyzxDingTalkFactory.sendMsg(name + "zlb订单接口下单返回失败❌❌❌场地号:" + placeName + "已被售出"); return true; } } diff --git a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbUserConfigTask.java b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbUserConfigTask.java index 6685db4..7683bcf 100644 --- a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbUserConfigTask.java +++ b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbUserConfigTask.java @@ -1,11 +1,16 @@ package com.xiang.service.module.jntyzx.zlb.schedule; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.collect.Lists; +import com.xiang.common.enums.RedisKeyConstant; import com.xiang.common.enums.ScheduleEnums; import com.xiang.common.factory.JntyzxDingTalkFactory; import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate; +import com.xiang.common.manage.jntyzx.zlb.ZlbSiteInfoService; +import com.xiang.common.manage.jntyzx.zlb.ZlbTokenInfoService; +import com.xiang.common.manage.jntyzx.zlb.ZlbUserInfoService; import com.xiang.common.pojo.jntyzx.zlb.ZlbSiteInfo; import com.xiang.common.pojo.jntyzx.zlb.ZlbTokenInfo; import com.xiang.common.pojo.jntyzx.zlb.ZlbUserInfo; @@ -13,9 +18,7 @@ import com.xiang.common.pojo.schedule.TaskResult; import com.xiang.common.service.IScheduleOpeningConfigService; import com.xiang.common.service.IScheduleRunLogService; import com.xiang.common.utils.DateUtils; -import com.xiang.common.manage.jntyzx.zlb.ZlbSiteInfoService; -import com.xiang.common.manage.jntyzx.zlb.ZlbTokenInfoService; -import com.xiang.common.manage.jntyzx.zlb.ZlbUserInfoService; +import com.xiang.common.utils.RedisService; import com.xiang.service.module.jntyzx.miniapp.utils.VenueInfoUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -39,18 +42,21 @@ public class ZlbUserConfigTask extends BaseScheduleTaskTemplate { private final ZlbUserInfoService zlbUserInfoService; private final JntyzxDingTalkFactory jntyzxDingTalkFactory; private final ZlbTokenInfoService zlbTokenInfoService; + private final RedisService redisService; public ZlbUserConfigTask(IScheduleOpeningConfigService scheduleOpeningConfigService, IScheduleRunLogService scheduleRunLogService, ZlbSiteInfoService zlbSiteInfoService, ZlbUserInfoService zlbUserInfoService, ZlbTokenInfoService zlbTokenInfoService, - JntyzxDingTalkFactory jntyzxDingTalkFactory) { + JntyzxDingTalkFactory jntyzxDingTalkFactory, + RedisService redisService) { super(scheduleOpeningConfigService, scheduleRunLogService); this.zlbSiteInfoService = zlbSiteInfoService; this.zlbUserInfoService = zlbUserInfoService; this.jntyzxDingTalkFactory = jntyzxDingTalkFactory; this.zlbTokenInfoService = zlbTokenInfoService; + this.redisService = redisService; } @Override @@ -127,7 +133,12 @@ public class ZlbUserConfigTask extends BaseScheduleTaskTemplate { } private List filterSiteInfo(List siteInfoList) { - return siteInfoList.stream().filter(item -> Objects.equals(item.getDayEffectiveTimes(), "20:00")).toList(); + String time = (String) redisService.get(RedisKeyConstant.JNTYZX_SUBSCRIBE_TIME_KEY); + if (StringUtils.isBlank(time)) { + time = "18:00"; + } + String finalTime = time; + return siteInfoList.stream().filter(item -> Objects.equals(item.getDayEffectiveTimes(), finalTime)).toList(); } private List sortSiteInfo(List siteInfoList) {