一、个人简介
💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
开发语言:Java+Python 数据库:MySQL 系统架构:B/S 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django 前端:Vue+HTML+CSS+JavaScript+jQuery
智慧药店药品信息管理系统是一个基于Spring Boot和Vue框架开发的现代化药店管理解决方案。该系统采用前后端分离的架构设计,后端使用Spring Boot整合Spring、SpringMVC和MyBatis框架构建RESTful API服务,前端采用Vue.js结合ElementUI组件库开发用户界面,数据存储基于MySQL关系型数据库。系统涵盖了药店日常运营的核心业务流程,包括用户权限管理、药品分类体系建立、药品基础信息维护、库存入出库操作、采购流程管控、定期盘点统计以及订单全生命周期管理等功能模块。通过数字化手段替代传统的手工记录方式,系统能够实现药品信息的标准化录入、库存数据的实时更新、销售流程的规范化操作,有效降低人工操作错误率,提升药店运营效率。系统界面简洁直观,操作流程符合药店工作人员的使用习惯,支持多用户角色权限分配,确保数据安全性和操作规范性,为中小型药店提供了一套完整的信息化管理工具。
三、视频解说
四、部分功能展示
五、部分代码展示
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Date;
import java.math.BigDecimal;
@Service
public class PharmacyManagementService {
private SparkSession spark = SparkSession.builder().appName("PharmacyDataAnalysis").master("local[*]").getOrCreate();
@Autowired
private DrugMapper drugMapper;
@Autowired
private InventoryMapper inventoryMapper;
@Autowired
private OrderMapper orderMapper;
@Transactional
public Result addDrugInfo(Drug drug) {
if (drug.getDrugName() == null || drug.getDrugName().trim().isEmpty()) {
return Result.error("药品名称不能为空");
}
if (drug.getPrice() == null || drug.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
return Result.error("药品价格必须大于0");
}
Drug existingDrug = drugMapper.findByNameAndSpec(drug.getDrugName(), drug.getSpecification());
if (existingDrug != null) {
return Result.error("相同名称和规格的药品已存在");
}
drug.setCreateTime(new Date());
drug.setStatus(1);
drug.setDrugCode("DRUG" + System.currentTimeMillis());
if (drug.getExpiryDate() != null && drug.getExpiryDate().before(new Date())) {
return Result.error("药品有效期不能早于当前日期");
}
drugMapper.insert(drug);
Inventory inventory = new Inventory();
inventory.setDrugId(drug.getId());
inventory.setCurrentStock(0);
inventory.setMinStock(drug.getMinStock() != null ? drug.getMinStock() : 10);
inventory.setMaxStock(drug.getMaxStock() != null ? drug.getMaxStock() : 1000);
inventory.setLastUpdateTime(new Date());
inventoryMapper.insert(inventory);
return Result.success("药品信息添加成功", drug);
}
@Transactional
public Result processInventoryIn(InventoryIn inventoryIn) {
if (inventoryIn.getDrugId() == null || inventoryIn.getQuantity() <= 0) {
return Result.error("药品ID和入库数量必须有效");
}
Drug drug = drugMapper.findById(inventoryIn.getDrugId());
if (drug == null) {
return Result.error("药品信息不存在");
}
if (inventoryIn.getBatchNumber() == null || inventoryIn.getBatchNumber().trim().isEmpty()) {
return Result.error("批次号不能为空");
}
InventoryIn existingBatch = inventoryMapper.findByDrugIdAndBatch(inventoryIn.getDrugId(), inventoryIn.getBatchNumber());
if (existingBatch != null) {
return Result.error("相同批次号的药品已存在,请使用不同的批次号");
}
if (inventoryIn.getExpiryDate() == null || inventoryIn.getExpiryDate().before(new Date())) {
return Result.error("药品有效期不能为空且不能早于当前日期");
}
inventoryIn.setInTime(new Date());
inventoryIn.setStatus(1);
inventoryIn.setRemainingQuantity(inventoryIn.getQuantity());
inventoryIn.setTotalAmount(inventoryIn.getUnitPrice().multiply(new BigDecimal(inventoryIn.getQuantity())));
inventoryMapper.insertInventoryIn(inventoryIn);
Inventory inventory = inventoryMapper.findByDrugId(inventoryIn.getDrugId());
inventory.setCurrentStock(inventory.getCurrentStock() + inventoryIn.getQuantity());
inventory.setLastUpdateTime(new Date());
inventoryMapper.updateInventory(inventory);
if (inventory.getCurrentStock() > inventory.getMaxStock()) {
return Result.warning("入库成功,但当前库存已超过最大库存预警值");
}
return Result.success("药品入库操作完成", inventoryIn);
}
@Transactional
public Result processOrderSale(Order order) {
if (order.getOrderItems() == null || order.getOrderItems().isEmpty()) {
return Result.error("订单商品列表不能为空");
}
BigDecimal totalAmount = BigDecimal.ZERO;
for (OrderItem item : order.getOrderItems()) {
if (item.getDrugId() == null || item.getQuantity() <= 0) {
return Result.error("订单中存在无效的药品信息或数量");
}
Drug drug = drugMapper.findById(item.getDrugId());
if (drug == null) {
return Result.error("药品ID为" + item.getDrugId() + "的商品不存在");
}
Inventory inventory = inventoryMapper.findByDrugId(item.getDrugId());
if (inventory.getCurrentStock() < item.getQuantity()) {
return Result.error("药品'" + drug.getDrugName() + "'库存不足,当前库存:" + inventory.getCurrentStock());
}
List<InventoryIn> availableBatches = inventoryMapper.findAvailableBatchesByDrugId(item.getDrugId());
int remainingQuantity = item.getQuantity();
for (InventoryIn batch : availableBatches) {
if (remainingQuantity <= 0) break;
if (batch.getExpiryDate().before(new Date())) {
continue;
}
int deductQuantity = Math.min(remainingQuantity, batch.getRemainingQuantity());
batch.setRemainingQuantity(batch.getRemainingQuantity() - deductQuantity);
inventoryMapper.updateInventoryIn(batch);
remainingQuantity -= deductQuantity;
}
if (remainingQuantity > 0) {
return Result.error("药品'" + drug.getDrugName() + "'可用库存不足");
}
item.setUnitPrice(drug.getPrice());
item.setSubtotal(drug.getPrice().multiply(new BigDecimal(item.getQuantity())));
totalAmount = totalAmount.add(item.getSubtotal());
inventory.setCurrentStock(inventory.getCurrentStock() - item.getQuantity());
inventory.setLastUpdateTime(new Date());
inventoryMapper.updateInventory(inventory);
}
order.setOrderNumber("ORDER" + System.currentTimeMillis());
order.setOrderTime(new Date());
order.setTotalAmount(totalAmount);
order.setOrderStatus(1);
orderMapper.insertOrder(order);
for (OrderItem item : order.getOrderItems()) {
item.setOrderId(order.getId());
orderMapper.insertOrderItem(item);
}
return Result.success("订单处理完成", order);
}
}
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