async void EditItem_Click(object sender, RoutedEventArgs e) { if (StatementsLV.SelectedItem != null) { await EditStatementDialog.Show((Statement)StatementsLV.SelectedItem, false, false, false); } }
async Task <Statement> AddStatement(bool generatedComplexMode, bool generatedTotalMode, bool background = false) { if (!(generatedComplexMode && generatedTotalMode)) { var statement = new Statement(); //Attention 'HERE. It cannot be optimized that way, you thought about. statement.StatementNumber = statement.ID = int.Parse(await NetworkUtils.ExecuteDataAction <Statement>(background ? null : this, statement, DataAction.Save)); statement.IsLocal = false; if (!background) { await EditStatementDialog.Show(statement, true, generatedComplexMode, generatedTotalMode); } return(statement); } else { return(null); } }
async Task GenerateStatement(bool complexMode, bool totalMode, int strangeThreshold) { if (StatementsLV.SelectedItems.Count > 0) { if (StatementsLV.SelectedItems.Count > strangeThreshold || MessageBox.Show($"Имеет ли смысл? Меньше {strangeThreshold + 1} ведомостей.", "Странная операция", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { var statement = await AddStatement(complexMode, totalMode, true); if (statement != null && statement.ID != -1) { Cursor = Cursors.Wait; var data = new List <StatementResult>(); foreach (Statement current in StatementsLV.SelectedItems) { data.AddRange(await NetworkUtils.RequestData <StatementResult>(this, strict: true, orAll: true, preserveContext: true, column: null, whereParams: (name: nameof(StatementResult.StatementID), value: current.ID))); } var distinctor = new DistinctByStudentAndSubject(); //Latest - at the end data.Sort((c1, c2) => c1.StatementResultDate > c2.StatementResultDate ? 1 : c1.StatementResultDate < c2.StatementResultDate ? -1 : 0); //Get empty student-subject intersections, fill with blanks. //Get last student-subject couples, distinct by distinctor(student-subject)-> //set owner as just created statement-> //make 'local' to tell the system to re-create it on server side-> //save on server-> //update data in opened by adding new statement-> var studentIDs = data.Select(c => c.StudentID).Distinct(); var subjectIDs = data.Select(c => c.SubjectID).Distinct(); foreach (var studentID in studentIDs) { foreach (var subjectID in subjectIDs) { if (!data.Any(c => c.StudentID == studentID && c.SubjectID == subjectID)) { await NetworkUtils.ExecuteDataAction <StatementResult>(null, new StatementResult { StatementID = statement.ID, StudentID = studentID, SubjectID = subjectID, MarkValue = (sbyte)TechnicalMarkValue.Blank, StatementResultDate = null, TicketNumber = -1 }, DataAction.Save); } } } foreach (var current in data.Select(c => (studentID: c.StudentID, subjectID: c.SubjectID)) .Select(c => data.LastOrDefault(currentResult => currentResult.StudentID == c.studentID && currentResult.SubjectID == c.subjectID)) .Distinct(distinctor)) { current.StatementID = statement.ID; current.IsLocal = true; await NetworkUtils.ExecuteDataAction <StatementResult>(null, current, DataAction.Save); } Cursor = Cursors.Arrow; await EditStatementDialog.Show(statement, true, complexMode, totalMode); await EditStatementDialog.UpdateData(); } await UpdateData(); } } }