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
|
{
|
/// <summary>
|
/// 泵运行状态
|
/// </summary>
|
public List<(DateTime,DateTime,int )> TimeRunParas { get; set; }
|
/// <summary>
|
/// 取水量
|
/// </summary>
|
public List<double> Water { get; set; }
|
/// <summary>
|
/// 用电量
|
/// </summary>
|
public List<double> Electric { get; set; }
|
}
|
|
/// <summary>
|
/// 初始方法获取所有数据
|
/// </summary>
|
/// <param name="day"></param>
|
/// <returns></returns>
|
public static List<RunParasData> GetHistoryData(DateTime day)
|
{
|
List<double> doublesWater = new List<double>();
|
List<double> doublesEle = new List<double>();
|
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<RunParasData> runParasDatas = new List<RunParasData>();
|
runParasDatas.Add(new RunParasData
|
{
|
TimeRunParas = PumpIsOpen,
|
Water = doublesWater,
|
Electric = doublesEle
|
});
|
return runParasDatas;
|
}
|
|
/// <summary>
|
/// 获取总取水量
|
/// </summary>
|
/// <returns></returns>
|
public static List<Model.PumpWater> 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<Model.PumpWater> pumpISopenlist = new List<Model.PumpWater>();
|
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<Model.Water>
|
{
|
new Model.Water
|
{
|
DateTime = Convert.ToDateTime(arr[0]),
|
SingleWater =Convert.ToDouble( arr[2])
|
}
|
}
|
|
|
};
|
pumpISopenlist.Add(pumpISopen);
|
}
|
catch
|
{
|
var a = i;
|
}
|
}
|
fs.Close();
|
return pumpISopenlist;
|
}
|
|
|
|
/// <summary>
|
/// 获取有功电能
|
/// </summary>
|
/// <returns></returns>
|
public static List<Model.electricity> 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<Model.electricity> pumpISopenlist = new List<Model.electricity>();
|
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<Model.Ele>
|
{
|
new Model.Ele
|
{
|
DateTime = Convert.ToDateTime(arr[0]),
|
Value =Convert.ToDouble( arr[2])
|
}
|
}
|
};
|
pumpISopenlist.Add(pumpISopen);
|
}
|
fs.Close();
|
return pumpISopenlist;
|
}
|
|
|
|
/// <summary>
|
/// 获取具体时间段的开泵台数
|
/// </summary>
|
public static List<(DateTime, DateTime, int)> getPumpIsOpen(DateTime datetime)
|
{
|
List<IsOpen> isOpenpump1 = new List<IsOpen>();
|
List<IsOpen> isOpenpump2 = new List<IsOpen>();
|
List<IsOpen> isOpenpump3 = new List<IsOpen>();
|
List<IsOpen> isOpenpump4 = new List<IsOpen>();
|
List<IsOpen> isOpenpump5 = new List<IsOpen>();
|
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<string> startTime = new List<string>();
|
List<string> endtime = new List<string>();
|
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);
|
}
|
|
/// <summary>
|
/// 获取泵的开机参数
|
/// </summary>
|
/// <returns></returns>
|
public static List<Model.PumpIsopen> 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<Model.PumpIsopen> pumpISopenlist = new List<Model.PumpIsopen>();
|
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<Model.IsOpen>
|
{
|
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<IsOpen> PumpList)
|
{
|
List<(DateTime, DateTime)> values = new List<(DateTime, DateTime)>();
|
values.Clear();
|
// List<DateTime> Endvalues = new List<DateTime>();
|
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;
|
}
|
|
|
|
|
/// <summary>
|
/// 模糊合并时间段
|
/// </summary>
|
/// <param name="Date"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
|
/// <summary>
|
/// 合并五台泵的运行时间
|
/// </summary>
|
/// <param name="lists"></param>
|
/// <returns></returns>
|
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<Model.Water> water1 = new List<Model.Water>();
|
List<Model.Water> water2 = new List<Model.Water>();
|
List<Model.Water> water3 = new List<Model.Water>();
|
List<Model.Water> water4 = new List<Model.Water>();
|
List<Model.Water> water5 = new List<Model.Water>();
|
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<Model.Ele> Ele1 = new List<Model.Ele>();
|
List<Model.Ele> Ele2 = new List<Model.Ele>();
|
List<Model.Ele> Ele3 = new List<Model.Ele>();
|
List<Model.Ele> Ele4 = new List<Model.Ele>();
|
List<Model.Ele> Ele5 = new List<Model.Ele>();
|
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;
|
}
|
}
|
}
|