schangxiang@126.com
2024-09-06 e4f89a92209ebca77240edaa3b78f66eb6e4b3d5
DataCapture/iWare_SCADA_DataCapture/iWare_SCADA_BusinessLogical/BLL/WorkPieceInfoManager.cs
@@ -190,6 +190,7 @@
                            info.WorkPieceinitOnlineTime = DateTimeHelper.GetDateTime();
                            info.WorkingProcedurePlan = ConfigHelper.GetConfigString("WorkingProcedureAllStr") ?? "OP05OP10OP20OP30OP35OP40OP50OP60OP70OP80";
                            info.CreatedUserName = loginfo.MonitoringPoint;
                            info.WorkingProcedureCurrent = loginfo.WorkingProcedure;//工序赋值
                            SystemBussinessHelper.SetWorkPieceInfoMiddleForCreatedUserName(ref info, loginfo.DataCapturePointCname);
                            info.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
                            info = ParseQRCode(info);
@@ -197,14 +198,15 @@
                        }
                        else
                        {
                            if (info.WorkingProcedureCurrent.Equals("OP05"))
                            {
                                loginfo.Remarks = $"读取二维码{loginfo.WorkPieceID ?? "空"} OP05工序重复读取了";
                                return;
                            }
                            //存在 表 WorkPieceInfo有,但是 WorkPieceProcess这个工序不存在的情况 【Editby shaocx,2024-09-06】
                            //if (info.WorkingProcedureCurrent.Equals("OP05"))
                            //{
                            //    loginfo.Remarks = $"读取二维码{loginfo.WorkPieceID ?? "空"} OP05工序重复读取了";
                            //    return;
                            //}
                        }
                        if ((info.WorkingProcedureCurrent.Equals("OP05") && isAddWorkPieceInfo == false))
                        {
                        if ((loginfo.WorkingProcedure.Equals("OP05") && isAddWorkPieceInfo == false))
                        {//存在 表 WorkPieceInfo有,但是 WorkPieceProcess这个工序不存在的情况
                            //如果是OP05的,并且是 不需要新增 表WorkPieceInfo,那么就不需要更新表 WorkPieceInfo
                        }
                        else
@@ -222,30 +224,14 @@
                            info.WorkPieceCurrentPosition = loginfo.WorkingProcedure;
                            info.WorkPieceCurrentPositionOrder = info.WorkingProcedurePlan.IndexOf(loginfo.WorkingProcedure) / 2;
                            info.WorkingProcedureCurrent = loginfo.WorkingProcedure;
                            info.WorkingProcedureCurrent = loginfo.WorkingProcedure;//工序赋值
                            info.Remarks = $"{info.WorkingProcedureCurrent}工件上线";
                        }
                        //修复下 op35 同一个件 下线时间跟下一个上线时间一模一样的问题  【Editby shaocx,2024-08-27】
                        var isNeedAddNewProcess = true;
                        var pro = db.WorkPieceProcess.Where(o => o.WorkPieceID == loginfo.WorkPieceID && !o.OperationType.Equals("SPC") && (o.EndTime == null || o.EndTime <= DateTime.MinValue)).OrderByDescending(o => o.StartTime).FirstOrDefault();
                        if (pro != null && pro.WorkPieceID.Length > 1)
                        {
                            if (pro.WorkingProcedureCurrent == loginfo.WorkingProcedure)
                            {//表示工序相同
                                isNeedAddNewProcess = false;
                                pro.Remarks = "又一次上线,更新结束时间";
                            }
                            else
                            {
                                pro.EndTime = DateTimeHelper.GetDateTime();
                                pro.UpdatedUserName = loginfo.MonitoringPoint;
                                pro.UpdateDataCapturePointCname = loginfo.DataCapturePointCname;
                                pro.UpdatedTime = DateTimeHelper.GetDateTime();
                                pro.Remarks = "又一次上线,更新结束时间";
                            }
                        }
                        //特殊处理OP05上线,因为他是根据文本列表内容上线的 【Editby shaocx,2024-09-03】
                        if (loginfo.WorkingProcedure.Equals("OP05"))
                        {
@@ -253,6 +239,26 @@
                            if (op05Proccss != null)
                            {
                                isNeedAddNewProcess = false;//不需要新增了
                            }
                        }
                        else
                        {
                            var pro = db.WorkPieceProcess.Where(o => o.WorkPieceID == loginfo.WorkPieceID && !o.OperationType.Equals("SPC") && (o.EndTime == null || o.EndTime <= DateTime.MinValue)).OrderByDescending(o => o.StartTime).FirstOrDefault();
                            if (pro != null && pro.WorkPieceID.Length > 1)
                            {
                                if (pro.WorkingProcedureCurrent == loginfo.WorkingProcedure)
                                {//表示工序相同
                                    isNeedAddNewProcess = false;
                                    pro.Remarks = "又一次上线,更新结束时间";
                                }
                                else
                                {
                                    pro.EndTime = DateTimeHelper.GetDateTime();
                                    pro.UpdatedUserName = loginfo.MonitoringPoint;
                                    pro.UpdateDataCapturePointCname = loginfo.DataCapturePointCname;
                                    pro.UpdatedTime = DateTimeHelper.GetDateTime();
                                    pro.Remarks = "又一次上线,更新结束时间";
                                }
                            }
                        }
                        if (isNeedAddNewProcess)
