public ResultOperation TerminateIfPossible(sysBpmsUser currentUser)
        {
            ResultOperation          resultOperation    = new ResultOperation();
            ThreadTaskService        threadTaskService  = new ThreadTaskService(base.UnitOfWork);
            ThreadEventService       threadEventService = new ThreadEventService(base.UnitOfWork);
            List <sysBpmsThreadTask> listActiveTask     = threadTaskService.GetList(this.EngineSharedModel.CurrentThreadID.Value, null, null, null).Where(c => c.StatusLU != (int)sysBpmsThreadTask.e_StatusLU.Done).ToList();

            //if terminated
            if (this.EngineSharedModel.CurrentThread.StatusLU == (int)sysBpmsThread.Enum_StatusLU.Done)
            {
                foreach (var itm in listActiveTask)
                {
                    itm.Update(DateTime.Now, (int)sysBpmsThreadTask.e_StatusLU.Done,
                               itm.OwnerUserID ?? currentUser?.ID);
                    resultOperation = threadTaskService.Update(itm);
                }
                List <sysBpmsThreadEvent> listEvents = threadEventService.GetActive(base.EngineSharedModel.CurrentThreadID.Value);
                foreach (var item in listEvents)
                {
                    item.Done();
                    resultOperation = threadEventService.Update(item);
                }
            }
            else
            {
                if (!listActiveTask.Any() && !threadEventService.GetActive(base.EngineSharedModel.CurrentThreadID.Value).Any())
                {
                    resultOperation = new ThreadService(this.UnitOfWork).DoneThread(base.EngineSharedModel.CurrentThreadID.Value);
                }
            }
            return(resultOperation);
        }
        public ResultOperation DoneThreadTask(sysBpmsThreadTask currentThreadTask, sysBpmsUser currentUser)
        {
            ThreadTaskService threadTaskService = new ThreadTaskService(base.UnitOfWork);

            currentThreadTask.Update(DateTime.Now, (int)sysBpmsThreadTask.e_StatusLU.Done,
                                     currentThreadTask.OwnerUserID ?? currentUser?.ID);
            return(threadTaskService.Update(currentThreadTask));
        }
        /// <summary>
        /// It is called by Process engine for adding theadtask related to task element.
        /// </summary>
        /// <param name="item"></param>
        public (ResultOperation result, List <sysBpmsThreadTask> listTask) AddThreadTask(sysBpmsTask item, bool isFirstTask)
        {
            ThreadTaskService        threadTaskService = new ThreadTaskService(base.UnitOfWork);
            ResultOperation          result            = new ResultOperation();
            List <sysBpmsThreadTask> listTask          = new List <sysBpmsThreadTask>();

            switch ((sysBpmsTask.e_TypeLU)item.TypeLU)
            {
            case sysBpmsTask.e_TypeLU.UserTask:
                if (item.MarkerTypeLU.HasValue)
                {
                    foreach (sysBpmsThreadTask threadTaskItem in threadTaskService.GetMultiInstanceTask(item, base.EngineSharedModel))
                    {
                        //if user has access to this method, set thread task access Info to userID
                        if (isFirstTask && this.CheckAccessByThreadTask(item, threadTaskItem, base.EngineSharedModel.CurrentThread.UserID, null))
                        {
                            threadTaskItem.UpdateAccessInfo(base.EngineSharedModel.CurrentThread.UserID, null);
                        }
                        threadTaskService.Add(threadTaskItem);
                        listTask.Add(threadTaskItem);
                    }
                }
                else
                {
                    sysBpmsThreadTask threadTask = new sysBpmsThreadTask();
                    threadTask.Update(base.EngineSharedModel.CurrentThreadID.Value, item.ID, DateTime.Now, null, string.Empty, 0, (int)sysBpmsThreadTask.e_StatusLU.New);
                    threadTaskService.SetAccessInfoTo(threadTask, item, base.EngineSharedModel);
                    //if user has access to this method, set thread task access Info to thread userID
                    if (isFirstTask && this.CheckAccessByThreadTask(item, threadTask, base.EngineSharedModel.CurrentThread.UserID, null))
                    {
                        threadTask.UpdateAccessInfo(base.EngineSharedModel.CurrentThread.UserID, null);
                    }

                    threadTaskService.Add(threadTask);
                    listTask.Add(threadTask);
                }
                break;
            }
            return(result, listTask);
        }
Example #4
0
        public (List <sysBpmsSequenceFlow> flowsList, bool result) CheckGateway(sysBpmsGateway gateway, sysBpmsSequenceFlow joinFromSequenceFlow, Guid?threadTaskID)
        {
            SequenceFlowService        sequenceFlowService       = new SequenceFlowService(this.UnitOfWork);
            List <sysBpmsSequenceFlow> acceptedForkSequenceFlows = new List <sysBpmsSequenceFlow>();

            ConditionService conditionService = new ConditionService(this.UnitOfWork);

            switch ((sysBpmsGateway.e_TypeLU)gateway.TypeLU)
            {
            case sysBpmsGateway.e_TypeLU.ExclusiveGateWay:
            {
                List <sysBpmsCondition> listCondition = conditionService.GetList(gateway.ID, null, null);
                foreach (sysBpmsCondition condition in listCondition)
                {
                    if (new DynamicCodeEngine(base.EngineSharedModel, this.UnitOfWork).ExecuteBooleanCode(DesignCodeUtility.GetDesignCodeFromXml(condition.Code)))
                    {
                        acceptedForkSequenceFlows.Add(sequenceFlowService.GetInfo(condition.SequenceFlowID.Value));
                        break;
                    }
                }
            }
            break;

            case sysBpmsGateway.e_TypeLU.InclusiveGateWay:
            {
                List <sysBpmsThreadTask> listRunningThreadTask = new ThreadTaskService(base.UnitOfWork).GetListRunning(base.EngineSharedModel.CurrentThreadID.ToGuidObj());
                if (!listRunningThreadTask.Any(c => c.ID != threadTaskID && gateway.TraceToStart.ToStringObj().Split(',').Contains(c.Task.ElementID)))
                {
                    List <sysBpmsCondition> listCondition = conditionService.GetList(gateway.ID, null, null);
                    foreach (sysBpmsCondition condition in listCondition)
                    {
                        if (new DynamicCodeEngine(base.EngineSharedModel, this.UnitOfWork).ExecuteBooleanCode(DesignCodeUtility.GetDesignCodeFromXml(condition.Code)))
                        {
                            acceptedForkSequenceFlows.Add(sequenceFlowService.GetInfo(condition.SequenceFlowID.Value));
                        }
                    }
                }
                else
                {
                    return(new List <sysBpmsSequenceFlow>(), true);
                }
            }
            break;

            case sysBpmsGateway.e_TypeLU.ParallelGateWay:
            {
                List <sysBpmsSequenceFlow> listJoinSequenceFlow = sequenceFlowService.GetList(base.EngineSharedModel.CurrentProcessID.Value, gateway.ElementID, "", "");
                //if all sequence flow were executed, run condition code and clear gateway Status Xml List
                if (listJoinSequenceFlow.Where(c => c.ID != joinFromSequenceFlow.ID).All(c => base.EngineSharedModel.CurrentThread.GatewayStatus.Any(d => d.GatewayID == gateway.ID && d.List.Any(f => f.SequenceFlowID == c.ID && f.Done))) || base.EngineSharedModel.CurrentThread == null)
                {
                    acceptedForkSequenceFlows = sequenceFlowService.GetList(base.EngineSharedModel.CurrentProcessID.Value, "", gateway.ElementID, "");
                    new ThreadService(base.UnitOfWork).ClearGatewayStatusXml(base.EngineSharedModel.CurrentThread, gateway.ID);
                }
                else
                {
                    //add this sequence flow path to executed path in Thread.GatewayStatusXml
                    new ThreadService(base.UnitOfWork).AddGatewayStatusXml(base.EngineSharedModel.CurrentThread, gateway.ID, joinFromSequenceFlow.ID);
                    return(new List <sysBpmsSequenceFlow>(), true);
                }
            }
            break;
            }

            if (!acceptedForkSequenceFlows.Any() && gateway.DefaultSequenceFlowID.HasValue)
            {
                acceptedForkSequenceFlows.Add(sequenceFlowService.GetInfo(gateway.DefaultSequenceFlowID.Value));
            }

            return(acceptedForkSequenceFlows, acceptedForkSequenceFlows.Any());
        }
        public ResultOperation Delete(Guid threadId)
        {
            ResultOperation resultOperation = new ResultOperation();

            try
            {
                this.BeginTransaction();

                //Delete sysBpmsDocument
                DocumentService documentService = new DocumentService(base.UnitOfWork);
                foreach (sysBpmsDocument document in documentService.GetList(null, null, null, "", null, null, threadId))
                {
                    if (resultOperation.IsSuccess)
                    {
                        resultOperation = documentService.Delete(document.GUID);
                    }
                }

                //Delete sysBpmsThreadVariable
                ThreadVariableService threadVariableService = new ThreadVariableService(base.UnitOfWork);
                foreach (sysBpmsThreadVariable sysThreadVariable in threadVariableService.GetList(threadId, null, ""))
                {
                    if (resultOperation.IsSuccess)
                    {
                        resultOperation = threadVariableService.Delete(sysThreadVariable.ID);
                    }
                }

                //Delete sysBpmsThreadEvent
                ThreadEventService threadEventService = new ThreadEventService(base.UnitOfWork);
                foreach (sysBpmsThreadEvent sysBpmsThreadEvent in threadEventService.GetList(threadId))
                {
                    if (resultOperation.IsSuccess)
                    {
                        resultOperation = threadEventService.Delete(sysBpmsThreadEvent.ID);
                    }
                }

                //Delete sysBpmsThreadTask
                ThreadTaskService threadTaskService = new ThreadTaskService(base.UnitOfWork);
                foreach (sysBpmsThreadTask sysBpmsThreadTask in threadTaskService.GetList(threadId, null, null, null))
                {
                    if (resultOperation.IsSuccess)
                    {
                        resultOperation = threadTaskService.Delete(sysBpmsThreadTask.ID);
                    }
                }

                //Delete Thread
                if (resultOperation.IsSuccess)
                {
                    this.UnitOfWork.Repository <IThreadRepository>().Delete(threadId);
                    this.UnitOfWork.Save();
                }
            }
            catch (Exception ex)
            {
                return(base.ExceptionHandler(ex));
            }
            base.FinalizeService(resultOperation);
            return(resultOperation);
        }