diff --git a/pom.xml b/pom.xml index 3923bc1..c701e86 100644 --- a/pom.xml +++ b/pom.xml @@ -175,6 +175,19 @@ ch.qos.logback logback-classic + + + com.oracle.database.jdbc + ojdbc8 + 21.17.0.0 + + + + + com.oracle.database.nls + orai18n + 21.17.0.0 + diff --git a/src/main/java/com/itn/admin/ItnAdminApplication.java b/src/main/java/com/itn/admin/ItnAdminApplication.java index 78d7ef9..6c66e0d 100644 --- a/src/main/java/com/itn/admin/ItnAdminApplication.java +++ b/src/main/java/com/itn/admin/ItnAdminApplication.java @@ -11,7 +11,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @SpringBootApplication -@MapperScan("com.itn.admin.itn.commute.mapper") // 패키지 경로를 정확히 지정 +@MapperScan("com.itn.admin.itn.**.mapper") // 패키지 경로를 정확히 지정 //@SpringBootApplication(exclude = SecurityAutoConfiguration.class) public class ItnAdminApplication { diff --git a/src/main/java/com/itn/admin/cmn/config/GwDatabaseConfig.java b/src/main/java/com/itn/admin/cmn/config/GwDatabaseConfig.java new file mode 100644 index 0000000..a5596da --- /dev/null +++ b/src/main/java/com/itn/admin/cmn/config/GwDatabaseConfig.java @@ -0,0 +1,48 @@ +package com.itn.admin.cmn.config; + +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; + +import javax.sql.DataSource; + + +@Configuration +@MapperScan(value = "com.itn.admin.gw.holiday.mapper", sqlSessionFactoryRef = "factory3") +class GwDatabaseConfig { + + private final String GW_DATA_SOURCE = "GwDatabase"; + + // A database DataSource + @Bean(GW_DATA_SOURCE) + @ConfigurationProperties(prefix = "spring.gw.datasource") + public DataSource CommuteDataSource() { + return DataSourceBuilder.create() +// .type(HikariDataSource.class) + .build(); + } + + // SqlSessionTemplate 에서 사용할 SqlSession 을 생성하는 Factory + @Bean(name = "factory3") + public SqlSessionFactory CommuteSqlSessionFactory(@Qualifier(GW_DATA_SOURCE) DataSource dataSource) throws Exception { + SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); + sqlSessionFactory.setDataSource(dataSource); + sqlSessionFactory.setTypeAliasesPackage("com.itn.admin.gw"); + sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/gw/**/*Mapper.xml")); + sqlSessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml")); + return sqlSessionFactory.getObject(); + } + + // DataSource 에서 Transaction 관리를 위한 Manager 클래스 등록 + @Bean(name = "sqlSession3") + public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) { + return new SqlSessionTemplate(sqlSessionFactory); + } +} \ No newline at end of file diff --git a/src/main/java/com/itn/admin/cmn/config/SecurityConfig.java b/src/main/java/com/itn/admin/cmn/config/SecurityConfig.java index 8ab864f..5c00865 100644 --- a/src/main/java/com/itn/admin/cmn/config/SecurityConfig.java +++ b/src/main/java/com/itn/admin/cmn/config/SecurityConfig.java @@ -22,125 +22,147 @@ import org.springframework.security.web.session.SessionInformationExpiredStrateg import java.net.URL; import java.io.PrintWriter; -@Configuration -@EnableWebSecurity +@Configuration // Spring의 설정 클래스임을 나타냄 +@EnableWebSecurity // Spring Security의 웹 보안 기능을 활성화 public class SecurityConfig { + // 사용자 정보를 로드하는 커스텀 서비스 (UserDetailsService 구현체) private final CustomUserDetailsService customUserDetailsService; + // 사용자 관련 비즈니스 로직을 처리하는 서비스 private final UserService userService; + // 생성자를 통해 의존성 주입 public SecurityConfig(CustomUserDetailsService customUserDetailsService, UserService userService) { this.customUserDetailsService = customUserDetailsService; this.userService = userService; } + // 비밀번호 암호화를 위한 BCryptPasswordEncoder 빈 생성 @Bean PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } + // Spring Security의 보안 필터 체인을 설정하는 핵심 메서드 @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http + // CSRF(Cross-Site Request Forgery) 보호 비활성화 (주로 API 서버나 폼 기반 인증에서 사용) .csrf((csrfConfig) -> csrfConfig.disable()) + // X-Frame-Options 헤더 비활성화 (iframe 사용 허용) .headers((headerConfig) -> headerConfig.frameOptions(frameOptionsConfig -> frameOptionsConfig.disable())) + // HTTP 요청에 대한 권한 설정 .authorizeHttpRequests((authorizeRequests) -> authorizeRequests - .requestMatchers("/user/register").permitAll() - .requestMatchers("/accessDenied").permitAll() - .requestMatchers("/static/**", "/plugins/**", "/dist/**").permitAll() - .requestMatchers("/api/**").permitAll() - .requestMatchers("/admin/**").hasRole("ADMIN") - .anyRequest().authenticated() // 모든 요청에 대해 인증 요구 + .requestMatchers("/user/register").permitAll() // 회원가입 페이지는 인증 없이 접근 가능 + .requestMatchers("/accessDenied").permitAll() // 접근 거부 페이지는 인증 없이 접근 가능 + .requestMatchers("/static/**", "/plugins/**", "/dist/**").permitAll() // 정적 리소스는 인증 없이 접근 가능 + .requestMatchers("/api/**").permitAll() // API 엔드포인트는 인증 없이 접근 가능 + .requestMatchers("/admin/**").hasRole("ADMIN") // /admin/** 경로는 ADMIN 역할 필요 + .anyRequest().authenticated() // 나머지 모든 요청은 인증 필요 ) + // 예외 처리 설정 .exceptionHandling((exceptionConfig) -> exceptionConfig - .authenticationEntryPoint(customUnauthorizedEntryPoint()) - .accessDeniedHandler(customAccessDeniedHandler()) + .authenticationEntryPoint(customUnauthorizedEntryPoint()) // 인증 실패 시 처리 + .accessDeniedHandler(customAccessDeniedHandler()) // 권한 부족 시 처리 ) + // 폼 로그인 설정 .formLogin((formLogin) -> formLogin - .loginPage("/user/login") - .usernameParameter("username") - .passwordParameter("password") - .loginProcessingUrl("/login/login-proc") - .successHandler(customAuthenticationSuccessHandler()) - .failureHandler(customAuthenticationFailureHandler()) - .permitAll() + .loginPage("/user/login") // 커스텀 로그인 페이지 경로 + .usernameParameter("username") // 로그인 폼의 사용자 이름 파라미터 이름 + .passwordParameter("password") // 로그인 폼의 비밀번호 파라미터 이름 + .loginProcessingUrl("/login/login-proc") // 로그인 요청을 처리하는 URL + .successHandler(customAuthenticationSuccessHandler()) // 로그인 성공 시 핸들러 + .failureHandler(customAuthenticationFailureHandler()) // 로그인 실패 시 핸들러 + .permitAll() // 로그인 페이지는 누구나 접근 가능 ) + // 로그아웃 설정 .logout((logoutConfig) -> logoutConfig - .logoutUrl("/logout") - .logoutSuccessUrl("/user/login") - .invalidateHttpSession(true) // 세션 무효화 - .deleteCookies("JSESSIONID") // 쿠키 삭제 - .permitAll() + .logoutUrl("/logout") // 로그아웃 요청 URL + .logoutSuccessUrl("/user/login") // 로그아웃 성공 시 리다이렉트 URL + .invalidateHttpSession(true) // 로그아웃 시 세션 무효화 + .deleteCookies("JSESSIONID") // JSESSIONID 쿠키 삭제 + .permitAll() // 로그아웃은 누구나 요청 가능 ) + // 세션 관리 설정 .sessionManagement((sessionManagement) -> sessionManagement - .sessionFixation().migrateSession() // 세션 고정 공격 방지 - .invalidSessionUrl("/user/login?invalidSession=true") // 세션이 유효하지 않을 때 리다이렉트할 URL - .maximumSessions(1) // 동시 세션 수 제한 - .maxSessionsPreventsLogin(false) // 최대 세션 수 초과 시 추가 로그인을 방지 - .expiredSessionStrategy(sessionExpiredStrategy()) // 세션 만료 전략 설정 + .sessionFixation().migrateSession() // 세션 고정 공격 방지 (새 세션 생성 후 기존 데이터 복사) + .invalidSessionUrl("/user/login?invalidSession=true") // 세션이 유효하지 않을 때 리다이렉트 + .maximumSessions(1) // 한 사용자당 최대 동시 세션 수 제한 (1개) + .maxSessionsPreventsLogin(false) // 최대 세션 초과 시 새 로그인 허용 (기존 세션 만료) + .expiredSessionStrategy(sessionExpiredStrategy()) // 세션 만료 시 처리 전략 ) + // 사용자 정보 로드를 위한 서비스 설정 .userDetailsService(customUserDetailsService); + // 설정을 기반으로 SecurityFilterChain 객체 생성 및 반환 return http.build(); } + // 세션 만료 시 커스텀 전략을 정의하는 빈 @Bean public SessionInformationExpiredStrategy sessionExpiredStrategy() { - return new CustomSessionExpiredStrategy("/user/login?expired"); + return new CustomSessionExpiredStrategy("/user/login?expired"); // 세션 만료 시 리다이렉트 경로 지정 } + // 로그인 성공 시 동작을 커스터마이징하는 핸들러 @Bean public AuthenticationSuccessHandler customAuthenticationSuccessHandler() { return (request, response, authentication) -> { - // 디버깅 정보를 콘솔에 출력 + // 인증된 사용자 정보를 가져옴 CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal(); -// String userId = userDetails.getUserId(); - // 개발이 아니면 로그 등록하게 수정 20240522 + // 요청 URL의 호스트를 추출 (디버깅용) String host_url = new URL(request.getRequestURL().toString()).getHost(); - System.out.println("host_url : "+ host_url); - if(!"localhost".equals(host_url)){ + System.out.println("host_url : " + host_url); + + // 로컬 환경이 아닌 경우 로그인 로그를 기록 (2024-05-22 수정) + if (!"localhost".equals(host_url)) { String id = userDetails.getId(); - userService.loginLog(id); + userService.loginLog(id); // 로그인 기록 저장 } - response.setStatus(HttpStatus.OK.value()); - response.sendRedirect("/"); + response.setStatus(HttpStatus.OK.value()); // HTTP 상태 코드 200 설정 + response.sendRedirect("/"); // 루트 경로로 리다이렉트 }; } + // 로그인 실패 시 동작을 커스터마이징하는 핸들러 @Bean public AuthenticationFailureHandler customAuthenticationFailureHandler() { return (request, response, exception) -> { - // 디버깅 정보를 콘솔에 출력 + // 실패 원인을 콘솔에 출력 (디버깅용) System.out.println("Authentication failed. Exception: " + exception.getMessage()); - response.setStatus(HttpStatus.UNAUTHORIZED.value()); - response.sendRedirect("/user/login?error=true"); + response.setStatus(HttpStatus.UNAUTHORIZED.value()); // HTTP 상태 코드 401 설정 + response.sendRedirect("/user/login?error=true"); // 로그인 페이지로 리다이렉트 (에러 표시) }; } + // 인증되지 않은 사용자가 보호된 리소스에 접근 시 처리 @Bean public AuthenticationEntryPoint customUnauthorizedEntryPoint() { return (request, response, authException) -> { - response.sendRedirect("/user/login"); + response.sendRedirect("/user/login"); // 로그인 페이지로 리다이렉트 }; } + // 권한이 부족한 경우 처리 @Bean public AccessDeniedHandler customAccessDeniedHandler() { return (request, response, accessDeniedException) -> { - response.sendRedirect("/accessDenied"); + response.sendRedirect("/accessDenied"); // 접근 거부 페이지로 리다이렉트 }; } + // 세션 이벤트 발행을 위한 빈 (세션 생성/소멸 감지) @Bean public HttpSessionEventPublisher httpSessionEventPublisher() { return new HttpSessionEventPublisher(); } + // 에러 응답 객체를 정의하는 내부 클래스 @Getter @RequiredArgsConstructor public static class ErrorResponse { - private final HttpStatus status; - private final String message; + private final HttpStatus status; // HTTP 상태 코드 + private final String message; // 에러 메시지 } } diff --git a/src/main/java/com/itn/admin/cmn/util/DateUtils.java b/src/main/java/com/itn/admin/cmn/util/DateUtils.java index 536fba7..57c000e 100644 --- a/src/main/java/com/itn/admin/cmn/util/DateUtils.java +++ b/src/main/java/com/itn/admin/cmn/util/DateUtils.java @@ -1,5 +1,8 @@ package com.itn.admin.cmn.util; +import com.itn.admin.commute.mapper.domain.CommuteVO; +import org.apache.commons.lang3.StringUtils; + import java.time.DayOfWeek; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -9,7 +12,11 @@ import java.util.Map; public class DateUtils { - + /** + * 전 영업일을 계산하여 년, 월, 일을 Map 형태로 반환하는 메서드. + * 현재 날짜에서 하루를 빼고, 주말(토요일 또는 일요일)인 경우 금요일로 조정함. + * @return Map - "year", "month", "day" 키로 구성된 날짜 정보 + */ public static Map getPreviousBusinessDay(){ Map map = new HashMap<>(); @@ -32,9 +39,9 @@ public class DateUtils { // 결과 출력 - System.out.println("Year: " + year); - System.out.println("Month: " + month); - System.out.println("Day: " + day); +// System.out.println("Year: " + year); +// System.out.println("Month: " + month); +// System.out.println("Day: " + day); map.put("year",year); map.put("month",month); @@ -52,4 +59,21 @@ public class DateUtils { // 원하는 형식으로 변환 return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); } + public static String getYesterdayDate(CommuteVO commuteVO) { + // commuteVO에서 년, 월, 일을 가져옴 + String year = commuteVO.getSearchYear(); + String month = commuteVO.getSearchMonth(); + String day = commuteVO.getSearchDay(); + + // commuteVO의 값으로 LocalDate 생성 + LocalDate date = LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day)); + + // 어제 날짜 계산 +// LocalDate yesterday = date.minusDays(5); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + System.out.println("date.format(formatter) :: "+ date.format(formatter)); + return date.format(formatter); +// return yesterday.format(formatter); + } + } diff --git a/src/main/java/com/itn/admin/cmn/util/scheduled/ScheduledTasks.java b/src/main/java/com/itn/admin/cmn/util/scheduled/ScheduledTasks.java index fcd5e01..bc4a284 100644 --- a/src/main/java/com/itn/admin/cmn/util/scheduled/ScheduledTasks.java +++ b/src/main/java/com/itn/admin/cmn/util/scheduled/ScheduledTasks.java @@ -34,7 +34,6 @@ public class ScheduledTasks { // @Scheduled(cron = "*/50 * * * * MON-FRI") @Scheduled(cron = "0 40 10 * * MON-FRI") public void noonJob() throws IOException { - System.out.println("It's noon!"); morakService.morakMenu(); } diff --git a/src/main/java/com/itn/admin/cmn/util/thymeleafUtils/TCodeUtils.java b/src/main/java/com/itn/admin/cmn/util/thymeleafUtils/TCodeUtils.java new file mode 100644 index 0000000..183a7e3 --- /dev/null +++ b/src/main/java/com/itn/admin/cmn/util/thymeleafUtils/TCodeUtils.java @@ -0,0 +1,21 @@ +package com.itn.admin.cmn.util.thymeleafUtils; + +import com.itn.admin.itn.code.server.CodeDetailService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.thymeleaf.util.StringUtils; + +@Component +public class TCodeUtils { + + @Autowired + private CodeDetailService codeDetailService; + + public String getCodeName(String codeGroupId, String codeValue) { + if(StringUtils.isEmpty(codeValue)){ + return codeValue; + }; + return codeDetailService.getCodeName(codeGroupId, codeValue); + } + +} diff --git a/src/main/java/com/itn/admin/commute/mapper/CommuteMapper.java b/src/main/java/com/itn/admin/commute/mapper/CommuteMapper.java index a5900e9..fb04652 100644 --- a/src/main/java/com/itn/admin/commute/mapper/CommuteMapper.java +++ b/src/main/java/com/itn/admin/commute/mapper/CommuteMapper.java @@ -20,4 +20,6 @@ import java.util.List; public interface CommuteMapper { List findAll(CommuteVO commuteVO); + + CommuteVO findByUsridAndSrvdtBetween(CommuteVO commuteVO); } diff --git a/src/main/java/com/itn/admin/commute/mapper/domain/CommuteVO.java b/src/main/java/com/itn/admin/commute/mapper/domain/CommuteVO.java index 44ea403..a2f17d5 100644 --- a/src/main/java/com/itn/admin/commute/mapper/domain/CommuteVO.java +++ b/src/main/java/com/itn/admin/commute/mapper/domain/CommuteVO.java @@ -26,6 +26,7 @@ public class CommuteVO implements Serializable { private static final long serialVersionUID = 1L; private int evtlguid; + private String biostarId; private String srvdt; private int devdt; private int devuid; @@ -67,4 +68,11 @@ public class CommuteVO implements Serializable { private String searchDay; private String tableNm; + + private String uniqId; + + + private String div1; + private String div2; + private String div3; } diff --git a/src/main/java/com/itn/admin/commute/mapper/domain/ItnCommuteVO.java b/src/main/java/com/itn/admin/commute/mapper/domain/ItnCommuteVO.java index 1f5a67f..42f8b42 100644 --- a/src/main/java/com/itn/admin/commute/mapper/domain/ItnCommuteVO.java +++ b/src/main/java/com/itn/admin/commute/mapper/domain/ItnCommuteVO.java @@ -16,8 +16,9 @@ public class ItnCommuteVO implements Serializable { private Integer commuteId; // 아이디 private Integer commuteGroupId; // 그룹 아이디 - private String name; // 이름 - private String pstn; // 직위 + private String uniqId; + private String userName; // 이름 + private String userRank; // 직위 private String category; // 구분 private String workDt; // 근무일자 private String startTime; // 출근시간 @@ -27,6 +28,7 @@ public class ItnCommuteVO implements Serializable { private String transferDt; // 이관일시 private String approver; // 승인자 private String approverDt; // 승인일시 + private String holiCode; // 승인일시 diff --git a/src/main/java/com/itn/admin/commute/mapper/domain/UserEnum.java b/src/main/java/com/itn/admin/commute/mapper/domain/UserEnum.java index a5f338f..0d58c51 100644 --- a/src/main/java/com/itn/admin/commute/mapper/domain/UserEnum.java +++ b/src/main/java/com/itn/admin/commute/mapper/domain/UserEnum.java @@ -16,7 +16,7 @@ public enum UserEnum { ,user8("&@~Z/Uti3tzksl96ByRRZT7AQ==","유인식", "대표") ,user9("&@~zO4oUG4dNtiVfnDdfCWM2A==","장영익", "실장") ,user10("&@~O+736xoPn0FzMuPQufff1w==","김상훈", "본부장") - ,user11("&@~E8RB3p27IfRVEhNefMu2Vw==","김보미", "대리") +// ,user11("&@~E8RB3p27IfRVEhNefMu2Vw==","김보미", "대리") ,user12("&@~47amAycYJ4ZT8BZDi6a2sA==","이설희", "주임") ,user13("&@~KPBL+GIy7i2agV7V57MZWg==","정다은", "대리") ,user15("&@~S6vaRrMJmeRjp0T8z+/ybg==","강민경", "팀장") diff --git a/src/main/java/com/itn/admin/commute/service/CommuteService.java b/src/main/java/com/itn/admin/commute/service/CommuteService.java index 3d6cbbf..1c4910e 100644 --- a/src/main/java/com/itn/admin/commute/service/CommuteService.java +++ b/src/main/java/com/itn/admin/commute/service/CommuteService.java @@ -13,5 +13,4 @@ public interface CommuteService { Map transfer(CommuteVO commuteVO); - Map getCommuteList(ItnCommuteVO itnCommuteVO); } diff --git a/src/main/java/com/itn/admin/commute/service/HolidayAnalyzer.java b/src/main/java/com/itn/admin/commute/service/HolidayAnalyzer.java new file mode 100644 index 0000000..692cac9 --- /dev/null +++ b/src/main/java/com/itn/admin/commute/service/HolidayAnalyzer.java @@ -0,0 +1,68 @@ +package com.itn.admin.commute.service; + +import com.itn.admin.gw.holiday.mapper.domain.HolidayVO; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; + +public class HolidayAnalyzer { + + // 휴가 유형 상수 + private static final int FULL_DAY_MINUTES = 480; // 연차 + private static final int HALF_DAY_MINUTES = 240; // 반차 + private static final int WORK_START = 510; // 08:30 + private static final int WORK_END = 1050; // 17:30 + private static final int HALF_DAY_BREAK = 810; // 13:30 + + + + // 휴가 유형 판단 메서드 + public static String determineHolidayType(HolidayVO holi) { + // Long 타입을 int로 변환 + int reqCnt = holi.getReqCnt().intValue(); + int startTm = holi.getStartTm().intValue(); + int endTm = holi.getEndTm().intValue(); + + // 날짜 차이 계산 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + LocalDate startDate = LocalDate.parse(holi.getStartDt(), formatter); + LocalDate endDate = LocalDate.parse(holi.getEndDt(), formatter); + long daysBetween = ChronoUnit.DAYS.between(startDate, endDate) + 1; // 포함된 날짜 수 + + // 1일 신청 + if (daysBetween == 1) { + if (reqCnt == FULL_DAY_MINUTES) { + return "30"; // "연차"; + } else if (reqCnt == HALF_DAY_MINUTES) { + if (startTm == WORK_START && endTm == HALF_DAY_BREAK) { + return "10"; // "오후 반차"; + } else if (startTm == HALF_DAY_BREAK && endTm == WORK_END) { + return "20"; // "오전 반차"; + } else { + return "반차 (시간 확인 필요: " + startTm + " ~ " + endTm + ")"; + } + } + } + // 2일 이상 신청 + else if (daysBetween > 1) { + // 하루 평균 요청 시간 계산 + int avgMinutesPerDay = reqCnt / (int) daysBetween; + + if (avgMinutesPerDay == FULL_DAY_MINUTES) { + return "30"; // "연차 " + daysBetween + "일"; + } else if (avgMinutesPerDay == HALF_DAY_MINUTES) { + if (startTm == WORK_START && endTm == HALF_DAY_BREAK) { + return "10"; // "오후 반차 " + daysBetween + "일"; + } else if (startTm == HALF_DAY_BREAK && endTm == WORK_END) { + return "20"; // "오전 반차 " + daysBetween + "일"; + } else { + return "반차 (시간 확인 필요: " + startTm + " ~ " + endTm + ")"; + } + } + } + + return "기타 (" + reqCnt + "분, " + daysBetween + "일)"; + } + +} diff --git a/src/main/java/com/itn/admin/commute/service/impl/CommuteServiceImpl.java b/src/main/java/com/itn/admin/commute/service/impl/CommuteServiceImpl.java index 5f40cb3..dcc2361 100644 --- a/src/main/java/com/itn/admin/commute/service/impl/CommuteServiceImpl.java +++ b/src/main/java/com/itn/admin/commute/service/impl/CommuteServiceImpl.java @@ -7,13 +7,19 @@ import com.itn.admin.commute.mapper.domain.ItnCommuteGroupVO; import com.itn.admin.commute.mapper.domain.ItnCommuteVO; import com.itn.admin.commute.mapper.domain.UserEnum; import com.itn.admin.commute.service.CommuteService; +import com.itn.admin.commute.service.HolidayAnalyzer; +import com.itn.admin.gw.holiday.mapper.HolidayMapper; +import com.itn.admin.gw.holiday.mapper.domain.HolidayVO; import com.itn.admin.itn.code.mapper.domain.CodeDetailVO; import com.itn.admin.itn.code.server.CodeDetailService; import com.itn.admin.itn.commute.mapper.ItnCommuteMapper; +import com.itn.admin.itn.user.mapper.UserMapper; +import com.itn.admin.itn.user.mapper.domain.UserVO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.text.Collator; import java.time.DayOfWeek; @@ -36,9 +42,15 @@ public class CommuteServiceImpl implements CommuteService { @Autowired ItnCommuteMapper itnCommuteMapper; + @Autowired + HolidayMapper holidayMapper; + @Autowired CodeDetailService codeDetailService; + @Autowired + private UserMapper userMapper; + private static final int PAGE_SIZE = 5; @@ -55,38 +67,95 @@ public class CommuteServiceImpl implements CommuteService { return map; } - @Override - public Map getCommuteList(ItnCommuteVO itnCommuteVO) { - // controller에 return - if(StringUtils.isEmpty(itnCommuteVO.getWorkDt())){ + + + @Override + @Transactional + public Map transfer(CommuteVO commuteVO) { + + log.info(" :: commuteVO.getSearchYear() :: [{}]", commuteVO.getSearchYear()); + log.info(" :: commuteVO.getSearchYear() :: [{}]", commuteVO.getSearchMonth()); + log.info(" :: commuteVO.getSearchYear() :: [{}]", commuteVO.getSearchDay()); + + if(StringUtils.isEmpty(commuteVO.getSearchYear())){ + Map map = DateUtils.getPreviousBusinessDay(); - itnCommuteVO.setWorkDt(DateUtils.getFormatToStandardDate(map.get("year") +"-"+map.get("month")+"-"+map.get("day"))); + commuteVO.setSearchYear(map.get("year")); + commuteVO.setSearchMonth(map.get("month")); + commuteVO.setSearchDay(map.get("day")); } - log.info(":: rsnCode01List :: "); - List codeList = codeDetailService.getDetailsByGroupId("COMMUTE"); + // 년월일로 select 조건 : 관리자콘솔 정보 select를 위함 + CommuteVO searchVO = getSearchVO(commuteVO); - List itnCommuteList = itnCommuteMapper.findByWorkDtFromItnCommute(itnCommuteVO.getWorkDt()); + // 임직원 정보 select + List userAllVO = userMapper.findByBiostarIdIsNotNull(); + + List holidayList = holidayMapper.selectHolidaysByDateRange(DateUtils.getYesterdayDate(commuteVO)); + + String workDt = searchVO.getStartDate().split(" ")[0]; + + workDt = DateUtils.getFormatToStandardDate(workDt); + + Integer groupId = itnCommuteMapper.findByCommuteGroupIdFromItnCommuteWhereWordDt(workDt); + // groupId가 없으면 groupId insert + if(groupId == null) { + ItnCommuteGroupVO itnGroupVO = new ItnCommuteGroupVO(); + itnGroupVO.setWorkDt(workDt); + itnCommuteMapper.insertCommuteGroup(itnGroupVO); + groupId = itnGroupVO.getCommuteGroupId(); + } + List itnCommuteList = new ArrayList<>(); + for(UserVO userVO : userAllVO){ + + ItnCommuteVO itnCommuteVO = new ItnCommuteVO(); + itnCommuteVO.setCommuteGroupId(groupId); + + String biostarId = userVO.getBiostarId(); + searchVO.setBiostarId(biostarId); + + commuteVO = commuteMapper.findByUsridAndSrvdtBetween(searchVO); + + // 휴가 유형 확인 + Optional holidayOpt = holidayList.stream() + .filter(h -> h.getUserId().equals(userVO.getGwId())) + .findFirst(); + + String holidayType = holidayOpt.map(h -> HolidayAnalyzer.determineHolidayType(h)).orElse(""); + + + itnCommuteVO.setUniqId(userVO.getUniqId()); + itnCommuteVO.setWorkDt(workDt); + itnCommuteVO.setHoliCode(holidayType); + + if(commuteVO == null){ + itnCommuteList.add(itnCommuteVO); + continue; + } + + + // 지각 체크; + itnCommuteVO.setStartTime(commuteVO.getFirstActivityTime().split(" ")[1]); + itnCommuteVO.setStartRslt(this.getLateChk(commuteVO.getFirstActivityTime())); + // 조기퇴근 체크 + itnCommuteVO.setEndTime(commuteVO.getLastActivityTime().split(" ")[1]); + itnCommuteVO.setEndRslt(this.getLeaveWorkEarly(commuteVO.getLastActivityTime())); + itnCommuteList.add(itnCommuteVO); + } + log.info("itnCommuteList.size() :: [{}]", itnCommuteList.size()); + itnCommuteMapper.upsertCommuteList(itnCommuteList); + +/* - Map returnMap = new HashMap(); - returnMap.put("itnCommuteList", itnCommuteList); - returnMap.put("codeList", codeList); - return returnMap; - } - - - @Override - public Map transfer(CommuteVO commuteVO) { List commuteList = makeList(commuteVO); String startDate = commuteVO.getStartDate(); - System.out.println("startDate :: "+startDate); String workDt = startDate.split(" ")[0]; workDt = DateUtils.getFormatToStandardDate(workDt); @@ -109,10 +178,11 @@ public class CommuteServiceImpl implements CommuteService { for(CommuteVO vo : commuteList) { ItnCommuteVO itnCommuteVO = new ItnCommuteVO(); itnCommuteVO.setCommuteGroupId(groupId); + itnCommuteVO.setUniqId(vo.getUniqId()); itnCommuteVO.setWorkDt(workDt); - itnCommuteVO.setName(vo.getUsrid()); - itnCommuteVO.setPstn(vo.getPstn()); + itnCommuteVO.setUserName(vo.getUsrid()); + itnCommuteVO.setUserRank(vo.getPstn()); itnCommuteVO.setStartTime(vo.getFirstActivityTime()); itnCommuteVO.setStartRslt(vo.getFirstActivityTimeMemo()); @@ -125,11 +195,12 @@ public class CommuteServiceImpl implements CommuteService { itnCommuteMapper.upsertCommuteList(itnCommuteList); +*/ // controller에 return Map map = new HashMap(); - map.put("resultList", commuteList); +// map.put("resultList", commuteList); map.put("commuteVO", commuteVO); return map; } @@ -139,38 +210,25 @@ public class CommuteServiceImpl implements CommuteService { public List makeList(CommuteVO commuteVO){ - if(StringUtils.isNotEmpty(commuteVO.getSearchYear())){ + if(StringUtils.isEmpty(commuteVO.getSearchYear())){ - }else{ Map map = DateUtils.getPreviousBusinessDay(); - - commuteVO.setSearchYear(map.get("year")); commuteVO.setSearchMonth(map.get("month")); commuteVO.setSearchDay(map.get("day")); } + CommuteVO searchVO = getSearchVO(commuteVO); + List commuteList = commuteMapper.findAll(searchVO); - commuteVO.setStartDate(commuteVO.getSearchYear()+"-"+commuteVO.getSearchMonth()+"-"+commuteVO.getSearchDay()+" 06:00:00"); - commuteVO.setEndDate(commuteVO.getSearchYear()+"-"+commuteVO.getSearchMonth()+"-"+commuteVO.getSearchDay()+" 23:59:59"); - - // 테이블명 생성 - String tableNmM = commuteVO.getSearchMonth().length() <2 - ? "0"+commuteVO.getSearchMonth() - : commuteVO.getSearchMonth(); - - commuteVO.setTableNm("t_lg"+commuteVO.getSearchYear()+tableNmM); - - List commuteList = new ArrayList<>(); - try { -// commuteList = commuteMapper.findAll(commuteVO); - commuteList = new ArrayList<>(commuteMapper.findAll(commuteVO)); - }catch (Exception e){ - // 월별로 테이블이 생성되는데 - // 없는 테이블을 select하면 Exception이 발생함 - // 해당 exception 방지용 try-catch - } + List holidayList = holidayMapper.selectHolidaysByDateRange(DateUtils.getYesterdayDate(commuteVO)); + log.info("holidayList.size() :: [{}] : "+holidayList.size()); + holidayList.forEach(holidayVO -> { + log.info("holidayVO : [{}]",holidayVO); + }); + List userAllVO = userMapper.findByBiostarIdIsNotNull(); + userAllVO.forEach(userVO -> log.info("userVO : [{}][{}]", userVO.getBiostarId(), userVO) ); commuteList.stream().forEach(t->{ @@ -183,21 +241,25 @@ public class CommuteServiceImpl implements CommuteService { if(StringUtils.isNotEmpty(t.getUsrid())){ - try { - UserEnum userEnum = UserEnum.valueOfLabel(t.getUsrid()); - t.setUsrid(userEnum.userName()); - t.setPstn(userEnum.pstn()); - }catch (Exception e){ - t.setUsrid("힣등록해야함"); - } - } - }); + UserVO matchedUser = userAllVO.stream() + .filter(user -> user.getBiostarId().equals(t.getUsrid())) + .findFirst() + .orElse(null); + log.info("==============================================="); + log.info("matchedUser : [{}] : [{}]", matchedUser, t.getUsrid()); - commuteList.forEach(t-> { + if( matchedUser != null ){ + t.setUsrid(matchedUser.getUsername()); + t.setPstn(matchedUser.getUserRank()); + t.setUniqId(matchedUser.getUniqId()); + } + + } t.setFirstActivityTime(t.getFirstActivityTime().split(" ")[1]); t.setLastActivityTime(t.getLastActivityTime().split(" ")[1]); }); + // 출근안한사람 체크하기 for (UserEnum user : UserEnum.values()) { // commuteList에서 해당 userName을 가진 CommuteVO 객체가 있는지 검사 @@ -220,6 +282,8 @@ public class CommuteServiceImpl implements CommuteService { } } + + commuteList.forEach(commute -> System.out.println(commute.toString())); commuteList.removeIf(t -> "유인식".equals(t.getUsrid()) @@ -229,6 +293,24 @@ public class CommuteServiceImpl implements CommuteService { return commuteList; } + + + + private static CommuteVO getSearchVO(CommuteVO commuteVO) { + commuteVO.setStartDate(commuteVO.getSearchYear()+"-"+ commuteVO.getSearchMonth()+"-"+ commuteVO.getSearchDay()+" 06:00:00"); + commuteVO.setEndDate(commuteVO.getSearchYear()+"-"+ commuteVO.getSearchMonth()+"-"+ commuteVO.getSearchDay()+" 23:59:59"); + + // 테이블명 생성 + // biostar(관리자콘솔)은 테이블명이 "t_lg년월"로 이루어져 있음. + String tableNmM = commuteVO.getSearchMonth().length() <2 + ? "0"+ commuteVO.getSearchMonth() + : commuteVO.getSearchMonth(); + + commuteVO.setTableNm("t_lg"+ commuteVO.getSearchYear()+tableNmM); + + return commuteVO; + } + public static String getRandomTime(String start, String end) { // 문자열을 LocalTime으로 변환 LocalTime startTime = LocalTime.parse(start, DateTimeFormatter.ofPattern("HH:mm:ss")); @@ -248,39 +330,43 @@ public class CommuteServiceImpl implements CommuteService { return randomTime.format(DateTimeFormatter.ofPattern("HH:mm:ss")); } - private String getLeaveWorkEarly(String p_lastActivityTime) { - // DateTimeFormatter를 사용하여 String을 LocalDateTime으로 파싱 + // 입력된 시간 문자열을 LocalTime 객체로 변환하는 함수 + private static LocalTime parseActivityTime(String activityTimeString) { + // "yyyy-MM-dd HH:mm:ss" 패턴의 포매터 생성 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - LocalDateTime firstActivityTime = LocalDateTime.parse(p_lastActivityTime, formatter); + // 문자열을 LocalDateTime으로 파싱 + LocalDateTime dateTime = LocalDateTime.parse(activityTimeString, formatter); + // LocalDateTime에서 시간 부분만 추출하여 반환 + return dateTime.toLocalTime(); + } - // 체크하고자 하는 시간 설정 (09:30) + // 조기 퇴근 여부를 확인하는 함수 + private String getLeaveWorkEarly(String p_lastActivityTime) { + // 마지막 활동 시간을 LocalTime으로 변환 + LocalTime activityTime = parseActivityTime(p_lastActivityTime); + // 기준 시간(18:30) 설정 LocalTime checkTime = LocalTime.of(18, 30); - // firstActivityTime의 시간 부분만 추출 - LocalTime activityTime = firstActivityTime.toLocalTime(); - - // activityTime이 checkTime보다 이후인지 확인 + // 활동 시간이 기준 시간보다 이전이면 조기 퇴근 if (activityTime.isBefore(checkTime)) { - return "조기퇴근"; + return "70"; //""조기퇴근"; } + // 그렇지 않으면 빈 문자열 반환 return ""; } + // 지각 여부를 확인하는 함수 private static String getLateChk(String p_firstActivityTime) { - // DateTimeFormatter를 사용하여 String을 LocalDateTime으로 파싱 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - LocalDateTime firstActivityTime = LocalDateTime.parse(p_firstActivityTime, formatter); - - // 체크하고자 하는 시간 설정 (09:30) + // 첫 활동 시간을 LocalTime으로 변환 + LocalTime activityTime = parseActivityTime(p_firstActivityTime); + // 기준 시간(09:30) 설정 LocalTime checkTime = LocalTime.of(9, 30); - // firstActivityTime의 시간 부분만 추출 - LocalTime activityTime = firstActivityTime.toLocalTime(); - - // activityTime이 checkTime보다 이후인지 확인 + // 활동 시간이 기준 시간보다 이후면 지각 if (activityTime.isAfter(checkTime)) { - return "지각"; + return "60"; // 지각 시 60 반환 (공통코드 COMMUTE) } + // 그렇지 않으면 빈 문자열 반환 return ""; } diff --git a/src/main/java/com/itn/admin/commute/web/CommuteController.java b/src/main/java/com/itn/admin/commute/web/CommuteController.java index b4a5111..7693deb 100644 --- a/src/main/java/com/itn/admin/commute/web/CommuteController.java +++ b/src/main/java/com/itn/admin/commute/web/CommuteController.java @@ -23,7 +23,7 @@ public class CommuteController { this.commuteService = commuteService; } - @GetMapping(value = "/commute/list") + @GetMapping(value = "/commute/list_temp") public String list(@ModelAttribute("commuteVO") CommuteVO commuteVO, Model model) { @@ -32,21 +32,7 @@ public class CommuteController { model.addAttribute("list", resultMap.get("resultList")); model.addAttribute("commuteVO", resultMap.get("commuteVO")); - return "commute/list_backup"; + return "commute/list_temp"; } - @GetMapping(value = "/commute/list_test") - public String list_test(@ModelAttribute ItnCommuteVO itnCommuteVO, Model model) { - // commuteVO.getWorkDt()를 사용하여 workDt 값에 접근할 수 있습니다. - - - - - Map resultMap = commuteService.getCommuteList(itnCommuteVO); -// - model.addAttribute("list", resultMap.get("itnCommuteList")); - model.addAttribute("codeList", resultMap.get("codeList")); - - return "commute/list"; - } } diff --git a/src/main/java/com/itn/admin/commute/web/CommuteRestController.java b/src/main/java/com/itn/admin/commute/web/CommuteRestController.java index 1620b88..76cb2e9 100644 --- a/src/main/java/com/itn/admin/commute/web/CommuteRestController.java +++ b/src/main/java/com/itn/admin/commute/web/CommuteRestController.java @@ -3,6 +3,7 @@ package com.itn.admin.commute.web; import com.itn.admin.cmn.msg.RestResponse; import com.itn.admin.commute.mapper.domain.CommuteVO; import com.itn.admin.commute.service.CommuteService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -13,9 +14,12 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDate; +import java.time.YearMonth; import java.time.format.DateTimeFormatter; +import java.util.HashMap; import java.util.Map; +@Slf4j @RestController public class CommuteRestController { @@ -28,35 +32,142 @@ public class CommuteRestController { @GetMapping(value = "/api/commute/transfer") public ResponseEntity list(@ModelAttribute("commuteVO") CommuteVO commuteVO, Model model) { - // 시작 날짜 (2024년 8월 1일) -// LocalDate startDate = LocalDate.of(2024, 8, 1); - // 오늘 날짜 -// LocalDate endDate = LocalDate.now(); - - // 날짜 형식 -// DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy"); -// DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MM"); -// DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("dd"); - - // 날짜 반복 (하루씩 증가) -// for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) { -// // 현재 날짜를 파라미터 형식에 맞게 변환 -// String year = date.format(yearFormatter); -// String month = date.format(monthFormatter); -// String day = date.format(dayFormatter); - -// commuteVO.setSearchYear(year); -// commuteVO.setSearchMonth(month); -// commuteVO.setSearchDay(day); - - // 서비스 메서드 호출 - Map resultMap = commuteService.transfer(commuteVO); - - // 결과 출력 (디버깅용) -// System.out.println("Date: " + date + ", Result: " + resultMap); -// } - -// return ResponseEntity.ok().body(new RestResponse(HttpStatus.OK,"성공적으로 조회했습니다.","")); + // 서비스 메서드 호출 + Map resultMap = commuteService.transfer(commuteVO); return ResponseEntity.ok().body(new RestResponse(HttpStatus.OK,"성공적으로 조회했습니다.",resultMap)); +/* + */ } + + + @GetMapping(value = "/api/commute/transferMonth") + public ResponseEntity transferMonth(@ModelAttribute("commuteVO") CommuteVO commuteVO, Model model) { + // 서비스 메서드 호출 + + // 연도와 월 추출 + String year = commuteVO.getSearchYear(); + String month = commuteVO.getSearchMonth(); + + // 입력 데이터 로그 출력 + log.info(":: commuteVO.getSearchYear() :: [{}]", year); + log.info(":: commuteVO.getSearchMonth() :: [{}]", month); + log.info(":: commuteVO.getSearchDay() :: [{}]", commuteVO.getSearchDay()); + + // 결과 Map 초기화 + Map> resultMap = new HashMap<>(); + + try { + // YearMonth 객체 생성 (해당 월의 정보를 관리) + YearMonth yearMonth = YearMonth.of(Integer.parseInt(year), Integer.parseInt(month)); + int daysInMonth = yearMonth.lengthOfMonth(); // 해당 월의 총 일수 (예: 3월 → 31일) + + // 날짜 포맷터 (키로 사용할 날짜 형식: "yyyy-MM-dd") + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // 1일부터 마지막 날까지 순회 + for (int day = 1; day <= daysInMonth; day++) { + // 날짜 설정 + LocalDate date = yearMonth.atDay(day); + String formattedDate = date.format(formatter); // 예: "2025-03-01" + + // commuteVO에 날짜 설정 + commuteVO.setSearchYear(String.valueOf(date.getYear())); + commuteVO.setSearchMonth(String.format("%02d", date.getMonthValue())); // 2자리 형식 (예: "03") + commuteVO.setSearchDay(String.format("%02d", date.getDayOfMonth())); // 2자리 형식 (예: "01") + + // commuteService.transfer 호출 + try { + Map dailyResult = commuteService.transfer(commuteVO); + resultMap.put(formattedDate, dailyResult); + log.info(":: Processed date :: [{}] - Result: [{}]", formattedDate, dailyResult); + } catch (Exception e) { + log.error(":: Error processing date :: [{}] - Error: [{}]", formattedDate, e.getMessage()); + resultMap.put(formattedDate, Map.of("error", e.getMessage())); + } + } + + // 성공 응답 반환 + return ResponseEntity.ok() + .body(new RestResponse(HttpStatus.OK, "성공적으로 조회했습니다.", resultMap)); + + } catch (NumberFormatException e) { + log.error("Invalid year or month: year=[{}], month=[{}]", year, month); + return ResponseEntity.badRequest() + .body(new RestResponse(HttpStatus.BAD_REQUEST, "연도 또는 월 형식이 잘못되었습니다.", null)); + } catch (Exception e) { + log.error("Error processing commute transfer: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new RestResponse(HttpStatus.INTERNAL_SERVER_ERROR, "조회 중 오류가 발생했습니다.", null)); + } + } + + + + @GetMapping(value = "/api/commute/transferYear") + public ResponseEntity transferYear(@ModelAttribute("commuteVO") CommuteVO commuteVO, Model model) { + // 서비스 메서드 호출 + String year = commuteVO.getSearchYear(); + + // 입력 데이터 로그 출력 + log.info(":: commuteVO.getSearchYear() :: [{}]", year); + log.info(":: commuteVO.getSearchMonth() :: [{}]", commuteVO.getSearchMonth()); + log.info(":: commuteVO.getSearchDay() :: [{}]", commuteVO.getSearchDay()); + + // 결과 Map 초기화 + Map> resultMap = new HashMap<>(); + + try { + // 1월부터 12월까지 순회 + Map map = new HashMap<>(); + for (int month = 1; month <= 12; month++) { + // YearMonth 객체 생성 (해당 월의 정보를 관리) + YearMonth yearMonth = YearMonth.of(Integer.parseInt(year), month); + int daysInMonth = yearMonth.lengthOfMonth(); // 해당 월의 총 일수 (예: 3월 → 31일) + + // 날짜 포맷터 (키로 사용할 날짜 형식: "yyyy-MM-dd") + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // 1일부터 마지막 날까지 순회 + for (int day = 1; day <= daysInMonth; day++) { + // 날짜 설정 + LocalDate date = yearMonth.atDay(day); + String formattedDate = date.format(formatter); // 예: "2025-03-01" + + // commuteVO에 날짜 설정 + commuteVO.setSearchYear(String.valueOf(date.getYear())); + commuteVO.setSearchMonth(String.format("%02d", date.getMonthValue())); // 2자리 형식 (예: "03") + commuteVO.setSearchDay(String.format("%02d", date.getDayOfMonth())); // 2자리 형식 (예: "01") + + // commuteService.transfer 호출 + try { + Map dailyResult = commuteService.transfer(commuteVO); + resultMap.put(formattedDate, dailyResult); + log.info(":: Processed date :: [{}] - Result: [{}]", formattedDate, dailyResult); + } catch (Exception e) { + log.error(":: Error processing date :: [{}] - Error: [{}]", formattedDate, e.getMessage()); + resultMap.put(formattedDate, Map.of("error", e.getMessage())); + } + } + + // 월별 데이터 추가 (기존 day 대신 month 사용) + map.put("month" + month, month); + } + + log.info("map :: [{}]", map.toString()); + // 성공 응답 반환 + return ResponseEntity.ok() + .body(new RestResponse(HttpStatus.OK, "성공적으로 조회했습니다.", resultMap)); + + } catch (NumberFormatException e) { + log.error("Invalid year: year=[{}]", year); + return ResponseEntity.badRequest() + .body(new RestResponse(HttpStatus.BAD_REQUEST, "연도 형식이 잘못되었습니다.", null)); + } catch (Exception e) { + log.error("Error processing commute transfer: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new RestResponse(HttpStatus.INTERNAL_SERVER_ERROR, "조회 중 오류가 발생했습니다.", null)); + } + } + + } diff --git a/src/main/java/com/itn/admin/gw/holiday/mapper/HolidayMapper.java b/src/main/java/com/itn/admin/gw/holiday/mapper/HolidayMapper.java new file mode 100644 index 0000000..8e5e836 --- /dev/null +++ b/src/main/java/com/itn/admin/gw/holiday/mapper/HolidayMapper.java @@ -0,0 +1,24 @@ +package com.itn.admin.gw.holiday.mapper; + +import com.itn.admin.commute.mapper.domain.CommuteVO; +import com.itn.admin.gw.holiday.mapper.domain.HolidayVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * packageName : com.itn.admin.gw.holiday.mapper + * fileName : HolidayMapper + * author : hylee + * date : 2025-03-28 + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-03-28 hylee 최초 생성 + */ +@Mapper +public interface HolidayMapper { + + List selectHolidaysByDateRange(String targetDate); +} diff --git a/src/main/java/com/itn/admin/gw/holiday/mapper/domain/HolidayVO.java b/src/main/java/com/itn/admin/gw/holiday/mapper/domain/HolidayVO.java new file mode 100644 index 0000000..25eb79c --- /dev/null +++ b/src/main/java/com/itn/admin/gw/holiday/mapper/domain/HolidayVO.java @@ -0,0 +1,112 @@ +package com.itn.admin.gw.holiday.mapper.domain; + +import lombok.*; + +import java.io.Serializable; +import java.time.LocalDate; + +/** + * packageName : com.itn.admin.itn.commute.mapper.domain + * fileName : MjonMsgVO + * author : hylee + * date : 2025-02-13 + * description : 출퇴근 log + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-05-09 hylee 최초 생성 + */ +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Getter +@Setter +@ToString +public class HolidayVO implements Serializable { + + private static final long serialVersionUID = 1L; + // 휴가 키 (Primary Key, Not Null) + private String holiSeq; + + // 사원 코드 + private String empCode; + + // 사용자 ID + private String userId; + + // 이름 + private String name; + + // 기안 사원 코드 + private String gianEmpCode; + + // 기안자 이름 + private String gianName; + + // 직급 ID + private String posId; + + // 직급 이름 + private String posName; + + // 부서 ID + private String deptId; + + // 부서 이름 + private String deptName; + + // 승인 상태 + private String apprStat; + + // 승인 날짜 + private LocalDate apprDate; + + // 시작 날짜 (yyyy-MM-dd 형식) + private String startDt; + + // 종료 날짜 (yyyy-MM-dd 형식) + private String endDt; + + // 시작 시간 + private Long startTm; + + // 종료 시간 + private Long endTm; + + // 휴가 코드 + private String holiCode; + + // 휴가 내용 + private String holiCont; + + // 목적지 + private String dest; + + // 연락처 + private String phone; + + // 구분 1 + private String divi1; + + // 구분 2 + private String divi2; + + // 구분 3 + private String divi3; + + // 선택 연도 + private String selYear; + + // 요청 횟수 + private Long reqCnt; + + // 기타 횟수 + private Long etcCnt; + + // 등록 날짜 + private LocalDate insDate; + + // 휴가 상세 내용 + private String holiDetail; + +} diff --git a/src/main/java/com/itn/admin/itn/code/server/CodeDetailService.java b/src/main/java/com/itn/admin/itn/code/server/CodeDetailService.java index 0992ce7..e71c5b6 100644 --- a/src/main/java/com/itn/admin/itn/code/server/CodeDetailService.java +++ b/src/main/java/com/itn/admin/itn/code/server/CodeDetailService.java @@ -22,4 +22,6 @@ public interface CodeDetailService { // 코드 상세 삭제 메서드 void deleteCodeDetail(String codeGroupId, String codeId); + + String getCodeName(String codeGroupId, String codeId); } diff --git a/src/main/java/com/itn/admin/itn/code/server/impl/CodeDetailServiceImpl.java b/src/main/java/com/itn/admin/itn/code/server/impl/CodeDetailServiceImpl.java index a426309..2a6cb87 100644 --- a/src/main/java/com/itn/admin/itn/code/server/impl/CodeDetailServiceImpl.java +++ b/src/main/java/com/itn/admin/itn/code/server/impl/CodeDetailServiceImpl.java @@ -30,6 +30,14 @@ public class CodeDetailServiceImpl implements CodeDetailService { return codeDetailMapper.findById(codeGroupId, codeId); } + @Override + public String getCodeName(String codeGroupId, String codeId) { + CodeDetailVO codeDetailVO = codeDetailMapper.findById(codeGroupId, codeId); + log.info("codeDetailVO: {}", codeDetailVO); + return codeDetailVO.getCodeName(); + } + + @Override public RestResponse addCodeDetail(CodeDetailVO codeDetail) { @@ -72,4 +80,5 @@ public class CodeDetailServiceImpl implements CodeDetailService { public void deleteCodeDetail(String codeGroupId, String codeId){ codeDetailMapper.delete(codeGroupId, codeId); } + } diff --git a/src/main/java/com/itn/admin/itn/commute/service/ItnCommuteService.java b/src/main/java/com/itn/admin/itn/commute/service/ItnCommuteService.java index 3e08a27..e6b416c 100644 --- a/src/main/java/com/itn/admin/itn/commute/service/ItnCommuteService.java +++ b/src/main/java/com/itn/admin/itn/commute/service/ItnCommuteService.java @@ -1,5 +1,6 @@ package com.itn.admin.itn.commute.service; +import com.itn.admin.commute.mapper.domain.ItnCommuteVO; import com.itn.admin.itn.commute.mapper.domain.ItnCommuteBackVO; import java.util.Map; @@ -9,4 +10,6 @@ public interface ItnCommuteService { Map getList(ItnCommuteBackVO itnCommuteBackVO); + + Map getCommuteList(ItnCommuteVO itnCommuteVO); } diff --git a/src/main/java/com/itn/admin/itn/commute/service/impl/ItnCommuteServiceImpl.java b/src/main/java/com/itn/admin/itn/commute/service/impl/ItnCommuteServiceImpl.java index 0b660a0..f81859d 100644 --- a/src/main/java/com/itn/admin/itn/commute/service/impl/ItnCommuteServiceImpl.java +++ b/src/main/java/com/itn/admin/itn/commute/service/impl/ItnCommuteServiceImpl.java @@ -1,12 +1,18 @@ package com.itn.admin.itn.commute.service.impl; +import com.itn.admin.cmn.util.DateUtils; +import com.itn.admin.commute.mapper.domain.ItnCommuteVO; +import com.itn.admin.itn.code.mapper.domain.CodeDetailVO; +import com.itn.admin.itn.code.server.CodeDetailService; import com.itn.admin.itn.commute.mapper.ItnCommuteMapper; import com.itn.admin.itn.commute.mapper.domain.ItnCommuteBackVO; import com.itn.admin.itn.commute.service.ItnCommuteService; +import com.itn.admin.itn.user.mapper.UserMapper; +import com.itn.admin.itn.user.mapper.domain.UserVO; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.thymeleaf.util.StringUtils; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @@ -24,6 +30,12 @@ public class ItnCommuteServiceImpl implements ItnCommuteService { @Autowired ItnCommuteMapper itnCommuteMapper; + @Autowired + CodeDetailService codeDetailService; + + @Autowired + private UserMapper userMapper; + private static final int PAGE_SIZE = 5; public Map getList(ItnCommuteBackVO itnCommuteBackVO) { @@ -53,6 +65,30 @@ public class ItnCommuteServiceImpl implements ItnCommuteService { return map; } + @Override + public Map getCommuteList(ItnCommuteVO itnCommuteVO) { + // controller에 return + + if(StringUtils.isEmpty(itnCommuteVO.getWorkDt())){ + Map map = DateUtils.getPreviousBusinessDay(); + itnCommuteVO.setWorkDt(DateUtils.getFormatToStandardDate(map.get("year") +"-"+map.get("month")+"-"+map.get("day"))); + } + + log.info(":: rsnCode01List :: "); + List codeList = codeDetailService.getDetailsByGroupId("COMMUTE"); + + List itnCommuteList = itnCommuteMapper.findByWorkDtFromItnCommute(itnCommuteVO.getWorkDt()); + + + + + Map returnMap = new HashMap(); + returnMap.put("itnCommuteList", itnCommuteList); + returnMap.put("codeList", codeList); + return returnMap; + } + + private String addSeconds(String startTimeStr) { @@ -81,4 +117,6 @@ public class ItnCommuteServiceImpl implements ItnCommuteService { } + + } diff --git a/src/main/java/com/itn/admin/itn/commute/web/ItnCommuteController.java b/src/main/java/com/itn/admin/itn/commute/web/ItnCommuteController.java index 3c26f8c..18e93d6 100644 --- a/src/main/java/com/itn/admin/itn/commute/web/ItnCommuteController.java +++ b/src/main/java/com/itn/admin/itn/commute/web/ItnCommuteController.java @@ -1,11 +1,13 @@ package com.itn.admin.itn.commute.web; +import com.itn.admin.commute.mapper.domain.ItnCommuteVO; import com.itn.admin.itn.commute.mapper.domain.ItnCommuteBackVO; import com.itn.admin.itn.commute.service.ItnCommuteService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestParam; import java.util.Map; @@ -13,15 +15,25 @@ import java.util.Map; @Controller public class ItnCommuteController { - private ItnCommuteService commuteService; + private ItnCommuteService itnCommuteService; @Autowired public void setCommuteService(ItnCommuteService commuteService) { - this.commuteService = commuteService; + this.itnCommuteService = commuteService; } @GetMapping(value = "/itn/commute/list") - public String list( + public String list(@ModelAttribute ItnCommuteVO itnCommuteVO, Model model) { + + + Map resultMap = itnCommuteService.getCommuteList(itnCommuteVO); +// + model.addAttribute("list", resultMap.get("itnCommuteList")); + model.addAttribute("codeList", resultMap.get("codeList")); + return "itn/commute/list"; + } + @GetMapping(value = "/itn/commute/list_temp") + public String list_temp( @RequestParam(value = "startDate", required = false) String startDate, @RequestParam(value = "endDate", required = false) String endDate, Model model) { @@ -39,25 +51,15 @@ public class ItnCommuteController { .build(); - Map resultMap = commuteService.getList(itnCommuteBackVO); + Map resultMap = itnCommuteService.getList(itnCommuteBackVO); model.addAttribute("list", resultMap.get("resultList")); model.addAttribute("commuteVO", itnCommuteBackVO); model.addAttribute("startDate", startDate); model.addAttribute("endDate", endDate); - return "itn/commute/list"; + return "itn/commute/list_temp"; } -// @GetMapping(value = "/itn/commute/list") -// public String list(@ModelAttribute("commuteVO") ItnCommuteVO itnCommuteVO, Model model) { -// -// -// Map resultMap = commuteService.getList(itnCommuteVO); -// -// model.addAttribute("list", resultMap.get("resultList")); -// model.addAttribute("commuteVO", itnCommuteVO); -// -// return "itn/commute/list"; -// } + } diff --git a/src/main/java/com/itn/admin/itn/user/mapper/UserMapper.java b/src/main/java/com/itn/admin/itn/user/mapper/UserMapper.java index 8e1188b..d12da35 100644 --- a/src/main/java/com/itn/admin/itn/user/mapper/UserMapper.java +++ b/src/main/java/com/itn/admin/itn/user/mapper/UserMapper.java @@ -21,17 +21,8 @@ public interface UserMapper { void save(UserVO userVO); - default void saveUser(UserVO userVO) { - // 역할을 문자열로 변환 -// String rolesStr = getRolesStr(userVO.getRoles()); -// userVO.setRolesStr(rolesStr); - - // 사용자 저장 - save(userVO); - } - - - List findAll(UserVO userVO); + List findAll(); + List findByBiostarIdIsNotNull(); void updateRole(UserVO user); diff --git a/src/main/java/com/itn/admin/itn/user/mapper/domain/UserVO.java b/src/main/java/com/itn/admin/itn/user/mapper/domain/UserVO.java index 63308a1..13feb13 100644 --- a/src/main/java/com/itn/admin/itn/user/mapper/domain/UserVO.java +++ b/src/main/java/com/itn/admin/itn/user/mapper/domain/UserVO.java @@ -3,6 +3,7 @@ package com.itn.admin.itn.user.mapper.domain; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; @@ -13,11 +14,15 @@ import java.util.Collections; @Getter @Setter @NoArgsConstructor +@ToString public class UserVO implements UserDetails { private String uniqId; private String userId; private String password; - private String username; + private String userName; + private String userRank; + private String gwId; + private String biostarId; private Role role; // 단일 역할로 변경 private String lastUpdtPnttm; @@ -34,7 +39,7 @@ public class UserVO implements UserDetails { @Override public String getUsername() { - return username; + return userName; } @Override @@ -56,4 +61,6 @@ public class UserVO implements UserDetails { public boolean isEnabled() { return true; } + + } diff --git a/src/main/java/com/itn/admin/itn/user/service/impl/UserServiceImpl.java b/src/main/java/com/itn/admin/itn/user/service/impl/UserServiceImpl.java index 3dc8ca9..dc26599 100644 --- a/src/main/java/com/itn/admin/itn/user/service/impl/UserServiceImpl.java +++ b/src/main/java/com/itn/admin/itn/user/service/impl/UserServiceImpl.java @@ -38,7 +38,7 @@ public class UserServiceImpl implements UserService { public Map getList(UserVO userVO) { - List userList = userMapper.findAll(userVO); + List userList = userMapper.findAll(); // controller에 return Map map = new HashMap(); diff --git a/src/main/java/com/itn/admin/itn/user/web/LoginController.java b/src/main/java/com/itn/admin/itn/user/web/LoginController.java index 8d1119c..e443e89 100644 --- a/src/main/java/com/itn/admin/itn/user/web/LoginController.java +++ b/src/main/java/com/itn/admin/itn/user/web/LoginController.java @@ -56,7 +56,7 @@ public class LoginController { UserVO user = new UserVO(); user.setUniqId("ITN_"+UUID.randomUUID().toString().replace("-", "").substring(0, 10)); user.setUserId(userDTO.getUserId()); - user.setUsername(userDTO.getUserName()); + user.setUserName(userDTO.getUserName()); user.setPassword(passwordEncoder.encode(userDTO.getPassword())); user.setRole(Role.ROLE_GUEST); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ddbfdbe..7a80943 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,6 +12,11 @@ mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl server.servlet.session.timeout=120m #sql \ucd9c\ub825 log \uc124\uc815 +logging.level.root=INFO +# log4jdbc ??? ???? +logging.level.net.sf.log4jdbc=OFF +# MyBatis SQL ?? ??? +logging.level.org.mybatis=info logging.level.jdbc.sqlonly=info logging.level.jdbc.sqltiming=info logging.level.jdbc.audit=info @@ -25,65 +30,31 @@ spring.thymeleaf.cache=false # itn_admin +#spring.main.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.main.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy spring.main.datasource.jdbc-url=jdbc:log4jdbc:mysql://119.193.215.98:3306/itn_admin?serverTimezone=Asia/Seoul spring.main.datasource.username=itnAdmin spring.main.datasource.password=itntest123 -# +# ??? ?? ?? DB spring.commute.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy #spring.commute.datasource.jdbc-url=jdbc:log4jdbc:mysql://192.168.0.200:3312/biostar2_ac?serverTimezone=Asia/Seoul spring.commute.datasource.jdbc-url=jdbc:log4jdbc:mysql://192.168.0.31:3312/biostar2_ac?serverTimezone=Asia/Seoul spring.commute.datasource.username=root spring.commute.datasource.password=itntest123 -# agent client 1 -spring.mjagent.client.one.userid=daltex -spring.mjagent.client.one.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy -spring.mjagent.client.one.datasource.jdbc-url=jdbc:log4jdbc:mysql://192.168.0.125:3306/mjon_agent?serverTimezone=Asia/Seoul -spring.mjagent.client.one.datasource.username=mjonUr_agent -spring.mjagent.client.one.datasource.password=mjagent123$ - -# agent client 2 -spring.mjagent.client.two.userid=006star -spring.mjagent.client.two.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy -spring.mjagent.client.two.datasource.jdbc-url=jdbc:log4jdbc:mysql://192.168.0.60:3303/mjon_agent?serverTimezone=Asia/Seoul -spring.mjagent.client.two.datasource.username=mjonUr_agent -spring.mjagent.client.two.datasource.password=mjagent123$ - - -# agent client 3 -spring.mjagent.client.three.userid=hylee250 -spring.mjagent.client.three.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy -spring.mjagent.client.three.datasource.jdbc-url=jdbc:log4jdbc:mysql://192.168.0.31:3307/mjonUr_agent?serverTimezone=Asia/Seoul -spring.mjagent.client.three.datasource.username=mjonAgentUr -spring.mjagent.client.three.datasource.password=mjonAgentUr!@#$ - -# agent client 4 -spring.mjagent.client.four.userid=dlwnsgh -spring.mjagent.client.four.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy -spring.mjagent.client.four.datasource.jdbc-url=jdbc:log4jdbc:mysql://192.168.0.31:3308/mjonUr_agent?serverTimezone=Asia/Seoul -spring.mjagent.client.four.datasource.username=mjonAgentUr -spring.mjagent.client.four.datasource.password=mjonAgentUr!@#$ - -# agent client 5 -spring.mjagent.client.five.userid=dlwldn -spring.mjagent.client.five.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy -spring.mjagent.client.five.datasource.jdbc-url=jdbc:log4jdbc:mysql://192.168.0.31:3309/mjonUr_agent?serverTimezone=Asia/Seoul -spring.mjagent.client.five.datasource.username=mjonAgentUr -spring.mjagent.client.five.datasource.password=mjonAgentUr!@#$ - -# agent server -spring.mjagent.server.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy -spring.mjagent.server.datasource.jdbc-url=jdbc:log4jdbc:mysql://192.168.0.60:3303/mjon_agent_server?serverTimezone=Asia/Seoul -spring.mjagent.server.datasource.username=mjonUr_agent -spring.mjagent.server.datasource.password=mjagent123$ -spring.mjagent.server.datasource.hikari.minimum-idle=2 -spring.mjagent.server.datasource.hikari.maximum-pool-size=4 +# GW DB?? +spring.gw.datasource.driverClassName=oracle.jdbc.OracleDriver +#spring.gw.datasource.url=jdbc:oracle:thin:@192.168.0.98:1521:gw +spring.gw.datasource.jdbc-url=jdbc:oracle:thin:@192.168.0.98:1521:gw +spring.gw.datasource.username=itn +spring.gw.datasource.password=itntest123 logging.config=classpath:logback-spring.xml -log.config.path=/data/tomcat/tomcat_api_9100_2023_0711/logs -log.config.filename=mjonApi_log -logging.level.root=INFO \ No newline at end of file +logging.config.path=/data/tomcat/tomcat_api_9100_2023_0711/logs +logging.config.filename=mjonApi_log +#logging.level.root=DEBUG + +logging.level.net.sf.log4jdbc.sql.jdbcapi=DEBUG diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index a021741..58c5d7c 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -1,68 +1,31 @@ - - - - - - - - - - - - - + - + - - + ${LOG_DIR}/logback-%d{yyyy-MM-dd}.%i.log - - - 100MB - + 100MB 90 ${LOG_PATTERN} + ${LOG_PATTERN} - - info @@ -71,40 +34,27 @@ ${LOG_PATTERN} - - - + ${LOG_DIR}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log - - - 10MB - - + 10MB 60 - - + + + + - - --> + + + + + diff --git a/src/main/resources/mapper/agent/client/one/AgentCOneMapper.xml b/src/main/resources/mapper/agent/client/one/AgentCOneMapper.xml deleted file mode 100644 index c05bdeb..0000000 --- a/src/main/resources/mapper/agent/client/one/AgentCOneMapper.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - /* one findAll */ - SELECT - MSG_TYPE - , SEND_STATUS - , REQUEST_DATE - , RECV_PHONE - , SEND_PHONE - , MESSAGE - from MUNJAON_MSG - - - - - - /* two insertAgents */ - INSERT INTO MUNJAON_MSG - ( - MSG_TYPE - , SEND_STATUS - , REQUEST_DATE - , RECV_PHONE - , SEND_PHONE - , SUBJECT - , MESSAGE - , fileName01 - , fileName02 - , fileName03 - ) - VALUES - - ( - #{item.msgType} - , #{item.sendStatus} - , now() - , #{item.recvPhone} - , #{item.sendPhone} - , #{item.subject} - , #{item.message} - , #{item.fileName01} - , #{item.fileName02} - , #{item.fileName03} - ) - - - - - - /* one countBySendStatusNotAndMsgType */ - SELECT - count(*) as cnt - FROM - MUNJAON_MSG - WHERE SEND_STATUS != 1000 - - and MSG_TYPE = #{msgType} - - and MESSAGE LIKE CONCAT(#{message}, '%') - - - - - /* one countByLogMoveCntWhereMsgTypeAndMessage */ - SELECT - count(*) as cnt - FROM - MUNJAON_MSG_LOG - WHERE 1=1 --- and SEND_STATUS = 1000 - and MSG_TYPE = #{msgType} - and MESSAGE LIKE CONCAT(#{message}, '%') - - - - - /* one countByLogMoveCntWhereMsgType */ - SELECT - count(*) as cnt - FROM - MUNJAON_MSG_LOG - WHERE MESSAGE LIKE CONCAT(#{message}, '%') - - - - \ No newline at end of file diff --git a/src/main/resources/mapper/agent/client/two/AgentCTwoMapper.xml b/src/main/resources/mapper/agent/client/two/AgentCTwoMapper.xml deleted file mode 100644 index f5bd782..0000000 --- a/src/main/resources/mapper/agent/client/two/AgentCTwoMapper.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - /* two findAll */ - SELECT - MSG_TYPE - , SEND_STATUS - , REQUEST_DATE - , RECV_PHONE - , SEND_PHONE - , MESSAGE - from MUNJAON_MSG - - - - - - /* two insertAgents */ - INSERT INTO MUNJAON_MSG - ( - MSG_TYPE - , SEND_STATUS - , REQUEST_DATE - , RECV_PHONE - , SEND_PHONE - , SUBJECT - , MESSAGE - , fileName01 - , fileName02 - , fileName03 - ) - VALUES - - ( - #{item.msgType} - , #{item.sendStatus} - , now() - , #{item.recvPhone} - , #{item.sendPhone} - , #{item.subject} - , #{item.message} - , #{item.fileName01} - , #{item.fileName02} - , #{item.fileName03} - ) - - - - - - /* two countBySendStatusNotAndMsgType */ - SELECT - count(*) as cnt - FROM - MUNJAON_MSG - WHERE SEND_STATUS != 1000 - - and MSG_TYPE = #{msgType} - - and MESSAGE LIKE CONCAT(#{message}, '%') - - - - - /* two countByLogMoveCntWhereMsgTypeAndMessage */ - SELECT - count(*) as cnt - FROM - MUNJAON_MSG_LOG - WHERE 1=1 --- and SEND_STATUS = 1000 - and MSG_TYPE = #{msgType} - and MESSAGE LIKE CONCAT(#{message}, '%') - - - - - /* two findAllLogMoveCnt */ - SELECT - count(*) as cnt - FROM - MUNJAON_MSG_LOG - WHERE SEND_STATUS = 1000 - - \ No newline at end of file diff --git a/src/main/resources/mapper/agent/server/AgentSMapper.xml b/src/main/resources/mapper/agent/server/AgentSMapper.xml deleted file mode 100644 index 8506d70..0000000 --- a/src/main/resources/mapper/agent/server/AgentSMapper.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - SELECT SMS_TXT - FROM mj_msg_data - WHERE SMS_TXT LIKE CONCAT(#{message}, '%') - ORDER BY CAST(SUBSTRING(SMS_TXT, LENGTH(#{message}) + 2) AS UNSIGNED) DESC - LIMIT 1 - - - - - SELECT - count(*) - FROM - mj_msg_data - WHERE - CUR_STATE 3 - AND USER_ID = #{userId} - - - - UPDATE mj_msg_data SET - CUR_STATE = 3, - SENT_DATE = NOW(), - RSLT_DATE = NOW(), - RSLT_CODE = 1000, - RSLT_NET = 'SKT' - WHERE CUR_STATE 3 - AND USER_ID = #{userId} - - - - - UPDATE mj_msg_data SET - CUR_STATE = 3, - SENT_DATE = NOW(), - RSLT_DATE = NOW(), - RSLT_CODE = 1000, - RSLT_NET = 'SKT' - WHERE CUR_STATE 3 - AND USER_ID = #{userId} - AND SMS_TXT LIKE CONCAT(#{message}, '%'); - - - - \ No newline at end of file diff --git a/src/main/resources/mapper/commute/CommuteMapper.xml b/src/main/resources/mapper/commute/CommuteMapper.xml index 6f4fe3b..f5a3bf9 100644 --- a/src/main/resources/mapper/commute/CommuteMapper.xml +++ b/src/main/resources/mapper/commute/CommuteMapper.xml @@ -20,6 +20,22 @@ ORDER BY SRVDT; + + SELECT + usrid, + MIN(SRVDT) AS firstActivityTime, + MAX(SRVDT) AS lastActivityTime + FROM + ${tableNm} + WHERE SRVDT BETWEEN #{startDate} AND #{endDate} +-- AND usrid IS NOT NULL + AND LENGTH(USRID)>0 + and usrid = #{biostarId} + GROUP BY + usrid + ORDER BY SRVDT; + + \ No newline at end of file diff --git a/src/main/resources/mapper/gw/holiday/HolidayMapper.xml b/src/main/resources/mapper/gw/holiday/HolidayMapper.xml new file mode 100644 index 0000000..6c0e633 --- /dev/null +++ b/src/main/resources/mapper/gw/holiday/HolidayMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + SELECT + HOLI_SEQ, + EMP_CODE, + USER_ID, + NAME, + GIAN_EMP_CODE, + GIAN_NAME, + POS_ID, + POS_NAME, + DEPT_ID, + DEPT_NAME, + APPR_STAT, + APPR_DATE, + START_DT, + END_DT, + START_TM, + END_TM, + HOLI_CODE, + HOLI_CONT, + DEST, + PHONE, + DIVI_1, + DIVI_2, + DIVI_3, + SEL_YEAR, + REQ_CNT, + ETC_CNT, + INS_DATE, + HOLI_DETAIL + FROM INTRAWARE.HOLIDAY_MAIN + WHERE #{targetDate} BETWEEN START_DT AND END_DT + AND appr_stat = '2' -- 결제 완료 2 + ORDER BY INS_DATE DESC + + \ No newline at end of file diff --git a/src/main/resources/mapper/itn/commute/CommuteMapper.xml b/src/main/resources/mapper/itn/commute/CommuteMapper.xml index cc79ee5..e08079b 100644 --- a/src/main/resources/mapper/itn/commute/CommuteMapper.xml +++ b/src/main/resources/mapper/itn/commute/CommuteMapper.xml @@ -42,7 +42,7 @@ select ic.commute_id ,ic.commute_group_id - ,ic.name +-- ,ic.name ,ic.work_dt ,ic.start_time ,ic.start_rslt @@ -51,27 +51,36 @@ ,ic.transfer_dt ,ic.approver ,ic.approver_dt - ,ic.pstn + ,ic.holi_code +-- ,ic.pstn + ,us.user_name + ,us.user_rank from itn_commute ic left join itn_commute_group icg on ic.commute_group_id = icg.commute_group_id + left join users us + on ic.uniq_id = us.uniq_id where icg.work_dt =#{workDt} INSERT INTO itn_commute - (commute_group_id, name, pstn, work_dt, start_time, start_rslt, end_time, end_rslt) + (commute_group_id, uniq_id, work_dt, start_time, start_rslt, end_time, end_rslt, holi_code) VALUES - (#{item.commuteGroupId}, #{item.name}, #{item.pstn}, #{item.workDt}, - #{item.startTime}, #{item.startRslt}, #{item.endTime}, #{item.endRslt}) + (#{item.commuteGroupId}, #{item.uniqId}, #{item.workDt}, + #{item.startTime}, #{item.startRslt}, #{item.endTime}, #{item.endRslt}, #{item.holiCode}) ON DUPLICATE KEY UPDATE + uniq_id = VALUES(uniq_id), start_time = VALUES(start_time), start_rslt = VALUES(start_rslt), end_time = VALUES(end_time), - end_rslt = VALUES(end_rslt) + end_rslt = VALUES(end_rslt), + holi_code = VALUES(holi_code) + + \ No newline at end of file diff --git a/src/main/resources/mapper/itn/user/UserMapper.xml b/src/main/resources/mapper/itn/user/UserMapper.xml index 9d2175d..65ff59b 100644 --- a/src/main/resources/mapper/itn/user/UserMapper.xml +++ b/src/main/resources/mapper/itn/user/UserMapper.xml @@ -8,15 +8,42 @@ SELECT uniq_id - , user_id - , user_pw - , user_name - , LAST_UPDT_PNTTM - , role + , user_id + , user_pw as password + , user_name + , user_rank + , role + , gw_id + , biostar_id + , FRST_REGISTER_ID + , FRST_REGIST_PNTTM + , LAST_UPDUSR_ID + , LAST_UPDT_PNTTM FROM users + + SELECT + uniq_id + , user_id + , user_pw as password + , user_name + , user_rank + , role + , gw_id + , biostar_id + , FRST_REGISTER_ID + , FRST_REGIST_PNTTM + , LAST_UPDUSR_ID + , LAST_UPDT_PNTTM + FROM + users + where biostar_id is not null + and gw_id is not null + and active_yn = 'Y' + + UPDATE users SET role = #{role} WHERE uniq_id = #{uniqId} diff --git a/src/main/resources/mybatis-config.xml b/src/main/resources/mybatis-config.xml index 97660f7..7229104 100644 --- a/src/main/resources/mybatis-config.xml +++ b/src/main/resources/mybatis-config.xml @@ -24,6 +24,8 @@ + + diff --git a/src/main/resources/templates/commute/list.html b/src/main/resources/templates/commute/list.html deleted file mode 100644 index 4ba650d..0000000 --- a/src/main/resources/templates/commute/list.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - - - - 직원 출퇴근 관리 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 출퇴근 관리 - - - - Home - 출퇴근 관리 - - - - - - - - - - - - - - - - 출퇴근 관리 - - - - - - - - 검색 날짜 - - - - - - - - 검색 - - - - - - - 순번 - 이름 - 퇴근시간(전일) - 결과 - 출근(당일) - 결과 - - - - - - - - - - - - - - - - 파일 업로드 - - - - - - - 파일 업로드 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 수정 - - × - - - - - - - - 파일 유형 선택 - - - - - - - 선택해주세요. - - - Code - - - - - - - - 파일 선택 - - - - - - - - - - - diff --git a/src/main/resources/templates/commute/list_backup.html b/src/main/resources/templates/commute/list_temp.html similarity index 96% rename from src/main/resources/templates/commute/list_backup.html rename to src/main/resources/templates/commute/list_temp.html index adf8b44..c1c84e8 100644 --- a/src/main/resources/templates/commute/list_backup.html +++ b/src/main/resources/templates/commute/list_temp.html @@ -60,7 +60,7 @@ - + @@ -116,9 +116,11 @@ - + + + - + diff --git a/src/main/resources/templates/fragments/mainsidebar.html b/src/main/resources/templates/fragments/mainsidebar.html index c463d1c..1f0dd49 100644 --- a/src/main/resources/templates/fragments/mainsidebar.html +++ b/src/main/resources/templates/fragments/mainsidebar.html @@ -50,7 +50,7 @@ - + 출퇴근 관리 @@ -59,7 +59,7 @@ - + itn 출퇴근 관리 diff --git a/src/main/resources/templates/itn/commute/list.html b/src/main/resources/templates/itn/commute/list.html index 1fcb159..29e7aaa 100644 --- a/src/main/resources/templates/itn/commute/list.html +++ b/src/main/resources/templates/itn/commute/list.html @@ -5,6 +5,7 @@ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="layout"> + 직원 출퇴근 관리 @@ -13,20 +14,134 @@ - + + + - +
출퇴근 관리
itn 출퇴근 관리