返回作品

订货单生成系统

创建于 2026 年 3 月 18 日

标签
  • Java 17
  • Spring Boot 4
  • MyBatis
  • MySQL
  • Redis
  • Apache POI
  • Vue 2
  • Element UI

项目介绍

这是一套为连锁便利店「定期订货」场景定制的订货建议生成系统,基于若依 RuoYi v3.9.1(Spring Boot 4.x / JDK 17 分支)深度定制。业务的痛点是:每个网点、每件商品都要在订货周期内决定「订多少」,纯靠人工翻销量、查库存效率低且容易漏订、超订。系统给出的解法很直接——把业务方日常维护的「便利店订货目录、库存表、销售表」三份 Excel 原样导入,再按一条可配置的订货规则批量算出每个网点每个商品的建议订货量,业务人员在页面上微调后导出成订货 Excel 即可。

业务规则在 SQL 注释里写得非常明确:新品推量、活动品推量都是固定值;常规品的建议量 = 本月日均销量 × 常规品系数 − 现有库存;同时给常规品设了一个「调整上限」= 本月日均销量 × 订货周期 × 默认调整系数,防止业务人员把订货量调得过离谱。商品的「标注」(新品/活动品/常规品)从导入的原始标注文本(raw_mark)归一化而来,落到 mark_type 字段(0 常规品、1 新品、2 活动品、3 其他),是否可订货也由目录中的订货状态决定。值得注意的是,当前版本刻意不做「订货单落库」——生成结果只做页面调整与导出,数据库只保留规则表加三张 Excel 对应表,保持最小闭环。

项目架构

项目沿用若依标准多模块结构:ruoyi-admin(Web 入口与 Controller)、ruoyi-system(业务)、ruoyi-framework(框架)、ruoyi-common(通用)、ruoyi-quartz(定时任务)、ruoyi-generator(代码生成器)与 ruoyi-ui(前端)。技术栈为 Java 17、Spring Boot 4.0.3(Jakarta 命名空间)、Spring Security + JWT、Redis、MyBatis、Druid 1.2.28、Apache POI 4.1.2;前端是 Vue 2.6.12 + Element UI 2.15.14 + Vuex + Vue Router + Axios。

订货业务集中在 com.ruoyi.ordering 包内:Controller 层有 DhRecommendController(导入、生成、导出三个动作)与规则配置、商品目录等管理接口;Service 层核心是 DhRecommendServiceImpl,负责 Excel 解析(表头映射、日期/数值容错解析、逐行错误收集)、库存与销售按「省|地市|网点|商品编码」聚合、建议量计算与导出数据构建。前端在 views/ordering 下有 config(订货参数)、goods(商品目录)、import(数据导入)、recommend(订货建议)、store(门店)、template(导出模板)等页面,其中 recommend/index.vue 是核心业务页,以 Tab 形式组织「导入入库」与「订货建议」两大块。

数据库侧,sql/ry_20250522.sql 为若依基础表脚本,dh_20260318.sql 建 4 张业务表:dh_recommend_config(订货规则配置)、dh_goods(商品目录)、dh_inventory_snapshot(库存快照)、dh_sales_daily(销售日报),库存与销售表以「营业日+省+地市+网点+商品编码」建唯一键保证重复导入幂等,并配套查询索引;dh_menu_dict_20260318.sql 初始化「订货模块」目录下的订货参数配置、订货管理两个菜单及对应的 ordering:* 按钮权限点。doc/ 目录里附带了三份示例 Excel 和一份《订货模块代码生成与表单设计》设计文档。

核心功能

  • 三类 Excel 导入入库:订货建议页顶部提供商品目录、库存、销售三个上传入口,支持拖拽上传 .xls/.xlsx,后端用 POI 解析后批量 upsert。解析器会做表头必需列校验、日期与数字格式容错、空行跳过,坏行不会中断导入,而是收集为行级错误并汇总展示(如”已跳过 N 行错误数据:第 3 行的’库存数量’格式不正确”)。
  • 订货规则配置dh_recommend_config 维护多套规则,字段包括新品推量、活动品推量、订货周期天数、常规品系数、默认调整系数与启停状态;生成时按 configId 选择规则,也可临时传入调整系数覆盖默认值。
  • 双模式生成建议:生成页支持「Excel 直传」——再次上传三份 Excel 现场解析直接生成结果(不落库);也支持「数据库取数」——选定库存业务日期与销售日期范围,从已导入的库存表、销售表取数生成。取数模式对无数据日期会给出明确报错。
  • 建议明细与页内调整:结果表逐网点逐商品展示现有库存、本月销量、销售天数、日均销量、系统建议量、最大可调量,业务人员可手工输入调整后订货量(前端实时校验不可超过最大可调量);支持按网点、商品编码、商品名称与标注(新品/活动品/常规品)筛选,并统计新品、活动品、常规品各自的行数。
  • 订货建议导出:点击导出时后端 buildExportItems 会对常规品逐条重算最大可调量并校验调整后量不超上限,超限直接拒绝导出并指出具体商品,校验通过后按若依 ExcelUtil 导出为「订货建议数据」Excel;导入、生成、导出动作均受 ordering:import:*ordering:recommend:generateordering:recommend:export 等权限点控制。

功能截图

暂无运行截图。

快速上手

数据库侧按顺序执行:sql/ry_20250522.sql 初始化若依基础表(含菜单权限基础数据),再执行 sql/dh_20260318.sql 建业务表并初始化默认订货规则,最后执行 sql/dh_menu_dict_20260318.sql 注册订货模块菜单与权限;sql/quartz.sql 为定时任务模块可选脚本。后端进入项目根目录,修改 ruoyi-admin 的数据库、Redis 配置后启动 RuoYiApplication,默认账号 admin / admin123,订货接口统一挂在 /ordering/* 前缀下(导入、生成、导出均为 POST)。

前端进入 ruoyi-ui 执行 npm installnpm run dev,登录后进入「订货模块 → 订货管理」。先用 doc/ 下的三份示例 Excel(便利店订货目录.xlsx、库存表.xlsx、销售表.xlsx)走一遍「导入入库」,再到「订货建议」页选择订货参数、调整系数与生成方式(Excel 直传或数据库取数),生成后在结果表里微调订货量并导出 Excel 验证全流程。

总结

这个项目的价值在于把「算订货量」这件本来靠业务经验的事,沉淀成了一条可解释、可配置、可审计的规则链:三份 Excel 原样进,按「新品/活动品固定推量、常规品按日均销量减库存」的规则批量算,再用「最大可调量」给人工微调兜底,最后导出订货 Excel。全程数据只增不改,规则表与三张业务表就是全部状态,简单直接;行级错误收集与幂等导入也让 Excel 导入这类脏数据场景足够健壮。

作为若依改造项目,它示范了一种典型做法:代码生成器先出 CRUD 骨架,再把核心页手工改造成「导入 → 生成 → 调整 → 导出」的业务流(doc 文档里明确记录了哪些表适合生成器、哪些表要手改)。后续可扩展的方向包括:生成结果落库形成订货单留痕、按门店/区域拆分配送单、引入历史订货准确率评估规则参数,以及把「最小起订量、箱装规格」纳入取整规则。