| | |
| | | package com.ruoyi.other.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.core.exception.ServiceException; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | |
| | | import com.ruoyi.other.api.dto.ExchangeCodeConsumeDTO; |
| | | import com.ruoyi.other.api.dto.ExchangeCodePackageSaveDTO; |
| | | import com.ruoyi.other.api.dto.ExchangeCodePackageSpecDTO; |
| | | import com.ruoyi.other.api.dto.ExchangeCodeUseRecordQuery; |
| | | import com.ruoyi.other.api.vo.ExchangeCodeBindResultVO; |
| | | import com.ruoyi.other.api.vo.ExchangeCodeConsumeResultVO; |
| | | import com.ruoyi.other.api.vo.ExchangeCodePackageDetailVO; |
| | |
| | | detail.setBindPhone(bindPhone); |
| | | detail.setBindTime(LocalDateTime.now()); |
| | | codeDetailMapper.updateById(detail); |
| | | BigDecimal amount = getDetailRemainAmount(detail); |
| | | TExchangeCodeUseRecord record = new TExchangeCodeUseRecord(); |
| | | record.setDetailId(detail.getId()); |
| | | record.setOrderId(0L); |
| | | record.setUserId(userId); |
| | | record.setUsedAmount(amount); |
| | | useRecordMapper.insert(record); |
| | | refreshPackageStats(exchangePackage.getId()); |
| | | ExchangeCodeBindResultVO resultVO = new ExchangeCodeBindResultVO(); |
| | | resultVO.setDetailId(detail.getId()); |
| | |
| | | resultVO.setPackageName(exchangePackage.getPackageName()); |
| | | resultVO.setBindPhone(bindPhone); |
| | | return resultVO; |
| | | } |
| | | |
| | | @Override |
| | | public Page<TExchangeCodeUseRecord> useRecordPage(ExchangeCodeUseRecordQuery query) { |
| | | 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) |
| | | .orderByDesc("create_time")); |
| | | page.getRecords().forEach(this::fillUseRecordView); |
| | | return page; |
| | | } |
| | | |
| | | @Override |
| | | public TExchangeCodeUseRecord useRecordDetail(Long id, Long userId) { |
| | | TExchangeCodeUseRecord record = useRecordMapper.selectOne(new QueryWrapper<TExchangeCodeUseRecord>() |
| | | .eq("id", id) |
| | | .eq("user_id", userId) |
| | | .last("limit 1")); |
| | | fillUseRecordView(record); |
| | | return record; |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | List<TExchangeCodeUseRecord> existingRecords = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>() |
| | | .eq("order_id", dto.getOrderId()) |
| | | .gt("order_id", 0) |
| | | .eq("del_flag", 0)); |
| | | if (!existingRecords.isEmpty()) { |
| | | BigDecimal deducted = existingRecords.stream() |
| | |
| | | return UUID.randomUUID().toString().replace("-", "").substring(0, 8).toUpperCase(); |
| | | } |
| | | |
| | | private void fillUseRecordView(TExchangeCodeUseRecord record) { |
| | | if (record == null) { |
| | | return; |
| | | } |
| | | record.setUid(String.valueOf(record.getId())); |
| | | 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.getDetailId() != null) { |
| | | TExchangeCodeDetail detail = codeDetailMapper.selectById(record.getDetailId()); |
| | | if (detail != null) { |
| | | record.setCode(detail.getCode()); |
| | | } |
| | | } |
| | | if (record.getOrderId() != null && record.getOrderId() > 0) { |
| | | record.setOrderCode(String.valueOf(record.getOrderId())); |
| | | } |
| | | } |
| | | |
| | | private BigDecimal defaultMoney(BigDecimal amount) { |
| | | return amount == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) |
| | | : amount.setScale(2, RoundingMode.HALF_UP); |