Some checks failed
SonarQube Analysis / SonarQube Scan (push) Has been cancelled
✅ 백엔드 구조 개선: - DatabaseService: 공통 DB 쿼리 로직 통합 - FileUploadService: 파일 업로드 로직 모듈화 및 트랜잭션 관리 개선 - 서비스 레이어 패턴 도입으로 코드 재사용성 향상 ✅ 프론트엔드 컴포넌트 개선: - LoadingSpinner, ErrorMessage, ConfirmDialog 공통 컴포넌트 생성 - 재사용 가능한 컴포넌트 라이브러리 구축 - deprecated/backup 파일들 완전 제거 ✅ 성능 최적화: - optimize_database.py: 핵심 DB 인덱스 자동 생성 - 쿼리 최적화 및 통계 업데이트 자동화 - VACUUM ANALYZE 자동 실행 ✅ 코드 정리: - 개별 SQL 마이그레이션 파일들을 legacy/ 폴더로 정리 - 중복된 마이그레이션 스크립트 정리 - 깔끔하고 체계적인 프로젝트 구조 완성 ✅ 자동 마이그레이션 시스템 강화: - complete_migrate.py: SQLAlchemy 기반 완전한 마이그레이션 - analyze_and_fix_schema.py: 백엔드 코드 분석 기반 스키마 수정 - fix_missing_tables.py: 누락된 테이블/컬럼 자동 생성 - start.sh: 배포 시 자동 실행 순서 최적화
80 lines
3.7 KiB
SQL
80 lines
3.7 KiB
SQL
-- 분류 결과 저장을 위한 컬럼 추가
|
|
-- 2024년 BOM 분류 시스템 개선
|
|
|
|
-- materials 테이블에 분류 관련 컬럼 추가
|
|
ALTER TABLE materials ADD COLUMN IF NOT EXISTS subcategory VARCHAR(100);
|
|
ALTER TABLE materials ADD COLUMN IF NOT EXISTS standard VARCHAR(200);
|
|
ALTER TABLE materials ADD COLUMN IF NOT EXISTS grade VARCHAR(200);
|
|
ALTER TABLE materials ADD COLUMN IF NOT EXISTS classification_details JSONB;
|
|
|
|
-- files 테이블에 분류 통계 컬럼 추가
|
|
ALTER TABLE files ADD COLUMN IF NOT EXISTS classification_stats JSONB;
|
|
ALTER TABLE files ADD COLUMN IF NOT EXISTS classification_completed BOOLEAN DEFAULT FALSE;
|
|
ALTER TABLE files ADD COLUMN IF NOT EXISTS classification_timestamp TIMESTAMP;
|
|
|
|
-- 인덱스 추가 (성능 향상)
|
|
CREATE INDEX IF NOT EXISTS idx_materials_classified_category ON materials(classified_category);
|
|
CREATE INDEX IF NOT EXISTS idx_materials_subcategory ON materials(subcategory);
|
|
CREATE INDEX IF NOT EXISTS idx_materials_standard ON materials(standard);
|
|
CREATE INDEX IF NOT EXISTS idx_materials_grade ON materials(grade);
|
|
CREATE INDEX IF NOT EXISTS idx_materials_classification_confidence ON materials(classification_confidence);
|
|
|
|
-- 기존 데이터에 대한 기본값 설정
|
|
UPDATE materials SET
|
|
subcategory = COALESCE(subcategory, ''),
|
|
standard = COALESCE(standard, ''),
|
|
grade = COALESCE(grade, ''),
|
|
classification_details = COALESCE(classification_details, '{}'::jsonb)
|
|
WHERE subcategory IS NULL OR standard IS NULL OR grade IS NULL OR classification_details IS NULL;
|
|
|
|
-- 분류 완료된 파일들 업데이트
|
|
UPDATE files SET
|
|
classification_completed = TRUE,
|
|
classification_timestamp = created_at
|
|
WHERE parsed_count > 0;
|
|
|
|
-- 통계 뷰 생성 (분류 결과 통계 조회용)
|
|
CREATE OR REPLACE VIEW classification_summary AS
|
|
SELECT
|
|
f.job_no,
|
|
f.original_filename,
|
|
f.parsed_count,
|
|
f.classification_completed,
|
|
f.classification_timestamp,
|
|
COUNT(*) as total_materials,
|
|
COUNT(CASE WHEN m.classified_category = 'BOLT' THEN 1 END) as bolt_count,
|
|
COUNT(CASE WHEN m.classified_category = 'FLANGE' THEN 1 END) as flange_count,
|
|
COUNT(CASE WHEN m.classified_category = 'FITTING' THEN 1 END) as fitting_count,
|
|
COUNT(CASE WHEN m.classified_category = 'GASKET' THEN 1 END) as gasket_count,
|
|
COUNT(CASE WHEN m.classified_category = 'INSTRUMENT' THEN 1 END) as instrument_count,
|
|
COUNT(CASE WHEN m.classified_category = 'PIPE' THEN 1 END) as pipe_count,
|
|
COUNT(CASE WHEN m.classified_category = 'VALVE' THEN 1 END) as valve_count,
|
|
COUNT(CASE WHEN m.classified_category = 'MATERIAL' THEN 1 END) as material_count,
|
|
COUNT(CASE WHEN m.classified_category = 'OTHER' THEN 1 END) as other_count,
|
|
AVG(m.classification_confidence) as avg_confidence,
|
|
COUNT(CASE WHEN m.is_verified = TRUE THEN 1 END) as verified_count
|
|
FROM files f
|
|
LEFT JOIN materials m ON f.id = m.file_id
|
|
WHERE f.is_active = TRUE
|
|
GROUP BY f.id, f.job_no, f.original_filename, f.parsed_count, f.classification_completed, f.classification_timestamp;
|
|
|
|
-- 분류 성능 통계 뷰
|
|
CREATE OR REPLACE VIEW classification_performance AS
|
|
SELECT
|
|
classified_category,
|
|
subcategory,
|
|
standard,
|
|
COUNT(*) as total_count,
|
|
AVG(classification_confidence) as avg_confidence,
|
|
COUNT(CASE WHEN is_verified = TRUE THEN 1 END) as verified_count,
|
|
COUNT(CASE WHEN is_verified = FALSE THEN 1 END) as unverified_count,
|
|
ROUND(
|
|
(COUNT(CASE WHEN is_verified = TRUE THEN 1 END)::DECIMAL / COUNT(*) * 100), 2
|
|
) as verification_rate
|
|
FROM materials
|
|
WHERE classified_category IS NOT NULL
|
|
GROUP BY classified_category, subcategory, standard
|
|
ORDER BY total_count DESC;
|
|
|
|
-- 변경사항 확인
|
|
SELECT 'Database schema updated successfully' as status; |