对接快递100

This commit is contained in:
2025-11-20 22:28:16 +08:00
parent e7ba7e354a
commit 90f11fc08e
13 changed files with 809 additions and 495 deletions

View File

@@ -35,7 +35,7 @@ public class SecurityConfig {
return http.authorizeRequests() return http.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/**") .antMatchers(HttpMethod.OPTIONS, "/**")
.permitAll() .permitAll()
.antMatchers(HttpMethod.GET, "/api/file/**","/**", "/api/captcha", "/") .antMatchers(HttpMethod.GET, "/api/file/**", "/**", "/api/captcha", "/")
.permitAll() .permitAll()
.antMatchers( .antMatchers(
"/api/login", "/api/login",
@@ -78,8 +78,9 @@ public class SecurityConfig {
"/api/chat/**", "/api/chat/**",
"/api/shop/getShopInfo", "/api/shop/getShopInfo",
"/api/shop/shop-order/test", "/api/shop/shop-order/test",
"/api/qr-code/**" "/api/qr-code/**",
) "/api/shop/order-delivery/notify"
)
.permitAll() .permitAll()
.anyRequest() .anyRequest()
.authenticated() .authenticated()

View File

@@ -1,8 +1,18 @@
package com.gxwebsoft.shop.controller; package com.gxwebsoft.shop.controller;
import cn.binarywang.wx.miniapp.api.WxMaOrderShippingService;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaOrderShippingServiceImpl;
import cn.binarywang.wx.miniapp.bean.shop.request.shipping.*;
import cn.binarywang.wx.miniapp.bean.shop.response.WxMaOrderShippingInfoBaseResponse;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.gxwebsoft.common.core.utils.JSONUtil;
import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.shop.entity.*;
import com.gxwebsoft.shop.service.ShopExpressService;
import com.gxwebsoft.shop.service.ShopOrderDeliveryService; import com.gxwebsoft.shop.service.ShopOrderDeliveryService;
import com.gxwebsoft.shop.entity.ShopOrderDelivery;
import com.gxwebsoft.shop.param.ShopOrderDeliveryParam; import com.gxwebsoft.shop.param.ShopOrderDeliveryParam;
import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.ApiResult;
import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.core.web.PageResult;
@@ -10,13 +20,20 @@ import com.gxwebsoft.common.core.web.PageParam;
import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.core.web.BatchParam;
import com.gxwebsoft.common.core.annotation.OperationLog; import com.gxwebsoft.common.core.annotation.OperationLog;
import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.shop.service.impl.KuaiDi100Impl;
import com.kuaidi100.sdk.pojo.HttpResult;
import com.kuaidi100.sdk.request.BOrderReq;
import com.kuaidi100.sdk.response.SubscribeResp;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 发货单控制器 * 发货单控制器
@@ -31,6 +48,19 @@ public class ShopOrderDeliveryController extends BaseController {
@Resource @Resource
private ShopOrderDeliveryService shopOrderDeliveryService; private ShopOrderDeliveryService shopOrderDeliveryService;
@Operation(summary = "发货回调")
@PostMapping("/notify")
@GetMapping("/notify")
public SubscribeResp notify(@RequestBody Map<String, Object> data) {
System.out.println("快递100回调:" + data);
SubscribeResp subscribeResp = new SubscribeResp();
subscribeResp.setResult(Boolean.TRUE);
subscribeResp.setReturnCode("200");
subscribeResp.setMessage("成功");
return subscribeResp;
}
@Operation(summary = "分页查询发货单") @Operation(summary = "分页查询发货单")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<ShopOrderDelivery>> page(ShopOrderDeliveryParam param) { public ApiResult<PageResult<ShopOrderDelivery>> page(ShopOrderDeliveryParam param) {

View File

@@ -0,0 +1,11 @@
package com.gxwebsoft.shop.entity;
import lombok.Data;
@Data
public class KuaiDi100Resp {
private String message;
private Integer returnCode;
private Boolean result;
private Object data;
}

View File

@@ -308,4 +308,23 @@ public class ShopOrder implements Serializable {
@Schema(description = "报名信息") @Schema(description = "报名信息")
@TableField(exist = false) @TableField(exist = false)
private BszxBm bm; private BszxBm bm;
@Schema(description = "快递id")
@TableField(exist = false)
private Integer expressId;
@Schema(description = "发货人")
@TableField(exist = false)
private String sendName;
@Schema(description = "发货人联系方式")
@TableField(exist = false)
private String sendPhone;
@Schema(description = "发货地址")
@TableField(exist = false)
private String sendAddress;
@TableField(exist = false)
private ShopOrderDelivery shopOrderDelivery;
} }

View File

@@ -1,6 +1,7 @@
package com.gxwebsoft.shop.entity; package com.gxwebsoft.shop.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
@@ -39,6 +40,15 @@ public class ShopOrderDelivery implements Serializable {
@Schema(description = "物流公司ID") @Schema(description = "物流公司ID")
private Integer expressId; private Integer expressId;
@Schema(description = "发货人")
private String sendName;
@Schema(description = "发货人联系方式")
private String sendPhone;
@Schema(description = "发货地址")
private String sendAddress;
@Schema(description = "物流单号") @Schema(description = "物流单号")
private String expressNo; private String expressNo;
@@ -63,4 +73,6 @@ public class ShopOrderDelivery implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime; private LocalDateTime updateTime;
@TableField(exist = false)
private String expressName;
} }

View File

@@ -3,11 +3,15 @@ package com.gxwebsoft.shop.entity;
import java.math.BigDecimal; import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDate; import java.time.LocalDate;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@@ -112,4 +116,6 @@ public class ShopOrderGoods implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime; private LocalDateTime createTime;
@TableField(exist = false)
private List<ShopGoods> goodsList;
} }

View File

@@ -0,0 +1,16 @@
package com.gxwebsoft.shop.service;
import com.kuaidi100.sdk.pojo.HttpResult;
import com.kuaidi100.sdk.request.BOrderReq;
public interface KuaiDi100 {
/**
* 商家寄件
* @param bOrderReq
* @return
* @throws Exception
*/
HttpResult border(BOrderReq bOrderReq) throws Exception;
String pollList(String com, String num, String phone) throws Exception;
}

