543 lines
15 KiB
Markdown
543 lines
15 KiB
Markdown
# HIS-GUI 支付系统 - 系统设计文档
|
||
|
||
## 目录
|
||
|
||
1. [系统概述](#系统概述)
|
||
2. [架构设计](#架构设计)
|
||
3. [数据模型](#数据模型)
|
||
4. [服务层设计](#服务层设计)
|
||
5. [UI设计](#ui设计)
|
||
6. [集成方案](#集成方案)
|
||
7. [部署和维护](#部署和维护)
|
||
|
||
## 系统概述
|
||
|
||
HIS-GUI支付系统是一个完整的医院支付管理解决方案,用于处理医院所有付费操作(挂号、检查、用药等)的支付流程。该系统具备以下核心功能:
|
||
|
||
### 核心功能
|
||
- ✅ **支付处理**:支持多种支付方式(现金、信用卡、移动支付、医保)
|
||
- ✅ **支付记录管理**:完整记录每一笔支付
|
||
- ✅ **结算单生成**:患者出院时自动生成详细结算单
|
||
- ✅ **费用统计**:支持医保/患者费用分配
|
||
- ✅ **报表生成**:支持日报表、月报表、收入报表
|
||
- ✅ **退款管理**:支持快速退款和原因记录
|
||
- ✅ **管理员界面**:完整的支付管理和统计界面
|
||
|
||
## 架构设计
|
||
|
||
### 整体架构
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────┐
|
||
│ GUI层 │
|
||
├─────────────────────────────────────────────────────┤
|
||
│ PaymentDialog │ SettlementDialog │ PaymentMgmtDlg │
|
||
├─────────────────────────────────────────────────────┤
|
||
│ 核心业务层(HisCore) │
|
||
├─────────────────────────────────────────────────────┤
|
||
│ PaymentService │ SettlementService │ PaymentMgmtSvc │
|
||
├─────────────────────────────────────────────────────┤
|
||
│ 数据访问层 │
|
||
├─────────────────────────────────────────────────────┤
|
||
│ 数据存储(JSON文件) │
|
||
└─────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 模块依赖
|
||
|
||
```
|
||
main_gui.cpp
|
||
↓
|
||
mainwindow.cpp (包含支付相关菜单)
|
||
↓
|
||
├→ payment_dialog.cpp ─── PaymentService
|
||
├→ settlement_dialog.cpp ─ SettlementService
|
||
├→ payment_management_dialog.cpp ─ PaymentManagementService
|
||
↓
|
||
his_core (核心库)
|
||
├→ payment_service
|
||
├→ settlement_service
|
||
├→ payment_management_service
|
||
↓
|
||
数据模型 & 文件IO
|
||
├→ payment.cpp/h
|
||
├→ settlement.cpp/h
|
||
├→ file_manager.cpp
|
||
```
|
||
|
||
## 数据模型
|
||
|
||
### Payment 模型
|
||
|
||
```cpp
|
||
class Payment {
|
||
std::string PaymentID; // 唯一标识 (格式: PAY_xxxxxxxx)
|
||
std::string PatientID; // 患者ID
|
||
double Amount; // 支付金额
|
||
PaymentMethod Method; // 支付方式 (Cash/CreditCard/MobilePayment/HealthInsurance)
|
||
std::string PaymentType; // 支付类型 (挂号/检查/用药等)
|
||
std::string OperationID; // 关联操作ID
|
||
time_t PaymentTime; // 支付时间戳
|
||
std::string Status; // 支付状态 (Pending/Completed/Failed/Refunded)
|
||
std::string Description; // 支付描述
|
||
};
|
||
```
|
||
|
||
### Settlement 模型
|
||
|
||
```cpp
|
||
class Settlement {
|
||
std::string SettlementID; // 唯一标识 (格式: SET_xxxxxxxx)
|
||
std::string PatientID; // 患者ID
|
||
std::string PatientName; // 患者姓名
|
||
std::string DischargeDate; // 出院日期
|
||
time_t SettlementTime; // 结算时间
|
||
std::vector<SettlementItem> Items; // 费用明细
|
||
double TotalAmount; // 医疗总费用
|
||
double InsurancePaid; // 医保支付金额
|
||
double PatientPaid; // 患者自付金额
|
||
std::string Status; // 结算状态 (Pending/Completed/Settled)
|
||
std::string Notes; // 备注
|
||
};
|
||
|
||
struct SettlementItem {
|
||
std::string ItemName; // 项目名称
|
||
std::string ItemType; // 项目类型
|
||
std::string OperationID; // 关联操作ID
|
||
double Quantity; // 数量
|
||
double UnitPrice; // 单价
|
||
double Amount; // 金额
|
||
std::string PaymentMethod; // 支付方式
|
||
};
|
||
```
|
||
|
||
### 支付方式枚举
|
||
|
||
```cpp
|
||
enum class PaymentMethod {
|
||
Cash = 0, // 现金支付
|
||
CreditCard = 1, // 信用卡
|
||
MobilePayment = 2, // 移动支付 (微信/支付宝)
|
||
HealthInsurance = 3 // 医保
|
||
};
|
||
```
|
||
|
||
### 数据存储格式
|
||
|
||
**payments.txt (JSON格式)**
|
||
```json
|
||
[
|
||
{
|
||
"paymentId": "PAY_abc123",
|
||
"patientId": "P001",
|
||
"amount": 200.0,
|
||
"method": "Cash",
|
||
"paymentType": "检查",
|
||
"operationId": "CHECK_001",
|
||
"paymentTime": 1712361600.0,
|
||
"status": "Completed",
|
||
"description": "CT扫描费用"
|
||
}
|
||
]
|
||
```
|
||
|
||
**settlements.txt (JSON格式)**
|
||
```json
|
||
[
|
||
{
|
||
"settlementId": "SET_xyz789",
|
||
"patientId": "P001",
|
||
"patientName": "张三",
|
||
"dischargeDate": "2025-04-10",
|
||
"settlementTime": 1712371200.0,
|
||
"items": [
|
||
{
|
||
"itemName": "挂号费",
|
||
"itemType": "Registration",
|
||
"operationId": "REG_001",
|
||
"quantity": 1.0,
|
||
"unitPrice": 50.0,
|
||
"amount": 50.0,
|
||
"paymentMethod": "Cash"
|
||
}
|
||
],
|
||
"totalAmount": 450.0,
|
||
"insurancePaid": 225.0,
|
||
"patientPaid": 225.0,
|
||
"status": "Completed",
|
||
"notes": ""
|
||
}
|
||
]
|
||
```
|
||
|
||
## 服务层设计
|
||
|
||
### PaymentService
|
||
|
||
**职责**:处理所有支付相关的操作
|
||
|
||
**主要方法**:
|
||
|
||
| 方法名 | 参数 | 返回值 | 说明 |
|
||
|-----|---|---|---|
|
||
| `createPayment` | 患者ID, 金额, 支付方式等 | bool, paymentID | 创建新的支付记录 |
|
||
| `findPayment` | paymentId | Payment* | 查找支付记录 |
|
||
| `updatePaymentStatus` | paymentId, newStatus | bool | 更新支付状态 |
|
||
| `completePayment` | paymentId | bool | 完成支付 |
|
||
| `refundPayment` | paymentId | bool | 退款 |
|
||
| `getTotalPaymentAmount` | patientId | double | 获取患者总支付金额 |
|
||
| `findByPatientId` | patientId, visitor | void | 按患者查询 |
|
||
| `findByPaymentType` | paymentType, visitor | void | 按支付类型查询 |
|
||
|
||
**实现要点**:
|
||
- 所有支付操作都记录日志
|
||
- 支付ID自动生成(PAY_前缀 + UUID)
|
||
- 支持多种查询方式(按患者、按类型等)
|
||
- 使用LinkedList存储支持高效查询
|
||
|
||
### SettlementService
|
||
|
||
**职责**:管理结算单的生成、修改和计算
|
||
|
||
**主要方法**:
|
||
|
||
| 方法名 | 参数 | 返回值 | 说明 |
|
||
|-----|---|---|---|
|
||
| `generateSettlement` | 患者ID, 姓名, 出院日期 | bool, settlementID | 生成新结算单 |
|
||
| `addItemToSettlement` | settlementId, item | bool | 添加费用项 |
|
||
| `calculateSettlement` | settlementId | bool | 计算费用总额 |
|
||
| `completeSettlement` | settlementId | bool | 完成结算 |
|
||
| `generateSettlementReport` | settlementId | string | 生成结算报告 |
|
||
|
||
**费用分配逻辑**:
|
||
```
|
||
默认情况下:
|
||
医保支付 = 总费用 × 50%
|
||
患者自付 = 总费用 × 50%
|
||
|
||
可根据具体医保政策调整
|
||
```
|
||
|
||
**结算报告格式**:
|
||
```
|
||
========== 医疗费用结算单 ==========
|
||
结算单号: SET_xyz789
|
||
患者姓名: 张三
|
||
患者ID: P001
|
||
出院日期: 2025-04-10
|
||
...
|
||
```
|
||
|
||
### PaymentManagementService
|
||
|
||
**职责**:为管理员提供支付统计、报表和异常处理
|
||
|
||
**主要方法**:
|
||
|
||
| 方法名 | 参数 | 返回值 | 说明 |
|
||
|-----|---|---|---|
|
||
| `getPaymentStatistics` | 无 | PaymentStatistics | 获取总支付统计 |
|
||
| `getTodayPaymentStatistics` | 无 | PaymentStatistics | 获取今日统计 |
|
||
| `getMonthlyPaymentStatistics` | 无 | PaymentStatistics | 获取月统计 |
|
||
| `generateDailyReport` | 日期 | string | 生成日报表 |
|
||
| `generateMonthlyReport` | 月份 | string | 生成月报表 |
|
||
| `generateRevenueReport` | 无 | string | 生成收入报表 |
|
||
| `processRefund` | paymentId, reason | bool | 处理退款 |
|
||
| `getAnomalousPayments` | visitor | void | 获取异常支付 |
|
||
|
||
**统计信息结构**:
|
||
```cpp
|
||
struct PaymentStatistics {
|
||
double TotalRevenue; // 总收入 (已完成-已退款)
|
||
double CompletedAmount; // 已完成金额
|
||
double PendingAmount; // 待支付金额
|
||
double RefundedAmount; // 已退款金额
|
||
int TotalPayments; // 总笔数
|
||
int CompletedPayments; // 已完成笔数
|
||
int PendingPayments; // 待支付笔数
|
||
int RefundedPayments; // 已退款笔数
|
||
};
|
||
```
|
||
|
||
## UI设计
|
||
|
||
### PaymentDialog (支付对话框)
|
||
|
||
**用途**:用户在进行付费操作时弹出的支付界面
|
||
|
||
**主要组件**:
|
||
- 患者信息区(只读)
|
||
- 操作类型显示
|
||
- 金额输入(只读,自动填充)
|
||
- 支付方式下拉框
|
||
- 备注文本框
|
||
- 确认/取消按钮
|
||
|
||
**交互流程**:
|
||
```
|
||
1. 系统调用 setPaymentInfo() 设置支付信息
|
||
2. 用户选择支付方式
|
||
3. 用户点击确认
|
||
4. 系统创建支付记录
|
||
5. 系统更新支付状态为Completed
|
||
6. 对话框返回成功
|
||
```
|
||
|
||
**关键信号**:
|
||
- `onPaymentMethodChanged(int)`: 支付方式改变时
|
||
- `onConfirmPayment()`: 点击确认时
|
||
- `onCancel()`: 点击取消时
|
||
|
||
### SettlementDialog (结算单对话框)
|
||
|
||
**用途**:显示和管理患者的结算单
|
||
|
||
**主要组件**:
|
||
- 结算单信息区(只读)
|
||
- 患者信息区(只读)
|
||
- 出院日期
|
||
- 费用明细表格
|
||
- 费用汇总区
|
||
- 备注区
|
||
- 打印/导出/确认按钮
|
||
|
||
**主要功能**:
|
||
- 显示结算单详情
|
||
- 添加/编辑费用项
|
||
- 计算费用总额
|
||
- 打印结算单
|
||
- 导出为文本文件
|
||
- 确认结算
|
||
|
||
### PaymentManagementDialog (支付管理对话框)
|
||
|
||
**用途**:为管理员提供支付管理和报表功能
|
||
|
||
**包含三个标签页**:
|
||
|
||
#### 1. 支付记录标签页
|
||
- 支付记录表格(可排序可搜索)
|
||
- 按状态筛选
|
||
- 新增支付记录
|
||
- 退款操作
|
||
- 统计信息显示
|
||
|
||
#### 2. 结算单标签页
|
||
- 结算单列表
|
||
- 结算单详情预览
|
||
- 按状态筛选
|
||
|
||
#### 3. 报表标签页
|
||
- 每日报表
|
||
- 月报表
|
||
- 收入总报表
|
||
- 支付方式统计
|
||
|
||
## 集成方案
|
||
|
||
### 与现有系统的集成
|
||
|
||
#### 1. 与患者管理的集成
|
||
|
||
```cpp
|
||
// 在PatientService中添加支付信息查询
|
||
class PatientService {
|
||
// ... 现有方法 ...
|
||
|
||
// 新增方法
|
||
double getPatientTotalPayment(const std::string& patientId) {
|
||
return ctx_.paymentService.getTotalPaymentAmount(patientId);
|
||
}
|
||
};
|
||
```
|
||
|
||
#### 2. 与患者病例的集成
|
||
|
||
```cpp
|
||
// 在PatientCase中添加支付ID字段
|
||
class PatientCase {
|
||
// ... 现有字段 ...
|
||
std::vector<std::string> paymentIDs; // 支付ID列表
|
||
std::string settlementID; // 结算单ID
|
||
};
|
||
```
|
||
|
||
#### 3. 与主窗口的集成
|
||
|
||
```cpp
|
||
// 在MainWindow中添加支付菜单
|
||
class MainWindow : public QMainWindow {
|
||
void createMenus() {
|
||
// ... 现有菜单 ...
|
||
QMenu* paymentMenu = menuBar()->addMenu("支付管理");
|
||
paymentMenu->addAction("新建支付", this, &MainWindow::onNewPayment);
|
||
paymentMenu->addAction("支付管理", this, &MainWindow::onPaymentManagement);
|
||
paymentMenu->addAction("结算管理", this, &MainWindow::onSettlementManagement);
|
||
}
|
||
|
||
void onNewPayment() {
|
||
PaymentDialog dlg(core_);
|
||
dlg.exec();
|
||
}
|
||
|
||
void onPaymentManagement() {
|
||
PaymentManagementDialog dlg(core_);
|
||
dlg.exec();
|
||
}
|
||
};
|
||
```
|
||
|
||
### 业务流程集成
|
||
|
||
#### 挂号流程
|
||
```
|
||
用户提交挂号信息
|
||
↓
|
||
系统验证挂号信息
|
||
↓
|
||
打开支付对话框
|
||
↓
|
||
用户完成支付
|
||
↓
|
||
系统创建支付记录
|
||
↓
|
||
系统保存挂号信息 (关联支付ID)
|
||
↓
|
||
显示挂号成功消息
|
||
```
|
||
|
||
#### 患者出院流程
|
||
```
|
||
医生确认出院
|
||
↓
|
||
系统生成结算单
|
||
↓
|
||
系统从支付记录中提取费用项
|
||
↓
|
||
系统计算医保/患者分配
|
||
↓
|
||
显示结算单对话框
|
||
↓
|
||
用户确认结算
|
||
↓
|
||
系统标记结算完成
|
||
↓
|
||
生成出院小结
|
||
```
|
||
|
||
## 部署和维护
|
||
|
||
### 文件结构
|
||
|
||
```
|
||
HIS-GUI/
|
||
├── include/
|
||
│ └── models/
|
||
│ ├── payment.h
|
||
│ └── settlement.h
|
||
│ └── core/
|
||
│ ├── payment_service.h
|
||
│ ├── settlement_service.h
|
||
│ └── payment_management_service.h
|
||
├── src/
|
||
│ ├── models/
|
||
│ │ ├── payment.cpp
|
||
│ │ └── settlement.cpp
|
||
│ ├── core/
|
||
│ │ ├── payment_service.cpp
|
||
│ │ ├── settlement_service.cpp
|
||
│ │ └── payment_management_service.cpp
|
||
│ └── utils/
|
||
│ └── file_manager.cpp (已更新)
|
||
├── gui/
|
||
│ ├── payment_dialog.h/cpp
|
||
│ ├── settlement_dialog.h/cpp
|
||
│ └── payment_management_dialog.h/cpp
|
||
└── data/
|
||
├── payments.txt
|
||
└── settlements.txt
|
||
```
|
||
|
||
### 编译配置
|
||
|
||
CMakeLists.txt已更新,包含以下新文件:
|
||
```cmake
|
||
# Models
|
||
src/models/payment.cpp
|
||
src/models/settlement.cpp
|
||
|
||
# Services
|
||
src/core/payment_service.cpp
|
||
src/core/settlement_service.cpp
|
||
src/core/payment_management_service.cpp
|
||
|
||
# GUI
|
||
gui/payment_dialog.cpp
|
||
gui/settlement_dialog.cpp
|
||
gui/payment_management_dialog.cpp
|
||
```
|
||
|
||
### 数据备份和恢复
|
||
|
||
支付数据自动备份到JSON文件:
|
||
- `data/payments.txt`
|
||
- `data/settlements.txt`
|
||
|
||
恢复流程:
|
||
```cpp
|
||
// 系统启动时自动加载
|
||
bool HisCore::loadDataFromFolder(const std::string& dataFolder) {
|
||
// ... 自动加载payments.txt和settlements.txt
|
||
}
|
||
```
|
||
|
||
### 日志记录
|
||
|
||
所有支付相关操作都被记录:
|
||
```cpp
|
||
LOG_INFO("PaymentService::createPayment - Created payment: " + paymentID);
|
||
LOG_WARN("PaymentService::refundPayment - Cannot refund non-completed payment");
|
||
```
|
||
|
||
日志位置:`logs/his.log`
|
||
|
||
### 性能考虑
|
||
|
||
- **存储优化**:使用LinkedList支持O(1)插入和删除
|
||
- **查询优化**:支持多种索引方式(按患者、按类型等)
|
||
- **报表优化**:报表生成使用流式处理,避免一次性加载全部数据
|
||
|
||
### 扩展建议
|
||
|
||
1. **添加数据库支持**
|
||
- 替换JSON文件存储为SQLite/MySQL
|
||
- 支持复杂查询和事务
|
||
|
||
2. **添加支付网关**
|
||
- 集成支付宝、微信等第三方支付
|
||
- 实时支付状态同步
|
||
|
||
3. **添加审计日志**
|
||
- 记录所有支付相关的改动
|
||
- 支持操作追溯和合规性检查
|
||
|
||
4. **添加权限控制**
|
||
- 基于角色的权限管理
|
||
- 支付敏感操作需要审批
|
||
|
||
5. **添加对账工具**
|
||
- 与银行系统对账
|
||
- 异常交易检测和处理
|
||
|
||
## 总结
|
||
|
||
HIS-GUI支付系统提供了完整的从支付到结算的解决方案,具备以下优势:
|
||
|
||
✅ **便于集成**:清晰的API设计,易于集成到现有系统
|
||
✅ **功能完整**:支支付全流程,从支付到结算一应俱全
|
||
✅ **数据安全**:完整的历史记录和备份机制
|
||
✅ **易于扩展**:模块化设计,便于添加新功能
|
||
✅ **用户友好**:直观的UI界面,提升用户体验
|
||
|
||
通过本支付系统的集成,HIS-GUI将成为一个功能完整的医院管理信息系统。
|