using AutoMapper; using Core.Dtos; using Newtonsoft.Json; using NPOI.SS.Formula.Functions; using NPOI.Util; using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; using ProductionLineMonitor.Application.Services.OEEService.Dtos; using ProductionLineMonitor.Core.IRepositories; using ProductionLineMonitor.Core.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ProductionLineMonitor.Application.Services.OEEService { public class OEEService : IOEEService { private readonly IUnitOfWork _unitOfWork; public OEEService(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } public List GetOEE(string machineId, string startDate, string endDate) { List OEES = new List(); DateTime startTime = DateTime.Parse($"{startDate} 08:00:00"); DateTime endTime = DateTime.Parse($"{endDate} 08:00:00").AddDays(1); List outputs = _unitOfWork.MachineOutPutPerHourRepository .GetList( x => x.MachineId == machineId && x.DataTime >= startTime && x.DataTime < endTime) .OrderBy( o => o.DataTime) .ToList(); for (var i = startTime; i < endTime; i = i.AddHours(12)) { DateTime tempTime = i.AddHours(12); MachineOEEInfo machineOEE = new MachineOEEInfo { StartTime = i, EndTime = tempTime, OutPutPerHours = outputs.FindAll(x => x.DataTime >= i && x.DataTime < tempTime) }; machineOEE.CalculateOEE(); OEES.Add(machineOEE); } return OEES; } /// /// /// /// /// /// /// 1:天,2:周,3:月 /// public Dictionary> GetOEEByPeriod(string machineIdstr, string startDate, string endDate, int peroid) { Dictionary> OEES_Dic = new Dictionary>(); List machineids = new List(machineIdstr.Split(",")); DateTime startTime = new DateTime(); DateTime endTime = new DateTime(); if (peroid == 1) { startTime = DateTime.Parse($"{startDate} 08:00:00"); endTime = DateTime.Parse($"{endDate} 08:00:00").AddDays(1); List outputs = _unitOfWork.MachineOutPutPerHourRepository .GetList( x => machineids.Contains(x.MachineId) && x.DataTime >= startTime && x.DataTime < endTime) .OrderBy( o => o.DataTime) .ToList(); foreach (var item in machineids) { List OEES = new List(); for (var i = startTime; i < endTime; i = i.AddHours(24)) { DateTime tempTime = i.AddHours(24); MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod { StartTime = i, EndTime = tempTime, OutPutPerHours = outputs.FindAll(x => x.DataTime >= i && x.DataTime < tempTime && x.MachineId == item) }; machineOEE.CalculateOEE(peroid, 0); OEES.Add(machineOEE); } OEES_Dic.Add(item, OEES); } return OEES_Dic; } else if (peroid == 2) { startTime = DateTime.Parse($"{startDate} 08:00:00"); endTime = DateTime.Parse($"{endDate} 08:00:00"); int week1 = (int)startTime.DayOfWeek; int week2 = (int)endTime.DayOfWeek; startTime = startTime.AddDays(week1 == 0 ? -6 : 1 - week1); endTime = endTime.AddDays(week2 == 0 ? 1 : 8 - week2); List outputs = _unitOfWork.MachineOutPutPerHourRepository .GetList( x => machineids.Contains(x.MachineId) && x.DataTime >= startTime && x.DataTime < endTime) .OrderBy( o => o.DataTime) .ToList(); foreach (var item in machineids) { List OEES = new List(); for (var i = startTime; i < endTime; i = i.AddDays(7)) { DateTime tempTime1 = i.AddDays(7); var outputhourslist = new List(); for (var j = i; j < tempTime1; j = j.AddDays(1)) { DateTime tempTime2 = j.AddDays(1); var outputperhours = outputs.FindAll(x => x.DataTime >= j && x.DataTime < tempTime2 && x.MachineId == item); if (outputperhours != null && outputperhours.Count != 0) { MachineOutPutPerHour machineoutputhour = new MachineOutPutPerHour() { MachineId = outputperhours[0].MachineId, ModuleType = outputperhours[0].ModuleType, DataTime = outputperhours[0].DataTime, AutoRunTime = outputperhours.Sum(s => s.AutoRunTime.Value), AlarmTime = outputperhours.Sum(s => s.AlarmTime.Value), IdleTime = outputperhours.Sum(s => s.IdleTime.Value), IdleTimeUpstream = outputperhours.Sum(s => s.IdleTimeUpstream.Value), IdleTimeDownstream = outputperhours.Sum(s => s.IdleTimeDownstream.Value), IdleTimeSelf = outputperhours.Sum(s => s.IdleTimeSelf.Value), OutPut = outputperhours.Sum(s => s.OutPut.Value), ActualTT = outputperhours.Sum(s => s.ActualTT.Value), AlarmSum = outputperhours.Sum(s => s.AlarmSum.Value), LoadMATSum = outputperhours.Sum(s => s.LoadMATSum.Value), LoadMATTime = outputperhours.Sum(s => s.LoadMATTime.Value), CreateTime = outputperhours[0].CreateTime, UpdateTime = outputperhours[0].UpdateTime }; outputhourslist.Add(machineoutputhour); } } MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod { StartTime = i, EndTime = tempTime1, OutPutPerHours = outputhourslist }; machineOEE.CalculateOEE(peroid, 7); OEES.Add(machineOEE); } OEES_Dic.Add(item, OEES); } return OEES_Dic; } else { startTime = DateTime.Parse($"{startDate}-01 08:00:00"); endTime = DateTime.Parse($"{endDate}-01 08:00:00").AddMonths(1); List outputs = _unitOfWork.MachineOutPutPerHourRepository .GetList( x => machineids.Contains(x.MachineId) && x.DataTime >= startTime && x.DataTime < endTime) .OrderBy( o => o.DataTime) .ToList(); foreach (var item in machineids) { List OEES = new List(); for (var i = startTime; i < endTime; i = i.AddMonths(1)) { DateTime tempTime1 = i.AddMonths(1); var outputhourslist = new List(); for (var j = i; j < tempTime1; j = j.AddDays(1)) { DateTime tempTime2 = j.AddDays(1); var outputperhours = outputs.FindAll(x => x.DataTime >= j && x.DataTime < tempTime2 && x.MachineId == item); if ((outputperhours != null && outputperhours.Count != 0)) { MachineOutPutPerHour machineoutputhour = new MachineOutPutPerHour() { MachineId = outputperhours[0].MachineId, ModuleType = outputperhours[0].ModuleType, DataTime = outputperhours[0].DataTime, AutoRunTime = outputperhours.Sum(s => s.AutoRunTime.Value), AlarmTime = outputperhours.Sum(s => s.AlarmTime.Value), IdleTime = outputperhours.Sum(s => s.IdleTime.Value), IdleTimeUpstream = outputperhours.Sum(s => s.IdleTimeUpstream.Value), IdleTimeDownstream = outputperhours.Sum(s => s.IdleTimeDownstream.Value), IdleTimeSelf = outputperhours.Sum(s => s.IdleTimeSelf.Value), OutPut = outputperhours.Sum(s => s.OutPut.Value), ActualTT = outputperhours.Sum(s => s.ActualTT.Value), AlarmSum = outputperhours.Sum(s => s.AlarmSum.Value), LoadMATSum = outputperhours.Sum(s => s.LoadMATSum.Value), LoadMATTime = outputperhours.Sum(s => s.LoadMATTime.Value), CreateTime = outputperhours[0].CreateTime, UpdateTime = outputperhours[0].UpdateTime }; outputhourslist.Add(machineoutputhour); } } MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod { StartTime = i, EndTime = tempTime1, OutPutPerHours = outputhourslist }; machineOEE.CalculateOEE(peroid, DateTime.DaysInMonth(i.Year, i.Month)); OEES.Add(machineOEE); } OEES_Dic.Add(item, OEES); } return OEES_Dic; } } } }