예제 #1
0
        void IProcessService.CancelAllAbout(Process process, ActivityInstanceBase activityInstance)
        {
            //取消所有调度请求
            this._schedulerService.CancelAll(process, activityInstance.ID, activityInstance.ActivityName);
            //若是人工节点则取消所有人工任务
            if (activityInstance is HumanActivityInstance)
            {
                _workItemRepository.CancelAll(process, activityInstance.ID);
            }
            //若是子流程节点则撤销对应的子流程实例
            Process subProcess;
            var     sub = activityInstance as SubProcessActivityInstance;

            if (sub != null &&
                sub.SubProcessId.HasValue &&
                (subProcess = _repository.FindBy(sub.SubProcessId.Value)) != null)
            {
                this.CancelAllAbout(process, subProcess);
            }

            this._log.InfoFormat("取消流程实例“{0}”#{1}的节点“{2}”#{3}相关的运行时信息"
                                 , process.Title
                                 , process.ID
                                 , activityInstance.ActivityName
                                 , activityInstance.ID);
        }
예제 #2
0
        void IProcessService.UpdateActivityInstance(ActivityInstanceBase instance)
        {
            _repository.UpdateActivityInstance(instance);

            this._log.InfoFormat("更新流程实例#{0}的节点实例“{1}”#{2}"
                                 , instance.ProcessId
                                 , instance.ActivityName
                                 , instance.ID);
        }
예제 #3
0
        void IProcessService.CreateActivityInstance(ActivityInstanceBase instance)
        {
            _repository.AddActivityInstance(instance);

            this._log.InfoFormat(
                "创建节点实例信息:{0}|ActivityInstanceId={1}|ActivityName={2}|FlowNodeIndex={3}|ProcessId={4}"
                , instance
                , instance.ID
                , instance.ActivityName
                , instance.FlowNodeIndex
                , instance.ProcessId);
        }
예제 #4
0
        bool IProcessService.CanRollback(Process process, User previousActioner, out ActivityInstanceBase previous, out string reason)
        {
            //TODO:是否要为rollback引入代理逻辑?
            reason   = string.Empty;
            previous = null;
            if (!this.IsStatusOrSchedulingSafe(process, ProcessStatus.Active))
            {
                if (this._log.IsDebugEnabled)
                {
                    this._log.DebugFormat("不允许回滚:{0}", reason = "只有处于活动状态的流程才允许回滚");
                }
                return(false);
            }

            previous = (this as IProcessService).GetPreviousActivityInstance(process);

            #region 常规判断
            if (previous == null)
            {
                if (this._log.IsDebugEnabled)
                {
                    this._log.DebugFormat("不允许回滚:{0}", reason = "没有找到上一个节点信息");
                }
                return(false);
            }
            if (!(previous is HumanActivityInstance))
            {
                if (this._log.IsDebugEnabled)
                {
                    this._log.DebugFormat("不允许回滚:{0}", reason = "上一个节点不是人工节点");
                }
                return(false);
            }
            if (process.ProcessType.GetActivitySetting(previous.ActivityName).IsChildOfActivity)
            {
                if (this._log.IsDebugEnabled)
                {
                    this._log.DebugFormat("不允许回滚:{0}", reason = string.Format("上一节点“{0}”是其他节点的子节点,不支持回滚", previous.ActivityName));
                }
                return(false);
            }
            #endregion

            #region  一个节点是人工节点才允许回滚
            var human = previous as HumanActivityInstance;
            if (!human.IsReady(previousActioner))
            {
                if (this._log.IsDebugEnabled)
                {
                    this._log.DebugFormat("不允许回滚:{0}", reason = "传入的上一节点执行人并非实际执行人");
                }
                return(false);
            }
            if (human.Actioners.Length > 1)
            {
                if (this._log.IsDebugEnabled)
                {
                    this._log.DebugFormat("不允许回滚:{0}", reason = string.Format("上一节点“{0}”执行人大于一人,不允许回滚", previous.ActivityName));
                }
                return(false);
            }
            if (_workItemRepository.FindAllByProcess(process).FirstOrDefault(o => o.Status != WorkItemStatus.New) != null)
            {
                if (this._log.IsDebugEnabled)
                {
                    this._log.DebugFormat("不允许回滚:{0}", reason = string.Format("由于流程当前任务已开始被处理,无法回滚"));
                }
                return(false);
            }
            #endregion

            //TODO:目前未考虑子流程节点的情况

            return(true);
        }