온나라 결재 반영
parent
52bd6e7331
commit
44d156fb9b
@ -0,0 +1,618 @@
|
||||
package cokr.xit.adds.core.util;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.Date;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description : Date uitility
|
||||
* 자바 8부터 java.time 패키지 활용
|
||||
* localDate : 날짜 정보만 필요할때
|
||||
* localDateTime : 날짜와 시간 모두 필요할때
|
||||
* localtime : 시간 정보만 필요할때
|
||||
* author : julim
|
||||
* date : 2023-04-28
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2023-04-28 julim 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class DateUtils {
|
||||
|
||||
private static final String DEFAULT_YMD_DT_FMT ="yyyy-MM-dd HH:mm:ss";
|
||||
|
||||
public static Date toDateFromLocalDate(final LocalDate localDate){
|
||||
final Instant instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
|
||||
return Date.from(instant);
|
||||
//return java.sql.Date.valueOf(localDate);
|
||||
}
|
||||
|
||||
public static Date toDateFromLocalDateTime(final LocalDateTime localDateTime){
|
||||
final Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
|
||||
return Date.from(instant);
|
||||
//return java.sql.Timestamp.valueOf(localDateTime);
|
||||
}
|
||||
|
||||
// public static LocalDate toLocalDateFromDate(Date date){
|
||||
// return LocalDate.ofInstant(date.toInstant(), ZoneId.systemDefault());
|
||||
// //return new java.sql.Date(date.getTime()).toLocalDate();
|
||||
// }
|
||||
|
||||
public static LocalDateTime toLocalDateTimeFromDate(final Date date){
|
||||
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
|
||||
//return new java.sql.Timestamp(date.getTime()).toLocalDateTime();
|
||||
}
|
||||
|
||||
/**
|
||||
* LocalDate 객체 반환
|
||||
*
|
||||
* @return LocalDate
|
||||
*/
|
||||
public static LocalDate localDate() {
|
||||
return LocalDate.now();
|
||||
}
|
||||
|
||||
/**
|
||||
* LocalDate.parse 객체 반환
|
||||
*
|
||||
* @param target yyyy-MM-dd
|
||||
* @return LocalDate.parse(tartget);
|
||||
*/
|
||||
public static LocalDate parseLocalDate(final String target) {
|
||||
return LocalDate.parse(target);
|
||||
}
|
||||
|
||||
/**
|
||||
* LocalDateTime 객체 반환
|
||||
*
|
||||
* @return LocalDateTime
|
||||
*/
|
||||
public static LocalDateTime localDateTime() {
|
||||
return LocalDateTime.now();
|
||||
}
|
||||
|
||||
/**
|
||||
* LocalDateTime.parse 객체 반환
|
||||
*
|
||||
* @param target yyyy-MM-dd HH:mm:ss
|
||||
* @return LocalDateTime.parse(tartget);
|
||||
*/
|
||||
public static LocalDateTime parseLocalDateTime(final String target) {
|
||||
return LocalDateTime.parse(target);
|
||||
}
|
||||
|
||||
/**
|
||||
* LocalDateTime.parse 객체 반환
|
||||
*
|
||||
* @param target yyyy-MM-dd HH:mm:ss
|
||||
* @return LocalDateTime.parse(tartget);
|
||||
*/
|
||||
public static LocalDateTime parseLocalDateTimeForm(final String target, final String pattern) {
|
||||
return LocalDateTime.parse(target, DateTimeFormatter.ofPattern(StringUtils.defaultString(pattern, DEFAULT_YMD_DT_FMT)));
|
||||
}
|
||||
|
||||
/**
|
||||
* String format -> long
|
||||
* @param target 20230610115959
|
||||
* @param fmt yyyyMMddHHmmss
|
||||
* @return long long seconds
|
||||
*/
|
||||
public static long parseStringToLong(final String target, final String fmt) {
|
||||
final String format = StringUtils.defaultString(fmt, DEFAULT_YMD_DT_FMT);
|
||||
final LocalDateTime ldt = LocalDateTime.parse(target, DateTimeFormatter.ofPattern(format));
|
||||
return ldt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()/1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* LocalDateTime -> long
|
||||
* @param ldt LocalDateTime
|
||||
* @return long long seconds
|
||||
*/
|
||||
public static long parseToLong(final LocalDateTime ldt) {
|
||||
return ldt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()/1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Date -> long
|
||||
* @param date Date
|
||||
* @return long long seconds
|
||||
*/
|
||||
public static long parseToLong(final Date date) {
|
||||
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())
|
||||
.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()/1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* 현재 년도
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static int getCurrentYear() {
|
||||
return localDate().getYear();
|
||||
}
|
||||
|
||||
/**
|
||||
* 현재 월
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static int getCurrentMonth() {
|
||||
return localDate().getMonthValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* 현재 일
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static int getCurrentDay() {
|
||||
return localDate().getDayOfMonth();
|
||||
}
|
||||
|
||||
/**
|
||||
* 운년 여부
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isLeapYear() {
|
||||
return localDate().isLeapYear();
|
||||
}
|
||||
|
||||
/**
|
||||
* 오늘 날짜 : 년-월-일
|
||||
* BASIC_ISO_DATE : 20200621 리턴
|
||||
*
|
||||
* @return LocalDate
|
||||
*/
|
||||
public static LocalDate getToday() {
|
||||
return localDate();
|
||||
}
|
||||
|
||||
/**
|
||||
* 오늘 날짜 : 년-월-일
|
||||
* BASIC_ISO_DATE : 20200621 리턴
|
||||
*
|
||||
* @param delimiter 년원일 사이 구분자
|
||||
* @return String
|
||||
*/
|
||||
public static String getToday(String delimiter) {
|
||||
final String pattern = "yyyy" + delimiter + "MM" + delimiter + "dd";
|
||||
String result = "";
|
||||
|
||||
try {
|
||||
if (delimiter == null) {
|
||||
result = localDate().format(DateTimeFormatter.BASIC_ISO_DATE);
|
||||
} else {
|
||||
result = localDate().format(DateTimeFormatter.ofPattern(pattern));
|
||||
}
|
||||
} catch (final Exception e) {
|
||||
log.error("DateUtils::getToday", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 오늘 날짜 : 년-월-일 시분초
|
||||
*
|
||||
* @return LocalDate
|
||||
*/
|
||||
public static LocalDateTime getTodayAndNowTime() {
|
||||
return localDateTime();
|
||||
}
|
||||
|
||||
/**
|
||||
* 현재시간 -> long return
|
||||
*
|
||||
* @return long
|
||||
*/
|
||||
public static long getLongTodayAndNowTime() {
|
||||
return localDateTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()/1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* 오늘 날짜 : 년-월-일 시분초
|
||||
*
|
||||
* @param delimiter 년원일 사이 구분자
|
||||
* @param isMillisecond 밀리 세컨드 여부
|
||||
* @return String
|
||||
*/
|
||||
public static String getTodayAndNowTime(final String delimiter, final boolean isMillisecond) {
|
||||
String pattern = "";
|
||||
final String dlr = StringUtils.defaultString(delimiter, "");
|
||||
|
||||
try {
|
||||
pattern = "yyyy" + dlr + "MM" + dlr + "dd" + " HH:mm:ss" + (isMillisecond ? ".SSS" : "");
|
||||
} catch (Exception e) {
|
||||
log.error("DateUtils::getTodayAndNowTime", e);
|
||||
}
|
||||
|
||||
return localDateTime().format(DateTimeFormatter.ofPattern(pattern));
|
||||
}
|
||||
|
||||
/**
|
||||
* 오늘 날짜 : 년-월-일 시분초
|
||||
*
|
||||
* @param userFormat 사용자가 원하는 포멧
|
||||
* @return String
|
||||
*/
|
||||
public static String getTodayAndNowTime(final String userFormat) {
|
||||
String pattern = "";
|
||||
|
||||
try {
|
||||
pattern = DEFAULT_YMD_DT_FMT;
|
||||
if (!StringUtils.isEmpty(userFormat)) {
|
||||
pattern = userFormat;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("DateUtils::getTodayAndNowTime", e);
|
||||
}
|
||||
|
||||
return localDateTime().format(DateTimeFormatter.ofPattern(pattern));
|
||||
}
|
||||
|
||||
/**
|
||||
* 년 월 일 계산
|
||||
* 날짜만 계산 년-월-일 형태로 넘겨줘야함(안그럼 예외)
|
||||
* 해당월에 존재하지 않는 일을 넘겨도 예외
|
||||
* 빼기는 음수를 붙여서 넘기면 된다.
|
||||
* ex : -1 = 빼기 1
|
||||
*
|
||||
* @param targetDate 계산할 년-월-일
|
||||
* @param year 계산할 년
|
||||
* @param month 계산할 월
|
||||
* @param day 계산할 일
|
||||
* @return String
|
||||
*/
|
||||
public static String getCalculatorDate(final String targetDate, final int year, final int month, final int day) {
|
||||
String result = "";
|
||||
|
||||
try {
|
||||
LocalDate localDate = parseLocalDate(targetDate);
|
||||
localDate = localDate.plusYears(year);
|
||||
localDate = localDate.plusMonths(month);
|
||||
localDate = localDate.plusDays(day);
|
||||
result = localDate.toString();
|
||||
} catch (Exception e) {
|
||||
log.error("DateUtils::getCalculatorDate", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 년 월 계산
|
||||
* 년-월-일 형태로 넘겨줘야함(안그럼 예외)
|
||||
* 해당월에 존재하지 않는 일을 넘겨도 예외
|
||||
* 빼기는 음수를 붙여서 넘기면 된다.
|
||||
* ex : -1 = 빼기 1
|
||||
*
|
||||
* @param targetDate 계산할 년-월-일
|
||||
* @param year 계산할 년
|
||||
* @param month 계산할 월
|
||||
* @return String
|
||||
*/
|
||||
public static String getCalculatorDate(String targetDate, int year, int month) {
|
||||
return getCalculatorDate(targetDate, year, month, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 년 계산
|
||||
* 년-월-일 형태로 넘겨줘야함(안그럼 예외)
|
||||
* 해당월에 존재하지 않는 일을 넘겨도 예외
|
||||
* 빼기는 음수를 붙여서 넘기면 된다.
|
||||
* ex : -1 = 빼기 1
|
||||
*
|
||||
* @param targetDate 계산할 년-월-일
|
||||
* @param year 계산할 년
|
||||
* @return String
|
||||
*/
|
||||
public static String getCalculatorDate(final String targetDate, final int year) {
|
||||
return getCalculatorDate(targetDate, year, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 날짜&시간 계산 년-월-일THH:mm:ss 형태(안그럼 예외)
|
||||
* 2020-06-22T23:20:32 ISO 시간 표기법에 따라 'T'를 꼭 붙여야 함.
|
||||
* 빼기는 음수를 붙여서 ex : -1 = 빼기 1
|
||||
*
|
||||
* @param targetDate 계산할 년-월-일T시:분:초
|
||||
* @param year 계산할 년
|
||||
* @param month 계산할 월
|
||||
* @param day 계산할 일
|
||||
* @param hour 계산할 시간
|
||||
* @param minute 계산할 분
|
||||
* @param second 계산할 초
|
||||
* @return String
|
||||
*/
|
||||
public static String getCalculatorDateAndTime(final String targetDate, final int year, final int month, final int day, int hour, int minute, int second) {
|
||||
String result = "";
|
||||
|
||||
try {
|
||||
LocalDateTime localDateTime = parseLocalDateTime(targetDate);
|
||||
localDateTime = localDateTime.plusYears(year);
|
||||
localDateTime = localDateTime.plusMonths(month);
|
||||
localDateTime = localDateTime.plusDays(day);
|
||||
localDateTime = localDateTime.plusHours(hour);
|
||||
localDateTime = localDateTime.plusMinutes(minute);
|
||||
localDateTime = localDateTime.plusSeconds(second);
|
||||
result = localDateTime.toString();
|
||||
} catch (Exception e) {
|
||||
log.error("DateUtils::getCalculatorDateAndTime", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 년 월 일 시 분 계산
|
||||
* 날짜&시간 계산 년-월-일THH:mm:ss 형태(안그럼 예외)
|
||||
* 2020-06-22T23:20:32 ISO 시간 표기법에 따라 'T'를 꼭 붙여야 함.
|
||||
* 빼기는 음수를 붙여서 ex : -1 = 빼기 1
|
||||
*
|
||||
* @param targetDate 계산할 년-월-일T시:분:초
|
||||
* @param year 계산할 년
|
||||
* @param month 계산할 월
|
||||
* @param day 계산할 일
|
||||
* @param hour 계산할 시간
|
||||
* @param minute 계산할 분
|
||||
* @return String
|
||||
*/
|
||||
public static String getCalculatorDateAndTime(final String targetDate, final int year, final int month, final int day, final int hour, final int minute) {
|
||||
return getCalculatorDateAndTime(targetDate, year, month, day, hour, minute, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 년 월 일 시 계산
|
||||
* 2020-06-22T23:20:32 ISO 시간 표기법에 따라 'T'를 꼭 붙여야 함.
|
||||
* 빼기는 음수를 붙여서 ex : -1 = 빼기 1
|
||||
*
|
||||
* @param targetDate 계산할 년-월-일T시:분:초
|
||||
* @param year 계산할 년
|
||||
* @param month 계산할 월
|
||||
* @param day 계산할 일
|
||||
* @param hour 계산할 시간
|
||||
* @return String
|
||||
*/
|
||||
public static String getCalculatorDateAndTime(final String targetDate, final int year, final int month, final int day, final int hour) {
|
||||
return getCalculatorDateAndTime(targetDate, year, month, day, hour, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 년 월 일 계산
|
||||
* 2020-06-22T23:20:32 ISO 시간 표기법에 따라 'T'를 꼭 붙여야 함.
|
||||
* 빼기는 음수를 붙여서 ex : -1 = 빼기 1
|
||||
*
|
||||
* @param targetDate 계산할 년-월-일T시:분:초
|
||||
* @param year 계산할 년
|
||||
* @param month 계산할 월
|
||||
* @param day 계산할 일
|
||||
* @return String
|
||||
*/
|
||||
public static String getCalculatorDateAndTime(final String targetDate, final int year, final int month, final int day) {
|
||||
return getCalculatorDateAndTime(targetDate, year, month, day, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 년 월 계산
|
||||
* 2020-06-22T23:20:32 ISO 시간 표기법에 따라 'T'를 꼭 붙여야 함.
|
||||
* 빼기는 음수를 붙여서 ex : -1 = 빼기 1
|
||||
*
|
||||
* @param targetDate 계산할 년-월-일T시:분:초
|
||||
* @param year 계산할 년
|
||||
* @param month 계산할 월
|
||||
* @return String
|
||||
*/
|
||||
public static String getCalculatorDateAndTime(final String targetDate, final int year, final int month) {
|
||||
return getCalculatorDateAndTime(targetDate, year, month, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 년 계산
|
||||
* 2020-06-22T23:20:32 ISO 시간 표기법에 따라 'T'를 꼭 붙여야 함.
|
||||
* 빼기는 음수를 붙여서 ex : -1 = 빼기 1
|
||||
*
|
||||
* @param targetDate 계산할 년-월-일T시:분:초
|
||||
* @param year 계산할 년
|
||||
* @return String
|
||||
*/
|
||||
public static String getCalculatorDateAndTime(final String targetDate, final int year) {
|
||||
return getCalculatorDateAndTime(targetDate, year, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 2020-06-22
|
||||
* 이전 날짜 확인
|
||||
* sourceDate < compareDate = true
|
||||
* sourceDate > compareDate = false
|
||||
* sourceDate == compareDate = false
|
||||
*
|
||||
* @param sourceDate 시작 년-월-일
|
||||
* @param compareDate 비교 년-월-일
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isBeforeLocalDate(final String sourceDate, final String compareDate) {
|
||||
boolean result = false;
|
||||
|
||||
try {
|
||||
LocalDate source = parseLocalDate(sourceDate);
|
||||
result = source.isBefore(parseLocalDate(compareDate));
|
||||
} catch (Exception e) {
|
||||
log.error("DateUtils::isBeforeLocalDate", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 2020-06-22
|
||||
* 지난 날짜 확인
|
||||
* sourceDate > compareDate = true
|
||||
* sourceDate < compareDate = false
|
||||
* sourceDate == compareDate = false
|
||||
*
|
||||
* @param sourceDate 시작 년-월-일
|
||||
* @param compareDate 비교 년-월-일
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isAfterLocalDate(final String sourceDate, final String compareDate) {
|
||||
boolean result = false;
|
||||
|
||||
try {
|
||||
LocalDate source = parseLocalDate(sourceDate);
|
||||
result = source.isAfter(parseLocalDate(compareDate));
|
||||
} catch (Exception e) {
|
||||
log.error("DateUtils::isAfterLocalDate", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 2020-06-22T22:57:33
|
||||
* 이전 날짜&시간 확인
|
||||
* sourceDate < compareDate = true
|
||||
* sourceDate > compareDate = false
|
||||
* sourceDate == compareDate = false
|
||||
*
|
||||
* @param sourceDate 시작 년월일
|
||||
* @param compareDate 비교 년월일
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isBeforeLocalDateTime(final String sourceDate, final String compareDate) {
|
||||
boolean result = false;
|
||||
|
||||
try {
|
||||
LocalDateTime source = parseLocalDateTime(sourceDate);
|
||||
result = source.isBefore(parseLocalDateTime(compareDate));
|
||||
} catch (final Exception e) {
|
||||
log.error("DateUtils::isBeforeLocalDateTime", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 20230620235733 (Default: 2023-06-20 23:57:33)
|
||||
* pattern: yyyyMMddHHmmss (Default: yyyy-MM-dd HH:mm:ss)
|
||||
* 이전 날짜&시간 확인
|
||||
* sourceDate < compareDate = true
|
||||
* sourceDate > compareDate = false
|
||||
* sourceDate == compareDate = false
|
||||
*
|
||||
* @param sourceDate 시작 년월일
|
||||
* @param compareDate 비교 년월일
|
||||
* @param pattern 년월일 패턴
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isBeforeLocalDateTime(final String sourceDate, final String compareDate, final String pattern) {
|
||||
boolean result = false;
|
||||
|
||||
try {
|
||||
LocalDateTime source = parseLocalDateTimeForm(sourceDate,pattern);
|
||||
result = source.isBefore(parseLocalDateTimeForm(compareDate,pattern));
|
||||
} catch (final Exception e) {
|
||||
log.error("DateUtils::isBeforeLocalDateTime", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 2020-06-22T22:57:33
|
||||
* 지난 날짜&시간 확인
|
||||
* sourceDate > compareDate = true
|
||||
* sourceDate < compareDate = false
|
||||
* sourceDate == compareDate = false
|
||||
*
|
||||
* @param sourceDate 시작 년월일
|
||||
* @param compareDate 비교 년월일
|
||||
* @return boolean
|
||||
*/
|
||||
public static boolean isAfterLocalDateTime(final String sourceDate, final String compareDate) {
|
||||
boolean result = false;
|
||||
|
||||
try {
|
||||
LocalDateTime source = parseLocalDateTime(sourceDate);
|
||||
result = source.isAfter(parseLocalDateTime(compareDate));
|
||||
} catch (final Exception e) {
|
||||
log.error("DateUtils::isAfterLocalDateTime", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 날짜 차이 계산
|
||||
* 2020-06-23 - 2020-06-22 = 1
|
||||
* 2020-06-23 - 2020-06-24 = -1
|
||||
* 앞에꺼 - 뒤에꺼
|
||||
*
|
||||
* @param startDate String
|
||||
* @param endDate String
|
||||
* @return int
|
||||
*/
|
||||
public static int getDateDiffPeriodForLocalDate(final String startDate, final String endDate) {
|
||||
int result = 0;
|
||||
|
||||
try {
|
||||
LocalDate source = parseLocalDate(endDate);
|
||||
result = (int) ChronoUnit.DAYS.between(source, parseLocalDate(startDate));
|
||||
} catch (final Exception e) {
|
||||
log.error("DateUtils::getDateDiffPeriodForLocalDate", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 날짜 차이 계산(시분초까지 계산해줌)
|
||||
* 2020-06-23T23:12:45 - 2020-06-22T23:12:45 = 1
|
||||
* 2020-07-23T23:59:59 - 2020-07-24T23:59:58 = 0
|
||||
* 2020-07-23T23:59:58 - 2020-07-24T23:59:59 = -1
|
||||
* 앞에꺼 - 뒤에꺼
|
||||
*
|
||||
* @param startDate String
|
||||
* @param endDate String
|
||||
* @return int
|
||||
*/
|
||||
public static int getDateDiffPeriodForLocalDateTime(final String startDate, final String endDate) {
|
||||
int result = 0;
|
||||
|
||||
try {
|
||||
LocalDateTime source = parseLocalDateTime(endDate);
|
||||
result = (int) ChronoUnit.DAYS.between(source, parseLocalDateTime(startDate));
|
||||
} catch (final Exception e) {
|
||||
log.error("DateUtils::getDateDiffPeriodForLocalDateTime", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param date
|
||||
* @param sDateFormat
|
||||
* @return
|
||||
*/
|
||||
public static String getFormatedDT(final Date date, final String sDateFormat) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(sDateFormat);
|
||||
return sdf.format(date);
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package cokr.xit.adds.inf.mois.model;
|
||||
|
||||
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
*
|
||||
* packageName : cokr.xit.adds.inf.mois.model
|
||||
* fileName : MoisApiRequest
|
||||
* author : limju
|
||||
* date : 2024-04-21
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-04-21 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Schema(name = "MoisExchangeRequest", description = "전자 결재 연계 request")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public class MoisExchangeRequest {
|
||||
|
||||
/**
|
||||
* 사용자 ID
|
||||
*/
|
||||
@Schema(requiredMode = REQUIRED, title = "사용자ID", description = "사용자ID", example = "admin")
|
||||
@NotEmpty(message = "사용자 ID는 필수 입니다")
|
||||
private String userId;
|
||||
|
||||
/**
|
||||
* 폐기관리 ID - 연계시 administrativeNum(COMMON > ADMINISTRATIVE_NUM으로 사용)
|
||||
*/
|
||||
@Schema(requiredMode = REQUIRED, title = "폐기관리ID", description = "폐기관리ID-행정정보처리번호로 사용", example = "admin")
|
||||
@NotEmpty(message = "폐기관리ID ID는 필수 입니다")
|
||||
private String dscdmngId;
|
||||
|
||||
private List<MultipartFile> files;
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="EUC-KR" ?>
|
||||
<!ELEMENT pack (header, contents)>
|
||||
<!ATTLIST pack filename CDATA #REQUIRED >
|
||||
<!ELEMENT header (type, date, sender, receiver, sender_userid, receiver_userid, sender_email?,sender_orgname, sender_systemname?, administrative_num)>
|
||||
<!ELEMENT type EMPTY>
|
||||
<!ATTLIST type doc-type (send|fail|arrive|receive|invalid|submit|return|approval) #REQUIRED >
|
||||
<!ELEMENT date (#PCDATA)>
|
||||
<!ELEMENT sender (#PCDATA)>
|
||||
<!ELEMENT receiver (#PCDATA)>
|
||||
<!ELEMENT sender_userid (#PCDATA)>
|
||||
<!ELEMENT receiver_userid (#PCDATA)>
|
||||
<!ELEMENT sender_email (#PCDATA)>
|
||||
<!ELEMENT sender_orgname (#PCDATA)>
|
||||
<!ELEMENT sender_systemname (#PCDATA)>
|
||||
<!ELEMENT administrative_num (#PCDATA)>
|
||||
<!ELEMENT contents (content)*>
|
||||
<!ELEMENT content (#PCDATA)>
|
||||
<!ATTLIST content content-role CDATA #REQUIRED >
|
||||
<!ATTLIST content content-transfer-encoding CDATA "base64" >
|
||||
<!ATTLIST content filename CDATA #REQUIRED >
|
||||
<!ATTLIST content content-type CDATA #IMPLIED >
|
||||
<!ATTLIST content charset CDATA #IMPLIED >
|
@ -0,0 +1,21 @@
|
||||
package cokr.xit.adds.inf.mois.service;
|
||||
|
||||
import cokr.xit.adds.inf.mois.model.MoisExchangeRequest;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.adds.inf.mois.service
|
||||
* fileName : InfMoisService
|
||||
* author : limju
|
||||
* date : 2024-05-08
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-05-08 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public interface InfMoisService {
|
||||
void sendExchange(MoisExchangeRequest dto);
|
||||
}
|
@ -0,0 +1,389 @@
|
||||
package cokr.xit.adds.inf.mois.service.bean;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Random;
|
||||
|
||||
import javax.validation.Validation;
|
||||
import javax.validation.Validator;
|
||||
import javax.xml.stream.XMLOutputFactory;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
import javax.xml.stream.XMLStreamWriter;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
|
||||
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
|
||||
|
||||
import cokr.xit.adds.core.spring.exception.ApiCustomException;
|
||||
import cokr.xit.adds.core.util.DateUtils;
|
||||
import cokr.xit.adds.inf.mois.model.ExchangeCommon;
|
||||
import cokr.xit.adds.inf.mois.model.ExchangeDto;
|
||||
import cokr.xit.adds.inf.mois.model.MoisExchangeRequest;
|
||||
import cokr.xit.adds.inf.mois.model.PackDto;
|
||||
import cokr.xit.adds.inf.mois.service.InfMoisService;
|
||||
import cokr.xit.foundation.component.AbstractServiceBean;
|
||||
import cokr.xit.foundation.data.JSON;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.adds.inf.mois.service.bean
|
||||
* fileName : InfMoisServiceBean
|
||||
* author : limju
|
||||
* date : 2024-05-08
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-05-08 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class InfMoisServiceBean extends AbstractServiceBean implements InfMoisService {
|
||||
@Value("${app.inf.mois.sender.systemId}")
|
||||
private String senderSystemId;
|
||||
|
||||
@Value("${app.inf.mois.sender.systemNm}")
|
||||
private String senderSystemNm;
|
||||
|
||||
@Value("${app.inf.mois.sender.orgname}")
|
||||
private String senderOrgname;
|
||||
|
||||
@Value("${app.inf.mois.receiver.systemId}")
|
||||
private String receiverSystemId;
|
||||
|
||||
@Value("${app.inf.mois.receiver.userId}")
|
||||
private String receiverUserId;
|
||||
|
||||
@Value("${app.inf.mois.dataPath.root}")
|
||||
private String dataRootPath;
|
||||
|
||||
@Value("${app.inf.mois.dataPath.sendTemp}")
|
||||
private String sendTemp;
|
||||
|
||||
private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
|
||||
private static JSON json = new JSON();
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 전자결재연계
|
||||
* - exchange.dtd -> exchange.xml, pack.dtd ->
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public void sendExchange(MoisExchangeRequest reqDto) {
|
||||
final String pathName = String.format(
|
||||
"%s%s%s%s%s",
|
||||
receiverUserId,
|
||||
senderSystemId,
|
||||
receiverSystemId,
|
||||
DateUtils.getTodayAndNowTime("YYYYMMDDHHmmss"),
|
||||
new Random().nextInt(100000));
|
||||
|
||||
createHeaderFromPackDto(pathName, getPackDto(reqDto));
|
||||
createEofFile(pathName);
|
||||
createExchangeXml(getExchangeDto(reqDto, pathName), pathName, "exchange");
|
||||
//log.info("sendExchange");
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void createExchangeXml(final ExchangeDto dto, final String pathName, final String filename) {
|
||||
JacksonXmlModule module = new JacksonXmlModule();
|
||||
module.setDefaultUseWrapper(true);
|
||||
XmlMapper mapper = new XmlMapper(module);
|
||||
|
||||
XMLOutputFactory factory = mapper.getFactory().getXMLOutputFactory();
|
||||
|
||||
String dtd = """
|
||||
<!DOCTYPE EXCHANGE SYSTEM "exchange.dtd">
|
||||
""";
|
||||
// FIXME: 파일명 생성
|
||||
final String path = dataRootPath + sendTemp + pathName;
|
||||
try (FileOutputStream w = new FileOutputStream(path + "/" + filename + ".xml")) {
|
||||
XMLStreamWriter sw = factory.createXMLStreamWriter(w, "EUC-KR");
|
||||
//XMLStreamWriter sw = factory.createXMLStreamWriter(w);
|
||||
sw.writeStartDocument("EUC-KR", "1.0");
|
||||
sw.writeDTD("\n"+dtd);
|
||||
mapper.enable(SerializationFeature.INDENT_OUTPUT);
|
||||
mapper.writeValue(sw, dto);
|
||||
|
||||
// ApiUtil.validateXmlFromFile(filename + ".xml", "src/main/resources/xsd/exchange.xsd");
|
||||
|
||||
}catch (IOException | XMLStreamException e) {
|
||||
throw ApiCustomException.create(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void packXmlWriteTest(MoisExchangeRequest reqDto) throws IOException {
|
||||
PackDto dto = getPackDto(reqDto);
|
||||
|
||||
JacksonXmlModule module = new JacksonXmlModule();
|
||||
module.setDefaultUseWrapper(true);
|
||||
XmlMapper mapper = new XmlMapper(module);
|
||||
|
||||
XMLOutputFactory factory = mapper.getFactory().getXMLOutputFactory();
|
||||
|
||||
String dtd = """
|
||||
<!DOCTYPE pack SYSTEM "exchange.dtd">
|
||||
""";
|
||||
// FIXME: 파일명 생성
|
||||
try (FileWriter w = new FileWriter("pack.xml")) {
|
||||
XMLStreamWriter sw = factory.createXMLStreamWriter(w);
|
||||
sw.writeStartDocument("EUC-KR", "1.0");
|
||||
sw.writeDTD("\n"+dtd);
|
||||
mapper.enable(SerializationFeature.INDENT_OUTPUT);
|
||||
mapper.writeValue(sw, dto);
|
||||
|
||||
}catch (IOException | XMLStreamException e) {
|
||||
throw ApiCustomException.create(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private ExchangeDto getExchangeDto(MoisExchangeRequest reqDto, String pathName) {
|
||||
// │ ─ ┃┣┫ ┠ ┨┯┷┏┓┗┛┳⊥┌┐└┘├┤┬┼ ·
|
||||
final String bodyText =
|
||||
"""
|
||||
1. 귀 기관의 무궁한 발전을 기원합니다.
|
||||
2. 사고마약류 등의 폐기 신청 민원에 대하여 마약류관리에 관한 법률 시행규칙 제23조
|
||||
규정에 따라 처리하고 결과를 통보하니 마약류 취급자는 마약류 통합관리시스템
|
||||
(www.nims.go.kr)에 폐기 보고를 즉시 하시기 바랍니다.
|
||||
3. 보고 시 일련번호 및 제조번호 등 항목 누락 및 오입력이 발생하지 않도록 전산 재고 취급에
|
||||
주의를 기울여 주시기 바랍니다.
|
||||
|
||||
※ 마약류 관리법 시행규칙 별표2. 행정처분기준
|
||||
------------------------------------------------------------------------------
|
||||
9. 나. 마약류 취급에 관한 내용을 보고하지 않은 경우(미보고)
|
||||
1차 : 업무정지 15일
|
||||
2차 : 업무정지 1개월
|
||||
3차 : 업무정지 2개월 또는 허가·지정·승인 취소
|
||||
4차 : 허가·지정·승인 취소
|
||||
|
||||
9. 다. 1) 품명, 수량, 취급연월일과 상대방의 성명, 주민등록번호를 보고하지 않거나 변경보고하지 않은 경우
|
||||
1차 : 업무정지 7일
|
||||
2차 : 업무정지 15일
|
||||
3차 : 업무정지 1개월 또는 허가·지정·승인 취소
|
||||
4차 : 허가·지정·승인 취소
|
||||
|
||||
9. 다. 2) 그 밖의 보고 항목을 보고하지 않거나 변경보고하지 않은 경우
|
||||
1차 : 업무정지 3일
|
||||
2차 : 업무정지 7일
|
||||
3차 : 업무정지 15일 또는 허가·지정·승인 취소
|
||||
4차 : 허가·지정·승인 취소
|
||||
------------------------------------------------------------------------------
|
||||
- 폐기 보고 시 관할 관청 기관 코드는 "경기도 용인시 수지보건소/4050149"로 선택
|
||||
- 마약류통합관리시스템 보고 기한: 일반 관리 대상(2024. 56. 10.)
|
||||
""";
|
||||
final String path = dataRootPath + sendTemp + pathName;
|
||||
reqDto.getFiles().forEach(mf -> {
|
||||
//try(FileInputStream fis = (FileInputStream) mf.getInputStream();
|
||||
// FileOutputStream fos = new FileOutputStream(new File(pathName+"/"+mf.getOriginalFilename()));){
|
||||
try{
|
||||
mf.transferTo(new File(path+"/attach_"+mf.getOriginalFilename()));
|
||||
// Files.copy(mf.getInputStream(), fos, StandardCopyOption.REPLACE_EXISTING);
|
||||
}catch (IOException e) {
|
||||
throw ApiCustomException.create(e.getMessage());
|
||||
}
|
||||
});
|
||||
|
||||
// 첨부 파일
|
||||
List<ExchangeDto.Attachment> files = reqDto.getFiles().stream().map(mf ->
|
||||
{
|
||||
try {
|
||||
String filename = new String(Objects.requireNonNull(mf.getOriginalFilename()).getBytes("EUC-KR"), "EUC-KR");
|
||||
return ExchangeDto.Attachment.builder()
|
||||
.filename("attach_"+filename)
|
||||
//.desc("001")
|
||||
.value(filename)
|
||||
.build();
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
).toList();
|
||||
|
||||
ExchangeDto.Common common = ExchangeDto.Common.builder()
|
||||
.sender(
|
||||
ExchangeDto.Sender.builder()
|
||||
.serverid(senderSystemId)
|
||||
.userid(reqDto.getUserId())
|
||||
//.email("ttt@g.co.kr")
|
||||
.build())
|
||||
.receiver(
|
||||
ExchangeDto.Receiver.builder()
|
||||
.serverid(receiverSystemId)
|
||||
.userid(receiverUserId)
|
||||
//.email("ldlldld@k.r")
|
||||
.build())
|
||||
.title("마약류 폐기 결과 보고")
|
||||
.createdDate(DateUtils.getTodayAndNowTime("-", false))
|
||||
.attachnum(files.size())
|
||||
//FIXME: 시스템 키 - 폐기관리ID
|
||||
.administrativeNum(reqDto.getDscdmngId())
|
||||
.build();
|
||||
|
||||
|
||||
ExchangeDto.Docnum docnum = ExchangeCommon.Docnum.builder()
|
||||
.docnumcode("1310000012699")
|
||||
.value("고도화팀-2699")
|
||||
.build();
|
||||
|
||||
ExchangeCommon.Line line1 = ExchangeCommon.Line.builder()
|
||||
.level("1")
|
||||
.sanction(
|
||||
ExchangeCommon.Sanction.builder()
|
||||
.result("상신")
|
||||
.type("기안")
|
||||
.person(
|
||||
ExchangeCommon.Person.builder()
|
||||
.userid("userId")
|
||||
.name("홍길동")
|
||||
.position("전산주사")
|
||||
.dept("고도화팀")
|
||||
.org("행정안전부")
|
||||
.build())
|
||||
.comment("보고자 의견입니다.")
|
||||
.date("2007-01-25 14:45:34")
|
||||
.build())
|
||||
.build();
|
||||
ExchangeCommon.Line line2 = ExchangeCommon.Line.builder()
|
||||
.level("1")
|
||||
.sanction(
|
||||
ExchangeCommon.Sanction.builder()
|
||||
.result("상신")
|
||||
.type("기안")
|
||||
.person(
|
||||
ExchangeCommon.Person.builder()
|
||||
.userid("hongkildong1")
|
||||
.name("홍길동1")
|
||||
.position("전산주사1")
|
||||
.dept("고도화팀1")
|
||||
.org("행정안전부1")
|
||||
.build())
|
||||
.comment("보고자 의견입니다1.")
|
||||
.date("2007-01-25 14:45:34")
|
||||
.build())
|
||||
.build();
|
||||
|
||||
ExchangeDto.Direction direction = ExchangeDto.Direction.builder()
|
||||
.toDocumentSystem(
|
||||
ExchangeDto.ToDocumentSystem.builder()
|
||||
.modificationFlag(
|
||||
ExchangeDto.ModificationFlag.builder()
|
||||
.modifiable(
|
||||
ExchangeDto.Modifiable.builder()
|
||||
.modifyflag("yes")
|
||||
.build())
|
||||
.build())
|
||||
.build()
|
||||
)
|
||||
.build();
|
||||
|
||||
ExchangeDto.Header header = ExchangeDto.Header.builder()
|
||||
.common(common)
|
||||
.direction(direction)
|
||||
.build();
|
||||
|
||||
|
||||
ExchangeDto dto = ExchangeDto.builder()
|
||||
.header(header)
|
||||
.body(bodyText)
|
||||
.attachments(ExchangeDto.Attachments.builder()
|
||||
.attachment(files).build())
|
||||
.build();
|
||||
return dto;
|
||||
}
|
||||
|
||||
private PackDto getPackDto(MoisExchangeRequest dto) {
|
||||
|
||||
PackDto.Header header = PackDto.Header.builder()
|
||||
.type(PackDto.Type.builder()
|
||||
.docType("send")
|
||||
.build())
|
||||
.date(DateUtils.getTodayAndNowTime("-", false))
|
||||
.sender(senderSystemId)
|
||||
.receiver(receiverSystemId)
|
||||
.senderUserid(dto.getUserId())
|
||||
.receiverUserid("receiverUserid")
|
||||
.senderEmail("senderEmail")
|
||||
.senderOrgname(senderOrgname)
|
||||
.senderSystemname(senderSystemNm)
|
||||
.administrativeNum(dto.getDscdmngId())
|
||||
.build();
|
||||
|
||||
PackDto.Content content = PackDto.Content.builder()
|
||||
.contentRole("contentRole")
|
||||
.contentType("constentType")
|
||||
.charset("utf8")
|
||||
.value("content-value")
|
||||
.build();
|
||||
|
||||
PackDto packDto = PackDto.builder()
|
||||
.header(header)
|
||||
.contents(PackDto.Contents.builder()
|
||||
.content(List.of(content))
|
||||
.build())
|
||||
.filename("filename")
|
||||
.build();
|
||||
|
||||
|
||||
return packDto;
|
||||
}
|
||||
|
||||
|
||||
private void createHeaderFromPackDto(final String pathName, final PackDto dto) {
|
||||
final String path = dataRootPath + sendTemp + pathName;
|
||||
File dirPath = new File(path);
|
||||
|
||||
if(!dirPath.exists()){
|
||||
dirPath.mkdirs();
|
||||
}
|
||||
|
||||
PackDto.Header header = dto.getHeader();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("type=").append(header.getType().getDocType()).append("\n");
|
||||
sb.append("date=").append(header.getDate()).append("\n");
|
||||
sb.append("sender=").append(header.getSender()).append("\n");
|
||||
sb.append("receiver=").append(header.getReceiver()).append("\n");
|
||||
sb.append("sender_userid=").append(header.getSenderUserid()).append("\n");
|
||||
sb.append("receiver_userid=").append(header.getReceiverUserid()).append("\n");
|
||||
sb.append("sender_email=").append(header.getSenderEmail()).append("\n");
|
||||
sb.append("sender_orgname=").append(header.getSenderOrgname()).append("\n");
|
||||
sb.append("sender_systemname=").append(header.getSenderSystemname()).append("\n");
|
||||
sb.append("administrative_num=").append(header.getAdministrativeNum()).append("\n");
|
||||
|
||||
try(PrintWriter fw = new PrintWriter(dirPath+"/header.inf", "euc-kr");){
|
||||
fw.write(sb.toString());
|
||||
fw.flush();
|
||||
} catch (FileNotFoundException | UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void createEofFile(final String pathName) {
|
||||
final String path = dataRootPath + sendTemp + pathName;
|
||||
File dirPath = new File(path);
|
||||
|
||||
try(PrintWriter fw = new PrintWriter(dirPath+"/eof.inf", "euc-kr");){
|
||||
fw.write(StringUtils.EMPTY);
|
||||
fw.flush();
|
||||
} catch (FileNotFoundException | UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package cokr.xit.adds.inf.mois.web;
|
||||
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import cokr.xit.adds.inf.mois.model.MoisExchangeRequest;
|
||||
import cokr.xit.adds.inf.mois.service.InfMoisService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* description :
|
||||
* packageName : cokr.xit.adds.inf.mois.web
|
||||
* fileName : InfMoisController
|
||||
* author : limju
|
||||
* date : 2024-05-10
|
||||
* ======================================================================
|
||||
* 변경일 변경자 변경 내용
|
||||
* ----------------------------------------------------------------------
|
||||
* 2024-05-10 limju 최초 생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Tag(name = "InfMoisController", description = "온나라전자결재 Interface API - Api Interface call Test(테스트용)")
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/api/inf/mois/v1")
|
||||
public class InfMoisController {
|
||||
private final InfMoisService infMoisService;
|
||||
|
||||
/**
|
||||
* 온나라 전자결재 송신
|
||||
* multipart/form-data
|
||||
* @param dto
|
||||
*/
|
||||
@Operation(summary = "온나라 전자결재 송신", description = "온나라 전자결재 송신")
|
||||
@PostMapping(value = "/sendExchange", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
|
||||
public void sendExchange(final MoisExchangeRequest dto) {
|
||||
|
||||
infMoisService.sendExchange(dto);
|
||||
}
|
||||
}
|
@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="EUC-KR"?>
|
||||
<!DOCTYPE EXCHANGE SYSTEM "exchange.dtd">
|
||||
<EXCHANGE>
|
||||
<HEADER>
|
||||
<COMMON>
|
||||
<SENDER>
|
||||
<SERVERID>hangjung_groupware1</SERVERID>
|
||||
<USERID>jspark</USERID>
|
||||
</SENDER>
|
||||
<RECEIVER>
|
||||
<SERVERID>hangjung</SERVERID>
|
||||
<USERID>cskim</USERID>
|
||||
</RECEIVER>
|
||||
<TITLE>전보대상자 명단제출</TITLE>
|
||||
<CREATED_DATE>2005-07-15 17:44:06</CREATED_DATE>
|
||||
<ATTACHNUM>0</ATTACHNUM>
|
||||
<ADMINISTRATIVE_NUM>1234</ADMINISTRATIVE_NUM>
|
||||
</COMMON>
|
||||
<DIRECTION>
|
||||
<TO_ADMINISTRATIVE_SYSTEM>
|
||||
<DOCNUM docnumcode="1310505-90">총무-90</DOCNUM>
|
||||
<SANCTION_INFO status="완료">
|
||||
<LINES>
|
||||
<LINE>
|
||||
<LEVEL>1</LEVEL>
|
||||
<SANCTION type="기안" result="상신">
|
||||
<PERSON>
|
||||
<USERID>honggilddong</USERID>
|
||||
<NAME>홍길동</NAME>
|
||||
<POSITION>주사</POSITION>
|
||||
<DEPT>행정정보화팀</DEPT>
|
||||
<ORG>행정자치부</ORG>
|
||||
</PERSON>
|
||||
<DATE>2005-07-16 10:05:03</DATE>
|
||||
</SANCTION>
|
||||
</LINE>
|
||||
<LINE>
|
||||
<LEVEL>2</LEVEL>
|
||||
<SANCTION type="검토" result="승인">
|
||||
<PERSON>
|
||||
<USERID>chulsu</USERID>
|
||||
<NAME>김철수</NAME>
|
||||
<POSITION>사무관</POSITION>
|
||||
<DEPT>행정정보화팀</DEPT>
|
||||
<ORG>행정자치부</ORG>
|
||||
</PERSON>
|
||||
<DATE>2005-07-16 11:05:03</DATE>
|
||||
</SANCTION>
|
||||
</LINE>
|
||||
<LINE>
|
||||
<LEVEL>final</LEVEL>
|
||||
<SANCTION type="전결" result="승인">
|
||||
<PERSON>
|
||||
<USERID>mjkim</USERID>
|
||||
<NAME>김민주</NAME>
|
||||
<POSITION>팀장</POSITION>
|
||||
<DEPT>행정정보화팀</DEPT>
|
||||
<ORG>행정자치부</ORG>
|
||||
</PERSON>
|
||||
<DATE/>
|
||||
</SANCTION>
|
||||
</LINE>
|
||||
</LINES>
|
||||
</SANCTION_INFO>
|
||||
<MODIFICATION_FLAG>
|
||||
<MODIFIABLE/>
|
||||
</MODIFICATION_FLAG>
|
||||
</TO_ADMINISTRATIVE_SYSTEM>
|
||||
</DIRECTION>
|
||||
</HEADER>
|
||||
</EXCHANGE>
|
Loading…
Reference in New Issue