package cokr.xit.fims.epst.web;

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.poi.ss.usermodel.CellStyle;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import cokr.xit.base.code.CommonCode;
import cokr.xit.base.docs.xls.CellDef;
import cokr.xit.base.docs.xls.Format;
import cokr.xit.base.docs.xls.Style;
import cokr.xit.base.docs.xls.XLSWriter;
import cokr.xit.base.web.ApplicationController;
import cokr.xit.fims.cmmn.service.bean.StngBean;
import cokr.xit.fims.cmmn.xls.FormatMaker;
import cokr.xit.fims.cmmn.xls.StyleMaker;
import cokr.xit.fims.epst.EpostGdntc;
import cokr.xit.fims.epst.EpostQuery;
import cokr.xit.fims.epst.EpostRcptReg;
import cokr.xit.fims.epst.service.EpostGdntcService;
import cokr.xit.fims.epst.service.EpostRcptDtlService;
import cokr.xit.fims.epst.service.EpostRcptRegService;
import cokr.xit.fims.epst.service.EpostRcptRsltService;
import cokr.xit.fims.task.Task;
import cokr.xit.foundation.data.DataObject;

/**전자우편 안내문 서비스의 웹 컨트롤러
 *
 * <p>상세 설명:
 *
 * <pre>
 * ============ 변경 이력 ============
 * 2023-12-04	JoJH 최초 작성
 * ================================
 * </pre>
 */
@Controller
@RequestMapping(name="우편통합", value=Epst02Controller.CLASS_URL)
public class Epst02Controller extends ApplicationController {

	public static final String CLASS_URL = "/epst/epst02";

	public class METHOD_URL {
		public static final String
			  epostGuidanceNoticeMain                = "/010/main.do"			// 전자우편 안내문 메인
			, getEpostGuidanceNoticeList             = "/010/list.do"			// 전자우편 안내문 목록 조회
			, removeEpostGuidanceNotice              = "/010/remove.do"			// 전자우편 안내문 삭제
			, getEpostGuidanceNoticeInfo             = "/020/info.do"			// 전자우편 안내문 상세 정보 조회
			, createEpostGuidanceNotice              = "/020/create.do"			// 전자우편 안내문 등록
			, updateEpostGuidanceNotice              = "/020/update.do"			// 전자우편 안내문 수정
			, epostReceiptRegistrationMain           = "/030/main.do"			// 전자우편 우편발송 메인
			, getEpostReceiptRegistrationList        = "/030/list.do"			// 전자우편 우편발송 목록 조회
			, updateEpostSendingProcessStatus        = "/030/updateSttsCd.do"	// 전자우편 우편발송 처리상태코드 수정
			, removeEpostSendingStatus               = "/030/remove.do"			// 전자우편 우편발송 삭제
			, getEpostReceiptRegistrationDetailInfo  = "/040/info.do"			// 전자우편 발송 상세 정보 조회
			, getEpostReceiptRegistrationDetailList  = "/040/list.do"			// 전자우편 발송 상세 정보 조회
			, epostReceiptResultMain                 = "/050/main.do"			// 전자우편 접수 결과 메인
			, getEpostReceiptResultList              = "/050/list.do"			// 전자우편 접수 결과 목록 조회
		;
	}

	/**전자우편 안내문 서비스*/
	@Resource(name="epostGdntcService")
	private EpostGdntcService epostGdntcService;
	/**전자우편 접수 등록 서비스*/
	@Resource(name="epostRcptRegService")
	private EpostRcptRegService epostRcptRegService;
	/**전자우편 접수 상세 서비스*/
	@Resource(name="epostRcptDtlService")
	private EpostRcptDtlService epostRcptDtlService;
	/**전자우편 접수 결과 서비스*/
	@Resource(name="epostRcptRsltService")
	private EpostRcptRsltService epostRcptRsltService;
	@Resource(name="stngBean")
	private StngBean stngBean;

