浏览代码

添加海博

wang 1 月之前
父节点
当前提交
46edeed0a7
共有 29 个文件被更改,包括 3011 次插入0 次删除
  1. 58 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/hb/GoodsPriceHistory.java
  2. 94 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/hb/GoodsSku.java
  3. 118 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/hb/GoodsSpu.java
  4. 83 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/hb/StoreManagement.java
  5. 339 0
      yami-shop-common/src/main/java/com/yami/shop/common/util/HttpUtil.java
  6. 125 0
      yami-shop-common/src/main/java/com/yami/shop/common/util/hb/HBR.java
  7. 35 0
      yami-shop-common/src/main/java/com/yami/shop/common/util/hb/HBResponseEnum.java
  8. 76 0
      yami-shop-common/src/main/java/com/yami/shop/common/util/hb/HBSignUtil.java
  9. 77 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/CategoryController.java
  10. 77 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/FrontCategoryController.java
  11. 152 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/GoodsController.java
  12. 75 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/OrderController.java
  13. 41 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/ResourceController.java
  14. 148 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/StoreManagementController.java
  15. 76 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/dto/BaseMessage.java
  16. 37 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/dto/HBBaseReq.java
  17. 24 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/dto/HBStoreBaseInfoReq.java
  18. 51 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/dto/OrderItemMessage.java
  19. 103 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/dto/OrderMessage.java
  20. 117 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/dto/StoreMessage.java
  21. 33 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/dto/StoreRegister.java
  22. 34 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/ICategoryService.java
  23. 34 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/IFrontCategoryService.java
  24. 71 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/IGoodsService.java
  25. 92 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/IStoreManagementService.java
  26. 84 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/CategoryService.java
  27. 86 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/FrontCategoryService.java
  28. 355 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/GoodsService.java
  29. 316 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/StoreManagementService.java

+ 58 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/hb/GoodsPriceHistory.java

@@ -0,0 +1,58 @@
+package com.yami.shop.bean.model.hb;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 商品价格历史记录实体类
+ *
+ * @author Generated
+ * @since 2023-10-27
+ */
+@Data
+@TableName("zs_goods_price_history")
+public class GoodsPriceHistory {
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_ID) // 根据实际情况调整ID策略
+    private Long id;
+
+    /**
+     * 变更后价格
+     */
+    @TableField("new_price")
+    private BigDecimal newPrice;
+
+    /**
+     * 变更前价格
+     */
+    @TableField("old_price")
+    private BigDecimal oldPrice;
+
+    /**
+     * 价格变动类型(0-海博sku价格变动,1-渠道价格)
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 操作人
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 价格更新时间
+     */
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+}

+ 94 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/hb/GoodsSku.java

@@ -0,0 +1,94 @@
+package com.yami.shop.bean.model.hb;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 商品SKU实体
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-8
+ */
+@TableName("zs_goods_sku")
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class GoodsSku {
+
+    @TableId(value = "sku_id", type = IdType.AUTO)
+    private Long skuId;
+
+    @TableField("spu_id")
+    private Long spuId;
+
+    @TableField("sku_code")
+    private String skuCode;
+
+    @TableField("sku_name")
+    private String skuName;
+
+    @TableField("price")
+    private BigDecimal price;
+
+    @TableField("stock")
+    private Integer stock;
+
+    @TableField("weight")
+    private BigDecimal weight;
+
+    @TableField("volume")
+    private BigDecimal volume;
+
+    @TableField("main_image")
+    private String mainImage;
+
+    @TableField("status")
+    private Integer status;
+
+    @TableField("deleted")
+    private Integer deleted;
+
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    /**
+     * 设置默认值
+     */
+    public void setDefaultValues() {
+        LocalDateTime now = LocalDateTime.now();
+        if (createTime == null) {
+            createTime = now;
+        }
+        if (updateTime == null) {
+            updateTime = now;
+        }
+        if (price == null) {
+            price = BigDecimal.ZERO;
+        }
+        if (stock == null) {
+            stock = 0;
+        }
+        if (status == null) {
+            status = 1; // 默认正常状态
+        }
+        if (deleted == null) {
+            deleted = 0; // 默认未删除
+        }
+    }
+
+
+}

+ 118 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/hb/GoodsSpu.java

@@ -0,0 +1,118 @@
+package com.yami.shop.bean.model.hb;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 商品SPU实体
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-8
+ */
+@TableName("zs_goods_spu")
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class GoodsSpu {
+
+    @TableId(value = "spu_id", type = IdType.AUTO)
+    private Long spuId;
+
+    @TableField("merchant_id")
+    private Long merchantId;
+
+    @TableField("spu_name")
+    private String spuName;
+
+    @TableField("description")
+    private String description;
+
+    /**
+     * 类目ID
+     */
+    @TableField("category_id")
+    private Long categoryId;
+
+    /**
+     * 品牌ID
+     */
+    @TableField("brand_id")
+    private Long brandId;
+
+    @TableField("status")
+    private Integer status;
+
+    @TableField("deleted")
+    private Integer deleted;
+
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    /**
+     * 设置默认值
+     */
+    public void setDefaultValues() {
+        LocalDateTime now = LocalDateTime.now();
+        if (createTime == null) {
+            createTime = now;
+        }
+        if (status == null) {
+            status = Status.ON_SHELF.getCode(); // 默认上架
+        }
+        if (deleted == null) {
+            deleted = Status.NO_DELETE.getCode(); // 默认未删除
+        }
+    }
+
+
+    /**
+     * 状态枚举
+     */
+    public enum Status {
+        OFF_SHELF(0, "下架"),
+        ON_SHELF(1, "上架"),
+
+        NO_DELETE(0, "未删除"),
+        DELETE(1, "删除");
+
+        private final int code;
+        private final String desc;
+
+        Status(int code, String desc) {
+            this.code = code;
+            this.desc = desc;
+        }
+
+        public int getCode() {
+            return code;
+        }
+
+        public String getDesc() {
+            return desc;
+        }
+
+        public static Status fromCode(int code) {
+            for (Status status : values()) {
+                if (status.code == code) {
+                    return status;
+                }
+            }
+            return ON_SHELF; // 默认返回上架
+        }
+    }
+
+    private List<GoodsSku> goodsSkuList;
+}

+ 83 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/hb/StoreManagement.java

@@ -0,0 +1,83 @@
+package com.yami.shop.bean.model.hb;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * 门店实体
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-1
+ */
+@TableName("zs_store_management")
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class StoreManagement {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    @TableField("station_id")
+    private String stationId;
+
+    @TableField("out_station_no")
+    private String outStationNo;
+
+    @TableField("remark")
+    private String remark;
+
+    @TableField("status")
+    private String status;
+
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField("create_by")
+    private String createBy;
+
+    @TableField("update_by")
+    private String updateBy;
+
+    @TableField("deleted")
+    private Boolean deleted;
+
+    /**
+     * 设置默认值
+     */
+    public void setDefaultValues() {
+        LocalDateTime now = LocalDateTime.now();
+        if (createTime == null) {
+            createTime = now;
+        }
+        if (updateTime == null) {
+            updateTime = now;
+        }
+        if (status == null) {
+            status = "1"; // 默认启用
+        }
+
+        if (deleted == null) {
+            deleted = false; // 默认未删除
+        }
+    }
+
+    /**
+     * 设置更新时间
+     */
+    public void setUpdateTime() {
+        updateTime = LocalDateTime.now();
+    }
+}

+ 339 - 0
yami-shop-common/src/main/java/com/yami/shop/common/util/HttpUtil.java

