Преглед изворни кода

Merge remote-tracking branch 'origin/main' into main

# Conflicts:
#	ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/TradeOrderService.java
luofeiyun пре 1 недеља
родитељ
комит
83a81f9365
17 измењених фајлова са 647 додато и 55 уклоњено
  1. 2 0
      ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/distributor/DistributorService.java
  2. 10 3
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/productSpu/ProductSpuController.java
  3. 1 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/productSpu/ProductSpuMapper.java
  4. 1 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/productSpu/ProductSpuService.java
  5. 6 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/productSpu/ProductSpuServiceImpl.java
  6. 1 1
      ship-module-product/ship-module-product-biz/src/main/resources/mapper/productBase/ProductBaseMapper.xml
  7. 36 0
      ship-module-product/ship-module-product-biz/src/main/resources/mapper/productSpu/ProductSpuMapper.xml
  8. 5 5
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/OtcTradeOrderController.java
  9. 280 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/vo/order/ShipTradeOrderCreateReqVO.java
  10. 7 6
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/app/order/TradeOrderController.java
  11. 7 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/convert/order/TradeOrderConvert.java
  12. 1 14
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderDO.java
  13. 4 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeOrderUserDO.java
  14. 3 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/TradeOrderService.java
  15. 238 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderServiceImpl.java
  16. 2 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/OtcTradeOrderService.java
  17. 43 22
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java

+ 2 - 0
ship-module-ota/ship-module-ota-biz/src/main/java/com/yc/ship/module/ota/service/distributor/DistributorService.java

@@ -2,6 +2,7 @@ package com.yc.ship.module.ota.service.distributor;
 
 import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
 import com.yc.ship.module.ota.api.dto.DistributorRespDTO;
 import com.yc.ship.module.ota.controller.admin.distributor.vo.*;
 import com.yc.ship.module.ota.dal.dataobject.distributor.DistributorDO;
@@ -104,6 +105,7 @@ public interface DistributorService {
 
     CommonResult<DistributorRespDTO> getDistributorByOtaAccount(String otaAccount, String typeCode);
 
+    @TenantIgnore
     DistributorDO getDistributorById(Long distributorId);
 
     DistributorDO getDistributorByLoginUser(String loginName);

+ 10 - 3
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/controller/admin/productSpu/ProductSpuController.java

@@ -38,7 +38,7 @@ import static com.yc.ship.framework.operatelog.core.enums.OperateTypeEnum.EXPORT
 import static com.yc.ship.framework.operatelog.core.enums.OperateTypeEnum.PRODUCT;
 
 
-@Tag(name = "管理后台 - 产品基础信息spu")
+@Tag(name = "管理后台 - 附加产品基础信息spu")
 @RestController
 @RequestMapping("/product/product-spu")
 @Validated
@@ -48,7 +48,7 @@ public class ProductSpuController {
     private ProductSpuService productSpuService;
 
     @PostMapping("/create")
-    @Operation(summary = "创建产品基础信息")
+    @Operation(summary = "创建附加产品基础信息")
     @OperateLog(type = PRODUCT)
     @PreAuthorize("@ss.hasAnyPermissions('product:spu:create','product:otc-spu:create')")
     public CommonResult<Long> createProductSpu(@Valid @RequestBody ProductSpuSaveReqVO createReqVO) {
@@ -56,7 +56,7 @@ public class ProductSpuController {
     }
 
     @PutMapping("/update")
-    @Operation(summary = "更新产品基础信息")
+    @Operation(summary = "更新房间产品基础信息")
     @OperateLog(type = PRODUCT)
     @PreAuthorize("@ss.hasAnyPermissions('product:spu:update','product:otc-spu:update')")
     public CommonResult<Boolean> updateProductSpu(@Valid @RequestBody ProductSpuSaveReqVO updateReqVO) {
@@ -126,6 +126,12 @@ public class ProductSpuController {
         return success(productSpuService.selectSimpleList(pageReqVO));
     }
 
+    @GetMapping("/listByShipId")
+    @Operation(summary = "获得产品信息list")
+    public CommonResult<List<ProductSpuSimpleVO>> listByShipId(@RequestParam("shipId") Long shipId) {
+        return success(productSpuService.listByShipId(shipId));
+    }
+
     @GetMapping("/list-platform")
     @Operation(summary = "获得组合产品(平台分销的)",description = "可传租户id(其他参数无效)")
     public CommonResult<PageResult<ProductSpuRespVO>> listPlatform(@Valid ProductSpuPageReqVO pageReqVO) {
@@ -144,6 +150,7 @@ public class ProductSpuController {
         return success(true);
     }
 
+
     @GetMapping({"/list-all-simple", "/simple-list"})
     @Operation(summary = "获取精简信息列表", description = "只包含被开启的点位类型,主要用于前端的下拉选项")
     public CommonResult<List<ProductSpuSimpleRespVO>> getSimpleList(ProductSpuPageReqVO pageReqVO) {

+ 1 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/productSpu/ProductSpuMapper.java

@@ -45,6 +45,7 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> {
     }
 
     List<ProductSpuSimpleVO> selectSimpleList(@Param("param")ProductSpuPageReqVO reqVO);
+    List<ProductSpuSimpleVO> listByShipId(@Param("shipId")Long shipId);
     @TenantIgnore
     List<ProductSpuSimpleVO> selectPlatSimpleList(@Param("param")ProductSpuPageReqVO reqVO);
 

+ 1 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/productSpu/ProductSpuService.java

@@ -125,6 +125,7 @@ public interface ProductSpuService {
     List<TreeNode> getDistributorProductSpuList();
 
     List<ProductSpuSimpleVO> selectSimpleList(ProductSpuPageReqVO pageReqVO);
+    List<ProductSpuSimpleVO> listByShipId(Long shipId);
 
     List<ProductSkuDO> getProductSkuList(List<Long> ids);
 }

+ 6 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/productSpu/ProductSpuServiceImpl.java

@@ -719,6 +719,12 @@ public class ProductSpuServiceImpl implements ProductSpuService {
         }
     }
 
+    @Override
+    public List<ProductSpuSimpleVO> listByShipId(Long shipId) {
+            //获取游船绑定的附加产品
+        return  productSpuMapper.listByShipId(shipId);
+    }
+
     @Override
     public List<ProductSkuDO> getProductSkuList(List<Long> ids) {
         return productSkuMapper.selectList(new LambdaQueryWrapper<ProductSkuDO>()

+ 1 - 1
ship-module-product/ship-module-product-biz/src/main/resources/mapper/productBase/ProductBaseMapper.xml

@@ -119,6 +119,6 @@
     </select>
 
     <select id="selectShipList" resultType="com.yc.ship.module.product.controller.admin.productBase.vo.ShipRespVO">
-        SELECT id,code,name FROM buss_ship WHERE deleted = 0 and status =0
+        SELECT id,code,name FROM resource_ship WHERE deleted = 0 and status =0
     </select>
 </mapper>

+ 36 - 0
ship-module-product/ship-module-product-biz/src/main/resources/mapper/productSpu/ProductSpuMapper.xml

@@ -304,6 +304,42 @@
             AND g.product_base_id = #{param.productBaseId} and g.deleted = 0 group by  ps.id
         </if>
     </select>
+
+    <select id="listByShipId" resultType="com.yc.ship.module.product.controller.admin.productSpu.spuVO.ProductSpuSimpleVO">
+        SELECT
+            distinct
+            ps.id,ps.product_name productName,
+            ps.product_code productCode,
+            ps.product_type productType,
+            ps.category_id categoryId,
+            pc.cate_name categoryName,
+            pc.sort_num cateSort,
+            ps.sale_price salePrice,
+            ps.cost_price costPrice,
+            ps.is_use isUse,
+            ps.day_num dayNum,
+            ps.sort_num sortNum
+        FROM
+            product_spu ps
+        inner join product_category pc on ps.category_id = pc.id
+        inner join product_basic_rule pbr on pbr.id = ps.id and pbr.deleted = 0
+        inner join product_spu_ship t3 on ps.id = t3.product_id
+        WHERE
+            ps.deleted = 0 AND ps.is_use = 1
+        <![CDATA[
+                AND ((DATE_FORMAT(pbr.sale_start_date,"%Y-%m-%d") <= DATE_FORMAT(now(),"%Y-%m-%d") AND DATE_FORMAT(pbr.sale_end_date,"%Y-%m-%d") >= DATE_FORMAT(now(),"%Y-%m-%d")) OR ( pbr.sale_start_date is null AND pbr.sale_end_date is null))
+                ]]>
+        <![CDATA[
+                AND (
+                (pbr.sale_start_time <= DATE_FORMAT(now(),"%H:%i") AND pbr.sale_end_time >= DATE_FORMAT(now(),"%H:%i") )
+                OR
+                ( (pbr.sale_start_time is null or pbr.sale_start_time = '') AND (pbr.sale_end_time is null or pbr.sale_end_time = '') )
+                )
+                ]]>
+        <if test="shipId != null and shipId != ''">
+            and t3.ship_id = #{shipId}
+        </if>
+    </select>
     <select id="selectPlatSimpleList" resultType="com.yc.ship.module.product.controller.admin.productSpu.spuVO.ProductSpuSimpleVO">
         SELECT
         ps.id,ps.product_name productName,

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

@@ -89,11 +89,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);
     }
 
@@ -101,7 +101,7 @@ public class OtcTradeOrderController {
     @PostMapping("/plat/createOrder")
     @Operation(summary = "win-平台创建订单")
     @OperateLog(type = TRADE)
-    public CommonResult<OtcTradeOrderCreateRespVO> platCreateMoveOrder(@Validated(value = WindowCreateOrderGroup.class)  @RequestBody OtcTradeOrderCreateReqVO otcTradeOrderCreateReqVO) {
+    public CommonResult<OtcTradeOrderCreateRespVO> platCreateMoveOrder(@Validated(value = WindowCreateOrderGroup.class)  @RequestBody ShipTradeOrderCreateReqVO otcTradeOrderCreateReqVO) {
         return otcTradeOrderService.platCreateMoveOrder(getLoginUser(), otcTradeOrderCreateReqVO);
     }
 

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

@@ -0,0 +1,280 @@
+package com.yc.ship.module.trade.controller.admin.order.vo.order;
+
+import com.yc.ship.framework.common.validation.IntEnum;
+import com.yc.ship.framework.common.validation.Mobile;
+import com.yc.ship.module.trade.api.dto.TradeOrderCreateReqDTO;
+import com.yc.ship.module.trade.enums.CredentialTypeEnum;
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Schema(description = "旅行社交易订单创建 Request VO")
+@Data
+public class ShipTradeOrderCreateReqVO implements Serializable {
+
+    @Schema(description = "分销商ID", example = "MT1231312")
+    private Long distributorId;
+
+    @Schema(description = "第三方订单号,分销商下单", example = "MT1231312")
+    @Hidden
+    private String externalOrderNo;
+
+    @Schema(description = "出行日期", example = "2025-06-01")
+    private Date travelDate;
+
+    @Schema(description = "订单项列表", example = "")
+    @NotEmpty(message = "订单项列表不能为空")
+    @Valid
+    private List<OrderItem> itemlList;
+
+    @Schema(description = "订单金额(元)", example = "100")
+    @NotNull(message = "订单金额不能为空")
+    private BigDecimal amount;
+
+    @Schema(description = "支付金额(元)", example = "90")
+    @NotNull(message = "支付金额不能为空")
+    private BigDecimal payAmount;
+
+    @Schema(description = "订单联系信息", example = "")
+    @NotNull(message = "联系人信息不能为空")
+    private OrderUser orderUser;
+
+    @Schema(description = "订单属性", example = "")
+    private OrderProperty orderProperty;
+
+    @Schema(description = "订单备注", example = "xx游客岁数较大")
+    @Length(max = 120,message = "备注不能超过120个字符")
+    private String remark;
+
+    @Schema(description = "携程需要参数,其他情况忽略", example = "")
+    private String itemId;
+
+    @Schema(description = "是否完全支付 0 否 1是", example = "")
+    private Integer isFullPay;
+
+    @Schema(description = "是否改签 0 否 1是", example = "")
+    private Integer isChange;
+
+    @Schema(description = "是否补票 0 否 1是", example = "")
+    private Integer isTimePay;
+
+    @Schema(description = "是否申请营销政策(0否 1是)", example = "")
+    private Integer isMarketing;
+
+    @Schema(description = "是否申请使用营销政策(0否 1是)", example = "")
+    private Integer isMarketingUse;
+
+    @Schema(description = "预定团号", example = "")
+    private String groupNo;
+
+    @Schema(description = "币种", example = "CNY 字典trade_order_currency")
+    private Integer currency;
+    /**
+     * 航次ID
+     */
+    @Schema(description = "航次ID")
+    private Long voyageId;
+
+    /**
+     * 游轮ID
+     */
+    @Schema(description = "游轮ID")
+    private Long shipId;
+
+
+    @Schema(description = "订单项")
+    @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;
+
+        @Schema(description = "成人数量", example = "10")
+        @NotNull(message = "成人数量不能为空")
+        private Integer crnum1;
+
+        @Schema(description = "儿童数量", example = "10")
+        @NotNull(message = "儿童数量不能为空")
+        private Integer etnum2;
+
+        @Schema(description = "婴儿数量", example = "10")
+        @NotNull(message = "婴儿数量不能为空")
+        private Integer yenum3;
+
+        @Schema(description = "陪同数量", example = "10")
+        @NotNull(message = "陪同数量不能为空")
+        private Integer ptnum;
+
+        @Schema(description = "陪同费用", example = "10")
+        private BigDecimal ptamount;
+
+
+        @Schema(description = "订单明细列表", example = "")
+        @NotEmpty(message = "订单明细列表不能为空")
+        @Valid
+        private List<OrderDetail> detailList;
+
+    }
+
+    @Schema(description = "订单明细")
+    @Data
+    @Valid
+    public static class OrderDetail{
+
+        @Schema(description = "游船产品:楼层ID OR 附加产品:附加产品ID", example = "")
+        @NotBlank(message = "楼层ID/附加产品ID不能为空")
+        private String productId;
+
+        @Schema(description = "产品类型 0 游船产品 1 附加产品", example = "")
+        @NotNull(message = "产品类型不能为空")
+        private Integer productType;
+
+        @Schema(description = "单价", example = "")
+        private BigDecimal price;
+
+        @Schema(description = "原始单价", example = "")
+        private BigDecimal originPrice;
+
+        @Schema(description = "规格类型", example = "full")
+        private String specType;
+
+        @Schema(description = "购买数量", example = "10")
+        @NotNull(message = "购买数量不能为空")
+        private Integer count;
+
+        @Schema(description = "游客列表", example = "")
+        @Valid
+        private List<Visitor> visitorList;
+    }
+
+    @Schema(description = "游客信息")
+    @Data
+    @Valid
+    public static class Visitor{
+
+        @Schema(description = "姓名", example = "")
+        private String name;
+
+        @Schema(description = "国籍")
+        private String nationality;
+
+        @Schema(description = "年龄")
+        private Integer age;
+
+        @Schema(description = "是否重庆中转 0:否 1是")
+        private Integer cqzz;
+
+        @Schema(description = "是否宜昌中转 0:否 1是")
+        private Integer yczz;
+
+        @Schema(description = "证件号", example = "")
+        private String credentialNo;
+
+        @Schema(description = "证件类型", example = "")
+        @IntEnum(value = CredentialTypeEnum.class,message = "证件类型不正确")
+        private Integer credentialType;
+
+        @Mobile
+        @Schema(description = "手机号", example = "")
+        private String mobile;
+
+        @Schema(description = "内部平台下单必传,用于区分一票多人券码对应关系", example = "")
+        private String otaDetailId;
+
+        @Schema(description = "是否投保 0否 1是", example = "")
+        private Integer isInsure;
+    }
+
+
+    @Schema(description = "订单联系人")
+    @Data
+    @Valid
+    public static class OrderUser{
+
+        @Schema(description = "姓名", example = "")
+        private String contactName;
+
+        @Schema(description = "证件号", example = "")
+        private String credentialNo;
+
+        @Schema(description = "证件类型", example = "")
+        @IntEnum(value = CredentialTypeEnum.class,message = "证件类型不正确")
+        private Integer credentialType;
+
+        @Mobile
+        @Schema(description = "手机号", example = "")
+        private String mobile;
+
+        @Mobile
+        @Schema(description = "邮箱", example = "")
+        private String email;
+
+        @Schema(description = "区/县", example = "")
+        private String county;
+
+        @Schema(description = "省", example = "")
+        private String province;
+
+        @Schema(description = "城市", example = "")
+        private String city;
+
+        @Schema(description = "客户", example = "")
+        private String clientUser;
+
+    }
+
+    @Schema(description = "订单属性")
+    @Data
+    @Valid
+    public static class OrderProperty{
+
+        @Schema(description = "游客类型", example = "")
+        private Integer visitorType;
+        @Schema(description = "团队类型", example = "")
+        private Integer teamType;
+        @Schema(description = "销售渠道", example = "0")
+        private Integer sellMethod;
+        @Schema(description = "来源ID", example = "123")
+        private String sourceId;
+        @Schema(description = "来源名称", example = "美团")
+        private String sourceName;
+        @Schema(description = "会员ID", example = "123")
+        private String memberId;
+        @Schema(description = "销售员ID", example = "123")
+        private String sellerId;
+        @Schema(description = "门店ID", example = "123")
+        private Long storeId;
+        @Schema(description = "门店名称", example = "123")
+        private String storeName;
+        @Schema(description = "业绩共享人", example = "123")
+        private String shareName;
+        @Schema(description = "个人分销ID", example = "123")
+        private Long personalDistributorId;
+        @Schema(description = "优惠券码ID", example = "123")
+        private Long couponCodeId;
+        @Schema(description = "链接ID", example = "123")
+        private Long linkId;
+    }
+
+}

+ 7 - 6
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/app/order/TradeOrderController.java

@@ -1,12 +1,12 @@
 package com.yc.ship.module.trade.controller.app.order;
 
+import com.alibaba.fastjson.JSON;
 import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.framework.operatelog.core.annotations.OperateLog;
+import com.yc.ship.framework.security.core.LoginUser;
+import com.yc.ship.framework.tenant.core.context.TenantContextHolder;
 import com.yc.ship.module.trade.api.contract.dto.group.WindowCreateOrderGroup;
-import com.yc.ship.module.trade.controller.admin.order.vo.order.OtcTradeOrderCreateReqVO;
-import com.yc.ship.module.trade.controller.admin.order.vo.order.OtcTradeOrderCreateRespVO;
-import com.yc.ship.module.trade.controller.admin.order.vo.order.PayOrderReqVO;
-import com.yc.ship.module.trade.controller.admin.order.vo.order.PayOrderRespVO;
+import com.yc.ship.module.trade.controller.admin.order.vo.order.*;
 import com.yc.ship.module.trade.framework.annotation.PlatTenantEnv;
 import com.yc.ship.module.trade.service.order.AdminTradeOrderService;
 import com.yc.ship.module.trade.service.otc.OtcTradeOrderService;
@@ -24,6 +24,7 @@ import javax.validation.Valid;
 import java.util.Map;
 
 import static com.yc.ship.framework.operatelog.core.enums.OperateTypeEnum.TRADE;
+import static com.yc.ship.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
 
 
 /**
@@ -51,8 +52,8 @@ public class TradeOrderController {
     @PostMapping("/orderTest")
     @Operation(summary = "支付通知")
     @OperateLog(type = TRADE)
-    public CommonResult<OtcTradeOrderCreateRespVO> createMoveOrder(@Validated(value = WindowCreateOrderGroup.class)  @RequestBody OtcTradeOrderCreateReqVO otcTradeOrderCreateReqVO) {
-        return otcTradeOrderService.createMoveOrder(agencyAuthUtils.getAgencyLoginUser(), otcTradeOrderCreateReqVO);
+    public CommonResult<OtcTradeOrderCreateRespVO> platCreateMoveOrder(@Validated(value = WindowCreateOrderGroup.class)  @RequestBody ShipTradeOrderCreateReqVO otcTradeOrderCreateReqVO) {
+        return otcTradeOrderService.platCreateMoveOrder(getLoginUser(), otcTradeOrderCreateReqVO);
     }
 
     @PostMapping("/payNotify")

+ 7 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/convert/order/TradeOrderConvert.java

@@ -7,6 +7,7 @@ import cn.hutool.json.JSONObject;
 import com.yc.ship.framework.common.lang.Asserts;
 import com.yc.ship.framework.common.util.collection.CollectionUtils;
 import com.yc.ship.framework.common.util.date.DateUtils;
+import com.yc.ship.framework.common.util.object.BeanUtils;
 import com.yc.ship.module.otc.api.store.dto.StoreMachineDTO;
 import com.yc.ship.module.product.api.dto.ProductSpuRespDTO;
 import com.yc.ship.module.product.enums.ProductTypeEnum;
@@ -15,6 +16,7 @@ import com.yc.ship.module.trade.api.dto.TradeOrderCreateReqDTO;
 import com.yc.ship.module.trade.api.dto.TradeOrderDispatchReqDTO;
 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.admin.smsProduct.vo.SmsProductRespVO;
 import com.yc.ship.module.trade.controller.app.ota.vo.OtaVoucherVO;
 import com.yc.ship.module.trade.controller.app.otc.vo.AppOtcTradeOrderCreateRespVO;
 import com.yc.ship.module.trade.dal.dataobject.order.*;
@@ -212,4 +214,9 @@ public interface TradeOrderConvert {
     TradeOrderHotelDO convert(TradeOrderCreateReqDTO.HotelBooking hotelBooking);
     TradeDetailPriceDO convert(TradeOrderCreateReqDTO.DetailPrice detailPrice);
     TradeOrderDeliveryDO convert(TradeOrderCreateReqDTO.DeliveryInfo deliveryInfo);
+
+    default OtcTradeOrderCreateReqVO convert(ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO){
+        OtcTradeOrderCreateReqVO bean = BeanUtils.toBean(shipTradeOrderCreateReqVO, OtcTradeOrderCreateReqVO.class);
+        return bean;
+    }
 }

+ 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

@@ -5,6 +5,7 @@ import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.module.trade.api.dto.*;
 import com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderPageReqVO;
+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;
 
@@ -43,6 +44,8 @@ public interface TradeOrderService {
      */
     CommonResult<TradeOrderRespDTO> createOrder(TradeOrderCreateReqDTO orderCreateReqDTO);
 
+    CommonResult<TradeOrderRespDTO> createShipOrder(ShipTradeOrderCreateReqVO orderCreateReqDTO);
+
     /**
      * 游客补录
      * @param tradeBindVisitorReqDTO

+ 238 - 2
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;
@@ -18,6 +19,7 @@ import com.yc.ship.framework.common.util.date.DateUtils;
 import com.yc.ship.framework.common.util.object.ObjectUtils;
 import com.yc.ship.framework.tenant.core.context.TenantContextHolder;
 import com.yc.ship.module.ota.api.OtaDistributorApi;
+import com.yc.ship.module.ota.api.dto.DistributorProductRespDTO;
 import com.yc.ship.module.product.api.ProductApi;
 import com.yc.ship.module.product.api.dto.*;
 import com.yc.ship.module.product.enums.ProductTypeEnum;
@@ -25,6 +27,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.controller.admin.order.vo.order.TradeOrderPageReqVO;
 import com.yc.ship.module.trade.convert.order.TradeOrderConvert;
@@ -60,6 +63,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;
@@ -159,6 +163,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) {
@@ -654,6 +695,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;
@@ -683,13 +790,142 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         return tradeOrderDO;
     }
 
-    private TradeOrderDetailBO buildTradeOrderDetail(TradeOrderCreateReqDTO orderCreateReqDTO,TradeOrderDO tradeOrderDO ,TradeOrderCreateReqDTO.OrderItem orderItem){
+    private TradeOrderDetailBO buildShipTradeOrderDetail(ShipTradeOrderCreateReqVO orderCreateReqDTO,TradeOrderDO tradeOrderDO ,ShipTradeOrderCreateReqVO.OrderItem orderItem){
 
         TradeOrderDetailBO tradeOrderDetailBO = new TradeOrderDetailBO();
         //获取产品信息
-        ProductSpuRespDTO productSpuRespDTO = null;
+        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();
+        //获取产品信息
+        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<>();

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

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

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

@@ -181,43 +181,38 @@ 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.getDistributorByAccountTenantId(loginUser.getTenantId()).getCheckedData();
-
-        //平台产品
-        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);
     }
 
     @Override
-    public CommonResult<OtcTradeOrderCreateRespVO> platCreateMoveOrder(LoginUser loginUser, OtcTradeOrderCreateReqVO otcTradeOrderCreateReqVO) {
-
-        Asserts.isTrue(otcTradeOrderCreateReqVO.getDistributorId()!=null,"分销商ID不能为空");
+    public CommonResult<OtcTradeOrderCreateRespVO> platCreateMoveOrder(LoginUser loginUser, ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO) {
+        if(loginUser.getDistributorId()!=null){
+            shipTradeOrderCreateReqVO.setDistributorId(loginUser.getDistributorId());
+        }
+        Asserts.isTrue(shipTradeOrderCreateReqVO.getDistributorId()!=null,"分销商ID不能为空");
+        OtcTradeOrderCreateReqVO otcTradeOrderCreateReqVO = TradeOrderConvert.INSTANCE.convert(shipTradeOrderCreateReqVO);
         //获取当前分销商信息
         DistributorDO distributorDto = distributorMapper.selectById(otcTradeOrderCreateReqVO.getDistributorId());
 
@@ -267,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) {
         //获取当前分销商信息
@@ -2265,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);