【开源】JAVA+Vue+SpringBoot实现实验室耗材管理系统

本文主要是介绍【开源】JAVA+Vue+SpringBoot实现实验室耗材管理系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述


目录

  • 一、摘要
    • 1.1 项目介绍
    • 1.2 项目录屏
  • 二、功能模块
    • 2.1 耗材档案模块
    • 2.2 耗材入库模块
    • 2.3 耗材出库模块
    • 2.4 耗材申请模块
    • 2.5 耗材审核模块
  • 三、系统展示
  • 四、核心代码
    • 4.1 查询耗材品类
    • 4.2 查询资产出库清单
    • 4.3 资产出库
    • 4.4 查询入库单
    • 4.5 资产入库
  • 五、免责说明


一、摘要

1.1 项目介绍

基于JAVA+Vue+SpringBoot+MySQL的实验室耗材管理系统,包含了耗材档案模块、耗材入库模块、耗材出库模块、耗材申请模块、耗材审核模块和耗材图表模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,实验室耗材管理系统基于角色的访问控制,给管理员和耗材管理专员使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

1.2 项目录屏


二、功能模块

2.1 耗材档案模块

实验室耗材管理系统的耗材档案模块是用来管理和维护实验室中所有耗材的信息的模块。它可以帮助实验室管理人员有效地记录和跟踪实验室中的耗材信息,包括耗材的名称、规格、型号、供应商、采购日期、有效期、存放位置等。

实验室管理人员可以通过耗材档案模块将新购买的耗材信息录入系统中,包括耗材的基本信息和相关属性。实验室管理人员可以根据耗材的各种属性进行查询,快速定位和查找需要的耗材信息。耗材档案模块可以记录耗材的采购日期、供应商信息以及入库数量等,帮助管理人员对耗材进行合理的入库管理。当实验室需要使用某种耗材时,管理人员可以通过耗材档案模块进行出库操作,记录出库数量和使用目的等信息。

耗材档案模块可以实时统计和更新实验室中各种耗材的库存情况,提醒管理人员及时进行补充采购。当某种耗材过期或损坏无法使用时,可以通过耗材档案模块进行报废管理,记录报废原因和处理方式等信息。通过耗材档案模块,实验室管理人员可以更加方便地管理和控制实验室中的耗材,提高耗材的利用率和管理效率。

2.2 耗材入库模块

实验室耗材管理系统的耗材入库模块是用来记录和管理实验室中新购买的耗材入库信息的模块。实验室管理人员可以通过耗材入库模块将新购买的耗材信息录入系统中。包括耗材的名称、规格、型号、供应商、采购日期、有效期等基本信息。录入耗材信息时,还可以添加附加属性,如物料编号、批次号、条形码等。在录入耗材信息的同时,管理人员需要填写入库数量。系统会自动计算并更新库存数量,方便管理人员实时掌握实验室中各种耗材的库存情况。

耗材入库模块通常也包含供应商管理功能,可以记录供应商的联系信息、合作情况和评价等。在入库时,管理人员可以选择已经建立的供应商,并关联相应的耗材采购信息。耗材入库模块一般会生成入库单,用于记录每次耗材入库的详细信息,包括入库日期、供应商、采购单号、入库人等。管理人员可以根据入库单进行查询和统计,方便日后追溯和审核。有些实验室可能需要对入库的耗材进行质检。耗材入库模块可以提供相应的功能,管理人员可以记录质检结果、质检人员和质检日期等信息,确保入库的耗材符合实验室的质量要求。通过耗材入库模块,实验室管理人员可以方便地记录和管理实验室中新购买的耗材信息,及时更新库存数量,提高耗材管理的效率和准确性。

2.3 耗材出库模块

实验室耗材管理系统的耗材出库模块是用来记录和管理实验室中耗材的出库信息的模块。实验室管理人员可以通过耗材出库模块根据耗材的名称、规格、型号等信息进行查询,快速定位需要出库的耗材。管理人员可以通过耗材出库模块进行耗材的出库操作。在出库时,需要填写出库数量以及使用目的等相关信息。同时,系统会自动更新库存数量,确保库存信息的准确性。耗材出库模块一般会生成出库单,记录每次耗材出库的详细信息,包括出库日期、出库人、领用单位等。这些信息可以用于后续的追溯和审核。

