904 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			904 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Drawing;
 | |
| using System.Linq;
 | |
| using System.Security.Cryptography;
 | |
| using System.Text;
 | |
| using AR;
 | |
| using Project.Class;
 | |
| 
 | |
| namespace Project
 | |
| {
 | |
|     public partial class FMain
 | |
|     {
 | |
|         public enum EResultKeyence
 | |
|         {
 | |
|             Wait = 0,
 | |
|             Complete,
 | |
|             TimeOut,
 | |
|             MultiSID,
 | |
|         }
 | |
|         public EResultKeyence KEYENCE_READ(eWorkPort target, eSMStep cmdIndex)
 | |
|         {
 | |
|             UInt16 idx = 1;
 | |
|             var mv = PUB.Result.vModel;
 | |
|             var mc = PUB.Result.mModel;
 | |
|             var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name;
 | |
|             var seqTime = PUB.sm.seq.GetTime(cmdIndex);
 | |
|             var msgType = (Class.eStatusMesage)target;
 | |
|             var itemC = PUB.Result.ItemDataC;
 | |
|             if (PUB.sm.getNewStep != eSMStep.RUN) return EResultKeyence.Wait;
 | |
|             //var Jobtype = VAR.STR[eVarString.JOB_TYPE];
 | |
| 
 | |
|             var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
 | |
|             var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target);
 | |
|             var OPT_CameraOff = PUB.OPT_CAMERA(target);
 | |
|             var OPT_BYPASS = PUB.OPT_BYPASS();
 | |
| 
 | |
|             //데이터가 완료되었는지 확인
 | |
|             if (itemC.VisionData.Confirm)
 | |
|             {
 | |
|                 PUB.log.AddAT("Removing barcode messages due to vision data completion");
 | |
|                 itemC.VisionData.bcdMessage.Clear();
 | |
|                 return EResultKeyence.Complete;
 | |
|             }
 | |
| 
 | |
|             //사용자 입력 대기중이면 아에 처리하지 않는다 210203
 | |
|             if (PUB.flag.get(eVarBool.FG_WAIT_LOADERINFO) == true)
 | |
|             {
 | |
|                 PUB.WaitMessage[1] = "Wait for User Confirm Interface";
 | |
|                 return EResultKeyence.Wait;
 | |
|             }
 | |
| 
 | |
|             //####################################################
 | |
|             //###	작업시작
 | |
|             //####################################################
 | |
|             if (PUB.sm.seq.Get(cmdIndex) == idx++)
 | |
|             {
 | |
|                 if (PUB.Result.DryRun)
 | |
|                 {
 | |
|                     PUB.log.Add($"[{target}] Completed due to DRY-RUN");
 | |
|                     SetDryrunData();
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     PUB.logDbg.Add($"[{target}] Keyence reading started");
 | |
|                     if (PUB.keyenceF != null) PUB.keyenceF.Trigger(true);
 | |
|                     if (PUB.keyenceR != null) PUB.keyenceR.Trigger(true);
 | |
|                 }
 | |
| 
 | |
|                 VAR.BOOL[eVarBool.Need_UserConfirm_Data] = false;
 | |
|                 VAR.STR[eVarString.MULTISID_FIELDS] = string.Empty;
 | |
|                 VAR.STR[eVarString.MULTISID_QUERY] = string.Empty;
 | |
|                 VAR.TIME.Update(eVarTime.KEYENCEWAIT);
 | |
|                 PUB.sm.seq.Update(cmdIndex);
 | |
|                 return EResultKeyence.Wait;
 | |
|             }
 | |
| 
 | |
|             //####################################################
 | |
|             //###
 | |
|             //####################################################
 | |
|             if (PUB.sm.seq.Get(cmdIndex) == idx++)
 | |
|             {
 | |
|                 //아무것도안함
 | |
|                 PUB.sm.seq.Update(cmdIndex);
 | |
|                 return EResultKeyence.Wait;
 | |
|             }
 | |
| 
 | |
|             //####################################################
 | |
|             //###	키엔스데이터를 처리해준다.
 | |
|             //####################################################
 | |
|             if (PUB.sm.seq.Get(cmdIndex) == idx++)
 | |
|             {
 | |
|                 bool vQtyOK = false;
 | |
|                 var vdata = itemC.VisionData;
 | |
|                 //동작중이아니라면 처리하지 않음
 | |
|                 if (PUB.sm.getNewStep != eSMStep.RUN) return EResultKeyence.Wait;
 | |
| 
 | |
|                 //바이패스라면 무조건ok한다.
 | |
|                 var systembypassmode = SETTING.Data.SystemBypass;
 | |
|                 if (systembypassmode && PUB.flag.get(eVarBool.FG_RDY_PORT_PC))
 | |
|                 {
 | |
|                     vdata.SetRID("BP" + DateTime.Now.ToString("yyyyMMddHHmmss"), "bp");
 | |
|                     vdata.SID = ("100000000");
 | |
|                     vdata.VNAME = "BYPASS";
 | |
|                     vdata.MFGDATE = DateTime.Now.ToString("yyyy-MM-dd");
 | |
|                     vdata.VLOT = "BYPASS";
 | |
|                     vdata.CUSTCODE = "0000";
 | |
|                     vdata.CUSTNAME = "BYPASS";
 | |
|                     vdata.QTY = "10000";
 | |
|                     vdata.ConfirmUser = true;
 | |
|                     vdata.PrintPositionData = "1";
 | |
|                     vdata.PrintPositionCheck = true;
 | |
|                     vdata.MFGDATE_Trust = true;
 | |
|                     vdata.PARTNO_Trust = true;
 | |
|                     vdata.QTY_Trust = true;
 | |
|                     vdata.RID_Trust = true;
 | |
|                     vdata.SID_Trust = true;
 | |
|                     vdata.VLOT_Trust = true;
 | |
|                     vdata.VNAME_Trust = true;
 | |
|                     return EResultKeyence.Complete;
 | |
|                 }
 | |
| 
 | |
|                 //로더정보를 사용자가 처리중이면 동작 안함
 | |
|                 if (VAR.BOOL[eVarBool.FG_WAIT_LOADERINFO]) return EResultKeyence.TimeOut;
 | |
| 
 | |
|                 //다중SID환경에서 데이터를 선택하고 있다.
 | |
|                 if (VAR.BOOL[eVarBool.FG_WAIT_INFOSELECT]) return EResultKeyence.Wait;
 | |
| 
 | |
|                 //데이터 처리 시간을 넘어서면 사용자 확인 창을 띄운다 220621
 | |
|                 var ts = VAR.TIME.RUN((int)eVarTime.KEYENCEWAIT);
 | |
|                 if (VAR.BOOL[eVarBool.FG_RDY_PORT_PC] && ts.TotalMilliseconds > AR.SETTING.Data.Timeout_VisionProcessL)
 | |
|                 {
 | |
|                     //화면업데이트를 종료한다
 | |
|                     if (PUB.keyenceF != null) PUB.keyenceF.Trigger(false);
 | |
|                     if (PUB.keyenceR != null) PUB.keyenceR.Trigger(false);
 | |
| 
 | |
|                     //이미지저장용 작업시작
 | |
|                     var tempfileF = System.IO.Path.Combine(UTIL.CurrentPath, "Temp", "Image", DateTime.Now.ToString("yyyMMddHhmmss_fff" + "F.bmp"));
 | |
|                     var tempfileR = System.IO.Path.Combine(UTIL.CurrentPath, "Temp", "Image", DateTime.Now.ToString("yyyMMddHhmmss_fff" + "R.bmp"));
 | |
|                     var tempfiF = new System.IO.FileInfo(tempfileF);
 | |
|                     var tempfiR = new System.IO.FileInfo(tempfileR);
 | |
|                     if (tempfiF.Directory.Exists == false) tempfiF.Directory.Create();
 | |
|                     if (tempfiR.Directory.Exists == false) tempfiR.Directory.Create();
 | |
| 
 | |
|                     //마지막 사진을 추출한다
 | |
|                     var CurImageF = PUB.keyenceF.SaveImage(tempfiF.FullName);
 | |
|                     var CurImageR = false;
 | |
|                     if (PUB.keyenceR != null) CurImageR = PUB.keyenceR.SaveImage(tempfiR.FullName);
 | |
|                     if (CurImageF && CurImageR)
 | |
|                     {
 | |
|                         itemC.VisionData.SetImage(
 | |
|                             new Emgu.CV.Mat(tempfiF.FullName, Emgu.CV.CvEnum.ImreadModes.Grayscale),
 | |
|                             new Emgu.CV.Mat(tempfiR.FullName, Emgu.CV.CvEnum.ImreadModes.Grayscale));
 | |
|                     }
 | |
|                     else if (CurImageF)
 | |
|                     {
 | |
|                         itemC.VisionData.SetImage(new Emgu.CV.Mat(tempfiF.FullName, Emgu.CV.CvEnum.ImreadModes.Grayscale));
 | |
|                     }
 | |
|                     PUB.keyenceF.Trigger(true);
 | |
|                     PUB.keyenceR.Trigger(true);
 | |
|                     return EResultKeyence.TimeOut;
 | |
|                 }
 | |
| 
 | |
|                 //수량임의 입력의 경우
 | |
|                 if (VAR.BOOL[eVarBool.Opt_UserQtyRQ])
 | |
|                 {
 | |
|                     if (itemC.VisionData.QTYRQ) vQtyOK = true; ////RQ의 값이 들어있으면 성공
 | |
|                     else vQtyOK = false; //수량임의모드인데 RQ값이 들어있지않으면 자동진행하지 않는다
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     //자동에서는 수량값이 들어있으면 바로 넘어가게한다.
 | |
|                     vQtyOK = itemC.VisionData.QTY.isEmpty() == false;
 | |
|                 }
 | |
| 
 | |
|                 //커스터머 이름 확인
 | |
|                 if (OPT_BYPASS == false && (itemC.VisionData.CUSTNAME.isEmpty() && itemC.VisionData.CUSTCODE.isEmpty() == false))
 | |
|                 {
 | |
|                     var qta = new DataSet1TableAdapters.QueriesTableAdapter();
 | |
|                     var custname = qta.GetCustName(itemC.VisionData.CUSTCODE);
 | |
|                     if (custname.isEmpty() == false)
 | |
|                     {
 | |
|                         PUB.log.Add($"New CustName => {custname}");
 | |
|                         itemC.VisionData.CUSTNAME = custname;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 //기본 벤더이름
 | |
|                 if (OPT_BYPASS == false && PUB.Result.vModel.Def_Vname.isEmpty() == false)
 | |
|                 {
 | |
|                     if (itemC.VisionData.VNAME.Equals(PUB.Result.vModel.Def_Vname) == false)
 | |
|                     {
 | |
|                         itemC.VisionData.VNAME = PUB.Result.vModel.Def_Vname;
 | |
|                         itemC.VisionData.VNAME_Trust = true;
 | |
|                         PUB.log.Add($"Defaul V.Name Set to {PUB.Result.vModel.Def_Vname}");
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 //기본 MFG
 | |
|                 if (OPT_BYPASS == false && PUB.Result.vModel.Def_MFG.isEmpty() == false)
 | |
|                 {
 | |
|                     if (itemC.VisionData.MFGDATE.Equals(PUB.Result.vModel.Def_MFG) == false)
 | |
|                     {
 | |
|                         itemC.VisionData.MFGDATE = PUB.Result.vModel.Def_MFG;
 | |
|                         itemC.VisionData.MFGDATE_Trust = true;
 | |
|                         PUB.log.Add($"Defaul MFGDATE Set to {PUB.Result.vModel.Def_MFG}");
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 //옵션설정에 따른 외부데이터 가져오기 작업
 | |
|                 bool NewBarcodeUpdated = false;
 | |
| 
 | |
| 
 | |
|                 //[WMS] SID정보테이블에서 정보 추출(프린트정보는 없음)
 | |
|                 //[WMS] 에서 중복검색되면 팝업을 해야하므로 이것을 먼저 처리한다.
 | |
|                 if (VAR.BOOL[eVarBool.Opt_ApplySIDInfo] && vdata.BarcodeDirty == true)
 | |
|                 {
 | |
|                     Boolean Apply = true;
 | |
| 
 | |
|                     //select columns
 | |
|                     List<string> fields = new List<string>();
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_CustCode] && vdata.CUSTCODE.isEmpty()) fields.Add("CUST_CODE");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_PartNo] && (vdata.PARTNO.isEmpty() || vdata.PARTNO_Trust == false)) fields.Add("PART_NO");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_VenderName] && (vdata.VNAME_Trust == false || vdata.VNAME.isEmpty())) fields.Add("VENDOR_NM");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_SID] && (vdata.SID_Trust == false || vdata.SID.isEmpty())) fields.Add("SID");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_batch] && (vdata.SID_Trust == false || vdata.BATCH.isEmpty())) fields.Add("BATCH_NO"); //220921
 | |
