浏览代码

NTF功能初步完成。

sat23 3 年之前
父节点
当前提交
b93f8485b0
共有 7 个文件被更改,包括 1150 次插入329 次删除
  1. 487 84
      BLL/NTFBLL.cs
  2. 94 0
      Business/CommonMethod.cs
  3. 269 20
      DAL/DAL_AMResult.cs
  4. 170 0
      DAL/DAL_AMYields.cs
  5. 54 11
      Models/AMResult.cs
  6. 36 0
      Models/AMYields.cs
  7. 40 214
      Views/OperationPanel.cs

+ 487 - 84
BLL/NTFBLL.cs

@@ -11,10 +11,21 @@ namespace MOKA_Factory_Tools.BLL
 {
     public partial class NTFBLL
     {
+        /// <summary>
+        /// ""=异常,OncePass,NTF,ReadFial
+        /// </summary>
+        public string ResultType = "";
+        /// <summary>
+        /// 订单类型:0=试产订单、1=量产订单;
+        /// </summary>
+        public static int nCurOrderType;
         private static string strLastSN = CommonMethod.ReadProfileString("MOKAFactoryTools", "LastGSN", "");
+        // 连续测试中累计失败的次数
+        private static int nSNCount = Convert.ToInt32(CommonMethod.ReadProfileString("MOKAFactoryTools", "GFailCount", "0"));
         protected readonly DAL_AMResult dalAMResult = new DAL_AMResult();
         protected readonly DAL_AMYields dalAMYields = new DAL_AMYields();
-
+        protected readonly DAL_AMResult_TR dalAMResultTR = new DAL_AMResult_TR();
+        protected readonly DAL_AMYields_TR dalAMYieldsTR = new DAL_AMYields_TR();
         /// <summary>
         /// 设置数据抄写结果;
         /// </summary>
@@ -24,75 +35,162 @@ namespace MOKA_Factory_Tools.BLL
         /// <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 = "")
+        public bool SetDataBuringResult(string strLine, string strStation, string strSN, string strDSN, bool bResult, int nOrderType, string strErrMsg = "")
         {
-            return false;
             MaInfo maInfo;
             DateTime dateNow = DateTime.Now;
-            AMResult aMResult = new AMResult();            
             // 通过SN获取MES服务器中记录的ODF、Model、Dissemination信息;            
-            if ( CommonMethod.GetMaInfo(strSN, out maInfo, null) )
+            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
+                nCurOrderType = nOrderType;
+                // 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");
 
-                Log.WriteInfoLog(string.Format("上一次SN={0},当前SN={1}", strLastSN, aMResult.SN));
+                    #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) )
+                    Log.WriteInfoLog(string.Format("上一次SN={0},当前SN={1}", strLastSN, aMResult.SN));
+
+                    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;
                     }
                 }
-                else
+                else if (nOrderType == 0)   // 试产;
                 {
-                    if (!AddAMResult(aMResult, bResult, strErrMsg))
+                    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
+
+                    Log.WriteInfoLog(string.Format("上一次SN={0},当前SN={1}", strLastSN, aMResult.SN));
+
+                    if (IsRecordExist(aMResult))
                     {
-                        // 更新失败;
-                        return false;
+                        if (!UpdateAMResults(aMResult, bResult, strErrMsg))
+                        {
+                            // 更新失败;
+                            return false;
+                        }
+                    }
+                    else
+                    {
+                        if (!AddAMResult(aMResult, bResult, strErrMsg))
+                        {
+                            // 更新失败;
+                            return false;
+                        }
                     }
-                }
 
-                // 更新统计结果;
-                if (!UpdateAMYields(aMResult, bResult, strErrMsg))
-                {
-                    return false;
+                    // 更新统计结果;
+                    if (!UpdateAMYields(aMResult, bResult, strErrMsg))
+                    {
+                        return false;
+                    }
                 }
-
-                strLastSN = strSN;
-                CommonMethod.WriteProfileString("MOKAFactoryTools", "LastGSN", strSN);
             }
 
             return false;
         }
 
+        #region ------量产NTF------;
+        public bool IsRecordExist(AMResult model)
+        {
+            return dalAMResult.Exists(string.Format("Station='{0}' and SN='{1}'", model.Station, model.SN));
+        }
+
         /// <summary>
-        /// 记录是否存在;
+        /// 查询记录是否存在,不存在返回0,存在且没有累计2次出现fail返回1否则返回2;
+        /// 返回2的,不允许再测试;
         /// </summary>
         /// <param name="model"></param>
         /// <returns></returns>
-        public bool IsRecordExist(AMResult model)
+        public int IsRecordExist2(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));
+            if (!dalAMResult.Exists(string.Format("Station='{0}' and SN='{1}'", model.Station, model.SN)))
+                return 0;
+
+            // 上次失败SN;
+            string strLastSN = CommonMethod.ReadProfileString("MOKAFactoryTools", "LastGSN", "");
+            // 连续测试中累计失败的次数;
+            int nSNCount = Convert.ToInt32(CommonMethod.ReadProfileString("MOKAFactoryTools", "GFailCount", "0"));
+            if (strLastSN.Equals(model.SN, StringComparison.OrdinalIgnoreCase))
+            {
+                #region 5种累计出现2次fail的,不允许再测试;
+                if (model.Test01.ToLower() == "fail" && model.Test02.ToLower() == "fail" && model.FinalTest.ToLower() == "fail" && nSNCount == 2)
+                    return 2;
+
+                // 失败3次以上;
+                if (nSNCount > 2)
+                {
+                    if (model.Test01.ToLower() == "pass" && model.Test02.ToLower() == "fail" && model.FinalTest.ToLower() == "fail")
+                        return 2;
+
+                    if (model.Test01.ToLower() == "fail" && model.Test02.ToLower() == "pass" && model.FinalTest.ToLower() == "fail")
+                        return 2;
+
+                    if (model.Test01.ToLower() == "fail" && model.Test02.ToLower() == "fail" && model.FinalTest.ToLower() == "pass")
+                        return 2;
+
+                    if (model.Test01.ToLower() == "fail" && model.Test02.ToLower() == "fail" && model.FinalTest.ToLower() == "fail")
+                        return 2;
+                }
+                #endregion
+            }
+            else
+            {
+                // 重流SN,当新机处理;
+            }
+
+            return 1;
         }
 
         /// <summary>
