商品域完整设计(算法版)

一、商品域的核心职责与业务边界

1. 业务定位

商品域作为商品主数据唯一源,负责管理商品全生命周期信息,为采购、销售、仓储、财务等域提供准确、一致的商品基础数据。

2. 核心职责

  • 商品信息管理:SKU创建、变更、下架、淘汰

  • 商品分类体系:多级分类、标签体系

  • 价格管理:基础定价、价格策略、调价历史

  • 商品关系管理:组合商品、替代商品、互斥商品

  • 商品状态流转:生命周期状态管理

  • 商品数据服务:为其他域提供商品查询服务

二、商品域表结构ER设计

sql
-- 创建商品域数据库
CREATE DATABASE product_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE product_db;

-- 1. 商品分类表
CREATE TABLE product_categories (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    category_code VARCHAR(50) NOT NULL UNIQUE COMMENT '分类编码',
    category_name VARCHAR(100) NOT NULL COMMENT '分类名称',
    parent_id BIGINT COMMENT '父级分类ID',
    level TINYINT DEFAULT 1 COMMENT '分类层级',
    sort_order INT DEFAULT 0 COMMENT '排序',
    description TEXT COMMENT '分类描述',
    is_active BOOLEAN DEFAULT TRUE,
    created_by VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (parent_id) REFERENCES product_categories(id),
    INDEX idx_parent (parent_id),
    INDEX idx_code (category_code)
) COMMENT '商品分类表';

-- 2. 商品品牌表
CREATE TABLE product_brands (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    brand_code VARCHAR(50) NOT NULL UNIQUE COMMENT '品牌编码',
    brand_name VARCHAR(100) NOT NULL COMMENT '品牌名称',
    brand_logo VARCHAR(500) COMMENT '品牌Logo',
    description TEXT COMMENT '品牌描述',
    country VARCHAR(50) COMMENT '品牌国家',
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_brand_code (brand_code)
) COMMENT '商品品牌表';

-- 3. 商品供应商关系表
CREATE TABLE product_suppliers (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT NOT NULL,
    supplier_id BIGINT NOT NULL COMMENT '供应商ID',
    supplier_product_code VARCHAR(100) COMMENT '供应商商品编码',
    supplier_product_name VARCHAR(200) COMMENT '供应商商品名称',
    is_primary BOOLEAN DEFAULT FALSE COMMENT '是否主供应商',
    lead_time INT COMMENT '交货周期(天)',
    min_order_quantity DECIMAL(10,2) COMMENT '最小起订量',
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_product_supplier (product_id, supplier_id),
    INDEX idx_supplier (supplier_id),
    FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
) COMMENT '商品供应商关系表';

-- 4. 商品主表(核心表)
CREATE TABLE products (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    sku VARCHAR(100) NOT NULL UNIQUE COMMENT '商品SKU',
    product_name VARCHAR(200) NOT NULL COMMENT '商品名称',
    product_alias VARCHAR(200) COMMENT '商品别名',
    category_id BIGINT NOT NULL COMMENT '分类ID',
    brand_id BIGINT COMMENT '品牌ID',
    
    -- 基础信息
    product_type ENUM('普通商品', '组合商品', '虚拟商品', '服务') DEFAULT '普通商品',
    unit VARCHAR(20) NOT NULL COMMENT '计量单位',
    spec VARCHAR(200) COMMENT '规格',
    model VARCHAR(100) COMMENT '型号',
    weight DECIMAL(10,3) COMMENT '重量(kg)',
    volume DECIMAL(10,3) COMMENT '体积(m³)',
    
    -- 价格信息
    default_price DECIMAL(10,2) NOT NULL COMMENT '默认售价',
    cost_price DECIMAL(10,2) COMMENT '参考成本价',
    market_price DECIMAL(10,2) COMMENT '市场价',
    price_unit VARCHAR(20) DEFAULT '元' COMMENT '价格单位',
    
    -- 税务信息
    tax_type ENUM('应税', '免税', '零税率') DEFAULT '应税',
    tax_rate DECIMAL(5,4) DEFAULT 0.13 COMMENT '税率',
    
    -- 状态控制
    status ENUM('草稿', '已上架', '已下架', '已停用') DEFAULT '草稿',
    approval_status ENUM('待审核', '审核通过', '审核驳回') DEFAULT '待审核',
    
    -- 库存控制
    is_manage_inventory BOOLEAN DEFAULT TRUE COMMENT '是否管理库存',
    low_stock_threshold INT COMMENT '低库存阈值',
    high_stock_threshold INT COMMENT '高库存阈值',
    
    -- 时间控制
    shelf_life_days INT COMMENT '保质期(天)',
    production_lead_time INT COMMENT '生产提前期',
    
    -- 标识信息
    barcode VARCHAR(100) COMMENT '条形码',
    qr_code VARCHAR(500) COMMENT '二维码',
    product_image VARCHAR(500) COMMENT '商品主图',
    product_images JSON COMMENT '商品图集',
    
    -- 描述信息
    description TEXT COMMENT '商品描述',
    product_features JSON COMMENT '商品特性',
    
    -- 审计字段
    created_by VARCHAR(50) NOT NULL,
    updated_by VARCHAR(50),
    approved_by VARCHAR(50),
    approved_at DATETIME,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (category_id) REFERENCES product_categories(id),
    FOREIGN KEY (brand_id) REFERENCES product_brands(id),
    INDEX idx_sku (sku),
    INDEX idx_category (category_id),
    INDEX idx_brand (brand_id),
    INDEX idx_status (status),
    INDEX idx_barcode (barcode)
) COMMENT '商品主表';

