feat(订单/格口): 新增订单与格口的关联查询功能
新增OrderWithGoodsDTO和CabinetCellWithOrderCountDTO,用于查询订单与商品信息及格口与订单数量的关联数据。修改相关Service、Mapper和Controller,支持分页查询订单列表和格口列表时返回关联信息。优化查询条件,增加订单ID和格口ID的过滤条件。
This commit is contained in:
parent
ec7c3e5aa5
commit
f33f74b20a
|
@ -9,6 +9,7 @@ import com.agileboot.common.enums.common.BusinessTypeEnum;
|
|||
import com.agileboot.common.utils.poi.CustomExcelUtil;
|
||||
import com.agileboot.domain.shop.order.OrderApplicationService;
|
||||
import com.agileboot.domain.shop.order.db.ShopOrderEntity;
|
||||
import com.agileboot.domain.shop.order.db.dto.OrderWithGoodsDTO;
|
||||
import com.agileboot.domain.shop.order.dto.ShopOrderExcelDTO;
|
||||
import com.agileboot.domain.shop.order.query.SearchShopOrderQuery;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
|
@ -35,9 +36,9 @@ public class ShopOrderController extends BaseController {
|
|||
@Operation(summary = "订单列表")
|
||||
// @PreAuthorize("@permission.has('shop:goods:list')")
|
||||
@GetMapping("/list")
|
||||
public ResponseDTO<PageDTO<ShopOrderEntity>> list(SearchShopOrderQuery<ShopOrderEntity> query) {
|
||||
public ResponseDTO<PageDTO<OrderWithGoodsDTO>> list(SearchShopOrderQuery<OrderWithGoodsDTO> query) {
|
||||
log.info("订单列表查询参数:{}", JSONUtil.toJsonStr(query));
|
||||
PageDTO<ShopOrderEntity> page = orderApplicationService.getOrderList(query);
|
||||
PageDTO<OrderWithGoodsDTO> page = orderApplicationService.getOrderList(query);
|
||||
return ResponseDTO.ok(page);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.agileboot.domain.cabinet.cell;
|
||||
|
||||
import com.agileboot.common.core.page.PageDTO;
|
||||
import com.agileboot.domain.cabinet.cell.dto.CabinetCellWithOrderCountDTO;
|
||||
import com.agileboot.domain.common.command.BulkOperationCommand;
|
||||
import com.agileboot.domain.cabinet.cell.command.AddCabinetCellCommand;
|
||||
import com.agileboot.domain.cabinet.cell.command.UpdateCabinetCellCommand;
|
||||
|
@ -29,7 +30,8 @@ public class CabinetCellApplicationService {
|
|||
private final ShopGoodsService shopGoodsService;
|
||||
|
||||
public PageDTO<CabinetCellDTO> getCabinetCellList(SearchCabinetCellQuery<CabinetCellEntity> query) {
|
||||
Page<CabinetCellEntity> page = cabinetCellService.getCellList(query);
|
||||
// Page<CabinetCellEntity> page = cabinetCellService.getCellList(query);
|
||||
Page<CabinetCellWithOrderCountDTO> page = cabinetCellService.getCellListWithOrders(query);
|
||||
List<ShopGoodsEntity> goodsList = shopGoodsService.selectAll();
|
||||
List<CabinetCellDTO> dtoList = page.getRecords().stream()
|
||||
.map(cell -> {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.agileboot.domain.cabinet.cell.db;
|
||||
|
||||
import com.agileboot.domain.cabinet.cell.dto.CabinetCellWithOrderCountDTO;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
|
@ -51,4 +52,13 @@ public interface CabinetCellMapper extends BaseMapper<CabinetCellEntity> {
|
|||
"WHERE cell_id = #{cellId}")
|
||||
void clearGoodsIdAndFreeCell(@Param("cellId") Long cellId);
|
||||
|
||||
@Select("SELECT cc.*, COUNT(sog.order_goods_id) AS orderCount " +
|
||||
"FROM cabinet_cell cc " +
|
||||
"LEFT JOIN shop_order_goods sog ON cc.cell_id = sog.cell_id AND sog.deleted = 0 " +
|
||||
"${ew.customSqlSegment} ")
|
||||
Page<CabinetCellWithOrderCountDTO> getCellListWithOrders(
|
||||
Page<CabinetCellEntity> page,
|
||||
@Param(Constants.WRAPPER) Wrapper<CabinetCellEntity> queryWrapper
|
||||
);
|
||||
|
||||
}
|
||||
|
|
|
@ -1,9 +1,14 @@
|
|||
package com.agileboot.domain.cabinet.cell.db;
|
||||
|
||||
import com.agileboot.common.core.page.AbstractPageQuery;
|
||||
import com.agileboot.domain.cabinet.cell.dto.CabinetCellWithOrderCountDTO;
|
||||
import com.agileboot.domain.cabinet.smartCabinet.dto.CabinetDetailDTO;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
@ -23,4 +28,6 @@ public interface CabinetCellService extends IService<CabinetCellEntity> {
|
|||
List<CabinetCellEntity> selectByGoodsId(Long goodsId);
|
||||
|
||||
void clearGoodsIdAndFreeCell(Long cellId);
|
||||
|
||||
Page<CabinetCellWithOrderCountDTO> getCellListWithOrders(AbstractPageQuery<CabinetCellEntity> query);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.agileboot.domain.cabinet.cell.db;
|
||||
|
||||
import com.agileboot.common.core.page.AbstractPageQuery;
|
||||
import com.agileboot.domain.cabinet.cell.dto.CabinetCellWithOrderCountDTO;
|
||||
import com.agileboot.domain.cabinet.smartCabinet.dto.CabinetDetailDTO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
|
@ -40,4 +41,9 @@ public class CabinetCellServiceImpl extends ServiceImpl<CabinetCellMapper, Cabin
|
|||
public void clearGoodsIdAndFreeCell(Long cellId) {
|
||||
baseMapper.clearGoodsIdAndFreeCell(cellId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<CabinetCellWithOrderCountDTO> getCellListWithOrders(AbstractPageQuery<CabinetCellEntity> query) {
|
||||
return baseMapper.getCellListWithOrders(query.toPage(), query.toQueryWrapper());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,12 @@ public class CabinetCellDTO {
|
|||
}
|
||||
}
|
||||
|
||||
public CabinetCellDTO(CabinetCellWithOrderCountDTO entity) {
|
||||
if (entity != null) {
|
||||
BeanUtil.copyProperties(entity, this);
|
||||
}
|
||||
}
|
||||
|
||||
@ExcelColumn(name = "格口ID")
|
||||
private Long cellId;
|
||||
|
||||
|
@ -40,6 +46,9 @@ public class CabinetCellDTO {
|
|||
@ExcelColumn(name = "库存数量")
|
||||
private Integer stock;
|
||||
|
||||
@ExcelColumn(name = "订单数量")
|
||||
private Integer orderCount;
|
||||
|
||||
@ExcelColumn(name = "格口类型")
|
||||
private Integer cellType;
|
||||
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
package com.agileboot.domain.cabinet.cell.dto;
|
||||
|
||||
import com.agileboot.domain.cabinet.cell.db.CabinetCellEntity;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class CabinetCellWithOrderCountDTO extends CabinetCellEntity {
|
||||
@ApiModelProperty("历史订单数量")
|
||||
private Integer orderCount;
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
package com.agileboot.domain.cabinet.cell.query;
|
||||
|
||||
import com.agileboot.common.core.page.AbstractPageQuery;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class SearchCabinetCellWithOrdersQuery<T> extends AbstractPageQuery<T> {
|
||||
private Long cellId;
|
||||
private Long cabinetId;
|
||||
private Integer cellNo;
|
||||
private Integer cellType;
|
||||
private Integer usageStatus;
|
||||
private Integer availableStatus;
|
||||
private Date startTime;
|
||||
private Date endTime;
|
||||
|
||||
@Override
|
||||
public QueryWrapper<T> addQueryCondition() {
|
||||
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
|
||||
|
||||
queryWrapper
|
||||
.eq(cellId != null, "cc.cell_id", cellId)
|
||||
.eq(cabinetId != null, "cc.cabinet_id", cabinetId)
|
||||
.eq(cellNo != null, "cc.cell_no", cellNo)
|
||||
.eq(cellType != null, "cc.cell_type", cellType)
|
||||
.eq(usageStatus != null, "cc.usage_status", usageStatus)
|
||||
.eq(availableStatus != null, "cc.available_status", availableStatus)
|
||||
.eq("cc.deleted", false)
|
||||
.between(startTime != null && endTime != null, "cc.create_time", startTime, endTime);
|
||||
|
||||
this.timeRangeColumn = "create_time";
|
||||
|
||||
return queryWrapper;
|
||||
}
|
||||
}
|
|
@ -25,6 +25,7 @@ import com.agileboot.domain.shop.order.db.ShopOrderEntity;
|
|||
import com.agileboot.domain.shop.order.db.ShopOrderService;
|
||||
import com.agileboot.domain.shop.order.db.ShopOrderGoodsEntity;
|
||||
import com.agileboot.domain.shop.order.db.ShopOrderGoodsService;
|
||||
import com.agileboot.domain.shop.order.db.dto.OrderWithGoodsDTO;
|
||||
import com.agileboot.domain.shop.order.dto.CreateOrderResult;
|
||||
import com.agileboot.domain.shop.order.dto.GetOrdersByOpenIdDTO;
|
||||
import com.agileboot.domain.shop.order.dto.ShopOrderDTO;
|
||||
|
@ -74,8 +75,8 @@ public class OrderApplicationService {
|
|||
private final CabinetCellOperationModelFactory cabinetCellOperationModelFactory;
|
||||
private final PaymentOperationLogApplicationService paymentOperationLogApplicationService;
|
||||
|
||||
public PageDTO<ShopOrderEntity> getOrderList(SearchShopOrderQuery<ShopOrderEntity> query) {
|
||||
Page<ShopOrderEntity> page = orderService.page(query.toPage(), query.toQueryWrapper());
|
||||
public PageDTO<OrderWithGoodsDTO> getOrderList(SearchShopOrderQuery<OrderWithGoodsDTO> query) {
|
||||
Page<OrderWithGoodsDTO> page = orderService.getOrderList(query);
|
||||
return new PageDTO<>(page.getRecords(), page.getTotal());
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
package com.agileboot.domain.shop.order.db;
|
||||
|
||||
import com.agileboot.domain.shop.order.db.dto.OrderWithGoodsDTO;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
|
@ -12,4 +18,14 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||
*/
|
||||
public interface ShopOrderMapper extends BaseMapper<ShopOrderEntity> {
|
||||
|
||||
@Select("SELECT o.*, " +
|
||||
"GROUP_CONCAT(DISTINCT og.goods_name) AS goodsNames, " +
|
||||
"GROUP_CONCAT(DISTINCT og.cover_img) AS coverImgs " +
|
||||
"FROM shop_order o " +
|
||||
"LEFT JOIN shop_order_goods og ON o.order_id = og.order_id AND og.deleted = 0 " +
|
||||
"${ew.customSqlSegment}")
|
||||
Page<OrderWithGoodsDTO> getOrderList(
|
||||
Page<OrderWithGoodsDTO> page,
|
||||
@Param(Constants.WRAPPER) Wrapper<OrderWithGoodsDTO> queryWrapper
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
package com.agileboot.domain.shop.order.db;
|
||||
|
||||
import com.agileboot.domain.shop.order.db.dto.OrderWithGoodsDTO;
|
||||
import com.agileboot.domain.shop.order.query.SearchShopOrderQuery;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
|
@ -11,4 +15,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
|||
* @since 2025-03-10
|
||||
*/
|
||||
public interface ShopOrderService extends IService<ShopOrderEntity> {
|
||||
Page<OrderWithGoodsDTO> getOrderList(SearchShopOrderQuery<OrderWithGoodsDTO> query);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
package com.agileboot.domain.shop.order.db;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.agileboot.domain.shop.order.db.dto.OrderWithGoodsDTO;
|
||||
import com.agileboot.domain.shop.order.model.OrderModel;
|
||||
import com.agileboot.domain.shop.order.query.SearchShopOrderQuery;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
|
@ -15,4 +19,8 @@ import org.springframework.stereotype.Service;
|
|||
*/
|
||||
@Service
|
||||
public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrderEntity> implements ShopOrderService {
|
||||
@Override
|
||||
public Page<OrderWithGoodsDTO> getOrderList(SearchShopOrderQuery<OrderWithGoodsDTO> query) {
|
||||
return baseMapper.getOrderList(query.toPage(), query.toQueryWrapper());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
package com.agileboot.domain.shop.order.db.dto;
|
||||
|
||||
import com.agileboot.domain.shop.order.db.ShopOrderEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class OrderWithGoodsDTO extends ShopOrderEntity {
|
||||
private String goodsNames;
|
||||
private String coverImgs;
|
||||
}
|
|
@ -12,7 +12,8 @@ import lombok.EqualsAndHashCode;
|
|||
@Data
|
||||
public class SearchShopOrderQuery<T> extends AbstractPageQuery<T> {
|
||||
|
||||
private String orderNumber;
|
||||
private Long orderId;
|
||||
private Long cellId;
|
||||
private Integer status;
|
||||
private Integer payStatus;
|
||||
private Date startTime;
|
||||
|
@ -25,16 +26,18 @@ public class SearchShopOrderQuery<T> extends AbstractPageQuery<T> {
|
|||
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
|
||||
|
||||
queryWrapper
|
||||
.like(StrUtil.isNotEmpty(orderNumber), "order_number", orderNumber)
|
||||
.eq(status != null, "status", status)
|
||||
.eq(payStatus != null, "pay_status", payStatus)
|
||||
.eq(StrUtil.isNotEmpty(paymentMethod), "payment_method", paymentMethod)
|
||||
.between(startTime != null && endTime != null, "create_time", startTime, endTime)
|
||||
.between(payTime != null, "pay_time",
|
||||
.eq(orderId != null, "o.order_id", orderId)
|
||||
.eq(cellId != null, "og.cell_id", cellId)
|
||||
.eq(status != null, "o.status", status)
|
||||
.eq(payStatus != null, "o.pay_status", payStatus)
|
||||
.eq(StrUtil.isNotEmpty(paymentMethod), "o.payment_method", paymentMethod)
|
||||
.between(startTime != null && endTime != null, "o.create_time", startTime, endTime)
|
||||
.between(payTime != null, "o.pay_time",
|
||||
payTime == null ? null : DateUtil.beginOfDay(payTime).toJdkDate(),
|
||||
payTime == null ? null : DateUtil.endOfDay(payTime).toJdkDate())
|
||||
.eq("deleted", 0)
|
||||
.orderByDesc("create_time");
|
||||
.eq("o.deleted", 0)
|
||||
.groupBy("o.order_id")
|
||||
.orderByDesc("o.create_time");
|
||||
|
||||
return queryWrapper;
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ public class SearchUserQuery<T> extends AbstractPageQuery<T> {
|
|||
|
||||
protected Long userId;
|
||||
protected String username;
|
||||
protected String nickname;
|
||||
protected Integer status;
|
||||
protected String phoneNumber;
|
||||
protected Long deptId;
|
||||
|
@ -26,6 +27,7 @@ public class SearchUserQuery<T> extends AbstractPageQuery<T> {
|
|||
|
||||
queryWrapper.like(StrUtil.isNotEmpty(username), "username", username)
|
||||
.like(StrUtil.isNotEmpty(phoneNumber), "u.phone_number", phoneNumber)
|
||||
.like(StrUtil.isNotEmpty(nickname), "u.nickname", nickname)
|
||||
.eq(userId != null, "u.user_id", userId)
|
||||
.eq(status != null, "u.status", status)
|
||||
.eq("u.deleted", 0)
|
||||
|
|
Loading…
Reference in New Issue