package cc.mrbird.febs; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.pay.model.RefundStatus; import cc.mrbird.febs.pay.util.FiuuRefundUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @Slf4j @SpringBootTest public class AgentTest { @Autowired private MallActivityMapper mallActivityMapper; @Autowired private MallRefundMapper mallRefundMapper; @Autowired private MallOrderInfoMapper mallOrderInfoMapper; @Autowired private MallOrderItemMapper mallOrderItemMapper; @Autowired private MallGoodsSkuMapper mallGoodsSkuMapper; @Autowired private MallGoodsMapper mallGoodsMapper; @Autowired private FiuuRefundUtil fiuuRefundUtil; @Autowired private IMallMoneyFlowService mallMoneyFlowService; @Test public void refundJob() { LambdaQueryWrapper mallOrderRefundLambdaQueryWrapper = new LambdaQueryWrapper<>(); mallOrderRefundLambdaQueryWrapper.eq(MallRefundEntity::getState, 3); mallOrderRefundLambdaQueryWrapper.eq(MallRefundEntity::getType, 1); List mallRefundEntities = mallRefundMapper.selectList(mallOrderRefundLambdaQueryWrapper); if(CollUtil.isEmpty(mallRefundEntities)){ return; } mallRefundEntities.forEach(mallRefundEntity -> { processRefund(mallRefundEntity); }); } private void processRefund(MallRefundEntity mallRefundEntity) { try { MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(mallRefundEntity.getOrderId()); MallOrderItem mallOrderItem = mallOrderItemMapper.selectById(mallRefundEntity.getItemId()); MallGoodsSku mallGoodsSku = mallGoodsSkuMapper.selectById(mallOrderItem.getSkuId()); String txnId = mallOrderInfo.getPayOrderNo(); RefundStatus status = fiuuRefundUtil.pollRefundStatus(txnId); switch (status.getStatus()) { case "success": updateOnSuccess(mallRefundEntity, mallOrderInfo, mallOrderItem, mallGoodsSku); break; case "rejected": updateOnRejected(mallRefundEntity, mallOrderItem); break; default: log.warn("未知状态:{}", status.getStatus()); } } catch (Exception e) { log.error("处理退款失败: {}", e.getMessage(), e); } } private void updateOnSuccess(MallRefundEntity mallRefundEntity, MallOrderInfo mallOrderInfo, MallOrderItem mallOrderItem, MallGoodsSku mallGoodsSku) { mallOrderItem.setState(3); mallOrderItemMapper.updateById(mallOrderItem); MallGoods mallGoods = mallGoodsMapper.selectById(mallOrderItem.getGoodsId()); mallGoods.setStock(mallGoods.getStock() + mallOrderItem.getCnt()); mallGoods.setVolume(mallGoods.getVolume() - mallOrderItem.getCnt()); mallGoodsMapper.updateById(mallGoods); mallGoodsSku.setStock(mallGoodsSku.getStock() + mallOrderItem.getCnt()); mallGoodsSku.setSkuVolume(mallGoodsSku.getSkuVolume() - mallOrderItem.getCnt()); mallGoodsSkuMapper.updateById(mallGoodsSku); mallRefundEntity.setState(1); mallRefundEntity.setUpdatedTime(DateUtil.date()); mallRefundMapper.updateById(mallRefundEntity); mallMoneyFlowService.addMoneyFlow( mallOrderInfo.getMemberId(), mallRefundEntity.getAmount(), MoneyFlowTypeEnum.WECHAT_REFUND.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.WECHAT.getValue(), "FIUU退款", 2); List mallOrderItemList = mallOrderItemMapper.selectListByNotInStateAndOrderId(3, mallRefundEntity.getOrderId()); if (CollUtil.isEmpty(mallOrderItemList)) { MallOrderInfo mallOrderRefund = mallOrderInfoMapper.selectById(mallRefundEntity.getOrderId()); mallOrderRefund.setStatus(6); mallOrderInfoMapper.updateById(mallOrderRefund); } } private void updateOnRejected(MallRefundEntity mallRefundEntity, MallOrderItem mallOrderItem) { mallOrderItem.setState(1); mallOrderItemMapper.updateById(mallOrderItem); mallRefundEntity.setState(2); mallRefundMapper.updateById(mallRefundEntity); } }