-- 5. 商品属性表
CREATE TABLE product_attributes (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    attribute_code VARCHAR(50) NOT NULL UNIQUE COMMENT '属性编码',
    attribute_name VARCHAR(100) NOT NULL COMMENT '属性名称',
    attribute_type ENUM('文本', '数字', '日期', '枚举', '布尔') DEFAULT '文本',
    category_id BIGINT COMMENT '绑定分类',
    is_required BOOLEAN DEFAULT FALSE COMMENT '是否必填',
    is_multiple BOOLEAN DEFAULT FALSE COMMENT '是否多值',
    sort_order INT DEFAULT 0,
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (category_id) REFERENCES product_categories(id),
    INDEX idx_category (category_id)
) COMMENT '商品属性表';

-- 6. 商品属性值表
CREATE TABLE product_attribute_values (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT NOT NULL,
    attribute_id BIGINT NOT NULL,
    attribute_value TEXT COMMENT '属性值',
    value_type ENUM('文本', '数字', '日期') DEFAULT '文本',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE,
    FOREIGN KEY (attribute_id) REFERENCES product_attributes(id),
    UNIQUE KEY uk_product_attribute (product_id, attribute_id),
    INDEX idx_attribute (attribute_id)
) COMMENT '商品属性值表';

-- 7. 商品价格历史表
CREATE TABLE product_price_history (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT NOT NULL,
    old_price DECIMAL(10,2) COMMENT '原价格',
    new_price DECIMAL(10,2) NOT NULL COMMENT '新价格',
    change_type ENUM('调价', '促销', '成本变动') DEFAULT '调价',
    change_reason VARCHAR(200) COMMENT '调价原因',
    effective_time DATETIME NOT NULL COMMENT '生效时间',
    end_time DATETIME COMMENT '结束时间',
    created_by VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (product_id) REFERENCES products(id),
    INDEX idx_product_effective (product_id, effective_time)
) COMMENT '商品价格历史表';

-- 8. 商品关系表
CREATE TABLE product_relations (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    parent_product_id BIGINT NOT NULL COMMENT '父商品ID',
    child_product_id BIGINT NOT NULL COMMENT '子商品ID',
    relation_type ENUM('组合', '替代', '互斥', '升级') NOT NULL,
    quantity DECIMAL(10,2) DEFAULT 1 COMMENT '数量(组合商品用)',
    sort_order INT DEFAULT 0,
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (parent_product_id) REFERENCES products(id),
    FOREIGN KEY (child_product_id) REFERENCES products(id),
    UNIQUE KEY uk_product_relation (parent_product_id, child_product_id, relation_type),
    INDEX idx_parent (parent_product_id),
    INDEX idx_child (child_product_id)
) COMMENT '商品关系表';

