mitao
2024-06-13 464254ba0e542c22fac68c7512f06a9a8df34b28
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -5,16 +5,25 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.OrderFromEnum;
import com.ruoyi.common.core.enums.OrderStatusEnum;
import com.ruoyi.common.core.enums.PaymentMethodEnum;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.page.BeanUtils;
import com.ruoyi.common.core.utils.page.PageDTO;
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.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.IOrderReturnRequestService;
import com.ruoyi.order.service.IOrderService;
import com.ruoyi.order.service.IPaylogService;
import com.ruoyi.order.util.OrderUtil;
@@ -24,12 +33,14 @@
import com.ruoyi.system.api.domain.GoodsGroupPurchase;
import com.ruoyi.system.api.domain.GoodsSeckill;
import com.ruoyi.system.api.domain.GoodsSku;
import com.ruoyi.system.api.domain.Member;
import com.ruoyi.system.api.domain.MemberAddress;
import com.ruoyi.system.api.domain.Order;
import com.ruoyi.system.api.domain.OrderAuctionBond;
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.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;
@@ -45,10 +56,17 @@
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
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;
/**
@@ -82,6 +100,15 @@
    @Resource
    private SysUserClient sysUserClient;
    @Resource
    private IOrderReturnRequestService orderReturnRequestService;
    @Resource
    private RedissonClient redissonClient;
    @Resource
    private RedisService redisService;
    @Override
@@ -196,6 +223,7 @@
    }
    @Override
    @Synchronized
    public MemberTiOrderVO saveMemberOrder(MemberOrderDTO memberOrderDTO) {
        MemberTiOrderVO memberOrderVO=new MemberTiOrderVO();
@@ -242,8 +270,22 @@
            pice=goodsSku.getPrice();
        }
        if (memberOrderDTO.getOrderFrom()==2){
            order.setOrderFrom(OrderFromEnum.SNAP_ORDERS);
            GoodsSeckill data = goodsSkuClient.getGoodsSeckillOne(memberOrderDTO.getGoodsSkuId(), SecurityConstants.INNER).getData();
      /*      String goodsLock = "goods_lock_" + CacheConstants.SECKILL_GOODS + data.getId();
            RLock redissonLock = redissonClient.getLock(goodsLock);
            Integer surpNum = 0;
            try {
                redissonLock.lock(30, TimeUnit.SECONDS);
                surpNum = redisService.getCacheObject(CacheConstants.SECKILL_GOODS + data.getId());
                if (surpNum == null || surpNum < memberOrderDTO.getGoodsQuantity()) {
                    throw new ServiceException("商品已被抢完");
                }
            }catch (Exception e){
                throw new ServiceException("reids 出错");
            }*/
            order.setOrderFrom(OrderFromEnum.SNAP_ORDERS);
            GoodsSku goodsSku = goodsSkuClient.getGoodsSkuOne(data.getGoodsSkuId(), SecurityConstants.INNER).getData();
            memberOrderVO.setGoodsSkuId(memberOrderDTO.getGoodsSkuId());
            memberOrderVO.setPrice(goodsSku.getPrice());
@@ -264,7 +306,7 @@
            order.setSkuName(goodsSku.getSkuName());
            order.setPrice(data.getSeckillPrice());
            order.setCoverPic(goodsSku.getCoverPic());
            /*redisService.setCacheObject(CacheConstants.SECKILL_GOODS + data.getId(), surpNum - memberOrderDTO.getGoodsQuantity());*/
        }
        if (memberOrderDTO.getOrderFrom()==3){
            order.setOrderFrom(OrderFromEnum.GROUP_PURCHASE_ORDERS);
@@ -329,6 +371,8 @@
        memberOrderVO.setReceiverCity(order.getReceiverCity());
        memberOrderVO.setReceiverDetailAddress(order.getReceiverDetailAddress());
        memberOrderVO.setReceiverphone(order.getReceiverphone());
        Integer delayTime = 30;
        redisService.setCacheObject(CacheConstants.ORDER_AUTOMATIC_CANCEL + "-" + order.getId(), order.getId() , delayTime.longValue(), TimeUnit.MINUTES);
        return memberOrderVO;
    }
@@ -508,7 +552,7 @@
        Order order = baseMapper.selectById(memberOrderListDTO.getId());
        OrderVO orderVO=new OrderVO();
        try {
            BeanUtils.copyProperties(orderVO,order);
            orderVO = BeanUtils.copyBean(order, OrderVO.class);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
@@ -625,6 +669,121 @@
     */
    @Override
    public List<Order> getOrderByCouponIds(Collection<Long> couponIds) {
        return this.lambdaQuery().in(Order::getCouponId, couponIds).list();
        return this.lambdaQuery().in(Order::getCouponId, couponIds)
                .eq(Order::getOrderStatus, OrderStatusEnum.FINISHED).list();
    }
    /**
     * 商城订单分页列表
     *
     * @param query 商城订单查询对象
     * @return PageDTO<MgtMallOrderVO>
     */
    @Override
    public PageDTO<MgtMallOrderVO> getMallOrderPage(MgtMallOrderQuery query) {
        PageDTO<MgtMallOrderVO> pageVO;
        // 封装会员条件查询对象
        MemberDTO memberDTO = null;
        Set<Long> memberIdSet = null;
        Page<Order> page = new Page<>(query.getPageCurr(), query.getPageSize());
        if (StringUtils.isNotBlank(query.getNickname()) || StringUtils.isNotBlank(
                query.getPhone())) {
            memberDTO = new MemberDTO();
            memberDTO.setNickname(query.getNickname());
            memberDTO.setPhone(query.getPhone());
        }
        if (StringUtils.isNotNull(memberDTO)) {
            // 远程调用会员服务进行条件查询
            List<Member> memberList = memberClient.getMemberListByCondition(memberDTO,
                    SecurityConstants.INNER).getData();
            if (StringUtils.isEmpty(memberList)) {
                return PageDTO.empty(page);
            }
            memberIdSet = memberList.stream().map(Member::getId)
                    .collect(Collectors.toSet());
        }
        page = this.lambdaQuery()
                .in(StringUtils.isNotEmpty(memberIdSet), Order::getMemberId, memberIdSet)
                .like(StringUtils.isNotBlank(query.getOrderNo()), Order::getOrderNo,
                        query.getOrderNo())
                .eq(StringUtils.isNotNull(query.getOrderFrom()), Order::getOrderFrom,
                        query.getOrderFrom())
                .like(StringUtils.isNotBlank(query.getSkuName()), Order::getSkuName,
                        query.getSkuName())
                .eq(StringUtils.isNotNull(query.getOrderStatus()), Order::getOrderStatus,
                        query.getOrderStatus())
                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
        if (StringUtils.isEmpty(page.getRecords())) {
            pageVO = PageDTO.empty(page);
        }
        pageVO = PageDTO.of(page, MgtMallOrderVO.class);
        return pageVO;
    }
    /**
     * 获取商城订单详情
     *
     * @param id 订单id
     * @return MgtMallOrderVO
     */
    @Override
    public MgtMallOrderVO getMallOrderDetail(Long id) {
        Order order = this.getById(id);
        MgtMallOrderVO mgtMallOrderVO = BeanUtils.copyBean(order, MgtMallOrderVO.class);
        // 查询用户信息
        Member member = memberClient.getMembeOne(order.getMemberId(), SecurityConstants.INNER)
                .getData();
        if (StringUtils.isNotNull(member)) {
            mgtMallOrderVO.setNickname(member.getNickname());
            mgtMallOrderVO.setPhone(member.getPhone());
        }
        // 查询售后信息
        if (order.getOrderStatus() == OrderStatusEnum.AFTER_SALE) {
            OrderReturnRequest orderReturnRequest = orderReturnRequestService.getOne(
                    Wrappers.lambdaQuery(OrderReturnRequest.class)
                            .eq(OrderReturnRequest::getOrderId,
                                    order.getId()).last("limit 1"));
            if (StringUtils.isNotNull(orderReturnRequest)) {
                mgtMallOrderVO.setReturnRequestVO(BeanUtils.copyBean(orderReturnRequest,
                        MgtOrderReturnRequestVO.class));
            }
        }
        return mgtMallOrderVO;
    }
    /**
     * 确认发货
     *
     * @param dto 确认收货请求对象
     */
    @Override
    public void confirmShipmentOrder(MgtOrderConfirmShipmentDTO dto) {
        Order order = this.getById(dto.getId());
        if (StringUtils.isNull(order)) {
            throw new ServiceException("订单不存在");
        }
        order.setOrderStatus(OrderStatusEnum.GOODS_TO_BE_RECEIVED);
        order.setDeliveryTime(LocalDateTime.now());
        order.setCourierNumber(dto.getCourierNumber());
        order.setLogisticsNum(dto.getLogisticsNum());
        this.updateById(order);
    }
    /**
     * 已收货
     *
     * @param id 订单id
     */
    @Override
    public void receivedGoods(Long id) {
        Order order = this.getById(id);
        if (StringUtils.isNull(order)) {
            throw new ServiceException("订单不存在");
        }
        if (order.getOrderStatus() == OrderStatusEnum.GOODS_TO_BE_RECEIVED) {
            order.setOrderStatus(OrderStatusEnum.FINISHED);
            order.setReceiveTime(LocalDateTime.now());
            this.updateById(order);
        }
    }
}