From d832f1f52cf523fc83826cb19c538d2e157f3f16 Mon Sep 17 00:00:00 2001
From: seuuung
Date: Wed, 19 Aug 2026 13:41:00 +0900
Subject: [PATCH] =?UTF-8?q?NG=EC=8B=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0?=
=?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=A0=80=EC=9E=A5=20=EC=83=9D?=
=?UTF-8?q?=EB=9E=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.vs/marking_gui.slnx/v18/.suo | Bin 94720 -> 92160 bytes
.../v18/DocumentLayout.backup.json | 6 +-
.vs/marking_gui.slnx/v18/DocumentLayout.json | 6 +-
docs/knowledge_base.md | 2 +-
marking_gui/MainWindow.xaml.cs | 114 ++++++++++--------
marking_gui/Manual/03_메인_화면.md | 2 +-
marking_gui/Manual/07_시험_프로세스.md | 4 +-
marking_gui/Manual/Manual_Merged.md | 6 +-
marking_gui/Manual/Manual_for_pdf.html | 6 +-
9 files changed, 74 insertions(+), 72 deletions(-)
diff --git a/.vs/marking_gui.slnx/v18/.suo b/.vs/marking_gui.slnx/v18/.suo
index fb1a699b2da8ae57fa475d2fba832f65f6a28b01..ca1727a32edd4c370762addbf1461b015b7903aa 100644
GIT binary patch
delta 6204
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
diff --git a/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json b/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json
index 22dca5d..4c1d162 100644
--- a/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json
+++ b/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json
@@ -22,16 +22,12 @@
"DocumentGroups": [
{
"DockedWidth": 200,
- "SelectedChildIndex": 4,
+ "SelectedChildIndex": 3,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
},
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
- },
{
"$type": "Document",
"DocumentIndex": 1,
diff --git a/.vs/marking_gui.slnx/v18/DocumentLayout.json b/.vs/marking_gui.slnx/v18/DocumentLayout.json
index 22dca5d..4c1d162 100644
--- a/.vs/marking_gui.slnx/v18/DocumentLayout.json
+++ b/.vs/marking_gui.slnx/v18/DocumentLayout.json
@@ -22,16 +22,12 @@
"DocumentGroups": [
{
"DockedWidth": 200,
- "SelectedChildIndex": 4,
+ "SelectedChildIndex": 3,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
},
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
- },
{
"$type": "Document",
"DocumentIndex": 1,
diff --git a/docs/knowledge_base.md b/docs/knowledge_base.md
index e27b41a..92e1e5f 100644
--- a/docs/knowledge_base.md
+++ b/docs/knowledge_base.md
@@ -110,7 +110,7 @@
- 고유 QR 코드 문자열 `Marking_QR` (NVARCHAR(60)): `IC_SN;도면품번;HKMC품번;각인번호;` 포맷으로 구성되며, 60자 초과 시 절삭합니다.
- 공정 정보(`Maker`, `Model`, `Variant_1`, `Variant_2`, `Operator`, `Production_Date`, `Line`, `Lot_No`, `Jig_No`) 및 최종 판정(`Result`)이 통합 적재됩니다. 각 문자열 컬럼은 최대 10자로 초과 시 절삭 처리됩니다.
- 3단계에 걸친 전압/전류/저항 컬럼(`PT_Vol_1~3`, `PT_Current_1~3`, `PT_Resistance_1~3`)이 존재하며, 현재는 1번 컬럼들에 최종 계측 수치(소수점 2~3자리 반올림)를 저장하고 2, 3번 컬럼은 `0.00`으로 기본값을 보정하여 저장합니다.
- - `Result` 컬럼에는 **`OK`** (QR 검증 통과 시) 또는 **`NG`** (불합격 또는 QR 검증 실패 시) 두 가지 값만 저장됩니다.
+ - `Result` 컬럼에는 최종 합격된 **`OK`** 레코드만 저장됩니다. (계측 불합격 또는 QR 검증 실패 등의 **`NG`**인 경우, 각인 순번이 불필요하게 카운트되는 것을 방지하기 위해 DB에 적재하지 않고 저장을 건너뜁니다.)
- `Lot_No` 컬럼은 `YYMMDDLL` 형식(예: `26080401`)으로 입력되며 최대 **10자**까지 허용됩니다.
### 4.2. 로그인 검증 저장 프로시저 ([CheckOperator])
diff --git a/marking_gui/MainWindow.xaml.cs b/marking_gui/MainWindow.xaml.cs
index eb9bd08..a445d3a 100644
--- a/marking_gui/MainWindow.xaml.cs
+++ b/marking_gui/MainWindow.xaml.cs
@@ -1454,9 +1454,9 @@ namespace marking_gui
{
if (txtMarkingStatus != null) txtMarkingStatus.Text = "마킹 성공 / QR 검증 NG";
if (borderMarkingStatus != null) borderMarkingStatus.Background = new SolidColorBrush(Color.FromRgb(239, 68, 68)); // Red
- LoggerService.Warn($"[QR 검증 실패] S/N: {serial}, 각인번호: {markedSerial} -> DB NG 저장 진행");
+ LoggerService.Warn($"[QR 검증 실패] S/N: {serial}, 각인번호: {markedSerial} -> DB 미저장");
- // 마킹 성공 후 QR 검증 불일치/취소 시 NG로 DB 저장 (EZD 추출 실시간 품번 포함)
+ // 마킹 성공 후 QR 검증 불일치/취소 시 NG 처리 (DB 저장 생략하여 순번 카운트 제외)
await SaveAndFinalizeAsync(serial, finalVoltage, finalCurrent, finalResistance, false, "NG", markedSerial, ezdDrawingNo, ezdHkmcNo, bypassPrevSteps);
}
}
@@ -1466,7 +1466,7 @@ namespace marking_gui
if (borderMarkingStatus != null) borderMarkingStatus.Background = new SolidColorBrush(Color.FromRgb(239, 68, 68)); // Red
LoggerService.Error($"[마킹 실패] S/N: {serial}, 각인번호: {markedSerial}, Code: {markingRes.ErrorCode}, Message: {markingRes.ErrorMessage} -> DB 저장 생략");
- txtFinalResult.Text = "FAIL";
+ txtFinalResult.Text = "NG";
txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
txtSystemStatus.Text = string.Format("마킹 실패 [{0}]: {1} (DB 미저장)", markingRes.ErrorCode, markingRes.ErrorMessage);
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
@@ -1513,7 +1513,7 @@ namespace marking_gui
if (borderMarkingStatus != null) borderMarkingStatus.Background = new SolidColorBrush(Color.FromRgb(239, 68, 68)); // Red
LoggerService.Error($"[마킹 스레드 오류] S/N: {serial}", threadEx);
- txtFinalResult.Text = "FAIL";
+ txtFinalResult.Text = "NG";
txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
txtSystemStatus.Text = "마킹 예외 (DB 미저장): " + threadEx.Message;
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
@@ -1534,7 +1534,7 @@ namespace marking_gui
}
else
{
- // 불합격인 경우에도 Lot No 및 예정 각인번호/품번 정보를 포함하여 DB 저장 및 복구
+ // 불합격인 경우 각인 및 DB 저장 생략 (순번 카운트 제외)
string markedSerial = GetCurrentMarkedSerial();
string drawingNo = _markingConfig.GetDrawingNoForEzd(_currentEzdFile);
string hkmcNo = _markingConfig.GetHkmcNoForEzd(_currentEzdFile);
@@ -1629,12 +1629,55 @@ namespace marking_gui
return string.Format("{0}{1:D4}", lotNo, seq);
}
- private async Task SaveAndFinalizeAsync(string serial, double voltage, double current, double resistance, bool isFinalPass, string result, string markedSerial, string drawingNo = "", string hkmcNo = "", bool bypassPrevSteps = false)
+ private async Task SaveAndFinalizeAsync(string serial, double voltage, double current, double resistance, bool isFinalPass, string result, string markedSerial, string drawingNo = "", string hkmcNo = "", bool bypassPrevSteps = false)
{
// 종료 시간 기록 및 UI 갱신
_testEndTime = DateTime.Now;
txtTestEndTime.Text = "종료 시간: " + _testEndTime.ToString("yyyy-MM-dd HH:mm:ss");
+ bool isOk = isFinalPass && (result == "PASS" || result == "OK");
+
+ if (!isOk)
+ {
+ // === [NG 결과 처리 - DB 미저장 (순번 카운트 제외)] ===
+ LoggerService.Warn($"[검사 NG] S/N: {serial}, 결과: NG (isFinalPass: {isFinalPass}, result: {result}) -> DB 저장 생략 (순번 카운트 제외)");
+
+ txtFinalResult.Text = "NG";
+ txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68)); // Red text
+ if (borderVerdictCard != null)
+ {
+ borderVerdictCard.Background = new SolidColorBrush(Color.FromRgb(254, 242, 242)); // Light Red
+ borderVerdictCard.BorderBrush = new SolidColorBrush(Color.FromRgb(239, 68, 68)); // Red border
+ borderVerdictCard.BorderThickness = new Thickness(3);
+ }
+
+ if (result == "NG" && isFinalPass)
+ {
+ txtSystemStatus.Text = "상태: 각인 QR 검증 불합격 (NG, DB 미저장)";
+ if (txtProgressStatus != null)
+ {
+ txtProgressStatus.Text = "각인 QR 검증 실패 (DB 미저장, 순번 유지)";
+ txtProgressStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
+ }
+ }
+ else
+ {
+ txtSystemStatus.Text = "상태: 성능 검사 불합격 (NG, DB 미저장)";
+ if (txtProgressStatus != null)
+ {
+ txtProgressStatus.Text = "검사 불합격 (각인 및 DB 저장 생략)";
+ txtProgressStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
+ }
+ }
+ txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
+
+ // 컨트롤 원상 복구 (재검사를 위해)
+ txtSerial.IsEnabled = true;
+ SetStartButtonReady();
+ return;
+ }
+
+ // === [OK 결과 처리 - DB 저장 (순번 카운트)] ===
if (txtProgressStatus != null)
{
txtProgressStatus.Text = "결과 데이터베이스 저장 중...";
@@ -1672,7 +1715,7 @@ namespace marking_gui
voltage,
current,
resistance,
- result,
+ "OK",
_testStartTime,
_testEndTime,
markedSerial,
@@ -1683,59 +1726,26 @@ namespace marking_gui
if (dbResult)
{
- LoggerService.Info($"[DB 저장 완료] S/N: {serial}, 결과: {result}, V: {voltage:F2}, I: {current:F2}, R: {resistance:F2}");
+ LoggerService.Info($"[DB 저장 완료] S/N: {serial}, 결과: OK, V: {voltage:F2}, I: {current:F2}, R: {resistance:F2}");
- // 스캔 검증까지 포함한 최종 판정 결과 카드 갱신
- if (isFinalPass && (result == "PASS" || result == "OK"))
- {
- txtFinalResult.Text = "OK";
- txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129)); // Green text
- if (borderVerdictCard != null)
- {
- borderVerdictCard.Background = new SolidColorBrush(Color.FromRgb(240, 253, 250)); // Light Green
- borderVerdictCard.BorderBrush = new SolidColorBrush(Color.FromRgb(16, 185, 129)); // Green border
- borderVerdictCard.BorderThickness = new Thickness(3);
- }
- txtSystemStatus.Text = "상태: 모든 공정 검사 및 QR 스캔 합격";
- txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129));
- }
- else
+ txtFinalResult.Text = "OK";
+ txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129)); // Green text
+ if (borderVerdictCard != null)
{
- txtFinalResult.Text = "NG";
- txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68)); // Red text
- if (borderVerdictCard != null)
- {
- borderVerdictCard.Background = new SolidColorBrush(Color.FromRgb(254, 242, 242)); // Light Red
- borderVerdictCard.BorderBrush = new SolidColorBrush(Color.FromRgb(239, 68, 68)); // Red border
- borderVerdictCard.BorderThickness = new Thickness(3);
- }
- txtSystemStatus.Text = (result == "NG") ? "상태: 각인 QR 검증 불합격 (NG)" : "상태: 검사 불합격";
- txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
+ borderVerdictCard.Background = new SolidColorBrush(Color.FromRgb(240, 253, 250)); // Light Green
+ borderVerdictCard.BorderBrush = new SolidColorBrush(Color.FromRgb(16, 185, 129)); // Green border
+ borderVerdictCard.BorderThickness = new Thickness(3);
}
+ txtSystemStatus.Text = "상태: 모든 공정 검사 및 QR 스캔 합격";
+ txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129));
if (txtProgressStatus != null)
{
- if (isFinalPass && (result == "PASS" || result == "OK"))
- {
- txtProgressStatus.Text = _database.OfflineMode ? "[오프라인] 각인 및 DB 모사 성공" : "모든 공정 완료 (DB 저장 성공)";
- txtProgressStatus.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129)); // Green text
- }
- else if (isFinalPass)
- {
- txtProgressStatus.Text = "최종 합격 (마킹 실패)";
- txtProgressStatus.Foreground = new SolidColorBrush(Color.FromRgb(245, 158, 11)); // Amber/Orange text
- }
- else
- {
- txtProgressStatus.Text = (result == "NG") ? "각인 QR 검증 실패 (DB NG 저장 완료)" : "최종 불합격 (DB 저장 성공)";
- txtProgressStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68)); // Red text
- }
+ txtProgressStatus.Text = _database.OfflineMode ? "[오프라인] 각인 및 DB 모사 성공" : "모든 공정 완료 (DB 저장 성공)";
+ txtProgressStatus.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129)); // Green text
}
- if (isFinalPass && (result == "PASS" || result == "OK"))
- {
- LoggerService.Info($"[설비 통신] S/N: {serial} | 최종 SUCCESS 신호를 외부 메모리에 전달했습니다.");
- }
+ LoggerService.Info($"[설비 통신] S/N: {serial} | 최종 SUCCESS 신호를 외부 메모리에 전달했습니다.");
// 실시간 각인 순번 화면 정보 갱신
RefreshNextSequence();
diff --git a/marking_gui/Manual/03_메인_화면.md b/marking_gui/Manual/03_메인_화면.md
index 64bee27..61df8af 100644
--- a/marking_gui/Manual/03_메인_화면.md
+++ b/marking_gui/Manual/03_메인_화면.md
@@ -52,7 +52,7 @@
![[Pasted image 20260728100404.png]]
### 3.2.4 [카드 4] 최종 판정 및 종합 상태 영역 (우측 하단)
진행 상황 및 최종 판정 결과를 통합 표시하는 영역입니다.
-* **💬 진행 상황 뱃지**: "대기 상태", "제품 정보 수집 중...", "측정 계측기 데이터 수집 중...", "제품 합격 - 레이저 각인 중...", "각인 QR 검증 실패 (DB NG 저장 완료)" 등 설비 시퀀스 및 검증 동작을 실시간 텍스트로 표출합니다.
+* **💬 진행 상황 뱃지**: "대기 상태", "제품 정보 수집 중...", "측정 계측기 데이터 수집 중...", "제품 합격 - 레이저 각인 중...", "각인 QR 검증 실패 (DB 미저장, 순번 유지)" 등 설비 시퀀스 및 검증 동작을 실시간 텍스트로 표출합니다.
* **세부 정보 그리드**:
- **검사 시간 정보**: 전체 시퀀스 기동 시작 시간 및 종료 시간 표출
- **일련번호 정보**: `IC S/N`, **`Marking QR :`** (마킹 생성 QR 값), **`Scan QR :`** (스캐너 실측 QR 값), `각인 번호` 4개 항목을 수직 배열로 표출
diff --git a/marking_gui/Manual/07_시험_프로세스.md b/marking_gui/Manual/07_시험_프로세스.md
index fa876ef..7935047 100644
--- a/marking_gui/Manual/07_시험_프로세스.md
+++ b/marking_gui/Manual/07_시험_프로세스.md
@@ -82,8 +82,8 @@ graph TD
2. **QR 스캔 검증 실패 (팝업 유지 및 연속 재스캔 지원)**
- 스캔된 QR 코드가 불일치(대조 실패)할 경우, 팝업 창이 **자동으로 닫히지 않고 열린 상태를 유지**하며 "QR 바코드 불일치" 경고 상태를 표출합니다.
- 팝업이 열려 있는 동안 바코드/QR 스캐너 또는 키보드 입력을 통해 올바른 QR 코드로 **연속 재스캔**할 수 있으며, 재스캔에서 대조 성공 시 자동으로 통과(닫힘) 및 DB `OK` 저장 처리됩니다.
- - 대조 불일치 상태에서 작업자가 **[확인]** 또는 **[취소]** (ESC 키) 버튼을 누르면 팝업 창이 닫히며, 판정 결과 **`NG`**로 데이터베이스 저장을 완료합니다.
+ - 대조 불일치 상태에서 작업자가 **[확인]** 또는 **[취소]** (ESC 키) 버튼을 누르면 팝업 창이 닫히며, 판정 결과 **`NG`**로 처리됩니다. (**DB에 저장하지 않으므로 각인 순번 카운트가 증가하지 않습니다.**)
- 팝업이 닫힘과 동시에 메인 화면의 대형 판정 카드가 **`OK`**에서 **`NG`** (빨간색 테두리 및 배경)로 전환됩니다.
- - 공정 진행 상태 및 시스템 상태 바에 `"마킹 완료 / 각인 QR 검증 NG"`, `"상태: 검사 불합격 (각인 QR 검증 실패)"`, `"각인 QR 검증 실패 (DB NG 저장 완료)"` 등 구체적인 원인 설명이 표시되며, DB에 최종 `NG` 결과로 기록됩니다.
+ - 공정 진행 상태 및 시스템 상태 바에 `"마킹 완료 / 각인 QR 검증 NG"`, `"상태: 각인 QR 검증 불합격 (NG, DB 미저장)"` 등 구체적인 원인 설명이 표시됩니다. **NG 판정 시 DB에 기록하지 않으므로** 불량 제품이 집계 순번에 포함되지 않습니다.
diff --git a/marking_gui/Manual/Manual_Merged.md b/marking_gui/Manual/Manual_Merged.md
index dbf36f9..e32a411 100644
--- a/marking_gui/Manual/Manual_Merged.md
+++ b/marking_gui/Manual/Manual_Merged.md
@@ -654,7 +654,7 @@ Channel=1 ; 통신 채널 번호 (1 또는 2)
### 3.2.4 [카드 4] 최종 판정 및 종합 상태 영역 (우측 하단)
진행 상황 및 최종 판정 결과를 통합 표시하는 영역입니다.
-* **💬 진행 상황 뱃지**: "대기 상태", "제품 정보 수집 중...", "측정 계측기 데이터 수집 중...", "제품 합격 - 레이저 각인 중...", "각인 QR 검증 실패 (DB NG 저장 완료)" 등 설비 시퀀스 및 검증 동작을 실시간 텍스트로 표출합니다.
+* **💬 진행 상황 뱃지**: "대기 상태", "제품 정보 수집 중...", "측정 계측기 데이터 수집 중...", "제품 합격 - 레이저 각인 중...", "각인 QR 검증 실패 (DB 미저장, 순번 유지)" 등 설비 시퀀스 및 검증 동작을 실시간 텍스트로 표출합니다.
* **세부 정보 그리드**:
- **검사 시간 정보**: 전체 시퀀스 기동 시작 시간 및 종료 시간 표출
- **일련번호 정보**: `IC S/N`, **`Marking QR :`** (마킹 생성 QR 값), **`Scan QR :`** (스캐너 실측 QR 값), `각인 번호` 4개 항목을 수직 배열로 표출
@@ -900,9 +900,9 @@ graph TD
2. **QR 스캔 검증 실패 (팝업 유지 및 연속 재스캔 지원)**
- 스캔된 QR 코드가 불일치(대조 실패)할 경우, 팝업 창이 **자동으로 닫히지 않고 열린 상태를 유지**하며 "QR 바코드 불일치" 경고 상태를 표출합니다.
- 팝업이 열려 있는 동안 바코드/QR 스캐너 또는 키보드 입력을 통해 올바른 QR 코드로 **연속 재스캔**할 수 있으며, 재스캔에서 대조 성공 시 자동으로 통과(닫힘) 및 DB `OK` 저장 처리됩니다.
- - 대조 불일치 상태에서 작업자가 **[확인]** 또는 **[취소]** (ESC 키) 버튼을 누르면 팝업 창이 닫히며, 판정 결과 **`NG`**로 데이터베이스 저장을 완료합니다.
+ - 대조 불일치 상태에서 작업자가 **[확인]** 또는 **[취소]** (ESC 키) 버튼을 누르면 팝업 창이 닫히며, 판정 결과 **`NG`**로 처리됩니다. (**DB에 저장하지 않으므로 각인 순번 카운트가 증가하지 않습니다.**)
- 팝업이 닫힘과 동시에 메인 화면의 대형 판정 카드가 **`OK`**에서 **`NG`** (빨간색 테두리 및 배경)로 전환됩니다.
- - 공정 진행 상태 및 시스템 상태 바에 `"마킹 완료 / 각인 QR 검증 NG"`, `"상태: 검사 불합격 (각인 QR 검증 실패)"`, `"각인 QR 검증 실패 (DB NG 저장 완료)"` 등 구체적인 원인 설명이 표시되며, DB에 최종 `NG` 결과로 기록됩니다.
+ - 공정 진행 상태 및 시스템 상태 바에 `"마킹 완료 / 각인 QR 검증 NG"`, `"상태: 각인 QR 검증 불합격 (NG, DB 미저장)"` 등 구체적인 원인 설명이 표시됩니다. **NG 판정 시 DB에 기록하지 않으므로** 불량 제품이 집계 순번에 포함되지 않습니다.
diff --git a/marking_gui/Manual/Manual_for_pdf.html b/marking_gui/Manual/Manual_for_pdf.html
index 5a9e004..08095ec 100644
--- a/marking_gui/Manual/Manual_for_pdf.html
+++ b/marking_gui/Manual/Manual_for_pdf.html
@@ -745,7 +745,7 @@ Channel=1 ; 통신 채널 번호 (1 또는 2)

