Scheduler.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package com.cyksj.task;
  2. import cn.hutool.core.date.DateField;
  3. import cn.hutool.core.date.DateTime;
  4. import cn.hutool.core.date.DateUtil;
  5. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6. import com.cyksj.common.exception.BusinessRuntimeException;
  7. import com.cyksj.common.util.Jsons;
  8. import com.cyksj.mapper.*;
  9. import com.cyksj.model.dto.WxMpTemplateData;
  10. import com.cyksj.model.dto.WxMpTemplateMessage;
  11. import com.cyksj.model.entity.*;
  12. import com.cyksj.service.order.OrderDonService;
  13. import com.cyksj.service.wechat.WeChatService;
  14. import lombok.RequiredArgsConstructor;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.scheduling.annotation.Scheduled;
  17. import org.springframework.stereotype.Component;
  18. import org.springframework.transaction.annotation.Transactional;
  19. import java.util.Date;
  20. import java.util.List;
  21. import static com.cyksj.common.constant.WeChatTemplateConst.EXPIRY_TEMPLATE;
  22. @Component
  23. @Slf4j
  24. @RequiredArgsConstructor
  25. public class Scheduler {
  26. private final GoodsDonMapper donMapper;
  27. private final GroupsMapper groupsMapper;
  28. private final OrderDonService orderDonService;
  29. private final GroupsRelationMapper groupsRelationMapper;
  30. private final UserMapper userMapper;
  31. private final GoodsDonSkuMapper skuMapper;
  32. private final WeChatService weChatService;
  33. private final AccountMapper accountMapper;
  34. private final CustomerServiceMapper customerServiceMapper;
  35. /**
  36. * 每5分钟清理过期账号
  37. */
  38. @Scheduled(cron = "0 0/5 * * * ?")
  39. @Transactional(rollbackFor = Throwable.class)
  40. public void clearExpiry() {
  41. DateTime now = new DateTime();
  42. List<GroupsRelation> expiryList = groupsRelationMapper.selectList(Wrappers.lambdaQuery(GroupsRelation.class).le(GroupsRelation::getExpiryTime, now));
  43. log.info("定时清理过期账号start ===> 数量:{}", expiryList.size());
  44. //过期账号清楚有效期
  45. expiryList.forEach(relation -> delRelation(relation));
  46. }
  47. @Scheduled(cron = "0 0 9 * * ?")
  48. public void expiryWxMsg() throws Exception {
  49. DateTime now = new DateTime();
  50. DateTime zero = DateUtil.offset(now, DateField.HOUR, -9);
  51. DateTime time = DateUtil.offset(zero, DateField.DAY_OF_MONTH, 5);
  52. List<GroupsRelation> groupsRelations = groupsRelationMapper.selectList(Wrappers.lambdaQuery(GroupsRelation.class).le(GroupsRelation::getExpiryTime, time));
  53. for (GroupsRelation relation : groupsRelations) {
  54. User user = userMapper.selectById(relation.getUserId());
  55. WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
  56. .setToUser(user.getOpenId())
  57. .setTemplateId(EXPIRY_TEMPLATE)
  58. .setUrl(" ");
  59. /**
  60. * 您的账号即将到期
  61. * 账号名称:Netflix账号
  62. * 平台:Netflix
  63. * 失效日期:5天后
  64. * 异常原因:账号即将到期
  65. * 请尽快续费,以免影响使用
  66. */
  67. GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
  68. GoodsDonSku donSku = skuMapper.selectById(groupsTrips.getSkuId());
  69. GoodsDon goodsDon = donMapper.selectById(donSku.getGoodsId());
  70. WxMpTemplateMessage.TemplateData data = templateMessage.getData();
  71. data.setFirst(new WxMpTemplateData("您的账号即将到期"));
  72. data.setKeyword1(new WxMpTemplateData(goodsDon.getTitle()));
  73. data.setKeyword2(new WxMpTemplateData(goodsDon.getTitle()));
  74. data.setKeyword3(new WxMpTemplateData(DateUtil.format(relation.getExpiryTime(), "yyyy-MM-dd HH:mm:ss")));
  75. data.setKeyword4(new WxMpTemplateData("账号即将到期"));
  76. data.setRemark(new WxMpTemplateData("请尽快续费,以免影响使用"));
  77. log.info("发送账号即将到期消息至用户:{}", user.getId());
  78. weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
  79. List<Account> accounts = accountMapper.selectList(Wrappers.lambdaQuery(Account.class).le(Account::getExpiryTime, time));
  80. List<CustomerService> customerServices = customerServiceMapper.selectList(null);
  81. if(!accounts.isEmpty()){
  82. for (CustomerService customerService : customerServices) {
  83. WxMpTemplateMessage manageMessage = new WxMpTemplateMessage()
  84. .setToUser(customerService.getOpenId())
  85. .setTemplateId(EXPIRY_TEMPLATE)
  86. .setUrl(" ");
  87. WxMpTemplateMessage.TemplateData data2 = manageMessage.getData();
  88. data2.setFirst(new WxMpTemplateData("您有" + accounts.size() + "个主账号即将到期"));
  89. data2.setKeyword1(new WxMpTemplateData("车队主账号"));
  90. data2.setKeyword2(new WxMpTemplateData("车队主账号"));
  91. data2.setKeyword3(new WxMpTemplateData("5天后"));
  92. data2.setKeyword4(new WxMpTemplateData("账号即将到期"));
  93. data2.setRemark(new WxMpTemplateData("请尽快登录后台-在账号管理中查看"));
  94. log.info("发送账号即将到期消息至客服:{}", customerService.getNickName());
  95. weChatService.sendTemplateMessage(weChatService.getAccessToken(),Jsons.toJson(manageMessage));
  96. }
  97. }
  98. }
  99. }
  100. private void delRelation(GroupsRelation relation) {
  101. Date expireTime = relation.getExpiryTime();
  102. relation.setStartTime(null);
  103. relation.setExpiryTime(null);
  104. relation.setUserId(0l);
  105. relation.setStatus(GroupsRelation.Status.none);
  106. relation.setIsHandle(false);
  107. relation.setRenewStatus(false);
  108. Integer success = groupsRelationMapper.updateExpiryTime(relation, expireTime);
  109. if (success == 1) {
  110. log.info("开始清除过期子账号,座位号:{}", relation.getId());
  111. int count = groupsMapper.incrAvailableNum(relation.getGroupsId());
  112. if (count == 0) {
  113. log.error("车位异常 groupId:{}", relation.getGroupsId());
  114. throw new BusinessRuntimeException("车位异常");
  115. }
  116. }
  117. }
  118. /**
  119. * 定时关闭订单
  120. */
  121. @Scheduled(cron = "0 0/5 * * * ?")
  122. public void closeOrder() {
  123. //获取为支付订单
  124. DateTime now = new DateTime();
  125. Date newDate = DateUtil.offset(now, DateField.MINUTE, -5);
  126. List<OrderDon> list = orderDonService.list(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getStatus, OrderDon.Status.noPayment).le(OrderDon::getCreatedTime,newDate));
  127. log.info("定时任务 关闭 订单数:{}",list.size());
  128. list.forEach((orderDon)->{
  129. orderDonService.closeOrder(orderDon.getId());
  130. });
  131. }
  132. }