在现代医疗机构的日常运营中,人事考勤管理是保障医疗服务连续性的关键环节。传统医院普遍面临人员流动频繁、排班复杂、考勤数据分散等挑战,手工记录和Excel表格管理方式容易导致数据不一致、审批流程滞后。为解决这些痛点,我们设计并实现了一套基于SSM框架的医院智能人事管理平台,通过数字化手段重构了医院的人事考勤工作流。
系统架构与技术栈
该平台采用经典的三层架构设计,前端使用JSP动态页面技术结合jQuery实现用户交互,后端基于Spring+SpringMVC+MyBatis框架体系。Spring框架负责业务组件的依赖注入和事务管理,通过AOP切面统一处理权限验证和操作日志记录;SpringMVC采用RESTful风格接口设计,实现前后端数据交互的标准化;MyBatis作为数据持久层框架,通过XML映射文件灵活配置复杂的SQL查询逻辑。
项目采用Maven进行依赖管理,确保第三方库版本的一致性。数据库选用MySQL 5.7,通过InnoDB存储引擎保障事务的ACID特性,为医院人事数据提供可靠存储保障。
数据库设计亮点
考勤表设计:精细化时间记录
CREATE TABLE `attendance` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`employee_number` int(10) DEFAULT NULL COMMENT '员工编号',
`day` date DEFAULT NULL COMMENT '考勤日期',
`time_type` varchar(10) DEFAULT NULL COMMENT '时间类型',
`start_time` datetime DEFAULT NULL COMMENT '上班时间',
`start_type` varchar(10) DEFAULT NULL COMMENT '上班打卡类型',
`end_time` datetime DEFAULT NULL COMMENT '下班时间',
`end_type` varchar(10) DEFAULT NULL COMMENT '下班打卡类型',
`work_type` varchar(10) DEFAULT NULL COMMENT '工作类型',
`notes` varchar(255) DEFAULT NULL COMMENT '备注'
) ENGINE=InnoDB CHARSET=utf8 COMMENT='考勤表';
考勤表设计体现了对医疗行业特殊工作模式的深度理解。start_type和end_type字段记录打卡类型(正常、迟到、早退等),work_type区分常规班次与特殊排班,满足医院24小时轮班制需求。日期与时间分离存储的设计便于生成月度考勤统计报表。
请假表设计:状态驱动的工作流
CREATE TABLE `lea` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`employee_number` int(10) DEFAULT NULL COMMENT '员工编号',
`department_number` int(10) DEFAULT NULL COMMENT '部门编号',
`start_time` date DEFAULT NULL COMMENT '开始时间',
`end_time` date DEFAULT NULL COMMENT '结束时间',
`days` varchar(10) DEFAULT NULL COMMENT '请假天数',
`reason` varchar(100) DEFAULT NULL COMMENT '请假原因',
`type` enum('事假','病假') DEFAULT NULL COMMENT '请假类型',
`manager` varchar(10) DEFAULT NULL COMMENT '审批经理',
`status` enum('已批准','未批准') DEFAULT '未批准' COMMENT '审批状态',
`notes` varchar(255) DEFAULT NULL COMMENT '备注'
) ENGINE=InnoDB CHARSET=utf8 COMMENT='请假表';
请假表采用状态驱动设计,status字段控制审批流程流转。枚举类型严格限制请假类型和状态值,确保数据规范性。department_number与employee_number的双重关联支持按部门统计请假数据,为科室人力调配提供依据。
历史记录表设计:全生命周期追踪
CREATE TABLE `history` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`employee_number` int(10) DEFAULT NULL COMMENT '员工编号',
`name` varchar(10) DEFAULT NULL COMMENT '员工姓名',
`gender` enum('男','女') DEFAULT NULL COMMENT '性别',
`birthday` date DEFAULT NULL COMMENT '生日',
`telephone` varchar(20) DEFAULT '' COMMENT '电话',
`email` varchar(30) DEFAULT '' COMMENT '邮箱',
`in_time` date DEFAULT NULL COMMENT '入职时间',
`out_time` date DEFAULT NULL COMMENT '离职时间',
`department_number` int(10) DEFAULT NULL COMMENT '部门编号',
`position_number` int(10) DEFAULT NULL COMMENT '职位编号',
`status` enum('离职','在职','退休') DEFAULT NULL COMMENT '状态'
) ENGINE=InnoDB CHARSET=utf8 COMMENT='历史记录表';
历史记录表实现了员工全生命周期管理,通过in_time和out_time记录任职周期,status字段动态反映员工当前状态。该表作为人事数据仓库,支持员工流动分析和人力成本核算。

