feat: 物流轨迹
parent
668b748475
commit
e55eecf5ba
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
/**
|
||||
* 排序
|
||||
*/
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
/**
|
||||
* 排序
|
||||
*/
|
||||
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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> {
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
Loading…
Reference in New Issue