mitao
2024-08-14 8dceb015ec8bd9642297d757e73936af84f4aaf1
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderAuctionBondServiceImpl.java
@@ -3,21 +3,39 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.enums.AuctionOrderTypeEnum;
import com.ruoyi.common.core.enums.BondStatusEnum;
import com.ruoyi.common.core.enums.PaymentMethodEnum;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.order.domain.pojo.Paylog;
import com.ruoyi.order.domain.Paylog;
import com.ruoyi.order.mapper.OrderAuctionBondMapper;
import com.ruoyi.order.service.IOrderAuctionBondService;
import com.ruoyi.order.service.IPaylogService;
import com.ruoyi.order.util.OrderUtil;
import com.ruoyi.order.util.SinataUtil;
import com.ruoyi.system.api.domain.AuctionGoods;
import com.ruoyi.system.api.domain.AuctionSalesroom;
import com.ruoyi.system.api.domain.OrderAuctionBond;
import com.ruoyi.system.api.domain.dto.BondReturnDTO;
import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO;
import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO;
import com.ruoyi.system.api.domain.dto.RefundDTO;
import com.ruoyi.system.api.domain.vo.PayInfoVO;
import com.ruoyi.system.api.feignClient.AuctionClient;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
@@ -27,11 +45,9 @@
 * @author mitao
 * @since 2024-05-16
 */
