医药管理系统功能说明 | 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
算法:
调用场景: 药房审核发药(PrescriptionServiceImpl.approvePrescription)、库存页手动出库。
4.3 处方审核发药(核心闭环)
入口: POST /api/inventory/prescription-approve → PrescriptionServiceImpl.approvePrescription(@Transactional)
单事务内顺序:
退回: 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 写操作。




