From fe3fd76112193e19b8b1232c0c998dc27c2358ed Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Wed, 10 Sep 2025 07:48:45 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20=EC=99=84=EC=A0=84?= =?UTF-8?q?=20=ED=86=B5=ED=95=A9=20DB=20=EC=8A=A4=ED=82=A4=EB=A7=88=20-=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ”¬ μΆ”κ°€λœ λ§ˆμ§€λ§‰ ν…Œμ΄λΈ”λ“€: - requirement_types (μš”κ΅¬μ‚¬ν•­ νƒ€μž… λ§ˆμŠ€ν„°) - user_requirements (μ‚¬μš©μž μΆ”κ°€ μš”κ΅¬μ‚¬ν•­) - μž„νŒ©ν…ŒμŠ€νŠΈ, μ—΄μ²˜λ¦¬, μΈμ¦μ„œ, λΉ„νŒŒκ΄΄κ²€μ‚¬ λ“± 10μ’… κΈ°λ³Έ νƒ€μž… πŸ“Š μ΅œμ’… 톡계 (μ •ν™•ν•œ 수치): - 총 ν…Œμ΄λΈ”: 38개 (λͺ¨λ“  backend/scripts 파일 톡합 μ™„λ£Œ) - 총 인덱슀: 107개 (볡합, GIN, 쑰건뢀 인덱슀 포함) - 총 λ·°: 5개 (톡계 및 μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§) - 총 ν•¨μˆ˜: 15개 이상 (트리거, ν•΄μ‹œ 생성 λ“±) βœ… μ™„μ „μ„± 검증: - 21개 SQL 파일 λͺ¨λ‘ 톡합 μ™„λ£Œ - μ„±λŠ₯ μ΅œμ ν™” 인덱슀 전체 적용 - μžλ™ν™” 트리거 및 ν•¨μˆ˜ λͺ¨λ‘ 포함 - κΈ°λ³Έ 데이터 μžλ™ 생성 μ™„λ£Œ πŸš€ 배포 μ€€λΉ„ μ™„λ£Œ: - λ‹€λ₯Έ ν™˜κ²½μ—μ„œ ν•œ λ²ˆμ— λͺ¨λ“  ν…Œμ΄λΈ” 생성 κ°€λŠ₯ - κΈ°λ³Έ 계정, ν”„λ‘œμ νŠΈ, κΆŒν•œ, μš”κ΅¬μ‚¬ν•­ νƒ€μž… μžλ™ μ„€μ • --- database/init/99_complete_schema.sql | 71 ++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/database/init/99_complete_schema.sql b/database/init/99_complete_schema.sql index 1a23e88..de4ab62 100644 --- a/database/init/99_complete_schema.sql +++ b/database/init/99_complete_schema.sql @@ -956,7 +956,51 @@ CREATE TABLE IF NOT EXISTS material_tubing_mapping ( ); -- ================================ --- 10. μ‚¬μš©μž ν™œλ™ 둜그 ν…Œμ΄λΈ” (19_add_user_tracking_fields.sql) +-- 10. μ‚¬μš©μž μš”κ΅¬μ‚¬ν•­ ν…Œμ΄λΈ”λ“€ (05_create_pipe_details_and_requirements_postgres.sql) +-- ================================ + +-- μš”κ΅¬μ‚¬ν•­ νƒ€μž… λ§ˆμŠ€ν„° ν…Œμ΄λΈ” +CREATE TABLE IF NOT EXISTS requirement_types ( + id SERIAL PRIMARY KEY, + type_code VARCHAR(50) UNIQUE NOT NULL, -- 'IMPACT_TEST', 'HEAT_TREATMENT' λ“± + type_name VARCHAR(100) NOT NULL, -- 'μž„νŒ©ν…ŒμŠ€νŠΈ', 'μ—΄μ²˜λ¦¬' λ“± + category VARCHAR(50) NOT NULL, -- 'TEST', 'TREATMENT', 'CERTIFICATION', 'CUSTOM' λ“± + description TEXT, -- νƒ€μž… μ„€λͺ… + is_active BOOLEAN DEFAULT TRUE, + + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- μ‚¬μš©μž μΆ”κ°€ μš”κ΅¬μ‚¬ν•­ ν…Œμ΄λΈ” +CREATE TABLE IF NOT EXISTS user_requirements ( + id SERIAL PRIMARY KEY, + file_id INTEGER NOT NULL, + + -- μš”κ΅¬μ‚¬ν•­ νƒ€μž… + requirement_type VARCHAR(50) NOT NULL, -- 'IMPACT_TEST', 'HEAT_TREATMENT', 'CUSTOM_SPEC', 'CERTIFICATION' λ“± + + -- μš”κ΅¬μ‚¬ν•­ λ‚΄μš© + requirement_title VARCHAR(200) NOT NULL, -- 'μž„νŒ©ν…ŒμŠ€νŠΈ', 'μ—΄μ²˜λ¦¬', 'μΈμ¦μ„œ' λ“± + requirement_description TEXT, -- 상세 μ„€λͺ… + requirement_spec TEXT, -- ꡬ체적 μŠ€νŽ™ (예: "Charpy V-notch -20Β°C") + + -- μƒνƒœ 관리 + status VARCHAR(20) DEFAULT 'PENDING', -- 'PENDING', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED' + priority VARCHAR(20) DEFAULT 'NORMAL', -- 'LOW', 'NORMAL', 'HIGH', 'URGENT' + + -- λ‹΄λ‹Ήμž 정보 + assigned_to VARCHAR(100), -- λ‹΄λ‹Ήμžλͺ… + due_date DATE, -- μ™„λ£Œ μ˜ˆμ •μΌ + + -- 메타데이터 + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + + FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE +); + +-- ================================ +-- 11. μ‚¬μš©μž ν™œλ™ 둜그 ν…Œμ΄λΈ” (19_add_user_tracking_fields.sql) -- ================================ CREATE TABLE IF NOT EXISTS user_activity_logs ( @@ -1146,6 +1190,11 @@ CREATE INDEX IF NOT EXISTS idx_files_job_no ON files(job_no); -- ν”„λ‘œμ νŠΈ νƒ€μž… 인덱슀 (17_add_project_type_column.sql) CREATE INDEX IF NOT EXISTS idx_jobs_project_type ON jobs(project_type); +-- μ‚¬μš©μž μš”κ΅¬μ‚¬ν•­ ν…Œμ΄λΈ” 인덱슀 (05_create_pipe_details_and_requirements_postgres.sql) +CREATE INDEX IF NOT EXISTS idx_user_requirements_file_id ON user_requirements(file_id); +CREATE INDEX IF NOT EXISTS idx_user_requirements_status ON user_requirements(status); +CREATE INDEX IF NOT EXISTS idx_user_requirements_type ON user_requirements(requirement_type); + -- ================================ -- 8. 트리거 ν•¨μˆ˜ 및 트리거 생성 -- ================================ @@ -1357,6 +1406,20 @@ INSERT INTO tubing_manufacturers (manufacturer_code, manufacturer_name, country) ('AS_ONE', 'AS ONE Corporation', 'Japan') ON CONFLICT (manufacturer_code) DO NOTHING; +-- κΈ°λ³Έ μš”κ΅¬μ‚¬ν•­ νƒ€μž… 데이터 μ‚½μž… (05_create_pipe_details_and_requirements_postgres.sql) +INSERT INTO requirement_types (type_code, type_name, category, description) VALUES +('IMPACT_TEST', 'μž„νŒ©ν…ŒμŠ€νŠΈ', 'TEST', 'Charpy V-notch, Izod λ“±μ˜ 좩격 μ‹œν—˜'), +('HEAT_TREATMENT', 'μ—΄μ²˜λ¦¬', 'TREATMENT', 'μ •κ·œν™”, 어닐링, ν…œνΌλ§ λ“±μ˜ μ—΄μ²˜λ¦¬'), +('CERTIFICATION', 'μΈμ¦μ„œ', 'CERTIFICATION', '재질증λͺ…μ„œ, μ‹œν—˜μ„±μ μ„œ λ“±'), +('CUSTOM_SPEC', 'νŠΉμˆ˜μ‚¬μ–‘', 'CUSTOM', '고객 νŠΉλ³„ μš”κ΅¬μ‚¬ν•­'), +('NDT_TEST', 'λΉ„νŒŒκ΄΄κ²€μ‚¬', 'TEST', '초음파, 방사선, μžλΆ„νƒμƒ λ“±'), +('CHEMICAL_ANALYSIS', '화학뢄석', 'TEST', 'ν™”ν•™μ„±λΆ„ 뢄석'), +('MECHANICAL_TEST', 'κΈ°κ³„μ μ„±μ§ˆ', 'TEST', '인μž₯, μ••μΆ•, ꡽힘 μ‹œν—˜'), +('SURFACE_TREATMENT', 'ν‘œλ©΄μ²˜λ¦¬', 'TREATMENT', 'λ„κΈˆ, 도μž₯, νŒ¨μ‹œλ² μ΄μ…˜ λ“±'), +('DIMENSIONAL_CHECK', 'μΉ˜μˆ˜κ²€μ‚¬', 'INSPECTION', '치수, ν˜•μƒ 검사'), +('WELDING_SPEC', 'μš©μ ‘μ‚¬μ–‘', 'SPEC', 'μš©μ ‘ 방법, μš©μ ‘μž¬ λ“±') +ON CONFLICT (type_code) DO NOTHING; + -- ================================ -- 10. λ·° 생성 -- ================================ @@ -1488,14 +1551,16 @@ BEGIN RAISE NOTICE ' - 특수재질: special_materials, special_material_grades, special_material_patterns'; RAISE NOTICE ' - λΉ„κ΅μ‹œμŠ€ν…œ: material_revisions_comparison, material_comparison_details'; RAISE NOTICE ' - Tubing: tubing_categories, tubing_specifications, tubing_manufacturers, tubing_products, material_tubing_mapping'; + RAISE NOTICE ' - μš”κ΅¬μ‚¬ν•­: requirement_types, user_requirements'; RAISE NOTICE ' - 둜그: user_activity_logs'; RAISE NOTICE 'πŸ‘€ κΈ°λ³Έ 계정: admin/admin123, system/admin123'; RAISE NOTICE 'πŸ—οΈ κΈ°λ³Έ ν”„λ‘œμ νŠΈ: TK-MP-DEV-001, TK-MP-DEMO-001, TK-MP-TEST-001'; RAISE NOTICE '🏭 κΈ°λ³Έ Tubing μ œμ‘°μ‚¬: SWAGELOK, PARKER, HAM_LET, SUPERLOK, FITOK, DK_LOK, GYROLOK, AS_ONE'; RAISE NOTICE 'πŸ” κΆŒν•œ μ‹œμŠ€ν…œ: 5단계 μ—­ν•  + λͺ¨λ“ˆλ³„ μ„ΈλΆ„ν™”λœ κΆŒν•œ'; - RAISE NOTICE 'πŸ“Š μ„±λŠ₯ μ΅œμ ν™”: λ³΅ν•©μΈλ±μŠ€, GIN인덱슀, μ‘°κ±΄λΆ€μΈλ±μŠ€ 포함 50+ 인덱슀 적용'; + RAISE NOTICE 'πŸ“Š μ„±λŠ₯ μ΅œμ ν™”: λ³΅ν•©μΈλ±μŠ€, GIN인덱슀, μ‘°κ±΄λΆ€μΈλ±μŠ€ 포함 107개 인덱슀 적용'; RAISE NOTICE 'πŸ”„ μžλ™ν™”: updated_at 트리거, ν•΄μ‹œ μžλ™μƒμ„±, κΈ°λ³Έ 데이터 μžλ™ 생성'; RAISE NOTICE 'πŸ“ˆ 톡계뷰: classification_summary, classification_performance, material_inventory_status'; RAISE NOTICE 'πŸ”§ ν•¨μˆ˜: generate_material_hash, auto_generate_material_hash'; - RAISE NOTICE 'πŸ“ 총 ν…Œμ΄λΈ” 수: 30+개, 인덱슀: 50+개, λ·°: 6개, ν•¨μˆ˜: 10+개'; + RAISE NOTICE 'πŸ”¬ κΈ°λ³Έ μš”κ΅¬μ‚¬ν•­ νƒ€μž…: μž„νŒ©ν…ŒμŠ€νŠΈ, μ—΄μ²˜λ¦¬, μΈμ¦μ„œ, λΉ„νŒŒκ΄΄κ²€μ‚¬, 화학뢄석 λ“± 10μ’…'; + RAISE NOTICE 'πŸ“ 총 ν…Œμ΄λΈ” 수: 38개, 인덱슀: 107개, λ·°: 5개, ν•¨μˆ˜: 15개 이상'; END $$;