/// <summary> /// 创建序号件装机历史。 /// </summary> /// <param name="snReg">序号件</param> /// <param name="pnReg">附件</param> /// <param name="csn">CSN,自装机以来使用循环</param> /// <param name="tsn">TSN,自装机以来使用小时数</param> /// <param name="actionType">操作类型</param> /// <param name="aircraft">装机所在飞机</param> /// <param name="actionDate">操作日期</param> /// <param name="remInstRecord">拆换记录</param> /// <param name="csn2">的基础上再累加在库时间折算的使用循环数</param> /// <param name="tsn2">的基础上再累加在库时间折算的使用小时数</param> /// <param name="status">序号件在历史节点上的状态</param> /// <param name="position">位置信息</param> /// <returns></returns> public static SnHistory CreateSnHistory(SnReg snReg, PnReg pnReg, int csn, decimal tsn, int csn2, decimal tsn2, int actionType, Aircraft aircraft, DateTime actionDate, SnRemInstRecord remInstRecord, int status, int position) { var snHistory = new SnHistory {CreateDate = DateTime.Now}; snHistory.GenerateNewIdentity(); snHistory.SetAircraft(aircraft); snHistory.SetActionDate(actionDate); snHistory.SetActionType((ActionType) actionType); snHistory.SetSn(snReg); snHistory.SetPn(pnReg); snHistory.SetCSN(csn); snHistory.SetTSN(tsn); snHistory.SetCSN2(csn2); snHistory.SetTSN2(tsn2); snHistory.SetSnStatus((SnStatus) status); snHistory.SetRemInstRecord(remInstRecord); snHistory.SetPosition((Position) position); return snHistory; }
/// <summary> /// 创建序号件装机历史。 /// </summary> /// <returns>SnHistory</returns> public static SnHistory CreateSnHistory() { var snHistory = new SnHistory(); snHistory.GenerateNewIdentity(); return snHistory; }
/// <summary> /// 获取开始计算日期 /// </summary> /// <param name="lastTSR">最近一次装上记录</param> /// <param name="flights">最近一次装上以来的飞行日志集合</param> /// <returns>开始计算日期</returns> private DateTime GetStartDate(SnHistory lastTSR, IReadOnlyList<FlightLog> flights) { var lastOilMonitor = _unitOfWork.CreateSet<OilMonitor>() .Where(om => om.SnRegID == lastTSR.SnRegId) .OrderByDescending(o => o.Date) .FirstOrDefault(); // 最近滑油监控记录日期 var lastDate = lastOilMonitor == null || DateTime.Today.AddDays(-30) < flights[0].FlightDate ? flights[0].FlightDate : DateTime.Today.AddDays(-30); var calDate = lastDate.AddDays(1); return calDate; }
/// <summary> /// 创建发动机滑油监控记录。 /// </summary> /// <remarks> /// 对每一台发动机,自滑油监控最后一条记录至当天,每天计算一条监控记录。 /// 初始的时候,从最近一次装上开始计算。 /// </remarks> /// <param name="lastTSR">最近一次装上记录</param> /// <param name="engineReg">发动机</param> /// <param name="flights">最近一次装上以来的飞行日志集合</param> private List<OilMonitor> CreateEngineOils(SnHistory lastTSR, EngineReg engineReg, IReadOnlyList<FlightLog> flights) { if (lastTSR == null) throw new ArgumentNullException("lastTSR"); var oilMonitors = new List<OilMonitor>(); // 开始计算日期 var startDate = GetStartDate(lastTSR, flights); if (!flights.Any()) return oilMonitors; // 计算截止日期,飞行日志最后一天的次日,最后一天为当天的则为当天。 var endDate = flights.Last().FlightDate.Date == DateTime.Today ? DateTime.Today : flights.Last().FlightDate.Date.AddDays(1); while (endDate.Subtract(startDate).TotalDays > 0) { decimal qsr, interval, deltaInterval, lastInterval; var tsr = flights.TakeWhile(f => f.FlightDate < startDate.AddDays(1)).Sum(f => f.FlightHours); switch (lastTSR.Position) { case Position.发动机1: qsr = flights.TakeWhile(f => f.FlightDate < startDate.AddDays(1)) .Sum(f => f.ENG1OilDep + f.ENG1OilArr); lastInterval = _unitOfWork.CreateSet<OilMonitor>() .Where(o => o.IntervalRate > 0) .Select(o => o.IntervalRate) .FirstOrDefault(); CalIntervalOil( flights.Select( f => Tuple.Create(f.FlightDate, f.TakeOff, f.ENG1OilDep, f.ENG1OilArr, f.FlightHours)) .ToList(), startDate, out interval); deltaInterval = lastInterval > 0 ? interval - lastInterval : 0; oilMonitors.Add(CreateEngineOil(lastTSR, engineReg, startDate, tsr, qsr, interval, deltaInterval)); break; case Position.发动机2: qsr = flights.TakeWhile(f => f.FlightDate < startDate.AddDays(1)) .Sum(f => f.ENG2OilDep + f.ENG2OilArr); lastInterval = _unitOfWork.CreateSet<OilMonitor>() .Where(o => o.IntervalRate > 0) .Select(o => o.IntervalRate) .FirstOrDefault(); CalIntervalOil( flights.Select( f => Tuple.Create(f.FlightDate, f.TakeOff, f.ENG2OilDep, f.ENG2OilArr, f.FlightHours)) .ToList(), startDate, out interval); deltaInterval = lastInterval > 0 ? interval - lastInterval : 0; oilMonitors.Add(CreateEngineOil(lastTSR, engineReg, startDate, tsr, qsr, interval, deltaInterval)); break; case Position.发动机3: qsr = flights.TakeWhile(f => f.FlightDate < startDate.AddDays(1)) .Sum(f => f.ENG3OilDep + f.ENG3OilArr); lastInterval = _unitOfWork.CreateSet<OilMonitor>() .Where(o => o.IntervalRate > 0) .Select(o => o.IntervalRate) .FirstOrDefault(); CalIntervalOil( flights.Select( f => Tuple.Create(f.FlightDate, f.TakeOff, f.ENG3OilDep, f.ENG3OilArr, f.FlightHours)) .ToList(), startDate, out interval); deltaInterval = lastInterval > 0 ? interval - lastInterval : 0; oilMonitors.Add(CreateEngineOil(lastTSR, engineReg, startDate, tsr, qsr, interval, deltaInterval)); break; case Position.发动机4: qsr = flights.TakeWhile(f => f.FlightDate < startDate.AddDays(1)) .Sum(f => f.ENG4OilDep + f.ENG4OilArr); lastInterval = _unitOfWork.CreateSet<OilMonitor>() .Where(o => o.IntervalRate > 0) .Select(o => o.IntervalRate) .FirstOrDefault(); CalIntervalOil( flights.Select( f => Tuple.Create(f.FlightDate, f.TakeOff, f.ENG4OilDep, f.ENG4OilArr, f.FlightHours)) .ToList(), startDate, out interval); deltaInterval = lastInterval > 0 ? interval - lastInterval : 0; oilMonitors.Add(CreateEngineOil(lastTSR, engineReg, startDate, tsr, qsr, interval, deltaInterval)); break; default: throw new ArgumentOutOfRangeException(); } startDate = startDate.AddDays(1); } return oilMonitors; }
/// <summary> /// 创建APU滑油监控记录。 /// </summary> /// <remarks> /// 对每一台APU,自滑油监控最后一条记录至当天,每天计算一条监控记录。 /// 初始的时候,从最近一次装上开始计算。 /// </remarks> /// <param name="lastTSR">最近一次装上记录</param> /// <param name="apuReg">APU</param> /// <param name="flights">最近一次装上以来的飞行日志集合</param> /// <returns>滑油监控记录集合。</returns> private List<OilMonitor> CreateAPUOils(SnHistory lastTSR, APUReg apuReg, IReadOnlyList<FlightLog> flights) { var oilMonitors = new List<OilMonitor>(); // 开始计算日期 var startDate = GetStartDate(lastTSR, flights); if (!flights.Any()) return oilMonitors; // 计算截止日期,飞行日志最后一天的次日,最后一天为当天的则为当天。 var endDate = flights.Last().FlightDate.Date == DateTime.Today ? DateTime.Today : flights.Last().FlightDate.Date.AddDays(1); while (endDate.Subtract(startDate).TotalDays > 0) { decimal interval; var tsr = flights.TakeWhile(f => f.FlightDate < startDate.AddDays(1)).Sum(f => f.FlightHours); var qsr = flights.TakeWhile(f => f.FlightDate < startDate.AddDays(1)) .Sum(f => f.ApuOilDep + f.ApuOilArr); var lastInterval = _unitOfWork.CreateSet<OilMonitor>() .Where(o => o.IntervalRate > 0) .Select(o => o.IntervalRate) .FirstOrDefault(); CalIntervalOil( flights.Select(f => Tuple.Create(f.FlightDate, f.TakeOff, f.ApuOilDep, f.ApuOilArr, f.FlightHours)) .ToList(), startDate, out interval); var deltaInterval = lastInterval > 0 ? interval - lastInterval : 0; oilMonitors.Add(CreateAPUOil(lastTSR, apuReg, startDate, tsr, qsr, interval, deltaInterval)); startDate = startDate.AddDays(1); } return oilMonitors; }
/// <summary> /// 计算滑油耗率7日均线 /// </summary> /// <param name="lastTSR">最近一次装上记录</param> /// <param name="currents">新增的滑油监控记录</param> private void CalAverageRate7(SnHistory lastTSR, ref List<OilMonitor> currents) { if (currents.Count == 0) return; var endDate = currents.First().Date; var startDate = currents.First().Date.AddDays(-7); var oilMonitors = _unitOfWork.CreateSet<OilMonitor>() .Where(o => o.SnRegID == lastTSR.SnRegId && o.Date > startDate && o.Date < endDate) .OrderBy(o => o.Date) .ToList(); var count = oilMonitors.Count; oilMonitors.AddRange(currents); for (var i = count; i < oilMonitors.Count; i++) { if (i < 6) continue; var average = oilMonitors.Skip(i - 6).Take(7).Average(o => o.TotalRate); oilMonitors[i].SetAverageRate7(average); } }
/// <summary> /// 创建发动机滑油监控记录。 /// </summary> /// <param name="lastTSR">最近一次装上记录</param> /// <param name="engineReg">发动机</param> /// <param name="calDate">计算日期</param> /// <param name="tsr">自上一次装上以来飞行时间</param> /// <param name="qsr">自上一次装上以来滑油添加总量</param> /// <param name="interval">区间滑油消耗率</param> /// <param name="deltaInterval">区间滑油消耗率变化量</param> /// <returns>滑油监控记录</returns> private static OilMonitor CreateEngineOil(SnHistory lastTSR, EngineReg engineReg, DateTime calDate, decimal tsr, decimal qsr, decimal interval, decimal deltaInterval) { var tsn = lastTSR.TSN + tsr; var toc = tsr == 0 ? 0 : Math.Round(qsr/tsr, 4); var oilMonitor = OilMonitorFactory.CreateEngineOil(engineReg, calDate, tsn, tsr, toc, interval, deltaInterval); return oilMonitor; }