【新增】新增根据不同类型获取商品的接口。类型包含(新品,评论数,销量,价格,推荐,特价优惠,综合销量)

This commit is contained in:
大灰灰
2022-11-28 06:09:48 +08:00
parent 7c6759a8ae
commit 7e9963541b
8 changed files with 289 additions and 1 deletions

View File

@@ -1485,6 +1485,54 @@ namespace CoreCms.Net.Configuration
Detail = 2,
}
/// <summary>
/// 获取商品列表的type类型
/// </summary>
public enum SearchGoodType
{
/// <summary>
/// 新品
/// </summary>
[Description("新品")]
New = 1,
/// <summary>
/// 评论数
/// </summary>
[Description("评论数")]
Comment = 2,
/// <summary>
/// 销量
/// </summary>
[Description("销量")]
Sales = 3,
/// <summary>
/// 价格
/// </summary>
[Description("价格")]
Price = 4,
/// <summary>
/// 推荐
/// </summary>
[Description("推荐")]
Recommend = 5,
/// <summary>
/// 特价优惠
/// </summary>
[Description("特价优惠")]
Discounts = 6,
/// <summary>
/// 综合销量(初始销量+真实销量)
/// </summary>
[Description("综合销量")]
CombinedSalesVolume = 7,
}
#endregion

View File

@@ -14,6 +14,10 @@ namespace CoreCms.Net.DTO.ComponentsDTO
/// </summary>
public class GoodListDTO
{
public GoodListDTO()
{
}
/// <summary>
/// 商品ID
/// </summary>
@@ -146,5 +150,10 @@ namespace CoreCms.Net.DTO.ComponentsDTO
public System.Int32 stock { get; set; }
/// <summary>
/// 是否参与营销(优惠券,满减,秒杀,团购)
/// </summary>
public bool isInActivity { get; set; }
}
}

View File

@@ -227,5 +227,21 @@ namespace CoreCms.Net.IRepository
Task<List<GoodListDTO>> QueryListByComponentsAsync(Expression<Func<GoodListDTO, bool>> predicate, int take, string orderByType = "", bool blUseNoLock = false,
bool isDataCache = false, int cacheTimes = int.MaxValue);
/// <summary>
/// 根据类型获取商品数据用于PCH5
/// </summary>
/// <param name="predicate">条件表达式树</param>
/// <param name="take">获取数量</param>
/// <param name="orderByPredicate">排序字段</param>
/// <param name="orderByType">排序顺序</param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <param name="isDataCache">是否缓存</param>
/// <param name="cacheTimes">缓存时间(分钟)</param>
/// <returns></returns>
Task<List<GoodListDTO>> QueryListByTypeAsync(Expression<Func<GoodListDTO, bool>> predicate, int take,
Expression<Func<GoodListDTO, object>> orderByPredicate, OrderByType orderByType, bool blUseNoLock = false,
bool isDataCache = false, int cacheTimes = int.MaxValue);
}
}

View File

@@ -317,5 +317,21 @@ namespace CoreCms.Net.IServices
Task<List<GoodListDTO>> QueryListByComponentsAsync(Expression<Func<GoodListDTO, bool>> predicate, int take, string orderByType = "", bool blUseNoLock = false,
bool isDataCache = false, int cacheTimes = int.MaxValue);
/// <summary>
/// 根据类型获取商品数据用于PCH5
/// </summary>
/// <param name="predicate">条件表达式树</param>
/// <param name="take">获取数量</param>
/// <param name="orderByPredicate">排序字段</param>
/// <param name="orderByType">排序顺序</param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <param name="isDataCache">是否缓存</param>
/// <param name="cacheTimes">缓存时间(分钟)</param>
/// <returns></returns>
Task<List<GoodListDTO>> QueryListByTypeAsync(Expression<Func<GoodListDTO, bool>> predicate, int take,
Expression<Func<GoodListDTO, object>> orderByPredicate, OrderByType orderByType, bool blUseNoLock = false,
bool isDataCache = false, int cacheTimes = int.MaxValue);
}
}

View File

@@ -10,6 +10,7 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using CoreCms.Net.Model.Entities;
namespace CoreCms.Net.Model.FromBody
@@ -120,4 +121,30 @@ namespace CoreCms.Net.Model.FromBody
public string type { get; set; }
public int groupId { get; set; } = 0;
}
/// <summary>
/// 根据不同类型获取商品提交参数
/// </summary>
public class FMGetGoodByType
{
/// <summary>
/// 类型
/// </summary>
[Required(ErrorMessage = "请输入类型")]
public int type { get; set; }
/// <summary>
/// 数量
/// </summary>
[Required(ErrorMessage = "请输入数量")]
public int num { get; set; } = 0;
/// <summary>
/// 排序方式
/// </summary>
[Required(ErrorMessage = "请输入排序方式")]
public string orderby { get; set; }
}
}

View File

@@ -2364,5 +2364,116 @@ namespace CoreCms.Net.Repository
}
#endregion
#region PCH5
/// <summary>
/// 根据类型获取商品数据用于PCH5
/// </summary>
/// <param name="predicate">条件表达式树</param>
/// <param name="take">获取数量</param>
/// <param name="orderByPredicate">排序字段</param>
/// <param name="orderByType">排序顺序</param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <param name="isDataCache">是否缓存</param>
/// <param name="cacheTimes">缓存时间(分钟)</param>
/// <returns></returns>
public async Task<List<GoodListDTO>> QueryListByTypeAsync(Expression<Func<GoodListDTO, bool>> predicate, int take,
Expression<Func<GoodListDTO, object>> orderByPredicate, OrderByType orderByType, bool blUseNoLock = false, bool isDataCache = false, int cacheTimes = int.MaxValue)
{
List<GoodListDTO> page;
if (blUseNoLock)
{
page = await DbClient.Queryable<CoreCmsGoods, CoreCmsProducts>((good, pd) => new JoinQueryInfos(
JoinType.Left, good.id == pd.goodsId))
.Where((good, pd) => pd.isDefalut == true && pd.isDel == false && good.isMarketable == true && good.isDel == false)
.Select((good, pd) => new GoodListDTO
{
id = good.id,
name = good.name,
brief = good.brief,
image = !SqlFunc.IsNullOrEmpty(good.image) ? good.image : EmptyOrNullImagePath.GoodImage,
video = good.video,
goodsCategoryId = good.goodsCategoryId,
goodsTypeId = good.goodsTypeId,
brandId = good.brandId,
isNomalVirtual = good.isNomalVirtual,
unit = good.unit,
commentsCount = good.commentsCount,
viewCount = good.viewCount,
buyCount = SqlFunc.Subqueryable<CoreCmsOrderItem>()
.LeftJoin<CoreCmsOrder>((sOrderItem, sOrder) => sOrder.orderId == sOrderItem.orderId)
.Where((sOrderItem, sOrder) => sOrderItem.goodsId == good.id && (sOrder.payStatus == (int)GlobalEnumVars.OrderPayStatus.Yes || sOrder.payStatus == (int)GlobalEnumVars.OrderPayStatus.PartialYes))
.Sum(p => p.nums),
sort = good.sort,
labelIds = good.labelIds,
createTime = good.createTime,
isRecommend = good.isRecommend,
isHot = good.isHot,
price = pd.price,
mktprice = pd.mktprice,
stock = pd.stock,
pointsDeduction = pd.pointsDeduction,
points = pd.points,
weight = pd.weight,
initialSales = good.initialSales,
isInActivity = SqlFunc.Subqueryable<CoreCmsPromotion>().Where(o => o.parameters.Contains(good.id.ToString())).Any()
})
.With(SqlWith.NoLock)
.MergeTable()
.WhereIF(predicate != null, predicate)
.OrderByIF(orderByPredicate != null, orderByPredicate, orderByType)
.Take(take)
.WithCacheIF(isDataCache, cacheTimes)
.ToListAsync();
}
else
{
page = await DbClient.Queryable<CoreCmsGoods, CoreCmsProducts>((good, pd) => new JoinQueryInfos(
JoinType.Left, good.id == pd.goodsId))
.Where((good, pd) => pd.isDefalut == true && pd.isDel == false && good.isMarketable == true && good.isDel == false)
.Select((good, pd) => new GoodListDTO
{
id = good.id,
name = good.name,
brief = good.brief,
image = !SqlFunc.IsNullOrEmpty(good.image) ? good.image : EmptyOrNullImagePath.GoodImage,
video = good.video,
goodsCategoryId = good.goodsCategoryId,
goodsTypeId = good.goodsTypeId,
brandId = good.brandId,
isNomalVirtual = good.isNomalVirtual,
unit = good.unit,
commentsCount = good.commentsCount,
viewCount = good.viewCount,
buyCount = SqlFunc.Subqueryable<CoreCmsOrderItem>()
.LeftJoin<CoreCmsOrder>((sOrderItem, sOrder) => sOrder.orderId == sOrderItem.orderId)
.Where((sOrderItem, sOrder) => sOrderItem.goodsId == good.id && (sOrder.payStatus == (int)GlobalEnumVars.OrderPayStatus.Yes || sOrder.payStatus == (int)GlobalEnumVars.OrderPayStatus.PartialYes))
.Sum(p => p.nums),
sort = good.sort,
labelIds = good.labelIds,
createTime = good.createTime,
isRecommend = good.isRecommend,
isHot = good.isHot,
price = pd.price,
mktprice = pd.mktprice,
stock = pd.stock,
pointsDeduction = pd.pointsDeduction,
points = pd.points,
weight = pd.weight,
initialSales = good.initialSales,
isInActivity = SqlFunc.Subqueryable<CoreCmsPromotion>().Where(o => o.parameters.Contains(good.id.ToString())).Any()
})
.MergeTable()
.WhereIF(predicate != null, predicate)
.OrderByIF(orderByPredicate != null, orderByPredicate, orderByType)
.WithCacheIF(isDataCache, cacheTimes)
.Take(take).ToListAsync();
}
return page;
}
#endregion
}
}

