using Cksoft.Data; using System; using System.Collections.Generic; using System.Text; using DllEapEntity.Dtos; using System.Linq; using Cksoft.Unity; namespace DllEapDal { /// /// 机台事件主档 /// public class McaSecVMstDal { public McaSecVMstDal(IDatabase db) { CurrDb = db; } private IDatabase CurrDb; /// /// 机台某一时间段报警统计(柱状图) /// /// /// /// public ChartDto CreateCategory(string filter) { var dto = GetAlarmAnalysis(filter, "name", "asc"); var chartDto = new ChartDto { text = "机台报警统计", legend = new string[] { "报警次数" }, xdata = dto.Select(c => c.name).ToArray(), ydata = dto.Select(c => (float)c.count).ToArray() }; return chartDto; } /// /// 机台报警次数分析 /// /// /// /// public IEnumerable GetAlarmAnalysis(string filter, string sort = "name", string order = "asc") { if (string.IsNullOrEmpty(sort) || sort == "null") sort = "name"; if (string.IsNullOrEmpty(order) || order == "null") order = "asc"; string sql = "select McaCode as name,sum(1) as count,c.FName as macname,a.McaCode as maccode,c.FModel as macmodel,d.PCode from McaSecVMst a " + "left join McaSecTime b on a.ID = b.PreID " + "left join Machine c on a.McaCode = c.FCode " + "left join MacTProcess d on c.ID = d.MacID " + "left join TProcess e on d.PCode = e.FCode " + $"where 1=1 {filter} and a.EventCode='C00007' " + $"group by McaCode,c.FName,c.FCode,c.FModel,d.PCode order by {sort} {order} "; var dtos = CurrDb.FindList(sql); return dtos; } /// /// 报警代码分析 /// /// /// /// /// /// public IEnumerable GetAlarmCodeAnalysis(string filter, string sort = "name", string order = "asc") { if (string.IsNullOrEmpty(sort) || sort == "null") sort = "name"; if (string.IsNullOrEmpty(order) || order == "null") order = "asc"; string sql = "select f.FVal as name,g.Fval as description,SUM(1) as count from McaSecVMst a " + "left join McaSecTime b on a.ID = b.PreID " + "left join Machine c on a.McaCode = c.FCode " + "left join MacModel d on c.FModel = d.FCode " + "left join MacTProcess e on c.ID = e.MacID " + "left join (select * from McaSecVDetail where FNum=2) f on a.ID=f.PreID " + "left join (select * from McaSecVDetail where FNum=3) g on a.ID=g.PreID " + $"where 1=1 {filter} and a.EventCode = 'C00007' " + filter + $"group by f.FVal,g.FVal order by {sort} {order}"; var dtos = CurrDb.FindList(sql); return dtos; } /// /// 根据报警代码进行统计分析 /// /// /// /// /// /// public ChartDto CreateAlarmCat(string filter) { var dto = this.GetAlarmCodeAnalysis(filter); var chartDto = new ChartDto { text = "报警统计", legend = new string[] { "报警次数" }, xdata = dto.Select(c => c.name).ToArray(), ydata = dto.Select(c => (float)c.count).ToArray() }; return chartDto; } /// /// 获取报警代码详情 /// /// /// /// /// public IEnumerable GetAramCodeDetail(string filter, int start, int end, string sort = "b.ptime", string order = "desc") { if (string.IsNullOrEmpty(sort) || sort == "null") sort = "b.ptime"; if (string.IsNullOrEmpty(order) || order == "null") order = "desc"; string sql = $"select * from(select row_number() over (order by {sort} {order}) as rowNum,a.McaCode as maccode,c.FName as macname,f.FVal as name,h.FVal as description,e.Pcode,g.FName as pname,c.Fmodel as macmodel,b.ptime from McaSecVMst a " + "left join McaSecTime b on a.ID = b.PreID " + "left join Machine c on a.McaCode = c.FCode " + "left join MacModel d on c.FModel = d.FCode " + "left join MacTProcess e on c.ID = e.MacID " + "left join (select * from McaSecVDetail where FNum=2) f on a.ID=f.PreID " + "left join (select * from McaSecVDetail where FNum=3) h on a.ID=h.PreID " + "left join TProcess g on e.Pcode=g.FCode " + $"where 1=1 {filter} and a.EventCode = 'C00007' " + filter + $" ) t where t.rowNum>={start} and t.rowNum<{end}"; return CurrDb.FindList(sql); } public int GetAralrCodeCount(string filter) { string sql = "select count(1) from McaSecVMst a " + "left join McaSecTime b on a.ID = b.PreID " + "left join Machine c on a.McaCode = c.FCode " + "left join MacModel d on c.FModel = d.FCode " + "left join MacTProcess e on c.ID = e.MacID " + "left join (select * from McaSecVDetail where FNum=3) h on a.ID=h.PreID " + "left join TProcess g on e.Pcode=g.FCode " + $"where 1=1 {filter} and a.EventCode = 'C00007' " + filter; return Convert.ToInt32(CurrDb.FindList(sql).FirstOrDefault() ?? "0"); } public IEnumerable GetMsts(string filter) { string sql = "select a.McaCode as maccode,c.FName as macname,f.FVal as name,h.FVal as description,e.Pcode,g.FName as pname,c.Fmodel as macmodel,a.EventCode,b.ptime,d.FName as macmodelname " + " from McaSecVMst a " + "left join McaSecTime b on a.ID = b.PreID " + "left join Machine c on a.McaCode = c.FCode " + "left join MacModel d on c.FModel = d.FCode " + "left join MacTProcess e on c.ID = e.MacID " + "left join (select * from McaSecVDetail where FNum=2) f on a.ID=f.PreID " + "left join (select * from McaSecVDetail where FNum=3) h on a.ID=h.PreID " + "left join TProcess g on e.Pcode=g.FCode " + $" where a.EventCode='C00007' or a.EventCode='C00008' {filter}"; var msts = CurrDb.FindList(sql).OrderBy(c => c.name); return msts; } /// /// 分析报警代码记录获取报警开始时间和结束时间 /// /// /// public IEnumerable AppendTime(IList msts, string type) { var mstStarts = msts.Where(c => c.eventCode == "C00007"); //报警开始的记录 // var mstEnds = msts.Where(c => c.EventCode == "C00008"); //报警解除的记录 List dtos = new List(); switch (type) { case "machine": dtos.AddRange(mstStarts.Select(c => new McaVMstADto() { Name = c.macname, StartTime = c.ptime, Desc = c.description, FCode = c.maccode, ErrorCode = c.name })); foreach (var item in dtos) { var endItem = msts.Where(c => c.maccode == item.FCode && c.eventCode == "C00008" && c.ptime > item.StartTime).OrderBy(c => c.ptime).FirstOrDefault(); if (endItem == null) { continue; } item.EndTime = endItem.ptime; } break; case "macmodel": dtos.AddRange(mstStarts.Select(c => new McaVMstADto() { Name = c.macmodelname, StartTime = c.ptime, Desc = c.description, FCode = c.macmodel, ErrorCode = c.name })); foreach (var item in dtos) { var endItem = msts.Where(c => c.macmodel == item.FCode && c.eventCode == "C00008" && c.ptime > item.StartTime).OrderBy(c => c.ptime).FirstOrDefault(); if (endItem == null) { continue; } item.EndTime = endItem.ptime; } break; case "process": dtos.AddRange(mstStarts.Select(c => new McaVMstADto() { Name = c.pname, StartTime = c.ptime, Desc = c.description, FCode = c.pcode, ErrorCode = c.name })); foreach (var item in dtos) { var endItem = msts.Where(c => c.macmodel == item.FCode && c.eventCode == "C00008" && c.ptime > item.StartTime).OrderBy(c => c.ptime).FirstOrDefault(); if (endItem == null) { continue; } item.EndTime = endItem.ptime; } break; } return dtos.Where(c => c.EndTime != null); } /// /// 获取MTBF统计 /// /// /// public IEnumerable GetMTBFs(string filter, string type) { var msts = GetMsts(filter).ToList(); var mcaVMsts = AppendTime(msts, type); var groups = mcaVMsts.GroupBy(c => new { c.FCode, c.Name }); var list = new List(); foreach (var item in groups) { var mtbf = new MTBFDto() { name = item.Key.Name, count = item.Count(), code = item.Key.FCode, minutes = item.Sum(c => { return (float)(c.EndTime - c.StartTime).Value.Seconds / 60f; }) }; mtbf.MTBF = mtbf.count / mtbf.minutes; list.Add(mtbf); } return list; } /// /// 组装返回客户端的最终数据 /// /// /// /// public LineDateDto GetAlarmTimeDtos(string filter, string type) { var dtos = GetDatasFromDb(filter, type); if (dtos == null || dtos.Count() == 0) return null; var dateStart = dtos.Min(c => c.Time); //统计开始时间 var dateEnd = dtos.Max(c => c.Time); //统计结束时间 TimeSpan timeSpan = dateEnd - dateStart; var days = (int)Math.Ceiling(timeSpan.TotalDays); var groups = dtos.GroupBy(c => c.Name); var series = new List(); if (groups != null && groups.Count() > 0) { foreach (var item in groups) { var temps = dtos.Where(c => c.Name == item.Key).ToList(); for (var i = 0; i <= days; i++) { if (temps.FirstOrDefault(c => c.Time == dateStart.AddDays(i)) == null) { temps.Add(new AlarmTimeDto() { Name = item.Key, Count = 0, Time = dateStart.AddMinutes(i) }); } } series.Add(new LineSeries() { Name = item.Key, AlarmTimeDtos = temps.OrderBy(c => c.Time) }); } } var dates = new List(); for (var j = 0; j <= days; j++) { dates.Add(dateStart.AddDays(j)); } var lineDateDto = new LineDateDto() { LineSeries = series, Dates = dates }; return lineDateDto; } /// /// 从数据库中读取原始统计数据 /// /// /// /// private IEnumerable GetDatasFromDb(string filter, string type) { string sql = string.Empty; switch (type) { case "machine": sql = $" select mcacode as name,SUM(1) as count,SUBSTRING(CONVERT(varchar(50),b.ptime,20),0,11) time from McaSecVMst a " + "left join McaSecTime b on a.ID = b.PreID " + "where mcacode in (select top 10 mcacode from McaSecVMst where EventCode = 'C00007' group by McaCode order by count(1) desc) " + $"and EventCode = 'C00007' {filter} " + "group by McaCode,SUBSTRING(CONVERT(varchar(50), b.ptime, 20), 0, 11) order by McaCode,SUBSTRING(CONVERT(varchar(50), b.ptime, 20), 0, 11) "; break; case "macmodel": sql = $" select c.FModel as name,SUM(1) as count,SUBSTRING(CONVERT(varchar(50),b.ptime,20),0,11) time from McaSecVMst a " + "left join McaSecTime b on a.ID = b.PreID " + "left join Machine c on a.mcacode=c.FCode " + "where c.FModel in (select top 10 FModel from McaSecVMst e,Machine f where e.mcacode=f.Fcode and e.EventCode = 'C00007' " + "group by f.FModel order by count(1) desc) " + $"and EventCode = 'C00007' {filter} " + "group by c.FModel,SUBSTRING(CONVERT(varchar(50), b.ptime, 20), 0, 11) order by c.FModel,SUBSTRING(CONVERT(varchar(50), b.ptime, 20), 0, 11) "; break; case "process": sql = $" select e.FName as name,SUM(1) as count,SUBSTRING(CONVERT(varchar(50),b.ptime,20),0,11) time from McaSecVMst a " + "left join McaSecTime b on a.ID = b.PreID " + "left join Machine c on a.mcacode=c.FCode " + "left join MacTProcess d on c.ID = d.MacID " + "left join TProcess e on d.PCode =e.FCode " + "where d.PCode in (select top 10 PCode from McaSecVMst h " + "left join Machine i on h.mcacode=i.Fcode " + "left join MacTProcess j on i.ID=j.MacID " + " where h.EventCode = 'C00007' " + "group by j.PCode order by count(1) desc) " + $"and EventCode = 'C00007' {filter} " + "group by e.FName,SUBSTRING(CONVERT(varchar(50), b.ptime, 20), 0, 11) order by e.FName,SUBSTRING(CONVERT(varchar(50), b.ptime, 20), 0, 11) "; break; } IEnumerable dtos = CurrDb.FindList(sql); return dtos; } /// /// 获取数据库中所有的机台的运行开始结束时间 /// /// /// private IEnumerable GetEffiencyEntities(string filter) { string sql = @" select MAX(b.ptime) as endTime,MIN(b.ptime) as startTime,a.mcacode,c.FModel as MacModel, d.FName as MacModelName,e.PCode,f.FName as PName from McaSecVMst a left join McaSecTime b on a.ID=b.PreID left join Machine c on a.McaCode=c.FCode left join MacModel d on c.FModel=d.FCode left join MacTProcess e on c.ID=e.MacID left join TProcess f on e.PCode=f.FCode " + $" where 1=1 {filter}" + " group by a.McaCode,c.FModel,d.FName,e.PCOde,f.FName"; return CurrDb.FindList(sql); } /// /// 获取以机台为基准的效率统计列表 /// /// /// public IEnumerable GetMachineEfficienciesGroupByMcaCode(string filter) { var datas = GetEffiencyEntities(filter); var list = new List(); int j = 0; foreach (var item in datas) { list.Add(new MachineEfficiency { Index = ++j, Count = 1, Name = item.McaCode, // RunTime = (item.EndTime - item.StartTime).Value.TotalMinutes, Key = item.McaCode, HasChildren = false, Type = "machine" }); } return list; } /// /// 以机型为基准的效率统计列表 /// /// /// public IEnumerable GetMachineEfficienciesGroupByMacModel(string filter) { var datas = GetEffiencyEntities(filter); var list = new List(); var groups = datas.GroupBy(c => new { c.MacModel, c.MacModelName }); int j = 0; foreach (var item in groups) { list.Add(new MachineEfficiency { Index = ++j, Name = item.Key.MacModelName, Count = item.Count(), // RunTime = item.Sum(c => (c.EndTime - c.StartTime).Value.TotalMinutes), Key = item.Key.MacModel, HasChildren = true, Type = "macmodel" }); } return list; } /// /// 以制程为基准的效率统计列表 /// /// /// public IEnumerable GetMachineEfficienciesGroupByPcode(string filter) { var datas = GetEffiencyEntities(filter); var list = new List(); var groups = datas.GroupBy(c => new { c.PCode, c.PName }); int j = 0; foreach (var item in groups) { list.Add(new MachineEfficiency { Index = ++j, Name = item.Key.PName, Count = item.Count(), // RunTime = item.Sum(c => (c.EndTime - c.StartTime).Value.TotalMinutes), Key = item.Key.PCode, HasChildren = true, Type = "pcode" }); } return list; } //添加采集数据主档 //public McaSecVMst BatMcaSecVMst(McaSecVMst mst,List details,UInt32 orgnum, string usercode, ref string errorinfo) //{ // try // { // McaSecVMst tempmst = JudgeEventSame(mst, details, ref errorinfo); // if(!string.IsNullOrEmpty(errorinfo)) // { // return null; // } // if(tempmst!=null) // { // mst = tempmst; // } // else // { // mst = IMcaSecVMst(mst, usercode, ref errorinfo); // if (mst == null) // return null; // } // McaSecTime entity = IMcaSecTime(mst.ID, mst.ptime, orgnum, usercode, ref errorinfo); // if (entity == null) // return null; // if(details!=null) // { // foreach (var item in details) // item.PreID = mst.ID; // int result = CurrDb.InsertFor(details, usercode); // if (result < 0) // return null; // } // //计算数量 // string sqlstr = $@"update mcasecvmst // set fcount = (SELECT count(id) FROM mcasectime where preid = {mst.ID}) // where id = {mst.ID}"; // CurrDb.ExecuteBySql(sqlstr); // return mst; // } // catch (Exception e) // { // errorinfo = e.Message; // return null; // } //} public McaSecVMst BatMcaSecVMst(McaSecVMst mst, List details, UInt32 orgnum, string usercode, ref string errorinfo) { try { mst = IMcaSecVMst(mst, usercode, ref errorinfo); if (mst == null) return null; McaSecTime entity = IMcaSecTime(mst.ID, mst.ptime, orgnum, usercode, ref errorinfo); if (entity == null) return null; if (details != null) { foreach (var item in details) item.PreID = mst.ID; int result = CurrDb.InsertFor(details, usercode); if (result < 0) return null; } //计算数量 string sqlstr = $@"update mcasecvmst set fcount = (SELECT count(id) FROM mcasectime where preid = {mst.ID}) where id = {mst.ID}"; CurrDb.ExecuteBySql(sqlstr); return mst; } catch (Exception e) { errorinfo = e.ToString(); return null; } } //判断该机台最后事件与当前事件是否相同 private McaSecVMst JudgeEventSame(McaSecVMst mst, List details,ref string errorinfo) { try { string condition = $" and a.id=(SELECT max(id) FROM mcasecvmst where McaCode='{mst.McaCode}')"; List temps = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); if (temps.Count <= 0) return null; //小于0,则无需比较参数 if (mst.FType <= 0 && mst.FType == temps[0].FType && mst.FStatus == temps[0].FStatus) return temps[0]; if (details == null) return null; if (mst.FType > 0 && mst.FType == temps[0].FType && mst.FStatus == temps[0].FStatus&&mst.EventCode==temps[0].EventCode) { //比较参数 condition = $" and a.preid={temps[0].ID}"; List orgdetails = CurrDb.FindListForCondition(condition, ref errorinfo).ToList(); if (details.Count != orgdetails.Count) return null; for(int i=0;i(id); return mst; } catch (Exception e) { errorinfo = e.Message; return null; } } public McaSecTime IMcaSecTime(int mstid,DateTime ptime,UInt32 orgnum, string usercode, ref string errorinfo) { try { McaSecTime entity = new McaSecTime(); entity.PreID = mstid; entity.ptime = ptime; entity.OrgFNum = orgnum; int result = CurrDb.InsertFor(entity, usercode); if (result < 0) { return null; } object objid = CurrDb.FindObject("select @@IDENTITY"); if (objid.ToString() == "") { return null; } int id = int.Parse(objid.ToString()); entity = CurrDb.FindEntityFor(id); return entity; } catch (Exception e) { errorinfo = e.Message; return null; } } } }