摘要:本文介绍了一款基于Java Swing开发的医院预约挂号系统,系统集成了Coze AI智能导诊、百度语音识别、二维码支付等创新功能,采用经典的三层架构设计,支持患者、医生、管理员三种角色,实现了完整的挂号预约业务流程。
关键词:Java Swing;Coze AI;智能导诊;预约挂号;语音识别
一、项目概述
1.1 项目背景
随着医疗信息化的快速发展,传统医院现场挂号模式已难以满足患者需求。患者常常面临"不知道挂什么科"、"排队时间长"、"号源紧张"等问题。本项目旨在开发一套智能化、一体化的医院管理系统,通过AI技术提升就医体验,优化医疗资源配置。
1.2 功能架构
医院预约挂号系统
├── 患者端
│ ├── 医院简介浏览
│ ├── AI智能导诊(Coze AI)
│ ├── 语音输入症状
│ ├── 在线预约挂号
│ ├── 我的订单管理
│ ├── 查看诊断结果
│ ├── 就诊评价
│ ├── 系统通知
│ └── 院内导航
├── 医生端
│ ├── 查看排班
│ ├── 预约患者管理
│ └── 患者评价查看
└── 管理员端
├── 科室管理
├── 医生管理
├── 排班管理
└── 数据统计
1.3 技术选型
| 技术 | 版本 | 用途 |
|---|---|---|
| Java | 17 | 开发语言(LTS版本) |
| Maven | 3.x | 项目构建工具 |
| Swing | JDK内置 | GUI界面框架 |
| MySQL | 8.0 | 数据存储 |
| JDBC | 4.2 | 数据库访问 |
| Coze API | v2 | AI智能导诊 |
| 百度语音API | v2 | 语音识别 |
| OkHttp | 4.12.0 | HTTP客户端 |
| Gson | 2.10.1 | JSON处理 |
二、系统架构设计
2.1 整体架构
采用经典的三层架构模式:
┌─────────────────────────────────────┐
│ 表现层 (View) │
│ LoginView / PatientMainView / ... │
├─────────────────────────────────────┤
│ 业务层 (Service) │
│ UserService / OrderService / ... │
├─────────────────────────────────────┤
│ 数据层 (DAO) │
│ UserDao / DoctorDao / OrderDao... │
├─────────────────────────────────────┤
│ 实体层 (Entity) │
│ User / Doctor / Order / ... │
└─────────────────────────────────────┘
2.2 项目结构
hospital_pro/
├── src/main/java/
│ ├── entity/ # 实体类
│ ├── dao/ # 数据访问层
│ ├── service/ # 业务逻辑层
│ ├── view/ # 界面层
│ │ └── panel/ # 子面板组件
│ ├── dto/ # 数据传输对象
│ ├── util/ # 工具类
│ └── resources/ # 配置文件
└── pom.xml # Maven配置
三、核心功能实现
3.1 AI智能导诊功能
系统集成Coze AI平台,实现多轮对话式症状分析:
Java
/**
* CozeService - AI智能导诊服务
* 支持多轮对话,异步调用避免UI卡顿
*/
public class CozeService {
private static final String COZE_API_URL =
"https://api.coze.cn/open_api/v2/chat";
private static final String BOT_ID = "7645674954880778294";
private final OkHttpClient httpClient;
private final Gson gson;
public CozeService() {
this.httpClient = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
this.gson = new Gson();
}
/**
* 异步分析症状
* @param conversationHistory 对话历史
* @param currentInput 当前输入
*/
public void analyzeSymptomsAsync(List<ChatMessage> conversationHistory,
String currentInput,
Consumer<CozeAnalysisResult> onSuccess,
Consumer<String> onError) {
SwingWorker<CozeAnalysisResult, Void> worker = new SwingWorker<>() {
@Override
protected CozeAnalysisResult doInBackground() throws Exception {
return callCozeApi(conversationHistory, currentInput);
}
@Override
protected void done() {
try {
CozeAnalysisResult result = get();
onSuccess.accept(result);
} catch (Exception e) {
onError.accept("AI分析失败:" + e.getMessage());
}
}
};
worker.execute();
}
}
AI导诊交互流程:
患者: 我最近总是头痛、恶心
AI: 请问这种症状持续多久了?有没有伴随发热?
患者: 大概一周了,没有发热,但有时候看东西模糊
AI: 根据您的描述,建议挂【神经内科】
系统: 自动显示神经内科可预约医生列表
3.2 语音识别功能
集成百度语音API,支持语音输入症状描述:
Java
/**
* SpeechRecognitionService - 百度语音识别
*/
public class SpeechRecognitionService {
private static final String API_KEY = "your_api_key";
private static final String SECRET_KEY = "your_secret_key";
private TargetDataLine targetDataLine;
private boolean isRecording = false;
private ByteArrayOutputStream audioOutputStream;
/**
* 开始录音
*/
public void startRecording() throws Exception {
// 配置音频格式:16kHz, 16bit, 单声道
AudioFormat format = new AudioFormat(16000, 16, 1, true, false);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
targetDataLine.open(format);
targetDataLine.start();
isRecording = true;
audioOutputStream = new ByteArrayOutputStream();
// 后台线程录音
new Thread(() -> {
byte[] buffer = new byte[1024];
while (isRecording) {
int count = targetDataLine.read(buffer, 0, buffer.length);
if (count > 0) {
audioOutputStream.write(buffer, 0, count);
}
}
}).start();
}
/**
* 停止录音并识别
*/
public String stopRecordingAndRecognize() throws IOException {
isRecording = false;
targetDataLine.stop();
targetDataLine.close();
byte[] audioData = audioOutputStream.toByteArray();
byte[] wavData = addWavHeader(audioData, 16000, 1, 16);
return callBaiduASR(wavData);
}
}
3.3 智能排班系统
根据医生级别自动安排排班:
Java
/**
* BatchScheduler - 批量排班器
*/
public class BatchScheduler {
// 每天最少医生数
private static final int MIN_DOCTORS_PER_SHIFT = 3;
// 每天最多医生数
private static final int MAX_DOCTORS_PER_DAY = 6;
/**
* 批量排班
*/
public boolean executeBatchScheduling(Integer[] deptIds,
Date startDate,
int weeks) {
Date endDate = Date.valueOf(
startDate.toLocalDate().plusWeeks(weeks));
// 清理旧排班
clearScheduleRange(startDate, endDate);
// 为每个科室排班
for (int week = 0; week < weeks; week++) {
LocalDate weekStart = startDate.toLocalDate()
.plusWeeks(week);
for (Integer deptId : deptIds) {
scheduleDepartmentForWeek(deptId,
Date.valueOf(weekStart));
}
}
return true;
}
/**
* 根据级别获取最大工作天数
*/
private int getMaxWorkDays(int level) {
return switch (level) {
case 4 -> 5; // 正高:5天/周
case 3 -> 6; // 副高:6天/周
default -> 7; // 其他:7天/周
};
}
}
3.4 数据库连接池
自定义简易连接池实现:
Java
/**
* JDBCUtil - 数据库连接工具类
* 内置简单连接池
*/
public class JDBCUtil {
private static BlockingQueue<Connection> connectionPool;
private static final int POOL_SIZE = 5;
static {
try {
// 加载配置
Properties prop = new Properties();
InputStream is = JDBCUtil.class.getClassLoader()
.getResourceAsStream("db.properties");
prop.load(is);
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String password = prop.getProperty("password");
Class.forName(driver);
// 初始化连接池
connectionPool = new ArrayBlockingQueue<>(POOL_SIZE);
for (int i = 0; i < POOL_SIZE; i++) {
Connection conn = DriverManager
.getConnection(url, user, password);
connectionPool.offer(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection()
throws InterruptedException {
return connectionPool.take();
}
public static void releaseConnection(Connection conn) {
if (conn != null) {
connectionPool.offer(conn);
}
}
}
四、数据库设计
4.1 核心表结构
SQL
-- 用户表
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(32) NOT NULL, -- MD5加密
phone VARCHAR(20),
role INT DEFAULT 2 COMMENT '1-管理员 2-患者',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 科室表
CREATE TABLE department (
id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(50) NOT NULL,
location VARCHAR(100) COMMENT '科室位置'
);
-- 医生表
CREATE TABLE doctor (
id INT PRIMARY KEY AUTO_INCREMENT,
dept_id INT,
doctor_name VARCHAR(50),
doctor_level INT COMMENT '1住院 2主治 3副高 4正高',
register_fee DECIMAL(10,2),
title VARCHAR(50),
skill TEXT,
FOREIGN KEY (dept_id) REFERENCES department(id)
);
-- 排班表
CREATE TABLE schedule (
id INT PRIMARY KEY AUTO_INCREMENT,
doctor_id INT,
work_date DATE,
shift_type VARCHAR(20) COMMENT '上午/下午',
max_patients INT DEFAULT 20,
remaining INT DEFAULT 20,
FOREIGN KEY (doctor_id) REFERENCES doctor(id)
);
-- 订单表
CREATE TABLE `order` (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
doctor_id INT,
source_id INT COMMENT '排班ID',
order_time TIMESTAMP,
register_fee DECIMAL(10,2),
status INT DEFAULT 0 COMMENT '0待付款 1已挂号 2已完成 3已取消',
pay_time TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES user(id),
FOREIGN KEY (doctor_id) REFERENCES doctor(id)
);
五、关键界面展示
5.1 登录界面
- 支持患者/管理员两种角色登录
- 密码采用MD5加密存储
- 记住用户名功能

5.2 患者主界面
采用JTabbedPane组织功能模块:
- 医院简介:展示医院基本信息
- 在线挂号:科室-医生-时段三级选择
- AI智能导诊:对话式症状分析
- 我的订单:查看历史预约记录
- 院内导航:楼层科室分布图

5.3 医生端界面
- 查看排班:日历形式展示排班
- 预约患者:管理预约患者列表
- 患者评价:查看患者反馈
5.4 管理员端界面
- 科室管理:增删改查科室信息
- 医生管理:医生信息维护
- 排班管理:手动/自动排班

六、项目亮点
6.1 技术创新
| 亮点 | 说明 |
|---|---|
| AI智能导诊 | 集成Coze AI,支持多轮对话,智能推荐科室 |
| 语音识别 | 百度语音API,支持语音输入症状 |
| 连接池 | 自定义连接池,提升数据库性能 |
| 定时任务 | ScheduledExecutorService处理超时订单 |
6.2 设计模式应用
Java
// 单例模式 - JDBC连接池
public class JDBCUtil {
private static JDBCUtil instance;
private JDBCUtil() {}
public static synchronized JDBCUtil getInstance() {
if (instance == null) {
instance = new JDBCUtil();
}
return instance;
}
}
// 观察者模式 - 数据更新通知
public interface DataObserver {
void onDataChanged();
}
// 工厂模式 - 创建不同角色视图
public class ViewFactory {
public static JFrame createView(User user) {
return switch (user.getRole()) {
case 1 -> new AdminMainView(user);
case 2 -> new PatientMainView(user);
default -> throw new IllegalArgumentException();
};
}
}
七、总结与展望
7.1 项目总结
本项目成功实现了一套功能完善的医院预约挂号系统:
✅ 功能完整 :覆盖挂号预约全流程,三端功能齐全
✅ AI赋能 :智能导诊提升患者就医体验
✅ 架构清晰 :三层架构,代码可维护性强
✅ 技术先进:Java 17 + 多线程 + AI集成
7.2 未来优化
| 方向 | 计划 |
|---|---|
| Web化 | Spring Boot + Vue前后端分离 |
| 移动端 | 微信小程序/APP开发 |
| AI增强 | 接入更多AI能力(预问诊、用药提醒) |
| 数据可视化 | ECharts图表展示运营数据 |
| 微服务 | 拆分用户/订单/排班服务 |
八、源码获取
GitHub地址 :hac88406-gif/java-hospital-system: GitHub Desktop tutorial repository
📝 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
如果本文对你有帮助,欢迎点赞、收藏、评论支持!有问题可以在评论区留言交流。
以上就是完整的CSDN博客内容,包含了项目概述、架构设计、核心功能实现、数据库设计、界面展示、项目亮点和总结展望等完整章节。你可以根据实际项目情况调整代码示例和截图部分。
