fix(B09): 표 자리 맞춤을 개수 대조로 바꿔 조용한 오독 3종 차단
2단 표를 열자마자 과잉 매칭이 드러남 — 자원 축이 208 → 373 으로 뛰고 최대 단가가 2,436만원이 됨. 「한 칸 밀림」 가정이 표마다 안 맞았음 - **좌우 두 판 + 2단 머리** — 뿌리돌림 05-2 는 `근원직경 | 수량 | 근원직경 | 수량`이라 오른쪽 판의 **직경 100 이 「특별인부 100인」**으로 읽혔음. 첫 줄 머리가 되풀이되면 2단이라도 버림 - **라벨 칸 수가 표마다 다름** — 드론방제 08-6-2 는 라벨이 둘(`구 분 | 항 목`). 고정 보정 대신 **숫자 칸을 순서대로** 맞추고 개수가 다르면 그 행을 버림. 또 머리 줄 이름을 하나라도 못 풀면 표째 버림 — 넷 중 둘만 풀린 채 숫자 둘이 **엉뚱한 직종**에 붙고 있었음 - **차원이 하나 더 있는 표** — 뭉기기 13-12-1 은 행이 공정, 숫자 칸이 토질 3갈래인데 자원 열은 하나뿐이라 **첫 토질 값만 조용히** 서고 있었음. 숫자 칸이 자원 열보다 많으면 버림 결과: 자원 축 231줄(갈래 88) · 일위대가 133 · 최대 5,030,954.6 (품셈대로인 값). 철근 12-3 과 콘크리트 타설 12-1 3갈래는 그대로 섬 검증: pytest 167 통과(신규 2). 갈래 표 5건 손대조 — 전부 표와 일치 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -69,6 +69,16 @@ def second_row_columns(table: dict, catalog: ResourceCatalog):
|
||||
rows = table.get("raw_row") or []
|
||||
if not rows:
|
||||
return [], 0
|
||||
|
||||
# ⚠ **첫 줄 머리가 되풀이되면 좌우 두 판짜리 표다** — 2단이라도 마찬가지다
|
||||
# (뿌리돌림 05-2: `근원직경(㎝) | 수 량 | 근원직경(㎝) | 수 량`).
|
||||
# 이걸 안 가르면 오른쪽 판의 **직경 100 이 「특별인부 100인」**으로 읽혀
|
||||
# 단가가 2,436만원으로 선다(2026-09-08 실측). 공정 머리(가공·조립·계)는
|
||||
# 되풀이가 없으므로 이 검사에 안 걸린다.
|
||||
groups = ["".join(str(h).split()) for h in (table.get("condition_note") or [])[1:]]
|
||||
if len(groups) != len(set(groups)):
|
||||
return [], 0
|
||||
|
||||
header_row = [str(c).strip() for c in rows[0]]
|
||||
found = []
|
||||
for position, cell in enumerate(header_row):
|
||||
@@ -84,16 +94,20 @@ def second_row_columns(table: dict, catalog: ResourceCatalog):
|
||||
if len(found) < 2:
|
||||
return [], 0
|
||||
|
||||
# ⚠ **머리 줄의 이름을 하나라도 못 풀면 자리를 맞출 수 없다.** 드론방제 08-6-2 는
|
||||
# 「드론조종자·부조종자」가 카탈로그에 없어 넷 중 둘만 풀리는데, 그대로 두면
|
||||
# 숫자 두 개짜리 행이 **엉뚱한 직종 둘**에 붙는다. 통째로 버린다.
|
||||
named = [cell for cell in header_row if cell]
|
||||
if len(found) != len(named):
|
||||
return [], 0
|
||||
|
||||
# ⚠ 「계」 묶음은 뺀다 — 가공 + 조립을 이미 더한 값이라 같이 읽으면 두 번 센다.
|
||||
# ⚠ **자리를 고정 보정으로 맞추지 않는다.** 라벨 칸이 하나인 표도 둘인 표도 있어
|
||||
# (드론방제 08-6-2 는 `구 분 | 항 목` 둘) 「한 칸 밀림」으로 단정하면 값이 어긋난다
|
||||
# — 실측에서 「특별인부 0.2352」 자리에 다른 직종 값이 붙었다.
|
||||
# 대신 **자료 행의 숫자 칸을 순서대로** 맞추고, 개수가 다르면 그 행을 버린다.
|
||||
blocked = _sum_group_positions(table.get("condition_note") or [], len(found))
|
||||
# ⚠ 머리 줄에는 **갈래 칸이 없다** — 자료 행은 첫 칸이 갈래 이름이라 한 칸 밀려 있다.
|
||||
# 이 보정을 빼면 갈래 이름 칸을 자원 값으로 읽는다.
|
||||
kept = [
|
||||
(position + 1, entry)
|
||||
for order, (position, entry) in enumerate(found)
|
||||
if order not in blocked
|
||||
]
|
||||
return kept, 1
|
||||
return [(order, entry, order in blocked) for order, (_, entry) in enumerate(found)], 1
|
||||
|
||||
|
||||
def transposed_columns(table: dict[str, Any], catalog: ResourceCatalog) -> list[tuple[int, Any]]:
|
||||
@@ -115,6 +129,73 @@ def transposed_columns(table: dict[str, Any], catalog: ResourceCatalog) -> list[
|
||||
return found
|
||||
|
||||
|
||||
def _match_two_row_table(
|
||||
node: dict,
|
||||
table: dict,
|
||||
catalog: ResourceCatalog,
|
||||
result: AxisResult,
|
||||
unit: str,
|
||||
ordinal: list,
|
||||
skip_rows: int,
|
||||
) -> bool:
|
||||
"""2단 표 — **숫자 칸을 순서대로** 자원에 맞춘다.
|
||||
|
||||
개수가 다른 행은 **버린다.** 라벨 칸 수가 표마다 달라(하나 또는 둘) 자리를
|
||||
단정할 수 없기 때문이다. 「계」 묶음에 든 자원은 맞춘 뒤 뺀다 —
|
||||
가공 + 조립을 이미 더한 값이라 같이 세면 두 번이다.
|
||||
"""
|
||||
work_item_code = node.get("work_item_code", "")
|
||||
table_id = str(table.get("pum_table_id", ""))
|
||||
form = str(table.get("pum_form", ""))
|
||||
rows = (table.get("raw_row") or [])[skip_rows:]
|
||||
labels = [str(row[0]).strip() for row in rows if row]
|
||||
repeated = {label for label in labels if label and labels.count(label) > 1}
|
||||
matched = False
|
||||
|
||||
for index, row in enumerate(rows):
|
||||
cells = [str(c).strip() for c in row]
|
||||
if not cells:
|
||||
continue
|
||||
variant = cells[0]
|
||||
if not variant or _normalize_label(variant) in _TOTAL_LABELS or variant in repeated:
|
||||
continue
|
||||
numbers = [parse_amount(c) for c in cells[1:]]
|
||||
numbers = [value for value in numbers if value is not None]
|
||||
if len(numbers) != len(ordinal):
|
||||
result.unmatched.append(
|
||||
UnmatchedRow(
|
||||
work_item_code=work_item_code,
|
||||
pum_table_id=table_id,
|
||||
cell=variant,
|
||||
reason=(
|
||||
f"숫자 칸 {len(numbers)} 개가 자원 열 {len(ordinal)} 개와 안 맞아 "
|
||||
"버렸습니다(자리 밀림 방지)."
|
||||
),
|
||||
)
|
||||
)
|
||||
continue
|
||||
for (order, entry, blocked), amount in zip(ordinal, numbers):
|
||||
if blocked:
|
||||
continue # 「계」 묶음 — 이미 더한 값이다
|
||||
result.rows.append(
|
||||
ResourceRow(
|
||||
work_item_code=work_item_code,
|
||||
pum_table_id=table_id,
|
||||
pum_form=form,
|
||||
resource_kind=entry.kind,
|
||||
resource_code=entry.code,
|
||||
resource_name=entry.name,
|
||||
resource_spec=entry.spec,
|
||||
amount=amount,
|
||||
amount_unit=unit,
|
||||
raw_row_index=index + skip_rows,
|
||||
variant=variant,
|
||||
)
|
||||
)
|
||||
matched = True
|
||||
return matched
|
||||
|
||||
|
||||
def match_transposed_table(
|
||||
node: dict[str, Any],
|
||||
table: dict[str, Any],
|
||||
@@ -130,9 +211,12 @@ def match_transposed_table(
|
||||
"""
|
||||
columns = transposed_columns(table, catalog)
|
||||
skip_rows = 0
|
||||
ordinal: list = []
|
||||
if not columns:
|
||||
# 자원 이름이 **둘째 줄**에 오는 2단 표일 수 있다.
|
||||
columns, skip_rows = second_row_columns(table, catalog)
|
||||
ordinal, skip_rows = second_row_columns(table, catalog)
|
||||
if ordinal:
|
||||
return _match_two_row_table(node, table, catalog, result, unit, ordinal, skip_rows)
|
||||
if not columns:
|
||||
return False
|
||||
|
||||
@@ -193,6 +277,24 @@ def match_transposed_table(
|
||||
# 첫 칸이 병합된 표에서 값이 한 칸씩 밀려 들어온다(2026-09-08 실측: 목재틀흙막이가
|
||||
# 「건축목공 8.760」 자리에 등급 글자를 두어 단가가 503만원으로 섰다).
|
||||
# **밀린 행은 고쳐 읽지 않고 버린다** — 어느 칸이 어느 자원인지 단정할 수 없다.
|
||||
# ⚠ **숫자 칸이 자원 열보다 많으면 차원이 하나 더 있는 표다.**
|
||||
# 뭉기기 13-12-1 은 행이 공정, 숫자 칸이 토질 3갈래인데 열 머리엔 자원이 하나뿐이라
|
||||
# 그대로 두면 **첫 토질 값만 조용히 취한다**(보통토사 0.16 만 서고 나머지가 사라짐).
|
||||
numeric_count = sum(1 for cell in cells[1:] if parse_amount(cell) is not None)
|
||||
if numeric_count > len(columns):
|
||||
result.unmatched.append(
|
||||
UnmatchedRow(
|
||||
work_item_code=work_item_code,
|
||||
pum_table_id=table_id,
|
||||
cell=variant,
|
||||
reason=(
|
||||
f"숫자 칸 {numeric_count} 개가 자원 열 {len(columns)} 개보다 많습니다 — "
|
||||
"갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다."
|
||||
),
|
||||
)
|
||||
)
|
||||
continue
|
||||
|
||||
readable = [
|
||||
parse_amount(cells[position]) if position < len(cells) else None
|
||||
for position, _ in columns
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -242,6 +242,12 @@
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-04-02-02"
|
||||
},
|
||||
{
|
||||
"cell": "비 고",
|
||||
"pum_table_id": "F0093",
|
||||
"reason": "숫자 칸 0 개가 자원 열 2 개와 안 맞아 버렸습니다(자리 밀림 방지).",
|
||||
"work_item_code": "FP-05-01-02"
|
||||
},
|
||||
{
|
||||
"cell": "지게",
|
||||
"pum_table_id": "F0097",
|
||||
@@ -338,6 +344,54 @@
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-05-08"
|
||||
},
|
||||
{
|
||||
"cell": "절 취",
|
||||
"pum_table_id": "F0121",
|
||||
"reason": "숫자 칸 3 개가 자원 열 1 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-05-16-01"
|
||||
},
|
||||
{
|
||||
"cell": "수평잡기 및 단정리",
|
||||
"pum_table_id": "F0121",
|
||||
"reason": "숫자 칸 3 개가 자원 열 1 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-05-16-01"
|
||||
},
|
||||
{
|
||||
"cell": "잡석 및 뿌리 정리",
|
||||
"pum_table_id": "F0121",
|
||||
"reason": "숫자 칸 3 개가 자원 열 1 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-05-16-01"
|
||||
},
|
||||
{
|
||||
"cell": "절·성토면 고르기",
|
||||
"pum_table_id": "F0121",
|
||||
"reason": "숫자 칸 3 개가 자원 열 1 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-05-16-01"
|
||||
},
|
||||
{
|
||||
"cell": "절 취",
|
||||
"pum_table_id": "F0121",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-05-16-01"
|
||||
},
|
||||
{
|
||||
"cell": "수평잡기 및 단정리",
|
||||
"pum_table_id": "F0121",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-05-16-01"
|
||||
},
|
||||
{
|
||||
"cell": "잡석 및 뿌리 정리",
|
||||
"pum_table_id": "F0121",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-05-16-01"
|
||||
},
|
||||
{
|
||||
"cell": "절·성토면 고르기",
|
||||
"pum_table_id": "F0121",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-05-16-01"
|
||||
},
|
||||
{
|
||||
"cell": "표토절취",
|
||||
"pum_table_id": "F0126",
|
||||
@@ -680,60 +734,6 @@
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-07-13"
|
||||
},
|
||||
{
|
||||
"cell": "600개 이하",
|
||||
"pum_table_id": "F0201",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-01-01"
|
||||
},
|
||||
{
|
||||
"cell": "1,300개 이하",
|
||||
"pum_table_id": "F0201",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-01-01"
|
||||
},
|
||||
{
|
||||
"cell": "2,000개 이하",
|
||||
"pum_table_id": "F0201",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-01-01"
|
||||
},
|
||||
{
|
||||
"cell": "2,700개 이하",
|
||||
"pum_table_id": "F0201",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-01-01"
|
||||
},
|
||||
{
|
||||
"cell": "3,400개 이하",
|
||||
"pum_table_id": "F0201",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-01-01"
|
||||
},
|
||||
{
|
||||
"cell": "4,100개 이하",
|
||||
"pum_table_id": "F0201",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-01-01"
|
||||
},
|
||||
{
|
||||
"cell": "300개 이하",
|
||||
"pum_table_id": "F0202",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-01-02"
|
||||
},
|
||||
{
|
||||
"cell": "900개 이하",
|
||||
"pum_table_id": "F0202",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-01-02"
|
||||
},
|
||||
{
|
||||
"cell": "1,500개 이하",
|
||||
"pum_table_id": "F0202",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-01-02"
|
||||
},
|
||||
{
|
||||
"cell": "경비(기계경비)",
|
||||
"pum_table_id": "F0454",
|
||||
@@ -770,214 +770,100 @@
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-05"
|
||||
},
|
||||
{
|
||||
"cell": "소형헬기 (160ha당)",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "사전조사",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "헬기장정리",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "깃발설치",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "양수기설치",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "약제조제",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "대형헬기 (400ha당)",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "사전조사",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "헬기장정리",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "깃발설치",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "양수기설치",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "약제조제",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "소형헬기 (160ha당)",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "사전조사",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "헬기장정리",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "깃발설치",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "양수기설치",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "약제조제",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "대형헬기 (400ha당)",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "사전조사",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "헬기장정리",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "깃발설치",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "양수기설치",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "약제조제",
|
||||
"pum_table_id": "F0225",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "유인헬기",
|
||||
"pum_table_id": "F0226",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "무인헬기 (ha당)",
|
||||
"pum_table_id": "F0228",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "이착륙장 정리(1개소/4ha)",
|
||||
"pum_table_id": "F0228",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "취수 및 약제조제",
|
||||
"pum_table_id": "F0228",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "약제살포",
|
||||
"pum_table_id": "F0228",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "주유 및 약제충전 기체정비",
|
||||
"pum_table_id": "F0228",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "비행준비",
|
||||
"pum_table_id": "F0228",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "멀티콥터 (ha당)",
|
||||
"pum_table_id": "F0229",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "이착륙장 정리(1개소/4ha)",
|
||||
"pum_table_id": "F0229",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "차량살포 (동력분무기)",
|
||||
"pum_table_id": "F0230",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-03"
|
||||
"cell": "취수 및 약제조제",
|
||||
"pum_table_id": "F0229",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "약제살포",
|
||||
"pum_table_id": "F0229",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "기체 및 약제충전 기체정비",
|
||||
"pum_table_id": "F0229",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "비행준비",
|
||||
"pum_table_id": "F0229",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-02"
|
||||
},
|
||||
{
|
||||
"cell": "사전조사",
|
||||
"pum_table_id": "F0230",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "숫자 칸 1 개가 자원 열 2 개와 안 맞아 버렸습니다(자리 밀림 방지).",
|
||||
"work_item_code": "FP-08-06-03"
|
||||
},
|
||||
{
|
||||
"cell": "운전",
|
||||
"pum_table_id": "F0230",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "숫자 칸 1 개가 자원 열 2 개와 안 맞아 버렸습니다(자리 밀림 방지).",
|
||||
"work_item_code": "FP-08-06-03"
|
||||
},
|
||||
{
|
||||
"cell": "물주입, 살포",
|
||||
"pum_table_id": "F0230",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-06-03"
|
||||
},
|
||||
{
|
||||
"cell": "차량살포 (동력분무기)",
|
||||
"pum_table_id": "F0230",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-03"
|
||||
},
|
||||
{
|
||||
"cell": "사전조사",
|
||||
"pum_table_id": "F0230",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-03"
|
||||
},
|
||||
{
|
||||
"cell": "운전",
|
||||
"pum_table_id": "F0230",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-06-03"
|
||||
},
|
||||
{
|
||||
"cell": "물주입, 살포",
|
||||
"pum_table_id": "F0230",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"reason": "숫자 칸 1 개가 자원 열 2 개와 안 맞아 버렸습니다(자리 밀림 방지).",
|
||||
"work_item_code": "FP-08-06-03"
|
||||
},
|
||||
{
|
||||
@@ -992,66 +878,6 @@
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-09"
|
||||
},
|
||||
{
|
||||
"cell": "1㎥",
|
||||
"pum_table_id": "F0236",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-10"
|
||||
},
|
||||
{
|
||||
"cell": "벌목조재",
|
||||
"pum_table_id": "F0236",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-10"
|
||||
},
|
||||
{
|
||||
"cell": "피복작업",
|
||||
"pum_table_id": "F0236",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-10"
|
||||
},
|
||||
{
|
||||
"cell": "2㎥",
|
||||
"pum_table_id": "F0236",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-10"
|
||||
},
|
||||
{
|
||||
"cell": "벌목조재",
|
||||
"pum_table_id": "F0236",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-10"
|
||||
},
|
||||
{
|
||||
"cell": "피복작업",
|
||||
"pum_table_id": "F0236",
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-08-10"
|
||||
},
|
||||
{
|
||||
"cell": "벌목조재",
|
||||
"pum_table_id": "F0236",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-10"
|
||||
},
|
||||
{
|
||||
"cell": "피복작업",
|
||||
"pum_table_id": "F0236",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-10"
|
||||
},
|
||||
{
|
||||
"cell": "벌목조재",
|
||||
"pum_table_id": "F0236",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-10"
|
||||
},
|
||||
{
|
||||
"cell": "피복작업",
|
||||
"pum_table_id": "F0236",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-08-10"
|
||||
},
|
||||
{
|
||||
"cell": "대형브레이커+ 유압식백호우 (무한궤도,0.7㎥)",
|
||||
"pum_table_id": "F0241",
|
||||
@@ -1460,6 +1286,18 @@
|
||||
"reason": "열 머리가 되풀이되는 두 판 짜리 표 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-10-06-01"
|
||||
},
|
||||
{
|
||||
"cell": "콘크리트",
|
||||
"pum_table_id": "F0313",
|
||||
"reason": "숫자 칸 2 개가 자원 열 1 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-10-08-01"
|
||||
},
|
||||
{
|
||||
"cell": "제 자재",
|
||||
"pum_table_id": "F0313",
|
||||
"reason": "숫자 칸 2 개가 자원 열 1 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-10-08-01"
|
||||
},
|
||||
{
|
||||
"cell": "〃",
|
||||
"pum_table_id": "F0313",
|
||||
@@ -1472,6 +1310,18 @@
|
||||
"reason": "같은 갈래 이름이 두 번 나오는 표 — 등급을 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-10-08-01"
|
||||
},
|
||||
{
|
||||
"cell": "콘크리트",
|
||||
"pum_table_id": "F0313",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-10-08-01"
|
||||
},
|
||||
{
|
||||
"cell": "제 자재",
|
||||
"pum_table_id": "F0313",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-10-08-01"
|
||||
},
|
||||
{
|
||||
"cell": "버켓 손료",
|
||||
"pum_table_id": "F0317",
|
||||
@@ -1778,6 +1628,24 @@
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-13-03"
|
||||
},
|
||||
{
|
||||
"cell": "기초다짐 뒷채움",
|
||||
"pum_table_id": "F0403",
|
||||
"reason": "숫자 칸 4 개가 자원 열 1 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-03-02"
|
||||
},
|
||||
{
|
||||
"cell": "75이상",
|
||||
"pum_table_id": "F0403",
|
||||
"reason": "숫자 칸 4 개가 자원 열 1 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-03-02"
|
||||
},
|
||||
{
|
||||
"cell": "기초다짐 뒷채움",
|
||||
"pum_table_id": "F0403",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-13-03-02"
|
||||
},
|
||||
{
|
||||
"cell": "굴 삭 기 (무한궤도)",
|
||||
"pum_table_id": "F0419",
|
||||
@@ -1793,43 +1661,43 @@
|
||||
{
|
||||
"cell": "8 9",
|
||||
"pum_table_id": "F0430",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "숫자 칸 8 개가 자원 열 3 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-10-02"
|
||||
},
|
||||
{
|
||||
"cell": "12",
|
||||
"pum_table_id": "F0430",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "숫자 칸 8 개가 자원 열 3 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-10-02"
|
||||
},
|
||||
{
|
||||
"cell": "15",
|
||||
"pum_table_id": "F0430",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "숫자 칸 8 개가 자원 열 3 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-10-02"
|
||||
},
|
||||
{
|
||||
"cell": "18",
|
||||
"pum_table_id": "F0430",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "숫자 칸 8 개가 자원 열 3 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-10-02"
|
||||
},
|
||||
{
|
||||
"cell": "21",
|
||||
"pum_table_id": "F0430",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "숫자 칸 8 개가 자원 열 3 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-10-02"
|
||||
},
|
||||
{
|
||||
"cell": "24",
|
||||
"pum_table_id": "F0430",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "숫자 칸 8 개가 자원 열 3 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-10-02"
|
||||
},
|
||||
{
|
||||
"cell": "27",
|
||||
"pum_table_id": "F0430",
|
||||
"reason": "자원 열의 값이 한 칸 밀린 행 — 자리를 단정할 수 없어 버렸습니다.",
|
||||
"reason": "숫자 칸 8 개가 자원 열 3 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-10-02"
|
||||
},
|
||||
{
|
||||
@@ -1904,6 +1772,30 @@
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-13-11-02"
|
||||
},
|
||||
{
|
||||
"cell": "절 취(㎥)",
|
||||
"pum_table_id": "F0437",
|
||||
"reason": "숫자 칸 3 개가 자원 열 1 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-12-01"
|
||||
},
|
||||
{
|
||||
"cell": "투 입(㎥)",
|
||||
"pum_table_id": "F0437",
|
||||
"reason": "숫자 칸 3 개가 자원 열 1 개보다 많습니다 — 갈래가 하나 더 있는 표라 자리를 단정할 수 없어 버렸습니다.",
|
||||
"work_item_code": "FP-13-12-01"
|
||||
},
|
||||
{
|
||||
"cell": "절 취(㎥)",
|
||||
"pum_table_id": "F0437",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-13-12-01"
|
||||
},
|
||||
{
|
||||
"cell": "투 입(㎥)",
|
||||
"pum_table_id": "F0437",
|
||||
"reason": "카탈로그에 없는 이름 (기계·자재 카탈로그 미확보 포함)",
|
||||
"work_item_code": "FP-13-12-01"
|
||||
},
|
||||
{
|
||||
"cell": "보통구조",
|
||||
"pum_table_id": "F0440",
|
||||
|
||||
Reference in New Issue
Block a user