using System; using System.Data.SqlClient; using System.Data; using System.Configuration; using System.IO; using System.Text; using System.Windows.Forms; using System.Drawing; using System.Diagnostics; using System.Collections.Generic; namespace M423project { public class DetectionData : IDisposable { private SqlConnection connection; private SqlConnection connForUpload; private string _standardCheckMode; int enableUploadMinutes = 10; private static readonly object synObj = new object(); public DetectionData() { string connStr = ConfigurationManager.AppSettings["connectionString"]; _standardCheckMode = ConfigurationManager.AppSettings["StandardCheckMode"]; connection = new SqlConnection(connStr); try { connection.Open(); } catch (Exception) { CommonUtil.WriteLog(LogType.Err, "连接数据库失败!"); } connForUpload = new SqlConnection(connStr); try { connForUpload.Open(); } catch (Exception) { CommonUtil.WriteLog(LogType.Err, "DataUpload连接数据库失败!"); } string enableUploadMinutesStr = ConfigurationManager.AppSettings["EnableUploadMinutes"]; int temp = 0; if (int.TryParse(enableUploadMinutesStr, out temp)) { enableUploadMinutes = temp; } else { enableUploadMinutes = 10; } } public void Dispose() { connection.Close(); connForUpload.Close(); } /// /// /// /// public int SaveProductDetection(string _productNo, int productType, OPC opc, Label label) { lock (synObj) { int result = 0; string sql = string.Format("EXEC DBO.Proc_SaveProduct '{0}','{1}' ", _productNo, productType); using (SqlCommand cmd = new SqlCommand(sql, connection)) { SqlDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { result = (int)dr.GetValue(0); } dr.Close(); } if (productType == (int)DetectionOption.doStandardBlock) { label.BackColor = Color.Green; label.Text = ""; opc.Write(OPCOutputTag.StandardCheck, true); } return result; } } public void SaveHeightData(int _detectID, double _height, double _cellHeight, MeasureState _productNoResult, MeasureState _heightResult, MeasureState _cellHeightResult, string productNo) { lock (synObj) { string sql = string.Format( " UPDATE ProductDetectionDetail " + " SET ProductHeight = {0}, " + " ProductCellHeight = {1}, " + " ProductHeightStatus = '{2}', " + " ProductCellHeightStatus = '{3}', " + " ProductNoStatus = '{4}', " + " ProductNo='{5}'," + " DetectTime = GetDATE() " + " WHERE AutoID = {6} ", _height, _cellHeight, _heightResult.ToString(), _cellHeightResult.ToString(), _productNoResult.ToString(), productNo, _detectID); using (SqlCommand cmd = new SqlCommand(sql, connection)) { cmd.ExecuteNonQuery(); } } } public void SaveSizeData(int detectID, double _length, double _width, double _cellWidth, string productState, int plantID, string imageFileName, string lengthState, string widthState, string productNo, string productNoStatus) { lock (synObj) { string sql = string.Format("UPDATE ProductDetectionDetail " + " SET ProductLength = {0}, " + " ProductWidth = {1}, " + " ProductCellWidth = {2}, " + " PlateID = {3}, " + " ImageFileName = '{4}', " + " DetectTime = GetDATE(), " + " ProductLengthStatus = '{5}', " + " ProductWidthStatus = '{6}', " + " ProductStatus = '{7}'," + " ProductNo='{8}'," + " ProductNoStatus='{9}'" //+ " CarrierBarcode='{8}'" + " WHERE AutoID = {10} ", _length, _width, _cellWidth, plantID, imageFileName, lengthState.ToString() , widthState.ToString(), productState.ToString(), productNo, productNoStatus, detectID); using (SqlCommand cmd = new SqlCommand(sql, connection)) { cmd.ExecuteNonQuery(); } } } #region add by Patrick 2018-07-13 public void SaveTrayBarcode(int detectID) { string trayCode = ""; trayCode = CarrierBarcodeCtrl.GlobalCarrierBarcode; if (string.IsNullOrEmpty(trayCode)) { return; } lock (synObj) { string sql = string.Format("UPDATE ProductDetectionDetail " + " SET CarrierBarcode='{0}'" + " WHERE AutoID = {1} ", trayCode, detectID); using (SqlCommand cmd = new SqlCommand(sql, connection)) { cmd.ExecuteNonQuery(); } } } public void SaveTrayBarcode(List detectIDList, string carrierCode = null) { //string trayCode = CarrierBarcodeCtrl.GlobalCarrierBarcode; if (carrierCode == null) { carrierCode = CarrierBarcodeCtrl.GlobalCarrierBarcode; } if (detectIDList.Count == 0) { return; } lock (synObj) { string idList = string.Join(",", detectIDList); try { string sql = $"Update ProductDetectionDetail set CarrierBarcode='{carrierCode}' where AutoID in ({idList})"; using (SqlCommand cmd = new SqlCommand(sql, connection)) { cmd.ExecuteNonQuery(); } Trace.TraceInformation($"{idList}产品绑定载具码:{carrierCode}"); } catch (Exception ex) { Trace.TraceError($"{idList}产品绑定载具码:{carrierCode}异常:{ex.Message}"); //throw; } } } #endregion #region add by Patrick 2019-04-16 public void SaveSpotCheck(int detectID) { lock (synObj) { string sql = string.Format("UPDATE ProductDetectionDetail " + " SET IsSample={0}" + " WHERE AutoID = {1} ", 1, detectID); using (SqlCommand cmd = new SqlCommand(sql, connection)) { cmd.ExecuteNonQuery(); } } } #endregion public DataTable Query(string sql) { DataTable dt = new DataTable(); using (SqlCommand cmd = new SqlCommand(sql, connection)) { SqlDataReader dr = cmd.ExecuteReader(); dt.Load(dr); } return dt; } public DataTable QueryUnloadData() { DataTable dt = new DataTable(); //string sql = string.Format(@"SELECT TOP 100 AutoID,PlateID, ProductNo,CarrierBarcode,DetectTime,ProductStatus,ProductLengthStatus // ,ProductWidthStatus,ProductHeightStatus,ProductNoStatus,LocalUploadFlag = cast(0 as int),ProductLength,ProductWidth,ProductHeight,IsSample // FROM ProductDetectionDetail // WHERE ISNULL(UploadFlag, 0) = 0 AND ISNULL(ProductType,0)=0 // AND ProductLengthStatus <> 'UNKNOWN' // AND ProductWidthStatus <> 'UNKNOWN' // AND ((ProductNoStatus = 'OK' AND ISNULL(CarrierBarcode,'')<>'') OR (ProductNoStatus = 'OK' AND ProductStatus = 'NG' AND ISNULL(CarrierBarcode,'')='')) // AND DATEDIFF(DAY,'2019-11-29',DetectTime)>=0 // ORDER BY DetectTime DESC"); string sql = string.Format(@"SELECT TOP 100 AutoID,PlateID, ProductNo,CarrierBarcode,DetectTime,ProductStatus,ProductLengthStatus ,ProductWidthStatus,ProductHeightStatus,ProductNoStatus,LocalUploadFlag = cast(0 as int),ProductLength,ProductWidth,ProductHeight,IsSample FROM ProductDetectionDetail WHERE ISNULL(UploadFlag, 0) = 0 AND ISNULL(ProductType,0)=0 AND ProductLengthStatus <> 'UNKNOWN' AND ProductWidthStatus <> 'UNKNOWN' AND ProductNoStatus = 'OK' AND ProductStatus<>'NA' AND (ISNULL(CarrierBarcode,'')<>'' OR ProductStatus = 'NG') AND DATEDIFF(MINUTE,DetectTime,'{0}')<={1} ORDER BY DetectTime DESC", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), enableUploadMinutes.ToString()); SqlDataReader dr = null; using (SqlCommand cmd = new SqlCommand(sql, connForUpload)) { try { dr = cmd.ExecuteReader(); dt.Load(dr); } catch (Exception e) { CommonUtil.WriteLog(LogType.Inf, string.Format("获取待上传数据时出现异常:{0}", e.Message)); } finally { if (dr != null) dr.Close(); } } return dt; } public int SetUploadDataStatus(string _autoIDList) { int result = 0; string sql = string.Format("EXEC Proc_UpdateUploadStatus '{0}' ", _autoIDList); using (SqlCommand cmd = new SqlCommand(sql, connForUpload)) { SqlDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { result = (int)dr.GetValue(0); } dr.Close(); } return result; } public void CleanData() { lock (synObj) { try { string sql = string.Format("DELETE FROM ProductDetectionDetail WHERE DetectTime < GetDATE() - 40 "); using (SqlCommand cmd = new SqlCommand(sql, connection)) { cmd.ExecuteNonQuery(); } } catch (Exception) { } } } static object csvLock = new object(); public void SaveToCsv(ProductMeasureResult pmr) { string fileName = @"E:\DailyReport\detectdata" + DateTime.Now.ToString("yyyyMMdd") + ".csv"; CSVDataRecord(pmr, fileName); } public void CSVDataRecord(ProductMeasureResult pmr, string fileName) { bool IsNewFile = !File.Exists(fileName); lock (csvLock) { using (FileStream myStream = new FileStream(fileName, FileMode.OpenOrCreate)) { myStream.Seek(0, SeekOrigin.End); using (StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.UTF8)) { try { if (IsNewFile) { sw.WriteLine("檢測編號,檢測時間,工位,序列碼,判定,FAI9,判定,FAI2,判定,FAI3,判定,FAI12,判定,結果,类型"); } string data = $"{pmr.DetectID}," + $"{pmr.DetectTime.ToString("HH:mm:ss")}," + $"{pmr.PlateID},{pmr.ProductNo}," + $"{GetMeasureResult(pmr.ProductNoResult)}," + $"{GetMeasureValueStr(pmr.Height)}," + $"{GetMeasureResult(pmr.HeightResult)}," + $"{GetMeasureValueStr(pmr.CellHeight)}," + $"{GetMeasureResult(pmr.CellHeightResult)}," + $"{GetMeasureValueStr(pmr.Length)}," + $"{GetMeasureResult(pmr.LengthResult)}," + $"{GetMeasureValueStr(pmr.Width)}," + $"{GetMeasureResult(pmr.WidthResult)}," + $"{GetMeasureResult(pmr.ProductResult)}," + $"{(CommonUtil.DetectionOption == DetectionOption.doProduct ? "产品" : "标准块")}"; sw.WriteLine(data); sw.Flush(); //sw.WriteLine( // string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14}", // pmr.DetectID, pmr.DetectTime.ToString("HH:mm:ss") // , pmr.PlateID, pmr.ProductNo, pmr.ProductNoResult.ToString() // , pmr.Height.ToString("0.00000") // , pmr.HeightResult.ToString() // , pmr.CellHeight.ToString("0.00000") // , pmr.CellHeightResult // , pmr.Length.ToString("0.00000") // , pmr.LengthResult.ToString() // , pmr.Width.ToString("0.00000") // , pmr.WidthResult.ToString(), // pmr.ProductResult.ToString(), // CommonUtil.DetectionOption == DetectionOption.doProduct ? "产品" : "标准块" // )); } catch (Exception e) { CommonUtil.WriteLog(LogType.Inf, string.Format("记录检测结果出现异常:{0}", e.Message)); } } } } } private string GetMeasureValueStr(double measureValue) { return (measureValue == 999.999 || measureValue == -999.999 || measureValue == CommonUtil.InvalidValue) ? "NA" : measureValue.ToString("f5"); } private string GetMeasureResult(string result) { return result == "OK" ? "OK" : "NG"; } public bool IsStandardCheck() { try { int count = 0; if (_standardCheckMode == "0") { return true; } StringBuilder sb = new StringBuilder(); sb.AppendFormat(@"select COUNT(AutoID) from ProductDetectionDetail WHERE ProductType=1 AND DATEDIFF({0},GETDATE(),DetectTime)=0", _standardCheckMode == "1" ? "WEEK" : "MONTH"); using (SqlCommand cmd = new SqlCommand(sb.ToString(), connection)) { count = Convert.ToInt32(cmd.ExecuteScalar()); } return count > 0; } catch (Exception ex) { return false; } } } }