public ResultOperation DoneThreadTask(sysBpmsThreadTask currentThreadTask, sysBpmsUser currentUser)
        {
            ThreadTaskService threadTaskService = new ThreadTaskService(base.UnitOfWork);

            currentThreadTask.Update(DateTime.Now, (int)sysBpmsThreadTask.e_StatusLU.Done,
                                     currentThreadTask.OwnerUserID ?? currentUser?.ID);
            return(threadTaskService.Update(currentThreadTask));
        }
        /// <summary>
        /// It is called by Process engine for adding theadtask related to task element.
        /// </summary>
        /// <param name="item"></param>
        public (ResultOperation result, List <sysBpmsThreadTask> listTask) AddThreadTask(sysBpmsTask item, bool isFirstTask)
        {
            ThreadTaskService        threadTaskService = new ThreadTaskService(base.UnitOfWork);
            ResultOperation          result            = new ResultOperation();
            List <sysBpmsThreadTask> listTask          = new List <sysBpmsThreadTask>();

            switch ((sysBpmsTask.e_TypeLU)item.TypeLU)
            {
            case sysBpmsTask.e_TypeLU.UserTask:
                if (item.MarkerTypeLU.HasValue)
                {
                    foreach (sysBpmsThreadTask threadTaskItem in threadTaskService.GetMultiInstanceTask(item, base.EngineSharedModel))
                    {
                        //if user has access to this method, set thread task access Info to userID
                        if (isFirstTask && this.CheckAccessByThreadTask(item, threadTaskItem, base.EngineSharedModel.CurrentThread.UserID, null))
                        {
                            threadTaskItem.UpdateAccessInfo(base.EngineSharedModel.CurrentThread.UserID, null);
                        }
                        threadTaskService.Add(threadTaskItem);
                        listTask.Add(threadTaskItem);
                    }
                }
                else
                {
                    sysBpmsThreadTask threadTask = new sysBpmsThreadTask();
                    threadTask.Update(base.EngineSharedModel.CurrentThreadID.Value, item.ID, DateTime.Now, null, string.Empty, 0, (int)sysBpmsThreadTask.e_StatusLU.New);
                    threadTaskService.SetAccessInfoTo(threadTask, item, base.EngineSharedModel);
                    //if user has access to this method, set thread task access Info to thread userID
                    if (isFirstTask && this.CheckAccessByThreadTask(item, threadTask, base.EngineSharedModel.CurrentThread.UserID, null))
                    {
                        threadTask.UpdateAccessInfo(base.EngineSharedModel.CurrentThread.UserID, null);
                    }

                    threadTaskService.Add(threadTask);
                    listTask.Add(threadTask);
                }
                break;
            }
            return(result, listTask);
        }
        public ResultOperation SaveIntoDataBase(ContentHtml contentHtml, sysBpmsThreadTask threadTask, List <VariableModel> setExternalVariable, string threadTaskDescription)
        {
            ResultOperation resultOperation = new ResultOperation();

            try
            {
                base.BeginTransaction();

                //First set variable according to elements.
                //resultOperation = this.SetValuesToElements(contentHtml);

                //Then set external variables, filled by user defined actions.
                if (setExternalVariable != null)
                {
                    foreach (var item in setExternalVariable)
                    {
                        foreach (var dataModel in item.Items)
                        {
                            foreach (var val in dataModel.ToList())
                            {
                                this.SetValueByBinding(val.Key, val.Value);
                            }
                        }
                    }
                }

                if (resultOperation.IsSuccess)
                {
                    resultOperation = this.SaveInto();
                }

                if (resultOperation.IsSuccess)
                {
                    DocumentEngine documentEngine = new DocumentEngine(base.EngineSharedModel, base.UnitOfWork);
                    foreach (FileUploadHtml item in contentHtml.Rows.SelectMany(r => (r is RowHtml ? ((RowHtml)r).Columns : ((AccordionHtml)r).GetListColumn()).SelectMany(d => d.children.Where(f => f is FileUploadHtml).ToList())))
                    {
                        if (resultOperation.IsSuccess)
                        {
                            sysBpmsVariable variable = item.VariableId.ToGuidObjNull() == null ? null :
                                                       new VariableService(base.UnitOfWork).GetInfo(item.VariableId.ToGuidObj());

                            Guid?entityId    = (variable != null && this.SetDataList.ContainsKey(variable.Name)) ? this.SetDataList[variable?.Name].GetValue <Guid>("ID") : (Guid?)null;
                            Guid?entityDefId = variable?.EntityDefID;
                            resultOperation = documentEngine.IsValid(item, variable, entityId, entityDefId, base.EngineSharedModel.CurrentUserName);
                            if (resultOperation.IsSuccess)
                            {
                                resultOperation = documentEngine.SaveFile(item, variable, entityId, entityDefId, "", base.EngineSharedModel.CurrentUserName);
                            }
                        }
                    }
                }
                if (resultOperation.IsSuccess)
                {
                    if (!string.IsNullOrWhiteSpace(this.ThreadTaskDescription))
                    {
                        threadTask.Update(this.ThreadTaskDescription);
                        new ThreadTaskService(base.UnitOfWork).Update(threadTask);
                    }
                }
            }
            catch (Exception ex)
            {
                return(base.ExceptionHandler(ex));
            }
            base.FinalizeService(resultOperation);
            return(resultOperation);
        }
        public List <sysBpmsThreadTask> GetMultiInstanceTask(Domain.sysBpmsTask task, EngineSharedModel engineSharedModel)
        {
            sysBpmsThreadTask        threadTask = null;
            List <sysBpmsThreadTask> list       = new List <sysBpmsThreadTask>();

            switch ((sysBpmsTask.e_OwnerTypeLU)task.OwnerTypeLU)
            {
            case sysBpmsTask.e_OwnerTypeLU.User:
                switch ((UserTaskRuleModel.e_UserAccessType)task.UserTaskRuleModel.AccessType)
                {
                case UserTaskRuleModel.e_UserAccessType.Static:
                case UserTaskRuleModel.e_UserAccessType.Variable:
                    string userId = task.UserID;
                    if (task.UserTaskRuleModel.AccessType == (int)UserTaskRuleModel.e_UserAccessType.Variable)
                    {
                        userId = new DataManageEngine(engineSharedModel, base.UnitOfWork).GetValueByBinding(task.UserTaskRuleModel.Variable).ToStringObj();
                    }
                    int i = 0;
                    foreach (string item in userId.Split(','))
                    {
                        threadTask = new sysBpmsThreadTask();
                        threadTask.Update(engineSharedModel.CurrentThreadID.Value, task.ID, DateTime.Now.AddSeconds(i++), null, string.Empty, 0, (int)sysBpmsThreadTask.e_StatusLU.New);
                        threadTask.UpdateAccessInfo(item.ToGuidObj(), null);
                        list.Add(threadTask);
                    }
                    break;
                }
                break;

            case sysBpmsTask.e_OwnerTypeLU.Role:
                switch ((UserTaskRuleModel.e_RoleAccessType)task.UserTaskRuleModel.AccessType)
                {
                case UserTaskRuleModel.e_RoleAccessType.Static:
                case UserTaskRuleModel.e_RoleAccessType.Variable:
                    if (task.UserTaskRuleModel.AccessType == (int)UserTaskRuleModel.e_RoleAccessType.Variable)
                    {
                        task.SetRoleDepartment(new DataManageEngine(engineSharedModel, base.UnitOfWork).GetValueByBinding(task.UserTaskRuleModel.Variable).ToStringObj(), task.UserTaskRuleModel.SpecificDepartmentId);
                    }
                    foreach (var item in task.GetDepartmentRoles)
                    {
                        List <Guid> users = new DepartmentMemberService(base.UnitOfWork).GetList(item.Item1, item.Item2.ToIntObj(), null).Select(c => c.UserID).ToList();
                        //It is used  for sequential task.
                        int i = 0;
                        foreach (Guid uId in users)
                        {
                            threadTask = new sysBpmsThreadTask();
                            threadTask.Update(engineSharedModel.CurrentThreadID.Value, task.ID, DateTime.Now.AddSeconds(i++), null, string.Empty, 0, (int)sysBpmsThreadTask.e_StatusLU.New);
                            threadTask.UpdateAccessInfo(uId, null);
                            list.Add(threadTask);
                        }
                    }
                    break;

                case UserTaskRuleModel.e_RoleAccessType.CorrespondentRole:

                    Guid?userId       = task.UserTaskRuleModel.UserType == (int)UserTaskRuleModel.e_UserType.CurrentUserID ? new UserService(base.UnitOfWork).GetInfo(engineSharedModel.CurrentUserName ?? "")?.ID : engineSharedModel.CurrentThread?.UserID;
                    Guid?departmentId = new AccessCodeHelper(base.UnitOfWork).GetDepartmentHierarchyByUserId(userId.ToGuidObj(), task.UserTaskRuleModel.RoleCode.ToIntObj(), task.UserTaskRuleModel.GoUpDepartment);
                    if (!departmentId.HasValue)
                    {
                        throw new Exception(LangUtility.Get("OrganizationNotFound.Text", nameof(sysBpmsThreadTask)));
                    }
                    {
                        List <Guid> users = new DepartmentMemberService(base.UnitOfWork).GetList(departmentId, task.UserTaskRuleModel.RoleCode.ToIntObj(), null).Select(c => c.UserID).ToList();
                        //It is used  for sequential task.
                        int i = 0;
                        foreach (Guid uId in users)
                        {
                            threadTask = new sysBpmsThreadTask();
                            threadTask.Update(engineSharedModel.CurrentThreadID.Value, task.ID, DateTime.Now.AddSeconds(i++), null, string.Empty, 0, (int)sysBpmsThreadTask.e_StatusLU.New);
                            threadTask.UpdateAccessInfo(uId, null);
                            list.Add(threadTask);
                        }
                    }
                    break;
                }

                break;
            }
            return(list);
        }