diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ExpressController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ExpressController.java index c43993010..4d54858f9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ExpressController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/ExpressController.java @@ -7,6 +7,7 @@ import com.ruoyi.web.controller.xkt.vo.express.*; import com.ruoyi.xkt.dto.express.ExpressFeeDTO; import com.ruoyi.xkt.dto.express.ExpressRegionTreeNodeDTO; import com.ruoyi.xkt.dto.express.ExpressStructAddressDTO; +import com.ruoyi.xkt.dto.express.ExpressTrackRecordDTO; import com.ruoyi.xkt.service.IExpressService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -15,7 +16,9 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; /** * @author liangyq @@ -60,4 +63,13 @@ public class ExpressController extends XktBaseController { return success(BeanUtil.toBean(dto, ExpressStructAddressVO.class)); } + @ApiOperation("查询物流轨迹") + @PostMapping("queryTrackRecord") + public R>> queryTrackRecord(@Valid @RequestBody TrackRecordQueryVO vo) { + List list = expressService.listTrackRecord(vo.getExpressWaybillNos()); + Map> voMap = list.stream().map(o -> BeanUtil.toBean(o, TrackRecordVO.class)) + .collect(Collectors.groupingBy(TrackRecordVO::getExpressWaybillNo)); + return success(voMap); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/express/TrackRecordQueryVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/express/TrackRecordQueryVO.java new file mode 100644 index 000000000..5e8823e05 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/express/TrackRecordQueryVO.java @@ -0,0 +1,24 @@ +package com.ruoyi.web.controller.xkt.vo.express; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.Date; +import java.util.List; + +/** + * 物流轨迹查询 + * + * @author liangyq + * @date 2025-05-14 + **/ +@ApiModel +@Data +public class TrackRecordQueryVO { + + @NotEmpty(message = "物流运单号不能为空") + @ApiModelProperty(value = "物流运单号集合") + private List expressWaybillNos; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/express/TrackRecordVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/express/TrackRecordVO.java new file mode 100644 index 000000000..acbfa5452 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/express/TrackRecordVO.java @@ -0,0 +1,43 @@ +package com.ruoyi.web.controller.xkt.vo.express; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 物流轨迹记录 + * + * @author liangyq + * @date 2025-04-01 11:57:52.599 + **/ +@ApiModel +@Data +public class TrackRecordVO { + /** + * 物流运单号 + */ + @ApiModelProperty(value = "物流运单号") + private String expressWaybillNo; + /** + * 节点事件 + */ + @ApiModelProperty(value = "节点事件") + private String action; + /** + * 描述 + */ + @ApiModelProperty(value = "描述") + private String description; + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; + /** + * 创建时间 + */ + @ApiModelProperty(value = "时间") + private Date createTime; +} 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 1dacbbe71..eff70e7f4 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 @@ -401,6 +401,12 @@ public class StoreOrderInfoVO { @ApiModelProperty(value = "商品尺码") private Integer size; + @ApiModelProperty(value = "退货订单ID") + private Long refundOrderId; + + @ApiModelProperty(value = "退货订单号") + private String refundOrderNo; + @ApiModelProperty(value = "退货订单明细ID") private Long refundOrderDetailId; @@ -410,6 +416,18 @@ public class StoreOrderInfoVO { @ApiModelProperty(value = "退货商品数量") private Integer refundGoodsQuantity; + @ApiModelProperty(value = "退货原订单ID") + private Long originOrderId; + + @ApiModelProperty(value = "退货原订单号") + private String originOrderNo; + + @ApiModelProperty(value = "退货原订单明细状态[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成]") + private Integer originOrderDetailStatus; + + @ApiModelProperty(value = "退货原商品数量") + private Integer originGoodsQuantity; + } @ApiModel @@ -425,9 +443,15 @@ public class StoreOrderInfoVO { @ApiModelProperty(value = "物流名称") private String expressName; + @ApiModelProperty(value = "商品概要") + private String goodsSummary; + @ApiModelProperty(value = "记录") private List records; + @ApiModelProperty(value = "创建时间") + private Date createTime; + @ApiModel @Data public static class Record { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/order/StoreOrderPageItemVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/order/StoreOrderPageItemVO.java index e05b9f228..46f6d8cca 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/order/StoreOrderPageItemVO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/order/StoreOrderPageItemVO.java @@ -401,6 +401,12 @@ public class StoreOrderPageItemVO extends StoreOrderDTO { @ApiModelProperty(value = "商品尺码") private Integer size; + @ApiModelProperty(value = "退货订单ID") + private Long refundOrderId; + + @ApiModelProperty(value = "退货订单号") + private String refundOrderNo; + @ApiModelProperty(value = "退货订单明细ID") private Long refundOrderDetailId; @@ -409,5 +415,17 @@ public class StoreOrderPageItemVO extends StoreOrderDTO { @ApiModelProperty(value = "退货商品数量") private Integer refundGoodsQuantity; + + @ApiModelProperty(value = "退货原订单ID") + private Long originOrderId; + + @ApiModelProperty(value = "退货原订单号") + private String originOrderNo; + + @ApiModelProperty(value = "退货原订单明细状态[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成]") + private Integer originOrderDetailStatus; + + @ApiModelProperty(value = "退货原商品数量") + private Integer originGoodsQuantity; } } 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 fcd96630f..a8b4bcd3c 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,6 +2,7 @@ package com.ruoyi.xkt.dto.express; import lombok.Data; +import java.util.Date; import java.util.List; /** @@ -24,8 +25,16 @@ public class ExpressTrackDTO { * 物流名称 */ private String expressName; + /** + * 商品概要 + */ + private String goodsSummary; /** * 记录 */ private List records; + /** + * 创建时间 + */ + private Date createTime; } diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDetailInfoDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDetailInfoDTO.java index 43f3ce006..8fe3b0b5d 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDetailInfoDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDetailInfoDTO.java @@ -15,9 +15,21 @@ public class StoreOrderDetailInfoDTO extends StoreOrderDetailDTO { private String firstMainPicUrl; + private Long refundOrderId; + + private String refundOrderNo; + private Long refundOrderDetailId; private Integer refundOrderDetailStatus; private Integer refundGoodsQuantity; + + private Long originOrderId; + + private String originOrderNo; + + private Integer originOrderDetailStatus; + + private Integer originGoodsQuantity; } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IOperationRecordService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IOperationRecordService.java index 16af416c0..ee573db94 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IOperationRecordService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IOperationRecordService.java @@ -1,6 +1,9 @@ package com.ruoyi.xkt.service; import com.ruoyi.xkt.dto.order.StoreOrderOperationRecordAddDTO; +import com.ruoyi.xkt.dto.order.StoreOrderOperationRecordDTO; +import com.ruoyi.xkt.enums.EOrderAction; +import com.ruoyi.xkt.enums.EOrderTargetTypeAction; import java.util.List; @@ -17,4 +20,14 @@ public interface IOperationRecordService { */ void addOrderOperationRecords(List recordList); + /** + * 获取一条操作记录 + * + * @param targetId + * @param targetType + * @param action + * @return + */ + StoreOrderOperationRecordDTO getOneRecord(Long targetId, EOrderTargetTypeAction targetType, EOrderAction action); + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/OperationRecordServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/OperationRecordServiceImpl.java index ccd2ff346..bf290df24 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/OperationRecordServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/OperationRecordServiceImpl.java @@ -2,8 +2,13 @@ package com.ruoyi.xkt.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.github.pagehelper.PageHelper; import com.ruoyi.xkt.domain.StoreOrderOperationRecord; import com.ruoyi.xkt.dto.order.StoreOrderOperationRecordAddDTO; +import com.ruoyi.xkt.dto.order.StoreOrderOperationRecordDTO; +import com.ruoyi.xkt.enums.EOrderAction; +import com.ruoyi.xkt.enums.EOrderTargetTypeAction; import com.ruoyi.xkt.mapper.StoreOrderOperationRecordMapper; import com.ruoyi.xkt.service.IOperationRecordService; import org.springframework.beans.factory.annotation.Autowired; @@ -32,4 +37,20 @@ public class OperationRecordServiceImpl implements IOperationRecordService { storeOrderOperationRecordMapper.batchInsert(list); } + @Override + public StoreOrderOperationRecordDTO getOneRecord(Long targetId, EOrderTargetTypeAction targetType, + EOrderAction action) { + if (targetId == null || targetType == null || action == null) { + return null; + } + PageHelper.startPage(1, 1, false); + List records = storeOrderOperationRecordMapper.selectList( + Wrappers.lambdaQuery(StoreOrderOperationRecord.class) + .eq(StoreOrderOperationRecord::getTargetId, targetId) + .eq(StoreOrderOperationRecord::getTargetType, targetType.getValue()) + .eq(StoreOrderOperationRecord::getAction, action.getValue()) + ); + return BeanUtil.toBean(CollUtil.getFirst(records), StoreOrderOperationRecordDTO.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 d07a890bb..39243d96d 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 @@ -372,21 +372,31 @@ public class StoreOrderServiceImpl implements IStoreOrderService { //物流信息 Map expressNameMap = expressService.getAllExpressNameMap(); orderInfo.setExpressName(expressNameMap.get(order.getExpressId())); - Set expressWaybillNos = detailInfos.stream() + Map> expressWaybillGroupMap = detailInfos.stream() .filter(o -> StrUtil.isNotEmpty(o.getExpressWaybillNo())) - .map(StoreOrderDetailDTO::getExpressWaybillNo) - .collect(Collectors.toSet()); - Map> trackRecordGroupMap = expressService.listTrackRecord(expressWaybillNos) + .collect(Collectors.groupingBy(StoreOrderDetailInfoDTO::getExpressWaybillNo)); + Map> trackRecordGroupMap = expressService.listTrackRecord( + expressWaybillGroupMap.keySet()) .stream() .collect(Collectors.groupingBy(ExpressTrackRecordDTO::getExpressWaybillNo)); - List expressTracks = new ArrayList<>(trackRecordGroupMap.size()); - for (Map.Entry> entry : trackRecordGroupMap.entrySet()) { + List expressTracks = new ArrayList<>(expressWaybillGroupMap.size()); + for (Map.Entry> entry : expressWaybillGroupMap.entrySet()) { ExpressTrackDTO expressTrackDTO = new ExpressTrackDTO(); + List goodsSummaries = entry.getValue().stream() + .map(o -> StrUtil.concat(true, o.getProdArtNum(), ", ", o.getColorName(), ", ", + String.valueOf(o.getSize()))).collect(Collectors.toList()); + //发货时间 + 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)); Long expressId = CollUtil.getFirst(entry.getValue()).getExpressId(); expressTrackDTO.setExpressId(expressId); expressTrackDTO.setExpressName(expressNameMap.get(expressId)); expressTrackDTO.setExpressWaybillNo(entry.getKey()); - expressTrackDTO.setRecords(entry.getValue()); + expressTrackDTO.setGoodsSummary(StrUtil.join("; ", goodsSummaries)); + expressTrackDTO.setRecords(trackRecordGroupMap.get(entry.getKey())); expressTracks.add(expressTrackDTO); } orderInfo.setExpressTracks(expressTracks); diff --git a/xkt/src/main/resources/mapper/StoreOrderDetailMapper.xml b/xkt/src/main/resources/mapper/StoreOrderDetailMapper.xml index 167fc8b73..9ad1bb1f8 100644 --- a/xkt/src/main/resources/mapper/StoreOrderDetailMapper.xml +++ b/xkt/src/main/resources/mapper/StoreOrderDetailMapper.xml @@ -5,12 +5,21 @@