using Cksoft.Data; using Cksoft.Unity; using DllEapEntity.Dtos; using DllEapEntity.OFILM; using DllEapEntity.RA; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using ChartDto = DllEapEntity.OFILM.ChartDto; namespace DllEapDal.RA { public class DataBoardDal { private IDatabase db; public DataBoardDal(IDatabase db) { this.db = db; } public List> Get(DateTime time, string fcode, string factory, string status, string fname, ref List> da,ref double coun) { DateTime starttime; DateTime start; DateTime endtime; if (DateTime.Now.Subtract(time).TotalDays<1) { starttime = DateTime.Now.AddMinutes(-1); start= Convert.ToDateTime(DateTime.Now.ToString("D").ToString()); endtime = starttime; } else { start= Convert.ToDateTime(time.ToString("D").ToString()); endtime=Convert.ToDateTime(time.AddDays(1).ToString("D").ToString()); starttime = endtime.AddMinutes(-1); } string str = " "; /* string sql = $@" and b.rectime=='{DateTime.Now.ToString("yyyy-MM-dd HH:mm:00")}' and c.endtime='0001-01-01 00:00:00'"; IEnumerable data = db.FindListForCondition(" a", ref error);*/ var ss = new MachineShort().GetQueryColSql(); string sql = $@"select {ss} from machine a left outer join ((select * from baseinfo where id in (select max(id) from baseinfo where modetime<'{endtime.AddMinutes(1).ToString("yyyy-MM-dd HH:mm")}' GROUP BY(MacID)))) b on a.id =b.macid left outer join (select * from statusinfo where id in (select max(id) from statusinfo where Duration>0 and StartTime<'{endtime.ToString("yyyy-MM-dd HH:mm:ss")}' GROUP BY macid)) c on a.id =c.macid left outer join supplier d on a.SupplierID =d.id where 1=1 and a.rectime<'{endtime.ToString("yyyy-MM-dd HH:mm:ss")}' "; if (!string.IsNullOrEmpty(fcode)) { sql += $@" and a.fcode like '{fcode}'"; str += $@" and fcode like '{fcode}'"; } if (!string.IsNullOrEmpty(factory)) { sql += $@" and a.factory like '{factory}'"; str += $@" and factory like '{factory}'"; } if (!string.IsNullOrEmpty(status)) { sql += $@" and c.status like '{status}'"; } if (!string.IsNullOrEmpty(fname)) { sql += $@" and d.FName like '{fname}'"; } sql += $@" ORDER BY FIND_IN_SET(a.Factory,'未来城,2号园区,HC园区'),a.FCode"; IEnumerable data1 = db.FindList(sql); foreach (var item in data1) { if (string.IsNullOrEmpty(item.HumidPV)) item.HumidPV = "0"; if (string.IsNullOrEmpty(item.TemperaturePV)) item.TemperaturePV = "0"; if (string.IsNullOrEmpty(item.Duration)) item.Duration = "0"; if (string.IsNullOrEmpty(item.Cycle)) item.Cycle = "0"; if (string.IsNullOrEmpty(item.Step)) item.Step = "0"; if (string.IsNullOrEmpty(item.Hour)) item.Hour = "0"; if (string.IsNullOrEmpty(item.Minutes)) item.Minutes = "0"; if (string.IsNullOrEmpty(item.ProgramName)) item.ProgramName = "暂无"; if (string.IsNullOrEmpty(item.Status)) item.Status = "-1"; if (item.Status=="-1") { item.HumidPV = "0"; item.TemperatureSV = "0"; item.TemperaturePV = "0"; item.HumidSv = "0"; } if (DateTime.Now.Subtract(starttime).TotalMinutes>1) { item.Duration = Math.Round(endtime.Subtract(item.StartTime).TotalHours,2).ToString(); } /* item.Duration=DateTime.Now.Subtract(item.)*/ } var data = new List>(); var li=data1?.GroupBy(c => c.Factory); var s =new List(); if (li != null) { foreach (var item in li) { var d = new Center(); d.name = item.Key; s.Add(item.Key); d.list = item.ToList(); data.Add(d); } } int count = 0, count1 = 0, count2 = 0, count3 = 0, count4 = 0; /* List s1 = new List(); List s2 = new List(); List s3 = new List(); List s4 = new List();*/ var a = new Center() { name = "rate", list = new List() }; var b = new Center() { name = "status", list = new List() }; string error = ""; foreach (var item in s) { DateTime date; var r = db.FindList($@"select * from machine where Factory='{item}' and rectime<'{endtime.ToString("yyyy-MM-dd HH:mm:ss")}' " +str); int total = 0; double x = 0; foreach (var i in r) { bool bl = false; DateTime end = endtime; var statu = db.FindListForCondition($@" and macid={i.ID} and starttime <'{endtime.ToString("yyyy-MM-dd HH:mm:ss")}' order by modetime desc", ref error).ToList(); foreach (var j in statu) { if (!string.IsNullOrEmpty(status)) { if (statu[0].Status != status) { break; } } if (j.EndTime.ToString("yyyy-MM-dd HH:mm:ss") == "0001-01-01 00:00:00") { if (start >j.StartTime) { date = end > DateTime.Now ? DateTime.Now : end; if (j.Status == "1") x += date.Subtract(start).TotalHours; if (j.Status == "0") { count1 += 1; /*s1.Add(i.FCode);*/ } if (j.Status == "1") { count2 += 1; /* s2.Add(i.FCode);*/ } if (j.Status == "2") { count3 += 1; /* s3.Add(i.FCode);*/ } if (j.Status == "-1") { count4 += 1; /* s4.Add(i.FCode);*/ } count += 1; total += 1; break; } else if (end > j.StartTime) { date = end > DateTime.Now ? DateTime.Now : end; if (j.Status == "1") x += date.Subtract(j.StartTime).TotalHours; if (j.Status == "0") { count1 += 1; /* s1.Add(i.FCode);*/ } if (j.Status == "1") { count2 += 1; /* s2.Add(i.FCode);*/ } if (j.Status == "2") { count3 += 1; /* s3.Add(i.FCode);*/ } if (j.Status == "-1") { count4 += 1; /* s4.Add(i.FCode);*/ } count += 1; total += 1; end = j.StartTime; bl = true; continue; } } else { if (bl) { if (start > j.StartTime ) { if (j.Status == "1") { x += end.Subtract(start).TotalHours; } break; } else if (end > j.StartTime) { if(j.Status == "1") { x += end.Subtract(j.StartTime).TotalHours; } end = j.StartTime; bl = true; continue; } } else { if (start > j.StartTime ) { if (j.Status == "1") x += end.Subtract(start).TotalHours; if (j.Status == "0") { count1 += 1; /* s1.Add(i.FCode);*/ } if (j.Status == "1") { count2 += 1; /* s2.Add(i.FCode);*/ } if (j.Status == "2") { count3 += 1; /* s3.Add(i.FCode);*/ } if (j.Status == "-1") { count4 += 1; /* s4.Add(i.FCode);*/ } count += 1; total += 1; break; } else if (end > j.StartTime ) { if (j.Status == "1") x += end.Subtract(j.StartTime).TotalHours; if (j.Status == "0") { count1 += 1; /* s1.Add(i.FCode);*/ } if (j.Status == "1") { count2 += 1; /* s2.Add(i.FCode);*/ } if (j.Status == "2") { count3 += 1; /*s3.Add(i.FCode);*/ } if (j.Status == "-1") { count4 += 1; /* s4.Add(i.FCode);*/ } count += 1; total += 1; end = j.StartTime; bl = true; continue; } } } } } coun = Math.Round(x,2); total = total > 0 ? total : 1; a.list.Add(new Params() { name = item, value = Math.Round(x / (total * (endtime.Subtract(start).TotalHours))*100, 2).ToString() } ); } b.list.Add(new Params() { name = "总计",value = count.ToString() }); b.list.Add(new Params() { name = "停机",value = count1.ToString()}); b.list.Add(new Params() { name = "运转",value = count2.ToString()}); b.list.Add(new Params() { name = "预约",value = count3.ToString()}); b.list.Add(new Params() { name = "离线", value = count4.ToString() }); da.Add(a); da.Add(b); /* List> strr = new List>(); strr.Add(s1); strr.Add(s2); strr.Add(s3); strr.Add(s4); data.Add(new Center() { str = strr });*/ return data; } public LayuiModel GetTempDetail(DateTime start, DateTime end, string fcode, int pageIndex, int pageSize) { string sql = $@"select a.FCode FCode,b.HumidPV HumidPV,b.TemperaturePV TemperaturePV,b.HumidSv HumidSv,b.TemperatureSV TemperatureSV,a.MacNum MacNum,b.ModeTime date from machine a left outer join baseinfo b on a.id =b.macid left outer join supplier d on a.SupplierID =d.id where 1=1 and b.ModeTime>='{start.ToString("yyyy-MM-dd HH:mm:ss")}' and b.ModeTime<='{end.ToString("yyyy-MM-dd HH:mm:ss")}' and a.FCode='{fcode}' order by b.ModeTime desc limit {(pageIndex - 1) * pageSize},{pageSize}"; string error = ""; var data = db.FindList(sql); var dto = GetTemp(start.ToString("yyyy-MM-dd HH:mm:ss"), end.ToString("yyyy-MM-dd HH:mm:ss"), fcode); var total = Convert.ToInt32(db.FindObject($@"select count(1) from machine a left outer join baseinfo b on a.id =b.macid left outer join supplier d on a.SupplierID =d.id where 1=1 and b.ModeTime>='{start.ToString("yyyy-MM-dd HH:mm:ss")}' and b.ModeTime<='{end.ToString("yyyy-MM-dd HH:mm:ss")}' and a.FCode='{fcode}'")); return new LayuiModel() { code = 1, data = data, count=total, extraObject = dto }; } public IEnumerable GetAlarmDetails(DateTime date, string fcode) { string str = string.Empty; return db.FindListForCondition($@" and a.starttime >='{date.ToString("yyyy-MM-dd HH:mm:ss")}' and b.fcode='{fcode}' order by a.starttime desc" ,ref str); } public LayuiModel GetBase(DateTime? time, string fcode) { DateTime t; var d = new List>(); if (!time.HasValue) { t = DateTime.Now; } else { t = time.Value; } double ds = 0; var x = Get(t, fcode, string.Empty, string.Empty, string.Empty, ref d,ref ds); MachineBase y = new MachineBase(); var dic = new Dictionary(); dic.Add("-1", "离线"); dic.Add("0", "停机"); dic.Add("1", "运转"); dic.Add("2", "预约"); if (x != null) { foreach (var item in x) { foreach (var it in item.list) { if (it.FCode == fcode) { y.FCode = it.FCode; y.FName = it.FName; y.Cycle = it.Cycle; y.Time = (Convert.ToInt32(it.Hour) + Math.Round(Convert.ToDouble(it.Minutes) / 60, 2)).ToString(); y.Model = it.Model; y.Hour = it.Hour; y.Minutes = it.Minutes; y.ProgramName = it.ProgramName; y.Status = it.Status; y.Step = it.Step; y.IPAdress = it.IPAdress; switch ((y.Status)) { case "-1": y.StatusName = "离线"; break; case "0": y.StatusName = "停机"; break; case "1": y.StatusName = "运转"; break; case "2": y.StatusName = "预约"; break; default: y.StatusName = "暂无"; break; } } } } } y.StatusTime = ds.ToString(); string str = string.Empty; var dd = new Dictionary(); var z = GetAlarm(t, fcode,ref dd); foreach (var item in dd) { if (item.Key == t.ToString("yyyy-MM-dd")) { y.AlarmNum = item.Value; } } foreach (var item in d) { if (item.name =="rate") { y.Rate = item.list[0].value; } } return new LayuiModel() { code = 1, data = new List() { y } }; } public ChartDto GetAlarm(DateTime? time, string fcode,ref Dictionary dic) { if (!time.HasValue) { time = DateTime.Now; } string str = string.Empty; var data = new ChartDto(); data.XData = new List(); data.SeriesData = new List(); for (int i = 0; i< 4; i++) { DateTime d = time.Value.AddDays(-i); data.XData.Add(d.ToString("yyyy-MM-dd")); string sql = $@"select count(1) from alarminfo a left outer join machine b on a.macid =b.id where b.fcode='{fcode}' and a.rectime>='{d.ToString("yyyy-MM-dd 00:00:00")}' and a.rectime<'{d.AddDays(1).ToString("yyyy-MM-dd 00:00:00")}'"; var da = db.FindObject(sql); data.SeriesData.Add(new DllEapEntity.OFILM.Series() { Name = d.ToString("yyyy-MM-dd"), YAxis = 0, Type = "column", Data = new List() { decimal.Parse(da.ToString()) } }); dic.Add(d.ToString("yyyy-MM-dd"), da.ToString()); } return data; } public List>> GetTemp(string start,string end, string fcode) { string str = string.Empty; string sql = $@" and b.fcode='{fcode}' and a.modetime >='{start}' and a.modetime<'{end}'"; var x = db.FindListForCondition(sql, ref str).ToList(); var tep = new Center() { name = "温度实际值", list = new List() }; var tes = new Center() { name = "温度标准值", list = new List() }; var hp = new Center() { name = "湿度实际值", list = new List() }; var hs = new Center() { name = "湿度标准值", list = new List() }; /*foreach (var item in x) { ArrayList aa = new ArrayList() { item.RecTime.ToString("HH:mm"), Convert.ToDouble(item.TemperaturePV.Trim()) }; tep.list.Add(aa); ArrayList bb = new ArrayList() { item.RecTime.ToString("HH:mm"), Convert.ToDouble(item.TemperatureSV.Trim()) }; tes.list.Add(bb); ArrayList cc = new ArrayList { item.RecTime.ToString("HH:mm"), Convert.ToDouble(item.HumidPV.Trim()) }; hp.list.Add(cc); ArrayList arrayList = new ArrayList(); arrayList.Add(item.RecTime.ToString("HH:mm")); arrayList.Add(Convert.ToDouble(item.HumidSv.Trim())); hs.list.Add(arrayList); } var bs = x.LastOrDefault(); if (DateTime.Parse(bs.RecTime.ToString("HH:mm")) < DateTime.Parse(DateTime.Parse(end).AddSeconds(-1).ToString("HH: mm"))) { for (DateTime i=bs.RecTime.AddMinutes(1); i<= DateTime.Parse(end); i=i.AddMinutes(1)) { ArrayList array = new ArrayList() { i.ToString("HH:mm"), null }; tep.list.Add(array); tes.list.Add(array); hp.list.Add(array); hs.list.Add(array); } }*/ for (DateTime i = DateTime.Parse(start); i <= DateTime.Parse(end); i = i.AddMinutes(1)) { var data1 = x.FirstOrDefault(c => (c.ModeTime.ToString("yyyy-MM-dd HH:mm:00") == i.ToString("yyyy-MM-dd HH:mm:00"))); var data2 = x.Where(c => (c.ModeTime > DateTime.Parse(i.AddMinutes(-5).ToString("yyyy-MM-dd HH:mm:00")) && c.ModeTime <= DateTime.Parse(i.AddMinutes(5).ToString("yyyy-MM-dd HH:mm:00")))).ToList(); if (data1 == null) { if (data2.Count < 1) { ArrayList array = new ArrayList() { i.ToString("yyyy-MM-dd HH:mm:ss"), null }; tep.list.Add(array); tes.list.Add(array); hp.list.Add(array); hs.list.Add(array); } } else { ArrayList aa = new ArrayList() { i.ToString("yyyy-MM-dd HH:mm:ss"), Convert.ToDouble(data1.TemperaturePV.Trim()) }; tep.list.Add(aa); ArrayList bb = new ArrayList() { i.ToString("yyyy-MM-dd HH:mm:ss"), Convert.ToDouble(data1.TemperatureSV.Trim()) }; tes.list.Add(bb); ArrayList cc = new ArrayList { i.ToString("yyyy-MM-dd HH:mm:ss"), Convert.ToDouble(data1.HumidPV.Trim()) }; hp.list.Add(cc); ArrayList arrayList = new ArrayList(); arrayList.Add(i.ToString("yyyy-MM-dd HH:mm:ss")); arrayList.Add(Convert.ToDouble(data1.HumidSv.Trim())); hs.list.Add(arrayList); } } var data = new List>>() { new Center> { name="温度", list=new List> { tep,tes } }, new Center> { name="湿度", list=new List> { hp,hs } } }; return data; } public IEnumerable GetStatus(DateTime time,string fcode, out List d) { DateTime start, end; var dd = new List(); if (DateTime.Now.Subtract(time).TotalDays < 1) { end = DateTime.Now.AddMinutes(-1); start = Convert.ToDateTime(DateTime.Now.ToString("D").ToString()); } else { start = Convert.ToDateTime(time.ToString("D").ToString()); end = Convert.ToDateTime(time.AddDays(1).ToString("D").ToString()).AddSeconds(-1); } string str = string.Empty; DateTime date = DateTime.Now; var x = db.FindListForCondition($@" and starttime<='{end.ToString("yyyy-MM-dd HH:mm:ss")}' and macid=(select id from machine where fcode='{fcode}') ORDER BY StartTime desc ", ref str); var y = new List(); foreach (var item in x) { if (item.EndTime < start && item.EndTime.ToString("yyyy-MM-dd HH:mm:ss") != "0001-01-01 00:00:00") { if (y.Count == 0){ y.Add(item); } break; } y.Add(item); } var history = new List(); var dateFormatter = "yyyy-MM-dd H:mm:ss"; var dic = new Dictionary(); dic.Add("-1", "离线"); dic.Add("0", "停机"); dic.Add("1", "运转"); dic.Add("2", "预约"); foreach (var item in dic) { dd.Add(new StatusRatio() { Status = item.Key, StatusName = item.Value, ratio = 0, time = 0 }); } double sum = 0; if (y.Count > 0) { for (int i = y.Count - 1; i >= 0; i--) { if (y[i].StartTime <= start) { if (y[i].EndTime >= end) { var z = new RunHistroyDto() { Start = start.Hour * 100 + start.Minute, StartTime = start.ToString(dateFormatter), End = end.Hour * 100 + end.Minute, EndTime = end.ToString(dateFormatter) , MacCode = fcode, Status = y[i].Status, TimeLen = Math.Round( end.Subtract(start).TotalHours , 2), Duration = AppendDuration( end - start ), /* Color=*/ }; switch ((z.Status)) { case "-1": z.StatusName = "离线"; break; case "0": z.StatusName = "停机"; break; case "1": z.StatusName = "运转"; break; case "2": z.StatusName = "预约"; break; default: z.StatusName = "暂无"; break; } history.Add(z); foreach (var item in dd) { if (z.Status == item.Status) { item.time += z.TimeLen; } } sum += z.TimeLen; break; } else if(y[i].EndTime.ToString("yyyy-MM-dd HH:mm:ss") == "0001-01-01 00:00:00") { var z = new RunHistroyDto() { Start = start.Hour * 100 + start.Minute, StartTime = start.ToString(dateFormatter), End = date > end ? end.Hour * 100 + end.Minute : date.Hour * 100 + date.Minute, EndTime = date > end ? end.ToString(dateFormatter) : date.ToString(dateFormatter), MacCode = fcode, Status = y[i].Status, StatusName = dic[y[i].Status], TimeLen = Math.Round(date > end ? end.Subtract(start).TotalHours : date.Subtract(start).TotalMinutes, 2), Duration = AppendDuration(date > end ? end - start : date - start), /* Color=*/ }; history.Add(z); foreach (var item in dd) { if (z.Status == item.Status) { item.time += z.TimeLen; } } sum += z.TimeLen; break; } else { var z = new RunHistroyDto() { Start = start.Hour * 100 + start.Minute, StartTime = start.ToString(dateFormatter), End = y[i].EndTime.Hour * 100 + y[i].EndTime.Minute , EndTime = y[i].EndTime.ToString(dateFormatter) , MacCode = fcode, Status = y[i].Status, StatusName = dic[y[i].Status], TimeLen = Math.Round(y[i].EndTime.Subtract(start).TotalHours, 2), Duration = AppendDuration(y[i].EndTime - start ), /* Color=*/ }; history.Add(z); foreach (var item in dd) { if (z.Status == item.Status) { item.time += z.TimeLen; } } sum += z.TimeLen; start = y[i].EndTime; } } else { var z1 = new RunHistroyDto() { Start = start.Hour * 100 + start.Minute, StartTime = start.ToString(dateFormatter), End = y[i].StartTime.Hour * 100 + y[i].StartTime.Minute, EndTime = y[i].StartTime.ToString(dateFormatter), MacCode = fcode, Status = "-1", StatusName = dic["-1"], TimeLen = Math.Round(y[i].StartTime.Subtract(start).TotalHours, 2), Duration = AppendDuration(y[i].StartTime - start), /* Color=*/ }; history.Add(z1); foreach (var item in dd) { if (z1.Status == item.Status) { item.time += z1.TimeLen; } } sum += z1.TimeLen; start = y[i].StartTime; if (y[i].EndTime >= end) { var z = new RunHistroyDto() { Start = start.Hour * 100 + start.Minute, StartTime = start.ToString(dateFormatter), End = end.Hour * 100 + end.Minute, EndTime = end.ToString(dateFormatter), MacCode = fcode, Status = y[i].Status, StatusName = dic[y[i].Status], TimeLen = Math.Round(end.Subtract(start).TotalHours, 2), Duration = AppendDuration(end - start), /* Color=*/ }; history.Add(z); foreach (var item in dd) { if (z.Status == item.Status) { item.time += z.TimeLen; } } sum += z.TimeLen; break; } else if (y[i].EndTime.ToString("yyyy-MM-dd HH:mm:ss") == "0001-01-01 00:00:00") { var z = new RunHistroyDto() { Start = start.Hour * 100 + start.Minute, StartTime = start.ToString(dateFormatter), End = date > end ? end.Hour * 100 + end.Minute : date.Hour * 100 + date.Minute, EndTime = date > end ? end.ToString(dateFormatter) : date.ToString(dateFormatter), MacCode = fcode, Status = y[i].Status, StatusName = dic[y[i].Status], TimeLen = Math.Round(date > end ? end.Subtract(start).TotalHours : date.Subtract(start).TotalMinutes, 2), Duration = AppendDuration(date > end ? end - start : date - start), /* Color=*/ }; history.Add(z); foreach (var item in dd) { if (z.Status == item.Status) { item.time += z.TimeLen; } } sum += z.TimeLen; break; } else { var z = new RunHistroyDto() { Start = start.Hour * 100 + start.Minute, StartTime = start.ToString(dateFormatter), End = y[i].EndTime.Hour * 100 + y[i].EndTime.Minute, EndTime = y[i].EndTime.ToString(dateFormatter), MacCode = fcode, Status = y[i].Status, StatusName = dic[y[i].Status], TimeLen = Math.Round(y[i].EndTime.Subtract(start).TotalHours, 2), Duration = AppendDuration(y[i].EndTime - start), /* Color=*/ }; history.Add(z); foreach (var item in dd) { if (z.Status == item.Status) { item.time += z.TimeLen; } } sum += z.TimeLen; start = y[i].EndTime; } } } } foreach (var item in dd) { item.ratio = Math.Round(item.time / sum, 2) * 100; } d = dd; return history; } private string AppendDuration(TimeSpan timeSpan) { var days = timeSpan.Days; var hours = 0; if (days > 0) { hours = days * 24; } hours += timeSpan.Hours; var hourPart = hours + "小时"; var minutePart = timeSpan.Minutes + "分"; var secondPart = timeSpan.Seconds + "秒"; if (timeSpan.TotalSeconds < 60) return secondPart; else if (timeSpan.TotalSeconds < 3600) { return minutePart + secondPart; } else { return hourPart + minutePart + secondPart; } } } }