2
schangxiang@126.com
2024-06-26 bbe45291ccc4a2839bc98c0499b8db257418e875
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/DataCaptureHandlerV2/DataCaptureHandler_02.cs
@@ -19,6 +19,7 @@
using static System.Net.WebRequestMethods;
using File = System.IO.File;
using Spire.Additions.Xps.Schema;
using log4net;
namespace iWare_SCADA_BusinessLogical
{
@@ -114,7 +115,8 @@
                string path36 = ConfigHelper.GetConfigString("OP30QualityDataFor36Station");//op30 3工位,6工位地址
                string path45 = ConfigHelper.GetConfigString("OP30QualityDataFor45Station");//op30 4工位,5工位地址
                string pathOP20 = ConfigHelper.GetConfigString("OP20QualityData");
                string pathOP60 = ConfigHelper.GetConfigString("OP60QualityData");
                //string pathOP60 = ConfigHelper.GetConfigString("OP60QualityData");
                string pathOP60 = @"Q:\Measuring_Data_dfq\";//写死地址 【Editby shaocx,2024-06-25】
                if (string.IsNullOrEmpty(path36))
                {
                    path36 = @"Z:\";
@@ -129,7 +131,7 @@
                }
                if (string.IsNullOrEmpty(pathOP60))
                {
                    pathOP60 = @"V:\";
                    pathOP60 = @"Q:\Measuring_Data_dfq\";
                }
                if (DataCapturePointCode.Contains("CH3"))
@@ -202,18 +204,18 @@
                                Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}进入测量完成【{value_02}】【{value.ToString()}】");
                                threadStatusMonitor.Threadlastmodifytime = DateTime.Now;
                                WorkPieceLogMiddle wplog = new WorkPieceLogMiddle();
                                wplog.Id = Yitter.IdGenerator.YitIdHelper.NextId();
                                wplog.WorkingProcedure = WorkingProcedure;
                                wplog.EquipmentID = _dataCaptureConfig.EquipmentID; ;
                                wplog.Remarks = WorkingProcedure;
                                wplog.MonitoringPoint = DataCapturePointCode;
                                wplog.CreatedTime = DateTimeHelper.GetDateTime();
                                wplog.CreatedUserName = DataCapturePointCode;
                                wplog.UpdatedUserName = Environment.MachineName + "自动" + Thread.CurrentThread.ManagedThreadId.ToString();
                                wplog.UpdatedTime = DateTimeHelper.GetDateTime();
                                wplog.IsDeleted = false;
                                wplog.QualityType = QualityType.Online.ToString();
                                WorkPieceLogMiddle logMiddle = new WorkPieceLogMiddle();
                                logMiddle.Id = Yitter.IdGenerator.YitIdHelper.NextId();
                                logMiddle.WorkingProcedure = WorkingProcedure;
                                logMiddle.EquipmentID = _dataCaptureConfig.EquipmentID; ;
                                logMiddle.Remarks = WorkingProcedure;
                                logMiddle.MonitoringPoint = DataCapturePointCode;
                                logMiddle.CreatedTime = DateTimeHelper.GetDateTime();
                                logMiddle.CreatedUserName = DataCapturePointCode;
                                logMiddle.UpdatedUserName = Environment.MachineName + "自动" + Thread.CurrentThread.ManagedThreadId.ToString();
                                logMiddle.UpdatedTime = DateTimeHelper.GetDateTime();
                                logMiddle.IsDeleted = false;
                                logMiddle.QualityType = QualityType.Online.ToString();
                                foreach (var col in colConfig.Where(o => o.DataCapturePointCode == DataCapturePointCode))
                                {
@@ -221,23 +223,23 @@
                                    {
                                        var valuecol = plcService.ReadValuePoint(col.DbNumber, col.Offset, col.DataCaptureColumnLength.Value, PLCManger.GetTypeForString(col.DataCaptureColumnType));
                                        //wplog.GetType().GetProperty(col.DataCaptureColumnTabelName).SetValue(wplog, valuecol);//给动态字段赋值
                                        var set = wplog.GetType().GetProperty(col.DataCaptureColumnTabelName);
                                        var set = logMiddle.GetType().GetProperty(col.DataCaptureColumnTabelName);
                                        if (set == null)
                                        {
                                            Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" {DataCapturePointCode}工序监控测量完成标记 读取工件码动态由于字段名没找到,赋值【{WorkingProcedure ?? "空字符串"}】失败{wplog.Id}");
                                            Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" {DataCapturePointCode}工序监控测量完成标记 读取工件码动态由于字段名没找到,赋值【{WorkingProcedure ?? "空字符串"}】失败{logMiddle.Id}");
                                        }
                                        if (set.PropertyType.FullName.Equals("System.String"))
                                        {
                                            set.SetValue(wplog, valuecol.ToString());//给动态字段赋值
                                            set.SetValue(logMiddle, valuecol.ToString());//给动态字段赋值
                                        }
                                        else
                                        {
                                            set.SetValue(wplog, valuecol);//给动态字段赋值
                                            set.SetValue(logMiddle, valuecol);//给动态字段赋值
                                        }
                                    }
                                    catch (Exception setex)
                                    {
                                        Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" {DataCapturePointCode}工序监控测量完成标记 读取工件码动态赋值【{WorkingProcedure ?? "空字符串"}】异常{wplog.Id}", setex);
                                        Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" {DataCapturePointCode}工序监控测量完成标记 读取工件码动态赋值【{WorkingProcedure ?? "空字符串"}】异常{logMiddle.Id}", setex);
                                    }
                                }
