분류기 개선사항:
1. ELL-O-LET vs 일반 엘보 분류 개선
- OLET 우선순위 확인 로직 추가
- ELL 키워드 충돌 문제 해결
2. 엘보 서브타입 강화
- 90DEG_LONG_RADIUS, 90DEG_SHORT_RADIUS 등 조합형 추가
- 더 구체적인 키워드 패턴 지원
3. 레듀스 플랜지 분류 개선
- REDUCING FLANGE가 FITTING이 아닌 FLANGE로 분류되도록 수정
- 특별 우선순위 로직 추가
4. 90 ELL SW 분류 문제 해결
- fitting_keywords에 ELL 키워드 추가
- ELBOW description_keywords에 ELL, 90 ELL, 45 ELL 추가
기술적 개선:
- 키워드 우선순위 체계 강화
- 구체적인 패턴 매칭 개선
- 분류 신뢰도 향상
플랜지 카테고리 개선:
- 타입 풀네임 표시 (WN → WELD NECK FLANGE)
- 끝단처리 별도 컬럼 추가 (RF → RAISED FACE)
- 엑셀 내보내기 구조 개선 (P열 납기일, 관리항목 4개)
엑셀 내보내기 통합:
- 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))
- 리비전 변경사항 추적 지원
- 구매신청 관리 페이지 수량을 정수로 표시 (3.000 EA → 3 EA)
- JSON 저장 시 수량 정수 변환
- FLANGE 품목명 세분화: WN RF, SO RF, ORIFICE FLANGE, SPECTACLE BLIND 등
- 구매관리 페이지 엑셀 다운로드 데이터 구조 개선
- 디버그 로그 추가
변동이력 관리로 전환:
- 도면번호 기준 변경 추적
- 리비전 업로드 시 전체 자재 저장 (차이분만 저장 방식 폐지)
- 구매신청 정보 수량 기반 상속
리비전 변경 감지:
- 수량/재질/크기/카테고리 변경 감지
- 변경 유형: specification_changed, quantity_changed, added, removed
- 도면별 변경사항 추적
누락 도면 처리:
- 리비전 업로드 시 누락된 도면 자동 감지
- 3가지 선택 옵션: 일부 업로드 / 도면 삭제 / 취소
- 구매신청 여부에 따라 다른 처리 (재고품 vs 숨김)
자재 상태 관리:
- revision_status 컬럼 추가 (active/inventory/deleted_not_purchased/changed)
- 재고품: 연노랑색 배경, '재고품' 배지
- 변경됨: 파란색 테두리, '변경됨' 배지
- 삭제됨: 자동 숨김
구매신청 정보 상속:
- 수량 기반 상속 (그룹별 개수만큼만)
- Rev.0에서 3개 구매 → Rev.1에서 처음 3개만 상속, 추가분은 미구매
- 도면번호 정확히 일치하는 경우에만 상속
기타 개선:
- 구매신청 관리 페이지 수량 표시 개선 (3 EA, 소수점 제거)
- 도면번호/라인번호 파싱 및 저장 (DWG_NAME, LINE_NUM 컬럼)
- SPECIAL 카테고리 도면번호 표시
- 마이그레이션 스크립트 추가 (29_add_revision_status.sql)
- 모든 카테고리 구매신청 기능 완성 (PIPE, FITTING, VALVE, FLANGE, GASKET, BOLT, SUPPORT, SPECIAL, UNKNOWN)
- 구매신청 완료 항목: 회색 배경, 체크박스 비활성화, '구매신청완료' 배지 표시
- 전체 선택/구매신청 시 이미 구매신청된 항목 자동 제외
- 구매신청 quantity 타입 에러 수정 (문자열 -> 정수 변환)
SUPPORT 카테고리 (구 U-BOLT):
- U-BOLT -> SUPPORT로 카테고리명 변경
- 클램프, 유볼트, 우레탄블럭슈 분류 개선
- 테이블 헤더: 선택-종류-타입-크기-디스크립션-추가요구-사용자요구-수량
- 크기 정보 main_nom 필드에서 가져오기 (배관 인치)
- 엑셀 내보내기 형식 조정
SPECIAL 카테고리:
- SPECIAL 키워드 자재 자동 분류 (SPECIFICATION 제외)
- 파일 업로드 시 SPECIAL 카테고리 처리 로직 추가
- 도면번호 필드 추가 (drawing_name, line_no)
- 타입 필드: 크기/스케줄/재질 제외한 핵심 정보 표시
- 엑셀 DWG_NAME, LINE_NUM 컬럼 파싱 및 저장
FITTING 카테고리:
- 테이블 컬럼 너비 조정 (선택 2%, 종류 8.5%, 수량 12%)
구매신청 관리:
- 엑셀 재다운로드 형식 개선 (BOM 페이지와 동일한 형식)
- 그룹화된 자재 정보 포함하여 저장 및 다운로드
- access_level='pending' 대신 is_active=False 사용
- access_level='worker'로 설정 (승인 시 변경 가능)
- 승인 대기 쿼리: is_active=FALSE로 조회
- 승인 쿼리: user_id 컬럼명 수정
- 거부 쿼리도 user_id 기준으로 수정 필요
로그인 제한:
- 로그인 API에서 이미 is_active 체크 중
- 비활성 계정은 로그인 불가
- 관리자 승인 후에만 로그인 가능
백엔드:
- signup_routes.py 신규 생성
- POST /auth/signup-request: 회원가입 신청
- GET /auth/signup-requests: 승인 대기 목록 (관리자)
- POST /auth/approve-signup/{id}: 승인 (관리자)
- DELETE /auth/reject-signup/{id}: 거부 (관리자)
- main.py에 signup_router 등록
프론트엔드:
- SimpleLogin에 회원가입 폼 추가
- 필수 항목만: 사용자명, 비밀번호, 비밀번호 확인, 이름
- 간단하고 깔끔한 UI
- 비밀번호 일치 검사 및 최소 길이 검사
- 제출 후 승인 대기 안내 메시지
백엔드:
- POST /dashboard/projects 엔드포인트 추가
- 프로젝트 생성 기능 구현
- 중복 코드 검사
- GET /dashboard/projects 컬럼명 수정 (실제 DB 스키마에 맞춤)
- PATCH /dashboard/projects/{id} 컬럼명 수정
프론트엔드:
- 메인 대시보드에 프로젝트 관리 섹션 추가
- '➕ 새 프로젝트' 버튼으로 생성 폼 표시/숨김
- '✏️ 이름 수정' 버튼으로 프로젝트 이름 수정
- 프로젝트 생성 폼:
- 프로젝트 코드 (필수)
- 프로젝트 이름 (필수)
- 고객사명 (선택)
- 실시간 프로젝트 목록 갱신
- API 연동 완료
백엔드:
- GET /dashboard/projects 엔드포인트 추가
- 프로젝트 목록 조회 API 구현
프론트엔드:
- parseMaterialInfo 결과를 useMemo로 캐싱
- parsedMaterialsMap으로 중복 계산 방지
- getParsedInfo() 함수로 캐시된 값 사용
- 성능 개선: 1315개 자재 × 6번 계산 → 1315개 자재 × 1번 계산
- 약 80% 계산 감소 (8000번 → 1500번)
효과:
- 페이지 로딩 속도 대폭 향상
- 메모리 사용량 감소
- 필터/정렬 기능 유지하면서 가벼워짐
- errorLogger.js에서 무한 루프 발생
- 원인: API 에러 → localStorage 저장 실패 → 서버 전송 실패 → 또 에러 발생
- 해결: errorLogger 완전 비활성화
- setupGlobalErrorHandlers() 비활성화
사용자 조치 필요:
브라우저 개발자 도구(F12) > Application > Local Storage > localhost:13000 > Clear All
- App.jsx dashboard에 프로젝트 이름 수정 기능 구현
- 프로젝트 선택 시 '✏️ 이름 수정' 버튼 표시
- 실제 API에서 프로젝트 목록 로드 (더미 데이터는 fallback)
- 편집 폼: 파란색 박스로 명확하게 구분
- Enter 키로 빠른 저장
- 💾 저장 / ✕ 취소 버튼
- 저장 후 드롭다운 자동 갱신
- 선택된 프로젝트 옆에 '✏️ 수정' 버튼 추가
- 수정 버튼 클릭 시 편집 폼 표시
- 입력 필드 + 저장/취소 버튼
- Enter 키로 저장 가능
- API 연동: PATCH /dashboard/projects/{id}
- 실시간 업데이트: 드롭다운 목록 및 선택된 이름 자동 갱신
- 간단하고 직관적인 UX
백엔드:
- dashboard.py에 PATCH /dashboard/projects/{id} 엔드포인트 추가
- 프로젝트 이름 업데이트 기능 구현
- 활동 로그 기록
프론트엔드:
- ProjectsPage에 인라인 편집 기능 추가
- 더블클릭으로 편집 모드 진입
- Enter 키로 저장, Escape로 취소
- 저장/취소 버튼 (✓/✕) 제공
- 간단하고 직관적인 UX
- DB: SUPPORT 카테고리 76개 자재를 U_BOLT로 변경 (총 211개)
- 프론트엔드: SUPPORT 표시명을 'U-BOLT'로 변경
- SUPPORT 전용 헤더 및 본문 렌더링 제거
- U_BOLT 렌더링 개선:
- U-BOLT: 기본 표시
- URETHANE: 우레탄 블록 슈
- CLAMP: 클램프 (신규 추가)
- CLAMP 배지 스타일 추가 (청록색)
- 모든 고정 픽셀 너비를 백분율(%)로 변경
- 화면 너비에 맞게 테이블이 꽉 차도록 설정
- overflow-x: hidden으로 가로 스크롤 제거
- 헤더와 본문이 정확히 동일한 백분율 사용
- 예: PIPE 9개 컬럼 = 5% 8% 12% 8% 10% 20% 12% 15% 10%
- 이제 어떤 화면 크기에서도 헤더와 본문이 완벽히 정렬됨
- 문제 원인: minmax(최소값, auto)로 인해 내용에 따라 컬럼 크기 변동
- 모든 minmax()를 고정 너비로 변경
- 헤더와 본문이 항상 정확히 동일한 너비 유지
- 예: minmax(130px, auto) → 130px
- 이제 모든 카테고리에서 완벽한 정렬 보장
- 문제 원인: 반응형 구조로 인해 브라우저 크기에 따라 컬럼 너비가 변경됨
- materials-page: min-width: 1400px 적용
- materials-grid: min-width: 1200px, width: fit-content 적용
- 이제 테이블이 고정 너비를 유지하고 스크롤로 확인 가능
- 헤더와 본문이 항상 동일한 너비 유지
- 전체 카테고리 버튼 제거
- 기본 선택 카테고리를 PIPE로 변경
- 문제 원인: 전체 카테고리에서 서로 다른 컬럼 수를 가진 자재들이 섞여서 표시됨
(PIPE 9개, FLANGE 10개, GASKET 11개 등)
- 이제 각 카테고리별로만 표시되어 헤더와 본문이 완벽히 정렬됨
- quantity-info wrapper 제거로 셀 구조 단순화
- 모든 카테고리에 minmax() 적용으로 내용에 맞게 컬럼 자동 확장
- 헤더와 본문에 동일한 padding: 6px 4px 적용
- 모든 margin 제거하고 순수 grid로 구성
- materials-grid에 외곽 border 추가
- 엑셀처럼 명확한 셀 구분선
- 텍스트가 길어도 잘리지 않고 컬럼이 자동 확장됨
- 모든 카테고리의 헤더와 본문 grid-template-columns를 통일
- FLANGE, FITTING, VALVE, GASKET, UNKNOWN 컬럼 너비 재조정
- 선택 컬럼: 40px → 60px (체크박스 공간 확보)
- 각 카테고리별 최적 컬럼 너비 적용으로 내용 잘림 방지
- 사용자요구 컬럼: 150px → 200px (입력 공간 확대)
- NewMaterialsPage.jsx: SUPPORT 전용 헤더 및 본문 행 추가 (9개 컬럼)
- NewMaterialsPage.css: SUPPORT 전용 그리드 레이아웃 및 스타일 추가
- 헤더와 본문의 컬럼이 정확히 매칭되도록 수정
- SUPPORT 전용 배지 스타일 추가 (청록색)
- bolt_classifier.py: A320/A194M 조합 패턴 처리 로직 추가
- material_grade_extractor.py: A320/A194M 패턴 추출 개선
- integrated_classifier.py: SPECIAL, U_BOLT 카테고리 우선 분류
- 데이터베이스: 492개 볼트의 material_grade를 완전한 형태로 업데이트
- A320/A194M GR B8/8: 78개
- A193/A194 GR B7/2H: 414개
- 프론트엔드: BOLT 카테고리 전용 UI (길이 표시)
- Excel 내보내기: BOLT용 컬럼 순서 및 재질 정보 개선
- SPECIAL, U_BOLT 카테고리 지원 추가
- 사용자 요구사항 저장/로드/엑셀 내보내기 기능 완전 구현
- 백엔드 API 수정: Request Body 방식으로 변경
- 데이터베이스 스키마: material_id 컬럼 추가
- 프론트엔드 상태 관리 개선: 저장 후 자동 리로드
- 입력 필드 연결 문제 해결: 누락된 onChange 핸들러 추가
- NewMaterialsPage에 '전체' 카테고리 버튼 추가 (기본 선택)
- Docker 환경 개선: 프론트엔드 볼륨 마운트 및 포트 수정
- UI 개선: 벌레 이모지 제거, 디버그 코드 정리
✅ 주요 수정사항:
- 재질 GRADE 전체 표기: ASTM A106 B 완전 표시 (A10 잘림 현상 해결)
- material_grade_extractor.py 정규표현식 패턴 개선
- files.py 파일 업로드 시 재질 추출 로직 수정
- CSS 그리드 너비 확장으로 텍스트 잘림 현상 해결
- 사용자 요구사항 엑셀 다운로드 기능 완료
🎯 해결된 문제:
1. ASTM A106 B → ASTM A10 잘림 문제
2. 재질 컬럼 너비 부족으로 인한 표시 문제
3. 사용자 요구사항이 엑셀에 반영되지 않는 문제
📋 다음 단계 준비:
- 파이프 끝단 정보 제외 취합 로직 개선
- 플랜지 타입 정보 확장
- 자재 분류 필터 기능 추가
- 리비전 업로드 시 모든 이전 리비전의 누적 자재를 조회하도록 수정
- 기존 단일 부모 파일 조회 → job_no 기준 누적 조회로 변경
- 차이분 계산 시 디버깅 로그 추가로 매칭 상태 확인 가능
- 자재 그룹핑과 라인 아이템 구분을 명확히 하는 로그 개선
- 기존 자재가 없는 경우 경고 메시지 추가
🌐 Nginx 프록시 설정 (테스트용):
- nginx-proxy.conf: /api 요청을 백엔드로 프록시
- docker-compose.proxy.yml: 프록시 서버 설정
- VITE_API_URL=/api 환경변수 설정으로 단일 도메인 접속
🎨 UI 텍스트 변경 (테스트용):
- LoginPage: TK-MP System → BOM 테스트 서버
- LoginPage: 통합 프로젝트 관리 시스템 → BOM 분류 시스템 v1.0
- LogMonitoringPage: 탭 네비게이션 추가 (로그인/활동/시스템 로그)
- SystemSettingsPage: 활동 로그 모니터링 기능 개선
🔧 백엔드 수정 (테스트용):
- files.py: 리비전 증분 계산 로직 수정 (전체 재분류 → 차이분만 분류)
- create_system_admin.py: database_url → get_database_url() 수정
⚠️ 주의: 이 커밋은 테스트 환경에서의 변경사항입니다.
🔬 추가된 마지막 테이블들:
- requirement_types (요구사항 타입 마스터)
- user_requirements (사용자 추가 요구사항)
- 임팩테스트, 열처리, 인증서, 비파괴검사 등 10종 기본 타입
📊 최종 통계 (정확한 수치):
- 총 테이블: 38개 (모든 backend/scripts 파일 통합 완료)
- 총 인덱스: 107개 (복합, GIN, 조건부 인덱스 포함)
- 총 뷰: 5개 (통계 및 성능 모니터링)
- 총 함수: 15개 이상 (트리거, 해시 생성 등)
✅ 완전성 검증:
- 21개 SQL 파일 모두 통합 완료
- 성능 최적화 인덱스 전체 적용
- 자동화 트리거 및 함수 모두 포함
- 기본 데이터 자동 생성 완료
🚀 배포 준비 완료:
- 다른 환경에서 한 번에 모든 테이블 생성 가능
- 기본 계정, 프로젝트, 권한, 요구사항 타입 자동 설정
🗄️ 추가된 주요 테이블:
- Jobs 테이블 (프로젝트 관리, project_type 포함)
- 자재 규격/재질 기준표 (8개 테이블)
- 자재 비교 시스템 (리비전 비교, 해시 기반)
- Tubing 시스템 (5개 테이블 + 제조사 데이터)
📊 성능 최적화:
- 복합 인덱스, GIN 인덱스, 조건부 인덱스
- 총 50+ 인덱스로 검색/정렬 성능 극대화
🔧 자동화 기능:
- 해시 자동 생성 함수 및 트리거
- updated_at 자동 갱신 트리거
- 정규화된 description 자동 생성
📈 통계 및 뷰:
- classification_summary (분류 통계)
- classification_performance (분류 성능)
- material_inventory_status (재고 현황)
📝 완전성:
- 총 30+ 테이블, 50+ 인덱스, 6개 뷰, 10+ 함수
- 모든 backend/scripts SQL 파일 통합 완료
- 다른 환경 배포 시 한 번에 모든 테이블 생성 가능