public async Task <VerifyRecordResult> UpdateAsync(FlowMasterAdapterModel paraObject)
        {
            try
            {
                FlowMaster itemData = Mapper.Map <FlowMaster>(paraObject);
                CleanTrackingHelper.Clean <FlowMaster>(context);
                FlowMaster item = await context.FlowMaster
                                  .AsNoTracking()
                                  .FirstOrDefaultAsync(x => x.Id == paraObject.Id);

                if (item == null)
                {
                    return(VerifyRecordResultFactory.Build(false, ErrorMessageEnum.無法修改紀錄));
                }
                else
                {
                    CleanTrackingHelper.Clean <FlowMaster>(context);
                    context.Entry(itemData).State = EntityState.Modified;
                    await context.SaveChangesAsync();

                    CleanTrackingHelper.Clean <FlowMaster>(context);
                    return(VerifyRecordResultFactory.Build(true));
                }
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, "修改記錄發生例外異常");
                return(VerifyRecordResultFactory.Build(false, "修改記錄發生例外異常", ex));
            }
        }
示例#2
0
        public async Task DenyAsync(FlowMasterAdapterModel flowMasterAdapterModel)
        {
            OnShowApproveOpinionDialog();
            await Task.Yield();

            FlowMasterAdapterModel = flowMasterAdapterModel;
            FlowActionEnum         = FlowActionEnum.Deny;
        }
