public R_TCQS_YIELD_RATE_DETAIL GetDataObject() { R_TCQS_YIELD_RATE_DETAIL DataObject = new R_TCQS_YIELD_RATE_DETAIL(); DataObject.ID = this.ID; DataObject.WORK_DATE = this.WORK_DATE; DataObject.WORK_TIME = this.WORK_TIME; DataObject.PRODUCTION_LINE = this.PRODUCTION_LINE; DataObject.CLASS_NAME = this.CLASS_NAME; DataObject.STATION_NAME = this.STATION_NAME; DataObject.DEVICE_NAME = this.DEVICE_NAME; DataObject.WORKORDERNO = this.WORKORDERNO; DataObject.SKUNO = this.SKUNO; DataObject.SKU_NAME = this.SKU_NAME; DataObject.SKU_SERIES = this.SKU_SERIES; DataObject.TOTAL_FRESH_BUILD_QTY = this.TOTAL_FRESH_BUILD_QTY; DataObject.TOTAL_FRESH_PASS_QTY = this.TOTAL_FRESH_PASS_QTY; DataObject.TOTAL_FRESH_FAIL_QTY = this.TOTAL_FRESH_FAIL_QTY; DataObject.TOTAL_REWORK_BUILD_QTY = this.TOTAL_REWORK_BUILD_QTY; DataObject.TOTAL_REWORK_PASS_QTY = this.TOTAL_REWORK_PASS_QTY; DataObject.TOTAL_REWORK_FAIL_QTY = this.TOTAL_REWORK_FAIL_QTY; DataObject.TCQS_FRESH_BUILD_QTY = this.TCQS_FRESH_BUILD_QTY; DataObject.TCQS_FRESH_PASS_QTY = this.TCQS_FRESH_PASS_QTY; DataObject.TCQS_FRESH_FAIL_QTY = this.TCQS_FRESH_FAIL_QTY; DataObject.TCQS_REWORK_BUILD_QTY = this.TCQS_REWORK_BUILD_QTY; DataObject.TCQS_REWORK_PASS_QTY = this.TCQS_REWORK_PASS_QTY; DataObject.TCQS_REWORK_FAIL_QTY = this.TCQS_REWORK_FAIL_QTY; DataObject.EDIT_EMP = this.EDIT_EMP; DataObject.EDIT_TIME = this.EDIT_TIME; return(DataObject); }
//處理SN狀態/記錄過站記錄/統計良率 public R_TCQS_YIELD_RATE_DETAIL CheckTCQSTest(string SerialNo, string SkuNo, string WorkorderNo, string Line, string StationName, string DeviceName, string Bu, string PassOrFail, string EmpNo, DateTime DT, OleExec DB) { DataTable dataTable = new DataTable(); string sql = string.Empty; string RepassModel = "", RetestModel = "", Device_Name = ""; int PassLimit = 1, RetestLimit = 1; //所有未設定的機種,默認以該參數統計TCQS int PassCount = 0, RetestCount = 0; //臨時表記錄的Pass/Retest測試次數 int PassCountFlag = 0; //標識是否有過站記錄,在Total統計時以確定Fresh/Rework狀態 int RetestCountFlag = 0, //標識是否有測試記錄,在TCQS統計時以確定Fresh/Rework狀態 RepairFlag = 0; //標識是否做過站處理 T_R_WO_BASE WoTable = null; Row_R_WO_BASE WoRow = null; WoTable = new T_R_WO_BASE(DB, this.DBType); WoRow = WoTable.GetWo(WorkorderNo, DB); //初使化R_TCQS_YIELD_RATE_DETAIL R_TCQS_YIELD_RATE_DETAIL RTYRD = new R_TCQS_YIELD_RATE_DETAIL() { WORK_DATE = DT.ToString("yyyy-MM-dd"), WORK_TIME = DT.ToString("HH"), PRODUCTION_LINE = Line, CLASS_NAME = GetWorkClass(DT.ToString("HH:mm:ss"), DB), STATION_NAME = StationName, DEVICE_NAME = DeviceName, WORKORDERNO = WorkorderNo, SKUNO = SkuNo, SKU_NAME = WoRow.SKU_NAME, SKU_SERIES = WoRow.SKU_SERIES, TOTAL_REWORK_BUILD_QTY = 0, TOTAL_REWORK_PASS_QTY = 0, TOTAL_REWORK_FAIL_QTY = 0, TOTAL_FRESH_BUILD_QTY = 0, TOTAL_FRESH_PASS_QTY = 0, TOTAL_FRESH_FAIL_QTY = 0, TCQS_REWORK_BUILD_QTY = 0, TCQS_REWORK_PASS_QTY = 0, TCQS_REWORK_FAIL_QTY = 0, TCQS_FRESH_BUILD_QTY = 0, TCQS_FRESH_PASS_QTY = 0, TCQS_FRESH_FAIL_QTY = 0, EDIT_EMP = EmpNo, EDIT_TIME = DT }; sql = $@"Select PASS_LIMIT,RETEST_LIMIT,REPASS_MODEL,RETEST_MODEL from C_MODEL_ATE_SET_T Where skuno='{SkuNo}' and station_name='{StationName}' "; dataTable = DB.ExecSelect(sql).Tables[0]; //如果有設定則取設定值,否則取默認值 if (dataTable.Rows.Count > 0) { PassLimit = Int32.Parse(dataTable.Rows[0]["PASS_LIMIT"].ToString()); RetestLimit = Int32.Parse(dataTable.Rows[0]["RETEST_MODEL"].ToString()); RepassModel = dataTable.Rows[0]["REPASS_MODEL"].ToString(); RetestModel = dataTable.Rows[0]["RETEST_MODEL"].ToString(); } //獲取臨時表的測試記錄中Pass次數/Fail次數/測試機臺名稱 sql = $@"select PASS_COUNT,RETEST_COUNT,DEVICE_NAME from R_TMP_ATEDATA_T where station_name = '{StationName}' and sn = '{SerialNo}'"; dataTable = null; dataTable = DB.ExecSelect(sql).Tables[0]; if (dataTable.Rows.Count > 0) { PassCount = Int32.Parse(dataTable.Rows[0]["PASS_COUNT"].ToString()); RetestCount = Int32.Parse(dataTable.Rows[0]["RETEST_COUNT"].ToString()); Device_Name = dataTable.Rows[0]["DEVICE_NAME"].ToString(); } //獲取產品狀態Fresh or Rework sql = $@"SELECT RESULT_FLAG FROM R_SN_DETAIL WHERE SN = '{SerialNo}' AND STATION_NAME = '{StationName}'"; dataTable = null; dataTable = DB.ExecSelect(sql).Tables[0]; if (dataTable.Rows.Count > 0) { //有記錄,代表有測試過,因此TCQS為Rework RetestCountFlag = 1; foreach (DataRow dr in dataTable.Rows) { //有過站記錄,因此總良率為Rework if (dr["RESULT_FLAG"].ToString() == "0" || dr["RESULT_FLAG"].ToString() == "1") { PassCountFlag = 1; break; } } } //統計良率統計數據 if (PassOrFail == "PASS")//測試結果為PASS { //如果有Fail記錄 if (RetestCount > 0) { //管控測試PASS次數>1 if (PassLimit > 1) { //如果有測試PASS的記錄,則需要判斷是否需切換工站,是否滿足測試次數 if (PassCount > 0) { //必須切換測試站 if (RepassModel == "0") { if (Device_Name == DeviceName) { //必須換機臺測試 string errMsg = MESReturnMessage.GetMESReturnMessage("MSGCODE20180526185619"); throw new MESReturnMessage(errMsg); } } else if (RepassModel == "1") //不允許換機臺測試 { if (Device_Name != DeviceName) { //不允許換機臺測試,必須使用Device_Name機臺測試 string errMsg = MESReturnMessage.GetMESReturnMessage("MSGCODE20180526185620", new string[] { Device_Name }); throw new MESReturnMessage(errMsg); } } //判斷是否滿足PASS測試次數 if (PassCount != PassLimit - 1) //不滿足測試次數 { RepairFlag = 1; //不過站,不清臨時表,過站記錄標識為非過站 } RTYRD.TCQS_REWORK_BUILD_QTY = 1; RTYRD.TCQS_REWORK_PASS_QTY = 1; } else //如果沒有測試PASS的記錄,則直接增加測試PASS次數 { RepairFlag = 1; //不過站,不清臨時表,過站記錄標識為非過站 RTYRD.TCQS_REWORK_BUILD_QTY = 1; RTYRD.TCQS_REWORK_PASS_QTY = 1; } } else //管控測試PASS次數=1 { RTYRD.TCQS_REWORK_BUILD_QTY = 1; RTYRD.TCQS_REWORK_PASS_QTY = 1; } } else //如果臨時表沒有Fail記錄,則需要判斷是否有測試記錄,以確定是Fresh還是Rework { //如果有測試記錄,則為Rework if (RetestCountFlag == 1) { RTYRD.TCQS_REWORK_BUILD_QTY = 1; RTYRD.TCQS_REWORK_PASS_QTY = 1; } else//否則為Fresh { RTYRD.TCQS_FRESH_BUILD_QTY = 1; RTYRD.TCQS_FRESH_PASS_QTY = 1; } } //如果做過站處理,則還需要統計總良率 if (RepairFlag == 0) { if (PassCountFlag == 1)//有過站記錄 { RTYRD.TOTAL_REWORK_BUILD_QTY = 1; RTYRD.TOTAL_REWORK_PASS_QTY = 1; } else//沒有過站記錄 { RTYRD.TOTAL_FRESH_BUILD_QTY = 1; RTYRD.TOTAL_FRESH_PASS_QTY = 1; } } } else//測試結果為Fail { //管控測試重測次數>1 if (RetestLimit > 1) { //有Fail記錄 if (RetestCount > 0) { //必須切換測試站 if (RepassModel == "0") { if (Device_Name == DeviceName) { //必須換機臺測試 string errMsg = MESReturnMessage.GetMESReturnMessage("MSGCODE20180526185619"); throw new MESReturnMessage(errMsg); } } else if (RepassModel == "1") //不允許換機臺測試 { if (Device_Name != DeviceName) { //不允許換機臺測試,必須使用Device_Name機臺測試 string errMsg = MESReturnMessage.GetMESReturnMessage("MSGCODE20180526185620", new string[] { Device_Name }); throw new MESReturnMessage(errMsg); } } //判斷是否滿足重測次數 if (RetestCount != RetestLimit - 1) //不滿足測試次數 { RepairFlag = 1; //不過站,不清臨時表,過站記錄標識為非過站 } RTYRD.TCQS_REWORK_BUILD_QTY = 1; RTYRD.TCQS_REWORK_FAIL_QTY = 1; } else //允許重測次數>1,且臨時表沒有Fail記錄 { RepairFlag = 1; //不過站,不清臨時表,過站記錄標識為非過站 //有測試記錄 if (RetestCountFlag == 1) { RTYRD.TCQS_REWORK_BUILD_QTY = 1; RTYRD.TCQS_REWORK_FAIL_QTY = 1; } else//沒有測試記錄 { RTYRD.TCQS_FRESH_BUILD_QTY = 1; RTYRD.TCQS_FRESH_FAIL_QTY = 1; } } } else //管控測試重測次數=1,則需要判斷是否有測試記錄,以確定是Fresh還是Rework { //如果有測試記錄,則為Rework if (RetestCountFlag == 1) { RTYRD.TCQS_REWORK_BUILD_QTY = 1; RTYRD.TCQS_REWORK_FAIL_QTY = 1; } else//否則為Fresh { RTYRD.TCQS_FRESH_BUILD_QTY = 1; RTYRD.TCQS_FRESH_FAIL_QTY = 1; } } //如果做過站處理,則還需要統計總良率 if (RepairFlag == 0) { if (PassCountFlag == 1)//有過站記錄 { RTYRD.TOTAL_REWORK_BUILD_QTY = 1; RTYRD.TOTAL_REWORK_FAIL_QTY = 1; } else//沒有過站記錄 { RTYRD.TOTAL_FRESH_BUILD_QTY = 1; RTYRD.TOTAL_FRESH_FAIL_QTY = 1; } } } return(RTYRD); }
/// <summary> /// 記錄良率 /// </summary> /// <param name="WorkOrder"></param> /// <param name="SerialNo"></param> /// <param name="Status"></param> /// <param name="Day"></param> /// <param name="Time"></param> /// <param name="Line"></param> /// <param name="Station"></param> /// <param name="EmpNo"></param> /// <param name="Bu"></param> /// <param name="DB"></param> /// <returns></returns> public string RecordTCQSYieldRate(R_TCQS_YIELD_RATE_DETAIL RTYRD, string SerialNo, string Bu, OleExec DB) { string result = string.Empty; string sql = string.Empty; DataTable dt = new DataTable(); T_R_TCQS_YIELD_RATE_DETAIL TRTYRD = null; Row_R_TCQS_YIELD_RATE_DETAIL RRTYRD = null; T_R_TMP_ATEDATA_T TRTAT = null; Row_R_TMP_ATEDATA_T RRTAT = null; T_R_SN_DETAIL TRSD = null; Row_R_SN_DETAIL RRSD = null; if (this.DBType == DB_TYPE_ENUM.Oracle) { //更新R_TCQS_YIELD_RATE_DETAIL TRTYRD = new T_R_TCQS_YIELD_RATE_DETAIL(DB, this.DBType); RRTYRD = (Row_R_TCQS_YIELD_RATE_DETAIL)TRTYRD.NewRow(); sql = $@"Select * From R_TCQS_YIELD_RATE_DETAIL Where WORK_DATE='{RTYRD.WORK_DATE}' and Work_Time='{RTYRD.WORK_TIME}' and PRODUCTION_LINE='{RTYRD.PRODUCTION_LINE}' and CLASS_NAME='{RTYRD.CLASS_NAME}' and STATION_NAME='{RTYRD.STATION_NAME}' and DEVICE_NAME='{RTYRD.DEVICE_NAME}' and WORKORDERNO='{RTYRD.WORKORDERNO}' "; dt = DB.ExecSelect(sql).Tables[0]; //如果記錄已經存在 if (dt.Rows.Count > 0) { RRTYRD.loadData(dt.Rows[0]); RRTYRD.TOTAL_FRESH_BUILD_QTY += RTYRD.TOTAL_FRESH_BUILD_QTY; RRTYRD.TOTAL_FRESH_PASS_QTY += RTYRD.TOTAL_FRESH_PASS_QTY; RRTYRD.TOTAL_FRESH_FAIL_QTY += RTYRD.TOTAL_FRESH_FAIL_QTY; RRTYRD.TOTAL_REWORK_BUILD_QTY += RTYRD.TOTAL_REWORK_BUILD_QTY; RRTYRD.TOTAL_REWORK_PASS_QTY += RTYRD.TOTAL_REWORK_PASS_QTY; RRTYRD.TOTAL_REWORK_FAIL_QTY += RTYRD.TOTAL_REWORK_FAIL_QTY; RRTYRD.TCQS_FRESH_BUILD_QTY += RTYRD.TCQS_FRESH_BUILD_QTY; RRTYRD.TCQS_FRESH_PASS_QTY += RTYRD.TCQS_FRESH_PASS_QTY; RRTYRD.TCQS_FRESH_FAIL_QTY += RTYRD.TCQS_FRESH_FAIL_QTY; RRTYRD.TCQS_REWORK_BUILD_QTY += RTYRD.TCQS_REWORK_BUILD_QTY; RRTYRD.TCQS_REWORK_PASS_QTY += RTYRD.TCQS_REWORK_PASS_QTY; RRTYRD.TCQS_REWORK_FAIL_QTY += RTYRD.TCQS_REWORK_FAIL_QTY; RRTYRD.EDIT_EMP = RTYRD.EDIT_EMP; RRTYRD.EDIT_TIME = RTYRD.EDIT_TIME; sql = RRTYRD.GetUpdateString(this.DBType); } else//記錄不存在,則Insert { RRTYRD.ID = TRTYRD.GetNewID(Bu, DB); RRTYRD.WORK_DATE = RTYRD.WORK_DATE; RRTYRD.WORK_TIME = RTYRD.WORK_TIME; RRTYRD.PRODUCTION_LINE = RTYRD.PRODUCTION_LINE; RRTYRD.CLASS_NAME = RTYRD.CLASS_NAME; RRTYRD.STATION_NAME = RTYRD.STATION_NAME; RRTYRD.DEVICE_NAME = RTYRD.DEVICE_NAME; RRTYRD.WORKORDERNO = RTYRD.WORKORDERNO; RRTYRD.SKUNO = RTYRD.SKUNO; RRTYRD.SKU_NAME = RTYRD.SKU_NAME; RRTYRD.SKU_SERIES = RTYRD.SKU_SERIES; RRTYRD.TOTAL_FRESH_BUILD_QTY = RTYRD.TOTAL_FRESH_BUILD_QTY; RRTYRD.TOTAL_FRESH_PASS_QTY = RTYRD.TOTAL_FRESH_PASS_QTY; RRTYRD.TOTAL_FRESH_FAIL_QTY = RTYRD.TOTAL_FRESH_FAIL_QTY; RRTYRD.TOTAL_REWORK_BUILD_QTY = RTYRD.TOTAL_REWORK_BUILD_QTY; RRTYRD.TOTAL_REWORK_PASS_QTY = RTYRD.TOTAL_REWORK_PASS_QTY; RRTYRD.TOTAL_REWORK_FAIL_QTY = RTYRD.TOTAL_REWORK_FAIL_QTY; RRTYRD.TCQS_FRESH_BUILD_QTY = RTYRD.TCQS_FRESH_BUILD_QTY; RRTYRD.TCQS_FRESH_PASS_QTY = RTYRD.TCQS_FRESH_PASS_QTY; RRTYRD.TCQS_FRESH_FAIL_QTY = RTYRD.TCQS_FRESH_FAIL_QTY; RRTYRD.TCQS_REWORK_BUILD_QTY = RTYRD.TCQS_REWORK_BUILD_QTY; RRTYRD.TCQS_REWORK_PASS_QTY = RTYRD.TCQS_REWORK_PASS_QTY; RRTYRD.TCQS_REWORK_FAIL_QTY = RTYRD.TCQS_REWORK_FAIL_QTY; RRTYRD.EDIT_EMP = RTYRD.EDIT_EMP; RRTYRD.EDIT_TIME = RTYRD.EDIT_TIME; sql = RRTYRD.GetInsertString(this.DBType); } try { result = DB.ExecSQL(sql); //如果數據更新成功,則返回數據更新的記錄數,如果為Begn...END返回為-1,可被 Int32.Parse 方法轉換成 int if (Int32.Parse(result) < -1) { string errMsg = MESReturnMessage.GetMESReturnMessage("MES00000190", new string[] { "R_TCQS_YIELD_RATE_DETAIL" }); throw new MESReturnMessage(errMsg + ":" + result); } }catch (Exception ee)//執行SQL異常 { string errMsg = MESReturnMessage.GetMESReturnMessage("MES00000190", new string[] { "R_TCQS_YIELD_RATE_DETAIL" }); throw new MESReturnMessage(errMsg + ":" + ee.Message); } //更新R_TMP_ATEDATA_T if (RTYRD.TOTAL_FRESH_BUILD_QTY + RTYRD.TOTAL_REWORK_BUILD_QTY > 0)//如果是過站處理,則刪除臨時表記錄 { sql = $@"Delete From R_TMP_ATEDATA_T Where SN='{SerialNo}' and Station_Name='{RTYRD.STATION_NAME}' "; } else { TRTAT = new T_R_TMP_ATEDATA_T(DB, this.DBType); RRTAT = (Row_R_TMP_ATEDATA_T)TRTAT.NewRow(); sql = $@"SELECT * FROM r_tmp_atedata_t WHERE Station_Name = '{RTYRD.STATION_NAME}' AND SN = '{SerialNo}' "; dt = DB.ExecSelect(sql).Tables[0]; //如果記錄已經存在,則Update if (dt.Rows.Count > 0) { RRTAT.loadData(dt.Rows[0]); RRTAT.DEVICE_NAME = RTYRD.DEVICE_NAME; RRTAT.PASS_COUNT = RRTAT.PASS_COUNT + RTYRD.TCQS_FRESH_PASS_QTY + RTYRD.TCQS_REWORK_PASS_QTY; RRTAT.RETEST_COUNT = RRTAT.RETEST_COUNT + RTYRD.TCQS_FRESH_FAIL_QTY + RTYRD.TCQS_REWORK_FAIL_QTY; sql = RRTAT.GetUpdateString(this.DBType); } else //記錄不存在則Insert { RRTAT.ID = TRTAT.GetNewID(Bu, DB); RRTAT.WORKORDERNO = RTYRD.WORKORDERNO; RRTAT.SKUNO = RTYRD.SKUNO; RRTAT.SN = SerialNo; RRTAT.PRODUCTION_LINE = RTYRD.PRODUCTION_LINE; RRTAT.SECTION_NAME = "1"; RRTAT.STATION_NAME = RTYRD.STATION_NAME; RRTAT.DEVICE_NAME = RTYRD.DEVICE_NAME; RRTAT.PASS_COUNT = RTYRD.TCQS_FRESH_PASS_QTY + RTYRD.TCQS_REWORK_PASS_QTY; RRTAT.RETEST_COUNT = RTYRD.TCQS_FRESH_FAIL_QTY + RTYRD.TCQS_REWORK_FAIL_QTY; RRTAT.EDIT_EMP = RTYRD.EDIT_EMP; RRTAT.EDIT_TIME = RTYRD.EDIT_TIME; sql = RRTYRD.GetInsertString(this.DBType); } } try { result = DB.ExecSQL(sql); //如果數據更新成功,則返回數據更新的記錄數,如果為Begn...END返回為-1,可被 Int32.Parse 方法轉換成 int if (Int32.Parse(result) < -1) { string errMsg = MESReturnMessage.GetMESReturnMessage("MES00000190", new string[] { "R_TMP_ATEDATA_T" }); throw new MESReturnMessage(errMsg + ":" + result); } } catch (Exception ee)//執行SQL異常 { string errMsg = MESReturnMessage.GetMESReturnMessage("MES00000190", new string[] { "R_TMP_ATEDATA_T" }); throw new MESReturnMessage(errMsg + ":" + ee.Message); } //更新R_SN_DETAIL TRSD = new T_R_SN_DETAIL(DB, this.DBType); RRSD = (Row_R_SN_DETAIL)TRSD.NewRow(); RRSD.ID = TRSD.GetNewID(Bu, DB); RRSD.SN = SerialNo; RRSD.SKUNO = RTYRD.SKUNO; RRSD.WORKORDERNO = RTYRD.WORKORDERNO; RRSD.LINE = RTYRD.PRODUCTION_LINE; RRSD.STATION_NAME = RTYRD.STATION_NAME; RRSD.DEVICE_NAME = RTYRD.DEVICE_NAME; RRSD.CLASS_NAME = RTYRD.CLASS_NAME; //如果以PASS過站,則Flag=1 if (RTYRD.TOTAL_FRESH_PASS_QTY + RTYRD.TOTAL_REWORK_PASS_QTY > 0) { RRSD.RESULT_FLAG = "1"; } else if (RTYRD.TOTAL_FRESH_FAIL_QTY + RTYRD.TOTAL_REWORK_FAIL_QTY > 0) //如果以Fail進維修,則Flag=0 { RRSD.RESULT_FLAG = "0"; } else if (RTYRD.TCQS_FRESH_PASS_QTY + RTYRD.TCQS_REWORK_PASS_QTY > 0)//如果PASS但不過站,則Flag=2 { RRSD.RESULT_FLAG = "2"; } else//如果FAIL但不過站,則Flag=3 { RRSD.RESULT_FLAG = "3"; } RRSD.EDIT_EMP = RTYRD.EDIT_EMP; RRSD.EDIT_TIME = RTYRD.EDIT_TIME; sql = RRSD.GetInsertString(this.DBType); try { result = DB.ExecSQL(sql); //如果數據更新成功,則返回數據更新的記錄數,如果為Begn...END返回為-1,可被 Int32.Parse 方法轉換成 int if (Int32.Parse(result) < -1) { string errMsg = MESReturnMessage.GetMESReturnMessage("MES00000190", new string[] { "R_SN_DETAIL" }); throw new MESReturnMessage(errMsg + ":" + result); } } catch (Exception ee)//執行SQL異常 { string errMsg = MESReturnMessage.GetMESReturnMessage("MES00000190", new string[] { "R_SN_DETAIL" }); throw new MESReturnMessage(errMsg + ":" + ee.Message); } return(result); } else { string errMsg = MESReturnMessage.GetMESReturnMessage("MES00000019", new string[] { DBType.ToString() }); throw new MESReturnMessage(errMsg); } }