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

feat: 对接erp,订单创建接口

xdd пре 4 дана
родитељ
комит
ad1ac0d8d3
20 измењених фајлова са 1976 додато и 44 уклоњено
  1. 10 6
      fs-admin/src/test/java/com/fs/store/controller/FsStorePaymentControllerTest.java
  2. 90 0
      fs-service-system/src/main/java/com/fs/erp/constant/OrderStatusEnum.java
  3. 55 0
      fs-service-system/src/main/java/com/fs/erp/dto/ErpOrderResponseDTO.java
  4. 22 0
      fs-service-system/src/main/java/com/fs/erp/dto/ExtDataDTO.java
  5. 62 0
      fs-service-system/src/main/java/com/fs/erp/dto/FinanceDataDTO.java
  6. 2 2
      fs-service-system/src/main/java/com/fs/erp/dto/GetInitTokenRequestDTO.java
  7. 95 0
      fs-service-system/src/main/java/com/fs/erp/dto/LogisticsOrderRequestDTO.java
  8. 37 0
      fs-service-system/src/main/java/com/fs/erp/dto/OrderCancelRequestDTO.java
  9. 33 0
      fs-service-system/src/main/java/com/fs/erp/dto/OrderExtDTO.java
  10. 52 0
      fs-service-system/src/main/java/com/fs/erp/dto/OrderExtDataDTO.java
  11. 57 0
      fs-service-system/src/main/java/com/fs/erp/dto/OrderItemDTO.java
  12. 137 0
      fs-service-system/src/main/java/com/fs/erp/dto/OrderQueryRequestDTO.java
  13. 799 0
      fs-service-system/src/main/java/com/fs/erp/dto/OrderQueryResponseDTO.java
  14. 42 0
      fs-service-system/src/main/java/com/fs/erp/dto/PaymentDTO.java
  15. 146 0
      fs-service-system/src/main/java/com/fs/erp/dto/ShopOrderDTO.java
  16. 20 0
      fs-service-system/src/main/java/com/fs/erp/http/JstErpHttpService.java
  17. 158 32
      fs-service-system/src/main/java/com/fs/erp/http/JstErpHttpServiceImpl.java
  18. 29 1
      fs-service-system/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java
  19. 107 0
      fs-service-system/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  20. 23 3
      fs-service-system/src/main/java/com/fs/erp/utils/SignUtil.java

+ 10 - 6
fs-admin/src/test/java/com/fs/store/controller/FsStorePaymentControllerTest.java

@@ -33,6 +33,7 @@ import com.fs.wx.domain.FsWxExpressTask;
 import com.fs.wx.mapper.FsWxExpressTaskMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.collections4.CollectionUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -87,19 +88,22 @@ public class FsStorePaymentControllerTest {
     private JstErpHttpService httpService;
 
     @Test
-    public void initJstToken(){
+    public void initJstToken() {
         GetInitTokenRequestDTO requestDTO = new GetInitTokenRequestDTO();
-        requestDTO.setAppKey("b0b7d1db226d4216a3d58df9ffa2dde5");
-        requestDTO.setGrantType("authorization_code");
+        requestDTO.setApp_key("bd7a7d06a6d54377842f883f9a4c502a");
+        requestDTO.setGrant_type("authorization_code");
         requestDTO.setCharset("utf-8");
-        requestDTO.setCode("4xFIOC");
-        Map<String, Object> paramMap = BeanUtil.beanToMap(requestDTO);
+        requestDTO.setCode("zzzzzz");
+        requestDTO.setTimestamp(String.valueOf(System.currentTimeMillis() / 1000));
 
-        requestDTO.setSign(SignUtil.getSign("99c4cef262f34ca882975a7064de0b87",paramMap));
+        requestDTO.setSign(SignUtil.getSign("1d112cb9d21d41e187ff824b5852f4cf",requestDTO));
+
+        log.info("请求参数: {}", JSON.toJSONString(requestDTO));
         GetInitTokenResponseDTO initToken = httpService.getInitToken(requestDTO);
         log.info(JSON.toJSONString(initToken));
     }
 
+
     /**
      * 补事务id
      */

+ 90 - 0
fs-service-system/src/main/java/com/fs/erp/constant/OrderStatusEnum.java

@@ -0,0 +1,90 @@
+package com.fs.erp.constant;
+
+import lombok.Getter;
+
+/**
+ * 商城系统订单状态枚举
+ * 包含订单流转的各个状态及其说明
+ */
+@Getter
+public enum OrderStatusEnum {
+
+    /**
+     * 等待买家付款
+     */
+    WAIT_BUYER_PAY("等待买家付款"),
+
+    /**
+     * 等待卖家发货
+     * 传此状态时,实际支付金额(pay节点支付金额=应付金额)ERP才会显示已付款待审核
+     */
+    WAIT_SELLER_SEND_GOODS("等待卖家发货"),
+
+    /**
+     * 等待买家确认收货
+     */
+    WAIT_BUYER_CONFIRM_GOODS("等待买家确认收货"),
+
+    /**
+     * 交易成功
+     */
+    TRADE_FINISHED("交易成功"),
+
+    /**
+     * 付款后交易关闭
+     */
+    TRADE_CLOSED("付款后交易关闭"),
+
+    /**
+     * 付款前交易关闭
+     */
+    TRADE_CLOSED_BY_TAOBAO("付款前交易关闭");
+
+    /**
+     * 订单状态描述
+     */
+    private final String description;
+
+    /**
+     * 构造函数
+     * @param description 订单状态描述
+     */
+    OrderStatusEnum(String description) {
+        this.description = description;
+    }
+
+    /**
+     * 判断订单状态是否可以更新
+     * @return 所有状态均可更新,返回true
+     */
+    public boolean canUpdate() {
+        return true;
+    }
+
+    /**
+     * 根据状态码获取枚举实例
+     * @param code 状态码
+     * @return 对应的枚举实例,如果不存在则返回null
+     */
+    public static OrderStatusEnum getByCode(String code) {
+        try {
+            return OrderStatusEnum.valueOf(code);
+        } catch (IllegalArgumentException e) {
+            return null;
+        }
+    }
+
+    /**
+     * 检查给定的状态码是否为有效的订单状态
+     * @param code 状态码
+     * @return 是否有效
+     */
+    public static boolean isValidCode(String code) {
+        return getByCode(code) != null;
+    }
+
+    @Override
+    public String toString() {
+        return this.name() + "(" + this.description + ")";
+    }
+}

+ 55 - 0
fs-service-system/src/main/java/com/fs/erp/dto/ErpOrderResponseDTO.java

@@ -0,0 +1,55 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+import java.util.List;
+import java.io.Serializable;
+
+/**
+ * ERP订单返回结果DTO
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+@Accessors(chain = true)
+public class ErpOrderResponseDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单数据列表
+     */
+    private List<OrderData> datas;
+
+    /**
+     * 订单数据实体
+     */
+    @Data
+    @Accessors(chain = true)
+    public static class OrderData implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * ERP订单界面-内部单号
+         */
+        private Integer oId;
+
+        /**
+         * ERP订单界面-线上单号
+         */
+        private String soId;
+
+        /**
+         * 是否成功
+         */
+        private Boolean issuccess;
+
+        /**
+         * 返回结果描述
+         */
+        private String msg;
+    }
+}

