|
@@ -1,11 +1,15 @@
|
|
|
package cn.iocoder.yudao.module.product.dal.mysql.spu;
|
|
|
|
|
|
+import cn.hutool.core.util.ObjUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
|
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
|
+import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
|
|
import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO;
|
|
|
import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
|
|
|
import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
|
|
|
+import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import org.apache.ibatis.annotations.Mapper;
|
|
|
|
|
@@ -46,16 +50,28 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> {
|
|
|
.orderByDesc(ProductSpuDO::getSort));
|
|
|
}
|
|
|
|
|
|
- default PageResult<ProductSpuDO> selectPage(AppProductSpuPageReqVO pageReqVO, Integer status) {
|
|
|
+ /**
|
|
|
+ * 获得商品 SPU 分页,提供给用户 App 使用
|
|
|
+ */
|
|
|
+ default PageResult<ProductSpuDO> selectPage(AppProductSpuPageReqVO pageReqVO, Set<Long> categoryIds) {
|
|
|
LambdaQueryWrapperX<ProductSpuDO> query = new LambdaQueryWrapperX<ProductSpuDO>()
|
|
|
- .eqIfPresent(ProductSpuDO::getCategoryId, pageReqVO.getCategoryId())
|
|
|
- .eqIfPresent(ProductSpuDO::getStatus, status);
|
|
|
+ .likeIfPresent(ProductSpuDO::getName, pageReqVO.getKeyword()) // 关键字匹配,目前只匹配商品名
|
|
|
+ .inIfPresent(ProductSpuDO::getCategoryId, categoryIds); // 分类
|
|
|
+ query.eq(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus()) // 上架状态
|
|
|
+ .gt(ProductSpuDO::getStock, 0); // 有库存
|
|
|
+ // 推荐类型的过滤条件
|
|
|
+ if (ObjUtil.equal(pageReqVO.getRecommendType(), AppProductSpuPageReqVO.RECOMMEND_TYPE_HOT)) {
|
|
|
+ query.eq(ProductSpuDO::getRecommendHot, true);
|
|
|
+ }
|
|
|
// 排序逻辑
|
|
|
- if (Objects.equals(pageReqVO.getSortField(), AppProductSpuPageReqVO.SORT_FIELD_PRICE)) {
|
|
|
- // TODO ProductSpuDO 已经没有maxPrice 属性
|
|
|
- //query.orderBy(true, pageReqVO.getSortAsc(), ProductSpuDO::getMaxPrice);
|
|
|
- } else if (Objects.equals(pageReqVO.getSortField(), AppProductSpuPageReqVO.SORT_FIELD_SALES_COUNT)) {
|
|
|
- query.orderBy(true, pageReqVO.getSortAsc(), ProductSpuDO::getSalesCount);
|
|
|
+ if (Objects.equals(pageReqVO.getSortField(), AppProductSpuPageReqVO.SORT_FIELD_SALES_COUNT)) {
|
|
|
+ query.last(String.format(" ORDER BY (sales_count + virtual_sales_count) %s, sort DESC, id DESC",
|
|
|
+ pageReqVO.getSortAsc() ? "ASC" : "DESC"));
|
|
|
+ } else if (Objects.equals(pageReqVO.getSortField(), AppProductSpuPageReqVO.SORT_FIELD_PRICE)) {
|
|
|
+ query.orderBy(true, pageReqVO.getSortAsc(), ProductSpuDO::getPrice)
|
|
|
+ .orderByDesc(ProductSpuDO::getSort).orderByDesc(ProductSpuDO::getId);
|
|
|
+ } else {
|
|
|
+ query.orderByDesc(ProductSpuDO::getSort).orderByDesc(ProductSpuDO::getId);
|
|
|
}
|
|
|
return selectPage(pageReqVO, query);
|
|
|
}
|