From fb9b58049c7a484b8285e1d05722bf8586364e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=AE=87=E5=A5=87?= Date: Tue, 29 Apr 2025 18:32:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=89=A9=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xkt/dto/express/ExpressCancelReqDTO.java | 19 ++++++++++ .../com/ruoyi/xkt/manager/ExpressManager.java | 9 +++++ .../manager/impl/YtoExpressManagerImpl.java | 37 +++++++++++++++++-- .../manager/impl/ZtoExpressManagerImpl.java | 29 +++++++++++++++ .../thirdpart/yto/YtoCancelOrderParam.java | 19 ++++++++++ .../thirdpart/zto/ZtoCancelOrderParam.java | 23 ++++++++++++ 6 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressCancelReqDTO.java create mode 100644 xkt/src/main/java/com/ruoyi/xkt/thirdpart/yto/YtoCancelOrderParam.java create mode 100644 xkt/src/main/java/com/ruoyi/xkt/thirdpart/zto/ZtoCancelOrderParam.java diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressCancelReqDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressCancelReqDTO.java new file mode 100644 index 000000000..6da1cd8d8 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressCancelReqDTO.java @@ -0,0 +1,19 @@ +package com.ruoyi.xkt.dto.express; + +import lombok.Data; + +/** + * @author liangyq + * @date 2025-04-29 17:57 + */ +@Data +public class ExpressCancelReqDTO { + /** + * 请求号 + */ + private String expressReqNo; + /** + * 运单号 + */ + private String expressWaybillNo; +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/manager/ExpressManager.java b/xkt/src/main/java/com/ruoyi/xkt/manager/ExpressManager.java index 09cb519e9..a12e61a43 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/manager/ExpressManager.java +++ b/xkt/src/main/java/com/ruoyi/xkt/manager/ExpressManager.java @@ -1,5 +1,6 @@ package com.ruoyi.xkt.manager; +import com.ruoyi.xkt.dto.express.ExpressCancelReqDTO; import com.ruoyi.xkt.dto.express.ExpressPrintDTO; import com.ruoyi.xkt.dto.express.ExpressShipReqDTO; import com.ruoyi.xkt.enums.EExpressChannel; @@ -27,6 +28,14 @@ public interface ExpressManager { */ String shipStoreOrder(ExpressShipReqDTO shipReqDTO); + /** + * 取消发货 + * + * @param cancelReqDTO + * @return + */ + boolean cancelShipOrder(ExpressCancelReqDTO cancelReqDTO); + /** * 打印面单 * diff --git a/xkt/src/main/java/com/ruoyi/xkt/manager/impl/YtoExpressManagerImpl.java b/xkt/src/main/java/com/ruoyi/xkt/manager/impl/YtoExpressManagerImpl.java index 70e20f59a..4dd042adb 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/manager/impl/YtoExpressManagerImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/manager/impl/YtoExpressManagerImpl.java @@ -6,14 +6,12 @@ import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.xkt.dto.express.ExpressCancelReqDTO; import com.ruoyi.xkt.dto.express.ExpressPrintDTO; import com.ruoyi.xkt.dto.express.ExpressShipReqDTO; import com.ruoyi.xkt.enums.EExpressChannel; import com.ruoyi.xkt.manager.ExpressManager; -import com.ruoyi.xkt.thirdpart.yto.YtoCreateOrderParam; -import com.ruoyi.xkt.thirdpart.yto.YtoPrintOrderParam; -import com.ruoyi.xkt.thirdpart.yto.YtoPublicRequest; -import com.ruoyi.xkt.thirdpart.yto.YtoSignUtil; +import com.ruoyi.xkt.thirdpart.yto.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -75,6 +73,37 @@ public class YtoExpressManagerImpl implements ExpressManager { throw new ServiceException("圆通订单创建失败"); } + @Override + public boolean cancelShipOrder(ExpressCancelReqDTO cancelReqDTO) { + Assert.notNull(cancelReqDTO); + Assert.notEmpty(cancelReqDTO.getExpressReqNo()); + YtoCancelOrderParam cancelOrderParam = new YtoCancelOrderParam(); + cancelOrderParam.setLogisticsNo(cancelReqDTO.getExpressReqNo()); + cancelOrderParam.setCancelDesc("订单取消"); + try { + String param = JSONUtil.toJsonStr(cancelOrderParam); + String sign = YtoSignUtil.sign("korder_cancel_adapter", "v1", param, appSecret); + YtoPublicRequest request = YtoPublicRequest.builder() + .timestamp(System.currentTimeMillis()) + .param(param) + .format(YtoPublicRequest.EFormat.JSON) + .sign(sign).build(); + String rtnStr = HttpUtil.post(gatewayUrl + "open/korder_cancel_adapter/v1/N364gM/" + appKey, + JSONUtil.toJsonStr(request)); + log.info("圆通订单取消返回信息: {}", rtnStr); + JSONObject rtnJson = JSONUtil.parseObj(rtnStr); + String logisticsNo = rtnJson.getStr("logisticsNo"); + if (StrUtil.isNotEmpty(logisticsNo) + && logisticsNo.equals(cancelOrderParam.getLogisticsNo())) { + return true; + } + } catch (Exception e) { + log.error("圆通订单取消异常", e); + } + log.warn("圆通订单取消失败: {}", cancelReqDTO); + return false; + } + @Override public List printOrder(Collection waybillNos) { Assert.notEmpty(waybillNos); diff --git a/xkt/src/main/java/com/ruoyi/xkt/manager/impl/ZtoExpressManagerImpl.java b/xkt/src/main/java/com/ruoyi/xkt/manager/impl/ZtoExpressManagerImpl.java index fedd6cb61..9fecc4d87 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/manager/impl/ZtoExpressManagerImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/manager/impl/ZtoExpressManagerImpl.java @@ -7,6 +7,7 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.xkt.dto.express.ExpressCancelReqDTO; import com.ruoyi.xkt.dto.express.ExpressPrintDTO; import com.ruoyi.xkt.dto.express.ExpressShipReqDTO; import com.ruoyi.xkt.enums.EExpressChannel; @@ -33,6 +34,8 @@ public class ZtoExpressManagerImpl implements ExpressManager, InitializingBean { private static final String CREATE_ORDER_URI = "zto.open.createOrder"; + private static final String CANCEL_ORDER_URI = "zto.open.cancelPreOrder"; + private static final String STRUCTURE_ADDRESS_URI = "zto.innovate.structureNamePhoneAddress"; public static final String ORDER_PRINT_URI = "zto.open.order.print"; @@ -86,6 +89,32 @@ public class ZtoExpressManagerImpl implements ExpressManager, InitializingBean { throw new ServiceException("中通订单创建失败"); } + @Override + public boolean cancelShipOrder(ExpressCancelReqDTO cancelReqDTO) { + Assert.notNull(cancelReqDTO); + Assert.notEmpty(cancelReqDTO.getExpressWaybillNo()); + ZtoCancelOrderParam cancelOrderParam = new ZtoCancelOrderParam(); + cancelOrderParam.setBillCode(cancelReqDTO.getExpressWaybillNo()); + cancelOrderParam.setCancelType("1"); + ZopPublicRequest request = new ZopPublicRequest(); + request.setBody(JSONUtil.toJsonStr(cancelOrderParam)); + request.setUrl(gatewayUrl + CANCEL_ORDER_URI); + request.setEncryptionType(EncryptionType.MD5); + try { + String bodyStr = client.execute(request); + log.info("中通订单取消返回信息: {}", bodyStr); + JSONObject bodyJson = JSONUtil.parseObj(bodyStr); + boolean success = bodyJson.getBool("status"); + if (success) { + return true; + } + } catch (Exception e) { + log.error("中通订单取消异常", e); + } + log.warn("中通订单取消失败: {}", cancelReqDTO); + return false; + } + @Override public List printOrder(Collection waybillNos) { Assert.notEmpty(waybillNos); diff --git a/xkt/src/main/java/com/ruoyi/xkt/thirdpart/yto/YtoCancelOrderParam.java b/xkt/src/main/java/com/ruoyi/xkt/thirdpart/yto/YtoCancelOrderParam.java new file mode 100644 index 000000000..1010a53f7 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/thirdpart/yto/YtoCancelOrderParam.java @@ -0,0 +1,19 @@ +package com.ruoyi.xkt.thirdpart.yto; + +import lombok.Data; + +/** + * @author liangyq + * @date 2025-04-29 18:13 + */ +@Data +public class YtoCancelOrderParam { + /** + * 物流单号,打印拉取运单号前,物流单号和渠道唯一确定一笔快递物流订单。 + */ + private String logisticsNo; + /** + * 取消原因 + */ + private String cancelDesc; +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/thirdpart/zto/ZtoCancelOrderParam.java b/xkt/src/main/java/com/ruoyi/xkt/thirdpart/zto/ZtoCancelOrderParam.java new file mode 100644 index 000000000..6476c9520 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/thirdpart/zto/ZtoCancelOrderParam.java @@ -0,0 +1,23 @@ +package com.ruoyi.xkt.thirdpart.zto; + +import lombok.Data; + +/** + * @author liangyq + * @date 2025-04-29 18:11 + */ +@Data +public class ZtoCancelOrderParam { + /** + * 取消类型 1不想寄了,2下错单,3重复下单,4运费太贵,5无人联系,6取件太慢,7态度差 + */ + private String cancelType; + /** + * 预约件订单号(orderCode与billCode必传其一) + */ + private String orderCode; + /** + * 运单号(orderCode与billCode必传其一) + */ + private String billCode; +}