diff --git a/SmartAquaViewer/DataAnalisys/AppDbContext.cs b/SmartAquaViewer/DataAnalisys/AppDbContext.cs new file mode 100644 index 0000000..6ad3331 --- /dev/null +++ b/SmartAquaViewer/DataAnalisys/AppDbContext.cs @@ -0,0 +1,27 @@ +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory; + +namespace SmartAquaViewer.DataAnalisys +{ + public class AppDbContext : DbContext + { + + //dotnet ef migrations add InitialCreate + //dotnet ef database update + + //dotnet ef migrations add AddMultipleTables + //dotnet ef database update + + + + public DbSet WaterQualities { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + // SQL Server 예시 (필요에 맞게 변경) + optionsBuilder.UseSqlServer( + "Server=localhost;Database=SmartAquaDB;Trusted_Connection=True;TrustServerCertificate=True;"); + } + } +} diff --git a/SmartAquaViewer/DataAnalisys/AquarDataControl.cs b/SmartAquaViewer/DataAnalisys/AquarDataControl.cs index 52cfb36..68de21b 100644 --- a/SmartAquaViewer/DataAnalisys/AquarDataControl.cs +++ b/SmartAquaViewer/DataAnalisys/AquarDataControl.cs @@ -1,15 +1,104 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SmartAquaViewer.DataAnalisys { + + internal class AquarDataControl { + private AQUA_DATA_CONTROL_STATE state = AQUA_DATA_CONTROL_STATE.IDLE; + private readonly IWaterQuality iwaterQuality; + private CancellationTokenSource? cts; + + AppDbContext db = new AppDbContext(); + + + public AquarDataControl(IWaterQuality iwaterQuality) + { + this.iwaterQuality = iwaterQuality; + } + + public AQUA_DATA_CONTROL_STATE GetState() => state; + + /// + /// 파일 파싱 시작 + /// + public void ParseFile(string filePath) + { + // --- 동기 처리 구간 --- + if (state != AQUA_DATA_CONTROL_STATE.IDLE && + state != AQUA_DATA_CONTROL_STATE.PROCESS_COMPLETED) + { + iwaterQuality.OnError("illegal state error : " + state); + return; + } + + state = AQUA_DATA_CONTROL_STATE.PROCESSING; + cts = new CancellationTokenSource(); + + // --- 비동기 처리 구간 --- + Task.Run(async () => + { + try + { + var fileInfo = new FileInfo(filePath); + long totalBytes = fileInfo.Length; + long processedBytes = 0; + + using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) + using (var reader = new StreamReader(fs)) + { + string? line; + while ((line = await reader.ReadLineAsync()) != null) + { + cts.Token.ThrowIfCancellationRequested(); + + processedBytes += Encoding.UTF8.GetByteCount(line + Environment.NewLine); + double percent = (double)processedBytes / totalBytes * 100.0; + + // TODO: 라인 파싱 로직 + WaterQualityVO vo = new(); + vo.PH = 10.5; + vo.Timestamp = DateTime.Now; + iwaterQuality.OnParsed(vo); + + db.Add(vo); + + iwaterQuality.OnProgress(percent); + } + } + state = AQUA_DATA_CONTROL_STATE.PROCESS_COMPLETED; + iwaterQuality.OnCompleted(); + } + catch (OperationCanceledException) + { + state = AQUA_DATA_CONTROL_STATE.CANCELLED; + iwaterQuality.OnCancelled(); + } + catch (Exception ex) + { + state = AQUA_DATA_CONTROL_STATE.ERROR; + iwaterQuality.OnError("파일 처리 중 오류 발생: " + ex.Message); + } + }); + } + /// + /// 처리 중단 요청 + /// + public void Cancel() + { + if (state == AQUA_DATA_CONTROL_STATE.PROCESSING && cts != null) + { + cts.Cancel(); + } + } } diff --git a/SmartAquaViewer/DataAnalisys/IWaterQuality.cs b/SmartAquaViewer/DataAnalisys/IWaterQuality.cs new file mode 100644 index 0000000..157ef0b --- /dev/null +++ b/SmartAquaViewer/DataAnalisys/IWaterQuality.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SmartAquaViewer.DataAnalisys +{ + + internal enum AQUA_DATA_CONTROL_STATE + { + IDLE, + PROCESSING, + PROCESS_COMPLETED, + CANCELLED, + ERROR + } + + + internal interface IWaterQuality + { + void OnParsed(WaterQualityVO vo); + void OnProgress(double percent); + void OnError(string message); + void OnCompleted(); + void OnCancelled(); + } +} diff --git a/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs b/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs index 1f88c8c..5af359b 100644 --- a/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs +++ b/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs @@ -9,9 +9,17 @@ namespace SmartAquaViewer.DataAnalisys using System; + using System.ComponentModel.DataAnnotations; + using System.ComponentModel.DataAnnotations.Schema; + [Table("WaterQuality")] public class WaterQualityVO { + + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 자동 증가 + public int Id { get; set; } // PK, Auto Increment + /// /// 저수조 번호 ///