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:
@@ -89,7 +89,7 @@ public class PidExtractorService : IPidExtractorService
|
|||||||
|
|
||||||
var category = await MatchCategoryAsync(item.TagNo);
|
var category = await MatchCategoryAsync(item.TagNo);
|
||||||
var tagDcs = await ResolveTagDcsAsync(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
|
var newItem = new PidEquipment
|
||||||
{
|
{
|
||||||
@@ -823,24 +823,15 @@ public class PidExtractorService : IPidExtractorService
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 계기(instrument) 하위 분류.
|
/// 계기(instrument) 하위 분류. tag_dcs(prefix rule)가 단일 기준.
|
||||||
/// tag_dcs(prefix rule 기반)를 우선 신호로 사용:
|
/// tag_dcs=TRUE → system (DCS 함수블록: FIC/TIC/PIC류)
|
||||||
/// tag_dcs=TRUE → system (DCS 함수블록 확정. FT 전송기가 Experion에 연결돼도 field)
|
/// tag_dcs=FALSE → field (현장 물리 계기: FT/FCV류)
|
||||||
/// tag_dcs=FALSE → field (현장 물리 계기)
|
/// instrument 이외 카테고리는 null.
|
||||||
/// hasExperionLink는 더 이상 TagClass 결정에 사용하지 않음
|
|
||||||
/// (ExperionTagId FK로 연결 정보는 보존됨).
|
|
||||||
/// instrument 가 아닌 카테고리는 null.
|
|
||||||
/// </summary>
|
/// </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)
|
if (category != PidEquipment.CategoryInstrument) return null;
|
||||||
return null;
|
return tagDcs ? PidEquipment.TagClassSystem : PidEquipment.TagClassField;
|
||||||
|
|
||||||
// tag_dcs=TRUE: prefix rule이 ground truth → system 확정
|
|
||||||
if (tagDcs) return PidEquipment.TagClassSystem;
|
|
||||||
|
|
||||||
// tag_dcs=FALSE: 현장 계기 → field (hasExperionLink 무관)
|
|
||||||
return PidEquipment.TagClassField;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Prefix Rule CRUD ───────────────────────────────────────────────────────
|
// ── Prefix Rule CRUD ───────────────────────────────────────────────────────
|
||||||
@@ -916,7 +907,7 @@ public class PidExtractorService : IPidExtractorService
|
|||||||
var tagDcs = await ResolveTagDcsAsync(item.TagNo);
|
var tagDcs = await ResolveTagDcsAsync(item.TagNo);
|
||||||
item.Category = category;
|
item.Category = category;
|
||||||
item.TagDcs = tagDcs;
|
item.TagDcs = tagDcs;
|
||||||
item.TagClass = ClassifyTagClass(item.TagNo, category, tagDcs, item.ExperionTagId != null);
|
item.TagClass = ClassifyTagClass(category, tagDcs);
|
||||||
item.UpdatedAt = DateTime.UtcNow;
|
item.UpdatedAt = DateTime.UtcNow;
|
||||||
total++;
|
total++;
|
||||||
}
|
}
|
||||||
@@ -938,7 +929,7 @@ public class PidExtractorService : IPidExtractorService
|
|||||||
{
|
{
|
||||||
var tagDcs = await ResolveTagDcsAsync(item.TagNo);
|
var tagDcs = await ResolveTagDcsAsync(item.TagNo);
|
||||||
item.TagDcs = tagDcs;
|
item.TagDcs = tagDcs;
|
||||||
item.TagClass = ClassifyTagClass(item.TagNo, item.Category, tagDcs, item.ExperionTagId != null);
|
item.TagClass = ClassifyTagClass(item.Category, tagDcs);
|
||||||
item.UpdatedAt = DateTime.UtcNow;
|
item.UpdatedAt = DateTime.UtcNow;
|
||||||
total++;
|
total++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -410,7 +410,6 @@ async function pidRefreshPrefixRules() {
|
|||||||
|
|
||||||
// 그룹 헤더: 규칙이 0건이어도 추가 입력행은 항상 표시
|
// 그룹 헤더: 규칙이 0건이어도 추가 입력행은 항상 표시
|
||||||
const count = rules ? rules.length : 0;
|
const count = rules ? rules.length : 0;
|
||||||
const isInstr = vcat === 'instrument_dcs' || vcat === 'instrument_field';
|
|
||||||
|
|
||||||
html += `<div class="pid-cat-group" data-vcat="${vcat}">
|
html += `<div class="pid-cat-group" data-vcat="${vcat}">
|
||||||
<div class="pid-cat-header">
|
<div class="pid-cat-header">
|
||||||
@@ -427,18 +426,10 @@ async function pidRefreshPrefixRules() {
|
|||||||
|
|
||||||
if (rules) {
|
if (rules) {
|
||||||
for (const r of 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">
|
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-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-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" />
|
<input class="inp pid-cat-order-input" type="number" value="${r.sortOrder}" style="width:44px" />
|
||||||
${dcsToggle}
|
|
||||||
<span class="pid-cat-actions">
|
<span class="pid-cat-actions">
|
||||||
<button class="btn-sm btn-a" onclick="pidUpdatePrefixRule(${r.id}, this)">수정</button>
|
<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>
|
<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 prefix = row.querySelector('.pid-cat-prefix-input').value.trim();
|
||||||
const desc = row.querySelector('.pid-cat-desc-input').value.trim();
|
const desc = row.querySelector('.pid-cat-desc-input').value.trim();
|
||||||
const order = parseInt(row.querySelector('.pid-cat-order-input').value) || 10;
|
const order = parseInt(row.querySelector('.pid-cat-order-input').value) || 10;
|
||||||
// instrument 행에는 DCS 토글이 있음 → 체크 상태로 tagDcs 결정 (그룹 이동 가능)
|
// tagDcs는 그룹(vcat)이 결정 — 행에 별도 체크박스 없음
|
||||||
// 그 외 행에는 토글 없음 → 그룹 기본값 사용
|
// 그룹 이동이 필요하면 삭제 후 반대 그룹에서 추가
|
||||||
const dcsInput = row.querySelector('.pid-cat-dcs-input');
|
const tagDcs = CATEGORY_META[vcat]?.tagDcs ?? false;
|
||||||
const tagDcs = dcsInput ? dcsInput.checked : (CATEGORY_META[vcat]?.tagDcs ?? false);
|
|
||||||
|
|
||||||
if (!prefix) { alert('Prefix를 입력하세요.'); return; }
|
if (!prefix) { alert('Prefix를 입력하세요.'); return; }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user