최초커밋

This commit is contained in:
kjs
2025-08-21 09:41:46 +09:00
commit a0e5b57a24
2454 changed files with 1476904 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,110 @@
package com.pms.service;
import com.pms.common.utils.EncryptUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.mybatis.spring.SqlSessionTemplate;
import jakarta.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Service
@RequiredArgsConstructor
public class AuthService {
private final SqlSessionTemplate sqlSessionTemplate;
private static final String MASTER_PWD = "qlalfqjsgh11"; // 기존 시스템과 동일한 마스터 패스워드
/**
* 로그인 비밀번호 체크 (기존 LoginService.loginPwdCheck와 동일)
*/
public Map<String, Object> loginPwdCheck(HttpServletRequest request, Map<String, Object> paramMap) {
Map<String, Object> resultMap = new HashMap<>();
EncryptUtil enc = new EncryptUtil();
try {
// 사용자 비밀번호 조회
Map<String, Object> userMap = sqlSessionTemplate.selectOne("user.selectUserPassword", paramMap);
System.out.println("userMap: " + userMap);
System.out.println("paramMap: " + paramMap);
if (userMap != null && !userMap.isEmpty()) {
String dbPwd = checkNull(userMap.get("user_password"));
String password = checkNull(paramMap.get("password"));
String encPwd = enc.encrypt(password);
// 마스터 패스워드 체크
if (MASTER_PWD.equals(password)) {
resultMap.put("loginResult", true);
return resultMap;
}
// 비밀번호 일치 여부 확인
if (dbPwd.equals(encPwd)) {
resultMap.put("loginResult", true);
} else {
resultMap.put("loginResult", false);
resultMap.put("errorReason", "비밀번호가 일치하지 않습니다.");
}
} else {
resultMap.put("loginResult", false);
resultMap.put("errorReason", "사용자를 찾을 수 없습니다.");
}
} catch (Exception e) {
log.error("로그인 처리 중 오류 발생", e);
resultMap.put("loginResult", false);
resultMap.put("errorReason", "로그인 처리 중 오류가 발생했습니다.");
}
return resultMap;
}
/**
* 사용자 정보 조회
*/
public Map<String, Object> getUserInfo(Map<String, Object> paramMap) {
try {
Map<String, Object> userInfo = sqlSessionTemplate.selectOne("user.getUserInfo", paramMap);
// photo 데이터 로깅 (디버깅용)
if (userInfo != null && userInfo.get("PHOTO") != null) {
Object photoObj = userInfo.get("PHOTO");
if (photoObj instanceof byte[]) {
byte[] photoBytes = (byte[]) photoObj;
log.debug("사용자 photo 데이터 조회됨 - 크기: {} bytes", photoBytes.length);
} else {
log.debug("사용자 photo 데이터 타입: {}", photoObj.getClass().getName());
}
} else {
log.debug("사용자 photo 데이터 없음");
}
return userInfo;
} catch (Exception e) {
log.error("사용자 정보 조회 중 오류 발생", e);
return null;
}
}
/**
* 로그인 접속 로그 저장
*/
public void insertLoginAccessLog(Map<String, Object> paramMap) {
try {
sqlSessionTemplate.insert("user.insertLoginAccessLog", paramMap);
} catch (Exception e) {
log.error("로그인 로그 저장 중 오류 발생", e);
}
}
/**
* Null 체크 유틸리티
*/
private String checkNull(Object obj) {
return obj == null ? "" : obj.toString().trim();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,284 @@
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<Map<String, Object>> getCompanies() {
try {
log.info("회사 목록 조회 시작");
List<Map<String, Object>> result = sqlSession.selectList("multilang.selectCompanies");
log.info("회사 목록 조회 완료: {}개", result != null ? result.size() : 0);
return result;
} catch (Exception e) {
log.error("회사 목록 조회 중 오류 발생", e);
throw e;
}
}
// 언어 마스터 조회
public List<Map<String, Object>> getLanguages() {
try {
log.info("다국어 언어 목록 조회 시작");
List<Map<String, Object>> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> params = new HashMap<>();
params.put("langCode", langCode);
Map<String, Object> 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<Map<String, Object>> getLangKeys(Map<String, Object> params) {
return sqlSession.selectList("multilang.selectLangKeys", params);
}
// 특정 키의 다국어 텍스트 조회
public List<Map<String, Object>> getLangTexts(Integer keyId) {
Map<String, Object> params = new HashMap<>();
params.put("keyId", keyId);
return sqlSession.selectList("multilang.selectLangTexts", params);
}
// 다국어 키 생성
@Transactional
public Integer createLangKey(Map<String, Object> keyData) {
try {
// 중복 체크
Map<String, Object> 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<String, Object> keyData) {
try {
// 중복 체크 (자신을 제외하고)
Map<String, Object> 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<String, Object> params = new HashMap<>();
params.put("keyId", keyId);
sqlSession.delete("multilang.deleteLangKey", params);
}
// 다국어 키 활성/비활성 토글
@Transactional
public String toggleLangKey(Integer keyId) {
try {
log.info("다국어 키 상태 토글 시작: keyId = {}", keyId);
// 현재 상태 조회
Map<String, Object> params = new HashMap<>();
params.put("keyId", keyId);
Map<String, Object> 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<Map<String, Object>> textData) {
// 기존 텍스트 삭제
Map<String, Object> deleteParams = new HashMap<>();
deleteParams.put("keyId", keyId);
sqlSession.delete("multilang.deleteLangTexts", deleteParams);
// 새로운 텍스트 삽입
for (Map<String, Object> text : textData) {
text.put("keyId", keyId);
sqlSession.insert("multilang.insertLangText", text);
}
}
// 특정 키의 다국어 텍스트 조회
public String getLangText(String companyCode, String langKey, String langCode) {
Map<String, Object> params = new HashMap<>();
params.put("companyCode", companyCode);
params.put("langKey", langKey);
params.put("langCode", langCode);
Map<String, Object> 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<String, Object> 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<String, Object> 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;
}
}
}

View File

@@ -0,0 +1,224 @@
package com.pms.service;
import java.util.HashMap;
import java.util.Map;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.pms.common.bean.PersonBean;
import com.pms.common.utils.Constants;
import com.pms.common.utils.SessionManager;
/**
* 세션 기반 인증 서비스
* 로그인 상태 확인, 사용자 정보 조회 등을 담당
*/
@Service
public class SessionService {
private static final Logger logger = LoggerFactory.getLogger(SessionService.class);
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
/**
* 현재 로그인된 사용자 정보 조회
* @param request HTTP 요청 객체
* @return 사용자 정보 Map (로그인되지 않은 경우 null)
*/
public Map<String, Object> getCurrentUserInfo(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (!SessionManager.hasSession(session)) {
logger.debug("유효하지 않은 세션으로 사용자 정보 조회 시도");
return null;
}
PersonBean person = SessionManager.getUserFromSession(session);
if (person == null) {
return null;
}
// PersonBean을 Map으로 변환하여 반환
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("userId", person.getUserId());
userInfo.put("userName", person.getUserName());
userInfo.put("userNameEng", person.getUserNameEng());
userInfo.put("userNameCn", person.getUserNameCn());
userInfo.put("deptCode", person.getDeptCode());
userInfo.put("deptName", person.getDeptName());
userInfo.put("positionCode", person.getPositionCode());
userInfo.put("positionName", person.getPositionName());
userInfo.put("email", person.getEmail());
userInfo.put("tel", person.getTel());
userInfo.put("cellPhone", person.getCellPhone());
userInfo.put("userType", person.getUserType());
userInfo.put("userTypeName", person.getUserTypeName());
userInfo.put("authName", person.getAuthName());
userInfo.put("partnerCd", person.getPartner_cd());
userInfo.put("isAdmin", person.getIsAdmin());
userInfo.put("sabun", person.getSabun());
userInfo.put("locale", person.getLocale());
// 이미지 정보 처리 (있으면 Base64로 인코딩, 없으면 null)
if (person.getPhoto() != null && person.getPhoto().length > 0) {
String photoData = new String(person.getPhoto());
userInfo.put("photo", photoData);
} else {
userInfo.put("photo", null);
}
logger.debug("현재 사용자 정보 조회 완료 - userId: {}", person.getUserId());
return userInfo;
}
/**
* 로그인 상태 확인
* @param request HTTP 요청 객체
* @return 로그인 여부
*/
public boolean isLoggedIn(HttpServletRequest request) {
HttpSession session = request.getSession(false);
return SessionManager.hasSession(session);
}
/**
* 관리자 권한 확인
* @param request HTTP 요청 객체
* @return 관리자 권한 여부
*/
public boolean isAdmin(HttpServletRequest request) {
HttpSession session = request.getSession(false);
return SessionManager.isAdmin(session);
}
/**
* 현재 사용자의 사용자 ID 조회
* @param request HTTP 요청 객체
* @return 사용자 ID (로그인되지 않은 경우 null)
*/
public String getCurrentUserId(HttpServletRequest request) {
HttpSession session = request.getSession(false);
PersonBean person = SessionManager.getUserFromSession(session);
return (person != null) ? person.getUserId() : null;
}
/**
* 현재 사용자의 부서 코드 조회
* @param request HTTP 요청 객체
* @return 부서 코드 (로그인되지 않은 경우 null)
*/
public String getCurrentUserDeptCode(HttpServletRequest request) {
HttpSession session = request.getSession(false);
PersonBean person = SessionManager.getUserFromSession(session);
return (person != null) ? person.getDeptCode() : null;
}
/**
* 로그아웃 처리
* @param request HTTP 요청 객체
* @return 로그아웃 성공 여부
*/
public boolean logout(HttpServletRequest request) {
try {
HttpSession session = request.getSession(false);
if (session != null) {
SessionManager.destroy(session);
logger.info("로그아웃 처리 완료");
return true;
}
logger.warn("로그아웃 시도했지만 세션이 없습니다.");
return false;
} catch (Exception e) {
logger.error("로그아웃 처리 중 오류 발생", e);
return false;
}
}
/**
* 사용자 메뉴 권한 확인
* @param request HTTP 요청 객체
* @param menuUrl 메뉴 URL
* @return 권한 있음 여부
*/
public boolean hasMenuAuth(HttpServletRequest request, String menuUrl) {
if (!isLoggedIn(request)) {
return false;
}
try {
String userId = getCurrentUserId(request);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("userId", userId);
paramMap.put("menuUrl", menuUrl);
Map<String, Object> authResult = sqlSessionTemplate.selectOne("admin.checkUserMenuAuth", paramMap);
if (authResult != null) {
// 권한이 있으면 "Y" 또는 숫자 > 0 으로 반환됨
Object authFlag = authResult.get("auth_flag");
if (authFlag != null) {
if ("Y".equals(authFlag.toString()) ||
(authFlag instanceof Number && ((Number) authFlag).intValue() > 0)) {
return true;
}
}
}
logger.debug("메뉴 권한 없음 - userId: {}, menuUrl: {}", userId, menuUrl);
return false;
} catch (Exception e) {
logger.error("메뉴 권한 확인 중 오류 발생 - menuUrl: {}", menuUrl, e);
return false;
}
}
/**
* 세션 정보 갱신 (사용자 정보 변경 시)
* @param request HTTP 요청 객체
* @param updatedUserInfo 업데이트된 사용자 정보
*/
public void refreshSession(HttpServletRequest request, Map<String, Object> updatedUserInfo) {
HttpSession session = request.getSession(false);
if (!SessionManager.hasSession(session)) {
logger.warn("세션 갱신 시도했지만 유효하지 않은 세션입니다.");
return;
}
try {
// 현재 세션의 사용자 정보 업데이트
PersonBean person = SessionManager.getUserFromSession(session);
if (person != null && updatedUserInfo != null) {
// 업데이트된 정보 반영
if (updatedUserInfo.containsKey("userName")) {
person.setUserName((String) updatedUserInfo.get("userName"));
}
if (updatedUserInfo.containsKey("email")) {
person.setEmail((String) updatedUserInfo.get("email"));
}
if (updatedUserInfo.containsKey("tel")) {
person.setTel((String) updatedUserInfo.get("tel"));
}
if (updatedUserInfo.containsKey("cellPhone")) {
person.setCellPhone((String) updatedUserInfo.get("cellPhone"));
}
if (updatedUserInfo.containsKey("photo")) {
person.setPhoto((byte[]) updatedUserInfo.get("photo"));
}
session.setAttribute(Constants.PERSON_BEAN, person);
logger.info("세션 정보 갱신 완료 - userId: {}", person.getUserId());
}
} catch (Exception e) {
logger.error("세션 정보 갱신 중 오류 발생", e);
}
}
}

View File

@@ -0,0 +1,61 @@
package com.pms.service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 테이블 관리 서비스
*/
@Service
public class TableManagementService {
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
/**
* 테이블 목록 조회
*/
public List<Map<String, Object>> getTableList() {
return sqlSessionTemplate.selectList("tableManagement.selectTableList");
}
/**
* 테이블 컬럼 정보 조회
*/
public List<Map<String, Object>> getColumnList(String tableName) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("tableName", tableName);
return sqlSessionTemplate.selectList("tableManagement.selectColumnList", paramMap); // Uses injected template
}
public void updateColumnSettings(String tableName, String columnName, Map<String, Object> settings) {
// 테이블이 table_labels에 없으면 자동 추가
sqlSessionTemplate.insert("tableManagement.insertTableIfNotExists", tableName);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("tableName", tableName);
paramMap.put("columnName", columnName);
paramMap.put("columnLabel", settings.get("columnLabel"));
paramMap.put("webType", settings.get("webType"));
paramMap.put("detailSettings", settings.get("detailSettings"));
paramMap.put("codeCategory", settings.get("codeCategory"));
paramMap.put("codeValue", settings.get("codeValue"));
paramMap.put("referenceTable", settings.get("referenceTable"));
paramMap.put("referenceColumn", settings.get("referenceColumn"));
sqlSessionTemplate.update("tableManagement.updateColumnSettings", paramMap);
}
public void updateAllColumnSettings(String tableName, List<Map<String, Object>> columnSettings) {
for (Map<String, Object> columnSetting : columnSettings) {
String columnName = (String) columnSetting.get("columnName");
updateColumnSettings(tableName, columnName, columnSetting);
}
}
}

View File

@@ -0,0 +1,93 @@
package com.pms.service;
import java.util.List;
import java.util.Map;
import jakarta.servlet.http.HttpServletRequest;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class UserService {
private final SqlSessionTemplate sqlSessionTemplate;
/**
* 사용자 정보 조회 (권한 정보 포함)
* @param request
* @param paramMap
* @return
*/
public Map<String, Object> getUserInfo(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
try {
return sqlSessionTemplate.selectOne("user.getUserInfo", paramMap);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 사용자 목록 조회
* @param request
* @param paramMap
* @return
*/
public List<Map<String, Object>> selectUserList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
try {
return sqlSessionTemplate.selectList("user.selectUserList", paramMap);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 사용자 등록
* @param request
* @param paramMap
* @return
*/
public int insertUser(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
try {
return sqlSessionTemplate.insert("user.insertUser", paramMap);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
/**
* 사용자 수정
* @param request
* @param paramMap
* @return
*/
public int updateUser(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
try {
return sqlSessionTemplate.update("user.updateUser", paramMap);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
/**
* 사용자 삭제
* @param request
* @param paramMap
* @return
*/
public int deleteUser(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
try {
return sqlSessionTemplate.delete("user.deleteUser", paramMap);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
}