diff --git a/src/main/java/kcc/com/utl/fcc/service/EgovDateUtil.java b/src/main/java/kcc/com/utl/fcc/service/EgovDateUtil.java index 8a3dcbb6..3aedc11a 100644 --- a/src/main/java/kcc/com/utl/fcc/service/EgovDateUtil.java +++ b/src/main/java/kcc/com/utl/fcc/service/EgovDateUtil.java @@ -1,865 +1,869 @@ -package kcc.com.utl.fcc.service; - -import java.security.SecureRandom; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; - -import com.ibm.icu.util.ChineseCalendar; - -/** - * - * Date 에 대한 Util 클래스 - * @author 공통서비스 개발팀 이중호 - * @since 2009.02.01 - * @version 1.0 - * @see - * - *
- * << 개정이력(Modification Information) >>
- *
- *   수정일      수정자           수정내용
- *  -------    --------    ---------------------------
- *   2009.02.01  이중호          최초 생성
- *
- * 
- */ -public class EgovDateUtil { - - /** - *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 년, 월, 일을 - * 증감한다. 년, 월, 일은 가감할 수를 의미하며, 음수를 입력할 경우 감한다.

- * - *
-	 * DateUtil.addYearMonthDay("19810828", 0, 0, 19)  = "19810916"
-	 * DateUtil.addYearMonthDay("20060228", 0, 0, -10) = "20060218"
-	 * DateUtil.addYearMonthDay("20060228", 0, 0, 10)  = "20060310"
-	 * DateUtil.addYearMonthDay("20060228", 0, 0, 32)  = "20060401"
-	 * DateUtil.addYearMonthDay("20050331", 0, -1, 0)  = "20050228"
-	 * DateUtil.addYearMonthDay("20050301", 0, 2, 30)  = "20050531"
-	 * DateUtil.addYearMonthDay("20050301", 1, 2, 30)  = "20060531"
-	 * DateUtil.addYearMonthDay("20040301", 2, 0, 0)   = "20060301"
-	 * DateUtil.addYearMonthDay("20040229", 2, 0, 0)   = "20060228"
-	 * DateUtil.addYearMonthDay("20040229", 2, 0, 1)   = "20060301"
-	 * 
- * - * @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) - * @param year 가감할 년. 0이 입력될 경우 가감이 없다 - * @param month 가감할 월. 0이 입력될 경우 가감이 없다 - * @param day 가감할 일. 0이 입력될 경우 가감이 없다 - * @return yyyyMMdd 형식의 날짜 문자열 - * @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우. - * 입력 값이 null인 경우. - */ - public static String addYearMonthDay(String sDate, int year, int month, int day) { - - String dateStr = validChkDate(sDate); - - Calendar cal = Calendar.getInstance(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); - try { - cal.setTime(sdf.parse(dateStr)); - } catch (ParseException e) { - throw new IllegalArgumentException("Invalid date format: " + dateStr); - } - - if (year != 0) { - cal.add(Calendar.YEAR, year); - } - if (month != 0) { - cal.add(Calendar.MONTH, month); - } - if (day != 0) { - cal.add(Calendar.DATE, day); - } - - return sdf.format(cal.getTime()); - } - - /** - *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 년을 - * 증감한다. year는 가감할 수를 의미하며, 음수를 입력할 경우 감한다.

- * - *
-	 * DateUtil.addYear("20000201", 62)  = "20620201"
-	 * DateUtil.addYear("20620201", -62) = "20000201"
-	 * DateUtil.addYear("20040229", 2)   = "20060228"
-	 * DateUtil.addYear("20060228", -2)  = "20040228"
-	 * DateUtil.addYear("19000101", 200) = "21000101"
-	 * 
- * - * @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) - * @param year 가감할 년. 0이 입력될 경우 가감이 없다 - * @return yyyyMMdd 형식의 날짜 문자열 - * @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우. - * 입력 값이 null인 경우. - */ - public static String addYear(String dateStr, int year) { - return addYearMonthDay(dateStr, year, 0, 0); - } - - /** - *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 월을 - * 증감한다. month는 가감할 수를 의미하며, 음수를 입력할 경우 감한다.

- * - *
-	 * DateUtil.addMonth("20010201", 12)  = "20020201"
-	 * DateUtil.addMonth("19800229", 12)  = "19810228"
-	 * DateUtil.addMonth("20040229", 12)  = "20050228"
-	 * DateUtil.addMonth("20050228", -12) = "20040228"
-	 * DateUtil.addMonth("20060131", 1)   = "20060228"
-	 * DateUtil.addMonth("20060228", -1)  = "20060128"
-	 * 
- * - * @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) - * @param month 가감할 월. 0이 입력될 경우 가감이 없다 - * @return yyyyMMdd 형식의 날짜 문자열 - * @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우. - * 입력 값이 null인 경우. - */ - public static String addMonth(String dateStr, int month) { - return addYearMonthDay(dateStr, 0, month, 0); - } - - /** - *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 일(day)를 - * 증감한다. day는 가감할 수를 의미하며, 음수를 입력할 경우 감한다. - *

- * 위에 정의된 addDays 메서드는 사용자가 ParseException을 반드시 처리해야 하는 불편함이 - * 있기 때문에 추가된 메서드이다.

- * - *
-	 * DateUtil.addDay("19991201", 62) = "20000201"
-	 * DateUtil.addDay("20000201", -62) = "19991201"
-	 * DateUtil.addDay("20050831", 3) = "20050903"
-	 * DateUtil.addDay("20050831", 3) = "20050903"
-	 * // 2006년 6월 31일은 실제로 존재하지 않는 날짜이다 -> 20060701로 간주된다
-	 * DateUtil.addDay("20060631", 1) = "20060702"
-	 * 
- * - * @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) - * @param day 가감할 일. 0이 입력될 경우 가감이 없다 - * @return yyyyMMdd 형식의 날짜 문자열 - * @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우. - * 입력 값이 null인 경우. - */ - public static String addDay(String dateStr, int day) { - return addYearMonthDay(dateStr, 0, 0, day); - } - - /** - *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열 dateStr1 - * dateStr2 사이의 일 수를 구한다.
- * dateStr2dateStr1 보다 과거 날짜일 경우에는 - * 음수를 반환한다. 동일한 경우에는 0을 반환한다.

- * - *
-	 * DateUtil.getDaysDiff("20060228","20060310") = 10
-	 * DateUtil.getDaysDiff("20060101","20070101") = 365
-	 * DateUtil.getDaysDiff("19990228","19990131") = -28
-	 * DateUtil.getDaysDiff("20060801","20060802") = 1
-	 * DateUtil.getDaysDiff("20060801","20060801") = 0
-	 * 
- * - * @param dateStr1 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) - * @param dateStr2 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) - * @return 일 수 차이. - * @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우. - * 입력 값이 null인 경우. - */ - public static int getDaysDiff(String sDate1, String sDate2) { - String dateStr1 = validChkDate(sDate1); - String dateStr2 = validChkDate(sDate2); - - if (!checkDate(sDate1) || !checkDate(sDate2)) { - throw new IllegalArgumentException("Invalid date format: args[0]=" + sDate1 + " args[1]=" + sDate2); - } - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); - - Date date1 = null; - Date date2 = null; - try { - date1 = sdf.parse(dateStr1); - date2 = sdf.parse(dateStr2); - } catch (ParseException e) { - throw new IllegalArgumentException("Invalid date format: args[0]=" + dateStr1 + " args[1]=" + dateStr2); - } - - if (date1 != null && date2 != null) { - int days1 = (int) ((date1.getTime() / 3600000) / 24); - int days2 = (int) ((date2.getTime() / 3600000) / 24); - return days2 - days1; - } else { - return 0; - } - - } - - /** - *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 유효한 날짜인지 검사.

- * - *
-	 * DateUtil.checkDate("1999-02-35") = false
-	 * DateUtil.checkDate("2000-13-31") = false
-	 * DateUtil.checkDate("2006-11-31") = false
-	 * DateUtil.checkDate("2006-2-28")  = false
-	 * DateUtil.checkDate("2006-2-8")   = false
-	 * DateUtil.checkDate("20060228")   = true
-	 * DateUtil.checkDate("2006-02-28") = true
-	 * 
- * - * @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) - * @return 유효한 날짜인지 여부 - */ - public static boolean checkDate(String sDate) { - String dateStr = validChkDate(sDate); - - String year = dateStr.substring(0, 4); - String month = dateStr.substring(4, 6); - String day = dateStr.substring(6); - - return checkDate(year, month, day); - } - - /** - *

입력한 년, 월, 일이 유효한지 검사.

- * - * @param year 연도 - * @param month 월 - * @param day 일 - * @return 유효한 날짜인지 여부 - */ - public static boolean checkDate(String year, String month, String day) { - try { - SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()); - - Date result = formatter.parse(year + "." + month + "." + day); - String resultStr = formatter.format(result); - if (resultStr.equalsIgnoreCase(year + "." + month + "." + day)) - return true; - else - return false; - } catch (ParseException e) { - return false; - } - } - - /** - * 날짜형태의 String의 날짜 포맷 및 TimeZone을 변경해 주는 메서드 - * - * @param strSource 바꿀 날짜 String - * @param fromDateFormat 기존의 날짜 형태 - * @param toDateFormat 원하는 날짜 형태 - * @param strTimeZone 변경할 TimeZone(""이면 변경 안함) - * @return 소스 String의 날짜 포맷을 변경한 String - */ - public static String convertDate(String strSource, String fromDateFormat, String toDateFormat, String strTimeZone) { - SimpleDateFormat simpledateformat = null; - Date date = null; - String fromFormat = ""; - String toFormat = ""; - - if (EgovStringUtil.isNullToString(strSource).trim().equals("")) { - return ""; - } - if (EgovStringUtil.isNullToString(fromDateFormat).trim().equals("")) - fromFormat = "yyyyMMddHHmmss"; // default값 - if (EgovStringUtil.isNullToString(toDateFormat).trim().equals("")) - toFormat = "yyyy-MM-dd HH:mm:ss"; // default값 - - try { - simpledateformat = new SimpleDateFormat(fromFormat, Locale.getDefault()); - date = simpledateformat.parse(strSource); - if (!EgovStringUtil.isNullToString(strTimeZone).trim().equals("")) { - simpledateformat.setTimeZone(TimeZone.getTimeZone(strTimeZone)); - } - simpledateformat = new SimpleDateFormat(toFormat, Locale.getDefault()); - } catch (ParseException exception) { - throw new RuntimeException(exception); - } - - return simpledateformat.format(date); - - } - - /** - * yyyyMMdd 형식의 날짜문자열을 원하는 캐릭터(ch)로 쪼개 돌려준다
- *
-	* ex) 20030405, ch(.) -> 2003.04.05
-	* ex) 200304, ch(.) -> 2003.04
-	* ex) 20040101,ch(/) --> 2004/01/01 로 리턴
-	* 
- * - * @param date yyyyMMdd 형식의 날짜문자열 - * @param ch 구분자 - * @return 변환된 문자열 - */ - public static String formatDate(String sDate, String ch) { - String dateStr = validChkDate(sDate); - - String str = dateStr.trim(); - String yyyy = ""; - String mm = ""; - String dd = ""; - - if (str.length() == 8) { - yyyy = str.substring(0, 4); - if (yyyy.equals("0000")) { - return ""; - } - - mm = str.substring(4, 6); - if (mm.equals("00")) { - return yyyy; - } - - dd = str.substring(6, 8); - if (dd.equals("00")) { - return yyyy + ch + mm; - } - - return yyyy + ch + mm + ch + dd; - - } else if (str.length() == 6) { - yyyy = str.substring(0, 4); - if (yyyy.equals("0000")) { - return ""; - } - - mm = str.substring(4, 6); - if (mm.equals("00")) { - return yyyy; - } - - return yyyy + ch + mm; - - } else if (str.length() == 4) { - yyyy = str.substring(0, 4); - if (yyyy.equals("0000")) { - return ""; - } else { - return yyyy; - } - } else { - return ""; - } - } - - /** - * HH24MISS 형식의 시간문자열을 원하는 캐릭터(ch)로 쪼개 돌려준다
- *
-	 *     ex) 151241, ch(/) -> 15/12/31
-	 * 
- * - * @param str HH24MISS 형식의 시간문자열 - * @param ch 구분자 - * @return 변환된 문자열 - */ - public static String formatTime(String sTime, String ch) { - String timeStr = validChkTime(sTime); - return timeStr.substring(0, 2) + ch + timeStr.substring(2, 4) + ch + timeStr.substring(4, 6); - } - - /** - * 연도를 입력 받아 해당 연도 2월의 말일(일수)를 문자열로 반환한다. - * - * @param year - * @return 해당 연도 2월의 말일(일수) - */ - public String leapYear(int year) { - if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { - return "29"; - } - - return "28"; - } - - /** - *

입력받은 연도가 윤년인지 아닌지 검사한다.

- * - *
-	 * DateUtil.isLeapYear(2004) = false
-	 * DateUtil.isLeapYear(2005) = true
-	 * DateUtil.isLeapYear(2006) = true
-	 * 
- * - * @param year 연도 - * @return 윤년 여부 - */ - public static boolean isLeapYear(int year) { - if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { - return false; - } - return true; - } - - /** - * 현재(한국기준) 날짜정보를 얻는다.
- * 표기법은 yyyy-mm-dd
- * @return String yyyymmdd형태의 현재 한국시간.
- */ - public static String getToday() { - return getCurrentDate(""); - } - - /** - * 현재(한국기준) 날짜정보를 얻는다.
- * 표기법은 yyyy-mm-dd
- * @return String yyyymmdd형태의 현재 한국시간.
- */ - public static String getCurrentDate(String dateType) { - Calendar aCalendar = Calendar.getInstance(); - - int year = aCalendar.get(Calendar.YEAR); - int month = aCalendar.get(Calendar.MONTH) + 1; - int date = aCalendar.get(Calendar.DATE); - String strDate = Integer.toString(year) - + ((month < 10) ? "0" + Integer.toString(month) : Integer.toString(month)) - + ((date < 10) ? "0" + Integer.toString(date) : Integer.toString(date)); - - if (!"".equals(dateType)) { - strDate = convertDate(strDate, "yyyyMMdd", dateType); - } - - return strDate; - } - - /** - * 날짜형태의 String의 날짜 포맷만을 변경해 주는 메서드 - * @param sDate 날짜 - * @param sTime 시간 - * @param sFormatStr 포멧 스트링 문자열 - * @return 지정한 날짜/시간을 지정한 포맷으로 출력 - * @See Letter Date or Time Component Presentation Examples - G Era designator Text AD - y Year Year 1996; 96 - M Month in year Month July; Jul; 07 - w Week in year Number 27 - W Week in month Number 2 - D Day in year Number 189 - d Day in month Number 10 - F Day of week in month Number 2 - E Day in week Text Tuesday; Tue - a Am/pm marker Text PM - H Hour in day (0-23) Number 0 - k Hour in day (1-24) Number 24 - K Hour in am/pm (0-11) Number 0 - h Hour in am/pm (1-12) Number 12 - m Minute in hour Number 30 - s Second in minute Number 55 - S Millisecond Number 978 - z Time zone General time zone Pacific Standard Time; PST; GMT-08:00 - Z Time zone RFC 822 time zone -0800 - - Date and Time Pattern Result - "yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT - "EEE, MMM d, ''yy" Wed, Jul 4, '01 - "h:mm a" 12:08 PM - "hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time - "K:mm a, z" 0:08 PM, PDT - "yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM - "EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700 - "yyMMddHHmmssZ" 010704120856-0700 - - */ - public static String convertDate(String sDate, String sTime, String sFormatStr) { - String dateStr = validChkDate(sDate); - String timeStr = validChkTime(sTime); - - Calendar cal = null; - cal = Calendar.getInstance(); - - cal.set(Calendar.YEAR, Integer.parseInt(dateStr.substring(0, 4))); - cal.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(4, 6)) - 1); - cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8))); - cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeStr.substring(0, 2))); - cal.set(Calendar.MINUTE, Integer.parseInt(timeStr.substring(2, 4))); - - SimpleDateFormat sdf = new SimpleDateFormat(sFormatStr, Locale.ENGLISH); - - return sdf.format(cal.getTime()); - } - - /** - * 입력받은 일자 사이의 임의의 일자를 반환 - * @param sDate1 시작일자 - * @param sDate2 종료일자 - * @return 임의일자 - */ - public static String getRandomDate(String sDate1, String sDate2) { - String dateStr1 = validChkDate(sDate1); - String dateStr2 = validChkDate(sDate2); - - String randomDate = null; - - int sYear, sMonth, sDay; - int eYear, eMonth, eDay; - - sYear = Integer.parseInt(dateStr1.substring(0, 4)); - sMonth = Integer.parseInt(dateStr1.substring(4, 6)); - sDay = Integer.parseInt(dateStr1.substring(6, 8)); - - eYear = Integer.parseInt(dateStr2.substring(0, 4)); - eMonth = Integer.parseInt(dateStr2.substring(4, 6)); - eDay = Integer.parseInt(dateStr2.substring(6, 8)); - - GregorianCalendar beginDate = new GregorianCalendar(sYear, sMonth - 1, sDay, 0, 0); - GregorianCalendar endDate = new GregorianCalendar(eYear, eMonth - 1, eDay, 23, 59); - - if (endDate.getTimeInMillis() < beginDate.getTimeInMillis()) { - throw new IllegalArgumentException("Invalid input date : " + sDate1 + "~" + sDate2); - } - - SecureRandom r = new SecureRandom(); - - r.setSeed(new Date().getTime()); - - long rand = ((r.nextLong() >>> 1) % (endDate.getTimeInMillis() - beginDate.getTimeInMillis() + 1)) + beginDate.getTimeInMillis(); - - GregorianCalendar cal = new GregorianCalendar(); - //SimpleDateFormat calformat = new SimpleDateFormat("yyyy-MM-dd"); - SimpleDateFormat calformat = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); - cal.setTimeInMillis(rand); - randomDate = calformat.format(cal.getTime()); - - // 랜덤문자열를 리턴 - return randomDate; - } - - /** - * 입력받은 양력일자를 변환하여 음력일자로 반환 - * @param sDate 양력일자 - * @return 음력일자 - */ - public static Map toLunar(String sDate) { - String dateStr = validChkDate(sDate); - - Map hm = new HashMap(); - hm.put("day", ""); - hm.put("leap", "0"); - - if (dateStr.length() != 8) { - return hm; - } - - Calendar cal; - ChineseCalendar lcal; - - cal = Calendar.getInstance(); - lcal = new ChineseCalendar(); - - cal.set(Calendar.YEAR, Integer.parseInt(dateStr.substring(0, 4))); - cal.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(4, 6)) - 1); - cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8))); - - lcal.setTimeInMillis(cal.getTimeInMillis()); - - String year = String.valueOf(lcal.get(ChineseCalendar.EXTENDED_YEAR) - 2637); - String month = String.valueOf(lcal.get(ChineseCalendar.MONTH) + 1); - String day = String.valueOf(lcal.get(ChineseCalendar.DAY_OF_MONTH)); - String leap = String.valueOf(lcal.get(ChineseCalendar.IS_LEAP_MONTH)); - - String pad4Str = "0000"; - String pad2Str = "00"; - - String retYear = (pad4Str + year).substring(year.length()); - String retMonth = (pad2Str + month).substring(month.length()); - String retDay = (pad2Str + day).substring(day.length()); - - String SDay = retYear + retMonth + retDay; - - hm.put("day", SDay); - hm.put("leap", leap); - - return hm; - } - - /** - * 입력받은 음력일자를 변환하여 양력일자로 반환 - * @param sDate 음력일자 - * @param iLeapMonth 음력윤달여부(IS_LEAP_MONTH) - * @return 양력일자 - */ - public static String toSolar(String sDate, int iLeapMonth) { - String dateStr = validChkDate(sDate); - - Calendar cal; - ChineseCalendar lcal; - - cal = Calendar.getInstance(); - lcal = new ChineseCalendar(); - - lcal.set(ChineseCalendar.EXTENDED_YEAR, Integer.parseInt(dateStr.substring(0, 4)) + 2637); - lcal.set(ChineseCalendar.MONTH, Integer.parseInt(dateStr.substring(4, 6)) - 1); - lcal.set(ChineseCalendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8))); - lcal.set(ChineseCalendar.IS_LEAP_MONTH, iLeapMonth); - - cal.setTimeInMillis(lcal.getTimeInMillis()); - - String year = String.valueOf(cal.get(Calendar.YEAR)); - String month = String.valueOf(cal.get(Calendar.MONTH) + 1); - String day = String.valueOf(cal.get(Calendar.DAY_OF_MONTH)); - - String pad4Str = "0000"; - String pad2Str = "00"; - - String retYear = (pad4Str + year).substring(year.length()); - String retMonth = (pad2Str + month).substring(month.length()); - String retDay = (pad2Str + day).substring(day.length()); - - return retYear + retMonth + retDay; - } - - /** - * 입력받은 요일의 영문명을 국문명의 요일로 반환 - * @param sWeek 영문 요일명 - * @return 국문 요일명 - */ - public static String convertWeek(String sWeek) { - String retStr = null; - - if (sWeek.equals("SUN")) { - retStr = "일요일"; - } else if (sWeek.equals("MON")) { - retStr = "월요일"; - } else if (sWeek.equals("TUE")) { - retStr = "화요일"; - } else if (sWeek.equals("WED")) { - retStr = "수요일"; - } else if (sWeek.equals("THR")) { - retStr = "목요일"; - } else if (sWeek.equals("FRI")) { - retStr = "금요일"; - } else if (sWeek.equals("SAT")) { - retStr = "토요일"; - } - - return retStr; - } - - /** - * 입력일자의 유효 여부를 확인 - * @param sDate 일자 - * @return 유효 여부 - */ - public static boolean validDate(String sDate) { - String dateStr = validChkDate(sDate); - - Calendar cal; - boolean ret = false; - - cal = Calendar.getInstance(); - - cal.set(Calendar.YEAR, Integer.parseInt(dateStr.substring(0, 4))); - cal.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(4, 6)) - 1); - cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8))); - - String year = String.valueOf(cal.get(Calendar.YEAR)); - String month = String.valueOf(cal.get(Calendar.MONTH) + 1); - String day = String.valueOf(cal.get(Calendar.DAY_OF_MONTH)); - - String pad4Str = "0000"; - String pad2Str = "00"; - - String retYear = (pad4Str + year).substring(year.length()); - String retMonth = (pad2Str + month).substring(month.length()); - String retDay = (pad2Str + day).substring(day.length()); - - String retYMD = retYear + retMonth + retDay; - - if (sDate.equals(retYMD)) { - ret = true; - } - - return ret; - } - - /** - * 입력일자, 요일의 유효 여부를 확인 - * @param sDate 일자 - * @param sWeek 요일 (DAY_OF_WEEK) - * @return 유효 여부 - */ - public static boolean validDate(String sDate, int sWeek) { - String dateStr = validChkDate(sDate); - - Calendar cal; - boolean ret = false; - - cal = Calendar.getInstance(); - - cal.set(Calendar.YEAR, Integer.parseInt(dateStr.substring(0, 4))); - cal.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(4, 6)) - 1); - cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8))); - - int Week = cal.get(Calendar.DAY_OF_WEEK); - - if (validDate(sDate)) { - if (sWeek == Week) { - ret = true; - } - } - - return ret; - } - - /** - * 입력시간의 유효 여부를 확인 - * @param sTime 입력시간 - * @return 유효 여부 - */ - public static boolean validTime(String sTime) { - String timeStr = validChkTime(sTime); - - Calendar cal; - boolean ret = false; - - cal = Calendar.getInstance(); - - cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeStr.substring(0, 2))); - cal.set(Calendar.MINUTE, Integer.parseInt(timeStr.substring(2, 4))); - - String HH = String.valueOf(cal.get(Calendar.HOUR_OF_DAY)); - String MM = String.valueOf(cal.get(Calendar.MINUTE)); - - String pad2Str = "00"; - - String retHH = (pad2Str + HH).substring(HH.length()); - String retMM = (pad2Str + MM).substring(MM.length()); - - String retTime = retHH + retMM; - - if (sTime.equals(retTime)) { - ret = true; - } - - return ret; - } - - /** - * 입력된 일자에 연, 월, 일을 가감한 날짜의 요일을 반환 - * @param sDate 날짜 - * @param year 연 - * @param month 월 - * @param day 일 - * @return 계산된 일자의 요일(DAY_OF_WEEK) - */ - public static String addYMDtoWeek(String sDate, int year, int month, int day) { - String dateStr = validChkDate(sDate); - - dateStr = addYearMonthDay(dateStr, year, month, day); - - Calendar cal = Calendar.getInstance(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); - try { - cal.setTime(sdf.parse(dateStr)); - } catch (ParseException e) { - throw new IllegalArgumentException("Invalid date format: " + dateStr); - } - - SimpleDateFormat rsdf = new SimpleDateFormat("E", Locale.ENGLISH); - - return rsdf.format(cal.getTime()); - } - - /** - * 입력된 일자에 연, 월, 일, 시간, 분을 가감한 날짜, 시간을 포멧스트링 형식으로 반환 - * @param sDate 날짜 - * @param sTime 시간 - * @param year 연 - * @param month 월 - * @param day 일 - * @param hour 시간 - * @param minute 분 - * @param formatStr 포멧스트링 - * @return - */ - public static String addYMDtoDayTime(String sDate, String sTime, int year, int month, int day, int hour, int minute, String formatStr) { - String dateStr = validChkDate(sDate); - String timeStr = validChkTime(sTime); - - dateStr = addYearMonthDay(dateStr, year, month, day); - - dateStr = convertDate(dateStr, timeStr, "yyyyMMddHHmm"); - - Calendar cal = Calendar.getInstance(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm", Locale.ENGLISH); - - try { - cal.setTime(sdf.parse(dateStr)); - } catch (ParseException e) { - throw new IllegalArgumentException("Invalid date format: " + dateStr); - } - - if (hour != 0) { - cal.add(Calendar.HOUR, hour); - } - - if (minute != 0) { - cal.add(Calendar.MINUTE, minute); - } - - SimpleDateFormat rsdf = new SimpleDateFormat(formatStr, Locale.ENGLISH); - - return rsdf.format(cal.getTime()); - } - - /** - * 입력된 일자를 int 형으로 반환 - * @param sDate 일자 - * @return int(일자) - */ - public static int datetoInt(String sDate) { - return Integer.parseInt(convertDate(sDate, "0000", "yyyyMMdd")); - } - - /** - * 입력된 시간을 int 형으로 반환 - * @param sTime 시간 - * @return int(시간) - */ - public static int timetoInt(String sTime) { - return Integer.parseInt(convertDate("00000101", sTime, "HHmm")); - } - - /** - * 입력된 일자 문자열을 확인하고 8자리로 리턴 - * @param sDate - * @return - */ - public static String validChkDate(String dateStr) { - if (dateStr == null || !(dateStr.trim().length() == 8 || dateStr.trim().length() == 10)) { - throw new IllegalArgumentException("Invalid date format: " + dateStr); - } - - if (dateStr.length() == 10) { - return EgovStringUtil.removeMinusChar(dateStr); - } - - return dateStr; - } - - /** - * 입력된 일자 문자열을 확인하고 8자리로 리턴 - * @param sDate - * @return - */ - public static String validChkTime(String timeStr) { - if (timeStr == null || !(timeStr.trim().length() == 4)) { - throw new IllegalArgumentException("Invalid time format: " + timeStr); - } - - if (timeStr.length() == 5) { - timeStr = EgovStringUtil.remove(timeStr, ':'); - } - - return timeStr; - } - -} +package kcc.com.utl.fcc.service; + +import java.security.SecureRandom; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; + +import com.ibm.icu.util.ChineseCalendar; + +/** + * + * Date 에 대한 Util 클래스 + * @author 공통서비스 개발팀 이중호 + * @since 2009.02.01 + * @version 1.0 + * @see + * + *
+ * << 개정이력(Modification Information) >>
+ *
+ *   수정일      수정자           수정내용
+ *  -------    --------    ---------------------------
+ *   2009.02.01  이중호          최초 생성
+ *
+ * 
+ */ +public class EgovDateUtil { + + /** + *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 년, 월, 일을 + * 증감한다. 년, 월, 일은 가감할 수를 의미하며, 음수를 입력할 경우 감한다.

+ * + *
+	 * DateUtil.addYearMonthDay("19810828", 0, 0, 19)  = "19810916"
+	 * DateUtil.addYearMonthDay("20060228", 0, 0, -10) = "20060218"
+	 * DateUtil.addYearMonthDay("20060228", 0, 0, 10)  = "20060310"
+	 * DateUtil.addYearMonthDay("20060228", 0, 0, 32)  = "20060401"
+	 * DateUtil.addYearMonthDay("20050331", 0, -1, 0)  = "20050228"
+	 * DateUtil.addYearMonthDay("20050301", 0, 2, 30)  = "20050531"
+	 * DateUtil.addYearMonthDay("20050301", 1, 2, 30)  = "20060531"
+	 * DateUtil.addYearMonthDay("20040301", 2, 0, 0)   = "20060301"
+	 * DateUtil.addYearMonthDay("20040229", 2, 0, 0)   = "20060228"
+	 * DateUtil.addYearMonthDay("20040229", 2, 0, 1)   = "20060301"
+	 * 
+ * + * @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) + * @param year 가감할 년. 0이 입력될 경우 가감이 없다 + * @param month 가감할 월. 0이 입력될 경우 가감이 없다 + * @param day 가감할 일. 0이 입력될 경우 가감이 없다 + * @return yyyyMMdd 형식의 날짜 문자열 + * @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우. + * 입력 값이 null인 경우. + */ + public static String addYearMonthDay(String sDate, int year, int month, int day) { + + String dateStr = validChkDate(sDate); + + Calendar cal = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); + try { + cal.setTime(sdf.parse(dateStr)); + } catch (ParseException e) { + throw new IllegalArgumentException("Invalid date format: " + dateStr); + } + + if (year != 0) { + cal.add(Calendar.YEAR, year); + } + if (month != 0) { + cal.add(Calendar.MONTH, month); + } + if (day != 0) { + cal.add(Calendar.DATE, day); + } + + return sdf.format(cal.getTime()); + } + + /** + *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 년을 + * 증감한다. year는 가감할 수를 의미하며, 음수를 입력할 경우 감한다.

+ * + *
+	 * DateUtil.addYear("20000201", 62)  = "20620201"
+	 * DateUtil.addYear("20620201", -62) = "20000201"
+	 * DateUtil.addYear("20040229", 2)   = "20060228"
+	 * DateUtil.addYear("20060228", -2)  = "20040228"
+	 * DateUtil.addYear("19000101", 200) = "21000101"
+	 * 
+ * + * @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) + * @param year 가감할 년. 0이 입력될 경우 가감이 없다 + * @return yyyyMMdd 형식의 날짜 문자열 + * @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우. + * 입력 값이 null인 경우. + */ + public static String addYear(String dateStr, int year) { + return addYearMonthDay(dateStr, year, 0, 0); + } + + /** + *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 월을 + * 증감한다. month는 가감할 수를 의미하며, 음수를 입력할 경우 감한다.

+ * + *
+	 * DateUtil.addMonth("20010201", 12)  = "20020201"
+	 * DateUtil.addMonth("19800229", 12)  = "19810228"
+	 * DateUtil.addMonth("20040229", 12)  = "20050228"
+	 * DateUtil.addMonth("20050228", -12) = "20040228"
+	 * DateUtil.addMonth("20060131", 1)   = "20060228"
+	 * DateUtil.addMonth("20060228", -1)  = "20060128"
+	 * 
+ * + * @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) + * @param month 가감할 월. 0이 입력될 경우 가감이 없다 + * @return yyyyMMdd 형식의 날짜 문자열 + * @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우. + * 입력 값이 null인 경우. + */ + public static String addMonth(String dateStr, int month) { + return addYearMonthDay(dateStr, 0, month, 0); + } + + /** + *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 일(day)를 + * 증감한다. day는 가감할 수를 의미하며, 음수를 입력할 경우 감한다. + *

+ * 위에 정의된 addDays 메서드는 사용자가 ParseException을 반드시 처리해야 하는 불편함이 + * 있기 때문에 추가된 메서드이다.

+ * + *
+	 * DateUtil.addDay("19991201", 62) = "20000201"
+	 * DateUtil.addDay("20000201", -62) = "19991201"
+	 * DateUtil.addDay("20050831", 3) = "20050903"
+	 * DateUtil.addDay("20050831", 3) = "20050903"
+	 * // 2006년 6월 31일은 실제로 존재하지 않는 날짜이다 -> 20060701로 간주된다
+	 * DateUtil.addDay("20060631", 1) = "20060702"
+	 * 
+ * + * @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) + * @param day 가감할 일. 0이 입력될 경우 가감이 없다 + * @return yyyyMMdd 형식의 날짜 문자열 + * @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우. + * 입력 값이 null인 경우. + */ + public static String addDay(String dateStr, int day) { + return addYearMonthDay(dateStr, 0, 0, day); + } + + /** + *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열 dateStr1 + * dateStr2 사이의 일 수를 구한다.
+ * dateStr2dateStr1 보다 과거 날짜일 경우에는 + * 음수를 반환한다. 동일한 경우에는 0을 반환한다.

+ * + *
+	 * DateUtil.getDaysDiff("20060228","20060310") = 10
+	 * DateUtil.getDaysDiff("20060101","20070101") = 365
+	 * DateUtil.getDaysDiff("19990228","19990131") = -28
+	 * DateUtil.getDaysDiff("20060801","20060802") = 1
+	 * DateUtil.getDaysDiff("20060801","20060801") = 0
+	 * 
+ * + * @param dateStr1 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) + * @param dateStr2 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) + * @return 일 수 차이. + * @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우. + * 입력 값이 null인 경우. + */ + public static int getDaysDiff(String sDate1, String sDate2) { + String dateStr1 = validChkDate(sDate1); + String dateStr2 = validChkDate(sDate2); + + if (!checkDate(sDate1) || !checkDate(sDate2)) { + throw new IllegalArgumentException("Invalid date format: args[0]=" + sDate1 + " args[1]=" + sDate2); + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); + + Date date1 = null; + Date date2 = null; + try { + date1 = sdf.parse(dateStr1); + date2 = sdf.parse(dateStr2); + } catch (ParseException e) { + throw new IllegalArgumentException("Invalid date format: args[0]=" + dateStr1 + " args[1]=" + dateStr2); + } + + if (date1 != null && date2 != null) { + int days1 = (int) ((date1.getTime() / 3600000) / 24); + int days2 = (int) ((date2.getTime() / 3600000) / 24); + return days2 - days1; + } else { + return 0; + } + + } + + /** + *

yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 유효한 날짜인지 검사.

+ * + *
+	 * DateUtil.checkDate("1999-02-35") = false
+	 * DateUtil.checkDate("2000-13-31") = false
+	 * DateUtil.checkDate("2006-11-31") = false
+	 * DateUtil.checkDate("2006-2-28")  = false
+	 * DateUtil.checkDate("2006-2-8")   = false
+	 * DateUtil.checkDate("20060228")   = true
+	 * DateUtil.checkDate("2006-02-28") = true
+	 * 
+ * + * @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식) + * @return 유효한 날짜인지 여부 + */ + public static boolean checkDate(String sDate) { + String dateStr = validChkDate(sDate); + + String year = dateStr.substring(0, 4); + String month = dateStr.substring(4, 6); + String day = dateStr.substring(6); + + return checkDate(year, month, day); + } + + /** + *

입력한 년, 월, 일이 유효한지 검사.

+ * + * @param year 연도 + * @param month 월 + * @param day 일 + * @return 유효한 날짜인지 여부 + */ + public static boolean checkDate(String year, String month, String day) { + try { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()); + + Date result = formatter.parse(year + "." + month + "." + day); + String resultStr = formatter.format(result); + if (resultStr.equalsIgnoreCase(year + "." + month + "." + day)) + return true; + else + return false; + } catch (ParseException e) { + return false; + } + } + + /** + * 날짜형태의 String의 날짜 포맷 및 TimeZone을 변경해 주는 메서드 + * + * @param strSource 바꿀 날짜 String + * @param fromDateFormat 기존의 날짜 형태 + * @param toDateFormat 원하는 날짜 형태 + * @param strTimeZone 변경할 TimeZone(""이면 변경 안함) + * @return 소스 String의 날짜 포맷을 변경한 String + */ + public static String convertDate(String strSource, String fromDateFormat, String toDateFormat, String strTimeZone) { + SimpleDateFormat simpledateformat = null; + Date date = null; + String fromFormat = ""; + String toFormat = ""; + + if (EgovStringUtil.isNullToString(strSource).trim().equals("")) { + return ""; + } + if (EgovStringUtil.isNullToString(fromDateFormat).trim().equals("")) + fromFormat = "yyyyMMddHHmmss"; // default값 + if (EgovStringUtil.isNullToString(toDateFormat).trim().equals("")) + toFormat = "yyyy-MM-dd HH:mm:ss"; // default값 + + try { + simpledateformat = new SimpleDateFormat(fromFormat, Locale.getDefault()); + date = simpledateformat.parse(strSource); + if (!EgovStringUtil.isNullToString(strTimeZone).trim().equals("")) { + simpledateformat.setTimeZone(TimeZone.getTimeZone(strTimeZone)); + } + simpledateformat = new SimpleDateFormat(toFormat, Locale.getDefault()); + } catch (ParseException exception) { + throw new RuntimeException(exception); + } + + return simpledateformat.format(date); + + } + + /** + * yyyyMMdd 형식의 날짜문자열을 원하는 캐릭터(ch)로 쪼개 돌려준다
+ *
+	* ex) 20030405, ch(.) -> 2003.04.05
+	* ex) 200304, ch(.) -> 2003.04
+	* ex) 20040101,ch(/) --> 2004/01/01 로 리턴
+	* 
+ * + * @param date yyyyMMdd 형식의 날짜문자열 + * @param ch 구분자 + * @return 변환된 문자열 + */ + public static String formatDate(String sDate, String ch) { + String dateStr = validChkDate(sDate); + + String str = dateStr.trim(); + String yyyy = ""; + String mm = ""; + String dd = ""; + + if (str.length() == 8) { + yyyy = str.substring(0, 4); + if (yyyy.equals("0000")) { + return ""; + } + + mm = str.substring(4, 6); + if (mm.equals("00")) { + return yyyy; + } + + dd = str.substring(6, 8); + if (dd.equals("00")) { + return yyyy + ch + mm; + } + + return yyyy + ch + mm + ch + dd; + + } else if (str.length() == 6) { + yyyy = str.substring(0, 4); + if (yyyy.equals("0000")) { + return ""; + } + + mm = str.substring(4, 6); + if (mm.equals("00")) { + return yyyy; + } + + return yyyy + ch + mm; + + } else if (str.length() == 4) { + yyyy = str.substring(0, 4); + if (yyyy.equals("0000")) { + return ""; + } else { + return yyyy; + } + } else { + return ""; + } + } + + /** + * HH24MISS 형식의 시간문자열을 원하는 캐릭터(ch)로 쪼개 돌려준다
+ *
+	 *     ex) 151241, ch(/) -> 15/12/31
+	 * 
+ * + * @param str HH24MISS 형식의 시간문자열 + * @param ch 구분자 + * @return 변환된 문자열 + */ + public static String formatTime(String sTime, String ch) { + String timeStr = validChkTime(sTime); + return timeStr.substring(0, 2) + ch + timeStr.substring(2, 4) + ch + timeStr.substring(4, 6); + } + + /** + * 연도를 입력 받아 해당 연도 2월의 말일(일수)를 문자열로 반환한다. + * + * @param year + * @return 해당 연도 2월의 말일(일수) + */ + public String leapYear(int year) { + if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { + return "29"; + } + + return "28"; + } + + /** + *

입력받은 연도가 윤년인지 아닌지 검사한다.

+ * + *
+	 * DateUtil.isLeapYear(2004) = false
+	 * DateUtil.isLeapYear(2005) = true
+	 * DateUtil.isLeapYear(2006) = true
+	 * 
+ * + * @param year 연도 + * @return 윤년 여부 + */ + public static boolean isLeapYear(int year) { + if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { + return false; + } + return true; + } + + /** + * 현재(한국기준) 날짜정보를 얻는다.
+ * 표기법은 yyyy-mm-dd
+ * @return String yyyymmdd형태의 현재 한국시간.
+ */ + public static String getToday() { + return getCurrentDate(""); + } + + /** + * 현재(한국기준) 날짜정보를 얻는다.
+ * 표기법은 yyyy-mm-dd
+ * @return String yyyymmdd형태의 현재 한국시간.
+ */ + public static String getCurrentDate(String dateType) { + Calendar aCalendar = Calendar.getInstance(); + + int year = aCalendar.get(Calendar.YEAR); + int month = aCalendar.get(Calendar.MONTH) + 1; + int date = aCalendar.get(Calendar.DATE); + String strDate = Integer.toString(year) + + ((month < 10) ? "0" + Integer.toString(month) : Integer.toString(month)) + + ((date < 10) ? "0" + Integer.toString(date) : Integer.toString(date)); + + if (!"".equals(dateType)) { + strDate = convertDate(strDate, "yyyyMMdd", dateType); + } + + return strDate; + } + + /** + * 날짜형태의 String의 날짜 포맷만을 변경해 주는 메서드 + * @param sDate 날짜 + * @param sTime 시간 + * @param sFormatStr 포멧 스트링 문자열 + * @return 지정한 날짜/시간을 지정한 포맷으로 출력 + * @See Letter Date or Time Component Presentation Examples + G Era designator Text AD + y Year Year 1996; 96 + M Month in year Month July; Jul; 07 + w Week in year Number 27 + W Week in month Number 2 + D Day in year Number 189 + d Day in month Number 10 + F Day of week in month Number 2 + E Day in week Text Tuesday; Tue + a Am/pm marker Text PM + H Hour in day (0-23) Number 0 + k Hour in day (1-24) Number 24 + K Hour in am/pm (0-11) Number 0 + h Hour in am/pm (1-12) Number 12 + m Minute in hour Number 30 + s Second in minute Number 55 + S Millisecond Number 978 + z Time zone General time zone Pacific Standard Time; PST; GMT-08:00 + Z Time zone RFC 822 time zone -0800 + + Date and Time Pattern Result + "yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT + "EEE, MMM d, ''yy" Wed, Jul 4, '01 + "h:mm a" 12:08 PM + "hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time + "K:mm a, z" 0:08 PM, PDT + "yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM + "EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700 + "yyMMddHHmmssZ" 010704120856-0700 + + */ + public static String convertDate(String sDate, String sTime, String sFormatStr) { + String dateStr = validChkDate(sDate); + String timeStr = validChkTime(sTime); + + Calendar cal = null; + cal = Calendar.getInstance(); + + cal.set(Calendar.YEAR, Integer.parseInt(dateStr.substring(0, 4))); + cal.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(4, 6)) - 1); + cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8))); + cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeStr.substring(0, 2))); + cal.set(Calendar.MINUTE, Integer.parseInt(timeStr.substring(2, 4))); + + SimpleDateFormat sdf = new SimpleDateFormat(sFormatStr, Locale.ENGLISH); + + return sdf.format(cal.getTime()); + } + + /** + * 입력받은 일자 사이의 임의의 일자를 반환 + * @param sDate1 시작일자 + * @param sDate2 종료일자 + * @return 임의일자 + */ + public static String getRandomDate(String sDate1, String sDate2) { + String dateStr1 = validChkDate(sDate1); + String dateStr2 = validChkDate(sDate2); + + String randomDate = null; + + int sYear, sMonth, sDay; + int eYear, eMonth, eDay; + + sYear = Integer.parseInt(dateStr1.substring(0, 4)); + sMonth = Integer.parseInt(dateStr1.substring(4, 6)); + sDay = Integer.parseInt(dateStr1.substring(6, 8)); + + eYear = Integer.parseInt(dateStr2.substring(0, 4)); + eMonth = Integer.parseInt(dateStr2.substring(4, 6)); + eDay = Integer.parseInt(dateStr2.substring(6, 8)); + + GregorianCalendar beginDate = new GregorianCalendar(sYear, sMonth - 1, sDay, 0, 0); + GregorianCalendar endDate = new GregorianCalendar(eYear, eMonth - 1, eDay, 23, 59); + + if (endDate.getTimeInMillis() < beginDate.getTimeInMillis()) { + throw new IllegalArgumentException("Invalid input date : " + sDate1 + "~" + sDate2); + } + + SecureRandom r = new SecureRandom(); + + r.setSeed(new Date().getTime()); + + long rand = ((r.nextLong() >>> 1) % (endDate.getTimeInMillis() - beginDate.getTimeInMillis() + 1)) + beginDate.getTimeInMillis(); + + GregorianCalendar cal = new GregorianCalendar(); + //SimpleDateFormat calformat = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat calformat = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); + cal.setTimeInMillis(rand); + randomDate = calformat.format(cal.getTime()); + + // 랜덤문자열를 리턴 + return randomDate; + } + + /** + * 입력받은 양력일자를 변환하여 음력일자로 반환 + * @param sDate 양력일자 + * @return 음력일자 + */ + public static Map toLunar(String sDate) { + String dateStr = validChkDate(sDate); + + Map hm = new HashMap(); + hm.put("day", ""); + hm.put("leap", "0"); + + if (dateStr.length() != 8) { + return hm; + } + + Calendar cal; + ChineseCalendar lcal; + + cal = Calendar.getInstance(); + lcal = new ChineseCalendar(); + + cal.set(Calendar.YEAR, Integer.parseInt(dateStr.substring(0, 4))); + cal.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(4, 6)) - 1); + cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8))); + + lcal.setTimeInMillis(cal.getTimeInMillis()); + + String year = String.valueOf(lcal.get(ChineseCalendar.EXTENDED_YEAR) - 2637); + String month = String.valueOf(lcal.get(ChineseCalendar.MONTH) + 1); + String day = String.valueOf(lcal.get(ChineseCalendar.DAY_OF_MONTH)); + String leap = String.valueOf(lcal.get(ChineseCalendar.IS_LEAP_MONTH)); + + String pad4Str = "0000"; + String pad2Str = "00"; + + String retYear = (pad4Str + year).substring(year.length()); + String retMonth = (pad2Str + month).substring(month.length()); + String retDay = (pad2Str + day).substring(day.length()); + + String SDay = retYear + retMonth + retDay; + + hm.put("day", SDay); + hm.put("leap", leap); + + return hm; + } + + /** + * 입력받은 음력일자를 변환하여 양력일자로 반환 + * @param sDate 음력일자 + * @param iLeapMonth 음력윤달여부(IS_LEAP_MONTH) + * @return 양력일자 + */ + public static String toSolar(String sDate, int iLeapMonth) { + String dateStr = validChkDate(sDate); + + Calendar cal; + ChineseCalendar lcal; + + cal = Calendar.getInstance(); + lcal = new ChineseCalendar(); + + lcal.set(ChineseCalendar.EXTENDED_YEAR, Integer.parseInt(dateStr.substring(0, 4)) + 2637); + lcal.set(ChineseCalendar.MONTH, Integer.parseInt(dateStr.substring(4, 6)) - 1); + lcal.set(ChineseCalendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8))); + lcal.set(ChineseCalendar.IS_LEAP_MONTH, iLeapMonth); + + cal.setTimeInMillis(lcal.getTimeInMillis()); + + String year = String.valueOf(cal.get(Calendar.YEAR)); + String month = String.valueOf(cal.get(Calendar.MONTH) + 1); + String day = String.valueOf(cal.get(Calendar.DAY_OF_MONTH)); + + String pad4Str = "0000"; + String pad2Str = "00"; + + String retYear = (pad4Str + year).substring(year.length()); + String retMonth = (pad2Str + month).substring(month.length()); + String retDay = (pad2Str + day).substring(day.length()); + + return retYear + retMonth + retDay; + } + + /** + * 입력받은 요일의 영문명을 국문명의 요일로 반환 + * @param sWeek 영문 요일명 + * @return 국문 요일명 + */ + public static String convertWeek(String sWeek) { + String retStr = null; + + if (sWeek.equals("SUN")) { + retStr = "일요일"; + } else if (sWeek.equals("MON")) { + retStr = "월요일"; + } else if (sWeek.equals("TUE")) { + retStr = "화요일"; + } else if (sWeek.equals("WED")) { + retStr = "수요일"; + } else if (sWeek.equals("THR")) { + retStr = "목요일"; + } else if (sWeek.equals("FRI")) { + retStr = "금요일"; + } else if (sWeek.equals("SAT")) { + retStr = "토요일"; + } + + return retStr; + } + + /** + * 입력일자의 유효 여부를 확인 + * @param sDate 일자 + * @return 유효 여부 + */ + public static boolean validDate(String sDate) { + String dateStr = validChkDate(sDate); + + Calendar cal; + boolean ret = false; + + cal = Calendar.getInstance(); + + cal.set(Calendar.YEAR, Integer.parseInt(dateStr.substring(0, 4))); + cal.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(4, 6)) - 1); + cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8))); + + String year = String.valueOf(cal.get(Calendar.YEAR)); + String month = String.valueOf(cal.get(Calendar.MONTH) + 1); + String day = String.valueOf(cal.get(Calendar.DAY_OF_MONTH)); + + String pad4Str = "0000"; + String pad2Str = "00"; + + String retYear = (pad4Str + year).substring(year.length()); + String retMonth = (pad2Str + month).substring(month.length()); + String retDay = (pad2Str + day).substring(day.length()); + + String retYMD = retYear + retMonth + retDay; + + if (sDate.equals(retYMD)) { + ret = true; + } + + return ret; + } + + /** + * 입력일자, 요일의 유효 여부를 확인 + * @param sDate 일자 + * @param sWeek 요일 (DAY_OF_WEEK) + * @return 유효 여부 + */ + public static boolean validDate(String sDate, int sWeek) { + String dateStr = validChkDate(sDate); + + Calendar cal; + boolean ret = false; + + cal = Calendar.getInstance(); + + cal.set(Calendar.YEAR, Integer.parseInt(dateStr.substring(0, 4))); + cal.set(Calendar.MONTH, Integer.parseInt(dateStr.substring(4, 6)) - 1); + cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6, 8))); + + int Week = cal.get(Calendar.DAY_OF_WEEK); + + if (validDate(sDate)) { + if (sWeek == Week) { + ret = true; + } + } + + return ret; + } + + /** + * 입력시간의 유효 여부를 확인 + * @param sTime 입력시간 + * @return 유효 여부 + */ + public static boolean validTime(String sTime) { + String timeStr = validChkTime(sTime); + + Calendar cal; + boolean ret = false; + + cal = Calendar.getInstance(); + + cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeStr.substring(0, 2))); + cal.set(Calendar.MINUTE, Integer.parseInt(timeStr.substring(2, 4))); + + String HH = String.valueOf(cal.get(Calendar.HOUR_OF_DAY)); + String MM = String.valueOf(cal.get(Calendar.MINUTE)); + + String pad2Str = "00"; + + String retHH = (pad2Str + HH).substring(HH.length()); + String retMM = (pad2Str + MM).substring(MM.length()); + + String retTime = retHH + retMM; + + if (sTime.equals(retTime)) { + ret = true; + } + + return ret; + } + + /** + * 입력된 일자에 연, 월, 일을 가감한 날짜의 요일을 반환 + * @param sDate 날짜 + * @param year 연 + * @param month 월 + * @param day 일 + * @return 계산된 일자의 요일(DAY_OF_WEEK) + */ + public static String addYMDtoWeek(String sDate, int year, int month, int day) { + String dateStr = validChkDate(sDate); + + dateStr = addYearMonthDay(dateStr, year, month, day); + + Calendar cal = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); + try { + cal.setTime(sdf.parse(dateStr)); + } catch (ParseException e) { + throw new IllegalArgumentException("Invalid date format: " + dateStr); + } + + SimpleDateFormat rsdf = new SimpleDateFormat("E", Locale.ENGLISH); + + return rsdf.format(cal.getTime()); + } + + /** + * 입력된 일자에 연, 월, 일, 시간, 분을 가감한 날짜, 시간을 포멧스트링 형식으로 반환 + * @param sDate 날짜 + * @param sTime 시간 + * @param year 연 + * @param month 월 + * @param day 일 + * @param hour 시간 + * @param minute 분 + * @param formatStr 포멧스트링 + * @return + */ + public static String addYMDtoDayTime(String sDate, String sTime, int year, int month, int day, int hour, int minute, String formatStr) { + String dateStr = validChkDate(sDate); + String timeStr = validChkTime(sTime); + + dateStr = addYearMonthDay(dateStr, year, month, day); + + dateStr = convertDate(dateStr, timeStr, "yyyyMMddHHmm"); + + Calendar cal = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm", Locale.ENGLISH); + + try { + cal.setTime(sdf.parse(dateStr)); + } catch (ParseException e) { + throw new IllegalArgumentException("Invalid date format: " + dateStr); + } + + if (hour != 0) { + cal.add(Calendar.HOUR, hour); + } + + if (minute != 0) { + cal.add(Calendar.MINUTE, minute); + } + + SimpleDateFormat rsdf = new SimpleDateFormat(formatStr, Locale.ENGLISH); + + return rsdf.format(cal.getTime()); + } + + /** + * 입력된 일자를 int 형으로 반환 + * @param sDate 일자 + * @return int(일자) + */ + public static int datetoInt(String sDate) { + return Integer.parseInt(convertDate(sDate, "0000", "yyyyMMdd")); + } + + /** + * 입력된 시간을 int 형으로 반환 + * @param sTime 시간 + * @return int(시간) + */ + public static int timetoInt(String sTime) { + return Integer.parseInt(convertDate("00000101", sTime, "HHmm")); + } + + /** + * 입력된 일자 문자열을 확인하고 8자리로 리턴 + * @param sDate + * @return + */ + public static String validChkDate(String dateStr) { + if (dateStr == null || !(dateStr.trim().length() == 8 || dateStr.trim().length() == 10)) { + throw new IllegalArgumentException("Invalid date format: " + dateStr); + } + + if (dateStr.length() == 10) { + return EgovStringUtil.removeMinusChar(dateStr); + } + + return dateStr; + } + + /** + * 입력된 일자 문자열을 확인하고 8자리로 리턴 + * @param sDate + * @return + */ + public static String validChkTime(String timeStr) { + if (timeStr == null || !(timeStr.trim().length() == 4)) { + throw new IllegalArgumentException("Invalid time format: " + timeStr); + } + + if (timeStr.length() == 5) { + timeStr = EgovStringUtil.remove(timeStr, ':'); + } + + return timeStr; + } + + public static String getYear() { + return Integer.toString(LocalDate.now().getYear()); + } +} diff --git a/src/main/java/kcc/let/my/web/MyPageController.java b/src/main/java/kcc/let/my/web/MyPageController.java new file mode 100644 index 00000000..dfb82706 --- /dev/null +++ b/src/main/java/kcc/let/my/web/MyPageController.java @@ -0,0 +1,218 @@ +package kcc.let.my.web; + +import java.io.OutputStream; +import java.security.SecureRandom; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.support.SessionStatus; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import org.springmodules.validation.commons.DefaultBeanValidator; + +import com.penta.scpdb.ScpDbAgent; +import com.sci.v2.pcc.secu.SciSecuManager; +import com.sci.v2.pcc.secu.hmac.SciHmac; + +import NiceID.Check.CPClient; +import egovframework.rte.fdl.property.EgovPropertyService; +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; +import egovframework.rte.psl.dataaccess.util.EgovMap; +import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; +import kcc.com.cmm.ComDefaultCodeVO; +import kcc.com.cmm.EgovMessageSource; +import kcc.com.cmm.EgovMultiPartEmail; +import kcc.com.cmm.LoginVO; +import kcc.com.cmm.ReadVO; +import kcc.com.cmm.UserVO; +import kcc.com.cmm.service.EgovCmmUseService; +import kcc.com.cmm.service.EgovFileMngService; +import kcc.com.cmm.service.EgovFileMngUtil; +import kcc.com.cmm.service.FileVO; +import kcc.com.cmm.service.ReadService; +import kcc.com.cmm.util.StringUtil; +import kcc.com.cmm.util.WebUtil; +import kcc.com.uss.ion.cnf.service.ProhibitMngService; +import kcc.com.uss.ion.cnf.service.WordFilterService; +import kcc.com.uss.ion.cnf.service.WordFilterVO; +import kcc.com.utl.fcc.service.EgovStringUtil; +import kcc.com.utl.user.service.CheckLoginUtil; +import kcc.let.cop.bbs.service.Board; +import kcc.let.cop.bbs.service.BoardChgHst; +import kcc.let.cop.bbs.service.BoardMaster; +import kcc.let.cop.bbs.service.BoardMasterVO; +import kcc.let.cop.bbs.service.BoardVO; +import kcc.let.cop.bbs.service.EgovBBSAttributeManageService; +import kcc.let.cop.bbs.service.EgovBBSManageService; +import kcc.let.sym.mnu.mpm.service.EgovMenuManageService; +import kcc.let.sym.mnu.mpm.service.MenuManageVO; +import kcc.let.sym.site.service.EgovSiteManagerService; +import kcc.let.sym.site.service.SiteManagerVO; +import kcc.let.uat.uia.service.SsoLoginVO; +import kcc.let.utl.sim.service.EgovClntInfo; +import kcc.ve.cmm.VeConstants; +import kcc.ve.instr.tngrVisitEdu.eduInfo.service.VEEduAplctVO; +import kcc.ve.instr.tngrVisitEdu.eduInfo.service.VEEduChasiVO; +import kcc.ve.instr.tngrVisitEdu.eduInfo.service.VEEduMIXService; + +/** + * 게시물 관리를 위한 컨트롤러 클래스 + * + * @author 공통 서비스 개발팀 이삼섭 + * @since 2009.03.19 + * @version 1.0 + * @see + * + *
+ * << 개정이력(Modification Information) >>
+ *
+ *   수정일      수정자          수정내용
+ *  -------    --------    ---------------------------
+ *  2009.03.19  이삼섭          최초 생성
+ *  2009.06.29  한성곤	       2단계 기능 추가 (댓글관리, 만족도조사)
+ *  2011.08.31  JJY            경량환경 템플릿 커스터마이징버전 생성
+ *
+ *      
+ */ +@Controller +public class MyPageController { + + // 로그인 체크 util + @Resource(name = "checkLoginUtil") + private CheckLoginUtil checkLoginUtil; + + // 교육과정신청 + @Resource(name = "vEEduMIXService") + private VEEduMIXService vEEduMIXService; + + private static final Logger LOGGER = LoggerFactory.getLogger(MyPageController.class); + + @RequestMapping(value = { "/web/my/myPageDashBoard.do" }) + public String selectFaqListWeb(HttpServletRequest request, @ModelAttribute("searchVO") BoardMasterVO boardMasterVO, + ModelMap model, BoardVO boardVO, RedirectAttributes redirectAttributes) throws Exception { + + LoginVO loginVO = checkLoginUtil.getAuthLoginVO(); // 권한에 따른 로그인 정보 가져오기 + SsoLoginVO ssoLoginVO = checkLoginUtil.getSSOLoginVO(request); // SSO 로그인 정보 가져오기 + + if (loginVO == null || ssoLoginVO == null) { + // 이전 url 처리(beforeSiteUrl)_이준호_220228추가 + return checkLoginUtil.getUserLoginPage(model, request); // 로그인 정보가 없으면 로그인 페이지로 이동한다. +// return checkLoginUtil.getUserLoginPage(model); //로그인 정보가 없으면 로그인 페이지로 이동한다. + } + + /* + * 청소년 진행목록 + */ + { + VEEduAplctVO vEEduAplctVO = new VEEduAplctVO(); + // 청소년 + + // 사용자 교육신청 차시 리스트 + VEEduChasiVO vEEduChasiVO = new VEEduChasiVO(); + vEEduChasiVO.setEduAplctOrd(vEEduAplctVO.getEduAplctOrd()); + vEEduChasiVO.setLctrDivCd(VeConstants.LCTR_DIV_CD_10); + vEEduChasiVO.setAprvlCd(VeConstants.STATUS_CD_EDU_SELCT); + vEEduChasiVO.setUserId(loginVO.getUniqId()); + vEEduChasiVO.setRecordCountPerPage(1000000); + vEEduChasiVO.setFirstIndex(0); + // List vEEduChasiVOList = + // vEEduMIXService.selectChasiList(vEEduChasiVO); + + vEEduChasiVO.setPageIndex(vEEduAplctVO.getPageIndex()); + vEEduChasiVO.setPageUnit(vEEduAplctVO.getPageUnit()); + vEEduChasiVO.setPageSize(vEEduAplctVO.getPageSize()); + + List tngrList = vEEduMIXService.selectChasiListMypage(vEEduChasiVO); + + + Map tngrMap = tngrList.stream() + .collect(Collectors.partitioningBy(vo -> "30".equals(vo.getAsgnmAprvlCd()), Collectors.counting())) + .entrySet().stream() + .collect(Collectors.toMap( + entry -> entry.getKey() ? "tngrEnd" : "tngrIng", + entry -> entry.getValue().toString() + ) + ); + + model.addAttribute("tngrMap", tngrMap); + model.addAttribute("vtngrList", tngrList); + } + + /* + * 성인 진행목록 + */ + { + VEEduAplctVO vEEduAplctVO = new VEEduAplctVO(); + // 청소년 + + // 사용자 교육신청 차시 리스트 + VEEduChasiVO vEEduChasiVO = new VEEduChasiVO(); + vEEduChasiVO.setEduAplctOrd(vEEduAplctVO.getEduAplctOrd()); + vEEduChasiVO.setLctrDivCd(VeConstants.LCTR_DIV_CD_20); + vEEduChasiVO.setAprvlCd(VeConstants.STATUS_CD_EDU_SELCT); + vEEduChasiVO.setUserId(loginVO.getUniqId()); + vEEduChasiVO.setRecordCountPerPage(1000000); + vEEduChasiVO.setFirstIndex(0); + // List vEEduChasiVOList = + // vEEduMIXService.selectChasiList(vEEduChasiVO); + + vEEduChasiVO.setPageIndex(vEEduAplctVO.getPageIndex()); + vEEduChasiVO.setPageUnit(vEEduAplctVO.getPageUnit()); + vEEduChasiVO.setPageSize(vEEduAplctVO.getPageSize()); + + List vEEduChasiVOList = vEEduMIXService.selectChasiListMypage(vEEduChasiVO); + + + Map tngrMap = vEEduChasiVOList.stream() + .collect(Collectors.partitioningBy(vo -> "30".equals(vo.getAsgnmAprvlCd()), Collectors.counting())) + .entrySet().stream() + .collect(Collectors.toMap( + entry -> entry.getKey() ? "adultEnd" : "adultIng", + entry -> entry.getValue().toString() + ) + ); + + model.addAttribute("adultMap", tngrMap); + } +// return "/web/cop/bbs/FaqListAjax"; + return "web/my/myPageDashBoard"; + } + +} diff --git a/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduAplctVO.java b/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduAplctVO.java index 121982e1..c8c21428 100644 --- a/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduAplctVO.java +++ b/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduAplctVO.java @@ -1,6 +1,7 @@ package kcc.ve.instr.tngrVisitEdu.eduInfo.service; import java.io.Serializable; +import java.util.List; import kcc.com.cmm.ComDefaultVO; import kcc.com.cmm.service.FileVO; @@ -156,6 +157,13 @@ public class VEEduAplctVO extends ComDefaultVO implements Serializable { private String qustnrRsltCnt; //설문응답 수량 + private String eduCmpltCrtfcNmbr; + + + + private List eduAplctOrdList; //교육신청순번 + private List sspnIdtmtTrgtOrdList; //교육신청순번 + public int getChasi() { return chasi; } @@ -1807,6 +1815,24 @@ public class VEEduAplctVO extends ComDefaultVO implements Serializable { public void setPrvsQs(String prvsQs) { this.prvsQs = prvsQs; } + public String getEduCmpltCrtfcNmbr() { + return eduCmpltCrtfcNmbr; + } + public void setEduCmpltCrtfcNmbr(String eduCmpltCrtfcNmbr) { + this.eduCmpltCrtfcNmbr = eduCmpltCrtfcNmbr; + } + public List getEduAplctOrdList() { + return eduAplctOrdList; + } + public void setEduAplctOrdList(List eduAplctOrdList) { + this.eduAplctOrdList = eduAplctOrdList; + } + public List getSspnIdtmtTrgtOrdList() { + return sspnIdtmtTrgtOrdList; + } + public void setSspnIdtmtTrgtOrdList(List sspnIdtmtTrgtOrdList) { + this.sspnIdtmtTrgtOrdList = sspnIdtmtTrgtOrdList; + } } diff --git a/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduMIXService.java b/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduMIXService.java index 655997d2..3b48d1e3 100644 --- a/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduMIXService.java +++ b/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/VEEduMIXService.java @@ -42,6 +42,8 @@ public interface VEEduMIXService { List selectChasiList(VEEduChasiVO vEEduChasiVO) throws Exception; + List selectChasiListMypage(VEEduChasiVO vEEduChasiVO) throws Exception; + //설문지 분리 정보 추가(기본, 신청인) List selectChasiList202312(VEEduChasiVO vEEduChasiVO) throws Exception; @@ -92,4 +94,6 @@ public interface VEEduMIXService { //저작권 체험교실 이력 과정 목록 List selectExprnHstryPagingList(VEEduAplctVO paramVO) throws Exception; + + List selectEduCmpltCrtfcNmbrList(VEEduAplctVO vEEduAplctVO) throws Exception; } diff --git a/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/impl/VEEduMIXDAO.java b/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/impl/VEEduMIXDAO.java index 186e8b36..d0a0bcd1 100644 --- a/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/impl/VEEduMIXDAO.java +++ b/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/impl/VEEduMIXDAO.java @@ -105,6 +105,13 @@ public class VEEduMIXDAO extends EgovAbstractDAO { List tlist = (List) list("VEEduMIXDAO.selectChasiList", vEEduChasiVO); return tlist; } + + //차시별 강사배치 리스트 + public List selectChasiListMypage(VEEduChasiVO vEEduChasiVO) throws Exception { + @SuppressWarnings("unchecked") + List tlist = (List) list("VEEduMIXDAO.selectChasiListMypage", vEEduChasiVO); + return tlist; + } //차시별 강사배치 리스트 public List selectChasiList202312(VEEduChasiVO vEEduChasiVO) throws Exception { @@ -228,5 +235,9 @@ public class VEEduMIXDAO extends EgovAbstractDAO { List tlist = (List) list("VEEduMIXDAO.selectExprnHstryPagingList", paramVO); return tlist; } + + public List selectEduCmpltCrtfcNmbrList(VEEduAplctVO vEEduAplctVO) { + return (List) list("VEEduMIXDAO.selectEduCmpltCrtfcNmbrList", vEEduAplctVO); + } } diff --git a/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/impl/VEEduMIXServiceImpl.java b/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/impl/VEEduMIXServiceImpl.java index cec2ee61..13c56126 100644 --- a/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/impl/VEEduMIXServiceImpl.java +++ b/src/main/java/kcc/ve/instr/tngrVisitEdu/eduInfo/service/impl/VEEduMIXServiceImpl.java @@ -90,6 +90,11 @@ public class VEEduMIXServiceImpl implements VEEduMIXService { public List selectChasiList(VEEduChasiVO vEEduChasiVO) throws Exception { return vEEduMIXDAO.selectChasiList(vEEduChasiVO); } + + @Override + public List selectChasiListMypage(VEEduChasiVO vEEduChasiVO) throws Exception { + return vEEduMIXDAO.selectChasiListMypage(vEEduChasiVO); + } @Override public List selectChasiList202312(VEEduChasiVO vEEduChasiVO) throws Exception { @@ -200,5 +205,10 @@ public class VEEduMIXServiceImpl implements VEEduMIXService { public List selectExprnHstryPagingList(VEEduAplctVO paramVO) throws Exception{ return vEEduMIXDAO.selectExprnHstryPagingList(paramVO); + } + + @Override + public List selectEduCmpltCrtfcNmbrList(VEEduAplctVO vEEduAplctVO) throws Exception { + return vEEduMIXDAO.selectEduCmpltCrtfcNmbrList(vEEduAplctVO); } } diff --git a/src/main/java/kcc/ve/oprtn/cndtnSspnIdtmt/web/CndtnPrcsInfoMngController.java b/src/main/java/kcc/ve/oprtn/cndtnSspnIdtmt/web/CndtnPrcsInfoMngController.java index d4dc79d6..e2c117a3 100644 --- a/src/main/java/kcc/ve/oprtn/cndtnSspnIdtmt/web/CndtnPrcsInfoMngController.java +++ b/src/main/java/kcc/ve/oprtn/cndtnSspnIdtmt/web/CndtnPrcsInfoMngController.java @@ -1,6 +1,8 @@ package kcc.ve.oprtn.cndtnSspnIdtmt.web; +import java.util.Comparator; import java.util.List; +import java.util.Optional; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -26,6 +28,7 @@ import kcc.com.cmm.service.EgovFileMngService; import kcc.com.cmm.service.FileVO; import kcc.com.cmm.service.impl.CmmUseDAO; import kcc.com.cmm.util.StringUtil; +import kcc.com.utl.fcc.service.EgovDateUtil; import kcc.com.utl.user.service.CheckLoginUtil; import kcc.let.uat.uia.service.SsoLoginVO; import kcc.let.utl.fcc.service.EgovCryptoUtil; @@ -887,7 +890,14 @@ public class CndtnPrcsInfoMngController { LoginVO loginVO = checkLoginUtil.getAuthLoginVO(); //권한에 따른 로그인 정보 가져오기 SsoLoginVO ssoLoginVO = checkLoginUtil.getSSOLoginVO(request); //SSO 로그인 정보 가져오기 - + +// System.out.println("vEEduAplctVO.getPrcsAplctPrdOrd() : "+ vEEduAplctVO.getPrcsAplctPrdOrd()); + System.out.println("vEEduAplctVO.getEduAplctOrd() : "+ vEEduAplctVO.getEduAplctOrd()); + // 이수 상태라면 + if("20".equals(vEEduAplctVO.getAplctStateCd())) { + vEEduAplctVO.setEduCmpltCrtfcNmbr(this.cmpltChkAndMakeNmber(vEEduAplctVO.getLctrDivCd())); + } + // 신청상세정보 상태값 update vEEduAplctVO.setLastUpdusrId(loginVO.getUniqId()); vEEduMIXService.updateAplctStateCd(vEEduAplctVO); @@ -905,6 +915,29 @@ public class CndtnPrcsInfoMngController { return modelAndView; } + private String cmpltChkAndMakeNmber(String lctrDivCd) throws Exception { + // 현재 년도 + String currentYear = String.valueOf(java.time.Year.now()); + + VEEduAplctVO vEEduAplctVO = new VEEduAplctVO(); + + vEEduAplctVO.setLctrDivCd(lctrDivCd); + + List vEEduAplctVOList = vEEduMIXService.selectEduCmpltCrtfcNmbrList(vEEduAplctVO); + + // 값이 있으면 있는 값에 최대값 구하고 + // 값이 없으면 초기값 설정 + String maxCrtfcNmbr = vEEduAplctVOList.stream() + .map(VEEduAplctVO::getEduCmpltCrtfcNmbr) + .max(Comparator.comparingInt(item -> Integer.parseInt(item.split("-")[1]))) + .orElse( currentYear + "-00000"); // 기본값 설정 + + int nextNumber = Integer.parseInt(maxCrtfcNmbr.split("-")[1]) + 1; + + return currentYear + "-" + String.format("%05d", nextNumber); + } + + /** * 기소유예 신청자 상태값 변경 */ @@ -980,11 +1013,48 @@ public class CndtnPrcsInfoMngController { try { vEPrcsDetailVO.setLastUpdusrId(loginVO.getUniqId()); - // 교육 신청 테이블에 신청자 상태값 update - vEAPrcsAplctPrdInstrAsgnmService.updateAplctStateCdListAjax(vEPrcsDetailVO); + - // 대상자 테이블에 update - vEAPrcsAplctPrdInstrAsgnmService.updateEduStateCdListAjax(vEPrcsDetailVO); +// if("20".equals(vEPrcsDetailVO.getAplctStateCd())) { +// vEPrcsDetailVO.setEduCmpltCrtfcNmbr(this.cmpltChkAndMakeNmber(vEPrcsDetailVO.getLctrDivCd())); +// } +// + + String eduCmpltCrtfcNmbr = ""; + String currentYear = String.valueOf(java.time.Year.now()); + if("20".equals(vEPrcsDetailVO.getAplctStateCd())) { + + for(String eduAplctOrd : vEPrcsDetailVO.getEduAplctOrdList()) { + VEEduAplctVO vEEduAplctVO = new VEEduAplctVO(); + + vEEduAplctVO.setAplctStateCd(vEPrcsDetailVO.getAplctStateCd()); + vEEduAplctVO.setLastUpdusrId(loginVO.getUniqId()); + vEEduAplctVO.setPrcsAplctPrdOrd(vEPrcsDetailVO.getPrcsAplctPrdOrd()); + vEEduAplctVO.setEduAplctOrd(eduAplctOrd); + + if(StringUtils.isEmpty(eduCmpltCrtfcNmbr)) { + + eduCmpltCrtfcNmbr = this.cmpltChkAndMakeNmber(vEPrcsDetailVO.getLctrDivCd()); + }else { + eduCmpltCrtfcNmbr = currentYear + "-" + String.format("%05d", Integer.parseInt(eduCmpltCrtfcNmbr.split("-")[1])+1); + } + vEEduAplctVO.setEduCmpltCrtfcNmbr(eduCmpltCrtfcNmbr); + + vEEduMIXService.updateAplctStateCd(vEEduAplctVO); + + } + }else { + vEAPrcsAplctPrdInstrAsgnmService.updateAplctStateCdListAjax(vEPrcsDetailVO); + + } + + // 교육 신청 테이블에 신청자 상태값 update + + if(vEPrcsDetailVO.getSspnIdtmtTrgtOrdList() != null && !vEPrcsDetailVO.getSspnIdtmtTrgtOrdList().isEmpty()) + { + // 대상자 테이블에 update + vEAPrcsAplctPrdInstrAsgnmService.updateEduStateCdListAjax(vEPrcsDetailVO); + } modelAndView.addObject("result", "success"); } catch (Exception ex) { diff --git a/src/main/resources/egovframework/sqlmap/ve/edu/VEEdu_MIX_SQL_Tibero.xml b/src/main/resources/egovframework/sqlmap/ve/edu/VEEdu_MIX_SQL_Tibero.xml index 245107d7..005cbb38 100644 --- a/src/main/resources/egovframework/sqlmap/ve/edu/VEEdu_MIX_SQL_Tibero.xml +++ b/src/main/resources/egovframework/sqlmap/ve/edu/VEEdu_MIX_SQL_Tibero.xml @@ -3769,6 +3769,7 @@ ON ( B.EDU_APLCT_ORD=D0.EDU_APLCT_ORD AND b.edu_chasi_ord=d0.edu_chasi_ord + AND d0.asgnm_aprvl_cd='30' /* 강사가 교육확정한 경우만 보여짐 */ ) @@ -3855,6 +3856,177 @@ + + /* + LIMIT recordCountPerPage OFFSET firstIndex + */ + OFFSET #firstIndex# ROWS FETCH NEXT #recordCountPerPage# ROWS ONLY; + + + + + + + + diff --git a/src/main/resources/egovframework/sqlmap/ve/prcs/VEAPrcsAplctPrdInstrAsgnm_SQL_Tibero.xml b/src/main/resources/egovframework/sqlmap/ve/prcs/VEAPrcsAplctPrdInstrAsgnm_SQL_Tibero.xml index dc4897f4..5adb786e 100644 --- a/src/main/resources/egovframework/sqlmap/ve/prcs/VEAPrcsAplctPrdInstrAsgnm_SQL_Tibero.xml +++ b/src/main/resources/egovframework/sqlmap/ve/prcs/VEAPrcsAplctPrdInstrAsgnm_SQL_Tibero.xml @@ -137,6 +137,7 @@ UPDATE VEA_APLCT_DETAIL_INFO SET aplct_state_cd = #aplctStateCd# ,aplct_pnttm = SYSDATE + ,edu_cmplt_crtfc_nmbr = #eduCmpltCrtfcNmbr# ,last_updusr_id = #lastUpdusrId# ,last_updt_pnttm = sysdate WHERE edu_aplct_ord IN diff --git a/src/main/webapp/WEB-INF/jsp/oprtn/cndtnSspnIdtmt/cndtnEduPrcsAplctCfnMngDetail.jsp b/src/main/webapp/WEB-INF/jsp/oprtn/cndtnSspnIdtmt/cndtnEduPrcsAplctCfnMngDetail.jsp index 910beb64..00db6ad9 100644 --- a/src/main/webapp/WEB-INF/jsp/oprtn/cndtnSspnIdtmt/cndtnEduPrcsAplctCfnMngDetail.jsp +++ b/src/main/webapp/WEB-INF/jsp/oprtn/cndtnSspnIdtmt/cndtnEduPrcsAplctCfnMngDetail.jsp @@ -100,10 +100,12 @@ function fn_statusChg(aplctStateCd, eduAplctOrd, sspnIdtmtTrgtOrd){ + document.statusChgForm.eduAplctOrd.value = eduAplctOrd ; document.statusChgForm.aplctStateCd.value = aplctStateCd ; document.statusChgForm.eduStateCd.value = aplctStateCd ; document.statusChgForm.sspnIdtmtTrgtOrd.value = sspnIdtmtTrgtOrd ; + var data = new FormData(document.getElementById("statusChgForm")); if(confirm("상태변경을 하시겠습니까?")){ var url = ""; @@ -187,7 +189,8 @@ "sspnIdtmtTrgtOrdList": selectsspnIdtmtTrgtOrd, "aplctStateCd": p_aplctStateCd, "eduStateCd": p_aplctStateCd, - "prcsAplctPrdOrd": p_prcsAplctPrdOrd + "prcsAplctPrdOrd": p_prcsAplctPrdOrd, + "lctrDivCd": '60' }; var url = ""; @@ -246,6 +249,7 @@ + @@ -492,6 +496,7 @@ + diff --git a/src/main/webapp/WEB-INF/jsp/oprtn/fndthEnhanceTrn/fndthEduPrcsAplctCfnMngDetail.jsp b/src/main/webapp/WEB-INF/jsp/oprtn/fndthEnhanceTrn/fndthEduPrcsAplctCfnMngDetail.jsp index 2091c9e6..304a213d 100644 --- a/src/main/webapp/WEB-INF/jsp/oprtn/fndthEnhanceTrn/fndthEduPrcsAplctCfnMngDetail.jsp +++ b/src/main/webapp/WEB-INF/jsp/oprtn/fndthEnhanceTrn/fndthEduPrcsAplctCfnMngDetail.jsp @@ -163,7 +163,8 @@ var dataToSend = { "eduAplctOrdList": selectedEduAplctOrd, "aplctStateCd": p_aplctStateCd, - "prcsAplctPrdOrd": p_prcsAplctPrdOrd + "prcsAplctPrdOrd": p_prcsAplctPrdOrd, + "lctrDivCd": '50' }; var url = ""; @@ -233,6 +234,7 @@ + diff --git a/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp b/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp index 93f7a9e3..1278da46 100644 --- a/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp @@ -253,6 +253,7 @@ function usrJoin(){
+ diff --git a/src/main/webapp/WEB-INF/jsp/web/my/myPageDashBoard.jsp b/src/main/webapp/WEB-INF/jsp/web/my/myPageDashBoard.jsp new file mode 100644 index 00000000..d14b2985 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/my/myPageDashBoard.jsp @@ -0,0 +1,632 @@ + <%-- + Class Name : FaqListAjax.jsp + Description : (사용자)자주하는 질문 Ajax + Modification Information + + 수정일 수정자 수정내용 + ------- -------- --------------------------- + 2009.03.19 이삼섭 최초 생성 + 2011.08.31 JJY 경량환경 버전 생성 + + author : 공통서비스 개발팀 이삼섭 + since : 2009.03.19 +--%> +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="kc" uri="/WEB-INF/tlds/kcc_tld.tld"%> + + + + + +
+ +
+
+
+

마이페이지

+
+ +
+
+ + + +
+
+
+
+
찾아가는 교육 청소년
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + ', '');"> + + + + + + + + +
찾아가는 교육 청소년 목록표
교육일신청유형신청상태설문
${list.eduHopeDt} + + + 대기 + + + 교육신청 + + + 교육승인 + + + 교육반려 + + + 교육취소 + + + 선정완료 + + + 수정요청 + + + 수정완료 + + + 교육확정 + + + 대기 + + + - + + + + + + 제출 + + + 미제출 + + +
+
+
+
+
+
찾아가는 교육 성인
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
찾아가는 교육 성인 목록표
교육일신청유형신청상태설문
2023-07-26오프라인교육예정미완료
2023-07-26온라인교육완료완료
2023-07-21오프라인교육취소-
+
+
+
+
+
+
+
체험교실
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
체험교실 목록표
운영연도교육내용처리상태결과보고서
2023년담당교과운영확정미제출
2022년체육운영종료제출완료
2023년교과수업운영종료제출완료
+
+
+
+
+
실무역량강화 교육
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
실무역량강화 교육 목록표
교육일신청상태설문이수증
2023-07-26오프라인교육예정-
2023-07-26온라인교육완료출력
2023-07-21오프라인교육취소-
+
+
+ + + + + + + +
+ diff --git a/src/main/webapp/WEB-INF/jsp/web/ve/aplct/sspnIdtmt/eduInfo.jsp b/src/main/webapp/WEB-INF/jsp/web/ve/aplct/sspnIdtmt/eduInfo.jsp index 92a536f2..0f452900 100644 --- a/src/main/webapp/WEB-INF/jsp/web/ve/aplct/sspnIdtmt/eduInfo.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/ve/aplct/sspnIdtmt/eduInfo.jsp @@ -88,7 +88,7 @@
- +
diff --git a/src/main/webapp/WEB-INF/jsp/web/ve/aplct/tngrVisitEdu/eduEnd/eduEndList.jsp b/src/main/webapp/WEB-INF/jsp/web/ve/aplct/tngrVisitEdu/eduEnd/eduEndList.jsp index 288ce0e1..96d43ff0 100644 --- a/src/main/webapp/WEB-INF/jsp/web/ve/aplct/tngrVisitEdu/eduEnd/eduEndList.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/ve/aplct/tngrVisitEdu/eduEnd/eduEndList.jsp @@ -1,273 +1,274 @@ -<%-- - - Class Name : eduEndList.jsp - Description : 교육완료 리스트(청소년 찾아가는 교육) - Modification Information - - 수정일 수정자 수정내용 - ------- -------- --------------------------- - 2021.12.02 조용준 내용 - - author : 조용준 - since : 2021.12.02 -/web/ve/aplct/cpyrgExprnClsrm/exprnClsrmInfo/exprnClsrmAplctReg ---%> -<%@ page contentType="text/html; charset=utf-8"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> -<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> -<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> -<%@ taglib prefix="kc" uri="/WEB-INF/tlds/kcc_tld.tld"%> - - - 교육신청 목록 > 청소년 찾아가는 저작권 교육 > 한국저작권위원회 저작권 교육 시스템 - - - - - - -
- - - - " /> - " /> - " /> - - - -
-

완료목록

-
- - -
-
- -
-
-
-
-
- <%-- --%> - -
- ~ -
- <%-- --%> - -
- - - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
번호교육일자신청유형차시학교(기관)명교육장소강의평가
- ', '');"> - - - - ', '');"> - ${list.eduHopeDt} - - - ', '');"> - - - - ', '');"> - - ~ - (분) - - - ', '');"> - - - - ', '');"> - - - - ', '');"> - - - 제출 - - - 미제출 - - - -
-
- -
- -
    -
  • - 번호 - - - -
  • -
  • - 교육일자 - - ${list.eduHopeDt} - -
  • -
  • - 신청유형 - - - -
  • -
  • - 차시 - - - ~ - (분) - -
  • -
  • - 학교(기관)명 - - - -
  • -
  • - 교육장소 - - - -
  • -
  • - 강의 평가 - - - - 제출 - - - 미제출 - - - -
  • -
