불법행위 정보 - 조치에 대한 로직 재구성 진행 중...

dev
박성영 3 months ago
parent 93a9b27825
commit be64763a25

@ -133,38 +133,6 @@ public class CrdnActInfoController {
return mav;
}
/**
* (View)
* : .
* @param actInfoId ID
* @param crdnYr
* @param crdnNo
* @param mode
* @param model
* @return JSP
*/
@Operation(summary = "조치정보 관리 팝업", description = "조치정보 관리 팝업을 반환합니다.")
@GetMapping("/crdnActnInfoManage.do")
public ModelAndView actnInfoManage(
@Parameter(description = "행위정보ID") @RequestParam String actInfoId,
@Parameter(description = "단속연도") @RequestParam String crdnYr,
@Parameter(description = "단속번호") @RequestParam String crdnNo,
@Parameter(description = "위치정보ID") @RequestParam String pstnInfoId,
@Parameter(description = "화면모드") @RequestParam(required = false, defaultValue = "U") String mode,
Model model) {
log.debug("조치정보 관리 팝업 요청 - actInfoId: {}, crdnYr: {}, crdnNo: {}, mode: {}", actInfoId, crdnYr, crdnNo, mode);
ModelAndView mav = new ModelAndView("crdn/crndRegistAndView/crdnActInfo/crdnActnInfoManage" + TilesConstants.POPUP);
mav.addObject("mode", mode);
mav.addObject("actInfoId", actInfoId);
mav.addObject("pstnInfoId", pstnInfoId);
mav.addObject("crdnYr", crdnYr);
mav.addObject("crdnNo", crdnNo);
return mav;
}
/**
* (AJAX)
* @return
@ -468,6 +436,40 @@ public class CrdnActInfoController {
}
}
// ======================================= 여기서부터 조치 정보 ==========================================
/**
* (View)
* : .
* @param actInfoId ID
* @param crdnYr
* @param crdnNo
* @param mode
* @param model
* @return JSP
*/
@Operation(summary = "조치정보 관리 팝업", description = "조치정보 관리 팝업을 반환합니다.")
@GetMapping("/crdnActnInfoRegistPopup.do")
public ModelAndView actnInfoManage(
@Parameter(description = "행위정보ID") @RequestParam String actInfoId,
@Parameter(description = "단속연도") @RequestParam String crdnYr,
@Parameter(description = "단속번호") @RequestParam String crdnNo,
@Parameter(description = "위치정보ID") @RequestParam String pstnInfoId,
@Parameter(description = "화면모드") @RequestParam(required = false, defaultValue = "U") String mode,
Model model) {
log.debug("조치정보 관리 팝업 요청 - actInfoId: {}, crdnYr: {}, crdnNo: {}, mode: {}", actInfoId, crdnYr, crdnNo, mode);
ModelAndView mav = new ModelAndView("crdn/crndRegistAndView/crdnActInfo/crdnActnInfoRegistPopup" + TilesConstants.POPUP);
mav.addObject("mode", mode);
mav.addObject("actInfoId", actInfoId);
mav.addObject("pstnInfoId", pstnInfoId);
mav.addObject("crdnYr", crdnYr);
mav.addObject("crdnNo", crdnNo);
return mav;
}
/**
* (AJAX)
* : .
@ -522,12 +524,12 @@ public class CrdnActInfoController {
* @param actnPhotoFiles ()
* @return
*/
@Operation(summary = "조치정보 등록", description = "조치정보를 등록합니다. 조치사진도 함께 처리 가능합니다.")
@Operation(summary = "조치정보 저장", description = "조치정보를 등록합니다. 조치사진도 함께 처리 가능합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "등록 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/actnInfoInsert.ajax")
@PostMapping("/saveActnInfo.ajax")
public ResponseEntity<?> actnInfoInsertAjax(
@ModelAttribute CrdnActnInfoVO vo,
@RequestParam(value = "actnPhotoFiles", required = false) List<MultipartFile> actnPhotoFiles) {
@ -535,53 +537,31 @@ public class CrdnActInfoController {
log.debug("조치정보 등록 요청: {}, 조치사진 개수: {}",
vo, actnPhotoFiles != null ? actnPhotoFiles.size() : 0);
// 중요한 로직 주석: 세션에서 사용자 정보 설정
String userId = SessionUtil.getUserId();
vo.setRgtr(userId);
vo.setMdfr(userId);
CrdnRegistAndViewVO crdnVO = new CrdnRegistAndViewVO();
crdnVO.setCrdnYr(vo.getCrdnYr());
crdnVO.setCrdnNo(vo.getCrdnNo());
CrdnRegistAndViewVO data = crdnRegistAndViewService.selectOne(crdnVO);
int result = service.insertActnInfoWithFiles(vo, actnPhotoFiles);
vo.setSggCd(data.getSggCd());
vo.setRgtr(SessionUtil.getUserId());
vo.setMdfr(SessionUtil.getUserId());
if (result > 0) {
return ApiResponseUtil.success("조치정보가 성공적으로 등록되었습니다.");
} else {
return ApiResponseUtil.error("조치정보 등록에 실패했습니다.");
int result = 0;
if( vo.getActnInfoId() == null || vo.getActnInfoId().isEmpty() ){
//등록
result = service.insertActnInfoWithFiles(vo, actnPhotoFiles);
} else{
result = service.updateActnInfoWithFiles(vo, actnPhotoFiles);
}
}
/**
* (AJAX)
* : .
* @param vo
* @param actnPhotoFiles ()
* @return
*/
@Operation(summary = "조치정보 수정", description = "조치정보를 수정합니다. 조치사진도 함께 처리 가능합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "수정 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/actnInfoUpdate.ajax")
public ResponseEntity<?> actnInfoUpdateAjax(
@ModelAttribute CrdnActnInfoVO vo,
@RequestParam(value = "actnPhotoFiles", required = false) List<MultipartFile> actnPhotoFiles) {
log.debug("조치정보 수정 요청: {}, 조치사진 개수: {}",
vo, actnPhotoFiles != null ? actnPhotoFiles.size() : 0);
// 중요한 로직 주석: 세션에서 사용자 정보 설정
String userId = SessionUtil.getUserId();
vo.setMdfr(userId);
int result = service.updateActnInfoWithFiles(vo, actnPhotoFiles);
if (result > 0) {
return ApiResponseUtil.success("조치정보가 성공적으로 수정되었습니다.");
return ApiResponseUtil.success("조치정보가 성공적으로 저장되었습니다.");
} else {
return ApiResponseUtil.error("조치정보 수정에 실패했습니다.");
return ApiResponseUtil.error("조치정보 저장에 실패했습니다.");
}
}
/**
* (AJAX)
* : .

@ -1,6 +1,7 @@
package go.kr.project.crdn.crndRegistAndView.crdnActInfo.service;
import go.kr.project.common.model.FileVO;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnActnInfoVO;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnPhotoVO;
import org.springframework.web.multipart.MultipartFile;
@ -100,11 +101,10 @@ public interface CrdnPhotoService {
*
* : AACTN_INFO_ID ID .
* @param files
* @param actnInfoId ID
* @param actInfoVO (, , )
* @param actnInfoVO
* @return
*/
int insertActnPhotosWithFiles(List<MultipartFile> files, String actnInfoId, Object actInfoVO);
int insertActnPhotosWithFiles(List<MultipartFile> files, CrdnActnInfoVO actnInfoVO);
/**
*

@ -300,17 +300,8 @@ public class CrdnActInfoServiceImpl extends EgovAbstractServiceImpl implements C
// 중요한 로직 주석: 조치사진이 있는 경우 처리 (CRDN_PHOTO_SE_CD = '2')
// 조치사진은 AACTN_INFO_ID 컬럼에 조치정보 ID를 저장한다
if (actnPhotoFiles != null && !actnPhotoFiles.isEmpty()) {
// 중요한 로직 주석: 조치사진 저장을 위해 임시 VO 생성
CrdnActInfoVO tempVO = CrdnActInfoVO.builder()
.actInfoId(vo.getActInfoId()) // 부모 행위정보 ID 설정
.sggCd(vo.getSggCd())
.crdnYr(vo.getCrdnYr())
.crdnNo(vo.getCrdnNo())
.rgtr(vo.getRgtr())
.build();
// 중요한 로직 주석: 조치사진을 행위정보에 연결하되, AACTN_INFO_ID에는 조치정보 ID를 저장
int actnPhotoResult = photoService.insertActnPhotosWithFiles(actnPhotoFiles, vo.getActInfoId(), tempVO);
// 중요한 로직 주석: 조치사진을 행위정보에 연결하되, ACTN_INFO_ID에는 조치정보 ID를 저장
int actnPhotoResult = photoService.insertActnPhotosWithFiles(actnPhotoFiles, vo);
log.debug("조치사진 파일 처리 완료: actnInfoId={}, 등록된 조치사진 수={}", vo.getActnInfoId(), actnPhotoResult);
}
} else {
@ -339,20 +330,10 @@ public class CrdnActInfoServiceImpl extends EgovAbstractServiceImpl implements C
if (result > 0) {
log.debug("조치정보 수정 완료: actnInfoId={}", vo.getActnInfoId());
// 중요한 로직 주석: 새로운 조치사진이 있는 경우 추가 처리
// 기존 사진의 개별 삭제는 별도의 Ajax 호출로 처리되므로 여기서는 신규 추가만 한다
if (actnPhotoFiles != null && !actnPhotoFiles.isEmpty()) {
// 중요한 로직 주석: 조치사진 추가를 위해 임시 VO 생성
CrdnActInfoVO tempVO = CrdnActInfoVO.builder()
.actInfoId(vo.getActInfoId()) // 부모 행위정보 ID 설정
.sggCd(vo.getSggCd())
.crdnYr(vo.getCrdnYr())
.crdnNo(vo.getCrdnNo())
.rgtr(vo.getRgtr())
.build();
int actnPhotoResult = photoService.insertActnPhotosWithFiles(actnPhotoFiles, vo.getActnInfoId(), tempVO);
log.debug("조치사진 파일 추가 완료: actnInfoId={}, 추가된 조치사진 수={}", vo.getActnInfoId(), actnPhotoResult);
// 중요한 로직 주석: 조치사진을 행위정보에 연결하되, ACTN_INFO_ID에는 조치정보 ID를 저장
int actnPhotoResult = photoService.insertActnPhotosWithFiles(actnPhotoFiles, vo);
log.debug("조치사진 파일 처리 완료: actnInfoId={}, 등록된 조치사진 수={}", vo.getActnInfoId(), actnPhotoResult);
}
} else {
log.error("조치정보 수정 실패: {}", vo);

@ -6,6 +6,7 @@ import egovframework.util.SessionUtil;
import go.kr.project.common.model.FileVO;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.mapper.CrdnPhotoMapper;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnActInfoVO;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnActnInfoVO;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnPhotoVO;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.service.CrdnPhotoService;
import lombok.RequiredArgsConstructor;
@ -295,8 +296,8 @@ public class CrdnPhotoServiceImpl extends EgovAbstractServiceImpl implements Crd
@Override
@Transactional
public int insertActnPhotosWithFiles(List<MultipartFile> files, String actnInfoId, Object actInfoVO) {
log.debug("조치사진 파일 업로드 및 등록: actnInfoId={}, 파일 수={}", actnInfoId, files != null ? files.size() : 0);
public int insertActnPhotosWithFiles(List<MultipartFile> files, CrdnActnInfoVO actnInfoVO) {
log.debug("조치사진 파일 업로드 및 등록: actnInfoId={}, 파일 수={}", files != null ? files.size() : 0);
if (files == null || files.isEmpty()) {
log.debug("업로드할 조치사진 파일이 없습니다.");
@ -305,7 +306,6 @@ public class CrdnPhotoServiceImpl extends EgovAbstractServiceImpl implements Crd
try {
int savedCount = 0;
CrdnActInfoVO parentVO = (CrdnActInfoVO) actInfoVO;
// 중요한 로직 주석: 각 파일을 순회하며 저장 처리
for (MultipartFile file : files) {
@ -326,29 +326,29 @@ public class CrdnPhotoServiceImpl extends EgovAbstractServiceImpl implements Crd
FileVO fileVO = uploadedFiles.get(0);
// 중요한 로직 주석: 다음 사진 순번 생성
String nextPhotoSn = getNextPhotoSn(parentVO.getActInfoId());
String nextPhotoSn = getNextPhotoSn(actnInfoVO.getActInfoId());
// 중요한 로직 주석: 조치사진 정보 생성 (CRDN_PHOTO_SE_CD = '2', AACTN_INFO_ID에 조치정보 ID 저장)
CrdnPhotoVO photoVO = CrdnPhotoVO.builder()
.actInfoId(parentVO.getActInfoId()) // 부모 행위정보 ID
.actInfoId(actnInfoVO.getActInfoId()) // 부모 행위정보 ID
.crdnPhotoSn(nextPhotoSn) // 사진 순번
.sggCd(parentVO.getSggCd()) // 시군구 코드
.crdnYr(parentVO.getCrdnYr()) // 단속 연도
.crdnNo(parentVO.getCrdnNo()) // 단속 번호
.sggCd(actnInfoVO.getSggCd()) // 시군구 코드
.crdnYr(actnInfoVO.getCrdnYr()) // 단속 연도
.crdnNo(actnInfoVO.getCrdnNo()) // 단속 번호
.crdnPhotoPath(fileVO.getFilePath()) // 파일 경로
.crdnPhotoNm(fileVO.getStoredFileNm()) // 저장된 파일명
.crdnPhotoSeCd("2") // 조치사진 구분코드
.actnInfoId(actnInfoId) // 조치정보 ID (조치사진 연결용)
.actnInfoId(actnInfoVO.getActnInfoId()) // 조치정보 ID (조치사진 연결용)
.orgnlPhotoNm(fileVO.getOriginalFileNm()) // 원본 파일명
.rgtr(SessionUtil.getUserId()) // 등록자
.rgtr(SessionUtil.getUserId()) // 등록자
.delYn("N") // 삭제 여부
.build();
int result = mapper.insertPhoto(photoVO);
if (result > 0) {
savedCount++;
log.debug("조치사진 등록 완료: actInfoId={}, actnInfoId={}, photoSn={}, fileName={}",
parentVO.getActInfoId(), actnInfoId, nextPhotoSn, file.getOriginalFilename());
log.debug("조치사진 등록 완료: actInfoId={}, photoSn={}, fileName={}",
actnInfoVO.getActInfoId(), nextPhotoSn, file.getOriginalFilename());
}
} catch (Exception e) {
@ -357,11 +357,11 @@ public class CrdnPhotoServiceImpl extends EgovAbstractServiceImpl implements Crd
}
}
log.info("조치사진 파일 업로드 완료: actnInfoId={}, 총 파일 수={}, 저장된 파일 수={}", actnInfoId, files.size(), savedCount);
log.info("조치사진 파일 업로드 완료: actnInfoId={}, 총 파일 수={}, 저장된 파일 수={}", actnInfoVO.getActnInfoId(), files.size(), savedCount);
return savedCount;
} catch (Exception e) {
log.error("조치사진 파일 업로드 중 오류 발생: actnInfoId={}", actnInfoId, e);
log.error("조치사진 파일 업로드 중 오류 발생: actnInfoId={}", actnInfoVO.getActnInfoId(), e);
throw new MessageException("조치사진 업로드에 실패했습니다: " + e.getMessage());
}
}

@ -455,7 +455,7 @@
#{crdnYr},
#{crdnNo},
#{actInfoId},
#{actnYmd},
replace(#{actnYmd},'-',''),
#{actnArea},
#{actnRmrk},
NOW(),
@ -470,7 +470,7 @@
<update id="updateActnInfo" parameterType="CrdnActnInfoVO">
/* ActInfoMapper.updateActnInfo : 조치정보 수정 */
UPDATE tb_actn_info SET
ACTN_YMD = #{actnYmd},
ACTN_YMD = replace(#{actnYmd},'-',''),
ACTN_AREA = #{actnArea},
ACTN_RMRK = #{actnRmrk},
MDFCN_DT = NOW(),

@ -231,7 +231,7 @@
return;
}
var url = '<c:url value="/crdn/crndRegistAndView/crdnActInfo/crdnActnInfoManage.do"/>?mode=U' +
var url = '<c:url value="/crdn/crndRegistAndView/crdnActInfo/crdnActnInfoRegistPopup.do"/>?mode=U' +
'&actInfoId=' + encodeURIComponent(actInfoId) +
'&crdnYr=' + encodeURIComponent(crdnYr) +
'&pstnInfoId=' + encodeURIComponent(pstnInfoId) +

@ -34,10 +34,6 @@
<div class="box_column">
<ul class="box_title">
<li class="tit">조치 정보</li>
<li class="rig">
<button type="button" id="pstnInfoRegistBtn" class="newbtn bg2-1">추가</button>
<button type="button" id="pstnInfoDeleteBtn" class="newbtn bg6">삭제</button>
</li>
</ul>
<div class="containers">
<div id="actnInfoGrid"></div>
@ -117,7 +113,7 @@
<div class="popup_foot">
<button type="button" id="btnSaveActn" class="newbtns bg1">조치정보 저장</button>
<button type="button" id="btnDeleteActn" class="newbtns bg6">조치정보 삭제</button>
<button type="button" id="btnClearActn" class="newbtns bg2">입력 초기화</button>
<button type="button" id="btnClearActn" class="newbtns bg2-1">신규</button>
<button type="button" id="btnClose" class="newbtns bg2 modalclose">닫기</button>
</div>
</div>
@ -256,7 +252,7 @@
gridConfig.setOptGridHeight(150);
gridConfig.setOptRowHeight(30);
gridConfig.setOptUseClientSort(true);
gridConfig.setOptRowHeaderType('checkbox');
gridConfig.setOptRowHeaderType('');
gridConfig.setOptColumns([
{
@ -276,10 +272,7 @@
width: 100,
align: 'center',
formatter: function(e) {
if (e.value && e.value.length === 8) {
return e.value.substring(0,4) + '-' + e.value.substring(4,6) + '-' + e.value.substring(6,8);
}
return e.value || '-';
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{
@ -295,21 +288,12 @@
header: '조치비고',
name: 'actnRmrk',
minWidth: 200,
formatter: function(e) {
return e.value || '-';
}
},
{
header: '등록일시',
name: 'regDt',
header: '수정일시',
name: 'mdfcnDt',
width: 130,
align: 'center',
formatter: function(e) {
if (e.value) {
return e.value.substring(0, 16).replace('T', ' ');
}
return '-';
}
}
]);
@ -345,8 +329,8 @@
var allRows = self.grid.getData();
if (allRows && allRows.length > 0) {
// 첫 번째 행 선택
self.grid.focus(0, 'actnYmd', true);
self.loadActnInfoToForm(allRows[0]);
//self.grid.focus(0, 'actnYmd', true);
//self.loadActnInfoToForm(allRows[0]);
}
});
@ -357,6 +341,7 @@
self.loadActnInfoToForm(rowData);
}
});
},
/**
@ -375,7 +360,7 @@
$('#actnInfoId').val(rowData.actnInfoId || '');
// 조치 일자 설정
$('#actnYmd').val(rowData.actnYmd || '');
$('#actnYmd').val(moment(rowData.actnYmd).format('YYYY-MM-DD') || '');
// 조치 면적 설정 (소수점 2자리까지 표시)
$('#actnArea').val(rowData.actnArea || '');
@ -459,11 +444,16 @@
// FormData 생성 (파일 업로드를 위해)
var formData = new FormData();
formData.append('mode', mode);
formData.append('actInfoId', actInfoId); // 부모 행위정보 ID
formData.append('actnInfoId', actnInfoId);
formData.append('actnYmd', $('#actnYmd').val().trim());
formData.append('actnArea', $('#actnArea').val().trim());
formData.append('actnRmrk', $('#actnRmrk').val().trim());
// 폼의 모든 입력값을 FormData에 추가
$('#actnInfoForm').find('input, select, textarea').each(function() {
var $this = $(this);
var name = $this.attr('name');
var value = $this.val();
if (name && value && $this.attr('type') !== 'file') {
formData.append(name, value);
}
});
// 새로 선택한 조치사진 파일들 추가
if (this.actnSelectedFiles && this.actnSelectedFiles.length > 0) {
@ -488,7 +478,7 @@
// 그리드 새로고침
if (self.grid) {
self.grid.readData(1);
self.grid.readData();
}
} else {
@ -534,7 +524,7 @@
// 그리드 새로고침
if (self.grid) {
self.grid.readData(1);
self.grid.readData();
}
} else {
@ -551,6 +541,8 @@
* 조치정보 폼 초기화 (crdnActInfoRegistPopup.jsp의 clearActnForm 패턴)
*/
clearActnForm: function() {
var self = this;
$('#actnInfoId').val('');
$('#actnYmd').val('');
$('#actnArea').val('');
@ -562,6 +554,8 @@
$('#actnPhotoFiles').val('');
this.actnSelectedFiles = [];
self.grid.readData();
console.log('조치정보 폼 초기화 완료');
},
Loading…
Cancel
Save