feat:江体小程序
This commit is contained in:
@@ -14,7 +14,7 @@ public class RedisProperties {
|
||||
private String host;
|
||||
private String port;
|
||||
private String password;
|
||||
private Integer database = 0;
|
||||
private Integer database;
|
||||
|
||||
public String getAddress() {
|
||||
return "redis://" + host + ":" + port;
|
||||
|
||||
@@ -19,6 +19,7 @@ public class JntyzxMiniappScheduleConfig {
|
||||
private final JtVenuePullTask jtVenuePullTask;
|
||||
private final JtVenueSubscribeTask jtVenueSubscribeTask;
|
||||
private final JtVenueTomorrowPullTask jtVenueTomorrowPullTask;
|
||||
private final JntyzxUserInfoConfigTask jntyzxUserInfoConfigTask;
|
||||
|
||||
|
||||
@Scheduled(cron = "0 20,50 * * * ?")
|
||||
@@ -27,7 +28,7 @@ public class JntyzxMiniappScheduleConfig {
|
||||
jtTokenRefreshTask.run();
|
||||
}
|
||||
|
||||
@Scheduled(cron = "0 0/1 10-18 * * ?")
|
||||
// @Scheduled(cron = "0 0/1 10-18 * * ?")
|
||||
@GetMapping("/jtVenuePullTask")
|
||||
public void jtVenuePullTask() {
|
||||
jtVenuePullTask.run();
|
||||
@@ -42,7 +43,7 @@ public class JntyzxMiniappScheduleConfig {
|
||||
@Scheduled(cron = "0 40 8 * * ?")
|
||||
@GetMapping("/jtUserInfoConfig")
|
||||
public void jtUserInfoConfig() {
|
||||
|
||||
jntyzxUserInfoConfigTask.run();
|
||||
}
|
||||
|
||||
@Scheduled(cron = "5 0 9 * * ?")
|
||||
|
||||
@@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -66,12 +67,15 @@ public class JntyzxUserInfoConfigTask extends BaseScheduleTaskTemplate {
|
||||
protected TaskResult doExecute(Object validatedParams) throws Exception {
|
||||
TaskResult taskResult = new TaskResult();
|
||||
taskResult.setSuccess(false);
|
||||
List<VenueInfoDO> venueInfoDOS = venueService.queryCanBuyVenue();
|
||||
List<VenueInfoDO> venueInfoDOS = venueService.queryTomorrowCanBuyVenue();
|
||||
if (CollectionUtils.isEmpty(venueInfoDOS)) {
|
||||
taskResult.setSummary("无可用场地");
|
||||
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)) {
|
||||
taskResult.setSummary("无可用场地");
|
||||
return taskResult;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package com.xiang.service.module.jntyzx.miniapp.schedule;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
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.pojo.jntyzx.miniapp.pojo.UserInfoDO;
|
||||
import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserTokenInfoDO;
|
||||
import com.xiang.common.pojo.jntyzx.miniapp.pojo.VenueInfoDO;
|
||||
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.utils.RedisService;
|
||||
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.IVenueService;
|
||||
import com.xiang.service.module.jntyzx.miniapp.utils.VenueInfoUtils;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.collections4.MapUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
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.Map;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@@ -37,6 +41,7 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate {
|
||||
private final IVenueService venueService;
|
||||
private final JntyzxDingTalkFactory jtDingTalkFactory;
|
||||
private final RedisService redisService;
|
||||
private final IUserInfoService userInfoService;
|
||||
|
||||
public JtVenueSubscribeTask(IScheduleOpeningConfigService scheduleOpeningConfigService,
|
||||
IScheduleRunLogService scheduleRunLogService,
|
||||
@@ -44,13 +49,15 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate {
|
||||
IJtOrderService jtOrderService,
|
||||
IVenueService venueService,
|
||||
JntyzxDingTalkFactory jtDingTalkFactory,
|
||||
RedisService redisService) {
|
||||
RedisService redisService,
|
||||
IUserInfoService userInfoService) {
|
||||
super(scheduleOpeningConfigService, scheduleRunLogService);
|
||||
this.userTokenInfoService = userTokenInfoService;
|
||||
this.jtOrderService = jtOrderService;
|
||||
this.venueService = venueService;
|
||||
this.jtDingTalkFactory = jtDingTalkFactory;
|
||||
this.redisService = redisService;
|
||||
this.userInfoService = userInfoService;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -81,31 +88,53 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate {
|
||||
taskResult.setSummary("无可下单用户");
|
||||
return taskResult;
|
||||
}
|
||||
Map<String, UserTokenInfoDO> userMap = users.stream().collect(Collectors.toMap(UserTokenInfoDO::getName, Function.identity(), (a, b) -> a));
|
||||
|
||||
List<VenueInfoDO> venueInfoDOS = venueService.queryTomorrowCanBuyVenue();
|
||||
Map<String, List<VenueInfoDO>> venueInfoMap = venueInfoDOS.stream()
|
||||
.filter(VenueInfoUtils::get8210VenueInfo)
|
||||
.filter(item -> !StringUtils.contains(item.getPlaceName(), "小馆"))
|
||||
.collect(Collectors.groupingByConcurrent(VenueInfoDO::getPlaceName));
|
||||
if (MapUtils.isEmpty(venueInfoMap)) {
|
||||
log.info("暂无可下单场地,time:{}", System.currentTimeMillis());
|
||||
taskResult.setSummary("无下单场地");
|
||||
|
||||
List<UserInfoDO> userInfoDOS = userInfoService.selectAll();
|
||||
if (CollectionUtils.isEmpty(userInfoDOS)) {
|
||||
log.info("暂无可下单用户, time:{}", System.currentTimeMillis());
|
||||
jtDingTalkFactory.sendMsg("暂无可下单用户配置信息, time:" + System.currentTimeMillis());
|
||||
taskResult.setSummary("无可下单用户配置信息");
|
||||
return taskResult;
|
||||
}
|
||||
|
||||
users.parallelStream().forEach(user -> {
|
||||
try {
|
||||
List<String> placeNameList = venueInfoMap.keySet().stream().sorted(Comparator.comparing(VenueInfoUtils::sortVenueInfo)).toList();
|
||||
log.info("场地排序后的集合:{}", JSON.toJSONString(placeNameList));
|
||||
for (String placeName : placeNameList) {
|
||||
List<VenueInfoDO> venueInfoDOList = venueInfoMap.get(placeName);
|
||||
|
||||
for (UserInfoDO userInfoDO : userInfoDOS) {
|
||||
if (venueInfoMap.containsKey(userInfoDO.getPlaceName()) && userMap.containsKey(userInfoDO.getName())) {
|
||||
UserTokenInfoDO userTokenInfoDO = userMap.get(userInfoDO.getName());
|
||||
List<VenueInfoDO> venueInfoDOList = venueInfoMap.get(userInfoDO.getPlaceName());
|
||||
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++) {
|
||||
String valid = (String) redisService.get(RedisKeyConstant.getVenueSubscribeKey(placeName));
|
||||
if (StringUtils.isNotBlank(valid)) {
|
||||
break;
|
||||
}
|
||||
boolean order = jtOrderService.createOrder(venueInfoDOList, user);
|
||||
boolean order = jtOrderService.createOrder(finalVenueInfoDOList, userTokenInfoDO);
|
||||
if (order) {
|
||||
return;
|
||||
break;
|
||||
}
|
||||
try {
|
||||
Thread.sleep(1250);
|
||||
@@ -113,13 +142,10 @@ public class JtVenueSubscribeTask extends BaseScheduleTaskTemplate {
|
||||
log.error("睡眠失败~~~");
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// 关键点:异常只影响当前 user
|
||||
log.error("createOrder 异常,user={}", user.getId(), e);
|
||||
return; // 结束这个 user,不影响其他 user
|
||||
// }, milliseconds, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
taskResult.setSuccess(true);
|
||||
taskResult.setSummary("下单执行成功!");
|
||||
return taskResult;
|
||||
|
||||
@@ -13,4 +13,6 @@ public interface IUserInfoService {
|
||||
boolean delAll();
|
||||
|
||||
boolean batchSave(List<UserInfoDO> list);
|
||||
|
||||
List<UserInfoDO> selectAll();
|
||||
}
|
||||
|
||||
@@ -29,4 +29,9 @@ public class UserInfoServiceImpl implements IUserInfoService {
|
||||
public boolean batchSave(List<UserInfoDO> list) {
|
||||
return userInfoManage.saveBatch(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserInfoDO> selectAll() {
|
||||
return userInfoManage.list();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,12 +4,20 @@ import com.xiang.common.pojo.jntyzx.miniapp.pojo.VenueInfoDO;
|
||||
import com.xiang.common.pojo.jntyzx.miniapp.resp.query.SitePositionList;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Author: xiang
|
||||
* @Date: 2025-12-16 09:55
|
||||
*/
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user