| 
 | |
|                     //where coluns
 | |
|                     List<string> wheres = new List<string>();
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_SID_Where_CustCode])
 | |
|                     {
 | |
|                         if (vdata.CUSTCODE.isEmpty() == false) wheres.Add($"CUST_CODE='{vdata.CUSTCODE}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_SID_Where_PartNo])
 | |
|                     {
 | |
|                         if (vdata.PARTNO_Trust && vdata.PARTNO.isEmpty() == false) wheres.Add($"PART_NO='{vdata.PARTNO}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_SID_Where_SID])
 | |
|                     {
 | |
|                         if (VAR.BOOL[eVarBool.Opt_SIDConvert]) //if sid convert logic
 | |
|                         {
 | |
|                             if (vdata.SID_Trust && vdata.SID0.isEmpty() == false && vdata.SID.isEmpty() == false) wheres.Add($"SID='{vdata.SID}'");
 | |
|                             else Apply = false;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             if (vdata.SID_Trust && vdata.SID.isEmpty() == false) wheres.Add($"SID='{vdata.SID}'");
 | |
|                             else Apply = false;
 | |
|                         }
 | |
|                     }
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_SID_Where_VLOT])  //221013
 | |
|                     {
 | |
|                         if (vdata.VLOT_Trust && vdata.VLOT.isEmpty() == false) wheres.Add($"VENDER_LOT = '{vdata.VLOT}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
| 
 | |
|                     //if query data . no error
 | |
|                     if (Apply && fields.Count > 0 && wheres.Count > 0)
 | |
|                     {
 | |
|                         var mcname = VAR.BOOL[eVarBool.Use_Conveyor] ? PUB.MCCode : SETTING.Data.McName;
 | |
| 
 | |
|                         var TableName = "VW_GET_MAX_QTY_VENDOR_LOT";
 | |
|                         var whereState = " where " + string.Join(" and ", wheres);
 | |
|                         var selectFields = string.Join(",", fields);
 | |
| 
 | |
|                         var SQL = $"select top 1 {selectFields} from {TableName} WITH(NOLOCK) {whereState}";
 | |
|                         var SQLC = $"select count(*)  from {TableName} WITH(NOLOCK) {whereState}";
 | |
| 
 | |
|                         //정보가 여러개 존재하면 선택화면으로 처리해야한다
 | |
|                         var cntvalue = (DBHelper.ExecuteScalar(SQLC)?.ToString() ?? "0").toInt();
 | |
|                         if (cntvalue > 1)
 | |
|                         {
 | |
|                             VAR.STR[eVarString.MULTISID_QUERY] = $"select {selectFields} from {TableName} WITH(NOLOCK) {whereState}";
 | |
|                             VAR.STR[eVarString.MULTISID_FIELDS] = selectFields;
 | |
|                             return EResultKeyence.MultiSID;
 | |
|                         }
 | |
| 
 | |
|                         if (PUB.Result.ItemDataC.VisionData.LastQueryStringWMS.Equals(SQL) == false) //같은 쿼리는 처리하지 않는다
 | |
|                         {
 | |
|                             if (PUB.GetSIDInfo_And_SetData(fields, ref vdata, SQL, SQLC))
 | |
|                                 NewBarcodeUpdated = true;
 | |
| 
 | |
|                             PUB.Result.ItemDataC.VisionData.LastQueryStringWMS = SQL;
 | |
|                         }
 | |
| 
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 //SID정보테이블에서 정보 추출
 | |
|                 if (VAR.BOOL[eVarBool.Opt_ApplySIDInfo] && vdata.BarcodeDirty == true)
 | |
|                 {
 | |
|                     Boolean Apply = true;
 | |
| 
 | |
|                     //select columns
 | |
|                     List<string> fields = new List<string>();
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_CustCode] && vdata.CUSTCODE.isEmpty()) fields.Add("CustCode");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_PartNo] && (vdata.PARTNO.isEmpty() || vdata.PARTNO_Trust == false)) fields.Add("PartNo");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_PrintPos] && vdata.PrintPositionData.isEmpty()) fields.Add("PrintPosition");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_VenderName] && (vdata.VNAME_Trust == false || vdata.VNAME.isEmpty())) fields.Add("VenderName");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_SID] && (vdata.SID_Trust == false || vdata.SID.isEmpty())) fields.Add("SID");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_batch] && (vdata.SID_Trust == false || vdata.BATCH.isEmpty())) fields.Add("batch"); //220921
 | |
