فهرست منبع

修改新增方法

赵冬冬 4 سال پیش
والد
کامیت
280149903a

+ 1 - 0
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/config/exception/GlobalExceptionHandler.java

@@ -19,6 +19,7 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(RuntimeException.class)
     @ResponseBody
     public CommonResult handleOrderException(RuntimeException ex) {
+        ex.printStackTrace();
         return CommonResult.failed(500 ,ex.getMessage());
     }
 }

+ 6 - 5
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/controller/OmsPortalOrderController.java

@@ -5,6 +5,7 @@ import com.hwrj.cloud.common.api.CommonResult;
 import com.hwrj.cloud.portal.domain.ConfirmOrderResult;
 import com.hwrj.cloud.portal.domain.OmsOrderDetail;
 import com.hwrj.cloud.portal.domain.OrderParam;
+import com.hwrj.cloud.portal.from.OrderFrom;
 import com.hwrj.cloud.portal.service.OmsPortalOrderService;
 import com.hwrj.cloud.portal.service.OmsPreItemService;
 import io.swagger.annotations.Api;
@@ -28,12 +29,12 @@ public class OmsPortalOrderController {
     @Autowired
     private OmsPortalOrderService portalOrderService;
 
-    @ApiOperation("根据购物车信息生成确认单信息")
-    @PostMapping
+    @ApiOperation("根据产品id和数量下订单")
+    @PostMapping("/insert")
     @ResponseBody
-    public CommonResult<ConfirmOrderResult> save(@RequestBody List<Long> cartIds) {
-        portalOrderService.save(cartIds);
-        return CommonResult.success();
+    public CommonResult<Map<String, Object>> save(@RequestBody OrderFrom orderFrom) {
+        Map<String, Object> save = portalOrderService.save(orderFrom);
+        return CommonResult.success(save);
     }
 
 

+ 1 - 1
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/controller/WechatH5PayController.java

@@ -8,7 +8,7 @@ import com.github.binarywang.wxpay.service.WxPayService;
 import com.hwrj.cloud.common.api.CommonResult;
 import com.hwrj.cloud.portal.util.GeneratorIdUtils;
 import com.hwrj.cloud.portal.util.UUIDUtils;
-import com.hwrj.cloud.portal.wxfrom.WxPayFrom;
+import com.hwrj.cloud.portal.from.WxPayFrom;
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;

+ 19 - 0
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/from/OrderFrom.java

@@ -0,0 +1,19 @@
+package com.hwrj.cloud.portal.from;
+
+import lombok.Data;
+
+@Data
+public class OrderFrom {
+    /**
+     * 商品id
+     */
+    private Long productId;
+    /**
+     * 购买数量
+     */
+    private Integer bayNum;
+    /**
+     * 收获地址
+     */
+    private Long memberReceiveAddressId;
+}

+ 1 - 1
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/wxfrom/WxPayFrom.java → forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/from/WxPayFrom.java

@@ -1,4 +1,4 @@
-package com.hwrj.cloud.portal.wxfrom;
+package com.hwrj.cloud.portal.from;
 
 import lombok.Data;
 

+ 5 - 0
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/service/OmsCartItemService.java

@@ -28,6 +28,11 @@ public interface OmsCartItemService {
      */
     List<CartPromotionItem> listPromotion(Long memberId, List<Long> cartIds);
 
+    /**
+     * 获取包含促销活动信息的购物车列表
+     */
+    List<CartPromotionItem> listPromotionByOne(Long memberId, List<Long> cartIds);
+
     /**
      * 修改某个购物车商品的数量
      */

+ 7 - 2
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/service/OmsPortalOrderService.java

@@ -4,6 +4,7 @@ import com.hwrj.cloud.common.api.CommonPage;
 import com.hwrj.cloud.portal.domain.ConfirmOrderResult;
 import com.hwrj.cloud.portal.domain.OmsOrderDetail;
 import com.hwrj.cloud.portal.domain.OrderParam;
+import com.hwrj.cloud.portal.from.OrderFrom;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
@@ -71,7 +72,11 @@ public interface OmsPortalOrderService {
 
     /**
      * 新建订单
-     * @param cartIds
+     * @param orderFrom
      */
-    void save(List<Long> cartIds);
+    Map<String, Object> save(OrderFrom orderFrom);
+
+    Map<String, Object> saveOrder(OrderParam orderParam,OrderFrom orderFrom);
+
+
 }

+ 7 - 0
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/service/OmsPromotionService.java

@@ -15,4 +15,11 @@ public interface OmsPromotionService {
      * @param cartItemList 购物车
      */
     List<CartPromotionItem> calcCartPromotion(List<OmsCartItem> cartItemList);
+
+
+    /**
+     * 计算购物车中的促销活动信息
+     * @param cartItemList 购物车
+     */
+    List<CartPromotionItem>  calcCartPromotionByOne(List<OmsCartItem> cartItemList);
 }

+ 17 - 2
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/service/impl/OmsCartItemServiceImpl.java

@@ -12,6 +12,7 @@ import com.hwrj.cloud.portal.model.UmsMember;
 import com.hwrj.cloud.portal.service.OmsCartItemService;
 import com.hwrj.cloud.portal.service.OmsPromotionService;
 import com.hwrj.cloud.portal.service.PmsPortalProductService;
+import com.hwrj.cloud.portal.service.UmsMemberService;
 import com.hwrj.cloud.portal.util.MemberUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -45,11 +46,12 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
 
     @Autowired
     private HttpServletRequest request;
-
+    @Autowired
+    private UmsMemberService memberService;
     @Override
     public int add(OmsCartItem cartItem) {
         int count;
-        UmsMember currentMember =memberUtil.getRedisUmsMember(request);
+        UmsMember currentMember = memberService.getCurrentMember();
         cartItem.setMemberId(currentMember.getId());
         cartItem.setMemberNickname(currentMember.getNickname());
         cartItem.setDeleteStatus(0);
@@ -102,6 +104,19 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
         return cartPromotionItemList;
     }
 
+    @Override
+    public List<CartPromotionItem> listPromotionByOne(Long memberId, List<Long> cartIds) {
+        List<OmsCartItem> cartItemList = list(memberId);
+        if(CollUtil.isNotEmpty(cartIds)){
+            cartItemList = cartItemList.stream().filter(item->cartIds.contains(item.getId())).collect(Collectors.toList());
+        }
+        List<CartPromotionItem> cartPromotionItemList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(cartItemList)){
+            cartPromotionItemList = promotionService.calcCartPromotion(cartItemList);
+        }
+        return cartPromotionItemList;
+    }
+
     @Override
     public int updateQuantity(Long id, Long memberId, Integer quantity) {
         OmsCartItem cartItem = new OmsCartItem();

+ 292 - 11
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -5,24 +5,25 @@ import cn.hutool.core.collection.CollUtil;
 import com.github.pagehelper.PageHelper;
 import com.hwrj.cloud.common.api.CommonPage;
 import com.hwrj.cloud.common.exception.Asserts;
-import com.hwrj.cloud.portal.domain.CartPromotionItem;
-import com.hwrj.cloud.portal.domain.SmsCouponHistoryDetail;
-import com.hwrj.cloud.portal.mapper.*;
-import com.hwrj.cloud.portal.model.*;
 import com.hwrj.cloud.portal.component.CancelOrderSender;
 import com.hwrj.cloud.portal.dao.PortalOrderDao;
 import com.hwrj.cloud.portal.dao.PortalOrderItemDao;
 import com.hwrj.cloud.portal.domain.*;
+import com.hwrj.cloud.portal.from.OrderFrom;
+import com.hwrj.cloud.portal.mapper.*;
+import com.hwrj.cloud.portal.model.*;
 import com.hwrj.cloud.portal.service.*;
-import com.hwrj.cloud.portal.util.OrderJwtTokenUtil;
 import com.hwrj.cloud.portal.util.MemberUtil;
 import com.hwrj.cloud.security.service.RedisService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
@@ -77,8 +78,6 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     @Value("${redis.member}")
     private String member;
 
-    @Autowired
-    private OrderJwtTokenUtil jwtTokenUtil;
     @Autowired
     private RedisTemplate redisTemplate;
 
@@ -262,7 +261,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         if (orderParam.getUseIntegration() != null) {
             order.setUseIntegration(orderParam.getUseIntegration());
             UmsMember member = memberService.getById(currentMember.getId());
-            memberService.updateIntegration(currentMember.getId(), member.getIntegration() -orderParam.getUseIntegration()-orderParam.getUseIntegration());
+            memberService.updateIntegration(currentMember.getId(), member.getIntegration() - orderParam.getUseIntegration() - orderParam.getUseIntegration());
 //            memberFeign.updateIntegration(currentMember.getId(), -orderParam.getUseIntegration());
         }
         //删除购物车中的下单商品
@@ -381,7 +380,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             status = null;
         }
         // redis 中用户信息
-        UmsMember member = memberUtil.getRedisUmsMember(request);
+        UmsMember member = memberService.getCurrentMember();
         PageHelper.startPage(pageNum, pageSize);
         OmsOrderExample orderExample = new OmsOrderExample();
         OmsOrderExample.Criteria criteria = orderExample.createCriteria();
@@ -447,11 +446,275 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
     }
 
+    @Autowired
+    private PmsProductMapper pmsProductMapper;
+
+    @Override
+    @Transactional
+    public Map<String, Object> save(OrderFrom orderFrom) {
+        PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(orderFrom.getProductId());
+        //新增购物车
+        OmsCartItem cartItem = new OmsCartItem();
+        //构建订单数据
+        OrderParam orderParam = getOrderParam(orderFrom, pmsProduct, cartItem);
+        //下单
+        return saveOrder(orderParam, orderFrom);
+    }
+
+    private OrderParam getOrderParam(OrderFrom orderFrom, PmsProduct pmsProduct, OmsCartItem cartItem) {
+        BeanUtils.copyProperties(pmsProduct, cartItem);
+        UmsMember currentMember = memberService.getCurrentMember();
+        cartItem.setId(null);
+        cartItem.setProductName(pmsProduct.getName());
+        //设置品牌
+        cartItem.setProductBrand(pmsProduct.getBrandName());
+        //产品首图
+        cartItem.setProductPic(pmsProduct.getPic());
+        //购买数量
+        cartItem.setQuantity(orderFrom.getBayNum());
+        cartItem.setMemberId(currentMember.getId());
+        cartItem.setMemberNickname(currentMember.getNickname());
+        cartItem.setProductId(orderFrom.getProductId());
+        //先添加到购物车
+        cartSave(cartItem);
+        OrderParam orderParam = new OrderParam();
+        orderParam.setCartIds(Arrays.asList(cartItem.getId()));
+        //设置收获地址
+        orderParam.setMemberReceiveAddressId(orderFrom.getMemberReceiveAddressId());
+        //未支付
+        orderParam.setPayType(0);
+        return orderParam;
+    }
+
+    @Autowired
+    private OmsPromotionService promotionService;
+
+    private List<OmsCartItem> list(Long memberId) {
+        OmsCartItemExample example = new OmsCartItemExample();
+        example.createCriteria().andDeleteStatusEqualTo(0).andMemberIdEqualTo(memberId);
+        return cartItemMapper.selectByExample(example);
+    }
+
+    private List<CartPromotionItem> listPromotion(Long memberId, List<Long> cartIds) {
+        List<OmsCartItem> cartItemList = list(memberId);
+        if (CollUtil.isNotEmpty(cartIds)) {
+            cartItemList = cartItemList.stream().filter(item -> cartIds.contains(item.getId())).collect(Collectors.toList());
+        }
+        List<CartPromotionItem> cartPromotionItemList = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(cartItemList)) {
+            cartPromotionItemList = promotionService.calcCartPromotionByOne(cartItemList);
+        }
+        return cartPromotionItemList;
+    }
+
     @Override