-- 9. 商品标签表
CREATE TABLE product_tags (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    tag_name VARCHAR(50) NOT NULL COMMENT '标签名称',
    tag_type ENUM('系统', '自定义') DEFAULT '自定义',
    tag_color VARCHAR(20) COMMENT '标签颜色',
    is_active BOOLEAN DEFAULT TRUE,
    created_by VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_tag_name (tag_name)
) COMMENT '商品标签表';

-- 10. 商品标签关联表
CREATE TABLE product_tag_relations (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT NOT NULL,
    tag_id BIGINT NOT NULL,
    created_by VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE,
    FOREIGN KEY (tag_id) REFERENCES product_tags(id) ON DELETE CASCADE,
    UNIQUE KEY uk_product_tag (product_id, tag_id),
    INDEX idx_tag (tag_id)
) COMMENT '商品标签关联表';

-- 11. 商品变更审核表
CREATE TABLE product_approvals (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    product_id BIGINT NOT NULL,
    change_type ENUM('新建', '修改', '上架', '下架') NOT NULL,
    change_data JSON COMMENT '变更数据',
    change_reason VARCHAR(500) COMMENT '变更原因',
    applicant VARCHAR(50) NOT NULL COMMENT '申请人',
    applicant_time DATETIME NOT NULL COMMENT '申请时间',
    approver VARCHAR(50) COMMENT '审批人',
    approve_time DATETIME COMMENT '审批时间',
    approve_status ENUM('待审批', '通过', '驳回') DEFAULT '待审批',
    approve_comment VARCHAR(500) COMMENT '审批意见',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (product_id) REFERENCES products(id),
    INDEX idx_product_status (product_id, approve_status),
    INDEX idx_applicant (applicant)
) COMMENT '商品变更审核表';

三、商品域核心业务算法

1. 商品生命周期管理算法

商品创建算法:

text
输入:CreateProductRequest(SKU、商品名称、分类、价格等)、创建人
处理流程:
1. 校验SKU唯一性:查询商品表是否存在相同SKU
2. 验证分类有效性:检查分类是否存在且启用
3. 验证品牌有效性:检查品牌是否存在且启用
4. 创建商品记录:
   - 状态设为"草稿"
   - 审核状态设为"待审核"
   - 记录创建人和时间
5. 保存商品属性值
6. 创建审核记录
7. 返回创建的商品信息

商品更新算法:

text
输入:商品ID、UpdateProductRequest、更新人
处理流程:
1. 验证商品存在性:根据ID查询商品
2. 检测关键字段变更:
   - 商品名称、默认售价、分类、计税方式
3. 更新商品字段
4. 发布商品更新事件(包含变更字段)
5. 如果需要重新审核:
   - 更新审核状态为"待审核"
   - 创建新的审核记录
6. 返回更新后的商品信息

商品上架算法:

text
输入:商品ID、上架原因、操作人
处理流程:
1. 验证商品存在性
2. 验证商品状态:不能是已上架状态
3. 验证审核状态:必须是审核通过
4. 更新商品状态为"已上架"
5. 发布商品状态变更事件
6. 记录操作日志

商品下架算法:

text
输入:商品ID、下架原因、操作人
处理流程:
1. 验证商品存在性
2. 更新商品状态为"已下架"
3. 发布商品状态变更事件
4. 记录操作日志

价格调整算法:

text
输入:商品ID、新价格、调整原因、操作人
处理流程:
1. 验证商品存在性
2. 验证价格有效性:新价格必须大于0且与原价格不同
3. 记录价格历史:
   - 保存原价格和新价格
   - 记录调整原因和时间
4. 更新商品默认售价
5. 发布价格变更事件
6. 记录操作日志

2. 商品查询服务算法

商品详情查询算法:

text
输入:商品ID
处理流程:
1. 检查缓存:从Redis查询商品缓存
2. 缓存命中:直接返回缓存数据
3. 缓存未命中:
   - 从数据库查询商品基本信息
   - 查询商品属性值
   - 查询商品标签
   - 组装完整商品信息
   - 写入缓存(设置过期时间)
4. 返回商品详情

商品搜索算法:

text
输入:ProductSearchRequest(关键词、分类、品牌、状态、价格范围等)、分页参数
处理流程:
1. 构建搜索条件:
   - 关键词:商品名称或SKU模糊匹配
   - 分类:精确匹配分类ID
   - 品牌:精确匹配品牌ID
   - 状态:精确匹配商品状态
   - 价格范围:价格区间过滤
2. 执行数据库查询(带分页)
3. 返回分页结果

批量商品查询算法:

text
输入:商品ID列表
处理流程:
1. 分组处理:
   - 已缓存的商品ID:直接从缓存获取
   - 未缓存的商品ID:批量查询数据库
2. 批量查询数据库:
   - 使用IN条件查询商品基本信息
   - 批量查询商品属性值
   - 批量查询商品标签
3. 组装结果并更新缓存
4. 返回商品信息映射

分类树查询算法:

text
输入:无
处理流程:
1. 查询所有启用的分类
2. 构建树形结构:
   - 找出所有根节点(parent_id为NULL)
   - 递归查找每个根节点的子节点
   - 按sort_order排序
3. 返回分类树

3. 商品审核流程算法

审核提交算法:

text
输入:商品ID、变更类型、变更原因、申请人
处理流程:
1. 验证商品存在性
2. 创建审核记录:
   - 记录变更数据和原因
   - 状态设为"待审批"
   - 记录申请人和时间
3. 更新商品审核状态为"待审核"
4. 通知审批人

审核处理算法:

text
输入:审核记录ID、审批结果、审批意见、审批人
处理流程:
1. 验证审核记录存在且状态为"待审批"
2. 更新审核记录:
   - 记录审批结果和意见
   - 状态更新为"通过"或"驳回"
   - 记录审批人和时间
3. 更新商品审核状态
4. 如果审核通过:
   - 根据变更类型执行相应操作
   - 发布相应的事件
5. 通知申请人审批结果

4. 商品事件发布算法

商品创建事件发布算法:

text
输入:商品信息
处理流程:
1. 构建事件对象:
   - 生成唯一事件ID
   - 封装商品关键信息(ID、SKU、名称、分类、价格、状态)
2. 发送到Kafka商品创建主题
3. 记录事件发布日志

商品更新事件发布算法:

text
输入:原商品信息、新商品信息、更新人
处理流程:
1. 检测变更字段:
   - 比较新旧商品的各个字段
   - 记录发生变更的字段及其新值
2. 构建事件对象:
   - 包含商品ID、SKU和变更字段映射
3. 发送到Kafka商品更新主题
4. 记录事件发布日志

价格变更事件发布算法:

text
输入:商品信息、原价格、新价格、变更原因、操作人
处理流程:
1. 构建事件对象:
   - 包含商品ID、SKU、原价格、新价格、变更原因
2. 发送到Kafka价格变更主题
3. 记录价格历史
4. 记录事件发布日志

状态变更事件发布算法:

text
输入:商品信息、原状态、新状态、变更原因、操作人
处理流程:
1. 构建事件对象:
   - 包含商品ID、SKU、原状态、新状态、变更原因
2. 发送到Kafka状态变更主题
3. 记录事件发布日志

四、商品域与其他域的交互

1. 为上游域提供的服务

采购域依赖:

text
提供数据:
- 商品基础信息(SKU、名称、规格、单位)
- 供应商关系(主供应商、采购价格、交货周期)
- 商品分类信息

服务接口:
1. 商品信息查询接口
2. 供应商商品关系查询接口
3. 商品分类查询接口

销售域依赖:

text
提供数据:
- 商品销售信息(默认售价、商品状态)
- 商品分类和标签
- 商品关系和组合信息

服务接口:
1. 商品详情查询接口(带缓存)
2. 商品搜索接口
3. 价格查询接口
4. 商品状态验证接口

仓储域依赖:

text
提供数据:
- 商品规格信息(重量、体积)
- 库存控制参数(高低库存阈值)
- 保质期信息

服务接口:
1. 商品规格查询接口
2. 库存参数查询接口

财务域依赖:

text
提供数据:
- 商品税务信息(税率、计税方式)
- 成本参考价格
- 价格变更历史

服务接口:
1. 商品税务信息查询接口
2. 价格历史查询接口

2. 事件订阅处理

