feat: 시민신고 등록 반영

main
Jonguk. Lim 2 years ago
parent e18f2d6f12
commit 04aeb88eb5

@ -6,6 +6,8 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@ -24,6 +26,7 @@ import kr.xit.fims.biz.ec.model.CtznSttemntDTO;
import kr.xit.fims.biz.ec.model.EcNatlNewspaperRcvReqDTO;
import kr.xit.fims.biz.ec.model.NatlNewspaperRcvDTO;
import kr.xit.fims.biz.ec.model.NatlNewspaperRcvXmlDTO;
import kr.xit.framework.biz.cmm.model.CmmFileDtlDTO;
import kr.xit.framework.biz.cmm.model.CmmFileMstDTO;
import kr.xit.framework.biz.cmm.service.ICmmFileService;
import kr.xit.framework.support.exception.BizRuntimeException;
@ -67,13 +70,23 @@ public class EcNatlNewspaperService implements IEcNatlNewspaperService {
* @param dto
* </pre>
*/
@SuppressWarnings("ConstantConditions")
@Override
@Transactional
public void saveEsbRvcParse(final EcNatlNewspaperRcvReqDTO dto) {
String filePath = dto.getFilePath();
AtomicInteger index = new AtomicInteger();
// CmmFileMstDTO fstMstDTO = null;
// CmmFileDtlDTO pngDtlDTO = null;
dto.getXmlFileInfoList().forEach((fi) -> {
// Receive XML File Parsing
NatlNewspaperRcvXmlDTO xmlDto = XmlParseUtils.readXmlToObject(NatlNewspaperRcvXmlDTO.class, filePath+"/"+fi.getFileNm());
// XML 첨부파일 정보
NatlNewspaperRcvXmlDTO.AppendFileInfoDTO appendFileDto = xmlDto.getAppendFileInfo();
// XML 첨부파일 수 : 위도 경도 .png 파일 포함(첨부파일중 가장 마지막 index)
int fileCnt = Integer.parseInt(appendFileDto.getApndfilcount());
if(fileCnt == 1) throw BizRuntimeException.create(MessageKey.CUSTOM_MSG, "첨부된 파일이 부정확 합니다(위경도 파일은 필수 요소 입니다)");
//-------------------------------------------------------------
// interface table save
@ -90,13 +103,37 @@ public class EcNatlNewspaperService implements IEcNatlNewspaperService {
//-------------------------------------------------------------
CtznSttemntDTO ctznSttemntDTO = setCtznSttemntDTOFromRcvXml(xmlDto);
ctznSttemntMapper.insertEcCtznSttemnt(ctznSttemntDTO);
ctznSttemntDTO.getSttemntDetailDTOs().forEach(dtl -> {
index.set(0);
CmmFileMstDTO fstMstDTO = null;
CmmFileDtlDTO pngDtlDTO = null;
for(CtznSttemntDTO.CtznSttemntDetailDTO dtl : ctznSttemntDTO.getSttemntDetailDTOs()){
ctznSttemntMapper.insertEcCtznSttemntDetail(dtl);
//-------------------------------------------------------------
// 첨부파일 저장
//-------------------------------------------------------------
saveAppendFiles(xmlDto, dtl);
});
// 첨부파일이 있고, 단속사진 업로드가 끝나지 않은경우(단속사진중 마지막 1장은 위도/경도 파일(.png 필수)로 제외)
// if(fileCnt >= 2 && fileCnt - 1 >= index.get()) {
if(index.get() == 0) {
fstMstDTO = saveAppendFiles(xmlDto, appendFileDto, dtl, index.get(), fileCnt);
}else {
if(Checks.isEmpty(pngDtlDTO)) {
if (fstMstDTO == null || fstMstDTO.getCmmFileDtls().size() == 0)
throw BizRuntimeException.create(MessageKey.CUSTOM_MSG, "시민신고 첨부 파일 처리중 오류가 발생하였습니다.");
for (CmmFileDtlDTO dtlDto : fstMstDTO.getCmmFileDtls()) {
if (Objects.equals(dtlDto.getFileExtsn(), "png")) {
pngDtlDTO = dtlDto;
break;
}
};
}
saveFstOverAppendFiles(xmlDto, appendFileDto, dtl, pngDtlDTO, index.get());
}
index.addAndGet(1);
// }
};
});
}
@ -114,6 +151,8 @@ public class EcNatlNewspaperService implements IEcNatlNewspaperService {
private CtznSttemntDTO setCtznSttemntDTOFromRcvXml(NatlNewspaperRcvXmlDTO xmlDto){
CtznSttemntDTO dto = new CtznSttemntDTO();
List<CtznSttemntDTO.CtznSttemntDetailDTO> dtlList = new ArrayList<>();
@ -242,9 +281,114 @@ public class EcNatlNewspaperService implements IEcNatlNewspaperService {
//TODO: 단속정보별 파일 저장 하도록 적용 필요 - 2건 단속자료면 1번은 1번 파일만, 2번은 2번 파일만
//TODO: 단속정보를 보여줄 때는 모든 이미지 정보 보여준다(insterfaceSeqN 별로 - 어느 DTL항목 파일인지는 당근 표시해야지!!!)
//TODO: .png는 각각 set - 파일 업로드는 1번만
private void saveAppendFiles(NatlNewspaperRcvXmlDTO xmlDto, CtznSttemntDTO.CtznSttemntDetailDTO sttemntDetailDTO) {
private CmmFileMstDTO saveAppendFiles(
NatlNewspaperRcvXmlDTO xmlDto,
NatlNewspaperRcvXmlDTO.AppendFileInfoDTO appendFileDto,
CtznSttemntDTO.CtznSttemntDetailDTO sttemntDetailDTO,
int index,
int pngFileIndex) {
// 첨부 파일 생성
//int fileCnt = Integer.parseInt(appendFileDto.getApndfilcount());
List<MultipartFile> mfList = new ArrayList<>();
Class<?> clz = appendFileDto.getClass();
String dateStr = DateUtils.getToday("");
dateStr = dateStr.substring(0,4) + "/" + dateStr.substring(4);
String makeDir = "/" + dateStr;
String makePath = uploadRoot + uploadNewsPaperPath + makeDir;
try {
Method method = clz.getMethod("getPetiFilePath" + (index + 1) + "V", null);
String petiFileNm = (String)method.invoke(appendFileDto, null);
method = clz.getMethod("getApndfilcont" + (index + 1), null);
String petiFileStr = (String)method.invoke(appendFileDto, null);
//TODO: 실제 저장할 파일명 생성후 파일 내용 저장
//String saveFileName = CommUtils.getStringFromUUID();
//CommUtils.saveFileFromBytes(saveFileName, makePath, Base64.decode(petiFileStr.getBytes()));
// 실제 저장된 파일명 set
//method = clz.getMethod("setPetiFileName" + (idx + 1), String.class);
//method.invoke(appendFileDto, saveFileName);
//TODO: 원본 파일명으로 파일 생성후 파일 업로드
mfList.add(CommUtils.createMutipartFileFromBytes(petiFileNm, makePath, Base64.decode(petiFileStr.getBytes())));
// 최초 파일 업로드인 경우, png 파일 같이 업로드
if(index == 0) {
method = clz.getMethod("getPetiFilePath" + pngFileIndex + "V", null);
petiFileNm = (String)method.invoke(appendFileDto, null);
method = clz.getMethod("getApndfilcont" + pngFileIndex, null);
petiFileStr = (String)method.invoke(appendFileDto, null);
mfList.add(CommUtils.createMutipartFileFromBytes(petiFileNm, makePath, Base64.decode(petiFileStr.getBytes())));
}
//method.invoke(dto, StringUtils.cleanPath(makePath + mf.getOriginalFilename()));
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.getStackTrace();
throw BizRuntimeException.create(MessageKey.CUSTOM_MSG, e.getMessage());
}
CmmFileMstDTO fileMstDTO = new CmmFileMstDTO();
fileMstDTO.setJobSeCode(FimsConst.FileJobSeCode.NATL_NEWS_PAPER_RCV.getCode());
fileMstDTO.setFileJobId(sttemntDetailDTO.getInterfaceSeqN()+sttemntDetailDTO.getCtznSttemntDetailSn());
fileMstDTO.setUploadeJobPath(uploadNewsPaperPath);
fileMstDTO.setFileDirPath(FimsConst.FileDirDepth.DAY.getCode());
return cmmFileService.saveFiles(fileMstDTO, mfList);
}
private CmmFileMstDTO saveFstOverAppendFiles(
final NatlNewspaperRcvXmlDTO xmlDto,
final NatlNewspaperRcvXmlDTO.AppendFileInfoDTO appendFileDto,
final CtznSttemntDTO.CtznSttemntDetailDTO sttemntDetailDTO,
final CmmFileDtlDTO pngFileDtlDto,
int index) {
// 첨부 파일 생성
//int fileCnt = Integer.parseInt(appendFileDto.getApndfilcount());
List<MultipartFile> mfList = new ArrayList<>();
Class<?> clz = appendFileDto.getClass();
String dateStr = DateUtils.getToday("");
dateStr = dateStr.substring(0,4) + "/" + dateStr.substring(4);
String makeDir = "/" + dateStr;
String makePath = uploadRoot + uploadNewsPaperPath + makeDir;
try {
Method method = clz.getMethod("getPetiFilePath" + (index + 1) + "V", null);
String petiFileNm = (String)method.invoke(appendFileDto, null);
method = clz.getMethod("getApndfilcont" + (index + 1), null);
String petiFileStr = (String)method.invoke(appendFileDto, null);
//TODO: 실제 저장할 파일명 생성후 파일 내용 저장
//String saveFileName = CommUtils.getStringFromUUID();
//CommUtils.saveFileFromBytes(saveFileName, makePath, Base64.decode(petiFileStr.getBytes()));
// 실제 저장된 파일명 set
//method = clz.getMethod("setPetiFileName" + (idx + 1), String.class);
//method.invoke(appendFileDto, saveFileName);
//TODO: 원본 파일명으로 파일 생성후 파일 업로드
mfList.add(CommUtils.createMutipartFileFromBytes(petiFileNm, makePath, Base64.decode(petiFileStr.getBytes())));
//method.invoke(dto, StringUtils.cleanPath(makePath + mf.getOriginalFilename()));
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.getStackTrace();
throw BizRuntimeException.create(MessageKey.CUSTOM_MSG, e.getMessage());
}
CmmFileMstDTO fileMstDTO = new CmmFileMstDTO();
fileMstDTO.setJobSeCode(FimsConst.FileJobSeCode.NATL_NEWS_PAPER_RCV.getCode());
fileMstDTO.setFileJobId(sttemntDetailDTO.getInterfaceSeqN()+sttemntDetailDTO.getCtznSttemntDetailSn());
fileMstDTO.setUploadeJobPath(uploadNewsPaperPath);
fileMstDTO.setFileDirPath(FimsConst.FileDirDepth.DAY.getCode());
return cmmFileService.saveCtznSttemntFiles(fileMstDTO, mfList, pngFileDtlDto);
}
/*
private void saveAppendFiles2(
NatlNewspaperRcvXmlDTO xmlDto,
NatlNewspaperRcvXmlDTO.AppendFileInfoDTO appendFileDto,
CtznSttemntDTO.CtznSttemntDetailDTO sttemntDetailDTO,
int index) {
// 첨부 파일 생성
NatlNewspaperRcvXmlDTO.AppendFileInfoDTO appendFileDto = xmlDto.getAppendFileInfo();
int fileCnt = Integer.parseInt(appendFileDto.getApndfilcount());
List<MultipartFile> mfList = new ArrayList<>();
if(fileCnt > 0) {
@ -287,10 +431,7 @@ public class EcNatlNewspaperService implements IEcNatlNewspaperService {
cmmFileService.saveFiles(fileMstDTO, mfList);
}
}
*/
/*
@SuppressWarnings("DuplicatedCode")

@ -46,7 +46,7 @@ public class CmmFileService implements ICmmFileService {
@Override
@Transactional(readOnly = true)
public CmmFileMstDTO findFiles(String fileMstId) {
public CmmFileMstDTO findFiles(final String fileMstId) {
Assert.notNull(fileMstId, "대상 파일[fileMstId]을 선택해 주세요.");
CmmFileMstDTO cmmFileMst = mapper.selectCmmFileMastr(fileMstId).orElse(null);
@ -149,6 +149,106 @@ public class CmmFileService implements ICmmFileService {
return fileMstDTO;
}
@Override
@Transactional
public CmmFileMstDTO saveCtznSttemntFiles(final CmmFileMstDTO fileMstDTO, final List<MultipartFile> files, final CmmFileDtlDTO pngFileDtlDto) {
Assert.notNull(fileMstDTO, "파일 정보가 존재하지 않습니다.");
Assert.notNull(fileMstDTO.getJobSeCode(), "파일 구분 코드[fileCtgCd] 정보가 존재하지 않습니다.");
Assert.notNull(fileMstDTO.getFileJobId(), "파일 업무 ID[fileBizId] 정보가 존재하지 않습니다.");
Assert.notNull(files, "대상 파일이 존재하지 않습니다.");
boolean isCheckExists = StringUtils.hasText(fileMstDTO.getFileMastrId());
String fileMstId = null;
// file Master key set
// file Master 생성
if(isCheckExists) fileMstId = fileMstDTO.getFileMastrId();
else fileMstId = CommUtils.getStringFromUUID();
fileMstDTO.setFileMastrId(fileMstId);
fileMstDTO.setRegister(getUserUniqId());
mapper.insertCmmFileMastr(fileMstDTO);
// 업로드 세부 경로 설정
String makePath = fileMstDTO.getUploadeJobPath();
String dateStr = DateUtils.getToday("");
String strDiv = fileMstDTO.getFileDirPath();
if(Checks.isNotEmpty(strDiv)){
if(Objects.equals(FimsConst.FileDirDepth.YEAR.getCode(), strDiv)) makePath = makePath + "/" + dateStr.substring(0, 4);
else if(Objects.equals(FimsConst.FileDirDepth.MONTH.getCode(), strDiv)) makePath = makePath + "/" + dateStr.substring(0, 6);
else makePath = makePath + "/" + dateStr.substring(0,4) + "/" + dateStr.substring(4);
}
String fileUploadPath = this.uploadRoot + makePath;
File file = new File(fileUploadPath);
if(!file.exists()) file.mkdirs();
List<CmmFileDtlDTO> cmmFileDtls = new ArrayList<>();
for(MultipartFile mf : files){
if(!mf.isEmpty()) {
String orgFileName = "";
try {
orgFileName = StringUtils.cleanPath(Objects.requireNonNull(mf.getOriginalFilename()));
CmmFileDtlDTO fileDtlDTO = CmmFileDtlDTO.builder()
.fileMastrId(fileMstDTO.getFileMastrId())
.fileId(CommUtils.getStringFromUUID())
.fileCours(makePath)
.fileCntntsTy(mf.getContentType())
.orginlFileNm(orgFileName)
.fileExtsn(orgFileName.substring(orgFileName.lastIndexOf(".") + 1).toLowerCase())
.fileCpcty(mf.getSize())
.register(getUserUniqId())
.build();
if (StringUtils.hasText(allowExt) && !allowExt.contains(fileDtlDTO.getFileExtsn())) {
log.error("Not support extention :: {}", orgFileName);
//TODO : 에러처리
//return RestError.of(String.format("Not support extention :: %s", orgFileName));
throw BizRuntimeException.create(
MessageKey.CUSTOM_MSG, String.format("Not support extention :: %s", orgFileName));
}
if (fileDtlDTO.getFileCpcty() > (maxSize * 1024)) {
log.error("Over size :: {}[{}]", orgFileName, fileDtlDTO.getFileCpcty());
//TODO : 에러처리
//return RestError.of(String.format("Over size :: %s[%l]", orgFileName, cmmFileDtl.getFileSize()));
throw BizRuntimeException.create(
MessageKey.CUSTOM_MSG, String.format("Over size :: %s[%d]", orgFileName, fileDtlDTO.getFileCpcty()));
}
//동일파일 삭제후 정보 저장
if(isCheckExists) removeExistsUploadFile(fileDtlDTO);
mapper.insertCmmFileDetail(fileDtlDTO);
// 파일 전송
mf.transferTo(new File(fileUploadPath + "/" + fileDtlDTO.getFileId()));
cmmFileDtls.add(fileDtlDTO);
// inputStream을 가져와서
// copyOfLocation (저장위치)로 파일을 쓴다.
// copy의 옵션은 기존에 존재하면 REPLACE(대체한다), 오버라이딩 한다
//Files.copy(multipartFile.getInputStream(), copyOfLocation, StandardCopyOption.REPLACE_EXISTING);
}catch(IOException e){
String errMsg = String.format("File Upload Error :: %s", orgFileName);
//TODO : 에러처리
//return RestError.of(String.format("File Upload Error :: %s", orgFileName));
throw BizRuntimeException.create(
MessageKey.CUSTOM_MSG, String.format("File Upload Error :: %s", orgFileName));
}
}
}
pngFileDtlDto.setFileMastrId(fileMstDTO.getFileMastrId());
pngFileDtlDto.setFileId(CommUtils.getStringFromUUID());
mapper.insertCmmFileDetail(pngFileDtlDto);
cmmFileDtls.add(pngFileDtlDto);
fileMstDTO.getCmmFileDtls().addAll(cmmFileDtls);
return fileMstDTO;
}
@Transactional
public void removeExistsUploadFile(final CmmFileDtlDTO dtlDto){
mapper.selectCmmFileDetail(dtlDto)

@ -4,6 +4,7 @@ import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import kr.xit.framework.biz.cmm.model.CmmFileDtlDTO;
import kr.xit.framework.biz.cmm.model.CmmFileMstDTO;
import kr.xit.framework.core.utils.XitCmmnUtil;
@ -12,11 +13,13 @@ import kr.xit.framework.core.utils.XitCmmnUtil;
* @since 2021-07-16
*/
public interface ICmmFileService {
CmmFileMstDTO findFiles(String fileMstId);
CmmFileMstDTO findFiles(final String fileMstId);
//CmmFileMstDTO saveFiles(CmmFileMstDTO fileMstDTO, MultipartFile[] files);
@SuppressWarnings("UnusedReturnValue")
CmmFileMstDTO saveFiles(CmmFileMstDTO fileMstDTO, List<MultipartFile> files);
CmmFileMstDTO saveFiles(final CmmFileMstDTO fileMstDTO, final List<MultipartFile> files);
@SuppressWarnings("UnusedReturnValue")
CmmFileMstDTO saveCtznSttemntFiles(final CmmFileMstDTO fileMstDTO, final List<MultipartFile> files, final CmmFileDtlDTO pngFileDtlDto);
default String getUserUniqId(){

Loading…
Cancel
Save