|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 判断下单商品是否都有库存
|
|
|
*/
|