DD.WellWorkover.Cloud/AsbCloudInfrastructure/Services/OperationDetectorService.cs

168 lines
7.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using System.Linq;
using AsbCloudDb.Model;
namespace AsbCloudInfrastructure.Services
{
public class OperationDetectorService
{
private readonly IEnumerable<OperationDetector> detectors;
public OperationDetectorService(IEnumerable<Operation> operations)
{
detectors = new List<OperationDetector>()
{
new OperationDetector
{
Order = 1,
Operation = operations.FirstOrDefault(o => o.Name.Equals("На поверхности")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitDepthLess20 && data.IsHookWeightLess3;
}
},
new OperationDetector
{
Order = 2,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Удержание в клиньях")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitStandsStill &&
data.IsBlockStandsStill && data.IsHookWeightLess3;
}
},
new OperationDetector
{
Order = 3,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Подъем с проработкой")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitRising &&
data.IsBlockRising && data.IsRotorSpeedMore3 && data.IsPressureMore20;
}
},
new OperationDetector
{
Order = 4,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Спуск с проработкой")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitGoesDown &&
data.IsBlockGoesDown && data.IsRotorSpeedMore3 && data.IsPressureMore20;
}
},
new OperationDetector
{
Order = 5,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Подъем с промывкой")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitRising &&
data.IsBlockRising && data.IsRotorSpeedLess3 && data.IsPressureMore20;
}
},
new OperationDetector
{
Order = 6,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Спуск с промывкой")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitGoesDown &&
data.IsBlockGoesDown && data.IsRotorSpeedLess3 && data.IsPressureMore20;
}
},
new OperationDetector
{
Order = 7,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Спуск в скважину")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitGoesDown &&
data.IsBlockGoesDown && data.IsRotorSpeedLess3 && data.IsPressureLess20;
}
},
new OperationDetector
{
Order = 8,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Спуск с вращением")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitGoesDown &&
data.IsBlockGoesDown && data.IsRotorSpeedMore3 && data.IsPressureLess20;
}
},
new OperationDetector
{
Order = 9,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Подъем из скважины")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitRising &&
data.IsBlockRising && data.IsRotorSpeedLess3 && data.IsPressureLess20;
}
},
new OperationDetector
{
Order = 10,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Подъем с вращением")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitRising &&
data.IsBlockRising && data.IsRotorSpeedMore3 && data.IsPressureLess20;
}
},
new OperationDetector
{
Order = 11,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Промывка в покое")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitStandsStill &&
data.IsBlockStandsStill && data.IsRotorSpeedLess3 && data.IsPressureMore20;
}
},
new OperationDetector
{
Order = 12,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Промывка с вращением")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitStandsStill &&
data.IsBlockStandsStill && data.IsRotorSpeedMore3 && data.IsPressureMore20;
}
},
new OperationDetector
{
Order = 13,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Неподвижное состояние")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitStandsStill && data.IsBlockStandsStill
&& data.IsRotorSpeedLess3 && data.IsPressureLess20 && data.IsHookWeightNotChanges;
}
},
new OperationDetector
{
Order = 14,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Вращение без циркуляции")),
Detect = (data) =>
{
return data.IsDepthNotChanges && data.IsBitStandsStill &&
data.IsBlockStandsStill && data.IsRotorSpeedMore3 && data.IsPressureLess20;
}
},
new OperationDetector
{
Order = 15,
Operation = operations.FirstOrDefault(o => o.Name.Equals("Невозможно определить операцию")),
Detect = (data) => true
}
};
}
public Operation DetectOperation(DrillingAnalysis data) =>
detectors.OrderBy(d => d.Order).First(o => o.Detect(data)).Operation
?? new Operation { Id = 1, Name = "Невозможно определить операцию" };
}
}