销售域完整设计(算法版)

一、销售域的核心职责与业务边界

1. 业务定位

销售域作为销售业务处理中心,负责管理门店销售、促销活动、销售订单、退换货等核心销售流程,为前端销售提供业务支撑,同时为财务域提供收入数据。

2. 核心职责

  • 销售订单管理:订单创建、状态流转、订单查询

  • 促销活动管理:促销规则、优惠券、折扣策略

  • 价格策略管理:会员价、促销价、组合价

  • 退换货管理:退货流程、换货流程、退款处理

  • 销售分析:销售报表、业绩分析、商品销售排行

  • 库存校验:实时库存检查、库存预留

二、销售域表结构ER设计

sql
-- 创建销售域数据库
CREATE DATABASE sales_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE sales_db;

-- 1. 销售订单主表
CREATE TABLE sales_orders (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_no VARCHAR(50) NOT NULL UNIQUE COMMENT '订单编号',
    order_type ENUM('门店销售', '线上订单', '团购', '批发') DEFAULT '门店销售',
    store_id BIGINT NOT NULL COMMENT '门店ID',
    warehouse_id BIGINT COMMENT '出货仓库ID',
    cashier_id VARCHAR(50) NOT NULL COMMENT '收银员ID',
    customer_id BIGINT COMMENT '会员ID',
    
    -- 订单金额
    total_amount DECIMAL(15,2) NOT NULL COMMENT '订单总金额',
    discount_amount DECIMAL(15,2) DEFAULT 0 COMMENT '折扣金额',
    coupon_discount DECIMAL(15,2) DEFAULT 0 COMMENT '优惠券折扣',
    promotion_discount DECIMAL(15,2) DEFAULT 0 COMMENT '促销折扣',
    actual_amount DECIMAL(15,2) NOT NULL COMMENT '实收金额',
    change_amount DECIMAL(15,2) DEFAULT 0 COMMENT '找零金额',
    
    -- 支付信息
    payment_method ENUM('现金', '银行卡', '微信', '支付宝', '会员卡', '混合支付') DEFAULT '现金',
    payment_status ENUM('待支付', '已支付', '支付失败', '已退款') DEFAULT '待支付',
    paid_amount DECIMAL(15,2) DEFAULT 0 COMMENT '已支付金额',
    paid_time DATETIME COMMENT '支付时间',
    transaction_no VARCHAR(100) COMMENT '支付流水号',
    
    -- 订单状态
    order_status ENUM('草稿', '已确认', '已出库', '已完成', '已取消', '退货中') DEFAULT '草稿',
    source_type ENUM('POS', '小程序', 'APP', '网页') DEFAULT 'POS',
    
    -- 时间信息
    order_time DATETIME NOT NULL COMMENT '下单时间',
    confirm_time DATETIME COMMENT '确认时间',
    delivery_time DATETIME COMMENT '出库时间',
    complete_time DATETIME COMMENT '完成时间',
    cancel_time DATETIME COMMENT '取消时间',
    
    -- 退换货信息
    return_status ENUM('无退货', '部分退货', '全部退货') DEFAULT '无退货',
    return_amount DECIMAL(15,2) DEFAULT 0 COMMENT '退货金额',
    
    -- 备注信息
    customer_remark VARCHAR(500) COMMENT '客户备注',
    internal_remark VARCHAR(500) COMMENT '内部备注',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_order_no (order_no),
    INDEX idx_store_time (store_id, order_time),
    INDEX idx_customer (customer_id),
    INDEX idx_status (order_status),
    INDEX idx_payment_status (payment_status)
) COMMENT '销售订单主表';

