Scheduler.java 11 KB

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