package com.doumee.core.douyin.dto; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; import java.util.List; /** * 抖音商品项(online/query 返回的 products 元素)。 *
抖音 online/query 的 products 元素为嵌套结构:在线状态、SKU 列表在顶层, * 商品基础信息(product_id/product_name/product_type/category/out_id 等)藏在 {@code product} 子对象里。 * 故本类顶层只持有 onlineStatus / skus / product 三个字段。 *
早期版本把 productId 等平铺在顶层,与抖音真实返回层级不符,导致除 onlineStatus 外字段全空,已校正。
*
* @author rk
* @date 2026/06/22
*/
@Data
public class DouyinProductDTO {
/** 在线状态 1在线 2下线 3封禁(顶层字段) */
@JSONField(name = "online_status")
private Integer onlineStatus;
/** 多规格商品的 SKU 规格列表(复数节点,顶层字段);单 SKU 团购此为空数组 */
@JSONField(name = "skus")
private List 抖音 online/query 对单 SKU 团购返回 {@code sku}(单数对象)且 {@code skus}(复数)为空数组;
* 多规格商品则相反(走 skus)。入库时两者归集统一处理,见 upsertProduct。
*/
@JSONField(name = "sku")
private DouyinSkuDTO sku;
/** 商品基础信息(嵌套子对象,承载 product_id/product_name/product_type/category/out_id 等) */
@JSONField(name = "product")
private DouyinProductInfoDTO product;
/**
* 抖音 online/query 的 product 子对象(商品基础信息)。
* 对应抖音返回 products[].product 节点。
*/
@Data
public static class DouyinProductInfoDTO {
/** 抖音侧商品ID(业务唯一键,用于本地 upsert 与核销匹配) */
@JSONField(name = "product_id")
private String productId;
/** 商品名称 */
@JSONField(name = "product_name")
private String productName;
/** 商品类型 */
@JSONField(name = "product_type")
private Integer productType;
/** 类目ID(数字,超出 int 范围用 Long) */
@JSONField(name = "category_id")
private Long categoryId;
/** 类目全名(如"本地生活/餐饮/...",文本,展示用) */
@JSONField(name = "category_full_name")
private String categoryFullName;
/** 抖音原始 out_id;本地 out_id 由管理端绑定套餐(discount.id),同步时【不入库】 */
@JSONField(name = "out_id")
private String outId;
/** 归属账户ID(来客商户根账户,数字转字符串后落库) */
@JSONField(name = "owner_account_id")
private Long ownerAccountId;
}
}