using iWare_SCADA_BusinessLogical.Utils; using iWare_SCADA_Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace iWare_SCADA_BusinessLogical.BLL.Important { public class QualityInfoCompleteManager { /// /// 质量检测完成 /// /// /// public static void QualityInfoComplete(WorkPieceLogMiddle logMiddle, LogType type) { //根据质量数据判断是否合格/不合格 【Editby shaocx,2024-06-25】 WorkPieceInfoManager.SetLogMiddleForQuality(ref logMiddle); //此处同时插入了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)QualityStateEnum.Suspected; pieceInfo.QualityErrorInfo = $"工件二维码第一次出现的工序{logMiddle.MonitoringPoint}不是OP05,数据缺失,请确认情况并做相应处理!"; pieceInfo.Remarks = $"工件二维码第一次出现的工序{logMiddle.WorkingProcedure}不是OP05,数据缺失,请确认情况并做相应处理!"; } else { pieceInfo.QualityState = (int)QualityStateEnum.OK;//此处需要注意,判断所有工序质量,然后再赋值 //默认合格,OP05默认是合格 pieceInfo.Remarks = "OP05新增工件信息"; } pieceInfo.WorkPieceinitOnlineTime = DateTimeHelper.GetDateTime(); pieceInfo.WorkingProcedurePlan = ConfigHelper.GetConfigString("WorkingProcedureAllStr") ?? "OP05OP10OP20OP30OP35OP40OP50OP60OP70OP80"; pieceInfo.CreatedUserName = WorkPieceInfoManager.ResetUpdatedUserName(logMiddle); SystemBussinessHelper.SetWorkPieceInfoMiddleForCreatedUserName(ref pieceInfo, logMiddle.DataCapturePointCname); pieceInfo.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); pieceInfo.WorkingProcedureStartTime = DateTimeHelper.GetDateTime();// pieceInfo.WorkingProcedureEndTime = null; pieceInfo = WorkPieceInfoManager.ParseQRCode(pieceInfo); isAddWorkPieceInfo = true; } else { loginfo2.Remarks = $"|工件{logMiddle.WorkPieceID} 质量检测完成工序{logMiddle.MonitoringPoint} 没有获取到工件信息,此时需要新增数据"; Log4NetHelper.WriteErrorLog(type, $"工件{logMiddle.WorkPieceID} 质量检测完成工序{logMiddle.MonitoringPoint} 没有获取到工件信息,此时需要新增数据"); //新增数据 【Editby shaocx,2024-09-07】 WorkPieceInfoHelper.CreateWorkPieceInfoForNoData(logMiddle, ref pieceInfo, ref isAddWorkPieceInfo); } } 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 = WorkPieceInfoManager.ResetUpdatedUserName(logMiddle); 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.WorkingProcedureCurrent = logMiddle.WorkingProcedure;//更新当前工序 【Editby shaocx,2024-09-03】 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 = $"{logMiddle.WorkingProcedure}质量检测完成修改"; pieceInfo.UpdatedUserName = WorkPieceInfoManager.ResetUpdatedUserName(logMiddle); SystemBussinessHelper.SetWorkPieceInfoMiddleForUpdateDataCapturePointCname(ref pieceInfo, logMiddle.DataCapturePointCname); 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")) ? QualityStateEnum.OK : QualityStateEnum.NG); //赋值不合格原因 WorkPieceInfoManager.SetQualityNoOk_WorkPieceInfo(logMiddle, ref pieceInfo); if (!pieceInfo.QualityState.Equals(((int)QualityStateEnum.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) { WorkPieceInfoManager.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(WorkPieceInfoManager.GetAddQualityDataInfo(qualityData)); } //修改QualityDataInfo表 //重复收到质量信息,会覆盖之前的 EntityPropHelper.CopyProp(logMiddle, qualityData, WorkPieceInfoManager.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(); if (qualityData.OP30QualityStateCH3 == ((int)QualityStateEnum.NG).ToString()) { logMiddle.QualityNoOk = (int)QualityNoOkEnum.OP30涨断工位力矩超差; logMiddle.QualityNoOkReason = QualityNoOkEnum.OP30涨断工位力矩超差.ToString(); //赋值不合格原因 WorkPieceInfoManager.SetQualityNoOk_WorkPieceInfo(logMiddle, ref pieceInfo); } break; case "OP3002CH4": qualityData.OP30QualityFilePathCH4 = logMiddle.OP30QualityFilePathCH4; qualityData.OP30QualityStateCH4 = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP30QualityReceiveTimeCH4 = DateTimeHelper.GetDateTime(); if (qualityData.OP30QualityStateCH4 == ((int)QualityStateEnum.NG).ToString()) { logMiddle.QualityNoOk = (int)QualityNoOkEnum.OP30预拧紧工位力矩超差; logMiddle.QualityNoOkReason = QualityNoOkEnum.OP30预拧紧工位力矩超差.ToString(); //赋值不合格原因 WorkPieceInfoManager.SetQualityNoOk_WorkPieceInfo(logMiddle, ref pieceInfo); } break; case "OP3002CH5": qualityData.OP30QualityFilePathCH5 = logMiddle.OP30QualityFilePathCH5; qualityData.OP30QualityStateCH5 = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP30QualityReceiveTimeCH5 = DateTimeHelper.GetDateTime(); if (qualityData.OP30QualityStateCH5 == ((int)QualityStateEnum.NG).ToString()) { logMiddle.QualityNoOk = (int)QualityNoOkEnum.OP30终拧紧工位力矩超差; logMiddle.QualityNoOkReason = QualityNoOkEnum.OP30终拧紧工位力矩超差.ToString(); //赋值不合格原因 WorkPieceInfoManager.SetQualityNoOk_WorkPieceInfo(logMiddle, ref pieceInfo); } break; case "OP3002CH6": qualityData.OP30QualityFilePathCH6 = logMiddle.OP30QualityFilePathCH6; qualityData.OP30QualityStateCH6 = logMiddle.QualityState.HasValue ? logMiddle.QualityState.Value.ToString() : "3"; qualityData.OP30QualityReceiveTimeCH6 = DateTimeHelper.GetDateTime(); if (qualityData.OP30QualityStateCH6 == ((int)QualityStateEnum.NG).ToString()) { logMiddle.QualityNoOk = (int)QualityNoOkEnum.OP30压衬套工位力矩超差; logMiddle.QualityNoOkReason = QualityNoOkEnum.OP30压衬套工位力矩超差.ToString(); //赋值不合格原因 WorkPieceInfoManager.SetQualityNoOk_WorkPieceInfo(logMiddle, ref pieceInfo); } 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 //修正:查询的工序是当前线程的工序,而不是当前数据的工序 【Editby shaocx,2024-09-03】 //&& o.WorkingProcedureCurrent == pieceInfo.WorkingProcedureCurrent && o.WorkingProcedureCurrent == logMiddle.WorkingProcedure && 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_05 = WorkPieceProcessHelper.CreateWorkPieceProcessForOP05(logMiddle, db, pieceInfo); if (process_05 != null) {//创建OP05工序,当没有05工序时,才创建 【Editby shaocx,2024-08-29】 db.WorkPieceProcess.Add(process_05); } WorkPieceProcess process = new WorkPieceProcess(); process = EntityPropHelper.Mapper(pieceInfo); QualityStateHelper.ResetQualityNoOkForNewProcess(ref process); process.StartTime = DateTimeHelper.GetDateTime(); //不再默认赋值为合格 【Editby shaocx,2024-08-16】 //process.QualityState = pieceInfo.QualityState.HasValue ? pieceInfo.QualityState.Value : (int)QualityState.OK;//默认合格,已处理 process.QualityState = WorkPieceInfoManager.GetQualityStateValue(pieceInfo.QualityState); //记录质量不合格原因 【Editby shaocx,2024-06-26】 //赋值不合格原因 WorkPieceInfoManager.SetQualityNoOk_WorkPieceProcess(logMiddle, ref process); process.Id = Yitter.IdGenerator.YitIdHelper.NextId(); process.CreatedUserName = WorkPieceInfoManager.ResetUpdatedUserName(logMiddle); process.DataCapturePointCname = logMiddle.DataCapturePointCname; process.CreatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); process.UpdatedUserName = WorkPieceInfoManager.ResetUpdatedUserName(logMiddle); process.UpdateDataCapturePointCname = logMiddle.DataCapturePointCname; process.UpdatedTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); process.OperationType = OperationType.生产.ToString(); process.QualityDataInfoID = qualityData.Id; process.Remarks = ""; process.MyRemarks = "质量检测完成时,如果找不到就新建"; db.WorkPieceProcess.Add(process); } else {//其他的都只是修改 pro.QualityDataInfoID = qualityData.Id; pro.UpdatedUserName = WorkPieceInfoManager.ResetUpdatedUserName(logMiddle); pro.UpdateDataCapturePointCname = logMiddle.DataCapturePointCname; pro.UpdatedTime = DateTimeHelper.GetDateTime(); //不再默认赋值为合格 【Editby shaocx,2024-08-16】 //pro.QualityState = pieceInfo.QualityState.HasValue ? pieceInfo.QualityState.Value : 9; pro.QualityState = WorkPieceInfoManager.GetQualityStateValue(pieceInfo.QualityState); //赋值不合格原因 WorkPieceInfoManager.SetQualityNoOk_WorkPieceProcess(logMiddle, ref pro); //TODO:判断如果是60工序,那么就要更新pro表的创建人为loginfo.MonitoringPoint 【Editby shaocx,2024-06-05】 if (logMiddle.WorkingProcedure == "OP60") { pro.CreatedUserName = WorkPieceInfoManager.ResetUpdatedUserName(logMiddle); pro.DataCapturePointCname = logMiddle.DataCapturePointCname; } } if (logMiddle.QualityType != null && logMiddle.QualityType.Equals(QualityType.SPC.ToString())) {//SPC反馈, if (logMiddle.QualityState != (int)QualityStateEnum.OK) { //当某到工序检测到不合格工件时,从该工件加工完成时刻前指定时间起至报检不合格时间止,系统将该工件的最后加工工序在该时间段内加工的所有工件、正在加工的工件、该工序入口处的第一个工件全部标记为疑似状态,由人工复检工件并修改状态,并支持批量变更。 //答复:在线测量不需要走这个流程,只有SPC抽检才需要,需要把这时间段的工件全部置为疑似,哪怕是已完成工件 //时间段起始时间:抽检工件生产时间前一SPC抽检时间 //时间段结束时间:抽检工件质量结果出现后的时间 //抽检工件工序扫描枪外入口处的第一个工件 也把质量状态置为疑似 //(每一工序SPC抽检是设置的固定的,比如200抽4,状态置为疑似时若工件还在设备内,会继续生产完毕后排出) //目前这块逻辑放到了 WebAPI中了 } } db.WorkPieceInfoLog.Add(WorkPieceInfoManager.GetAddWorkPieceInfoLog(pieceInfo)); db.QualityDataInfoLog.Add(WorkPieceInfoManager.GetAddQualityDataInfoLog(qualityData));//插入日志 } else { loginfo2.Remarks = $"质量检测完成读取二维码{logMiddle.WorkPieceID ?? "空"}异常"; Log4NetHelper.WriteErrorLog(type, $" {logMiddle.WorkingProcedure}工序监控读码标记 读取工件码数据[{logMiddle.WorkPieceID ?? "空"}]时异常:"); } } catch (Exception ex) { loginfo2.Remarks = $"质量检测完成,更新数据异常{ex.Message}"; Log4NetHelper.WriteErrorLog(type, $" {logMiddle.WorkingProcedure}质量检测完成 工件码数据[{logMiddle.WorkPieceID ?? "空"}]时异常:" + ex.Message, ex); } finally { loginfo2.Remarks = $"质量:{logMiddle.QualityStateStr ?? "空"}"; db.WorkPieceLog.Add(WorkPieceInfoManager.GetAddWorkPieceLog(loginfo2));//插入工件采集日志表 db.SaveChanges(); } } } /// /// 质量检测完成-OP70专用 /// /// /// public static void QualityInfoCompleteForOP70(WorkPieceLogMiddle logMiddle, LogType type) { if (string.IsNullOrEmpty(logMiddle.QualityOP70To1) && string.IsNullOrEmpty(logMiddle.QualityOP70To2) && string.IsNullOrEmpty(logMiddle.QualityOP70To3)) { Log4NetHelper.WriteErrorLog(type, $" {logMiddle.WorkingProcedure}工序监控清洗机数据 读取工件码数据[{logMiddle.WorkPieceID ?? "空"}]获取的三个值都是空的,不处理返回"); return; } using (DbModel db = new DbModel()) { try { bool isAdd = false; if (logMiddle.WorkPieceID.Length == 22) { var qualityData = db.QualityDataInfo.Where(o => o.WorkPieceID == logMiddle.WorkPieceID).FirstOrDefault(); if (qualityData == null || qualityData.WorkPieceID.Length < 1 || qualityData.WorkingProcedure.Length < 1) {//插入QualityDataInfo表 isAdd = true; qualityData = EntityPropHelper.Mapper(logMiddle); } qualityData.QualityStateUpdateUser = "OP7009"; qualityData.QualityReceiveTime = DateTime.Now; //特殊处理OP70的质量数据 if (string.IsNullOrEmpty(qualityData.QualityOP70To1) && !string.IsNullOrEmpty(SystemHelper.GetStrForQualityOP70(logMiddle.QualityOP70To1))) { qualityData.QualityOP70To1 = logMiddle.QualityOP70To1; } if (string.IsNullOrEmpty(qualityData.QualityOP70To2) && !string.IsNullOrEmpty(SystemHelper.GetStrForQualityOP70(logMiddle.QualityOP70To2))) { qualityData.QualityOP70To2 = logMiddle.QualityOP70To2; } if (string.IsNullOrEmpty(qualityData.QualityOP70To3) && !string.IsNullOrEmpty(SystemHelper.GetStrForQualityOP70(logMiddle.QualityOP70To3))) { qualityData.QualityOP70To3 = logMiddle.QualityOP70To3; } db.QualityDataInfoLog.Add(WorkPieceInfoManager.GetAddQualityDataInfoLog(qualityData));//插入日志 if (isAdd) { db.QualityDataInfo.Add(WorkPieceInfoManager.GetAddQualityDataInfo(qualityData)); } //更新表WorkPieceProcess var pro_70 = db.WorkPieceProcess.Where(o => o.WorkPieceID == logMiddle.WorkPieceID && o.WorkingProcedureCurrent == "OP70" ).OrderByDescending(o => o.StartTime).FirstOrDefault(); if (pro_70 != null) { pro_70.Update70Flag = 2; } db.SaveChanges();//保存数据 } else { Log4NetHelper.WriteErrorLog(type, $" {logMiddle.WorkingProcedure}工序监控清洗机数据 读取工件码数据[{logMiddle.WorkPieceID ?? "空"}]时异常:"); } } catch (Exception ex) { Log4NetHelper.WriteErrorLog(type, $" {logMiddle.WorkingProcedure}工序监控清洗机数据 读取工件码数据[{logMiddle.WorkPieceID ?? "空"}]时异常:", ex); } finally { } } } } }