ExcelService.cs 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  1. using Core.Dtos;
  2. using Microsoft.Extensions.Logging;
  3. using Newtonsoft.Json;
  4. using Newtonsoft.Json.Linq;
  5. using NPOI.HSSF.Record;
  6. using NPOI.HSSF.Record.CF;
  7. using OfficeOpenXml;
  8. using OfficeOpenXml.ConditionalFormatting;
  9. using OfficeOpenXml.Drawing.Chart;
  10. using OfficeOpenXml.Style;
  11. using ProductionLineMonitor.Application.Services.FaultService;
  12. using ProductionLineMonitor.Application.Services.OEEService;
  13. using ProductionLineMonitor.Application.Services.OEEService.Dtos;
  14. using ProductionLineMonitor.Core.Dtos;
  15. using ProductionLineMonitor.Core.IRepositories;
  16. using ProductionLineMonitor.Core.Models;
  17. using System;
  18. using System.Collections.Generic;
  19. using System.Drawing;
  20. using System.IO;
  21. using System.Linq;
  22. using System.Security.Claims;
  23. using System.Text;
  24. using static ProductionLineMonitor.Core.Utils.EmailHelper;
  25. namespace ProductionLineMonitor.Application.Services
  26. {
  27. public class ExcelService : IExcelService
  28. {
  29. private readonly IUnitOfWork _unitOfWork;
  30. private readonly IOEEService _oeeService;
  31. private readonly IFaultService _faultService;
  32. public ExcelService(
  33. IUnitOfWork unitOfWork,
  34. IOEEService oEEService,
  35. IFaultService faultService)
  36. {
  37. _unitOfWork = unitOfWork;
  38. _oeeService = oEEService;
  39. _faultService = faultService;
  40. }
  41. public bool EquipmentOperationReport(DateTime dateTime)
  42. {
  43. try
  44. {
  45. string date = dateTime.ToString("yyyy-MM-dd");
  46. if (dateTime.Hour == 8)
  47. {
  48. date = dateTime.AddDays(-1).ToString("yyyy-MM-dd");
  49. }
  50. JToken? UtilizationRateEmailList;
  51. JToken? ExcelChartsSettings;
  52. using (StreamReader file = File.OpenText("D:\\ReportForms\\Email.json"))
  53. {
  54. using JsonTextReader reader = new JsonTextReader(file);
  55. JObject jsonObject = (JObject)JToken.ReadFrom(reader);
  56. UtilizationRateEmailList = jsonObject["UtilizationRateEmail"];
  57. ExcelChartsSettings = jsonObject["ExcelChartsSettings"];
  58. }
  59. if (UtilizationRateEmailList == null || UtilizationRateEmailList.Count() == 0)
  60. {
  61. return false;
  62. }
  63. DateTime startTime = DateTime.Parse($"{date} 08:00:00");
  64. DateTime endTime = startTime.AddDays(1);
  65. DateTime dataStartTime = endTime.AddDays(-7);
  66. int count = 0;
  67. // 文件夹存储路径
  68. string dateNowStr = DateTime.Now.ToString("yyyyMMddHHmmss");
  69. string folderPath = $"D:\\ReportForms\\{DateTime.Now:yyyyMM}\\{dateNowStr}";
  70. foreach (var UtilizationRateEmail in UtilizationRateEmailList)
  71. {
  72. count++;
  73. LogerHelper.RecordLogTxt($"EquipmentOperationReport Group-{count} Begin");
  74. if ((!(bool)UtilizationRateEmail["IsSend"]))
  75. {
  76. LogerHelper.RecordLogTxt($"EquipmentOperationReport Group-{count} isSend is False");
  77. continue;
  78. }
  79. string path = Path.Combine(folderPath, $"Group-{count}.xlsx");
  80. if (!Directory.Exists(folderPath))
  81. Directory.CreateDirectory(folderPath);
  82. string[] machineIdString = UtilizationRateEmail["MachineIDs"].ToString().Split(',');
  83. if (machineIdString == null || machineIdString.Length == 0)
  84. {
  85. LogerHelper.RecordLogTxt($"EquipmentOperationReport Group-{count} machineIdString is null or length is 0");
  86. continue;
  87. }
  88. var HideEquipmentProduction = ExcelChartsSettings["HideEquipmentProduction"].ToString().Split(',');
  89. //List<int> [产能,稼动,待机,报警,待料,合计]
  90. Dictionary<string, List<int>> OEE_Temp1 = new Dictionary<string, List<int>>();
  91. //List<int> [运行时间,报警时间,待料时间,换料时间,产能,报警次数]
  92. Dictionary<string, List<int>> OEE_Temp2 = new Dictionary<string, List<int>>();
  93. //机种
  94. List<List<string>> ModuleType = new List<List<string>>();
  95. for (int i = 0; i < 24; i++)
  96. ModuleType.Add(new List<string>());
  97. foreach (var machineId in machineIdString)
  98. {
  99. var machine = _unitOfWork.MachineRepository.GetById(machineId);
  100. var line = _unitOfWork.ProductionLineRepository.FirstOrDefault(x => x.Id == machine.ProductionLineId);
  101. var machineOEE = _oeeService.GetOEE(machineId, dataStartTime.ToString("yyyy-MM-dd"), startTime.ToString("yyyy-MM-dd"));
  102. var machineHourDatas = _unitOfWork.MachineOutPutPerHourRepository.GetList(
  103. x =>
  104. x.MachineId == machine.Id &&
  105. x.DataTime >= startTime &&
  106. x.DataTime < endTime).OrderBy(o => o.DataTime).ToList();
  107. FileInfo file = new FileInfo(path);
  108. //ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
  109. using ExcelPackage package = new ExcelPackage(file);
  110. ExcelWorksheet worksheet = package.Workbook.Worksheets.Add($"{line.Name} {machine.Name}");
  111. worksheet.View.ZoomScale = 80;
  112. worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
  113. #region tab header
  114. worksheet.Cells[1, 1].Value = "NO";
  115. worksheet.Cells[1, 2].Value = "时间";
  116. worksheet.Cells[1, 3].Value = "稼动率(%)";
  117. worksheet.Cells[1, 4].Value = "待机率(%)";
  118. worksheet.Cells[1, 5].Value = "报警率(%)";
  119. worksheet.Cells[1, 6].Value = "换料率(%)";
  120. worksheet.Cells[1, 7].Value = "产能(pcs)";
  121. worksheet.Cells[1, 8].Value = "稼动(min)";
  122. worksheet.Cells[1, 9].Value = "待机(min)";
  123. worksheet.Cells[1, 10].Value = "报警(min)";
  124. worksheet.Cells[1, 11].Value = "换料(min)";
  125. worksheet.Cells[1, 12].Value = "合计(min)";
  126. worksheet.Cells[1, 15].Value = $"{startTime:yyyy-MM-dd} 早班";
  127. worksheet.Cells[1, 15, 1, 24].Merge = true;
  128. worksheet.Cells[2, 15].Value = "NO";
  129. worksheet.Cells[2, 16].Value = "时段";
  130. worksheet.Cells[2, 17].Value = "机种";
  131. worksheet.Cells[2, 18].Value = "运行时间";
  132. worksheet.Cells[2, 19].Value = "报警时间";
  133. worksheet.Cells[2, 20].Value = "待料时间";
  134. worksheet.Cells[2, 21].Value = "换料时间";
  135. worksheet.Cells[2, 22].Value = "产能";
  136. worksheet.Cells[2, 23].Value = "TT";
  137. worksheet.Cells[2, 24].Value = "报警次数";
  138. worksheet.Cells[16, 15].Value = "NO";
  139. worksheet.Cells[16, 16].Value = "故障码";
  140. worksheet.Cells[16, 17].Value = "故障详情";
  141. worksheet.Cells[16, 24].Value = "报警次数";
  142. worksheet.Cells[16, 17, 16, 23].Merge = true;
  143. worksheet.Cells[17, 17, 17, 23].Merge = true;
  144. worksheet.Cells[18, 17, 18, 23].Merge = true;
  145. worksheet.Cells[19, 17, 19, 23].Merge = true;
  146. worksheet.Cells[20, 17, 20, 23].Merge = true;
  147. worksheet.Cells[21, 17, 21, 23].Merge = true;
  148. worksheet.Cells[22, 17, 22, 23].Merge = true;
  149. worksheet.Cells[23, 17, 23, 23].Merge = true;
  150. worksheet.Cells[24, 17, 24, 23].Merge = true;
  151. worksheet.Cells[25, 17, 25, 23].Merge = true;
  152. worksheet.Cells[26, 17, 26, 23].Merge = true;
  153. worksheet.Cells[1, 26].Value = $"{startTime:yyyy-MM-dd} 夜班";
  154. worksheet.Cells[1, 26, 1, 35].Merge = true;
  155. worksheet.Cells[2, 26].Value = "NO";
  156. worksheet.Cells[2, 27].Value = "时段";
  157. worksheet.Cells[2, 28].Value = "机种";
  158. worksheet.Cells[2, 29].Value = "运行时间";
  159. worksheet.Cells[2, 30].Value = "报警时间";
  160. worksheet.Cells[2, 31].Value = "待料时间";
  161. worksheet.Cells[2, 32].Value = "换料时间";
  162. worksheet.Cells[2, 33].Value = "产能";
  163. worksheet.Cells[2, 34].Value = "TT";
  164. worksheet.Cells[2, 35].Value = "报警次数";
  165. worksheet.Cells[16, 26].Value = "NO";
  166. worksheet.Cells[16, 27].Value = "故障码";
  167. worksheet.Cells[16, 28].Value = "故障详情";
  168. worksheet.Cells[16, 35].Value = "报警次数";
  169. worksheet.Cells[16, 28, 16, 34].Merge = true;
  170. worksheet.Cells[17, 28, 17, 34].Merge = true;
  171. worksheet.Cells[18, 28, 18, 34].Merge = true;
  172. worksheet.Cells[19, 28, 19, 34].Merge = true;
  173. worksheet.Cells[20, 28, 20, 34].Merge = true;
  174. worksheet.Cells[21, 28, 21, 34].Merge = true;
  175. worksheet.Cells[22, 28, 22, 34].Merge = true;
  176. worksheet.Cells[23, 28, 23, 34].Merge = true;
  177. worksheet.Cells[24, 28, 24, 34].Merge = true;
  178. worksheet.Cells[25, 28, 25, 34].Merge = true;
  179. worksheet.Cells[26, 28, 26, 34].Merge = true;
  180. worksheet.Column(1).Width = 5;
  181. worksheet.Column(2).Width = 12;
  182. worksheet.Column(3).Width = 12;
  183. worksheet.Column(4).Width = 12;
  184. worksheet.Column(5).Width = 12;
  185. worksheet.Column(6).Width = 12;
  186. worksheet.Column(7).Width = 12;
  187. worksheet.Column(8).Width = 12;
  188. worksheet.Column(9).Width = 12;
  189. worksheet.Column(10).Width = 12;
  190. worksheet.Column(11).Width = 12;
  191. worksheet.Column(12).Width = 12;
  192. worksheet.Column(13).Width = 2;
  193. worksheet.Column(14).Width = 2;
  194. worksheet.Column(15).Width = 5;
  195. worksheet.Column(16).Width = 12;
  196. worksheet.Column(17).Width = 12;
  197. worksheet.Column(18).Width = 12;
  198. worksheet.Column(19).Width = 12;
  199. worksheet.Column(20).Width = 12;
  200. worksheet.Column(21).Width = 12;
  201. worksheet.Column(22).Width = 12;
  202. worksheet.Column(23).Width = 12;
  203. worksheet.Column(24).Width = 12;
  204. worksheet.Column(22).Width = 12;
  205. worksheet.Column(23).Width = 12;
  206. worksheet.Column(25).Width = 2;
  207. worksheet.Column(26).Width = 5;
  208. worksheet.Column(27).Width = 12;
  209. worksheet.Column(28).Width = 12;
  210. worksheet.Column(29).Width = 12;
  211. worksheet.Column(30).Width = 12;
  212. worksheet.Column(31).Width = 12;
  213. worksheet.Column(32).Width = 12;
  214. worksheet.Column(33).Width = 12;
  215. worksheet.Column(34).Width = 12;
  216. worksheet.Column(35).Width = 12;
  217. #endregion
  218. for (int i = 0; i < machineOEE.Count; i++)
  219. {
  220. string dateStr = machineOEE[i].Date + " " + machineOEE[i].Shift;
  221. worksheet.Cells[i + 2, 1].Value = i + 1;
  222. worksheet.Cells[i + 2, 2].Value = dateStr;
  223. worksheet.Cells[i + 2, 3].Value = (int)machineOEE[i].RunTimeRate;
  224. worksheet.Cells[i + 2, 4].Value = (int)machineOEE[i].IdelTimeRate;
  225. worksheet.Cells[i + 2, 5].Value = (int)machineOEE[i].DownTimeRate;
  226. worksheet.Cells[i + 2, 6].Value = (int)machineOEE[i].LoadMATTimeRate;
  227. worksheet.Cells[i + 2, 7].Value = machineOEE[i].Outputs;
  228. worksheet.Cells[i + 2, 8].Value = machineOEE[i].RunTime / 60;
  229. worksheet.Cells[i + 2, 9].Value = machineOEE[i].IdelTime / 60;
  230. worksheet.Cells[i + 2, 10].Value = machineOEE[i].DownTime / 60;
  231. worksheet.Cells[i + 2, 11].Value = machineOEE[i].LoadMATTime / 60;
  232. worksheet.Cells[i + 2, 12].Value
  233. = (machineOEE[i].RunTime + machineOEE[i].IdelTime + machineOEE[i].DownTime + machineOEE[i].LoadMATTime) / 60;
  234. if (OEE_Temp1.ContainsKey(dateStr))
  235. {
  236. OEE_Temp1[dateStr][0] += machineOEE[i].Outputs;
  237. OEE_Temp1[dateStr][1] += machineOEE[i].RunTime;
  238. OEE_Temp1[dateStr][2] += machineOEE[i].IdelTime;
  239. OEE_Temp1[dateStr][3] += machineOEE[i].DownTime;
  240. OEE_Temp1[dateStr][4] += machineOEE[i].LoadMATTime;
  241. OEE_Temp1[dateStr][5]
  242. += machineOEE[i].RunTime + machineOEE[i].IdelTime + machineOEE[i].DownTime + machineOEE[i].LoadMATTime;
  243. }
  244. else
  245. {
  246. List<int> list_temp = new List<int>();
  247. list_temp.Add(machineOEE[i].Outputs);
  248. list_temp.Add(machineOEE[i].RunTime);
  249. list_temp.Add(machineOEE[i].IdelTime);
  250. list_temp.Add(machineOEE[i].DownTime);
  251. list_temp.Add(machineOEE[i].LoadMATTime);
  252. list_temp.Add(machineOEE[i].RunTime + machineOEE[i].IdelTime + machineOEE[i].DownTime + machineOEE[i].LoadMATTime);
  253. OEE_Temp1.Add(dateStr, list_temp);
  254. }
  255. }
  256. if (machineHourDatas != null)
  257. {
  258. if (machineHourDatas.Count == 24)
  259. {
  260. List<string> temp = new List<string>();
  261. {
  262. int autoSum = 0;
  263. int alarmTimeSum = 0;
  264. int idelSum = 0;
  265. int outputSum = 0;
  266. double ttSum = 0;
  267. int alarmSum = 0;
  268. int loadTimeSum = 0;
  269. for (int i = 0; i < 12; i++)
  270. {
  271. int auto = (int)Math.Round(machineHourDatas[i].AutoRunTime.Value / 60.0);
  272. autoSum += auto;
  273. int alarmTime = (int)Math.Round(machineHourDatas[i].AlarmTime.Value / 60.0);
  274. alarmTimeSum += alarmTime;
  275. int idel = (int)Math.Round(machineHourDatas[i].IdleTime.Value / 60.0);
  276. idelSum += idel;
  277. int output = machineHourDatas[i].OutPut.Value;
  278. outputSum += output;
  279. double tt = machineHourDatas[i].TT;
  280. //ttSum += tt;
  281. int alarm = machineHourDatas[i].AlarmSum.Value;
  282. alarmSum += alarm;
  283. int loadTime = (int)Math.Round(machineHourDatas[i].LoadMATTime.Value / 60.0);
  284. loadTimeSum += loadTime;
  285. string periodStr = machineHourDatas[i].Period;
  286. string moduleTypeStr = machineHourDatas[i].ModuleType;
  287. if (ModuleType[i] == null || ModuleType[i].Count == 0 || !ModuleType[i].Contains(moduleTypeStr))
  288. {
  289. ModuleType[i].Add(moduleTypeStr);
  290. }
  291. worksheet.Cells[i + 3, 15].Value = i + 1;
  292. worksheet.Cells[i + 3, 16].Value = periodStr;
  293. worksheet.Cells[i + 3, 17].Value = machineHourDatas[i].ModuleType;
  294. worksheet.Cells[i + 3, 18].Value = auto;
  295. worksheet.Cells[i + 3, 19].Value = alarmTime;
  296. worksheet.Cells[i + 3, 20].Value = idel;
  297. worksheet.Cells[i + 3, 21].Value = loadTime;
  298. worksheet.Cells[i + 3, 22].Value = output;
  299. worksheet.Cells[i + 3, 23].Value = Math.Round(tt, 2);
  300. worksheet.Cells[i + 3, 24].Value = alarm;
  301. if (OEE_Temp2.ContainsKey(periodStr))
  302. {
  303. OEE_Temp2[periodStr][0] += auto;
  304. OEE_Temp2[periodStr][1] += alarmTime;
  305. OEE_Temp2[periodStr][2] += idel;
  306. OEE_Temp2[periodStr][3] += loadTime;
  307. OEE_Temp2[periodStr][4] += output;
  308. OEE_Temp2[periodStr][5] += alarm;
  309. }
  310. else
  311. {
  312. List<int> list_temp = new List<int>();
  313. list_temp.Add(auto);
  314. list_temp.Add(alarmTime);
  315. list_temp.Add(idel);
  316. list_temp.Add(loadTime);
  317. list_temp.Add(output);
  318. list_temp.Add(alarm);
  319. OEE_Temp2.Add(periodStr, list_temp);
  320. }
  321. }
  322. worksheet.Cells[15, 15].Value = "合计";
  323. worksheet.Cells[15, 15, 15, 17].Merge = true;
  324. worksheet.Cells[15, 18].Value = autoSum;
  325. worksheet.Cells[15, 19].Value = alarmTimeSum;
  326. worksheet.Cells[15, 20].Value = idelSum;
  327. worksheet.Cells[15, 21].Value = loadTimeSum;
  328. worksheet.Cells[15, 22].Value = outputSum;
  329. if (outputSum != 0)
  330. ttSum = autoSum * 60.0 / outputSum;
  331. else
  332. ttSum = 0;
  333. worksheet.Cells[15, 23].Value = Math.Round(ttSum, 2);
  334. worksheet.Cells[15, 24].Value = alarmSum;
  335. var faults = _faultService.GetFaultFrequencyTop10(machineId, startTime, startTime.AddHours(12), "安全门,门禁,提示上料,提示卸料,门锁,门打开,请选择LOT生产");
  336. for (int i = 0; i < faults.Count; i++)
  337. {
  338. worksheet.Cells[17 + i, 15].Value = i + 1;
  339. worksheet.Cells[17 + i, 16].Value = faults[i].FaultCode;
  340. worksheet.Cells[17 + i, 17].Value = faults[i].FaultInfo;
  341. worksheet.Cells[17 + i, 24].Value = faults[i].Count;
  342. }
  343. }
  344. {
  345. int autoSum = 0;
  346. int alarmTimeSum = 0;
  347. int idelSum = 0;
  348. int outputSum = 0;
  349. double ttSum = 0;
  350. int alarmSum = 0;
  351. int loadTimeSum = 0;
  352. for (int i = 12; i < 24; i++)
  353. {
  354. int auto = (int)Math.Round(machineHourDatas[i].AutoRunTime.Value / 60.0);
  355. autoSum += auto;
  356. int alarmTime = (int)Math.Round(machineHourDatas[i].AlarmTime.Value / 60.0);
  357. alarmTimeSum += alarmTime;
  358. int idel = (int)Math.Round(machineHourDatas[i].IdleTime.Value / 60.0);
  359. idelSum += idel;
  360. int output = machineHourDatas[i].OutPut.Value;
  361. outputSum += output;
  362. double tt = machineHourDatas[i].TT;
  363. //ttSum += tt;
  364. int alarm = machineHourDatas[i].AlarmSum.Value;
  365. alarmSum += alarm;
  366. int loadTime = (int)Math.Round(machineHourDatas[i].LoadMATTime.Value / 60.0);
  367. loadTimeSum += loadTime;
  368. string periodStr = machineHourDatas[i].Period;
  369. string moduleTypeStr = machineHourDatas[i].ModuleType;
  370. if (ModuleType[i] == null || ModuleType[i].Count == 0 || !ModuleType[i].Contains(moduleTypeStr))
  371. {
  372. ModuleType[i].Add(moduleTypeStr);
  373. }
  374. worksheet.Cells[i - 12 + 3, 26].Value = i + 1;
  375. worksheet.Cells[i - 12 + 3, 27].Value = machineHourDatas[i].Period;
  376. worksheet.Cells[i - 12 + 3, 28].Value = machineHourDatas[i].ModuleType;
  377. worksheet.Cells[i - 12 + 3, 29].Value = auto;
  378. worksheet.Cells[i - 12 + 3, 30].Value = alarmTime;
  379. worksheet.Cells[i - 12 + 3, 31].Value = idel;
  380. worksheet.Cells[i - 12 + 3, 32].Value = loadTime;
  381. worksheet.Cells[i - 12 + 3, 33].Value = output;
  382. worksheet.Cells[i - 12 + 3, 34].Value = Math.Round(tt, 2);
  383. worksheet.Cells[i - 12 + 3, 35].Value = alarm;
  384. if (OEE_Temp2.ContainsKey(periodStr))
  385. {
  386. OEE_Temp2[periodStr][0] += auto;
  387. OEE_Temp2[periodStr][1] += alarmTime;
  388. OEE_Temp2[periodStr][2] += idel;
  389. OEE_Temp2[periodStr][3] += loadTime;
  390. OEE_Temp2[periodStr][4] += output;
  391. OEE_Temp2[periodStr][5] += alarm;
  392. }
  393. else
  394. {
  395. List<int> list_temp = new List<int>();
  396. list_temp.Add(auto);
  397. list_temp.Add(alarmTime);
  398. list_temp.Add(idel);
  399. list_temp.Add(loadTime);
  400. list_temp.Add(output);
  401. list_temp.Add(alarm);
  402. OEE_Temp2.Add(periodStr, list_temp);
  403. }
  404. }
  405. worksheet.Cells[15, 26].Value = "合计";
  406. worksheet.Cells[15, 26, 15, 28].Merge = true;
  407. worksheet.Cells[15, 29].Value = autoSum;
  408. worksheet.Cells[15, 30].Value = alarmTimeSum;
  409. worksheet.Cells[15, 31].Value = idelSum;
  410. worksheet.Cells[15, 32].Value = loadTimeSum;
  411. worksheet.Cells[15, 33].Value = outputSum;
  412. if (outputSum != 0)
  413. ttSum = autoSum * 60.0 / outputSum;
  414. else
  415. ttSum = 0;
  416. worksheet.Cells[15, 34].Value = Math.Round(ttSum, 2);
  417. worksheet.Cells[15, 35].Value = alarmSum;
  418. var faults = _faultService.GetFaultFrequencyTop10(machineId, startTime.AddHours(12), startTime.AddHours(24), "安全门,门禁,提示上料,提示卸料,门锁,门打开,请选择LOT生产");
  419. for (int i = 0; i < faults.Count; i++)
  420. {
  421. worksheet.Cells[17 + i, 26].Value = i + 1;
  422. worksheet.Cells[17 + i, 27].Value = faults[i].FaultCode;
  423. worksheet.Cells[17 + i, 28].Value = faults[i].FaultInfo;
  424. worksheet.Cells[17 + i, 35].Value = faults[i].Count;
  425. }
  426. }
  427. }
  428. }
  429. //var faultFrequencys = _faultService.GetFaultFrequencyTop10ByShift(
  430. // machine.Id, dataStartTime, endTime, "安全门,门禁,提示上料,提示卸料,门锁");
  431. //var tables = new FaultFrequencyByShiftTable(faultFrequencys);
  432. //ExcelWorksheet worksheet1 = package.Workbook.Worksheets.Add($"{line.Name} {machine.Name} 报警");
  433. //worksheet1.View.ZoomScale = 80;
  434. //worksheet1.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
  435. //worksheet1.Column(1).Width = 5;
  436. //worksheet1.Column(2).Width = 10;
  437. //worksheet1.Column(3).Width = 30;
  438. //worksheet1.Cells[1, 1].Value = "NO";
  439. //worksheet1.Cells[1, 2].Value = "Code";
  440. //worksheet1.Cells[1, 3].Value = "Name";
  441. //for (int i = 0; i < tables.Shifts.Count(); i++)
  442. //{
  443. // worksheet1.Column(i + 4).Width = 20;
  444. // worksheet1.Cells[1, i + 4].Value = tables.Shifts[i];
  445. //}
  446. //for (int i = 0; i < tables.Nos.Count; i++)
  447. //{
  448. // worksheet1.Cells[i + 2, 1].Value = tables.Nos[i];
  449. // worksheet1.Cells[i + 2, 2].Value = tables.FaultCodes[i];
  450. // worksheet1.Cells[i + 2, 3].Value = tables.FaultInfos[i];
  451. // for (int j = 0; j < tables.Shifts.Count(); j++)
  452. // {
  453. // worksheet1.Cells[i + 2, j + 4].Value = tables.Counts[j, i];
  454. // }
  455. //}
  456. //var databar = worksheet1.Cells["D2:Q33"].ConditionalFormatting.AddDatabar(Color.Red);
  457. //// 创建数据条条件格式对象
  458. //ExcelConditionalFormattingDataBar dataBarConditionalFormatting = (ExcelConditionalFormattingDataBar)worksheet.Cells["D2:Q33"].ConditionalFormatting;
  459. //// 设置渐变填充
  460. //dataBarConditionalFormatting.BarFill.Type = ExcelFillStyle.DarkGray;
  461. ExcelChartSerie chartSerie;
  462. ExcelChart chart = worksheet.Drawings.AddChart("chart", eChartType.ColumnStacked);
  463. chart.YAxis.MinValue = 0;
  464. chart.YAxis.MaxValue = 100;
  465. chart.YAxis.Format = "0 \"%\"";
  466. chart.Legend.Position = eLegendPosition.Bottom;
  467. chart.Legend.Add();
  468. chart.Title.Text = "设备稼动曲线"; //设置图表的名称
  469. chart.SetPosition(540, 20); //设置图表位置
  470. chart.SetSize(1000, 400); //设置图表大小
  471. chart.ShowHiddenData = true;
  472. chartSerie = chart.Series.Add(worksheet.Cells[2, 3, machineOEE.Count + 1, 3], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
  473. chartSerie.HeaderAddress = worksheet.Cells[1, 3];
  474. chartSerie = chart.Series.Add(worksheet.Cells[2, 4, machineOEE.Count + 1, 4], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
  475. chartSerie.HeaderAddress = worksheet.Cells[1, 4];
  476. chartSerie = chart.Series.Add(worksheet.Cells[2, 5, machineOEE.Count + 1, 5], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
  477. chartSerie.HeaderAddress = worksheet.Cells[1, 5];
  478. chartSerie = chart.Series.Add(worksheet.Cells[2, 6, machineOEE.Count + 1, 6], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
  479. chartSerie.HeaderAddress = worksheet.Cells[1, 6];
  480. //var chartType2 = chart.PlotArea.ChartTypes.Add(eChartType.Line);
  481. //chartType2.UseSecondaryAxis = true;
  482. //chartType2.YAxis.Format = "0 \"pcs\"";
  483. //chartSerie = chartType2.Series.Add(worksheet.Cells[2, 6, machineOEE.Count + 1, 6], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
  484. //chartSerie.HeaderAddress = worksheet.Cells[1, 6];
  485. foreach (var item in chart.Series)
  486. {
  487. var pieSerie = (ExcelBarChartSerie)item;
  488. pieSerie.DataLabel.ShowValue = true;
  489. }
  490. if (HideEquipmentProduction == null || HideEquipmentProduction.Count() == 0 || !HideEquipmentProduction.Contains(machineId))
  491. {
  492. ExcelChart chart1 = worksheet.Drawings.AddChart("chart1", eChartType.ColumnStacked);
  493. chart1.Legend.Position = eLegendPosition.Bottom;
  494. chart1.Legend.Add();
  495. chart1.Title.Text = "设备产能曲线"; //设置图表的名称
  496. chart1.SetPosition(540, 1030); //设置图表位置
  497. chart1.SetSize(1000, 400); //设置图表大小
  498. chart1.ShowHiddenData = true;
  499. chart1.YAxis.Format = "0 \"pcs\"";
  500. ExcelChartSerie chartSerie1;
  501. chartSerie1 = chart1.Series.Add(worksheet.Cells[2, 7, machineOEE.Count + 1, 7], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
  502. chartSerie1.HeaderAddress = worksheet.Cells[1, 7];
  503. foreach (var item in chart1.Series)
  504. {
  505. var pieSerie = (ExcelBarChartSerie)item;
  506. pieSerie.DataLabel.ShowValue = true;
  507. }
  508. }
  509. package.Save();
  510. }
  511. if ((bool)UtilizationRateEmail["DataSummary"]["IsAble"])
  512. {
  513. FileInfo file = new FileInfo(path);
  514. using ExcelPackage package = new ExcelPackage(file);
  515. ExcelWorksheet worksheet = package.Workbook.Worksheets.Add($"汇总");
  516. worksheet.View.ZoomScale = 80;
  517. worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
  518. #region tab header
  519. worksheet.Cells[1, 1].Value = "NO";
  520. worksheet.Cells[1, 2].Value = "时间";
  521. worksheet.Cells[1, 3].Value = "稼动率(%)";
  522. worksheet.Cells[1, 4].Value = "待机率(%)";
  523. worksheet.Cells[1, 5].Value = "报警率(%)";
  524. worksheet.Cells[1, 6].Value = "换料率(%)";
  525. worksheet.Cells[1, 7].Value = "产能(pcs)";
  526. worksheet.Cells[1, 8].Value = "稼动(min)";
  527. worksheet.Cells[1, 9].Value = "待机(min)";
  528. worksheet.Cells[1, 10].Value = "报警(min)";
  529. worksheet.Cells[1, 11].Value = "换料(min)";
  530. worksheet.Cells[1, 12].Value = "合计(min)";
  531. worksheet.Cells[1, 15].Value = $"{startTime:yyyy-MM-dd} 早班";
  532. worksheet.Cells[1, 15, 1, 24].Merge = true;
  533. worksheet.Cells[2, 15].Value = "NO";
  534. worksheet.Cells[2, 16].Value = "时段";
  535. worksheet.Cells[2, 17].Value = "机种";
  536. worksheet.Cells[2, 18].Value = "运行时间";
  537. worksheet.Cells[2, 19].Value = "报警时间";
  538. worksheet.Cells[2, 20].Value = "待料时间";
  539. worksheet.Cells[2, 21].Value = "换料时间";
  540. worksheet.Cells[2, 22].Value = "产能";
  541. worksheet.Cells[2, 23].Value = "TT";
  542. worksheet.Cells[2, 24].Value = "报警次数";
  543. worksheet.Cells[1, 26].Value = $"{startTime:yyyy-MM-dd} 夜班";
  544. worksheet.Cells[1, 26, 1, 35].Merge = true;
  545. worksheet.Cells[2, 26].Value = "NO";
  546. worksheet.Cells[2, 27].Value = "时段";
  547. worksheet.Cells[2, 28].Value = "机种";
  548. worksheet.Cells[2, 29].Value = "运行时间";
  549. worksheet.Cells[2, 30].Value = "报警时间";
  550. worksheet.Cells[2, 31].Value = "待料时间";
  551. worksheet.Cells[2, 32].Value = "换料时间";
  552. worksheet.Cells[2, 33].Value = "产能";
  553. worksheet.Cells[2, 34].Value = "TT";
  554. worksheet.Cells[2, 35].Value = "报警次数";
  555. worksheet.Column(1).Width = 5;
  556. worksheet.Column(2).Width = 12;
  557. worksheet.Column(3).Width = 12;
  558. worksheet.Column(4).Width = 12;
  559. worksheet.Column(5).Width = 12;
  560. worksheet.Column(6).Width = 12;
  561. worksheet.Column(7).Width = 12;
  562. worksheet.Column(8).Width = 12;
  563. worksheet.Column(9).Width = 12;
  564. worksheet.Column(10).Width = 12;
  565. worksheet.Column(11).Width = 12;
  566. worksheet.Column(12).Width = 12;
  567. worksheet.Column(13).Width = 2;
  568. worksheet.Column(14).Width = 2;
  569. worksheet.Column(15).Width = 5;
  570. worksheet.Column(16).Width = 12;
  571. worksheet.Column(17).Width = 12;
  572. worksheet.Column(18).Width = 12;
  573. worksheet.Column(19).Width = 12;
  574. worksheet.Column(20).Width = 12;
  575. worksheet.Column(21).Width = 12;
  576. worksheet.Column(22).Width = 12;
  577. worksheet.Column(23).Width = 12;
  578. worksheet.Column(24).Width = 12;
  579. worksheet.Column(22).Width = 12;
  580. worksheet.Column(23).Width = 12;
  581. worksheet.Column(25).Width = 2;
  582. worksheet.Column(26).Width = 5;
  583. worksheet.Column(27).Width = 12;
  584. worksheet.Column(28).Width = 12;
  585. worksheet.Column(29).Width = 12;
  586. worksheet.Column(30).Width = 12;
  587. worksheet.Column(31).Width = 12;
  588. worksheet.Column(32).Width = 12;
  589. worksheet.Column(33).Width = 12;
  590. worksheet.Column(34).Width = 12;
  591. worksheet.Column(35).Width = 12;
  592. #endregion
  593. List<string> OEE1Keys = new List<string>(OEE_Temp1.Keys);
  594. for (int i = 0; i < OEE1Keys.Count(); i++)
  595. {
  596. int total = OEE_Temp1[OEE1Keys[i]][5];
  597. worksheet.Cells[i + 2, 1].Value = i + 1;
  598. worksheet.Cells[i + 2, 2].Value = OEE1Keys[i];
  599. worksheet.Cells[i + 2, 3].Value = Math.Round(OEE_Temp1[OEE1Keys[i]][1] * 100.0 / total);
  600. worksheet.Cells[i + 2, 4].Value = Math.Round(OEE_Temp1[OEE1Keys[i]][2] * 100.0 / total);
  601. worksheet.Cells[i + 2, 5].Value = Math.Round(OEE_Temp1[OEE1Keys[i]][3] * 100.0 / total);
  602. worksheet.Cells[i + 2, 6].Value = Math.Round(OEE_Temp1[OEE1Keys[i]][4] * 100.0 / total);
  603. worksheet.Cells[i + 2, 7].Value = OEE_Temp1[OEE1Keys[i]][0];
  604. worksheet.Cells[i + 2, 8].Value = OEE_Temp1[OEE1Keys[i]][1] / 60;
  605. worksheet.Cells[i + 2, 9].Value = OEE_Temp1[OEE1Keys[i]][2] / 60;
  606. worksheet.Cells[i + 2, 10].Value = OEE_Temp1[OEE1Keys[i]][3] / 60;
  607. worksheet.Cells[i + 2, 11].Value = OEE_Temp1[OEE1Keys[i]][4] / 60;
  608. worksheet.Cells[i + 2, 12].Value = total / 60;
  609. }
  610. if (OEE_Temp2 != null && OEE_Temp2.Count == 24)
  611. {
  612. List<string> OEE2Keys = new List<string>(OEE_Temp2.Keys);
  613. {
  614. int autoTimeSum = 0;
  615. int alarmTimeSum = 0;
  616. int idelTimeSum = 0;
  617. int loadTimeSum = 0;
  618. int outputSum = 0;
  619. int alarmSum = 0;
  620. double ttSum;
  621. for (int i = 0; i < 12; i++)
  622. {
  623. int autoTime = OEE_Temp2[OEE2Keys[i]][0];
  624. autoTimeSum += autoTime;
  625. int alarmTime = OEE_Temp2[OEE2Keys[i]][1];
  626. alarmTimeSum += alarmTime;
  627. int idelTime = OEE_Temp2[OEE2Keys[i]][2];
  628. idelTimeSum += idelTime;
  629. int loadTime = OEE_Temp2[OEE2Keys[i]][3];
  630. loadTimeSum += loadTime;
  631. int output = OEE_Temp2[OEE2Keys[i]][4];
  632. outputSum += output;
  633. int alarm = OEE_Temp2[OEE2Keys[i]][5];
  634. alarmSum += alarm;
  635. worksheet.Cells[i + 3, 15].Value = i + 1;
  636. worksheet.Cells[i + 3, 16].Value = OEE2Keys[i];
  637. worksheet.Cells[i + 3, 17].Value = String.Join(",", ModuleType[i]);
  638. worksheet.Cells[i + 3, 18].Value = autoTime;
  639. worksheet.Cells[i + 3, 19].Value = alarmTime;
  640. worksheet.Cells[i + 3, 20].Value = idelTime;
  641. worksheet.Cells[i + 3, 21].Value = loadTimeSum;
  642. worksheet.Cells[i + 3, 22].Value = output;
  643. worksheet.Cells[i + 3, 23].Value = output == 0 ? 0 : Math.Round(OEE_Temp2[OEE2Keys[i]][0] * 60.0 / OEE_Temp2[OEE2Keys[i]][4], 2);
  644. worksheet.Cells[i + 3, 24].Value = alarm;
  645. }
  646. worksheet.Cells[15, 15].Value = "合计";
  647. worksheet.Cells[15, 15, 15, 17].Merge = true;
  648. worksheet.Cells[15, 18].Value = autoTimeSum;
  649. worksheet.Cells[15, 19].Value = alarmTimeSum;
  650. worksheet.Cells[15, 20].Value = idelTimeSum;
  651. worksheet.Cells[15, 21].Value = loadTimeSum;
  652. worksheet.Cells[15, 22].Value = outputSum;
  653. if (outputSum != 0)
  654. ttSum = autoTimeSum * 60.0 / outputSum;
  655. else
  656. ttSum = 0;
  657. worksheet.Cells[15, 23].Value = Math.Round(ttSum, 2);
  658. worksheet.Cells[15, 24].Value = alarmSum;
  659. }
  660. {
  661. int autoTimeSum = 0;
  662. int alarmTimeSum = 0;
  663. int idelTimeSum = 0;
  664. int loadTimeSum = 0;
  665. int outputSum = 0;
  666. int alarmSum = 0;
  667. double ttSum;
  668. for (int i = 12; i < 24; i++)
  669. {
  670. int autoTime = OEE_Temp2[OEE2Keys[i]][0]; ;
  671. autoTimeSum += autoTime;
  672. int alarmTime = OEE_Temp2[OEE2Keys[i]][1];
  673. alarmTimeSum += alarmTime;
  674. int idelTime = OEE_Temp2[OEE2Keys[i]][2];
  675. idelTimeSum += idelTime;
  676. int loadTime = OEE_Temp2[OEE2Keys[i]][3];
  677. loadTimeSum += loadTime;
  678. int output = OEE_Temp2[OEE2Keys[i]][4];
  679. outputSum += output;
  680. int alarm = OEE_Temp2[OEE2Keys[i]][5];
  681. alarmSum += alarm;
  682. worksheet.Cells[i - 12 + 3, 26].Value = i + 1;
  683. worksheet.Cells[i - 12 + 3, 27].Value = OEE2Keys[i];
  684. worksheet.Cells[i - 12 + 3, 28].Value = String.Join(",", ModuleType[i]);
  685. worksheet.Cells[i - 12 + 3, 29].Value = autoTime;
  686. worksheet.Cells[i - 12 + 3, 30].Value = alarmTime;
  687. worksheet.Cells[i - 12 + 3, 31].Value = idelTime;
  688. worksheet.Cells[i - 12 + 3, 32].Value = loadTimeSum;
  689. worksheet.Cells[i - 12 + 3, 33].Value = output;
  690. worksheet.Cells[i - 12 + 3, 34].Value = output == 0 ? 0 : Math.Round(OEE_Temp2[OEE2Keys[i]][0] * 60.0 / OEE_Temp2[OEE2Keys[i]][4], 2);
  691. worksheet.Cells[i - 12 + 3, 35].Value = alarm;
  692. }
  693. worksheet.Cells[15, 26].Value = "合计";
  694. worksheet.Cells[15, 26, 15, 28].Merge = true;
  695. worksheet.Cells[15, 29].Value = autoTimeSum;
  696. worksheet.Cells[15, 30].Value = alarmTimeSum;
  697. worksheet.Cells[15, 31].Value = idelTimeSum;
  698. worksheet.Cells[15, 32].Value = loadTimeSum;
  699. worksheet.Cells[15, 33].Value = outputSum;
  700. if (outputSum != 0)
  701. ttSum = autoTimeSum * 60.0 / outputSum;
  702. else
  703. ttSum = 0;
  704. worksheet.Cells[15, 34].Value = Math.Round(ttSum, 2);
  705. worksheet.Cells[15, 35].Value = alarmSum;
  706. }
  707. }
  708. ExcelChartSerie chartSerie;
  709. ExcelChart chart = worksheet.Drawings.AddChart("chart", eChartType.ColumnStacked);
  710. chart.YAxis.MinValue = 0;
  711. chart.YAxis.MaxValue = 100;
  712. chart.YAxis.Format = "0 \"%\"";
  713. chart.Legend.Position = eLegendPosition.Bottom;
  714. chart.Legend.Add();
  715. chart.Title.Text = "设备稼动曲线"; //设置图表的名称
  716. chart.SetPosition(540, 20); //设置图表位置
  717. chart.SetSize(1000, 400); //设置图表大小
  718. chart.ShowHiddenData = true;
  719. chartSerie = chart.Series.Add(worksheet.Cells[2, 3, OEE_Temp1.Count() + 1, 3], worksheet.Cells[2, 2, OEE_Temp1.Count() + 1, 2]);
  720. chartSerie.HeaderAddress = worksheet.Cells[1, 3];
  721. chartSerie = chart.Series.Add(worksheet.Cells[2, 4, OEE_Temp1.Count() + 1, 4], worksheet.Cells[2, 2, OEE_Temp1.Count() + 1, 2]);
  722. chartSerie.HeaderAddress = worksheet.Cells[1, 4];
  723. chartSerie = chart.Series.Add(worksheet.Cells[2, 5, OEE_Temp1.Count() + 1, 5], worksheet.Cells[2, 2, OEE_Temp1.Count() + 1, 2]);
  724. chartSerie.HeaderAddress = worksheet.Cells[1, 5];
  725. chartSerie = chart.Series.Add(worksheet.Cells[2, 6, OEE_Temp1.Count() + 1, 6], worksheet.Cells[2, 2, OEE_Temp1.Count() + 1, 2]);
  726. chartSerie.HeaderAddress = worksheet.Cells[1, 6];
  727. foreach (var item in chart.Series)
  728. {
  729. var pieSerie = (ExcelBarChartSerie)item;
  730. pieSerie.DataLabel.ShowValue = true;
  731. }
  732. if (!(bool)UtilizationRateEmail["DataSummary"]["HideProductionUtilizationChart"])
  733. {
  734. ExcelChart chart1 = worksheet.Drawings.AddChart("chart1", eChartType.ColumnStacked);
  735. chart1.Legend.Position = eLegendPosition.Bottom;
  736. chart1.Legend.Add();
  737. chart1.Title.Text = "设备产能曲线"; //设置图表的名称
  738. chart1.SetPosition(540, 1030); //设置图表位置
  739. chart1.SetSize(1000, 400); //设置图表大小
  740. chart1.ShowHiddenData = true;
  741. chart1.YAxis.Format = "0 \"pcs\"";
  742. ExcelChartSerie chartSerie1;
  743. chartSerie1 = chart1.Series.Add(worksheet.Cells[2, 7, OEE_Temp1.Count() + 1, 7], worksheet.Cells[2, 2, OEE_Temp1.Count() + 1, 2]);
  744. chartSerie1.HeaderAddress = worksheet.Cells[1, 7];
  745. foreach (var item in chart1.Series)
  746. {
  747. var pieSerie = (ExcelBarChartSerie)item;
  748. pieSerie.DataLabel.ShowValue = true;
  749. }
  750. }
  751. package.Workbook.Worksheets.MoveToStart("汇总");
  752. package.Save();
  753. }
  754. string ReceiverAppSettingName = UtilizationRateEmail["ReceiverAppSettingName"].ToString();
  755. if (ReceiverAppSettingName == null || String.IsNullOrEmpty(ReceiverAppSettingName))
  756. {
  757. LogerHelper.RecordLogTxt($"EquipmentOperationReport Group-{count} ReceiverAppSettingName is null");
  758. continue;
  759. }
  760. SendMail(
  761. MailType.Message,
  762. ReceiverAppSettingName,
  763. "",
  764. "",
  765. "EQP.EAPAUTO01@eink.com",
  766. "",
  767. $"稼动数据 -- {dateNowStr}",
  768. "",
  769. new string[] { path },
  770. new string[] { dateNowStr },
  771. Encoding.UTF8);
  772. LogerHelper.RecordLogTxt($"EquipmentOperationReport Group-{count} Send over, ReceiverAppSettingName:【{ReceiverAppSettingName}】, file:【{path}】, EmailFileName:【{dateNowStr}】");
  773. }
  774. return true;
  775. }
  776. catch (Exception ex)
  777. {
  778. LogerHelper.RecordLogTxt($"EquipmentOperationReport Exception, Message:{ex.Message}, StackTrace:{ex.StackTrace}");
  779. return false;
  780. }
  781. }
  782. }
  783. }