private DateTime GetNextComplianceDate(MaintenanceCheckComplianceGroup complianceGroup) { if ((complianceGroup.GetMaxIntervalCheck()) == null) { return(DateTimeExtend.GetCASMinDateTime()); } complianceGroup.Sort(); DateTime nextDate = DateTimeExtend.GetCASMinDateTime(); if (complianceGroup.Grouping) { MaintenanceCheck lastOrMinCheck = complianceGroup.GetLastComplianceChecks().FirstOrDefault() != null ? complianceGroup.GetLastComplianceChecks().First() : complianceGroup.GetMinIntervalCheck(); if (lastOrMinCheck.Interval.Days != null && lastOrMinCheck.Interval.Days > 0) { nextDate = lastOrMinCheck.NextPerformances.Count != 0 && lastOrMinCheck.NextPerformances[0].PerformanceDate != null ? lastOrMinCheck.NextPerformances[0].PerformanceDate.Value : lastOrMinCheck.LastPerformance != null ? lastOrMinCheck.LastPerformance.RecordDate.AddDays(Convert.ToInt32(lastOrMinCheck.Interval.Days)) : lastOrMinCheck.ParentAircraft.ManufactureDate.AddDays(Convert.ToInt32(lastOrMinCheck.Interval.Days)); } else { nextDate = lastOrMinCheck.NextPerformances.Count != 0 && lastOrMinCheck.NextPerformances[0].PerformanceDate != null ? lastOrMinCheck.NextPerformances[0].PerformanceDate.Value : DateTimeExtend.GetCASMinDateTime(); } } else { foreach (MaintenanceCheck maintenanceCheck in complianceGroup.Checks) { if (maintenanceCheck.Interval.Days != null && maintenanceCheck.Interval.Days > 0) { nextDate = maintenanceCheck.NextPerformances.Count != 0 && maintenanceCheck.NextPerformances[0].PerformanceDate != null ? maintenanceCheck.NextPerformances[0].PerformanceDate.Value : maintenanceCheck.LastPerformance != null ? maintenanceCheck.LastPerformance.RecordDate.AddDays(Convert.ToInt32(maintenanceCheck.Interval.Days)) : maintenanceCheck.ParentAircraft.ManufactureDate.AddDays(Convert.ToInt32(maintenanceCheck.Interval.Days)); } else { nextDate = maintenanceCheck.NextPerformanceDate != null ? maintenanceCheck.NextPerformanceDate.Value : DateTimeExtend.GetCASMinDateTime(); } } } return(nextDate); }
private void FindLastCheck() { MaintenanceCheckGroupCollection[] groupByType = CheckItems.GroupingCheckByType(Schedule) .OrderByDescending(g => g.GetLastComplianceDate()) .ToArray(); MaintenanceCheckGroupCollection checkGroupCollectionOrdered = new MaintenanceCheckGroupCollection(groupByType.SelectMany(gbt => gbt.ToArray()) .OrderByDescending(gbt => gbt.LastComplianceGroupDate)); foreach (MaintenanceCheckGroupByType checkGroupByType in checkGroupCollectionOrdered) { string lastCheck = "", lastComplianceDate = "", lastComplianceLl = ""; DateTime last = DateTimeExtend.GetCASMinDateTime(); if (checkGroupByType.Grouping) { //Вычисление последней даты выполнения чеков данного типа //A, B или C foreach (MaintenanceCheck checkItem in checkGroupByType.Checks.Where(c => c.Schedule == Schedule)) { if (checkItem.LastPerformance != null && last < checkItem.LastPerformance.RecordDate) { last = checkItem.LastPerformance.RecordDate; } } //Если чеки с данным типом (A, B или C) еще не выполнялись //то производится переход на след. тип. чека if (last <= DateTimeExtend.GetCASMinDateTime() || last <= checkGroupCollectionOrdered.GetLastComplianceDateOfCheckWithHigherType(checkGroupByType.Schedule, checkGroupByType.Resource, checkGroupByType.Grouping, checkGroupByType.CheckType)) { continue; } //lastGroupComplianceDates[checkGroupByType.Resource] = last; //Если чеки с данным типом выполнялись //то собирается група из чеков данного типа (A, B или C), //чья дата выполнения равна найденой MaintenanceCheckComplianceGroup lastComplianceGroup = new MaintenanceCheckComplianceGroup(Schedule); foreach (MaintenanceCheck checkItem in checkGroupByType.Checks.Where(c => c.Schedule == Schedule)) { if (checkItem.LastPerformance != null && last == checkItem.LastPerformance.RecordDate) { lastComplianceGroup.Checks.Add(checkItem); if (lastComplianceGroup.CheckCycle < checkGroupByType.CheckCycle) { lastComplianceGroup.CheckCycle = checkGroupByType.CheckCycle; } if (lastComplianceGroup.GroupComplianceNum < checkItem.LastPerformance.NumGroup) { lastComplianceGroup.GroupComplianceNum = checkItem.LastPerformance.NumGroup; } } } MaintenanceCheck maxIntervalCheckInGroup; //Поиск старшего чека данного типа в собранной группе //Если его нет, переход к след. типу чеков if ((maxIntervalCheckInGroup = lastComplianceGroup.GetMaxIntervalCheck()) == null) { continue; } //Упорядочивание собранной группы lastComplianceGroup.Sort(); string prefix = lastComplianceGroup.GetComplianceGroupName(); lastComplianceDate = UsefulMethods.NormalizeDate(last); lastComplianceLl = maxIntervalCheckInGroup.LastPerformance.OnLifelength.ToString(); //название чеков lastCheck = prefix; if (maxIntervalCheckInGroup.ParentAircraft != null && maxIntervalCheckInGroup.ParentAircraft.MSG < MSG.MSG3) { lastCheck += " ("; lastCheck += lastComplianceGroup.Checks.Aggregate(lastCheck, (current, maintenanceCheck) => current + (maintenanceCheck.Name + " ")); lastCheck += ") "; } Action <string, string, string> addLast = AddLastCheckItem; if (InvokeRequired) { Invoke(addLast, lastCheck, lastComplianceDate, lastComplianceLl); } else { addLast.Invoke(lastCheck, lastComplianceDate, lastComplianceLl); } } else { foreach (MaintenanceCheck checkItem in checkGroupByType.Checks.Where(c => c.Schedule == Schedule)) { if (checkItem.LastPerformance != null) { lastComplianceDate = UsefulMethods.NormalizeDate(checkItem.LastPerformance.RecordDate); lastComplianceLl = checkItem.LastPerformance.OnLifelength.ToString(); //название чеков lastCheck = checkItem.Name; } Action <string, string, string> addLast = AddLastCheckItem; if (InvokeRequired) { Invoke(addLast, lastCheck, lastComplianceDate, lastComplianceLl); } else { addLast.Invoke(lastCheck, lastComplianceDate, lastComplianceLl); } } } } }
private void GenerateRows() { listViewProgramChecks.Items.Clear(); if (_grouping) { MaintenanceCheckCollection mcc = new MaintenanceCheckCollection(_maintenanceCheckItems); MaintenanceCheck mc = mcc.GetMinStepCheck(_maintenanceCheckItems[0].Schedule); if (mc == null) { return; } MSG msg = mc.ParentAircraft != null && mc.ParentAircraft.MaintenanceProgramChangeRecords.Count > 0 ? mc.ParentAircraft.MaintenanceProgramChangeRecords.GetLast().MSG : MSG.MSG2; if (msg < MSG.MSG3) { MaintenanceCheckComplianceGroup mccg = mcc.GetLastComplianceCheckGroup(mc.Schedule, mc.ParentAircraftId, mc.Grouping, mc.Resource); int lastPerformanceGroupNum = mccg != null ? mccg.LastComplianceGroupNum : 0; int countMinStepInMinCheck = Convert.ToInt32(mc.Interval.GetSubresource(mc.Resource)) / _minCheckResource; foreach (MaintenanceCheck t in _maintenanceCheckItems) { ListViewItem listViewItem = new ListViewItem { Text = t.Name }; listViewItem.SubItems.Add(t.Interval.ToRepeatIntervalsFormat()); listViewItem.SubItems.Add(t.Cost.ToString()); listViewItem.SubItems.Add(t.ManHours.ToString()); for (int j = 1; j <= _countColumns; j++) { MaintenanceNextPerformance mnp = t.GetPergormanceGroupByGroupNum(lastPerformanceGroupNum + j * countMinStepInMinCheck); listViewItem.SubItems.Add(mnp != null ? "X" : ""); } listViewProgramChecks.Items.Add(listViewItem); } } else { MaintenanceCheckComplianceGroup mccg = mcc.GetLastComplianceCheckGroup(mc.Schedule, mc.ParentAircraftId, mc.Grouping, mc.Resource); int lastPerformanceGroupNum = mccg != null ? mccg.LastComplianceGroupNum : 0; int countMinStepInMinCheck = Convert.ToInt32(mc.Interval.GetSubresource(mc.Resource)) / _minCheckResource; foreach (MaintenanceCheck t in _maintenanceCheckItems) { ListViewItem listViewItem = new ListViewItem { Text = t.Name }; listViewItem.SubItems.Add(t.Interval.ToRepeatIntervalsFormat()); listViewItem.SubItems.Add(t.Cost.ToString()); listViewItem.SubItems.Add(t.ManHours.ToString()); for (int j = 1; j <= _countColumns; j++) { MaintenanceNextPerformance mnp = t.GetPergormanceGroupWhereCheckIsSeniorByGroupNum(lastPerformanceGroupNum + j * countMinStepInMinCheck); listViewItem.SubItems.Add(mnp != null ? "X" : ""); } listViewProgramChecks.Items.Add(listViewItem); } } mcc.Clear(); } else { foreach (MaintenanceCheck t in _maintenanceCheckItems) { ListViewItem listViewItem = new ListViewItem { Text = t.Name }; listViewItem.SubItems.Add(t.Interval.ToRepeatIntervalsFormat()); listViewItem.SubItems.Add(t.Cost.ToString()); listViewItem.SubItems.Add(t.ManHours.ToString()); Lifelength lastPerformance = t.LastPerformance != null ? new Lifelength(t.LastPerformance.OnLifelength) : Lifelength.Null; int?last = lastPerformance.GetSubresource(_subResource); listViewItem.SubItems.Add(last != null ? lastPerformance.ToString(_subResource, true) : ""); if (t.Schedule == _schedule) { Lifelength nextPerformance = lastPerformance + t.Interval; int? next = nextPerformance.GetSubresource(_subResource); listViewItem.SubItems.Add(next != null ? nextPerformance.ToString(_subResource, true) : ""); } else { listViewItem.SubItems.Add("N/A"); } listViewProgramChecks.Items.Add(listViewItem); } } }
/// <summary> /// Добавляется элемент в таблицу данных /// </summary> /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param> private void AddStatusToDataset(MaintenanceStatusDataSet destinationDataSet) { if (_reportedAircraft == null) { return; } MaintenanceCheckComplianceGroup lastComplianceGroup = _reportedDirectives.GetLastComplianceCheckGroup(_filterSelection, _reportedAircraft.ItemId); MaintenanceCheckGroupByType nextComplianceGroup = GlobalObjects.MaintenanceCheckCalculator.GetNextCheckComplianceGroup(_reportedDirectives, _filterSelection, _reportedAircraft); MaintenanceCheck minStepCheck = _reportedDirectives != null ? _reportedDirectives.GetMinStepCheck(_filterSelection) : null; Lifelength reportAircraftLifeLenght = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_reportedBaseComponent); Lifelength minStep = minStepCheck != null ? minStepCheck.Interval : Lifelength.Null; Lifelength used = new Lifelength(reportAircraftLifeLenght); Lifelength remain = Lifelength.Null; string lastComplianceDate = "", lastComplianceHours = "", lastComplianceCycles = ""; string nextComplianceDate = "", nextComplianceHours = "", nextComplianceCycles = ""; string remarks = ""; if (lastComplianceGroup != null) { lastComplianceDate = lastComplianceGroup.LastGroupComplianceDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString()); lastComplianceCycles = lastComplianceGroup.LastGroupComplianceLifelength.Cycles != null ? lastComplianceGroup.LastGroupComplianceLifelength.Cycles.ToString() : ""; lastComplianceHours = lastComplianceGroup.LastGroupComplianceLifelength.Hours != null ? lastComplianceGroup.LastGroupComplianceLifelength.Hours.ToString() : ""; used.Substract(lastComplianceGroup.LastGroupComplianceLifelength); remarks = lastComplianceGroup.Remarks; } if (nextComplianceGroup != null) { nextComplianceDate = nextComplianceGroup.GroupComplianceDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString()); nextComplianceCycles = nextComplianceGroup.GroupComplianceLifelength.Cycles != null ? nextComplianceGroup.GroupComplianceLifelength.Cycles.ToString() : ""; nextComplianceHours = nextComplianceGroup.GroupComplianceLifelength.Hours != null ? nextComplianceGroup.GroupComplianceLifelength.Hours.ToString() : ""; remain.Add(nextComplianceGroup.GroupComplianceLifelength); remain.Substract(reportAircraftLifeLenght); } string usedHours = used.Hours != null?used.Hours.ToString() : ""; string usedCycles = used.Cycles != null?used.Cycles.ToString() : ""; string usedDays = used.Days != null?used.Days.ToString() : ""; string remainHours = remain.Hours != null?remain.Hours.ToString() : ""; string remainCycles = remain.Cycles != null?remain.Cycles.ToString() : ""; string remainDays = remain.Days != null?remain.Days.ToString() : ""; destinationDataSet.StatusTable.AddStatusTableRow(_filterSelection ? "Schedule" : "Unschedule", lastComplianceGroup != null ? lastComplianceGroup.ToStringCheckNames() : "", nextComplianceGroup != null ? nextComplianceGroup.ToStringCheckNames() : "", minStep.Hours != null ? minStep.Hours.ToString() : "", minStep.Cycles != null ? minStep.Cycles.ToString() : "", minStep.Days != null ? minStep.Days.ToString() : "", lastComplianceDate, lastComplianceHours, lastComplianceCycles, usedDays, usedHours, usedCycles, nextComplianceDate, nextComplianceHours, nextComplianceCycles, remainDays, remainHours, remainCycles, remarks); }
/// <summary> /// Выставляет колонки в списке чеков текущей программы обслуживания /// </summary> private void SetHeaders() { _min = Convert.ToInt32(_maintenanceCheckItems[0].Interval.GetSubresource(_subResource)); foreach (MaintenanceCheck liminationItem in _maintenanceCheckItems) { _min = Math.Min(Convert.ToInt32(liminationItem.Interval.GetSubresource(_subResource)), _min); _max = Math.Max(Convert.ToInt32(liminationItem.Interval.GetSubresource(_subResource)), _max); } ColumnHeader column = new ColumnHeader { Text = "Name", TextAlign = HorizontalAlignment.Right, Width = 50 }; listViewProgramChecks.Columns.Add(column); column = new ColumnHeader { Text = "Interval", TextAlign = HorizontalAlignment.Left, Width = 130 }; listViewProgramChecks.Columns.Add(column); column = new ColumnHeader { Text = "Cost", TextAlign = HorizontalAlignment.Left, Width = 50 }; listViewProgramChecks.Columns.Add(column); column = new ColumnHeader { Text = "ManHours", TextAlign = HorizontalAlignment.Left, Width = 64 }; listViewProgramChecks.Columns.Add(column); if (_grouping) { //Определение кол-ва колонок списка if (_upperCheckTypeMinResource == -1) { //Если это самая вышестоящий тип чеков //то делится максимальный на минимальный интервал _countColumns = _max / _min; } else { //Если это самая НЕ вышестоящий тип чеков //то делится минимальный ресурс вышестоящего типа на минимальный интервал _countColumns = _upperCheckTypeMinResource / _min; } MaintenanceCheckCollection mcc = new MaintenanceCheckCollection(_maintenanceCheckItems); MaintenanceCheck mc = mcc.GetMinStepCheck(_maintenanceCheckItems[0].Schedule); if (mc == null) { return; } MSG msg = mc.ParentAircraft != null && mc.ParentAircraft.MaintenanceProgramChangeRecords.Count > 0 ? mc.ParentAircraft.MaintenanceProgramChangeRecords.GetLast().MSG : MSG.MSG2; if (msg < MSG.MSG3) { for (int i = 1; i <= _countColumns; i++) { //ColumnHeader viewColumn = new ColumnHeader // { // Text = i + " [" + (i*_min) + "]", // TextAlign = HorizontalAlignment.Center, // Width = 65 // // }; //listViewProgramChecks.Columns.Add(viewColumn); ColumnHeader viewColumn; //выполняется проверка, достаточно ли расчитано "след.выполнений" //что бы заполнить их данными названия колонок if (mc.NextPerformances.Count >= i) { //Если кол-во расчитанных выполнений достаточно для заполнения //названия тек. колонки, то название колонки берется из ресурса "след. выполнения" int performanceSource = Convert.ToInt32(mc.NextPerformances[i - 1].PerformanceSource.GetSubresource(mc.Resource)); MaintenanceNextPerformance mnp = mc.NextPerformances[i - 1] as MaintenanceNextPerformance; if (mnp != null) { string checkName = mnp.PerformanceGroup != null?mnp.PerformanceGroup.GetGroupName() : i.ToString(); viewColumn = new ColumnHeader { Text = checkName + " [" + performanceSource + "]", TextAlign = HorizontalAlignment.Center, Width = 85 }; } else { viewColumn = new ColumnHeader { Text = i + " [" + performanceSource + "]", TextAlign = HorizontalAlignment.Center, Width = 85 }; } } else { //Если кол-во расчитанных выполнений недостаточно //то название колонки расчитывается на освоне ресурса последнего выполнения //данного чека и номера тек. колонки viewColumn = new ColumnHeader { Text = i + " [" + (i * _min) + "]", TextAlign = HorizontalAlignment.Center, Width = 85 }; } listViewProgramChecks.Columns.Add(viewColumn); } } else { MaintenanceCheckComplianceGroup mccg = mcc.GetLastComplianceCheckGroup(mc.Schedule, mc.ParentAircraftId, mc.Grouping, mc.Resource); if (mccg == null) { for (int i = 1; i <= _countColumns; i++) { MaintenanceNextPerformance mnp = mc.NextPerformances[i - 1] as MaintenanceNextPerformance; string checkName = mnp != null && mnp.PerformanceGroup != null ? mnp.PerformanceGroup.GetGroupName() : ""; ColumnHeader viewColumn = new ColumnHeader { Text = checkName + " [" + (i * _min) + "]", TextAlign = HorizontalAlignment.Center, Width = 65 }; listViewProgramChecks.Columns.Add(viewColumn); } } else { MaintenanceCheck mic = mccg.GetMinIntervalCheck(); for (int i = 1; i <= _countColumns; i++) { ColumnHeader viewColumn; //выполняется проверка, достаточно ли расчитано "след.выполнений" //что бы заполнить их данными названия колонок if (mic.NextPerformances.Count >= i) { //Если кол-во расчитанных выполнений достаточно для заполнения //названия тек. колонки, то название колонки берется из ресурса "след. выполнения" MaintenanceNextPerformance mnp = mc.NextPerformances[i - 1] as MaintenanceNextPerformance; string checkName = mnp != null && mnp.PerformanceGroup != null ? mnp.PerformanceGroup.GetGroupName() : ""; int performanceSource = Convert.ToInt32(mic.NextPerformances[i - 1].PerformanceSource.GetSubresource(mic.Resource)); viewColumn = new ColumnHeader { Text = checkName + " [" + performanceSource + "]", TextAlign = HorizontalAlignment.Center, Width = 85 }; } else { //Если кол-во расчитанных выполнений недостаточно //то название колонки расчитывается на освоне ресурса последнего выполнения //данного чека и номера тек. колонки int lastPerformaceSource = Convert.ToInt32(mic.LastPerformance.CalculatedPerformanceSource.GetSubresource(mic.Resource)); if (lastPerformaceSource == 0) { lastPerformaceSource = Convert.ToInt32(mic.LastPerformance.OnLifelength.GetSubresource(mic.Resource)); } viewColumn = new ColumnHeader { Text = " [" + (lastPerformaceSource + i * _min) + "]", TextAlign = HorizontalAlignment.Center, Width = 85 }; } listViewProgramChecks.Columns.Add(viewColumn); } } } mcc.Clear(); } else { _countColumns = 2; //Если чеки НЕ группируются по части порогового значения //то выводится ресурс пред. и след. выполнения column = new ColumnHeader { Text = "Last", TextAlign = HorizontalAlignment.Left, Width = 100 }; listViewProgramChecks.Columns.Add(column); column = new ColumnHeader { Text = "Next", TextAlign = HorizontalAlignment.Left, Width = 100 }; listViewProgramChecks.Columns.Add(column); } }