Merge pull request '#12120773 Фиксы в суточных отчётах' (#88) from fix/daily_report into dev

Reviewed-on: http://test.digitaldrilling.ru:8080/DDrilling/AsbCloudServer/pulls/88
This commit is contained in:
Никита Фролов 2023-07-28 11:15:06 +05:00
commit d5953917b0
6 changed files with 57 additions and 57 deletions

View File

@ -1,3 +1,6 @@
using System.Collections;
using System.Collections.Generic;
namespace AsbCloudApp.Data.AutogeneratedDailyReport;
/// <summary>
@ -14,15 +17,15 @@ public class AutoGeneratedDailyReportDto : AutoGeneratedDailyReportInfoDto
/// <summary>
/// Блок подсистем
/// </summary>
public SubsystemRecordDto[] Subsystems { get; set; } = null!;
public IEnumerable<SubsystemRecordDto> Subsystems { get; set; } = null!;
/// <summary>
/// Блок ограничивающих параметров
/// </summary>
public LimitingParameterRecordDto[] LimitingParameters { get; set; } = null!;
public IEnumerable<LimitingParameterRecordDto> LimitingParameters { get; set; } = null!;
/// <summary>
/// Баланс времени
/// </summary>
public TimeBalanceRecordDto[] TimeBalance { get; set; } = null!;
public IEnumerable<TimeBalanceRecordDto> TimeBalance { get; set; } = null!;
}

View File

@ -94,13 +94,13 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService
for (int day = result.Skip; (day - result.Skip) < result.Take && (datesRange.From.AddDays(day)) <= datesRange.To; day++)
{
var dateFrom = datesRange.From.AddDays(day);
var reportDate = DateOnly.FromDateTime(datesRange.From.AddDays(day));
reports.Add(new AutoGeneratedDailyReportDto
reports.Add(new AutoGeneratedDailyReportInfoDto
{
FileName = string.Format(fileNameTemplate, well.Caption, well.Cluster, DateOnly.FromDateTime(dateFrom)),
ReportDate = DateOnly.FromDateTime(dateFrom),
FileSize = GetFileSize() / 1024,
FileName = string.Format(fileNameTemplate, well.Caption, well.Cluster, reportDate),
ReportDate = reportDate,
FileSize = GetFileSize(reportDate, idWell),
});
}
@ -121,15 +121,15 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService
if (!well.IdTelemetry.HasValue)
throw new ArgumentInvalidException("Телеметрия для скважины отсутствует", nameof(idWell));
var factOperations = (await GetFactOperationsAsync(well.Id, startDate, finishDate,
cancellationToken)).ToArray();
var factOperations = await GetFactOperationsAsync(well.Id, startDate, finishDate,
cancellationToken);
var report = new AutoGeneratedDailyReportDto
{
FileName = string.Format(fileNameTemplate, well.Caption, well.Cluster, reportDate),
FileSize = GetFileSize() / 1024,
FileSize = GetFileSize(reportDate, idWell),
ReportDate = reportDate,
Head = CreateHeadBlock(well, reportDate, factOperations),
Head = CreateHeadBlock(well, factOperations),
Subsystems = (await CreateSubsystemBlockAsync(idWell, startDate, finishDate, cancellationToken)).ToArray(),
LimitingParameters = (await CreateLimitingParameterBlockAsync(idWell, startDate, finishDate, cancellationToken)).ToArray(),
TimeBalance = factOperations.GroupBy(w => w.CategoryName).Select(x => new TimeBalanceRecordDto
@ -144,18 +144,19 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService
return (report.FileName, stream);
}
private HeadBlockDto CreateHeadBlock(WellDto well, DateOnly reportDate, WellOperationDto[] factOperations)
private HeadBlockDto CreateHeadBlock(WellDto well, IEnumerable<WellOperationDto> factOperations)
{
var customer = well.Companies.FirstOrDefault(company => company.IdCompanyType == 1);
var sortedFactOperations = factOperations.OrderBy(o => o.DateStart);
return new HeadBlockDto
return new HeadBlockDto
{
Customer = customer?.Caption ?? string.Empty,
Deposit = well.Deposit ?? string.Empty,
Cluster = well.Cluster ?? string.Empty,
Well = well.Caption,
DepthFrom = factOperations.FirstOrDefault()?.DepthStart ?? 0.00,
DepthTo = factOperations.LastOrDefault()?.DepthEnd ?? 0.00
DepthFrom = sortedFactOperations.FirstOrDefault()?.DepthStart ?? 0.00,
DepthTo = sortedFactOperations.LastOrDefault()?.DepthEnd ?? 0.00
};
}
@ -188,12 +189,12 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService
startDate, finishDate, cancellationToken)).ToArray();
var sumDepths = limitingParameterStats.Sum(x => x.Depth);
return limitingParameterStats.Select(l => new LimitingParameterRecordDto
{
NameFeedRegulator = l.NameFeedRegulator,
Hours = l.TotalMinutes,
PercentDepth = l.Depth / sumDepths,
PercentDepth = sumDepths != 0 ? l.Depth / sumDepths : 0,
Depth = l.Depth,
});
}
@ -239,10 +240,11 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService
return limitingParameterService.GetStatAsync(request, cancellationToken);
}
private int GetFileSize()
private int GetFileSize(DateOnly reportDate, int idWell)
{
const int fileSizeTemplate = 10240;
// TODO: Добавку размера сделать более предсказуемой на основе даты рапорта. что то типа `(Date.Ticks * idWell) % (fileSizeTemplate / 10)`
return new Random().Next(1, 8193) + fileSizeTemplate;
long ticks = 1L * reportDate.Year * reportDate.Month * reportDate.Day * idWell;
int remainder = (int)(ticks % (fileSizeTemplate / 10));
return fileSizeTemplate + remainder;
}
}

View File

@ -15,17 +15,14 @@ public class LimitingParameterExcelBlockWriter : IExcelBlockWriter
public void Write(IXLWorksheet sheet, AutoGeneratedDailyReportDto report)
{
if(!report.LimitingParameters.Any())
return;
for (int i = 0; i < report.LimitingParameters.Length; i++)
var i = 1;
foreach (var limitingParameter in report.LimitingParameters)
{
var row = sheet.Row(1 + i + rowHeaderBlock);
row.Cell(columnNameFeedRegulator).Value = report.LimitingParameters[i].NameFeedRegulator;
row.Cell(columnDepth).Value = report.LimitingParameters[i].Depth;
row.Cell(columnTotalHours).Value = report.LimitingParameters[i].Hours;
row.Cell(columnPercentDepth).Value = report.LimitingParameters[i].PercentDepth;
var row = sheet.Row( i++ + rowHeaderBlock);
row.Cell(columnNameFeedRegulator).Value = limitingParameter.NameFeedRegulator;
row.Cell(columnDepth).Value = limitingParameter.Depth;
row.Cell(columnTotalHours).Value = limitingParameter.Hours;
row.Cell(columnPercentDepth).Value = limitingParameter.PercentDepth;
}
}
}

View File

@ -15,17 +15,14 @@ public class SubsystemExcelBlockWriter : IExcelBlockWriter
public void Write(IXLWorksheet sheet, AutoGeneratedDailyReportDto report)
{
if(!report.Subsystems.Any())
return;
for (int i = 0; i < report.Subsystems.Length; i++)
var i = 1;
foreach( var subsystem in report.Subsystems )
{
var row = sheet.Row(1 + i + rowHeaderBlock);
row.Cell(columnName).Value = report.Subsystems[i].Name;
row.Cell(columnKUsage).Value = report.Subsystems[i].KUsage;
row.Cell(columnDepth).Value = report.Subsystems[i].Depth;
row.Cell(columnUsedTimeHours).Value = report.Subsystems[i].UsedTimeHours;
var row = sheet.Row(i++ + rowHeaderBlock);
row.Cell(columnName).Value = subsystem.Name;
row.Cell(columnKUsage).Value = subsystem.KUsage;
row.Cell(columnDepth).Value = subsystem.Depth;
row.Cell(columnUsedTimeHours).Value = subsystem.UsedTimeHours;
}
}
}

View File

@ -13,22 +13,18 @@ public class TimeBalanceExcelBlockWriter : IExcelBlockWriter
public void Write(IXLWorksheet sheet, AutoGeneratedDailyReportDto report)
{
if(!report.TimeBalance.Any())
return;
for (int i = 0; i < report.TimeBalance.Length; i++)
var i = 1;
foreach(var timeBalance in report.TimeBalance)
{
var row = sheet.Row(1 + i + rowHeaderBlock);
row.Cell(columnName).Value = report.TimeBalance[i].Name;
row.Cell(columnDurationHours).Value = report.TimeBalance[i].DurationHours;
AddBorderToCell(row.Cell(columnName));
AddBorderToCell(row.Cell(columnDurationHours));
var row = sheet.Row(i++ + rowHeaderBlock);
row.Cell(columnName).Value = timeBalance.Name;
row.Cell(columnDurationHours).Value = timeBalance.DurationHours;
AddBorderToCell(row.Cell(columnName));
AddBorderToCell(row.Cell(columnDurationHours));
}
}
private void AddBorderToCell(IXLCell cell)
private static void AddBorderToCell(IXLCell cell)
{
cell.Style.Border.TopBorder = XLBorderStyleValues.Thin;
cell.Style.Border.BottomBorder = XLBorderStyleValues.Thin;

View File

@ -43,10 +43,15 @@ namespace AsbCloudInfrastructure.Services
List<LimitingParameterDto> result = new List<LimitingParameterDto>(data.Count());
foreach (var item in data)
{
var trimData = TrimLimitingParameters(item, request);
var allItemDepths = trimData.Sum(x => x.DepthEnd - x.DepthStart);
var allItemDates = trimData.Sum(x => (x.DateEnd - x.DateStart).TotalMinutes);
var trimData = TrimLimitingParameters(item, request).ToArray();
//TODO: временный фикс, нужно избежать отрицательных значений в ограничивающих параметрах.
//Проблема возникает при при формировании LimitingParameter в LimitingParameterCalcWorkFactory.
//Начальная глубина ограничивающего параметра не может быть больше конечной.
var allItemDepths = trimData.Where(x => x.DepthStart < x.DepthEnd)
.Sum(x => x.DepthEnd - x.DepthStart);
var allItemDates = trimData.Where(x => x.DepthStart < x.DepthEnd)
.Sum(x => (x.DateEnd - x.DateStart).TotalMinutes);
result.Add(new LimitingParameterDto
{