View File

@@ -2,10 +2,13 @@ package com.gxwebsoft.shop.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.shop.entity.ShopOrder;
import com.gxwebsoft.shop.entity.ShopOrderDelivery; import com.gxwebsoft.shop.entity.ShopOrderDelivery;
import com.gxwebsoft.shop.param.ShopOrderDeliveryParam; import com.gxwebsoft.shop.param.ShopOrderDeliveryParam;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 发货单Service * 发货单Service
@@ -39,4 +42,7 @@ public interface ShopOrderDeliveryService extends IService<ShopOrderDelivery> {
*/ */
ShopOrderDelivery getByIdRel(Integer deliveryId); ShopOrderDelivery getByIdRel(Integer deliveryId);
ShopOrderDelivery getByOrderId(Integer orderId);
Map<String, Object> setExpress(User user, ShopOrderDelivery orderDelivery, ShopOrder order) throws Exception;
} }

View File

@@ -0,0 +1,57 @@
package com.gxwebsoft.shop.service.impl;
import com.google.gson.Gson;
import com.gxwebsoft.shop.service.KuaiDi100;
import com.kuaidi100.sdk.api.QueryTrack;
import com.kuaidi100.sdk.contant.ApiInfoConstant;
import com.kuaidi100.sdk.core.BaseClient;
import com.kuaidi100.sdk.core.IBaseClient;
import com.kuaidi100.sdk.pojo.HttpResult;
import com.kuaidi100.sdk.request.*;
import com.kuaidi100.sdk.utils.SignUtils;
import org.springframework.stereotype.Service;
@Service
public class KuaiDi100Impl implements KuaiDi100 {
private String key = "bekcrvqy1510";
private String secret = "8c9dd34b6ff34cad9dd6a239bd0c4d26";
private String customer = "2E5DE2DB6B39822D793FE45EDDFB00B1";
@Override
public HttpResult border(BOrderReq bOrderReq) throws Exception {
PrintReq printReq = new PrintReq();
String t = String.valueOf(System.currentTimeMillis());
String param = new Gson().toJson(bOrderReq);
printReq.setKey(key);
printReq.setSign(SignUtils.printSign(param, t, key, secret));
printReq.setT(t);
printReq.setParam(param);
printReq.setMethod(ApiInfoConstant.B_ORDER_OFFICIAL_ORDER_METHOD);
System.out.println(printReq);
// IBaseClient bOrder = new BOrderOfficial();
IBaseClient bOrder = new BaseClient() {
@Override
public String getApiUrl(BaseRequest baseRequest) {
return "https://api.kuaidi100.com/apiMock/border";
}
};
return bOrder.execute(printReq);
}
@Override
public String pollList(String com, String num, String phone) throws Exception {
QueryTrackReq queryTrackReq = new QueryTrackReq();
QueryTrackParam queryTrackParam = new QueryTrackParam();
queryTrackParam.setCom(com);
queryTrackParam.setNum(num);
queryTrackParam.setPhone(phone);
String param = new Gson().toJson(queryTrackParam);
queryTrackReq.setSign(SignUtils.querySign(param, key, customer));
queryTrackReq.setCustomer(customer);
queryTrackReq.setParam(param);
IBaseClient baseClient = new QueryTrack();
return baseClient.execute(queryTrackReq).getBody();
}
}

View File

@@ -1,15 +1,24 @@
package com.gxwebsoft.shop.service.impl; package com.gxwebsoft.shop.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gxwebsoft.common.core.utils.JSONUtil;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.shop.entity.*;
import com.gxwebsoft.shop.mapper.ShopOrderDeliveryMapper; import com.gxwebsoft.shop.mapper.ShopOrderDeliveryMapper;
import com.gxwebsoft.shop.service.ShopOrderDeliveryService; import com.gxwebsoft.shop.service.*;
import com.gxwebsoft.shop.entity.ShopOrderDelivery;
import com.gxwebsoft.shop.param.ShopOrderDeliveryParam; import com.gxwebsoft.shop.param.ShopOrderDeliveryParam;
import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageParam;
import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.core.web.PageResult;
import com.kuaidi100.sdk.pojo.HttpResult;
import com.kuaidi100.sdk.request.BOrderReq;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 发货单Service实现 * 发货单Service实现
@@ -19,6 +28,18 @@ import java.util.List;
*/ */
@Service @Service
public class ShopOrderDeliveryServiceImpl extends ServiceImpl<ShopOrderDeliveryMapper, ShopOrderDelivery> implements ShopOrderDeliveryService { public class ShopOrderDeliveryServiceImpl extends ServiceImpl<ShopOrderDeliveryMapper, ShopOrderDelivery> implements ShopOrderDeliveryService {
@Resource
private ShopExpressService expressService;
@Resource
private KuaiDi100Impl kuaiDi100;
@Resource
private ShopOrderService shopOrderService;
@Resource
private ShopOrderGoodsService shopOrderGoodsService;
@Resource
private ShopGoodsService shopGoodsService;
@Resource
private ShopUserAddressService shopUserAddressService;
@Override @Override
public PageResult<ShopOrderDelivery> pageRel(ShopOrderDeliveryParam param) { public PageResult<ShopOrderDelivery> pageRel(ShopOrderDeliveryParam param) {
@@ -44,4 +65,100 @@ public class ShopOrderDeliveryServiceImpl extends ServiceImpl<ShopOrderDeliveryM
return param.getOne(baseMapper.selectListRel(param)); return param.getOne(baseMapper.selectListRel(param));
} }
@Override
public ShopOrderDelivery getByOrderId(Integer orderId) {
return getOne(
new LambdaQueryWrapper<ShopOrderDelivery>()
.eq(ShopOrderDelivery::getOrderId, orderId)
.last("limit 1")
);
}
@Override
public Map<String, Object> setExpress(User user, ShopOrderDelivery orderDelivery, ShopOrder order) throws Exception {
ShopExpress express = expressService.getByIdRel(orderDelivery.getExpressId());
ShopUserAddress userAddress = shopUserAddressService.getByIdRel(order.getAddressId());
BOrderReq bOrderReq = new BOrderReq();
bOrderReq.setKuaidicom(express.getKuaidi100Code());
bOrderReq.setSendManName(orderDelivery.getSendName());
bOrderReq.setSendManMobile(orderDelivery.getSendPhone());
bOrderReq.setSendManPrintAddr(order.getSendAddress());
bOrderReq.setRecManName(userAddress.getName());
bOrderReq.setRecManMobile(userAddress.getPhone());
bOrderReq.setRecManPrintAddr(order.getAddress());
bOrderReq.setCallBackUrl("https://cms-api.websoft.top/api/shop/order-delivery/notify");
HttpResult res = kuaiDi100.border(bOrderReq);
if (res.getStatus() != 200) return new HashMap<>() {{
put("res", false);
put("msg", "快递100接口异常");
}};
KuaiDi100Resp kuaiDi100Resp = JSONUtil.parseObject(res.getBody(), KuaiDi100Resp.class);
if (kuaiDi100Resp == null) return new HashMap<>() {{
put("res", false);
put("msg", "快递100接口异常");
}};
if (!kuaiDi100Resp.getResult())
return new HashMap<>() {{
put("res", false);
put("msg", kuaiDi100Resp.getMessage());
}};
Map<String, Object> bOrderData = (Map<String, Object>) kuaiDi100Resp.getData();
orderDelivery.setExpressNo((String) bOrderData.get("kuaidinum"));
if (updateById(orderDelivery)) {
order.setDeliveryStatus(20);
order.setDeliveryTime(LocalDateTime.now());
shopOrderService.updateById(order);
if (order.getPayType().equals(1)) {
List<ShopOrderGoods> orderGoodsList = shopOrderGoodsService.getListByOrderId(order.getOrderId());
// 上传小程序发货信息
// WxMaOrderShippingInfoUploadRequest uploadRequest = new WxMaOrderShippingInfoUploadRequest();
// uploadRequest.setLogisticsType(1);
// uploadRequest.setDeliveryMode(1);
//
// OrderKeyBean orderKeyBean = new OrderKeyBean();
// orderKeyBean.setOrderNumberType(2);
// orderKeyBean.setTransactionId(order.getTransactionId());
// uploadRequest.setOrderKey(orderKeyBean);
//
// List<ShippingListBean> shippingList = new ArrayList<>();
// ShippingListBean shippingListBean = new ShippingListBean();
// shippingListBean.setTrackingNo((String) bOrderData.get("kuaidinum"));
// shippingListBean.setExpressCompany(express.getWxCode());
// ContactBean contactBean = new ContactBean();
// contactBean.setReceiverContact(user.getMobile());
// shippingListBean.setContact(contactBean);
//
// ShopGoods shopGoods = shopGoodsService.getById(orderGoodsList.get(0).getGoodsId());
//
// String itemDesc = shopGoods.getName();
// if (orderGoodsList.size() > 1) itemDesc += "等" + orderGoodsList.size() + "件商品";
// shippingListBean.setItemDesc(itemDesc);
// shippingList.add(shippingListBean);
// uploadRequest.setShippingList(shippingList);
//
// uploadRequest.setUploadTime(new DateTime().toString(DatePattern.UTC_WITH_ZONE_OFFSET_PATTERN));
//
// PayerBean payerBean = new PayerBean();
//
// payerBean.setOpenid(user.getOpenid());
// uploadRequest.setPayer(payerBean);
//
// WxMaService wxMaService = weChatController.wxMaService();
// WxMaOrderShippingService wxMaOrderShippingService = new WxMaOrderShippingServiceImpl(wxMaService);
// WxMaOrderShippingInfoBaseResponse response = wxMaOrderShippingService.upload(uploadRequest);
// System.out.println("response" + response);
}
return new HashMap<>() {{
put("res", true);
put("msg", "操作成功");
}};
}
return new HashMap<>() {{
put("res", false);
put("msg", "未知错误");
}};
}
} }

