From 310ef68c204387500c9a3b7a5e1e368668a16804 Mon Sep 17 00:00:00 2001 From: chfei Date: Mon, 26 Oct 2026 15:32:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=9A=E7=94=A8=E5=95=86?= =?UTF-8?q?=E5=93=81Model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AllBase/Model/Product.cs | 302 ++++++++++++++++++ .../Result/PDDResult/PDDFrontProductInfo5.cs | 1 + 2 files changed, 303 insertions(+) create mode 100644 AllBase/Model/Product.cs diff --git a/AllBase/Model/Product.cs b/AllBase/Model/Product.cs new file mode 100644 index 0000000..5db4210 --- /dev/null +++ b/AllBase/Model/Product.cs @@ -0,0 +1,302 @@ +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; } + } +} \ No newline at end of file diff --git a/AllBase/Model/Result/PDDResult/PDDFrontProductInfo5.cs b/AllBase/Model/Result/PDDResult/PDDFrontProductInfo5.cs index 988945d..34b0b27 100644 --- a/AllBase/Model/Result/PDDResult/PDDFrontProductInfo5.cs +++ b/AllBase/Model/Result/PDDResult/PDDFrontProductInfo5.cs @@ -12,6 +12,7 @@ namespace AllBase.Model.Result.PDDResult { public class PDDFrontProductInfo5 { + [Description("平台")] public PlatformType Platform { get; set; } [Description("商品编号")] public long GoodsId { get; set; }