|
|
@@ -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;
|
|
|
+// }
|
|
|
+}
|