refactor: DCS 분류 로직 정리 — 죽은 코드 제거

## 변경 내용

### 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 <noreply@anthropic.com>
This commit is contained in:
windpacer
2026-05-27 15:56:33 +09:00
parent 300dfe65a4
commit 543ce85af5
2 changed files with 13 additions and 32 deletions

View File

@@ -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
}
/// <summary>
/// 계기(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.
/// </summary>
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++;
}

View File

@@ -410,7 +410,6 @@ async function pidRefreshPrefixRules() {
// 그룹 헤더: 규칙이 0건이어도 추가 입력행은 항상 표시
const count = rules ? rules.length : 0;
const isInstr = vcat === 'instrument_dcs' || vcat === 'instrument_field';
html += `<div class="pid-cat-group" data-vcat="${vcat}">
<div class="pid-cat-header">
@@ -427,18 +426,10 @@ async function pidRefreshPrefixRules() {
if (rules) {
for (const r of rules) {
// instrument 그룹은 DCS 이동용 토글 표시 (체크 해제 시 반대 그룹으로 이동)
const dcsToggle = isInstr
? `<label style="display:flex;align-items:center;gap:3px;cursor:pointer;white-space:nowrap" title="DCS 태그 여부 변경 후 수정 클릭">
<input type="checkbox" class="pid-cat-dcs-input" ${r.tagDcs ? 'checked' : ''} style="margin:0" />
<span style="font-size:10px;color:var(--t2)">DCS</span>
</label>`
: '';
html += `<div class="pid-cat-row">
<input class="inp pid-cat-prefix-input" value="${esc(r.prefix)}" style="width:80px;font-family:var(--mono)" />
<input class="inp pid-cat-desc-input" value="${esc(r.description) || ''}" style="flex:1;min-width:0" />
<input class="inp pid-cat-order-input" type="number" value="${r.sortOrder}" style="width:44px" />
${dcsToggle}
<span class="pid-cat-actions">
<button class="btn-sm btn-a" onclick="pidUpdatePrefixRule(${r.id}, this)">수정</button>
<button class="btn-sm btn-b" onclick="pidDeletePrefixRule(${r.id}, '${esc(r.prefix)}')">삭제</button>
@@ -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; }