|                     if (VAR.BOOL[eVarBool.Opt_SID_Apply_qty] && (vdata.SID_Trust == false || vdata.QTYMAX.isEmpty())) fields.Add("qtymax"); //220921
 | |
|                     fields.Add("attach"); //231026
 | |
| 
 | |
|                     //where coluns
 | |
|                     List<string> wheres = new List<string>();
 | |
|                     //wheres.Add($"MC='{COMM.SETTING.Data.McName}");
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_SID_Where_CustCode])
 | |
|                     {
 | |
|                         if (vdata.CUSTCODE.isEmpty() == false) wheres.Add($"CustCode='{vdata.CUSTCODE}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_SID_Where_PartNo])
 | |
|                     {
 | |
|                         if (vdata.PARTNO_Trust && vdata.PARTNO.isEmpty() == false) wheres.Add($"PartNo='{vdata.PARTNO}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_SID_Where_SID])
 | |
|                     {
 | |
|                         if (VAR.BOOL[eVarBool.Opt_SIDConvert]) //if sid convert logic
 | |
|                         {
 | |
|                             if (vdata.SID_Trust && vdata.SID0.isEmpty() == false && vdata.SID.isEmpty() == false)
 | |
|                                 wheres.Add($"SID='{vdata.SID}'");
 | |
|                             else Apply = false;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             if (vdata.SID_Trust && vdata.SID.isEmpty() == false) wheres.Add($"SID='{vdata.SID}'");
 | |
|                             else Apply = false;
 | |
|                         }
 | |
|                     }
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_SID_Where_VLOT])  //221013
 | |
|                     {
 | |
|                         if (vdata.VLOT_Trust && vdata.VLOT.isEmpty() == false)
 | |
|                             wheres.Add($"(VenderLot like '{vdata.VLOT}' or VenderLot like '%,{vdata.VLOT}' or VenderLot like '{vdata.VLOT},%' or VenderLot like '%,{vdata.VLOT},%')");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
| 
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_SID_Where_MC])  //231006
 | |
|                     {
 | |
|                         if (AR.SETTING.Data.McName.isEmpty() == false)
 | |
|                             wheres.Add($"attach='{AR.SETTING.Data.McName}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
| 
 | |
|                     //if query data . no error
 | |
|                     if (Apply && fields.Count > 0 && wheres.Count > 0)
 | |
|                     {
 | |
| 
 | |
|                         var mcname = SETTING.Data.McName;
 | |
|                         if (VAR.BOOL[eVarBool.Use_Conveyor]) mcname = PUB.MCCode;
 | |
| 
 | |
|                         var SQL = "select top 1 " + string.Join(",", fields) +
 | |
|                             " from K4EE_Component_Reel_SID_Information WITH(NOLOCK)" +
 | |
|                             " where mc='" + mcname + "' and " + string.Join(" and ", wheres) +
 | |
|                             " order by wdate desc";
 | |
| 
 | |
|                         var SQLC = "select count(*)" +
 | |
|                       " from K4EE_Component_Reel_SID_Information WITH(NOLOCK)" +
 | |
|                       " where mc='" + mcname + "' and " + string.Join(" and ", wheres);
 | |
| 
 | |
|                         if (PUB.Result.ItemDataC.VisionData.LastQueryStringSID.Equals(SQL) == false)
 | |
|                         {
 | |
|                             if (PUB.GetSIDInfo_And_SetData(fields, ref vdata, SQL, SQLC) == true)
 | |
|                                 NewBarcodeUpdated = true;
 | |
| 
 | |
|                             PUB.Result.ItemDataC.VisionData.LastQueryStringSID = SQL;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 //시드변환정보에서 정보 추출
 | |
|                 if (VAR.BOOL[eVarBool.Opt_ApplySIDConv] && vdata.BarcodeDirty == true)
 | |
|                 {
 | |
|                     Boolean Apply = true;
 | |
| 
 | |
|                     //select columns
 | |
|                     List<string> fields = new List<string>();
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Conv_Apply_CustCode] && vdata.CUSTCODE.isEmpty()) fields.Add("CustCode");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Conv_Apply_PartNo] && (vdata.PARTNO.isEmpty() || vdata.PARTNO_Trust == false)) fields.Add("PartNo");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Conv_Apply_PrintPos] && vdata.PrintPositionData.isEmpty()) fields.Add("PrintPosition");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Conv_Apply_VenderName] && (vdata.VNAME_Trust == false || vdata.VNAME.isEmpty())) fields.Add("VenderName");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Conv_Apply_SID] && (vdata.SID_Trust == false || vdata.SID.isEmpty())) fields.Add("SID");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Conv_Apply_Batch] && (vdata.SID_Trust == false || vdata.BATCH.isEmpty())) fields.Add("batch"); //220921
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Conv_Apply_QtyMax] && (vdata.SID_Trust == false || vdata.QTYMAX.isEmpty())) fields.Add("qtymax"); //220921
 | |
