2
schangxiang@126.com
2024-06-16 939aaceb32c03fa7006352e6f866ea1bf63f9e7c
2
已添加2个文件
已修改8个文件
567 ■■■■■ 文件已修改
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/BLL/WorkPieceInfoManager.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/DataCaptureHandlerV2/DataCaptureHandler_05.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/DataCaptureHandlerV2/OP80QualityDataHandler.cs 386 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/iWare_SCADA_BusinessLogical.csproj 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/log4net_iWare - 复制用.config 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/log4net_iWare.config 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_DataCaptureV3/FormMain.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_Model/Enums.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_Model/MiddleModel/WorkPieceLogMiddle.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_Model/TableModel/WorkPieceProcess.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/BLL/WorkPieceInfoManager.cs
@@ -1012,11 +1012,14 @@
                            info.CompleteTime = DateTimeHelper.GetDateTime();
                            info.OP80NewCode = loginfo.OP80NewCode;
                            //质检数据改为 èŽ·å–æ–‡ä»¶åŽä¿®æ”¹ ã€Editby shaocx,2024-06-15】
                            /*
                            info.QualityState = (int)((loginfo.QualityStateStr.Equals("OK") || loginfo.QualityStateStr.Equals("0K")) ? QualityState.OK : QualityState.NG);
                            loginfo.QualityState = info.QualityState;
                            info.QualityStateUpdateUser = loginfo.UpdatedUserName;
                            info.QualityStateUpdateTime = loginfo.UpdatedTime.Value.LocalDateTime;
                            info.QualityStateUpdateMode = QualityStateUpdateMode.Auto.ToString();
                            //*/
                            var qualityData = db.QualityDataInfo.Where(o => o.WorkPieceID == loginfo.WorkPieceID).FirstOrDefault();
                            if (qualityData == null || qualityData.WorkPieceID.Length < 1 || qualityData.WorkingProcedure.Length < 1)
