feat:江体小程序

This commit is contained in:
Xiang
2026-05-09 10:56:26 +08:00
parent b30af008e0
commit fea069d795
7 changed files with 102 additions and 28 deletions

View File

@@ -14,7 +14,7 @@ public class RedisProperties {
private String host; private String host;
private String port; private String port;
private String password; private String password;
private Integer database = 0; private Integer database;
public String getAddress() { public String getAddress() {
return "redis://" + host + ":" + port; return "redis://" + host + ":" + port;

View File

@@ -19,6 +19,7 @@ public class JntyzxMiniappScheduleConfig {
private final JtVenuePullTask jtVenuePullTask; private final JtVenuePullTask jtVenuePullTask;
private final JtVenueSubscribeTask jtVenueSubscribeTask; private final JtVenueSubscribeTask jtVenueSubscribeTask;
private final JtVenueTomorrowPullTask jtVenueTomorrowPullTask; private final JtVenueTomorrowPullTask jtVenueTomorrowPullTask;
private final JntyzxUserInfoConfigTask jntyzxUserInfoConfigTask;
@Scheduled(cron = "0 20,50 * * * ?") @Scheduled(cron = "0 20,50 * * * ?")
@@ -27,7 +28,7 @@ public class JntyzxMiniappScheduleConfig {
jtTokenRefreshTask.run(); jtTokenRefreshTask.run();
} }
@Scheduled(cron = "0 0/1 10-18 * * ?") // @Scheduled(cron = "0 0/1 10-18 * * ?")
@GetMapping("/jtVenuePullTask") @GetMapping("/jtVenuePullTask")
public void jtVenuePullTask() { public void jtVenuePullTask() {
jtVenuePullTask.run(); jtVenuePullTask.run();
@@ -42,7 +43,7 @@ public class JntyzxMiniappScheduleConfig {
@Scheduled(cron = "0 40 8 * * ?") @Scheduled(cron = "0 40 8 * * ?")
@GetMapping("/jtUserInfoConfig") @GetMapping("/jtUserInfoConfig")
public void jtUserInfoConfig() { public void jtUserInfoConfig() {
jntyzxUserInfoConfigTask.run();
} }
@Scheduled(cron = "5 0 9 * * ?") @Scheduled(cron = "5 0 9 * * ?")

View File

@@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Comparator;
import java.util.List; import java.util.List;
/** /**
@@ -66,12 +67,15 @@ public class JntyzxUserInfoConfigTask extends BaseScheduleTaskTemplate {
protected TaskResult doExecute(Object validatedParams) throws Exception { protected TaskResult doExecute(Object validatedParams) throws Exception {
TaskResult taskResult = new TaskResult(); TaskResult taskResult = new TaskResult();
taskResult.setSuccess(false); taskResult.setSuccess(false);
List<VenueInfoDO> venueInfoDOS = venueService.queryCanBuyVenue(); List<VenueInfoDO> venueInfoDOS = venueService.queryTomorrowCanBuyVenue();
if (CollectionUtils.isEmpty(venueInfoDOS)) { if (CollectionUtils.isEmpty(venueInfoDOS)) {
taskResult.setSummary("无可用场地"); taskResult.setSummary("无可用场地");
return taskResult; return taskResult;
} }
venueInfoDOS = venueInfoDOS.stream().filter(VenueInfoUtils::get628VenueInfo).toList(); venueInfoDOS = venueInfoDOS.stream()
.filter(VenueInfoUtils::get11213VenueInfo4Mor)
.sorted(Comparator.comparing(item -> VenueInfoUtils.sortVenueInfo(item.getPlaceName())))
.toList();
if (CollectionUtils.isEmpty(venueInfoDOS)) { if (CollectionUtils.isEmpty(venueInfoDOS)) {
taskResult.setSummary("无可用场地"); taskResult.setSummary("无可用场地");
return taskResult; return taskResult;

View File

@@ -1,10 +1,10 @@
package com.xiang.service.module.jntyzx.miniapp.schedule; package com.xiang.service.module.jntyzx.miniapp.schedule;
import com.alibaba.fastjson.JSON;
import com.xiang.common.enums.RedisKeyConstant; import com.xiang.common.enums.RedisKeyConstant;
import com.xiang.common.enums.ScheduleEnums; import com.xiang.common.enums.ScheduleEnums;
import com.xiang.common.factory.JntyzxDingTalkFactory; import com.xiang.common.factory.JntyzxDingTalkFactory;
import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate; import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate;
import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserInfoDO;
import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserTokenInfoDO; import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserTokenInfoDO;
import com.xiang.common.pojo.jntyzx.miniapp.pojo.VenueInfoDO; import com.xiang.common.pojo.jntyzx.miniapp.pojo.VenueInfoDO;
import com.xiang.common.pojo.schedule.TaskResult; import com.xiang.common.pojo.schedule.TaskResult;
@@ -12,19 +12,23 @@ import com.xiang.common.service.IScheduleOpeningConfigService;
import com.xiang.common.service.IScheduleRunLogService; import com.xiang.common.service.IScheduleRunLogService;
import com.xiang.common.utils.RedisService; import com.xiang.common.utils.RedisService;
import com.xiang.service.module.jntyzx.miniapp.service.IJtOrderService; import com.xiang.service.module.jntyzx.miniapp.service.IJtOrderService;
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.IUserTokenInfoService;
import com.xiang.service.module.jntyzx.miniapp.service.IVenueService; import com.xiang.service.module.jntyzx.miniapp.service.IVenueService;
import com.xiang.service.module.jntyzx.miniapp.utils.VenueInfoUtils; import com.xiang.service.module.jntyzx.miniapp.utils.VenueInfoUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.Comparator; import java.time.Duration;
import java.time.LocalTime;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
@@ -37,6 +41,7 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate {
private final IVenueService venueService; private final IVenueService venueService;
private final JntyzxDingTalkFactory jtDingTalkFactory; private final JntyzxDingTalkFactory jtDingTalkFactory;
private final RedisService redisService; private final RedisService redisService;
private final IUserInfoService userInfoService;
public JtVenueSubscribeTask(IScheduleOpeningConfigService scheduleOpeningConfigService, public JtVenueSubscribeTask(IScheduleOpeningConfigService scheduleOpeningConfigService,
IScheduleRunLogService scheduleRunLogService, IScheduleRunLogService scheduleRunLogService,
@@ -44,13 +49,15 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate {
IJtOrderService jtOrderService, IJtOrderService jtOrderService,
IVenueService venueService, IVenueService venueService,
JntyzxDingTalkFactory jtDingTalkFactory, JntyzxDingTalkFactory jtDingTalkFactory,
RedisService redisService) { RedisService redisService,
IUserInfoService userInfoService) {
super(scheduleOpeningConfigService, scheduleRunLogService); super(scheduleOpeningConfigService, scheduleRunLogService);
this.userTokenInfoService = userTokenInfoService; this.userTokenInfoService = userTokenInfoService;
this.jtOrderService = jtOrderService; this.jtOrderService = jtOrderService;
this.venueService = venueService; this.venueService = venueService;
this.jtDingTalkFactory = jtDingTalkFactory; this.jtDingTalkFactory = jtDingTalkFactory;
this.redisService = redisService; this.redisService = redisService;
this.userInfoService = userInfoService;
} }
@Override @Override
@@ -81,31 +88,53 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate {
taskResult.setSummary("无可下单用户"); taskResult.setSummary("无可下单用户");
return taskResult; return taskResult;
} }
Map<String, UserTokenInfoDO> userMap = users.stream().collect(Collectors.toMap(UserTokenInfoDO::getName, Function.identity(), (a, b) -> a));
List<VenueInfoDO> venueInfoDOS = venueService.queryTomorrowCanBuyVenue(); List<VenueInfoDO> venueInfoDOS = venueService.queryTomorrowCanBuyVenue();
Map<String, List<VenueInfoDO>> venueInfoMap = venueInfoDOS.stream() Map<String, List<VenueInfoDO>> venueInfoMap = venueInfoDOS.stream()
.filter(VenueInfoUtils::get8210VenueInfo)
.filter(item -> !StringUtils.contains(item.getPlaceName(), "小馆"))
.collect(Collectors.groupingByConcurrent(VenueInfoDO::getPlaceName)); .collect(Collectors.groupingByConcurrent(VenueInfoDO::getPlaceName));
if (MapUtils.isEmpty(venueInfoMap)) {
log.info("暂无可下单场地time:{}", System.currentTimeMillis()); List<UserInfoDO> userInfoDOS = userInfoService.selectAll();
taskResult.setSummary("无下单场地"); if (CollectionUtils.isEmpty(userInfoDOS)) {
log.info("暂无可下单用户, time:{}", System.currentTimeMillis());
jtDingTalkFactory.sendMsg("暂无可下单用户配置信息, time:" + System.currentTimeMillis());
taskResult.setSummary("无可下单用户配置信息");
return taskResult; return taskResult;
} }
users.parallelStream().forEach(user -> {
try { for (UserInfoDO userInfoDO : userInfoDOS) {
List<String> placeNameList = venueInfoMap.keySet().stream().sorted(Comparator.comparing(VenueInfoUtils::sortVenueInfo)).toList(); if (venueInfoMap.containsKey(userInfoDO.getPlaceName()) && userMap.containsKey(userInfoDO.getName())) {
log.info("场地排序后的集合:{}", JSON.toJSONString(placeNameList)); UserTokenInfoDO userTokenInfoDO = userMap.get(userInfoDO.getName());
for (String placeName : placeNameList) { List<VenueInfoDO> venueInfoDOList = venueInfoMap.get(userInfoDO.getPlaceName());
List<VenueInfoDO> venueInfoDOList = venueInfoMap.get(placeName); if (CollectionUtils.isEmpty(venueInfoDOList)) {
continue;
}
venueInfoDOList = VenueInfoUtils.filterVenueList(userInfoDO.getSiteTimeName(), venueInfoDOS);
if (CollectionUtils.isEmpty(venueInfoDOList)) {
logger.info("用户:{}无场地信息:{},时间:{}", userInfoDO.getName(), userInfoDO.getPlaceName(), userInfoDO.getSiteTimeName());
continue;
}
String placeName = userInfoDO.getPlaceName();
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
//计算9点到现在的时间差
//获取江体当前时间
LocalTime currentTime = LocalTime.now();
LocalTime targetTime = LocalTime.parse("09:00:10");
Duration duration = Duration.between(currentTime, targetTime);
long milliseconds = duration.toMillis();
List<VenueInfoDO> finalVenueInfoDOList = venueInfoDOList;
// executorService.schedule(() -> {
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
String valid = (String) redisService.get(RedisKeyConstant.getVenueSubscribeKey(placeName)); String valid = (String) redisService.get(RedisKeyConstant.getVenueSubscribeKey(placeName));
if (StringUtils.isNotBlank(valid)) { if (StringUtils.isNotBlank(valid)) {
break; break;
} }
boolean order = jtOrderService.createOrder(venueInfoDOList, user); boolean order = jtOrderService.createOrder(finalVenueInfoDOList, userTokenInfoDO);
if (order) { if (order) {
return; break;
} }
try { try {
Thread.sleep(1250); Thread.sleep(1250);
@@ -113,13 +142,10 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate {
log.error("睡眠失败~~~"); log.error("睡眠失败~~~");
} }
} }
// }, milliseconds, TimeUnit.MILLISECONDS);
} }
} catch (Exception e) {
// 关键点:异常只影响当前 user
log.error("createOrder 异常user={}", user.getId(), e);
return; // 结束这个 user不影响其他 user
} }
});
taskResult.setSuccess(true); taskResult.setSuccess(true);
taskResult.setSummary("下单执行成功!"); taskResult.setSummary("下单执行成功!");
return taskResult; return taskResult;

View File

@@ -13,4 +13,6 @@ public interface IUserInfoService {
boolean delAll(); boolean delAll();
boolean batchSave(List<UserInfoDO> list); boolean batchSave(List<UserInfoDO> list);
List<UserInfoDO> selectAll();
} }

View File

@@ -29,4 +29,9 @@ public class UserInfoServiceImpl implements IUserInfoService {
public boolean batchSave(List<UserInfoDO> list) { public boolean batchSave(List<UserInfoDO> list) {
return userInfoManage.saveBatch(list); return userInfoManage.saveBatch(list);
} }
@Override
public List<UserInfoDO> selectAll() {
return userInfoManage.list();
}
} }

View File

@@ -4,12 +4,20 @@ import com.xiang.common.pojo.jntyzx.miniapp.pojo.VenueInfoDO;
import com.xiang.common.pojo.jntyzx.miniapp.resp.query.SitePositionList; import com.xiang.common.pojo.jntyzx.miniapp.resp.query.SitePositionList;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* @Author: xiang * @Author: xiang
* @Date: 2025-12-16 09:55 * @Date: 2025-12-16 09:55
*/ */
public class VenueInfoUtils { public class VenueInfoUtils {
public static boolean get11213VenueInfo4Mor(VenueInfoDO venueInfoDO) {
return StringUtils.equals(venueInfoDO.getSjName(), "11:00-12:00") || StringUtils.equals(venueInfoDO.getSjName(), "12:00-13:00");
}
public static boolean get123VenueInfo4Mor(VenueInfoDO venueInfoDO) { public static boolean get123VenueInfo4Mor(VenueInfoDO venueInfoDO) {
return StringUtils.equals(venueInfoDO.getSjName(), "13:00-14:00") || StringUtils.equals(venueInfoDO.getSjName(), "14:00-15:00"); return StringUtils.equals(venueInfoDO.getSjName(), "13:00-14:00") || StringUtils.equals(venueInfoDO.getSjName(), "14:00-15:00");
} }
@@ -44,4 +52,32 @@ public class VenueInfoUtils {
} }
return 5; return 5;
} }
public static List<VenueInfoDO> filterVenueList(String siteTimeName, List<VenueInfoDO> venueInfoDOS) {
if (StringUtils.equals(siteTimeName, "18:00")) {
return venueInfoDOS.stream().filter(VenueInfoUtils::get628VenueInfo).collect(Collectors.toList());
}
if (StringUtils.equals(siteTimeName, "20:00")) {
return venueInfoDOS.stream().filter(VenueInfoUtils::get8210VenueInfo).collect(Collectors.toList());
}
if (StringUtils.equals(siteTimeName, "12:00")) {
return venueInfoDOS.stream().filter(item -> Objects.equals(item.getSjName(), "12:00-13:00")).collect(Collectors.toList());
}
if (StringUtils.equals(siteTimeName, "13:00")) {
return venueInfoDOS.stream().filter(item -> Objects.equals(item.getSjName(), "13:00-14:00")).collect(Collectors.toList());
}
if (StringUtils.equals(siteTimeName, "14:00")) {
return venueInfoDOS.stream().filter(item -> Objects.equals(item.getSjName(), "14:00-15:00")).collect(Collectors.toList());
}
if (StringUtils.equals(siteTimeName, "15:00")) {
return venueInfoDOS.stream().filter(item -> Objects.equals(item.getSjName(), "15:00-16:00")).collect(Collectors.toList());
}
if (StringUtils.equals(siteTimeName, "16:00")) {
return venueInfoDOS.stream().filter(item -> Objects.equals(item.getSjName(), "16:00-17:00")).collect(Collectors.toList());
}
if (StringUtils.equals(siteTimeName, "17:00")) {
return venueInfoDOS.stream().filter(item -> Objects.equals(item.getSjName(), "17:00-18:00")).collect(Collectors.toList());
}
return null;
}
} }