一、采购域的核心职责与业务边界

1. 业务定位

采购域作为采购业务处理中心,负责管理供应商、采购计划、采购订单、进货验收等核心采购流程,确保商品供应及时、成本可控,同时为财务域提供应付账款数据。

2. 核心职责

  • 供应商管理:供应商准入、评估、分级管理

  • 采购计划管理:自动补货计划、采购需求计划

  • 采购订单管理:订单创建、审批、状态跟踪

  • 进货验收管理:到货验收、质量检验、入库确认

  • 预付款管理:预付款申请、核销、跟踪

  • 供应商对账:月度对账、差异处理、付款计划

  • 采购分析:供应商绩效、采购成本分析

二、采购域表结构ER设计

核心表关系图

sql
-- 核心表清单(简化字段说明)
CREATE TABLE suppliers (供应商主表);
CREATE TABLE supplier_products (供应商商品关系表);
CREATE TABLE purchase_plans (采购计划表);
CREATE TABLE purchase_plan_items (采购计划明细表);
CREATE TABLE purchase_orders (采购订单表);
CREATE TABLE purchase_order_items (采购订单明细表);
CREATE TABLE purchase_prepayments (采购预付款表);
CREATE TABLE prepayment_writeoff_records (预付款核销记录表);
CREATE TABLE purchase_acceptances (采购验收单表);
CREATE TABLE purchase_acceptance_items (采购验收明细表);
CREATE TABLE supplier_statements (供应商对账单表);
CREATE TABLE supplier_statement_items (对账明细表);
CREATE TABLE purchase_returns (采购退货单表);
CREATE TABLE purchase_return_items (采购退货明细表);
采购域数据库建表语句
sql
-- 创建采购域数据库
CREATE DATABASE purchase_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE purchase_db;

-- 1. 供应商表
CREATE TABLE suppliers (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    supplier_code VARCHAR(50) NOT NULL UNIQUE COMMENT '供应商编码',
    supplier_name VARCHAR(200) NOT NULL COMMENT '供应商名称',
    supplier_type ENUM('生产商', '代理商', '批发商', '个体户') DEFAULT '生产商',
    
    -- 联系信息
    contact_person VARCHAR(100) COMMENT '联系人',
    contact_phone VARCHAR(20) COMMENT '联系电话',
    contact_email VARCHAR(100) COMMENT '联系邮箱',
    address VARCHAR(500) COMMENT '地址',
    
    -- 财务信息
    bank_account VARCHAR(100) COMMENT '银行账户',
    bank_name VARCHAR(100) COMMENT '开户行',
    tax_number VARCHAR(100) COMMENT '税号',
    settlement_method ENUM('货到付款', '月结', '预付') DEFAULT '月结',
    settlement_days INT DEFAULT 30 COMMENT '结算周期(天)',
    credit_limit DECIMAL(15,2) COMMENT '信用额度',
    
    -- 业务信息
    lead_time INT COMMENT '交货周期(天)',
    min_order_amount DECIMAL(15,2) COMMENT '最小订单金额',
    quality_rating DECIMAL(3,2) COMMENT '质量评分',
    delivery_rating DECIMAL(3,2) COMMENT '交货评分',
    service_rating DECIMAL(3,2) COMMENT '服务评分',
    
    -- 状态控制
    status ENUM('草稿', '已审核', '已停用') DEFAULT '草稿',
    approval_status ENUM('待审核', '审核通过', '审核驳回') DEFAULT '待审核',
    blacklist_reason VARCHAR(500) COMMENT '黑名单原因',
    
    -- 审计字段
    created_by VARCHAR(50) NOT NULL,
    updated_by VARCHAR(50),
    approved_by VARCHAR(50),
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_supplier_code (supplier_code),
    INDEX idx_supplier_name (supplier_name),
    INDEX idx_status (status)
) COMMENT '供应商主表';

