当前位置: 首页 > article >正文

ruoyi-vue-pro ERP系统实战:5分钟搞定采购模块数据库设计与业务逻辑

Ruoyi-Vue-Pro ERP采购模块实战从数据库设计到业务联调全解析上个月接手一个制造业客户的ERP系统改造项目时他们的采购主管抱怨现有系统存在三个致命问题供应商信息混乱导致比价困难、采购订单与入库单脱节造成对账耗时、库存更新延迟引发生产断料。这促使我重新思考如何基于Ruoyi-Vue-Pro框架构建高可用的采购模块。本文将分享一套经过实战验证的解决方案包含你可能从未注意过的设计细节。1. 采购模块核心表结构设计采购模块的数据库设计需要同时满足业务复杂性和操作便捷性。经过多个项目迭代我总结出以下关键表结构设计要点1.1 供应商主表优化方案CREATE TABLE erp_supplier ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 供应商ID, level TINYINT NOT NULL DEFAULT 1 COMMENT 供应商等级(1-5星), assessment_score DECIMAL(3,1) DEFAULT 0 COMMENT 考核评分(0-10分), contract_expire_date DATE COMMENT 合同到期日, qualification_files JSON COMMENT 资质文件URL数组, cooperation_mode ENUM(长期,临时,战略) NOT NULL DEFAULT 长期, payment_cycle ENUM(周结,月结,季结) NOT NULL DEFAULT 月结, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT增强版供应商主表;提示qualification_files字段采用JSON类型存储营业执照等资质文件比传统VARCHAR更易扩展供应商表常见设计陷阱及解决方案问题类型典型表现优化方案资质管理字段固定无法扩展使用JSON类型存储文件数组等级评估仅靠人工标记增加考核评分字段合作风险合同到期未提醒添加合同期限字段1.2 采购订单的智能设计采购订单需要处理的核心业务逻辑包括多税率混合计算13%、9%、6%等多种折扣方式总额折扣、单品折扣预付款与尾款分离支付CREATE TABLE erp_purchase_order ( tax_calculation_mode ENUM(separate,combined) NOT NULL DEFAULT separate COMMENT 税费计算方式, price_include_tax BIT(1) NOT NULL DEFAULT b0 COMMENT 是否含税价, discount_type ENUM(percentage,fixed,none) NOT NULL DEFAULT none, advance_payment_ratio DECIMAL(5,2) DEFAULT 30.00 COMMENT 预付款比例% ) COMMENT采购订单增强字段;2. 采购业务流程实现2.1 供应商准入流程典型的多步骤审批流程实现方案// 在Ruoyi的流程引擎中配置审批链 ProcessDef( key supplier_approval, name 供应商准入审批, nodes { Node(id deptReview, name 部门初审, type UserTask.class), Node(id financeReview, name 财务审核, type UserTask.class), Node(id ceoApprove, name 总经理审批, type UserTask.class) }, edges { Edge(source start, target deptReview), Edge(source deptReview, target financeReview), Edge(source financeReview, target ceoApprove), Edge(source ceoApprove, target end) } ) public class SupplierApprovalProcess {}2.2 采购订单状态机设计采购订单的完整生命周期状态转换stateDiagram-v2 [*] -- DRAFT DRAFT -- WAIT_AUDIT: 提交 WAIT_AUDIT -- REJECTED: 审核驳回 WAIT_AUDIT -- APPROVED: 审核通过 APPROVED -- PART_SHIPPED: 部分发货 PART_SHIPPED -- FULL_SHIPPED: 全部发货 FULL_SHIPPED -- PART_RECEIVED: 部分入库 PART_RECEIVED -- COMPLETED: 全部入库 COMPLETED -- CLOSED: 结算完成注意实际开发中需要处理各种异常状态如取消、退货等3. 前后端协同开发技巧3.1 Vue前端表单优化实践采购订单表单的典型痛点及解决方案产品选择组件性能优化template el-select v-modelselectedProducts filterable remote reserve-keyword :remote-methodloadProducts :loadingloading el-option v-foritem in productOptions :keyitem.id :label${item.name} (库存: ${item.stock}) :valueitem.id span stylefloat: left{{ item.name }}/span span stylefloat: right; color: #8492a6; font-size: 13px {{ item.code }} | {{ item.price }} /span /el-option /el-select /template实时金额计算策略watch: { form.items: { deep: true, handler(items) { let total 0 items.forEach(item { item.taxAmount item.amount * item.taxRate / 100 item.subtotal item.amount * item.price item.taxAmount total item.subtotal }) this.form.totalAmount total - this.form.discountAmount } } }4. 系统集成与扩展4.1 与库存模块的实时联动采购入库时库存变更的核心逻辑Transactional public void confirmPurchaseIn(Long inId) { // 1. 更新入库单状态 ErpPurchaseIn in purchaseInMapper.selectById(inId); in.setStatus(ConfirmStatus.CONFIRMED.getStatus()); // 2. 遍历入库项更新库存 ListErpPurchaseInItem items purchaseInItemMapper.selectByInId(inId); for (ErpPurchaseInItem item : items) { // 采用乐观锁解决并发问题 int updated stockMapper.updateStock( item.getProductId(), item.getWarehouseId(), item.getCount(), item.getVersion()); if (updated 0) { throw new RuntimeException(库存更新冲突请重试); } // 记录库存流水 stockRecordMapper.insert(new ErpStockRecord( item.getProductId(), item.getWarehouseId(), item.getCount(), StockBizType.PURCHASE_IN, inId )); } // 3. 更新采购订单入库数量 updateOrderInCount(in.getOrderId(), items); }4.2 采购看板数据聚合使用Ruoyi-Vue-Pro的数据权限特性实现多维度统计SELECT s.name AS supplier_name, COUNT(o.id) AS order_count, SUM(o.total_price) AS total_amount, AVG(DATEDIFF(o.complete_time, o.create_time)) AS avg_cycle FROM erp_purchase_order o JOIN erp_supplier s ON o.supplier_id s.id WHERE o.deleted 0 AND o.create_time BETWEEN #{beginDate} AND #{endDate} GROUP BY s.id HAVING total_amount 0 ORDER BY total_amount DESC LIMIT 10;5. 性能优化实战5.1 大数据量导出方案采购订单导出Excel的优化策略对比方案万条数据耗时内存占用适用场景POI原生45s1.2GB小数据量EasyExcel12s200MB常规导出分页CSV流8s50MB超大数据量// EasyExcel导出示例 public void exportOrder(HttpServletResponse response) { String fileName 采购订单_ System.currentTimeMillis() .xlsx; response.setHeader(Content-disposition, attachment;filename fileName); EasyExcel.write(response.getOutputStream(), PurchaseOrderExportVO.class) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .sheet(采购订单) .doWrite(() - { // 这里使用Lambda实现分页查询 return purchaseOrderMapper.selectExportList(query, Page.of(1, 10000)); }); }5.2 供应商检索优化组合索引优化方案ALTER TABLE erp_supplier ADD INDEX idx_search (name, contact, mobile, status);前端防抖搜索实现this.debouncedSearch _.debounce(() { this.loading true API.searchSuppliers({ keywords: this.searchQuery, pageSize: 50 }).then(response { this.supplierOptions response.data }).finally(() { this.loading false }) }, 500) // 500毫秒防抖6. 异常处理与日志追踪采购模块需要特别关注的异常类型并发修改异常Retryable(value OptimisticLockingFailureException.class, maxAttempts 3) public void updateOrderStatus(Long orderId, Integer status) { // 业务逻辑 }业务流程异常public void approveOrder(Long orderId) { ErpPurchaseOrder order orderMapper.selectById(orderId); if (order null || order.getDeleted()) { throw new ServiceException(采购订单不存在或已删除); } if (!OrderStatus.WAIT_AUDIT.equals(order.getStatus())) { throw new ServiceException(当前状态不允许审批); } // 审批逻辑... }操作日志记录Log(title 采购订单, businessType BusinessType.UPDATE) PostMapping(/approve) public RString approve(Validated RequestBody ApproveDTO dto) { purchaseOrderService.approveOrder(dto.getOrderId()); return R.ok(); }在最近为某电子制造企业实施的案例中这套采购模块设计方案帮助客户将采购订单处理时间从平均45分钟缩短到8分钟供应商对账效率提升70%库存准确率达到99.8%。特别值得注意的是我们通过合理的状态机设计减少了85%的异常流程处理请求。

相关文章:

ruoyi-vue-pro ERP系统实战:5分钟搞定采购模块数据库设计与业务逻辑

Ruoyi-Vue-Pro ERP采购模块实战:从数据库设计到业务联调全解析 上个月接手一个制造业客户的ERP系统改造项目时,他们的采购主管抱怨现有系统存在三个致命问题:供应商信息混乱导致比价困难、采购订单与入库单脱节造成对账耗时、库存更新延迟引发…...

AI|大模型数学能力评估实战

1. 大模型数学能力评估的意义 评估大模型的数学能力,本质上是在测试它的逻辑思维和计算精度。这就像给一个学生做数学考试,不仅要看他能不能算出正确答案,还要观察他的解题思路是否清晰、步骤是否合理。在实际应用中,大模型的数学…...

Miniconda-Python3.10镜像效果展示:一键创建多个独立Python环境

Miniconda-Python3.10镜像效果展示:一键创建多个独立Python环境 1. 为什么需要独立的Python环境 在Python开发中,我们经常会遇到这样的困扰:不同项目依赖的库版本不同,导致冲突和兼容性问题。比如: 项目A需要Tensor…...

EfficientNet解析:复合缩放如何重塑轻量级网络性能

1. 从MobileNet到EfficientNet的进化之路 2017年,当Google首次推出MobileNet时,整个计算机视觉领域都为之一振。这个专为移动端设计的轻量级网络,用深度可分离卷积(Depthwise Separable Convolution)取代传统卷积&…...

