Improve 8092 cache loading and SQLite stability

This commit is contained in:
2026-06-09 10:12:15 +09:00
parent 6ac0964618
commit 54def57e99
3 changed files with 161 additions and 60 deletions

View File

@@ -824,7 +824,7 @@
function renderDetail(detail) {
if (!detail) {
detailTitle.textContent = '계약정보 표';
detailMeta.textContent = '시공코드나 약칭을 클릭하면 DB에 저장된 계약정보를 먼저 보여줍니다.';
detailMeta.textContent = '시공코드나 약칭을 클릭하면 DB 캐시를 먼저 보여줍니다. 최신 정보가 필요하면 새로 가져오기를 누르세요.';
detailBody.innerHTML = '<tr><td colspan="2" class="empty">선택된 시공코드가 없습니다.</td></tr>';
bridgeMeta.textContent = '공사규모와 공사개요를 교량명 기준으로 매칭해서 보여줍니다.';
bridgeBody.innerHTML = '<tr><td colspan="19" class="empty">선택된 시공코드가 없습니다.</td></tr>';
@@ -1148,10 +1148,10 @@
}
detailMeta.textContent = refresh
? 'ERP 계약정보를 DB로 동기화하는 중입니다.'
: 'DB에 저장된 계약정보를 불러오는 중입니다.';
: 'DB 캐시에 저장된 계약정보를 불러오는 중입니다.';
bridgeMeta.textContent = refresh
? 'ERP 공사규모와 공사개요를 동기화하는 중입니다.'
: 'DB에 저장된 공사규모와 공사개요를 불러오는 중입니다.';
: 'DB 캐시에 저장된 공사규모와 공사개요를 불러오는 중입니다.';
detailSyncButton.disabled = true;
try {
const detailUrl = `/api/erp-contract-detail?page=const&projectCode=${encodeURIComponent(projectCode)}&projectName=${encodeURIComponent(projectName || '')}&refresh=${refresh ? '1' : '0'}`;
@@ -1168,37 +1168,21 @@
if (!detailResponse.ok) {
if (!refresh && detailResponse.status === 404) {
return loadDetail(projectCode, projectName, true);
state.detail = null;
state.bridgeOverviews = overviewResponse.ok ? (Array.isArray(overviewData.overviews) ? overviewData.overviews : []) : [];
state.budgetPlan = budgetPlanResponse.ok ? (budgetPlanData.plan || null) : null;
detailTitle.textContent = `${projectName || '-'} [${projectCode}]`;
detailMeta.textContent = 'DB 캐시에 계약정보가 없습니다. 새 정보 다시 가져오기를 누르면 ERP에서 수집합니다.';
detailBody.innerHTML = '<tr><td colspan="2" class="empty">저장된 계약정보가 없습니다. 최신 정보가 필요하면 오른쪽 상단 버튼을 눌러주세요.</td></tr>';
renderMergedBridgeRows([], state.bridgeOverviews || [], state.budgetPlan);
return;
}
throw new Error(data.error || '계약정보 조회에 실패했습니다.');
}
state.detail = data.detail || null;
if (!refresh && (!state.detail || !Array.isArray(state.detail.scaleRows) || !state.detail.scaleRows.length)) {
return loadDetail(projectCode, projectName, true);
}
state.bridgeOverviews = Array.isArray(overviewData.overviews) ? overviewData.overviews : [];
state.budgetPlan = budgetPlanResponse.ok ? (budgetPlanData.plan || null) : null;
if (!refresh && !state.bridgeOverviews.length) {
const freshOverviewResponse = await fetch(
`/api/erp-bridge-overviews?page=const&projectCode=${encodeURIComponent(projectCode)}&projectName=${encodeURIComponent(projectName || '')}&refresh=1`,
{ cache: 'no-store' }
);
const freshOverviewData = await freshOverviewResponse.json();
if (freshOverviewResponse.ok) {
state.bridgeOverviews = Array.isArray(freshOverviewData.overviews) ? freshOverviewData.overviews : [];
}
}
if (!refresh && !state.budgetPlan) {
const freshPlanResponse = await fetch(
`/api/erp-budget-plan?page=const&projectCode=${encodeURIComponent(projectCode)}&projectName=${encodeURIComponent(projectName || '')}&refresh=1`,
{ cache: 'no-store' }
);
const freshPlanData = await freshPlanResponse.json();
if (freshPlanResponse.ok) {
state.budgetPlan = freshPlanData.plan || null;
}
}
if (state.selectedRow && state.detail) {
state.selectedRow.contractType = state.detail.contractType || state.selectedRow.contractType || '';
state.selectedRow.applicationType = Array.from(new Set(