# 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,提升开发体验