diff --git a/yudao-framework/yudao-common/pom.xml b/yudao-framework/yudao-common/pom.xml index f364df7..85cdbd7 100644 --- a/yudao-framework/yudao-common/pom.xml +++ b/yudao-framework/yudao-common/pom.xml @@ -133,6 +133,7 @@ transmittable-thread-local + com.fhs-opensource easy-trans-anno diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java index 1e65aec..c0cf455 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java @@ -38,6 +38,7 @@ public interface ErrorCodeConstants { ErrorCode ORDER_CANCEL_PAID_FAIL = new ErrorCode(1_011_000_033, "交易订单取消支付失败,原因:订单不是【{}】状态"); ErrorCode ORDER_PICK_UP_FAIL_NOT_VERIFY_USER = new ErrorCode(1_011_000_034, "交易订单自提失败,原因:你没有核销该门店订单的权限"); ErrorCode ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS = new ErrorCode(1_011_000_035, "交易订单创建失败,原因:用户积分不足"); + ErrorCode OMS_EXPRESS_ORDER_CREATE_ERROR = new ErrorCode(1_011_000_036, "快递订单创建失败,原因:{}"); // ========== After Sale 模块 1-011-000-100 ========== ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1_011_000_100, "售后单不存在"); diff --git a/yudao-module-mall/yudao-module-trade-biz/pom.xml b/yudao-module-mall/yudao-module-trade-biz/pom.xml index fb046ee..cdb8fb1 100644 --- a/yudao-module-mall/yudao-module-trade-biz/pom.xml +++ b/yudao-module-mall/yudao-module-trade-biz/pom.xml @@ -92,6 +92,14 @@ cn.iocoder.boot yudao-spring-boot-starter-excel + + + + com.github.kuaidi100-api + sdk + 1.0.23 + compile + diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http index 5255d1b..363a1c3 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http @@ -11,4 +11,15 @@ tenant-id: {{adminTenantId}} ### 获得交易订单的物流轨迹 => 成功 GET {{baseUrl}}/trade/order/get-express-track-list?id=21 Authorization: Bearer {{token}} -tenant-id: {{adminTenantId}} \ No newline at end of file +tenant-id: {{adminTenantId}} + + +### 申通快递订单创建 +PUT {{baseUrl}}/trade/order/delivery-STO?id=14 +Authorization: Bearer {{token}} +tenant-id: {{adminTenantId}} + +### 快递100订单创建 +PUT {{baseUrl}}/trade/order/delivery-kuaidi100?id=14 +Authorization: Bearer {{token}} +tenant-id: {{adminTenantId}} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java index a517ea1..96aa5d5 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java @@ -115,6 +115,21 @@ public class TradeOrderController { return success(true); } + @PutMapping("/delivery-STO") + @Operation(summary = "申通快递订单创建") + @PreAuthorize("@ss.hasPermission('trade:order:update')") + public CommonResult deliverySto(@RequestParam("id") Long id) { + tradeOrderUpdateService.deliverySto(id); + return success(true); + } + + @PutMapping("/delivery-kuaidi100") + @Operation(summary = "申通快递(快递100)订单创建") + @PreAuthorize("@ss.hasPermission('trade:order:update')") + public CommonResult deliveryKuaidi100(@RequestParam("id") Long id) { + return success(tradeOrderUpdateService.deliveryKuaidi100(id)); + } + @PutMapping("/update-remark") @Operation(summary = "订单备注") @PreAuthorize("@ss.hasPermission('trade:order:update')") diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java index cd1cee7..1297efd 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java @@ -218,4 +218,7 @@ public interface TradeOrderUpdateService { */ void updateOrderGiveCouponIds(Long userId, Long orderId, List giveCouponIds); + void deliverySto(Long id); + + String deliveryKuaidi100(Long id); } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java index 3cae537..5437fcf 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java @@ -13,6 +13,7 @@ import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; +import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils; import cn.iocoder.yudao.module.member.api.address.MemberAddressApi; import cn.iocoder.yudao.module.member.api.address.dto.MemberAddressRespDTO; import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; @@ -52,23 +53,48 @@ import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService; import cn.iocoder.yudao.module.trade.service.delivery.DeliveryPickUpStoreService; import cn.iocoder.yudao.module.trade.service.message.TradeMessageService; import cn.iocoder.yudao.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO; +import cn.iocoder.yudao.module.trade.service.order.bo.StoOrderCreateContentBo; +import cn.iocoder.yudao.module.trade.service.order.bo.StoRequestBo; +import cn.iocoder.yudao.module.trade.service.order.bo.StoResponseBo; import cn.iocoder.yudao.module.trade.service.order.handler.TradeOrderHandler; import cn.iocoder.yudao.module.trade.service.price.TradePriceService; import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; import cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper; +import cn.iocoder.yudao.module.trade.util.SignatureUtils; +import com.alibaba.fastjson.JSON; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.kuaidi100.sdk.api.LabelV2; +import com.kuaidi100.sdk.contant.ApiInfoConstant; +import com.kuaidi100.sdk.contant.CompanyConstant; +import com.kuaidi100.sdk.contant.PrintType; +import com.kuaidi100.sdk.core.IBaseClient; +import com.kuaidi100.sdk.pojo.HttpResult; +import com.kuaidi100.sdk.request.ManInfo; +import com.kuaidi100.sdk.request.PrintReq; +import com.kuaidi100.sdk.request.labelV2.OrderReq; +import com.kuaidi100.sdk.response.PrintBaseResp; +import com.kuaidi100.sdk.response.PrintCloudData; +import com.kuaidi100.sdk.response.labelV2.OrderResult; +import com.kuaidi100.sdk.response.labelV2.Result; +import com.kuaidi100.sdk.utils.SignUtils; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import javax.validation.constraints.NotNull; +import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; @@ -125,6 +151,21 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { // =================== Order =================== + @Value("${sto.api_url}") + private String api_url; + + @Value("${sto.from_appkey}") + private String from_appkey; + + @Value("${sto.from_code}") + private String from_code; + + @Value("${sto.to_appkey}") + private String to_appkey; + + @Value("${sto.to_code}") + private String to_code; + @Override public AppTradeOrderSettlementRespVO settlementOrder(Long userId, AppTradeOrderSettlementReqVO settlementReqVO) { // 1. 获得收货地址 @@ -403,6 +444,250 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { getSelf().sendDeliveryOrderMessage(order, deliveryReqVO); } + @Override + public void deliverySto(Long id) { + // 1.1 校验并获得交易订单(可发货) + TradeOrderDO order = validateOrderDeliverable(id); + // 1.2 校验 deliveryType 是否为快递,是快递才可以发货 + if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getType())) { + throw exception(ORDER_DELIVERY_FAIL_DELIVERY_TYPE_NOT_EXPRESS); + } + if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.UNDELIVERED.getStatus())) { + throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED); + } + StoOrderCreateContentBo orderCreateContentBo = new StoOrderCreateContentBo(); + orderCreateContentBo.setOrderNo(order.getNo()); + //todo + orderCreateContentBo.setOrderSource("WMYKT"); + + orderCreateContentBo.setBillType("00"); + orderCreateContentBo.setOrderType("01"); + orderCreateContentBo.setSender(new StoOrderCreateContentBo.Sender() + .setName("杨林").setMobile("15325380110") + .setProvince("浙江省").setCity("嘉兴市").setArea("南湖区") + .setAddress("新嘉街道建国北路锦江商务楼3A") + ); + +// String area = AreaUtils.format(order.getReceiverAreaId()); + String[] areas = AreaUtils.format(order.getReceiverAreaId()).split(" "); + orderCreateContentBo.setReceiver(new StoOrderCreateContentBo.Receiver() + .setName(order.getReceiverName()).setMobile(order.getReceiverMobile()) + .setProvince(areas.length > 0 ? areas[0] : "") + .setCity(areas.length > 1 ? areas[1] : "") + .setArea(areas.length > 2 ? areas[2] : "") + .setAddress(order.getReceiverDetailAddress()) + ); + //todo + orderCreateContentBo.setCargo(new StoOrderCreateContentBo.Cargo() + .setBattery("10") + .setGoodsType("小件") + .setGoodsName("测试物品") + ); + orderCreateContentBo.setCustomer(new StoOrderCreateContentBo.Customer() + .setSiteCode("314056") + .setCustomerName("314056015779") + .setSitePwd("JXsto123") + ); + /* orderCreateContentBo.setCustomer(new StoOrderCreateContentBo.Customer() + .setSiteCode("666666") + .setCustomerName("666666000001") + .setSitePwd("abc123") + );*/ + String content = JSON.toJSONString(orderCreateContentBo); + // 创建申通发货订单 + /* StoRequestBo requestBo = new StoRequestBo(); + requestBo.setApi_name("OMS_EXPRESS_ORDER_CREATE"); + requestBo.setContent(content); + requestBo.setFrom_appkey(from_appkey); + requestBo.setFrom_code(from_code); + requestBo.setTo_appkey(to_appkey); + requestBo.setTo_code(to_code); + requestBo.setData_digest(SignatureUtils.getSignature(content, from_appkey));*/ + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + // 将 StoRequestBo 转换为表单参数 + MultiValueMap formData = new LinkedMultiValueMap<>(); + formData.add("api_name", "OMS_EXPRESS_ORDER_CREATE"); + formData.add("content", content); + formData.add("from_appkey", from_appkey); + formData.add("from_code", from_code); + formData.add("to_appkey", to_appkey); + formData.add("to_code", to_code); + formData.add("data_digest", SignatureUtils.getSignature(content, from_appkey)); + // 创建请求实体 + HttpEntity> requestEntity = new HttpEntity<>(formData, headers); + + // 创建RestTemplate + RestTemplate restTemplate = new RestTemplate(); +// try { + // 发送请求并解析响应 + ResponseEntity response = restTemplate.exchange( + api_url, + HttpMethod.POST, + requestEntity, + String.class + ); + String responseBody = new String(response.getBody().getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + +// String responseBody = response.getBody(); + log.info("[deliverySto][申通快递响应内容: {}]", responseBody); + // 手动解析响应 + + StoResponseBo body = JSON.parseObject(responseBody, StoResponseBo.class); + +// StoResponseBo body = response.getBody(); + if (body != null && body.isSuccess()) { + // 2. 更新订单为已发货 + TradeOrderDO updateOrderObj = new TradeOrderDO(); + // 2.1 快递发货 + DeliveryExpressDO express = null; + TradeOrderDeliveryReqVO deliveryReqVO = new TradeOrderDeliveryReqVO(); + deliveryReqVO.setId(order.getId()); + //1是申通 + deliveryReqVO.setLogisticsId(1L); + deliveryReqVO.setLogisticsNo(body.getData().getWaybillNo()); + if (ObjectUtil.notEqual(deliveryReqVO.getLogisticsId(), TradeOrderDO.LOGISTICS_ID_NULL)) { + express = deliveryExpressService.validateDeliveryExpress(deliveryReqVO.getLogisticsId()); + updateOrderObj.setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo()); + } else { + // 2.2 无需发货 + updateOrderObj.setLogisticsId(0L).setLogisticsNo(""); + } + // 执行更新 + updateOrderObj.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()).setDeliveryTime(LocalDateTime.now()); + int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), updateOrderObj); + if (updateCount == 0) { + throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED); + } + + // 3. 记录订单日志 + TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.DELIVERED.getStatus(), + MapUtil.builder().put("deliveryName", express != null ? express.getName() : "") + .put("logisticsNo", express != null ? deliveryReqVO.getLogisticsNo() : "").build()); + + // 4.1 发送站内信 + tradeMessageService.sendMessageWhenDeliveryOrder(new TradeOrderMessageWhenDeliveryOrderReqBO() + .setOrderId(order.getId()).setUserId(order.getUserId()).setMessage(null)); + // 4.2 发送订阅消息 + getSelf().sendDeliveryOrderMessage(order, deliveryReqVO); + } else { + if (body != null) { + throw exception(OMS_EXPRESS_ORDER_CREATE_ERROR, body.getErrorMsg()); + } else { + throw exception(OMS_EXPRESS_ORDER_CREATE_ERROR, "接口无返回内容"); + } + } +// } catch (Exception e) { +// log.error("[deliverySto][申通快递订单创建失败,订单ID:{}]", id, e); +// throw exception(OMS_EXPRESS_ORDER_CREATE_ERROR, e.getMessage()); +// } + + } + + @Override + public String deliveryKuaidi100(Long id) { + // 1.1 校验并获得交易订单(可发货) + TradeOrderDO order = validateOrderDeliverable(id); + // 1.2 校验 deliveryType 是否为快递,是快递才可以发货 + if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getType())) { + throw exception(ORDER_DELIVERY_FAIL_DELIVERY_TYPE_NOT_EXPRESS); + } + if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.UNDELIVERED.getStatus())) { + throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED); + } + + String key = "moaqEZhD6889"; + String secret = "f46d0c0071be4841818482c5ed8c27b5"; + + ManInfo recManInfo = new ManInfo(); + recManInfo.setName(order.getReceiverName()); + recManInfo.setMobile(order.getReceiverMobile()); + recManInfo.setPrintAddr(AreaUtils.format( + order.getReceiverAreaId()).replace(" ", "") + +order.getReceiverDetailAddress()); + + ManInfo sendManInfo = new ManInfo(); + sendManInfo.setName("杨林"); + sendManInfo.setMobile("15325380110"); + sendManInfo.setPrintAddr("浙江省嘉兴市南湖区新嘉街道建国北路锦江商务楼3A"); + + OrderReq orderReq = new OrderReq(); + orderReq.setKuaidicom(CompanyConstant.ST); + orderReq.setCount(1); + orderReq.setPartnerId("314056015779"); + orderReq.setPartnerKey("JXsto123"); + orderReq.setNet("314056"); + orderReq.setCode("44"); +// orderReq.setSiid("siid"); + orderReq.setTempId("bc7291b4521c40d981767247c1e8f52d"); + orderReq.setSendMan(sendManInfo); + orderReq.setRecMan(recManInfo); + +// orderReq.setPrintType(PrintType.CLOUD); + orderReq.setPrintType(PrintType.HTML); + + String param = new Gson().toJson(orderReq); + String t = System.currentTimeMillis() + ""; + + PrintReq printReq = new PrintReq(); + printReq.setT(t); + printReq.setKey(key); + printReq.setSign(SignUtils.printSign(param, t, key, secret)); + printReq.setMethod(ApiInfoConstant.ORDER); + printReq.setParam(param); + + IBaseClient baseClient = new LabelV2(); + try { + HttpResult httpResult = baseClient.execute(printReq); + System.out.println(httpResult); + if (httpResult.getStatus() == org.apache.http.HttpStatus.SC_OK && StringUtils.isNotBlank(httpResult.getBody())){ + Result result = new Gson().fromJson(httpResult.getBody(),new TypeToken>(){}.getType()); + if (result.getCode() == 200){ + // 2. 更新订单为已发货 + TradeOrderDO updateOrderObj = new TradeOrderDO(); + // 2.1 快递发货 + TradeOrderDeliveryReqVO deliveryReqVO = new TradeOrderDeliveryReqVO(); + deliveryReqVO.setId(order.getId()); + //1是申通 + deliveryReqVO.setLogisticsId(1L); + //快递单号 + deliveryReqVO.setLogisticsNo(result.getData().getKuaidinum()); + DeliveryExpressDO express = deliveryExpressService.validateDeliveryExpress(deliveryReqVO.getLogisticsId()); + updateOrderObj.setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo()); + + // 执行更新 + updateOrderObj.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()).setDeliveryTime(LocalDateTime.now()); + int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), updateOrderObj); + if (updateCount == 0) { + throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED); + } + + // 3. 记录订单日志 + TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.DELIVERED.getStatus(), + MapUtil.builder().put("deliveryName", express != null ? express.getName() : "") + .put("logisticsNo", express != null ? deliveryReqVO.getLogisticsNo() : "").build()); + + // 4.1 发送站内信 + tradeMessageService.sendMessageWhenDeliveryOrder(new TradeOrderMessageWhenDeliveryOrderReqBO() + .setOrderId(order.getId()).setUserId(order.getUserId()).setMessage(null)); + // 4.2 发送订阅消息 + getSelf().sendDeliveryOrderMessage(order, deliveryReqVO); + return result.getData().getLabel(); + }else { + throw exception(OMS_EXPRESS_ORDER_CREATE_ERROR, result.getMessage()); + } + }else { + throw exception(OMS_EXPRESS_ORDER_CREATE_ERROR, "接口无返回内容"); + } + } catch (Exception e) { + throw exception(OMS_EXPRESS_ORDER_CREATE_ERROR, e.getMessage()); + } + + } + @Async public void sendDeliveryOrderMessage(TradeOrderDO order, TradeOrderDeliveryReqVO deliveryReqVO) { // 构建并发送模版消息 @@ -928,6 +1213,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { tradeOrderMapper.updateById(new TradeOrderDO().setId(orderId).setGiveCouponIds(giveCouponIds)); } + /** * 创建单个订单的评论 * diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/StoOrderCreateContentBo.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/StoOrderCreateContentBo.java new file mode 100644 index 0000000..d49f8ef --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/StoOrderCreateContentBo.java @@ -0,0 +1,214 @@ +package cn.iocoder.yudao.module.trade.service.order.bo; + +import lombok.Data; + +import java.util.List; + +@Data +public class StoOrderCreateContentBo { + //订单号(客户系统自己生成,唯一) + private String orderNo; + //订单来源(订阅服务时填写的来源编码) + private String orderSource; + //获取面单的类型(00-普通、03-国际、01-代收、02-到付、04-生鲜),默认普通业务,如果有其他业务先与业务方沟通清楚 + private String billType; +// 订单类型(01-普通订单、02-调度订单)默认01-普通订单,如果有散单业务需先业务方沟通清楚 + private String orderType; +// 寄件人信息 + private Sender sender; + //收件人信息 + private Receiver receiver; + //包裹信息 + private Cargo cargo; + //客户信息,在线下单取运单号必填,代单号下单不需要填写,测试账号传值如下,生产账号联系合作业务方提供 + private Customer customer; + //国际订单附属信息(国际业务订单必填,其他业务不要填写) + private InternationalAnnex internationalAnnex; + + private String waybillNo; + + private AssignAnnex assignAnnex; + + private String codValue; + + private String freightCollectValue; + + private String timelessType; + + private String productType; + + private List serviceTypeList; + + private ExtendFieldMap extendFieldMap; + + private String remark; + + private String expressDirection; + + private String createChannel; + + private String regionType; + + private InsuredAnnex insuredAnnex; + + private String expectValue; + + private String payModel; + + /** + * 发货人信息 + */ + @Data + public static class Sender + { + private String name; + + private String tel; + + private String mobile; + + private String postCode; + + private String country; + + private String province; + + private String city; + + private String area; + + private String town; + + private String address; + } + + /** + * 收货人信息 + */ + @Data + public static class Receiver + { + private String name; + + private String tel; + + private String mobile; + + private String postCode; + + private String country; + + private String province; + + private String city; + + private String area; + + private String town; + + private String address; + + private String safeNo; + + } + + @Data + public static class Cargo + { + private String battery; + + private String goodsType; + + private String goodsName; + + private Integer goodsCount; + + private Double spaceX; + + private Double spaceY; + + private Double spaceZ; + + private Double weight; + + private String goodsAmount; + + private List cargoItemList; + + } + + @Data + public static class CargoItem + { + private String serialNumber; + + private String referenceNumber; + + private String productId; + + private String name; + + private int qty; + + private int unitPrice; + + private int amount; + + private String currency; + + private int weight; + + private String remark; + } + + + @Data + public static class Customer + { + private String siteCode; + + private String customerName; + + private String sitePwd; + + private String monthCustomerCode; + } + + + @Data + public static class InternationalAnnex + { + private String internationalProductType; + + private boolean customsDeclaration; + + private String senderCountry; + + private String receiverCountry; + } + + @Data + public static class AssignAnnex + { + private String takeCompanyCode; + + private String takeUserCode; + } + + @Data + public static class ExtendFieldMap + { + private String mapValue; + } + + @Data + public static class InsuredAnnex + { + private String insuredValue; + + private String goodsValue; + + } + + +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/StoRequestBo.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/StoRequestBo.java new file mode 100644 index 0000000..cc4f965 --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/StoRequestBo.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.trade.service.order.bo; + +import lombok.Data; + +/** + * 申通请求公共参数 + */ +@Data +public class StoRequestBo { + // api_name:调用的目标接口ID(控制台列表中称为API,为英文、数字及下划线组成的字串,非API中文名称)。 + private String api_name; +// content:结构化的业务报文体,具体内容由订阅的接口规定(API文档中的 请求参数 表格),可以是 JSON 或 XML 格式的字串。请参考下方“请求示例”,注意:content内容中不允许有特殊字符,例如\u001b。 + private String content; +// from_appkey:订阅方appkey,即合作方应用key。 + private String from_appkey; +// from_code:订阅方资源code,即合作方应用的资源code。 + private String from_code; +// to_appkey:注册方appkey,即提供该订阅接口服务的申通应用key, + private String to_appkey; +// to_code:注册方资源code,即上述申通应用的资源code,目前值等于to_appkey。 + private String to_code; + // data_digest:报文签名,网关会统一校验。构造方法请参考下方“签名构造”。 + private String data_digest; +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/StoResponseBo.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/StoResponseBo.java new file mode 100644 index 0000000..3abb110 --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/StoResponseBo.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.trade.service.order.bo; + +import lombok.Data; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@Data +@XmlRootElement(name = "response") +public class StoResponseBo { + + @XmlElement(name = "success") + private boolean success; + + @XmlElement(name = "errorCode") + private String errorCode; + + @XmlElement(name = "errorMsg") + private String errorMsg; + + @XmlElement(name = "data") + private OrderCreateResponse data; + + @Data + public static class OrderCreateResponse { + private String orderNo; + + private String waybillNo; + + private String bigWord; + + private String packagePlace; + + private String sourceOrderId; + + private String safeNo; + + private String newBlockCode; + } +} diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/util/SignatureUtils.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/util/SignatureUtils.java new file mode 100644 index 0000000..63cd5af --- /dev/null +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/util/SignatureUtils.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.trade.util; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.digest.DigestUtils; + +public class SignatureUtils { + + private SignatureUtils() { + throw new IllegalStateException("SignatureUtils class"); + } + + public static String getSignature(String content, String secretKey) { + String text = content + secretKey; + byte[] md5 = DigestUtils.md5(text); + return Base64.encodeBase64String(md5); + } + + public static void main(String[] args) { + String content="{\"orderNo\":\"8885452262\"}"; + String secretKey="123abc"; + System.out.println(getSignature(content,secretKey)); + } + +} \ No newline at end of file diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 4285195..7e86831 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -80,7 +80,7 @@ spring: host: 127.0.0.1 # 地址 port: 6379 # 端口 database: 0 # 数据库索引 - # password: 123456 # 密码,建议生产环境开启 + password: 123456 # 密码,建议生产环境开启 --- #################### 定时任务相关配置 #################### diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index 5208212..cd5cbdb 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -367,9 +367,9 @@ pf4j: sto: # 正式环境 -# api_url: 'https://cloudinter-linkgateway.sto.cn/gateway/link.do' + api_url: 'https://cloudinter-linkgateway.sto.cn/gateway/link.do' # 测试环境 - api_url: 'http://cloudinter-linkgatewaytest.sto.cn/gateway/link.do' +# api_url: 'http://cloudinter-linkgatewaytest.sto.cn/gateway/link.do' from_appkey: 'CAKWRKlMXSPewDL' from_code: 'CAKWRKlMXSPewDL' to_appkey: 'sto_oms'