baowei 1 miesiąc temu
rodzic
commit
9663da6e6f

+ 443 - 424
ProductionLineMonitor.Application/Services/ExcelService.cs

@@ -1,6 +1,8 @@
 using Core.Dtos;
+using Microsoft.Extensions.Logging;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
+using NPOI.HSSF.Record;
 using NPOI.HSSF.Record.CF;
 using OfficeOpenXml;
 using OfficeOpenXml.ConditionalFormatting;
@@ -11,6 +13,7 @@ using ProductionLineMonitor.Application.Services.OEEService;
 using ProductionLineMonitor.Core.Dtos;
 using ProductionLineMonitor.Core.IRepositories;
 using System;
+using System.Collections.Generic;
 using System.Drawing;
 using System.IO;
 using System.Linq;
@@ -27,7 +30,7 @@ namespace ProductionLineMonitor.Application.Services
         private readonly IFaultService _faultService;
 
         public ExcelService(
-            IUnitOfWork unitOfWork, 
+            IUnitOfWork unitOfWork,
             IOEEService oEEService,
             IFaultService faultService)
         {
@@ -38,452 +41,468 @@ namespace ProductionLineMonitor.Application.Services
 
         public bool EquipmentOperationReport(DateTime dateTime)
         {
-            string date = dateTime.ToString("yyyy-MM-dd");
-            if (dateTime.Hour == 8) {
-                date = dateTime.AddDays(-1).ToString("yyyy-MM-dd");
-            }
-
-            string machineIdString = "";
-            string receiverAppSettingName = "";
-            bool isSend = false;
-            using (StreamReader file = File.OpenText("D:\\ReportForms\\Email.json"))
-            {
-                using JsonTextReader reader = new JsonTextReader(file);
-                JObject jsonObject = (JObject)JToken.ReadFrom(reader);
-                machineIdString = jsonObject["UtilizationRateEmail"]["MachineIDs"].ToString();
-                receiverAppSettingName = jsonObject["UtilizationRateEmail"]["ReceiverAppSettingName"].ToString();
-                isSend = jsonObject["UtilizationRateEmail"]["IsSend"].ToObject<bool>();
-            }
-
-            if (string.IsNullOrEmpty(machineIdString))
+            try
             {
-                return false;
-            }
-
-            DateTime startTime = DateTime.Parse($"{date} 08:00:00");
-            DateTime endTime= startTime.AddDays(1);
-            DateTime dataStartTime = endTime.AddDays(-7);
+                string date = dateTime.ToString("yyyy-MM-dd");
+                if (dateTime.Hour == 8)
+                {
+                    date = dateTime.AddDays(-1).ToString("yyyy-MM-dd");
+                }
 
-            // 文件夹存储路径
-            string folderPath = "D:\\ReportForms";
-            if (!Directory.Exists(folderPath))
-                Directory.CreateDirectory(folderPath);
-            string excelName = $"{DateTime.Now:yyyyMMddHHmmss}.xlsx";
-            var path = Path.Combine(folderPath, excelName);
+                JToken? UtilizationRateEmailList;
+                using (StreamReader file = File.OpenText("D:\\ReportForms\\Email.json"))
+                {
+                    using JsonTextReader reader = new JsonTextReader(file);
+                    JObject jsonObject = (JObject)JToken.ReadFrom(reader);
+                    UtilizationRateEmailList = jsonObject["UtilizationRateEmail"];
+                }
 
-            string[] machineIds = machineIdString.Split(',');
-            foreach (var machineId in machineIds)
-            {
-                var machine = _unitOfWork.MachineRepository.GetById(machineId);
-                var line = _unitOfWork.ProductionLineRepository.FirstOrDefault(x => x.Id == machine.ProductionLineId);
-                var machineOEE = _oeeService.GetOEE(machineId, dataStartTime.ToString("yyyy-MM-dd"), startTime.ToString("yyyy-MM-dd"));
-                var machineHourDatas = _unitOfWork.MachineOutPutPerHourRepository.GetList(
-                    x =>
-                    x.MachineId == machine.Id &&
-                    x.DataTime >= startTime && 
-                    x.DataTime < endTime).OrderBy(o => o.DataTime).ToList();
-                
-
-                FileInfo file = new FileInfo(path);
-
-                //ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
-
-                using ExcelPackage package = new ExcelPackage(file);
-
-                ExcelWorksheet worksheet = package.Workbook.Worksheets.Add($"{line.Name} {machine.Name}");
-                worksheet.View.ZoomScale = 80;
-
-                worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
-
-                #region tab header
-
-                worksheet.Cells[1, 1].Value = "NO";
-                worksheet.Cells[1, 2].Value = "时间";
-                worksheet.Cells[1, 3].Value = "稼动率(%)";
-                worksheet.Cells[1, 4].Value = "待机率(%)";
-                worksheet.Cells[1, 5].Value = "报警率(%)";
-                worksheet.Cells[1, 6].Value = "换料率(%)";
-                worksheet.Cells[1, 7].Value = "产能(pcs)";
-                worksheet.Cells[1, 8].Value = "稼动(min)";
-                worksheet.Cells[1, 9].Value = "待机(min)";
-                worksheet.Cells[1, 10].Value = "报警(min)";
-                worksheet.Cells[1, 11].Value = "换料(min)";
-                worksheet.Cells[1, 12].Value = "合计(min)";
-
-                worksheet.Cells[1, 15].Value = $"{startTime:yyyy-MM-dd} 早班";
-                worksheet.Cells[1, 15, 1, 24].Merge = true;
-
-                worksheet.Cells[2, 15].Value = "NO";
-                worksheet.Cells[2, 16].Value = "时段";
-                worksheet.Cells[2, 17].Value = "机种";
-                worksheet.Cells[2, 18].Value = "运行时间";
-                worksheet.Cells[2, 19].Value = "报警时间";
-                worksheet.Cells[2, 20].Value = "待料时间";
-                worksheet.Cells[2, 21].Value = "换料时间";
-                worksheet.Cells[2, 22].Value = "产能";
-                worksheet.Cells[2, 23].Value = "TT";
-                worksheet.Cells[2, 24].Value = "报警次数";
-
-                worksheet.Cells[16, 15].Value = "NO";
-                worksheet.Cells[16, 16].Value = "故障码";
-                worksheet.Cells[16, 17].Value = "故障详情";
-                worksheet.Cells[16, 24].Value = "报警次数";
-
-                worksheet.Cells[16, 17, 16, 23].Merge = true;
-                worksheet.Cells[17, 17, 17, 23].Merge = true;
-                worksheet.Cells[18, 17, 18, 23].Merge = true;
-                worksheet.Cells[19, 17, 19, 23].Merge = true;
-                worksheet.Cells[20, 17, 20, 23].Merge = true;
-                worksheet.Cells[21, 17, 21, 23].Merge = true;
-                worksheet.Cells[22, 17, 22, 23].Merge = true;
-                worksheet.Cells[23, 17, 23, 23].Merge = true;
-                worksheet.Cells[24, 17, 24, 23].Merge = true;
-                worksheet.Cells[25, 17, 25, 23].Merge = true;
-                worksheet.Cells[26, 17, 26, 23].Merge = true;
-
-                worksheet.Cells[1, 26].Value = $"{startTime:yyyy-MM-dd} 夜班";
-                worksheet.Cells[1, 26, 1, 35].Merge = true;
-
-                worksheet.Cells[2, 26].Value = "NO";
-                worksheet.Cells[2, 27].Value = "时段";
-                worksheet.Cells[2, 28].Value = "机种";
-                worksheet.Cells[2, 29].Value = "运行时间";
-                worksheet.Cells[2, 30].Value = "报警时间";
-                worksheet.Cells[2, 31].Value = "待料时间";
-                worksheet.Cells[2, 32].Value = "换料时间";
-                worksheet.Cells[2, 33].Value = "产能";
-                worksheet.Cells[2, 34].Value = "TT";
-                worksheet.Cells[2, 35].Value = "报警次数";
-
-                worksheet.Cells[16, 26].Value = "NO";
-                worksheet.Cells[16, 27].Value = "故障码";
-                worksheet.Cells[16, 28].Value = "故障详情";
-                worksheet.Cells[16, 35].Value = "报警次数";
-
-                worksheet.Cells[16, 28, 16, 34].Merge = true;
-                worksheet.Cells[17, 28, 17, 34].Merge = true;
-                worksheet.Cells[18, 28, 18, 34].Merge = true;
-                worksheet.Cells[19, 28, 19, 34].Merge = true;
-                worksheet.Cells[20, 28, 20, 34].Merge = true;
-                worksheet.Cells[21, 28, 21, 34].Merge = true;
-                worksheet.Cells[22, 28, 22, 34].Merge = true;
-                worksheet.Cells[23, 28, 23, 34].Merge = true;
-                worksheet.Cells[24, 28, 24, 34].Merge = true;
-                worksheet.Cells[25, 28, 25, 34].Merge = true;
-                worksheet.Cells[26, 28, 26, 34].Merge = true;
-
-                worksheet.Column(1).Width = 5;
-                worksheet.Column(2).Width = 12;
-                worksheet.Column(3).Width = 12;
-                worksheet.Column(4).Width = 12;
-                worksheet.Column(5).Width = 12;
-                worksheet.Column(6).Width = 12;
-                worksheet.Column(7).Width = 12;
-                worksheet.Column(8).Width = 12;
-                worksheet.Column(9).Width = 12;
-                worksheet.Column(10).Width = 12;
-                worksheet.Column(11).Width = 12;
-                worksheet.Column(12).Width = 12;
-
-                worksheet.Column(13).Width = 2;
-                worksheet.Column(14).Width = 2;
-                
-                worksheet.Column(15).Width = 5;
-                worksheet.Column(16).Width = 12;
-                worksheet.Column(17).Width = 12;
-                worksheet.Column(18).Width = 12;
-                worksheet.Column(19).Width = 12;
-                worksheet.Column(20).Width = 12;
-                worksheet.Column(21).Width = 12;
-                worksheet.Column(22).Width = 12;
-                worksheet.Column(23).Width = 12;
-                worksheet.Column(24).Width = 12;
-                worksheet.Column(22).Width = 12;
-                worksheet.Column(23).Width = 12;
-
-                worksheet.Column(25).Width = 2;
-
-                worksheet.Column(26).Width = 5;
-                worksheet.Column(27).Width = 12;
-                worksheet.Column(28).Width = 12;
-                worksheet.Column(29).Width = 12;
-                worksheet.Column(30).Width = 12;
-                worksheet.Column(31).Width = 12;
-                worksheet.Column(32).Width = 12;
-                worksheet.Column(33).Width = 12;
-                worksheet.Column(34).Width = 12;
-                worksheet.Column(35).Width = 12;
-
-                #endregion
-
-                for (int i = 0; i < machineOEE.Count; i++)
+                if (UtilizationRateEmailList == null || UtilizationRateEmailList.Count() == 0)
                 {
-                    worksheet.Cells[i + 2, 1].Value = i + 1;
-                    worksheet.Cells[i + 2, 2].Value = machineOEE[i].Date + " " + machineOEE[i].Shift;
-                    worksheet.Cells[i + 2, 3].Value = (int)machineOEE[i].RunTimeRate;
-                    worksheet.Cells[i + 2, 4].Value = (int)machineOEE[i].IdelTimeRate;
-                    worksheet.Cells[i + 2, 5].Value = (int)machineOEE[i].DownTimeRate;
-                    worksheet.Cells[i + 2, 6].Value = (int)machineOEE[i].LoadMATTimeRate;
-                    worksheet.Cells[i + 2, 7].Value = machineOEE[i].Outputs;
-                    worksheet.Cells[i + 2, 8].Value = machineOEE[i].RunTime / 60;
-                    worksheet.Cells[i + 2, 9].Value = machineOEE[i].IdelTime / 60;
-                    worksheet.Cells[i + 2, 10].Value = machineOEE[i].DownTime / 60;
-                    worksheet.Cells[i + 2, 11].Value = machineOEE[i].LoadMATTime / 60;
-                    worksheet.Cells[i + 2, 12].Value
-                        = (machineOEE[i].RunTime + machineOEE[i].IdelTime + machineOEE[i].DownTime + machineOEE[i].LoadMATTime) / 60;
+                    return false;
                 }
 
-                if (machineHourDatas != null)
+                DateTime startTime = DateTime.Parse($"{date} 08:00:00");
+                DateTime endTime = startTime.AddDays(1);
+                DateTime dataStartTime = endTime.AddDays(-7);
+
+                int count = 0;
+                // 文件夹存储路径
+                string dateNowStr = DateTime.Now.ToString("yyyyMMddHHmmss");
+                string folderPath = $"D:\\ReportForms\\{DateTime.Now:yyyyMM}\\{dateNowStr}";
+                foreach (var UtilizationRateEmail in UtilizationRateEmailList)
                 {
-                    if (machineHourDatas.Count == 24)
+                    count++;
+                    LogerHelper.RecordLogTxt($"EquipmentOperationReport Group-{count} Begin");
+                    if ((!(bool)UtilizationRateEmail["IsSend"]))
                     {
-                        {
-                            int autoSum = 0;
-                            int alarmTimeSum = 0;
-                            int idelSum = 0;
-                            int outputSum = 0;
-                            double ttSum = 0;
-                            int alarmSum = 0;
-                            int loadTimeSum = 0;
-                            for (int i = 0; i < 12; i++)
-                            {
-                                int auto = machineHourDatas[i].AutoRunTime.Value / 60;
-                                autoSum += auto;
-                                int alarmTime = machineHourDatas[i].AlarmTime.Value / 60;
-                                alarmTimeSum += alarmTime;
-                                int idel = machineHourDatas[i].IdleTime.Value / 60;
-                                idelSum += idel;
-                                int output = machineHourDatas[i].OutPut.Value;
-                                outputSum += output;
-                                double tt = machineHourDatas[i].TT;
-                                //ttSum += tt;
-                                int alarm = machineHourDatas[i].AlarmSum.Value;
-                                alarmSum += alarm;
-                                int loadTime = machineHourDatas[i].LoadMATTime.Value / 60;
-                                loadTimeSum += loadTime;
-
-                                worksheet.Cells[i + 3, 15].Value = i + 1;
-                                worksheet.Cells[i + 3, 16].Value = machineHourDatas[i].Period;
-                                worksheet.Cells[i + 3, 17].Value = machineHourDatas[i].ModuleType;
-                                worksheet.Cells[i + 3, 18].Value = auto;
-                                worksheet.Cells[i + 3, 19].Value = alarmTime;
-                                worksheet.Cells[i + 3, 20].Value = idel;
-                                worksheet.Cells[i + 3, 21].Value = loadTime;
-                                worksheet.Cells[i + 3, 22].Value = output;
-                                worksheet.Cells[i + 3, 23].Value = Math.Round(tt, 2);
-                                worksheet.Cells[i + 3, 24].Value = alarm;
-                            }
+                        LogerHelper.RecordLogTxt($"EquipmentOperationReport Group-{count} isSend is False");
+                        continue;
+                    }
+
+                    string path = Path.Combine(folderPath, $"Group-{count}.xlsx");
+                    if (!Directory.Exists(folderPath))
+                        Directory.CreateDirectory(folderPath);
+                    string[] machineIdString = UtilizationRateEmail["MachineIDs"].ToString().Split(',');
+                    if (machineIdString == null || machineIdString.Length == 0)
+                    {
+                        LogerHelper.RecordLogTxt($"EquipmentOperationReport Group-{count} machineIdString is null or length is 0");
+                        continue;
+                    }
 
-                            worksheet.Cells[15, 15].Value = "合计";
-                            worksheet.Cells[15, 15, 15, 17].Merge = true;
-                            worksheet.Cells[15, 18].Value = autoSum;
-                            worksheet.Cells[15, 19].Value = alarmTimeSum;
-                            worksheet.Cells[15, 20].Value = idelSum;
-                            worksheet.Cells[15, 21].Value = loadTimeSum;
-                            worksheet.Cells[15, 22].Value = outputSum;
-                            if (outputSum != 0)
-                                ttSum = autoSum * 60.0 / outputSum;
-                            else
-                                ttSum = 0;
-                            worksheet.Cells[15, 23].Value = Math.Round(ttSum, 2);
-                            worksheet.Cells[15, 24].Value = alarmSum;
-
-                            var faults = _faultService.GetFaultFrequencyTop10(machineId, startTime, startTime.AddHours(12), "安全门,门禁,提示上料,提示卸料");
-
-                            for (int i = 0; i < faults.Count; i++)
-                            {
-                                worksheet.Cells[17 + i, 15].Value = i + 1;
-                                worksheet.Cells[17 + i, 16].Value = faults[i].FaultCode;
-                                worksheet.Cells[17 + i, 17].Value = faults[i].FaultInfo;
-                                worksheet.Cells[17 + i, 24].Value = faults[i].Count;
-                            }
+                    foreach (var machineId in machineIdString)
+                    {
+                        var machine = _unitOfWork.MachineRepository.GetById(machineId);
+                        var line = _unitOfWork.ProductionLineRepository.FirstOrDefault(x => x.Id == machine.ProductionLineId);
+                        var machineOEE = _oeeService.GetOEE(machineId, dataStartTime.ToString("yyyy-MM-dd"), startTime.ToString("yyyy-MM-dd"));
+                        var machineHourDatas = _unitOfWork.MachineOutPutPerHourRepository.GetList(
+                            x =>
+                            x.MachineId == machine.Id &&
+                            x.DataTime >= startTime &&
+                            x.DataTime < endTime).OrderBy(o => o.DataTime).ToList();
+
+                        FileInfo file = new FileInfo(path);
+
+                        //ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
+
+                        using ExcelPackage package = new ExcelPackage(file);
+
+                        ExcelWorksheet worksheet = package.Workbook.Worksheets.Add($"{line.Name} {machine.Name}");
+                        worksheet.View.ZoomScale = 80;
+
+                        worksheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
+
+                        #region tab header
+
+                        worksheet.Cells[1, 1].Value = "NO";
+                        worksheet.Cells[1, 2].Value = "时间";
+                        worksheet.Cells[1, 3].Value = "稼动率(%)";
+                        worksheet.Cells[1, 4].Value = "待机率(%)";
+                        worksheet.Cells[1, 5].Value = "报警率(%)";
+                        worksheet.Cells[1, 6].Value = "换料率(%)";
+                        worksheet.Cells[1, 7].Value = "产能(pcs)";
+                        worksheet.Cells[1, 8].Value = "稼动(min)";
+                        worksheet.Cells[1, 9].Value = "待机(min)";
+                        worksheet.Cells[1, 10].Value = "报警(min)";
+                        worksheet.Cells[1, 11].Value = "换料(min)";
+                        worksheet.Cells[1, 12].Value = "合计(min)";
+
+                        worksheet.Cells[1, 15].Value = $"{startTime:yyyy-MM-dd} 早班";
+                        worksheet.Cells[1, 15, 1, 24].Merge = true;
+
+                        worksheet.Cells[2, 15].Value = "NO";
+                        worksheet.Cells[2, 16].Value = "时段";
+                        worksheet.Cells[2, 17].Value = "机种";
+                        worksheet.Cells[2, 18].Value = "运行时间";
+                        worksheet.Cells[2, 19].Value = "报警时间";
+                        worksheet.Cells[2, 20].Value = "待料时间";
+                        worksheet.Cells[2, 21].Value = "换料时间";
+                        worksheet.Cells[2, 22].Value = "产能";
+                        worksheet.Cells[2, 23].Value = "TT";
+                        worksheet.Cells[2, 24].Value = "报警次数";
+
+                        worksheet.Cells[16, 15].Value = "NO";
+                        worksheet.Cells[16, 16].Value = "故障码";
+                        worksheet.Cells[16, 17].Value = "故障详情";
+                        worksheet.Cells[16, 24].Value = "报警次数";
+
+                        worksheet.Cells[16, 17, 16, 23].Merge = true;
+                        worksheet.Cells[17, 17, 17, 23].Merge = true;
+                        worksheet.Cells[18, 17, 18, 23].Merge = true;
+                        worksheet.Cells[19, 17, 19, 23].Merge = true;
+                        worksheet.Cells[20, 17, 20, 23].Merge = true;
+                        worksheet.Cells[21, 17, 21, 23].Merge = true;
+                        worksheet.Cells[22, 17, 22, 23].Merge = true;
+                        worksheet.Cells[23, 17, 23, 23].Merge = true;
+                        worksheet.Cells[24, 17, 24, 23].Merge = true;
+                        worksheet.Cells[25, 17, 25, 23].Merge = true;
+                        worksheet.Cells[26, 17, 26, 23].Merge = true;
+
+                        worksheet.Cells[1, 26].Value = $"{startTime:yyyy-MM-dd} 夜班";
+                        worksheet.Cells[1, 26, 1, 35].Merge = true;
+
+                        worksheet.Cells[2, 26].Value = "NO";
+                        worksheet.Cells[2, 27].Value = "时段";
+                        worksheet.Cells[2, 28].Value = "机种";
+                        worksheet.Cells[2, 29].Value = "运行时间";
+                        worksheet.Cells[2, 30].Value = "报警时间";
+                        worksheet.Cells[2, 31].Value = "待料时间";
+                        worksheet.Cells[2, 32].Value = "换料时间";
+                        worksheet.Cells[2, 33].Value = "产能";
+                        worksheet.Cells[2, 34].Value = "TT";
+                        worksheet.Cells[2, 35].Value = "报警次数";
+
+                        worksheet.Cells[16, 26].Value = "NO";
+                        worksheet.Cells[16, 27].Value = "故障码";
+                        worksheet.Cells[16, 28].Value = "故障详情";
+                        worksheet.Cells[16, 35].Value = "报警次数";
+
+                        worksheet.Cells[16, 28, 16, 34].Merge = true;
+                        worksheet.Cells[17, 28, 17, 34].Merge = true;
+                        worksheet.Cells[18, 28, 18, 34].Merge = true;
+                        worksheet.Cells[19, 28, 19, 34].Merge = true;
+                        worksheet.Cells[20, 28, 20, 34].Merge = true;
+                        worksheet.Cells[21, 28, 21, 34].Merge = true;
+                        worksheet.Cells[22, 28, 22, 34].Merge = true;
+                        worksheet.Cells[23, 28, 23, 34].Merge = true;
+                        worksheet.Cells[24, 28, 24, 34].Merge = true;
+                        worksheet.Cells[25, 28, 25, 34].Merge = true;
+                        worksheet.Cells[26, 28, 26, 34].Merge = true;
+
+                        worksheet.Column(1).Width = 5;
+                        worksheet.Column(2).Width = 12;
+                        worksheet.Column(3).Width = 12;
+                        worksheet.Column(4).Width = 12;
+                        worksheet.Column(5).Width = 12;
+                        worksheet.Column(6).Width = 12;
+                        worksheet.Column(7).Width = 12;
+                        worksheet.Column(8).Width = 12;
+                        worksheet.Column(9).Width = 12;
+                        worksheet.Column(10).Width = 12;
+                        worksheet.Column(11).Width = 12;
+                        worksheet.Column(12).Width = 12;
+
+                        worksheet.Column(13).Width = 2;
+                        worksheet.Column(14).Width = 2;
+
+                        worksheet.Column(15).Width = 5;
+                        worksheet.Column(16).Width = 12;
+                        worksheet.Column(17).Width = 12;
+                        worksheet.Column(18).Width = 12;
+                        worksheet.Column(19).Width = 12;
+                        worksheet.Column(20).Width = 12;
+                        worksheet.Column(21).Width = 12;
+                        worksheet.Column(22).Width = 12;
+                        worksheet.Column(23).Width = 12;
+                        worksheet.Column(24).Width = 12;
+                        worksheet.Column(22).Width = 12;
+                        worksheet.Column(23).Width = 12;
+
+                        worksheet.Column(25).Width = 2;
+
+                        worksheet.Column(26).Width = 5;
+                        worksheet.Column(27).Width = 12;
+                        worksheet.Column(28).Width = 12;
+                        worksheet.Column(29).Width = 12;
+                        worksheet.Column(30).Width = 12;
+                        worksheet.Column(31).Width = 12;
+                        worksheet.Column(32).Width = 12;
+                        worksheet.Column(33).Width = 12;
+                        worksheet.Column(34).Width = 12;
+                        worksheet.Column(35).Width = 12;
+
+                        #endregion
+
+                        for (int i = 0; i < machineOEE.Count; i++)
+                        {
+                            worksheet.Cells[i + 2, 1].Value = i + 1;
+                            worksheet.Cells[i + 2, 2].Value = machineOEE[i].Date + " " + machineOEE[i].Shift;
+                            worksheet.Cells[i + 2, 3].Value = (int)machineOEE[i].RunTimeRate;
+                            worksheet.Cells[i + 2, 4].Value = (int)machineOEE[i].IdelTimeRate;
+                            worksheet.Cells[i + 2, 5].Value = (int)machineOEE[i].DownTimeRate;
+                            worksheet.Cells[i + 2, 6].Value = (int)machineOEE[i].LoadMATTimeRate;
+                            worksheet.Cells[i + 2, 7].Value = machineOEE[i].Outputs;
+                            worksheet.Cells[i + 2, 8].Value = machineOEE[i].RunTime / 60;
+                            worksheet.Cells[i + 2, 9].Value = machineOEE[i].IdelTime / 60;
+                            worksheet.Cells[i + 2, 10].Value = machineOEE[i].DownTime / 60;
+                            worksheet.Cells[i + 2, 11].Value = machineOEE[i].LoadMATTime / 60;
+                            worksheet.Cells[i + 2, 12].Value
+                                = (machineOEE[i].RunTime + machineOEE[i].IdelTime + machineOEE[i].DownTime + machineOEE[i].LoadMATTime) / 60;
                         }
 
+                        if (machineHourDatas != null)
                         {
-                            int autoSum = 0;
-                            int alarmTimeSum = 0;
-                            int idelSum = 0;
-                            int outputSum = 0;
-                            double ttSum = 0;
-                            int alarmSum = 0;
-                            int loadTimeSum = 0;
-                            for (int i = 12; i < 24; i++)
+                            if (machineHourDatas.Count == 24)
                             {
-                                int auto = machineHourDatas[i].AutoRunTime.Value / 60;
-                                autoSum += auto;
-                                int alarmTime = machineHourDatas[i].AlarmTime.Value / 60;
-                                alarmTimeSum += alarmTime;
-                                int idel = machineHourDatas[i].IdleTime.Value / 60;
-                                idelSum += idel;
-                                int output = machineHourDatas[i].OutPut.Value;
-                                outputSum += output;
-                                double tt = machineHourDatas[i].TT;
-                                //ttSum += tt;
-                                int alarm = machineHourDatas[i].AlarmSum.Value;
-                                alarmSum += alarm;
-                                int loadTime = machineHourDatas[i].LoadMATTime.Value / 60;
-                                loadTimeSum += loadTime;
-
-                                worksheet.Cells[i - 12 + 3, 26].Value = i + 1;
-                                worksheet.Cells[i - 12 + 3, 27].Value = machineHourDatas[i].Period;
-                                worksheet.Cells[i - 12 + 3, 28].Value = machineHourDatas[i].ModuleType;
-                                worksheet.Cells[i - 12 + 3, 29].Value = auto;
-                                worksheet.Cells[i - 12 + 3, 30].Value = alarmTime;
-                                worksheet.Cells[i - 12 + 3, 31].Value = idel;
-                                worksheet.Cells[i - 12 + 3, 32].Value = loadTime;
-                                worksheet.Cells[i - 12 + 3, 33].Value = output;
-                                worksheet.Cells[i - 12 + 3, 34].Value = Math.Round(tt, 2);
-                                worksheet.Cells[i - 12 + 3, 35].Value = alarm;
+                                {
+                                    int autoSum = 0;
+                                    int alarmTimeSum = 0;
+                                    int idelSum = 0;
+                                    int outputSum = 0;
+                                    double ttSum = 0;
+                                    int alarmSum = 0;
+                                    int loadTimeSum = 0;
+                                    for (int i = 0; i < 12; i++)
+                                    {
+                                        int auto = machineHourDatas[i].AutoRunTime.Value / 60;
+                                        autoSum += auto;
+                                        int alarmTime = machineHourDatas[i].AlarmTime.Value / 60;
+                                        alarmTimeSum += alarmTime;
+                                        int idel = machineHourDatas[i].IdleTime.Value / 60;
+                                        idelSum += idel;
+                                        int output = machineHourDatas[i].OutPut.Value;
+                                        outputSum += output;
+                                        double tt = machineHourDatas[i].TT;
+                                        //ttSum += tt;
+                                        int alarm = machineHourDatas[i].AlarmSum.Value;
+                                        alarmSum += alarm;
+                                        int loadTime = machineHourDatas[i].LoadMATTime.Value / 60;
+                                        loadTimeSum += loadTime;
+
+                                        worksheet.Cells[i + 3, 15].Value = i + 1;
+                                        worksheet.Cells[i + 3, 16].Value = machineHourDatas[i].Period;
+                                        worksheet.Cells[i + 3, 17].Value = machineHourDatas[i].ModuleType;
+                                        worksheet.Cells[i + 3, 18].Value = auto;
+                                        worksheet.Cells[i + 3, 19].Value = alarmTime;
+                                        worksheet.Cells[i + 3, 20].Value = idel;
+                                        worksheet.Cells[i + 3, 21].Value = loadTime;
+                                        worksheet.Cells[i + 3, 22].Value = output;
+                                        worksheet.Cells[i + 3, 23].Value = Math.Round(tt, 2);
+                                        worksheet.Cells[i + 3, 24].Value = alarm;
+                                    }
+
+                                    worksheet.Cells[15, 15].Value = "合计";
+                                    worksheet.Cells[15, 15, 15, 17].Merge = true;
+                                    worksheet.Cells[15, 18].Value = autoSum;
+                                    worksheet.Cells[15, 19].Value = alarmTimeSum;
+                                    worksheet.Cells[15, 20].Value = idelSum;
+                                    worksheet.Cells[15, 21].Value = loadTimeSum;
+                                    worksheet.Cells[15, 22].Value = outputSum;
+                                    if (outputSum != 0)
+                                        ttSum = autoSum * 60.0 / outputSum;
+                                    else
+                                        ttSum = 0;
+                                    worksheet.Cells[15, 23].Value = Math.Round(ttSum, 2);
+                                    worksheet.Cells[15, 24].Value = alarmSum;
+
+                                    var faults = _faultService.GetFaultFrequencyTop10(machineId, startTime, startTime.AddHours(12), "安全门,门禁,提示上料,提示卸料,门锁,门打开,请选择LOT生产");
+
+                                    for (int i = 0; i < faults.Count; i++)
+                                    {
+                                        worksheet.Cells[17 + i, 15].Value = i + 1;
+                                        worksheet.Cells[17 + i, 16].Value = faults[i].FaultCode;
+                                        worksheet.Cells[17 + i, 17].Value = faults[i].FaultInfo;
+                                        worksheet.Cells[17 + i, 24].Value = faults[i].Count;
+                                    }
+                                }
+
+                                {
+                                    int autoSum = 0;
+                                    int alarmTimeSum = 0;
+                                    int idelSum = 0;
+                                    int outputSum = 0;
+                                    double ttSum = 0;
+                                    int alarmSum = 0;
+                                    int loadTimeSum = 0;
+                                    for (int i = 12; i < 24; i++)
+                                    {
+                                        int auto = machineHourDatas[i].AutoRunTime.Value / 60;
+                                        autoSum += auto;
+                                        int alarmTime = machineHourDatas[i].AlarmTime.Value / 60;
+                                        alarmTimeSum += alarmTime;
+                                        int idel = machineHourDatas[i].IdleTime.Value / 60;
+                                        idelSum += idel;
+                                        int output = machineHourDatas[i].OutPut.Value;
+                                        outputSum += output;
+                                        double tt = machineHourDatas[i].TT;
+                                        //ttSum += tt;
+                                        int alarm = machineHourDatas[i].AlarmSum.Value;
+                                        alarmSum += alarm;
+                                        int loadTime = machineHourDatas[i].LoadMATTime.Value / 60;
+                                        loadTimeSum += loadTime;
+
+                                        worksheet.Cells[i - 12 + 3, 26].Value = i + 1;
+                                        worksheet.Cells[i - 12 + 3, 27].Value = machineHourDatas[i].Period;
+                                        worksheet.Cells[i - 12 + 3, 28].Value = machineHourDatas[i].ModuleType;
+                                        worksheet.Cells[i - 12 + 3, 29].Value = auto;
+                                        worksheet.Cells[i - 12 + 3, 30].Value = alarmTime;
+                                        worksheet.Cells[i - 12 + 3, 31].Value = idel;
+                                        worksheet.Cells[i - 12 + 3, 32].Value = loadTime;
+                                        worksheet.Cells[i - 12 + 3, 33].Value = output;
+                                        worksheet.Cells[i - 12 + 3, 34].Value = Math.Round(tt, 2);
+                                        worksheet.Cells[i - 12 + 3, 35].Value = alarm;
+                                    }
+
+                                    worksheet.Cells[15, 26].Value = "合计";
+                                    worksheet.Cells[15, 26, 15, 28].Merge = true;
+                                    worksheet.Cells[15, 29].Value = autoSum;
+                                    worksheet.Cells[15, 30].Value = alarmTimeSum;
+                                    worksheet.Cells[15, 31].Value = idelSum;
+                                    worksheet.Cells[15, 32].Value = loadTimeSum;
+                                    worksheet.Cells[15, 33].Value = outputSum;
+                                    if (outputSum != 0)
+                                        ttSum = autoSum * 60.0 / outputSum;
+                                    else
+                                        ttSum = 0;
+                                    worksheet.Cells[15, 34].Value = Math.Round(ttSum, 2);
+                                    worksheet.Cells[15, 35].Value = alarmSum;
+
+                                    var faults = _faultService.GetFaultFrequencyTop10(machineId, startTime.AddHours(12), startTime.AddHours(24), "安全门,门禁,提示上料,提示卸料,门锁,门打开,请选择LOT生产");
+
+                                    for (int i = 0; i < faults.Count; i++)
+                                    {
+                                        worksheet.Cells[17 + i, 26].Value = i + 1;
+                                        worksheet.Cells[17 + i, 27].Value = faults[i].FaultCode;
+                                        worksheet.Cells[17 + i, 28].Value = faults[i].FaultInfo;
+                                        worksheet.Cells[17 + i, 35].Value = faults[i].Count;
+                                    }
+                                }
                             }
+                        }
 
-                            worksheet.Cells[15, 26].Value = "合计";
-                            worksheet.Cells[15, 26, 15, 28].Merge = true;
-                            worksheet.Cells[15, 29].Value = autoSum;
-                            worksheet.Cells[15, 30].Value = alarmTimeSum;
-                            worksheet.Cells[15, 31].Value = idelSum;
-                            worksheet.Cells[15, 32].Value = loadTimeSum;
-                            worksheet.Cells[15, 33].Value = outputSum;
-                            if (outputSum != 0)
-                                ttSum = autoSum * 60.0 / outputSum;
-                            else
-                                ttSum = 0;
-                            worksheet.Cells[15, 34].Value = Math.Round(ttSum, 2);
-                            worksheet.Cells[15, 35].Value = alarmSum;
-
-                            var faults = _faultService.GetFaultFrequencyTop10(machineId, startTime.AddHours(12), startTime.AddHours(24), "安全门,门禁,提示上料,提示卸料");
-
-                            for (int i = 0; i < faults.Count; i++)
-                            {
-                                worksheet.Cells[17 + i, 26].Value = i + 1;
-                                worksheet.Cells[17 + i, 27].Value = faults[i].FaultCode;
-                                worksheet.Cells[17 + i, 28].Value = faults[i].FaultInfo;
-                                worksheet.Cells[17 + i, 35].Value = faults[i].Count;
-                            }
+                        //var faultFrequencys = _faultService.GetFaultFrequencyTop10ByShift(
+                        //    machine.Id, dataStartTime, endTime, "安全门,门禁,提示上料,提示卸料,门锁");
+
+                        //var tables = new FaultFrequencyByShiftTable(faultFrequencys);
+
+                        //ExcelWorksheet worksheet1 = package.Workbook.Worksheets.Add($"{line.Name} {machine.Name} 报警");
+                        //worksheet1.View.ZoomScale = 80;
+                        //worksheet1.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
+
+                        //worksheet1.Column(1).Width = 5;
+                        //worksheet1.Column(2).Width = 10;
+                        //worksheet1.Column(3).Width = 30;
+
+                        //worksheet1.Cells[1, 1].Value = "NO";
+                        //worksheet1.Cells[1, 2].Value = "Code";
+                        //worksheet1.Cells[1, 3].Value = "Name";
+
+                        //for (int i = 0; i < tables.Shifts.Count(); i++)
+                        //{
+                        //    worksheet1.Column(i + 4).Width = 20;
+                        //    worksheet1.Cells[1, i + 4].Value = tables.Shifts[i];
+                        //}
+
+                        //for (int i = 0; i < tables.Nos.Count; i++)
+                        //{
+                        //    worksheet1.Cells[i + 2, 1].Value = tables.Nos[i];
+                        //    worksheet1.Cells[i + 2, 2].Value = tables.FaultCodes[i];
+                        //    worksheet1.Cells[i + 2, 3].Value = tables.FaultInfos[i];
+                        //    for (int j = 0; j < tables.Shifts.Count(); j++)
+                        //    {
+                        //        worksheet1.Cells[i + 2, j + 4].Value = tables.Counts[j, i];
+                        //    }
+                        //}
+
+                        //var databar = worksheet1.Cells["D2:Q33"].ConditionalFormatting.AddDatabar(Color.Red);
+
+                        //// 创建数据条条件格式对象
+                        //ExcelConditionalFormattingDataBar dataBarConditionalFormatting = (ExcelConditionalFormattingDataBar)worksheet.Cells["D2:Q33"].ConditionalFormatting;
+                        //// 设置渐变填充
+                        //dataBarConditionalFormatting.BarFill.Type = ExcelFillStyle.DarkGray;
+
+                        ExcelChartSerie chartSerie;
+                        ExcelChart chart = worksheet.Drawings.AddChart("chart", eChartType.ColumnStacked);
+
+                        chart.YAxis.MinValue = 0;
+                        chart.YAxis.MaxValue = 100;
+                        chart.YAxis.Format = "0 \"%\"";
+
+                        chart.Legend.Position = eLegendPosition.Bottom;
+                        chart.Legend.Add();
+                        chart.Title.Text = "设备稼动曲线";    //设置图表的名称   
+                        chart.SetPosition(540, 20);         //设置图表位置   
+                        chart.SetSize(1000, 400);           //设置图表大小   
+                        chart.ShowHiddenData = true;
+
+                        chartSerie = chart.Series.Add(worksheet.Cells[2, 3, machineOEE.Count + 1, 3], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
+                        chartSerie.HeaderAddress = worksheet.Cells[1, 3];
+                        chartSerie = chart.Series.Add(worksheet.Cells[2, 4, machineOEE.Count + 1, 4], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
+                        chartSerie.HeaderAddress = worksheet.Cells[1, 4];
+                        chartSerie = chart.Series.Add(worksheet.Cells[2, 5, machineOEE.Count + 1, 5], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
+                        chartSerie.HeaderAddress = worksheet.Cells[1, 5];
+                        chartSerie = chart.Series.Add(worksheet.Cells[2, 6, machineOEE.Count + 1, 6], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
+                        chartSerie.HeaderAddress = worksheet.Cells[1, 6];
+
+                        //var chartType2 = chart.PlotArea.ChartTypes.Add(eChartType.Line);
+                        //chartType2.UseSecondaryAxis = true;
+                        //chartType2.YAxis.Format = "0 \"pcs\"";
+                        //chartSerie = chartType2.Series.Add(worksheet.Cells[2, 6, machineOEE.Count + 1, 6], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
+                        //chartSerie.HeaderAddress = worksheet.Cells[1, 6];
+
+                        foreach (var item in chart.Series)
+                        {
+                            var pieSerie = (ExcelBarChartSerie)item;
+                            pieSerie.DataLabel.ShowValue = true;
                         }
-                    }          
-                }
 
-                //var faultFrequencys = _faultService.GetFaultFrequencyTop10ByShift(
-                //    machine.Id, dataStartTime, endTime, "安全门,门禁,提示上料,提示卸料");
-
-                //var tables = new FaultFrequencyByShiftTable(faultFrequencys);
-
-                //ExcelWorksheet worksheet1 = package.Workbook.Worksheets.Add($"{line.Name} {machine.Name} 报警");
-                //worksheet1.View.ZoomScale = 80;
-                //worksheet1.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
-
-                //worksheet1.Column(1).Width = 5;
-                //worksheet1.Column(2).Width = 10;
-                //worksheet1.Column(3).Width = 30;
-
-                //worksheet1.Cells[1, 1].Value = "NO";
-                //worksheet1.Cells[1, 2].Value = "Code";
-                //worksheet1.Cells[1, 3].Value = "Name";
-
-                //for (int i = 0; i < tables.Shifts.Count(); i++)
-                //{
-                //    worksheet1.Column(i + 4).Width = 20;
-                //    worksheet1.Cells[1, i + 4].Value = tables.Shifts[i];
-                //}
-                
-                //for (int i = 0; i < tables.Nos.Count; i++)
-                //{
-                //    worksheet1.Cells[i + 2, 1].Value = tables.Nos[i];
-                //    worksheet1.Cells[i + 2, 2].Value = tables.FaultCodes[i];
-                //    worksheet1.Cells[i + 2, 3].Value = tables.FaultInfos[i];
-                //    for (int j = 0; j < tables.Shifts.Count(); j++)
-                //    {
-                //        worksheet1.Cells[i + 2, j + 4].Value = tables.Counts[j, i];
-                //    }
-                //}
-
-                //var databar = worksheet1.Cells["D2:Q33"].ConditionalFormatting.AddDatabar(Color.Red);
-
-                //// 创建数据条条件格式对象
-                //ExcelConditionalFormattingDataBar dataBarConditionalFormatting = (ExcelConditionalFormattingDataBar)worksheet.Cells["D2:Q33"].ConditionalFormatting;
-                //// 设置渐变填充
-                //dataBarConditionalFormatting.BarFill.Type = ExcelFillStyle.DarkGray;
-
-                ExcelChartSerie chartSerie;
-                ExcelChart chart = worksheet.Drawings.AddChart("chart", eChartType.ColumnStacked);
-
-                chart.YAxis.MinValue = 0;
-                chart.YAxis.MaxValue = 100;
-                chart.YAxis.Format = "0 \"%\"";
-
-                chart.Legend.Position = eLegendPosition.Bottom;
-                chart.Legend.Add();
-                chart.Title.Text = "设备稼动曲线";    //设置图表的名称   
-                chart.SetPosition(540, 20);         //设置图表位置   
-                chart.SetSize(1000, 400);           //设置图表大小   
-                chart.ShowHiddenData = true;
-
-                chartSerie = chart.Series.Add(worksheet.Cells[2, 3, machineOEE.Count + 1, 3], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
-                chartSerie.HeaderAddress = worksheet.Cells[1, 3];
-                chartSerie = chart.Series.Add(worksheet.Cells[2, 4, machineOEE.Count + 1, 4], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
-                chartSerie.HeaderAddress = worksheet.Cells[1, 4];
-                chartSerie = chart.Series.Add(worksheet.Cells[2, 5, machineOEE.Count + 1, 5], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
-                chartSerie.HeaderAddress = worksheet.Cells[1, 5];
-                chartSerie = chart.Series.Add(worksheet.Cells[2, 6, machineOEE.Count + 1, 6], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
-                chartSerie.HeaderAddress = worksheet.Cells[1, 6];
-
-                //var chartType2 = chart.PlotArea.ChartTypes.Add(eChartType.Line);
-                //chartType2.UseSecondaryAxis = true;
-                //chartType2.YAxis.Format = "0 \"pcs\"";
-                //chartSerie = chartType2.Series.Add(worksheet.Cells[2, 6, machineOEE.Count + 1, 6], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
-                //chartSerie.HeaderAddress = worksheet.Cells[1, 6];
-
-                foreach (var item in chart.Series)
-                {
-                    var pieSerie = (ExcelBarChartSerie)item;
-                    pieSerie.DataLabel.ShowValue = true;
-                }
+                        ExcelChart chart1 = worksheet.Drawings.AddChart("chart1", eChartType.ColumnStacked);
+                        chart1.Legend.Position = eLegendPosition.Bottom;
+                        chart1.Legend.Add();
+                        chart1.Title.Text = "设备产能曲线";    //设置图表的名称   
+                        chart1.SetPosition(540, 1030);         //设置图表位置   
+                        chart1.SetSize(1000, 400);           //设置图表大小   
+                        chart1.ShowHiddenData = true;
+                        chart1.YAxis.Format = "0 \"pcs\"";
+                        ExcelChartSerie chartSerie1;
+                        chartSerie1 = chart1.Series.Add(worksheet.Cells[2, 7, machineOEE.Count + 1, 7], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
+                        chartSerie1.HeaderAddress = worksheet.Cells[1, 7];
+                        foreach (var item in chart1.Series)
+                        {
+                            var pieSerie = (ExcelBarChartSerie)item;
+                            pieSerie.DataLabel.ShowValue = true;
+                        }
 
-                ExcelChart chart1 = worksheet.Drawings.AddChart("chart1", eChartType.ColumnStacked);
-                chart1.Legend.Position = eLegendPosition.Bottom;
-                chart1.Legend.Add();
-                chart1.Title.Text = "设备产能曲线";    //设置图表的名称   
-                chart1.SetPosition(540, 1030);         //设置图表位置   
-                chart1.SetSize(1000, 400);           //设置图表大小   
-                chart1.ShowHiddenData = true;
-                chart1.YAxis.Format = "0 \"pcs\"";
-                ExcelChartSerie chartSerie1;
-                chartSerie1 = chart1.Series.Add(worksheet.Cells[2, 7, machineOEE.Count + 1, 7], worksheet.Cells[2, 2, machineOEE.Count + 1, 2]);
-                chartSerie1.HeaderAddress = worksheet.Cells[1, 7];
-                foreach (var item in chart1.Series)
-                {
-                    var pieSerie = (ExcelBarChartSerie)item;
-                    pieSerie.DataLabel.ShowValue = true;
+                        package.Save();
+                    }
+                    string ReceiverAppSettingName = UtilizationRateEmail["ReceiverAppSettingName"].ToString();
+                    if (ReceiverAppSettingName == null || String.IsNullOrEmpty(ReceiverAppSettingName))
+                    {
+                        LogerHelper.RecordLogTxt($"EquipmentOperationReport Group-{count} ReceiverAppSettingName is null");
+                        continue;
+                    }
+                    SendMail(
+                        MailType.Message,
+                        ReceiverAppSettingName,
+                        "",
+                        "",
+                        "EQP.EAPAUTO01@eink.com",
+                        "",
+                        $"稼动数据 -- {dateNowStr}",
+                        "",
+                        new string[] { path },
+                        new string[] { dateNowStr },
+                        Encoding.UTF8);
+
+                    LogerHelper.RecordLogTxt($"EquipmentOperationReport Group-{count} Send over, ReceiverAppSettingName:【{ReceiverAppSettingName}】, file:【{path}】, EmailFileName:【{dateNowStr}】");
                 }
-
-                package.Save();
-            }
-
-       
-
-            if (!isSend)
-            {
-                return false;
+                return true;
             }
-
-            if (string.IsNullOrEmpty(receiverAppSettingName))
+            catch (Exception ex)
             {
+                LogerHelper.RecordLogTxt($"EquipmentOperationReport Exception, Message:{ex.Message}, StackTrace:{ex.StackTrace}");
                 return false;
             }
-
-            SendMail(
-                MailType.Message,
-                receiverAppSettingName,
-                "",
-                "",
-                "EQP.EAPAUTO01@eink.com",
-                "",
-                $"稼动数据 -- {excelName}",
-                "",
-                new string[] { path },
-                Encoding.UTF8);
-
-            return true;
         }
     }
 }

+ 8 - 2
ProductionLineMonitor.Application/Services/FaultService/FaultService.cs

@@ -592,11 +592,15 @@ namespace ProductionLineMonitor.Application.Services.FaultService
                     }
 
                     if (faultRecord.StartTime != null && faultRecord.EndTime != null)
-                        faultRecord.Duration = (faultRecord.EndTime.Value - faultRecord.StartTime.Value).TotalMinutes;
+                        if (faultRecord.EndTime.Value == Convert.ToDateTime("1900-01-01 00:00:00"))
+                            faultRecord.Duration = (DateTime.Now - faultRecord.StartTime.Value).TotalMinutes;
+                        else
+                            faultRecord.Duration = (faultRecord.EndTime.Value - faultRecord.StartTime.Value).TotalMinutes;
                     else
                         faultRecord.Duration = 0;
                 }
 
+                dtos = dtos.Where(x => x.FaultLevel != 1).ToList();
                 if (keywords != null)
                 {
                     string[] strs = keywords.Split(',');
@@ -676,18 +680,20 @@ namespace ProductionLineMonitor.Application.Services.FaultService
                 var mfc = mfcs.FirstOrDefault(x => x.FaultCode == item.FaultCode);
                 if (mfc == null)
                 {
+                    item.AlarmLevel = Core.Enums.AlarmLevelEnum.Error;
                     item.FaultInfo = item.FaultCode.ToString() + " " + "未知故障!";
                 }
                 else
                 {
                     item.FaultInfo = item.FaultCode.ToString() + " " + mfc.FaultInfo;
+                    item.AlarmLevel = mfc.FaultLevel.Value;
                 }
             }
 
             if (keywords != null)
             {
                 string[] strs = keywords.Split(',');
-                faultFrequencies = faultFrequencies.Where(x =>
+                faultFrequencies = faultFrequencies.Where(x => x.AlarmLevel != Core.Enums.AlarmLevelEnum.Warning &&
                     strs.All(s => !x.FaultInfo.Contains(s))).ToList();
             }
 

+ 39 - 0
ProductionLineMonitor.Application/Services/LogerHelper.cs

@@ -0,0 +1,39 @@
+using System;
+using System.IO;
+
+namespace ProductionLineMonitor.Application.Services
+{
+    public static class LogerHelper
+    {
+        public static void RecordLogTxt(string message)
+        {
+            string strPath;
+            DateTime dt = DateTime.Now;
+            try
+            {
+                strPath = Directory.GetCurrentDirectory() + "\\Log";
+
+                if (Directory.Exists(strPath) == false)
+                {
+                    Directory.CreateDirectory(strPath);
+                }
+                //strPath = strPath + "\\" + dt.ToString("yyyy") + "\\" + dt.ToString("MM");
+                strPath = strPath + "\\" + dt.ToString("yyyy");
+
+                if (Directory.Exists(strPath) == false)
+                {
+                    Directory.CreateDirectory(strPath);
+                }
+                strPath = strPath + "\\" + dt.Year.ToString() + "-" + dt.Month.ToString() + "-" + dt.Day.ToString() + ".txt";
+
+                StreamWriter FileWriter = new StreamWriter(strPath, true);
+                FileWriter.WriteLine("[" + dt.ToString("yyyy-MM-dd HH:mm:ss") + "]  " + message);
+                FileWriter.Close();
+            }
+            catch (Exception ex)
+            {
+                string str = ex.Message.ToString();
+            }
+        }
+    }
+}

+ 4 - 1
ProductionLineMonitor.Core/Dtos/MachineFaultRecordDto.cs

@@ -1,6 +1,8 @@
-using ProductionLineMonitor.Core.Models;
+using ProductionLineMonitor.Core.Enums;
+using ProductionLineMonitor.Core.Models;
 using System.Collections.Generic;
 using System.Linq;
+using System.Reflection;
 
 namespace ProductionLineMonitor.Core.Dtos
 {
@@ -61,6 +63,7 @@ namespace ProductionLineMonitor.Core.Dtos
         public int FaultCode { get; set; }
         public string FaultInfo { get; set; }
         public int Count { get; set; }
+        public AlarmLevelEnum AlarmLevel { get; set; }
     }
 
     public class FaultFrequencyByShift

+ 4 - 2
ProductionLineMonitor.Core/Utils/EmailHelper.cs

@@ -47,10 +47,11 @@ namespace ProductionLineMonitor.Core.Utils
         /// <param name="MailSubject">邮件标题</param>
         /// <param name="MailBody">邮件正文</param>
         /// <param name="AttachmentFilePath">邮件附件绝对路径地址</param>
+        /// <param name="AttachmentFileName">邮件附件命名</param>
         /// <param name="encoding">邮件编码格式</param>
         /// <returns></returns>
         public static void SendMail(MailType mailtype, string ReceiverAppSettingName, string CCAppSettingName, string BCCAppSettingName,
-            string SenderAppSettingName, string MailSenderName, string MailSubject, string MailBody, string[] AttachmentFilePath, Encoding encoding)
+            string SenderAppSettingName, string MailSenderName, string MailSubject, string MailBody, string[] AttachmentFilePath, string[] AttachmentFileName, Encoding encoding)
         {
             MailMessage msg = new MailMessage();
 
@@ -81,7 +82,7 @@ namespace ProductionLineMonitor.Core.Utils
                 {
                     if (File.Exists(AttachmentFilePath[i]))
                     {
-                        msg.Attachments.Add(new Attachment(new FileStream(AttachmentFilePath[i], FileMode.Open), Path.GetFileName(AttachmentFilePath[i])));
+                        msg.Attachments.Add(new Attachment(new FileStream(AttachmentFilePath[i], FileMode.Open), $"{AttachmentFileName[i]}.xlsx"));
                     }
                 }
             }
@@ -110,6 +111,7 @@ namespace ProductionLineMonitor.Core.Utils
             {
                 // 发送
                 client.Send(msg);
+                msg.Attachments.Dispose();
             }
             catch (Exception ex)
             {

+ 2 - 0
ProductionLineMonitor.Web/Config.cs

@@ -3,5 +3,7 @@
     public class Config
     {
         public static string SafeguardUrl { get; set; }
+
+        public static string SafeguardUsername { get; set; }
     }
 }

+ 4 - 1
ProductionLineMonitor.Web/Controllers/FaultController.cs

@@ -71,6 +71,7 @@ namespace ProductionLineMonitor.Web.Controllers
                     MachineFaultRecordDtoV1 m = new MachineFaultRecordDtoV1()
                     {
                         FaultCode = fault.FaultCode,
+                        FaultLevel = 0
                     };
                     if (fault.StartTime.Value.Hour >= 8 && fault.StartTime.Value.Hour < 20)
                     {
@@ -100,10 +101,12 @@ namespace ProductionLineMonitor.Web.Controllers
                 var mfc = mfcs.FirstOrDefault(x => x.FaultCode == item.FaultCode);
                 if (mfc == null)
                 {
+                    item.FaultLevel = 0;
                     item.FaultInfo = item.FaultCode.ToString() + " " + "未知故障!";
                 }
                 else
                 {
+                    item.FaultLevel = (int?)mfc.FaultLevel;
                     item.FaultInfo = item.FaultCode.ToString() + " " + mfc.FaultInfo;
                 }
             }
@@ -112,7 +115,7 @@ namespace ProductionLineMonitor.Web.Controllers
             {
                 string[] strs = filterString.Split(',');
                 machineFaultRecordDtos = machineFaultRecordDtos.Where(x =>
-                    strs.All(s => !x.FaultInfo.Contains(s))).ToList();
+                    strs.All(s => !x.FaultInfo.Contains(s) && x.FaultLevel != 1)).ToList();
             } 
 
             machineFaultRecordDtos = machineFaultRecordDtos.OrderByDescending(o => o.Count).Take(10).ToList();

+ 1 - 0
ProductionLineMonitor.Web/HostedServices/DispatchService.cs

@@ -59,6 +59,7 @@ namespace ProductionLineMonitor.Web.HostedServices
                 }
                 catch (Exception ex)
                 {
+                    _logger.LogError(ex.StackTrace);
                     _logger.LogError(ex.Message);
                 }
                 await Task.Delay(Interval * 1000, stoppingToken);

+ 16 - 14
ProductionLineMonitor.Web/Views/ReportForm/Index.cshtml

@@ -57,10 +57,10 @@
                         <p class="text-center">
                             <strong>稼动曲线</strong>
                         </p>
-                        <div id="container1" 
-                            style="height: 400px;">
+                        <div id="container1"
+                             style="height: 400px;">
                         </div>
-                       @*  <div id="container2" style="height: 280px">
+                        @*  <div id="container2" style="height: 280px">
                         </div> *@
                     </div>
                 </div>
@@ -76,6 +76,7 @@
                                 <th style="width: 10%">运行时间</th>
                                 <th style="width: 10%">报警时间</th>
                                 <th style="width: 10%">待料时间</th>
+                                <th style="width: 10%">换料时间</th>
                                 <th style="width: 10%">产能</th>
                                 <th style="width: 10%">TT</th>
                                 <th style="width: 10%">报警次数</th>
@@ -85,9 +86,10 @@
                             <tr v-for="(output, index) in outputs">
                                 <td>{{ output.period }}</td>
                                 <td>{{ output.moduleType }}</td>
-                                <td>{{ output.autoRunTime / 60 }}</td>
-                                <td>{{ output.alarmTime / 60 }}</td>
-                                <td>{{ output.idleTime / 60 }}</td>
+                                <td>{{ Math.round(output.autoRunTime/60*10)/10 }}</td>
+                                <td>{{ Math.round(output.alarmTime/60*10)/10 }}</td>
+                                <td>{{ Math.round(output.idleTime/60*10)/10 }}</td>
+                                <td>{{ Math.round(output.loadMATTime/60*10)/10 }}</td>
                                 <td>{{ output.outPut }}</td>
                                 <td>{{ output.tt }}</td>
                                 <td>{{ output.alarmSum }}</td>
@@ -100,12 +102,12 @@
     </div>
 </div>
 
-    @section footer {
-        <script src="/lib/zTree.v3/js/jquery.ztree.core.min.js"></script>
-        <script src="~/lib/xlsx/xlsx.full.min.js"></script>
-        <script src="~/lib/adminlte/bower/bootstrap-datepicker/js/bootstrap-datepicker.js"></script>
-        <script src="~/lib/adminlte/bower/bootstrap-datepicker/js/locales/bootstrap-datepicker.zh-cn.js"></script>
-        <script src="~/lib/echarts/echarts.min.js"></script>
-        <script src="~/js/report-form/report-form-v1.js"></script>
-    }
+@section footer {
+    <script src="/lib/zTree.v3/js/jquery.ztree.core.min.js"></script>
+    <script src="~/lib/xlsx/xlsx.full.min.js"></script>
+    <script src="~/lib/adminlte/bower/bootstrap-datepicker/js/bootstrap-datepicker.js"></script>
+    <script src="~/lib/adminlte/bower/bootstrap-datepicker/js/locales/bootstrap-datepicker.zh-cn.js"></script>
+    <script src="~/lib/echarts/echarts.min.js"></script>
+    <script src="~/js/report-form/report-form-v1.js"></script>
+}
 

+ 1 - 1
ProductionLineMonitor.Web/wwwroot/js/fault/fault.js

@@ -52,7 +52,7 @@ function getTOP10Faults(id, startTime, endTime) {
             "id": id,
             "startTime": startTime,
             "endTime": endTime,
-            "filterString": "安全门,门禁,提示上料,提示卸料"
+            "filterString": "安全门,门禁,提示上料,提示卸料,门锁,门打开,请选择LOT生产"
         },
         success: function (rev) {
             option.series = [];

+ 4 - 4
ProductionLineMonitor.Web/wwwroot/js/production-line/production-line.js

@@ -79,7 +79,7 @@ function zTreeOnClick() {
             data: {
                 "lineId": treeNode.id,
                 "day": date,
-                "keywords": "安全门,门禁,提示上料,提示卸料"
+                "keywords": "安全门,门禁,提示上料,提示卸料,门锁,门打开,请选择LOT生产"
             },
             success: function (result) {
                 alarms(result);
@@ -116,7 +116,7 @@ function zTreeOnClick() {
             data: {
                 "machineId": treeNode.id,
                 "day": date,
-                "keywords": "安全门,门禁,提示上料,提示卸料"
+                "keywords": "安全门,门禁,提示上料,提示卸料,门锁,门打开,请选择LOT生产"
             },
             success: function (result) {
                 alarmsMachine(result);
@@ -237,7 +237,7 @@ function outPut(data) {
             "<td>" + alarmTime + "</td>" +
             "<td>" + idleTime + "</td>" +
             "<td>" + outPut + "</td>" +
-            "<td>" + (actualTT / 12).toFixed(2) + "</td>" +
+            "<td>" + (autoRunTime * 60 / outPut).toFixed(2) + "</td>" +
             "<td>" + alarmSum + "</td>" +
             "<td>" + loadMATSum + "</td>" +
             "<td>" + loadMATTime + "</td>" +
@@ -285,7 +285,7 @@ function outPut(data) {
             "<td>" + alarmTime + "</td>" +
             "<td>" + idleTime + "</td>" +
             "<td>" + outPut + "</td>" +
-            "<td>" + (actualTT / 12).toFixed(2) + "</td>" +
+            "<td>" + (autoRunTime * 60 / outPut).toFixed(2) + "</td>" +
             "<td>" + alarmSum + "</td>" +
             "<td>" + loadMATSum + "</td>" +
             "<td>" + loadMATTime + "</td>" +

+ 40 - 15
ProductionLineMonitor.Web/wwwroot/js/report-form/report-form-v1.js

@@ -70,7 +70,7 @@
                         borderColor: "white",
                     },
                 },
-                color: ['#5b9bd5', '#ed7d31', '#a5a5a5', '#546fc6'],
+                color: ['#5b9bd5', '#ed7d31', '#a5a5a5','#008080', '#546fc6'],
                 xAxis: {
                     type: 'category',
                     data: [],
@@ -116,7 +116,7 @@
                     }
                 ],
                 legend: {
-                    data: ['稼动率', '待机率', '报警率', '产能'],
+                    data: ['稼动率', '待机率', '报警率', '换料率', '产能'],
                     textStyle: {
                         color: 'white',
                         fontSize: 14
@@ -168,6 +168,21 @@
                             fontSize: 12
                         },
                     },
+                    {
+                        type: 'value',
+                        name: '换料率',
+                        data: [],
+                        type: 'bar',
+                        stack: 'toral',
+                        axisLabel: {
+                            formatter: '{value} %'
+                        },
+                        label: {
+                            show: true,
+                            color: 'white',
+                            fontSize: 12
+                        },
+                    },
                     {
                         type: 'value',
                         name: '产能',
@@ -237,11 +252,13 @@
                     if (rev.code === 0) {
                         _this.oees = rev.data;
 
+                        console.log(rev.data);
                         var xData = [];
                         var yDataProductA = [];
                         var yDataProductB = [];
                         var yDataProductC = [];
                         var yDataProductD = [];
+                        var yDataProductE = [];
 
                         for (var i = 0; i < rev.data.length; i++) {
                             xData.push(rev.data[i].date + ' ' + rev.data[i].shift);
@@ -249,13 +266,15 @@
                             yDataProductB.push(rev.data[i].runTimeRate);
                             yDataProductC.push(rev.data[i].idelTimeRate);
                             yDataProductD.push(rev.data[i].downTimeRate);
+                            yDataProductE.push(rev.data[i].loadMATTimeRate);
                         }
 
                         _this.option.xAxis.data = xData;
                         _this.option.series[0].data = yDataProductB;
                         _this.option.series[1].data = yDataProductC;
                         _this.option.series[2].data = yDataProductD;
-                        _this.option.series[3].data = yDataProductA;
+                        _this.option.series[3].data = yDataProductE;
+                        _this.option.series[4].data = yDataProductA;
                         _this.myChart.setOption(_this.option);
                     } else {
                         alert(rev.message);
@@ -272,7 +291,7 @@
 
             var sheet = {};
 
-            sheet['!ref'] = 'A1:' + 'I' + (this.oees.length + 1);
+            sheet['!ref'] = 'A1:' + 'K' + (this.oees.length + 1);
             sheet['!cols'] = [
                 { wch: 10 },
                 { wch: 12 },
@@ -282,6 +301,8 @@
                 { wch: 12 },
                 { wch: 12 },
                 { wch: 12 },
+                { wch: 12 },
+                { wch: 12 },
                 { wch: 12 }
             ];
 
@@ -291,24 +312,28 @@
             sheet['D1'] = { t: "s", v: "稼动时间(min)" };
             sheet['E1'] = { t: "s", v: "待机时间(min)" };
             sheet['F1'] = { t: "s", v: "报警时间(min)" };
-            sheet['G1'] = { t: "s", v: "稼动率(%)" };
-            sheet['H1'] = { t: "s", v: "待机率(%)" };
-            sheet['I1'] = { t: "s", v: "报警率(%)" };
+            sheet['G1'] = { t: "s", v: "换料时间(min)" };
+            sheet['H1'] = { t: "s", v: "稼动率(%)" };
+            sheet['I1'] = { t: "s", v: "待机率(%)" };
+            sheet['J1'] = { t: "s", v: "报警率(%)" };
+            sheet['K1'] = { t: "s", v: "换料率(%)" };
 
             this.oees.forEach(function (row, i) {
                 sheet[String.fromCharCode(65) + (i + 2)] = { v: row.date };
                 sheet[String.fromCharCode(66) + (i + 2)] = { v: row.shift };
                 sheet[String.fromCharCode(67) + (i + 2)] = { v: row.outputs };
-                sheet[String.fromCharCode(68) + (i + 2)] = { v: row.runTime  / 60 };
+                sheet[String.fromCharCode(68) + (i + 2)] = { v: row.runTime / 60 };
                 sheet[String.fromCharCode(69) + (i + 2)] = { v: row.idelTime / 60 };
                 sheet[String.fromCharCode(70) + (i + 2)] = { v: row.downTime / 60 };
-                sheet[String.fromCharCode(71) + (i + 2)] = { v: row.runTimeRate };
-                sheet[String.fromCharCode(72) + (i + 2)] = { v: row.idelTimeRate };
-                sheet[String.fromCharCode(73) + (i + 2)] = { v: row.downTimeRate };
+                sheet[String.fromCharCode(71) + (i + 2)] = { v: row.loadMATTime / 60 };
+                sheet[String.fromCharCode(72) + (i + 2)] = { v: row.runTimeRate };
+                sheet[String.fromCharCode(73) + (i + 2)] = { v: row.idelTimeRate };
+                sheet[String.fromCharCode(74) + (i + 2)] = { v: row.downTimeRate };
+                sheet[String.fromCharCode(75) + (i + 2)] = { v: row.loadMATTimeRate };
             });
 
             workbook.Sheets[sheetName] = sheet;
-            
+
             // 生成excel的配置项
             var wopts = {
                 bookType: 'xlsx', // 要生成的文件类型
@@ -345,12 +370,12 @@
         }
     },
     filters: {
-        
+
     },
     created: function () {
-        
+
     },
     destroyed: function () {
-        
+
     }
 })