-- 2. 销售订单明细表
CREATE TABLE sales_order_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    sku VARCHAR(100) NOT NULL COMMENT '商品SKU',
    product_name VARCHAR(200) NOT NULL COMMENT '商品名称',
    unit VARCHAR(20) NOT NULL COMMENT '单位',
    spec VARCHAR(200) COMMENT '规格',
    
    -- 价格信息
    original_price DECIMAL(10,2) NOT NULL COMMENT '原价',
    sale_price DECIMAL(10,2) NOT NULL COMMENT '销售单价',
    discount_rate DECIMAL(5,4) DEFAULT 1.0 COMMENT '折扣率',
    discount_amount DECIMAL(10,2) DEFAULT 0 COMMENT '折扣金额',
    actual_price DECIMAL(10,2) NOT NULL COMMENT '实际单价',
    
    -- 数量信息
    quantity DECIMAL(10,2) NOT NULL COMMENT '销售数量',
    returned_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '已退货数量',
    
    -- 金额信息
    subtotal_amount DECIMAL(15,2) NOT NULL COMMENT '小计金额',
    actual_subtotal DECIMAL(15,2) NOT NULL COMMENT '实际小计',
    
    -- 促销信息
    promotion_id BIGINT COMMENT '促销活动ID',
    promotion_type VARCHAR(50) COMMENT '促销类型',
    
    -- 成本信息(用于利润计算)
    cost_price DECIMAL(10,2) COMMENT '成本单价',
    total_cost DECIMAL(15,2) COMMENT '总成本',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (order_id) REFERENCES sales_orders(id) ON DELETE CASCADE,
    INDEX idx_order_product (order_id, product_id),
    INDEX idx_product (product_id)
) COMMENT '销售订单明细表';

-- 3. 促销活动表
CREATE TABLE promotions (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    promotion_no VARCHAR(50) NOT NULL UNIQUE COMMENT '促销编号',
    promotion_name VARCHAR(200) NOT NULL COMMENT '促销名称',
    promotion_type ENUM('折扣', '满减', '买赠', '套餐', '会员价') NOT NULL,
    
    -- 时间控制
    start_time DATETIME NOT NULL COMMENT '开始时间',
    end_time DATETIME NOT NULL COMMENT '结束时间',
    is_all_time BOOLEAN DEFAULT FALSE COMMENT '是否长期有效',
    
    -- 范围控制
    apply_scope ENUM('全部商品', '指定分类', '指定商品', '指定品牌') DEFAULT '全部商品',
    scope_values JSON COMMENT '范围值',
    
    -- 规则配置
    rule_config JSON NOT NULL COMMENT '规则配置',
    priority INT DEFAULT 0 COMMENT '优先级',
    
    -- 状态控制
    status ENUM('草稿', '进行中', '已结束', '已暂停') DEFAULT '草稿',
    approval_status ENUM('待审核', '审核通过', '审核驳回') DEFAULT '待审核',
    
    -- 效果统计
    total_orders INT DEFAULT 0 COMMENT '参与订单数',
    total_discount DECIMAL(15,2) DEFAULT 0 COMMENT '总优惠金额',
    
    created_by VARCHAR(50) NOT NULL,
    approved_by VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_promotion_no (promotion_no),
    INDEX idx_time_status (start_time, end_time, status)
) COMMENT '促销活动表';

-- 4. 优惠券表
CREATE TABLE coupons (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    coupon_no VARCHAR(50) NOT NULL UNIQUE COMMENT '券编号',
    coupon_name VARCHAR(200) NOT NULL COMMENT '券名称',
    coupon_type ENUM('折扣券', '代金券', '满减券', '礼品券') NOT NULL,
    face_value DECIMAL(10,2) COMMENT '面值',
    discount_rate DECIMAL(5,4) COMMENT '折扣率',
    
    -- 使用条件
    use_threshold DECIMAL(10,2) COMMENT '使用门槛',
    applicable_scope ENUM('全部商品', '指定分类', '指定商品') DEFAULT '全部商品',
    scope_values JSON COMMENT '适用范围值',
    
    -- 时间控制
    start_time DATETIME NOT NULL COMMENT '开始时间',
    end_time DATETIME NOT NULL COMMENT '结束时间',
    valid_days INT COMMENT '有效天数',
    
    -- 发放控制
    total_quantity INT NOT NULL COMMENT '总发放数量',
    issued_quantity INT DEFAULT 0 COMMENT '已发放数量',
    used_quantity INT DEFAULT 0 COMMENT '已使用数量',
    limit_per_user INT DEFAULT 1 COMMENT '每人限领',
    
    -- 状态控制
    status ENUM('草稿', '进行中', '已结束', '已暂停') DEFAULT '草稿',
    
    created_by VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_coupon_no (coupon_no),
    INDEX idx_time_status (start_time, end_time, status)
) COMMENT '优惠券表';

