From 27625123ab8179cd2dea88a16945fe29a7ec142d Mon Sep 17 00:00:00 2001 From: "Jonguk. Lim" Date: Fri, 24 May 2024 18:02:23 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=ED=8F=90=EA=B8=B0=EB=B3=B4?= =?UTF-8?q?=EA=B3=A0=20=EC=A1=B0=ED=9A=8C=20=EB=8D=B0=EC=9D=B4=ED=83=80=20?= =?UTF-8?q?=EB=A7=A4=ED=95=91=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nims/service/bean/BizNimsServiceBean.java | 301 +++++++++--------- .../mois/service/bean/InfMoisServiceBean.java | 3 +- .../xit/adds/inf/nims/model/NimsApiDto.java | 115 ++++--- .../sql/mapper/biz/nims-mysql-mapper.xml | 14 +- 4 files changed, 243 insertions(+), 190 deletions(-) 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 f3df58a..569deef 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 @@ -8,6 +8,7 @@ import java.util.Map; import javax.validation.Validation; import javax.validation.Validator; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -201,7 +202,7 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe */ @Override public List saveDsuseRptInfo(NimsApiRequest.DsuseRptInfoReq reqDto) { - List rsltList = new ArrayList<>(); + List nimsList = new ArrayList<>(); while(true) { NimsApiResult.Response rslt = infNimsService.getDsuseRptInfo(reqDto); @@ -209,7 +210,7 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe if(isEmpty(curList)) break; - rsltList.addAll(curList); + nimsList.addAll(curList); if(rslt.isEndYn()) break; reqDto.setPg(String.valueOf(Integer.parseInt(reqDto.getPg()) + 1)); @@ -243,19 +244,19 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe // 결과 return 작업 대상, 대상 데이타 List List rtnTmplist = new ArrayList<>(); List rtnlist = new ArrayList<>(); - for (NimsApiDto.DsuseRptInfo dto : rsltList) { + for (NimsApiDto.DsuseRptInfo nimsDto : nimsList) { Map map = new HashMap<>(); - map.put("usrRptIdNo", dto.getUsrRptIdNo()); + map.put("usrRptIdNo", nimsDto.getUsrRptIdNo()); NimsApiDto.DsuseRptInfo infoDto = bizNimsMapper.selectDsuseRptInfoByUsrRptIdNo(map); if(isEmpty(infoDto)){ - workList.add(dto); + workList.add(nimsDto); }else{ // FIXME: API 적용 필요 // API 조회 반영된 사용여부가 'Y', 처리상태코드가 미완료인 경우는 return 대상 //if("Y".equals(infoDto.getUseYn()) && !"".equals(infoDto.getStatus())){ if("Y".equals(infoDto.getUseYn())){ - rtnTmplist.add(dto); - rtnlist.add(dto); + rtnTmplist.add(nimsDto); + rtnlist.add(nimsDto); } }; } @@ -265,18 +266,15 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe // 신규가 아닌 경우 skip if(!"0".equals(dto.getRptTyCd())) continue; - dto.setOrgUsrRptIdNo(dto.getUsrRptIdNo()); - dto.setRgtr(Constants.NIMS_API_USER_ID); - // 폐기 보고 정보 데이타 생성 - createDsuseRpt(dto, true); + createDsuseRpt(dto); rtnTmplist.add(dto); rtnlist.add(dto); // FIXME : 폐기 관리 데이타 매핑 // FIXME: 폐기 관리 데이타 폐기보고 매핑 대상 조회인 경우? - List newList = dto.mappingNewDsuseRptInfo(dsuseMgts); + List newList = dto.mappingNewDsuseRptInfos(dsuseMgts); if(newList.size() > 1){ throw ApiCustomException.create("폐기 관리 데이타 매핑 오류[폐기 관리 데이타 중복]"); } @@ -307,7 +305,7 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe updateDsuseRptAndDsuseMgt(dto); // 2-3. tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 생성 (취소인 경우는 tb_dsuse_rpt_info의 사용 여부 'N'으로 생성) - createDsuseRpt(dto, false); + createDsuseRpt(dto); // FIXME : API 적용 필요 // 결과 return 대상 데이타 List에서 조회한 변경 대상이 있는 경우 replace @@ -395,163 +393,168 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe return resList; } + /** + *
+	 * saveDsuseRptInfo 대체 메소드 - 확인후 적용
+	 * 0. GET 폐기관리 데이타 정보
+	 * 1. GET 폐기보고 데이타 목록 - NIMS API 호출
+	 * 2. 신규 대상(DB에 저장되지 않은 데이타) 및 결과 return 대상 List(DB데이타중 사용여부 "Y") 선별
+	 * 3. 신규 대상중 신규(보고구분 '0')인 데이타 처리(DB 데이타 생성) & 결과 return 대상 List에 추가
+	 *    -> 신규(보고구분 '0')인 데이타 먼저 처리 -> 변경('2') 취소('1') 데이타 처리 가능
+	 * 4. 신규 대상중 취소,변경인 처리(DB 데이타 생성) & 결과 return 대상 List에 추가
+	 *    -> 0) 참조사용자보고식별번호 필수 체크
+	 *       1) 사용자보고식별번호 = 참조사용자보고식별번호 인 데이타
+	 *          tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 사용여부 'N' update
+	 *       2) 폐기 관리 테이블에 사용자보고식별번호 반영 FIXME - 반영 필요
+	 *          -> 취소인 경우는 사용자/원사용자 식별번호 clear
+	 *          -> 변경인 경우는 사용자보고식별번호 -> 참조사용자보고식별번호 update
+	 *       3) tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 생성
+	 *          -> 취소인 경우는 tb_dsuse_rpt_info의 사용 여부 'N'으로 생성
+	 * 5. 결과 return 대상 데이타 List에서 NIMS 변경 데이타인 경우 대상에서 제외
+	 * 6. return List에 현재 데이타 추가 - 변경인 경우만 추가
+	 * 7. FIXME : 폐기 관리 데이타 매핑
+	 * 8. 결과 sort 및 return
+	 * @param reqDto
+	 * @return
+	 * 
+ */ // FIXME: API 적용 필요 - nims API 확정후 // FIXME: saveDsuseRptInfo() 메소드를 활용할 수 있도록 구성 @Override public List getDsuseMgtMapping(BizNimsRequest.DsuseMgt reqDto) { + + // 0. GET 폐기관리 데이타 정보 + BizNimsResponse.DsuseMgtRes dsuseMgtDto = getDsuseMgts( + BizNimsRequest.DsuseMgtInq.builder() + .dscdmngIds(List.of(reqDto.getDscdmngId())) + .prgrsSttsCd(null) + .build()) + .get(0); + NimsApiRequest.DsuseRptInfoReq rptDto = NimsApiRequest.DsuseRptInfoReq.builder() .fg("1") .pg("1") .fg2("2") .se("AAR") - .fg3("1") + .fg3("1") // 조회기준일자 : 1-보고일자, 2-취급일자 .sdt("20220101") .edt("20220131") .bc(reqDto.getBsshCd()) .fg4(ofCd) .build(); - List rsltList = new ArrayList<>(); + // 1. GET 폐기보고 데이타 목록 - NIMS API 호출 + List nimsList = new ArrayList<>(); while(true) { NimsApiResult.Response rslt = infNimsService.getDsuseRptInfo(rptDto); List curList = rslt.getResultOrThrow(); if(isEmpty(curList)) break; - rsltList.addAll(curList); + nimsList.addAll(curList); if(rslt.isEndYn()) break; rptDto.setPg(String.valueOf(Integer.parseInt(rptDto.getPg()) + 1)); } - // GET 보고관리정보 - BizNimsResponse.DsuseMgtRes dsuseMgt = getDsuseMgts( - BizNimsRequest.DsuseMgtInq.builder() - .dscdmngIds(List.of(reqDto.getDscdmngId())) - .prgrsSttsCd(null) - .build()) - .get(0); - - ////////////////////////////////////////////////////////////////////////////// - // FIXME : 테스트를 위한 코드 - ////////////////////////////////////////////////////////////////////////////// - // for (NimsApiDto.DsuseRptInfo dto : rsltList) { - // // 폐기 관리 데이타 매핑 - // for(BizNimsResponse.DsuseMgtResponse mgtDto: dsuseMgts){ - // // 폐기 신청서 접수 상태 데이타만 처리 - // if(Constants.PRGRS_STTS_CD.RECEIPT.getCode().equals(mgtDto.getPrgrsSttsCd())){ - // dto.mappingDsuseRptInfo(mgtDto); - // }; - // } - // } - // if(true) return null; - ////////////////////////////////////////////////////////////////////////////// - - - // 0. 폐기보고 API 호출 결과 목록에서 기 조회(저장)한 데이타 대상 에서 제외 (usrRptIdNo가 DB에 저장된 경우) - // 작업대상 데이타 List - List workList = new ArrayList<>(); + // 신규 작업대상 데이타 List + List newList = new ArrayList<>(); // 결과 return 작업 대상, 대상 데이타 List - List rtnTmplist = new ArrayList<>(); - List rtnlist = new ArrayList<>(); - for (NimsApiDto.DsuseRptInfo dto : rsltList) { + List rtnList = new ArrayList<>(); + + // 2. 신규 작업 대상(DB에 저장되지 않은 데이타) 및 결과 return 대상 List(DB데이타중 사용여부 "Y") 선별 + for (NimsApiDto.DsuseRptInfo nimsDto : nimsList) { Map map = new HashMap<>(); - map.put("usrRptIdNo", dto.getUsrRptIdNo()); + map.put("usrRptIdNo", nimsDto.getUsrRptIdNo()); NimsApiDto.DsuseRptInfo infoDto = bizNimsMapper.selectDsuseRptInfoByUsrRptIdNo(map); // 기조회(저장)한 데이타가 아니면 대상에 추가(usrRptIdNo가 DB에 저장되지 않은 경우) if(isEmpty(infoDto)){ - - + newList.add(nimsDto); // 기조회(저장)한 데이타 && 마지막 데이타(사용여부 'Y')인 경우는 return 대상에 추가 // 사용자보고번호가 참조사용자보고번호로 들어오는 변경 및 취소건에 의해 // return 대상에서 제외될 수 있슴 }else{ - // FIXME: API 적용 필요 + // FIXME: API 연계 데이타 확인후 확정 필요 // API 조회 반영된 사용여부가 'Y', 처리상태코드가 미완료인 경우는 return 대상 //if("Y".equals(infoDto.getUseYn()) && !"".equals(infoDto.getStatus())){ if("Y".equals(infoDto.getUseYn())){ - rtnTmplist.add(dto); - rtnlist.add(dto); + //rtnTmplist.add(nimsDto); + rtnList.add(nimsDto); } }; } - // 1. 신규(rptTyCd : 0) 저장 - tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 생성 - for (NimsApiDto.DsuseRptInfo dto : workList) { + // 3. 신규 작업 대상중 신규(보고구분 '0')인 데이타 처리(DB 데이타 생성) & 결과 return 대상 List에 추가 + // -> 신규(보고구분 '0')인 데이타 먼저 처리해야, 변경('2') 및 취소('1') 데이타 처리 가능 + // 신규(rptTyCd : 0) 저장 - tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 생성 + for (NimsApiDto.DsuseRptInfo dto : newList) { // 신규가 아닌 경우 skip if(!"0".equals(dto.getRptTyCd())) continue; - dto.setOrgUsrRptIdNo(dto.getUsrRptIdNo()); - dto.setRgtr(Constants.NIMS_API_USER_ID); - - // 폐기 보고 정보 데이타 생성 - createDsuseRpt(dto, true); - rtnTmplist.add(dto); - rtnlist.add(dto); + createDsuseRpt(dto); + // return List에 추가 + rtnList.add(dto); // FIXME : 폐기 관리 데이타 매핑 // FIXME: 폐기 관리 데이타 폐기보고 매핑 대상 조회인 경우? - List newList = List.of();////dto.mappingNewDsuseRptInfo(dsuseMgts); - if(newList.size() > 1){ - throw ApiCustomException.create("폐기 관리 데이타 매핑 오류[폐기 관리 데이타 중복]"); + BizNimsResponse.DsuseMgtRes dsuseMgtRes = dto.mappingNewDsuseRptInfo(dsuseMgtDto); + if(ObjectUtils.isNotEmpty(dsuseMgtRes)) { + if (bizNimsMapper.updateMappingDsuseMgt(dsuseMgtDto) == 1) { + throw ApiCustomException.create("폐기 관리 데이타 매핑 오류[폐기 관리 데이타 매핑 실패]"); + } } - if(bizNimsMapper.updateMappingDsuseMgt(newList.get(0)) == 1){ - throw ApiCustomException.create("폐기 관리 데이타 매핑 오류[폐기 관리 데이타 매핑 실패]"); - }; } - // 2. 신규 외의 경우(rptTyCd : 1 - 취소, 2 - 변경) + // 4. 신규 작업 대상중 취소,변경(보고구분 '1', '2')인 처리(DB 데이타 생성) & 결과 return 대상 List에 추가 String errMsg = null; - for (NimsApiDto.DsuseRptInfo dto : workList) { - dto.setRgtr(Constants.NIMS_API_USER_ID); - + for (NimsApiDto.DsuseRptInfo dto : newList) { // 신규인 경우 skip if("0".equals(dto.getRptTyCd())) continue; - // 2-1. refUsrRptIdNo 필수 체크 + // 4-0) 참조사용자보고식별번호 필수 체크 if(isEmpty(dto.getRefUsrRptIdNo())){ throw ApiCustomException.create("데이타 오류[취소 및 변경인 경우 참조사용자식별번호(REF_USR_RPT_ID_NO) 필수]"); } - // 2-2. 폐기보고정보, 폐기관리 변경 - // 1) tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 사용여부 'N' update - // 2) tb_dsuse_mgt 변경 - // 조건 : 사용자보고식별번호 = 참조사용자보고식별번호 - // => usr_rpt_id_no -> refUsrRptIdNo update - // => 취소인 경우 use_yn = 'N' update + // 폐기관리 및 폐기보고 정보 변경 + // 4-1) 사용자보고식별번호 = 참조사용자보고식별번호 인 데이타 + // tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 사용여부 'N' update + // 4-2) 폐기 관리 테이블에 사용자보고식별번호 반영 + // -> 취소인 경우는 사용자/원사용자 식별번호 clear + // -> 변경인 경우는 사용자보고식별번호 -> 참조사용자보고식별번호 update updateDsuseRptAndDsuseMgt(dto); - // 2-3. tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 생성 (취소인 경우는 tb_dsuse_rpt_info의 사용 여부 'N'으로 생성) - createDsuseRpt(dto, false); + // 4-3) tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 생성 + // -> 취소인 경우는 tb_dsuse_rpt_info의 사용 여부 'N'으로 생성 + createDsuseRpt(dto); - // FIXME : API 적용 필요 - // 결과 return 대상 데이타 List에서 조회한 변경 대상이 있는 경우 replace - // 결과 return 대상 데이타 List에서 조회한 취소 대상이 있는 경우 삭제 - for(NimsApiDto.DsuseRptInfo d : rtnTmplist){ + // FIXME : API 적용후 확인 필요 + // 5. 결과 return 대상 데이타 List에서 NIMS 변경 데이타인 경우 대상에서 제외 + for(NimsApiDto.DsuseRptInfo d : rtnList){ if(d.getOrgUsrRptIdNo().equals(dto.getOrgUsrRptIdNo()) && d.getUsrRptIdNo().equals(dto.getRefUsrRptIdNo())){ - rtnlist.remove(d); - - if(dto.getRptTyCd().equals("2")){ - rtnlist.add(dto); - } + rtnList.remove(d); }; } + // 6. return List에 현재 데이타 추가 - 변경인 경우만 추가 + if(dto.getRptTyCd().equals("2")){ + rtnList.add(dto); + } - // FIXME : 폐기 관리 데이타 매핑 - List newList = List.of(); ////dto.mappingDsuseRptInfo(dsuseMgts); - if(newList.size() > 1){ - throw ApiCustomException.create("폐기 관리 데이타 매핑 오류[폐기 관리 데이타 중복]"); + + // 7. FIXME : 폐기 관리 데이타 매핑 + BizNimsResponse.DsuseMgtRes dsuseMgtRes = dto.mappingNewDsuseRptInfo(dsuseMgtDto); + if(ObjectUtils.isNotEmpty(dsuseMgtRes)) { + if (bizNimsMapper.updateMappingDsuseMgt(dsuseMgtDto) == 1) { + throw ApiCustomException.create("폐기 관리 데이타 매핑 오류[폐기 관리 데이타 매핑 실패]"); + } } - if(bizNimsMapper.updateMappingDsuseMgt(newList.get(0)) == 1){ - throw ApiCustomException.create("폐기 관리 데이타 매핑 오류[폐기 관리 데이타 매핑 실패]"); - }; } - - // return dtos; - return workList; + // FIXME: API연계 데이타 확인후 매핑될 데이타가 최상단에 오도록 정렬기준 재정의 필요 + rtnList.sort((a, b) -> a.getUsrRptIdNo().compareTo(b.getUsrRptIdNo())); + return rtnList; } @Override @@ -671,52 +674,28 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe /** *
 	 * tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 생성
