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

feat(jiaotou): 集成交投系统接口功能

- 新增JiaoTouPullController实现我方调用交投接口功能
- 新增JiaoTouPushController实现交投调用我方接口功能
- 添加交投系统统一响应结果类JiaoTouResult
- 实现交投系统各种业务对象BO和VO类定义
- 集成交投系统的商品管理、订单管理、售后管理等功能模块
- 实现交投系统的地址管理、分类管理、库存管理等基础功能
- 完成交投系统token获取、刷新及验证功能实现
- 实现交投系统订单发货、妥投等物流相关功能
- 集成交投系统售后服务流程包括申请售后、取消售后、查询进度等
- 实现交投系统商品上下架、价格、库存等管理功能
肖路 пре 1 недеља
родитељ
комит
a71c4dcc40
38 измењених фајлова са 1714 додато и 0 уклоњено
  1. 24 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTAddressBo.java
  2. 22 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTAfterSaleBo.java
  3. 90 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTApplyAfterSaleBo.java
  4. 24 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTChangeConsigneeInfoBo.java
  5. 81 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTCreateOrderBo.java
  6. 27 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTDeliveredBo.java
  7. 27 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTGetAreaAvailableBo.java
  8. 18 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTGetSkuImageBo.java
  9. 30 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTGetStorageBo.java
  10. 40 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTGetTokenBo.java
  11. 18 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTGoodsSkuBo.java
  12. 22 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTOrderBo.java
  13. 28 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTRefreshTokenBo.java
  14. 124 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTSaveGoodsInfoBo.java
  15. 49 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTSaveGoodsStorageBo.java
  16. 27 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTShipBo.java
  17. 34 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTUpdateGoodsSaleStatusBo.java
  18. 27 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTAddressVo.java
  19. 18 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTAfterSaleStatusVo.java
  20. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTApplyAfterSaleVo.java
  21. 18 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTCancelAfterSaleVo.java
  22. 24 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTCategoryVo.java
  23. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTCreateOrderVo.java
  24. 57 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTDeliveryInfoVo.java
  25. 18 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTGoodsAreaAvailableVo.java
  26. 110 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTGoodsInfoVo.java
  27. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTGoodsPriceVo.java
  28. 18 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTGoodsSaleStatusVo.java
  29. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTGoodsStorageVo.java
  30. 19 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTOrderResultVo.java
  31. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTSaveGoodsResultVo.java
  32. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTSaveStorageResultVo.java
  33. 34 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTSkuImageVo.java
  34. 27 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTTokenVo.java
  35. 21 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTUpdateSaleStatusResultVo.java
  36. 106 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/jiaotou/JiaoTouResult.java
  37. 205 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/jiaotou/JiaoTouPullController.java
  38. 201 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/jiaotou/JiaoTouPushController.java

+ 24 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTAddressBo.java

@@ -0,0 +1,24 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.2.2 根据上级编码获取下一级地址 请求参数
+ */
+@Data
+@Schema(description = "根据上级编码获取下一级地址请求参数")
+public class JTAddressBo {
+
+    /** 授权时获取的token */
+    @Schema(description = "授权时获取的token")
+    private String access_token;
+
+    /** 时间戳 */
+    @Schema(description = "时间戳")
+    private String timestamp;
+
+    /** 上级(父级)编号 */
+    @Schema(description = "上级(父级)编号")
+    private String parentCode;
+}

+ 22 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTAfterSaleBo.java

@@ -0,0 +1,22 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 通用售后BO(取消申请售后/查询售后进度)
+ * 2.5.2 / 2.5.3
+ */
+@Data
+@Schema(description = "通用售后请求参数")
+public class JTAfterSaleBo {
+
+    @Schema(description = "电商的认证token")
+    private String access_token;
+
+    @Schema(description = "(i交投)售后单编号")
+    private String afterSaleSn;
+
+    @Schema(description = "(电商)售后单编号")
+    private String thirdAfterSaleSn;
+}

+ 90 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTApplyAfterSaleBo.java

@@ -0,0 +1,90 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.5.1 申请售后 请求参数
+ */
+@Data
+@Schema(description = "申请售后请求参数")
+public class JTApplyAfterSaleBo {
+
+    @Schema(description = "电商的认证token")
+    private String access_token;
+
+    @Schema(description = "(i交投)售后单编号")
+    private String afterSaleSn;
+
+    @Schema(description = "(i交投)订单编号")
+    private String orderSn;
+
+    @Schema(description = "(电商)订单编号")
+    private String thirdOrderSn;
+
+    @Schema(description = "售后类型 1 退货 2 换货")
+    private String afterSaleType;
+
+    @Schema(description = "售后描述信息")
+    private AfterSaleDescInfo afterSaleDescInfo;
+
+    @Schema(description = "申请售后的商品信息")
+    private AfterSaleGoodsInfo afterSaleGoodsInfo;
+
+    @Schema(description = "申请售后的取件信息")
+    private PickupWareInfo pickupWareInfo;
+
+    @Data
+    @Schema(description = "售后描述信息")
+    public static class AfterSaleDescInfo {
+
+        @Schema(description = "问题描述文字,最大100字符")
+        private String questionDesc;
+
+        @Schema(description = "问题描述图片,多张图片用逗号隔开,最多5张,最大512字符")
+        private String questionPic;
+    }
+
+    @Data
+    @Schema(description = "申请售后的商品信息")
+    public static class AfterSaleGoodsInfo {
+
+        @Schema(description = "申请售后的商品sku")
+        private String skuId;
+
+        @Schema(description = "申请售后的商品数量")
+        private Double skuNum;
+
+        @Schema(description = "申请售后的商品采购单价(元)")
+        private Double skuUnitPrice;
+
+        @Schema(description = "申请售后的商品采购总金额(元)")
+        private Double skuTotalPrice;
+    }
+
+    @Data
+    @Schema(description = "申请售后的取件信息")
+    public static class PickupWareInfo {
+
+        @Schema(description = "取件联系人")
+        private String customerName;
+
+        @Schema(description = "取件联系人联系方式")
+        private String customerMobile;
+
+        @Schema(description = "取件联系人一级地址编码")
+        private String provinceCode;
+
+        @Schema(description = "取件联系人二级地址编码")
+        private String cityCode;
+
+        @Schema(description = "取件联系人三级地址编码")
+        private String countyCode;
+
+        @Schema(description = "取件联系四级地址编码")
+        private String townCode;
+
+        @Schema(description = "取件联系人详细地址")
+        private String address;
+    }
+}

+ 24 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTChangeConsigneeInfoBo.java

@@ -0,0 +1,24 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.4.8 修改订单地址 请求参数
+ */
+@Data
+@Schema(description = "修改订单地址请求参数")
+public class JTChangeConsigneeInfoBo {
+
+    @Schema(description = "电商的认证token")
+    private String access_token;
+
+    @Schema(description = "(i交投)订单编号")
+    private String orderSn;
+
+    @Schema(description = "(电商)订单编号")
+    private String thirdOrderSn;
+
+    @Schema(description = "订单收货地址信息")
+    private JTCreateOrderBo.ConsigneeInfo consigneeInfo;
+}

+ 81 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTCreateOrderBo.java

@@ -0,0 +1,81 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 2.4.1 创建(预占库存)订单 请求参数
+ */
+@Data
+@Schema(description = "创建(预占库存)订单请求参数")
+public class JTCreateOrderBo {
+
+    @Schema(description = "电商的认证token")
+    private String access_token;
+
+    @Schema(description = "客户名称")
+    private String customerName;
+
+    @Schema(description = "(i交投)订单编号")
+    private String orderSn;
+
+    @Schema(description = "订单备注,最长200字符")
+    private String remark;
+
+    @Schema(description = "订单商品总金额(元)")
+    private Double orderGoodsTotalPrice;
+
+    @Schema(description = "订单运费(元)")
+    private Double orderFreightPrice;
+
+    @Schema(description = "订单总金额(商品总金额+运费)(元)")
+    private Double orderTotalPrice;
+
+    @Schema(description = "订单商品集合")
+    private List<OrderGoods> goodsInfoList;
+
+    @Schema(description = "订单收货地址信息")
+    private ConsigneeInfo consigneeInfo;
+
+    @Data
+    @Schema(description = "订单商品")
+    public static class OrderGoods {
+
+        @Schema(description = "订单商品sku")
+        private String sku;
+
+        @Schema(description = "订单商品购买数量")
+        private Double num;
+
+        @Schema(description = "订单商品购买单价(元)")
+        private Double unitPrice;
+    }
+
+    @Data
+    @Schema(description = "订单收货地址信息")
+    public static class ConsigneeInfo {
+
+        @Schema(description = "收货人姓名")
+        private String consigneeName;
+
+        @Schema(description = "收货人一级地址编码")
+        private String consigneeProvinceCode;
+
+        @Schema(description = "收货人二级地址编码")
+        private String consigneeCityCode;
+
+        @Schema(description = "收货人三级地址编码")
+        private String consigneeCountyCode;
+
+        @Schema(description = "收货人四级地址编码")
+        private String consigneeTownCode;
+
+        @Schema(description = "收货人详细地址,最多200字符")
+        private String consigneeAddress;
+
+        @Schema(description = "收货人联系电话")
+        private String consigneeMobile;
+    }
+}

+ 27 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTDeliveredBo.java

@@ -0,0 +1,27 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.4.6 妥投 请求参数
+ */
+@Data
+@Schema(description = "妥投请求参数")
+public class JTDeliveredBo {
+
+    @Schema(description = "(i交投)订单编号")
+    private String orderSn;
+
+    @Schema(description = "(电商)订单编号")
+    private String thirdOrderSn;
+
+    @Schema(description = "包裹编号")
+    private String packageSn;
+
+    @Schema(description = "物流单编号")
+    private String logisticSn;
+
+    @Schema(description = "妥投时间")
+    private String deliveredTime;
+}

+ 27 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTGetAreaAvailableBo.java

@@ -0,0 +1,27 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.8 获取商品区划可售信息 请求参数
+ */
+@Data
+@Schema(description = "获取商品区划可售信息请求参数")
+public class JTGetAreaAvailableBo {
+
+    @Schema(description = "电商的认证token")
+    private String access_token;
+
+    @Schema(description = "(规格)商品编号")
+    private String goodsSku;
+
+    @Schema(description = "一级(省级)地址编码")
+    private String provinceCode;
+
+    @Schema(description = "二级(市级)地址编码")
+    private String cityCode;
+
+    @Schema(description = "三级(区县)地址编码")
+    private String countyCode;
+}

+ 18 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTGetSkuImageBo.java

@@ -0,0 +1,18 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.9 获取商品的图片信息 请求参数
+ */
+@Data
+@Schema(description = "获取商品的图片信息请求参数")
+public class JTGetSkuImageBo {
+
+    @Schema(description = "电商的认证token")
+    private String access_token;
+
+    @Schema(description = "商品sku,多个sku之间用,隔开,最多支持100个sku")
+    private String skus;
+}

+ 30 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTGetStorageBo.java

@@ -0,0 +1,30 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.7 获取商品区划库存信息 请求参数
+ */
+@Data
+@Schema(description = "获取商品区划库存信息请求参数")
+public class JTGetStorageBo {
+
+    @Schema(description = "电商的认证token")
+    private String access_token;
+
+    @Schema(description = "(规格)商品编号")
+    private String goodsSku;
+
+    @Schema(description = "一级(省级)地址编码")
+    private String provinceCode;
+
+    @Schema(description = "二级(市级)地址编码")
+    private String cityCode;
+
+    @Schema(description = "三级(区县)地址编码")
+    private String countyCode;
+
+    @Schema(description = "已选数量")
+    private Integer goodsSkuNum;
+}

+ 40 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTGetTokenBo.java

@@ -0,0 +1,40 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.1.1 获取token 请求参数
+ */
+@Data
+@Schema(description = "i交投获取token请求参数")
+public class JTGetTokenBo {
+
+    /** i交投提供的用户名 */
+    @Schema(description = "i交投提供的用户名")
+    private String username;
+
+    /** i交投提供的密码(RSA公钥加密) */
+    @Schema(description = "i交投提供的密码(RSA公钥加密)")
+    private String password;
+
+    /** 认证类型,默认sign */
+    @Schema(description = "认证类型,默认sign")
+    private String grant_type;
+
+    /** 当日开始时间日期时间戳(ms) */
+    @Schema(description = "当日开始时间日期时间戳(ms)")
+    private String deviceId;
+
+    /** 签名(username+password+deviceId的低位无盐值32位md5值) */
+    @Schema(description = "签名")
+    private String sign;
+
+    /** i交投提供 */
+    @Schema(description = "client_id")
+    private String client_id;
+
+    /** i交投提供 */
+    @Schema(description = "client_secret")
+    private String client_secret;
+}

+ 18 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTGoodsSkuBo.java

