Esempio n. 1
0
        public List <string> GetActivityPathAsync(long prosInsId)
        {
            var list = WfActivityInstanceRepository
                       .AdminQueryEnable()
                       .Where(m => m.ProcessInstanceId == prosInsId &&
                              (m.ActivityState == WfActivityState.Completed || m.ActivityState == WfActivityState.Running))
                       .OrderBy(m => m.Id)
                       .Select(m => m.ActivityGuid)
                       .ToListAsync();

            // 流程图路径
            var pathKeys = new List <string>();

            foreach (var guid in list.Result)
            {
                // 如果被退回
                if (pathKeys.Contains(guid))
                {
                    // 移除该步骤之后的路径
                    var index = pathKeys.IndexOf(guid) + 1;
                    pathKeys.RemoveRange(index, pathKeys.Count - index);

                    continue;
                }

                pathKeys.Add(guid);
            }

            return(pathKeys);
        }
Esempio n. 2
0
        public IPagedList <WfActivityInstance> GetMyCompleteTaskList(string keyWord, DateTime?createStartTime, DateTime?createEndTime, DateTime?dealStartTime, DateTime?dealEndTime, string orderField, string orderDirection, int pageSize = 30, int pageCurrent = 1)
        {
            var query = WfActivityInstanceRepository.AdminQueryEnable().Where(m => m.ActivityType == WfActivityType.Task && m.DealUserId == User.UserInfo.UserId);

            if (!string.IsNullOrEmpty(keyWord))
            {
                query = query.Where(d => d.ProcessName.Contains(keyWord) ||
                                    d.CreateUserName.Contains(keyWord) ||
                                    d.ActivityName.Contains(keyWord));
            }
            if (createStartTime.HasValue)
            {
                query = query.Where(d => d.CreateTime >= createStartTime.Value);
            }
            if (createEndTime.HasValue)
            {
                query = query.Where(d => d.CreateTime <= createEndTime.Value);
            }
            if (dealStartTime.HasValue)
            {
                query = query.Where(d => d.DealTime >= dealStartTime.Value);
            }
            if (dealEndTime.HasValue)
            {
                query = query.Where(d => d.DealTime <= dealEndTime.Value);
            }
            return(ToPageList(query, orderField, orderDirection, m => m.Id, pageCurrent, pageSize));;
        }
Esempio n. 3
0
        private async Task SendProgress(string nextStepId,
                                        string assignToUserIds,
                                        string assignToUserNames,
                                        JsonModel jsonModel,
                                        WfProcessInstance processInstance,
                                        WfProcess process,
                                        WfActivityInstance currActIns)
        {
            var nextAct = process.GetActivity(nextStepId);

            if (nextAct == null)
            {
                jsonModel.statusCode = 300;
                jsonModel.message    = $"流程 {process.Name}的节点 {nextStepId} 找不到!";
                return;
            }

            var nextActInstance = CreateActivityInstance(process,
                                                         processInstance,
                                                         nextAct,
                                                         WfActivityState.Running,
                                                         assignToUserIds,
                                                         assignToUserNames);

            nextActInstance.PreActInstanceId = currActIns.Id;
            processInstance.CurrActivityName = nextActInstance.ActivityName;
            await WfActivityInstanceRepository.SaveAsync(nextActInstance);
        }
Esempio n. 4
0
        public Task <WfActivityInstance> GetRunningActivity(long proInsId)
        {
            var obj = WfActivityInstanceRepository
                      .AdminQueryEnable()
                      .FirstOrDefaultAsync(m => m.ProcessInstanceId == proInsId &&
                                           m.ActivityState == WfActivityState.Running);

            return(obj);
        }
Esempio n. 5
0
        public Task <WfActivityInstance> GetActivityAsync(long prosInsId, long id)
        {
            var obj = WfActivityInstanceRepository
                      .AdminQueryEnable()
                      .FirstOrDefaultAsync(m => m.ProcessInstanceId == prosInsId &&
                                           m.Id == id);

            return(obj);
        }
Esempio n. 6
0
        public Task <List <WfActivityInstance> > GetActivityListAsync(long prosInsId)
        {
            var list = WfActivityInstanceRepository
                       .AdminQueryEnable()
                       .Where(m => m.ProcessInstanceId == prosInsId)
                       .OrderBy(m => m.Id)
                       .ToListAsync();

            return(list);
        }
Esempio n. 7
0
        /// <summary>
        /// 生成回退节点
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="process"></param>
        /// <param name="currActIns"></param>
        /// <returns></returns>
        private async Task FallBackProgress(WfProcessInstance processInstance,
                                            WfProcess process,
                                            WfActivityInstance currActIns,
                                            string backStepId)
        {
            var preActInstance = await WfActivityInstanceRepository.GetLatestActivityAsync(processInstance.Id, backStepId);

            var backActivity    = process.GetActivity(backStepId);
            var backActInstance = CreateActivityInstance(process,
                                                         processInstance,
                                                         backActivity,
                                                         WfActivityState.Running,
                                                         preActInstance.AssignToUserIds,
                                                         preActInstance.AssignToUserNames);

            backActInstance.PreActInstanceId       = preActInstance.PreActInstanceId;
            backActInstance.BackActivityInstanceId = currActIns.Id;
            processInstance.CurrActivityName       = backActInstance.ActivityName;
            currActIns.ActivityState = WfActivityState.Sendbacked;
            await WfActivityInstanceRepository.SaveAsync(backActInstance);
        }
