Jelajahi Sumber

下单和修改订单加锁

lishiqiang 6 hari lalu
induk
melakukan
ba4782b450

+ 1 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/framework/lock/ProductRedisKeyConstants.java

@@ -8,6 +8,7 @@ public interface ProductRedisKeyConstants {
      * 给航次库存加锁的key前缀 %s为航次ID
      */
     String STOCK_REDIS_KEY_PREFIX = "product:stock:%s";
+    String ORDER_REDIS_KEY_PREFIX = "order:stock:%s";
     /**
      * 航次总库存缓存,由于退还和扣操作在同一个事务中,所以将退还后的库存设置到redis中,方便后续查询
      */

+ 328 - 304
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java

@@ -51,8 +51,8 @@ import com.yc.ship.module.product.api.dto.*;
 import com.yc.ship.module.product.controller.admin.voyage.vo.VoyageRespVO;
 import com.yc.ship.module.product.dal.dataobject.priceroommodeltype.PriceRoomModelTypeDO;
 import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
-import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeNewDO;
 import com.yc.ship.module.product.enums.DistributorOrStoreEnum;
+import com.yc.ship.module.product.framework.lock.ProductRedisKeyConstants;
 import com.yc.ship.module.product.service.priceroommodeltype.PriceRoomModelTypeService;
 import com.yc.ship.module.product.service.voyage.VoyageService;
 import com.yc.ship.module.resource.api.route.RouteApi;
@@ -105,6 +105,8 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.RegionUtil;
 import org.jetbrains.annotations.NotNull;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -115,6 +117,7 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
@@ -228,6 +231,9 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     @Resource
     private VoyageApi voyageApi;
 
+    @Resource
+    private RedissonClient redissonClient;
+
 
     public final static String AGENCY_LOGIN_INFO = "agencyLoginInfo";
 
@@ -489,7 +495,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     }
 
 
-
     @Override
     public PageResult<TradeOrderRespVO> getMiniTradeOrderPage(TradeOrderPageReqVO pageReqVO) {
         IPage<TradeOrderRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
@@ -1341,159 +1346,169 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         } else {
             orderNo = ship.getCode() + "-" + date + "-" + code + "-" + (maxOrderNo + 1);
         }
