Parcourir la source

添加兔灵erp物流同步回调接口

cgp il y a 1 semaine
Parent
commit
cc83133a4b

+ 154 - 0
fs-admin/src/main/java/com/fs/his/controller/JstOrderSyncController.java

@@ -0,0 +1,154 @@
+package com.fs.his.controller;
+
+import com.baidu.dev2.thirdparty.commons.codec.digest.DigestUtils;
+import com.fs.erp.dto.tl.*;
+import com.fs.erp.http.JstErpHttpService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.Instant;
+
+/**
+ * 聚水潭订单同步接口
+ */
+@Slf4j
+@RestController
+@RequestMapping("/v1/mp/sync/order/jst")
+public class JstOrderSyncController {
+
+
+    @Autowired
+    private JstErpHttpService jstErpHttpService;
+
+
+
+    private static final String partnerKey="erp";
+
+
+    /**
+     * 接收聚水潭物流同步推送
+     * URL: POST /open/callback?partnerid=erp&method=logistics.upload&ts=xxx&sign=xxx
+     */
+    @PostMapping("/callback")
+    public ResponseEntity<PushResponse> handleLogisticsPush(
+            @RequestParam String partnerid,
+            @RequestParam String method,
+            @RequestParam Long ts,
+            @RequestParam String sign,
+            @RequestBody JstLogisticsPushRequest request) {
+
+        // 1. 校验 partnerid
+        if (!"erp".equals(partnerid)) {
+            return ResponseEntity.ok(new PushResponse("1", "invalid partnerid"));
+        }
+
+        // 2. 校验时间戳(±10分钟)
+        long now = Instant.now().getEpochSecond();
+        if (Math.abs(now - ts) > 600) {
+            return ResponseEntity.ok(new PushResponse("1", "ts expired"));
+        }
+
+        // 3. 验签
+        String signSource = method + partnerid + "ts" + ts + partnerKey;
+        String expectedSign = DigestUtils.md5Hex(signSource).toLowerCase();
+        if (!expectedSign.equals(sign)) {
+            log.warn("聚水潭签名校验失败: method={}, ts={}, sign={}", method, ts, sign);
+            return ResponseEntity.ok(new PushResponse("1", "invalid sign"));
+        }
+
+        // 4. 处理业务
+        try {
+            jstErpHttpService.processLogisticsPush(request);
+            return ResponseEntity.ok(new PushResponse("0", "执行成功"));
+        } catch (Exception e) {
+            log.error("处理聚水潭物流推送异常", e);
+            return ResponseEntity.ok(new PushResponse("1", "system error"));
+        }
+    }
+
+    // 模拟订单同步到兔灵erp接口
+//    @PostMapping("/create")
+//    public Object syncOrderToJst(@RequestBody TlCreateOrderRequest requestDto) {
+//        TlCreateOrderRequest request=fillRequest();
+//        log.info("【聚水潭】收到同步订单请求,corp_id={}, so_id={}",
+//                request.getCorpId(),
+//                request.getData() != null && !request.getData().isEmpty()
+//                        ? request.getData().get(0).getSoId() : "N/A");
+//        return jstErpHttpService.syncOrderToJst(request);
+//    }
+//
+//    /**
+//     * 辅助方法 填充入参对象JstCreateOrderRequest
+//     * */
+//    private TlCreateOrderRequest fillRequest() {
+//        // 1. 创建主请求对象
+//        TlCreateOrderRequest request = new TlCreateOrderRequest();
+//        request.setCorpId("OGc3zcgK6H334BiPn8JNkVvh");
+//        //正式环境企业id
+//        //request.setCorpId("LwMAMdlBIH7agxn2t9N4Zv40");
+//
+//        // 2. 创建商品明细(items)
+//        TlOrderItemDetail item = new TlOrderItemDetail();
+//        item.setSkuId("SKU123");
+//        item.setShopSkuId("SHOP_SKU_001");
+//        item.setAmount(10000);          // 实付金额(分)
+//        item.setPrice(10000);           // 单价(分)
+//        item.setBasePrice(12000);       // 原价(分)
+//        item.setQty(1);
+//        item.setName("测试商品");
+//        item.setOuterOiId("OI_20251105_001");
+//        // produced_date 也要带时间(测试类是 "2025-11-05T00:00:00Z")
+//        item.setProducedDate("2025-11-05T00:00:00Z");
+//
+//        // 3. 创建订单主体
+//        TlOrderItem order = new TlOrderItem();
+//        order.setShopId(18150182L);
+//        order.setSoId("SO_20251105_001");
+//        // 使用 ISO 8601 格式:yyyy-MM-dd'T'HH:mm:ss'Z'
+//        order.setOrderDate("2025-11-05T10:30:00Z");
+//        order.setShopStatus("paid");                // 必须是字符串,如 "paid"
+//        order.setShopBuyerId("buyer_123");
+//
+//        order.setReceiverAddress("广东省深圳市南山区___科技园A座101");
+//        order.setReceiverName("张三");
+//        order.setReceiverMobile("13800138000");
+//
+//        order.setPayAmount(10000);   // 应付金额(分)
+//        order.setFreight(0);         // 运费(分)
+//
+//        order.setRemark("卖家备注");
+//        order.setBuyerMessage("请发顺丰");
+//        order.setLabels("测试,同步");
+//
+//        order.setCreatorName("李四");
+//        order.setShopModified("2025-11-05T10:30:00Z");
+//        order.setSendDate("2025-11-05T10:30:00Z");
+//
+//        // 关键:is_cod 不能为 null!聚水潭不接受 null 字段
+//        order.setIsCod(false);       // 显式设置为 false,避免 null
+//
+//        // l_id 为空字符串(签名时会被过滤,但保留字段)
+//        order.setLId("");
+//
+//        // 设置商品明细
+//        order.setItems(Collections.singletonList(item));
+//
+//        // 设置支付明细(必须设置,不能为 null)
+//        TlPayDetail pay = new TlPayDetail();
+//        pay.setPayment("online");
+//        pay.setAmount(10000);
+//        order.setPay(pay);
+//
+//        // 4. 设置 data 列表(仅支持1条)
+//        request.setData(Collections.singletonList(order));
+//
+//        // 5. 设置 options
+//        TlOptions options = new TlOptions();
+//        options.setJstServerId(1);
+//        request.setOptions(options);
+//
+//        return request;
+//    }
+}

+ 1 - 1
fs-framework/src/main/java/com/fs/framework/config/SecurityConfig.java

@@ -97,7 +97,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/register", "/captchaImage").anonymous()
+                .antMatchers("/login", "/register", "/captchaImage","/v1/mp/sync/order/jst/callback").anonymous()
                 .antMatchers("/app/common/test").anonymous()
                 .antMatchers("/ad/adDyApi/authorized").anonymous()
                 .antMatchers(

+ 2 - 3
fs-service/src/main/java/com/fs/erp/http/JstErpHttpServiceImpl.java

@@ -451,8 +451,7 @@ public class JstErpHttpServiceImpl implements JstErpHttpService {
         String sendDate = request.getSendDate();
         log.info("【兔灵】物流单号推送: 外部单号:{}, 物流单号:{}, 快递公司编码:{}, 发送时间:{}", soId, lId, lcId, sendDate);
 
-        // TODO: 根据 soId 查询系统中的订单,并更新物流信息
-        // 示例伪代码:
+        // TODO: 根据 id 查询系统中的订单,并更新物流信息
         // Order order = orderRepository.findBySoId(soId);
         // if (order != null) {
         //     order.setLogisticsNo(lId);
@@ -461,7 +460,7 @@ public class JstErpHttpServiceImpl implements JstErpHttpService {
         //     orderRepository.save(order);
         // }
 
-        // 如果 items 有特殊用途(如分拣、库存核销),也可遍历处理
+        //遍历处理items
         if (request.getItems() != null) {
             request.getItems().forEach(item -> {
                 log.debug("商品项: skuId={}, qty={}", item.getSkuId(), item.getQty());