@@ -0,0 +1,339 @@
+package com.yami.shop.common.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.FileBody;
+import org.apache.http.entity.mime.content.StringBody;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+
+/**
+ * HttpClient工具类
+ *
+ * @author 王坚
+ * @since 2021-06-10
+ */
+public class HttpUtil {
+
+    /**
+     * 字符编码
+     */
+    private final static String UTF8 = "utf-8";
+    /**
+     * 字节流数组大小(1MB)
+     */
+    private final static int BYTE_ARRAY_LENGTH = 1024 * 1024;
+
+    /**
+     * 执行get请求获取响应
+     *
+     * @param url _请求地址
+     * @return 响应内容
+     */
+    public static String get(String url) {
+        return get(url, null);
+    }
+
+    /**
+     * 执行get请求获取响应
+     *
+     * @param url     _请求地址
+     * @param headers _请求头参数
+     * @return 响应内容
+     */
+    public static String get(String url, Map<String, String> headers) {
+        HttpGet get = new HttpGet(url);
+        return getRespString(get, headers);
+    }
+
+    /**
+     * 执行post请求获取响应
+     *
+     * @param url _请求地址
+     * @return 响应内容
+     */
+    public static String post(String url) {
+        return post(url, null, null);
+    }
+
+    /**
+     * 执行post请求获取响应
+     *
+     * @param url    _请求地址
+     * @param params _请求参数
+     * @return 响应内容
+     */
+    public static String post(String url, Map<String, String> params) {
+        return post(url, null, params);
+    }
+
+    /**
+     * 执行post请求获取响应
+     *
+     * @param url    _请求地址
+     * @param params _请求参数
+     * @return 响应内容
+     */
+    public static String post(String url, Object params) {
+        return post(url, null, params);
+    }
+
+    /**
+     * 执行post请求获取响应
+     *
+     * @param url     _请求地址
+     * @param headers _请求头参数
+     * @param params  _请求参数
+     * @return 响应内容
+     */
+    public static String post(String url, Map<String, String> headers, Map<String, String> params) {
+        HttpPost post = new HttpPost(url);
+        post.setEntity(getHttpEntity(params));
+        return getRespString(post, headers);
+    }
+
+    /**
+     * 执行post请求获取响应
+     *
+     * @param url     _请求地址
+     * @param headers _请求头参数
+     * @param params  _请求参数
+     * @return 响应内容
+     */
+    public static String post(String url, Map<String, String> headers, Object params) {
+        HttpPost post = new HttpPost(url);
+        StringEntity entity = new StringEntity(JSON.toJSONString(params), ContentType.APPLICATION_JSON);
+        post.setEntity(entity);
+        return getRespString(post, headers);
+    }
+
+    /**
+     * 执行post请求获取响应(请求体为JOSN数据)
+     *
+     * @param url  _请求地址
+     * @param json _请求的JSON数据
+     * @return 响应内容
+     */
+    public static String postJson(String url, String json) {
+        return postJson(url, null, json);
+    }
+
+    /**
+     * 执行post请求获取响应(请求体为JOSN数据)
+     *
+     * @param url     _请求地址
+     * @param headers _请求头参数
+     * @param json    _请求的JSON数据
+     * @return 响应内容
+     */
+    public static String postJson(String url, Map<String, String> headers, String json) {
+        HttpPost post = new HttpPost(url);
+        post.setHeader("Content-type", "application/json");
+        post.setEntity(new StringEntity(json, UTF8));
+        return getRespString(post, headers);
+    }
+
+    /**
+     * 执行post请求获取响应(请求体包含文件)
+     *
+     * @param url    _请求地址
+     * @param params _请求参数(文件对应的value传File对象)
+     * @return 响应内容
+     */
+    public static String postFile(String url, Map<String, Object> params) {
+        return postFile(url, null, params);
+    }
+
+    /**
+     * 执行post请求获取响应(请求体包含文件)
+     *
+     * @param url     _请求地址
+     * @param headers _请求头参数
+     * @param params  _请求参数(文件对应的value传File对象)
+     * @return String
+     */
+    public static String postFile(String url, Map<String, String> headers, Map<String, Object> params) {
+        HttpPost post = new HttpPost(url);
+        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+        if (Objects.nonNull(params) && !params.isEmpty()) {
+            for (Entry<String, Object> entry : params.entrySet()) {
+                String key = entry.getKey();
+                Object value = entry.getValue();
+                if (Objects.isNull(value)) {
+                    builder.addPart(key, new StringBody("", ContentType.TEXT_PLAIN));
+                } else {
+                    if (value instanceof File) {
+                        builder.addPart(key, new FileBody((File) value));
+                    } else {
+                        builder.addPart(key, new StringBody(value.toString(), ContentType.TEXT_PLAIN));
+                    }
+                }
+            }
+        }
+        HttpEntity entity = builder.build();
+        post.setEntity(entity);
+        return getRespString(post, headers);
+    }
+
+    /**
+     * 下载文件
+     *
+     * @param url      _下载地址
+     * @param path     _保存路径(如:D:/images,不传默认当前工程根目录)
+     * @param fileName _文件名称(如:hello.jpg)
+     */
+    public static void download(String url, String path, String fileName) {
+        HttpGet get = new HttpGet(url);
+        File dir = new File(path);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        String filePath = null;
+        if (path.isEmpty()) {
+            filePath = fileName;
+        } else {
+            if (path.endsWith("/")) {
+                filePath = path + fileName;
+            } else {
+                filePath += path + "/" + fileName;
+            }
+        }
+        File file = new File(filePath);
+        if (!file.exists()) {
+            try {
+                file.createNewFile();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        try (FileOutputStream fos = new FileOutputStream(file); InputStream in = getRespInputStream(get, null)) {
+            if (Objects.isNull(in)) {
+                return;
+            }
+            byte bytes[] = new byte[BYTE_ARRAY_LENGTH];
+            int len = 0;
+            while ((len = in.read(bytes)) != -1) {
+                fos.write(bytes, 0, len);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 获取请求体HttpEntity
+     *
+     * @param params _请求参数
+     * @return HttpEntity
+     */
+    private static HttpEntity getHttpEntity(Map<String, String> params) {
+        List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
+        for (Entry<String, String> entry : params.entrySet()) {
+            pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
+        }
+        HttpEntity entity = null;
+        try {
+            entity = new UrlEncodedFormEntity(pairs, UTF8);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return entity;
+    }
+
+
+    /**
+     * 设置请求头
+     *
+     * @param request _请求对象
+     * @param headers _请求头参数
+     */
+    private static void setHeaders(HttpUriRequest request, Map<String, String> headers) {
+        if (Objects.nonNull(headers) && !headers.isEmpty()) {
+            // 请求头不为空,则设置对应请求头
+            for (Entry<String, String> entry : headers.entrySet()) {
+                request.setHeader(entry.getKey(), entry.getValue());
+            }
+        } else {
+            // 请求为空时,设置默认请求头
+            request.setHeader("Connection", "keep-alive");
+            request.setHeader("Accept-Encoding", "gzip, deflate, br");
+            request.setHeader("Accept", "*/*");
+        }
+        request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36");
+    }
+
+    /**
+     * 执行请求,获取响应流
+     *
+     * @param request _请求对象
+     * @return 响应内容
+     */
+    private static InputStream getRespInputStream(HttpUriRequest request, Map<String, String> headers) {
+        // 设置请求头
+        setHeaders(request, headers);
+        // 获取响应对象
+        HttpResponse response = null;
+        try {
+            response = HttpClients.createDefault().execute(request);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+        // 获取Entity对象
+        HttpEntity entity = response.getEntity();
+        // 获取响应信息流
+        InputStream in = null;
+        if (Objects.nonNull(entity)) {
+            try {
+                in = entity.getContent();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return in;
+    }
+
+    /**
+     * 执行请求,获取响应内容
+     *
+     * @param request _请求对象
+     * @return 响应内容
+     */
+    private static String getRespString(HttpUriRequest request, Map<String, String> headers) {
+
+        System.err.println("=================请求对象=====================");
+        System.err.println(JSONObject.toJSONString(request));
+        byte[] bytes = new byte[BYTE_ARRAY_LENGTH];
+        int len = 0;
+        try (InputStream in = getRespInputStream(request, headers);
+             ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
+            if (Objects.isNull(in)) {
+                return "";
+            }
+            while ((len = in.read(bytes)) != -1) {
+                bos.write(bytes, 0, len);
+            }
+            return bos.toString(UTF8);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+}

+ 125 - 0
yami-shop-common/src/main/java/com/yami/shop/common/util/hb/HBR.java

@@ -0,0 +1,125 @@
+package com.yami.shop.common.util.hb;
+
+
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *海博返回
+ * @author fubojin
+ * @time 2025-9-3
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class HBR {
+
+
+    /**
+     *
+     * 结果编码(0-成功,-1-失败)
+     */
+    private String code;
+
+    /**
+     * 是否成功(true : 成功  false: 失败)
+     */
+    private boolean success;
+
+    /**
+     * 失败原因
+     */
+    private String failMsg;
+
+    /**
+     * 返回结果
+     */
+    private String responseJson;
+
+    /**
+     * 构造成功返回(无数据)
+     */
+    public static HBR success() {
+        return HBR.builder()
+                .code(HBResponseEnum.HB_SUCCESS.getCode())
+                .success(Boolean.TRUE)
+                .build();
+    }
+
+    /**
+     * 构造成功返回(JSON字符串数据)
+     * @param responseJson JSON字符串
+     */
+    public static HBR success(String responseJson) {
+        return HBR.builder()
+                .code(HBResponseEnum.HB_SUCCESS.getCode())
+                .success(Boolean.TRUE)
+                .responseJson(responseJson)
+                .build();
+    }
+
+    /**
+     * 构造成功返回(任意对象自动转 JSON)
+     * @param data 任意对象
+     */
+    public static HBR success(Object data) {
+        return HBR.builder()
+                .code(HBResponseEnum.HB_SUCCESS.getCode())
+                .success(Boolean.TRUE)
+                .responseJson(data == null ? null : JSON.toJSONString(data))
+                .build();
+    }
+
+
+    /**
+     * 构造错误返回(默认 code = -1)
+     */
+    public static HBR error() {
+        return HBR.builder()
+                .code(HBResponseEnum.HB_ERROR.getCode())
+                .success(Boolean.FALSE)
+                .failMsg(HBResponseEnum.HB_ERROR.getValue())
+                .build();
+    }
+
+    /**
+     * 构造错误返回(默认 code = -1)
+     * @param errorMsg 错误原因
+     */
+    public static HBR error(String errorMsg) {
+        return HBR.builder()
+                .code(HBResponseEnum.HB_ERROR.getCode())
+                .success(Boolean.FALSE)
+                .failMsg(errorMsg)
+                .build();
+    }
+
+    /**
+     * 构造错误返回(自定义 code)
+     * @param code     错误码
+     * @param errorMsg 错误原因
+     */
+    public static HBR error(String code, String errorMsg) {
+        return HBR.builder()
+                .code(code)
+                .success(Boolean.FALSE)
+                .failMsg(errorMsg)
+                .build();
+    }
+
+    /**
+     * 便捷方法:设置响应对象(自动转 JSON)
+     * @param data 任意对象
+     */
+    public HBR withResponse(Object data) {
+        this.responseJson = data == null ? null : JSON.toJSONString(data);
+        return this;
+    }
+
+}

+ 35 - 0
yami-shop-common/src/main/java/com/yami/shop/common/util/hb/HBResponseEnum.java

@@ -0,0 +1,35 @@
+package com.yami.shop.common.util.hb;
+
+/**
+ * <p>TODO</p>
+ *
+ * @author mr wang
+ * @version 1.0.0
+ * @since 2025-08-26
+ */
+
+public enum HBResponseEnum {
+
+    HB_SUCCESS("0", "操作成功"),
+    HB_ERROR("-1", "网络繁忙");
+
+
+    private final String code;
+
+    private final String value;
+
+    HBResponseEnum(String code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+
+}

+ 76 - 0
yami-shop-common/src/main/java/com/yami/shop/common/util/hb/HBSignUtil.java

@@ -0,0 +1,76 @@
+package com.yami.shop.common.util.hb;
+
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.gather.zswl.common.dto.HBBaseReq;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+import static org.gather.zswl.common.utils.CryptoUtil.md5;
+
+/**
+ * 海博签名工具类
+ *
+ * @author mr wang
+ * @version 1.0.0
+ * @since 2025-08-29
+ */
+@Slf4j
+@Configuration
+public class HBSignUtil {
+    @Getter
+    @Value("${hb.host}")
+    private String hBHost;
+    @Getter
+    @Value("${hb.appId}")
+    private String appId;
+    @Value("${hb.secret}")
+    private String secret;
+
+    /**
+     * 生成海博签名
+     *
+     * @param req 请求对象 {@link HBBaseReq}
+     * @return md5 {@link String}
+     */
+    public <T> String signMd5(HBBaseReq<T> req) {
+        return signMd5(appId, req.getBody(), req.getSignMethod(), req.getTimestamp());
+    }
+
+    /**
+     * 生成海博签名
+     *
+     * @param appId      平台appid
+     * @param body       具体参数
+     * @param signMethod 加密方式,当前平台仅支持md5
+     * @param timestamp  当前时间戳
+     * @return md5 {@link String}
+     */
+    public <T> String signMd5(String appId, T body, String signMethod, Long timestamp) {
+        String builder = secret + "appId" +
+                appId +
+                "body" +
+                 body +
+                "signMethod" +
+                signMethod +
+                "timestamp" +
+                timestamp +
+                secret;
+        log.info("----------------------");
+        log.info(builder);
+        return md5(builder).toUpperCase();
+    }
+
+    /**
+     * 生成海博签名
+     *
+     * @param appId     平台appid
+     * @param body      具体参数
+     * @param timestamp 当前时间戳
+     * @return md5 {@link String}
+     */
+    public <T> String signMd5(String appId, T body, Long timestamp) {
+        return signMd5(appId, body, "md5", timestamp);
+    }
+
+}

+ 77 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/CategoryController.java

@@ -0,0 +1,77 @@
+package com.yami.shop.platform.controller.hb;
+
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.gather.zswl.platform.service.ICategoryService;
+import org.gather.zswl.platform.utils.HBR;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 后台类目(商家类目)管理控制器
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-5
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/category")
+@AllArgsConstructor
+@CrossOrigin
+@Api(tags = "后台类目管理", description = "后台类目管理相关接口")
+public class CategoryController {
+
+    private final ICategoryService categoryService;
+
+    /**
+     * 海博新增后台类目信息-回调
+     *
+     * @param HBRequest 海博后台类目请求参数
+     * @return 后台类目响应
+     */
+    @PostMapping("/add")
+    public HBR addCategory(@RequestBody JSONObject HBRequest) {
+        log.info("海博新增后台类目{}",HBRequest);
+        return categoryService.addHBCategory(HBRequest);
+    }
+    /**
+     * 海博修改后台类目信息-回调
+     *
+     * @param HBRequest 修改海博后台类目请求参数
+     * @return 海博后台类目变更响应
+     */
+    @PostMapping("/update")
+    public HBR updateCategory(@RequestBody JSONObject HBRequest) {
+        log.info("海博变更后台类目{}",HBRequest);
+        return categoryService.addHBCategory(HBRequest);
+    }
+
+    /**
+     * 海博查询后台类目信息
+     *
+     * @return 海博后台类目查询响应
+     */
+    @GetMapping("/selectFrontCategory")
+    public HBR selectFrontCategory() {
+        log.info("海博查询后台类目");
+        categoryService.selectHBCategory();
+        return HBR.success();
+    }
+
+    /**
+     * 海博删除后台类目信息-回调
+     *
+     * @param HBRequest 删除海博后台类目请求参数
+     * @return 海博后台类目删除响应
+     */
+    @PostMapping("/delete")
+    public HBR deleteFrontCategory(@RequestBody JSONObject HBRequest) {
+        log.info("海博删除后台类目{}",HBRequest);
+        categoryService.deleteCategory(HBRequest);
+        return HBR.success();
+    }
+
+
+}

+ 77 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/FrontCategoryController.java

@@ -0,0 +1,77 @@
+package com.yami.shop.platform.controller.hb;
+
+import com.alibaba.fastjson.JSONObject;
+import com.yami.shop.common.util.hb.HBR;
+import com.yami.shop.service.hb.IFrontCategoryService;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 前台类目管理控制器
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-1
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/front")
+@AllArgsConstructor
+@CrossOrigin
+@Api(tags = "前台类目管理", description = "前台类目管理相关接口")
+public class FrontCategoryController {
+
+    private final IFrontCategoryService FrontCategoryService;
+
+    /**
+     * 海博新增前台类目信息-回调
+     *
+     * @param HBRequest 海博前台类目请求参数
+     * @return 前台类目响应
+     */
+    @PostMapping("/add")
+    public HBR addCategory(@RequestBody JSONObject HBRequest) {
+        log.info("海博新增前台类目{}",HBRequest);
+        return FrontCategoryService.addHBFrontCategory(HBRequest);
+    }
+    /**
+     * 海博修改前台类目信息-回调
+     *
+     * @param HBRequest 修改海博前台类目请求参数
+     * @return 海博前台类目变更响应
+     */
+    @PostMapping("/update")
+    public HBR updateCategory(@RequestBody JSONObject HBRequest) {
+        log.info("海博变更前台类目{}",HBRequest);
+        return FrontCategoryService.addHBFrontCategory(HBRequest);
+    }
+
+    /**
+     * 海博查询前台类目信息
+     *
+     * @return 海博前台类目查询响应
+     */
+    @GetMapping("/selectFrontCategory")
+    public HBR selectFrontCategory() {
+        log.info("海博查询前台类目");
+        FrontCategoryService.selectHBFrontCategory();
+        return HBR.success();
+    }
+
+    /**
+     * 海博删除前台类目信息-回调
+     *
+     * @param HBRequest 删除海博前台类目请求参数
+     * @return 海博前台类目删除响应
+     */
+    @PostMapping("/delete")
+    public HBR deleteFrontCategory(@RequestBody JSONObject HBRequest) {
+        log.info("海博删除前台类目{}",HBRequest);
+        FrontCategoryService.deleteFrontCategory(HBRequest);
+        return HBR.success();
+    }
+
+
+}

+ 152 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/GoodsController.java

@@ -0,0 +1,152 @@
+package com.yami.shop.platform.controller.hb;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.shop.bean.model.hb.GoodsSpu;
+import com.yami.shop.common.util.hb.HBR;
+import com.yami.shop.service.hb.IGoodsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 商品控制器
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-5
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/goods")
+@AllArgsConstructor
+@CrossOrigin
+@Api(tags = "商品管理", description = "商品管理相关接口")
+public class GoodsController {
+
+    private final IGoodsService goodsService;
+
+    /**
+     * 海博新增商品信息-回调
+     *
+     * @param HBRequest 海博商品请求参数
+     * @return 商品信息响应
+     */
+    @PostMapping("/add")
+    @ApiOperation(value = "添加商品信息", notes = "海博新增商品信息回调接口")
+    public HBR addGoods(@RequestBody JSONObject HBRequest) {
+        log.info("海博新增商品{}",HBRequest);
+        return goodsService.addHBGoods(HBRequest);
+    }
+    /**
+     * 海博修改商品信息-回调
+     *
+     * @param HBRequest 修改海博商品请求参数
+     * @return 商品响应
+     */
+    @PostMapping("/update")
+    public HBR updateGoods(@RequestBody JSONObject HBRequest) {
+        log.info("海博变更商品{}",HBRequest);
+        return goodsService.updateGoods(HBRequest);
+    }
+
+    /**
+     * 海博商品可售状态变更信息-回调
+     *
+     * @param HBRequest 修改海博商品可售状态变更请求参数
+     * @return 商品可售状态变更响应
+     */
+    @PostMapping("/updateStatus")
+    public HBR updateGoodsStatus(@RequestBody JSONObject HBRequest) {
+        log.info("海博商品可售状态变更{}",HBRequest);
+        return goodsService.updateGoodsStatus(HBRequest);
+    }
+    /**
+     * 海博商品价格变更信息-回调
+     *
+     * @param HBRequest 修改海博商品价格变更请求参数
+     * @return 商品价格变更响应
+     */
+    @PostMapping("/updateGoodsPrice")
+    public HBR updateGoodsPrice(@RequestBody JSONObject HBRequest) {
+        log.info("海博商品价格变更{}",HBRequest);
+        return goodsService.updateGoodsPrice(HBRequest);
+    }
+    /**
+     * 海博线上可售库存变更-回调
+     *
+     * @param HBRequest 海博商品库存请求参数
+     * @return 商品响应
+     */
+    @PostMapping("/updateGoodsStock")
+    public HBR updateGoodsStock(@RequestBody JSONObject HBRequest) {
+        log.info("海博线上可售库存变更{}",HBRequest);
+        return HBR.success(goodsService.updateGoodsStock(HBRequest));
+    }
+
+    /**
+     * 海博删除商品信息-回调
+     *
+     * @param HBRequest 修改海博商品请求参数
+     * @return 商品响应
+     */
+    @PostMapping("/delete")
+    public HBR deleteGoods(@RequestBody JSONObject HBRequest) {
+        log.info("海博删除商品{}",HBRequest);
+        goodsService.deleteGoods(HBRequest);
+        return HBR.success();
+    }
+
+    /**
+     * 海博商品信息(商品主档信息查询接口 - 对应的是海博商品里面“线上商品管理”)
+     *
+     * @return 商品响应
+     */
+    @GetMapping("/selectGoodsInfo")
+    public HBR selectGoodsInfo(String outSkuId) {
+        return HBR.success(goodsService.selectHBGoodsInfo(outSkuId));
+    }
+
+
+    /**
+     * 商品-门店品售卖状态查询接口
+     *
+     * @return 商品响应
+     */
+    @GetMapping("/getSelfSkuStatus")
+    public HBR getSelfSkuStatus() {
+        return HBR.success(goodsService.getSelfSkuStatus());
+    }
+
+
+/**
+ * 商品分页查询接口
+ * @param pageNum 当前页码,默认为1
+ * @param pageSize 每页数量,默认为10
+ * @param goods 商品查询条件对象(非必须)
+ * @return 分页数据
+ */
+@GetMapping("/selectPage")
+public ResponseEntity<Page<GoodsSpu>> selectGoodsPage(
+        @RequestParam(defaultValue = "1") Integer pageNum,
+        @RequestParam(defaultValue = "10") Integer pageSize,
+        @RequestBody(required = false) GoodsSpu goods) {
+
+    // 参数校验
+    if (pageNum < 1) {
+        pageNum = 1;
+    }
+    if (pageSize < 1 || pageSize > 100) {
+        pageSize = 10;
+    }
+    // 调用Service层获取分页数据
+    Page<GoodsSpu> page = goodsService.selectGoodsPage(pageNum, pageSize, goods);
+    // 返回统一格式的响应
+    return ResponseEntity.ok(page);
+}
+
+
+}

+ 75 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/OrderController.java

@@ -0,0 +1,75 @@
+package com.yami.shop.platform.controller.hb;
+
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.gather.zswl.platform.utils.HBR;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 订单控制器
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-1
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/order")
+@AllArgsConstructor
+@CrossOrigin
+@Api(tags = "订单管理", description = "订单管理相关接口")
+public class OrderController {
+
+
+    /**
+     * 海博新增订单信息-回调
+     *
+     * @param HBRequest 海博订单请求参数
+     * @return 前台类目响应
+     */
+    @PostMapping("/add")
+    public HBR addGoods(@RequestBody JSONObject HBRequest) {
+        log.info("海博新增订单{}",HBRequest);
+        return null;
+    }
+    /**
+     * 海博修改商品信息-回调
+     *
+     * @param HBRequest 修改海博商品请求参数
+     * @return 商品响应
+     */
+    @PostMapping("/update")
+    public HBR updateGoods(@RequestBody JSONObject HBRequest) {
+        log.info("海博变更商品{}",HBRequest);
+        return null;
+    }
+
+
+    /**
+     * 海博订单商品信息-回调
+     *
+     * @param HBRequest 海博修改订单请求参数
+     * @return 商品响应
+     */
+    @PostMapping("/delete")
+    public HBR deleteGoods(@RequestBody JSONObject HBRequest) {
+        log.info("海博变更订单{}",HBRequest);
+        return null;
+    }
+
+    /**
+     * 海博订单-查询订单详情-回调
+     *
+     * @param HBRequest 海博修改订单请求参数
+     * @return 商品响应
+     */
+    @PostMapping("/info")
+    public HBR deleteGoodsInfo(@RequestBody JSONObject HBRequest) {
+        log.info("海博变更订单{}",HBRequest);
+        return null;
+    }
+
+
+}

+ 41 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/ResourceController.java

@@ -0,0 +1,41 @@
+package com.yami.shop.platform.controller.hb;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.gather.zswl.common.R;
+import org.gather.zswl.common.dto.menu.MenuResourceDTO;
+import org.gather.zswl.core.user.IUserSignService;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 资源管理
+ *
+ * @author mr wang
+ * @version 1.0.0
+ * @since 2025-09-08
+ */
+@Slf4j
+@RestController
+@AllArgsConstructor
+@RequestMapping("/api/v1/res")
+@CrossOrigin(origins = "*")
+@Api(tags = "资源管理")
+public class ResourceController {
+    private final IUserSignService userService;
+
+    /**
+     * 获取后台管理系统的菜单
+     */
+    @GetMapping("/menus")
+    @ApiOperation(value = "系统的菜单", notes = "用户登录之后,获取后台管理系统的菜单")
+    public R<List<MenuResourceDTO>> doGetUserMenuResources() {
+        return R.SUCCESS(userService.getUserMenuResources());
+    }
+}

+ 148 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/StoreManagementController.java

@@ -0,0 +1,148 @@
+package com.yami.shop.platform.controller.hb;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.gather.zswl.core.entity.StoreManagement;
+import org.gather.zswl.platform.service.IStoreManagementService;
+import org.gather.zswl.platform.utils.HBR;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 门店管理控制器
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-1
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/store")
+@AllArgsConstructor
+@CrossOrigin
+public class StoreManagementController {
+
+    private final IStoreManagementService storeManagementService;
+
+
+    /**
+     * 海博修改门店信息-回调
+     *
+     * @param HBRequest 门店变更请求参数
+     * @return 门店变更响应
+     */
+    @PostMapping("/update")
+    public HBR updateRegisterStore(@RequestBody JSONObject HBRequest) {
+        log.info("海博变更门店{}",HBRequest);
+        return HBR.success(storeManagementService.updateRegisterStore(HBRequest));
+    }
+
+
+    /**
+     * 门店配送费模板变更通知
+     *
+     * @param HBRequest 门店配送费模板变更通知内容
+     * @return 模板变更通知响应
+     */
+    @PostMapping("/feeTemplate")
+    public HBR updateStoreDeliveryFeeTemplate(@RequestBody JSONObject HBRequest) {
+        log.info("海博门店配送费模板变更通知{}",HBRequest);
+        return HBR.success(storeManagementService.updateStoreDeliveryFeeTemplate(HBRequest));
+    }
+
+
+
+    /**
+     * 查询所有门店
+     *
+     * @return 门店列表
+     */
+    @GetMapping("/all")
+    public List<StoreManagement> getAllStores() {
+        log.info("查询所有门店");
+        return storeManagementService.findAllStores();
+    }
+
+    /**
+     * 更新门店信息
+     *
+     * @param store 门店信息
+     * @return 更新后的门店信息
+     */
+    @PutMapping("/updateStore")
+    public StoreManagement updateStore(@RequestBody StoreManagement store) {
+        log.info("更新门店信息,门店ID:{}", store.getId());
+        return storeManagementService.updateStore(store);
+    }
+
+    /**
+     * 删除门店
+     *
+     * @param storeId 门店ID
+     * @return 删除结果
+     */
+    @DeleteMapping("/{storeId}")
+    public boolean deleteStore(@PathVariable Long storeId) {
+        log.info("删除门店,门店ID:{}", storeId);
+        return storeManagementService.deleteStore(storeId);
+    }
+
+    /**
+     * 启用门店
+     *
+     * @param storeId 门店ID
+     * @return 启用结果
+     */
+    @PutMapping("/{storeId}/enable")
+    public boolean enableStore(@PathVariable Long storeId) {
+        log.info("启用门店,门店ID:{}", storeId);
+        return storeManagementService.enableStore(storeId);
+    }
+
+    /**
+     * 禁用门店
+     *
+     * @param storeId 门店ID
+     * @return 禁用结果
+     */
+    @PutMapping("/{storeId}/disable")
+    public boolean disableStore(@PathVariable Long storeId) {
+        log.info("禁用门店,门店ID:{}", storeId);
+        return storeManagementService.disableStore(storeId);
+    }
+
+    /**
+     * 获取客户端真实IP地址
+     *
+     * @param request HTTP请求对象
+     * @return 客户端IP地址
+     */
+    private String getClientIp(HttpServletRequest request) {
+        String ip = request.getHeader("X-Forwarded-For");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+
+        // 如果是多个IP,取第一个
+        if (ip != null && ip.contains(",")) {
+            ip = ip.split(",")[0].trim();
+        }
+
+        return ip;
+    }
+}

+ 76 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/dto/BaseMessage.java

@@ -0,0 +1,76 @@
+package com.yami.shop.platform.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 基础消息对象
+ *
+ * @author mr wang
+ * @version 1.0.0
+ * @since 2025-09-01
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class BaseMessage<T> implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 消息ID
+     */
+    private String messageId;
+
+    /**
+     * 消息类型
+     */
+    private String messageType;
+
+    /**
+     * 业务键
+     */
+    private String businessKey;
+
+    /**
+     * 时间戳
+     */
+    private LocalDateTime timestamp;
+
+    /**
+     * 来源系统
+     */
+    private String sourceSystem;
+
+    /**
+     * 消息数据
+     */
+    private T data;
+
+    /**
+     * 创建基础消息
+     *
+     * @param messageType 消息类型
+     * @param businessKey 业务键
+     * @param data        消息数据
+     * @param <T>         数据类型
+     * @return 基础消息对象
+     */
+    public static <T> BaseMessage<T> create(String messageType, String businessKey, T data) {
+        return BaseMessage.<T>builder()
+                .messageId(java.util.UUID.randomUUID().toString())
+                .messageType(messageType)
+                .businessKey(businessKey)
+                .timestamp(LocalDateTime.now())
+                .sourceSystem("zs-core-service")
+                .data(data)
+                .build();
+    }
+}

+ 37 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/dto/HBBaseReq.java

@@ -0,0 +1,37 @@
+package com.yami.shop.platform.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import lombok.*;
+
+/**
+ * <p>TODO</p>
+ *
+ * @author mr wang
+ * @version 1.0.0
+ * @since 2025-08-29
+ */
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel(description = "请求海博门店基础信息的实体")
+public class HBBaseReq<T> {
+    private String appId;
+    private String sign;
+    private String taskType;
+    @Builder.Default
+    private String signMethod = "md5";
+    @Builder.Default
+    private Long timestamp = System.currentTimeMillis();
+    private T body;
+    // 添加静态工厂方法
+    public static <T> HBBaseReq<T> create() {
+        HBBaseReq<T> req = new HBBaseReq<>();
+        req.setTimestamp(System.currentTimeMillis());
+        req.setSignMethod("md5");
+        return req;
+    }
+}

+ 24 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/dto/HBStoreBaseInfoReq.java

@@ -0,0 +1,24 @@
+package com.yami.shop.platform.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import lombok.*;
+
+/**
+ * 请求海博门店基础信息的实体
+ *
+ * @author mr wang
+ * @version 1.0.0
+ * @since 2025-08-29
+ */
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel(description = "请求海博门店基础信息的实体")
+public class HBStoreBaseInfoReq {
+    private String outStationNo;
+    private Long stationId;
+}

+ 51 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/dto/OrderItemMessage.java

@@ -0,0 +1,51 @@
+package com.yami.shop.platform.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 订单商品信息
+ *
+ * @author mr wang
+ * @version 1.0.0
+ * @since 2025-09-01
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class OrderItemMessage implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
+    /**
+     * 商品名称
+     */
+    private String productName;
+
+    /**
+     * 商品数量
+     */
+    private Integer quantity;
+
+    /**
+     * 商品单价
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 商品总价
+     */
+    private BigDecimal totalPrice;
+}

+ 103 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/dto/OrderMessage.java

@@ -0,0 +1,103 @@
+package com.yami.shop.platform.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 订单消息
+ *
+ * @author mr wang
+ * @version 1.0.0
+ * @since 2025-09-01
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class OrderMessage implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 订单ID
+     */
+    private Long orderId;
+
+    /**
+     * 订单号
+     */
+    private String orderNo;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 订单状态
+     */
+    private String orderStatus;
+
+    /**
+     * 订单金额
+     */
+    private BigDecimal orderAmount;
+
+    /**
+     * 支付金额
+     */
+    private BigDecimal payAmount;
+
+    /**
+     * 支付方式
+     */
+    private String payMethod;
+
+    /**
+     * 支付状态
+     */
+    private String payStatus;
+
+    /**
+     * 操作类型
+     */
+    private String operationType;
+
+    /**
+     * 操作时间
+     */
+    private LocalDateTime operationTime;
+
+    /**
+     * 操作人
+     */
+    private String operator;
+
+    /**
+     * 操作IP
+     */
+    private String operationIp;
+
+    /**
+     * 订单商品列表
+     */
+    private List<OrderItemMessage> orderItems;
+
+    /**
+     * 扩展信息
+     */
+    private String extInfo;
+}

+ 117 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/dto/StoreMessage.java

@@ -0,0 +1,117 @@
+package com.yami.shop.platform.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 门店消息
+ *
+ * @author mr wang
+ * @version 1.0.0
+ * @since 2025-09-01
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class StoreMessage implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+
+    /**
+     * 门店编码
+     */
+    private String storeCode;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    /**
+     * 门店地址
+     */
+    private String address;
+
+    /**
+     * 详细地址
+     */
+    private String detailAddress;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 门店类型
+     */
+    private String storeType;
+
+    /**
+     * 营业状态
+     */
+    private String businessStatus;
+
+    /**
+     * 营业时间
+     */
+    private String businessHours;
+
+    /**
+     * 门店面积
+     */
+    private BigDecimal area;
+
+    /**
+     * 经度
+     */
+    private BigDecimal longitude;
+
+    /**
+     * 纬度
+     */
+    private BigDecimal latitude;
+
+    /**
+     * 店长姓名
+     */
+    private String managerName;
+
+    /**
+     * 店长电话
+     */
+    private String managerPhone;
+
+    /**
+     * 操作类型
+     */
+    private String operationType;
+
+    /**
+     * 操作时间
+     */
+    private LocalDateTime operationTime;
+
+    /**
+     * 操作人
+     */
+    private String operator;
+
+    /**
+     * 操作IP
+     */
+    private String operationIp;
+}

+ 33 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/dto/StoreRegister.java

@@ -0,0 +1,33 @@
+package com.yami.shop.platform.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 门店管理DTO
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-1
+ */
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel(description = "门店管理")
+public class StoreRegister{
+
+    @ApiModelProperty(value = "门店ID", example = "1")
+    private Long stationId;
+
+    @NotBlank(message = "门店编码不能为空")
+    @ApiModelProperty(value = "门店编码", required = true, example = "ST001")
+    private String outStationNo;
+
+}

+ 34 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/ICategoryService.java

@@ -0,0 +1,34 @@
+package com.yami.shop.service.hb;
+
+import com.alibaba.fastjson.JSONObject;
+import org.gather.zswl.platform.utils.HBR;
+
+/**
+ * 后台类目管理服务接口
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-5
+ */
+public interface ICategoryService {
+
+
+    /**
+     * 后台分类新增或者修改
+     *
+     * @param hbRequest 后台分类请求
+     * @return 后台分类响应
+     */
+    HBR addHBCategory(JSONObject hbRequest);
+
+    /**
+     * 获取海博后台分类基础信息
+     */
+    void selectHBCategory();
+
+    /**
+     * 删除海博后台分类
+     * @param hbRequest
+     */
+    void deleteCategory(JSONObject hbRequest);
+}

+ 34 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/IFrontCategoryService.java

@@ -0,0 +1,34 @@
+package com.yami.shop.service.hb;
+
+import com.alibaba.fastjson.JSONObject;
+import com.yami.shop.common.util.hb.HBR;
+
+/**
+ * 前台类目管理服务接口
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-4
+ */
+public interface IFrontCategoryService {
+
+
+    /**
+     * 前台分类新增或者修改
+     *
+     * @param hbRequest 前台分类请求
+     * @return 前台分类响应
+     */
+    HBR addHBFrontCategory(JSONObject hbRequest);
+
+    /**
+     * 获取海博前台分类基础信息
+     */
+    void selectHBFrontCategory();
+
+    /**
+     * 删除海博前台分类
+     * @param hbRequest
+     */
+    void deleteFrontCategory(JSONObject hbRequest);
+}

+ 71 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/IGoodsService.java

@@ -0,0 +1,71 @@
+package com.yami.shop.service.hb;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.shop.bean.model.hb.GoodsSpu;
+import com.yami.shop.common.util.hb.HBR;
+
+/**
+ * 商品信息接口
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-5
+ */
+public interface IGoodsService {
+
+
+    /**
+     * 商品信息新增或者修改
+     *
+     * @param hbRequest 商品信息请求
+     * @return 商品信息响应
+     */
+    HBR addHBGoods(JSONObject hbRequest);
+    /**
+     * 修改商品信息
+     * @param hbRequest 海博传入参数
+     */
+    HBR updateGoods(JSONObject hbRequest);
+    /**
+     * 修改商品状态信息
+     * @param hbRequest 海博传入参数
+     */
+    HBR updateGoodsStatus(JSONObject hbRequest);
+
+    /**
+     * 价格变更
+     * @param hbRequest 海博传入参数
+     * @return 海博请求需要参数
+     */
+    HBR updateGoodsPrice(JSONObject hbRequest);
+
+    /**
+     * 修改商品库存信息
+     * @param hbRequest 海博传入参数
+     */
+    HBR updateGoodsStock(JSONObject hbRequest);
+    /**
+     * 获取海博商品基础信息
+     */
+    String selectHBGoodsInfo(String outSkuId);
+
+    /**
+     * 海博删除商品信息
+     * @param hbRequest 海博传入参数
+     */
+    void deleteGoods(JSONObject hbRequest);
+
+    /**
+     * 商品-门店品售卖状态查询接口
+     * @return 门店品售卖状态信息
+     */
+    String getSelfSkuStatus();
+
+
+    /**
+     * 分页获取商品信息
+     * @return 商品信息
+     */
+    Page<GoodsSpu> selectGoodsPage(Integer pageNum, Integer pageSize, GoodsSpu goods);
+}

+ 92 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/IStoreManagementService.java

@@ -0,0 +1,92 @@
+package com.yami.shop.service.hb;
+
+import com.alibaba.fastjson.JSONObject;
+import org.gather.zswl.core.entity.StoreManagement;
+import org.gather.zswl.platform.dto.StoreRegister;
+import org.gather.zswl.platform.utils.HBR;
+
+import java.util.List;
+
+/**
+ * 门店管理服务接口
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-1
+ */
+public interface IStoreManagementService {
+
+    /**
+     * 获取海博门店基础信息
+     */
+    void doGetStation();
+
+    /**
+     * 查询配送费模板查询接口
+     */
+    void shippingTemplate();
+
+    /**
+     * 门店注册
+     *
+     * @param registerRequest 门店注册请求
+     * @return 门店注册响应
+     */
+    HBR registerStore(JSONObject registerRequest);
+
+    /**
+     * 门店变更
+     *
+     * @param registerRequest 门店变更请求
+     * @return 门店变更响应
+     */
+    HBR updateRegisterStore(JSONObject registerRequest);
+
+
+    /**
+     * 查询所有门店
+     *
+     * @return 门店列表
+     */
+    List<StoreManagement> findAllStores();
+
+    /**
+     * 更新门店信息
+     *
+     * @param store 门店信息
+     * @return 更新后的门店信息
+     */
+    StoreManagement updateStore(StoreManagement store);
+
+    /**
+     * 删除门店(逻辑删除)
+     *
+     * @param storeId 门店ID
+     * @return true表示删除成功,false表示删除失败
+     */
+    boolean deleteStore(Long storeId);
+
+    /**
+     * 启用门店
+     *
+     * @param storeId 门店ID
+     * @return true表示启用成功,false表示启用失败
+     */
+    boolean enableStore(Long storeId);
+
+    /**
+     * 禁用门店
+     *
+     * @param storeId 门店ID
+     * @return true表示禁用成功,false表示禁用失败
+     */
+    boolean disableStore(Long storeId);
+
+    /**
+     * 门店配送费模板变更通知
+     *
+     * @param registerRequest 门店配送费模板变更通知内容
+     * @return 模板变更通知响应
+     */
+    StoreRegister updateStoreDeliveryFeeTemplate(JSONObject registerRequest);
+}

+ 84 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/CategoryService.java

@@ -0,0 +1,84 @@
+package com.yami.shop.service.hb.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.yami.shop.bean.model.hb.StoreManagement;
+import com.yami.shop.common.util.hb.HBR;
+import com.yami.shop.common.util.hb.HBSignUtil;
+import com.yami.shop.service.hb.ICategoryService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+
+/**
+ * 门店管理服务实现
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-5
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+@Transactional(readOnly = true)
+public class CategoryService implements ICategoryService {
+    private final HBSignUtil hbSignUtil;
+
+
+    @Override
+    @Transactional
+    public HBR addHBCategory(JSONObject hbRequest) {
+        try {
+            String bodyStr = hbRequest.getString("body");
+            log.info("开始后台分类,body:{}", bodyStr);
+            JSONObject bodyJson = JSON.parseObject(bodyStr); // 使用Fastjson的解析方法
+            String outStationNo = bodyJson.getString("outStationNo");
+
+            // 2. 构建门店实体
+            StoreManagement store = StoreManagement.builder()
+                    .outStationNo(outStationNo)
+                    .stationId(bodyJson.getString("stationId"))
+                    .createBy("hb")
+                    .updateBy("hb")
+                    .build();
+
+            // 设置默认值
+            store.setDefaultValues();
+
+            // 3. 保存门店信息
+            log.info("后台分类信息{}", store);
+
+            log.info("后台分类成功,门店ID:{}", store.getId());
+
+            System.out.println("================");
+            // 4. 构建响应
+            return HBR.success();
+
+        } catch (Exception e) {
+            log.error("后台分类失败:{}", e.getMessage(), e);
+            return HBR.error("未知异常");
+        }
+    }
+
+    @Override
+    public void selectHBCategory() {
+        HBBaseReq<Object> build = HBBaseReq.create();
+        build.setAppId(hbSignUtil.getAppId());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("code", 0);
+        jsonObject.put("dataType", 0);
+        build.setBody(JSON.toJSONString(jsonObject));
+        build.setSign(hbSignUtil.signMd5(build));
+        String post = post(hbSignUtil.getHBHost()+"/api/product/venderCategory/getCategory", build);
+        log.info("post 请求参数:{}", JSON.toJSONString(build));
+        log.info("post 结果:{}",  post);
+    }
+
+    @Override
+    public void deleteCategory(JSONObject hbRequest) {
+        String bodyStr = hbRequest.getString("body");
+        log.info("开始后台分类,body:{}", bodyStr);
+    }
+}

+ 86 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/FrontCategoryService.java

@@ -0,0 +1,86 @@
+package com.yami.shop.service.hb.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.yami.shop.bean.model.hb.StoreManagement;
+import com.yami.shop.common.util.hb.HBR;
+import com.yami.shop.common.util.hb.HBSignUtil;
+import com.yami.shop.service.hb.IFrontCategoryService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+
+/**
+ * 门店管理服务实现
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-1
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+@Transactional(readOnly = true)
+public class FrontCategoryService implements IFrontCategoryService {
+    private final HBSignUtil hbSignUtil;
+
+
+    @Override
+    @Transactional
+    public HBR addHBFrontCategory(JSONObject hbRequest) {
+        try {
+            String bodyStr = hbRequest.getString("body");
+            log.info("开始前台分类,body:{}", bodyStr);
+            JSONObject bodyJson = JSON.parseObject(bodyStr); // 使用Fastjson的解析方法
+            String outStationNo = bodyJson.getString("outStationNo");
+
+            // 2. 构建门店实体
+            StoreManagement store = StoreManagement.builder()
+                    .outStationNo(outStationNo)
+                    .stationId(bodyJson.getString("stationId"))
+                    .createBy("hb")
+                    .updateBy("hb")
+                    .build();
+
+            // 设置默认值
+            store.setDefaultValues();
+
+            // 3. 保存门店信息
+            log.info("前台分类信息{}", store);
+
+            log.info("前台分类成功,门店ID:{}", store.getId());
+
+
+            selectHBFrontCategory();
+
+            System.out.println("================");
+            // 4. 构建响应
+            return HBR.success();
+
+        } catch (Exception e) {
+            log.error("前台分类失败:{}", e.getMessage(), e);
+            return HBR.error("未知异常");
+        }
+    }
+
+    @Override
+    public void selectHBFrontCategory() {
+        HBBaseReq<Object> build = HBBaseReq.create();
+        build.setAppId(hbSignUtil.getAppId());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("flag", 0);
+        build.setBody(JSON.toJSONString(jsonObject));
+        build.setSign(hbSignUtil.signMd5(build));
+        String post = post(hbSignUtil.getHBHost()+"/api/product/frontCategory/getCategory", build);
+        log.info("post 请求参数:{}", JSON.toJSONString(build));
+        log.info("post 结果:{}",  post);
+    }
+
+    @Override
+    public void deleteFrontCategory(JSONObject hbRequest) {
+        String bodyStr = hbRequest.getString("body");
+        log.info("开始前台分类,body:{}", bodyStr);
+    }
+}

+ 355 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/GoodsService.java

@@ -0,0 +1,355 @@
+package com.yami.shop.service.hb.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.shop.bean.model.hb.GoodsSku;
+import com.yami.shop.bean.model.hb.GoodsSpu;
+import com.yami.shop.common.util.hb.HBR;
+import com.yami.shop.common.util.hb.HBSignUtil;
+import com.yami.shop.service.hb.IGoodsService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * 商品信息管理实现
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-5
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+@Transactional(readOnly = true)
+public class GoodsService implements IGoodsService {
+    private final HBSignUtil hbSignUtil;
+    private final GoodsSpuDao goodsSpuDao;
+    private final GoodsSkuDao goodsSkuDao;
+
+    @Override
+    @Transactional
+    public HBR addHBGoods(JSONObject hbRequest) {
+        try {
+            String bodyStr = hbRequest.getString("body");
+            log.info("商品信息,body:{}", bodyStr);
+            JSONObject bodyJson = JSON.parseObject(bodyStr);
+            JSONArray productList = bodyJson.getJSONArray("productList");
+            List<GoodsSpu> spuList = new ArrayList<>();
+            List<GoodsSku> skuList = new ArrayList<>();
+
+            for (Object product : productList) {
+                JSONObject jsonObject = JSON.parseObject(product.toString());
+                String outSkuId = jsonObject.getString("outSkuId");
+                String goodsInfoStr = selectHBGoodsInfo(outSkuId);
+                JSONObject goodsInfoJson = JSON.parseObject(goodsInfoStr);
+
+                // 2. 逐层解析获取productHostInfoDTOS数组
+                JSONObject result = goodsInfoJson.getJSONObject("result");
+                JSONObject innerResult = result.getJSONObject("result");
+                JSONArray productHostInfoDTOS = innerResult.getJSONArray("productHostInfoDTOS");
+
+
+                // 3. 遍历获取每个商品信息
+                for (int i = 0; i < productHostInfoDTOS.size(); i++) {
+                    JSONObject productInfo = productHostInfoDTOS.getJSONObject(i);
+
+                    // 创建并填充GoodsSpu对象
+                    GoodsSpu goodsSpu = createGoodsSpuFromProductInfo(productInfo);
+                    // 创建并填充GoodsSku对象
+                    GoodsSku goodsSku = createGoodsSkuFromProductInfo(productInfo);
+                    goodsSku.setSpuId(goodsSpu.getSpuId()); // 设置关联关系
+
+
+                    //添加到数据库
+                    goodsSpuDao.insert(goodsSpu);
+                    goodsSkuDao.insert(goodsSku);
+
+                    spuList.add(goodsSpu);
+                    skuList.add(goodsSku);
+
+                    log.info("SPU创建成功: spuId={}, spuName={}", goodsSpu.getSpuId(), goodsSpu.getSpuName());
+                    log.info("SKU创建成功: skuId={}, skuName={}", goodsSku.getSkuId(), goodsSku.getSkuName());
+                }
+            }
+            // 这里可以保存到数据库
+            // goodsSpuService.saveBatch(spuList);
+            // goodsSkuService.saveBatch(skuList);
+
+            return HBR.success("商品信息处理成功,共处理 " + spuList.size() + " 个SPU和SKU");
+
+        } catch (Exception e) {
+            log.error("处理商品信息失败:{}", e.getMessage(), e);
+            return HBR.error("处理商品信息失败: " + e.getMessage());
+        }
+    }
+
+    @Override
+    public HBR updateGoods(JSONObject hbRequest) {
+        try {
+            String bodyStr = hbRequest.getString("body");
+            log.info("商品,body:{}", bodyStr);
+            JSONObject bodyJson = JSON.parseObject(bodyStr); // 使用Fastjson的解析方法
+            String outStationNo = bodyJson.getString("outStationNo");
+        } catch (Exception e) {
+            log.error("商品失败:{}", e.getMessage(), e);
+            return HBR.error("未知异常");
+
+        }
+        return HBR.success();
+    }
+
+    @Override
+    public HBR updateGoodsStatus(JSONObject hbRequest) {
+        try {
+            String bodyStr = hbRequest.getString("body");
+            log.info("商品,body:{}", bodyStr);
+            JSONObject bodyJson = JSON.parseObject(bodyStr); // 使用Fastjson的解析方法
+            String outStationNo = bodyJson.getString("outStationNo");
+        } catch (Exception e) {
+            log.error("商品失败:{}", e.getMessage(), e);
+            return HBR.error("未知异常");
+
+        }
+        return HBR.success();
+    }
+
+    @Override
+    public HBR updateGoodsPrice(JSONObject hbRequest) {
+        try {
+            String bodyStr = hbRequest.getString("body");
+            log.info("商品,body:{}", bodyStr);
+            JSONObject bodyJson = JSON.parseObject(bodyStr);
+            JSONArray requestList = bodyJson.getJSONArray("requestList");
+            for (Object request : requestList) {
+                JSONObject jsonObject = JSON.parseObject((String) request);
+                Long skuId = jsonObject.getLong("skuId");
+
+            }
+        } catch (Exception e) {
+            log.error("商品失败:{}", e.getMessage(), e);
+            return HBR.error("未知异常");
+
+        }
+        return HBR.success();
+    }
+
+    @Override
+    public HBR updateGoodsStock(JSONObject hbRequest) {
+        try {
+            String bodyStr = hbRequest.getString("body");
+            log.info("商品库存变动,body:{}", bodyStr);
+            JSONObject bodyJson = JSON.parseObject(bodyStr); // 使用Fastjson的解析方法
+            String outStationNo = bodyJson.getString("outStationNo");
+        } catch (Exception e) {
+            log.error("商品失败:{}", e.getMessage(), e);
+            return HBR.error("未知异常");
+
+        }
+        return HBR.success();
+    }
+
+    @Override
+    public void deleteGoods(JSONObject hbRequest) {
+        String bodyStr = hbRequest.getString("body");
+        log.info("商品删除,body:{}", bodyStr);
+    }
+
+    @Override
+    public String selectHBGoodsInfo(String outSkuId) {
+
+        HBBaseReq<Object> build = HBBaseReq.create();
+        build.setAppId(hbSignUtil.getAppId());
+
+        JSONObject skuItem = new JSONObject();
+//        skuItem.put("skuId", "1328633");      // 海博商品编码
+        skuItem.put("outSkuId", outSkuId);    // 商家商品编码
+        // 2. 创建商品列表并添加SKU对象
+        List<JSONObject> productList = new ArrayList<>();
+        productList.add(skuItem);
+        // 3. 构建外层请求体
+        JSONObject requestBody = new JSONObject();
+        requestBody.put("productList", productList);
+        // 4. 将整个JSON对象序列化为字符串并设置
+        build.setBody(JSON.toJSONString(requestBody));
+
+        build.setSign(hbSignUtil.signMd5(build));
+        log.info("post 商品查询请求参数:{}", JSON.toJSONString(build));
+        String post = post(hbSignUtil.getHBHost() + "/api/product/getSku", build);
+        log.info("post 商品查询结果:{}", post);
+        return post;
+    }
+
+
+    @Override
+    public String getSelfSkuStatus() {
+        HBBaseReq<Object> build = HBBaseReq.create();
+        build.setAppId(hbSignUtil.getAppId());
+        JSONObject jsonObject = new JSONObject();
+        List<JSONObject> onlineProductDTO = new ArrayList();
+        jsonObject.put("skuId", "0");//海博商品编码
+        jsonObject.put("stationId", "0");//海博门店编码
+//        jsonObject.put("outStationNo", "0");//商家门店编码
+//        jsonObject.put("outSkuId", "0");//商家商品编码
+        onlineProductDTO.add(jsonObject);
+        build.setBody(JSON.toJSONString(onlineProductDTO));
+        build.setSign(hbSignUtil.signMd5(build));
+        String post = post(hbSignUtil.getHBHost() + "/api/productStation/getSelfSkuStatus", build);
+        log.info("post 商品查询请求参数:{}", JSON.toJSONString(build));
+        log.info("post 商品查询结果:{}", post);
+        return post;
+    }
+
+    @Override
+    public Page<GoodsSpu> selectGoodsPage(Integer pageNum, Integer pageSize,GoodsSpu goods) {
+        // 1. 构建分页对象
+        Page<GoodsSpu> page = new Page<>(pageNum, pageSize);
+
+        // 2. 构建查询条件
+        LambdaQueryWrapper<GoodsSpu> queryWrapper = new LambdaQueryWrapper<>();
+
+        if (goods != null) {
+            queryWrapper.like(StringUtils.isNotBlank(goods.getSpuName()),
+                    GoodsSpu::getSpuName, goods.getSpuName());
+            queryWrapper.eq(goods.getCategoryId() != null,
+                    GoodsSpu::getCategoryId, goods.getCategoryId());
+            queryWrapper.eq(goods.getBrandId() != null,
+                    GoodsSpu::getBrandId, goods.getBrandId());
+            queryWrapper.eq(goods.getStatus() != null,
+                    GoodsSpu::getStatus, goods.getStatus());
+            queryWrapper.eq(goods.getMerchantId() != null,
+                    GoodsSpu::getMerchantId, goods.getMerchantId());
+        }
+
+        // 3. 添加排序
+        queryWrapper.orderByDesc(GoodsSpu::getCreateTime);
+
+        // 4. 执行分页查询
+        Page<GoodsSpu> goodsSpuPage = goodsSpuDao.selectPage(page, queryWrapper);
+        List<GoodsSpu> records = goodsSpuPage.getRecords();
+        for (GoodsSpu record : records) {
+
+            LambdaQueryWrapper<GoodsSku> skuQueryWrapper = new LambdaQueryWrapper<>();
+            skuQueryWrapper.like(GoodsSku::getSpuId, record.getSpuId());
+
+            // 3. 添加排序
+            skuQueryWrapper.orderByDesc(GoodsSku::getCreateTime);
+            record.setGoodsSkuList(goodsSkuDao.selectList(skuQueryWrapper));
+        }
+        return goodsSpuPage;
+    }
+
+    /**
+     * 从productInfo创建GoodsSpu对象
+     */
+    private GoodsSpu createGoodsSpuFromProductInfo(JSONObject productInfo) {
+        GoodsSpu goodsSpu = new GoodsSpu();
+
+        // 设置默认值
+        goodsSpu.setDefaultValues();
+        // 直接映射字段
+        goodsSpu.setSpuId(productInfo.getLong("spuId"));
+        goodsSpu.setSpuName(productInfo.getString("spuName"));
+        goodsSpu.setDescription(productInfo.getString("sellPoint"));
+
+        // 需要转换或默认值的字段
+        goodsSpu.setMerchantId(1L); // 默认商家ID,根据实际情况修改
+        goodsSpu.setCategoryId(convertCategoryCodeToId(productInfo.getString("frontCategoryCode"))); // 分类转换
+        goodsSpu.setBrandId(convertBrandToId(productInfo.getString("brandName"))); // 品牌转换
+
+        // 其他可能需要处理的字段
+        if (productInfo.containsKey("desc")) {
+//            goodsSpu.setDesc(productInfo.getString("desc"));
+        }
+
+        return goodsSpu;
+    }
+
+    /**
+     * 从productInfo创建GoodsSku对象
+     */
+    private GoodsSku createGoodsSkuFromProductInfo(JSONObject productInfo) {
+        GoodsSku goodsSku = new GoodsSku();
+        // 设置默认值
+        goodsSku.setDefaultValues();
+        // 直接映射字段
+        goodsSku.setSkuId(productInfo.getLong("skuId"));
+        goodsSku.setSpuId(productInfo.getLong("spuId"));
+        goodsSku.setSkuCode(productInfo.getString("skuId")); // 使用海博skuId作为skuCode
+        goodsSku.setSkuName(productInfo.getString("skuName"));
+        goodsSku.setMainImage(productInfo.getString("images"));
+
+        // 数值类型字段处理
+        goodsSku.setPrice(productInfo.getBigDecimal("basicPrice") != null ?
+                productInfo.getBigDecimal("basicPrice") : BigDecimal.ZERO);
+        goodsSku.setStock(productInfo.getInteger("initStock") != null ?
+                productInfo.getInteger("initStock") : 0);
+
+        // 重量和体积转换(需要根据实际数据格式处理)
+        if (productInfo.containsKey("weight")) {
+            try {
+                String weightStr = productInfo.getString("weight");
+                goodsSku.setWeight(new BigDecimal(weightStr));
+            } catch (Exception e) {
+                log.warn("重量格式转换失败: {}", productInfo.getString("weight"));
+            }
+        }
+
+        // 状态处理
+        Integer status = productInfo.getInteger("flag");
+        if (status != null && status == 0) {
+            goodsSku.setStatus(0); // 停售
+        } else {
+            goodsSku.setStatus(1); // 正常
+        }
+
+        // 其他字段映射
+        if (productInfo.containsKey("spec")) {
+            // spec字段可能包含规格信息,可以用于skuName或单独存储
+            goodsSku.setSkuName(goodsSku.getSkuName() + " " + productInfo.getString("spec"));
+        }
+
+        if (productInfo.containsKey("unit")) {
+            // 单位信息可以用于skuName
+            goodsSku.setSkuName(goodsSku.getSkuName() + "(" + productInfo.getString("unit") + ")");
+        }
+
+        return goodsSku;
+    }
+
+    /**
+     * 分类代码转换(需要根据实际业务实现)
+     */
+    private Long convertCategoryCodeToId(String categoryCode) {
+        // 这里需要根据您的分类映射关系实现
+        // 例如:从数据库或配置文件中根据categoryCode查找对应的categoryId
+        if ("101101".equals(categoryCode)) {
+            return 1L; // 每日坚果分类ID
+        } else if ("101000".equals(categoryCode)) {
+            return 2L; // 坚果分类ID
+        }
+        return 0L; // 默认分类
+    }
+
+    /**
+     * 品牌名称转换(需要根据实际业务实现)
+     */
+    private Long convertBrandToId(String brandName) {
+        // 这里需要根据您的品牌映射关系实现
+        if ("沃隆".equals(brandName)) {
+            return 1L; // 沃隆品牌ID
+        }
+        return 0L; // 默认品牌
+    }
+
+}

+ 316 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/StoreManagementService.java

@@ -0,0 +1,316 @@
+package com.yami.shop.service.hb.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.gather.zswl.common.dto.HBBaseReq;
+import org.gather.zswl.core.dao.StoreManagementDao;
+import org.gather.zswl.core.entity.StoreManagement;
+import org.gather.zswl.platform.dto.HBStoreBaseInfoReq;
+import org.gather.zswl.platform.dto.StoreRegister;
+import org.gather.zswl.platform.service.IStoreManagementService;
+import org.gather.zswl.platform.utils.HBR;
+import org.gather.zswl.platform.utils.HBSignUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+import java.util.Optional;
+
+import static org.gather.zswl.common.utils.HttpUtil.post;
+
+/**
+ * 门店管理服务实现
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-1
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+@Transactional(readOnly = true)
+public class StoreManagementService implements IStoreManagementService {
+    private final StoreManagementDao storeManagementDao;
+    private final HBSignUtil hbSignUtil;
+
+
+    @Override
+    public void doGetStation() {
+        HBBaseReq build = new HBBaseReq();
+        build.setAppId(hbSignUtil.getAppId());
+        HBStoreBaseInfoReq hbStoreBaseInfoReq = HBStoreBaseInfoReq.builder()
+                .outStationNo("003")
+                .build();
+        build.setBody(JSON.toJSONString(hbStoreBaseInfoReq));
+        build.setSign(hbSignUtil.signMd5(build));
+        String post = post(hbSignUtil.getHBHost()+"/api/station/get", build);
+        log.info("post 请求参数:{}", JSON.toJSONString(build));
+        log.info("post 结果:{}",  post);
+    }
+
+    @Override
+    public void shippingTemplate() {
+        HBBaseReq<Object> build = HBBaseReq.create();
+        build.setAppId(hbSignUtil.getAppId());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("deliveryFeeTemplateId", 5);
+        build.setBody(JSON.toJSONString(jsonObject));
+        build.setSign(hbSignUtil.signMd5(build));
+        String post = post(hbSignUtil.getHBHost()+"/api/base/deliveryFee/template", build);
+        log.info("post 请求参数:{}", JSON.toJSONString(build));
+        log.info("post 结果:{}",  post);
+    }
+
+
+    @Override
+    @Transactional
+    public HBR registerStore(JSONObject registerRequest) {
+        try {
+            String bodyStr = registerRequest.getString("body");
+            log.info("开始门店注册,body:{}", bodyStr);
+            JSONObject bodyJson = JSON.parseObject(bodyStr); // 使用Fastjson的解析方法
+            String outStationNo = bodyJson.getString("outStationNo");
+            // 1. 验证门店编码是否已存在
+            if (existsByStoreCode(outStationNo)) {
+                log.warn("门店编码 {} 已存在", outStationNo);
+                return HBR.error("门店编码 {"+outStationNo+"} 已存在");
+            }
+
+            // 2. 构建门店实体
+            StoreManagement store = StoreManagement.builder()
+                    .outStationNo(outStationNo)
+                    .stationId(bodyJson.getString("stationId"))
+                    .createBy("hb")
+                    .updateBy("hb")
+                    .build();
+
+            // 设置默认值
+            store.setDefaultValues();
+
+            // 3. 保存门店信息
+            log.info("门店注册信息{}", store);
+            storeManagementDao.insert(store);
+            log.info("门店注册成功,门店ID:{}", store.getId());
+
+            // 4. 构建响应
+            return HBR.success();
+
+        } catch (Exception e) {
+            log.error("门店注册失败:{}", e.getMessage(), e);
+            return HBR.error("未知异常");
+        }
+    }
+
+    @Override
+    @Transactional
+    public HBR updateRegisterStore(JSONObject registerRequest) {
+        try {
+            String bodyStr = registerRequest.getString("body");
+            log.info("开始门店变更,body:{}", bodyStr);
+            JSONObject bodyJson = JSON.parseObject(bodyStr);
+
+            String outStationNo = bodyJson.getString("outStationNo");
+            if (!StringUtils.hasText(outStationNo)) {
+                return HBR.error("门店编码不能为空");
+            }
+
+            // 查询现有门店
+            LambdaQueryWrapper<StoreManagement> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(StoreManagement::getOutStationNo, outStationNo)
+                   .eq(StoreManagement::getDeleted, false);
+            StoreManagement existing = storeManagementDao.selectOne(wrapper);
+
+            if (existing == null) {
+                return HBR.error("门店编码 {" + outStationNo + "} 不存在");
+            }
+
+            // 允许变更的字段(按需扩展)
+            String stationId = bodyJson.getString("outStationNo");
+            if (StringUtils.hasText(stationId)) {
+                existing.setStationId(stationId);
+            }
+
+            existing.setUpdateBy("hb");
+            existing.setUpdateTime();
+
+            storeManagementDao.updateById(existing);
+            log.info("门店变更成功,门店ID:{}", existing.getId());
+
+            return HBR.success();
+        } catch (Exception e) {
+            log.error("门店变更失败:{}", e.getMessage(), e);
+            return HBR.error("未知异常");
+        }
+    }
+
+
+    @Override
+    public List<StoreManagement> findAllStores() {
+        LambdaQueryWrapper<StoreManagement> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreManagement::getDeleted, false);
+        return storeManagementDao.selectList(wrapper);
+    }
+
+    @Override
+    @Transactional
+    public StoreManagement updateStore(StoreManagement store) {
+        try {
+            log.info("开始更新门店信息,门店ID:{}", store.getId());
+
+            // 1. 检查门店是否存在
+            Optional<StoreManagement> existingStoreOpt = findById(store.getId());
+            if (existingStoreOpt.isEmpty()) {
+                throw new RuntimeException("门店不存在");
+            }
+
+            StoreManagement existingStore = existingStoreOpt.get();
+
+            // 2. 检查门店编码是否重复(排除自己)
+            if (StringUtils.hasText(store.getOutStationNo()) &&
+                !store.getOutStationNo().equals(existingStore.getOutStationNo())) {
+                if (existsByStoreCode(store.getOutStationNo())) {
+                    throw new RuntimeException("门店编码已存在");
+                }
+            }
+
+            // 3. 更新门店信息
+            existingStore.setUpdateBy("system"); // 可以从当前用户上下文获取
+            existingStore.setUpdateTime();
+
+            // 4. 保存更新
+            storeManagementDao.updateById(existingStore);
+            log.info("门店信息更新成功,门店ID:{}", existingStore.getId());
+
+            return existingStore;
+
+        } catch (Exception e) {
+            log.error("更新门店信息失败:{}", e.getMessage(), e);
+            throw new RuntimeException("更新门店信息失败:" + e.getMessage());
+        }
+    }
+
+    @Override
+    @Transactional
+    public boolean deleteStore(Long storeId) {
+        try {
+            log.info("开始删除门店,门店ID:{}", storeId);
+
+            // 1. 检查门店是否存在
+            Optional<StoreManagement> existingStoreOpt = findById(storeId);
+            if (existingStoreOpt.isEmpty()) {
+                log.warn("门店不存在,门店ID:{}", storeId);
+                return false;
+            }
+
+            StoreManagement existingStore = existingStoreOpt.get();
+
+            // 2. 逻辑删除
+            existingStore.setDeleted(true);
+            existingStore.setUpdateBy("system");
+            existingStore.setUpdateTime();
+
+            storeManagementDao.updateById(existingStore);
+            log.info("门店删除成功,门店ID:{}", storeId);
+
+            return true;
+
+        } catch (Exception e) {
+            log.error("删除门店失败:{}", e.getMessage(), e);
+            return false;
+        }
+    }
+
+    @Override
+    @Transactional
+    public boolean enableStore(Long storeId) {
+        try {
+            log.info("开始启用门店,门店ID:{}", storeId);
+
+            // 1. 检查门店是否存在
+            Optional<StoreManagement> existingStoreOpt = findById(storeId);
+            if (existingStoreOpt.isEmpty()) {
+                log.warn("门店不存在,门店ID:{}", storeId);
+                return false;
+            }
+
+            StoreManagement existingStore = existingStoreOpt.get();
+
+            // 2. 启用门店
+            existingStore.setStatus("1");
+            existingStore.setUpdateBy("system");
+            existingStore.setUpdateTime();
+
+            storeManagementDao.updateById(existingStore);
+            log.info("门店启用成功,门店ID:{}", existingStore.getId());
+
+            return true;
+
+        } catch (Exception e) {
+            log.error("启用门店失败:{}", e.getMessage(), e);
+            return false;
+        }
+    }
+
+    @Override
+    @Transactional
+    public boolean disableStore(Long storeId) {
+        try {
+            log.info("开始禁用门店,门店ID:{}", storeId);
+
+            // 1. 检查门店是否存在
+            Optional<StoreManagement> existingStoreOpt = findById(storeId);
+            if (existingStoreOpt.isEmpty()) {
+                log.warn("门店不存在,门店ID:{}", storeId);
+                return false;
+            }
+
+            // 2. 禁用门店
+            StoreManagement existingStore = existingStoreOpt.get();
+            existingStore.setStatus("0");
+            existingStore.setUpdateBy("system");
+            existingStore.setUpdateTime();
+
+            storeManagementDao.updateById(existingStore);
+            log.info("门店禁用成功,门店ID:{}", existingStore.getId());
+
+            return true;
+
+        } catch (Exception e) {
+            log.error("禁用门店失败:{}", e.getMessage(), e);
+            return false;
+        }
+    }
+
+    @Override
+    public StoreRegister updateStoreDeliveryFeeTemplate(JSONObject registerRequest) {
+        return null;
+    }
+
+    /**
+     * 根据ID查询门店
+     *
+     * @param id 门店ID
+     * @return 门店信息
+     */
+    private Optional<StoreManagement> findById(Long id) {
+        return Optional.ofNullable(storeManagementDao.selectById(id));
+    }
+
+    /**
+     * 检查门店编码是否已存在
+     *
+     * @param storeCode 门店编码
+     * @return true表示已存在,false表示不存在
+     */
+    private boolean existsByStoreCode(String storeCode) {
+        LambdaQueryWrapper<StoreManagement> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StoreManagement::getOutStationNo, storeCode)
+               .eq(StoreManagement::getDeleted, false);
+        return storeManagementDao.selectCount(wrapper) > 0;
+    }
+
+}