@@ -1027,6 +1030,8 @@
                            //修改QualityDataInfo表 //重复收到质量信息,会覆盖之前的
                            EntityPropHelper<WorkPieceLogMiddle, QualityDataInfo>.CopyProp(loginfo, qualityData, GetQualityDataInfoUpdate(loginfo.WorkingProcedure, loginfo.MonitoringPoint));//指定修改字段
                            //质检数据改为 èŽ·å–æ–‡ä»¶åŽä¿®æ”¹ ã€Editby shaocx,2024-06-15】
                            /*
                            qualityData.QualityStateUpdateUser = info.UpdatedUserName;
                            qualityData.QualityReceiveTime = info.UpdatedTime.Value.LocalDateTime;
                            qualityData.QualityStateUpdateMode = info.QualityStateUpdateMode;
@@ -1043,6 +1048,7 @@
                            {
                                info.QualityErrorInfo = "";
                            }
                            //*/
                        }
                        else if (loginfo.WorkingProcedure.Equals("OP30"))
                        {
@@ -1098,6 +1104,10 @@
                            process.UpdatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
                            process.OperationType = OperationType.生产.ToString();
                            process.Remarks = "";
                            if (loginfo.WorkingProcedure.Equals("OP80"))
                            {
                                process.GetQcDataFlag = loginfo.GetQcDataFlag;//赋值标记 [Editby shaocx,2024-06-15]
                            }
                            if (op80id > 0)
                            {
                                process.QualityDataInfoID = op80id;
@@ -1113,6 +1123,13 @@
                            pro.EndTime = DateTimeHelper.GetDateTime();
                            pro.UpdatedUserName = loginfo.MonitoringPoint;
                            pro.UpdatedTime = DateTimeHelper.GetDateTime();
                            if (loginfo.WorkingProcedure.Equals("OP80"))
                            {
                                if (pro.GetQcDataFlag != 0)
                                {
                                    pro.GetQcDataFlag = loginfo.GetQcDataFlag;//赋值标记 [Editby shaocx,2024-06-15]
                                }
                            }
                        }
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/DataCaptureHandlerV2/DataCaptureHandler_05.cs
@@ -154,7 +154,13 @@
                                    }
                                }
                                //特殊处理OP80 ã€Editby shaocx,2024-06-15】
                                if (WorkingProcedure.Equals("OP80"))
                                {
                                    wplog.GetQcDataFlag = 0;
                                }
                                //注释下面的方法,优化程序 ã€Editby shaocx,2024-06-15】
                                /*
                                try
                                {
                                    if (WorkingProcedure.Equals("OP80"))
@@ -334,6 +340,7 @@
                                    threadStatusMonitor.ErrorMsg = $" {RandomHelper.GenerateRandomCode(4)} è¯»å–{DataCapturePointCode}下线标记 å®Œæˆè¯»å–文件数据时异常,请查看日志!";
                                    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"OP80下线完成读取文件数据时异常,避免工序完成异常:", ex);
                                }
                                //*/
                                //更新WorkPieceInfo表以及插入WorkPieceLog表和WorkPieceInfoLog表
                                WorkPieceInfoManager.WorkingProcedureComplete(wplog, PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure));
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/DataCaptureHandlerV2/OP80QualityDataHandler.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,386 @@
using iWare_SCADA_BusinessLogical.BLL;
using iWare_SCADA_BusinessLogical.Utils;
using iWare_SCADA_Model;
using iWare_SCADA_Model.MiddleModel;
using log4net;
using System;
using System.Collections.Generic;
using System.Data.Entity.Core.Common.CommandTrees;
using System.Data.Entity.Validation;
using System.Data.SqlTypes;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web.UI.WebControls;
using System.Windows.Forms;
namespace iWare_SCADA_BusinessLogical
{
    /// <summary>
    /// OP80质量数据采集
    /// </summary>
    public class OP80QualityDataHandler : DataCaptureHandler
    {
        public static readonly OP80QualityDataHandler Instance = new OP80QualityDataHandler();
        public static readonly string path = ConfigHelper.GetConfigString("OP80QualityData");//OP80的地址
        public static readonly string query_WorkingProcedureCurrent = "OP80";
        public static readonly string _DataCapturePointCode = "OP8002";
        public static readonly LogType logType = LogType.PLCOP80_QC;
        public OP80QualityDataHandler()
        {
        }
        public override string WorkingProcedure
        {
            get { return _dataCaptureConfig.WorkingProcedure; }
        }
        public override string DataCapturePointCode
        {
            get { return _dataCaptureConfig.DataCapturePointCode; }
        }
        public override string DataCapturePointCname
        {
            get { return _dataCaptureConfig.DataCapturePointCname; }
        }
        public override void RefreshDataList(List<DataCaptureConfig> dataCaptureConfig)
        {
        }
        public override void DataCaptureStart()
        {
            while (true)
            {
                try
                {
                    Do();
                }
                catch (Exception ex)
                {
                    Log4NetHelper.WriteErrorLog(logType, $"OP80质量数据采集异常:", ex);
                }
                finally
                {
                }
            }
        }
        private void Do()
        {
            using (DbModel db = new DbModel())
            {
                try
                {
                    ThreadStatusMonitorMiddle threadStatusMonitor = new ThreadStatusMonitorMiddle();
                    threadStatusMonitor.ErrorMsg = "";
                    threadStatusMonitor.Threadcode = logType.ToString();
                    threadStatusMonitor.Threadcname = "OP80质量数据采集";
                    threadStatusMonitor.Threadendtime = DateTime.Now;
                    threadStatusMonitor.Threadstatue = 0;
                    threadStatusMonitor.ThreadId = Thread.CurrentThread.ManagedThreadId.ToString();
                    threadStatusMonitor.Threadlastmodifytime = DateTime.Now;
                    var processList = db.WorkPieceProcess.Where(o => o.WorkingProcedureCurrent == query_WorkingProcedureCurrent && o.GetQcDataFlag == 0
                    ).OrderBy(x => x.CreatedTime).ToList();
                    foreach (var item in processList)
                    {
                        var qualityData = db.QualityDataInfo.Where(o => o.WorkPieceID == item.WorkPieceID).FirstOrDefault();
                        if (qualityData == null)
                        {
                            Log4NetHelper.WriteErrorLog(logType, $"OP80质量数据采集异常,根据工件号{item.WorkPieceID}没有找到质量数据");
                            continue;
                        }
                        WorkPieceInfo info = db.WorkPieceInfo.Where(o => o.WorkPieceID == item.WorkPieceID).FirstOrDefault();
                        if (info == null)
                        {
                            Log4NetHelper.WriteErrorLog(logType, $"OP80质量数据采集异常,根据工件号{item.WorkPieceID}没有找到工件数据");
                            continue;
                        }
                        Do_One(db, info, item, qualityData, WorkingProcedure);
                        Thread.Sleep(1000);
                    }
                    WorkPieceInfoManager.ThreadMonitor(threadStatusMonitor);
                }
                catch (Exception e)
                {
                    Log4NetHelper.WriteErrorLog(logType, $" OP80质量数据采集异常:{e.Message} {e.StackTrace}");
                }
            }
        }
        private void Do_One(DbModel db, WorkPieceInfo info, WorkPieceProcess pieceProcess, QualityDataInfo qualityData, string WorkingProcedure)
        {
            try
            {
                if (WorkingProcedure.Equals("OP80"))
                {
                    var time = DateTimeHelper.GetDateTime();
                    //OP80 éœ€è¦æ‰«ææ–‡ä»¶è¯»å–质量信息
                    //扫描修改时间在上次扫描时间之前30秒到当前时间的之间的文件
                    List<FileInfo> files = new List<FileInfo>();
                    var newFiles = FileHelper.DetectNewFilesCSV(path, 300, time.AddDays(-7), time.AddDays(1));
                    foreach (var file in newFiles)
                    {
                        files.Add((FileInfo)file);
                    }
                    //files = files.OrderByDescending(o => o.LastWriteTime).ToList();
                    files = files.OrderBy(o => o.LastWriteTime).ToList();//时间升序
                    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"OP80下线完成读取到文件{files.Count()}个工件{pieceProcess.WorkPieceID} ");
                    bool isGetQcSuccess = false;
                    foreach (var file in files)
                    {//取倒序匹配的文件名为工件号的文件
                        if (file.Name.Contains(pieceProcess.WorkPieceID))
                        {
                            Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"OP80下线完成读取到文件{file.Name},是指定的工件{pieceProcess.WorkPieceID}");
                            WorkPieceLogMiddle wplog = new WorkPieceLogMiddle();
                            wplog.WorkPieceID = pieceProcess.WorkPieceID;
                            wplog.WorkingProcedure = _DataCapturePointCode;
                            wplog.Id = Yitter.IdGenerator.YitIdHelper.NextId();
                            wplog.EquipmentID = _dataCaptureConfig.EquipmentID; ;
                            wplog.Remarks = wplog.WorkingProcedure;
                            wplog.MonitoringPoint = _DataCapturePointCode;
                            wplog.CreatedTime = DateTimeHelper.GetDateTime();
                            wplog.CreatedUserName = _DataCapturePointCode;
                            wplog.UpdatedTime = DateTimeHelper.GetDateTime();
                            wplog.UpdatedUserName = Environment.MachineName + "自动" + Thread.CurrentThread.ManagedThreadId.ToString();
                            wplog.IsDeleted = false;
                            WorkPieceLog loginfo2 = new WorkPieceLog();
                            loginfo2 = EntityPropHelper.Mapper<WorkPieceLog, WorkPieceLogMiddle>(wplog);
                            var datatable = CSVHelper.ReadCSVList(file.FullName);
                            List<string> rowFirst = new List<string>();
                            List<string> rowSecond = new List<string>();
                            if (datatable.Count == 2)
                            {
                                rowFirst = datatable[0].Split(',').ToList();
                                rowSecond = datatable[1].Split(',').ToList();
                                if (rowSecond.Count < 11)
                                {
                                    continue;
                                }
                                //日期和时间    æ‰¹å·/标识号    åµŒå¥—号/主轴号    æ“ä½œç¬¦    æ–‡æœ¬    æµ‹é‡æœº    è¿‡ç¨‹å‚æ•°    æµ‹é‡ç³»ç»Ÿ    è¿‡ç¨‹å‚数值    åºåˆ—号    é›¶ä»¶è¯†åˆ«å·    1
                                OP80Info oP80Info = new OP80Info();
                                oP80Info.日期和时间 = rowSecond[0];
                                oP80Info.批号 = rowSecond[1];
                                oP80Info.嵌套号 = rowSecond[2];
                                oP80Info.操作符 = rowSecond[3];
                                oP80Info.文本 = rowSecond[4];
                                oP80Info.测量机 = rowSecond[5];
                                oP80Info.过程参数 = rowSecond[6];
                                oP80Info.测量系统 = rowSecond[7];
                                oP80Info.过程参数值 = rowSecond[8];
                                oP80Info.序列号 = rowSecond[9];
                                oP80Info.零件识别号 = rowSecond[10];
                                for (int i = 1; i <= (rowSecond.Count - 11) / 10; i++)
                                {
                                    if (rowSecond.Count < (11 + i * 10))
                                    {
                                        break;
                                    }
                                    //名称 ç›¸å¯¹å€¼ ç›¸å¯¹å€¼å•位 ç»å¯¹å€¼ ç»å¯¹å€¼å•位 åä¹‰å€¼ ä¸Šé™ ä¸‹é™  çŠ¶æ€/等级 åˆ†éš”符
                                    OP80ItemInfo item = new OP80ItemInfo();
                                    item.分隔符 = rowSecond[1 + i * 10];//例如:*   è¡¨å¤´ï¼šçŠ¶æ€
                                    item.名称 = rowSecond[2 + i * 10];//例如:Weight Big End    è¡¨å¤´ï¼š*
                                    item.相对值 = rowSecond[3 + i * 10];//例如:-2.8    è¡¨å¤´ï¼šç®€è¿°
                                    item.相对值单位 = rowSecond[4 + i * 10];//例如:gr    è¡¨å¤´ï¼šWeight Big End
                                    item.绝对值 = rowSecond[5 + i * 10];//例如:371.66    è¡¨å¤´ï¼šæµ‹é‡å•位
                                    item.绝对值单位 = rowSecond[6 + i * 10];//例如:gr    è¡¨å¤´ï¼šç»å¯¹å€¼
                                    item.名义值 = rowSecond[7 + i * 10];//例如:374.5    è¡¨å¤´ï¼šç»å¯¹å€¼æµ‹é‡å•位(UoM)
                                    item.上限 = rowSecond[8 + i * 10];//例如:10.5    è¡¨å¤´ï¼šåä¹‰å€¼
                                    item.下限 = rowSecond[9 + i * 10];//例如:-10.5    è¡¨å¤´ï¼šUSL值
                                    item.状态 = rowSecond[10 + i * 10];//例如:3    è¡¨å¤´ï¼šLSL值
                                    oP80Info.OP80ItemInfolist.Add(item);
                                    if (item.名称.Equals("Weight Class") || item.名称.Equals("Weight Small End")
                                        || item.名称.Equals("Weight Big End") || item.名称.Equals("Dime Small_End Class")
                                        || item.名称.Equals("Dime Big_End Class"))
                                    {
                                    }
                                    else
                                    {
                                        if (!string.IsNullOrEmpty(item.状态))
                                        {
                                            oP80Info.OP80ItemStatusInfolist.Add(item);
                                        }
                                    }
                                }
                                if (oP80Info.OP80ItemStatusInfolist.Count > 0)
                                {
                                    if (oP80Info.OP80ItemStatusInfolist.Any(o => !o.状态.Equals("OK")))
                                    {
                                        wplog.QualityStateStr = "NG";
                                    }
                                    else
                                    {
                                        wplog.QualityStateStr = "OK";
                                    }
                                }
                                else
                                {
                                    wplog.QualityStateStr = "OK";
                                }
                                wplog.OP80QualityFilePath = file.FullName;
                                wplog.OP80NewCode = oP80Info.批号?.Replace("#", "");
                                //大头重量
                                wplog.QualityOP80To1 = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Weight Big End")).FirstOrDefault()?.绝对值;
                                //小头重量
                                wplog.QualityOP80To2 = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Weight Small End")).FirstOrDefault()?.绝对值;
                                //总重
                                wplog.QualityOP80To3 = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Total Weight")).FirstOrDefault()?.绝对值;
                                //弯曲
                                wplog.QualityOP80To4 = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Bend to A")).FirstOrDefault()?.绝对值;
                                //扭度
                                wplog.QualityOP80To5 = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Twist to A")).FirstOrDefault()?.绝对值;
                                //大头垂直度
                                wplog.QualityOP80To6 = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Big_End_C_Squareness")).FirstOrDefault()?.绝对值;
                                //小头垂直度
                                wplog.QualityOP80To10 = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Sma_End_C_Squareness")).FirstOrDefault()?.绝对值;
                                //大头孔分组级别
                                wplog.QualityOP80To7 = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Dime Big_End Class")).FirstOrDefault()?.状态;
                                //小头孔分组级别
                                wplog.QualityOP80To8 = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Dime Small_End Class")).FirstOrDefault()?.状态;
                                //重量组别
                                wplog.QualityOP80To9 = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Weight Class")).FirstOrDefault()?.状态;
                                //wplog.Remarks = (wplog.Remarks ?? "") + $"OP80下线完成读取文件{file.FullName},数据【{wplog.OP80NewCode??"空"}】【{wplog.QualityOP80To1 ?? "空"}】【{wplog.QualityOP80To2 ?? "空"}】【{wplog.QualityOP80To3 ?? "空"}】【{wplog.QualityOP80To4 ?? "空"}】【{wplog.QualityOP80To5 ?? "空"}】";
                                //新增OP80的一些质量数据 ã€Editby shaocx,2024-06-13】
                                wplog.QualityOP80_Houdu = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Big_End_Thickness")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_ZXJ = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Distance of Two Head")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_DTKYZD = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Big_End_Cylindricity")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_XTSMYD = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Small_End_Top_Roundn")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_XTXMYD = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Small_End_Bot_Roundn")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_D_S_X = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Big_End_Top_X_Dia.")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_D_S_Y = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Big_End_Top_Y_Dia.")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_D_X_X = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Big_End_Bot_X_Dia.")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_D_X_Y = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Big_End_Bot_Y_Dia.")).FirstOrDefault()?.绝对值;
                                //计算大头孔直径,大头孔直径=(大头上面X方向直径+大头上面Y方向直径+大头下面X方向直径+大头下面Y方向直径)/4
                                List<decimal> valueList = new List<decimal>() {
                                                        SystemHelper.GetDecimal(wplog.QualityOP80_D_S_X),
                                                        SystemHelper.GetDecimal(wplog.QualityOP80_D_S_Y),
                                                        SystemHelper.GetDecimal(wplog.QualityOP80_D_X_X),
                                                        SystemHelper.GetDecimal(wplog.QualityOP80_D_X_Y),
                                                    };
                                wplog.QualityOP80_D_TKZJ = SystemHelper.CalcDecimalAvg(valueList, 3);
                                wplog.QualityOP80_X_S_X = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Small_End_Top_X_Dia.")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_X_S_Y = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Small_End_Top_Y_Dia.")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_X_X_X = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Small_End_Bot_X_Dia.")).FirstOrDefault()?.绝对值;
                                wplog.QualityOP80_X_X_Y = oP80Info.OP80ItemInfolist.Where(o => o.名称.Equals("Small_End_Bot_Y_Dia.")).FirstOrDefault()?.绝对值;
                                //计算小头孔直径,小头孔直径=(小头上面X方向直径+小头上面Y方向直径+小头下面X方向直径+小头下面Y方向直径)/4
                                valueList = new List<decimal>();
                                valueList = new List<decimal>() {
                                                        SystemHelper.GetDecimal(wplog.QualityOP80_X_S_X),
                                                        SystemHelper.GetDecimal(wplog.QualityOP80_X_S_Y),
                                                        SystemHelper.GetDecimal(wplog.QualityOP80_X_X_X),
                                                        SystemHelper.GetDecimal(wplog.QualityOP80_X_X_Y),
                                                    };
                                wplog.QualityOP80_X_TKZJ = SystemHelper.CalcDecimalAvg(valueList, 3);
                            }
                            else
                            {
                                wplog.Remarks = (wplog.Remarks ?? "") + $"OP80下线完成读取文件{file.FullName}异常,行数不是2行";
                            }
                            //更新WorkPieceInfo表以及插入WorkPieceLog表和WorkPieceInfoLog表
                            info.OP80NewCode = wplog.OP80NewCode;//更新成品吗
                            info.QualityState = (int)((wplog.QualityStateStr.Equals("OK") || wplog.QualityStateStr.Equals("0K")) ? QualityState.OK : QualityState.NG);
                            wplog.QualityState = info.QualityState;
                            info.QualityStateUpdateUser = wplog.UpdatedUserName;
                            info.QualityStateUpdateTime = wplog.UpdatedTime.Value.LocalDateTime;
                            info.QualityStateUpdateMode = QualityStateUpdateMode.Auto.ToString();
                            //var qualityData = db.QualityDataInfo.Where(o => o.WorkPieceID == wplog.WorkPieceID).FirstOrDefault();
                            //if (qualityData == null || qualityData.WorkPieceID.Length < 1 || qualityData.WorkingProcedure.Length < 1)
                            //{//插入QualityDataInfo表
                            //    qualityData = EntityPropHelper.Mapper<QualityDataInfo, WorkPieceLog>(wplog);
                            //    db.QualityDataInfo.Add(GetAddQualityDataInfo(qualityData));
                            //}
                            //修改QualityDataInfo表 //重复收到质量信息,会覆盖之前的
                            EntityPropHelper<WorkPieceLogMiddle, QualityDataInfo>.CopyProp(wplog, qualityData, WorkPieceInfoManager.GetQualityDataInfoUpdate(wplog.WorkingProcedure, wplog.MonitoringPoint));//指定修改字段
                            qualityData.QualityStateUpdateUser = info.UpdatedUserName;
                            qualityData.QualityReceiveTime = info.UpdatedTime.Value.LocalDateTime;
                            qualityData.QualityStateUpdateMode = info.QualityStateUpdateMode;
                            qualityData.OP80QualityState = wplog.QualityState.HasValue ? wplog.QualityState.Value.ToString() : "3";
                            qualityData.OP80QualityReceiveTime = DateTimeHelper.GetDateTime();
                            qualityData.OP80QualityFilePath = wplog.OP80QualityFilePath;
                            long op80id = qualityData.Id;
                            if (op80id > 0)
                            {
                                pieceProcess.QualityDataInfoID = op80id;
                            }
                            loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"质量:{wplog.QualityStateStr ?? "空"}";
                            if (!info.QualityState.Equals(((int)QualityState.OK).ToString()))
                            {
                                info.QualityErrorInfo = $"{wplog.WorkingProcedure}工序质量采集数据不合格";
                            }
                            else
                            {
                                info.QualityErrorInfo = "";
                            }
                            pieceProcess.GetQcDataCount = (pieceProcess.GetQcDataCount ?? 0) + 1;
                            pieceProcess.GetQcDataFlag_Remark = "找到文件";
                            pieceProcess.GetQcDataFlag = 1;
                            db.WorkPieceLog.Add(WorkPieceInfoManager.GetAddWorkPieceLog(loginfo2));//插入工件采集日志表
                            //转移文件
                            var toPath = file.FullName.Replace("CA4GC20TD", "CA4GC20TD_COPY");
                            File.Move(file.FullName, toPath);//移动
                            db.SaveChanges();
                            isGetQcSuccess = true;
                            break;
                        }
                        else
                        {
                        }
                    }
                    if (isGetQcSuccess == false)
                    {
                        pieceProcess.GetQcDataCount = (pieceProcess.GetQcDataCount ?? 0) + 1;
                        pieceProcess.GetQcDataFlag_Remark = "没有找到文件";
                        if (pieceProcess.GetQcDataCount >= 10)
                        {
                            pieceProcess.GetQcDataFlag = 2;
                        }
                        db.SaveChanges();
                        Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"OP80下线完成读取文件没有找到指定工件{info.WorkPieceID}的文件");
                    }
                }
            }
            catch (Exception ex)
            {
                Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $"指定工件{info.WorkPieceID},OP80下线完成读取文件数据时异常,避免工序完成异常:", ex);
            }
        }
    }
}
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/iWare_SCADA_BusinessLogical.csproj
@@ -83,6 +83,7 @@
    <Compile Include="BLL\SystemValue.cs" />
    <Compile Include="BLL\WorkPieceInfoManager.cs" />
    <Compile Include="BLL\WorkPieceLogManager.cs" />
    <Compile Include="DataCaptureHandlerV2\OP80QualityDataHandler.cs" />
    <Compile Include="DataCaptureHandlerV2\DataCaptureHandler_01.cs" />
    <Compile Include="DataCaptureHandlerV2\DataCaptureHandler_OP3002.cs" />
    <Compile Include="DataCaptureHandlerV2\DataCaptureHandler_02.cs" />
