RecordRepository.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. using Dapper;
  2. using SWRIS.Core;
  3. using SWRIS.Dtos;
  4. using SWRIS.Extensions;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. namespace SWRIS.Repository
  9. {
  10. public class RecordRepository : SqLiteBaseRepository, IRecordRepository
  11. {
  12. public RecordDto GetRecord(int id)
  13. {
  14. using (var cnn = DbConnection())
  15. {
  16. cnn.Open();
  17. try
  18. {
  19. RecordDto result = cnn.QueryFirstOrDefault<RecordDto>(
  20. @"SELECT Id,
  21. RopeNumber,
  22. RopeName,
  23. StartTime,
  24. EndTime,
  25. StartPoint,
  26. EndPoint,
  27. DetectionLength,
  28. DetectedSpeed,
  29. RiskLevel,
  30. DamageCount,
  31. DataFilePath,
  32. SensorCount,
  33. SamplingStep,
  34. ExportCount,
  35. InUseSensors
  36. FROM Records
  37. WHERE Id = @id", new { id });
  38. if (result != null)
  39. {
  40. var damages = cnn.Query<DamageDto>(
  41. @"SELECT Id,
  42. RecordId,
  43. DamagePoint,
  44. DamageValue,
  45. DamageLevel
  46. FROM Damages
  47. WHERE RecordId = @id", new { id }).ToList();
  48. result.Damages.AddRange(damages);
  49. }
  50. return result;
  51. }
  52. catch (Exception ex)
  53. {
  54. LogHelper.Error("执行SQL语句时出错:" + ex.Message, ex);
  55. }
  56. return null;
  57. }
  58. }
  59. public List<RecordDto> GetLastRecords(int lastCount = 10, bool hasDamages = false)
  60. {
  61. using (var cnn = DbConnection())
  62. {
  63. try
  64. {
  65. cnn.Open();
  66. var sql = @"SELECT Id,
  67. RopeNumber,
  68. RopeName,
  69. StartTime,
  70. EndTime,
  71. StartPoint,
  72. EndPoint,
  73. DetectionLength,
  74. DetectedSpeed,
  75. RiskLevel,
  76. DamageCount,
  77. DataFilePath,
  78. SensorCount,
  79. SamplingStep,
  80. ExportCount,
  81. InUseSensors
  82. FROM Records
  83. ORDER BY StartTime DESC
  84. LIMIT @Limit OFFSET @Offset";
  85. var result = cnn.Query<RecordDto>(sql, new
  86. {
  87. Limit = lastCount,
  88. Offset = 0
  89. });
  90. if (hasDamages && result != null && result.Any())
  91. {
  92. foreach (var item in result)
  93. {
  94. var damages = cnn.Query<DamageDto>(
  95. @"SELECT Id,
  96. RecordId,
  97. DamagePoint,
  98. DamageValue,
  99. DamageLevel
  100. FROM Damages
  101. WHERE RecordId = @id", new { id = item.Id }).ToList();
  102. item.Damages.AddRange(damages);
  103. }
  104. }
  105. return result.ToList();
  106. }
  107. catch (Exception ex)
  108. {
  109. LogHelper.Error("执行SQL语句时出错:" + ex.Message, ex);
  110. }
  111. return new List<RecordDto>();
  112. }
  113. }
  114. public List<RecordDto> GetRecords(int? ropeNumber,
  115. DateTime? startTime = null,
  116. DateTime? endTime = null,
  117. int? riskLevel = null,
  118. int? limit = null,
  119. int? offset = null,
  120. bool hasDamages = false)
  121. {
  122. using (var cnn = DbConnection())
  123. {
  124. try
  125. {
  126. cnn.Open();
  127. var sql = @"SELECT Id,
  128. RopeNumber,
  129. RopeName,
  130. StartTime,
  131. EndTime,
  132. StartPoint,
  133. EndPoint,
  134. DetectionLength,
  135. DetectedSpeed,
  136. RiskLevel,
  137. DamageCount,
  138. DataFilePath,
  139. SensorCount,
  140. SamplingStep,
  141. ExportCount,
  142. InUseSensors
  143. FROM Records
  144. WHERE 1=1 ";
  145. if (ropeNumber.HasValue)
  146. {
  147. sql += @"AND RopeNumber==@RopeNumber ";
  148. }
  149. if (riskLevel.HasValue)
  150. {
  151. sql += @"AND RiskLevel==@RiskLevel ";
  152. }
  153. if (startTime.HasValue)
  154. {
  155. sql += @"AND StartTime>=@StartTime ";
  156. }
  157. if (endTime.HasValue)
  158. {
  159. sql += @"AND EndTime<=@EndTime ";
  160. }
  161. sql += @"ORDER BY StartTime DESC ";
  162. if (limit.HasValue && offset.HasValue)
  163. {
  164. sql += @"LIMIT @Limit OFFSET @Offset ";
  165. }
  166. var result = cnn.Query<RecordDto>(sql, new
  167. {
  168. Limit = limit,
  169. Offset = offset,
  170. StartTime = startTime,
  171. EndTime = endTime,
  172. RopeNumber = ropeNumber,
  173. RiskLevel = riskLevel,
  174. });
  175. if (hasDamages && result != null && result.Any())
  176. {
  177. foreach (var item in result)
  178. {
  179. var damages = cnn.Query<DamageDto>(
  180. @"SELECT Id,
  181. RecordId,
  182. DamagePoint,
  183. DamageValue,
  184. DamageLevel
  185. FROM Damages
  186. WHERE RecordId = @id", new { id = item.Id }).ToList();
  187. item.Damages.AddRange(damages);
  188. }
  189. }
  190. return result.ToList();
  191. }
  192. catch (Exception ex)
  193. {
  194. LogHelper.Error("执行SQL语句时出错:" + ex.Message, ex);
  195. }
  196. return new List<RecordDto>();
  197. }
  198. }
  199. public int? CreateRecord(RecordDto record)
  200. {
  201. using (var cnn = DbConnection())
  202. {
  203. try
  204. {
  205. cnn.Open();
  206. record.Id = cnn.ExecuteScalar<int>(
  207. @"INSERT INTO Records (
  208. RopeNumber,
  209. RopeName,
  210. StartTime,
  211. EndTime,
  212. StartPoint,
  213. EndPoint,
  214. DetectionLength,
  215. DetectedSpeed,
  216. DamageCount,
  217. SensorCount,
  218. SamplingStep,
  219. DataFilePath,
  220. RiskLevel,
  221. ExportCount,
  222. InUseSensors)
  223. VALUES (
  224. @RopeNumber,
  225. @RopeName,
  226. @StartTime,
  227. @EndTime,
  228. @StartPoint,
  229. @EndPoint,
  230. @DetectionLength,
  231. @DetectedSpeed,
  232. @DamageCount,
  233. @SensorCount,
  234. @SamplingStep,
  235. @DataFilePath,
  236. @RiskLevel,
  237. @ExportCount,
  238. @InUseSensors);
  239. SELECT LAST_INSERT_ROWID()", record);
  240. if (record?.Id > 0)
  241. {
  242. if (record.Damages != null && record.Damages.Any())
  243. {
  244. foreach (var d in record.Damages)
  245. {
  246. d.RecordId = record.Id.Value;
  247. }
  248. cnn.Execute(@"INSERT INTO Damages (
  249. RecordId,
  250. DamagePoint,
  251. DamageValue,
  252. DamageLevel)
  253. VALUES (
  254. @RecordId,
  255. @DamagePoint,
  256. @DamageValue,
  257. @DamageLevel)", record.Damages);
  258. }
  259. }
  260. }
  261. catch (Exception ex)
  262. {
  263. LogHelper.Error("执行SQL语句时出错:" + ex.Message, ex);
  264. return null;
  265. }
  266. return record.Id;
  267. }
  268. }
  269. public bool UpdateRecord(RecordDto record)
  270. {
  271. using (var cnn = DbConnection())
  272. {
  273. try
  274. {
  275. cnn.Open();
  276. int affected = cnn.Execute(
  277. @"UPDATE Records
  278. SET
  279. RopeNumber = @RopeNumber,
  280. RopeName = @RopeName,
  281. StartTime = @StartTime,
  282. EndTime = @EndTime,
  283. StartPoint = @StartPoint,
  284. EndPoint = @EndPoint,
  285. DetectionLength = @DetectionLength,
  286. DetectedSpeed = @DetectedSpeed,
  287. DamageCount = @DamageCount,
  288. DataFilePath = @DataFilePath,
  289. SensorCount = @SensorCount,
  290. SamplingStep = @SamplingStep,
  291. ExportCount = @ExportCount,
  292. RiskLevel=@RiskLevel,
  293. InUseSensors=@InUseSensors
  294. WHERE Id = @Id;", record);
  295. foreach (var item in record.Damages)
  296. {
  297. affected += cnn.Execute(
  298. @"UPDATE Damages
  299. SET RecordId = @RecordId,
  300. DamagePoint =@DamagePoint,
  301. DamageValue =@DamageValue,
  302. DamageLevel =@DamageLevel
  303. WHERE Id = @Id;", item);
  304. }
  305. return affected > 0;
  306. }
  307. catch (Exception ex)
  308. {
  309. LogHelper.Error("执行SQL语句时出错:" + ex.Message, ex);
  310. return false;
  311. }
  312. }
  313. }
  314. public bool UpdateRecordDamageCount(int id, int damageCount)
  315. {
  316. using (var cnn = DbConnection())
  317. {
  318. cnn.Open();
  319. return cnn.Execute(@"UPDATE Records Set DamageCount=@DamageCount WHERE Id = @Id;", new { Id = id, DamageCount = damageCount }) > 0;
  320. }
  321. }
  322. public bool AddRecordExportCount(int id)
  323. {
  324. using (var cnn = DbConnection())
  325. {
  326. cnn.Open();
  327. return cnn.Execute(@"UPDATE Records Set ExportCount=ExportCount+1 WHERE Id = @Id;", new { Id = id }) > 0;
  328. }
  329. }
  330. public bool DeleteRecord(int id)
  331. {
  332. using (var cnn = DbConnection())
  333. {
  334. cnn.Open();
  335. return cnn.Execute(@"DELETE FROM Damages WHERE RecordId = @Id;DELETE FROM Records WHERE Id = @Id;", new { Id = id }) > 0;
  336. }
  337. }
  338. public int DeleteRecords(int[] ids)
  339. {
  340. using (var cnn = DbConnection())
  341. {
  342. cnn.Open();
  343. return cnn.Execute(@"DELETE FROM Damages WHERE RecordId in @Ids;DELETE FROM Records WHERE Id in @Ids;", new { Ids = ids });
  344. }
  345. }
  346. public (int, List<string>) DeleteRecords(DateTime endTime)
  347. {
  348. using (var cnn = DbConnection())
  349. {
  350. cnn.Open();
  351. // 首先查询需要删除的记录的DataFilePath
  352. var filePaths = cnn.Query<string>(
  353. @"SELECT DataFilePath
  354. FROM Records
  355. WHERE StartTime <= @EndTime AND ExportCount = 0",
  356. new { EndTime = endTime }).ToList();
  357. // 执行删除操作
  358. int effect = cnn.Execute(@"
  359. BEGIN TRANSACTION;
  360. DELETE FROM Damages
  361. WHERE RecordId IN (
  362. SELECT Id
  363. FROM Records
  364. WHERE StartTime <= @EndTime AND ExportCount = 0
  365. );
  366. DELETE FROM Records
  367. WHERE StartTime <= @EndTime AND ExportCount = 0;
  368. COMMIT;",
  369. new { EndTime = endTime });
  370. return (effect / 2, filePaths);
  371. }
  372. }
  373. public bool UpdateDamage(DamageDto damage)
  374. {
  375. using (var cnn = DbConnection())
  376. {
  377. cnn.Open();
  378. return cnn.Execute(@"UPDATE Damages
  379. SET RecordId = @RecordId,
  380. DamagePoint = @DamagePoint,
  381. DamageValue = @DamageValue,
  382. DamageLevel = @DamageLevel
  383. WHERE Id = @Id;", damage) > 0;
  384. }
  385. }
  386. public bool DeleteDamage(int id)
  387. {
  388. using (var cnn = DbConnection())
  389. {
  390. cnn.Open();
  391. return cnn.Execute(@"DELETE FROM Damages WHERE Id = @Id;", new { Id = id }) > 0;
  392. }
  393. }
  394. }
  395. }