@@ -295,27 +297,27 @@
                                        files = files.OrderByDescending(o => o.LastWriteTime).ToList();
                                        if (files.Count > 0)
                                        {
                                            Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"工位【{DataCapturePointCode}】工件【{wplog.WorkPieceID ?? "空字符"}】文件{files[0].FullName}测量完成读取文件数据开始");
                                            Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"工位【{DataCapturePointCode}】工件【{logMiddle.WorkPieceID ?? "空字符"}】文件{files[0].FullName}测量完成读取文件数据开始");
                                            switch (DataCapturePointCode)
                                            {
                                                case "OP3002CH3":
                                                    wplog.OP30QualityFilePathCH3 = files[0].FullName;
                                                    wplog.QualityStateStr = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Result");
                                                    wplog.QualityOP30To1 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Y-Maximum");//涨断力矩
                                                    logMiddle.OP30QualityFilePathCH3 = files[0].FullName;
                                                    logMiddle.QualityStateStr = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Result");
                                                    logMiddle.QualityOP30To1 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Y-Maximum");//涨断力矩
                                                    break;
                                                case "OP3002CH4":
                                                    wplog = GetCH4Info(files[0].FullName, wplog);
                                                    wplog.OP30QualityFilePathCH4 = files[0].FullName;
                                                    logMiddle = GetCH4Info(files[0].FullName, logMiddle);
                                                    logMiddle.OP30QualityFilePathCH4 = files[0].FullName;
                                                    break;
                                                case "OP3002CH5":
                                                    wplog = GetCH5Info(files[0].FullName, wplog);
                                                    wplog.OP30QualityFilePathCH5 = files[0].FullName;
                                                    logMiddle = GetCH5Info(files[0].FullName, logMiddle);
                                                    logMiddle.OP30QualityFilePathCH5 = files[0].FullName;
                                                    break;
                                                case "OP3002CH6":
                                                    wplog.OP30QualityFilePathCH6 = files[0].FullName;
                                                    wplog.QualityStateStr = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Result");
                                                    wplog.QualityOP30To6 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Y-Maximum");//衬套压装力矩
                                                    wplog.QualityOP30To7 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Block X");//衬套压装位移
                                                    logMiddle.OP30QualityFilePathCH6 = files[0].FullName;
                                                    logMiddle.QualityStateStr = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Result");
                                                    logMiddle.QualityOP30To6 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Y-Maximum");//衬套压装力矩
                                                    logMiddle.QualityOP30To7 = FileHelper.ReadPdfFileForSpire(files[0].FullName, "Block X");//衬套压装位移
                                                    break;
                                                default:
                                                    break;
@@ -325,25 +327,25 @@
                                    }
                                    else if (WorkingProcedure.Equals("OP35"))
                                    {
                                        if (wplog.OP35OK)
                                        if (logMiddle.OP35OK)
                                        {
                                            wplog.QualityStateStr = "OK";
                                            logMiddle.QualityStateStr = "OK";
                                        }
                                        else
                                        {
                                            wplog.QualityStateStr = "NG";
                                            logMiddle.QualityStateStr = "NG";
                                        }
                                    }
                                    else if (WorkingProcedure.Equals("OP60"))
                                    {
                                        //增加OP60 质量信息读取校验 【Editby shaocx,2024-06-07】
                                        var gongweiStr = DataCapturePointCode.Substring(DataCapturePointCode.Length - 1, 1);
                                        if (wplog.Op60_Place_Flag == false)
                                        if (logMiddle.Op60_Place_Flag == false)
                                        {
                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,是指定的工件{wplog.WorkPieceID},工位{gongweiStr},不通过,读取Op60_Place_Flag:false");
                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr},不通过,读取Op60_Place_Flag:false");
                                            continue;
                                        };
                                        Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,是指定的工件{wplog.WorkPieceID},工位{gongweiStr},校验通过,读取Op60_Place_Flag:true");
                                        Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr},校验通过,读取Op60_Place_Flag:true");
                                        var time = DateTimeHelper.GetDateTime();