@@ -0,0 +1,18 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.4 / 2.3.5 / 2.3.6 通用商品SKU查询请求参数
+ */
+@Data
+@Schema(description = "商品SKU查询请求参数")
+public class JTGoodsSkuBo {
+
+    @Schema(description = "电商的认证token")
+    private String access_token;
+
+    @Schema(description = "(规格)商品编号")
+    private String goodsSku;
+}

+ 22 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTOrderBo.java

@@ -0,0 +1,22 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 通用订单BO(确认订单/取消订单/获取订单物流/订单确认收货)
+ * 2.4.2 / 2.4.3 / 2.4.5 / 2.4.7
+ */
+@Data
+@Schema(description = "通用订单请求参数")
+public class JTOrderBo {
+
+    @Schema(description = "电商的认证token")
+    private String access_token;
+
+    @Schema(description = "(i交投)订单编号")
+    private String orderSn;
+
+    @Schema(description = "(电商)订单编号")
+    private String thirdOrderSn;
+}

+ 28 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTRefreshTokenBo.java

@@ -0,0 +1,28 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.1.2 刷新token 请求参数
+ */
+@Data
+@Schema(description = "i交投刷新token请求参数")
+public class JTRefreshTokenBo {
+
+    /** 认证类型,默认refresh_token */
+    @Schema(description = "认证类型,默认refresh_token")
+    private String grant_type;
+
+    /** 刷新token必要条件 */
+    @Schema(description = "refresh_token")
+    private String refresh_token;
+
+    /** i交投提供 */
+    @Schema(description = "client_id")
+    private String client_id;
+
+    /** i交投提供 */
+    @Schema(description = "client_secret")
+    private String client_secret;
+}

+ 124 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTSaveGoodsInfoBo.java

@@ -0,0 +1,124 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 2.3.1 保存(更新)商品信息 请求参数
+ */
+@Data
+@Schema(description = "保存(更新)商品信息请求参数")
+public class JTSaveGoodsInfoBo {
+
+    @Schema(description = "授权时获取的token")
+    private String access_token;
+
+    @Schema(description = "时间戳")
+    private String timestamp;
+
+    @Schema(description = "商品信息列表")
+    private List<GoodsInfo> goodsInfo;
+
+    @Data
+    @Schema(description = "商品信息")
+    public static class GoodsInfo {
+
+        @Schema(description = "商品名称")
+        private String goodsName;
+
+        @Schema(description = "主商品编号")
+        private String goodsMainSku;
+
+        @Schema(description = "商品品牌名称")
+        private String goodsBrandName;
+
+        @Schema(description = "商品三级品目编号")
+        private String goodsCategoryCode;
+
+        @Schema(description = "商品主图")
+        private String goodsImage;
+
+        @Schema(description = "商品详情")
+        private String goodsContent;
+
+        @Schema(description = "商品重量(克)")
+        private Double goodsWeight;
+
+        @Schema(description = "商品市场价(元)")
+        private Double goodsMarketPrice;
+
+        @Schema(description = "商品销售价(元)")
+        private Double goodsShopPrice;
+
+        @Schema(description = "上下架状态(1上架,0下架)")
+        private Integer goodsSaleStatus;
+
+        @Schema(description = "销售单位")
+        private String goodsSaleUnit;
+
+        @Schema(description = "售后服务")
+        private String goodsSaleService;
+
+        @Schema(description = "包装清单")
+        private String goodsSalePackage;
+
+        @Schema(description = "商品宣传组图")
+        private List<String> goodsImageList;
+
+        @Schema(description = "商品规格参数集合")
+        private List<GoodsAttr> goodsAttrList;
+
+        @Schema(description = "同类(不同规格)商品集合")
+        private List<SubGoods> subGoodsList;
+    }
+
+    @Data
+    @Schema(description = "商品规格参数")
+    public static class GoodsAttr {
+
+        @Schema(description = "规格名称")
+        private String attrName;
+
+        @Schema(description = "规格值")
+        private String attrValue;
+    }
+
+    @Data
+    @Schema(description = "规格商品")
+    public static class SubGoods {
+
+        @Schema(description = "(规格)商品编号")
+        private String subSku;
+
+        @Schema(description = "商品市场价格(元)")
+        private Double subMarketPrice;
+
+        @Schema(description = "商品销售价(元)")
+        private Double subShopPrice;
+
+        @Schema(description = "商品主图")
+        private String subGoodsImage;
+
+        @Schema(description = "商品上下架状态(1上架,0下架)")
+        private Integer subSaleStatus;
+
+        @Schema(description = "是否厂直直销商品(1是,0否)")
+        private Integer isDirectly;
+
+        @Schema(description = "销售维度(规格)")
+        private List<SubGoodsDim> subGoodsDimList;
+    }
+
+    @Data
+    @Schema(description = "销售维度")
+    public static class SubGoodsDim {
+
+        @Schema(description = "维度名称")
+        private String dimName;
+
+        @Schema(description = "维度值")
+        private String dimValue;
+    }
+}

+ 49 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTSaveGoodsStorageBo.java

@@ -0,0 +1,49 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 2.3.2 保存(更新)商品库存 请求参数
+ */
+@Data
+@Schema(description = "保存(更新)商品库存请求参数")
+public class JTSaveGoodsStorageBo {
+
+    @Schema(description = "授权时获取的token")
+    private String access_token;
+
+    @Schema(description = "时间戳")
+    private String timestamp;
+
+    @Schema(description = "商品库存信息列表")
+    private List<GoodsStorage> goodsInfo;
+
+    @Data
+    @Schema(description = "商品库存信息")
+    public static class GoodsStorage {
+
+        @Schema(description = "商品sku")
+        private String goodsSku;
+
+        @Schema(description = "一级(省级)地址编码")
+        private String provinceCode;
+
+        @Schema(description = "二级(市级)地址编码")
+        private String cityCode;
+
+        @Schema(description = "三级(区县)地址编码")
+        private String countyCode;
+
+        @Schema(description = "四级(乡镇)地址编码")
+        private String townCode;
+
+        @Schema(description = "“有货”或“无货”")
+        private String storageRemark;
+
+        @Schema(description = "区域库存")
+        private Integer storage;
+    }
+}

+ 27 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTShipBo.java

@@ -0,0 +1,27 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.4.4 发货 请求参数
+ */
+@Data
+@Schema(description = "发货请求参数")
+public class JTShipBo {
+
+    @Schema(description = "(i交投)订单编号")
+    private String orderSn;
+
+    @Schema(description = "(电商)订单编号")
+    private String thirdOrderSn;
+
+    @Schema(description = "包裹编号")
+    private String packageSn;
+
+    @Schema(description = "物流单编号")
+    private String logisticSn;
+
+    @Schema(description = "发货时间")
+    private String shipTime;
+}

