Improve 8092 default contract detail loading
This commit is contained in:
@@ -787,13 +787,22 @@ def get_erp_project_code_cache(conn, source_page='const'):
|
|||||||
{
|
{
|
||||||
'projectCode': row[0],
|
'projectCode': row[0],
|
||||||
'projectName': row[1],
|
'projectName': row[1],
|
||||||
'contractType': row[2] or '',
|
'businessCode': row[2] or '',
|
||||||
'applicationType': row[3] or '',
|
'siteLocation': row[3] or '',
|
||||||
|
'clientName': row[4] or '',
|
||||||
|
'finalContractAmountText': row[5] or '',
|
||||||
|
'contractType': row[6] or '',
|
||||||
|
'applicationType': row[7] or '',
|
||||||
|
'syncedAt': row[8] or '',
|
||||||
}
|
}
|
||||||
for row in conn.execute(
|
for row in conn.execute(
|
||||||
'''
|
'''
|
||||||
SELECT p.projectCode,
|
SELECT p.projectCode,
|
||||||
p.projectName,
|
p.projectName,
|
||||||
|
COALESCE(d.businessCode, '') AS businessCode,
|
||||||
|
COALESCE(d.siteLocation, '') AS siteLocation,
|
||||||
|
COALESCE(d.clientName, '') AS clientName,
|
||||||
|
COALESCE(d.finalContractAmountText, '') AS finalContractAmountText,
|
||||||
COALESCE(d.contractType, '') AS contractType,
|
COALESCE(d.contractType, '') AS contractType,
|
||||||
COALESCE((
|
COALESCE((
|
||||||
SELECT GROUP_CONCAT(applicationType, '||')
|
SELECT GROUP_CONCAT(applicationType, '||')
|
||||||
@@ -805,7 +814,8 @@ def get_erp_project_code_cache(conn, source_page='const'):
|
|||||||
AND IFNULL(b.applicationType, '') <> ''
|
AND IFNULL(b.applicationType, '') <> ''
|
||||||
ORDER BY b.applicationType
|
ORDER BY b.applicationType
|
||||||
)
|
)
|
||||||
), '') AS applicationType
|
), '') AS applicationType,
|
||||||
|
COALESCE(d.syncedAt, '') AS detailSyncedAt
|
||||||
FROM erp_project_code_cache p
|
FROM erp_project_code_cache p
|
||||||
LEFT JOIN erp_contract_detail_cache d
|
LEFT JOIN erp_contract_detail_cache d
|
||||||
ON d.sourcePage = p.sourcePage
|
ON d.sourcePage = p.sourcePage
|
||||||
|
|||||||
@@ -833,7 +833,11 @@
|
|||||||
|
|
||||||
detailTitle.textContent = `${detail.projectName || '-'} [${detail.projectCode}]`;
|
detailTitle.textContent = `${detail.projectName || '-'} [${detail.projectCode}]`;
|
||||||
detailMeta.textContent = `사업코드 ${detail.businessCode || '-'} · 마지막 동기화 ${detail.syncedAt || '-'}`;
|
detailMeta.textContent = `사업코드 ${detail.businessCode || '-'} · 마지막 동기화 ${detail.syncedAt || '-'}`;
|
||||||
|
renderDetailRows(detail);
|
||||||
|
renderMergedBridgeRows(detail.scaleRows || [], state.bridgeOverviews || [], state.budgetPlan);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderDetailRows(detail) {
|
||||||
const rows = [
|
const rows = [
|
||||||
['사업코드', detail.businessCode],
|
['사업코드', detail.businessCode],
|
||||||
['약칭', detail.projectName],
|
['약칭', detail.projectName],
|
||||||
@@ -856,8 +860,6 @@
|
|||||||
<td>${typeof value === 'string' && value.includes('<table') ? value : escapeHtml(value || '-')}</td>
|
<td>${typeof value === 'string' && value.includes('<table') ? value : escapeHtml(value || '-')}</td>
|
||||||
</tr>
|
</tr>
|
||||||
`).join('');
|
`).join('');
|
||||||
|
|
||||||
renderMergedBridgeRows(detail.scaleRows || [], state.bridgeOverviews || [], state.budgetPlan);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function normalizeBridgeName(value) {
|
function normalizeBridgeName(value) {
|
||||||
@@ -1168,12 +1170,45 @@
|
|||||||
|
|
||||||
if (!detailResponse.ok) {
|
if (!detailResponse.ok) {
|
||||||
if (!refresh && detailResponse.status === 404) {
|
if (!refresh && detailResponse.status === 404) {
|
||||||
state.detail = null;
|
|
||||||
state.bridgeOverviews = overviewResponse.ok ? (Array.isArray(overviewData.overviews) ? overviewData.overviews : []) : [];
|
state.bridgeOverviews = overviewResponse.ok ? (Array.isArray(overviewData.overviews) ? overviewData.overviews : []) : [];
|
||||||
state.budgetPlan = budgetPlanResponse.ok ? (budgetPlanData.plan || null) : null;
|
state.budgetPlan = budgetPlanResponse.ok ? (budgetPlanData.plan || null) : null;
|
||||||
detailTitle.textContent = `${projectName || '-'} [${projectCode}]`;
|
detailTitle.textContent = `${projectName || '-'} [${projectCode}]`;
|
||||||
detailMeta.textContent = 'DB 캐시에 계약정보가 없습니다. 새 정보 다시 가져오기를 누르면 ERP에서 수집합니다.';
|
detailMeta.textContent = 'DB 캐시에 계약정보가 없어 ERP에서 기본 계약정보를 가져오는 중입니다.';
|
||||||
detailBody.innerHTML = '<tr><td colspan="2" class="empty">저장된 계약정보가 없습니다. 최신 정보가 필요하면 오른쪽 상단 버튼을 눌러주세요.</td></tr>';
|
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);
|
renderMergedBridgeRows([], state.bridgeOverviews || [], state.budgetPlan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1184,7 +1219,12 @@
|
|||||||
state.bridgeOverviews = Array.isArray(overviewData.overviews) ? overviewData.overviews : [];
|
state.bridgeOverviews = Array.isArray(overviewData.overviews) ? overviewData.overviews : [];
|
||||||
state.budgetPlan = budgetPlanResponse.ok ? (budgetPlanData.plan || null) : null;
|
state.budgetPlan = budgetPlanResponse.ok ? (budgetPlanData.plan || null) : null;
|
||||||
if (state.selectedRow && state.detail) {
|
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.contractType = state.detail.contractType || state.selectedRow.contractType || '';
|
||||||
|
state.selectedRow.syncedAt = state.detail.syncedAt || state.selectedRow.syncedAt || '';
|
||||||
state.selectedRow.applicationType = Array.from(new Set(
|
state.selectedRow.applicationType = Array.from(new Set(
|
||||||
state.bridgeOverviews.map((item) => String(item.applicationType || '').trim()).filter(Boolean)
|
state.bridgeOverviews.map((item) => String(item.applicationType || '').trim()).filter(Boolean)
|
||||||
)).sort((a, b) => a.localeCompare(b, 'ko')).join('||') || state.selectedRow.applicationType || '';
|
)).sort((a, b) => a.localeCompare(b, 'ko')).join('||') || state.selectedRow.applicationType || '';
|
||||||
|
|||||||
Reference in New Issue
Block a user