OEEService.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using AutoMapper;
  2. using Core.Dtos;
  3. using Newtonsoft.Json;
  4. using NPOI.SS.Formula.Functions;
  5. using NPOI.Util;
  6. using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
  7. using ProductionLineMonitor.Application.Services.OEEService.Dtos;
  8. using ProductionLineMonitor.Core.IRepositories;
  9. using ProductionLineMonitor.Core.Models;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. namespace ProductionLineMonitor.Application.Services.OEEService
  15. {
  16. public class OEEService : IOEEService
  17. {
  18. private readonly IUnitOfWork _unitOfWork;
  19. public OEEService(IUnitOfWork unitOfWork)
  20. {
  21. _unitOfWork = unitOfWork;
  22. }
  23. public List<MachineOEEInfo> GetOEE(string machineId, string startDate, string endDate)
  24. {
  25. List<MachineOEEInfo> OEES = new List<MachineOEEInfo>();
  26. DateTime startTime = DateTime.Parse($"{startDate} 08:00:00");
  27. DateTime endTime = DateTime.Parse($"{endDate} 08:00:00").AddDays(1);
  28. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  29. .GetList(
  30. x =>
  31. x.MachineId == machineId &&
  32. x.DataTime >= startTime &&
  33. x.DataTime < endTime)
  34. .OrderBy(
  35. o =>
  36. o.DataTime)
  37. .ToList();
  38. for (var i = startTime; i < endTime; i = i.AddHours(12))
  39. {
  40. DateTime tempTime = i.AddHours(12);
  41. MachineOEEInfo machineOEE = new MachineOEEInfo
  42. {
  43. StartTime = i,
  44. EndTime = tempTime,
  45. OutPutPerHours = outputs.FindAll(x => x.DataTime >= i && x.DataTime < tempTime)
  46. };
  47. machineOEE.CalculateOEE();
  48. OEES.Add(machineOEE);
  49. }
  50. return OEES;
  51. }
  52. /// <summary>
  53. ///
  54. /// </summary>
  55. /// <param name="machineId"></param>
  56. /// <param name="startDate"></param>
  57. /// <param name="endDate"></param>
  58. /// <param name="period">1:天,2:周,3:月</param>
  59. /// <returns></returns>
  60. public Dictionary<string, List<MachineOEEInfoByPeriod>> GetOEEByPeriod(string machineIdstr, string startDate, string endDate, int peroid)
  61. {
  62. Dictionary<string, List<MachineOEEInfoByPeriod>> OEES_Dic = new Dictionary<string, List<MachineOEEInfoByPeriod>>();
  63. List<string> machineids = new List<string>(machineIdstr.Split(","));
  64. DateTime startTime = new DateTime();
  65. DateTime endTime = new DateTime();
  66. if (peroid == 1)
  67. {
  68. startTime = DateTime.Parse($"{startDate} 08:00:00");
  69. endTime = DateTime.Parse($"{endDate} 08:00:00").AddDays(1);
  70. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  71. .GetList(
  72. x =>
  73. machineids.Contains(x.MachineId) &&
  74. x.DataTime >= startTime &&
  75. x.DataTime < endTime)
  76. .OrderBy(
  77. o => o.DataTime)
  78. .ToList();
  79. foreach (var item in machineids)
  80. {
  81. List<MachineOEEInfoByPeriod> OEES = new List<MachineOEEInfoByPeriod>();
  82. for (var i = startTime; i < endTime; i = i.AddHours(24))
  83. {
  84. DateTime tempTime = i.AddHours(24);
  85. MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod
  86. {
  87. StartTime = i,
  88. EndTime = tempTime,
  89. OutPutPerHours = outputs.FindAll(x => x.DataTime >= i && x.DataTime < tempTime && x.MachineId == item)
  90. };
  91. machineOEE.CalculateOEE(peroid, 0);
  92. OEES.Add(machineOEE);
  93. }
  94. OEES_Dic.Add(item, OEES);
  95. }
  96. return OEES_Dic;
  97. }
  98. else if (peroid == 2)
  99. {
  100. startTime = DateTime.Parse($"{startDate} 08:00:00");
  101. endTime = DateTime.Parse($"{endDate} 08:00:00");
  102. int week1 = (int)startTime.DayOfWeek;
  103. int week2 = (int)endTime.DayOfWeek;
  104. startTime = startTime.AddDays(week1 == 0 ? -6 : 1 - week1);
  105. endTime = endTime.AddDays(week2 == 0 ? 1 : 8 - week2);
  106. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  107. .GetList(
  108. x =>
  109. machineids.Contains(x.MachineId) &&
  110. x.DataTime >= startTime &&
  111. x.DataTime < endTime)
  112. .OrderBy(
  113. o =>
  114. o.DataTime)
  115. .ToList();
  116. foreach (var item in machineids)
  117. {
  118. List<MachineOEEInfoByPeriod> OEES = new List<MachineOEEInfoByPeriod>();
  119. for (var i = startTime; i < endTime; i = i.AddDays(7))
  120. {
  121. DateTime tempTime1 = i.AddDays(7);
  122. var outputhourslist = new List<MachineOutPutPerHour>();
  123. for (var j = i; j < tempTime1; j = j.AddDays(1))
  124. {
  125. DateTime tempTime2 = j.AddDays(1);
  126. var outputperhours = outputs.FindAll(x => x.DataTime >= j && x.DataTime < tempTime2 && x.MachineId == item);
  127. if (outputperhours != null && outputperhours.Count != 0)
  128. {
  129. MachineOutPutPerHour machineoutputhour = new MachineOutPutPerHour()
  130. {
  131. MachineId = outputperhours[0].MachineId,
  132. ModuleType = outputperhours[0].ModuleType,
  133. DataTime = outputperhours[0].DataTime,
  134. AutoRunTime = outputperhours.Sum(s => s.AutoRunTime.Value),
  135. AlarmTime = outputperhours.Sum(s => s.AlarmTime.Value),
  136. IdleTime = outputperhours.Sum(s => s.IdleTime.Value),
  137. IdleTimeUpstream = outputperhours.Sum(s => s.IdleTimeUpstream.Value),
  138. IdleTimeDownstream = outputperhours.Sum(s => s.IdleTimeDownstream.Value),
  139. IdleTimeSelf = outputperhours.Sum(s => s.IdleTimeSelf.Value),
  140. OutPut = outputperhours.Sum(s => s.OutPut.Value),
  141. ActualTT = outputperhours.Sum(s => s.ActualTT.Value),
  142. AlarmSum = outputperhours.Sum(s => s.AlarmSum.Value),
  143. LoadMATSum = outputperhours.Sum(s => s.LoadMATSum.Value),
  144. LoadMATTime = outputperhours.Sum(s => s.LoadMATTime.Value),
  145. CreateTime = outputperhours[0].CreateTime,
  146. UpdateTime = outputperhours[0].UpdateTime
  147. };
  148. outputhourslist.Add(machineoutputhour);
  149. }
  150. }
  151. MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod
  152. {
  153. StartTime = i,
  154. EndTime = tempTime1,
  155. OutPutPerHours = outputhourslist
  156. };
  157. machineOEE.CalculateOEE(peroid, 7);
  158. OEES.Add(machineOEE);
  159. }
  160. OEES_Dic.Add(item, OEES);
  161. }
  162. return OEES_Dic;
  163. }
  164. else
  165. {
  166. startTime = DateTime.Parse($"{startDate}-01 08:00:00");
  167. endTime = DateTime.Parse($"{endDate}-01 08:00:00").AddMonths(1);
  168. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  169. .GetList(
  170. x =>
  171. machineids.Contains(x.MachineId) &&
  172. x.DataTime >= startTime &&
  173. x.DataTime < endTime)
  174. .OrderBy(
  175. o =>
  176. o.DataTime)
  177. .ToList();
  178. foreach (var item in machineids)
  179. {
  180. List<MachineOEEInfoByPeriod> OEES = new List<MachineOEEInfoByPeriod>();
  181. for (var i = startTime; i < endTime; i = i.AddMonths(1))
  182. {
  183. DateTime tempTime1 = i.AddMonths(1);
  184. var outputhourslist = new List<MachineOutPutPerHour>();
  185. for (var j = i; j < tempTime1; j = j.AddDays(1))
  186. {
  187. DateTime tempTime2 = j.AddDays(1);
  188. var outputperhours = outputs.FindAll(x => x.DataTime >= j && x.DataTime < tempTime2 && x.MachineId == item);
  189. if ((outputperhours != null && outputperhours.Count != 0))
  190. {
  191. MachineOutPutPerHour machineoutputhour = new MachineOutPutPerHour()
  192. {
  193. MachineId = outputperhours[0].MachineId,
  194. ModuleType = outputperhours[0].ModuleType,
  195. DataTime = outputperhours[0].DataTime,
  196. AutoRunTime = outputperhours.Sum(s => s.AutoRunTime.Value),
  197. AlarmTime = outputperhours.Sum(s => s.AlarmTime.Value),
  198. IdleTime = outputperhours.Sum(s => s.IdleTime.Value),
  199. IdleTimeUpstream = outputperhours.Sum(s => s.IdleTimeUpstream.Value),
  200. IdleTimeDownstream = outputperhours.Sum(s => s.IdleTimeDownstream.Value),
  201. IdleTimeSelf = outputperhours.Sum(s => s.IdleTimeSelf.Value),
  202. OutPut = outputperhours.Sum(s => s.OutPut.Value),
  203. ActualTT = outputperhours.Sum(s => s.ActualTT.Value),
  204. AlarmSum = outputperhours.Sum(s => s.AlarmSum.Value),
  205. LoadMATSum = outputperhours.Sum(s => s.LoadMATSum.Value),
  206. LoadMATTime = outputperhours.Sum(s => s.LoadMATTime.Value),
  207. CreateTime = outputperhours[0].CreateTime,
  208. UpdateTime = outputperhours[0].UpdateTime
  209. };
  210. outputhourslist.Add(machineoutputhour);
  211. }
  212. }
  213. MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod
  214. {
  215. StartTime = i,
  216. EndTime = tempTime1,
  217. OutPutPerHours = outputhourslist
  218. };
  219. machineOEE.CalculateOEE(peroid, DateTime.DaysInMonth(i.Year, i.Month));
  220. OEES.Add(machineOEE);
  221. }
  222. OEES_Dic.Add(item, OEES);
  223. }
  224. return OEES_Dic;
  225. }
  226. }
  227. }
  228. }