核心功能实现
智能考勤打卡机制
系统通过AttendanceController实现双轨制考勤记录,分别处理上班打卡和下班打卡业务逻辑:
@Controller
@RequestMapping("/attendance")
public class AttendanceController {
@Autowired
private AttendanceService attendanceService;
@RequestMapping("/addStart.do")
public String addStart(Integer employeeNumber){
attendanceService.addStart(employeeNumber);
return "welcome";
}
@RequestMapping("/addEnd.do")
public String addEnd(Integer employeeNumber){
attendanceService.addEnd(employeeNumber);
return "welcome";
}
}
Service层封装了复杂的考勤规则校验,包括迟到早退判断、连续工作时间计算等业务逻辑:
@Service
public class AttendanceServiceImpl implements AttendanceService {
@Override
public void addStart(Integer employeeNumber) {
// 检查是否重复打卡
Attendance todayRecord = attendanceMapper.selectByEmployeeAndDate(
employeeNumber, new Date());
if(todayRecord != null && todayRecord.getStartTime() != null) {
throw new BusinessException("今日已打卡,请勿重复操作");
}
// 创建考勤记录
Attendance attendance = new Attendance();
attendance.setEmployeeNumber(employeeNumber);
attendance.setDay(new Date());
attendance.setStartTime(new Date());
// 判断打卡类型(正常/迟到)
Date standardStartTime = getStandardStartTime(employeeNumber);
if(new Date().after(standardStartTime)) {
attendance.setStartType("迟到");
} else {
attendance.setStartType("正常");
}
attendanceMapper.insert(attendance);
}
}

请假审批工作流
请假管理模块实现了完整的申请-审批-归档流程,支持事假和病假两种类型:
@Service
public class LeaveServiceImpl implements LeaveService {
@Transactional
@Override
public void applyLeave(Leave leave) {
// 校验假期余额
Integer usedDays = leaveMapper.getUsedLeaveDays(
leave.getEmployeeNumber(), leave.getType(), getYear());
Integer totalDays = getTotalLeaveDays(leave.getEmployeeNumber(), leave.getType());
if(usedDays + leave.getDays() > totalDays) {
throw new BusinessException("假期余额不足");
}
// 自动计算审批路径
Employee employee = employeeMapper.selectByNumber(leave.getEmployeeNumber());
Department department = departmentMapper.selectByNumber(employee.getDepartmentNumber());
leave.setManager(department.getManager());
leave.setStatus("未批准");
leaveMapper.insert(leave);
// 发送审批通知
notificationService.sendLeaveApprovalNotice(department.getManager(), leave);
}
}
前端采用Ajax异步提交技术,实时验证表单数据并提示用户操作结果:
<script>
$('#leaveForm').submit(function(e) {
e.preventDefault();
$.ajax({
url: 'leave/apply.do',
type: 'POST',
data: $(this).serialize(),
success: function(response) {
if(response.success) {
$('#resultMessage').html('请假申请提交成功,等待审批');
$('#leaveForm')[0].reset();
} else {
$('#resultMessage').html('提交失败:' + response.message);
}
}
});
});
</script>

多维度考勤查询分析
系统提供灵活的考勤数据查询功能,支持按员工、部门、时间范围等多维度统计分析:
@Controller
@RequestMapping("/attendance")
public class AttendanceController {
@RequestMapping("/list.do")
public String selectList(Model model){
List<Attendance> list = attendanceService.selectList();
model.addAttribute("aList", list);
return "admin/attendance_list";
}
@RequestMapping("/{employeeNumber}/oneself.do")
public String select(Model model, @PathVariable Integer employeeNumber){
List<Attendance> list = attendanceService.selectByEmployee(employeeNumber);
model.addAttribute("aList", list);
return "admin/oneself_attendance";
}
}
MyBatis映射文件实现复杂关联查询,将考勤记录与员工信息进行联合查询:
<!-- AttendanceMapper.xml -->
<select id="selectList" resultMap="AttendanceResultMap">
SELECT a.*, e.name as employee_name, d.name as department_name
FROM attendance a
LEFT JOIN employee e ON a.employee_number = e.employee_number
LEFT JOIN department d ON e.department_number = d.department_number
WHERE a.day BETWEEN #{startDate} AND #{endDate}
ORDER BY a.day DESC, e.department_number
</select>