+ 22 - 0
fs-service-system/src/main/java/com/fs/erp/dto/ExtDataDTO.java

@@ -0,0 +1,22 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 扩展数据DTO
+ */
+@Data
+class ExtDataDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 公司名称
+     */
+    private String companyName;
+
+    /**
+     * 门牌号
+     */
+    private String doorPlate;
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/erp/dto/FinanceDataDTO.java

@@ -0,0 +1,62 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 财务数据DTO
+ */
+@Data
+class FinanceDataDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 返点费用
+     */
+    private Double rebateFee;
+
+    /**
+     * 商品税
+     */
+    private Double productTax;
+
+    /**
+     * 运输税
+     */
+    private Double shippingTax;
+
+    /**
+     * 其他收入
+     */
+    private Double otherIncome;
+
+    /**
+     * 卖家代金券
+     */
+    private Double voucherFromSeller;
+
+    /**
+     * 平台佣金
+     */
+    private Double platformCommission;
+
+    /**
+     * 过渡费
+     */
+    private Double transitionFee;
+
+    /**
+     * 交易费
+     */
+    private Double transactionFee;
+
+    /**
+     * 不透明包装费
+     */
+    private Double opaqueBaggingFee;
+
+    /**
+     * 其他支出
+     */
+    private Double otherExpense;
+}

+ 2 - 2
fs-service-system/src/main/java/com/fs/erp/dto/GetInitTokenRequestDTO.java

@@ -22,7 +22,7 @@ public class GetInitTokenRequestDTO implements Serializable {
     /**
      * 开发者应用Key
      */
-    private String appKey;
+    private String app_key;
 
     /**
      * 当前请求的时间戳(单位:秒)
@@ -32,7 +32,7 @@ public class GetInitTokenRequestDTO implements Serializable {
     /**
      * 授权类型(固定值:authorization_code)
      */
-    private String grantType;
+    private String grant_type;
 
     /**
      * 交互数据编码(固定值:utf-8)

+ 95 - 0
fs-service-system/src/main/java/com/fs/erp/dto/LogisticsOrderRequestDTO.java

@@ -0,0 +1,95 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import java.util.List;
+import java.io.Serializable;
+
+/**
+ * 物流订单请求参数DTO
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class LogisticsOrderRequestDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单项列表
+     */
+    private List<LogisticsData> items;
+
+    /**
+     * 物流数据信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class LogisticsData implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 内部订单号
+         */
+        private Integer oId;
+
+        /**
+         * 店铺编号
+         */
+        private Integer shopId;
+
+        /**
+         * 线上单号
+         */
+        private String soId;
+
+        /**
+         * 快递公司
+         */
+        private String lcName;
+
+        /**
+         * 快递单号;如果选择了跨境物流表示国际运单号
+         */
+        private String lId;
+
+        /**
+         * 是否允许传重复物流单号;默认false不重复
+         */
+        private Boolean sendByUsedLid;
+
+        /**
+         * 快递公司编码,对应【物流(快递)公司及打印模板】中的物流公司编号
+         */
+        private String lcId;
+
+        /**
+         * 是否跨境物流;选true渠道信息必填
+         */
+        private Boolean isUnLid;
+
+        /**
+         * 渠道编码
+         */
+        private String trackingCode;
+
+        /**
+         * 渠道名称
+         */
+        private String trackingInfo;
+
+        /**
+         * 货代id(货代设置中的ID);默认值可以传1000
+         */
+        private Integer trackingType;
+    }
+}

+ 37 - 0
fs-service-system/src/main/java/com/fs/erp/dto/OrderCancelRequestDTO.java

@@ -0,0 +1,37 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+import java.util.List;
+import java.io.Serializable;
+
+/**
+ * 订单取消请求DTO
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+@Accessors(chain = true)
+public class OrderCancelRequestDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 内部订单号列表
+     * 一次最大支持50条
+     */
+    private List<Integer> oIds;
+
+    /**
+     * 取消类型
+     * 示例值:不需要了
+     */
+    private String cancelType;
+
+    /**
+     * 备注信息
+     */
+    private String remark;
+}

+ 33 - 0
fs-service-system/src/main/java/com/fs/erp/dto/OrderExtDTO.java

@@ -0,0 +1,33 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 订单扩展信息DTO
+ */
+@Data
+class OrderExtDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 跟踪号
+     */
+    private String trackingNo;
+
+    /**
+     * 跟踪类型
+     */
+    private String trackingType;
+
+    /**
+     * PDF URL
+     */
+    private String pdfUrl;
+
+    /**
+     * 扩展数据列表
+     */
+    private List<OrderExtDataDTO> datas;
+}

+ 52 - 0
fs-service-system/src/main/java/com/fs/erp/dto/OrderExtDataDTO.java

@@ -0,0 +1,52 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 订单扩展数据DTO
+ */
+@Data
+class OrderExtDataDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String autoId;
+    private String iid;
+    private String skuId;
+    private String skuCode;
+    private String name;
+    private String declareNameZN;
+    private String declareNameEN;
+    private String declareAmount;
+    private String declareWeight;
+    private String hsCode;
+    private String postTaxNum;
+    private Boolean isBattery;
+    private Boolean isLiquid;
+    private Boolean isDisable;
+    private String creator;
+    private String created;
+    private String modifier;
+    private String modified;
+    private String unit;
+    private Boolean isSetSkubin;
+    private Boolean isJoinSkuid;
+    private Boolean isPaste;
+    private Boolean isMagnetic;
+    private Boolean isFluid;
+    private Boolean isGetPrice;
+    private Boolean isGetWeight;
+    private String specialAttr;
+    private String country;
+    private String tempName;
+    private String tempId;
+    private Boolean isDefault;
+    private String shopId;
+    private Boolean isOAmount;
+    private String cid;
+    private Boolean isPowder;
+    private Boolean isSpecialCargo;
+    private Boolean isJoinSkubin;
+    private String saveType;
+    private Integer declareType;
+}

