diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/order/StoreOrderInfoVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/order/StoreOrderInfoVO.java index 60ccde7bd..1dacbbe71 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/order/StoreOrderInfoVO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/order/StoreOrderInfoVO.java @@ -245,6 +245,9 @@ public class StoreOrderInfoVO { @ApiModelProperty(value = "订单明细") private List orderDetails; + @ApiModelProperty(value = "轨迹信息") + private List 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 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; + } + } + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/domain/StoreOrderExpressTrack.java b/xkt/src/main/java/com/ruoyi/xkt/domain/ExpressTrackRecord.java similarity index 74% rename from xkt/src/main/java/com/ruoyi/xkt/domain/StoreOrderExpressTrack.java rename to xkt/src/main/java/com/ruoyi/xkt/domain/ExpressTrackRecord.java index 147c9fc35..61d478b00 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/domain/StoreOrderExpressTrack.java +++ b/xkt/src/main/java/com/ruoyi/xkt/domain/ExpressTrackRecord.java @@ -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; /** * 排序 */ diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressNameDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressNameDTO.java new file mode 100644 index 000000000..ed9806c1e --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressNameDTO.java @@ -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; +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressTrackDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressTrackDTO.java index 9240549b9..fcd96630f 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressTrackDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressTrackDTO.java @@ -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 items; - - @Data - public static class Item { - /** - * 节点事件 - */ - private String action; - /** - * 描述 - */ - private String description; - /** - * 备注 - */ - private String remark; - /** - * 创建时间 - */ - private Date createTime; - } + private String expressName; + /** + * 记录 + */ + private List records; } diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressTrackRecordAddDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressTrackRecordAddDTO.java new file mode 100644 index 000000000..e7748515d --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressTrackRecordAddDTO.java @@ -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; +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderExpressTrackDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressTrackRecordDTO.java similarity index 79% rename from xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderExpressTrackDTO.java rename to xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressTrackRecordDTO.java index b844c27dc..84ecb590c 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderExpressTrackDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/express/ExpressTrackRecordDTO.java @@ -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; /** * 排序 */ diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/ExpressMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/ExpressMapper.java index e08ee75e3..60418ab60 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/ExpressMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/ExpressMapper.java @@ -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 { + + List listAllExpressName(); + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderExpressTrackMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/ExpressTrackRecordMapper.java similarity index 53% rename from xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderExpressTrackMapper.java rename to xkt/src/main/java/com/ruoyi/xkt/mapper/ExpressTrackRecordMapper.java index 5e4871bc3..bf19740f1 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderExpressTrackMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/ExpressTrackRecordMapper.java @@ -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 { +public interface ExpressTrackRecordMapper extends BaseMapper { } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IExpressService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IExpressService.java index f605ec2e8..88f8cf2cc 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IExpressService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IExpressService.java @@ -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 getAllExpressNameMap(); + + /** + * 获取轨迹记录 + * + * @param expressWaybillNos + * @return + */ + List listTrackRecord(Collection expressWaybillNos); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/ExpressServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/ExpressServiceImpl.java index 575e2303d..de4a34d68 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/ExpressServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/ExpressServiceImpl.java @@ -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 getAllExpressNameMap() { + List expressNames = expressMapper.listAllExpressName(); + return expressNames.stream().collect(Collectors.toMap(ExpressNameDTO::getId, + ExpressNameDTO::getExpressName)); + } + + @Override + public List listTrackRecord(Collection expressWaybillNos) { + if (CollUtil.isEmpty(expressWaybillNos)) { + return ListUtil.empty(); + } + List 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); + } } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java index 6792e47c7..8b7944c1f 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java @@ -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 expressNameMap = expressService.getAllExpressNameMap(); + orderInfo.setExpressName(expressNameMap.get(order.getExpressId())); + Set expressWaybillNos = detailInfos.stream() + .filter(o -> StrUtil.isNotEmpty(o.getExpressWaybillNo())) + .map(StoreOrderDetailDTO::getExpressWaybillNo) + .collect(Collectors.toSet()); + Map> trackRecordGroupMap = expressService.listTrackRecord(expressWaybillNos) + .stream() + .collect(Collectors.groupingBy(ExpressTrackRecordDTO::getExpressWaybillNo)); + List expressTracks = new ArrayList<>(trackRecordGroupMap.size()); + for (Map.Entry> 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 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); } /** diff --git a/xkt/src/main/resources/mapper/ExpressMapper.xml b/xkt/src/main/resources/mapper/ExpressMapper.xml index f317a7e9e..2171869b2 100644 --- a/xkt/src/main/resources/mapper/ExpressMapper.xml +++ b/xkt/src/main/resources/mapper/ExpressMapper.xml @@ -2,4 +2,11 @@ + \ No newline at end of file diff --git a/xkt/src/main/resources/mapper/StoreOrderExpressTrackMapper.xml b/xkt/src/main/resources/mapper/ExpressTrackRecordMapper.xml similarity index 65% rename from xkt/src/main/resources/mapper/StoreOrderExpressTrackMapper.xml rename to xkt/src/main/resources/mapper/ExpressTrackRecordMapper.xml index a0d8d5ac6..d530a9ef5 100644 --- a/xkt/src/main/resources/mapper/StoreOrderExpressTrackMapper.xml +++ b/xkt/src/main/resources/mapper/ExpressTrackRecordMapper.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file