-- 2. 供应商商品表
CREATE TABLE supplier_products (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    supplier_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    
    -- 供应商商品信息
    supplier_product_code VARCHAR(100) COMMENT '供应商商品编码',
    supplier_product_name VARCHAR(200) COMMENT '供应商商品名称',
    supplier_spec VARCHAR(200) COMMENT '供应商规格',
    supplier_unit VARCHAR(20) COMMENT '供应商单位',
    
    -- 采购信息
    purchase_price DECIMAL(10,4) NOT NULL COMMENT '采购单价',
    min_order_quantity DECIMAL(10,2) COMMENT '最小起订量',
    pack_quantity DECIMAL(10,2) COMMENT '包装数量',
    delivery_days INT COMMENT '交货天数',
    
    -- 状态控制
    is_primary BOOLEAN DEFAULT FALSE COMMENT '是否主供应商',
    is_active BOOLEAN DEFAULT TRUE,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id) ON DELETE CASCADE,
    UNIQUE KEY uk_supplier_product (supplier_id, product_id),
    INDEX idx_product (product_id),
    INDEX idx_supplier (supplier_id)
) COMMENT '供应商商品关系表';

-- 3. 采购计划表
CREATE TABLE purchase_plans (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    plan_no VARCHAR(50) NOT NULL UNIQUE COMMENT '计划编号',
    plan_name VARCHAR(200) NOT NULL COMMENT '计划名称',
    plan_type ENUM('自动补货', '需求计划', '紧急采购') DEFAULT '自动补货',
    
    -- 计划信息
    plan_date DATE NOT NULL COMMENT '计划日期',
    plan_period ENUM('', '', '', '季度') DEFAULT '',
    warehouse_id BIGINT NOT NULL COMMENT '到货仓库',
    
    -- 状态控制
    plan_status ENUM('草稿', '已审核', '执行中', '已完成', '已取消') DEFAULT '草稿',
    approval_status ENUM('待审核', '审核通过', '审核驳回') DEFAULT '待审核',
    
    -- 金额统计
    total_amount DECIMAL(15,2) DEFAULT 0 COMMENT '计划总金额',
    executed_amount 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_plan_no (plan_no),
    INDEX idx_plan_date (plan_date),
    INDEX idx_status (plan_status)
) COMMENT '采购计划表';

-- 4. 采购计划明细表
CREATE TABLE purchase_plan_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    plan_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    
    -- 计划信息
    planned_quantity DECIMAL(10,2) NOT NULL COMMENT '计划数量',
    suggested_supplier_id BIGINT COMMENT '建议供应商',
    estimated_price DECIMAL(10,4) COMMENT '预估单价',
    estimated_amount DECIMAL(15,2) COMMENT '预估金额',
    
    -- 执行信息
    executed_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '已执行数量',
    pending_quantity DECIMAL(10,2) NOT NULL COMMENT '待执行数量',
    
    -- 需求信息
    safety_stock_quantity DECIMAL(10,2) COMMENT '安全库存',
    current_stock_quantity DECIMAL(10,2) COMMENT '当前库存',
    average_daily_sales DECIMAL(10,2) COMMENT '日均销量',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (plan_id) REFERENCES purchase_plans(id) ON DELETE CASCADE,
    INDEX idx_plan_product (plan_id, product_id)
) COMMENT '采购计划明细表';

