/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.Entities.Expression;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Newtonsoft.Json;
using SqlSugar;
namespace CoreCms.Net.Services
{
///
/// 商品表 接口实现
///
public class CoreCmsGoodsServices : BaseServices, ICoreCmsGoodsServices
{
private readonly ICoreCmsGoodsRepository _dal;
private readonly IUnitOfWork _unitOfWork;
private readonly ICoreCmsProductsServices _productsServices;
private readonly ICoreCmsGoodsGradeServices _goodsGradeServices;
private readonly ICoreCmsLabelServices _labelServices;
private readonly ICoreCmsPromotionServices _promotionServices;
private readonly ICoreCmsGoodsCollectionServices _goodsCollectionServices;
private readonly ICoreCmsBrandServices _brandServices;
private readonly ICoreCmsOrderItemServices _orderItemServices;
public CoreCmsGoodsServices(IUnitOfWork unitOfWork, ICoreCmsGoodsRepository dal
, ICoreCmsProductsServices productsServices
, ICoreCmsGoodsGradeServices goodsGradeServices
, ICoreCmsLabelServices labelServices
, ICoreCmsPromotionServices promotionServices
, ICoreCmsGoodsCollectionServices goodsCollectionServices
, ICoreCmsBrandServices brandServices
, ICoreCmsOrderItemServices orderItemServices
)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_productsServices = productsServices;
_goodsGradeServices = goodsGradeServices;
_labelServices = labelServices;
_promotionServices = promotionServices;
_goodsCollectionServices = goodsCollectionServices;
_brandServices = brandServices;
_orderItemServices = orderItemServices;
}
///
/// 重写异步插入方法
///
/// 实体数据
///
public async Task InsertAsync(FMGoodsInsertModel entity)
{
return await _dal.InsertAsync(entity);
}
///
/// 重写异步更新方法方法
///
///
///
public async Task UpdateAsync(FMGoodsInsertModel entity)
{
return await _dal.UpdateAsync(entity);
}
///
/// 重写删除指定ID集合的数据(批量删除)
///
///
///
public new async Task DeleteByIdsAsync(int[] ids)
{
return await _dal.DeleteByIdsAsync(ids);
}
#region 批量修改价格==========================================
///
/// 批量修改价格
///
///
///
public async Task DoBatchModifyPrice(FmBatchModifyPrice entity)
{
var jm = new AdminUiCallBack();
var bl = false;
//获取商品信息
var goods = await base.BaseDal.QueryListByClauseAsync(p => entity.ids.Contains(p.id));
if (!goods.Any())
{
jm.msg = GlobalConstVars.DataisNo;
return jm;
}
var goodIds = goods.Select(p => p.id).ToList();
//获取货品信息
var products = await _productsServices.QueryListByClauseAsync(p => goodIds.Contains((int)p.goodsId));
var productIds = products.Select(p => p.id).ToList();
//获取自定义价格信息
var goodsGrade = await _goodsGradeServices.QueryListByClauseAsync(p => goodIds.Contains(p.goodsId));
var goodsGradeIds = goodsGrade.Select(p => p.id).ToList();
var priceValue = entity.priceValue;
switch (entity.modifyType)
{
case "=":
if (entity.priceType == GlobalEnumVars.PriceType.price.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { price = priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType == GlobalEnumVars.PriceType.costprice.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { costprice = priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType == GlobalEnumVars.PriceType.mktprice.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { mktprice = priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType.Contains("grade_price_"))
{
var gradeArr = entity.priceType.Split("_");
var goodsGradeId = Convert.ToInt16(gradeArr[2]);
if (goodsGradeId > 0)
{
bl = await _goodsGradeServices.UpdateAsync(p => new CoreCmsGoodsGrade { gradePrice = priceValue }, p => goodsGradeIds.Contains(p.id) && p.gradeId == goodsGradeId);
}
}
break;
case "-":
if (entity.priceType == GlobalEnumVars.PriceType.price.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { price = p.price - priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType == GlobalEnumVars.PriceType.costprice.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { costprice = p.costprice - priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType == GlobalEnumVars.PriceType.mktprice.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { mktprice = p.mktprice - priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType.Contains("grade_price_"))
{
var gradeArr = entity.priceType.Split("_");
var goodsGradeId = Convert.ToInt16(gradeArr[2]);
if (goodsGradeId > 0)
{
bl = await _goodsGradeServices.UpdateAsync(p => new CoreCmsGoodsGrade { gradePrice = p.gradePrice - priceValue }, p => goodsGradeIds.Contains(p.id) && p.gradeId == goodsGradeId);
}
}
break;
case "+":
if (entity.priceType == GlobalEnumVars.PriceType.price.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { price = p.price + priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType == GlobalEnumVars.PriceType.costprice.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { costprice = p.costprice + priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType == GlobalEnumVars.PriceType.mktprice.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { mktprice = p.mktprice + priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType.Contains("grade_price_"))
{
var gradeArr = entity.priceType.Split("_");
var goodsGradeId = Convert.ToInt16(gradeArr[2]);
if (goodsGradeId > 0)
{
bl = await _goodsGradeServices.UpdateAsync(p => new CoreCmsGoodsGrade { gradePrice = p.gradePrice + priceValue }, p => goodsGradeIds.Contains(p.id) && p.gradeId == goodsGradeId);
}
}
break;
case "*":
if (entity.priceType == GlobalEnumVars.PriceType.price.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { price = p.price * priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType == GlobalEnumVars.PriceType.costprice.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { costprice = p.costprice * priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType == GlobalEnumVars.PriceType.mktprice.ToString())
{
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { mktprice = p.mktprice * priceValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
}
else if (entity.priceType.Contains("grade_price_"))
{
var gradeArr = entity.priceType.Split("_");
var goodsGradeId = Convert.ToInt16(gradeArr[2]);
if (goodsGradeId > 0)
{
bl = await _goodsGradeServices.UpdateAsync(p => new CoreCmsGoodsGrade { gradePrice = p.gradePrice * priceValue }, p => goodsGradeIds.Contains(p.id) && p.gradeId == goodsGradeId);
}
}
break;
}
jm.code = bl ? 0 : 1;
jm.msg = bl ? "价格修改成功" : "价格修改失败";
return jm;
}
#endregion
#region 批量修改库存==========================================
///
/// 批量修改价格
///
///
///
public async Task DoBatchModifyStock(FmBatchModifyStock entity)
{
var jm = new AdminUiCallBack();
var bl = false;
//获取商品信息
var goods = await base.BaseDal.QueryListByClauseAsync(p => entity.ids.Contains(p.id));
if (!goods.Any())
{
jm.msg = GlobalConstVars.DataisNo;
return jm;
}
var goodIds = goods.Select(p => p.id).ToList();
var modifyValue = entity.modifyValue;
switch (entity.modifyType)
{
case "=":
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { stock = modifyValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
break;
case "-":
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { stock = p.stock - modifyValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
break;
case "+":
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { stock = p.stock + modifyValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
break;
case "*":
bl = await _productsServices.UpdateAsync(p => new CoreCmsProducts() { stock = p.stock * modifyValue }, p => goodIds.Contains((int)p.goodsId) && p.isDel == false);
break;
}
jm.code = bl ? 0 : 1;
jm.msg = bl ? "库存修改成功" : "库存修改失败";
return jm;
}
#endregion
#region 批量上架==========================================
///
/// 批量上架
///
///
///
public async Task DoBatchMarketableUp(int[] ids)
{
var jm = new AdminUiCallBack();
var bl = await _dal.UpdateAsync(p => new CoreCmsGoods() { isMarketable = true }, p => ids.Contains(p.id));
jm.code = bl ? 0 : 1;
jm.msg = bl ? "上架成功" : "上架失败";
return jm;
}
#endregion
#region 批量下架==========================================
///
/// 批量下架
///
///
///
public async Task DoBatchMarketableDown(int[] ids)
{
var jm = new AdminUiCallBack();
var bl = await base.BaseDal.UpdateAsync(p => new CoreCmsGoods() { isMarketable = false }, p => ids.Contains(p.id));
jm.code = bl ? 0 : 1;
jm.msg = bl ? "下架成功" : "下架失败";
return jm;
}
#endregion
#region 设置标签==========================================
///
/// 设置标签
///
///
///
public async Task DoSetLabel(FmSetLabel entity)
{
var jm = new AdminUiCallBack();
var names = entity.labels.Select(p => p.text).ToList();
//获取已经存在数据库数据
var olds = await _labelServices.QueryListByClauseAsync(p => names.Contains(p.name));
if (olds.Any())
{
var oldNames = olds.Select(p => p.name).ToList();
//获取未插入数据库数据
var newNames = entity.labels.Where(p => !oldNames.Contains(p.text)).ToList();
if (newNames.Any())
{
var labels = new List();
newNames.ForEach(p =>
{
labels.Add(new CoreCmsLabel()
{
name = p.text,
style = p.style
});
});
await _labelServices.InsertAsync(labels);
}
}
else
{
var labels = new List();
entity.labels.ForEach(p =>
{
labels.Add(new CoreCmsLabel()
{
name = p.text,
style = p.style
});
});
await _labelServices.InsertAsync(labels);
}
var items = await _labelServices.QueryListByClauseAsync(p => names.Contains(p.name));
var idsInts = items.Select(p => p.id).ToArray();
var ids = String.Join(",", idsInts);
var bl = await base.BaseDal.UpdateAsync(p => new CoreCmsGoods() { labelIds = ids }, p => entity.ids.Contains(p.id));
jm.code = bl ? 0 : 1;
jm.msg = bl ? "设置成功" : "设置失败";
return jm;
}
#endregion
#region 取消标签==========================================
///
/// 取消标签
///
///
///
public async Task DoDeleteLabel(FmSetLabel entity)
{
var jm = new AdminUiCallBack();
var names = entity.labels.Select(p => p.text).ToList();
//获取已经存在数据库数据
var labels = await _labelServices.QueryListByClauseAsync(p => names.Contains(p.name));
var labelIds = labels.Select(p => p.id).ToList();
var goods = await base.QueryListByClauseAsync(p => entity.ids.Contains(p.id));
goods.ForEach(p =>
{
if (!string.IsNullOrEmpty(p.labelIds))
{
var ids = CommonHelper.StringToIntArray(p.labelIds);
var newIds = ids.Except(labelIds).ToList();
if (newIds.Any())
{
p.labelIds = String.Join(",", newIds);
}
else
{
p.labelIds = "";
}
}
});
var bl = await base.UpdateAsync(goods);
jm.code = bl ? 0 : 1;
jm.msg = bl ? "设置成功" : "设置失败";
return jm;
}
#endregion
#region 判断商品是否参加团购或者秒杀
public bool IsInGroup(int goodId, out CoreCmsPromotion promotionsModel, int promotionId = 0)
{
promotionsModel = new CoreCmsPromotion();
if (goodId == 0)
{
return false;
}
var dt = DateTime.Now;
var where = PredicateBuilder.True();
where = where.And(p => p.isEnable == true);
if (promotionId > 0)
{
where = where.And(p => p.id == promotionId);
}
where = where.And(p =>
(p.type == (int)GlobalEnumVars.PromotionType.Group ||
p.type == (int)GlobalEnumVars.PromotionType.Seckill));
where = where.And(p => p.startTime < dt || p.endTime > dt);
where = where.And(p => p.isDel == false);
var promotions = _promotionServices.QueryByClause(where);
if (promotions == null) return false;
try
{
if (string.IsNullOrEmpty(promotions.parameters)) return false;
var obj = JsonConvert.DeserializeAnonymousType(promotions.parameters, new
{
goodsId = "",
num = 0,
});
if (obj.goodsId.ObjectToInt(0) != goodId) return false;
promotionsModel = promotions;
return true;
}
catch
{
return false;
}
}
#endregion
#region 获取商品重量
///
/// 获取商品重量
///
///
///
public async Task GetWeight(int productsId)
{
return await _dal.GetWeight(productsId);
}
#endregion
#region 库存改变机制
///
/// 库存改变机制。
/// 库存机制:商品下单 总库存不变,冻结库存加1,
/// 商品发货:冻结库存减1,总库存减1,
/// 订单完成但未发货:总库存不变,冻结库存减1
/// 商品退款&取消订单:总库存不变,冻结库存减1,
/// 商品退货:总库存加1,冻结库存不变,
/// 可销售库存:总库存-冻结库存
///
///
public WebApiCallBack ChangeStock(int productsId, string type = "order", int num = 0)
{
return _dal.ChangeStock(productsId, type, num);
}
#endregion
#region 获取商品详情
///
/// 获取商品详情
///
///
///
/// 是否涉及优惠
///
///
///
public async Task GetGoodsDetial(int id, int userId = 0, bool isPromotion = false, string type = "goods", int groupId = 0)
{
var model = await _dal.QueryByIdAsync(id);
if (model == null) return null;
//取图片集
var album = model.images.Split(",");
model.image = !string.IsNullOrEmpty(model.image) ? model.image : "/static/images/common/empty-banner.png";
model.album = album;
//label_ids
//获取用户信息
if (userId > 0)
{
model.isFav = await _goodsCollectionServices.ExistsAsync(p => p.goodsId == model.id && p.userId == userId);
}
//取默认货品
var products = await _productsServices.QueryByClauseAsync(p => p.goodsId == model.id && p.isDefalut == true && p.isDel == false);
if (products == null) return null;
var getProductInfo = await _productsServices.GetProductInfo(products.id, isPromotion, userId, type, groupId);
if (getProductInfo == null) return null;
model.product = getProductInfo;
model.sn = getProductInfo.sn;
model.price = getProductInfo.price;
model.costprice = getProductInfo.costprice;
model.mktprice = getProductInfo.mktprice;
model.stock = getProductInfo.stock;
model.freezeStock = getProductInfo.freezeStock;
model.weight = getProductInfo.weight;
//获取品牌
var brand = await _brandServices.QueryByIdAsync(model.brandId);
model.brand = brand;
//取出销量
model.buyCount = await _orderItemServices.GetCountAsync(p => p.goodsId == model.id);
return model;
}
#endregion
#region 获取随机推荐数据
///
/// 获取随机推荐数据
///
///
///
///
public async Task> GetGoodsRecommendList(int number, bool isRecommend = false)
{
return await _dal.GetGoodsRecommendList(number, isRecommend);
}
#endregion
#region 获取数据总数
///
/// 获取数据总数
///
/// 条件表达式树
/// 是否使用WITH(NOLOCK)
///
public new async Task GetCountAsync(Expression> predicate, bool blUseNoLock = false)
{
return await _dal.GetCountAsync(predicate, blUseNoLock);
}
#endregion
#region 重写根据条件查询分页数据
///
/// 重写根据条件查询分页数据
///
/// 判断集合
/// 排序方式
/// 当前页面索引
/// 分布大小
///
/// 是否使用WITH(NOLOCK)
///
public new async Task> QueryPageAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
#endregion
#region 重写根据条件查询一定数量数据
///
/// 重写根据条件查询一定数量数据
///
/// 条件表达式树
/// 获取数量
/// 排序字段
/// 排序顺序
/// 是否使用WITH(NOLOCK)
///
public new async Task> QueryListByClauseAsync(Expression> predicate, int take,
Expression> orderByPredicate, OrderByType orderByType, bool blUseNoLock = false)
{
return await _dal.QueryListByClauseAsync(predicate, take, orderByPredicate, orderByType, blUseNoLock);
}
#endregion
#region 重写根据条件查询数据
///
/// 重写根据条件查询数据
///
/// 条件表达式树
/// 排序字段,如name asc,age desc
/// 是否使用WITH(NOLOCK)
/// 泛型实体集合
public new async Task> QueryListByClauseAsync(Expression> predicate, string orderBy = "",
bool blUseNoLock = false)
{
return await _dal.QueryListByClauseAsync(predicate, orderBy, blUseNoLock);
}
#endregion
#region 重写根据条件查询分页数据
///
/// 重写根据条件查询分页数据
///
///
///
/// 当前页面索引
/// 分布大小
/// 是否使用WITH(NOLOCK)
///
public new async Task> QueryPageAsync(Expression> predicate, string orderBy = "",
int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderBy, pageIndex, pageSize, blUseNoLock);
}
#endregion
///
/// 重写根据条件查询分页数据
///
///
///
/// 当前页面索引
/// 分布大小
/// 是否使用WITH(NOLOCK)
///
public new async Task> QueryPageForLinqAsync(Expression> predicate, string orderBy = "",
int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderBy, pageIndex, pageSize, blUseNoLock);
}
///
/// 根据条件查询代理池商品分页数据
///
///
///
/// 当前页面索引
/// 分布大小
/// 是否使用WITH(NOLOCK)
///
public async Task> QueryAgentGoodsPageAsync(Expression> predicate, string orderBy = "",
int pageIndex = 1, int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryAgentGoodsPageAsync(predicate, orderBy, pageIndex, pageSize, blUseNoLock);
}
#region 获取下拉商品数据
///
/// 获取下拉商品数据
///
///
public async Task> QueryEnumEntityAsync()
{
return await _dal.QueryEnumEntityAsync();
}
#endregion
}
}