Normalize 8092 girder spec rowspan rows

This commit is contained in:
2026-06-09 11:51:25 +09:00
parent 20dcb839dd
commit 754764edfa

View File

@@ -1080,13 +1080,18 @@ def _parse_budget_girder_specs(rows):
specs = []
if len(rows) < 2:
return specs
expected_cells = max(len(rows[0]) - 1, 0)
for row in rows[1:]:
if not row:
continue
first = _as_text(row[0]).strip()
if not first or '조회된 내용이 없습니다' in first:
continue
padded = row + [''] * max(0, 7 - len(row))
if expected_cells and len(row) < expected_cells:
padded = ([''] * (expected_cells - len(row))) + row
else:
padded = row[:]
padded += [''] * max(0, 7 - len(padded))
specs.append({
'extension': _as_text(padded[0]).strip(),
'width': _as_text(padded[1]).strip(),
@@ -1099,6 +1104,39 @@ def _parse_budget_girder_specs(rows):
return specs
def _normalize_budget_girder_specs(specs):
normalized = []
previous_extension = ''
previous_width = ''
for row in specs or []:
current = dict(row or {})
if (
current.get('extension')
and current.get('width')
and current.get('length')
and current.get('height')
and not current.get('quantity')
and not current.get('formCount')
):
current = {
**current,
'extension': '',
'width': '',
'length': current.get('extension', ''),
'height': current.get('width', ''),
'quantity': current.get('length', ''),
'formCount': current.get('height', ''),
}
if not _as_text(current.get('extension')).strip() and previous_extension:
current['extension'] = previous_extension
if not _as_text(current.get('width')).strip() and previous_width:
current['width'] = previous_width
previous_extension = _as_text(current.get('extension')).strip() or previous_extension
previous_width = _as_text(current.get('width')).strip() or previous_width
normalized.append(current)
return normalized
def _parse_budget_predeck(rows):
result = {'generalArea': '', 'medianArea': '', 'barrierArea': '', 'remarks': ''}
if len(rows) < 2:
@@ -1251,6 +1289,7 @@ def get_erp_budget_plan_cache(conn, source_page='const', project_code=''):
if not row:
return None
payload = json.loads(row[5] or '{}')
girder_specs = _normalize_budget_girder_specs(payload.get('girderSpecs') or [])
return {
'sourcePage': source_page,
'projectCode': project_code,
@@ -1262,7 +1301,7 @@ def get_erp_budget_plan_cache(conn, source_page='const', project_code=''):
'summary': payload.get('summary') or {},
'inputDays': payload.get('inputDays') or {},
'inputRebar': payload.get('inputRebar') or {},
'girderSpecs': payload.get('girderSpecs') or [],
'girderSpecs': girder_specs,
'predeck': payload.get('predeck') or {},
'crossbeam': payload.get('crossbeam') or {},
'syncedAt': row[6] or '',