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;
}
}
}