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;
}
}
}