fix: tag_metadata orphan cleanup on metadata reload
This commit is contained in:
@@ -37,6 +37,13 @@ public class MetadataLoaderService : IMetadataLoaderService
|
|||||||
var baseTagSet = baseTags.ToHashSet(StringComparer.OrdinalIgnoreCase);
|
var baseTagSet = baseTags.ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||||
if (baseTagSet.Count == 0) return 0;
|
if (baseTagSet.Count == 0) return 0;
|
||||||
|
|
||||||
|
// ── Step 0: realtime_table에 없는 orphan base_tag 삭제 ─────────────
|
||||||
|
await _ctx.Database.ExecuteSqlRawAsync(@"
|
||||||
|
DELETE FROM tag_metadata
|
||||||
|
WHERE base_tag NOT IN (
|
||||||
|
SELECT DISTINCT LOWER(split_part(tagname, '.', 1)) FROM realtime_table
|
||||||
|
)");
|
||||||
|
|
||||||
// ── Step 1: node_map_master에서 실제 node_id 조회 ──────────────────
|
// ── Step 1: node_map_master에서 실제 node_id 조회 ──────────────────
|
||||||
// hostname을 직접 조성하지 않고 DB에 저장된 원본 node_id를 사용
|
// hostname을 직접 조성하지 않고 DB에 저장된 원본 node_id를 사용
|
||||||
var masterNodes = await _ctx.NodeMapMasters
|
var masterNodes = await _ctx.NodeMapMasters
|
||||||
|
|||||||
@@ -686,7 +686,7 @@
|
|||||||
태그의 desc, area, state descriptor 정보를 OPC UA에서 조회하여 저장합니다.
|
태그의 desc, area, state descriptor 정보를 OPC UA에서 조회하여 저장합니다.
|
||||||
</p>
|
</p>
|
||||||
<div class="btn-row">
|
<div class="btn-row">
|
||||||
<button class="btn-a" onclick="metaReload()">🔄 메타데이터 로드</button>
|
<button class="btn-a" onclick="metaReload()">🔄 메타데이터 갱신</button>
|
||||||
<button class="btn-b" onclick="metaView()">📋 메타데이터 조회</button>
|
<button class="btn-b" onclick="metaView()">📋 메타데이터 조회</button>
|
||||||
</div>
|
</div>
|
||||||
<div id="meta-log" class="logbox hidden" style="margin-top:8px"></div>
|
<div id="meta-log" class="logbox hidden" style="margin-top:8px"></div>
|
||||||
|
|||||||
@@ -954,7 +954,7 @@ async function metaReload() {
|
|||||||
};
|
};
|
||||||
const logEl = document.getElementById('meta-log');
|
const logEl = document.getElementById('meta-log');
|
||||||
logEl.classList.remove('hidden');
|
logEl.classList.remove('hidden');
|
||||||
logEl.innerHTML = '<div class="ll inf">⏳ 메타데이터 재로드 중...</div>';
|
logEl.innerHTML = '<div class="ll inf">⏳ 메타데이터 갱신 중...</div>';
|
||||||
try {
|
try {
|
||||||
const d = await api('POST', '/api/tags/metadata/reload', body);
|
const d = await api('POST', '/api/tags/metadata/reload', body);
|
||||||
logEl.innerHTML = `<div class="ll ${d.success ? 'ok' : 'err'}">${d.success ? '✅' : '❌'} ${esc(d.message)}</div>`;
|
logEl.innerHTML = `<div class="ll ${d.success ? 'ok' : 'err'}">${d.success ? '✅' : '❌'} ${esc(d.message)}</div>`;
|
||||||
|
|||||||
Reference in New Issue
Block a user