schangxiang@126.com
2024-09-05 0850ca67bbc4b7581a595ab985904f7acb8ecb5e
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/BLL/WorkPieceInfoManager.cs
@@ -183,7 +183,7 @@
                                info.Remarks = $"工件二维码第一次出现的工序{loginfo.WorkingProcedure}不是OP05,数据缺失,请确认情况并做相应处理!";
                            }
                            else
                            {
                            {//OP05工序
                                info.QualityState = (int)QualityStateEnum.OK;//此处需要注意,判断所有工序质量,然后再赋值 //默认合格,OP05默认是合格
                                info.Remarks = "OP05新增工件信息";
                            }
@@ -203,20 +203,29 @@
                                return;
                            }
                        }
                        info.WorkingProcedureStartTime = DateTimeHelper.GetDateTime();//
                        info.WorkingProcedureEndTime = null;
                        info.WorkPieceState = (int)WorkPieceState.WIP;
                        info.EquipmentID = loginfo.EquipmentID;
                        info.QualityStateUpdateUser = loginfo.UpdatedUserName;
                        info.QualityStateUpdateTime = loginfo.UpdatedTime.Value.LocalDateTime;
                        info.QualityStateUpdateMode = QualityStateUpdateMode.Auto.ToString();
                        info.UpdatedUserName = loginfo.MonitoringPoint;
                        SystemBussinessHelper.SetWorkPieceInfoMiddleForUpdateDataCapturePointCname(ref info, loginfo.DataCapturePointCname);
                        info.UpdatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
                        info.WorkPieceCurrentPosition = loginfo.WorkingProcedure;
                        info.WorkPieceCurrentPositionOrder = info.WorkingProcedurePlan.IndexOf(loginfo.WorkingProcedure) / 2;
                        info.WorkingProcedureCurrent = loginfo.WorkingProcedure;
                        info.Remarks = $"{info.WorkingProcedureCurrent}工件上线";
                        if ((info.WorkingProcedureCurrent.Equals("OP05") && isAddWorkPieceInfo == false))
                        {
                            //如果是OP05的,并且是 不需要新增 表WorkPieceInfo,那么就不需要更新表 WorkPieceInfo
                        }
                        else
                        {
                            info.WorkingProcedureStartTime = DateTimeHelper.GetDateTime();//
                            info.WorkingProcedureEndTime = null;
                            info.WorkPieceState = (int)WorkPieceState.WIP;
                            info.EquipmentID = loginfo.EquipmentID;
                            info.QualityStateUpdateUser = loginfo.UpdatedUserName;
                            info.QualityStateUpdateTime = loginfo.UpdatedTime.Value.LocalDateTime;
                            info.QualityStateUpdateMode = QualityStateUpdateMode.Auto.ToString();
                            info.UpdatedUserName = loginfo.MonitoringPoint;
                            SystemBussinessHelper.SetWorkPieceInfoMiddleForUpdateDataCapturePointCname(ref info, loginfo.DataCapturePointCname);
                            info.UpdatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
                            info.WorkPieceCurrentPosition = loginfo.WorkingProcedure;
                            info.WorkPieceCurrentPositionOrder = info.WorkingProcedurePlan.IndexOf(loginfo.WorkingProcedure) / 2;
                            info.WorkingProcedureCurrent = loginfo.WorkingProcedure;
                            info.Remarks = $"{info.WorkingProcedureCurrent}工件上线";
                        }
                        //修复下 op35 同一个件 下线时间跟下一个上线时间一模一样的问题  【Editby shaocx,2024-08-27】
                        var isNeedAddNewProcess = true;
