feat:动态调度
This commit is contained in:
6
pom.xml
6
pom.xml
@@ -37,6 +37,12 @@
|
|||||||
<artifactId>xservice-third-part</artifactId>
|
<artifactId>xservice-third-part</artifactId>
|
||||||
<version>1.0-snapshot</version>
|
<version>1.0-snapshot</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.xiang</groupId>
|
||||||
|
<artifactId>xservice-schedule-starter</artifactId>
|
||||||
|
<version>1.0-snapshot</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -6,9 +6,12 @@ import com.xiang.xservice.basic.utils.DateUtils;
|
|||||||
import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService;
|
import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService;
|
||||||
import com.xiang.xservice.fwd.entity.pojo.FPerformConfig;
|
import com.xiang.xservice.fwd.entity.pojo.FPerformConfig;
|
||||||
import com.xiang.xservice.fwd.entity.pojo.FPerformProjectInfo;
|
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.FwdPerformConfigMapper;
|
||||||
import com.xiang.xservice.fwd.mapper.FwdPerformProjectInfoMapper;
|
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.fwd.service.IPerformService;
|
||||||
|
import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
@@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,8 +38,11 @@ public class FwdImportantMsgJob {
|
|||||||
|
|
||||||
private final FwdPerformProjectInfoMapper performProjectInfoMapper;
|
private final FwdPerformProjectInfoMapper performProjectInfoMapper;
|
||||||
private final FwdPerformConfigMapper performConfigMapper;
|
private final FwdPerformConfigMapper performConfigMapper;
|
||||||
private final IPerformService performService;
|
private final IDynamicTaskSchedulerService dynamicTaskSchedulerService;
|
||||||
private final DingTalkService dingTalkService;
|
private final DingTalkService dingTalkService;
|
||||||
|
private final FwdUserConfigMapper fwdUserConfigMapper;
|
||||||
|
private final FwdAudienceConfigMapper fwdAudienceConfigMapper;
|
||||||
|
private final IPerformService iPerformService;
|
||||||
|
|
||||||
@Value("${DingTalk.chatId}")
|
@Value("${DingTalk.chatId}")
|
||||||
private String chatId;
|
private String chatId;
|
||||||
@@ -70,17 +77,11 @@ public class FwdImportantMsgJob {
|
|||||||
StringBuilder msg = new StringBuilder("今日" + now + "演唱会门票预售信息:\n");
|
StringBuilder msg = new StringBuilder("今日" + now + "演唱会门票预售信息:\n");
|
||||||
for (FPerformProjectInfo data : saleTodayData) {
|
for (FPerformProjectInfo data : saleTodayData) {
|
||||||
msg.append("演唱会名称:").append(data.getProjectName()).append("预售时间:").append(DateUtils.getDateTimeStr(data.getPreSaleTime())).append("\n");
|
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("请注意进行数据库配置的更改!");
|
msg.append("请注意进行数据库配置的更改!");
|
||||||
dingTalkService.sendChatMessage(chatId, msg.toString());
|
dingTalkService.sendChatMessage(chatId, msg.toString());
|
||||||
log.info("【芬玩岛】演唱会预售定时任务结束!time:{}", System.currentTimeMillis());
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -275,6 +275,9 @@ public class PullDataFromFWDJob {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每月拉取观影人数据更新
|
||||||
|
*/
|
||||||
@Scheduled(cron = "0 0 0 1 1/1 ? ")
|
@Scheduled(cron = "0 0 0 1 1/1 ? ")
|
||||||
public void pullAudienceMemberInfo() {
|
public void pullAudienceMemberInfo() {
|
||||||
List<FUserConfig> availableUser = userConfigMapper.getAvailableUser();
|
List<FUserConfig> availableUser = userConfigMapper.getAvailableUser();
|
||||||
|
|||||||
@@ -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<FUserConfig> availableUser = userConfigMapper.getAvailableUser();
|
||||||
|
if (CollectionUtils.isEmpty(availableUser)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (FUserConfig userConfig : availableUser) {
|
||||||
|
List<FAudienceConfig> audiences = audienceConfigMapper.getAudienceByUserId(userConfig.getId());
|
||||||
|
List<FPerformConfig> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,6 +28,8 @@ public class FwdOuterController {
|
|||||||
|
|
||||||
private final IPerformServiceHttp performServiceHttp;
|
private final IPerformServiceHttp performServiceHttp;
|
||||||
private final IPerformService performService;
|
private final IPerformService performService;
|
||||||
|
private static final List<Long> FREQUENT_IDS = List.of(50438548L, 35320661L, 50436621L, 50442739L);
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/getShowProjects")
|
@GetMapping("/getShowProjects")
|
||||||
public Result<ProjectsResp> getShowProjects() {
|
public Result<ProjectsResp> getShowProjects() {
|
||||||
@@ -49,7 +51,7 @@ public class FwdOuterController {
|
|||||||
|
|
||||||
@PostMapping("/createOrder")
|
@PostMapping("/createOrder")
|
||||||
public Result<Void> createOrder(Long projectId) throws Exception {
|
public Result<Void> createOrder(Long projectId) throws Exception {
|
||||||
if (performService.createProjectOrder(projectId)) {
|
if (performService.createProjectOrder(projectId, FREQUENT_IDS)) {
|
||||||
return Result.success("下单成功!");
|
return Result.success("下单成功!");
|
||||||
}
|
}
|
||||||
return Result.error("下单失败!");
|
return Result.error("下单失败!");
|
||||||
|
|||||||
@@ -15,5 +15,5 @@ public interface IPerformService {
|
|||||||
|
|
||||||
List<FPerformSeatInfo> getPerformSeatInfoByProjectId(Long projectId);
|
List<FPerformSeatInfo> getPerformSeatInfoByProjectId(Long projectId);
|
||||||
|
|
||||||
Boolean createProjectOrder(Long projectId) throws Exception;
|
Boolean createProjectOrder(Long projectId, List<Long> frequentIds) throws Exception;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public class PerformServiceImpl implements IPerformService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Boolean createProjectOrder(Long projectId) throws Exception {
|
public Boolean createProjectOrder(Long projectId, List<Long> frequentIds) throws Exception {
|
||||||
FPerformProjectInfo performByProjectId = getPerformByProjectId(projectId);
|
FPerformProjectInfo performByProjectId = getPerformByProjectId(projectId);
|
||||||
if (Objects.isNull(performByProjectId)) {
|
if (Objects.isNull(performByProjectId)) {
|
||||||
log.info("该projectId:{}暂无演出信息", projectId);
|
log.info("该projectId:{}暂无演出信息", projectId);
|
||||||
@@ -67,42 +67,31 @@ public class PerformServiceImpl implements IPerformService {
|
|||||||
log.info("该projectId:{}暂无座位信息", projectId);
|
log.info("该projectId:{}暂无座位信息", projectId);
|
||||||
return Boolean.FALSE;
|
return Boolean.FALSE;
|
||||||
}
|
}
|
||||||
List<FUserConfig> availableUser = userConfigMapper.getAvailableUser();
|
for (FPerformSeatInfo fPerformSeatInfo : seatInfoByProjectId) {
|
||||||
if (CollectionUtils.isEmpty(availableUser)) {
|
if (1 == fPerformSeatInfo.getSoldOut()) {
|
||||||
return Boolean.FALSE;
|
continue;
|
||||||
}
|
}
|
||||||
for (FUserConfig userConfig : availableUser) {
|
ProjectOrderCreateReq projectOrderCreateReq = new ProjectOrderCreateReq();
|
||||||
List<FAudienceConfig> audiences = audienceConfigMapper.getAudienceByUserId(userConfig.getId());
|
projectOrderCreateReq.setDeliveryType(1);
|
||||||
if (CollectionUtils.isNotEmpty(audiences)) {
|
projectOrderCreateReq.setContactName("朱吉祥");
|
||||||
List<Long> frequentIds = audiences.stream().map(FAudienceConfig::getFrequentId).collect(Collectors.toList());
|
projectOrderCreateReq.setContactPhone("15858717571");
|
||||||
for (FPerformSeatInfo fPerformSeatInfo : seatInfoByProjectId) {
|
projectOrderCreateReq.setPayment(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(frequentIds.size())).setScale(2));
|
||||||
if (1 == fPerformSeatInfo.getSoldOut()) {
|
projectOrderCreateReq.setTotalPrice(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(frequentIds.size())).setScale(2, BigDecimal.ROUND_HALF_UP));
|
||||||
continue;
|
projectOrderCreateReq.setPerformId(fPerformSeatInfo.getPerformId());
|
||||||
}
|
projectOrderCreateReq.setProjectId(projectId.toString());
|
||||||
ProjectOrderCreateReq projectOrderCreateReq = new ProjectOrderCreateReq();
|
projectOrderCreateReq.setPrivilegeCodeList(new ArrayList<>());
|
||||||
projectOrderCreateReq.setDeliveryType(1);
|
projectOrderCreateReq.setAudienceCount(frequentIds.size());
|
||||||
projectOrderCreateReq.setContactName("朱吉祥");
|
projectOrderCreateReq.setFrequentIds(frequentIds);
|
||||||
projectOrderCreateReq.setContactPhone("15858717571");
|
projectOrderCreateReq.setSeatPlanIds(Collections.singletonList(fPerformSeatInfo.getSeatPlanId()));
|
||||||
projectOrderCreateReq.setPayment(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(frequentIds.size())).setScale(2));
|
projectOrderCreateReq.setBlackBox("0");
|
||||||
projectOrderCreateReq.setTotalPrice(fPerformSeatInfo.getPrice().multiply(BigDecimal.valueOf(frequentIds.size())).setScale(2, BigDecimal.ROUND_HALF_UP));
|
projectOrderCreateReq.setCombineTicketVos(null);
|
||||||
projectOrderCreateReq.setPerformId(fPerformSeatInfo.getPerformId());
|
projectOrderCreateReq.setOrdinaryTicketVos(null);
|
||||||
projectOrderCreateReq.setProjectId(projectId.toString());
|
ProjectOrderCreateResp projectOrder = performServiceHttp.createProjectOrder(projectOrderCreateReq);
|
||||||
projectOrderCreateReq.setPrivilegeCodeList(new ArrayList<>());
|
if (Objects.nonNull(projectOrder)) {
|
||||||
projectOrderCreateReq.setAudienceCount(frequentIds.size());
|
log.info("下单成功,订单信息:{}", JSONObject.toJSONString(projectOrder));
|
||||||
projectOrderCreateReq.setFrequentIds(frequentIds);
|
String msg = "【芬玩岛】下单成功✅✅✅,演出名称:" + performByProjectId.getProjectName() + ",请在2分钟内完成付款!";
|
||||||
projectOrderCreateReq.setSeatPlanIds(Collections.singletonList(fPerformSeatInfo.getSeatPlanId()));
|
dingTalkService.sendChatMessage(chatId, msg);
|
||||||
projectOrderCreateReq.setBlackBox("0");
|
return Boolean.TRUE;
|
||||||
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;
|
return Boolean.FALSE;
|
||||||
|
|||||||
Reference in New Issue
Block a user