NewPartsChangeSalesSchedule.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package com.gree.mall.manager.schedule;
  2. import cn.hutool.core.date.DateField;
  3. import cn.hutool.core.date.DateTime;
  4. import cn.hutool.core.date.DateUtil;
  5. import com.gree.mall.manager.constant.Constant;
  6. import com.gree.mall.manager.enums.IsEnum;
  7. import com.gree.mall.manager.enums.admin.AdminWebsitTypeEnum;
  8. import com.gree.mall.manager.enums.material.BuyPeopleEnum;
  9. import com.gree.mall.manager.enums.material.PartsPushFlagEnum;
  10. import com.gree.mall.manager.exception.RemoteServiceException;
  11. import com.gree.mall.manager.logic.material.manage.WebsitPartsSalesLogic;
  12. import com.gree.mall.manager.plus.entity.AdminWebsit;
  13. import com.gree.mall.manager.plus.entity.WebsitPartsChangeSalesExec;
  14. import com.gree.mall.manager.plus.entity.WebsitPartsRefundConfig;
  15. import com.gree.mall.manager.plus.entity.WebsitPartsSales;
  16. import com.gree.mall.manager.plus.service.AdminWebsitService;
  17. import com.gree.mall.manager.plus.service.WebsitPartsRefundConfigService;
  18. import com.gree.mall.manager.plus.service.WebsitPartsSalesService;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.springframework.beans.factory.annotation.Value;
  21. import org.springframework.integration.redis.util.RedisLockRegistry;
  22. import org.springframework.scheduling.annotation.Scheduled;
  23. import org.springframework.stereotype.Component;
  24. import javax.annotation.Resource;
  25. import java.util.Date;
  26. import java.util.List;
  27. import java.util.Map;
  28. import java.util.Objects;
  29. import java.util.concurrent.TimeUnit;
  30. import java.util.concurrent.locks.Lock;
  31. import java.util.function.Function;
  32. import java.util.stream.Collectors;
  33. @Component
  34. @Slf4j
  35. public class NewPartsChangeSalesSchedule {
  36. @Value("${spring.profiles.active}")
  37. private String profiles;
  38. @Resource
  39. AdminWebsitService adminWebsitService;
  40. @Resource
  41. WebsitPartsRefundConfigService websitPartsRefundConfigService;
  42. @Resource
  43. WebsitPartsSalesService websitPartsSalesService;
  44. @Resource
  45. WebsitPartsSalesLogic websitPartsSalesLogic;
  46. @Resource
  47. RedisLockRegistry redisLockRegistry;
  48. // @Scheduled(cron = "0 0 01 * * ?")
  49. @Scheduled(initialDelay = 5000, fixedDelay = 30000)
  50. private void newPartsToSalesTasks() throws InterruptedException {
  51. // if (profiles.equals("dev") || !DateUtil.formatDateTime(DateUtil.date()).contains(" 01:0")) {
  52. // return;
  53. // }
  54. Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.NEW_CHANGE + "add");
  55. if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
  56. throw new RemoteServiceException("获取转销售添加锁失败");
  57. }
  58. try {
  59. // 第一步 查询配件网点
  60. List<AdminWebsit> websitList = adminWebsitService.lambdaQuery()
  61. .isNotNull(AdminWebsit::getPartsWebsitId)
  62. .eq(AdminWebsit::getType, AdminWebsitTypeEnum.C.getKey())
  63. .list();
  64. final Map<String, List<AdminWebsit>> websitGroup = websitList.stream()
  65. .collect(Collectors.groupingBy(AdminWebsit::getCompanyWechatId));
  66. for (Map.Entry<String, List<AdminWebsit>> entry : websitGroup.entrySet()) {
  67. final String companyId = entry.getKey();
  68. List<AdminWebsit> shopList = entry.getValue();
  69. // 第二步 查询配件返还配置
  70. WebsitPartsRefundConfig oneConfig = websitPartsRefundConfigService.lambdaQuery()
  71. .eq(WebsitPartsRefundConfig::getCompanyWechatId, companyId)
  72. .eq(WebsitPartsRefundConfig::getIsDefault, IsEnum.Y.getValue())
  73. .one();
  74. List<WebsitPartsRefundConfig> partsConfigs = websitPartsRefundConfigService.lambdaQuery()
  75. .eq(WebsitPartsRefundConfig::getCompanyWechatId, companyId)
  76. .eq(WebsitPartsRefundConfig::getIsDefault, IsEnum.N.getValue())
  77. .list();
  78. // 分组网点
  79. Map<String, WebsitPartsRefundConfig> refundConfigMap = partsConfigs.stream()
  80. .collect(Collectors.toMap(WebsitPartsRefundConfig::getWebsitId, Function.identity()));
  81. DateTime curDate = DateUtil.beginOfDay(DateUtil.date());
  82. // 第三步 遍历查询已超期网点销售单
  83. for (AdminWebsit shop : shopList) {
  84. if (Objects.isNull(shop.getPartsWebsitAttr())) {
  85. // 未指定配件网点属性 false=外区 true内区
  86. continue;
  87. }
  88. WebsitPartsRefundConfig partsConfig = refundConfigMap.get(shop.getWebsitId());
  89. // 超期时间
  90. Integer expire;
  91. if (shop.getPartsWebsitAttr()) {
  92. // 内区天数
  93. expire = Objects.isNull(partsConfig) ? oneConfig.getNewRefundInner() : partsConfig.getNewRefundInner();
  94. } else {
  95. // 外区天数
  96. expire = Objects.isNull(partsConfig) ? oneConfig.getNewRefundOutside() : partsConfig.getNewRefundOutside();
  97. }
  98. if (Objects.isNull(expire) || expire.compareTo(1) < 0) {
  99. // 超期时间为空或少于1 不处理
  100. continue;
  101. }
  102. // 查询未转销售单
  103. List<WebsitPartsSales> salesOrders = websitPartsSalesService.lambdaQuery()
  104. .eq(WebsitPartsSales::getCompanyWechatId, companyId)
  105. .eq(WebsitPartsSales::getWebsitId, shop.getWebsitId())
  106. .eq(WebsitPartsSales::getBuyPeople, BuyPeopleEnum.WORKER.getKey())
  107. .eq(WebsitPartsSales::getPartsWebsitId, shop.getPartsWebsitId())
  108. .eq(WebsitPartsSales::getPushFlag, PartsPushFlagEnum.SALES.getKey())
  109. .list();
  110. // 遍历未转销售单
  111. for (WebsitPartsSales salesOrder : salesOrders) {
  112. // 算出销售单超时时间
  113. Date endTime = salesOrder.getEndTime();
  114. DateTime offsetDateTime = DateUtil.offset(endTime, DateField.DAY_OF_MONTH, expire);
  115. DateTime endOfDay = DateUtil.endOfDay(offsetDateTime);
  116. if (endOfDay.getTime() < curDate.getTime()) {
  117. // 销售单超时时间少于当前时间 pushFlag标志转为TRANS
  118. try {
  119. websitPartsSalesLogic.updatePartsSalesOrder(salesOrder);
  120. WebsitPartsChangeSalesExec partsChangeSalesExec = new WebsitPartsChangeSalesExec();
  121. partsChangeSalesExec.setExecTime(DateUtil.date())
  122. .setInfo("新件转销售作业处理成功,配件销售单:" + salesOrder.getId())
  123. .insert();
  124. } catch (Exception e) {
  125. WebsitPartsChangeSalesExec partsChangeSalesExec = new WebsitPartsChangeSalesExec();
  126. partsChangeSalesExec.setExecTime(DateUtil.date())
  127. .setInfo("新件转销售作业处理出错,配件销售单:" + salesOrder.getId())
  128. .insert();
  129. log.error("新件转销售作业处理出错,配件销售单:" + salesOrder.getId(), e);
  130. }
  131. }
  132. }
  133. }
  134. }
  135. } catch(Exception e) {
  136. log.error("【新件转销售处理】失败",e);
  137. throw e;
  138. } finally {
  139. obtain.unlock();
  140. }
  141. }
  142. }