package com.dbnt.faisp.fipTarget.service; import com.dbnt.faisp.config.BaseService; import com.dbnt.faisp.fipTarget.mapper.FipTargetMapper; import com.dbnt.faisp.fipTarget.model.PartInfo; import com.dbnt.faisp.fipTarget.model.PartInfo.PartInfoId; import com.dbnt.faisp.fipTarget.model.PartInfoFile; import com.dbnt.faisp.fipTarget.model.PartInfoFile.PartInfoFileId; import com.dbnt.faisp.fipTarget.model.PartWork; import com.dbnt.faisp.fipTarget.model.PartWork.PartWorkId; import com.dbnt.faisp.fipTarget.model.PartWorkFile; import com.dbnt.faisp.fipTarget.model.PartWorkFile.PartWorkFileId; import com.dbnt.faisp.fipTarget.model.VulnFile; import com.dbnt.faisp.fipTarget.model.VulnFile.VulnFileId; import com.dbnt.faisp.fipTarget.model.Vulnerable; import com.dbnt.faisp.fipTarget.repository.PartInfoFileRepository; import com.dbnt.faisp.fipTarget.repository.PartInfoRepository; import com.dbnt.faisp.fipTarget.repository.PartWorkFileRepository; import com.dbnt.faisp.fipTarget.repository.PartWorkRepository; import com.dbnt.faisp.fipTarget.repository.VulnFileRepository; import com.dbnt.faisp.fipTarget.repository.VulnRepository; import com.dbnt.faisp.publicBoard.model.PublicFile; import com.dbnt.faisp.util.ParamMap; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.util.*; @Service @RequiredArgsConstructor public class FipTargetService extends BaseService { @Value("${spring.servlet.multipart.location}") protected String locationPath; private final PartInfoRepository partInfoRepository; private final PartInfoFileRepository partInfoFileRepository; private final PartWorkRepository partWorkRepository; private final PartWorkFileRepository partWorkFileRepository; private final VulnRepository vulnRepository; private final VulnFileRepository vulnFileRepository; private final FipTargetMapper fipTargetMapper; @Transactional public void savePartInfo(PartInfo partInfo) { PartInfo dbPart = partInfoRepository.findFirstByOrderByPiSeqDesc(); if(dbPart == null) { partInfo.setPiSeq(1); partInfo.setVersionNo(1); partInfoRepository.save(partInfo); } else { partInfo.setPiSeq(dbPart.getPiSeq()+1); partInfo.setVersionNo(1); partInfoRepository.save(partInfo); } saveUploadFiles(partInfo.getPiSeq(),partInfo.getVersionNo(), partInfo.getMultipartFileList()); } private void saveUploadFiles(Integer piSeq,Integer versionNo, List multipartFileList) { PartInfoFile lastFileInfo = partInfoFileRepository.findTopByPiSeqAndVersionNoOrderByFileSeqDesc(piSeq,versionNo); int fileSeq = lastFileInfo==null?1:(lastFileInfo.getFileSeq()+1); if(multipartFileList == null || multipartFileList.isEmpty()) { if(lastFileInfo == null || lastFileInfo.getOrigNm() == null ) { PartInfoFile fileInfo = new PartInfoFile(); fileInfo.setFileSeq(fileSeq); fileInfo.setPiSeq(piSeq); fileInfo.setVersionNo(versionNo); partInfoFileRepository.save(fileInfo); } } else { for(MultipartFile file : multipartFileList){ String saveName = UUID.randomUUID().toString(); String path = locationPath+File.separator+"publicFile"+File.separator; saveFile(file, new File(path+File.separator+saveName)); String originalFilename = file.getOriginalFilename(); int extnIdx = originalFilename.lastIndexOf("."); PartInfoFile fileInfo = new PartInfoFile(); fileInfo.setFileSeq(fileSeq++); fileInfo.setPiSeq(piSeq); fileInfo.setVersionNo(versionNo); fileInfo.setOrigNm(originalFilename.substring(0, extnIdx)); fileInfo.setFileExtn(originalFilename.substring(extnIdx+1)); fileInfo.setConvNm(saveName); fileInfo.setFileSize(calculationSize(file.getSize())); fileInfo.setFilePath(path); partInfoFileRepository.save(fileInfo); } } } public List selectPartInfoList(PartInfo partInfo) { return fipTargetMapper.selectPartInfoList(partInfo); } public Integer selectPartInfoListCnt(PartInfo partInfo) { return fipTargetMapper.selectPartInfoListCnt(partInfo); } public ParamMap selectWorkTypeTotal(PartInfo partInfo) { return fipTargetMapper.selectWorkTypeTotal(partInfo); } public PartInfo selectPartInfo(PartInfo partInfo) { return fipTargetMapper.selectPartInfo(partInfo); } public List selectPartInfoFile(PartInfo partInfo) { return fipTargetMapper.selectPartInfoFile(partInfo); } @Transactional public void updatePartInfo(PartInfo partInfo, List deleteFileSeq) { PartInfo dbPart = partInfoRepository.findById(new PartInfoId(partInfo.getPiSeq(), partInfo.getVersionNo())).orElse(null); PartInfo partTmp = new PartInfo(); partTmp.setPiSeq(dbPart.getPiSeq()); partTmp.setVersionNo(dbPart.getVersionNo()+1); partTmp.setMgtOrgan(partInfo.getMgtOrgan()); partTmp.setLandPolice(partInfo.getLandPolice()); partTmp.setPiUserSeq(partInfo.getPiUserSeq()); partTmp.setRentType(partInfo.getRentType()); partTmp.setRentPrice(partInfo.getRentPrice()); partTmp.setUtilityType(partInfo.getUtilityType()); partTmp.setUtilityPrice(partInfo.getUtilityPrice()); partTmp.setTerminalNm(partInfo.getTerminalNm()); partTmp.setMpWorkType(partInfo.getMpWorkType()); partTmp.setMpPeopleCnt(partInfo.getMpPeopleCnt()); partTmp.setMpDescription(partInfo.getMpDescription()); partTmp.setPlWorkType(partInfo.getPlWorkType()); partTmp.setPlPeopleCnt(partInfo.getPlPeopleCnt()); partTmp.setPlDescription(partInfo.getPlDescription()); partTmp.setWrtUserSeq(partInfo.getWrtUserSeq()); partTmp.setWrtNm(partInfo.getWrtNm()); partTmp.setWrtPart(partInfo.getWrtPart()); partTmp.setWrtOrgan(partInfo.getWrtOrgan()); partTmp.setWrtDt(partInfo.getWrtDt()); partInfoRepository.save(partTmp); //업데이트하는 버전 파일조회 List fileList = partInfoFileRepository.findByPiSeqAndVersionNoOrderByFileSeqAsc(partInfo.getPiSeq(),partInfo.getVersionNo()); if(fileList.get(0).getOrigNm() != null) { for(PartInfoFile fileInfo : fileList){ PartInfoFile tmpFile = new PartInfoFile(); tmpFile.setFileSeq(fileInfo.getFileSeq()); tmpFile.setPiSeq(fileInfo.getPiSeq()); tmpFile.setVersionNo(partTmp.getVersionNo()); tmpFile.setOrigNm(fileInfo.getOrigNm()); tmpFile.setConvNm(fileInfo.getConvNm()); tmpFile.setFileExtn(fileInfo.getFileExtn()); tmpFile.setFileSize(fileInfo.getFileSize()); tmpFile.setFilePath(fileInfo.getFilePath()); partInfoFileRepository.save(tmpFile); } } //수정시 삭제한 파일삭제 if(deleteFileSeq!=null && deleteFileSeq.size()>0){ deletePartInfoFile(partTmp.getPiSeq(),partTmp.getVersionNo(), deleteFileSeq); } //파일업로드 saveUploadFiles(partTmp.getPiSeq(),partTmp.getVersionNo(), partInfo.getMultipartFileList()); } private void deletePartInfoFile(Integer piSeq,Integer versionNo, List deleteFileSeq) { List partInfoFileList = partInfoFileRepository.findByPiSeqAndVersionNoOrderByFileSeqAsc(piSeq,versionNo); for(PartInfoFile file: partInfoFileList){ if(deleteFileSeq.contains(file.getFileSeq())){ deleteStoredFile(new File(file.getFilePath(), file.getConvNm())); partInfoFileRepository.deleteById(new PartInfoFileId(file.getFileSeq(),piSeq,versionNo)); } } } public List selectPartInfoSeq(PartInfo partInfo) { return fipTargetMapper.selectPartInfoSeq(partInfo); } public PartInfo selectPartInfoHistoryView(PartInfo partInfo) { return fipTargetMapper.selectPartInfoHistoryView(partInfo); } public List selectPartInfoFileHistoryView(PartInfo partInfo) { return fipTargetMapper.selectPartInfoFileHistoryView(partInfo); } @Transactional public void deletePartInfo(PartInfo partInfo) { //외사실적 파일,데이터삭제 List partWorkFileList = partWorkFileRepository.findByPiSeq(partInfo.getPiSeq()); if(partWorkFileList != null) { for(PartWorkFile file: partWorkFileList){ deleteStoredFile(new File(file.getFilePath(), file.getConvNm())); partWorkFileRepository.deleteByPwSeqAndPiSeq(file.getPwSeq(),file.getPiSeq()); } } partWorkRepository.deleteByPiSeq(partInfo.getPiSeq()); //외사분실운영현황파일삭제 List partInfoFileList= selectPartInfoFile(partInfo); for(PartInfoFile file: partInfoFileList){ if(file.getOrigNm() != null){ deleteStoredFile(new File(file.getFilePath(), file.getConvNm())); } } partInfoFileRepository.deleteByPiSeq(partInfo.getPiSeq()); partInfoRepository.deleteByPiSeq(partInfo.getPiSeq()); } public PartInfoFile selectPartInfoFileDown(Integer fileSeq, Integer piSeq, Integer versionNo) { return partInfoFileRepository.findById(new PartInfoFileId(fileSeq, piSeq,versionNo)).orElse(null); } public String selectPartInfoFirstId(PartInfo partInfo) { return fipTargetMapper.selectPartInfoFirstId(partInfo.getPiSeq()); } public List selectTerminalName(PartWork partWork) { return fipTargetMapper.selectTerminalName(partWork); } @Transactional public void savePartWork(PartWork partWork) { PartWork dbPart = partWorkRepository.findTopByPiSeqOrderByPwSeqDesc(partWork.getPiSeq()); if(dbPart == null) { partWork.setPwSeq(1); partWorkRepository.save(partWork); } else { partWork.setPwSeq(dbPart.getPwSeq()+1); partWorkRepository.save(partWork); } if(partWork.getMultipartFileList()!= null){ saveFilesUpload(partWork.getPwSeq(),partWork.getPiSeq(), partWork.getMultipartFileList()); } } private void saveFilesUpload(Integer pwSeq,Integer piSeq, List multipartFileList) { PartWorkFile lastFileInfo = partWorkFileRepository.findTopByPwSeqAndPiSeqOrderByFileSeqDesc(pwSeq,piSeq); int fileSeq = lastFileInfo==null?1:(lastFileInfo.getFileSeq()+1); for(MultipartFile file : multipartFileList){ String saveName = UUID.randomUUID().toString(); String path = locationPath+File.separator+"publicFile"+File.separator; saveFile(file, new File(path+File.separator+saveName)); String originalFilename = file.getOriginalFilename(); int extnIdx = originalFilename.lastIndexOf("."); PartWorkFile fileInfo = new PartWorkFile(); fileInfo.setFileSeq(fileSeq++); fileInfo.setPwSeq(pwSeq); fileInfo.setPiSeq(piSeq); fileInfo.setOrigNm(originalFilename.substring(0, extnIdx)); fileInfo.setFileExtn(originalFilename.substring(extnIdx+1)); fileInfo.setConvNm(saveName); fileInfo.setFileSize(calculationSize(file.getSize())); fileInfo.setFilePath(path); partWorkFileRepository.save(fileInfo); } } public List selectPartWorkList(PartWork partWork) { return fipTargetMapper.selectPartWorkList(partWork); } public Integer selectPartWorkListCnt(PartWork partWork) { return fipTargetMapper.selectPartWorkListCnt(partWork); } public PartWork selectPartWorkInfo(PartWork partWork) { return fipTargetMapper.selectPartWorkInfo(partWork); } public List selectPartWorkFile(PartWork partWork) { return partWorkFileRepository.findByPwSeqAndPiSeqOrderByFileSeqAsc(partWork.getPwSeq(),partWork.getPiSeq()); } @Transactional public void updatePartWork(PartWork partWork, List deleteFileSeq) { PartWork dbParkWork = partWorkRepository.findById(new PartWorkId(partWork.getPwSeq(),partWork.getPiSeq())).orElse(null); partWork.setWrtNm(dbParkWork.getWrtNm()); partWork.setWrtOrgan(dbParkWork.getWrtOrgan()); partWork.setWrtPart(dbParkWork.getWrtPart()); partWork.setWrtUserSeq(dbParkWork.getWrtUserSeq()); partWorkRepository.save(partWork); if(deleteFileSeq!=null && deleteFileSeq.size()>0){ deletePartWorkFile(partWork, deleteFileSeq); } if(partWork.getMultipartFileList()!= null){ saveFilesUpload(partWork.getPwSeq(),partWork.getPiSeq(), partWork.getMultipartFileList()); } } private void deletePartWorkFile(PartWork partWork, List deleteFileSeq) { List partWorkFileList = partWorkFileRepository.findByPwSeqAndPiSeq(partWork.getPwSeq(),partWork.getPiSeq()); for(PartWorkFile file: partWorkFileList ){ if(deleteFileSeq.contains(file.getFileSeq())){ deleteStoredFile(new File(file.getFilePath(), file.getConvNm())); partWorkFileRepository.delete(file); } } } @Transactional public void deletePartWork(PartWork partWork) { //파일삭제 List partWorkFileList= partWorkFileRepository.findByPwSeqAndPiSeq(partWork.getPwSeq(),partWork.getPiSeq()); if(partWorkFileList != null) { for(PartWorkFile file: partWorkFileList){ deleteStoredFile(new File(file.getFilePath(), file.getConvNm())); } } partWorkFileRepository.deleteByPwSeqAndPiSeq(partWork.getPwSeq(),partWork.getPiSeq()); partWorkRepository.deleteByPwSeqAndPiSeq(partWork.getPwSeq(),partWork.getPiSeq()); } public PartWorkFile selectPartWorkFileDown(Integer fileSeq, Integer pwSeq, Integer piSeq) { return partWorkFileRepository.findById(new PartWorkFileId(fileSeq, pwSeq,piSeq)).orElse(null); } public List selecetVulnOrganList(Vulnerable vulnerable) { return fipTargetMapper.selecetVulnOrganList(vulnerable); } @Transactional public Integer saveVulnerable(Vulnerable vulnerable, List deleteFileSeq) { Integer vulnKey = vulnRepository.save(vulnerable).getVulnKey(); if(deleteFileSeq!=null && deleteFileSeq.size()>0){ deleteVulnFile(vulnerable, deleteFileSeq); } if(vulnerable.getMultipartFileList()!= null){ saveVulnerableFiles(vulnKey, vulnerable.getMultipartFileList()); } return vulnKey; } private void saveVulnerableFiles(Integer vulnKey, List multipartFileList) { VulnFile lastFileInfo = vulnFileRepository.findTopByVulnKeyOrderByFileSeqDesc(vulnKey); int fileSeq = lastFileInfo==null?1:(lastFileInfo.getFileSeq()+1); for(MultipartFile file : multipartFileList){ String saveName = UUID.randomUUID().toString(); String path = locationPath+File.separator+"publicFile"+File.separator; saveFile(file, new File(path+File.separator+saveName)); String originalFilename = file.getOriginalFilename(); int extnIdx = originalFilename.lastIndexOf("."); VulnFile fileInfo = new VulnFile(); fileInfo.setVulnKey(vulnKey); fileInfo.setFileSeq(fileSeq++); fileInfo.setOrigNm(originalFilename.substring(0, extnIdx)); fileInfo.setFileExtn(originalFilename.substring(extnIdx+1)); fileInfo.setConvNm(saveName); fileInfo.setFileSize(calculationSize(file.getSize())); fileInfo.setFilePath(path); vulnFileRepository.save(fileInfo); } } private void deleteVulnFile(Vulnerable vulnerable, List deleteFileSeq) { List VulnFileList = vulnFileRepository.findByVulnKey(vulnerable.getVulnKey()); for(VulnFile file: VulnFileList ){ if(deleteFileSeq.contains(file.getFileSeq())){ deleteStoredFile(new File(file.getFilePath(), file.getConvNm())); vulnFileRepository.delete(file); } } } public List selectVulnerableList(Vulnerable vulnerable) { return fipTargetMapper.selectVulnerableList(vulnerable); } public List selectVulnInfoList(Vulnerable vulnerable) { return fipTargetMapper.selectVulnInfoList(vulnerable); } public String selectOrganName(String mgtOrgan) { return fipTargetMapper.selectOrganName(mgtOrgan); } public Vulnerable selectVulnInfo(Vulnerable vulnerable) { return fipTargetMapper.selectVulnInfo(vulnerable); } public List selectVulnFile(Integer vulnKey) { return vulnFileRepository.findByVulnKeyOrderByFileSeq(vulnKey); } public VulnFile selectVulnInfoFileDown(Integer fileSeq, Integer vulnKey) { return vulnFileRepository.findById(new VulnFileId(fileSeq, vulnKey)).orElse(null); } @Transactional public void deleteVulnerable(Vulnerable vulnerable) { //파일삭제 List VulnFileList = vulnFileRepository.findByVulnKey(vulnerable.getVulnKey()); if(VulnFileList != null) { for(VulnFile file: VulnFileList){ deleteStoredFile(new File(file.getFilePath(), file.getConvNm())); } } vulnFileRepository.deleteByVulnKey(vulnerable.getVulnKey()); vulnRepository.deleteById(vulnerable.getVulnKey()); } }