| 
 | |
| 
 | |
|                     //where coluns
 | |
|                     List<string> wheres = new List<string>();
 | |
|                     //wheres.Add($"MC='{COMM.SETTING.Data.McName}");
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_Conv_Where_CustCode])
 | |
|                     {
 | |
|                         if (vdata.CUSTCODE.isEmpty() == false) wheres.Add($"CustCode='{vdata.CUSTCODE}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_Conv_Where_PartNo])
 | |
|                     {
 | |
|                         if (vdata.PARTNO_Trust && vdata.PARTNO.isEmpty() == false) wheres.Add($"PartNo='{vdata.PARTNO}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
|                     if (Apply && VAR.BOOL[eVarBool.Opt_Conv_Where_SID])
 | |
|                     {
 | |
|                         if (VAR.BOOL[eVarBool.Opt_SIDConvert]) //if sid convert logic
 | |
|                         {
 | |
|                             if (vdata.SID_Trust && vdata.SID0.isEmpty() == false && vdata.SID.isEmpty() == false)
 | |
|                                 wheres.Add($"SIDTo='{vdata.SID}'");
 | |
|                             else Apply = false;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             if (vdata.SID_Trust && vdata.SID.isEmpty() == false) wheres.Add($"SIDTo='{vdata.SID}'");
 | |
|                             else Apply = false;
 | |
|                         }
 | |
|                     }
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Conv_Where_VLOT])  //221013
 | |
|                     {
 | |
|                         if (vdata.VLOT_Trust && vdata.VLOT.isEmpty() == false)
 | |
|                             wheres.Add($"(VenderLot like '{vdata.VLOT}' or VenderLot like '%,{vdata.VLOT}' or VenderLot like '{vdata.VLOT},%' or VenderLot like '%,{vdata.VLOT},%')");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
| 
 | |
| 
 | |
|                     //if query data . no error
 | |
|                     if (Apply && fields.Count > 0 && wheres.Count > 0)
 | |
|                     {
 | |
| 
 | |
|                         var mcname = SETTING.Data.McName;
 | |
|                         if (VAR.BOOL[eVarBool.Use_Conveyor]) mcname = PUB.MCCode;
 | |
| 
 | |
|                         var SQL = "select top 1 " + string.Join(",", fields) +
 | |
|                             " from K4EE_Component_Reel_SID_Convert WITH(NOLOCK)" +
 | |
|                             " where " + string.Join(" and ", wheres) +
 | |
|                             " order by wdate desc";
 | |
| 
 | |
|                         var SQLC = "select count(*)" +
 | |
|                       " from K4EE_Component_Reel_SID_Convert WITH(NOLOCK)" +
 | |
|                       " where " + string.Join(" and ", wheres);
 | |
| 
 | |
|                         if (PUB.Result.ItemDataC.VisionData.LastQueryStringCNV.Equals(SQL) == false)
 | |
|                         {
 | |
|                             if (PUB.GetSIDInfo_And_SetData(fields, ref vdata, SQL, SQLC) == true)
 | |
|                                 NewBarcodeUpdated = true;
 | |
| 
 | |
|                             PUB.Result.ItemDataC.VisionData.LastQueryStringCNV = SQL;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 //기존 작업에서 데이터를 찾아서 쓴다
 | |
|                 if (VAR.BOOL[eVarBool.Opt_ApplyJobInfo] && vdata.BarcodeDirty == true)
 | |
|                 {
 | |
|                     Boolean Apply = true;
 | |
| 
 | |
|                     //select columns
 | |
|                     List<string> fields = new List<string>();
 | |
| 
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Job_Apply_CustCode] && vdata.CUSTCODE.isEmpty()) fields.Add("CUSTCODE");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Job_Apply_PartNo] && (vdata.PARTNO.isEmpty() || vdata.PARTNO_Trust == false)) fields.Add("PARTNO");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Job_Apply_PrintPos] && vdata.PrintPositionData.isEmpty()) fields.Add("POS");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Job_Apply_VenderName] && (vdata.VNAME_Trust == false || vdata.VNAME.isEmpty())) fields.Add("VNAME");
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Job_Apply_SID] && (vdata.SID_Trust == false || vdata.SID.isEmpty())) fields.Add("SID");
 | |