-        TradeOrderTotalVO summary = createVO.getSummary();
-        BigDecimal realAmount = summary.getRealMoney();
-        BigDecimal orderMoney = summary.getOrderMoney();
-        Long discountId = summary.getDiscountId();
-        BigDecimal realOrderMoney = summary.getRealOrderMoney();
-        BigDecimal otherMoney = summary.getOtherMoney();
-        ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO = BeanUtils.toBean(createVO, ShipTradeOrderCreateReqVO.class);
-        shipTradeOrderCreateReqVO.setDistributorId(loginUser.getDistributorId());
-        if (createVO.isMoveOrder()) {
-            shipTradeOrderCreateReqVO.setMoveOrder(true);
-        }
-        shipTradeOrderCreateReqVO.setGroupNo(createVO.getGroupNo());
-        if (orderMoney != null && realAmount != null && realAmount.compareTo(orderMoney) != 0) {
-            shipTradeOrderCreateReqVO.setAmount(orderMoney);
-            shipTradeOrderCreateReqVO.setPayAmount(realAmount);
-            shipTradeOrderCreateReqVO.setConfirmType(1);
-        } else {
-            shipTradeOrderCreateReqVO.setConfirmType(0);
-            shipTradeOrderCreateReqVO.setAmount(orderMoney);
-            shipTradeOrderCreateReqVO.setPayAmount(realAmount);
-        }
-        shipTradeOrderCreateReqVO.setDiscountId(discountId);
-        if (realOrderMoney != null) {
-            shipTradeOrderCreateReqVO.setPayAmount(realOrderMoney);
-        }
-        shipTradeOrderCreateReqVO.setRealMoney(realAmount);
-        shipTradeOrderCreateReqVO.setIsRead(0);
-        shipTradeOrderCreateReqVO.setOtherMoney(otherMoney);
-
-        ShipTradeOrderCreateReqVO.OrderUser orderUser = new ShipTradeOrderCreateReqVO.OrderUser();
-        orderUser.setContactName(createVO.getLinkMan());
-        orderUser.setMobile(createVO.getLinkMobile());
-        orderUser.setEmail(createVO.getLinkEmail());
-        shipTradeOrderCreateReqVO.setOrderUser(orderUser);
-        shipTradeOrderCreateReqVO.setRemark(createVO.getRemark());
-        shipTradeOrderCreateReqVO.setIsYd(createVO.getIsYd());
-
-        shipTradeOrderCreateReqVO.setTravelDate(createVO.getBoardingTime());
-        shipTradeOrderCreateReqVO.setOrderNo(orderNo);
-
-        ShipTradeOrderCreateReqVO.OrderProperty orderProperty = new ShipTradeOrderCreateReqVO.OrderProperty();
-        orderProperty.setSellMethod(SellMethodEnum.OTC.getType());
-        if (loginUser.getDistributorId() == null || createVO.isMoveOrder()) {
-            orderProperty.setSellMethod(SellMethodEnum.OTC_MOVE_ORDER.getType());
-        }
-        orderProperty.setSourceId(distributorDO.getId() + "");
-        orderProperty.setSourceName(distributorDO.getName());
-        if (storeInfo != null) {
-            orderProperty.setStoreId(storeInfo.getId());
-            orderProperty.setStoreName(storeInfo.getName());
-        }
-
-        shipTradeOrderCreateReqVO.setOrderProperty(orderProperty);
-
-        ShipTradeOrderCreateReqVO.OrderItem orderItem = new ShipTradeOrderCreateReqVO.OrderItem();
-        List<ShipTradeOrderCreateReqVO.OrderDetail> detailList = new ArrayList<>();
-        ShipTradeOrderCreateReqVO.OrderDetail orderDetail = new ShipTradeOrderCreateReqVO.OrderDetail();
-        for (TradeVistorReqVO tradeVistorReqVO : createVO.getTourist()) {
-            List<ShipTradeOrderCreateReqVO.Visitor> visitorList = new ArrayList<>();
-            ShipTradeOrderCreateReqVO.OrderDetail visitorDetailId = new ShipTradeOrderCreateReqVO.OrderDetail();
-            BeanUtils.copyProperties(orderDetail, ShipTradeOrderCreateReqVO.OrderDetail.class);
-            visitorDetailId.setPrice(tradeVistorReqVO.getActualPrice());
-            visitorDetailId.setOriginPrice(tradeVistorReqVO.getPrice());
-            visitorDetailId.setProductType(0);
-            ShipTradeOrderCreateReqVO.Visitor visitor = getVisitor1(tradeVistorReqVO);
-            visitorList.add(visitor);
-            visitorDetailId.setVisitorList(visitorList);
-            visitorDetailId.setCount(1);
-            detailList.add(visitorDetailId);
-        }
-        orderItem.setDetailList(detailList);
-        BigDecimal spuMoney = new BigDecimal(0);
-        for (TradeSpuReqVO tradeSpuReqVO : createVO.getSpuList()) {
-            ShipTradeOrderCreateReqVO.OrderDetail orderDetail1 = new ShipTradeOrderCreateReqVO.OrderDetail();
-            //0 游船产品 1 附加产品 2:赠票
-            if (tradeSpuReqVO.getProductId() != null && !tradeSpuReqVO.getTourist().isEmpty()) {
-                orderDetail1.setProductType(1);
-            } else if (tradeSpuReqVO.getProductId() != null && tradeSpuReqVO.getRequired() != null && tradeSpuReqVO.getRequired() == 1) {
-                orderDetail1.setProductType(2);
+        //现在给整个订单号的加锁
+        String lockKey = String.format(ProductRedisKeyConstants.ORDER_REDIS_KEY_PREFIX, orderNo);
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            lock.lock(60, TimeUnit.SECONDS);
+            TradeOrderTotalVO summary = createVO.getSummary();
+            BigDecimal realAmount = summary.getRealMoney();
+            BigDecimal orderMoney = summary.getOrderMoney();
+            Long discountId = summary.getDiscountId();
+            BigDecimal realOrderMoney = summary.getRealOrderMoney();
+            BigDecimal otherMoney = summary.getOtherMoney();
+            ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO = BeanUtils.toBean(createVO, ShipTradeOrderCreateReqVO.class);
+            shipTradeOrderCreateReqVO.setDistributorId(loginUser.getDistributorId());
+            if (createVO.isMoveOrder()) {
+                shipTradeOrderCreateReqVO.setMoveOrder(true);
+            }
+            shipTradeOrderCreateReqVO.setGroupNo(createVO.getGroupNo());
+            if (orderMoney != null && realAmount != null && realAmount.compareTo(orderMoney) != 0) {
+                shipTradeOrderCreateReqVO.setAmount(orderMoney);
+                shipTradeOrderCreateReqVO.setPayAmount(realAmount);
+                shipTradeOrderCreateReqVO.setConfirmType(1);
             } else {
-                continue;
+                shipTradeOrderCreateReqVO.setConfirmType(0);
+                shipTradeOrderCreateReqVO.setAmount(orderMoney);
+                shipTradeOrderCreateReqVO.setPayAmount(realAmount);
+            }
+            shipTradeOrderCreateReqVO.setDiscountId(discountId);
+            if (realOrderMoney != null) {
+                shipTradeOrderCreateReqVO.setPayAmount(realOrderMoney);
+            }
+            shipTradeOrderCreateReqVO.setRealMoney(realAmount);
+            shipTradeOrderCreateReqVO.setIsRead(0);
+            shipTradeOrderCreateReqVO.setOtherMoney(otherMoney);
+
+            ShipTradeOrderCreateReqVO.OrderUser orderUser = new ShipTradeOrderCreateReqVO.OrderUser();
+            orderUser.setContactName(createVO.getLinkMan());
+            orderUser.setMobile(createVO.getLinkMobile());
+            orderUser.setEmail(createVO.getLinkEmail());
+            shipTradeOrderCreateReqVO.setOrderUser(orderUser);
+            shipTradeOrderCreateReqVO.setRemark(createVO.getRemark());
+            shipTradeOrderCreateReqVO.setIsYd(createVO.getIsYd());
+
+            shipTradeOrderCreateReqVO.setTravelDate(createVO.getBoardingTime());
+            shipTradeOrderCreateReqVO.setOrderNo(orderNo);
+
+            ShipTradeOrderCreateReqVO.OrderProperty orderProperty = new ShipTradeOrderCreateReqVO.OrderProperty();
+            orderProperty.setSellMethod(SellMethodEnum.OTC.getType());
+            if (loginUser.getDistributorId() == null || createVO.isMoveOrder()) {
+                orderProperty.setSellMethod(SellMethodEnum.OTC_MOVE_ORDER.getType());
+            }
+            orderProperty.setSourceId(distributorDO.getId() + "");
+            orderProperty.setSourceName(distributorDO.getName());
+            if (storeInfo != null) {
+                orderProperty.setStoreId(storeInfo.getId());
+                orderProperty.setStoreName(storeInfo.getName());
             }
-            List<ShipTradeOrderCreateReqVO.Visitor> visitorList1 = new ArrayList<>();
-            for (String touristId : tradeSpuReqVO.getTourist()) {
-                TradeVistorReqVO tradeVistorReqVO = createVO.getTourist().stream().filter(v -> v.getId().equals(touristId)).findFirst().orElseGet(TradeVistorReqVO::new);
-                ShipTradeOrderCreateReqVO.Visitor visitor = getVisitor1(tradeVistorReqVO);
-                visitorList1.add(visitor);
 
-                visitorList1.add(visitor);
-                spuMoney = spuMoney.add(tradeSpuReqVO.getPrice());
+            shipTradeOrderCreateReqVO.setOrderProperty(orderProperty);
+
+            ShipTradeOrderCreateReqVO.OrderItem orderItem = new ShipTradeOrderCreateReqVO.OrderItem();
+            List<ShipTradeOrderCreateReqVO.OrderDetail> detailList = new ArrayList<>();
+            ShipTradeOrderCreateReqVO.OrderDetail orderDetail = new ShipTradeOrderCreateReqVO.OrderDetail();
+            for (TradeVistorReqVO tradeVistorReqVO : createVO.getTourist()) {
+                List<ShipTradeOrderCreateReqVO.Visitor> visitorList = new ArrayList<>();
+                ShipTradeOrderCreateReqVO.OrderDetail visitorDetailId = new ShipTradeOrderCreateReqVO.OrderDetail();
+                BeanUtils.copyProperties(orderDetail, ShipTradeOrderCreateReqVO.OrderDetail.class);
+                visitorDetailId.setPrice(tradeVistorReqVO.getActualPrice());
+                visitorDetailId.setOriginPrice(tradeVistorReqVO.getPrice());
+                visitorDetailId.setProductType(0);
+                ShipTradeOrderCreateReqVO.Visitor visitor = getVisitor1(tradeVistorReqVO);
+                visitorList.add(visitor);
+                visitorDetailId.setVisitorList(visitorList);
+                visitorDetailId.setCount(1);
+                detailList.add(visitorDetailId);
             }
-            orderDetail1.setVisitorList(visitorList1);
-            orderDetail1.setProductId(tradeSpuReqVO.getProductId() + "");
-            orderDetail1.setPrice(tradeSpuReqVO.getPrice());
-            orderDetail1.setOriginPrice(tradeSpuReqVO.getPrice());
+            orderItem.setDetailList(detailList);
+            BigDecimal spuMoney = new BigDecimal(0);
+            for (TradeSpuReqVO tradeSpuReqVO : createVO.getSpuList()) {
+                ShipTradeOrderCreateReqVO.OrderDetail orderDetail1 = new ShipTradeOrderCreateReqVO.OrderDetail();
+                //0 游船产品 1 附加产品 2:赠票
+                if (tradeSpuReqVO.getProductId() != null && !tradeSpuReqVO.getTourist().isEmpty()) {
+                    orderDetail1.setProductType(1);
+                } else if (tradeSpuReqVO.getProductId() != null && tradeSpuReqVO.getRequired() != null && tradeSpuReqVO.getRequired() == 1) {
+                    orderDetail1.setProductType(2);
+                } else {
+                    continue;
+                }
+                List<ShipTradeOrderCreateReqVO.Visitor> visitorList1 = new ArrayList<>();
+                for (String touristId : tradeSpuReqVO.getTourist()) {
+                    TradeVistorReqVO tradeVistorReqVO = createVO.getTourist().stream().filter(v -> v.getId().equals(touristId)).findFirst().orElseGet(TradeVistorReqVO::new);
+                    ShipTradeOrderCreateReqVO.Visitor visitor = getVisitor1(tradeVistorReqVO);
+                    visitorList1.add(visitor);
+
+                    visitorList1.add(visitor);
+                    spuMoney = spuMoney.add(tradeSpuReqVO.getPrice());
+                }
+                orderDetail1.setVisitorList(visitorList1);
+                orderDetail1.setProductId(tradeSpuReqVO.getProductId() + "");
+                orderDetail1.setPrice(tradeSpuReqVO.getPrice());
+                orderDetail1.setOriginPrice(tradeSpuReqVO.getPrice());
 
-            orderDetail1.setCount(visitorList1.size());
-            detailList.add(orderDetail1);
-        }
+                orderDetail1.setCount(visitorList1.size());
+                detailList.add(orderDetail1);
+            }
 
-        shipTradeOrderCreateReqVO.setItemlList(Collections.singletonList(orderItem));
+            shipTradeOrderCreateReqVO.setItemlList(Collections.singletonList(orderItem));
 
-        shipTradeOrderCreateReqVO.setSpuAmount(spuMoney);
+            shipTradeOrderCreateReqVO.setSpuAmount(spuMoney);
 
-        Date travelDate = shipTradeOrderCreateReqVO.getTravelDate();
-        if (loginUser.getDistributorId() != null && DateUtil.compare(DateUtil.beginOfDay(shipTradeOrderCreateReqVO.getTravelDate()), new Date()) < 0) {
-            Asserts.isTrue(false, "选择的游玩日期不能早于当前时间");
-        }
+            Date travelDate = shipTradeOrderCreateReqVO.getTravelDate();
+            if (loginUser.getDistributorId() != null && DateUtil.compare(DateUtil.beginOfDay(shipTradeOrderCreateReqVO.getTravelDate()), new Date()) < 0) {
+                Asserts.isTrue(false, "选择的游玩日期不能早于当前时间");
+            }
 
-        if (DateUtil.compare(travelDate, new Date()) < 0) {
-            Asserts.isTrue(false, "选择的游玩日期不能早于当前时间");
-        }
-        CommonResult<TradeOrderRespDTO> result;
-        try {
-            result = doShipCreateOrder(loginUser, shipTradeOrderCreateReqVO);
-        } catch (Exception e) {
-            return CommonResult.error(500, e.getMessage());
-        }
-        if (result.isError()) {
-            return CommonResult.error(result.getCode(), result.getMsg());
-        }
-        TradeOrderTotalDO tradeOrderTotalDO = BeanUtils.toBean(summary, TradeOrderTotalDO.class);
-        Long orderId = result.getCheckedData().getOrderId();
-        tradeOrderTotalDO.setOrderId(IdWorker.getId());
-        tradeOrderTotalDO.setOldOrderId(orderId);
-        tradeOrderTotalDO.setOtherRemark(summary.getOtherRemark());
-        tradeOrderTotalMapper.insert(tradeOrderTotalDO);
-
-        // 创建订单房型数据
-        List<TradeOrderRoomModelDO> tradeOrderRoomDOList = new ArrayList<>();
-        List<TradeOrderRoomModelVO> roomModelList = createVO.getRoomModelList();
-        roomModelList.forEach(roomModel -> {
-            TradeOrderRoomModelDO tradeOrderRoomDO = BeanUtils.toBean(roomModel, TradeOrderRoomModelDO.class);
-            tradeOrderRoomDO.setOrderId(orderId);
-            tradeOrderRoomDO.setOrderNo(orderNo);
-            tradeOrderRoomDO.setDiscount(tradeOrderRoomDO.getUnitPrice().subtract(tradeOrderRoomDO.getRealMoney()));
-            tradeOrderRoomDOList.add(tradeOrderRoomDO);
-        });
+            if (DateUtil.compare(travelDate, new Date()) < 0) {
+                Asserts.isTrue(false, "选择的游玩日期不能早于当前时间");
+            }
+            CommonResult<TradeOrderRespDTO> result;
+            try {
+                result = doShipCreateOrder(loginUser, shipTradeOrderCreateReqVO);
+            } catch (Exception e) {
+                return CommonResult.error(500, e.getMessage());
+            }
+            if (result.isError()) {
+                return CommonResult.error(result.getCode(), result.getMsg());
+            }
+            TradeOrderTotalDO tradeOrderTotalDO = BeanUtils.toBean(summary, TradeOrderTotalDO.class);
+            Long orderId = result.getCheckedData().getOrderId();
+            tradeOrderTotalDO.setOrderId(IdWorker.getId());
+            tradeOrderTotalDO.setOldOrderId(orderId);
+            tradeOrderTotalDO.setOtherRemark(summary.getOtherRemark());
+            tradeOrderTotalMapper.insert(tradeOrderTotalDO);
+
+            // 创建订单房型数据
+            List<TradeOrderRoomModelDO> tradeOrderRoomDOList = new ArrayList<>();
+            List<TradeOrderRoomModelVO> roomModelList = createVO.getRoomModelList();
+            roomModelList.forEach(roomModel -> {
+                TradeOrderRoomModelDO tradeOrderRoomDO = BeanUtils.toBean(roomModel, TradeOrderRoomModelDO.class);
+                tradeOrderRoomDO.setOrderId(orderId);
+                tradeOrderRoomDO.setOrderNo(orderNo);
+                tradeOrderRoomDO.setDiscount(tradeOrderRoomDO.getUnitPrice().subtract(tradeOrderRoomDO.getRealMoney()));
+                tradeOrderRoomDOList.add(tradeOrderRoomDO);
+            });
 
-        int auditType = 0;
-        BigDecimal leaderTotalMoney = summary.getLeaderTotalMoney();
-        if (leaderTotalMoney != null && leaderTotalMoney.compareTo(new BigDecimal(0)) > 0) {
-            auditType = 3;
-        }
-        if (auditType > 0 && createVO.getIsYd() != 1) {
-            tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("order_status", TradeOrderStatusEnum.TRANSFER).set("audit_status", 1).eq("id", orderId));
-        }
-        if (!tradeOrderRoomDOList.isEmpty()) {
-            tradeOrderRoomModelMapper.deleteByOrderId(orderId);
-            tradeOrderRoomModelMapper.insertBatch(tradeOrderRoomDOList);
+            int auditType = 0;
+            BigDecimal leaderTotalMoney = summary.getLeaderTotalMoney();
+            if (leaderTotalMoney != null && leaderTotalMoney.compareTo(new BigDecimal(0)) > 0) {
+                auditType = 3;
+            }
+            if (auditType > 0 && createVO.getIsYd() != 1) {
+                tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("order_status", TradeOrderStatusEnum.TRANSFER).set("audit_status", 1).eq("id", orderId));
+            }
+            if (!tradeOrderRoomDOList.isEmpty()) {
+                tradeOrderRoomModelMapper.deleteByOrderId(orderId);
+                tradeOrderRoomModelMapper.insertBatch(tradeOrderRoomDOList);
+            }
+            OtcTradeOrderCreateRespVO respVO = TradeOrderConvert.INSTANCE.convert(result.getData());
+            return CommonResult.success(respVO);
+        } finally {
+            if (lock.isHeldByCurrentThread() && lock.isLocked()) {
+                lock.unlock();
+            }
         }
