using System; using System.Collections.Generic; using System.Data; using Microsoft.Data.Sqlite; using 報到系統客戶端.Data; using 報到系統客戶端.Data.Models; namespace 報到系統客戶端.Data.Repositories { /// /// Classes 本地資料庫操作類別 /// public class ClassesRepository { private readonly DatabaseService _dbService; public ClassesRepository() { _dbService = DatabaseService.Instance; } /// /// 新增一筆 Classes 資料 /// public int Insert(LocalClassesItem item) { try { var conn = _dbService.GetConnection(); string sql = @" INSERT INTO Classes (ID, CourseCode, CourseName, CourseDate, CourseLocation, NotificationTemplate, AgreedTerms, StartTime, EndTime, CreatedAt, UpdatedAt) VALUES (@ID, @CourseCode, @CourseName, @CourseDate, @CourseLocation, @NotificationTemplate, @AgreedTerms, @StartTime, @EndTime, @CreatedAt, @UpdatedAt) "; using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { cmd.Parameters.AddWithValue("@ID", item.ID); cmd.Parameters.AddWithValue("@CourseCode", item.CourseCode ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@CourseName", item.CourseName ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@CourseDate", item.CourseDate ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@CourseLocation", item.CourseLocation ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@NotificationTemplate", item.NotificationTemplate ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@AgreedTerms", item.AgreedTerms ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@StartTime", item.StartTime ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@EndTime", item.EndTime ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@CreatedAt", DateTime.Now); cmd.Parameters.AddWithValue("@UpdatedAt", DateTime.Now); cmd.ExecuteNonQuery(); } // 返回傳入的 ID return item.ID; } catch (Exception ex) { throw new Exception($"新增 Classes 資料失敗:{ex.Message}", ex); } } /// /// 更新一筆 Classes 資料 /// public bool Update(LocalClassesItem item) { try { var conn = _dbService.GetConnection(); string sql = @" UPDATE Classes SET CourseCode = @CourseCode, CourseName = @CourseName, CourseDate = @CourseDate, CourseLocation = @CourseLocation, NotificationTemplate = @NotificationTemplate, AgreedTerms = @AgreedTerms, StartTime = @StartTime, EndTime = @EndTime, UpdatedAt = @UpdatedAt WHERE ID = @ID "; using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { cmd.Parameters.AddWithValue("@ID", item.ID); cmd.Parameters.AddWithValue("@CourseCode", item.CourseCode ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@CourseName", item.CourseName ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@CourseDate", item.CourseDate ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@CourseLocation", item.CourseLocation ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@NotificationTemplate", item.NotificationTemplate ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@AgreedTerms", item.AgreedTerms ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@StartTime", item.StartTime ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@EndTime", item.EndTime ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@UpdatedAt", DateTime.Now); return cmd.ExecuteNonQuery() > 0; } } catch (Exception ex) { throw new Exception($"更新 Classes 資料失敗:{ex.Message}", ex); } } /// /// 刪除一筆 Classes 資料 /// public bool Delete(int id) { try { var conn = _dbService.GetConnection(); string sql = "DELETE FROM Classes WHERE ID = @ID"; using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { cmd.Parameters.AddWithValue("@ID", id); return cmd.ExecuteNonQuery() > 0; } } catch (Exception ex) { throw new Exception($"刪除 Classes 資料失敗:{ex.Message}", ex); } } /// /// 查詢所有 Classes 資料 /// public List GetAll() { return Query("SELECT * FROM Classes ORDER BY ID"); } /// /// 查詢單筆 Classes 資料 /// public LocalClassesItem GetById(int id) { var result = Query($"SELECT * FROM Classes WHERE ID = {id}"); return result.Count > 0 ? result[0] : null; } /// /// 條件查詢 Classes 資料(分頁) /// public List GetByCondition(int pageIndex, int pageSize, string courseName = "", string courseCode = "", DateTime? startDate = null, DateTime? endDate = null) { try { var conn = _dbService.GetConnection(); string sql = "SELECT * FROM Classes WHERE 1=1"; if (!string.IsNullOrWhiteSpace(courseCode)) sql += " AND CourseCode LIKE '%' || @CourseCode || '%'"; if (!string.IsNullOrWhiteSpace(courseName)) sql += " AND CourseName LIKE '%' || @CourseName || '%'"; if (startDate.HasValue && endDate.HasValue) sql += " AND CourseDate >= @StartDate AND CourseDate <= @EndDate"; else if (startDate.HasValue) sql += " AND CourseDate >= @StartDate"; else if (endDate.HasValue) sql += " AND CourseDate <= @EndDate"; sql += " ORDER BY CourseDate DESC LIMIT @PageSize OFFSET @Offset"; List result = new List(); using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { if (!string.IsNullOrWhiteSpace(courseCode)) cmd.Parameters.AddWithValue("@CourseCode", courseCode); if (!string.IsNullOrWhiteSpace(courseName)) cmd.Parameters.AddWithValue("@CourseName", courseName); if (startDate.HasValue) cmd.Parameters.AddWithValue("@StartDate", startDate.Value); if (endDate.HasValue) cmd.Parameters.AddWithValue("@EndDate", endDate.Value); cmd.Parameters.AddWithValue("@PageSize", pageSize); cmd.Parameters.AddWithValue("@Offset", (pageIndex - 1) * pageSize); using (SqliteDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { result.Add(ReadClassesItem(reader)); } } } return result; } catch (Exception ex) { throw new Exception($"查詢 Classes 資料失敗:{ex.Message}", ex); } } /// /// 查詢 Classes 資料總數 /// public int GetCount(string courseName = "", string courseCode = "", DateTime? startDate = null, DateTime? endDate = null) { try { var conn = _dbService.GetConnection(); string sql = "SELECT COUNT(*) FROM Classes WHERE 1=1"; if (!string.IsNullOrWhiteSpace(courseCode)) sql += " AND CourseCode LIKE '%' || @CourseCode || '%'"; if (!string.IsNullOrWhiteSpace(courseName)) sql += " AND CourseName LIKE '%' || @CourseName || '%'"; if (startDate.HasValue && endDate.HasValue) sql += " AND CourseDate >= @StartDate AND CourseDate <= @EndDate"; else if (startDate.HasValue) sql += " AND CourseDate >= @StartDate"; else if (endDate.HasValue) sql += " AND CourseDate <= @EndDate"; using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { if (!string.IsNullOrWhiteSpace(courseCode)) cmd.Parameters.AddWithValue("@CourseCode", courseCode); if (!string.IsNullOrWhiteSpace(courseName)) cmd.Parameters.AddWithValue("@CourseName", courseName); if (startDate.HasValue) cmd.Parameters.AddWithValue("@StartDate", startDate.Value); if (endDate.HasValue) cmd.Parameters.AddWithValue("@EndDate", endDate.Value); return Convert.ToInt32(cmd.ExecuteScalar()); } } catch (Exception ex) { throw new Exception($"統計 Classes 資料失敗:{ex.Message}", ex); } } /// /// 清除所有 Classes 資料 /// public void DeleteAll() { try { var conn = _dbService.GetConnection(); using (SqliteCommand cmd = new SqliteCommand("DELETE FROM Classes", conn)) { cmd.ExecuteNonQuery(); } } catch (Exception ex) { throw new Exception($"清除 Classes 資料失敗:{ex.Message}", ex); } } /// /// 私用方法 - 執行查詢 /// private List Query(string sql) { try { var conn = _dbService.GetConnection(); List result = new List(); using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { using (SqliteDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { result.Add(ReadClassesItem(reader)); } } } return result; } catch (Exception ex) { throw new Exception($"查詢 Classes 失敗:{ex.Message}", ex); } } /// /// 私用方法 - 讀取資料列 /// private LocalClassesItem ReadClassesItem(SqliteDataReader reader) { return new LocalClassesItem { ID = reader.GetInt32(reader.GetOrdinal("ID")), CourseCode = reader.IsDBNull(reader.GetOrdinal("CourseCode")) ? null : reader.GetString(reader.GetOrdinal("CourseCode")), CourseName = reader.IsDBNull(reader.GetOrdinal("CourseName")) ? null : reader.GetString(reader.GetOrdinal("CourseName")), CourseDate = reader.IsDBNull(reader.GetOrdinal("CourseDate")) ? null : reader.GetString(reader.GetOrdinal("CourseDate")), CourseLocation = reader.IsDBNull(reader.GetOrdinal("CourseLocation")) ? null : reader.GetString(reader.GetOrdinal("CourseLocation")), NotificationTemplate = reader.IsDBNull(reader.GetOrdinal("NotificationTemplate")) ? null : reader.GetString(reader.GetOrdinal("NotificationTemplate")), AgreedTerms = reader.IsDBNull(reader.GetOrdinal("AgreedTerms")) ? null : reader.GetString(reader.GetOrdinal("AgreedTerms")), StartTime = reader.IsDBNull(reader.GetOrdinal("StartTime")) ? null : reader.GetString(reader.GetOrdinal("StartTime")), EndTime = reader.IsDBNull(reader.GetOrdinal("EndTime")) ? null : reader.GetString(reader.GetOrdinal("EndTime")), CreatedAt = reader.GetDateTime(reader.GetOrdinal("CreatedAt")), UpdatedAt = reader.GetDateTime(reader.GetOrdinal("UpdatedAt")) }; } } }