Browse Source

聚水潭ERP代码迁移,新增襄之棠和医健宝配置

lmx 1 day ago
parent
commit
45319172f1
48 changed files with 5421 additions and 0 deletions
  1. 118 0
      fs-service/src/main/java/com/fs/erp/constant/AfterSalesOrderStatusEnum.java
  2. 111 0
      fs-service/src/main/java/com/fs/erp/constant/ErpQueryOrderStatusEnum.java
  3. 90 0
      fs-service/src/main/java/com/fs/erp/constant/OrderStatusEnum.java
  4. 87 0
      fs-service/src/main/java/com/fs/erp/constant/TaskStatusEnum.java
  5. 2 0
      fs-service/src/main/java/com/fs/erp/domain/ErpOrder.java
  6. 85 0
      fs-service/src/main/java/com/fs/erp/domain/FsJstAftersalePush.java
  7. 77 0
      fs-service/src/main/java/com/fs/erp/domain/FsJstCodPush.java
  8. 40 0
      fs-service/src/main/java/com/fs/erp/dto/AfterSaleConfirmRequestDTO.java
  9. 69 0
      fs-service/src/main/java/com/fs/erp/dto/AfterSaleResponseDTO.java
  10. 45 0
      fs-service/src/main/java/com/fs/erp/dto/AssetProcessDetailDTO.java
  11. 42 0
      fs-service/src/main/java/com/fs/erp/dto/AssetProcessResultDTO.java
  12. 35 0
      fs-service/src/main/java/com/fs/erp/dto/CommonResponse.java
  13. 56 0
      fs-service/src/main/java/com/fs/erp/dto/ErpOrderResponseDTO.java
  14. 22 0
      fs-service/src/main/java/com/fs/erp/dto/ExtDataDTO.java
  15. 62 0
      fs-service/src/main/java/com/fs/erp/dto/FinanceDataDTO.java
  16. 51 0
      fs-service/src/main/java/com/fs/erp/dto/GetInitTokenRequestDTO.java
  17. 41 0
      fs-service/src/main/java/com/fs/erp/dto/GetInitTokenResponseDTO.java
  18. 297 0
      fs-service/src/main/java/com/fs/erp/dto/GoodsInfoDTO.java
  19. 38 0
      fs-service/src/main/java/com/fs/erp/dto/OrderCancelRequestDTO.java
  20. 33 0
      fs-service/src/main/java/com/fs/erp/dto/OrderExtDTO.java
  21. 52 0
      fs-service/src/main/java/com/fs/erp/dto/OrderExtDataDTO.java
  22. 58 0
      fs-service/src/main/java/com/fs/erp/dto/OrderItemDTO.java
  23. 137 0
      fs-service/src/main/java/com/fs/erp/dto/OrderQueryRequestDTO.java
  24. 799 0
      fs-service/src/main/java/com/fs/erp/dto/OrderQueryResponseDTO.java
  25. 42 0
      fs-service/src/main/java/com/fs/erp/dto/PaymentDTO.java
  26. 112 0
      fs-service/src/main/java/com/fs/erp/dto/ProductQueryRequestDTO.java
  27. 405 0
      fs-service/src/main/java/com/fs/erp/dto/ProductResponseDTO.java
  28. 37 0
      fs-service/src/main/java/com/fs/erp/dto/ProductUploadResultDTO.java
  29. 63 0
      fs-service/src/main/java/com/fs/erp/dto/RefreshTokenRequestDTO.java
  30. 65 0
      fs-service/src/main/java/com/fs/erp/dto/RefundItemDTO.java
  31. 158 0
      fs-service/src/main/java/com/fs/erp/dto/ShopOrderDTO.java
  32. 79 0
      fs-service/src/main/java/com/fs/erp/http/JstErpHttpService.java
  33. 296 0
      fs-service/src/main/java/com/fs/erp/http/JstErpHttpServiceImpl.java
  34. 110 0
      fs-service/src/main/java/com/fs/erp/mapper/FsJstAftersalePushMapper.java
  35. 77 0
      fs-service/src/main/java/com/fs/erp/mapper/FsJstCodPushMapper.java
  36. 5 0
      fs-service/src/main/java/com/fs/erp/service/FsJstAftersalePushService.java
  37. 5 0
      fs-service/src/main/java/com/fs/erp/service/FsJstCodPushService.java
  38. 172 0
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushServiceImpl.java
  39. 53 0
      fs-service/src/main/java/com/fs/erp/service/impl/FsJstCodPushServiceImpl.java
  40. 52 0
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java
  41. 364 0
      fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java
  42. 193 0
      fs-service/src/main/java/com/fs/erp/service/impl/JstTokenService.java
  43. 149 0
      fs-service/src/main/java/com/fs/erp/utils/SignUtil.java
  44. 72 0
      fs-service/src/main/java/com/fs/ybPay/dto/RefundOrderDTO.java
  45. 95 0
      fs-service/src/main/resources/application-config-druid-xzt.yml
  46. 89 0
      fs-service/src/main/resources/application-config-druid-yjb.yml
  47. 141 0
      fs-service/src/main/resources/application-druid-xzt.yml
  48. 140 0
      fs-service/src/main/resources/application-druid-yjb.yml

+ 118 - 0
fs-service/src/main/java/com/fs/erp/constant/AfterSalesOrderStatusEnum.java

