示例#1
0
        private void PipelineTracing()
        {
            try
            {
                usedProductList = new List <PartData>();
                if (joints == null)
                {
                    this.joints = repoJoint.GetJointsForTracing().ToList <construct.Joint>();
                    if (this.joints == null || this.joints.Count <= 0)
                    {
                        log.Warn("Report at Construction: List of Joints is NULL or empty.");
                    }
                }
                if (partDataList == null)
                {
                    var data = repo.GetPipelineElements(SQLProvider.GetQuery(SQLProvider.SQLStatic.GetWeldedParts).ToString());
                    if (data == null || data.Rows.Count <= 0)
                    {
                        log.Warn("Report at Construction: Data Table of Pieces is NULL or empty.");
                    }

                    this.partDataList = this.FormWeldedParts(data);
                }

                graph           = new PipelineGraph(partDataList.Count);
                tracingDataList = new List <TracingData>();

                if (partDataList != null)
                {
                    foreach (var partData in partDataList)
                    {
                        graph.AddPipelineVertex(partData);
                    }
                    foreach (var joint in this.joints)
                    {
                        graph.AddJointEdge(joint);
                    }

                    construct.Joint startJoint = null;
                    construct.Joint endJoint   = null;

                    if (viewModel.TracingMode == TracingModeEnum.TracingByKP &&
                        viewModel.AllKP.Contains(viewModel.StartPK) &&
                        viewModel.AllKP.Contains(viewModel.EndPK))
                    {
                        startJoint = joints.First <construct.Joint>(
                            x => x.NumberKP == viewModel.StartPK && x.DistanceFromKP == joints
                            .Where <construct.Joint>(y => y.NumberKP == viewModel.StartPK)
                            .Min <construct.Joint>(z => z.DistanceFromKP));

                        endJoint = joints.Last <construct.Joint>(
                            x => x.NumberKP == viewModel.EndPK && x.DistanceFromKP == joints
                            .Where <construct.Joint>(y => y.NumberKP == viewModel.EndPK)
                            .Max <construct.Joint>(z => z.DistanceFromKP));
                    }

                    if (endJoint == null && startJoint == null)
                    {
                        startJoint = joints.First <construct.Joint>(x => x.Id == viewModel.StartJoint.Id);
                        endJoint   = joints.First <construct.Joint>(x => x.Id == viewModel.EndJoint.Id);
                    }

                    var paths = graph.Pathfinder(startJoint.FirstElement, endJoint.FirstElement);

                    if (paths.Count != 0)
                    {
                        path = graph.ShortestPath(paths);

                        path = graph.RemovalExternalComponents(startJoint, endJoint, path);

                        for (int i = path.Count - 1; i > 0; --i)
                        {
                            var tracingDataItem = new TracingData(path[i].Data, path[i - 1].Data);

                            var commonJoint = path[i].GetCommonJoint(path[i - 1]);

                            tracingDataItem.JointNumber = commonJoint.Data.Number;
                            tracingDataItem.WeldingDate = GetWeldDate(commonJoint.Data);

                            tracingDataList.Add(tracingDataItem);
                        }

                        for (int i = 0; i < path.Count; ++i)
                        {
                            usedProductList.Add(path[i].Data);
                        }

                        PartData firstElement = partDataList.Where(_ => _.Id == startJoint.FirstElement.Id).FirstOrDefault();

                        PartData secondElement = partDataList.Where(_ => _.Id == endJoint.SecondElement.Id).FirstOrDefault();

                        var firstTracingDataItem = new TracingData(firstElement, path.Last().Data);
                        firstTracingDataItem.JointNumber = startJoint.Number;
                        firstTracingDataItem.WeldingDate = GetWeldDate(startJoint);
                        tracingDataList.Insert(0, firstTracingDataItem);

                        usedProductList.Add(firstElement);

                        var lastTracingDataItem = new TracingData(path.First().Data, secondElement);
                        lastTracingDataItem.JointNumber = endJoint.Number;
                        lastTracingDataItem.WeldingDate = GetWeldDate(endJoint);
                        tracingDataList.Add(lastTracingDataItem);

                        usedProductList.Add(secondElement);

                        PipelineLenghtCalculation();
                    }
                }
                else
                {
                    log.Warn(string.Format("List of Pipeline elements is NULL for construction report type: {0}", viewModel.ReportType));
                }
            }
            catch (RepositoryException ex)
            {
                log.Warn(this.GetType().Name + " | " + ex.ToString());
                notify.ShowWarning(Program.LanguageManager.GetString(StringResources.Notification_Error_Db_Message),
                                   Program.LanguageManager.GetString(StringResources.Notification_Error_Db_Header));
            }
        }