-- 5. 采购订单表
CREATE TABLE purchase_orders (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_no VARCHAR(50) NOT NULL UNIQUE COMMENT '订单编号',
    supplier_id BIGINT NOT NULL,
    warehouse_id BIGINT NOT NULL COMMENT '到货仓库',
    
    -- 订单信息
    order_type ENUM('计划采购', '紧急采购', '补货采购') DEFAULT '计划采购',
    order_date DATE NOT NULL COMMENT '订单日期',
    expected_delivery_date DATE COMMENT '预计交货日期',
    
    -- 金额信息
    total_amount DECIMAL(15,2) NOT NULL COMMENT '订单总金额',
    tax_amount DECIMAL(15,2) DEFAULT 0 COMMENT '税费',
    discount_amount DECIMAL(15,2) DEFAULT 0 COMMENT '折扣金额',
    actual_amount DECIMAL(15,2) NOT NULL COMMENT '实际金额',
    
    -- 状态控制
    order_status ENUM('草稿', '待审核', '已审核', '已发货', '部分到货', '已完成', '已取消') DEFAULT '草稿',
    approval_status ENUM('待审核', '审核通过', '审核驳回') DEFAULT '待审核',
    payment_status ENUM('未付款', '部分付款', '已付款') DEFAULT '未付款',
    
    -- 物流信息
    shipping_method VARCHAR(100) COMMENT '运输方式',
    tracking_number VARCHAR(100) COMMENT '物流单号',
    freight_amount DECIMAL(10,2) DEFAULT 0 COMMENT '运费',
    
    -- 验收信息
    total_quantity DECIMAL(12,2) DEFAULT 0 COMMENT '总数量',
    received_quantity DECIMAL(12,2) DEFAULT 0 COMMENT '已收货数量',
    accepted_quantity DECIMAL(12,2) DEFAULT 0 COMMENT '合格数量',
    rejected_quantity DECIMAL(12,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,
    
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id),
    INDEX idx_order_no (order_no),
    INDEX idx_supplier (supplier_id),
    INDEX idx_status (order_status),
    INDEX idx_delivery_date (expected_delivery_date)
) COMMENT '采购订单表';

-- 6. 采购订单明细表
CREATE TABLE purchase_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 '规格',
    
    -- 采购信息
    order_quantity DECIMAL(10,2) NOT NULL COMMENT '订购数量',
    purchase_price DECIMAL(10,4) NOT NULL COMMENT '采购单价',
    tax_rate DECIMAL(5,4) DEFAULT 0.13 COMMENT '税率',
    
    -- 金额信息
    subtotal_amount DECIMAL(15,2) NOT NULL COMMENT '小计金额',
    tax_subtotal DECIMAL(15,2) COMMENT '税费小计',
    
    -- 收货信息
    received_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '已收货数量',
    accepted_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '合格数量',
    rejected_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '不合格数量',
    pending_quantity DECIMAL(10,2) NOT NULL COMMENT '待收货数量',
    
    -- 计划关联
    plan_item_id BIGINT COMMENT '关联计划明细ID',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (order_id) REFERENCES purchase_orders(id) ON DELETE CASCADE,
    INDEX idx_order_product (order_id, product_id),
    INDEX idx_product (product_id)
) COMMENT '采购订单明细表';

-- 7. 采购预付款表
CREATE TABLE purchase_prepayments (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    prepayment_no VARCHAR(50) NOT NULL UNIQUE COMMENT '预付款编号',
    supplier_id BIGINT NOT NULL,
    purchase_order_id BIGINT COMMENT '关联采购订单',
    
    -- 付款信息
    prepayment_amount DECIMAL(15,2) NOT NULL COMMENT '预付款金额',
    paid_amount DECIMAL(15,2) DEFAULT 0 COMMENT '已付金额',
    prepayment_reason VARCHAR(500) NOT NULL COMMENT '预付款原因',
    
    -- 状态控制
    prepayment_status ENUM('待支付', '部分支付', '已支付', '已核销', '已取消') DEFAULT '待支付',
    payment_status ENUM('待支付', '支付中', '支付成功', '支付失败') DEFAULT '待支付',
    
    -- 支付信息
    payment_method ENUM('银行转账', '现金', '支票') DEFAULT '银行转账',
    bank_account VARCHAR(100) COMMENT '收款账户',
    payment_time DATETIME COMMENT '支付时间',
    transaction_no VARCHAR(100) COMMENT '交易流水号',
    
    -- 核销信息
    written_off_amount DECIMAL(15,2) DEFAULT 0 COMMENT '已核销金额',
    pending_writeoff_amount DECIMAL(15,2) NOT NULL COMMENT '待核销金额',
    
    -- 审计字段
    created_by VARCHAR(50) NOT NULL,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id),
    FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id),
    INDEX idx_prepayment_no (prepayment_no),
    INDEX idx_supplier (supplier_id),
    INDEX idx_status (prepayment_status)
) COMMENT '采购预付款表';