示例#3
0
        public bool CheckFlowAction(FlowMasterAdapterModel flowMasterAdapterModel)
        {
            var result = Task.Run <bool>(async() =>
            {
                var result = await CurrentService.CheckUserShowActionAsync(flowMasterAdapterModel, CurrentUser);
                return(result);
            }).Result;

            return(result);
        }
        async Task OhterDependencyData(FlowMasterAdapterModel data)
        {
            data.MyUserName       = data.MyUser.Name;
            data.PolicyHeaderName = data.PolicyHeader.Name;
            data.GetFlowName();
            data.GetSourceTypeName();
            await Task.Yield();

            return;
        }
        GetUsersDataByActionAsync(FlowMasterAdapterModel flowMasterAdapterModel, CurrentUser currentUser)
        {
            var user = await UserHelper.GetCurrentUserByShowFlowActionAsync(currentUser);

            var flowUsers = await context.FlowUser
                            .Include(x => x.MyUser)
                            .OrderBy(x => x.Level)
                            .Where(x => x.FlowMasterId == flowMasterAdapterModel.Id)
                            .ToListAsync();

            return(flowUsers, user);
        }
 public static FlowMasterAdapterModel GetSourceTypeName(this FlowMasterAdapterModel flowMasterAdapterModel)
 {
     if (flowMasterAdapterModel.SourceType == FlowSourceTypeEnum.None)
     {
         flowMasterAdapterModel.SourceTypeName = "無";
     }
     else if (flowMasterAdapterModel.SourceType == FlowSourceTypeEnum.WorkOrder)
     {
         flowMasterAdapterModel.SourceTypeName = "工作單";
     }
     return(flowMasterAdapterModel);
 }
        public async Task <VerifyRecordResult> BeforeDeleteCheckAsync(FlowMasterAdapterModel paraObject)
        {
            try
            {
                CleanTrackingHelper.Clean <FlowMaster>(context);
                CleanTrackingHelper.Clean <FlowInbox>(context);
                CleanTrackingHelper.Clean <FlowHistory>(context);
                CleanTrackingHelper.Clean <FlowUser>(context);

                var searchItem = await context.FlowMaster
                                 .AsNoTracking()
                                 .FirstOrDefaultAsync(x => x.Id == paraObject.Id);

                if (searchItem == null)
                {
                    return(VerifyRecordResultFactory.Build(false, "無法刪除紀錄,要刪除的紀錄已經不存在資料庫上"));
                }

                var searchFlowInboxItem = await context.FlowInbox
                                          .AsNoTracking()
                                          .FirstOrDefaultAsync(x => x.FlowMasterId == paraObject.Id);

                if (searchFlowInboxItem != null)
                {
                    return(VerifyRecordResultFactory.Build(false, "該筆紀錄還有 收件匣 資料表紀錄參考使用,無法刪除"));
                }

                var searchFlowHistoryItem = await context.FlowHistory
                                            .AsNoTracking()
                                            .FirstOrDefaultAsync(x => x.FlowMasterId == paraObject.Id);

                if (searchFlowHistoryItem != null)
                {
                    return(VerifyRecordResultFactory.Build(false, "該筆紀錄還有 簽核歷程 資料表紀錄參考使用,無法刪除"));
                }

                var searchFlowUserItem = await context.FlowUser
                                         .AsNoTracking()
                                         .FirstOrDefaultAsync(x => x.FlowMasterId == paraObject.Id);

                if (searchFlowUserItem != null)
                {
                    return(VerifyRecordResultFactory.Build(false, "該筆紀錄還有 參與簽核使用者 資料表紀錄參考使用,無法刪除"));
                }

                return(VerifyRecordResultFactory.Build(true));
            }
            catch (Exception ex)
            {
                return(VerifyRecordResultFactory.Build(false, "刪除記錄發生例外異常", ex));
            }
        }
        public async Task <FlowMasterAdapterModel> GetAsync(int id)
        {
            FlowMaster item = await context.FlowMaster
                              .Include(x => x.MyUser)
                              .Include(x => x.PolicyHeader)
                              .AsNoTracking()
                              .FirstOrDefaultAsync(x => x.Id == id);

            FlowMasterAdapterModel result = Mapper.Map <FlowMasterAdapterModel>(item);

            await OhterDependencyData(result);

            return(result);
        }
 public async Task NotifyInboxUsers(List <FlowUser> flowUsers,
                                    FlowMasterAdapterModel flowMasterAdapterModel, int level)
 {
     #region 產生收件匣紀錄
     var nextFlowUser = flowUsers
                        .Where(x => x.Level == level);
     foreach (var item in nextFlowUser)
     {
         var notifyUser = Mapper.Map <MyUserAdapterModel>(item.MyUser);
         var isCC       = item.OnlyCC;
         await AddInboxRecord(flowMasterAdapterModel, notifyUser, isCC);
     }
     #endregion
 }
        public async Task <VerifyRecordResult> BeforeAddCheckAsync(FlowMasterAdapterModel paraObject)
        {
            await Task.Yield();

            if (paraObject.MyUserId == 0)
            {
                return(VerifyRecordResultFactory.Build(false, "需要指定一個使用者"));
            }
            if (paraObject.PolicyHeaderId == 0)
            {
                return(VerifyRecordResultFactory.Build(false, "需要指定一個簽核政策"));
            }

            return(VerifyRecordResultFactory.Build(true));
        }
        public void FindNextActionUser(List <FlowUser> flowUsers, FlowMasterAdapterModel flowMasterAdapterModel)
        {
            var flowUserNexts = flowUsers.Where(x => x.Level == flowMasterAdapterModel.ProcessLevel &&
                                                x.OnlyCC == false && x.Completion == false).ToList();

            if (flowUserNexts.Count() == 0)
            {
                flowMasterAdapterModel.NextMyUserName = "";
            }
            else
            {
                flowMasterAdapterModel.NextMyUserName = flowUserNexts.Last().MyUser.Name;
            }
            return;
        }
        public async Task DenyAsync(FlowMasterAdapterModel flowMasterAdapterModel,
                                    ApproveOpinionModel approveOpinionModel)
        {
            CleanTrackingHelper.Clean <FlowMaster>(context);
            CleanTrackingHelper.Clean <FlowUser>(context);
            CleanTrackingHelper.Clean <FlowHistory>(context);
            CleanTrackingHelper.Clean <MyUser>(context);

            (var flowUsers, var user) = await GetUsersDataAsync(flowMasterAdapterModel);

            if (CheckCurrentActionUser(flowUsers, user, flowMasterAdapterModel) == false)
            {
                return;
            }

            RecoveryCompletion(flowUsers, flowMasterAdapterModel.ProcessLevel);

            flowMasterAdapterModel.ProcessLevel--;
            RecoveryCompletion(flowUsers, flowMasterAdapterModel.ProcessLevel);
            CopyUserAutoCompletion(flowUsers, flowMasterAdapterModel.ProcessLevel);

            if (flowMasterAdapterModel.ProcessLevel > 0)
            {
            }
            else
            {
                flowMasterAdapterModel.Status = 0;
            }

            FindNextActionUser(flowUsers, flowMasterAdapterModel);

            await context.BulkUpdateAsync(flowUsers);

            await UpdateAsync(flowMasterAdapterModel);

            await AddHistoryRecord(user, flowMasterAdapterModel,
                                   $"{approveOpinionModel.Summary}", $"{approveOpinionModel.Comment}", false);

            #region 產生收件匣紀錄
            await NotifyInboxUsers(flowUsers, flowMasterAdapterModel, flowMasterAdapterModel.ProcessLevel);

            #endregion

            CleanTrackingHelper.Clean <FlowMaster>(context);
            CleanTrackingHelper.Clean <FlowUser>(context);
            CleanTrackingHelper.Clean <FlowHistory>(context);
            CleanTrackingHelper.Clean <MyUser>(context);
        }
        public async Task AddHistoryRecord(MyUserAdapterModel myUserAdapterModel,
                                           FlowMasterAdapterModel flowMasterAdapterModel, string Summary, string Comment,
                                           bool approve)
        {
            FlowHistory history = new FlowHistory()
            {
                Comment      = Comment,
                Summary      = Summary,
                Updatetime   = DateTime.Now,
                FlowMasterId = flowMasterAdapterModel.Id,
                MyUserId     = myUserAdapterModel.Id,
                Approve      = approve,
            };
            await context.FlowHistory.AddAsync(history);

            await context.SaveChangesAsync();
        }
        public async Task <FlowMasterAdapterModel> GetAsync(string code)
        {
            FlowMaster item = await context.FlowMaster
                              .Include(x => x.MyUser)
                              .Include(x => x.PolicyHeader)
                              .AsNoTracking()
                              .FirstOrDefaultAsync(x => x.Code == code);

            if (item == null)
            {
                return(null);
            }
            FlowMasterAdapterModel result = Mapper.Map <FlowMasterAdapterModel>(item);

            await OhterDependencyData(result);

            return(result);
        }
        public async Task <bool> CheckUserShowActionAsync(FlowMasterAdapterModel flowMasterAdapterModel,
                                                          CurrentUser currentUser)
        {
            CleanTrackingHelper.Clean <FlowMaster>(context);
            CleanTrackingHelper.Clean <FlowUser>(context);
            CleanTrackingHelper.Clean <FlowHistory>(context);
            CleanTrackingHelper.Clean <MyUser>(context);

            (var flowUsers, var user) = await GetUsersDataByActionAsync(flowMasterAdapterModel, currentUser);

            flowMasterAdapterModel.UserShowAction = CheckCurrentActionUser(flowUsers, user, flowMasterAdapterModel);

            CleanTrackingHelper.Clean <FlowMaster>(context);
            CleanTrackingHelper.Clean <FlowUser>(context);
            CleanTrackingHelper.Clean <FlowHistory>(context);
            CleanTrackingHelper.Clean <MyUser>(context);

            return(flowMasterAdapterModel.UserShowAction);
        }
        public async Task BackToSendAsync(FlowMasterAdapterModel flowMasterAdapterModel,
                                          ApproveOpinionModel approveOpinionModel)
        {
            CleanTrackingHelper.Clean <FlowMaster>(context);
            CleanTrackingHelper.Clean <FlowUser>(context);
            CleanTrackingHelper.Clean <FlowHistory>(context);
            CleanTrackingHelper.Clean <MyUser>(context);

            (var flowUsers, var user) = await GetUsersDataAsync(flowMasterAdapterModel);

            if (CheckCurrentActionUser(flowUsers, user, flowMasterAdapterModel) == false)
            {
                return;
            }

            foreach (var item in flowUsers)
            {
                item.Completion = false;
            }
            flowMasterAdapterModel.ProcessLevel = 0;
            flowMasterAdapterModel.Status       = 0;

            FindNextActionUser(flowUsers, flowMasterAdapterModel);

            await context.BulkUpdateAsync(flowUsers);

            await UpdateAsync(flowMasterAdapterModel);

            await AddHistoryRecord(user, flowMasterAdapterModel,
                                   $"{approveOpinionModel.Summary}", $"{approveOpinionModel.Comment}", false);

            #region 產生收件匣紀錄
            await NotifyInboxUsers(flowUsers, flowMasterAdapterModel, flowMasterAdapterModel.ProcessLevel);

            #endregion

            CleanTrackingHelper.Clean <FlowMaster>(context);
            CleanTrackingHelper.Clean <FlowUser>(context);
            CleanTrackingHelper.Clean <FlowHistory>(context);
            CleanTrackingHelper.Clean <MyUser>(context);
        }
        public async Task SendAsync(FlowMasterAdapterModel flowMasterAdapterModel,
                                    ApproveOpinionModel approveOpinionModel)
        {
            CleanTrackingHelper.Clean <FlowMaster>(context);
            CleanTrackingHelper.Clean <FlowUser>(context);
            CleanTrackingHelper.Clean <FlowHistory>(context);
            CleanTrackingHelper.Clean <MyUser>(context);
            (var flowUsers, var user) = await GetUsersDataAsync(flowMasterAdapterModel);

            if (user.Id != flowMasterAdapterModel.MyUserId)
            {
                return;
            }

            var flowUser = flowUsers.FirstOrDefault(x => x.Level == 0);

            flowUser.Completion = true;
            flowMasterAdapterModel.ProcessLevel = 1;
            flowMasterAdapterModel.Status       = 1;

            CopyUserAutoCompletion(flowUsers, flowMasterAdapterModel.ProcessLevel);

            FindNextActionUser(flowUsers, flowMasterAdapterModel);

            await context.BulkUpdateAsync(flowUsers);

            await UpdateAsync(flowMasterAdapterModel);

            await AddHistoryRecord(user, flowMasterAdapterModel,
                                   $"{approveOpinionModel.Summary}", $"{approveOpinionModel.Comment}", true);

            #region 產生收件匣紀錄
            await NotifyInboxUsers(flowUsers, flowMasterAdapterModel, flowMasterAdapterModel.ProcessLevel);

            #endregion

            CleanTrackingHelper.Clean <FlowMaster>(context);
            CleanTrackingHelper.Clean <FlowUser>(context);
            CleanTrackingHelper.Clean <FlowHistory>(context);
            CleanTrackingHelper.Clean <MyUser>(context);
        }
        public async Task AddInboxRecord(FlowMasterAdapterModel paraObject,
                                         MyUserAdapterModel myUser, bool isCC)
        {
            string CCMessage = isCC ? "[知會]" : "";

            CleanTrackingHelper.Clean <FlowInbox>(context);
            FlowInbox inbox = new FlowInbox()
            {
                FlowMasterId = paraObject.Id,
                MyUserId     = myUser.Id,
                IsRead       = false,
                ReceiveTime  = DateTime.Now,
                Title        = $"{CCMessage} {paraObject.Title}",
                Body         = paraObject.Content,
            };
            await context.FlowInbox.AddAsync(inbox);

            await context.SaveChangesAsync();

            CleanTrackingHelper.Clean <FlowInbox>(context);
        }
        /// <summary>
        /// 轉換狀態碼成為說明文字
        /// </summary>
        /// <param name="flowMasterAdapterModel"></param>
        /// <returns></returns>
        public static FlowMasterAdapterModel GetFlowName(this FlowMasterAdapterModel flowMasterAdapterModel)
        {
            switch (flowMasterAdapterModel.Status)
            {
            case 0:
                flowMasterAdapterModel.StatusName = "草稿";
                break;

            case 1:
                flowMasterAdapterModel.StatusName = "送審";
                break;

            case 99:
                flowMasterAdapterModel.StatusName = "完成";
                break;

            default:
                flowMasterAdapterModel.StatusName = "???";
                break;
            }
            return(flowMasterAdapterModel);
        }
        public async Task OnWorkOrderSendingDialogCompletion(ApproveOpinionModel e)
        {
            if (e != null)
            {
                #region 產生一筆稽核送審記錄
                var user = await CurrentUserHelper.GetCurrentUserAsync();

                var code = UniqueStringHelper.GetCode();
                FlowMasterAdapterModel flowMasterAdapterModel = new FlowMasterAdapterModel()
                {
                    Code           = code,
                    MyUserId       = user.Id,
                    PolicyHeaderId = e.PolicyHeaderAdapterModel.Id,
                    CreateDate     = DateTime.Now,
                    ProcessLevel   = 0,
                    Title          = $"工單完工 - {CurrentRecord.Description}",
                    Content        = "",
                    Status         = 0,
                    SourceType     = FlowSourceTypeEnum.WorkOrder,
                    SourceJson     = JsonConvert.SerializeObject(CurrentRecord),
                    SourceCode     = CurrentRecord.Code,
                };

                flowMasterAdapterModel.UpdateAt = DateTime.Now;
                await FlowMasterService.AddAsync(flowMasterAdapterModel);

                flowMasterAdapterModel = await FlowMasterService.GetAsync(code);

                await FlowMasterService.SendAsync(flowMasterAdapterModel, e);

                CurrentRecord.Status = MagicHelper.WorkOrderStatus送審;
                await CurrentService.UpdateAsync(CurrentRecord);

                this.dataGrid.RefreshGrid();
                #endregion
            }
            ShowWorkOrderSendingDialog = false;
        }
        public async Task <VerifyRecordResult> BeforeUpdateCheckAsync(FlowMasterAdapterModel paraObject)
        {
            CleanTrackingHelper.Clean <FlowMaster>(context);
            if (paraObject.MyUserId == 0)
            {
                return(VerifyRecordResultFactory.Build(false, "需要指定一個使用者"));
            }
            if (paraObject.PolicyHeaderId == 0)
            {
                return(VerifyRecordResultFactory.Build(false, "需要指定一個簽核政策"));
            }

            var searchItem = await context.FlowMaster
                             .AsNoTracking()
                             .FirstOrDefaultAsync(x => x.Id == paraObject.Id);

            if (searchItem == null)
            {
                return(VerifyRecordResultFactory.Build(false, ErrorMessageEnum.要更新的紀錄_發生同時存取衝突_已經不存在資料庫上));
            }

            return(VerifyRecordResultFactory.Build(true));
        }
        public bool CheckCurrentActionUser(List <FlowUser> flowUsers,
                                           MyUserAdapterModel myUserAdapterModel, FlowMasterAdapterModel flowMasterAdapterModel)
        {
            var flowUserCurrent = flowUsers.Where(x => x.Level == flowMasterAdapterModel.ProcessLevel &&
                                                  x.OnlyCC == false && x.Completion == false).ToList();

            if (flowUserCurrent.Count() == 0)
            {
                return(false);;
            }
            else
            {
                var findUser = flowUserCurrent.FirstOrDefault(x => x.MyUserId == myUserAdapterModel.Id);
                if (findUser == null)
                {
                    return(false);
                }
                else
                {
                    return(true);
                }
            }
        }