@@ -296,114 +302,79 @@
                                    new_process.CreatedTime = _time;
                                    new_process.UpdatedTime = _time;
                                }
                                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)
                                {
                                    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}");
                                //}
                                //#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);//更新刀具寿命信息
                            db.WorkPieceProcess.Add(new_process);
                        }
                        //db.Database.AutoTransactionsEnabled = false;// 同一个SaveChanges默认事务, 关闭默认事务:... 好像不能用啊,后面再研究吧
                        if (isAddWorkPieceInfo)
                        {
                            db.WorkPieceInfo.Add(info);
                        }
                        else
                        {
                            loginfo.Remarks = $"上线完成读取二维码{loginfo.WorkPieceID ?? "空"}异常";
                            Log4NetHelper.WriteErrorLog(type, $" {loginfo.WorkingProcedure}上线监控读码标记 读取工件码数据[{loginfo.WorkPieceID ?? "空"}]时异常:");
                        {//不确定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)
                            {
                                plcFlag = false;
                                message = !checkQualityInfoCompleteFlag ? "跳序," : "";
                                message += info.QualityState != (int)QualityStateEnum.OK ? "质量不符合" : "";
                            }
                        }
                        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 ?? "空"}]时异常:");
                    }
                }
                catch (Exception e)
@@ -1949,7 +1920,7 @@
                        .OrderByDescending(o => o.WarnStartTime).FirstOrDefault();
                    if (loginfo.IsMessage)
                    {//若有告警,如果有设备状态变更,肯定插入,此处只修改即可
                        //若有告警,如果设备状态没有变更,有告警,也不插入新的(问题:当状态没有更改,如一直是故障,但告警信息有变化,怎么办  ps:此处先不管)
                     //若有告警,如果设备状态没有变更,有告警,也不插入新的(问题:当状态没有更改,如一直是故障,但告警信息有变化,怎么办  ps:此处先不管)
                        infolog.WarnStartTime = DateTimeHelper.GetDateTime();
                        infolog.WarnType = alertall;
                        infolog.Warnmsg = warnmsg;
@@ -2299,10 +2270,10 @@
                        info.UpdatedTime = DateTimeHelper.GetDateTime();
                        info.UpdatedUserName = threadinfo.Threadcode;
                        info.Threadlastmodifytime = threadinfo.Threadlastmodifytime > DateTime.MinValue ? threadinfo.Threadlastmodifytime : info.Threadlastmodifytime;//如果有传参则更新
                        //if (info.Threadstatue==1)
                        //{
                        //    info.Threadlastmodifytime = DateTimeHelper.GetDateTime();//最新跑到数据
                        //}
                                                                                                                                                                      //if (info.Threadstatue==1)
                                                                                                                                                                      //{
                                                                                                                                                                      //    info.Threadlastmodifytime = DateTimeHelper.GetDateTime();//最新跑到数据
                                                                                                                                                                      //}
                    }
                    db.SaveChanges();
                }