首次提交:初始化后端、数据库结构与文档代码

This commit is contained in:
Peter
2026-03-23 16:10:29 +08:00
commit 86f384c2d3
95 changed files with 10090 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 统一客户维度宽表 Entity
* 对齐 DDL: dim_customer_info
*/
@Data
@TableName("dim_customer_info")
public class CustomerInfo {
@TableId(type = IdType.AUTO)
private Long id;
/** 手机号(首选关联枢纽) */
private String mobile;
/** 有赞生态统一用户ID */
private String yzOpenId;
/** 微信生态UnionID */
private String wxUnionId;
/** 微信公众号/小程序OpenID */
private String wxOpenId;
/** 客户昵称快照 */
private String nickname;
/** 客户真实姓名 */
private String name;
/** 性别: 0-未知, 1-男, 2-女 */
private Integer gender;
/** 生日 */
private java.time.LocalDate birthday;
/** 首次注册/留资时间 */
private LocalDateTime registerTime;
/** 注册渠道 */
private String registerChannel;
/** 当前会员等级ID */
private Long memberLevelId;
/** 当前会员等级名称 */
private String memberLevelName;
/** 首单支付时间 */
private LocalDateTime firstPayTime;
/** 最近一次支付时间RFM-R */
private LocalDateTime lastPayTime;
/** 历史累计实付金额RFM-M */
private BigDecimal totalPayAmount;
/** 历史累计支付订单数RFM-F */
private Integer totalPayCount;
/** 客户标签集合 (JSON) */
private String customerTags;
/** 中台数据更新时间 (DB自动管理) */
@TableField(insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private LocalDateTime etlUpdateTime;
}

View File

@@ -0,0 +1,39 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 客群洞察 - RFM 模型
*/
@Data
@TableName("adm_customer_rfm")
public class CustomerRfm {
@TableId(type = IdType.AUTO)
private Long id;
// 用户唯一标识
private String yzOpenId;
private String mobile;
// R: 最近消费时间、F: 90天消费频次、M: 90天消费金额
private LocalDateTime lastTradeTime;
private Integer tradeCount90d;
private BigDecimal tradeAmount90d;
// RFM 对应评分 (1-5分)
private Integer rScore;
private Integer fScore;
private Integer mScore;
// 系统划分的客群分类 (如: 重要价值客户)
private String rfmGroup;
private LocalDateTime etlUpdateTime;
}

View File

@@ -0,0 +1,29 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 客群特征标签表
*/
@Data
@TableName("adm_customer_tags")
public class CustomerTag {
@TableId(type = IdType.AUTO)
private Long id;
private String yzOpenId;
// 标签名称 (例如: 周末消费客, 囤货小能手)
private String tagName;
// 标签值或对应权重 (如有)
private String tagValue;
private LocalDateTime etlUpdateTime;
}

View File

@@ -0,0 +1,42 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 每日库存快照 Entity
* 对齐 DDL: dim_inventory_snapshot
*/
@Data
@TableName("dim_inventory_snapshot")
public class InventorySnapshot {
@TableId(type = IdType.AUTO)
private Long id;
/** 仓库编码 */
private String warehouseCode;
/** SKU编码 */
private String skuCode;
/** 实物库存 */
private BigDecimal stockNum;
/** 实物占用 */
private BigDecimal freezeNum;
/** 可用库存 (stock_num - freeze_num) */
private BigDecimal availableNum;
/** 快照日期 */
private LocalDate snapshotDate;
/** 中台同步时间 */
@TableField(insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private LocalDateTime etlUpdateTime;
}

View File

@@ -0,0 +1,38 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 商品洞察 - 购物篮关联分析 (简化的Apriori)
*/
@Data
@TableName("adm_item_basket")
public class ItemBasket {
@TableId(type = IdType.AUTO)
private Long id;
// A -> B 的关联
private Long itemIdA;
private String itemNameA;
private Long itemIdB;
private String itemNameB;
// 共同出现的订单数
private Integer pairOrderCount;
// A 独立出现的订单数
private Integer itemAOrderCount;
// 置信度 (pairOrderCount / itemAOrderCount)
private BigDecimal confidence;
private LocalDateTime etlUpdateTime;
}

View File

@@ -0,0 +1,40 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 商品洞察 - 复购分析
*/
@Data
@TableName("adm_item_repurchase")
public class ItemRepurchase {
@TableId(type = IdType.AUTO)
private Long id;
private LocalDate statDate;
private Long itemId;
private Long skuId;
// 过去30天购买该商品的总人数
private Integer purchaserCount30d;
// 过去30天内购买该商品后再次回购的人数
private Integer repurchaserCount30d;
// 30天复购率
private BigDecimal repurchaseRate30d;
// 矩阵打标 (如: 核心引流款)
private String matrixTag;
private LocalDateTime etlUpdateTime;
}

View File

@@ -0,0 +1,34 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 商品洞察 - 单品日销售趋势
*/
@Data
@TableName("adm_item_sales_trend")
public class ItemSalesTrend {
@TableId(type = IdType.AUTO)
private Long id;
private LocalDate statDate;
private Long itemId;
private Long skuId;
private String itemName;
// 单日维度统计
private Integer salesQty;
private BigDecimal salesAmount;
private Integer orderCount;
private LocalDateTime etlUpdateTime;
}

View File

@@ -0,0 +1,69 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 商品与SKU维度表 Entity
* 对齐 DDL: dim_item_sku
* 价格单位与有赞API一致
*/
@Data
@TableName("dim_item_sku")
public class ItemSku {
@TableId(type = IdType.AUTO)
private Long id;
/** 有赞商品ID (NOT NULL) */
private Long itemId;
/** 有赞SKU ID (NOT NULL, 无SKU时为0) */
private Long skuId;
/** 商家外部商品编码 (关联核心) */
private String outerItemId;
/** 商家外部SKU编码 */
private String outerSkuId;
/** 商品条码 */
private String barcode;
/** 商品/SKU名称 (NOT NULL) */
private String title;
/** 商品别名/短链接标识 */
private String alias;
/** 叶子类目ID */
private Long categoryId;
/** 叶子类目名称 */
private String categoryName;
/** 商品分组ID列表 (逗号分隔) */
private String groupIds;
/** 当前售卖价(单位:分) */
private Long price;
/** 成本价(单位:分) */
private Long costPrice;
/** 是否上架: true-上架, false-下架 */
@TableField("is_listing")
private Boolean isListing;
/** 商品在有赞的创建时间 */
private LocalDateTime createdTime;
/** 商品最近更新时间 */
private LocalDateTime updateTime;
/** 中台数据更新时间 (DB自动管理) */
@TableField(insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private LocalDateTime etlUpdateTime;
}

View File

@@ -0,0 +1,55 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 门店与网点维表 Entity
* 对齐 DDL: dim_offline_store
*/
@Data
@TableName("dim_offline_store")
public class OfflineStore {
@TableId(type = IdType.AUTO)
private Long id;
/** 有赞网点/门店ID */
private Long offlineId;
/** 组织店铺ID */
private String shopOrgId;
/** 门店名称 */
private String name;
/** 节点类型: STORE-门店, WAREHOUSE-仓库 */
private String type;
/** 省份 */
private String province;
/** 城市 */
private String city;
/** 区县 */
private String district;
/** 详细地址 */
private String address;
/** 营业状态: 1-营业, 0-关店 */
private Integer status;
/** 仓库编码 (库存API必需) */
private String warehouseCode;
/** 库存模式: 1-独立, 2-共享总部, 3-共享门店仓, 4-进出存 */
private Integer stockMode;
/** 中台数据更新时间 */
@TableField(insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private LocalDateTime etlUpdateTime;
}

View File

@@ -0,0 +1,102 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 交易明细事实表 Entity
* 对齐 DDL: dwd_trade_order_detail
*/
@Data
@TableName("dwd_trade_order_detail")
public class TradeOrderDetail {
@TableId(type = IdType.AUTO)
private Long id;
/** 有赞主订单号 */
private String tid;
/** 有赞子订单号/明细ID */
private String oid;
/** 买家手机号 */
private String buyerPhone;
/** 有赞用户开放ID */
private String yzOpenId;
/** 粉丝ID */
private Long fansId;
/** 店铺组织ID */
private String shopOrgId;
/** 网点/门店ID */
private Long offlineId;
/** 商品ID (NOT NULL, 默认0) */
private Long itemId = 0L;
/** SKU ID (NOT NULL, 默认0) */
private Long skuId = 0L;
/** 商家外部商品编码 */
private String outerItemId;
/** 商家外部SKU编码 */
private String outerSkuId;
/** 商品名称快照 */
private String title;
/** 单商品原价 */
private BigDecimal price;
/** 购买数量 */
private Integer num;
/** 原价小计 */
private BigDecimal totalFee;
/** 折扣后价格 */
private BigDecimal discountPrice;
/** 实际支付摊销金额 */
private BigDecimal payment;
/** 订单状态 */
private String status;
/** 退款状态 */
private Integer refundState;
/** 订单来源平台 */
private String sourcePlatform;
/** 是否零售门店订单 */
@TableField("is_retail_order")
private Boolean isRetailOrder;
/** 订单类型 */
private Integer orderType;
/** 支付时间 */
private LocalDateTime payTime;
/** 订单创建时间 */
private LocalDateTime createdTime;
/** 订单最后更新时间 */
private LocalDateTime updateTime;
/** 订单完成时间 */
private LocalDateTime successTime;
/** 中台数据更新时间 (由 DB DEFAULT CURRENT_TIMESTAMP 自动管理) */
@TableField(insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private LocalDateTime etlUpdateTime;
}

View File

@@ -0,0 +1,65 @@
package com.chuyishidai.datahub.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 售后与退款明细 Entity
* 对齐 DDL: dwd_trade_refund_detail
*/
@Data
@TableName("dwd_trade_refund_detail")
public class TradeRefundDetail {
@TableId(type = IdType.AUTO)
private Long id;
/** 退款单号 */
private String refundId;
/** 关联的主订单号 */
private String tid;
/** 关联的子订单明细ID */
private String oid;
/** 发起退款的门店ID */
private Long offlineId;
/** 退款类型: 1-仅退款, 2-退货退款 */
private Integer refundType;
/** 实际退款金额 */
private BigDecimal refundFee;
/** 退款原因 */
private String reason;
/** 退款状态 */
private String status;
/** 退款申请时间 */
private LocalDateTime createdTime;
/** 退款成功时间 */
private LocalDateTime successTime;
/** 退款诉求: 1-仅退款, 2-退货退款, 3-换货 */
private Integer refundDemand;
/** 退款阶段: 1-售中, 2-售后 */
private Integer refundPhase;
/** 买家 yz_open_id */
private String yzOpenId;
/** 最后修改时间 */
private LocalDateTime modifiedTime;
/** 中台数据更新时间 */
@TableField(insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private LocalDateTime etlUpdateTime;
}