@@ -181,6 +182,10 @@
  <ItemGroup>
    <None Include="App.config" />
    <None Include="DLA\Dao\_system~.ini" />
    <None Include="log4net_iWare - å¤åˆ¶ç”¨.config">
      <SubType>Designer</SubType>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Include="log4net_iWare.config">
      <SubType>Designer</SubType>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/log4net_iWare - ¸´ÖÆÓÃ.config
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
<configuration>
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
  </configSections>
  <appSettings>
  </appSettings>
  <log4net>
    <!--  OP80质量采集线程【信息】日志-->
    <appender name="PLCOP80_QC_Info" type="log4net.Appender.RollingFileAppender">
      <file value="D:\\Log\\SCADALog\\PLCOP80_QC_Info\\" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <datePattern value="yyyy-MM-dd.LOG" />
      <layout type="log4net.Layout.PatternLayout">
        <!--输出格式-->
        <param name="ConversionPattern" value="%n消息时间:%d [%t] %n消息级别:%-5p %n消 æ¯ ç±»ï¼š%c [%x] %n%m %n "/>
      </layout>
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="PLCOP80_QC_Info" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>
    <!--OP80质量采集线程【错误】日志-->
    <appender name="PLCOP80_QC_Error" type="log4net.Appender.RollingFileAppender">
      <file value="D:\\Log\\SCADALog\\PLCOP80_QC_Error\\" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <datePattern value="yyyy-MM-dd.LOG" />
      <layout type="log4net.Layout.PatternLayout">
        <!--输出格式-->
        <param name="ConversionPattern" value="%n异常时间:%d [%t] %n异常级别:%-5p %n异 å¸¸ ç±»ï¼š%c [%x] %n%m %n "/>
      </layout>
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="PLCOP80_QC_Error" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="PLCOP80_QC_Info"/>
      <appender-ref ref="PLCOP80_QC_Error"/>
    </root>
  </log4net>
</configuration>
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/log4net_iWare.config
@@ -5,6 +5,38 @@
  <appSettings>
  </appSettings>
  <log4net>
    <!--  OP80质量采集线程【信息】日志-->
    <appender name="PLCOP80_QC_Info" type="log4net.Appender.RollingFileAppender">
      <file value="D:\\Log\\SCADALog\\PLCOP80_QC_Info\\" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <datePattern value="yyyy-MM-dd.LOG" />
      <layout type="log4net.Layout.PatternLayout">
        <!--输出格式-->
        <param name="ConversionPattern" value="%n消息时间:%d [%t] %n消息级别:%-5p %n消 æ¯ ç±»ï¼š%c [%x] %n%m %n "/>
      </layout>
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="PLCOP80_QC_Info" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>
    <!--OP80质量采集线程【错误】日志-->
    <appender name="PLCOP80_QC_Error" type="log4net.Appender.RollingFileAppender">
      <file value="D:\\Log\\SCADALog\\PLCOP80_QC_Error\\" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <datePattern value="yyyy-MM-dd.LOG" />
      <layout type="log4net.Layout.PatternLayout">
        <!--输出格式-->
        <param name="ConversionPattern" value="%n异常时间:%d [%t] %n异常级别:%-5p %n异 å¸¸ ç±»ï¼š%c [%x] %n%m %n "/>
      </layout>
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="PLCOP80_QC_Error" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>
    <!--  è™šæ‹Ÿåº“存出库线程【信息】日志-->
    <appender name="FormMain_Info" type="log4net.Appender.RollingFileAppender">
      <file value="D:\\Log\\SCADALog\\FormMain_Info\\" />
@@ -461,6 +493,8 @@
    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="PLCOP80_QC_Info"/>
      <appender-ref ref="PLCOP80_QC_Error"/>
      <appender-ref ref="FormMain_Info"/>
      <appender-ref ref="FormMain_Error"/>
      <appender-ref ref="PLCOP05_Info"/>
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_DataCaptureV3/FormMain.cs
@@ -1529,6 +1529,10 @@
                //告警监控
                AlertMonitor alert = new AlertMonitor();
                _dataCaptureHandler.Add(alert);
                //OP80的获取质量数据 ã€Editby shaocx,2024-06-15】
                OP80QualityDataHandler op80QualityDataHandler = new OP80QualityDataHandler();
                _dataCaptureHandler.Add(op80QualityDataHandler);
                #endregion
                try
@@ -1838,8 +1842,8 @@
                    switch (config.DataCapturePointCode)
                    {
                        case "OP2002A":
                        //case "OP2002B":
                        //case "OP2002C":
                            //case "OP2002B":
                            //case "OP2002C":
                            DataCaptureHandler_02 dc02 = new DataCaptureHandler_02();
                            dc02._dataCaptureConfig = config;
                            _dataCaptureHandler.Add(dc02);
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_Model/Enums.cs
@@ -38,7 +38,7 @@
        /// <summary>
        /// åœ¨åˆ¶å“
        /// </summary>
        WIP=1,
        WIP = 1,
        /// <summary>
        /// æŽ¨å‡º
        /// </summary>
@@ -69,15 +69,15 @@
        /// <summary>
        /// åˆæ ¼
        /// </summary>
        OK=1,
        OK = 1,
        /// <summary>
        /// ä¸åˆæ ¼
        /// </summary>
        NG=2,
        NG = 2,
        /// <summary>
        /// ç–‘ä¼¼
        /// </summary>
        Suspected=3
        Suspected = 3
    }
    /// <summary>
    /// è´¨é‡çŠ¶æ€ä¿®æ”¹æ–¹å¼
@@ -87,11 +87,11 @@
        /// <summary>
        /// æ‰‹åЍ
        /// </summary>
        Manual=1,
        Manual = 1,
        /// <summary>
        /// è‡ªåЍ
        /// </summary>
        Auto= 2,
        Auto = 2,
        /// <summary>
        /// è‡ªåЍ
        /// </summary>
@@ -108,7 +108,7 @@
        /// </summary>
        Online = 2
    }
    public enum EDbError
    {
        è®°å½•已存在 = -2146233087
@@ -136,7 +136,7 @@
        /// <summary>
        /// ä¸»ç•Œé¢å¼‚常
        /// </summary>
        FormMain=1,
        FormMain = 1,
        #region PLC采集 å·¥åºç›¸å…³
        PLCOP05 = 10,
@@ -150,6 +150,10 @@
        PLCOP70 = 18,
        PLCOP80 = 19,
        PLCHMI = 20,
        /// <summary>
        /// OP80的质量数据采集 ã€Editby shaocx,2024-06-16】
        /// </summary>
        PLCOP80_QC = 21,
        #endregion
        #region PLC相关
@@ -177,16 +181,16 @@
    public enum WorkingProcedureForHMI
    {
        OP05=1,
        OP10=2,
        OP20=3,
        OP30=4,
        OP35=5,
        OP40=6,
        OP50=7,
        OP60=8,
        OP70=9,
        OP80=10,
        OP05 = 1,
        OP10 = 2,
        OP20 = 3,
        OP30 = 4,
        OP35 = 5,
        OP40 = 6,
        OP50 = 7,
        OP60 = 8,
        OP70 = 9,
        OP80 = 10,
    }
    public enum FeedbackMode
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_Model/MiddleModel/WorkPieceLogMiddle.cs
@@ -12,6 +12,11 @@
    [NotMapped]
    public class WorkPieceLogMiddle : WorkPieceLog
    {
        /// <summary>
        /// OP80获取QC数据标记,0表示待获取,1表示获取成功,2表示获取失败 ã€Editby shaocx,2024-06-15】
        /// </summary>
        public int? GetQcDataFlag { get; set; }
        #region SPC,NOOK æŽ¨å‡ºå¤šä»¶ OP20,OP50,OP60
        public string WorkPieceIDA { get; set; }
        public string WorkPieceIDB { get; set; }
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_Model/TableModel/WorkPieceProcess.cs
@@ -44,12 +44,27 @@
        [StringLength(50)]
        public string UpdatedUserName { get; set; }
        [StringLength(50)]
        public string OperationType { get; set; }
        [StringLength(255)]
        public string Remarks { get; set; }
        public bool IsDeleted { get; set; }
        /// <summary>
        /// èŽ·å–QC数据标记,0表示待获取,1表示获取成功,2表示获取失败 ã€Editby shaocx,2024-06-15】
        /// </summary>
        public int? GetQcDataFlag { get; set; }
        /// <summary>
        /// èŽ·å–QC数据标记次数 ã€Editby shaocx,2024-06-15】
        /// </summary>
        public int? GetQcDataCount { get; set; }
        /// <summary>
        /// èŽ·å–QC数据标记描述 ã€Editby shaocx,2024-06-15】
        /// </summary>
        public string GetQcDataFlag_Remark { get; set; }
    }
}