/// <summary>
        /// 获取指定工作流、角色、时间段的实例集合
        /// </summary>
        /// <param name="workflowName">流程名称</param>
        /// <param name="userIdentity">用户身份</param>
        /// <param name="role">审批角色</param>
        /// <param name="startDate">时间段起始时间</param>
        /// <param name="endDate">时间段截止时间</param>
        /// <returns></returns>
        protected override InstanceCollection Distill(string workflowName, IUserIdentity userIdentity, ApprovalRole role, DateTime startDate, DateTime endDate)
        {
            List <StateMachineWorkflowInstance> instances = new List <StateMachineWorkflowInstance>();
            StateMachineWorkflow     workflow             = (StateMachineWorkflow)WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>().GetWorkflowDefine(workflowName);
            Dictionary <string, int> stateIndex           = new Dictionary <string, int>();
            List <string>            allStates            = new List <string>();

            for (int i = 0; i < workflow.States.Length; i++)
            {
                ApprovalState state = workflow.States[i];
                if (state.IsApprovalState && !state.Name.Equals(workflow.InitState))
                {
                    stateIndex.Add(state.Name, i);
                    allStates.Add(state.Name);
                }
            }
            if (allStates.Count == 0)
            {
                return(new InstanceCollection());
            }

            instances.AddRange(WorkflowRuntime.Current.GetListByState(workflowName, allStates.ToArray()));
            InstanceCollection collection = new InstanceCollection();

            foreach (StateMachineWorkflowInstance one in instances)
            {
                InstanceWithRole o = new InstanceWithRole(one, role, true);
                o.TaskName = ((char)((int)'a' + stateIndex[one.CurrentState.Name])) + "." + one.CurrentState.Description;
                collection.Add(o);
            }
            return(collection);
        }
        /// <summary>
        /// Moves the on.
        /// </summary>
        /// <param name="stateName">Name of the state.</param>
        public void MoveOn(string stateName)
        {
            ApprovalState nextState = ((StateMachineWorkflow)Workflow).GetStateByName(stateName);

            this.stateRecordNames.Add(this.stateName);
            this.stateName = nextState.Name;
        }
        /// <summary>
        /// 是否是当前用户的代理任务
        /// </summary>
        /// <param name="instance">The instance.</param>
        /// <param name="userId">The user id.</param>
        /// <returns></returns>
        public virtual bool IsMyAgentInstance(WorkflowInstance instance, string userId)
        {
            if (instance == null)
            {
                throw new ArgumentNullException("instance");
            }
            if (string.IsNullOrEmpty(userId))
            {
                throw new ArgumentNullException("userId");
            }
            ApprovalState        currentState    = ((StateMachineWorkflowInstance)instance).CurrentState;
            IApprovalSaveService approvalService = WorkflowRuntime.Current.GetService <IApprovalSaveService>();
            List <ApprovalAgent> agentList       = approvalService.GetValidAgentInfoByToUser(userId);

            if (agentList != null && agentList.Count > 0)
            {
                foreach (ApprovalAgent agentInfo in agentList)
                {
                    foreach (ApprovalEvent approvalEvent in currentState.Events)
                    {
                        if (IsMyTaskInstance(instance, agentInfo.SetUserId))
                        {
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
        /// <summary>
        /// 启动工作流
        /// </summary>
        public override void Start()
        {
            StateMachineWorkflow o         = (StateMachineWorkflow)this.Workflow;
            ApprovalState        initState = o.GetStateByName(o.InitState);

            this.stateName   = initState.Name;
            this.persistTime = DateTime.Now;
            WorkflowRuntime.Current.GetService <IWorkflowPersistService>().InsertWorkflowInstance(this);
        }
Example #5
0
        /// <summary>
        /// Gets the sub unit role list.
        /// </summary>
        /// <param name="taskStateList">The task state list.</param>
        /// <param name="taskName">Name of the task.</param>
        /// <returns></returns>
        protected override List <StateMachineWorkflowInstance> GetSubUnitRoleList(List <string> taskStateList, string taskName)
        {
            List <StateMachineWorkflowInstance> instanceList = new List <StateMachineWorkflowInstance>();

            foreach (string stateName in taskStateList)
            {
                ApprovalEvent taskEvent = new ApprovalEvent();
                ApprovalState state     = Workflow.GetStateByName(stateName);
                if (state != null)
                {
                    foreach (ApprovalEvent approvalEvent in state.Events)
                    {
                        foreach (EventRole role in approvalEvent.Roles)
                        {
                            if (role.Name == Rules.UserRole.Name && taskName == role.TaskName)
                            {
                                taskEvent = approvalEvent;
                                break;
                            }
                        }
                    }
                    //如果用户为二级单位专办员
                    if (Rules.IsCreator())
                    {
                        //如果该任务只允许立项创建者办理
                        if (taskEvent.Authorization != Authorization.DenyOwner.ToString())
                        {
                            instanceList.AddRange(GetOwnerList(new string[] { stateName }));
                        }
                    }
                    else
                    {
                        instanceList.AddRange(GetUnitList(new string[] { stateName }));
                    }
                    //非用户创建,但是属于指定专办的实例,且实例为指定状态
                    if (taskEvent.Authorization == Authorization.DenyOwner.ToString())
                    {
                        //其它二级单位专办员获得专办立项列表
                        List <ApprovalAssignment> assignmentList = WorkflowRuntime.Current.GetService <IApprovalSaveService>().GetAssignmentByToUnit(this.Workflow.Name, UnitCode);
                        foreach (ApprovalAssignment assignment in assignmentList)
                        {
                            StateMachineWorkflowInstance assignInstance = (StateMachineWorkflowInstance)WorkflowRuntime.Current.GetInstance(assignment.WorkflowInstanceId);
                            if (assignInstance.StateName == stateName)
                            {
                                instanceList.Add(assignInstance);
                            }
                        }
                    }
                }
            }
            return(instanceList);
        }
 internal static bool IsMineICanDo(ApprovalState state, ApprovalRole role)
 {
     foreach (ApprovalEvent oneEvent in state.Events)
     {
         foreach (EventRole one in oneEvent.Roles)
         {
             if (one.Name.Equals(role.Name, StringComparison.OrdinalIgnoreCase) &&
                 (oneEvent.Authorization == Authorization.OwnerOnly.ToString() || oneEvent.Authorization == Authorization.All.ToString()))
             {
                 return(true);
             }
         }
     }
     return(false);
 }
        /// <summary>
        /// 是否是当前用户的任务
        /// </summary>
        /// <param name="instance">工作流实例</param>
        /// <param name="userId">用户Id</param>
        /// <returns>是返回True 不是返回False</returns>
        public virtual bool IsMyTaskInstance(WorkflowInstance instance, string userId)
        {
            if (instance == null)
            {
                throw new ArgumentNullException("instance");
            }
            if (string.IsNullOrEmpty(userId))
            {
                throw new ArgumentNullException("userId");
            }
            IApprovalSaveService      service      = WorkflowRuntime.Current.GetService <IApprovalSaveService>();
            ApprovalState             currentState = ((StateMachineWorkflowInstance)instance).CurrentState;
            List <ApprovalAssignment> assignments  = service.GetAssignmentByAssignState(instance.Id, currentState.Name);

            if (assignments.Count == 0)
            {
                foreach (ApprovalEvent approvalEvent in currentState.Events)
                {
                    if (IsAuthorized(userId, approvalEvent, instance))
                    {
                        return(true);
                    }
                }
            }
            else
            {
                IUserIdentity userIdentity = WorkflowRuntime.Current.GetService <IIdentityService>().GetUserIdentity(userId);
                foreach (ApprovalAssignment assignment in assignments)
                {
                    if (assignment.ToUserId == userId)
                    {
                        return(true);
                    }
                    if (assignment.ToUserId == null && assignment.ToUnitCode.Equals(userIdentity.GetUserUnitCode(), StringComparison.OrdinalIgnoreCase))
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
Example #8
0
 /// <summary>
 /// Initializes a new instance of the <see cref="OnInstanceEndArg"/> class.
 /// </summary>
 public OnInstanceEndArg(int eaid, Activity lastActivity, ApprovalState lastState)
 {
     this.groupId      = eaid;
     this.lastActivity = lastActivity;
     this.lastState    = lastState;
 }