食堂采购系统源码数据库表结构与库存算法实现详解

简介: 本文详解食堂采购系统稳定性的核心:规范数据库结构(如goods、inventory、inventory_log三表协同)与强一致库存算法(乐观锁+流水驱动)。强调“库存是结果,流水是依据”,解决对账不准、超卖、负库存等顽疾,助你打造高并发、可商用的可靠系统。(239字)

很多食堂采购系统做不稳定,不是界面问题,而是底层数据结构和库存算法没设计好。
QQ20260119-152356.png

常见翻车现场你一定见过:

  • 库存经常对不上
  • 入库出库顺序混乱
  • 成本算不准
  • 多食堂同时扣库存直接变负数
  • 月底对账全靠人工补Excel

说白了:数据库结构不规范 + 库存算法太粗糙。

真正可商用的食堂采购系统源码,核心就两件事:

第一,表结构要可追溯
第二,库存算法要强一致

下面我用一套可直接落地的设计方案,把关键实现从表结构到代码完整拆开讲清楚。

一、核心业务流程梳理

先统一一个标准流程:

采购申请 → 采购单 → 入库 → 库存累加
领料/消耗 → 出库 → 库存扣减
盘点 → 差异调整
月底 → 成本核算 + 对账

所以数据库至少要支撑:

  • 供应商管理
  • 商品管理
  • 仓库管理
  • 采购入库
  • 出库领料
  • 实时库存
  • 库存流水

记住一句话:

库存 = 汇总结果
流水 = 真正依据

库存表只是“缓存”,库存流水才是“真相”。

二、核心数据库表结构设计

技术栈示例:

SpringBoot + MySQL + MyBatis

1 商品表 goods

CREATE TABLE goods (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  category_id BIGINT,
  unit VARCHAR(20),
  spec VARCHAR(100),
  enabled TINYINT DEFAULT 1,
  created_at DATETIME
);

作用:基础物料信息

示例:

  • 大米 50kg/袋
  • 鸡蛋 30枚/箱

2 供应商表 supplier

CREATE TABLE supplier (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(200),
  contact VARCHAR(50),
  phone VARCHAR(20),
  status TINYINT DEFAULT 1
);

3 仓库表 warehouse

CREATE TABLE warehouse (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100),
  location VARCHAR(200)
);

支持:

  • 主仓
  • 冷藏仓
  • 分校区仓库

4 库存表 inventory(实时库存)

高频查询表

CREATE TABLE inventory (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  goods_id BIGINT,
  warehouse_id BIGINT,
  quantity DECIMAL(10,2) DEFAULT 0,
  amount DECIMAL(12,2) DEFAULT 0,
  version INT DEFAULT 0,
  UNIQUE KEY uk_goods_wh(goods_id, warehouse_id)
);

关键字段:

  • quantity 当前数量
  • amount 总成本
  • version 乐观锁

5 库存流水表 inventory_log(核心)

这是最重要的一张表

CREATE TABLE inventory_log (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  goods_id BIGINT,
  warehouse_id BIGINT,
  type VARCHAR(20),
  quantity DECIMAL(10,2),
  price DECIMAL(10,2),
  amount DECIMAL(12,2),
  ref_no VARCHAR(50),
  created_at DATETIME
);

type:

  • IN 入库
  • OUT 出库
  • ADJUST 盘点调整

所有库存变化必须写这张表。
QQ20250910-114722.png

三、库存算法设计思路

很多人直接:

update inventory set quantity = quantity - 10

这种做法必出事故。

正确思路:

库存变更三步走:

① 写库存流水
② 扣减库存(带锁)
③ 校验结果

四、入库算法实现(加库存)

Service 实现

@Transactional
public void stockIn(Long goodsId, Long warehouseId,
                    BigDecimal qty, BigDecimal price) {
   

    BigDecimal amount = qty.multiply(price);

    // 1 写流水
    inventoryLogMapper.insert(new InventoryLog(
            goodsId, warehouseId, "IN", qty, price, amount
    ));

    // 2 更新库存
    inventoryMapper.addStock(goodsId, warehouseId, qty, amount);
}

Mapper SQL

UPDATE inventory
SET quantity = quantity + #{
   qty},
    amount = amount + #{
   amount},
    version = version + 1
WHERE goods_id = #{
   goodsId}
AND warehouse_id = #{
   warehouseId};

五、出库算法实现(防止超卖)

重点来了。

出库一定要防:

  • 并发扣减
  • 库存负数

推荐方案:

乐观锁 + 条件扣减

核心SQL

UPDATE inventory
SET quantity = quantity - #{
   qty},
    amount = amount - #{
   amount},
    version = version + 1
WHERE goods_id = #{
   goodsId}
AND warehouse_id = #{
   warehouseId}
AND quantity >= #{
   qty}
AND version = #{
   version};

如果影响行数为 0 → 扣减失败。

Java实现

@Transactional
public void stockOut(Long goodsId, Long warehouseId,
                     BigDecimal qty) {
   

    Inventory inv = inventoryMapper.select(goodsId, warehouseId);

    if (inv.getQuantity().compareTo(qty) < 0) {
   
        throw new RuntimeException("库存不足");
    }

    BigDecimal avgPrice =
            inv.getAmount().divide(inv.getQuantity(), 2, RoundingMode.HALF_UP);

    BigDecimal amount = avgPrice.multiply(qty);

    int rows = inventoryMapper.reduceStock(
            goodsId, warehouseId, qty, amount, inv.getVersion());

    if (rows == 0) {
   
        throw new RuntimeException("库存并发冲突,请重试");
    }

    inventoryLogMapper.insert(
            new InventoryLog(goodsId, warehouseId, "OUT", qty, avgPrice, amount)
    );
}

六、成本算法(加权平均法)

食堂场景推荐:

加权平均法

原因:

  • 计算简单
  • 实时成本准确
  • 不用复杂批次管理

公式:

新平均价 = (旧金额 + 入库金额) ÷ (旧数量 + 入库数量)

SQL 示例:

amount / quantity

直接算即可。

七、高并发优化建议

如果是多校区或集团食堂,订单并发高时:

必须加:

1 分库分表(按仓库拆)
2 Redis库存缓存
3 批量入库写入
4 异步流水日志

否则库存表会成为瓶颈。
QQ20260119-152406.png

八、总结一句实战经验

如果你正在做食堂采购系统源码,记住这三条铁律:

库存只查 inventory
对账只查 inventory_log
任何库存变化必须走事务

这样系统跑几年都不会乱。

真正商用级系统,拼的不是功能多,而是:

数据稳定 + 算法可靠 + 并发安全

底层打牢,上层再怎么扩展都不怕。

相关文章
|
9天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
6天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
4194 13
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
5天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
3300 9
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
8天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
6874 15
|
5天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
4445 4
|
3天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
2236 4
|
8天前
|
人工智能 JavaScript API
零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程
Clawdbot(Moltbot)是一款智能体AI助手,具备“手”(读写文件、执行代码)、“脚”(联网搜索、分析网页)和“脑”(接入Qwen/OpenAI等API或本地GPU模型)。本指南详解Windows下从Node.js环境搭建、一键安装到Token配置的全流程,助你快速部署本地AI助理。(239字)
4526 23
|
14天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
8270 12

热门文章

最新文章