feat: BOM과 구매관리 페이지 엑셀 통합 및 완전 동일화
Some checks failed
SonarQube Analysis / SonarQube Scan (push) Has been cancelled

엑셀 내보내기 통합:
- BOM 페이지: 구매신청 시 백엔드에서 엑셀 파일 생성 및 저장
- 구매관리 페이지: 저장된 엑셀 파일 직접 다운로드 (재생성 안 함)
- 두 페이지에서 완전히 동일한 엑셀 파일 제공

백엔드 엑셀 생성:
- openpyxl 사용하여 서버에서 엑셀 생성
- 카테고리별 시트 구성
- 헤더 스타일링 (연파랑 배경)
- 컬럼 너비 자동 조정

FLANGE 품목명 개선:
- 품목명: FLANGE (간단)
- 상세내역: WELD NECK RF, SLIP-ON RF 등 (전체 이름)
- 특수 플랜지: ORIFICE FLANGE, SPECTACLE BLIND 등 구분

구매신청 관리 API 개선:
- 상세 정보 포함 (pipe_details, fitting_details, flange_details 등)
- BOM 형식과 동일한 데이터 구조
- 수량 정수 변환 (3.000 → 3)

에러 수정:
- fileName 중복 선언 해결
- flange_details.connection_method 컬럼 제거 (존재하지 않음)
- Python 문법 오류 수정 (new Date() → datetime.now())

DB 스키마 개선:
- revision_status 컬럼 추가 및 크기 조정 (VARCHAR(30))
- 리비전 변경사항 추적 지원
This commit is contained in:
Hyungi Ahn
2025-10-14 15:59:33 +09:00
parent 72126ef78d
commit 8f5330a008
9 changed files with 334 additions and 4535 deletions

View File

