| | |
| | | private static final Integer CODE_STATUS_UNBOUND = 1; |
| | | private static final Integer CODE_STATUS_BOUND = 2; |
| | | private static final Integer CODE_STATUS_INVALID = 3; |
| | | private static final Integer USE_RECORD_TYPE_EXCHANGE = 1; |
| | | private static final Integer USE_RECORD_TYPE_CONSUME = 2; |
| | | private static final Integer USE_RECORD_TYPE_REFUND = 3; |
| | | private static final DateTimeFormatter BATCH_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); |
| | | |
| | | @Resource |
| | |
| | | record.setDetailId(detail.getId()); |
| | | record.setOrderId(0L); |
| | | record.setUserId(userId); |
| | | fillUseRecordAmount(record, amount, detail.getGiftRatio()); |
| | | record.setRecordChangeType(1); |
| | | record.setChangeType(USE_RECORD_TYPE_EXCHANGE); |
| | | record.setUsedAmount(amount); |
| | | record.setGiftUsedAmount(defaultMoney(detail.getGiftAmount())); |
| | | useRecordMapper.insert(record); |
| | | refreshPackageStats(exchangePackage.getId()); |
| | | ExchangeCodeBindResultVO resultVO = new ExchangeCodeBindResultVO(); |
| | |
| | | Page<TExchangeCodeUseRecord> page = useRecordMapper.selectPage(Page.of(query.getPageCurr(), query.getPageSize()), |
| | | new QueryWrapper<TExchangeCodeUseRecord>() |
| | | .eq("user_id", query.getUserId()) |
| | | .eq(Objects.equals(query.getChangeType(), 1), "IFNULL(order_id, 0)", 0) |
| | | .gt(Objects.equals(query.getChangeType(), 2), "order_id", 0) |
| | | .eq(query.getChangeType() != null, "change_type", query.getChangeType()) |
| | | .orderByDesc("create_time")); |
| | | page.getRecords().forEach(this::fillUseRecordView); |
| | | return page; |
| | |
| | | record.setDetailId(detail.getId()); |
| | | record.setOrderId(dto.getOrderId()); |
| | | record.setUserId(dto.getUserId()); |
| | | fillUseRecordAmount(record, useAmount, detail.getGiftRatio()); |
| | | record.setRecordChangeType(2); |
| | | record.setChangeType(USE_RECORD_TYPE_CONSUME); |
| | | record.setUsedAmount(useAmount); |
| | | record.setGiftUsedAmount(calculateGiftUsedAmount(useAmount, detail)); |
| | | useRecordMapper.insert(record); |
| | | remainingNeed = remainingNeed.subtract(useAmount); |
| | | deductedAmount = deductedAmount.add(useAmount); |
| | | } |
| | | resultVO.setDeductedAmount(deductedAmount.setScale(2, RoundingMode.HALF_UP)); |
| | | return resultVO; |
| | | } |
| | | |
| | | private BigDecimal calculateGiftUsedAmount(BigDecimal useAmount, TExchangeCodeDetail detail) { |
| | | if (useAmount == null || detail == null || detail.getGiftRatio() == null) { |
| | | return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | return useAmount.multiply(detail.getGiftRatio()).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | private BigDecimal getDetailRemainAmount(TExchangeCodeDetail detail) { |
| | |
| | | return; |
| | | } |
| | | String batchNo = "PKG" + LocalDateTime.now().format(BATCH_FORMATTER); |
| | | TExchangeCodePackage exchangePackage = this.getById(packageId); |
| | | BigDecimal giftRatio = calculateGiftRatio(exchangePackage); |
| | | List<TExchangeCodePackageSpec> expandList = new ArrayList<>(); |
| | | for (TExchangeCodePackageSpec spec : specEntities) { |
| | | for (int i = 0; i < spec.getQuantity(); i++) { |
| | |
| | | detail.setCode(generateCode(packageId, i)); |
| | | detail.setPassword(generatePassword()); |
| | | detail.setStatus(CODE_STATUS_UNBOUND); |
| | | detail.setGiftRatio(giftRatio); |
| | | detail.setGiftAmount(calculateDetailGiftAmount(spec, giftRatio)); |
| | | detail.setBatchNo(batchNo); |
| | | codeDetailMapper.insert(detail); |
| | | } |
| | | } |
| | | |
| | | private BigDecimal calculateGiftRatio(TExchangeCodePackage exchangePackage) { |
| | | if (exchangePackage == null || exchangePackage.getTotalAmount() == null |
| | | || exchangePackage.getTotalAmount().compareTo(BigDecimal.ZERO) == 0) { |
| | | return BigDecimal.ZERO.setScale(6, RoundingMode.HALF_UP); |
| | | } |
| | | return defaultMoney(exchangePackage.getGiftAmount()) |
| | | .divide(exchangePackage.getTotalAmount(), 6, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | private BigDecimal calculateDetailGiftAmount(TExchangeCodePackageSpec spec, BigDecimal giftRatio) { |
| | | if (spec == null || spec.getAmount() == null || giftRatio == null) { |
| | | return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | return spec.getAmount().multiply(giftRatio).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | private void refreshPackageStats(Long packageId) { |
| | |
| | | record.setDateTime(record.getCreateTime()); |
| | | record.setChangeAmount(defaultMoney(record.getUsedAmount())); |
| | | record.setCurrentBalance(defaultMoney(record.getUsedAmount())); |
| | | record.setChangeType(record.getOrderId() == null || record.getOrderId() == 0 ? 1 : 2); |
| | | if (record.getChangeType() == null) { |
| | | record.setChangeType(record.getOrderId() == null || record.getOrderId() == 0 |
| | | ? USE_RECORD_TYPE_EXCHANGE : USE_RECORD_TYPE_CONSUME); |
| | | } |
| | | if (record.getDetailId() != null) { |
| | | TExchangeCodeDetail detail = codeDetailMapper.selectById(record.getDetailId()); |
| | | if (detail != null) { |