package cn.iocoder.yudao.module.pay.service.wallet; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.pay.controller.admin.wallet.vo.transaction.PayWalletTransactionPageReqVO; import cn.iocoder.yudao.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO; import cn.iocoder.yudao.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionSummaryRespVO; import cn.iocoder.yudao.module.pay.convert.wallet.PayWalletTransactionConvert; import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletDO; import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletTransactionDO; import cn.iocoder.yudao.module.pay.dal.mysql.wallet.PayWalletTransactionMapper; import cn.iocoder.yudao.module.pay.dal.redis.no.PayNoRedisDAO; import cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum; import cn.iocoder.yudao.module.pay.service.wallet.bo.WalletTransactionCreateReqBO; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import static cn.iocoder.yudao.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO.TYPE_EXPENSE; import static cn.iocoder.yudao.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO.TYPE_INCOME; /** * 钱包流水 Service 实现类 * * @author jason */ @Service @Slf4j @Validated public class PayWalletTransactionServiceImpl implements PayWalletTransactionService { /** * 钱包流水的 no 前缀 */ private static final String WALLET_NO_PREFIX = "W"; @Resource private PayWalletService payWalletService; @Resource private PayWalletTransactionMapper payWalletTransactionMapper; @Resource private PayNoRedisDAO noRedisDAO; @Override public PageResult getWalletTransactionPage(Long userId, Integer userType, AppPayWalletTransactionPageReqVO pageVO) { PayWalletDO wallet = payWalletService.getOrCreateWallet(userId, userType); return payWalletTransactionMapper.selectPage(wallet.getId(), pageVO.getType(), pageVO, pageVO.getCreateTime()); } @Override public PageResult getWalletTransactionPage(PayWalletTransactionPageReqVO pageVO) { // 基于 userId + userType 查询钱包 if (pageVO.getWalletId() == null && ObjectUtil.isAllNotEmpty(pageVO.getUserId(), pageVO.getUserType())) { PayWalletDO wallet = payWalletService.getOrCreateWallet(pageVO.getUserId(), pageVO.getUserType()); if (wallet != null) { pageVO.setWalletId(wallet.getId()); } } // 查询分页 return payWalletTransactionMapper.selectPage(pageVO.getWalletId(), null, pageVO, null); } @Override public PayWalletTransactionDO createWalletTransaction(WalletTransactionCreateReqBO bo) { PayWalletTransactionDO transaction = PayWalletTransactionConvert.INSTANCE.convert(bo) .setNo(noRedisDAO.generate(WALLET_NO_PREFIX)); payWalletTransactionMapper.insert(transaction); return transaction; } @Override public PayWalletTransactionDO getWalletTransactionByNo(String no) { return payWalletTransactionMapper.selectByNo(no); } @Override public PayWalletTransactionDO getWalletTransaction(String bizId, PayWalletBizTypeEnum type) { return payWalletTransactionMapper.selectByBiz(bizId, type.getType()); } @Override public AppPayWalletTransactionSummaryRespVO getWalletTransactionSummary(Long userId, Integer userType, LocalDateTime[] createTime) { PayWalletDO wallet = payWalletService.getOrCreateWallet(userId, userType); return new AppPayWalletTransactionSummaryRespVO() .setTotalExpense(payWalletTransactionMapper.selectPriceSum(wallet.getId(), TYPE_EXPENSE, createTime)) .setTotalIncome(payWalletTransactionMapper.selectPriceSum(wallet.getId(), TYPE_INCOME, createTime)); } }