Jelajahi Sumber

调整兔灵erp物流同步回调接口

cgp 1 Minggu lalu
induk
melakukan
f8fa41602f

+ 68 - 48
fs-admin/src/main/java/com/fs/his/controller/JstOrderSyncController.java

@@ -1,6 +1,10 @@
 package com.fs.his.controller;
 
 import com.baidu.dev2.thirdparty.commons.codec.digest.DigestUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fs.erp.dto.OrderItemDTO;
+import com.fs.erp.dto.PaymentDTO;
+import com.fs.erp.dto.ShopOrderDTO;
 import com.fs.erp.dto.tl.*;
 import com.fs.erp.service.TlErpOrderService;
 import lombok.extern.slf4j.Slf4j;
@@ -8,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
 import java.time.Instant;
 import java.util.Collections;
 
@@ -71,7 +76,7 @@ public class JstOrderSyncController {
 
     // 模拟订单同步到兔灵erp接口
     @PostMapping("/create")
-    public Object syncOrderToJst() {
+    public Object syncOrderToJst() throws JsonProcessingException {
         TlCreateOrderRequest request=fillRequest();
         log.info("同步订单请求,corp_id={}, so_id={}",
                 request.getCorpId(),
@@ -83,74 +88,89 @@ public class JstOrderSyncController {
     /**
      * 辅助方法 填充入参对象JstCreateOrderRequest
      * */
+
     private TlCreateOrderRequest fillRequest() {
-        // 1. 创建主请求对象
         TlCreateOrderRequest request = new TlCreateOrderRequest();
-//        request.setCorpId("OGc3zcgK6H334BiPn8JNkVvh");
-        //正式环境企业id
-        request.setCorpId("LwMAMdlBIH7agxn2t9N4Zv40");
+        request.setCorpId("LwMAMdlBIH7agxn2t9N4Zv40"); // 正式环境企业ID
 
-        // 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_20251110_001");
-        // produced_date 也要带时间(测试类是 "2025-11-05T00:00:00Z")
-        item.setProducedDate("2025-11-10T00:00:00Z");
 
-        // 3. 创建订单主体
-        TlOrderItem order = new TlOrderItem();
-        //order.setShopId(18150182);
-        order.setShopId(19415819);
-        order.setSoId("SO_20251105_001");
-        // 使用 ISO 8601 格式:yyyy-MM-dd'T'HH:mm:ss'Z'
+        ShopOrderDTO order = buildOrderItem();
+        request.setData(Collections.singletonList(order));
+
+        TlOptions options = buildOptions();
+        request.setOptions(options);
+
+        return request;
+    }
+
+    // 构建订单主体
+    private ShopOrderDTO buildOrderItem() {
+        ShopOrderDTO order = new ShopOrderDTO();
+        //order.setShopId(18150182);//测试店铺
+        order.setShopId(19415819L);
+        order.setSoId("SO_20251110_001");
         order.setOrderDate("2025-11-10T10:30:00Z");
-        order.setShopStatus("paid");                // 必须是字符串,如 "paid"
+        order.setShopStatus("paid");
         order.setShopBuyerId("buyer_123");
 
-        order.setReceiverAddress("广东省深圳市南山区___科技园A座101");
+        order.setReceiverState("广东省");
+        order.setReceiverCity("深圳市");
+        order.setReceiverDistrict("南山区");
+        order.setReceiverAddress("科技园A座101");
         order.setReceiverName("张三");
-        order.setReceiverMobile("13800138000");
+        //order.setReceiverMobile("13800138000");
 
-        order.setPayAmount(10000);   // 应付金额(分)
-        order.setFreight(0);         // 运费(分)
+        order.setPayAmount(10000.0);
+        order.setFreight(0.0);
 
         order.setRemark("卖家备注");
         order.setBuyerMessage("请发顺丰");
         order.setLabels("测试,同步");
 
-        order.setCreatorName("李四");
-        order.setShopModified("2025-11-05T10:30:00Z");
-        order.setSendDate("2025-11-05T10:30:00Z");
+        //order.setCreatorName("李四");
+        order.setShopModified("2025-11-10T10:30:00Z");
+        //order.setSendDate("2025-11-10T10:30:00Z");
+        order.setLId("cs12345678912");
+        order.setIsCod(false);
 
-        // 关键:is_cod 不能为 null!聚水潭不接受 null 字段
-        order.setIsCod(false);       // 显式设置为 false,避免 null
+        // 设置商品明细和支付信息
+        order.setItems(Collections.singletonList(buildOrderItemDetail()));
+        order.setPay(buildPayDetail());
 
-        // l_id 为空字符串(签名时会被过滤,但保留字段)
-        order.setLId("");
+        return order;
+    }
 
-        // 设置商品明细
-        order.setItems(Collections.singletonList(item));
+    // 构建商品明细
+    private OrderItemDTO buildOrderItemDetail() {
+        OrderItemDTO item = new OrderItemDTO();
+        item.setSkuId("SKU123");
+        item.setShopSkuId("SHOP_SKU_001");
+        item.setAmount(BigDecimal.valueOf(10000));      // 实付金额(分)
+        item.setPrice(BigDecimal.valueOf(10000));       // 单价(分)
+        item.setBasePrice(12000.0);   // 原价(分)
+        item.setQty(1);
+        item.setName("测试商品");
+        item.setOuterOiId("OI_20251110_001");
+        item.setProducedDate("2025-11-10T00:00:00Z");
+        return item;
+    }
 
-        // 设置支付明细(必须设置,不能为 null)
-        TlPayDetail pay = new TlPayDetail();
+    // 构建支付明细
+    private PaymentDTO buildPayDetail() {
+        PaymentDTO pay = new PaymentDTO();
+        pay.setOuterPayId("PAY_20251110_001"); // 必填
+        pay.setPayDate("2025-11-10T10:30:00Z"); // 必填,RFC3339
         pay.setPayment("online");
-        pay.setAmount(10000);
-        order.setPay(pay);
-
-        // 4. 设置 data 列表(仅支持1条)
-        request.setData(Collections.singletonList(order));
+        pay.setSellerAccount("alipay@company.com"); // 必填
+        pay.setBuyerAccount("buyer@example.com");   // 必填
+        pay.setAmount(10000.0);
+        return pay;
+    }
 
-        // 5. 设置 options
+    // 构建选项
+    private TlOptions buildOptions() {
         TlOptions options = new TlOptions();
         options.setJstServerId(1);
-        request.setOptions(options);
-
-        return request;
+        return options;
     }
 }

+ 3 - 2
fs-service/src/main/java/com/fs/erp/dto/tl/TlIdCardInfo.java

@@ -5,10 +5,11 @@ import lombok.Data;
 
 @Data
 public class TlIdCardInfo {
-    // 姓名
+    /** 姓名 - 必填 */
+    @JsonProperty("name")
     private String name;
 
-    // 身份证号
+    /** 身份证号 - 必填 */
     @JsonProperty("card_id")
     private String cardId;
 }

+ 76 - 20
fs-service/src/main/java/com/fs/erp/dto/tl/TlOrderItem.java

@@ -19,7 +19,7 @@ public class TlOrderItem {
     @JsonProperty("so_id")
     private String soId;
 
-    /** 下单时间,格式:yyyy-MM-dd HH:mm:ss */
+    /** 下单时间,格式:RFC3339,如 "2025-10-02T16:00:23Z" */
     @JsonProperty("order_date")
     private String orderDate;
 
@@ -31,19 +31,45 @@ public class TlOrderItem {
     @JsonProperty("shop_buyer_id")
     private String shopBuyerId;
 
-    /** 收货地址 */
+    // --- 收货地址相关 ---
+    /** 收货省份(可选,若 receiver_address 包含完整地址则可不传) */
+    @JsonProperty("receiver_state")
+    private String receiverState;
+
+    /** 收货市 */
+    @JsonProperty("receiver_city")
+    private String receiverCity;
+
+    /** 收货区/街道 */
+    @JsonProperty("receiver_district")
+    private String receiverDistrict;
+
+    /** 收货街道(更细粒度) */
+    @JsonProperty("receiver_town")
+    private String receiverTown;
+
+    /** 邮政编码 */
+    @JsonProperty("receiver_zip")
+    private String receiverZip;
+
+    /** 收货地址(必填),长度<=200;用 "___" 分隔详细地址1和2 */
     @JsonProperty("receiver_address")
     private String receiverAddress;
 
-    /** 收货人姓名 */
+    /** 收件人姓名(必填) */
     @JsonProperty("receiver_name")
     private String receiverName;
 
-    /** 收货人手机号 */
+    /** 联系电话(与 receiver_mobile 二选一) */
+    @JsonProperty("receiver_phone")
+    private String receiverPhone;
+
+    /** 手机号(与 receiver_phone 二选一,必填其一) */
     @JsonProperty("receiver_mobile")
     private String receiverMobile;
 
-    /** 应付金额(单位:分) */
+    // --- 金额与状态 ---
+    /** 应付金额(单位:分,注意文档中类型为 integer,但描述为保留两位小数 → 实际应为“分”) */
     @JsonProperty("pay_amount")
     private Integer payAmount;
 
@@ -59,35 +85,65 @@ public class TlOrderItem {
     @JsonProperty("buyer_message")
     private String buyerMessage;
 
-    /** 是否货到付款(COD) */
+    /** 是否货到付款 */
     @JsonProperty("is_cod")
     private Boolean isCod;
 
-    /** 订单最后修改时间,格式:yyyy-MM-dd HH:mm:ss */
+    /** 订单最后修改时间,RFC3339 格式 */
     @JsonProperty("shop_modified")
     private String shopModified;
 
-    /** 订单标签,多个用英文逗号分隔,如 "测试,同步" */
+    // --- 物流信息 ---
+    /** 快递单号(物流单号) */
+    @JsonProperty("l_id")
+    private String lId;
+
+    /** 快递公司名称 */
+    @JsonProperty("logistics_company")
+    private String logisticsCompany;
+
+    /** 快递公司编码(需在聚水潭系统中预先配置) */
+    @JsonProperty("lc_id")
+    private String lcId;
+
+    // --- 其他业务字段 ---
+    /** 订单标签,多个用英文逗号分隔,单个标签 ≤10 字符,总长 ≤200 */
     @JsonProperty("labels")
     private String labels;
 
-    /** 订单创建人姓名 */
-    @JsonProperty("creator_name")
-    private String creatorName;
+    /** 订单异常描述 */
+    @JsonProperty("question_desc")
+    private String questionDesc;
 
-    /** 发货时间,格式:yyyy-MM-dd HH:mm:ss */
-    @JsonProperty("send_date")
-    private String sendDate;
-
-    /** 物流单ID(可为空字符串,签名时会被过滤) */
-    @JsonProperty("l_id")
-    private String lId;
+    /** 卖家旗帜(默认 0) */
+    @JsonProperty("seller_flag")
+    private Integer sellerFlag;
 
-    /** 商品明细列表 */
+    /** 商品明细列表(必填) */
     @JsonProperty("items")
     private List<TlOrderItemDetail> items;
 
-    /** 支付明细(可选) */
+    /** 支付明细(必填) */
     @JsonProperty("pay")
     private TlPayDetail pay;
+
+    /** 身份证信息(可选) */
+    @JsonProperty("cart")
+    private TlIdCardInfo cart;
+
+    /** 发货日期,RFC3339 格式(必填) */
+    @JsonProperty("send_date")
+    private String sendDate;
+
+    /** 线下备注 */
+    @JsonProperty("node")
+    private String node;
+
+    /** 业务员 ID */
+    @JsonProperty("creator")
+    private Integer creator;
+
+    /** 业务员名称(必填) */
+    @JsonProperty("creator_name")
+    private String creatorName;
 }

+ 17 - 9
fs-service/src/main/java/com/fs/erp/dto/tl/TlOrderItemDetail.java

@@ -9,39 +9,47 @@ import lombok.Data;
 @Data
 public class TlOrderItemDetail {
 
-    /** 商品 SKU 编码(平台 SKU) */
+    /** 商品 SKU 编码(平台 SKU) - 必填 */
     @JsonProperty("sku_id")
     private String skuId;
 
-    /** 店铺商品 SKU 编码 */
+    /** 店铺商品 SKU 编码 - 必填 */
     @JsonProperty("shop_sku_id")
     private String shopSkuId;
 
-    /** 商品实付金额(单位:分) */
+    /** 商品实付金额(单位:分) - 必填 */
     @JsonProperty("amount")
     private Integer amount;
 
-    /** 商品单价(单位:分) */
+    /** 商品单价(单位:分,支持4位小数 → 实际应为“万分之一元”,但文档写 integer,建议确认) */
     @JsonProperty("price")
     private Integer price;
 
-    /** 商品原价(单位:分) */
+    /** 商品原价(单位:分) - 必填 */
     @JsonProperty("base_price")
     private Integer basePrice;
 
-    /** 商品数量 */
+    /** 商品数量 - 必填 */
     @JsonProperty("qty")
     private Integer qty;
 
-    /** 商品名称 */
+    /** 商品名称(≤100字符) - 必填 */
     @JsonProperty("name")
     private String name;
 
-    /** 商家子订单号(outer_oi_id) */
+    /** 商家子订单号(订单内唯一) - 必填 */
     @JsonProperty("outer_oi_id")
     private String outerOiId;
 
-    /** 生产日期,格式:yyyy-MM-dd(仅日期,不含时间) */
+    /** 订单明细备注 */
+    @JsonProperty("remark")
+    private String remark;
+
+    /** 生产批次号(需开启批次管理) */
+    @JsonProperty("batch_id")
+    private String batchId;
+
+    /** 生产日期,RFC3339 格式(如 "2025-10-02T00:00:00Z") - 必填 */
     @JsonProperty("produced_date")
     private String producedDate;
 }

+ 19 - 3
fs-service/src/main/java/com/fs/erp/dto/tl/TlPayDetail.java

@@ -4,16 +4,32 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 /**
- * 支付明细信息
+ * 支付明细信息(必填)
  */
 @Data
 public class TlPayDetail {
 
-    /** 支付方式:如 "online"(在线支付)、"offline"(线下支付) */
+    /** 外部支付单号(≤50字符) - 必填 */
+    @JsonProperty("outer_pay_id")
+    private String outerPayId;
+
+    /** 支付日期,RFC3339 格式 - 必填 */
+    @JsonProperty("pay_date")
+    private String payDate;
+
+    /** 支付方式(自定义,≤20字符) - 必填 */
     @JsonProperty("payment")
     private String payment;
 
-    /** 支付金额(单位:分) */
+    /** 收款账户(≤50字符) - 必填 */
+    @JsonProperty("seller_account")
+    private String sellerAccount;
+
+    /** 买家支付账号(≤200字符) - 必填 */
+    @JsonProperty("buyer_account")
+    private String buyerAccount;
+
+    /** 支付总额(单位:分) - 必填 */
     @JsonProperty("amount")
     private Integer amount;
 }