@@ -106,7 +204,7 @@ namespace MOKA_Factory_Tools.BLL
             model.Test01 = model.FinalTest = TestResult ? "PASS" : "FAIL";
             model.Test02 = "NULL";
             model.ReDo = "0";
-            model.ResultType = TestResult ? "OncePass" : "OnceFail";
+            ResultType = model.ResultType = TestResult ? "OncePass" : "RealFail";
             if (!TestResult)
                 model.ErrorMsg = strErrMsg;
             return dalAMResult.Add(model);
@@ -116,10 +214,10 @@ namespace MOKA_Factory_Tools.BLL
         {
             // 先获取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 (strLastSN == model.SN)
+            {// 连抄写数据,更新ReDo="0"的记录;
                 Log.WriteInfoLog(string.Format("上一次SN={0} 与当前SN={1} 相同,只更新数据", strLastSN, model.SN));
-                if ( !UpdateReDo0AMResult(redo0Model, TestResult, strErrMsg) )
+                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));
@@ -130,7 +228,7 @@ namespace MOKA_Factory_Tools.BLL
             {// 将原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")) )
+                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));
@@ -138,7 +236,7 @@ namespace MOKA_Factory_Tools.BLL
                 }
 
                 // 新增ReDo=0记录;
-                if ( !AddAMResult(model, TestResult, strErrMsg) )
+                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));
@@ -151,22 +249,24 @@ namespace MOKA_Factory_Tools.BLL
 
         public bool UpdateReDo0AMResult(AMResult redo0Model, bool TestResult, string strErrMsg)
         {
-            if (redo0Model.Test01 == "PASS" && redo0Model.Test02 == "NULL" && redo0Model.FinalTest == "PASS")
-            {// OncePass 的情况;
+            #region 测试第2次;
+            if (redo0Model.Test01.ToLower() == "pass" && redo0Model.Test02.ToLower() == "null" && redo0Model.FinalTest.ToLower() == "pass")
+            {// 1.resulttype=oncepass;
                 if (TestResult)
                 {
                     redo0Model.Test02 = "PASS";
-                    redo0Model.ResultType = "FinalPass";
+                    redo0Model.FinalTest = "PASS";
+                    redo0Model.ResultType = "OncePass";
                 }
                 else
                 {
                     redo0Model.Test02 = "FAIL";
                     redo0Model.FinalTest = "FAIL";
-                    redo0Model.ResultType = "FinalFail";
+                    redo0Model.ResultType = "RealFail";
                 }
-            }
-            else if (redo0Model.Test01 == "FAIL" && redo0Model.Test02 == "NULL" && redo0Model.FinalTest == "FAIL")
-            {// OnceFail 的情况;
+            } 
+            else if (redo0Model.Test01.ToLower() == "fail" && redo0Model.Test02.ToLower() == "null" && redo0Model.FinalTest.ToLower() == "fail")
+            {// 2.resulttype=realfail;
                 if (TestResult)
                 {
                     redo0Model.Test02 = "PASS";
@@ -175,41 +275,75 @@ namespace MOKA_Factory_Tools.BLL
                 }
                 else
                 {
+                    // 连续2次Fail,锁定该SN不允许再测试.
                     redo0Model.Test02 = "FAIL";
                     redo0Model.FinalTest = "FAIL";
-                    redo0Model.ResultType = "TwiceFail";
+                    redo0Model.ResultType = "RealFail";
                 }
             }
-            else if (redo0Model.Test01 == "FAIL" && redo0Model.Test02 == "PASS" && (redo0Model.FinalTest == "PASS" || redo0Model.FinalTest == "FAIL"))
-            {// NTF + FinalFail 的情况;
+            #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 = "FinalFail";
+                    redo0Model.ResultType = "RealFail";
                 }
             }
-            else 
-            {
+
+            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 = "FinalPass";
+                    redo0Model.ResultType = "OncePass";
                 }
                 else
                 {
+                    //redo0Model.Test02 = "PASS";
                     redo0Model.FinalTest = "FAIL";
-                    redo0Model.ResultType = "FinalFail";
+                    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;
 
+            ResultType = redo0Model.ResultType;
             return dalAMResult.Update(redo0Model, string.Format("Station='{0}' and SN='{1}' and ReDo='{2}'", redo0Model.Station, redo0Model.SN, redo0Model.ReDo));
         }
 
@@ -223,7 +357,7 @@ namespace MOKA_Factory_Tools.BLL
             // 查询每小时统计值;
             HourlyResultData hourlydata = dalAMResult.GetHourlyResultData(model.Line, model.Station, model.ODF, model.TestDate, model.TestHour);
 
-            if ( yields == null || yields.IsValueEmpty() )
+            if (yields == null || yields.IsValueEmpty())
             {// 添加新记录;
                 IsNewRecord = true;
                 if (yields == null)
@@ -238,30 +372,32 @@ namespace MOKA_Factory_Tools.BLL
                 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.Total = hourlydata.TotalZeroCount;
+            yields.OncePass = hourlydata.OncePassZeroCount;
+            //yields.TwiceFail = hourlydata.TwiceFailCount;
+            yields.NTF = hourlydata.NTFZeroCount;
+            yields.RealFail = 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);
+                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 = (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");
+                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 / (double)totalZero).ToString("P");
             }
             catch
             {
@@ -270,5 +406,272 @@ namespace MOKA_Factory_Tools.BLL
 
             return IsNewRecord ? dalAMYields.Add(yields) : dalAMYields.Update(yields);
         }