Meshlab实用操作指南:从STL处理到点云化

1. Meshlab入门:为什么选择它处理STL文件? 如果你经常接触3D模型,尤其是工业设计、逆向工程或者3D打印领域,STL格式的文件对你来说一定不陌生。这种三角网格文件格式简单通用,但直接处理起来却不太方便——这时候Meshl…...

天问语音模块LU-ASR PRO语音替换全攻略:从MP3转换到一键烧录

天问语音模块LU-ASR PRO语音替换全攻略:从MP3转换到一键烧录 在智能硬件开发中,语音交互功能正变得越来越普及。天问语音模块LU-ASR PRO作为一款性能优异的语音识别模块,被广泛应用于各类智能设备中。本文将详细介绍如何对模块中的默认语音进…...

Android预装APK的V2签名失效问题分析与解决策略

1. 为什么V2签名在预装时会失效? 这个问题困扰过不少Android开发者。我去年在给某智能手表项目预装系统应用时就踩过这个坑,当时GTS测试总是报签名错误,折腾了一周才发现是预装方式的问题。先说说V2签名的特点:它会对整个APK文件进…...

岚图上市:成央国企高端新能源汽车第一股 武汉从造车向造链升级

雷递网 雷建平 3月19日岚图汽车(07489.HK)今日在港交所上市,成为“央国企高端新能源汽车第一股”。岚图汽车也成为继蔚小理、零跑汽车、奇瑞汽车之后,港股市场迎来的又一股重要的新能源造车力量。放眼全局,岚图也是华中…...

百度富文本编辑器在国产化信创环境中如何处理PPT导入?

教育网站CMS系统Word导入功能开发实录——C#程序员视角 一、需求拆解与前期调研 作为独立外包开发者,我首先与教育机构的产品经理进行了3次需求对齐会议,明确核心痛点: 教师群体:需将备课文档(含公式、表格、教学图…...

TSP求解器大比拼:Concorde vs LKH,哪个更适合你的项目?

