예제 #1
0
        /// <summary>
        /// Complete Workflow
        /// </summary>
        /// <param name="workflowOid">Workflow Oid</param>
        /// <param name="workflowStatusType">Workflow status</param>
        /// <param name="result">Result</param>
        /// <param name="message">Custom message</param>
        public void CompleteWorkflow(Guid workflowOid, WorkflowStatusType workflowStatusType, string result, string message)
        {
            WorkflowDefinition wfd;

            using (var uofw = new FlowTasksUnitOfWork())
            {
                wfd = uofw.WorkflowDefinitions.First(w => w.WorkflowOid == workflowOid, w => w.WorkflowStatus,
                                                     w => w.WorkflowCode);

                var status = workflowStatusType.ToString();
                var wfs    = uofw.WorkflowStatuses.First(s => s.Status == status);

                // Only workflow in progress
                if (wfd.WorkflowStatus.Status != WorkflowStatusType.InProgress.ToString())
                {
                    return;
                }

                // Only complete the children if status is terminated or aborted ie user intervention
                if (workflowStatusType != WorkflowStatusType.Completed)
                {
                    var wfdChilds = uofw.WorkflowDefinitions.Find(w => w.WorkflowParentDefinitionId == wfd.WorkflowDefinitionId);

                    foreach (var child in wfdChilds)
                    {
                        CompleteWorkflow(child.WorkflowOid, workflowStatusType, result, string.Empty);
                    }
                }

                var tkd = uofw.TaskDefinitions.Find(t => t.WorkflowDefinition.WorkflowOid == workflowOid);
                foreach (var t in tkd)
                {
                    _task.CompleteTask(t.TaskOid, Properties.Resources.TASK_TERMINATED, string.Empty);
                }

#if DELETE_IN_PARAMETERS
                /*
                 *  if you use this you will not been able to restart a wf and bring it to
                 *  the existing step
                 */
                var wfInParm = uofw.WorkflowInParameters.Find(wip => wip.WorkflowDefinitionId == wfd.WorkflowDefinitionId, p => p.Property)
                               .Select(wip => wip.Property).ToList();

                var wfProp = uofw.WorkflowProperties.Find(p => p.WorkflowCode.Code == wfd.WorkflowCode.Code, p => p.Property)
                             .Select(p => p.Property).ToList();

                var wfOutParam = uofw.WorkflowOutParameters.Find(p => p.WorkflowDefinitionId == wfd.WorkflowDefinitionId, p => p.Property)
                                 .Select(p => p.Property).ToList();

                // Delete all the property a part from the ones in :
                // WorkflowProperties and WorkflowOutParameters
                // I need those properties when I want to manualy restart
                // the workflow
                foreach (var p in wfInParm)
                {
                    if (!wfProp.Contains(p) && !wfOutParam.Contains(p))
                    {
                        uofw.Properties.Delete(p);
                    }
                }
#endif
                wfd.WorkflowStatus = wfs;
                wfd.CompletedOn    = DateTime.Now;

                uofw.Commit();
            }

            _tracer.Trace(workflowOid, ActionTrace.WorkflowCompleted, wfd.WorkflowCode.Code,
                          result, string.Empty, string.Format(Properties.Resources.WF_COMPLETED,
                                                              workflowStatusType.ToString() + (string.IsNullOrWhiteSpace(message) ? string.Empty : " - " + message)), TraceEventType.Activity);
        }