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 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;
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;
@Lob
private byte[] imageBytes;
private Integer fileSize;
private int fileType;
}

@ -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<CpAnswer> cpAnswerList = new ArrayList<>();
List<CpMainEtc1> cpMainEtc1List = new ArrayList<>();
List<String> insertCompleteFileNm = new ArrayList<>();
List<CpImagesize> 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(<civil_no_c><![CDATA[2AA-2506-0697203]]></civil_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<CpAnswer> cpAnswerList = new ArrayList<>();
List<CpMainEtc1> cpMainEtc1List = new ArrayList<>();
List<String> insertCompleteFileNm = new ArrayList<>();
List<CpImagesize> 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<SinmungoDto.SinmungoXml> 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<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) {
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());

@ -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<SinmungoDto.Sinmung
if (fileName != null && base64Data != null && !base64Data.isEmpty()) {
byte[] decoded = Base64.getDecoder().decode(base64Data);
Integer fileSizeBytes = decoded.length;
int fileTypeCode = FileKind.codeFromFileName(fileName);
imgBinary.add(SinmungoDto.ImgParser.builder()
.fileName(fileName)
.imageBytes(decoded)
.fileSize(fileSizeBytes)
.fileType(fileTypeCode)
.build());
}
}

Loading…
Cancel
Save