示例#23
0
        public async Task ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args)
        {
            if (args.Item.Id == ButtonIdHelper.ButtonIdAdd)
            {
                CurrentRecord = new FlowMasterAdapterModel();
                #region 針對新增的紀錄所要做的初始值設定商業邏輯
                #endregion
                EditRecordDialogTitle = "新增紀錄";
                IsNewRecordMode       = true;
                IsShowEditRecord      = true;
                var user = await CurrentUserHelper.GetCurrentUserAsync();

                CurrentRecord.MyUserId     = user.Id;
                CurrentRecord.MyUserName   = user.Name;
                CurrentRecord.Status       = 0;
                CurrentRecord.ProcessLevel = 0;
                CurrentRecord.Code         = UniqueStringHelper.GetCode();
                CurrentRecord.CreateDate   = DateTime.Now;
            }
            else if (args.Item.Id == ButtonIdHelper.ButtonIdRefresh)
            {
                dataGrid.RefreshGrid();
            }
        }
        public async Task <VerifyRecordResult> AddAsync(FlowMasterAdapterModel paraObject)
        {
            try
            {
                CleanTrackingHelper.Clean <FlowMaster>(context);
                CleanTrackingHelper.Clean <FlowUser>(context);
                CleanTrackingHelper.Clean <FlowHistory>(context);
                CleanTrackingHelper.Clean <MyUser>(context);
                FlowMaster itemParameter = Mapper.Map <FlowMaster>(paraObject);
                CleanTrackingHelper.Clean <FlowMaster>(context);
                await context.FlowMaster
                .AddAsync(itemParameter);

                await context.SaveChangesAsync();

                #region 產生要審核的使用者清單
                var user = await context.MyUser
                           .FirstOrDefaultAsync(x => x.Id == itemParameter.MyUserId);

                FlowUser auditUser = new FlowUser()
                {
                    MyUserId     = itemParameter.MyUserId,
                    FlowMasterId = itemParameter.Id,
                    Enable       = true,
                    Level        = 0,
                    OnlyCC       = false,
                    Name         = "發文者",
                };
                await context.FlowUser.AddAsync(auditUser);

                var policyDetails = await context.PolicyDetail
                                    .Where(x => x.PolicyHeaderId == paraObject.PolicyHeaderId)
                                    .OrderBy(x => x.Level)
                                    .ToListAsync();

                foreach (var item in policyDetails)
                {
                    if (item.Enable == false)
                    {
                        continue;
                    }
                    auditUser = new FlowUser()
                    {
                        MyUserId     = item.MyUserId,
                        FlowMasterId = itemParameter.Id,
                        Enable       = true,
                        Level        = item.Level,
                        OnlyCC       = item.OnlyCC,
                        Name         = item.Name,
                    };
                    await context.FlowUser.AddAsync(auditUser);
                }

                itemParameter.NextMyUserName = user.Name;
                context.FlowMaster.Update(itemParameter);
                await context.SaveChangesAsync();

                #endregion

                #region 增加簽核流程歷史紀錄 - 建立簽核表單
                FlowHistory history = new FlowHistory()
                {
                    FlowMasterId = itemParameter.Id,
                    MyUserId     = itemParameter.MyUserId,
                    Approve      = true,
                    Summary      = $"{user.Account} / {user.Name} 建立簽核表單",
                    Comment      = $"簽核單草稿",
                    Updatetime   = DateTime.Now,
                };
                await context.FlowHistory.AddAsync(history);

                await context.SaveChangesAsync();

                #endregion

                CleanTrackingHelper.Clean <FlowMaster>(context);
                CleanTrackingHelper.Clean <FlowUser>(context);
                CleanTrackingHelper.Clean <FlowHistory>(context);
                CleanTrackingHelper.Clean <MyUser>(context);
                return(VerifyRecordResultFactory.Build(true));
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, "新增記錄發生例外異常");
                return(VerifyRecordResultFactory.Build(false, "新增記錄發生例外異常", ex));
            }
        }
示例#25
0
        public async Task OnCommandClicked(CommandClickEventArgs <FlowMasterAdapterModel> args)
        {
            FlowMasterAdapterModel item = args.RowData as FlowMasterAdapterModel;

            if (args.CommandColumn.ButtonOption.IconCss == ButtonIdHelper.ButtonIdEdit)
            {
                #region 點選 修改紀錄 按鈕
                CurrentRecord         = item.Clone();
                EditRecordDialogTitle = "修改紀錄";
                IsShowEditRecord      = true;
                IsNewRecordMode       = false;
                #endregion
            }
            else if (args.CommandColumn.ButtonOption.IconCss == ButtonIdHelper.ButtonIdDelete)
            {
                #region 點選 刪除紀錄 按鈕
                CurrentNeedDeleteRecord = item;

                #region 檢查關聯資料是否存在
                var checkedResult = await CurrentService
                                    .BeforeDeleteCheckAsync(CurrentNeedDeleteRecord);

                await Task.Delay(100);

                thisView.NeedRefresh();
                if (checkedResult.Success == false)
                {
                    var checkTask1 = ConfirmMessageBox.ShowAsync("400px", "200px", "警告",
                                                                 $"你確定真的要刪除與這筆紀錄相關紀錄嗎?例如:收件匣、簽呈使用者、簽成歷史紀錄 ({checkedResult.Message})",
                                                                 ConfirmMessageBox.HiddenAsync);
                    thisView.NeedRefresh();
                    var checkAgain1 = await checkTask1;
                    if (checkAgain1 == true)
                    {
                        var verifyRecordResult = await CurrentService.DeleteAsync(CurrentNeedDeleteRecord.Id);

                        await TranscationResultHelper.CheckDatabaseResult(MessageBox, verifyRecordResult);

                        dataGrid.RefreshGrid();
                    }
                    await Task.Yield();

                    thisView.NeedRefresh();
                    return;
                }
                #endregion

                #region 刪除這筆紀錄
                await Task.Yield();

                var checkTask = ConfirmMessageBox.ShowAsync("400px", "200px", "警告",
                                                            "確認要刪除這筆紀錄嗎?", ConfirmMessageBox.HiddenAsync);
                thisView.NeedRefresh();
                var checkAgain = await checkTask;
                if (checkAgain == true)
                {
                    var verifyRecordResult = await CurrentService.DeleteAsync(CurrentNeedDeleteRecord.Id);

                    await TranscationResultHelper.CheckDatabaseResult(MessageBox, verifyRecordResult);

                    dataGrid.RefreshGrid();
                }
                #endregion
                #endregion
            }
            else if (args.CommandColumn.ButtonOption.IconCss == ButtonIdHelper.ButtonIdShowFlowUser)
            {
                #region 點選 稽核使用者 對話窗 按鈕
                IsShowFlowUserRecord             = true;
                ShowMoreDetailsRecordDialogTitle = MagicHelper.簽核使用者明細;
                MasterRecord masterRecord = new MasterRecord()
                {
                    Id = item.Id
                };
                Header = masterRecord;
                if (ShowFlowUserGrid != null)
                {
                    await Task.Delay(100); // 使用延遲,讓 Header 的資料綁定可以成功

                    ShowFlowUserGrid.RefreshGrid();
                }
                #endregion
            }
            else if (args.CommandColumn.ButtonOption.IconCss == ButtonIdHelper.ButtonIdShowFlowHistory)
            {
                #region 點選 開啟多筆 CRUD 對話窗 按鈕
                IsShowFlowHistoryRecord          = true;
                ShowMoreDetailsRecordDialogTitle = MagicHelper.簽核歷史紀錄;
                MasterRecord masterRecord = new MasterRecord()
                {
                    Id = item.Id
                };
                Header = masterRecord;
                if (ShowFlowHistoryGrid != null)
                {
                    await Task.Delay(100); // 使用延遲,讓 Header 的資料綁定可以成功

                    ShowFlowHistoryGrid.RefreshGrid();
                }
                #endregion
            }
        }
        public async Task AgreeAsync(FlowMasterAdapterModel flowMasterAdapterModel,
                                     ApproveOpinionModel approveOpinionModel)
        {
            CleanTrackingHelper.Clean <FlowMaster>(context);
            CleanTrackingHelper.Clean <FlowUser>(context);
            CleanTrackingHelper.Clean <FlowHistory>(context);
            CleanTrackingHelper.Clean <WorkOrder>(context);
            CleanTrackingHelper.Clean <MyUser>(context);

            var thisLevel = flowMasterAdapterModel.ProcessLevel;

            (var flowUsers, var user) = await GetUsersDataAsync(flowMasterAdapterModel);

            if (CheckCurrentActionUser(flowUsers, user, flowMasterAdapterModel) == false)
            {
                return;
            }

            var flowUserCurrentLevel = flowUsers.Where(x => x.Level == flowMasterAdapterModel.ProcessLevel).ToList();
            var currentUser          = flowUserCurrentLevel.FirstOrDefault(x => x.MyUserId == user.Id);

            if (currentUser != null)
            {
                currentUser.Completion = true;
            }
            var remindUsers = flowUsers
                              .Where(x => x.Level == flowMasterAdapterModel.ProcessLevel &&
                                     x.Completion == false).ToList();
            bool allProcessing = (remindUsers.Count() > 0) ? false : true;

            if (allProcessing)
            {
                #region 是否是最後一關關卡
                var lastLevel = flowUsers.OrderByDescending(x => x.Level)
                                .FirstOrDefault();
                if (flowMasterAdapterModel.ProcessLevel == lastLevel.Level)
                {
                    flowMasterAdapterModel.Status = 99;
                    flowMasterAdapterModel.ProcessLevel++;
                    #region 若不是直接申請,則需要同步更新來源紀錄的狀態碼
                    if (flowMasterAdapterModel.SourceType == FlowSourceTypeEnum.WorkOrder)
                    {
                        if (string.IsNullOrEmpty(flowMasterAdapterModel.SourceCode) == false)
                        {
                            var workOrder = await context.WorkOrder
                                            .AsNoTracking()
                                            .FirstOrDefaultAsync(x => x.Code == flowMasterAdapterModel.SourceCode);

                            if (workOrder != null)
                            {
                                workOrder.Status = MagicHelper.WorkOrderStatus結案;
                                context.Update(workOrder);
                                await context.SaveChangesAsync();
                            }
                        }
                    }
                    #endregion
                }
                else
                {
                    #region 還有關卡要繼續審核
                    flowMasterAdapterModel.Status = 1;
                    flowMasterAdapterModel.ProcessLevel++;

                    CopyUserAutoCompletion(flowUsers, flowMasterAdapterModel.ProcessLevel);
                    #endregion
                }
                #endregion
            }

            FindNextActionUser(flowUsers, flowMasterAdapterModel);

            await context.BulkUpdateAsync(flowUsers);
            await UpdateAsync(flowMasterAdapterModel);

            await AddHistoryRecord(user, flowMasterAdapterModel,
                                   $"{approveOpinionModel.Summary}", $"{approveOpinionModel.Comment}", true);

            if (thisLevel != flowMasterAdapterModel.ProcessLevel &&
                flowMasterAdapterModel.Status != 99)
            {
                #region 產生收件匣紀錄
                await NotifyInboxUsers(flowUsers, flowMasterAdapterModel, flowMasterAdapterModel.ProcessLevel);

                #endregion
            }

            CleanTrackingHelper.Clean <FlowMaster>(context);
            CleanTrackingHelper.Clean <FlowUser>(context);
            CleanTrackingHelper.Clean <WorkOrder>(context);
            CleanTrackingHelper.Clean <FlowHistory>(context);
            CleanTrackingHelper.Clean <MyUser>(context);
        }