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<P_PRODUCT, M135DB>
|
{
|
public bool NewProduct(P_PRODUCT p, List<P_PRODUCT_DETAIL> 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<P_PRODUCT_DETAIL> 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<P_PRODUCT> QueryProduct(Request_P_Product request)
|
{
|
List<P_PRODUCT> pList = new List<P_PRODUCT>();
|
using (var context = new M135DB())
|
{
|
IQueryable<P_PRODUCT> 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<ISpec> specList = detail.ResultList.SelectMany(u => u.Specs).ToList();
|
if (detail.SpecList != null)
|
{
|
specList.AddRange(detail.SpecList);
|
}
|
|
List<string> 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<double>() { 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<P_PRODUCT_DETAIL> latestDetail = new List<P_PRODUCT_DETAIL>();
|
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<P_PRODUCT_DETAIL> latestDetail = new List<P_PRODUCT_DETAIL>();
|
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; }
|
}
|
}
|