feat: 物流轨迹

pull/1121/head
梁宇奇 2025-05-08 13:02:56 +08:00
parent 668b748475
commit e55eecf5ba
13 changed files with 228 additions and 66 deletions

View File

@ -245,6 +245,9 @@ public class StoreOrderInfoVO {
@ApiModelProperty(value = "订单明细")
private List<Detail> orderDetails;
@ApiModelProperty(value = "轨迹信息")
private List<Track> expressTracks;
@ApiModel
@Data
@ -409,4 +412,38 @@ public class StoreOrderInfoVO {
}
@ApiModel
@Data
public static class Track {
@ApiModelProperty(value = "物流运单号(快递单号)")
private String expressWaybillNo;
@ApiModelProperty(value = "物流ID")
private Long expressId;
@ApiModelProperty(value = "物流名称")
private String expressName;
@ApiModelProperty(value = "记录")
private List<Record> records;
@ApiModel
@Data
public static class Record {
@ApiModelProperty(value = "节点事件")
private String action;
@ApiModelProperty(value = "描述")
private String description;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "创建时间")
private Date createTime;
}
}
}

View File

@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
*
*
*
* @author liangyq
* @date 2025-04-01 11:57:52.599
@ -14,15 +14,15 @@ import lombok.ToString;
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class StoreOrderExpressTrack extends SimpleEntity {
public class ExpressTrackRecord extends SimpleEntity {
/**
* ID
*
*/
private Long storeOrderId;
private String expressWaybillNo;
/**
* ID
* ID
*/
private Long storeOrderIdDetailId;
private Long expressId;
/**
*
*/

View File

@ -0,0 +1,19 @@
package com.ruoyi.xkt.dto.express;
import lombok.Data;
/**
* @author liangyq
* @date 2025-05-08 10:44
*/
@Data
public class ExpressNameDTO {
/**
* ID
*/
private Long id;
/**
*
*/
private String expressName;
}

View File

@ -2,7 +2,6 @@ package com.ruoyi.xkt.dto.express;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
@ -22,27 +21,11 @@ public class ExpressTrackDTO {
*/
private Long expressId;
/**
*
*
*/
private List<Item> items;
@Data
public static class Item {
/**
*
*/
private String action;
/**
*
*/
private String description;
/**
*
*/
private String remark;
/**
*
*/
private Date createTime;
}
private String expressName;
/**
*
*/
private List<ExpressTrackRecordDTO> records;
}

View File

@ -0,0 +1,43 @@
package com.ruoyi.xkt.dto.express;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
*
* @author liangyq
* @date 2025-04-01 11:57:52.599
**/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ExpressTrackRecordAddDTO {
/**
* ID
*/
private Long expressId;
/**
*
*/
private String expressWaybillNo;
/**
*
*/
private Integer sort;
/**
*
*/
private String action;
/**
*
*/
private String description;
/**
*
*/
private String remark;
}

View File

@ -1,29 +1,29 @@
package com.ruoyi.xkt.dto.order;
package com.ruoyi.xkt.dto.express;
import lombok.Data;
import java.util.Date;
/**
*
*
*
* @author liangyq
* @date 2025-04-01 11:57:52.599
**/
@Data
public class StoreOrderExpressTrackDTO {
public class ExpressTrackRecordDTO {
/**
* ID
*/
private Long id;
/**
* ID
*
*/
private Long storeOrderId;
private String expressWaybillNo;
/**
* ID
* ID
*/
private Long storeOrderIdDetailId;
private Long expressId;
/**
*
*/

View File

@ -2,12 +2,18 @@ package com.ruoyi.xkt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.xkt.domain.Express;
import com.ruoyi.xkt.dto.express.ExpressNameDTO;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author liangyq
* @date 2025-04-02 12:48
*/
@Repository
public interface ExpressMapper extends BaseMapper<Express> {
List<ExpressNameDTO> listAllExpressName();
}

View File

@ -1,8 +1,7 @@
package com.ruoyi.xkt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.xkt.domain.Express;
import com.ruoyi.xkt.domain.StoreOrderExpressTrack;
import com.ruoyi.xkt.domain.ExpressTrackRecord;
import org.springframework.stereotype.Repository;
/**
@ -10,5 +9,5 @@ import org.springframework.stereotype.Repository;
* @date 2025-04-02 12:48
*/
@Repository
public interface StoreOrderExpressTrackMapper extends BaseMapper<StoreOrderExpressTrack> {
public interface ExpressTrackRecordMapper extends BaseMapper<ExpressTrackRecord> {
}

View File

@ -3,10 +3,7 @@ package com.ruoyi.xkt.service;
import com.ruoyi.xkt.domain.Express;
import com.ruoyi.xkt.domain.ExpressFeeConfig;
import com.ruoyi.xkt.domain.ExpressRegion;
import com.ruoyi.xkt.dto.express.ExpressContactDTO;
import com.ruoyi.xkt.dto.express.ExpressRegionDTO;
import com.ruoyi.xkt.dto.express.ExpressRegionTreeNodeDTO;
import com.ruoyi.xkt.dto.express.ExpressStructAddressDTO;
import com.ruoyi.xkt.dto.express.*;
import com.ruoyi.xkt.manager.ExpressManager;
import java.util.Collection;
@ -98,5 +95,26 @@ public interface IExpressService {
*/
ExpressManager getExpressManager(Long expressId);
/**
*
*
* @param addDTO
* @return
*/
Long addTrackRecord(ExpressTrackRecordAddDTO addDTO);
/**
*
*
* @return
*/
Map<Long, String> getAllExpressNameMap();
/**
*
*
* @param expressWaybillNos
* @return
*/
List<ExpressTrackRecordDTO> listTrackRecord(Collection<String> expressWaybillNos);
}

View File

@ -8,17 +8,12 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.SimpleEntity;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.bean.BeanValidators;
import com.ruoyi.xkt.domain.Express;
import com.ruoyi.xkt.domain.ExpressFeeConfig;
import com.ruoyi.xkt.domain.ExpressRegion;
import com.ruoyi.xkt.domain.Store;
import com.ruoyi.xkt.dto.express.ExpressContactDTO;
import com.ruoyi.xkt.dto.express.ExpressRegionDTO;
import com.ruoyi.xkt.dto.express.ExpressRegionTreeNodeDTO;
import com.ruoyi.xkt.dto.express.ExpressStructAddressDTO;
import com.ruoyi.xkt.domain.*;
import com.ruoyi.xkt.dto.express.*;
import com.ruoyi.xkt.manager.ExpressManager;
import com.ruoyi.xkt.manager.impl.ZtoExpressManagerImpl;
import com.ruoyi.xkt.mapper.*;
@ -26,6 +21,7 @@ import com.ruoyi.xkt.service.IExpressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Collection;
@ -53,7 +49,7 @@ public class ExpressServiceImpl implements IExpressService {
@Autowired
private ExpressFeeConfigMapper expressFeeConfigMapper;
@Autowired
private StoreOrderExpressTrackMapper storeOrderExpressTrackMapper;
private ExpressTrackRecordMapper expressTrackRecordMapper;
@Autowired
private ExpressRegionMapper expressRegionMapper;
@Autowired
@ -228,4 +224,42 @@ public class ExpressServiceImpl implements IExpressService {
}
throw new ServiceException("未知物流渠道" + expressId);
}
@Transactional(rollbackFor = Exception.class)
@Override
public Long addTrackRecord(ExpressTrackRecordAddDTO addDTO) {
Assert.notNull(addDTO);
Assert.notEmpty(addDTO.getExpressWaybillNo());
ExpressTrackRecord expressTrackRecord = new ExpressTrackRecord();
expressTrackRecord.setExpressId(addDTO.getExpressId());
expressTrackRecord.setExpressWaybillNo(addDTO.getExpressWaybillNo());
expressTrackRecord.setSort(addDTO.getSort());
expressTrackRecord.setAction(addDTO.getAction());
expressTrackRecord.setDescription(addDTO.getDescription());
expressTrackRecord.setRemark(addDTO.getRemark());
expressTrackRecord.setDelFlag(Constants.UNDELETED);
expressTrackRecordMapper.insert(expressTrackRecord);
return expressTrackRecord.getId();
}
@Override
public Map<Long, String> getAllExpressNameMap() {
List<ExpressNameDTO> expressNames = expressMapper.listAllExpressName();
return expressNames.stream().collect(Collectors.toMap(ExpressNameDTO::getId,
ExpressNameDTO::getExpressName));
}
@Override
public List<ExpressTrackRecordDTO> listTrackRecord(Collection<String> expressWaybillNos) {
if (CollUtil.isEmpty(expressWaybillNos)) {
return ListUtil.empty();
}
List<ExpressTrackRecord> expressTrackRecords = expressTrackRecordMapper.selectList(
Wrappers.lambdaQuery(ExpressTrackRecord.class)
.in(ExpressTrackRecord::getExpressWaybillNo, expressWaybillNos)
.eq(SimpleEntity::getDelFlag, Constants.UNDELETED)
// .orderByAsc(SimpleEntity::getCreateTime)
);
return BeanUtil.copyToList(expressTrackRecords, ExpressTrackRecordDTO.class);
}
}

View File

@ -52,8 +52,6 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
@Autowired
private StoreOrderDetailMapper storeOrderDetailMapper;
@Autowired
private StoreOrderExpressTrackMapper storeOrderExpressTrackMapper;
@Autowired
private StoreMapper storeMapper;
@Autowired
private StoreProductMapper storeProductMapper;
@ -365,8 +363,26 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
orderInfo.setBrandName(store.getBrandName());
}
//物流信息
Express express = expressService.getById(order.getExpressId());
orderInfo.setExpressName(Optional.ofNullable(express).map(Express::getExpressName).orElse(null));
Map<Long, String> expressNameMap = expressService.getAllExpressNameMap();
orderInfo.setExpressName(expressNameMap.get(order.getExpressId()));
Set<String> expressWaybillNos = detailInfos.stream()
.filter(o -> StrUtil.isNotEmpty(o.getExpressWaybillNo()))
.map(StoreOrderDetailDTO::getExpressWaybillNo)
.collect(Collectors.toSet());
Map<String, List<ExpressTrackRecordDTO>> trackRecordGroupMap = expressService.listTrackRecord(expressWaybillNos)
.stream()
.collect(Collectors.groupingBy(ExpressTrackRecordDTO::getExpressWaybillNo));
List<ExpressTrackDTO> expressTracks = new ArrayList<>(trackRecordGroupMap.size());
for (Map.Entry<String, List<ExpressTrackRecordDTO>> entry : trackRecordGroupMap.entrySet()) {
ExpressTrackDTO expressTrackDTO = new ExpressTrackDTO();
Long expressId = CollUtil.getFirst(entry.getValue()).getExpressId();
expressTrackDTO.setExpressId(expressId);
expressTrackDTO.setExpressName(expressNameMap.get(expressId));
expressTrackDTO.setExpressWaybillNo(entry.getKey());
expressTrackDTO.setRecords(entry.getValue());
expressTracks.add(expressTrackDTO);
}
orderInfo.setExpressTracks(expressTracks);
Map<String, ExpressRegionDTO> regionMap = expressService.getRegionMapCache();
orderInfo.setDestinationProvinceName(Optional.ofNullable(regionMap.get(orderInfo.getDestinationProvinceCode()))
.map(ExpressRegionDTO::getParentRegionName).orElse(null));
@ -1226,16 +1242,16 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
throw new ServiceException(Constants.VERSION_LOCK_ERROR_COMMON_MSG);
}
}
StoreOrderExpressTrack storeOrderExpressTrack = new StoreOrderExpressTrack();
storeOrderExpressTrack.setStoreOrderId(storeOrderDetail.getStoreOrderId());
storeOrderExpressTrack.setStoreOrderIdDetailId(storeOrderDetail.getId());
storeOrderExpressTrack.setSort(0);
storeOrderExpressTrack.setAction(trackAddDTO.getAction());
storeOrderExpressTrack.setDescription(trackAddDTO.getDescription());
storeOrderExpressTrack.setRemark(trackAddDTO.getRemark());
storeOrderExpressTrack.setDelFlag(Constants.UNDELETED);
storeOrderExpressTrackMapper.insert(storeOrderExpressTrack);
}
ExpressTrackRecordAddDTO expressTrackRecordAddDTO = ExpressTrackRecordAddDTO.builder()
.expressId(trackAddDTO.getExpressId())
.expressWaybillNo(trackAddDTO.getExpressWaybillNo())
.sort(0)
.action(trackAddDTO.getAction())
.description(trackAddDTO.getDescription())
.remark(trackAddDTO.getRemark())
.build();
expressService.addTrackRecord(expressTrackRecordAddDTO);
}
/**

View File

@ -2,4 +2,11 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.xkt.mapper.ExpressMapper">
<select id="listAllExpressName" resultType="com.ruoyi.xkt.dto.express.ExpressNameDTO">
SELECT
id,
express_name
FROM
express
</select>
</mapper>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.xkt.mapper.StoreOrderExpressTrackMapper">
<mapper namespace="com.ruoyi.xkt.mapper.ExpressTrackRecordMapper">
</mapper>