+        #endregion
+
+
+        #region ------试产NTF------
+        /// <summary>
+        /// 记录是否存在;
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        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 int IsRecordExist2(AMResult_TR model)
+        {
+            if (!dalAMResult.Exists(string.Format("Station='{0}' and SN='{1}'", model.Station, model.SN)))
+                return 0;
+
+            #region 需要连续2次pass才能上传AMTest,提示操作员再测试一次;
+            if (model.Test01.ToLower() == "fail" && model.Test02.ToLower() == "pass" && model.Test03.ToLower() == "null" && model.FinalTest.ToLower() == "fail")
+                return 3;
+
+            if (model.Test01.ToLower() == "pass" && model.Test02.ToLower() == "fail" && model.Test03.ToLower() == "pass" && model.FinalTest.ToLower() == "pass")
+                return 3;
+            #endregion
+
+            #region 累计出现2次fail的,不允许再测试;
+            if (model.Test01.ToLower() == "pass" && model.Test02.ToLower() == "fail" && model.Test03.ToLower() == "fail" && model.FinalTest.ToLower() == "fail")
+                return 2;
+
+            if (model.Test01.ToLower() == "fail" && model.Test02.ToLower() == "fail" && model.Test03.ToLower() == "null" && model.FinalTest.ToLower() == "fail")
+                return 2;
+            #endregion
+
+            return 1;
+        }
+
+        /// <summary>
+        /// 新增记录;
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public bool AddAMResult(AMResult_TR 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 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("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 = "OncePass";
+                    }
+                    else
+                    {
+                        redo0Model.Test02 = "FAIL";
+                        redo0Model.FinalTest = "RealFail";
+                    }
+                }
+                else if ( redo0Model.Test01.ToLower() =="fail")
+                {
+                    if (TestResult)
+                    {
+                        redo0Model.Test02 = "PASS";
+                        redo0Model.FinalTest = "RealFail";
+                    }
+                    else
+                    {
+                        redo0Model.Test02 = "FAIL";
+                        redo0Model.FinalTest = "RealFail";
+                    }
+                }
+            }
+            #endregion
+            #region 测试第3次
+            if (redo0Model.Test02.ToLower() != "null" && redo0Model.Test03.ToLower() == "null")
+            {
+                if ( redo0Model.Test01.ToLower().Equals("pass") && redo0Model.Test01.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.Test01.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.Test01.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.Test01.ToLower().Equals("fail"))
+                {
+                    Log.WriteInfoLog("连接2次Fail,测试锁定");
+                }
+            }
+            #endregion
+            #region 测试第4次;
+            if ( redo0Model.Test03.ToLower() != "null" )
+            {
+                if ( redo0Model.Test01.ToLower() == "pass" && redo0Model.Test02.ToLower() == "fail" && redo0Model.Test03.ToLower() == "pass" && redo0Model.FinalTest.ToLower() == "pass" && redo0Model.ResultType.ToLower() == "ntf")
+                {
+                    if (TestResult)
+                    {
+                        Log.WriteInfoLog("连接2次Fail,测试锁定");
+                    }
+                    else
+                    {
+                        redo0Model.Test03 = "FAIL";
+                        redo0Model.FinalTest = "FAIL";
+                        redo0Model.ResultType = "RealFail";
+                    }
+                }
+            }
+            #endregion
+            if (!TestResult)
+                redo0Model.ErrorMsg = strErrMsg;
+
+            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<AMResult_TR> 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.TotalZeroCount;
+            yields.OncePass = hourlydata.OncePassZeroCount;
+            //yields.TwiceFail = hourlydata.TwiceFailCount;
+            yields.NTF = hourlydata.NTFZeroCount;
+            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 / (double)totalZero).ToString("P");
+            }
+            catch
+            {
+                return false;
+            }
+
+            return IsNewRecord ? dalAMYieldsTR.Add(yields) : dalAMYieldsTR.Update(yields);
+        }
+
+        #endregion
     }
 }

+ 94 - 0
Business/CommonMethod.cs

@@ -65,6 +65,36 @@ namespace MOKA_Factory_Tools
             GetProfileString(lpApplicationName, lpKeyName, lpDefault, MyString, 256);
             return MyString.ToString();
         }
+
+        /// <summary>
+        /// 更新G客户抄写状态;
+        /// </summary>
+        /// <param name="SN">当前SN</param>
+        /// <param name="bResult">当前SN的抄写结果,true=pass, false=fail</param>
+        public static void UpdateGSNProfile( string SN, bool bResult = false )
+        {
+            string strLastSN = ReadProfileString("MOKAFactoryTools", "LastGSN", "");
+            if (!strLastSN.Equals(SN, StringComparison.OrdinalIgnoreCase))
+            {
+                WriteProfileString("MOKAFactoryTools", "LastGSN", SN);
+                // 清空连续次数值;
+                WriteProfileString("MOKAFactoryTools", "GFailCount", "0");
+                // 清空上次测试状态;
+                WriteProfileString("MOKAFactoryTools", "LastGResult", "0");
+            }
+            else
+            {
+                if (bResult == false)
+                {
+                    int nGSNCount = Convert.ToInt32(ReadProfileString("MOKAFactoryTools", "GFailCount", "0")) + 1;
+                    // 更新连续测试中累计失败的次数;
+                    WriteProfileString("MOKAFactoryTools", "GFailCount", nGSNCount.ToString());
+                }
+                // 更新抄写状态;
+                WriteProfileString("MOKAFactoryTools", "LastGResult", bResult ? "1" : "0");
+            }
+        }
+
         //public static string LocalMacAddress = GetMacAddress();
         /// <summary>
         /// 获取活动网卡硬件地址
