1341 lines
45 KiB
Plaintext
1341 lines
45 KiB
Plaintext
% !TeX program = xelatex
|
||
\documentclass[a4paper, 10pt]{ctexart}
|
||
|
||
% --- 综合宏包引入 ---
|
||
\usepackage{tikz}
|
||
\usetikzlibrary{arrows.meta, positioning, fit, backgrounds}
|
||
\usepackage[left=2cm, right=2cm, top=2.5cm, bottom=2.5cm]{geometry}
|
||
\usepackage{enumitem}
|
||
\usepackage{listings}
|
||
\usepackage{xcolor}
|
||
\usepackage{titlesec}
|
||
\usepackage{booktabs}
|
||
\usepackage{graphicx}
|
||
\usepackage{array}
|
||
\usepackage{fancyhdr}
|
||
\usepackage{hyperref}
|
||
\usepackage{amsmath}
|
||
\usepackage{amssymb}
|
||
\usepackage{longtable}
|
||
|
||
% --- 字体设置 ---
|
||
% ctexart 会自动适配环境自带的中文字体
|
||
|
||
% --- 全局排版优化 ---
|
||
\emergencystretch=3em
|
||
\setlist{nosep, leftmargin=2em}
|
||
|
||
% --- 代码块样式设置 ---
|
||
\lstset{
|
||
basicstyle=\ttfamily\small,
|
||
commentstyle=\color{gray}\upshape,
|
||
breaklines=true,
|
||
frame=single,
|
||
rulecolor=\color{black!30},
|
||
backgroundcolor=\color{black!5},
|
||
xleftmargin=0pt,
|
||
xrightmargin=0pt,
|
||
aboveskip=1ex,
|
||
belowskip=1ex,
|
||
extendedchars=false,
|
||
columns=flexible,
|
||
keepspaces=true
|
||
}
|
||
|
||
% --- 标题设置 ---
|
||
\title{HIS 医院信息管理系统\\数据结构与系统架构说明文档}
|
||
\author{系统分析}
|
||
\date{\today}
|
||
|
||
\begin{document}
|
||
|
||
% ==========================================
|
||
% 全局目录
|
||
% ==========================================
|
||
\tableofcontents
|
||
\newpage
|
||
|
||
% ==========================================
|
||
% 第一部分:系统概述与设计目标
|
||
% ==========================================
|
||
|
||
\begin{center}
|
||
{\LARGE \textbf{《HIS 医院信息管理系统》}}\\
|
||
\vspace{0.5em}
|
||
{\large (数据结构、功能架构与使用说明)}
|
||
\vspace{1em}
|
||
\end{center}
|
||
|
||
\section{系统概述与设计目标}
|
||
本系统为一个面向中小型医院的完整医疗信息管理系统(Hospital Information System, HIS),采用 C++20 开发,结合 Qt6 框架构建图形界面。系统通过模块化分层设计,实现业务逻辑与交互界面的解耦,保障高扩展性与可维护性。
|
||
\begin{itemize}
|
||
\item \textbf{业务闭环}:实现完整的挂号、诊疗、检查、处方、住院、出院、支付、结算等医疗生命周期管理。
|
||
\item \textbf{双界面支持}:同时提供 CLI 命令行交互界面和 Qt6 GUI 图形界面,适配不同使用场景。
|
||
\item \textbf{数据规模}:支持大量患者、医生、药品、病房、检查项目、科室及支付结算记录的管理。
|
||
\item \textbf{底层核心}:全程基于手写\textbf{泛型双向链表 + 哈希索引}(LinkedList)实现内存数据流转,采用 JSON 文本文件持久化。
|
||
\item \textbf{多角色视角}:GUI 支持管理视角、病人视角和医护视角三种权限视图。
|
||
\item \textbf{支付结算}:支持现金、信用卡、移动支付、医保等多种支付方式,自动生成结算单与财务报表。
|
||
\item \textbf{鲁棒性}:完善的错误处理、输入校验和业务规则拦截(如住院中禁止删除患者、库存不足禁止发药等)。
|
||
\end{itemize}
|
||
|
||
\section{系统架构与项目目录结构}
|
||
系统采用四层分层架构设计(UI表现层 $\rightarrow$ Core业务层 $\rightarrow$ Model实体层 $\rightarrow$ Utils工具层 $\rightarrow$ 持久化层)。
|
||
\begin{itemize}
|
||
\item \textbf{UI表现层}:CLI(ReplShell)命令行交互 / GUI(Qt6 MainWindow)图形界面
|
||
\item \textbf{Core业务层}:HisCore 组合根 + 11 个 Service 服务类
|
||
\item \textbf{Model实体层}:9 个核心数据模型 + 5 种记录结构体
|
||
\item \textbf{Utils工具层}:LinkedList、Logger、FileManager、UUID、E2hangJson
|
||
\item \textbf{持久化层}:JSON 格式文本文件(data/ 目录)
|
||
\end{itemize}
|
||
|
||
% 嵌入TikZ架构图
|
||
\begin{figure}[htbp]
|
||
\centering
|
||
\begin{tikzpicture}[
|
||
>={Stealth[length=3mm]},
|
||
box/.style={draw,rounded corners,fill=blue!10,inner sep=8pt,text width=3.2cm,align=center},
|
||
svc/.style={draw,rounded corners,fill=green!10,inner sep=8pt,text width=3.6cm,align=center},
|
||
data/.style={draw,rounded corners,fill=orange!10,inner sep=8pt,text width=3.2cm,align=center},
|
||
edge/.style={->,thick}
|
||
]
|
||
|
||
% UI层
|
||
\node[box] (cli) {CLI 层 \\ \texttt{ReplShell}};
|
||
\node[box, right=2.5cm of cli] (gui) {GUI 层 \\ \texttt{MainWindow} \\ \texttt{(Qt6)}};
|
||
|
||
% 核心层
|
||
\node[svc, below=1.5cm of cli] (core) {HisCore 组合根 \\ + 11 个 Service};
|
||
\node[data, below=1.5cm of core] (ctx) {HisContext \\ 全局数据容器};
|
||
\node[data, below=1.2cm of ctx] (list) {LinkedList$<$Key, Value$>$ \\ 双向链表+哈希索引};
|
||
|
||
% 模型
|
||
\node[data, right=3.5cm of ctx] (models) {9 大实体模型 \\ Patient, Doctor, Medicine \\ Ward, Check, Department \\ PatientCase, Payment \\ Settlement};
|
||
|
||
% 工具
|
||
\node[box, left=3.5cm of ctx] (utils) {工具层 \\ Logger, FileManager \\ UUID, E2hangJson};
|
||
|
||
% 持久化
|
||
\node[box, below=1.2cm of list] (files) {JSON 数据文件 \\ data/*.txt};
|
||
|
||
% 关系
|
||
\draw[edge] (cli) -- (core);
|
||
\draw[edge] (gui) -- (core);
|
||
\draw[edge] (core) -- (ctx);
|
||
\draw[edge] (ctx) -- (list);
|
||
\draw[edge] (list) -- (files);
|
||
\draw[edge] (ctx.east) -- (models.west);
|
||
\draw[edge] (core.west) -- (utils.east);
|
||
\draw[edge] (utils.south) |- (files.west);
|
||
|
||
\end{tikzpicture}
|
||
\caption{HIS 系统四层架构图}
|
||
\end{figure}
|
||
|
||
\newpage
|
||
项目工程文件结构如下:
|
||
|
||
\begin{lstlisting}[language=bash]
|
||
HIS-GUI/
|
||
├── CMakeLists.txt # CMake 构建配置 (Qt6 + C++20)
|
||
├── README.md # 项目简要说明
|
||
├── include/ # 头文件目录
|
||
│ ├── cli/ # CLI 交互层
|
||
│ │ ├── repl_shell.h # 交互式命令行主循环
|
||
│ │ └── table_printer.h # ASCII 表格打印工具
|
||
│ ├── core/ # 核心业务服务层 (11个Service)
|
||
│ │ ├── his_core.h # 组合根 (Composition Root)
|
||
│ │ ├── his_context.h # 全局数据上下文 (HisContext)
|
||
│ │ ├── patient_service.h # 患者服务
|
||
│ │ ├── doctor_service.h # 医生服务
|
||
│ │ ├── medicine_service.h # 药品服务
|
||
│ │ ├── ward_service.h # 病房服务
|
||
│ │ ├── check_service.h # 检查项目服务
|
||
│ │ ├── department_service.h# 科室服务
|
||
│ │ ├── patient_case_service.h # 患者病例服务
|
||
│ │ ├── payment_service.h # 支付服务
|
||
│ │ ├── settlement_service.h# 结算服务
|
||
│ │ ├── payment_management_service.h # 支付管理服务
|
||
│ │ └── report_service.h # 报表服务
|
||
│ ├── models/ # 数据模型层 (9个实体 + 5种记录)
|
||
│ │ ├── patient.h # 患者模型
|
||
│ │ ├── doctor.h # 医生模型
|
||
│ │ ├── medicine.h # 药品模型
|
||
│ │ ├── ward.h # 病房与床位模型
|
||
│ │ ├── check.h # 检查项目模型
|
||
│ │ ├── department.h # 科室模型
|
||
│ │ ├── patient_case.h # 患者病例模型
|
||
│ │ ├── payment.h # 支付记录模型
|
||
│ │ └── settlement.h # 结算单模型
|
||
│ └── utils/ # 工具层
|
||
│ ├── linkedlist.hpp # 泛型双向链表 + 哈希索引
|
||
│ ├── logger.h # 日志系统
|
||
│ ├── file_manager.h # 文件读写与持久化
|
||
│ ├── uuid.h # UUID v4 生成器
|
||
│ └── json/ # 自定义 JSON 库
|
||
│ ├── JsonValue.h
|
||
│ ├── JsonParse.h
|
||
│ ├── JsonSerializer.h
|
||
│ └── JsonError.h
|
||
├── src/ # 源文件实现
|
||
│ ├── main_shell.cpp # CLI 入口
|
||
│ ├── main_noshell.cpp # 无 Shell 模式入口
|
||
│ ├── cli/ # CLI 实现
|
||
│ ├── core/ # 11 个 Service 实现
|
||
│ ├── models/ # 9 个 Model 实现
|
||
│ └── utils/ # 工具类实现
|
||
├── gui/ # Qt6 GUI 相关
|
||
│ ├── main_gui.cpp # GUI 入口
|
||
│ ├── mainwindow.h/cpp # 主窗口 (多标签页 + 角色切换)
|
||
│ ├── payment_dialog.h/cpp # 支付对话框
|
||
│ ├── payment_management_dialog.h/cpp # 支付管理对话框
|
||
│ ├── settlement_dialog.h/cpp # 结算对话框
|
||
│ └── dialogs/ # 子对话框
|
||
│ ├── patient_dialog.h/cpp
|
||
│ └── department_detail_dialog.h/cpp
|
||
├── data/ # 数据文件目录 (JSON 格式)
|
||
│ ├── patients.txt # 患者数据
|
||
│ ├── doctors.txt # 医生数据
|
||
│ ├── medicines.txt # 药品数据
|
||
│ ├── wards.txt # 病房数据
|
||
│ ├── checks.txt # 检查项目数据
|
||
│ ├── departments.txt # 科室数据
|
||
│ ├── patient_cases.txt # 患者病例数据
|
||
│ ├── payments.txt # 支付记录数据
|
||
│ └── settlements.txt # 结算单数据
|
||
├── tests/ # 测试用例
|
||
├── docs/ # 文档
|
||
└── build/ # 构建输出
|
||
\end{lstlisting}
|
||
|
||
\section{通用数据约定}
|
||
\begin{itemize}
|
||
\item \textbf{唯一性}:所有系统实体均采用 \textbf{UUID} 作为唯一主键标识,通过 \texttt{UUID::generate()} 生成符合 RFC 4122 标准的 v4 UUID。
|
||
\item \textbf{宽容性}:允许患者姓名重复,系统通过唯一 ID 精准区分同名患者。
|
||
\item \textbf{存储规约}:内存态数据全程挂载于自定义泛型链表 \textbf{LinkedList} 进行流转;磁盘持久化统一采用 \textbf{JSON 数组}格式存储于 data/ 目录下的 TXT 文件中。
|
||
\item \textbf{序列化}:所有模型均实现 \texttt{toJson()} 和 \texttt{fromJson()} 方法,与自定义 E2hangJson 库配合完成数据序列化/反序列化。
|
||
\end{itemize}
|
||
|
||
\section{核心数据结构:LinkedList}
|
||
|
||
\subsection{结构特点}
|
||
LinkedList 是系统的基础泛型数据结构,采用\textbf{双向链表 + 哈希表}的混合设计:
|
||
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{特性} & \textbf{说明} & \textbf{复杂度} \\
|
||
\hline
|
||
插入操作 & 在链表头部插入新元素 & $O(1)$ \\
|
||
\hline
|
||
查找操作 & 通过 unordered\_map 哈希索引定位 & $O(1)$ \\
|
||
\hline
|
||
删除操作 & 从链表中移除并更新哈希表 & $O(1)$ \\
|
||
\hline
|
||
遍历操作 & 按链表顺序从头到尾遍历 & $O(n)$ \\
|
||
\hline
|
||
移到头部 & LRU 风格,将节点移到链表头部 & $O(1)$ \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{LinkedList 操作复杂度}
|
||
\end{table}
|
||
|
||
\subsection{模板定义}
|
||
\begin{lstlisting}
|
||
template<class Key, class Value>
|
||
class LinkedList {
|
||
private:
|
||
ListNode<Key, Value>* head; // 哨兵头节点
|
||
ListNode<Key, Value>* tail; // 哨兵尾节点
|
||
std::unordered_map<Key, ListNode<Key, Value>*> mp; // 哈希索引
|
||
size_t sz; // 元素数量
|
||
public:
|
||
void insert_front(Key, Value);
|
||
void remove(Key);
|
||
ListNode* find(Key);
|
||
void move_to_front(Key);
|
||
void remove_tail();
|
||
size_t size();
|
||
void for_each(visitor);
|
||
};
|
||
\end{lstlisting}
|
||
|
||
\newpage
|
||
\section{核心数据实体}
|
||
|
||
\subsection{患者实体:Patient}
|
||
|
||
\subsubsection{属性定义}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} & \textbf{是否主键} \\
|
||
\hline
|
||
PatientID & string & 患者唯一标识 (UUID) & 是 \\
|
||
\hline
|
||
Name & string & 患者姓名 & 否 \\
|
||
\hline
|
||
Age & int & 患者年龄 & 否 \\
|
||
\hline
|
||
Gender & string & 性别 & 否 \\
|
||
\hline
|
||
Contact & string & 联系电话 & 否 \\
|
||
\hline
|
||
Status & enum & 就诊状态 & 否 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{Patient 属性表}
|
||
\end{table}
|
||
|
||
\subsubsection{就诊状态枚举}
|
||
\begin{lstlisting}
|
||
enum class PatientStatus {
|
||
Outpatient, // 门诊患者
|
||
Inpatient, // 住院患者
|
||
Discharged, // 已出院
|
||
Visited // 已就诊(门诊已完成诊断和用药)
|
||
};
|
||
\end{lstlisting}
|
||
|
||
\subsubsection{关键方法}
|
||
\begin{itemize}
|
||
\item \verb|updateBasicInfo()| - 更新患者基本信息
|
||
\item \verb|canBeRemoved()| - 检查是否可删除(住院中禁止删除)
|
||
\item \verb|nameMatches()| - 姓名模糊匹配查询
|
||
\item \verb|generateUniqueId()| - 生成 UUID
|
||
\item \verb|toJson()/fromJson()| - JSON 序列化接口
|
||
\end{itemize}
|
||
|
||
\subsection{医生实体:Doctor}
|
||
|
||
\subsubsection{属性定义}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
DoctorID & string & 医生唯一标识 (UUID) \\
|
||
\hline
|
||
Name & string & 医生姓名 \\
|
||
\hline
|
||
DepartmentID & string & 所属科室 ID \\
|
||
\hline
|
||
Title & enum & 医学职称 \\
|
||
\hline
|
||
Schedule & string & 出诊时间安排 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{Doctor 属性表}
|
||
\end{table}
|
||
|
||
\subsubsection{医学职称枚举}
|
||
\begin{lstlisting}
|
||
enum class DoctorTitle {
|
||
Chief, // 主任医师
|
||
AssociateChief, // 副主任医师
|
||
Attending, // 主治医师
|
||
Resident // 住院医师
|
||
};
|
||
\end{lstlisting}
|
||
|
||
\subsection{科室实体:Department}
|
||
|
||
\subsubsection{属性定义}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
DepartmentID & string & 科室唯一标识 (UUID) \\
|
||
\hline
|
||
Name & string & 科室名称 \\
|
||
\hline
|
||
Description & string & 科室描述 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{Department 属性表}
|
||
\end{table}
|
||
|
||
\subsubsection{关键方法}
|
||
\begin{itemize}
|
||
\item \verb|getDoctorsByDepartment()| - 获取科室下所有医生
|
||
\item \verb|getMedicinesByDepartment()| - 获取科室下所有药品
|
||
\item \verb|canDeleteDepartment()| - 检查是否可删除(有医生或药品时不能删)
|
||
\item \verb|getDoctorCountInDepartment()| - 获取科室下医生数量
|
||
\item \verb|getMedicineCountInDepartment()| - 获取科室下药品数量
|
||
\item \verb|getCheckCountInDepartment()| - 获取科室下检查项目数量
|
||
\end{itemize}
|
||
|
||
\subsection{药品实体:Medicine}
|
||
|
||
\subsubsection{属性定义}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
MedicineID & string & 药品唯一标识 (UUID) \\
|
||
\hline
|
||
GenericName & string & 通用名 \\
|
||
\hline
|
||
BrandName & string & 商品名 \\
|
||
\hline
|
||
Aliases & vector$<$string$>$ & 别名列表 \\
|
||
\hline
|
||
StockQuantity & int & 当前库存数量 \\
|
||
\hline
|
||
DepartmentID & string & 所属科室 ID \\
|
||
\hline
|
||
UnitPrice & double & 单价 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{Medicine 属性表}
|
||
\end{table}
|
||
|
||
\subsubsection{关键方法}
|
||
\begin{itemize}
|
||
\item \verb|updateBasicInfo()| - 更新药品信息
|
||
\item \verb|nameMatches()| - 支持通用名、商品名及别名模糊匹配
|
||
\item \verb|decreaseStock()| - 减少库存(库存不足时失败)
|
||
\item \verb|increaseStock()| - 增加库存
|
||
\item \verb|addAlias()| - 添加别名
|
||
\end{itemize}
|
||
|
||
\subsection{检查项目实体:Check}
|
||
|
||
\subsubsection{属性定义}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
CheckID & string & 检查项目唯一标识 (UUID) \\
|
||
\hline
|
||
Name & string & 检查名称 \\
|
||
\hline
|
||
DepartmentID & string & 所属科室 ID \\
|
||
\hline
|
||
Price & double & 检查价格 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{Check 属性表}
|
||
\end{table}
|
||
|
||
\subsection{病房与床位实体:Ward \& Bed}
|
||
|
||
\subsubsection{Bed 结构}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
BedID & string & 床位唯一标识 (UUID) \\
|
||
\hline
|
||
WardID & string & 所属病房 ID \\
|
||
\hline
|
||
Status & enum & 床位状态 \\
|
||
\hline
|
||
PatientID & string & 当前患者 ID(空表示空闲) \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{Bed 属性表}
|
||
\end{table}
|
||
|
||
\subsubsection{Ward 结构}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
WardID & string & 病房唯一标识 (UUID) \\
|
||
\hline
|
||
DepartmentID & string & 所属科室 ID \\
|
||
\hline
|
||
Type & enum & 病房类型 \\
|
||
\hline
|
||
MaxBeds & int & 最大床位数 \\
|
||
\hline
|
||
Beds & vector$<$Bed$>$ & 床位列表 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{Ward 属性表}
|
||
\end{table}
|
||
|
||
\subsubsection{枚举定义}
|
||
\begin{lstlisting}
|
||
enum class WardType {
|
||
Normal, // 普通病房
|
||
Special, // 特殊病房
|
||
ICU // 重症监护室
|
||
};
|
||
|
||
enum class BedStatus {
|
||
Free, // 空闲
|
||
Occupied // 被占用
|
||
};
|
||
\end{lstlisting}
|
||
|
||
\subsubsection{Ward 关键方法}
|
||
\begin{itemize}
|
||
\item \verb|getFreeBedID()| - 获取第一个空闲床位
|
||
\item \verb|admitPatient()| - 为患者分配床位
|
||
\item \verb|releaseBed()| / \verb|releasePatient()| - 释放床位
|
||
\item \verb|addBed()| / \verb|removeBed()| - 增减床位
|
||
\item \verb|freeBedCount()| / \verb|occupiedBedCount()| - 床位统计
|
||
\item \verb|occupancyRate()| - 计算床位使用率
|
||
\end{itemize}
|
||
|
||
占用率计算公式:
|
||
$$\text{OccupancyRate} = \frac{\text{OccupiedBeds}}{\text{MaxBeds}}$$
|
||
|
||
\newpage
|
||
\section{病例与记录模型}
|
||
|
||
\subsection{患者病例:PatientCase}
|
||
PatientCase 是聚合实体,记录患者的完整医疗历史。
|
||
|
||
\subsubsection{顶层属性}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
PatientID & string & 患者 ID \\
|
||
\hline
|
||
DiagnosisRecords & vector & 诊断记录列表 \\
|
||
\hline
|
||
MedicineRecords & vector & 用药记录列表 \\
|
||
\hline
|
||
CheckRecords & vector & 检查记录列表 \\
|
||
\hline
|
||
AdmissionRecords & vector & 住院记录列表 \\
|
||
\hline
|
||
AppointmentRecords & vector & 预约记录列表 \\
|
||
\hline
|
||
CreatedTime & time\_t & 创建时间 \\
|
||
\hline
|
||
LastModifiedTime & time\_t & 最后修改时间 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{PatientCase 属性表}
|
||
\end{table}
|
||
|
||
\subsection{诊断记录:DiagnosisRecord}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
DoctorID & string & 诊断医生 ID \\
|
||
\hline
|
||
Diagnosis & string & 诊断内容 \\
|
||
\hline
|
||
Prescription & string & 处方(可选) \\
|
||
\hline
|
||
Remarks & string & 备注 \\
|
||
\hline
|
||
Timestamp & time\_t & 诊断时间戳 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{DiagnosisRecord 属性}
|
||
\end{table}
|
||
|
||
\subsection{用药记录:MedicineRecord}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
MedicineID & string & 药品 ID \\
|
||
\hline
|
||
MedicineName & string & 药品名称 \\
|
||
\hline
|
||
Quantity & int & 用药数量 \\
|
||
\hline
|
||
Usage & string & 用法说明 \\
|
||
\hline
|
||
UnitPrice & double & 单价 \\
|
||
\hline
|
||
DoctorID & string & 开药医生 ID \\
|
||
\hline
|
||
Timestamp & time\_t & 开药时间戳 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{MedicineRecord 属性}
|
||
\end{table}
|
||
|
||
费用计算:$\text{TotalPrice} = \text{Quantity} \times \text{UnitPrice}$
|
||
|
||
\subsection{检查记录:CheckRecord}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
CheckID & string & 检查 ID \\
|
||
\hline
|
||
CheckName & string & 检查名称 \\
|
||
\hline
|
||
DepartmentID & string & 归属科室 ID \\
|
||
\hline
|
||
Price & double & 检查价格 \\
|
||
\hline
|
||
DoctorID & string & 开单医生 ID \\
|
||
\hline
|
||
Timestamp & time\_t & 开单时间戳 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{CheckRecord 属性}
|
||
\end{table}
|
||
|
||
\subsection{住院记录:AdmissionRecord}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
WardID & string & 病房 ID \\
|
||
\hline
|
||
BedID & string & 床位 ID \\
|
||
\hline
|
||
AdmissionTime & time\_t & 入院时间 \\
|
||
\hline
|
||
DischargeTime & time\_t & 出院时间(0 = 未出院) \\
|
||
\hline
|
||
Reason & string & 住院原因 \\
|
||
\hline
|
||
DischargeSummary & string & 出院小结 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{AdmissionRecord 属性}
|
||
\end{table}
|
||
|
||
判断当前是否住院:\verb|isCurrentlyAdmitted()| 返回 \verb|DischargeTime == 0|。
|
||
|
||
\subsection{预约记录:AppointmentRecord}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
DoctorID & string & 医生 ID \\
|
||
\hline
|
||
PatientID & string & 患者 ID \\
|
||
\hline
|
||
AppointmentDate & string & 预约日期(YYYY-MM-DD) \\
|
||
\hline
|
||
Notes & string & 备注 \\
|
||
\hline
|
||
Timestamp & time\_t & 创建时间 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{AppointmentRecord 属性}
|
||
\end{table}
|
||
|
||
\newpage
|
||
\section{支付与结算模型}
|
||
|
||
\subsection{支付记录:Payment}
|
||
|
||
\subsubsection{属性定义}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
PaymentID & string & 支付唯一标识 (UUID) \\
|
||
\hline
|
||
PatientID & string & 患者 ID \\
|
||
\hline
|
||
Amount & double & 支付金额 \\
|
||
\hline
|
||
Method & enum & 支付方式 \\
|
||
\hline
|
||
PaymentType & string & 支付类型(挂号/检查/用药等) \\
|
||
\hline
|
||
OperationID & string & 关联的操作 ID \\
|
||
\hline
|
||
PaymentTime & time\_t & 支付时间 \\
|
||
\hline
|
||
Status & string & 状态(Pending/Completed/Failed/Refunded) \\
|
||
\hline
|
||
Description & string & 支付描述 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{Payment 属性表}
|
||
\end{table}
|
||
|
||
\subsubsection{支付方式枚举}
|
||
\begin{lstlisting}
|
||
enum class PaymentMethod {
|
||
Cash, // 现金
|
||
CreditCard, // 信用卡
|
||
MobilePayment, // 移动支付(微信/支付宝)
|
||
HealthInsurance // 医保
|
||
};
|
||
\end{lstlisting}
|
||
|
||
\subsection{结算单:Settlement}
|
||
|
||
\subsubsection{结算明细项:SettlementItem}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
ItemName & string & 项目名称 \\
|
||
\hline
|
||
ItemType & string & 项目类型 \\
|
||
\hline
|
||
OperationID & string & 关联操作 ID \\
|
||
\hline
|
||
Quantity & double & 数量 \\
|
||
\hline
|
||
UnitPrice & double & 单价 \\
|
||
\hline
|
||
Amount & double & 金额 \\
|
||
\hline
|
||
PaymentMethod & string & 支付方式 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{SettlementItem 属性表}
|
||
\end{table}
|
||
|
||
\subsubsection{Settlement 属性}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{属性名} & \textbf{类型} & \textbf{含义} \\
|
||
\hline
|
||
SettlementID & string & 结算单唯一标识 (UUID) \\
|
||
\hline
|
||
PatientID & string & 患者 ID \\
|
||
\hline
|
||
PatientName & string & 患者姓名 \\
|
||
\hline
|
||
DischargeDate & string & 出院日期 \\
|
||
\hline
|
||
SettlementTime & time\_t & 结算时间 \\
|
||
\hline
|
||
Items & vector$<$SettlementItem$>$ & 费用明细列表 \\
|
||
\hline
|
||
TotalAmount & double & 医疗总费用 \\
|
||
\hline
|
||
InsurancePaid & double & 医保支付金额 \\
|
||
\hline
|
||
PatientPaid & double & 患者自付金额 \\
|
||
\hline
|
||
Status & string & 状态(Pending/Completed/Settled) \\
|
||
\hline
|
||
Notes & string & 备注 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{Settlement 属性表}
|
||
\end{table}
|
||
|
||
\newpage
|
||
\section{全局上下文与组合根}
|
||
|
||
\subsection{HisContext(全局数据容器)}
|
||
HisContext 是系统的数据容器,持有所有实体的 LinkedList,作为各服务类的共享数据源。
|
||
|
||
\begin{lstlisting}
|
||
namespace core {
|
||
class HisContext {
|
||
public:
|
||
LinkedList<std::string, Ward> wards;
|
||
LinkedList<std::string, Patient> patients;
|
||
LinkedList<std::string, Doctor> doctors;
|
||
LinkedList<std::string, Medicine> medicines;
|
||
LinkedList<std::string, Check> checks;
|
||
LinkedList<std::string, PatientCase> patientCases;
|
||
LinkedList<std::string, Department> departments;
|
||
LinkedList<std::string, Payment> payments;
|
||
LinkedList<std::string, Settlement> settlements;
|
||
};
|
||
}
|
||
\end{lstlisting}
|
||
|
||
\subsection{HisCore(组合根)}
|
||
HisCore 集中组装所有服务和上下文,是系统的入口点。
|
||
|
||
\begin{lstlisting}
|
||
namespace core {
|
||
class HisCore {
|
||
public:
|
||
HisCore();
|
||
bool loadDataFromFolder(const std::string& dataFolder, std::string& outError);
|
||
void fixDepartmentReferences();
|
||
|
||
HisContext ctx_;
|
||
WardService wardService;
|
||
PatientService patientService;
|
||
PatientCaseService patientCaseService;
|
||
ReportService reportService;
|
||
DoctorService doctorService;
|
||
MedicineService medicineService;
|
||
CheckService checkService;
|
||
DepartmentService departmentService;
|
||
PaymentService paymentService;
|
||
SettlementService settlementService;
|
||
PaymentManagementService paymentManagementService;
|
||
};
|
||
}
|
||
\end{lstlisting}
|
||
|
||
\newpage
|
||
\section{业务逻辑层:服务类}
|
||
|
||
\subsection{患者服务:PatientService}
|
||
\begin{itemize}
|
||
\item 患者的 CRUD 操作(增删改查)
|
||
\item 患者状态管理(门诊/住院/已出院/已就诊)
|
||
\item 住院分配与出院释放床位流程
|
||
\item 多维度查询:按 ID、姓名、联系方式模糊搜索
|
||
\end{itemize}
|
||
|
||
\subsection{医生服务:DoctorService}
|
||
\begin{itemize}
|
||
\item 医生信息的 CRUD 操作
|
||
\item 按科室遍历医生
|
||
\item 模糊搜索(姓名/科室/职称/排班)
|
||
\end{itemize}
|
||
|
||
\subsection{药品服务:MedicineService}
|
||
\begin{itemize}
|
||
\item 药品库存管理(CRUD)
|
||
\item 名称模糊匹配(通用名/商品名/别名)
|
||
\item 入库增加库存 / 出库减少库存(库存不足时失败)
|
||
\end{itemize}
|
||
|
||
\subsection{病房服务:WardService}
|
||
\begin{itemize}
|
||
\item 病房和床位的 CRUD 操作
|
||
\item 病房数据的持久化(JSON 文件 load/save)
|
||
\item 床位分配和回收管理
|
||
\end{itemize}
|
||
|
||
\subsection{检查项目服务:CheckService}
|
||
\begin{itemize}
|
||
\item 检查项目的 CRUD 操作
|
||
\item 按名称模糊搜索
|
||
\item 创建时自动生成 UUID
|
||
\end{itemize}
|
||
|
||
\subsection{科室服务:DepartmentService}
|
||
\begin{itemize}
|
||
\item 科室的 CRUD 操作
|
||
\item 获取科室下的医生、药品、检查项目列表
|
||
\item 删除前检查依赖(有医生或药品时不能删除)
|
||
\item 统计科室下各类资源数量
|
||
\end{itemize}
|
||
|
||
\subsection{患者病例服务:PatientCaseService}
|
||
\begin{itemize}
|
||
\item 管理患者的完整医疗记录(诊断/用药/检查/住院/预约)
|
||
\item 患者出院流程处理
|
||
\item 医疗统计(费用计算、记录数统计)
|
||
\end{itemize}
|
||
|
||
\subsection{支付服务:PaymentService}
|
||
\begin{itemize}
|
||
\item 创建支付记录(支持多种支付方式)
|
||
\item 查询支付记录(按患者、按类型)
|
||
\item 更新支付状态(完成/退款)
|
||
\item 获取患者总支付金额
|
||
\end{itemize}
|
||
|
||
\subsection{结算服务:SettlementService}
|
||
\begin{itemize}
|
||
\item 为患者生成结算单(出院时自动生成)
|
||
\item 添加费用项到结算单
|
||
\item 计算结算总额(总费用/医保/自付)
|
||
\item 完成结算、生成结算单报告
|
||
\end{itemize}
|
||
|
||
\subsection{支付管理服务:PaymentManagementService}
|
||
\begin{itemize}
|
||
\item 支付记录管理(按状态/日期范围过滤)
|
||
\item 支付统计(总收入/已完成/待支付/已退款)
|
||
\item 支付方式统计(按 Cash/CreditCard/MobilePayment/HealthInsurance 分类)
|
||
\item 今日/本月支付统计
|
||
\item 结算单管理(按状态/患者过滤、搜索)
|
||
\item 报表生成(日报/月报/收入报表/患者账单)
|
||
\item 收入趋势数据(每日/每月/按类型)
|
||
\item 异常支付检测与退款处理
|
||
\end{itemize}
|
||
|
||
\subsection{报表服务:ReportService}
|
||
\begin{itemize}
|
||
\item 病房床位使用率计算
|
||
\end{itemize}
|
||
|
||
\newpage
|
||
\section{工具层}
|
||
|
||
\subsection{Logger(日志系统)}
|
||
\begin{itemize}
|
||
\item 支持 12 种日志类型(Shell命令/患者操作/医生操作/药品操作/病房操作/诊断/用药/住院/出院/检查/系统事件等)
|
||
\item 可配置日志格式(占位符:\{time\}, \{type\}, \{command\}, \{details\}, \{objectId\})
|
||
\item 支持控制台输出和文件输出
|
||
\item 提供专用日志方法:\verb|logShellCommand()|, \verb|logPatientOperation()|, \verb|logDiagnosisRecord()| 等
|
||
\item 支持导出日志到文件、清空日志缓冲区
|
||
\end{itemize}
|
||
|
||
\subsection{FileManager(文件管理)}
|
||
为所有实体类型提供统一的文件读写操作:
|
||
\begin{itemize}
|
||
\item 基础文件操作:\verb|readTextFile()|, \verb|writeTextFile()|, \verb|createFile()|, \verb|deleteFile()|
|
||
\item JSON 字段删除:\verb|deleteJsonField()|
|
||
\item 所有 9 种实体的 \verb|loadXxxListFromFile()| 和 \verb|saveXxxListToFile()| 方法
|
||
\end{itemize}
|
||
|
||
\subsection{UUID(唯一标识符生成器)}
|
||
生成符合 RFC 4122 标准的 UUID v4:
|
||
\begin{itemize}
|
||
\item \verb|generate()| - 标准格式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||
\item \verb|generateShort()| - 无连字符格式
|
||
\item \verb|isValid()| - 格式校验
|
||
\item \verb|toShort()| / \verb|fromShort()| - 格式转换
|
||
\end{itemize}
|
||
|
||
\subsection{E2hangJson(自定义 JSON 库)}
|
||
\begin{itemize}
|
||
\item JsonValue:JSON 值表示(对象、数组、字符串、数字、布尔值)
|
||
\item JsonParse:JSON 解析器
|
||
\item JsonSerializer:JSON 序列化器
|
||
\item JsonError:JSON 错误处理
|
||
\end{itemize}
|
||
|
||
\newpage
|
||
\section{用户界面层}
|
||
|
||
\subsection{CLI 命令行界面(ReplShell)}
|
||
基于命令行的交互式 Shell,支持所有核心操作。主要命令分类如下:
|
||
|
||
\subsubsection{患者管理}
|
||
\begin{itemize}
|
||
\item \verb|patient add| / \verb|update| / \verb|rm| / \verb|list| / \verb|search|
|
||
\item \verb|patient load| / \verb|save|
|
||
\item \verb|patient admit| / \verb|release bed| / \verb|release patient|
|
||
\end{itemize}
|
||
|
||
\subsubsection{医生管理}
|
||
\begin{itemize}
|
||
\item \verb|doctor add| / \verb|rm| / \verb|list| / \verb|search|
|
||
\item \verb|doctor list dept| / \verb|search name| / \verb|search dept| / \verb|search title|
|
||
\item \verb|doctor load| / \verb|save|
|
||
\end{itemize}
|
||
|
||
\subsubsection{药品管理}
|
||
\begin{itemize}
|
||
\item \verb|medicine add| / \verb|list| / \verb|find|
|
||
\item \verb|medicine stock inc| / \verb|dec|
|
||
\item \verb|medicine load| / \verb|save|
|
||
\end{itemize}
|
||
|
||
\subsubsection{病房管理}
|
||
\begin{itemize}
|
||
\item \verb|ward add| / \verb|rm| / \verb|list| / \verb|show|
|
||
\item \verb|ward bed add| / \verb|rm|
|
||
\end{itemize}
|
||
|
||
\subsubsection{检查项目管理}
|
||
\begin{itemize}
|
||
\item \verb|check add| / \verb|list| / \verb|find|
|
||
\item \verb|check load| / \verb|save|
|
||
\end{itemize}
|
||
|
||
\subsubsection{科室管理}
|
||
\begin{itemize}
|
||
\item \verb|department add| / \verb|rm| / \verb|list|
|
||
\item \verb|department load| / \verb|save|
|
||
\end{itemize}
|
||
|
||
\subsubsection{病例管理}
|
||
\begin{itemize}
|
||
\item \verb|case diagnosis add| / \verb|case medicine add| / \verb|case check add|
|
||
\item \verb|case admission add| / \verb|case discharge| / \verb|case appointment add|
|
||
\item \verb|case view| / \verb|case stats|
|
||
\end{itemize}
|
||
|
||
\subsubsection{支付与结算}
|
||
\begin{itemize}
|
||
\item \verb|payment create| / \verb|list| / \verb|complete| / \verb|refund| / \verb|search|
|
||
\item \verb|settlement generate| / \verb|list| / \verb|view| / \verb|complete|
|
||
\end{itemize}
|
||
|
||
\subsubsection{日志与系统}
|
||
\begin{itemize}
|
||
\item \verb|log view| / \verb|export| / \verb|clear|
|
||
\item \verb|help| / \verb|exit| / \verb|save| / \verb|load|
|
||
\end{itemize}
|
||
|
||
\subsection{GUI 图形界面(MainWindow)}
|
||
基于 Qt6 的图形界面,提供多标签页和角色视角切换。
|
||
|
||
\subsubsection{视角枚举(ViewRole)}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{视角} & \textbf{说明} & \textbf{可见功能} \\
|
||
\hline
|
||
Admin & 管理视角 & 所有功能 \\
|
||
\hline
|
||
Patient & 病人视角 & 只能查看医生信息 \\
|
||
\hline
|
||
Medical & 医护视角 & 患者、医生、药品、检查、病例管理 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{GUI 视角枚举}
|
||
\end{table}
|
||
|
||
\subsubsection{主要标签页}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|l|}
|
||
\hline
|
||
\textbf{标签页} & \textbf{主要组件} & \textbf{功能} \\
|
||
\hline
|
||
仪表盘 & summaryLabel & 系统统计信息 \\
|
||
\hline
|
||
病房管理 & wardTreeView, wardTable & 树形浏览、床位管理 \\
|
||
\hline
|
||
患者管理 & patientTable & 列表、搜索、增删改查 \\
|
||
\hline
|
||
医生管理 & doctorTable & 列表、搜索、增删 \\
|
||
\hline
|
||
药品管理 & medicineTable & 列表、搜索、库存管理 \\
|
||
\hline
|
||
检查管理 & checkTable & 列表、搜索、增删改 \\
|
||
\hline
|
||
科室管理 & departmentTable & 列表、搜索、详情查看 \\
|
||
\hline
|
||
日志管理 & logDisplay & 日志查看、导出、清除 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{GUI 标签页组件}
|
||
\end{table}
|
||
|
||
\subsubsection{对话框组件}
|
||
\begin{itemize}
|
||
\item \textbf{PatientDialog} - 患者信息编辑对话框
|
||
\item \textbf{DepartmentDetailDialog} - 科室详情(显示科室下医生、药品、检查项目)
|
||
\item \textbf{PaymentDialog} - 支付对话框
|
||
\item \textbf{PaymentManagementDialog} - 支付管理(统计、报表、图表)
|
||
\item \textbf{SettlementDialog} - 结算对话框
|
||
\end{itemize}
|
||
|
||
\newpage
|
||
\section{系统核心交互流程图}
|
||
|
||
\begin{center}
|
||
\begin{tikzpicture}[
|
||
node distance=1.2cm,
|
||
every node/.style={
|
||
draw,
|
||
rectangle,
|
||
rounded corners,
|
||
minimum width=2cm,
|
||
minimum height=1.0cm,
|
||
align=center,
|
||
font=\small
|
||
},
|
||
arrow/.style={->, thick},
|
||
dashedarrow/.style={->, dashed}
|
||
]
|
||
|
||
% 主流程
|
||
\node (patient) {Patient\\患者};
|
||
\node (record) [right=of patient] {PatientCase\\患者病例};
|
||
\node (doctor) [right=of record] {Doctor\\医生};
|
||
\node (dept) [right=of doctor] {Department\\科室};
|
||
|
||
% 住院分支(上)
|
||
\node (ward) [above=of doctor, yshift=1cm] {Ward\\病房};
|
||
\node (bed) [right=of ward] {Bed\\床位};
|
||
|
||
% 药房分支(下左)
|
||
\node (medicine) [below=of doctor, yshift=-1cm] {Medicine\\药品};
|
||
\node (pharmacy) [right=of medicine] {Pharmacy\\药房};
|
||
|
||
% 检查分支(下右)
|
||
\node (check) [below=of dept, yshift=-1cm] {Check\\检查项目};
|
||
|
||
% 支付结算层(最右)
|
||
\node (payment) [right=3.5cm of dept, yshift=0.5cm] {Payment\\支付};
|
||
\node (settle) [right=3.5cm of dept, yshift=-0.5cm] {Settlement\\结算};
|
||
|
||
% 报表
|
||
\node (report) [below=2cm of payment] {Report\\统计报表};
|
||
|
||
% 主链路
|
||
\draw[arrow] (patient) -- node[above, draw=none]{就诊/挂号} (record);
|
||
\draw[arrow] (record) -- node[above, draw=none]{分配医生} (doctor);
|
||
\draw[arrow] (doctor) -- node[above, draw=none]{隶属} (dept);
|
||
|
||
% 住院流程
|
||
\draw[arrow] (record) -- node[right, draw=none]{住院触发} (ward);
|
||
\draw[arrow] (ward) -- node[above, draw=none]{床位分配} (bed);
|
||
\draw[arrow] (bed) |- node[pos=0.25,right, draw=none]{绑定患者} (patient);
|
||
|
||
% 药房流程
|
||
\draw[arrow] (record) -- node[right, draw=none]{开处方} (medicine);
|
||
\draw[arrow] (medicine) -- node[above, draw=none]{发药} (pharmacy);
|
||
|
||
% 检查流程
|
||
\draw[arrow] (record) -- node[right, draw=none]{开检查单} (check);
|
||
|
||
% 支付结算
|
||
\draw[arrow] (pharmacy.east) -| (payment.west);
|
||
\draw[arrow] (check.east) -| (payment.west);
|
||
\draw[arrow] (dept.east) -- (payment.west);
|
||
\draw[arrow] (payment) -- node[right, draw=none]{出院结算} (settle);
|
||
|
||
% 报表汇总
|
||
\draw[dashedarrow] (patient.south) to[out=290, in=250, looseness=0.6] (report.south);
|
||
\draw[dashedarrow] (doctor.north) to[out=70, in=135] (report.north west);
|
||
\draw[dashedarrow] (payment.south) -- (report.north);
|
||
\draw[dashedarrow] (settle.south) -- (report.north);
|
||
|
||
% 分组背景
|
||
\begin{scope}[on background layer]
|
||
\node[draw=blue!30, fill=blue!5, rounded corners, fit=(patient)(record)(doctor)(dept), label=above:{\textbf{门诊诊疗主流程}}] {};
|
||
\node[draw=green!30, fill=green!5, rounded corners, fit=(ward)(bed), label=above:{\textbf{住院管理子系统}}] {};
|
||
\node[draw=red!30, fill=red!5, rounded corners, fit=(medicine)(pharmacy), label=below:{\textbf{药房管理子系统}}] {};
|
||
\node[draw=purple!30, fill=purple!5, rounded corners, fit=(check), label=below:{\textbf{检查管理}}] {};
|
||
\node[draw=orange!30, fill=orange!5, rounded corners, fit=(payment)(settle), label=above:{\textbf{支付结算子系统}}] {};
|
||
\node[draw=gray!40, fill=gray!10, rounded corners, fit=(report), label=below:{\textbf{统计分析}}] {};
|
||
\end{scope}
|
||
|
||
\end{tikzpicture}
|
||
\end{center}
|
||
|
||
\newpage
|
||
\section{关键业务流程}
|
||
|
||
\subsection{患者完整就诊流程}
|
||
\begin{enumerate}
|
||
\item 患者注册:\verb|PatientService.addPatient()| 或 GUI 添加,状态为 Outpatient
|
||
\item 挂号预约:\verb|PatientCaseService.addAppointmentRecord()| 创建预约记录
|
||
\item 医生诊断:\verb|PatientCaseService.addDiagnosisRecord()| 添加诊断记录
|
||
\item 开药:\verb|PatientCaseService.addMedicineRecord()| 添加用药记录,同时 \verb|MedicineService.decreaseStock()| 扣减库存
|
||
\item 开检查:\verb|PatientCaseService.addCheckRecord()| 添加检查记录
|
||
\item 支付:\verb|PaymentService.createPayment()| 创建支付记录
|
||
\item 如需住院:\verb|PatientService.admitPatient()| 分配床位,状态改为 Inpatient
|
||
\item 出院:\verb|PatientCaseService.dischargePatient()| 填写出院小结,\verb|SettlementService.generateSettlement()| 生成结算单
|
||
\item 结算完成:\verb|SettlementService.completeSettlement()| 完成结算,患者状态改为 Discharged
|
||
\end{enumerate}
|
||
|
||
\subsection{住院管理流程}
|
||
\begin{enumerate}
|
||
\item 查找可用病房和空闲床位:\verb|Ward.getFreeBedID()|
|
||
\item 分配床位:\verb|Ward.admitPatient()| 绑定患者到床位
|
||
\item 更新患者状态为 Inpatient
|
||
\item 住院期间可继续添加诊断、用药、检查记录
|
||
\item 出院时:释放床位 \verb|Ward.releasePatient()|,更新患者状态为 Discharged
|
||
\end{enumerate}
|
||
|
||
\subsection{处方与药物管理流程}
|
||
\begin{enumerate}
|
||
\item 医生开具处方:\verb|PatientCaseService.addMedicineRecord()|
|
||
\item 系统记录药品 ID、数量、用法、单价
|
||
\item 自动扣减库存:\verb|MedicineService.decreaseStock()|(库存不足时拒绝)
|
||
\item 计算费用:\verb|Quantity $\times$ UnitPrice|
|
||
\item 查询患者总药费:\verb|PatientCase.getTotalMedicineCost()|
|
||
\end{enumerate}
|
||
|
||
\subsection{支付与结算流程}
|
||
\begin{enumerate}
|
||
\item 创建支付:\verb|PaymentService.createPayment()| 记录支付方式、金额、类型
|
||
\item 完成支付:\verb|PaymentService.completePayment()| 更新状态为 Completed
|
||
\item 出院时自动生成结算单:\verb|SettlementService.generateSettlement()|
|
||
\item 结算单汇总所有费用(用药/检查/住院等),区分医保支付和患者自付
|
||
\item 完成结算:\verb|SettlementService.completeSettlement()|
|
||
\item 管理端可查看统计报表:\verb|PaymentManagementService.getPaymentStatistics()|
|
||
\end{enumerate}
|
||
|
||
\newpage
|
||
\section{数据持久化}
|
||
|
||
\subsection{JSON 序列化策略}
|
||
所有数据模型均支持 JSON 序列化,通过 \verb|toJson()| 和 \verb|fromJson()| 接口实现。数据以 JSON 数组格式存储于 TXT 文件中。
|
||
|
||
\subsection{数据文件清单}
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|l|}
|
||
\hline
|
||
\textbf{文件路径} & \textbf{存储内容} \\
|
||
\hline
|
||
\verb|data/patients.txt| & 患者数据 \\
|
||
\hline
|
||
\verb|data/doctors.txt| & 医生数据 \\
|
||
\hline
|
||
\verb|data/medicines.txt| & 药品数据 \\
|
||
\hline
|
||
\verb|data/wards.txt| & 病房数据 \\
|
||
\hline
|
||
\verb|data/checks.txt| & 检查项目数据 \\
|
||
\hline
|
||
\verb|data/departments.txt| & 科室数据 \\
|
||
\hline
|
||
\verb|data/patient_cases.txt| & 患者病例数据 \\
|
||
\hline
|
||
\verb|data/payments.txt| & 支付记录数据 \\
|
||
\hline
|
||
\verb|data/settlements.txt| & 结算单数据 \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{数据文件清单}
|
||
\end{table}
|
||
|
||
\subsection{加载与保存策略}
|
||
遵循"启动时全量挂载,执行关键操作或退出时序列化落盘"的策略。
|
||
\begin{itemize}
|
||
\item CLI 模式:\verb|load| / \verb|save| 命令加载/保存所有数据;也可单独加载/保存某类数据
|
||
\item GUI 模式:启动时自动从 data/ 文件夹加载;点击保存按钮保存所有数据
|
||
\end{itemize}
|
||
|
||
\section{编译与运行}
|
||
|
||
\subsection{环境要求}
|
||
\begin{itemize}
|
||
\item C++20 兼容编译器(GCC 10+ / Clang 12+ / MSVC 2019+)
|
||
\item CMake 3.16+
|
||
\item Qt6(Widgets, Charts 组件)
|
||
\end{itemize}
|
||
|
||
\subsection{编译步骤}
|
||
\begin{lstlisting}[language=bash]
|
||
mkdir -p build
|
||
cd build
|
||
cmake ..
|
||
make -j4
|
||
\end{lstlisting}
|
||
|
||
\subsection{运行方式}
|
||
\begin{lstlisting}[language=bash]
|
||
# 交互式 CLI Shell
|
||
./his
|
||
|
||
# 无 Shell 模式(仅加载数据)
|
||
./his --noshell
|
||
|
||
# GUI 图形界面
|
||
./his_gui
|
||
|
||
# 批处理模式(管道输入)
|
||
printf "patient load ../data/patients.txt\ncase view p1001\nexit\n" | ./his
|
||
\end{lstlisting}
|
||
|
||
\newpage
|
||
\section{实体关系图}
|
||
|
||
\begin{verbatim}
|
||
Patient (患者)
|
||
├── 1:1 ──> PatientCase (患者病例)
|
||
│ ├── 1:n ──> DiagnosisRecord (诊断记录)
|
||
│ ├── 1:n ──> MedicineRecord (用药记录)
|
||
│ ├── 1:n ──> CheckRecord (检查记录)
|
||
│ ├── 1:n ──> AdmissionRecord (住院记录)
|
||
│ └── 1:n ──> AppointmentRecord (预约记录)
|
||
│
|
||
├── M:1 ──> Ward (病房) ──> 1:n ──> Bed (床位)
|
||
├── 1:n ──> Payment (支付记录)
|
||
└── 1:n ──> Settlement (结算单) ──> 1:n ──> SettlementItem (结算明细)
|
||
|
||
Doctor (医生)
|
||
└── M:1 ──> Department (科室)
|
||
|
||
Medicine (药品)
|
||
└── M:1 ──> Department (科室)
|
||
|
||
Check (检查项目)
|
||
└── M:1 ──> Department (科室)
|
||
|
||
Ward (病房)
|
||
└── M:1 ──> Department (科室)
|
||
\end{verbatim}
|
||
|
||
\section{设计模式与最佳实践}
|
||
|
||
\subsection{采用的设计模式}
|
||
\begin{itemize}
|
||
\item \textbf{Repository Pattern}:LinkedList + HisContext 作为数据仓储
|
||
\item \textbf{Service Pattern}:各 Service 类实现业务逻辑分离
|
||
\item \textbf{Composition Root}:HisCore 集中管理依赖注入
|
||
\item \textbf{DTO Pattern}:通过 toJson()/fromJson() 实现数据传输对象
|
||
\item \textbf{Template Method}:链表的泛型操作模板
|
||
\item \textbf{Observer Pattern}:Logger 记录所有关键操作
|
||
\end{itemize}
|
||
|
||
\subsection{业务规则}
|
||
\begin{itemize}
|
||
\item 患者在住院状态中禁止删除(\verb|Patient.canBeRemoved()|)
|
||
\item 药品库存不得为负(\verb|MedicineService.decreaseStock()| 库存不足时返回 false)
|
||
\item 同一物理床位同一时间仅能属于一名患者
|
||
\item 办理住院时无空闲床位则业务拒绝
|
||
\item 科室下有医生或药品时不能删除该科室
|
||
\item 出院记录必须包含出院小结
|
||
\item 所有实体使用 UUID 作为唯一标识
|
||
\end{itemize}
|
||
|
||
\section{总结}
|
||
|
||
HIS 医院信息管理系统通过精心设计的数据结构和分层架构,实现了医院信息管理的核心功能:
|
||
|
||
\begin{enumerate}
|
||
\item \textbf{高效的数据操作}:通过 LinkedList 混合结构提供 $O(1)$ 的查找、插入和删除
|
||
\item \textbf{完整的数据模型}:覆盖患者、医生、药品、病房、检查项目、科室、病例、支付、结算 9 大实体
|
||
\item \textbf{清晰的业务流程}:从患者挂号、诊疗、检查、开药到住院、出院、支付、结算的完整流程
|
||
\item \textbf{双界面支持}:CLI 命令行 + Qt6 GUI 图形界面,适配不同使用场景
|
||
\item \textbf{多角色视角}:GUI 支持管理/病人/医护三种权限视图
|
||
\item \textbf{完善的支付结算}:支持多种支付方式、医保结算、财务报表和统计图表
|
||
\item \textbf{灵活的扩展性}:Service 层设计使系统易于扩展新功能
|
||
\item \textbf{数据持久化}:JSON 序列化支持数据的保存和恢复
|
||
\end{enumerate}
|
||
|
||
系统的核心优势在于数据结构设计的平衡性——通过链表+哈希表的混合使用,既保证了查询效率,又支持了灵活的数据遍历和修改操作。
|
||
|
||
\appendix
|
||
|
||
\section{数据结构时间复杂度对比}
|
||
|
||
\begin{table}[h]
|
||
\centering
|
||
\begin{tabular}{|l|c|c|c|}
|
||
\hline
|
||
\textbf{操作} & \textbf{LinkedList} & \textbf{普通 Vector} & \textbf{HashMap} \\
|
||
\hline
|
||
查找 & $O(1)$ & $O(n)$ & $O(1)$ \\
|
||
\hline
|
||
插入 & $O(1)$ & $O(n)$ & $O(1)$ \\
|
||
\hline
|
||
删除 & $O(1)$ & $O(n)$ & $O(1)$ \\
|
||
\hline
|
||
遍历 & $O(n)$ & $O(n)$ & $O(n)$ \\
|
||
\hline
|
||
\end{tabular}
|
||
\caption{数据结构性能对比}
|
||
\end{table}
|
||
|
||
\end{document}
|