@@ -0,0 +1,118 @@
+package com.fs.erp.constant;
+
+/**
+ * 平台单据状态枚举
+ *
+ * 定义售后单据在不同阶段的状态常量
+ */
+public enum AfterSalesOrderStatusEnum {
+
+    /**
+     * 买家已经申请,等待卖家同意
+     */
+    WAIT_SELLER_AGREE(0, "WAIT_SELLER_AGREE", "买家已经申请,等待卖家同意"),
+
+    /**
+     * 卖家已经同意,等待买家退货
+     */
+    WAIT_BUYER_RETURN_GOODS(1, "WAIT_BUYER_RETURN_GOODS", "卖家已经同意,等待买家退货"),
+
+    /**
+     * 买家已经退货,等待卖家确认收货
+     */
+    WAIT_SELLER_CONFIRM_GOODS(2, "WAIT_SELLER_CONFIRM_GOODS", "买家已经退货,等待卖家确认收货"),
+
+    /**
+     * 卖家拒绝售后
+     */
+    SELLER_REFUSE_BUYER(3, "SELLER_REFUSE_BUYER", "卖家拒绝售后"),
+
+    /**
+     * 等待卖家发货
+     */
+    WAIT_SELLER_DELIVER_GOODS(4, "WAIT_SELLER_DELIVER_GOODS", "等待卖家发货"),
+
+    /**
+     * 补发卖家发货
+     */
+    REISSUE_SELLER_DELIVERY(5, "REISSUE_SELLER_DELIVERY", "补发卖家发货"),
+
+    /**
+     * 售后关闭(售后单未确认前填写该状态erp的售后单自动作废)
+     */
+    CLOSED(6, "CLOSED", "售后关闭"),
+
+    /**
+     * 退款成功
+     * 补发、换货售后单确认时需在系统中手动确认
+     * 注意:抖音、拼多多、淘系等线上平台换货单据,通过接口修改状态为SUCCESS且发出的快递单号是空,
+     * 平台会判定为换货单超时未处理,会被平台强制退款,线上售后类型会变为普通退货
+     */
+    SUCCESS(7, "SUCCESS", "退款成功"),
+    CONFIRM(10, "CONFIRM", "确认");
+
+    private final Integer index;
+    private final String code;
+    private final String description;
+
+    AfterSalesOrderStatusEnum(Integer index, String code, String description) {
+        this.index = index;
+        this.code = code;
+        this.description = description;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public Integer getIndex() {
+        return index;
+    }
+
+    /**
+     * 根据状态码获取枚举实例
+     *
+     * @param code 状态码
+     * @return 对应的枚举实例,如果未找到则返回null
+     */
+    public static AfterSalesOrderStatusEnum getByCode(String code) {
+        if (code == null) {
+            return null;
+        }
+
+        for (AfterSalesOrderStatusEnum status : AfterSalesOrderStatusEnum.values()) {
+            if (status.getCode().equals(code)) {
+                return status;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 根据状态码获取枚举实例
+     *
+     * @param index 状态码
+     * @return 对应的枚举实例,如果未找到则返回null
+     */
+    public static AfterSalesOrderStatusEnum getByIndex(Integer index) {
+        if (index == null) {
+            return null;
+        }
+
+        for (AfterSalesOrderStatusEnum status : AfterSalesOrderStatusEnum.values()) {
+            if (status.getIndex().equals(index)) {
+                return status;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return this.code;
+    }
+}

+ 111 - 0
fs-service/src/main/java/com/fs/erp/constant/ErpQueryOrderStatusEnum.java

@@ -0,0 +1,111 @@
+package com.fs.erp.constant;
+
+import lombok.Getter;
+
+/**
+ * 订单状态枚举类
+ */
+@Getter
+public enum ErpQueryOrderStatusEnum {
+
+    /**
+     * 待付款
+     */
+    WAIT_PAY("WaitPay", "待付款"),
+
+    /**
+     * 发货中
+     */
+    DELIVERING("Delivering", "发货中"),
+
+    /**
+     * 被合并
+     */
+    MERGED("Merged", "被合并"),
+
+    /**
+     * 异常
+     */
+    QUESTION("Question", "异常"),
+
+    /**
+     * 被拆分
+     */
+    SPLIT("Split", "被拆分"),
+
+    /**
+     * 等供销商|外仓发货
+     */
+    WAIT_OUTER_SENT("WaitOuterSent", "等供销商|外仓发货"),
+
+    /**
+     * 已付款待审核
+     */
+    WAIT_CONFIRM("WaitConfirm", "已付款待审核"),
+
+    /**
+     * 已客审待财审
+     */
+    WAIT_FCONFIRM("WaitFConfirm", "已客审待财审"),
+
+    /**
+     * 已发货
+     */
+    SENT("Sent", "已发货"),
+
+    /**
+     * 取消
+     */
+    CANCELLED("Cancelled", "取消");
+
+    /**
+     * 状态码
+     */
+    private final String code;
+
+    /**
+     * 状态描述
+     */
+    private final String description;
+
+    /**
+     * 构造方法
+     *
+     * @param code        状态码
+     * @param description 状态描述
+     */
+    ErpQueryOrderStatusEnum(String code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    /**
+     * 根据状态码获取对应的枚举值
+     *
+     * @param code 状态码
+     * @return 对应的枚举值,若未找到则返回null
+     */
+    public static ErpQueryOrderStatusEnum getByCode(String code) {
+        for (ErpQueryOrderStatusEnum status : values()) {
+            if (status.getCode().equals(code)) {
+                return status;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 判断给定的状态码是否有效
+     *
+     * @param code 状态码
+     * @return 若有效返回true,否则返回false
+     */
+    public static boolean isValidCode(String code) {
+        return getByCode(code) != null;
+    }
+
+    @Override
+    public String toString() {
+        return this.code + ":" + this.description;
+    }
+}

+ 90 - 0
fs-service/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 + ")";
+    }
+}

+ 87 - 0
fs-service/src/main/java/com/fs/erp/constant/TaskStatusEnum.java

@@ -0,0 +1,87 @@
+package com.fs.erp.constant;
+
+/**
+ * 任务状态枚举
+ */
+public enum TaskStatusEnum {
+
+    /**
+     * 待处理
+     */
+    PENDING(0, "待处理"),
+
+    /**
+     * 成功
+     */
+    SUCCESS(1, "成功"),
+
+    /**
+     * 失败
+     */
+    FAILED(2, "失败"),
+
+    /**
+     * 正在处理
+     */
+    PROCESSING(3, "正在处理"),
+
+    /**
+     * 已取消
+     */
+    CANCELLED(4, "已取消");
+
+    private final Integer code; // 状态码
+    private final String description; // 状态描述
+
+    /**
+     * 构造方法
+     *
+     * @param code        状态码
+     * @param description 状态描述
+     */
+    TaskStatusEnum(Integer code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    /**
+     * 根据状态码获取枚举值
+     *
+     * @param code 状态码
+     * @return 对应的枚举值,如果没有匹配的则返回 null
+     */
+    public static TaskStatusEnum getByCode(Integer code) {
+        for (TaskStatusEnum status : TaskStatusEnum.values()) {
+            if (status.getCode().equals(code)) {
+                return status;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取状态码
+     *
+     * @return 状态码
+     */
+    public Integer getCode() {
+        return code;
+    }
+
+    /**
+     * 获取状态描述
+     *
+     * @return 状态描述
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public String toString() {
+        return "TaskStatusEnum{" +
+                "code=" + code +
+                ", description='" + description + '\'' +
+                '}';
+    }
+}

+ 2 - 0
fs-service/src/main/java/com/fs/erp/domain/ErpOrder.java

@@ -32,4 +32,6 @@ public class ErpOrder {
 
 
     Integer isPackage;
     Integer isPackage;
     List<ErpOrderPayment> payments;
     List<ErpOrderPayment> payments;
+
+    String buyer_account;
 }
 }

+ 85 - 0
fs-service/src/main/java/com/fs/erp/domain/FsJstAftersalePush.java

@@ -0,0 +1,85 @@
+package com.fs.erp.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * 订阅物流
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class FsJstAftersalePush {
+
+    /**
+     * 主键,自增
+     */
+    private Long id;
+
+    /**
+     * 订单号
+     */
+    private String orderId;
+    /**
+     * 售后id
+     */
+    private String afterSaleId;
+
+    /**
+     * 平台单据状态:
+     * 0 WAIT_SELLER_AGREE:买家已经申请,等待卖家同意,
+     * 1 WAIT_BUYER_RETURN_GOODS:卖家已经同意,等待买家退货,
+     * 2 WAIT_SELLER_CONFIRM_GOODS:买家已经退货,等待卖家确认收货,
+     * 3 SELLER_REFUSE_BUYER:卖家拒绝售后,
+     * 4 WAIT_SELLER_DELIVER_GOODS:等待卖家发货,
+     * 5 REISSUE_SELLER_DELIVERY:补发卖家发货,
+     * 6 CLOSED:售后关闭(售后单未确认前填写该状态erp的售后单自动作废),
+     * 7 SUCCESS:退款成功;可更新,补发、换货售后单确认时需在系统中手动确认;抖音、拼多多、淘系等线上平台换货换货单据,通过接口修改状态为SUCCESS且发出的快递单号是空,平台会判定为换货单超时未处理,会被平台强制退款,线上售后类型会变为普通退货
+     */
+    private String type;
+
+    /**
+     * 任务状态:0-待处理,1-成功,2-失败,3-正在处理,4-已取消
+     */
+    private Integer taskStatus;
+
+    /**
+     * 重试次数,默认为 0
+     */
+    private Integer retryCount;
+
+    /**
+     * 上次执行时间,用于记录任务执行的最后时间
+     */
+    private LocalDateTime lastExecuteTime;
+
+    /**
+     * 记录创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 记录更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 调用接口时传入的参数(JSON 格式)
+     */
+    private String params;
+
+    /**
+     * 调用接口返回的结果(JSON 格式)
+     */
+    private String result;
+
+    /**
+     * 错误信息(记录失败原因)
+     */
+    private String errorMessage;
+}

+ 77 - 0
fs-service/src/main/java/com/fs/erp/domain/FsJstCodPush.java

@@ -0,0 +1,77 @@
+package com.fs.erp.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * jst货到付款推送
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class FsJstCodPush {
+    /**
+     * 主键,自增
+     */
+    private Long id;
+
+    /**
+     * 订单id
+     */
+    private String orderId;
+
+    /**
+     * 售后id
+     */
+    private String afterSaleId;
+
+    /**
+     * 0创建订单 1后续金额
+     */
+    private String type;
+
+    /**
+     * 任务状态:0-待处理,1-成功,2-失败,3-正在处理,4-已取消
+     */
+    private Integer taskStatus;
+
+    /**
+     * 重试次数,默认为 0
+     */
+    private Integer retryCount;
+
+    /**
+     * 上次执行时间,用于记录任务执行的最后时间
+     */
+    private LocalDateTime lastExecuteTime;
+
+    /**
+     * 记录创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 记录更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 调用接口时传入的参数(JSON 格式)
+     */
+    private String params;
+
+    /**
+     * 调用接口返回的结果(JSON 格式)
+     */
+    private String result;
+
+    /**
+     * 错误信息(记录失败原因)
+     */
+    private String errorMessage;
+}

+ 40 - 0
fs-service/src/main/java/com/fs/erp/dto/AfterSaleConfirmRequestDTO.java

@@ -0,0 +1,40 @@
+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
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AfterSaleConfirmRequestDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 售后单id数组
+     */
+    private List<Long> asIds;
+
+    /**
+     * 换货售后单是否强制确认
+     */
+    private Boolean exchangeForce;
+
+    /**
+     * 是否同步确认退款单
+     */
+    private Boolean confirmRefund;
+}

+ 69 - 0
fs-service/src/main/java/com/fs/erp/dto/AfterSaleResponseDTO.java

@@ -0,0 +1,69 @@
+package com.fs.erp.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 售后单响应DTO
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AfterSaleResponseDTO implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+
+    /**
+     * 响应消息
+     */
+    private String msg;
+
+    /**
+     * 售后单ID
+     */
+    private Long asId;
+
+    /**
+     * 是否成功
+     */
+    private Boolean issuccess;
+
+    /**
+     * 订单号
+     */
+    private String soId;
+
+    /**
+     * 外部售后单号
+     */
+    private String outerAsId;
+
+    /**
+     * 订单ID
+     */
+    private Long oId;
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 订单类型
+     */
+    private String orderType;
+
+    /**
+     * 订单授权ID
+     */
+    private String oaid;
+}

+ 45 - 0
fs-service/src/main/java/com/fs/erp/dto/AssetProcessDetailDTO.java

@@ -0,0 +1,45 @@
+package com.fs.erp.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 资产处理详情对象
+ *
+ * @author xdd
+ * @date 2025-02-27
+ * @version 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AssetProcessDetailDTO {
+
+    /**
+     * 资产ID
+     */
+    private Long asId;
+
+    /**
+     * 外部资产ID
+     */
+    private String outerAsId;
+
+    /**
+     * 处理详情
+     */
+    private String details;
+
+    /**
+     * 处理消息
+     */
+    private String message;
+
+    /**
+     * 是否处理成功
+     */
+    private Boolean isSuccess;
+}

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

@@ -0,0 +1,42 @@
+package com.fs.erp.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 资产处理结果响应对象
+ *
+ * @author xdd
+ * @date 2025-02-27
+ * @version 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AssetProcessResultDTO {
+
+    /**
+     * 处理失败的资产列表
+     */
+    private List<AssetProcessDetailDTO> fail;
+
+    /**
+     * 处理成功的资产列表
+     */
+    private List<AssetProcessDetailDTO> success;
+
+    /**
+     * 成功处理的资产数量
+     */
+    private Integer successCount;
+
+    /**
+     * 处理失败的资产数量
+     */
+    private Integer failCount;
+}

+ 35 - 0
fs-service/src/main/java/com/fs/erp/dto/CommonResponse.java

@@ -0,0 +1,35 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 通用响应DTO
+ *
+ * @author xdd
+ * @since 2025-02-27
+ * @version 1.0
+ */
+@Data
+@Accessors(chain = true)
+public class CommonResponse<T> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误码
+     */
+    private Integer code;
+
+    /**
+     * 错误描述
+     */
+    private String msg;
+
+    /**
+     * 响应数据
+     */
+    private T data;
+}

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

@@ -0,0 +1,56 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 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/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/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;
+}

+ 51 - 0
fs-service/src/main/java/com/fs/erp/dto/GetInitTokenRequestDTO.java

@@ -0,0 +1,51 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 获取初始化Token请求DTO
+ *
+ * @author xdd
+ * @version 1.0
+ * @date 2025-02-27
+ * @since 1.0
+ */
+@Data
+@Accessors(chain = true)
+public class GetInitTokenRequestDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 开发者应用Key
+     */
+    private String app_key;
+
+    /**
+     * 当前请求的时间戳(单位:秒)
+     */
+    private String timestamp;
+
+    /**
+     * 授权类型(固定值:authorization_code)
+     */
+    private String grant_type;
+
+    /**
+     * 交互数据编码(固定值:utf-8)
+     */
+    private String charset;
+
+    /**
+     * 随机码(六位随机字符串)
+     */
+    private String code;
+
+    /**
+     * 数字签名
+     */
+    private String sign;
+}

+ 41 - 0
fs-service/src/main/java/com/fs/erp/dto/GetInitTokenResponseDTO.java

@@ -0,0 +1,41 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 获取初始化Token响应DTO
+ *
+ * @author xdd
+ * @version 1.0
+ * @date 2025-02-27
+ * @since 1.0
+ */
+@Data
+@Accessors(chain = true)
+public class GetInitTokenResponseDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 访问令牌
+     */
+    private String access_token;
+
+    /**
+     * access_token访问过期时间(单位:秒)
+     */
+    private Integer expires_in;
+
+    /**
+     * 更新令牌
+     */
+    private String refresh_token;
+
+    /**
+     * 权限范围(固定值:all)
+     */
+    private String scope;
+}

+ 297 - 0
fs-service/src/main/java/com/fs/erp/dto/GoodsInfoDTO.java

@@ -0,0 +1,297 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 商品信息DTO
+ *
+ * @author xdd
+ * @date 2025-02-27
+ * @version 1.0.0
+ */
+@Data
+public class GoodsInfoDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 商品列表
+     */
+    private List<GoodsItem> items;
+
+    @Data
+    public static class GoodsItem implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 商品编码
+         */
+        private String skuId;
+
+        /**
+         * 款式编码
+         */
+        private String iId;
+
+        /**
+         * 品牌
+         */
+        private String brand;
+
+        /**
+         * 虚拟分类
+         */
+        private String vcName;
+
+        /**
+         * 商品分类
+         */
+        private String cName;
+
+        /**
+         * 基本售价
+         */
+        private BigDecimal sPrice;
+
+        /**
+         * 商品属性
+         */
+        private String itemType;
+
+        /**
+         * 长度
+         */
+        private BigDecimal l;
+
+        /**
+         * 宽度
+         */
+        private BigDecimal w;
+
+        /**
+         * 高度
+         */
+        private BigDecimal h;
+
+        /**
+         * 图片地址(款图片)
+         */
+        private String pic;
+
+        /**
+         * 大图地址
+         */
+        private String picBig;
+
+        /**
+         * 商品图片(SKU图片)
+         */
+        private String skuPic;
+
+        /**
+         * 商品名称
+         */
+        private String name;
+
+        /**
+         * 备注
+         */
+        private String remark;
+
+        /**
+         * 颜色及规格
+         */
+        private String propertiesValue;
+
+        /**
+         * 简称
+         */
+        private String shortName;
+
+        /**
+         * 重量
+         */
+        private BigDecimal weight;
+
+        /**
+         * 是否启用 -1=禁用,0=备用,1=启用
+         */
+        private Integer enabled;
+
+        /**
+         * 供应商名称
+         */
+        private String supplierName;
+
+        /**
+         * 国标码
+         */
+        private String skuCode;
+
+        /**
+         * 供应商商品编码
+         */
+        private String supplierSkuId;
+
+        /**
+         * 供应商款式编码
+         */
+        private String supplierIId;
+
+        /**
+         * 其它价格1
+         */
+        private BigDecimal otherPrice1;
+
+        /**
+         * 其它价格2
+         */
+        private BigDecimal otherPrice2;
+
+        /**
+         * 其它价格3
+         */
+        private BigDecimal otherPrice3;
+
+        /**
+         * 其它价格4
+         */
+        private BigDecimal otherPrice4;
+
+        /**
+         * 其它价格5
+         */
+        private BigDecimal otherPrice5;
+
+        /**
+         * 其它属性1
+         */
+        private String other1;
+
+        /**
+         * 其它属性2
+         */
+        private String other2;
+
+        /**
+         * 其它属性3
+         */
+        private String other3;
+
+        /**
+         * 其它属性4
+         */
+        private String other4;
+
+        /**
+         * 其它属性5
+         */
+        private String other5;
+
+        /**
+         * 禁止同步
+         */
+        private Boolean stockDisabled;
+
+        /**
+         * 成本价
+         */
+        private BigDecimal cPrice;
+
+        /**
+         * 市场价/吊牌价
+         */
+        private BigDecimal marketPrice;
+
+        /**
+         * 单位
+         */
+        private String unit;
+
+        /**
+         * 标签列表
+         */
+        private List<String> labels;
+
+        /**
+         * 是否启用生产批次
+         */
+        private Boolean batchEnabled;
+
+        /**
+         * 是否启用序列号
+         */
+        private Boolean isSeriesNumber;
+
+        /**
+         * 辅助码
+         */
+        private String otherCode;
+
+        /**
+         * 保质期天数
+         */
+        private Integer shelfLife;
+
+        /**
+         * 临期天数
+         */
+        private Integer handDay;
+
+        /**
+         * 保质期禁收天数
+         */
+        private Integer rejectLifecycle;
+
+        /**
+         * 保质期禁售天数
+         */
+        private Integer lockupLifecycle;
+
+        /**
+         * 保质期临期预警天数
+         */
+        private Integer adventLifecycle;
+
+        /**
+         * 商品类目属性
+         */
+        private CategoryProperty categoryPropertys;
+
+        /**
+         * 移除标签列表
+         */
+        private List<String> deletedlabels;
+
+        /**
+         * 生产许可证
+         */
+        private String productionLicence;
+
+        /**
+         * 采购价
+         */
+        private BigDecimal purchasePrice;
+
+        /**
+         * 是否校验组合装商品编码
+         */
+        private Boolean isNormal;
+    }
+
+    @Data
+    public static class CategoryProperty implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 年份
+         */
+        private String year;
+    }
+}

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

@@ -0,0 +1,38 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 订单取消请求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/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/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;
+}

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

@@ -0,0 +1,58 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 订单商品项DTO
+ */
+@Data
+public class OrderItemDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * SKU ID
+     */
+    private String skuId;
+
+    /**
+     * 店铺SKU ID
+     */
+    private String shopSkuId;
+
+    /**
+     * 金额
+     */
+    private BigDecimal 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/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/src/main/java/com/fs/erp/dto/OrderQueryResponseDTO.java

@@ -0,0 +1,799 @@
+package com.fs.erp.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 订单查询响应对象
+ *
+ * @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/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;
+}

+ 112 - 0
fs-service/src/main/java/com/fs/erp/dto/ProductQueryRequestDTO.java

@@ -0,0 +1,112 @@
+package com.fs.erp.dto;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 商品查询请求DTO
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "商品查询请求对象", description = "商品查询请求参数")
+public class ProductQueryRequestDTO {
+
+    /**
+     * 第几页,从第一页开始,默认1
+     */
+    @ApiModelProperty(value = "第几页,从第一页开始,默认1", example = "1")
+    private Integer pageIndex;
+
+    /**
+     * 每页多少条,默认30,最大100
+     */
+    @ApiModelProperty(value = "每页多少条,默认30,最大100", example = "10")
+    private Integer pageSize;
+
+    /**
+     * 修改起始时间
+     */
+    @ApiModelProperty(value = "修改起始时间,和结束时间必须同时存在,时间间隔不能超过七天", example = "2021-12-01 18:34:13")
+    private String modifiedBegin;
+
+    /**
+     * 修改结束时间
+     */
+    @ApiModelProperty(value = "修改结束时间,和起始时间必须同时存在,时间间隔不能超过七天", example = "2021-12-08 18:34:13")
+    private String modifiedEnd;
+
+    /**
+     * 商品编码列表,最多20个
+     */
+    @ApiModelProperty(value = "商品编码,与修改时间不能同时为空,最多20个", example = "D0005J15101,D0005J20101")
+    private String skuIds;
+
+    /**
+     * 商品名称(精确搜索)
+     */
+    @ApiModelProperty(value = "商品名称,与修改时间不能同时为空,仅支持传一个名称(精确搜索)", example = "A01")
+    private String exactlyName;
+
+    /**
+     * 商品名称(模糊查询)
+     */
+    @ApiModelProperty(value = "商品名称,与修改时间不能同时为空,仅支持传一个名称(模糊查询)")
+    private String name;
+
+    /**
+     * 品牌列表
+     */
+    @ApiModelProperty(value = "品牌列表")
+    private List<String> brand;
+
+    /**
+     * 款式编码列表
+     */
+    @ApiModelProperty(value = "款式编码列表")
+    private List<String> iIds;
+
+    /**
+     * 查询字段类型
+     */
+    @ApiModelProperty(value = "可传created,modified。默认按照modified查询")
+    private String dateField;
+
+    /**
+     * 自定义查询字段,多个字段用逗号分开
+     */
+    @ApiModelProperty(value = "可传:purchase_price 采购价,多个字段用逗号分开")
+    private String flds;
+
+    /**
+     * 辅助码
+     */
+    @ApiModelProperty(value = "辅助码,与修改时间不能同时为空")
+    private String skuCodes;
+
+    /**
+     * 包含标签列表
+     */
+    @ApiModelProperty(value = "包含标签列表")
+    private List<String> labels;
+
+    /**
+     * 排除标签列表
+     */
+    @ApiModelProperty(value = "排除标签列表")
+    private List<String> notLabels;
+
+    /**
+     * 是否查询库容信息
+     */
+    @ApiModelProperty(value = "是否查询库容信息")
+    private Boolean loadSkuBin;
+}

