You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
5.5 KiB
146 lines
5.5 KiB
package com.student.dao.impl;
|
|
|
|
import com.student.bean.LeaveRequest;
|
|
import com.student.dao.LeaveDao;
|
|
import com.student.util.DBUtil;
|
|
|
|
import java.sql.Connection;
|
|
import java.sql.Date;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
import java.sql.SQLException;
|
|
import java.sql.Timestamp;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
public class LeaveDaoImpl implements LeaveDao {
|
|
|
|
private static final String BASE_SQL =
|
|
"SELECT l.id, l.student_id, l.start_date, l.end_date, l.reason, l.status, "
|
|
+ "l.approver_id, l.approve_note, l.approve_time, l.create_time, "
|
|
+ "u.real_name AS student_name, u.student_no, a.real_name AS approver_name "
|
|
+ "FROM leave_request l "
|
|
+ "JOIN users u ON l.student_id = u.id "
|
|
+ "LEFT JOIN users a ON l.approver_id = a.id ";
|
|
|
|
@Override
|
|
public boolean submit(LeaveRequest request) {
|
|
String sql = "INSERT INTO leave_request (student_id, start_date, end_date, reason, status) "
|
|
+ "VALUES (?, ?, ?, ?, ?)";
|
|
Connection conn = null;
|
|
PreparedStatement ps = null;
|
|
try {
|
|
conn = DBUtil.getConnection();
|
|
ps = conn.prepareStatement(sql);
|
|
ps.setInt(1, request.getStudentId());
|
|
ps.setDate(2, new Date(request.getStartDate().getTime()));
|
|
ps.setDate(3, new Date(request.getEndDate().getTime()));
|
|
ps.setString(4, request.getReason());
|
|
ps.setInt(5, LeaveRequest.STATUS_PENDING);
|
|
return ps.executeUpdate() > 0;
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException("提交请假申请失败", e);
|
|
} finally {
|
|
DBUtil.close(conn, ps);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean approve(int id, int approverId, String note) {
|
|
return updateStatus(id, approverId, note, LeaveRequest.STATUS_APPROVED);
|
|
}
|
|
|
|
@Override
|
|
public boolean reject(int id, int approverId, String note) {
|
|
return updateStatus(id, approverId, note, LeaveRequest.STATUS_REJECTED);
|
|
}
|
|
|
|
private boolean updateStatus(int id, int approverId, String note, int status) {
|
|
String sql = "UPDATE leave_request SET status=?, approver_id=?, approve_note=?, approve_time=NOW() WHERE id=?";
|
|
Connection conn = null;
|
|
PreparedStatement ps = null;
|
|
try {
|
|
conn = DBUtil.getConnection();
|
|
ps = conn.prepareStatement(sql);
|
|
ps.setInt(1, status);
|
|
ps.setInt(2, approverId);
|
|
ps.setString(3, note);
|
|
ps.setInt(4, id);
|
|
return ps.executeUpdate() > 0;
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException("审批请假失败", e);
|
|
} finally {
|
|
DBUtil.close(conn, ps);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public List<LeaveRequest> findPending() {
|
|
return queryList(BASE_SQL + " WHERE l.status = 0 ORDER BY l.create_time ASC");
|
|
}
|
|
|
|
@Override
|
|
public List<LeaveRequest> findByStudent(int studentId) {
|
|
return queryList(BASE_SQL + " WHERE l.student_id = ? ORDER BY l.create_time DESC", studentId);
|
|
}
|
|
|
|
@Override
|
|
public LeaveRequest findById(int id) {
|
|
List<LeaveRequest> list = queryList(BASE_SQL + " WHERE l.id = ?", id);
|
|
return list.isEmpty() ? null : list.get(0);
|
|
}
|
|
|
|
private List<LeaveRequest> queryList(String sql, Object... params) {
|
|
List<LeaveRequest> list = new ArrayList<>();
|
|
Connection conn = null;
|
|
PreparedStatement ps = null;
|
|
ResultSet rs = null;
|
|
try {
|
|
conn = DBUtil.getConnection();
|
|
ps = conn.prepareStatement(sql);
|
|
for (int i = 0; i < params.length; i++) {
|
|
ps.setObject(i + 1, params[i]);
|
|
}
|
|
rs = ps.executeQuery();
|
|
while (rs.next()) {
|
|
list.add(mapRow(rs));
|
|
}
|
|
} catch (SQLException e) {
|
|
throw new RuntimeException("查询请假记录失败", e);
|
|
} finally {
|
|
DBUtil.close(conn, ps, rs);
|
|
}
|
|
return list;
|
|
}
|
|
|
|
private LeaveRequest mapRow(ResultSet rs) throws SQLException {
|
|
LeaveRequest req = new LeaveRequest();
|
|
req.setId(rs.getInt("id"));
|
|
req.setStudentId(rs.getInt("student_id"));
|
|
Date startDate = rs.getDate("start_date");
|
|
if (startDate != null) {
|
|
req.setStartDate(new java.util.Date(startDate.getTime()));
|
|
}
|
|
Date endDate = rs.getDate("end_date");
|
|
if (endDate != null) {
|
|
req.setEndDate(new java.util.Date(endDate.getTime()));
|
|
}
|
|
req.setReason(rs.getString("reason"));
|
|
req.setStatus(rs.getInt("status"));
|
|
int approverId = rs.getInt("approver_id");
|
|
req.setApproverId(rs.wasNull() ? null : approverId);
|
|
req.setApproveNote(rs.getString("approve_note"));
|
|
Timestamp approveTime = rs.getTimestamp("approve_time");
|
|
if (approveTime != null) {
|
|
req.setApproveTime(new java.util.Date(approveTime.getTime()));
|
|
}
|
|
Timestamp createTime = rs.getTimestamp("create_time");
|
|
if (createTime != null) {
|
|
req.setCreateTime(new java.util.Date(createTime.getTime()));
|
|
}
|
|
req.setStudentName(rs.getString("student_name"));
|
|
req.setStudentNo(rs.getString("student_no"));
|
|
req.setApproverName(rs.getString("approver_name"));
|
|
return req;
|
|
}
|
|
}
|
|
|