using IStation.Model; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IStation.Common { public class PumpHistoryDataFileHelper { public class RunParasData { /// /// 泵运行状态 /// public List<(DateTime,DateTime,int )> TimeRunParas { get; set; } /// /// 取水量 /// public List Water { get; set; } /// /// 用电量 /// public List Electric { get; set; } } /// /// 初始方法获取所有数据 /// /// /// public static List GetHistoryData(DateTime day) { List doublesWater = new List(); List doublesEle = new List(); var PumpIsOpen = getPumpIsOpen(day); foreach (var item in PumpIsOpen) { doublesWater.Add(GetWaterdata(item.Item1, item.Item2)); } foreach (var item in PumpIsOpen) { doublesEle.Add(GetElectrityData(item.Item1, item.Item2)); } List runParasDatas = new List(); runParasDatas.Add(new RunParasData { TimeRunParas = PumpIsOpen, Water = doublesWater, Electric = doublesEle }); return runParasDatas; } /// /// 获取总取水量 /// /// public static List GetWaterData() { string path = System.IO.Path.Combine(IStation.DataFolderHelper.GetRootPath(), "PumpRunParas", "二取水机泵累计流量.csv"); if (!File.Exists(path)) return null; int totalLines = File.ReadLines(path, Encoding.GetEncoding("gb2312")).Count();//总行数 System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open); System.IO.StreamReader sr = new System.IO.StreamReader(fs, Encoding.GetEncoding("gb2312")); string tempText; List pumpISopenlist = new List(); for (int i = 0; i < totalLines-1; i++) { tempText = sr.ReadLine(); string[] arr = tempText.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); try { var pumpISopen = new Model.PumpWater { Tag = arr[1], Values = new List { new Model.Water { DateTime = Convert.ToDateTime(arr[0]), SingleWater =Convert.ToDouble( arr[2]) } } }; pumpISopenlist.Add(pumpISopen); } catch { var a = i; } } fs.Close(); return pumpISopenlist; } /// /// 获取有功电能 /// /// public static List GetEleData() { string path = System.IO.Path.Combine(IStation.DataFolderHelper.GetRootPath(), "PumpRunParas", "二取水机泵有功电能.csv"); if (!File.Exists(path)) return null; int totalLines = File.ReadLines(path, Encoding.GetEncoding("gb2312")).Count();//总行数 System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open); System.IO.StreamReader sr = new System.IO.StreamReader(fs, Encoding.GetEncoding("gb2312")); string tempText; List pumpISopenlist = new List(); for (int i = 0; i < totalLines; i++) { tempText = sr.ReadLine(); string[] arr = tempText.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var pumpISopen = new Model.electricity { Tag = arr[1], TotalEle = new List { new Model.Ele { DateTime = Convert.ToDateTime(arr[0]), Value =Convert.ToDouble( arr[2]) } } }; pumpISopenlist.Add(pumpISopen); } fs.Close(); return pumpISopenlist; } /// /// 获取具体时间段的开泵台数 /// public static List<(DateTime, DateTime, int)> getPumpIsOpen(DateTime datetime) { List isOpenpump1 = new List(); List isOpenpump2 = new List(); List isOpenpump3 = new List(); List isOpenpump4 = new List(); List isOpenpump5 = new List(); var TestIsOpen = GetPumpRunParas(); if (TestIsOpen == null) return null; var Pump1 = TestIsOpen.Where(x => x.Tag == "_0402010204012101001").ToList(); foreach (var item in Pump1) { isOpenpump1.AddRange(item.Values.Where(x => x.DateTime >= datetime && x.DateTime <= datetime.AddHours(23).AddMinutes(59)).ToList()); } var Pump2 = TestIsOpen.Where(x => x.Tag == "_0402010204012201001").ToList(); foreach (var item in Pump2) { isOpenpump2.AddRange(item.Values.Where(x => x.DateTime >= datetime && x.DateTime <= datetime.AddHours(23).AddMinutes(59)).ToList()); } var Pump3 = TestIsOpen.Where(x => x.Tag == "_0402010204012301001").ToList(); foreach (var item in Pump3) { isOpenpump3.AddRange(item.Values.Where(x => x.DateTime >= datetime && x.DateTime <= datetime.AddHours(23).AddMinutes(59)).ToList()); } var Pump4 = TestIsOpen.Where(x => x.Tag == "_0402010204012401001").ToList(); foreach (var item in Pump4) { isOpenpump4.AddRange(item.Values.Where(x => x.DateTime >= datetime && x.DateTime <= datetime.AddHours(23).AddMinutes(59)).ToList()); } var Pump5 = TestIsOpen.Where(x => x.Tag == "_0402010204012501001").ToList(); foreach (var item in Pump5) { isOpenpump5.AddRange(item.Values.Where(x => x.DateTime >= datetime && x.DateTime <= datetime.AddHours(23).AddMinutes(59)).ToList()); } List startTime = new List(); List endtime = new List(); var Run1 = GetData(isOpenpump1); var Run2 = GetData(isOpenpump2); var Run3 = GetData(isOpenpump3); var Run4 = GetData(isOpenpump4); var Run5 = GetData(isOpenpump5); List<(DateTime, DateTime)> mergedList = MergeList(Run1, Run2, Run3, Run4, Run5); return MergeTimeSlots(mergedList); } /// /// 获取泵的开机参数 /// /// public static List GetPumpRunParas() { string path = System.IO.Path.Combine(IStation.DataFolderHelper.GetRootPath(), "PumpRunParas", "二取水机泵开停状态.csv"); if (!File.Exists(path)) return null; int totalLines = File.ReadLines(path, Encoding.GetEncoding("gb2312")).Count();//总行数 System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open); System.IO.StreamReader sr = new System.IO.StreamReader(fs, Encoding.GetEncoding("gb2312")); string tempText; List pumpISopenlist = new List(); for (int i = 0; i < totalLines; i++) { tempText = sr.ReadLine(); string[] arr = tempText.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var pumpISopen = new Model.PumpIsopen { Tag = arr[1], Values = new List { new Model.IsOpen { DateTime = Convert.ToDateTime(arr[0]), Isopen = arr[2] } } }; pumpISopenlist.Add(pumpISopen); } fs.Close(); return pumpISopenlist; } //泵开机参数的辅助方法 private static List<(DateTime, DateTime)> GetData(List PumpList) { List<(DateTime, DateTime)> values = new List<(DateTime, DateTime)>(); values.Clear(); // List Endvalues = new List(); DateTime startTime; DateTime EndTime; for (int time = 0; time < PumpList.Count; time++) { if (PumpList[time].Isopen == "1") { startTime = PumpList[time].DateTime; EndTime = PumpList[time].DateTime; for (int k = time + 1; k < PumpList.Count; k++) //k为从开机后比较的变量下标 { if (PumpList[k].Isopen == "1") { EndTime = PumpList[k].DateTime; time = k; } else break; } values.Add((startTime, EndTime)); } } return values; } /// /// 模糊合并时间段 /// /// /// static List<(DateTime, DateTime, int)> MergeTimeSlots(List<(DateTime, DateTime)> Date) { List<(DateTime, DateTime, int)> mergedSlots = new List<(DateTime, DateTime, int)>(); Date.Sort((x, y) => x.Item1.CompareTo(y.Item1)); // 按照起始时间排序 DateTime mergedStart = Date[0].Item1; DateTime mergedEnd = Date[0].Item2; int mergeCount = 1; // 从第二个时间段开始迭代 for (int i = 1; i < Date.Count; i++) { DateTime start = Date[i].Item1; DateTime end = Date[i].Item2; // 如果当前时间段的起始时间在模糊时间范围内,则合并 if (start <= mergedEnd.AddMinutes(40)) // 假设模糊时间范围为15分钟 { mergedEnd = DateTime.Compare(mergedEnd, end) < 0 ? end : mergedEnd; mergeCount++; } else { mergedSlots.Add((mergedStart, mergedEnd, mergeCount)); mergedStart = start; mergedEnd = end; mergeCount = 1; } } // 添加最后一个时间段 mergedSlots.Add((mergedStart, mergedEnd, mergeCount)); return mergedSlots; } /// /// 合并五台泵的运行时间 /// /// /// static List<(DateTime, DateTime)> MergeList(params List<(DateTime, DateTime)>[] lists) { List<(DateTime, DateTime)> mergedList = new List<(DateTime, DateTime)>(); foreach (var list in lists) { mergedList.AddRange(list); } return mergedList; } private static double GetWaterdata(DateTime Str, DateTime end) { List water1 = new List(); List water2 = new List(); List water3 = new List(); List water4 = new List(); List water5 = new List(); var waterData = GetWaterData(); var pump1 = waterData.Where(x => x.Tag == "二取水1号主水泵.日累计").ToList(); foreach (var item in pump1) { water1.AddRange(item.Values.Where(x => x.DateTime >= Str && x.DateTime <= end)); } var pump2 = waterData.Where(x => x.Tag == "二取水2号主水泵.日累计").ToList(); foreach (var item in pump2) { water2.AddRange(item.Values.Where(x => x.DateTime >= Str && x.DateTime <= end)); } var pump3 = waterData.Where(x => x.Tag == "二取水3号主水泵.日累计").ToList(); foreach (var item in pump3) { water3.AddRange(item.Values.Where(x => x.DateTime >= Str && x.DateTime <= end)); } var pump4 = waterData.Where(x => x.Tag == "二取水4号主水泵.日累计").ToList(); foreach (var item in pump4) { water4.AddRange(item.Values.Where(x => x.DateTime >= Str && x.DateTime <= end)); } var pump5 = waterData.Where(x => x.Tag == "二取水5号主水泵.日累计").ToList(); foreach (var item in pump5) { water5.AddRange(item.Values.Where(x => x.DateTime >= Str && x.DateTime <= end)); } var Result1 = water1.Last().SingleWater - water1.First().SingleWater; var Result2 = water2.Last().SingleWater - water2.First().SingleWater; var Result3 = water3.Last().SingleWater - water3.First().SingleWater; var Result4 = water4.Last().SingleWater - water4.First().SingleWater; var Result5 = water5.Last().SingleWater - water5.First().SingleWater; return Result1 + Result2 + Result3 + Result4 + Result5; } private static double GetElectrityData(DateTime Str, DateTime end) { var Ele = GetEleData(); List Ele1 = new List(); List Ele2 = new List(); List Ele3 = new List(); List Ele4 = new List(); List Ele5 = new List(); var pump1 = Ele.Where(x => x.Tag == "_0402010204040193046").ToList(); foreach (var item in pump1) { Ele1.AddRange(item.TotalEle.Where(x => x.DateTime >= Str && x.DateTime <= end)); } var pump2 = Ele.Where(x => x.Tag == "_0402010204040193047").ToList(); foreach (var item in pump2) { Ele2.AddRange(item.TotalEle.Where(x => x.DateTime >= Str && x.DateTime <= end)); } var pump3 = Ele.Where(x => x.Tag == "_0402010204012308007").ToList(); foreach (var item in pump3) { Ele3.AddRange(item.TotalEle.Where(x => x.DateTime >= Str && x.DateTime <= end)); } var pump4 = Ele.Where(x => x.Tag == "_0402010204012408007").ToList(); foreach (var item in pump4) { Ele4.AddRange(item.TotalEle.Where(x => x.DateTime >= Str && x.DateTime <= end)); } var pump5 = Ele.Where(x => x.Tag == "_0402010204012508007").ToList(); foreach (var item in pump5) { Ele5.AddRange(item.TotalEle.Where(x => x.DateTime >= Str && x.DateTime <= end)); } var Result1 = Ele1.Last().Value - Ele1.First().Value; var Result2 = Ele2.Last().Value - Ele2.First().Value; var Result3 = Ele3.Last().Value - Ele3.First().Value; var Result4 = Ele4.Last().Value - Ele4.First().Value; var Result5 = Ele5.Last().Value - Ele5.First().Value; return Result1 + Result2 + Result3 + Result4 + Result5; } } }