-- 8. 预付款核销记录表
CREATE TABLE prepayment_writeoff_records (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    prepayment_id BIGINT NOT NULL,
    purchase_order_id BIGINT NOT NULL,
    
    -- 核销信息
    writeoff_amount DECIMAL(15,2) NOT NULL COMMENT '核销金额',
    writeoff_time DATETIME NOT NULL COMMENT '核销时间',
    writeoff_remark VARCHAR(500) COMMENT '核销备注',
    
    created_by VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (prepayment_id) REFERENCES purchase_prepayments(id),
    FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id),
    INDEX idx_prepayment (prepayment_id),
    INDEX idx_order (purchase_order_id)
) COMMENT '预付款核销记录表';

-- 9. 采购验收单表
CREATE TABLE purchase_acceptances (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    acceptance_no VARCHAR(50) NOT NULL UNIQUE COMMENT '验收单号',
    purchase_order_id BIGINT NOT NULL,
    warehouse_id BIGINT NOT NULL,
    
    -- 验收信息
    acceptance_date DATE NOT NULL COMMENT '验收日期',
    acceptance_type ENUM('正常验收', '退货验收', '换货验收') DEFAULT '正常验收',
    acceptance_status ENUM('待验收', '验收中', '部分验收', '已完成', '已取消') DEFAULT '待验收',
    
    -- 数量统计
    total_quantity DECIMAL(12,2) DEFAULT 0 COMMENT '总数量',
    accepted_quantity DECIMAL(12,2) DEFAULT 0 COMMENT '合格数量',
    rejected_quantity DECIMAL(12,2) DEFAULT 0 COMMENT '不合格数量',
    
    -- 金额统计
    total_amount DECIMAL(15,2) DEFAULT 0 COMMENT '总金额',
    accepted_amount DECIMAL(15,2) DEFAULT 0 COMMENT '合格金额',
    
    -- 质量信息
    quality_inspector VARCHAR(50) COMMENT '质检员',
    inspection_result ENUM('合格', '不合格', '部分合格') DEFAULT '合格',
    inspection_remark VARCHAR(500) COMMENT '质检备注',
    
    -- 审计字段
    created_by VARCHAR(50) NOT NULL,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id),
    INDEX idx_acceptance_no (acceptance_no),
    INDEX idx_order (purchase_order_id),
    INDEX idx_status (acceptance_status)
) COMMENT '采购验收单表';

-- 10. 采购验收明细表
CREATE TABLE purchase_acceptance_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    acceptance_id BIGINT NOT NULL,
    order_item_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    
    -- 验收信息
    acceptance_quantity DECIMAL(10,2) NOT NULL COMMENT '验收数量',
    accepted_quantity DECIMAL(10,2) NOT NULL COMMENT '合格数量',
    rejected_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '不合格数量',
    rejection_reason ENUM('质量问题', '数量不符', '规格不符', '包装破损', '其他') COMMENT '不合格原因',
    
    -- 价格信息
    purchase_price DECIMAL(10,4) NOT NULL COMMENT '采购单价',
    accepted_amount DECIMAL(15,2) NOT NULL COMMENT '合格金额',
    
    -- 批次信息
    batch_no VARCHAR(100) COMMENT '批次号',
    production_date DATE COMMENT '生产日期',
    expiry_date DATE COMMENT '有效期至',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (acceptance_id) REFERENCES purchase_acceptances(id) ON DELETE CASCADE,
    FOREIGN KEY (order_item_id) REFERENCES purchase_order_items(id),
    INDEX idx_acceptance_product (acceptance_id, product_id)
) COMMENT '采购验收明细表';

