- 优化订单列表返回结构
parent
1900ccafe2
commit
abf3251122
|
@ -1,9 +1,9 @@
|
||||||
package cn.iocoder.common.framework.util;
|
package cn.iocoder.common.framework.util;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import org.springframework.util.ReflectionUtils;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashSet;
|
import java.lang.reflect.Field;
|
||||||
import java.util.Set;
|
import java.util.*;
|
||||||
|
|
||||||
public class CollectionUtil {
|
public class CollectionUtil {
|
||||||
|
|
||||||
|
@ -12,7 +12,56 @@ public class CollectionUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> Set<T> asSet(T... objs) {
|
public static <T> Set<T> asSet(T... objs) {
|
||||||
return new HashSet<>(Arrays.asList(objs));
|
return new HashSet<>(Arrays.asList(objs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建指定属性为KEY, objs的每个元素为值的Multimap的Map集合。
|
||||||
|
*
|
||||||
|
* @param objs 数组
|
||||||
|
* @param keyClazz 值类型,即{@code property}的类型
|
||||||
|
* @param valClazz 值类型
|
||||||
|
* @param property 属性名
|
||||||
|
* @param <K> 泛型
|
||||||
|
* @param <V> 泛型
|
||||||
|
* @return 指定属性的Map集合
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <K, V> Map<K, List<V>> buildMultimap(List<V> objs, Class<K> keyClazz, Class<V> valClazz,
|
||||||
|
String property) {
|
||||||
|
if (objs.isEmpty()) {
|
||||||
|
return Collections.EMPTY_MAP;
|
||||||
|
}
|
||||||
|
Map<K, List<V>> results = new HashMap<>(objs.size());
|
||||||
|
try {
|
||||||
|
Field field = getField(objs, property);
|
||||||
|
for (V obj : objs) {
|
||||||
|
K key = (K) field.get(obj);
|
||||||
|
List<V> value = results.get(key);
|
||||||
|
if (value == null) {
|
||||||
|
results.put(key, value = new ArrayList<>());
|
||||||
|
}
|
||||||
|
value.add(obj);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 object 属性 field
|
||||||
|
*
|
||||||
|
* @param objs 对象数组
|
||||||
|
* @param property 属性
|
||||||
|
* @return 对象元素里的指定属性Field, 并设置该field可以被访问
|
||||||
|
*/
|
||||||
|
public static Field getField(List<?> objs, String property) {
|
||||||
|
Field field = ReflectionUtils.findField(objs.get(0).getClass(), property);
|
||||||
|
if (!field.isAccessible()) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
}
|
||||||
|
return field;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -2,6 +2,7 @@ package cn.iocoder.mall.order.api.dto;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单 page
|
* 订单 page
|
||||||
|
@ -79,9 +80,17 @@ public class OrderBO implements Serializable {
|
||||||
*/
|
*/
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 关联信息
|
||||||
|
|
||||||
|
/**
|
||||||
|
* orderItem
|
||||||
|
*/
|
||||||
|
private List<OrderItemBO> orderItems;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "OrderPageBO{" +
|
return "OrderBO{" +
|
||||||
"id=" + id +
|
"id=" + id +
|
||||||
", userId=" + userId +
|
", userId=" + userId +
|
||||||
", orderLogisticsId=" + orderLogisticsId +
|
", orderLogisticsId=" + orderLogisticsId +
|
||||||
|
@ -94,6 +103,7 @@ public class OrderBO implements Serializable {
|
||||||
", hasReturnExchange=" + hasReturnExchange +
|
", hasReturnExchange=" + hasReturnExchange +
|
||||||
", status=" + status +
|
", status=" + status +
|
||||||
", remark='" + remark + '\'' +
|
", remark='" + remark + '\'' +
|
||||||
|
", orderItems=" + orderItems +
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,4 +214,13 @@ public class OrderBO implements Serializable {
|
||||||
this.remark = remark;
|
this.remark = remark;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<OrderItemBO> getOrderItems() {
|
||||||
|
return orderItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderBO setOrderItems(List<OrderItemBO> orderItems) {
|
||||||
|
this.orderItems = orderItems;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,207 @@
|
||||||
|
package cn.iocoder.mall.order.api.dto;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单 item
|
||||||
|
*
|
||||||
|
* @author Sin
|
||||||
|
* @time 2019-03-28 21:11
|
||||||
|
*/
|
||||||
|
public class OrderItemBO implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编号
|
||||||
|
*/
|
||||||
|
private Integer id;
|
||||||
|
/**
|
||||||
|
* 订单编号
|
||||||
|
*/
|
||||||
|
private Integer orderId;
|
||||||
|
/**
|
||||||
|
* 订单号
|
||||||
|
*/
|
||||||
|
private String orderNo;
|
||||||
|
/**
|
||||||
|
* 商品编号
|
||||||
|
*/
|
||||||
|
private Integer skuId;
|
||||||
|
/**
|
||||||
|
* 数量
|
||||||
|
*/
|
||||||
|
private Integer quantity;
|
||||||
|
/**
|
||||||
|
* 金额(分)
|
||||||
|
*/
|
||||||
|
private Integer price;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 时间信息
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 付款时间
|
||||||
|
*/
|
||||||
|
private Date paymentTime;
|
||||||
|
/**
|
||||||
|
* 发货时间
|
||||||
|
*/
|
||||||
|
private Date deliveryTime;
|
||||||
|
/**
|
||||||
|
* 收货时间
|
||||||
|
*/
|
||||||
|
private Date receiverTime;
|
||||||
|
/**
|
||||||
|
* 成交时间
|
||||||
|
*/
|
||||||
|
private Date closingTime;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 其他
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否退货
|
||||||
|
*
|
||||||
|
* - 1、没有
|
||||||
|
* - 2、换货
|
||||||
|
* - 3、退货
|
||||||
|
* - 4、换货 + 退货
|
||||||
|
*/
|
||||||
|
private Integer hasReturnExchange;
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*
|
||||||
|
* - 1、待付款
|
||||||
|
* - 2、待发货
|
||||||
|
* - 3、已发货
|
||||||
|
* - 4、已完成
|
||||||
|
* - 5、已关闭
|
||||||
|
*/
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "OrderItemDO{" +
|
||||||
|
"id=" + id +
|
||||||
|
", orderId=" + orderId +
|
||||||
|
", orderNo='" + orderNo + '\'' +
|
||||||
|
", skuId='" + skuId + '\'' +
|
||||||
|
", quantity=" + quantity +
|
||||||
|
", price=" + price +
|
||||||
|
", paymentTime=" + paymentTime +
|
||||||
|
", deliveryTime=" + deliveryTime +
|
||||||
|
", receiverTime=" + receiverTime +
|
||||||
|
", closingTime=" + closingTime +
|
||||||
|
", hasReturnExchange=" + hasReturnExchange +
|
||||||
|
", status=" + status +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getOrderId() {
|
||||||
|
return orderId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setOrderId(Integer orderId) {
|
||||||
|
this.orderId = orderId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOrderNo() {
|
||||||
|
return orderNo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setOrderNo(String orderNo) {
|
||||||
|
this.orderNo = orderNo;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getSkuId() {
|
||||||
|
return skuId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setSkuId(Integer skuId) {
|
||||||
|
this.skuId = skuId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getQuantity() {
|
||||||
|
return quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setQuantity(Integer quantity) {
|
||||||
|
this.quantity = quantity;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPrice() {
|
||||||
|
return price;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setPrice(Integer price) {
|
||||||
|
this.price = price;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getPaymentTime() {
|
||||||
|
return paymentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setPaymentTime(Date paymentTime) {
|
||||||
|
this.paymentTime = paymentTime;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getDeliveryTime() {
|
||||||
|
return deliveryTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setDeliveryTime(Date deliveryTime) {
|
||||||
|
this.deliveryTime = deliveryTime;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getReceiverTime() {
|
||||||
|
return receiverTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setReceiverTime(Date receiverTime) {
|
||||||
|
this.receiverTime = receiverTime;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getClosingTime() {
|
||||||
|
return closingTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setClosingTime(Date closingTime) {
|
||||||
|
this.closingTime = closingTime;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getHasReturnExchange() {
|
||||||
|
return hasReturnExchange;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setHasReturnExchange(Integer hasReturnExchange) {
|
||||||
|
this.hasReturnExchange = hasReturnExchange;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderItemBO setStatus(Integer status) {
|
||||||
|
this.status = status;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,10 @@
|
||||||
package cn.iocoder.mall.order.application.convert;
|
package cn.iocoder.mall.order.application.convert;
|
||||||
|
|
||||||
import cn.iocoder.mall.order.api.dto.OrderCreateItemDTO;
|
import cn.iocoder.mall.order.api.dto.OrderCreateItemDTO;
|
||||||
|
import cn.iocoder.mall.order.api.dto.OrderItemBO;
|
||||||
import cn.iocoder.mall.order.api.dto.OrderItemUpdateDTO;
|
import cn.iocoder.mall.order.api.dto.OrderItemUpdateDTO;
|
||||||
import cn.iocoder.mall.order.dataobject.OrderItemDO;
|
import cn.iocoder.mall.order.dataobject.OrderItemDO;
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
import org.mapstruct.Mappings;
|
import org.mapstruct.Mappings;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
@ -14,6 +16,7 @@ import java.util.List;
|
||||||
* @author Sin
|
* @author Sin
|
||||||
* @time 2019-03-23 14:34
|
* @time 2019-03-23 14:34
|
||||||
*/
|
*/
|
||||||
|
@Mapper
|
||||||
public interface OrderItemConvert {
|
public interface OrderItemConvert {
|
||||||
|
|
||||||
OrderItemConvert INSTANCE = Mappers.getMapper(OrderItemConvert.class);
|
OrderItemConvert INSTANCE = Mappers.getMapper(OrderItemConvert.class);
|
||||||
|
@ -23,4 +26,7 @@ public interface OrderItemConvert {
|
||||||
|
|
||||||
@Mappings({})
|
@Mappings({})
|
||||||
List<OrderItemDO> convert(List<OrderCreateItemDTO> orderCreateItemDTOList);
|
List<OrderItemDO> convert(List<OrderCreateItemDTO> orderCreateItemDTOList);
|
||||||
|
|
||||||
|
@Mappings({})
|
||||||
|
List<OrderItemBO> convertOrderItemDO(List<OrderItemDO> orderItemDOList);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package cn.iocoder.mall.order.application.convert;
|
||||||
import cn.iocoder.mall.order.api.dto.OrderCreateDTO;
|
import cn.iocoder.mall.order.api.dto.OrderCreateDTO;
|
||||||
import cn.iocoder.mall.order.api.dto.OrderLogisticsUpdateDTO;
|
import cn.iocoder.mall.order.api.dto.OrderLogisticsUpdateDTO;
|
||||||
import cn.iocoder.mall.order.dataobject.OrderLogisticsDO;
|
import cn.iocoder.mall.order.dataobject.OrderLogisticsDO;
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
import org.mapstruct.Mappings;
|
import org.mapstruct.Mappings;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
@ -12,6 +13,7 @@ import org.mapstruct.factory.Mappers;
|
||||||
* @author Sin
|
* @author Sin
|
||||||
* @time 2019-03-23 14:39
|
* @time 2019-03-23 14:39
|
||||||
*/
|
*/
|
||||||
|
@Mapper
|
||||||
public interface OrderLogisticsConvert {
|
public interface OrderLogisticsConvert {
|
||||||
|
|
||||||
OrderLogisticsConvert INSTANCE = Mappers.getMapper(OrderLogisticsConvert.class);
|
OrderLogisticsConvert INSTANCE = Mappers.getMapper(OrderLogisticsConvert.class);
|
||||||
|
|
|
@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Param;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -41,6 +42,18 @@ public interface OrderItemMapper {
|
||||||
OrderItemDO orderItemDO
|
OrderItemDO orderItemDO
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询 - 根据 orderIds 和 status
|
||||||
|
*
|
||||||
|
* @param orderIds
|
||||||
|
* @param status
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<OrderItemDO> selectByOrderIdsAndStatus(
|
||||||
|
@Param("orderIds") Collection<Integer> orderIds,
|
||||||
|
@Param("status") Integer status
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询 - 根据 orderId 下的 item
|
* 查询 - 根据 orderId 下的 item
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package cn.iocoder.mall.order.service;
|
package cn.iocoder.mall.order.service;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
|
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
|
||||||
|
import cn.iocoder.common.framework.util.CollectionUtil;
|
||||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||||
import cn.iocoder.common.framework.vo.CommonResult;
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
import cn.iocoder.mall.order.OrderCommon;
|
import cn.iocoder.mall.order.OrderCommon;
|
||||||
|
@ -53,13 +54,33 @@ public class OrderServiceImpl implements OrderService {
|
||||||
return CommonResult.success(new OrderPageBO().setTotal(0));
|
return CommonResult.success(new OrderPageBO().setTotal(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取订单数据
|
||||||
List<OrderDO> orderDOList = orderMapper.selectPage(orderQueryDTO);
|
List<OrderDO> orderDOList = orderMapper.selectPage(orderQueryDTO);
|
||||||
|
|
||||||
|
// 获取订单 id
|
||||||
|
Set<Integer> orderIds = orderDOList.stream().map(orderDO -> orderDO.getId()).collect(Collectors.toSet());
|
||||||
|
|
||||||
|
// 获取 订单的 items
|
||||||
|
List<OrderItemDO> orderItemDOList = orderItemMapper
|
||||||
|
.selectByOrderIdsAndStatus(orderIds, DeletedStatusEnum.DELETED_NO.getValue());
|
||||||
|
|
||||||
|
List<OrderItemBO> orderItemBOList = OrderItemConvert.INSTANCE.convertOrderItemDO(orderItemDOList);
|
||||||
|
Map<Integer, List<OrderItemBO>> orderItemBOMultimap = CollectionUtil
|
||||||
|
.buildMultimap(orderItemBOList, Integer.class, OrderItemBO.class, "orderId");
|
||||||
|
|
||||||
|
// 转换 orderDO 为 OrderBO,并设置 item
|
||||||
List<OrderBO> orderPageBOList = OrderConvert.INSTANCE.convertPageBO(orderDOList);
|
List<OrderBO> orderPageBOList = OrderConvert.INSTANCE.convertPageBO(orderDOList);
|
||||||
|
List<OrderBO> result = orderPageBOList.stream().map(orderBO -> {
|
||||||
|
if (orderItemBOMultimap.containsKey(orderBO.getId())) {
|
||||||
|
orderBO.setOrderItems(orderItemBOMultimap.get(orderBO.getId()));
|
||||||
|
}
|
||||||
|
return orderBO;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
return CommonResult.success(
|
return CommonResult.success(
|
||||||
new OrderPageBO()
|
new OrderPageBO()
|
||||||
.setTotal(totalCount)
|
.setTotal(totalCount)
|
||||||
.setOrders(orderPageBOList)
|
.setOrders(result)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,4 +110,17 @@
|
||||||
AND order_id = #{orderId}
|
AND order_id = #{orderId}
|
||||||
</if>
|
</if>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
查询 - 根据 orderIds 和 status
|
||||||
|
-->
|
||||||
|
<select id="selectByOrderIdsAndStatus" resultType="cn.iocoder.mall.order.dataobject.OrderItemDO">
|
||||||
|
SELECT * FROM `order_item`
|
||||||
|
WHERE `status` = #{status}
|
||||||
|
AND `order_id`
|
||||||
|
IN
|
||||||
|
<foreach collection="orderIds" index="orderId" open="(" close=")" separator=",">
|
||||||
|
#{orderId}
|
||||||
|
</foreach>
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
Loading…
Reference in New Issue