using AllBase.Model.Result; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; namespace AllBase.Model { /// /// 通用商品Model /// public class Product { public Product() { CategoryIds = new List(); Attributes = new List(); MainImages = new List(); DetailImages = new List(); Specs = new List(); Skus = new List(); Extensions = new Dictionary(); } #region 来源 /// /// 来源平台 /// public PlatformType Platform { get; set; } /// /// 来源商品链接 /// public string SourceUrl { get; set; } /// /// 来源店铺编号 /// public string ShopId { get; set; } /// /// 来源店铺名称 /// public string ShopName { get; set; } #endregion #region 基本信息 /// /// 商家编号 /// public string ProductId { get; set; } /// /// 标题 /// public string Title { get; set; } /// /// 描述 /// public string Description { get; set; } /// /// 品牌 /// public string Brand { get; set; } /// /// 类目 /// public int CategoryId { get; set; } /// /// 类目编号路径,从一级类目到叶子类目,叶子类目为最后一项 /// public List CategoryIds { get; set; } /// /// 商品属性(非销售维度),如材质、产地 /// public List Attributes { get; set; } #endregion #region 媒体 /// /// 缩略图 /// public string ThumbUrl { get; set; } /// /// 主图 /// public List MainImages { get; set; } /// /// 详情图 /// public List DetailImages { get; set; } /// /// 视频地址,可为空 /// public string Video { get; set; } #endregion #region 销售 /// /// 规格 /// public List Specs { get; set; } /// /// SKU /// public List Skus { get; set; } /// /// 扩展数据 /// public Dictionary Extensions { get; set; } /// /// 划线价/市场价(商品级) /// public decimal? MarketPrice { get; set; } /// /// 销量 /// public long? SalesCount { get; set; } /// /// 来源平台展示的销量文案,如“已拼10万+件” /// public string SalesText { get; set; } /// /// 来源平台上架时间 /// public DateTime? ListingTime { get; set; } /// /// SKU最低售价 /// [JsonIgnore] public decimal MinPrice { get { return Skus.Any() ? Skus.Min(a => a.Price) : 0; } } /// /// SKU最高售价 /// [JsonIgnore] public decimal MaxPrice { get { return Skus.Any() ? Skus.Max(a => a.Price) : 0; } } /// /// 所有SKU库存总和 /// [JsonIgnore] public int TotalStock { get { return Skus.Sum(a => a.Stock); } } #endregion /// /// 校验商品数据,返回错误信息,null 表示通过。 /// public string Validate() { if (string.IsNullOrEmpty(ProductId)) return "缺少商品编号"; if (MainImages.Count == 0) return "缺少主图"; if (Skus.Count == 0) return "缺少SKU"; if (Specs.Any(s => string.IsNullOrEmpty(s.Name) || s.Values.Count == 0)) return "规格名称为空或规格值为空"; if (Specs.GroupBy(s => s.Name).Any(g => g.Count() > 1)) return "规格名称重复"; if (Specs.Any(s => s.Values.Distinct().Count() != s.Values.Count)) return "同一规格下规格值重复"; foreach (var sku in Skus) { // 每个 SKU 在每个规格维度上恰好选一个值 if (sku.Specs.Count != Specs.Count) return "SKU规格数量与商品规格不一致:" + sku.SkuId; foreach (var s in sku.Specs) { var spec = Specs.FirstOrDefault(a => a.Name == s.Name); if (spec == null) return "SKU使用了不存在的规格:" + s.Name; if (!spec.Values.Contains(s.Value)) return "SKU使用了不存在的规格值:" + s.Name + ":" + s.Value; } if (sku.Specs.GroupBy(a => a.Name).Any(g => g.Count() > 1)) return "SKU同一规格重复选择:" + sku.SkuId; } return null; } } /// /// 商品规格定义,如 颜色:红色、蓝色 /// public class ProductSpec { public ProductSpec() { Values = new List(); } /// /// 规格名称,如颜色、尺码,商品内唯一 /// public string Name { get; set; } /// /// 规格可选值,如红色、XL,规格内唯一 /// public List Values { get; set; } } /// /// 商品属性(非销售维度) /// public class ProductAttribute { public ProductAttribute() { Values = new List(); } /// /// 属性名称,如材质 /// public string Name { get; set; } /// /// 属性值列表 /// public List Values { get; set; } } /// /// 商品销售单元 /// public class ProductSku { public ProductSku() { Specs = new List(); } /// /// SKU编号 /// public string SkuId { get; set; } /// /// 当前售价(元) /// public decimal Price { get; set; } /// /// 可售库存 /// public int Stock { get; set; } /// /// SKU图片 /// public string ImageUrl { get; set; } /// /// SKU选中的规格值,Name/Value 必须存在于 Product.Specs /// public List Specs { get; set; } } /// /// SKU选中的一个规格值 /// public class ProductSkuSpec { /// /// 规格名称,对应 ProductSpec.Name /// public string Name { get; set; } /// /// 规格值,对应 ProductSpec.Values 中的一项 /// public string Value { get; set; } } }