@@ -51,9 +51,13 @@ async def create_purchase_request(
count = db.execute(count_query, {"pattern": f"PR-{today}%"}).fetchone().count
request_no = f"PR-{today}-{str(count + 1).zfill(3)}"
# 자재 데이터를 JSON 파일로 저장 (나중에 재다운로드 시 사용)
# 자재 데이터를 JSON과 엑셀 파일로 저장
json_filename = f"{request_no}.json"
excel_filename = f"{request_no}.xlsx"
json_path = os.path.join(EXCEL_DIR, json_filename)
excel_path = os.path.join(EXCEL_DIR, excel_filename)
# JSON 저장
save_materials_data(
request_data.materials_data,
json_path,
@@ -62,6 +66,14 @@ async def create_purchase_request(
request_data.grouped_materials # 그룹화 정보 추가
)
# 엑셀 파일 생성 및 저장
create_excel_file(
request_data.grouped_materials or request_data.materials_data,
excel_path,
request_no,
request_data.job_no
)
# 구매신청 레코드 생성
insert_request = text("""
INSERT INTO purchase_requests (
@@ -79,7 +91,7 @@ async def create_purchase_request(
"job_no": request_data.job_no,
"category": request_data.category,
"material_count": len(request_data.material_ids),
"excel_path": json_filename,
"excel_path": excel_filename, # 엑셀 파일명 저장 (JSON 대신)
"requested_by": 1 # current_user.get("user_id")
})
request_id = result.fetchone().request_id
@@ -276,12 +288,30 @@ async def get_request_materials(
m.original_description,
m.classified_category,
m.size_spec,
m.main_nom,
m.red_nom,
m.schedule,
m.material_grade,
m.full_material_grade,
m.quantity as original_quantity,
m.unit as original_unit
m.unit as original_unit,
m.classification_details,
pd.outer_diameter, pd.schedule as pipe_schedule, pd.material_spec, pd.manufacturing_method,
pd.end_preparation, pd.length_mm,
fd.fitting_type, fd.fitting_subtype, fd.connection_method as fitting_connection,
fd.pressure_rating as fitting_pressure, fd.schedule as fitting_schedule,
fld.flange_type, fld.facing_type,
fld.pressure_rating as flange_pressure,
gd.gasket_type, gd.gasket_subtype, gd.material_type as gasket_material,
gd.filler_material, gd.pressure_rating as gasket_pressure, gd.thickness as gasket_thickness,
bd.bolt_type, bd.material_standard as bolt_material, bd.length as bolt_length
FROM purchase_request_items pri
JOIN materials m ON pri.material_id = m.id
LEFT JOIN pipe_details pd ON m.id = pd.material_id
LEFT JOIN fitting_details fd ON m.id = fd.material_id
LEFT JOIN flange_details fld ON m.id = fld.material_id
LEFT JOIN gasket_details gd ON m.id = gd.material_id
LEFT JOIN bolt_details bd ON m.id = bd.material_id
WHERE pri.request_id = :request_id
ORDER BY m.classified_category, m.original_description
""")
@@ -296,21 +326,69 @@ async def get_request_materials(
qty_int = int(float(qty)) if qty else 0
except (ValueError, TypeError):
qty_int = 0
materials.append({
# BOM 페이지와 동일한 형식으로 데이터 구성
material_dict = {
"item_id": row.item_id,
"material_id": row.material_id,
"description": row.original_description,
"category": row.classified_category,
"size": row.size_spec,
"id": row.material_id,
"original_description": row.original_description,
"classified_category": row.classified_category,
"size_spec": row.size_spec,
"size_inch": row.main_nom,
"main_nom": row.main_nom,
"red_nom": row.red_nom,
"schedule": row.schedule,
"material_grade": row.material_grade,
"quantity": qty_int, # 정수로 변환
"full_material_grade": row.full_material_grade,
"quantity": qty_int,
"unit": row.requested_unit or row.original_unit,
"user_requirement": row.user_requirement,
"is_ordered": row.is_ordered,
"is_received": row.is_received
})
"is_received": row.is_received,
"classification_details": row.classification_details
}
# 카테고리별 상세 정보 추가
if row.classified_category == 'PIPE' and row.manufacturing_method:
material_dict["pipe_details"] = {
"manufacturing_method": row.manufacturing_method,
"schedule": row.pipe_schedule,
"material_spec": row.material_spec,
"end_preparation": row.end_preparation,
"length_mm": row.length_mm
}
elif row.classified_category == 'FITTING' and row.fitting_type:
material_dict["fitting_details"] = {
"fitting_type": row.fitting_type,
"fitting_subtype": row.fitting_subtype,
"connection_method": row.fitting_connection,
"pressure_rating": row.fitting_pressure,
"schedule": row.fitting_schedule
}
elif row.classified_category == 'FLANGE' and row.flange_type:
material_dict["flange_details"] = {
"flange_type": row.flange_type,
"facing_type": row.facing_type,
"pressure_rating": row.flange_pressure
}
elif row.classified_category == 'GASKET' and row.gasket_type:
material_dict["gasket_details"] = {
"gasket_type": row.gasket_type,
"gasket_subtype": row.gasket_subtype,
"material_type": row.gasket_material,
"filler_material": row.filler_material,
"pressure_rating": row.gasket_pressure,
"thickness": row.gasket_thickness
}
elif row.classified_category == 'BOLT' and row.bolt_type:
material_dict["bolt_details"] = {
"bolt_type": row.bolt_type,
"material_standard": row.bolt_material,
"length": row.bolt_length
}
materials.append(material_dict)
return {
"success": True,
@@ -334,8 +412,10 @@ async def download_request_excel(
db: Session = Depends(get_db)
):
"""
구매신청 자재 데이터 조회 (프론트엔드에서 엑셀 생성용)
구매신청 엑셀 파일 직접 다운로드 (BOM 페이지에서 생성한 파일 그대로)
"""
from fastapi.responses import FileResponse
try:
# 구매신청 정보 조회
query = text("""
@@ -351,25 +431,20 @@ async def download_request_excel(
detail="구매신청을 찾을 수 없습니다"
)
file_path = os.path.join(EXCEL_DIR, result.excel_file_path)
excel_file_path = os.path.join(EXCEL_DIR, result.excel_file_path)
if not os.path.exists(file_path):
if not os.path.exists(excel_file_path):
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="데이터 파일을 찾을 수 없습니다"
detail="엑셀 파일을 찾을 수 없습니다"
)
# JSON 파일 읽기
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
return {
"success": True,
"request_no": result.request_no,
"job_no": result.job_no,
"materials": data.get("materials", []),
"grouped_materials": data.get("grouped_materials", []) # 그룹화 정보도 반환
}
# 엑셀 파일 직접 다운로드
return FileResponse(
path=excel_file_path,
filename=f"{result.job_no}_{result.request_no}.xlsx",
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
except HTTPException:
raise
@@ -418,3 +493,85 @@ def save_materials_data(materials_data: List[Dict], file_path: str, request_no:
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(data_to_save, f, ensure_ascii=False, indent=2)
def create_excel_file(materials_data: List[Dict], file_path: str, request_no: str, job_no: str):
"""
자재 데이터로 엑셀 파일 생성 (BOM 페이지와 동일한 형식)
"""
import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
# 새 워크북 생성
wb = openpyxl.Workbook()
wb.remove(wb.active) # 기본 시트 제거
# 카테고리별 그룹화
category_groups = {}
for material in materials_data:
category = material.get('category', 'UNKNOWN')
if category not in category_groups:
category_groups[category] = []
category_groups[category].append(material)
# 각 카테고리별 시트 생성
for category, items in category_groups.items():
if not items:
continue
ws = wb.create_sheet(title=category)
# 헤더 정의
headers = ['TAGNO', '품목명', '수량', '통화구분', '단가', '크기', '압력등급', '스케줄',
'재질', '상세내역', '사용자요구', '관리항목1', '관리항목7', '관리항목8',
'관리항목9', '관리항목10', '납기일(YYYY-MM-DD)']
# 헤더 작성
for col, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col, value=header)
cell.font = Font(bold=True, color="000000", size=12, name="맑은 고딕")
cell.fill = PatternFill(start_color="B3D9FF", end_color="B3D9FF", fill_type="solid")
cell.alignment = Alignment(horizontal="center", vertical="center")
cell.border = Border(
top=Side(style="thin", color="666666"),
bottom=Side(style="thin", color="666666"),
left=Side(style="thin", color="666666"),
right=Side(style="thin", color="666666")
)
# 데이터 작성
for row_idx, material in enumerate(items, 2):
data = [
'', # TAGNO
category, # 품목명
material.get('quantity', 0), # 수량
'KRW', # 통화구분
1, # 단가
material.get('size', '-'), # 크기
'-', # 압력등급 (추후 개선)
material.get('schedule', '-'), # 스케줄
material.get('material_grade', '-'), # 재질
'-', # 상세내역 (추후 개선)
material.get('user_requirement', ''), # 사용자요구
'', '', '', '', '', # 관리항목들
datetime.now().strftime('%Y-%m-%d') # 납기일
]
for col, value in enumerate(data, 1):
ws.cell(row=row_idx, column=col, value=value)
# 컬럼 너비 자동 조정
for column in ws.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = min(max(max_length + 2, 10), 50)
ws.column_dimensions[column_letter].width = adjusted_width
# 파일 저장
wb.save(file_path)

File diff suppressed because it is too large Load Diff

View File

@@ -1,745 +1,101 @@
{
"request_no": "PR-20251014-002",
"job_no": "TKG-25000P",
"created_at": "2025-10-14T06:14:58.376128",
"created_at": "2025-10-14T06:54:44.585437",
"materials": [
{
"material_id": 1075,
"description": "(4) 0.5, 75 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"material_id": 5552,
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 51,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1079,
"description": "(4) 0.5, 80 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 32,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1083,
"description": "(4) 0.625, 100 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 4,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1085,
"description": "(4) 0.75, 105 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1086,
"description": "(8) 0.75, 125 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "4\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1087,
"description": "(8) 0.75, 140 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 4,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1088,
"description": "(4) 0.5, 65 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 36,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1124,
"description": "(4) 0.5, 65 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "1/2\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1131,
"description": "(4) 0.5, 70 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 11,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1142,
"description": "(4) 0.5, 70 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 4,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1193,
"description": "(4) 0.5, 75 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "1\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1226,
"description": "(4) 0.5, 80 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 8,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1234,
"description": "(4) 0.5, 90 LG, 150LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1239,
"description": "(4) 0.5, 95 LG, 150LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1247,
"description": "(4) 0.75, 120 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1252,
"description": "(4) 0.75, 125 LG, 300LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1254,
"description": "(8) 0.75, 115 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "6\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1259,
"description": "(8) 0.75, 120 LG, 150LB, WOOD OR, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "6\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1261,
"description": "(8) 0.75, 120 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1263,
"description": "(8) 0.75, 140 CK, 600LB, PSV, ASTM A320M/A194M GR B8/8",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A320M/A194M GR B8/8",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1267,
"description": "(8) 0.75, 145 LG, 600LB, WOOD OR, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1268,
"description": "(4) 0.625, 100 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1275,
"description": "(4) 0.625, 100 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"material_grade": "SS",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1283,
"description": "(4) 0.625, 100 LG, 600LB, ASTM A320M/A194M GR B8/8",
"category": "BOLT",
"size": "1\"",
"material_grade": "ASTM A320M/A194M GR B8/8",
"quantity": 1,
"material_id": 5558,
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "SS",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1284,
"description": "(4) 0.625, 105 LG, 600LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"material_id": 5563,
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "SS",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1286,
"description": "(4) 0.625, 90 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"material_id": 5566,
"description": "STRAINER, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 25,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1311,
"description": "(4) 0.625, 90 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "2\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1317,
"description": "(4) 0.625, 95 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1319,
"description": "(4) 0.625, 95 LG, 600LB, ASTM A320M/A194M GR B8/8",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A320M/A194M GR B8/8",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1320,
"description": "(8) 0.625, 95 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1321,
"description": "(12) 0.875, 130 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "10\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1322,
"description": "(12) 0.875, 140 LG, 150LB, TS, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "10\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
}
],
"grouped_materials": [
{
"group_key": "(4) 0.5, 75 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|1\"|undefined|ASTM A193/A194 GR B7/2H",
"group_key": "SIGHT GLASS, FLG, 150LB|1\"|undefined|SS",
"material_ids": [
1075
5552
],
"description": "(4) 0.5, 75 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 51,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.5, 80 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|1 1/2\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1079
],
"description": "(4) 0.5, 80 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 32,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.625, 100 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|1\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1083
],
"description": "(4) 0.625, 100 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 4,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.75, 105 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|1 1/2\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1085
],
"description": "(4) 0.75, 105 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(8) 0.75, 125 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|4\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1086
],
"description": "(8) 0.75, 125 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "4\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(8) 0.75, 140 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|3\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1087
],
"description": "(8) 0.75, 140 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 4,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.5, 65 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|1/2\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1088
],
"description": "(4) 0.5, 65 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 36,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.5, 65 LG, 150LB, ASTM A320/A194M GR B8/8|1/2\"|undefined|ASTM A320/A194M GR B8/8",
"material_ids": [
1124
],
"description": "(4) 0.5, 65 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "1/2\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.5, 70 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|3/4\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1131
],
"description": "(4) 0.5, 70 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 11,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.5, 70 LG, 150LB, ASTM A320/A194M GR B8/8|3/4\"|undefined|ASTM A320/A194M GR B8/8",
"material_ids": [
1142
],
"description": "(4) 0.5, 70 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 4,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.5, 75 LG, 150LB, ASTM A320/A194M GR B8/8|1\"|undefined|ASTM A320/A194M GR B8/8",
"material_ids": [
1193
],
"description": "(4) 0.5, 75 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "1\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.5, 80 LG, 150LB, ASTM A320/A194M GR B8/8|1 1/2\"|undefined|ASTM A320/A194M GR B8/8",
"material_ids": [
1226
],
"description": "(4) 0.5, 80 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 8,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.5, 90 LG, 150LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV|3/4\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1234
],
"description": "(4) 0.5, 90 LG, 150LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.5, 95 LG, 150LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV|1 1/2\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1239
],
"description": "(4) 0.5, 95 LG, 150LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.75, 120 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|1 1/2\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1247
],
"description": "(4) 0.75, 120 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.75, 125 LG, 300LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV|1 1/2\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1252
],
"description": "(4) 0.75, 125 LG, 300LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "1 1/2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(8) 0.75, 115 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|6\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1254
],
"description": "(8) 0.75, 115 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "6\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(8) 0.75, 120 LG, 150LB, WOOD OR, ASTM A193/A194 GR B7/2H, ELEC.GALV|6\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1259
],
"description": "(8) 0.75, 120 LG, 150LB, WOOD OR, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "6\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(8) 0.75, 120 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|3\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1261
],
"description": "(8) 0.75, 120 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(8) 0.75, 140 CK, 600LB, PSV, ASTM A320M/A194M GR B8/8|3\"|undefined|ASTM A320M/A194M GR B8/8",
"material_ids": [
1263
],
"description": "(8) 0.75, 140 CK, 600LB, PSV, ASTM A320M/A194M GR B8/8",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A320M/A194M GR B8/8",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(8) 0.75, 145 LG, 600LB, WOOD OR, ASTM A193/A194 GR B7/2H, ELEC.GALV|3\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1267
],
"description": "(8) 0.75, 145 LG, 600LB, WOOD OR, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.625, 100 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|3\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1268
],
"description": "(4) 0.625, 100 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.625, 100 LG, 150LB, ASTM A320/A194M GR B8/8|3\"|undefined|ASTM A320/A194M GR B8/8",
"material_ids": [
1275
],
"description": "(4) 0.625, 100 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "3\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"material_grade": "SS",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.625, 100 LG, 600LB, ASTM A320M/A194M GR B8/8|1\"|undefined|ASTM A320M/A194M GR B8/8",
"group_key": "SIGHT GLASS, FLG, 150LB|1/2\"|undefined|SS",
"material_ids": [
1283
5558
],
"description": "(4) 0.625, 100 LG, 600LB, ASTM A320M/A194M GR B8/8",
"category": "BOLT",
"size": "1\"",
"material_grade": "ASTM A320M/A194M GR B8/8",
"quantity": 1,
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "SS",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.625, 105 LG, 600LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV|3/4\"|undefined|ASTM A193/A194 GR B7/2H",
"group_key": "SIGHT GLASS, FLG, 150LB|2\"|undefined|SS",
"material_ids": [
1284
5563
],
"description": "(4) 0.625, 105 LG, 600LB, PSV, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "SS",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.625, 90 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|2\"|undefined|ASTM A193/A194 GR B7/2H",
"group_key": "STRAINER, FLG, 150LB|2\"|undefined|-",
"material_ids": [
1286
5566
],
"description": "(4) 0.625, 90 LG, 150LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"description": "STRAINER, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 25,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.625, 90 LG, 150LB, ASTM A320/A194M GR B8/8|2\"|undefined|ASTM A320/A194M GR B8/8",
"material_ids": [
1311
],
"description": "(4) 0.625, 90 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "2\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.625, 95 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|3/4\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1317
],
"description": "(4) 0.625, 95 LG, 600LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(4) 0.625, 95 LG, 600LB, ASTM A320M/A194M GR B8/8|3/4\"|undefined|ASTM A320M/A194M GR B8/8",
"material_ids": [
1319
],
"description": "(4) 0.625, 95 LG, 600LB, ASTM A320M/A194M GR B8/8",
"category": "BOLT",
"size": "3/4\"",
"material_grade": "ASTM A320M/A194M GR B8/8",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(8) 0.625, 95 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV|2\"|undefined|ASTM A193/A194 GR B7/2H",
"material_ids": [
1320
],
"description": "(8) 0.625, 95 LG, 300LB, ASTM A193/A194 GR B7/2H, ELEC.GALV",
"category": "BOLT",
"size": "2\"",
"material_grade": "ASTM A193/A194 GR B7/2H",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(12) 0.875, 130 LG, 150LB, ASTM A320/A194M GR B8/8|10\"|undefined|ASTM A320/A194M GR B8/8",
"material_ids": [
1321
],
"description": "(12) 0.875, 130 LG, 150LB, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "10\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "(12) 0.875, 140 LG, 150LB, TS, ASTM A320/A194M GR B8/8|10\"|undefined|ASTM A320/A194M GR B8/8",
"material_ids": [
1322
],
"description": "(12) 0.875, 140 LG, 150LB, TS, ASTM A320/A194M GR B8/8",
"category": "BOLT",
"size": "10\"",
"material_grade": "ASTM A320/A194M GR B8/8",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
}
]
}

View File

@@ -1,929 +0,0 @@
{
"request_no": "PR-20251014-003",
"job_no": "TKG-25000P",
"created_at": "2025-10-14T06:15:45.368700",
"materials": [
{
"material_id": 723,
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "10\"",
"material_grade": "ASTM A182 F304",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 728,
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "12\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 729,
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A105",
"quantity": 36,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 765,
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A105",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 771,
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A182 F304",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 779,
"description": "FLG WELD NECK RF SCH 40, 600LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 8,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 784,
"description": "FLG WELD NECK RF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A182 F304",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 786,
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 12,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 798,
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 803,
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A182 F304",
"quantity": 9,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 812,
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "4\"",
"material_grade": "ASTM A105",
"quantity": 3,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 815,
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "6\"",
"material_grade": "ASTM A105",
"quantity": 10,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 825,
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "ASTM A182 F304",
"quantity": 14,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 837,
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 15,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 841,
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A182 F304",
"quantity": 9,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 842,
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A105",
"quantity": 66,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 846,
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A105",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 848,
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A182 F304",
"quantity": 8,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 856,
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 40,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 892,
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 913,
"description": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 986,
"description": "FLG SWRF SCH 80, 300LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 3,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 991,
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "ASTM A105",
"quantity": 57,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1048,
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1055,
"description": "FLG SWRF SCH 40S, 300LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1056,
"description": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1068,
"description": "FLG SWRF SCH 80, 300LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1070,
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1874,
"description": "ORIFICE, 150LB",
"category": "FLANGE",
"size": "10\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1876,
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "10\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1878,
"description": "WOOD ORIFICE, 600LB",
"category": "FLANGE",
"size": "3\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1879,
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "4\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1881,
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "5\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1882,
"description": "WOOD ORIFICE, 600LB",
"category": "FLANGE",
"size": "5\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1883,
"description": "WOOD ORIFICE, 150LB",
"category": "FLANGE",
"size": "6\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 1885,
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "8\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 2013,
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1\"",
"material_grade": "SS",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 2019,
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "SS",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 2024,
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "SS",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 2027,
"description": "STRAINER, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
}
],
"grouped_materials": [
{
"group_key": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304|10\"|undefined|ASTM A182 F304",
"material_ids": [
723
],
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "10\"",
"material_grade": "ASTM A182 F304",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304|12\"|undefined|ASTM A182 F304",
"material_ids": [
728
],
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "12\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105|2\"|undefined|ASTM A105",
"material_ids": [
729
],
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A105",
"quantity": 36,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105|2\"|undefined|ASTM A105",
"material_ids": [
765
],
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A105",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304|2\"|undefined|ASTM A182 F304",
"material_ids": [
771
],
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A182 F304",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 600LB, ASTM A105|3\"|undefined|ASTM A105",
"material_ids": [
779
],
"description": "FLG WELD NECK RF SCH 40, 600LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 8,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40S, 600LB, ASTM A182 F304|3\"|undefined|ASTM A182 F304",
"material_ids": [
784
],
"description": "FLG WELD NECK RF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A182 F304",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105|3\"|undefined|ASTM A105",
"material_ids": [
786
],
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 12,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105|3\"|undefined|ASTM A105",
"material_ids": [
798
],
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304|3\"|undefined|ASTM A182 F304",
"material_ids": [
803
],
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A182 F304",
"quantity": 9,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105|4\"|undefined|ASTM A105",
"material_ids": [
812
],
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "4\"",
"material_grade": "ASTM A105",
"quantity": 3,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105|6\"|undefined|ASTM A105",
"material_ids": [
815
],
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "6\"",
"material_grade": "ASTM A105",
"quantity": 10,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304|1/2\"|undefined|ASTM A182 F304",
"material_ids": [
825
],
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "ASTM A182 F304",
"quantity": 14,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 150LB, ASTM A105|3/4\"|undefined|ASTM A105",
"material_ids": [
837
],
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 15,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304|1\"|undefined|ASTM A182 F304",
"material_ids": [
841
],
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A182 F304",
"quantity": 9,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 150LB, ASTM A105|1\"|undefined|ASTM A105",
"material_ids": [
842
],
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A105",
"quantity": 66,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 600LB, ASTM A105|1\"|undefined|ASTM A105",
"material_ids": [
846
],
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A105",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304|1 1/2\"|undefined|ASTM A182 F304",
"material_ids": [
848
],
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A182 F304",
"quantity": 8,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 150LB, ASTM A105|1 1/2\"|undefined|ASTM A105",
"material_ids": [
856
],
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 40,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 600LB, ASTM A105|1 1/2\"|undefined|ASTM A105",
"material_ids": [
892
],
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304|1\"|undefined|ASTM A182 F304",
"material_ids": [
913
],
"description": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 300LB, ASTM A105|1 1/2\"|undefined|ASTM A105",
"material_ids": [
986
],
"description": "FLG SWRF SCH 80, 300LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 3,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 150LB, ASTM A105|1/2\"|undefined|ASTM A105",
"material_ids": [
991
],
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "ASTM A105",
"quantity": 57,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304|3/4\"|undefined|ASTM A182 F304",
"material_ids": [
1048
],
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 300LB, ASTM A182 F304|3/4\"|undefined|ASTM A182 F304",
"material_ids": [
1055
],
"description": "FLG SWRF SCH 40S, 300LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304|3/4\"|undefined|ASTM A182 F304",
"material_ids": [
1056
],
"description": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 300LB, ASTM A105|3/4\"|undefined|ASTM A105",
"material_ids": [
1068
],
"description": "FLG SWRF SCH 80, 300LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 600LB, ASTM A105|3/4\"|undefined|ASTM A105",
"material_ids": [
1070
],
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "ORIFICE, 150LB|10\"|undefined|-",
"material_ids": [
1874
],
"description": "ORIFICE, 150LB",
"category": "FLANGE",
"size": "10\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 300LB|10\"|undefined|-",
"material_ids": [
1876
],
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "10\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 600LB|3\"|undefined|-",
"material_ids": [
1878
],
"description": "WOOD ORIFICE, 600LB",
"category": "FLANGE",
"size": "3\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 300LB|4\"|undefined|-",
"material_ids": [
1879
],
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "4\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 300LB|5\"|undefined|-",
"material_ids": [
1881
],
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "5\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 600LB|5\"|undefined|-",
"material_ids": [
1882
],
"description": "WOOD ORIFICE, 600LB",
"category": "FLANGE",
"size": "5\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 150LB|6\"|undefined|-",
"material_ids": [
1883
],
"description": "WOOD ORIFICE, 150LB",
"category": "FLANGE",
"size": "6\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 300LB|8\"|undefined|-",
"material_ids": [
1885
],
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "8\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "SIGHT GLASS, FLG, 150LB|1\"|undefined|SS",
"material_ids": [
2013
],
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1\"",
"material_grade": "SS",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "SIGHT GLASS, FLG, 150LB|1/2\"|undefined|SS",
"material_ids": [
2019
],
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "SS",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "SIGHT GLASS, FLG, 150LB|2\"|undefined|SS",
"material_ids": [
2024
],
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "SS",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "STRAINER, FLG, 150LB|2\"|undefined|-",
"material_ids": [
2027
],
"description": "STRAINER, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
}
]
}

View File

@@ -1,929 +0,0 @@
{
"request_no": "PR-20251014-004",
"job_no": "TK-MP-DEV-001",
"created_at": "2025-10-14T06:20:42.821334",
"materials": [
{
"material_id": 4262,
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "10\"",
"material_grade": "ASTM A182 F304",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4267,
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "12\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4268,
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A105",
"quantity": 36,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4304,
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A105",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4310,
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A182 F304",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4318,
"description": "FLG WELD NECK RF SCH 40, 600LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 8,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4323,
"description": "FLG WELD NECK RF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A182 F304",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4325,
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 12,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4337,
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4342,
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A182 F304",
"quantity": 9,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4351,
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "4\"",
"material_grade": "ASTM A105",
"quantity": 3,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4354,
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "6\"",
"material_grade": "ASTM A105",
"quantity": 10,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4364,
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "ASTM A182 F304",
"quantity": 14,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4376,
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 15,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4380,
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A182 F304",
"quantity": 9,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4381,
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A105",
"quantity": 66,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4385,
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A105",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4387,
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A182 F304",
"quantity": 8,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4395,
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 40,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4431,
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4452,
"description": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4525,
"description": "FLG SWRF SCH 80, 300LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 3,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4530,
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "ASTM A105",
"quantity": 57,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4587,
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4594,
"description": "FLG SWRF SCH 40S, 300LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4595,
"description": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4607,
"description": "FLG SWRF SCH 80, 300LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 4609,
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5413,
"description": "ORIFICE, 150LB",
"category": "FLANGE",
"size": "10\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5415,
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "10\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5417,
"description": "WOOD ORIFICE, 600LB",
"category": "FLANGE",
"size": "3\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5418,
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "4\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5420,
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "5\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5421,
"description": "WOOD ORIFICE, 600LB",
"category": "FLANGE",
"size": "5\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5422,
"description": "WOOD ORIFICE, 150LB",
"category": "FLANGE",
"size": "6\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5424,
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "8\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5552,
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1\"",
"material_grade": "SS",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5558,
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "SS",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5563,
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "SS",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5566,
"description": "STRAINER, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
}
],
"grouped_materials": [
{
"group_key": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304|10\"|undefined|ASTM A182 F304",
"material_ids": [
4262
],
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "10\"",
"material_grade": "ASTM A182 F304",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304|12\"|undefined|ASTM A182 F304",
"material_ids": [
4267
],
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "12\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105|2\"|undefined|ASTM A105",
"material_ids": [
4268
],
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A105",
"quantity": 36,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105|2\"|undefined|ASTM A105",
"material_ids": [
4304
],
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A105",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304|2\"|undefined|ASTM A182 F304",
"material_ids": [
4310
],
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "2\"",
"material_grade": "ASTM A182 F304",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 600LB, ASTM A105|3\"|undefined|ASTM A105",
"material_ids": [
4318
],
"description": "FLG WELD NECK RF SCH 40, 600LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 8,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40S, 600LB, ASTM A182 F304|3\"|undefined|ASTM A182 F304",
"material_ids": [
4323
],
"description": "FLG WELD NECK RF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A182 F304",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105|3\"|undefined|ASTM A105",
"material_ids": [
4325
],
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 12,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105|3\"|undefined|ASTM A105",
"material_ids": [
4337
],
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A105",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304|3\"|undefined|ASTM A182 F304",
"material_ids": [
4342
],
"description": "FLG WELD NECK RF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3\"",
"material_grade": "ASTM A182 F304",
"quantity": 9,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105|4\"|undefined|ASTM A105",
"material_ids": [
4351
],
"description": "FLG WELD NECK RF SCH 40, 300LB, ASTM A105",
"category": "FLANGE",
"size": "4\"",
"material_grade": "ASTM A105",
"quantity": 3,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105|6\"|undefined|ASTM A105",
"material_ids": [
4354
],
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"category": "FLANGE",
"size": "6\"",
"material_grade": "ASTM A105",
"quantity": 10,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304|1/2\"|undefined|ASTM A182 F304",
"material_ids": [
4364
],
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "ASTM A182 F304",
"quantity": 14,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 150LB, ASTM A105|3/4\"|undefined|ASTM A105",
"material_ids": [
4376
],
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 15,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304|1\"|undefined|ASTM A182 F304",
"material_ids": [
4380
],
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A182 F304",
"quantity": 9,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 150LB, ASTM A105|1\"|undefined|ASTM A105",
"material_ids": [
4381
],
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A105",
"quantity": 66,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 600LB, ASTM A105|1\"|undefined|ASTM A105",
"material_ids": [
4385
],
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A105",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304|1 1/2\"|undefined|ASTM A182 F304",
"material_ids": [
4387
],
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A182 F304",
"quantity": 8,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 150LB, ASTM A105|1 1/2\"|undefined|ASTM A105",
"material_ids": [
4395
],
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 40,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 600LB, ASTM A105|1 1/2\"|undefined|ASTM A105",
"material_ids": [
4431
],
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304|1\"|undefined|ASTM A182 F304",
"material_ids": [
4452
],
"description": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "1\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 300LB, ASTM A105|1 1/2\"|undefined|ASTM A105",
"material_ids": [
4525
],
"description": "FLG SWRF SCH 80, 300LB, ASTM A105",
"category": "FLANGE",
"size": "1 1/2\"",
"material_grade": "ASTM A105",
"quantity": 3,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 150LB, ASTM A105|1/2\"|undefined|ASTM A105",
"material_ids": [
4530
],
"description": "FLG SWRF SCH 80, 150LB, ASTM A105",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "ASTM A105",
"quantity": 57,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304|3/4\"|undefined|ASTM A182 F304",
"material_ids": [
4587
],
"description": "FLG SWRF SCH 40S, 150LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 7,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 300LB, ASTM A182 F304|3/4\"|undefined|ASTM A182 F304",
"material_ids": [
4594
],
"description": "FLG SWRF SCH 40S, 300LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304|3/4\"|undefined|ASTM A182 F304",
"material_ids": [
4595
],
"description": "FLG SWRF SCH 40S, 600LB, ASTM A182 F304",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A182 F304",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 300LB, ASTM A105|3/4\"|undefined|ASTM A105",
"material_ids": [
4607
],
"description": "FLG SWRF SCH 80, 300LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "FLG SWRF SCH 80, 600LB, ASTM A105|3/4\"|undefined|ASTM A105",
"material_ids": [
4609
],
"description": "FLG SWRF SCH 80, 600LB, ASTM A105",
"category": "FLANGE",
"size": "3/4\"",
"material_grade": "ASTM A105",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "ORIFICE, 150LB|10\"|undefined|-",
"material_ids": [
5413
],
"description": "ORIFICE, 150LB",
"category": "FLANGE",
"size": "10\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 300LB|10\"|undefined|-",
"material_ids": [
5415
],
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "10\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 600LB|3\"|undefined|-",
"material_ids": [
5417
],
"description": "WOOD ORIFICE, 600LB",
"category": "FLANGE",
"size": "3\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 300LB|4\"|undefined|-",
"material_ids": [
5418
],
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "4\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 300LB|5\"|undefined|-",
"material_ids": [
5420
],
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "5\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 600LB|5\"|undefined|-",
"material_ids": [
5421
],
"description": "WOOD ORIFICE, 600LB",
"category": "FLANGE",
"size": "5\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 150LB|6\"|undefined|-",
"material_ids": [
5422
],
"description": "WOOD ORIFICE, 150LB",
"category": "FLANGE",
"size": "6\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "WOOD ORIFICE, 300LB|8\"|undefined|-",
"material_ids": [
5424
],
"description": "WOOD ORIFICE, 300LB",
"category": "FLANGE",
"size": "8\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "SIGHT GLASS, FLG, 150LB|1\"|undefined|SS",
"material_ids": [
5552
],
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1\"",
"material_grade": "SS",
"quantity": 6,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "SIGHT GLASS, FLG, 150LB|1/2\"|undefined|SS",
"material_ids": [
5558
],
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "1/2\"",
"material_grade": "SS",
"quantity": 5,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "SIGHT GLASS, FLG, 150LB|2\"|undefined|SS",
"material_ids": [
5563
],
"description": "SIGHT GLASS, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "SS",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "STRAINER, FLG, 150LB|2\"|undefined|-",
"material_ids": [
5566
],
"description": "STRAINER, FLG, 150LB",
"category": "FLANGE",
"size": "2\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
}
]
}

View File

@@ -1,55 +0,0 @@
{
"request_no": "PR-20251014-005",
"job_no": "TK-MP-DEV-001",
"created_at": "2025-10-14T06:23:18.137603",
"materials": [
{
"material_id": 5450,
"description": "ON/OFF VALVE, FLG, 600LB",
"category": "VALVE",
"size": "1\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"material_id": 5451,
"description": "CHECK VALVE, LIFT, SW, 800LB",
"category": "VALVE",
"size": "1 1/2\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
}
],
"grouped_materials": [
{
"group_key": "ON/OFF VALVE, FLG, 600LB|1\"|undefined|-",
"material_ids": [
5450
],
"description": "ON/OFF VALVE, FLG, 600LB",
"category": "VALVE",
"size": "1\"",
"material_grade": "-",
"quantity": 1,
"unit": "EA",
"user_requirement": ""
},
{
"group_key": "CHECK VALVE, LIFT, SW, 800LB|1 1/2\"|undefined|-",
"material_ids": [
5451
],
"description": "CHECK VALVE, LIFT, SW, 800LB",
"category": "VALVE",
"size": "1 1/2\"",
"material_grade": "-",
"quantity": 2,
"unit": "EA",
"user_requirement": ""
}
]
}

View File

@@ -1382,6 +1382,20 @@ const NewMaterialsPage = ({
user_requirement: userRequirements[material.id] || ''
}));
// 1단계: 엑셀 파일 생성
const timestamp = new Date().toISOString().split('T')[0];
const fileName = `${jobNo}_${selectedCategory}_${timestamp}.xlsx`;
// BOM 페이지에서 사용하는 엑셀 내보내기 함수 사용
await exportCategoryToExcel(
selectedCategory,
dataWithRequirements,
jobNo,
fileName,
userRequirements
);
// 2단계: 생성된 엑셀을 서버에 업로드 (구매신청과 함께)
// 서버에 구매신청 생성
try {
// 그룹화된 데이터를 구매신청 형식으로 변환
@@ -1472,9 +1486,9 @@ const NewMaterialsPage = ({
uploadDate: new Date().toLocaleDateString()
};
const fileName = `${selectedCategory}_${jobNo || 'export'}_${new Date().toISOString().split('T')[0]}.xlsx`;
const excelFileName = `${selectedCategory}_${jobNo || 'export'}_${new Date().toISOString().split('T')[0]}.xlsx`;
exportMaterialsToExcel(dataWithRequirements, fileName, additionalInfo);
exportMaterialsToExcel(dataWithRequirements, excelFileName, additionalInfo);
console.log('✅ 엑셀 내보내기 성공');
} catch (error) {

View File

@@ -54,81 +54,27 @@ const PurchaseRequestPage = ({ onNavigate, fileId, jobNo, selectedProject }) =>
const handleDownloadExcel = async (requestId, requestNo) => {
try {
console.log('📥 엑셀 다운로드 시작:', requestId, requestNo);
// 서버에서 자재 데이터 가져오기
const response = await api.get(`/purchase-request/${requestId}/download-excel`);
console.log('📦 서버 응답:', response.data);
if (response.data.success) {
const materials = response.data.materials;
const groupedMaterials = response.data.grouped_materials || [];
const jobNo = response.data.job_no;
console.log('📊 materials:', materials.length, '개');
console.log('📊 groupedMaterials:', groupedMaterials.length, '개');
// 사용자 요구사항 매핑
const userRequirements = {};
materials.forEach(material => {
if (material.user_requirement) {
userRequirements[material.material_id || material.id] = material.user_requirement;
}
});
// 개별 자재 사용 (BOM 페이지와 동일하게)
// groupedMaterials는 일부 자재가 누락될 수 있으므로 materials 사용
const dataToExport = materials;
// 파일명 생성
const timestamp = new Date().toISOString().split('T')[0];
const fileName = `${jobNo}_${requestNo}_${timestamp}.xlsx`;
console.log('📄 내보낼 데이터:', dataToExport.length, '개');
console.log('📄 첫 번째 자재:', dataToExport[0]);
// materials 데이터를 BOM 형식으로 변환
const materialsForExport = materials.map(m => {
// description에서 품목명 추출 (NIPPLE, ELBOW, TEE 등)
const desc = m.description || '';
const category = m.category || 'UNKNOWN';
return {
...m,
classified_category: category,
original_description: desc,
size_spec: m.size,
size_inch: m.size,
material_grade: m.material_grade,
full_material_grade: m.material_grade,
schedule: m.schedule,
quantity: m.quantity,
unit: m.unit,
// FITTING의 경우 타입 정보 추가
fitting_details: category === 'FITTING' ? {
fitting_type: desc.includes('NIPPLE') ? 'NIPPLE' :
desc.includes('ELBOW') ? 'ELBOW' :
desc.includes('TEE') ? 'TEE' :
desc.includes('REDUCER') ? 'REDUCER' :
desc.includes('CAP') ? 'CAP' :
desc.includes('PLUG') ? 'PLUG' :
desc.includes('COUPLING') ? 'COUPLING' : 'FITTING'
} : undefined
};
});
console.log('🔄 BOM 형식으로 변환 완료:', materialsForExport.length, '개');
// 기존 엑셀 유틸리티 사용
exportMaterialsToExcel(materialsForExport, fileName, {
jobNo,
requestNo,
userRequirements
});
console.log('✅ 엑셀 내보내기 완료');
} else {
console.error('❌ 서버 응답 실패:', response.data);
alert('데이터를 가져올 수 없습니다');
}
// 서버에서 생성된 엑셀 파일 직접 다운로드 (BOM 페이지와 동일한 파일)
const response = await api.get(`/purchase-request/${requestId}/download-excel`, {
responseType: 'blob' // 파일 다운로드용
});
// 파일 다운로드 처리
const blob = new Blob([response.data], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = `${requestNo}_재다운로드.xlsx`;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
console.log('✅ 엑셀 파일 다운로드 완료');
} catch (error) {
console.error('❌ 엑셀 다운로드 실패:', error);
alert('엑셀 다운로드 실패: ' + error.message);

View File

@@ -150,66 +150,43 @@ const formatMaterialForExcel = (material, includeComparison = false) => {
// 구매 수량 계산
const purchaseInfo = calculatePurchaseQuantity(material);
// 품목명 생성 (카테고리별 상세 처리)
// 변수 선언 (먼저 선언)
let itemName = '';
let detailInfo = '';
let gasketMaterial = '';
let gasketThickness = '';
if (category === 'PIPE') {
itemName = material.pipe_details?.manufacturing_method || 'PIPE';
} else if (category === 'FITTING') {
itemName = material.fitting_details?.fitting_type || 'FITTING';
} else if (category === 'FLANGE') {
// 플랜지 타입 추출
const desc = cleanDescription.toUpperCase();
console.log('🔍 FLANGE 품목명 추출:', cleanDescription);
// 플랜지는 품목명만 간단하게 (상세내역에 타입 정보)
itemName = 'FLANGE';
if (material.flange_details) {
console.log(' flange_details:', material.flange_details);
const flangeType = material.flange_details.flange_type || '';
const originalFlangeType = material.flange_details.original_flange_type || '';
const facingType = material.flange_details.facing_type || '';
// 특수 플랜지 타입 우선
if (desc.includes('ORIFICE')) {
itemName = 'ORIFICE FLANGE';
} else if (desc.includes('SPECTACLE')) {
itemName = 'SPECTACLE BLIND';
} else if (desc.includes('PADDLE')) {
itemName = 'PADDLE BLIND';
} else if (desc.includes('SPACER')) {
itemName = 'SPACER';
} else if (desc.includes('BLIND')) {
itemName = 'BLIND FLANGE';
} else {
// 일반 플랜지: flange_type 사용 (WN RF, SO RF 등)
itemName = flangeType || 'FLANGE';
}
// 특수 플랜지는 구분
const desc = cleanDescription.toUpperCase();
if (desc.includes('ORIFICE')) {
itemName = 'ORIFICE FLANGE';
} else if (desc.includes('SPECTACLE')) {
itemName = 'SPECTACLE BLIND';
} else if (desc.includes('PADDLE')) {
itemName = 'PADDLE BLIND';
} else if (desc.includes('SPACER')) {
itemName = 'SPACER';
} else if (desc.includes('BLIND')) {
itemName = 'BLIND FLANGE';
}
// 상세내역에 플랜지 타입 정보 저장 (줄임말 사용)
if (material.flange_details && material.flange_details.flange_type) {
detailInfo = material.flange_details.flange_type; // WN RF, SO RF 등
} else {
console.log(' flange_details 없음, description에서 추출');
// flange_details가 없으면 description에서 추출
if (desc.includes('ORIFICE')) {
itemName = 'ORIFICE FLANGE';
} else if (desc.includes('SPECTACLE') || desc.includes('SPEC')) {
itemName = 'SPECTACLE BLIND';
} else if (desc.includes('PADDLE')) {
itemName = 'PADDLE BLIND';
} else if (desc.includes('SPACER')) {
itemName = 'SPACER';
} else if (desc.includes('BLIND')) {
itemName = 'BLIND FLANGE';
} else if (desc.includes(' SW') || desc.includes(',SW') || desc.includes(', SW')) {
itemName = 'FLANGE SW';
} else if (desc.includes(' BW') || desc.includes(',BW') || desc.includes(', BW')) {
itemName = 'FLANGE BW';
} else if (desc.includes('RTJ')) {
itemName = 'FLANGE RTJ';
} else if (desc.includes(' FF') || desc.includes('FULL FACE')) {
itemName = 'FLANGE FF';
} else if (desc.includes(' RF') || desc.includes('RAISED')) {
itemName = 'FLANGE RF';
} else {
itemName = 'FLANGE';
// description에서 추출 (전체 이름 그대로 사용)
const flangeTypeMatch = cleanDescription.match(/FLG\s+([^,]+?)(?=\s*SCH|\s*,\s*\d+LB|$)/i);
if (flangeTypeMatch) {
detailInfo = flangeTypeMatch[1].trim(); // WELD NECK RF 등 그대로
}
}
console.log(' → 품목명:', itemName);
} else if (category === 'VALVE') {
itemName = 'VALVE';
} else if (category === 'GASKET') {
@@ -379,10 +356,7 @@ const formatMaterialForExcel = (material, includeComparison = false) => {
}
}
// 카테고리별 상세 정보 추출
let detailInfo = '';
let gasketMaterial = '';
let gasketThickness = '';
// 카테고리별 상세 정보 추출 (이미 위에서 선언됨)
if (category === 'BOLT') {
// 볼트의 경우 표면처리 정보 추출