示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }