using iWare_SCADA_BusinessLogical.Utils; using iWare_SCADA_Model; using iWare_SCADA_Model.MiddleModel; using iWare_SCADA_Model.TableModel; using log4net; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Diagnostics; //using System.Data.Entity.Infrastructure; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Web.UI.WebControls; using System.Windows.Forms; using static System.Windows.Forms.AxHost; namespace iWare_SCADA_BusinessLogical.BLL { public class WorkPieceInfoManager { public static WorkPieceInfo GetWorkPieceInfo(string WorkPieceID) { using (DbModel db = new DbModel()) { //查询所有 var query = db.WorkPieceInfo.Where(o => o.WorkPieceID == WorkPieceID).FirstOrDefault(); return query; } } public static long InsertWorkPieceInfo(WorkPieceInfo workPiece) { using (DbModel db = new DbModel()) { db.WorkPieceInfo.Add(workPiece); db.SaveChanges(); return workPiece.Id; } } public static WorkPieceLogMiddle GetAddWorkPieceLog(WorkPieceLogMiddle loginfo) { loginfo.Id = Yitter.IdGenerator.YitIdHelper.NextId(); return loginfo; } /// /// 给WorkPieceLog主键等公共的的属性赋值 /// /// /// public static WorkPieceLog GetAddWorkPieceLog(WorkPieceLog loginfo) { loginfo.Id = Yitter.IdGenerator.YitIdHelper.NextId(); return loginfo; } public static WorkPieceLog GetAddWorkPieceLog1(WorkPieceLogMiddle loginfo) { loginfo.Id = Yitter.IdGenerator.YitIdHelper.NextId(); return loginfo; } /// /// 通过WorkPieceInfo 给WorkPieceInfoLog 属性赋值 /// /// /// public static WorkPieceInfoLog GetAddWorkPieceInfoLog(WorkPieceInfo wpinfo) { WorkPieceInfoLog infolog = EntityPropHelper.Mapper(wpinfo); infolog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); infolog.WorkPieceInfoID = wpinfo.Id; infolog.LogAddTime = DateTime.Now; return infolog; } /// /// 给QualityDataInfo主键等公共的的属性赋值 /// /// /// public static QualityDataInfo GetAddQualityDataInfo(QualityDataInfo qdinfo) { qdinfo.Id = Yitter.IdGenerator.YitIdHelper.NextId(); return qdinfo; } /// /// 通过QualityDataInfo 给QualityDataInfoLog 属性赋值 /// /// /// public static QualityDataInfoLog GetAddQualityDataInfoLog(QualityDataInfo qdinfo) { QualityDataInfoLog infolog = EntityPropHelper.Mapper(qdinfo); infolog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); return infolog; } public static void test() { using (DbModel db = new DbModel()) { //WorkPieceLogMiddle a = new WorkPieceLogMiddle(); //a.Id = Yitter.IdGenerator.YitIdHelper.NextId(); //a.WorkPieceID="test01"+ new Random().Next(4).ToString(); //a.QualityType = QualityType.SPC.ToString(); //if(a.QualityType.Equals(QualityType.SPC.ToString())) //{ // a.Remarks = "SPC"; //} //else //{ // a.Remarks = "AUTO"; //} //WorkPieceLog b = new WorkPieceLog(); //b.Id = Yitter.IdGenerator.YitIdHelper.NextId(); //b.WorkPieceID = "testxxx" + new Random().Next(0,1000).ToString(); //b.QualityType = QualityType.SPC.ToString(); //b.Remarks = "SPC insert into"; //b.QualityState = 2; //b.QualityStateUpdateMode = "heheh"; //db.WorkPieceLog.Add(b); //db.SaveChanges(); } } /// /// 根据设备id更新刀具寿命信息(目前设定每生产一个工件,所有刀具寿命都会减1) /// /// /// public static void UpdateKnifeToolLift(DbModel db, WorkPieceLog loginfo) { try { var info = db.KnifeToolEquipmentInfo.Where(o => o.EquipmentID.Equals(loginfo.EquipmentID)).ToList(); foreach (var item in info) { item.CurrentLife++; item.UpdatedTime = DateTime.Now; } } catch (Exception ex) { loginfo.Remarks = (loginfo.Remarks ?? "") + $"{loginfo.WorkPieceID ?? "空"}刀具寿命更新数据异常{ex.Message}"; } } /// /// 读取二维码时逻辑 /// 校验工件是否跳序,质量是否合格 /// public static void ReadQRcode(WorkPieceLog loginfo, LogType type, PLCService plcService, int? IsFeedback) {//此处同时插入了WorkPieceLog,WorkPieceInfoLog表,并新增或修改WorkPieceInfo表 using (DbModel db = new DbModel()) { try { bool isAddWorkPieceInfo = false; if (loginfo.WorkPieceID.Length == 22) { WorkPieceInfo info = new WorkPieceInfo(); info = db.WorkPieceInfo.Where(o => o.WorkPieceID == loginfo.WorkPieceID).FirstOrDefault(); if (info == null || info.WorkPieceID.Length < 1) {//插入WorkPieceInfo表 loginfo = CommonManager.Instance.GetWorkPieceID(loginfo, type); info = EntityPropHelper.Mapper(loginfo); //EntityPropHelper.CopyProp(loginfo, info, loginfo.GetWorkPieceInfoDict()); if (!loginfo.WorkingProcedure.Equals("OP05")) {//当工件二维码第一次出现的工序不是OP05,则设置为可疑状态 info.QualityState = (int)QualityState.Suspected; info.QualityErrorInfo = $"工件二维码第一次出现的工序{loginfo.MonitoringPoint}不是OP05,数据缺失,请确认情况并做相应处理!"; info.Remarks = $"工件二维码第一次出现的工序{loginfo.WorkingProcedure}不是OP05,数据缺失,请确认情况并做相应处理!"; } else { info.QualityState = (int)QualityState.OK;//此处需要注意,判断所有工序质量,然后再赋值 info.Remarks = "OP05新增工件信息"; } info.WorkPieceinitOnlineTime = DateTimeHelper.GetDateTime(); info.WorkingProcedurePlan = ConfigHelper.GetConfigString("WorkingProcedureAllStr") ?? "OP05OP10OP20OP30OP35OP40OP50OP60OP70OP80"; info.CreatedUserName = loginfo.MonitoringPoint; info.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); info = ParseQRCode(info); isAddWorkPieceInfo = true; } else { if (info.WorkingProcedureCurrent.Equals("OP05")) { loginfo.Remarks = (loginfo.Remarks ?? "") + $"读取二维码{loginfo.WorkPieceID ?? "空"} OP05工序重复读取了"; 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; 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.Remarks ?? "" + $"{info.WorkingProcedureCurrent}工件上线"; 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) { pro.EndTime = DateTimeHelper.GetDateTime(); pro.UpdatedUserName = loginfo.MonitoringPoint; pro.UpdatedTime = DateTimeHelper.GetDateTime(); pro.Remarks = (pro.Remarks ?? "") + "又一次上线,更新结束时间"; } //每次扫描上线都插入追溯表 WorkPieceProcess process = new WorkPieceProcess(); process = EntityPropHelper.Mapper(info); process.StartTime = DateTimeHelper.GetDateTime(); process.QualityState = info.QualityState.HasValue ? info.QualityState.Value : (int)QualityState.OK; process.Id = Yitter.IdGenerator.YitIdHelper.NextId(); process.CreatedUserName = loginfo.MonitoringPoint; process.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); process.UpdatedUserName = loginfo.MonitoringPoint; process.UpdatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); process.OperationType = OperationType.生产.ToString(); process.Remarks = ""; if (loginfo.WorkingProcedure.Equals("OP05")) { process.EndTime = process.StartTime; } db.WorkPieceProcess.Add(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)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(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(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.Remarks ?? "") + $"上线完成读取二维码{loginfo.WorkPieceID ?? "空"}异常"; Log4NetHelper.WriteErrorLog(type, $" {loginfo.WorkingProcedure}上线监控读码标记 读取工件码数据[{loginfo.WorkPieceID ?? "空"}]时异常:"); } } catch (Exception e) { loginfo.Remarks = (loginfo.Remarks ?? "") + $"读取二维码{loginfo.WorkPieceID ?? "空"}更新数据异常{e.Message}"; } finally { loginfo.Id = Yitter.IdGenerator.YitIdHelper.NextId(); db.WorkPieceLog.Add(loginfo); db.SaveChanges(); } } } public static WorkPieceLogMiddle QualityDataHand(WorkPieceLogMiddle loginfo, List qcofig) { try { switch (loginfo.WorkingProcedure) { case "OP10": var cof = qcofig.Where(o => o.ParamColName.Equals("QualityOP10To1")).FirstOrDefault(); if (cof != null && cof.Id > 0) { double oldvalue = 0; double StandardValue = 0; var flag1 = double.TryParse(loginfo.QualityOP10To1, out oldvalue); var flag2 = double.TryParse(cof.StandardValue, out StandardValue); if (!flag1 || !flag2) { return loginfo; } loginfo.QualityOP10To1 = ((StandardValue + oldvalue * 1.0 / cof.DecimalPlaces).ToString()); //+(string.IsNullOrEmpty(cof.Unit) ? "" : cof.Unit) } break; case "OP40": var cofOP40 = qcofig.Where(o => o.ParamColName.Equals("QualityOP40To1")).FirstOrDefault(); if (cofOP40 != null && cofOP40.Id > 0) { double oldvalue = 0; double StandardValue = 0; var flag1 = double.TryParse(loginfo.QualityOP40To1, out oldvalue); var flag2 = double.TryParse(cofOP40.StandardValue, out StandardValue); if (!flag1 || !flag2) { return loginfo; } loginfo.QualityOP40To1 = ((StandardValue + oldvalue * 1.0 / cofOP40.DecimalPlaces).ToString()); //+(string.IsNullOrEmpty(cofOP40.Unit) ? "" : cofOP40.Unit) } break; case "OP20": var cofOP20 = qcofig.Where(o => o.ParamColName.Equals("QualityOP20To1")).FirstOrDefault(); if (cofOP20 != null && cofOP20.Id > 0) { double oldvalue = 0; double StandardValue = 0; var flag1 = double.TryParse(loginfo.QualityOP20To1, out oldvalue); var flag2 = double.TryParse(cofOP20.StandardValue, out StandardValue); if (!flag1 || !flag2) { return loginfo; } loginfo.QualityOP20To1 = ((StandardValue + oldvalue * 1.0 / cofOP20.DecimalPlaces).ToString()); } break; case "OP60": var cofOP60to1 = qcofig.Where(o => o.ParamColName.Equals("QualityOP60To1")).FirstOrDefault(); if (cofOP60to1 != null && cofOP60to1.Id > 0) { double oldvalue = 0; double StandardValue = 0; var flag1 = double.TryParse(loginfo.QualityOP60To1, out oldvalue); var flag2 = double.TryParse(cofOP60to1.StandardValue, out StandardValue); if (!flag1 || !flag2) { return loginfo; } loginfo.QualityOP60To1 = ((StandardValue + oldvalue * 1.0 / cofOP60to1.DecimalPlaces).ToString()); } var cofOP60to2 = qcofig.Where(o => o.ParamColName.Equals("QualityOP60To2")).FirstOrDefault(); if (cofOP60to2 != null && cofOP60to2.Id > 0) { double oldvalue = 0; double StandardValue = 0; var flag1 = double.TryParse(loginfo.QualityOP60To2, out oldvalue); var flag2 = double.TryParse(cofOP60to2.StandardValue, out StandardValue); if (!flag1 || !flag2) { return loginfo; } loginfo.QualityOP60To2 = ((StandardValue + oldvalue * 1.0 / (10 * cofOP60to2.DecimalPlaces)).ToString() + (string.IsNullOrEmpty(cofOP60to2.Unit) ? "" : cofOP60to2.Unit)); } break; default: break; } } catch (Exception ex) { } return loginfo; } /// /// 质量检测完成 /// /// /// public static void QualityInfoComplete(WorkPieceLogMiddle logMiddle, LogType type) { //此处同时插入了WorkPieceLog,WorkPieceInfoLog表,并新增或修改WorkPieceInfo表 //插入质量相关表QualityDataInfo using (DbModel db = new DbModel()) { bool isAddWorkPieceInfo = false; WorkPieceLog loginfo2 = new WorkPieceLog(); loginfo2 = EntityPropHelper.Mapper(logMiddle); try { if (logMiddle.WorkPieceID.Length == 22) {//获取到的工件号异常 WorkPieceInfo pieceInfo = new WorkPieceInfo(); pieceInfo = db.WorkPieceInfo.Where(o => o.WorkPieceID == logMiddle.WorkPieceID).FirstOrDefault(); if (pieceInfo == null || pieceInfo.WorkPieceID.Length < 1) {//没有工件信息,不做更新 if (logMiddle.MonitoringPoint.Equals("OP1002") || logMiddle.MonitoringPoint.Equals("OP1003") || logMiddle.MonitoringPoint.Contains("OP2002")) {//OP10 没有上线扫码枪,约定用测量完成信号当上线标记 pieceInfo = EntityPropHelper.Mapper(logMiddle); //EntityPropHelper.CopyProp(loginfo, info, loginfo.GetWorkPieceInfoDict()); if (!logMiddle.WorkingProcedure.Equals("OP05")) {//当工件二维码第一次出现的工序不是OP05,则设置为可疑状态 pieceInfo.QualityState = (int)QualityState.Suspected; pieceInfo.QualityErrorInfo = $"工件二维码第一次出现的工序{logMiddle.MonitoringPoint}不是OP05,数据缺失,请确认情况并做相应处理!"; pieceInfo.Remarks = $"工件二维码第一次出现的工序{logMiddle.WorkingProcedure}不是OP05,数据缺失,请确认情况并做相应处理!"; } else { pieceInfo.QualityState = (int)QualityState.OK;//此处需要注意,判断所有工序质量,然后再赋值 pieceInfo.Remarks = "OP05新增工件信息"; } pieceInfo.WorkPieceinitOnlineTime = DateTimeHelper.GetDateTime(); pieceInfo.WorkingProcedurePlan = ConfigHelper.GetConfigString("WorkingProcedureAllStr") ?? "OP05OP10OP20OP30OP35OP40OP50OP60OP70OP80"; pieceInfo.CreatedUserName = logMiddle.MonitoringPoint; pieceInfo.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); pieceInfo.WorkingProcedureStartTime = DateTimeHelper.GetDateTime();// pieceInfo.WorkingProcedureEndTime = null; pieceInfo = ParseQRCode(pieceInfo); isAddWorkPieceInfo = true; } else { loginfo2.Remarks = loginfo2.Remarks ?? "" + $"|工件{logMiddle.WorkPieceID} 质量检测完成工序{logMiddle.MonitoringPoint} 没有获取到工件信息不做更新"; Log4NetHelper.WriteErrorLog(type, $"工件{logMiddle.WorkPieceID} 质量检测完成工序{logMiddle.MonitoringPoint} 没有获取到工件信息不做更新"); return; } } if (logMiddle.MonitoringPoint.Equals("OP1002") || logMiddle.MonitoringPoint.Equals("OP1003") || logMiddle.MonitoringPoint.Contains("OP2002")) {// OP10 没有上线扫码枪,约定用测量完成信号当上线标记,所以上线需要修改的字段放这里 if (logMiddle.WorkingProcedure.Equals("OP10")) { var WorkingProcedure = (logMiddle.MonitoringPoint.Equals("OP1002") ? "OP10" : "OP40"); loginfo2.WorkingProcedure = WorkingProcedure;//解决OP10,OP40同一个的问题 logMiddle.WorkingProcedure = WorkingProcedure;//解决OP10,OP40同一个的问题 } pieceInfo.WorkPieceCurrentPosition = logMiddle.WorkingProcedure; pieceInfo.WorkPieceCurrentPositionOrder = pieceInfo.WorkingProcedurePlan.IndexOf(logMiddle.WorkingProcedure) / 2; pieceInfo.WorkingProcedureCurrent = logMiddle.WorkingProcedure; pieceInfo.WorkingProcedureStartTime = DateTimeHelper.GetDateTime(); #region 更新设备实时表 bool isAddEquipmentCurrentMonitor = false; EquipmentCurrentMonitor equinfo = new EquipmentCurrentMonitor(); equinfo = db.EquipmentCurrentMonitor.Where(o => o.EquipmentID == logMiddle.EquipmentID).FirstOrDefault(); if (equinfo == null || equinfo.Id < 1) {//没有工件信息,不做更新 Log4NetHelper.WriteErrorLog(type, $"设备{logMiddle.EquipmentID} 告警监控{logMiddle.WorkingProcedure} 没有获取到设备监控信息,现新增"); equinfo = EntityPropHelper.Mapper(logMiddle); equinfo.OnlineTime = DateTime.Now; isAddEquipmentCurrentMonitor = true; } else {//更新工件 equinfo.WorkPieceID = logMiddle.WorkPieceID; equinfo.UpdatedUserName = logMiddle.MonitoringPoint; equinfo.UpdatedTime = DateTime.Now; equinfo.OnlineTime = DateTime.Now; } if (isAddEquipmentCurrentMonitor) { equinfo.Id = Yitter.IdGenerator.YitIdHelper.NextId(); db.EquipmentCurrentMonitor.Add(equinfo); } #endregion //UpdateKnifeToolLift(db, loginfo);//更新刀具寿命信息 } pieceInfo.WorkPieceState = (int)WorkPieceState.WIP;//推出后和SPC抽检后 质量录入时状态修改回在制品 pieceInfo.EquipmentID = logMiddle.EquipmentID; pieceInfo.QualityStateUpdateUser = logMiddle.UpdatedUserName; pieceInfo.QualityStateUpdateTime = logMiddle.UpdatedTime.Value.LocalDateTime; pieceInfo.QualityStateUpdateMode = QualityStateUpdateMode.Auto.ToString(); pieceInfo.Remarks = pieceInfo.Remarks ?? "" + $"{logMiddle.WorkingProcedure}质量检测完成修改"; pieceInfo.UpdatedUserName = logMiddle.MonitoringPoint; pieceInfo.UpdatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); if (!(pieceInfo.WorkingProcedureStartTime.HasValue && pieceInfo.WorkingProcedureStartTime > DateTime.Parse("1900/01/01"))) {//工序开始时间没有则赋值 pieceInfo.WorkingProcedureStartTime = DateTimeHelper.GetDateTime(); } pieceInfo.QualityState = (int)((logMiddle.QualityStateStr.Equals("OK") || logMiddle.QualityStateStr.Equals("0K")) ? QualityState.OK : QualityState.NG); //赋值不合格原因 SetQualityNoOk_WorkPieceInfo(logMiddle, ref pieceInfo); if (!pieceInfo.QualityState.Equals(((int)QualityState.OK).ToString())) { pieceInfo.QualityErrorInfo = $"{logMiddle.WorkingProcedure}工序质量采集数据不合格{pieceInfo.QualityState}"; } else { pieceInfo.QualityErrorInfo = ""; } logMiddle.QualityState = pieceInfo.QualityState; if (isAddWorkPieceInfo) { db.WorkPieceInfo.Add(pieceInfo); } #region 根据标准值更新最新质量数据(OP10/OP40/OP20/OP60) var qcofig = db.EquipmentQualityConfig.Where(o => o.WorkingProcedure.Equals(logMiddle.WorkingProcedure) && o.ParamType != 1 && o.IsDeleted == false).ToList(); if (qcofig.Count > 0) { QualityDataHand(logMiddle, qcofig); } #endregion var qualityData = db.QualityDataInfo.Where(o => o.WorkPieceID == logMiddle.WorkPieceID).FirstOrDefault(); if (qualityData == null || qualityData.WorkPieceID.Length < 1 || qualityData.WorkingProcedure.Length < 1) {//插入QualityDataInfo表 qualityData = EntityPropHelper.Mapper(logMiddle); db.QualityDataInfo.Add(GetAddQualityDataInfo(qualityData)); } //修改QualityDataInfo表 //重复收到质量信息,会覆盖之前的 EntityPropHelper.CopyProp(logMiddle, qualityData, GetQualityDataInfoUpdate(logMiddle, logMiddle.WorkingProcedure, logMiddle.MonitoringPoint));//指定修改字段 qualityData.QualityStateUpdateUser = pieceInfo.UpdatedUserName; qualityData.QualityReceiveTime = pieceInfo.UpdatedTime.Value.LocalDateTime; qualityData.QualityStateUpdateMode = pieceInfo.QualityStateUpdateMode; if (logMiddle.WorkingProcedure.Equals("OP10")) { qualityData.OP10QualityState = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP10QualityReceiveTime = DateTimeHelper.GetDateTime(); } else if (logMiddle.WorkingProcedure.Equals("OP20")) { //Log4NetHelper.WriteErrorLog(type, $" {loginfo.WorkingProcedure}质量信息【{loginfo.QualityStateStr ?? "空"}】" + // $"【{(loginfo.QualityState.HasValue? loginfo.QualityState.Value:999)}】【{(info.QualityState.HasValue ? info.QualityState.Value : 888)}】 读取工件码数据[{loginfo.WorkPieceID ?? "空"}]"); qualityData.OP20QualityState = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP20QualityReceiveTime = DateTimeHelper.GetDateTime(); qualityData.OP20QualityFilePath = logMiddle.OP20QualityFilePath; } else if (logMiddle.WorkingProcedure.Equals("OP30")) { switch (logMiddle.MonitoringPoint) { case "OP3002CH3": qualityData.OP30QualityFilePathCH3 = logMiddle.OP30QualityFilePathCH3; qualityData.OP30QualityStateCH3 = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP30QualityReceiveTimeCH3 = DateTimeHelper.GetDateTime(); break; case "OP3002CH4": qualityData.OP30QualityFilePathCH4 = logMiddle.OP30QualityFilePathCH4; qualityData.OP30QualityStateCH4 = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP30QualityReceiveTimeCH4 = DateTimeHelper.GetDateTime(); break; case "OP3002CH5": qualityData.OP30QualityFilePathCH5 = logMiddle.OP30QualityFilePathCH5; qualityData.OP30QualityStateCH5 = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP30QualityReceiveTimeCH5 = DateTimeHelper.GetDateTime(); break; case "OP3002CH6": qualityData.OP30QualityFilePathCH6 = logMiddle.OP30QualityFilePathCH6; qualityData.OP30QualityStateCH6 = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP30QualityReceiveTimeCH6 = DateTimeHelper.GetDateTime(); break; default: break; } //qualityData.OP30QualityState = loginfo.QualityState.HasValue ? loginfo.QualityState.Value.ToString() : "3"; //qualityData.OP30QualityReceiveTime = DateTimeHelper.GetDateTime(); } else if (logMiddle.WorkingProcedure.Equals("OP35")) { qualityData.OP35QualityState = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP35QualityReceiveTime = DateTimeHelper.GetDateTime(); } else if (logMiddle.WorkingProcedure.Equals("OP40")) { qualityData.OP40QualityState = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP40QualityReceiveTime = DateTimeHelper.GetDateTime(); } else if (logMiddle.WorkingProcedure.Equals("OP60")) { qualityData.OP60QualityFilePath = logMiddle.OP60QualityFilePath; qualityData.OP60QualityState = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP60QualityReceiveTime = DateTimeHelper.GetDateTime(); } else if (logMiddle.WorkingProcedure.Equals("OP80")) { qualityData.OP80QualityFilePath = logMiddle.OP80QualityFilePath; qualityData.OP80QualityState = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP80QualityReceiveTime = DateTimeHelper.GetDateTime(); } var pro = db.WorkPieceProcess.Where(o => o.WorkPieceID == logMiddle.WorkPieceID && o.WorkingProcedureCurrent == pieceInfo.WorkingProcedureCurrent && o.OperationType == OperationType.生产.ToString()).OrderByDescending(o => o.StartTime).FirstOrDefault(); if (pro == null || pro.WorkPieceID.Length < 1 || logMiddle.MonitoringPoint.Equals("OP1002") || logMiddle.MonitoringPoint.Equals("OP1003") || logMiddle.MonitoringPoint.Contains("OP2002")) {// OP10 没有上线扫码枪,约定用测量完成信号当上线标记,所以上线需要修改的字段放这里 //上线是每次都插入 WorkPieceProcess process = new WorkPieceProcess(); process = EntityPropHelper.Mapper(pieceInfo); process.StartTime = DateTimeHelper.GetDateTime(); process.QualityState = pieceInfo.QualityState.HasValue ? pieceInfo.QualityState.Value : (int)QualityState.OK; //记录质量不合格原因 【Editby shaocx,2024-06-26】 //赋值不合格原因 SetQualityNoOk_WorkPieceProcess(logMiddle, ref process); process.Id = Yitter.IdGenerator.YitIdHelper.NextId(); process.CreatedUserName = logMiddle.MonitoringPoint; process.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); process.UpdatedUserName = logMiddle.MonitoringPoint; process.UpdatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); process.OperationType = OperationType.生产.ToString(); process.QualityDataInfoID = qualityData.Id; process.Remarks = ""; db.WorkPieceProcess.Add(process); } else {//其他的都只是修改 pro.QualityDataInfoID = qualityData.Id; pro.UpdatedUserName = logMiddle.MonitoringPoint; pro.UpdatedTime = DateTimeHelper.GetDateTime(); pro.QualityState = pieceInfo.QualityState.HasValue ? pieceInfo.QualityState.Value : 9; //赋值不合格原因 SetQualityNoOk_WorkPieceProcess(logMiddle, ref pro); //TODO:判断如果是60工序,那么就要更新pro表的创建人为loginfo.MonitoringPoint 【Editby shaocx,2024-06-05】 if (logMiddle.WorkingProcedure == "OP60") { pro.CreatedUserName = logMiddle.MonitoringPoint; } } if (logMiddle.QualityType != null && logMiddle.QualityType.Equals(QualityType.SPC.ToString())) {//SPC反馈, if (logMiddle.QualityState != (int)QualityState.OK) { //当某到工序检测到不合格工件时,从该工件加工完成时刻前指定时间起至报检不合格时间止,系统将该工件的最后加工工序在该时间段内加工的所有工件、正在加工的工件、该工序入口处的第一个工件全部标记为疑似状态,由人工复检工件并修改状态,并支持批量变更。 //答复:在线测量不需要走这个流程,只有SPC抽检才需要,需要把这时间段的工件全部置为疑似,哪怕是已完成工件 //时间段起始时间:抽检工件生产时间前一SPC抽检时间 //时间段结束时间:抽检工件质量结果出现后的时间 //抽检工件工序扫描枪外入口处的第一个工件 也把质量状态置为疑似 //(每一工序SPC抽检是设置的固定的,比如200抽4,状态置为疑似时若工件还在设备内,会继续生产完毕后排出) //目前这块逻辑放到了 WebAPI中了 } } db.WorkPieceInfoLog.Add(GetAddWorkPieceInfoLog(pieceInfo)); db.QualityDataInfoLog.Add(GetAddQualityDataInfoLog(qualityData));//插入日志 } else { loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"质量检测完成读取二维码{logMiddle.WorkPieceID ?? "空"}异常"; Log4NetHelper.WriteErrorLog(type, $" {logMiddle.WorkingProcedure}工序监控读码标记 读取工件码数据[{logMiddle.WorkPieceID ?? "空"}]时异常:"); } } catch (Exception ex) { loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"质量检测完成{logMiddle.WorkPieceID ?? "空"}更新数据异常{ex.Message}++{ex.StackTrace}"; Log4NetHelper.WriteErrorLog(type, $" {logMiddle.WorkingProcedure}工序监控读码标记 读取工件码数据[{logMiddle.WorkPieceID ?? "空"}]时异常:"); } finally { loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"质量:{logMiddle.QualityStateStr ?? "空"}"; db.WorkPieceLog.Add(GetAddWorkPieceLog(loginfo2));//插入工件采集日志表 db.SaveChanges(); } } } /// /// 工件推出NOOK /// /// /// public static void WorkPiecePushOff(WorkPieceLogMiddle loginfo, LogType type) { using (DbModel db = new DbModel()) { WorkPieceLog loginfo2 = new WorkPieceLog(); loginfo2 = EntityPropHelper.Mapper(loginfo); try { if (loginfo.WorkPieceID != null && loginfo.WorkPieceID.Trim('\0').Length == 22) { WorkPieceInfo info = new WorkPieceInfo(); info = db.WorkPieceInfo.Where(o => o.WorkPieceID == loginfo.WorkPieceID).FirstOrDefault(); if (info == null || info.WorkPieceID.Length < 1) {//没有工件信息,不做更新 Log4NetHelper.WriteErrorLog(type, $"工件{loginfo.WorkPieceID} 工件推出工序{loginfo.WorkingProcedure} 没有获取到工件信息不做更新"); return; } else {//更新表WorkPieceInfo if (loginfo.WorkingProcedure.Equals("OP10")) { info.WorkPieceCurrentPosition = info.WorkingProcedureCurrent + "NOOK"; //var WorkingProcedure = (loginfo.MonitoringPoint.Equals("OP1002") ? "OP10" : "OP40"); loginfo2.WorkingProcedure = info.WorkingProcedureCurrent;//解决OP10,OP40同一个的问题 loginfo.WorkingProcedure = info.WorkingProcedureCurrent; //解决OP10,OP40同一个的问题 } else { info.WorkingProcedureCurrent = loginfo.WorkingProcedure; info.WorkPieceCurrentPosition = loginfo.WorkingProcedure + "NOOK"; } info.WorkPieceState = (int)WorkPieceState.NOOKPush; info.UpdatedUserName = loginfo.MonitoringPoint; info.UpdatedTime = DateTime.Now; info.Remarks = "工件NOOK推出"; if (!(info.WorkingProcedureStartTime.HasValue && info.WorkingProcedureStartTime > DateTime.Parse("1900/01/01"))) { info.WorkingProcedureStartTime = DateTimeHelper.GetDateTime(); } info.WorkingProcedureEndTime = DateTimeHelper.GetDateTime(); info.WorkingProcedureCompleted = info.WorkingProcedureCompleted + loginfo.WorkingProcedure;//已完成工序 info.WorkPieceCurrentPositionOrder = info.WorkingProcedurePlan.IndexOf(loginfo.WorkingProcedure) / 2; } if (loginfo.WorkingProcedure.Equals("OP35")) {//为了解决OP35的采集到的质量信息是OK还NOOK的情况,OP35 NOOK时更新质量信息 loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"OP35NOOK原质量信息{(info.QualityState.HasValue ? info.QualityState.Value.ToString() : "空")}"; info.QualityState = (int)QualityState.NG; if (!info.QualityState.Equals(((int)QualityState.OK).ToString())) { info.QualityErrorInfo = $"{loginfo.WorkingProcedure}工序质量NOOK采集数据不合格{info.QualityState}"; } else { info.QualityErrorInfo = ""; } loginfo.QualityState = info.QualityState; var qualityData = db.QualityDataInfo.Where(o => o.WorkPieceID == loginfo.WorkPieceID).FirstOrDefault(); if (qualityData != null) { qualityData.OP35QualityState = loginfo.QualityState.HasValue ? loginfo.QualityState.Value.ToString() : "3"; qualityData.OP35QualityReceiveTime = DateTimeHelper.GetDateTime(); db.QualityDataInfoLog.Add(GetAddQualityDataInfoLog(qualityData)); } } //更新上一工序的结束时间 var pro = db.WorkPieceProcess.Where(o => o.WorkPieceID == loginfo.WorkPieceID && o.WorkingProcedureCurrent == loginfo.WorkingProcedure && o.OperationType == OperationType.生产.ToString()).OrderByDescending(o => o.StartTime).FirstOrDefault(); if (pro != null && pro.WorkPieceID.Length > 0) { pro.EndTime = DateTimeHelper.GetDateTime(); pro.Remarks = (pro.Remarks ?? "") + "NOOK结束"; pro.UpdatedUserName = loginfo.MonitoringPoint; pro.UpdatedTime = DateTimeHelper.GetDateTime(); } db.WorkPieceInfoLog.Add(GetAddWorkPieceInfoLog(info)); } else { loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"工件NOOK推出读取二维码{loginfo.WorkPieceID ?? "空"}异常"; Log4NetHelper.WriteErrorLog(type, $" {loginfo.WorkingProcedure}工件NOOK推出读码标记 读取工件码数据[{loginfo.WorkPieceID ?? "空"}]时异常:"); } } catch (Exception e) { loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"读取二维码{loginfo.WorkPieceID ?? "空"}更新数据异常{e.Message}"; } db.WorkPieceLog.Add(GetAddWorkPieceLog(loginfo2));//插入工件采集日志表 db.SaveChanges(); } } /// /// 工件SPC抽检推出 /// /// /// public static void WorkPieceSPCPushOff(WorkPieceLogMiddle loginfo, LogType type) { using (DbModel db = new DbModel()) { WorkPieceLog loginfo2 = new WorkPieceLog(); loginfo2 = EntityPropHelper.Mapper(loginfo); try { if ((loginfo.WorkPieceID != null && loginfo.WorkPieceID.Trim('\0').Length == 22) //|| !((loginfo.WorkingProcedure.Equals("OP10") || loginfo.WorkingProcedure.Equals("OP40")) && loginfo.Remarks.Length > 0) ) { WorkPieceInfo info = new WorkPieceInfo(); info = db.WorkPieceInfo.Where(o => o.WorkPieceID == loginfo.WorkPieceID).FirstOrDefault(); if (info == null || info.WorkPieceID.Length < 1) {//没有工件信息,不做更新 loginfo2.Remarks = $"工件{loginfo.WorkPieceID} 工件SPC推出工序{loginfo.WorkingProcedure} 没有获取到工件信息不做更新"; Log4NetHelper.WriteErrorLog(type, $"工件{loginfo.WorkPieceID} 工件SPC推出工序{loginfo.WorkingProcedure} 没有获取到工件信息不做更新"); return; } else {//更新表WorkPieceInfo if (loginfo.WorkingProcedure.Equals("OP10")) { info.WorkPieceCurrentPosition = info.WorkingProcedureCurrent + "SPC"; //var WorkingProcedure = (loginfo.MonitoringPoint.Equals("OP1002") ? "OP10" : "OP40"); loginfo2.WorkingProcedure = info.WorkingProcedureCurrent;//解决OP10,OP40同一个的问题 loginfo.WorkingProcedure = info.WorkingProcedureCurrent; //解决OP10,OP40同一个的问题 } else { info.WorkingProcedureCurrent = loginfo.WorkingProcedure; info.WorkPieceCurrentPosition = loginfo.WorkingProcedure + "SPC"; } info.WorkPieceState = (int)WorkPieceState.SPCPush; info.UpdatedUserName = loginfo.MonitoringPoint; info.UpdatedTime = DateTime.Now; info.WorkingProcedureEndTime = DateTimeHelper.GetDateTime(); if (!(info.WorkingProcedureStartTime.HasValue && info.WorkingProcedureStartTime > DateTime.Parse("1900/01/01"))) { info.WorkingProcedureStartTime = DateTimeHelper.GetDateTime(); } info.WorkingProcedureCompleted = info.WorkingProcedureCompleted + loginfo.WorkingProcedure;//已完成工序 info.WorkPieceCurrentPositionOrder = info.WorkingProcedurePlan.IndexOf(loginfo.WorkingProcedure) / 2; } info.Remarks = "工件SPC抽检推出"; //更新上一工序的结束时间 var pro = db.WorkPieceProcess.Where(o => o.WorkPieceID == loginfo.WorkPieceID && o.WorkingProcedureCurrent == loginfo.WorkingProcedure && o.OperationType == OperationType.生产.ToString()).OrderByDescending(o => o.StartTime).FirstOrDefault(); if (pro != null && pro.WorkPieceID.Length > 0) { pro.EndTime = DateTimeHelper.GetDateTime(); pro.Remarks = (pro.Remarks ?? "") + "SPC抽检结束"; pro.UpdatedUserName = loginfo.MonitoringPoint; pro.UpdatedTime = DateTimeHelper.GetDateTime(); } //每次SPC 都插入追溯表 WorkPieceProcess process = new WorkPieceProcess(); process = EntityPropHelper.Mapper(info); process.StartTime = DateTimeHelper.GetDateTime(); process.OperationType = OperationType.SPC.ToString(); process.QualityState = (int)QualityState.Suspected; process.Id = Yitter.IdGenerator.YitIdHelper.NextId(); process.CreatedUserName = loginfo.MonitoringPoint; process.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); process.UpdatedUserName = loginfo.MonitoringPoint; process.UpdatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); process.Remarks = "工件SPC抽检推出"; db.WorkPieceProcess.Add(process); db.WorkPieceInfoLog.Add(GetAddWorkPieceInfoLog(info)); } else { loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"工件SPC抽检推出读取二维码{loginfo.WorkPieceID ?? "空"}异常"; Log4NetHelper.WriteErrorLog(type, $" {loginfo.WorkingProcedure}工件SPC抽检推出读码标记 读取工件码数据[{loginfo.WorkPieceID ?? "空"}]时异常:"); } } catch (Exception e) { loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"读取二维码{loginfo.WorkPieceID ?? "空"}更新数据异常{e.Message}"; } finally { db.WorkPieceLog.Add(GetAddWorkPieceLog(loginfo2));//插入工件采集日志表 db.SaveChanges(); } } } /// /// 工序完成 /// /// /// public static void WorkingProcedureComplete(WorkPieceLogMiddle logMiddle, LogType type) { using (DbModel db = new DbModel()) { if (logMiddle.WorkingProcedure.Equals("OP70")) { logMiddle.QualityState = (int)QualityState.OK; //如果是OP70,则默认是合格 【Editby shaocx,2024-06-25】 } WorkPieceLog loginfo2 = new WorkPieceLog(); loginfo2 = EntityPropHelper.Mapper(logMiddle); try { if (logMiddle.WorkPieceID != null && logMiddle.WorkPieceID.Trim('\0').Length == 22) { bool isAddWorkPieceInfo = false; WorkPieceInfo info = new WorkPieceInfo(); info = db.WorkPieceInfo.Where(o => o.WorkPieceID == logMiddle.WorkPieceID).FirstOrDefault(); if (info == null || info.WorkPieceID.Length < 1) {//没有工件信息,不做更新 (为了测试先先新增) Log4NetHelper.WriteErrorLog(type, $"工件{logMiddle.WorkPieceID} 工件推出工序{logMiddle.WorkingProcedure} 没有获取到工件信息不做更新"); //db.WorkPieceLog.Add(GetAddWorkPieceLog(loginfo));//插入工件采集日志表 //db.SaveChanges(); loginfo2 = CommonManager.Instance.GetWorkPieceID(logMiddle, type); info = EntityPropHelper.Mapper(logMiddle); //EntityPropHelper.CopyProp(loginfo, info, loginfo.GetWorkPieceInfoDict()); if (!logMiddle.WorkingProcedure.Equals("OP05")) {//当工件二维码第一次出现的工序不是OP05,则设置为可疑状态 info.QualityState = (int)QualityState.Suspected; info.QualityErrorInfo = $"工件二维码第一次出现的工序{logMiddle.MonitoringPoint}不是OP05,数据缺失,请确认情况并做相应处理!"; info.Remarks = $"工件二维码第一次出现的工序{logMiddle.MonitoringPoint}不是OP05,数据缺失,请确认情况并做相应处理!"; } else { info.QualityState = (int)QualityState.OK;//此处需要注意,判断所有工序质量,然后再赋值 info.Remarks = "OP05新增工件信息"; } info.WorkPieceinitOnlineTime = DateTimeHelper.GetDateTime();//WorkPieceInitOnlineTime info.WorkingProcedurePlan = ConfigHelper.GetConfigString("WorkingProcedureAllStr") ?? "OP05OP10OP20OP30OP35OP40OP50OP60OP70OP80"; info.CreatedUserName = logMiddle.MonitoringPoint; info.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); info.WorkingProcedureCurrent = logMiddle.WorkingProcedure; info.WorkingProcedureEndTime = null; info = ParseQRCode(info); isAddWorkPieceInfo = true; } if (logMiddle.WorkingProcedure.Equals("OP10")) { //var WorkingProcedure = (loginfo.MonitoringPoint.Equals("OP1002") ? "OP10" : "OP40"); loginfo2.WorkingProcedure = info.WorkingProcedureCurrent;//解决OP10,OP40同一个的问题 logMiddle.WorkingProcedure = info.WorkingProcedureCurrent; //解决OP10,OP40同一个的问题 } info.UpdatedUserName = logMiddle.MonitoringPoint; info.UpdatedTime = DateTimeHelper.GetDateTime(); info.WorkingProcedureCompleted = info.WorkingProcedureCompleted + logMiddle.WorkingProcedure;//已完成工序 if (!(info.WorkingProcedureStartTime.HasValue && info.WorkingProcedureStartTime > DateTime.Parse("1900/01/01"))) {//若一直没有工序开始时间,则赋值当前时间 info.WorkingProcedureStartTime = DateTimeHelper.GetDateTime(); } info.WorkingProcedureEndTime = DateTimeHelper.GetDateTime(); info.WorkPieceCurrentPositionOrder = info.WorkingProcedurePlan.IndexOf(logMiddle.WorkingProcedure) / 2; info.Remarks = $"{logMiddle.WorkingProcedure}工序完成"; long op80id = 0; if (logMiddle.WorkingProcedure.Equals("OP80")) { info.WorkPieceState = (int)WorkPieceState.FinishedProducts; info.WorkPieceLastOfflineTime = DateTimeHelper.GetDateTime(); info.WorkPieceCurrentPosition = "OP80"; info.CompleteTime = DateTimeHelper.GetDateTime(); info.OP80NewCode = logMiddle.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 == logMiddle.WorkPieceID).FirstOrDefault(); if (qualityData == null || qualityData.WorkPieceID.Length < 1 || qualityData.WorkingProcedure.Length < 1) {//插入QualityDataInfo表 qualityData = EntityPropHelper.Mapper(logMiddle); db.QualityDataInfo.Add(GetAddQualityDataInfo(qualityData)); } //修改QualityDataInfo表 //重复收到质量信息,会覆盖之前的 EntityPropHelper.CopyProp(logMiddle, qualityData, GetQualityDataInfoUpdate(logMiddle, logMiddle.WorkingProcedure, logMiddle.MonitoringPoint));//指定修改字段 //质检数据改为 获取文件后修改 【Editby shaocx,2024-06-15】 /* qualityData.QualityStateUpdateUser = info.UpdatedUserName; qualityData.QualityReceiveTime = info.UpdatedTime.Value.LocalDateTime; qualityData.QualityStateUpdateMode = info.QualityStateUpdateMode; qualityData.OP80QualityState = loginfo.QualityState.HasValue ? loginfo.QualityState.Value.ToString() : "3"; qualityData.OP80QualityReceiveTime = DateTimeHelper.GetDateTime(); qualityData.OP80QualityFilePath = loginfo.OP80QualityFilePath; op80id = qualityData.Id; loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"质量:{loginfo.QualityStateStr ?? "空"}"; if (!info.QualityState.Equals(((int)QualityState.OK).ToString())) { info.QualityErrorInfo = $"{loginfo.WorkingProcedure}工序质量采集数据不合格"; } else { info.QualityErrorInfo = ""; } //*/ } else if (logMiddle.WorkingProcedure.Equals("OP30")) { info.QualityState = (int)((logMiddle.QualityStateStr.Equals("OK") || logMiddle.QualityStateStr.Equals("0K")) ? QualityState.OK : QualityState.NG); logMiddle.QualityState = info.QualityState; info.QualityStateUpdateUser = logMiddle.UpdatedUserName; info.QualityStateUpdateTime = logMiddle.UpdatedTime.Value.LocalDateTime; info.QualityStateUpdateMode = QualityStateUpdateMode.Auto.ToString(); var qualityData = db.QualityDataInfo.Where(o => o.WorkPieceID == logMiddle.WorkPieceID).FirstOrDefault(); if (qualityData == null || qualityData.WorkPieceID.Length < 1 || qualityData.WorkingProcedure.Length < 1) {//插入QualityDataInfo表 qualityData = EntityPropHelper.Mapper(logMiddle); db.QualityDataInfo.Add(GetAddQualityDataInfo(qualityData)); } qualityData.QualityStateUpdateUser = info.UpdatedUserName; qualityData.QualityReceiveTime = info.UpdatedTime.Value.LocalDateTime; qualityData.QualityStateUpdateMode = info.QualityStateUpdateMode; qualityData.OP30QualityState = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP30QualityReceiveTime = DateTimeHelper.GetDateTime(); loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"质量:{logMiddle.QualityStateStr ?? "空"}"; if (!info.QualityState.Equals(((int)QualityState.OK).ToString())) { info.QualityErrorInfo = $"{logMiddle.WorkingProcedure}工序质量采集数据不合格"; } else { info.QualityErrorInfo = ""; } } else { info.WorkPieceState = (int)WorkPieceState.WIP; if (info.WorkingProcedurePlan.IndexOf(logMiddle.WorkingProcedure) + 4 <= info.WorkingProcedurePlan.Length) { info.WorkPieceCurrentPosition = info.WorkingProcedurePlan.Substring(info.WorkingProcedurePlan.IndexOf(logMiddle.WorkingProcedure), 8); } } var pro = db.WorkPieceProcess.Where(o => o.WorkPieceID == logMiddle.WorkPieceID && o.WorkingProcedureCurrent == info.WorkingProcedureCurrent && o.OperationType == OperationType.生产.ToString()).OrderByDescending(o => o.StartTime).FirstOrDefault(); if (pro == null || pro.WorkPieceID.Length < 1) { WorkPieceProcess process = new WorkPieceProcess(); process = EntityPropHelper.Mapper(info); process.Id = Yitter.IdGenerator.YitIdHelper.NextId(); process.StartTime = DateTimeHelper.GetDateTime(); process.EndTime = DateTimeHelper.GetDateTime(); if (logMiddle.WorkingProcedure.Equals("OP80")) {//OP80的质量数据是后来获取文件搞的 } else { process.QualityState = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value : (int)QualityState.OK; } process.CreatedUserName = logMiddle.MonitoringPoint; process.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); process.UpdatedUserName = logMiddle.MonitoringPoint; process.UpdatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); process.OperationType = OperationType.生产.ToString(); process.Remarks = ""; if (logMiddle.WorkingProcedure.Equals("OP80")) { process.GetQcDataFlag = logMiddle.GetQcDataFlag;//赋值标记 [Editby shaocx,2024-06-15] } if (op80id > 0) { process.QualityDataInfoID = op80id; } db.WorkPieceProcess.Add(process); } else { if (op80id > 0) { pro.QualityDataInfoID = op80id; } pro.EndTime = DateTimeHelper.GetDateTime(); pro.UpdatedUserName = logMiddle.MonitoringPoint; pro.UpdatedTime = DateTimeHelper.GetDateTime(); if (logMiddle.WorkingProcedure.Equals("OP80")) { if (pro.GetQcDataFlag != 0) { pro.GetQcDataFlag = logMiddle.GetQcDataFlag;//赋值标记 [Editby shaocx,2024-06-15] } } } if (isAddWorkPieceInfo) { db.WorkPieceInfo.Add(info); } db.WorkPieceInfoLog.Add(GetAddWorkPieceInfoLog(info)); } else { loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"下线完成读取二维码{logMiddle.WorkPieceID ?? "空"}异常"; Log4NetHelper.WriteErrorLog(type, $" {logMiddle.WorkingProcedure}工序下线 读取工件码数据[{logMiddle.WorkPieceID ?? "空"}]时异常:"); } } catch (Exception e) { loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"读取二维码{logMiddle.WorkPieceID ?? "空"}更新数据异常{e.Message}"; } db.WorkPieceLog.Add(GetAddWorkPieceLog(loginfo2));//插入工件采集日志表 db.SaveChanges(); } } public static void AlertMonitor(WorkPieceLog loginfo, LogType type) { } /// /// 设备告警监控(清洗液,切削液,刀具告警等) /// /// /// public static void AlertMonitor(LogType type) { using (DbModel db = new DbModel()) { bool isAddAlert = false; try { var equipmentlist = db.EquipmentBaseInfo.Where(o => o.IsDeleted == false).ToList(); var alertlist = db.v_get_equipment_alert.Where(o => o.IsDeleted == false).ToList(); var knifetoolbase = db.KnifeToolBaseInfo.Where(o => o.IsDeleted == false).ToList(); var knifetoolinfo = db.KnifeToolEquipmentInfo.Where(o => o.IsDeleted == false).ToList(); //var knifelist = db.KnifeToolEquipmentInfo.GroupJoin(db.KnifeToolBaseInfo.Where(o => o.IsDeleted == false).ToList(), a => a.EquipmentID, b => b.EquipmentID, (a, b) => new { a,b}) //.SelectMany(ab => ab.b.DefaultIfEmpty(), (ab, b) => new { ab.a, b.KnifeToolChangeAlertThreshold,b.KnifeToolLife }) //.Where(o => o.a.IsDeleted == false) //.ToList(); foreach (var item in equipmentlist) { try { var alert = alertlist.Where(o => o.EquipmentId.Equals(item.EquipmentId)).FirstOrDefault(); if (alert == null || alert.Id < 1) { alert = EntityPropHelper.Mapper(item); isAddAlert = true; } //if(item.WorkingProcedure.Equals("OP70")) { if (item.Detergentchangetime.HasValue) { if (item.Detergentchangetime.Value.AddDays(item.DetergentChangeAlertThreshold).Date <= DateTime.Now.Date) {//op70清洗液告警 alert.IsAlertDetergent = true; alert.Detergentchangetime = item.Detergentchangetime; alert.DetergentChangeAlertThreshold = item.DetergentChangeAlertThreshold; alert.DetergentChangeCycle = item.DetergentChangeCycle; alert.DetergentDesc = $"设备【{item.EquipmentName}】清洗液最新更换时间为【{item.Detergentchangetime.Value}】,已达到告警阈值,请注意!"; } else { alert.IsAlertDetergent = false; alert.DetergentDesc = ""; } } else { alert.IsAlertDetergent = false; alert.DetergentDesc = ""; } } //if (!item.WorkingProcedure.Equals("OP05")&& !item.WorkingProcedure.Equals("OP30") && !item.WorkingProcedure.Equals("OP70") && !item.WorkingProcedure.Equals("OP80")) { if (item.CuttingFluidChangeTime.HasValue) { if (item.CuttingFluidChangeTime.Value.AddDays(item.CuttingFluidChangeAlertThreshold).Date <= DateTime.Now.Date) {//切削液告警 alert.IsAlertCuttingFluid = true; alert.CuttingFluidChangeTime = item.CuttingFluidChangeTime; alert.CuttingFluidChangeAlertThreshold = item.CuttingFluidChangeAlertThreshold; alert.CuttingFluidDesc = $"设备【{item.EquipmentName}】切削液最新更换时间为【{item.CuttingFluidChangeTime.Value}】,已达到告警阈值,请注意!"; } else { alert.IsAlertCuttingFluid = false; alert.CuttingFluidDesc = ""; } } else { alert.IsAlertCuttingFluid = false; alert.CuttingFluidDesc = ""; } } bool flag = false; string desc = $"设备【{item.EquipmentName}】"; foreach (var knife in knifetoolinfo.Where(o => o.EquipmentID.Equals(item.EquipmentId))) { var list = knifetoolbase.Where(o => o.KnifeToolID.Equals(knife.KnifeToolID)).FirstOrDefault(); if (list != null) { if ((knife.CurrentLife + list.KnifeToolChangeAlertThreshold) >= list.KnifeToolLife) {//刀具告警 flag = true; alert.IsAlertKnifeTool = true; alert.KnifeToolChangeAlertThreshold = list.KnifeToolChangeAlertThreshold; desc += $"\r\n工位【{knife.Station}】上刀具【{knife.KnifeToolID}】计划寿命【{list.KnifeToolLife}】次,当前已使用寿命【{knife.CurrentLife}】次,已达到告警阈值,请注意!"; } } } if (!flag) {//没有刀具告警 alert.IsAlertKnifeTool = false; alert.KnifeToolDesc = ""; } else { alert.IsAlertKnifeTool = true; alert.KnifeToolDesc = desc; } EquipmentCurrentMonitor info = new EquipmentCurrentMonitor(); info = db.EquipmentCurrentMonitor.Where(o => o.EquipmentID == item.EquipmentId).FirstOrDefault(); if (info == null || info.Id < 1) {//没有工件信息,不做更新 Log4NetHelper.WriteErrorLog(type, $"设备{item.EquipmentId} 计算告警{item.WorkingProcedure} 没有获取到设备监控信息!"); } else { if (string.IsNullOrEmpty(info.Alertmsg)) { alert.IsAlert = false; alert.AlertDesc = ""; } else { alert.IsAlert = true; alert.AlertDesc = info.Alertmsg; } } if (isAddAlert) { db.v_get_equipment_alert.Add(alert); } } catch (Exception ex) { Log4NetHelper.WriteErrorLog(type, $" {item.EquipmentName}设备计算告警时异常:"); } } } catch (Exception e) { Log4NetHelper.WriteErrorLog(type, $" 设备告警监控(清洗液,切削液,刀具告警等) 计算时异常:{e.Message} {e.StackTrace}"); } //db.WorkPieceLog.Add(loginfo2);//插入设备采集日志表 db.SaveChanges(); } } /// /// 设备监控 /// /// /// public static void EquipmentMonitor(WorkPieceLogMiddle loginfo, LogType type) { using (DbModel db = new DbModel()) { var loginfo2 = EntityPropHelper.Mapper(loginfo); try { bool isAddEquipmentCurrentMonitor = false; EquipmentCurrentMonitor info = new EquipmentCurrentMonitor(); info = db.EquipmentCurrentMonitor.Where(o => o.EquipmentID == loginfo.EquipmentID).FirstOrDefault(); if (info == null || info.Id < 1) {//没有工件信息,不做更新 Log4NetHelper.WriteErrorLog(type, $"设备{loginfo.EquipmentID} 告警监控{loginfo.MonitoringPoint} 没有获取到设备监控信息,现新增"); info = EntityPropHelper.Mapper(loginfo); isAddEquipmentCurrentMonitor = true; } //最新设备状态 string State = ""; //OP20,OP30,OP35,OP50,OP60等等都不区分告警和message,但code都不会重复,所以本处就不需要判断告警类型了 var codelist = db.EquipmentFailureCode.Where(o => o.WorkingProcedure.Equals(loginfo.WorkingProcedure)).ToList(); #region 故障代码处理 List Failueslist = new List(); Failueslist.Add(loginfo.FailureType1); Failueslist.Add(loginfo.FailureType2); Failueslist.Add(loginfo.FailureType3); Failueslist.Add(loginfo.FailureType4); Failueslist.Add(loginfo.FailureType5); Failueslist.Add(loginfo.FailureType6); Failueslist.Add(loginfo.FailureType7); Failueslist.Add(loginfo.FailureType8); Failueslist.Add(loginfo.FailureType9); Failueslist.Add(loginfo.FailureType10); Failueslist.Add(loginfo.FailureType11); Failueslist.Add(loginfo.FailureType12); Failueslist.Add(loginfo.FailureType13); Failueslist.Add(loginfo.FailureType14); Failueslist.Add(loginfo.FailureType15); Failueslist.Add(loginfo.FailureType16); Failueslist.Add(loginfo.FailureType17); Failueslist.Add(loginfo.FailureType18); Failueslist.Add(loginfo.FailureType19); Failueslist.Add(loginfo.FailureType20); Failueslist.RemoveAll(o => o == 0); string faultall = ""; string faultmsg = ""; int i = 1; foreach (var failues in Failueslist) { faultall += (failues + "\r\n"); EquipmentFailureCode codeinfo = codelist.Where(o => o.Code == failues.ToString()).FirstOrDefault(); if (codeinfo != null && codeinfo.Code.Length > 0) { faultmsg += (i.ToString() + "." + (codeinfo.CodeDesc ?? codeinfo.Code) + "\r\n"); } else { faultmsg += (i.ToString() + "." + failues.ToString() + "\r\n"); } i++; } //var faultall = string.Join("\r\n", Failueslist.OrderBy(o=>o)); #endregion #region 告警代码处理 List Alertlist = new List(); Alertlist.Add(loginfo.FailureMessage1); Alertlist.Add(loginfo.FailureMessage2); Alertlist.Add(loginfo.FailureMessage3); Alertlist.Add(loginfo.FailureMessage4); Alertlist.Add(loginfo.FailureMessage5); Alertlist.Add(loginfo.FailureMessage6); Alertlist.Add(loginfo.FailureMessage7); Alertlist.Add(loginfo.FailureMessage8); Alertlist.Add(loginfo.FailureMessage9); Alertlist.Add(loginfo.FailureMessage10); Alertlist.Add(loginfo.FailureMessage11); Alertlist.Add(loginfo.FailureMessage12); Alertlist.Add(loginfo.FailureMessage13); Alertlist.Add(loginfo.FailureMessage14); Alertlist.Add(loginfo.FailureMessage15); Alertlist.Add(loginfo.FailureMessage16); Alertlist.Add(loginfo.FailureMessage17); Alertlist.Add(loginfo.FailureMessage18); Alertlist.Add(loginfo.FailureMessage19); Alertlist.Add(loginfo.FailureMessage20); Alertlist.RemoveAll(o => o == 0); string alertall = ""; string warnmsg = ""; i = 1; foreach (var alert in Alertlist) { alertall += (alert + "\r\n"); var codeinfo = codelist.Where(o => o.Code == alert.ToString()).FirstOrDefault(); if (codeinfo != null && codeinfo.Code.Length > 0) { warnmsg += (i.ToString() + "." + (codeinfo.CodeDesc ?? codeinfo.Code) + "\r\n"); } else { warnmsg += (i.ToString() + "." + alert.ToString() + "\r\n"); } i++; } #endregion //var alertall = string.Join("\r\n", Alertlist.OrderBy(o=>o)); EquipmentWorkingLog infolog = new EquipmentWorkingLog(); infolog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); infolog.LogAddTime = DateTimeHelper.GetDateTime(); infolog.WorkPieceLogID = loginfo2.Id; infolog.EquipmentID = info.EquipmentID; bool isAddEquipmentWorkingLog = false; bool isStatechange = false; #region 设备状态处理 //故障》警告》其他 if (loginfo.IsCloseAlert) {//故障 info.AlertTime = info.AlertTime ?? DateTime.Now; info.FailureType = ""; info.WarnType = ""; info.Alertmsg = faultmsg;//这个需要代码对应字典维护信息才知道 info.FailureType = faultall; State = ((int)EnumEquipmentCurrentStateDisplay.故障).ToString(); //infolog.FailureStartTime = DateTimeHelper.GetDateTime(); //infolog.FailureType = faultall; //infolog.FailureMsg = faultmsg; if (loginfo.IsMessage) { info.WarnTime = info.WarnTime ?? DateTime.Now; info.Warnmsg = warnmsg;//这个需要代码对应字典维护信息才知道 info.WarnType = alertall; } } //else if (loginfo.IsMessage) //{//警告 // info.AlertTime = null; // info.Alertmsg = "";//这个需要代码对应字典维护信息才知道 // info.FailureType = ""; // info.WarnTime = info.WarnTime ?? DateTime.Now; // info.Warnmsg = warnmsg;//这个需要代码对应字典维护信息才知道 // info.WarnType = alertall; // //infolog.WarnStartTime = DateTimeHelper.GetDateTime(); // //infolog.WarnType = alertall; // //infolog.Warnmsg = warnmsg; // State = ((int)EnumEquipmentCurrentStateDisplay.警告).ToString(); //} else {//告警结束,获取有告警的数据,然后关闭他 info.AlertTime = null; info.Alertmsg = "";//这个需要代码对应字典维护信息才知道 info.FailureType = ""; info.WarnType = ""; info.WarnTime = null; info.Warnmsg = ""; if (loginfo.IsMessage) {//警告会覆盖下面的状态,先不用警告了 info.WarnTime = info.WarnTime ?? DateTime.Now; info.Warnmsg = warnmsg;//这个需要代码对应字典维护信息才知道 info.WarnType = alertall; } if (info.EquipmentCurrentState == null || (!info.EquipmentCurrentState.Equals(((int)EnumEquipmentCurrentStateDisplay.离线).ToString()))) {//如果设备状态为离线,则此处不需要判断任何信息 if (loginfo.IsNormalProduction && !loginfo.LackMaterial && !loginfo.FullMaterial) {//自动运行状态+不缺料+不堵料 State = ((int)EnumEquipmentCurrentStateDisplay.生产).ToString(); } else if (loginfo.IsNormalProduction && loginfo.FullMaterial) {//自动运行状态+下料道满料 = 完成 (就是有生产出来但没有出设备) State = ((int)EnumEquipmentCurrentStateDisplay.完成).ToString(); } //else if (loginfo.IsNormalProduction && loginfo.LackMaterial) //{//其他状态全算待机 // State = ((int)EnumEquipmentCurrentStateDisplay.待机).ToString(); //} else {//其他状态全算待机 State = ((int)EnumEquipmentCurrentStateDisplay.待机).ToString(); } } } if (!string.IsNullOrEmpty(State) && State != info.EquipmentCurrentState) {//只有状态出现变化才变更,状态变更,肯定有新的一条数据 //状态变更,获取旧状态的信息,若有则更新(准确的说,只要没有结束时间的设备状态都需要更新结束时间,以便于插入新的数据) var equlogState = db.EquipmentWorkingLog.Where(o => o.EquipmentID == loginfo.EquipmentID && o.EquipmentStateStartTime != null && o.EquipmentStateStartTime != DateTime.MinValue && (o.EquipmentStateEndTime == null || o.EquipmentStateEndTime == DateTime.MinValue) //&& o.EquipmentState== info.EquipmentCurrentState ) .OrderByDescending(o => o.EquipmentStateStartTime).FirstOrDefault(); if (equlogState != null) { equlogState.MonitoringPoint = loginfo.MonitoringPoint; equlogState.EquipmentStateEndTime = DateTimeHelper.GetDateTime(); } info.UpdatedUserName = loginfo.MonitoringPoint; info.UpdatedTime = DateTime.Now; info.EquipmentCurrentState = State; //状态变更,需要更新原来的,肯定会插入新的 infolog.EquipmentState = State; infolog.EquipmentStateStartTime = DateTimeHelper.GetDateTime(); infolog.WorkingProcedure = loginfo.WorkingProcedure; infolog.MonitoringPoint = loginfo.MonitoringPoint; infolog.Remarks = "告警信息出现变更3"; infolog.UpdateDesc = (infolog.UpdateDesc ?? "") + $"设备状态变更为{((EnumEquipmentCurrentStateDisplay)int.Parse(State)).ToString()}\r\n"; isAddEquipmentWorkingLog = true; isStatechange = true; } #endregion //1.有故障则是故障状态, 有故障信息+告警信息 //2.没有故障有告警则是告警状态,有告警信息 //3.即没故障,也没告警,则是其他状态 //查找是否有未结束的故障 var equlogFailure = db.EquipmentWorkingLog.Where(o => o.EquipmentID == loginfo.EquipmentID && o.FailureStartTime != null && o.FailureStartTime != DateTime.MinValue && (o.FailureEndTime == null || o.FailureEndTime == DateTime.MinValue)) .OrderByDescending(o => o.FailureStartTime).FirstOrDefault(); if (loginfo.IsCloseAlert) {//有故障标志位,设备状态若有变更则肯定有新增,此处直接更新即可 //有故障标志位,设备状态若没有更新,有故障,也不会插入新的(有故障设备状态变更肯定是变成故障) infolog.FailureStartTime = DateTimeHelper.GetDateTime(); infolog.FailureType = faultall; infolog.FailureMsg = faultmsg; infolog.WorkingProcedure = loginfo.WorkingProcedure; infolog.MonitoringPoint = loginfo.MonitoringPoint; infolog.Remarks = "故障信息出现变更1"; infolog.UpdateDesc = (infolog.UpdateDesc ?? "") + "故障信息变更\r\n"; } else { if (equlogFailure != null) {//故障关闭的 equlogFailure.MonitoringPoint = loginfo.MonitoringPoint; equlogFailure.FailureEndTime = DateTimeHelper.GetDateTime(); } } //查找是否有未结束的告警 var equlogalert = db.EquipmentWorkingLog.Where(o => o.EquipmentID == loginfo.EquipmentID && o.WarnStartTime != null && o.WarnStartTime != DateTime.MinValue && (o.WarnEndTime == null || o.WarnEndTime == DateTime.MinValue)) .OrderByDescending(o => o.WarnStartTime).FirstOrDefault(); if (loginfo.IsMessage) {//若有告警,如果有设备状态变更,肯定插入,此处只修改即可 //若有告警,如果设备状态没有变更,有告警,也不插入新的(问题:当状态没有更改,如一直是故障,但告警信息有变化,怎么办 ps:此处先不管) infolog.WarnStartTime = DateTimeHelper.GetDateTime(); infolog.WarnType = alertall; infolog.Warnmsg = warnmsg; infolog.WorkingProcedure = loginfo.WorkingProcedure; infolog.MonitoringPoint = loginfo.MonitoringPoint; infolog.Remarks = "告警信息出现变更2"; infolog.UpdateDesc = (infolog.UpdateDesc ?? "") + "告警信息变更\r\n"; } else { if (equlogalert != null) {//故障关闭的 equlogalert.MonitoringPoint = loginfo.MonitoringPoint; equlogalert.WarnEndTime = DateTimeHelper.GetDateTime(); } } #region 原来的代码,以后删掉 //EquipmentWorkingLog infolog =new EquipmentWorkingLog(); //infolog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); //infolog.LogAddTime = DateTimeHelper.GetDateTime(); //infolog.WorkPieceLogID = loginfo2.Id; //infolog.EquipmentID = info.EquipmentID; //bool isAddEquipmentWorkingLog = false; //if (loginfo.ischeckAlertStatus) //{//告警状态发生变更 // //说明是一个新告警,需要更新设备监控表 // //查找未结束的告警 // var equlog = db.EquipmentWorkingLog.Where(o => o.EquipmentID == loginfo.EquipmentID // && o.FailureStartTime != null && o.FailureStartTime != DateTime.MinValue) // .OrderByDescending(o=>o.FailureStartTime).FirstOrDefault(); // if (loginfo.IsCloseAlert) // { // if (equlog == null|| (equlog.FailureEndTime!=null&& equlog.FailureEndTime > DateTime.MinValue)) // { // info.AlertTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); // infolog.FailureStartTime = DateTimeHelper.GetDateTime(); // infolog.FailureType = faultall; // infolog.FailureMsg = faultmsg; // infolog.WorkingProcedure = loginfo.WorkingProcedure; // infolog.MonitoringPoint = loginfo.MonitoringPoint; // infolog.Remarks = "故障信息出现变更1"; // infolog.UpdateDesc = (infolog.UpdateDesc??"")+"故障信息变更\r\n"; // isAddEquipmentWorkingLog =true; // } // } // else // { // if (equlog != null && (equlog.FailureEndTime == null || equlog.FailureEndTime <= DateTime.MinValue)) // {//告警关闭的,若没有告警信息,不用管 // equlog.MonitoringPoint = loginfo.MonitoringPoint; // equlog.FailureEndTime = DateTimeHelper.GetDateTime(); // } // } //} //if (loginfo.ischeckMessageStatus) //{//告警状态发生变更 // //说明是一个新告警,需要更新设备监控表 // //查找未结束的告警 // var equlog = db.EquipmentWorkingLog.Where(o => o.EquipmentID == loginfo.EquipmentID // && o.WarnStartTime != null && o.WarnStartTime != DateTime.MinValue).OrderByDescending(o => o.WarnStartTime).FirstOrDefault(); // if (loginfo.IsMessage) // { // if (equlog == null || (equlog.WarnEndTime != null && equlog.WarnEndTime > DateTime.MinValue)) // { // info.WarnTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); // infolog.WarnStartTime = DateTimeHelper.GetDateTime(); // infolog.WarnType = alertall; // infolog.Warnmsg = warnmsg; // infolog.WorkingProcedure = loginfo.WorkingProcedure; // infolog.MonitoringPoint = loginfo.MonitoringPoint; // infolog.Remarks = "告警信息出现变更2"; // infolog.UpdateDesc = (infolog.UpdateDesc ?? "") + "告警信息变更\r\n"; // isAddEquipmentWorkingLog = true; // } // } // else // { // if (equlog != null && (equlog.WarnEndTime == null || equlog.WarnEndTime <= DateTime.MinValue)) // {//告警关闭的,若没有告警信息,不用管 // equlog.MonitoringPoint = loginfo.MonitoringPoint; // equlog.WarnEndTime = DateTimeHelper.GetDateTime(); // } // } //} ////故障》警告》其他 //if (loginfo.IsCloseAlert) //{//故障 // info.AlertTime = info.AlertTime??DateTime.Now; // info.FailureType = ""; // info.WarnType = ""; // info.Alertmsg = faultmsg;//这个需要代码对应字典维护信息才知道 // info.FailureType = faultall; // State = ((int)EnumEquipmentCurrentStateDisplay.故障).ToString(); // infolog.FailureStartTime = DateTimeHelper.GetDateTime(); // infolog.FailureType = faultall; // infolog.FailureMsg = faultmsg; // if (loginfo.IsMessage) // { // info.WarnTime = info.WarnTime ?? DateTime.Now; // info.Warnmsg = warnmsg;//这个需要代码对应字典维护信息才知道 // info.WarnType = alertall; // } //} //else if(loginfo.IsMessage) //{//警告 // info.AlertTime = null; // info.Alertmsg = "";//这个需要代码对应字典维护信息才知道 // info.FailureType = ""; // info.WarnTime = info.WarnTime ?? DateTime.Now; // info.Warnmsg = warnmsg;//这个需要代码对应字典维护信息才知道 // info.WarnType = alertall; // infolog.WarnStartTime = DateTimeHelper.GetDateTime(); // infolog.WarnType = alertall; // infolog.Warnmsg = warnmsg; // State = ((int)EnumEquipmentCurrentStateDisplay.警告).ToString(); //} //else //{//告警结束,获取有告警的数据,然后关闭他 // info.AlertTime = null; // info.Alertmsg = "";//这个需要代码对应字典维护信息才知道 // info.FailureType = ""; // info.WarnType = ""; // info.WarnTime = null; // info.Warnmsg = ""; // if (loginfo.IsNormalProduction&& loginfo.LackMaterial) // { // State = ((int)EnumEquipmentCurrentStateDisplay.待机).ToString(); // } // else if(loginfo.IsNormalProduction && !loginfo.LackMaterial) // { // State = ((int)EnumEquipmentCurrentStateDisplay.生产).ToString(); // } // else if(loginfo.IsNormalProduction && loginfo.FullMaterial) // {//正常生产+下料道满料 = 完成 (就是有生产出来但没有出设备) // State = ((int)EnumEquipmentCurrentStateDisplay.完成).ToString(); // } // else // {//理论上不可能走到这,只是避免空值 // State = ((int)EnumEquipmentCurrentStateDisplay.待机).ToString(); // } //} //if (!string.IsNullOrEmpty(State) && State != info.EquipmentCurrentState) //{//只有状态出现变化才变更 // info.UpdatedUserName = loginfo.MonitoringPoint; // info.UpdatedTime = DateTime.Now; // info.EquipmentCurrentState = State; // var equlog = db.EquipmentWorkingLog.Where(o => o.EquipmentID == loginfo.EquipmentID // && o.EquipmentStateStartTime != null && o.EquipmentStateStartTime != DateTime.MinValue).OrderByDescending(o => o.EquipmentStateStartTime).FirstOrDefault(); // if (equlog != null && (equlog.EquipmentStateEndTime == null || equlog.EquipmentStateEndTime <= DateTime.MinValue)) // { // equlog.MonitoringPoint = loginfo.MonitoringPoint; // equlog.EquipmentStateEndTime = DateTimeHelper.GetDateTime(); // } // //状态变更,需要更新原来的,并插入新的 // infolog.EquipmentState = State; // infolog.EquipmentStateStartTime = DateTimeHelper.GetDateTime(); // infolog.WorkingProcedure = loginfo.WorkingProcedure; // infolog.MonitoringPoint = loginfo.MonitoringPoint; // infolog.Remarks = "告警信息出现变更3"; // infolog.UpdateDesc = (infolog.UpdateDesc ?? "") + $"设备状态变更为{((EnumEquipmentCurrentStateDisplay)int.Parse(State)).ToString()}\r\n"; // isAddEquipmentWorkingLog = true; //} ////info.Remarks = $"{loginfo.WorkingProcedure}工序告警"; #endregion if (isAddEquipmentCurrentMonitor) { info.Id = Yitter.IdGenerator.YitIdHelper.NextId(); db.EquipmentCurrentMonitor.Add(info); } if (isAddEquipmentWorkingLog) { db.EquipmentWorkingLog.Add(infolog); } } catch (Exception e) { loginfo2.Remarks = (loginfo2.Remarks ?? "") + $"{loginfo2.MonitoringPoint}设备监控更新数据异常{e.Message}.{e.StackTrace}"; Log4NetHelper.WriteErrorLog(type, $"{loginfo2.MonitoringPoint}设备监控更新数据异常{e.Message}.{e.StackTrace}"); } //db.WorkPieceLog.Add(loginfo2);//插入设备采集日志表 db.SaveChanges(); } } /// /// 心跳监控 /// /// /// public static void EquipmentBeartBeatMonitor(WorkPieceLogMiddle loginfo, LogType type) { using (DbModel db = new DbModel()) { bool isAddEquipmentCurrentMonitor = false; EquipmentCurrentMonitor info = new EquipmentCurrentMonitor(); info = db.EquipmentCurrentMonitor.Where(o => o.WorkingProcedure == loginfo.WorkingProcedure).FirstOrDefault(); if (info == null) {//没有工件信息,不做更新 Log4NetHelper.WriteErrorLog(type, $"设备{loginfo.EquipmentID} 告警监控{loginfo.MonitoringPoint} 没有获取到设备监控信息,现新增"); info = EntityPropHelper.Mapper(loginfo); isAddEquipmentCurrentMonitor = true; info.EquipmentCurrentState = ((int)EnumEquipmentCurrentStateDisplay.待机).ToString(); info.IsDeleted = false; } string state = ""; EquipmentWorkingLog infolog = new EquipmentWorkingLog(); infolog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); infolog.LogAddTime = DateTimeHelper.GetDateTime(); infolog.WorkPieceLogID = loginfo.Id; infolog.EquipmentID = info.EquipmentID; bool isAddEquipmentWorkingLog = false; if (!loginfo.IsConnect) {//最新状态为离线 state = ((int)EnumEquipmentCurrentStateDisplay.离线).ToString(); info.EquipmentCurrentState = state; info.UpdatedUserName = loginfo.MonitoringPoint; info.UpdatedTime = DateTime.Now; info.Alertmsg = "设备离线"; info.AlertTime = DateTimeHelper.GetDateTime(); info.FailureType = ""; //若没有离线的信息,则新增一条 var equlog = db.EquipmentWorkingLog.Where(o => o.EquipmentID == loginfo.EquipmentID && o.EquipmentStateStartTime != null && o.EquipmentStateStartTime != DateTime.MinValue && (o.EquipmentStateEndTime == null || o.EquipmentStateEndTime == DateTime.MinValue) && o.EquipmentState.Equals(state) ).OrderByDescending(o => o.EquipmentStateStartTime).FirstOrDefault(); if (equlog == null) { infolog.EquipmentState = state; infolog.EquipmentStateStartTime = DateTimeHelper.GetDateTime(); infolog.WorkingProcedure = loginfo.WorkingProcedure; infolog.MonitoringPoint = loginfo.MonitoringPoint; infolog.Remarks = "离线"; infolog.UpdateDesc = (infolog.UpdateDesc ?? "") + $"设备状态变更为{((EnumEquipmentCurrentStateDisplay)int.Parse(state)).ToString()}\r\n"; isAddEquipmentWorkingLog = true; } //若有非离线的状态数据,则更新 var equlog2 = db.EquipmentWorkingLog.Where(o => o.EquipmentID == loginfo.EquipmentID && o.EquipmentStateStartTime != null && o.EquipmentStateStartTime != DateTime.MinValue && (o.EquipmentStateEndTime == null || o.EquipmentStateEndTime == DateTime.MinValue) && !o.EquipmentState.Equals(state) ).OrderByDescending(o => o.EquipmentStateStartTime).FirstOrDefault(); if (equlog2 != null) { equlog2.MonitoringPoint = loginfo.MonitoringPoint; equlog2.EquipmentStateEndTime = DateTimeHelper.GetDateTime(); } } else {//最新状态为开机 if (((int)EnumEquipmentCurrentStateDisplay.离线).ToString() == info.EquipmentCurrentState) {//只有离线状态,才能变成开机 state = ((int)EnumEquipmentCurrentStateDisplay.待机).ToString(); info.EquipmentCurrentState = state; info.UpdatedUserName = loginfo.MonitoringPoint; info.UpdatedTime = DateTime.Now; info.Alertmsg = ""; info.AlertTime = null; //有离线的数据,则更新 var equlog = db.EquipmentWorkingLog.Where(o => o.EquipmentID == loginfo.EquipmentID && o.EquipmentStateStartTime != null && o.EquipmentStateStartTime != DateTime.MinValue && (o.EquipmentStateEndTime == null || o.EquipmentStateEndTime == DateTime.MinValue) && o.EquipmentState.Equals(((int)EnumEquipmentCurrentStateDisplay.离线).ToString()) ).OrderByDescending(o => o.EquipmentStateStartTime).FirstOrDefault(); if (equlog != null) { equlog.MonitoringPoint = loginfo.MonitoringPoint; equlog.EquipmentStateEndTime = DateTimeHelper.GetDateTime(); } //离线变开机,肯定会插入一条 infolog.EquipmentState = state; infolog.EquipmentStateStartTime = DateTimeHelper.GetDateTime(); infolog.WorkingProcedure = loginfo.WorkingProcedure; infolog.MonitoringPoint = loginfo.MonitoringPoint; infolog.Remarks = "开机"; infolog.UpdateDesc = (infolog.UpdateDesc ?? "") + $"设备状态变更为{((EnumEquipmentCurrentStateDisplay)int.Parse(state)).ToString()}\r\n"; isAddEquipmentWorkingLog = true; } } if (isAddEquipmentWorkingLog) { db.EquipmentWorkingLog.Add(infolog); } if (isAddEquipmentCurrentMonitor) { info.Id = Yitter.IdGenerator.YitIdHelper.NextId(); db.EquipmentCurrentMonitor.Add(info); } db.SaveChanges(); } } public static void ThreadMonitor(ThreadStatusMonitorMiddle threadinfo) { ThreadMonitor(EntityPropHelper.Mapper(threadinfo)); try { SystemValue.UpdateMainList(threadinfo); } catch (Exception ex) { } } public static void ThreadMonitor(ThreadStatusMonitor threadinfo) { try { using (DbModel db = new DbModel()) { var info = db.ThreadStatusMonitor.Where(o => o.Threadcode == threadinfo.Threadcode).FirstOrDefault(); if (info == null || info.Id == 0) {//没有工件信息,不做更新 threadinfo.Id = Yitter.IdGenerator.YitIdHelper.NextId(); threadinfo.CreatedTime = DateTimeHelper.GetDateTime(); threadinfo.CreatedUserName = threadinfo.Threadcode; db.ThreadStatusMonitor.Add(threadinfo); } else {//更新表WorkPieceInfo info.Remarks = threadinfo.Remarks; info.ErrorMsg = threadinfo.ErrorMsg; info.Threadendtime = DateTimeHelper.GetDateTime();//每次都更新 info.ThreadId = threadinfo.ThreadId; info.ThreadFrequency = threadinfo.ThreadFrequency; 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();//最新跑到数据 //} } db.SaveChanges(); } } catch (Exception ex) { } } #region 业务方法 /// /// 【质量数据更新专用】 dict中前面一个是原对象,后面一个是目标对象 /// /// /// public static Dictionary GetQualityDataInfoUpdate(WorkPieceLogMiddle logMiddle, string WorkingProcedure = "", string MonitoringPoint = "") { Dictionary dict = new Dictionary(); dict.Add("QualityState", "QualityState"); dict.Add("EquipmentID", "EquipmentID"); dict.Add("WorkingProcedure", "WorkingProcedure"); dict.Add("QualityStateUpdateMode", "QualityStateUpdateMode"); dict.Add("QualityStateUpdateUser", "QualityStateUpdateUser"); dict.Add("OfflineTime", "OfflineTime"); switch (WorkingProcedure) { case "OP10": dict.Add("QualityOP10To1", "QualityOP10To1"); dict.Add("QualityNoOk", "QualityNoOk_OP10"); dict.Add("QualityNoOkReason", "QualityNoOkReason_OP10"); break; case "OP20": dict.Add("QualityOP20To1", "QualityOP20To1"); dict.Add("QualityNoOk", "QualityNoOk_OP20"); dict.Add("QualityNoOkReason", "QualityNoOkReason_OP20"); break; case "OP30": dict.Add("QualityNoOk", "QualityNoOk_OP30"); dict.Add("QualityNoOkReason", "QualityNoOkReason_OP30"); switch (MonitoringPoint) { case "OP3002CH3": dict.Add("QualityOP30To1", "QualityOP30To1"); break; case "OP3002CH4": dict.Add("QualityOP30To2", "QualityOP30To2"); dict.Add("QualityOP30To8", "QualityOP30To8"); break; case "OP3002CH5": dict.Add("QualityOP30To3", "QualityOP30To3"); dict.Add("QualityOP30To4", "QualityOP30To4"); dict.Add("QualityOP30To5", "QualityOP30To5"); dict.Add("QualityOP30To9", "QualityOP30To9"); dict.Add("QualityOP30To10", "QualityOP30To10"); dict.Add("QualityOP30To11", "QualityOP30To11"); break; case "OP3002CH6": dict.Add("QualityOP30To6", "QualityOP30To6"); dict.Add("QualityOP30To7", "QualityOP30To7"); break; default: break; } break; case "OP35": dict.Add("QualityOP35To1", "QualityOP35To1"); dict.Add("QualityOP35To2", "QualityOP35To2"); dict.Add("QualityNoOk", "QualityNoOk_OP35"); dict.Add("QualityNoOkReason", "QualityNoOkReason_OP35"); break; case "OP40": dict.Add("QualityOP40To1", "QualityOP40To1"); dict.Add("QualityNoOk", "QualityNoOk_OP40"); dict.Add("QualityNoOkReason", "QualityNoOkReason_OP40"); break; case "OP60": dict.Add("QualityOP60To1", "QualityOP60To1"); dict.Add("QualityOP60To2", "QualityOP60To2"); dict.Add("QualityNoOk", "QualityNoOk_OP60"); dict.Add("QualityNoOkReason", "QualityNoOkReason_OP60"); break; case "OP70": dict.Add("QualityOP70To1", "QualityOP70To1"); dict.Add("QualityOP70To2", "QualityOP70To2"); dict.Add("QualityOP70To3", "QualityOP70To3"); break; case "OP80": //dict.Add("OP80NewCode", "OP80NewCode"); dict.Add("QualityOP80To1", "QualityOP80To1"); dict.Add("QualityOP80To2", "QualityOP80To2"); dict.Add("QualityOP80To3", "QualityOP80To3"); dict.Add("QualityOP80To4", "QualityOP80To4"); dict.Add("QualityOP80To5", "QualityOP80To5"); dict.Add("QualityOP80To6", "QualityOP80To6"); dict.Add("QualityOP80To7", "QualityOP80To7"); dict.Add("QualityOP80To8", "QualityOP80To8"); dict.Add("QualityOP80To9", "QualityOP80To9"); dict.Add("QualityOP80To10", "QualityOP80To10"); //新增 【Editby shaocx,2024-06-16】 dict.Add("QualityOP80_Houdu", "QualityOP80_Houdu"); dict.Add("QualityOP80_ZXJ", "QualityOP80_ZXJ"); dict.Add("QualityOP80_DTKYZD", "QualityOP80_DTKYZD"); dict.Add("QualityOP80_XTSMYD", "QualityOP80_XTSMYD"); dict.Add("QualityOP80_XTXMYD", "QualityOP80_XTXMYD"); dict.Add("QualityOP80_D_TKZJ", "QualityOP80_D_TKZJ"); dict.Add("QualityOP80_D_S_X", "QualityOP80_D_S_X"); dict.Add("QualityOP80_D_S_Y", "QualityOP80_D_S_Y"); dict.Add("QualityOP80_D_X_X", "QualityOP80_D_X_X"); dict.Add("QualityOP80_D_X_Y", "QualityOP80_D_X_Y"); dict.Add("QualityOP80_X_TKZJ", "QualityOP80_X_TKZJ"); dict.Add("QualityOP80_X_S_X", "QualityOP80_X_S_X"); dict.Add("QualityOP80_X_S_Y", "QualityOP80_X_S_Y"); dict.Add("QualityOP80_X_X_X", "QualityOP80_X_X_X"); dict.Add("QualityOP80_X_X_Y", "QualityOP80_X_X_Y"); dict.Add("QualityNoOk", "QualityNoOk_OP80"); dict.Add("QualityNoOkReason", "QualityNoOkReason_OP80"); break; default: break; } return dict; } /// /// 【工件或工序数据数据更新专用】 dict中前面一个是原对象,后面一个是目标对象 /// /// /// public static Dictionary GetWorkPieceInfoUpdateForQualityNoOk(WorkPieceLogMiddle loginfo) { Dictionary dict = new Dictionary(); //if (loginfo.QualityState != null) //{ // QualityState qualityState; // bool isRight = Enum.TryParse(loginfo.QualityState.ToString(), out qualityState); // if (isRight && (qualityState == QualityState.NG || qualityState == QualityState.Suspected)) // { // } //} dict.Add("QualityNoOk", "QualityNoOk"); dict.Add("QualityNoOkReason", "QualityNoOkReason"); return dict; } public static void SetQualityNoOk_WorkPieceInfo(WorkPieceLogMiddle logMiddle, ref WorkPieceInfo pieceInfo) { pieceInfo.QualityNoOk = logMiddle.QualityNoOk; pieceInfo.QualityNoOkReason = logMiddle.QualityNoOkReason; } public static void SetQualityNoOk_WorkPieceProcess(WorkPieceLogMiddle logMiddle, ref WorkPieceProcess pieceProcess) { pieceProcess.QualityNoOk = logMiddle.QualityNoOk; pieceProcess.QualityNoOkReason = logMiddle.QualityNoOkReason; } /// /// 判断是否跳序 /// /// /// public static bool CheckQualityInfoComplete(WorkPieceInfo info, WorkPieceLog loginfo, LogType type) { //判断是否跳序 if (info == null || info.WorkPieceID.Length < 1) { Log4NetHelper.WriteErrorLog(type, $"校验工件信息{loginfo.WorkPieceID}工序是否跳序时,传入工件信息异常"); return true;//没取到工件信息,不做判断是否跳序 } else { try { string wproStr = info.WorkingProcedureCurrent + loginfo.WorkingProcedure; if (wproStr.Length != 8) { Log4NetHelper.WriteErrorLog(type, $"校验工件{info.WorkPieceID} {loginfo.WorkingProcedure}工序 是否跳序时,工序拼接有问题长度不为8位:{wproStr}"); return true;//工序拼接有问题 } if (!ConfigHelper.GetConfigString("WorkingProcedureAllStr").Contains(wproStr)) { Log4NetHelper.WriteErrorLog(type, $"校验工件{info.WorkPieceID} {loginfo.WorkingProcedure}工序 出现跳序,请设备注意:{wproStr}"); return false; } } catch (Exception ex) { Log4NetHelper.WriteErrorLog(type, $"校验工件{info.WorkPieceID} {loginfo.WorkingProcedure}工序 是否跳序时出现异常", ex); } } return true; //using (var trans = db.Database.BeginTransaction()) //{ } //var conStr = @"server=localhost;Database=EFDBO1;User ID=sa;Password=123456;"; //using (var connection = new SqlConnection(conStr)) //{ // connection.Open(); // using (var scope = new Transactionscope()) // { // //AD0.Net // var command = connection.CreateCommand(); // command.CommandText = "DELETE FROM T_RoleInfor"; // command.ExecuteNonQuery(); // //综合提交 // scope.complete(); // } //} } /// /// 解析二维码 /// /// /// public static WorkPieceInfo ParseQRCode(WorkPieceInfo loginfo) { if (string.IsNullOrEmpty(loginfo.WorkPieceID) || loginfo.WorkPieceID.Length != 22) { return loginfo; } loginfo.WorkPieceIDTo1 = loginfo.WorkPieceID.Substring(0, 2); loginfo.WorkPieceIDTo2 = loginfo.WorkPieceID.Substring(2, 4); loginfo.WorkPieceIDTo3 = loginfo.WorkPieceID.Substring(6, 6); loginfo.WorkPieceIDTo4 = loginfo.WorkPieceID.Substring(12, 2); loginfo.WorkPieceIDTo5 = loginfo.WorkPieceID.Substring(14, 4); loginfo.WorkPieceIDTo6 = loginfo.WorkPieceID.Substring(18, 2); loginfo.WorkPieceIDTo7 = loginfo.WorkPieceID.Substring(20, 2); return loginfo; } /// /// 计算OP 质量数据是否合格 /// public static 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; } #endregion } }