-- 11. 供应商对账单表
CREATE TABLE supplier_statements (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    statement_no VARCHAR(50) NOT NULL UNIQUE COMMENT '对账单号',
    supplier_id BIGINT NOT NULL,
    
    -- 对账信息
    statement_date DATE NOT NULL COMMENT '对账日期',
    statement_period_start DATE NOT NULL COMMENT '对账期间开始',
    statement_period_end DATE NOT NULL COMMENT '对账期间结束',
    statement_status ENUM('待确认', '已确认', '有差异', '已完成') DEFAULT '待确认',
    
    -- 金额信息
    total_purchase_amount DECIMAL(15,2) DEFAULT 0 COMMENT '采购总金额',
    total_paid_amount DECIMAL(15,2) DEFAULT 0 COMMENT '已付总金额',
    total_prepayment_amount DECIMAL(15,2) DEFAULT 0 COMMENT '预付款金额',
    total_pending_amount DECIMAL(15,2) DEFAULT 0 COMMENT '待付总金额',
    
    -- 差异处理
    discrepancy_amount DECIMAL(15,2) DEFAULT 0 COMMENT '差异金额',
    discrepancy_reason VARCHAR(500) COMMENT '差异原因',
    resolution_status ENUM('未处理', '处理中', '已解决') DEFAULT '未处理',
    
    -- 确认信息
    confirmed_by VARCHAR(50) COMMENT '确认人',
    confirmed_time DATETIME COMMENT '确认时间',
    supplier_confirmed BOOLEAN DEFAULT FALSE COMMENT '供应商是否确认',
    
    created_by VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id),
    INDEX idx_statement_no (statement_no),
    INDEX idx_supplier_period (supplier_id, statement_period_start, statement_period_end)
) COMMENT '供应商对账单表';

-- 12. 对账明细表
CREATE TABLE supplier_statement_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    statement_id BIGINT NOT NULL,
    purchase_order_id BIGINT NOT NULL,
    acceptance_id BIGINT NOT NULL,
    
    -- 明细信息
    purchase_amount DECIMAL(15,2) NOT NULL COMMENT '采购金额',
    paid_amount DECIMAL(15,2) DEFAULT 0 COMMENT '已付金额',
    pending_amount DECIMAL(15,2) NOT NULL COMMENT '待付金额',
    
    -- 状态
    reconciliation_status ENUM('已对账', '有差异', '待核实') DEFAULT '已对账',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (statement_id) REFERENCES supplier_statements(id) ON DELETE CASCADE,
    FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id),
    FOREIGN KEY (acceptance_id) REFERENCES purchase_acceptances(id),
    INDEX idx_statement_order (statement_id, purchase_order_id)
) COMMENT '对账明细表';

-- 13. 采购退货单表
CREATE TABLE purchase_returns (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    return_no VARCHAR(50) NOT NULL UNIQUE COMMENT '退货单号',
    purchase_order_id BIGINT NOT NULL,
    acceptance_id BIGINT NOT NULL,
    supplier_id BIGINT NOT NULL,
    
    -- 退货信息
    return_date DATE NOT NULL COMMENT '退货日期',
    return_reason ENUM('质量问题', '数量超收', '规格不符', '其他') NOT NULL,
    return_status ENUM('待审核', '已审核', '已出库', '已完成', '已取消') DEFAULT '待审核',
    
    -- 金额信息
    total_return_amount DECIMAL(15,2) NOT NULL COMMENT '退货总金额',
    total_return_quantity DECIMAL(12,2) NOT NULL COMMENT '退货总数量',
    
    -- 物流信息
    return_shipping_method VARCHAR(100) COMMENT '退货运输方式',
    return_tracking_number VARCHAR(100) COMMENT '退货物流单号',
    
    -- 审计字段
    created_by VARCHAR(50) NOT NULL,
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id),
    FOREIGN KEY (acceptance_id) REFERENCES purchase_acceptances(id),
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id),
    INDEX idx_return_no (return_no),
    INDEX idx_supplier (supplier_id)
) COMMENT '采购退货单表';

-- 14. 采购退货明细表
CREATE TABLE purchase_return_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    return_id BIGINT NOT NULL,
    acceptance_item_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    
    -- 退货信息
    return_quantity DECIMAL(10,2) NOT NULL COMMENT '退货数量',
    return_price DECIMAL(10,4) NOT NULL COMMENT '退货单价',
    return_amount DECIMAL(15,2) NOT NULL COMMENT '退货金额',
    return_reason_detail VARCHAR(500) COMMENT '退货原因详情',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (return_id) REFERENCES purchase_returns(id) ON DELETE CASCADE,
    FOREIGN KEY (acceptance_item_id) REFERENCES purchase_acceptance_items(id),
    INDEX idx_return_product (return_id, product_id)
) COMMENT '采购退货明细表';

