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.order.domain.dto.*;
|
import com.ruoyi.order.domain.pojo.goods.Goods;
|
import com.ruoyi.order.domain.pojo.goods.GoodsFile;
|
import com.ruoyi.order.domain.pojo.goods.ShopGoods;
|
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.goods.GoodsFileService;
|
import com.ruoyi.order.service.goods.ShopGoodsService;
|
import com.ruoyi.order.service.order.OrderGoodsService;
|
import com.ruoyi.order.util.CodeFactoryUtil;
|
import com.ruoyi.system.api.RemoteMemberService;
|
import com.ruoyi.system.api.RemoteShopService;
|
import com.ruoyi.system.api.constant.AppErrorConstant;
|
import com.ruoyi.system.api.domain.dto.AppBaseGetDto;
|
import com.ruoyi.system.api.domain.poji.shop.Shop;
|
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.goods.GoodsService;
|
import com.ruoyi.order.service.order.OrderService;
|
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>
|
* 订单 服务实现类
|
* </p>
|
*
|
* @author jqs
|
* @since 2023-04-25
|
*/
|
@Service
|
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
|
|
@Resource
|
private OrderMapper orderMapper;
|
|
@Resource
|
private GoodsService goodsService;
|
|
@Resource
|
private ShopGoodsService shopGoodsService;
|
|
@Resource
|
private RemoteMemberService remoteMemberService;
|
|
@Resource
|
private GoodsFileService goodsFileService;
|
|
@Resource
|
private OrderGoodsService orderGoodsService;
|
|
@Resource
|
private RemoteShopService remoteShopService;
|
|
/**
|
* @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 = goodsService.getById(goodsId);
|
appSureOrderGoodsVo.setGoodsId(goodsId);
|
appSureOrderGoodsVo.setGoodsName(goods.getGoodsName());
|
appSureOrderGoodsVo.setGoodsIntroduction(goods.getGoodsIntroduction());
|
appSureOrderGoodsVo.setGoodsType(goods.getGoodsType());
|
//商品图片
|
goodsFile = goodsFileService.getGoodsPicture(goodsId);
|
appSureOrderGoodsVo.setGoodsPicture(goodsFile.getFileUrl());
|
buyNum = appBuyGoodsDto.getBuyNum();
|
appSureOrderGoodsVo.setBuyNum(buyNum);
|
goodsPrice = goods.getSalesPrice();
|
//商户定制价格
|
ShopGoods shopGoods = shopGoodsService.getByShopIdAndGoodsId(appSureOrderDto.getShopId(),goods.getGoodsId());
|
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;
|
for(AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList){
|
appSureOrderGoodsVo = new AppSureOrderGoodsVo();
|
useCoupon = 0;
|
goodsId = appBuyGoodsDto.getGoodsId();
|
userCouponId = appBuyGoodsDto.getUserCouponId();
|
goods = goodsService.getById(goodsId);
|
appSureOrderGoodsVo.setGoodsId(goodsId);
|
appSureOrderGoodsVo.setGoodsName(goods.getGoodsName());
|
appSureOrderGoodsVo.setGoodsIntroduction(goods.getGoodsIntroduction());
|
appSureOrderGoodsVo.setGoodsType(goods.getGoodsType());
|
//商品图片
|
goodsFile = goodsFileService.getGoodsPicture(goodsId);
|
appSureOrderGoodsVo.setGoodsPicture(goodsFile.getFileUrl());
|
buyNum = appBuyGoodsDto.getBuyNum();
|
appSureOrderGoodsVo.setBuyNum(buyNum);
|
goodsPrice = goods.getSalesPrice();
|
serviceNum = goods.getServiceNum();
|
//商户定制价格
|
ShopGoods shopGoods = shopGoodsService.getByShopIdAndGoodsId(appPlaceOrderDto.getShopId(),goods.getGoodsId());
|
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);
|
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(1);
|
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.setPayType(appPlaceOrderDto.getPayType());
|
if(order.getPayType()==1){
|
order.setPayMoney(orderPayMoney);
|
order.setOnlinePayMoney(orderPayMoney);
|
appPlaceOrderVo.setPayMoney(orderPayMoney);
|
}else if(order.getPayType()==2){
|
order.setPayMoney(orderPayDeposit);
|
order.setOnlinePayMoney(orderPayDeposit);
|
appPlaceOrderVo.setPayMoney(orderPayDeposit);
|
}
|
order.setOrderRemark(appPlaceOrderDto.getOrderRemark());
|
order.setGoodsNum(goodsNum);
|
order.setCreateTime(new Date());
|
this.save(order);
|
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);
|
}
|
}
|
}
|
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());
|
Shop shop = remoteShopService.getShop(order.getShopId()).getData();
|
appUserOrderGetVo.setShopName(shop.getShopName());
|
appUserOrderGetVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList);
|
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;
|
}
|
}
|