+ 34 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/bo/JTUpdateGoodsSaleStatusBo.java

@@ -0,0 +1,34 @@
+package org.dromara.external.api.jiaotou.domian.bo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 2.3.3 更新商品上下架状态 请求参数
+ */
+@Data
+@Schema(description = "更新商品上下架状态请求参数")
+public class JTUpdateGoodsSaleStatusBo {
+
+    @Schema(description = "授权时获取的token")
+    private String access_token;
+
+    @Schema(description = "时间戳")
+    private String timestamp;
+
+    @Schema(description = "商品上下架信息")
+    private List<GoodsSaleStatus> goodsInfo;
+
+    @Data
+    @Schema(description = "商品上下架信息")
+    public static class GoodsSaleStatus {
+
+        @Schema(description = "商品sku")
+        private String goodsSku;
+
+        @Schema(description = "上下架状态(1上架,0下架)")
+        private Integer saleStatus;
+    }
+}

+ 27 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTAddressVo.java

@@ -0,0 +1,27 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.2.1 / 2.2.2 地址响应
+ */
+@Data
+@Schema(description = "地址信息响应")
+public class JTAddressVo {
+
+    @Schema(description = "地址编码")
+    private String regionCode;
+
+    @Schema(description = "地址简称")
+    private String regionName;
+
+    @Schema(description = "地址全称")
+    private String regionFullName;
+
+    @Schema(description = "上级(父级)地址编号")
+    private String parentCode;
+
+    @Schema(description = "等级(一级,二级,三级,四级)")
+    private Integer regionLevel;
+}

+ 18 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTAfterSaleStatusVo.java

