Browse Source

下单流程

lishiqiang 1 tuần trước cách đây
mục cha
commit
5b7d692844

+ 4 - 4
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/OtcTradeOrderController.java

@@ -82,11 +82,11 @@ public class OtcTradeOrderController {
     }
 
     @RequestDecryption
-    @PostMapping("/travl/createOrder")
-    @Operation(summary = "win-窗口创建订单(旅行社支付)")
+    @PostMapping("/travl/createShipOrder")
+    @Operation(summary = "win-游船订单创建(旅行社支付)")
     @OperateLog(type = TRADE)
-    @TradeRateLimit(name = "createMoveOrder", limitNum = 2, limitTime = 5)
-    public CommonResult<OtcTradeOrderCreateRespVO> createMoveOrder(@Validated(value = WindowCreateOrderGroup.class)  @RequestBody OtcTradeOrderCreateReqVO otcTradeOrderCreateReqVO) {
+    @TradeRateLimit(name = "createShipOrder", limitNum = 2, limitTime = 5)
+    public CommonResult<OtcTradeOrderCreateRespVO> createShipOrder(@Validated(value = WindowCreateOrderGroup.class)  @RequestBody ShipTradeOrderCreateReqVO otcTradeOrderCreateReqVO) {
         return otcTradeOrderService.createMoveOrder(agencyAuthUtils.getAgencyLoginUser(), otcTradeOrderCreateReqVO);
     }
 

+ 13 - 2
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/vo/order/ShipTradeOrderCreateReqVO.java

@@ -77,8 +77,8 @@ public class ShipTradeOrderCreateReqVO implements Serializable {
     @Schema(description = "预定团号", example = "")
     private String groupNo;
 
-    @Schema(description = "币种", example = "CNY")
-    private String currency;
+    @Schema(description = "币种", example = "CNY 字典trade_order_currency")
+    private Integer currency;
     /**
      * 航次ID
      */
@@ -96,6 +96,17 @@ public class ShipTradeOrderCreateReqVO implements Serializable {
     @Data
     @Valid
     public static class OrderItem{
+        @Schema(description = "游船产品:楼层ID OR 附加产品:附加产品ID", example = "")
+        @NotBlank(message = "楼层ID/附加产品ID不能为空")
+        private String productId;
+
+        @Schema(description = "使用日期", example = "0")
+        private Date useDate;
+
+        @Schema(description = "产品类型 0 游船产品 1 附加产品", example = "")
+        @NotNull(message = "产品类型不能为空")
+        private Integer productType;
+
         @Schema(description = "国籍")
         private String nationality;
 

+ 1 - 14
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderDO.java

@@ -244,22 +244,9 @@ public class TradeOrderDO extends TenantBaseDO {
      */
     private Long shipId;
 
-    /**
-     * 联系人
-     */
-    private String linkMan;
-
-    /**
-     * 联系电话
-     */
-    private String linkMobile;
-    /**
-     * 联系人邮箱
-     */
-    private String linkEmail;
 
     /**
-     * 币种
+     * 币种 字典trade_order_currency
      */
     private Integer currency;
 }

+ 4 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderUserDO.java

@@ -45,6 +45,10 @@ public class TradeOrderUserDO extends TenantBaseDO {
      * 证件号
      */
     private String credentialNo;
+    /**
+     * 邮箱
+     */
+    private String email;
     /**
      * 证件类型
      * 关联 {@link CredentialTypeEnum}

+ 3 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/TradeOrderService.java

@@ -3,6 +3,7 @@ package com.yc.ship.module.trade.service.order;
 
 import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.module.trade.api.dto.*;
+import com.yc.ship.module.trade.controller.admin.order.vo.order.ShipTradeOrderCreateReqVO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeDetailBaseDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderDO;
 
@@ -34,6 +35,8 @@ public interface TradeOrderService {
      */
     CommonResult<TradeOrderRespDTO> createOrder(TradeOrderCreateReqDTO orderCreateReqDTO);
 
+    CommonResult<TradeOrderRespDTO> createShipOrder(ShipTradeOrderCreateReqVO orderCreateReqDTO);
+
     /**
      * 游客补录
      * @param tradeBindVisitorReqDTO

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

@@ -1,6 +1,7 @@
 package com.yc.ship.module.trade.service.order.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.thread.ThreadUtil;
@@ -25,6 +26,7 @@ import com.yc.ship.module.product.enums.SpecTypeEnum;
 import com.yc.ship.module.system.api.dict.DictDataApi;
 import com.yc.ship.module.system.api.dict.dto.DictDataRespDTO;
 import com.yc.ship.module.trade.api.dto.*;
+import com.yc.ship.module.trade.controller.admin.order.vo.order.ShipTradeOrderCreateReqVO;
 import com.yc.ship.module.trade.controller.admin.order.vo.order.TradeDetailRespVO;
 import com.yc.ship.module.trade.convert.order.TradeOrderConvert;
 import com.yc.ship.module.trade.dal.dataobject.order.*;
@@ -58,6 +60,7 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
@@ -147,6 +150,43 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         }
     }
 
+    @Override
+    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_CREATE)
+    public CommonResult<TradeOrderRespDTO> createShipOrder(ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO) {
+        TradeOrderBO tradeOrderBO = null;
+        try {
+            //1.构建订单
+            tradeOrderBO = buildShipCreateOrder(shipTradeOrderCreateReqVO);
+            //2.下单前处理
+            beforeOrderCreate(tradeOrderBO);
+            //3.保存订单
+            tradeOrderRepositoryService.saveOrder(tradeOrderBO);
+            //4.供应商下单
+            CommonResult<TradeSupplierOrderRespBO> tradeSupplierOrderResp = tradeSupplierService.createOrder(tradeOrderBO);
+            if (tradeSupplierOrderResp.isError()) {
+                //4.1 供应商下单失败回调
+                tradeSupplierCallbackService.afterAnyOrderCreateFail(tradeOrderBO.getTradeOrderDO());
+                return CommonResult.error(tradeSupplierOrderResp);
+            }
+            //4.2 供应商下单成功回调
+            tradeSupplierCallbackService.afterAllOrderCreate(tradeOrderBO.getTradeOrderDO());
+            //5.下单后处理
+            afterOrderCreate(tradeOrderBO);
+            TradeOrderRespDTO tradeOrderRespDTO = new TradeOrderRespDTO().setOrderId(tradeOrderBO.getTradeOrderDO().getId()).setOrderNo(tradeOrderBO.getTradeOrderDO().getOrderNo())
+                    .setPayAmount(tradeOrderBO.getTradeOrderDO().getPayAmount()).setOriginPayAmount(tradeOrderBO.getExtraInfo().getOriginPayAmount())
+                    .setDiscountAmount(tradeOrderBO.getExtraInfo().getDiscountAmount()).setMarketingId(tradeOrderBO.getExtraInfo().getMarketingCouponCodeId())
+                    .setMarketingName(tradeOrderBO.getExtraInfo().getMarketingName());
+            return CommonResult.success(tradeOrderRespDTO);
+        } catch (ServiceException e) {
+            ExceptionUtils.log(log, "下单失败:", e);
+            handleAfterOrderCreateFail(e.getCode(), tradeOrderBO);
+            return CommonResult.error(e);
+        } catch (Exception e) {
+            log.error("下单失败:", e);
+            return CommonResult.error(ORDER_CREATE_FAIL);
+        }
+    }
+
     @Override
     @Deprecated
     public CommonResult<?> bindVisitor(TradeBindVisitorReqDTO tradeBindVisitorReqDTO) {
@@ -642,6 +682,72 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         return tradeOrderBO;
     }
 
+    /**
+     * 构建创建订单
+     * @param orderCreateReqDTO
+     * @return
+     */
+    private TradeOrderBO buildShipCreateOrder(ShipTradeOrderCreateReqVO orderCreateReqDTO){
+        //重置金额
+        TradeOrderBO tradeOrderBO = new TradeOrderBO();
+        //订单
+        TradeOrderDO tradeOrderDO = new TradeOrderDO();
+        tradeOrderDO.setVisitorType( 1);
+        tradeOrderDO.setSellMethod( 1);
+        tradeOrderDO.setSourceId( orderCreateReqDTO.getOrderProperty().getSourceId());
+        tradeOrderDO.setSourceName( orderCreateReqDTO.getOrderProperty().getSourceName());
+        tradeOrderDO.setSellerId(orderCreateReqDTO.getOrderProperty().getSellerId());
+        tradeOrderDO.setStoreId(orderCreateReqDTO.getOrderProperty().getStoreId());
+        tradeOrderDO.setStoreName( orderCreateReqDTO.getOrderProperty().getStoreName());
+        tradeOrderDO.setExternalOrderNo( orderCreateReqDTO.getExternalOrderNo() );
+        tradeOrderDO.setTravelDate( orderCreateReqDTO.getTravelDate() );
+        tradeOrderDO.setAmount( orderCreateReqDTO.getAmount() );
+        tradeOrderDO.setPayAmount( orderCreateReqDTO.getPayAmount() );
+        tradeOrderDO.setRemark( orderCreateReqDTO.getRemark() );
+        tradeOrderDO.setItemId( orderCreateReqDTO.getItemId() );
+        tradeOrderDO.setIsFullPay( orderCreateReqDTO.getIsFullPay() );
+        tradeOrderDO.setIsMarketing( orderCreateReqDTO.getIsMarketing() );
+        tradeOrderDO.setGroupNo( orderCreateReqDTO.getGroupNo() );
+        tradeOrderDO.setVoyageId( orderCreateReqDTO.getVoyageId() );
+        tradeOrderDO.setShipId( orderCreateReqDTO.getShipId() );
+        tradeOrderDO.setCurrency( orderCreateReqDTO.getCurrency());
+        //设置团散类型
+        if(tradeOrderDO.getVisitorType()==null){
+            if(tradeOrderDO.getSellMethod() == 7){
+                tradeOrderDO.setVisitorType(1);
+            }else if(tradeOrderDO.getSellMethod() == 0 || tradeOrderDO.getSellMethod() == 2|| tradeOrderDO.getSellMethod() == 3|| tradeOrderDO.getSellMethod() == 4 || tradeOrderDO.getSellMethod() == 6 | tradeOrderDO.getSellMethod() == 8){
+                tradeOrderDO.setVisitorType(0);
+            }
+        }
+        tradeOrderDO.setId(IdWorker.getId());
+        tradeOrderDO.setOrderNo(tradeUUCodeUtils.generateOrderNo(ORDER_PREFIX));
+        tradeOrderDO.setOrderStatus(TradeOrderStatusEnum.INIT.getStatus());
+        //订单联系人
+        TradeOrderUserDO tradeOrderUserDO = new TradeOrderUserDO();
+        tradeOrderUserDO.setId(IdWorker.getId());
+        tradeOrderUserDO.setOrderId(tradeOrderDO.getId());
+        tradeOrderUserDO.setContactName(orderCreateReqDTO.getOrderUser().getContactName());
+        tradeOrderUserDO.setCredentialNo(orderCreateReqDTO.getOrderUser().getCredentialNo());
+        tradeOrderUserDO.setEmail(orderCreateReqDTO.getOrderUser().getEmail());
+        tradeOrderUserDO.setOrderId(tradeOrderDO.getId());
+        //订单额外信息
+        TradeOrderBO.ExtraInfo extraInfo = new TradeOrderBO.ExtraInfo();
+        extraInfo.setCouponCodeId(orderCreateReqDTO.getOrderProperty().getCouponCodeId());
+        extraInfo.setLinkId(orderCreateReqDTO.getOrderProperty().getLinkId());
+        extraInfo.setPersonalDistributorId(orderCreateReqDTO.getOrderProperty().getPersonalDistributorId());
+        extraInfo.setIsChange(orderCreateReqDTO.getIsChange());
+        extraInfo.setIsTimePay(orderCreateReqDTO.getIsTimePay());
+        tradeOrderBO.setExtraInfo(extraInfo);
+
+//        List<TradeOrderDetailBO> tradeOrderDetailBOList = orderCreateReqDTO.getItemlList().stream().map(orderItem -> buildTradeOrderDetail(orderCreateReqDTO,tradeOrderDO,orderItem))
+//                .collect(Collectors.toList());
+        //订单金额验证
+        tradeOrderBO.setTradeOrderDO(tradeOrderDO);
+        tradeOrderBO.setTradeOrderUserDO(tradeOrderUserDO);
+//        tradeOrderBO.setTradeOrderDetailBOList(tradeOrderDetailBOList);
+        return tradeOrderBO;
+    }
+
     private TradeOrderDO checkMainOrder(TradeOrderCreateReqDTO orderCreateReqDTO){
         if(orderCreateReqDTO.getMainOrderId() ==null){
             return null;
@@ -671,6 +777,135 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         return tradeOrderDO;
     }
 
+    private TradeOrderDetailBO buildShipTradeOrderDetail(ShipTradeOrderCreateReqVO orderCreateReqDTO,TradeOrderDO tradeOrderDO ,ShipTradeOrderCreateReqVO.OrderItem orderItem){
+
+        TradeOrderDetailBO tradeOrderDetailBO = new TradeOrderDetailBO();
+        //获取产品信息
+        DistributorProductRespDTO distributorProductRespDTO = otaDistributorApi.getDistributorProductById(Long.parseLong(orderItem.getProductId())).getData();
+        tradeOrderDetailBO.setProductType(orderItem.getProductType());
+        ProductSpuRespDTO productSpuRespDTO = productApi.getCalendarProduct(distributorProductRespDTO.getProductId(), DateUtil.formatDate(orderItem.getUseDate())).getData();
+//        validateOrder(orderCreateReqDTO,tradeOrderDO,orderItem,productSpuRespDTO);
+
+        List<TradeDetailDO> tradeDetailDOList = new ArrayList<>();
+        List<TradeDetailBaseDO> tradeDetailBaseDOList = new ArrayList<>();
+        List<TradeVisitorDO> tradeVisitorDOList = new ArrayList<>();
+        List<TradeDetailPriceDO> tradeDetailPriceDOList = new ArrayList<>();
+
+        orderItem.getDetailList().forEach(orderDetail -> {
+
+            List<String> ticketNoList =  tradeUUCodeUtils.generateTicketNo(orderDetail.getCount());
+            for (int i = 0; i < orderDetail.getCount(); i++) {
+                //订单详情
+                TradeDetailDO tradeDetailDO = new TradeDetailBO();
+
+                tradeDetailDO.setOrderId(tradeOrderDO.getId());
+                tradeDetailDO.setUseDate(orderItem.getUseDate() == null ? DateUtil.toLocalDateTime(tradeOrderDO.getTravelDate())
+                        : DateUtil.toLocalDateTime(orderItem.getUseDate()));
+                tradeDetailDO.setProductId(Long.parseLong(orderItem.getProductId()));
+                tradeDetailDO.setProductName(productSpuRespDTO.getProductName());
+                tradeDetailDO.setPrice(orderDetail.getOriginPrice());
+                tradeDetailDO.setActualPrice(orderDetail.getPrice());
+                tradeDetailDO.setSpecType(orderDetail.getSpecType());
+                tradeDetailDO.setProductType(orderItem.getProductType());
+                tradeDetailDO.setCateType(productSpuRespDTO.getProductType());
+                tradeDetailDO.setQuantityOfOne(productSpuRespDTO.getProductSaleRule().getOneLimitNum());
+                tradeDetailDO.setUseRealName(productSpuRespDTO.getProductSaleRule().getIsLimitType());
+                //有效门票都是需要激活的,默认立即激活
+                if(productSpuRespDTO.getProductSaleRule().getActivateType()!=null && productSpuRespDTO.getProductSaleRule().getActivateType() == 1){
+                    //立即激活
+                    tradeDetailDO.setActivateStatus(1);
+                    tradeDetailDO.setActivateTime(LocalDateTime.now());
+                }else{
+                    tradeDetailDO.setActivateStatus(0);
+                    tradeDetailDO.setActivateDays(productSpuRespDTO.getProductSaleRule().getActivateDayNum());
+                }
+
+                if(productSpuRespDTO.getProductBasicRule().getNeedPlayDate() == 1){
+                    //需要选择出行日期
+                    Asserts.isTrue(tradeDetailDO.getUseDate()!=null,"此产品需要指定使用日期{}",productSpuRespDTO.getId());
+                    Date travelDate = DateUtils.of(tradeDetailDO.getUseDate());
+                    switch (productSpuRespDTO.getProductBasicRule().getValidityType()){
+                        case 1:
+                            //出行当天
+                            tradeDetailDO.setValidityStartDate(tradeDetailDO.getUseDate());
+                            tradeDetailDO.setValidityEndDate(DateUtil.endOfDay(travelDate).toLocalDateTime());
+                            break;
+                        case 3:
+                            //出行日期前后X天内
+                            tradeDetailDO.setValidityStartDate(DateUtil.offsetDay(travelDate,-productSpuRespDTO.getProductBasicRule().getValidityNum()).toLocalDateTime());
+                            tradeDetailDO.setValidityEndDate(DateUtil.endOfDay(DateUtil.offsetDay(travelDate,productSpuRespDTO.getProductBasicRule().getValidityNum())).toLocalDateTime());
+                            break;
+                        case 4:
+                            //出行日期至指定日期
+                            tradeDetailDO.setValidityStartDate(tradeDetailDO.getUseDate());
+                            Date validityDate =DateUtils.of(productSpuRespDTO.getProductBasicRule().getValidityDate());
+                            tradeDetailDO.setValidityEndDate(DateUtil.endOfDay(validityDate).toLocalDateTime());
+                            break;
+                        default:
+                    }
+                }else {
+                    if(productSpuRespDTO.getProductBasicRule().getValidityType() == 2){
+                        //下单后X天内
+                        Date now = new Date();
+                        tradeDetailDO.setValidityStartDate(DateUtil.beginOfDay(now).toLocalDateTime());
+                        tradeDetailDO.setValidityEndDate(DateUtil.endOfDay(DateUtil.offsetDay(now,productSpuRespDTO.getProductBasicRule().getValidityNum())).toLocalDateTime());
+                    }
+                }
+
+
+                if(productSpuRespDTO.getProductBasicRule().getCheckStartDate()!=null){
+                    LocalDateTime checkStartTime = productSpuRespDTO.getProductBasicRule().getCheckStartDate().atStartOfDay();
+                    //开始检票时间
+                    if(tradeDetailDO.getValidityStartDate() == null || tradeDetailDO.getValidityStartDate().isBefore(checkStartTime)){
+                        tradeDetailDO.setValidityStartDate(checkStartTime);
+                    }
+                }
+                if(productSpuRespDTO.getProductBasicRule().getCheckEndDate()!=null){
+                    LocalDateTime checkEndTime = productSpuRespDTO.getProductBasicRule().getCheckEndDate().atStartOfDay();
+                    DateTime checkEndDate = DateUtil.endOfDay(DateUtils.of(checkEndTime));
+
+                    //结束检票时间
+                    if(tradeDetailDO.getValidityEndDate() == null || tradeDetailDO.getValidityEndDate().isAfter(checkEndDate.toLocalDateTime())){
+                        tradeDetailDO.setValidityEndDate(checkEndDate.toLocalDateTime());
+                    }
+                }
+                if(tradeDetailDO.getValidityEndDate()!=null){
+                    tradeDetailDO.setValidityEndDate(tradeDetailDO.getValidityEndDate().truncatedTo(ChronoUnit.SECONDS));
+                }
+
+                tradeDetailDO.setId(IdWorker.getId());
+                tradeDetailDO.setVoucherCode(ticketNoList.get(i));
+                tradeDetailDO.setVoucherStatus(VoucherStatusEnum.INIT.getStatus());
+                //游客信息
+//                buildTradeVisitor(orderCreateReqDTO,productSpuRespDTO,tradeVisitorDOList,tradeDetailDO,orderDetail,i);
+                //详情基础产品
+//                List<TradeDetailBaseDO>  detailBaseDOList = buildTradeDetailBase(orderDetail,tradeDetailDO,productSpuRespDTO);
+                //明细价格
+//                List<TradeDetailPriceDO> detailPriceList = buildTradeDetailPrice(tradeOrderDO,orderDetail.getDetailPriceList(),tradeDetailDO);
+                tradeDetailDOList.add(tradeDetailDO);
+//                tradeDetailBaseDOList.addAll(detailBaseDOList);
+                /*if(CollUtil.isNotEmpty(detailPriceList)){
+                    tradeDetailPriceDOList.addAll(detailPriceList);
+                }*/
+                if(tradeOrderDO.getTravelDate() == null && tradeDetailDO.getUseDate()!=null){
+                    //补任意游玩日期
+                    tradeOrderDO.setTravelDate(DateUtils.of(tradeDetailDO.getUseDate()));
+                }
+            }
+        });
+
+        //批量验证游客购买限制规则
+//        batchCheckVisitorBuyLimit(tradeDetailDOList,orderItem.getDetailList(),tradeVisitorDOList,tradeDetailBaseDOList,productSpuRespDTO,excludeOrderId);
+
+        tradeOrderDetailBO.setTradeDetailDOList(tradeDetailDOList);
+        tradeOrderDetailBO.setTradeDetailBaseDOList(tradeDetailBaseDOList);
+        tradeOrderDetailBO.setTradeVisitorDOList(tradeVisitorDOList);
+        tradeOrderDetailBO.setTradeDetailPriceDOList(tradeDetailPriceDOList);
+        tradeOrderDetailBO.setProductSpuRespDTO(productSpuRespDTO);
+
+        return tradeOrderDetailBO;
+    }
+
     private TradeOrderDetailBO buildTradeOrderDetail(TradeOrderCreateReqDTO orderCreateReqDTO,TradeOrderDO tradeOrderDO ,TradeOrderCreateReqDTO.OrderItem orderItem){
 
         TradeOrderDetailBO tradeOrderDetailBO = new TradeOrderDetailBO();

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/OtcTradeOrderService.java

@@ -32,7 +32,7 @@ public interface OtcTradeOrderService {
     /**
      * 旅行社创建订单
      */
-    CommonResult<OtcTradeOrderCreateRespVO> createMoveOrder(LoginUser loginUser, OtcTradeOrderCreateReqVO otcTradeOrderCreateReqVO);
+    CommonResult<OtcTradeOrderCreateRespVO> createMoveOrder(LoginUser loginUser, ShipTradeOrderCreateReqVO otcTradeOrderCreateReqVO);
 
     CommonResult<OtcTradeOrderCreateRespVO> platCreateMoveOrder(LoginUser loginUser, ShipTradeOrderCreateReqVO otcTradeOrderCreateReqVO);
 

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

@@ -181,34 +181,26 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     }
 
     @Override
-    public CommonResult<OtcTradeOrderCreateRespVO> createMoveOrder(LoginUser loginUser, OtcTradeOrderCreateReqVO otcTradeOrderCreateReqVO) {
+    public CommonResult<OtcTradeOrderCreateRespVO> createMoveOrder(LoginUser loginUser, ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO) {
         //获取当前分销商信息
-        DistributorRespDTO distributorDto = otaDistributorApi.getDistributorById(loginUser.getDistributorId());
-
-        //平台产品
-        for (TradeOrderCreateReqDTO.OrderItem orderItem : otcTradeOrderCreateReqVO.getItemlList()) {
-            DistributorProductRespDTO distributorProductRespDTO = otaDistributorApi.getDistributorProductById(Long.parseLong(orderItem.getProductId())).getCheckedData();
-            orderItem.setProductId(distributorProductRespDTO.getProductId().toString());
-            orderItem.setProductType(PRODUCT_BASE_TYPE_SELF);
-            for (TradeOrderCreateReqDTO.OrderDetail orderDetail : orderItem.getDetailList()) {
-                orderDetail.setProductId(orderItem.getProductId());
-                orderDetail.setProductType(orderItem.getProductType());
-            }
+        if(loginUser.getDistributorId()!=null){
+            shipTradeOrderCreateReqVO.setDistributorId(loginUser.getDistributorId());
         }
-        otcTradeOrderCreateReqVO.getOrderProperty().setSourceId(distributorDto.getId().toString());
-        otcTradeOrderCreateReqVO.getOrderProperty().setSourceName(distributorDto.getName());
+        Asserts.isTrue(shipTradeOrderCreateReqVO.getDistributorId()!=null,"分销商ID不能为空");
+//        OtcTradeOrderCreateReqVO otcTradeOrderCreateReqVO = TradeOrderConvert.INSTANCE.convert(shipTradeOrderCreateReqVO);
+        //获取当前分销商信息
+        DistributorDO distributorDto = distributorMapper.selectById(shipTradeOrderCreateReqVO.getDistributorId());
+        //平台产品
+        shipTradeOrderCreateReqVO.getOrderProperty().setSourceId(distributorDto.getId().toString());
+        shipTradeOrderCreateReqVO.getOrderProperty().setSourceName(distributorDto.getName());
         //只在平台环境中下单
         Long tenantId = TenantContextHolder.getTenantId();
         TenantContextHolder.setTenantId(distributorDto.getTenantId());
-        CommonResult<TradeOrderRespDTO> result = doWindowCreateOrder(loginUser,otcTradeOrderCreateReqVO,SellMethodEnum.OTC_MOVE_ORDER);
+        CommonResult<TradeOrderRespDTO> result = doShipCreateOrder(loginUser,shipTradeOrderCreateReqVO,SellMethodEnum.OTC_MOVE_ORDER);
         if (result.isError()) {
             return CommonResult.error(result);
         }
         OtcTradeOrderCreateRespVO respVO = TradeOrderConvert.INSTANCE.convert(result.getData());
-        //是否为关联订单
-        if(otcTradeOrderCreateReqVO.getMainOrderId()!=null){
-            SpringUtil.getBean(OtcTradeOrderServiceImpl.class).addOrder(respVO,otcTradeOrderCreateReqVO.getMainOrderId());
-        }
         TenantContextHolder.setTenantId(tenantId);
 
         return CommonResult.success(respVO);
@@ -270,6 +262,17 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         return  tradeOrderService.createOrder(reqDTO);
     }
 
+    private CommonResult<TradeOrderRespDTO> doShipCreateOrder(LoginUser loginUser, ShipTradeOrderCreateReqVO otcTradeOrderCreateReqVO,SellMethodEnum sellMethodEnum) {
+        ShipTradeOrderCreateReqVO.OrderProperty orderProperty = otcTradeOrderCreateReqVO.getOrderProperty();
+        if(orderProperty == null){
+            orderProperty = new ShipTradeOrderCreateReqVO.OrderProperty();
+        }
+        orderProperty.setSellMethod(sellMethodEnum.getType());
+        setShipOrderPropertyFromLoginUser(loginUser,orderProperty,sellMethodEnum);
+        otcTradeOrderCreateReqVO.setOrderProperty(orderProperty);
+        return  tradeOrderService.createShipOrder(otcTradeOrderCreateReqVO);
+    }
+
     @Override
     public CommonResult<PayOrderRespVO> windowPayMoveOrder(LoginUser loginUser, PayOrderReqVO payOrderReqVO) {
         //获取当前分销商信息
@@ -2268,6 +2271,21 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         orderProperty.setSellerId(loginUser.getId().toString());
     }
 
+    private void setShipOrderPropertyFromLoginUser(LoginUser loginUser, ShipTradeOrderCreateReqVO.OrderProperty orderProperty, SellMethodEnum sellMethodEnum){
+        AgencyUserLoginInfoRespDTO agencyUserLoginInfo = loginUser.getContext(AGENCY_LOGIN_INFO, AgencyUserLoginInfoRespDTO.class);
+        if(agencyUserLoginInfo!=null) {
+            if(ObjectUtil.notEqual(sellMethodEnum,SellMethodEnum.OTC_MOVE_ORDER) && agencyUserLoginInfo.getMachineId()!=null) {
+                orderProperty.setSourceId(agencyUserLoginInfo.getMachineId().toString());
+                orderProperty.setSourceName(agencyUserLoginInfo.getMachineName());
+            }
+            if(agencyUserLoginInfo.getStoreName()!=null) {
+                orderProperty.setStoreId(agencyUserLoginInfo.getStoreId());
+                orderProperty.setStoreName(agencyUserLoginInfo.getStoreName());
+            }
+        }
+        orderProperty.setSellerId(loginUser.getId().toString());
+    }
+
     @Override
     public OrderPayAmountRespVO getPayAmount(Long orderId){
         TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(orderId);