package incheon.res.rdm.dp.levy.web;


import com.fasterxml.jackson.databind.ObjectMapper;
import incheon.com.cmm.api.DefaultApiResponse;
import incheon.com.security.vo.LoginVO;
import incheon.res.rdm.com.attachfile.service.RdmComAttachfileService;
import incheon.res.rdm.com.attachfile.vo.RdmComAttachfileVO;
import incheon.res.rdm.com.code.service.RdmComCodeService;
import incheon.res.rdm.com.digplan.service.RdmComDigplanService;
import incheon.res.rdm.com.digplan.vo.RdmComDigplanVO;
import incheon.res.rdm.com.digsize.vo.RdmComDigsizeVO;
import incheon.res.rdm.com.levy.vo.LevyAcceptVO;
import incheon.res.rdm.com.levy.vo.LevyCancelVO;
import incheon.res.rdm.com.levy.vo.LevyDecrementVO;
import incheon.res.rdm.com.levy.vo.LevyResultVO;
import incheon.res.rdm.com.msgnlog.service.RdmComMsgnlogService;
import incheon.res.rdm.com.msgnlog.vo.RdmComMsgnlogVO;
import incheon.res.rdm.com.peracc.service.RdmComPeraccService;
import incheon.res.rdm.com.peracc.vo.RdmComPeraccVO;
import incheon.res.rdm.com.perinfo.mapper.RdmComPerinfoMapper;
import incheon.res.rdm.com.perinfo.service.RdmComPerinfoService;
import incheon.res.rdm.com.perinfo.vo.RdmComPerinfo;
import incheon.res.rdm.com.perinfo.vo.RdmComPerinfoVO;
import incheon.res.rdm.dp.levy.service.RdmDpLevyService;
import incheon.res.rdm.dp.levy.vo.RdmDpLevy;
import incheon.res.rdm.dp.levy.vo.RdmDpLevyVO;
import incheon.res.rdm.dp.review.vo.RdmDpReviewVO;
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.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.sql.Clob;
import java.text.SimpleDateFormat;
import java.util.*;

@Controller
@RequestMapping("${api.rps-path}")
public class RdmDpLevyController {
    @Autowired private ObjectMapper objectMapper;

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

	@Resource
    private RdmDpLevyService rdmDpLevyService;
	@Resource
    private RdmComPeraccService rdmComPeraccService;
	@Resource
    private RdmComCodeService rdmComCodeService;
	@Resource
    private RdmComPerinfoService rdmComPerinfoService;
	@Resource
    private RdmComAttachfileService rdmComAttachfileService;
	@Resource
    private RdmComDigplanService rdmComDigplanService;
	@Resource
	private RdmComPerinfoMapper rdmComPerinfoMapper;
	@Resource
	private RdmComMsgnlogService rdmComMsgnlogService;
    @Resource(name = "propertiesService")
    protected EgovPropertyService propertiesService;



    /**
	 * @MethodDESC : 점용료부과 리스트
	 */
	@RequestMapping(value = "/RdmDpLevyL010.do")
	public String selectLevyList(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmDpLevyVO vo,
			@RequestParam(defaultValue = "1") int pageIndex,
			ModelMap model
	) throws Exception{

		RdmComPeraccVO rdmComPeraccVO = new RdmComPeraccVO();
		String[] arrStr ={"RDH206"};
		rdmComPeraccVO.setRoadDggPrcsSttsArray(arrStr);
		rdmComPeraccVO.setInCheck("Y");
		rdmComPeraccVO.setMngInstCdSe(loginVO.getRoadMngInstCd());
		rdmComPeraccVO.setRegDtSe(vo.getRegDtSe());
		rdmComPeraccVO.setExseStpoDngCd(vo.getStdgEmdCdSe());
		rdmComPeraccVO.setBzentyNmSe(vo.getBzentyNmSe());
		rdmComPeraccVO.setCstrnNmSe(vo.getCstrnNmSe());

		rdmComPeraccVO.setPageIndex(pageIndex);

		/*페이징*/
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(pageIndex);
		paginationInfo.setRecordCountPerPage(rdmComPeraccVO.getRecordCountPerPage());
		paginationInfo.setPageSize(rdmComPeraccVO.getPageSize());

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

        Map map = rdmComPeraccService.selectPeraccList(rdmComPeraccVO);

        int totCnt = Integer.parseInt(map.get("resultCnt").toString());
        paginationInfo.setTotalRecordCount(totCnt);

        List yearList = rdmComCodeService.getYearList("Y");
        List bjdCdeList = rdmComCodeService.selectDocdList("Y");

		model.addAttribute("resultList", map.get("resultList"));
        model.addAttribute("paginationInfo", paginationInfo);
        model.addAttribute("searchVo", vo);
        model.addAttribute("yearList", yearList);
        model.addAttribute("bjdCdeList", bjdCdeList);

		return "res/rdm/dp/levy/RdmDpLevyL010";
	}


