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); }
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); }