View File

@@ -79,6 +79,10 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
private ShopOrderUpdate10550Service shopOrderUpdate10550Service; private ShopOrderUpdate10550Service shopOrderUpdate10550Service;
@Resource @Resource
private ShopUserCouponService shopUserCouponService; private ShopUserCouponService shopUserCouponService;
@Resource
private ShopOrderDeliveryService shopOrderDeliveryService;
@Resource
private ShopExpressService shopExpressService;
@Override @Override
@@ -100,6 +104,16 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
log.debug("订单 {} 的 realName 为空,尝试从其他字段获取", d.getOrderId()); log.debug("订单 {} 的 realName 为空,尝试从其他字段获取", d.getOrderId());
// 可以根据业务需求添加其他逻辑,比如从 nickname 或其他字段获取 // 可以根据业务需求添加其他逻辑,比如从 nickname 或其他字段获取
} }
if (d.getDeliveryStatus() > 10 && d.getDeliveryType().equals(0)) {
ShopOrderDelivery shopOrderDelivery = shopOrderDeliveryService.getByOrderId(d.getOrderId());
if (shopOrderDelivery != null) {
ShopExpress shopExpress = shopExpressService.getById(shopOrderDelivery.getExpressId());
if (shopExpress != null) {
shopOrderDelivery.setExpressName(shopExpress.getExpressName());
}
}
d.setShopOrderDelivery(shopOrderDelivery);
}
}); });
} }
return new PageResult<>(list, page.getTotal()); return new PageResult<>(list, page.getTotal());

