|
@@ -0,0 +1,266 @@
|
|
|
+using MOKA_Factory_Tools.DAL;
|
|
|
+using MOKA_Factory_Tools.Models;
|
|
|
+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
|
|
|
+ {
|
|
|
+ private static string strLastSN = CommonMethod.ReadProfileString("MOKAFactoryTools", "LastGSN", "");
|
|
|
+ protected readonly DAL_AMResult dalAMResult = new DAL_AMResult();
|
|
|
+ protected readonly DAL_AMYields dalAMYields = new DAL_AMYields();
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 设置数据抄写结果;
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="strLine">线体,UI输入</param>
|
|
|
+ /// <param name="strStation">默认为:DataBurning</param>
|
|
|
+ /// <param name="strSN"></param>
|
|
|
+ /// <param name="bResult">抄写结果:成功或失败</param>
|
|
|
+ /// <param name="strErrMsg">抄写失败时的描述</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public bool SetDataBuringResult(string strLine, string strStation, string strSN, string strDSN, bool bResult, string strErrMsg)
|
|
|
+ {
|
|
|
+ MaInfo maInfo;
|
|
|
+ DateTime dateNow = DateTime.Now;
|
|
|
+ AMResult aMResult = new AMResult();
|
|
|
+ // 通过SN获取MES服务器中记录的ODF、Model、Dissemination信息;
|
|
|
+ if ( CommonMethod.GetMaInfo(strSN, out maInfo, null) )
|
|
|
+ {
|
|
|
+ // 测试日期;
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ strLastSN = strSN;
|
|
|
+ CommonMethod.WriteProfileString("MOKAFactoryTools", "LastGSN", strSN);
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 记录是否存在;
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="model"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public bool IsRecordExist(AMResult model)
|
|
|
+ {
|
|
|
+ // 如果存在重流的话,可能不会在原来的Line上,可以流到其他Line。
|
|
|
+ // dalAMResult.Exists(string.Format("Station='{0}' and SN='{1}' and Line = '{2}'", model.Station, model.SN, model.Line));
|
|
|
+ return dalAMResult.Exists(string.Format("Station='{0}' and SN='{1}'", model.Station, model.SN));
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 新增记录;
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="model"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public bool AddAMResult(AMResult model, bool TestResult, string strErrMsg)
|
|
|
+ {
|
|
|
+ // 赋新值;
|
|
|
+ model.Test01 = model.FinalTest = TestResult ? "PASS" : "FAIL";
|
|
|
+ model.Test02 = "NULL";
|
|
|
+ model.ReDo = "0";
|
|
|
+ model.ResultType = TestResult ? "OncePass" : "OnceFail";
|
|
|
+ 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"的记录;
|
|
|
+ if ( !UpdateReDo0AMResult(redo0Model, TestResult, strErrMsg) )
|
|
|
+ {
|
|
|
+ // 更新失败;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {// 将原ReDo="0"更新为ReDo=Max(ReDo)+1,并新增ReDo="0"的记录;
|
|
|
+ int maxReDo = dalAMResult.GetMaxID("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")) )
|
|
|
+ {
|
|
|
+ // 更新失败;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新增ReDo=0记录;
|
|
|
+ if ( !AddAMResult(model, TestResult, strErrMsg) )
|
|
|
+ {
|
|
|
+ // 添加失败;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public bool UpdateReDo0AMResult(AMResult redo0Model, bool TestResult, string strErrMsg)
|
|
|
+ {
|
|
|
+ if (redo0Model.Test01 == "PASS" && redo0Model.Test02 == "NULL" && redo0Model.FinalTest == "PASS")
|
|
|
+ {// OncePass 的情况;
|
|
|
+ if (TestResult)
|
|
|
+ {
|
|
|
+ redo0Model.Test02 = "PASS";
|
|
|
+ redo0Model.ResultType = "FinalPass";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ redo0Model.Test02 = "FAIL";
|
|
|
+ redo0Model.FinalTest = "FAIL";
|
|
|
+ redo0Model.ResultType = "FinalFail";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (redo0Model.Test01 == "FAIL" && redo0Model.Test02 == "NULL" && redo0Model.FinalTest == "FAIL")
|
|
|
+ {// OnceFail 的情况;
|
|
|
+ if (TestResult)
|
|
|
+ {
|
|
|
+ redo0Model.Test02 = "PASS";
|
|
|
+ redo0Model.FinalTest = "PASS";
|
|
|
+ redo0Model.ResultType = "NTF";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ redo0Model.Test02 = "FAIL";
|
|
|
+ redo0Model.FinalTest = "FAIL";
|
|
|
+ redo0Model.ResultType = "TwiceFail";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (redo0Model.Test01 == "FAIL" && redo0Model.Test02 == "PASS" && redo0Model.FinalTest == "PASS")
|
|
|
+ {// NTF 的情况;
|
|
|
+ if (TestResult)
|
|
|
+ {
|
|
|
+ redo0Model.FinalTest = "PASS";
|
|
|
+ redo0Model.ResultType = "NTF";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ redo0Model.FinalTest = "FAIL";
|
|
|
+ redo0Model.ResultType = "FinalFail";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (TestResult)
|
|
|
+ {
|
|
|
+ redo0Model.FinalTest = "PASS";
|
|
|
+ redo0Model.ResultType = "FinalPass";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ redo0Model.FinalTest = "FAIL";
|
|
|
+ redo0Model.ResultType = "FinalFail";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!TestResult)
|
|
|
+ redo0Model.ErrorMsg = strErrMsg;
|
|
|
+
|
|
|
+ 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<AMResult> 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.TotalCount;
|
|
|
+ yields.OncePass = hourlydata.OncePassCount;
|
|
|
+ yields.TwiceFail = hourlydata.TwiceFailCount;
|
|
|
+ yields.NTF = hourlydata.NTFCount;
|
|
|
+ yields.RealFail = hourlydata.FinalFailCount; // hourlydata.RealFailCount;
|
|
|
+ yields.NTF_SN = hourlydata.NTFSN;
|
|
|
+ yields.FailDSN = hourlydata.FailDSN;
|
|
|
+ // 计算百分比;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ int total = int.Parse(yields.Total);
|
|
|
+ int realtotal = int.Parse(hourlydata.RealTotalCount);
|
|
|
+ int oncepassCount = int.Parse(yields.OncePass);
|
|
|
+ int twicefailCount = int.Parse(yields.TwiceFail);
|
|
|
+ int ntfCount = int.Parse(yields.NTF);
|
|
|
+ int realfailCount = int.Parse(yields.RealFail);
|
|
|
+ int realpassCount = int.Parse(hourlydata.RealPassCount);
|
|
|
+ int finalpassCount = int.Parse(hourlydata.FinalPassCount);
|
|
|
+ int finalfailCount = int.Parse(hourlydata.FinalFailCount);
|
|
|
+ // 统计合格率;
|
|
|
+ yields.FPY = (oncepassCount / (double)total).ToString("P");
|
|
|
+ yields.SPY = (oncepassCount + ntfCount / (double)total).ToString("P");
|
|
|
+ yields.RPY = (finalpassCount / (double)total).ToString("P");
|
|
|
+ yields.YieldRate = (realpassCount / (double)realtotal).ToString("P");
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return IsNewRecord ? dalAMYields.Add(yields) : dalAMYields.Update(yields);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|