public static void AddSubComponents(ref Dictionary <int, Tuple <string, int> > contents, Component parentComponent, int multiplier) { var repo = new ComponentsRepo(); var childrenLinks = repo.ComponentLinks .FindAllIncluded(cl => cl.ParentComponentId == parentComponent.Id) .ToList(); foreach (var childLink in childrenLinks) { var child = repo.Components.GetWithParts(childLink.ChildComponentId); if (child.Parts.Count == 0) { if (!contents.ContainsKey(child.Id)) { contents.Add(child.Id, new Tuple <string, int>(child.Name, childLink.Quantity * multiplier)); } else { contents[child.Id] = new Tuple <string, int>(child.Name, contents[child.Id].Item2 + childLink.Quantity * multiplier); } } else { AddSubComponents(ref contents, child, multiplier * childLink.Quantity); } } }
private bool CheckUplinks(int selectedComponentId, int componentId) { var repo = new ComponentsRepo(); var uplinks = repo.ComponentLinks .FindAllIncluded(cl => cl.ChildComponentId == selectedComponentId) .ToList(); var result = false; foreach (var uplink in uplinks) { if (uplink.ParentComponentId == componentId) { result = true; break; } if (!uplink.ParentComponent.IsTopLevel) { var recursiveResult = CheckUplinks(uplink.ParentComponent.Id, componentId); if (recursiveResult) { result = true; break; } } } return(result); }
public static void ExportOpenXmlReport(TreeNode selectedNode) { var selectedNodeId = (int)selectedNode.Tag; var repo = new ComponentsRepo(); var selectedComponent = repo.Components.Find(c => c.Id == selectedNodeId); var contents = new Dictionary <int, Tuple <string, int> >(); AddSubComponents(ref contents, selectedComponent, 1); var tableData = new string[contents.Count, 2]; var ids = contents.Keys.OrderBy(id => id).ToList(); for (int i = 0; i < ids.Count; i++) { var id = ids[i]; var componentData = contents[id]; tableData[i, 0] = componentData.Item1; tableData[i, 1] = componentData.Item2.ToString() + " шт"; } if (selectedComponent != null) { string filename = selectedComponent.Id + "@" + selectedComponent.Name + ".docx"; CreateOpenXmlFile(filename); AddTable(filename, tableData); System.Diagnostics.Process.Start(filename); } }
private void NewTopLevelComponentButton_Click(object sender, EventArgs e) { string input = ""; var result = InputDialogs.String(ref input, "Введите имя компонента"); if (result == DialogResult.OK) { var repo = new ComponentsRepo(); var componentExists = repo.Components.Count(c => c.Name == input) > 0; if (componentExists) { MessageBox.Show("Компонент уже существует", "Ошибка"); } else { var newComponent = new Component { Name = input, IsTopLevel = true }; repo.Components.Add(newComponent); RefreshView(); } } }
private void RenameComponent_Click(object sender, EventArgs e) { var selectedNode = MainView.SelectedNode; if (selectedNode == null) { MessageBox.Show("Ни один компонент не выбран.", "Ошибка"); return; } var repo = new ComponentsRepo(); var selectedNodeId = (int)selectedNode.Tag; var selectedComponent = repo.Components .Find(c => c.Id == selectedNodeId); DialogResult result; bool componentNameExistsInDatabase; string input = ""; do { if (selectedComponent != null) { input = selectedComponent.Name; } result = InputDialogs.String(ref input, "Введите новое имя"); var componentByName = repo.Components. Find(c => c.Name == input); componentNameExistsInDatabase = (componentByName != null); if ((result == DialogResult.OK) && componentNameExistsInDatabase) { MessageBox.Show("Компонент с таким именем (" + componentByName.Name + "@" + componentByName.Id + ") уже существует в базе", "Ошибка"); } } while (result == DialogResult.OK && componentNameExistsInDatabase); if (result == DialogResult.OK) { if (selectedComponent != null) { selectedComponent.Name = input; repo.Components.Update(selectedComponent, selectedComponent.Id); } RefreshView(); } }
private int GetComponentCountInTree(Component needle) { var sum = 0; var repo = new ComponentsRepo(); var topComponents = repo.Components.FindAll(c => c.IsTopLevel).ToList(); foreach (var component in topComponents) { sum += GetSubcount(component, needle); } return(sum); }
private void AddChildren(Component baseComponent, TreeNode node) { foreach (var childLink in baseComponent.Parts) { var repo = new ComponentsRepo(); var child = repo.Components .FindIncluded(c => c.Id == childLink.ChildComponentId); if (child != null) { var childNode = node.Nodes.Add(child.Name + "@" + child.Id + " (" + childLink.Quantity + " шт.)"); childNode.Tag = child.Id; AddChildren(child, childNode); } } }
private void RefreshView() { MainView.Nodes.Clear(); var repo = new ComponentsRepo(); var topLevelComponents = repo.Components .FindAllIncluded(c => c.IsTopLevel) .OrderBy(c => c.Name); foreach (var topLevelComponent in topLevelComponents) { var node = MainView.Nodes.Add(topLevelComponent.Name + "@" + topLevelComponent.Id); node.Tag = topLevelComponent.Id; AddChildren(topLevelComponent, node); } MainView.ExpandAll(); }
private void RemoveSubComponents(Component parentComponent) { var repo = new ComponentsRepo(); var children = repo.ComponentLinks .FindAllIncluded(cl => cl.ParentComponentId == parentComponent.Id) .Select(cl => cl.ChildComponent) .ToList(); foreach (var child in children) { RemoveSubComponents(child); var componentCount = GetComponentCountInTree(child); if (componentCount == 1) { var uplink = repo.ComponentLinks .Find(cl => cl.ChildComponentId == child.Id); if (uplink != null) { repo.ComponentLinks.Delete(uplink); } repo.Components.Delete(child); } else { var parentCount = GetComponentCountInTree(parentComponent); if (parentCount == 1) { var linkToBroke = repo.ComponentLinks .Find(cl => cl.ParentComponentId == parentComponent.Id && cl.ChildComponentId == child.Id); if (linkToBroke != null) { repo.ComponentLinks.Delete(linkToBroke); } } } } }
private int GetSubcount(Component component, Component needle) { var sum = 0; var repo = new ComponentsRepo(); var subComponents = repo.ComponentLinks. FindAllIncluded(cl => cl.ParentComponentId == component.Id) .Select(cl => cl.ChildComponent) .ToList(); foreach (var subComponent in subComponents) { sum += GetSubcount(subComponent, needle); } if (component.Id == needle.Id) { sum++; } return(sum); }
public static void SeedData2() { var repo = new ComponentsRepo(); repo.ComponentLinks.SlowTruncateTable(); repo.Components.SlowTruncateTable(); var c1 = new Component { Name = "Двигатель 2106", IsTopLevel = true }; var c2 = new Component { Name = "Блок цилиндров" }; var c3 = new Component { Name = "Коленвал" }; var c4 = new Component { Name = "Распредвал" }; var c5 = new Component { Name = "Поршень в сборе" }; var c6 = new Component { Name = "Поршень" }; var c7 = new Component { Name = "Компрессионное кольцо" }; var c8 = new Component { Name = "Маслосъёмное кольцо" }; var c9 = new Component { Name = "Шатун" }; var c11 = new Component { Name = "Двигатель 2103", IsTopLevel = true }; var l1 = new ComponentLink { ParentComponent = c1, ChildComponent = c2, Quantity = 1 }; var l2 = new ComponentLink { ParentComponent = c1, ChildComponent = c3, Quantity = 1 }; var l3 = new ComponentLink { ParentComponent = c1, ChildComponent = c4, Quantity = 2 }; var l4 = new ComponentLink { ParentComponent = c1, ChildComponent = c5, Quantity = 4 }; var l5 = new ComponentLink { ParentComponent = c5, ChildComponent = c6, Quantity = 1 }; var l6 = new ComponentLink { ParentComponent = c5, ChildComponent = c7, Quantity = 2 }; var l7 = new ComponentLink { ParentComponent = c5, ChildComponent = c8, Quantity = 1 }; var l8 = new ComponentLink { ParentComponent = c1, ChildComponent = c9, Quantity = 4 }; var l11 = new ComponentLink { ParentComponent = c11, ChildComponent = c2, Quantity = 1 }; var l12 = new ComponentLink { ParentComponent = c11, ChildComponent = c3, Quantity = 1 }; var l13 = new ComponentLink { ParentComponent = c11, ChildComponent = c4, Quantity = 2 }; var l14 = new ComponentLink { ParentComponent = c11, ChildComponent = c5, Quantity = 4 }; var l18 = new ComponentLink { ParentComponent = c11, ChildComponent = c9, Quantity = 4 }; repo.ComponentLinks.AddRange( new List <ComponentLink> { l1, l2, l3, l4, l5, l6, l7, l8, l11, l12, l13, l14, l18, }); }
public static void SeedData1() { var repo = new ComponentsRepo(); repo.ComponentLinks.SlowTruncateTable(); repo.Components.SlowTruncateTable(); var c1 = new Component { Name = "Горячие клавиши", IsTopLevel = true }; var c2 = new Component { Name = "Загрузить тестовые наборы данных" }; var c3 = new Component { Name = "Набор 1 (Ctrl + 1)" }; var c4 = new Component { Name = "Набор 2 (Ctrl + 2)" }; var c5 = new Component { Name = "Набор 3 (Ctrl + 3)" }; var c6 = new Component { Name = "Редактирование графа компонентов" }; var c7 = new Component { Name = "Новый компонент верхнего уровня (Ctrl + Shift + N)" }; var c8 = new Component { Name = "Новый вложенный компонент (Ctrl + N)" }; var c9 = new Component { Name = "Переименовать (F2)" }; var c10 = new Component { Name = "Удалить (Del)" }; var c11 = new Component { Name = "Отчёты" }; var c12 = new Component { Name = "Отчёт о сводном составе (Ctrl + R)" }; var l1 = new ComponentLink { ParentComponent = c1, ChildComponent = c2, Quantity = 1 }; var l2 = new ComponentLink { ParentComponent = c2, ChildComponent = c3, Quantity = 1 }; var l3 = new ComponentLink { ParentComponent = c2, ChildComponent = c4, Quantity = 1 }; var l4 = new ComponentLink { ParentComponent = c2, ChildComponent = c5, Quantity = 1 }; var l5 = new ComponentLink { ParentComponent = c1, ChildComponent = c6, Quantity = 1 }; var l6 = new ComponentLink { ParentComponent = c6, ChildComponent = c7, Quantity = 1 }; var l7 = new ComponentLink { ParentComponent = c6, ChildComponent = c8, Quantity = 1 }; var l8 = new ComponentLink { ParentComponent = c6, ChildComponent = c9, Quantity = 1 }; var l9 = new ComponentLink { ParentComponent = c6, ChildComponent = c10, Quantity = 1 }; var l10 = new ComponentLink { ParentComponent = c1, ChildComponent = c11, Quantity = 1 }; var l11 = new ComponentLink { ParentComponent = c11, ChildComponent = c12, Quantity = 1 }; repo.ComponentLinks.AddRange( new List <ComponentLink> { l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11 }); }
public static void SeedData3() { var repo = new ComponentsRepo(); repo.ComponentLinks.SlowTruncateTable(); repo.Components.SlowTruncateTable(); var c1 = new Component { Name = "Блок 1", IsTopLevel = true }; var c2 = new Component { Name = "Блок 2", IsTopLevel = true }; //var c3 = new Component { Name = "Блок 3", IsTopLevel = true }; var c4 = new Component { Name = "Блок 4" }; var c5 = new Component { Name = "Блок 5" }; var c6 = new Component { Name = "Блок 6" }; var c7 = new Component { Name = "Блок 7" }; var c8 = new Component { Name = "Блок 8" }; var c9 = new Component { Name = "Блок 9" }; var l1 = new ComponentLink { ParentComponent = c1, ChildComponent = c4, Quantity = 1 }; var l2 = new ComponentLink { ParentComponent = c1, ChildComponent = c5, Quantity = 1 }; var l3 = new ComponentLink { ParentComponent = c1, ChildComponent = c6, Quantity = 2 }; var l4 = new ComponentLink { ParentComponent = c2, ChildComponent = c5, Quantity = 4 }; var l5 = new ComponentLink { ParentComponent = c2, ChildComponent = c6, Quantity = 1 }; var l6 = new ComponentLink { ParentComponent = c2, ChildComponent = c7, Quantity = 2 }; //var l7 = new ComponentLink { ParentComponent = c3, ChildComponent = c4, Quantity = 1 }; //var l8 = new ComponentLink { ParentComponent = c3, ChildComponent = c7, Quantity = 4 }; var l11 = new ComponentLink { ParentComponent = c4, ChildComponent = c8, Quantity = 1 }; var l12 = new ComponentLink { ParentComponent = c4, ChildComponent = c9, Quantity = 1 }; var l13 = new ComponentLink { ParentComponent = c8, ChildComponent = c9, Quantity = 2 }; var l14 = new ComponentLink { ParentComponent = c1, ChildComponent = c8, Quantity = 2 }; var l15 = new ComponentLink { ParentComponent = c9, ChildComponent = c6, Quantity = 2 }; var l16 = new ComponentLink { ParentComponent = c5, ChildComponent = c9, Quantity = 2 }; repo.ComponentLinks.AddRange( new List <ComponentLink> { l1, l2, l3, /*l4, l5, l6, l7, l8,*/ l11, /*l12,*/ l13, l14, l15, l16 }); }
private void RemoveComponent_Click(object sender, EventArgs e) { var selectedNode = MainView.SelectedNode; if (selectedNode == null) { MessageBox.Show("Ни один компонент не выбран.", "Ошибка"); return; } var repo = new ComponentsRepo(); var selectedNodeId = (int)selectedNode.Tag; var selectedComponent = repo.Components.Find(c => c.Id == selectedNodeId); if (selectedComponent == null) { return; } if (!selectedComponent.IsTopLevel) { var parentNodeId = (int)selectedNode.Parent.Tag; var parentComponent = repo.Components.Get(parentNodeId); var result = InputDialogs.RemoveChoice( "Хотите ли вы разорвать связь между текущим компонентом (" + selectedComponent + ") и его родителем (" + parentComponent + ") " + "или только удалить текущий узел?"); if (result == DialogResult.Cancel) { return; } if (result == DialogResult.Yes) { var linkToBroke = repo.ComponentLinks .Find(cl => cl.ParentComponentId == parentComponent.Id && cl.ChildComponentId == selectedComponent.Id ); if (linkToBroke != null) { repo.ComponentLinks.Delete(linkToBroke); } } } RemoveSubComponents(selectedComponent); var componentCount = GetComponentCountInTree(selectedComponent); if (componentCount == 1) { var uplink = repo.ComponentLinks .Find(cl => cl.ChildComponentId == selectedComponent.Id); if (uplink != null) { repo.ComponentLinks.Delete(uplink); } repo.Components.Delete(selectedComponent); } else { TreeNode parentNode = selectedNode.Parent; var componentsChain = new List <Component>(); do { var parentComponent = repo.Components.Get((int)parentNode.Tag); var parentCount = GetComponentCountInTree(parentComponent); componentsChain.Add(parentComponent); if (parentCount == 1) { break; } parentNode = parentNode.Parent; } while (true); var newComponentsChain = new List <Component>(); for (int i = 0; i < componentsChain.Count - 1; i++) { var oldComponent = componentsChain[i]; var newComponent = new Component { Name = oldComponent.Name, IsTopLevel = oldComponent.IsTopLevel }; repo.Components.Add(newComponent); newComponentsChain.Add(newComponent); } if (componentsChain.Count == 1) { var parentId = componentsChain[0].Id; var childId = selectedComponent.Id; var link = repo.ComponentLinks .Find(cl => cl.ParentComponentId == parentId && cl.ChildComponentId == childId ); if (link != null) { repo.ComponentLinks.Delete(link); } } else { var chainRootId = componentsChain[componentsChain.Count - 1].Id; var chainFirstChildId = componentsChain[componentsChain.Count - 2].Id; var linkToUpdate = repo.ComponentLinks. Find(cl => cl.ParentComponentId == chainRootId && cl.ChildComponentId == chainFirstChildId); if (linkToUpdate != null) { linkToUpdate.ChildComponentId = newComponentsChain[newComponentsChain.Count - 1].Id; } for (int i = componentsChain.Count - 1; i >= 1; i--) { if (i != componentsChain.Count - 1) { var oldLinkParentId = componentsChain[i].Id; var oldLinkChildId = componentsChain[i - 1].Id; var oldLink = repo.ComponentLinks .Find(cl => cl.ParentComponentId == oldLinkParentId && cl.ChildComponentId == oldLinkChildId ); var oldLinkQuantity = -1; if (oldLink != null) { oldLinkQuantity = oldLink.Quantity; } var newChainLink = new ComponentLink { ParentComponentId = newComponentsChain[i].Id, ChildComponentId = newComponentsChain[i - 1].Id, Quantity = oldLinkQuantity }; repo.ComponentLinks.Add(newChainLink); } var restoreExceptionId = (i == 1) ? selectedComponent.Id : componentsChain[i - 2].Id; var oldParentId = componentsChain[i - 1].Id; var oldChildrenLinks = repo.ComponentLinks .FindAll(cl => cl.ParentComponentId == oldParentId && cl.ChildComponentId != restoreExceptionId) .ToList(); foreach (var oldChildLink in oldChildrenLinks) { var restoredOldLink = new ComponentLink { ParentComponentId = newComponentsChain[i - 1].Id, ChildComponentId = oldChildLink.ChildComponentId, Quantity = oldChildLink.Quantity }; repo.ComponentLinks.Add(restoredOldLink); } } } } RefreshView(); }
private void NewEmbeddedComponentButton_Click(object sender, EventArgs e) { var selectedNode = MainView.SelectedNode; if (selectedNode == null) { MessageBox.Show("Ни один компонент не выбран.", "Ошибка"); return; } string input = ""; int componentId; decimal quantity = 0; var repo = new ComponentsRepo(); var embeddedComponents = repo.Components.FindAll(c => !c.IsTopLevel).ToList(); var selectedComponentId = (int)selectedNode.Tag; var selectedComponent = repo.Components .Find(c => c.Id == selectedComponentId); DialogResult result; bool circularLinkFound = false; do { componentId = -1; result = InputDialogs.ComponentNameAndQuantity( ref input, ref componentId, ref quantity, "Введите имя компонента и количество", embeddedComponents); if (result == DialogResult.OK) { circularLinkFound = componentId != -1 && CheckUplinks(selectedComponentId, componentId); } if ((result == DialogResult.OK) && circularLinkFound) { MessageBox.Show("Обнаружено рекурсиное вложение компонентов", "Ошибка"); } } while (result == DialogResult.OK && circularLinkFound); if (result == DialogResult.OK) { ComponentLink existingLink = null; Component newComponent; if (componentId == -1) { newComponent = new Component { Name = input }; repo.Components.Add(newComponent); } else { newComponent = repo.Components.Find(c => c.Id == componentId); existingLink = repo.ComponentLinks .Find(cl => cl.ParentComponentId == selectedComponentId && cl.ChildComponentId == componentId); } if (existingLink != null) { existingLink.Quantity += (int)quantity; } else { if ((selectedComponent != null) && (newComponent != null)) { var newLink = new ComponentLink { ParentComponentId = selectedComponent.Id, ChildComponentId = newComponent.Id, Quantity = (int)quantity }; repo.ComponentLinks.Add(newLink); } } RefreshView(); } }