/*********************************************************************** * 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 } }