View File

@@ -7,7 +7,15 @@ server:
# 数据源配置 # 数据源配置
spring: spring:
datasource: datasource:
url: jdbc:mysql://8.134.169.209:13306/modules?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai # url: jdbc:mysql://47.119.165.234:3308/website?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
# username: website
# password: Th2ywSKxWFHeYZS8
# url: jdbc:mysql://182.90.229.54:3306/db_10556?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
# username: db_10556
# password: 3FErjCpAFmbAR7Xw
url: jdbc:mysql://8.134.169.209:13306/modules?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: modules username: modules
password: P7KsAyDXG8YdLnkA password: P7KsAyDXG8YdLnkA
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
@@ -25,8 +33,6 @@ logging:
level: level:
com.gxwebsoft: DEBUG com.gxwebsoft: DEBUG
com.baomidou.mybatisplus: DEBUG com.baomidou.mybatisplus: DEBUG
com.gxwebsoft.shop.mapper: DEBUG
org.apache.ibatis: DEBUG
socketio: socketio:
host: localhost #IP地址 host: localhost #IP地址
@@ -48,12 +54,7 @@ mqtt:
config: config:
# 开发环境接口 # 开发环境接口
server-url: https://server.websoft.top/api server-url: https://server.websoft.top/api
upload-path: /Users/gxwebsoft/JAVA/mp-java/src/main/resources # window(D:\Temp) upload-path: /Users/gxwebsoft/Documents/uploads/ # window(D:\Temp)
# JWT配置
jwt:
secret: websoft-jwt-secret-key-2025-dev-environment
expire: 86400 # token过期时间(秒) 24小时
# 开发环境证书配置 # 开发环境证书配置
certificate: certificate: