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<MallRefundEntity> mallOrderRefundLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
mallOrderRefundLambdaQueryWrapper.eq(MallRefundEntity::getState, 3);
|
mallOrderRefundLambdaQueryWrapper.eq(MallRefundEntity::getType, 1);
|
List<MallRefundEntity> 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<MallOrderItem> 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);
|
}
|
|
}
|