From 5e94a3ebb719836066b4fefdbecd268fd5ae4a6c Mon Sep 17 00:00:00 2001 From: "Jonguk. Lim" Date: Mon, 27 May 2024 18:54:58 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=8F=90=EA=B8=B0=EC=8B=A0=EC=B2=AD?= =?UTF-8?q?=EC=84=9C=EC=A0=91=EC=88=98,=20=ED=86=B5=EB=B3=B4[=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC]=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xit/adds/biz/nims/dao/BizNimsMapper.java | 2 + .../adds/biz/nims/model/BizNimsRequest.java | 257 ++++++++++++++---- .../adds/biz/nims/service/BizNimsService.java | 4 + .../nims/service/bean/BizNimsServiceBean.java | 93 ++++++- .../adds/biz/nims/web/BizNimsController.java | 44 ++- .../java/cokr/xit/adds/core/Constants.java | 29 +- .../cokr/xit/adds/core/util/JsonUtils.java | 2 +- .../mois/service/bean/InfMoisServiceBean.java | 14 +- src/main/resources/application.yml | 4 + .../sql/mapper/biz/nims-mysql-mapper.xml | 45 +++ .../resources/static/dsuseMgtReceipt.html | 100 +++++++ src/main/resources/static/dsuseMgtRslt.html | 80 ++++++ 12 files changed, 598 insertions(+), 76 deletions(-) create mode 100644 src/main/resources/static/dsuseMgtReceipt.html create mode 100644 src/main/resources/static/dsuseMgtRslt.html diff --git a/src/main/java/cokr/xit/adds/biz/nims/dao/BizNimsMapper.java b/src/main/java/cokr/xit/adds/biz/nims/dao/BizNimsMapper.java index 4bef651..08b83af 100644 --- a/src/main/java/cokr/xit/adds/biz/nims/dao/BizNimsMapper.java +++ b/src/main/java/cokr/xit/adds/biz/nims/dao/BizNimsMapper.java @@ -40,6 +40,8 @@ public interface BizNimsMapper extends AbstractMapper { //------------------------------------------------------------------------------------------------------ // NIMS BIZ //------------------------------------------------------------------------------------------------------ + int insertDsuseMgtReceipt(final BizNimsRequest.DsuseMgtReceipt dto); + int updateDsuseMgtRslt(final BizNimsRequest.DsuseMgtRslt dto); int insertDsuseMgt(final BizNimsRequest.DsuseMgt dto); int insertDsuseMgtDtl(final BizNimsRequest.DsuseMgtDtl dto); List selectDsuseMgts(final BizNimsRequest.DsuseMgtInq dto); diff --git a/src/main/java/cokr/xit/adds/biz/nims/model/BizNimsRequest.java b/src/main/java/cokr/xit/adds/biz/nims/model/BizNimsRequest.java index a119780..956e5ec 100644 --- a/src/main/java/cokr/xit/adds/biz/nims/model/BizNimsRequest.java +++ b/src/main/java/cokr/xit/adds/biz/nims/model/BizNimsRequest.java @@ -21,6 +21,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; @@ -38,68 +39,163 @@ import lombok.experimental.SuperBuilder; * */ public class BizNimsRequest { - /** - * 마약류 폐기 관리 마스터 request + * 마약류 폐기 관리 신청서 접수 request */ - @Schema(name = "DsuseMgt", description = "마약류 폐기 관리 마스터 DTO") - @Data + @Schema(name = "DsuseMgtReceipt", description = "마약류 폐기 관리 신청서 접수 DTO") + @Getter + //@Setter @NoArgsConstructor - @AllArgsConstructor @SuperBuilder @EqualsAndHashCode(callSuper = false) - public static class DsuseMgt2 extends AuditDto { + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class DsuseMgtReceipt extends AuditDto { + /** + * 폐기 관리 ID + */ @Schema(requiredMode = AUTO, title = "폐기 관리 ID", example = " ") private String dscdmngId; + /** + * 사용자 ID + */ @Schema(requiredMode = REQUIRED, title = "사용자 ID", example = " ") @NotEmpty(message = "사용자 ID는 필수 입니다") private String userId; /** *
-		 * 원 사용자 보고 식별 번호
-		 * 폐기 보고 생성시의 사용자 보고 식별 번호
-		 * 생성 > 변경 > 변경 > 취소 등의 보고시 매번 새로운 보고식별번호가 생성
-		 * => 추적을 위해 최초의 생성시 보고식별번호를 기록
-		 * YYYYMMDD
+		 * 폐기관리진행상태 - ADDS11
+		 * 01-폐기신청서 접수
+		 * 06-폐기통보서작성
+		 * 07-폐기내역서작성
+		 * 11-폐기보고확인
+		 * 21-폐기보고
+		 * 99-폐기보고완료
 		 * 
*/ - @Schema(requiredMode = REQUIRED, title = "원사용자보고식별번호", example = " ") - private String orgUsrRptIdNo; + @Schema(title = "폐기관리진행상태", example = "01") + @NotEmpty(message = "폐기관리진행상태는 필수 입니다") + private String prgrsSttsCd = Constants.PRGRS_STTS_CD.RECEIPT.getCode(); + + /** + * 마약류취급자식별번호 + */ + @Schema(title = "마약류취급자식별번호", example = "H00008333") + @NotEmpty(message = "마약류취급자식별번호는 필수 입니다") + private String bsshCd; + + /** + * 수불상세보고수 + */ + @Schema(requiredMode = REQUIRED, title = "수불상세보고수", example = "1") + @Positive(message="폐기보고 제품 건수(제품수불상세보고수)를 입력해 주세요(ex. 1)") + private Integer rndDtlRptCnt; /** *
-		 * 사용자 보고 식별 번호
-		 * 생성후 변경이나 취소시 새로운 보고식별번호로 update
+		 * 폐기 사유 코드
+		 * 01-파손, 02-변질,부패, 03-유효기간 또는 사용기한 경과
+		 * 04-유효 기간 임박, 05-사용 중단, 07-폐업, 08-환자 반납
+		 * 09-기타, 12-제조 공정중 폐기물
 		 * 
*/ - @Schema(requiredMode = REQUIRED, title = "사용자보고식별번호", example = " ") - private String usrRptIdNo; + @Schema(title = "폐기 사유 코드", example = "03") + @NotEmpty(message = "폐기 사유 코드는 필수 입니다") + private String dsusePrvCd; + } + + /** + * 마약류 폐기 관리 통보 및 결과 처리 request + */ + @Schema(name = "DsuseMgtRslt", description = "마약류 폐기 관리 통보 및 결과 처리 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @EqualsAndHashCode(callSuper = false) + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class DsuseMgtRslt extends AuditDto { + /** + * 폐기 관리 ID + */ + @Schema(requiredMode = REQUIRED, title = "폐기 관리 ID", example = " ") + private String dscdmngId; /** - * 마약류취급자식별번호 + * 사용자 ID */ - @JsonProperty(value = "BSSH_CD", required = true) - private String bsshCd; + @Schema(requiredMode = REQUIRED, title = "사용자 ID", example = " ") + @NotEmpty(message = "사용자 ID는 필수 입니다") + private String userId; /** *
-		 * 진행상태
-		 *
+		 * 폐기관리진행상태 - ADDS11
 		 * 01-폐기신청서 접수
-		 * 02-폐기보고 매핑
-		 * 11-민원수령처리(전자결재)
-		 * 21-폐기결과통보서 작성
-		 * 22-폐기결과보고서 작성
-		 * 31-기안 및 발송
-		 * 41-폐기보고
-		 * 99-종료
+		 * 06-폐기통보서작성
+		 * 07-폐기내역서작성
+		 * 11-폐기보고확인
+		 * 21-폐기보고
+		 * 99-폐기보고완료
 		 * 
*/ - @Schema(requiredMode = REQUIRED, title = "진행 상태 코드", example = " ", allowableValues = {"01", "02", "11", "21", "22", "31", "41", "99"}) - @Pattern(regexp = "01|02|11|22|31|41|99", message = "진행 상태 코드는 필수 입니다") + @Schema(title = "폐기관리진행상태", example = "01") + @NotEmpty(message = "폐기관리진행상태는 필수 입니다") private String prgrsSttsCd = Constants.PRGRS_STTS_CD.RECEIPT.getCode(); + + /** + *
+		 * 취급일자 - 폐기신청민원 처리일자(공문시행일자)
+		 * 
+ */ + @Schema(title = "취급일자", example = " ") + @Pattern(regexp = Constants.DATE_REGX, message = "취급일자를 정확히 입력해 주세요(yyyyMMdd)") + private String hdrDe; + + /** + * 보고일자 + */ + @Schema(title = "보고일자", example = " ") + @Pattern(regexp = Constants.DATE_REGX, message = "보고일자를 정확히 입력해 주세요(yyyyMMdd)") + private String rptDe; + + /** + *
+		 * 폐기 구분 코드
+		 * 1-보건소폐기, 2-공무원임회, 4-도난/분실/재해 발생 사고마약류
+		 * 
+ */ + @Schema(title = "폐기 구분 코드", example = " ") + @NotEmpty(message = "폐기 구분 코드는 필수 입니다") + private String dsuseSeCd; + + /** + *
+		 * 폐기 방법 코드
+		 * 1-소각, 2-중화, 3-가수 분해, 4-산화, 5-환원
+		 * 6-희석, 7-매물, 8-기타(파쇄,혼합), 9-사고
+		 * 
+ */ + @Schema(title = "폐기 방법 코드", example = " ") + @NotEmpty(message = "폐기 방법 코드는 필수 입니다") + private String dsuseMthCd; + + /** + * 폐기 장소 + */ + @Schema(title = "폐기 장소", example = " ") + @NotEmpty(message = "폐기 장소는 필수 입니다") + private String dsuseLoc; + + /** + *
+		 * 폐기일자
+		 * 
+ */ + @Schema(title = "폐기일자", example = " ") + @Pattern(regexp = Constants.DATE_REGX, message = "폐기일자를 정확히 입력해 주세요(yyyyMMdd)") + private String dsuseDe; } /** @@ -128,16 +224,13 @@ public class BizNimsRequest { /** *
-		 * 진행상태
-		 *
+		 * 폐기관리진행상태 - ADDS11
 		 * 01-폐기신청서 접수
-		 * 02-폐기보고 매핑
-		 * 11-민원수령처리(전자결재)
-		 * 21-폐기결과통보서 작성
-		 * 22-폐기결과보고서 작성
-		 * 31-기안 및 발송
-		 * 41-폐기보고
-		 * 99-종료
+		 * 06-폐기통보서작성
+		 * 07-폐기내역서작성
+		 * 11-폐기보고확인
+		 * 21-폐기보고
+		 * 99-폐기보고완료
 		 * 
*/ @Schema(title = "폐기관리진행상태", example = " ") @@ -158,7 +251,7 @@ public class BizNimsRequest { private Integer rndDtlRptCnt; /** - * 취급일자 + * 취급일자 - 폐기신청민원 처리일자(공문시행일자) */ @Schema(title = "취급일자", example = " ") @Pattern(regexp = Constants.DATE_REGX, message = "취급일자를 정확히 입력해 주세요(yyyyMMdd)") @@ -262,6 +355,66 @@ public class BizNimsRequest { List dsuseMgtDtls = new ArrayList<>(); } + /** + * 마약류 폐기 관리 마스터 request + */ + @Schema(name = "DsuseMgt", description = "마약류 폐기 관리 마스터 DTO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @SuperBuilder + @EqualsAndHashCode(callSuper = false) + public static class DsuseMgt2 extends AuditDto { + @Schema(requiredMode = AUTO, title = "폐기 관리 ID", example = " ") + private String dscdmngId; + + @Schema(requiredMode = REQUIRED, title = "사용자 ID", example = " ") + @NotEmpty(message = "사용자 ID는 필수 입니다") + private String userId; + + /** + *
+		 * 원 사용자 보고 식별 번호
+		 * 폐기 보고 생성시의 사용자 보고 식별 번호
+		 * 생성 > 변경 > 변경 > 취소 등의 보고시 매번 새로운 보고식별번호가 생성
+		 * => 추적을 위해 최초의 생성시 보고식별번호를 기록
+		 * YYYYMMDD
+		 * 
+ */ + @Schema(requiredMode = REQUIRED, title = "원사용자보고식별번호", example = " ") + private String orgUsrRptIdNo; + + /** + *
+		 * 사용자 보고 식별 번호
+		 * 생성후 변경이나 취소시 새로운 보고식별번호로 update
+		 * 
+ */ + @Schema(requiredMode = REQUIRED, title = "사용자보고식별번호", example = " ") + private String usrRptIdNo; + + /** + * 마약류취급자식별번호 + */ + @JsonProperty(value = "BSSH_CD", required = true) + private String bsshCd; + + /** + *
+		 * 폐기관리진행상태 - ADDS11
+		 * 01-폐기신청서 접수
+		 * 06-폐기통보서작성
+		 * 07-폐기내역서작성
+		 * 11-폐기보고확인
+		 * 21-폐기보고
+		 * 99-폐기보고완료
+		 * 
+ */ + @Schema(requiredMode = REQUIRED, title = "진행 상태 코드", example = " ", allowableValues = {"01", "02", "11", "21", "22", "31", "41", "99"}) + @Pattern(regexp = "01|02|11|22|31|41|99", message = "진행 상태 코드는 필수 입니다") + private String prgrsSttsCd = Constants.PRGRS_STTS_CD.RECEIPT.getCode(); + } + /** * 마약류 폐기 관리 상세 request */ @@ -288,59 +441,63 @@ public class BizNimsRequest { /** * 제품_코드 - 13자리 */ - @Schema(title = "제품코드", example = " ") + @Schema(requiredMode = REQUIRED, title = "제품코드", example = "8806718050823") @Pattern(regexp = "[0-9a-zA-Z]{13}", message = "제품코드는 13자리 입니다") private String prductCd; /** * 제품명 */ - @Schema(title = "제품명", example = " ") + @Schema(requiredMode = REQUIRED, title = "제품명", example = "아쿠아폴주20밀리리터(프로포폴) (20㎖)") @NotEmpty(message = "제품명은 필수 입니다") private String prductNm; /** * 최소유통단위 수량 : 1 ~ */ - @Schema(title = "최소유통단위수량", example = " ") + @Schema(requiredMode = REQUIRED, title = "최소유통단위수량", example = "1") @Positive(message="최소유통단위 수량을 입력해 주세요(ex. 1)") private Integer minDistbQy; /** * 낱개단위 수량 : 0 ~ */ - @Schema(title = "낱개단위수량", example = " ") + @Schema(requiredMode = REQUIRED, title = "낱개단위수량", example = "0") @PositiveOrZero(message = "낱개단위 수량은 필수 입니다(ex. 0)") private Integer pceQy; /** * 제조번호 - 20자리 이하 */ - @Schema(title = "제품번호", example = " ") - @Pattern(regexp = "[0-9a-zA-Z]{1,20}", message = "제조번호는 필수 입니다") + @Schema(requiredMode = REQUIRED, title = "제품제조번호", example = "A1111") + @Pattern(regexp = "[0-9a-zA-Z]{1,20}", message = "제품제조번호는 필수 입니다") private String mnfNo; /** * 제품 유효기한 일자 - yyyyMMdd */ - @Schema(title = "제품유효기간", example = " ") + @Schema(requiredMode = REQUIRED, title = "제품유효기간", example = "20300303") @Pattern(regexp = Constants.DATE_REGX, message = "제품 유효 기간을 정확히 입력해 주세요(yyyyMMdd)") private String prdValidDe; /** * 제조 일련번호 - 20자리 이하 */ - @Schema(title = "제조일련번호", example = " ") + @Schema(requiredMode = REQUIRED, title = "제조일련번호", example = "A11111111") @Pattern(regexp = "[0-9a-zA-Z]{1,20}", message = "제조 일련번호는 필수 입니다") private String mnfSeq; /** * 폐기 수량 */ - @Schema(title = "폐기수량", example = " ") + @Schema(requiredMode = REQUIRED, title = "폐기수량", example = "2") @Positive(message = "폐기 수량은 0보다 커야 합니다") private Integer dsuseQy; + // @Schema(title = "폐기제품이미지", example = " ") + // //@NotEmpty(message = "폐기제품이미지는 필수 입니다") + // private MultipartFile dsusePrdImgFile; + /** * 사용자보고식별번호 */ diff --git a/src/main/java/cokr/xit/adds/biz/nims/service/BizNimsService.java b/src/main/java/cokr/xit/adds/biz/nims/service/BizNimsService.java index 3e084d8..84ac924 100644 --- a/src/main/java/cokr/xit/adds/biz/nims/service/BizNimsService.java +++ b/src/main/java/cokr/xit/adds/biz/nims/service/BizNimsService.java @@ -2,6 +2,8 @@ package cokr.xit.adds.biz.nims.service; import java.util.List; +import org.springframework.web.multipart.MultipartFile; + import cokr.xit.adds.biz.nims.model.BizNimsRequest; import cokr.xit.adds.biz.nims.model.BizNimsResponse; import cokr.xit.adds.inf.nims.model.NimsApiDto; @@ -54,6 +56,8 @@ public interface BizNimsService { //------------------------------------------------------------------------------------------------------ // NIMS BIZ //------------------------------------------------------------------------------------------------------ + BizNimsRequest.DsuseMgtReceipt saveDsuseMgtReceipt(final BizNimsRequest.DsuseMgtReceipt dto, final List dtls, List files); + BizNimsRequest.DsuseMgtRslt saveDsuseMgtRslt(final BizNimsRequest.DsuseMgtRslt dto, List files); BizNimsRequest.DsuseMgt saveDsuseMgt(final BizNimsRequest.DsuseMgt dto); List getDsuseMgts(final BizNimsRequest.DsuseMgtInq dto); void modifyPrgsSttsOfDsuseMgt(final BizNimsRequest.DsuseMgt dto); diff --git a/src/main/java/cokr/xit/adds/biz/nims/service/bean/BizNimsServiceBean.java b/src/main/java/cokr/xit/adds/biz/nims/service/bean/BizNimsServiceBean.java index 569deef..d637c87 100644 --- a/src/main/java/cokr/xit/adds/biz/nims/service/bean/BizNimsServiceBean.java +++ b/src/main/java/cokr/xit/adds/biz/nims/service/bean/BizNimsServiceBean.java @@ -1,5 +1,9 @@ package cokr.xit.adds.biz.nims.service.bean; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -12,6 +16,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import cokr.xit.adds.biz.nims.dao.BizNimsMapper; import cokr.xit.adds.biz.nims.model.BizNimsRequest; @@ -29,6 +34,7 @@ import cokr.xit.adds.inf.nims.service.InfNimsService; import cokr.xit.foundation.component.AbstractServiceBean; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import lombok.val; /** *
@@ -49,6 +55,18 @@ import lombok.extern.slf4j.Slf4j;
 @RequiredArgsConstructor
 @Service
 public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsService {
+	/**
+	 * 보고서 저장 경로
+	 */
+	@Value("${app.file.rpt.path:}")
+	private String rptPath;
+
+	/**
+	 * 폐기이미지 저장 경로
+	 */
+	@Value("${app.file.img.path:d:/data/adds-api/img}")
+	private String dsuseImgPath;
+
 	/**
 	 * 관할군청코드
 	 */
@@ -219,7 +237,7 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe
 		// FIXME: 미완료 보고관리-보고정보 매핑 처리
 		// 미완료(종료)된 폐기 관리 목록 조회
 		List dsuseMgts = getDsuseMgts(BizNimsRequest.DsuseMgtInq.builder()
-			.prgrsSttsCd(Constants.PRGRS_STTS_CD.END.getCode())
+			.prgrsSttsCd(Constants.PRGRS_STTS_CD.COMPLETE.getCode())
 			.build());
 
 		//////////////////////////////////////////////////////////////////////////////
@@ -338,6 +356,79 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe
 	//------------------------------------------------------------------------------------------------------
 	// NIMS BIZ
 	//------------------------------------------------------------------------------------------------------
+	/**
+	 * 
+	 * 사고마약류폐기 신청 접수
+	 * @param dto BizNimsRequest.DsuseMgtReceipt
+	 * @return BizNimsRequest.DsuseMgt 생성된 폐기관리 정보
+	 * 
+ */ + public BizNimsRequest.DsuseMgtReceipt saveDsuseMgtReceipt(final BizNimsRequest.DsuseMgtReceipt dto, final List dtls, final List files) { + ApiUtil.validate(dto, null, validator); + if(dto.getRndDtlRptCnt() != dtls.size()) throw ApiCustomException.create("폐기물 보고수 오류[폐기물 갯수 확인]"); + ApiUtil.validate(dtls, null, validator); + dto.setRgtr(dto.getUserId()); + if(files.size() != dtls.size()) throw ApiCustomException.create("폐기물 파일 갯수 오류[파일 갯수 확인]"); + + if(bizNimsMapper.insertDsuseMgtReceipt(dto) == 1){ + int dtlCnt = 0; + for (BizNimsRequest.DsuseMgtDtl d : dtls) { + d.setDscdmngId(dto.getDscdmngId()); + d.setDscdmngSn(StringUtils.leftPad(dtlCnt + 1 + "", 3, "0")); + d.setRgtr(dto.getUserId()); + dtlCnt = dtlCnt + bizNimsMapper.insertDsuseMgtDtl(d); + + // FIXME : file upload + // files[dtlCnt].transferTo(new File("path")); + //d.setDsusePrdImgFile(null); + } + if(dtls.size() != dtlCnt) throw ApiCustomException.create("폐기 관리 상세 등록 실패"); + } else { + throw ApiCustomException.create("폐기 관리 마스터 등록 실패"); + } + return dto; + } + + /** + *
+	 * 사고마약류폐기 통보[결과]처리
+	 * @param dto BizNimsRequest.DsuseMgtReceipt
+	 * @return BizNimsRequest.DsuseMgt 생성된 폐기관리 정보
+	 * 
+ */ + public BizNimsRequest.DsuseMgtRslt saveDsuseMgtRslt(final BizNimsRequest.DsuseMgtRslt dto, final List files) { + ApiUtil.validate(dto, null, validator); + dto.setRgtr(dto.getUserId()); + + if(bizNimsMapper.updateDsuseMgtRslt(dto) == 1){ + int dtlCnt = 0; + String dirPath = dsuseImgPath + Constants.FILE_DLMTR + dto.getDscdmngId(); + File f = new File(dirPath); + if(!f.exists()) f.mkdirs(); + + for (MultipartFile mf : files) { + val name = mf.getOriginalFilename(); + val ext = name.substring(name.lastIndexOf(".")); + val filename = name.substring(0, name.lastIndexOf(".")); + + Path path = Paths.get(dirPath + Constants.FILE_DLMTR, name); + + + // FIXME : file upload + try { + mf.transferTo(path); + //FileCopyUtils.copy(mf.getInputStream(), Files.newOutputStream(path)); + } catch (IOException e) { + throw ApiCustomException.create(String.format("폐기 통보[결과] 처리:파일 업로드 실패[%s]", e.getMessage())); + } + //d.setDsusePrdImgFile(null); + } + + } else { + throw ApiCustomException.create("폐기 관리 정보 변경[통보(결과) 처리] 실패"); + } + return dto; + } /** *
diff --git a/src/main/java/cokr/xit/adds/biz/nims/web/BizNimsController.java b/src/main/java/cokr/xit/adds/biz/nims/web/BizNimsController.java
index c588fdd..08878db 100644
--- a/src/main/java/cokr/xit/adds/biz/nims/web/BizNimsController.java
+++ b/src/main/java/cokr/xit/adds/biz/nims/web/BizNimsController.java
@@ -2,6 +2,7 @@ package cokr.xit.adds.biz.nims.web;
 
 import java.util.List;
 
+import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -12,6 +13,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+
 import cokr.xit.adds.biz.nims.model.BizNimsRequest;
 import cokr.xit.adds.biz.nims.model.BizNimsResponse;
 import cokr.xit.adds.biz.nims.service.BizNimsService;
@@ -19,6 +22,7 @@ import cokr.xit.adds.core.model.ApiBaseResponse;
 import cokr.xit.adds.core.util.XingUtils;
 import cokr.xit.adds.inf.nims.model.NimsApiDto;
 import cokr.xit.adds.inf.nims.model.NimsApiRequest;
+import cokr.xit.foundation.data.JSON;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.ExampleObject;
@@ -93,6 +97,44 @@ public class BizNimsController {
     //------------------------------------------------------------------------------------------------------
     // NIMS BIZ
     //------------------------------------------------------------------------------------------------------
+
+    /**
+     * 사고 마약류 폐기 관리 폐기 신청서 접수
+     * @param dsuseMgtJsonStr 폐기신청 마스터 정보 JSON String
+     * @param dsuseMgtDtlsJsonStr 폐기신청 상세 정보 JSON String
+     * @param dsusePrdImgFiles 폐기신청 제품 이미지 파일
+     * @return 폐기관리 신청서 접수 데이타 생성후 생성 정보 return
+     */
+    @Operation(summary = "사고 마약류 폐기 관리 폐기 신청서 접수", description = "사고 마약류 폐기 관리 폐기 신청서 접수

폐기관리 신청서 접수 데이타 생성후 생성 정보 return") + @PostMapping(value = "/saveDsuseMgtReceipt") + public ApiBaseResponse saveDsuseMgtReceipt( + @RequestParam("dsuseMgtJsonStr") String dsuseMgtJsonStr, + @RequestParam("dsuseMgtDtlsJsonStr") String dsuseMgtDtlsJsonStr, + @RequestParam(value = "dsusePrdImgFiles") List dsusePrdImgFiles + ) { + JSON json = new JSON(); + BizNimsRequest.DsuseMgtReceipt receiptDto = json.parse(dsuseMgtJsonStr, new TypeReference<>() {}); + List dsuseMgtDtls = json.parse(dsuseMgtDtlsJsonStr, new TypeReference<>() {}); + return ApiBaseResponse.of(bizNimsService.saveDsuseMgtReceipt(receiptDto, dsuseMgtDtls, dsusePrdImgFiles)); + } + + /** + * 사고 마약류 폐기 통보[결과] 처리 + * @param dsuseMgtRsltJsonStr 폐기 통보[결과] JSON String + * @param dsuseDsuseImgFiles 폐기 이미지 파일 + * @return 폐기관리 폐기 통보[결과] 처리 정보 return + */ + @Operation(summary = "사고 마약류 폐기 관리 폐기 신청서 접수", description = "사고 마약류 폐기 관리 폐기 신청서 접수

폐기관리 신청서 접수 데이타 생성후 생성 정보 return") + @PostMapping(value = "/saveDsuseMgtRslt") + public ApiBaseResponse saveDsuseMgtRslt( + @RequestParam("dsuseMgtRsltJsonStr") String dsuseMgtRsltJsonStr, + @RequestParam(value = "dsuseDsuseImgFiles") List dsuseDsuseImgFiles + ) { + JSON json = new JSON(); + BizNimsRequest.DsuseMgtRslt rsltDto = json.parse(dsuseMgtRsltJsonStr, new TypeReference<>() {}); + return ApiBaseResponse.of(bizNimsService.saveDsuseMgtRslt(rsltDto, dsuseDsuseImgFiles)); + } + @Operation(summary = "사고 마약류 폐기 관리 생성", description = "사고 마약류 폐기 관리 생성

폐기관리 데이타 생성후 폐기보고 정보 return") @io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = { @Content(mediaType = "application/json", examples = { @@ -187,7 +229,7 @@ public class BizNimsController { } @Operation(summary = "barcode 이미지 제품 제조 정보 조회", description = "barcode 이미지 제품 제조 정보 조회

barcode 이미지를 통한 제품 제조 정보 조회") - @PostMapping(value = "/getProductInfoByQrcodeImg", consumes = { "multipart/form-data" }) + @PostMapping(value = "/getProductInfoByQrcodeImg", consumes = { MediaType.MULTIPART_FORM_DATA_VALUE }) //@PostMapping(value = "/api/biz/nims/v1/getQrcode") public ApiBaseResponse getProductInfoByQrcodeImg( @RequestParam("uploadFiles") diff --git a/src/main/java/cokr/xit/adds/core/Constants.java b/src/main/java/cokr/xit/adds/core/Constants.java index b655986..becad1e 100644 --- a/src/main/java/cokr/xit/adds/core/Constants.java +++ b/src/main/java/cokr/xit/adds/core/Constants.java @@ -25,6 +25,7 @@ import lombok.Getter; public class Constants { public static final String API_URL_PATTERNS = "/*"; public static final Charset CHARSET_UTF8 = StandardCharsets.UTF_8; + public static final String FILE_DLMTR = System.getProperty("os.name").contains("Window") ? "\\" : "/"; public static final String DATE_REGX = "^[12]\\d{3}((0[1-9])|(1[0-2]))(0[1-9]|[12]\\d|3[01])$"; public static final String CUR_DATE_REGX = "^20([2-9][0-9])((0[1-9])|(1[0-2]))(0[1-9]|[12][0-9]|3[01])$"; @@ -140,10 +141,11 @@ public class Constants { } } - /** + /** *
      * 폐기 방법 코드 - ADDS05
-     * 1:소각, 2:중화, 3:가수분해, 4:산화, 5:환원, 6:희석, 7:매몰, 8:기타, 9:사고
+     * 1:소각, 2:중화, 3:가수분해, 4:산화, 5:환원,
+     * 6:희석, 7:매몰, 8:기타, 9:사고
      * 
*/ @Getter @@ -183,27 +185,22 @@ public class Constants { *
      * 폐기관리진행상태 - ADDS11
      * 01-폐기신청서 접수
-     * 02-폐기보고 매핑
-     * 11-민원수령처리(전자결재)
-     * 21-폐기결과통보서 작성
-     * 22-폐기결과보고서 작성
-     * 31-기안 및 발송
-     * 41-폐기보고
-     * 99-종료
+     * 06-폐기통보서작성
+     * 07-폐기내역서작성
+     * 11-폐기보고확인
+     * 21-폐기보고
+     * 99-폐기보고완료
      * 
*/ @Getter public enum PRGRS_STTS_CD { // 폐기보고신청서의 데이타 입력 생성 - 폐기관리 데이타 생성 RECEIPT("01", "폐기신청서접수"), + NOTICE_WRITE("06", "폐기결과통보서작성"), + REPORT_WRITE("07", "폐기내역서작성"), // 폐기보고 데이타 매핑 완료 - MAPPING("02", "폐기보고매핑"), - ACCEPT("11", "민원수령처리(전자결재)"), - NOTICE_WRITE("21", "폐기결과통보서작성"), - REPORT_WRITE("22", "폐기결과보고서작성"), - DRAFT("31", "기안 및 발송"), - REPORT("41", "폐기보고"), - END("99", "종료") + MAPPING("11", "폐기보고확인"), + COMPLETE("99", "폐기보고완료") ; private final String code; diff --git a/src/main/java/cokr/xit/adds/core/util/JsonUtils.java b/src/main/java/cokr/xit/adds/core/util/JsonUtils.java index 3139c13..9ffd3e4 100644 --- a/src/main/java/cokr/xit/adds/core/util/JsonUtils.java +++ b/src/main/java/cokr/xit/adds/core/util/JsonUtils.java @@ -148,7 +148,7 @@ // */ // public static Map toMap(final String str) { // try { -// return ObjectUtils.isNotEmpty(str)? OM.readValue(str, new TypeReference>(){}) : null; +// return ObjectUtils.isNotEmpty(str)? OM.readValue(str, new TypeReference<>(){}) : null; // } catch (JsonProcessingException e) { // throw ApiCustomException.create(e.getLocalizedMessage()); // } diff --git a/src/main/java/cokr/xit/adds/inf/mois/service/bean/InfMoisServiceBean.java b/src/main/java/cokr/xit/adds/inf/mois/service/bean/InfMoisServiceBean.java index 74c11b4..f6cd290 100644 --- a/src/main/java/cokr/xit/adds/inf/mois/service/bean/InfMoisServiceBean.java +++ b/src/main/java/cokr/xit/adds/inf/mois/service/bean/InfMoisServiceBean.java @@ -43,6 +43,7 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; import cokr.xit.adds.biz.nims.service.BizNimsService; +import cokr.xit.adds.core.Constants; import cokr.xit.adds.core.spring.exception.ApiCustomException; import cokr.xit.adds.core.util.DateUtils; import cokr.xit.adds.inf.mois.model.MoisExchangeRequest; @@ -110,7 +111,6 @@ public class InfMoisServiceBean extends AbstractServiceBean implements InfMoisSe private final BizNimsService bizNimsService; - private static final String delimiter = System.getProperty("os.name").contains("Window") ? "\\" : "/"; private static final String bodyText = """ 1. 귀 기관의 무궁한 발전을 기원합니다. @@ -184,9 +184,9 @@ public class InfMoisServiceBean extends AbstractServiceBean implements InfMoisSe log.info("srcPath : {}", srcPath); log.info("srcFileNam : {}", srcFileName); rcvTgtFiles.add(Map.of( - "inFolder", srcPath + delimiter + srcFileName, + "inFolder", srcPath + Constants.FILE_DLMTR + srcFileName, "outFolder", - dataRootPath + receiveDir + srcPath.substring(srcPath.lastIndexOf(delimiter) + 1) + delimiter, + dataRootPath + receiveDir + srcPath.substring(srcPath.lastIndexOf(Constants.FILE_DLMTR) + 1) + Constants.FILE_DLMTR, "delFolder", srcPath )); @@ -211,7 +211,7 @@ public class InfMoisServiceBean extends AbstractServiceBean implements InfMoisSe } } catch (Exception e) { for(Map m : rcvTgtFiles) { - String[] items = m.get("inFolder").split(delimiter); + String[] items = m.get("inFolder").split(Constants.FILE_DLMTR); String fileName = items[items.length-1]; String inFile = m.get("outFolder")+fileName; String outFile = m.get("inFolder").replace(fileName, ""); @@ -329,7 +329,7 @@ public class InfMoisServiceBean extends AbstractServiceBean implements InfMoisSe //transformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); DOMSource source = new DOMSource(doc); - try(FileOutputStream fio = new FileOutputStream(new File(path + delimiter + "exchange.xml"));) { + try(FileOutputStream fio = new FileOutputStream(new File(path + Constants.FILE_DLMTR + "exchange.xml"));) { StreamResult result = new StreamResult(fio); transformer.transform(source, result); }catch (SecurityException | IOException e) { @@ -411,7 +411,7 @@ public class InfMoisServiceBean extends AbstractServiceBean implements InfMoisSe sb.append("sender_systemname=").append(header.getSenderSystemname()).append("\n"); sb.append("administrative_num=").append(header.getAdministrativeNum()).append("\n"); - try(PrintWriter fw = new PrintWriter(dirPath+ delimiter + "header.inf", "euc-kr");){ + try(PrintWriter fw = new PrintWriter(dirPath+ Constants.FILE_DLMTR + "header.inf", "euc-kr");){ fw.write(sb.toString()); fw.flush(); } catch (FileNotFoundException | UnsupportedEncodingException e) { @@ -423,7 +423,7 @@ public class InfMoisServiceBean extends AbstractServiceBean implements InfMoisSe final String path = dataRootPath + sendTemp + pathName; File dirPath = new File(path); - try(PrintWriter fw = new PrintWriter(dirPath + delimiter + "eof.inf", "euc-kr");){ + try(PrintWriter fw = new PrintWriter(dirPath + Constants.FILE_DLMTR + "eof.inf", "euc-kr");){ fw.write(StringUtils.EMPTY); fw.flush(); } catch (FileNotFoundException | UnsupportedEncodingException e) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 5c88a08..bcb11f7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -202,3 +202,7 @@ app: log: parameter-enabled: true response-enabled: true + file: + root.path: ${app.data.root.path}/${spring.application.name} + rpt.path: ${app.file.root.path}/rpt + img.path: ${app.file.root.path}/img diff --git a/src/main/resources/sql/mapper/biz/nims-mysql-mapper.xml b/src/main/resources/sql/mapper/biz/nims-mysql-mapper.xml index 782d196..cc64a0f 100644 --- a/src/main/resources/sql/mapper/biz/nims-mysql-mapper.xml +++ b/src/main/resources/sql/mapper/biz/nims-mysql-mapper.xml @@ -179,6 +179,51 @@ + + /** nims-mysql-mapper|insertDsuseMgtReceipt-폐기관리 신청서 정보 생성|julim */ + + SELECT NVL(MAX(dscdmng_id), CONCAT(DATE_FORMAT(now(), '%Y%m'),'0000')) + 1 + FROM tb_dsuse_mgt + WHERE dscdmng_id LIKE CONCAT(DATE_FORMAT(now(), '%Y%m'), '%'); + + INSERT INTO tb_dsuse_mgt ( + dscdmng_id, /* 폐기관리ID */ + user_id, /* 사용자ID */ + prgrs_stts_cd, /* 폐기관리진행상태코드 */ + bssh_cd, /* 마약류취급자식별ID */ + rnd_dtl_rpt_cnt, /* 수불상세보고수 */ + dsuse_prv_cd, /* 폐기사유코드 */ + use_yn, + reg_dt, + rgtr + ) VALUES ( + #{dscdmngId}, + #{userId}, + #{prgrsSttsCd}, + #{bsshCd}, + #{rndDtlRptCnt}, + #{dsusePrvCd}, + 'Y', + DATE_FORMAT(now(), '%Y%m%d%H%i%s'), + #{rgtr} + ) + + + + /** nims-mysql-mapper|updateDsuseMgtRslt-폐기관리 정보 변경|julim */ + UPDATE tb_dsuse_mgt + SET prgrs_stts_cd = #{prgrsSttsCd} + , hdr_de = #{hdrDe} + , rpt_de = #{rptDe} + , dsuse_se_cd = #{dsuseSeCd} + , dsuse_mth_cd = #{dsuseMthCd} + , dsuse_loc = #{dsuseLoc} + , dsuse_de = #{dsuseDe} + , mdfcn_dt = DATE_FORMAT(now(), '%Y%m%d%H%i%s') + , mdfr = #{rgtr} + WHERE dscdmng_id = #{dscdmngId} + + /** nims-mysql-mapper|insertDsuseMgt-폐기관리 생성|julim */ diff --git a/src/main/resources/static/dsuseMgtReceipt.html b/src/main/resources/static/dsuseMgtReceipt.html new file mode 100644 index 0000000..64a25cc --- /dev/null +++ b/src/main/resources/static/dsuseMgtReceipt.html @@ -0,0 +1,100 @@ + + + + + + + + + 폐기 신청서 접수 + + + + + + + + +
+ +
+
+ +
+ + + + + + + diff --git a/src/main/resources/static/dsuseMgtRslt.html b/src/main/resources/static/dsuseMgtRslt.html new file mode 100644 index 0000000..ca4410e --- /dev/null +++ b/src/main/resources/static/dsuseMgtRslt.html @@ -0,0 +1,80 @@ + + + + + + + + + 폐기 통보[결과] 처리 + + + + + + + + +
+ +
+
+ +
+ + + + + + +