@@ -2280,6 +2310,70 @@ namespace MOKA_Factory_Tools
 
             return false;
         }
+
+        /// <summary>
+        /// 通过SN获取订单类型
+        /// </summary>
+        /// <param name="sn"></param>
+        /// <returns></returns>
+        public static bool GetOrderTypeFromSN(string sn, out string result, out string msg)
+        {
+            msg = "";
+            result = "";
+            HttpHelper http = new HttpHelper();
+            HttpItem item = new HttpItem()
+            {
+                Encoding = Encoding.UTF8,
+                Method = "post",
+                ContentType = "application/x-www-form-urlencoded",
+                KeepAlive = false
+            };
+
+            // 测试地址;
+            item.URL = "http://10.126.124.85:3080/api/SMES/IsCuringBOM?sn="+sn;
+            HttpResult hResult = http.GetHtml(item);
+            if (hResult.StatusCode == System.Net.HttpStatusCode.OK)
+            {
+                try
+                {
+                    using (JsonTextReader reader = new JsonTextReader(new StringReader(hResult.Html)))
+                    {
+                        JObject jObject = (JObject)JToken.ReadFrom(reader);
+                        reader.Close();
+
+                        bool bResult = jObject["Result"].Value<bool>();
+                        msg = jObject["EroMsg"].Value<string>();
+                        string returnObject = jObject["returnObject"].Value<string>();
+
+                        if (bResult)
+                        {
+                            if (returnObject.Contains("量产"))
+                                result = "量产";
+                            else if (returnObject.Contains("试产"))
+                                result = "试产";
+                            else
+                                result = "错误返回";
+                            Log.WriteInfoLog("\r\nIsCuringBOM :\r\n" + item.URL + "\r\n" + item.Postdata + "\r\n" + hResult.Html);
+                            return true;
+                        }
+
+                        Log.WriteInfoLog("IsCuringBOM error:" + hResult.StatusDescription + "\r\n" + hResult.Html + "\r\nAddress: " + item.URL + "\r\nPostdata: " + item.Postdata);
+                    }
+                }
+                catch (Exception e)
+                {
+                    msg = e.Message;
+                    Log.WriteErrorLog("IsCuringBOM Json-error:" + hResult.StatusDescription + "\r\n" + hResult.Html + "\r\nAddress: " + item.URL + "\r\nPostdata: " + item.Postdata);
+                }
+            }
+            else
+            {
+                msg = hResult.StatusDescription;
+                Log.WriteInfoLog("IsCuringBOM Http-error:" + hResult.StatusDescription + "\r\n" + hResult.Html + "\r\nAddress: " + item.URL + "\r\nPostdata: " + item.Postdata);
+            }
+
+            return false;
+        }
 #endregion
     }
 

+ 269 - 20
DAL/DAL_AMResult.cs

@@ -150,16 +150,13 @@ namespace MOKA_Factory_Tools.DAL
             if ( row != null )
             {
                 HourlyResultData model = new HourlyResultData();
-                model.TotalCount = row["Total"].ToString();
-                model.RealTotalCount = row["RealTotal"].ToString();
-                model.OncePassCount = row["OncePass"].ToString();
-                model.OnceFailCount = row["OnceFail"].ToString();
-                model.NTFCount = row["NTF"].ToString();
-                model.TwiceFailCount = row["TwiceFail"].ToString();
-                model.FinalFailCount = row["FinalFail"].ToString();
-                model.FinalPassCount = row["FinalPass"].ToString();
-                model.RealFailCount = row["RealFail"].ToString();
-                model.RealPassCount = row["RealPass"].ToString();
+                model.TotalAllCount = row["TotalAllCount"].ToString();
+                model.TotalZeroCount = row["TotalZeroCount"].ToString();
+                model.OncePassAllCount = row["OncePassAllCount"].ToString();
+                model.OncePassZeroCount = row["OncePassZeroCount"].ToString();
+                model.NTFAllCount = row["NTFAllCount"].ToString();
+                model.NTFZeroCount = row["NTFZeroCount"].ToString();
+                model.RealFailCount = row["RealFailCount"].ToString();
                 model.NTFSN = row["NTFSN"].ToString();
                 model.FailDSN = row["FailDSN"].ToString();
 
@@ -175,17 +172,23 @@ namespace MOKA_Factory_Tools.DAL
             {
                 StringBuilder strSql = new StringBuilder();
                 strSql.Append("select ");
-                strSql.Append("count(1) as 'Total',");
-                strSql.Append("count(case when ReDo = '0' then 1 else null end) as 'RealTotal',");
-                strSql.Append("count(case when ResultType = 'OncePass' then 1 else null end) as 'OncePass',");
-                strSql.Append("count(case when ResultType = 'OnceFail' then 1 else null end) as 'OnceFail',");
-                strSql.Append("count(case when ResultType = 'NTF' then 1 else null end) as 'NTF',");
-                strSql.Append("count(case when ResultType = 'TwiceFail' then 1 else null end) as 'TwiceFail',");
-                strSql.Append("count(case when ResultType = 'FinalFail' then 1 else null end) as 'FinalFail',");
-                strSql.Append("count(case when ResultType = 'FinalPass' then 1 else null end) as 'FinalPass',");
-                strSql.Append("count(case when FinalTest = 'PASS' and ReDo = '0' then 1 else null end) as 'RealPass',");
-                strSql.Append("count(case when FinalTest = 'FAIL' and ReDo = '0' then 1 else null end) as 'RealFail',");
+                // TotalAllCount
+                strSql.Append("count(1) as 'TotalAllCount',");
+                // TotalZeroCount
+                strSql.Append("count(case when ReDo = '0' then 1 else null end) as 'TotalZeroCount',");
+                // OncePassAllCount
+                strSql.Append("count(case when ResultType = 'OncePass' then 1 else null end) as 'OncePassAllCount',");
+                // OncePassZeroCount
+                strSql.Append("count(case when ResultType = 'OncePass' and ReDo = '0' then 1 else null end) as 'OncePassZeroCount',");
+                // NTFAllCount
+                strSql.Append("count(case when ResultType = 'NTF' then 1 else null end) as 'NTFAllCount',");
+                // NTFZeroCount
+                strSql.Append("count(case when ResultType = 'NTF' and ReDo = '0' then 1 else null end) as 'NTFZeroCount',");
+                // RealFailCount
+                strSql.Append("count(case when ResultType = 'RealFail' then 1 else null end) as 'RealFailCount',");
+                // NTF的SN集合;
                 strSql.Append(string.Format("stuff((select ',' + SN from {0} where {1} and ResultType='NTF' for XML PATH('')),1,1,'') as 'NTFSN',", this.TableName, whereString));
+                // FinalTest=Fail的DSN集合;
                 strSql.Append(string.Format("stuff((select ',' + DSN from {0} where {1} and FinalTest='FAIL' for XML PATH('')),1,1,'') as 'FailDSN' ", this.TableName, whereString));
                 strSql.Append("from " + this.TableName);
                 strSql.Append(" where  " + whereString);
@@ -251,4 +254,250 @@ namespace MOKA_Factory_Tools.DAL
         }
         #endregion
     }
