接入快递100

pull/1121/head
梁宇奇 2025-07-17 19:57:20 +08:00
parent afd0366628
commit c5484d608a
3 changed files with 192 additions and 13 deletions

View File

@ -0,0 +1,36 @@
package com.ruoyi.xkt.dto.express;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
*
*
* @author liangyq
* @date 2025-07-17
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TrackRecordDTO implements Serializable {
/**
*
*/
private String action;
/**
*
*/
private String description;
/**
*
*/
private String remark;
/**
*
*/
private Date createTime;
}

View File

@ -29,6 +29,7 @@ import com.ruoyi.xkt.manager.ExpressManager;
import com.ruoyi.xkt.manager.PaymentManager;
import com.ruoyi.xkt.mapper.*;
import com.ruoyi.xkt.service.*;
import com.ruoyi.xkt.thirdpart.kuaidi100.Kuaidi100Client;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -79,6 +80,8 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
private IFinanceBillService financeBillService;
@Autowired
private List<PaymentManager> paymentManagers;
@Autowired
private Kuaidi100Client kuaidi100Client;
@Transactional(rollbackFor = Exception.class)
@Override
@ -438,30 +441,48 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
.stream()
.collect(Collectors.groupingBy(ExpressTrackRecordDTO::getExpressWaybillNo));
List<ExpressTrackDTO> expressTracks = new ArrayList<>(expressWaybillGroupMap.size());
StoreOrder order = storeOrderMapper.selectById(storeOrderId);
for (Map.Entry<String, List<StoreOrderDetail>> entry : expressWaybillGroupMap.entrySet()) {
ExpressTrackDTO expressTrackDTO = new ExpressTrackDTO();
StoreOrderDetail oneDetail = CollUtil.getFirst(entry.getValue());
Long detailId = oneDetail.getId();
Long expressId = oneDetail.getExpressId();
//商品摘要
List<String> goodsSummaries = entry.getValue().stream()
.map(o -> StrUtil.concat(true, o.getProdArtNum(), ", ", o.getColorName(), ", ",
String.valueOf(o.getSize()))).collect(Collectors.toList());
String goodsSummaryStr = StrUtil.join("; ", goodsSummaries);
//发货时间
Long detailId = CollUtil.getFirst(entry.getValue()).getId();
StoreOrderOperationRecordDTO shipRecord = operationRecordService.getOneRecord(detailId,
EOrderTargetTypeAction.ORDER_DETAIL, EOrderAction.SHIP);
expressTrackDTO.setCreateTime(Optional.ofNullable(shipRecord)
.map(StoreOrderOperationRecordDTO::getOperationTime).orElse(null));
StoreOrderDetail oneDetail = CollUtil.getFirst(entry.getValue());
Long expressId = oneDetail.getExpressId();
expressTrackDTO.setExpressId(expressId);
expressTrackDTO.setExpressName(expressNameMap.get(expressId));
expressTrackDTO.setExpressWaybillNo(entry.getKey());
expressTrackDTO.setGoodsSummary(StrUtil.join("; ", goodsSummaries));
Date createTime = Optional.ofNullable(shipRecord)
.map(StoreOrderOperationRecordDTO::getOperationTime).orElse(null);
if (EExpressType.PLATFORM.getValue().equals(oneDetail.getExpressType())) {
//平台发货
ExpressTrackDTO expressTrackDTO = new ExpressTrackDTO();
expressTrackDTO.setCreateTime(createTime);
expressTrackDTO.setExpressId(expressId);
expressTrackDTO.setExpressName(expressNameMap.get(expressId));
expressTrackDTO.setExpressWaybillNo(entry.getKey());
expressTrackDTO.setGoodsSummary(goodsSummaryStr);
expressTrackDTO.setRecords(trackRecordGroupMap.get(entry.getKey()));
expressTracks.add(expressTrackDTO);
} else {
//TODO 商家自发货,从三方接口查询轨迹
// String [] expressWaybillNos = entry.getKey().split(",");
//档口发货
String[] expressWaybillNos = entry.getKey().split(",");
for (String expressWaybillNo : expressWaybillNos) {
ExpressTrackDTO expressTrackDTO = new ExpressTrackDTO();
expressTrackDTO.setCreateTime(createTime);
expressTrackDTO.setExpressId(expressId);
expressTrackDTO.setExpressName(expressNameMap.get(expressId));
expressTrackDTO.setExpressWaybillNo(expressWaybillNo);
expressTrackDTO.setGoodsSummary(goodsSummaryStr);
//通过快递100查询轨迹
List<TrackRecordDTO> records = kuaidi100Client.queryTrack(expressWaybillNo,
order.getDestinationContactPhoneNumber());
expressTrackDTO.setRecords(BeanUtil.copyToList(records, ExpressTrackRecordDTO.class));
expressTracks.add(expressTrackDTO);
}
}
expressTracks.add(expressTrackDTO);
}
return expressTracks;
}