+ 57 - 0
fs-service-system/src/main/java/com/fs/erp/dto/OrderItemDTO.java

@@ -0,0 +1,57 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 订单商品项DTO
+ */
+@Data
+public class OrderItemDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * SKU ID
+     */
+    private String skuId;
+
+    /**
+     * 店铺SKU ID
+     */
+    private String shopSkuId;
+
+    /**
+     * 金额
+     */
+    private Double amount;
+
+    /**
+     * 基础价格
+     */
+    private Double basePrice;
+
+    /**
+     * 数量
+     */
+    private Integer qty;
+
+    /**
+     * 商品名称
+     */
+    private String name;
+
+    /**
+     * 外部订单项ID
+     */
+    private String outerOiId;
+
+    /**
+     * 批次ID
+     */
+    private String batchId;
+
+    /**
+     * 生产日期
+     */
+    private String producedDate;
+}

+ 137 - 0
fs-service-system/src/main/java/com/fs/erp/dto/OrderQueryRequestDTO.java

@@ -0,0 +1,137 @@
+package com.fs.erp.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 订单查询请求参数DTO
+ *
+ * @author xdd
+ * @date 2025-02-27
+ * @version 1.0
+ * @description 订单查询相关参数封装对象
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OrderQueryRequestDTO implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+
+    /**
+     * 店铺编号
+     */
+    private Integer shopId;
+
+    /**
+     * 是否线下店铺
+     * shop_id为0且is_offline_shop为true查询线下店铺单据
+     */
+    private Boolean isOfflineShop;
+
+    /**
+     * 线上单号列表
+     * 与时间条件、内部单号不能同时为空,最大限制20条
+     */
+    private List<String> soIds;
+
+    /**
+     * 起始时间
+     * 和结束时间必须同时存在,时间间隔不能超过七天
+     * 与线上单号、内部单号不能同时为空
+     */
+    private String modifiedBegin;
+
+    /**
+     * 结束时间
+     * 和起始时间必须同时存在,时间间隔不能超过七天
+     * 与线上单号、内部单号不能同时为空
+     */
+    private String modifiedEnd;
+
+    /**
+     * 日期类型
+     * 0:修改时间modified
+     * 2:订单日期order_date
+     * 3:发货时间send_date
+     * 非必填,默认0
+     */
+    private Integer dateType;
+
+    /**
+     * 订单状态
+     * 待付款:WaitPay
+     * 发货中:Delivering
+     * 被合并:Merged
+     * 异常:Question
+     * 被拆分:Split
+     * 等供销商|外仓发货:WaitOuterSent
+     * 已付款待审核:WaitConfirm
+     * 已客审待财审:WaitFConfirm
+     * 已发货:Sent
+     * 取消:Cancelled
+     */
+    private String status;
+
+    /**
+     * 第几页,从1开始
+     */
+    private Integer pageIndex;
+
+    /**
+     * 每页条数,最大100条
+     */
+    private Integer pageSize;
+
+    /**
+     * ts时间戳
+     * sql server中的行版本号,该字段查询防止分页过程中漏单
+     * 查询条件值是大于等于的关系
+     */
+    private Integer startTs;
+
+    /**
+     * 是否查询总条数
+     * 默认true,如果使用start_ts查询,该值传false否则影响查询效率
+     */
+    private Boolean isGetTotal;
+
+    /**
+     * 内部订单号列表
+     * 商家维度下订单信息的唯一值
+     * 与时间条件、线上单号不能同时为空
+     */
+    private List<Long> oIds;
+
+    /**
+     * 是否查询跨境财务信息
+     */
+    private Boolean isGetCbfinance;
+
+    /**
+     * 订单自定义查询字段列表
+     * 可选值:volume(体积),package(包材),outer_drp_co_id(货主分销),
+     * cus_id(货通客户id),oaid(oaid)
+     */
+    private List<String> orderFlds;
+
+    /**
+     * 订单明细自定义查询字段列表
+     * 可选值:src_combine_sku_id(原组合商品编码),referrer_name(主播名称),
+     * presale_date(预售时间),drp_price(采购价),item_plan_delivery_date(最晚发货时间)
+     */
+    private List<String> orderItemFlds;
+
+    /**
+     * 订单类型列表
+     * 如:"普通订单","普通订单,供销Plus"
+     */
+    private List<String> orderTypes;
+
+}

+ 799 - 0
fs-service-system/src/main/java/com/fs/erp/dto/OrderQueryResponseDTO.java

@@ -0,0 +1,799 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+import java.util.List;
+import java.util.Date;
+import java.math.BigDecimal;
+
+/**
+ * 订单查询响应对象
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OrderQueryResponseDTO {
+
+    /**
+     * 每页大小
+     */
+    private Integer pageSize;
+
+    /**
+     * 页码
+     */
+    private Integer pageIndex;
+
+    /**
+     * 总数据条数
+     */
+    private Integer dataCount;
+
+    /**
+     * 总页数
+     */
+    private Integer pageCount;
+
+    /**
+     * 是否有下一页
+     */
+    private Boolean hasNext;
+
+    /**
+     * 订单列表
+     */
+    private List<Order> orders;
+
+    /**
+     * 响应码
+     */
+    private Integer code;
+
+    /**
+     * 是否成功
+     */
+    private Boolean issuccess;
+
+    /**
+     * 响应信息
+     */
+    private String msg;
+
+    /**
+     * 请求ID
+     */
+    private String requestId;
+
+    /**
+     * 订单信息
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class Order {
+        /**
+         * 公司订单ID
+         */
+        private Long coId;
+
+        /**
+         * 订单ID
+         */
+        private Long oId;
+
+        /**
+         * 店铺ID
+         */
+        private Long shopId;
+
+        /**
+         * 销售订单号
+         */
+        private String soId;
+
+        /**
+         * 下单时间
+         */
+        private String orderDate;
+
+        /**
+         * 店铺状态
+         */
+        private String shopStatus;
+
+        /**
+         * 问题类型
+         */
+        private String questionType;
+
+        /**
+         * 问题描述
+         */
+        private String questionDesc;
+
+        /**
+         * 订单状态
+         */
+        private String status;
+
+        /**
+         * 收件人国家
+         */
+        private String receiverCountry;
+
+        /**
+         * 收件人州/省
+         */
+        private String receiverState;
+
+        /**
+         * 收件人城市
+         */
+        private String receiverCity;
+
+        /**
+         * 收件人区域
+         */
+        private String receiverDistrict;
+
+        /**
+         * 收件人地址
+         */
+        private String receiverAddress;
+
+        /**
+         * 收件人镇/街道
+         */
+        private String receiverTown;
+
+        /**
+         * 收件人邮编
+         */
+        private String receiverZip;
+
+        /**
+         * 买家ID
+         */
+        private Long buyerId;
+
+        /**
+         * 发货日期
+         */
+        private String sendDate;
+
+        /**
+         * 支付金额
+         */
+        private BigDecimal payAmount;
+
+        /**
+         * 运费
+         */
+        private BigDecimal freight;
+
+        /**
+         * 转运费
+         */
+        private BigDecimal fFreight;
+
+        /**
+         * 重量
+         */
+        private BigDecimal weight;
+
+        /**
+         * 实际重量
+         */
+        private BigDecimal fWeight;
+
+        /**
+         * 买家留言
+         */
+        private String buyerMessage;
+
+        /**
+         * 备注
+         */
+        private String remark;
+
+        /**
+         * 发票抬头
+         */
+        private String invoiceTitle;
+
+        /**
+         * 是否货到付款
+         */
+        private Boolean isCod;
+
+        /**
+         * 订单类型
+         */
+        private String type;
+
+        /**
+         * 店铺站点
+         */
+        private String shopSite;
+
+        /**
+         * 优惠金额
+         */
+        private BigDecimal freeAmount;
+
+        /**
+         * 实付金额
+         */
+        private BigDecimal paidAmount;
+
+        /**
+         * 支付时间
+         */
+        private String payDate;
+
+        /**
+         * 外部支付ID
+         */
+        private String outerPayId;
+
+        /**
+         * 修改时间
+         */
+        private String modified;
+
+        /**
+         * 订单来源
+         */
+        private String orderFrom;
+
+        /**
+         * 店铺名称
+         */
+        private String shopName;
+
+        /**
+         * 卖家标记
+         */
+        private String sellerFlag;
+
+        /**
+         * 计划发货日期
+         */
+        private String planDeliveryDate;
+
+        /**
+         * 物流公司编码
+         */
+        private String lcId;
+
+        /**
+         * 物流ID
+         */
+        private String lId;
+
+        /**
+         * 物流公司
+         */
+        private String logisticsCompany;
+
+        /**
+         * 折扣率
+         */
+        private BigDecimal discountRate;
+
+        /**
+         * 标签
+         */
+        private String tag;
+
+        /**
+         * 仓库订单ID
+         */
+        private Long wmsCoId;
+
+        /**
+         * 币种
+         */
+        private String currency;
+
+        /**
+         * 节点
+         */
+        private String node;
+
+        /**
+         * 标签列表
+         */
+        private String labels;
+
+        /**
+         * 订单金额
+         */
+        private BigDecimal amount;
+
+        /**
+         * 分销来源订单ID
+         */
+        private Long drpCoIdFrom;
+
+        /**
+         * 是否拆分
+         */
+        private Boolean isSplit;
+
+        /**
+         * 是否合并
+         */
+        private Boolean isMerge;
+
+        /**
+         * 创建人
+         */
+        private String creatorName;
+
+        /**
+         * 买家税号
+         */
+        private String buyerTaxNo;
+
+        /**
+         * 发票类型
+         */
+        private String invoiceType;
+
+        /**
+         * 签收时间
+         */
+        private String signTime;
+
+        /**
+         * SKU列表
+         */
+        private String skus;
+
+        /**
+         * 结束时间
+         */
+        private String endTime;
+
+        /**
+         * 收件人邮箱
+         */
+        private String receiverEmail;
+
+        /**
+         * 推荐人ID
+         */
+        private String referrerId;
+
+        /**
+         * 推荐人名称
+         */
+        private String referrerName;
+
+        /**
+         * 创建时间
+         */
+        private String created;
+
+        /**
+         * 物流单号
+         */
+        private String shipment;
+
+        /**
+         * 开放平台ID
+         */
+        private String openId;
+
+        /**
+         * 售后ID
+         */
+        private String outerAsId;
+
+        /**
+         * 时间戳
+         */
+        private Long ts;
+
+        /**
+         * 买家实付金额
+         */
+        private BigDecimal buyerPaidAmount;
+
+        /**
+         * 卖家实收金额
+         */
+        private BigDecimal sellerIncomeAmount;
+
+        /**
+         * 关联订单ID
+         */
+        private String linkOId;
+
+        /**
+         * 合并订单号
+         */
+        private String mergeSoId;
+
+        /**
+         * 外部订单号
+         */
+        private String outerSoId;
+
+        /**
+         * 分销目标订单ID
+         */
+        private Long drpCoIdTo;
+
+        /**
+         * 店铺买家ID
+         */
+        private String shopBuyerId;
+
+        /**
+         * 收件人姓名
+         */
+        private String receiverName;
+
+        /**
+         * 收件人手机
+         */
+        private String receiverMobile;
+
+        /**
+         * 收件人电话
+         */
+        private String receiverPhone;
+
+        /**
+         * 扩展数据
+         */
+        private String extDatas;
+
+        /**
+         * 售后ID
+         */
+        private String asId;
+
+        /**
+         * 原始订单号列表
+         */
+        private List<String> rawSoIds;
+
+        /**
+         * 未知ID
+         */
+        private String unLid;
+
+        /**
+         * 选择的物流渠道
+         */
+        private String chosenChannel;
+
+        /**
+         * 订单明细
+         */
+        private List<OrderItem> items;
+
+        /**
+         * 支付信息
+         */
+        private List<OrderPay> pays;
+
+        /**
+         * 分销来源
+         */
+        private String drpFrom;
+
+        /**
+         * 分销目标
+         */
+        private String drpTo;
+
+        /**
+         * 财务信息
+         */
+        private List<CbFinance> cbFinances;
+
+        /**
+         * 眼镜信息
+         */
+        private String glasses;
+    }
+
+    /**
+     * 订单明细
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class OrderItem {
+        /**
+         * 订单明细ID
+         */
+        private Long oiId;
+
+        /**
+         * SKU ID
+         */
+        private String skuId;
+
+        /**
+         * 商品ID
+         */
+        private String iId;
+
+        /**
+         * 店铺SKU ID
+         */
+        private String shopSkuId;
+
+        /**
+         * 店铺商品ID
+         */
+        private String shopIId;
+
+        /**
+         * 商品属性
+         */
+        private String propertiesValue;
+
+        /**
+         * 商品金额
+         */
+        private BigDecimal amount;
+
+        /**
+         * 基础价格
+         */
+        private BigDecimal basePrice;
+
+        /**
+         * 数量
+         */
+        private Integer qty;
+
+        /**
+         * 商品名称
+         */
+        private String name;
+
+        /**
+         * 价格
+         */
+        private BigDecimal price;
+
+        /**
+         * 外部明细ID
+         */
+        private String outerOiId;
+
+        /**
+         * 退款ID
+         */
+        private String refundId;
+
+        /**
+         * 退款数量
+         */
+        private Integer refundQty;
+
+        /**
+         * 退款状态
+         */
+        private String refundStatus;
+
+        /**
+         * 原始订单号
+         */
+        private String rawSoId;
+
+        /**
+         * 是否预售
+         */
+        private Boolean isPresale;
+
+        /**
+         * 是否赠品
+         */
+        private Boolean isGift;
+
+        /**
+         * 商品状态
+         */
+        private String itemStatus;
+
+        /**
+         * 发货仓库
+         */
+        private Integer sendWarehouse;
+
+        /**
+         * 商品支付金额
+         */
+        private BigDecimal itemPayAmount;
+
+        /**
+         * 推荐人ID
+         */
+        private String referrerId;
+
+        /**
+         * 折扣率
+         */
+        private BigDecimal discountRate;
+
+        /**
+         * 商品图片
+         */
+        private String pic;
+
+        /**
+         * SKU类型
+         */
+        private String skuType;
+
+        /**
+         * 备注
+         */
+        private String remark;
+
+        /**
+         * 源组合SKU ID
+         */
+        private String srcCombineSkuId;
+
+        /**
+         * 商品扩展数据
+         */
+        private String itemExtData;
+
+        /**
+         * 买家实付金额
+         */
+        private BigDecimal buyerPaidAmount;
+
+        /**
+         * 卖家实收金额
+         */
+        private BigDecimal sellerIncomeAmount;
+
+        /**
+         * 订单ID
+         */
+        private Long oId;
+    }
+
+    /**
+     * 支付信息
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class OrderPay {
+        /**
+         * 支付ID
+         */
+        private Long payId;
+
+        /**
+         * 外部支付ID
+         */
+        private String outerPayId;
+
+        /**
+         * 支付时间
+         */
+        private String payDate;
+
+        /**
+         * 支付金额
+         */
+        private BigDecimal amount;
+
+        /**
+         * 支付方式
+         */
+        private String payment;
+
+        /**
+         * 买家账号
+         */
+        private String buyerAccount;
+
+        /**
+         * 是否订单支付
+         */
+        private Boolean isOrderPay;
+
+        /**
+         * 支付状态
+         */
+        private String status;
+
+        /**
+         * 支付类型
+         */
+        private Integer payType;
+
+        /**
+         * 订单ID
+         */
+        private Long oId;
+    }
+
+    /**
+     * 财务信息
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class CbFinance {
+        /**
+         * 订单ID
+         */
+        private Long oId;
+
+        /**
+         * 返点费用
+         */
+        private BigDecimal rebateFee;
+
+        /**
+         * 商品税费
+         */
+        private BigDecimal productTax;
+
+        /**
+         * 运费税费
+         */
+        private BigDecimal shippingTax;
+
+        /**
+         * 其他收入
+         */
+        private BigDecimal otherIncome;
+
+        /**
+         * 卖家代金券
+         */
+        private BigDecimal voucherFromSeller;
+
+        /**
+         * 平台佣金
+         */
+        private BigDecimal platformCommission;
+
+        /**
+         * 过渡费用
+         */
+        private BigDecimal transitionFee;
+
+        /**
+         * 交易费用
+         */
+        private BigDecimal transactionFee;
+
+        /**
+         * 不透明包装费
+         */
+        private BigDecimal opaqueBaggingFee;
+
+        /**
+         * 其他支出
+         */
+        private BigDecimal otherExpense;
+    }
+}

