Example #1
0
        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);
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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();
                }
            }
        }
Example #5
0
        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();
            }
        }
Example #6
0
        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);
        }
Example #7
0
        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);
                }
            }
        }
Example #8
0
        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();
        }
Example #9
0
        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);
                        }
                    }
                }
            }
        }
Example #10
0
        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);
        }
Example #11
0
        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,
            });
        }
Example #12
0
        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
            });
        }
Example #13
0
        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
            });
        }
Example #14
0
        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();
        }
Example #15
0
        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();
            }
        }