コード例 #1
0
ファイル: Approver.cs プロジェクト: jasonkim0130/WorkFlow
        public ReturnApproveResult Approve(int flowCaseId, string[] nextApprovers)
        {
            ReturnApproveResult result = new ReturnApproveResult();
            var action =
                Entities.WF_CaseUserActions.Where(
                    p => p.FlowCaseId == flowCaseId && p.UserNo == CurrentUser && p.ActionId == 0 && p.StatusId > 0)
                .Select(p => new
            {
                UserAction = p,
                Step       = p.WF_FlowSteps,
                Group      = p.WF_FlowSteps.WF_StepGroups,
                FlowCase   = p.WF_FlowCases
            }).FirstOrDefault();

            PropertyInfo[] propertyValues = GetPropertyValues(flowCaseId);
            //using (TransactionScope scope = new TransactionScope())
            //{
            if (action == null)
            {
                result.Result = ApproveResult.InvalidUserAction;
                return(result);
            }

            if (action.FlowCase == null || action.FlowCase.StatusId <= 0)
            {
                result.Result = ApproveResult.InvalidFlowCase;
                return(result);
            }

            if (action.FlowCase.Approved != null || action.FlowCase.Rejected != null ||
                action.FlowCase.ReviseAbort != null)
            {
                result.Result = ApproveResult.FlowCaseTerminate;
                return(result);
            }

            if (action.Step == null || action.Step.StatusId <= 0)
            {
                result.Result = ApproveResult.InvalidFlowStep;
                return(result);
            }
            NextStepData nsd = GetNextStepApprovers(action.FlowCase.FlowId, propertyValues, action.FlowCase.UserNo, action.Group.StepGroupId); //#TODO

            if (nsd.EmployeeList?.Count != nextApprovers?.Length && nextApprovers?.Length > 0)
            {
                result.Result = ApproveResult.InvalidApprover;
                return(result);
            }
            if (nextApprovers != null && nextApprovers.Length > 0)
            {
                for (int i = 0; i < nextApprovers.Length; i++)
                {
                    string userno = nextApprovers[i];
                    if (nsd.EmployeeList[i].All(p => p.UserNo != userno))
                    {
                        result.Result = ApproveResult.InvalidApprover;
                        return(result);
                    }
                }
                result.NextApprovers = nextApprovers;
            }

            action.UserAction.ActionId    = Consts.Approved;
            action.UserAction.LastUpdated = DateTime.UtcNow;
            AddCaseLog(CurrentUser, action.FlowCase, CaseLogType.AppStepApproved);

            var secretary = action.Step.WF_Secretary.Where(p => p.StatusId > 0).ToArray();

            if (secretary?.Length > 0)
            {
                if (secretary.Any(p => CurrentUser.EqualsIgnoreCase(p.UserId)))
                {
                    WF_CaseNotifications notification = NotificationManager.CreateNotification(flowCaseId,
                                                                                               action.UserAction.FlowStepId, null, NotificationTypes.SecretaryNotification);
                    foreach (var rule in secretary)
                    {
                        if (CurrentUser.EqualsIgnoreCase(rule.UserId))
                        {
                            NotificationManager.PushNotification(notification, rule.SecretaryId,
                                                                 NotificationSources.Secretary);
                        }
                    }
                }
            }

            bool isCurrentStepApproved = action.Group.ConditionId == Consts.ConditionAny;

            if (!isCurrentStepApproved)
            {
                var otherSteps =
                    Entities.WF_FlowSteps.Where(
                        p =>
                        p.StepGroupId == action.Group.StepGroupId &&
                        p.FlowStepId != action.UserAction.FlowStepId && p.StatusId > 0);
                isCurrentStepApproved = !otherSteps.Any();
                if (!isCurrentStepApproved)
                {
                    isCurrentStepApproved =
                        otherSteps.All(
                            p =>
                            Entities.WF_CaseUserActions.Any(
                                q =>
                                q.FlowCaseId == flowCaseId && q.FlowStepId == p.FlowStepId &&
                                q.ActionId == Consts.Approved && q.StatusId > 0));
                }
            }

            //if current is finished
            if (isCurrentStepApproved)
            {
                if (nsd.NextStepGroupId == 0) //All steps finished
                {
                    action.FlowCase.Approved    = DateTime.UtcNow;
                    action.FlowCase.LastUpdated = DateTime.UtcNow;
                    WF_CaseNotifications notification = NotificationManager.CreateNotification(flowCaseId,
                                                                                               action.UserAction.FlowStepId, null, NotificationTypes.AppFinishedApproved);
                    NotificationManager.PushNotification(notification, action.FlowCase.UserNo,
                                                         NotificationSources.ApproverApproved);
                    NotificationManager.PushNotification(notification, CurrentUser,
                                                         NotificationSources.ApproverApproved, n => n.IsDissmissed = 1);
                    AddNotificationToPrevApprovers(flowCaseId, action.UserAction.FlowStepId, notification);
                    AddFinalUserNotifications(flowCaseId, notification);
                    AddCoverPersonNotifications(flowCaseId, flowCaseId, notification);
                    AddLastStepNotifyUserNotifications(action.FlowCase.FlowId, notification, propertyValues, action.FlowCase.UserNo);
                    //获取当前flowcase的templateid
                    var flowCase =
                        Entities.WF_FlowCases.FirstOrDefault(fc => fc.FlowCaseId == flowCaseId);
                    int?groupId  = flowCase?.WF_Flows.FlowGroupId;
                    var flowType = Entities.WF_FlowGroups.Where(p => p.FlowGroupId == groupId)
                                   .Select(p => p.WF_FlowTypes)
                                   .FirstOrDefault();
                    int?templateId = flowType?.TemplateType;
                    if (templateId.HasValue)
                    {
                        //如果是overseas trip application则在最后的审核者审核以后自动创建一个overseas claim application
                        if (templateId.Value == (int)FlowTemplateType.OverSeasTripTemplate)
                        {
                            Applicant          applicant = new Applicant(Entities, flowCase.UserNo);
                            CreateFlowCaseInfo info      = new CreateFlowCaseInfo();
                            var userInfo = SearStaffInfo(applicant.CurrentUser);
                            //var user = Entities.Users.FirstOrDefault(p => p.UserNo == applicant.CurrentUser);
                            //info.Dep = user?.DeptCode;
                            info.Dep     = userInfo?.Department;
                            info.Subject = PresetValues.OverseasClaimSubjectPrefix + " " + userInfo.StaffName;
                            PropertyInfo[] infos    = new PropertyInfo[6];
                            var            flowtype =
                                Entities.WF_FlowTypes.FirstOrDefault(
                                    ft => ft.TemplateType == (int)FlowTemplateType.OverSeasClaimTemplate && ft.StatusId > 0);
                            if (flowtype != null)
                            {
                                var claimGroup =
                                    Entities.WF_FlowGroups.FirstOrDefault(
                                        fg => fg.StatusId > 0 && fg.FlowTypeId == flowtype.FlowTypeId);

                                var flow =
                                    Entities.WF_Flows.FirstOrDefault(
                                        f => f.FlowGroupId == claimGroup.FlowGroupId && f.StatusId > 0);

                                if (claimGroup != null && flow != null)
                                {
                                    int i = 0;
                                    foreach (var propertyValue in propertyValues)
                                    {
                                        string code   = GetPropertyCode(propertyValue);
                                        int    codeId = GetOverseasClaimCodeId(code);
                                        if (codeId > 0)
                                        {
                                            int          propertyId = GetPropertyId(claimGroup.FlowGroupId, codeId);
                                            PropertyInfo newInfo    = new PropertyInfo();
                                            newInfo.Value = propertyValue.Value;
                                            newInfo.Type  = propertyValue.Type;
                                            newInfo.Id    = propertyId;
                                            infos[i]      = newInfo;
                                            i++;
                                        }
                                    }
                                    info.Properties = infos;
                                    info.FlowId     = flow.FlowId;
                                    applicant.SaveDraft(info);
                                }
                            }
                        }
                        else if (templateId.Value == (int)FlowTemplateType.LeaveTemplate)
                        {
                            float  hours  = 0f;
                            string reason = null;
                            var    dict   = GetLeaveProperties(flowCaseId);
                            foreach (var propertyValue in propertyValues)
                            {
                                if (dict.ContainsKey("Leave_Type") && propertyValue.Id == dict["Leave_Type"])
                                {
                                    reason = propertyValue.Value;
                                }
                                if (dict.ContainsKey("Total_Hours") && propertyValue.Id == dict["Total_Hours"])
                                {
                                    hours = float.Parse(propertyValue.Value);
                                }
                            }
                            if (hours > 0)
                            {
                                var uInfo = SearStaffInfo(flowCase.UserNo);
                                if (reason.EqualsIgnoreCaseAndBlank(PresetValues.AnnualLeave) && (flowCase.RelatedFlowCaseId == null || flowCase.RelatedFlowCaseId == 0))
                                {
                                    UpdateLeaveBalance(uInfo.Country, flowCase.UserNo, hours / 8);
                                }
                                else if (reason.EqualsIgnoreCaseAndBlank(PresetValues.AnnualLeave) && flowCase.RelatedFlowCaseId != null)
                                {
                                    UpdateLeaveBalance(uInfo.Country, flowCase.UserNo, -hours / 8);
                                }
                            }
                        }
                        //如果是User Data Change form,在通过所有审核后,需要插入或更新一条current的数据到StaffInfo表
                        else if (templateId.Value == (int)FlowTemplateType.UserDataChangeTemplate)
                        {
                            string   eFirstName    = null;
                            string   eLastName     = null;
                            string   lFirstName    = null;
                            string   lLastName     = null;
                            string   address       = null;
                            string   cAddress      = null;
                            string   homeTel       = null;
                            string   mobile        = null;
                            string   bankName      = null;
                            string   bankAccount   = null;
                            string   maritalStatus = null;
                            string   familyMembers = null;
                            string   qualification = null;
                            string   email         = null;
                            DateTime effectiveDate = DateTime.UtcNow;
                            var      dict          = GetPdcProperties(flowCaseId);
                            foreach (var propertyValue in propertyValues)
                            {
                                if (dict.ContainsKey("PDC_EffectiveDateForChanges") && propertyValue.Id == dict["PDC_EffectiveDateForChanges"])
                                {
                                    effectiveDate = DateTime.Parse(propertyValue.Value).ToUniversalTime();
                                    continue;
                                }
                                //var model = JsonConvert.DeserializeObject<dynamic>(propertyValue.Value);
                                //if (model == null)
                                //continue;
                                if (dict.ContainsKey("PDC_EnglishFirstName") && propertyValue.Id == dict["PDC_EnglishFirstName"])
                                {
                                    eFirstName = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_EnglishLastName") && propertyValue.Id == dict["PDC_EnglishLastName"])
                                {
                                    eLastName = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_LocalLanguageFirstName") && propertyValue.Id == dict["PDC_LocalLanguageFirstName"])
                                {
                                    lFirstName = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_LocalLanguageLastName") && propertyValue.Id == dict["PDC_LocalLanguageLastName"])
                                {
                                    lLastName = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_ResidentialAddress") && propertyValue.Id == dict["PDC_ResidentialAddress"])
                                {
                                    address = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_CorrespondenceAddress") && propertyValue.Id == dict["PDC_CorrespondenceAddress"])
                                {
                                    cAddress = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_HomeTelephone") && propertyValue.Id == dict["PDC_HomeTelephone"])
                                {
                                    homeTel = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_MobileTelephone") && propertyValue.Id == dict["PDC_MobileTelephone"])
                                {
                                    mobile = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_BankName") && propertyValue.Id == dict["PDC_BankName"])
                                {
                                    bankName = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_BankAccountNumber") && propertyValue.Id == dict["PDC_BankAccountNumber"])
                                {
                                    bankAccount = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_MaritalStatus") && propertyValue.Id == dict["PDC_MaritalStatus"])
                                {
                                    maritalStatus = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_FamilyMembers") && propertyValue.Id == dict["PDC_FamilyMembers"])
                                {
                                    StringBuilder sb = new StringBuilder();
                                    //#TODO
                                    //foreach (var member in model)
                                    //{
                                    //    sb.Append(member.Value);
                                    //    sb.Append("|");
                                    //}
                                    //sb.Remove(sb.Length - 1, 1);
                                    familyMembers = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_Qualification") && propertyValue.Id == dict["PDC_Qualification"])
                                {
                                    StringBuilder sb = new StringBuilder();
                                    //#TODO
                                    //foreach (var qual in model)
                                    //{
                                    //    sb.Append(qual.Value);
                                    //    sb.Append("|");
                                    //}
                                    //sb.Remove(sb.Length - 1, 1);
                                    qualification = propertyValue.Value;
                                }
                                else if (dict.ContainsKey("PDC_EmailAddress") && propertyValue.Id == dict["PDC_EmailAddress"])
                                {
                                    email = propertyValue.Value;
                                }
                            }
                            var staffInfo =
                                Entities.StaffInfo.FirstOrDefault(
                                    si => si.StaffId.Equals(flowCase.UserNo) && si.StatusId > 0);
                            if (staffInfo != null)
                            {
                                if (eFirstName != null)
                                {
                                    staffInfo.EnglishFirstName = eFirstName;
                                }
                                if (eLastName != null)
                                {
                                    staffInfo.EnglishLastName = eLastName;
                                }
                                if (lFirstName != null)
                                {
                                    staffInfo.LocalFirstName = lFirstName;
                                }
                                if (lLastName != null)
                                {
                                    staffInfo.LocalLastName = lLastName;
                                }
                                if (address != null)
                                {
                                    staffInfo.ResidentialAddress = address;
                                }
                                if (cAddress != null)
                                {
                                    staffInfo.CorrespondenceAddress = cAddress;
                                }
                                if (homeTel != null)
                                {
                                    staffInfo.HomeTelephone = homeTel;
                                }
                                if (mobile != null)
                                {
                                    staffInfo.MobileTelephone = mobile;
                                }
                                if (bankName != null)
                                {
                                    staffInfo.BankName = bankName;
                                }
                                if (bankAccount != null)
                                {
                                    staffInfo.BankAccountNumber = bankAccount;
                                }
                                if (maritalStatus != null)
                                {
                                    staffInfo.MaritalStatus = maritalStatus;
                                }
                                if (familyMembers != null)
                                {
                                    staffInfo.FamilyMembers = familyMembers;
                                }
                                if (qualification != null)
                                {
                                    staffInfo.Qualification = qualification;
                                }
                                if (effectiveDate != null)
                                {
                                    staffInfo.EffectiveDate = effectiveDate;
                                }
                                staffInfo.LastUpdated = DateTime.UtcNow;
                            }
                            else
                            {
                                Entities.StaffInfo.Add(new StaffInfo
                                {
                                    Created               = DateTime.UtcNow,
                                    LastUpdated           = DateTime.UtcNow,
                                    StatusId              = 1,
                                    StaffId               = flowCase.UserNo,
                                    EnglishFirstName      = eFirstName,
                                    EnglishLastName       = eLastName,
                                    LocalFirstName        = lFirstName,
                                    LocalLastName         = lLastName,
                                    ResidentialAddress    = address,
                                    CorrespondenceAddress = cAddress,
                                    HomeTelephone         = homeTel,
                                    MobileTelephone       = mobile,
                                    BankName              = bankName,
                                    BankAccountNumber     = bankAccount,
                                    MaritalStatus         = maritalStatus,
                                    FamilyMembers         = familyMembers,
                                    Qualification         = qualification,
                                    EmailAddress          = email,
                                    EffectiveDate         = effectiveDate
                                });
                            }
                        }
                    }
                }
                else
                {
                    if (nextApprovers != null)
                    {
                        EmailService.SendWorkFlowEmail(
                            Entities.GlobalUserView.FirstOrDefault(p => p.EmployeeID == CurrentUser)?.EmployeeName,
                            nextApprovers, action.FlowCase.Subject, null);
                        NotificationSender.PushInboxMessages(nextApprovers, flowCaseId);
                        for (int i = 0; i < nsd.NextSteps.Length; i++)
                        {
                            WF_FlowSteps currentStep = nsd.NextSteps[i];
                            string       currentUser = nextApprovers[i];
                            if (currentStep.ApproverType == (int)ApproverType.Person &&
                                currentStep.UserNo.EqualsIgnoreCaseAndBlank(currentUser))
                            {
                                continue;
                            }
                            //string dep #TODO
                            var userInfo = SearStaffInfo(currentUser);
                            Entities.WF_CaseSteps.Add(new WF_CaseSteps
                            {
                                Created    = DateTime.UtcNow,
                                FlowStepId = currentStep.FlowStepId,
                                Department = userInfo?.DepartmentName ?? string.Empty,
                                //Department = Entities.Users.FirstOrDefault(p => p.UserNo == currentUser)?.DeptCode,
                                UserNo      = currentUser,
                                FlowCaseId  = flowCaseId,
                                LastUpdated = DateTime.UtcNow,
                                StatusId    = 1
                            });
                        }
                        for (int i = 0; i < nsd.NextSteps.Length; i++)
                        {
                            AddCaseUserAction(action.FlowCase, nsd.NextSteps[i].FlowStepId, nextApprovers[i]);
                        }
                    }
                }
            }

            if (action.FlowCase.Approved == null)
            {
                WF_CaseNotifications notification = NotificationManager.CreateNotification(flowCaseId,
                                                                                           action.UserAction.FlowStepId, null, NotificationTypes.ApproveApp);
                AddNotificationToStepGroup(action.Group.StepGroupId, notification, propertyValues, action.FlowCase.UserNo);
                NotificationManager.PushNotification(notification, action.FlowCase.UserNo,
                                                     NotificationSources.ApproverApproved);
                NotificationManager.PushNotification(notification, CurrentUser, NotificationSources.ApproverApproved,
                                                     n => n.IsDissmissed = 1);
            }
            else
            {
                try
                {
                    using (WorkFlowApiClient client = new WorkFlowApiClient())
                    {
                        var fileBytes =
                            ApprovedCasePdfExporter.GenerateFlowCase(GetPDFFlowModel(action.FlowCase.FlowCaseId),
                                                                     CurrentUser);
                        var     fileName = $"PDF FORM {action.FlowCase.Subject}-{action.FlowCase.FlowCaseId}.pdf";
                        string  ret      = client.UploadFile(fileName, Convert.ToBase64String(fileBytes));
                        JObject obj      = JObject.Parse(ret);
                        AddCaseAttachment(action.FlowCase,
                                          new Attachment
                        {
                            FileName   = obj["fileName"].ToString(),
                            OriFilName = fileName,
                            FileSize   = fileBytes.Length
                        });
                    }
                }
                catch (Exception ex)
                {
                    Singleton <ILogWritter> .Instance?.WriteLog("generate pdf error", ex.Message, $"flowcaseid: {action.FlowCase.FlowCaseId}");
                }
            }
            action.FlowCase.CurrentStepGroup = action.Group.StepGroupId;

            try
            {
                Entities.SaveChanges();
                //scope.Complete();
            }
            catch (Exception e)
            {
                result.Result = ApproveResult.Error;
                return(result);
            }

            if (action.FlowCase.Approved != null)
            {
                using (WorkFlowApiClient client = new WorkFlowApiClient())
                {
                    client.ArchiveApproved(action.FlowCase.FlowCaseId);
                }
                result.Result = ApproveResult.FlowApproved;
            }
            else
            {
                result.Result = ApproveResult.Approved;
            }
            //}
            AutoApprove(action.FlowCase.FlowCaseId, action.FlowCase.FlowId, propertyValues, action.FlowCase.UserNo, action.Group.StepGroupId);
            var subsequents = GetSubsequentSteps(action.FlowCase.FlowId, propertyValues, action.FlowCase.UserNo,
                                                 action.Group.StepGroupId);

            if (nextApprovers != null && nextApprovers.Length == 1 && subsequents != null && subsequents.Count > 0 && subsequents[0].EmployeeList != null)
            {
                var    firstList         = subsequents[0].EmployeeList[0];
                string autoNextApprover  = firstList[0].UserNo;
                bool   shouldAutoApprove = false;
                foreach (var nextStepData in subsequents)
                {
                    var employee = nextStepData.EmployeeList[0].First();
                    //因为只添加了只有一个审批者的步骤
                    if (nextApprovers.Contains(employee.UserNo))
                    {
                        shouldAutoApprove = true;
                        break;
                    }
                }
                if (shouldAutoApprove)
                {
                    Approver approver = new Approver(Entities, nextApprovers[0]);
                    approver.Approve(flowCaseId, new string[] { autoNextApprover });
                }
            }
            return(result);
        }
コード例 #2
0
        public (CreateFlowResult result, int flowCaseId) CreateFlowCase(CreateFlowCaseInfo info, int version = 0, int?baseId = null)
        {
            NextStepData nsd = GetNextStepApprovers(info.FlowId, info.Properties, CurrentUser);

            if ((nsd.EmployeeList.Count == 0 || nsd.EmployeeList.Count != info.Approver.Length) && nsd.NextSteps != null && nsd.NextSteps.Length > 0)
            {
                return(CreateFlowResult.InvalidSelectedApprovers, 0);
            }
            if (info.Approver != null)
            {
                for (int i = 0; i < info.Approver.Length; i++)
                {
                    string userno = info.Approver[i];
                    if (nsd.EmployeeList[i].All(p => p.UserNo != userno))
                    {
                        return(CreateFlowResult.InvalidSelectedApprovers, 0);
                    }
                }
            }
            //没有step的也允许创建,并且创建的时候设置通过了审核
            WF_FlowCases flowCase = new WF_FlowCases
            {
                Created           = DateTime.UtcNow,
                Deadline          = info.Deadline?.ToUniversalTime(),
                Department        = info.Dep,
                LastUpdated       = DateTime.UtcNow,
                LastChecked       = DateTime.UtcNow,
                FlowId            = info.FlowId,
                Subject           = info.Subject,
                UserNo            = CurrentUser,
                IsDissmissed      = 0,
                IsRead            = 0,
                StatusId          = 1,
                Ver               = version,
                BaseFlowCaseId    = baseId,
                RelatedFlowCaseId = info.RelatedCaseId
            };

            Entities.WF_FlowCases.Add(flowCase);
            AddCaseLog(CurrentUser, flowCase, CaseLogType.AppCreated);
            if (info.Attachments != null)
            {
                foreach (Attachment att in info.Attachments)
                {
                    AddCaseAttachment(flowCase, att);
                }
            }
            AddFlowProperties(flowCase, info.Properties);
            AddCoverDuties(info.CoverDuties, flowCase);
            AddFinalNotifyUser(info.NotifyUsers, flowCase);
            bool hasSteps = true;

            if (nsd.NextSteps != null && nsd.NextSteps.Length > 0)
            {
                for (int i = 0; i < nsd.NextSteps.Length; i++)
                {
                    WF_FlowSteps currentStep = nsd.NextSteps[i];
                    string       currentUser = info.Approver[i];
                    if (currentStep.ApproverType == (int)ApproverType.Person && currentStep.UserNo.EqualsIgnoreCaseAndBlank(currentUser))
                    {
                        continue;
                    }
                    UserStaffInfo userInfo = SearStaffInfo(currentUser);
                    Entities.WF_CaseSteps.Add(new WF_CaseSteps
                    {
                        Created      = DateTime.UtcNow,
                        FlowStepId   = currentStep.FlowStepId,
                        Department   = userInfo?.DepartmentName ?? string.Empty,
                        UserNo       = currentUser,
                        WF_FlowCases = flowCase,
                        LastUpdated  = DateTime.UtcNow,
                        StatusId     = 1
                    });
                }
                for (int i = 0; i < nsd.NextSteps.Length; i++)
                {
                    AddCaseUserAction(flowCase, nsd.NextSteps[i].FlowStepId, info.Approver[i]);
                }
            }
            else
            {
                hasSteps              = false;
                flowCase.Approved     = DateTime.UtcNow;
                flowCase.IsDissmissed = 1;
            }
            if (!hasSteps)
            {
                WF_CaseNotifications notification = NotificationManager.CreateNotification(flowCase, null, null, NotificationTypes.AppFinishedApproved);
                NotificationManager.PushNotification(notification, CurrentUser, NotificationSources.ApproverApproved);
            }
            bool hasNotifyUsers = Entities.WF_ApplicantNotificationUsers.Local.Any();

            if (hasNotifyUsers)
            {
                WF_CaseNotifications applicantNotification = NotificationManager.CreateNotification(flowCase, null, null, NotificationTypes.ApplicantNotification);
                PropertyInfo[]       propertyInfos         = info.Properties
                                                             .Where(p => p.Value != null)
                                                             .ToArray();
                AddApplicantNotification(info.FlowId, applicantNotification, propertyInfos, CurrentUser);
            }

            try
            {
                Entities.SaveChanges();
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                return(CreateFlowResult.InvalidData, 0);
            }

            AutoApprove(flowCase.FlowCaseId, info.FlowId, info.Properties, CurrentUser);
            List <NextStepData> subsequents = GetSubsequentSteps(info.FlowId, info.Properties, CurrentUser);

            if (info.Approver != null && info.Approver.Length == 1 && subsequents != null && subsequents.Count > 0 && subsequents[0].EmployeeList != null)
            {
                Employee[] firstList         = subsequents[0].EmployeeList[0];
                string     autoNextApprover  = firstList[0].UserNo;
                bool       shouldAutoApprove = false;
                foreach (var nextStepData in subsequents)
                {
                    Employee employee = nextStepData.EmployeeList[0].First();
                    //因为只添加了只有一个审批者的步骤
                    if (info.Approver.Contains(employee.UserNo))
                    {
                        shouldAutoApprove = true;
                        break;
                    }
                }
                if (shouldAutoApprove)
                {
                    Approver approver = new Approver(Entities, info.Approver[0]);
                    approver.Approve(flowCase.FlowCaseId, new string[] { autoNextApprover });
                }
            }
            return(CreateFlowResult.Success, flowCase.FlowCaseId);
        }