feat: 사진 업로드 기능 개선 및 카테고리 업데이트

- 사진 2장까지 업로드 지원
- 카메라 촬영 + 갤러리 선택 분리
- 이미지 압축 및 최적화 (ImageUtils)
- iPhone .mpo 파일 JPEG 변환 지원
- 카테고리 변경: 치수불량 → 설계미스, 검사미스 추가
- KST 시간대 설정
- URL 해시 처리로 목록관리 페이지 이동 개선
- 로그인 OAuth2 form-data 형식 수정
- 업로드 속도 개선 및 프로그레스바 추가
This commit is contained in:
hyungi
2025-09-18 07:00:28 +09:00
parent f6bdb68d19
commit 44e2fb2e44
32 changed files with 988 additions and 177 deletions

View File

@@ -1,10 +1,22 @@
-- 초기 데이터베이스 설정
-- Enum 타입 생성 (4개 카테고리)
CREATE TYPE userRole AS ENUM ('admin', 'user');
CREATE TYPE issueStatus AS ENUM ('new', 'progress', 'complete');
CREATE TYPE issueCategory AS ENUM (
'material_missing', -- 자재누락
'design_error', -- 설계미스
'incoming_defect', -- 입고자재 불량
'inspection_miss' -- 검사미스
);
-- 사용자 테이블
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
hashed_password VARCHAR(255) NOT NULL,
full_name VARCHAR(100),
role VARCHAR(20) DEFAULT 'user',
role userRole DEFAULT 'user',
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
@@ -12,20 +24,21 @@ CREATE TABLE IF NOT EXISTS users (
-- 이슈 테이블
CREATE TABLE IF NOT EXISTS issues (
id SERIAL PRIMARY KEY,
photo_path VARCHAR(255),
category VARCHAR(50) NOT NULL,
photo_path VARCHAR(500),
photo_path2 VARCHAR(500), -- 두 번째 사진
category issueCategory NOT NULL,
description TEXT NOT NULL,
status VARCHAR(20) DEFAULT 'new',
status issueStatus DEFAULT 'new',
reporter_id INTEGER REFERENCES users(id),
report_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
work_hours FLOAT DEFAULT 0,
detail_notes TEXT
);
-- 일일 공수 테이블
-- 일일 작업 테이블
CREATE TABLE IF NOT EXISTS daily_works (
id SERIAL PRIMARY KEY,
date DATE NOT NULL UNIQUE,
date DATE NOT NULL,
worker_count INTEGER NOT NULL,
regular_hours FLOAT NOT NULL,
overtime_workers INTEGER DEFAULT 0,
@@ -33,11 +46,13 @@ CREATE TABLE IF NOT EXISTS daily_works (
overtime_total FLOAT DEFAULT 0,
total_hours FLOAT NOT NULL,
created_by_id INTEGER REFERENCES users(id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(date)
);
-- 인덱스 생성
CREATE INDEX idx_issues_reporter_id ON issues(reporter_id);
CREATE INDEX idx_issues_status ON issues(status);
CREATE INDEX idx_issues_report_date ON issues(report_date);
CREATE INDEX idx_issues_category ON issues(category);
CREATE INDEX idx_daily_works_date ON daily_works(date);
CREATE INDEX idx_daily_works_created_by_id ON daily_works(created_by_id);

View File

@@ -0,0 +1,5 @@
-- 두 번째 사진 경로 추가
ALTER TABLE issues ADD COLUMN IF NOT EXISTS photo_path2 VARCHAR(500);
-- 인덱스 추가 (선택사항)
CREATE INDEX IF NOT EXISTS idx_issues_photo_path2 ON issues(photo_path2);

View File

@@ -0,0 +1,8 @@
-- 카테고리 업데이트 마이그레이션
-- dimension_defect를 design_error로 변경
UPDATE issues
SET category = 'design_error'
WHERE category = 'dimension_defect';
-- PostgreSQL enum 타입 업데이트 (필요한 경우)
-- 기존 enum 타입 확인 후 필요시 재생성

View File

@@ -0,0 +1,9 @@
-- 카테고리 값 정규화 (대문자를 소문자로 변경)
-- 기존 DIMENSION_DEFECT를 design_error로 변경
UPDATE issues SET category = 'design_error' WHERE category IN ('DIMENSION_DEFECT', 'dimension_defect');
UPDATE issues SET category = 'material_missing' WHERE category = 'MATERIAL_MISSING';
UPDATE issues SET category = 'incoming_defect' WHERE category = 'INCOMING_DEFECT';
UPDATE issues SET category = 'inspection_miss' WHERE category = 'INSPECTION_MISS';
-- 카테고리 값 확인
SELECT category, COUNT(*) FROM issues GROUP BY category;

View File

@@ -0,0 +1,20 @@
-- PostgreSQL enum 타입 재생성
-- 카테고리 컬럼을 임시로 텍스트로 변경
ALTER TABLE issues ALTER COLUMN category TYPE VARCHAR(50);
-- 기존 enum 타입 삭제
DROP TYPE IF EXISTS issuecategory CASCADE;
-- 새로운 enum 타입 생성 (4개 카테고리)
CREATE TYPE issuecategory AS ENUM (
'material_missing', -- 자재누락
'design_error', -- 설계미스 (기존 dimension_defect 대체)
'incoming_defect', -- 입고자재 불량
'inspection_miss' -- 검사미스 (신규)
);
-- 카테고리 컬럼을 새 enum 타입으로 변경
ALTER TABLE issues ALTER COLUMN category TYPE issuecategory USING category::issuecategory;
-- 확인
SELECT enumlabel FROM pg_enum WHERE enumtypid = (SELECT oid FROM pg_type WHERE typname = 'issuecategory');