From 322079079ffec1e07f34a58a38e2cf1bbd2581b2 Mon Sep 17 00:00:00 2001 From: xiang Date: Sun, 27 Jul 2025 00:27:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=8A=A8=E6=80=81=E8=B0=83=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++ .../fwd/schedule/FwdImportantMsgJob.java | 19 +++--- .../fwd/schedule/PullDataFromFWDJob.java | 3 + .../xservice/fwd/schedule/TicketGrabTask.java | 49 +++++++++++++++ .../fwd/server/FwdOuterController.java | 4 +- .../xservice/fwd/service/IPerformService.java | 2 +- .../fwd/service/impl/PerformServiceImpl.java | 63 ++++++++----------- 7 files changed, 98 insertions(+), 48 deletions(-) create mode 100644 script/src/main/java/com/xiang/xservice/fwd/schedule/TicketGrabTask.java diff --git a/pom.xml b/pom.xml index 7dfe569..6009ed6 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,12 @@ xservice-third-part 1.0-snapshot + + com.xiang + xservice-schedule-starter + 1.0-snapshot + + diff --git a/script/src/main/java/com/xiang/xservice/fwd/schedule/FwdImportantMsgJob.java b/script/src/main/java/com/xiang/xservice/fwd/schedule/FwdImportantMsgJob.java index 8430302..70606ce 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/schedule/FwdImportantMsgJob.java +++ b/script/src/main/java/com/xiang/xservice/fwd/schedule/FwdImportantMsgJob.java @@ -6,9 +6,12 @@ import com.xiang.xservice.basic.utils.DateUtils; import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService; import com.xiang.xservice.fwd.entity.pojo.FPerformConfig; import com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo; +import com.xiang.xservice.fwd.mapper.FwdAudienceConfigMapper; import com.xiang.xservice.fwd.mapper.FwdPerformConfigMapper; import com.xiang.xservice.fwd.mapper.FwdPerformProjectInfoMapper; +import com.xiang.xservice.fwd.mapper.FwdUserConfigMapper; import com.xiang.xservice.fwd.service.IPerformService; +import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController; import java.time.LocalDate; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -34,8 +38,11 @@ public class FwdImportantMsgJob { private final FwdPerformProjectInfoMapper performProjectInfoMapper; private final FwdPerformConfigMapper performConfigMapper; - private final IPerformService performService; + private final IDynamicTaskSchedulerService dynamicTaskSchedulerService; private final DingTalkService dingTalkService; + private final FwdUserConfigMapper fwdUserConfigMapper; + private final FwdAudienceConfigMapper fwdAudienceConfigMapper; + private final IPerformService iPerformService; @Value("${DingTalk.chatId}") private String chatId; @@ -70,17 +77,11 @@ public class FwdImportantMsgJob { StringBuilder msg = new StringBuilder("今日" + now + "演唱会门票预售信息:\n"); for (FPerformProjectInfo data : saleTodayData) { msg.append("演唱会名称:").append(data.getProjectName()).append("预售时间:").append(DateUtils.getDateTimeStr(data.getPreSaleTime())).append("\n"); + String taskId = UUID.randomUUID().toString(); + dynamicTaskSchedulerService.schedule(taskId, data.getPreSaleTime(), new TicketGrabTask(fwdUserConfigMapper, fwdAudienceConfigMapper, performConfigMapper, iPerformService)); } msg.append("请注意进行数据库配置的更改!"); dingTalkService.sendChatMessage(chatId, msg.toString()); log.info("【芬玩岛】演唱会预售定时任务结束!time:{}", System.currentTimeMillis()); } - - @Scheduled(cron = "0 0 12 * * ? ") - @PostMapping("/orderCreateJob") - public void orderCreateJob() throws Exception { - for (int i = 0; i < 3; i++) { - performService.createProjectOrder(1295746988L); - } - } } diff --git a/script/src/main/java/com/xiang/xservice/fwd/schedule/PullDataFromFWDJob.java b/script/src/main/java/com/xiang/xservice/fwd/schedule/PullDataFromFWDJob.java index 19c2e7f..dd1bd04 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/schedule/PullDataFromFWDJob.java +++ b/script/src/main/java/com/xiang/xservice/fwd/schedule/PullDataFromFWDJob.java @@ -275,6 +275,9 @@ public class PullDataFromFWDJob { } } + /** + * 每月拉取观影人数据更新 + */ @Scheduled(cron = "0 0 0 1 1/1 ? ") public void pullAudienceMemberInfo() { List availableUser = userConfigMapper.getAvailableUser(); diff --git a/script/src/main/java/com/xiang/xservice/fwd/schedule/TicketGrabTask.java b/script/src/main/java/com/xiang/xservice/fwd/schedule/TicketGrabTask.java new file mode 100644 index 0000000..da894f4 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/fwd/schedule/TicketGrabTask.java @@ -0,0 +1,49 @@ +package com.xiang.xservice.fwd.schedule; + +import com.xiang.xservice.fwd.entity.pojo.FAudienceConfig; +import com.xiang.xservice.fwd.entity.pojo.FPerformConfig; +import com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo; +import com.xiang.xservice.fwd.entity.pojo.FUserConfig; +import com.xiang.xservice.fwd.mapper.FwdAudienceConfigMapper; +import com.xiang.xservice.fwd.mapper.FwdPerformConfigMapper; +import com.xiang.xservice.fwd.mapper.FwdUserConfigMapper; +import com.xiang.xservice.fwd.service.IPerformService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class TicketGrabTask implements Runnable { + + private final FwdUserConfigMapper userConfigMapper; + private final FwdAudienceConfigMapper audienceConfigMapper; + private final FwdPerformConfigMapper performConfigMapper; + private final IPerformService performService; + + @Override + public void run() { + List availableUser = userConfigMapper.getAvailableUser(); + if (CollectionUtils.isEmpty(availableUser)) { + return; + } + for (FUserConfig userConfig : availableUser) { + List audiences = audienceConfigMapper.getAudienceByUserId(userConfig.getId()); + List availablePerform = performConfigMapper.getAvailablePerform(); + if (CollectionUtils.isNotEmpty(availablePerform)) { + for (FPerformConfig performConfig : availablePerform) { + try { + performService.createProjectOrder(performConfig.getProjectId(), audiences.stream().map(FAudienceConfig::getFrequentId).collect(Collectors.toList())); + } catch (Exception e) { + log.error("创建订单失败", e); + } + } + } + } + } +} diff --git a/script/src/main/java/com/xiang/xservice/fwd/server/FwdOuterController.java b/script/src/main/java/com/xiang/xservice/fwd/server/FwdOuterController.java index f812151..15035aa 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/server/FwdOuterController.java +++ b/script/src/main/java/com/xiang/xservice/fwd/server/FwdOuterController.java @@ -28,6 +28,8 @@ public class FwdOuterController { private final IPerformServiceHttp performServiceHttp; private final IPerformService performService; + private static final List FREQUENT_IDS = List.of(50438548L, 35320661L, 50436621L, 50442739L); + @GetMapping("/getShowProjects") public Result getShowProjects() { @@ -49,7 +51,7 @@ public class FwdOuterController { @PostMapping("/createOrder") public Result createOrder(Long projectId) throws Exception { - if (performService.createProjectOrder(projectId)) { + if (performService.createProjectOrder(projectId, FREQUENT_IDS)) { return Result.success("下单成功!"); } return Result.error("下单失败!"); diff --git a/script/src/main/java/com/xiang/xservice/fwd/service/IPerformService.java b/script/src/main/java/com/xiang/xservice/fwd/service/IPerformService.java index 0453b7c..8fb04ca 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/service/IPerformService.java +++ b/script/src/main/java/com/xiang/xservice/fwd/service/IPerformService.java @@ -15,5 +15,5 @@ public interface IPerformService { List getPerformSeatInfoByProjectId(Long projectId); - Boolean createProjectOrder(Long projectId) throws Exception; + Boolean createProjectOrder(Long projectId, List frequentIds) throws Exception; } diff --git a/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceImpl.java b/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceImpl.java index c5ec2ec..350fed9 100644 --- a/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceImpl.java +++ b/script/src/main/java/com/xiang/xservice/fwd/service/impl/PerformServiceImpl.java @@ -56,7 +56,7 @@ public class PerformServiceImpl implements IPerformService { } @Override - public Boolean createProjectOrder(Long projectId) throws Exception { + public Boolean createProjectOrder(Long projectId, List frequentIds) throws Exception { FPerformProjectInfo performByProjectId = getPerformByProjectId(projectId); if (Objects.isNull(performByProjectId)) { log.info("该projectId:{}暂无演出信息", projectId); @@ -67,42 +67,31 @@ public class PerformServiceImpl implements IPerformService { log.info("该projectId:{}暂无座位信息", projectId); return Boolean.FALSE; } - List availableUser = userConfigMapper.getAvailableUser(); - if (CollectionUtils.isEmpty(availableUser)) { - return Boolean.FALSE; - } - for (FUserConfig userConfig : availableUser) { - List audiences = audienceConfigMapper.getAudienceByUserId(userConfig.getId()); - if (CollectionUtils.isNotEmpty(audiences)) { - List frequentIds = audiences.stream().map(FAudienceConfig::getFrequentId).collect(Collectors.toList()); - for (FPerformSeatInfo fPerformSeatInfo : seatInfoByProjectId) { - if (1 == fPerformSeatInfo.getSoldOut()) { - continue; - } - ProjectOrderCreateReq projectOrderCreateReq = new ProjectOrderCreateReq(); - projectOrderCreateReq.setDeliveryType(1); - projectOrderCreateReq.setContactName("朱吉祥"); - projectOrderCreateReq.setContactPhone("15858717571"); - projectOrderCreateReq.setPayment(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(frequentIds.size())).setScale(2)); - projectOrderCreateReq.setTotalPrice(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(frequentIds.size())).setScale(2, BigDecimal.ROUND_HALF_UP)); - projectOrderCreateReq.setPerformId(fPerformSeatInfo.getPerformId()); - projectOrderCreateReq.setProjectId(projectId.toString()); - projectOrderCreateReq.setPrivilegeCodeList(new ArrayList<>()); - projectOrderCreateReq.setAudienceCount(frequentIds.size()); - projectOrderCreateReq.setFrequentIds(frequentIds); - projectOrderCreateReq.setSeatPlanIds(Collections.singletonList(fPerformSeatInfo.getSeatPlanId())); - projectOrderCreateReq.setBlackBox("0"); - projectOrderCreateReq.setCombineTicketVos(null); - projectOrderCreateReq.setOrdinaryTicketVos(null); - ProjectOrderCreateResp projectOrder = performServiceHttp.createProjectOrder(projectOrderCreateReq); - if (Objects.nonNull(projectOrder)) { - log.info("下单成功,订单信息:{}", JSONObject.toJSONString(projectOrder)); - String msg = "【芬玩岛】下单成功✅✅✅,演出名称:" + performByProjectId.getProjectName() + ",请在2分钟内完成付款!"; - dingTalkService.sendChatMessage(chatId, msg); - return Boolean.TRUE; - } - } - + for (FPerformSeatInfo fPerformSeatInfo : seatInfoByProjectId) { + if (1 == fPerformSeatInfo.getSoldOut()) { + continue; + } + ProjectOrderCreateReq projectOrderCreateReq = new ProjectOrderCreateReq(); + projectOrderCreateReq.setDeliveryType(1); + projectOrderCreateReq.setContactName("朱吉祥"); + projectOrderCreateReq.setContactPhone("15858717571"); + projectOrderCreateReq.setPayment(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(frequentIds.size())).setScale(2)); + projectOrderCreateReq.setTotalPrice(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(frequentIds.size())).setScale(2, BigDecimal.ROUND_HALF_UP)); + projectOrderCreateReq.setPerformId(fPerformSeatInfo.getPerformId()); + projectOrderCreateReq.setProjectId(projectId.toString()); + projectOrderCreateReq.setPrivilegeCodeList(new ArrayList<>()); + projectOrderCreateReq.setAudienceCount(frequentIds.size()); + projectOrderCreateReq.setFrequentIds(frequentIds); + projectOrderCreateReq.setSeatPlanIds(Collections.singletonList(fPerformSeatInfo.getSeatPlanId())); + projectOrderCreateReq.setBlackBox("0"); + projectOrderCreateReq.setCombineTicketVos(null); + projectOrderCreateReq.setOrdinaryTicketVos(null); + ProjectOrderCreateResp projectOrder = performServiceHttp.createProjectOrder(projectOrderCreateReq); + if (Objects.nonNull(projectOrder)) { + log.info("下单成功,订单信息:{}", JSONObject.toJSONString(projectOrder)); + String msg = "【芬玩岛】下单成功✅✅✅,演出名称:" + performByProjectId.getProjectName() + ",请在2分钟内完成付款!"; + dingTalkService.sendChatMessage(chatId, msg); + return Boolean.TRUE; } } return Boolean.FALSE;