using Bro.Common.Helper; using Bro.Common.Interface; using Bro.DataBase.Model; using Newtonsoft.Json; namespace Bro.M135.DBManager { public class Manager_P_PRODUCT : ModelManager { public bool NewProduct(P_PRODUCT p, List details, out string msg) { msg = ""; try { using (var context = new M135DB()) { p.CREATE_TIME = DateTime.Now; details.ForEach(d => { d.PID = p.PID; d.SN = p.SN; d.CREATE_TIME = DateTime.Now; }); context.P_PRODUCT.Add(p); context.P_PRODUCT_DETAIL.AddRange(details); context.SaveChanges(); } return true; } catch (Exception ex) { msg = ex.GetExceptionMessage(); return false; } } public bool NewProductDetails(List details, out string msg) { msg = ""; try { using (var context = new M135DB()) { details.ForEach(d => { d.CREATE_TIME = DateTime.Now; }); context.P_PRODUCT_DETAIL.AddRange(details); context.SaveChanges(); } return true; } catch (Exception ex) { msg = ex.GetExceptionMessage(); return false; } } public List QueryProduct(Request_P_Product request) { List pList = new List(); using (var context = new M135DB()) { IQueryable list = context.P_PRODUCT.Where(u => true); if (request.StartTime != null) { list = list.Where(u => u.CREATE_TIME >= request.StartTime.Value); } if (request.EndTime != null) { list = list.Where(u => u.CREATE_TIME <= request.EndTime.Value); } if (!string.IsNullOrWhiteSpace(request.SearchTxt)) { list = list.Where(u => u.SN.Contains(request.SearchTxt)); } if (!string.IsNullOrWhiteSpace(request.ClassResult)) { list = list.Where(u => u.Result == request.ClassResult); } if (request.IsOrderAsc) { list = list.OrderBy(u => u.ID); } else { list = list.OrderByDescending(u => u.ID); } request.TotalNum = list.Count(); if (request.PageSize > 0 && request.PageNum > 0) { pList = list.Skip(request.PageSize * (request.PageNum - 1)).Take(request.PageSize).ToList(); } else { pList = list.ToList(); } if (request.IsIncludeDetail) { pList.ForEach(p => { p.Details = context.P_PRODUCT_DETAIL.Where(u => u.PID == p.PID).ToList(); }); } } return pList; } public void UpdatePositionResult(P_PRODUCT_DETAIL detail) { if (detail == null) { CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Error, $"检测工位明细结果上传对象为空"); return; } try { using (var context = new M135DB()) { P_PRODUCT_DETAIL d = null; if (detail.ID > 0) { d = context.P_PRODUCT_DETAIL.FirstOrDefault(u => u.ID == detail.ID); } else { d = context.P_PRODUCT_DETAIL.OrderByDescending(u => u.ID).FirstOrDefault(u => u.PID == detail.PID && u.STATION_CODE == detail.STATION_CODE && u.PositionName == detail.PositionName); } if (d == null) { CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{detail.PID} 工位{detail.PositionName}检测明细未能在数据库中查询获取"); } else { if (string.IsNullOrWhiteSpace(d.SN) && !string.IsNullOrWhiteSpace(detail.SN)) { d.SN = detail.SN; } List specList = detail.ResultList.SelectMany(u => u.Specs).ToList(); if (detail.SpecList != null) { specList.AddRange(detail.SpecList); } List defectList = detail.ResultList.GetDefectDescList(); if (detail.DefectList != null) { defectList.AddRange(detail.DefectList); } d.IsDone = detail.IsDone; //取消补偿值,避免反序列化时重复执行补偿 specList.ForEach(s => { s.IsEnableCompensation = false; s.CompensationValue = new List() { 0,0}; }); d.FAIData = JsonConvert.SerializeObject(specList); d.DefectDesc = JsonConvert.SerializeObject(defectList); d.UPDATE_TIME = DateTime.Now; context.SaveChanges(); } } } catch (Exception ex) { CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{detail?.PID} 条码{detail?.SN} 工位{detail?.PositionName} 检测结果保存异常,{ex.GetExceptionMessage()}"); } } public P_PRODUCT QueryProductByBarcode(string sn) { try { using (var context = new M135DB()) { var p = context.P_PRODUCT.OrderByDescending(p => p.ID).FirstOrDefault(u => u.SN == sn); if (p != null) { //var details = context.P_PRODUCT_DETAIL.Where(u => u.PID == p.PID); //details.GroupBy(u => u.STATION_CODE).ToList().ForEach(u => //{ // u.ToList().GroupBy(m => m.PositionName).ToList().ForEach(c => // { // p.Details.Add(c.OrderByDescending(n => n.ID).FirstOrDefault()); // }); //}); p.Details = context.P_PRODUCT_DETAIL.Where(u => u.PID == p.PID).ToList(); } return p; } } catch (Exception ex) { CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"数据库根据条码{sn}获取产品信息异常,{ex.GetExceptionMessage()}"); } return null; } public P_PRODUCT QueryProductBySequence(string sequence) { try { using (var context = new M135DB()) { var p = context.P_PRODUCT.OrderByDescending(p => p.ID).FirstOrDefault(u => u.SEQUENCE == sequence); if (p != null) { //var details = context.P_PRODUCT_DETAIL.Where(u => u.PID == p.PID); //details.GroupBy(u => u.STATION_CODE).ToList().ForEach(u => //{ // u.ToList().GroupBy(m => m.PositionName).ToList().ForEach(c => // { // p.Details.Add(c.OrderByDescending(n => n.ID).FirstOrDefault()); // }); //}); p.Details = context.P_PRODUCT_DETAIL.Where(u => u.PID == p.PID).ToList(); } return p; } } catch (Exception ex) { CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"数据库根据序列号{sequence}获取产品信息异常,{ex.GetExceptionMessage()}"); } return null; } public P_PRODUCT QueryProductByPID(string pid) { try { using (var context = new M135DB()) { var p = context.P_PRODUCT.OrderByDescending(p => p.ID).FirstOrDefault(u => u.PID == pid); if (p != null) { //var details = context.P_PRODUCT_DETAIL.Where(u => u.PID == p.PID); //details.GroupBy(u => u.STATION_CODE).ToList().ForEach(u => //{ // u.ToList().GroupBy(m => m.PositionName).ToList().ForEach(c => // { // p.Details.Add(c.OrderByDescending(n => n.ID).FirstOrDefault()); // }); //}); p.Details = context.P_PRODUCT_DETAIL.Where(u => u.PID == p.PID).ToList(); } return p; } } catch (Exception ex) { CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"数据库根据条码{pid}获取产品信息异常,{ex.GetExceptionMessage()}"); } return null; } public void UpdateProductSN(string pid, string sn) { try { using (var context = new M135DB()) { var p = context.P_PRODUCT.OrderByDescending(p => p.ID).FirstOrDefault(u => u.PID == pid); var details = context.P_PRODUCT_DETAIL.Where(u => u.PID == pid).ToList(); DateTime dt = DateTime.Now; if (p != null) { p.SN = sn; p.UPDATE_TIME = dt; } if (details.Count > 0) { List latestDetail = new List(); details.GroupBy(u => u.STATION_CODE).ToList().ForEach(u => { u.ToList().GroupBy(m => m.PositionName).ToList().ForEach(c => { latestDetail.Add(c.OrderByDescending(n => n.ID).FirstOrDefault()); }); }); latestDetail.ForEach(d => { if (string.IsNullOrWhiteSpace(d.SN) && !string.IsNullOrWhiteSpace(sn)) { d.SN = sn; d.UPDATE_TIME = dt; } }); } context.SaveChanges(); } } catch (Exception ex) { CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{pid}更新条码{sn}时异常,{ex.GetExceptionMessage()}"); } } public void UpdateProductPID(string pid, string newsen,string newpid) { try { using (var context = new M135DB()) { var p = context.P_PRODUCT.OrderByDescending(p => p.ID).FirstOrDefault(u => u.PID == pid); var details = context.P_PRODUCT_DETAIL.Where(u => u.PID == pid).ToList(); DateTime dt = DateTime.Now; if (p != null) { p.PID = newpid; p.SEQUENCE = newsen; p.UPDATE_TIME = dt; } if (details.Count > 0) { List latestDetail = new List(); details.GroupBy(u => u.STATION_CODE).ToList().ForEach(u => { u.ToList().GroupBy(m => m.PositionName).ToList().ForEach(c => { latestDetail.Add(c.OrderByDescending(n => n.ID).FirstOrDefault()); }); }); latestDetail.ForEach(d => { //if (string.IsNullOrWhiteSpace(d.SN) && !string.IsNullOrWhiteSpace(newpid)) //{ d.PID = newpid; d.UPDATE_TIME = dt; //} }); } context.SaveChanges(); } } catch (Exception ex) { CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{pid}更新条码{newpid}时异常,{ex.GetExceptionMessage()}"); } } public void UpdateProductResult(int iD, string pid, string sn, string result) { try { using (var context = new M135DB()) { var p = context.P_PRODUCT.FirstOrDefault(u => u.ID == iD); p.Result = result; context.SaveChanges(); } } catch (Exception ex) { CommonLogger.LogAsync(DateTime.Now, EnumHelper.LogLevel.Exception, $"产品{pid} 条码{sn} 最终结果{result}上传失败,{ex.GetExceptionMessage()}"); } } public bool DeletOldData(DateTime timeLimit, int dataListCountOnce, out int deleteCount, out string msg, out bool isNoData) { deleteCount = 0; msg = ""; isNoData = false; try { using (var context = new M135DB()) { var pList = context.P_PRODUCT.Where(u => u.CREATE_TIME < timeLimit).Take(dataListCountOnce); if (!pList.Any()) { isNoData = true; return true; } var pidList = pList.Select(p => p.PID).ToList(); deleteCount = pidList.Count; var details = context.P_PRODUCT_DETAIL.Where(u => pidList.Contains(u.PID)); context.P_PRODUCT_DETAIL.RemoveRange(details); context.P_PRODUCT.RemoveRange(pList); context.SaveChanges(); } } catch (Exception ex) { msg = $"自动删除旧数据异常,{ex.GetExceptionMessage()}"; return false; } return true; } } public class Request_P_Product : BaseRequest { public bool IsIncludeDetail { get; set; } = false; public string ClassResult { get; set; } } }