feat : 이미지 사이즈 테이블 인서트 추가, 동영상 처리 로직 추가

master
Kurt92 4 months ago
parent 54d49a1bfb
commit 20eeaaabd8

@ -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;
}

@ -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<CpImagesize,String> {
}

@ -3,5 +3,8 @@ package com.worker.domain.repo.cp;
import com.worker.domain.entity.CpSgg; import com.worker.domain.entity.CpSgg;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
public interface CpSggRepository extends JpaRepository<CpSgg, Integer> { import java.util.List;
public interface CpSggRepository extends JpaRepository<CpSgg, String> {
CpSgg findBySgDepCode(String sgDepCode);
} }

@ -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<CpImagesize,String> {
}

@ -1,4 +1,8 @@
package com.worker.domain.repo.ep; 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, String> {
CpSgg findBySgDepCode(String pcdDeptV);
} }

@ -83,6 +83,8 @@ public class SinmungoDto {
private String fileName; private String fileName;
@Lob @Lob
private byte[] imageBytes; private byte[] imageBytes;
private Integer fileSize;
private int fileType;
} }

@ -47,8 +47,10 @@ public class DbPolling {
private final EpAnswerRepository epAnswerRepository; private final EpAnswerRepository epAnswerRepository;
private final CpMainEtc1Repository cpMainEtc1Repository; private final CpMainEtc1Repository cpMainEtc1Repository;
private final EpMainEtc1Repository epMainEtc1Repository; 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() { public SinmungoDto.SetInfo findSetInfo() {
@ -88,24 +90,27 @@ public class DbPolling {
List<CpAnswer> cpAnswerList = new ArrayList<>(); List<CpAnswer> cpAnswerList = new ArrayList<>();
List<CpMainEtc1> cpMainEtc1List = new ArrayList<>(); List<CpMainEtc1> cpMainEtc1List = new ArrayList<>();
List<String> insertCompleteFileNm = new ArrayList<>(); List<String> insertCompleteFileNm = new ArrayList<>();
List<CpImagesize> cpImagesizeList = new ArrayList<>();
//mm_code 맥스값 가져오기
long maxMmCode = getMaxMmCode(setInfo, "CP");
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 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); SinmungoDto.SinmungoXml xml = cpList.get(i);
String sgpos = getSgPosByReason(setInfo, xml.getPeti_reason_l()); 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(<civil_no_c><![CDATA[2AA-2506-0697203]]></civil_no_c>) 기준으로 중복되는건 패스 //getCivil_no_c(<civil_no_c><![CDATA[2AA-2506-0697203]]></civil_no_c>) 기준으로 중복되는건 패스
boolean isExists = cpAnswerRepository.existsByAsJsnoM(xml.getCivil_no_c()); boolean isExists = cpAnswerRepository.existsByAsJsnoM(xml.getCivil_no_c());
if (isExists) {continue;} if (isExists) {continue;}
// CpMain // CpMain
cpMainList.add(CpMain.builder() cpMainList.add(CpMain.builder()
.mmCode(String.valueOf(maxMmCode + i)) .mmCode(mmCode)
.mmSggcode(setInfo.getEpSetinfo().getIntValue1().toString()) .mmSggcode(sggCode)
.mmIngb("1") .mmIngb("1")
.mmDate(DateTimePatternEnum.DATE_YYYYMMDD.extractFirst(xml.getPeti_reason_l())) .mmDate(DateTimePatternEnum.DATE_YYYYMMDD.extractFirst(xml.getPeti_reason_l()))
.mmTime(DateTimePatternEnum.TIME_HHMM.extractFirst(xml.getPeti_reason_l())) .mmTime(DateTimePatternEnum.TIME_HHMM.extractFirst(xml.getPeti_reason_l()))
@ -131,8 +136,8 @@ public class DbPolling {
// CpAnswer // CpAnswer
cpAnswerList.add(CpAnswer.builder() cpAnswerList.add(CpAnswer.builder()
.asMmcode(String.valueOf(maxMmCode + i)) .asMmcode(mmCode)
.asSggcode(setInfo.getCpSetinfo().getIntValue1().toString()) .asSggcode(sggCode)
.asIngb(TakeSeCdEnum.findTakeSeCd(xml.getPeti_anc_code_v())) .asIngb(TakeSeCdEnum.findTakeSeCd(xml.getPeti_anc_code_v()))
.asJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", "")) .asJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", ""))
.asJsno(xml.getPeti_no_c()) .asJsno(xml.getPeti_no_c())
@ -150,7 +155,7 @@ public class DbPolling {
// CpMainEtc1 // CpMainEtc1
cpMainEtc1List.add(CpMainEtc1.builder() cpMainEtc1List.add(CpMainEtc1.builder()
.mmCode(String.valueOf(maxMmCode + i)) .mmCode(mmCode)
.mmJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", "")) .mmJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", ""))
.mmKey(xml.getInterface_seq_n()) .mmKey(xml.getInterface_seq_n())
.mmText(CommonUtils.truncate(xml.getPeti_reason_l(), 4000)) .mmText(CommonUtils.truncate(xml.getPeti_reason_l(), 4000))
@ -158,7 +163,26 @@ public class DbPolling {
insertCompleteFileNm.add(cpList.get(i).getFileName()); 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); cpMainRepository.saveAll(cpMainList);
cpAnswerRepository.saveAll(cpAnswerList); cpAnswerRepository.saveAll(cpAnswerList);
cpMainEtc1Repository.saveAll(cpMainEtc1List); cpMainEtc1Repository.saveAll(cpMainEtc1List);
cpImagesizeRepository.saveAll(cpImagesizeList);
// 파일 백업 // 파일 백업
fileBackup(setInfo.getCpSetinfo(), cpList); fileBackup(setInfo.getCpSetinfo(), cpList);
@ -185,22 +210,27 @@ public class DbPolling {
List<CpAnswer> cpAnswerList = new ArrayList<>(); List<CpAnswer> cpAnswerList = new ArrayList<>();
List<CpMainEtc1> cpMainEtc1List = new ArrayList<>(); List<CpMainEtc1> cpMainEtc1List = new ArrayList<>();
List<String> insertCompleteFileNm = new ArrayList<>(); List<String> insertCompleteFileNm = new ArrayList<>();
List<CpImagesize> cpImagesizeList = new ArrayList<>();
//mm_code 맥스값 가져오기
long maxMmCode = getMaxMmCode(setInfo, "EP");
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 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); SinmungoDto.SinmungoXml xml = epList.get(i);
String sgpos = getSgPosByReason(setInfo, xml.getPeti_reason_l());
boolean isExists = epAnswerRepository.existsByAsJsnoM(xml.getCivil_no_c()); boolean isExists = epAnswerRepository.existsByAsJsnoM(xml.getCivil_no_c());
if (isExists) {continue;} 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() cpMainList.add(CpMain.builder()
.mmCode(String.valueOf(maxMmCode + i)) .mmCode(mmCode)
.mmSggcode(setInfo.getEpSetinfo().getIntValue1().toString()) .mmSggcode(sggCode)
.mmIngb("1") .mmIngb("1")
.mmDate(DateTimePatternEnum.DATE_YYYYMMDD.extractFirst(xml.getPeti_reason_l())) .mmDate(DateTimePatternEnum.DATE_YYYYMMDD.extractFirst(xml.getPeti_reason_l()))
.mmTime(DateTimePatternEnum.TIME_HHMM.extractFirst(xml.getPeti_reason_l())) .mmTime(DateTimePatternEnum.TIME_HHMM.extractFirst(xml.getPeti_reason_l()))
@ -221,13 +251,13 @@ public class DbPolling {
.mmOmcode("0") .mmOmcode("0")
.mmGpsX(getGpsByReason(xml.getPeti_reason_l(), "위도")) .mmGpsX(getGpsByReason(xml.getPeti_reason_l(), "위도"))
.mmGpsY(getGpsByReason(xml.getPeti_reason_l(), "경도")) .mmGpsY(getGpsByReason(xml.getPeti_reason_l(), "경도"))
.mmVideofilenm("Z.mp4") .mmVideofilenm(videoFileName(xml.getImgParsers(), mmCode))
.build()); .build());
// CpAnswer // CpAnswer
cpAnswerList.add(CpAnswer.builder() cpAnswerList.add(CpAnswer.builder()
.asMmcode(String.valueOf(maxMmCode + i)) .asMmcode(mmCode)
.asSggcode(setInfo.getCpSetinfo().getIntValue1().toString()) .asSggcode(sggCode)
.asIngb(TakeSeCdEnum.findTakeSeCd(xml.getPeti_anc_code_v())) .asIngb(TakeSeCdEnum.findTakeSeCd(xml.getPeti_anc_code_v()))
.asJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", "")) .asJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", ""))
.asJsno(xml.getPeti_no_c()) .asJsno(xml.getPeti_no_c())
@ -245,7 +275,7 @@ public class DbPolling {
// CpMainEtc1 // CpMainEtc1
cpMainEtc1List.add(CpMainEtc1.builder() cpMainEtc1List.add(CpMainEtc1.builder()
.mmCode(String.valueOf(maxMmCode + i)) .mmCode(mmCode)
.mmJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", "")) .mmJsdate(xml.getAnc_reg_d().substring(0, 10).replace("-", ""))
.mmKey(xml.getInterface_seq_n()) .mmKey(xml.getInterface_seq_n())
.mmText(CommonUtils.truncate(xml.getPeti_reason_l(), 4000)) .mmText(CommonUtils.truncate(xml.getPeti_reason_l(), 4000))
@ -253,7 +283,23 @@ public class DbPolling {
insertCompleteFileNm.add(epList.get(i).getFileName()); 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); epMainRepository.saveAll(cpMainList);
epAnswerRepository.saveAll(cpAnswerList); epAnswerRepository.saveAll(cpAnswerList);
epMainEtc1Repository.saveAll(cpMainEtc1List); epMainEtc1Repository.saveAll(cpMainEtc1List);
epImagesizeRepository.saveAll(cpImagesizeList);
// 파일백업 // 파일백업
fileBackup(setInfo.getEpSetinfo(), epList); fileBackup(setInfo.getEpSetinfo(), epList);
@ -290,15 +337,10 @@ public class DbPolling {
* MMCode MAX * MMCode MAX
* 0000000 * 0000000
* */ * */
private long getMaxMmCode(SinmungoDto.SetInfo setInfo, String db) { private long getMaxMmCode(String sggCode, String db) {
String prefix = null; String prefix = sggCode + Integer.toString(Year.now().getValue());
if(db.equals("CP")) {
prefix = setInfo.getCpSetinfo().getIntValue1() + Integer.toString(Year.now().getValue());
} else {
prefix = setInfo.getEpSetinfo().getIntValue1() + Integer.toString(Year.now().getValue());
}
CpMain cpMainMax; CpMain cpMainMax;
@ -386,7 +428,7 @@ public class DbPolling {
return LawGBEnum.UNKNOWN; return LawGBEnum.UNKNOWN;
} }
//비디오 파일 여부를 체크하고, 코드값을 리턴한다.
private String isVideoFile(SinmungoDto.SinmungoXml xml) { private String isVideoFile(SinmungoDto.SinmungoXml xml) {
return Stream.of( return Stream.of(
xml.getPeti_file_path1_v(), xml.getPeti_file_path1_v(),
@ -399,10 +441,69 @@ public class DbPolling {
.anyMatch(path -> FileKind.codeFromFileName(path) == 2) ? "2" : "1"; .anyMatch(path -> FileKind.codeFromFileName(path) == 2) ? "2" : "1";
} }
//이미지 파일을 mmCode + abcd 를 붙여 변환한다.
private void changeImgFileNmToMmcode(List<SinmungoDto.SinmungoXml> eachList, int index, String mmcode) { private void changeImgFileNmToMmcode(List<SinmungoDto.SinmungoXml> eachList, int index, String mmcode) {
for(int i = 0; i < eachList.get(index).getImgParsers().size(); i++ ) { for(int i = 0; i < eachList.get(index).getImgParsers().size(); i++ ) {
char suffix = (char) ('A' + i); // A, B, C, D ... char suffix = (char) ('A' + i); // A, B, C, D ...
if(eachList.get(index).getImgParsers().get(i).getFileType() != 1) {
eachList.get(index).getImgParsers().get(i).setFileName(mmcode+suffix+".jpg"); 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<SinmungoDto.ImgParser> 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<SinmungoDto.ImgParser> imgs) {
for(SinmungoDto.ImgParser img : imgs){
if(img.getFileType() == 2) return img.getFileSize();
}
return 0;
}
// 비디오 파일이면 mmCode + mp4를 붙여서 파일명을 리턴한다.
private String videoFileName(List<SinmungoDto.ImgParser> imgList, String mmCode) {
for(SinmungoDto.ImgParser item : imgList){
if(item.getFileType() == 1) {
return mmCode + "z.mp4";
} else {
return null;
}
}
return null;
}
} }

@ -76,7 +76,12 @@ public class XmlReader {
public void imgLocalSave(Path localImgPath, List<SinmungoDto.ImgParser> imgParsers) { public void imgLocalSave(Path localImgPath, List<SinmungoDto.ImgParser> imgParsers) {
for (SinmungoDto.ImgParser img : imgParsers) { for (SinmungoDto.ImgParser img : imgParsers) {
if (img.getFileName() != null && img.getImageBytes() != null) { 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 { try {
Files.createDirectories(target.getParent()); Files.createDirectories(target.getParent());
Files.write(target, img.getImageBytes()); Files.write(target, img.getImageBytes());

@ -1,6 +1,7 @@
package com.worker.util.fileReader.impl; package com.worker.util.fileReader.impl;
import com.worker.dto.SinmungoDto; import com.worker.dto.SinmungoDto;
import com.worker.util.common.commEnum.FileKind;
import com.worker.util.fileReader.XmlParserInterface; import com.worker.util.fileReader.XmlParserInterface;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.w3c.dom.Document; import org.w3c.dom.Document;
@ -86,10 +87,14 @@ public class SinmungoXmlParser implements XmlParserInterface<SinmungoDto.Sinmung
if (fileName != null && base64Data != null && !base64Data.isEmpty()) { if (fileName != null && base64Data != null && !base64Data.isEmpty()) {
byte[] decoded = Base64.getDecoder().decode(base64Data); byte[] decoded = Base64.getDecoder().decode(base64Data);
Integer fileSizeBytes = decoded.length;
int fileTypeCode = FileKind.codeFromFileName(fileName);
imgBinary.add(SinmungoDto.ImgParser.builder() imgBinary.add(SinmungoDto.ImgParser.builder()
.fileName(fileName) .fileName(fileName)
.imageBytes(decoded) .imageBytes(decoded)
.fileSize(fileSizeBytes)
.fileType(fileTypeCode)
.build()); .build());
} }
} }

Loading…
Cancel
Save