-
-
- - - -
- -
-
- - -
-
- +<%-- + + Class Name : eduEndList.jsp + Description : 교육완료 리스트(청소년 찾아가는 교육) + Modification Information + + 수정일 수정자 수정내용 + ------- -------- --------------------------- + 2021.12.02 조용준 내용 + + author : 조용준 + since : 2021.12.02 +/web/ve/aplct/cpyrgExprnClsrm/exprnClsrmInfo/exprnClsrmAplctReg +--%> +<%@ page contentType="text/html; charset=utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ taglib prefix="kc" uri="/WEB-INF/tlds/kcc_tld.tld"%> + + + 교육신청 목록 > 청소년 찾아가는 저작권 교육 > 한국저작권위원회 저작권 교육 시스템 + + + + + + +
+ + + + " /> + " /> + " /> + + + +
+

완료목록

+
+ + +
+
+ +
+
+
+
+
+ <%-- --%> + +
+ ~ +
+ <%-- --%> + +
+ + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
번호교육일자신청유형차시학교(기관)명교육장소강의평가
+ ', '');"> + + + + ', '');"> + ${list.eduHopeDt} + + + ', '');"> + + + + ', '');"> + + ~ + (분) + + + ', '');"> + + + + ', '');"> + + + + ', '');"> + + + 제출 + + + 미제출 + + + +
+
+ +
+ +
    +
  • + 번호 + + + +
  • +
  • + 교육일자 + + ${list.eduHopeDt} + +
  • +
  • + 신청유형 + + + +
  • +
  • + 차시 + + + ~ + (분) + +
  • +
  • + 학교(기관)명 + + + +
  • +
  • + 교육장소 + + + +
  • +
  • + 강의 평가 + + + + 제출 + + + 미제출 + + + +
  • +
+
+
+ + + +
+ +
+
+ + +
+
+