package incheon.res.rdm.dc.cstterm.web;


import incheon.com.cmm.ResponseCode;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.security.vo.LoginVO;
import incheon.res.rdm.com.code.service.RdmComCodeService;
import incheon.res.rdm.com.code.vo.RdmComCodeVO;
import incheon.res.rdm.com.digplan.service.RdmComDigplanService;
import incheon.res.rdm.com.digplan.vo.RdmComDigplanVO;
import incheon.res.rdm.com.digsize.service.RdmComDigsizeService;
import incheon.res.rdm.com.digsize.vo.RdmComDigsizeVO;
import incheon.res.rdm.com.peracc.service.RdmComPeraccService;
import incheon.res.rdm.com.peracc.vo.RdmComPeraccVO;
import incheon.res.rdm.com.perinfo.service.RdmComPerinfoService;
import incheon.res.rdm.com.perinfo.vo.RdmComPerinfoVO;
import incheon.res.rdm.com.util.DateUtil;
import incheon.res.rdm.dc.cstterm.service.RdmDcCsttermService;
import incheon.res.rdm.dc.cstterm.vo.RdmDcCsttermVO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.egovframe.rte.fdl.property.EgovPropertyService;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.annotation.Resource;
import java.util.*;

@Controller
@RequestMapping("${api.rps-path}")
public class RdmDcCsttermController {

	protected Log log = LogFactory.getLog(this.getClass());

	@Resource
    private RdmComPeraccService rdmComPeraccService;
	@Resource
	private RdmComPerinfoService rdmComPerinfoService;
	@Resource
	private RdmComDigsizeService rdmComDigsizeService;
	@Resource
	private RdmComDigplanService rdmComDigplanService;
	@Resource
	private RdmDcCsttermService rdmDcCsttermService;
	@Resource
    protected RdmComCodeService rdmComCodeService;
	@Resource(name = "propertiesService")
	protected EgovPropertyService propertiesService;


	/**
	 * @MethodDESC : 준공계 수신 목록 조회
	 */
	@RequestMapping(value = "/RdmDcCsttermL010.do")
	public String selectCsttermList010(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@RequestParam(defaultValue = "1") int pageIndex,
			@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo,
			ModelMap model
	) throws Exception{

		String sessionUserMngCde = loginVO.getRoadMngInstCd();

		vo.setPageIndex(pageIndex);

		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(pageIndex);
		paginationInfo.setRecordCountPerPage(vo.getRecordCountPerPage());
		paginationInfo.setPageSize(vo.getPageSize());

		vo.setFirstIndex(paginationInfo.getFirstRecordIndex());
		vo.setLastIndex(paginationInfo.getLastRecordIndex());
		vo.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

        vo.setExseStpoDngCd(vo.getStdgEmdCdSe());

        //준공계 수신 목록 코드
        String[] rdhCdeSe = {"RDH502", "RDH503"};
        vo.setInCheck("Y");
        vo.setRoadDggPrcsSttsArray(rdhCdeSe);
		vo.setMngInstCdSe(sessionUserMngCde);
		vo.setRoadDggPrcsStts(vo.getRoadDggPrcsSttsSe());

		//착공계 목록
        Map<String, Object> resultMap = rdmComPeraccService.selectPeraccList(vo);

        List resultList = (List)resultMap.get("resultList");
        int resultCnt = (Integer)resultMap.get("resultCnt");

        paginationInfo.setTotalRecordCount(resultCnt);

        //년도
        List planYearList = rdmComCodeService.selectPlanYearList("Y");

        //법정동
        List docdList = rdmComCodeService.selectDocdList("Y");

        model.addAttribute("resultList", resultList);
        model.addAttribute("planYearList", planYearList);
        model.addAttribute("docdList", docdList);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermL010";
	}

