using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; using System.Windows.Forms; using JWH; using JWH.MONGODB; using MongoDB.Bson; using Telerik.WinControls.Data; using Telerik.WinControls.UI; using static JWH.MONGODB.FDCMongoDB; namespace DDUtilityApp.MONGO { public partial class FrmFDCMongo : Form { public string EquipmentID { get; set; } = string.Empty; public string VID { get; set; } = string.Empty; public DateTime DateTimeStart { get; set; } = DateTime.Now.Date; public DateTime DateTimeEnd { get; set; } = DateTime.Now.AddDays(1).Date; public FrmFDCMongo() { InitializeComponent(); this.SetLayout(); this.SetEventHandler(); } private void SetLayout() { this.Text = $"FDC MongoDB"; this.dpStart.CustomFormat = "yyyy-MM-dd HH:mm"; this.dpStart.Format = DateTimePickerFormat.Custom; this.dpStart.Value = this.DateTimeStart; this.dpEnd.CustomFormat = "yyyy-MM-dd HH:mm"; this.dpEnd.Format = DateTimePickerFormat.Custom; this.dpEnd.Value = this.DateTimeEnd; this.pbarCollectionSize.Visible = false; this.lblProgressValue.Visible = false; this.tree.ShowLines = true; this.tree.ShowRootLines = true; this.GridSetting(); } private void SetEventHandler() { this.Shown += this.FrmFDC_Shown; this.tboxEquipmentID.KeyDown += this.TboxEquipmentID_KeyDown; this.btnEquipmentFind.Click += this.BtnEquipmentFind_Click; this.dpStart.ValueChanged += this.DpStart_ValueChanged; this.dpEnd.ValueChanged += this.DpEnd_ValueChanged; this.btnRefresh.Click += this.BtnRefresh_Click; this.btnGetCollectionSizeStart.Click += this.BtnGetCollectionSizeStart_Click; this.tree.SelectedNodeChanged += this.Tree_SelectedNodeChanged; } #region [ Event ] ===================================================== private void FrmFDC_Shown(object sender, EventArgs e) { this.SetTree(); if (string.IsNullOrEmpty(this.EquipmentID)) return; this.tboxEquipmentID.Text = this.EquipmentID; this.dpStart.Value = this.DateTimeStart; this.dpEnd.Value = this.DateTimeEnd; this.BtnEquipmentFind_Click(null, null); } private void DpStart_ValueChanged(object sender, EventArgs e) { this.DateTimeStart = this.dpStart.Value; } private void DpEnd_ValueChanged(object sender, EventArgs e) { this.DateTimeEnd = this.dpEnd.Value; } private void BtnRefresh_Click(object sender, EventArgs e) { DateTime timeStart = DateTime.Now; List data = null; try { this.Cursor = Cursors.WaitCursor; this.ssName.Text = "GRID"; DateTime dtStart = this.DateTimeStart; DateTime dtEnd = this.DateTimeEnd; data = FDCMongoDB.GetCollectionData($"{this.EquipmentID}.{this.VID}", dtStart, dtEnd); timeStart = this.StatusLabelDisplay(this.ssStatus01, "수집", timeStart, DateTime.Now); this.grid.AutoBinding(data.ToArray()); } catch (Exception ex) { throw ex; } finally { this.StatusLabelDisplay(this.ssStatus02, "출력", timeStart, DateTime.Now); this.ssMessage.Text = $"RowCount is {data?.Count.ToString("#,##0")}"; this.Cursor = Cursors.Default; } } private void TboxEquipmentID_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) this.BtnEquipmentFind_Click(null, null); } private void BtnEquipmentFind_Click(object sender, EventArgs e) { RadTreeNode node = this.tree.Find(x => x.Name.StartsWith(this.tboxEquipmentID.Text)); if (node != null) { this.tree.ClearSelection(); node.Selected = true; node.ExpandAll(); } } private void BtnGetCollectionSizeStart_Click(object sender, EventArgs e) { if (FDCMongoDB.GetCollectionSize_Flag) { this.GetCollectionSize_Complete(); return; } SaveFileDialog dlg = new SaveFileDialog(); dlg.Title = "FDC Collection Infomation"; dlg.Filter = "CSV|*.csv"; dlg.FilterIndex = 0; dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); dlg.FileName = $"FDC_Collection-{DateTime.Now.ToString("yyyyMMddHHmm")}.csv"; if (dlg.ShowDialog() != DialogResult.OK) return; this.lblProgressValue.Text = ""; this.lblProgressValue.Visible = true; this.pbarCollectionSize.Visible = true; this.btnGetCollectionSizeStart.Text = "Stop"; FDCMongoDB.GetCollectionSize(dlg.FileName, this.GetCollectionSize_Complete, this.pbarCollectionSize, this.lblProgressValue); } private void GetCollectionSize_Complete(string filename = "") { FDCMongoDB.GetCollectionSize_Flag = false; this.btnGetCollectionSizeStart.Text = "Start"; this.pbarCollectionSize.Visible = false; this.lblProgressValue.Visible = false; if (string.IsNullOrEmpty(filename)) return; Process.Start(filename); } #endregion #region [ Method ] ==================================================== private DateTime StatusLabelDisplay(RadLabelElement control, string name, DateTime start, DateTime end) { TimeSpan span = end.Subtract(start); StringBuilder sb = new StringBuilder(); if (!string.IsNullOrEmpty(name)) sb.Append($"{name} "); sb.Append($"[{span.Seconds}.{span.Milliseconds.ToString("D3")}sec] "); sb.Append($"{start.ToString("HH:mm:ss.fff")}~{end.ToString("HH:mm:ss.fff")}"); control.Text = sb.ToString(); return end; } #endregion #region [ Tree: Equipment & VID List ] ================================ private void SetTree() { DateTime timeStart = DateTime.Now; SortedDictionary> dicEquipment = new SortedDictionary>(); try { this.Cursor = Cursors.WaitCursor; this.ssName.Text = "TREE"; timeStart = DateTime.Now; List lst = FDCMongoDB.GetListCollection(); timeStart = this.StatusLabelDisplay(this.ssStatus01, "수집", timeStart, DateTime.Now); foreach (BsonDocument doc in lst) { string[] values = doc.GetElement("name").Value.ToString().Split(new char[] { '=', '.' }); if (values.Length != 2) { XLogger.Instance.Error($"Split Fail: {doc.GetElement(0)}"); continue; } string name = values[0]; string vid = values[1]; if (!dicEquipment.ContainsKey(name)) dicEquipment[name] = new List(); dicEquipment[name].Add(vid); } DataTable dt = this.GetMesEquipment(); this.tree.Nodes.Clear(); foreach (string equipmentID in dicEquipment.Keys) { string text = equipmentID; RadTreeNode nodeParent = null; DataRow[] drEquipmnet = dt.Select($"EQUIPMENTID='{equipmentID}'"); if (drEquipmnet?.Length > 0) { string facilityName = drEquipmnet[0]["FACILITYNAME"].ToString(); string equipmentName = drEquipmnet[0]["DESCRIPTION"].ToString(); string segmentID = drEquipmnet[0]["PROCESSSEGMENTID"].ToString(); string segmentName = drEquipmnet[0]["PROCESSSEGMENTNAME"].ToString(); if (!this.tree.Nodes.Contains(facilityName)) this.tree.Nodes.Add(facilityName).Name = facilityName; nodeParent = this.tree.Nodes[facilityName]; //if (!nodeParent.Nodes.Contains(segmentID)) // nodeParent.Nodes.Add($"[{segmentID}] {segmentName}").Name = segmentID; //nodeParent = nodeParent.Nodes[segmentID]; text = $"[{equipmentID}] {equipmentName}({dicEquipment[equipmentID].Count})"; } RadTreeNode node = new RadTreeNode(text); node.Name = equipmentID; if (nodeParent != null) nodeParent.Nodes.Add(node); else this.tree.Nodes.Add(node); foreach (string vid in dicEquipment[equipmentID]) { RadTreeNode nodeVID = node.Nodes.Add(vid); nodeVID.Name = $"{equipmentID}.{vid}"; nodeVID.Tag = $"{equipmentID}.{vid}"; } } this.tree.SortOrder = System.Windows.Forms.SortOrder.Ascending; } catch (Exception ex) { throw ex; } finally { this.StatusLabelDisplay(this.ssStatus02, "출력", timeStart, DateTime.Now); this.ssMessage.Text = $"Equipment is {dicEquipment.Count.ToString("#,##0")}"; this.Cursor = Cursors.Default; } } private DataTable GetMesEquipment() { SqlConnection sqlConnection = null; DataSet ds = null; DataTable dt = null; try { string connectionString = string.Empty; StringBuilder query = new StringBuilder(); query.AppendLine($" SELECT A.SITEID, "); query.AppendLine($" A.FACILITYID, "); query.AppendLine($" D.FACILITYNAME, "); query.AppendLine($" B.PROCESSSEGMENTID, "); query.AppendLine($" B.PROCESSSEGMENTNAME, "); query.AppendLine($" A.SUBCATEGORY, "); query.AppendLine($" C.EQUIPMENTID AS MAINEQUIPMENTID, "); query.AppendLine($" C.EQUIPMENTNAME AS MAINEQUIPMENTNAME, "); query.AppendLine($" A.EQUIPMENTID, "); query.AppendLine($" A.EQUIPMENTNAME, "); query.AppendLine($" A.DESCRIPTION, "); query.AppendLine($" A.OPERATIONMODE, "); query.AppendLine($" A.CONTROLMODE, "); query.AppendLine($" A.LASTTRACKINLOTID, "); query.AppendLine($" A.LASTTRACKOUTLOTID, "); query.AppendLine($" A.MAKER, "); query.AppendLine($" A.EQPSTATE, "); query.AppendLine($" A.LOCATION "); query.AppendLine($" FROM CIM_EQUIPMENT A (nolock) "); query.AppendLine($" INNER JOIN CIM_PROCESSSEGMENT B (nolock) ON A.PROCESSSEGMENTID = B.PROCESSSEGMENTID AND A.SITEID = B.SITEID "); query.AppendLine($" INNER JOIN CIM_EQUIPMENT C (nolock) ON A.PARENTID = C.EQUIPMENTID AND A.SITEID = C.SITEID "); query.AppendLine($" INNER JOIN CIM_FACILITY D (nolock) ON A.PHYSICALLOCATION = D.FACILITYID AND a.SITEID = d.SITEID "); query.AppendLine($" WHERE A.SITEID='1130' "); connectionString = $@"server=192.168.8.232;database=ddmes;uid=DDB2MESAdmin;pwd=Yhqe4csJXJ4W5$%;"; sqlConnection = new SqlConnection(); sqlConnection.ConnectionString = connectionString; sqlConnection.Open(); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = sqlConnection; sqlCommand.CommandType = CommandType.Text; sqlCommand.CommandText = query.ToString(); ds = new DataSet(); SqlDataAdapter sqlAdapter = new SqlDataAdapter(sqlCommand); sqlAdapter.Fill(ds); sqlConnection.Close(); if (ds != null && ds.Tables.Count > 0) dt = ds.Tables[0]; return dt; } catch (Exception ex) { XLogger.Instance.Fatal(ex); return null; } finally { if (sqlConnection != null && sqlConnection.State != ConnectionState.Closed) { sqlConnection.Close(); sqlConnection.Dispose(); } } } private void Tree_SelectedNodeChanged(object sender, RadTreeViewEventArgs e) { if (e.Node == null || e.Node.Tag == null) return; string[] values = e.Node.Tag.ToString().Split('.'); if (values.Length != 2) return; this.EquipmentID = values[0]; this.VID = values[1]; this.BtnRefresh_Click(null, null); } #endregion #region [ Grid: TraceCollection ] ===================================== private void GridSetting() { this.grid.MultiSelect = true; this.grid.Columns.Clear(); this.grid.TableElement.RowHeight = 20; this.grid.HeaderTextToTitleCase = false; this.grid.AddColumn("EVENTTIME", "EventTime"); this.grid.AddColumn("VIDName"); this.grid.AddColumn("Value"); this.grid.AddColumn("LotID"); this.grid.AddColumn("MaterialID"); this.grid.AddColumn("ProductID"); this.grid.AddColumn("Recipe"); this.grid.AddColumn("UnitNO"); this.grid.AddColumn("ProcessID"); this.grid.AddColumn("VORNR"); this.grid.AddColumn("UnitState"); this.grid.AddColumn("Sign"); } #endregion } }