diff --git a/src/main/java/com/worker/domain/entity/CpImagesize.java b/src/main/java/com/worker/domain/entity/CpImagesize.java new file mode 100644 index 0000000..6301b29 --- /dev/null +++ b/src/main/java/com/worker/domain/entity/CpImagesize.java @@ -0,0 +1,47 @@ +package com.worker.domain.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "cp_imagesize") +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CpImagesize { + + @Id + @Column(name = "IS_MMCODE", length = 16, nullable = false) + private String isMmcode; + + @Column(name = "IS_IMAGE1", columnDefinition = "int default 0") + private Integer isImage1; + + @Column(name = "IS_IMAGE2", columnDefinition = "int default 0") + private Integer isImage2; + + @Column(name = "IS_IMAGE3", columnDefinition = "int default 0") + private Integer isImage3; + + @Column(name = "IS_IMAGE4", columnDefinition = "int default 0") + private Integer isImage4; + + @Column(name = "IS_VIDEO", columnDefinition = "int default 0") + private Integer isVideo; + + @Column(name = "IS_RECALL1", columnDefinition = "int default 0") + private Integer isRecall1; + + @Column(name = "IS_RECALL2", columnDefinition = "int default 0") + private Integer isRecall2; + + @Column(name = "IS_RECALL3", columnDefinition = "int default 0") + private Integer isRecall3; +} diff --git a/src/main/java/com/worker/domain/repo/cp/CpImagesizeRepository.java b/src/main/java/com/worker/domain/repo/cp/CpImagesizeRepository.java new file mode 100644 index 0000000..58755dc --- /dev/null +++ b/src/main/java/com/worker/domain/repo/cp/CpImagesizeRepository.java @@ -0,0 +1,7 @@ +package com.worker.domain.repo.cp; + +import com.worker.domain.entity.CpImagesize; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CpImagesizeRepository extends JpaRepository { +} diff --git a/src/main/java/com/worker/domain/repo/cp/CpSggRepository.java b/src/main/java/com/worker/domain/repo/cp/CpSggRepository.java index 97f0da5..ab6402e 100644 --- a/src/main/java/com/worker/domain/repo/cp/CpSggRepository.java +++ b/src/main/java/com/worker/domain/repo/cp/CpSggRepository.java @@ -3,5 +3,8 @@ package com.worker.domain.repo.cp; import com.worker.domain.entity.CpSgg; import org.springframework.data.jpa.repository.JpaRepository; -public interface CpSggRepository extends JpaRepository { +import java.util.List; + +public interface CpSggRepository extends JpaRepository { + CpSgg findBySgDepCode(String sgDepCode); } diff --git a/src/main/java/com/worker/domain/repo/ep/EpImagesizeRepository.java b/src/main/java/com/worker/domain/repo/ep/EpImagesizeRepository.java new file mode 100644 index 0000000..ff037eb --- /dev/null +++ b/src/main/java/com/worker/domain/repo/ep/EpImagesizeRepository.java @@ -0,0 +1,7 @@ +package com.worker.domain.repo.ep; + +import com.worker.domain.entity.CpImagesize; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EpImagesizeRepository extends JpaRepository { +} diff --git a/src/main/java/com/worker/domain/repo/ep/EpSggRepository.java b/src/main/java/com/worker/domain/repo/ep/EpSggRepository.java index 1f44589..cb869ce 100644 --- a/src/main/java/com/worker/domain/repo/ep/EpSggRepository.java +++ b/src/main/java/com/worker/domain/repo/ep/EpSggRepository.java @@ -1,4 +1,8 @@ package com.worker.domain.repo.ep; -public interface EpSggRepository { +import com.worker.domain.entity.CpSgg; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EpSggRepository extends JpaRepository { + CpSgg findBySgDepCode(String pcdDeptV); } diff --git a/src/main/java/com/worker/dto/SinmungoDto.java b/src/main/java/com/worker/dto/SinmungoDto.java index efb925d..fad9b8f 100644 --- a/src/main/java/com/worker/dto/SinmungoDto.java +++ b/src/main/java/com/worker/dto/SinmungoDto.java @@ -83,6 +83,8 @@ public class SinmungoDto { private String fileName; @Lob private byte[] imageBytes; + private Integer fileSize; + private int fileType; } diff --git a/src/main/java/com/worker/scheduler/smg/service/DbPolling.java b/src/main/java/com/worker/scheduler/smg/service/DbPolling.java index 3881c33..e23ca60 100644 --- a/src/main/java/com/worker/scheduler/smg/service/DbPolling.java +++ b/src/main/java/com/worker/scheduler/smg/service/DbPolling.java @@ -47,8 +47,10 @@ public class DbPolling { private final EpAnswerRepository epAnswerRepository; private final CpMainEtc1Repository cpMainEtc1Repository; private final EpMainEtc1Repository epMainEtc1Repository; - private final CpUserRepository cpUserRepository; - + private final CpSggRepository cpSggRepository; + private final EpSggRepository epSggRepository; + private final CpImagesizeRepository cpImagesizeRepository; + private final EpImagesizeRepository epImagesizeRepository; public SinmungoDto.SetInfo findSetInfo() { @@ -88,24 +90,27 @@ public class DbPolling { List cpAnswerList = new ArrayList<>(); List cpMainEtc1List = new ArrayList<>(); List insertCompleteFileNm = new ArrayList<>(); + List cpImagesizeList = new ArrayList<>(); - //mm_code 맥스값 가져오기 - long maxMmCode = getMaxMmCode(setInfo, "CP"); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); - for (int i = 0; i < cpList.size(); i++) { + for (int i = 1; i < cpList.size(); i++) { SinmungoDto.SinmungoXml xml = cpList.get(i); String sgpos = getSgPosByReason(setInfo, xml.getPeti_reason_l()); + String sggCode = findSggCodeByDepCode(xml, "cp"); + //mm_code 맥스값 가져오기 + String mmCode = String.valueOf(getMaxMmCode(sggCode, "CP") + i); + //getCivil_no_c() 기준으로 중복되는건 패스 boolean isExists = cpAnswerRepository.existsByAsJsnoM(xml.getCivil_no_c()); if (isExists) {continue;} // CpMain cpMainList.add(CpMain.builder() - .mmCode(String.valueOf(maxMmCode + i)) - .mmSggcode(setInfo.getEpSetinfo().getIntValue1().toString()) + .mmCode(mmCode) + .mmSggcode(sggCode) .mmIngb("1") .mmDate(DateTimePatternEnum.DATE_YYYYMMDD.extractFirst(xml.getPeti_reason_l())) .mmTime(DateTimePatternEnum.TIME_HHMM.extractFirst(xml.getPeti_reason_l())) @@ -131,8 +136,8 @@ public class DbPolling { // CpAnswer cpAnswerList.add(CpAnswer.builder() - .asMmcode(String.valueOf(maxMmCode + i)) - .asSggcode(setInfo.getCpSetinfo().getIntValue1().toString()) + .asMmcode(mmCode) + .asSggcode(sggCode) .asIngb(TakeSeCdEnum.findTakeSeCd(xml.getPeti_anc_code_v())) .asJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", "")) .asJsno(xml.getPeti_no_c()) @@ -150,7 +155,7 @@ public class DbPolling { // CpMainEtc1 cpMainEtc1List.add(CpMainEtc1.builder() - .mmCode(String.valueOf(maxMmCode + i)) + .mmCode(mmCode) .mmJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", "")) .mmKey(xml.getInterface_seq_n()) .mmText(CommonUtils.truncate(xml.getPeti_reason_l(), 4000)) @@ -158,7 +163,26 @@ public class DbPolling { insertCompleteFileNm.add(cpList.get(i).getFileName()); - changeImgFileNmToMmcode(cpList, i, String.valueOf(maxMmCode + i)); + changeImgFileNmToMmcode(cpList, i, mmCode); + + + if(isVideoExists(xml)) { + cpImagesizeList.add(CpImagesize.builder() + .isMmcode(mmCode) + .isVideo(extractOnlyVideoFileSize(xml.getImgParsers())) + .build()); + } + else { + cpImagesizeList.add(CpImagesize.builder() + .isMmcode(mmCode) + .isImage1(sizeAtOrZero(xml.getImgParsers(), 0)) + .isImage2(sizeAtOrZero(xml.getImgParsers(), 1)) + .isImage3(sizeAtOrZero(xml.getImgParsers(), 2)) + .isImage4(sizeAtOrZero(xml.getImgParsers(), 3)) + .build()); + } + + } @@ -171,6 +195,7 @@ public class DbPolling { cpMainRepository.saveAll(cpMainList); cpAnswerRepository.saveAll(cpAnswerList); cpMainEtc1Repository.saveAll(cpMainEtc1List); + cpImagesizeRepository.saveAll(cpImagesizeList); // 파일 백업 fileBackup(setInfo.getCpSetinfo(), cpList); @@ -185,22 +210,27 @@ public class DbPolling { List cpAnswerList = new ArrayList<>(); List cpMainEtc1List = new ArrayList<>(); List insertCompleteFileNm = new ArrayList<>(); + List cpImagesizeList = new ArrayList<>(); - //mm_code 맥스값 가져오기 - long maxMmCode = getMaxMmCode(setInfo, "EP"); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); - for (int i = 0; i < epList.size(); i++) { + for (int i = 1; i < epList.size(); i++) { SinmungoDto.SinmungoXml xml = epList.get(i); - String sgpos = getSgPosByReason(setInfo, xml.getPeti_reason_l()); - boolean isExists = epAnswerRepository.existsByAsJsnoM(xml.getCivil_no_c()); if (isExists) {continue;} + String sgpos = getSgPosByReason(setInfo, xml.getPeti_reason_l()); + + String sggCode = findSggCodeByDepCode(xml, "ep"); + //mm_code 맥스값 가져오기 + String mmCode = String.valueOf(getMaxMmCode(sggCode, "EP") + i); + + + cpMainList.add(CpMain.builder() - .mmCode(String.valueOf(maxMmCode + i)) - .mmSggcode(setInfo.getEpSetinfo().getIntValue1().toString()) + .mmCode(mmCode) + .mmSggcode(sggCode) .mmIngb("1") .mmDate(DateTimePatternEnum.DATE_YYYYMMDD.extractFirst(xml.getPeti_reason_l())) .mmTime(DateTimePatternEnum.TIME_HHMM.extractFirst(xml.getPeti_reason_l())) @@ -221,13 +251,13 @@ public class DbPolling { .mmOmcode("0") .mmGpsX(getGpsByReason(xml.getPeti_reason_l(), "위도")) .mmGpsY(getGpsByReason(xml.getPeti_reason_l(), "경도")) - .mmVideofilenm("Z.mp4") + .mmVideofilenm(videoFileName(xml.getImgParsers(), mmCode)) .build()); // CpAnswer cpAnswerList.add(CpAnswer.builder() - .asMmcode(String.valueOf(maxMmCode + i)) - .asSggcode(setInfo.getCpSetinfo().getIntValue1().toString()) + .asMmcode(mmCode) + .asSggcode(sggCode) .asIngb(TakeSeCdEnum.findTakeSeCd(xml.getPeti_anc_code_v())) .asJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", "")) .asJsno(xml.getPeti_no_c()) @@ -245,7 +275,7 @@ public class DbPolling { // CpMainEtc1 cpMainEtc1List.add(CpMainEtc1.builder() - .mmCode(String.valueOf(maxMmCode + i)) + .mmCode(mmCode) .mmJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", "")) .mmKey(xml.getInterface_seq_n()) .mmText(CommonUtils.truncate(xml.getPeti_reason_l(), 4000)) @@ -253,7 +283,23 @@ public class DbPolling { insertCompleteFileNm.add(epList.get(i).getFileName()); - changeImgFileNmToMmcode(epList, i, String.valueOf(maxMmCode + i)); + changeImgFileNmToMmcode(epList, i, mmCode); + + if(isVideoExists(xml)) { + cpImagesizeList.add(CpImagesize.builder() + .isMmcode(mmCode) + .isVideo(extractOnlyVideoFileSize(xml.getImgParsers())) + .build()); + } + else { + cpImagesizeList.add(CpImagesize.builder() + .isMmcode(mmCode) + .isImage1(sizeAtOrZero(xml.getImgParsers(), 0)) + .isImage2(sizeAtOrZero(xml.getImgParsers(), 1)) + .isImage3(sizeAtOrZero(xml.getImgParsers(), 2)) + .isImage4(sizeAtOrZero(xml.getImgParsers(), 3)) + .build()); + } } @@ -266,6 +312,7 @@ public class DbPolling { epMainRepository.saveAll(cpMainList); epAnswerRepository.saveAll(cpAnswerList); epMainEtc1Repository.saveAll(cpMainEtc1List); + epImagesizeRepository.saveAll(cpImagesizeList); // 파일백업 fileBackup(setInfo.getEpSetinfo(), epList); @@ -290,15 +337,10 @@ public class DbPolling { * MMCode 조회후 MAX값 리턴 * 없다면 0000000 으로 리턴 * */ - private long getMaxMmCode(SinmungoDto.SetInfo setInfo, String db) { + private long getMaxMmCode(String sggCode, String db) { - String prefix = null; - if(db.equals("CP")) { - prefix = setInfo.getCpSetinfo().getIntValue1() + Integer.toString(Year.now().getValue()); - } else { - prefix = setInfo.getEpSetinfo().getIntValue1() + Integer.toString(Year.now().getValue()); - } + String prefix = sggCode + Integer.toString(Year.now().getValue()); CpMain cpMainMax; @@ -386,7 +428,7 @@ public class DbPolling { return LawGBEnum.UNKNOWN; } - + //비디오 파일 여부를 체크하고, 코드값을 리턴한다. private String isVideoFile(SinmungoDto.SinmungoXml xml) { return Stream.of( xml.getPeti_file_path1_v(), @@ -399,10 +441,69 @@ public class DbPolling { .anyMatch(path -> FileKind.codeFromFileName(path) == 2) ? "2" : "1"; } + //이미지 파일을 mmCode + abcd 를 붙여 변환한다. private void changeImgFileNmToMmcode(List eachList, int index, String mmcode) { for(int i = 0; i < eachList.get(index).getImgParsers().size(); i++ ) { char suffix = (char) ('A' + i); // A, B, C, D ... - eachList.get(index).getImgParsers().get(i).setFileName(mmcode+suffix+".jpg"); + if(eachList.get(index).getImgParsers().get(i).getFileType() != 1) { + eachList.get(index).getImgParsers().get(i).setFileName(mmcode+suffix+".jpg"); + } else eachList.get(index).getImgParsers().get(i).setFileName(mmcode+suffix+"Z.mp4"); + } + } + + // 부과코드로 시군구 코드를 조회한다. + private String findSggCodeByDepCode(SinmungoDto.SinmungoXml xml, String dbType) { + String sggCode = null; + if(dbType.equals("CP")) sggCode = cpSggRepository.findBySgDepCode(xml.getPcd_dept_v()).getSgSggCode(); + else sggCode = epSggRepository.findBySgDepCode(xml.getPcd_dept_v()).getSgSggCode(); + return sggCode; + } + + // 동적인 파일갯수의 사이즈 널처리. + // 널이면 0을 리턴한다. + private int sizeAtOrZero(List parsers, int index) { + if (parsers == null || index < 0 || index >= parsers.size()) return 0; + + SinmungoDto.ImgParser p = parsers.get(index); + if (parsers.get(index) == null) return 0; + Integer size = p.getFileSize(); + if (size == null) return 0; + + // int(10) 컬럼이라면 안전 변환 + return (int) Math.min(size, Integer.MAX_VALUE); + } + + // 비디오 유무확인 + // 리스트에 비디오가 포함되어있으면 true 없으면 false를 리턴 + private Boolean isVideoExists(SinmungoDto.SinmungoXml xml) { + + if (xml == null || xml.getImgParsers() == null) { + return false; + } + return xml.getImgParsers().stream() + .anyMatch(imgParser -> imgParser.getFileType() == 2); + + } + + private int extractOnlyVideoFileSize(List imgs) { + for(SinmungoDto.ImgParser img : imgs){ + if(img.getFileType() == 2) return img.getFileSize(); } + return 0; } + + + // 비디오 파일이면 mmCode + mp4를 붙여서 파일명을 리턴한다. + private String videoFileName(List imgList, String mmCode) { + + for(SinmungoDto.ImgParser item : imgList){ + if(item.getFileType() == 1) { + return mmCode + "z.mp4"; + } else { + return null; + } + } + return null; + } + } diff --git a/src/main/java/com/worker/util/fileReader/XmlReader.java b/src/main/java/com/worker/util/fileReader/XmlReader.java index c3a653d..a6cdf67 100644 --- a/src/main/java/com/worker/util/fileReader/XmlReader.java +++ b/src/main/java/com/worker/util/fileReader/XmlReader.java @@ -76,7 +76,12 @@ public class XmlReader { public void imgLocalSave(Path localImgPath, List imgParsers) { for (SinmungoDto.ImgParser img : imgParsers) { if (img.getFileName() != null && img.getImageBytes() != null) { - Path target = localImgPath.resolve(img.getFileName()); + log.info("파일명 체크" + img.getFileName()); + Path target = localImgPath + //시군구 코드 + .resolve(img.getFileName().substring(0, 5)) + .resolve(String.valueOf(java.time.LocalDate.now().getYear())) + .resolve(img.getFileName()); try { Files.createDirectories(target.getParent()); Files.write(target, img.getImageBytes()); diff --git a/src/main/java/com/worker/util/fileReader/impl/SinmungoXmlParser.java b/src/main/java/com/worker/util/fileReader/impl/SinmungoXmlParser.java index e35ca99..92268c1 100644 --- a/src/main/java/com/worker/util/fileReader/impl/SinmungoXmlParser.java +++ b/src/main/java/com/worker/util/fileReader/impl/SinmungoXmlParser.java @@ -1,6 +1,7 @@ package com.worker.util.fileReader.impl; import com.worker.dto.SinmungoDto; +import com.worker.util.common.commEnum.FileKind; import com.worker.util.fileReader.XmlParserInterface; import org.springframework.stereotype.Component; import org.w3c.dom.Document; @@ -86,10 +87,14 @@ public class SinmungoXmlParser implements XmlParserInterface