	/**
	 * @MethodDESC : 준공계 현장감독의견 목록 조회
	 */
	@RequestMapping(value = "/RdmDcCsttermL020.do")
	public String selectCsttermList020(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@RequestParam(defaultValue = "1") int pageIndex,
			@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo,
			ModelMap model
	) throws Exception{

		String sessionUserMngCde = loginVO.getRoadMngInstCd();

		vo.setPageIndex(pageIndex);

		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(pageIndex);
		paginationInfo.setRecordCountPerPage(vo.getRecordCountPerPage());
		paginationInfo.setPageSize(vo.getPageSize());

		vo.setFirstIndex(paginationInfo.getFirstRecordIndex());
		vo.setLastIndex(paginationInfo.getLastRecordIndex());
		vo.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

        vo.setExseStpoDngCd(vo.getStdgEmdCdSe());

        //준공계 현장감독의견 코드
        String[] rdhCdeSe = {"RDH503", "RDH504"};
        vo.setInCheck("Y");
        vo.setRoadDggPrcsSttsArray(rdhCdeSe);
		vo.setMngInstCdSe(sessionUserMngCde);

		//착공계 목록
        Map<String, Object> resultMap = rdmComPeraccService.selectPeraccList(vo);

        List resultList = (List)resultMap.get("resultList");
        int resultCnt = (Integer)resultMap.get("resultCnt");

        paginationInfo.setTotalRecordCount(resultCnt);

        //년도
        List planYearList = rdmComCodeService.selectPlanYearList("Y");

        //법정동
        List docdList = rdmComCodeService.selectDocdList("Y");

        model.addAttribute("resultList", resultList);
        model.addAttribute("planYearList", planYearList);
        model.addAttribute("docdList", docdList);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermL020";
	}

	/**
	 * @MethodDESC : 준공계 검토의견 목록 조회
	 */
	@RequestMapping(value = "/RdmDcCsttermL030.do")
	public String selectCsttermList030(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@RequestParam(defaultValue = "1") int pageIndex,
			@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo,
			ModelMap model
	) throws Exception{

		String sessionUserMngCde = loginVO.getRoadMngInstCd();

		vo.setPageIndex(pageIndex);

		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(pageIndex);
		paginationInfo.setRecordCountPerPage(vo.getRecordCountPerPage());
		paginationInfo.setPageSize(vo.getPageSize());

		vo.setFirstIndex(paginationInfo.getFirstRecordIndex());
		vo.setLastIndex(paginationInfo.getLastRecordIndex());
		vo.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

        vo.setExseStpoDngCd(vo.getStdgEmdCdSe());

        //준공계 검토의견 코드
        String[] rdhCdeSe = {"RDH504", "RDH505"};
        vo.setInCheck("Y");
        vo.setRoadDggPrcsSttsArray(rdhCdeSe);
		vo.setMngInstCdSe(sessionUserMngCde);

		//착공계 목록
        Map<String, Object> resultMap = rdmComPeraccService.selectPeraccList(vo);

        List resultList = (List)resultMap.get("resultList");
        int resultCnt = (Integer)resultMap.get("resultCnt");

        paginationInfo.setTotalRecordCount(resultCnt);

        //년도
        List planYearList = rdmComCodeService.selectPlanYearList("Y");

        //법정동
        List docdList = rdmComCodeService.selectDocdList("Y");

        model.addAttribute("resultList", resultList);
        model.addAttribute("planYearList", planYearList);
        model.addAttribute("docdList", docdList);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermL030";
	}

	/**
	 * @MethodDESC : 준공계 보완요청 목록 조회
	 */
	@RequestMapping(value = "/RdmDcCsttermL040.do")
	public String selectCsttermList040(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@RequestParam(defaultValue = "1") int pageIndex,
			@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo,
			ModelMap model
	) throws Exception{

		String sessionUserMngCde = loginVO.getRoadMngInstCd();

		vo.setPageIndex(pageIndex);

		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(pageIndex);
		paginationInfo.setRecordCountPerPage(vo.getRecordCountPerPage());
		paginationInfo.setPageSize(vo.getPageSize());

		vo.setFirstIndex(paginationInfo.getFirstRecordIndex());
		vo.setLastIndex(paginationInfo.getLastRecordIndex());
		vo.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

        vo.setExseStpoDngCd(vo.getStdgEmdCdSe());

        //준공계 보완요청 코드
        String[] rdhCdeSe = {"RDH602"};
        vo.setInCheck("Y");
        vo.setRoadDggPrcsSttsArray(rdhCdeSe);
		vo.setMngInstCdSe(sessionUserMngCde);

		//착공계 목록
        Map<String, Object> resultMap = rdmComPeraccService.selectPeraccList(vo);

        List resultList = (List)resultMap.get("resultList");
        int resultCnt = (Integer)resultMap.get("resultCnt");

        paginationInfo.setTotalRecordCount(resultCnt);

        //년도
        List planYearList = rdmComCodeService.selectPlanYearList("Y");

        //법정동
        List docdList = rdmComCodeService.selectDocdList("Y");

        model.addAttribute("resultList", resultList);
        model.addAttribute("planYearList", planYearList);
        model.addAttribute("docdList", docdList);
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermL040";
	}

	/**
	 * @MethodDESC : 준공계 수신관리 상세 조회
	 */
	@RequestMapping(value = "/RdmDcCsttermR010.do")
	public String selectCstterm010(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo,
			ModelMap model)
	  throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO rdmComPerinfoVO = new RdmComPerinfoVO();
		rdmComPerinfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfoVO resultPerinfo = rdmComPerinfoService.selectPerinfo(rdmComPerinfoVO);

		if(!loginVO.getRoadMngInstCd().equals(resultPerinfo.getMngInstCd())){
			return "redirect:/rps/RdmDcCsttermL010.do";
		}

		//굴착예정지
		RdmComDigplanVO rdmComDigplanVO = new RdmComDigplanVO();
		rdmComDigplanVO.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(rdmComDigplanVO);


