fixed 完善添加商品逻辑

This commit is contained in:
lwh 2023-06-25 22:04:01 +08:00
parent 87ba088613
commit a82b7aadfb
5 changed files with 251 additions and 16 deletions

View File

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

View File

@ -34,13 +34,29 @@ namespace ARW.Model.Models.Business.GoodsManager.GoodsSpecs.GoodsSkus
/// <summary>
/// 描述 :规格值ID
/// 描述 :第一规格值ID
/// 空值 : false
/// </summary>
[SugarColumn(ColumnName = "spec_value_id")]
public int SpecValueId { get; set; }
/// <summary>
/// 描述 :第二规格值ID
/// 空值 : false
/// </summary>
[SugarColumn(ColumnName = "spec_second_value_id")]
public int SpecSecondValueId { get; set; }
/// <summary>
/// 描述 :第三规格值ID
/// 空值 : false
/// </summary>
[SugarColumn(ColumnName = "spec_third_value_id")]
public int SpecThirdValueId { get; set; }
/// <summary>
/// 描述 :图片
/// 空值 : false

View File

@ -32,7 +32,12 @@ namespace ARW.Model.Models.Business.GoodsManager.GoodsSpecs.Specs
public string SpecName { get; set; }
/// <summary>
/// 描述 :层级
/// 空值 : false
/// </summary>
[SugarColumn(ColumnName = "level")]
public int Level { get; set; }

View File

@ -307,12 +307,14 @@ namespace ARW.Model.Models.Business.GoodsManager.Goodss
/// <summary>
/// 商品规格
/// </summary>
[SugarColumn(IsIgnore = true)]
public List<GoodsSpecDto> GoodsSpecList { get; set; }
/// <summary>
/// 商品sku列表
/// </summary>
[SugarColumn(IsIgnore = true)]
public List<SkuDto> SkuList { get; set; }
}

View File

@ -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
/// <summary>
/// 商品添加前处理处理
/// </summary>
@ -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
/// <param name="model">商品Model</param>
/// <returns></returns>
public async Task HandleAfterAdd(Goods model)
{
// 服务与承诺处理
await HandleAddGoodsService(model);
// 多规格
await HandleAddMultiSpec(model);
}
/// <summary>
/// 添加服务与承诺处理
/// </summary>
/// <param name="model">商品Model</param>
/// <returns></returns>
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列表
/// <summary>
/// 添加商品多规格处理
/// </summary>
/// <param name="model">商品Model</param>
/// <returns></returns>
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);
}
}
}
/// <summary>
/// 商品单规格处理
/// 找出改规格组的所有规格值
/// </summary>
/// <param name="sku"></param>
/// <param name="spec"></param>
/// <param name="level"></param>
/// <returns></returns>
public async Task<int> 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;
}
/// <summary>
/// 添加商品单规格处理
/// </summary>
/// <param name="model">商品Model</param>
/// <returns></returns>
@ -313,8 +460,69 @@ namespace ARW.Service.Business.BusinessService.GoodsManager.Goodss
return model;
}
/// <summary>
/// 添加商品计算多规格处理
/// </summary>
/// <param name="model">商品Model</param>
/// <returns></returns>
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
}