forked from ddrilling/AsbCloudServer
Merge pull request 'fix/wellOperation-date-time-offset' (#191) from fix/wellOperation-date-time-offset into dev
Reviewed-on: http://test.digitaldrilling.ru:8080/DDrilling/AsbCloudServer/pulls/191
This commit is contained in:
commit
f07924160e
@ -1,5 +1,5 @@
|
|||||||
using AsbCloudApp.Validation;
|
using System;
|
||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
namespace AsbCloudApp.Data
|
namespace AsbCloudApp.Data
|
||||||
@ -7,9 +7,10 @@ namespace AsbCloudApp.Data
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Операции на скважине (заведенные пользователем)
|
/// Операции на скважине (заведенные пользователем)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class WellOperationDto : ItemInfoDto, IId, IWellRelated
|
public class WellOperationDto : ItemInfoDto, IId, IWellRelated, IValidatableObject
|
||||||
{
|
{
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
|
[Required]
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@ -64,34 +65,39 @@ namespace AsbCloudApp.Data
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Глубина на начало операции, м
|
/// Глубина на начало операции, м
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Required]
|
||||||
[Range(0, 50_000)]
|
[Range(0, 50_000)]
|
||||||
public double DepthStart { get; set; }
|
public double DepthStart { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Глубина после завершения операции, м
|
/// Глубина после завершения операции, м
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Required]
|
||||||
[Range(0, 50_000)]
|
[Range(0, 50_000)]
|
||||||
public double DepthEnd { get; set; }
|
public double DepthEnd { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Кол-во дней от даты начала первой плановой (а если её нет, то фактической) операции
|
/// Кол-во дней от даты начала первой плановой (а если её нет, то фактической) операции
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Required]
|
||||||
public double Day { get; set; }
|
public double Day { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Кол-во часов НПВ от даты начала первой плановой (а если её нет, то фактической) операции
|
/// Кол-во часов НПВ от даты начала первой плановой (а если её нет, то фактической) операции
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Required]
|
||||||
public double NptHours { get; set; }
|
public double NptHours { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Дата начала операции
|
/// Дата начала операции
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DateValidation(GtDate = "2010-01-01T00:00:00")]
|
[Required]
|
||||||
public DateTime DateStart { get; set; }
|
public DateTimeOffset DateStart { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Продолжительность, часы
|
/// Продолжительность, часы
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Required]
|
||||||
[Range(0, 50)]
|
[Range(0, 50)]
|
||||||
public double DurationHours { get; set; }
|
public double DurationHours { get; set; }
|
||||||
|
|
||||||
@ -100,5 +106,24 @@ namespace AsbCloudApp.Data
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[StringLength(4096, ErrorMessage = "Комментарий не может быть длиннее 4096 символов")]
|
[StringLength(4096, ErrorMessage = "Комментарий не может быть длиннее 4096 символов")]
|
||||||
public string? Comment { get; set; }
|
public string? Comment { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Валидация даты
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="validationContext"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||||
|
{
|
||||||
|
if (!(DateStart is DateTimeOffset dateTimeOffset))
|
||||||
|
yield return new ValidationResult(
|
||||||
|
$"{nameof(DateStart)}: дата DateStart указана не в формате DateTimeOffset",
|
||||||
|
new[] { nameof(DateStart) });
|
||||||
|
|
||||||
|
var gtDate = new DateTimeOffset(2010, 1, 1, 0, 0, 0, TimeSpan.Zero);
|
||||||
|
if (DateStart <= gtDate)
|
||||||
|
yield return new ValidationResult(
|
||||||
|
$"{nameof(DateStart)}: DateStart не может быть меньше {gtDate}",
|
||||||
|
new[] { nameof(DateStart) });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -347,7 +347,7 @@ public class WellOperationRepository : IWellOperationRepository
|
|||||||
{
|
{
|
||||||
var entity = dto.Adapt<WellOperation>();
|
var entity = dto.Adapt<WellOperation>();
|
||||||
entity.Id = default;
|
entity.Id = default;
|
||||||
entity.DateStart = dto.DateStart.ToUtcDateTimeOffset(timezone.Hours);
|
entity.DateStart = dto.DateStart.ToUniversalTime();
|
||||||
entity.IdWell = idWell;
|
entity.IdWell = idWell;
|
||||||
db.WellOperations.Add(entity);
|
db.WellOperations.Add(entity);
|
||||||
}
|
}
|
||||||
@ -365,7 +365,7 @@ public class WellOperationRepository : IWellOperationRepository
|
|||||||
{
|
{
|
||||||
var timezone = wellService.GetTimezone(dto.IdWell);
|
var timezone = wellService.GetTimezone(dto.IdWell);
|
||||||
var entity = dto.Adapt<WellOperation>();
|
var entity = dto.Adapt<WellOperation>();
|
||||||
entity.DateStart = dto.DateStart.ToUtcDateTimeOffset(timezone.Hours);
|
entity.DateStart = dto.DateStart.ToUniversalTime();
|
||||||
db.WellOperations.Update(entity);
|
db.WellOperations.Update(entity);
|
||||||
|
|
||||||
var result = await db.SaveChangesAsync(token);
|
var result = await db.SaveChangesAsync(token);
|
||||||
@ -449,7 +449,6 @@ public class WellOperationRepository : IWellOperationRepository
|
|||||||
|
|
||||||
CategoryName = o.OperationCategory.Name,
|
CategoryName = o.OperationCategory.Name,
|
||||||
WellSectionTypeName = o.WellSectionType.Caption,
|
WellSectionTypeName = o.WellSectionType.Caption,
|
||||||
|
|
||||||
DateStart = DateTime.SpecifyKind(o.DateStart.UtcDateTime + timeZoneOffset, DateTimeKind.Unspecified),
|
DateStart = DateTime.SpecifyKind(o.DateStart.UtcDateTime + timeZoneOffset, DateTimeKind.Unspecified),
|
||||||
DepthStart = o.DepthStart,
|
DepthStart = o.DepthStart,
|
||||||
DepthEnd = o.DepthEnd,
|
DepthEnd = o.DepthEnd,
|
||||||
|
@ -140,7 +140,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService
|
|||||||
.Select(t => t.Fact!)
|
.Select(t => t.Fact!)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
DateTime lastFactDate = default;
|
DateTimeOffset lastFactDate = default;
|
||||||
var lastFactI = 0;
|
var lastFactI = 0;
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -290,7 +290,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService
|
|||||||
|
|
||||||
static DateTime GetEndDate(WellOperationDto operation)
|
static DateTime GetEndDate(WellOperationDto operation)
|
||||||
=> operation is not null
|
=> operation is not null
|
||||||
? operation.DateStart.AddHours(operation.DurationHours)
|
? operation.DateStart.Date.AddHours(operation.DurationHours)
|
||||||
: default;
|
: default;
|
||||||
|
|
||||||
var endDatePlan = planLast is not null ? GetEndDate(planLast) : default;
|
var endDatePlan = planLast is not null ? GetEndDate(planLast) : default;
|
||||||
|
@ -238,9 +238,9 @@ public class DailyReportServiceTest
|
|||||||
|
|
||||||
fakeDatesRange = new DatesRangeDto
|
fakeDatesRange = new DatesRangeDto
|
||||||
{
|
{
|
||||||
From = fakeFirstFactWellOperation.DateStart,
|
From = fakeFirstFactWellOperation.DateStart.DateTime,
|
||||||
To = fakeLastFactWellOperation.DateStart
|
To = fakeLastFactWellOperation.DateStart.DateTime
|
||||||
};
|
};
|
||||||
|
|
||||||
dailyReportService = new DailyReportService(wellServiceMock,
|
dailyReportService = new DailyReportService(wellServiceMock,
|
||||||
trajectoryFactNnbRepositoryMock,
|
trajectoryFactNnbRepositoryMock,
|
||||||
|
Loading…
Reference in New Issue
Block a user