Some checks failed
SonarQube Analysis / SonarQube Scan (push) Has been cancelled
- 파이프 수량 계산 로직 수정 (단관 개수가 아닌 실제 길이 기반 계산) - UI 전면 개편 (DevonThink 스타일의 간결하고 세련된 디자인) - 자재별 그룹핑 로직 개선: * 플랜지: 동일 사양별 그룹핑, WN 스케줄 표시, ORIFICE 풀네임 표시 * 피팅: 상세 타입 표시 (니플 길이, 엘보 각도/연결, 티 타입, 리듀서 타입 등) * 밸브: 동일 사양별 그룹핑, 타입/연결방식/압력 표시 * 볼트: 크기/재질/길이별 그룹핑 (8SET → 개별 집계) * 가스켓: 동일 사양별 그룹핑, 재질/상세내역/두께 분리 표시 * UNKNOWN: 원본 설명 전체 표시, 동일 항목 그룹핑 - 전체 카테고리 버튼 제거 (표시 복잡도 감소) - 카테고리별 동적 컬럼 헤더 및 레이아웃 적용
143 lines
5.4 KiB
PL/PgSQL
143 lines
5.4 KiB
PL/PgSQL
-- 사용자 추적 및 담당자 기록 필드 추가
|
|
-- 생성일: 2025.01
|
|
-- 목적: RULES 가이드라인에 따른 사용자 추적 시스템 구축
|
|
|
|
-- ================================
|
|
-- 1. 기존 테이블에 담당자 필드 추가
|
|
-- ================================
|
|
|
|
-- files 테이블 수정 (uploaded_by는 이미 존재)
|
|
ALTER TABLE files
|
|
ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100),
|
|
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
|
|
|
|
-- jobs 테이블 수정
|
|
ALTER TABLE jobs
|
|
ADD COLUMN IF NOT EXISTS created_by VARCHAR(100),
|
|
ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100),
|
|
ADD COLUMN IF NOT EXISTS assigned_to VARCHAR(100);
|
|
|
|
-- materials 테이블 수정
|
|
ALTER TABLE materials
|
|
ADD COLUMN IF NOT EXISTS classified_by VARCHAR(100),
|
|
ADD COLUMN IF NOT EXISTS classified_at TIMESTAMP,
|
|
ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100);
|
|
|
|
-- ================================
|
|
-- 2. 사용자 활동 로그 테이블 생성
|
|
-- ================================
|
|
|
|
CREATE TABLE IF NOT EXISTS user_activity_logs (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER, -- users 테이블 참조 (외래키 제약 없음 - 유연성)
|
|
username VARCHAR(100) NOT NULL, -- 사용자명 (필수)
|
|
|
|
-- 활동 정보
|
|
activity_type VARCHAR(50) NOT NULL, -- 'FILE_UPLOAD', 'PROJECT_CREATE', 'PURCHASE_CONFIRM' 등
|
|
activity_description TEXT, -- 상세 활동 내용
|
|
|
|
-- 대상 정보
|
|
target_id INTEGER, -- 대상 ID (파일, 프로젝트 등)
|
|
target_type VARCHAR(50), -- 'FILE', 'PROJECT', 'MATERIAL', 'PURCHASE' 등
|
|
|
|
-- 세션 정보
|
|
ip_address VARCHAR(45), -- IP 주소
|
|
user_agent TEXT, -- 브라우저 정보
|
|
|
|
-- 추가 메타데이터 (JSON)
|
|
metadata JSONB, -- 추가 정보 (파일 크기, 처리 시간 등)
|
|
|
|
-- 시간 정보
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- ================================
|
|
-- 3. 구매 관련 테이블 수정
|
|
-- ================================
|
|
|
|
-- purchase_items 테이블 수정 (이미 created_by 존재하는지 확인 후 추가)
|
|
ALTER TABLE purchase_items
|
|
ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100),
|
|
ADD COLUMN IF NOT EXISTS approved_by VARCHAR(100),
|
|
ADD COLUMN IF NOT EXISTS approved_at TIMESTAMP;
|
|
|
|
-- material_purchase_tracking 테이블 수정 (이미 confirmed_by 존재)
|
|
ALTER TABLE material_purchase_tracking
|
|
ADD COLUMN IF NOT EXISTS ordered_by VARCHAR(100),
|
|
ADD COLUMN IF NOT EXISTS ordered_at TIMESTAMP,
|
|
ADD COLUMN IF NOT EXISTS approved_by VARCHAR(100),
|
|
ADD COLUMN IF NOT EXISTS approved_at TIMESTAMP;
|
|
|
|
-- ================================
|
|
-- 4. 인덱스 생성 (성능 최적화)
|
|
-- ================================
|
|
|
|
-- 사용자 활동 로그 인덱스
|
|
CREATE INDEX IF NOT EXISTS idx_user_activity_logs_username ON user_activity_logs(username);
|
|
CREATE INDEX IF NOT EXISTS idx_user_activity_logs_activity_type ON user_activity_logs(activity_type);
|
|
CREATE INDEX IF NOT EXISTS idx_user_activity_logs_created_at ON user_activity_logs(created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_user_activity_logs_target ON user_activity_logs(target_type, target_id);
|
|
|
|
-- 담당자 필드 인덱스
|
|
CREATE INDEX IF NOT EXISTS idx_files_uploaded_by ON files(uploaded_by);
|
|
CREATE INDEX IF NOT EXISTS idx_files_updated_by ON files(updated_by);
|
|
CREATE INDEX IF NOT EXISTS idx_jobs_created_by ON jobs(created_by);
|
|
CREATE INDEX IF NOT EXISTS idx_jobs_assigned_to ON jobs(assigned_to);
|
|
CREATE INDEX IF NOT EXISTS idx_materials_classified_by ON materials(classified_by);
|
|
|
|
-- ================================
|
|
-- 5. 트리거 생성 (자동 updated_at 갱신)
|
|
-- ================================
|
|
|
|
-- files 테이블 updated_at 자동 갱신
|
|
CREATE OR REPLACE FUNCTION update_files_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = CURRENT_TIMESTAMP;
|
|
RETURN NEW;
|
|
END;
|
|
$$ language 'plpgsql';
|
|
|
|
DROP TRIGGER IF EXISTS trigger_files_updated_at ON files;
|
|
CREATE TRIGGER trigger_files_updated_at
|
|
BEFORE UPDATE ON files
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_files_updated_at();
|
|
|
|
-- jobs 테이블 updated_at 자동 갱신
|
|
CREATE OR REPLACE FUNCTION update_jobs_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = CURRENT_TIMESTAMP;
|
|
RETURN NEW;
|
|
END;
|
|
$$ language 'plpgsql';
|
|
|
|
DROP TRIGGER IF EXISTS trigger_jobs_updated_at ON jobs;
|
|
CREATE TRIGGER trigger_jobs_updated_at
|
|
BEFORE UPDATE ON jobs
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_jobs_updated_at();
|
|
|
|
-- ================================
|
|
-- 6. 기본 데이터 설정
|
|
-- ================================
|
|
|
|
-- 기존 데이터에 기본 담당자 설정 (시스템 마이그레이션용)
|
|
UPDATE files SET uploaded_by = 'system' WHERE uploaded_by IS NULL;
|
|
UPDATE jobs SET created_by = 'system' WHERE created_by IS NULL;
|
|
|
|
-- ================================
|
|
-- 7. 권한 및 보안 설정
|
|
-- ================================
|
|
|
|
-- 활동 로그 테이블은 INSERT만 허용 (수정/삭제 방지)
|
|
-- 실제 운영에서는 별도 권한 관리 필요
|
|
|
|
COMMENT ON TABLE user_activity_logs IS '사용자 활동 로그 - 모든 업무 활동 추적';
|
|
COMMENT ON COLUMN user_activity_logs.activity_type IS '활동 유형: FILE_UPLOAD, PROJECT_CREATE, PURCHASE_CONFIRM, MATERIAL_CLASSIFY 등';
|
|
COMMENT ON COLUMN user_activity_logs.metadata IS '추가 정보 JSON: 파일크기, 처리시간, 변경내용 등';
|
|
|
|
-- 완료 메시지
|
|
SELECT 'User tracking system tables created successfully!' as result;
|