	/**전자우편 안내문 관리 메인화면(epostGdcc/epostGdcc-main)을 연다.
	 * 조건없는 {@link #getEpostGdccList(EpostGdccQuery) 전자우편 안내문 조회 결과}를 포함시킨다.
	 * @return /epostGdcc/epostGdcc-main
	 */
	@RequestMapping(name="안내문관리", value=METHOD_URL.epostGuidanceNoticeMain)
	public ModelAndView epostGuidanceNoticeMain() {
		// View(jsp)에서 사용할 공통코드를 조회
		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM047", "FIM054");

        return new ModelAndView("fims/epst/epst02010-main")
            .addObject("pageName", "epst02010")                             // View(jsp)에서 사용할 id 뒤에 붙일 suffix
            .addObject("prefixUrl", CLASS_URL)                              // prefixUrl
            .addObject("sggCd", currentUser().getOrgID())                        // 시군구 코드(SGG_CD)
            .addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054")))
            .addObject("FIM047List", commonCodes.get("FIM047"))             // 발송 구분 코드(SNDNG_SE_CD)
            .addObject("FIM054List", commonCodes.get("FIM054"))             // 업무 구분 코드(TASK_SE_CD)
		;
	}

	/**전자우편 안내문 목록을 조회하여 반환한다.
	 * {@link EpostGdntcService#getEpostGdccList(EpostGdccQuery)} 참고
	 * @param req 전자우편 안내문 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "epostGdccList": [전자우편 안내문 목록]
	 *     "epostGdccStart": 전자우편 안내문 목록 시작 인덱스
	 *     "epostGdccFetch": 한 번에 가져오는 전자우편 안내문 목록 수
	 *     "epostGdccTotal": 조회 결과 찾은 전체 전자우편 안내문 수
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="전자우편 안내문 목록 조회", value=METHOD_URL.getEpostGuidanceNoticeList)
	public ModelAndView getEpostGuidanceNoticeList(EpostQuery req) {
		if (!"xls".equals(req.getDownload())) {
			List<?> result = epostGdntcService.getEpostGdntcList(setFetchSize(req));
            return setPagingInfo(new ModelAndView("jsonView"), result, "");
		} else {
			// 현재 날짜 구하기
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
			String dateTime = dateFormat.format(System.currentTimeMillis());

			List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());

			XLSWriter xlsx = new XLSWriter().worksheet(0);
			Format format = new Format(xlsx);
			CellStyle center = format.cellStyle(Style.CENTER);
			CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();

			List<DataObject> list = epostGdntcService.getEpostGdntcList(req.setFetchSize(0));

			Map<String,Object> valueMap = new HashMap<String,Object>();

			valueMap.put("업무구분", format.of("TASK_SE_NM").style(center));
			valueMap.put("발송구분", format.of("SNDNG_SE_NM").style(center));
			valueMap.put("사용여부", format.of("USE_YN_NM").style(center));
			valueMap.put("최종사용일시", FormatMaker.yyyy_mm_dd(format, "LAST_USE_DT").style(dateDT));
			valueMap.put("제목", format.of("TTL_NM"));
			valueMap.put("문구내용", format.of("WORDS_CN"));
			valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
			valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
			valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
			valueMap.put("수정사용자", format.of("MDFR_NM").style(center));

			CellDef.setValues(cellDefs, valueMap);

			xlsx.cell(0, 0).value("우편통합 안내문").value(center).merge(0, cellDefs.size() - 1)
				.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
				.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if(i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));

			return new ModelAndView("downloadView")
				.addObject("download", xlsx.getDownloadable().setFilename("우편통합안내문" + "_목록_" + dateTime + ".xlsx"));
		}
	}

	/**전자우편 안내문 단건의 정보(info)를 반환한다.
	 * @param req 부과제외 대장 조회 조건
	 * @return fims/epst/epst02020-info 또는 jsonView
	 * <pre>{
	 *     "epostGdccInfo": 전자우편 안내문 정보
	 * }</pre>
	 */
	@Task
	@RequestMapping(name="전자우편 안내문 정보 조회", value=METHOD_URL.getEpostGuidanceNoticeInfo)
	public ModelAndView getEpostGuidanceNoticeInfo(HttpServletRequest hReq, EpostQuery req) {
        // 상세 정보 조회
		DataObject epostGdntcInfo = epostGdntcService.getEpostGdntcInfo(req);
		// View(jsp)에서 사용할 공통코드를 조회
		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM047", "FIM054");

        boolean json = jsonResponse();
        return new ModelAndView(json ? "jsonView" : "fims/epst/epst02020-info")
            .addObject("callPurpose", req.getCallPurpose())                     // 호출 용도
            .addObject("pageName", "epst02020")                                 // View(jsp)에서 사용할 id 뒤에 붙일 suffix
            .addObject("prefixUrl", CLASS_URL)                                  // prefixUrl
            .addObject("FIM047List", commonCodes.get("FIM047"))                 // 발송 구분 코드(SNDNG_SE_CD)
            .addObject("FIM054List", commonCodes.get("FIM054"))                 // 업무 구분 코드(TASK_SE_CD)
            .addObject("Info", json ? epostGdntcInfo : toJson(epostGdntcInfo))  // 전자우편 안내문 정보
		;
	}

	/**전자우편 안내문 정보를 등록한다.
	 * @param epostGdcc 전자우편 안내문 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="전자우편 안내문 등록", value=METHOD_URL.createEpostGuidanceNotice)
	public ModelAndView createEpostGuidanceNotice(EpostGdntc epostGdntc) {
		String rtnMsg = epostGdntcService.createEpostGdntc(epostGdntc);

		return new ModelAndView("jsonView")
			.addObject("saved", rtnMsg.contains("[S]"))
			.addObject("rtnMsg", rtnMsg);
	}

	/**전자우편 안내문 정보를 수정한다.
	 * @param epostGdcc 전자우편 안내문 정보
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="전자우편 안내문 수정", value=METHOD_URL.updateEpostGuidanceNotice)
	public ModelAndView updateEpostGuidanceNotice(EpostGdntc epostGdntc) {
		String rtnMsg = epostGdntcService.updateEpostGdntc(epostGdntc);

		return new ModelAndView("jsonView")
			.addObject("saved", rtnMsg.contains("[S]"))
			.addObject("rtnMsg", rtnMsg);
	}

	/**지정한 전자우편 안내문를 제거한다.
	 * @param epostGdntcIds 전자우편 안내문 아이디
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="전자우편 안내문 삭제", value=METHOD_URL.removeEpostGuidanceNotice)
	public ModelAndView removeEpostGuidanceNotice(EpostGdntc epostGdntc) {
		String rtnMsg = epostGdntcService.removeEpostGdntc(epostGdntc);

		return new ModelAndView("jsonView")
			.addObject("saved", rtnMsg.contains("[S]"))
			.addObject("rtnMsg", rtnMsg);
	}

	/**전자우편 접수 등록 관리 메인화면(fims/epst/epst02030-main)을 연다.
	 * @return /fims/epst/epst02030-main
	 */
	@RequestMapping(name="전자우편 발송 현황", value=METHOD_URL.epostReceiptRegistrationMain)
	public ModelAndView epostReceiptRegistrationMain() {
		// 부서 정보
		DataObject deptInfo = stngBean.getStng("dept");
		// View(jsp)에서 사용할 공통코드를 조회
		Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM054");

        return new ModelAndView("fims/epst/epst02030-main")
            .addObject("pageName", "epst02030")                             // View(jsp)에서 사용할 id 뒤에 붙일 suffix
            .addObject("prefixUrl", CLASS_URL)                              // prefixUrl
            .addObject("sggCd", currentUser().getOrgID())                        // 시군구 코드(SGG_CD)
            .addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054")))
            .addObject("deptCd", deptInfo.string("DEPT_CD"))                // 부서 코드 7자리
            .addObject("conOrg", deptInfo.string("EGP_CON_ORG"))            // E그린 외부기관구분코드
		;
	}

	/**전자우편 접수 등록 목록을 조회하여 반환한다.<br />
	 * {@link EpostRcptRegService#getEpostRcptRegList(EpostRcptRegQuery)} 참고
	 * @param req 전자우편 접수 등록 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "epostRcptRegList": [전자우편 접수 등록 목록]
	 *     "epostRcptRegStart": 전자우편 접수 등록 목록 시작 인덱스
	 *     "epostRcptRegFetch": 한 번에 가져오는 전자우편 접수 등록 목록 수
	 *     "epostRcptRegTotal": 조회 결과 찾은 전체 전자우편 접수 등록 수
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="전자우편 발송 목록 조회", value=METHOD_URL.getEpostReceiptRegistrationList)
	public ModelAndView getEpostReceiptRegistrationList(EpostQuery req) {
		if (!"xls".equals(req.getDownload())) {
			List<?> result = epostRcptRegService.getEpostRcptRegList(setFetchSize(req));
            return setPagingInfo(new ModelAndView("jsonView"), result, "");
		} else {
			// 현재 날짜 구하기
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
			String dateTime = dateFormat.format(System.currentTimeMillis());

			List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());

			XLSWriter xlsx = new XLSWriter().worksheet(0);
			Format format = new Format(xlsx);
			CellStyle center = format.cellStyle(Style.CENTER);
			CellStyle numeric = format.n_nn0();
			CellStyle dateYMD = format.yyyy_mm_dd();
			CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();

			List<DataObject> list = epostRcptRegService.getEpostRcptRegList(req.setFetchSize(0));

			Map<String,Object> valueMap = new HashMap<String,Object>();
			valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "SEND_DATE").style(dateYMD));
			valueMap.put("발송내역", format.of("JOB_CD").style(center));
			valueMap.put("취급구분", format.of("DIV_KB_NM").style(center));
			valueMap.put("접수일자", FormatMaker.yyyy_mm_dd(format, "RCEPT_YMD").style(dateYMD));
			valueMap.put("자료키", format.of("CON_KEY").style(center));
			valueMap.put("발송건수", format.of("RECEV_CNT").style(numeric));
			valueMap.put("우편처리상태", format.of("POST_PRCS_STTS_NM").style(center));
			valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
			valueMap.put("등록사용자", format.of("RGTR_NM").style(center));

			CellDef.setValues(cellDefs, valueMap);

			xlsx.cell(0, 0).value("우편통합 우편발송").value(center).merge(0, cellDefs.size() - 1)
				.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
				.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if(i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));

			return new ModelAndView("downloadView")
				.addObject("download", xlsx.getDownloadable().setFilename("우편통합우편발송" + "_목록_" + dateTime + ".xlsx"));
		}
	}

	/**전자우편 발송 상세 정보(info)를 반환한다.
	 * @param req 부과제외 대장 조회 조건
	 * @return fims/epst/epst02040-info 또는 jsonView
	 * <pre>{
	 *     "epostRcptReg": 전자우편 접수 등록 정보
	 * }</pre>
	 */
	@Task
	@RequestMapping(name="전자우편 발송 상세 화면", value=METHOD_URL.getEpostReceiptRegistrationDetailInfo)
	public ModelAndView getEpostReceiptRegistrationDetailInfo(HttpServletRequest hReq, EpostQuery req) {
		ModelAndView mav = getEpostReceiptRegistrationDetailList(req);
		mav.setViewName("fims/epst/epst02040-info");

        return mav
            .addObject("callPurpose", req.getCallPurpose())                 // 호출 용도
            .addObject("pageName", "epst02040")                             // View(jsp)에서 사용할 id 뒤에 붙일 suffix
            .addObject("prefixUrl", CLASS_URL)                              // prefixUrl
            .addObject("sggCd", req.getSggCd())                             // 시군구 코드(SGG_CD)
            .addObject("taskSeCd", req.getTaskSeCd())                       // 업무 구분 코드(TASK_SE_CD)
            .addObject("mainQuery", toJson(req))                            // 검색 조건
            .addObject("List", toJson(mav.getModel().get("List")))          // 데이터
            .addObject("Paging", toJson(mav.getModel().get("Paging")))      // 페이징
		;
	}

