OEEService.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  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">0:班,1:天,2:周,3:月</param>
  59. /// <param name="dayORnight">period为0时有效,0:全部,1:白班,2:夜班</param>
  60. /// <returns></returns>
  61. public Dictionary<string, List<MachineOEEInfoByPeriod>> GetOEEByPeriod(string machineIdstr, DateTime startDate, DateTime endDate, int peroid, int dayORnight)
  62. {
  63. Dictionary<string, List<MachineOEEInfoByPeriod>> OEES_Dic = new Dictionary<string, List<MachineOEEInfoByPeriod>>();
  64. List<string> machineids = new List<string>(machineIdstr.Split(","));
  65. DateTime startTime = new DateTime();
  66. DateTime endTime = new DateTime();
  67. if (peroid == 0)
  68. {
  69. startTime = DateTime.Parse($"{startDate.ToString("yyyy-MM-dd")} 08:00:00");
  70. endTime = DateTime.Parse($"{endDate.ToString("yyyy-MM-dd")} 08:00:00").AddDays(1);
  71. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  72. .GetList(
  73. x =>
  74. machineids.Contains(x.MachineId) &&
  75. x.DataTime >= startTime &&
  76. x.DataTime < endTime)
  77. .OrderBy(
  78. o => o.DataTime)
  79. .ToList();
  80. if (dayORnight == 1)
  81. {
  82. endTime = endTime.AddHours(-12);
  83. }
  84. else if (dayORnight == 2)
  85. {
  86. startTime = startTime.AddHours(12);
  87. }
  88. foreach (var item in machineids)
  89. {
  90. List<MachineOEEInfoByPeriod> OEES = new List<MachineOEEInfoByPeriod>();
  91. for (var i = startTime; i < endTime; i = i.AddHours(12))
  92. {
  93. DateTime tempTime = i.AddHours(12);
  94. MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod
  95. {
  96. StartTime = i,
  97. EndTime = tempTime,
  98. OutPutPerHours = outputs.FindAll(x => x.DataTime >= i && x.DataTime < tempTime && x.MachineId == item)
  99. };
  100. machineOEE.CalculateOEE(peroid, 0);
  101. OEES.Add(machineOEE);
  102. }
  103. OEES_Dic.Add(item, OEES);
  104. }
  105. return OEES_Dic;
  106. }
  107. if (peroid == 1)
  108. {
  109. startTime = DateTime.Parse($"{startDate.ToString("yyyy-MM-dd")} 08:00:00");
  110. endTime = DateTime.Parse($"{endDate.ToString("yyyy-MM-dd")} 08:00:00").AddDays(1);
  111. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  112. .GetList(
  113. x =>
  114. machineids.Contains(x.MachineId) &&
  115. x.DataTime >= startTime &&
  116. x.DataTime < endTime)
  117. .OrderBy(
  118. o => o.DataTime)
  119. .ToList();
  120. foreach (var item in machineids)
  121. {
  122. List<MachineOEEInfoByPeriod> OEES = new List<MachineOEEInfoByPeriod>();
  123. for (var i = startTime; i < endTime; i = i.AddHours(24))
  124. {
  125. DateTime tempTime = i.AddHours(24);
  126. MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod
  127. {
  128. StartTime = i,
  129. EndTime = tempTime,
  130. OutPutPerHours = outputs.FindAll(x => x.DataTime >= i && x.DataTime < tempTime && x.MachineId == item)
  131. };
  132. machineOEE.CalculateOEE(peroid, 1);
  133. OEES.Add(machineOEE);
  134. }
  135. OEES_Dic.Add(item, OEES);
  136. }
  137. return OEES_Dic;
  138. }
  139. else if (peroid == 2)
  140. {
  141. startTime = DateTime.Parse($"{startDate.ToString("yyyy-MM-dd")} 08:00:00");
  142. endTime = DateTime.Parse($"{endDate.ToString("yyyy-MM-dd")} 08:00:00");
  143. int week1 = (int)startTime.DayOfWeek;
  144. int week2 = (int)endTime.DayOfWeek;
  145. startTime = startTime.AddDays(week1 == 0 ? -6 : 1 - week1);
  146. endTime = endTime.AddDays(week2 == 0 ? 1 : 8 - week2);
  147. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  148. .GetList(
  149. x =>
  150. machineids.Contains(x.MachineId) &&
  151. x.DataTime >= startTime &&
  152. x.DataTime < endTime)
  153. .OrderBy(
  154. o =>
  155. o.DataTime)
  156. .ToList();
  157. foreach (var item in machineids)
  158. {
  159. List<MachineOEEInfoByPeriod> OEES = new List<MachineOEEInfoByPeriod>();
  160. for (var i = startTime; i < endTime; i = i.AddDays(7))
  161. {
  162. DateTime tempTime1 = i.AddDays(7);
  163. var outputhourslist = new List<MachineOutPutPerHour>();
  164. for (var j = i; j < tempTime1; j = j.AddDays(1))
  165. {
  166. DateTime tempTime2 = j.AddDays(1);
  167. var outputperhours = outputs.FindAll(x => x.DataTime >= j && x.DataTime < tempTime2 && x.MachineId == item);
  168. if (outputperhours != null && outputperhours.Count != 0)
  169. {
  170. MachineOutPutPerHour machineoutputhour = new MachineOutPutPerHour()
  171. {
  172. MachineId = outputperhours[0].MachineId,
  173. ModuleType = outputperhours[0].ModuleType,
  174. DataTime = outputperhours[0].DataTime,
  175. AutoRunTime = outputperhours.Sum(s => s.AutoRunTime.Value),
  176. AlarmTime = outputperhours.Sum(s => s.AlarmTime.Value),
  177. IdleTime = outputperhours.Sum(s => s.IdleTime.Value),
  178. IdleTimeUpstream = outputperhours.Sum(s => s.IdleTimeUpstream.Value),
  179. IdleTimeDownstream = outputperhours.Sum(s => s.IdleTimeDownstream.Value),
  180. IdleTimeSelf = outputperhours.Sum(s => s.IdleTimeSelf.Value),
  181. OutPut = outputperhours.Sum(s => s.OutPut.Value),
  182. ActualTT = outputperhours.Sum(s => s.ActualTT.Value),
  183. AlarmSum = outputperhours.Sum(s => s.AlarmSum.Value),
  184. LoadMATSum = outputperhours.Sum(s => s.LoadMATSum.Value),
  185. LoadMATTime = outputperhours.Sum(s => s.LoadMATTime.Value),
  186. ReservedOne = outputperhours.Sum(s => s.ReservedOne.Value),
  187. ReservedTwo = outputperhours.Sum(s => s.ReservedTwo.Value),
  188. ReservedThree = outputperhours.Sum(s => s.ReservedThree.Value),
  189. CreateTime = outputperhours[0].CreateTime,
  190. UpdateTime = outputperhours[0].UpdateTime
  191. };
  192. outputhourslist.Add(machineoutputhour);
  193. }
  194. }
  195. MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod
  196. {
  197. StartTime = i,
  198. EndTime = tempTime1,
  199. OutPutPerHours = outputhourslist
  200. };
  201. machineOEE.CalculateOEE(peroid, 7);
  202. OEES.Add(machineOEE);
  203. }
  204. OEES_Dic.Add(item, OEES);
  205. }
  206. return OEES_Dic;
  207. }
  208. else
  209. {
  210. startTime = DateTime.Parse($"{startDate.ToString("yyyy-MM")}-01 08:00:00");
  211. endTime = DateTime.Parse($"{endDate.ToString("yyyy-MM")}-01 08:00:00").AddMonths(1);
  212. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  213. .GetList(
  214. x =>
  215. machineids.Contains(x.MachineId) &&
  216. x.DataTime >= startTime &&
  217. x.DataTime < endTime)
  218. .OrderBy(
  219. o =>
  220. o.DataTime)
  221. .ToList();
  222. foreach (var item in machineids)
  223. {
  224. List<MachineOEEInfoByPeriod> OEES = new List<MachineOEEInfoByPeriod>();
  225. for (var i = startTime; i < endTime; i = i.AddMonths(1))
  226. {
  227. DateTime tempTime1 = i.AddMonths(1);
  228. var outputhourslist = new List<MachineOutPutPerHour>();
  229. for (var j = i; j < tempTime1; j = j.AddDays(1))
  230. {
  231. DateTime tempTime2 = j.AddDays(1);
  232. var outputperhours = outputs.FindAll(x => x.DataTime >= j && x.DataTime < tempTime2 && x.MachineId == item);
  233. if ((outputperhours != null && outputperhours.Count != 0))
  234. {
  235. MachineOutPutPerHour machineoutputhour = new MachineOutPutPerHour()
  236. {
  237. MachineId = outputperhours[0].MachineId,
  238. ModuleType = outputperhours[0].ModuleType,
  239. DataTime = outputperhours[0].DataTime,
  240. AutoRunTime = outputperhours.Sum(s => s.AutoRunTime.Value),
  241. AlarmTime = outputperhours.Sum(s => s.AlarmTime.Value),
  242. IdleTime = outputperhours.Sum(s => s.IdleTime.Value),
  243. IdleTimeUpstream = outputperhours.Sum(s => s.IdleTimeUpstream.Value),
  244. IdleTimeDownstream = outputperhours.Sum(s => s.IdleTimeDownstream.Value),
  245. IdleTimeSelf = outputperhours.Sum(s => s.IdleTimeSelf.Value),
  246. OutPut = outputperhours.Sum(s => s.OutPut.Value),
  247. ActualTT = outputperhours.Sum(s => s.ActualTT.Value),
  248. AlarmSum = outputperhours.Sum(s => s.AlarmSum.Value),
  249. LoadMATSum = outputperhours.Sum(s => s.LoadMATSum.Value),
  250. LoadMATTime = outputperhours.Sum(s => s.LoadMATTime.Value),
  251. ReservedOne = outputperhours.Sum(s => s.ReservedOne.Value),
  252. ReservedTwo = outputperhours.Sum(s => s.ReservedTwo.Value),
  253. ReservedThree = outputperhours.Sum(s => s.ReservedThree.Value),
  254. CreateTime = outputperhours[0].CreateTime,
  255. UpdateTime = outputperhours[0].UpdateTime
  256. };
  257. outputhourslist.Add(machineoutputhour);
  258. }
  259. }
  260. MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod
  261. {
  262. StartTime = i,
  263. EndTime = tempTime1,
  264. OutPutPerHours = outputhourslist
  265. };
  266. machineOEE.CalculateOEE(peroid, DateTime.DaysInMonth(i.Year, i.Month));
  267. OEES.Add(machineOEE);
  268. }
  269. OEES_Dic.Add(item, OEES);
  270. }
  271. return OEES_Dic;
  272. }
  273. }
  274. /// <summary>
  275. /// 屏蔽2月10日之前的数据
  276. /// </summary>
  277. /// <param name="machineId"></param>
  278. /// <param name="startDate"></param>
  279. /// <param name="endDate"></param>
  280. /// <param name="period">1:天,2:周,3:月</param>
  281. /// <returns></returns>
  282. public Dictionary<string, List<MachineOEEInfoByPeriod>> GetOEEByPeriodV1(string machineIdstr, string startDate, string endDate, int peroid)
  283. {
  284. Dictionary<string, List<MachineOEEInfoByPeriod>> OEES_Dic = new Dictionary<string, List<MachineOEEInfoByPeriod>>();
  285. List<string> machineids = new List<string>(machineIdstr.Split(","));
  286. DateTime startTime = new DateTime();
  287. DateTime endTime = new DateTime();
  288. if (peroid == 1)
  289. {
  290. startTime = DateTime.Parse($"{startDate} 08:00:00");
  291. endTime = DateTime.Parse($"{endDate} 08:00:00").AddDays(1);
  292. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  293. .GetList(
  294. x =>
  295. machineids.Contains(x.MachineId) &&
  296. x.DataTime >= startTime &&
  297. x.DataTime < endTime)
  298. .OrderBy(
  299. o => o.DataTime)
  300. .ToList();
  301. foreach (var item in machineids)
  302. {
  303. List<MachineOEEInfoByPeriod> OEES = new List<MachineOEEInfoByPeriod>();
  304. for (var i = startTime; i < endTime; i = i.AddHours(24))
  305. {
  306. DateTime tempTime = i.AddHours(24);
  307. MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod
  308. {
  309. StartTime = i,
  310. EndTime = tempTime,
  311. OutPutPerHours = outputs.FindAll(x => x.DataTime >= i && x.DataTime < tempTime && x.MachineId == item)
  312. };
  313. machineOEE.CalculateOEE(peroid, 0);
  314. OEES.Add(machineOEE);
  315. }
  316. OEES_Dic.Add(item, OEES);
  317. }
  318. return OEES_Dic;
  319. }
  320. else if (peroid == 2)
  321. {
  322. startTime = DateTime.Parse($"{startDate} 08:00:00");
  323. endTime = DateTime.Parse($"{endDate} 08:00:00");
  324. int week1 = (int)startTime.DayOfWeek;
  325. int week2 = (int)endTime.DayOfWeek;
  326. startTime = startTime.AddDays(week1 == 0 ? -6 : 1 - week1);
  327. endTime = endTime.AddDays(week2 == 0 ? 1 : 8 - week2);
  328. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  329. .GetList(
  330. x =>
  331. machineids.Contains(x.MachineId) &&
  332. x.DataTime >= startTime &&
  333. x.DataTime < endTime)
  334. .OrderBy(
  335. o =>
  336. o.DataTime)
  337. .ToList();
  338. foreach (var item in machineids)
  339. {
  340. List<MachineOEEInfoByPeriod> OEES = new List<MachineOEEInfoByPeriod>();
  341. for (var i = startTime; i < endTime; i = i.AddDays(7))
  342. {
  343. DateTime tempTime1 = i.AddDays(7);
  344. var outputhourslist = new List<MachineOutPutPerHour>();
  345. for (var j = i; j < tempTime1; j = j.AddDays(1))
  346. {
  347. DateTime tempTime2 = j.AddDays(1);
  348. var outputperhours = outputs.FindAll(x => x.DataTime >= j && x.DataTime < tempTime2 && x.MachineId == item);
  349. if (outputperhours != null && outputperhours.Count != 0)
  350. {
  351. MachineOutPutPerHour machineoutputhour = new MachineOutPutPerHour()
  352. {
  353. MachineId = outputperhours[0].MachineId,
  354. ModuleType = outputperhours[0].ModuleType,
  355. DataTime = outputperhours[0].DataTime,
  356. AutoRunTime = outputperhours.Sum(s => s.AutoRunTime.Value),
  357. AlarmTime = outputperhours.Sum(s => s.AlarmTime.Value),
  358. IdleTime = outputperhours.Sum(s => s.IdleTime.Value),
  359. IdleTimeUpstream = outputperhours.Sum(s => s.IdleTimeUpstream.Value),
  360. IdleTimeDownstream = outputperhours.Sum(s => s.IdleTimeDownstream.Value),
  361. IdleTimeSelf = outputperhours.Sum(s => s.IdleTimeSelf.Value),
  362. OutPut = outputperhours.Sum(s => s.OutPut.Value),
  363. ActualTT = outputperhours.Sum(s => s.ActualTT.Value),
  364. AlarmSum = outputperhours.Sum(s => s.AlarmSum.Value),
  365. LoadMATSum = outputperhours.Sum(s => s.LoadMATSum.Value),
  366. LoadMATTime = outputperhours.Sum(s => s.LoadMATTime.Value),
  367. CreateTime = outputperhours[0].CreateTime,
  368. UpdateTime = outputperhours[0].UpdateTime
  369. };
  370. outputhourslist.Add(machineoutputhour);
  371. }
  372. }
  373. MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod
  374. {
  375. StartTime = i,
  376. EndTime = tempTime1,
  377. OutPutPerHours = outputhourslist
  378. };
  379. machineOEE.CalculateOEE(peroid, 7);
  380. OEES.Add(machineOEE);
  381. }
  382. OEES_Dic.Add(item, OEES);
  383. }
  384. return OEES_Dic;
  385. }
  386. else
  387. {
  388. startTime = DateTime.Parse($"{startDate}-01 08:00:00");
  389. endTime = DateTime.Parse($"{endDate}-01 08:00:00").AddMonths(1);
  390. DateTime startTime_temp = new DateTime();
  391. if (startDate == "2025-02")
  392. {
  393. startTime_temp = DateTime.Parse($"{startDate}-10 08:00:00");
  394. }
  395. else
  396. {
  397. startTime_temp = DateTime.Parse($"{startDate}-01 08:00:00");
  398. }
  399. List<MachineOutPutPerHour> outputs = _unitOfWork.MachineOutPutPerHourRepository
  400. .GetList(
  401. x =>
  402. machineids.Contains(x.MachineId) &&
  403. x.DataTime >= startTime_temp &&
  404. x.DataTime < endTime)
  405. .OrderBy(
  406. o =>
  407. o.DataTime)
  408. .ToList();
  409. foreach (var item in machineids)
  410. {
  411. List<MachineOEEInfoByPeriod> OEES = new List<MachineOEEInfoByPeriod>();
  412. for (var i = startTime; i < endTime; i = i.AddMonths(1))
  413. {
  414. DateTime tempTime1 = i.AddMonths(1);
  415. var outputhourslist = new List<MachineOutPutPerHour>();
  416. for (var j = i; j < tempTime1; j = j.AddDays(1))
  417. {
  418. DateTime tempTime2 = j.AddDays(1);
  419. var outputperhours = outputs.FindAll(x => x.DataTime >= j && x.DataTime < tempTime2 && x.MachineId == item);
  420. if ((outputperhours != null && outputperhours.Count != 0))
  421. {
  422. MachineOutPutPerHour machineoutputhour = new MachineOutPutPerHour()
  423. {
  424. MachineId = outputperhours[0].MachineId,
  425. ModuleType = outputperhours[0].ModuleType,
  426. DataTime = outputperhours[0].DataTime,
  427. AutoRunTime = outputperhours.Sum(s => s.AutoRunTime.Value),
  428. AlarmTime = outputperhours.Sum(s => s.AlarmTime.Value),
  429. IdleTime = outputperhours.Sum(s => s.IdleTime.Value),
  430. IdleTimeUpstream = outputperhours.Sum(s => s.IdleTimeUpstream.Value),
  431. IdleTimeDownstream = outputperhours.Sum(s => s.IdleTimeDownstream.Value),
  432. IdleTimeSelf = outputperhours.Sum(s => s.IdleTimeSelf.Value),
  433. OutPut = outputperhours.Sum(s => s.OutPut.Value),
  434. ActualTT = outputperhours.Sum(s => s.ActualTT.Value),
  435. AlarmSum = outputperhours.Sum(s => s.AlarmSum.Value),
  436. LoadMATSum = outputperhours.Sum(s => s.LoadMATSum.Value),
  437. LoadMATTime = outputperhours.Sum(s => s.LoadMATTime.Value),
  438. CreateTime = outputperhours[0].CreateTime,
  439. UpdateTime = outputperhours[0].UpdateTime
  440. };
  441. outputhourslist.Add(machineoutputhour);
  442. }
  443. }
  444. MachineOEEInfoByPeriod machineOEE = new MachineOEEInfoByPeriod
  445. {
  446. StartTime = i,
  447. EndTime = tempTime1,
  448. OutPutPerHours = outputhourslist
  449. };
  450. machineOEE.CalculateOEE(peroid, DateTime.DaysInMonth(i.Year, i.Month));
  451. OEES.Add(machineOEE);
  452. }
  453. OEES_Dic.Add(item, OEES);
  454. }
  455. return OEES_Dic;
  456. }
  457. }
  458. public List<MachineOEEInfoByPeriod> GetOEEByPeriodV2(string machineIds, string startDate, string endDate, int peroid, int shift)
  459. {
  460. throw new NotImplementedException();
  461. }
  462. }
  463. }