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; }