|
|
|
|
@ -68,6 +68,25 @@ public class CrdnRelevyServiceImpl implements CrdnRelevyService {
|
|
|
|
|
* 재부과 처리를 수행합니다.
|
|
|
|
|
* 트랜잭션 처리로 모든 데이터가 정상적으로 복사되거나 모두 롤백됩니다.
|
|
|
|
|
*
|
|
|
|
|
* FK 관계 및 1:N 관계에 따른 복사 순서:
|
|
|
|
|
* <pre>
|
|
|
|
|
* 1. tb_crdn (단속 기본 정보) - PK: (CRDN_YR, CRDN_NO)
|
|
|
|
|
* │
|
|
|
|
|
* ├─> 2. tb_pstn_info (위치 정보) - PK: PSTN_INFO_ID
|
|
|
|
|
* │ │
|
|
|
|
|
* │ └─> 3. tb_ownr_info (소유자 정보) - FK: PSTN_INFO_ID
|
|
|
|
|
* │
|
|
|
|
|
* └─> 4. tb_act_info (불법행위 정보) 1:N - PK: ACT_INFO_ID, FK: PSTN_INFO_ID
|
|
|
|
|
* │
|
|
|
|
|
* ├─> 5. tb_actn_info (조치 정보) 1:N - PK: ACTN_INFO_ID, FK: ACT_INFO_ID
|
|
|
|
|
* │
|
|
|
|
|
* ├─> 6. tb_crdn_photo (첨부파일) 1:N - PK: (ACT_INFO_ID, CRDN_PHOTO_SN)
|
|
|
|
|
* │ FK: ACT_INFO_ID (필수)
|
|
|
|
|
* │ FK: ACTN_INFO_ID (선택 - 조치사진인 경우)
|
|
|
|
|
* │
|
|
|
|
|
* └─> 7. tb_actr_info (행위자 정보) 1:N - PK: ACTR_INFO_ID, FK: ACT_INFO_ID
|
|
|
|
|
* </pre>
|
|
|
|
|
*
|
|
|
|
|
* @param relevyVO 재부과 정보를 담은 VO 객체
|
|
|
|
|
* @return 처리 결과 (신규 단속 번호 등)
|
|
|
|
|
*/
|
|
|
|
|
@ -94,29 +113,98 @@ public class CrdnRelevyServiceImpl implements CrdnRelevyService {
|
|
|
|
|
throw new MessageException("기본 단속 정보 복사 실패");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 4. 위치 정보 복사 (tb_crdn_pstn_info)
|
|
|
|
|
// 4. 위치 정보 복사 (tb_pstn_info)
|
|
|
|
|
// 새로운 PSTN_INFO_ID 생성하여 tb_ownr_info, tb_act_info에서 참조
|
|
|
|
|
String nextPstnInfoId = relevyMapper.selectNextPstnInfoId();
|
|
|
|
|
relevyVO.setPstnInfoId(nextPstnInfoId);
|
|
|
|
|
relevyMapper.insertCrdnPstnInfo(relevyVO);
|
|
|
|
|
|
|
|
|
|
// 5. 소유자 정보 복사 (tb_crdn_ownr_info)
|
|
|
|
|
// 5. 소유자 정보 복사 (tb_ownr_info)
|
|
|
|
|
// PSTN_INFO_ID를 FK로 참조
|
|
|
|
|
relevyMapper.insertCrdnOwnrInfo(relevyVO);
|
|
|
|
|
|
|
|
|
|
// 6. 불법행위 정보 복사 (조치완료 제외)
|
|
|
|
|
// 6-1. 행위 정보 (tb_crdn_act_info)
|
|
|
|
|
relevyMapper.insertCrdnActInfo(relevyVO);
|
|
|
|
|
|
|
|
|
|
// 6-2. 첨부파일 복사 (조치완료 제외) - 데이터베이스 레코드 복사
|
|
|
|
|
relevyMapper.insertCrdnPhotoInfo(relevyVO);
|
|
|
|
|
// 6. 불법행위 목록 조회 및 중첩 for문으로 하위 데이터 복사
|
|
|
|
|
List<CrdnRelevyVO> srcActInfoList = relevyMapper.selectSrcActInfoList(relevyVO);
|
|
|
|
|
log.info("복사할 불법행위 개수: {}", srcActInfoList.size());
|
|
|
|
|
|
|
|
|
|
for (CrdnRelevyVO srcActInfo : srcActInfoList) {
|
|
|
|
|
// 6-1. 불법행위 정보 단건 등록 (tb_act_info)
|
|
|
|
|
String newActInfoId = relevyMapper.selectNextActInfoId();
|
|
|
|
|
log.info("생성된 newActInfoId: {}, 원본 srcActInfoId: {}", newActInfoId, srcActInfo.getSrcActInfoId());
|
|
|
|
|
srcActInfo.setActInfoId(newActInfoId);
|
|
|
|
|
srcActInfo.setNewCrdnYr(currentYear);
|
|
|
|
|
srcActInfo.setNewCrdnNo(newCrdnNo);
|
|
|
|
|
srcActInfo.setPstnInfoId(nextPstnInfoId);
|
|
|
|
|
srcActInfo.setRgtr(relevyVO.getRgtr());
|
|
|
|
|
relevyMapper.insertActInfoOne(srcActInfo);
|
|
|
|
|
|
|
|
|
|
// 6-2. 행위사진 처리 (1:N) - CRDN_PHOTO_SE_CD='1'
|
|
|
|
|
List<CrdnPhotoVO> srcActPhotoList = relevyMapper.selectSrcPhotoListByActInfo(srcActInfo);
|
|
|
|
|
log.debug("불법행위 {} 행위사진 개수: {}", srcActInfo.getActNo(), srcActPhotoList.size());
|
|
|
|
|
for (CrdnPhotoVO srcPhoto : srcActPhotoList) {
|
|
|
|
|
// 물리적 파일 복사
|
|
|
|
|
String newPhotoNm = copyPhysicalFileAndGetNewName(srcPhoto);
|
|
|
|
|
|
|
|
|
|
// DB에 첨부파일 정보 등록 (ACT_INFO_ID만)
|
|
|
|
|
log.info("행위사진 insert - newActInfoId: {}, 원본 SN: {}", newActInfoId, srcPhoto.getCrdnPhotoSn());
|
|
|
|
|
srcPhoto.setActInfoId(newActInfoId);
|
|
|
|
|
srcPhoto.setCrdnYr(currentYear);
|
|
|
|
|
srcPhoto.setCrdnNo(newCrdnNo);
|
|
|
|
|
srcPhoto.setCrdnPhotoNm(newPhotoNm);
|
|
|
|
|
srcPhoto.setActnInfoId(null); // 행위사진은 ACTN_INFO_ID 없음
|
|
|
|
|
srcPhoto.setRgtr(relevyVO.getRgtr());
|
|
|
|
|
|
|
|
|
|
relevyMapper.insertPhotoInfoOne(srcPhoto);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 6-3. 물리적 파일 복사
|
|
|
|
|
processPhysicalFileCopy(relevyVO);
|
|
|
|
|
// 6-3. 조치 정보 및 조치사진 처리 (1:N:N)
|
|
|
|
|
List<CrdnRelevyVO> srcActnInfoList = relevyMapper.selectSrcActnInfoList(srcActInfo);
|
|
|
|
|
log.debug("불법행위 {} 조치정보 개수: {}", srcActInfo.getActNo(), srcActnInfoList.size());
|
|
|
|
|
for (CrdnRelevyVO srcActnInfo : srcActnInfoList) {
|
|
|
|
|
// 6-3-1. 조치 정보 단건 등록 (tb_actn_info)
|
|
|
|
|
String newActnInfoId = relevyMapper.selectNextActnInfoId();
|
|
|
|
|
srcActnInfo.setActnInfoId(newActnInfoId);
|
|
|
|
|
srcActnInfo.setNewCrdnYr(currentYear);
|
|
|
|
|
srcActnInfo.setNewCrdnNo(newCrdnNo);
|
|
|
|
|
srcActnInfo.setActInfoId(newActInfoId);
|
|
|
|
|
srcActnInfo.setRgtr(relevyVO.getRgtr());
|
|
|
|
|
relevyMapper.insertActnInfoOne(srcActnInfo);
|
|
|
|
|
|
|
|
|
|
// 6-3-2. 조치사진 처리 (1:N) - CRDN_PHOTO_SE_CD='2'
|
|
|
|
|
List<CrdnPhotoVO> srcActnPhotoList = relevyMapper.selectSrcPhotoListByActnInfo(srcActnInfo);
|
|
|
|
|
log.debug("조치정보 {} 조치사진 개수: {}", srcActnInfo.getActnYmd(), srcActnPhotoList.size());
|
|
|
|
|
for (CrdnPhotoVO srcPhoto : srcActnPhotoList) {
|
|
|
|
|
// 물리적 파일 복사
|
|
|
|
|
String newPhotoNm = copyPhysicalFileAndGetNewName(srcPhoto);
|
|
|
|
|
|
|
|
|
|
// DB에 첨부파일 정보 등록 (ACT_INFO_ID + ACTN_INFO_ID)
|
|
|
|
|
log.info("조치사진 insert - newActInfoId: {}, 원본 SN: {}", newActInfoId, srcPhoto.getCrdnPhotoSn());
|
|
|
|
|
srcPhoto.setActInfoId(newActInfoId);
|
|
|
|
|
srcPhoto.setCrdnYr(currentYear);
|
|
|
|
|
srcPhoto.setCrdnNo(newCrdnNo);
|
|
|
|
|
srcPhoto.setCrdnPhotoNm(newPhotoNm);
|
|
|
|
|
srcPhoto.setActnInfoId(newActnInfoId); // 조치사진은 ACTN_INFO_ID 필수
|
|
|
|
|
srcPhoto.setRgtr(relevyVO.getRgtr());
|
|
|
|
|
|
|
|
|
|
relevyMapper.insertPhotoInfoOne(srcPhoto);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 7. 조치 정보 복사 (조치완료 제외)
|
|
|
|
|
// 7-1. 행위자 정보 (tb_crdn_actr_info)
|
|
|
|
|
relevyMapper.insertCrdnActrInfo(relevyVO);
|
|
|
|
|
// 6-4. 행위자 정보 목록 조회 및 등록 (tb_actr_info) - 1:N
|
|
|
|
|
List<CrdnRelevyVO> srcActrInfoList = relevyMapper.selectSrcActrInfoList(srcActInfo);
|
|
|
|
|
log.debug("불법행위 {} 행위자 개수: {}", srcActInfo.getActNo(), srcActrInfoList.size());
|
|
|
|
|
for (CrdnRelevyVO srcActrInfo : srcActrInfoList) {
|
|
|
|
|
String newActrInfoId = relevyMapper.selectNextActrInfoId();
|
|
|
|
|
srcActrInfo.setActrInfoId(newActrInfoId);
|
|
|
|
|
srcActrInfo.setNewCrdnYr(currentYear);
|
|
|
|
|
srcActrInfo.setNewCrdnNo(newCrdnNo);
|
|
|
|
|
srcActrInfo.setActInfoId(newActInfoId);
|
|
|
|
|
srcActrInfo.setRgtr(relevyVO.getRgtr());
|
|
|
|
|
relevyMapper.insertActrInfoOne(srcActrInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 8. 현재 진행 상태를 시정명령(30)으로 설정 및 최초단속 정보 업데이트
|
|
|
|
|
// 7. 현재 진행 상태를 시정명령(30)으로 설정 및 최초단속 정보 업데이트
|
|
|
|
|
relevyMapper.updateCrdnStatus(relevyVO);
|
|
|
|
|
|
|
|
|
|
log.info("재부과 처리 완료: 신규 단속번호={}", newCrdnNo);
|
|
|
|
|
@ -136,51 +224,17 @@ public class CrdnRelevyServiceImpl implements CrdnRelevyService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 물리적 파일 복사를 처리합니다.
|
|
|
|
|
* 원본 첨부파일들을 새로운 경로로 복사하고 데이터베이스 정보를 업데이트합니다.
|
|
|
|
|
*
|
|
|
|
|
* @param relevyVO 재부과 정보
|
|
|
|
|
* @throws MessageException 파일 복사 실패 시 예외 발생
|
|
|
|
|
*/
|
|
|
|
|
private void processPhysicalFileCopy(CrdnRelevyVO relevyVO) throws MessageException {
|
|
|
|
|
log.info("물리적 파일 복사 시작: srcCrdnYr={}, srcCrdnNo={}", relevyVO.getSrcCrdnYr(), relevyVO.getSrcCrdnNo());
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 원본 첨부파일 목록 조회
|
|
|
|
|
List<CrdnPhotoVO> srcPhotoList = relevyMapper.selectSrcPhotoList(relevyVO.getSrcCrdnYr(), relevyVO.getSrcCrdnNo());
|
|
|
|
|
|
|
|
|
|
if (srcPhotoList == null || srcPhotoList.isEmpty()) {
|
|
|
|
|
log.info("복사할 첨부파일이 없습니다.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.info("복사할 첨부파일 개수: {}", srcPhotoList.size());
|
|
|
|
|
|
|
|
|
|
// 각 파일에 대해 복사 처리
|
|
|
|
|
for (CrdnPhotoVO srcPhoto : srcPhotoList) {
|
|
|
|
|
copyPhysicalFile(srcPhoto, relevyVO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.info("물리적 파일 복사 완료");
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("물리적 파일 복사 중 오류 발생", e);
|
|
|
|
|
throw new MessageException("첨부파일 복사 중 오류가 발생했습니다: " + e.getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 개별 첨부파일의 물리적 복사를 처리합니다.
|
|
|
|
|
* 개별 첨부파일의 물리적 복사를 처리하고 새로운 파일명을 반환합니다.
|
|
|
|
|
*
|
|
|
|
|
* @param srcPhoto 원본 첨부파일 정보
|
|
|
|
|
* @param relevyVO 재부과 정보
|
|
|
|
|
* @return 새로운 저장 파일명 (UUID 기반)
|
|
|
|
|
*/
|
|
|
|
|
private void copyPhysicalFile(CrdnPhotoVO srcPhoto, CrdnRelevyVO relevyVO) {
|
|
|
|
|
private String copyPhysicalFileAndGetNewName(CrdnPhotoVO srcPhoto) {
|
|
|
|
|
try {
|
|
|
|
|
// 원본 파일 전체 경로 구성
|
|
|
|
|
String srcFilePath = srcPhoto.getCrdnPhotoPath() + File.separator + srcPhoto.getCrdnPhotoNm();
|
|
|
|
|
|
|
|
|
|
// UUID를 이용한 새로운 저장 파일명 생성 (기존 로직 사용)
|
|
|
|
|
// UUID를 이용한 새로운 저장 파일명 생성
|
|
|
|
|
String fileExt = "";
|
|
|
|
|
String orglFileName = srcPhoto.getOrgnlPhotoNm();
|
|
|
|
|
if (orglFileName != null && orglFileName.contains(".")) {
|
|
|
|
|
@ -196,20 +250,10 @@ public class CrdnRelevyServiceImpl implements CrdnRelevyService {
|
|
|
|
|
boolean copySuccess = fileUtil.copyFile(srcFilePath, uploadDir, targetFilePath);
|
|
|
|
|
|
|
|
|
|
if (copySuccess) {
|
|
|
|
|
// 복사된 파일 정보로 데이터베이스 업데이트
|
|
|
|
|
// 재부과된 단속 정보의 첨부파일명을 새로운 UUID 파일명으로 변경
|
|
|
|
|
Map<String, Object> updateParams = new HashMap<>();
|
|
|
|
|
updateParams.put("actInfoId", relevyVO.getActInfoId());
|
|
|
|
|
updateParams.put("newCrdnYr", relevyVO.getNewCrdnYr());
|
|
|
|
|
updateParams.put("newCrdnNo", relevyVO.getNewCrdnNo());
|
|
|
|
|
updateParams.put("crdnPhotoSn", srcPhoto.getCrdnPhotoSn());
|
|
|
|
|
updateParams.put("crdnPhotoNm", newStrgFileNm);
|
|
|
|
|
updateParams.put("crdnPhotoPath", uploadDir);
|
|
|
|
|
int updateResult = relevyMapper.updateRelevyPhotoInfo(updateParams);
|
|
|
|
|
if (updateResult <= 0) {
|
|
|
|
|
throw new MessageException("첨부파일 정보 업데이트 실패: " + srcPhoto.getOrgnlPhotoNm());
|
|
|
|
|
}
|
|
|
|
|
log.debug("파일 복사 성공: {} -> {}", srcFilePath, targetFilePath);
|
|
|
|
|
// 새로운 경로로 업데이트 (DB INSERT 전에 사용)
|
|
|
|
|
srcPhoto.setCrdnPhotoPath(uploadDir);
|
|
|
|
|
return newStrgFileNm;
|
|
|
|
|
} else {
|
|
|
|
|
throw new MessageException("파일 복사 실패: " + srcPhoto.getOrgnlPhotoNm());
|
|
|
|
|
}
|
|
|
|
|
|