AlarmService.cs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using Model;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data.SQLite;
  5. using System.Linq;
  6. using System.Security.Claims;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. public class AlarmService
  10. {
  11. private static readonly object _lock = new object();
  12. public static void Log(Alarm alarm, User user)
  13. {
  14. LogInternal(new List<Alarm> { alarm }, user);
  15. }
  16. public static void LogBatch(IEnumerable<Alarm> alarms, User user)
  17. {
  18. LogInternal(alarms, user);
  19. }
  20. // 内部统一实现
  21. private static void LogInternal(IEnumerable<Alarm> alarms, User user)
  22. {
  23. lock (_lock) // 简单线程安全
  24. {
  25. using (var conn = new SQLiteConnection(DatabaseHelper.ConnectionString))
  26. {
  27. conn.Open();
  28. string sql = @"INSERT INTO AlarmLogs (UserId, Username, AlarmMessage, AlarmType, Timestamp)
  29. VALUES (@UserId, @Username, @AlarmMessage, @AlarmType, @Timestamp)";
  30. using (var tran = conn.BeginTransaction()) // 👈 关键:显式事务
  31. {
  32. foreach (var alarm in alarms)
  33. {
  34. using (var cmd = new SQLiteCommand(sql, conn))
  35. {
  36. cmd.Parameters.AddWithValue("@UserId", user.Id);
  37. cmd.Parameters.AddWithValue("@Username", user.Username);
  38. cmd.Parameters.AddWithValue("@AlarmMessage", alarm.AlarmMessage);
  39. cmd.Parameters.AddWithValue("@AlarmType", (int)alarm.AlarmType);
  40. cmd.Parameters.AddWithValue("@Timestamp", alarm.Timestamp.ToString("yyyy-MM-dd HH:mm:ss.fff"));
  41. cmd.ExecuteNonQuery();
  42. }
  43. }
  44. tran.Commit(); // 👈 所有写入一次性提交
  45. }
  46. }
  47. }
  48. }
  49. public static List<AlarmDisplay> GetAlarmsByTimeRange(DateTime start, DateTime end)
  50. {
  51. using (var connection = new SQLiteConnection(DatabaseHelper.ConnectionString))
  52. {
  53. connection.Open();
  54. var alarms = new List<AlarmDisplay>();
  55. string sql = @"
  56. SELECT Id, Timestamp, Username, AlarmMessage, AlarmType
  57. FROM AlarmLogs
  58. WHERE Timestamp BETWEEN @Start AND @End
  59. ORDER BY Timestamp DESC";
  60. using (var cmd = new SQLiteCommand(sql, connection))
  61. {
  62. // 参数化查询,防止注入
  63. cmd.Parameters.AddWithValue("@Start", start.ToString("yyyy-MM-dd HH:mm:ss"));
  64. cmd.Parameters.AddWithValue("@End", end.ToString("yyyy-MM-dd HH:mm:ss"));
  65. using (var reader = cmd.ExecuteReader())
  66. {
  67. while (reader.Read())
  68. {
  69. alarms.Add(new AlarmDisplay
  70. {
  71. Id = reader.GetInt32(0),
  72. Timestamp = DateTime.Parse(reader.GetString(1)),
  73. Username = reader.GetString(2),
  74. AlarmMessage = reader.GetString(3),
  75. AlarmType = ((AlarmType)reader.GetInt32(4)).ToString()
  76. });
  77. }
  78. }
  79. }
  80. return alarms;
  81. }
  82. }
  83. }