@@ -363,22 +365,33 @@
                                        files = files.Where(x => x.Name.Contains("SP-" + gongweiStr)).OrderByDescending(o => o.LastWriteTime).ToList();//筛选取最新的文件 【Editby shaocx,2024-06-19】
                                        if (files.Count() > 0)
                                        {
                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{files.Count()}个,是指定的工件{wplog.WorkPieceID},,工位{gongweiStr}上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}");
                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{files.Count()}个,是指定的工件{logMiddle.WorkPieceID},,工位{gongweiStr}上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}");
                                            List<OP60Info> op60Infos = new List<OP60Info>();
                                            bool isFindFile = false;
                                            //注意:只取第一个文件就可以啦!!!!!! 【Editby shaocx,2024-06-19】
                                            var doFiles = new List<FileInfo>() { files.First() };
                                            var source_doFile = files.First();//原始读的文件
                                            //拷贝文件
                                            //目标文件的完整目录
                                            string destFileName = source_doFile.FullName.Replace("Measuring_Data_dfq", "Measuring_Data_df_Copy");
                                            string source_file_name = source_doFile.Name.Replace(".dfq", "");//不带扩展名的文件名字
                                            destFileName = destFileName.Replace(source_file_name, source_file_name + "_" + logMiddle.WorkPieceID + "_" + DateTime.Now.ToString("yyyyMMddHHmmss"));
                                            File.Copy(source_doFile.FullName, destFileName, true);
                                            FileInfo destFile = new FileInfo(destFileName);
                                            var doFiles = new List<FileInfo>() { destFile };
                                            foreach (var file in doFiles)
                                            {//取倒序匹配的文件名为工件号的文件
                                                if (file.Name.Contains("SP-" + gongweiStr))
                                                {
                                                    Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{wplog.WorkPieceID},,工位{gongweiStr}上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}");
                                                    Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},,工位{gongweiStr}上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}");
                                                    isFindFile = true;
                                                    var datatable = CSVHelper.ReadCSVList(file.FullName);
                                                    Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name},指定工件号{wplog.WorkPieceID},,工位{gongweiStr}发现文件行数{datatable.Count}");
                                                    Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name},指定工件号{logMiddle.WorkPieceID},,工位{gongweiStr}发现文件行数{datatable.Count}");
                                                    if (datatable.Count < 106)
                                                    {//质量数据从106行开始
                                                        Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name},指定工件号{wplog.WorkPieceID},,工位{gongweiStr}发现文件行数{datatable.Count}小于106");
                                                        Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name},指定工件号{logMiddle.WorkPieceID},,工位{gongweiStr}发现文件行数{datatable.Count}小于106");
                                                        continue;
                                                    }
                                                    datatable.Reverse();