-    public void save(List<Long> cartIds) {
+    public Map<String, Object> saveOrder(OrderParam orderParam, OrderFrom orderFrom) {
+        List<OmsOrderItem> orderItemList = new ArrayList<>();
+        //获取购物车及优惠信息  redis
+        UmsMember currentMember = memberService.getCurrentMember();
+        //获取购物车信息
+        List<CartPromotionItem> cartPromotionItemList = getCartPromotionItems(orderParam, orderItemList, currentMember);
+        //扣除积分
+        deduction(orderParam, orderItemList, currentMember, cartPromotionItemList);
+        //计算order_item的实付金额
+        handleRealAmount(orderItemList);
+        //进行库存锁定
+        lockStockByOne(cartPromotionItemList, orderFrom);
+        //插入大订单
+        OmsOrder order = new OmsOrder();
+        insertOmsOrder(orderParam, order, orderItemList, currentMember);
+        //插入小定单
+        insertOderItem(orderItemList, order);
+        //如使用优惠券更新优惠券使用状态
+        updateCoupon(orderParam, currentMember, order);
+        //删除购物车中的下单商品
+        deleteCartItemList(cartPromotionItemList, currentMember);
+        //发送延迟消息取消订单
+        sendDelayMessageCancelOrder(order.getId());
+        Map<String, Object> result = new HashMap<>();
+        result.put("order", order);
+        result.put("orderItemList", orderItemList);
+        return result;
+    }
+
+    private void updateCoupon(OrderParam orderParam, UmsMember currentMember, OmsOrder order) {
+        if (orderParam.getCouponId() != null) {
+            couponService.updateCouponStatus(orderParam.getCouponId(), currentMember.getId(), 1);
+//            couponFeign.updateCouponStatus(orderParam.getCouponId(), currentMember.getId(), 1);
+        }
+        //如使用积分需要扣除积分
+        if (orderParam.getUseIntegration() != null) {
+            order.setUseIntegration(orderParam.getUseIntegration());
+            UmsMember member = memberService.getById(currentMember.getId());
+            memberService.updateIntegration(currentMember.getId(), member.getIntegration() - orderParam.getUseIntegration() - orderParam.getUseIntegration());
+//            memberFeign.updateIntegration(currentMember.getId(), -orderParam.getUseIntegration());
+        }
+    }
+
+    private void insertOderItem(List<OmsOrderItem> orderItemList, OmsOrder order) {
+        for (OmsOrderItem orderItem : orderItemList) {
+            orderItem.setOrderId(order.getId());
+            orderItem.setOrderSn(order.getOrderSn());
+        }
+        orderItemDao.insertList(orderItemList);
+    }
+
+    private OmsOrder insertOmsOrder(OrderParam orderParam, OmsOrder order, List<OmsOrderItem> orderItemList, UmsMember currentMember) {
+        //根据商品合计、运费、活动优惠、优惠券、积分计算应付金额
+        order.setDiscountAmount(new BigDecimal(0));
+        order.setTotalAmount(calcTotalAmount(orderItemList));
+        order.setFreightAmount(new BigDecimal(0));
+        order.setPromotionAmount(calcPromotionAmount(orderItemList));
+        order.setPromotionInfo(getOrderPromotionInfo(orderItemList));
+        if (orderParam.getCouponId() == null) {
+            order.setCouponAmount(new BigDecimal(0));
+        } else {
+            order.setCouponId(orderParam.getCouponId());
+            order.setCouponAmount(calcCouponAmount(orderItemList));
+        }
+        if (orderParam.getUseIntegration() == null) {
+            order.setIntegration(0);
+            order.setIntegrationAmount(new BigDecimal(0));
+        } else {
+            order.setIntegration(orderParam.getUseIntegration());
+            order.setIntegrationAmount(calcIntegrationAmount(orderItemList));
+        }
+        order.setPayAmount(calcPayAmount(order));
+        //转化为订单信息并插入数据库
+        order.setMemberId(currentMember.getId());
+        order.setCreateTime(new Date());
+        order.setMemberUsername(currentMember.getNickname());
+        //支付方式:0->未支付;1->支付宝;2->微信
+        order.setPayType(orderParam.getPayType());
+        //订单来源:0->PC订单;1->app订单
+        order.setSourceType(1);
+        //订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
+        order.setStatus(0);
+        //订单类型:0->正常订单;1->秒杀订单
+        order.setOrderType(0);
+        //收货人信息:姓名、电话、邮编、地址
+        UmsMemberReceiveAddress address = memberReceiveAddressService.getItem(orderParam.getMemberReceiveAddressId());
+        order.setReceiverName(address.getName());
+        order.setReceiverPhone(address.getPhoneNumber());
+        order.setReceiverPostCode(address.getPostCode());
+        order.setReceiverProvince(address.getProvince());
+        order.setReceiverCity(address.getCity());
+        order.setReceiverRegion(address.getRegion());
+        order.setReceiverDetailAddress(address.getDetailAddress());
+        //0->未确认;1->已确认
+        order.setConfirmStatus(0);
+        order.setDeleteStatus(0);
+        //计算赠送积分
+        order.setIntegration(calcGifIntegration(orderItemList));
+        //计算赠送成长值
+        order.setGrowth(calcGiftGrowth(orderItemList));
+        //生成订单号
+        order.setOrderSn(generateOrderSn(order));
+        //设置自动收货天数
+        List<OmsOrderSetting> orderSettings = orderSettingMapper.selectByExample(new OmsOrderSettingExample());
+        if (CollUtil.isNotEmpty(orderSettings)) {
+            order.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());
+        }
+        // TODO: 2018/9/3 bill_*,delivery_*
+        //插入order表和order_item表
+        orderMapper.insert(order);
+        return order;
+    }
+
+    private void deduction(OrderParam orderParam, List<OmsOrderItem> orderItemList, UmsMember currentMember, List<CartPromotionItem> cartPromotionItemList) {
+        //判断使用使用了优惠券
+        if (orderParam.getCouponId() == null) {
+            //不用优惠券
+            for (OmsOrderItem orderItem : orderItemList) {
+                orderItem.setCouponAmount(new BigDecimal(0));
+            }
+        } else {
+            //使用优惠券
+            SmsCouponHistoryDetail couponHistoryDetail = getUseCoupon(cartPromotionItemList, orderParam.getCouponId());
+            if (couponHistoryDetail == null) {
+                Asserts.fail("该优惠券不可用");
+            }
+            //对下单商品的优惠券进行处理
+            handleCouponAmount(orderItemList, couponHistoryDetail);
+        }
+        //判断是否使用积分
+        if (orderParam.getUseIntegration() == null || orderParam.getUseIntegration().equals(0)) {
+            //不使用积分
+            for (OmsOrderItem orderItem : orderItemList) {
+                orderItem.setIntegrationAmount(new BigDecimal(0));
+            }
+        } else {
+            //使用积分
+            BigDecimal totalAmount = calcTotalAmount(orderItemList);
+            BigDecimal integrationAmount = getUseIntegrationAmount(orderParam.getUseIntegration(), totalAmount, currentMember, orderParam.getCouponId() != null);
+            if (integrationAmount.compareTo(new BigDecimal(0)) == 0) {
+                Asserts.fail("积分不可用");
+            } else {
+                //可用情况下分摊到可用商品中
+                for (OmsOrderItem orderItem : orderItemList) {
+                    BigDecimal perAmount = orderItem.getProductPrice().divide(totalAmount, 3, RoundingMode.HALF_EVEN).multiply(integrationAmount);
+                    orderItem.setIntegrationAmount(perAmount);
+                }
+            }
+        }
+    }
+
+    private List<CartPromotionItem> getCartPromotionItems(OrderParam orderParam, List<OmsOrderItem> orderItemList, UmsMember currentMember) {
+        List<CartPromotionItem> cartPromotionItemList = listPromotion(currentMember.getId(), orderParam.getCartIds());
+        for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
+            //生成下单商品信息
+            OmsOrderItem orderItem = new OmsOrderItem();
+            orderItem.setProductId(cartPromotionItem.getProductId());
+            orderItem.setProductName(cartPromotionItem.getProductName());
+            orderItem.setProductPic(cartPromotionItem.getProductPic());
+            orderItem.setProductAttr(cartPromotionItem.getProductAttr());
+            orderItem.setProductBrand(cartPromotionItem.getProductBrand());
+            orderItem.setProductSn(cartPromotionItem.getProductSn());
+            orderItem.setProductPrice(cartPromotionItem.getPrice());
+            orderItem.setProductQuantity(cartPromotionItem.getQuantity());
+            orderItem.setProductSkuId(cartPromotionItem.getProductSkuId());
+            orderItem.setProductSkuCode(cartPromotionItem.getProductSkuCode());
+            orderItem.setProductCategoryId(cartPromotionItem.getProductCategoryId());
+            orderItem.setPromotionAmount(cartPromotionItem.getReduceAmount());
+            orderItem.setPromotionName(cartPromotionItem.getPromotionMessage());
+            orderItem.setGiftIntegration(cartPromotionItem.getIntegration());
+            orderItem.setGiftGrowth(cartPromotionItem.getGrowth());
+            orderItemList.add(orderItem);
+        }
+        return cartPromotionItemList;
+    }
+
+    /**
+     * 对没满足优惠条件的商品进行处理
+     */
+    private void handleNoReduce(List<CartPromotionItem> cartPromotionItemList, List<OmsCartItem> itemList, PromotionProduct promotionProduct) {
+        for (OmsCartItem item : itemList) {
+            CartPromotionItem cartPromotionItem = new CartPromotionItem();
+            BeanUtils.copyProperties(item, cartPromotionItem);
+            cartPromotionItem.setPromotionMessage("无优惠");
+            cartPromotionItem.setReduceAmount(new BigDecimal(0));
+            cartPromotionItem.setRealStock(promotionProduct.getStock() - promotionProduct.getLowStock());
+            cartPromotionItem.setIntegration(promotionProduct.getGiftPoint());
+            cartPromotionItem.setGrowth(promotionProduct.getGiftGrowth());
+            cartPromotionItemList.add(cartPromotionItem);
+        }
+    }
+
+    @Autowired
+    private OmsCartItemMapper cartItemMapper;
 