View File

@@ -1014,7 +1014,7 @@ namespace CoreCms.Net.Services
string orderBy = "", int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageByDTOAsync(predicate, orderBy, pageIndex, pageSize, blUseNoLock);
}
}
#endregion
/// <summary>
@@ -1118,5 +1118,20 @@ namespace CoreCms.Net.Services
}
/// <summary>
/// 根据类型获取商品数据用于PCH5
/// </summary>
/// <param name="predicate">条件表达式树</param>
/// <param name="take">获取数量</param>
/// <param name="orderByPredicate">排序字段</param>
/// <param name="orderByType">排序顺序</param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <param name="isDataCache">是否缓存</param>
/// <param name="cacheTimes">缓存时间(分钟)</param>
public async Task<List<GoodListDTO>> QueryListByTypeAsync(Expression<Func<GoodListDTO, bool>> predicate, int take, Expression<Func<GoodListDTO, object>> orderByPredicate, OrderByType orderByType,
bool blUseNoLock = false, bool isDataCache = false, int cacheTimes = int.MaxValue)
{
return await _dal.QueryListByTypeAsync(predicate, take, orderByPredicate, orderByType, blUseNoLock, isDataCache, cacheTimes);
}
}
}

View File

@@ -448,6 +448,52 @@ namespace CoreCms.Net.Web.WebApi.Controllers
#endregion
#region ==================================================
/// <summary>
/// 根据不同类型获取不同商品数据
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<WebApiCallBack> GetGoodsByType([FromBody] FMGetGoodByType entity)
{
var list = new List<GoodListDTO>();
var orderBy = entity.orderby switch
{
"asc" => OrderByType.Asc,
"desc" => OrderByType.Desc,
_ => OrderByType.Desc
};
list = entity.type switch
{
//新品
(int)GlobalEnumVars.SearchGoodType.New => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.createTime, orderBy, true, true, 20),
//评论数
(int)GlobalEnumVars.SearchGoodType.Comment => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.commentsCount, orderBy, true, true, 20),
//销量
(int)GlobalEnumVars.SearchGoodType.Sales => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.buyCount, orderBy, true, true, 20),
//价格
(int)GlobalEnumVars.SearchGoodType.Price => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.buyCount, orderBy, true, true, 20),
//是否推荐
(int)GlobalEnumVars.SearchGoodType.Recommend => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.isRecommend, orderBy, true, true, 20),
//是否参与优惠
(int)GlobalEnumVars.SearchGoodType.Discounts => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.isInActivity, orderBy, true, true, 20),
//综合销量
(int)GlobalEnumVars.SearchGoodType.CombinedSalesVolume => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.initialSales, orderBy, true, true, 20),
_ => await _goodsServices.QueryListByTypeAsync(p => p.id > 0, entity.num, p => p.createTime, orderBy, true, true, 20)
};
var jm = new WebApiCallBack()
{
status = true,
code = 0,
msg = "获取成功",
data = list
};
return jm;
}
#endregion
#region sku======================================================================
/// <summary>