jiangqs
2023-05-23 687dbd8e6ababc010a3da5503b95cd62cecf9f02
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -1,11 +1,43 @@
package com.ruoyi.order.service.impl.order;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.uuid.IdUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.order.domain.dto.*;
import com.ruoyi.order.domain.pojo.order.ConsumerGoods;
import com.ruoyi.order.domain.pojo.order.Order;
import com.ruoyi.order.domain.pojo.order.OrderGoods;
import com.ruoyi.order.domain.vo.*;
import com.ruoyi.order.service.order.ConsumerGoodsService;
import com.ruoyi.order.service.order.OrderGoodsService;
import com.ruoyi.order.util.CodeFactoryUtil;
import com.ruoyi.system.api.domain.dto.*;
import com.ruoyi.system.api.service.*;
import com.ruoyi.system.api.constant.AppErrorConstant;
import com.ruoyi.system.api.domain.poji.goods.Goods;
import com.ruoyi.system.api.domain.poji.goods.GoodsFile;
import com.ruoyi.system.api.domain.poji.goods.ShopGoods;
import com.ruoyi.system.api.domain.poji.member.Member;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import com.ruoyi.system.api.domain.poji.sys.SysUser;
import com.ruoyi.system.api.domain.vo.AppOrderTotalVo;
import com.ruoyi.system.api.domain.vo.AppUserCouponVo;
import com.ruoyi.order.mapper.order.OrderMapper;
import com.ruoyi.order.service.order.OrderService;
import com.ruoyi.system.api.domain.vo.MerHomeShopTotalVo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
 * <p>
@@ -18,4 +50,865 @@
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
    @Resource
    private OrderMapper orderMapper;
    @Resource
    private RemoteMemberService remoteMemberService;
    @Resource
    private OrderGoodsService orderGoodsService;
    @Resource
    private RemoteShopService remoteShopService;
    @Resource
    private RemoteUserService remoteUserService;
    @Resource
    private ConsumerGoodsService consumerGoodsService;
    @Resource
    private RemoteGoodsService remoteGoodsService;
    @Resource
    private RemoteShoppingCartService remoteShoppingCartService;
    /**
     * @description: buyGoods
     * @param: appSureOrderDto
     * @return: AppSureOrderVo
     * @author jqs34
     * @date: 2023/5/3 0:07
     */
    @Override
    public AppSureOrderVo buyGoods(AppSureOrderDto appSureOrderDto){
        Long userId = appSureOrderDto.getUserId();
        AppSureOrderVo appSureOrderVo = new AppSureOrderVo();
        List<AppSureOrderGoodsVo> appSureOrderGoodsVoList = new ArrayList<>();
        AppSureOrderGoodsVo appSureOrderGoodsVo;
        List<AppBuyGoodsDto> appBuyGoodsDtoList = appSureOrderDto.getAppBuyGoodsDtoList();
        String goodsId;
        Integer buyNum;
        BigDecimal buyNumBig;
        Long userCouponId;
        Goods goods;
        BigDecimal goodsPrice;
        BigDecimal goodsTotalPrice;
        BigDecimal goodsRealPrice;
        List<AppUserCouponVo> appUserCouponVoList = remoteMemberService.listVoUserCouponByUserId(userId).getData();
        List<AppUserCouponVo> appGoodsUserCouponVoList;
        Map<Long,AppUserCouponVo> appUserCouponVoMap = appUserCouponVoList.stream().collect(Collectors.toMap(AppUserCouponVo::getUserCouponId, Function.identity()));
        AppUserCouponVo appUserCouponVo;
        Integer couponType;
        BigDecimal moneyThreshold;
        BigDecimal discountMoney = new BigDecimal("0.00");
        BigDecimal discountPercent;
        BigDecimal goodsDeposit;
        GoodsFile goodsFile;
        Integer useCoupon;
        BigDecimal orderGoodsMoney = new BigDecimal("0.00");
        BigDecimal couponDiscount = new BigDecimal("0.00");
        BigDecimal orderPayDeposit = new BigDecimal("0.00");
        BigDecimal orderPayMoney = new BigDecimal("0.00");
        for(AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList){
            appSureOrderGoodsVo = new AppSureOrderGoodsVo();
            useCoupon = 0;
            goodsId = appBuyGoodsDto.getGoodsId();
            buyNum = appBuyGoodsDto.getBuyNum();
            userCouponId = appBuyGoodsDto.getUserCouponId();
            goods = remoteGoodsService.getGoods(goodsId).getData();
            appSureOrderGoodsVo.setGoodsId(goodsId);
            appSureOrderGoodsVo.setGoodsName(goods.getGoodsName());
            appSureOrderGoodsVo.setGoodsIntroduction(goods.getGoodsIntroduction());
            appSureOrderGoodsVo.setGoodsType(goods.getGoodsType());
            //商品图片
            goodsFile = remoteGoodsService.getGoodsFile(goodsId).getData();
            appSureOrderGoodsVo.setGoodsPicture(goodsFile.getFileUrl());
            buyNum = appBuyGoodsDto.getBuyNum();
            appSureOrderGoodsVo.setBuyNum(buyNum);
            goodsPrice = goods.getSalesPrice();
            //商户定制价格
            AppShopGoodsGetDto appShopGoodsGetDto = new AppShopGoodsGetDto();
            appShopGoodsGetDto.setGoodsId(goods.getGoodsId());
            appShopGoodsGetDto.setShopId(appSureOrderDto.getShopId());
            ShopGoods shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData();
            if(shopGoods!=null){
                goodsPrice = shopGoods.getSalesPrice();
            }
            appSureOrderGoodsVo.setGoodsPrice(goodsPrice);
            buyNumBig = BigDecimal.valueOf(buyNum);
            goodsTotalPrice = goodsPrice.multiply(buyNumBig);
            goodsRealPrice = goodsTotalPrice;
            if(userCouponId!=null){
                appUserCouponVo = appUserCouponVoMap.get(userCouponId);
                if(StringUtils.isBlank(appUserCouponVo.getRelGoodsIds()) || appUserCouponVo.getRelGoodsIds().contains(goodsId)){
                    couponType = appUserCouponVo.getCouponType();
                    if(couponType == 1 && appUserCouponVo.getMoneyThreshold()!=null && appUserCouponVo.getDiscountMoney()!=null){
                        moneyThreshold = appUserCouponVo.getMoneyThreshold();
                        if(goodsTotalPrice.compareTo(moneyThreshold)>=0){
                            discountMoney = appUserCouponVo.getDiscountMoney();
                            goodsRealPrice = goodsTotalPrice.subtract(discountMoney);
                            useCoupon = 1;
                        }
                    }else if(couponType == 2 && appUserCouponVo.getDiscountPercent()!=null){
                        discountPercent = appUserCouponVo.getDiscountPercent();
                        goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN).setScale(2,BigDecimal.ROUND_HALF_UP);
                        discountMoney = goodsRealPrice.subtract(goodsTotalPrice);
                        useCoupon = 1;
                    }else if(couponType == 3 && appUserCouponVo.getDiscountMoney()!=null){
                        discountMoney = appUserCouponVo.getDiscountMoney();
                        goodsRealPrice = goodsTotalPrice.subtract(discountMoney);
                        useCoupon = 1;
                    }
                }
            }
            appSureOrderGoodsVo.setUseCoupon(useCoupon);
            appSureOrderGoodsVo.setGoodsTotalPrice(goodsTotalPrice);
            appSureOrderGoodsVo.setCouponDiscount(discountMoney);
            appSureOrderGoodsVo.setGoodsRealPrice(goodsRealPrice);
            goodsDeposit = goods.getSubscription();
            if(goodsDeposit == null){
                goodsDeposit = new BigDecimal("0.00");
            }
            appSureOrderGoodsVo.setGoodsDeposit(goodsDeposit);
            orderGoodsMoney = orderGoodsMoney.add(goodsTotalPrice);
            couponDiscount = couponDiscount.add(discountMoney);
            orderPayDeposit = orderPayDeposit.add(goodsDeposit);
            orderPayMoney = orderPayMoney.add(goodsRealPrice);
            //商品关联优惠券
            appGoodsUserCouponVoList = new ArrayList<>();
            if(appUserCouponVoList!=null && !appUserCouponVoList.isEmpty()){
                for(AppUserCouponVo entity : appUserCouponVoList){
                    if(StringUtils.isBlank(entity.getRelGoodsIds())){
                        appGoodsUserCouponVoList.add(entity);
                    }else if(entity.getRelGoodsIds().contains(goodsId)){
                        appGoodsUserCouponVoList.add(entity);
                    }
                }
                appSureOrderGoodsVo.setAppUserCouponVoList(appGoodsUserCouponVoList);
            }
            appSureOrderGoodsVoList.add(appSureOrderGoodsVo);
        }
        appSureOrderVo.setOrderGoodsMoney(orderGoodsMoney);
        appSureOrderVo.setCouponDiscount(couponDiscount);
        appSureOrderVo.setOrderPayDeposit(orderPayDeposit);
        appSureOrderVo.setOrderPayMoney(orderPayMoney);
        appSureOrderVo.setAppSureOrderGoodsVoList(appSureOrderGoodsVoList);
        return appSureOrderVo;
    }
    /**
     * 创建订单
     * @param appPlaceOrderDto
     * @return
     */
    @Override
    public AppPlaceOrderVo placeOrder(AppPlaceOrderDto appPlaceOrderDto){
        Long userId = appPlaceOrderDto.getUserId();
        AppPlaceOrderVo appPlaceOrderVo = new AppPlaceOrderVo();
        List<AppSureOrderGoodsVo> appSureOrderGoodsVoList = new ArrayList<>();
        AppSureOrderGoodsVo appSureOrderGoodsVo;
        List<AppBuyGoodsDto> appBuyGoodsDtoList = appPlaceOrderDto.getAppBuyGoodsDtoList();
        String goodsId;
        Integer buyNum;
        BigDecimal buyNumBig;
        Integer serviceNum;
        Integer goodsNum = 0;
        Long userCouponId;
        Goods goods;
        BigDecimal goodsPrice;
        BigDecimal goodsTotalPrice;
        BigDecimal goodsRealPrice;
        List<AppUserCouponVo> appUserCouponVoList = remoteMemberService.listVoUserCouponByUserId(userId).getData();
        Map<Long,AppUserCouponVo> appUserCouponVoMap = appUserCouponVoList.stream().collect(Collectors.toMap(AppUserCouponVo::getUserCouponId, Function.identity()));
        AppUserCouponVo appUserCouponVo;
        Integer couponType;
        BigDecimal moneyThreshold;
        BigDecimal discountMoney = new BigDecimal("0.00");
        BigDecimal discountPercent;
        BigDecimal goodsDeposit;
        GoodsFile goodsFile;
        Integer useCoupon;
        BigDecimal orderGoodsMoney = new BigDecimal("0.00");
        BigDecimal couponDiscount = new BigDecimal("0.00");
        BigDecimal orderPayDeposit = new BigDecimal("0.00");
        BigDecimal orderPayMoney = new BigDecimal("0.00");
        String orderId = IdUtils.simpleUUID();
        String orderNo = CodeFactoryUtil.getShopOrderNo();
        OrderGoods orderGoods;
        String orderGoodsId;
        HashSet<String> goodsTypeSet = new HashSet<>();
        for(AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList){
            appSureOrderGoodsVo = new AppSureOrderGoodsVo();
            useCoupon = 0;
            goodsId = appBuyGoodsDto.getGoodsId();
            userCouponId = appBuyGoodsDto.getUserCouponId();
            goods = remoteGoodsService.getGoods(goodsId).getData();
            appSureOrderGoodsVo.setGoodsId(goodsId);
            appSureOrderGoodsVo.setGoodsName(goods.getGoodsName());
            appSureOrderGoodsVo.setGoodsIntroduction(goods.getGoodsIntroduction());
            appSureOrderGoodsVo.setGoodsType(goods.getGoodsType());
            //商品图片
            goodsFile = remoteGoodsService.getGoodsFile(goodsId).getData();
            appSureOrderGoodsVo.setGoodsPicture(goodsFile.getFileUrl());
            buyNum = appBuyGoodsDto.getBuyNum();
            appSureOrderGoodsVo.setBuyNum(buyNum);
            goodsPrice = goods.getSalesPrice();
            serviceNum = goods.getServiceNum();
            //商户定制价格
            AppShopGoodsGetDto appShopGoodsGetDto = new AppShopGoodsGetDto();
            appShopGoodsGetDto.setGoodsId(goods.getGoodsId());
            appShopGoodsGetDto.setShopId(appPlaceOrderDto.getShopId());
            ShopGoods shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData();
            if(shopGoods!=null){
                goodsPrice = shopGoods.getSalesPrice();
                serviceNum = shopGoods.getServiceNum();
            }
            appSureOrderGoodsVo.setGoodsPrice(goodsPrice);
            buyNumBig = BigDecimal.valueOf(buyNum);
            goodsTotalPrice = goodsPrice.multiply(buyNumBig);
            goodsRealPrice = goodsTotalPrice;
            if(userCouponId!=null){
                appUserCouponVo = appUserCouponVoMap.get(userCouponId);
                if(StringUtils.isBlank(appUserCouponVo.getRelGoodsIds()) || appUserCouponVo.getRelGoodsIds().contains(goodsId)){
                    couponType = appUserCouponVo.getCouponType();
                    if(couponType == 1 && appUserCouponVo.getMoneyThreshold()!=null && appUserCouponVo.getDiscountMoney()!=null){
                        moneyThreshold = appUserCouponVo.getMoneyThreshold();
                        if(goodsTotalPrice.compareTo(moneyThreshold)>=0){
                            discountMoney = appUserCouponVo.getDiscountMoney();
                            goodsRealPrice = goodsTotalPrice.subtract(discountMoney);
                            useCoupon = 1;
                        }
                    }else if(couponType == 2 && appUserCouponVo.getDiscountPercent()!=null){
                        discountPercent = appUserCouponVo.getDiscountPercent();
                        goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN).setScale(2,BigDecimal.ROUND_HALF_UP);
                        discountMoney = goodsRealPrice.subtract(goodsTotalPrice);
                        useCoupon = 1;
                    }else if(couponType == 3 && appUserCouponVo.getDiscountMoney()!=null){
                        discountMoney = appUserCouponVo.getDiscountMoney();
                        goodsRealPrice = goodsTotalPrice.subtract(discountMoney);
                        useCoupon = 1;
                    }
                }
            }
            appSureOrderGoodsVo.setUseCoupon(useCoupon);
            appSureOrderGoodsVo.setGoodsTotalPrice(goodsTotalPrice);
            appSureOrderGoodsVo.setCouponDiscount(discountMoney);
            appSureOrderGoodsVo.setGoodsRealPrice(goodsRealPrice);
            goodsDeposit = goods.getSubscription();
            if(goodsDeposit == null){
                goodsDeposit = new BigDecimal("0.00");
            }
            appSureOrderGoodsVo.setGoodsDeposit(goodsDeposit);
            goodsNum = goodsNum + buyNum;
            orderGoodsMoney = orderGoodsMoney.add(goodsTotalPrice);
            couponDiscount = couponDiscount.add(discountMoney);
            orderPayDeposit = orderPayDeposit.add(goodsDeposit);
            orderPayMoney = orderPayMoney.add(goodsRealPrice);
            //创建OrderGoods
            orderGoods = new OrderGoods();
            orderGoodsId = IdUtils.simpleUUID();
            orderGoods.setOrderGoodsId(orderGoodsId);
            orderGoods.setDelFlag(0);
            orderGoods.setOrderId(orderId);
            orderGoods.setGoodsId(goodsId);
            orderGoods.setBuyNum(buyNum);
            if(userCouponId!=null){
                orderGoods.setCouponId(userCouponId.toString());
            }
            orderGoods.setGoodsPrice(goodsPrice);
            orderGoods.setGoodsTotalMoney(orderGoodsMoney);
            orderGoods.setGoodsReceivableMoney(goodsRealPrice);
            orderGoods.setCycleNumFlag(goods.getCycleNumFlag());
            orderGoods.setServiceNum(serviceNum);
            orderGoods.setGoodsType(goods.getGoodsType());
            orderGoodsService.save(orderGoods);
            //清空购物车
            AppShoppingCartDelDto appShoppingCartDelDto = new AppShoppingCartDelDto();
            appShoppingCartDelDto.setGoodsId(goodsId);
            appShoppingCartDelDto.setUserId(userId);
            remoteShoppingCartService.deleteShoppingCart(appShoppingCartDelDto);
            if(goods.getGoodsType()==1){
                goodsTypeSet.add("周期");
            }else if(goods.getGoodsType()==2){
                goodsTypeSet.add("服务");
            }else if(goods.getGoodsType()==3){
                goodsTypeSet.add("体验");
            }else if(goods.getGoodsType()==4){
                goodsTypeSet.add("单品");
            }
        }
        Order order = new Order();
        order.setOrderId(orderId);
        order.setDelFlag(0);
        //为对接支付 直接付款成功
        order.setOrderStatus(2);
        order.setOrderNo(orderNo);
        order.setOrderFrom(1);
        order.setShopId(appPlaceOrderDto.getShopId());
        order.setUserId(userId);
        order.setOrderMoney(orderGoodsMoney);
        order.setCouponMoney(couponDiscount);
        order.setDiscountMoney(couponDiscount);
        order.setReceivableMoney(orderPayMoney);
        order.setReceivableDeposit(orderPayDeposit);
        order.setPayType(appPlaceOrderDto.getPayType());
        if(order.getPayType()==1){
            order.setPayMoney(orderPayMoney);
            order.setOnlinePayMoney(orderPayMoney);
            appPlaceOrderVo.setPayMoney(orderPayMoney);
            appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney()));
            order.setCloseFlag(1);
        }else if(order.getPayType()==2){
            order.setPayMoney(orderPayDeposit);
            order.setOnlinePayMoney(orderPayDeposit);
            appPlaceOrderVo.setPayMoney(orderPayDeposit);
            appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney()));
            order.setCloseFlag(0);
        }
        order.setOrderRemark(appPlaceOrderDto.getOrderRemark());
        order.setGoodsNum(goodsNum);
        order.setCreateTime(new Date());
        this.save(order);
        //更新用户商品类型
        if(goodsTypeSet!=null&&goodsTypeSet.size()>0){
            AppMemberGoodsTypeDto appMemberGoodsTypeDto = new AppMemberGoodsTypeDto();
            appMemberGoodsTypeDto.setUserId(userId);
            appMemberGoodsTypeDto.setGoodsTypeSet(goodsTypeSet);
            remoteMemberService.updateMemberGoodsType(appMemberGoodsTypeDto);
        }
        appPlaceOrderVo.setOrderId(orderId);
        appPlaceOrderVo.setOrderNo(orderNo);
        //调用支付
        return appPlaceOrderVo;
    }
    /**
     * 分页获取用户订单
     * @param page
     * @param appUserOrderPageDto
     * @return
     */
    @Override
    public List<AppUserOrderPageVo> pageUserOrder(Page page, AppUserOrderPageDto appUserOrderPageDto){
        List<AppUserOrderPageVo> appUserOrderPageVoList = orderMapper.pageUserOrder(page,appUserOrderPageDto);
        if(appUserOrderPageVoList!=null&&!appUserOrderPageVoList.isEmpty()){
            Long shopId;
            Shop shop;
            HashSet<Long> set=new HashSet<Long>();
            for(AppUserOrderPageVo appUserOrderPageVo : appUserOrderPageVoList){
                shopId = appUserOrderPageVo.getShopId();
                set.add(shopId);
            }
            Map<Long, Shop> shopMap = new HashMap<>();
            set.forEach(shopIdLong -> {
                Shop shopTemp = remoteShopService.getShop(shopIdLong).getData();
                shopMap.put(shopIdLong, shopTemp);
            });
            for(AppUserOrderPageVo appUserOrderPageVo : appUserOrderPageVoList){
                shop = shopMap.get(appUserOrderPageVo.getShopId());
                appUserOrderPageVo.setShopName(shop.getShopName());
                appUserOrderPageVo.setShopServicePhone(shop.getShopServicePhone());
                if(appUserOrderPageVo.getShopId().equals(appUserOrderPageDto.getShopId())){
                    appUserOrderPageVo.setSameShop(1);
                }else{
                    appUserOrderPageVo.setSameShop(0);
                }
                appUserOrderPageVo.setVerifyCode("1-"+appUserOrderPageVo.getOrderId());
            }
        }
        return appUserOrderPageVoList;
    }
    /**
     *
     * @param appBaseGetDto
     * @return
     */
    @Override
    public AppUserOrderGetVo getAppOrderDetail(AppBaseGetDto appBaseGetDto){
        String orderId = appBaseGetDto.getId();
        Order order = this.getById(orderId);
        List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listVoByOrderId(orderId);
        AppUserOrderGetVo appUserOrderGetVo = new AppUserOrderGetVo();
        appUserOrderGetVo.setOrderId(orderId);
        appUserOrderGetVo.setOrderNo(order.getOrderNo());
        appUserOrderGetVo.setOrderStatus(order.getOrderStatus());
        appUserOrderGetVo.setOrderFrom(order.getOrderFrom());
        appUserOrderGetVo.setOrderGoodsMoney(order.getOrderMoney());
        appUserOrderGetVo.setCouponDiscount(order.getCouponMoney());
        appUserOrderGetVo.setReceivableDeposit(order.getReceivableDeposit());
        appUserOrderGetVo.setReceivableMoney(order.getReceivableMoney());
        appUserOrderGetVo.setPayMoney(order.getPayMoney());
        appUserOrderGetVo.setOrderRemark(order.getOrderRemark());
        appUserOrderGetVo.setShopId(order.getShopId());
        appUserOrderGetVo.setCreateTime(order.getCreateTime());
        appUserOrderGetVo.setPayTime(order.getCreateTime());
        appUserOrderGetVo.setUseTime(order.getUseTime());
        appUserOrderGetVo.setCancelTime(order.getCancelTime());
        appUserOrderGetVo.setOrderRemark(order.getOrderRemark());
        Shop shop = remoteShopService.getShop(order.getShopId()).getData();
        appUserOrderGetVo.setShopName(shop.getShopName());
        appUserOrderGetVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList);
        appUserOrderGetVo.setVerifyCode("1-"+orderId);
        return appUserOrderGetVo;
    }
    /**
     * 取消订单
     * @param orderId
     */
    @Override
    public void cancelOrder(String orderId){
        Order order = this.getById(orderId);
        if(order.getOrderStatus()!=1){
            throw new ServiceException(AppErrorConstant.CANCEL_ERROR_ORDER);
        }
        order.setOrderStatus(0);
        order.setCancelTime(new Date());
        this.saveOrUpdate(order);
    }
    /**
     * 获取用户订单统计
     * @param userId
     * @return
     */
    @Override
    public AppOrderTotalVo getAppOrderTotal(Long userId) {
        LambdaQueryWrapper<Order> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Order::getDelFlag, 0).eq(Order::getUserId, userId).eq(Order::getOrderStatus, 1);
        Integer noPayCount = Integer.valueOf((int) this.count(queryWrapper));
        queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Order::getDelFlag, 0).eq(Order::getUserId, userId).eq(Order::getOrderStatus, 2);
        Integer noUseCount = Integer.valueOf((int) this.count(queryWrapper));
        AppOrderTotalVo appOrderTotalVo = new AppOrderTotalVo();
        appOrderTotalVo.setNoPayCount(noPayCount);
        appOrderTotalVo.setNoUseCount(noUseCount);
        return appOrderTotalVo;
    }
    /**
     * 获取B端首页统计
     * @param merHomeShopTotalVo
     * @return
     */
    @Override
    public MerHomeShopTotalVo getMerHomeTotal(MerHomeShopTotalVo merHomeShopTotalVo){
        Long shopId = merHomeShopTotalVo.getShopId();
        Integer todayShop = 0;
        Integer unHandleOrder = 0;
        BigDecimal shopTurnover = new BigDecimal("0.00");
        Integer cycleSurp = 0;
        Integer explorationSurp = 0;
        merHomeShopTotalVo.setTodayShop(todayShop);
        merHomeShopTotalVo.setUnHandleOrder(unHandleOrder);
        merHomeShopTotalVo.setShopTurnover(shopTurnover);
        merHomeShopTotalVo.setCycleSurp(cycleSurp);
        merHomeShopTotalVo.setExplorationSurp(explorationSurp);
        return merHomeShopTotalVo;
    }
    /**
     * 核销订单
     * @param orderId
     * @return
     */
    @Override
    public MerVerifyOrderVo verifyOrder(String orderId){
        MerVerifyOrderVo merVerifyOrderVo = new MerVerifyOrderVo();
        Order order = this.getById(orderId);
        List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listVoByOrderId(orderId);
        merVerifyOrderVo.setOrderId(orderId);
        merVerifyOrderVo.setOrderNo(order.getOrderNo());
        merVerifyOrderVo.setOrderStatus(order.getOrderStatus());
        merVerifyOrderVo.setOrderFrom(order.getOrderFrom());
        merVerifyOrderVo.setOrderGoodsMoney(order.getOrderMoney());
        merVerifyOrderVo.setCouponDiscount(order.getCouponMoney());
        merVerifyOrderVo.setReceivableDeposit(order.getReceivableDeposit());
        merVerifyOrderVo.setReceivableMoney(order.getReceivableMoney());
        merVerifyOrderVo.setPayMoney(order.getPayMoney());
        merVerifyOrderVo.setOrderRemark(order.getOrderRemark());
        merVerifyOrderVo.setCreateTime(order.getCreateTime());
        merVerifyOrderVo.setPayTime(order.getPayTime());
        merVerifyOrderVo.setUseTime(order.getUseTime());
        merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList);
        SysUser sysUser = remoteUserService.getSysUser(order.getUserId()).getData();
        merVerifyOrderVo.setUserName(sysUser.getNickName());
        merVerifyOrderVo.setUserMobile(sysUser.getPhonenumber());
        merVerifyOrderVo.setCloseFlag(order.getCloseFlag());
        return merVerifyOrderVo;
    }
    /**
     * 确认核销订单
     * @param merVerifyOrderDto
     * @return
     */
    @Override
    public MerVerifyOrderVo sureVerifyOrder(MerVerifyOrderDto merVerifyOrderDto){
        String orderId = merVerifyOrderDto.getOrderId();
        BigDecimal relReceiveMoney = merVerifyOrderDto.getRelReceiveMoney();
        BigDecimal relPayMoney = merVerifyOrderDto.getRelPayMoney();
        Date nowTime = new Date();
        //更新订单信息
        Order order = this.getById(orderId);
        order.setOrderStatus(3);
        order.setUseTime(nowTime);
        order.setUseUserId(merVerifyOrderDto.getUserId());
        order.setOfflinePayMoney(relPayMoney);
        order.setPayMoney(relReceiveMoney.add(relPayMoney));
        order.setCloseFlag(1);
        this.saveOrUpdate(order);
        //创建服务商品
        List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listVoByOrderId(orderId);
        ConsumerGoods consumerGoods;
        String consumerGoodsId;
        for(AppUserOrderGoodsPageVo appUserOrderGoodsPageVo : appUserOrderGoodsPageVoList){
            consumerGoods = new ConsumerGoods();
            consumerGoodsId = IdUtils.simpleUUID();
            consumerGoods.setConsumerGoodsId(consumerGoodsId);
            consumerGoods.setDelFlag(0);
            consumerGoods.setServiceStatus(1);
            consumerGoods.setShopId(order.getShopId());
            consumerGoods.setUserId(order.getUserId());
            consumerGoods.setOrderId(orderId);
            consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId());
            consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId());
            consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName());
            consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag());
            consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum());
            consumerGoods.setUsedNum(0);
            consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType());
            consumerGoods.setCreateTime(nowTime);
            consumerGoodsService.save(consumerGoods);
        }
        //生成返回
        MerVerifyOrderVo merVerifyOrderVo = new MerVerifyOrderVo();
        merVerifyOrderVo.setOrderId(orderId);
        merVerifyOrderVo.setOrderNo(order.getOrderNo());
        merVerifyOrderVo.setOrderStatus(order.getOrderStatus());
        merVerifyOrderVo.setOrderFrom(order.getOrderFrom());
        merVerifyOrderVo.setOrderGoodsMoney(order.getOrderMoney());
        merVerifyOrderVo.setCouponDiscount(order.getCouponMoney());
        merVerifyOrderVo.setReceivableDeposit(order.getReceivableDeposit());
        merVerifyOrderVo.setReceivableMoney(order.getReceivableMoney());
        merVerifyOrderVo.setPayMoney(order.getPayMoney());
        merVerifyOrderVo.setOrderRemark(order.getOrderRemark());
        merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList);
        merVerifyOrderVo.setCreateTime(order.getCreateTime());
        merVerifyOrderVo.setPayTime(order.getPayTime());
        merVerifyOrderVo.setUseTime(order.getUseTime());
        SysUser sysUser = remoteUserService.getSysUser(order.getUserId()).getData();
        merVerifyOrderVo.setUserName(sysUser.getNickName());
        merVerifyOrderVo.setUserMobile(sysUser.getPhonenumber());
        return merVerifyOrderVo;
    }
    /**
     * 收银未结清订单列表
     * @param page
     * @param merMemberNoClearOrderDto
     * @return
     */
    @Override
    public List<MerMemberNoClearOrderVo> pageMerMemberNoClearOrder(Page page, MerMemberNoClearOrderDto merMemberNoClearOrderDto){
        List<MerMemberNoClearOrderVo> merMemberNoClearOrderVoList = orderMapper.pageMerMemberNoClearOrder(page,merMemberNoClearOrderDto.getMemberUserId());
        if(merMemberNoClearOrderVoList!=null&&!merMemberNoClearOrderVoList.isEmpty()){
            BigDecimal zeroBig = new BigDecimal("0.00");
            for(MerMemberNoClearOrderVo merMemberNoClearOrderVo : merMemberNoClearOrderVoList){
                merMemberNoClearOrderVo.setUnPaidMoney(merMemberNoClearOrderVo.getReceivableMoney().subtract(merMemberNoClearOrderVo.getPayMoney()));
                if(merMemberNoClearOrderVo.getUnPaidMoney()==null){
                    merMemberNoClearOrderVo.setUnPaidMoney(zeroBig);
                }
            }
        }
        return merMemberNoClearOrderVoList;
    }
    /**
     * 结清订单
     * @param merCloseOrderDto
     */
    @Override
    public void merCloseOrder(MerCloseOrderDto merCloseOrderDto){
        Order order = this.getById(merCloseOrderDto.getOrderId());
        order.setOfflinePayMoney(merCloseOrderDto.getPayMoney());
        order.setPayMoney(order.getPayMoney().add(merCloseOrderDto.getPayMoney()));
        order.setCloseFlag(1);
        this.saveOrUpdate(order);
    }
    /**
     * 创建新订单
     * @param merNewOrderDto
     */
    @Override
    public void createNewOrder(MerNewOrderDto merNewOrderDto){
        Long userId = merNewOrderDto.getBuyUserId();
        if(userId==null){
            String name = merNewOrderDto.getName();
            String mobile = merNewOrderDto.getMobile();
            SysUser sysUser = remoteUserService.getSysUserByMobile(mobile).getData();
            if(sysUser==null){
                //创建新用户
                String memberId = IdUtils.simpleUUID();
                sysUser = new SysUser();
                sysUser.setUserName(mobile);
                sysUser.setUserType("03");
                sysUser.setNickName(name);
                sysUser.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png");
                String password = "hongruitang";
                sysUser.setPassword(SecurityUtils.encryptPassword(password));
                log.debug("sysUser"+sysUser.toString());
                sysUser = remoteUserService.registerUser(sysUser).getData();
                userId = sysUser.getUserId();
            }else{
                userId = sysUser.getUserId();
            }
        }
        //创建订单
        List<AppBuyGoodsDto> appBuyGoodsDtoList = merNewOrderDto.getAppBuyGoodsDtoList();
        String goodsId;
        Integer buyNum;
        BigDecimal buyNumBig;
        Integer serviceNum;
        Integer goodsNum = 0;
        Long userCouponId;
        Goods goods;
        BigDecimal goodsPrice;
        BigDecimal goodsTotalPrice;
        BigDecimal goodsRealPrice;
        List<AppUserCouponVo> appUserCouponVoList = remoteMemberService.listVoUserCouponByUserId(userId).getData();
        Map<Long,AppUserCouponVo> appUserCouponVoMap = new HashMap<>();
        if(null != appUserCouponVoList){
            appUserCouponVoMap = appUserCouponVoList.stream().collect(Collectors.toMap(AppUserCouponVo::getUserCouponId, Function.identity()));
        }
        AppUserCouponVo appUserCouponVo;
        Integer couponType;
        BigDecimal moneyThreshold;
        BigDecimal discountMoney = new BigDecimal("0.00");
        BigDecimal discountPercent;
        BigDecimal goodsDeposit;
        BigDecimal orderGoodsMoney = new BigDecimal("0.00");
        BigDecimal couponDiscount = new BigDecimal("0.00");
        BigDecimal orderPayDeposit = new BigDecimal("0.00");
        BigDecimal orderPayMoney = new BigDecimal("0.00");
        String orderId = IdUtils.simpleUUID();
        String orderNo = CodeFactoryUtil.getShopOrderNo();
        OrderGoods orderGoods;
        String orderGoodsId;
        for(AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList){
            goodsId = appBuyGoodsDto.getGoodsId();
            userCouponId = appBuyGoodsDto.getUserCouponId();
            goods = remoteGoodsService.getGoods(goodsId).getData();
            buyNum = appBuyGoodsDto.getBuyNum();
            goodsPrice = goods.getSalesPrice();
            serviceNum = goods.getServiceNum();
            //商户定制价格
            AppShopGoodsGetDto appShopGoodsGetDto = new AppShopGoodsGetDto();
            appShopGoodsGetDto.setGoodsId(goods.getGoodsId());
            appShopGoodsGetDto.setShopId(merNewOrderDto.getShopId());
            ShopGoods shopGoods = remoteGoodsService.getShopGoods(appShopGoodsGetDto).getData();
            if(shopGoods!=null){
                goodsPrice = shopGoods.getSalesPrice();
                serviceNum = shopGoods.getServiceNum();
            }
            buyNumBig = BigDecimal.valueOf(buyNum);
            goodsTotalPrice = goodsPrice.multiply(buyNumBig);
            goodsRealPrice = goodsTotalPrice;
            if(userCouponId!=null){
                appUserCouponVo = appUserCouponVoMap.get(userCouponId);
                if(null != appUserCouponVo && (StringUtils.isBlank(appUserCouponVo.getRelGoodsIds()) || appUserCouponVo.getRelGoodsIds().contains(goodsId))){
                    couponType = appUserCouponVo.getCouponType();
                    if(couponType == 1 && appUserCouponVo.getMoneyThreshold()!=null && appUserCouponVo.getDiscountMoney()!=null){
                        moneyThreshold = appUserCouponVo.getMoneyThreshold();
                        if(goodsTotalPrice.compareTo(moneyThreshold)>=0){
                            discountMoney = appUserCouponVo.getDiscountMoney();
                            goodsRealPrice = goodsTotalPrice.subtract(discountMoney);
                        }
                    }else if(couponType == 2 && appUserCouponVo.getDiscountPercent()!=null){
                        discountPercent = appUserCouponVo.getDiscountPercent();
                        goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN).setScale(2,BigDecimal.ROUND_HALF_UP);
                        discountMoney = goodsRealPrice.subtract(goodsTotalPrice);
                    }else if(couponType == 3 && appUserCouponVo.getDiscountMoney()!=null){
                        discountMoney = appUserCouponVo.getDiscountMoney();
                        goodsRealPrice = goodsTotalPrice.subtract(discountMoney);
                    }
                }
            }
            goodsDeposit = goods.getSubscription();
            if(goodsDeposit == null){
                goodsDeposit = new BigDecimal("0.00");
            }
            goodsNum = goodsNum + buyNum;
            orderGoodsMoney = orderGoodsMoney.add(goodsTotalPrice);
            couponDiscount = couponDiscount.add(discountMoney);
            orderPayDeposit = orderPayDeposit.add(goodsDeposit);
            orderPayMoney = orderPayMoney.add(goodsRealPrice);
            //创建OrderGoods
            orderGoods = new OrderGoods();
            orderGoodsId = IdUtils.simpleUUID();
            orderGoods.setOrderGoodsId(orderGoodsId);
            orderGoods.setDelFlag(0);
            orderGoods.setOrderId(orderId);
            orderGoods.setGoodsId(goodsId);
            orderGoods.setBuyNum(buyNum);
            if(null != userCouponId){
                orderGoods.setCouponId(userCouponId.toString());
            }
            orderGoods.setGoodsPrice(goodsPrice);
            orderGoods.setGoodsTotalMoney(orderGoodsMoney);
            orderGoods.setGoodsReceivableMoney(goodsRealPrice);
            orderGoods.setCycleNumFlag(goods.getCycleNumFlag());
            orderGoods.setServiceNum(serviceNum);
            orderGoods.setGoodsType(goods.getGoodsType());
            orderGoodsService.save(orderGoods);
        }
        Order order = new Order();
        order.setOrderId(orderId);
        order.setDelFlag(0);
        order.setOrderStatus(3);
        order.setOrderNo(orderNo);
        order.setOrderFrom(3);
        order.setShopId(merNewOrderDto.getShopId());
        order.setUserId(userId);
        order.setOrderMoney(orderGoodsMoney);
        order.setCouponMoney(couponDiscount);
        order.setDiscountMoney(couponDiscount);
        order.setReceivableMoney(orderPayMoney);
        order.setReceivableDeposit(new BigDecimal("0.00"));
        order.setPayType(1);
        if(order.getPayType()==1){
            order.setPayMoney(orderPayMoney);
            order.setOnlinePayMoney(orderPayMoney);
            order.setCloseFlag(1);
        }else if(order.getPayType()==2){
            order.setPayMoney(orderPayDeposit);
            order.setOnlinePayMoney(orderPayDeposit);
            order.setCloseFlag(0);
        }
        order.setOrderRemark(merNewOrderDto.getOrderRemark());
        order.setGoodsNum(goodsNum);
        order.setCreateTime(new Date());
        order.setPayTime(new Date());
        order.setUseTime(new Date());
        order.setUseUserId(merNewOrderDto.getUserId());
        order.setPayMoney(merNewOrderDto.getPayMoney());
        order.setOnlinePayMoney(new BigDecimal("0.00"));
        order.setOfflinePayMoney(merNewOrderDto.getPayMoney());
        order.setCloseFlag(1);
        this.save(order);
        //创建服务
        List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listVoByOrderId(orderId);
        ConsumerGoods consumerGoods;
        String consumerGoodsId;
        for(AppUserOrderGoodsPageVo appUserOrderGoodsPageVo : appUserOrderGoodsPageVoList){
            consumerGoods = new ConsumerGoods();
            consumerGoodsId = IdUtils.simpleUUID();
            consumerGoods.setConsumerGoodsId(consumerGoodsId);
            consumerGoods.setDelFlag(0);
            consumerGoods.setServiceStatus(1);
            consumerGoods.setShopId(order.getShopId());
            consumerGoods.setUserId(order.getUserId());
            consumerGoods.setOrderId(orderId);
            consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId());
            consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId());
            consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName());
            consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag());
            consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum());
            consumerGoods.setUsedNum(0);
            consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType());
            consumerGoods.setCreateTime(new Date());
            consumerGoodsService.save(consumerGoods);
        }
        Member member = remoteMemberService.getMember(userId).getData();
        if(member!=null&&member.getBindingFlag()!=1){
            //绑定商户
            AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto();
            appMemberBindingDto.setShopId(merNewOrderDto.getShopId());
            appMemberBindingDto.setUserId(userId);
            appMemberBindingDto.setBindingFlag(1);
            remoteMemberService.updateMemberBinding(appMemberBindingDto);
        }
    }
    /**
     *
     * @param merOrderPageDto
     * @return
     */
    @Override
    public List<MerOrderPageVo> pageMerOrder(Page page, MerOrderPageDto merOrderPageDto){
        List<MerOrderPageVo> merOrderPageVoList = orderMapper.pageMerOrder(page, merOrderPageDto);
        if(merOrderPageVoList!=null&&!merOrderPageVoList.isEmpty()){
            Long userId;
            Member member;
            Integer orderFrom;
            String orderFromDesc;
            BigDecimal zeroBig = new BigDecimal("0.00");
            for(MerOrderPageVo merOrderPageVo : merOrderPageVoList){
                userId = merOrderPageVo.getUserId();
                member = remoteMemberService.getMember(userId).getData();
                if(member!=null){
                    if(StringUtils.isNotBlank(member.getNickName())){
                        merOrderPageVo.setUserName(member.getNickName());
                    }
                    merOrderPageVo.setUserMobile(member.getMobile());
                }else{
                    SysUser sysUser = remoteUserService.getSysUser(userId).getData();
                    if(StringUtils.isNotBlank(sysUser.getNickName())){
                        merOrderPageVo.setUserName(sysUser.getNickName());
                    }
                    merOrderPageVo.setUserMobile(sysUser.getPhonenumber());
                }
                orderFrom = merOrderPageVo.getOrderFrom();
                if(orderFrom!=null){
                    if(orderFrom == 1){
                        orderFromDesc = "商城订单";
                    }else{
                        orderFromDesc = "线下创建";
                    }
                }else{
                    orderFromDesc = "商城订单";
                }
                merOrderPageVo.setOrderFromDesc(orderFromDesc);
                merOrderPageVo.setUnPaidMoney(merOrderPageVo.getReceivableMoney().subtract(merOrderPageVo.getPayMoney()));
                if(merOrderPageVo.getUnPaidMoney()==null){
                    merOrderPageVo.setUnPaidMoney(zeroBig);
                }
            }
        }
        return merOrderPageVoList;
    }
    /**
     *
     * @param page
     * @param merMemberNoClearOrderDto
     * @return
     */
    @Override
    public List<MerMemberNoClearOrderVo> pageMerMemberOrder(Page page, MerMemberNoClearOrderDto merMemberNoClearOrderDto){
        List<MerMemberNoClearOrderVo> merMemberNoClearOrderVoList = orderMapper.pageMerMemberOrder(page,merMemberNoClearOrderDto.getMemberUserId());
        if(merMemberNoClearOrderVoList!=null&&!merMemberNoClearOrderVoList.isEmpty()){
            BigDecimal zeroBig = new BigDecimal("0.00");
            for(MerMemberNoClearOrderVo merMemberNoClearOrderVo : merMemberNoClearOrderVoList){
                merMemberNoClearOrderVo.setUnPaidMoney(merMemberNoClearOrderVo.getReceivableMoney().subtract(merMemberNoClearOrderVo.getPayMoney()));
                if(merMemberNoClearOrderVo.getUnPaidMoney()==null){
                    merMemberNoClearOrderVo.setUnPaidMoney(zeroBig);
                }
            }
        }
        return merMemberNoClearOrderVoList;
    }
}