| 
 | |
|                     //where coluns
 | |
|                     List<string> wheres = new List<string>();
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Job_Where_CustCode])
 | |
|                     {
 | |
|                         if (vdata.CUSTCODE.isEmpty() == false) wheres.Add($"CUSTCODE='{vdata.CUSTCODE}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Job_Where_PartNo])
 | |
|                     {
 | |
|                         if (vdata.PARTNO_Trust && vdata.PARTNO.isEmpty() == false) wheres.Add($"PARTNO='{vdata.PARTNO}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Job_Where_SID])
 | |
|                     {
 | |
|                         if (vdata.SID_Trust && vdata.SID.isEmpty() == false) wheres.Add($"SID='{vdata.SID}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
|                     if (VAR.BOOL[eVarBool.Opt_Job_Where_VLOT])
 | |
|                     {
 | |
|                         if (vdata.VLOT_Trust && vdata.VLOT.isEmpty() == false) wheres.Add($"VenderLot='{vdata.VLOT}'");
 | |
|                         else Apply = false;
 | |
|                     }
 | |
| 
 | |
|                     //if query data . no error
 | |
|                     if (Apply && fields.Count > 0 && wheres.Count > 0)
 | |
|                     {
 | |
|                         PUB.log.Add($"DATABAES : RESULT QUERY");
 | |
| 
 | |
|                         var SQL = "select top 1 " + string.Join(",", fields) +
 | |
|                             " from K4EE_Component_Reel_Result WITH(NOLOCK) " +
 | |
|                             $" where mc = '{AR.SETTING.Data.McName}'" +
 | |
|                             $" and  prnattach = 1 and  stime >= '{DateTime.Now.AddHours(-3).ToString("yyyy-MM-dd HH:mm:ss")}'" +
 | |
|                             $" and " + string.Join(" and ", wheres) +
 | |
|                             $" order by wdate desc";
 | |
| 
 | |
|                         if (PUB.Result.ItemDataC.VisionData.LastQueryStringJOB.Equals(SQL) == false)
 | |
|                         {
 | |
|                             if (PUB.GetSIDInfo_And_SetData(fields, ref vdata, SQL, ""))
 | |
|                                 NewBarcodeUpdated = true;
 | |
| 
 | |
|                             PUB.Result.ItemDataC.VisionData.LastQueryStringJOB = SQL;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 //해당 바코드작업이 완료되었는지 확인한다. 신규 바코드값이 업데이트되면 한번더 동작하도록 한다
 | |
|                 if (itemC.VisionData.BarcodeDirty == true && NewBarcodeUpdated == false)
 | |
|                 {
 | |
|                     itemC.VisionData.BarcodeDirty = false;
 | |
|                 }
 | |
| 
 | |
|                 //릴Id 신규부여
 | |
|                 if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_NewReelID])
 | |
|                 {
 | |
|                     if (itemC.VisionData.RIDNew == false && itemC.VisionData.CUSTCODE.isEmpty() == false && itemC.VisionData.SID.isEmpty() == false)
 | |
|                     {
 | |
|                         var newid = PUB.MakeNewREELID(itemC.VisionData.SID);// Amkor.RestfulService.Allocation_Unique_ReelID_AmkorSTD(itemC.VisionData.CUSTCODE, "4", "A", out string errmsg);
 | |
|                         if (newid.success == true)
 | |
|                         {
 | |
|                             //backup origin reel id
 | |
|                             itemC.VisionData.RID0 = itemC.VisionData.RID;
 | |
| 
 | |
|                             //set new reel id
 | |
|                             itemC.VisionData.SetRID(newid.newid, "SPS:CHKDATACOMPLETE");// = newid;
 | |
|                             itemC.VisionData.RIDNew = true; //applied new reel id
 | |
| 
 | |
|                             //서버의수량업데이트기능이 켜져있다면 해당 값을 제거해준다. (다시 조회되도록 함)
 | |
|                             if (VAR.BOOL[eVarBool.Opt_ServerQty])
 | |
|                             {
 | |
|                                 //이미 수량업데이트된 경우이므로 복원시켜준다
 | |
|                                 if (itemC.VisionData.QTY0.isEmpty() == false)
 | |
|                                 {
 | |
|                                     PUB.log.AddAT($"Restoring quantity due to reel ID change ({itemC.VisionData.QTY}->{itemC.VisionData.QTY0})");
 | |
|                                     itemC.VisionData.QTY = itemC.VisionData.QTY0;
 | |
|                                     itemC.VisionData.QTY0 = string.Empty;
 | |
|                                 }
 | |
|                             }
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             var logtime = VAR.TIME.RUN((int)eVarTime.LOG_NEWIDERROR);
 | |
|                             if (logtime.TotalSeconds >= 3000)
 | |
|                             {
 | |
|                                 PUB.log.AddAT($"Reel_ID generation failed : {newid.message}");
 | |
|                                 VAR.TIME.Update(eVarTime.LOG_NEWIDERROR);
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 //데이터확정 및 완료처리
 | |
|                 if (itemC.VisionData.Confirm)
 | |
|                 {
 | |
|                     //이미 완료된 데이터
 | |
|                     if (itemC.VisionData.ConfirmAuto)
 | |
|                         PUB.log.AddI($"Proceeding due to data confirmation completion (automatic)");
 | |
|                     else if (itemC.VisionData.ConfirmUser)
 | |
|                         PUB.log.AddI($"Proceeding due to data confirmation completion (manual)");
 | |
|                     else
 | |
|                         PUB.log.AddI($"Proceeding due to data confirmation completion (BYPASS)");
 | |
|                 }
 | |
|                 else if (itemC.VisionData.QRInputRaw.isEmpty() == false && itemC.VisionData.BATCH.isEmpty() == false)
 | |
|                 {
 | |
|                     //ATK STD QR데이터가 입력되었으니 더이상 읽지 않아도 진행하도록 하자
 | |
|                     //데이터가 부족하다면 바로 채우기 작업을 해야한다
 | |
|                     CheckDataComplte(itemC, "STD", true);
 | |
|                     return EResultKeyence.Wait;
 | |
|                 }
 | |
|                 else if (vQtyOK &&
 | |
|                         (OPT_BYPASS || itemC.VisionData.VNAME.isEmpty() == false) &&
 | |
|                         itemC.VisionData.VLOT.isEmpty() == false &&
 | |
|                         itemC.VisionData.SID.Length == 9 &&
 | |
|                         (OPT_BYPASS || itemC.VisionData.MFGDATE.isEmpty() == false) &&
 | |
|                         itemC.VisionData.PARTNO.isEmpty() == false &&
 | |
|                         itemC.VisionData.BATCH.isEmpty() == false &&
 | |
|                         itemC.VisionData.RID.isEmpty() == false)
 | |
|                 {
 | |
|                     //모든값이 입력되어 있다면 조건 체크후 진행할 수 있도록 한다
 | |
|                     //2206211400
 | |
|                     CheckDataComplte(itemC, "SINGLE", true);
 | |
|                     return EResultKeyence.Wait;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     //아직데이터가 완료되지 않았다면
 | |
|                     //대기시간이 지나면 사용자 확인창을 띄운다
 | |
|                     return EResultKeyence.Wait;
 | |
|                 }
 | |
| 
 | |
|                 PUB.sm.seq.Update(cmdIndex);
 | |
|                 return EResultKeyence.Wait;
 | |
|             }
 | |
| 
 | |
|             //####################################################
 | |
|             //###	
 | |
|             //####################################################
 | |
|             if (PUB.sm.seq.Get(cmdIndex) == idx++)
 | |
|             {
 | |
|                 PUB.sm.seq.Update(cmdIndex);
 | |
|                 return EResultKeyence.Wait;
 | |
|             }
 | |
| 
 | |
|             PUB.sm.seq.Clear(cmdIndex);
 | |
|             return EResultKeyence.Complete;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 데이터입력이 완료되었는지 확인 합니다
 | |
|         /// </summary>
 | |
|         /// <param name="item"></param>
 | |
|         /// <param name="Source"></param>
 | |
|         /// <param name="mainjob"></param>
 | |
|         void CheckDataComplte(Class.JobData item, string Source, bool mainjob)
 | |
|         {
 | |
|             Boolean NeedConfirm = false;
 | |
|             //var Jobtype = VAR.STR[eVarString.JOB_TYPE];
 | |
|             var OPT_BYPASS = SETTING.Data.SystemBypass;// Jobtype == "BP";
 | |
|             var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
 | |
|             var CustomerCode = VAR.STR[eVarString.JOB_CUSTOMER_CODE];
 | |
|             if (item.VisionData.Confirm)
 | |
|             {
 | |
|                 //사용자에의해 완성된 자료는 완료된 자료이다
 | |
|                 if (item.VisionData.bcdMessage.Count > 0) item.VisionData.bcdMessage.Clear();
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             //DB정보에서 데이터를 쓸것이 있다면 기록한다
 | |
| 
 | |
|             //이전작업내역에서 데이터를 쓸것이 있다면 기록한다
 | |
| 
 | |
|             //Customer Code
 | |
|             if (OPT_BYPASS == false && item.VisionData.CUSTCODE.isEmpty() && CustomerCode.isEmpty() == false)
 | |
|             {
 | |
|                 item.VisionData.CUSTCODE = CustomerCode;
 | |
|                 PUB.log.Add($"[FIX] CUSTOMER CODE => {CustomerCode}");
 | |
|             }
 | |
| 
 | |
|             //서버의수량업데이트기능
 | |
|             if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_ServerQty])
 | |
|             {
 | |
|                 //수량원본이 없는 경우
 | |
|                 if (item.VisionData.QTY0.isEmpty())
 | |
|                 {
 | |
|                     string msg = "Server quantity update feature is not applicable to WMS, contact developer if needed";
 | |
|                     var cnt = 0;// (int)(Amkor.RestfulService.get_stock_count(item.VisionData.RID, out msg));
 | |
|                     if (mainjob)
 | |
|                     {
 | |
|                         PUB.log.AddE("Server quantity update feature is not applicable to WMS, contact developer if needed");
 | |
|                     }
 | |
|                     if (cnt > 0)
 | |
|                     {
 | |
|                         //새로받은 데이터를 실제 수량에 추가한다
 | |
|                         item.VisionData.QTY0 = item.VisionData.QTY;
 | |
|                         item.VisionData.QTY = cnt.ToString();
 | |
|                         if (mainjob) PUB.log.Add($"Server quantity update RID:{item.VisionData.RID} Old:{item.VisionData.QTY}, New:{cnt}");
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         if (mainjob) PUB.log.AddE($"Quantity update failed rID:{item.VisionData.RID}, Message={msg}");
 | |
|                         NeedConfirm = true;
 | |
|                         if (mainjob) item.VisionData.bcdMessage.Add("Quantity update failed");
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //수량입력 210708
 | |
|             if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_UserQtyRQ])
 | |
|             {
 | |
|                 if (item.VisionData.QTYRQ && item.VisionData.QTY.isEmpty() == false)
 | |
|                 {
 | |
|                     //RQ값이 이전 값이 오기도 하니 바코드 목록에서 값을 다시 써준다. 210825
 | |
|                     var rqBcd = PUB.Result.ItemDataC.VisionData.barcodelist.Where(t => t.Value.Data.StartsWith("RQ")).FirstOrDefault();
 | |
|                     if (rqBcd.Value != null)
 | |
|                     {
 | |
|                         var newqty = rqBcd.Value.Data.Substring(2).Trim();
 | |
|                         if (mainjob) PUB.log.Add($"Quantity update (01) {item.VisionData.QTY}->{newqty}");
 | |
|                         item.VisionData.QTY = newqty;
 | |
|                         if (mainjob) PUB.log.AddI("Manual quantity input mode but RQ value confirmed, no user confirmation required");
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         if (mainjob) item.VisionData.bcdMessage.Add("RQ value error (auto mode not possible)");
 | |
|                         NeedConfirm = true;
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     if (mainjob) item.VisionData.bcdMessage.Add("Manual quantity input required");
 | |
|                     NeedConfirm = true;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //SID 존재여부 확인
 | |
|             if (OPT_BYPASS == false && item.VisionData.SID_Trust && VAR.BOOL[eVarBool.Opt_CheckSIDExist])
 | |
|             {
 | |
|                 //ECS목록에 데이터가 업다면 오류로 처리한다
 | |
|                 var SID = item.VisionData.SID;
 | |
|                 var MCName = VAR.BOOL[eVarBool.Use_Conveyor] ? "IB" : SETTING.Data.McName;
 | |
|                 var ta = new DataSet1TableAdapters.QueriesTableAdapter();
 | |
|                 var exist = ta.CheckSIDExist(SID) > 0;
 | |
|                 PUB.log.Add($"SID Exist Check SID:{item.VisionData.SID},Result={exist}");
 | |
|                 if (exist == false)
 | |
|                 {
 | |
|                     PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOSIDINFOFROMDB, eNextStep.PAUSE, SID);
 | |
|                     return;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //sid변환기능확인
 | |
|             var SIDOK = false;
 | |
|             if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_SIDConvert] && VAR.BOOL[eVarBool.JOB_Empty_SIDConvertInfo] == false)
 | |
|             {
 | |
|                 //변환된 정보가 없다면 변환을 진행한다                
 | |
|                 if (item.VisionData.SID0.isEmpty() && item.VisionData.SID_Trust && item.VisionData.SID.isEmpty() == false)
 | |
|                 {
 | |
|                     //이 sid가 존재여부확인 후 없는 sid라면 더이상 처리하지 않는다 230510
 | |
|                     if (PUB.Result.DTSidConvertEmptyList.Contains(item.VisionData.SID))
 | |
|                     {
 | |
|                         //존재하지 않는 SID로 이미 확인되었다
 | |
|                     }
 | |
|                     else if (PUB.Result.DTSidConvertMultiList.Contains(item.VisionData.SID))
 | |
|                     {
 | |
|                         //다중sid로 인해 처리하지 않는다
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         var newsid = PUB.SIDCovert(item.VisionData.SID, "SPS_BarcodeProcess", out bool converr);
 | |
|                         if (converr)
 | |
|                         {
 | |
|                             if (PUB.sm.Step == eSMStep.RUN)
 | |
|                                 PUB.log.AddE(newsid);
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             item.VisionData.SID0 = item.VisionData.SID; //기존자료를 0으로 백업한다
 | |
|                             item.VisionData.SID = newsid;   //신규 SID를 기록
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|                 //시드값이 유효한지 확인한다.
 | |
|                 SIDOK = item.VisionData.SID_Trust && item.VisionData.SID0.isEmpty() == false && item.VisionData.SID.isEmpty() == false;
 | |
|             }
 | |
|             else SIDOK = (item.VisionData.SID_Trust && item.VisionData.SID.isEmpty() == false); //시드변환을 사용하지 않으므로 시드값여부에따라 다르다
 | |
| 
 | |
|             //사용자확인이 필요한 옵션이라면 사용한다
 | |
|             if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_UserConfim])
 | |
|             {
 | |
|                 if (NeedConfirm == false)
 | |
|                 {
 | |
|                     if (mainjob) item.VisionData.bcdMessage.Add("User confirmation required");
 | |
|                     NeedConfirm = true;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //처음작업이면 반드시 확인을 한다
 | |
|             if (OPT_BYPASS == false && PUB.Result.JobFirst)
 | |
|             {
 | |
|                 //사용자확인이 필요없는 상태라면 활성화해준다
 | |
|                 if (NeedConfirm == false)
 | |
|                 {
 | |
|                     //프린트를 하지 않는다면 처리하지 않는다.
 | |
|                     if (VAR.BOOL[eVarBool.Opt_DisablePrinter] == false)
 | |
|                     {
 | |
|                         if (mainjob) item.VisionData.bcdMessage.Add("First reel confirmation required");
 | |
|                         NeedConfirm = true;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //변환작업인데 원본 값이 없다.
 | |
|             //혹은 변환값과 원본이 같다
 | |
|             if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_SIDConvert] && (item.VisionData.SID0.isEmpty() == true || item.VisionData.SID0 == item.VisionData.SID))
 | |
|             {
 | |
|                 if (NeedConfirm == false)
 | |
|                 {
 | |
|                     if (mainjob) item.VisionData.bcdMessage.Add("SID conversion value confirmation required");
 | |
|                     NeedConfirm = true;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //프린트위치확인
 | |
|             if (item.VisionData.PrintPositionData.isEmpty() == true || item.VisionData.PrintPositionCheck == false)
 | |
|             {
 | |
|                 if (OPT_BYPASS)
 | |
|                 {
 | |
|                     //바이패스해야하는 경우라면 프린트위치를 임의로 한다
 | |
|                     if (item.VisionData.PrintPositionData.isEmpty())
 | |
|                     {
 | |
|                         item.VisionData.PrintPositionData = "1";
 | |
|                         item.VisionData.PrintPositionCheck = true;
 | |
|                         PUB.log.AddI($"Print position arbitrarily set due to bypass SID ({item.VisionData.SID})");
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     //기록된 현재작업의 인쇄위치 정보에서 찾는다 231005
 | |
|                     if (PUB.Result.PrintPostionList.ContainsKey(item.VisionData.SID))
 | |
|                     {
 | |
|                         var preprnpos = PUB.Result.PrintPostionList[item.VisionData.SID];
 | |
|                         item.VisionData.PrintPositionData = preprnpos;
 | |
|                         item.VisionData.PrintPositionCheck = true;
 | |
|                         PUB.log.AddI($"Print position found in current job info SID:{item.VisionData.SID}, Value={preprnpos}");
 | |
|                     }
 | |
|                     else if (NeedConfirm == false)
 | |
|                     {
 | |
|                         //현작업내에서의 정보를 찾아서 적용한다 231005
 | |
|                         if (mainjob) item.VisionData.bcdMessage.Add("Attachment position not found");
 | |
|                         NeedConfirm = true;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //바이패스모드에서 벤더네임이지정(101시드에 벤더네임이 없다)
 | |
|             if (OPT_BYPASS)
 | |
|             {
 | |
|                 if (item.VisionData.VNAME_Trust == false)
 | |
|                 {
 | |
|                     item.VisionData.VNAME = "BYPASS";
 | |
|                     item.VisionData.VNAME_Trust = true;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //데이터의 신뢰성을 확인하고 모두 입력되었다면 자동 확정을 진행한다
 | |
|             if (item.VisionData.MFGDATE_Trust &&
 | |
|                 item.VisionData.PARTNO_Trust &&
 | |
|                 item.VisionData.QTY_Trust &&
 | |
|                 item.VisionData.RID_Trust &&
 | |
|                 item.VisionData.SID_Trust &&
 | |
|                 SIDOK && item.VisionData.VLOT_Trust &&
 | |
|                 item.VisionData.VNAME_Trust)
 | |
|             {
 | |
|                 //데이터를 확정짓는다 다만 화면을 표시하지 않아야하는 경우에만 처리해준다
 | |
|                 if (NeedConfirm == false)
 | |
|                 {
 | |
|                     if (OPT_BYPASS)
 | |
|                     {
 | |
|                         PUB.log.Add("All data confirmed, proceeding with automatic confirmation (bypass mode)");
 | |
|                         if (item.VisionData.bcdMessage.Count > 0) item.VisionData.bcdMessage.Clear();
 | |
|                         item.VisionData.ConfirmBypass = true;
 | |
|                     }
 | |
|                     else if (item.VisionData.ConfirmAuto == false)
 | |
|                     {
 | |
|                         PUB.log.Add("All data confirmed, proceeding with automatic confirmation");
 | |
|                         if (item.VisionData.bcdMessage.Count > 0) item.VisionData.bcdMessage.Clear();
 | |
|                         item.VisionData.ConfirmAuto = true;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             else if (item.VisionData.QRInputRaw.isEmpty() == false)
 | |
|             {
 | |
|                 if (NeedConfirm == false)
 | |
|                 {
 | |
|                     if (mainjob)
 | |
|                     {
 | |
|                         NeedConfirm = true;
 | |
|                         PUB.log.AddAT($"Data incomplete but QR has been read, showing confirmation window immediately");
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //확인창을 띄우기 위해 Timeout 오류를 발생시킨다.
 | |
|             VAR.BOOL[eVarBool.Need_UserConfirm_Data] = NeedConfirm;
 | |
|             if (NeedConfirm)
 | |
|             {
 | |
|                 if (mainjob)
 | |
|                 {
 | |
|                     var newtime = DateTime.Now.AddMilliseconds(-AR.SETTING.Data.Timeout_VisionProcessL);
 | |
|                     VAR.TIME.Set(eVarTime.KEYENCEWAIT, newtime);
 | |
|                 }
 | |
|             }
 | |
|             else if (PUB.Result.ItemDataC.VisionData.ConfirmAuto == false)
 | |
|             {
 | |
|                 PUB.logDbg.Add($"Vision automatic confirmation processing {Source}");
 | |
|                 PUB.Result.ItemDataC.VisionData.ConfirmAuto = true;
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         List<string> warninactivelist = new List<string>();
 | |
|         private void SetDryrunData()
 | |
|         {
 | |
|             var item = PUB.Result.ItemDataC;
 | |
|             PUB.log.AddAT("Dry run basic data input");
 | |
|             if (item.VisionData.QTY.isEmpty()) item.VisionData.QTY = DateTime.Now.ToString("HHmm");
 | |
|             if (item.VisionData.MFGDATE.isEmpty()) item.VisionData.MFGDATE = DateTime.Now.ToString("yy-MM-dd");
 | |
|             if (item.VisionData.SID.isEmpty()) item.VisionData.SID = "108" + "0" + DateTime.Now.ToString("HH").PadLeft(2, '0') + DateTime.Now.ToString("fff").PadLeft(3, '0');
 | |
|             if (item.VisionData.VLOT.isEmpty()) item.VisionData.VLOT = "SUPNAME" + DateTime.Now.ToString("fff");
 | |
|             if (item.VisionData.PARTNO.isEmpty()) item.VisionData.PARTNO = "PARTNO" + DateTime.Now.ToString("yyyyMMddHHmmss.fff");
 | |
|             if (item.VisionData.RID.isEmpty())
 | |
|             {
 | |
|                 var newid = PUB.MakeNewREELID(item.VisionData.SID);// Amkor.RestfulService.Allocation_Unique_ReelID_AmkorSTD("1234", "4", "A", out string err);
 | |
|                 if (newid.success == false) item.VisionData.SetRID("RID" + DateTime.Now.ToString("yyyyMMddHHmmss.fff"), "DRY");
 | |
|                 else item.VisionData.SetRID(newid.newid, "DRY");
 | |
|             }
 | |
|             if (item.VisionData.PrintPositionData.isEmpty()) item.VisionData.PrintPositionData = "2";
 | |
|             item.VisionData.PrintPositionCheck = true;
 | |
|             item.VisionData.ConfirmAuto = true;
 | |
|         }
 | |
|     }
 | |
| } | 
