diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelEwaybillService.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelEwaybillService.java new file mode 100644 index 0000000000..0c5ed19afa --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelEwaybillService.java @@ -0,0 +1,60 @@ +package me.chanjar.weixin.channel.api; + +import java.util.List; +import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse; +import me.chanjar.weixin.channel.bean.ewaybill.AccountInfoResponse; +import me.chanjar.weixin.channel.bean.ewaybill.AddSubOrderRequest; +import me.chanjar.weixin.channel.bean.ewaybill.CreateOrderRequest; +import me.chanjar.weixin.channel.bean.ewaybill.CreateOrderResponse; +import me.chanjar.weixin.channel.bean.ewaybill.DeliveryListResponse; +import me.chanjar.weixin.channel.bean.ewaybill.OrderDetailResponse; +import me.chanjar.weixin.channel.bean.ewaybill.PreCreateRequest; +import me.chanjar.weixin.channel.bean.ewaybill.PreCreateResponse; +import me.chanjar.weixin.channel.bean.ewaybill.PrintContentResponse; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateConfigResponse; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateCreateRequest; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateIdResponse; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateInfoResponse; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateUpdateRequest; +import me.chanjar.weixin.common.error.WxErrorException; + +/** + * 视频号小店电子面单服务接口 + * + * @author GitHub Copilot + */ +public interface WxChannelEwaybillService { + + TemplateConfigResponse getTemplateConfig() throws WxErrorException; + + TemplateIdResponse createTemplate(TemplateCreateRequest req) throws WxErrorException; + + WxChannelBaseResponse deleteTemplate(String templateId) throws WxErrorException; + + WxChannelBaseResponse updateTemplate(TemplateUpdateRequest req) throws WxErrorException; + + TemplateInfoResponse getTemplate(String templateId) throws WxErrorException; + + TemplateInfoResponse getTemplateById(String templateId) throws WxErrorException; + + AccountInfoResponse getAccount() throws WxErrorException; + + DeliveryListResponse getDeliveryList() throws WxErrorException; + + PreCreateResponse preCreateOrder(PreCreateRequest req) throws WxErrorException; + + CreateOrderResponse createOrder(CreateOrderRequest req) throws WxErrorException; + + WxChannelBaseResponse addSubOrder(AddSubOrderRequest req) throws WxErrorException; + + WxChannelBaseResponse cancelOrder(String waybillId) throws WxErrorException; + + OrderDetailResponse getOrder(String waybillId) throws WxErrorException; + + PrintContentResponse getPrintContent(String waybillId) throws WxErrorException; + + WxChannelBaseResponse printOrder(String waybillId) throws WxErrorException; + + WxChannelBaseResponse batchPrintOrder(List waybillIds) throws WxErrorException; +} + diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelService.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelService.java index 50a029c196..bd9cd619cd 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelService.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelService.java @@ -182,4 +182,11 @@ public interface WxChannelService extends BaseWxChannelService { */ WxChannelLiveDashboardService getLiveDashboardService(); + /** + * 电子面单服务 + * + * @return 电子面单服务 + */ + WxChannelEwaybillService getEwaybillService(); + } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/BaseWxChannelServiceImpl.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/BaseWxChannelServiceImpl.java index 1a608e1f6a..c72a6b30b8 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/BaseWxChannelServiceImpl.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/BaseWxChannelServiceImpl.java @@ -60,6 +60,7 @@ public abstract class BaseWxChannelServiceImpl implements WxChannelService private WxChannelVipService vipService = null; private WxChannelCompassFinderService compassFinderService = null; private WxChannelLiveDashboardService liveDashboardService = null; + private WxChannelEwaybillService ewaybillService = null; protected WxChannelConfig config; private int retrySleepMillis = 1000; @@ -473,4 +474,12 @@ public synchronized WxChannelLiveDashboardService getLiveDashboardService() { return liveDashboardService; } + @Override + public synchronized WxChannelEwaybillService getEwaybillService() { + if (ewaybillService == null) { + ewaybillService = new WxChannelEwaybillServiceImpl(this); + } + return ewaybillService; + } + } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/WxChannelEwaybillServiceImpl.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/WxChannelEwaybillServiceImpl.java new file mode 100644 index 0000000000..921880bac3 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/WxChannelEwaybillServiceImpl.java @@ -0,0 +1,152 @@ +package me.chanjar.weixin.channel.api.impl; + +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.ADD_SUB_ORDER_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.BATCH_PRINT_ORDER_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.CANCEL_ORDER_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.CREATE_ORDER_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.CREATE_TEMPLATE_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.DELETE_TEMPLATE_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.GET_ACCOUNT_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.GET_DELIVERY_LIST_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.GET_ORDER_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.GET_PRINT_CONTENT_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.GET_TEMPLATE_BY_ID_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.GET_TEMPLATE_CONFIG_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.GET_TEMPLATE_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.PRE_CREATE_ORDER_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.PRINT_ORDER_URL; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Ewaybill.UPDATE_TEMPLATE_URL; + +import java.util.List; +import me.chanjar.weixin.channel.api.WxChannelEwaybillService; +import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse; +import me.chanjar.weixin.channel.bean.ewaybill.AccountInfoResponse; +import me.chanjar.weixin.channel.bean.ewaybill.AddSubOrderRequest; +import me.chanjar.weixin.channel.bean.ewaybill.CreateOrderRequest; +import me.chanjar.weixin.channel.bean.ewaybill.CreateOrderResponse; +import me.chanjar.weixin.channel.bean.ewaybill.DeliveryListResponse; +import me.chanjar.weixin.channel.bean.ewaybill.OrderDetailResponse; +import me.chanjar.weixin.channel.bean.ewaybill.PreCreateRequest; +import me.chanjar.weixin.channel.bean.ewaybill.PreCreateResponse; +import me.chanjar.weixin.channel.bean.ewaybill.PrintContentResponse; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateConfigResponse; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateCreateRequest; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateIdParam; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateIdResponse; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateInfoResponse; +import me.chanjar.weixin.channel.bean.ewaybill.TemplateUpdateRequest; +import me.chanjar.weixin.channel.bean.ewaybill.WaybillIdParam; +import me.chanjar.weixin.channel.bean.ewaybill.WaybillIdsParam; +import me.chanjar.weixin.channel.util.ResponseUtils; +import me.chanjar.weixin.common.error.WxErrorException; + +/** + * 视频号小店电子面单服务实现。 + * + * @author GitHub Copilot + */ +public class WxChannelEwaybillServiceImpl implements WxChannelEwaybillService { + + /** 微信商店服务 */ + private final BaseWxChannelServiceImpl shopService; + + public WxChannelEwaybillServiceImpl(BaseWxChannelServiceImpl shopService) { + this.shopService = shopService; + } + + @Override + public TemplateConfigResponse getTemplateConfig() throws WxErrorException { + String resJson = shopService.post(GET_TEMPLATE_CONFIG_URL, "{}"); + return ResponseUtils.decode(resJson, TemplateConfigResponse.class); + } + + @Override + public TemplateIdResponse createTemplate(TemplateCreateRequest req) throws WxErrorException { + String resJson = shopService.post(CREATE_TEMPLATE_URL, req); + return ResponseUtils.decode(resJson, TemplateIdResponse.class); + } + + @Override + public WxChannelBaseResponse deleteTemplate(String templateId) throws WxErrorException { + String resJson = shopService.post(DELETE_TEMPLATE_URL, new TemplateIdParam(templateId)); + return ResponseUtils.decode(resJson, WxChannelBaseResponse.class); + } + + @Override + public WxChannelBaseResponse updateTemplate(TemplateUpdateRequest req) throws WxErrorException { + String resJson = shopService.post(UPDATE_TEMPLATE_URL, req); + return ResponseUtils.decode(resJson, WxChannelBaseResponse.class); + } + + @Override + public TemplateInfoResponse getTemplate(String templateId) throws WxErrorException { + String resJson = shopService.post(GET_TEMPLATE_URL, new TemplateIdParam(templateId)); + return ResponseUtils.decode(resJson, TemplateInfoResponse.class); + } + + @Override + public TemplateInfoResponse getTemplateById(String templateId) throws WxErrorException { + String resJson = shopService.post(GET_TEMPLATE_BY_ID_URL, new TemplateIdParam(templateId)); + return ResponseUtils.decode(resJson, TemplateInfoResponse.class); + } + + @Override + public AccountInfoResponse getAccount() throws WxErrorException { + String resJson = shopService.post(GET_ACCOUNT_URL, "{}"); + return ResponseUtils.decode(resJson, AccountInfoResponse.class); + } + + @Override + public DeliveryListResponse getDeliveryList() throws WxErrorException { + String resJson = shopService.post(GET_DELIVERY_LIST_URL, "{}"); + return ResponseUtils.decode(resJson, DeliveryListResponse.class); + } + + @Override + public PreCreateResponse preCreateOrder(PreCreateRequest req) throws WxErrorException { + String resJson = shopService.post(PRE_CREATE_ORDER_URL, req); + return ResponseUtils.decode(resJson, PreCreateResponse.class); + } + + @Override + public CreateOrderResponse createOrder(CreateOrderRequest req) throws WxErrorException { + String resJson = shopService.post(CREATE_ORDER_URL, req); + return ResponseUtils.decode(resJson, CreateOrderResponse.class); + } + + @Override + public WxChannelBaseResponse addSubOrder(AddSubOrderRequest req) throws WxErrorException { + String resJson = shopService.post(ADD_SUB_ORDER_URL, req); + return ResponseUtils.decode(resJson, WxChannelBaseResponse.class); + } + + @Override + public WxChannelBaseResponse cancelOrder(String waybillId) throws WxErrorException { + String resJson = shopService.post(CANCEL_ORDER_URL, new WaybillIdParam(waybillId)); + return ResponseUtils.decode(resJson, WxChannelBaseResponse.class); + } + + @Override + public OrderDetailResponse getOrder(String waybillId) throws WxErrorException { + String resJson = shopService.post(GET_ORDER_URL, new WaybillIdParam(waybillId)); + return ResponseUtils.decode(resJson, OrderDetailResponse.class); + } + + @Override + public PrintContentResponse getPrintContent(String waybillId) throws WxErrorException { + String resJson = shopService.post(GET_PRINT_CONTENT_URL, new WaybillIdParam(waybillId)); + return ResponseUtils.decode(resJson, PrintContentResponse.class); + } + + @Override + public WxChannelBaseResponse printOrder(String waybillId) throws WxErrorException { + String resJson = shopService.post(PRINT_ORDER_URL, new WaybillIdParam(waybillId)); + return ResponseUtils.decode(resJson, WxChannelBaseResponse.class); + } + + @Override + public WxChannelBaseResponse batchPrintOrder(List waybillIds) throws WxErrorException { + String resJson = shopService.post(BATCH_PRINT_ORDER_URL, new WaybillIdsParam(waybillIds)); + return ResponseUtils.decode(resJson, WxChannelBaseResponse.class); + } +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AbstractEwaybillRequest.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AbstractEwaybillRequest.java new file mode 100644 index 0000000000..b9fce5e89e --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AbstractEwaybillRequest.java @@ -0,0 +1,35 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 电子面单通用请求参数容器。 + * + *

字段按官方文档动态透传,避免非官方字段定义。

+ * + * @author GitHub Copilot + */ +@Data +@NoArgsConstructor +public abstract class AbstractEwaybillRequest implements Serializable { + + private static final long serialVersionUID = 4213577159985597237L; + + private Map params = new LinkedHashMap<>(); + + @JsonAnySetter + public void addParam(String key, Object value) { + params.put(key, value); + } + + @JsonAnyGetter + public Map anyParams() { + return params; + } +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AbstractEwaybillResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AbstractEwaybillResponse.java new file mode 100644 index 0000000000..d0930f8aeb --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AbstractEwaybillResponse.java @@ -0,0 +1,31 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +import com.fasterxml.jackson.annotation.JsonAnySetter; +import java.util.LinkedHashMap; +import java.util.Map; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse; + +/** + * 电子面单通用响应参数容器。 + * + *

未显式声明字段将保存到 extra 字段,便于兼容官方接口变更。

+ * + * @author GitHub Copilot + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public abstract class AbstractEwaybillResponse extends WxChannelBaseResponse { + + private static final long serialVersionUID = -2460196179063989718L; + + private Map extra = new LinkedHashMap<>(); + + @JsonAnySetter + public void addExtra(String key, Object value) { + extra.put(key, value); + } +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AccountInfoResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AccountInfoResponse.java new file mode 100644 index 0000000000..4a460bcc6d --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AccountInfoResponse.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 电子面单网点/账号信息响应。 + * + * @author GitHub Copilot + */ +public class AccountInfoResponse extends AbstractEwaybillResponse { + private static final long serialVersionUID = 5682783958522805959L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AddSubOrderRequest.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AddSubOrderRequest.java new file mode 100644 index 0000000000..2e0b90e1f8 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/AddSubOrderRequest.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 电子面单子件追加请求。 + * + * @author GitHub Copilot + */ +public class AddSubOrderRequest extends AbstractEwaybillRequest { + private static final long serialVersionUID = 4250200603210217269L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/CreateOrderRequest.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/CreateOrderRequest.java new file mode 100644 index 0000000000..87e8bad3cd --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/CreateOrderRequest.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 电子面单取号请求。 + * + * @author GitHub Copilot + */ +public class CreateOrderRequest extends AbstractEwaybillRequest { + private static final long serialVersionUID = 2521225918646916853L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/CreateOrderResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/CreateOrderResponse.java new file mode 100644 index 0000000000..89eafa012d --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/CreateOrderResponse.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 电子面单取号响应。 + * + * @author GitHub Copilot + */ +public class CreateOrderResponse extends AbstractEwaybillResponse { + private static final long serialVersionUID = 9115454170108519187L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/DeliveryListResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/DeliveryListResponse.java new file mode 100644 index 0000000000..eef815afc1 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/DeliveryListResponse.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 开通快递公司列表响应。 + * + * @author GitHub Copilot + */ +public class DeliveryListResponse extends AbstractEwaybillResponse { + private static final long serialVersionUID = 494164885034906535L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/OrderDetailResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/OrderDetailResponse.java new file mode 100644 index 0000000000..4717bdcd6a --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/OrderDetailResponse.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 面单详情响应。 + * + * @author GitHub Copilot + */ +public class OrderDetailResponse extends AbstractEwaybillResponse { + private static final long serialVersionUID = -2406734055149395916L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/PreCreateRequest.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/PreCreateRequest.java new file mode 100644 index 0000000000..b76d4f8c38 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/PreCreateRequest.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 电子面单预取号请求。 + * + * @author GitHub Copilot + */ +public class PreCreateRequest extends AbstractEwaybillRequest { + private static final long serialVersionUID = 3761501770378571724L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/PreCreateResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/PreCreateResponse.java new file mode 100644 index 0000000000..ded9e53dab --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/PreCreateResponse.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 电子面单预取号响应。 + * + * @author GitHub Copilot + */ +public class PreCreateResponse extends AbstractEwaybillResponse { + private static final long serialVersionUID = -6302826807350860584L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/PrintContentResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/PrintContentResponse.java new file mode 100644 index 0000000000..6a66ffca15 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/PrintContentResponse.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 打印报文响应。 + * + * @author GitHub Copilot + */ +public class PrintContentResponse extends AbstractEwaybillResponse { + private static final long serialVersionUID = 1097526332493027364L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateConfigResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateConfigResponse.java new file mode 100644 index 0000000000..f97a7ef52f --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateConfigResponse.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 面单标准模板响应。 + * + * @author GitHub Copilot + */ +public class TemplateConfigResponse extends AbstractEwaybillResponse { + private static final long serialVersionUID = 6779567498624326386L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateCreateRequest.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateCreateRequest.java new file mode 100644 index 0000000000..382f355645 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateCreateRequest.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 新增面单模板请求。 + * + * @author GitHub Copilot + */ +public class TemplateCreateRequest extends AbstractEwaybillRequest { + private static final long serialVersionUID = 2974771986022948202L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateIdParam.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateIdParam.java new file mode 100644 index 0000000000..5289c45231 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateIdParam.java @@ -0,0 +1,22 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 模板ID请求参数。 + * + * @author GitHub Copilot + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TemplateIdParam implements Serializable { + private static final long serialVersionUID = -2397006631686547550L; + + @JsonProperty("template_id") + private String templateId; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateIdResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateIdResponse.java new file mode 100644 index 0000000000..878ef5b25c --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateIdResponse.java @@ -0,0 +1,21 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 面单模板ID响应。 + * + * @author GitHub Copilot + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class TemplateIdResponse extends AbstractEwaybillResponse { + private static final long serialVersionUID = -6756111662032438585L; + + @JsonProperty("template_id") + private String templateId; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateInfoResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateInfoResponse.java new file mode 100644 index 0000000000..62d50dc148 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateInfoResponse.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 面单模板信息响应。 + * + * @author GitHub Copilot + */ +public class TemplateInfoResponse extends AbstractEwaybillResponse { + private static final long serialVersionUID = 5718279884380636289L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateUpdateRequest.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateUpdateRequest.java new file mode 100644 index 0000000000..752aea3043 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/TemplateUpdateRequest.java @@ -0,0 +1,10 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +/** + * 更新面单模板请求。 + * + * @author GitHub Copilot + */ +public class TemplateUpdateRequest extends AbstractEwaybillRequest { + private static final long serialVersionUID = -6201137374059216895L; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/WaybillIdParam.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/WaybillIdParam.java new file mode 100644 index 0000000000..a62821d32c --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/WaybillIdParam.java @@ -0,0 +1,22 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 运单ID请求参数。 + * + * @author GitHub Copilot + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class WaybillIdParam implements Serializable { + private static final long serialVersionUID = -7601452772833268240L; + + @JsonProperty("waybill_id") + private String waybillId; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/WaybillIdsParam.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/WaybillIdsParam.java new file mode 100644 index 0000000000..5e2d675737 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/ewaybill/WaybillIdsParam.java @@ -0,0 +1,23 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 批量运单ID请求参数。 + * + * @author GitHub Copilot + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class WaybillIdsParam implements Serializable { + private static final long serialVersionUID = -9030594599179993010L; + + @JsonProperty("waybill_id_list") + private List waybillIds; +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/constant/WxChannelApiUrlConstants.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/constant/WxChannelApiUrlConstants.java index 6c2076d85b..566f14b52c 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/constant/WxChannelApiUrlConstants.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/constant/WxChannelApiUrlConstants.java @@ -263,6 +263,42 @@ public interface Delivery { String DELIVERY_SEND_URL = "https://api.weixin.qq.com/channels/ec/order/delivery/send"; } + /** 电子面单相关接口 */ + public interface Ewaybill { + /** 获取面单标准模板 */ + String GET_TEMPLATE_CONFIG_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/template/config"; + /** 新增面单模板 */ + String CREATE_TEMPLATE_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/template/create"; + /** 删除面单模板 */ + String DELETE_TEMPLATE_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/template/delete"; + /** 更新面单模板 */ + String UPDATE_TEMPLATE_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/template/update"; + /** 获取面单模板信息 */ + String GET_TEMPLATE_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/template/get"; + /** 根据模板ID获取面单模板信息 */ + String GET_TEMPLATE_BY_ID_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/template/getbyid"; + /** 查询开通的电子面单网点/账号信息 */ + String GET_ACCOUNT_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/account/get"; + /** 查询开通的快递公司列表 */ + String GET_DELIVERY_LIST_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/delivery/get"; + /** 电子面单预取号 */ + String PRE_CREATE_ORDER_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/order/precreate"; + /** 电子面单取号 */ + String CREATE_ORDER_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/order/create"; + /** 电子面单子件追加 */ + String ADD_SUB_ORDER_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/order/addsuborder"; + /** 电子面单取消下单 */ + String CANCEL_ORDER_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/order/cancel"; + /** 查询面单详情 */ + String GET_ORDER_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/order/get"; + /** 获取打印报文 */ + String GET_PRINT_CONTENT_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/print/get"; + /** 打印成功通知 */ + String PRINT_ORDER_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/order/print"; + /** 批量打印通知 */ + String BATCH_PRINT_ORDER_URL = "https://api.weixin.qq.com/channels/ec/logistics/ewaybill/biz/order/batchprint"; + } + /** 运费模板相关接口 */ public interface FreightTemplate { diff --git a/weixin-java-channel/src/test/java/me/chanjar/weixin/channel/api/impl/WxChannelEwaybillServiceAccessorTest.java b/weixin-java-channel/src/test/java/me/chanjar/weixin/channel/api/impl/WxChannelEwaybillServiceAccessorTest.java new file mode 100644 index 0000000000..0f53dad6c9 --- /dev/null +++ b/weixin-java-channel/src/test/java/me/chanjar/weixin/channel/api/impl/WxChannelEwaybillServiceAccessorTest.java @@ -0,0 +1,17 @@ +package me.chanjar.weixin.channel.api.impl; + +import static org.testng.Assert.assertNotNull; + +import org.testng.annotations.Test; + +/** + * @author GitHub Copilot + */ +public class WxChannelEwaybillServiceAccessorTest { + + @Test + public void testGetEwaybillService() { + WxChannelServiceImpl service = new WxChannelServiceImpl(); + assertNotNull(service.getEwaybillService()); + } +} diff --git a/weixin-java-channel/src/test/java/me/chanjar/weixin/channel/bean/ewaybill/WxChannelEwaybillBeanTest.java b/weixin-java-channel/src/test/java/me/chanjar/weixin/channel/bean/ewaybill/WxChannelEwaybillBeanTest.java new file mode 100644 index 0000000000..23ccba5f78 --- /dev/null +++ b/weixin-java-channel/src/test/java/me/chanjar/weixin/channel/bean/ewaybill/WxChannelEwaybillBeanTest.java @@ -0,0 +1,57 @@ +package me.chanjar.weixin.channel.bean.ewaybill; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +import java.util.Arrays; +import me.chanjar.weixin.channel.util.JsonUtils; +import me.chanjar.weixin.channel.util.ResponseUtils; +import org.testng.annotations.Test; + +/** + * @author GitHub Copilot + */ +public class WxChannelEwaybillBeanTest { + + @Test + public void testTemplateIdParamEncode() { + TemplateIdParam param = new TemplateIdParam("tpl_1"); + String json = JsonUtils.encode(param); + assertNotNull(json); + assertTrue(json.contains("\"template_id\":\"tpl_1\"")); + } + + @Test + public void testWaybillIdsParamEncode() { + WaybillIdsParam param = new WaybillIdsParam(Arrays.asList("wb_1", "wb_2")); + String json = JsonUtils.encode(param); + assertNotNull(json); + assertTrue(json.contains("\"waybill_id_list\"")); + assertTrue(json.contains("wb_1")); + assertTrue(json.contains("wb_2")); + } + + @Test + public void testDynamicRequestEncode() { + PreCreateRequest request = new PreCreateRequest(); + request.addParam("order_id", "o_1"); + request.addParam("package_quantity", 2); + + String json = JsonUtils.encode(request); + assertNotNull(json); + assertTrue(json.contains("\"order_id\":\"o_1\"")); + assertTrue(json.contains("\"package_quantity\":2")); + } + + @Test + public void testDynamicResponseDecode() { + String json = "{\"errcode\":0,\"errmsg\":\"ok\",\"waybill_id\":\"wb_1\",\"print_info\":\"abc\"}"; + PrintContentResponse response = ResponseUtils.decode(json, PrintContentResponse.class); + + assertNotNull(response); + assertTrue(response.isSuccess()); + assertEquals(response.getExtra().get("waybill_id"), "wb_1"); + assertEquals(response.getExtra().get("print_info"), "abc"); + } +}