TimedTaskUtils.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package com.ydtech.modules.partner.utils;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.extra.spring.SpringUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.xxl.job.core.handler.annotation.XxlJob;
  7. import com.ydtech.modules.partner.dao.PartnerExpiredCommissionMapper;
  8. import com.ydtech.modules.partner.dao.PartnerPartnerAccountMapper;
  9. import com.ydtech.modules.partner.dao.PartnerPremiumDetailsMapper;
  10. import com.ydtech.modules.partner.dao.PartnerUserMapper;
  11. import com.ydtech.modules.partner.model.*;
  12. import com.ydtech.modules.partner.model.param.PartnerRuleEntity;
  13. import com.ydtech.modules.partner.service.PartnerLiftingRecordService;
  14. import com.ydtech.modules.partner.service.PartnerRuleService;
  15. import com.ydtech.utils.StringUtils;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.scheduling.annotation.Scheduled;
  20. import org.springframework.stereotype.Component;
  21. import java.math.BigDecimal;
  22. import java.text.ParseException;
  23. import java.text.SimpleDateFormat;
  24. import java.util.Date;
  25. import java.util.List;
  26. import java.util.Objects;
  27. import java.util.stream.Collectors;
  28. /**
  29. * 定时任务
  30. *
  31. * @author
  32. */
  33. @Slf4j
  34. @Component
  35. public class TimedTaskUtils {
  36. @Autowired
  37. private PartnerLiftingRecordService liftingRecordService;
  38. @Autowired
  39. private PartnerPartnerAccountMapper accountMapper;
  40. @Autowired
  41. private PartnerUserMapper partnerUserMapper;
  42. @Autowired
  43. private PartnerRuleService partnerRuleService;
  44. @Autowired
  45. private PartnerExpiredCommissionMapper expiredCommissionMapper;
  46. @Autowired
  47. private PartnerPremiumDetailsMapper premiumDetailsMapper;
  48. @Value("${partner.expireDays}")
  49. private Integer expireDays;
  50. /**
  51. * TODO 每天晚上 记录佣金过期记录
  52. */
  53. //@XxlJob("updateOrderDateNoon")
  54. @Scheduled(cron = "0 0 0 * * *")
  55. public void updateOrderDateNoon() {
  56. log.info("记录佣金过期定时任务开始执行:{}", expireDays);
  57. List<PartnerUser> partnerUserList = partnerUserMapper.queryExpiredRecords(expireDays);
  58. for (PartnerUser partnerUser : partnerUserList) {
  59. String date = PartnerDateUtils.timeExample(expireDays);
  60. LambdaQueryWrapper<PartnerPremiumDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  61. lambdaQueryWrapper.eq(PartnerPremiumDetails::getUserId, partnerUser.getUserId())
  62. .eq(PartnerPremiumDetails::getSource, partnerUser.getGrade())
  63. .eq(PartnerPremiumDetails::getAppStatus, 1)
  64. .between(PartnerPremiumDetails::getCreateTime,date+" 00:00:00",date+" 23:59:59");
  65. List<PartnerPremiumDetails> partnerPremiumDetails = premiumDetailsMapper.selectList(lambdaQueryWrapper);
  66. if (CollectionUtil.isNotEmpty(partnerPremiumDetails)){
  67. BigDecimal lockCommission = partnerPremiumDetails.stream().map(PartnerPremiumDetails::getExtractFee).reduce(BigDecimal.ZERO, BigDecimal::add);
  68. PartnerExpiredCommission commission = getExpiredUserCommission(partnerUser,lockCommission);
  69. expiredCommissionMapper.insert(commission);
  70. if (null != lockCommission){
  71. PartnerPartnerAccount account = accountMapper.selectOne(new LambdaQueryWrapper<>(PartnerPartnerAccount.class)
  72. .eq(PartnerPartnerAccount::getUserId, partnerUser.getUserId()).eq(PartnerPartnerAccount::getGrade, partnerUser.getGrade()));
  73. if (null == account) {
  74. continue;
  75. }
  76. if (null != lockCommission){
  77. account.setExpiredAmount(account.getExpiredAmount().add(lockCommission));
  78. accountMapper.updateById(account);
  79. }
  80. //更新单据状态
  81. for (PartnerPremiumDetails detail : partnerPremiumDetails) {
  82. detail.setAppStatus(2);
  83. premiumDetailsMapper.updateById(detail);
  84. }
  85. }
  86. }
  87. }
  88. }
  89. private static PartnerExpiredCommission getExpiredUserCommission(PartnerUser record, BigDecimal lockCommission) {
  90. PartnerExpiredCommission commission = new PartnerExpiredCommission();
  91. commission.setName(record.getName());
  92. commission.setMobile(record.getMobile());
  93. commission.setUserId(record.getUserId());
  94. commission.setDeptId(record.getDeptId());
  95. commission.setDeptName(record.getDeptName());
  96. commission.setGrade(String.valueOf(record.getGrade()));
  97. commission.setGradeAfter(String.valueOf(record.getGrade() + 1));
  98. commission.setLockCommission(null == lockCommission ? new BigDecimal("0") : lockCommission);
  99. commission.setDowngradeTime(record.getIdentityTime());
  100. commission.setExpiration(new Date());
  101. commission.setCreateTime(new Date());
  102. return commission;
  103. }
  104. private static PartnerExpiredCommission getExpiredCommission(PartnerLiftingRecord record, BigDecimal lockCommission) {
  105. PartnerExpiredCommission commission = new PartnerExpiredCommission();
  106. commission.setName(record.getName());
  107. commission.setMobile(record.getMobile());
  108. commission.setUserId(record.getUserId());
  109. commission.setDeptId(record.getDeptId());
  110. commission.setDeptName(record.getDeptName());
  111. commission.setGrade(record.getOriginalLevel());
  112. commission.setGradeAfter(record.getAfterChange());
  113. commission.setLockCommission(null == lockCommission ? new BigDecimal("0") : lockCommission);
  114. commission.setDowngradeTime(record.getCreateTime());
  115. commission.setExpiration(new Date());
  116. commission.setCreateTime(new Date());
  117. return commission;
  118. }
  119. /**
  120. * TODO: 更新降级考核时间
  121. */
  122. @Scheduled(cron = "0 0 0 * * *")
  123. public void checkCommissionExpireTime() {
  124. // TODO等级规则
  125. List<PartnerRuleEntity> partnerRuleEntities = partnerRuleService.queryAll();
  126. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  127. List<PartnerUser> partnerUsers = partnerUserMapper.queryDowngradedData();
  128. for (PartnerUser partnerUser : partnerUsers) {
  129. PartnerRuleEntity rule = getRule(String.valueOf(partnerUser.getGrade()), partnerRuleEntities);
  130. Integer khDays = rule.getKhDays();
  131. Date upgradeStartTime = getUpgradeStartTime(partnerUser);
  132. if (null == upgradeStartTime){
  133. continue;
  134. }
  135. System.out.println("开始时间:" + formatter.format(upgradeStartTime));
  136. // 生成结束时间
  137. Date upgradeEndTime = PartnerDateUtils.generateEndTime(upgradeStartTime, khDays);
  138. System.out.println("结束时间:" + formatter.format(upgradeEndTime));
  139. if (PartnerDateUtils.isSameDay(upgradeEndTime)){
  140. // TODO考核条件 不满足时需锁定
  141. ExpiredCommissionUtils commissionUtils = SpringUtil.getBean(ExpiredCommissionUtils.class);
  142. boolean checked = commissionUtils.checkUpgradeConditions(partnerUser);
  143. if (!checked){
  144. //TODO 不满足
  145. commissionUtils.generateLockRecords(partnerUser);
  146. }
  147. //TODO 更新考核周期
  148. partnerUserMapper.updateUpgradeCycleStartTime(partnerUser.getUserId(), PartnerDateUtils.addDaysToday(upgradeEndTime,1),partnerUser.getGrade());
  149. }
  150. }
  151. List<String> idList = partnerUsers.stream()
  152. .map(PartnerUser::getId)
  153. .collect(Collectors.toList());
  154. update(partnerRuleEntities,idList);
  155. }
  156. public void update(List<PartnerRuleEntity> partnerRuleEntities,List<String> idList){
  157. QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
  158. queryWrapper.eq("identity_status", 0);
  159. queryWrapper.in("grade", 2,3,4);
  160. queryWrapper.orderByDesc("create_time");
  161. queryWrapper.notIn("id", idList);
  162. List<PartnerUser> partnerUsers = partnerUserMapper.selectList(queryWrapper);
  163. for (PartnerUser filteredUser : partnerUsers) {
  164. PartnerRuleEntity rule = getRule(String.valueOf(filteredUser.getGrade()), partnerRuleEntities);
  165. Date upgradeStartTime = getUpgradeStartTime(filteredUser);
  166. if (null == upgradeStartTime){
  167. continue;
  168. }
  169. //TODO 更新考核周期
  170. updateUpgradeCycleTime(filteredUser,rule, upgradeStartTime);
  171. }
  172. }
  173. private Date getUpgradeStartTime(PartnerUser filteredUser){
  174. Date upgradeStartTime = partnerUserMapper.selectUpgradeStartTime(filteredUser.getUserId(), filteredUser.getGrade());
  175. if (upgradeStartTime == null) {
  176. partnerUserMapper.updateUpgradeStartTime(filteredUser.getUserId(), filteredUser.getGrade());
  177. }
  178. return partnerUserMapper.selectUpgradeStartTime(filteredUser.getUserId(), filteredUser.getGrade());
  179. }
  180. public void updateUpgradeCycleTime(PartnerUser partnerUser,PartnerRuleEntity rule,Date upgradeTime) {
  181. Integer khDays = rule.getKhDays();
  182. boolean today = false;
  183. while (!PartnerDateUtils.isWithinDays(upgradeTime, khDays)) {
  184. upgradeTime = PartnerDateUtils.addDaysToday(upgradeTime, khDays);
  185. today = true;
  186. }
  187. if (today){
  188. partnerUserMapper.updateExpiredTime(partnerUser.getUserId(),partnerUser.getGrade(),PartnerDateUtils.addDaysToday(upgradeTime, khDays));
  189. partnerUserMapper.updateUpgradeCycleStartTime(partnerUser.getUserId(), upgradeTime,partnerUser.getGrade());
  190. }
  191. }
  192. public PartnerRuleEntity getRule(String grade,List<PartnerRuleEntity> partnerRuleEntities) {
  193. return partnerRuleEntities.stream().filter(partnerRuleEntity -> StringUtils.equals(partnerRuleEntity.getGrade(), grade)).findAny().orElse(null);
  194. }
  195. }