@@ -274,116 +283,127 @@
                            new_process.Remarks = "";
                            new_process.MyRemarks = "读码上线时,每次扫描上线都插入追溯表";
                            if (loginfo.WorkingProcedure.Equals("OP05"))
                            {
                            {//特殊处理OP05工序
                                new_process.EndTime = new_process.StartTime;
                                //如果已经存在其他工序,那么就必须要按照其他工序的时间往前推数据 【Editby shaocx,2024-09-05】
                                var op05OtherProccss = db.WorkPieceProcess.Where(o => o.WorkPieceID == loginfo.WorkPieceID).OrderBy(x => x.StartTime).FirstOrDefault();
                                if (op05OtherProccss != null)
                                {//说明有,那么时间就按照这个时间往前推
                                    var _time = op05OtherProccss.StartTime.AddHours(-1);
                                    new_process.StartTime = _time;
                                    new_process.EndTime = _time;
                                    new_process.CreatedTime = _time;
                                    new_process.UpdatedTime = _time;
                                }
                                db.WorkPieceProcess.Add(new_process);
                            }
                            db.WorkPieceProcess.Add(new_process);
                        }
                        //db.Database.AutoTransactionsEnabled = false;// 同一个SaveChanges默认事务, 关闭默认事务:... 好像不能用啊,后面再研究吧
                        if (isAddWorkPieceInfo)
                        {
                            db.WorkPieceInfo.Add(info);
                        }
                        else
                        {//不确定info是直接会修改还是需要再次查询,待测试
                         //info.Remarks = "修改,具体修改逻辑待定";
                        }
                        #region 判断是否跳序,或质量不符合 然后反馈PLC
                        if (IsFeedback.HasValue && IsFeedback.Value == (int)FeedbackMode.FeedbackPLC)
                        {
                            bool checkQualityInfoCompleteFlag = false;
                            bool plcFlag = true;//反馈给PLC的标记
                            string message = "";
                            checkQualityInfoCompleteFlag = WorkPieceInfoManager.CheckQualityInfoComplete(info, loginfo, type);
                            if (!checkQualityInfoCompleteFlag || info.QualityState != (int)QualityStateEnum.OK)
                            //db.Database.AutoTransactionsEnabled = false;// 同一个SaveChanges默认事务, 关闭默认事务:... 好像不能用啊,后面再研究吧
                            if (isAddWorkPieceInfo)
                            {
                                plcFlag = false;
                                message = !checkQualityInfoCompleteFlag ? "跳序," : "";
                                message += info.QualityState != (int)QualityStateEnum.OK ? "质量不符合" : "";
                                db.WorkPieceInfo.Add(info);
                            }
                            ////反馈给PLC,(写入点待定)
                            //MessageModel fr = null;
                            //fr = plcService.WriteValuePoint("", "", plcFlag, PLCManger.GetTypeForString("bool"));
                            //if (fr.result)
                            //{
                            //    Log4NetHelper.WriteInfoLog(type, $" 工件{info.WorkPieceID} {loginfo.WorkingProcedure}工序反馈给PLC 成功, 出现 {message}");
                            //}
                            //else
                            //{
                            //    Log4NetHelper.WriteErrorLog(type, $" 工件{info.WorkPieceID} {loginfo.WorkingProcedure}工序反馈给PLC 失败, 出现 {message} ,失败原因:{fr.resMsg}");
                            //}
                            else
                            {//不确定info是直接会修改还是需要再次查询,待测试
                             //info.Remarks = "修改,具体修改逻辑待定";
                            }
                            //#region 反馈PLC
                            #region 判断是否跳序,或质量不符合 然后反馈PLC
                            if (IsFeedback.HasValue && IsFeedback.Value == (int)FeedbackMode.FeedbackPLC)
                            {
                                bool checkQualityInfoCompleteFlag = false;
                                bool plcFlag = true;//反馈给PLC的标记
                                string message = "";
                                checkQualityInfoCompleteFlag = WorkPieceInfoManager.CheckQualityInfoComplete(info, loginfo, type);
                            //bool checkQualityInfoCompleteFlag = false;
                            //bool plcFlag = true;//反馈给PLC的标记
                            //string message = "";
                            //checkQualityInfoCompleteFlag = WorkPieceInfoManager.CheckQualityInfoComplete(info, wplog, PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure));
                                if (!checkQualityInfoCompleteFlag || info.QualityState != (int)QualityStateEnum.OK)
                                {
                                    plcFlag = false;
                                    message = !checkQualityInfoCompleteFlag ? "跳序," : "";
                                    message += info.QualityState != (int)QualityStateEnum.OK ? "质量不符合" : "";
                                }
                                ////反馈给PLC,(写入点待定)
                                //MessageModel fr = null;
                                //fr = plcService.WriteValuePoint("", "", plcFlag, PLCManger.GetTypeForString("bool"));
                                //if (fr.result)
                                //{
                                //    Log4NetHelper.WriteInfoLog(type, $" 工件{info.WorkPieceID} {loginfo.WorkingProcedure}工序反馈给PLC 成功, 出现 {message}");
                                //}
                                //else
                                //{
                                //    Log4NetHelper.WriteErrorLog(type, $" 工件{info.WorkPieceID} {loginfo.WorkingProcedure}工序反馈给PLC 失败, 出现 {message} ,失败原因:{fr.resMsg}");
                                //}
                            //if (!checkQualityInfoCompleteFlag || info.QualityState != (int)QualityState.OK)
                            //{
                            //    plcFlag = false;
                            //    message = !checkQualityInfoCompleteFlag ? "跳序," : "";
                            //message += info.QualityState != (int)QualityState.OK ? "质量不符合" : "";
                            //}
                            ////反馈给PLC,(写入点待定)
                            //MessageModel fr = null;
                            //fr = plcService.WriteValuePoint("", "", plcFlag, PLCManger.GetTypeForString("bool"));
                            //if (fr.result)
                            //{
                            //    Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" 工件{wplog.WorkPieceID} {WorkingProcedure}工序反馈给PLC 成功, 出现 {message}");
                            //}
                            //else
                            //{
                            //    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" 工件{wplog.WorkPieceID} {WorkingProcedure}工序反馈给PLC 失败, 出现 {message} ,失败原因:{fr.resMsg}");
                            //}
                            //#endregion
                                //#region 反馈PLC
                                //bool checkQualityInfoCompleteFlag = false;
                                //bool plcFlag = true;//反馈给PLC的标记
                                //string message = "";
                                //checkQualityInfoCompleteFlag = WorkPieceInfoManager.CheckQualityInfoComplete(info, wplog, PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure));
                                //if (!checkQualityInfoCompleteFlag || info.QualityState != (int)QualityState.OK)
                                //{
                                //    plcFlag = false;
                                //    message = !checkQualityInfoCompleteFlag ? "跳序," : "";
                                //message += info.QualityState != (int)QualityState.OK ? "质量不符合" : "";
                                //}
                                ////反馈给PLC,(写入点待定)
                                //MessageModel fr = null;
                                //fr = plcService.WriteValuePoint("", "", plcFlag, PLCManger.GetTypeForString("bool"));
                                //if (fr.result)
                                //{
                                //    Log4NetHelper.WriteInfoLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" 工件{wplog.WorkPieceID} {WorkingProcedure}工序反馈给PLC 成功, 出现 {message}");
                                //}
                                //else
                                //{
                                //    Log4NetHelper.WriteErrorLog(PLCManger.GetLogTypeForWorkingProcedure(WorkingProcedure), $" 工件{wplog.WorkPieceID} {WorkingProcedure}工序反馈给PLC 失败, 出现 {message} ,失败原因:{fr.resMsg}");
                                //}
                                //#endregion
                            }
                            else
                            {//读码完成若工件质量不符合或发生跳序,不用管设备是否把工件放过去,数采系统都不变更当前工序,反馈设备PLC工件不符合,
                             //若工序后续收集点收到相关工件信息再变更当前工序,  但质量信息不变
                                info.WorkingProcedureCurrent = loginfo.WorkingProcedure;
                            }
                            #endregion
                            #region 更新设备实时表
                            bool isAddEquipmentCurrentMonitor = false;
                            EquipmentCurrentMonitor equinfo = new EquipmentCurrentMonitor();
                            equinfo = db.EquipmentCurrentMonitor.Where(o => o.EquipmentID == loginfo.EquipmentID).FirstOrDefault();
                            if (equinfo == null || equinfo.Id < 1)
                            {//没有工件信息,不做更新
                                Log4NetHelper.WriteErrorLog(type, $"设备{loginfo.EquipmentID} 告警监控{loginfo.WorkingProcedure} 没有获取到设备监控信息,现新增");
                                equinfo = EntityPropHelper.Mapper<EquipmentCurrentMonitor, WorkPieceLog>(loginfo);
                                equinfo.OnlineTime = DateTime.Now;
                                isAddEquipmentCurrentMonitor = true;
                            }
                            else
                            {//更新工件
                                equinfo.WorkPieceID = loginfo.WorkPieceID;
                                equinfo.UpdatedUserName = loginfo.MonitoringPoint;
                                equinfo.UpdatedTime = DateTime.Now;
                                equinfo.OnlineTime = DateTime.Now;
                            }
                            if (isAddEquipmentCurrentMonitor)
                            {
                                equinfo.Id = Yitter.IdGenerator.YitIdHelper.NextId();
                                db.EquipmentCurrentMonitor.Add(equinfo);
                            }
                            #endregion
                            //db.WorkPieceLog.Add(GetAddWorkPieceLog(loginfo));
                            db.WorkPieceInfoLog.Add(GetAddWorkPieceInfoLog(info));
                            //UpdateKnifeToolLift(db, loginfo);//更新刀具寿命信息
                        }
                        else
                        {//读码完成若工件质量不符合或发生跳序,不用管设备是否把工件放过去,数采系统都不变更当前工序,反馈设备PLC工件不符合,
                         //若工序后续收集点收到相关工件信息再变更当前工序,  但质量信息不变
                            info.WorkingProcedureCurrent = loginfo.WorkingProcedure;
                        }
                        #endregion
                        #region 更新设备实时表
                        bool isAddEquipmentCurrentMonitor = false;
                        EquipmentCurrentMonitor equinfo = new EquipmentCurrentMonitor();
                        equinfo = db.EquipmentCurrentMonitor.Where(o => o.EquipmentID == loginfo.EquipmentID).FirstOrDefault();
                        if (equinfo == null || equinfo.Id < 1)
                        {//没有工件信息,不做更新
                            Log4NetHelper.WriteErrorLog(type, $"设备{loginfo.EquipmentID} 告警监控{loginfo.WorkingProcedure} 没有获取到设备监控信息,现新增");
                            equinfo = EntityPropHelper.Mapper<EquipmentCurrentMonitor, WorkPieceLog>(loginfo);
                            equinfo.OnlineTime = DateTime.Now;
                            isAddEquipmentCurrentMonitor = true;
                        }
                        else
                        {//更新工件
                            equinfo.WorkPieceID = loginfo.WorkPieceID;
                            equinfo.UpdatedUserName = loginfo.MonitoringPoint;
                            equinfo.UpdatedTime = DateTime.Now;
                            equinfo.OnlineTime = DateTime.Now;
                        }
                        if (isAddEquipmentCurrentMonitor)
                        {
                            equinfo.Id = Yitter.IdGenerator.YitIdHelper.NextId();
                            db.EquipmentCurrentMonitor.Add(equinfo);
                        }
                        #endregion
                        //db.WorkPieceLog.Add(GetAddWorkPieceLog(loginfo));
                        db.WorkPieceInfoLog.Add(GetAddWorkPieceInfoLog(info));
                        //UpdateKnifeToolLift(db, loginfo);//更新刀具寿命信息
                    }
                    else
                    {
                        loginfo.Remarks = $"上线完成读取二维码{loginfo.WorkPieceID ?? "空"}异常";
                        Log4NetHelper.WriteErrorLog(type, $" {loginfo.WorkingProcedure}上线监控读码标记 读取工件码数据[{loginfo.WorkPieceID ?? "空"}]时异常:");
                            loginfo.Remarks = $"上线完成读取二维码{loginfo.WorkPieceID ?? "空"}异常";
                            Log4NetHelper.WriteErrorLog(type, $" {loginfo.WorkingProcedure}上线监控读码标记 读取工件码数据[{loginfo.WorkPieceID ?? "空"}]时异常:");
                        }
                    }
                }
                catch (Exception e)