View File

@ -0,0 +1,122 @@
package com.ruoyi.xkt.thirdpart.kuaidi100;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.xkt.dto.express.TrackRecordDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @author liangyq
* @date 2025-07-17
*/
@Slf4j
@Component
public class Kuaidi100Client {
@Value("${kuaidi100.key:qlukmRsd2685}")
private String key;
@Value("${kuaidi100.customer:C24AD9F267EBCDD0D9C6B85EEC2CB4FD}")
private String customer;
@Value("${kuaidi100.secret:07515dc1a74e4d01bf91bcf77e6f6cfe}")
private String secret;
@Value("${kuaidi100.userid:3a0ea45a2d1e4a4fba9d86918553656d}")
private String userid;
/**
* 100
*
* @param waybillNum
* @return
*/
public String queryComCode(String waybillNum) {
if (StrUtil.isNotEmpty(waybillNum)) {
String url = "http://www.kuaidi100.com/autonumber/auto?num={0}&key={1}";
String fullUrl = StrUtil.indexedFormat(url, waybillNum, key);
HttpRequest httpRequest = HttpUtil.createGet(fullUrl);
String result = httpRequest.execute().body();
JSONArray array = JSON.parseArray(result);
if (!array.isEmpty()) {
return array.getJSONObject(0).getString("comCode");
}
}
return null;
}
/**
*
*
* @param waybillNum
* @param phoneNumber
* @return
*/
public List<TrackRecordDTO> queryTrack(String waybillNum, String phoneNumber) {
String comCode = queryComCode(waybillNum);
if (comCode != null) {
try {
JSONObject param = new JSONObject();
param.put("com", comCode);
param.put("num", waybillNum);
/**
*
* -
*/
param.put("phone", phoneNumber);
/**
*
* 1
* 4:
* 84
*/
param.put("resultv2", "0");
/**
* 0json1xml2html3text
*/
param.put("show", "0");
/**
* :desc,asc
*/
param.put("order", "asc");
/**
* param + key + customer MD532
* +
*/
String sign = SecureUtil.md5(param.toString() + key + customer).toUpperCase();
String url = "https://poll.kuaidi100.com/poll/query.do";
HttpRequest httpRequest = HttpUtil.createPost(url);
httpRequest.header("Content-Type", "application/x-www-form-urlencoded");
httpRequest.form("customer", customer);
httpRequest.form("param", param.toString());
httpRequest.form("sign", sign);
String result = httpRequest.execute().body();
log.info("快递100轨迹查询{}", result);
JSONObject rtnObj = JSON.parseObject(result);
JSONArray data = rtnObj.getJSONArray("data");
if (data != null) {
List<TrackRecordDTO> records = new ArrayList<>(data.size());
for (int i = 0; i < data.size(); i++) {
JSONObject row = data.getJSONObject(i);
records.add(new TrackRecordDTO("", row.getString("context"), "",
DateUtil.parseDateTime(row.getString("time"))));
}
return records;
}
} catch (Exception e) {
log.error("快递100物流轨迹信息查询异常", e);
}
}
return ListUtil.empty();
}
}