+ 405 - 0
fs-service/src/main/java/com/fs/erp/dto/ProductResponseDTO.java

@@ -0,0 +1,405 @@
+package com.fs.erp.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 商品信息响应DTO
+ *
+ * @author xdd
+ * @date 2025-02-27
+ * @version 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProductResponseDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 每页多少条
+     */
+    private Integer pageSize;
+
+    /**
+     * 第几页
+     */
+    private Integer pageIndex;
+
+    /**
+     * 总条数
+     */
+    private Integer dataCount;
+
+    /**
+     * 总页数
+     */
+    private Integer pageCount;
+
+    /**
+     * 是否有下一页
+     */
+    private Boolean hasNext;
+
+    /**
+     * 数据集合
+     */
+    private List<ProductInfo> datas;
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class ProductInfo implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 商品编码
+         */
+        private String skuId;
+
+        /**
+         * 款式编码
+         */
+        private String iId;
+
+        /**
+         * 商品名称
+         */
+        private String name;
+
+        /**
+         * 商品简称
+         */
+        private String shortName;
+
+        /**
+         * 销售价
+         */
+        private BigDecimal salePrice;
+
+        /**
+         * 成本价
+         */
+        private BigDecimal costPrice;
+
+        /**
+         * 颜色规格
+         */
+        private String propertiesValue;
+
+        /**
+         * 颜色
+         */
+        private String color;
+
+        /**
+         * 类目id
+         */
+        private Integer cId;
+
+        /**
+         * 分类
+         */
+        private String category;
+
+        /**
+         * 大图地址
+         */
+        private String picBig;
+
+        /**
+         * 图片地址
+         */
+        private String pic;
+
+        /**
+         * 是否启用,0:备用,1:启用,-1:禁用
+         */
+        private Integer enabled;
+
+        /**
+         * 重量
+         */
+        private BigDecimal weight;
+
+        /**
+         * 市场价
+         */
+        private BigDecimal marketPrice;
+
+        /**
+         * 品牌
+         */
+        private String brand;
+
+        /**
+         * 供应商编号
+         */
+        private String supplierId;
+
+        /**
+         * 供应商名称
+         */
+        private String supplierName;
+
+        /**
+         * 修改时间
+         */
+        private String modified;
+
+        /**
+         * 国标码
+         */
+        private String skuCode;
+
+        /**
+         * 供应商商品编码
+         */
+        private String supplierSkuId;
+
+        /**
+         * 供应商商品款号
+         */
+        private String supplierIId;
+
+        /**
+         * 虚拟分类
+         */
+        private String vcName;
+
+        /**
+         * 商品类型
+         */
+        private String skuType;
+
+        /**
+         * 创建者
+         */
+        private Integer creator;
+
+        /**
+         * 创建时间
+         */
+        private String created;
+
+        /**
+         * 备注
+         */
+        private String remark;
+
+        /**
+         * 商品属性,成品,半成品,原材料,包材
+         */
+        private String itemType;
+
+        /**
+         * 是否禁止同步,0=启用同步,1=禁用同步,2=部分禁用
+         */
+        private Integer stockDisabled;
+
+        /**
+         * 单位
+         */
+        private String unit;
+
+        /**
+         * 保质期
+         */
+        private Integer shelfLife;
+
+        /**
+         * 商品标签,多个标签时以逗号分隔
+         */
+        private String labels;
+
+        /**
+         * 生产许可证
+         */
+        private String productionLicence;
+
+        /**
+         * 长
+         */
+        private BigDecimal l;
+
+        /**
+         * 宽
+         */
+        private BigDecimal w;
+
+        /**
+         * 高
+         */
+        private BigDecimal h;
+
+        /**
+         * 是否开启序列号
+         */
+        private Boolean isSeriesNumber;
+
+        /**
+         * 其他价格1
+         */
+        private BigDecimal otherPrice1;
+
+        /**
+         * 其他价格2
+         */
+        private BigDecimal otherPrice2;
+
+        /**
+         * 其他价格3
+         */
+        private BigDecimal otherPrice3;
+
+        /**
+         * 其他价格4
+         */
+        private BigDecimal otherPrice4;
+
+        /**
+         * 其他价格5
+         */
+        private BigDecimal otherPrice5;
+
+        /**
+         * 其他价格6
+         */
+        private BigDecimal otherPrice6;
+
+        /**
+         * 其他价格7
+         */
+        private BigDecimal otherPrice7;
+
+        /**
+         * 其他价格8
+         */
+        private BigDecimal otherPrice8;
+
+        /**
+         * 其他价格9
+         */
+        private BigDecimal otherPrice9;
+
+        /**
+         * 其他价格10
+         */
+        private BigDecimal otherPrice10;
+
+        /**
+         * 其他属性1
+         */
+        private String other1;
+
+        /**
+         * 其他属性2
+         */
+        private String other2;
+
+        /**
+         * 其他属性3
+         */
+        private String other3;
+
+        /**
+         * 其他属性4
+         */
+        private String other4;
+
+        /**
+         * 其他属性5
+         */
+        private String other5;
+
+        /**
+         * 其他属性6
+         */
+        private String other6;
+
+        /**
+         * 其他属性7
+         */
+        private String other7;
+
+        /**
+         * 其他属性8
+         */
+        private String other8;
+
+        /**
+         * 其他属性9
+         */
+        private String other9;
+
+        /**
+         * 其他属性10
+         */
+        private String other10;
+
+        /**
+         * 链接同步状态
+         */
+        private String stockType;
+
+        /**
+         * 辅助码
+         */
+        private String skuCodes;
+
+        /**
+         * 唯一id,系统自增id(若商品编码有被修改可以用此字段判断唯一)
+         */
+        private Integer autoid;
+
+        /**
+         * 是否开启生产批次开关
+         */
+        private String batchEnabled;
+
+        /**
+         * 主仓位
+         */
+        private String bin;
+
+        /**
+         * 补充仓位
+         */
+        private String otherBin;
+
+        /**
+         * 库容下限
+         */
+        private BigDecimal minQty;
+
+        /**
+         * 库容上限
+         */
+        private BigDecimal maxQty;
+
+        /**
+         * 溢出数量
+         */
+        private BigDecimal overflowQty;
+
+        /**
+         * 标准装箱数量
+         */
+        private BigDecimal packQty;
+
+        /**
+         * 标准装箱体积
+         */
+        private BigDecimal packVolume;
+    }
+}

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

@@ -0,0 +1,37 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 商品上传结果DTO
+ *
+ * @author xdd
+ * @date 2025-02-27
+ * @version 1.0
+ * @since 1.0
+ */
+@Data
+@Accessors(chain = true)
+public class ProductUploadResultDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 是否上传成功
+     */
+    private String isSuccess;
+
+    /**
+     * 商品编码
+     */
+    private String skuId;
+
+    /**
+     * 执行信息
+     */
+    private String msg;
+
+}

+ 63 - 0
fs-service/src/main/java/com/fs/erp/dto/RefreshTokenRequestDTO.java

@@ -0,0 +1,63 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 刷新令牌请求DTO
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+@Accessors(chain = true)
+public class RefreshTokenRequestDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 开发者应用Key
+     * 示例值: 0ecde8631431a5ed6b3e7368afbabdadss
+     */
+    private String app_key;
+
+    /**
+     * 当前请求的时间戳(单位:秒)
+     * 示例值: 1577771730
+     */
+    private String timestamp;
+
+    /**
+     * 授权类型
+     * 固定值: refresh_token
+     */
+    private String grant_type = "refresh_token";
+
+    /**
+     * 交互数据的编码
+     * 固定值: utf-8
+     */
+    private String charset = "utf-8";
+
+    /**
+     * 更新令牌
+     * 示例值: eb1964a9d142423a9f0de88b97bb38fc
+     */
+    private String refresh_token;
+
+    /**
+     * 授权范围
+     * 固定值: all
+     */
+    private String scope = "all";
+
+    /**
+     * 请求的数字签名
+     * 通过所有请求参数通过摘要生成,保证请求参数没有被篡改
+     * 示例值: 0ecde8631431a5ed6b3e7368afbabdaoas
+     */
+    private String sign;
+}

+ 65 - 0
fs-service/src/main/java/com/fs/erp/dto/RefundItemDTO.java

@@ -0,0 +1,65 @@
+package com.fs.erp.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 退货商品DTO
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RefundItemDTO implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+
+    /**
+     * 商品金额
+     */
+    private BigDecimal amount;
+
+    /**
+     * 商品属性
+     */
+    private String propertiesValue;
+
+    /**
+     * 商品数量
+     */
+    private Integer qty;
+
+    /**
+     * 商品名称
+     */
+    private String name;
+
+    /**
+     * 商品SKU ID
+     */
+    private String skuId;
+
+    /**
+     * 商品图片
+     */
+    private String pic;
+
+    /**
+     * 退货类型
+     */
+    private String type;
+
+    /**
+     * 外部订单项ID
+     */
+    private String outerOiId;
+}

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

@@ -0,0 +1,158 @@
+package com.fs.erp.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 店铺订单信息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;
+
+    /**
+     * 是否货到付款
+     */
+    private Boolean isCod;
+
+    /**
+     * 总买家实付
+     */
+    private BigDecimal buyerPaidAmount;
+
+    /**
+     * 买家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;
+}

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

@@ -0,0 +1,79 @@
+package com.fs.erp.http;
+
+import com.fs.erp.dto.*;
+import com.fs.ybPay.dto.RefundOrderDTO;
+
+/**
+ * JST ERP 接口服务类
+ */
+public interface JstErpHttpService {
+    /**
+     * 获取access_token、refresh_token
+     *
+     * 开放平台对token的过期时间默认设置为<strong>30天</strong>
+     * 过期前12小时内调用才会有效,
+     * 调用成功后生成新的access_token原access_token有5分钟的过期时间,5分钟后失效
+     * @param dto 请求参数
+     * @return GetInitTokenResponseDTO
+     */
+    GetInitTokenResponseDTO getInitToken(GetInitTokenRequestDTO dto);
+
+    /**
+     * 更新access_token、refresh_token
+     * 开放平台对token的过期时间默认设置为30天,如开发者的token过期未换,无法再调用更新token这个接口需要返回上一步骤重新授权。
+     * 15天内刷新无效,刷新成功后原access_token有5分钟的过期时间
+     * @param dto 请求参数
+     * @return GetInitTokenResponseDTO
+     */
+    GetInitTokenResponseDTO refreshToken(RefreshTokenRequestDTO dto);
+
+    /**
+     * 普通商品资料上传
+     * @param dto 请求参数
+     * @return ProductUploadResultDTO
+     */
+    ProductUploadResultDTO uploadGoods(GoodsInfoDTO dto);
+
+    /**
+     * 普通商品资料查询(按sku查询)
+     * @param dto 请求参数
+     * @return ProductResponseDTO
+     */
+    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 cancel(OrderCancelRequestDTO dto);
+
+    /**
+     * 售后上传
+     * @param dto 请求参数
+     * @return CommonResponse<AfterSaleResponseDTO>
+     */
+    CommonResponse<AfterSaleResponseDTO> aftersaleUpload(RefundOrderDTO dto);
+
+    /**
+     * 售后单确认
+     * @param dto 请求参数
+     * @return CommonResponse<AssetProcessResultDTO>
+     */
+    CommonResponse<AssetProcessResultDTO> aftersaleConfirm(AfterSaleConfirmRequestDTO dto);
+
+}

+ 296 - 0
fs-service/src/main/java/com/fs/erp/http/JstErpHttpServiceImpl.java

@@ -0,0 +1,296 @@
+package com.fs.erp.http;
+
+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.PropertyNamingStrategy;
+import com.alibaba.fastjson.TypeReference;
+import com.alibaba.fastjson.serializer.SerializeConfig;
+import com.fs.erp.dto.*;
+import com.fs.erp.service.impl.JstTokenService;
+import com.fs.erp.utils.SignUtil;
+import com.fs.ybPay.dto.RefundOrderDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Service
+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";
+
+    /**
+     * 更新access_token、refresh_token url
+     */
+    private static final String REFRESH_TOKEN_URL = BASE_URL + "openWeb/auth/refreshToken";
+
+
+    @Value("${jst.app_key:''}")
+    private String appKey;
+
+    @Value("${jst.app_secret:''}")
+    private String appSecret;
+
+    @Autowired
+    private JstTokenService jstTokenService;
+
+    @Override
+    public GetInitTokenResponseDTO getInitToken(GetInitTokenRequestDTO dto) {
+        // 将DTO转换为表单参数
+        Map<String, Object> formParams = BeanUtil.beanToMap(dto);
+        log.info("请求初始化token - URL: {}, 参数: {}", GET_INIT_TOKEN_URL, JSON.toJSONString(formParams));
+
+        HttpResponse response = executeFormPost(GET_INIT_TOKEN_URL, formParams);
+        return parseResponse(response, new TypeReference<CommonResponse<GetInitTokenResponseDTO>>() {});
+    }
+
+    @Override
+    public GetInitTokenResponseDTO refreshToken(RefreshTokenRequestDTO dto) {
+        log.info("刷新token - URL: {}, 请求体: {}", REFRESH_TOKEN_URL, JSON.toJSONString(dto));
+        Map<String, Object> formParams = BeanUtil.beanToMap(dto);
+
+        HttpResponse response = executeFormPost(REFRESH_TOKEN_URL, formParams);
+        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));
+
+        HttpResponse response = executeJsonPost(url, dto);
+        return parseResponse(response, new TypeReference<CommonResponse<ProductUploadResultDTO>>() {});
+    }
+
+    @Override
+    public ProductResponseDTO queryGoods(ProductQueryRequestDTO dto) {
+        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, Arrays.asList(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 cancel(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);
+    }
+
+    @Override
+    public CommonResponse<AfterSaleResponseDTO> aftersaleUpload(RefundOrderDTO dto) {
+        String url = BASE_URL + "/open/aftersale/upload";
+        log.info("售后上传 - URL: {}, 请求体: {}", url, JSON.toJSONString(dto));
+
+        HttpResponse response = executeJsonPost(url, Collections.singletonList(dto));
+        // 这里直接返回CommonResponse类型
+        return parseCommonResponse(response);
+    }
+
+    @Override
+    public CommonResponse<AssetProcessResultDTO> aftersaleConfirm(AfterSaleConfirmRequestDTO dto) {
+        String url = BASE_URL + "/open/webapi/aftersaleapi/open/confirm";
+        log.info("售后单确认 - URL: {}, 请求体: {}", url, JSON.toJSONString(dto));
+
+        HttpResponse response = executeJsonPost(url, dto);
+        // 这里直接返回CommonResponse类型
+        return parseCommonResponse(response);
+    }
+
+    /**
+     * 执行JSON格式的POST请求
+     *
+     * @param url 请求URL
+     * @param dto 请求对象
+     * @param needToken 是否需要添加access_token(认证相关请求不需要)
+     * @return HttpResponse响应
+     */
+    private HttpResponse executeJsonPost(String url, Object dto, boolean needToken) {
+        SerializeConfig serializeConfig = new SerializeConfig();
+        serializeConfig.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
+        String jsonBody = JSON.toJSONString(dto, serializeConfig);
+        Map<String, Object> map = new HashMap<>();
+
+        // 只有在需要token的请求中才添加access_token
+        if (needToken) {
+            String accessToken = jstTokenService.getAccessToken();
+            map.put("access_token", accessToken);
+        }
+
+        map.put("app_key", appKey);
+        map.put("timestamp", System.currentTimeMillis() / 1000);
+        map.put("version", "2");
+        map.put("charset", "utf-8");
+        map.put("biz", jsonBody);
+        map.put("sign", SignUtil.getSignNew(appSecret, map));
+        Map<String, String> headers = MapUtil.builder(new HashMap<String, String>())
+                .put("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
+                .build();
+        log.debug("发送JSON请求 - URL: {}, Headers: {}, Body: {}", url, headers, JSON.toJSONString(map));
+        HttpResponse response = HttpRequest.post(url)
+                .headerMap(headers, true)
+                .form(map)
+                .execute();
+        logResponse(response);
+        return response;
+    }
+
+    /**
+     * 执行JSON格式的POST请求
+     *
+     * @param url 请求URL
+     * @param dto 请求对象
+     * @return HttpResponse响应
+     */
+    private HttpResponse executeJsonPost(String url, Object dto) {
+        SerializeConfig serializeConfig = new SerializeConfig();
+        serializeConfig.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
+
+        String jsonBody = JSON.toJSONString(dto, serializeConfig);
+
+        Map<String,Object> map = new HashMap<>();
+
+        String accessToken = jstTokenService.getAccessToken();
+
+        map.put("access_token",accessToken);
+        map.put("app_key",appKey);
+        map.put("timestamp",System.currentTimeMillis()/1000);
+        map.put("version","2");
+        map.put("charset","utf-8");
+        map.put("biz", jsonBody);
+
+        map.put("sign",SignUtil.getSignNew(appSecret, map));
+
+
+        Map<String, String> headers = MapUtil.builder(new HashMap<String, String>())
+                .put("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
+                .build();
+
+
+        log.debug("发送JSON请求 - URL: {}, Headers: {}, Body: {}", url, headers, JSON.toJSONString(map));
+
+        HttpResponse response = HttpRequest.post(url)
+                .headerMap(headers, true)
+                .form(map)
+                .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)) {
+        if (!Integer.valueOf(0).equals(commonResponse.getCode())) {
+            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());
+        }
+
+        log.info("API请求成功 - 结果: {}", JSON.toJSONString(commonResponse));
+        return commonResponse;
+    }
+}

+ 110 - 0
fs-service/src/main/java/com/fs/erp/mapper/FsJstAftersalePushMapper.java

@@ -0,0 +1,110 @@
+package com.fs.erp.mapper;
+
+import com.fs.erp.domain.FsJstAftersalePush;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 订阅物流Mapper
+ */
+@Mapper
+public interface FsJstAftersalePushMapper {
+
+    /**
+     * 根据ID查询
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push WHERE id = #{id}")
+    FsJstAftersalePush selectById(Long id);
+
+    /**
+     * 根据订单ID查询
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push WHERE order_id = #{orderId}")
+    FsJstAftersalePush selectByOrderId(String orderId);
+
+    /**
+     * 查询待处理的任务
+     */
+    @Select("SELECT * FROM fs_jst_aftersale_push WHERE task_status = #{status} AND retry_count < #{maxRetry} LIMIT #{limit}")
+    List<FsJstAftersalePush> selectByStatusAndRetry(Byte status, Integer maxRetry, Integer limit);
+
+    /**
+     * 插入记录
+     */
+    @Insert("INSERT INTO fs_jst_aftersale_push(order_id,after_sale_id, type, task_status, retry_count, last_execute_time, params) " +
+            "VALUES(#{orderId},#{afterSaleId}, #{type}, #{taskStatus}, #{retryCount}, #{lastExecuteTime}, #{params})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(FsJstAftersalePush push);
+
+    /**
+     * 更新记录
+     */
+    @Update("UPDATE fs_jst_aftersale_push SET params=#{params},task_status = #{taskStatus}, retry_count = #{retryCount}, " +
+            "last_execute_time = #{lastExecuteTime}, result = #{result}, error_message = #{errorMessage} " +
+            "WHERE id = #{id}")
+    int update(FsJstAftersalePush push);
+
+    /**
+     * 更新任务状态
+     */
+    @Update("UPDATE fs_jst_aftersale_push SET task_status = #{taskStatus}, " +
+            "last_execute_time = now() WHERE id = #{id}")
+    int updateStatus(@Param("id") Long id, @Param("taskStatus") Byte taskStatus);
+
+    @Select("WITH OrderWithNextTaskType AS (\n" +
+            "    SELECT \n" +
+            "        id,\n" +
+            "        order_id,\n" +
+            "        after_sale_id,\n" +
+            "        type,\n" +
+            "        task_status,\n" +
+            "        retry_count,\n" +
+            "        ROW_NUMBER() OVER(PARTITION BY order_id ORDER BY CAST(type AS UNSIGNED)) AS task_seq\n" +
+            "    FROM \n" +
+            "        fs_jst_aftersale_push\n" +
+            "),\n" +
+            "PendingTasks AS (\n" +
+            "    SELECT \n" +
+            "        o.id,\n" +
+            "        o.order_id,\n" +
+            "        o.after_sale_id,\n" +
+            "        o.type,\n" +
+            "        o.task_status,\n" +
+            "        o.retry_count,\n" +
+            "        o.task_seq,\n" +
+            "        (\n" +
+            "            SELECT MAX(p.task_status)  \n" +
+            "            FROM OrderWithNextTaskType p\n" +
+            "            WHERE p.order_id = o.order_id\n" +
+            "              AND p.task_seq = o.task_seq - 1\n" +
+            "        ) AS prev_task_status,\n" +
+            "        EXISTS (\n" +
+            "            SELECT 1\n" +
+            "            FROM OrderWithNextTaskType p\n" +
+            "            WHERE p.order_id = o.order_id\n" +
+            "              AND p.task_seq < o.task_seq\n" +
+            "              AND p.task_status != 1\n" +
+            "        ) AS has_pending_prev_task\n" +
+            "    FROM \n" +
+            "        OrderWithNextTaskType o\n" +
+            "    WHERE \n" +
+            "        o.task_status = 0 OR (o.task_status = 2 AND o.retry_count < 3)\n" +
+            ")\n" +
+            "SELECT \n" +
+            "    id,\n" +
+            "    order_id,\n" +
+            "    after_sale_id,\n" +
+            "    type,\n" +
+            "    task_status,\n" +
+            "    retry_count\n" +
+            "FROM \n" +
+            "    PendingTasks\n" +
+            "WHERE \n" +
+            "    (task_seq = 1 OR prev_task_status = 1)\n" +
+            "    AND has_pending_prev_task = 0\n" +
+            "ORDER BY\n" +
+            "    order_id,\n" +
+            "    task_seq;\n")
+    List<FsJstAftersalePush> queryPenddingData();
+}

+ 77 - 0
fs-service/src/main/java/com/fs/erp/mapper/FsJstCodPushMapper.java

@@ -0,0 +1,77 @@
+package com.fs.erp.mapper;
+
+import com.fs.erp.domain.FsJstCodPush;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface FsJstCodPushMapper {
+
+    /**
+     * 根据ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push WHERE id = #{id}")
+    FsJstCodPush selectById(@Param("id") Long id);
+
+    /**
+     * 根据订单ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push WHERE order_id = #{orderId}")
+    List<FsJstCodPush> selectByOrderId(@Param("orderId") String orderId);
+
+    /**
+     * 根据售后ID查询记录
+     */
+    @Select("SELECT * FROM fs_jst_cod_push WHERE after_sale_id = #{afterSaleId}")
+    List<FsJstCodPush> selectByAfterSaleId(@Param("afterSaleId") String afterSaleId);
+
+    /**
+     * 查询待处理的任务
+     */
+    @Select("SELECT * FROM fs_jst_cod_push WHERE task_status = 0 ORDER BY id ASC LIMIT #{limit}")
+    List<FsJstCodPush> selectPendingTasks(@Param("limit") int limit);
+
+
+    /**
+     * 查询待处理的数据
+     * @return List<FsJstCodPush>
+     */
+    @Select("SELECT * from fs_jst_cod_push where task_status = 0 OR (task_status = 2 AND retry_count < 3) ")
+    List<FsJstCodPush> queryPenddingData();
+    /**
+     * 插入新记录
+     */
+    @Insert("INSERT INTO fs_jst_cod_push(order_id, after_sale_id, type, task_status, params) " +
+            "VALUES(#{orderId}, #{afterSaleId}, #{type}, #{taskStatus}, #{params})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(FsJstCodPush record);
+
+    /**
+     * 更新任务状态
+     */
+    @Update("UPDATE fs_jst_cod_push SET task_status = #{taskStatus}, retry_count = #{retryCount}, " +
+            "last_execute_time = NOW(), result = #{result}, error_message = #{errorMessage} " +
+            "WHERE id = #{id}")
+    int updateTaskStatus(FsJstCodPush record);
+
+    /**
+     * 根据ID更新记录
+     */
+    @Update("<script>" +
+            "UPDATE fs_jst_cod_push " +
+            "<set>" +
+            "  <if test='orderId != null'>order_id = #{orderId},</if>" +
+            "  <if test='afterSaleId != null'>after_sale_id = #{afterSaleId},</if>" +
+            "  <if test='type != null'>type = #{type},</if>" +
+            "  <if test='taskStatus != null'>task_status = #{taskStatus},</if>" +
+            "  <if test='retryCount != null'>retry_count = #{retryCount},</if>" +
+            "  <if test='lastExecuteTime != null'>last_execute_time = #{lastExecuteTime},</if>" +
+            "  <if test='params != null'>params = #{params},</if>" +
+            "  <if test='result != null'>result = #{result},</if>" +
+            "  <if test='errorMessage != null'>error_message = #{errorMessage},</if>" +
+            "</set>" +
+            "WHERE id = #{id}" +
+            "</script>")
+    int updateById(FsJstCodPush record);
+}

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/FsJstAftersalePushService.java

@@ -0,0 +1,5 @@
+package com.fs.erp.service;
+
+public interface FsJstAftersalePushService {
+    void pushJst();
+}

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/FsJstCodPushService.java

@@ -0,0 +1,5 @@
+package com.fs.erp.service;
+
+public interface FsJstCodPushService {
+    public void jstCodPush();
+}

+ 172 - 0
fs-service/src/main/java/com/fs/erp/service/impl/FsJstAftersalePushServiceImpl.java

@@ -0,0 +1,172 @@
+package com.fs.erp.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.fs.common.utils.ExceptionUtil;
+import com.fs.erp.constant.AfterSalesOrderStatusEnum;
+import com.fs.erp.constant.TaskStatusEnum;
+import com.fs.erp.domain.FsJstAftersalePush;
+import com.fs.erp.dto.*;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.mapper.FsJstAftersalePushMapper;
+import com.fs.erp.service.FsJstAftersalePushService;
+import com.fs.his.domain.FsStoreAfterSales;
+import com.fs.his.domain.FsStoreOrder;
+import com.fs.his.domain.FsStoreOrderItem;
+import com.fs.his.dto.FsStoreCartDTO;
+import com.fs.his.mapper.FsStoreAfterSalesMapper;
+import com.fs.his.mapper.FsStoreOrderMapper;
+import com.fs.his.service.IFsStoreOrderItemService;
+import com.fs.ybPay.dto.RefundOrderDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.util.Asserts;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Slf4j
+@Service
+public class FsJstAftersalePushServiceImpl implements FsJstAftersalePushService {
+
+    @Autowired
+    private FsJstAftersalePushMapper fsJstAftersalePushMapper;
+
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+
+    @Autowired
+    private FsStoreOrderMapper fsStoreOrderMapper;
+
+    @Autowired
+    private IFsStoreOrderItemService storeOrderItemService;
+
+    @Autowired
+    private FsStoreAfterSalesMapper fsStoreAfterSalesMapper;
+
+    @Value("${jst.shop_code:''}")
+    private String shopId;
+    @Override
+    public void pushJst() {
+        List<FsJstAftersalePush> fsJstAftersalePushes = fsJstAftersalePushMapper.queryPenddingData();
+
+        for (FsJstAftersalePush item : fsJstAftersalePushes) {
+            item.setTaskStatus(TaskStatusEnum.PROCESSING.getCode());
+            int update = fsJstAftersalePushMapper.update(item);
+            if(update <= 0){
+                log.info("获取记录{} 锁失败!",item.getId());
+                continue;
+            }
+
+            FsStoreOrder fsStoreOrder = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(item.getOrderId());
+
+            item.setRetryCount(item.getRetryCount()+1);
+
+            if(fsStoreOrder == null){
+                item.setErrorMessage("该订单未找到!");
+                item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                log.info("该订单未找到!");
+                fsJstAftersalePushMapper.update(item);
+                continue;
+            }
+            Asserts.notNull(fsStoreOrder,"该订单未找到!");
+            RefundOrderDTO dto;
+            dto = getAfterSaleDTO(item, fsStoreOrder);
+            // 买家已经申请,等待卖家同意
+            if(StringUtils.equals(AfterSalesOrderStatusEnum.WAIT_SELLER_AGREE.getIndex().toString()
+                    ,item.getType())){
+
+            // 买家已经退货,等待卖家确认收货
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.WAIT_SELLER_CONFIRM_GOODS.getIndex().toString(),
+                    item.getType())){
+                // 查询售后单 同步快递单号过去
+                FsStoreAfterSales fsStoreAfterSales = fsStoreAfterSalesMapper.selectFsStoreAfterSalesById(item.getId());
+//                dto.setLogisticsCompany(fsStoreAfterSales.getDeliverySn());
+                dto.setLogisticsCompany(fsStoreAfterSales.getDeliveryName());
+//                dto.setLId(fsStoreAfterSales.getDeliveryId());
+                dto.setLId(fsStoreAfterSales.getDeliverySn());
+
+            // 售后关闭
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.CLOSED.getIndex().toString(),item.getType())) {
+
+            // 退款成功
+            } else if(StringUtils.equals(AfterSalesOrderStatusEnum.SUCCESS.getIndex().toString(),item.getType())) {
+
+            // 确认
+            }
+
+
+            if(!StringUtils.equals(AfterSalesOrderStatusEnum.CONFIRM.getIndex().toString(),item.getType())) {
+                try{
+                    CommonResponse<AfterSaleResponseDTO> response = jstErpHttpService.aftersaleUpload(dto);
+                    item.setParams(JSON.toJSONString(dto));
+                    item.setResult(JSON.toJSONString(response));
+                    item.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+                }catch (Exception e) {
+                    item.setErrorMessage(ExceptionUtil.getExceptionMessage(e));
+                    item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                }
+
+            // 如果是确认类型
+            } else{
+                AfterSaleConfirmRequestDTO requestDTO = new AfterSaleConfirmRequestDTO();
+
+                requestDTO.setAsIds(Collections.singletonList(Long.valueOf(item.getAfterSaleId())));
+                requestDTO.setExchangeForce(true);
+                requestDTO.setConfirmRefund(true);
+
+                try{
+                    CommonResponse<AssetProcessResultDTO> response = jstErpHttpService.aftersaleConfirm(requestDTO);
+                    item.setParams(JSON.toJSONString(dto));
+                    item.setResult(JSON.toJSONString(response));
+                    item.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+                }catch (Exception e){
+                    item.setErrorMessage(ExceptionUtil.getExceptionMessage(e));
+                    item.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                }
+            }
+
+            fsJstAftersalePushMapper.update(item);
+        }
+    }
+
+    private RefundOrderDTO getAfterSaleDTO(FsJstAftersalePush item, FsStoreOrder fsStoreOrder) {
+        RefundOrderDTO dto = new RefundOrderDTO();
+        AfterSalesOrderStatusEnum statusEnum = AfterSalesOrderStatusEnum.getByIndex(Integer.valueOf(item.getType()));
+
+        dto.setShopStatus(statusEnum.getCode());
+        dto.setQuestionType("可更新");
+        dto.setOuterAsId(item.getAfterSaleId());
+        dto.setRemark("用户退款");
+        dto.setType("仅退款");
+
+        dto.setShopId(Long.parseLong(shopId));
+        dto.setTotalAmount(fsStoreOrder.getTotalPrice());
+        dto.setSoId(item.getOrderId());
+        dto.setRefund(fsStoreOrder.getPayMoney());
+
+
+        FsStoreOrderItem itemMap=new FsStoreOrderItem();
+//        itemMap.setOrderId(fsStoreOrder.getId());
+        itemMap.setOrderId(fsStoreOrder.getOrderId());
+        List<FsStoreOrderItem> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
+        List<RefundItemDTO> refundItemDTOS=new ArrayList<>();
+
+        for(FsStoreOrderItem orderItem: orderItems) {
+            FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
+
+            RefundItemDTO itemDTO = new RefundItemDTO();
+            itemDTO.setSkuId(cartDTO.getBarCode());
+            itemDTO.setQty(cartDTO.getNum());
+            itemDTO.setAmount(cartDTO.getPrice());
+            itemDTO.setType("退货");
+            refundItemDTOS.add(itemDTO);
+        }
+        dto.setItems(refundItemDTOS);
+        return dto;
+    }
+}

+ 53 - 0
fs-service/src/main/java/com/fs/erp/service/impl/FsJstCodPushServiceImpl.java

@@ -0,0 +1,53 @@
+package com.fs.erp.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fs.erp.constant.TaskStatusEnum;
+import com.fs.erp.domain.FsJstCodPush;
+import com.fs.erp.dto.ErpOrderResponseDTO;
+import com.fs.erp.dto.ShopOrderDTO;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.mapper.FsJstCodPushMapper;
+import com.fs.erp.service.FsJstCodPushService;
+import com.hc.openapi.tool.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class FsJstCodPushServiceImpl implements FsJstCodPushService {
+    @Autowired
+    private FsJstCodPushMapper fsJstCodPushMapper;
+
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+
+    @Override
+    public void jstCodPush() {
+        List<FsJstCodPush> fsJstCodPushes = fsJstCodPushMapper.queryPenddingData();
+        for (FsJstCodPush fsJstCodPush : fsJstCodPushes) {
+            fsJstCodPush.setTaskStatus(TaskStatusEnum.PROCESSING.getCode());
+            int lock = fsJstCodPushMapper.updateById(fsJstCodPush);
+            if(lock <= 0) {
+                log.info("获取当前记录锁失败! 已跳过");
+                continue;
+            }
+
+            try{
+                String params = fsJstCodPush.getParams();
+                ShopOrderDTO shopOrderDTO = JSONObject.parseObject(params, ShopOrderDTO.class);
+                ErpOrderResponseDTO upload = jstErpHttpService.upload(shopOrderDTO);
+                fsJstCodPush.setResult(JSON.toJSONString(upload));
+                fsJstCodPush.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+
+            }catch (Exception e) {
+                fsJstCodPush.setErrorMessage(JSON.toJSONString(e));
+                fsJstCodPush.setRetryCount(fsJstCodPush.getRetryCount()+1);
+            }
+
+            fsJstCodPushMapper.updateById(fsJstCodPush);
+        }
+    }
+}

+ 52 - 0
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpGoodsServiceImpl.java

@@ -0,0 +1,52 @@
+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.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service("JSTErpGoodsServiceImpl")
+public class JSTErpGoodsServiceImpl implements IErpGoodsService {
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+    @Override
+    public BaseResponse addGoods(ErpGoods goods) {
+        return null;
+    }
+
+    @Override
+    public ErpGoodsQueryResponse getGoods(ErpGoodsQueryRequert param) {
+        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
+    public ErpGoodsStockQueryResponse getGoodsStock(ErpGoodsStockQueryRequert param) {
+        return null;
+    }
+}

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

@@ -0,0 +1,364 @@
+package com.fs.erp.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.erp.constant.ErpQueryOrderStatusEnum;
+import com.fs.erp.constant.OrderStatusEnum;
+import com.fs.erp.constant.TaskStatusEnum;
+import com.fs.erp.domain.*;
+import com.fs.erp.dto.*;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.mapper.FsJstAftersalePushMapper;
+import com.fs.erp.mapper.FsJstCodPushMapper;
+import com.fs.erp.service.IErpOrderService;
+import com.fs.his.domain.FsStoreOrder;
+import com.fs.his.domain.FsStoreOrderItem;
+import com.fs.his.domain.FsStoreProduct;
+import com.fs.his.mapper.FsStoreAfterSalesMapper;
+import com.fs.his.service.IFsStoreOrderItemService;
+import com.fs.his.service.IFsStoreOrderService;
+import com.fs.his.service.IFsStoreProductService;
+import com.fs.his.vo.FsStoreOrderItemVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.Asserts;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class JSTErpOrderServiceImpl implements IErpOrderService {
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+
+    @Autowired
+    private IFsStoreOrderService fsStoreOrderService;
+
+    @Autowired
+    private FsJstAftersalePushMapper fsJstAftersalePushMapper;
+
+    @Autowired
+    private IFsStoreOrderItemService fsStoreOrderItemService;
+
+    @Autowired
+    private IFsStoreProductService fsStoreProductService;
+
+//    @Autowired
+//    private FsStoreDeliversMapper fsStoreDeliversMapper;
+
+    @Autowired
+    private FsStoreAfterSalesMapper fsStoreAfterSalesMapper;
+
+    @Autowired
+    private FsJstCodPushMapper fsJstCodPushMapper;
+
+    @Override
+    public ErpOrderResponse addOrder(ErpOrder order) {
+        FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(order.getPlatform_code());
+
+        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.getBuyer_account());
+        // 收货人省份
+        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_mobile());
+        // 支付金额
+        shopOrderDTO.setPayAmount(erpOrderPayment.getPayment());
+        // 运费 改
+//        if(ObjectUtil.isNull(fsStoreOrder.getPayPostage())) {
+//            shopOrderDTO.setFreight(Double.valueOf("0.00"));
+//        } else {
+//            shopOrderDTO.setFreight(fsStoreOrder.getPayPostage().doubleValue());
+//        }
+        if (ObjectUtil.isNull(fsStoreOrder.getPayDelivery())) {
+            shopOrderDTO.setFreight(Double.valueOf("0.00"));
+        } else {
+            shopOrderDTO.setFreight(fsStoreOrder.getPayDelivery().doubleValue());
+        }
+        // 备注
+        shopOrderDTO.setRemark(order.getBuyer_memo());
+        // 买家留言
+        shopOrderDTO.setBuyerMessage(order.getBuyer_memo());
+
+        // 订单商品项列表
+        List<OrderItemDTO> itemDTOList = new ArrayList<>();
+    // 改
+//        List<FsStoreOrderItemVO> fsStoreOrderItemVOS = fsStoreOrderItemService.selectFsStoreOrderItemListByOrderId(fsStoreOrder.getId());
+//        for (FsStoreOrderItemVO item : fsStoreOrderItemVOS) {
+//            OrderItemDTO orderItemDTO = new OrderItemDTO();
+//            JSONObject jsonObject = JSON.parseObject(item.getJsonInfo());
+//
+//            String barCode = jsonObject.getString("barCode");
+//            String productName = jsonObject.getString("productName");
+//
+//            orderItemDTO.setSkuId(barCode);
+//            orderItemDTO.setShopSkuId(barCode);
+//            orderItemDTO.setName(productName);
+//
+//            FsStoreProduct fsStoreProduct = fsStoreProductService.selectFsStoreProductById(item.getProductId());
+//
+//            orderItemDTO.setAmount(fsStoreProduct.getPrice());
+//
+//            orderItemDTO.setQty(item.getNum().intValue());
+//            orderItemDTO.setOuterOiId(String.format("%s%s",item.getOrderCode(),item.getItemId()));
+//            itemDTOList.add(orderItemDTO);
+//        }
+
+        List<FsStoreOrderItem> fsStoreOrderItemVOS = fsStoreOrderItemService.selectFsStoreOrderItemListByOrderId(fsStoreOrder.getOrderId());
+        for (FsStoreOrderItem item : fsStoreOrderItemVOS) {
+            OrderItemDTO orderItemDTO = new OrderItemDTO();
+            JSONObject jsonObject = JSON.parseObject(item.getJsonInfo());
+
+            String barCode = jsonObject.getString("barCode");
+            String productName = jsonObject.getString("productName");
+
+            orderItemDTO.setSkuId(barCode);
+            orderItemDTO.setShopSkuId(barCode);
+            orderItemDTO.setName(productName);
+
+            FsStoreProduct fsStoreProduct = fsStoreProductService.selectFsStoreProductById(item.getProductId());
+
+            orderItemDTO.setAmount(fsStoreProduct.getPrice());
+
+            orderItemDTO.setQty(item.getNum().intValue());
+            orderItemDTO.setOuterOiId(String.format("%s%s",fsStoreOrder.getOrderCode(),item.getItemId()));
+            itemDTOList.add(orderItemDTO);
+        }
+        shopOrderDTO.setItems(itemDTOList);
+
+        // 实际支付金额
+        PaymentDTO paymentDTO = new PaymentDTO();
+        paymentDTO.setAmount(fsStoreOrder.getPayMoney().doubleValue());
+        paymentDTO.setOuterPayId(order.getPlatform_code());
+        paymentDTO.setPayDate(order.getDeal_datetime());
+        paymentDTO.setPayment("微信支付");
+        paymentDTO.setBuyerAccount(order.getBuyer_account());
+        paymentDTO.setSellerAccount("平台销售");
+        shopOrderDTO.setPay(paymentDTO);
+
+
+        // 如果是货到付款
+        if("2".equals(fsStoreOrder.getPayType()) || "3".equals(fsStoreOrder.getPayType())){
+            shopOrderDTO.setIsCod(true);
+            // 货到付款金额 = 物流代收金额-优惠金额
+            shopOrderDTO.setBuyerPaidAmount(fsStoreOrder.getPayDelivery());
+            shopOrderDTO.setPayAmount(fsStoreOrder.getPayPrice().doubleValue());
+
+            // 货到付款要推两次
+            PaymentDTO paymentDTO2 = new PaymentDTO();
+            // 物流代收金额
+            paymentDTO2.setAmount(fsStoreOrder.getPayDelivery().doubleValue());
+            paymentDTO2.setOuterPayId(String.format("%s%d",order.getPlatform_code(),1));
+            paymentDTO2.setPayDate(order.getDeal_datetime());
+            paymentDTO2.setPayment("货到付款");
+            paymentDTO2.setBuyerAccount(order.getBuyer_account());
+            paymentDTO2.setSellerAccount("平台销售");
+            shopOrderDTO.setPay(paymentDTO2);
+
+            FsJstCodPush fsJstCodPush = new FsJstCodPush();
+            fsJstCodPush.setOrderId(fsStoreOrder.getOrderCode());
+            fsJstCodPush.setType("0");
+            fsJstCodPush.setParams(JSON.toJSONString(shopOrderDTO));
+            fsJstCodPush.setRetryCount(0);
+            fsJstCodPush.setTaskStatus(TaskStatusEnum.PENDING.getCode());
+            fsJstCodPushMapper.insert(fsJstCodPush);
+
+            shopOrderDTO.setPay(paymentDTO);
+        }
+
+        ErpOrderResponseDTO upload = jstErpHttpService.upload(shopOrderDTO);
+
+        if(CollectionUtils.isEmpty(upload.getDatas())) {
+            log.info("推送ERP返回结果: {}",upload);
+            throw new IllegalArgumentException("推送ERP返回数不应该为0");
+        }
+        ErpOrderResponseDTO.OrderData orderData = upload.getDatas().get(0);
+
+        ErpOrderResponse erpOrderResponse = new ErpOrderResponse();
+        erpOrderResponse.setSuccess(true);
+        erpOrderResponse.setCode(String.valueOf(orderData.getOId()));
+        return erpOrderResponse;
+    }
+
+
+
+    @Override
+    public ErpOrderResponse refundOrder(ErpRefundOrder order) {
+        return null;
+    }
+
+    @Override
+    public ErpDeliverysResponse getDeliver(ErpDeliverysRequest param) {
+        return null;
+    }
+
+    @Override
+    public ErpOrderQueryResponse getOrder(ErpOrderQueryRequert param) {
+        // 1. 构建查询请求DTO
+        OrderQueryRequestDTO requestDTO = new OrderQueryRequestDTO();
+        requestDTO.setOIds(Collections.singletonList(Long.valueOf(param.getCode())));
+
+
+        // 2. 调用ERP服务查询订单
+        OrderQueryResponseDTO query = jstErpHttpService.query(requestDTO);
+
+        // 3. 构建响应对象
+        ErpOrderQueryResponse response = new ErpOrderQueryResponse();
+
+        // 4. 设置基本响应信息
+
+        // 5. 转换订单数据
+        if (query.getOrders() != null && !query.getOrders().isEmpty()) {
+            List<ErpOrderQuery> erpOrders = query.getOrders().stream()
+                    .map(this::convertToErpOrderQuery)
+                    .collect(Collectors.toList());
+
+            response.setOrders(erpOrders);
+        } else {
+            response.setOrders(Collections.emptyList());
+        }
+
+        return response;
+    }
+
+    /**
+     * 将OrderQueryResponseDTO.Order转换为ErpOrderQuery
+     *
+     * @param order 订单数据
+     * @return ErpOrderQuery 转换后的订单数据
+     */
+    private ErpOrderQuery convertToErpOrderQuery(OrderQueryResponseDTO.Order order) {
+        ErpOrderQuery erpOrder = new ErpOrderQuery();
+
+        FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(order.getSoId());
+        Asserts.notNull(fsStoreOrder,"该订单号没有找到!");
+
+        // 设置基本订单信息
+        erpOrder.setCode(order.getSoId());
+
+        // 计算订单总数量
+        if (order.getItems() != null && !order.getItems().isEmpty()) {
+            int totalQty = order.getItems().stream()
+                    .mapToInt(OrderQueryResponseDTO.OrderItem::getQty)
+                    .sum();
+            erpOrder.setQty(totalQty);
+        }
+
+        // 设置金额相关信息
+        erpOrder.setAmount(order.getAmount() != null ? order.getAmount().doubleValue() : null);
+        erpOrder.setPayment(order.getPaidAmount() != null ? order.getPaidAmount().doubleValue() : null);
+
+        // 设置其他订单属性
+        erpOrder.setCod(order.getIsCod());
+        erpOrder.setPlatform_code(order.getOrderFrom());
+
+        // 尝试解析创建时间
+        try {
+            if (order.getCreated() != null) {
+                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                erpOrder.setCreatetime(formatter.parse(order.getCreated()));
+            }
+        } catch (Exception e) {
+            // 日期解析异常处理
+            // 可以记录日志或保持为null
+        }
+
+        // 设置店铺信息
+        erpOrder.setShop_name(order.getShopName());
+        erpOrder.setShop_code(String.valueOf(order.getShopId()));
+
+        // 设置物流信息
+        erpOrder.setExpress_name(order.getLogisticsCompany());
+        erpOrder.setExpress_code(order.getLId());
+
+        // 设置收件人信息
+//        erpOrder.setReceiver_name(fsStoreOrder.getRealName());
+        erpOrder.setReceiver_name(fsStoreOrder.getUserName());
+        erpOrder.setReceiver_phone(fsStoreOrder.getUserPhone());
+        erpOrder.setReceiver_mobile(fsStoreOrder.getUserPhone());
+
+        // 构建完整地址
+        erpOrder.setReceiver_address(fsStoreOrder.getUserAddress());
+
+        // 如果是已发货
+        if(ObjectUtil.equal(order.getStatus(), ErpQueryOrderStatusEnum.SENT.getCode())){
+            List<ErpDeliverys> deliverysList = new ArrayList<>();
+
+            ErpDeliverys delivery = new ErpDeliverys();
+            delivery.setMail_no(order.getLId());
+            delivery.setExpress_code(order.getLcId());
+            delivery.setExpress_name(order.getLogisticsCompany());
+            delivery.setDelivery(true);
+            delivery.setCode(order.getSoId());
+
+            deliverysList.add(delivery);
+            erpOrder.setDeliverys(deliverysList);
+
+            // 设置发货状态,假设有物流单号就是已发货状态
+            erpOrder.setDelivery_state(1);
+        } else {
+            erpOrder.setDelivery_state(0);
+        }
+
+        return erpOrder;
+    }
+
+
+    @Override
+    public BaseResponse refundUpdate(ErpRefundUpdateRequest param) {
+
+        FsStoreOrder fsStoreOrder = fsStoreOrderService.selectFsStoreOrderByOrderCode(param.getTid());
+        //todo 待合并
+//        FsStoreDelivers byOrderCode = fsStoreDeliversMapper.findByOrderCode(fsStoreOrder.getOrderCode());
+        //todo
+        // 发货后退款
+//        if(ObjectUtil.isNotNull(byOrderCode)){
+
+//        } else {
+            // 如果是发货前退款,直接走取消订单流程
+            // 如果是发货后退款,走售后流程
+            OrderCancelRequestDTO requestDTO = new OrderCancelRequestDTO();
+            requestDTO.setOIds(Collections.singletonList(Integer.valueOf(fsStoreOrder.getExtendOrderId())));
+            requestDTO.setCancelType("用户退款");
+            requestDTO.setRemark("用户退款");
+
+            jstErpHttpService.cancel(requestDTO);
+//        }
+
+
+        BaseResponse baseResponse = new BaseResponse();
+        baseResponse.setSuccess(true);
+
+        return baseResponse;
+    }
+
+    @Override
+    public ErpOrderResponse finishOrder(ErpOrder order) {
+        return null;
+    }
+}
+

+ 193 - 0
fs-service/src/main/java/com/fs/erp/service/impl/JstTokenService.java

@@ -0,0 +1,193 @@
+package com.fs.erp.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.fs.erp.dto.GetInitTokenRequestDTO;
+import com.fs.erp.dto.GetInitTokenResponseDTO;
+import com.fs.erp.dto.RefreshTokenRequestDTO;
+import com.fs.erp.http.JstErpHttpService;
+import com.fs.erp.utils.SignUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class JstTokenService {
+    private static final Logger log = LoggerFactory.getLogger(JstTokenService.class);
+
+    private static final String JST_TOKEN_KEY = "jst:access_token";
+    private static final String JST_REFRESH_TOKEN_KEY = "jst:refresh_token";
+    private static final String JST_TOKEN_EXPIRE_KEY = "jst:token_expire";
+
+    @Value("${jst.app_key:''}")
+    private String appKey;
+
+    @Value("${jst.app_secret:''}")
+    private String appSecret;
+
+    @Value("${jst.authorization_code:''}")
+    private String authorizationCode;
+
+    @Autowired
+    private JstErpHttpService httpService;
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    /**
+     * 获取访问令牌,如果缓存中存在有效令牌则直接返回,否则重新获取
+     * @return 有效的访问令牌
+     */
+    public String getAccessToken() {
+        String accessToken = redisTemplate.opsForValue().get(JST_TOKEN_KEY);
+
+        if (accessToken != null && !accessToken.isEmpty()) {
+            log.debug("从缓存中获取到有效的access_token");
+            return accessToken;
+        }
+
+        log.info("缓存中没有有效的access_token,重新获取");
+        return refreshAccessToken();
+    }
+
+    /**
+     * 强制刷新访问令牌
+     * @return 新的访问令牌
+     */
+    public String refreshAccessToken() {
+        // 检查是否有刷新令牌
+        String refreshToken = redisTemplate.opsForValue().get(JST_REFRESH_TOKEN_KEY);
+
+        if (refreshToken != null && !refreshToken.isEmpty()) {
+            log.info("使用refresh_token刷新令牌");
+            try {
+                return refreshTokenWithApi(refreshToken);
+            } catch (Exception e) {
+                log.error("使用refresh_token刷新失败,尝试重新初始化", e);
+            }
+        }
+
+        // 如果没有刷新令牌或刷新失败,则重新初始化
+        return initToken();
+    }
+
+    /**
+     * 初始化令牌
+     * @return 新的访问令牌
+     */
+    private String initToken() {
+        GetInitTokenRequestDTO requestDTO = new GetInitTokenRequestDTO();
+        requestDTO.setApp_key(appKey);
+        requestDTO.setGrant_type("authorization_code");
+        requestDTO.setCharset("utf-8");
+        requestDTO.setCode(authorizationCode);
+        requestDTO.setTimestamp(String.valueOf(System.currentTimeMillis() / 1000));
+
+        // 计算签名
+        requestDTO.setSign(SignUtil.getSignNew(appSecret, requestDTO));
+
+        log.info("初始化token请求参数: {}", JSON.toJSONString(requestDTO));
+
+        GetInitTokenResponseDTO response = httpService.getInitToken(requestDTO);
+        if (response == null || response.getAccess_token() == null) {
+            throw new RuntimeException("初始化token失败: " + (response != null ? JSON.toJSONString(response) : "响应为空"));
+        }
+
+        // 缓存token信息
+        storeTokenInfo(response);
+
+        log.info("初始化token成功,token将在{}秒后过期", response.getExpires_in());
+        return response.getAccess_token();
+    }
+
+    /**
+     * 使用刷新令牌API刷新令牌
+     * @param refreshToken 刷新令牌
+     * @return 新的访问令牌
+     */
+    private String refreshTokenWithApi(String refreshToken) {
+        RefreshTokenRequestDTO requestDTO = new RefreshTokenRequestDTO();
+        requestDTO.setApp_key(appKey);
+        requestDTO.setGrant_type("refresh_token");
+        requestDTO.setCharset("utf-8");
+        requestDTO.setRefresh_token(refreshToken);
+        requestDTO.setTimestamp(String.valueOf(System.currentTimeMillis() / 1000));
+
+        // 计算签名
+        requestDTO.setSign(SignUtil.getSignNew(appSecret, requestDTO));
+
+        log.info("刷新token请求参数: {}", JSON.toJSONString(requestDTO));
+
+        GetInitTokenResponseDTO response = httpService.refreshToken(requestDTO);
+        if (response == null || response.getAccess_token() == null) {
+            throw new RuntimeException("刷新token失败: " + (response != null ? JSON.toJSONString(response) : "响应为空"));
+        }
+
+        // 缓存token信息
+        storeTokenInfo(response);
+
+        log.info("刷新token成功,token将在{}秒后过期", response.getExpires_in());
+        return response.getAccess_token();
+    }
+
+    /**
+     * 将令牌信息存储到Redis
+     * @param tokenInfo 令牌信息
+     */
+    private void storeTokenInfo(GetInitTokenResponseDTO tokenInfo) {
+        // 默认30天过期时间,转换为秒
+        long expiresIn = tokenInfo.getExpires_in() != null ?
+                          Long.parseLong(String.valueOf(tokenInfo.getExpires_in())) : 30 * 24 * 60 * 60;
+
+        // 存储令牌,设置比官方少一天的过期时间,以确保安全
+        redisTemplate.opsForValue().set(JST_TOKEN_KEY, tokenInfo.getAccess_token(), expiresIn - 86400, TimeUnit.SECONDS);
+
+        // 存储刷新令牌,有效期与访问令牌相同
+        if (tokenInfo.getRefresh_token() != null) {
+            redisTemplate.opsForValue().set(JST_REFRESH_TOKEN_KEY, tokenInfo.getRefresh_token(), expiresIn, TimeUnit.SECONDS);
+        }
+
+        // 存储过期时间戳
+        long expireAt = System.currentTimeMillis() + (expiresIn * 1000);
+        redisTemplate.opsForValue().set(JST_TOKEN_EXPIRE_KEY, String.valueOf(expireAt), expiresIn, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 定时任务,每20天刷新一次令牌
+     * 根据文档说明,刷新token必须在有效期小于15天时进行,所以这里设置20天刷新一次
+     */
+    @Scheduled(fixedRate = 20 * 24 * 60 * 60 * 1000)
+    public void scheduleTokenRefresh() {
+        log.info("定时任务:刷新聚水潭API令牌");
+        try {
+            refreshAccessToken();
+        } catch (Exception e) {
+            log.error("定时刷新令牌失败", e);
+        }
+    }
+
+    /**
+     * 启动时初始化令牌
+     */
+    @PostConstruct
+    public void init() {
+        try {
+            // 检查Redis中是否已有有效token
+            String accessToken = redisTemplate.opsForValue().get(JST_TOKEN_KEY);
+            if (accessToken == null || accessToken.isEmpty()) {
+                log.info("系统启动,初始化聚水潭API令牌");
+                initToken();
+            } else {
+                log.info("系统启动,发现缓存中已有有效的聚水潭API令牌");
+            }
+        } catch (Exception e) {
+            log.error("初始化聚水潭API令牌失败", e);
+        }
+    }
+}

+ 149 - 0
fs-service/src/main/java/com/fs/erp/utils/SignUtil.java

@@ -0,0 +1,149 @@
+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.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+@Slf4j
+public class SignUtil {
+    private SignUtil() {}
+
+    /**
+     * 获取签名 - 支持Map<String, Object>类型参数
+     *
+     * @param app_secret 密钥
+     * @param params 参数Map,支持Object类型值
+     * @return 签名字符串
+     */
+    public static String getSignNew(String app_secret, Map<String, Object> params) {
+        try {
+            String sortedStr = getSortedParamStrNew(params);
+            String paraStr = app_secret + sortedStr;
+
+            log.info("paraStr: {}",paraStr);
+            return createSign(paraStr);
+        } catch (UnsupportedEncodingException e) {
+            log.warn("getSign UnsupportedEncodingException ", e);
+        }
+
+        return StringUtils.EMPTY;
+    }
+
+    public static String getSignNew(String app_secret, Object obj) {
+        try {
+            String sortedStr = getSortedParamStrNew(BeanUtil.beanToMap(obj));
+            String paraStr = app_secret + sortedStr;
+
+            return createSign(paraStr);
+        } catch (UnsupportedEncodingException e) {
+            log.warn("getSign UnsupportedEncodingException ", e);
+        }
+
+        return StringUtils.EMPTY;
+    }
+
+    /**
+     * 构造自然排序请求参数 - 支持Map<String, Object>类型参数
+     *
+     * @param params 请求参数
+     * @return 排序后的字符串
+     */
+    private static String getSortedParamStrNew(Map<String, Object> params) throws UnsupportedEncodingException {
+        Set<String> sortedParams = new TreeSet<>(params.keySet());
+
+        StringBuilder strB = new StringBuilder();
+        // 排除sign和空值参数
+        for (String key : sortedParams) {
+            if ("sign".equalsIgnoreCase(key)) {
+                continue;
+            }
+
+            Object valueObj = params.get(key);
+
+            // 处理Object类型值,转换为字符串
+            String value = valueObj != null ? valueObj.toString() : null;
+
+            if (StringUtils.isNotEmpty(value)) {
+                strB.append(key).append(value);
+            }
+        }
+        return strB.toString();
+    }
+
+    /**
+     * 生成新sign
+     *
+     * @param str 字符串
+     * @return String
+     */
+    private static String createSign(String str) {
+        if (str == null || str.length() == 0) {
+            return null;
+        }
+        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+        try {
+            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
+            mdTemp.update(str.getBytes("UTF-8"));
+
+            byte[] md = mdTemp.digest();
+            int j = md.length;
+            char[] buf = new char[j * 2];
+            int k = 0;
+            int i = 0;
+            while (i < j) {
+                byte byte0 = md[i];
+                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
+                buf[k++] = hexDigits[byte0 & 0xf];
+                i++;
+            }
+            return new String(buf);
+        } catch (Exception e) {
+            log.warn("create sign was failed", e);
+            return null;
+        }
+    }
+
+    /**
+     * 原有方法保留,保持向后兼容
+     */
+    public static String getSign(String app_secret, Map<String, String> params) {
+        try {
+            String sortedStr = getSortedParamStr(params);
+            String paraStr = app_secret + sortedStr;
+
+            return createSign(paraStr);
+        } catch (UnsupportedEncodingException e) {
+            log.warn("getSign UnsupportedEncodingException ", e);
+        }
+
+        return StringUtils.EMPTY;
+    }
+
+    /**
+     * 原有方法保留,保持向后兼容
+     */
+    private static String getSortedParamStr(Map<String, String> params) throws UnsupportedEncodingException {
+        Set<String> sortedParams = new TreeSet<>(params.keySet());
+
+        StringBuilder strB = new StringBuilder();
+        // 排除sign和空值参数
+        for (String key : sortedParams) {
+            if ("sign".equalsIgnoreCase(key)) {
+                continue;
+            }
+
+            String value = params.get(key);
+
+            if (StringUtils.isNotEmpty(value)) {
+                strB.append(key).append(value);
+            }
+        }
+        return strB.toString();
+    }
+}

+ 72 - 0
fs-service/src/main/java/com/fs/ybPay/dto/RefundOrderDTO.java

@@ -1,8 +1,11 @@
 package com.fs.ybPay.dto;
 package com.fs.ybPay.dto;
 
 
+import com.fs.erp.dto.RefundItemDTO;
 import lombok.Data;
 import lombok.Data;
 
 
+import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
 @Data
 @Data
@@ -10,6 +13,75 @@ public class RefundOrderDTO {
     private String refundNo;
     private String refundNo;
     private String account;
     private String account;
 
 
+    /**
+     * 店铺状态
+     */
+    private String shopStatus;
+
+    /**
+     * 问题类型
+     */
+    private String questionType;
+
+    /**
+     * 外部售后ID
+     */
+    private String outerAsId;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 退货类型
+     */
+    private String type;
+
+    /**
+     * 商品状态
+     */
+    private String goodStatus;
+
+    /**
+     * 店铺ID
+     */
+    private Long shopId;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 订单号
+     */
+    private String soId;
+
+    /**
+     * 物流公司
+     */
+    private String logisticsCompany;
+
+    /**
+     * 支付金额
+     */
+    private BigDecimal payment;
+
+    /**
+     * 物流ID
+     */
+    private String lId;
+
+    /**
+     * 退款金额
+     */
+    private BigDecimal refund;
+
+    /**
+     * 退货商品列表
+     */
+    private List<RefundItemDTO> items;
 
 
 
 
     public Map<String, String> toMap() {
     public Map<String, String> toMap() {

+ 95 - 0
fs-service/src/main/resources/application-config-druid-xzt.yml

@@ -0,0 +1,95 @@
+baidu:
+  token: 12313231232
+  back-domain: https://www.xxxx.com
+#配置
+logging:
+  level:
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  miniapp:
+    configs:
+      - appid: wx76cb55db092a41ae   #德瑞康
+        secret: c737a27415946994e977d665d87643b3
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+  cp:
+    corpId: wwb2a1055fb6c9a7c2
+    appConfigs:
+      - agentId: 1000005
+        secret: ec7okROXJqkNafq66-L6aKNv0asTzQIG0CYrj3vyBbo
+        token: PPKOdAlCoMO
+        aesKey: PKvaxtpSv8NGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
+  pay:
+    appId:  #微信公众号或者小程序等的appid
+    mchId:  #微信支付商户号
+    mchKey:  #微信支付商户密钥
+    subAppId:  #服务商模式下的子商户公众账号ID
+    subMchId:  #服务商模式下的子商户号
+    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+    notifyUrl: https://userapp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+      - appId: wx090c5f399d65456e # 第一个公众号的appid  //公众号名称:德瑞康
+        secret: dc70e963077d80cf61280aea6b7c52b7 # 公众号的appsecret--德瑞康
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+aifabu:  #爱链接
+  appKey: 7b471be905ab17e00f3b858c6710dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+  #  account: tcloud
+  #  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi: http://127.0.0.1:7771
+  h5CommonApi: http://127.0.0.1:7771
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
+  secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
+  bucket: cqxzt-1323137866
+  app_id: 1323137866
+  region: ap-chongqing
+  proxy: cqxzt
+tmp_secret_config:
+  secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
+  secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
+  bucket: fs-1319721001
+  app_id: 1319721001
+  region: ap-chongqing
+  proxy: fs
+cloud_host:
+  company_name: 襄之棠
+headerImg:
+  imgUrl: https://drk-1363981074.cos.ap-chongqing.myqcloud.com/fs/logo/30d7a0d1ec31e5ac16c6e96d5ca76ad.png
+ipad:
+  ipadUrl: http://ipad.cdwjyyh.com
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:
+# 聚水潭API配置
+jst:
+  app_key: bd7a7d06a6d54377842f883f9a4c502a
+  app_secret: 1d112cb9d21d41e187ff824b5852f4cf
+  authorization_code: zzzzzz
+  shop_code: "18461733"
+
+

+ 89 - 0
fs-service/src/main/resources/application-config-druid-yjb.yml

@@ -0,0 +1,89 @@
+baidu:
+  token: 12313231232
+  back-domain: https://www.xxxx.com
+#配置
+logging:
+  level:
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  miniapp:
+    configs:
+      - appid: wx76cb55db092a41ae   #德瑞康
+        secret: c737a27415946994e977d665d87643b3
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+  cp:
+    corpId: wwb2a1055fb6c9a7c2
+    appConfigs:
+      - agentId: 1000005
+        secret: ec7okROXJqkNafq66-L6aKNv0asTzQIG0CYrj3vyBbo
+        token: PPKOdAlCoMO
+        aesKey: PKvaxtpSv8NGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
+  pay:
+    appId:  #微信公众号或者小程序等的appid
+    mchId:  #微信支付商户号
+    mchKey:  #微信支付商户密钥
+    subAppId:  #服务商模式下的子商户公众账号ID
+    subMchId:  #服务商模式下的子商户号
+    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+    notifyUrl: https://userapp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+      - appId: wx090c5f399d65456e # 第一个公众号的appid  //公众号名称:德瑞康
+        secret: dc70e963077d80cf61280aea6b7c52b7 # 公众号的appsecret--德瑞康
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+aifabu:  #爱链接
+  appKey: 7b471be905ab17e00f3b858c6710dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+  #  account: tcloud
+  #  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi: http://127.0.0.1:7771
+  h5CommonApi: http://127.0.0.1:7771
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
+  secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
+  bucket: bjyjb-1323137866
+  app_id: 1323137866
+  region: ap-chongqing
+  proxy: bjyjb
+tmp_secret_config:
+  secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
+  secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
+  bucket: fs-1319721001
+  app_id: 1319721001
+  region: ap-chongqing
+  proxy: fs
+cloud_host:
+  company_name: 襄之棠
+headerImg:
+  imgUrl: https://drk-1363981074.cos.ap-chongqing.myqcloud.com/fs/logo/30d7a0d1ec31e5ac16c6e96d5ca76ad.png
+ipad:
+  ipadUrl: http://ipad.cdwjyyh.com
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:
+
+

+ 141 - 0
fs-service/src/main/resources/application-druid-xzt.yml

@@ -0,0 +1,141 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-xzt,common
+    # redis 配置
+    redis:
+        # 地址
+        host: 10.206.0.12
+        # 端口,默认为6379
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+#        password: Ylrz_1q2w3e4r5t6y
+        password: ylrz147..
+        # 连接超时时间
+        timeout: 20s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 8
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+    datasource:
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://10.206.0.14:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    enabled: false
+                    url:
+                    username:
+                    password:
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://10.206.0.14:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+    producer:
+        group: my-producer-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+    consumer:
+        group: test-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey

+ 140 - 0
fs-service/src/main/resources/application-druid-yjb.yml

@@ -0,0 +1,140 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-xzt,common
+    # redis 配置
+    redis:
+        # 地址
+        host: 10.206.0.17
+        # 端口,默认为6379
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password: Ylrz_1q2w3e4r5t6y
+        # 连接超时时间
+        timeout: 20s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 8
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+    datasource:
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://10.206.0.7:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    enabled: false
+                    url:
+                    username:
+                    password:
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://10.206.0.7:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+    producer:
+        group: my-producer-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+    consumer:
+        group: test-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey