schangxiang@126.com
2024-06-17 a066604943cd69ba5c10a400aa55f8f39b4f4ff3
修复
已修改2个文件
205 ■■■■ 文件已修改
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/DataCaptureHandlerV2/OP80QualityDataHandler.cs 195 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_Test/UnitTest1.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/DataCaptureHandlerV2/OP80QualityDataHandler.cs
@@ -28,6 +28,7 @@
        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 string _EquipmentId = "EOP80";
        public static readonly LogType logType = LogType.PLCOP80_QC;
        public OP80QualityDataHandler()
@@ -88,6 +89,20 @@
                    threadStatusMonitor.ThreadId = Thread.CurrentThread.ManagedThreadId.ToString();
                    threadStatusMonitor.Threadlastmodifytime = DateTime.Now;
                    var time = DateTimeHelper.GetDateTime();
                    //OP80 需要扫描文件读取质量信息
                    //扫描修改时间在上次扫描时间之前30秒到当前时间的之间的文件
                    List<FileInfo> allFiles = new List<FileInfo>();
                    var newFiles = FileHelper.DetectNewFilesCSV(path, 300, time.AddDays(-30), time.AddDays(1));
                    foreach (var file in newFiles)
                    {
                        allFiles.Add((FileInfo)file);
                    }
                    //files = files.OrderByDescending(o => o.LastWriteTime).ToList();
                    allFiles = allFiles.OrderBy(o => o.LastWriteTime).ToList();//时间升序
                    Log4NetHelper.WriteInfoLog(logType, $"OP80下线完成读取到文件{allFiles.Count()}个");
                    var processList = db.WorkPieceProcess.Where(o => o.WorkingProcedureCurrent == query_WorkingProcedureCurrent && o.GetQcDataFlag == 0
                    ).OrderBy(x => x.CreatedTime).ToList();
                    foreach (var item in processList)
@@ -105,10 +120,30 @@
                            continue;
                        }
                        Do_One(db, info, item, qualityData, query_WorkingProcedureCurrent);
                        var findFiles = allFiles.Where(x => x.Name.Contains(item.WorkPieceID)).OrderByDescending(x => x.LastWriteTime).ToList();
                        if (findFiles != null && findFiles.Count > 0)
                        {
                            var file = findFiles.First();
                        }
                        Do_One(false, false, false, allFiles, db, info, item, qualityData, findFiles);
                        Thread.Sleep(1000);
                    }
                    //处理剩余的文件
                    if (allFiles.Count() > 0)
                    {
                        Log4NetHelper.WriteErrorLog(logType, $" OP80质量数据采集异常:发现要处理剩余的文件{allFiles.Count()}件");
                        foreach (var otherFile in allFiles)
                        {
                            DoOtherFile(allFiles, otherFile, db);
                            Thread.Sleep(1000);
                        }
                    }
                    Thread.Sleep(1000);
                    WorkPieceInfoManager.ThreadMonitor(threadStatusMonitor);
                }
@@ -119,31 +154,15 @@
            }
        }
        private void Do_One(DbModel db, WorkPieceInfo info, WorkPieceProcess pieceProcess, QualityDataInfo qualityData, string WorkingProcedure)
        private void Do_One(bool isAdd_WorkPieceInfo, bool isAdd_WorkPieceProcess, bool isAdd_QualityDataInfo, List<FileInfo> allFiles, DbModel db, WorkPieceInfo info, WorkPieceProcess pieceProcess, QualityDataInfo qualityData,
             List<FileInfo> findFiles)
        {
            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(-30), 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.WriteInfoLog(logType, $"OP80下线完成读取到文件{files.Count()}个工件{pieceProcess.WorkPieceID} ");
                    bool isGetQcSuccess = false;
                    var findFiles = files.Where(x => x.Name.Contains(pieceProcess.WorkPieceID)).OrderByDescending(x => x.LastWriteTime).ToList();
                    if (findFiles != null && findFiles.Count > 0)
                    {
                        var file = findFiles.First();
                        Log4NetHelper.WriteInfoLog(logType, $"OP80下线完成读取到文件{file.Name},是指定的工件{pieceProcess.WorkPieceID}");
@@ -322,7 +341,7 @@
                        //修改QualityDataInfo表 //重复收到质量信息,会覆盖之前的
                        EntityPropHelper<WorkPieceLogMiddle, QualityDataInfo>.CopyProp(wplog, qualityData, WorkPieceInfoManager.GetQualityDataInfoUpdate(wplog.WorkingProcedure, wplog.MonitoringPoint));//指定修改字段
                        qualityData.EquipmentID = "EOP80";
                qualityData.EquipmentID = _EquipmentId;
                        qualityData.QualityStateUpdateUser = info.UpdatedUserName;
                        qualityData.QualityReceiveTime = info.UpdatedTime.Value.LocalDateTime;
                        qualityData.QualityStateUpdateMode = info.QualityStateUpdateMode;
@@ -348,6 +367,7 @@
                        pieceProcess.GetQcDataFlag_Remark = "找到文件";
                        pieceProcess.GetQcDataFlag = 1;
                        pieceProcess.QualityState = info.QualityState.HasValue ? info.QualityState.Value : (int)QualityState.OK;
                pieceProcess.EndTime = file.LastWriteTime;//下线时间改为 文件最后修改时间 【Editby shaocx,2024-06-17】
                        db.WorkPieceLog.Add(WorkPieceInfoManager.GetAddWorkPieceLog(loginfo2));//插入工件采集日志表
@@ -358,13 +378,27 @@
                        {
                            var toPath = item.FullName.Replace("CA4GC20TD", "CA4GC20TD_COPY");
                            File.Move(item.FullName, toPath);//移动
                    allFiles.Remove(item);//集合移除
                }
                if (isAdd_WorkPieceInfo)
                {
                    db.WorkPieceInfo.Add(info);
                }
                if (isAdd_WorkPieceProcess)
                {
                    db.WorkPieceProcess.Add(pieceProcess);
                }
                if (isAdd_QualityDataInfo)
                {
                    db.QualityDataInfo.Add(qualityData);
                        }
                        db.SaveChanges();
                        isGetQcSuccess = true;
                        Log4NetHelper.WriteInfoLog(logType, $"OP80下线完成读取文件,成功处理了指定工件{info.WorkPieceID}的文件");
                    }
                    if (isGetQcSuccess == false)
                    {
@@ -380,12 +414,127 @@
                        Log4NetHelper.WriteErrorLog(logType, $"OP80下线完成读取文件没有找到指定工件{info.WorkPieceID}的文件");
                    }
                }
            }
            catch (Exception ex)
            {
                Log4NetHelper.WriteErrorLog(logType, $"指定工件{info.WorkPieceID},OP80下线完成读取文件数据时异常,避免工序完成异常:", ex);
            }
        }
        private void DoOtherFile(List<FileInfo> allFiles, FileInfo file, DbModel db)
        {
            var arr = file.Name.Split('-');
            if (arr.Length > 0)
            {
                if (string.IsNullOrEmpty(arr[0]))
                {
                    MoveFileToNoNum(allFiles, file);
                    Log4NetHelper.WriteErrorLog(logType, $" OP80质量数据采集异常:处理剩余的文件,转移到没有单号文件夹中,{file.Name}");
                    return;
                }
                else
                {
                    if (file.LastWriteTime > DateTime.Now.AddDays(-1))
                    {
                        //当天内的文件暂不处理
                        return;
                    }
                    //如果是15天前的文件,则转移到错误文件夹中
                    if (file.LastWriteTime.AddDays(15) < DateTime.Now)
                    {
                        MoveFileToNoError(allFiles, file);
                        Log4NetHelper.WriteErrorLog(logType, $" OP80质量数据采集异常:处理剩余的文件,转移到错误文件夹中,{file.Name}");
                        return;
                    }
                    var pieceID = arr[0];
                    if (pieceID == "Err")
                    {
                        MoveFileToNoNum(allFiles, file);
                        Log4NetHelper.WriteErrorLog(logType, $" OP80质量数据采集异常:处理剩余的文件,转移到没有单号文件夹中,{file.Name}");
                        return;
                    }
                    //调用公共处理方法
                    bool isAdd_WorkPieceInfo = false;
                    bool isAdd_WorkPieceProcess = false;
                    bool isAdd_QualityDataInfo = false;
                    WorkPieceInfo info = db.WorkPieceInfo.Where(o => o.WorkPieceID == pieceID).FirstOrDefault();
                    if (info == null)
                    {
                        isAdd_WorkPieceInfo = true;
                        info = new WorkPieceInfo()
                        {
                            Id = Yitter.IdGenerator.YitIdHelper.NextId(),
                            WorkPieceID = pieceID,
                            WorkingProcedureCurrent = query_WorkingProcedureCurrent,
                            EquipmentID = _EquipmentId,
                            CreatedTime = DateTime.Now,
                            CreatedUserName = _DataCapturePointCode
                        };
                    }
                    var qualityData = db.QualityDataInfo.Where(o => o.WorkPieceID == pieceID).FirstOrDefault();
                    if (qualityData == null || qualityData.WorkPieceID.Length < 1 || qualityData.WorkingProcedure.Length < 1)
                    {//插入QualityDataInfo表
                        isAdd_QualityDataInfo = true;
                        qualityData = new QualityDataInfo()
                        {
                            Id = Yitter.IdGenerator.YitIdHelper.NextId(),
                            WorkPieceID = pieceID,
                            WorkingProcedure = query_WorkingProcedureCurrent,
                            CreatedTime = DateTime.Now,
                            CreatedUserName = _DataCapturePointCode,
                            EquipmentID = _EquipmentId,
                        };
                    }
                    var process = db.WorkPieceProcess.Where(o => o.WorkPieceID == pieceID && o.WorkingProcedureCurrent == info.WorkingProcedureCurrent && o.OperationType == OperationType.生产.ToString()).OrderByDescending(o => o.StartTime).FirstOrDefault();
                    if (process == null)
                    {
                        isAdd_WorkPieceProcess = true;
                        process = new WorkPieceProcess();
                        process = EntityPropHelper.Mapper<WorkPieceProcess, WorkPieceInfo>(info);
                        process.Id = Yitter.IdGenerator.YitIdHelper.NextId();
                        process.WorkingProcedureCurrent = query_WorkingProcedureCurrent;
                        process.StartTime = DateTimeHelper.GetDateTime();
                        process.EndTime = file.LastWriteTime;
                        process.CreatedUserName = _DataCapturePointCode;
                        process.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
                        process.UpdatedUserName = _DataCapturePointCode;
                        process.UpdatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
                        process.OperationType = OperationType.生产.ToString();
                        process.Remarks = "";
                    }
                    //调用方法
                    Do_One(isAdd_WorkPieceInfo, isAdd_WorkPieceProcess, isAdd_QualityDataInfo, allFiles, db, info, process, qualityData, new List<FileInfo>() { file });
                }
            }
            else
            {
                //移除该文件到CA4GC20TD_NoNum
                MoveFileToNoNum(allFiles, file);
                Log4NetHelper.WriteErrorLog(logType, $" OP80质量数据采集异常:处理剩余的文件,转移到没有单号文件夹中,{file.Name}");
            }
        }
        private void MoveFileToNoNum(List<FileInfo> allFiles, FileInfo file)
        {
            //移除该文件到CA4GC20TD_NoNum
            var toPath = file.FullName.Replace("CA4GC20TD", "CA4GC20TD_NoNum");
            File.Move(file.FullName, toPath);//移动
            allFiles.Remove(file);
        }
        private void MoveFileToNoError(List<FileInfo> allFiles, FileInfo file)
        {
            //移除该文件到CA4GC20TD_NoNum
            var toPath = file.FullName.Replace("CA4GC20TD", "CA4GC20TD_Error");
            File.Move(file.FullName, toPath);//移动
            allFiles.Remove(file);
        }
    }
}
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_Test/UnitTest1.cs
@@ -37,5 +37,15 @@
                File.Move(file.FullName, "../CA4GC20TD_COPY/" + file.Name);//移动
            }
        }
        [TestMethod]
        public void bb()
        {
            var aa = "-2024-06-16_08_43_23__part_";
            var bb = aa.Split('-');
            string cc = bb[0];
        }
    }
}