228 lines
8.9 KiB
Java
228 lines
8.9 KiB
Java
package dao.impl;
|
|
|
|
import dao.LeaveRequestDAO;
|
|
import model.ApprovalStatus;
|
|
import model.LeaveRequest;
|
|
import model.Student;
|
|
import model.Teacher;
|
|
import util.DatabaseUtil;
|
|
|
|
import java.sql.*;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
public class LeaveRequestDAOImpl implements LeaveRequestDAO {
|
|
private final StudentDAOImpl studentDAO = new StudentDAOImpl();
|
|
private final TeacherDAOImpl teacherDAO = new TeacherDAOImpl();
|
|
|
|
@Override
|
|
public int insert(LeaveRequest request) {
|
|
String sql = "INSERT INTO leave_requests (student_id, start_time, end_time, status, " +
|
|
"duration, location, reason_type, reason_detail, is_leaving_city, " +
|
|
"special_situation, request_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
|
|
|
try (Connection conn = DatabaseUtil.getConnection();
|
|
PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
|
|
|
|
stmt.setInt(1, request.getStudent().getId());
|
|
stmt.setTimestamp(2, new Timestamp(request.getStartTime().getTime()));
|
|
stmt.setTimestamp(3, new Timestamp(request.getEndTime().getTime()));
|
|
stmt.setString(4, request.getStatus().name());
|
|
stmt.setDouble(5, request.getDuration());
|
|
stmt.setString(6, request.getLocation());
|
|
stmt.setString(7, request.getReasonType());
|
|
stmt.setString(8, request.getReasonDetail());
|
|
stmt.setBoolean(9, request.isLeavingCity());
|
|
stmt.setString(10, request.getSpecialSituation());
|
|
stmt.setTimestamp(11, new Timestamp(request.getRequestTime().getTime()));
|
|
|
|
int affectedRows = stmt.executeUpdate();
|
|
if (affectedRows == 0) {
|
|
return 0;
|
|
}
|
|
|
|
try (ResultSet generatedKeys = stmt.getGeneratedKeys()) {
|
|
if (generatedKeys.next()) {
|
|
request.setId(generatedKeys.getInt(1));
|
|
}
|
|
}
|
|
return affectedRows;
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int deleteById(int id) {
|
|
String sql = "DELETE FROM leave_requests WHERE id = ?";
|
|
try (Connection conn = DatabaseUtil.getConnection();
|
|
PreparedStatement stmt = conn.prepareStatement(sql)) {
|
|
|
|
stmt.setInt(1, id);
|
|
return stmt.executeUpdate();
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int update(LeaveRequest request) {
|
|
String sql = "UPDATE leave_requests SET student_id = ?, start_time = ?, " +
|
|
"end_time = ?, status = ?, duration = ?, location = ?, " +
|
|
"reason_type = ?, reason_detail = ?, is_leaving_city = ?, " +
|
|
"special_situation = ?, request_time = ? WHERE id = ?";
|
|
try (Connection conn = DatabaseUtil.getConnection();
|
|
PreparedStatement stmt = conn.prepareStatement(sql)) {
|
|
|
|
stmt.setInt(1, request.getStudent().getId());
|
|
stmt.setTimestamp(2, new Timestamp(request.getStartTime().getTime()));
|
|
stmt.setTimestamp(3, new Timestamp(request.getEndTime().getTime()));
|
|
stmt.setString(4, request.getStatus().name());
|
|
stmt.setDouble(5, request.getDuration());
|
|
stmt.setString(6, request.getLocation());
|
|
stmt.setString(7, request.getReasonType());
|
|
stmt.setString(8, request.getReasonDetail());
|
|
stmt.setBoolean(9, request.isLeavingCity());
|
|
stmt.setString(10, request.getSpecialSituation());
|
|
stmt.setTimestamp(11, new Timestamp(request.getRequestTime().getTime()));
|
|
stmt.setInt(12, request.getId());
|
|
|
|
return stmt.executeUpdate();
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public LeaveRequest findById(int id) {
|
|
String sql = "SELECT lr.*, s.* FROM leave_requests lr " +
|
|
"JOIN students s ON lr.student_id = s.id " +
|
|
"WHERE lr.id = ?";
|
|
try (Connection conn = DatabaseUtil.getConnection();
|
|
PreparedStatement stmt = conn.prepareStatement(sql)) {
|
|
|
|
stmt.setInt(1, id);
|
|
ResultSet rs = stmt.executeQuery();
|
|
|
|
if (rs.next()) {
|
|
return mapResultSetToLeaveRequest(rs);
|
|
}
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public List<LeaveRequest> findAll() {
|
|
List<LeaveRequest> requests = new ArrayList<>();
|
|
String sql = "SELECT lr.*, s.* FROM leave_requests lr " +
|
|
"JOIN students s ON lr.student_id = s.id";
|
|
try (Connection conn = DatabaseUtil.getConnection();
|
|
Statement stmt = conn.createStatement();
|
|
ResultSet rs = stmt.executeQuery(sql)) {
|
|
|
|
while (rs.next()) {
|
|
requests.add(mapResultSetToLeaveRequest(rs));
|
|
}
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return requests;
|
|
}
|
|
|
|
@Override
|
|
public List<LeaveRequest> findByStudentId(int studentId) {
|
|
List<LeaveRequest> requests = new ArrayList<>();
|
|
String sql = "SELECT lr.*, s.* FROM leave_requests lr " +
|
|
"JOIN students s ON lr.student_id = s.id " +
|
|
"WHERE lr.student_id = ? ORDER BY lr.request_time DESC";
|
|
try (Connection conn = DatabaseUtil.getConnection();
|
|
PreparedStatement stmt = conn.prepareStatement(sql)) {
|
|
|
|
stmt.setInt(1, studentId);
|
|
ResultSet rs = stmt.executeQuery();
|
|
|
|
while (rs.next()) {
|
|
requests.add(mapResultSetToLeaveRequest(rs));
|
|
}
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return requests;
|
|
}
|
|
|
|
@Override
|
|
public List<LeaveRequest> findByStatus(ApprovalStatus status) {
|
|
List<LeaveRequest> requests = new ArrayList<>();
|
|
String sql = "SELECT lr.*, s.* FROM leave_requests lr " +
|
|
"JOIN students s ON lr.student_id = s.id " +
|
|
"WHERE lr.status = ? ORDER BY lr.request_time DESC";
|
|
try (Connection conn = DatabaseUtil.getConnection();
|
|
PreparedStatement stmt = conn.prepareStatement(sql)) {
|
|
|
|
stmt.setString(1, status.name());
|
|
ResultSet rs = stmt.executeQuery();
|
|
|
|
while (rs.next()) {
|
|
requests.add(mapResultSetToLeaveRequest(rs));
|
|
}
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
}
|
|
return requests;
|
|
}
|
|
|
|
@Override
|
|
public int updateStatus(int requestId, ApprovalStatus status, String comment) {
|
|
String sql = "UPDATE leave_requests SET status = ?, approval_comment = ?, approval_time = ? WHERE id = ?";
|
|
try (Connection conn = DatabaseUtil.getConnection();
|
|
PreparedStatement stmt = conn.prepareStatement(sql)) {
|
|
|
|
stmt.setString(1, status.name());
|
|
stmt.setString(2, comment);
|
|
stmt.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
|
|
stmt.setInt(4, requestId);
|
|
|
|
return stmt.executeUpdate();
|
|
} catch (SQLException e) {
|
|
e.printStackTrace();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
private LeaveRequest mapResultSetToLeaveRequest(ResultSet rs) throws SQLException {
|
|
LeaveRequest request = new LeaveRequest();
|
|
request.setId(rs.getInt("id"));
|
|
request.setLocation(rs.getString("location"));
|
|
request.setStartTime(rs.getTimestamp("start_time"));
|
|
request.setEndTime(rs.getTimestamp("end_time"));
|
|
request.setStatus(ApprovalStatus.valueOf(rs.getString("status")));
|
|
request.setDuration(rs.getDouble("duration"));
|
|
request.setReasonType(rs.getString("reason_type"));
|
|
request.setReasonDetail(rs.getString("reason_detail"));
|
|
request.setLeavingCity(rs.getBoolean("is_leaving_city"));
|
|
request.setSpecialSituation(rs.getString("special_situation"));
|
|
request.setRequestTime(rs.getTimestamp("request_time"));
|
|
|
|
// 设置学生信息
|
|
Student student = new Student();
|
|
student.setId(rs.getInt("student_id"));
|
|
student.setStudentId(rs.getString("student_id"));
|
|
student.setName(rs.getString("name"));
|
|
student.setClassName(rs.getString("class_name"));
|
|
student.setContact(rs.getString("contact"));
|
|
request.setStudent(student);
|
|
|
|
Timestamp approvalTime = rs.getTimestamp("approval_time");
|
|
if (approvalTime != null) {
|
|
request.setApprovalTime(approvalTime);
|
|
}
|
|
|
|
return request;
|
|
}
|
|
}
|