@@ -1,5 +1,9 @@
package com.yovinchen.xlcs.order.service.impl ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper ;
import com.baomidou.mybatisplus.core.metadata.IPage ;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page ;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl ;
import com.yovinchen.xlcs.client.activity.ActivityFeignClient ;
import com.yovinchen.xlcs.client.cart.CartFeignClient ;
import com.yovinchen.xlcs.client.product.ProductFeignClient ;
@@ -15,23 +19,15 @@ import com.yovinchen.xlcs.model.activity.CouponInfo;
import com.yovinchen.xlcs.model.order.CartInfo ;
import com.yovinchen.xlcs.model.order.OrderInfo ;
import com.yovinchen.xlcs.model.order.OrderItem ;
import com.yovinchen.xlcs.enums.* ;
import com.yovinchen.xlcs.mq.constant.MqConst ;
import com.yovinchen.xlcs.mq.service.RabbitService ;
import com.yovinchen.xlcs.order.mapper.OrderInfoMapper ;
import com.yovinchen.xlcs.order.mapper.OrderItemMapper ;
import com.yovinchen.xlcs.order.service.OrderInfoService ;
import com.yovinchen.xlcs.order.service.OrderItemService ;
import com.yovinchen.xlcs.vo.order.CartInfoVo ;
import com.yovinchen.xlcs.vo.order.OrderConfirmVo ;
import com.yovinchen.xlcs.vo.order.OrderSubmitVo ;
import com.yovinchen.xlcs.vo.order.OrderUserQueryVo ;
import com.yovinchen.xlcs.vo.order.* ;
import com.yovinchen.xlcs.vo.product.SkuStockLockVo ;
import com.yovinchen.xlcs.vo.user.LeaderAddressVo ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper ;
import com.baomidou.mybatisplus.core.metadata.IPage ;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page ;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.data.redis.core.BoundHashOperations ;
import org.springframework.data.redis.core.RedisTemplate ;
@@ -98,7 +94,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
//唯一标识订单
String orderNo = System . currentTimeMillis ( ) + " " ;
redisTemplate . opsForValue ( ) . set ( RedisConst . ORDER_REPEAT + orderNo , orderNo , 24 , TimeUnit . HOURS ) ;
redisTemplate . opsForValue ( )
. set ( RedisConst . ORDER_REPEAT + orderNo , orderNo , 24 , TimeUnit . HOURS ) ;
//获取购物车满足条件活动和优惠卷信息
OrderConfirmVo orderConfirmVo = activityFeignClient . findCartActivityAndCoupon ( cartInfoList , userId ) ;
@@ -147,17 +144,21 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
List < CartInfo > cartInfoList = cartFeignClient . getCartCheckedList ( userId ) ;
//2、购物车有很多商品, 商品不同类型, 重点处理普通类型商品
List < CartInfo > commonSkuList = cartInfoList . stream ( ) . filter ( cartInfo - > Objects . equals ( cartInfo . getSkuType ( ) , SkuType . COMMON . getCode ( ) ) ) . collect ( Collectors . toList ( ) ) ;
List < CartInfo > commonSkuList = cartInfoList . stream ( )
. filter ( cartInfo - > Objects . equals ( cartInfo . getSkuType ( ) , SkuType . COMMON . getCode ( ) ) )
. collect ( Collectors . toList ( ) ) ;
//3、把获取购物车里面普通类型商品list集合,
// List<CartInfo>转换List<SkuStockLockVo>
if ( ! CollectionUtils . isEmpty ( commonSkuList ) ) {
List < SkuStockLockVo > commonStockLockVoList = commonSkuList . stream ( ) . map ( item - > {
SkuStockLockVo skuStockLockVo = new SkuStockLockVo ( ) ;
s kuStockLockVo. setSkuId ( item . getSkuId ( ) ) ;
skuStockLockVo . setSkuNum ( item . getSkuNum ( ) ) ;
return skuStockLockVo ;
} ) . collect ( Collectors . toList ( ) ) ;
List < SkuStockLockVo > commonStockLockVoList = commonSkuList . stream ( )
. map ( item - > {
S kuStockLockVo skuStockLockVo = new SkuStockLockVo ( ) ;
skuStockLockVo . setSkuId ( item . getSkuId ( ) ) ;
skuStockLockVo . setSkuNum ( item . getSkuNum ( ) ) ;
return skuStockLockVo ;
} )
. collect ( Collectors . toList ( ) ) ;
//4、远程调用service-product模块实现锁定商品
//// 验证库存并锁定库存,保证具备原子性
@@ -187,7 +188,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
if ( CollectionUtils . isEmpty ( cartInfoList ) ) {
throw new xlcsException ( ResultCodeEnum . DATA_ERROR ) ;
}
//查询用户提货 点和配送员信息
//查询用户配送 点和配送员信息
Long userId = AuthContextHolder . getUserId ( ) ;
LeaderAddressVo leaderAddressVo = userFeignClient . getUserAddressByUserId ( userId ) ;
if ( leaderAddressVo = = null ) {
@@ -231,9 +232,11 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
orderItem . setSplitCouponAmount ( couponAmount ) ;
//总金额
BigDecimal skuTotalAmount = orderItem . getSkuPrice ( ) . multiply ( new BigDecimal ( orderItem . getSkuNum ( ) ) ) ;
BigDecimal skuTotalAmount = orderItem . getSkuPrice ( )
. multiply ( new BigDecimal ( orderItem . getSkuNum ( ) ) ) ;
//优惠之后金额
BigDecimal splitTotalAmount = skuTotalAmount . subtract ( activityAmount ) . subtract ( couponAmount ) ;
BigDecimal splitTotalAmount = skuTotalAmount . subtract ( activityAmount )
. subtract ( couponAmount ) ;
orderItem . setSplitTotalAmount ( splitTotalAmount ) ;
orderItemList . add ( orderItem ) ;
}
@@ -247,14 +250,14 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
orderInfo . setLeaderName ( leaderAddressVo . getLeaderName ( ) ) ; //配送员名称
orderInfo . setLeaderPhone ( leaderAddressVo . getLeaderPhone ( ) ) ;
orderInfo . setTakeName ( leaderAddressVo . getTakeName ( ) ) ;
orderInfo . setReceiverName ( orderParamVo . getReceiverName ( ) ) ;
orderInfo . setReceiverPhone ( orderParamVo . getReceiverPhone ( ) ) ;
orderInfo . setReceiverProvince ( leaderAddressVo . getProvince ( ) ) ;
orderInfo . setReceiverCity ( leaderAddressVo . getCity ( ) ) ;
orderInfo . setReceiverDistrict ( leaderAddressVo . getDistrict ( ) ) ;
orderInfo . setReceiverAddress ( leaderAddressVo . getDetailAddress ( ) ) ;
orderInfo . setWareId ( cartInfoList . get ( 0 ) . getWareId ( ) ) ;
orderInfo . setWareId ( cartInfoList . get ( 0 )
. getWareId ( ) ) ;
orderInfo . setProcessStatus ( ProcessStatus . UNPAID ) ;
//计算订单金额
@@ -265,7 +268,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
BigDecimal couponAmount = couponInfoSplitAmount . get ( " coupon:total " ) ;
if ( null = = couponAmount ) couponAmount = new BigDecimal ( 0 ) ;
BigDecimal totalAmount = originalTotalAmount . subtract ( activityAmount ) . subtract ( couponAmount ) ;
BigDecimal totalAmount = originalTotalAmount . subtract ( activityAmount )
. subtract ( couponAmount ) ;
//计算订单金额
orderInfo . setOriginalTotalAmount ( originalTotalAmount ) ;
orderInfo . setActivityAmount ( activityAmount ) ;
@@ -274,7 +278,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
//计算配送员佣金
BigDecimal profitRate = new BigDecimal ( 0 ) ; //orderSetService.getProfitRate();
BigDecimal commissionAmount = orderInfo . getTotalAmount ( ) . multiply ( profitRate ) ;
BigDecimal commissionAmount = orderInfo . getTotalAmount ( )
. multiply ( profitRate ) ;
orderInfo . setCommissionAmount ( commissionAmount ) ;
//添加数据到订单基本信息表
@@ -295,9 +300,12 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
String orderSkuKey = RedisConst . ORDER_SKU_MAP + orderParamVo . getUserId ( ) ;
BoundHashOperations < String , String , Integer > hashOperations = redisTemplate . boundHashOps ( orderSkuKey ) ;
cartInfoList . forEach ( cartInfo - > {
if ( Boolean . TRUE . equals ( hashOperations . hasKey ( cartInfo . getSkuId ( ) . toString ( ) ) ) ) {
Integer orderSkuNum = hashOperations . get ( cartInfo . getSkuId ( ) . toString ( ) ) + cartInfo . getSkuNum ( ) ;
hashOperations . pu t( cartInfo . getSkuId ( ) . toString ( ) , orderSkuNum ) ;
if ( Boolean . TRUE . equals ( hashOperations . hasKey ( cartInfo . getSkuId ( )
. toString ( ) ) ) ) {
Integer orderSkuNum = hashOperations. ge t( cartInfo . getSkuId ( )
. toString ( ) ) + cartInfo . getSkuNum ( ) ;
hashOperations . put ( cartInfo . getSkuId ( )
. toString ( ) , orderSkuNum ) ;
}
} ) ;
redisTemplate . expire ( orderSkuKey , DateUtil . getCurrentExpireTimes ( ) , TimeUnit . SECONDS ) ;
@@ -355,7 +363,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
}
/**
* 订单查询
* 订单(用户) 查询
*
* @param pageParam
* @param orderUserQueryVo
@@ -376,7 +384,57 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
//把订单项集合封装到每个订单里面
orderInfo . setOrderItemList ( orderItemList ) ;
//封装订单状态名称
orderInfo . getParam ( ) . put ( " orderStatusName " , orderInfo . getOrderStatus ( ) . getComment ( ) ) ;
orderInfo . getParam ( )
. put ( " orderStatusName " , orderInfo . getOrderStatus ( )
. getComment ( ) ) ;
}
return pageModel ;
}
/**
* 订单(后台)查询
*
* @param pageParam
* @param orderQueryVo
* @return
*/
@Override
public IPage < OrderInfo > selectPage ( Page < OrderInfo > pageParam , OrderQueryVo orderQueryVo ) {
LambdaQueryWrapper < OrderInfo > wrapper = new LambdaQueryWrapper < > ( ) ;
//获取查询信息
String receiver = orderQueryVo . getReceiver ( ) ;
String orderNo = orderQueryVo . getOrderNo ( ) ;
OrderStatus orderStatus = orderQueryVo . getOrderStatus ( ) ;
Long leaderId = orderQueryVo . getLeaderId ( ) ;
Long wareId = orderQueryVo . getWareId ( ) ;
String createTimeBegin = orderQueryVo . getCreateTimeBegin ( ) ;
String createTimeEnd = orderQueryVo . getCreateTimeEnd ( ) ;
//拼接查询信息
wrapper . like ( ! StringUtils . isEmpty ( receiver ) , OrderInfo : : getReceiverName , receiver )
. or ( )
. like ( ! StringUtils . isEmpty ( receiver ) , OrderInfo : : getReceiverPhone , receiver )
. eq ( ! StringUtils . isEmpty ( orderNo ) , OrderInfo : : getOrderNo , orderNo )
. eq ( ! StringUtils . isEmpty ( orderStatus ) , OrderInfo : : getOrderStatus , orderStatus )
. eq ( ! StringUtils . isEmpty ( leaderId ) , OrderInfo : : getLeaderId , leaderId )
. eq ( ! StringUtils . isEmpty ( wareId ) , OrderInfo : : getWareId , wareId )
. ge ( ! StringUtils . isEmpty ( createTimeBegin ) , OrderInfo : : getCreateTime , createTimeBegin )
. le ( ! StringUtils . isEmpty ( createTimeEnd ) , OrderInfo : : getCreateTime , createTimeEnd ) ;
IPage < OrderInfo > pageModel = baseMapper . selectPage ( pageParam , wrapper ) ;
//获取每个订单,把每个订单里面订单项查询封装
List < OrderInfo > orderInfoList = pageModel . getRecords ( ) ;
for ( OrderInfo orderInfo : orderInfoList ) {
//根据订单id查询里面所有订单项列表
List < OrderItem > orderItemList = orderItemMapper . selectList ( new LambdaQueryWrapper < OrderItem > ( )
. eq ( OrderItem : : getOrderId , orderInfo . getId ( ) ) ) ;
//把订单项集合封装到每个订单里面
orderInfo . setOrderItemList ( orderItemList ) ;
//封装订单状态名称
orderInfo . getParam ( )
. put ( " orderStatusName " , orderInfo . getOrderStatus ( )
. getComment ( ) ) ;
}
return pageModel ;
}
@@ -393,7 +451,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
private BigDecimal computeTotalAmount ( List < CartInfo > cartInfoList ) {
BigDecimal total = new BigDecimal ( 0 ) ;
for ( CartInfo cartInfo : cartInfoList ) {
BigDecimal itemTotal = cartInfo . getCartPrice ( ) . multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
BigDecimal itemTotal = cartInfo . getCartPrice ( )
. multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
total = total . add ( itemTotal ) ;
}
return total ;
@@ -424,12 +483,14 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
BigDecimal reduceAmount = activityRule . getReduceAmount ( ) ;
activityReduceAmount = activityReduceAmount . add ( reduceAmount ) ;
if ( cartInfoList . size ( ) = = 1 ) {
activitySplitAmountMap . put ( " activity: " + cartInfoList . get ( 0 ) . getSkuId ( ) , reduceAmount ) ;
activitySplitAmountMap . put ( " activity: " + cartInfoList . get ( 0 )
. getSkuId ( ) , reduceAmount ) ;
} else {
//总金额
BigDecimal originalTotalAmount = new BigDecimal ( 0 ) ;
for ( CartInfo cartInfo : cartInfoList ) {
BigDecimal skuTotalAmount = cartInfo . getCartPrice ( ) . multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
BigDecimal skuTotalAmount = cartInfo . getCartPrice ( )
. multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
originalTotalAmount = originalTotalAmount . add ( skuTotalAmount ) ;
}
//记录除最后一项是所有分摊金额, 最后一项=总的 - skuPartReduceAmount
@@ -438,9 +499,11 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
for ( int i = 0 , len = cartInfoList . size ( ) ; i < len ; i + + ) {
CartInfo cartInfo = cartInfoList . get ( i ) ;
if ( i < len - 1 ) {
BigDecimal skuTotalAmount = cartInfo . getCartPrice ( ) . multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
BigDecimal skuTotalAmount = cartInfo . getCartPrice ( )
. multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
//sku分摊金额
BigDecimal skuReduceAmount = skuTotalAmount . divide ( originalTotalAmount , 2 , RoundingMode . HALF_UP ) . multiply ( reduceAmount ) ;
BigDecimal skuReduceAmount = skuTotalAmount . divide ( originalTotalAmount , 2 , RoundingMode . HALF_UP )
. multiply ( reduceAmount ) ;
activitySplitAmountMap . put ( " activity: " + cartInfo . getSkuId ( ) , skuReduceAmount ) ;
skuPartReduceAmount = skuPartReduceAmount . add ( skuReduceAmount ) ;
@@ -453,10 +516,12 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
for ( int i = 0 , len = cartInfoList . size ( ) ; i < len ; i + + ) {
CartInfo cartInfo = cartInfoList . get ( i ) ;
if ( i < len - 1 ) {
BigDecimal skuTotalAmount = cartInfo . getCartPrice ( ) . multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
BigDecimal skuTotalAmount = cartInfo . getCartPrice ( )
. multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
//sku分摊金额
BigDecimal skuDiscountTotalAmount = skuTotalAmount . multiply ( activityRule . getBenefitDiscount ( ) . divide ( new BigDecimal ( " 10 " ) ) ) ;
BigDecimal skuDiscountTotalAmount = skuTotalAmount . multiply ( activityRule . getBenefitDiscount ( )
. divide ( new BigDecimal ( " 10 " ) ) ) ;
BigDecimal skuReduceAmount = skuTotalAmount . subtract ( skuDiscountTotalAmount ) ;
activitySplitAmountMap . put ( " activity: " + cartInfo . getSkuId ( ) , skuReduceAmount ) ;
@@ -497,13 +562,15 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
BigDecimal reduceAmount = couponInfo . getAmount ( ) ;
if ( skuIdList . size ( ) = = 1 ) {
//sku的优化金额
couponInfoSplitAmountMap . put ( " coupon: " + skuIdToCartInfoMap . get ( skuIdList . get ( 0 ) ) . getSkuId ( ) , reduceAmount ) ;
couponInfoSplitAmountMap . put ( " coupon: " + skuIdToCartInfoMap . get ( skuIdList . get ( 0 ) )
. getSkuId ( ) , reduceAmount ) ;
} else {
//总金额
BigDecimal originalTotalAmount = new BigDecimal ( 0 ) ;
for ( Long skuId : skuIdList ) {
CartInfo cartInfo = skuIdToCartInfoMap . get ( skuId ) ;
BigDecimal skuTotalAmount = cartInfo . getCartPrice ( ) . multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
BigDecimal skuTotalAmount = cartInfo . getCartPrice ( )
. multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
originalTotalAmount = originalTotalAmount . add ( skuTotalAmount ) ;
}
//记录除最后一项是所有分摊金额, 最后一项=总的 - skuPartReduceAmount
@@ -512,9 +579,11 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
for ( int i = 0 , len = skuIdList . size ( ) ; i < len ; i + + ) {
CartInfo cartInfo = skuIdToCartInfoMap . get ( skuIdList . get ( i ) ) ;
if ( i < len - 1 ) {
BigDecimal skuTotalAmount = cartInfo . getCartPrice ( ) . multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
BigDecimal skuTotalAmount = cartInfo . getCartPrice ( )
. multiply ( new BigDecimal ( cartInfo . getSkuNum ( ) ) ) ;
//sku分摊金额
BigDecimal skuReduceAmount = skuTotalAmount . divide ( originalTotalAmount , 2 , RoundingMode . HALF_UP ) . multiply ( reduceAmount ) ;
BigDecimal skuReduceAmount = skuTotalAmount . divide ( originalTotalAmount , 2 , RoundingMode . HALF_UP )
. multiply ( reduceAmount ) ;
couponInfoSplitAmountMap . put ( " coupon: " + cartInfo . getSkuId ( ) , skuReduceAmount ) ;
skuPartReduceAmount = skuPartReduceAmount . add ( skuReduceAmount ) ;