Ejemplo n.º 1
0
        public ResultOperation Update(Guid processID, WorkflowProcess _WorkflowProcess)
        {
            ResultOperation resultOperation = new ResultOperation();

            try
            {
                List <Guid>         listDeleted    = new List <Guid>();
                ElementService      elementService = new ElementService(this.UnitOfWork);
                List <sysBpmsEvent> events         = this.GetList(null, processID, string.Empty, null);
                foreach (sysBpmsEvent item in events.Where(c => c.TypeLU == (int)sysBpmsEvent.e_TypeLU.StartEvent && !_WorkflowProcess.StartEvents.Any(d => d.ID == c.ElementID)))
                {
                    resultOperation = this.Delete(item.ID);
                    listDeleted.Add(item.ID);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                }

                foreach (sysBpmsEvent item in events.Where(c => c.TypeLU == (int)sysBpmsEvent.e_TypeLU.EndEvent && !_WorkflowProcess.EndEvents.Any(d => d.ID == c.ElementID)))
                {
                    resultOperation = this.Delete(item.ID);
                    listDeleted.Add(item.ID);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                }

                foreach (sysBpmsEvent item in events.Where(c => c.TypeLU == (int)sysBpmsEvent.e_TypeLU.IntermediateThrow && !_WorkflowProcess.IntermediateThrowEvents.Any(d => d.ID == c.ElementID)))
                {
                    resultOperation = this.Delete(item.ID);
                    listDeleted.Add(item.ID);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                }

                foreach (sysBpmsEvent item in events.Where(c => c.TypeLU == (int)sysBpmsEvent.e_TypeLU.IntermediateCatch && !_WorkflowProcess.IntermediateCatchEvents.Any(d => d.ID == c.ElementID)))
                {
                    resultOperation = this.Delete(item.ID);
                    listDeleted.Add(item.ID);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                }

                foreach (sysBpmsEvent item in events.Where(c => c.TypeLU == (int)sysBpmsEvent.e_TypeLU.boundary && !_WorkflowProcess.BoundaryEvents.Any(d => d.ID == c.ElementID)))
                {
                    resultOperation = this.Delete(item.ID);
                    listDeleted.Add(item.ID);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                }
                events = events.Where(c => !listDeleted.Contains(c.ID)).ToList();
                //StartEvents
                foreach (WorkflowStartEvent item in _WorkflowProcess.StartEvents)
                {
                    sysBpmsEvent _event = events.FirstOrDefault(c => c.ElementID == item.ID);
                    if (_event != null)
                    {
                        //If _event.SubType was changed, It updates _event.
                        if (_event.SubType != (int)item.StartEventType)
                        {
                            _event.SubType  = (int)item.StartEventType;
                            resultOperation = this.Update(_event);
                            if (!resultOperation.IsSuccess)
                            {
                                return(resultOperation);
                            }
                        }
                        //Element
                        _event.Element.Name = item.Name;
                        resultOperation     = elementService.Update(_event.Element);
                        if (!resultOperation.IsSuccess)
                        {
                            return(resultOperation);
                        }
                    }
                    else
                    {
                        _event = new sysBpmsEvent()
                        {
                            TypeLU    = (int)sysBpmsEvent.e_TypeLU.StartEvent,
                            ElementID = item.ID,
                            ID        = Guid.NewGuid(),
                            ProcessID = processID,
                            SubType   = (int)item.StartEventType,
                            //Element
                            Element = new sysBpmsElement()
                            {
                                ID        = item.ID,
                                Name      = item.Name,
                                ProcessID = processID,
                                TypeLU    = (int)sysBpmsElement.e_TypeLU.Event,
                            }
                        };
                        resultOperation = this.Add(_event);
                        if (!resultOperation.IsSuccess)
                        {
                            return(resultOperation);
                        }

                        resultOperation = elementService.Update(_event.Element);
                        if (!resultOperation.IsSuccess)
                        {
                            return(resultOperation);
                        }
                    }
                }
                //EndEvents
                foreach (WorkflowEndEvent item in _WorkflowProcess.EndEvents)
                {
                    sysBpmsEvent _event = events.FirstOrDefault(c => c.ElementID == item.ID);
                    if (_event != null)
                    {
                        //If _event.SubType was changed, It updates _event.
                        if (_event.SubType != (int)item.EndEventType)
                        {
                            _event.SubType  = (int)item.EndEventType;
                            resultOperation = this.Update(_event);
                            if (!resultOperation.IsSuccess)
                            {
                                return(resultOperation);
                            }
                        }
                        //If _event.Element was changed, It updates Element.
                        if (_event.Element.Name != item.Name)
                        {
                            _event.Element.Name = item.Name;
                            resultOperation     = elementService.Update(_event.Element);
                            if (!resultOperation.IsSuccess)
                            {
                                return(resultOperation);
                            }
                        }
                    }
                    else
                    {
                        _event = new sysBpmsEvent()
                        {
                            TypeLU    = (int)sysBpmsEvent.e_TypeLU.EndEvent,
                            ElementID = item.ID,
                            ID        = Guid.NewGuid(),
                            ProcessID = processID,
                            SubType   = (int)item.EndEventType,
                            //Element
                            Element = new sysBpmsElement()
                            {
                                ID        = item.ID,
                                Name      = item.Name,
                                ProcessID = processID,
                                TypeLU    = (int)sysBpmsElement.e_TypeLU.Event,
                            }
                        };
                        resultOperation = this.Add(_event);
                        if (!resultOperation.IsSuccess)
                        {
                            return(resultOperation);
                        }
                    }
                }
                //IntermediateThrow
                foreach (WorkflowIntermediateThrowEvent item in _WorkflowProcess.IntermediateThrowEvents)
                {
                    sysBpmsEvent _event = events.FirstOrDefault(c => c.ElementID == item.ID);
                    if (_event != null)
                    {
                        //If _event.SubType was changed, It updates _event.
                        if (_event.SubType != (int)item.IntermediateThrowType)
                        {
                            _event.SubType  = (int)item.IntermediateThrowType;
                            resultOperation = this.Update(_event);
                            if (!resultOperation.IsSuccess)
                            {
                                return(resultOperation);
                            }
                        }
                        //If _event.Element was changed, It updates Element.
                        if (_event.Element.Name != item.Name)
                        {
                            _event.Element.Name = item.Name;
                            resultOperation     = elementService.Update(_event.Element);
                            if (!resultOperation.IsSuccess)
                            {
                                return(resultOperation);
                            }
                        }
                    }
                    else
                    {
                        _event = new sysBpmsEvent()
                        {
                            TypeLU    = (int)sysBpmsEvent.e_TypeLU.IntermediateThrow,
                            ElementID = item.ID,
                            ID        = Guid.NewGuid(),
                            ProcessID = processID,
                            SubType   = (int)item.IntermediateThrowType,
                            //Element
                            Element = new sysBpmsElement()
                            {
                                ID        = item.ID,
                                Name      = item.Name,
                                ProcessID = processID,
                                TypeLU    = (int)sysBpmsElement.e_TypeLU.Event,
                            }
                        };
                        resultOperation = this.Add(_event);
                        if (!resultOperation.IsSuccess)
                        {
                            return(resultOperation);
                        }
                    }
                }

                //IntermediateCatch
                foreach (WorkflowIntermediateCatchEvent item in _WorkflowProcess.IntermediateCatchEvents)
                {
                    sysBpmsEvent _event = events.FirstOrDefault(c => c.ElementID == item.ID);
                    if (_event != null)
                    {
                        //If _event.SubType was changed, It updates _event.
                        if (_event.SubType != (int)item.IntermediateCatchType)
                        {
                            _event.SubType  = (int)item.IntermediateCatchType;
                            resultOperation = this.Update(_event);
                            if (!resultOperation.IsSuccess)
                            {
                                return(resultOperation);
                            }
                        }
                        //If _event.Element was changed, It updates Element.
                        if (_event.Element.Name != item.Name)
                        {
                            _event.Element.Name = item.Name;
                            resultOperation     = elementService.Update(_event.Element);
                            if (!resultOperation.IsSuccess)
                            {
                                return(resultOperation);
                            }
                        }
                    }
                    else
                    {
                        _event = new sysBpmsEvent()
                        {
                            TypeLU    = (int)sysBpmsEvent.e_TypeLU.IntermediateCatch,
                            ElementID = item.ID,
                            ID        = Guid.NewGuid(),
                            ProcessID = processID,
                            SubType   = (int)item.IntermediateCatchType,
                            //Element
                            Element = new sysBpmsElement()
                            {
                                ID        = item.ID,
                                Name      = item.Name,
                                ProcessID = processID,
                                TypeLU    = (int)sysBpmsElement.e_TypeLU.Event,
                            }
                        };
                        resultOperation = this.Add(_event);
                        if (!resultOperation.IsSuccess)
                        {
                            return(resultOperation);
                        }
                    }
                }

                //Boundary
                foreach (WorkflowBoundaryEvent item in _WorkflowProcess.BoundaryEvents)
                {
                    sysBpmsEvent _event = events.FirstOrDefault(c => c.ElementID == item.ID);
                    if (_event != null)
                    {
                        //If _event's properties were changed, It updates _event.
                        if (_event.SubType != (int)item.BoundaryType ||
                            _event.RefElementID != item.AttachedToRef ||
                            _event.CancelActivity != item.CancelActivity)
                        {
                            _event.SubType        = (int)item.BoundaryType;
                            _event.RefElementID   = item.AttachedToRef;
                            _event.CancelActivity = item.CancelActivity;
                            resultOperation       = this.Update(_event);
                            if (!resultOperation.IsSuccess)
                            {
                                return(resultOperation);
                            }
                        }
                        //If _event.Element was changed, It updates Element.
                        if (_event.Element.Name != item.Name)
                        {
                            _event.Element.Name = item.Name;
                            resultOperation     = elementService.Update(_event.Element);
                            if (!resultOperation.IsSuccess)
                            {
                                return(resultOperation);
                            }
                        }
                    }
                    else
                    {
                        _event = new sysBpmsEvent()
                        {
                            TypeLU         = (int)sysBpmsEvent.e_TypeLU.boundary,
                            ElementID      = item.ID,
                            ID             = Guid.NewGuid(),
                            ProcessID      = processID,
                            SubType        = (int)item.BoundaryType,
                            RefElementID   = item.AttachedToRef,
                            CancelActivity = item.CancelActivity,
                            //Element
                            Element = new sysBpmsElement()
                            {
                                ID        = item.ID,
                                Name      = item.Name,
                                ProcessID = processID,
                                TypeLU    = (int)sysBpmsElement.e_TypeLU.Event,
                            }
                        };
                        resultOperation = this.Add(_event);
                        if (!resultOperation.IsSuccess)
                        {
                            return(resultOperation);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                return(base.ExceptionHandler(ex));
            }
            if (resultOperation.IsSuccess)
            {
                this.UnitOfWork.Save();
            }
            base.FinalizeService(resultOperation);

            return(resultOperation);
        }
Ejemplo n.º 2
0
        public ResultOperation Update(Guid processID, WorkflowProcess _WorkflowProcess)
        {
            ResultOperation       resultOperation = new ResultOperation();
            List <sysBpmsGateway> listGateway     = this.GetList(processID);
            ElementService        elementService  = new ElementService(this.UnitOfWork);
            List <Guid>           listDeleted     = new List <Guid>();

            //Delete gateways that are not in diagram xml element.
            foreach (sysBpmsGateway item in listGateway.Where(c =>
                                                              !_WorkflowProcess.ExclusiveGateways.Any(d => d.ID == c.ElementID) &&
                                                              !_WorkflowProcess.InclusiveGateways.Any(d => d.ID == c.ElementID) &&
                                                              !_WorkflowProcess.ParallelGateways.Any(d => d.ID == c.ElementID)))
            {
                resultOperation = this.Delete(item.ID);
                listDeleted.Add(item.ID);
                if (!resultOperation.IsSuccess)
                {
                    return(resultOperation);
                }
            }
            listGateway = listGateway.Where(c => !listDeleted.Contains(c.ID)).ToList();
            //ExclusiveGateway
            foreach (WorkflowExclusiveGateway item in _WorkflowProcess.ExclusiveGateways)
            {
                sysBpmsGateway      gateway         = listGateway.FirstOrDefault(c => c.ElementID == item.ID);
                sysBpmsSequenceFlow newSequenceFlow = null;
                //if SequenceFlow did not add before and item.Default is not empty add it
                if (!string.IsNullOrWhiteSpace(item.Default))
                {
                    sysBpmsSequenceFlow currentDefualt = new SequenceFlowService(this.UnitOfWork).GetInfo(item.Default, processID);
                    if (currentDefualt == null)
                    {
                        WorkflowSequenceFlow _WorkflowSequenceFlow = _WorkflowProcess.SequenceFlows.FirstOrDefault(c => c.ID == item.Default);
                        newSequenceFlow = new sysBpmsSequenceFlow()
                        {
                            TargetElementID = _WorkflowSequenceFlow.TargetRef,
                            SourceElementID = _WorkflowSequenceFlow.SourceRef,
                            Name            = _WorkflowSequenceFlow.Name,
                            ElementID       = _WorkflowSequenceFlow.ID,
                            Element         = new sysBpmsElement()
                            {
                                ID        = _WorkflowSequenceFlow.ID,
                                Name      = _WorkflowSequenceFlow.Name,
                                ProcessID = processID,
                                TypeLU    = (int)sysBpmsElement.e_TypeLU.Sequence,
                            },
                            ID        = Guid.NewGuid(),
                            ProcessID = processID,
                        };
                    }
                    else if (gateway != null)
                    {
                        gateway.DefaultSequenceFlowID = currentDefualt.ID;
                    }
                }
                if (gateway != null)
                {
                    if (newSequenceFlow != null)
                    {
                        gateway.SequenceFlow = newSequenceFlow;
                    }
                    gateway.TypeLU  = (int)sysBpmsGateway.e_TypeLU.ExclusiveGateWay;
                    resultOperation = this.Update(gateway);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                    gateway.Element.Name = item.Name;
                    elementService.Update(gateway.Element);
                }
                else
                {
                    gateway = new sysBpmsGateway()
                    {
                        ID           = Guid.NewGuid(),
                        ElementID    = item.ID,
                        ProcessID    = processID,
                        SequenceFlow = newSequenceFlow,
                        TypeLU       = (int)sysBpmsGateway.e_TypeLU.ExclusiveGateWay,
                        Element      = new sysBpmsElement()
                        {
                            ID        = item.ID,
                            Name      = item.Name,
                            ProcessID = processID,
                            TypeLU    = (int)sysBpmsElement.e_TypeLU.Gateway,
                        }
                    };
                    resultOperation = this.Add(gateway);
                }
                if (!resultOperation.IsSuccess)
                {
                    return(resultOperation);
                }
            }

            //InclusiveGateway
            foreach (WorkflowInclusiveGateway item in _WorkflowProcess.InclusiveGateways)
            {
                sysBpmsGateway gateway = listGateway.FirstOrDefault(c => c.ElementID == item.ID);

                sysBpmsSequenceFlow newSequenceFlow = null;
                //if SequenceFlow did not add before and item.Default is not empty add it
                if (!string.IsNullOrWhiteSpace(item.Default))
                {
                    sysBpmsSequenceFlow currentDefualt = new SequenceFlowService(this.UnitOfWork).GetInfo(item.Default, processID);
                    if (currentDefualt == null)
                    {
                        WorkflowSequenceFlow _WorkflowSequenceFlow = _WorkflowProcess.SequenceFlows.FirstOrDefault(c => c.ID == item.Default);
                        newSequenceFlow = new sysBpmsSequenceFlow()
                        {
                            TargetElementID = _WorkflowSequenceFlow.TargetRef,
                            SourceElementID = _WorkflowSequenceFlow.SourceRef,
                            Name            = _WorkflowSequenceFlow.Name,
                            ElementID       = _WorkflowSequenceFlow.ID,
                            Element         = new sysBpmsElement()
                            {
                                ID        = _WorkflowSequenceFlow.ID,
                                Name      = _WorkflowSequenceFlow.Name,
                                ProcessID = processID,
                                TypeLU    = (int)sysBpmsElement.e_TypeLU.Sequence,
                            },
                            ID        = Guid.NewGuid(),
                            ProcessID = processID,
                        };
                    }
                    else if (gateway != null)
                    {
                        gateway.DefaultSequenceFlowID = currentDefualt.ID;
                    }
                }

                if (gateway != null)
                {
                    if (newSequenceFlow != null)
                    {
                        gateway.SequenceFlow = newSequenceFlow;
                    }
                    gateway.TypeLU  = (int)sysBpmsGateway.e_TypeLU.InclusiveGateWay;
                    resultOperation = this.Update(gateway);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                    gateway.Element.Name = item.Name;
                    elementService.Update(gateway.Element);
                }
                else
                {
                    gateway = new sysBpmsGateway()
                    {
                        ID           = Guid.NewGuid(),
                        ElementID    = item.ID,
                        ProcessID    = processID,
                        SequenceFlow = newSequenceFlow,
                        TypeLU       = (int)sysBpmsGateway.e_TypeLU.InclusiveGateWay,
                        Element      = new sysBpmsElement()
                        {
                            ID        = item.ID,
                            Name      = item.Name,
                            ProcessID = processID,
                            TypeLU    = (int)sysBpmsElement.e_TypeLU.Gateway,
                        }
                    };
                    resultOperation = this.Add(gateway);
                }
                if (!resultOperation.IsSuccess)
                {
                    return(resultOperation);
                }
            }

            //ParallelGateway
            foreach (WorkflowParallelGateway item in _WorkflowProcess.ParallelGateways)
            {
                sysBpmsGateway gateway = listGateway.FirstOrDefault(c => c.ElementID == item.ID);
                if (gateway != null)
                {
                    gateway.TypeLU  = (int)sysBpmsGateway.e_TypeLU.ParallelGateWay;
                    resultOperation = this.Update(gateway);
                    if (!resultOperation.IsSuccess)
                    {
                        return(resultOperation);
                    }
                    gateway.Element.Name = item.Name;
                    elementService.Update(gateway.Element);
                }
                else
                {
                    gateway = new sysBpmsGateway()
                    {
                        ID        = Guid.NewGuid(),
                        ElementID = item.ID,
                        ProcessID = processID,
                        TypeLU    = (int)sysBpmsGateway.e_TypeLU.ParallelGateWay,
                        Element   = new sysBpmsElement()
                        {
                            ID        = item.ID,
                            Name      = item.Name,
                            ProcessID = processID,
                            TypeLU    = (int)sysBpmsElement.e_TypeLU.Gateway,
                        }
                    };
                    resultOperation = this.Add(gateway);
                }
                if (!resultOperation.IsSuccess)
                {
                    return(resultOperation);
                }
            }

            return(resultOperation);
        }