feat: 物流

pull/1121/head
梁宇奇 2025-04-29 18:32:29 +08:00
parent 188c12ab69
commit fb9b58049c
6 changed files with 132 additions and 4 deletions

View File

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

View File

@ -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);
/**
*
*

View File

@ -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<ExpressPrintDTO> printOrder(Collection<String> waybillNos) {
Assert.notEmpty(waybillNos);

View File

@ -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<ExpressPrintDTO> printOrder(Collection<String> waybillNos) {
Assert.notEmpty(waybillNos);

View File

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

View File

@ -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;
/**
* orderCodebillCode
*/
private String orderCode;
/**
* orderCodebillCode
*/
private String billCode;
}