Ejemplo n.º 1
0
        /// <summary>
        /// 每次审核办理执行
        /// </summary>
        /// <param name="input"></param>
        public void CompleteTask(CompleteTaskInput <UpdateQualityProblemInput> input)
        {
            var authInfo = _authInfoProvider.GetCurrent();
            var userId   = authInfo?.User?.Id;
            var task     = _taskProvider.GetTask(input.Id);

            if (task.Assignee != userId.Value.ToString())
            {
                throw new AppCoreException($"id:为{userId.Value}的用户不是任务【{task.NodeName}】的委托人");
            }
            var processDefinition = _definitionProvder.Get(task.ProcessDefinitionId);
            var editableFields    = ((UserTaskNode)processDefinition.GetNode(task.NodeUid)).GetEditableFields();

            if (input.Data != null)
            {
                var project = input.Data.MapTo <QualityProblem>();
                if (editableFields == null)
                {
                    _problemRepository.Update(project, new System.Linq.Expressions.Expression <Func <QualityProblem, object> >[] {
                        u => u.State,
                        u => u.Mid,
                        u => u.ProcessInstanceId
                    }, false);
                }
                else
                {
                    _problemRepository.Update(project, editableFields.ToArray());
                }
            }
            if (!input.PreventCommit)
            {
                _taskProvider.Complete(input.Id, input.Comment);
            }
        }
Ejemplo n.º 2
0
        public void CompleteTask(CompleteTaskInput <UpdateRecordInput> input)
        {
            NullableHelper.SetNull(input.Data);
            var authInfo = _authInfoProvider.GetCurrent();
            var userId   = authInfo?.User?.Id;
            var task     = _taskProvider.GetTask(input.Id);

            if (task.Assignee != userId.Value.ToString())
            {
                throw new AppCoreException($"id:为{userId.Value}的用户不是任务【{task.NodeName}】的委托人");
            }
            var processDefinition = _definitionProvder.Get(task.ProcessDefinitionId);
            var editableFields    = ((UserTaskNode)processDefinition.GetNode(task.NodeUid)).GetEditableFields();

            if (input.Data != null)
            {
                var record   = input.Data.MapTo <Record>();
                var existing = _recordRepository.Get()
                               .Include(u => u.Attachments)
                               .Where(u => u.ProcessInstanceId == task.ProcessInstanceId).FirstOrDefault();
                record.Id = existing.Id;
                if (existing == null)
                {
                    throw new EntityException("RecordInstanceId", task.ProcessInstanceId, "Record", "不存在");
                }
                if (editableFields == null)
                {
                    _recordRepository.Update(record, existing, new System.Linq.Expressions.Expression <Func <Record, object> >[] {
                        u => u.DataState,
                        u => u.Mid,
                        u => u.ProcessInstanceId,
                        u => u.ProjectId
                    }, false);
                }
                else
                {
                    _recordRepository.Update(record, editableFields.ToArray());
                }
            }
            if (!input.PreventCommit)
            {
                _taskProvider.Complete(input.Id, input.Comment);
            }
        }
Ejemplo n.º 3
0
        public void CompleteTask(CompleteTaskInput input)
        {
            var authInfo = _authInfoProvider.GetCurrent();
            var userId   = authInfo?.User?.Id;
            var task     = _taskProvider.GetTask(input.Id);

            if (task.Assignee != userId.Value.ToString())
            {
                throw new AppCoreException($"id:为{userId.Value}的用户不是任务【{task.NodeName}】的委托人");
            }
            if (input.FormContents.Count > 0)
            {
                _taskProvider.SetFields(input.Id, input.FormContents);
            }
            if (!input.PreventCommit)
            {
                _taskProvider.Complete(input.Id, input.Comment);
            }
        }
Ejemplo n.º 4
0
        public void CompleteTask(CompleteTaskInput <UpdateProjectInput> input)
        {
            NullableHelper.SetNull(input.Data);
            var authInfo = _authInfoProvider.GetCurrent();
            var userId   = authInfo?.User?.Id;
            var task     = _taskProvider.GetTask(input.Id);

            if (task.Assignee != userId.Value.ToString())
            {
                throw new AppCoreException($"id:为{userId.Value}的用户不是任务【{task.NodeName}】的委托人");
            }
            var processDefinition = _definitionProvder.Get(task.ProcessDefinitionId);
            var editableFields    = ((UserTaskNode)processDefinition.GetNode(task.NodeUid)).GetEditableFields();

            if (input.Data != null)
            {
                var project  = input.Data.MapTo <Project>();
                var existing = _projectRepository.Get()
                               .Include(u => u.Location)
                               .Include(u => u.Members)
                               .Include(u => u.Units).ThenInclude(u => u.Members)
                               .Include(u => u.Attachments)
                               .Where(u => u.ProcessInstanceId == task.ProcessInstanceId).FirstOrDefault();
                project.Id = existing.Id;
                if (existing == null)
                {
                    throw new EntityException("ProjectInstanceId", task.ProcessInstanceId, "Project", "不存在");
                }
                if (editableFields == null)
                {
                    using (var transaction = _dbContextProvider.BeginTransaction())
                    {
                        if (project.Location != null && project.Location.IsTransient())
                        {
                            project.Location.ProjectId = project.Id;
                        }
                        _projectRepository.Update(project, existing, new System.Linq.Expressions.Expression <Func <Project, object> >[] {
                            u => u.DataState,
                            u => u.Mid,
                            u => u.ProcessInstanceId,
                            u => u.Units,
                            u => u.No
                        }, false);
                        var addedUnits   = project.Units.Except(existing.Units, u => u.Id).ToList();
                        var deletedUnits = existing.Units.Except(project.Units, u => u.Id).ToList();
                        var updatedUnits = project.Units.Intersect(existing.Units, u => u.Id).ToList();
                        foreach (var added in addedUnits)
                        {
                            _projectUnitRepository.Add(added);
                        }
                        foreach (var deleted in deletedUnits)
                        {
                            _projectUnitRepository.Delete(deleted);
                        }
                        foreach (var updated in updatedUnits)
                        {
                            var existed = existing.Units.Where(u => u.Id == updated.Id).FirstOrDefault();
                            _projectUnitRepository.Update(updated, existed, new Expression <Func <ProjectUnit, object> >[] { }, false);
                        }
                        transaction.Commit();
                    }
                }
                else
                {
                    if (editableFields.Contains("Units"))
                    {
                        var addedUnits   = project.Units.Except(existing.Units, u => u.Id).ToList();
                        var deletedUnits = existing.Units.Except(project.Units, u => u.Id).ToList();
                        var updatedUnits = project.Units.Intersect(existing.Units, u => u.Id).ToList();
                        foreach (var added in addedUnits)
                        {
                            _projectUnitRepository.Add(added);
                        }
                        foreach (var deleted in deletedUnits)
                        {
                            _projectUnitRepository.Delete(deleted);
                        }
                        foreach (var updated in updatedUnits)
                        {
                            var existed = existing.Units.Where(u => u.Id == updated.Id).FirstOrDefault();
                            _projectUnitRepository.Update(updated, existed, new Expression <Func <ProjectUnit, object> >[] { }, false);
                        }
                        editableFields.Remove("Units");
                    }
                    _projectRepository.Update(project, editableFields.ToArray());
                }
            }
            if (!input.PreventCommit)
            {
                _taskProvider.Complete(input.Id, input.Comment);
            }
        }
Ejemplo n.º 5
0
        private void ExecutionLoop(ITaskProvider taskProvider, IRepository repository)
        {
            while (true)
            {
                status.CurrentTask = null;
                status.Status = ExecutionStatus.WaitingForTask;
                engine.SystemResources = systemResources;
                engine.Repository = wrapperFactory.CreateWrapper(repository);
                Task task;
                try
                {
                    task = taskProvider.GetTask();
                    if(task == null)
                        continue;
                }
                catch (TimeoutException)
                {
                    (taskProvider as ITaskProviderChannel).Abort();
                    return;
                }

                var interval = taskProvider.QueryNotifyInterval();
                using (new Timer(
                    x => OnTimer((Tuple<ITaskProvider, Guid>) x),
                    Tuple.Create(taskProvider, task.Id),
                    TimeSpan.Zero,
                    interval))
                {
                    status.CurrentTask = task;
                    status.Status = ExecutionStatus.ProcessingTask;
                    try
                    {
                        using (Perfomance.Trace("GeneralCore::StartExecution()").BindToTrace())
                        {
                            engine.ExecuteTask(task);
                        }
                        ReportSuccess(taskProvider, task);
                    }
                    catch (TaskRejectedException)
                    {
                        ReportReject(taskProvider, task);
                    }
                    catch (TaskFailedException e)
                    {
                        ReportFailure(taskProvider, task, ErrorSource.Task, e.InnerException);
                    }
                    catch (Exception e)
                    {
                        ReportFailure(taskProvider, task, ErrorSource.Engine, e.InnerException);
                    }
                }
            }
        }
        public TaskDto GetTask(int taskId)
        {
            var task = _taskProvider.GetTask(taskId);

            return(ConvertToDto(task));
        }