-- 5. 用户优惠券表
CREATE TABLE customer_coupons (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    coupon_id BIGINT NOT NULL,
    customer_id BIGINT NOT NULL COMMENT '会员ID',
    coupon_no VARCHAR(50) NOT NULL COMMENT '券编号',
    
    -- 状态控制
    status ENUM('未使用', '已使用', '已过期', '已作废') DEFAULT '未使用',
    used_order_id BIGINT COMMENT '使用订单ID',
    used_time DATETIME COMMENT '使用时间',
    
    -- 有效期
    start_time DATETIME NOT NULL,
    end_time DATETIME NOT NULL,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (coupon_id) REFERENCES coupons(id),
    UNIQUE KEY uk_coupon_customer (coupon_id, customer_id),
    INDEX idx_customer_status (customer_id, status),
    INDEX idx_end_time (end_time)
) COMMENT '用户优惠券表';

-- 6. 退货单表
CREATE TABLE return_orders (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    return_no VARCHAR(50) NOT NULL UNIQUE COMMENT '退货单号',
    sales_order_id BIGINT NOT NULL COMMENT '原销售订单ID',
    store_id BIGINT NOT NULL COMMENT '门店ID',
    
    -- 退货信息
    return_type ENUM('退货', '换货') NOT NULL,
    return_reason ENUM('商品质量问题', '商品描述不符', '七天无理由', '其他') NOT NULL,
    return_status ENUM('待审核', '审核通过', '审核驳回', '已完成') DEFAULT '待审核',
    
    -- 金额信息
    total_return_amount DECIMAL(15,2) NOT NULL COMMENT '退货总金额',
    actual_return_amount DECIMAL(15,2) NOT NULL COMMENT '实际退款金额',
    
    -- 退款信息
    refund_method ENUM('原路退回', '现金', '银行卡', '会员卡') DEFAULT '原路退回',
    refund_status ENUM('待退款', '退款中', '已退款', '退款失败') DEFAULT '待退款',
    refund_time DATETIME COMMENT '退款时间',
    transaction_no VARCHAR(100) COMMENT '退款流水号',
    
    -- 审核信息
    applicant VARCHAR(50) NOT NULL COMMENT '申请人',
    applicant_time DATETIME NOT NULL,
    approver VARCHAR(50) COMMENT '审核人',
    approve_time DATETIME COMMENT '审核时间',
    approve_remark VARCHAR(500) COMMENT '审核备注',
    
    -- 完成信息
    complete_time DATETIME COMMENT '完成时间',
    complete_remark VARCHAR(500) COMMENT '完成备注',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (sales_order_id) REFERENCES sales_orders(id),
    INDEX idx_return_no (return_no),
    INDEX idx_sales_order (sales_order_id),
    INDEX idx_status (return_status)
) COMMENT '退货单表';

-- 7. 退货单明细表
CREATE TABLE return_order_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    return_order_id BIGINT NOT NULL,
    sales_order_item_id BIGINT NOT NULL COMMENT '原订单明细ID',
    product_id BIGINT NOT NULL,
    
    -- 退货信息
    return_quantity DECIMAL(10,2) NOT NULL COMMENT '退货数量',
    return_price DECIMAL(10,2) NOT NULL COMMENT '退货单价',
    return_amount DECIMAL(10,2) NOT NULL COMMENT '退货金额',
    
    -- 商品状态
    product_condition ENUM('完好', '轻微损坏', '严重损坏') DEFAULT '完好',
    is_resalable BOOLEAN DEFAULT TRUE COMMENT '是否可二次销售',
    
    -- 处理方式
    handling_method ENUM('退货入库', '换货出库', '报废处理') DEFAULT '退货入库',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (return_order_id) REFERENCES return_orders(id) ON DELETE CASCADE,
    FOREIGN KEY (sales_order_item_id) REFERENCES sales_order_items(id),
    INDEX idx_return_product (return_order_id, product_id)
) COMMENT '退货单明细表';

