Browse Source

调整接口

zhangwl 1 month ago
parent
commit
66053396a8
21 changed files with 867 additions and 731 deletions
  1. 4 0
      src/main/java/zs/payment/controller/YunMallGoodsController.java
  2. 4 68
      src/main/java/zs/payment/controller/YxSupplyChannelManualController.java
  3. 55 0
      src/main/java/zs/payment/controller/YxSupplyOrderController.java
  4. 56 0
      src/main/java/zs/payment/controller/YxSupplyProductController.java
  5. 1 1
      src/main/java/zs/payment/dao/OrderCallbackDao.java
  6. 1 1
      src/main/java/zs/payment/dao/OrderDao.java
  7. 1 1
      src/main/java/zs/payment/entity/OrderCallback.java
  8. 1 1
      src/main/java/zs/payment/entity/Orders.java
  9. 12 6
      src/main/java/zs/payment/messages/KafkaConsumer.java
  10. 1 1
      src/main/java/zs/payment/service/order/OrdersService.java
  11. 1 1
      src/main/java/zs/payment/service/order/impl/OrdersServiceImpl.java
  12. 0 105
      src/main/java/zs/payment/service/paysupply/PaySupplyService.java
  13. 0 546
      src/main/java/zs/payment/service/paysupply/impl/PaySupplyServiceImpl.java
  14. 38 0
      src/main/java/zs/payment/service/supply/order/OrderSupplyService.java
  15. 134 0
      src/main/java/zs/payment/service/supply/order/impl/OrderSupplyServiceImpl.java
  16. 47 0
      src/main/java/zs/payment/service/supply/paysupply/PaySupplyService.java
  17. 188 0
      src/main/java/zs/payment/service/supply/paysupply/impl/PaySupplyServiceImpl.java
  18. 37 0
      src/main/java/zs/payment/service/supply/product/ProductSupplyService.java
  19. 190 0
      src/main/java/zs/payment/service/supply/product/impl/ProductSupplyServiceImpl.java
  20. 20 0
      src/main/java/zs/payment/service/supply/token/SupplyTokenService.java
  21. 76 0
      src/main/java/zs/payment/service/supply/token/impl/SupplyTokenServiceImpl.java

+ 4 - 0
src/main/java/zs/payment/controller/YunMallGoodsController.java

@@ -0,0 +1,4 @@
+package zs.payment.controller;
+
+public class YunMallGoodsController {
+}

+ 4 - 68
src/main/java/zs/payment/controller/YxSupplyChannelManualController.java

@@ -8,7 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import com.alibaba.fastjson.JSONObject;
 import zs.payment.dao.OrderCallbackDao;
-import zs.payment.entity.OrderCallback;
+import zs.payment.entity.mongodb.supply.OrderCallback;
 import zs.payment.enums.CallbackMessageType;
 import zs.payment.messages.KafkaProducer;
 import zs.payment.req.*;
@@ -16,10 +16,9 @@ import zs.payment.req.*;
 import zs.payment.req.aftersales.AfterSalesCloseReq;
 import zs.payment.req.aftersales.AfterSalesOrderReq;
 import zs.payment.req.aftersales.AfterSalesOrderTypeReq;
-import zs.payment.req.storage.StoragePageReq;
 import zs.payment.resp.Result;
 
-import zs.payment.service.paysupply.PaySupplyService;
+import zs.payment.service.supply.paysupply.PaySupplyService;
 
 import javax.validation.Valid;
 import java.util.HashMap;
@@ -28,6 +27,7 @@ import java.util.Map;
 
 /**
  * 芸信 供应链平台
+ * 售后、物流、支付、回调
  */
 @Slf4j
 @RestController