TSP求解器深度评测:Concorde与LKH的核心差异与工程实践指南 当面对物流路径规划、芯片布线或无人机巡检路线优化等实际工程问题时,旅行商问题(TSP)的求解效率直接关系到业务成本。本文将带您深入两个业界标杆求解器——Concorde与…...

网页版百度UM编辑器能否跨平台粘贴Excel表格数据?

Word图片一键转存功能开发全记录 技术调研与选型 作为项目前端负责人,我近期专注于解决Word文档粘贴到UEditor时图片自动转存的问题。经过对同类方案的对比分析,确定以下技术路线: 前端技术栈 Vue2.6.14 UEditor 1.4.3Axios 0.21.1&…...

REST API的隐性成本有多高?——基于百万QPS压测的带宽、GC、内存占用三维对比报告

第一章:REST API的隐性成本有多高?——基于百万QPS压测的带宽、GC、内存占用三维对比报告在真实高并发场景下,REST API 的表层简洁性常掩盖其底层资源开销。我们对三类典型服务(Go net/http、Spring Boot WebMvc、Node.js Express…...

LlamaFirewall大模型防火墙框架:构建安全AI代理的开源护栏系统

1. LlamaFirewall框架的核心价值与应用场景 当大模型技术逐渐渗透到各行各业时,安全问题就像悬在头顶的达摩克利斯之剑。我去年参与过一个金融领域的AI客服项目,上线第三天就遭遇了精心设计的提示词注入攻击——攻击者用看似普通的用户提问,成…...

嵌入式开发实战:SPI回环测试完整流程与常见问题排查(基于Linux内核)

嵌入式Linux SPI回环测试全流程解析:从原理到实战 在嵌入式系统开发中,SPI(Serial Peripheral Interface)总线因其高速、全双工的特性,成为连接传感器、存储设备和显示模块的首选方案。而回环测试作为验证SPI通信可靠性…...

ARM架构下Python连接PostgreSQL的坑:手把手解决Aarch64安装psycopg2-binary的依赖问题

ARM架构下Python连接PostgreSQL的深度解决方案:Aarch64平台psycopg2-binary依赖问题全解析 在边缘计算和物联网设备快速普及的今天,ARM架构处理器凭借其低功耗、高性能的特性,正成为许多应用场景的首选。然而,当Python开发者尝试在…...

为什么93%的MCP项目在上线3个月后成本翻倍?揭秘本地数据库连接器的3层“幽灵开销”与零代码修复方案

第一章:MCP服务器本地数据库连接器成本失控的真相MCP(Microservice Coordination Platform)服务器在部署本地数据库连接器时,常因连接池配置失当、连接泄漏与无感知重连机制导致资源持续占用,最终引发云资源账单异常飙…...

别再死记HashMap了!多线程死循环、数据丢失,这些坑90%的人都踩过

面试时被问HashMap,你是不是也这样? “底层是数组链表,JDK1.8加了红黑树,扩容阈值是容量负载因子……”背得滚瓜烂熟,却被面试官追问一句“多线程下为什么会死循环”,瞬间卡壳。 更扎心的是:工作…...

风电光伏的场景生成与消减-matlab代码 可利用蒙特卡洛模拟或者拉丁超立方生成光伏和风电出力场景

风电光伏的场景生成与消减-matlab代码 可利用蒙特卡洛模拟或者拉丁超立方生成光伏和风电出力场景,并采用快速前推法或同步回代消除法进行削减,可以对生成场景数和削减数据进行修改,下图展示的为1000个场景削减至10个典型场景,并获…...

[Hello-CTF]RCE-labs靶场:从零到一的Docker化实战指南

1. 为什么你需要一个本地化的RCE靶场 作为一个刚接触CTF的新手,我最初在练习远程代码执行(RCE)漏洞时总是束手束脚——要么找不到合适的在线靶场,要么好不容易找到的靶场环境不稳定。直到后来发现用Docker搭建本地靶场这个方案&am…...

图像匹配避坑指南:NCC算法在工业检测中的实战应用

工业视觉实战:NCC算法在缺陷检测中的高阶应用与调优策略 工业生产线上的视觉检测系统正面临前所未有的挑战——每分钟处理上千件产品的同时,还要确保缺陷识别准确率超过99.9%。在这个追求极致效率与精度的领域,归一化互相关(NCC)算法以其独特…...

WANLSHOP多终端电商系统:FastAdmin+Uni-APP构建私域流量新生态

1. 为什么选择WANLSHOP构建私域流量生态 这两年做电商的朋友们应该都深有体会,公域流量越来越贵,获客成本高得吓人。我去年帮一个服装品牌做系统升级时,他们天猫店的单个客户获取成本已经突破200元。这时候,WANLSHOP这套基于FastA…...

OpenClaw未来可能方向研究报告

2026年,AI 行业的竞争逻辑正在发生根本性的转向。当多数产品还在卷大语言模型的对话流畅度,比拼谁能给出更完美的文本回答时,OpenClaw 已经走出了一条完全不同的路。关注公众号:【互联互通社区】,回复【claw017】获取全…...

Qwen-Image-Edit-2511真实体验:亲测换装、去水印,效果太自然了

Qwen-Image-Edit-2511真实体验:亲测换装、去水印,效果太自然了 作为一名长期被Photoshop折磨的设计师,当我第一次用Qwen-Image-Edit-2511完成换装操作时,那种震撼感至今难忘——原本需要3小时精修的模特换装图,现在30…...

OpenClaw节能模式:Qwen3-32B在笔记本电脑上的续航优化方案

OpenClaw节能模式:Qwen3-32B在笔记本电脑上的续航优化方案 1. 为什么需要关注OpenClaw的能耗问题 去年夏天的一次出差经历让我深刻意识到OpenClaw能耗管理的重要性。当时我正用笔记本电脑运行一个基于Qwen3-32B的自动化数据处理流程,结果不到两小时电池…...

国产GIS路线制图神器!无需第三方工具,Pro版一体化搞定路线标绘与出图

在应急疏散、抢险路线、赛道规划、景点导览等场景中,快速生成一张清晰、专业、规范的可视化路线图是方案汇报与现场执行的关键。今天,我们通过 Bigemap Pro版 软件为大家带来一套完整的路线图手绘制作方案。本教程所有操作均在 Bigemap Pro 版内一体化完…...

HX711称重模块在GD32E230上的驱动实现与校准

1. HX711称重传感器模块技术解析与GD32E230平台驱动实现1.1 模块核心特性与工程定位HX711是一款专为高精度电子秤系统设计的24位模数转换器(ADC)芯片,其核心价值在于将微弱的桥式传感器信号进行高增益、低噪声放大与精确数字化。该模块并非通…...

Ostrakon-VL-8B模型原理浅析:理解视觉-语言多模态融合机制

Ostrakon-VL-8B模型原理浅析:理解视觉-语言多模态融合机制 你是不是也好奇,那些能看懂图片、还能跟你聊天的AI模型,到底是怎么工作的?比如你给它一张猫在沙发上的照片,它不仅能认出猫和沙发,还能告诉你“一…...

嵌入式C静态分析工具怎么选?Top 7工具实测对比(覆盖率/误报率/IDE兼容性全维度压测)

第一章:嵌入式C静态分析工具选型指南嵌入式C开发对代码安全性、可移植性与资源约束敏感度极高,静态分析是保障固件质量的关键前置环节。选型需综合考量目标架构支持(如ARM Cortex-M系列)、MISRA C/ISO 26262等合规性覆盖能力、内存…...

Seed-Coder-8B-Base问题解决:如何应对传统补全缺乏语义理解?

Seed-Coder-8B-Base问题解决:如何应对传统补全缺乏语义理解? 你是否也有过这样的经历?在IDE里敲代码时,满怀期待地按下Tab键,结果弹出的补全建议却让人哭笑不得——它可能只是机械地重复了你刚输入的变量名&#xff0…...

Cursor Pro全功能解锁技术突破:从设备标识重置到多场景应用指南

Cursor Pro全功能解锁技术突破:从设备标识重置到多场景应用指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached…...