- 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>
148 lines
6.6 KiB
C#
148 lines
6.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
namespace Project
|
|
{
|
|
public partial class FMain
|
|
{
|
|
bool RecvQRProcess(List<string> qrdatas, eWorkPort vIdx)
|
|
{
|
|
//데이터가없으면 처리하지 않는다.
|
|
if (qrdatas == null || qrdatas.Count < 1) return false;
|
|
|
|
bool FindData = false;
|
|
var idata = vIdx == eWorkPort.Left ? PUB.Result.ItemDataL : PUB.Result.ItemDataR;
|
|
|
|
//표준바코드라면 그 값을 표시해준다
|
|
lock (PUB.Result.BCDPatternLock)
|
|
{
|
|
var patterns = PUB.Result.BCDPattern;
|
|
|
|
foreach (var datas in qrdatas)
|
|
{
|
|
// JSON 구조에서 "data" 필드 추출
|
|
string barcodeData = datas;
|
|
try
|
|
{
|
|
var jobj = JObject.Parse(datas);
|
|
if (jobj["data"] != null)
|
|
{
|
|
barcodeData = jobj["data"].ToString();
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
// JSON 파싱 실패 시 원본 데이터 사용
|
|
barcodeData = datas;
|
|
}
|
|
|
|
//원본자료를 체크한다
|
|
if (barcodeData.Equals(idata.VisionData.PrintQRData))
|
|
{
|
|
//인쇄한 자료와 동일한 자료이다
|
|
FindData = true;
|
|
}
|
|
|
|
//표준 바코드 형태만 취한다
|
|
var pats = patterns.Where(t => t.IsAmkStd && t.IsEnable).OrderBy(t => t.Seq).ToList();
|
|
if (pats.Any())
|
|
{
|
|
//패턴을 확인하여 값을 표시해준다
|
|
//var ValueApplyCount = 0;
|
|
foreach (var pt in pats)
|
|
{
|
|
var regx = new Regex(pt.Pattern, RegexOptions.IgnoreCase, new TimeSpan(0, 0, 10));
|
|
if (regx.IsMatch(barcodeData)) //패턴이 일치하다면 이것만 사용한다
|
|
{
|
|
//find data
|
|
var matchs = regx.Matches(barcodeData);
|
|
foreach (System.Text.RegularExpressions.Match mat in matchs)
|
|
{
|
|
foreach (var matchdata in pt.Groups)
|
|
{
|
|
if (matchdata.GroupNo <= mat.Groups.Count)
|
|
{
|
|
var data = mat.Groups[matchdata.GroupNo];
|
|
switch (matchdata.TargetPos.ToUpper())
|
|
{
|
|
case "SID":
|
|
idata.VisionData.SID2 = data.Value;
|
|
break;
|
|
case "RID":
|
|
idata.VisionData.RID2 = data.Value;
|
|
break;
|
|
case "VLOT":
|
|
idata.VisionData.VLOT2 = data.Value;
|
|
break;
|
|
case "VNAME":
|
|
idata.VisionData.VNAME2 = data.Value;
|
|
break;
|
|
case "MFG":
|
|
idata.VisionData.MFGDATE2 = data.Value;
|
|
break;
|
|
case "QTY":
|
|
idata.VisionData.QTY2 = data.Value;
|
|
break;
|
|
case "PART":
|
|
idata.VisionData.PARTNO2 = data.Value;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//자료는 있었지만 바코드검증이 실패된 경우이다
|
|
//타임아웃까지 기다리지 않고 바로 오류처리를 한다.
|
|
if (FindData == true)
|
|
{
|
|
//데이터를 찾았다면 완료처리를 해준다
|
|
idata.VisionData.Complete = true;
|
|
//PUB.Result.ItemData[vIdx].VisionData.Complete = true;
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
//else
|
|
//{
|
|
// var item = Pub.Result.ItemData[vIdx];
|
|
// var tsGrab = DateTime.Now - Pub.GetVarTime(VAR_LIVEVIEW);
|
|
// var timeoutVision = vIdx == 1 ? COMM.SETTING.Data.Timeout_VisionProcessL : COMM.SETTING.Data.Timeout_VisionProcessU;
|
|
// if (tsGrab.TotalMilliseconds >= timeoutVision)
|
|
// {
|
|
// //다음 바코드가 있다면 추가 진행을 위해서 남겨준다
|
|
// _SM_SAVEIMAGE(vIdx, DateTime.Now, "Images(QRValid)");
|
|
|
|
|
|
// WS_Send((idx == 0 ? 0 : 1), Pub.wsL, Pub.Result.ItemData[idx].guid, "OFF");
|
|
|
|
|
|
// var barcodepos = vIdx == 0 ? "LEFT" : "RIGHT";
|
|
// Pub.log.AddE("(" + barcodepos + ")바코드를 검증했지만 일치하지 않습니다");
|
|
// Pub.Result.SetResultMessage(eResult.OPERATION, eECode.BARCODEVALIDERR, eNextStep.pause,
|
|
// vIdx, Pub.Result.ItemData[vIdx].VisionData.RID, Pub.Result.ItemData[vIdx].VisionData.RID2,
|
|
// Pub.Result.ItemData[vIdx].VisionData.QTY, Pub.Result.ItemData[vIdx].VisionData.QTY2,
|
|
// Pub.Result.ItemData[vIdx].VisionData.SID, Pub.Result.ItemData[vIdx].VisionData.SID2,
|
|
// Pub.Result.ItemData[vIdx].VisionData.MFGDATE, Pub.Result.ItemData[vIdx].VisionData.MFGDATE2,
|
|
// barcodepos);
|
|
// return;
|
|
// }
|
|
//}
|
|
}
|
|
|
|
}
|
|
}
|