Browse Source

加锁处理

igl 1 month ago
parent
commit
e279101537

+ 151 - 149
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsOrderServiceImpl.java

@@ -132,182 +132,183 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
         List<OmsOrderItem> orderItemList = new ArrayList<>();
         //获取购物车及优惠信息
         Long userId = SessionContextHolder.getId();
-        List<OmsCartItemDTO> cartPromotionItemList = new ArrayList<>();
-        if (CollectionUtils.isEmpty(orderParam.getCartIds())){
-            //生成下单商品信息
-            OmsOrderItem orderItem = new OmsOrderItem();
-            orderItem.setGoodsId(orderParam.getGoodsInfo().getGoodsId());
-            orderItem.setGoodsName(orderParam.getGoodsInfo().getGoodsName());
-            orderItem.setGoodsPic(orderParam.getGoodsInfo().getGoodsPic());
-            orderItem.setGoodsPrice(orderParam.getGoodsInfo().getPrice());
-            orderItem.setGoodsQuantity(orderParam.getGoodsInfo().getQuantity());
-            orderItem.setGoodsCategoryId(orderParam.getGoodsInfo().getGoodsCategoryId());
-//            orderItem.setPromotionAmount(cartPromotionItem.getReduceAmount());
-//            orderItem.setPromotionName(cartPromotionItem.getPromotionMessage());
-            orderItem.setGiftIntegration(0L);
-            orderItem.setGiftGrowth(0);
-            Long merchantId = goodsService.queryMerchantIdByGoodId(orderItem.getGoodsId());
-            orderItem.setMerchantId(merchantId);
-            orderItemList.add(orderItem);
-        }else{
-            cartPromotionItemList = omsCartItemService.listPromotion(orderParam.getCartIds());
-            for (OmsCartItemDTO cartPromotionItem : cartPromotionItemList) {
+        synchronized (String.valueOf(userId).intern()){
+            List<OmsCartItemDTO> cartPromotionItemList = new ArrayList<>();
+            if (CollectionUtils.isEmpty(orderParam.getCartIds())){
                 //生成下单商品信息
                 OmsOrderItem orderItem = new OmsOrderItem();
-                orderItem.setGoodsId(cartPromotionItem.getGoodsId());
-                orderItem.setGoodsName(cartPromotionItem.getGoodsName());
-                orderItem.setGoodsPic(cartPromotionItem.getGoodsPic());
-                orderItem.setGoodsAttr(cartPromotionItem.getGoodsAttr());
-                orderItem.setGoodsBrand(cartPromotionItem.getGoodsBrand());
-                orderItem.setGoodsSn(cartPromotionItem.getGoodsSn());
-                orderItem.setGoodsPrice(cartPromotionItem.getPrice());
-                orderItem.setGoodsQuantity(cartPromotionItem.getQuantity());
-                orderItem.setGoodsSkuId(cartPromotionItem.getGoodsSkuId());
-                orderItem.setGoodsSkuCode(cartPromotionItem.getGoodsSkuCode());
-                orderItem.setGoodsCategoryId(cartPromotionItem.getGoodsCategoryId());
+                orderItem.setGoodsId(orderParam.getGoodsInfo().getGoodsId());
+                orderItem.setGoodsName(orderParam.getGoodsInfo().getGoodsName());
+                orderItem.setGoodsPic(orderParam.getGoodsInfo().getGoodsPic());
+                orderItem.setGoodsPrice(orderParam.getGoodsInfo().getPrice());
+                orderItem.setGoodsQuantity(orderParam.getGoodsInfo().getQuantity());
+                orderItem.setGoodsCategoryId(orderParam.getGoodsInfo().getGoodsCategoryId());
 //            orderItem.setPromotionAmount(cartPromotionItem.getReduceAmount());
 //            orderItem.setPromotionName(cartPromotionItem.getPromotionMessage());
                 orderItem.setGiftIntegration(0L);
                 orderItem.setGiftGrowth(0);
-                orderItem.setMerchantId(cartPromotionItem.getMerchantId());
+                Long merchantId = goodsService.queryMerchantIdByGoodId(orderItem.getGoodsId());
+                orderItem.setMerchantId(merchantId);
                 orderItemList.add(orderItem);
+            }else{
+                cartPromotionItemList = omsCartItemService.listPromotion(orderParam.getCartIds());
+                for (OmsCartItemDTO cartPromotionItem : cartPromotionItemList) {
+                    //生成下单商品信息
+                    OmsOrderItem orderItem = new OmsOrderItem();
+                    orderItem.setGoodsId(cartPromotionItem.getGoodsId());
+                    orderItem.setGoodsName(cartPromotionItem.getGoodsName());
+                    orderItem.setGoodsPic(cartPromotionItem.getGoodsPic());
+                    orderItem.setGoodsAttr(cartPromotionItem.getGoodsAttr());
+                    orderItem.setGoodsBrand(cartPromotionItem.getGoodsBrand());
+                    orderItem.setGoodsSn(cartPromotionItem.getGoodsSn());
+                    orderItem.setGoodsPrice(cartPromotionItem.getPrice());
+                    orderItem.setGoodsQuantity(cartPromotionItem.getQuantity());
+                    orderItem.setGoodsSkuId(cartPromotionItem.getGoodsSkuId());
+                    orderItem.setGoodsSkuCode(cartPromotionItem.getGoodsSkuCode());
+                    orderItem.setGoodsCategoryId(cartPromotionItem.getGoodsCategoryId());
+//            orderItem.setPromotionAmount(cartPromotionItem.getReduceAmount());
+//            orderItem.setPromotionName(cartPromotionItem.getPromotionMessage());
+                    orderItem.setGiftIntegration(0L);
+                    orderItem.setGiftGrowth(0);
+                    orderItem.setMerchantId(cartPromotionItem.getMerchantId());
+                    orderItemList.add(orderItem);
+                }
             }
-        }
-        //判断购物车中商品是否都有库存
+            //判断购物车中商品是否都有库存
 //        if (!hasStock(cartPromotionItemList)) {
 //            Asserts.fail("库存不足,无法下单");
 //        }
-        //判断使用使用了优惠券
-        boolean flag = false;
-        if (orderParam.getUserCouponId() == null) {
-            //不用优惠券
-            for (OmsOrderItem orderItem : orderItemList) {
-                orderItem.setCouponAmount(new BigDecimal(0));
-            }
-        } else {
-            UserCoupon coupon = userCouponService.checkUseCoupon(orderParam.getUserCouponId(), userId);
-            if (coupon == null) {
-                Asserts.check(true, "该优惠券不可用");
-            }
-            //对下单商品的优惠券进行处理
-            assert coupon != null;
-            flag = handleCouponAmount(orderItemList, coupon);
-        }
-        //判断是否使用积分
-        if (orderParam.getUseIntegration() == null || orderParam.getUseIntegration().equals(0)) {
-            //不使用积分
-            for (OmsOrderItem orderItem : orderItemList) {
-                orderItem.setIntegrationAmount(new BigDecimal(0));
+            //判断使用使用了优惠券
+            boolean flag = false;
+            if (orderParam.getUserCouponId() == null) {
+                //不用优惠券
+                for (OmsOrderItem orderItem : orderItemList) {
+                    orderItem.setCouponAmount(new BigDecimal(0));
+                }
+            } else {
+                UserCoupon coupon = userCouponService.checkUseCoupon(orderParam.getUserCouponId(), userId);
+                if (coupon == null) {
+                    Asserts.check(true, "该优惠券不可用");
+                }
+                //对下单商品的优惠券进行处理
+                assert coupon != null;
+                flag = handleCouponAmount(orderItemList, coupon);
             }
-        } else {
-            //使用积分
-            BigDecimal totalAmount = calcTotalAmount(orderItemList);
+            //判断是否使用积分
+            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.check(true,"积分不可用");
 //            } else {
-            //可用情况下分摊到可用商品中
+                //可用情况下分摊到可用商品中
 //                for (OmsOrderItemDTO orderItem : orderItemList) {
 //                    BigDecimal perAmount = orderItem.getProductPrice().divide(totalAmount, 3, RoundingMode
 //                    .HALF_EVEN).multiply(integrationAmount);
 //                    orderItem.setIntegrationAmount(perAmount);
 ////                }
 //            }
-        }
-        //计算order_item的实付金额
-        handleRealAmount(orderItemList);
-        //进行库存锁定
+            }
+            //计算order_item的实付金额
+            handleRealAmount(orderItemList);
+            //进行库存锁定
 //        lockStock(cartPromotionItemList);
-        //根据商品合计、运费、活动优惠、优惠券、积分计算应付金额
-        OmsOrder order = new OmsOrder();
-        order.setNote(orderParam.getNote());
-        order.setDiscountAmount(new BigDecimal(0));
-        order.setTotalAmount(calcTotalAmount(orderItemList));
-        order.setFreightAmount(new BigDecimal(0));
-        order.setPromotionAmount(calcPromotionAmount(orderItemList));
-        order.setPromotionInfo(getOrderPromotionInfo(orderItemList));
-        if (orderParam.getUserCouponId() == null || !flag) {
-            order.setCouponAmount(new BigDecimal(0));
-        } else {
-            order.setCouponId(orderParam.getUserCouponId());
-            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));
-        }
-        log.info("订单order:{}", order);
-        order.setPayAmount(calcPayAmount(order));
-        log.info("订单金额amount:{}", order.getPayAmount());
-        //转化为订单信息并插入数据库
-        order.setUserId(userId);
-        order.setCreateTime(new Date());
-        order.setMemberUsername(userId.toString());
-        //支付方式:0->未支付;1->支付宝;2->微信;3->首信易(微信小程序)
-        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);
-        //收货人信息:姓名、电话、邮编、地址
-        UserReceiveAddressDTO address = this.userReceiveAddressService.queryById(orderParam.getUserReceiveAddressId());
-        if (null != address){
-            order.setReceiverName(address.getReceiveName());
-            order.setReceiverPhone(address.getPhone());
-            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(0);
-        //生成订单号
-        order.setOrderSn(generateOrderSn(6));
-        order.setMerchantId(orderParam.getMerchantId());
-        order.setId(RedisContextHolder.sequence());
-        //设置自动收货天数
-        List<OmsOrderSetting> orderSettings = orderSettingService.listOrderSetting();
-        if (!CollectionUtils.isEmpty(orderSettings)) {
-            order.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());
-        }
-        //插入order表和order_item表
-        if (!this.createIgnore(order)){
+            //根据商品合计、运费、活动优惠、优惠券、积分计算应付金额
+            OmsOrder order = new OmsOrder();
+            order.setNote(orderParam.getNote());
+            order.setDiscountAmount(new BigDecimal(0));
+            order.setTotalAmount(calcTotalAmount(orderItemList));
+            order.setFreightAmount(new BigDecimal(0));
+            order.setPromotionAmount(calcPromotionAmount(orderItemList));
+            order.setPromotionInfo(getOrderPromotionInfo(orderItemList));
+            if (orderParam.getUserCouponId() == null || !flag) {
+                order.setCouponAmount(new BigDecimal(0));
+            } else {
+                order.setCouponId(orderParam.getUserCouponId());
+                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));
+            }
+            log.info("订单order:{}", order);
+            order.setPayAmount(calcPayAmount(order));
+            log.info("订单金额amount:{}", order.getPayAmount());
+            //转化为订单信息并插入数据库
+            order.setUserId(userId);
+            order.setCreateTime(new Date());
+            order.setMemberUsername(userId.toString());
+            //支付方式:0->未支付;1->支付宝;2->微信;3->首信易(微信小程序)
+            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);
+            //收货人信息:姓名、电话、邮编、地址
+            UserReceiveAddressDTO address = this.userReceiveAddressService.queryById(orderParam.getUserReceiveAddressId());
+            if (null != address){
+                order.setReceiverName(address.getReceiveName());
+                order.setReceiverPhone(address.getPhone());
+                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(0);
+            //生成订单号
             order.setOrderSn(generateOrderSn(6));
-            this.createIgnore(order);
-        }
-        for (OmsOrderItem orderItem : orderItemList) {
-            orderItem.setOrderId(order.getId());
-            orderItem.setOrderSn(order.getOrderSn());
-        }
-        omsOrderItemService.add(orderItemList);
-        omsOrderOperateHistoryService.insertOmsOrderOperateHistory(order.getId(), userId, order.getStatus());
-        //如使用优惠券更新优惠券使用状态
-        if (orderParam.getUserCouponId() != null && flag) {
-            updateCouponStatus(orderParam.getUserCouponId(), userId, 1);
-        }
-        //如使用积分需要扣除积分
+            order.setMerchantId(orderParam.getMerchantId());
+            order.setId(RedisContextHolder.sequence());
+            //设置自动收货天数
+            List<OmsOrderSetting> orderSettings = orderSettingService.listOrderSetting();
+            if (!CollectionUtils.isEmpty(orderSettings)) {
+                order.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());
+            }
+            //插入order表和order_item表
+            if (!this.createIgnore(order)){
+                order.setOrderSn(generateOrderSn(6));
+                this.createIgnore(order);
+            }
+            for (OmsOrderItem orderItem : orderItemList) {
+                orderItem.setOrderId(order.getId());
+                orderItem.setOrderSn(order.getOrderSn());
+            }
+            omsOrderItemService.add(orderItemList);
+            omsOrderOperateHistoryService.insertOmsOrderOperateHistory(order.getId(), userId, order.getStatus());
+            //如使用优惠券更新优惠券使用状态
+            if (orderParam.getUserCouponId() != null && flag) {
+                updateCouponStatus(orderParam.getUserCouponId(), userId, 1);
+            }
+            //如使用积分需要扣除积分
 //        if (orderParam.getUseIntegration() != null) {
 //            order.setUseIntegration(orderParam.getUseIntegration());
 //            memberService.updateIntegration(currentMember.getId(), currentMember.getIntegration() - orderParam
 //            .getUseIntegration());
 //        }
