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
}