From 543ce85af5be4ae8588d6fafd73f7e2b24a9f894 Mon Sep 17 00:00:00 2001 From: windpacer Date: Wed, 27 May 2026 15:56:33 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20DCS=20=EB=B6=84=EB=A5=98=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=A0=95=EB=A6=AC=20=E2=80=94=20=EC=A3=BD?= =?UTF-8?q?=EC=9D=80=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 변경 내용 ### pid.js — PREFIX 행 DCS 체크박스 완전 제거 - 각 prefix 행의 DCS 체크박스/토글 제거 - 그룹 섹션(DCS 태그 / 현장 계기) 자체가 DCS 여부를 명확히 표현 - 그룹 이동 필요 시: 삭제 후 반대 그룹에서 추가 - pidUpdatePrefixRule: tagDcs = 그룹(vcat)에서 결정, 행 입력 불필요 - isInstr 변수 제거 (미사용) ### PidExtractorService.cs — ClassifyTagClass 파라미터 정리 - 시그니처: (tagNo, category, tagDcs, hasExperionLink) → (category, tagDcs) - tagNo: 새 로직에서 완전 미사용 → 제거 - hasExperionLink: tag_dcs 도입으로 역할 소멸 → 제거 - 3개 호출부 모두 갱신 - 로직: category=instrument이면 tagDcs→system/field, 그 외 null (2줄로 단순화) Co-Authored-By: Claude Sonnet 4.6 --- .../Services/PidExtractorService.cs | 29 +++++++------------ src/Web/wwwroot/js/pid.js | 16 ++-------- 2 files changed, 13 insertions(+), 32 deletions(-) diff --git a/src/Core/Application/Services/PidExtractorService.cs b/src/Core/Application/Services/PidExtractorService.cs index 54b3cc3..055b0f7 100644 --- a/src/Core/Application/Services/PidExtractorService.cs +++ b/src/Core/Application/Services/PidExtractorService.cs @@ -89,7 +89,7 @@ public class PidExtractorService : IPidExtractorService var category = await MatchCategoryAsync(item.TagNo); var tagDcs = await ResolveTagDcsAsync(item.TagNo); - var tagClass = ClassifyTagClass(item.TagNo, category, tagDcs, experionTag != null); + var tagClass = ClassifyTagClass(category, tagDcs); var newItem = new PidEquipment { @@ -823,24 +823,15 @@ public class PidExtractorService : IPidExtractorService } /// - /// 계기(instrument) 하위 분류. - /// tag_dcs(prefix rule 기반)를 우선 신호로 사용: - /// tag_dcs=TRUE → system (DCS 함수블록 확정. FT 전송기가 Experion에 연결돼도 field) - /// tag_dcs=FALSE → field (현장 물리 계기) - /// hasExperionLink는 더 이상 TagClass 결정에 사용하지 않음 - /// (ExperionTagId FK로 연결 정보는 보존됨). - /// instrument 가 아닌 카테고리는 null. + /// 계기(instrument) 하위 분류. tag_dcs(prefix rule)가 단일 기준. + /// tag_dcs=TRUE → system (DCS 함수블록: FIC/TIC/PIC류) + /// tag_dcs=FALSE → field (현장 물리 계기: FT/FCV류) + /// instrument 이외 카테고리는 null. /// - private static string? ClassifyTagClass(string tagNo, string? category, bool tagDcs, bool hasExperionLink) + private static string? ClassifyTagClass(string? category, bool tagDcs) { - if (category != PidEquipment.CategoryInstrument) - return null; - - // tag_dcs=TRUE: prefix rule이 ground truth → system 확정 - if (tagDcs) return PidEquipment.TagClassSystem; - - // tag_dcs=FALSE: 현장 계기 → field (hasExperionLink 무관) - return PidEquipment.TagClassField; + if (category != PidEquipment.CategoryInstrument) return null; + return tagDcs ? PidEquipment.TagClassSystem : PidEquipment.TagClassField; } // ── Prefix Rule CRUD ─────────────────────────────────────────────────────── @@ -916,7 +907,7 @@ public class PidExtractorService : IPidExtractorService var tagDcs = await ResolveTagDcsAsync(item.TagNo); item.Category = category; item.TagDcs = tagDcs; - item.TagClass = ClassifyTagClass(item.TagNo, category, tagDcs, item.ExperionTagId != null); + item.TagClass = ClassifyTagClass(category, tagDcs); item.UpdatedAt = DateTime.UtcNow; total++; } @@ -938,7 +929,7 @@ public class PidExtractorService : IPidExtractorService { var tagDcs = await ResolveTagDcsAsync(item.TagNo); item.TagDcs = tagDcs; - item.TagClass = ClassifyTagClass(item.TagNo, item.Category, tagDcs, item.ExperionTagId != null); + item.TagClass = ClassifyTagClass(item.Category, tagDcs); item.UpdatedAt = DateTime.UtcNow; total++; } diff --git a/src/Web/wwwroot/js/pid.js b/src/Web/wwwroot/js/pid.js index 1064b66..690716b 100644 --- a/src/Web/wwwroot/js/pid.js +++ b/src/Web/wwwroot/js/pid.js @@ -410,7 +410,6 @@ async function pidRefreshPrefixRules() { // 그룹 헤더: 규칙이 0건이어도 추가 입력행은 항상 표시 const count = rules ? rules.length : 0; - const isInstr = vcat === 'instrument_dcs' || vcat === 'instrument_field'; html += `
@@ -427,18 +426,10 @@ async function pidRefreshPrefixRules() { if (rules) { for (const r of rules) { - // instrument 그룹은 DCS 이동용 토글 표시 (체크 해제 시 반대 그룹으로 이동) - const dcsToggle = isInstr - ? `` - : ''; html += `
- ${dcsToggle} @@ -500,10 +491,9 @@ async function pidUpdatePrefixRule(id, btn) { const prefix = row.querySelector('.pid-cat-prefix-input').value.trim(); const desc = row.querySelector('.pid-cat-desc-input').value.trim(); const order = parseInt(row.querySelector('.pid-cat-order-input').value) || 10; - // instrument 행에는 DCS 토글이 있음 → 체크 상태로 tagDcs 결정 (그룹 이동 가능) - // 그 외 행에는 토글 없음 → 그룹 기본값 사용 - const dcsInput = row.querySelector('.pid-cat-dcs-input'); - const tagDcs = dcsInput ? dcsInput.checked : (CATEGORY_META[vcat]?.tagDcs ?? false); + // tagDcs는 그룹(vcat)이 결정 — 행에 별도 체크박스 없음 + // 그룹 이동이 필요하면 삭제 후 반대 그룹에서 추가 + const tagDcs = CATEGORY_META[vcat]?.tagDcs ?? false; if (!prefix) { alert('Prefix를 입력하세요.'); return; }