增加通用商品Model
This commit is contained in:
1 parent
6b6bac5b1e
commit
310ef68c20
2 files changed
+303
No files matched your search
@@ -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
|
||||
{
|
||||
/// <summary>
|
||||
/// 通用商品Model
|
||||
/// </summary>
|
||||
public class Product
|
||||
{
|
||||
public Product()
|
||||
{
|
||||
CategoryIds = new List<int>();
|
||||
Attributes = new List<ProductAttribute>();
|
||||
MainImages = new List<string>();
|
||||
DetailImages = new List<string>();
|
||||
Specs = new List<ProductSpec>();
|
||||
Skus = new List<ProductSku>();
|
||||
Extensions = new Dictionary<string, string>();
|
||||
}
|
||||
|
||||
#region 来源
|
||||
|
||||
/// <summary>
|
||||
/// 来源平台
|
||||
/// </summary>
|
||||
public PlatformType Platform { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 来源商品链接
|
||||
/// </summary>
|
||||
public string SourceUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 来源店铺编号
|
||||
/// </summary>
|
||||
public string ShopId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 来源店铺名称
|
||||
/// </summary>
|
||||
public string ShopName { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region 基本信息
|
||||
/// <summary>
|
||||
/// 商家编号
|
||||
/// </summary>
|
||||
public string ProductId { get; set; }
|
||||
/// <summary>
|
||||
/// 标题
|
||||
/// </summary>
|
||||
public string Title { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 描述
|
||||
/// </summary>
|
||||
public string Description { get; set; }
|
||||
/// <summary>
|
||||
/// 品牌
|
||||
/// </summary>
|
||||
public string Brand { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 类目
|
||||
/// </summary>
|
||||
public int CategoryId { get; set; }
|
||||
/// <summary>
|
||||
/// 类目编号路径,从一级类目到叶子类目,叶子类目为最后一项
|
||||
/// </summary>
|
||||
public List<int> CategoryIds { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 商品属性(非销售维度),如材质、产地
|
||||
/// </summary>
|
||||
public List<ProductAttribute> Attributes { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region 媒体
|
||||
/// <summary>
|
||||
/// 缩略图
|
||||
/// </summary>
|
||||
public string ThumbUrl { get; set; }
|
||||
/// <summary>
|
||||
/// 主图
|
||||
/// </summary>
|
||||
public List<string> MainImages { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 详情图
|
||||
/// </summary>
|
||||
public List<string> DetailImages { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 视频地址,可为空
|
||||
/// </summary>
|
||||
public string Video { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region 销售
|
||||
|
||||
/// <summary>
|
||||
/// 规格
|
||||
/// </summary>
|
||||
public List<ProductSpec> Specs { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// SKU
|
||||
/// </summary>
|
||||
public List<ProductSku> Skus { get; set; }
|
||||
/// <summary>
|
||||
/// 扩展数据
|
||||
/// </summary>
|
||||
public Dictionary<string, string> Extensions { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 划线价/市场价(商品级)
|
||||
/// </summary>
|
||||
public decimal? MarketPrice { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 销量
|
||||
/// </summary>
|
||||
public long? SalesCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 来源平台展示的销量文案,如“已拼10万+件”
|
||||
/// </summary>
|
||||
public string SalesText { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 来源平台上架时间
|
||||
/// </summary>
|
||||
public DateTime? ListingTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// SKU最低售价
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public decimal MinPrice
|
||||
{
|
||||
get { return Skus.Any() ? Skus.Min(a => a.Price) : 0; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SKU最高售价
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public decimal MaxPrice
|
||||
{
|
||||
get { return Skus.Any() ? Skus.Max(a => a.Price) : 0; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 所有SKU库存总和
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public int TotalStock
|
||||
{
|
||||
get { return Skus.Sum(a => a.Stock); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 校验商品数据,返回错误信息,null 表示通过。
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 商品规格定义,如 颜色:红色、蓝色
|
||||
/// </summary>
|
||||
public class ProductSpec
|
||||
{
|
||||
public ProductSpec()
|
||||
{
|
||||
Values = new List<string>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 规格名称,如颜色、尺码,商品内唯一
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 规格可选值,如红色、XL,规格内唯一
|
||||
/// </summary>
|
||||
public List<string> Values { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 商品属性(非销售维度)
|
||||
/// </summary>
|
||||
public class ProductAttribute
|
||||
{
|
||||
public ProductAttribute()
|
||||
{
|
||||
Values = new List<string>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 属性名称,如材质
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 属性值列表
|
||||
/// </summary>
|
||||
public List<string> Values { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 商品销售单元
|
||||
/// </summary>
|
||||
public class ProductSku
|
||||
{
|
||||
public ProductSku()
|
||||
{
|
||||
Specs = new List<ProductSkuSpec>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SKU编号
|
||||
/// </summary>
|
||||
public string SkuId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前售价(元)
|
||||
/// </summary>
|
||||
public decimal Price { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 可售库存
|
||||
/// </summary>
|
||||
public int Stock { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// SKU图片
|
||||
/// </summary>
|
||||
public string ImageUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// SKU选中的规格值,Name/Value 必须存在于 Product.Specs
|
||||
/// </summary>
|
||||
public List<ProductSkuSpec> Specs { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SKU选中的一个规格值
|
||||
/// </summary>
|
||||
public class ProductSkuSpec
|
||||
{
|
||||
/// <summary>
|
||||
/// 规格名称,对应 ProductSpec.Name
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 规格值,对应 ProductSpec.Values 中的一项
|
||||
/// </summary>
|
||||
public string Value { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ namespace AllBase.Model.Result.PDDResult
|
||||
{
|
||||
public class PDDFrontProductInfo5
|
||||
{
|
||||
[Description("平台")]
|
||||
public PlatformType Platform { get; set; }
|
||||
[Description("商品编号")]
|
||||
public long GoodsId { get; set; }
|
||||
|
||||
Reference in new issue
Block a user