liujie
2026-04-28 b7ace278c8486eb6299f6668f8d092fb859352ca
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
@@ -1,6 +1,7 @@
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;
@@ -13,6 +14,7 @@
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;
@@ -276,6 +278,13 @@
        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());
@@ -283,6 +292,28 @@
        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
@@ -318,6 +349,7 @@
        }
        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()
@@ -530,6 +562,26 @@
        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);