@@ -0,0 +1,18 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.5.3 查询售后进度 响应
+ */
+@Data
+@Schema(description = "售后进度响应")
+public class JTAfterSaleStatusVo {
+
+    @Schema(description = "(i交投)售后单编号")
+    private String afterSaleSn;
+
+    @Schema(description = "当前售后状态(1提交申请,2商家处理,3商家拒绝,4商家取回商品,5退货完成)")
+    private String afterSaleStatus;
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTApplyAfterSaleVo.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.5.1 申请售后 响应
+ */
+@Data
+@Schema(description = "申请售后响应")
+public class JTApplyAfterSaleVo {
+
+    @Schema(description = "(电商)售后单编号,最长32字符")
+    private String thirdAfterSaleSn;
+
+    @Schema(description = "(i交投)售后单编号")
+    private String afterSaleSn;
+
+    @Schema(description = "申请结果(1成功,0失败)")
+    private Integer result;
+}

+ 18 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTCancelAfterSaleVo.java

@@ -0,0 +1,18 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.5.2 取消申请售后 响应
+ */
+@Data
+@Schema(description = "取消申请售后响应")
+public class JTCancelAfterSaleVo {
+
+    @Schema(description = "(i交投)售后单编号")
+    private String afterSaleSn;
+
+    @Schema(description = "申请结果(1成功,0失败)")
+    private Integer result;
+}

+ 24 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTCategoryVo.java

@@ -0,0 +1,24 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.2.3 品目分类响应
+ */
+@Data
+@Schema(description = "品目分类响应")
+public class JTCategoryVo {
+
+    @Schema(description = "品目编码")
+    private String categoryCode;
+
+    @Schema(description = "品目名称")
+    private String categoryName;
+
+    @Schema(description = "等级(一级,二级,三级,四级)")
+    private Integer categoryLevel;
+
+    @Schema(description = "上级(父级)品目编号")
+    private String parentCode;
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTCreateOrderVo.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.4.1 创建(预占库存)订单 响应
+ */
+@Data
+@Schema(description = "创建订单响应")
+public class JTCreateOrderVo {
+
+    @Schema(description = "(电商)订单编号,最长32字符")
+    private String thirdOrderSn;
+
+    @Schema(description = "(i交投)订单编号")
+    private String orderSn;
+
+    @Schema(description = "订单创建时间")
+    private String orderCreateTime;
+}

+ 57 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTDeliveryInfoVo.java

@@ -0,0 +1,57 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 2.4.5 获取订单物流信息 响应
+ */
+@Data
+@Schema(description = "订单物流信息响应")
+public class JTDeliveryInfoVo {
+
+    @Schema(description = "(i交投)订单编号")
+    private String orderSn;
+
+    @Schema(description = "有无物流包裹信息(1有,0无)")
+    private Integer isPackage;
+
+    @Schema(description = "物流包裹集合")
+    private List<PackageInfo> packageInfoList;
+
+    @Data
+    @Schema(description = "物流包裹信息")
+    public static class PackageInfo {
+
+        @Schema(description = "包裹号")
+        private String packageSn;
+
+        @Schema(description = "快递单号")
+        private String logisticSn;
+
+        @Schema(description = "快递公司名称")
+        private String expressCompany;
+
+        @Schema(description = "包裹订单商品list")
+        private List<String> skuList;
+
+        @Schema(description = "包裹物流信息集合")
+        private List<LogisticInfo> logisticList;
+    }
+
+    @Data
+    @Schema(description = "物流轨迹信息")
+    public static class LogisticInfo {
+
+        @Schema(description = "物流内容")
+        private String trackContent;
+
+        @Schema(description = "物流操作人")
+        private String trackOperator;
+
+        @Schema(description = "物流操作时间")
+        private String trackMsgTime;
+    }
+}

+ 18 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTGoodsAreaAvailableVo.java

@@ -0,0 +1,18 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.8 获取商品区划可售信息 响应
+ */
+@Data
+@Schema(description = "商品区划可售信息响应")
+public class JTGoodsAreaAvailableVo {
+
+    @Schema(description = "(规格)商品编号")
+    private String goodsSku;
+
+    @Schema(description = "是否可售(1可售,0不可售)")
+    private Integer result;
+}

+ 110 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTGoodsInfoVo.java

@@ -0,0 +1,110 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 2.3.4 更新单个商品信息 响应
+ */
+@Data
+@Schema(description = "单个商品信息响应")
+public class JTGoodsInfoVo {
+
+    @Schema(description = "商品名称")
+    private String goodsName;
+
+    @Schema(description = "主商品编号")
+    private String goodsMainSku;
+
+    @Schema(description = "商品品牌名称")
+    private String goodsBrandName;
+
+    @Schema(description = "商品三级品目编号")
+    private String goodsCategoryCode;
+
+    @Schema(description = "商品主图")
+    private String goodsImage;
+
+    @Schema(description = "商品详情")
+    private String goodsContent;
+
+    @Schema(description = "商品重量(克)")
+    private Double goodsWeight;
+
+    @Schema(description = "商品市场价(元)")
+    private Double goodsMarketPrice;
+
+    @Schema(description = "商品销售价(元)")
+    private Double goodsShopPrice;
+
+    @Schema(description = "上下架状态(1上架,0下架)")
+    private Integer goodsSaleStatus;
+
+    @Schema(description = "销售单位")
+    private String goodsSaleUnit;
+
+    @Schema(description = "售后服务")
+    private String goodsSaleService;
+
+    @Schema(description = "包装清单")
+    private String goodsSalePackage;
+
+    @Schema(description = "商品宣传组图")
+    private List<String> goodsImageList;
+
+    @Schema(description = "商品规格参数集合")
+    private List<GoodsAttr> goodsAttrList;
+
+    @Schema(description = "(规格)商品信息")
+    private SubGoodsObj subGoodsObj;
+
+    @Data
+    @Schema(description = "商品规格参数")
+    public static class GoodsAttr {
+
+        @Schema(description = "规格名称")
+        private String attrName;
+
+        @Schema(description = "规格值")
+        private String attrValue;
+    }
+
+    @Data
+    @Schema(description = "(规格)商品信息")
+    public static class SubGoodsObj {
+
+        @Schema(description = "(规格)商品编号")
+        private String subSku;
+
+        @Schema(description = "商品市场价格(元)")
+        private Double subMarketPrice;
+
+        @Schema(description = "商品销售价(元)")
+        private Double subShopPrice;
+
+        @Schema(description = "商品主图")
+        private String subGoodsImage;
+
+        @Schema(description = "规格商品上下架状态(1上架,0下架)")
+        private Integer subSaleStatus;
+
+        @Schema(description = "是否厂直直销商品(1是,0否)")
+        private Integer isDirectly;
+
+        @Schema(description = "销售维度(规格)")
+        private List<SubGoodsDim> subGoodsDimList;
+    }
+
+    @Data
+    @Schema(description = "销售维度")
+    public static class SubGoodsDim {
+
+        @Schema(description = "维度名称")
+        private String dimName;
+
+        @Schema(description = "维度值")
+        private String dimValue;
+    }
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTGoodsPriceVo.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.6 获取商品价格信息 响应
+ */
+@Data
+@Schema(description = "商品价格信息响应")
+public class JTGoodsPriceVo {
+
+    @Schema(description = "(规格)商品编号")
+    private String goodsSku;
+
+    @Schema(description = "商品市场价格(元)")
+    private Double goodsMarketPrice;
+
+    @Schema(description = "商品销售价格(元)")
+    private Double goodsShopPrice;
+}

+ 18 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTGoodsSaleStatusVo.java

@@ -0,0 +1,18 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.5 获取商品上下架状态 响应
+ */
+@Data
+@Schema(description = "商品上下架状态响应")
+public class JTGoodsSaleStatusVo {
+
+    @Schema(description = "(规格)商品编号")
+    private String goodsSku;
+
+    @Schema(description = "商品上下架状态(1上架,0下架)")
+    private Integer goodsSaleStatus;
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTGoodsStorageVo.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.7 获取商品区划库存信息 响应
+ */
+@Data
+@Schema(description = "商品区划库存信息响应")
+public class JTGoodsStorageVo {
+
+    @Schema(description = "(规格)商品编号")
+    private String goodsSku;
+
+    @Schema(description = "“有货”或者“无货”")
+    private String goodsStorageRemark;
+
+    @Schema(description = "区划库存(没有具体数据时返回0)")
+    private Integer goodsStorage;
+}

+ 19 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTOrderResultVo.java

@@ -0,0 +1,19 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 通用订单结果VO(确认订单/取消订单/发货/妥投/订单确认收货/修改订单地址)
+ * 2.4.2 / 2.4.3 / 2.4.4 / 2.4.6 / 2.4.7 / 2.4.8
+ */
+@Data
+@Schema(description = "通用订单操作结果")
+public class JTOrderResultVo {
+
+    @Schema(description = "(i交投)订单编号")
+    private String orderSn;
+
+    @Schema(description = "操作结果(1成功,0失败)")
+    private Integer result;
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTSaveGoodsResultVo.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.1 保存(更新)商品信息 响应
+ */
+@Data
+@Schema(description = "保存(更新)商品信息响应")
+public class JTSaveGoodsResultVo {
+
+    @Schema(description = "规格商品编号")
+    private String subSku;
+
+    @Schema(description = "商品保存(更新)结果,成功还是失败")
+    private String result;
+
+    @Schema(description = "结果备注,新增成功为newRecord,更新成功为updateRecord,失败为失败原因")
+    private String msg;
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTSaveStorageResultVo.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.2 保存(更新)商品库存 响应
+ */
+@Data
+@Schema(description = "保存(更新)商品库存响应")
+public class JTSaveStorageResultVo {
+
+    @Schema(description = "规格商品编号")
+    private String goodsSku;
+
+    @Schema(description = "操作结果(1成功,0失败)")
+    private String result;
+
+    @Schema(description = "结果备注")
+    private String msg;
+}

+ 34 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTSkuImageVo.java

@@ -0,0 +1,34 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 2.3.9 获取商品的图片信息 响应
+ */
+@Data
+@Schema(description = "商品图片信息响应")
+public class JTSkuImageVo {
+
+    @Schema(description = "商品sku")
+    private String skuId;
+
+    @Schema(description = "当前sku的图片集合")
+    private List<UrlInfo> urls;
+
+    @Data
+    @Schema(description = "图片信息")
+    public static class UrlInfo {
+
+        @Schema(description = "图片地址")
+        private String path;
+
+        @Schema(description = "是否是主图(1主图,0轮播图)")
+        private String primary;
+
+        @Schema(description = "图片位置")
+        private String pictureLocation;
+    }
+}

+ 27 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTTokenVo.java

@@ -0,0 +1,27 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.1.1 / 2.1.2 token 响应
+ */
+@Data
+@Schema(description = "i交投token响应")
+public class JTTokenVo {
+
+    @Schema(description = "访问令牌token")
+    private String access_token;
+
+    @Schema(description = "token类型")
+    private String token_type;
+
+    @Schema(description = "刷新token")
+    private String refresh_token;
+
+    @Schema(description = "有效时间")
+    private String expires_in;
+
+    @Schema(description = "scope")
+    private String scope;
+}

+ 21 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/jiaotou/domian/vo/JTUpdateSaleStatusResultVo.java

@@ -0,0 +1,21 @@
+package org.dromara.external.api.jiaotou.domian.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 2.3.3 更新商品上下架状态 响应
+ */
+@Data
+@Schema(description = "更新商品上下架状态响应")
+public class JTUpdateSaleStatusResultVo {
+
+    @Schema(description = "规格商品编号")
+    private String goodsSku;
+
+    @Schema(description = "操作结果(1成功,0失败)")
+    private String result;
+
+    @Schema(description = "结果备注,失败为失败原因")
+    private String msg;
+}

+ 106 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/jiaotou/JiaoTouResult.java

@@ -0,0 +1,106 @@
+package org.dromara.common.core.domain.jiaotou;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.dromara.common.core.constant.HttpStatus;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 响应信息主体
+ *
+ * @author Lion Li
+ */
+@Data
+@NoArgsConstructor
+public class JiaoTouResult<T> implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 成功
+     */
+    public static final String SUCCESS = "200";
+
+    /**
+     * 失败
+     */
+    public static final String FAIL = "500";
+
+    /**
+     * 消息状态码
+     */
+    private String code;
+
+    /**
+     * 是否成功
+     * */
+    private boolean success;
+
+    /**
+     * 消息内容
+     */
+    private String msg;
+
+    /**
+     * 数据对象
+     */
+    private T data;
+
+    public static <T> JiaoTouResult<T> ok() {
+        return restResult(null, SUCCESS, "操作成功");
+    }
+
+    public static <T> JiaoTouResult<T> ok(T data) {
+        return restResult(data, SUCCESS, "操作成功");
+    }
+
+    public static <T> JiaoTouResult<T> ok(String msg) {
+        return restResult(null, SUCCESS, msg);
+    }
+
+    public static <T> JiaoTouResult<T> ok(String msg, T data) {
+        return restResult(data, SUCCESS, msg);
+    }
+
+    public static <T> JiaoTouResult<T> fail() {
+        return restResult(null, FAIL, "操作失败");
+    }
+
+    public static <T> JiaoTouResult<T> fail(String msg) {
+        return restResult(null, FAIL, msg);
+    }
+
+    public static <T> JiaoTouResult<T> fail(T data) {
+        return restResult(data, FAIL, "操作失败");
+    }
+
+    public static <T> JiaoTouResult<T> fail(String msg, T data) {
+        return restResult(data, FAIL, msg);
+    }
+
+    public static <T> JiaoTouResult<T> fail(String code, String msg) {
+        return restResult(null, code, msg);
+    }
+
+
+    private static <T> JiaoTouResult<T> restResult(T data, String code, String msg) {
+        JiaoTouResult<T> r = new JiaoTouResult<>();
+        r.setCode(code);
+        r.setData(data);
+        r.setSuccess(String.valueOf(HttpStatus.SUCCESS).equals(code));
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static <T> Boolean isError(JiaoTouResult<T> ret) {
+        return !isSuccess(ret);
+    }
+
+    public static <T> Boolean isSuccess(JiaoTouResult<T> ret) {
+        return JiaoTouResult.SUCCESS .equals(ret.getCode()) ;
+    }
+
+}

+ 205 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/jiaotou/JiaoTouPullController.java

@@ -0,0 +1,205 @@
+package org.dromara.external.controller.jiaotou;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.core.domain.jiaotou.JiaoTouResult;
+import org.dromara.common.encrypt.utils.EncryptUtils;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.external.api.jiaotou.domian.bo.JTAddressBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTDeliveredBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTGetTokenBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTRefreshTokenBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTSaveGoodsInfoBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTSaveGoodsStorageBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTShipBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTUpdateGoodsSaleStatusBo;
+import org.dromara.external.api.jiaotou.domian.vo.JTAddressVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTCategoryVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTOrderResultVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTSaveGoodsResultVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTSaveStorageResultVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTTokenVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTUpdateSaleStatusResultVo;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.Duration;
+import java.util.List;
+
+/**
+ * 我们请求交投的接口(i交投提供,电商调用)
+ *
+ * @author
+ * @date 2025/8/5 下午6:31
+ */
+@Tag(name = "i交投-我方调用i交投接口")
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping(value = "/api/jiaotou/pull")
+public class JiaoTouPullController {
+    // i交投接口
+    private final String url = "http://ijtapi.ceczy.com:8085";
+    // redis key前缀
+    private static final String REDIS_KEY_PREFIX = "jiaoTou:token";
+    //username
+    private static final String USERNAME = "admin";
+    //password
+    private static final String PASSWORD = "admin";
+    // RSA公钥
+    private static final String PUBLIC_KEY = "";
+    //client_id
+    private static final String CLIENT_ID = "admin";
+    //client_secret
+    private static final String CLIENT_SECRET = "admin";
+
+
+    /**
+     * 2.1.1 获取token
+     */
+    @Operation(summary = "2.1.1 获取token")
+    @PostMapping("/oauth/token")
+    public JiaoTouResult<JTTokenVo> getToken(@RequestBody JTGetTokenBo bo) {
+        bo.setGrant_type("sign");
+        bo.setUsername(USERNAME);
+        //password需要使用RSA公钥加密
+        bo.setPassword(EncryptUtils.encryptByRsa(PASSWORD, PUBLIC_KEY));
+        bo.setClient_id(CLIENT_ID);
+        bo.setClient_secret(CLIENT_SECRET);
+        //获取当日开始时间时间戳
+        bo.setDeviceId(String.valueOf(DateUtil.beginOfDay(DateUtil.date()).getTime()));
+        String json = JSONUtil.toJsonStr(bo);
+        String post = HttpUtil.post(url + "/czy-uaa/oauth/token", json);
+        JTTokenVo data = JSONUtil.toBean(post, JTTokenVo.class);
+        //将token保存到redis中
+        if(ObjectUtil.isNotEmpty(data) && data.getAccess_token() != null){
+            //AccessToken有效期100小时
+            data.setExpires_in("100");
+            RedisUtils.setCacheObject(GlobalConstants.GLOBAL_REDIS_KEY+REDIS_KEY_PREFIX, data, Duration.ofHours(Long.parseLong(data.getExpires_in())));
+        }
+        return JiaoTouResult.ok(data);
+    }
+
+    /**
+     * 2.1.2 刷新token
+     */
+    @Operation(summary = "2.1.2 刷新token")
+    @PostMapping("/oauth/refreshToken")
+    public JiaoTouResult<JTTokenVo> refreshToken(@RequestBody JTRefreshTokenBo bo) {
+        bo.setRefresh_token(bo.getRefresh_token());
+
+        String json = JSONUtil.toJsonStr(bo);
+        String post = HttpUtil.post(url + "/czy-uaa/oauth/token", json);
+        JTTokenVo data = JSONUtil.toBean(post, JTTokenVo.class);
+        return JiaoTouResult.ok(data);
+    }
+
+    /**
+     * 2.2.1 获取一级(省级)地址
+     */
+    @Operation(summary = "2.2.1 获取一级(省级)地址")
+    @PostMapping("/address/getProvinces")
+    public JiaoTouResult<List<JTAddressVo>> getProvinces() {
+        JTAddressBo jtAddressBo = new JTAddressBo();
+        String json = JSONUtil.toJsonStr(jtAddressBo);
+        String post = HttpUtil.post(url + "/api/address/getProvinces", json);
+        JiaoTouResult bean = JSONUtil.toBean(post, JiaoTouResult.class);
+        return JiaoTouResult.ok(bean.getData() == null ? null : (List<JTAddressVo>) bean.getData());
+    }
+
+    /**
+     * 2.2.2 根据上级编码获取下一级地址
+     */
+    @Operation(summary = "2.2.2 根据上级编码获取下一级地址")
+    @PostMapping("/address/getAddress")
+    public JiaoTouResult<List<JTAddressVo>> getAddress(@RequestBody JTAddressBo bo) {
+        String json = JSONUtil.toJsonStr(bo);
+        String post = HttpUtil.post(url + "/api/address/getAddress", json);
+        JiaoTouResult bean = JSONUtil.toBean(post, JiaoTouResult.class);
+        return JiaoTouResult.ok(bean.getData() == null ? null : (List<JTAddressVo>) bean.getData());
+    }
+
+    /**
+     * 2.2.3 获取全量品目分类信息
+     */
+    @Operation(summary = "2.2.3 获取全量品目分类信息")
+    @PostMapping("/category/all")
+    public JiaoTouResult<List<JTCategoryVo>> getCategoryAll() {
+        String json = "";
+        String post = HttpUtil.post(url + "/api/category/all", json);
+        JiaoTouResult bean = JSONUtil.toBean(post, JiaoTouResult.class);
+        return JiaoTouResult.ok(bean.getData() == null ? null : (List<JTCategoryVo>) bean.getData());
+    }
+
+    /**
+     * 2.3.1 保存(更新)商品信息
+     */
+    @Operation(summary = "2.3.1 保存(更新)商品信息")
+    @PostMapping("/goods/saveGoodsInfo")
+    public JiaoTouResult<List<JTSaveGoodsResultVo>> saveGoodsInfo(@RequestBody JTSaveGoodsInfoBo bo) {
+        String json = JSONUtil.toJsonStr(bo);
+        String post = HttpUtil.post(url + "/api/goods/saveGoodsInfo", json);
+        JiaoTouResult bean = JSONUtil.toBean(post, JiaoTouResult.class);
+        return JiaoTouResult.ok(bean.getData() == null ? null : (List<JTSaveGoodsResultVo>) bean.getData());
+    }
+
+    /**
+     * 2.3.2 保存(更新)商品库存
+     */
+    @Operation(summary = "2.3.2 保存(更新)商品库存")
+    @PostMapping("/goods/saveGoodsStorage")
+    public JiaoTouResult<List<JTSaveStorageResultVo>> saveGoodsStorage(@RequestBody JTSaveGoodsStorageBo bo) {
+        String json = JSONUtil.toJsonStr(bo);
+        String post = HttpUtil.post(url + "/api/goods/saveGoodsStorage", json);
+        JiaoTouResult bean = JSONUtil.toBean(post, JiaoTouResult.class);
+        return JiaoTouResult.ok(bean.getData() == null ? null : (List<JTSaveStorageResultVo>) bean.getData());
+    }
+
+    /**
+     * 2.3.3 更新商品上下架状态
+     */
+    @Operation(summary = "2.3.3 更新商品上下架状态")
+    @PostMapping("/goods/updateGoodsSaleStatus")
+    public JiaoTouResult<List<JTUpdateSaleStatusResultVo>> updateGoodsSaleStatus(@RequestBody JTUpdateGoodsSaleStatusBo bo) {
+        String json = JSONUtil.toJsonStr(bo);
+        String post = HttpUtil.post(url + "/api/goods/updateGoodsSaleStatus", json);
+        JiaoTouResult bean = JSONUtil.toBean(post, JiaoTouResult.class);
+        return JiaoTouResult.ok(bean.getData() == null ? null : (List<JTUpdateSaleStatusResultVo>) bean.getData());
+    }
+
+    /**
+     * 2.4.4 发货
+     */
+    @Operation(summary = "2.4.4 发货")
+    @PostMapping("/order/ship")
+    public JiaoTouResult<JTOrderResultVo> ship(@RequestBody JTShipBo bo) {
+        String json = JSONUtil.toJsonStr(bo);
+        String post = HttpUtil.post(url + "/api/order/ship", json);
+        JiaoTouResult bean = JSONUtil.toBean(post, JiaoTouResult.class);
+        return JiaoTouResult.ok(bean.getData() == null ? null : JSONUtil.toBean(JSONUtil.toJsonStr(bean.getData()), JTOrderResultVo.class));
+    }
+
+    /**
+     * 2.4.6 妥投
+     */
+    @Operation(summary = "2.4.6 妥投")
+    @PostMapping("/order/delivered")
+    public JiaoTouResult<JTOrderResultVo> delivered(@RequestBody JTDeliveredBo bo) {
+        String json = JSONUtil.toJsonStr(bo);
+        String post = HttpUtil.post(url + "/api/order/delivered", json);
+        JiaoTouResult bean = JSONUtil.toBean(post, JiaoTouResult.class);
+        return JiaoTouResult.ok(bean.getData() == null ? null : JSONUtil.toBean(JSONUtil.toJsonStr(bean.getData()), JTOrderResultVo.class));
+    }
+
+}

+ 201 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/jiaotou/JiaoTouPushController.java

@@ -0,0 +1,201 @@
+package org.dromara.external.controller.jiaotou;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.jiaotou.JiaoTouResult;
+import org.dromara.external.api.jiaotou.domian.bo.JTAfterSaleBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTApplyAfterSaleBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTChangeConsigneeInfoBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTCreateOrderBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTGetAreaAvailableBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTGetSkuImageBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTGetStorageBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTGoodsSkuBo;
+import org.dromara.external.api.jiaotou.domian.bo.JTOrderBo;
+import org.dromara.external.api.jiaotou.domian.vo.JTAfterSaleStatusVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTApplyAfterSaleVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTCancelAfterSaleVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTCreateOrderVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTDeliveryInfoVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTGoodsAreaAvailableVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTGoodsInfoVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTGoodsPriceVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTGoodsSaleStatusVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTGoodsStorageVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTOrderResultVo;
+import org.dromara.external.api.jiaotou.domian.vo.JTSkuImageVo;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 交投请求我们的接口(电商实现,i交投调用)
+ *
+ * @author
+ * @date 2025/8/5 下午6:31
+ */
+@Tag(name = "i交投-i交投调用我方接口")
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping(value = "/api")
+public class JiaoTouPushController {
+
+    /**
+     * 2.3.4 更新单个商品信息(电商实现)
+     */
+    @Operation(summary = "2.3.4 更新单个商品信息")
+    @PostMapping("/goods/updateGoodsInfo")
+    public JiaoTouResult<JTGoodsInfoVo> updateGoodsInfo(@RequestBody JTGoodsSkuBo bo) {
+        // TODO: 根据商品sku查询并返回单个商品信息
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.3.5 获取商品上下架状态(电商实现)
+     */
+    @Operation(summary = "2.3.5 获取商品上下架状态")
+    @PostMapping("/goods/getSaleStatus")
+    public JiaoTouResult<JTGoodsSaleStatusVo> getSaleStatus(@RequestBody JTGoodsSkuBo bo) {
+        // TODO: 根据商品sku获取商品的上下架状态
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.3.6 获取商品价格信息(电商实现)
+     */
+    @Operation(summary = "2.3.6 获取商品价格信息")
+    @PostMapping("/goods/getPrice")
+    public JiaoTouResult<JTGoodsPriceVo> getPrice(@RequestBody JTGoodsSkuBo bo) {
+        // TODO: 根据商品sku获取商品的最新价格
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.3.7 获取商品区划库存信息(电商实现)
+     */
+    @Operation(summary = "2.3.7 获取商品区划库存信息")
+    @PostMapping("/goods/getStorage")
+    public JiaoTouResult<JTGoodsStorageVo> getStorage(@RequestBody JTGetStorageBo bo) {
+        // TODO: 根据商品sku获取商品的区划库存
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.3.8 获取商品区划可售信息(电商实现)
+     */
+    @Operation(summary = "2.3.8 获取商品区划可售信息")
+    @PostMapping("/goods/getAreaAvailable")
+    public JiaoTouResult<JTGoodsAreaAvailableVo> getAreaAvailable(@RequestBody JTGetAreaAvailableBo bo) {
+        // TODO: 根据商品sku获取商品的区划可售信息
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.3.9 获取商品的图片信息(电商实现)
+     */
+    @Operation(summary = "2.3.9 获取商品的图片信息")
+    @PostMapping("/goods/getSkuImage")
+    public JiaoTouResult<List<JTSkuImageVo>> getSkuImage(@RequestBody JTGetSkuImageBo bo) {
+        // TODO: 根据商品sku获取商品的图片信息
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.4.1 创建(预占库存)订单(电商实现)
+     */
+    @Operation(summary = "2.4.1 创建(预占库存)订单")
+    @PostMapping("/order/createOrder")
+    public JiaoTouResult<JTCreateOrderVo> createOrder(@RequestBody JTCreateOrderBo bo) {
+        // TODO: 创建订单(预占库存)
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.4.2 确认订单(电商实现)
+     */
+    @Operation(summary = "2.4.2 确认订单")
+    @PostMapping("/order/confirmOrder")
+    public JiaoTouResult<JTOrderResultVo> confirmOrder(@RequestBody JTOrderBo bo) {
+        // TODO: 根据订单编号确认订单
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.4.3 取消订单(电商实现)
+     */
+    @Operation(summary = "2.4.3 取消订单")
+    @PostMapping("/order/cancelOrder")
+    public JiaoTouResult<JTOrderResultVo> cancelOrder(@RequestBody JTOrderBo bo) {
+        // TODO: 根据订单编号取消订单
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.4.5 获取订单物流信息(电商实现)
+     */
+    @Operation(summary = "2.4.5 获取订单物流信息")
+    @PostMapping("/order/getDeliveryInfo")
+    public JiaoTouResult<JTDeliveryInfoVo> getDeliveryInfo(@RequestBody JTOrderBo bo) {
+        // TODO: 根据订单编号获取订单物流信息
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.4.7 订单确认收货(电商实现)
+     */
+    @Operation(summary = "2.4.7 订单确认收货")
+    @PostMapping("/order/confirmReceiveOrder")
+    public JiaoTouResult<JTOrderResultVo> confirmReceiveOrder(@RequestBody JTOrderBo bo) {
+        // TODO: 根据订单编号确认收货
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.4.8 修改订单地址(电商实现)
+     */
+    @Operation(summary = "2.4.8 修改订单地址")
+    @PostMapping("/order/changeConsigneeInfo")
+    public JiaoTouResult<JTOrderResultVo> changeConsigneeInfo(@RequestBody JTChangeConsigneeInfoBo bo) {
+        // TODO: 下单后修改订单收货地址
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.5.1 申请售后(电商实现)
+     */
+    @Operation(summary = "2.5.1 申请售后")
+    @PostMapping("/applyAfterSale/create")
+    public JiaoTouResult<JTApplyAfterSaleVo> applyAfterSaleCreate(@RequestBody JTApplyAfterSaleBo bo) {
+        // TODO: 根据订单信息申请售后
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.5.2 取消申请售后(电商实现)
+     */
+    @Operation(summary = "2.5.2 取消申请售后")
+    @PostMapping("/applyAfterSale/cancel")
+    public JiaoTouResult<JTCancelAfterSaleVo> applyAfterSaleCancel(@RequestBody JTAfterSaleBo bo) {
+        // TODO: 根据申请售后单号取消申请售后
+        return JiaoTouResult.ok();
+    }
+
+    /**
+     * 2.5.3 查询售后进度(电商实现)
+     */
+    @Operation(summary = "2.5.3 查询售后进度")
+    @PostMapping("/applyAfterSale/query")
+    public JiaoTouResult<JTAfterSaleStatusVo> applyAfterSaleQuery(@RequestBody JTAfterSaleBo bo) {
+        // TODO: 根据申请售后单编号查询售后进度
+        return JiaoTouResult.ok();
+    }
+
+}