@@ -44,42 +44,6 @@ public class YxSupplyChannelManualController {
     @Autowired
     private KafkaProducer kafkaProducer;
 
-    /**
-     * 获取token
-     */
-    @PostMapping("/getToken")
-    public Result getToken() {
-        return paySupplyService.fetchAndCacheToken();
-    }
-    /**
-     * 选品列表API
-     */
-    @PostMapping("/cursorList")
-    public Result cursorList(@Valid @RequestBody ProductPageReq req) {
-
-        return paySupplyService.cursorList(req);
-    }
-
-    //支持多个商品详情查看
-    @PostMapping("/detailList")
-    public Result detailList(@Valid @RequestBody ProductDetailReq req) {
-        return paySupplyService.detailList(req);
-
-    }
-
-
-    // 订单验证
-    @PostMapping("/beforeCheck")
-    public Result beforeCheck(@Valid @RequestBody OrderCheckReq req) {
-        return paySupplyService.beforeCheck(req);
-    }
-
-    //仅下单
-    @PostMapping("/orderConfirmOnly")
-    public Result orderConfirmOnly(@Valid @RequestBody OrderReq req){
-        return paySupplyService.orderConfirmOnly(req);
-    }
-
     //订单支付(单独下单之后使用这个支付)
     @PostMapping("/orderPayOnly")
     public Result orderPayOnly(@Valid @RequestBody OrderPayReq req){
@@ -87,20 +51,6 @@ public class YxSupplyChannelManualController {
     }
 
 
-    // 生成订单同时支付,如果已生成订单则是直接支付
-    @PostMapping("/order")
-    public Result order(@Valid @RequestBody OrderReq req) {
-        return paySupplyService.order(req);
-    }
-
-    // 取消订单
-    @PostMapping("/appCloseOrder")
-    public Result appCloseOrder(@Valid @RequestBody CloseOrderReq req){
-        return paySupplyService.appCloseOrder(req);
-    }
-
-
-
     // =======================售后==========================================
 
     /**
@@ -166,7 +116,7 @@ public class YxSupplyChannelManualController {
 
             // 当商品上架的时候,若已同步,则更新商品为上架
             if (CallbackMessageType.GOODS_ON_SALE.equalsIgnoreCase(messageType)){
-                //更新商品下架,状态变更,
+
                 kafkaProducer.sendMessage(CallbackMessageType.GOODS_ON_SALE, json.toJSONString());
             }
 
@@ -191,22 +141,8 @@ public class YxSupplyChannelManualController {
     }
 
 
-    //================选品, 衔接同步到企云商城===========================
-    //我的选品库
-    @PostMapping("/getMyStorageIdsList")
-    public Result getMyStorageIdsList(@Valid @RequestBody StoragePageReq req){
-        return paySupplyService.getMyStorageIdsList(req);
-    }
 
 
-    /**
-     * 同步到自研系统上
-     * @return
-     */
-    @GetMapping("/syncToQiyun")
-    public Result syncToQiyun() {
-        return paySupplyService.syncToQiyun();
-    }
 
 
 }

+ 55 - 0
src/main/java/zs/payment/controller/YxSupplyOrderController.java

@@ -0,0 +1,55 @@
+package zs.payment.controller;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import zs.payment.req.CloseOrderReq;
+import zs.payment.req.OrderCheckReq;
+import zs.payment.req.OrderReq;
+import zs.payment.resp.Result;
+import zs.payment.service.supply.order.OrderSupplyService;
+
+import javax.validation.Valid;
+
+/**
+ * 供应链订单
+ */
+@Slf4j
+@RestController
+@RequestMapping("/supply/order")
+public class YxSupplyOrderController {
+
+    @Autowired
+    private OrderSupplyService orderSupplyService;
+
+    // 订单验证
+    @PostMapping("/beforeCheck")
+    public Result beforeCheck(@Valid @RequestBody OrderCheckReq req) {
+        return orderSupplyService.beforeCheck(req);
+    }
+
+    //仅下单
+    @PostMapping("/orderConfirmOnly")
+    public Result orderConfirmOnly(@Valid @RequestBody OrderReq req){
+        return orderSupplyService.orderConfirmOnly(req);
+    }
+
+
+    // 生成订单同时支付,如果已生成订单则是直接支付
+    @PostMapping("/order")
+    public Result order(@Valid @RequestBody OrderReq req) {
+        return orderSupplyService.order(req);
+    }
+
+    // 取消订单
+    @PostMapping("/appCloseOrder")
+    public Result appCloseOrder(@Valid @RequestBody CloseOrderReq req){
+        return orderSupplyService.appCloseOrder(req);
+    }
+}

+ 56 - 0
src/main/java/zs/payment/controller/YxSupplyProductController.java

@@ -0,0 +1,56 @@
+package zs.payment.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import zs.payment.req.ProductDetailReq;
+import zs.payment.req.ProductPageReq;
+import zs.payment.req.storage.StoragePageReq;
+import zs.payment.resp.Result;
+import zs.payment.service.supply.product.ProductSupplyService;
+
+import javax.validation.Valid;
+
+/**
+ * 供应链的商品
+ */
+@Slf4j
+@RestController
+@RequestMapping("/supply/product")
+public class YxSupplyProductController {
+
+    @Autowired
+    private ProductSupplyService productSupplyService;
+
+    /**
+     * 选品列表API
+     */
+    @PostMapping("/cursorList")
+    public Result cursorList(@Valid @RequestBody ProductPageReq req) {
+
+        return productSupplyService.cursorList(req);
+    }
+
+    //支持多个商品详情查看
+    @PostMapping("/detailList")
+    public Result detailList(@Valid @RequestBody ProductDetailReq req) {
+        return productSupplyService.detailList(req);
+
+    }
+
+    //我的选品库
+    @PostMapping("/getMyStorageIdsList")
+    public Result getMyStorageIdsList(@Valid @RequestBody StoragePageReq req){
+        return productSupplyService.getMyStorageIdsList(req);
+    }
+
+
+    /**
+     * 同步到自研系统上
+     * @return
+     */
+    @GetMapping("/syncToQiyun")
+    public Result syncToQiyun() {
+        return productSupplyService.syncToQiyun();
+    }
+}

+ 1 - 1
src/main/java/zs/payment/dao/OrderCallbackDao.java

@@ -1,7 +1,7 @@
 package zs.payment.dao;
 
 import org.springframework.stereotype.Repository;
-import zs.payment.entity.OrderCallback;
+import zs.payment.entity.mongodb.supply.OrderCallback;
 
 @Repository
 public class OrderCallbackDao extends MongoDBDao<OrderCallback>{

+ 1 - 1
src/main/java/zs/payment/dao/OrderDao.java

@@ -1,7 +1,7 @@
 package zs.payment.dao;
 
 import org.springframework.stereotype.Repository;
-import zs.payment.entity.Orders;
+import zs.payment.entity.mongodb.supply.Orders;
 
 @Repository
 public class OrderDao extends MongoDBDao<Orders> {

+ 1 - 1
src/main/java/zs/payment/entity/OrderCallback.java

@@ -1,4 +1,4 @@
-package zs.payment.entity;
+package zs.payment.entity.mongodb.supply;
 
 import lombok.Getter;
 import lombok.NoArgsConstructor;

+ 1 - 1
src/main/java/zs/payment/entity/Orders.java

@@ -1,4 +1,4 @@
-package zs.payment.entity;
+package zs.payment.entity.mongodb.supply;
 
 import lombok.Getter;
 import lombok.NoArgsConstructor;

+ 12 - 6
src/main/java/zs/payment/messages/KafkaConsumer.java

@@ -23,8 +23,8 @@ import zs.payment.service.imseweishopcategory.ImsEweiShopCategoryService;
 import zs.payment.service.imseweishopgoodsoption.ImsEweiShopGoodsOptionService;
 import zs.payment.service.imseweishopgoodsspec.ImsEweiShopGoodsSpecService;
 import zs.payment.service.imseweishopgoodsspecitem.ImsEweiShopGoodsSpecItemService;
-import zs.payment.service.paysupply.PaySupplyService;
-import zs.payment.utils.HttpUtil;
+import zs.payment.service.supply.paysupply.PaySupplyService;
+import zs.payment.service.supply.product.ProductSupplyService;
 import zs.payment.utils.RedisUtils;
 import zs.payment.utils.TimeUtils;
 
@@ -39,6 +39,8 @@ public class KafkaConsumer {
 
     @Autowired
     private PaySupplyService paySupplyService;
+    @Autowired
+    private ProductSupplyService productSupplyService;
 
     @Autowired
     private RedisUtils redisUtils;
@@ -150,7 +152,7 @@ public class KafkaConsumer {
         List<Integer> ids = JSONArray.parseArray(messsage, Integer.class);
         ProductDetailReq req = new ProductDetailReq();
         req.setIds(ids);
-        Result result = paySupplyService.detailList(req);
+        Result result = productSupplyService.detailList(req);
 
         if (result.isSuccess()) {
 
@@ -166,7 +168,7 @@ public class KafkaConsumer {
                 if (!b) {
                     //不存在,则需要添加
 
-                    Integer uniacid = 463;
+                    Integer uniacid = 465;
 
                     //第一级
                     Long pcate = 0L;
@@ -233,11 +235,15 @@ public class KafkaConsumer {
                     goods.setUnit(dto.getUnit());
                     goods.setContent(dto.getDetail_images());
                     //================价格====================
+                    //原价-市场价
                     goods.setProductprice(new BigDecimal(dto.getGuide_price() / 100));
+                    //售价-用户需要支持的价格
                     goods.setMarketprice(new BigDecimal(dto.getMarket_price() / 100));
+                    // 生态供应价
                     goods.setCostprice(new BigDecimal(0));
+                    // 成本价
                     goods.setCost_of_price(new BigDecimal(dto.getCost_price() / 100));
-                    goods.setOriginalprice(new BigDecimal(dto.getOrigin_price() / 100));
+//                    goods.setOriginalprice(new BigDecimal(dto.getOrigin_price() / 100));
 
                     goods.setTotal(dto.getStock());
                     // 0 拍下减库存 1 付款减库存 2 永久不减
@@ -265,7 +271,7 @@ public class KafkaConsumer {
                     goods.setGoodssn(dto.getSn());
                     //商品条码
                     goods.setProductsn(dto.getBarcode());
-                    //默认发布给云悦生活
+                    //默认发布给云享生态
                     goods.setUniacid(uniacid);
 
                     //创建商品表

+ 1 - 1
src/main/java/zs/payment/service/order/OrdersService.java

@@ -1,6 +1,6 @@
 package zs.payment.service.order;
 
-import zs.payment.entity.Orders;
+import zs.payment.entity.mongodb.supply.Orders;
 
 import java.util.List;
 

+ 1 - 1
src/main/java/zs/payment/service/order/impl/OrdersServiceImpl.java

@@ -3,7 +3,7 @@ package zs.payment.service.order.impl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import zs.payment.dao.OrderDao;
-import zs.payment.entity.Orders;
+import zs.payment.entity.mongodb.supply.Orders;
 import zs.payment.service.order.OrdersService;
 
 import java.util.List;

+ 0 - 105
src/main/java/zs/payment/service/paysupply/PaySupplyService.java

@@ -1,105 +0,0 @@
-package zs.payment.service.paysupply;
-
-import org.springframework.web.bind.annotation.RequestBody;
-import zs.payment.req.*;
-import zs.payment.req.aftersales.AfterSalesCloseReq;
-import zs.payment.req.aftersales.AfterSalesOrderReq;
-import zs.payment.req.aftersales.AfterSalesOrderTypeReq;
-import zs.payment.req.storage.StoragePageReq;
-import zs.payment.resp.Result;
-
-import javax.validation.Valid;
-
-public interface PaySupplyService {
-
-    /**
-     * 查询商品详情
-     * @param req
-     * @return
-     */
-    Result detailList(ProductDetailReq req);
-    Result fetchAndCacheToken();
-
-    /**
-     * 查看选品列表
-     * @param req
-     * @return
-     */
-    Result cursorList(ProductPageReq req);
-
-    /**
-     * 订单验证
-     * @param req
-     * @return
-     */
-    Result beforeCheck(OrderCheckReq req);
-
-    /**
-     * 仅下单
-     * @param req
-     * @return
-     */
-    Result orderConfirmOnly(OrderReq req);
-
-    /**
-     * 仅支付
-     * @param req
-     * @return
-     */
-    Result orderPayOnly(OrderPayReq req);
-
-    /**
-     * 生成订单同时支付,如果已生成订单则是直接支付
-     * @param req
-     * @return
-     */
-    Result order(OrderReq req);
-
-    /**
-     * 取消订单
-     * @param req
-     * @return
-     */
-    Result appCloseOrder(CloseOrderReq req);
-
-    /**
-     * 获取订单支持的售后方式: 一般为退款、 退货退款
-     * @param req
-     * @return
-     */
-    Result getAfterSalesTypeNameMap(AfterSalesOrderTypeReq req);
-
-    /**
-     * 申请售后
-     * @param req
-     * @return
-     */
-    Result afterSalesCreate(AfterSalesOrderReq req);
-
-    /**
-     * 取消售后
-     * @param id
-     * @return
-     */
-    Result afterSalesClose(Integer id);
-    /**
-     * 我的选品库
-     * @param req
-     * @return
-     */
-    Result getMyStorageIdsList(StoragePageReq req);
-
-    /**
-     * 将选品库里的商品,同步到自研系统中
-     * @return
-     */
-    Result syncToQiyun();
-
-
-    /**
-     * 根据第三方订单编号,更新自研平台的物流信息
-     * @param orderSn
-     * @return
-     */
-    Result updateOrderLogistic(String orderSn);
-}

+ 0 - 546
src/main/java/zs/payment/service/paysupply/impl/PaySupplyServiceImpl.java

@@ -1,546 +0,0 @@
-package zs.payment.service.paysupply.impl;
-
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-import org.springframework.util.ObjectUtils;
-import zs.payment.dto.OrderDetailDTO;
-import zs.payment.entity.Orders;
-import zs.payment.enums.CallbackMessageType;
-import zs.payment.enums.ProductSupplyRedis;
-import zs.payment.messages.KafkaProducer;
-import zs.payment.req.*;
-import zs.payment.req.aftersales.AfterSalesOrderReq;
-import zs.payment.req.aftersales.AfterSalesOrderTypeReq;
-import zs.payment.req.storage.StoragePageReq;
-import zs.payment.resp.Result;
-
-import zs.payment.service.order.OrdersService;
-import zs.payment.service.paysupply.PaySupplyService;
-import zs.payment.utils.HttpUtil;
-import zs.payment.utils.RedisUtils;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static zs.payment.enums.ProductSupplyRedis.SUPPLY_TOKEN;
-
-@Service
-@Slf4j
-public class PaySupplyServiceImpl implements PaySupplyService {
-
-
-    @Value("${supply.demain}")
-    private String prefixUrl;
-
-    @Value("${supply.appKey}")
-    private String appKey;
-    @Value("${supply.appSecret}")
-    private String appSecret;
-
-    @Autowired
-    private OrdersService ordersService;
-
-    @Autowired
-    private RedisUtils redisUtils;
-
-    @Autowired
-    private KafkaProducer kafkaProducer;
-
-    @Override
-    public Result detailList(ProductDetailReq req) {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("ids", req.getIds());
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/product/storage/detailList", params, headers);
-
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            log.info("查看商品详情失败,{}", req.getIds());
-            return Result.fail(respJson.getString("msg"));
-        }
-
-        return Result.success(respJson.getJSONObject("data").getJSONArray("list"));
-    }
-
-    /**
-     * 请求上游获取token并缓存到Redis
-     * 成功返回 Result.success(token),失败返回 Result.fail(msg)
-     */
-    @Override
-    public Result fetchAndCacheToken() {
-        // 先判断TTL,剩余时间大于1小时才取缓存token直接返回
-        if (redisUtils.ttl(SUPPLY_TOKEN) > 3600) {
-            return Result.success(redisUtils.get(SUPPLY_TOKEN));
-        }
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("app_key", appKey);
-        params.put("app_secret", appSecret);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/application/getToken", params);
-
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-
-        JSONObject data = respJson.getJSONObject("data");
-        String token = data.getString("token");
-        long expiresAt = data.getLongValue("expiresAt");
-
-        long ttlSeconds = (expiresAt - System.currentTimeMillis()) / 1000;
-        if (ttlSeconds <= 0) ttlSeconds = 60;
-
-        redisUtils.set(SUPPLY_TOKEN, token, (int) ttlSeconds);
-
-        return Result.success(token);
-    }
-
-
-    @Override
-    public Result cursorList(ProductPageReq req) {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("pageSize", req.getPageSize());
-        if (req.getCursor() != null) {
-            params.put("cursor", req.getCursor());
-        }
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/product/storage/cursorList", params, headers);
-
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-
-        return Result.success(respJson.getJSONObject("data"));
-    }
-
-
-    @Override
-    public Result beforeCheck(OrderCheckReq req) {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("spu", req.getSpu());
-        params.put("address", req.getAddress());
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/beforeCheck", params, headers);
-
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-
-        return Result.success(respJson.getJSONObject("data"));
-    }
-
-    @Override
-    public Result orderConfirmOnly(OrderReq req) {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("spu", req.getSpu());
-        params.put("address", req.getAddress());
-        params.put("order_sn", req.getOrderSn());
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/orderConfirmOnly", params, headers);
-
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-
-        List<Orders> orders = JSONObject.parseArray(
-            respJson.getJSONObject("data").getJSONArray("Orders").toJSONString(),
-            Orders.class
-        );
-        log.info("仅下单,存储订单");
-        ordersService.addBatchOrder(orders);
-
-        return Result.success(orders);
-    }
-
-    @Override
-    public Result orderPayOnly(OrderPayReq req) {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("order_sn", req.getOrderSn());
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/orderPayOnly", params, headers);
-
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-
-        List<Orders> orders = JSONObject.parseArray(
-            respJson.getJSONObject("data").getJSONArray("Orders").toJSONString(),
-            Orders.class
-        );
-        return Result.success(orders);
-    }
-
-    @Override
-    public Result order(OrderReq req) {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("spu", req.getSpu());
-        params.put("address", req.getAddress());
-        params.put("order_sn", req.getOrderSn());
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order", params, headers);
-
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-
-        List<Orders> orders = JSONObject.parseArray(
-            respJson.getJSONObject("data").getJSONArray("Orders").toJSONString(),
-            Orders.class
-        );
-        log.info("下单并支付,存储订单");
-        ordersService.addBatchOrder(orders);
-        return Result.success(orders);
-    }
-
-    @Override
-    public Result appCloseOrder(CloseOrderReq req) {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("order_id", req.getOrderId());
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/appCloseOrder", params, headers);
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-        //{
-        //    "body": {
-        //        "MSG": "SUCCESS",
-        //        "CODE": 200,
-        //        "data": {
-        //            "errorOrdersSNs": null,
-        //            "successOrdersSNs": [
-        //                195319850638
-        //            ]
-        //        }
-        //    },
-        //    "success": true
-        //}
-        return Result.success(respJson.getJSONObject("data"));
-    }
-
-    @Override
-    public Result getAfterSalesTypeNameMap(AfterSalesOrderTypeReq req) {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("order_id", req.getOrderId());
-        params.put("order_item_id",req.getOrderItemId());
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplateGet(prefixUrl + "/supplyapi/app/afterSales/getAfterSalesTypeNameMap", params, headers);
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-
-        return Result.success(respJson.getJSONObject("data"));
-    }
-
-    @Override
-    public Result afterSalesCreate(AfterSalesOrderReq req) {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("order_id", req.getOrderId());
-        params.put("is_received",req.getIsReceived());
-        params.put("order_item_id",req.getOrderItemId());
-        if (!ObjectUtils.isEmpty(req.getAmount())){
-            //退款总额不为空
-            params.put("amount",req.getAmount());
-        }
-        if (!ObjectUtils.isEmpty(req.getRefundType())){
-            // 退款方式: "0": "退款",  "1": "退货退款"
-            params.put("refund_type",req.getRefundType());
-        }
-        if (!ObjectUtils.isEmpty(req.getTechnicalServicesFee())){
-            //技术服务费
-            params.put("technical_services_fee",req.getTechnicalServicesFee());
-        }
-
-        if (!ObjectUtils.isEmpty(req.getFreight())){
-            //运费
-            params.put("freight",req.getFreight());
-        }
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/afterSales/create", params, headers);
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-
-        //todo 需要把data进行存储,方便之后的取消售后操作
-
-
-        return Result.success(respJson.getJSONObject("data"));
-    }
-
-    @Override
-    public Result afterSalesClose(Integer id) {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("id", id);
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/afterSales/close", params, headers);
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-
-
-        return Result.success(respJson.getJSONObject("data"));
-    }
-
-    @Override
-    public Result getMyStorageIdsList(StoragePageReq req) {
-
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("page", req.getPage());
-        params.put("pageSize",req.getPageSize());
-        params.put("create_sort",req.getCreateSort());
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/product/storage/getMyStorageIdsList", params, headers);
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-        //把选品库中的商品同步到企云商城中 list:[2932,9600]
-        JSONArray array = respJson.getJSONObject("data").getJSONArray("list");
-        kafkaProducer.sendMessage(CallbackMessageType.GOODS_SYNC, array.toString());
-
-        return Result.success(respJson.getJSONObject("data"));
-    }
-
-    @Override
-    public Result syncToQiyun() {
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            log.error("syncToQiyun: 获取token失败");
-            return Result.fail("获取token失败");
-        }
-        String token = (String) tokenResult.getBody().get("token");
-
-        int page = 1;
-        int pageSize = 50;
-        int total = 0;
-        boolean isFirstPage = true;
-
-        try {
-            while (true) {
-                Map<String, Object> params = new HashMap<>();
-                params.put("page", page);
-                params.put("pageSize", pageSize);
-                params.put("create_sort", "desc");
-
-                Map<String, String> headers = new HashMap<>();
-                headers.put("x-token", token);
-
-                String resp = HttpUtil.restTemplatePost(
-                    prefixUrl + "/supplyapi/app/product/storage/getMyStorageIdsList",
-                    params,
-                    headers
-                );
-
-                JSONObject respJson = JSONObject.parseObject(resp);
-                if (respJson.getIntValue("code") != 0) {
-                    log.error("syncToQiyun: 调用选品库列表接口失败,page={},msg={}", page, respJson.getString("msg"));
-                    return Result.fail("调用选品库列表接口失败: " + respJson.getString("msg"));
-                }
-
-                JSONObject data = respJson.getJSONObject("data");
-                JSONArray array = data.getJSONArray("list");
-
-                if (isFirstPage) {
-                    total = data.getIntValue("total");
-                    isFirstPage = false;
-                }
-
-                if (array != null && !array.isEmpty()) {
-                    if (!sendKafkaMessageWithRetry(array.toString())) {
-                        log.error("syncToQiyun: Kafka发送失败,page={},已重试3次", page);
-                        return Result.fail("Kafka发送失败,第" + page + "页数据发送失败");
-                    }
-                    log.info("syncToQiyun: 成功发送第{}页数据,共{}条", page, array.size());
-                }
-
-                int currentPage = data.getIntValue("page");
-                int currentPageSize = data.getIntValue("pageSize");
-                int nextPage = currentPage + 1;
-
-                if (nextPage * currentPageSize > total) {
-                    break;
-                }
-
-                page = nextPage;
-            }
-
-            log.info("syncToQiyun: 所有商品数据同步完成,总计{}条", total);
-            return Result.success(true);
-
-        } catch (Exception e) {
-            log.error("syncToQiyun: 执行异常", e);
-            return Result.fail("执行异常: " + e.getMessage());
-        }
-    }
-
-    private boolean sendKafkaMessageWithRetry(String message) {
-        int maxRetries = 3;
-
-        for (int retryCount = 0; retryCount < maxRetries; retryCount++) {
-            try {
-                kafkaProducer.sendMessage(CallbackMessageType.GOODS_SYNC, message);
-                return true;
-            } catch (Exception e) {
-                log.warn("syncToQiyun: Kafka发送失败,第{}次重试", retryCount + 1);
-                if (retryCount == maxRetries - 1) {
-                    log.error("syncToQiyun: Kafka发送失败,已达到最大重试次数3次,消息内容: {}", message, e);
-                    return false;
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public Result updateOrderLogistic(String orderSn) {
-
-        Result tokenResult = fetchAndCacheToken();
-        if (!tokenResult.isSuccess()) {
-            return tokenResult;
-        }
-        String  token = (String) tokenResult.getBody().get("token");
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("order_sn", orderSn);
-
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("x-token", token);
-        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/Logistic", params, headers);
-
-
-        JSONObject respJson = JSONObject.parseObject(resp);
-        if (respJson.getIntValue("code") != 0) {
-            return Result.fail(respJson.getString("msg"));
-        }
-        //获取物流信息
-        JSONArray array = respJson.getJSONArray("data");
-        //获取物流中的物流编号+物流编码
-
-        for (int i = 0; i < array.size(); i++) {
-            //物流编号
-            String expressNo = array.getJSONObject(i).getString("express_no");
-            //物流编码
-            String companyCode = array.getJSONObject(i).getString("company_code");
-            //todo 更新自研系统的物流
-        }
-
-
-
-
-
-        return Result.success(respJson.getJSONArray("data"));
-    }
-}

+ 38 - 0
src/main/java/zs/payment/service/supply/order/OrderSupplyService.java

@@ -0,0 +1,38 @@
+package zs.payment.service.supply.order;
+
+import zs.payment.req.CloseOrderReq;
+import zs.payment.req.OrderCheckReq;
+import zs.payment.req.OrderReq;
+import zs.payment.resp.Result;
+
+public interface OrderSupplyService {
+
+    /**
+     * 生成订单同时支付,如果已生成订单则是直接支付
+     * @param req
+     * @return
+     */
+    Result order(OrderReq req);
+
+    /**
+     * 订单验证
+     * @param req
+     * @return
+     */
+    Result beforeCheck(OrderCheckReq req);
+
+    /**
+     * 仅下单
+     * @param req
+     * @return
+     */
+    Result orderConfirmOnly(OrderReq req);
+
+    /**
+     * 取消订单
+     * @param req
+     * @return
+     */
+    Result appCloseOrder(CloseOrderReq req);
+
+}

+ 134 - 0
src/main/java/zs/payment/service/supply/order/impl/OrderSupplyServiceImpl.java

@@ -0,0 +1,134 @@
+package zs.payment.service.supply.order.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import zs.payment.entity.mongodb.supply.Orders;
+import zs.payment.req.CloseOrderReq;
+import zs.payment.req.OrderCheckReq;
+import zs.payment.req.OrderReq;
+import zs.payment.resp.Result;
+import zs.payment.service.order.OrdersService;
+import zs.payment.service.supply.order.OrderSupplyService;
+import zs.payment.service.supply.token.SupplyTokenService;
+import zs.payment.utils.HttpUtil;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class OrderSupplyServiceImpl implements OrderSupplyService {
+
+
+    @Value("${supply.demain}")
+    private String prefixUrl;
+
+    @Autowired
+    private SupplyTokenService supplyTokenService;
+
+    @Autowired
+    private OrdersService ordersService;
+
+
+    @Override
+    public Result order(OrderReq req) {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("spu", req.getSpu());
+        params.put("address", req.getAddress());
+        params.put("order_sn", req.getOrderSn());
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order", params, headers);
+
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+
+        List<Orders> orders = JSONObject.parseArray(
+            respJson.getJSONObject("data").getJSONArray("Orders").toJSONString(),
+            Orders.class
+        );
+        log.info("下单并支付,存储订单");
+        ordersService.addBatchOrder(orders);
+        return Result.success(orders);
+    }
+
+    @Override
+    public Result beforeCheck(OrderCheckReq req) {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("spu", req.getSpu());
+        params.put("address", req.getAddress());
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/beforeCheck", params, headers);
+
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+
+        return Result.success(respJson.getJSONObject("data"));
+    }
+
+    @Override
+    public Result orderConfirmOnly(OrderReq req) {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("spu", req.getSpu());
+        params.put("address", req.getAddress());
+        params.put("order_sn", req.getOrderSn());
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/orderConfirmOnly", params, headers);
+
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+
+        List<Orders> orders = JSONObject.parseArray(
+            respJson.getJSONObject("data").getJSONArray("Orders").toJSONString(),
+            Orders.class
+        );
+        log.info("仅下单,存储订单");
+        ordersService.addBatchOrder(orders);
+
+        return Result.success(orders);
+    }
+
+
+    @Override
+    public Result appCloseOrder(CloseOrderReq req) {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("order_id", req.getOrderId());
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/appCloseOrder", params, headers);
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+
+        return Result.success(respJson.getJSONObject("data"));
+    }
+}

+ 47 - 0
src/main/java/zs/payment/service/supply/paysupply/PaySupplyService.java

@@ -0,0 +1,47 @@
+package zs.payment.service.supply.paysupply;
+
+import zs.payment.req.*;
+import zs.payment.req.aftersales.AfterSalesOrderReq;
+import zs.payment.req.aftersales.AfterSalesOrderTypeReq;
+import zs.payment.req.storage.StoragePageReq;
+import zs.payment.resp.Result;
+
+public interface PaySupplyService {
+
+    /**
+     * 仅支付
+     * @param req
+     * @return
+     */
+    Result orderPayOnly(OrderPayReq req);
+
+
+    /**
+     * 获取订单支持的售后方式: 一般为退款、 退货退款
+     * @param req
+     * @return
+     */
+    Result getAfterSalesTypeNameMap(AfterSalesOrderTypeReq req);
+
+    /**
+     * 申请售后
+     * @param req
+     * @return
+     */
+    Result afterSalesCreate(AfterSalesOrderReq req);
+
+    /**
+     * 取消售后
+     * @param id
+     * @return
+     */
+    Result afterSalesClose(Integer id);
+
+
+    /**
+     * 根据第三方订单编号,更新自研平台的物流信息
+     * @param orderSn
+     * @return
+     */
+    Result updateOrderLogistic(String orderSn);
+}

+ 188 - 0
src/main/java/zs/payment/service/supply/paysupply/impl/PaySupplyServiceImpl.java

@@ -0,0 +1,188 @@
+package zs.payment.service.supply.paysupply.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+import zs.payment.entity.mongodb.supply.Orders;
+import zs.payment.messages.KafkaProducer;
+import zs.payment.req.*;
+import zs.payment.req.aftersales.AfterSalesOrderReq;
+import zs.payment.req.aftersales.AfterSalesOrderTypeReq;
+import zs.payment.resp.Result;
+
+import zs.payment.service.supply.paysupply.PaySupplyService;
+import zs.payment.service.supply.token.SupplyTokenService;
+import zs.payment.utils.HttpUtil;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class PaySupplyServiceImpl implements PaySupplyService {
+
+    @Value("${supply.demain}")
+    private String prefixUrl;
+
+    @Autowired
+    private SupplyTokenService supplyTokenService;
+
+    @Autowired
+    private KafkaProducer kafkaProducer;
+
+
+    @Override
+    public Result orderPayOnly(OrderPayReq req) {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("order_sn", req.getOrderSn());
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/orderPayOnly", params, headers);
+
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+
+        List<Orders> orders = JSONObject.parseArray(
+            respJson.getJSONObject("data").getJSONArray("Orders").toJSONString(),
+            Orders.class
+        );
+        return Result.success(orders);
+    }
+
+
+
+    @Override
+    public Result getAfterSalesTypeNameMap(AfterSalesOrderTypeReq req) {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("order_id", req.getOrderId());
+        params.put("order_item_id",req.getOrderItemId());
+
+        String resp = HttpUtil.restTemplateGet(prefixUrl + "/supplyapi/app/afterSales/getAfterSalesTypeNameMap", params, headers);
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+
+        return Result.success(respJson.getJSONObject("data"));
+    }
+
+    @Override
+    public Result afterSalesCreate(AfterSalesOrderReq req) {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("order_id", req.getOrderId());
+        params.put("is_received",req.getIsReceived());
+        params.put("order_item_id",req.getOrderItemId());
+        if (!ObjectUtils.isEmpty(req.getAmount())){
+            //退款总额不为空
+            params.put("amount",req.getAmount());
+        }
+        if (!ObjectUtils.isEmpty(req.getRefundType())){
+            // 退款方式: "0": "退款",  "1": "退货退款"
+            params.put("refund_type",req.getRefundType());
+        }
+        if (!ObjectUtils.isEmpty(req.getTechnicalServicesFee())){
+            //技术服务费
+            params.put("technical_services_fee",req.getTechnicalServicesFee());
+        }
+
+        if (!ObjectUtils.isEmpty(req.getFreight())){
+            //运费
+            params.put("freight",req.getFreight());
+        }
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/afterSales/create", params, headers);
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+
+        //todo 需要把data进行存储,方便之后的取消售后操作
+
+
+        return Result.success(respJson.getJSONObject("data"));
+    }
+
+    @Override
+    public Result afterSalesClose(Integer id) {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("id", id);
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/afterSales/close", params, headers);
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+
+
+        return Result.success(respJson.getJSONObject("data"));
+    }
+
+    @Override
+    public Result updateOrderLogistic(String orderSn) {
+
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        //第三方的订单编号
+        params.put("order_sn", orderSn);
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/Logistic", params, headers);
+
+
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+        //获取物流信息
+        JSONArray array = respJson.getJSONArray("data");
+        //获取物流中的物流编号+物流编码
+
+        for (int i = 0; i < array.size(); i++) {
+            //物流编号
+            String expressNo = array.getJSONObject(i).getString("express_no");
+            //物流编码
+            String companyCode = array.getJSONObject(i).getString("company_code");
+            //todo 更新自研系统的物流
+
+
+
+
+
+        }
+
+
+
+
+
+        return Result.success(respJson.getJSONArray("data"));
+    }
+}

+ 37 - 0
src/main/java/zs/payment/service/supply/product/ProductSupplyService.java

@@ -0,0 +1,37 @@
+package zs.payment.service.supply.product;
+
+import zs.payment.req.ProductDetailReq;
+import zs.payment.req.ProductPageReq;
+import zs.payment.req.storage.StoragePageReq;
+import zs.payment.resp.Result;
+
+public interface ProductSupplyService {
+
+    /**
+     * 查询商品详情
+     * @param req
+     * @return
+     */
+    Result detailList(ProductDetailReq req);
+
+    /**
+     * 查看选品列表
+     * @param req
+     * @return
+     */
+    Result cursorList(ProductPageReq req);
+
+    /**
+     * 我的选品库
+     * @param req
+     * @return
+     */
+    Result getMyStorageIdsList(StoragePageReq req);
+
+    /**
+     * 将选品库里的商品,同步到自研系统中
+     * @return
+     */
+    Result syncToQiyun();
+
+}

+ 190 - 0
src/main/java/zs/payment/service/supply/product/impl/ProductSupplyServiceImpl.java

@@ -0,0 +1,190 @@
+package zs.payment.service.supply.product.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import zs.payment.enums.CallbackMessageType;
+import zs.payment.messages.KafkaProducer;
+import zs.payment.req.ProductDetailReq;
+import zs.payment.req.ProductPageReq;
+import zs.payment.req.storage.StoragePageReq;
+import zs.payment.resp.Result;
+import zs.payment.service.supply.product.ProductSupplyService;
+import zs.payment.service.supply.token.SupplyTokenService;
+import zs.payment.utils.HttpUtil;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Service
+@Slf4j
+public class ProductSupplyServiceImpl implements ProductSupplyService {
+
+    @Value("${supply.demain}")
+    private String prefixUrl;
+
+    @Autowired
+    private KafkaProducer kafkaProducer;
+
+    @Autowired
+    private SupplyTokenService supplyTokenService;
+
+    @Override
+    public Result detailList(ProductDetailReq req) {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("ids", req.getIds());
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/product/storage/detailList", params, headers);
+
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            log.info("查看商品详情失败,{}", req.getIds());
+            return Result.fail(respJson.getString("msg"));
+        }
+
+        return Result.success(respJson.getJSONObject("data").getJSONArray("list"));
+    }
+
+    @Override
+    public Result cursorList(ProductPageReq req) {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("pageSize", req.getPageSize());
+        if (req.getCursor() != null) {
+            params.put("cursor", req.getCursor());
+        }
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/product/storage/cursorList", params, headers);
+
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+
+        return Result.success(respJson.getJSONObject("data"));
+    }
+
+    @Override
+    public Result getMyStorageIdsList(StoragePageReq req) {
+
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            return Result.fail("获取token失败");
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("page", req.getPage());
+        params.put("pageSize",req.getPageSize());
+        params.put("create_sort",req.getCreateSort());
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/product/storage/getMyStorageIdsList", params, headers);
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+        //把选品库中的商品同步到企云商城中 list:[2932,9600]
+        JSONArray array = respJson.getJSONObject("data").getJSONArray("list");
+        kafkaProducer.sendMessage(CallbackMessageType.GOODS_SYNC, array.toString());
+
+        return Result.success(respJson.getJSONObject("data"));
+    }
+
+    @Override
+    public Result syncToQiyun() {
+        Map<String, String> headers = supplyTokenService.buildAuthHeaders();
+        if (headers == null) {
+            log.error("syncToQiyun: 获取token失败");
+            return Result.fail("获取token失败");
+        }
+
+        int page = 1;
+        int pageSize = 50;
+        int total = 0;
+        boolean isFirstPage = true;
+
+        try {
+            while (true) {
+                Map<String, Object> params = new HashMap<>();
+                params.put("page", page);
+                params.put("pageSize", pageSize);
+                params.put("create_sort", "desc");
+
+                String resp = HttpUtil.restTemplatePost(
+                    prefixUrl + "/supplyapi/app/product/storage/getMyStorageIdsList",
+                    params,
+                    headers
+                );
+
+                JSONObject respJson = JSONObject.parseObject(resp);
+                if (respJson.getIntValue("code") != 0) {
+                    log.error("syncToQiyun: 调用选品库列表接口失败,page={},msg={}", page, respJson.getString("msg"));
+                    return Result.fail("调用选品库列表接口失败: " + respJson.getString("msg"));
+                }
+
+                JSONObject data = respJson.getJSONObject("data");
+                JSONArray array = data.getJSONArray("list");
+
+                if (isFirstPage) {
+                    total = data.getIntValue("total");
+                    isFirstPage = false;
+                }
+
+                if (array != null && !array.isEmpty()) {
+                    if (!sendKafkaMessageWithRetry(array.toString())) {
+                        log.error("syncToQiyun: Kafka发送失败,page={},已重试3次", page);
+                        return Result.fail("Kafka发送失败,第" + page + "页数据发送失败");
+                    }
+                    log.info("syncToQiyun: 成功发送第{}页数据,共{}条", page, array.size());
+                }
+
+                int currentPage = data.getIntValue("page");
+                int currentPageSize = data.getIntValue("pageSize");
+                int nextPage = currentPage + 1;
+
+                if (nextPage * currentPageSize > total) {
+                    break;
+                }
+
+                page = nextPage;
+            }
+
+            log.info("syncToQiyun: 所有商品数据同步完成,总计{}条", total);
+            return Result.success(true);
+
+        } catch (Exception e) {
+            log.error("syncToQiyun: 执行异常", e);
+            return Result.fail("执行异常: " + e.getMessage());
+        }
+    }
+
+    private boolean sendKafkaMessageWithRetry(String message) {
+        int maxRetries = 3;
+
+        for (int retryCount = 0; retryCount < maxRetries; retryCount++) {
+            try {
+                kafkaProducer.sendMessage(CallbackMessageType.GOODS_SYNC, message);
+                return true;
+            } catch (Exception e) {
+                log.warn("syncToQiyun: Kafka发送失败,第{}次重试", retryCount + 1);
+                if (retryCount == maxRetries - 1) {
+                    log.error("syncToQiyun: Kafka发送失败,已达到最大重试次数3次,消息内容: {}", message, e);
+                    return false;
+                }
+            }
+        }
+        return false;
+    }
+}

+ 20 - 0
src/main/java/zs/payment/service/supply/token/SupplyTokenService.java

@@ -0,0 +1,20 @@
+package zs.payment.service.supply.token;
+
+import zs.payment.resp.Result;
+
+import java.util.Map;
+
+public interface SupplyTokenService {
+
+    /**
+     * 请求上游获取token并缓存到Redis
+     * 成功返回 Result.success(token),失败返回 Result.fail(msg)
+     */
+    Result fetchAndCacheToken();
+
+    /**
+     * 获取token并直接构建带认证信息的headers
+     * 获取失败返回 null
+     */
+    Map<String, String> buildAuthHeaders();
+}

+ 76 - 0
src/main/java/zs/payment/service/supply/token/impl/SupplyTokenServiceImpl.java

@@ -0,0 +1,76 @@
+package zs.payment.service.supply.token.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import zs.payment.resp.Result;
+import zs.payment.service.supply.token.SupplyTokenService;
+import zs.payment.utils.HttpUtil;
+import zs.payment.utils.RedisUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static zs.payment.enums.ProductSupplyRedis.SUPPLY_TOKEN;
+
+@Service
+@Slf4j
+public class SupplyTokenServiceImpl implements SupplyTokenService {
+
+    @Value("${supply.demain}")
+    private String prefixUrl;
+
+    @Value("${supply.appKey}")
+    private String appKey;
+
+    @Value("${supply.appSecret}")
+    private String appSecret;
+
+    @Autowired
+    private RedisUtils redisUtils;
+
+    @Override
+    public Result fetchAndCacheToken() {
+        // 先判断TTL,剩余时间大于1小时才取缓存token直接返回
+        if (redisUtils.ttl(SUPPLY_TOKEN) > 3600) {
+            return Result.success(redisUtils.get(SUPPLY_TOKEN));
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("app_key", appKey);
+        params.put("app_secret", appSecret);
+
+        String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/application/getToken", params);
+
+        JSONObject respJson = JSONObject.parseObject(resp);
+        if (respJson.getIntValue("code") != 0) {
+            return Result.fail(respJson.getString("msg"));
+        }
+
+        JSONObject data = respJson.getJSONObject("data");
+        String token = data.getString("token");
+        long expiresAt = data.getLongValue("expiresAt");
+
+        long ttlSeconds = (expiresAt - System.currentTimeMillis()) / 1000;
+        if (ttlSeconds <= 0) ttlSeconds = 60;
+
+        redisUtils.set(SUPPLY_TOKEN, token, (int) ttlSeconds);
+
+        return Result.success(token);
+    }
+
+    @Override
+    public Map<String, String> buildAuthHeaders() {
+        Result tokenResult = fetchAndCacheToken();
+        if (!tokenResult.isSuccess()) {
+            log.error("buildAuthHeaders: 获取token失败, msg={}", tokenResult.getBody().get("MSG"));
+            return null;
+        }
+        String token = (String) tokenResult.getBody().get("token");
+        Map<String, String> headers = new HashMap<>();
+        headers.put("x-token", token);
+        return headers;
+    }
+}