BonusGiveService.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package com.izouma.nineth.service;
  2. import com.izouma.nineth.domain.BonusGive;
  3. import com.izouma.nineth.domain.BonusGiveItem;
  4. import com.izouma.nineth.domain.DestroyRecord;
  5. import com.izouma.nineth.dto.PageQuery;
  6. import com.izouma.nineth.enums.BalanceType;
  7. import com.izouma.nineth.repo.BonusGiveItemRepo;
  8. import com.izouma.nineth.repo.BonusGiveRepo;
  9. import com.izouma.nineth.repo.DestroyRecordRepo;
  10. import com.izouma.nineth.utils.JpaUtils;
  11. import lombok.AllArgsConstructor;
  12. import org.springframework.data.domain.Page;
  13. import org.springframework.stereotype.Service;
  14. import javax.transaction.Transactional;
  15. import java.math.BigDecimal;
  16. import java.util.ArrayList;
  17. import java.util.List;
  18. import java.util.Objects;
  19. import java.util.regex.Matcher;
  20. import java.util.regex.Pattern;
  21. import java.util.stream.Collectors;
  22. @Service
  23. @AllArgsConstructor
  24. public class BonusGiveService {
  25. private BonusGiveRepo bonusGiveRepo;
  26. private BonusGiveItemRepo bonusGiveItemRepo;
  27. private DestroyRecordRepo destroyRecordRepo;
  28. private UserBalanceService userBalanceService;
  29. public Page<BonusGive> all(PageQuery pageQuery) {
  30. return bonusGiveRepo.findAll(JpaUtils.toSpecification(pageQuery, BonusGive.class), JpaUtils.toPageRequest(pageQuery));
  31. }
  32. public List<BonusGiveItem> preview(BonusGive bonusGive) {
  33. Objects.requireNonNull(bonusGive, "bonusGive is null");
  34. Objects.requireNonNull(bonusGive.getPattern(), "bonusGive.pattern is null");
  35. Objects.requireNonNull(bonusGive.getStartTime(), "bonusGive.startTime is null");
  36. Objects.requireNonNull(bonusGive.getEndTime(), "bonusGive.endTime is null");
  37. List<DestroyRecord> destroyRecords = destroyRecordRepo.findByCreatedAtBetween(bonusGive.getStartTime(), bonusGive.getEndTime());
  38. Pattern pattern = Pattern.compile(bonusGive.getPattern());
  39. List<Long> ids = new ArrayList<>();
  40. return destroyRecords.stream()
  41. .filter(destroyRecord -> {
  42. if (ids.contains(destroyRecord.getAssetId())) {
  43. return false;
  44. }
  45. ids.add(destroyRecord.getAssetId());
  46. Matcher matcher = pattern.matcher(destroyRecord.getName());
  47. return matcher.matches();
  48. })
  49. .map(destroyRecord -> BonusGiveItem.builder()
  50. .bonusGiveId(bonusGive.getId())
  51. .userId(destroyRecord.getUserId())
  52. .assetId(destroyRecord.getAssetId())
  53. .assetName(destroyRecord.getName())
  54. .bonus(bonusGive.getBonus())
  55. .destroyId(destroyRecord.getId())
  56. .destroyTime(destroyRecord.getCreatedAt())
  57. .build())
  58. .collect(Collectors.toList());
  59. }
  60. @Transactional
  61. public BonusGive save(BonusGive bonusGive) {
  62. List<BonusGiveItem> bonusGiveItems = preview(bonusGive);
  63. bonusGive.setAssetNum(bonusGiveItems.size());
  64. bonusGive.setTotalBonus(bonusGiveItems.stream().map(BonusGiveItem::getBonus)
  65. .reduce(BigDecimal.ZERO, BigDecimal::add));
  66. bonusGiveRepo.save(bonusGive);
  67. bonusGiveItems.forEach(bonusGiveItem -> bonusGiveItem.setBonusGiveId(bonusGive.getId()));
  68. bonusGiveItemRepo.saveAll(bonusGiveItems);
  69. for (BonusGiveItem bonusGiveItem : bonusGiveItems) {
  70. userBalanceService.modifyBalance(bonusGiveItem.getUserId(), bonusGiveItem.getBonus(), BalanceType.BONUS, null, false, null);
  71. }
  72. return bonusGive;
  73. }
  74. }