3.2.4 [카드 4] 최종 판정 및 종합 상태 영역 (우측 하단)
진행 상황 및 최종 판정 결과를 통합 표시하는 영역입니다.
-* 💬 진행 상황 뱃지: "대기 상태", "제품 정보 수집 중...", "측정 계측기 데이터 수집 중...", "제품 합격 - 레이저 각인 중...", "각인 QR 검증 실패 (DB NG 저장 완료)" 등 설비 시퀀스 및 검증 동작을 실시간 텍스트로 표출합니다.
+* 💬 진행 상황 뱃지: "대기 상태", "제품 정보 수집 중...", "측정 계측기 데이터 수집 중...", "제품 합격 - 레이저 각인 중...", "각인 QR 검증 실패 (DB 미저장, 순번 유지)" 등 설비 시퀀스 및 검증 동작을 실시간 텍스트로 표출합니다.
* 세부 정보 그리드:
- 검사 시간 정보: 전체 시퀀스 기동 시작 시간 및 종료 시간 표출
- 일련번호 정보: IC S/N, Marking QR : (마킹 생성 QR 값), Scan QR : (스캐너 실측 QR 값), 각인 번호 4개 항목을 수직 배열로 표출
@@ -986,9 +986,9 @@ Channel=1 ; 통신 채널 번호 (1 또는 2)
스캔된 QR 코드가 불일치(대조 실패)할 경우, 팝업 창이 자동으로 닫히지 않고 열린 상태를 유지하며 "QR 바코드 불일치" 경고 상태를 표출합니다.
팝업이 열려 있는 동안 바코드/QR 스캐너 또는 키보드 입력을 통해 올바른 QR 코드로 연속 재스캔할 수 있으며, 재스캔에서 대조 성공 시 자동으로 통과(닫힘) 및 DB OK 저장 처리됩니다.
-대조 불일치 상태에서 작업자가 [확인] 또는 [취소] (ESC 키) 버튼을 누르면 팝업 창이 닫히며, 판정 결과 NG로 데이터베이스 저장을 완료합니다.
+대조 불일치 상태에서 작업자가 [확인] 또는 [취소] (ESC 키) 버튼을 누르면 팝업 창이 닫히며, 판정 결과 NG로 처리됩니다. (DB에 저장하지 않으므로 각인 순번 카운트가 증가하지 않습니다.)
팝업이 닫힘과 동시에 메인 화면의 대형 판정 카드가 OK에서 NG (빨간색 테두리 및 배경)로 전환됩니다.
-공정 진행 상태 및 시스템 상태 바에 "마킹 완료 / 각인 QR 검증 NG", "상태: 검사 불합격 (각인 QR 검증 실패)", "각인 QR 검증 실패 (DB NG 저장 완료)" 등 구체적인 원인 설명이 표시되며, DB에 최종 NG 결과로 기록됩니다.
+공정 진행 상태 및 시스템 상태 바에 "마킹 완료 / 각인 QR 검증 NG", "상태: 각인 QR 검증 불합격 (NG, DB 미저장)" 등 구체적인 원인 설명이 표시됩니다. NG 판정 시 DB에 기록하지 않으므로 불량 제품이 집계 순번에 포함되지 않습니다.