diff --git a/README.md b/README.md index 7f8ac1f38..b84808f69 100644 --- a/README.md +++ b/README.md @@ -19,17 +19,11 @@ https://docs.pickmall.cn #### 欢迎交流需求,交流业务,交流技术(基础问题自行解决,其他问题先看文档后提问) -#### 不用削尖脑袋往老群里加,老群活跃度较低,很多潜水党,新群相对而言活跃一些 :tw-1f606: :tw-1f606: :tw-1f606: :tw-1f606: :tw-1f606: :tw-1f606: - #### 开发新手或者不熟悉的同学在群内提问或新开Issue提问前,请先阅读[【提问的智慧】](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md),并确保已查阅过 [【在线文档】](https://docs.pickmall.cn/) ,避免浪费大家的宝贵时间; -##### 交流 qq 1群 961316482(已满) -##### 交流 qq 2群 875294241(已满) -##### 交流 qq 3群 263785057(已满) -##### 交流 qq 4群 674617534(已满) -##### 交流 qq 5群 594675235(已满) -##### 交流 qq 6群 917026848(已满) -##### 交流 qq 7群 936344822 +##### 交流 微信群 1群 +![微信群](https://lilishop-wechat.oss-cn-beijing.aliyuncs.com/wechat.jpg) + ##### 体验 公众号/小程序/APP 体验,扫描二维码 @@ -171,7 +165,7 @@ PS:手机验证码为 ‘111111’ ### 商业授权 商业版本与开源版本代码一致,没有区分 -商业使用需要授权,授权方式可选择联系官网客服,或者qq群联系群主。 +商业使用需要授权,授权方式可选择联系官网客服。 商业授权模式为永久授权,支持永久升级。 @@ -185,18 +179,10 @@ PS:手机验证码为 ‘111111’ 3.软件受国家计算机软件著作权保护(登记号:2021SR0805085)。 -4.限制商用,如果需要商业使用请联系我们。QQ3409056806.或者加入qq群联系群主。 +4.限制商用,如果需要商业使用请联系我们。 -### 交流群 - -##### 交流 qq 1群 961316482(已满) -##### 交流 qq 2群 875294241(已满) -##### 交流 qq 3群 263785057(已满) -##### 交流 qq 4群 674617534(已满) -##### 交流 qq 5群 594675235(已满) - ### 附录 有人有自己的学习视频、学习记录文档、希望宣传关联开源项目等均可以私聊仓库所有者。 diff --git a/framework/src/main/java/cn/lili/common/enums/ResultUtil.java b/framework/src/main/java/cn/lili/common/enums/ResultUtil.java index e70764801..8dfdebd74 100644 --- a/framework/src/main/java/cn/lili/common/enums/ResultUtil.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultUtil.java @@ -131,4 +131,13 @@ public class ResultUtil { return this.resultMessage; } + + /** + * 返回失败 + * + * @return 消息 + */ + public static ResultMessage error() { + return new ResultUtil().setErrorMsg(ResultCode.ERROR); + } } diff --git a/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java b/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java index 118c83633..5315d43f8 100644 --- a/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java +++ b/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java @@ -1,5 +1,6 @@ package cn.lili.common.exception; +import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultUtil; import cn.lili.common.vo.ResultMessage; @@ -42,26 +43,21 @@ public class GlobalControllerExceptionHandler { @ResponseStatus(value = HttpStatus.BAD_REQUEST) public ResultMessage handleServiceException(HttpServletRequest request, final Exception e, HttpServletResponse response) { - //如果是自定义异常,则获取异常,返回自定义错误消息 if (e instanceof ServiceException) { + ServiceException serviceException = ((ServiceException) e); ResultCode resultCode = serviceException.getResultCode(); - Integer code = null; - String message = null; + Integer code = resultCode.code(); + String message = resultCode.message(); - if (resultCode != null) { - code = resultCode.code(); - message = resultCode.message(); - } //如果有扩展消息,则输出异常中,跟随补充异常 - if (!serviceException.getMsg().equals(ServiceException.DEFAULT_MESSAGE)) { - message += ":" + serviceException.getMsg(); + if (message != null) { + message = appendErrorMessage(message, serviceException.getMsg()); } // 对一些特殊异常处理,不再打印error级别的日志 - assert serviceException.getResultCode() != null; if (serviceException.getResultCode().equals(ResultCode.DEMO_SITE_EXCEPTION)) { log.debug("[DEMO_SITE_EXCEPTION]:{}", serviceException.getResultCode().message(), e); return ResultUtil.error(code, message); @@ -103,7 +99,30 @@ public class GlobalControllerExceptionHandler { log.error("全局异常[RuntimeException]:", e); - return ResultUtil.error(ResultCode.ERROR); + // 检查异常链是否包含 ServiceException + ServiceException serviceException = findServiceException(e); + + if (serviceException != null) { + ResultCode resultCode = serviceException.getResultCode(); + Integer code = resultCode.code(); + String message = resultCode.message(); + if (message != null) { + message = appendErrorMessage(message, serviceException.getMsg()); + } + return ResultUtil.error(code, message); + } + return ResultUtil.error(); + } + + // 遍历异常链,查找 ServiceException + private ServiceException findServiceException(Throwable ex) { + while (ex != null) { + if (ex instanceof ServiceException) { + return (ServiceException) ex; + } + ex = ex.getCause(); + } + return null; } // /** @@ -168,4 +187,41 @@ public class GlobalControllerExceptionHandler { ConstraintViolationException exception = (ConstraintViolationException) e; return ResultUtil.error(ResultCode.PARAMS_ERROR.code(), exception.getMessage()); } + /** + * 拼接错误消息 + * + * @param message 原始消息 + * @param appendMessage 需要拼接的消息 + * @return 拼接后的消息 + */ + private String appendErrorMessage(String message, String appendMessage) { + + //这里的代码看起来有点乱,简单解释一下 + //场景1:服务A,服务B=》 + // 服务A调用服务B=》 + // 服务B抛出异常{扩展消息},拼接后成为{默认消息}:{扩展消息} + // 异常被服务A捕获=》 + // 最终消息拼接过程中,当前方法体参数message是{默认消息},参数appendMessage是服务A给的{默认消息}+{扩展消息},最终会形成{默认消息}+{默认消息}+{扩展消息} + //场景2:只有服务A=》 + // 服务A抛出异常{扩展消息}=》 + // 当前方法体拼接{默认消息}:{扩展消息} 并输出返回。 + // + //总的来说,由于消息拼接是一个流式传递,由服务间传递,所以这里的消息可能存在A包含B,也可能出现B包含A, + // 所以这里需要双重判定,A包含B=》返回A,B包含A=》返回B,否则返回拼接后的消息 + + if (message.contains(appendMessage)) { + return message; + } + if (appendMessage.contains(message)) { + return appendMessage; + } + //忽略默认错误信息,如果有其他错误消息体就不再返回默认的错误消息 + if (message.equals(ResultCode.ERROR.message())) { + return appendMessage; + } + if (appendMessage.equals(ResultCode.ERROR.message())) { + return message; + } + return CharSequenceUtil.format("{}-{}", message, appendMessage); + } } diff --git a/framework/src/main/java/cn/lili/common/exception/ServiceException.java b/framework/src/main/java/cn/lili/common/exception/ServiceException.java index feb98e6da..754aec2a3 100644 --- a/framework/src/main/java/cn/lili/common/exception/ServiceException.java +++ b/framework/src/main/java/cn/lili/common/exception/ServiceException.java @@ -15,12 +15,11 @@ public class ServiceException extends RuntimeException { private static final long serialVersionUID = 3447728300174142127L; - public static final String DEFAULT_MESSAGE = "网络错误,请稍后重试!"; /** * 异常消息 */ - private String msg = DEFAULT_MESSAGE; + private String msg = ResultCode.ERROR.message(); /** * 错误码 diff --git a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java index 63feaea42..4daae96d9 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatPCRequest.java @@ -55,7 +55,7 @@ public class BaseAuthWeChatPCRequest extends BaseAuthRequest { return ConnectAuthUser.builder() .rawUserInfo(object) - .username(object.getString("nickname")) + .username(object.getString("unionid")) .nickname(object.getString("nickname")) .avatar(object.getString("headimgurl")) .location(location) diff --git a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java index 6418d9cfe..b359b5ebb 100644 --- a/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java +++ b/framework/src/main/java/cn/lili/modules/connect/request/BaseAuthWeChatRequest.java @@ -57,7 +57,7 @@ public class BaseAuthWeChatRequest extends BaseAuthRequest { return ConnectAuthUser.builder() .rawUserInfo(object) - .username(object.getString("nickname")) + .username(object.getString("unionid")) .nickname(object.getString("nickname")) .avatar(object.getString("headimgurl")) .location(location) diff --git a/framework/src/main/java/cn/lili/modules/logistics/plugin/kuaidi100/Kuaidi100Plugin.java b/framework/src/main/java/cn/lili/modules/logistics/plugin/kuaidi100/Kuaidi100Plugin.java index b935cccb0..7b9628213 100644 --- a/framework/src/main/java/cn/lili/modules/logistics/plugin/kuaidi100/Kuaidi100Plugin.java +++ b/framework/src/main/java/cn/lili/modules/logistics/plugin/kuaidi100/Kuaidi100Plugin.java @@ -28,6 +28,7 @@ import com.kuaidi100.sdk.request.labelV2.OrderReq; import com.kuaidi100.sdk.response.QueryTrackData; import com.kuaidi100.sdk.response.QueryTrackMapResp; import com.kuaidi100.sdk.response.QueryTrackResp; +import com.kuaidi100.sdk.response.labelV2.OrderResult; import com.kuaidi100.sdk.response.samecity.OrderResp; import com.kuaidi100.sdk.utils.SignUtils; import lombok.extern.slf4j.Slf4j; @@ -140,25 +141,74 @@ public class Kuaidi100Plugin implements LogisticsPlugin { StoreLogistics storeLogistics = labelOrderDTO.getStoreLogistics(); - ManInfo recManInfo = new ManInfo(); - recManInfo.setName(order.getConsigneeName()); - recManInfo.setMobile(order.getConsigneeMobile()); - recManInfo.setPrintAddr(consigneeAddress[0] + consigneeAddress[1] + consigneeAddress[2] + consigneeAddress[3] + order.getConsigneeDetail()); - - ManInfo sendManInfo = new ManInfo(); - sendManInfo.setName(storeDeliverGoodsAddressDTO.getSalesConsignorName()); - sendManInfo.setMobile(storeDeliverGoodsAddressDTO.getSalesConsignorMobile()); - sendManInfo.setPrintAddr(consignorAddress[0] + consignorAddress[1] + consignorAddress[2] + consignorAddress[3] + storeDeliverGoodsAddressDTO.getSalesConsignorDetail()); OrderReq orderReq = new OrderReq(); + //打印类型,NON:只下单不打印(默认); IMAGE:生成图片短链;HTML:生成html短链; CLOUD:使用快递100云打印机打印,使用CLOUD时siid必填 + orderReq.setPrintType(PrintType.HTML); + //电子面单客户账户或月结账号,需贵司向当地快递公司网点申请(参考电子面单申请指南); 是否必填该属性,请查看参数字典 + orderReq.setPartnerId(storeLogistics.getCustomerName()); + //电子面单密码,需贵司向当地快递公司网点申请; 是否必填该属性,请查看参数字典 + if(storeLogistics.getCustomerPwd()!=null){ + orderReq.setPartnerKey(storeLogistics.getCustomerPwd()); + } + + //电子面单密钥,需贵司向当地快递公司网点申请; 是否必填该属性,请查看参数字典 + if(storeLogistics.getMonthCode()!=null) { + orderReq.setPartnerSecret(storeLogistics.getMonthCode()); + } + //电子面单客户账户名称,需贵司向当地快递公司网点申请; 是否必填该属性,请查看参数字典 + if(storeLogistics.getPartnerName()!=null) { + orderReq.setPartnerName(storeLogistics.getPartnerName()); + } +// orderReq.setNet(); + // 电子面单承载编号,需贵司向当地快递公司网点申请; 是否必填该属性,请查看参数字典 + if(storeLogistics.getSendSite()!=null) { + orderReq.setCode(storeLogistics.getSendSite()); + } + //电子面单承载快递员名,需贵司向当地快递公司网点申请; 是否必填该属性,请查看参数字典 + if(storeLogistics.getSendStaff()!=null) { + orderReq.setCheckMan(storeLogistics.getSendStaff()); + } + + //快递公司的编码,一律用小写字母,请查看参数字典 orderReq.setKuaidicom(logistics.getCode()); - orderReq.setCount(1); + //收件人信息 + ManInfo manInfo=new ManInfo(); + //收件人姓名 + manInfo.setName(order.getConsigneeName()); + //收件人的手机号,手机号和电话号二者其一必填 + manInfo.setMobile(order.getConsigneeMobile()); + //收件人的电话号,手机号和电话号二者其一必填 +// manInfo.setTel(""); + //收件人所在完整地址,如广东深圳市南山区科技南十二路金蝶软件园B10 + manInfo.setPrintAddr(consigneeAddress[0]+consigneeAddress[1]+consigneeAddress[2]+consigneeAddress[3]+order.getConsigneeDetail()); + orderReq.setRecMan(manInfo); + ManInfo sendMan=new ManInfo(); + // 寄件人信息 + sendMan.setName(storeDeliverGoodsAddressDTO.getSalesConsignorName()); + // 寄件人的手机号,手机号和电话号二者其一必填 + sendMan.setMobile(storeDeliverGoodsAddressDTO.getSalesConsignorMobile()); + //寄件人的电话号,手机号和电话号二者其一必填 +// sendMan.setTel(""); + //寄件人所在的完整地址,如广东深圳市南山区科技南十二路金蝶软件园B10 + sendMan.setPrintAddr(consignorAddress[0]+consignorAddress[1]+consignorAddress[2]+consignorAddress[3]+storeDeliverGoodsAddressDTO.getSalesConsignorDetail()); + //寄件人所在公司名称 +// sendMan.setCompany(""); + orderReq.setSendMan(sendMan); + //物品名称,例:文件 + String goodsName=""; + for (OrderItem orderItem : orderItems) { + goodsName+=orderItem.getGoodsName() + "',"; + } + + orderReq.setCargo(goodsName); + // 包裹总数量。 + orderReq.setCount(orderItems.size()); + //打印设备,通过打印机输出的设备码进行获取,printType为CLOUD时必填 +// orderReq.setSiid(""); + // orderReq.setSiid(siid); //orderReq.setTempId("60f6c17c7c223700131d8bc3"); - orderReq.setSendMan(sendManInfo); - orderReq.setRecMan(recManInfo); - - orderReq.setPrintType(PrintType.CLOUD); String param = new Gson().toJson(orderReq); String t = System.currentTimeMillis() + ""; @@ -167,14 +217,19 @@ public class Kuaidi100Plugin implements LogisticsPlugin { printReq.setT(t); printReq.setKey(logisticsSetting.getKuaidi100Key()); printReq.setSign(SignUtils.printSign(param, t, logisticsSetting.getKuaidi100Key(), logisticsSetting.getKuaidi100Customer())); - printReq.setMethod(ApiInfoConstant.ORDER); + printReq.setMethod(ApiInfoConstant.NEW_TEMPLATE_URL); printReq.setParam(param); IBaseClient baseClient = new LabelV2(); HttpResult result = baseClient.execute(printReq); System.out.println(result.getBody()); - QueryTrackMapResp queryTrackMapResp = new Gson().fromJson(result.getBody(), QueryTrackMapResp.class); - OrderResp orderResp = new Gson().fromJson(result.getBody(), OrderResp.class); + + + + OrderResult orderResult = new Gson().fromJson(result.getBody(), OrderResult.class); + log.info("电子面单响应:{}", orderResult); + System.out.println("快递单号:"+orderResult.getKdComOrderNum()); + System.out.println("面单短链:"+orderResult.getLabel()); } catch (Exception e) { e.printStackTrace(); diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreLogistics.java b/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreLogistics.java index 872f140cf..dd0c1533e 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreLogistics.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dos/StoreLogistics.java @@ -33,16 +33,16 @@ public class StoreLogistics extends BaseEntity { @NotNull private String logisticsId; - @ApiModelProperty(value = "客户代码") + @ApiModelProperty(value = "电子面单客户账户、月结账号、客户代码") private String customerName; - @ApiModelProperty(value = "客户密码") + @ApiModelProperty(value = "客户密码、电子面单密码") private String customerPwd; - @ApiModelProperty(value = "密钥") + @ApiModelProperty(value = "电子面单密钥") private String monthCode; - @ApiModelProperty(value = "归属网点/网点编码") + @ApiModelProperty(value = "归属网点/网点编码,电子面单承载编号") private String sendSite; @ApiModelProperty(value = "收件快递员") @@ -57,6 +57,11 @@ public class StoreLogistics extends BaseEntity { @ApiModelProperty(value = "快递类型") private String expType; + @ApiModelProperty(value = "电子面单客户账户名称") + private String partnerName; + + + public StoreLogistics(StoreLogisticsCustomerDTO storeLogisticsCustomerDTO){ this.customerName=storeLogisticsCustomerDTO.getCustomerName(); this.customerPwd=storeLogisticsCustomerDTO.getCustomerPwd(); @@ -66,6 +71,7 @@ public class StoreLogistics extends BaseEntity { this.faceSheetFlag=storeLogisticsCustomerDTO.isFaceSheetFlag(); this.payType = storeLogisticsCustomerDTO.getPayType(); this.expType = storeLogisticsCustomerDTO.getExpType(); + this.partnerName = storeLogisticsCustomerDTO.getPartnerName(); } diff --git a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreLogisticsCustomerDTO.java b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreLogisticsCustomerDTO.java index b5fc85898..3c6d4124e 100644 --- a/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreLogisticsCustomerDTO.java +++ b/framework/src/main/java/cn/lili/modules/store/entity/dto/StoreLogisticsCustomerDTO.java @@ -38,4 +38,7 @@ public class StoreLogisticsCustomerDTO { @ApiModelProperty(value = "快递类型") private String expType; + @ApiModelProperty(value = "电子面单客户账户名称") + private String partnerName; + }