-- 15. 供应商评估记录表
CREATE TABLE supplier_evaluations (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    supplier_id BIGINT NOT NULL,
    evaluation_date DATE NOT NULL COMMENT '评估日期',
    evaluation_period_start DATE NOT NULL COMMENT '评估期间开始',
    evaluation_period_end DATE NOT NULL COMMENT '评估期间结束',
    
    -- 评分信息
    quality_score DECIMAL(3,2) COMMENT '质量评分',
    delivery_score DECIMAL(3,2) COMMENT '交货评分',
    service_score DECIMAL(3,2) COMMENT '服务评分',
    price_score DECIMAL(3,2) COMMENT '价格评分',
    overall_score DECIMAL(3,2) COMMENT '综合评分',
    
    -- 统计信息
    total_orders INT DEFAULT 0 COMMENT '总订单数',
    on_time_delivery_rate DECIMAL(5,4) COMMENT '准时交货率',
    quality_pass_rate DECIMAL(5,4) COMMENT '质量合格率',
    total_purchase_amount DECIMAL(15,2) DEFAULT 0 COMMENT '采购总额',
    
    -- 评价信息
    evaluation_comment TEXT COMMENT '评价意见',
    improvement_suggestions TEXT COMMENT '改进建议',
    evaluator VARCHAR(50) NOT NULL COMMENT '评估人',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id),
    INDEX idx_supplier_evaluation (supplier_id, evaluation_date)
) COMMENT '供应商评估记录表';

-- 16. 采购价格历史表
CREATE TABLE purchase_price_history (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    supplier_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    
    -- 价格信息
    old_price DECIMAL(10,4) COMMENT '原价格',
    new_price DECIMAL(10,4) NOT NULL COMMENT '新价格',
    effective_date DATE NOT NULL COMMENT '生效日期',
    
    -- 变更信息
    change_reason ENUM('调价', '促销', '成本变动', '新供应商') DEFAULT '调价',
    change_remark VARCHAR(500) COMMENT '变更备注',
    
    created_by VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id),
    INDEX idx_supplier_product (supplier_id, product_id),
    INDEX idx_effective_date (effective_date)
) COMMENT '采购价格历史表';
表关系说明
核心业务表关系
供应商管理:suppliers ← supplier_products ← purchase_price_history

采购计划:purchase_plans ← purchase_plan_items

采购执行:purchase_orders ← purchase_order_items

验收管理:purchase_acceptances ← purchase_acceptance_items

预付款管理:purchase_prepayments ← prepayment_writeoff_records

退货管理:purchase_returns ← purchase_return_items

对账管理:supplier_statements ← supplier_statement_items

关键外键关系
supplier_products.supplier_id → suppliers.id

purchase_orders.supplier_id → suppliers.id

purchase_order_items.order_id → purchase_orders.id

purchase_acceptances.purchase_order_id → purchase_orders.id

purchase_acceptance_items.acceptance_id → purchase_acceptances.id

purchase_prepayments.supplier_id → suppliers.id

supplier_statements.supplier_id → suppliers.id

索引优化策略
业务编号字段建立唯一索引

状态字段建立普通索引

日期字段建立索引支持范围查询

供应商+商品组合字段建立联合索引

外键字段建立索引提升关联查询性能

这套表结构设计支持采购域完整的业务流程,包括供应商管理、采购计划、订单执行、验收管理、预付款处理、退货管理和供应商对账等核心功能。

三、采购域事件设计与发布

1. 采购域事件定义

  • PurchaseOrderCreatedEvent:采购订单创建事件

  • PurchaseAcceptanceCompletedEvent:采购验收完成事件

  • PurchasePrepaymentPaidEvent:预付款支付事件

  • PurchaseReturnCompletedEvent:采购退货完成事件

