package com.pms.service; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.pms.common.SqlMapConfig; import lombok.extern.slf4j.Slf4j; @Slf4j @Service public class MultiLangService { @Autowired private SqlSession sqlSession; // 회사 목록 조회 public List> getCompanies() { try { log.info("회사 목록 조회 시작"); List> result = sqlSession.selectList("multilang.selectCompanies"); log.info("회사 목록 조회 완료: {}개", result != null ? result.size() : 0); return result; } catch (Exception e) { log.error("회사 목록 조회 중 오류 발생", e); throw e; } } // 언어 마스터 조회 public List> getLanguages() { try { log.info("다국어 언어 목록 조회 시작"); List> result = sqlSession.selectList("multilang.selectLanguages"); log.info("다국어 언어 목록 조회 완료: {}개", result != null ? result.size() : 0); return result; } catch (Exception e) { log.error("다국어 언어 목록 조회 중 오류 발생", e); throw e; } } // 언어 추가 @Transactional public String createLanguage(Map languageData) { try { log.info("언어 추가 시작: {}", languageData); sqlSession.insert("multilang.insertLanguage", languageData); String langCode = (String) languageData.get("langCode"); log.info("언어 추가 완료: langCode = {}", langCode); return langCode; } catch (Exception e) { log.error("언어 추가 중 오류 발생", e); throw e; } } // 언어 수정 @Transactional public void updateLanguage(Map languageData) { try { log.info("언어 수정 시작: {}", languageData); sqlSession.update("multilang.updateLanguage", languageData); log.info("언어 수정 완료"); } catch (Exception e) { log.error("언어 수정 중 오류 발생", e); throw e; } } // 언어 삭제 @Transactional public void deleteLanguage(String langCode) { try { log.info("언어 삭제 시작: langCode = {}", langCode); Map params = new HashMap<>(); params.put("langCode", langCode); sqlSession.delete("multilang.deleteLanguage", params); log.info("언어 삭제 완료"); } catch (Exception e) { log.error("언어 삭제 중 오류 발생", e); throw e; } } // 언어 활성/비활성 토글 @Transactional public String toggleLanguage(String langCode) { try { log.info("언어 상태 토글 시작: langCode = {}", langCode); // 현재 상태 조회 Map params = new HashMap<>(); params.put("langCode", langCode); Map currentLanguage = sqlSession.selectOne("multilang.selectLanguageByCode", params); if (currentLanguage == null) { throw new RuntimeException("언어를 찾을 수 없습니다: " + langCode); } String currentStatus = (String) currentLanguage.get("isActive"); String newStatus = "Y".equals(currentStatus) ? "N" : "Y"; // 상태 업데이트 params.put("isActive", newStatus); sqlSession.update("multilang.updateLanguageStatus", params); String result = "Y".equals(newStatus) ? "활성화" : "비활성화"; log.info("언어 상태 토글 완료: langCode = {}, 상태 = {}", langCode, result); return result; } catch (Exception e) { log.error("언어 상태 토글 중 오류 발생", e); throw e; } } // 회사별 다국어 키 목록 조회 public List> getLangKeys(Map params) { return sqlSession.selectList("multilang.selectLangKeys", params); } // 특정 키의 다국어 텍스트 조회 public List> getLangTexts(Integer keyId) { Map params = new HashMap<>(); params.put("keyId", keyId); return sqlSession.selectList("multilang.selectLangTexts", params); } // 다국어 키 생성 @Transactional public Integer createLangKey(Map keyData) { try { // 중복 체크 Map existingKey = sqlSession.selectOne("multilang.selectLangKeyByCompanyAndKey", keyData); if (existingKey != null) { throw new RuntimeException("동일한 회사에 이미 존재하는 언어키입니다: " + keyData.get("langKey")); } sqlSession.insert("multilang.insertLangKey", keyData); return (Integer) keyData.get("keyId"); } catch (Exception e) { log.error("다국어 키 생성 중 오류 발생", e); throw e; } } // 다국어 키 수정 @Transactional public void updateLangKey(Map keyData) { try { // 중복 체크 (자신을 제외하고) Map existingKey = sqlSession.selectOne("multilang.selectLangKeyByCompanyAndKeyExcludeSelf", keyData); if (existingKey != null) { throw new RuntimeException("동일한 회사에 이미 존재하는 언어키입니다: " + keyData.get("langKey")); } sqlSession.update("multilang.updateLangKey", keyData); } catch (Exception e) { log.error("다국어 키 수정 중 오류 발생", e); throw e; } } // 다국어 키 삭제 @Transactional public void deleteLangKey(Integer keyId) { Map params = new HashMap<>(); params.put("keyId", keyId); sqlSession.delete("multilang.deleteLangKey", params); } // 다국어 키 활성/비활성 토글 @Transactional public String toggleLangKey(Integer keyId) { try { log.info("다국어 키 상태 토글 시작: keyId = {}", keyId); // 현재 상태 조회 Map params = new HashMap<>(); params.put("keyId", keyId); Map currentKey = sqlSession.selectOne("multilang.selectLangKeyById", params); if (currentKey == null) { throw new RuntimeException("키를 찾을 수 없습니다: " + keyId); } String currentStatus = (String) currentKey.get("isActive"); String newStatus = "Y".equals(currentStatus) ? "N" : "Y"; // 상태 업데이트 params.put("isActive", newStatus); sqlSession.update("multilang.updateLangKeyStatus", params); String result = "Y".equals(newStatus) ? "활성화" : "비활성화"; log.info("다국어 키 상태 토글 완료: keyId = {}, 상태 = {}", keyId, result); return result; } catch (Exception e) { log.error("다국어 키 상태 토글 중 오류 발생", e); throw e; } } // 다국어 텍스트 저장/수정 @Transactional public void saveLangTexts(Integer keyId, List> textData) { // 기존 텍스트 삭제 Map deleteParams = new HashMap<>(); deleteParams.put("keyId", keyId); sqlSession.delete("multilang.deleteLangTexts", deleteParams); // 새로운 텍스트 삽입 for (Map text : textData) { text.put("keyId", keyId); sqlSession.insert("multilang.insertLangText", text); } } // 특정 키의 다국어 텍스트 조회 public String getLangText(String companyCode, String langKey, String langCode) { Map params = new HashMap<>(); params.put("companyCode", companyCode); params.put("langKey", langKey); params.put("langCode", langCode); Map result = sqlSession.selectOne("multilang.selectLangText", params); return result != null ? (String) result.get("langText") : langKey; // 기본값으로 키 반환 } // 사용자별 다국어 텍스트 조회 public String getUserText(String companyCode, String menuCode, String langKey, String userLang) { try { log.info("🔍 사용자 텍스트 조회: companyCode={}, menuCode={}, langKey={}, userLang={}", companyCode, menuCode, langKey, userLang); Map params = new HashMap<>(); params.put("companyCode", companyCode); params.put("menuCode", menuCode); params.put("langKey", langKey); params.put("userLang", userLang); System.out.println("🔍 SQL 파라미터: " + params); Map result = sqlSession.selectOne("multilang.selectUserText", params); System.out.println("🔍 SQL 결과: " + result); if (result != null && result.get("langText") != null) { String text = (String) result.get("langText"); log.info("✅ 사용자 텍스트 조회 성공: {}", text); System.out.println("✅ 사용자 텍스트 조회 성공: " + text); return text; } else { log.warn("⚠️ 사용자 텍스트를 찾을 수 없음, 키 반환: {}", langKey); System.out.println("⚠️ 사용자 텍스트를 찾을 수 없음, 키 반환: " + langKey); return langKey; // 기본값으로 키 반환 } } catch (Exception e) { log.error("❌ 사용자 텍스트 조회 중 오류 발생", e); System.err.println("❌ 사용자 텍스트 조회 중 오류 발생: " + e.getMessage()); e.printStackTrace(); return langKey; // 오류 시 키 반환 } } // 간단한 테스트 메서드 public String testConnection() { try { log.info("데이터베이스 연결 테스트 시작"); // 간단한 쿼리 실행 String result = sqlSession.selectOne("SELECT 'OK' as test"); log.info("데이터베이스 연결 테스트 성공: {}", result); return result; } catch (Exception e) { log.error("데이터베이스 연결 테스트 실패", e); throw e; } } }