耗材出库模块可以记录每次耗材的使用记录,包括使用人、使用日期、使用目的等。这样可以方便实验室管理人员对耗材的使用情况进行统计和分析。在耗材出库模块中,可以设置库存预警功能。当某种耗材的库存数量低于预设阈值时,系统会自动生成提醒通知,以便管理人员及时进行补充采购。通过耗材出库模块,实验室管理人员可以方便地记录和管理实验室中耗材的出库信息,及时更新库存数量,提高耗材管理的效率和准确性。

2.4 耗材申请模块

实验室耗材管理系统的耗材申请模块是用来方便实验室人员提交耗材申请并进行审批流程的模块。实验室内的人员可以通过耗材申请模块提交耗材的申请。在申请时,需要填写所需耗材的名称、数量、用途等相关信息。耗材申请模块一般会设计审批流程,包括申请人、审批人、审批顺序等。申请人提交耗材申请后,相应的审批人会收到通知,进行审批操作。系统会记录每个审批环节的处理情况,以便后续查询和追溯。耗材申请模块会根据用户的权限设置不同的审批权限。只有具有相应权限的人员才能进行审批操作,确保审批过程的安全性和准确性。

耗材申请模块会记录每次耗材申请的详细信息,包括申请日期、申请人、审批状态等。管理人员可以通过查询功能查看和统计申请记录,方便管理和掌握实验室内的耗材使用情况。耗材申请模块会通过系统消息或邮件等方式通知相关人员的申请状态和审批结果,提高沟通效率和及时性。通过耗材申请模块,实验室内的人员可以方便地提交耗材申请并进行审批流程,提高申请的准确性和效率。同时,管理人员可以更好地掌握和管理实验室的耗材使用情况。

2.5 耗材审核模块

实验室耗材管理系统的耗材审核模块是该系统中的一个重要部分,用于对实验室耗材的采购申请进行审核和管理。实验室成员可以通过系统向耗材审核模块提交耗材采购申请,包括所需耗材的名称、规格、数量、用途等信息。申请提交后,会自动生成一个申请单。申请单会经过一定的审核流程,根据实验室的设定,可以包括多级审核。审核人员可以对申请单进行审核、审批以及驳回操作。审核人员可以查看申请单的详细信息,包括耗材的具体需求和用途。

系统会记录每一次审核的结果和审核人的意见,以便后续查询和审计。审核记录可在系统中进行查看和导出,方便实验室管理人员进行数据分析和监控。系统可以通过邮件、短信等方式向相关人员发送审核结果的通知,提醒实验室成员耗材采购申请的进展情况。审核通过的耗材采购申请可以自动更新实验室的耗材库存信息,方便实验室管理人员进行库存管理和统计。

通过耗材审核模块,实验室可以实现对耗材采购申请的规范化、集中化管理,提高审核效率,减少人工操作和错误,确保实验室耗材的合理使用和供应链管理的准确性。


三、系统展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


四、核心代码

4.1 查询耗材品类

@ApiOperation(value = "查询耗材品类")
@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
public Result<IPage<AssetsType>> getByPage(@ModelAttribute AssetsType assetsType, @ModelAttribute PageVo page, @RequestParam(required = false) String natureType) {QueryWrapper<AssetsType> qw = new QueryWrapper<AssetsType>();if(StrUtil.isNotBlank(natureType)) {if(natureType.equals("1")){qw.eq("nature", "固定资产");}else{qw.eq("nature", "耗材");}}if(!ZwzNullUtils.isNull(assetsType.getNature())) {qw.eq("nature", assetsType.getNature());}if(!ZwzNullUtils.isNull(assetsType.getAssetName())) {qw.like("asset_name", assetsType.getAssetName());}return new ResultUtil<IPage<AssetsType>>().setData(iAssetsTypeService.page(PageUtil.initMpPage(page),qw));
}

4.2 查询资产出库清单

@ApiOperation(value = "查询资产出库清单")
@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
public Result<IPage<WarehouseOut>> getByPage(@ModelAttribute WarehouseOut warehouseOut, @ModelAttribute PageVo page){QueryWrapper<WarehouseOut> qw = new QueryWrapper<WarehouseOut>();if(!ZwzNullUtils.isNull(warehouseOut.getNature())) {qw.eq("nature", warehouseOut.getNature());}if(!ZwzNullUtils.isNull(warehouseOut.getAssetName())) {qw.like("asset_name", warehouseOut.getAssetName());}if(!ZwzNullUtils.isNull(warehouseOut.getRecipients())) {qw.like("recipients", warehouseOut.getRecipients());}IPage<WarehouseOut> data = iWarehouseOutService.page(PageUtil.initMpPage(page),qw);for (WarehouseOut wh : data.getRecords()) {AssetsType assetsType = iAssetsTypeService.getById(wh.getAssetId());double existnumber = Double.parseDouble(assetsType.getExistingNumber()) + Double.parseDouble(wh.getNumber());wh.setExistNumber("" + existnumber);}return new ResultUtil<IPage<WarehouseOut>>().setData(data);
}

4.3 资产出库

@ApiOperation(value = "资产出库")
@RequestMapping(value = "/insertOrUpdate", method = RequestMethod.POST)
public Result<WarehouseOut> saveOrUpdate(WarehouseOut warehouseOut){WarehouseOut oldWarehouseOut = iWarehouseOutService.getById(warehouseOut.getId());double oldNumber = 0.0;if(oldWarehouseOut != null){oldNumber = Double.parseDouble(oldWarehouseOut.getNumber());}// outNumber 要出库的数量double outNumber = Double.parseDouble(warehouseOut.getNumber());AssetsType oldAssetsType = iAssetsTypeService.getById(warehouseOut.getAssetId());if(oldAssetsType != null){// newNumber 出库后还有的数量 = 仓库原本还有的数量 - 出库单的出库数量 + 原有出库单的出库数量Double newNumber = Double.parseDouble(oldAssetsType.getExistingNumber()) - outNumber + oldNumber;if(newNumber >= 0){oldAssetsType.setExistingNumber(newNumber + "");iAssetsTypeService.saveOrUpdate(oldAssetsType);}else{return ResultUtil.error("手慢啦!库存不足!");}}if(ZwzNullUtils.isNull(warehouseOut.getId())) {warehouseOut.setAuditStatus(0);warehouseOut.setAuditTime("");}if(iWarehouseOutService.saveOrUpdate(warehouseOut)){return new ResultUtil<WarehouseOut>().setData(warehouseOut);}return ResultUtil.error();
}

4.4 查询入库单

@ApiOperation(value = "查询资产入库清单")
@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
public Result<IPage<Warehousing>> getByPage(@ModelAttribute Warehousing warehousing, @ModelAttribute PageVo page){QueryWrapper<Warehousing> qw = new QueryWrapper<Warehousing>();if(!ZwzNullUtils.isNull(warehousing.getNature())) {qw.eq("nature", warehousing.getNature());}if(!ZwzNullUtils.isNull(warehousing.getAssetName())) {qw.like("asset_name", warehousing.getAssetName());}if(!ZwzNullUtils.isNull(warehousing.getInvoice())) {qw.like("invoice", warehousing.getInvoice());}return new ResultUtil<IPage<Warehousing>>().setData(iWarehousingService.page(PageUtil.initMpPage(page),qw));
}

4.5 资产入库

@ApiOperation(value = "资产入库")
@RequestMapping(value = "/insertOrUpdate", method = RequestMethod.POST)
public Result<Warehousing> insertOrUpdate(Warehousing warehousing){Warehousing oldWarehousing = iWarehousingService.getById(warehousing.getId());double oldNumber = 0.0;if(oldWarehousing != null){oldNumber = oldWarehousing.getNumber() == null ? 0.0 : Double.parseDouble(oldWarehousing.getNumber());}// 入库,更新库存AssetsType assetsType = iAssetsTypeServicel.getById(warehousing.getAssetId());if(assetsType != null){// number = 现在仓库总数量 + 该入库单现增加数量 - 该入库单原有增加数量double number = Double.parseDouble(assetsType.getNumber()) + Double.parseDouble(warehousing.getNumber()) - oldNumber;assetsType.setNumber(number + "");assetsType.setTotalPrice((Double.parseDouble(assetsType.getUnitPrice()) * number) + "");// existNumber = 现在仓库存在数量 + 该入库单现增加数量 - 该入库单原有增加数量double existNumber = Double.parseDouble(assetsType.getExistingNumber()) + Double.parseDouble(warehousing.getNumber()) - oldNumber;if(existNumber < 0)  {return ResultUtil.error("入库数量大于已出库数量!");}assetsType.setExistingNumber(existNumber + "");iAssetsTypeServicel.saveOrUpdate(assetsType);}if(iWarehousingService.saveOrUpdate(warehousing)){return new ResultUtil<Warehousing>().setData(warehousing);}return ResultUtil.error();
}

五、免责说明

  • 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
  • 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
  • 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。

下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!

  1. 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
  2. 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
  3. 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
  4. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

这篇关于【开源】JAVA+Vue+SpringBoot实现实验室耗材管理系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694181

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句