@@ -418,52 +431,62 @@
                                                            //    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{wplog.WorkPieceID},工位{gongweiStr}没能赋值OP60QualityFilePath等字段,{msg}");
                                                            //    break;
                                                            //}
                                                            wplog.QualityOP60To1 = op60Infos[0].value;
                                                            wplog.QualityOP60To2 = op60Infos[1].value;
                                                            wplog.OP60QualityFilePath = file.FullName;
                                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{wplog.WorkPieceID},工位{gongweiStr}成功赋值了OP60QualityFilePath等字段,读取时间:{op60Infos[0].datetimeHandle.ToString()}");
                                                            logMiddle.QualityOP60To1 = op60Infos[0].value;
                                                            logMiddle.QualityOP60To2 = op60Infos[1].value;
                                                            logMiddle.OP60QualityFilePath = file.FullName;
                                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}成功赋值了OP60QualityFilePath等字段,读取时间:{op60Infos[0].datetimeHandle.ToString()}");
                                                            if (op60Infos[0].datetimeHandle > op60QualityTime.Value)
                                                            {//这个时间判断要不要拿掉?? 【Editby shaocx,2024-06-19】
                                                            }
                                                            else
                                                            {
                                                                var msg = $",只是警告!因为判断时间不符合,op60Infos[0].datetimeHandle:{(op60Infos[0].datetimeHandle == null ? "" : op60Infos[0].datetimeHandle.ToString())}小于等于op60QualityTime:{(op60QualityTime.Value == null ? "" : op60QualityTime.Value.ToString())}";
                                                                Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{wplog.WorkPieceID},工位{gongweiStr}没能赋值OP60QualityFilePath等字段,{msg}");
                                                                Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}没能赋值OP60QualityFilePath等字段,{msg}");
                                                            }
                                                        }
                                                        else
                                                        {
                                                            wplog.QualityOP60To1 = op60Infos[0].value;
                                                            wplog.QualityOP60To2 = op60Infos[1].value;
                                                            wplog.OP60QualityFilePath = file.FullName;
                                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{wplog.WorkPieceID},工位{gongweiStr}成功赋值了OP60QualityFilePath等字段,读取时间:{op60Infos[0].datetimeHandle.ToString()}");
                                                            logMiddle.QualityOP60To1 = op60Infos[0].value;
                                                            logMiddle.QualityOP60To2 = op60Infos[1].value;
                                                            logMiddle.OP60QualityFilePath = file.FullName;
                                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}成功赋值了OP60QualityFilePath等字段,读取时间:{op60Infos[0].datetimeHandle.ToString()}");
                                                        }
                                                        op60QualityTime = op60Infos[0].datetimeHandle;
                                                        break;
                                                    }
                                                }
                                                else
                                                {
                                                    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name}不是指定工件{wplog.WorkPieceID},工位{gongweiStr}");
                                                    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name}不是指定工件{logMiddle.WorkPieceID},工位{gongweiStr}");
                                                }
                                            }
                                            if (isFindFile == false)
                                            {
                                                Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成没有找到文件,指定工件{wplog.WorkPieceID},工位{gongweiStr}");
                                                Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成没有找到文件,指定工件{logMiddle.WorkPieceID},工位{gongweiStr}");
                                            }
                                        }
                                        else
                                        {
                                            Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,通过筛选过滤,没有找到文件,指定工件{logMiddle.WorkPieceID},工位{gongweiStr}");
                                        }
                                    }
                                    else if (WorkingProcedure.Equals("OP20"))
                                    {
                                        var gongweiStr = DataCapturePointCode.Substring(DataCapturePointCode.Length - 1, 1);
                                        //记录公用变量,保存点位M88的信息 【Editby shaocx,2024-06-07】
                                        if (DataCapturePointCode.Contains("OP2002C"))
                                        {//从OP2002C读取,因为顺序是 CBA,而不是ABC
                                            string sideValue = GetSideForOP20(plcService, wplog);
                                            string sideValue = GetSideForOP20(plcService, logMiddle);
                                            SystemValue.OP20_Side_Value = sideValue;
                                        }
                                        wplog.MonitoringPoint += SystemValue.OP20_Side_Value;
                                        wplog.CreatedUserName = wplog.MonitoringPoint;
                                        logMiddle.MonitoringPoint += SystemValue.OP20_Side_Value;
                                        logMiddle.CreatedUserName = logMiddle.MonitoringPoint;
                                        Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr},校验通过,读取Op60_Place_Flag:true");
                                        var time = DateTimeHelper.GetDateTime();
                                        if (fileFindTime == null)
@@ -478,21 +501,31 @@
                                        {
                                            files.Add((FileInfo)file);
                                        }
                                        Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"工位【{DataCapturePointCode}】工件【{wplog.WorkPieceID ?? "空字符"}】获取到【{files.Count()}】个文件,【{fileFindTime.Value}】【{time.AddHours(2)}】");
                                        //注意:一定要筛选制定的文件数据
                                        files = files.Where(x => x.Name.Contains("SP-" + gongweiStr)).OrderByDescending(o => o.LastWriteTime).ToList();//筛选取最新的文件 【Editby shaocx,2024-06-19】
                                        Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"工位【{DataCapturePointCode}】工件【{logMiddle.WorkPieceID ?? "空字符"}】获取到【{files.Count()}】个文件,【{fileFindTime.Value}】【{time.AddHours(2)}】");
                                        if (files.Count() > 0)
                                        {
                                            bool isFindFile = false;
                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{files.Count()}个,是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr},上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}");
                                            files = files.OrderByDescending(o => o.LastWriteTime).ToList();
                                            List<OP60Info> op60Infos = new List<OP60Info>();
                                            foreach (var file in files)
                                            //注意:只取第一个文件就可以啦!!!!!! 【Editby shaocx,2024-06-19】
                                            var doFiles = new List<FileInfo>() { files.First() };
                                            foreach (var file in doFiles)
                                            {//取倒序匹配的文件名为工件号的文件
                                                if (file.Name.Contains("SP-" + DataCapturePointCode.Substring(DataCapturePointCode.Length - 1, 1)))
                                                if (file.Name.Contains("SP-" + gongweiStr))
                                                {
                                                    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{wplog.WorkPieceID},上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}");
                                                    isFindFile = true;
                                                    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr},上次获取尼伯丁文件里的时间值:{(op60QualityTime == null ? "" : op60QualityTime.ToString())}");
                                                    var datatable = CSVHelper.ReadCSVList(file.FullName);
                                                    Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name},指定工件号{logMiddle.WorkPieceID},,工位{gongweiStr}发现文件行数{datatable.Count}");
                                                    if (datatable.Count < 57)
                                                    {//质量数据从106行开始
                                                        Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.Name},指定工件号{logMiddle.WorkPieceID},,工位{gongweiStr}发现文件行数{datatable.Count}小于106");
                                                        continue;
                                                    }
                                                    datatable.Reverse();
@@ -519,20 +552,32 @@
                                                    {
                                                        if (op60QualityTime.HasValue)
                                                        {
                                                            //if (op60Infos[0].datetimeHandle > op60QualityTime.Value)
                                                            //{
                                                            //    wplog.QualityOP20To1 = op60Infos[0].value;
                                                            //    wplog.OP20QualityFilePath = file.FullName;
                                                            //}
                                                            //else
                                                            //{
                                                            //    break;
                                                            //}
                                                            logMiddle.QualityOP20To1 = op60Infos[0].value;
                                                            logMiddle.OP20QualityFilePath = file.FullName;
                                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}成功赋值了OP20QualityFilePath等字段,读取时间:{op60Infos[0].datetimeHandle.ToString()}");
                                                            if (op60Infos[0].datetimeHandle > op60QualityTime.Value)
                                                            {
                                                                wplog.QualityOP20To1 = op60Infos[0].value;
                                                                wplog.OP20QualityFilePath = file.FullName;
                                                            {//这个时间判断要不要拿掉?? 【Editby shaocx,2024-06-19】
                                                            }
                                                            else
                                                            {
                                                                break;
                                                                var msg = $",只是警告!因为判断时间不符合,op60Infos[0].datetimeHandle:{(op60Infos[0].datetimeHandle == null ? "" : op60Infos[0].datetimeHandle.ToString())}小于等于op60QualityTime:{(op60QualityTime.Value == null ? "" : op60QualityTime.Value.ToString())}";
                                                                Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}没能赋值OP60QualityFilePath等字段,{msg}");
                                                            }
                                                        }
                                                        else
                                                        {
                                                            wplog.QualityOP20To1 = op60Infos[0].value;
                                                            wplog.OP20QualityFilePath = file.FullName;
                                                            logMiddle.QualityOP20To1 = op60Infos[0].value;
                                                            logMiddle.OP20QualityFilePath = file.FullName;
                                                            Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取到文件{file.Name},是指定的工件{logMiddle.WorkPieceID},工位{gongweiStr}成功赋值了OP20QualityFilePath等字段,读取时间:{op60Infos[0].datetimeHandle.ToString()}");
                                                        }
                                                        op60QualityTime = op60Infos[0].datetimeHandle;
                                                        break;
