Scheduler.java 8.3 KB

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