人员调动与历史追踪
员工调动模块记录完整的职业轨迹,确保人事变动的可追溯性:
@Entity
@Table(name = "move")
public class EmployeeTransfer {
private Integer id;
private Integer employeeNumber;
private Integer beforeDepartment; // 调动前部门
private Integer afterDepartment; // 调动后部门
private Date transferTime; // 调动时间
private String manager; // 审批经理
private String notes; // 调动原因
// 关联员工信息
private Employee employee;
private Department beforeDept;
private Department afterDept;
}
系统自动维护员工状态变更,当发生部门调动时,同步更新相关数据:
@Service
public class TransferServiceImpl implements TransferService {
@Transactional
@Override
public void processTransfer(EmployeeTransfer transfer) {
// 记录调动历史
transferMapper.insert(transfer);
// 更新员工当前部门
Employee employee = employeeMapper.selectByNumber(transfer.getEmployeeNumber());
employee.setDepartmentNumber(transfer.getAfterDepartment());
employeeMapper.update(employee);
// 记录人事变动日志
systemLogService.logTransfer(transfer);
}
}

实体模型设计
系统采用贫血模型设计,实体类严格对应数据库表结构,通过MyBatis-Plus注解简化数据访问操作:
@TableName("attendance")
public class Attendance extends Model<Attendance> implements Serializable{
private static final long serialVersionUID = 1L;
@TableId
private Integer id;
private Integer employeeNumber;
private Date day;
private String timeType;
private Date startTime;
private String startType;
private Date endTime;
private String endType;
private String workType;
private String notes;
@TableField(exist=false)
private Employee employee;
// Getter/Setter方法
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public Integer getEmployeeNumber() { return employeeNumber; }
public void setEmployeeNumber(Integer employeeNumber) {
this.employeeNumber = employeeNumber;
}
// 其他属性方法...
@Override
protected Serializable pkVal() {
return this.id;
}
}
实体类通过@TableField(exist=false)注解标注非持久化字段,支持业务层的数据关联查询,避免在数据库层面进行过多的表连接操作。
功能展望与优化
实时数据大屏展示
引入ECharts等数据可视化库,构建医院人力运营监控大屏。实时展示各科室在岗率、请假趋势、考勤异常预警等关键指标,为管理层决策提供数据支持。技术实现上可采用WebSocket推送实时数据更新。
移动端适配与小程序开发
开发微信小程序版本,实现移动端打卡、请假申请、审批操作等功能。利用uni-app框架实现跨平台开发,后端接口增加JWT令牌认证机制,保障移动端访问安全。
智能排班优化算法
集成遗传算法或约束规划技术,基于历史考勤数据、员工技能矩阵、科室需求预测等要素,自动生成最优排班方案。减少人工排班工作量,同时平衡员工工作负荷。
微服务架构改造
将单体应用拆分为考勤服务、人事服务、审批服务等独立微服务。通过Spring Cloud体系实现服务治理,配置API网关统一入口,提升系统可扩展性和容错能力。
数据审计与安全增强
增加操作日志全量记录功能,实现数据变更的完整审计追踪。引入ShardingSphere进行数据分片,对敏感人事信息进行加密存储,符合医疗行业数据安全规范要求。
总结
该医院智能人事管理平台通过精细化的数据库设计、严谨的业务逻辑实现和友好的用户交互体验,成功解决了传统医院人事管理中的核心痛点。系统采用成熟的SSM技术栈,保证了项目的稳定性和可维护性。实体模型设计合理,业务层封装完善,为后续功能扩展奠定了坚实基础。特别是在考勤规则处理、请假审批流程等核心业务场景中,展现了良好的工程实践和业务适配能力。
平台不仅实现了基础的人事考勤管理功能,更通过历史数据追踪、多维度统计分析等高级特性,为医院人力资源管理提供了深度价值。未来通过引入大数据分析、移动互联等新技术,有望进一步提升系统的智能化水平和用户体验,成为医疗行业数字化转型的重要支撑平台。