 3eac3927f8
			
		
	
	3eac3927f8
	
	
	
		
			
			- Enhanced QR vision trigger logging with detailed command/data output - Added JSON data extraction for barcode processing - Improved WMS info query with data completeness check - Updated SID information form with trust flags for user inputs - Added auto-resize columns and UI improvements to SID selection dialog - Fixed barcode data processing to handle JSON wrapped responses - Added pick retry reset and timing control on form close 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			666 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			666 lines
		
	
	
		
			30 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
 | |
|     {
 | |
| 
 | |
|         EResultKeyence BCDProcess_ALL(Class.JobData itemC, string Src, bool CompleteCheck)
 | |
|         {
 | |
|             var mainJob = Src.Equals("SPS") == false;
 | |
| 
 | |
|             //assign customer code - fixed data
 | |
|             if (itemC.VisionData.CUSTCODE.isEmpty() && VAR.STR[eVarString.JOB_CUSTOMER_CODE].isEmpty() == false)
 | |
|             {
 | |
|                 itemC.VisionData.CUSTCODE = VAR.STR[eVarString.JOB_CUSTOMER_CODE];
 | |
|                 PUB.log.Add($"Cutomer Code Fixed Value : {itemC.VisionData.CUSTCODE}");
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             //커스터머 이름 확인
 | |
|             if (mainJob && PUB.OPT_BYPASS() == false)
 | |
|                 BCDProcess_GetCustomerName(itemC);
 | |
| 
 | |
|             //Ignore Value
 | |
|             BCDProcess_IgnoreValue(itemC);
 | |
| 
 | |
|             //기본 벤더이름
 | |
|             BCDProcess_DefVenderName(itemC);
 | |
| 
 | |
|             //기본 MFG
 | |
|             BCDProcess_DefMFGDate(itemC);
 | |
| 
 | |
|             //바코드가 변경된 경우이다, 자동채우기 기능이 있다면 사용한다
 | |
|             bool NewBarcodeUpdated = false;
 | |
| 
 | |
|             //[WMS] SID정보테이블에서 정보 추출(프린트정보는 없음)
 | |
|             //[WMS] 에서 중복검색되면 팝업을 해야하므로 이것을 먼저 처리한다.
 | |
|             if (VAR.BOOL[eVarBool.Opt_ApplyWMSInfo] && (CompleteCheck || itemC.VisionData.BarcodeTouched == true))
 | |
|             {
 | |
|                 var rlt_FindWMD = BCDProcess_FindWMSInfo(itemC);
 | |
|                 if (rlt_FindWMD.NewBarcodeUpdated) NewBarcodeUpdated = true;
 | |
|                 if (rlt_FindWMD.retval == EResultKeyence.MultiSID) return rlt_FindWMD.retval;
 | |
|             }
 | |
| 
 | |
|             //SID정보테이블에서 정보 추출
 | |
|             if (VAR.BOOL[eVarBool.Opt_ApplySIDInfo] && (CompleteCheck || itemC.VisionData.BarcodeTouched == true))
 | |
|             {
 | |
|                 if (BCDProcess_FindSIDInfo(itemC) == true) NewBarcodeUpdated = true;
 | |
|             }
 | |
| 
 | |
|             //시드변환정보에서 정보 추출
 | |
|             if (VAR.BOOL[eVarBool.Opt_ApplySIDConv] && (CompleteCheck || itemC.VisionData.BarcodeTouched == true))
 | |
|             {
 | |
|                 if (BCDProcess_FindSIDConv(itemC) == true) NewBarcodeUpdated = true;
 | |
|             }
 | |
| 
 | |
|             //기존 작업에서 데이터를 찾아서 쓴다
 | |
|             if (VAR.BOOL[eVarBool.Opt_ApplyJobInfo] && (CompleteCheck || itemC.VisionData.BarcodeTouched == true))
 | |
|             {
 | |
|                 if (BCDProcess_FindJobData(itemC) == true) NewBarcodeUpdated = true;
 | |
|             }
 | |
| 
 | |
|             //릴ID 신규발행
 | |
|             if (PUB.OPT_BYPASS() == false && VAR.BOOL[eVarBool.Opt_NewReelID])
 | |
|                 BCDProcess_MakeReelID(itemC);
 | |
| 
 | |
|             //SiD CONVERT
 | |
|             if (PUB.OPT_BYPASS() == false &&
 | |
|                 VAR.BOOL[eVarBool.Opt_SIDConvert] &&
 | |
|                 PUB.flag.get(eVarBool.FG_WAIT_LOADERINFO) == false &&
 | |
|                 VAR.BOOL[eVarBool.JOB_Empty_SIDConvertInfo] == false)
 | |
|             {
 | |
|                 //원본시드(sid0)가 비어있는데 sid과 확정되었다면 변환작업을 진행한다
 | |
|                 BCDProcess_SIDConvert(itemC);
 | |
|             }
 | |
| 
 | |
|             //Print Position
 | |
|             BCDProcess_BCDPrint(itemC);
 | |
| 
 | |
| 
 | |
| 
 | |
|             //해당 바코드작업이 완료되었는지 확인한다. 신규 바코드값이 업데이트되면 한번더 동작하도록 한다
 | |
|             if (itemC.VisionData.BarcodeTouched == true && NewBarcodeUpdated == false)
 | |
|             {
 | |
|                 itemC.VisionData.BarcodeTouched = false;
 | |
|             }
 | |
| 
 | |
|             bool BatchValueOK = false;
 | |
|             if (PUB.Result.vModel.IgnoreBatch) BatchValueOK = true;
 | |
|             else BatchValueOK = itemC.VisionData.BATCH.isEmpty() == false;
 | |
| 
 | |
|             bool partnoValueOK = false;
 | |
|             if (PUB.Result.vModel.IgnorePartNo) partnoValueOK = true;
 | |
|             else partnoValueOK = itemC.VisionData.PARTNO.isEmpty() == false;
 | |
| 
 | |
| 
 | |
|             //수량임의 입력의 경우
 | |
|             bool vQtyOK = false;
 | |
|             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 (CompleteCheck)
 | |
|             {
 | |
| 
 | |
|                 if (itemC.VisionData.Confirm)
 | |
|                 {
 | |
|                     //이미 완료된 데이터
 | |
|                     if (mainJob)
 | |
|                     {
 | |
|                         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 (vQtyOK &&
 | |
|                         (itemC.VisionData.VNAME.isEmpty() == false) &&
 | |
|                         itemC.VisionData.VLOT.isEmpty() == false &&
 | |
|                         itemC.VisionData.SID.Length == 9 &&
 | |
|                         itemC.VisionData.MFGDATE.isEmpty() == false &&
 | |
|                         partnoValueOK &&
 | |
|                         BatchValueOK &&
 | |
|                         itemC.VisionData.RID.isEmpty() == false)
 | |
|                 {
 | |
|                     //모든값이 입력되어 있다면 조건 체크후 진행할 수 있도록 한다
 | |
|                     //2206211400
 | |
|                     CheckDataComplte(itemC, Src, mainJob);
 | |
|                     return EResultKeyence.Wait;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     //아직데이터가 완료되지 않았다면
 | |
|                     //대기시간이 지나면 사용자 확인창을 띄운다
 | |
|                     return EResultKeyence.Wait;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|             return EResultKeyence.Nothing;
 | |
|         }
 | |
| 
 | |
|         //커스터머 이름 확인
 | |
|         void BCDProcess_GetCustomerName(Class.JobData itemC)
 | |
|         {
 | |
|             if (itemC.VisionData.CUSTNAME.isEmpty() && itemC.VisionData.CUSTCODE.isEmpty() == false)
 | |
|             {
 | |
|                 var qta = new DataSet1TableAdapters.QueriesTableAdapter();
 | |
|                 var custname = qta.GetCustName(itemC.VisionData.CUSTCODE);
 | |
|                 if ((custname ?? string.Empty).isEmpty() == false)
 | |
|                 {
 | |
|                     PUB.log.Add($"New CustName => {custname}");
 | |
|                     itemC.VisionData.CUSTNAME = custname;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         bool BCDProcess_BCDPrint(Class.JobData itemC)
 | |
|         {
 | |
|             var OPT_BYPASS = PUB.OPT_BYPASS();
 | |
|             bool NeedConfirm = false;
 | |
|             if (itemC.VisionData.PrintPositionData.isEmpty() == true || itemC.VisionData.PrintPositionCheck == false)
 | |
|             {
 | |
|                 if (OPT_BYPASS)
 | |
|                 {
 | |
|                     //바이패스해야하는 경우라면 프린트위치를 임의로 한다
 | |
|                     itemC.VisionData.PrintPositionData = "1";
 | |
|                     itemC.VisionData.PrintPositionCheck = true;
 | |
|                     PUB.log.AddI($"Print position arbitrarily set due to bypass SID ({itemC.VisionData.SID})");
 | |
|                 }
 | |
|                 else if (itemC.VisionData.SID.isEmpty())
 | |
|                 {
 | |
|                     //no sid need confirm
 | |
|                     //PUB.log.AddAT($"Print Position Errr (No SID)");
 | |
|                     NeedConfirm = true;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     //기록된 현재작업의 인쇄위치 정보에서 찾는다 231005
 | |
|                     if (PUB.Result.PrintPostionList.ContainsKey(itemC.VisionData.SID))
 | |
|                     {
 | |
|                         var preprnpos = PUB.Result.PrintPostionList[itemC.VisionData.SID];
 | |
|                         itemC.VisionData.PrintPositionData = preprnpos;
 | |
|                         itemC.VisionData.PrintPositionCheck = true;
 | |
|                         PUB.log.AddI($"Print position found in current job info SID:{itemC.VisionData.SID}, Value={preprnpos}");
 | |
|                     }
 | |
|                     else if (NeedConfirm == false)
 | |
|                     {
 | |
|                         NeedConfirm = true;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             return NeedConfirm;
 | |
|         }
 | |
| 
 | |
|         void BCDProcess_IgnoreValue(Class.JobData itemC)
 | |
|         {
 | |
|             if (PUB.Result.vModel.IgnorePartNo == true && itemC.VisionData.PARTNO_Trust == false)
 | |
|             {
 | |
|                 PUB.log.Add("PartNo Trust by Ignore PartNo Setting(opmodel)");
 | |
|                 itemC.VisionData.PARTNO_Trust = true;
 | |
|             }
 | |
| 
 | |
|             //ignore batch value
 | |
|             if (PUB.Result.vModel.IgnoreBatch == true)
 | |
|             {
 | |
| 
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         //기본 벤더이름
 | |
|         void BCDProcess_DefVenderName(Class.JobData itemC)
 | |
|         {
 | |
|             //기본 벤더이름
 | |
|             var defname = PUB.Result.vModel.Def_Vname ?? string.Empty;
 | |
|             if (PUB.Result.isSetvModel && defname.isEmpty() == false)
 | |
|             {
 | |
|                 if (itemC.VisionData.VNAME.Equals(defname) == false)
 | |
|                 {
 | |
|                     itemC.VisionData.VNAME = defname.Trim();
 | |
|                     itemC.VisionData.VNAME_Trust = true;
 | |
|                     PUB.log.Add($"Defaul V.Name Set to {defname}");
 | |
|                 }
 | |
|             }
 | |
|             else if (PUB.OPT_BYPASS() == true)
 | |
|             {
 | |
|                 if (itemC.VisionData.VNAME_Trust == false)
 | |
|                 {
 | |
|                     itemC.VisionData.VNAME = "BYPASS";
 | |
|                     itemC.VisionData.VNAME_Trust = true;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         //기본 MFG
 | |
|         void BCDProcess_DefMFGDate(Class.JobData itemC)
 | |
|         {
 | |
|             var defname = PUB.Result.vModel.Def_MFG ?? string.Empty;
 | |
|             if (PUB.Result.isSetvModel && defname.isEmpty() == false && itemC.VisionData.MFGDATE.Equals(defname) == false)
 | |
|             {
 | |
|                 itemC.VisionData.MFGDATE = defname.Trim();
 | |
|                 itemC.VisionData.MFGDATE_Trust = true;
 | |
|                 PUB.log.Add($"Defaul MFGDATE Set to {defname}");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         //[WMS] SID정보테이블에서 정보 추출(프린트정보는 없음)
 | |
|         //[WMS] 에서 중복검색되면 팝업을 해야하므로 이것을 먼저 처리한다.
 | |
|         (bool NewBarcodeUpdated, EResultKeyence retval) BCDProcess_FindWMSInfo(Class.JobData itemC)
 | |
|         {
 | |
|             Boolean Apply = true;
 | |
|             var vdata = itemC.VisionData;
 | |
|             bool NewBarcodeUpdated = false;
 | |
|             EResultKeyence rlt = EResultKeyence.Wait;
 | |
| 
 | |
|             //select columns
 | |
|             List<string> fields = new List<string>();
 | |
|             if (VAR.BOOL[eVarBool.Opt_WMS_Apply_CustCode] && vdata.CUSTCODE.isEmpty()) fields.Add("CUST_CODE");
 | |
|             if (VAR.BOOL[eVarBool.Opt_WMS_Apply_PartNo] && (vdata.PARTNO.isEmpty() || vdata.PARTNO_Trust == false)) fields.Add("PART_NO");
 | |
|             if (VAR.BOOL[eVarBool.Opt_WMS_Apply_VenderName] && (vdata.VNAME_Trust == false || vdata.VNAME.isEmpty())) fields.Add("VENDOR_NM");
 | |
|             if (VAR.BOOL[eVarBool.Opt_WMS_Apply_SID] && (vdata.SID_Trust == false || vdata.SID.isEmpty())) fields.Add("SID");
 | |
|             if (VAR.BOOL[eVarBool.Opt_WMS_Apply_batch] && (vdata.SID_Trust == false || vdata.BATCH.isEmpty())) fields.Add("BATCH_NO"); //220921
 | |
|             if (VAR.BOOL[eVarBool.Opt_WMS_Apply_MFG] && (vdata.MFGDATE_Trust == false || vdata.MFGDATE.isEmpty())) fields.Add("MFG_DATE");
 | |
| 
 | |
|             //where coluns
 | |
|             List<string> wheres = new List<string>();
 | |
|             if (Apply && VAR.BOOL[eVarBool.Opt_WMS_Where_CustCode])
 | |
|             {
 | |
|                 if (vdata.CUSTCODE.isEmpty() == false) wheres.Add($"CUST_CODE='{vdata.CUSTCODE.PadLeft(10, '0')}'");
 | |
|                 else Apply = false;
 | |
|             }
 | |
|             if (Apply && VAR.BOOL[eVarBool.Opt_WMS_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_WMS_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_WMS_Where_VLOT])  //221013
 | |
|             {
 | |
|                 if (vdata.VLOT_Trust && vdata.VLOT.isEmpty() == false) wheres.Add($"VENDOR_LOT = '{vdata.VLOT}'");
 | |
|                 else Apply = false;
 | |
|             }
 | |
|             if (Apply && VAR.BOOL[eVarBool.Opt_WMS_Where_MFG])  //221013
 | |
|             {
 | |
|                 if (vdata.MFGDATE_Trust && vdata.MFGDATE.isEmpty() == false) wheres.Add($"MFG_DATE = '{vdata.MFGDATE}'");
 | |
|                 else Apply = false;
 | |
|             }
 | |
| 
 | |
|             //데이터가 완성되었다면 처리하지 않는다.
 | |
|             bool DataOK = true;
 | |
|             foreach (var data in fields)
 | |
|             {
 | |
|                 var column = data.ToLower();
 | |
|                 if (DataOK && column.Equals("sid") && (vdata.SID.isEmpty() || vdata.SID_Trust == false)) DataOK = false;
 | |
|                 else if (DataOK && column.Equals("part_no") && (vdata.PARTNO.isEmpty() || vdata.PARTNO_Trust)) DataOK = false;
 | |
|                 else if (DataOK && column.Equals("mfg_data") && (vdata.MFGDATE.isEmpty() || vdata.MFGDATE_Trust)) DataOK = false;
 | |
|                 else if (DataOK && column.Equals("vendor_nm") && (vdata.VNAME.isEmpty() || vdata.VNAME_Trust)) DataOK = false;
 | |
|                 else if (DataOK && column.Equals("batch_no") && (vdata.BATCH.isEmpty())) DataOK = false;
 | |
|                 else if (DataOK && column.Equals("qty") && (vdata.QTY.isEmpty() || vdata.QTY_Trust)) DataOK = false;
 | |
|                 else if (DataOK && column.Equals("cust_code") && (vdata.CUSTCODE.isEmpty())) DataOK = false;
 | |
|                 else if (DataOK && column.Equals("vendor_lot") && (vdata.VLOT.isEmpty() || vdata.VLOT_Trust)) DataOK = false;
 | |
|                 if (DataOK == false) break;
 | |
|             }
 | |
| 
 | |
|             //if query data . no error
 | |
|             if (DataOK == false && Apply && fields.Count > 0 && wheres.Count > 0)
 | |
|             {
 | |
|                 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 * from {TableName} WITH(NOLOCK) {whereState}";
 | |
|                     VAR.STR[eVarString.MULTISID_FIELDS] = selectFields;
 | |
|                     rlt = 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;
 | |
|                 }
 | |
| 
 | |
|             }
 | |
|             return (NewBarcodeUpdated, rlt);
 | |
|         }
 | |
| 
 | |
|         //SID정보테이블에서 정보 추출
 | |
|         bool BCDProcess_FindSIDInfo(Class.JobData itemC)
 | |
|         {
 | |
|             Boolean Apply = true;
 | |
|             bool NewBarcodeUpdated = false;
 | |
|             var vdata = itemC.VisionData;
 | |
| 
 | |
|             //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.PadLeft(10, '0')}'");
 | |
|                 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;
 | |
|                 }
 | |
|             }
 | |
|             return NewBarcodeUpdated;
 | |
|         }
 | |
| 
 | |
|         //시드변환정보에서 정보 추출
 | |
|         bool BCDProcess_FindSIDConv(Class.JobData itemC)
 | |
|         {
 | |
|             Boolean Apply = true;
 | |
|             bool NewBarcodeUpdated = false;
 | |
|             var vdata = itemC.VisionData;
 | |
| 
 | |
|             //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.PadLeft(10, '0')}'");
 | |
|                 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;
 | |
|                 }
 | |
|             }
 | |
|             return NewBarcodeUpdated;
 | |
|         }
 | |
| 
 | |
|         //기존 작업에서 데이터를 찾아서 쓴다
 | |
|         bool BCDProcess_FindJobData(Class.JobData itemC)
 | |
|         {
 | |
|             bool NewBarcodeUpdated = false;
 | |
|             Boolean Apply = true;
 | |
|             var vdata = itemC.VisionData;
 | |
| 
 | |
|             //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.PadLeft(10, '0')}'");
 | |
|                 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;
 | |
|                 }
 | |
|             }
 | |
|             return NewBarcodeUpdated;
 | |
|         }
 | |
| 
 | |
|         void BCDProcess_SIDConvert(Class.JobData itemC)
 | |
|         {
 | |
|             var vdata = itemC.VisionData;
 | |
|             //원본시드(sid0)가 비어있는데 sid과 확정되었다면 변환작업을 진행한다
 | |
|             if (vdata.SID0.isEmpty() && vdata.SID.isEmpty() == false && vdata.SID_Trust)
 | |
|             {
 | |
|                 //이 sid가 존재여부확인 후 없는 sid라면 더이상 처리하지 않는다 230510
 | |
|                 if (PUB.Result.DTSidConvertEmptyList.Contains(vdata.SID))
 | |
|                 {
 | |
|                     //존재하지 않는 SID로 이미 확인되었다
 | |
|                 }
 | |
|                 else if (PUB.Result.DTSidConvertMultiList.Contains(vdata.SID))
 | |
|                 {
 | |
|                     //다중sid로 인해 처리하지 않는다
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     var newsid = PUB.SIDCovert(vdata.SID, "SPS_BarcodeProcess", out bool converr);
 | |
|                     if (converr)
 | |
|                     {
 | |
|                         if (PUB.sm.Step == eSMStep.RUN)
 | |
|                             PUB.log.AddE(newsid);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         vdata.SID0 = vdata.SID;
 | |
|                         vdata.SID = newsid;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         //Generate Reel ID
 | |
|         void BCDProcess_MakeReelID(Class.JobData itemC)
 | |
|         {
 | |
|             if (itemC.VisionData.RIDNew == 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
 | |
|                     PUB.log.Add("new reelid bacodeprecess");
 | |
|                     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($"릴아이디 변경으로 인해 수량을 복원합니다({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 생성실패 : {newid.message}");
 | |
|                         VAR.TIME.Update(eVarTime.LOG_NEWIDERROR);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |