diff --git a/mens-api/src/main/java/kr/xit/core/biz/web/AuthApiController.java b/mens-api/src/main/java/kr/xit/core/biz/web/AuthApiController.java index f81a613..29af15c 100644 --- a/mens-api/src/main/java/kr/xit/core/biz/web/AuthApiController.java +++ b/mens-api/src/main/java/kr/xit/core/biz/web/AuthApiController.java @@ -47,7 +47,7 @@ import lombok.RequiredArgsConstructor; @Tag(name = "AuthApiController", description = "인증 관리") @RequiredArgsConstructor @RestController -@RequestMapping(value = "/api/core/auth") +@RequestMapping(value = "/api/auth") public class AuthApiController { @Value("${app.token.saveType:header}") private String authSaveType; diff --git a/mens-api/src/main/java/kr/xit/core/biz/web/CmmFileMgtController.java b/mens-api/src/main/java/kr/xit/core/biz/web/CmmFileMgtController.java new file mode 100644 index 0000000..184af8e --- /dev/null +++ b/mens-api/src/main/java/kr/xit/core/biz/web/CmmFileMgtController.java @@ -0,0 +1,40 @@ +package kr.xit.core.biz.web; + +import io.swagger.v3.oas.annotations.tags.Tag; +import kr.xit.biz.ens.model.cmm.CmmEnsFileDTO.FmcExcelUpload; +import kr.xit.core.model.ApiResponseDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *
+ * description : + * + * packageName : kr.xit.core.biz.web + * fileName : CmmFileMgtController + * author : limju + * date : 2023-09-04 + * ====================================================================== + * 변경일 변경자 변경 내용 + * ---------------------------------------------------------------------- + * 2023-09-04 limju 최초 생성 + * + *+ */ +@Slf4j +@Tag(name = "CmmFileMgtController", description = "파일 관리") +@RestController +@RequestMapping(value = "/api/cmm") +public class CmmFileMgtController { + @PostMapping(value = "/fileUpload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public ApiResponseDTO> saveFiles(@ModelAttribute FmcExcelUpload fileReq) { + //cmmFileMst, fileReq.getFiles())); + log.debug("{}", fileReq); + log.debug("{}", fileReq.getFiles()[0].getOriginalFilename()); + return null; + } +} diff --git a/mens-api/src/main/java/kr/xit/core/spring/config/SpringDocsApiConfig.java b/mens-api/src/main/java/kr/xit/core/spring/config/SpringDocsApiConfig.java index 6fc37b4..c27fa0a 100644 --- a/mens-api/src/main/java/kr/xit/core/spring/config/SpringDocsApiConfig.java +++ b/mens-api/src/main/java/kr/xit/core/spring/config/SpringDocsApiConfig.java @@ -26,9 +26,10 @@ public class SpringDocsApiConfig { @Bean public GroupedOpenApi authentification() { return GroupedOpenApi.builder() - .group("1. Core API") + .group("1. Common API") .pathsToMatch( - "/api/core/**" + "/api/auth/**", + "/api/cmm/**" ) .build(); } diff --git a/mens-api/src/main/java/kr/xit/ens/support/cmm/service/CmmEnsFileService.java b/mens-api/src/main/java/kr/xit/ens/support/cmm/service/CmmEnsFileService.java new file mode 100644 index 0000000..bb8fd49 --- /dev/null +++ b/mens-api/src/main/java/kr/xit/ens/support/cmm/service/CmmEnsFileService.java @@ -0,0 +1,113 @@ +package kr.xit.ens.support.cmm.service; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import kr.xit.biz.ens.model.cmm.CmmEnsFileDTO.FmcExcel; +import kr.xit.biz.ens.model.cmm.CmmEnsFileDTO.FmcExcelUpload; +import kr.xit.core.exception.BizRuntimeException; +import kr.xit.core.spring.util.ApiWebClient; +import kr.xit.core.support.xlsx.StreamingReader; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +/** + *
+ * description : + * + * packageName : kr.xit.ens.support.cmm.service + * fileName : CmmEnsFileService + * author : limju + * date : 2023-09-05 + * ====================================================================== + * 변경일 변경자 변경 내용 + * ---------------------------------------------------------------------- + * 2023-09-05 limju 최초 생성 + * + *+ */ +@Slf4j +@RequiredArgsConstructor +@Service +public class CmmEnsFileService extends EgovAbstractServiceImpl implements ICmmEnsFileService{ + private final static int FMC_EXCEL_DATA_START_ROW = 3; + private final static int FMC_EXCEL_CELL_CNT = 7; + + private final ApiWebClient webClient; + private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); + + @Override + public void fmcExcelUpload(FmcExcelUpload fileReq) { + Set
+ * description : + * + * packageName : kr.xit.ens.support.cmm.service + * fileName : ICmmEnsFileService + * author : limju + * date : 2023-09-05 + * ====================================================================== + * 변경일 변경자 변경 내용 + * ---------------------------------------------------------------------- + * 2023-09-05 limju 최초 생성 + * + *+ */ +public interface ICmmEnsFileService { + + void fmcExcelUpload(FmcExcelUpload fileReq); +} diff --git a/mens-api/src/main/java/kr/xit/ens/support/cmm/web/CmmEnsFileController.java b/mens-api/src/main/java/kr/xit/ens/support/cmm/web/CmmEnsFileController.java new file mode 100644 index 0000000..1f8b34e --- /dev/null +++ b/mens-api/src/main/java/kr/xit/ens/support/cmm/web/CmmEnsFileController.java @@ -0,0 +1,52 @@ +package kr.xit.ens.support.cmm.web; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import kr.xit.biz.ens.model.cmm.CmmEnsFileDTO.FmcExcelUpload; +import kr.xit.core.model.ApiResponseDTO; +import kr.xit.ens.support.cmm.service.ICmmEnsFileService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *
+ * description : 전자고지 연계 파일 관련 처리 + * + * packageName : kr.xit.ens.support.cmm.web + * fileName : CmmFileMgtController + * author : limju + * date : 2023-09-04 + * ====================================================================== + * 변경일 변경자 변경 내용 + * ---------------------------------------------------------------------- + * 2023-09-04 limju 최초 생성 + * + *+ */ +@Slf4j +@Tag(name = "CmmEnsFileController", description = "전자고지 연계 파일 관련 처리") +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/api/cmm") +public class CmmEnsFileController { + + private final ICmmEnsFileService service; + + /** + * 시설관리공단(Facility Management Corporation) 전자고지 대상 + * @param fileReq + * @return + */ + @Operation(summary = "시설관리공단 전자고지 대상 엑셀업로드 처리", description = "시설관리공단 전자고지 대상 엑셀업로드 처리") + @PostMapping(value = "/fmcExcelUpload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public ApiResponseDTO> fmcExcelUpload(@ModelAttribute FmcExcelUpload fileReq) { + service.fmcExcelUpload(fileReq); + //fileReq.setFiles(null); + return ApiResponseDTO.success(fileReq); + } +} diff --git a/mens-batch/src/main/resources/egovframework/mapper/biz/ens-mysql-mapper.xml b/mens-batch/src/main/resources/egovframework/mapper/biz/ens-mysql-mapper.xml index dca063e..84ce1b6 100644 --- a/mens-batch/src/main/resources/egovframework/mapper/biz/ens-mysql-mapper.xml +++ b/mens-batch/src/main/resources/egovframework/mapper/biz/ens-mysql-mapper.xml @@ -12,15 +12,15 @@ , tcsm.tmplat_id , tcsm.sndng_co , tcsm.sndng_process_sttus - , tcsm.sndng_dt + , tcsm.sndng_dt , tetm.try1 , tetm.try2 , tetm.try3 - , tetm.try2_minute - , tetm.try3_minute + , tetm.try2_minute + , tetm.try3_minute FROM tb_cntc_sndng_mastr tcsm JOIN tb_ens_tmplat_manage tetm - ON tcsm.tmplat_id = tetm.tmplat_id + ON tcsm.tmplat_id = tetm.tmplat_id WHERE sndng_process_sttus = #{sndngProcessSttus} @@ -28,34 +28,34 @@ /** ens-mysql-mapper|insertUnitySndngMst-통합발송마스터 생성|julim */ INSERT INTO tb_ens_unity_sndng_mastr ( - unity_sndng_mastr_id, /* 통합발송마스터 ID */ - signgu_code, /* 시군구 코드 */ - ffnlg_code, /* 과태료 코드 */ - tmplat_id, /* 템플릿 Id */ - sndng_ty_code, /* 발송유형 코드 */ - sndng_co, /* 발송건수 */ - sndng_process_sttus, /* 발송처리 상태 */ - sndng_dt_1, /* 발송 일시 */ - sndng_dt_2, /* 발송 일시2 */ - sndng_dt_3, /* 발송 일시3 */ - try1, - try2, - try3, - try_cnt, - clos_dt, /* 마감일시 */ - regist_dt, - register + unity_sndng_mastr_id, /* 통합발송마스터 ID */ + signgu_code, /* 시군구 코드 */ + ffnlg_code, /* 과태료 코드 */ + tmplat_id, /* 템플릿 Id */ + sndng_ty_code, /* 발송유형 코드 */ + sndng_co, /* 발송건수 */ + sndng_process_sttus, /* 발송처리 상태 */ + sndng_dt_1, /* 발송 일시 */ + sndng_dt_2, /* 발송 일시2 */ + sndng_dt_3, /* 발송 일시3 */ + try1, + try2, + try3, + try_cnt, + clos_dt, /* 마감일시 */ + regist_dt, + register ) SELECT tcsm.unity_sndng_mastr_id /* 통합발송마스터 ID */ - , tcsm.signgu_code /* 시군구 코드 */ - , tcsm.ffnlg_code /* 과태료 코드 */ - , tcsm.tmplat_id /* 템플릿 Id */ - , tetm.sndng_ty_code /* 발송유형 코드 */ - , tcsm.sndng_co /* 발송건수 */ + , tcsm.signgu_code /* 시군구 코드 */ + , tcsm.ffnlg_code /* 과태료 코드 */ + , tcsm.tmplat_id /* 템플릿 Id */ + , tetm.sndng_ty_code /* 발송유형 코드 */ + , tcsm.sndng_co /* 발송건수 */ , 'accept-ok' /* 발송처리 상태 */ , tcsm.sndng_dt - , #{sndngDt2} - , #{sndngDt3} + , #{sndngDt2} + , #{sndngDt3} , tetm.try1 , tetm.try2 , tetm.try3 @@ -63,7 +63,7 @@ THEN 3 ELSE IF(IFNULL(tetm.try2, '') != '', 2, 1) END /* try3 값이 있으면 3, try2 값이 있으면 2, try1 */ - , clos_dt /* 마감일시 */ + , clos_dt /* 마감일시 */ , now() , 'batch' FROM tb_cntc_sndng_mastr tcsm @@ -78,52 +78,52 @@ INSERT INTO tb_ens_unity_sndng_detail ( unity_sndng_detail_id, /* 통합발송상세 ID*/ - unity_sndng_mastr_id, /* 통합발송마스터 ID */ - signgu_code, /* 시군구 코드 */ - ffnlg_code, /* 과태료 코드 */ - main_code, + unity_sndng_mastr_id, /* 통합발송마스터 ID */ + signgu_code, /* 시군구 코드 */ + ffnlg_code, /* 과태료 코드 */ + main_code, vhcle_no, /* 차량번호 */ - ihidnum, /* 주민번호 */ - moblphon_no, /* 전화번호 */ - nm, /* 이름 */ - adres, /* 주소 */ - detail_adres, /* 상세주소 */ - zip, /* 우편번호 */ - tmplt_msg_data, /* 템플릿메세지 데이타 */ - mobile_page_cn, /* 모바일페이지내용 */ - use_instt_idntfc_id, /* 이용기관식별Id*/ - regist_dt, - register + ihidnum, /* 주민번호 */ + moblphon_no, /* 전화번호 */ + nm, /* 이름 */ + adres, /* 주소 */ + detail_adres, /* 상세주소 */ + zip, /* 우편번호 */ + tmplt_msg_data, /* 템플릿메세지 데이타 */ + mobile_page_cn, /* 모바일페이지내용 */ + use_instt_idntfc_id, /* 이용기관식별Id*/ + regist_dt, + register ) SELECT tcsd.unity_sndng_detail_id /* 통합발송상세 ID*/ , tcsd.unity_sndng_mastr_id /* 통합발송마스터 ID */ - , tcsd.signgu_code /* 시군구 코드 */ - , tcsd.ffnlg_code /* 과태료 코드 */ + , tcsd.signgu_code /* 시군구 코드 */ + , tcsd.ffnlg_code /* 과태료 코드 */ , tcsd.main_code - , tcsd.vhcle_no /* 차량번호 */ + , tcsd.vhcle_no /* 차량번호 */ , tcsd.ihidnum /* 주민번호 */ , tcsd.moblphon_no /* 전화번호 */ - , tcsd.nm /* 이름 */ + , tcsd.nm /* 이름 */ , tcsd.adres /* 주소 */ , tcsd.detail_adres /* 상세주소 */ , tcsd.zip /* 우편번호 */ , tcsd.tmplt_msg_data /* 템플릿메세지 데이타 */ , tcsd.mobile_page_cn /* 모바일페이지내용 */ , tcsd.use_instt_idntfc_id /* 이용기관식별Id*/ - , now() - , 'batch' - FROM tb_cntc_sndng_mastr tcsm - JOIN tb_cntc_sndng_detail tcsd - ON tcsm.unity_sndng_mastr_id = tcsd.unity_sndng_mastr_id + , now() + , 'batch' + FROM tb_cntc_sndng_mastr tcsm + JOIN tb_cntc_sndng_detail tcsd + ON tcsm.unity_sndng_mastr_id = tcsd.unity_sndng_mastr_id WHERE tcsm.unity_sndng_mastr_id = #{unitySndngMastrId} - AND tcsm.sndng_process_sttus = #{sndngProcessSttus} + AND tcsm.sndng_process_sttus = #{sndngProcessSttus}
+ * description : 전자고지 파일 관련 DTO + * + * packageName : kr.xit.biz.ens.model.cmm + * fileName : CmmEnsFileDTO + * author : limju + * date : 2023-09-04 + * ====================================================================== + * 변경일 변경자 변경 내용 + * ---------------------------------------------------------------------- + * 2023-09-04 limju 최초 생성 + * + *+ */ +public class CmmEnsFileDTO { + @Schema(name = "FmcExcelUpload", description = "시설관리공단 전자문서 발송대상 엑셀 파일 업로드 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class FmcExcelUpload { + + //----------------------------------------------------------------------------------- + // 시설관리공단 전자고지 대상 엑셀파일 업로드 필수 속성 + //----------------------------------------------------------------------------------- + /** + * 시스템구분코드 : 필수 + * 공영주차장|장사시설 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "시스템구분코드", example = "???", description = "시스템구분코드") + @Size(min = 1, max = 5, message = "시스템 구분은 필수 입니다") + private String sysSeCode; + + /** + * 발송구분코드 : 필수 + * KKO-MY-DOC|KT-SMS|E-GREEN + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송구분코드", example = "KKO-MY-DOC", description = "KKO-MY-DOC|KT-SMS|E-GREEN") + @Size(min = 1, max = 10, message = "발송구분은 필수 입니다") + private String sndngSeCode; + + /** + * 발송일시 : 필수 + * 전자문서를 발송할 일시 - yyyyMMdd + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "발송일시", example = "20230905", description = "발송일시") + @Size(min = 8, max = 8, message = "발송일은 필수 입니다") + private String sndngDt; + + /** + * excel file : 필수 + */ + @JsonIgnore + @Schema(requiredMode = RequiredMode.REQUIRED, title = "excel file", example = "null", description = "업로드 excel file") + @NotNull(message = "첨부파일은 필수 입니다") + private MultipartFile[] files; + + + //----------------------------------------------------------------------------------- + // 시설관리공단 전자고지 대상 엑셀파일 업로드 결과 속성 + //----------------------------------------------------------------------------------- + /** + * 발송건수 : response + * 엑셀업로드 건수 + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "발송 건수", example = "0", description = "발송건수") + private int sndngCo; + + /** + * 통합발송마스터ID : response + * 엑셀업로드 건에 대한 마스터 정보 key - 엑셀 업로드 파일 건당 생성 + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "통합발송마스터ID", example = "0", description = "통합발송마스터ID") + private String unitySndngMastrId; + } + + @Schema(name = "FmcExcel", description = "시설관리공단 전자문서 발송대상 엑셀 파일 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class FmcExcel { + + //----------------------------------------------------------------------------------- + // 시설관리공단 전자고지 대상 엑셀파일 업로드 필수 속성 + //----------------------------------------------------------------------------------- + /** + * 통합발송상세ID : 필수 + * 시설관리공단의 마스터key - unique key 이어야 함 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "통합발송상세ID", example = " ", description = "통합발송상세ID") + private String unitySndngDetailId; + + /** + * 이름 : 필수 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "이름", example = " ", description = "이름") + private String nm; + + /** + * 주민번호 : 필수 + */ + @Schema(requiredMode = RequiredMode.REQUIRED, title = "주민번호", example = " ", description = "주민번호") + private String ihidnum; + + //----------------------------------------------------------------------------------- + // 카카오 | KT-SMS 필수 + //----------------------------------------------------------------------------------- + /** + * 전화번호 : 카카오|KT-SMS 필수 + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "전화번호", example = " ", description = "전화번호-카카오|KT 필수") + private String moblphonNo; + + + //----------------------------------------------------------------------------------- + // e-GREEN 필수 + //----------------------------------------------------------------------------------- + /** + * 주소 : e-GREEN 필수 + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "주소", example = " ", description = "주소-e-GREEN필수") + private String adres; + + /** + * 상세주소 : e-GREEN 필수 + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "상세주소", example = " ", description = "상세주소-e-GREEN필수") + private String detailAdres; + + /** + * 우편번호 : e-GREEN 필수 + */ + @Schema(requiredMode = RequiredMode.AUTO, title = "우편번호", example = " ", description = "우편번호-e-GREEN필수") + private String zip; + } +} diff --git a/mens-core/src/main/java/kr/xit/core/model/ApiResponseDTO.java b/mens-core/src/main/java/kr/xit/core/model/ApiResponseDTO.java index 69a0f42..e05371d 100644 --- a/mens-core/src/main/java/kr/xit/core/model/ApiResponseDTO.java +++ b/mens-core/src/main/java/kr/xit/core/model/ApiResponseDTO.java @@ -1,5 +1,6 @@ package kr.xit.core.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import java.io.Serializable; import java.util.Collection; import java.util.HashMap; @@ -68,6 +69,7 @@ public class ApiResponseDTO