key1_beacon_api/ARW.Service/Business/BusinessService/GoodsManager/GoodsSpecs/GoodsSkus/GoodsSkuService.cs

191 lines
7.1 KiB
C#

using Infrastructure.Attribute;
using Microsoft.AspNetCore.Http;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Infrastructure;
using ARW.Model;
using ARW.Repository;
using ARW.Repository.Business.GoodsManager.GoodsSpecs.GoodsSkus;
using ARW.Service.Business.IBusinessService.GoodsManager.GoodsSpecs.GoodsSkus;
using ARW.Model.Dto.Business.GoodsManager.GoodsSpecs.GoodsSkus;
using ARW.Model.Models.Business.GoodsManager.GoodsSpecs.GoodsSkus;
using ARW.Model.Vo.Business.GoodsManager.GoodsSpecs.GoodsSkus;
using ARW.Model.Dto.Business.GoodsManager.Goodss;
using ARW.Model.Vo.Business.GoodsManager.Goodss;
using ARW.Repository.Business.GoodsManager.GoodsSpecs.GoodsSpecRels;
using ARW.Repository.Business.GoodsManager.GoodsSpecs.Specs;
using ARW.Repository.Business.GoodsManager.GoodsSpecs.SpecValues;
using Dapper;
namespace ARW.Service.Business.BusinessService.GoodsManager.GoodsSpecs.GoodsSkus
{
/// <summary>
/// 商品规格接口实现类
///
/// @author lwh
/// @date 2023-06-19
/// </summary>
[AppService(ServiceType = typeof(IGoodsSkuService), ServiceLifetime = LifeTime.Transient)]
public class GoodsSkuServiceImpl : BaseService<GoodsSku>, IGoodsSkuService
{
private readonly GoodsSkuRepository _GoodsSkuRepository;
private readonly GoodsSpecRelRepository _GoodsSpecRelRepository;
private readonly SpecRepository _SpecRepository;
private readonly SpecValueRepository _SpecValueRepository;
public GoodsSkuServiceImpl(GoodsSkuRepository GoodsSkuRepository, GoodsSpecRelRepository goodsSpecRelRepository, SpecRepository specRepository, SpecValueRepository specValueRepository)
{
this._GoodsSkuRepository = GoodsSkuRepository;
_GoodsSpecRelRepository = goodsSpecRelRepository;
_SpecRepository = specRepository;
_SpecValueRepository = specValueRepository;
}
#region
/// <summary>
/// 获取商品Sku
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public async Task<GoodsSpecSkutVo> GetGoodsSkuList(GoodsSkuQueryDto parm)
{
var goodsSpecSkutVo = new GoodsSpecSkutVo();
goodsSpecSkutVo.GoodsSpecList = new List<GoodsSpecListVo>();
// 获取商品的规格组列表
var specIds = (await _GoodsSpecRelRepository.GetListAsync(s => s.GoodsGuid == parm.GoodsGuid))
.Select(item => item.SpecId)
.Distinct()
.ToList();
var specs = await _SpecRepository.GetListAsync(s => specIds.Contains(s.SpecId));
var specValueIds = (await _GoodsSpecRelRepository.GetListAsync(s => s.GoodsGuid == parm.GoodsGuid))
.Where(item => item.SpecValueId != 0)
.Select(item => item.SpecValueId)
.Distinct()
.ToList();
var specValues = await GetSpecValuesAsync(specValueIds);
foreach (var spec in specs)
{
var goodsSpecListVo = new GoodsSpecListVo
{
SpecId = spec.SpecId,
SpecName = spec.SpecName,
Props = new List<SpecValueItem>()
};
goodsSpecListVo.Props.AddRange(specValues.Where(sv => sv.SpecId == spec.SpecId));
goodsSpecSkutVo.GoodsSpecList.Add(goodsSpecListVo);
}
// 获取Sku列表
var skuList = await _GoodsSkuRepository.GetListAsync(s => s.GoodsGuid == parm.GoodsGuid);
goodsSpecSkutVo.SkuList = await GetSkuListWithSpecValuesAsync(skuList);
return goodsSpecSkutVo;
}
private async Task<List<SpecValueItem>> GetSpecValuesAsync(List<int> specValueIds)
{
var specValues = await _SpecValueRepository.GetListAsync(sv => specValueIds.Contains(sv.SpecValueId));
return specValues.Select(sv => new SpecValueItem
{
SpecId = sv.SpecId,
SpecValueId = sv.SpecValueId,
SpecValueName = sv.SpecValueName
}).ToList();
}
private async Task<List<GoodsSkuVo>> GetSkuListWithSpecValuesAsync(List<GoodsSku> skuList)
{
var specValueIds = skuList.SelectMany(sku => new[] { sku.SpecValueId, sku.SpecSecondValueId, sku.SpecThirdValueId })
.Distinct()
.Where(id => id != 0)
.ToList();
var specValues = await GetSpecValuesAsync(specValueIds);
return skuList.Select(sku => new GoodsSkuVo
{
GoodsSkuId = sku.GoodsSkuId,
GoodsGuid = sku.GoodsGuid,
SpecValue = specValues.FirstOrDefault(sv => sv.SpecValueId == sku.SpecValueId)?.SpecValueName,
SpecSecondValue = specValues.FirstOrDefault(sv => sv.SpecValueId == sku.SpecSecondValueId)?.SpecValueName,
SpecThirdValue = specValues.FirstOrDefault(sv => sv.SpecValueId == sku.SpecThirdValueId)?.SpecValueName,
GoodsSkuImg = sku.GoodsSkuImg,
GoodsSkuSkuCode = sku.GoodsSkuSkuCode,
GoodsSkuPrice = sku.GoodsSkuPrice,
GoodsSkuLinePrice = sku.GoodsSkuLinePrice,
GoodsSkuStockNum = sku.GoodsSkuStockNum,
GoodsSkuWeight = sku.GoodsSkuWeight
}).ToList();
}
/// <summary>
/// 获取规格值名称
/// </summary>
/// <param name="specValueId"></param>
/// <returns></returns>
public string GetSpecValueName(int specValueId)
{
// 从数据库中查询规格值名称
var specValue = _SpecValueRepository.GetById(specValueId);
if (specValue != null)
{
return specValue.SpecValueName;
}
return string.Empty;
}
/// <summary>
/// 获取全部规格值名称
/// </summary>
/// <param name="skuId"></param>
/// <returns></returns>
public async Task<string> GetSpecValueFullName(int? skuId)
{
var str = "";
// 从数据库中查询规格值名称
var sku = await _GoodsSkuRepository.GetByIdAsync(skuId);
if (sku != null)
{
var specValue = await _SpecValueRepository.GetByIdAsync(sku.SpecValueId);
str += specValue.SpecValueName;
if (sku.SpecSecondValueId != 0)
{
var specSecondValue = await _SpecValueRepository.GetByIdAsync(sku.SpecSecondValueId);
str += " " + specSecondValue.SpecValueName;
}
if (sku.SpecThirdValueId != 0)
{
var specThirdValue = await _SpecValueRepository.GetByIdAsync(sku.SpecThirdValueId);
str += " " + specThirdValue.SpecValueName;
}
}
return str;
}
#region Excel处理
#endregion
#endregion
}
}