From c9831e0288be9a2aff7dd95aab4c90b187121762 Mon Sep 17 00:00:00 2001 From: zhh Date: Thu, 30 Aug 2018 17:27:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E5=88=86=E4=B8=8B?= =?UTF-8?q?=E5=8D=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- document/pdm/mall.pdb | 18 +++--- document/pdm/mall.pdm | 8 ++- .../controller/OmsPortalOrderController.java | 13 ++++- .../mall/portal/domain/CartPromotionItem.java | 11 +++- .../macro/mall/portal/domain/OrderParam.java | 48 ++++++++++++++++ .../portal/service/OmsPortalOrderService.java | 9 +++ .../impl/OmsPortalOrderServiceImpl.java | 55 +++++++++++++++++-- .../service/impl/OmsPromotionServiceImpl.java | 44 +++++++-------- 8 files changed, 161 insertions(+), 45 deletions(-) create mode 100644 mall-portal/src/main/java/com/macro/mall/portal/domain/OrderParam.java diff --git a/document/pdm/mall.pdb b/document/pdm/mall.pdb index 7b4e006..9bafc65 100644 --- a/document/pdm/mall.pdb +++ b/document/pdm/mall.pdb @@ -1,5 +1,5 @@ - + @@ -4937,8 +4937,8 @@ DESTINATION 0 新宋体,8,N 1522226272 1522399075 -((-31175,47728), (83441,113756)) -((83041,113356),(83041,50658),(-30550,50658),(-30550,48128)) +((-38306,47728), (83441,113756)) +((83041,113356),(83041,94555),(-37681,94555),(-37681,48128)) 1 1 12615680 @@ -5113,8 +5113,8 @@ DESTINATION 0 新宋体,8,N 1522389232 1522398872 -((28232,58216), (43845,60017)) -((28632,59617),(28632,58841),(43445,58841)) +((33605,58216), (43845,60017)) +((34005,59617),(34005,58841),(43445,58841)) 1 1 12615680 @@ -6918,7 +6918,7 @@ LABL 0 新宋体,8,N 1522398032 -1522398627 +1535615091 -1 ((22716,17129), (36336,22677)) 12615680 @@ -13949,11 +13949,11 @@ LABL 0 新宋体,8,N C1DCA2EA-AC28-420C-BFEF-FFE7F5644910 -ums_intergration_consume_setting -ums_intergration_consume_setting +ums_integration_consume_setting +ums_integration_consume_setting 1522398032 zhenghong -1522398305 +1535615091 zhenghong 积分消费设置 diff --git a/document/pdm/mall.pdm b/document/pdm/mall.pdm index 9bafc65..4ebefb1 100644 --- a/document/pdm/mall.pdm +++ b/document/pdm/mall.pdm @@ -1,5 +1,5 @@ - + @@ -7979,9 +7979,10 @@ LABL 0 新宋体,8,N stock 1521709829 zhenghong -1521709932 +1535619079 zhenghong 库存 +0 int @@ -8071,9 +8072,10 @@ LABL 0 新宋体,8,N lock_stock 1534927865 zhenghong -1534927909 +1535619073 zhenghong 锁定库存 +0 int diff --git a/mall-portal/src/main/java/com/macro/mall/portal/controller/OmsPortalOrderController.java b/mall-portal/src/main/java/com/macro/mall/portal/controller/OmsPortalOrderController.java index 509363d..9581cd7 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/controller/OmsPortalOrderController.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/controller/OmsPortalOrderController.java @@ -2,11 +2,13 @@ package com.macro.mall.portal.controller; import com.macro.mall.portal.domain.CommonResult; import com.macro.mall.portal.domain.ConfirmOrderResult; +import com.macro.mall.portal.domain.OrderParam; import com.macro.mall.portal.service.OmsPortalOrderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @@ -22,10 +24,17 @@ public class OmsPortalOrderController { @Autowired private OmsPortalOrderService portalOrderService; @ApiOperation("根据购物车信息生成确认单信息") - @RequestMapping(value = "confirmOrder",method = RequestMethod.POST) + @RequestMapping(value = "/generateConfirmOrder",method = RequestMethod.POST) @ResponseBody - public Object confirmOrder(){ + public Object generateConfirmOrder(){ ConfirmOrderResult confirmOrderResult = portalOrderService.generateConfirmOrder(); return new CommonResult().success(confirmOrderResult); } + + @ApiOperation("根据购物车信息生成订单") + @RequestMapping(value = "/generateOrder",method = RequestMethod.POST) + @ResponseBody + public Object generateOrder(@RequestBody OrderParam orderParam){ + return portalOrderService.generateOrder(orderParam); + } } diff --git a/mall-portal/src/main/java/com/macro/mall/portal/domain/CartPromotionItem.java b/mall-portal/src/main/java/com/macro/mall/portal/domain/CartPromotionItem.java index 6fda2a4..5596b18 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/domain/CartPromotionItem.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/domain/CartPromotionItem.java @@ -13,7 +13,8 @@ public class CartPromotionItem extends OmsCartItem{ private String promotionMessage; //促销活动减去的金额,针对每个商品 private BigDecimal reduceAmount; - + //商品的真实库存(剩余库存-锁定库存) + private Integer realStock; public String getPromotionMessage() { return promotionMessage; } @@ -29,4 +30,12 @@ public class CartPromotionItem extends OmsCartItem{ public void setReduceAmount(BigDecimal reduceAmount) { this.reduceAmount = reduceAmount; } + + public Integer getRealStock() { + return realStock; + } + + public void setRealStock(Integer realStock) { + this.realStock = realStock; + } } diff --git a/mall-portal/src/main/java/com/macro/mall/portal/domain/OrderParam.java b/mall-portal/src/main/java/com/macro/mall/portal/domain/OrderParam.java new file mode 100644 index 0000000..3ba2fea --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/domain/OrderParam.java @@ -0,0 +1,48 @@ +package com.macro.mall.portal.domain; + +/** + * 生成订单时传入的参数 + * Created by macro on 2018/8/30. + */ +public class OrderParam { + //收货地址id + private Long memberReceiveAddressId; + //优惠券id + private Long couponId; + //使用的积分数 + private Integer useIngegration; + //支付方式 + private Integer payType; + + public Long getMemberReceiveAddressId() { + return memberReceiveAddressId; + } + + public void setMemberReceiveAddressId(Long memberReceiveAddressId) { + this.memberReceiveAddressId = memberReceiveAddressId; + } + + public Long getCouponId() { + return couponId; + } + + public void setCouponId(Long couponId) { + this.couponId = couponId; + } + + public Integer getUseIngegration() { + return useIngegration; + } + + public void setUseIngegration(Integer useIngegration) { + this.useIngegration = useIngegration; + } + + public Integer getPayType() { + return payType; + } + + public void setPayType(Integer payType) { + this.payType = payType; + } +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/OmsPortalOrderService.java b/mall-portal/src/main/java/com/macro/mall/portal/service/OmsPortalOrderService.java index 4ff0a2d..4299528 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/service/OmsPortalOrderService.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/OmsPortalOrderService.java @@ -1,6 +1,9 @@ package com.macro.mall.portal.service; +import com.macro.mall.portal.domain.CommonResult; import com.macro.mall.portal.domain.ConfirmOrderResult; +import com.macro.mall.portal.domain.OrderParam; +import org.springframework.transaction.annotation.Transactional; /** * 前台订单管理Service @@ -11,4 +14,10 @@ public interface OmsPortalOrderService { * 根据用户购物车信息生成确认单信息 */ ConfirmOrderResult generateConfirmOrder(); + + /** + * 根据提交信息生成订单 + */ + @Transactional + CommonResult generateOrder(OrderParam orderParam); } diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java index 57adade..9038305 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java @@ -1,12 +1,9 @@ package com.macro.mall.portal.service.impl; +import com.macro.mall.mapper.PmsSkuStockMapper; import com.macro.mall.mapper.UmsIntegrationConsumeSettingMapper; -import com.macro.mall.model.UmsIntegrationConsumeSetting; -import com.macro.mall.model.UmsMember; -import com.macro.mall.model.UmsMemberReceiveAddress; -import com.macro.mall.portal.domain.CartPromotionItem; -import com.macro.mall.portal.domain.ConfirmOrderResult; -import com.macro.mall.portal.domain.SmsCouponHistoryDetail; +import com.macro.mall.model.*; +import com.macro.mall.portal.domain.*; import com.macro.mall.portal.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -30,6 +27,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService { private UmsMemberCouponService memberCouponService; @Autowired private UmsIntegrationConsumeSettingMapper integrationConsumeSettingMapper; + @Autowired + private PmsSkuStockMapper skuStockMapper; @Override public ConfirmOrderResult generateConfirmOrder() { ConfirmOrderResult result = new ConfirmOrderResult(); @@ -54,6 +53,50 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService { return result; } + @Override + public CommonResult generateOrder(OrderParam orderParam) { + //获取购物车及优惠信息 + UmsMember currentMember = memberService.getCurrentMember(); + List cartPromotionItemList = cartItemService.listPromotion(currentMember.getId()); + //判断购物车中商品是否都有库存 + if(!hasStock(cartPromotionItemList)){ + return new CommonResult().failed("库存不足,无法下单"); + } + //判断优惠券是否可用 + //可用情况下分摊到可用商品中 + //判断积分是否可用 + //可用情况下分摊到可用商品中 + //进行库存锁定 + lockStock(cartPromotionItemList); + //计算运费 + //根据商品合计、运费、活动优惠、优惠券、积分计算应付金额 + //转化为订单信息并插入数据库 + return null; + } + + /** + * 锁定下单商品的所有库存 + */ + private void lockStock(List cartPromotionItemList) { + for (CartPromotionItem cartPromotionItem : cartPromotionItemList) { + PmsSkuStock skuStock = skuStockMapper.selectByPrimaryKey(cartPromotionItem.getProductSkuId()); + skuStock.setLockStock(skuStock.getStock()+cartPromotionItem.getQuantity()); + skuStockMapper.updateByPrimaryKeySelective(skuStock); + } + } + + /** + * 判断下单商品是否都有库存 + */ + private boolean hasStock(List cartPromotionItemList) { + for (CartPromotionItem cartPromotionItem : cartPromotionItemList) { + if(cartPromotionItem.getRealStock()<=0){ + return false; + } + } + return true; + } + /** * 计算购物车中商品的价格 */ diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPromotionServiceImpl.java b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPromotionServiceImpl.java index afabf1b..73b3623 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPromotionServiceImpl.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPromotionServiceImpl.java @@ -45,8 +45,10 @@ public class OmsPromotionServiceImpl implements OmsPromotionService { BeanUtils.copyProperties(item,cartPromotionItem); cartPromotionItem.setPromotionMessage("单品促销"); //商品原价-促销价 - BigDecimal originalPrice = getOriginalPrice(promotionProduct, item.getProductSkuId()); - cartPromotionItem.setReduceAmount(originalPrice.subtract(getSinglePromotionPrice(promotionProduct, item.getProductSkuId()))); + PmsSkuStock skuStock = getOriginalPrice(promotionProduct, item.getProductSkuId()); + BigDecimal originalPrice = skuStock.getPrice(); + cartPromotionItem.setReduceAmount(originalPrice.subtract(skuStock.getPromotionPrice())); + cartPromotionItem.setRealStock(skuStock.getStock()-skuStock.getLockStock()); cartPromotionItemList.add(cartPromotionItem); } } else if (promotionType == 3) { @@ -60,13 +62,15 @@ public class OmsPromotionServiceImpl implements OmsPromotionService { String message = getLadderPromotionMessage(ladder); cartPromotionItem.setPromotionMessage(message); //商品原价-折扣金额*商品原价 - BigDecimal originalPrice = getOriginalPrice(promotionProduct, item.getProductSkuId()); + 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()); cartPromotionItemList.add(cartPromotionItem); } }else{ - handleNoReduce(cartPromotionItemList,itemList); + handleNoReduce(cartPromotionItemList,itemList,promotionProduct); } } else if (promotionType == 4) { //满减 @@ -79,17 +83,19 @@ public class OmsPromotionServiceImpl implements OmsPromotionService { String message = getFullReductionPromotionMessage(fullReduction); cartPromotionItem.setPromotionMessage(message); //(商品原价/总价)*满减金额 - BigDecimal originalPrice = getOriginalPrice(promotionProduct, item.getProductSkuId()); + 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()); cartPromotionItemList.add(cartPromotionItem); } }else{ - handleNoReduce(cartPromotionItemList,itemList); + handleNoReduce(cartPromotionItemList,itemList,promotionProduct); } } else { //无优惠 - handleNoReduce(cartPromotionItemList, itemList); + handleNoReduce(cartPromotionItemList, itemList,promotionProduct); } } return cartPromotionItemList; @@ -142,12 +148,14 @@ public class OmsPromotionServiceImpl implements OmsPromotionService { /** * 对没满足优惠条件的商品进行处理 */ - private void handleNoReduce(List cartPromotionItemList, List itemList) { + private void handleNoReduce(List cartPromotionItemList, List 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()); + cartPromotionItem.setRealStock(skuStock.getStock()-skuStock.getLockStock()); cartPromotionItemList.add(cartPromotionItem); } } @@ -221,31 +229,19 @@ public class OmsPromotionServiceImpl implements OmsPromotionService { for (OmsCartItem item : itemList) { //计算出商品原价 PromotionProduct promotionProduct = getPromotionProductById(item.getProductId(), promotionProductList); - BigDecimal price = getOriginalPrice(promotionProduct,item.getProductSkuId()); - amount = amount.add(price.multiply(new BigDecimal(item.getQuantity()))); + PmsSkuStock skuStock = getOriginalPrice(promotionProduct,item.getProductSkuId()); + amount = amount.add(skuStock.getPrice().multiply(new BigDecimal(item.getQuantity()))); } return amount; } - /** - * 获取商品的单品促销价格 - */ - private BigDecimal getSinglePromotionPrice(PromotionProduct promotionProduct, Long productSkuId) { - for (PmsSkuStock skuStock : promotionProduct.getSkuStockList()) { - if (productSkuId.equals(skuStock.getId()) ) { - return skuStock.getPromotionPrice(); - } - } - return null; - } - /** * 获取商品的原价 */ - private BigDecimal getOriginalPrice(PromotionProduct promotionProduct, Long productSkuId) { + private PmsSkuStock getOriginalPrice(PromotionProduct promotionProduct, Long productSkuId) { for (PmsSkuStock skuStock : promotionProduct.getSkuStockList()) { if (productSkuId.equals(skuStock.getId())) { - return skuStock.getPrice(); + return skuStock; } } return null;