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