Esempio n. 8
0
        public IPagedList <WfActivityInstance> GetMyTaskList(int pageSize = 30, int pageCurrent = 1)
        {
            var userId       = $"[{User.UserInfo.UserId}]";
            var queryProcess = WfProcessInstanceRepository.AdminQueryEnable()
                               .Where(m => m.ProcessState == WfProcessState.Running);

            var queryActivity = WfActivityInstanceRepository
                                .AdminQueryEnable()
                                .Where(m => m.ActivityState == WfActivityState.Running &&
                                       m.ActivityType == WfActivityType.Task &&
                                       !string.IsNullOrEmpty(m.AssignToUserIds) &&
                                       m.AssignToUserIds.Contains(userId));

            queryActivity = queryActivity.Join(
                queryProcess,
                act => act.ProcessInstanceId,
                pro => pro.Id,
                (act, pro) => act);
            var list = queryActivity
                       .OrderByDescending(m => m.Id)
                       .ToPagedList(pageCurrent, pageSize);

            return(list);
        }
Esempio n. 9
0
        public async Task <JsonModel> DealProcess(long proInsId,
                                                  long currActInsId,
                                                  WfActivityButton clickBtn,
                                                  string comment,
                                                  string nextStepId,
                                                  string assignToUserIds,
                                                  string assignToUserNames,
                                                  string backStepId)
        {
            var jsonModel = new JsonModel();

            jsonModel.statusCode = 300;
            #region //获取流程数据
            var processInstance = await GetProcessInstanceAsync(proInsId);

            if (processInstance == null)
            {
                jsonModel.message = $"找不到id为{proInsId}的流程实例!";
                return(jsonModel);
            }

            var process = await GetProcessById(processInstance.WfProcessId);

            if (process == null)
            {
                jsonModel.message = $"找不到id为{processInstance.WfProcessId}的流程!";
                return(jsonModel);
            }

            var currActIns = await GetActivityAsync(proInsId, currActInsId);

            if (currActIns == null)
            {
                jsonModel.message = $"流程{processInstance.ProcessName}({processInstance.Id})中找不到id为{currActInsId}的节点实例!";
                return(jsonModel);
            }
            #endregion

            #region 当前节点处理
            currActIns.Comment       = comment;
            currActIns.DealTime      = DateTime.Now;
            currActIns.DealUserId    = User.UserInfo.UserId;
            currActIns.DealUserName  = User.UserInfo.RealName;
            currActIns.ActivityState = WfActivityState.Completed;
            await WfActivityInstanceRepository.SaveAsync(currActIns);

            #endregion

            switch (clickBtn)
            {
            case WfActivityButton.FallBack:
                await FallBackProgress(processInstance, process, currActIns, backStepId);

                jsonModel.statusCode = 200;
                break;

            case WfActivityButton.Send:
                await SendProgress(nextStepId, assignToUserIds, assignToUserNames, jsonModel, processInstance, process, currActIns);

                jsonModel.statusCode = 200;
                break;

            case WfActivityButton.Complete:
                await CompleteProcess(processInstance);

                jsonModel.statusCode = 200;
                break;

            default:
                jsonModel.message = $"错误的按钮:{clickBtn}!";
                break;
            }

            return(jsonModel);
        }
Esempio n. 10
0
        public async Task <JsonModel> StartProcess(long processId,
                                                   long sourceId,
                                                   string condition,
                                                   string nextStepId,
                                                   string assignToUserIds,
                                                   string assignToUserNames)
        {
            var result = new JsonModel();
            //创建流程实例
            var process = await GetProcessById(processId);

            if (result == null)
            {
                result.statusCode = 300;
                result.message    = "流程不存在!processId:" + processId;
                return(result);
            }
            var processInstance = new WfProcessInstance()
            {
                CommonStatus = CommonStatus.Enabled,
                ProcessName  = process.Name,
                ProcessState = WfProcessState.Running,
                SourceId     = sourceId,
                TableSource  = process.TableSource,
                WfProcessId  = process.Id,
                Conditions   = condition
            };
            await WfProcessInstanceRepository.SaveAsync(processInstance);

            //创建流程节点
            var firstAct = process.GetFirstActivity();

            if (firstAct == null)
            {
                result.statusCode = 300;
                result.message    = $"流程 {process.Name}的第一个节点找不到!";
                return(result);
            }
            WfActivityInstance firstActInstance = CreateActivityInstance(process,
                                                                         processInstance,
                                                                         firstAct,
                                                                         WfActivityState.Completed,
                                                                         User.UserInfo.UserId,
                                                                         User.UserInfo.RealName);

            firstActInstance.DealTime     = DateTime.Now;
            firstActInstance.DealUserId   = User.UserInfo.UserId;
            firstActInstance.DealUserName = User.UserInfo.RealName;
            await WfActivityInstanceRepository.SaveAsync(firstActInstance);

            //创建下一步节点
            var nextAct = process.GetActivity(nextStepId);

            if (nextAct == null)
            {
                result.statusCode = 300;
                result.message    = $"流程 {process.Name}的节点 {nextStepId} 找不到!";
                return(result);
            }
            var nextActInstance = CreateActivityInstance(process,
                                                         processInstance,
                                                         nextAct,
                                                         WfActivityState.Running,
                                                         assignToUserIds,
                                                         assignToUserNames);

            nextActInstance.PreActInstanceId = firstActInstance.Id;
            await WfActivityInstanceRepository.SaveAsync(nextActInstance);

            processInstance.CurrActivityName = nextActInstance.ActivityName;
            await WfProcessInstanceRepository.SaveAsync(processInstance);

            return(result);
        }