| | |
| | | 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> |
| | |
| | | * @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; |
| | |
| | | @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(); |
| | | } |
| | | |
| | |
| | | * @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); |
| | | } |
| | | |
| | | } |