+    private int cartSave(OmsCartItem cartItem) {
+        int count;
+        UmsMember currentMember = memberService.getCurrentMember();
+        cartItem.setMemberId(currentMember.getId());
+        cartItem.setMemberNickname(currentMember.getNickname());
+        cartItem.setDeleteStatus(0);
+        cartItem.setCreateDate(new Date());
+        count = cartItemMapper.insert(cartItem);
+        return count;
     }
 
+
     /**
      * 生成18位订单编号:8位日期+2位平台号码+2位支付方式+6位以上自增id
      */
@@ -701,7 +964,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
      * @param couponId              使用优惠券id
      */
     private SmsCouponHistoryDetail getUseCoupon(List<CartPromotionItem> cartPromotionItemList, Long couponId) {
-        List<SmsCouponHistoryDetail> couponHistoryDetailList = couponService.listCart(cartPromotionItemList,  memberUtil.getRedisUmsMember(request).getId(),1);
+        List<SmsCouponHistoryDetail> couponHistoryDetailList = couponService.listCart(cartPromotionItemList, memberUtil.getRedisUmsMember(request).getId(), 1);
         for (SmsCouponHistoryDetail couponHistoryDetail : couponHistoryDetailList) {
             if (couponHistoryDetail.getCoupon().getId().equals(couponId)) {
                 return couponHistoryDetail;
@@ -731,6 +994,24 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
     }
 
+    /**
+     * 锁定下单商品的所有库存
+     */
+    private void lockStockByOne(List<CartPromotionItem> cartPromotionItemList, OrderFrom orderFrom) {
+        for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
+            PmsProduct record = new PmsProduct();
+            PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(cartPromotionItem.getProductId());
+            Integer stock = pmsProduct.getStock();
+            Integer bayNum = orderFrom.getBayNum();
+            if (stock.intValue() < bayNum.intValue()) {
+                Asserts.fail("库存不足,无法下单");
+            }
+            pmsProduct.setStock(stock - bayNum);
+            pmsProductMapper.updateByPrimaryKey(record);
+        }
+    }
+
+
     /**
      * 判断下单商品是否都有库存
      */

+ 103 - 0
forest-portal/portal-server/src/main/java/com/hwrj/cloud/portal/service/impl/OmsPromotionServiceImpl.java

@@ -113,6 +113,90 @@ public class OmsPromotionServiceImpl implements OmsPromotionService {
         return cartPromotionItemList;
     }
 
+    @Override
+    public List<CartPromotionItem> calcCartPromotionByOne(List<OmsCartItem> cartItemList) {
+        //1.先根据productId对CartItem进行分组,以spu为单位进行计算优惠
+        Map<Long, List<OmsCartItem>> productCartMap = groupCartItemBySpu(cartItemList);
+        //2.查询所有商品的优惠相关信息
+        List<PromotionProduct> promotionProductList = getPromotionProductList(cartItemList);
+        //3.根据商品促销类型计算商品促销优惠价格
+        List<CartPromotionItem> cartPromotionItemList = new ArrayList<>();
+        for (Map.Entry<Long, List<OmsCartItem>> entry : productCartMap.entrySet()) {
+            Long productId = entry.getKey();
+            PromotionProduct promotionProduct = getPromotionProductById(productId, promotionProductList);
+            List<OmsCartItem> itemList = entry.getValue();
+            Integer promotionType = promotionProduct.getPromotionType();
+            if (promotionType == 1) {
+                //单品促销
+                for (OmsCartItem item : itemList) {
+                    CartPromotionItem cartPromotionItem = new CartPromotionItem();
+                    BeanUtils.copyProperties(item,cartPromotionItem);
+                    cartPromotionItem.setPromotionMessage("单品促销");
+                    //商品原价-促销价
+                    PmsSkuStock skuStock = getOriginalPrice(promotionProduct, item.getProductSkuId());
+                    BigDecimal originalPrice = skuStock.getPrice();
+                    //单品促销使用原价
+                    cartPromotionItem.setPrice(originalPrice);
+                    cartPromotionItem.setReduceAmount(originalPrice.subtract(skuStock.getPromotionPrice()));
+                    cartPromotionItem.setRealStock(skuStock.getStock()-skuStock.getLockStock());
+                    cartPromotionItem.setIntegration(promotionProduct.getGiftPoint());
+                    cartPromotionItem.setGrowth(promotionProduct.getGiftGrowth());
+                    cartPromotionItemList.add(cartPromotionItem);
+                }
+            } else if (promotionType == 3) {
+                //打折优惠
+                int count = getCartItemCount(itemList);
+                PmsProductLadder ladder = getProductLadder(count, promotionProduct.getProductLadderList());
+                if(ladder!=null){
+                    for (OmsCartItem item : itemList) {
+                        CartPromotionItem cartPromotionItem = new CartPromotionItem();
+                        BeanUtils.copyProperties(item,cartPromotionItem);
+                        String message = getLadderPromotionMessage(ladder);
+                        cartPromotionItem.setPromotionMessage(message);
+                        //商品原价-折扣*商品原价
+                        PmsSkuStock skuStock = getOriginalPrice(promotionProduct,item.getProductSkuId());
+                        BigDecimal originalPrice = skuStock.getPrice();
+                        BigDecimal reduceAmount = originalPrice.subtract(ladder.getDiscount().multiply(originalPrice));
+                        cartPromotionItem.setReduceAmount(reduceAmount);
+                        cartPromotionItem.setRealStock(skuStock.getStock()-skuStock.getLockStock());
+                        cartPromotionItem.setIntegration(promotionProduct.getGiftPoint());
+                        cartPromotionItem.setGrowth(promotionProduct.getGiftGrowth());
+                        cartPromotionItemList.add(cartPromotionItem);
+                    }
+                }else{
+                    handleNoReduce(cartPromotionItemList,itemList,promotionProduct);
+                }
+            } else if (promotionType == 4) {
+                //满减
+                BigDecimal totalAmount= getCartItemAmount(itemList,promotionProductList);
+                PmsProductFullReduction fullReduction = getProductFullReduction(totalAmount,promotionProduct.getProductFullReductionList());
+                if(fullReduction!=null){
+                    for (OmsCartItem item : itemList) {
+                        CartPromotionItem cartPromotionItem = new CartPromotionItem();
+                        BeanUtils.copyProperties(item,cartPromotionItem);
+                        String message = getFullReductionPromotionMessage(fullReduction);
+                        cartPromotionItem.setPromotionMessage(message);
+                        //(商品原价/总价)*满减金额
+                        PmsSkuStock skuStock= getOriginalPrice(promotionProduct, item.getProductSkuId());
+                        BigDecimal originalPrice = skuStock.getPrice();
+                        BigDecimal reduceAmount = originalPrice.divide(totalAmount,RoundingMode.HALF_EVEN).multiply(fullReduction.getReducePrice());
+                        cartPromotionItem.setReduceAmount(reduceAmount);
+                        cartPromotionItem.setRealStock(skuStock.getStock()-skuStock.getLockStock());
+                        cartPromotionItem.setIntegration(promotionProduct.getGiftPoint());
+                        cartPromotionItem.setGrowth(promotionProduct.getGiftGrowth());
+                        cartPromotionItemList.add(cartPromotionItem);
+                    }
+                }else{
+                    handleNoReduce(cartPromotionItemList,itemList,promotionProduct);
+                }
+            } else {
+                //无优惠
+                handleNoReduceByOne(cartPromotionItemList, itemList,promotionProduct);
+            }
+        }
+        return cartPromotionItemList;
+    }
+
     /**
      * 查询所有商品的优惠相关信息
      */
@@ -159,6 +243,25 @@ public class OmsPromotionServiceImpl implements OmsPromotionService {
         return sb.toString();
     }
 
+    /**
+     * 对没满足优惠条件的商品进行处理
+     */
+    private void handleNoReduceByOne(List<CartPromotionItem> cartPromotionItemList, List<OmsCartItem> itemList,PromotionProduct promotionProduct) {
+        for (OmsCartItem item : itemList) {
+            CartPromotionItem cartPromotionItem = new CartPromotionItem();
+            BeanUtils.copyProperties(item,cartPromotionItem);
+            cartPromotionItem.setPromotionMessage("无优惠");
+            cartPromotionItem.setReduceAmount(new BigDecimal(0));
+            PmsSkuStock skuStock = getOriginalPrice(promotionProduct,item.getProductSkuId());
+            if(skuStock!=null){
+                cartPromotionItem.setRealStock(promotionProduct.getStock()-promotionProduct.getLowStock());
+            }
+            cartPromotionItem.setIntegration(promotionProduct.getGiftPoint());
+            cartPromotionItem.setGrowth(promotionProduct.getGiftGrowth());
+            cartPromotionItemList.add(cartPromotionItem);
+        }
+    }
+
     /**
      * 对没满足优惠条件的商品进行处理
      */