using DataService.api; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Diagnostics; using System.Linq; using System.Security.Policy; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; namespace Supplement { partial class ServiceSupplement : ServiceBase { System.Timers.Timer timer1; //计时器 log4net.ILog log; DataService.BLL.device_info device_bll = new DataService.BLL.device_info(); DataService.BLL.electricity_data electricity_bll = new DataService.BLL.electricity_data(); string date_base; public ServiceSupplement() { InitializeComponent(); } public void DebugOnStart(string[] args) { OnStart(args); } protected override void OnStart(string[] args) { // TODO: 在此处添加代码以启动服务。 log4net.Config.XmlConfigurator.Configure(); log = log4net.LogManager.GetLogger("loginfo"); log.Info("启动服务"); date_base = ConfigurationManager.AppSettings["changdao_zhanlanguang"]; timer1 = new System.Timers.Timer(); timer1.Interval = 1000; //设置计时器事件间隔执行时间 timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed); timer1.Enabled = true; } private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { int intHour = e.SignalTime.Hour; int intMinute = e.SignalTime.Minute; int intSecond = e.SignalTime.Second; if ((intMinute == 0 && intSecond == 0) || (intMinute == 10 && intSecond == 0) || (intMinute == 20 && intSecond == 0) || (intMinute == 30 && intSecond == 0) || (intMinute == 40 && intSecond == 0) || (intMinute == 50 && intSecond == 0)) { try { log.Info("开始补录"); var now = DateTime.Now; var start_time = DateTime.Parse(now.AddHours(-14).ToString("yyyy-MM-dd HH:00:00")); var end_time = DateTime.Parse(now.ToString("yyyy-MM-dd HH:00:00")); var stime = start_time.ToString("yyyyMM"); var etime = end_time.ToString("yyyyMM"); if (electricity_bll.IsExistsTable(date_base, "electricity_data_" + stime)) { electricity_bll.CreateTable(stime); } if (electricity_bll.IsExistsTable(date_base, "electricity_data_" + etime)) { electricity_bll.CreateTable(etime); } var list = new List(); if (stime == etime) { list = electricity_bll.GetModelListDate(" EntireTime>='" + start_time + "' and EntireTime<'" + end_time + "' ", stime); } else { var list1 = electricity_bll.GetModelListDate(" EntireTime>='" + start_time + "' and EntireTime<'" + end_time + "' ", stime); var list2 = electricity_bll.GetModelListDate(" EntireTime>='" + start_time + "' and EntireTime<'" + end_time + "' ", etime); if (list1.Count() > 0) { list.AddRange(list1); } if (list2.Count() > 0) { list.AddRange(list2); } } var date = DateTime.Parse(start_time.AddHours(+1).ToString("yyyy-MM-dd HH:00:00")); var device_list = device_bll.GetModelList(""); // 查询缺失的小时数据并补充 foreach (var item in device_list) { DateTime currentDate = date; while (currentDate < end_time) { var hourlyData = list.Find(x => x.EntireTime == currentDate && x.DeviceName == item.DeviceName && x.Reserve1 == item.FloorName); if (hourlyData == null) { // 如果当前小时数据缺失,则使用上一个小时的数据 var previousHourlyData = list.Where(x => x.EntireTime < currentDate && x.DeviceName == item.DeviceName && x.Reserve1 == item.FloorName).OrderByDescending(a => a.EntireTime).FirstOrDefault(); if (previousHourlyData != null) { var model = new DataService.Model.electricity_data(); model.ElectricityId = Guid.NewGuid().ToString("N"); model.DeviceName = item.DeviceName; model.EH = previousHourlyData.EH; model.P = previousHourlyData.P; model.Ia = previousHourlyData.Ia; model.Ib = previousHourlyData.Ib; model.Ic = previousHourlyData.Ic; model.Ua = previousHourlyData.Ua; model.Ub = previousHourlyData.Ub; model.Uc = previousHourlyData.Uc; model.Kvar = previousHourlyData.Kvar; model.CreateTime = DateTime.Now; model.EntireTime = currentDate; model.Reserve1 = previousHourlyData.Reserve1; model.Reserve2 = previousHourlyData.Reserve2; var date1 = currentDate.ToString("yyyyMM"); electricity_bll.AddDate(model, date1); list.Add(model); } else { if (currentDate == date) { var date_month = date.ToString("yyyyMM"); if (electricity_bll.IsExistsTable(date_base, "electricity_data_" + date_month)) { electricity_bll.CreateTable(stime); } var zero_model = electricity_bll.GetModelListDate(" EntireTime<'" + date + "' and DeviceName='" + item.DeviceName + "' and Reserve1='" + item.FloorName + "' order by EntireTime desc limit 1 ", date_month).FirstOrDefault(); if (zero_model != null) { var model = new DataService.Model.electricity_data(); model.ElectricityId = Guid.NewGuid().ToString("N"); model.DeviceName = item.DeviceName; model.EH = zero_model.EH; model.P = zero_model.P; model.Ia = zero_model.Ia; model.Ib = zero_model.Ib; model.Ic = zero_model.Ic; model.Ua = zero_model.Ua; model.Ub = zero_model.Ub; model.Uc = zero_model.Uc; model.Kvar = zero_model.Kvar; model.CreateTime = DateTime.Now; model.EntireTime = currentDate; model.Reserve1 = zero_model.Reserve1; model.Reserve2 = zero_model.Reserve2; var date1 = currentDate.ToString("yyyyMM"); electricity_bll.AddDate(model, date1); list.Add(model); } else { var date_month2 = date.AddMonths(-1).ToString("yyyyMM"); if (electricity_bll.IsExistsTable(date_base, "electricity_data_" + date_month2)) { electricity_bll.CreateTable(stime); } var zero_model2 = electricity_bll.GetModelListDate(" EntireTime<'" + date + "' and DeviceName='" + item.DeviceName + "' and Reserve1='" + item.FloorName + "' order by EntireTime desc limit 1 ", date_month2).FirstOrDefault(); if (zero_model2 != null) { var model = new DataService.Model.electricity_data(); model.ElectricityId = Guid.NewGuid().ToString("N"); model.DeviceName = item.DeviceName; model.EH = zero_model2.EH; model.P = zero_model2.P; model.Ia = zero_model2.Ia; model.Ib = zero_model2.Ib; model.Ic = zero_model2.Ic; model.Ua = zero_model2.Ua; model.Ub = zero_model2.Ub; model.Uc = zero_model2.Uc; model.Kvar = zero_model2.Kvar; model.CreateTime = DateTime.Now; model.EntireTime = currentDate; model.Reserve1 = zero_model2.Reserve1; model.Reserve2 = zero_model2.Reserve2; var date1 = currentDate.ToString("yyyyMM"); electricity_bll.AddDate(model, date1); list.Add(model); } } } } } currentDate = currentDate.AddHours(1); } } } catch (Exception ex) { log.Info("补录数据失败,失败原因:" + ex.Message); } } } protected override void OnStop() { // TODO: 在此处添加代码以执行停止服务所需的关闭操作。 } } }