@Slf4j
@Service
public class OrderAuctionBondServiceImpl extends ServiceImpl<OrderAuctionBondMapper, OrderAuctionBond> implements IOrderAuctionBondService {
    @Resource
    private IOrderAuctionBondService iOrderAuctionBondService;
    @Resource
    private IPaylogService iPaylogService;
@@ -39,36 +55,53 @@
    @Resource
    private PaylogServiceImpl   paylogServiceImpl;
    @Resource
    private AuctionClient auctionClient;
    @Override
    public R<T> getOrderAuctionBond(OrderAuctionBondDTO orderAuctionBondDTO) {
        log.info("getOrderAuctionBond:{}", orderAuctionBondDTO);
        LambdaQueryWrapper<OrderAuctionBond> wrapper = Wrappers.lambdaQuery();
        wrapper.notIn(OrderAuctionBond::getMemberId, orderAuctionBondDTO.getUserList());
        if (orderAuctionBondDTO.getUserList().size()>0){
            wrapper.notIn(OrderAuctionBond::getMemberId, orderAuctionBondDTO.getUserList());
        }
        wrapper.eq(OrderAuctionBond::getDelFlag, 0);
        wrapper.eq(OrderAuctionBond::getAuctionSalesroomId, orderAuctionBondDTO.getAuctionSalesroomId());
        List<OrderAuctionBond> orderAuctionBondList = iOrderAuctionBondService.list(wrapper);
        List<OrderAuctionBond> orderAuctionBondList = this.list(wrapper);
        for (OrderAuctionBond orderAuctionBond : orderAuctionBondList) {
            LambdaQueryWrapper<Paylog> wrapper1 = Wrappers.lambdaQuery();
            wrapper1.eq(Paylog::getOutTradeNo, orderAuctionBond.getOrderNo());
            wrapper1.last("limit 1");
            Paylog paylog = iPaylogService.getOne(wrapper1);
            if (paylog.getPayType() == 1) {//支付宝
                boolean bo = paylogServiceImpl.refundForAlipay(paylog.getOutTradeNo(), paylog.getTradeNo(), orderAuctionBond.getBond().doubleValue());
                if (!bo) {
                    return R.fail("支付宝退款失败!");
            log.info("paylog:{}", paylog);
            if (Objects.nonNull(paylog)) {
                if (paylog.getPayType() == 1) {// 支付宝
                    boolean bo = paylogServiceImpl.refundForAlipay(paylog.getOutTradeNo(),
                            paylog.getTradeNo(), orderAuctionBond.getBond().doubleValue());
                    if (!bo) {
                        return R.fail("支付宝退款失败!");
                    }
                } else {// 微信
                    String refundMoney = SinataUtil.doubleRetainTwo(paylog.getPayMoney() * 100d);
                    Integer refundFee = Integer.parseInt(
                            refundMoney.substring(0, refundMoney.length() - 3));
                    String money = SinataUtil.doubleRetainTwo(paylog.getPayMoney() * 100d);
                    Integer totalFee = Integer.parseInt(money.substring(0, money.length() - 3));
                    refundFee = Integer.parseInt(money.substring(0, money.length() - 3));
                    String refundNo = OrderUtil.getOrderNoForPrefix("R");
                    boolean bo = paylogServiceImpl.refundForWxpay(4, paylog.getTradeNo(),
                            paylog.getOutTradeNo(), refundNo, totalFee, refundFee, "2");
                    if (!bo) {
                        return R.fail("微信退款失败!");
                    }
                }
            } else {//微信
                String refundMoney = SinataUtil.doubleRetainTwo(orderAuctionBond.getBond().doubleValue() * 100d);
                Integer refundFee = Integer.parseInt(refundMoney.substring(0, refundMoney.length() - 3));
                String money = SinataUtil.doubleRetainTwo(paylog.getPayMoney() * 100d);
                Integer totalFee = Integer.parseInt(money.substring(0, money.length() - 3));
                boolean bo = paylogServiceImpl.refundForWxpay(1, paylog.getTradeNo(), paylog.getOutTradeNo(), orderAuctionBond.getOrderNo(), totalFee, refundFee, "2");
                if (!bo) {
                    return R.fail("微信退款失败!");
                }
                orderAuctionBond.setBoundStatus(BondStatusEnum.REFUNDED);
            }
        }
        this.updateBatchById(orderAuctionBondList);
        return R.ok();
    }
@@ -96,8 +129,146 @@
     * @param bondStatusEnum 保证金状态
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateOrderAuctionBondStatus(List<Long> ids, BondStatusEnum bondStatusEnum) {
        this.lambdaUpdate().set(OrderAuctionBond::getBoundStatus, bondStatusEnum)
                .in(OrderAuctionBond::getId, ids).update();
        for (Long id:ids){
            OrderAuctionBond byId = this.getById(id);
            byId.setBoundStatus(bondStatusEnum);
            this.updateById(byId);
        }
    }
    @Override
    public PayInfoVO SaveOrderAuctionBond(MemberAuctionSalesroomBondDTO memberAuctionSalesroomBondDTO) {
        PayInfoVO payInfoVO = new PayInfoVO();
        if (memberAuctionSalesroomBondDTO.getBondType() == 1) {
            AuctionGoods data = auctionClient.getauctionGoodsOne(memberAuctionSalesroomBondDTO, SecurityConstants.INNER).getData();
            if (data.getListingStatus().getCode()==1){
                throw new ServiceException("商品拍卖下线");
            }
            if (data.getBond()==null||data.getBond().intValue() == 0) {
                OrderAuctionBond orderAuctionBond = new OrderAuctionBond();
                orderAuctionBond.setOrderNo(OrderUtil.getOrderNoForPrefix("BO"));
                orderAuctionBond.setAuctionGoodsId(memberAuctionSalesroomBondDTO.getAuctionGoodsId());
                orderAuctionBond.setMemberId(memberAuctionSalesroomBondDTO.getMemberId());
                orderAuctionBond.setBond(data.getBond());
                orderAuctionBond.setBoundStatus(BondStatusEnum.PAID);
                orderAuctionBond.setBondType(AuctionOrderTypeEnum.REGULAR_ITEMS);
                this.save(orderAuctionBond);
                payInfoVO.setOrderNO(orderAuctionBond.getOrderNo());
                payInfoVO.setType(0);
                payInfoVO.setSubject("保证金");
                payInfoVO.setMemberId(memberAuctionSalesroomBondDTO.getMemberId());
                payInfoVO.setBody("保证金");
            } else {
                OrderAuctionBond orderAuctionBond = new OrderAuctionBond();
                orderAuctionBond.setOrderNo(OrderUtil.getOrderNoForPrefix("BO"));
                orderAuctionBond.setAuctionGoodsId(memberAuctionSalesroomBondDTO.getAuctionGoodsId());
                orderAuctionBond.setMemberId(memberAuctionSalesroomBondDTO.getMemberId());
                orderAuctionBond.setBond(data.getBond());
                orderAuctionBond.setOrderTimeSx(data.getEndTime());
                orderAuctionBond.setBoundStatus(BondStatusEnum.TO_PLAY);
                orderAuctionBond.setBondType(AuctionOrderTypeEnum.REGULAR_ITEMS);
                if (memberAuctionSalesroomBondDTO.getPaymentMethod() == 1) {
                    orderAuctionBond.setPaymentMethod(PaymentMethodEnum.WECHAT);
                } else {
                    orderAuctionBond.setPaymentMethod(PaymentMethodEnum.ALIPAY);
                }
                this.save(orderAuctionBond);
                payInfoVO.setOrderNO(orderAuctionBond.getOrderNo());
                if (memberAuctionSalesroomBondDTO.getPaymentMethod() == 1) {
                    payInfoVO.setType(2);
                } else {
                    payInfoVO.setType(1);
                }
                payInfoVO.setOrderNO(orderAuctionBond.getOrderNo());
                payInfoVO.setSubject("保证金");
                payInfoVO.setMemberId(memberAuctionSalesroomBondDTO.getMemberId());
                payInfoVO.setBody("保证金");
            }
        } else {
            AuctionSalesroom data = auctionClient.getauctionSalesroomOne(memberAuctionSalesroomBondDTO, SecurityConstants.INNER).getData();
            if (data.getBond()==null||data.getBond().intValue() == 0) {
                OrderAuctionBond orderAuctionBond = new OrderAuctionBond();
                orderAuctionBond.setOrderNo(OrderUtil.getOrderNoForPrefix("BO"));
                orderAuctionBond.setAuctionSalesroomId(memberAuctionSalesroomBondDTO.getAuctionSalesroomId());
                orderAuctionBond.setMemberId(memberAuctionSalesroomBondDTO.getMemberId());
                orderAuctionBond.setBond(data.getBond());
                orderAuctionBond.setBoundStatus(BondStatusEnum.PAID);
                orderAuctionBond.setBondType(AuctionOrderTypeEnum.AUCTION_ITEMS);
                this.save(orderAuctionBond);
                payInfoVO.setOrderNO(orderAuctionBond.getOrderNo());
                payInfoVO.setType(0);
                payInfoVO.setSubject("保证金");
                payInfoVO.setMemberId(memberAuctionSalesroomBondDTO.getMemberId());
                payInfoVO.setBody("保证金");
            } else {
                OrderAuctionBond orderAuctionBond = new OrderAuctionBond();
                orderAuctionBond.setOrderNo(OrderUtil.getOrderNoForPrefix("BO"));
                orderAuctionBond.setAuctionSalesroomId(memberAuctionSalesroomBondDTO.getAuctionSalesroomId());
                orderAuctionBond.setMemberId(memberAuctionSalesroomBondDTO.getMemberId());
                orderAuctionBond.setBond(data.getBond());
                orderAuctionBond.setBoundStatus(BondStatusEnum.TO_PLAY);
                orderAuctionBond.setBondType(AuctionOrderTypeEnum.AUCTION_ITEMS);
                if (memberAuctionSalesroomBondDTO.getPaymentMethod() == 1) {
                    orderAuctionBond.setPaymentMethod(PaymentMethodEnum.WECHAT);
                } else {
                    orderAuctionBond.setPaymentMethod(PaymentMethodEnum.ALIPAY);
                }
                this.save(orderAuctionBond);
                payInfoVO.setOrderNO(orderAuctionBond.getOrderNo());
                if (memberAuctionSalesroomBondDTO.getPaymentMethod() == 1) {
                    payInfoVO.setType(2);
                } else {
                    payInfoVO.setType(1);
                }
                payInfoVO.setOrderNO(orderAuctionBond.getOrderNo());
                payInfoVO.setSubject("保证金");
                payInfoVO.setMemberId(memberAuctionSalesroomBondDTO.getMemberId());
                payInfoVO.setBody("保证金");
            }
        }
        return payInfoVO;
    }
    @Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public void returnBondByAuctionGoodsId(BondReturnDTO bondReturnDTO) {
        Long id = bondReturnDTO.getId();
        List<OrderAuctionBond> list = this.lambdaQuery().eq(OrderAuctionBond::getAuctionGoodsId, id)
                .eq(OrderAuctionBond::getBoundStatus, BondStatusEnum.PAID).list();
        List<Long> memberIdList = bondReturnDTO.getMemberIdList();
        List<RefundDTO> refundDTOList = list.stream()
                .filter(r -> !memberIdList.contains(r.getMemberId())).map(item -> {
            RefundDTO refundDTO = new RefundDTO();
            refundDTO.setAmount(item.getBond());
            refundDTO.setOrderNo(item.getOrderNo());
            return refundDTO;
        }).collect(Collectors.toList());
        Map<String, Object> data = iPaylogService.refund(refundDTOList);
        // 处理退款返回结果
        List<String> successfulOrders = new ArrayList<>();
        List<String> failedOrders = new ArrayList<>();
        data.forEach((key, value) -> {
            if ((boolean) value) {
                successfulOrders.add(key);
            } else {
                failedOrders.add(key);
            }
        });
        log.info("订单号:{},退款失败", failedOrders);
        // 退款成功的订单修改状态
        List<OrderAuctionBond> collect = list.stream().map(bond -> {
            if (successfulOrders.contains(bond.getOrderNo())) {
                bond.setBoundStatus(BondStatusEnum.REFUNDED);
                return bond;
            }
            return null;
        }).filter(Objects::nonNull).collect(Collectors.toList());
        this.updateBatchById(collect);
    }
}