using ZR.Mall.Model; using ZR.Mall.Model.Dto; using ZR.Mall.Service.IService; namespace ZR.Mall.Service { /// /// 商品管理Service业务层处理 /// [AppService(ServiceType = typeof(IProductService))] public class ProductService : BaseService, IProductService { private readonly ISkusService skusService; private readonly IProductSpecService specService; private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); /// /// /// /// /// public ProductService(ISkusService skusService, IProductSpecService shoppingProductSpecService) { this.skusService = skusService; this.specService = shoppingProductSpecService; } /// /// 查询商品管理列表 /// /// /// public PagedInfo GetList(ShoppingProductQueryDto parm) { var predicate = QueryExp(parm); var response = Queryable() .Where(predicate.ToExpression()) .Includes(x => x.Skus.Where(f => f.IsDelete == 0).ToList()) .Includes(x => x.Category) .Includes(x => x.Brand) .ToPage(parm); foreach (var item in response.Result) { item.Stock = item.Skus.Sum(s => s.Stock); item.TotalSalesVolume = item.Skus.Sum(s => s.SalesVolume); } return response; } /// /// 获取详情 /// /// /// public ProductDto GetInfo(long ProductId) { var response = Queryable() .Where(x => x.ProductId == ProductId) .First(); var info = response.Adapt(); var spec = specService.GetList(f => f.ProductId == info.ProductId); var skus = skusService.GetSkus(info.ProductId); info.Spec = spec.Adapt>(); info.Skus = skus.ToList().OrderBy(f => f.SortId).Adapt>(); return info; } /// /// 添加商品管理 /// /// /// public Product AddShoppingProduct(ProductDto dto) { var model = dto.Adapt(); var result = UseTran(() => { CalcProduct(dto, model); model = InsertReturnEntity(model) ?? throw new Exception("添加商品失败"); if (dto.Skus != null) { dto.Skus.ForEach(it => { it.ProductId = model.ProductId; it.SpecCombination = string.Join(";", it.Specs.Select(x => $"{x.Name}:{x.Value}")); }); skusService.Insert(dto.Skus.Adapt>()); } //插入商品规格 dto.Spec.ForEach(x => x.ProductId = model.ProductId); specService.InsertRange(dto.Spec.Adapt>()); }); if (result.IsSuccess) { return model; } throw new CustomException("添加失败"); } /// /// 修改商品管理 /// /// /// public Product UpdateShoppingProduct(ProductDto dto) { var model = dto.Adapt(); var result = UseTran(() => { model.Skus.ForEach(f => f.ProductId = model.ProductId); CalcProduct(dto, model); Update(model, true, "修改商品"); var skus = skusService.GetSkus(model.ProductId); var allSkuIds = skus.Select(f => f.SkuId).ToList(); // 删除旧的规格 //specService.DeleteSpecByProductId(model.ProductId); // 插入新的规格 dto.Spec.ForEach(f => f.ProductId = model.ProductId); //specService.InsertRange(dto.Spec.Adapt>()); specService.UpdateProductSpec(model.ProductId, dto.Spec.Adapt>()); var insertSkus = model.Skus.Where(f => !skus.Any(s => s.SkuId == f.SkuId)).ToList(); var updateSkus = model.Skus.Where(f => skus.Any(s => s.SkuId == f.SkuId)).ToList(); var deleteSkus = skus.Where(f => !model.Skus.Any(s => s.SkuId == f.SkuId)).ToList(); // 软删除sku if (deleteSkus.Count > 0) { skusService.Deleteable() .Where(f => f.IsDelete == 0) .In(deleteSkus.Select(f => f.SkuId)) .IsLogic() .ExecuteCommand(); logger.Info($"删除的skuid={deleteSkus.Select(f => f.SkuId)}"); } //更新现有的sku foreach (var item in insertSkus) { item.SpecCombination = UpdateCombination(item); } // 插入新的sku skusService.Insert(insertSkus); //更新现有的sku foreach (var item in updateSkus) { item.ProductId = model.ProductId; item.SpecCombination = UpdateCombination(item); skusService.Update(item, true, "修改商品sku"); } }); if (!result.IsSuccess) { throw new CustomException(ResultCode.CUSTOM_ERROR, "修改失败", result.ErrorMessage); } return model; } private string UpdateCombination(Skus item) { return string.Join(";", item.Specs.Select(x => $"{x.Name}:{x.Value}")); } /// /// 修改商品管理 /// /// /// public long UpdateInfo(ProductDto dto) { var model = dto.Adapt(); var result = Update(model, t => new { t.SortId, t.ProductName, t.MainImage, t.ImageUrls, t.SaleStatus, t.CategoryId, t.BrandId, t.Introduce, t.Unit, t.OriginalPrice, t.VideoUrl, t.DetailsHtml }, true); return result; } private void CalcProduct(ProductDto dto, Product model) { var summary = string.Join(", ", dto.Spec.Select(s => $"{s.Name}: {string.Join("/", s.SpecValues)}" )); //最低价 model.Price = dto.Skus.Min(s => s.Price); model.MaxPrice = dto.Skus.Max(s => s.Price); model.SpecSummary = summary; } /// /// 导出商品管理 /// /// /// public PagedInfo ExportList(ShoppingProductQueryDto parm) { var predicate = QueryExp(parm); var response = Queryable() .Where(predicate.ToExpression()) .Includes(x => x.Skus.Where(f => f.IsDelete == 0).ToList()) .Includes(x => x.Category) .Includes(x => x.Brand) .Select((it) => new ProductDto { Stock = it.Skus.Sum(s => s.Stock), TotalSalesVolume = it.Skus.Sum(s => s.SalesVolume), BrandName = it.Brand.Name, CategoryName = it.Category.Name, }, true) .ToPage(parm); return response; } /// /// 查询导出表达式 /// /// /// private static Expressionable QueryExp(ShoppingProductQueryDto parm) { var predicate = Expressionable.Create(); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.ProductName), it => it.ProductName.Contains(parm.ProductName)); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.ProductCode), it => it.ProductCode == parm.ProductCode); predicate = predicate.AndIF(parm.CategoryId != null, it => it.CategoryId == parm.CategoryId); predicate = predicate.AndIF(parm.BrandId != null, it => it.BrandId == parm.BrandId); predicate = predicate.AndIF(parm.ProductId != null, it => it.ProductId == parm.ProductId); predicate = predicate.AndIF(parm.SaleStatus != null, it => it.SaleStatus == parm.SaleStatus); //predicate = predicate.AndIF(parm.BeginAddTime == null, it => it.AddTime >= DateTime.Now.ToShortDateString().ParseToDateTime()); predicate = predicate.AndIF(parm.BeginAddTime != null, it => it.AddTime >= parm.BeginAddTime); predicate = predicate.AndIF(parm.EndAddTime != null, it => it.AddTime <= parm.EndAddTime); return predicate; } } }