组织架构变更事件处理:

text
输入:OrganizationChangedEvent
处理流程:
1. 解析事件数据:涉及的组织单元变更
2. 更新相关商品的组织权限信息
3. 清理相关的商品缓存

供应商变更事件处理:

text
输入:SupplierChangedEvent(来自采购域)
处理流程:
1. 解析事件数据:供应商状态变更
2. 更新商品供应商关系状态
3. 如果供应商停用,检查是否有商品依赖该供应商
4. 通知相关人员处理

五、商品域缓存策略算法

1. 多级缓存设计

商品详情缓存算法:

text
缓存键:product:detail:{商品ID}
缓存值:商品完整信息(基本信息+属性+标签)
过期时间:24小时
更新策略:
- 商品变更时清除缓存
- 缓存未命中时从数据库加载

商品SKU缓存算法:

text
缓存键:product:sku:{SKU}
缓存值:商品ID
过期时间:永久(手动清除)
更新策略:
- 商品创建时设置
- 商品SKU变更时更新

分类树缓存算法:

text
缓存键:product:category:tree
缓存值:完整的分类树结构
过期时间:1小时
更新策略:
- 分类变更时清除缓存
- 定时刷新缓存

2. 缓存一致性保障

商品变更时的缓存清理算法:

text
输入:商品ID、变更类型
处理流程:
1. 清除商品详情缓存
2. 清除基于该商品的搜索缓存
3. 如果涉及分类变更,清除分类相关缓存
4. 如果涉及价格变更,清除价格相关缓存

批量缓存更新算法:

text
输入:商品ID列表
处理流程:
1. 批量查询商品信息
2. 并行更新各个商品的缓存
3. 监控缓存更新成功率
4. 记录缓存更新日志

六、商品域业务规则

1. 状态流转规则

text
商品状态流转:
草稿 → 待审核 → 已上架 → 已下架 → 已停用
       ↓         ↓
     审核驳回   重新上架

2. 价格管理规则

text
价格调整规则:
- 新价格必须大于0
- 价格调整必须记录原因
- 重大价格调整需要审核
- 价格历史保留至少2年

3. 审核规则

text
需要审核的变更:
- 新建商品
- 商品名称变更
- 默认售价变更超过阈值
- 分类变更
- 计税方式变更

4. 数据验证规则

text
SKU验证规则:
- 必须唯一
- 长度不超过100字符
- 只能包含字母、数字、连字符

商品名称验证:
- 不能为空
- 长度不超过200字符

价格验证:
- 必须大于0
- 小数位数不超过2位

七、商品域配置参数

1. 业务参数配置

yaml
product:
  cache:
    detail-expire-hours: 24
    category-expire-minutes: 60
  approval:
    enabled: true
    require-price-approval: true
    price-approval-threshold: 100.00
  search:
    max-results: 1000
    default-page-size: 20
  validation:
    max-sku-length: 100
    max-product-name-length: 200

2. 事件配置

yaml
kafka:
  topics:
    product-created: product.created
    product-updated: product.updated
    product-price-changed: product.price.changed
    product-status-changed: product.status.changed

总结

商品域的核心价值

  1. 数据权威性:作为商品主数据的唯一来源,保证数据一致性

  2. 生命周期管理:完整的商品状态流转和变更控制

  3. 高性能服务:多级缓存支撑高并发查询需求

  4. 事件驱动:及时通知其他域商品数据变更

  5. 扩展性:支持动态属性、多级分类等复杂业务场景

与上下游域的协同

  • 对采购域:提供商品基础和供应商关系数据

  • 对销售域:提供商品信息、价格和状态数据

  • 对仓储域:提供商品规格和库存参数

  • 对财务域:提供税务和成本数据

关键技术特性

  • 缓存优化:多级缓存减少数据库压力

  • 事件溯源:完整记录商品变更历史

  • 审核流程:关键变更的审批控制

  • 搜索能力:灵活的商品搜索和过滤

通过这套设计,商品域能够为整个进销存系统提供稳定、准确、高效的商品数据服务,支撑各业务域的顺畅运作。

 posted on 2025-10-22 16:49  xibuhaohao  阅读(1)  评论(0)    收藏  举报