Files
HIS-GUI/docs/支付系统设计文档.md
2026-04-06 16:23:17 +08:00

543 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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将成为一个功能完整的医院管理信息系统。