using MOKA_Factory_Tools.DAL;
using MOKA_Factory_Tools.Models;
using SXLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MOKA_Factory_Tools.BLL
{
public partial class NTFBLL
{
public NTFBLL(int NTFposion)
{
dalAMResult = new DAL_AMResult(NTFposion);
dalAMYields = new DAL_AMYields(NTFposion);
dalAMResultTR = new DAL_AMResult_TR(NTFposion);
dalAMYieldsTR = new DAL_AMYields_TR(NTFposion);
}
///
/// ""=异常,OncePass,NTF,ReadFial
///
public string ResultType = "";
private string _strLastSN = "";
protected readonly DAL_AMResult dalAMResult = null;// new DAL_AMResult();
protected readonly DAL_AMYields dalAMYields = null;//new DAL_AMYields();
protected readonly DAL_AMResult_TR dalAMResultTR = null;//new DAL_AMResult_TR();
protected readonly DAL_AMYields_TR dalAMYieldsTR = null;//new DAL_AMYields_TR();
///
/// 设置数据抄写结果;
///
/// 线体,UI输入
/// 默认为:DataBurning
///
/// 抄写结果:成功或失败
/// 抄写失败时的描述
///
public bool SetDataBuringResult(string strLine, string strStation, string strSN, string strOrder, string strDSN, bool bResult, string strLastSN, int nOrderType, string strErrMsg = "")
{
MaInfo maInfo;
_strLastSN = strLastSN;
DateTime dateNow = DateTime.Now;
// 通过SN获取MES服务器中记录的ODF、Model、Dissemination信息;
if (GMethod.GetMaInfo(strSN, strOrder, out maInfo, null))
{
// 1.通过SN查询出订单类型;
if (nOrderType == 1) // 量产;
{
AMResult aMResult = new AMResult();
// 测试日期;
string strTestDate = dateNow.ToString("yyyy-MM-dd");
// 测试完成时间;
string strTestTime = dateNow.ToString("yyyy-MM-dd HH:mm:ss");
#region 赋值model
aMResult.TestDate = dateNow.Date;
aMResult.Line = strLine;
aMResult.Station = strStation;
aMResult.DSN = strDSN;
aMResult.ODF = maInfo.ODF;
aMResult.Model = maInfo.Model;
aMResult.Dimension = maInfo.SIZE;
aMResult.TestHour = dateNow.Hour;
aMResult.TestTime = strTestTime;
aMResult.SN = strSN;
#endregion
if (IsRecordExist(aMResult))
{
if (!UpdateAMResults(aMResult, bResult, strErrMsg))
{
// 更新失败;
return false;
}
}
else
{
if (!AddAMResult(aMResult, bResult, strErrMsg))
{
// 更新失败;
return false;
}
}
// 更新统计结果;
if (!UpdateAMYields(aMResult, bResult, strErrMsg))
{
return false;
}
return true;
}
else if (nOrderType == 0) // 试产;
{
AMResult_TR aMResult = new AMResult_TR();
// 测试日期;
string strTestDate = dateNow.ToString("yyyy-MM-dd");
// 测试完成时间;
string strTestTime = dateNow.ToString("yyyy-MM-dd HH:mm:ss");
#region 赋值model
aMResult.TestDate = dateNow.Date;
aMResult.Line = strLine;
aMResult.Station = strStation;
aMResult.DSN = strDSN;
aMResult.ODF = maInfo.ODF;
aMResult.Model = maInfo.Model;
aMResult.Dimension = maInfo.SIZE;
aMResult.TestHour = dateNow.Hour;
aMResult.TestTime = strTestTime;
aMResult.SN = strSN;
#endregion
if (IsRecordExist(aMResult))
{
if (!UpdateAMResults(aMResult, bResult, strErrMsg))
{
// 更新失败;
return false;
}
}
else
{
if (!AddAMResult(aMResult, bResult, strErrMsg))
{
// 更新失败;
return false;
}
}
// 更新统计结果;
if (!UpdateAMYields(aMResult, bResult, strErrMsg))
{
return false;
}
return true;
}
}
return false;
}
#region ------量产NTF------;
public bool IsRecordExist(AMResult model)
{
return dalAMResult.Exists(string.Format("Station='{0}' and SN='{1}'", model.Station, model.SN));
}
///
/// 新增记录;
///
///
///
public bool AddAMResult(AMResult model, bool TestResult, string strErrMsg)
{
// 赋新值;
model.Test01 = model.FinalTest = TestResult ? "PASS" : "FAIL";
model.Test02 = "null";
model.ReDo = "0";
ResultType = model.ResultType = TestResult ? "OncePass" : "RealFail";
if (!TestResult)
model.ErrorMsg = strErrMsg;
return dalAMResult.Add(model);
}
public bool UpdateAMResults(AMResult model, bool TestResult, string strErrMsg)
{
// 先获取ReDo="0"的记录;
AMResult redo0Model = dalAMResult.GetModel(string.Format("Station='{0}' and SN='{1}' and ReDo='{2}'", model.Station, model.SN, "0"));
if (_strLastSN == model.SN)
{// 连续抄写数据,更新ReDo="0"的记录;
Log.WriteInfoLog(string.Format("上一次SN={0} 与当前SN={1} 相同,只更新数据", _strLastSN, model.SN));
if (!UpdateReDo0AMResult(redo0Model, TestResult, strErrMsg))
{
// 更新失败;
Log.WriteInfoLog(string.Format("AMResult更新SN={0},Station={1},TestTime={2},ReDo={3} 失败", redo0Model.SN, redo0Model.Station, redo0Model.TestTime, redo0Model.ReDo));
return false;
}
}
else
{// 将原ReDo="0"更新为ReDo=Max(ReDo)+1,并新增ReDo="0"的记录;
int maxReDo = dalAMResult.GetMaxID("convert(int,ReDo)", string.Format("Station='{0}' and SN='{1}'", model.Station, model.SN));
redo0Model.ReDo = maxReDo.ToString();
if (!dalAMResult.Update(redo0Model, string.Format("Station='{0}' and SN='{1}' and ReDo='{2}'", redo0Model.Station, redo0Model.SN, "0")))
{
// 更新失败;
Log.WriteInfoLog(string.Format("AMResult更新SN={0},Station={1},TestTime={2},ReDo={3} 失败", redo0Model.SN, redo0Model.Station, redo0Model.TestTime, redo0Model.ReDo));
return false;
}
// 新增ReDo=0记录;
if (!AddAMResult(model, TestResult, strErrMsg))
{
// 添加失败;
Log.WriteInfoLog(string.Format("AMResult新增SN={0},Station={1},TestTime={2},ReDo={3} 失败", model.SN, model.Station, model.TestTime, model.ReDo));
return false;
}
}
return true;
}
public bool UpdateReDo0AMResult(AMResult redo0Model, bool TestResult, string strErrMsg)
{
#region 测试第2次;
if (redo0Model.Test01.ToLower() == "pass" && redo0Model.Test02.ToLower() == "null" && redo0Model.FinalTest.ToLower() == "pass")
{// 1.resulttype=oncepass;
if (TestResult)
{
redo0Model.Test02 = "PASS";
redo0Model.FinalTest = "PASS";
redo0Model.ResultType = "OncePass";
}
else
{
redo0Model.Test02 = "FAIL";
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
else if (redo0Model.Test01.ToLower() == "fail" && redo0Model.Test02.ToLower() == "null" && redo0Model.FinalTest.ToLower() == "fail")
{// 2.resulttype=realfail;
if (TestResult)
{
redo0Model.Test02 = "PASS";
redo0Model.FinalTest = "PASS";
redo0Model.ResultType = "NTF";
}
else
{
// 连续2次Fail,锁定该SN不允许再测试.
redo0Model.Test02 = "FAIL";
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
#endregion
#region 测试第3次.
else if (redo0Model.Test01.ToLower() == "pass" && redo0Model.Test02.ToLower() == "fail" && redo0Model.FinalTest.ToLower() == "fail")
{// 3.resulttype=realfail;
if (TestResult)
{
//redo0Model.Test02 = "FAIL";
redo0Model.FinalTest = "PASS";
redo0Model.ResultType = "NTF";
}
else
{
// 连续2次Fail,锁定该SN不允许再测试.
//redo0Model.Test02 = "FAIL";
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
else if (redo0Model.Test01.ToLower() == "pass" && redo0Model.Test02.ToLower() == "pass" && redo0Model.FinalTest.ToLower() == "pass")
{// 4.resulttype=oncepass;
if (TestResult)
{
//redo0Model.Test02 = "PASS";
redo0Model.FinalTest = "PASS";
redo0Model.ResultType = "OncePass";
}
else
{
//redo0Model.Test02 = "PASS";
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
#region 已经累计出现2次fail了,不允许继续测试,也不允许修改记录;
else if (redo0Model.Test01.ToLower() == "fail" && redo0Model.Test02.ToLower() == "fail" && redo0Model.FinalTest.ToLower() == "fail")
{// 5.resulttype=realfail; 已经累计出现2次fail了,不允许继续测试,也不允许修改记录;
Log.WriteInfoLog(string.Format("5.resulttype=realfail; Test01={0},Test02={1},已经累计出现2次fail了,不允许继续测试,也不允许修改记录", redo0Model.Test01, redo0Model.Test02));
}
#endregion
else if (redo0Model.Test01.ToLower() == "fail" && redo0Model.Test02.ToLower() == "pass" && redo0Model.FinalTest.ToLower() == "pass")
{// 4.resulttype=ntf;
if (TestResult)
{
//redo0Model.Test02 = "PASS";
redo0Model.FinalTest = "PASS";
redo0Model.ResultType = "NTF";
}
else
{
//redo0Model.Test02 = "PASS";
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
#endregion
if (!TestResult)
redo0Model.ErrorMsg = strErrMsg;
// 更新测试时间;
DateTime dateNow = DateTime.Now;
redo0Model.TestDate = dateNow.Date;
redo0Model.TestTime = dateNow.ToString("yyyy-MM-dd HH:mm:ss");
redo0Model.TestHour = dateNow.Hour;
ResultType = redo0Model.ResultType;
return dalAMResult.Update(redo0Model, string.Format("Station='{0}' and SN='{1}' and ReDo='{2}'", redo0Model.Station, redo0Model.SN, redo0Model.ReDo));
}
public bool UpdateAMYields(AMResult model, bool TestResult, string strErrMsg)
{
bool IsNewRecord = false;
// 查询出统计的记录;
AMYields yields = dalAMYields.GetModel(model.Line, model.Station, model.ODF, model.TestDate, model.TestHour);
// 根据当前model所在的Line、Station、ODF、Model、TestDate、TestHour,统计该TestHour内的数据;
List mResults = dalAMResult.GetModelList(model.Line, model.Station, model.ODF, model.TestDate, model.TestHour);
// 查询每小时统计值;
HourlyResultData hourlydata = dalAMResult.GetHourlyResultData(model.Line, model.Station, model.ODF, model.TestDate, model.TestHour);
if (yields == null || yields.IsValueEmpty())
{// 添加新记录;
IsNewRecord = true;
if (yields == null)
yields = new AMYields();
yields.TestDate = model.TestDate;
yields.TestHour = model.TestHour;
yields.Line = model.Line;
yields.Station = model.Station;
yields.ODF = model.ODF;
yields.Dimension = model.Dimension;
yields.Model = model.Model;
}
yields.Total = hourlydata.TotalAllCount;
yields.OncePass = hourlydata.OncePassAllCount;
//yields.TwiceFail = hourlydata.TwiceFailCount;
yields.NTF = hourlydata.NTFAllCount;
yields.RealFail = hourlydata.RealFailCount;
yields.NTF_SN = hourlydata.NTFSN;
yields.FailDSN = hourlydata.FailDSN;
// 计算百分比;
try
{
int totalAll = int.Parse(hourlydata.TotalAllCount);
int totalZero = int.Parse(hourlydata.TotalZeroCount);
int oncepassAll = int.Parse(hourlydata.OncePassAllCount);
int oncepassZero = int.Parse(hourlydata.OncePassZeroCount);
int ntfAll = int.Parse(hourlydata.NTFAllCount);
int ntfZero = int.Parse(hourlydata.NTFZeroCount);
int realfailCount = int.Parse(hourlydata.RealFailCount);
// 统计合格率;
yields.FPY = (oncepassAll / (double)totalAll).ToString("P");
yields.SPY = ((oncepassAll + ntfAll) / (double)totalAll).ToString("P");
yields.RPY = ((oncepassAll + ntfAll) / (double)totalAll).ToString("P");
yields.YieldRate = ((oncepassZero + ntfZero) / (double)totalZero).ToString("P");
}
catch
{
return false;
}
return IsNewRecord ? dalAMYields.Add(yields) : dalAMYields.Update(yields);
}
#endregion
#region ------试产NTF------
///
/// 记录是否存在;
///
///
///
public bool IsRecordExist(AMResult_TR model)
{
// 如果存在重流的话,可能不会在原来的Line上,可以流到其他Line。
// dalAMResult.Exists(string.Format("Station='{0}' and SN='{1}' and Line = '{2}'", model.Station, model.SN, model.Line));
return dalAMResultTR.Exists(string.Format("Station='{0}' and SN='{1}'", model.Station, model.SN));
}
///
/// 新增记录;
///
///
///
public bool AddAMResult(AMResult_TR model, bool TestResult, string strErrMsg)
{
// 赋新值;
model.Test01 = model.FinalTest = TestResult ? "PASS" : "FAIL";
model.Test02 = "null";
model.Test03 = "null";
model.ReDo = "0";
ResultType = model.ResultType = TestResult ? "OncePass" : "RealFail";
if (!TestResult)
model.ErrorMsg = strErrMsg;
return dalAMResultTR.Add(model);
}
public bool UpdateAMResults(AMResult_TR model, bool TestResult, string strErrMsg)
{
// 先获取ReDo="0"的记录;
AMResult_TR redo0Model = dalAMResultTR.GetModel(string.Format("Station='{0}' and SN='{1}' and ReDo='{2}'", model.Station, model.SN, "0"));
if (_strLastSN == model.SN)
{// 连接抄写数据,更新ReDo="0"的记录;
Log.WriteInfoLog(string.Format("上一次SN={0} 与当前SN={1} 相同,只更新数据", _strLastSN, model.SN));
if (!UpdateReDo0AMResult(redo0Model, TestResult, strErrMsg))
{
// 更新失败;
Log.WriteInfoLog(string.Format("AMResult更新SN={0},Station={1},TestTime={2},ReDo={3} 失败", redo0Model.SN, redo0Model.Station, redo0Model.TestTime, redo0Model.ReDo));
return false;
}
}
else
{// 将原ReDo="0"更新为ReDo=Max(ReDo)+1,并新增ReDo="0"的记录;
int maxReDo = dalAMResultTR.GetMaxID("convert(int,ReDo)", string.Format("Station='{0}' and SN='{1}'", model.Station, model.SN));
redo0Model.ReDo = maxReDo.ToString();
if (!dalAMResultTR.Update(redo0Model, string.Format("Station='{0}' and SN='{1}' and ReDo='{2}'", redo0Model.Station, redo0Model.SN, "0")))
{
// 更新失败;
Log.WriteInfoLog(string.Format("AMResult更新SN={0},Station={1},TestTime={2},ReDo={3} 失败", redo0Model.SN, redo0Model.Station, redo0Model.TestTime, redo0Model.ReDo));
return false;
}
// 新增ReDo=0记录;
if (!AddAMResult(model, TestResult, strErrMsg))
{
// 添加失败;
Log.WriteInfoLog(string.Format("AMResult新增SN={0},Station={1},TestTime={2},ReDo={3} 失败", model.SN, model.Station, model.TestTime, model.ReDo));
return false;
}
}
return true;
}
public bool UpdateReDo0AMResult(AMResult_TR redo0Model, bool TestResult, string strErrMsg)
{
#region 测试第2次
if (redo0Model.Test02.ToLower() == "null" && redo0Model.Test03.ToLower() == "null")
{
if (redo0Model.Test01.ToLower() == "pass")
{
if (TestResult)
{
redo0Model.Test02 = "PASS";
redo0Model.FinalTest = "PASS";
redo0Model.ResultType = "OncePass";
}
else
{
redo0Model.Test02 = "FAIL";
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
else if (redo0Model.Test01.ToLower() == "fail")
{
if (TestResult)
{
redo0Model.Test02 = "PASS";
redo0Model.FinalTest = "PASS";
redo0Model.ResultType = "RealFail";
}
else
{
redo0Model.Test02 = "FAIL";
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
}
#endregion
#region 测试第3次
else if (redo0Model.Test02.ToLower() != "null" && redo0Model.Test03.ToLower() == "null")
{
if (redo0Model.Test01.ToLower().Equals("pass") && redo0Model.Test02.ToLower().Equals("pass"))
{
if (TestResult)
{
redo0Model.Test03 = "PASS";
redo0Model.FinalTest = "PASS";
redo0Model.ResultType = "OncePass";
}
else
{
redo0Model.Test03 = "FAIL";
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
else if (redo0Model.Test01.ToLower().Equals("pass") && redo0Model.Test02.ToLower().Equals("fail"))
{
if (TestResult)
{
redo0Model.Test03 = "PASS";
redo0Model.FinalTest = "PASS";
redo0Model.ResultType = "NTF";
}
else
{
redo0Model.Test03 = "FAIL";
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
else if (redo0Model.Test01.ToLower().Equals("fail") && redo0Model.Test02.ToLower().Equals("pass"))
{
if (TestResult)
{
redo0Model.Test03 = "PASS";
redo0Model.FinalTest = "PASS";
redo0Model.ResultType = "NTF";
}
else
{
redo0Model.Test03 = "FAIL";
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
else if (redo0Model.Test01.ToLower().Equals("fail") && redo0Model.Test02.ToLower().Equals("fail"))
{
Log.WriteInfoLog("连接2次Fail,测试锁定");
}
}
#endregion
#region 测试第4次;
else if (redo0Model.Test03.ToLower() != "null")
{
if (redo0Model.FinalTest.ToLower() == "pass" && redo0Model.ResultType.ToLower() == "ntf")
{
if (!TestResult)
{
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
else if (redo0Model.FinalTest.ToLower() == "pass" && redo0Model.ResultType.ToLower() == "oncepass")
{// 异常测试;
if (!TestResult)
{
redo0Model.FinalTest = "FAIL";
redo0Model.ResultType = "RealFail";
}
}
else
{
Log.WriteErrorLog("异常测试,超过3次测试次数");
}
}
#endregion
if (!TestResult)
redo0Model.ErrorMsg = strErrMsg;
// 更新测试时间;
DateTime dateNow = DateTime.Now;
redo0Model.TestDate = dateNow.Date;
redo0Model.TestTime = dateNow.ToString("yyyy-MM-dd HH:mm:ss");
redo0Model.TestHour = dateNow.Hour;
ResultType = redo0Model.ResultType;
return dalAMResultTR.Update(redo0Model, string.Format("Station='{0}' and SN='{1}' and ReDo='{2}'", redo0Model.Station, redo0Model.SN, redo0Model.ReDo));
}
public bool UpdateAMYields(AMResult_TR model, bool TestResult, string strErrMsg)
{
bool IsNewRecord = false;
// 查询出统计的记录;
AMYields_TR yields = dalAMYieldsTR.GetModel(model.Line, model.Station, model.ODF, model.TestDate, model.TestHour);
// 根据当前model所在的Line、Station、ODF、Model、TestDate、TestHour,统计该TestHour内的数据;
List mResults = dalAMResultTR.GetModelList(model.Line, model.Station, model.ODF, model.TestDate, model.TestHour);
// 查询每小时统计值;
HourlyResultTRData hourlydata = dalAMResultTR.GetHourlyResultData(model.Line, model.Station, model.ODF, model.TestDate, model.TestHour);
if (yields == null || yields.IsValueEmpty())
{// 添加新记录;
IsNewRecord = true;
if (yields == null)
yields = new AMYields_TR();
yields.TestDate = model.TestDate;
yields.TestHour = model.TestHour;
yields.Line = model.Line;
yields.Station = model.Station;
yields.ODF = model.ODF;
yields.Dimension = model.Dimension;
yields.Model = model.Model;
}
yields.Total = hourlydata.TotalAllCount;
yields.OncePass = hourlydata.OncePassAllCount;
//yields.TwiceFail = hourlydata.TwiceFailCount;
yields.NTF = hourlydata.NTFAllCount;
yields.RealFail = hourlydata.RealFailCount;
yields.NTF_SN = hourlydata.NTFSN;
yields.FailDSN = hourlydata.FailDSN;
// 计算百分比;
try
{
int totalAll = int.Parse(hourlydata.TotalAllCount);
int totalZero = int.Parse(hourlydata.TotalZeroCount);
int oncepassAll = int.Parse(hourlydata.OncePassAllCount);
int oncepassZero = int.Parse(hourlydata.OncePassZeroCount);
int ntfAll = int.Parse(hourlydata.NTFAllCount);
int ntfZero = int.Parse(hourlydata.NTFZeroCount);
int realfailCount = int.Parse(hourlydata.RealFailCount);
// 统计合格率;
yields.FPY = (oncepassAll / (double)totalAll).ToString("P");
yields.SPY = ((oncepassAll + ntfAll) / (double)totalAll).ToString("P");
yields.RPY = ((oncepassAll + ntfAll) / (double)totalAll).ToString("P");
yields.YieldRate = ((oncepassZero + ntfZero) / (double)totalZero).ToString("P");
}
catch
{
return false;
}
return IsNewRecord ? dalAMYieldsTR.Add(yields) : dalAMYieldsTR.Update(yields);
}
#endregion
}
}