Selaa lähdekoodia

顺丰预下单 下单 取消接口

zxfqwert 1 viikko sitten
vanhempi
commit
25424776f7

+ 235 - 37
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/SFLogisticsService.java

@@ -1,10 +1,14 @@
 package com.ruoyi.logistics.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.common.redis.service.RedisIdGenerator;
 import com.ruoyi.logistics.config.SFExpressConfig;
+import com.ruoyi.logistics.domain.BizWaybillOrder;
 import com.ruoyi.logistics.domain.LogisticsOrder;
 import com.ruoyi.logistics.service.LogisticsService;
+import com.ruoyi.logistics.util.SFExpressHttpUtil;
 import com.sf.csim.express.service.CallExpressServiceTools;
 import com.sf.csim.express.service.HttpClientUtil;
 import com.sf.csim.express.service.IServiceCodeStandard;
@@ -15,6 +19,13 @@ import org.springframework.stereotype.Service;
 import java.io.UnsupportedEncodingException;
 import java.util.*;
 
+
+/**
+ * 顺丰物流实现
+ *
+ * @author RuiJing
+ * @date 2026-02-02
+ */
 @Service
 public class SFLogisticsService implements LogisticsService {
 
@@ -22,28 +33,98 @@ public class SFLogisticsService implements LogisticsService {
     private SFExpressConfig sfExpressConfig;
     @Autowired
     private RedisIdGenerator redisIdGenerator;
+
+    /**
+     * 顺丰物流预下单接口
+     *
+     * @author zxf
+     * @date 2026-02-02
+     */
     @Override
-    public String createOrder(LogisticsOrder logisticsOrder) throws UnsupportedEncodingException {
-        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CREATE_ORDER; //下订单
+    public JSONObject precheckOrder(BizWaybillOrder bizWaybillOrder) {
+        SFExpressHttpUtil sfExpressHttpUtil = new SFExpressHttpUtil(sfExpressConfig.getClientCode(), sfExpressConfig.getCheckWord(), sfExpressConfig.getCurrentApiUrl());
+        String serviceCode = "EXP_RECE_PRE_ORDER";
+        /* 物流预下单请求参数*/
+        JSONObject msgData = new JSONObject();
+        //预下单接口已拿到订单id 下单需要用到这个id
+
+        String orderId = redisIdGenerator.generateUniqueId("RJSD");
+        msgData.put("orderId", orderId);
+        msgData.put("cargoName", bizWaybillOrder.getGoodsName());
+        msgData.put("monthlyCard", sfExpressConfig.getMonthlyCord());
+        msgData.put("totalWeight", bizWaybillOrder.getGoodsWeight());
+       /* 快递产品类别  目前未定义  先写死
+        1 顺丰特快
+        2 顺丰标快
+        6 顺丰即日*/
+        msgData.put("expressTypeId", 1);
+        //包裹数  未定义  非必填
+        msgData.put("parcelQty", 1);
+        //收寄方地址参数
+        List<Map<String, Object>> contactInfoList = new ArrayList<>();
+        Map<String, Object> Consignor = new HashMap<>();
+        Consignor.put("contactType",1);
+        Consignor.put("mobile", bizWaybillOrder.getSenderPhone());
+        Consignor.put("province", bizWaybillOrder.getSenderProvince());
+        Consignor.put("city", bizWaybillOrder.getSenderCity());
+        Consignor.put("county", bizWaybillOrder.getSenderCounty());
+        Consignor.put("address", bizWaybillOrder.getSenderAddress());
+        contactInfoList.add(Consignor);
+        Map<String, Object> Consignee = new HashMap<>();
+        Consignee.put("contactType", 2);
+        Consignee.put("mobile", bizWaybillOrder.getReceiverPhone());
+        Consignee.put("province", bizWaybillOrder.getReceiverProvince());
+        Consignee.put("city", bizWaybillOrder.getReceiverCity());
+        Consignee.put("county", bizWaybillOrder.getReceiverCounty());
+        Consignee.put("address", bizWaybillOrder.getReceiverAddress());
+        contactInfoList.add(Consignee);
+        msgData.put("contactInfoList",contactInfoList);
+        String result = sfExpressHttpUtil.sendRequest(serviceCode, msgData.toJSONString());
+        JSONObject jsonObject = JSON.parseObject(result).getJSONObject("apiResultData");
+        JSONObject resultInfo = new JSONObject();
+        if (jsonObject != null && jsonObject.containsKey("success") && jsonObject.getBooleanValue("success")) {
+            bizWaybillOrder.setWaybillNo(orderId);
+            resultInfo.put("success", true);
+            resultInfo.put("data", bizWaybillOrder);
+            resultInfo.put("msg", "预下单校验成功!");
+            return resultInfo;
+        } else {
+            resultInfo.put("success", false);
+            resultInfo.put("data", null);
+            resultInfo.put("msg", "预下单校验失败!失败原因:"+jsonObject.get("errorMsg"));
+            return resultInfo;
+        }
 
+
+    }
+    /**
+     * 顺丰物流下单接口
+     *
+     * @author zxf
+     * @date 2026-02-02
+     */
+    @Override
+    public JSONObject createOrder(BizWaybillOrder bizWaybillOrder) {
+        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CREATE_ORDER; //下订单
         CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
         Map<String, String> params = new HashMap<String, String>();
         String timeStamp = String.valueOf(System.currentTimeMillis());
         Map<String,Object> orderData= new HashMap<>();
         orderData.put("language","zh_CN");
-        orderData.put("orderId",redisIdGenerator.generateUniqueId("RJSD"));//客户订单号,重复使用订单号时返回第一次下单成功时的运单信息
-        orderData.put("monthlyCard","7551234567");//月结账户
-        orderData.put("parcelQty",3);
+        //预下单 已返回订单id
+        orderData.put("orderId",bizWaybillOrder.getWaybillNo());
+        orderData.put("monthlyCard",sfExpressConfig.getMonthlyCord());//月结账户
+        //包裹数目前字段没有
+        orderData.put("parcelQty",1);
         //商品信息
         List<Map<String,Object>> cargoDetails = new ArrayList<>();
         Map cargo=new HashMap<>();
-        cargo.put("name","笔记本");
-        cargo.put("count",1);
-        cargo.put("unit","个");
-        cargo.put("weight",1.012);
-        cargo.put("amount",4999.189);
+        cargo.put("name",bizWaybillOrder.getGoodsName());
+        cargo.put("count",bizWaybillOrder.getGoodsQty());
+        cargo.put("weight",bizWaybillOrder.getGoodsWeight());
         cargoDetails.add(cargo);
         orderData.put("cargoDetails",cargoDetails);
+
         //增值服务信息 serviceList":[{"name":"INSURE","value":"500"}]
         List<Map<String,Object>> serviceList = new ArrayList<>();
         Map service=new HashMap<>();
@@ -53,48 +134,165 @@ public class SFLogisticsService implements LogisticsService {
         orderData.put("serviceList",serviceList);
         //收寄双方信息
         List<Map<String,Object>> contactInfoList = new ArrayList<>();
-        Map contactInfo1=new HashMap<>();
-        contactInfo1.put("address","河南省洛阳市洛龙区科技园街道和风雅叙");
-        contactInfo1.put("contact","张三");
-        contactInfo1.put("contactType",1);
-        contactInfo1.put("country","CN");
-        contactInfo1.put("postCode","580058");
-        contactInfo1.put("tel","15639072145");
-        contactInfoList.add(contactInfo1);
-        Map contactInfo=new HashMap<>();
-        contactInfo.put("address","河南省郑州市惠济区美景麟起城");
-        contactInfo.put("company","神州");
-        contactInfo.put("contact","小乔");
-        contactInfo.put("contactType",2);
-        contactInfo.put("country","CN");
-        contactInfo.put("tel","15539739074");
-        contactInfoList.add(contactInfo1);
-        contactInfoList.add(contactInfo);
+        Map<String,Object> Consignor= new HashMap<>();
+        Consignor.put("contactType","1");
+        Consignor.put("mobile",bizWaybillOrder.getSenderPhone());
+        Consignor.put("province",bizWaybillOrder.getSenderProvince());
+        Consignor.put("city",bizWaybillOrder.getSenderCity());
+        Consignor.put("county",bizWaybillOrder.getSenderCounty());
+        Consignor.put("address",bizWaybillOrder.getSenderAddress());
+        contactInfoList.add(Consignor);
+        Map<String,Object> Consignee= new HashMap<>();
+        Consignee.put("contactType","2");
+        Consignee.put("mobile",bizWaybillOrder.getReceiverPhone());
+        Consignee.put("province",bizWaybillOrder.getReceiverProvince());
+        Consignee.put("city",bizWaybillOrder.getReceiverCity());
+        Consignee.put("county",bizWaybillOrder.getReceiverCounty());
+        Consignee.put("address",bizWaybillOrder.getReceiverAddress());
+        contactInfoList.add(Consignee);
         orderData.put("contactInfoList",contactInfoList);
+        try {
+        String msgData =tools.packageMsgData(standardService);
+        msgData= JSON.toJSONString(orderData);
+        params.put("partnerID", sfExpressConfig.getClientCode());  // 顾客编码 ,对应丰桥上获取的clientCode
+        params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
+        params.put("serviceCode",standardService.getCode());// 接口服务码
+        params.put("timestamp", timeStamp);
+        params.put("msgData", msgData);
+        params.put("msgDigest", tools.getMsgDigest(msgData, timeStamp, sfExpressConfig.getCheckWord()));
+        String result = HttpClientUtil.post(sfExpressConfig.getCurrentApiUrl(), params);
+        JSONObject jsonObject = JSON.parseObject(result);
 
+        return jsonObject;
+        }catch(Exception e){
+            throw new RuntimeException();
+        }
+
+
+    }
+
+
+    /**
+     * 顺丰物流取消订单接口
+     * 客服描述 订单揽收前 可以进行取消订单或者修改订单信息
+     * @author zxf
+     * @date 2026-02-02
+     */
+    @Override
+    public JSONObject cancelOrder(BizWaybillOrder bizWaybillOrder) {
+        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_UPDATE_ORDER;
+        CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
+        Map<String, String> params = new HashMap<String, String>();
+        String timeStamp = String.valueOf(System.currentTimeMillis());
+        Map<String,Object> orderData= new HashMap<>();
+        orderData.put("language","zh_CN");
+        orderData.put("orderId",bizWaybillOrder.getWaybillNo());
+        orderData.put("dealType",2);
         String msgData =tools.packageMsgData(standardService);
         msgData= JSON.toJSONString(orderData);
+        try {
         params.put("partnerID", sfExpressConfig.getClientCode());  // 顾客编码 ,对应丰桥上获取的clientCode
         params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
         params.put("serviceCode",standardService.getCode());// 接口服务码
         params.put("timestamp", timeStamp);
         params.put("msgData", msgData);
         params.put("msgDigest", tools.getMsgDigest(msgData,timeStamp,sfExpressConfig.getCheckWord()));
+        String result = HttpClientUtil.post(sfExpressConfig.getCurrentApiUrl(), params);
+        JSONObject jsonObject = JSON.parseObject(result).getJSONObject("apiResultData");
+        JSONObject resultInfo = new JSONObject();
+            if (jsonObject != null && jsonObject.containsKey("success") && jsonObject.getBooleanValue("success")) {
 
-        // System.out.println(params.get("requestID"));
-        long startTime = System.currentTimeMillis();
+                resultInfo.put("success", true);
+                resultInfo.put("data", bizWaybillOrder);
+                resultInfo.put("msg", "订单取消成功!");
+                return resultInfo;
+            } else {
+                resultInfo.put("success", false);
+                resultInfo.put("msg", "订单取消失败!失败原因:"+jsonObject.get("errorMsg"));
+                return resultInfo;
+            }
+
+        }
+        catch(Exception e){
+            throw new RuntimeException();
+        }
+    }
+    /**
+     * 顺丰物流修改订单接口
+     *
+     * @author zxf
+     * @date 2026-02-02
+     */
+    @Override
+    public JSONObject modifyOrder(BizWaybillOrder bizWaybillOrder) {
+        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_UPDATE_ORDER;
+        CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
+        Map<String, String> params = new HashMap<String, String>();
+        String timeStamp = String.valueOf(System.currentTimeMillis());
+        Map<String,Object> orderData= new HashMap<>();
+        orderData.put("language","zh_CN");
+        orderData.put("orderId",bizWaybillOrder.getWaybillNo());
+        orderData.put("dealType",1);
 
 
 
-        //  System.out.println("====调用请求:" + params.get("msgData"));
-        System.out.println("====调用实际请求:" + params);
-        String result = HttpClientUtil.post(sfExpressConfig.getCurrentApiUrl(), params);
 
-        System.out.println("====调用丰桥的接口服务代码:" + String.valueOf(standardService.getCode()) + " 接口耗时:"+ String.valueOf(System.currentTimeMillis()-startTime)+"====");
-        System.out.println("===调用地址 ==="+sfExpressConfig.getCurrentApiUrl());
-        System.out.println("===顾客编码 ==="+sfExpressConfig.getClientCode());
-        System.out.println("===返回结果:" +result);
 
-        return result;
+        String msgData =tools.packageMsgData(standardService);
+        msgData= JSON.toJSONString(orderData);
+        try {
+            params.put("partnerID", sfExpressConfig.getClientCode());  // 顾客编码 ,对应丰桥上获取的clientCode
+            params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
+            params.put("serviceCode",standardService.getCode());// 接口服务码
+            params.put("timestamp", timeStamp);
+            params.put("msgData", msgData);
+            params.put("msgDigest", tools.getMsgDigest(msgData,timeStamp,sfExpressConfig.getCheckWord()));
+            String result = HttpClientUtil.post(sfExpressConfig.getCurrentApiUrl(), params);
+            JSONObject jsonObject = JSON.parseObject(result).getJSONObject("apiResultData");
+            JSONObject resultInfo = new JSONObject();
+            if (jsonObject != null && jsonObject.containsKey("success") && jsonObject.getBooleanValue("success")) {
+
+                resultInfo.put("success", true);
+                resultInfo.put("data", bizWaybillOrder);
+                resultInfo.put("msg", "订单取消成功!");
+                return resultInfo;
+            } else {
+                resultInfo.put("success", false);
+                resultInfo.put("msg", "订单取消失败!失败原因:"+jsonObject.get("errorMsg"));
+                return resultInfo;
+            }
+
+        }
+        catch(Exception e){
+            throw new RuntimeException();
+        }
+    }
+
+   /* @Override
+    public AjaxResult monthlyCode(LogisticsOrder logisticsOrder) {
+
+        SFExpressHttpUtil sfExpressHttpUtil= new SFExpressHttpUtil(sfExpressConfig.getClientCode(),sfExpressConfig.getCheckWord(),sfExpressConfig.getCurrentApiUrl());
+        String serviceCode="ACSP_CREATE_MONTHLY_CODE";
+        JSONObject msgData = new JSONObject();
+        msgData.put("monthCard",sfExpressConfig.getMonthlyCord());
+        msgData.put("needDynamicCode",true);
+        msgData.put("remak","月结码第一次测试");
+
+        String result= sfExpressHttpUtil.sendRequest(serviceCode,msgData.toJSONString());
+        return AjaxResult.success(result);
     }
+
+    @Override
+    public AjaxResult queryOrder(LogisticsOrder logisticsOrder) {
+
+        SFExpressHttpUtil sfExpressHttpUtil= new SFExpressHttpUtil(sfExpressConfig.getClientCode(),sfExpressConfig.getCheckWord(),sfExpressConfig.getCurrentApiUrl());
+        String serviceCode="EXP_RECE_QUERY_SFWAYBILL";
+        JSONObject msgData = new JSONObject();
+        msgData.put("trackingType","1");
+        msgData.put("trackingNum","RJSD20260123000001");
+
+
+        String result= sfExpressHttpUtil.sendRequest(serviceCode,msgData.toJSONString());
+        return AjaxResult.success(result);
+    }*/
 }