Ver código fonte

fix: 小程序下单接口改造

luofeiyun 2 semanas atrás
pai
commit
563d1b7b9c

+ 1 - 1
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/app/voyage/vo/AppPriceVoyageRespVO.java

@@ -70,7 +70,7 @@ public class AppPriceVoyageRespVO {
 
     @Schema(description = "基准价格", example = "100")
     @ExcelProperty("基准价格")
-    private BigDecimal price;
+    private BigDecimal basicPrice;
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")

+ 12 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/pricevoyage/PriceVoyageServiceImpl.java

@@ -19,6 +19,7 @@ import com.yc.ship.module.product.dal.dataobject.priceroommodeltype.PriceRoomMod
 import com.yc.ship.module.product.dal.dataobject.pricesinglesetting.PriceSingleSettingDO;
 import com.yc.ship.module.product.dal.dataobject.pricespu.PriceSpuDO;
 import com.yc.ship.module.product.dal.dataobject.pricevoyage.PriceVoyageDO;
+import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
 import com.yc.ship.module.product.dal.mysql.basicpricearea.BasicPriceAreaMapper;
 import com.yc.ship.module.product.dal.mysql.pricearea.PriceAreaMapper;
 import com.yc.ship.module.product.dal.mysql.pricefloor.PriceFloorMapper;
@@ -27,10 +28,12 @@ import com.yc.ship.module.product.dal.mysql.priceroommodeltype.PriceRoomModelTyp
 import com.yc.ship.module.product.dal.mysql.pricesinglesetting.PriceSingleSettingMapper;
 import com.yc.ship.module.product.dal.mysql.pricespu.PriceSpuMapper;
 import com.yc.ship.module.product.dal.mysql.pricevoyage.PriceVoyageMapper;
+import com.yc.ship.module.product.dal.mysql.voyage.VoyageMapper;
 import com.yc.ship.module.product.enums.ErrorCodeConstants;
 import com.yc.ship.module.product.service.pricearea.PriceAreaService;
 import com.yc.ship.module.product.service.priceroommodel.PriceRoomModelService;
 import com.yc.ship.module.product.service.pricespu.PriceSpuService;
+import com.yc.ship.module.product.service.voyage.VoyageService;
 import com.yc.ship.module.resource.controller.admin.roommodel.vo.ResourceRoomModelRespVO;
 import com.yc.ship.module.resource.dal.dataobject.roommodel.ResourceRoomModelDO;
 import com.yc.ship.module.resource.service.roommodel.ResourceRoomModelService;
@@ -91,6 +94,9 @@ public class PriceVoyageServiceImpl implements PriceVoyageService {
     @Resource
     private PriceAreaService priceAreaService;
 
+    @Resource
+    private VoyageMapper voyageMapper;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -239,6 +245,12 @@ public class PriceVoyageServiceImpl implements PriceVoyageService {
         }
         Long id = priceVoyage.getId();
         AppPriceVoyageRespVO respVO = BeanUtils.toBean(priceVoyage, AppPriceVoyageRespVO.class);
+        // 设置航次信息
+        VoyageDO voyage = voyageMapper.selectById(voyageId);
+        if(voyage != null) {
+            respVO.setVoyage(BeanUtils.toBean(voyage, AppVoyageRespVO.class));
+            respVO.setVoyageName(voyage.getName());
+        }
         PriceRoomModelDO priceRoomModelDO = priceRoomModelService.getListByObjectIdAndRoomModelId(id, roomModelId);
         PriceRoomModelRespVO priceRoomModelRespVO = BeanUtils.toBean(priceRoomModelDO, PriceRoomModelRespVO.class);
         List<PriceSingleSettingDO> singleSettingDO = priceSingleSettingMapper.selectByObjectIdAndRoomModelId(id, roomModelId);

+ 1 - 25
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/vo/order/MiniTradeOrderCreateReqVO.java

@@ -7,25 +7,16 @@ import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
-@Schema(description = "旅行社交易订单创建 Request VO")
+@Schema(description = "小程序交易订单创建 Request VO")
 @Data
 public class MiniTradeOrderCreateReqVO {
 
     @Schema(description = "分销商ID", example = "MT1231312")
     private Long distributorId;
 
-    @Schema(description = "用户ID", example = "MT1231312")
-    private String userId;
-
-    @Schema(description = "客户名称")
-    private String customerName;
-
     @Schema(description = "订单联系人")
     private String linkMan;
 
-    @Schema(description = "时间")
-    private Date boardingTime;
-
     @Schema(description = "联系人手机")
     private String linkMobile;
 
@@ -38,15 +29,6 @@ public class MiniTradeOrderCreateReqVO {
     @Schema(description = "航次ID")
     private Long voyageId;
 
-    @Schema(description = "团队编号")
-    private String groupNo;
-
-    @Schema(description = "币种")
-    private String currency;
-
-    @Schema(description = "备注")
-    private String remark;
-
     @Schema(description = "是否预订单 0 否 1是")
     private Integer isYd;
 
@@ -62,12 +44,6 @@ public class MiniTradeOrderCreateReqVO {
     @Schema(description = "接站联系电话")
     private String jzLinkPhone;
 
-    @Schema(description = "门店ID", example = "123")
-    private Long storeId;
-
-    @Schema(description = "订单总额-前端修改")
-    private BigDecimal realAmount;
-
     @Schema(description = "房间房型数据")
     List<TradeOrderRoomModelVO> roomModelList;
 

+ 2 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderServiceImpl.java

@@ -580,7 +580,8 @@ public class TradeOrderServiceImpl implements TradeOrderService {
             tradeOrderDO.setConfirmDate(LocalDateTime.now());
         }
         if (tradeOrderDO.getSellMethod() == 3) {
-            tradeOrderDO.setOrderStatus(TradeOrderStatusEnum.YD.getStatus());
+            tradeOrderDO.setOrderStatus(TradeOrderStatusEnum.UNPAID.getStatus());
+            tradeOrderDO.setConfirmDate(LocalDateTime.now());
         }
         OrderJzDO orderJzDO = new OrderJzDO();
         orderJzDO.setId(IdWorker.getId());

+ 174 - 136
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/AppOtcTradeOrderServiceImpl.java

@@ -1,14 +1,26 @@
 package com.yc.ship.module.trade.service.otc.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.excel.util.DateUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.yc.ship.framework.common.lang.Asserts;
 import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.framework.common.util.object.BeanUtils;
 import com.yc.ship.framework.security.core.LoginUser;
 import com.yc.ship.module.infra.api.config.ConfigApi;
+import com.yc.ship.module.ota.api.OtaDistributorApi;
+import com.yc.ship.module.ota.api.dto.DistributorRespDTO;
 import com.yc.ship.module.product.api.ProductApi;
+import com.yc.ship.module.product.api.VoyageApi;
 import com.yc.ship.module.product.api.dto.VoyageRespDTO;
+import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
+import com.yc.ship.module.product.framework.lock.ProductRedisKeyConstants;
+import com.yc.ship.module.product.service.voyage.VoyageService;
+import com.yc.ship.module.resource.api.route.RouteApi;
+import com.yc.ship.module.resource.api.route.dto.RouteRespDTO;
+import com.yc.ship.module.resource.api.ship.ShipApi;
+import com.yc.ship.module.resource.api.ship.dto.ShipRespDTO;
 import com.yc.ship.module.trade.api.dto.TradeOrderRespDTO;
 import com.yc.ship.module.trade.controller.admin.order.vo.order.*;
 import com.yc.ship.module.trade.controller.app.otc.vo.AppTradeOrderPageReqVO;
@@ -20,13 +32,18 @@ import com.yc.ship.module.trade.dal.mysql.order.TradeOrderRoomModelMapper;
 import com.yc.ship.module.trade.dal.mysql.order.TradeOrderTotalMapper;
 import com.yc.ship.module.trade.enums.PayAccountTypeEnum;
 import com.yc.ship.module.trade.enums.SellMethodEnum;
+import com.yc.ship.module.trade.enums.TradeOrderOperateTypeEnum;
+import com.yc.ship.module.trade.framework.annotation.TradeOrderLog;
 import com.yc.ship.module.trade.service.order.TradeOrderService;
 import com.yc.ship.module.trade.service.otc.AppOtcTradeOrderService;
 import com.yc.ship.module.trade.service.otc.OtcTradeOrderService;
 import com.yc.ship.module.trade.service.pay.TradeOrderPayService;
 import lombok.extern.slf4j.Slf4j;
 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;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -35,6 +52,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import static com.yc.ship.module.trade.enums.ErrorCodeConstants.ORDER_PAY_TENAND_FAIL;
 
@@ -65,163 +83,183 @@ public class AppOtcTradeOrderServiceImpl implements AppOtcTradeOrderService {
     @Resource
     private TradeOrderRoomModelMapper tradeOrderRoomModelMapper;
 
+    @Resource
+    private OtaDistributorApi otaDistributorApi;
 
-    @Override
-    public CommonResult<OtcTradeOrderCreateRespVO> miniAppCreateOrder(LoginUser loginUser, MiniTradeOrderCreateReqVO createVO) {
-        ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO = BeanUtils.toBean(createVO, ShipTradeOrderCreateReqVO.class);
-        shipTradeOrderCreateReqVO.setGroupNo(createVO.getGroupNo());
-        shipTradeOrderCreateReqVO.setConfirmType(0);
-        shipTradeOrderCreateReqVO.setAmount(createVO.getSummary().getOrderMoney());
-        shipTradeOrderCreateReqVO.setPayAmount(createVO.getSummary().getOrderMoney());
-        shipTradeOrderCreateReqVO.setRealMoney(createVO.getSummary().getRealMoney());
-        shipTradeOrderCreateReqVO.setOtherMoney(createVO.getSummary().getOtherMoney());
-        shipTradeOrderCreateReqVO.setDiscountId(createVO.getSummary().getDiscountId());
-        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());
+    @Resource
+    private RouteApi routeApi;
 
-        shipTradeOrderCreateReqVO.setTravelDate(createVO.getBoardingTime());
-        VoyageRespDTO voyage = productApi.getVoyage(createVO.getVoyageId());
-        String date = DateUtils.format(new Date(), "yyyyMMddmmss");
-        String orderNo = "MINI" + "-" + voyage.getCode() + "-" + date;
-        shipTradeOrderCreateReqVO.setOrderNo(orderNo);
+    @Resource
+    private ShipApi shipApi;
 
-        ShipTradeOrderCreateReqVO.OrderProperty orderProperty = new ShipTradeOrderCreateReqVO.OrderProperty();
-        orderProperty.setSellMethod(SellMethodEnum.OTC.getType());
-        orderProperty.setSourceId(createVO.getUserId());
-        orderProperty.setMemberId(loginUser.getId().toString());
-        orderProperty.setSourceName("小程序用户");
-        orderProperty.setSellMethod(SellMethodEnum.MINI_APP.getType());
+    @Resource
+    private RedissonClient redissonClient;
 
-        shipTradeOrderCreateReqVO.setOrderProperty(orderProperty);
 
-        ShipTradeOrderCreateReqVO.OrderItem orderItem = new ShipTradeOrderCreateReqVO.OrderItem();
-        List<ShipTradeOrderCreateReqVO.OrderDetail> detailList = new ArrayList<>();
-        ShipTradeOrderCreateReqVO.OrderDetail orderDetail = new ShipTradeOrderCreateReqVO.OrderDetail();
-        List<ShipTradeOrderCreateReqVO.Visitor> visitorList = new ArrayList<>();
-        for (TradeVistorReqVO tradeVistorReqVO : createVO.getTourist()) {
-            ShipTradeOrderCreateReqVO.Visitor visitor = getVisitor1(tradeVistorReqVO);
-            visitorList.add(visitor);
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_CREATE)
+    public CommonResult<OtcTradeOrderCreateRespVO> miniAppCreateOrder(LoginUser loginUser, MiniTradeOrderCreateReqVO miniTradeOrderCreateReqVO) {
+        TradeOrderOtcCreateVO createVO = BeanUtils.toBean(miniTradeOrderCreateReqVO, TradeOrderOtcCreateVO.class);
+        Long distributorId = createVO.getDistributorId();
+        if(distributorId != null) {
+            DistributorRespDTO distributor = otaDistributorApi.getDistributorById(distributorId);
+            if(distributor!=null) {
+                createVO.setCustomerName(distributor.getName());
+            }
+        }
+        VoyageRespDTO voyage = productApi.getVoyage(createVO.getVoyageId());
+        if(voyage != null) {
+            createVO.setBoardingTime(com.yc.ship.framework.common.util.date.DateUtils.of(voyage.getBoardingTime()));
+            createVO.setLeaveTime(com.yc.ship.framework.common.util.date.DateUtils.of(voyage.getLeaveTime()));
+        }
+        createVO.setMoveOrder(false);
+        createVO.setCurrency("CNY");
+        createVO.setIsYd(0);
+        RouteRespDTO routeRespDTO = routeApi.queryRouteById(voyage.getRouteId());
+        ShipRespDTO ship = shipApi.queryShip(createVO.getShipId());
+        int maxOrderNo = tradeOrderService.getMaxOrderNo(createVO.getVoyageId());
+        String date = DateUtils.format(voyage.getBoardingTime(), "yyyyMMdd");
+        String code = "YC";
+        if (routeRespDTO != null && routeRespDTO.getDirection() == 2) {
+            code = "CY";
+        }
+        String orderNo;
+        if (ship.getCode() == null) {
+            orderNo = date + "-" + voyage.getCode() + "-" + (maxOrderNo + 1);
+        } else {
+            orderNo = ship.getCode() + "-" + date + "-" + code + "-" + (maxOrderNo + 1);
         }
-        orderDetail.setVisitorList(visitorList);
-        orderDetail.setCount(visitorList.size());
 
-        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 {
-                if (tradeSpuReqVO.getProductId() != null) {
-                    //有产品ID没有游客信息跳过
+        //现在给整个订单号的加锁
+        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.setMoveOrder(false);
+            shipTradeOrderCreateReqVO.setConfirmType(0);
+            shipTradeOrderCreateReqVO.setAmount(orderMoney);
+            shipTradeOrderCreateReqVO.setPayAmount(realAmount);
+            if (realOrderMoney != null) {
+                shipTradeOrderCreateReqVO.setPayAmount(realOrderMoney);
+            }
+            shipTradeOrderCreateReqVO.setRealMoney(realAmount);
+            shipTradeOrderCreateReqVO.setIsRead(0);
+            shipTradeOrderCreateReqVO.setOrderSort(maxOrderNo + 1);
+            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.MINI_APP.getType());
+            orderProperty.setSourceId(createVO.getDistributorId()+"");
+            orderProperty.setSourceName(createVO.getCustomerName());
+            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);
+                visitorDetailId.setBoardingTime(createVO.getBoardingTime());
+                visitorDetailId.setLeaveTime(createVO.getLeaveTime());
+                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);
+                } else {
                     continue;
                 }
-                orderDetail1.setProductType(0);
-            }
-            List<ShipTradeOrderCreateReqVO.Visitor> visitorList1 = new ArrayList<>();
-            if (orderDetail1.getProductType() == 0 || orderDetail1.getProductType() == 1) {
+                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 = new ShipTradeOrderCreateReqVO.Visitor();
-                    visitor.setName(tradeVistorReqVO.getName());
-                    visitor.setVid(tradeVistorReqVO.getId());
-                    visitor.setMobile(tradeVistorReqVO.getMobile());
-                    visitor.setGender(tradeVistorReqVO.getGender());
-                    visitor.setCredentialNo(tradeVistorReqVO.getCardNo());
-                    visitor.setCredentialType(tradeVistorReqVO.getCardType());
-                    visitor.setYczz(tradeVistorReqVO.getYichang());
-                    visitor.setCqzz(tradeVistorReqVO.getChongqing());
-                    visitor.setNationality(tradeVistorReqVO.getNationality());
-                    visitor.setRoomId(tradeVistorReqVO.getRoomId());
-                    visitor.setCohabitation(tradeVistorReqVO.getCohabitation());
-                    visitor.setRoomIndexId(tradeVistorReqVO.getRoomIndexId());
-                    visitor.setRoomModelId(tradeVistorReqVO.getRoomModelId());
-                    visitor.setFloor(tradeVistorReqVO.getFloor());
+                    ShipTradeOrderCreateReqVO.Visitor visitor = getVisitor1(tradeVistorReqVO);
                     visitorList1.add(visitor);
-                    spuMoney = spuMoney.add(tradeSpuReqVO.getPrice());
+                    BigDecimal price = tradeSpuReqVO.getPrice() == null ? BigDecimal.ZERO : tradeSpuReqVO.getPrice();
+                    spuMoney = spuMoney.add(price);
                 }
                 orderDetail1.setVisitorList(visitorList1);
                 orderDetail1.setProductId(tradeSpuReqVO.getProductId() + "");
                 orderDetail1.setPrice(tradeSpuReqVO.getPrice());
                 orderDetail1.setOriginPrice(tradeSpuReqVO.getPrice());
-            } else {
-                for (TradeVistorReqVO tradeVistorReqVO : createVO.getTourist()) {
-                    ShipTradeOrderCreateReqVO.Visitor visitor = new ShipTradeOrderCreateReqVO.Visitor();
-                    visitor.setName(tradeVistorReqVO.getName());
-                    visitor.setMobile(tradeVistorReqVO.getMobile());
-                    visitor.setCredentialNo(tradeVistorReqVO.getCardNo());
-                    visitor.setCredentialType(tradeVistorReqVO.getCardType());
-                    visitor.setYczz(tradeVistorReqVO.getYichang());
-                    visitor.setCqzz(tradeVistorReqVO.getChongqing());
-                    visitor.setRoomId(tradeVistorReqVO.getRoomId());
-                    visitor.setNationality(tradeVistorReqVO.getNationality());
-                    visitor.setCohabitation(tradeVistorReqVO.getCohabitation());
-                    visitor.setRoomIndexId(tradeVistorReqVO.getRoomIndexId());
-                    visitor.setRoomModelId(tradeVistorReqVO.getRoomModelId());
-                    visitor.setFloor(tradeVistorReqVO.getFloor());
-                    visitorList1.add(visitor);
-                }
-                orderDetail1.setVisitorList(visitorList1);
-                orderDetail1.setProductId(tradeSpuReqVO.getProductId() + "");
-                orderDetail1.setPrice(BigDecimal.ZERO);
-                orderDetail1.setOriginPrice(BigDecimal.ZERO);
-            }
-            orderDetail1.setCount(visitorList1.size());
-            detailList.add(orderDetail1);
-        }
-        BigDecimal price;
-        if (createVO.getSummary().getOrderMoney() != null && createVO.getSummary().getOrderMoney().compareTo(new BigDecimal(0)) > 0) {
-            price = createVO.getSummary().getOrderMoney().subtract(spuMoney).divide(new BigDecimal(visitorList.size()), 2, RoundingMode.HALF_UP);
-        } else {
-            price = new BigDecimal(0);
-        }
-        orderDetail.setPrice(price);
-        orderDetail.setOriginPrice(price);
-
-        orderDetail.setProductType(0);
-        detailList.add(orderDetail);
-
-
-        orderItem.setDetailList(detailList);
 
-        shipTradeOrderCreateReqVO.setItemlList(Collections.singletonList(orderItem));
+                orderDetail1.setCount(visitorList1.size());
+                detailList.add(orderDetail1);
+            }
+            shipTradeOrderCreateReqVO.setItemlList(Collections.singletonList(orderItem));
 
-        shipTradeOrderCreateReqVO.setSpuAmount(spuMoney);
+            shipTradeOrderCreateReqVO.setSpuAmount(spuMoney);
 
-        CommonResult<TradeOrderRespDTO> result = doShipCreateOrder(loginUser, shipTradeOrderCreateReqVO);
-        if (result.isError()) {
-            return CommonResult.error(result);
+            Date travelDate = shipTradeOrderCreateReqVO.getTravelDate();
+            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 (!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();
+            }
         }
-        TradeOrderTotalVO summary = createVO.getSummary();
-        TradeOrderTotalDO tradeOrderTotalDO = BeanUtils.toBean(summary, TradeOrderTotalDO.class);
-        Long orderId = result.getCheckedData().getOrderId();
-        tradeOrderTotalDO.setOrderId(IdWorker.getId());
-        tradeOrderTotalDO.setOldOrderId(orderId);
-        tradeOrderTotalMapper.insert(tradeOrderTotalDO);
-
-        // 创建订单房型数据
-        List<TradeOrderRoomModelDO> tradeOrderRoomList = new ArrayList<>();
-        List<TradeOrderRoomModelVO> roomModelList = createVO.getRoomModelList();
-        roomModelList.forEach(roomModel -> {
-            TradeOrderRoomModelDO tradeOrderRoomDO = BeanUtils.toBean(roomModel, TradeOrderRoomModelDO.class);
-            tradeOrderRoomDO.setOrderId(orderId);
-            tradeOrderRoomList.add(tradeOrderRoomDO);
-        });
-        tradeOrderRoomModelMapper.insertBatch(tradeOrderRoomList);
-
-        OtcTradeOrderCreateRespVO respVO = TradeOrderConvert.INSTANCE.convert(result.getData());
-        return CommonResult.success(respVO);
-
     }
 
     private CommonResult<TradeOrderRespDTO> doShipCreateOrder(LoginUser loginUser, ShipTradeOrderCreateReqVO otcTradeOrderCreateReqVO) {