+ 42 - 0
fs-service-system/src/main/java/com/fs/erp/dto/PaymentDTO.java

@@ -0,0 +1,42 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 支付信息DTO
+ */
+@Data
+public class PaymentDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 外部支付ID
+     */
+    private String outerPayId;
+
+    /**
+     * 支付日期
+     */
+    private String payDate;
+
+    /**
+     * 支付方式
+     */
+    private String payment;
+
+    /**
+     * 卖家账户
+     */
+    private String sellerAccount;
+
+    /**
+     * 买家账户
+     */
+    private String buyerAccount;
+
+    /**
+     * 支付金额
+     */
+    private Double amount;
+}

+ 146 - 0
fs-service-system/src/main/java/com/fs/erp/dto/ShopOrderDTO.java

@@ -0,0 +1,146 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import java.util.List;
+import java.util.Date;
+import java.io.Serializable;
+/**
+ * 店铺订单信息DTO
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+public class ShopOrderDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 店铺ID
+     */
+    private Long shopId;
+
+    /**
+     * 订单ID
+     */
+    private String soId;
+
+    /**
+     * 订单日期
+     */
+    private String orderDate;
+
+    /**
+     * 店铺订单状态
+     */
+    private String shopStatus;
+
+    /**
+     * 买家ID
+     */
+    private String shopBuyerId;
+
+    /**
+     * 收货人省份
+     */
+    private String receiverState;
+
+    /**
+     * 收货人城市
+     */
+    private String receiverCity;
+
+    /**
+     * 收货人区域
+     */
+    private String receiverDistrict;
+
+    /**
+     * 收货人详细地址
+     */
+    private String receiverAddress;
+
+    /**
+     * 收货人姓名
+     */
+    private String receiverName;
+
+    /**
+     * 收货人电话
+     */
+    private String receiverPhone;
+
+    /**
+     * 收货人邮编
+     */
+    private String receiverZip;
+
+    /**
+     * 支付金额
+     */
+    private Double payAmount;
+
+    /**
+     * 运费
+     */
+    private Double freight;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 买家留言
+     */
+    private String buyerMessage;
+
+    /**
+     * 订单修改时间
+     */
+    private String shopModified;
+
+    /**
+     * 物流ID
+     */
+    private String lId;
+
+    /**
+     * 物流公司
+     */
+    private String logisticsCompany;
+
+    /**
+     * 标签
+     */
+    private String labels;
+
+    /**
+     * 物流公司ID
+     */
+    private String lcId;
+
+    /**
+     * 订单商品项列表
+     */
+    private List<OrderItemDTO> items;
+
+    /**
+     * 支付信息
+     */
+    private PaymentDTO pay;
+
+    /**
+     * 扩展数据
+     */
+    private ExtDataDTO extDatas;
+
+    /**
+     * 订单扩展信息
+     */
+    private OrderExtDTO orderExt;
+
+    /**
+     * 财务数据
+     */
+    private FinanceDataDTO financeData;
+}