-- 8. 换货单表
CREATE TABLE exchange_orders (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    exchange_no VARCHAR(50) NOT NULL UNIQUE COMMENT '换货单号',
    return_order_id BIGINT NOT NULL COMMENT '关联退货单ID',
    sales_order_id BIGINT NOT NULL COMMENT '原销售订单ID',
    new_sales_order_id BIGINT COMMENT '新销售订单ID',
    
    -- 换货信息
    exchange_status ENUM('待处理', '已出库', '已完成') DEFAULT '待处理',
    exchange_reason VARCHAR(500) COMMENT '换货原因',
    
    -- 商品信息
    old_product_id BIGINT NOT NULL COMMENT '原商品ID',
    new_product_id BIGINT NOT NULL COMMENT '新商品ID',
    exchange_quantity DECIMAL(10,2) NOT NULL COMMENT '换货数量',
    
    -- 金额差异
    price_difference DECIMAL(10,2) DEFAULT 0 COMMENT '差价',
    price_difference_paid DECIMAL(10,2) DEFAULT 0 COMMENT '已补差价',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (return_order_id) REFERENCES return_orders(id),
    FOREIGN KEY (sales_order_id) REFERENCES sales_orders(id),
    INDEX idx_exchange_no (exchange_no)
) COMMENT '换货单表';

-- 9. 促销活动商品表
CREATE TABLE promotion_products (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    promotion_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    promotion_price DECIMAL(10,2) COMMENT '促销价',
    discount_rate DECIMAL(5,4) COMMENT '折扣率',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (promotion_id) REFERENCES promotions(id) ON DELETE CASCADE,
    UNIQUE KEY uk_promotion_product (promotion_id, product_id),
    INDEX idx_product (product_id)
) COMMENT '促销活动商品表';

-- 10. 销售支付记录表
CREATE TABLE sales_payments (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    sales_order_id BIGINT NOT NULL,
    payment_method ENUM('现金', '银行卡', '微信', '支付宝', '会员卡') NOT NULL,
    payment_amount DECIMAL(15,2) NOT NULL COMMENT '支付金额',
    transaction_no VARCHAR(100) COMMENT '交易流水号',
    payer_account VARCHAR(100) COMMENT '付款账户',
    payee_account VARCHAR(100) COMMENT '收款账户',
    payment_time DATETIME NOT NULL COMMENT '支付时间',
    payment_status ENUM('成功', '失败', '处理中') DEFAULT '成功',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (sales_order_id) REFERENCES sales_orders(id),
    INDEX idx_order_payment (sales_order_id, payment_method)
) COMMENT '销售支付记录表';

-- 11. 销售日结表
CREATE TABLE sales_daily_settlements (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    store_id BIGINT NOT NULL,
    settlement_date DATE NOT NULL COMMENT '结算日期',
    cashier_id VARCHAR(50) NOT NULL COMMENT '收银员ID',
    
    -- 订单统计
    total_orders INT DEFAULT 0 COMMENT '总订单数',
    total_sales_amount DECIMAL(15,2) DEFAULT 0 COMMENT '总销售额',
    total_discount_amount DECIMAL(15,2) DEFAULT 0 COMMENT '总折扣金额',
    total_actual_amount DECIMAL(15,2) DEFAULT 0 COMMENT '总实收金额',
    
    -- 支付方式统计
    cash_amount DECIMAL(15,2) DEFAULT 0 COMMENT '现金金额',
    card_amount DECIMAL(15,2) DEFAULT 0 COMMENT '银行卡金额',
    wechat_amount DECIMAL(15,2) DEFAULT 0 COMMENT '微信金额',
    alipay_amount DECIMAL(15,2) DEFAULT 0 COMMENT '支付宝金额',
    member_card_amount DECIMAL(15,2) DEFAULT 0 COMMENT '会员卡金额',
    
    -- 状态
    settlement_status ENUM('未结算', '已结算', '已审核') DEFAULT '未结算',
    settled_by VARCHAR(50) COMMENT '结算人',
    settled_time DATETIME COMMENT '结算时间',
    reviewed_by VARCHAR(50) COMMENT '审核人',
    reviewed_time DATETIME COMMENT '审核时间',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    UNIQUE KEY uk_store_settlement_date (store_id, settlement_date, cashier_id),
    INDEX idx_settlement_date (settlement_date)
) COMMENT '销售日结表';

三、销售域核心业务算法

1. 销售订单管理算法

销售订单创建算法:

text
输入:CreateSalesOrderRequest(门店、商品列表、客户信息等)、收银员ID
处理流程:
1. 生成唯一订单号(规则:SO+日期+序列)
2. 验证商品信息:
   - 调用商品域接口批量查询商品详情
   - 验证商品状态是否可售
   - 验证商品价格是否有效
3. 验证库存可用性:
   - 调用仓储域接口检查各商品库存
   - 库存不足时抛出异常
4. 计算订单金额:
   - 计算原始总金额 = ∑(商品原价 × 数量)
   - 应用促销活动计算促销折扣
   - 应用优惠券计算券折扣
   - 计算实收金额 = 原始总金额 - 促销折扣 - 券折扣
5. 创建销售订单主记录
6. 创建销售订单明细记录
7. 预留库存(调用仓储域接口)
8. 如果使用优惠券,更新优惠券状态
9. 返回创建的订单信息

订单支付完成算法:

text
输入:订单ID、PaymentRequest(支付方式、支付金额、流水号)
处理流程:
1. 验证订单存在且状态为待支付
2. 验证支付金额等于订单实收金额
3. 更新订单支付信息:
   - 支付状态更新为已支付
   - 记录支付方式和流水号
   - 记录支付时间
4. 更新订单状态为已确认
5. 记录支付记录
6. 发布销售订单完成事件
7. 返回更新后的订单信息

订单取消算法:

text
输入:订单ID、取消原因、操作人
处理流程:
1. 验证订单存在且状态可取消(不能是已完成状态)
2. 更新订单状态为已取消
3. 释放预留库存(调用仓储域接口)
4. 如果使用了优惠券,恢复优惠券状态
5. 记录取消操作日志

2. 促销管理算法

促销活动应用算法:

text
输入:订单商品列表、门店ID
处理流程:
1. 获取适用的促销活动:
   - 查询进行中的促销活动(当前时间在活动期内)
   - 按优先级排序
2. 逐条应用促销规则:
   - 折扣促销:计算商品折扣金额
   - 满减促销:检查订单金额是否达到门槛
   - 买赠促销:检查购买数量是否满足条件
   - 套餐促销:检查商品组合是否匹配
3. 计算总促销折扣金额
4. 记录应用的促销活动信息
5. 返回促销结果(折扣金额、应用的促销列表)

优惠券验证算法:

text
输入:优惠券ID、客户ID、订单金额
处理流程:
1. 验证优惠券存在且有效:
   - 检查优惠券状态为进行中
   - 检查使用时间在有效期内
   - 检查客户是否已领取该优惠券
2. 验证使用条件:
   - 检查订单金额是否达到使用门槛
   - 检查商品是否在适用范围内
3. 计算优惠金额:
   - 折扣券:订单金额 × 折扣率
   - 代金券:直接使用面值
   - 满减券:满足条件时减固定金额
4. 返回优惠券验证结果和优惠金额

3. 退货管理算法

退货单创建算法:

text
输入:CreateReturnOrderRequest(原订单ID、退货商品、退货原因等)、申请人
处理流程:
1. 验证原订单存在且可退货
2. 验证退货商品:
   - 商品必须在原订单中存在
   - 退货数量不能超过可退数量(原购买数量 - 已退货数量)
3. 生成唯一退货单号
4. 计算退货金额:
   - 按原销售单价计算退货金额
   - 考虑商品完好程度调整金额
5. 创建退货单主记录
6. 创建退货单明细记录
7. 返回创建的退货单信息

退货审核算法:

text
输入:退货单ID、审核结果、审核意见、审核人
处理流程:
1. 验证退货单存在且状态为待审核
2. 更新审核状态和审核信息
3. 如果审核通过:
   - 执行退款操作
   - 更新库存(调用仓储域接口)
   - 恢复优惠券(如果适用)
4. 记录审核操作日志
5. 返回更新后的退货单信息

退货完成算法:

text
输入:退货单ID、完成备注、操作人
处理流程:
1. 验证退货单存在且状态为审核通过
2. 更新退货单状态为已完成
3. 更新原订单退货状态和退货金额
4. 发布销售退货完成事件
5. 记录完成操作日志

4. 价格计算算法

订单金额计算算法:

text
输入:订单商品列表、促销活动、优惠券
处理流程:
1. 计算原始金额:
   - 商品小计 = 商品原价 × 数量
   - 订单原始金额 = ∑商品小计
2. 应用促销折扣:
   - 遍历适用的促销活动
   - 按促销规则计算折扣金额
   - 累计促销折扣总额
3. 应用优惠券折扣:
   - 验证优惠券适用性
   - 计算优惠券折扣金额
4. 计算实收金额:
   - 实收金额 = 原始金额 - 促销折扣 - 优惠券折扣
5. 返回金额计算结果

四、销售域事件处理算法

1. 事件发布算法

销售订单完成事件发布算法:

text
输入:销售订单信息
处理流程:
1. 构建事件对象:
   - 生成唯一事件ID
   - 封装订单关键信息(订单号、门店、仓库、客户、商品明细、金额)
2. 发送到Kafka销售订单完成主题
3. 记录事件发布日志

销售退货完成事件发布算法:

text
输入:退货单信息
处理流程:
1. 构建事件对象:
   - 生成唯一事件ID
   - 封装退货关键信息(退货单号、原订单、门店、退货商品、金额)
2. 发送到Kafka销售退货完成主题
3. 记录事件发布日志

优惠券使用事件发布算法:

text
输入:优惠券信息、订单信息
处理流程:
1. 构建事件对象:
   - 生成唯一事件ID
   - 封装优惠券使用信息(券号、客户、订单、优惠金额)
2. 发送到Kafka优惠券使用主题
3. 记录事件发布日志

2. 事件订阅处理算法

商品信息变更事件处理算法:

text
输入:ProductUpdatedEvent
处理流程:
1. 解析变更字段:
   - 如果是价格变更,更新促销活动中的商品价格
   - 如果是状态变更,检查促销活动的适用性
2. 清除相关商品缓存
3. 记录处理日志

商品状态变更事件处理算法:

text
输入:ProductStatusChangedEvent
处理流程:
1. 检查商品下架情况:
   - 如果商品下架,检查是否有进行中的促销活动包含该商品
   - 更新相关促销活动状态
2. 清除相关商品缓存
3. 记录处理日志

库存变更事件处理算法:

text
输入:InventoryUpdatedEvent
处理流程:
1. 更新本地库存缓存:
   - 商品ID + 仓库ID 作为缓存键
   - 设置较短的过期时间(5分钟)
2. 影响库存校验结果
3. 记录处理日志

五、销售域与其他域的交互

1. 与商品域的交互

商品信息查询算法:

text
输入:商品ID列表
处理流程:
1. 检查本地缓存:
   - 使用商品ID作为缓存键
   - 缓存命中直接返回
2. 缓存未命中时调用商品域批量查询接口
3. 验证商品状态(是否可售)
4. 返回商品信息映射

商品价格查询算法:

text
输入:商品ID
处理流程:
1. 检查促销价格:
   - 查询当前有效的促销活动
   - 获取商品的促销价格
2. 如果没有促销价格,使用商品默认售价
3. 返回最终销售价格

2. 与仓储域的交互

库存校验算法:

text
输入:商品ID、仓库ID、需求数量
处理流程:
1. 检查本地库存缓存
2. 缓存未命中时调用仓储域库存查询接口
3. 比较可用库存和需求数量
4. 返回库存是否充足的验证结果

库存预留算法:

text
输入:订单ID、商品预留列表(商品ID、仓库ID、数量)
处理流程:
1. 调用仓储域库存预留接口
2. 处理预留结果:
   - 成功:记录预留信息
   - 失败:抛出库存不足异常
3. 返回预留结果

3. 与财务域的交互

收入数据提供:

text
通过事件提供:
- 销售订单完成事件:提供销售收入数据
- 销售退货完成事件:提供退货冲减数据
- 优惠券使用事件:提供促销费用数据

