using System; using System.Collections.Generic; using System.Data; using Microsoft.Data.Sqlite; using 報到系統客戶端.Data.Models; namespace 報到系統客戶端.Data.Repositories { /// /// BPSN 本地資料庫操作類別 /// 對應員工資料 /// public class BPSNRepository { private readonly DatabaseService _dbService; public BPSNRepository() { _dbService = DatabaseService.Instance; } /// /// 新增一筆 BPSN 資料 /// public bool Insert(LocalBPSNItem item) { try { var conn = _dbService.GetConnection(); string sql = @" INSERT OR REPLACE INTO BPSN (BPENO, BPNME, BPAWD, Is系統管理群組, Is客戶管理群組, Is現場工作群組, Is查詢群組, CreatedAt, UpdatedAt) VALUES (@BPENO, @BPNME, @BPAWD, @Is系統管理群組, @Is客戶管理群組, @Is現場工作群組, @Is查詢群組, @CreatedAt, @UpdatedAt) "; using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { cmd.Parameters.AddWithValue("@BPENO", item.BPENO ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@BPNME", item.BPNME ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@BPAWD", item.BPAWD ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@Is系統管理群組", item.Is系統管理群組 ? 1 : 0); cmd.Parameters.AddWithValue("@Is客戶管理群組", item.Is客戶管理群組 ? 1 : 0); cmd.Parameters.AddWithValue("@Is現場工作群組", item.Is現場工作群組 ? 1 : 0); cmd.Parameters.AddWithValue("@Is查詢群組", item.Is查詢群組 ? 1 : 0); cmd.Parameters.AddWithValue("@CreatedAt", DateTime.Now); cmd.Parameters.AddWithValue("@UpdatedAt", DateTime.Now); return cmd.ExecuteNonQuery() > 0; } } catch (Exception ex) { throw new Exception($"新增 BPSN 資料失敗:{ex.Message}", ex); } } /// /// 批量新增 BPSN 資料 /// public void InsertBatch(List items) { try { var conn = _dbService.GetConnection(); using (SqliteTransaction transaction = conn.BeginTransaction()) { try { foreach (LocalBPSNItem item in items) { string sql = @" INSERT OR REPLACE INTO BPSN (BPENO, BPNME, BPAWD, Is系統管理群組, Is客戶管理群組, Is現場工作群組, Is查詢群組, CreatedAt, UpdatedAt) VALUES (@BPENO, @BPNME, @BPAWD, @Is系統管理群組, @Is客戶管理群組, @Is現場工作群組, @Is查詢群組, @CreatedAt, @UpdatedAt) "; using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { cmd.Transaction = transaction; cmd.Parameters.AddWithValue("@BPENO", item.BPENO ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@BPNME", item.BPNME ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@BPAWD", item.BPAWD ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@Is系統管理群組", item.Is系統管理群組 ? 1 : 0); cmd.Parameters.AddWithValue("@Is客戶管理群組", item.Is客戶管理群組 ? 1 : 0); cmd.Parameters.AddWithValue("@Is現場工作群組", item.Is現場工作群組 ? 1 : 0); cmd.Parameters.AddWithValue("@Is查詢群組", item.Is查詢群組 ? 1 : 0); cmd.Parameters.AddWithValue("@CreatedAt", DateTime.Now); cmd.Parameters.AddWithValue("@UpdatedAt", DateTime.Now); cmd.ExecuteNonQuery(); } } transaction.Commit(); } catch (Exception) { transaction.Rollback(); throw; } } } catch (Exception ex) { throw new Exception($"批量新增 BPSN 資料失敗:{ex.Message}", ex); } } /// /// 更新一筆 BPSN 資料 /// public bool Update(LocalBPSNItem item) { try { var conn = _dbService.GetConnection(); string sql = @" UPDATE BPSN SET BPNME = @BPNME, BPAWD = @BPAWD, Is系統管理群組 = @Is系統管理群組, Is客戶管理群組 = @Is客戶管理群組, Is現場工作群組 = @Is現場工作群組, Is查詢群組 = @Is查詢群組, UpdatedAt = @UpdatedAt WHERE BPENO = @BPENO "; using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { cmd.Parameters.AddWithValue("@BPENO", item.BPENO ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@BPNME", item.BPNME ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@BPAWD", item.BPAWD ?? (object)DBNull.Value); cmd.Parameters.AddWithValue("@Is系統管理群組", item.Is系統管理群組 ? 1 : 0); cmd.Parameters.AddWithValue("@Is客戶管理群組", item.Is客戶管理群組 ? 1 : 0); cmd.Parameters.AddWithValue("@Is現場工作群組", item.Is現場工作群組 ? 1 : 0); cmd.Parameters.AddWithValue("@Is查詢群組", item.Is查詢群組 ? 1 : 0); cmd.Parameters.AddWithValue("@UpdatedAt", DateTime.Now); return cmd.ExecuteNonQuery() > 0; } } catch (Exception ex) { throw new Exception($"更新 BPSN 資料失敗:{ex.Message}", ex); } } /// /// 刪除一筆 BPSN 資料 /// public bool Delete(string bpeno) { try { var conn = _dbService.GetConnection(); string sql = "DELETE FROM BPSN WHERE BPENO = @BPENO"; using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { cmd.Parameters.AddWithValue("@BPENO", bpeno ?? (object)DBNull.Value); return cmd.ExecuteNonQuery() > 0; } } catch (Exception ex) { throw new Exception($"刪除 BPSN 資料失敗:{ex.Message}", ex); } } /// /// 查詢所有 BPSN 資料 /// public List GetAll() { return Query("SELECT * FROM BPSN ORDER BY BPENO ASC"); } /// /// 查詢單筆 BPSN 資料 /// public LocalBPSNItem GetByBPENO(string bpeno) { try { var conn = _dbService.GetConnection(); string sql = "SELECT * FROM BPSN WHERE BPENO = @BPENO LIMIT 1"; using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { cmd.Parameters.AddWithValue("@BPENO", bpeno ?? (object)DBNull.Value); using (SqliteDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { return ReadBPSNItem(reader); } } } return null; } catch (Exception ex) { throw new Exception($"查詢 BPSN 資料失敗:{ex.Message}", ex); } } /// /// 條件查詢 BPSN 資料(分頁) /// public List GetByCondition(int pageIndex, int pageSize, string bpeno = "", string bpnme = "") { try { var conn = _dbService.GetConnection(); string sql = "SELECT * FROM BPSN WHERE 1=1"; if (!string.IsNullOrWhiteSpace(bpeno)) sql += " AND BPENO LIKE '%' || @BPENO || '%'"; if (!string.IsNullOrWhiteSpace(bpnme)) sql += " AND BPNME LIKE '%' || @BPNME || '%'"; sql += " ORDER BY BPENO ASC LIMIT @PageSize OFFSET @Offset"; List result = new List(); using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { if (!string.IsNullOrWhiteSpace(bpeno)) cmd.Parameters.AddWithValue("@BPENO", bpeno); if (!string.IsNullOrWhiteSpace(bpnme)) cmd.Parameters.AddWithValue("@BPNME", bpnme); cmd.Parameters.AddWithValue("@PageSize", pageSize); cmd.Parameters.AddWithValue("@Offset", (pageIndex - 1) * pageSize); using (SqliteDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { result.Add(ReadBPSNItem(reader)); } } } return result; } catch (Exception ex) { throw new Exception($"查詢 BPSN 資料失敗:{ex.Message}", ex); } } /// /// 查詢 BPSN 資料總數 /// public int GetCount(string bpeno = "", string bpnme = "") { try { var conn = _dbService.GetConnection(); string sql = "SELECT COUNT(*) FROM BPSN WHERE 1=1"; if (!string.IsNullOrWhiteSpace(bpeno)) sql += " AND BPENO LIKE '%' || @BPENO || '%'"; if (!string.IsNullOrWhiteSpace(bpnme)) sql += " AND BPNME LIKE '%' || @BPNME || '%'"; using (SqliteCommand cmd = new SqliteCommand(sql, conn)) { if (!string.IsNullOrWhiteSpace(bpeno)) cmd.Parameters.AddWithValue("@BPENO", bpeno); if (!string.IsNullOrWhiteSpace(bpnme)) cmd.Parameters.AddWithValue("@BPNME", bpnme); return Convert.ToInt32(cmd.ExecuteScalar()); } } catch (Exception ex) { throw new Exception($"統計 BPSN 資料失敗:{ex.Message}", ex); } } /// /// 清除所有 BPSN 資料 /// public void DeleteAll() { try { var conn = _dbService.GetConnection(); using (SqliteCommand cmd = new SqliteCommand("DELETE FROM BPSN", conn)) { cmd.ExecuteNonQuery(); } } catch (Exception ex) { throw new Exception($"清除 BPSN 資料失敗:{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(ReadBPSNItem(reader)); } } } return result; } catch (Exception ex) { throw new Exception($"查詢 BPSN 失敗:{ex.Message}", ex); } } /// /// 私用方法 - 讀取資料列 /// private LocalBPSNItem ReadBPSNItem(SqliteDataReader reader) { return new LocalBPSNItem { BPENO = reader.IsDBNull(reader.GetOrdinal("BPENO")) ? null : reader.GetString(reader.GetOrdinal("BPENO")), BPNME = reader.IsDBNull(reader.GetOrdinal("BPNME")) ? null : reader.GetString(reader.GetOrdinal("BPNME")), BPAWD = reader.IsDBNull(reader.GetOrdinal("BPAWD")) ? null : reader.GetString(reader.GetOrdinal("BPAWD")), Is系統管理群組 = reader.GetInt32(reader.GetOrdinal("Is系統管理群組")) != 0, Is客戶管理群組 = reader.GetInt32(reader.GetOrdinal("Is客戶管理群組")) != 0, Is現場工作群組 = reader.GetInt32(reader.GetOrdinal("Is現場工作群組")) != 0, Is查詢群組 = reader.GetInt32(reader.GetOrdinal("Is查詢群組")) != 0, CreatedAt = reader.GetDateTime(reader.GetOrdinal("CreatedAt")), UpdatedAt = reader.GetDateTime(reader.GetOrdinal("UpdatedAt")) }; } } }