OperationRecordManagement.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. //值变更记录管理
  2. using MvvmScaffoldFrame48.Model.StorageModel.AuditTrail;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data.SQLite;
  6. using System.IO;
  7. using System.Threading.Tasks;
  8. namespace MvvmScaffoldFrame48.DLL.AuditTrail
  9. {
  10. public class OperationRecordManagement
  11. {
  12. private readonly string _dbPath;
  13. private string _connString;
  14. private object locker = new object();
  15. /// <summary>
  16. /// 构造函数
  17. /// </summary>
  18. public OperationRecordManagement()
  19. {
  20. _dbPath = $"{AppDomain.CurrentDomain.BaseDirectory}DATA\\AuditTrail.db";
  21. // 1. 获取文件夹路径
  22. string directoryPath = Path.GetDirectoryName(_dbPath);
  23. // 2. 检查文件夹是否存在
  24. if (!Directory.Exists(directoryPath))
  25. {
  26. // 创建文件夹
  27. Directory.CreateDirectory(directoryPath);
  28. }
  29. InitializeDatabase();
  30. }
  31. /// <summary>
  32. /// 构造函数(指定数据库路径)
  33. /// </summary>
  34. /// <param name="dbPath"></param>
  35. public OperationRecordManagement(string dbPath)
  36. {
  37. if(dbPath == null|| dbPath == "")
  38. {
  39. _dbPath = $"{AppDomain.CurrentDomain.BaseDirectory}DATA\\AuditTrail.db";
  40. }
  41. else
  42. {
  43. _dbPath = dbPath;
  44. }
  45. // 1. 获取文件夹路径
  46. string directoryPath = Path.GetDirectoryName(_dbPath);
  47. // 2. 检查文件夹是否存在
  48. if (!Directory.Exists(directoryPath))
  49. {
  50. // 创建文件夹
  51. Directory.CreateDirectory(directoryPath);
  52. }
  53. InitializeDatabase();
  54. }
  55. /// <summary>
  56. /// 初始化数据库和表
  57. /// </summary>
  58. private void InitializeDatabase()
  59. {
  60. if (!File.Exists(_dbPath))
  61. {
  62. SQLiteConnection.CreateFile(_dbPath);
  63. }
  64. _connString = $"Data Source={_dbPath};Version=3;" +
  65. "Journal Mode=WAL;" + // 使用WAL模式提高并发性
  66. "Synchronous=Normal;" + // 平衡性能和安全性
  67. "Cache Size=10000;" + // 增加缓存大小
  68. "Pooling=true;" + // 启用连接池
  69. "Max Pool Size=100;"; // 设置最大连接池大小
  70. using (var conn = new SQLiteConnection(_connString))
  71. {
  72. conn.Open();
  73. string createTableSql = @"
  74. CREATE TABLE IF NOT EXISTS OperationRecord (
  75. ID INTEGER PRIMARY KEY AUTOINCREMENT,
  76. Category TEXT NOT NULL,
  77. OldMessage TEXT NOT NULL,
  78. NewMessage TEXT NOT NULL,
  79. DateTime TEXT NOT NULL,
  80. userID INTEGER NOT NULL,
  81. IsDeleted INTEGER CHECK (IsDeleted IN (0, 1))
  82. )";
  83. new SQLiteCommand(createTableSql, conn).ExecuteNonQuery();
  84. }
  85. }
  86. /// <summary>
  87. /// 插入数据
  88. /// </summary>
  89. /// <param name="Message"></param>
  90. public void InsertOperationRecord(OperationRecordModel Message)
  91. {
  92. lock (locker)
  93. {
  94. using (var conn = new SQLiteConnection(_connString))
  95. {
  96. conn.Open();
  97. string sql = "INSERT INTO OperationRecord (Category,OldMessage,NewMessage,DateTime,userID,IsDeleted) VALUES (@Category, @OldMessage,@NewMessage, @DateTime, @userID,@IsDeleted)";
  98. var cmd = new SQLiteCommand(sql, conn);
  99. cmd.Parameters.AddWithValue("@Category", Message.Category);
  100. cmd.Parameters.AddWithValue("@OldMessage", Message.OldMessage);
  101. cmd.Parameters.AddWithValue("@NewMessage", Message.NewMessage);
  102. cmd.Parameters.AddWithValue("@DateTime", Message.DateTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));
  103. cmd.Parameters.AddWithValue("@userID", Message.userID); // 格式化为字符串
  104. cmd.Parameters.AddWithValue("@IsDeleted", Message.IsDeleted == true ? 1 : 0);
  105. cmd.ExecuteNonQuery();
  106. }
  107. }
  108. }
  109. /// <summary>
  110. /// 查询所有数据
  111. /// </summary>
  112. /// <returns></returns>
  113. public List<OperationRecordModel> GetAllOperationRecord()
  114. {
  115. var persons = new List<OperationRecordModel>();
  116. using (var conn = new SQLiteConnection(_connString))
  117. {
  118. conn.Open();
  119. string sql = "SELECT * FROM OperationRecord WHERE IsDeleted=0";
  120. var cmd = new SQLiteCommand(sql, conn);
  121. using (SQLiteDataReader reader = cmd.ExecuteReader())
  122. {
  123. while (reader.Read())
  124. {
  125. persons.Add(new OperationRecordModel
  126. {
  127. ID = Convert.ToInt32(reader["ID"]),
  128. Category = reader["Category"].ToString(),
  129. OldMessage = reader["OldMessage"].ToString(),
  130. NewMessage = reader["NewMessage"].ToString(),
  131. // 解析时间字符串
  132. DateTime = DateTime.Parse(reader["DateTime"].ToString()),
  133. userID = Convert.ToInt32(reader["userID"]),
  134. IsDeleted = Convert.ToInt32(reader["IsDeleted"]) == 1 ? true : false
  135. });
  136. }
  137. }
  138. }
  139. return persons;
  140. }
  141. /// <summary>
  142. /// 获取值改变信息
  143. /// </summary>
  144. /// <param name="UserID">操作员ID</param>
  145. /// <returns></returns>
  146. public List<OperationRecordModel> GetOperationRecordByID(int UserID)
  147. {
  148. var persons = new List<OperationRecordModel>();
  149. using (var conn = new SQLiteConnection(_connString))
  150. {
  151. conn.Open();
  152. string sql = "SELECT * FROM OperationRecord WHERE userID=@userID AND IsDeleted=0";
  153. var cmd = new SQLiteCommand(sql, conn);
  154. cmd.Parameters.AddWithValue("@userID", UserID);
  155. using (SQLiteDataReader reader = cmd.ExecuteReader())
  156. {
  157. while (reader.Read())
  158. {
  159. persons.Add(new OperationRecordModel
  160. {
  161. ID = Convert.ToInt32(reader["ID"]),
  162. Category = reader["Category"].ToString(),
  163. OldMessage = reader["OldMessage"].ToString(),
  164. NewMessage = reader["NewMessage"].ToString(),
  165. // 解析时间字符串
  166. DateTime = DateTime.Parse(reader["DateTime"].ToString()),
  167. userID = Convert.ToInt32(reader["userID"]),
  168. IsDeleted = Convert.ToInt32(reader["IsDeleted"]) == 1 ? true : false
  169. });
  170. }
  171. }
  172. }
  173. return persons;
  174. }
  175. /// <summary>
  176. /// 获取指定日期的值改变信息
  177. /// </summary>
  178. /// <param name="OperationDateTime"></param>
  179. /// <returns></returns>
  180. public List<OperationRecordModel> GetOperationRecordByDateTime(DateTime OperationDateTime)
  181. {
  182. var persons = new List<OperationRecordModel>();
  183. using (var conn = new SQLiteConnection(_connString))
  184. {
  185. conn.Open();
  186. string sql = "SELECT * FROM OperationRecord WHERE date(DateTime) = date(@DateTime) AND IsDeleted=0";
  187. var cmd = new SQLiteCommand(sql, conn);
  188. cmd.Parameters.AddWithValue("@DateTime", OperationDateTime.ToString("yyyy-MM-dd"));
  189. using (SQLiteDataReader reader = cmd.ExecuteReader())
  190. {
  191. while (reader.Read())
  192. {
  193. persons.Add(new OperationRecordModel
  194. {
  195. ID = Convert.ToInt32(reader["ID"]),
  196. Category = reader["Category"].ToString(),
  197. OldMessage = reader["OldMessage"].ToString(),
  198. NewMessage = reader["NewMessage"].ToString(),
  199. // 解析时间字符串
  200. DateTime = DateTime.Parse(reader["DateTime"].ToString()),
  201. userID = Convert.ToInt32(reader["userID"]),
  202. IsDeleted = Convert.ToInt32(reader["IsDeleted"]) == 1 ? true : false
  203. });
  204. }
  205. }
  206. }
  207. return persons;
  208. }
  209. /// <summary>
  210. /// 获取指定时间段内的值改变信息
  211. /// </summary>
  212. public List<OperationRecordModel> GetOperationRecordByDateTime(DateTime OperationStartDateTime, DateTime OperationEndDateTime)
  213. {
  214. var persons = new List<OperationRecordModel>();
  215. using (var conn = new SQLiteConnection(_connString))
  216. {
  217. conn.Open();
  218. string sql = "SELECT * FROM OperationRecord WHERE date(DateTime) >= date(@StartDateTime) AND date(DateTime) <= date(@EndDateTime) AND IsDeleted=0";
  219. var cmd = new SQLiteCommand(sql, conn);
  220. cmd.Parameters.AddWithValue("@StartDateTime", OperationStartDateTime.ToString("yyyy-MM-dd"));
  221. cmd.Parameters.AddWithValue("@EndDateTime", OperationEndDateTime.ToString("yyyy-MM-dd"));
  222. using (SQLiteDataReader reader = cmd.ExecuteReader())
  223. {
  224. while (reader.Read())
  225. {
  226. persons.Add(new OperationRecordModel
  227. {
  228. ID = Convert.ToInt32(reader["ID"]),
  229. Category = reader["Category"].ToString(),
  230. OldMessage = reader["OldMessage"].ToString(),
  231. NewMessage = reader["NewMessage"].ToString(),
  232. // 解析时间字符串
  233. DateTime = DateTime.Parse(reader["DateTime"].ToString()),
  234. userID = Convert.ToInt32(reader["userID"]),
  235. IsDeleted = Convert.ToInt32(reader["IsDeleted"]) == 1 ? true : false
  236. });
  237. }
  238. }
  239. }
  240. return persons;
  241. }
  242. }
  243. }