using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; using DDUtilityApp.LOGPARSER.DATA; using JWH; using JWH.DATA; namespace DDUtilityApp.LOGPARSER { public partial class FrmMessageReplyTime : Form { #region [ Deleage ] =================================================== #endregion #region [ Events ] ==================================================== #endregion #region [ Variables ] ================================================= #endregion #region [ Properties ] ================================================ public StandardCollection StandardCollection { get; set; } = null; public Dictionary> MessageCollection { get; set; } = new Dictionary>(); #endregion #region [ Constructor ] =============================================== public FrmMessageReplyTime() { InitializeComponent(); this.SetLayout(); this.SetEventHandler(); } public FrmMessageReplyTime(StandardCollection standardCollection) : this() { this.StandardCollection = standardCollection; } private void SetLayout() { Font font = new Font("돋움체", 9); this.cboxMessageName.Font = font; this.RadGrid_Setting(); this.Chart_Setting(); } private void SetEventHandler() { this.btnGenerate.Click += this.BtnGenerate_Click; this.cboxMessageName.SelectedIndexChanged += this.CboxMessageName_SelectedIndexChanged; this.button1.Click += this.Button1_Click; } #endregion #region [ Control Events ] ============================================ private void BtnGenerate_Click(object sender, EventArgs e) { this.Generate(); List lstMessage = new List(); lstMessage.Add(""); lstMessage.AddRange(this.MessageCollection.Keys.ToArray()); lstMessage.Sort(); this.cboxMessageName.DataSource = lstMessage.ToArray(); this.cboxMessageName.SelectedIndex = 0; } private void Generate() { Dictionary> dicSrc = new Dictionary>(); try { this.MessageCollection.Clear(); string[] arrServer = new string[] { "MES", "FDC", "RMS", "RTD" }; foreach (StandardData data in this.StandardCollection) { if (arrServer.Contains(data.Server) == false) continue; if (string.IsNullOrWhiteSpace(data.TID)) continue; string key = data.MessageName.Replace("Reply", ""); if (dicSrc.ContainsKey(key) == false) { dicSrc.Add(key, new List()); StandardDataPair pair = dicSrc[key].Where(x => x.TID == data.TID).FirstOrDefault(); if (pair == null) dicSrc[key].Add(new StandardDataPair(data)); else pair.Add(data); } else { StandardDataPair pair = dicSrc[key].Where(x => x.TID == data.TID).FirstOrDefault(); if (pair == null) dicSrc[key].Add(new StandardDataPair(data)); else pair.Add(data); } } foreach (KeyValuePair> srcPair in dicSrc) { string key = srcPair.Key; foreach (StandardDataPair pair in srcPair.Value) { if (pair.Request == null || pair.Response == null) continue; if (this.MessageCollection.ContainsKey(key) == false) MessageCollection.Add(key, new List()); this.MessageCollection[key].Add(pair); } } } catch (Exception ex) { XLogger.Instance.Fatal(ex); } } private void CboxMessageName_SelectedIndexChanged(object sender, EventArgs e) { this.chart.Series.Clear(); List lst = new List(); if (string.IsNullOrEmpty(this.cboxMessageName.Text)) { foreach (KeyValuePair> pair in this.MessageCollection) { lst.AddRange(pair.Value.ToArray()); this.Chart_AddSeries(pair.Key).Points.DataBind(pair.Value.ToArray(), "RequestTime", "Interval", "Label=Interval"); } } else { string key = this.cboxMessageName.Text; if (this.MessageCollection.ContainsKey(key) == false) return; lst.AddRange(this.MessageCollection[key].ToArray()); //this.Chart_AddSeries(this.cboxMessageName.Text); this.Chart_AddSeries(key).Points.DataBind(this.MessageCollection[key].ToArray(), "RequestTime", "Interval", "Label=Interval"); } this.grid.AutoBinding(lst.ToArray()); //this.chart.DataSource = lst.ToArray(); //this.chart.DataBindCrossTable(lst.ToArray(), "MessageName", "RequestTime", "Interval", "Label=MessageName"); } private void Button1_Click(object sender, EventArgs e) { this.Chart_Setting(); //this.chart.Series.Clear(); //CartesianSeries series = this.chart.Series[0] as CartesianSeries; //series.CombineMode = ChartSeriesCombineMode.None; } #endregion #region [ Public Method ] ============================================= #endregion #region [ Method ] ==================================================== private void RadGrid_Setting() { this.grid.MultiSelect = true; this.grid.Columns.Clear(); this.grid.TableElement.RowHeight = 20; this.grid.AddColumn("MessageName"); this.grid.AddColumn("RequestTime"); this.grid.AddColumn("ResponseTime"); this.grid.AddColumn("Interval", "", true, "{0:#,##0.000}"); } private void Chart_Setting() { //this.chart.ChartAreas[0].AxisX.ScaleView.Zoom() //ChartArea chartArea = new ChartArea(); //this.chart.ChartAreas.Add(chartArea); //Legend legend = new Legend(); //this.chart.Legends.Add(legend); } private Series Chart_AddSeries(string name) { Series series = new Series(); series.Name = name; series.LegendText = name; series.ChartType = SeriesChartType.Line; series.XValueType = ChartValueType.Time; series.XValueMember = "RequestTime"; series.YValueType = ChartValueType.Double; series.YValueMembers = "Interval"; this.chart.Series.Add(series); return series; } #endregion } public class StandardDataPair : DataTableBase { public StandardData Request { get; set; } = null; public StandardData Response { get; set;} = null; public string MessageName { get; set; } = string.Empty; public string TID { get; set; } = string.Empty; public DateTime RequestTime { get { return (this.Request == null ? DateTime.MinValue : this.Request.DateTime); } } public DateTime ResponseTime { get { return (this.Response == null ? DateTime.MinValue : this.Response.DateTime); } } public double Interval { get { return this.GetInterval(); } } public StandardDataPair() { } public StandardDataPair(params StandardData[] datas) { foreach(StandardData data in datas) this.Add(data); } public override string ToString() { return this.GetInterval().ToString(); } public void Add(StandardData data) { if (data == null) return; if (string.IsNullOrWhiteSpace(this.TID)) this.TID = data.TID; else if (this.TID != data.TID) return; if (data.MessageName.ToUpper().EndsWith("Reply".ToUpper())) this.Response = data; else { this.Request = data; this.MessageName = data.MessageName; } } /// /// 응답시간(초) /// /// public double GetInterval() { double interval = 0; if (this.Request == null || this.Response == null) return interval; TimeSpan timeSpan = this.Response.DateTime.Subtract(this.Request.DateTime); interval = timeSpan.TotalSeconds; return interval; } } }