欢迎光临
我们一直在努力

医药管理系统功能说明 | Spring Boot3 + Vue3 三端医药库存与处方闭环

医药管理系统功能说明 | Spring Boot3 + Vue3 三端医药库存与处方闭环

本文与仓库实装一致(包名 com.medsys,库名 medical_management)。 发布 CSDN 前请 grep 核对端口、组件路径、API。

目录

  • 一、系统概述
  • 二、技术栈与工程结构
  • 三、项目亮点(说清价值)
  • 四、关键实现(说清怎么做)
  • 五、系统管理员端功能
  • 六、药房管理员端功能
  • 七、执业医师端功能
  • 八、业务状态与数据表
  • 九、主要 API 一览
  • 十、本地运行与演示
  • 十一、功能结构图
  • 十二、说明与局限

一、系统概述

医药管理系统面向医疗机构内部使用,打通「采购申请 → 验收入库 → 批次库存 → 医生开方 → 药房审核发药 → 出库流水」链路,避免库存账实不符、近效期积压、处方与扣减脱节等问题。

角色
演示账号
密码
登录后默认首页
系统管理员 admin 123456 /dashboard/admin
药房管理员 pharmacy 123456 /dashboard/pharmacy
执业医师 doctor 123456 /dashboard/doctor


前端 http://localhost:3000(frontend/vite.config.js)
后端 http://localhost:8080,API 前缀 /api
登录页 LoginView.vue,路由 /login
布局 MainLayout.vue + 侧栏 menuConfig.js 按角色/权限码过滤菜单

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

二、技术栈与工程结构

2.1 技术栈

层次
技术
说明
前端 Vue 3、Vue Router、Pinia 组合式 API + 路由守卫
UI Element Plus、ECharts 表格/表单/图表
请求 Axios(utils/request.js) 统一拦截,成功返回 data 字段
后端 Spring Boot 3、Spring Security JWT 无状态
ORM MyBatis-Plus Lambda 条件分页查询
数据库 MySQL 8.0 库名 medical_management
构建 Vite 5、Maven、JDK 17

2.2 后端分层(com.medsys)

Controller → 接收 REST 请求、@PreAuthorize 权限
Service → 业务逻辑、@Transactional 事务
Mapper → MyBatis-Plus 数据访问
entity/dto → 表实体与 req/resp 传输对象

2.3 前端目录要点

src/views/admin/ 管理员页
src/views/pharmacy/ 药房页
src/views/doctor/ 医生页
src/api/ 接口封装
src/router/index.js 路由 + meta.roles / meta.permissions
src/utils/menuConfig.js 侧栏菜单


三、项目亮点(说清价值)

亮点
解决什么问题
用户可感知的效果
三端 RBAC 医生不能改库存、药房不能审采购 登录后菜单不同,越权接口 403
批次 FIFO 发药 近效期药积压、乱批次出库 审核发药后优先扣快过期批号
审核发药同事务 处方通过了但库存没扣 一次点击:扣库存 + 写出库 + 处方变已发药
开方实时库存 开方时不知道有没有药 下拉显示与库存管理同源的数量
缺药一步补货 上报与入库割裂 药房点「入库补货」,上报自动完成
采购审核闭环 乱采购、无审批 管理员审过才能验收入库
效期/低库存预警 过期仍可用、断货才发现 工作台与 /inventory/alert 提醒
统计与业务同源 看板数字与列表对不上 看板查 prescription/drug_inventory/sys_user 真表
统一响应与校验 前后端报错不一致 Result<T> + 全局异常;手机号等双端校验

四、关键实现

4.1 登录与权限

流程: POST /api/auth/login → 后端 BCrypt 校验密码 → JwtUtil 签发 JWT(含 userId、role、permissions)→ 前端 Pinia 存 token → 路由守卫拉 GET /api/auth/me → 按 meta.roles / meta.permissions 放行页面。

实现要点:

  • 权限码来自 sys_role_permission,PermissionResolverService 解析;改角色后用户刷新可拿到新权限。
  • 接口层 @PreAuthorize(\”@perm.hasPermission(authentication, \’xxx\’)\”);禁用用户 status≠1 返回 403「用户已禁用」。
  • 前端 v-permission 控制按钮(如审核发药需 prescription:approve)。

4.2 先进先出(FIFO)扣减

入口: InventoryServiceImpl.deductInventoryByFifo

算法:

  • 查询指定 drugId + warehouse 下 未过期 且 quantity>0 的批次;
  • ORDER BY expiry_date ASC, batch_no ASC(效期优先,同效期按批号);
  • 循环扣减直至满足数量,每扣一批写一条 outbound_record(含 prescription_item_id、批号、数量)。
  • 调用场景: 药房审核发药(PrescriptionServiceImpl.approvePrescription)、库存页手动出库。

    4.3 处方审核发药(核心闭环)

    入口: POST /api/inventory/prescription-approve → PrescriptionServiceImpl.approvePrescription(@Transactional)

    单事务内顺序:

  • 校验处方 status=1(待审核);
  • 每条明细:用 availableStock(未过期库存 − 其他待审处方预占)判断是否够发;
  • 调用 deductInventoryByFifo 扣减;
  • 更新 prescription_item.dispensed_quantity;
  • 处方 status=2(已发药),写入审核意见。
  • 退回: POST /api/inventory/prescription-reject → status=3,不扣库存。

    4.4 开方与库存口径(避免「有库存却不足」)

    方法
    计算方式
    用于
    warehouseStockTotal 指定仓库 qty>0 批次合计 开方创建校验、开方页/库存页展示
    dispensableStockTotal 未过期且 qty>0 FIFO 可发实物
    availableStock dispensable − 待审核处方预占 审核发药、缺药上报校验

    开方页实现: PrescriptionCreateView.vue 调用 POST /api/inventory/drug-groups(与 InventoryManagementView.vue 同源),按上方「药房」字段过滤仓库;PrescriptionServiceImpl.createPrescription 用 warehouseStockTotal 校验。

    预占实现: reservedQuantity 汇总 prescription.status=1 的明细 quantity – dispensed_quantity。

    4.5 入库(采购 / 缺药 / 手工)

    入口: InventoryServiceImpl.inboundAndReturnId

    逻辑: 按 drug_id + batch_no + warehouse 查找批次;无则 INSERT,有则 quantity 累加;同时 INSERT inbound_record。若带 purchase_item_id 则回写采购明细已收数量;若带 shortage_report_id 则关联缺药上报。

    缺药一步闭环: DrugShortageReportServiceImpl.fulfillByInbound → 入库 → 上报 status=2(已入库),写入 inbound_record_id。

    4.6 库存预警与过期锁定

    预警 API: GET /api/inventory/alert?alertType=1|2

    • alertType=1:汇总库存 < 药品 stock_safety(低库存);
    • alertType=2:存在效期在 6 个月内 且未过期的批次(近效期)。

    定时任务: InventoryExpiryJob(cron 0 0 2 * * ?)→ lockExpiredInventory 将 expiry_date < 今天 且 qty>0 的批次 quantity 置 0。

    4.7 分页与列表

    列表统一走 PageQueryReq:page 默认 1,size 默认 10,最大 200(前后端一致)。支持 keyword、status、warehouse 等过滤(各 Service 内 Lambda 拼装)。


    五、系统管理员端功能

    侧栏见 menuConfig.js → adminMenus

    5.1 数据统计(/dashboard/admin · AdminDashboard.vue)

    功能点:

    • 四张 KPI 卡片:启用用户数、库存仓库数(drug_inventory.warehouse 去重)、今日开立处方数、低库存预警种数;
    • ECharts 用户角色分布饼图(sys_user.role 聚合);
    • 近 7 日处方趋势折线图(按 prescription.created_at 分日统计);
    • 时间线通知:低库存提醒、待审核处方数提醒。

    实现: 前端 getAdminStats() → GET /api/stats → StatsServiceImpl.getAdminStats() 直查业务表,非 Mock。

    5.2 用户管理(/admin/users · UserManagementView.vue)

    功能点:

    • 分页列表,关键词搜用户名;
    • 新增用户(用户名、密码、角色、手机等);
    • 启用/禁用切换(PUT /api/admin/users/{id}/status);
    • 密码存储:BCrypt(AuthServiceImpl);老库明文 123456 首次登录可自动升级。

    权限: user:read 看列表,user:manage 写操作。

    5.3 采购入库审核(/admin/purchase-orders · PurchaseOrderAuditView.vue)

    赞(0)
    未经允许不得转载:171主机测评 » 医药管理系统功能说明 | Spring Boot3 + Vue3 三端医药库存与处方闭环
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址