@@ -541,9 +586,18 @@
                                                }
                                                else
                                                {
                                                    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.FullName}不是指定工件{wplog.WorkPieceID}");
                                                    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成读取文件{file.FullName}不是指定工件{logMiddle.WorkPieceID}");
                                                }
                                            }
                                            if (isFindFile == false)
                                            {
                                                Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成没有找到文件,指定工件{logMiddle.WorkPieceID},工位{gongweiStr}");
                                            }
                                        }
                                        else
                                        {
                                            Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}下线完成,通过筛选过滤,没有找到文件,指定工件{logMiddle.WorkPieceID},工位{gongweiStr}");
                                        }
                                    }
@@ -554,8 +608,17 @@
                                    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"{DataCapturePointCode}测量完成读取文件数据时异常,避免工序完成异常:", ex);
                                }
                                //根据质量数据判断是否合格/不合格 【Editby shaocx,2024-06-25】
                                QualityNoOkEnum? qualityNoOkEnum = null;
                                QualityState qualityState = CalcQualityStateForOP(logMiddle, ref qualityNoOkEnum);
                                logMiddle.QualityState = (int)qualityState;
                                if (qualityNoOkEnum != null)
                                {
                                    logMiddle.QualityNoOk = (int)qualityNoOkEnum;
                                    logMiddle.QualityNoOkReason = qualityNoOkEnum.ToString();
                                }
                                //更新WorkPieceInfo表以及插入WorkPieceLog表和WorkPieceInfoLog表
                                WorkPieceInfoManager.QualityInfoComplete(wplog, PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure));
                                WorkPieceInfoManager.QualityInfoComplete(logMiddle, PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure));
                                threadStatusMonitor.Threadstatue = 1;
@@ -810,5 +873,88 @@
        }
        /// <summary>
        /// 计算OP 质量数据是否合格
        /// </summary>
        public QualityState CalcQualityStateForOP(WorkPieceLogMiddle logMiddle, ref QualityNoOkEnum? qualityNoOkEnum)
        {
            QualityState qualityState = QualityState.Suspected;
            if (logMiddle.WorkingProcedure == "OP60")
            {
                decimal _QualityOP60To1 = SystemHelper.GetDecimal(logMiddle.QualityOP60To1);
                decimal _QualityOP60To2 = SystemHelper.GetDecimal(logMiddle.QualityOP60To2);
                var isPass_QualityOP60To1 = false;
                var isPass_QualityOP60To2 = false;
                if (_QualityOP60To1 >= (decimal)53.018 && _QualityOP60To1 <= (decimal)53.030)
                {
                    isPass_QualityOP60To1 = true;
                }
                else
                {
                    qualityNoOkEnum = QualityNoOkEnum.OP60大头孔直径超差;
                }
                if (_QualityOP60To2 >= (decimal)22.005 && _QualityOP60To2 <= (decimal)22.011)
                {
                    isPass_QualityOP60To2 = true;
                }
                else
                {
                    qualityNoOkEnum = QualityNoOkEnum.OP60小头孔直径超差;
                }
                if (isPass_QualityOP60To1 && isPass_QualityOP60To2)
                {
                    qualityState = QualityState.OK;
                }
                else
                {
                    qualityState = QualityState.NG;
                }
                if (_QualityOP60To1 == 0 || _QualityOP60To2 == 0)
                {
                    qualityState = QualityState.Suspected;
                    return qualityState;
                }
                return qualityState;
            }
            else if (logMiddle.WorkingProcedure == "OP10")
            {
                if (logMiddle.QualityState != (int)QualityState.OK)
                {
                    qualityNoOkEnum = QualityNoOkEnum.OP10厚度超差;
                }
                return qualityState;
            }
            else if (logMiddle.WorkingProcedure == "OP20")
            {
                if (logMiddle.QualityState != (int)QualityState.OK)
                {
                    qualityNoOkEnum = QualityNoOkEnum.OP20小头孔直径超差;
                }
                return qualityState;
            }
            else if (logMiddle.WorkingProcedure == "OP35")
            {
                if (logMiddle.QualityState != (int)QualityState.OK)
                {
                    qualityNoOkEnum = QualityNoOkEnum.OP35滚压力不合格;
                }
                return qualityState;
            }
            else if (logMiddle.WorkingProcedure == "OP40")
            {
                if (logMiddle.QualityState != (int)QualityState.OK)
                {
                    qualityNoOkEnum = QualityNoOkEnum.OP40厚度超差;
                }
                return qualityState;
            }
            return qualityState;
        }
    }
}