	/**전자우편 발송 상세 정보(info)를 반환한다.
	 * @param req 부과제외 대장 조회 조건
	 * @return fims/epst/epst02040-info 또는 jsonView
	 * <pre>{
	 *     "epostRcptReg": 전자우편 접수 등록 정보
	 * }</pre>
	 */
	@Task
	@RequestMapping(name="전자우편 발송 상세 목록 조회", value=METHOD_URL.getEpostReceiptRegistrationDetailList)
	public ModelAndView getEpostReceiptRegistrationDetailList(EpostQuery req) {
		// 엑셀 저장이 아니라면.. 검색
		if (!"xls".equals(req.getDownload())) {
			List<?> result = epostRcptRegService.getEpostRcptRegDtlList(setFetchSize(req));
            return setPagingInfo(new ModelAndView("jsonView"), result, "");
		} else {
			// 현재 날짜 구하기
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
			String dateTime = dateFormat.format(System.currentTimeMillis());

			List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());

			XLSWriter xlsx = new XLSWriter().worksheet(0);
			Format format = new Format(xlsx);
			CellStyle center = format.cellStyle(Style.CENTER);
			CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();

			List<DataObject> list = epostRcptRegService.getEpostRcptRegDtlList(req.setFetchSize(0));

			Map<String,Object> valueMap = new HashMap<String,Object>();
				valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
				valueMap.put("등기번호", format.of("RGST_NMBR").style(center));
				valueMap.put("우편번호", format.of("RECEV_CAR_OWNER_ZIPCODE").style(center));
				valueMap.put("수취인명", format.of("RECEV_CAR_OWNER_NM"));
				valueMap.put("배달일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "DELIV_YMD_TM").style(dateDT));
				valueMap.put("배달결과", format.of("DELIVRSLTCD_NM").style(center));
				valueMap.put("수령인명", format.of("SUBRECPRSNNM"));
				valueMap.put("수령인관계", format.of("RELRECPRSNCDNM").style(center));
				valueMap.put("미배달사유", format.of("NONDELIVREASNCDNM"));
				valueMap.put("주소", format.of("RECEV_CAR_OWNER_ADDR"));
				valueMap.put("상세주소", format.of("RECEV_CAR_OWNER_DETAILADDR"));
				valueMap.put("연계식별키", format.of("CON_KEY"));
				valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
				valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
				valueMap.put("수정사용자", format.of("MDFR_NM").style(center));

			CellDef.setValues(cellDefs, valueMap);

			xlsx.cell(0, 0).value("우편통합 발송상세").value(center).merge(0, cellDefs.size() - 1)
				.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
				.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if(i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));

			return new ModelAndView("downloadView")
				.addObject("download", xlsx.getDownloadable().setFilename("우편통합발송상세" + "_목록_" + dateTime + ".xlsx"));
		}
	}

	/**전자우편 접수 등록 정보의 우편 처리 상태 코드를 수정한다.
	 * @param epostRcptReg 전자우편 접수 등록
	 * @return jsonView
	 * <pre><code> {
	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="전자우편 발송 우편처리상태코드 수정", value=METHOD_URL.updateEpostSendingProcessStatus)
	public ModelAndView updateEpostSendingProcessStatus(EpostRcptReg epostRcptReg) {
		String rtnMsg = epostRcptRegService.updatePostPrcsSttsCd(epostRcptReg);

		return new ModelAndView("jsonView")
			.addObject("saved", rtnMsg.contains("[S]"))
			.addObject("rtnMsg", rtnMsg);
	}

	/**지정한 전자우편 접수 등록 정보를 제거한다.
	 * @param epostRcptReg 전자우편 접수 등록
	 * @return jsonView
	 * <pre><code> {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="전자우편 발송 삭제", value=METHOD_URL.removeEpostSendingStatus)
	public ModelAndView removeEpostSendingStatus(EpostRcptReg epostRcptReg) {
		String rtnMsg = epostRcptRegService.remove(epostRcptReg);

		return new ModelAndView("jsonView")
			.addObject("saved", rtnMsg.contains("[S]"))
			.addObject("rtnMsg", rtnMsg);
	}

	/**전자우편 접수 결과 관리 메인화면(epostRcptRslt/epostRcptRslt-main)을 연다.
	 * 조건없는 {@link #getEpostRcptRsltList(EpostRcptRsltQuery) 전자우편 접수 결과 조회 결과}를 포함시킨다.
	 * @return /epostRcptRslt/epostRcptRslt-main
	 */
	@RequestMapping(name="접수결과 메인", value=METHOD_URL.epostReceiptResultMain)
	public ModelAndView epostReceiptResultMain() {
		// 부서 정보
		DataObject deptInfo = stngBean.getStng("dept");
		// View(jsp)에서 사용할 공통코드를 조회
		Map<String, List<CommonCode>> commonCodes = getCodesOf("EGP002", "FIM054", "FIM082");

        return new ModelAndView("fims/epst/epst02050-main")
            .addObject("pageName", "epst02050")                             // View(jsp)에서 사용할 id 뒤에 붙일 suffix
            .addObject("prefixUrl", CLASS_URL)                              // prefixUrl
            .addObject("sggCd", currentUser().getOrgID())                        // 시군구 코드(SGG_CD)
            .addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054")))
            .addObject("deptCd", deptInfo.string("DEPT_CD"))                // 부서 코드 7자리
            .addObject("conOrg", deptInfo.string("EGP_CON_ORG"))            // E그린 외부기관구분코드
            .addObject("EGP002List", commonCodes.get("EGP002"))             // 취급 구분(DIV_KB)
            .addObject("FIM082List", commonCodes.get("FIM082"))             // 작업 코드 3(JOB_CD)
		;
	}

	/**전자우편 접수 결과 목록을 조회하여 반환한다.<br />
	 * {@link EpostRcptRsltService#getEpostRcptRsltList(EpostRcptRsltQuery)} 참고
	 * @param req 전자우편 접수 결과 조회 조건
	 * @return jsonView
	 * <pre><code> {
	 *     "epostRcptRsltList": [전자우편 접수 결과 목록]
	 *     "epostRcptRsltStart": 전자우편 접수 결과 목록 시작 인덱스
	 *     "epostRcptRsltFetch": 한 번에 가져오는 전자우편 접수 결과 목록 수
	 *     "epostRcptRsltTotal": 조회 결과 찾은 전체 전자우편 접수 결과 수
	 * }</code></pre>
	 */
	@Task
	@RequestMapping(name="전자우편 접수 결과 목록 조회", value=METHOD_URL.getEpostReceiptResultList)
	public ModelAndView getEpostReceiptResultList(EpostQuery req) {
		if (!"xls".equals(req.getDownload())) {
			List<?> result = epostRcptRsltService.getEpostRcptRsltList(setFetchSize(req));
	        ModelAndView mav = setPagingInfo(new ModelAndView("jsonView"), result, "");

	        // 합계 금액 정보
            List<DataObject> sumAmt = epostRcptRsltService.getEpostRcptRsltSum(req);
            return mav.addObject("sumAmt", sumAmt);
		} else {
			// 현재 날짜 구하기
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
			String dateTime = dateFormat.format(System.currentTimeMillis());

			List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());

			XLSWriter xlsx = new XLSWriter().worksheet(0);
			Format format = new Format(xlsx);
			CellStyle center = format.cellStyle(Style.CENTER);
			CellStyle numeric = format.n_nn0();
			CellStyle dateYMD = format.yyyy_mm_dd();
			CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();

			List<DataObject> list = epostRcptRsltService.getEpostRcptRsltList(req.setFetchSize(0));

			Map<String,Object> valueMap = new HashMap<String,Object>();
			valueMap.put("발송자료키", format.of("RELETCDATA").style(center));
			valueMap.put("우편물코드", format.of("JOB_CD").style(center));
			valueMap.put("우편물종류", format.of("JOB_CD3_NM").style(center));
			valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "EXTRI_REGYMD").style(dateYMD));
			valueMap.put("접수일자", FormatMaker.yyyy_mm_dd(format, "RCEPT_YMD").style(dateYMD));
			valueMap.put("취급구분", format.of("DIV_KB_NM").style(center));
			valueMap.put("발송건수", format.of("RCEPT_CNT").style(numeric));
			valueMap.put("결제금액", format.of("RCEPT_AMT").style(numeric));
			valueMap.put("제작수수료", format.of("USEFEE_AMT").style(numeric));
			valueMap.put("우편요금", format.of("TOTPOST_PRC").style(numeric));
			valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
			valueMap.put("등록사용자", format.of("RGTR_NM").style(center));

			CellDef.setValues(cellDefs, valueMap);

			xlsx.cell(0, 0).value("우편통합 접수결과").value(center).merge(0, cellDefs.size() - 1)
				.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
				.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if(i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));

			return new ModelAndView("downloadView")
				.addObject("download", xlsx.getDownloadable().setFilename("우편통합접수결과" + "_목록_" + dateTime + ".xlsx"));
		}
	}
}