diff --git a/ARW.Model/Dto/Business/GoodsManager/GoodsSpecs/GoodsSkus/GoodsSkuDto.cs b/ARW.Model/Dto/Business/GoodsManager/GoodsSpecs/GoodsSkus/GoodsSkuDto.cs index 677d2d9..9626eae 100644 --- a/ARW.Model/Dto/Business/GoodsManager/GoodsSpecs/GoodsSkus/GoodsSkuDto.cs +++ b/ARW.Model/Dto/Business/GoodsManager/GoodsSpecs/GoodsSkus/GoodsSkuDto.cs @@ -19,8 +19,12 @@ namespace ARW.Model.Dto.Business.GoodsManager.GoodsSpecs.GoodsSkus [Required(ErrorMessage = "商品guid不能为空")] public long GoodsGuid { get; set; } - [Required(ErrorMessage = "规格值ID不能为空")] - public int SpecValueId { get; set; } + [Required(ErrorMessage = "第一规格值不能为空")] + public string SpecValue { get; set; } + + public string SpecSecondValue { get; set; } + + public string SpecThirdValue { get; set; } [Required(ErrorMessage = "图片不能为空")] public string GoodsSkuImg { get; set; } diff --git a/ARW.Model/Models/Business/GoodsManager/GoodsSpecs/GoodsSkus/GoodsSku.cs b/ARW.Model/Models/Business/GoodsManager/GoodsSpecs/GoodsSkus/GoodsSku.cs index ee0f551..b6bfeee 100644 --- a/ARW.Model/Models/Business/GoodsManager/GoodsSpecs/GoodsSkus/GoodsSku.cs +++ b/ARW.Model/Models/Business/GoodsManager/GoodsSpecs/GoodsSkus/GoodsSku.cs @@ -34,13 +34,29 @@ namespace ARW.Model.Models.Business.GoodsManager.GoodsSpecs.GoodsSkus /// - /// 描述 :规格值ID + /// 描述 :第一规格值ID /// 空值 : false /// [SugarColumn(ColumnName = "spec_value_id")] public int SpecValueId { get; set; } + /// + /// 描述 :第二规格值ID + /// 空值 : false + /// + [SugarColumn(ColumnName = "spec_second_value_id")] + public int SpecSecondValueId { get; set; } + + + /// + /// 描述 :第三规格值ID + /// 空值 : false + /// + [SugarColumn(ColumnName = "spec_third_value_id")] + public int SpecThirdValueId { get; set; } + + /// /// 描述 :图片 /// 空值 : false diff --git a/ARW.Model/Models/Business/GoodsManager/GoodsSpecs/Specs/Spec.cs b/ARW.Model/Models/Business/GoodsManager/GoodsSpecs/Specs/Spec.cs index b66760a..7c7fe6b 100644 --- a/ARW.Model/Models/Business/GoodsManager/GoodsSpecs/Specs/Spec.cs +++ b/ARW.Model/Models/Business/GoodsManager/GoodsSpecs/Specs/Spec.cs @@ -32,7 +32,12 @@ namespace ARW.Model.Models.Business.GoodsManager.GoodsSpecs.Specs public string SpecName { get; set; } - + /// + /// 描述 :层级 + /// 空值 : false + /// + [SugarColumn(ColumnName = "level")] + public int Level { get; set; } diff --git a/ARW.Model/Models/Business/GoodsManager/Goodss/Goods.cs b/ARW.Model/Models/Business/GoodsManager/Goodss/Goods.cs index 152ce0b..878dbb8 100644 --- a/ARW.Model/Models/Business/GoodsManager/Goodss/Goods.cs +++ b/ARW.Model/Models/Business/GoodsManager/Goodss/Goods.cs @@ -307,12 +307,14 @@ namespace ARW.Model.Models.Business.GoodsManager.Goodss /// /// 商品规格 /// + [SugarColumn(IsIgnore = true)] public List GoodsSpecList { get; set; } /// /// 商品sku列表 /// + [SugarColumn(IsIgnore = true)] public List SkuList { get; set; } } diff --git a/ARW.Service/Business/BusinessService/GoodsManager/Goodss/GoodsService.cs b/ARW.Service/Business/BusinessService/GoodsManager/Goodss/GoodsService.cs index dfa2f62..627363e 100644 --- a/ARW.Service/Business/BusinessService/GoodsManager/Goodss/GoodsService.cs +++ b/ARW.Service/Business/BusinessService/GoodsManager/Goodss/GoodsService.cs @@ -26,6 +26,11 @@ using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.GoodsSpecRel using Senparc.Weixin.MP.AdvancedAPIs.Semantic; using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.Specs; using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.SpecValues; +using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.GoodsSpecRels; +using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.GoodsSkus; +using ARW.Model.Vo.Business.GoodsManager.GoodsSpecs.SpecValues; +using Senparc.Weixin.MP.AdvancedAPIs.MerChant; +using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.GoodsSkus; namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss { @@ -43,15 +48,17 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss private readonly ISpecService _SepcIService; private readonly ISpecValueService _SpecValueIService; private readonly IGoodsSpecRelService _GoodsSpecRelService; + private readonly IGoodsSkuService _GoodsSkuService; - public GoodsServiceImpl(GoodsRepository GoodsRepository, IGoodsServicesRelService goodsServicesRelIService, ISpecService sepcIService, ISpecValueService specValueIService, IGoodsSpecRelService goodsSpecRelService) + public GoodsServiceImpl(GoodsRepository GoodsRepository, IGoodsServicesRelService goodsServicesRelIService, ISpecService sepcIService, ISpecValueService specValueIService, IGoodsSpecRelService goodsSpecRelService, IGoodsSkuService goodsSkuService) { this._GoodsRepository = GoodsRepository; _GoodsServicesRelIService = goodsServicesRelIService; _SepcIService = sepcIService; _SpecValueIService = specValueIService; _GoodsSpecRelService = goodsSpecRelService; + _GoodsSkuService = goodsSkuService; } #region 业务逻辑代码 @@ -126,10 +133,22 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss } else { - await HandleBeforeAdd(model); - var response = await _GoodsRepository.InsertReturnSnowflakeIdAsync(model); - model.GoodsGuid = response; - await HandleAfterAdd(model); + try + { + await UseTranAsync(async () => + { + await HandleBeforeAdd(model); + var response = await _GoodsRepository.InsertReturnSnowflakeIdAsync(model); + model.GoodsGuid = response; + await HandleAfterAdd(model); + }); + } + catch (Exception) + { + + throw; + } + return "添加成功!"; } @@ -220,8 +239,13 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss #endregion + + #region 商品格式处理 + + #region 添加处理 + /// /// 商品添加前处理处理 /// @@ -231,6 +255,7 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss { // 单规格(最高价格 最高划线价格 = 最低价格 最低划线价格) model = HandleSingleSpec(model); + model = HandlMultipleSpecCompute(model); return model; } @@ -242,6 +267,23 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss /// 商品Model /// public async Task HandleAfterAdd(Goods model) + { + // 服务与承诺处理 + await HandleAddGoodsService(model); + + // 多规格 + await HandleAddMultiSpec(model); + + } + + + + /// + /// 添加服务与承诺处理 + /// + /// 商品Model + /// + public async Task HandleAddGoodsService(Goods model) { // 服务与承诺 if (!string.IsNullOrEmpty(model.GoodsServicesIds)) @@ -261,17 +303,28 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss } await _GoodsServicesRelIService.InsertGoodsServicesRelAsync(servicesList); } + } - // Sku列表 + + + /// + /// 添加商品多规格处理 + /// + /// 商品Model + /// + public async Task HandleAddMultiSpec(Goods model) + { + // 多规格 if (model.GoodsSpecType == "2") { - - // 规格组和规格值 + // 添加规格组和规格值 + var index = 1; foreach (var item in model.GoodsSpecList) { var spec = new Spec { - SpecName = item.SpecName + SpecName = item.SpecName, + Level = index }; var specId = await _SepcIService.InsertReturnIdentityAsync(spec); foreach (var i in item.Props) @@ -281,17 +334,111 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss SpecId = specId, SpecValueName = i.SpecValueName, }; - await _SpecValueIService.InsertReturnIdentityAsync(specValue); + var specValueId = await _SpecValueIService.InsertReturnIdentityAsync(specValue); + + // 添加商品与规格值关系 + var rel = new GoodsSpecRel + { + GoodsGuid = model.GoodsGuid, + SpecId = specId, + SpecValueId = specValueId, + }; + await _GoodsSpecRelService.InsertReturnIdentityAsync(rel); + } + index++; + } + + + // Sku处理 + var specList = await _GoodsSpecRelService.GetListAsync(s => s.GoodsGuid == model.GoodsGuid); + var firstSpec = new Spec(); + var secondSpec = new Spec(); + var thirdSpec = new Spec(); + foreach (var item in specList) + { + var spec = await _SepcIService.GetFirstAsync(s => s.SpecId == item.SpecId); + if (spec == null) continue; + + if (spec.Level == 1) + { + firstSpec = spec; + } + if (spec.Level == 2) + { + secondSpec = spec; + } + if (spec.Level == 3) + { + thirdSpec = spec; } } - } + // 找出改规格组的所有规格值 + foreach (var sku in model.SkuList) + { + var specValueId = await GetSpecValueId(sku, firstSpec, 1); + var specSecondValueId = await GetSpecValueId(sku, secondSpec, 2); + var specThirdValueId = await GetSpecValueId(sku, thirdSpec, 3); + + var skuData = new GoodsSku + { + GoodsGuid = model.GoodsGuid, + SpecValueId = specValueId, + SpecSecondValueId = specSecondValueId, + SpecThirdValueId = specThirdValueId, + GoodsSkuImg = sku.GoodsSkuImg, + GoodsSkuSkuCode = sku.GoodsSkuSkuCode, + GoodsSkuPrice = sku.GoodsSkuPrice, + GoodsSkuLinePrice = sku.GoodsSkuLinePrice, + GoodsSkuStockNum = sku.GoodsSkuStockNum, + GoodsSkuWeight = sku.GoodsSkuWeight, + }; + await _GoodsSkuService.InsertAsync(skuData); + } + + + } } /// - /// 商品单规格处理 + /// 找出改规格组的所有规格值 + /// + /// + /// + /// + /// + public async Task GetSpecValueId(SkuDto sku, Spec spec, int level) + { + if (spec == null) + { + return 0; + } + + var specValueName = level switch + { + 1 => sku.SpecValue, + 2 => sku.SpecSecondValue, + 3 => sku.SpecThirdValue, + _ => null + }; + + if (specValueName != null) + { + var specValue = await _SpecValueIService.GetFirstAsync(s => s.SpecId == spec.SpecId && s.SpecValueName == specValueName); + if (specValue != null) + { + return specValue.SpecValueId; + } + } + + return 0; + } + + + /// + /// 添加商品单规格处理 /// /// 商品Model /// @@ -313,8 +460,69 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss return model; } + + /// + /// 添加商品计算多规格处理 + /// + /// 商品Model + /// + public Goods HandlMultipleSpecCompute(Goods model) + { + // 单规格 + if (model.GoodsSpecType == "2") + { + decimal lowestPrice = decimal.MaxValue; + decimal highestPrice = decimal.MinValue; + decimal lowestDashedPrice = decimal.MaxValue; + decimal highestDashedPrice = decimal.MinValue; + int totalInventory = 0; + + foreach (var sku in model.SkuList) + { + if (sku.GoodsSkuPrice < lowestPrice) + { + lowestPrice = sku.GoodsSkuPrice; + } + + if (sku.GoodsSkuPrice > highestPrice) + { + highestPrice = sku.GoodsSkuPrice; + } + + if (sku.GoodsSkuLinePrice < lowestDashedPrice) + { + lowestDashedPrice = sku.GoodsSkuLinePrice; + } + + if (sku.GoodsSkuLinePrice > highestDashedPrice) + { + highestDashedPrice = sku.GoodsSkuLinePrice; + } + + totalInventory += sku.GoodsSkuStockNum; + } + + model.GoodsPriceLowest = lowestPrice; + model.GoodsPriceHighest = highestPrice; + model.GoodsDashedPriceLowest = lowestDashedPrice; + model.GoodsDashedPriceHighest = highestDashedPrice; + model.GoodsTotalInventory = totalInventory; + } + + return model; + } + + #endregion + + + #endregion + + + + + #endregion }