	/**
	 * @MethodDESC : 점용료부과 상세
	 */
	@RequestMapping(value = "/RdmDpLevyU010.do")
	public String updateLevyView(@ModelAttribute("loginUser") LoginVO loginVO, @ModelAttribute RdmDpLevyVO vo, ModelMap model) throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO perInfoVO = new RdmComPerinfoVO();
		perInfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfo perInfo = rdmComPerinfoService.selectPerinfo(perInfoVO);

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

		//굴착예정지
		RdmComDigplanVO digplanVO = new RdmComDigplanVO();
		digplanVO.setRoadDggMngNo(rdiIdn);
		ArrayList digplanList = (ArrayList)rdmComDigplanService.selectDigplanList(digplanVO);
		
		//부과일추가
		RdmDpLevy levyVo = rdmDpLevyService.selectLevyDt(vo);
		if(levyVo != null ){
			digplanVO.setRegYmd(levyVo.getLevyYmd());
		}

		//복구비, 점용료
		ArrayList digplanDangaCUPTList = (ArrayList)rdmComDigplanService.selectDigplanDangaCUPTList(digplanVO);

		model.addAttribute("perInfo", perInfo);
		model.addAttribute("digplanList", digplanList);
		model.addAttribute("searchVo", vo);
		model.addAttribute("digplanDangaCUPTList", digplanDangaCUPTList);

		return "res/rdm/dp/levy/RdmDpLevyU010";
	}


	/**
	 * @MethodDESC : 점용료산출내역 팝업
	 */
	@RequestMapping(value = "/LayerPopRdmDpLevyR010.do")
	public String selectReview(@ModelAttribute RdmDpLevyVO vo, ModelMap model) throws Exception{

		String rdiIdn = vo.getRoadDggMngNo();

		//공사개요
		RdmComPerinfoVO perInfoVO = new RdmComPerinfoVO();
		perInfoVO.setRoadDggMngNo(rdiIdn);
		RdmComPerinfo perInfo = rdmComPerinfoService.selectPerinfo(perInfoVO);

		RdmComDigplanVO digplanVO = new RdmComDigplanVO();
		digplanVO.setRoadDggMngNo(rdiIdn);

		//부과일추가
		RdmDpLevy levyVo = rdmDpLevyService.selectLevyDt(vo);
		if(levyVo != null ){
			digplanVO.setRegYmd(levyVo.getLevyYmd());
		}

		//복구비, 점용료
		ArrayList digplanDangaCUPTList = (ArrayList)rdmComDigplanService.selectDigplanDangaCUPTList(digplanVO);

		model.addAttribute("perInfo", perInfo);
		model.addAttribute("digplanDangaCUPTList", digplanDangaCUPTList);

		return "res/rdm/dp/levy/LayerPopRdmDpLevyR010";
	}


	/**
	 * @MethodDESC : 납부가상계좌정보
	 */
	@RequestMapping(value = "/LayerPopRdmDpLevyR030.do")
	public String selectVract(@ModelAttribute LevyResultVO vo, ModelMap model) throws Exception{

		ArrayList list = (ArrayList)rdmDpLevyService.selectLevyResult(vo);

		model.addAttribute("list", list);

		return "res/rdm/dp/levy/LayerPopRdmDpLevyR030";
	}


	/**
	 * @MethodDESC : 고지서부과 (차세대)
	 */
	@RequestMapping("/RdmDpLevyU012.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> udateLevyNew(
			@ModelAttribute("loginUser") LoginVO loginVO,
			@ModelAttribute RdmDpLevyVO vo
	) throws Exception {

		try {
			vo.setUserAcntMngNo(loginVO.getUserUnqId());
			vo.setMngInstCd(loginVO.getRoadMngInstCd());

			// 매설물점용료부과의 경우는 제외
			List<RdmComDigsizeVO> dataList1 = vo.getDataList1();
			if(dataList1 != null){
				String che_dte = vo.getChgRsn();
				for(int i = 0 ; i < dataList1.size() ; i++){
					RdmComDigsizeVO rdmComDigsizeVO = dataList1.get(i);
					if(rdmComDigsizeVO.getCmpttnBt().compareTo(rdmComDigsizeVO.getAplyBt()) == 0){
						rdmComDigsizeVO.setCmpttnBt(null);
					}else{
						rdmComDigsizeVO.setOcpatSe("PPS001");
						rdmComDigsizeVO.setChgRsn(che_dte);
						rdmComDigplanService.updateDigsize(rdmComDigsizeVO);
					}
				}
			}

			SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
			String today = df.format(new Date());
			vo.setLevyYmd(today);
			vo.setFisYea(today.substring(0, 4));

			Calendar cal = Calendar.getInstance();
			cal.setTime(new Date());
			cal.add(Calendar.DATE, 30); //연체가 되기때문에 15일에서 30일로 바꿈 (20160913)
			String lstDueDt = new SimpleDateFormat ("yyyyMMdd").format(cal.getTime());
			vo.setLstDueDt(lstDueDt); //최종납기일

			Calendar cal2 = Calendar.getInstance();
			cal2.setTime(cal.getTime());
			cal2.add(Calendar.MONTH, 1);
			String afDueDt = new SimpleDateFormat ("yyyyMMdd").format(cal2.getTime());
			vo.setAfDueDt(afDueDt); //납기후일자

			Vector<String> v_message = new Vector<String>();
			String message = "";
			vo.setFisSp("31");
			///////// 시비 /////////////////////
			if(vo.getLevAmtLvt001() != null && !"0".equals(vo.getLevAmtLvt001())){
				log.error("=================== 시비_복구비(부담금) 시작!! ========================");
				int amtLvt = Integer.parseInt(vo.getLevAmtLvt001().replaceAll(",", ""));
				vo.setRelTaxCode("236002");
				vo.setIntgrtnSp("02"); //부과세가 안붙는 단일
				vo.setTaxObjSp("07"); //부과대상구분코드
				if("3530000".equals(vo.getMngInstCd()) || "3500000".equals(vo.getMngInstCd())){
					vo.setRelTaxCode("236002");
				}else if("3490000".equals(vo.getMngInstCd())){
					vo.setRelTaxCode("236002");
					vo.setTaxObjSp("00"); //부과대상구분코드
				}

				vo.setTrigAlotmKnd("AMT001");
				vo.setLevyAmt(String.valueOf(amtLvt));
				vo.setAdamt(fn_getAddAmt(amtLvt)); //가산금
				vo.setVatTax("0");
				message = rdmDpLevyService.updateLevyNext(vo);
				v_message.add(message);
			}
			if(vo.getLevAmtLvt002() != null && !"0".equals(vo.getLevAmtLvt002())){
				log.error("=================== 시비_점용료(수반) 시작!! ========================");
				int amtLvt = Integer.parseInt(vo.getLevAmtLvt002().replaceAll(",", ""));

				vo.setRelTaxCode("212001");
				vo.setIntgrtnSp("01"); //부과세가 붙는 통합
				vo.setTaxObjSp("07"); //부과대상구분코드
				vo.setTrigAlotmKnd("AMT002");
				vo.setLevyAmt(String.valueOf(amtLvt));
				vo.setVatTax(fn_getVatTax(amtLvt)); //부과세
				vo.setAdamt(fn_getAddAmt(amtLvt)); //가산금
				vo.setAfDueAmt(fn_getAfDueAmt(amtLvt)); //납기후금액

				message = rdmDpLevyService.updateLevyNext(vo);
				v_message.add(message);
			}
			if(vo.getLevAmtLvt006() != null && !"0".equals(vo.getLevAmtLvt006())){
				log.error("=================== 시비_영구점용료(매설물) 시작!! ========================");
				int amtLvt = Integer.parseInt(vo.getLevAmtLvt006().replaceAll(",", ""));

				vo.setRelTaxCode("212001");
				vo.setIntgrtnSp("01"); //부과세가 붙는 통합
				vo.setTaxObjSp("07"); //부과대상구분코드
				vo.setTrigAlotmKnd("AMT006");
				vo.setLevyAmt(String.valueOf(amtLvt));
				vo.setVatTax(fn_getVatTax(amtLvt)); //부과세
				vo.setAdamt(fn_getAddAmt(amtLvt)); //가산금
				vo.setAfDueAmt(fn_getAfDueAmt(amtLvt)); //납기후금액

				message = rdmDpLevyService.updateLevyNext(vo);
				v_message.add(message);
			}

			vo.setFisSp("41");
			///////// 구비 /////////////////////
			if(vo.getLevAmtLvt003() != null && !"0".equals(vo.getLevAmtLvt003())){
				log.error("=================== 구비_복구비 시작!! ========================");
				int amtLvt = Integer.parseInt(vo.getLevAmtLvt003().replaceAll(",", ""));
				vo.setRelTaxCode("236002"); //구비_복구비 (부담금)
				vo.setIntgrtnSp("02"); //부과세가 안붙는 일반
				vo.setTaxObjSp("07"); //부과대상구분코드
				if("3530000".equals(vo.getMngInstCd()) || "3500000".equals(vo.getMngInstCd())){ //남동구, 동구
					vo.setRelTaxCode("236002");
				}else if("3490000".equals(vo.getMngInstCd())){ //중구
					vo.setRelTaxCode("236002");
					vo.setTaxObjSp("00"); //부과대상구분코드
				}

				vo.setTrigAlotmKnd("AMT003");
				vo.setLevyAmt(String.valueOf(amtLvt));
				vo.setAdamt(fn_getAddAmt(amtLvt)); //가산금
				vo.setVatTax("0");

				message = rdmDpLevyService.updateLevyNext(vo);
				v_message.add(message);
			}
			if(vo.getLevAmtLvt004() != null && !"0".equals(vo.getLevAmtLvt004())){
				log.error("=================== 구비_점용료(수반점용료) 시작!! ========================");
				int amtLvt = Integer.parseInt(vo.getLevAmtLvt004().replaceAll(",", ""));

				vo.setRelTaxCode("212001"); //구비_점용료(수반점용료)
				vo.setIntgrtnSp("01"); //부과세가 붙는 통합
				vo.setTaxObjSp("07"); //부과대상구분코드
				vo.setTrigAlotmKnd("AMT004");
				vo.setLevyAmt(String.valueOf(amtLvt));
				vo.setVatTax(fn_getVatTax(amtLvt)); //부과세
				vo.setAdamt(fn_getAddAmt(amtLvt)); //가산금
				vo.setAfDueAmt(fn_getAfDueAmt(amtLvt)); //납기후금액

				message = rdmDpLevyService.updateLevyNext(vo);
				v_message.add(message);
			}
			if(vo.getLevAmtLvt007() != null && !"0".equals(vo.getLevAmtLvt007())){
				log.error("=================== 구비_영구(매설)점용료 시작!! ========================");
				int amtLvt = Integer.parseInt(vo.getLevAmtLvt007().replaceAll(",", ""));

				vo.setRelTaxCode("212001"); //구비_영구점용료
				vo.setTaxObjSp("07"); //부과대상구분코드
				vo.setIntgrtnSp("01"); //부과세가 붙는 통합
				vo.setTrigAlotmKnd("AMT007");
				vo.setLevyAmt(String.valueOf(amtLvt));
				vo.setVatTax(fn_getVatTax(amtLvt)); //부과세
				vo.setAdamt(fn_getAddAmt(amtLvt)); //가산금
				vo.setAfDueAmt(fn_getAfDueAmt(amtLvt)); //납기후금액

				message = rdmDpLevyService.updateLevyNext(vo);
				v_message.add(message);
			}

			message = "succ";
			for(int v = 0 ; v < v_message.size() ; v++){
				if("fail".equals(v_message.get(v).toString())){
					message = "fail";
					break;
				}
			}

			Map<String, Object> resultMap = new HashMap<String, Object>();
			if ("succ".equals(message)) {
				//변경전 상태값
				String tmpRoadDggPrcsStts = vo.getRoadDggPrcsStts();

				RdmComPerinfoVO rdmComPerinfoVO = new RdmComPerinfoVO();
				rdmComPerinfoVO.setRoadDggMngNo(vo.getRoadDggMngNo());
				rdmComPerinfoVO.setRoadDggPrcsStts("RDH208");
				rdmComPerinfoMapper.updateRdhcde(rdmComPerinfoVO);

				//로그저장
				try{
					RdmComMsgnlogVO msgLogVO = new RdmComMsgnlogVO();
					msgLogVO.setStateCde("RDH208");
					msgLogVO.setSeUserAcntMngNo(vo.getUserAcntMngNo());
					msgLogVO.setRoadDggMngNo(vo.getRoadDggMngNo());
					msgLogVO.setRoadDggPrcsStts(tmpRoadDggPrcsStts);
					rdmComMsgnlogService.insertDigMsgNLog2(msgLogVO);
				}catch (IllegalStateException  e){
					log.error("로그 저장 중 오류가 발생했습니다.", e);
					throw new RuntimeException("시스템 로그 저장 중 오류가 발생했습니다.", e);
				}

				resultMap.put("result","succ");
				resultMap.put("message", "");
			} else if ("fail".equals(message)) {
				return ResponseEntity.badRequest().build();
			} else {
				resultMap.put("result", "succ");
				resultMap.put("message", message);
			}
			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));

		}catch (IllegalStateException e) {
			log.error("고지서 부과 중 오류가 발생했습니다.", e);
			return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
		}
   }
	
	/**
	 * @MethodDESC : 허가신청서 부과 상세 정보 등록
	 */
	@RequestMapping(value = "/RdmDpLevyU020.do")
	public String updateLevyChgView(@ModelAttribute("rdmDpLevyVO") RdmDpLevyVO vo, ModelMap model) throws Exception{

		//공사개요
		RdmComPerinfoVO perInfoVO = new RdmComPerinfoVO();
		perInfoVO.setRoadDggMngNo(vo.getRoadDggMngNo());
		RdmComPerinfo perInfo = rdmComPerinfoService.selectPerinfo(perInfoVO);

		//첨부파일
		RdmComAttachfileVO fileVO = new RdmComAttachfileVO();
		fileVO.setTblNam("RMT_RDIG_MT");
		fileVO.setDatSeq(vo.getRoadDggMngNo());
		fileVO.setInCheck("Y");
		String[] atfCde ={"ATF201","ATF202","ATF203","ATF204","ATF205","ATF213","ATF210"};
		fileVO.setAtfCdeSe(atfCde);
		ArrayList fileList = (ArrayList)rdmComAttachfileService.selectAttachfileList(fileVO);

		String rdiIdn = vo.getRoadDggMngNo();
		
		//굴착예정지
		RdmComDigplanVO digplanVO = new RdmComDigplanVO();
		digplanVO.setRoadDggMngNo(rdiIdn);
		ArrayList digplanList = (ArrayList)rdmComDigplanService.selectDigplanList(digplanVO);
		
		//부과일 추가
		RdmDpLevy levyVo = rdmDpLevyService.selectLevyDt(vo);

		if (levyVo != null) {
			String levyYmd = levyVo.getLevyYmd();
			if (levyYmd != null && !levyYmd.isEmpty()) {
				digplanVO.setRegYmd(levyYmd);
			}
		}

		//복구비, 점용료
		ArrayList digplanDangaCUPTList = (ArrayList)rdmComDigplanService.selectDigplanDangaCUPTList(digplanVO);
		
		for (int i = 0; i < digplanDangaCUPTList.size(); i++) {
			Map digMap = (Map) digplanDangaCUPTList.get(i);
			for (Object key : digMap.keySet()) {
				if (digMap.get(key) instanceof Clob) {
					Clob cb = (Clob) digMap.get(key);
					StringBuffer strOut = new StringBuffer();
					String aux;
					try (BufferedReader br = new BufferedReader(cb.getCharacterStream())) {
						while ((aux = br.readLine()) != null) {
							strOut.append(aux);
							strOut.append(System.getProperty("line.separator"));
						}
						digMap.put(key, strOut.toString());
					} catch (IOException e) {
						log.debug("Clob 데이터를 문자열로 변환하는 중 오류 발생");
						throw new RuntimeException("데이터 처리 중 오류가 발생하여 작업을 중단합니다.", e);
					}

				}
			}
		}

		List yearList = rdmComCodeService.selectPlanYearList("N");

		model.addAttribute("perInfo", perInfo);
		model.addAttribute("fileList", fileList);
		model.addAttribute("digplanList", digplanList);
		model.addAttribute("yearList", yearList);
		model.addAttribute("searchVo", vo);
		model.addAttribute("digplanDangaCUPTList", digplanDangaCUPTList);

		return "res/rdm/dp/levy/RdmDpLevyU020";
	}

	/**
	 * @MethodDESC : 고지서 결과값 가져오기
	 */
	@RequestMapping(value = "/levyResult.do")
	public ResponseEntity<DefaultApiResponse<Map<String, Object>>> levyResult(
			HttpServletResponse response, HttpServletRequest request, @RequestBody String val
	) throws Exception{


		try {
			log.error("levyResult " + val);

			String result = "succ";

			JSONParser parser = new JSONParser();
			JSONObject json = (JSONObject) parser.parse(val);

			JSONObject header = (JSONObject) json.get("header");
			JSONObject body = (JSONObject) json.get("body");
			JSONArray reqVo = (JSONArray) body.get("reqVo");

			String ifId = (String) header.get("ifId");
			String source = (String) header.get("source");
			String target = (String) header.get("target");
			String msgkey = (String) header.get("ifMsgKey");
			String ifDate = (String) header.get("ifDate");
			log.error("ifId " + ifId);

			String resultId = "ERR_1741000NIS_Z000001LGE_0001";
			String cancelId = "ERR_1741000NIS_Z000001LGE_0002";
			String acceptId = "ERR_1741000NIS_Z000001LGE_0003";
			String decrementId = "ERR_1741000NIS_Z000001LGE_0004";

			Map<String, Object> rhead = new HashMap<String, Object>();
			List<Map> list = new ArrayList<Map>();
			Map<String, Object> rreqVo = new HashMap<String, Object>();
			Map<String, Object> rbody = new HashMap<String, Object>();
			rhead.put("ifDate", ifDate);
			rhead.put("ifFormat", "J");
			rhead.put("ifId", ifId);
			rhead.put("ifMsgKey", msgkey);
			rhead.put("ifType", "R");
			rhead.put("source", target);
			rhead.put("target", source);

			for(int i=0;i<reqVo.size();i++){
				JSONObject bodyReq = (JSONObject) reqVo.get(i);

				String sgbCd = (String) bodyReq.get("sgbCd");
				String linkTrgtCd = sgbCd + "RES"+"00001";
				String linkMngKey = (String) bodyReq.get("linkMngKey");

				rreqVo.put("sgbCd",sgbCd);
				rreqVo.put("linkTrgtCd", linkTrgtCd);
				rreqVo.put("linkMngKey", linkMngKey);
				list.add(rreqVo);

				String bodyReqStr = bodyReq.toJSONString();

				if(resultId.equals(ifId)){
					LevyResultVO vo = objectMapper.readValue(bodyReqStr, LevyResultVO.class);
					result = rdmDpLevyService.insertLevyResult(vo);
				}else if( acceptId.equals(ifId)){
					LevyAcceptVO vo =  objectMapper.readValue(bodyReqStr, LevyAcceptVO.class);
					result = rdmDpLevyService.insertLevyAccept(vo);
				}else if( cancelId.equals(ifId)){
					LevyCancelVO vo =  objectMapper.readValue(bodyReqStr, LevyCancelVO.class);
					result = rdmDpLevyService.insertLevyCancel(vo);
				}else if( decrementId.equals(ifId)){
					LevyDecrementVO vo =  objectMapper.readValue(bodyReqStr, LevyDecrementVO.class);
					result = rdmDpLevyService.insertDecrement(vo);
				}else{
					result = "fail";
				}
			}
			if("fail".equals(result)){
				rhead.put("retCode","500");
				rhead.put("retName", "FAIL");
				rreqVo.put("linkRstCd", "500");
				rreqVo.put("linkRstMsg", "처리중오류발생");
			}else{
				rhead.put("retCode","200");
				rhead.put("retName", "SUCCESS");
				rreqVo.put("linkRstCd", "200");
				rreqVo.put("linkRstMsg", "정상처리");
			}
			rbody.put("resVo", list);

			Map<String, Object> resultMap = new HashMap<String, Object>();
			resultMap.put("header", rhead);
			resultMap.put("body", rbody);

			return ResponseEntity.ok(DefaultApiResponse.success(resultMap));
		}catch (Exception e) {
			log.error("고지서 결과값 가져오기 중 오류가 발생했습니다.", e);
			return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
		}
	}
	
	//부과가치세
	private String fn_getVatTax(int amtLvt){
		return String.valueOf(amtLvt/10);
	}
	
	//가산금
	private String fn_getAddAmt(int amtLvt){
		return String.valueOf((int)Math.floor((amtLvt * 3) / 1000) * 10);
	}
	
	private String fn_getAfDueAmt(int amtLvt){
		return String.valueOf(amtLvt + Integer.parseInt(fn_getVatTax(amtLvt)) + Integer.parseInt(fn_getAddAmt(amtLvt)));
	}


}