370 lines
11 KiB
Python
370 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
상수 정의 모듈
|
|
애플리케이션 전역에서 사용되는 상수들을 정의합니다.
|
|
|
|
이 모듈은 다음을 포함합니다:
|
|
- 애플리케이션 정보
|
|
- 팀 및 권한 관련 상수
|
|
- UI 관련 상수
|
|
- 데이터베이스 관련 상수
|
|
- 파일 경로 상수
|
|
"""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from typing import Dict, List, Tuple
|
|
|
|
# ============================================================================
|
|
# 애플리케이션 정보
|
|
# ============================================================================
|
|
|
|
APP_NAME = "전동차 업무 인수인계 시스템 (Created by ChoiKH)"
|
|
APP_NAME_EN = "Train Handover System"
|
|
APP_VERSION = "1.0.0"
|
|
APP_AUTHOR = "검수팀"
|
|
APP_DESCRIPTION = "전동차 운용실 업무 인수인계 및 고장관리 프로그램"
|
|
|
|
# ============================================================================
|
|
# 경로 상수
|
|
# ============================================================================
|
|
|
|
# 프로젝트 루트 디렉토리
|
|
ROOT_DIR = Path(__file__).parent.parent.absolute()
|
|
|
|
# 데이터 디렉토리
|
|
DATA_DIR = ROOT_DIR / "data"
|
|
LOGS_DIR = ROOT_DIR / "logs"
|
|
ASSETS_DIR = ROOT_DIR / "assets"
|
|
FONTS_DIR = ASSETS_DIR / "fonts"
|
|
ICONS_DIR = ASSETS_DIR / "icons"
|
|
IMAGES_DIR = ASSETS_DIR / "images"
|
|
STYLES_DIR = ASSETS_DIR / "styles"
|
|
|
|
# 데이터베이스 파일
|
|
DB_FILE = DATA_DIR / "handover.db"
|
|
|
|
# 설정 파일
|
|
CONFIG_FILE = ROOT_DIR / "config.ini"
|
|
|
|
# ============================================================================
|
|
# 팀 관련 상수
|
|
# ============================================================================
|
|
|
|
# 팀 목록
|
|
TEAMS: List[str] = ["1팀", "2팀", "3팀", "4팀"]
|
|
|
|
# 근무 유형
|
|
SHIFT_TYPES: Dict[str, str] = {
|
|
"day": "주간",
|
|
"night": "야간",
|
|
}
|
|
|
|
# 팀 직책
|
|
TEAM_POSITIONS: Dict[str, Dict] = {
|
|
"vice_leader": {
|
|
"name": "부팀장",
|
|
"count": 2, # 각 팀당 2명
|
|
},
|
|
"operator": {
|
|
"name": "운용",
|
|
"count": 3, # 각 팀당 2~3명
|
|
},
|
|
}
|
|
|
|
# ============================================================================
|
|
# 부서 및 권한 관련 상수
|
|
# ============================================================================
|
|
|
|
# 부서 목록
|
|
DEPARTMENTS: List[str] = [
|
|
"검수팀",
|
|
"운전팀",
|
|
"차량팀",
|
|
"관제팀",
|
|
"기타",
|
|
]
|
|
|
|
# 역할 목록
|
|
ROLES: Dict[str, str] = {
|
|
"admin": "관리자",
|
|
"editor": "편집자",
|
|
"viewer": "조회자",
|
|
}
|
|
|
|
# 부서별 기본 권한
|
|
DEPARTMENT_PERMISSIONS: Dict[str, str] = {
|
|
"검수팀": "admin", # 모든 권한
|
|
"운전팀": "viewer", # 조회만
|
|
"차량팀": "viewer", # 조회만
|
|
"관제팀": "viewer", # 조회만
|
|
"기타": "viewer", # 조회만
|
|
}
|
|
|
|
# ============================================================================
|
|
# 청소 유형 상수
|
|
# ============================================================================
|
|
|
|
CLEANING_TYPES: Dict[str, Dict] = {
|
|
"none": {
|
|
"name": "없음",
|
|
"color": None,
|
|
"shape": None,
|
|
},
|
|
"medium": {
|
|
"name": "중청소",
|
|
"color": "#3498db", # 파란색
|
|
"shape": "rectangle",
|
|
},
|
|
"large": {
|
|
"name": "대청소",
|
|
"color": "#e74c3c", # 빨간색
|
|
"shape": "circle",
|
|
},
|
|
}
|
|
|
|
# ============================================================================
|
|
# 고장 코드 관련 상수
|
|
# ============================================================================
|
|
|
|
# JSON 데이터 파일 경로
|
|
FAULT_DATA_FILE = DATA_DIR / "fault_data.json"
|
|
|
|
# JSON에서 데이터 로드
|
|
def _load_fault_data():
|
|
"""고장 관련 데이터를 JSON 파일에서 로드"""
|
|
import json
|
|
try:
|
|
if FAULT_DATA_FILE.exists():
|
|
with open(FAULT_DATA_FILE, 'r', encoding='utf-8') as f:
|
|
data = json.load(f)
|
|
return data
|
|
else:
|
|
# 기본값 반환
|
|
return {
|
|
"train_numbers": [],
|
|
"stations": [],
|
|
"column_numbers": [],
|
|
"device_categories": [
|
|
"추진장치", "제동장치", "출입문", "냉난방", "조명",
|
|
"방송", "ATC/ATO", "집전장치", "차체", "대차", "기타"
|
|
],
|
|
"fault_codes": []
|
|
}
|
|
except (json.JSONDecodeError, IOError, OSError):
|
|
# 로드 실패 시 기본값 반환
|
|
return {
|
|
"train_numbers": [],
|
|
"stations": [],
|
|
"column_numbers": [],
|
|
"device_categories": [
|
|
"추진장치", "제동장치", "출입문", "냉난방", "조명",
|
|
"방송", "ATC/ATO", "집전장치", "차체", "대차", "기타"
|
|
],
|
|
"fault_codes": []
|
|
}
|
|
|
|
# 고장 데이터 로드
|
|
_fault_data = _load_fault_data()
|
|
|
|
# 편성번호 목록
|
|
TRAIN_NUMBERS: List[str] = _fault_data.get("train_numbers", [])
|
|
|
|
# 역 목록
|
|
STATIONS: List[str] = _fault_data.get("stations", [])
|
|
|
|
# 열번 목록
|
|
COLUMN_NUMBERS: List[str] = _fault_data.get("column_numbers", [])
|
|
|
|
# 장치 분류
|
|
DEVICE_CATEGORIES: List[str] = _fault_data.get("device_categories", [
|
|
"추진장치", "제동장치", "출입문", "냉난방", "조명",
|
|
"방송", "ATC/ATO", "집전장치", "차체", "대차", "기타"
|
|
])
|
|
|
|
# 고장코드 목록
|
|
FAULT_CODES: List[str] = _fault_data.get("fault_codes", [])
|
|
|
|
# 고장출처 목록
|
|
FAULT_SOURCES: List[str] = [
|
|
"일상검수",
|
|
"출고검수",
|
|
"도착검수",
|
|
"입고기관사",
|
|
"상태권",
|
|
"직원모니터링",
|
|
"기타"
|
|
]
|
|
|
|
# ============================================================================
|
|
# UI 관련 상수
|
|
# ============================================================================
|
|
|
|
# 레이아웃 비율 (퍼센트)
|
|
LAYOUT_RATIOS: Dict[str, float] = {
|
|
"info_bar": 10.0, # 상단 인포바
|
|
"content_area": 80.0, # 중앙 컨텐츠
|
|
"status_bar": 10.0, # 하단 상태바
|
|
"section_panel": 60.0, # 섹션 패널 (컨텐츠 내 좌측)
|
|
"todo_panel": 40.0, # Todo 패널 (컨텐츠 내 우측)
|
|
"daily_inspection": 30.0, # 일상검수 영역
|
|
"todo_list": 35.0, # 할일 목록 영역
|
|
"memo": 35.0, # 메모 영역
|
|
}
|
|
|
|
# 폰트 설정
|
|
FONT_FAMILY = "GmarketSans"
|
|
FONT_SIZES: Dict[str, int] = {
|
|
"title": 18,
|
|
"heading": 16,
|
|
"subheading": 14,
|
|
"body": 13,
|
|
"small": 11,
|
|
"tiny": 9,
|
|
}
|
|
|
|
# UI 영역별 폰트 설정
|
|
UI_FONT_SETTINGS: Dict[str, Dict] = {
|
|
# 인포바
|
|
"info_bar": {
|
|
"title": {"family": FONT_FAMILY, "size": 16, "weight": "bold"},
|
|
"content": {"family": FONT_FAMILY, "size": 14, "weight": "normal"},
|
|
"small": {"family": FONT_FAMILY, "size": 12, "weight": "normal"},
|
|
},
|
|
# 섹션 (지시, 고장, 작업, 기타)
|
|
"section": {
|
|
"title": {"family": FONT_FAMILY, "size": 16, "weight": "bold"},
|
|
"header": {"family": FONT_FAMILY, "size": 13, "weight": "bold"},
|
|
"content": {"family": FONT_FAMILY, "size": 13, "weight": "normal"},
|
|
"small": {"family": FONT_FAMILY, "size": 11, "weight": "normal"},
|
|
},
|
|
# 할일 목록
|
|
"todo": {
|
|
"title": {"family": FONT_FAMILY, "size": 14, "weight": "bold"},
|
|
"content": {"family": FONT_FAMILY, "size": 13, "weight": "normal"},
|
|
"small": {"family": FONT_FAMILY, "size": 11, "weight": "normal"},
|
|
},
|
|
# 메모
|
|
"memo": {
|
|
"title": {"family": FONT_FAMILY, "size": 14, "weight": "bold"},
|
|
"content": {"family": FONT_FAMILY, "size": 13, "weight": "normal"},
|
|
},
|
|
# 일상검수
|
|
"daily_inspection": {
|
|
"title": {"family": FONT_FAMILY, "size": 14, "weight": "bold"},
|
|
"content": {"family": FONT_FAMILY, "size": 12, "weight": "normal"},
|
|
"train_number": {"family": FONT_FAMILY, "size": 13, "weight": "bold"},
|
|
},
|
|
# 상태바
|
|
"status_bar": {
|
|
"content": {"family": FONT_FAMILY, "size": 12, "weight": "normal"},
|
|
},
|
|
# 다이얼로그
|
|
"dialog": {
|
|
"title": {"family": FONT_FAMILY, "size": 12, "weight": "bold"},
|
|
"label": {"family": FONT_FAMILY, "size": 10, "weight": "normal"},
|
|
"input": {"family": FONT_FAMILY, "size": 10, "weight": "normal"},
|
|
"button": {"family": FONT_FAMILY, "size": 10, "weight": "medium"},
|
|
},
|
|
}
|
|
|
|
# 테마 색상 (다크 테마)
|
|
DARK_THEME_COLORS: Dict[str, str] = {
|
|
"primary": "#3498db",
|
|
"secondary": "#2ecc71",
|
|
"accent": "#e74c3c",
|
|
"warning": "#f39c12",
|
|
"background": "#1a1a2e",
|
|
"surface": "#16213e",
|
|
"card": "#0f3460",
|
|
"text_primary": "#ffffff",
|
|
"text_secondary": "#a0a0a0",
|
|
"border": "#2d3748",
|
|
"hover": "#4a5568",
|
|
"success": "#48bb78",
|
|
"error": "#fc8181",
|
|
}
|
|
|
|
# 테마 색상 (라이트 테마)
|
|
LIGHT_THEME_COLORS: Dict[str, str] = {
|
|
"primary": "#2980b9",
|
|
"secondary": "#27ae60",
|
|
"accent": "#c0392b",
|
|
"warning": "#d68910",
|
|
"background": "#f5f7fa",
|
|
"surface": "#ffffff",
|
|
"card": "#ffffff",
|
|
"text_primary": "#2c3e50",
|
|
"text_secondary": "#7f8c8d",
|
|
"border": "#e0e0e0",
|
|
"hover": "#ecf0f1",
|
|
"success": "#2ecc71",
|
|
"error": "#e74c3c",
|
|
}
|
|
|
|
# ============================================================================
|
|
# 일상검수 관련 상수
|
|
# ============================================================================
|
|
|
|
# 일상검수 슬롯 수
|
|
DAILY_INSPECTION_SLOTS = 5
|
|
|
|
# ============================================================================
|
|
# 시간 관련 상수
|
|
# ============================================================================
|
|
|
|
# 업데이트 체크 주기 (초)
|
|
UPDATE_CHECK_INTERVAL = 3600 # 1시간
|
|
|
|
# 날씨 정보 갱신 주기 (초)
|
|
WEATHER_UPDATE_INTERVAL = 1800 # 30분
|
|
|
|
# 자동 저장 주기 (초)
|
|
AUTO_SAVE_INTERVAL = 30 # 30초
|
|
|
|
# 로그 파일 보관 기간 (일)
|
|
LOG_RETENTION_DAYS = 30
|
|
|
|
# ============================================================================
|
|
# 날씨 API 관련 상수
|
|
# ============================================================================
|
|
|
|
# 기상청 API (예시)
|
|
WEATHER_API_URL = "https://api.openweathermap.org/data/2.5/weather"
|
|
WEATHER_API_KEY = "" # 설정 파일에서 로드
|
|
|
|
# 기본 위치 (서울)
|
|
DEFAULT_LOCATION: Dict[str, float] = {
|
|
"lat": 37.5665,
|
|
"lon": 126.9780,
|
|
"name": "서울",
|
|
}
|
|
|
|
# ============================================================================
|
|
# 데이터베이스 관련 상수
|
|
# ============================================================================
|
|
|
|
# 테이블 이름
|
|
TABLE_NAMES: Dict[str, str] = {
|
|
"users": "users",
|
|
"teams": "teams",
|
|
"instructions": "instructions",
|
|
"faults": "faults",
|
|
"works": "works",
|
|
"miscs": "miscs",
|
|
"daily_inspections": "daily_inspections",
|
|
"todos": "todos",
|
|
"memos": "memos",
|
|
"settings": "settings",
|
|
}
|
|
|
|
# 팀 확인 상태 기본값
|
|
DEFAULT_TEAM_CONFIRMATIONS = {
|
|
"1팀": False,
|
|
"2팀": False,
|
|
"3팀": False,
|
|
"4팀": False,
|
|
}
|
|
|
|
|