# openhis-clinic **Repository Path**: tntlinking-opensource/openhis-clinic ## Basic Information - **Project Name**: openhis-clinic - **Description**: OpenHIS诊所系统是一款适用于社区卫生服务站、村卫生室、各类民营诊所的门诊管理系统,包含预约登记、就诊、收费发药、报表查询和库存管理5个核心模块。 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: v2.0.0 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 202 - **Forks**: 175 - **Created**: 2024-06-28 - **Last Updated**: 2026-04-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 1. 高层摘要 (TL;DR) * **影响**: **中等** - 本次变更主要涉及后端业务逻辑优化、Session 异常处理增强,以及前端从 Webpack 迁移到 Vue CLI 构建工具。 * **核心变更**: * 📦 整体前端页面便利性修改,侧边栏移动至上方折叠,记录已使用路由页面,随时跳转刷新 * 🔧 医生门诊开具西药处方便利性以及逻辑增加 * 🔧 **生产厂家查询优化**: 重构参数处理逻辑,增加参数校验和空值保护 * 💊 **库存控制修复**: 支持拆零销售的库存计算逻辑 * 📋 **处方状态联动**: 处方保存时自动更新检验检查状态 * 🛡️ **Session 异常处理**: 增强工具类异常处理能力,防止 Session 过期导致崩溃 * 🛡️ 移除大量项目中未使用冗余代码 * 📦 **构建工具升级**: 前端从 Webpack 3 迁移到 Vue CLI 5,加快run dev 和build速度 --- ## 2. 可视化概览 (代码与逻辑映射) ```mermaid graph TD subgraph "生产厂家管理" A["ManufactureFactoryService.listAlls()"] B["参数校验
company_id"] C["过滤参数列表"] D["DAO查询"] A --> B --> C --> D end subgraph "库存控制" E["MedicinalStorageControlService
预占用库存"] F["判断拆零销售
isUnpackSell"] G["单位转换
包装→制剂"] H["库存校验"] E --> F --> G --> H end subgraph "处方业务" I["RecipelDetailService
保存处方"] J["更新挂号就诊日期"] K["获取检验检查列表"] L["批量更新状态为已填写"] I --> J --> K --> L end subgraph "Session工具类" M["SessionUtils"] N["getUserJson()"] O["getUserDto()"] P["setUserJson()"] Q["try-catch包装"] M --> N M --> O M --> P N --> Q O --> Q P --> Q end style A fill:#bbdefb,color:#0d47a1 style E fill:#fff3e0,color:#e65100 style I fill:#c8e6c9,color:#1a5e20 style M fill:#f3e5f5,color:#7b1fa2 ``` --- ## 3. 详细变更分析 ### 3.1 后端业务逻辑优化 #### 🔧 生产厂家查询服务 (`ManufactureFactoryService.java`) **变更说明**: 重构了 `listAlls` 方法,修复了参数处理逻辑中的潜在问题。 | 变更项 | 旧实现 | 新实现 | |--------|--------|--------| | 参数过滤 | 直接 `remove(0)` 删除第一个参数 | 使用 `stream().filter()` 过滤 `company_id` | | 参数校验 | 无校验,直接调用 `get()` | 使用 `isPresent()` 校验后抛出异常 | | 原列表修改 | 直接修改传入的 `parameters` | 创建新的 `filteredParameters` 列表 | | 代码注释 | 无注释 | 添加详细的方法和步骤注释 | **关键代码片段**: ```java // 新增参数校验 if (!companyOptional.isPresent()) { throw new IllegalArgumentException("Missing required parameter: company_id"); } // 创建新参数列表,避免修改原列表 List filteredParameters = parameters.stream() .filter(item -> !item.getColumnName().equals("`company_id`")) .collect(Collectors.toList()); ``` --- #### 💊 库存控制服务 (`MedicinalStorageControlService.java`) **变更说明**: 修复了库存预占用逻辑,支持拆零销售的库存计算。 | 变更项 | 说明 | |--------|------| | 单位转换逻辑 | 新增:当 `isUnpackSell == 0` 时,将包装单位转换为制剂单位 | | 转换公式 | `total = total × preparation` (制剂数量) | | 验证时机调整 | 将负数和零值校验移到单位转换之后 | | 注释优化 | 将中文注释规范化 | **关键代码片段**: ```java // 根据是否拆零销售判断总量单位 BigDecimal totalBigDecimal = new BigDecimal(recipelDetail.getTotal()); // 如果不拆零销售,total 是包装单位,需要转换为制剂单位 if (recipelDetail.getIsUnpackSell() != null && recipelDetail.getIsUnpackSell() == 0) { if (drug != null && drug.getPreparation() != null) { totalBigDecimal = totalBigDecimal.multiply(new BigDecimal(drug.getPreparation())); } } ``` --- #### 📋 处方详情服务 (`RecipelDetailService.java`) **变更说明**: 在处方保存成功后,自动更新该处方下所有检验检查的状态为"已填写"。 | 变更项 | 说明 | |--------|------| | 新增依赖 | `InspectionCheckService` | | 新增导入 | `InspectionCheck` 实体类、`CollectionUtils` 工具类 | | 业务逻辑 | 在两处处方保存逻辑中添加检验检查状态更新 | **关键代码片段**: ```java // 更新该处方下所有检验检查状态为已填写 List inspectionChecks = inspectionCheckService.getByRecipelInfoId(recipelInfo.getId()); if (!CollectionUtils.isEmpty(inspectionChecks)) { for (InspectionCheck inspectionCheck : inspectionChecks) { inspectionCheck.setStatus("1"); inspectionCheckService.save(inspectionCheck); } } ``` --- ### 3.2 Session 工具类异常处理增强 #### 🛡️ SessionUtils (两个版本) **变更说明**: 为所有 Session 相关方法添加 `try-catch` 异常处理,防止 Session 过期或不存在时抛出异常导致系统崩溃。 | 方法 | 变更类型 | 异常处理策略 | |------|----------|--------------| | `getUserJson()` | 读取 | 捕获异常返回 `null` | | `getUserDto()` | 读取 | 捕获异常返回 `null` | | `getUserJson(Session)` | 读取 | 新增空值检查 + 捕获异常 | | `setUserJson()` | 写入 | 捕获异常静默处理 | | `getUserPermission()` | 读取 | 捕获异常返回 `null` | | `setUserPermission()` | 写入 | 捕获异常静默处理 | | `getWeChatUser()` | 读取 | 捕获异常返回 `null` | | `setWeChatUser()` | 写入 | 捕获异常静默处理 | | `getUser()` | 读取 | 新增空值检查 | | `setLoginTenantId()` | 写入 | 捕获异常静默处理 | | `setLoginTenant()` | 写入 | 捕获异常静默处理 | | `getLoginTenantId()` | 读取 | 捕获异常返回 `null` | | `getLoginTenant()` | 读取 | 捕获异常返回 `null` | ### 3.3 前端构建工具升级 #### 📦 依赖管理 (`package.json`) **构建工具迁移**: 从自定义 Webpack 配置迁移到 Vue CLI 5 | 构建脚本 | 旧命令 | 新命令 | |----------|--------|--------| | 开发环境 | `webpack-dev-server` | `vue-cli-service serve --no-eslint` | | 生产构建 | `node build/build.js` | `vue-cli-service build` | | 代码检查 | 无 | `vue-cli-service lint` | | 单元测试 | `jest` | `vue-cli-service test:unit` | **依赖变更摘要**: | 类别 | 移除依赖 | 新增依赖 | |------|----------|----------| | **构建核心** | `webpack@3.6.0`, `webpack-dev-server@2.9.1` | `webpack@5.105.4`, `@vue/cli-service@5.0.9` | | **Babel** | `babel-core@6.x`, `babel-loader@7.x` | `@babel/core@7.29.0`, `@vue/cli-plugin-babel@5.0.9` | | **工作流** | `bpmn-js@2.5.1`, `bpmn-js-properties-panel@0.33.1` | (已移除) | | **测试** | `jest@21.2.0`, `nightwatch@0.9.12` | `@vue/cli-plugin-unit-jest@5.0.9` | | **代码检查** | 无 | `eslint@10.2.0`, `eslint-plugin-vue@10.8.0` | | **其他** | `extract-text-webpack-plugin`, `uglifyjs-webpack-plugin` | `docx@9.6.1` | --- ## 4. 总结 本次变更主要聚焦于 **后端业务逻辑优化** 和 **前端构建工具现代化**: ✅ **正向改进**: - 整体页面路由使用方式重构,添加整体便利性 - 增强了 Session 工具类的健壮性,防止异常导致系统崩溃 - 修复了库存计算中的拆零销售逻辑缺陷 - 优化了生产厂家查询的参数处理和校验 - 前端构建工具升级到 Vue CLI 5,提升开发体验