Improve 8092 default contract detail loading

This commit is contained in:
2026-06-09 10:23:49 +09:00
parent 54def57e99
commit bc5d68e465
2 changed files with 58 additions and 8 deletions

View File

@@ -833,7 +833,11 @@
detailTitle.textContent = `${detail.projectName || '-'} [${detail.projectCode}]`;
detailMeta.textContent = `사업코드 ${detail.businessCode || '-'} · 마지막 동기화 ${detail.syncedAt || '-'}`;
renderDetailRows(detail);
renderMergedBridgeRows(detail.scaleRows || [], state.bridgeOverviews || [], state.budgetPlan);
}
function renderDetailRows(detail) {
const rows = [
['사업코드', detail.businessCode],
['약칭', detail.projectName],
@@ -856,8 +860,6 @@
<td>${typeof value === 'string' && value.includes('<table') ? value : escapeHtml(value || '-')}</td>
</tr>
`).join('');
renderMergedBridgeRows(detail.scaleRows || [], state.bridgeOverviews || [], state.budgetPlan);
}
function normalizeBridgeName(value) {
@@ -1168,12 +1170,45 @@
if (!detailResponse.ok) {
if (!refresh && detailResponse.status === 404) {
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>';
detailMeta.textContent = 'DB 캐시에 계약정보가 없어 ERP에서 기본 계약정보를 가져오는 중입니다.';
try {
const freshDetailResponse = await fetch(
`/api/erp-contract-detail?page=const&projectCode=${encodeURIComponent(projectCode)}&projectName=${encodeURIComponent(projectName || '')}&refresh=1`,
{ cache: 'no-store' }
);
const freshDetailData = await freshDetailResponse.json();
if (freshDetailResponse.ok) {
state.detail = freshDetailData.detail || null;
if (state.selectedRow && state.detail) {
state.selectedRow.businessCode = state.detail.businessCode || state.selectedRow.businessCode || '';
state.selectedRow.siteLocation = state.detail.siteLocation || state.selectedRow.siteLocation || '';
state.selectedRow.clientName = state.detail.clientName || state.selectedRow.clientName || '';
state.selectedRow.finalContractAmountText = state.detail.finalContractAmountText || state.selectedRow.finalContractAmountText || '';
state.selectedRow.contractType = state.detail.contractType || state.selectedRow.contractType || '';
state.selectedRow.syncedAt = state.detail.syncedAt || state.selectedRow.syncedAt || '';
}
renderDetail(state.detail);
return;
}
} catch (error) {
}
state.detail = null;
const selectedSummary = state.selectedRow || {};
detailMeta.textContent = '기본 계약정보를 아직 가져오지 않았습니다. 새 정보 다시 가져오기를 누르면 ERP에서 수집합니다.';
renderDetailRows({
businessCode: selectedSummary.businessCode || '',
projectName: projectName || selectedSummary.projectName || '',
projectCode,
siteLocation: selectedSummary.siteLocation || '',
clientName: selectedSummary.clientName || '',
finalContractAmountText: selectedSummary.finalContractAmountText || '',
contractType: selectedSummary.contractType || '',
syncedAt: selectedSummary.syncedAt || '',
});
renderMergedBridgeRows([], state.bridgeOverviews || [], state.budgetPlan);
return;
}
@@ -1184,7 +1219,12 @@
state.bridgeOverviews = Array.isArray(overviewData.overviews) ? overviewData.overviews : [];
state.budgetPlan = budgetPlanResponse.ok ? (budgetPlanData.plan || null) : null;
if (state.selectedRow && state.detail) {
state.selectedRow.businessCode = state.detail.businessCode || state.selectedRow.businessCode || '';
state.selectedRow.siteLocation = state.detail.siteLocation || state.selectedRow.siteLocation || '';
state.selectedRow.clientName = state.detail.clientName || state.selectedRow.clientName || '';
state.selectedRow.finalContractAmountText = state.detail.finalContractAmountText || state.selectedRow.finalContractAmountText || '';
state.selectedRow.contractType = state.detail.contractType || state.selectedRow.contractType || '';
state.selectedRow.syncedAt = state.detail.syncedAt || state.selectedRow.syncedAt || '';
state.selectedRow.applicationType = Array.from(new Set(
state.bridgeOverviews.map((item) => String(item.applicationType || '').trim()).filter(Boolean)
)).sort((a, b) => a.localeCompare(b, 'ko')).join('||') || state.selectedRow.applicationType || '';