-        OtcTradeOrderCreateRespVO respVO = TradeOrderConvert.INSTANCE.convert(result.getData());
-        return CommonResult.success(respVO);
     }
 
     private static ShipTradeOrderCreateReqVO.@NotNull Visitor getVisitor1(TradeVistorReqVO tradeVistorReqVO) {
@@ -1544,173 +1559,182 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         }
         int auditType = 0;
         String orderNo = tradeOrderDO.getOrderNo();
-        Date updateTime = new Date();
-        ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO = BeanUtils.toBean(createVO, ShipTradeOrderCreateReqVO.class);
-        shipTradeOrderCreateReqVO.setDistributorId(loginUser.getDistributorId());
-        shipTradeOrderCreateReqVO.setGroupNo(createVO.getGroupNo());
-        shipTradeOrderCreateReqVO.setTravelDate(tradeOrderDO.getTravelDate());
-        shipTradeOrderCreateReqVO.setOrderId(orderId);
-        shipTradeOrderCreateReqVO.setIsRead(0);
-        TradeOrderTotalVO summary = createVO.getSummary();
-        BigDecimal realAmount = summary.getRealMoney();
-        BigDecimal orderMoney = summary.getOrderMoney();
-        Long discountId = summary.getDiscountId();
-        shipTradeOrderCreateReqVO.setAmount(orderMoney);
-        shipTradeOrderCreateReqVO.setPayAmount(realAmount);
-        if ((orderMoney != null && realAmount != null && realAmount.compareTo(orderMoney) != 0) || !Objects.equals(shipTradeOrderCreateReqVO.getAmount(), tradeOrderDO.getAmount())) {
-            shipTradeOrderCreateReqVO.setConfirmType(1);
-            TradeOrderBindDO tradeOrderBindDO = new TradeOrderBindDO();
-            tradeOrderBindDO.setId(IdWorker.getId());
-            tradeOrderBindDO.setType(1);
-            tradeOrderBindDO.setBindId(orderId);
-            tradeOrderBindDO.setCustom("");
-            tradeOrderBindDO.setRemark("modify订单金额修改,订单金额:" + orderMoney + ",订单修改后实际金额:" + realAmount);
-            shipTradeOrderCreateReqVO.setTradeOrderBindDO(tradeOrderBindDO);
-        } else {
-            shipTradeOrderCreateReqVO.setConfirmType(0);
-        }
-        if (tradeOrderDO.getOrderStatus() == 6) {
-            shipTradeOrderCreateReqVO.setConfirmType(1);
-        }
-        shipTradeOrderCreateReqVO.setDiscountId(discountId);
-        if (createVO.getSummary().getRealOrderMoney() != null) {
-            shipTradeOrderCreateReqVO.setPayAmount(createVO.getSummary().getRealOrderMoney());
-        }
-        ShipTradeOrderCreateReqVO.OrderUser orderUser = new ShipTradeOrderCreateReqVO.OrderUser();
-        orderUser.setContactName(createVO.getLinkMan());
-        orderUser.setMobile(createVO.getLinkMobile());
-        orderUser.setEmail(createVO.getLinkEmail());
-        shipTradeOrderCreateReqVO.setOrderUser(orderUser);
-        shipTradeOrderCreateReqVO.setRemark(createVO.getRemark());
-        shipTradeOrderCreateReqVO.setIsYd(createVO.getIsYd());
-        shipTradeOrderCreateReqVO.setTravelDate(createVO.getBoardingTime());
-        shipTradeOrderCreateReqVO.setOrderNo(orderNo);
-
-        ShipTradeOrderCreateReqVO.OrderProperty orderProperty = new ShipTradeOrderCreateReqVO.OrderProperty();
-        orderProperty.setSellMethod(SellMethodEnum.OTC.getType());
-        orderProperty.setSourceId(distributorDO.getId() + "");
-        orderProperty.setSourceName(distributorDO.getName());
-        if (storeInfo != null) {
-            orderProperty.setStoreId(storeInfo.getId());
-            orderProperty.setStoreName(storeInfo.getName());
-        }
-        orderProperty.setSellMethod(SellMethodEnum.OTC.getType());
-        shipTradeOrderCreateReqVO.setOrderProperty(orderProperty);
-        ShipTradeOrderCreateReqVO.OrderItem orderItem = new ShipTradeOrderCreateReqVO.OrderItem();
-        List<ShipTradeOrderCreateReqVO.OrderDetail> detailList = new ArrayList<>();
-        ShipTradeOrderCreateReqVO.OrderDetail orderDetail = new ShipTradeOrderCreateReqVO.OrderDetail();
-        for (TradeVistorReqVO tradeVistorReqVO : createVO.getTourist()) {
-            List<ShipTradeOrderCreateReqVO.Visitor> visitorList = new ArrayList<>();
-            ShipTradeOrderCreateReqVO.OrderDetail visitorDetailId = new ShipTradeOrderCreateReqVO.OrderDetail();
-            BeanUtils.copyProperties(orderDetail, ShipTradeOrderCreateReqVO.OrderDetail.class);
-            visitorDetailId.setPrice(tradeVistorReqVO.getPrice());
-            visitorDetailId.setOriginPrice(tradeVistorReqVO.getPrice());
-            visitorDetailId.setProductType(0);
-            ShipTradeOrderCreateReqVO.Visitor visitor = getVisitor1(tradeVistorReqVO);
-            visitorList.add(visitor);
-            visitorDetailId.setVisitorList(visitorList);
-            visitorDetailId.setCount(1);
-            visitorDetailId.setPrice(tradeVistorReqVO.getActualPrice());
-            visitorDetailId.setOriginPrice(tradeVistorReqVO.getPrice());
-            visitorDetailId.setProductType(0);
-            detailList.add(visitorDetailId);
-        }
-        BigDecimal spuMoney = new BigDecimal(0);
-        for (TradeSpuReqVO tradeSpuReqVO : createVO.getSpuList()) {
-            ShipTradeOrderCreateReqVO.OrderDetail orderDetail1 = new ShipTradeOrderCreateReqVO.OrderDetail();
-            //0 游船产品 1 附加产品 2:赠票
-            if (tradeSpuReqVO.getProductId() != null && !tradeSpuReqVO.getTourist().isEmpty()) {
-                orderDetail1.setProductType(1);
-            } else if (tradeSpuReqVO.getProductId() != null && tradeSpuReqVO.getRequired() != null && tradeSpuReqVO.getRequired() == 1) {
-                orderDetail1.setProductType(2);
+        //现在给整个订单号的加锁
+        String lockKey = String.format(ProductRedisKeyConstants.ORDER_REDIS_KEY_PREFIX, orderNo);
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            lock.lock(60, TimeUnit.SECONDS);
+            Date updateTime = new Date();
+            ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO = BeanUtils.toBean(createVO, ShipTradeOrderCreateReqVO.class);
+            shipTradeOrderCreateReqVO.setDistributorId(loginUser.getDistributorId());
+            shipTradeOrderCreateReqVO.setGroupNo(createVO.getGroupNo());
+            shipTradeOrderCreateReqVO.setTravelDate(tradeOrderDO.getTravelDate());
+            shipTradeOrderCreateReqVO.setOrderId(orderId);
+            shipTradeOrderCreateReqVO.setIsRead(0);
+            TradeOrderTotalVO summary = createVO.getSummary();
+            BigDecimal realAmount = summary.getRealMoney();
+            BigDecimal orderMoney = summary.getOrderMoney();
+            Long discountId = summary.getDiscountId();
+            shipTradeOrderCreateReqVO.setAmount(orderMoney);
+            shipTradeOrderCreateReqVO.setPayAmount(realAmount);
+            if ((orderMoney != null && realAmount != null && realAmount.compareTo(orderMoney) != 0) || !Objects.equals(shipTradeOrderCreateReqVO.getAmount(), tradeOrderDO.getAmount())) {
+                shipTradeOrderCreateReqVO.setConfirmType(1);
+                TradeOrderBindDO tradeOrderBindDO = new TradeOrderBindDO();
+                tradeOrderBindDO.setId(IdWorker.getId());
+                tradeOrderBindDO.setType(1);
+                tradeOrderBindDO.setBindId(orderId);
+                tradeOrderBindDO.setCustom("");
+                tradeOrderBindDO.setRemark("modify订单金额修改,订单金额:" + orderMoney + ",订单修改后实际金额:" + realAmount);
+                shipTradeOrderCreateReqVO.setTradeOrderBindDO(tradeOrderBindDO);
             } else {
-                continue;
+                shipTradeOrderCreateReqVO.setConfirmType(0);
+            }
+            if (tradeOrderDO.getOrderStatus() == 6) {
+                shipTradeOrderCreateReqVO.setConfirmType(1);
+            }
+            shipTradeOrderCreateReqVO.setDiscountId(discountId);
+            if (createVO.getSummary().getRealOrderMoney() != null) {
+                shipTradeOrderCreateReqVO.setPayAmount(createVO.getSummary().getRealOrderMoney());
             }
-            List<ShipTradeOrderCreateReqVO.Visitor> visitorList1 = new ArrayList<>();
-            for (String touristId : tradeSpuReqVO.getTourist()) {
-                TradeVistorReqVO tradeVistorReqVO = createVO.getTourist().stream().filter(v -> v.getId().equals(touristId)).findFirst().orElseGet(TradeVistorReqVO::new);
+            ShipTradeOrderCreateReqVO.OrderUser orderUser = new ShipTradeOrderCreateReqVO.OrderUser();
+            orderUser.setContactName(createVO.getLinkMan());
+            orderUser.setMobile(createVO.getLinkMobile());
+            orderUser.setEmail(createVO.getLinkEmail());
+            shipTradeOrderCreateReqVO.setOrderUser(orderUser);
+            shipTradeOrderCreateReqVO.setRemark(createVO.getRemark());
+            shipTradeOrderCreateReqVO.setIsYd(createVO.getIsYd());
+            shipTradeOrderCreateReqVO.setTravelDate(createVO.getBoardingTime());
+            shipTradeOrderCreateReqVO.setOrderNo(orderNo);
+
+            ShipTradeOrderCreateReqVO.OrderProperty orderProperty = new ShipTradeOrderCreateReqVO.OrderProperty();
+            orderProperty.setSellMethod(SellMethodEnum.OTC.getType());
+            orderProperty.setSourceId(distributorDO.getId() + "");
+            orderProperty.setSourceName(distributorDO.getName());
+            if (storeInfo != null) {
+                orderProperty.setStoreId(storeInfo.getId());
+                orderProperty.setStoreName(storeInfo.getName());
+            }
+            orderProperty.setSellMethod(SellMethodEnum.OTC.getType());
+            shipTradeOrderCreateReqVO.setOrderProperty(orderProperty);
+            ShipTradeOrderCreateReqVO.OrderItem orderItem = new ShipTradeOrderCreateReqVO.OrderItem();
+            List<ShipTradeOrderCreateReqVO.OrderDetail> detailList = new ArrayList<>();
+            ShipTradeOrderCreateReqVO.OrderDetail orderDetail = new ShipTradeOrderCreateReqVO.OrderDetail();
+            for (TradeVistorReqVO tradeVistorReqVO : createVO.getTourist()) {
+                List<ShipTradeOrderCreateReqVO.Visitor> visitorList = new ArrayList<>();
+                ShipTradeOrderCreateReqVO.OrderDetail visitorDetailId = new ShipTradeOrderCreateReqVO.OrderDetail();
+                BeanUtils.copyProperties(orderDetail, ShipTradeOrderCreateReqVO.OrderDetail.class);
+                visitorDetailId.setPrice(tradeVistorReqVO.getPrice());
+                visitorDetailId.setOriginPrice(tradeVistorReqVO.getPrice());
+                visitorDetailId.setProductType(0);
                 ShipTradeOrderCreateReqVO.Visitor visitor = getVisitor1(tradeVistorReqVO);
-                visitorList1.add(visitor);
-                spuMoney = spuMoney.add(tradeSpuReqVO.getPrice());
+                visitorList.add(visitor);
+                visitorDetailId.setVisitorList(visitorList);
+                visitorDetailId.setCount(1);
+                visitorDetailId.setPrice(tradeVistorReqVO.getActualPrice());
+                visitorDetailId.setOriginPrice(tradeVistorReqVO.getPrice());
+                visitorDetailId.setProductType(0);
+                detailList.add(visitorDetailId);
+            }
+            BigDecimal spuMoney = new BigDecimal(0);
+            for (TradeSpuReqVO tradeSpuReqVO : createVO.getSpuList()) {
+                ShipTradeOrderCreateReqVO.OrderDetail orderDetail1 = new ShipTradeOrderCreateReqVO.OrderDetail();
+                //0 游船产品 1 附加产品 2:赠票
+                if (tradeSpuReqVO.getProductId() != null && !tradeSpuReqVO.getTourist().isEmpty()) {
+                    orderDetail1.setProductType(1);
+                } else if (tradeSpuReqVO.getProductId() != null && tradeSpuReqVO.getRequired() != null && tradeSpuReqVO.getRequired() == 1) {
+                    orderDetail1.setProductType(2);
+                } else {
+                    continue;
+                }
+                List<ShipTradeOrderCreateReqVO.Visitor> visitorList1 = new ArrayList<>();
+                for (String touristId : tradeSpuReqVO.getTourist()) {
+                    TradeVistorReqVO tradeVistorReqVO = createVO.getTourist().stream().filter(v -> v.getId().equals(touristId)).findFirst().orElseGet(TradeVistorReqVO::new);
+                    ShipTradeOrderCreateReqVO.Visitor visitor = getVisitor1(tradeVistorReqVO);
+                    visitorList1.add(visitor);
+                    spuMoney = spuMoney.add(tradeSpuReqVO.getPrice());
+                }
+                orderDetail1.setVisitorList(visitorList1);
+                orderDetail1.setProductId(tradeSpuReqVO.getProductId() + "");
+                orderDetail1.setPrice(tradeSpuReqVO.getPrice());
+                orderDetail1.setOriginPrice(tradeSpuReqVO.getPrice());
+                orderDetail1.setCount(visitorList1.size());
+                detailList.add(orderDetail1);
             }
-            orderDetail1.setVisitorList(visitorList1);
-            orderDetail1.setProductId(tradeSpuReqVO.getProductId() + "");
-            orderDetail1.setPrice(tradeSpuReqVO.getPrice());
-            orderDetail1.setOriginPrice(tradeSpuReqVO.getPrice());
-            orderDetail1.setCount(visitorList1.size());
-            detailList.add(orderDetail1);
-        }
-
-
-        orderItem.setDetailList(detailList);
-        shipTradeOrderCreateReqVO.setItemlList(Collections.singletonList(orderItem));
-        shipTradeOrderCreateReqVO.setSpuAmount(spuMoney);
-        Date travelDate = tradeOrderDO.getTravelDate();
-        if (loginUser.getDistributorId() != null && DateUtil.compare(DateUtil.beginOfDay(travelDate), DateUtil.offsetDay(new Date(), 3)) < 0) {
-            return CommonResult.error(500, "已过最晚修改时间");
-        }
-
-        if (loginUser.getDistributorId() == null && DateUtil.compare(travelDate, DateUtil.offsetDay(new Date(), -2)) < 0) {
-            return CommonResult.error(500, "已过最晚修改时间");
-        }
-        shipTradeOrderCreateReqVO.setUpdateTime(updateTime);
-        shipTradeOrderCreateReqVO.setOldtradeOrderDO(tradeOrderDO);
-        TradeOrderTotalDO oldTradeOrderTotal = tradeOrderTotalMapper.selectOne(new LambdaQueryWrapper<TradeOrderTotalDO>().eq(TradeOrderTotalDO::getOldOrderId, orderId));
-        shipTradeOrderCreateReqVO.setOldtradeOrderTotalDO(oldTradeOrderTotal);
-        TradeOrderTotalDO tradeOrderTotalDO = BeanUtils.toBean(summary, TradeOrderTotalDO.class);
 
-        String changedFields1 = com.yc.ship.module.trade.utils.BeanUtils.getChangedFields(oldTradeOrderTotal, tradeOrderTotalDO);
-        System.err.println("changedFields1=" + changedFields1);
 
-        shipTradeOrderCreateReqVO.setChangedFields1(changedFields1);
-        CommonResult<TradeOrderRespDTO> result = doShipModifyOrder(loginUser, shipTradeOrderCreateReqVO);
-        if (result.isError()) {
-            return CommonResult.error(result.getCode(), result.getMsg());
-        }
-        Long neworderId = result.getCheckedData().getOrderId();
+            orderItem.setDetailList(detailList);
+            shipTradeOrderCreateReqVO.setItemlList(Collections.singletonList(orderItem));
+            shipTradeOrderCreateReqVO.setSpuAmount(spuMoney);
+            Date travelDate = tradeOrderDO.getTravelDate();
+            if (loginUser.getDistributorId() != null && DateUtil.compare(DateUtil.beginOfDay(travelDate), DateUtil.offsetDay(new Date(), 3)) < 0) {
+                return CommonResult.error(500, "已过最晚修改时间");
+            }
 
-        tradeOrderTotalMapper.update(new LambdaUpdateWrapper<TradeOrderTotalDO>()
-                .set(TradeOrderTotalDO::getDeleted, 1)
-                .set(TradeOrderTotalDO::getUpdateTime, updateTime)
-                .eq(TradeOrderTotalDO::getOldOrderId, orderId)
-        );
-        tradeOrderTotalDO.setOrderId(IdWorker.getId());
-        tradeOrderTotalDO.setOldOrderId(neworderId);
-        tradeOrderTotalMapper.insert(tradeOrderTotalDO);
+            if (loginUser.getDistributorId() == null && DateUtil.compare(travelDate, DateUtil.offsetDay(new Date(), -2)) < 0) {
+                return CommonResult.error(500, "已过最晚修改时间");
+            }
+            shipTradeOrderCreateReqVO.setUpdateTime(updateTime);
+            shipTradeOrderCreateReqVO.setOldtradeOrderDO(tradeOrderDO);
+            TradeOrderTotalDO oldTradeOrderTotal = tradeOrderTotalMapper.selectOne(new LambdaQueryWrapper<TradeOrderTotalDO>().eq(TradeOrderTotalDO::getOldOrderId, orderId));
+            shipTradeOrderCreateReqVO.setOldtradeOrderTotalDO(oldTradeOrderTotal);
+            TradeOrderTotalDO tradeOrderTotalDO = BeanUtils.toBean(summary, TradeOrderTotalDO.class);
+
+            String changedFields1 = com.yc.ship.module.trade.utils.BeanUtils.getChangedFields(oldTradeOrderTotal, tradeOrderTotalDO);
+            System.err.println("changedFields1=" + changedFields1);
+
+            shipTradeOrderCreateReqVO.setChangedFields1(changedFields1);
+            CommonResult<TradeOrderRespDTO> result = doShipModifyOrder(loginUser, shipTradeOrderCreateReqVO);
+            if (result.isError()) {
+                return CommonResult.error(result.getCode(), result.getMsg());
+            }
+            Long neworderId = result.getCheckedData().getOrderId();
+
+            tradeOrderTotalMapper.update(new LambdaUpdateWrapper<TradeOrderTotalDO>()
+                    .set(TradeOrderTotalDO::getDeleted, 1)
+                    .set(TradeOrderTotalDO::getUpdateTime, updateTime)
+                    .eq(TradeOrderTotalDO::getOldOrderId, orderId)
+            );
+            tradeOrderTotalDO.setOrderId(IdWorker.getId());
+            tradeOrderTotalDO.setOldOrderId(neworderId);
+            tradeOrderTotalMapper.insert(tradeOrderTotalDO);
+
+            //创建订单房型数据
+            List<TradeOrderRoomModelDO> list = new ArrayList<>();
+            List<TradeOrderRoomModelVO> roomModelList = createVO.getRoomModelList();
+            roomModelList.forEach(item -> {
+                TradeOrderRoomModelDO tradeOrderRoomModelDO = BeanUtils.toBean(item, TradeOrderRoomModelDO.class);
+                tradeOrderRoomModelDO.setId(IdWorker.getId());
+                tradeOrderRoomModelDO.setOrderId(neworderId);
+                tradeOrderRoomModelDO.setDiscount(tradeOrderRoomModelDO.getUnitPrice().subtract(tradeOrderRoomModelDO.getRealMoney()));
+                tradeOrderRoomModelDO.setOrderNo(orderNo);
+                list.add(tradeOrderRoomModelDO);
+            });
 
-        //创建订单房型数据
-        List<TradeOrderRoomModelDO> list = new ArrayList<>();
-        List<TradeOrderRoomModelVO> roomModelList = createVO.getRoomModelList();
-        roomModelList.forEach(item -> {
-            TradeOrderRoomModelDO tradeOrderRoomModelDO = BeanUtils.toBean(item, TradeOrderRoomModelDO.class);
-            tradeOrderRoomModelDO.setId(IdWorker.getId());
-            tradeOrderRoomModelDO.setOrderId(neworderId);
-            tradeOrderRoomModelDO.setDiscount(tradeOrderRoomModelDO.getUnitPrice().subtract(tradeOrderRoomModelDO.getRealMoney()));
-            tradeOrderRoomModelDO.setOrderNo(orderNo);
-            list.add(tradeOrderRoomModelDO);
-        });
+            if (!Objects.equals(shipTradeOrderCreateReqVO.getAmount(), tradeOrderDO.getAmount()) && loginUser.getDistributorId() != null) {
+                auditType = 4;
+            }
+            if (!Objects.equals(shipTradeOrderCreateReqVO.getAmount(), tradeOrderDO.getAmount()) && loginUser.getDistributorId() == null) {
+                auditType = 3;
+            }
+            String msg = "";
+            if (auditType > 0 && createVO.getIsYd() != 1) {
+                AuditUserDO auditUserDO = auditUserMapper.selectOne(new LambdaQueryWrapperX<AuditUserDO>().eq(AuditUserDO::getType, auditType).eq(AuditUserDO::getDeleted, 0).orderByDesc(AuditUserDO::getCreateTime).last("limit 1"));
+                tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("audit_user", auditUserDO == null ? "" : auditUserDO.getAuditUser()).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_status", 1).eq("id", neworderId));
+                msg = "修改提交成功,等待管理员审核";
+            }
 
-        if (!Objects.equals(shipTradeOrderCreateReqVO.getAmount(), tradeOrderDO.getAmount()) && loginUser.getDistributorId() != null) {
-            auditType = 4;
-        }
-        if (!Objects.equals(shipTradeOrderCreateReqVO.getAmount(), tradeOrderDO.getAmount()) && loginUser.getDistributorId() == null) {
-            auditType = 3;
-        }
-        String msg = "";
-        if (auditType > 0 && createVO.getIsYd() != 1) {
-            AuditUserDO auditUserDO = auditUserMapper.selectOne(new LambdaQueryWrapperX<AuditUserDO>().eq(AuditUserDO::getType, auditType).eq(AuditUserDO::getDeleted, 0).orderByDesc(AuditUserDO::getCreateTime).last("limit 1"));
-            tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("audit_user", auditUserDO == null ? "" : auditUserDO.getAuditUser()).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_status", 1).eq("id", neworderId));
-            msg = "修改提交成功,等待管理员审核";
-        }
+            tradeOrderRoomModelMapper.deleteByOrderId(orderId);
+            if (!list.isEmpty()) {
+                tradeOrderRoomModelMapper.insertBatch(list);
+            }
 
-        tradeOrderRoomModelMapper.deleteByOrderId(orderId);
-        if (!list.isEmpty()) {
-            tradeOrderRoomModelMapper.insertBatch(list);
+            OtcTradeOrderCreateRespVO respVO = TradeOrderConvert.INSTANCE.convert(result.getData());
+            return CommonResult.success(respVO, msg);
+        } finally {
+            if (lock.isHeldByCurrentThread() && lock.isLocked()) {
+                lock.unlock();
+            }
         }
-
-        OtcTradeOrderCreateRespVO respVO = TradeOrderConvert.INSTANCE.convert(result.getData());
-        return CommonResult.success(respVO, msg);
-
     }
 
 
@@ -1854,10 +1878,10 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             Long roomModelId = Long.valueOf(key.split("_")[0]);
             Integer floor = Integer.valueOf(key.split("_")[1]);
             ResourceRoomModelDO roomModelDO = roomModelDOMap.get(roomModelId);
-            if(roomModelDO != null) {
-                useRoomDesList.add(useNumMap.get(key) + roomModelDO.getShowName()+"("+floor+"F)");
-            }else {
-                useRoomDesList.add(useNumMap.get(key) + "已删除房型" + "("+floor+"F)");
+            if (roomModelDO != null) {
+                useRoomDesList.add(useNumMap.get(key) + roomModelDO.getShowName() + "(" + floor + "F)");
+            } else {
+                useRoomDesList.add(useNumMap.get(key) + "已删除房型" + "(" + floor + "F)");
             }
         });
         orderRespNewVO.setUseRoomTotalDesc(String.join(",", useRoomDesList));