2. 事件发布核心算法

采购订单创建事件发布算法:

text
输入:采购订单数据
输出:PurchaseOrderCreatedEvent

1. 构建订单商品列表
2. 计算订单总金额
3. 生成唯一事件ID
4. 封装事件对象(订单号、供应商、仓库、商品明细、金额)
5. 发送至Kafka采购订单主题

采购验收完成事件发布算法:

text
输入:验收单数据
输出:PurchaseAcceptanceCompletedEvent

1. 构建验收商品列表(含批次信息)
2. 计算验收总金额
3. 生成唯一事件ID
4. 封装事件对象(验收单号、采购订单、仓库、验收明细、金额)
5. 发送至Kafka采购验收主题

四、采购域核心业务服务

1. 采购订单服务核心算法

创建采购订单算法:

text
输入:采购订单请求、创建人
输出:采购订单

1. 验证供应商状态(必须为已审核状态)
2. 生成唯一订单号(PO+日期+序列)
3. 验证商品信息(调用商品域接口)
4. 验证供应商商品关系(供应商必须提供该商品)
5. 计算订单金额:
   - 小计金额 = ∑(采购单价 × 数量)
   - 税费 = ∑(小计金额 × 税率)
   - 实际金额 = 小计金额 + 税费 - 折扣
6. 创建采购订单主记录
7. 保存订单明细记录
8. 发布采购订单创建事件

审核采购订单算法:

text
输入:订单ID、审核结果、审核备注、审核人
输出:更新后的采购订单

1. 验证订单状态(必须为待审核)
2. 更新审核状态和订单状态
3. 记录审核人和审核时间
4. 如果审核驳回,更新订单状态为已取消

2. 采购验收服务核心算法

创建验收单算法:

text
输入:验收请求、创建人
输出:采购验收单

1. 验证采购订单状态(必须为已发货)
2. 生成唯一验收单号
3. 验证验收商品:
   - 商品必须在采购订单中存在
   - 验收数量 ≤ 订单未收货数量
4. 创建验收单主记录
5. 保存验收明细记录
6. 更新采购订单收货数量
7. 更新订单明细收货状态

完成验收算法:

text
输入:验收单ID、质检员、备注
输出:更新后的验收单

1. 验证验收单状态(必须为验收中)
2. 计算验收统计:
   - 总数量 = ∑验收数量
   - 合格数量 = ∑合格数量
   - 不合格数量 = ∑不合格数量
   - 合格金额 = ∑(合格数量 × 采购单价)
3. 判断验收结果:
   - 全部合格 → 合格
   - 全部不合格 → 不合格
   - 部分合格 → 部分合格
4. 更新验收单状态为已完成
5. 发布采购验收完成事件
6. 检查采购订单是否全部完成

3. 预付款服务核心算法

创建预付款算法:

text
输入:预付款请求、创建人
输出:采购预付款

1. 验证供应商有效性
2. 验证采购订单(如果关联)
3. 生成唯一预付款编号
4. 创建预付款记录
5. 初始化核销金额为0,待核销金额等于预付款金额

预付款核销算法:

text
输入:预付款ID、采购订单ID、核销金额、核销人
输出:核销记录

1. 验证预付款状态(必须为已支付)
2. 验证核销金额 ≤ 预付款待核销金额
3. 创建核销记录
4. 更新预付款:
   - 已核销金额 += 核销金额
   - 待核销金额 -= 核销金额
5. 如果待核销金额=0,更新预付款状态为已核销

4. 供应商对账核心算法

生成对账单算法:

text
输入:供应商ID、对账期间
输出:供应商对账单

1. 查询对账期间内的采购验收单
2. 查询对账期间内的采购退货单
3. 查询对账期间内的预付款记录
4. 计算:
   - 采购总金额 = ∑验收金额
   - 退货总金额 = ∑退货金额
   - 净采购金额 = 采购总金额 - 退货总金额
   - 已付金额 = ∑已付款金额
   - 待付金额 = 净采购金额 - 已付金额
5. 生成对账单和明细记录

对账差异处理算法:

text
输入:对账单ID、差异金额、差异原因
输出:更新后的对账单

1. 记录差异金额和原因
2. 更新对账单状态为有差异
3. 生成差异处理任务
4. 通知相关人员处理

五、采购计划与补货算法

1. 自动补货计划生成算法

text
输入:商品ID、仓库ID
输出:建议采购数量

1. 获取商品安全库存、当前库存、日均销量
2. 计算库存覆盖天数 = 当前库存 / 日均销量
3. 获取供应商交货周期
4. 计算建议采购数量:
   IF 库存覆盖天数 < 安全库存天数 THEN
       采购数量 = (安全库存天数 × 日均销量) - 当前库存 + 缓冲库存
   ELSE
       采购数量 = 0
   END IF
5. 考虑最小起订量和包装数量约束

2. 供应商选择算法

text
输入:商品ID、采购数量
输出:推荐供应商

1. 获取可供应该商品的所有供应商
2. 对供应商进行评分:
   综合评分 = 质量评分 × 权重 + 交货评分 × 权重 + 价格评分 × 权重
3. 考虑因素:
   - 采购价格
   - 交货周期
   - 历史质量表现
   - 供应商等级
   - 当前合作关系
4. 选择综合评分最高的供应商

六、采购域与其他域的交互

1. 事件订阅处理

  • 商品信息变更事件:更新供应商商品价格信息

  • 库存变更事件:更新库存数据用于采购计划

  • 组织架构变更事件:更新仓库、部门信息

2. 外部域服务调用

商品信息查询算法:

text
输入:商品ID列表
输出:商品信息映射

1. 检查本地缓存
2. 缓存未命中时调用商品域批量查询接口
3. 验证商品状态(是否下架)
4. 返回商品基础信息

库存信息查询算法:

text
输入:商品ID、仓库ID
输出:可用库存数量

1. 检查本地缓存(短时间有效期)
2. 缓存未命中时调用仓储域库存查询接口
3. 返回实时库存数量

七、采购域业务规则

1. 状态流转规则

text
采购订单状态流转:
草稿 → 待审核 → 已审核 → 已发货 → 部分到货 → 已完成
        ↓
       已取消

验收单状态流转:
待验收 → 验收中 → 已完成

2. 金额计算规则

text
订单金额计算:
小计金额 = ∑(采购单价 × 数量)
税费 = ∑(小计金额 × 税率)
实际金额 = 小计金额 + 税费 - 折扣

验收金额计算:
合格金额 = ∑(合格数量 × 采购单价)

3. 业务验证规则

text
创建采购订单验证:
- 供应商状态必须为已审核
- 商品必须由该供应商提供
- 采购数量必须 ≥ 最小起订量

创建验收单验证:
- 采购订单必须为已发货状态
- 验收数量必须 ≤ 订单未收货数量
- 同一商品不能重复验收

八、采购域配置管理

1. 业务参数配置

yaml
purchase:
  order:
    auto-approve: false           # 是否自动审核
    max-approval-amount: 100000   # 最大审批金额
  acceptance:
    quality-threshold: 0.95       # 质量合格阈值
    auto-complete: true           # 是否自动完成验收
  prepayment:
    require-approval: true        # 预付款是否需要审批
    max-prepayment-rate: 0.3      # 最大预付比例
  supplier:
    evaluation-period: 30         # 供应商评估周期
    blacklist-days: 90            # 黑名单期限

2. 缓存策略

  • 供应商信息:缓存1小时

  • 商品信息:缓存30分钟

  • 库存信息:缓存5分钟

  • 采购价格:缓存2小时

总结

采购域通过完整的供应商管理、采购计划、订单管理、验收管理、预付款管理和对账管理,实现了采购业务的全面数字化管理。核心算法围绕状态流转、金额计算、业务验证和智能决策,确保采购流程的规范性和效率。通过事件驱动架构与其他域解耦协作,为整个进销存系统提供稳定可靠的商品供应保障。

 posted on 2025-10-22 17:17  xibuhaohao  阅读(5)  评论(0)    收藏  举报