+ 20 - 0
fs-service-system/src/main/java/com/fs/erp/http/JstErpHttpService.java

@@ -40,4 +40,24 @@ public interface JstErpHttpService {
      */
     ProductResponseDTO queryGoods(ProductQueryRequestDTO dto);
 
+    /**
+     * 订单上传(商家自有商城、跨境线下)
+     * @param dto 请求参数
+     * @return ErpOrderResponseDTO
+     */
+    ErpOrderResponseDTO upload(ShopOrderDTO dto);
+
+    /**
+     * 订单查询(自有商城、跨境线下)
+     * @param dto 请求参数
+     * @return OrderQueryResponseDTO
+     */
+    OrderQueryResponseDTO query(OrderQueryRequestDTO dto);
+
+    /**
+     * 订单取消-按内部单号取消
+     * @param dto 请求参数
+     * @return CommonResponse
+     */
+    CommonResponse cacel(OrderCancelRequestDTO dto);
 }

+ 158 - 32
fs-service-system/src/main/java/com/fs/erp/http/JstErpHttpServiceImpl.java

@@ -1,71 +1,197 @@
 package com.fs.erp.http;
 
-import cn.hutool.http.HttpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
 import com.fs.erp.dto.*;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.ObjectUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
+import java.util.Map;
 
+@Slf4j
 @Service