-        //删除购物车中的下单商品
-        deleteCartItemList(cartPromotionItemList, userId);
-        //发送延迟消息取消订单
-        sendDelayMessageCancelOrder(order.getId());
-        //调用jsapi支付逻辑
+            //删除购物车中的下单商品
+            deleteCartItemList(cartPromotionItemList, userId);
+            //发送延迟消息取消订单
+            sendDelayMessageCancelOrder(order.getId());
+            //调用jsapi支付逻辑
 //        WechatPayRequest request = new WechatPayRequest();
 //        request.setAmount(order.getPayAmount());
 //        request.setComment("商品购买");
@@ -317,9 +318,10 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
 //            throw new ResourceUnavailableException("账号未绑定微信,请联系客服");
 //        }
 //        request.setOpenid(openid);
-        //WechatPaymentHandler wechatPaymentHandler = applicationContext.getBean(WechatPaymentHandler.class);
-        //return this.wechatPaymentHandler.unifiedorder("applet", request);
-        return this.onlinePayService.order(order,orderItemList,orderParam);
+            //WechatPaymentHandler wechatPaymentHandler = applicationContext.getBean(WechatPaymentHandler.class);
+            //return this.wechatPaymentHandler.unifiedorder("applet", request);
+            return this.onlinePayService.order(order,orderItemList,orderParam);
+        }
     }
 
     @Override