-	 * => 취소인 경우는 tb_dsuse_rpt_info의 사용 여부 'N'으로 생성
+	 * 0) 부가 정보 set
+	 * 1) 원사용자보고식별번호 set
+	 * 2) 데이타 생성
+	 *   - 취소인 경우는 tb_dsuse_rpt_info의 사용 여부 'N'으로 생성
 	 *
-	 * 원사용자보고식별번호 조회
-	 * 1. 신규(rptTyCd : 0) - 사용자보고식별번호
-	 * 2. 취소 또는 변경(rptTyCd : 1, 2) - 참조사용자보고식별번호 필수
-	 * => 사용자보고식별번호 = 참조사용자식별번호 조건 으로 조회
-	 * => 조회결과 참조사용자식별번호가 존재하지 않을때 까지 반복 조회(신규(rptTyCd : 0)인 경우 까지)
-	 * => 사용자보고식별번호를 원사용자보고식별번호로 설정
 	 * @param dto NimsApiDto.DsuseRptInfo
-	 * @param isNew boolean
 	 * 
*/ - private void createDsuseRpt(NimsApiDto.DsuseRptInfo dto, boolean isNew) { + private void createDsuseRpt(NimsApiDto.DsuseRptInfo dto) { + dto.setRgtr(Constants.NIMS_API_USER_ID); dto.setRptTyCdNm(Constants.RPT_TY_CD.getName(dto.getRptTyCd())); dto.setDsuseSeCdNm(Constants.DSUSE_SE_CD.getName(dto.getDsuseSeCd())); dto.setDsusePrvCdNm(Constants.DSUSE_PRV_CD.getName(dto.getDsusePrvCd())); dto.setDsuseMthCdNm(Constants.DSUSE_MTH_CD.getName(dto.getDsuseMthCd())); - // FIXME : 폐기 관리 테이블에 사용자보고식별번호 반영 - // 원 사용자 식별 번호 set - 변경/취소 인 경우 - // 신규인 경우는 사용자보고식별번호로 설정 - if(!isNew){ - - String refUsrRptIdNo = dto.getRefUsrRptIdNo(); - - // 참조사용자보고식별번호로 원사용자보고식별번호조회 - while(true) { - Map map = bizNimsMapper.recusiveRefUsrRptIdNo(refUsrRptIdNo); - if(map == null) throw ApiCustomException.create("데이타 오류[참조사용자로 사용자보고식별번호 조회 실패 - 데이타 누락]"); - - if(!isEmpty(map.get("refUsrRptIdNo"))){ - refUsrRptIdNo = map.get("refUsrRptIdNo"); - continue; - } - - if("0".equals(map.get("rptTyCd"))){ - dto.setOrgUsrRptIdNo(map.get("usrRptIdNo")); - break; - } else { - throw ApiCustomException.create("데이타 오류[참조사용자로 사용자보고식별번호 조회 실패 - 신규보고 데이타 누락]"); - } - } + // 신규가 아닌 경우 : 원사용자보고식별번호 조회 & set + if("0".equals(dto.getRptTyCd())){ + dto.setOrgUsrRptIdNo(dto.getUsrRptIdNo()); + }else{ + setOrgUsrRptIdNo(dto); } - - // FIXME : 폐기 관리 테이블에 사용자보고식별번호 반영 if (bizNimsMapper.insertDsuseRptInfo(dto) == 1) { //취소인 경우 상세 데이타 등록 skip @@ -736,15 +715,53 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe /** *
-	 * tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 사용여부 'N' update
-	 * tb_dsuse_mgt
-	 * 조건 : 사용자보고식별번호 = 참조사용자보고식별번호
-	 *      => usr_rpt_id_no -> refUsrRptIdNo update
-	 *      => 취소인 경우 use_yn = 'N' update
+	 * 취소 또는 변경(rptTyCd : 1, 2)시 원사용자보고식별번호 조회 및 설정
+	 * 참조사용자보고식별번호 필수
+	 * => 사용자보고식별번호 = 참조사용자식별번호 조건 으로 조회
+	 * => 조회결과 참조사용자식별번호가 존재하지 않을때 까지 반복 조회(신규(rptTyCd : 0)인 경우 까지)
+	 * => 사용자보고식별번호를 원사용자보고식별번호로 설정
+	 * @param dto NIMS 폐기보고 데이타(NimsApiDto.DsuseRptInfo)
+	 * 
+ */ + private void setOrgUsrRptIdNo(NimsApiDto.DsuseRptInfo dto) { + // 원 사용자 식별 번호 set - 변경/취소 인 경우 + // 신규인 경우는 사용자보고식별번호로 설정 + + String refUsrRptIdNo = dto.getRefUsrRptIdNo(); + + // 참조사용자보고식별번호로 원사용자보고식별번호조회 + while(true) { + Map map = bizNimsMapper.recusiveRefUsrRptIdNo(refUsrRptIdNo); + if(map == null) throw ApiCustomException.create("데이타 오류[참조사용자로 사용자보고식별번호 조회 실패 - 데이타 누락]"); + + if(!isEmpty(map.get("refUsrRptIdNo"))){ + refUsrRptIdNo = map.get("refUsrRptIdNo"); + continue; + } + + if("0".equals(map.get("rptTyCd"))){ + dto.setOrgUsrRptIdNo(map.get("usrRptIdNo")); + break; + } else { + throw ApiCustomException.create("데이타 오류[참조사용자로 사용자보고식별번호 조회 실패 - 신규보고 데이타 누락]"); + } + } + } + + /** + *
+	 * - tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl
+	 *   사용자보고식별번호 = 참조사용자보고식별번호 인 데이타
+	 *   => tb_dsuse_rpt_info, tb_dsuse_rpt_info_dtl 사용여부 'N' update
+	 * - tb_dsuse_mgt
+	 *   폐기 관리 테이블에 사용자보고식별번호 반영
+	 *   => 취소인 경우는 사용자/원사용자 식별번호 clear
+	 *   => 변경인 경우는 사용자보고식별번호 -> 참조사용자보고식별번호 update
 	 * @param dto NimsApiDto.DsuseRptInfo
 	 * 
*/ private void updateDsuseRptAndDsuseMgt(NimsApiDto.DsuseRptInfo dto) { + dto.setRgtr(Constants.NIMS_API_USER_ID); String errMsg; if ("1".equals(dto.getRptTyCd())) errMsg = "취소"; else errMsg = "변경"; @@ -765,9 +782,9 @@ public class BizNimsServiceBean extends AbstractServiceBean implements BizNimsSe if(cnt == 0) throw ApiCustomException.create(String.format("폐기 정보 상세 %s 실패", errMsg)); // 변경인 경우 상세 데이타 건수와 일치 하지 않는 경우 오류 처리 - if ("2".equals(dto.getRptTyCd()) && dto.getRndDtlRptCnt() != cnt) { - throw ApiCustomException.create(String.format("폐기 정보 상세 %s 실패", errMsg)); - } + // if ("2".equals(dto.getRptTyCd()) && dto.getRndDtlRptCnt() != cnt) { + // throw ApiCustomException.create(String.format("폐기 정보 상세 %s 실패", errMsg)); + // } } else { throw ApiCustomException.create(String.format("폐기 정보 %s 실패", errMsg)); 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 83c24eb..74c11b4 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 @@ -170,7 +170,8 @@ public class InfMoisServiceBean extends AbstractServiceBean implements InfMoisSe public void saveResultExchange() { File dirPath = new File(dataRootPath + receiveTemp); List files = listFilesUsingDirectoryStream(dataRootPath + receiveTemp); - files.sort((a, b) -> b.getName().compareTo(a.getName())); + // 올림차순 정렬 + files.sort((a, b) -> a.getName().compareTo(b.getName())); List> rcvTgtFiles = new ArrayList<>(); List dtoList = new ArrayList<>(); diff --git a/src/main/java/cokr/xit/adds/inf/nims/model/NimsApiDto.java b/src/main/java/cokr/xit/adds/inf/nims/model/NimsApiDto.java index 2940c24..51fd53a 100644 --- a/src/main/java/cokr/xit/adds/inf/nims/model/NimsApiDto.java +++ b/src/main/java/cokr/xit/adds/inf/nims/model/NimsApiDto.java @@ -6,6 +6,7 @@ import java.util.List; import javax.validation.Valid; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.annotation.JsonAlias; @@ -436,63 +437,85 @@ public class NimsApiDto { * */ @JsonIgnore - public List mappingNewDsuseRptInfo(List dsuseMgts){ + public List mappingNewDsuseRptInfos(List dsuseMgts){ List newList = new ArrayList<>(); for(BizNimsResponse.DsuseMgtRes mgtDto: dsuseMgts) { - // 폐기 신청서 접수 상태 데이타만 처리 - if (Constants.PRGRS_STTS_CD.RECEIPT.getCode().equals(mgtDto.getPrgrsSttsCd())) { - String rptInfo = String.join("", - this.bsshCd, // 마약류취급자식별번호 - this.hdrDe, // 취급일자 - this.rptDe, // 보고일자 - this.dsuseSeCd, // 폐기구분코드 - this.dsusePrvCd, // 폐기사유코드 - this.dsuseMthCd, // 폐기방법코드 - this.dsuseDe, // 폐기일자 - String.valueOf(this.rndDtlRptCnt) // 수불상세보고수 - ); - String mgtInfo = String.join("", - mgtDto.getBsshCd(), // 마약류취급자식별번호 - mgtDto.getHdrDe(), // 취급일자 - mgtDto.getRptDe(), // 보고일자 - mgtDto.getDsuseSeCd(), // 폐기구분코드 - mgtDto.getDsusePrvCd(), // 폐기사유코드 - mgtDto.getDsuseMthCd(), // 폐기방법코드 - mgtDto.getDsuseDe(), // 폐기일자 - String.valueOf(mgtDto.getRndDtlRptCnt()) // 수불상세보고수 - ); - - // FIXME: 폐기관리와 폐기보고의 상품정보 일치 여부 set - 비교 필드 확정 필요 - if (rptInfo.equals(mgtInfo)) { - if (this.dsuseRptInfoDtls.size() == mgtDto.getDsuseMgtDtls().size()) { - for (DsuseRptInfoDtl rptDtl : this.dsuseRptInfoDtls) { - for (BizNimsRequest.DsuseMgtDtl mgtDtl : mgtDto.getDsuseMgtDtls()) { - if (rptDtl.getPrductCd().equals(mgtDtl.getPrductCd()) - // && rptDtl.getMnfNo().equals(mgtDtl.getMnfNo()) - // && rptDtl.getPrdValidDe().equals(mgtDtl.getPrdValidDe()) - // && rptDtl.getMnfSeq().equals(mgtDtl.getMnfSeq()) - && rptDtl.getDsuseQy().equals(mgtDtl.getDsuseQy())) { - mgtDtl.setValidYn("Y"); - break; - } + BizNimsResponse.DsuseMgtRes dsuseMgtRes = mappingNewDsuseRptInfo(mgtDto); + if(ObjectUtils.isNotEmpty(dsuseMgtRes)) { + newList.add(dsuseMgtRes); + } + } + return newList; + } + + /** + *
+         * 폐기 관리 정보에 폐기 보고 정보 매핑 처리
+         * -> 사용자보고라인식별번호가 매핑되지 않은 경우 - 신규인 경우
+         * -> 폐기관리진행상태가 폐기신청서 접수인 상태의 데이타 대상
+         *
+         * 1. 폐기 관리 정보와 폐기 보고 정보가 동일한 데이타 매핑
+         * 2. 폐기관리 데이타 set
+         *    -> 폐기보고진생상태 - 폐기보고매핑(02)으로 set
+         *    -> 사용자보고식별번호, 원사용자보고식별번호, 보고유형코드, 처리상태 set
+         * @param mgtDto BizNimsResponse.DsuseMgtRes 진행중인 폐기관리목록
+         * @return BizNimsResponse.DsuseMgtRes 매핑 데이타
+         * 
+ */ + @JsonIgnore + public BizNimsResponse.DsuseMgtRes mappingNewDsuseRptInfo(BizNimsResponse.DsuseMgtRes mgtDto) { + // 폐기 신청서 접수 상태 데이타만 처리 + if (Constants.PRGRS_STTS_CD.RECEIPT.getCode().equals(mgtDto.getPrgrsSttsCd())) { + String rptInfo = String.join("", + this.bsshCd, // 마약류취급자식별번호 + this.hdrDe, // 취급일자 + this.rptDe, // 보고일자 + this.dsuseSeCd, // 폐기구분코드 + this.dsusePrvCd, // 폐기사유코드 + this.dsuseMthCd, // 폐기방법코드 + this.dsuseDe, // 폐기일자 + String.valueOf(this.rndDtlRptCnt) // 수불상세보고수 + ); + String mgtInfo = String.join("", + mgtDto.getBsshCd(), // 마약류취급자식별번호 + mgtDto.getHdrDe(), // 취급일자 + mgtDto.getRptDe(), // 보고일자 + mgtDto.getDsuseSeCd(), // 폐기구분코드 + mgtDto.getDsusePrvCd(), // 폐기사유코드 + mgtDto.getDsuseMthCd(), // 폐기방법코드 + mgtDto.getDsuseDe(), // 폐기일자 + String.valueOf(mgtDto.getRndDtlRptCnt()) // 수불상세보고수 + ); + + // FIXME: 폐기관리와 폐기보고의 상품정보 일치 여부 set - 비교 필드 확정 필요 + if (rptInfo.equals(mgtInfo)) { + if (this.dsuseRptInfoDtls.size() == mgtDto.getDsuseMgtDtls().size()) { + for (DsuseRptInfoDtl rptDtl : this.dsuseRptInfoDtls) { + for (BizNimsRequest.DsuseMgtDtl mgtDtl : mgtDto.getDsuseMgtDtls()) { + if (rptDtl.getPrductCd().equals(mgtDtl.getPrductCd()) + // && rptDtl.getMnfNo().equals(mgtDtl.getMnfNo()) + // && rptDtl.getPrdValidDe().equals(mgtDtl.getPrdValidDe()) + // && rptDtl.getMnfSeq().equals(mgtDtl.getMnfSeq()) + && rptDtl.getDsuseQy().equals(mgtDtl.getDsuseQy())) { + mgtDtl.setValidYn("Y"); + break; } } } - mgtDto.setUsrRptIdNo(this.usrRptIdNo); - mgtDto.setOrgUsrRptIdNo(this.orgUsrRptIdNo); - mgtDto.setRptTyCd(this.rptTyCd); - mgtDto.setStts(this.status); - mgtDto.setPrgrsSttsCd(Constants.PRGRS_STTS_CD.MAPPING.getCode()); - mgtDto.setRgtr(this.getRgtr()); - newList.add(mgtDto); } + mgtDto.setUsrRptIdNo(this.usrRptIdNo); + mgtDto.setOrgUsrRptIdNo(this.orgUsrRptIdNo); + mgtDto.setRptTyCd(this.rptTyCd); + mgtDto.setStts(this.status); + mgtDto.setPrgrsSttsCd(Constants.PRGRS_STTS_CD.MAPPING.getCode()); + mgtDto.setRgtr(this.getRgtr()); + return mgtDto; } } - return newList; + return null; } - /** *
          * 폐기 관리 정보에 폐기 보고 정보 매핑 처리
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 2729a15..782d196 100644
--- a/src/main/resources/sql/mapper/biz/nims-mysql-mapper.xml
+++ b/src/main/resources/sql/mapper/biz/nims-mysql-mapper.xml
@@ -270,6 +270,12 @@
         
     
 
+    
+
     
         SELECT tdm.dscdmng_id,          /** 폐기관리ID */
                tdm.user_id,             /** 사용자ID */
@@ -362,6 +368,12 @@
         WHERE dscdmng_id = #{dscdmngId}
     
 
+    
+
     
     
     
@@ -529,7 +541,7 @@
              , mdfcn_dt = DATE_FORMAT(now(), '%Y%m%d%H%i%s')
              , mdfr = #{rgtr}
          WHERE usr_rpt_id_no = #{refUsrRptIdNo}
-           AND use_yn = 'Y'
+           -- AND use_yn = 'Y'
     
 
     

From ec4127f665348ca5a18ebfcc844fa8832c2dc838 Mon Sep 17 00:00:00 2001
From: "Jonguk. Lim" 
Date: Mon, 27 May 2024 16:14:37 +0900
Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=EC=97=90=EB=9F=AC=20=EB=B0=9C?=
 =?UTF-8?q?=EC=83=9D=EC=8B=9C=20error=EB=A1=9C=20return=20=EB=90=98?=
 =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20HTTPS=20status=20code?=
 =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=20=20=20=20=20->=20success:=20false,?=
 =?UTF-8?q?=20HttpStatus.OK,=20code:=20=EC=97=90=EB=9F=AC=EC=BD=94?=
 =?UTF-8?q?=EB=93=9C=20=20=20=20=20=20system=20=EC=97=90=EB=9F=AC=EC=9D=B8?=
 =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0=EB=A7=8C=20error=EB=A1=9C=20return?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../exception/CustomExceptionHandler.java      | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/main/java/cokr/xit/adds/core/spring/exception/CustomExceptionHandler.java b/src/main/java/cokr/xit/adds/core/spring/exception/CustomExceptionHandler.java
index efd1fb9..4ad29b3 100644
--- a/src/main/java/cokr/xit/adds/core/spring/exception/CustomExceptionHandler.java
+++ b/src/main/java/cokr/xit/adds/core/spring/exception/CustomExceptionHandler.java
@@ -47,7 +47,7 @@ public class CustomExceptionHandler {
     @ExceptionHandler(MethodArgumentNotValidException.class)
     public ResponseEntity> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
         final String message = ex.getBindingResult().getAllErrors().get(0).getDefaultMessage();
-        return makeEntity(ResultCode.BAD_REQUEST.getStatusCode(), message, HttpStatus.BAD_REQUEST);
+        return makeEntity(ResultCode.BAD_REQUEST.getStatusCode(), message, HttpStatus.OK);
     }
 
 
@@ -58,7 +58,7 @@ public class CustomExceptionHandler {
      */
     @ExceptionHandler(IllegalArgumentException.class)
     public ResponseEntity> illegalArgumentException(IllegalArgumentException ex) {
-        return makeEntity(ResultCode.BAD_REQUEST.getStatusCode(), ex.getMessage(), HttpStatus.BAD_REQUEST);
+        return makeEntity(ResultCode.BAD_REQUEST.getStatusCode(), ex.getMessage(), HttpStatus.OK);
     }
 
     /**
@@ -68,7 +68,7 @@ public class CustomExceptionHandler {
      */
     @ExceptionHandler(NullPointerException.class)
     public ResponseEntity> handle(NullPointerException ex) {
-        return makeEntity(ResultCode.BAD_REQUEST.getStatusCode(), ex.getMessage(), HttpStatus.BAD_REQUEST);
+        return makeEntity(ResultCode.BAD_REQUEST.getStatusCode(), ex.getMessage(), HttpStatus.OK);
     }
 
     /**
@@ -83,7 +83,7 @@ public class CustomExceptionHandler {
             return makeEntity(ResultCode.UNAUTHORIZED.getStatusCode(), ex.getMessage(), HttpStatus.UNAUTHORIZED);
 
         }
-        return makeEntity(ResultCode.BAD_REQUEST.getStatusCode(), ex.getMessage(), HttpStatus.BAD_REQUEST);
+        return makeEntity(ResultCode.BAD_REQUEST.getStatusCode(), ex.getMessage(), HttpStatus.OK);
     }
 
     /**
@@ -100,7 +100,7 @@ public class CustomExceptionHandler {
         return makeEntity(
             ResultCode.INTERNAL_SERVER_ERROR.getStatusCode(),
             "Does not support request method '" + req.getMethod() + "'",
-            HttpStatus.INTERNAL_SERVER_ERROR
+            HttpStatus.OK
         );
     }
 
@@ -124,7 +124,7 @@ public class CustomExceptionHandler {
 				sb.append(fieldError.getDefaultMessage());
 				sb.append(", ");
 			}
-			return makeEntity(ResultCode.INVALID_DATA.getStatusCode(), sb.toString(), HttpStatus.valueOf(ResultCode.INVALID_DATA.getStatusCode()));
+			return makeEntity(ResultCode.INVALID_DATA.getStatusCode(), sb.toString(), HttpStatus.OK);
 
 		} else if (ex instanceof HttpMessageNotReadableException) {
 			resultCode = ResultCode.INVALID_DATA;
@@ -139,7 +139,7 @@ public class CustomExceptionHandler {
 			resultCode = ResultCode.INTERNAL_SERVER_ERROR;
 		}
 
-        return makeEntity(resultCode.getStatusCode(), resultCode.getMessage(), HttpStatus.valueOf(resultCode.getStatusCode()));
+        return makeEntity(resultCode.getStatusCode(), resultCode.getMessage(), HttpStatus.OK);
     }
 
     /**
@@ -152,7 +152,7 @@ public class CustomExceptionHandler {
         if (Objects.equals(ex.getCode(), ResultCode.NO_CONTENT.getStatusCode())){
 			return new ResponseEntity<>(
 				ApiBaseResponse.builder()
-					.success(true)
+					.success(false)
 					.code(ex.getCode())
 					.message(ex.getMessage())
 					.build(),
@@ -160,7 +160,7 @@ public class CustomExceptionHandler {
 				HttpStatus.OK
 			);
         }
-        return makeEntity(ex.getCode(), ex.getMessage(), HttpStatus.BAD_REQUEST);
+        return makeEntity(ex.getCode(), ex.getMessage(), HttpStatus.OK);
     }
 
     private ResponseEntity> makeEntity(final Integer code, final String message, final HttpStatus status) {

From 7e5fde2f0c4a98293b49f80440d68b6fa5ec10ef Mon Sep 17 00:00:00 2001
From: "Jonguk. Lim" 
Date: Mon, 27 May 2024 16:18:54 +0900
Subject: [PATCH 3/4] =?UTF-8?q?fix:=20TypeReference<>=20generic=20?=
 =?UTF-8?q?=EC=A0=9C=EA=B1=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../xit/adds/core/spring/aop/TraceLoggerAspect.java  |  2 +-
 .../inf/iros/service/bean/InfIrosServiceBean.java    |  2 +-
 .../inf/nims/service/bean/InfNimsServiceBean.java    | 12 ++++++------
 .../java/cokr/xit/adds/inf/iros/IrosRestfulTest.java |  3 +--
 .../xit/adds/inf/mois/model/ExchangeDtoTest.java     |  4 ++--
 .../xit/adds/inf/mois/model/ExchangepackDtoTest.java |  2 +-
 .../cokr/xit/adds/inf/mois/model/PackDtoTest.java    |  2 +-
 7 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/src/main/java/cokr/xit/adds/core/spring/aop/TraceLoggerAspect.java b/src/main/java/cokr/xit/adds/core/spring/aop/TraceLoggerAspect.java
index ea519c9..0b04d6b 100644
--- a/src/main/java/cokr/xit/adds/core/spring/aop/TraceLoggerAspect.java
+++ b/src/main/java/cokr/xit/adds/core/spring/aop/TraceLoggerAspect.java
@@ -117,7 +117,7 @@ public class TraceLoggerAspect {
         HttpServletRequest request = attributes != null? attributes.getRequest(): null;
 
         //traceApiLogging(JsonUtils.toObjByObj(pjp.getArgs()[0], JSONObject.class), request);
-        traceApiLogging(json.parse(json.stringify(pjp.getArgs()[0]), new TypeReference() {}), request);
+        traceApiLogging(json.parse(json.stringify(pjp.getArgs()[0]), new TypeReference<>() {}), request);
         Object result = pjp.proceed();
 
         //noinspection rawtypes
diff --git a/src/main/java/cokr/xit/adds/inf/iros/service/bean/InfIrosServiceBean.java b/src/main/java/cokr/xit/adds/inf/iros/service/bean/InfIrosServiceBean.java
index bbebb78..c8ba5ff 100644
--- a/src/main/java/cokr/xit/adds/inf/iros/service/bean/InfIrosServiceBean.java
+++ b/src/main/java/cokr/xit/adds/inf/iros/service/bean/InfIrosServiceBean.java
@@ -77,7 +77,7 @@ public class InfIrosServiceBean extends AbstractServiceBean implements InfIrosSe
         String rslt = ApiUtil.callIrosApi(irosUrl + drugPrdtMcpnDtlInq, params);
         IrosResponse result = null;
         try {
-            result = json.parse(rslt, new TypeReference>() {});
+            result = json.parse(rslt, new TypeReference<>() {});
         } catch (Exception e) {
 
             if(!isEmpty(e.getCause())){
diff --git a/src/main/java/cokr/xit/adds/inf/nims/service/bean/InfNimsServiceBean.java b/src/main/java/cokr/xit/adds/inf/nims/service/bean/InfNimsServiceBean.java
index 5b995a2..d707a90 100644
--- a/src/main/java/cokr/xit/adds/inf/nims/service/bean/InfNimsServiceBean.java
+++ b/src/main/java/cokr/xit/adds/inf/nims/service/bean/InfNimsServiceBean.java
@@ -86,7 +86,7 @@ public class InfNimsServiceBean extends AbstractServiceBean implements InfNimsSe
 		if(!isEmpty(dto.getYmd())) ApiUtil.checkYmdError(dto.getYmd(), null);
 
 		String rslt = ApiUtil.callNimsApi(nimsUrl + bsshInfoStV1, dto);
-		NimsApiResult result = json.parse(rslt, new TypeReference>() {});
+		NimsApiResult result = json.parse(rslt, new TypeReference<>() {});
 		return result.getResponse();
 	}
 
@@ -98,7 +98,7 @@ public class InfNimsServiceBean extends AbstractServiceBean implements InfNimsSe
 		if(!isEmpty(dto.getYmd())) ApiUtil.checkYmdError(dto.getYmd(), null);
 
 		String rslt = ApiUtil.callNimsApi(nimsUrl + productinfoKd, dto);
-		NimsApiResult result = json.parse(rslt, new TypeReference>() {});
+		NimsApiResult result = json.parse(rslt, new TypeReference<>() {});
 		return result.getResponse();
 	}
 
@@ -110,7 +110,7 @@ public class InfNimsServiceBean extends AbstractServiceBean implements InfNimsSe
 		if(!isEmpty(dto.getYmd())) ApiUtil.checkYmdError(dto.getYmd(), null);
 
 		String rslt = ApiUtil.callNimsApi(nimsUrl + seqinfo, dto);
-		NimsApiResult result = json.parse(rslt, new TypeReference>() {});
+		NimsApiResult result = json.parse(rslt, new TypeReference<>() {});
 		return result.getResponse();
 	}
 
@@ -125,7 +125,7 @@ public class InfNimsServiceBean extends AbstractServiceBean implements InfNimsSe
 	// 	}
 	//
 	// 	String rslt = ApiUtil.callNimsApi(nimsUrl + officeinfo, dto);
-	// 	NimsApiResult result = json.parse(rslt, new TypeReference>() {});
+	// 	NimsApiResult result = json.parse(rslt, new TypeReference<>() {});
 	// 	return result.getResponse();
 	// }
 	//
@@ -142,7 +142,7 @@ public class InfNimsServiceBean extends AbstractServiceBean implements InfNimsSe
 	// 	}
 	//
 	// 	String rslt = ApiUtil.callNimsApi(nimsUrl + placeinfoV1, dto);
-	// 	NimsApiResult result = json.parse(rslt, new TypeReference>() {});
+	// 	NimsApiResult result = json.parse(rslt, new TypeReference<>() {});
 	// 	return result.getResponse();
 	// }
 
@@ -155,7 +155,7 @@ public class InfNimsServiceBean extends AbstractServiceBean implements InfNimsSe
 		ApiUtil.checkYmdError(dto.getEdt(), "edt");
 
 		//String rslt = ApiUtil.callNimsApi(nimsUrl + reportinfo, dto);
-		//NimsApiResult result = json.parse(rslt, new TypeReference>() {});
+		//NimsApiResult result = json.parse(rslt, new TypeReference<>() {});
 		//return result.getResponse();
 
 		return getDsuseRptResponse();
diff --git a/src/test/java/cokr/xit/adds/inf/iros/IrosRestfulTest.java b/src/test/java/cokr/xit/adds/inf/iros/IrosRestfulTest.java
index 6ff03fb..5dd61a4 100644
--- a/src/test/java/cokr/xit/adds/inf/iros/IrosRestfulTest.java
+++ b/src/test/java/cokr/xit/adds/inf/iros/IrosRestfulTest.java
@@ -63,8 +63,7 @@ public class IrosRestfulTest {
             request.uri(uri + urlParam);
         });
 
-        IrosResponse parse = new JSON().parse(rslt.body(),
-            new TypeReference>() {
+        IrosResponse parse = new JSON().parse(rslt.body(), new TypeReference<>() {
             });
 
         System.out.println(parse);
diff --git a/src/test/java/cokr/xit/adds/inf/mois/model/ExchangeDtoTest.java b/src/test/java/cokr/xit/adds/inf/mois/model/ExchangeDtoTest.java
index 6b57d8e..2e2a650 100644
--- a/src/test/java/cokr/xit/adds/inf/mois/model/ExchangeDtoTest.java
+++ b/src/test/java/cokr/xit/adds/inf/mois/model/ExchangeDtoTest.java
@@ -193,7 +193,7 @@ public class ExchangeDtoTest {
         XML xml = new XML();
         //ApiUtil.validateXmlFromXmlStr(content, "src/main/resources/xsd/pack.xsd");
 
-        ExchangeDto dto2 = xml.parse(content, new TypeReference() {});
+        ExchangeDto dto2 = xml.parse(content, new TypeReference<>() {});
         log.info("dto: {}", dto2);
         xml.write(System.out, dto2, true);
 
@@ -226,7 +226,7 @@ public class ExchangeDtoTest {
         XML xml = new XML();
         //ApiUtil.validateXmlFromXmlStr(content, "src/main/resources/xsd/pack.xsd");
 
-        ExchangeDto dto2 = xml.parse(content, new TypeReference() {});
+        ExchangeDto dto2 = xml.parse(content, new TypeReference<>() {});
         log.info("dto: {}", dto2);
         xml.write(System.out, dto2, true);
 
diff --git a/src/test/java/cokr/xit/adds/inf/mois/model/ExchangepackDtoTest.java b/src/test/java/cokr/xit/adds/inf/mois/model/ExchangepackDtoTest.java
index c90033e..dff7aec 100644
--- a/src/test/java/cokr/xit/adds/inf/mois/model/ExchangepackDtoTest.java
+++ b/src/test/java/cokr/xit/adds/inf/mois/model/ExchangepackDtoTest.java
@@ -87,7 +87,7 @@ public class ExchangepackDtoTest {
         // xmlMapper.writeValue(System.out, dto);
 
         XML xml = new XML();
-        ExchangepackDto dto = xml.parse(exchangeXml, new TypeReference() {});
+        ExchangepackDto dto = xml.parse(exchangeXml, new TypeReference<>() {});
         log.info("dto: {}", dto);
         xml.write(System.out, dto, true);
     }
diff --git a/src/test/java/cokr/xit/adds/inf/mois/model/PackDtoTest.java b/src/test/java/cokr/xit/adds/inf/mois/model/PackDtoTest.java
index 9ae5e2e..4345c4d 100644
--- a/src/test/java/cokr/xit/adds/inf/mois/model/PackDtoTest.java
+++ b/src/test/java/cokr/xit/adds/inf/mois/model/PackDtoTest.java
@@ -53,7 +53,7 @@ public class PackDtoTest {
         String content = new String(bytes);
         ApiUtil.validateXmlFromXmlStr(content, "src/main/resources/xsd/pack.xsd");
 
-        PackDto dto = xml.parse(content, new TypeReference() {});
+        PackDto dto = xml.parse(content, new TypeReference<>() {});
         log.info("dto: {}", dto);
         xml.write(System.out, dto, true);
 

From 5e94a3ebb719836066b4fefdbecd268fd5ae4a6c Mon Sep 17 00:00:00 2001
From: "Jonguk. Lim" 
Date: Mon, 27 May 2024 18:54:58 +0900
Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=ED=8F=90=EA=B8=B0=EC=8B=A0?=
 =?UTF-8?q?=EC=B2=AD=EC=84=9C=EC=A0=91=EC=88=98,=20=ED=86=B5=EB=B3=B4[?=
 =?UTF-8?q?=EA=B2=B0=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 @@ + + + + + + + + + 폐기 통보[결과] 처리 + + + + + + + + +
+ +
+
+ +
+ + + + + + +