数据内容:
- 订单/退货的金额信息
- 商品成本和利润数据
- 促销和优惠券折扣信息

六、销售域缓存策略算法

1. 多级缓存设计

商品信息缓存算法:

text
缓存键:sales:product:{商品ID}
缓存值:商品基本信息(名称、价格、状态等)
过期时间:1小时
更新策略:
- 商品变更事件触发缓存清除
- 缓存未命中时从商品域加载

库存信息缓存算法:

text
缓存键:sales:inventory:{商品ID}:{仓库ID}
缓存值:可用库存数量
过期时间:5分钟
更新策略:
- 库存变更事件触发缓存更新
- 主动刷新保证数据及时性

促销活动缓存算法:

text
缓存键:sales:promotion:active
缓存值:当前有效的促销活动列表
过期时间:10分钟
更新策略:
- 促销状态变更时清除缓存
- 定时刷新活动列表

2. 缓存一致性保障

订单创建时的缓存更新:

text
处理流程:
1. 成功创建订单后:
   - 更新相关商品的库存缓存
   - 更新促销活动的使用统计
2. 如果使用优惠券:
   - 更新优惠券状态缓存
3. 记录缓存更新日志

退货处理时的缓存更新:

text
处理流程:
1. 完成退货后:
   - 更新相关商品的库存缓存
   - 更新订单的退货状态缓存
2. 如果恢复优惠券:
   - 更新优惠券状态缓存
3. 记录缓存更新日志

七、销售域业务规则

1. 状态流转规则

text
销售订单状态流转:
草稿 → 已确认 → 已出库 → 已完成
       ↓
     已取消

退货单状态流转:
待审核 → 审核通过 → 已完成
       ↓
     审核驳回

2. 价格计算规则

text
订单金额计算:
原始金额 = ∑(商品原价 × 数量)
促销折扣 = ∑各促销活动折扣金额
优惠券折扣 = 优惠券面值或比例折扣
实收金额 = 原始金额 - 促销折扣 - 优惠券折扣

3. 库存校验规则

text
库存预留规则:
- 创建订单时预留库存
- 支付成功后扣减库存
- 订单取消时释放预留
- 退货时恢复库存

4. 退货规则

text
退货条件:
- 商品在退货期内(如7天内)
- 商品完好可二次销售
- 提供原始购买凭证
- 部分商品不支持退货

八、销售域配置参数

1. 业务参数配置

yaml
sales:
  order:
    auto-cancel-minutes: 30    # 未支付订单自动取消时间
    max-return-days: 7         # 最大退货天数
    default-warehouse: 1       # 默认出货仓库
  promotion:
    max-priority: 100          # 最大优先级
    overlap-allowed: false     # 是否允许促销叠加
    auto-apply: true           # 是否自动应用促销
  cache:
    product-expire-minutes: 60
    inventory-expire-minutes: 5
    promotion-expire-minutes: 10

2. 事件配置

yaml
kafka:
  topics:
    sales-order-completed: sales.order.completed
    sales-return-completed: sales.return.completed
    coupon-used: sales.coupon.used
    promotion-applied: sales.promotion.applied

总结

销售域的核心价值

  1. 完整的销售流程:从订单创建到支付完成的全流程管理

  2. 灵活的促销体系:支持多种促销类型和复杂的促销规则

  3. 完善的退换货:完整的退货、换货、退款流程

  4. 实时库存校验:与仓储域实时交互,确保库存准确性

  5. 事件驱动架构:通过领域事件与其他域解耦协作

  6. 高性能设计:多级缓存支撑高并发销售场景

与上下游域的协同

  • 对商品域:依赖商品基础信息和价格数据

  • 对仓储域:实时库存校验和预留管理

  • 对财务域:提供销售收入和成本数据

  • 对会员域:客户信息和优惠券管理

关键技术特性

  • 缓存优化:多级缓存减少外部调用

  • 事务一致性:保证销售流程的数据一致性

  • 促销引擎:灵活的促销规则计算

  • 实时交互:与各域的实时数据同步

通过这套设计,销售域能够支撑商超复杂的销售业务需求,为前端销售提供稳定可靠的服务,同时保证系统的可扩展性和可维护性。

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