		model.addAttribute("resultPerinfo", resultPerinfo);
		model.addAttribute("resultDigPlan", resultDigPlan);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermR010";
	}

	/**
	 * @MethodDESC : 준공계 현장감독 관리 상세 조회
	 */
	@RequestMapping(value = "/RdmDcCsttermR020.do")
	public String selectCstterm020(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo,
			ModelMap model)
	  throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO rdmComPerinfoVO = new RdmComPerinfoVO();
		rdmComPerinfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfoVO resultPerinfo = rdmComPerinfoService.selectPerinfo(rdmComPerinfoVO);

		if(!loginVO.getRoadMngInstCd().equals(resultPerinfo.getMngInstCd())){
			return "redirect:/rps/RdmDcCsttermL020.do";
		}

		//굴착규모(일시점용)
		RdmComDigsizeVO rdmComDigsizeVO = new RdmComDigsizeVO();
		rdmComDigsizeVO.setRoadDggMngNo(rdiIdn);
		List resultDigSize = rdmComDigsizeService.selectDigsizeList(rdmComDigsizeVO);

		//굴착규모(영구점용)
		//List resultDigSize2 = rdmComDigsizeService.selectDigsizeList_2(rdmComDigsizeVO);

		//굴착예정지
		RdmComDigplanVO rdmComDigplanVO = new RdmComDigplanVO();
		rdmComDigplanVO.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(rdmComDigplanVO);

		model.addAttribute("resultPerinfo", resultPerinfo);
		model.addAttribute("resultDigSize", resultDigSize);
		model.addAttribute("resultDigPlan", resultDigPlan);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermR020";
	}

	/**
	 * @MethodDESC : 준공계 검토의견 관리 상세 조회
	 */
	@RequestMapping(value = "/RdmDcCsttermR030.do")
	public String selectCstterm030(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo,
			ModelMap model)
	  throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO rdmComPerinfoVO = new RdmComPerinfoVO();
		rdmComPerinfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfoVO resultPerinfo = rdmComPerinfoService.selectPerinfo(rdmComPerinfoVO);

		if(!loginVO.getRoadMngInstCd().equals(resultPerinfo.getMngInstCd())){
			return "redirect:/rps/RdmDcCsttermL030.do";
		}

		//굴착규모(일시점용)
		RdmComDigsizeVO rdmComDigsizeVO = new RdmComDigsizeVO();
		rdmComDigsizeVO.setRoadDggMngNo(rdiIdn);
		List resultDigSize = rdmComDigsizeService.selectDigsizeList(rdmComDigsizeVO);

		//굴착규모(영구점용)
		//List resultDigSize2 = rdmComDigsizeService.selectDigsizeList_2(rdmComDigsizeVO);

		//굴착예정지
		RdmComDigplanVO rdmComDigplanVO = new RdmComDigplanVO();
		rdmComDigplanVO.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(rdmComDigplanVO);

		model.addAttribute("resultPerinfo", resultPerinfo);
		model.addAttribute("resultDigSize", resultDigSize);
		model.addAttribute("resultDigPlan", resultDigPlan);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermR030";
	}

	/**
	 * @MethodDESC : 준공계 보완처리 관리 상세 조회
	 */
	@RequestMapping(value = "/RdmDcCsttermR040.do")
	public String selectCstterm040(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo,
			ModelMap model)
	  throws Exception{


		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO rdmComPerinfoVO = new RdmComPerinfoVO();
		rdmComPerinfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfoVO resultPerinfo = rdmComPerinfoService.selectPerinfo(rdmComPerinfoVO);

		if(!loginVO.getRoadMngInstCd().equals(resultPerinfo.getMngInstCd())){
			return "redirect:/rps/RdmDcCsttermL040.do";
		}

		//굴착규모(일시점용)
		RdmComDigsizeVO rdmComDigsizeVO = new RdmComDigsizeVO();
		rdmComDigsizeVO.setRoadDggMngNo(rdiIdn);
		List resultDigSize = rdmComDigsizeService.selectDigsizeList(rdmComDigsizeVO);

		//굴착규모(영구점용)
		//List resultDigSize2 = rdmComDigsizeService.selectDigsizeList_2(rdmComDigsizeVO);

		//굴착예정지
		RdmComDigplanVO rdmComDigplanVO = new RdmComDigplanVO();
		rdmComDigplanVO.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(rdmComDigplanVO);


		model.addAttribute("resultPerinfo", resultPerinfo);
		model.addAttribute("resultDigSize", resultDigSize);
		model.addAttribute("resultDigPlan", resultDigPlan);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermR040";
	}

	/**
	 * @MethodDESC : 준공계 인쇄
	 */
	@RequestMapping(value = "/LayerPopRdmDcCsttermR050.do")
	public String printCstterm(@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo, ModelMap model) throws Exception{
		
		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO rdmComPerinfoVO = new RdmComPerinfoVO();
		rdmComPerinfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfoVO resultPerinfo = rdmComPerinfoService.selectPerinfo(rdmComPerinfoVO);

		//굴착규모(일시점용)
		RdmComDigsizeVO rdmComDigsizeVO = new RdmComDigsizeVO();
		rdmComDigsizeVO.setRoadDggMngNo(rdiIdn);
		List resultDigSize = rdmComDigsizeService.selectDigsizeList(rdmComDigsizeVO);

		//굴착예정지
		RdmComDigplanVO rdmComDigplanVO = new RdmComDigplanVO();
		rdmComDigplanVO.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(rdmComDigplanVO);
		
		//오늘날짜
		Date now = new Date();
		model.addAttribute("now", now);
		
		model.addAttribute("resultPerinfo", resultPerinfo);
		model.addAttribute("resultDigSize", resultDigSize);
		model.addAttribute("resultDigPlan", resultDigPlan);

		return "res/rdm/dc/cstterm/LayerPopRdmDcCsttermR050";
	}


	/**
	 * @MethodDESC : 준공계 접수 페이지 호출
	 */
	@RequestMapping(value = "/RdmDcCsttermC010.do")
	public String insertCstterm010(@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo, ModelMap model)
	  throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO rdmComPerinfoVO = new RdmComPerinfoVO();
		rdmComPerinfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfoVO resultPerinfo = rdmComPerinfoService.selectPerinfo(rdmComPerinfoVO);

		//굴착예정지
		RdmComDigplanVO rdmComDigplanVO = new RdmComDigplanVO();
		rdmComDigplanVO.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(rdmComDigplanVO);

		model.addAttribute("resultPerinfo", resultPerinfo);
		model.addAttribute("resultDigPlan", resultDigPlan);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermC010";
	}

	/**
	 * @MethodDESC : 준공계 현장감독의견 등록 페이지 호출
	 */
	@RequestMapping(value = "/RdmDcCsttermC020.do")
	public String insertCstterm020(@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo, ModelMap model)
	  throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO rdmComPerinfoVO = new RdmComPerinfoVO();
		rdmComPerinfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfoVO resultPerinfo = rdmComPerinfoService.selectPerinfo(rdmComPerinfoVO);

		//굴착규모(일시점용)
		RdmComDigsizeVO rdmComDigsizeVO = new RdmComDigsizeVO();
		rdmComDigsizeVO.setRoadDggMngNo(rdiIdn);
		List resultDigSize = rdmComDigsizeService.selectDigsizeList(rdmComDigsizeVO);

		//굴착규모(영구점용)
		//List resultDigSize2 = rdmComDigsizeService.selectDigsizeList_2(rdmComDigsizeVO);

		//굴착예정지
		RdmComDigplanVO rdmComDigplanVO = new RdmComDigplanVO();
		rdmComDigplanVO.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(rdmComDigplanVO);

		//뭃량변경여부
		RdmComCodeVO amcCodeParam = new RdmComCodeVO();
		amcCodeParam.setUseTblNm("RMT_RDIG_MT");
		amcCodeParam.setCdFldNm("AMC_CHK");
		List amcChkCodeList = rdmComCodeService.selectChkcdList(amcCodeParam);

		//차로단위복구여부
		RdmComCodeVO rurCodeParam = new RdmComCodeVO();
		rurCodeParam.setUseTblNm("RMT_RDIG_MT");
		rurCodeParam.setCdFldNm("RUR_CHK");
		List rurChkCodeList = rdmComCodeService.selectChkcdList(rurCodeParam);

		model.addAttribute("resultPerinfo", resultPerinfo);
		model.addAttribute("resultDigSize", resultDigSize);
		model.addAttribute("resultDigPlan", resultDigPlan);
		model.addAttribute("amcChkCodeList", amcChkCodeList);
		model.addAttribute("rurChkCodeList", rurChkCodeList);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermC020";
	}

	/**
	 * @MethodDESC : 현장관리부 등록
	 */
	@RequestMapping(value = "/RdmDcCsttermC021.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> insertCstterm021(
			@ModelAttribute RdmDcCsttermVO vo,
			BindingResult bindingResult
	) throws Exception{

		if (bindingResult.hasErrors()) {
			Map<String, String> errors = new HashMap<>();
			bindingResult.getFieldErrors().forEach(error -> {
				String fieldName = error.getField();
				String errorMessage = error.getDefaultMessage();
				errors.put(fieldName, errorMessage);
			});

			DefaultApiResponse<Map<String, Object>> response = DefaultApiResponse.<Map<String, Object>>builder()
					.code(ResponseCode.INPUT_ERROR.getCode())
					.message("입력값 검증 오류가 발생했습니다.")
					.data((Map<String, Object>) (Object) errors)
					.timestamp(java.time.LocalDateTime.now())
					.error("ValidationException")
					.build();

			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
		}

		int result = rdmDcCsttermService.insertCstterm020(vo);

		Map<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put("result", result);

		return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
	}

	/**
	 * @MethodDESC : 준공계 보완요청 페이지 호출
	 */
	@RequestMapping(value = "/LayerPopRdmDcCsttermC040.do")
	public String rejectCsttermView(@ModelAttribute("rdmComPerinfoVO") RdmComPerinfoVO vo,
			ModelMap model, String pageId) throws Exception{

		model.addAttribute("rdmComPerinfoVO", vo);
		model.addAttribute("pageId", pageId);

		return "res/rdm/dc/cstterm/LayerPopRdmDcCsttermC040";
	}

	/**
	 * @MethodDESC : 준공계 보완요청 처리
	 */
	@RequestMapping(value = "/RdmDcCsttermC041.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> rejectCstterm(
			@ModelAttribute RdmDcCsttermVO vo,
			BindingResult bindingResult
	) throws Exception{

		if (bindingResult.hasErrors()) {
			Map<String, String> errors = new HashMap<>();
			bindingResult.getFieldErrors().forEach(error -> {
				String fieldName = error.getField();
				String errorMessage = error.getDefaultMessage();
				errors.put(fieldName, errorMessage);
			});

			DefaultApiResponse<Map<String, Object>> response = DefaultApiResponse.<Map<String, Object>>builder()
					.code(ResponseCode.INPUT_ERROR.getCode())
					.message("입력값 검증 오류가 발생했습니다.")
					.data((Map<String, Object>) (Object) errors)
					.timestamp(java.time.LocalDateTime.now())
					.error("ValidationException")
					.build();

			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
		}

		int result = rdmDcCsttermService.insertCstterm040(vo);

		Map<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put("result", result);

		return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
	}


	/**
	 * @MethodDESC : 준공계 접수 처리
	 */
	@RequestMapping(value = "/RdmDcCsttermU011.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> receiveCstterm(
			@ModelAttribute RdmComPerinfoVO vo,
			BindingResult bindingResult
	) throws Exception{

		if (bindingResult.hasErrors()) {
			Map<String, String> errors = new HashMap<>();
			bindingResult.getFieldErrors().forEach(error -> {
				String fieldName = error.getField();
				String errorMessage = error.getDefaultMessage();
				errors.put(fieldName, errorMessage);
			});

			DefaultApiResponse<Map<String, Object>> response = DefaultApiResponse.<Map<String, Object>>builder()
					.code(ResponseCode.INPUT_ERROR.getCode())
					.message("입력값 검증 오류가 발생했습니다.")
					.data((Map<String, Object>) (Object) errors)
					.timestamp(java.time.LocalDateTime.now())
					.error("ValidationException")
					.build();

			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
		}

		RdmDcCsttermVO csttermParam = new RdmDcCsttermVO();
		csttermParam.setCmcnMngOgdpNm(vo.getCmcnMngOgdpNm());
		csttermParam.setCmcnMngOccu(vo.getCmcnMngOccu());
		csttermParam.setCmcnMngFlnm(vo.getCmcnMngFlnm());
		csttermParam.setRoadDggMngNo(vo.getRoadDggMngNo());

		int result = rdmDcCsttermService.insertCstterm010(csttermParam);

		Map<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put("result", result);

		return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
	}

	/**
	 * @MethodDESC : 준공계 접수 취소 처리
	 */
	@RequestMapping(value = "/RdmDcCsttermU012.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> receiveCancelCstterm(@ModelAttribute RdmComPerinfoVO vo,
			BindingResult bindingResult
	) throws Exception{

		if (bindingResult.hasErrors()) {
			Map<String, String> errors = new HashMap<>();
			bindingResult.getFieldErrors().forEach(error -> {
				String fieldName = error.getField();
				String errorMessage = error.getDefaultMessage();
				errors.put(fieldName, errorMessage);
			});

			DefaultApiResponse<Map<String, Object>> response = DefaultApiResponse.<Map<String, Object>>builder()
					.code(ResponseCode.INPUT_ERROR.getCode())
					.message("입력값 검증 오류가 발생했습니다.")
					.data((Map<String, Object>) (Object) errors)
					.timestamp(java.time.LocalDateTime.now())
					.error("ValidationException")
					.build();

			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
		}

		RdmDcCsttermVO csttermParam = new RdmDcCsttermVO();
		csttermParam.setRoadDggMngNo(vo.getRoadDggMngNo());

		int result = rdmDcCsttermService.cancelCstterm010(csttermParam);

		Map<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put("result", result);

		return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
	}

	/**
	 * @MethodDESC : 현장관리부 내역 수정 페이지 호출
	 */
	@RequestMapping(value = "/RdmDcCsttermU020.do")
	public String selectCsttermU020(@ModelAttribute("rdmComPeraccVO") RdmComPeraccVO vo, ModelMap model)
	  throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO rdmComPerinfoVO = new RdmComPerinfoVO();
		rdmComPerinfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfoVO resultPerinfo = rdmComPerinfoService.selectPerinfo(rdmComPerinfoVO);

		String fspYmd = resultPerinfo.getGrndsMngYmd();
		resultPerinfo.setGrndsMngYmd(DateUtil.toSeperatedFormat(fspYmd, "-"));

		//굴착규모(일시점용)
		RdmComDigsizeVO rdmComDigsizeVO = new RdmComDigsizeVO();
		rdmComDigsizeVO.setRoadDggMngNo(rdiIdn);
		List resultDigSize = rdmComDigsizeService.selectDigsizeList(rdmComDigsizeVO);

		//굴착규모(영구점용)
		//List resultDigSize2 = rdmComDigsizeService.selectDigsizeList_2(rdmComDigsizeVO);

		//굴착예정지
		RdmComDigplanVO rdmComDigplanVO = new RdmComDigplanVO();
		rdmComDigplanVO.setRoadDggMngNo(rdiIdn);
		List resultDigPlan = rdmComDigplanService.selectDigplanList(rdmComDigplanVO);


		//뭃량변경여부
		RdmComCodeVO amcCodeParam = new RdmComCodeVO();
		amcCodeParam.setUseTblNm("RMT_RDIG_MT");
		amcCodeParam.setCdFldNm("AMC_CHK");
		List amcChkCodeList = rdmComCodeService.selectChkcdList(amcCodeParam);

		//차로단위복구여부
		RdmComCodeVO rurCodeParam = new RdmComCodeVO();
		rurCodeParam.setUseTblNm("RMT_RDIG_MT");
		rurCodeParam.setCdFldNm("RUR_CHK");
		List rurChkCodeList = rdmComCodeService.selectChkcdList(rurCodeParam);

		model.addAttribute("resultPerinfo", resultPerinfo);
		model.addAttribute("resultDigSize", resultDigSize);
		//model.addAttribute("resultDigSize2", resultDigSize2);
		model.addAttribute("resultDigPlan", resultDigPlan);
		model.addAttribute("amcChkCodeList", amcChkCodeList);
		model.addAttribute("rurChkCodeList", rurChkCodeList);
		model.addAttribute("searchVo", vo);

		return "res/rdm/dc/cstterm/RdmDcCsttermU020";
	}

	/**
	 * @MethodDESC : 현장관리부 내역 수정
	 */
	@RequestMapping(value = "/RdmDcCsttermU021.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> selectCsttermU021(
			@ModelAttribute RdmComPerinfoVO vo,
			BindingResult bindingResult
	) throws Exception{

		if (bindingResult.hasErrors()) {
			Map<String, String> errors = new HashMap<>();
			bindingResult.getFieldErrors().forEach(error -> {
				String fieldName = error.getField();
				String errorMessage = error.getDefaultMessage();
				errors.put(fieldName, errorMessage);
			});

			DefaultApiResponse<Map<String, Object>> response = DefaultApiResponse.<Map<String, Object>>builder()
					.code(ResponseCode.INPUT_ERROR.getCode())
					.message("입력값 검증 오류가 발생했습니다.")
					.data((Map<String, Object>) (Object) errors)
					.timestamp(java.time.LocalDateTime.now())
					.error("ValidationException")
					.build();

			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
		}

		String fspYmd = vo.getGrndsMngYmd();
		RdmDcCsttermVO csttermParam = new RdmDcCsttermVO();
		csttermParam.setRoadDggMngNo(vo.getRoadDggMngNo());
		csttermParam.setRoadDggPrcsStts(vo.getRoadDggPrcsStts());
		csttermParam.setGrndsMngYmd(DateUtil.toNumberFormat(fspYmd, "-"));
		csttermParam.setGrndsSupe(vo.getGrndsSupe());
		csttermParam.setVolmChgYn(vo.getVolmChgYn());
		csttermParam.setCmcnInspCn(vo.getCmcnInspCn());
		csttermParam.setLaneUnitRstrYn(vo.getLaneUnitRstrYn());

		int result = rdmDcCsttermService.updateCstterm020(csttermParam);

		Map<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put("result", result);

		return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
	}

	/**
	 * @MethodDESC : 준공완료처리
	 */
	@RequestMapping(value = "/RdmDcCsttermU030.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> completeCstterm(
			@ModelAttribute RdmComPerinfoVO vo,
			BindingResult bindingResult
	) throws Exception{

		if (bindingResult.hasErrors()) {
			Map<String, String> errors = new HashMap<>();
			bindingResult.getFieldErrors().forEach(error -> {
				String fieldName = error.getField();
				String errorMessage = error.getDefaultMessage();
				errors.put(fieldName, errorMessage);
			});

			DefaultApiResponse<Map<String, Object>> response = DefaultApiResponse.<Map<String, Object>>builder()
					.code(ResponseCode.INPUT_ERROR.getCode())
					.message("입력값 검증 오류가 발생했습니다.")
					.data((Map<String, Object>) (Object) errors)
					.timestamp(java.time.LocalDateTime.now())
					.error("ValidationException")
					.build();

			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
		}

		try {
			RdmDcCsttermVO csttermParam = new RdmDcCsttermVO();
			csttermParam.setRoadDggMngNo(vo.getRoadDggMngNo());

			int result = rdmDcCsttermService.completeCstterm(csttermParam);

			Map<String, Object> resultMap = new HashMap<String, Object>();
			if (result > 0) {
				resultMap.put("result", result);
			} else {
				return ResponseEntity.badRequest().build();
			}
			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
		}catch (DataAccessException dae) {
			log.error("데이터베이스 처리 중 오류가 발생했습니다.");
			return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
		} catch (RuntimeException re) {
			log.error("시스템 실행 중 예외가 발생했습니다.");
			return ResponseEntity.badRequest().build();
		}
	}

	/**
	 * @MethodDESC : 현장관리부 내역 삭제
	 */
	@RequestMapping(value = "/RdmDcCsttermD010.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> deleteCstterm(
			@ModelAttribute RdmComPerinfoVO vo,
			BindingResult bindingResult
	) throws Exception{

		if (bindingResult.hasErrors()) {
			Map<String, String> errors = new HashMap<>();
			bindingResult.getFieldErrors().forEach(error -> {
				String fieldName = error.getField();
				String errorMessage = error.getDefaultMessage();
				errors.put(fieldName, errorMessage);
			});

			DefaultApiResponse<Map<String, Object>> response = DefaultApiResponse.<Map<String, Object>>builder()
					.code(ResponseCode.INPUT_ERROR.getCode())
					.message("입력값 검증 오류가 발생했습니다.")
					.data((Map<String, Object>) (Object) errors)
					.timestamp(java.time.LocalDateTime.now())
					.error("ValidationException")
					.build();

			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
		}

		RdmDcCsttermVO csttermParam = new RdmDcCsttermVO();
		csttermParam.setRoadDggMngNo(vo.getRoadDggMngNo());

		int result = rdmDcCsttermService.deleteCstterm020(csttermParam);

		Map<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put("result", result);

		return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
	}
}