-public class JstErpHttpServiceImpl implements JstErpHttpService{
+public class JstErpHttpServiceImpl implements JstErpHttpService {
 
     private static final String BASE_URL = "https://openapi.jushuitan.com/";
     /**
      * 获取access_token、refresh_token url
      */
-    private static final String GET_INIT_TOKEN_URL = BASE_URL+"openWeb/auth/getInitToken";
+    private static final String GET_INIT_TOKEN_URL = BASE_URL + "openWeb/auth/getInitToken";
 
     /**
      * 更新access_token、refresh_token url
      */
-    private static final String REFRESH_TOKEN_URL = BASE_URL+"openWeb/auth/refreshToken";
-
+    private static final String REFRESH_TOKEN_URL = BASE_URL + "openWeb/auth/refreshToken";
 
     @Override
     public GetInitTokenResponseDTO getInitToken(GetInitTokenRequestDTO dto) {
-        String post = HttpUtil.post(GET_INIT_TOKEN_URL, JSON.toJSONString(dto));
+        // 将DTO转换为表单参数
+        Map<String, Object> formParams = BeanUtil.beanToMap(dto);
+        log.info("请求初始化token - URL: {}, 参数: {}", GET_INIT_TOKEN_URL, JSON.toJSONString(formParams));
 
-        TypeReference<CommonResponse<GetInitTokenResponseDTO>> typeReference = new TypeReference<CommonResponse<GetInitTokenResponseDTO>>(){};
-        CommonResponse<GetInitTokenResponseDTO> response = JSON.parseObject(post, typeReference);
-        if(ObjectUtils.notEqual(response.getCode(),0)) {
-            throw new RuntimeException("请求接口失败!原因:"+response.getMsg());
-        }
-        return response.getData();
+        HttpResponse response = executeFormPost(GET_INIT_TOKEN_URL, formParams);
+        return parseResponse(response, new TypeReference<CommonResponse<GetInitTokenResponseDTO>>() {});
     }
 
     @Override
     public GetInitTokenResponseDTO refreshToken(GetInitTokenRequestDTO dto) {
-        String post = HttpUtil.post(REFRESH_TOKEN_URL, JSON.toJSONString(dto));
-        TypeReference<CommonResponse<GetInitTokenResponseDTO>> typeReference = new TypeReference<CommonResponse<GetInitTokenResponseDTO>>(){};
-        CommonResponse<GetInitTokenResponseDTO> response = JSON.parseObject(post, typeReference);
-        if(ObjectUtils.notEqual(response.getCode(),0)) {
-            throw new RuntimeException("请求接口失败!原因:"+response.getMsg());
-        }
-        return response.getData();
+        log.info("刷新token - URL: {}, 请求体: {}", REFRESH_TOKEN_URL, JSON.toJSONString(dto));
+
+        HttpResponse response = executeJsonPost(REFRESH_TOKEN_URL, dto);
+        return parseResponse(response, new TypeReference<CommonResponse<GetInitTokenResponseDTO>>() {});
     }
 
     @Override
     public ProductUploadResultDTO uploadGoods(GoodsInfoDTO dto) {
+        String url = BASE_URL + "/open/jushuitan/itemsku/upload";
+        log.info("上传商品信息 - URL: {}, 请求体: {}", url, JSON.toJSONString(dto));
 
-        String post = HttpUtil.post(BASE_URL + "/open/jushuitan/itemsku/upload", JSON.toJSONString(dto));
-        TypeReference<CommonResponse<ProductUploadResultDTO>> typeReference = new TypeReference<CommonResponse<ProductUploadResultDTO>>(){};
-        CommonResponse<ProductUploadResultDTO> response = JSON.parseObject(post, typeReference);
-        if(ObjectUtils.notEqual(response.getCode(),0)) {
-            throw new RuntimeException("请求接口失败!原因:"+response.getMsg());
-        }
-        return response.getData();
+        HttpResponse response = executeJsonPost(url, dto);
+        return parseResponse(response, new TypeReference<CommonResponse<ProductUploadResultDTO>>() {});
     }
 
     @Override
     public ProductResponseDTO queryGoods(ProductQueryRequestDTO dto) {
-        String post = HttpUtil.post(BASE_URL + "/open/sku/query", JSON.toJSONString(dto));
-        TypeReference<CommonResponse<ProductResponseDTO>> typeReference = new TypeReference<CommonResponse<ProductResponseDTO>>(){};
-        CommonResponse<ProductResponseDTO> response = JSON.parseObject(post, typeReference);
-        if(ObjectUtils.notEqual(response.getCode(),0)) {
-            throw new RuntimeException("请求接口失败!原因:"+response.getMsg());
+        String url = BASE_URL + "/open/sku/query";
+        log.info("查询商品信息 - URL: {}, 请求体: {}", url, JSON.toJSONString(dto));
+
+        HttpResponse response = executeJsonPost(url, dto);
+        return parseResponse(response, new TypeReference<CommonResponse<ProductResponseDTO>>() {});
+    }
+
+    @Override
+    public ErpOrderResponseDTO upload(ShopOrderDTO dto) {
+        String url = BASE_URL + "/open/jushuitan/orders/upload";
+        log.info("上传订单信息 - URL: {}, 请求体: {}", url, JSON.toJSONString(dto));
+
+        HttpResponse response = executeJsonPost(url, dto);
+        return parseResponse(response, new TypeReference<CommonResponse<ErpOrderResponseDTO>>() {});
+    }
+
+    @Override
+    public OrderQueryResponseDTO query(OrderQueryRequestDTO dto) {
+        String url = BASE_URL + "/open/orders/single/query";
+        log.info("查询订单信息 - URL: {}, 请求体: {}", url, JSON.toJSONString(dto));
+
+        HttpResponse response = executeJsonPost(url, dto);
+        return parseResponse(response, new TypeReference<CommonResponse<OrderQueryResponseDTO>>() {});
+    }
+
+    @Override
+    public CommonResponse cacel(OrderCancelRequestDTO dto) {
+        String url = BASE_URL + "/open/jushuitan/orderbyoid/cancel";
+        log.info("取消订单 - URL: {}, 请求体: {}", url, JSON.toJSONString(dto));
+
+        HttpResponse response = executeJsonPost(url, dto);
+        // 这里直接返回CommonResponse类型
+        return parseCommonResponse(response);
+    }
+
+    /**
+     * 执行JSON格式的POST请求
+     *
+     * @param url 请求URL
+     * @param dto 请求对象
+     * @return HttpResponse响应
+     */
+    private HttpResponse executeJsonPost(String url, Object dto) {
+        String jsonBody = JSON.toJSONString(dto);
+        Map<String, String> headers = MapUtil.builder(new HashMap<String, String>())
+                .put("Content-Type", "application/json;charset=UTF-8")
+                .build();
+
+        log.debug("发送JSON请求 - URL: {}, Headers: {}, Body: {}", url, headers, jsonBody);
+
+        HttpResponse response = HttpRequest.post(url)
+                .headerMap(headers, true)
+                .body(jsonBody)
+                .execute();
+
+        logResponse(response);
+        return response;
+    }
+
+    /**
+     * 执行表单格式的POST请求
+     *
+     * @param url 请求URL
+     * @param formParams 表单参数
+     * @return HttpResponse响应
+     */
+    private HttpResponse executeFormPost(String url, Map<String, Object> formParams) {
+        Map<String, String> headers = MapUtil.builder(new HashMap<String, String>())
+                .put("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
+                .build();
+
+        log.debug("发送表单请求 - URL: {}, Headers: {}, Form: {}", url, headers, formParams);
+
+        HttpResponse response = HttpRequest.post(url)
+                .headerMap(headers, true)
+                .form(formParams)
+                .execute();
+
+        logResponse(response);
+        return response;
+    }
+
+    /**
+     * 记录HTTP响应日志
+     *
+     * @param response HTTP响应
+     */
+    private void logResponse(HttpResponse response) {
+        log.debug("收到响应 - Status: {}, Headers: {}", response.getStatus(), response.headers());
+        log.debug("响应体: {}", response.body());
+    }
+
+    /**
+     * 解析带有泛型的HTTP响应
+     *
+     * @param response HTTP响应
+     * @param typeReference 响应类型引用
+     * @param <T> 期望的响应数据类型
+     * @return 解析后的数据
+     */
+    private <T> T parseResponse(HttpResponse response, TypeReference<CommonResponse<T>> typeReference) {
+        String body = response.body();
+        log.debug("解析响应体: {}", body);
+
+        CommonResponse<T> commonResponse = JSON.parseObject(body, typeReference);
+
+        if (ObjectUtils.notEqual(commonResponse.getCode(), 0)) {
+            log.error("API请求失败 - 错误码: {}, 错误信息: {}", commonResponse.getCode(), commonResponse.getMsg());
+            throw new RuntimeException("请求接口失败!原因:" + commonResponse.getMsg());
+        }
+
+        T result = commonResponse.getData();
+        log.info("API请求成功 - 结果: {}", JSON.toJSONString(result));
+        return result;
+    }
+
+    /**
+     * 解析普通CommonResponse响应(无泛型)
+     *
+     * @param response HTTP响应
+     * @return CommonResponse对象
+     */
+    private CommonResponse parseCommonResponse(HttpResponse response) {
+        String body = response.body();
+        log.debug("解析响应体: {}", body);
+
+        CommonResponse commonResponse = JSON.parseObject(body, CommonResponse.class);
+
+        if (ObjectUtils.notEqual(commonResponse.getCode(), 0)) {
+            log.error("API请求失败 - 错误码: {}, 错误信息: {}", commonResponse.getCode(), commonResponse.getMsg());
+            throw new RuntimeException("请求接口失败!原因:" + commonResponse.getMsg());
         }
-        return response.getData();
+
+        log.info("API请求成功 - 结果: {}", JSON.toJSONString(commonResponse));
+        return commonResponse;
     }
 }

+ 29 - 1
fs-service-system/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java

@@ -2,13 +2,21 @@ package com.fs.erp.service.impl;
 
 import com.fs.erp.domain.ErpGoods;
 import com.fs.erp.dto.*;
+import com.fs.erp.http.JstErpHttpService;
 import com.fs.erp.service.IErpGoodsService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Service
 @Primary
 public class JSTErpGoodsServiceImpl implements IErpGoodsService {
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
     @Override
     public BaseResponse addGoods(ErpGoods goods) {
         return null;
@@ -16,7 +24,27 @@ public class JSTErpGoodsServiceImpl implements IErpGoodsService {
 
     @Override
     public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
-        return null;
+        ProductQueryRequestDTO requestDTO = new ProductQueryRequestDTO();
+        requestDTO.setSkuIds(param.getCode());
+        ProductResponseDTO productResponseDTO = jstErpHttpService.queryGoods(requestDTO);
+        List<ProductResponseDTO.ProductInfo> datas = productResponseDTO.getDatas();
+        ErpGoodsQueryResponse erpGoodsQueryResponse = new ErpGoodsQueryResponse();
+        if(CollectionUtils.isNotEmpty(datas)){
+            List<ErpGoods> erpGoodsList = new ArrayList<>();
+            for (ProductResponseDTO.ProductInfo data : datas) {
+                ErpGoods erpGoods = new ErpGoods();
+                erpGoods.setCode(data.getSkuCode());
+                erpGoods.setName(data.getName());
+                erpGoods.setSimple_name(data.getShortName());
+                erpGoods.setCategory_code(data.getCategory());
+                erpGoods.setCost_price(data.getCostPrice());
+                erpGoods.setSales_price(data.getSalePrice());
+                erpGoods.setPurchase_price(data.getMarketPrice());
+                erpGoodsList.add(erpGoods);
+            }
+            erpGoodsQueryResponse.setItems(erpGoodsList);
+        }
+        return erpGoodsQueryResponse;
     }
 
     @Override

+ 107 - 0
fs-service-system/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -0,0 +1,107 @@
+package com.fs.erp.service.impl;
+
+import com.fs.erp.constant.OrderStatusEnum;
+import com.fs.erp.domain.ErpOrder;
+import com.fs.erp.domain.ErpOrderItem;
+import com.fs.erp.domain.ErpOrderPayment;
+import com.fs.erp.domain.ErpRefundOrder;
+import com.fs.erp.dto.*;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.service.IErpOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class JSTErpOrderServiceImpl implements IErpOrderService {
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+    @Override
+    public ErpOrderResponse addOrder(ErpOrder order) {
+        ErpOrderPayment erpOrderPayment = order.getPayments().get(0);
+
+        ShopOrderDTO shopOrderDTO = new ShopOrderDTO();
+        shopOrderDTO.setShopId(Long.valueOf(order.getShop_code()));
+        shopOrderDTO.setSoId(order.getPlatform_code());
+        shopOrderDTO.setOrderDate(order.getDeal_datetime());
+        // 待发货
+        shopOrderDTO.setShopStatus(OrderStatusEnum.WAIT_SELLER_SEND_GOODS.name());
+        // 买家账号
+        shopOrderDTO.setShopBuyerId(order.getReceiver_phone());
+        // 收货人省份
+        shopOrderDTO.setReceiverState(order.getReceiver_province());
+        // 收货人城市
+        shopOrderDTO.setReceiverCity(order.getReceiver_city());
+        // 收货人区域
+        shopOrderDTO.setReceiverDistrict(order.getReceiver_district());
+        // 收货人详细地址
+        shopOrderDTO.setReceiverAddress(order.getReceiver_address());
+        // 收货人详细地址
+        shopOrderDTO.setReceiverName(order.getReceiver_name());
+        // 收货人电话
+        shopOrderDTO.setReceiverPhone(order.getReceiver_phone());
+        // 支付金额
+        shopOrderDTO.setPayAmount(erpOrderPayment.getPayment());
+        // 运费
+        shopOrderDTO.setFreight(order.getPost_fee());
+        // 备注
+        shopOrderDTO.setRemark(order.getBuyer_memo());
+        // 买家留言
+        shopOrderDTO.setBuyerMessage(order.getBuyer_memo());
+        // 物流ID
+        shopOrderDTO.setLId(order.getExpress_code());
+
+        // 订单商品项列表
+        List<ErpOrderItem> details = order.getDetails();
+        List<OrderItemDTO> itemDTOList = new ArrayList<>();
+        for (ErpOrderItem detail : details) {
+            OrderItemDTO orderItemDTO = new OrderItemDTO();
+            orderItemDTO.setSkuId(detail.getItem_code());
+            orderItemDTO.setShopSkuId(detail.getSku_code());
+            orderItemDTO.setAmount(Double.valueOf(detail.getPrice()));
+            orderItemDTO.setBasePrice(Double.valueOf(detail.getOrigin_price()));
+            orderItemDTO.setQty(detail.getQty());
+            orderItemDTO.setOuterOiId(detail.getItem_code());
+            itemDTOList.add(orderItemDTO);
+        }
+        shopOrderDTO.setItems(itemDTOList);
+
+
+        PaymentDTO paymentDTO = new PaymentDTO();
+        paymentDTO.setAmount(erpOrderPayment.getPayment());
+        paymentDTO.setOuterPayId(order.getPlatform_code());
+        paymentDTO.setPayDate(order.getDeal_datetime());
+        paymentDTO.setPayment("微信");
+        paymentDTO.setBuyerAccount(order.getReceiver_phone());
+        paymentDTO.setSellerAccount("平台销售");
+        shopOrderDTO.setPay(paymentDTO);
+
+        jstErpHttpService.upload(shopOrderDTO);
+
+        ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+        erpOrderResponse.setSuccess(true);
+        return erpOrderResponse;
+    }
+
+    @Override
+    public ErpOrderResponse refundOrder(ErpRefundOrder order) {
+        return null;
+    }
+
+    @Override
+    public ErpDeliverysResponse getDeliver(ErpDeliverysRequest param) {
+        return null;
+    }
+
+    @Override
+    public ErpOrderQueryResponse getOrder(ErpOrderQueryRequert param) {
+        return null;
+    }
+
+    @Override
+    public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
+        return null;
+    }
+}

+ 23 - 3
fs-service-system/src/main/java/com/fs/erp/utils/SignUtil.java

@@ -1,10 +1,12 @@
 package com.fs.erp.utils;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.fs.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.UnsupportedEncodingException;
 import java.security.MessageDigest;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
@@ -13,9 +15,27 @@ import java.util.TreeSet;
 public class SignUtil {
     private SignUtil() {}
 
+    public static String getSign(String app_secret, Object bean) {
+        try {
+            Map<String, Object> stringObjectMap = BeanUtil.beanToMap(bean);
+            return getSign(app_secret,stringObjectMap);
+        } catch (Exception e) {
+            log.warn("getSign UnsupportedEncodingException ", e);
+        }
+
+        return StringUtils.EMPTY;
+    }
+
     public static String getSign(String app_secret, Map<String, Object> params) {
         try {
-            String sortedStr = getSortedParamStr(params);
+            Map<String, String> paramMap = new HashMap<>();
+            for (Map.Entry<String, Object> entry : params.entrySet()) {
+                if (entry.getValue() != null) {
+                    paramMap.put(entry.getKey(), entry.getValue().toString());
+                }
+            }
+
+            String sortedStr = getSortedParamStr(paramMap);
             String paraStr = app_secret + sortedStr;
 
             return createSign(paraStr);
@@ -32,7 +52,7 @@ public class SignUtil {
      * @param params 请求
      * @return 字符串
      */
-    private static String getSortedParamStr(Map<String, Object> params) throws UnsupportedEncodingException {
+    private static String getSortedParamStr(Map<String, String> params) throws UnsupportedEncodingException {
         Set<String> sortedParams = new TreeSet<>(params.keySet());
 
         StringBuilder strB = new StringBuilder();
@@ -42,7 +62,7 @@ public class SignUtil {
                 continue;
             }
 
-            String value = String.valueOf(params.get(key));
+            String value = params.get(key);
 
             if (StringUtils.isNotEmpty(value)) {
                 strB.append(key).append(value);