From 5bc0375793f9187e3d90b7ec6846ab4d8eac5f36 Mon Sep 17 00:00:00 2001 From: rentaiming <806181062@qq.com> Date: 星期五, 14 六月 2024 18:59:45 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java | 254 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 232 insertions(+), 22 deletions(-) diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java index 5b27bff..ceca2e9 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java @@ -7,9 +7,14 @@ import com.google.common.collect.Lists; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.constant.SecurityConstants; +import com.ruoyi.common.core.enums.AuctionOrderTypeEnum; +import com.ruoyi.common.core.enums.AuditStatusEnum; +import com.ruoyi.common.core.enums.BondStatusEnum; import com.ruoyi.common.core.enums.OrderFromEnum; import com.ruoyi.common.core.enums.OrderStatusEnum; import com.ruoyi.common.core.enums.PaymentMethodEnum; +import com.ruoyi.common.core.enums.RequestTypeEnum; +import com.ruoyi.common.core.enums.ReturnRequestStatusEnum; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.page.BeanUtils; @@ -17,17 +22,19 @@ import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.order.controller.management.dto.MgtMallOrderQuery; import com.ruoyi.order.controller.management.dto.MgtOrderConfirmShipmentDTO; -import com.ruoyi.order.controller.management.vo.MgtMallOrderVO; import com.ruoyi.order.controller.management.vo.MgtOrderReturnRequestVO; +import com.ruoyi.order.controller.management.vo.MgtOrderVO; import com.ruoyi.order.domain.OrderReturnRequest; import com.ruoyi.order.domain.Paylog; import com.ruoyi.order.mapper.OrderAuctionBondMapper; import com.ruoyi.order.mapper.OrderMapper; +import com.ruoyi.order.service.ILogisticsService; import com.ruoyi.order.service.IOrderReturnRequestService; import com.ruoyi.order.service.IOrderService; import com.ruoyi.order.service.IPaylogService; import com.ruoyi.order.util.OrderUtil; import com.ruoyi.order.util.SinataUtil; +import com.ruoyi.system.api.domain.AuctionSalesroom; import com.ruoyi.system.api.domain.CouponMember; import com.ruoyi.system.api.domain.CustomConfig; import com.ruoyi.system.api.domain.GoodsGroupPurchase; @@ -40,14 +47,17 @@ import com.ruoyi.system.api.domain.dto.CouponMemberDTO; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO; +import com.ruoyi.system.api.domain.dto.LogisticsDTO; import com.ruoyi.system.api.domain.dto.MemberDTO; import com.ruoyi.system.api.domain.dto.MemberOrderDTO; import com.ruoyi.system.api.domain.dto.MemberOrderListDTO; import com.ruoyi.system.api.domain.dto.OrderDTO; import com.ruoyi.system.api.domain.dto.updMembeOneDTO; +import com.ruoyi.system.api.domain.vo.Express100VO; import com.ruoyi.system.api.domain.vo.MemberOrderListVO; import com.ruoyi.system.api.domain.vo.MemberTiOrderVO; import com.ruoyi.system.api.domain.vo.OrderVO; +import com.ruoyi.system.api.feignClient.AuctionClient; import com.ruoyi.system.api.feignClient.GoodsSkuClient; import com.ruoyi.system.api.feignClient.MemberClient; import com.ruoyi.system.api.feignClient.PromotionClient; @@ -56,16 +66,15 @@ import java.time.LocalDateTime; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.annotation.Resource; - import lombok.Synchronized; -import org.apache.commons.beanutils.BeanUtils; -import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; @@ -110,6 +119,11 @@ @Resource private RedisService redisService; + @Resource + private ILogisticsService logisticsService; + + @Resource + private AuctionClient auctionClient; @Override public void saveOrderOne(OrderDTO OrderDTO) { @@ -680,8 +694,8 @@ * @return PageDTO<MgtMallOrderVO> */ @Override - public PageDTO<MgtMallOrderVO> getMallOrderPage(MgtMallOrderQuery query) { - PageDTO<MgtMallOrderVO> pageVO; + public PageDTO<MgtOrderVO> getOrderPage(MgtMallOrderQuery query) { + PageDTO<MgtOrderVO> pageVO; // 封装会员条件查询对象 MemberDTO memberDTO = null; Set<Long> memberIdSet = null; @@ -716,7 +730,64 @@ if (StringUtils.isEmpty(page.getRecords())) { pageVO = PageDTO.empty(page); } - pageVO = PageDTO.of(page, MgtMallOrderVO.class); + pageVO = PageDTO.of(page, MgtOrderVO.class); + if (query.getOrderFrom() == OrderFromEnum.AUCTION_ORDERS) { + List<MgtOrderVO> list = pageVO.getList(); + // 封装参数查询拍卖订单保证金 + Set<Long> orderIdSet = list.stream().map(MgtOrderVO::getId) + .collect(Collectors.toSet()); + List<OrderAuctionBond> auctionBondList = orderAuctionBondMapper.selectList( + Wrappers.lambdaQuery(OrderAuctionBond.class) + .in(OrderAuctionBond::getOrderId, orderIdSet) + .eq(OrderAuctionBond::getBoundStatus, + BondStatusEnum.PAID)); + Map<String, OrderAuctionBond> auctionSalesroomBondMap = auctionBondList.stream() + .filter(bond -> bond.getBondType() == AuctionOrderTypeEnum.AUCTION_ITEMS) + .collect(Collectors.toMap( + bond -> bond.getAuctionSalesroomId() + "-" + bond.getMemberId(), + Function.identity())); + Map<String, OrderAuctionBond> auctionSalesroomGoodsBondMap = auctionBondList.stream() + .filter(bond -> bond.getBondType() == AuctionOrderTypeEnum.REGULAR_ITEMS) + .collect(Collectors.toMap( + bond -> bond.getAuctionGoodsId() + "-" + bond.getMemberId(), + Function.identity())); + // 封装参数查询拍卖会 + Set<Long> auctionSalesroomGoodsIdSet = list.stream() + .filter(order -> order.getAuctionType() == AuctionOrderTypeEnum.AUCTION_ITEMS) + .map(MgtOrderVO::getGoodsSkuId).collect(Collectors.toSet()); + List<AuctionSalesroom> auctionSalesroomList = auctionClient.getAuctionSalesroomByIds( + auctionSalesroomGoodsIdSet, SecurityConstants.INNER) + .getData(); + Map<Long, String> salesroomMap = auctionSalesroomList.stream() + .collect(Collectors.toMap(AuctionSalesroom::getId, + AuctionSalesroom::getSalesroomName)); + list.forEach(order -> { + if (order.getAuctionType() == AuctionOrderTypeEnum.AUCTION_ITEMS) { + order.setSalesroomName( + StringUtils.isNotBlank(salesroomMap.get(order.getGoodsSkuId())) + ? salesroomMap.get(order.getGoodsSkuId()) : "无"); + order.setBoundStatus( + StringUtils.isNotNull(auctionSalesroomBondMap.get( + order.getGoodsSkuId() + "-" + order.getMemberId()) + .getBoundStatus()) + ? auctionSalesroomBondMap.get( + order.getGoodsSkuId() + "-" + order.getMemberId()) + .getBoundStatus() + : null); + } + if (order.getAuctionType() == AuctionOrderTypeEnum.REGULAR_ITEMS) { + order.setSalesroomName("无"); + order.setBoundStatus( + StringUtils.isNotNull(auctionSalesroomGoodsBondMap.get( + order.getGoodsSkuId() + "-" + order.getMemberId()) + .getBoundStatus()) + ? auctionSalesroomGoodsBondMap.get( + order.getGoodsSkuId() + "-" + order.getMemberId()) + .getBoundStatus() + : null); + } + }); + } return pageVO; } @@ -727,15 +798,25 @@ * @return MgtMallOrderVO */ @Override - public MgtMallOrderVO getMallOrderDetail(Long id) { + public MgtOrderVO getOrderDetail(Long id) { Order order = this.getById(id); - MgtMallOrderVO mgtMallOrderVO = BeanUtils.copyBean(order, MgtMallOrderVO.class); + MgtOrderVO mgtOrderVO = BeanUtils.copyBean(order, MgtOrderVO.class); // 查询用户信息 Member member = memberClient.getMembeOne(order.getMemberId(), SecurityConstants.INNER) .getData(); if (StringUtils.isNotNull(member)) { - mgtMallOrderVO.setNickname(member.getNickname()); - mgtMallOrderVO.setPhone(member.getPhone()); + mgtOrderVO.setNickname(member.getNickname()); + mgtOrderVO.setPhone(member.getPhone()); + } + // 拍卖订单查询拍卖会信息 + if (order.getOrderFrom() == OrderFromEnum.AUCTION_ORDERS && (order.getAuctionType() + == AuctionOrderTypeEnum.AUCTION_ITEMS)) { + List<AuctionSalesroom> auctionSalesroom = auctionClient.getAuctionSalesroomByIds( + Lists.newArrayList(order.getGoodsSkuId()) + , SecurityConstants.INNER).getData(); + if (StringUtils.isNotNull(auctionSalesroom)) { + mgtOrderVO.setSalesroomName(auctionSalesroom.get(0).getSalesroomName()); + } } // 查询售后信息 if (order.getOrderStatus() == OrderStatusEnum.AFTER_SALE) { @@ -744,24 +825,43 @@ .eq(OrderReturnRequest::getOrderId, order.getId()).last("limit 1")); if (StringUtils.isNotNull(orderReturnRequest)) { - mgtMallOrderVO.setReturnRequestVO(BeanUtils.copyBean(orderReturnRequest, + mgtOrderVO.setReturnRequestVO(BeanUtils.copyBean(orderReturnRequest, MgtOrderReturnRequestVO.class)); } } - return mgtMallOrderVO; + // 如果订单状态为已发货、已完成、售后, 查询物流信息 + if (order.getOrderStatus() == OrderStatusEnum.GOODS_TO_BE_RECEIVED + || order.getOrderStatus() == OrderStatusEnum.FINISHED + || order.getOrderStatus() == OrderStatusEnum.AFTER_SALE) { + LogisticsDTO logisticsDTO = new LogisticsDTO(); + logisticsDTO.setCompany(order.getLogisticsNum()); + logisticsDTO.setPostid(order.getCourierNumber()); + Express100VO logisticsList = logisticsService.getLogisticsList(logisticsDTO); + if (StringUtils.isNotNull(logisticsList)) { + mgtOrderVO.setExpress100VO(logisticsList); + } + } + if (order.getOrderFrom() == OrderFromEnum.SNAP_ORDERS) { + GoodsSeckill data = goodsSkuClient.getGoodsSeckillOne(order.getGoodsSkuId(), + SecurityConstants.INNER).getData(); + mgtOrderVO.setSeckillPrice(data.getSeckillPrice()); + } else if (order.getOrderFrom() == OrderFromEnum.GROUP_PURCHASE_ORDERS) { + GoodsGroupPurchase data = goodsSkuClient.getGoodsSeckiGoodsGroupPurchaseOne( + order.getGoodsSkuId(), + SecurityConstants.INNER).getData(); + mgtOrderVO.setGroupPurchasesPrice(data.getGroupPurchasePrice()); + } + return mgtOrderVO; } /** * 确认发货 * - * @param dto 确认收货请求对象 + * @param dto 确认发货请求对象 */ @Override public void confirmShipmentOrder(MgtOrderConfirmShipmentDTO dto) { - Order order = this.getById(dto.getId()); - if (StringUtils.isNull(order)) { - throw new ServiceException("订单不存在"); - } + Order order = getOrder(dto.getId()); order.setOrderStatus(OrderStatusEnum.GOODS_TO_BE_RECEIVED); order.setDeliveryTime(LocalDateTime.now()); order.setCourierNumber(dto.getCourierNumber()); @@ -776,14 +876,124 @@ */ @Override public void receivedGoods(Long id) { - Order order = this.getById(id); - if (StringUtils.isNull(order)) { - throw new ServiceException("订单不存在"); - } + Order order = getOrder(id); if (order.getOrderStatus() == OrderStatusEnum.GOODS_TO_BE_RECEIVED) { order.setOrderStatus(OrderStatusEnum.FINISHED); order.setReceiveTime(LocalDateTime.now()); this.updateById(order); } } + + /** + * 退款 + * + * @param id 订单id + */ + @Override + public void refund(Long id) { + Order order = getOrder(id); + String orderNo = order.getOrderNo(); + Paylog paylog = iPaylogService.lambdaQuery().eq(Paylog::getOutTradeNo, orderNo) + .last("limit 1").one(); + PaymentMethodEnum paymentMethod = order.getPaymentMethod(); + + if (StringUtils.isNotNull(paylog)) { + boolean result = handleRefund(paymentMethod, paylog, orderNo); + if (result) { + paylog.setState(3);// 已退款 + order.setOrderStatus(OrderStatusEnum.REFUNDED); + iPaylogService.updateById(paylog); + this.updateById(order); + } + OrderReturnRequest orderReturnRequest = new OrderReturnRequest(); + orderReturnRequest.setOrderId(id); + orderReturnRequest.setRequestTime(LocalDateTime.now()); + orderReturnRequest.setRequestType(RequestTypeEnum.REFUND); + orderReturnRequest.setRequestReason("管理后台退款"); + orderReturnRequest.setStatus(ReturnRequestStatusEnum.COMPLETED); + orderReturnRequest.setAuditStatus(AuditStatusEnum.PASSED); + orderReturnRequestService.save(orderReturnRequest); + } + } + + private boolean handleRefund(PaymentMethodEnum paymentMethod, Paylog paylog, String orderNo) { + boolean result = false; + if (paymentMethod == PaymentMethodEnum.WECHAT) { + String refundMoney = SinataUtil.doubleRetainTwo(paylog.getPayMoney() * 100D); + int 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)); + String regEx = "[^0-9]"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(orderNo); + String ma = m.replaceAll("").trim(); + result = paylogService.refundForWxpay(2, paylog.getTradeNo(), + paylog.getOutTradeNo(), "R" + ma, totalFee, refundFee, "4"); + } else if (paymentMethod == PaymentMethodEnum.ALIPAY) { + result = paylogService.refundForAlipay(paylog.getOutTradeNo(), paylog.getTradeNo(), + paylog.getPayMoney()); + + } + return result; + } + + /** + * 退款退货 + * + * @param id 订单id + */ + @Override + public void refundReturn(Long id) { + Order order = getOrder(id); + if (order.getOrderStatus() == OrderStatusEnum.TO_BE_SHIPPED + || order.getOrderStatus() == OrderStatusEnum.GOODS_TO_BE_RECEIVED + || order.getOrderStatus() == OrderStatusEnum.FINISHED) { + OrderReturnRequest orderReturnRequest = new OrderReturnRequest(); + order.setOrderStatus(OrderStatusEnum.AFTER_SALE); + this.updateById(order); + orderReturnRequest.setOrderId(id); + orderReturnRequest.setRequestTime(LocalDateTime.now()); + orderReturnRequest.setRequestType(RequestTypeEnum.REFUNDS_AND_RETURNS); + orderReturnRequest.setRequestReason("管理后台退款退货"); + orderReturnRequest.setStatus(ReturnRequestStatusEnum.TO_BE_RETURNED); + orderReturnRequest.setAuditStatus(AuditStatusEnum.PASSED); + orderReturnRequestService.save(orderReturnRequest); + } + + } + + private Order getOrder(Long id) { + Order order = this.getById(id); + if (StringUtils.isNull(order)) { + throw new ServiceException("订单不存在"); + } + return order; + } + + /** + * 拍卖订单退保证金 + * + * @param id 订单id + */ + @Override + public void refundBond(Long id) { + Order order = getOrder(id); + OrderAuctionBond orderAuctionBond = orderAuctionBondMapper.selectOne( + Wrappers.lambdaQuery(OrderAuctionBond.class) + .eq(OrderAuctionBond::getOrderId, id)); + Paylog paylog = iPaylogService.lambdaQuery() + .eq(Paylog::getOutTradeNo, orderAuctionBond.getOrderNo()) + .last("limit 1").one(); + PaymentMethodEnum paymentMethod = orderAuctionBond.getPaymentMethod(); + if (orderAuctionBond.getBoundStatus() == BondStatusEnum.PAID) { + boolean result = handleRefund(paymentMethod, paylog, orderAuctionBond.getOrderNo()); + if (result) { + paylog.setState(3);// 已退款 + orderAuctionBond.setBoundStatus(BondStatusEnum.REFUNDED); + iPaylogService.updateById(paylog); + this.updateById(order); + } + } + } } -- Gitblit v1.7.1