+
+    public class DAL_AMResult_TR : BaseDAL
+    {
+        public DAL_AMResult_TR()
+        {
+            this.TableFieldNameString = "";
+        }
+
+
+        #region 属性和字段
+
+        string _tableName = "AMResult_TR";
+
+        /// <summary>
+        /// 获取数据表名
+        /// </summary>
+        public override string TableName
+        {
+            get { return _tableName; }
+            set { this._tableName = value; }
+        }
+
+        /// <summary>
+        /// 获取当前新的数据表模型对象
+        /// </summary>
+        public override object ObjModel
+        {
+            get
+            {
+                return this.CurrentModel;
+            }
+        }
+
+        /// <summary>
+        /// 获取当前新的MOdel
+        /// </summary>
+        public AMResult_TR CurrentModel
+        {
+            get { return new AMResult_TR(); }
+        }
+
+
+        string _tableFieldNameString = "";
+        /// <summary>
+        /// 数据表字段名数组
+        /// </summary>
+        public override string TableFieldNameString
+        {
+            get { return this._tableFieldNameString; }
+
+            set { this._tableFieldNameString = value; }
+        }
+
+        #endregion
+
+        #region 检查记录
+        //基类已经实现
+        #endregion
+
+        #region 增加数据
+        /// <summary>
+        /// 增加一条数据
+        /// </summary>
+        /// <param name="model">Model对象</param>
+        /// <returns></returns>
+        public bool Add(AMResult_TR model)
+        {
+            return base.Add(model);
+        }
+        /// <summary>
+        /// 增加一条数据
+        /// </summary>
+        /// <param name="model">Model对象</param>
+        /// <param name="overlookFieldList">忽略字段名列表 字段名之间用“,”号分隔</param>
+        /// <returns></returns>
+        public bool Add(AMResult_TR model, string overlookFieldList = "ID")
+        {
+            return base.Add(model, overlookFieldList);
+        }
+
+        #endregion
+
+        #region 删除数据
+        /// <summary>
+        /// 删除数据
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public bool Delete(AMResult_TR model)
+        {
+            return base.Delete(string.Format("Station = '{0}' and SN = '{1}' and ReDo = '{2}'", model.Station, model.SN, model.ReDo));
+        }
+        #endregion
+
+        #region 更新数据
+        /// <summary>
+        /// 更新一条数据
+        /// </summary>
+        public bool Update(AMResult_TR model)
+        {
+            return base.Update(model);
+        }
+
+        /// <summary>
+        /// 根据筛选字段和SQL筛选运算符号更新数据
+        /// </summary>
+        /// <param name="model">Model对象</param>
+        /// <param name="filterFieldName">筛选字段名称</param>
+        /// <param name="operators">SQL筛选运算符号</param>
+        /// <param name="overlookFieldList">忽略字段名列表 字段名之间用“,”号分隔</param>
+        /// <returns></returns>
+        public bool Update(AMResult_TR model, string strWhere, string IgnoreUpdateFields = "Station,SN,ODF,DSN,Line,Model,Dimension")
+        {
+            return base.UpdateAMResult(model, strWhere, IgnoreUpdateFields);
+        }
+        #endregion
+
+        #region 查询数据
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="strWhere"></param>
+        /// <returns></returns>
+        public AMResult_TR GetModel(string strWhere)
+        {
+            return DataRowToModel(GetDataRow(strWhere));
+        }
+
+        /// <summary>
+        /// 得到一个对象实体
+        /// </summary>
+        public AMResult_TR GetModel(string strStation, string strSN)
+        {
+            return DataRowToModel(GetDataRow(string.Format("Station = '{0}' and SN = '{1}'", strStation, strSN)));
+        }
+
+        public HourlyResultTRData GetHourlyResultData(string Line, string Station, string ODF, DateTime TestDate, int TestHour)
+        {
+            DataRow row = GetHourlyDataRow(string.Format("Line='{0}' and Station='{1}' and ODF='{2}' and TestDate='{3}' and TestHour='{4}'", Line, Station, ODF, TestDate, TestHour));
+            if (row != null)
+            {
+                HourlyResultTRData model = new HourlyResultTRData();
+                model.TotalAllCount = row["TotalAllCount"].ToString();
+                model.TotalZeroCount = row["TotalZeroCount"].ToString();
+                model.OncePassAllCount = row["OncePassAllCount"].ToString();
+                model.OncePassZeroCount = row["OncePassZeroCount"].ToString();
+                model.NTFAllCount = row["NTFAllCount"].ToString();
+                model.NTFZeroCount = row["NTFZeroCount"].ToString();
+                model.RealFailCount = row["RealFailCount"].ToString();
+                model.NTFSN = row["NTFSN"].ToString();
+                model.FailDSN = row["FailDSN"].ToString();
+
+                return model;
+            }
+
+            return null;
+        }
+
+        public DataRow GetHourlyDataRow(string whereString)
+        {
+            if (whereString.Trim().Length > 0)
+            {
+                StringBuilder strSql = new StringBuilder();
+                strSql.Append("select ");
+                // TotalAllCount
+                strSql.Append("count(1) as 'TotalAllCount',");
+                // TotalZeroCount
+                strSql.Append("count(case when ReDo = '0' then 1 else null end) as 'TotalZeroCount',");
+                // OncePassAllCount
+                strSql.Append("count(case when ResultType = 'OncePass' then 1 else null end) as 'OncePassAllCount',");
+                // OncePassZeroCount
+                strSql.Append("count(case when ResultType = 'OncePass' and ReDo = '0' then 1 else null end) as 'OncePassZeroCount',");
+                // NTFAllCount
+                strSql.Append("count(case when ResultType = 'NTF' then 1 else null end) as 'NTFAllCount',");
+                // NTFZeroCount
+                strSql.Append("count(case when ResultType = 'NTF' and ReDo = '0' then 1 else null end) as 'NTFZeroCount',");
+                // RealFailCount
+                strSql.Append("count(case when ResultType = 'RealFail' then 1 else null end) as 'RealFailCount',");
+                // NTF的SN集合;
+                strSql.Append(string.Format("stuff((select ',' + SN from {0} where {1} and ResultType='NTF' for XML PATH('')),1,1,'') as 'NTFSN',", this.TableName, whereString));
+                // FinalTest=Fail的DSN集合;
+                strSql.Append(string.Format("stuff((select ',' + DSN from {0} where {1} and FinalTest='FAIL' for XML PATH('')),1,1,'') as 'FailDSN' ", this.TableName, whereString));
+                strSql.Append("from " + this.TableName);
+                strSql.Append(" where  " + whereString);
+
+                DataSet ds = DbHelper.Query(cps.ConnectionString, strSql.ToString());
+                if (ds.Tables[0].Rows.Count > 0)
+                {
+                    return ds.Tables[0].Rows[0];
+                }
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// 得到一个对象实体
+        /// </summary>
+        /// <param name="row"></param>
+        /// <returns></returns>
+        public AMResult_TR DataRowToModel(DataRow row)
+        {
+            return DataRowToModelObject(row) as AMResult_TR;
+        }
+
+        /// <summary>
+        /// 获得数据Model列表
+        /// </summary>
+        /// <param name="strWhere">条件 不包含 where 关键字</param>
+        public List<AMResult_TR> GetModelList(string strWhere)
+        {
+            DataSet ds = base.GetList(strWhere);
+            return DataTableToList(ds.Tables[0]);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="strLine"></param>
+        /// <param name="strStation"></param>
+        /// <param name="ODF"></param>
+        /// <param name="TestDate"></param>
+        /// <param name="TestHour"></param>
+        /// <returns></returns>
+        public List<AMResult_TR> GetModelList(string strLine, string strStation, string ODF, DateTime TestDate, int TestHour)
+        {
+            DataSet ds = base.GetList(string.Format("Line = '{0}' and Station = '{1}' and ODF='{2}' and TestDate='{3}' and TestHour='{4}'", strLine, strStation, ODF, TestDate, TestHour));
+            return DataTableToList(ds.Tables[0]);
+        }
+
+        /// <summary>
+        /// 获得数据列表
+        /// </summary>
+        /// <param name="dt">DataTable</param>
+        public List<AMResult_TR> DataTableToList(DataTable dt)
+        {
+            List<AMResult_TR> modelList = new List<AMResult_TR>();
+            List<object> ObjList = base.GetDataTableToOblList(dt);
+            foreach (object obj in ObjList)
+            {
+                modelList.Add((AMResult_TR)obj);
+            }
+            return modelList;
+        }
+        #endregion
+    }
 }

+ 170 - 0
DAL/DAL_AMYields.cs

@@ -177,4 +177,174 @@ namespace MOKA_Factory_Tools.DAL
         }
         #endregion
     }
+
+    public class DAL_AMYields_TR : BaseDAL
+    {
+        public DAL_AMYields_TR()
+        {
+            this.TableFieldNameString = "";
+        }
+
+
+        #region 属性和字段
+
+        string _tableName = "AMYields_TR";
+
+        /// <summary>
+        /// 获取数据表名
+        /// </summary>
+        public override string TableName
+        {
+            get { return _tableName; }
+            set { this._tableName = value; }
+        }
+
+        /// <summary>
+        /// 获取当前新的数据表模型对象
+        /// </summary>
+        public override object ObjModel
+        {
+            get
+            {
+                return this.CurrentModel;
+            }
+        }
+
+        /// <summary>
+        /// 获取当前新的MOdel
+        /// </summary>
+        public AMYields_TR CurrentModel
+        {
+            get { return new AMYields_TR(); }
+        }
+
+
+        string _tableFieldNameString = "";
+        /// <summary>
+        /// 数据表字段名数组
+        /// </summary>
+        public override string TableFieldNameString
+        {
+            get { return this._tableFieldNameString; }
+
+            set { this._tableFieldNameString = value; }
+        }
+
+        #endregion
+
+        #region 检查记录
+        //基类已经实现
+        #endregion
+
+        #region 增加数据
+        /// <summary>
+        /// 增加一条数据
+        /// </summary>
+        /// <param name="model">Model对象</param>
+        /// <returns></returns>
+        public bool Add(AMYields_TR model)
+        {
+            return base.Add(model);
+        }
+        /// <summary>
+        /// 增加一条数据
+        /// </summary>
+        /// <param name="model">Model对象</param>
+        /// <param name="overlookFieldList">忽略字段名列表 字段名之间用“,”号分隔</param>
+        /// <returns></returns>
+        public bool Add(AMYields_TR model, string overlookFieldList = "ID")
+        {
+            return base.Add(model, overlookFieldList);
+        }
+
+        #endregion
+
+        #region 删除数据
+        /// <summary>
+        /// 删除数据
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public bool Delete(AMYields_TR model)
+        {
+            return base.Delete(model.ID);
+        }
+        #endregion
+
+        #region 更新数据
+        /// <summary>
+        /// 更新一条数据
+        /// </summary>
+        public bool Update(AMYields_TR model)
+        {
+            return base.Update(model);
+        }
+
+        /// <summary>
+        /// 根据筛选字段和SQL筛选运算符号更新数据
+        /// </summary>
+        /// <param name="model">Model对象</param>
+        /// <param name="filterFieldName">筛选字段名称</param>
+        /// <param name="operators">SQL筛选运算符号</param>
+        /// <param name="overlookFieldList">忽略字段名列表 字段名之间用“,”号分隔</param>
+        /// <returns></returns>
+        public bool Update(AMYields_TR model, string filterFieldName = "ID", string operators = "=", string overlookFieldList = "ID")
+        {
+            return base.Update(model, filterFieldName, operators, overlookFieldList);
+        }
+        #endregion
+
+        #region 查询数据
+        /// <summary>
+        /// 得到一个对象实体
+        /// </summary>
+        public AMYields_TR GetModel(string strWhere)
+        {
+            return DataRowToModel(GetDataRow(strWhere));
+        }
+
+        /// <summary>
+        /// 得到一个对象实体
+        /// </summary>
+        public AMYields_TR GetModel(string strLine, string strStation, string ODF, DateTime TestDate, int TestHour)
+        {
+            return DataRowToModel(GetDataRow(string.Format("Line = '{0}' and Station = '{1}' and ODF='{2}' and TestDate='{3}' and TestHour='{4}'", strLine, strStation, ODF, TestDate, TestHour)));
+        }
+
+        /// <summary>
+        /// 得到一个对象实体
+        /// </summary>
+        /// <param name="row"></param>
+        /// <returns></returns>
+        public AMYields_TR DataRowToModel(DataRow row)
+        {
+            return DataRowToModelObject(row) as AMYields_TR;
+        }
+
+        /// <summary>
+        /// 获得数据Model列表
+        /// </summary>
+        /// <param name="strWhere">条件 不包含 where 关键字</param>
+        public List<AMYields_TR> GetModelList(string strWhere)
+        {
+            DataSet ds = base.GetList(strWhere);
+            return DataTableToList(ds.Tables[0]);
+        }
+
+        /// <summary>
+        /// 获得数据列表
+        /// </summary>
+        /// <param name="dt">DataTable</param>
+        public List<AMYields_TR> DataTableToList(DataTable dt)
+        {
+            List<AMYields_TR> modelList = new List<AMYields_TR>();
+            List<object> ObjList = base.GetDataTableToOblList(dt);
+            foreach (object obj in ObjList)
+            {
+                modelList.Add((AMYields_TR)obj);
+            }
+            return modelList;
+        }
+        #endregion
+    }
 }

+ 54 - 11
Models/AMResult.cs

@@ -24,7 +24,40 @@ namespace MOKA_Factory_Tools.Models
         public string ResultType { get; set; }      /* 结果类型:OncePass、NTF、FinalPass、TwiceFail、FinalPass、OnceFail、FinalFail */
         public string DSN { get; set; }             /* 本次抄写DSN */
         public string ErrorMsg { get; set; }        /* 抄写失败描述 */
-        public string Remark { get; set; }          /* 备注:一般用于重流标记 */
+        public string Remark { get; set; }          /* 备注:用于记录连续测试中累计失败次数 */
+
+        /// <summary>
+        /// 判断对象的值是否空;
+        /// </summary>
+        /// <returns></returns>
+        public bool IsValueEmpty()
+        {
+            if (TestHour == -1 || SN == "")
+                return true;
+            return false;
+        }
+    }
+
+    public class AMResult_TR
+    {
+        public DateTime TestDate { get; set; }      /* 日期班次 */
+        public int TestHour { get; set; } = -1;     /* 小时 */
+        public string Line { get; set; }            /* 线体:UI界面或配置文件提供 */
+        public string Station { get; set; } = "";   /* 工站:UI界面或配置文件提供 */
+        public string Model { get; set; }           /* 机型:HTTP接口获取 */
+        public string Dimension { get; set; }       /* 尺寸:HTTP接口获取 */
+        public string TestTime { get; set; }        /* 测试时间 */
+        public string ODF { get; set; }             /* 批次:HTTP接口获取 */
+        public string SN { get; set; } = "";        /* 本次抄写SN */
+        public string ReDo { get; set; }            /* 重流标识 */
+        public string Test01 { get; set; }          /* 首次测试结果 */
+        public string Test02 { get; set; }          /* 第二次测试结果 */
+        public string Test03 { get; set; }          /* 第三次测试结果 */
+        public string FinalTest { get; set; }       /* 最终测试结果 */
+        public string ResultType { get; set; }      /* 结果类型:OncePass、NTF、FinalPass、TwiceFail、FinalPass、OnceFail、FinalFail */
+        public string DSN { get; set; }             /* 本次抄写DSN */
+        public string ErrorMsg { get; set; }        /* 抄写失败描述 */
+        public string Remark { get; set; }          /* 备注:用于记录连续测试中累计失败次数 */
 
         /// <summary>
         /// 判断对象的值是否空;
@@ -40,16 +73,26 @@ namespace MOKA_Factory_Tools.Models
 
     public class HourlyResultData
     {
-        public string TotalCount { get; set; } = "0";
-        public string RealTotalCount { get; set; } = "0";
-        public string OncePassCount { get; set; } = "0";
-        public string OnceFailCount { get; set; } = "0";
-        public string NTFCount { get; set; } = "0";
-        public string TwiceFailCount { get; set; } = "0";
-        public string FinalFailCount { get; set; } = "0";
-        public string FinalPassCount { get; set; } = "0";
-        public string RealFailCount { get; set; } = "0";        // 只查询ReDo=0的记录;
-        public string RealPassCount { get; set; } = "0";        // 只查询ReDo=0的记录;
+        public string TotalAllCount { get; set; } = "0";
+        public string TotalZeroCount { get; set; } = "0";
+        public string OncePassAllCount { get; set; } = "0";
+        public string OncePassZeroCount { get; set; } = "0";
+        public string NTFAllCount { get; set; } = "0";
+        public string NTFZeroCount { get; set; } = "0";
+        public string RealFailCount { get; set; } = "0";
+        public string NTFSN { get; set; }
+        public string FailDSN { get; set; }
+    }
+
+    public class HourlyResultTRData
+    {
+        public string TotalAllCount { get; set; } = "0";
+        public string TotalZeroCount { get; set; } = "0";
+        public string OncePassAllCount { get; set; } = "0";
+        public string OncePassZeroCount { get; set; } = "0";
+        public string NTFAllCount { get; set; } = "0";
+        public string NTFZeroCount { get; set; } = "0";
+        public string RealFailCount { get; set; } = "0";
         public string NTFSN { get; set; }
         public string FailDSN { get; set; }
     }

+ 36 - 0
Models/AMYields.cs

@@ -41,4 +41,40 @@ namespace MOKA_Factory_Tools.Models
             return false;
         }
     }
+
+    public class AMYields_TR
+    {
+        public int ID { get; set; } = -1;               /* 自增ID */
+        public DateTime TestDate { get; set; }          /* 日期班次 */
+        public int TestHour { get; set; }                /* 小时 */
+        public string Line { get; set; }                 /* 线体:UI界面或配置文件提供 */
+        public string Station { get; set; }              /* 工站:UI界面或配置文件提供 */
+        public string ODF { get; set; }                  /* 批次:HTTP接口获取 */
+        public string DeviceNum { get; set; }            /* 机架编号:HTTP接口获取 */
+        public string Model { get; set; }                /* 机型:HTTP接口获取 */
+        public string Dimension { get; set; }            /* 尺寸:HTTP接口获取 */
+        public string OncePass { get; set; }             /* 第一次Pass的数量:抄写一次就成功的整机(注意:GetKeys网络通信失败的不要视为Fail加入统计,进入工厂模式失败的也不要加入Fail) */
+        public string NTF { get; set; }                  /* 第二次Pass的数量:第一次抄写失败,则进行第二次抄写成功的数量 */
+        public string TwiceFail { get; set; }            /* 连续2次Fail的数量 */
+        public string RealFail { get; set; }             /* 实际Fail的数量 */
+        public string Total { get; set; }                /* 测试产品总数:是否包含回流的? */
+        public string FPY { get; set; }                  /* 一次测试Pass的合格率:计算方式= OncePass/Total */
+        public string SPY { get; set; }                  /* 两次以内测试Pass的合格率:计算方式=(OnecPass+NTF)/Total */
+        public string RPY { get; set; }                  /* 实际合格率:计算方式=1-RealFail/Total */
+        public string YieldRate { get; set; }            /* 去掉重码实际合格率:计算方式=1- */
+        public string NTF_SN { get; set; }               /* 记录NTF的FSN号,使用分号分隔 */
+        public string FailDSN { get; set; }              /* 记录实际Fail的FSN号 */
+        public string Remark { get; set; }               /* 备注 */
+
+        /// <summary>
+        /// 判断对象的值是否空;
+        /// </summary>
+        /// <returns></returns>
+        public bool IsValueEmpty()
+        {
+            if (ID == -1)
+                return true;
+            return false;
+        }
+    }
 }

文件差异内容过多而无法显示
+ 40 - 214
Views/OperationPanel.cs


部分文件因为文件数量过多而无法显示