/// <summary> /// 处理DT的数据(不同的proc可能在同一个时间段发生DT,所以重复的DT要进行合并) /// </summary> /// <returns></returns> private List <DtData> GetDtDataAll(Dictionary <string, List <DtData> > dictProcDt, List <DateTime[]> timeSpan) { DateTime endTS = timeSpan.Last()[1]; List <DtData> dtDataTmp = new List <DtData>(); List <DtData> dtDataRet = new List <DtData>(); // 1. 合并所有的proc的DtData foreach (KeyValuePair <string, List <DtData> > kv in dictProcDt) { // 1. 处理每一个proc最后一个DT结束时间可能为NULL, 机器一直没有运行起来 // 这种情况的end 就是班次的最后时间 List <DtData> dtDataProc = kv.Value; if (dtDataProc.Count > 0) { DtData endDt = dtDataProc.Last(); if (endDt.end.Year == 1) { endDt.end = endTS; } } dtDataTmp.AddRange(kv.Value); } // 2. 处理DtData的时间段重复问题 //先将所有的dt按照错误时间点进行升序排列 List <DtData> dtDataAllOrder = dtDataTmp.OrderBy(item => item.start).ToList(); // 合并所有的重复时间段 if (dtDataAllOrder.Count > 0) { DateTime startTmp = dtDataAllOrder[0].start; DateTime endTmp = dtDataAllOrder[0].start; foreach (DtData item in dtDataAllOrder) { // 当下一个DT的开始时间大于上一个的结束时间 // 说明 一个DT已经结束了,不存在重复时间段 if (item.start > endTmp) { dtDataRet.Add(new DtData { start = startTmp, end = endTmp }); startTmp = item.start; endTmp = item.end; } else { if (item.end > endTmp) { endTmp = item.end; } } } // 最后一组数据需要处理添加 dtDataRet.Add(new DtData { start = startTmp, end = endTmp }); } return(dtDataRet); }
/// <summary> /// 获取说有的DTtime /// </summary> /// <param name="dt"></param> /// <returns></returns> private Dictionary <string, List <DtData> > GetDtDataByProc(DataTable dt) { Dictionary <string, List <DtData> > dictProcDt = new Dictionary <string, List <DtData> >(); bool isRun = true; // 遍历所有数据 foreach (DataRow row in dt.Rows) { int rid = Convert.ToInt32(row["rid"]); int judge_text = Convert.ToInt32(row["judge_text"]); // 根据rid的排序创建不同的proc_uuid的字典 if (Convert.ToInt32(row["rid"]) == 1) { List <DtData> dtDataList = new List <DtData>(); dictProcDt.Add(row["proc_uuid"].ToString(), dtDataList); isRun = true; } // 当发生错误的时候记录 if (isRun && judge_text == 1) { DateTime start = Convert.ToDateTime(row["process_at"].ToString()); dictProcDt[row["proc_uuid"].ToString()].Add(new DtData { start = start }); isRun = false; continue; } // 当机器重新运行的时候 if (!isRun && judge_text == 0) { DtData dtData = dictProcDt[row["proc_uuid"].ToString()].Last(); dtData.end = Convert.ToDateTime(row["process_at"].ToString()); isRun = true; } } return(dictProcDt); }