package kcc.web;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.annotation.Resource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.fdl.security.intercept.EgovReloadableFilterInvocationSecurityMetadataSource;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import kcc.com.cmm.CmmUtil;
import kcc.com.cmm.ComDefaultVO;
import kcc.com.cmm.LoginVO;
import kcc.com.cmm.service.EgovCmmUseService;
import kcc.com.cmm.service.EgovFileMngUtil;
import kcc.com.cmm.service.FileVO;
import kcc.com.cmm.util.WebUtil;
import kcc.com.uss.ion.bnr.service.BannerVO;
import kcc.com.uss.ion.bnr.service.EgovBannerService;
import kcc.com.uss.ion.cnf.service.MetaTagManageService;
import kcc.com.uss.ion.cyb.service.CyberAlertManageService;
import kcc.com.uss.ion.fms.service.FmsFileVO;
import kcc.com.uss.ion.pwm.service.EgovPopupManageService;
import kcc.com.uss.ion.pwm.service.MainzoneVO;
import kcc.com.uss.ion.pwm.service.PopupManageVO;
import kcc.com.uss.ion.pwm.service.PopupzoneVO;
import kcc.com.utl.fcc.service.EgovStringUtil;
import kcc.let.cop.bbs.service.BoardMasterVO;
import kcc.let.cop.bbs.service.BoardVO;
import kcc.let.cop.bbs.service.EgovBBSAttributeManageService;
import kcc.let.cop.bbs.service.EgovBBSManageService;
import kcc.let.sts.cst.service.EgovConectStatsService;
import kcc.let.sym.ccm.cde.service.EgovCcmCmmnDetailCodeManageService;
import kcc.let.sym.log.clg.service.EgovLoginLogService;
import kcc.let.sym.log.clg.service.LoginLog;
import kcc.let.sym.mnu.mcm.service.EgovMenuCreateManageService;
import kcc.let.sym.mnu.mpm.service.EgovMenuManageService;
import kcc.let.sym.mnu.mpm.service.MenuManageJTreeVO;
import kcc.let.sym.mnu.mpm.service.MenuManageVO;
import kcc.let.sym.prm.service.EgovProgrmManageService;
import kcc.let.sym.prm.service.ProgrmManageVO;
import kcc.let.sym.site.service.EgovSiteManagerService;
import kcc.let.sym.site.service.SiteManagerVO;

/**
 * 템플릿 메인 페이지 컨트롤러 클래스(Sample 소스)
 * 
 * @author 실행환경 개발팀 JJY
 * @since 2011.08.31
 * @version 1.0
 * @see
 *
 *      <pre>
 * << 개정이력(Modification Information) >>
 *
 *   수정일      수정자           수정내용
 *  -------    --------    ---------------------------
 *   2011.08.31  JJY            최초 생성
 *
 *      </pre>
 */
@Controller
@SessionAttributes(types = ComDefaultVO.class)
public class MainController {

	/** EgovProgrmManageService */
	@Resource(name = "progrmManageService")
	private EgovProgrmManageService progrmManageService;

	/** EgovPropertyService */
	@Resource(name = "propertiesService")
	protected EgovPropertyService propertiesService;

	/**
	 * EgovBBSManageService
	 */
	@Resource(name = "EgovBBSManageService")
	private EgovBBSManageService bbsMngService;

	/** EgovMenuManageService */
	@Resource(name = "meunManageService")
	private EgovMenuManageService menuManageService;

	@Resource(name = "egovBannerService")
	private EgovBannerService egovBannerService;

	/** EgovPopupManageService */
	@Resource(name = "egovPopupManageService")
	private EgovPopupManageService egovPopupManageService;

	/** cyberAlertManageService */
	@Resource(name = "cyberAlertManageService")
	private CyberAlertManageService cyberAlertManageService;

	@Resource(name = "EgovLoginLogService")
	private EgovLoginLogService loginLogService;

	@Resource(name = "conectStatsService")
	private EgovConectStatsService conectStatsService;

	@Resource(name = "databaseSecurityMetadataSource")
	EgovReloadableFilterInvocationSecurityMetadataSource databaseSecurityMetadataSource;

	/** cmmUseService */
	@Resource(name = "EgovCmmUseService")
	private EgovCmmUseService cmmUseService;

	/** EgovMenuManageService */
	@Resource(name = "meunCreateManageService")
	private EgovMenuCreateManageService menuCreateManageService;

	@Resource(name = "egovSiteManagerService")
	EgovSiteManagerService egovSiteManagerService;

	@Resource(name = "EgovBBSAttributeManageService")
	private EgovBBSAttributeManageService bbsAttrbService;

	/** metaTagManageService 메타태그 */
	@Resource(name = "metaTagManageService")
	private MetaTagManageService metaTagManageService;

	@Resource(name = "EgovFileMngUtil")
	private EgovFileMngUtil fileUtil;

	@Value("#{globalSettings['Globals.email.host']}")
	private String Globals_email_host;
	@Value("#{globalSettings['Globals.email.port']}")
	private String Globals_email_port;
	@Value("#{globalSettings['Globals.email.fromUser']}")
	private String Globals_email_fromUser;
	@Value("#{globalSettings['Globals.email.fromEmail']}")
	private String Globals_email_fromEmail;
	@Value("#{globalSettings['Globals.email.fromEmail.password']}")
	private String Globals_email_fromEmail_password;
	@Value("#{globalSettings['Globals.email.toEmail']}")
	private String Globals_email_toEmail;
	@Value("#{globalSettings['Globals.email.toEmail.BCC']}")
	private String Globals_email_toEmail_BCC;

	@Resource(name = "CmmnDetailCodeManageService")
	private EgovCcmCmmnDetailCodeManageService cmmnDetailCodeManageService;
	
	@Resource(name = "EgovCmmUseService")
	private EgovCmmUseService egovCmmUseService;

	@RequestMapping(value = "/web/main/mainPage.do")
	public String siteMainPage(HttpServletRequest request, ModelMap model, HttpSession session) throws Exception {
		
		/** 메인비주얼 */
		model.addAttribute("mainzoneImg", this.mainzone());

		/** 팝업 괸리 */
		model.addAttribute("popupList", this.Popup());

		/** 알림창괸리 */
		model.addAttribute("popupzoneImg", this.popupzone());
		
		/** 배너괸리 */
		model.addAttribute("bannerList", this.banner());
		
		/** 공지사항 */
//		model.addAttribute("noticeList", this.bbsList("notice", 0, 5));
		model.addAttribute("noticeList", null);
		
		/** 뉴스레터 */
//		model.addAttribute("newsLetterList", this.bbsList("news", 0, 2));
		model.addAttribute("newsLetterList", null);
		
		/** 뉴스레터 */
//		model.addAttribute("faqList", this.faqList());
		model.addAttribute("faqList", null);
		
		/** 분쟁조정 사례 */
//		model.addAttribute("examList", this.examList());
		model.addAttribute("examList", null);
		
		/** 팝업 */
		model.addAttribute("popupList", this.popupList());
		
		return "web/main/mainPage";
	}

	/**
	 * 사용자 상단 매뉴
	 */
	@RequestMapping(value = "/web/com/webCommonHeader.do")
	public String siteWebCommonHeader(@RequestParam Map<String, Object> commandMap,
			@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, ModelMap model, HttpServletRequest request,
			HttpSession session) throws Exception {

		// 로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
				? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
				: null;
		String userAuthority = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority());

		// 권한별 메뉴표시
		if (!userAuthority.equals("ROLE_ADMIN") && userAuthority != "") {
			menuManageVO.setAuthorCode(userAuthority);
		} else if (userAuthority.equals("ROLE_ADMIN")) {
			menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		} else {
			menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		}

		List<MenuManageJTreeVO> menuResultList = menuCreateManageService.selectMenuListJtreeWeb(menuManageVO);
		menuDepth2ChildCnt(menuResultList);
		
		model.addAttribute("menuResultList", menuResultList);
		
//		CertVO certVO = FairnetUtils.getCertSession(request);
//		model.addAttribute("certVO", certVO);

		return "web/com/webCommonHeader";
	}

	/**
	 * 사용자 footer
	 */
	@RequestMapping(value = "/web/com/webCommonFooter.do")
	public String siteWebCommonFooter(@RequestParam Map<String, Object> commandMap, HttpServletRequest request,
			ModelMap model
			, MenuManageJTreeVO menuManageVO) throws Exception {

		LoginLog loginLog = new LoginLog();
		if (request.getRequestURI().contains("/web/main/mainPage.do")) { // 사용자 메인
			loginLog.setProgrmFileNm("mainPage");
			loginLog.setMenuNm("사용자메인");
		} else if (request.getRequestURI().contains("/web/survey/surveyList")) { // 설문조사
			loginLog.setProgrmFileNm("surveyList");
			loginLog.setMenuNm("설문조사");
		} else if (request.getRequestURI().contains("/web/content.do")) { // 컨텐츠
			if (commandMap.get("proFn") != null) {
				MenuManageVO tempMenuManageVO = new MenuManageVO();
				tempMenuManageVO.setSearchCondition("proFn");
				tempMenuManageVO.setAuthorCode((String) commandMap.get("proFn"));
				MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO);
				loginLog.setProgrmFileNm((String) commandMap.get("proFn"));
				if (resultVO != null) {
					loginLog.setMenuNm(resultVO.getMenuNm());
				}
			}
		} else if (commandMap.get("bbsId") != null) { // 나머지 모든 게시판
			MenuManageVO tempMenuManageVO = new MenuManageVO();
			tempMenuManageVO.setSearchKeyword((String) commandMap.get("bbsId"));
			tempMenuManageVO.setSearchCondition("bbsId");
			MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO);
			loginLog.setProgrmFileNm((String) commandMap.get("bbsId"));
			if (resultVO != null) {
				loginLog.setMenuNm(resultVO.getMenuNm());
			}
		} else {
			loginLog.setProgrmFileNm(null);
		}

		// 사용자 방문수 insert
		{
//        	if(null == loginLogService.selectLoginUserLog(loginLog)){  //오늘날짜의 IP조회
			SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyyMMdd", Locale.KOREA);
			Date currentTime = new Date();
			String mTime = mSimpleDateFormat.format(currentTime);
			HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
					.getRequest();
			String ip = req.getHeader("X-FORWARDED-FOR");
			if (ip == null) {
				ip = req.getRemoteAddr();
			}

			loginLog.setLoginIp(ip);
			loginLog.setCreatDt(mTime);
			loginLog.setLoginMthd("I"); // 로그인:I, 로그아웃:O
			loginLog.setErrOccrrAt("N");
			loginLog.setErrorCode("");
			loginLog.setUserAt("U");

			Object obj = EgovUserDetailsHelper.getAuthenticatedUser();

			if (obj != null && !"anonymousUser".equals(obj)) {
				LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
				loginLog.setLoginId(loginVO.getId());
			} else {
				loginLog.setLoginId("");
			}

			if (isMobile(request)) {
				loginLog.setDeviceType("M");
			} else {
				loginLog.setDeviceType("P");
			}

			if (null != request.getQueryString() && !"".equals(request.getQueryString())) {
				loginLog.setUrl(request.getRequestURI() + "?" + request.getQueryString());
			} else {
				loginLog.setUrl(request.getRequestURI());
			}
			// loginLogService.logInsertLoginLog(loginLog);

			loginLogService.logInsertLoginLogNewStep1(loginLog);
//        	}

			// 오늘 접속 / 최종접속
//        	LoginLog footerLog = new LoginLog();
//        	footerLog = loginLogService.selectLogCnt(footerLog);
//        	model.addAttribute("footerLog", footerLog);

		}
//        model.addAttribute("loginLog", loginLog);
		MenuManageVO resultVO = new MenuManageVO();
		MenuManageVO tempMenuManageVO = new MenuManageVO();
		tempMenuManageVO.setSearchCondition("Y");
		setViewMenu(request, commandMap, tempMenuManageVO, resultVO, menuManageVO);
		
		model.addAttribute("menuManageVO", menuManageVO);
		
		model.addAttribute("satisVO", egovCmmUseService.selectSatis());
		
		
		return "web/com/webCommonFooter";
	}

	/**
	 * 사용자 만족도 관리/매뉴 담당자 가져오기
	 */
	@RequestMapping(value = "/web/com/webSatisCommonFooter.do")
	public String siteWebSatisCommonFooter(@RequestParam Map<String, Object> commandMap, HttpServletRequest request,
			ModelMap model, Model model2) throws Exception {

		MenuManageVO tempMenuManageVO = new MenuManageVO();

		String url = request.getRequestURI();
		String AuthorCode = "ROLE_ANONYMOUS"; // 해당 푸터는 데코레이트에서 */web/*만 타므로 무조건 사용자 메뉴이다.
		if (request.getRequestURI().contains("/web/content.do")) {
			tempMenuManageVO.setSearchCondition("proFn");
			tempMenuManageVO.setAuthorCode(AuthorCode);
			tempMenuManageVO.setSearchKeyword((String) commandMap.get("proFn"));
			url += "?proFn=" + commandMap.get("proFn");
		} else if (commandMap.get("bbsId") != null) {
			tempMenuManageVO.setSearchKeyword((String) commandMap.get("bbsId"));
			tempMenuManageVO.setSearchCondition("bbsId");
			tempMenuManageVO.setAuthorCode(AuthorCode);
			url += "?" + commandMap.get("bbsId");
		} else {
			String tempUrl = request.getRequestURI();
			ComDefaultVO searchVO = new ComDefaultVO();
			searchVO.setSearchKeyword(tempUrl);
			ProgrmManageVO progrmManageVO = progrmManageService.selectProgrmUrl(searchVO);
			if (null != progrmManageVO) {
				tempMenuManageVO.setSearchCondition("Y");
				tempMenuManageVO.setSearchKeyword(progrmManageVO.getProgrmFileNm());
			}
		}
		MenuManageVO resultVO = menuManageService.selectMenuManage_Satis(tempMenuManageVO);
		model.addAttribute("resultVO", resultVO);
		model.addAttribute("url", url);
		return "web/com/webSatisCommonFooter";
	}

	/**
	 * 사용자 footer
	 */
	@RequestMapping(value = "/{siteId}/web/com/webThemeCommonFooter.do")
	public String webThemeCommonFooter(@PathVariable("siteId") String siteId,
			@RequestParam Map<String, Object> commandMap, HttpServletRequest request, ModelMap model) throws Exception {

		LoginLog loginLog = new LoginLog();
		if (request.getRequestURI().contains("/web/main/mainPage.do")) { // 사용자 메인
			loginLog.setProgrmFileNm("mainPage");
			loginLog.setMenuNm("사용자메인");
		} else if (request.getRequestURI().contains("/web/survey/surveyList")) { // 설문조사
			loginLog.setProgrmFileNm("surveyList");
			loginLog.setMenuNm("설문조사");
		} else if (request.getRequestURI().contains("/web/content.do")) { // 컨텐츠
			if (commandMap.get("proFn") != null) {
				MenuManageVO tempMenuManageVO = new MenuManageVO();
				tempMenuManageVO.setSearchCondition("proFn");
				tempMenuManageVO.setAuthorCode((String) commandMap.get("proFn"));
				MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO);
				loginLog.setProgrmFileNm((String) commandMap.get("proFn"));
				if (resultVO != null) {
					loginLog.setMenuNm(resultVO.getMenuNm());
				}
			}
		} else if (commandMap.get("bbsId") != null) { // 나머지 모든 게시판

			MenuManageVO tempMenuManageVO = new MenuManageVO();
			tempMenuManageVO.setSearchKeyword((String) commandMap.get("bbsId"));
			tempMenuManageVO.setSearchCondition("bbsId");
			/*
			 * ComDefaultVO searchVO = new ComDefaultVO();
			 * searchVO.setSearchCondition("bbsId");
			 * searchVO.setSearchKeyword((String)commandMap.get("bbsId"));
			 */ MenuManageVO resultVO = menuManageService.selectMenuManage(tempMenuManageVO);
			loginLog.setProgrmFileNm((String) commandMap.get("bbsId"));
			if (resultVO != null) {
				loginLog.setMenuNm(resultVO.getMenuNm());
			}
		} else {
			loginLog.setProgrmFileNm(null);
		}

		// 사용자 방문수 insert
		{
			if (loginLog.getProgrmFileNm() != null) { // 미리보기 경우가 아닌경우
				SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyyMMdd", Locale.KOREA);
				Date currentTime = new Date();
				String mTime = mSimpleDateFormat.format(currentTime);
				HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
						.getRequest();
				String ip = req.getHeader("X-FORWARDED-FOR");
				if (ip == null) {
					ip = req.getRemoteAddr();
				}

				loginLog.setLoginIp(ip);
				loginLog.setCreatDt(mTime);
				loginLog.setLoginMthd("I"); // 로그인:I, 로그아웃:O
				loginLog.setErrOccrrAt("N");
				loginLog.setErrorCode("");
				loginLog.setUserAt("U");
				loginLog.setLoginId(""); // connnect_id
				if (isMobile(request)) {
					loginLog.setDeviceType("M");
				} else {
					loginLog.setDeviceType("P");
				}
				loginLogService.logInsertLoginLog(loginLog);
			}

		}
		model.addAttribute("loginLog", loginLog);
		model.addAttribute("siteId", siteId);
		String siteFolder = "site/" + siteId;

		if (siteId.equals("linc") || siteId.equals("klc")) {
			return "web/" + siteFolder + "/com/webCommonFooter";
		} else {
			SiteManagerVO siteManagerVO = new SiteManagerVO();
			siteManagerVO.setSiteId(siteId);
			setSiteinfo(siteManagerVO, model, request);
			// return
			// "web/site/theme_"+siteManagerVO.getTheme()+"/"+siteManagerVO.getIsMobile()+"/com/webCommonFooter";
			return "web/site/" + siteId + "/" + siteManagerVO.getIsMobile() + "/com/webCommonFooter";
		}
	}

	/* 모바일접속 유무 */
	private boolean isMobile(HttpServletRequest request) {
		String userAgent = request.getHeader("user-agent");
		boolean mobile1 = userAgent.matches(
				".*(iPhone|iPod|Android|Windows CE|BlackBerry|Symbian|Windows Phone|webOS|Opera Mini|Opera Mobi|POLARIS|IEMobile|lgtelecom|nokia|SonyEricsson).*");
		boolean mobile2 = userAgent.matches(".*(LG|SAMSUNG|Samsung).*");
		if (mobile1 || mobile2) {
			return true;
		}
		return false;
	}

	/* 최초 사이트 체크와 동시에 session 설정, 점검중 페이지 적용 */
	@RequestMapping(value = "/com/firstSiteCheck.do")
	public String firstSiteCheck(@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
			HttpServletRequest request, @RequestParam Map<String, Object> commandMap, ModelMap model) throws Exception {

		// 로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
				? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
				: null;
		String userAuthority = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority());

		// 권한별 메뉴표시
		if (!userAuthority.equals("ROLE_ADMIN")
				/* && !userAuthority.equals("ROLE_ADR_ADMIN") */
				&& userAuthority != "") {
			menuManageVO.setAuthorCode(userAuthority);
		} else if (userAuthority.equals("ROLE_ADMIN") || userAuthority.equals("ROLE_ADR_ADMIN")) {
			menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		} else {
			menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		}
		// 대국민, 조정위원일 경우 원뎁스 메뉴에 대시보드 링크를 걸기위해 권한 넘겨줌
		model.addAttribute("auth", menuManageVO.getAuthorCode());

		menuManageVO.setMenuUserType(menuManageVO.getMenuUserType());
		List<MenuManageJTreeVO> menuResultList = menuCreateManageService.selectMenuListJtreeWeb(menuManageVO);

		List<String> menuTwoExist = new ArrayList<>(); // 2뎁스의 하위 매뉴가 있는것 조회
		HashSet<String> underMenuEmpty = new HashSet<String>(); // 2뎁스의 하위매뉴 없는것 조회
		for (MenuManageJTreeVO menuManage : menuResultList) {
			if (menuManage.getDepths().equals("3")) {
				menuTwoExist.add(menuManage.getUpperMenuId());
			}

			if (menuManage.getDepths().equals("2")) {
				underMenuEmpty.add(menuManage.getMenuNo());
			}
		}

		HashSet<String> underMenuExist = new HashSet<String>(menuTwoExist); // 하위매뉴가 있는것
		underMenuEmpty.removeAll(underMenuExist); // 하위매뉴가 없는것

		MenuManageJTreeVO menuManageTopVO = new MenuManageJTreeVO();
		menuManageTopVO.setUpperMenuId("#");
		menuManageTopVO.setMenuNo("0");

		model.addAttribute("menuResultList", menuResultList);
		model.addAttribute("underMenuExist", underMenuExist);
		model.addAttribute("underMenuEmpty", underMenuEmpty);

		// 자신의 위치 정보
		List<MenuManageJTreeVO> menuCurrentResultList = new ArrayList<MenuManageJTreeVO>(); // 자신의 위치
		MenuManageVO resultVO = new MenuManageVO();
		MenuManageVO tempMenuManageVO = new MenuManageVO();
		tempMenuManageVO.setSearchCondition("Y");
		setViewMenu(request, commandMap, tempMenuManageVO, resultVO, menuManageVO);
		menuCurrentResultList = menuCreateManageService.selectMenuListCurrentJtreeWeb(menuManageVO);
		Collections.reverse(menuCurrentResultList); // 타이틀 역순을 위해
		model.addAttribute("menuCurrentResultList", menuCurrentResultList);

//		SiteManagerVO siteManagerVO = new SiteManagerVO();
		// 점검중 페이지 체크
//		siteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO);
//		if("Y".equals(siteManagerVO.getInspFlag() )){ //점검중
//			return "web/com/insp";
//		}
		// SSO 토큰 유효시간 timeout 시 메인페이지로 이동
//		if(!"".equals(request.getSession().getAttribute("SsoLogout"))) {
//			if(request.getSession().getAttribute("SsoLogout") != null) {
//				request.removeAttribute("SsoLogout");
//				return "redirect:/";
//			}
//		}
//		model.addAttribute("siteManagerVO", siteManagerVO);
		return "web/com/webLayout";
	}

	/* 사이트 체크 유무 */
	@RequestMapping(value = "/{siteId}/web/siteCheck.do")
	private String siteCheck(@PathVariable("siteId") String siteId, SiteManagerVO siteManagerVO,
			HttpServletRequest request, RedirectAttributes redirectAttributes) {

		int totCnt = 0;
		siteManagerVO.setSiteId(siteId);
		try {
			totCnt = egovSiteManagerService.selectSiteManagerListTotCnt(siteManagerVO);
		} catch (Exception e) {
			System.out.println("Exception Occured!!!");
		}

		if (totCnt == 0) {
			return "web/com/alert_site";

			/*
			 * redirectAttributes.addFlashAttribute("message", "등록된 사이트가 없습니다.");
			 * RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/blank"); return
			 * redirectUrlMaker.getRedirectUrl();
			 */
		} else {
			return "blank";
		}
		// return "web/main/mainPage";
	}

	/**
	 * 사용자 페이지의 네비 상단 매뉴
	 */
	@RequestMapping(value = "/web/com/naviWrap.do")
	public String siteWebCommonNaviWrap(@RequestParam Map<String, Object> commandMap, HttpServletRequest request,
			@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, ModelMap model) throws Exception {

		// 전자조정 시작
		// 아래 처리중 중간네비 메뉴 조회를 위해 with recurseive 중첩절을 쓰는 쿼리가 있음으로, 큐브리드 쿼리화 필요

		// 로그인 권한 정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
				? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
				: null;
		String auth = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority());

		if (auth.equals("")) {

			auth = "ROLE_ANONYMOUS";

		}

		// 현재 로그인한 권한으로 셋팅해준다.
		menuManageVO.setAuthorCode(auth);

		// 자신의 위치 정보
		List<MenuManageJTreeVO> menuCurrentResultList = new ArrayList<MenuManageJTreeVO>(); // 자신의 위치
		List<MenuManageJTreeVO> menuLeftResultList = new ArrayList<MenuManageJTreeVO>(); // 자신이 속한 위치
		MenuManageVO resultVO = new MenuManageVO();
		MenuManageVO tempMenuManageVO = new MenuManageVO();
		tempMenuManageVO.setSearchCondition("Y");
		setViewMenu(request, commandMap, tempMenuManageVO, resultVO, menuManageVO);

		menuCurrentResultList = menuCreateManageService.selectMenuListCurrentJtreeWeb(menuManageVO);
		// 최상단 매뉴 가져오기 : 상단 그림 변화
		menuLeftResultList = menuCreateManageService.selectMenuLeftListJtreeWeb(menuManageVO);

		List<MenuManageJTreeVO> showOneDepthMenu = new ArrayList<MenuManageJTreeVO>();
		List<MenuManageJTreeVO> showTwoDepthMenu = new ArrayList<MenuManageJTreeVO>();

		for (MenuManageJTreeVO tempLeftMenu : menuLeftResultList) {
			if (tempLeftMenu.getDepths().equals("2")) {
				for (MenuManageJTreeVO tempCurrentTwoMenu : menuCurrentResultList) {
					if (tempLeftMenu.getUpperMenuId().equals(tempCurrentTwoMenu.getMenuNo())) {
						showTwoDepthMenu.add(tempLeftMenu);
					}
				}
			}

		}

		menuManageVO.setAuthorCode(auth);
		menuManageVO.setMenuUserType(menuManageVO.getMenuUserType());
		List<MenuManageJTreeVO> menuResultList = menuCreateManageService.selectMenuListJtreeWeb(menuManageVO);
		for (MenuManageJTreeVO tempResultVo : menuResultList) { // 1 뎁스
			if (tempResultVo.getDepths().equals("1")) {
				showOneDepthMenu.add(tempResultVo);
			}
		}

//    	model.addAttribute("topMenuId", topMenuId); 
//    	model.addAttribute("subMenuFile", subMenuFile);
//    	model.addAttribute("pozNmText", pozNmText);
//    	
//		model.addAttribute("menuText", menuText);

		model.addAttribute("showOneDepthMenu", showOneDepthMenu);
		model.addAttribute("showTwoDepthMenu", showTwoDepthMenu);

//    	model.addAttribute("showThreeDepthMenu", showThreeDepthMenu);
//    	model.addAttribute("showFourDepthMenu", showFourDepthMenu);
//    	model.addAttribute("menuUnderResultList", menuUnderResultList);  //하단매뉴

		model.addAttribute("menuCurrentResultList", menuCurrentResultList);
		model.addAttribute("menuLeftResultList", menuLeftResultList);

//		model.addAttribute("menuResultList", menuResultList);

		// 아래 처리중 중간네비 메뉴 조회를 위해 with recurseive 중첩절을 쓰는 쿼리가 있음으로, 큐브리드 쿼리화 필요
		// 전자조정 종료

		return "web/com/webCommonNaviWrap";

	}

	/**
	 * 사용자 좌측 매뉴
	 */
	@RequestMapping(value = "/web/com/leftMenu.do")
	public String webCommonLeftMenu(HttpServletRequest request,
			@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, ModelMap model,
			@RequestParam Map<String, Object> commandMap) throws Exception {

		// 로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
				? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
				: null;
		String userAuthority = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority());

		// 권한별 메뉴표시
		if (!userAuthority.equals("ROLE_ADMIN") && userAuthority != "") {
			menuManageVO.setAuthorCode(userAuthority);
		} else if (userAuthority.equals("ROLE_ADMIN")) {
			menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		} else {
			menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		}

		// 자신의 위치 정보
		List<MenuManageJTreeVO> menuCurrentResultList = new ArrayList<MenuManageJTreeVO>();
		List<MenuManageJTreeVO> whereAmIList = new ArrayList<MenuManageJTreeVO>();
		MenuManageVO resultVO = new MenuManageVO();
		MenuManageVO tempMenuManageVO = new MenuManageVO();
		tempMenuManageVO.setSearchCondition("Y");
		setViewMenu(request, commandMap, tempMenuManageVO, resultVO, menuManageVO);
		menuCurrentResultList = menuCreateManageService.selectMenuListCurrentJtreeWebCustom(menuManageVO);
		MenuManageJTreeVO whereAmIVO = new MenuManageJTreeVO();
		if (menuCurrentResultList != null && menuCurrentResultList.size() > 0) {
			whereAmIVO = menuCurrentResultList.get(0);
			whereAmIVO.setAuthorCode(menuManageVO.getAuthorCode());
			whereAmIList = menuCreateManageService.selectMenuListJtreeWebCustom(whereAmIVO);
		}
		
		List<Map<String, Object>> depth2CntList = new ArrayList<Map<String, Object>>();
		for(MenuManageJTreeVO tmpVO : whereAmIList.stream().filter(t -> "2".equals(t.getDepth())).collect(Collectors.toList())) {
			Map<String, Object> depth2Cnt = new HashMap<String, Object>();
			Integer tmpInt = 0;
			tmpInt = (int) whereAmIList.stream().filter(t -> 
											t.getDepth().equals("3")
											&& tmpVO.getMenuNo().equals(t.getUpperMenuId())
										).count();
			depth2Cnt.put("menuNo", tmpVO.getMenuNo());
			depth2Cnt.put("cnt", tmpInt);
			
			depth2CntList.add(depth2Cnt);
		}
		
		model.addAttribute("depth2CntList", depth2CntList);
		
		model.addAttribute("whereAmIVO", whereAmIVO);
		MenuManageJTreeVO whereAmIVO_dep2 = new MenuManageJTreeVO();
		if (whereAmIList != null && whereAmIList.size() > 0) {
			whereAmIVO_dep2 = whereAmIList.stream().filter(t -> 
											menuManageVO.getMenuNo().equals(t.getMenuNo())
										).findFirst().get();
			
			if("2".equals(whereAmIVO_dep2.getDepth())) {
				model.addAttribute("whereAmIVO_dep2", whereAmIVO_dep2.getMenuNo());
			}else {
				model.addAttribute("whereAmIVO_dep2", whereAmIVO_dep2.getUpperMenuId());
			}
		}
		model.addAttribute("whereAmIList", whereAmIList);

		List<MenuManageJTreeVO> menuResultList = menuCreateManageService.selectMenuListJtreeWeb(menuManageVO);

		model.addAttribute("menuResultList", menuResultList);

		return "web/com/webCommonLeftMenu";
	}

	private void setSiteinfo(SiteManagerVO siteManagerVO, ModelMap model, HttpServletRequest request) throws Exception {
		SiteManagerVO tempSiteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO);
		if (tempSiteManagerVO != null) {
			siteManagerVO.setIsMobile("pc");
			siteManagerVO.setTheme(tempSiteManagerVO.getTheme());
			siteManagerVO.setSiteNm(tempSiteManagerVO.getSiteNm());
		} else {
			siteManagerVO.setTheme("01");
			siteManagerVO.setSiteNm("타이틀");
		}
		WebUtil util = new WebUtil();
		if (util.isMobile(request)) {
			siteManagerVO.setIsMobile("mobile");
		}
		model.addAttribute("siteId", siteManagerVO.getSiteId());
		model.addAttribute("siteNm", siteManagerVO.getSiteNm());
		// model.addAttribute("site_path" ,
		// "/site/theme_"+siteManagerVO.getTheme()+"/"+siteManagerVO.getIsMobile());
		model.addAttribute("site_path", "/site/" + siteManagerVO.getSiteId() + "/" + siteManagerVO.getIsMobile());
	}

	/*
	 * @RequestMapping(value="/{siteId}/web/siteMap.do") public String
	 * siteMap(@PathVariable("siteId") String siteId, @RequestParam Map<String,
	 * Object> commandMap, HttpServletRequest
	 * request, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO,
	 * ModelMap model) throws Exception {
	 * 
	 * model.addAttribute("siteId", siteId); String siteFolder = "site/"+siteId ;
	 * 
	 * model.addAttribute("site_path", "/"+siteFolder); return
	 * "web/"+siteFolder+"/member/sitemap";
	 * 
	 * }
	 */

	// 사이트맵 개발
	@RequestMapping(value = "/{siteId}/web/siteMap.do")
	public String siteMap(@PathVariable("siteId") String siteId, @RequestParam Map<String, Object> commandMap,
			HttpServletRequest request, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, ModelMap model)
			throws Exception {

		menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		menuManageVO.setMenuUserType(menuManageVO.getMenuUserType());
		// List<MenuManageJTreeVO> menuResultList =
		// menuCreateManageService.selectMenuListJtree(menuManageVO) ;
		menuManageVO.setSiteId(siteId);
		List<MenuManageJTreeVO> menuResultList = menuCreateManageService.selectMenuListJtreeWeb(menuManageVO);

		List<String> menuTwoExist = new ArrayList<>(); // 2뎁스의 하위 매뉴가 있는것 조회
		HashSet<String> underMenuEmpty = new HashSet<String>(); // 2뎁스의 하위매뉴 없는것 조회
		for (MenuManageJTreeVO menuManage : menuResultList) {
			if (menuManage.getDepths().equals("3")) {
				menuTwoExist.add(menuManage.getUpperMenuId());
			}

			if (menuManage.getDepths().equals("2")) {
				underMenuEmpty.add(menuManage.getMenuNo());
			}
		}

		HashSet<String> underMenuExist = new HashSet<String>(menuTwoExist); // 하위매뉴가 있는것
		underMenuEmpty.removeAll(underMenuExist); // 하위매뉴가 없는것

		MenuManageJTreeVO menuManageTopVO = new MenuManageJTreeVO();
		menuManageTopVO.setUpperMenuId("#");
		menuManageTopVO.setMenuNo("0");

		model.addAttribute("menuResultList", menuResultList);
		model.addAttribute("underMenuExist", underMenuExist);
		model.addAttribute("underMenuEmpty", underMenuEmpty);
		model.addAttribute("siteId", siteId);
		String siteFolder = "site/" + siteId;
		model.addAttribute("site_path", "/" + siteFolder);

		// 샘플테마사용시 고정 이미지 가져오기
		SiteManagerVO siteManagerVO = new SiteManagerVO();
		siteManagerVO.setSiteId(siteId);
		siteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO);
		if (!"".equals(siteManagerVO.getTheme()) && null != siteManagerVO.getTheme()) {
			model.addAttribute("siteManagerVO", siteManagerVO);
		}
		return "web/" + siteFolder + "/member/sitemap";
	}

	/**
	 * 사용자 페이지의 네비 상단 매뉴
	 */
	@RequestMapping(value = "/{siteId}/web/com/naviWrapAjax.do")
	public String ajaxSiteWebCommonNaviWrap(@PathVariable("siteId") String siteId,
			@RequestParam Map<String, Object> commandMap, HttpServletRequest request,
			@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, ModelMap model) throws Exception {

		// 자신의 위치 정보
		List<MenuManageJTreeVO> menuCurrentResultList = new ArrayList<MenuManageJTreeVO>(); // 자신의 위치
		List<MenuManageJTreeVO> menuLeftResultList = new ArrayList<MenuManageJTreeVO>(); // 자신이 속한 위치
		List<MenuManageJTreeVO> menuUnderResultList = new ArrayList<MenuManageJTreeVO>(); // 한단계 하위 위치
		MenuManageVO resultVO = new MenuManageVO();
		MenuManageVO tempMenuManageVO = new MenuManageVO();
		tempMenuManageVO.setSearchCondition("Y");

		setViewMenu(request, commandMap, tempMenuManageVO, resultVO, menuManageVO);

		menuCurrentResultList = menuCreateManageService.selectMenuListCurrentJtreeWeb(menuManageVO);
		// 최상단 매뉴 가져오기 : 상단 그림 변화
		menuLeftResultList = menuCreateManageService.selectMenuLeftListJtreeWeb(menuManageVO);
		menuUnderResultList = menuCreateManageService.selectMenuUnderListJtreeWeb(menuManageVO);

		List<MenuManageJTreeVO> showOneDepthMenu = new ArrayList<MenuManageJTreeVO>();
		List<MenuManageJTreeVO> showTwoDepthMenu = new ArrayList<MenuManageJTreeVO>();
		List<MenuManageJTreeVO> showThreeDepthMenu = new ArrayList<MenuManageJTreeVO>();
		List<MenuManageJTreeVO> showFourDepthMenu = new ArrayList<MenuManageJTreeVO>();

		for (MenuManageJTreeVO tempLeftMenu : menuLeftResultList) {
			if (tempLeftMenu.getDepths().equals("2")) {
				for (MenuManageJTreeVO tempCurrentTwoMenu : menuCurrentResultList) {
					if (tempLeftMenu.getUpperMenuId().equals(tempCurrentTwoMenu.getMenuNo())) {
						showTwoDepthMenu.add(tempLeftMenu);
					}
				}
			}

			if (tempLeftMenu.getDepths().equals("3")) {
				for (MenuManageJTreeVO tempCurrentThreeMenu : menuCurrentResultList) {
					if (tempLeftMenu.getUpperMenuId().equals(tempCurrentThreeMenu.getMenuNo())) {
						showThreeDepthMenu.add(tempLeftMenu);
					}
				}
			}

			if (tempLeftMenu.getDepths().equals("4")) {
				for (MenuManageJTreeVO tempCurrentThreeMenu : menuCurrentResultList) {
					if (tempLeftMenu.getUpperMenuId().equals(tempCurrentThreeMenu.getMenuNo())) {
						showFourDepthMenu.add(tempLeftMenu);
					}
				}
			}

		}

		menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		menuManageVO.setMenuUserType(menuManageVO.getMenuUserType());
		List<MenuManageJTreeVO> menuResultList = menuCreateManageService.selectMenuListJtreeWeb(menuManageVO);
		for (MenuManageJTreeVO tempResultVo : menuResultList) { // 1 뎁스
			if (tempResultVo.getDepths().equals("1")) {
				showOneDepthMenu.add(tempResultVo);
			}
		}

		model.addAttribute("showOneDepthMenu", showOneDepthMenu);
		model.addAttribute("showTwoDepthMenu", showTwoDepthMenu);
		model.addAttribute("showThreeDepthMenu", showThreeDepthMenu);
		model.addAttribute("showFourDepthMenu", showFourDepthMenu);
		model.addAttribute("menuUnderResultList", menuUnderResultList); // 하단매뉴

		model.addAttribute("menuCurrentResultList", menuCurrentResultList);
		model.addAttribute("menuLeftResultList", menuLeftResultList);
		model.addAttribute("menuResultList", menuResultList);

		model.addAttribute("siteId", siteId);
		String siteFolder = "site/" + siteId;
		model.addAttribute("site_path", "/" + siteFolder);

		return "web/" + siteFolder + "/com/webCommonNaviWrapAjax";
	}

	/* 메일전송 첨부파일등록/수정 view */
	@RequestMapping(value = "/kcc/mail/itnSendMailForm.do")
	public String intSendMailForm(@RequestParam Map<?, ?> commandMap, @ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO,
			HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes,
			Model model, HttpSession session) throws Exception {

		List<FmsFileVO> fmsFileList = new ArrayList<FmsFileVO>();
		model.addAttribute("fmsFileList", fmsFileList); // fms파일정보
		List<FmsFileVO> fileList = new ArrayList<>();
		model.addAttribute("fileList", fileList);
		return "uss/ion/fms/ItnSendMailForm";
	}

	/* 메일전송 process */
	@RequestMapping(value = "/kcc/mail/itnSendMailPro.do")
	public ModelAndView insertFmsFileOrg(@RequestParam Map<?, ?> commandMap,
			@ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO, final MultipartHttpServletRequest multiRequest,
			HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		String recipient = Globals_email_toEmail; // 받는 사람의 메일주소를 입력해주세요.
		Properties props = System.getProperties(); // SMTP 서버 정보 설정
		props.put("mail.smtp.host", Globals_email_host);
		props.put("mail.smtp.port", Globals_email_port);
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.ssl.enable", "true");
		props.put("mail.smtp.ssl.trust", Globals_email_host);

		Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { // Session 생성
			protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
				return new javax.mail.PasswordAuthentication(Globals_email_fromUser, Globals_email_fromEmail_password);
			}
		});

		// 테스트용
		String revRecipient = (String) commandMap.get("emailAddrRev");

		try {
			Message message = new MimeMessage(session); // MimeMessage 생성
			message.setFrom(new InternetAddress(Globals_email_fromEmail)); // 발신자 셋팅 , 보내는 사람의 이메일주소를 한번 더 입력합니다. 이때는
																			// 이메일 풀 주소를 다 작성해주세요.
			message.setRecipient(Message.RecipientType.TO, new InternetAddress(revRecipient)); // 수신자셋팅
			message.addRecipient(Message.RecipientType.BCC, new InternetAddress(Globals_email_toEmail_BCC)); // 숨은참조자
			message.setSubject((String) commandMap.get("subject")); // 제목셋팅

			// 메일 내용을 설정을 위한 클래스를 설정합니다.
			message.setContent(new MimeMultipart());
			// 메일 내용을 위한 Multipart클래스를 받아온다. (위 new MimeMultipart()로 넣은 클래스입니다.)
			Multipart multipart = (Multipart) message.getContent();
			// html 형식으로 본문을 작성해서 바운더리에 넣습니다.

			StringBuffer contentBf = new StringBuffer();
			contentBf.append("<작성자 메일주소 >: " + (String) commandMap.get("emailAddr"));
			contentBf.append("\r\n");
			contentBf.append("\r\n");
			contentBf.append("\r\n");
			contentBf.append("<내용> ");
			contentBf.append("\r\n");
			contentBf.append((String) commandMap.get("content"));
			multipart.addBodyPart(getContents(contentBf.toString()));

			/* 파일등록 */
			List<FileVO> result = null;
			String uploadFolder = "";
			final Map<String, MultipartFile> files = multiRequest.getFileMap();
			FileVO vo = null;
			String realFileLoc = "";
			if (!files.isEmpty()) {
				result = fileUtil.parseFileInf(files, "MAIL_", 0, "", uploadFolder, "");

				Iterator<FileVO> iter = result.iterator();
				while (iter.hasNext()) {
					vo = iter.next();
					realFileLoc = vo.getFileStreCours() + vo.getStreFileNm();
					// addMulitAttachment(multipart , "C:"+realFileLoc , vo.getOrignlFileNm());
					addMulitAttachment(multipart, realFileLoc, vo.getOrignlFileNm());
				}
				if (vo == null) {
				} else {
				}
			}
			Transport.send(message);
		} catch (Exception e) {
			System.out.println("file Exception Error");
		}
		return modelAndView;
	}

	@RequestMapping(value = "/web/kccadr/kccadrCom/kccadrConstantsJsp.do")
	public String kccadrConstantsJsp() throws Exception {

		return "web/kccadr/kccadrCom/kccadrConstantsJsp";
	}

	/**
	 * 사용자 퀵 매뉴
	 */
	@RequestMapping(value = "/web/com/quickWrap.do")
	public String webCommonQuickMenu(ModelMap model) throws Exception {

		return "web/com/webCommonQuickMenu";
	}

	/**
	 * 사용자 좌측 매뉴
	 */
	@RequestMapping(value = "/web/com/subVisual.do")
	public String webCommonSubVisual(HttpServletRequest request,
			@ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, ModelMap model,
			@RequestParam Map<String, Object> commandMap) throws Exception {

		// 로그인 권한정보 불러오기
		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
				? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
				: null;
		String userAuthority = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority());

		if (!userAuthority.equals("ROLE_ADMIN") && userAuthority != "") {
			menuManageVO.setAuthorCode(userAuthority);
		} else if (userAuthority.equals("ROLE_ADMIN")) {
			menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		} else {
			menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		}

		// 자신의 위치 정보
		List<MenuManageJTreeVO> menuCurrentResultList = new ArrayList<MenuManageJTreeVO>();
		List<MenuManageJTreeVO> whereAmIList = new ArrayList<MenuManageJTreeVO>();
		MenuManageVO resultVO = new MenuManageVO();
		MenuManageVO tempMenuManageVO = new MenuManageVO();
		tempMenuManageVO.setSearchCondition("Y");
		setViewMenu(request, commandMap, tempMenuManageVO, resultVO, menuManageVO);
		menuCurrentResultList = menuCreateManageService.selectMenuListCurrentJtreeWebCustom(menuManageVO);
		MenuManageJTreeVO whereAmIVO = new MenuManageJTreeVO();
		if (menuCurrentResultList != null && menuCurrentResultList.size() > 0) {
			whereAmIVO = menuCurrentResultList.get(0);
			whereAmIVO.setAuthorCode(menuManageVO.getAuthorCode());
			whereAmIList = menuCreateManageService.selectMenuListJtreeWebCustom(whereAmIVO);
		}
		model.addAttribute("whereAmIVO", whereAmIVO);

		return "web/com/webCommonSubVisual";
	}

	// 다수의 파일 첨부 파일을 로컬로 부터 읽어와서 BodyPart 클래스로 만든다. (바운더리 변환)
	private void addMulitAttachment(Multipart multipart, String realFileLoc, String filename)
			throws MessagingException {
		try {
			DataSource source = new FileDataSource(realFileLoc);
			BodyPart messageBodyPart = new MimeBodyPart();
			messageBodyPart.setDataHandler(new DataHandler(source));
			messageBodyPart.setFileName(MimeUtility.encodeText(filename)); // 한글깨짐방지
			multipart.addBodyPart(messageBodyPart);
		} catch (UnsupportedEncodingException e) {
			System.out.println("UnsupportedEncodingException Occured!!!");
		}
	}

	// 메일의 본문 내용 설정
	private BodyPart getContents(String html) throws MessagingException {
		BodyPart mbp = new MimeBodyPart();
		mbp.setText(html); // setText를 이용할 경우 일반 텍스트 내용으로 설정된다.
		// html 형식으로 설정(줄개행 > br로)
		// mbp.setContent(html.replaceAll("(\r\n|\n)", "<br />"), "text/html;
		// charset=utf-8"); //줄바꿈이 필요해서
		return mbp;
	}
	
	private void menuDepth2ChildCnt(List<MenuManageJTreeVO> menuResultList) {
		List<MenuManageJTreeVO> list = new ArrayList<MenuManageJTreeVO>(menuResultList.stream().filter(t -> "2".equals(t.getDepths())).collect(Collectors.toList())); 
		for(MenuManageJTreeVO tmpVO : list) {
			tmpVO.setChildMenuCnt(
									new Long(menuResultList.stream()
																.filter( t ->
																			tmpVO.getMenuNo().equals(t.getUpperMenuId())
																		)
																.count()
											).intValue()
								);
		}
	}
	
	/**
	* @methodName    : mainzone
	* @author        : JunHo Lee
	* @date        : 2024.10.10
	* @description : 
	* @return
	*/
	private EgovMap mainzone(){
		/** EgovPropertyService.sample */
		MainzoneVO mainzoneVO = new MainzoneVO();
		mainzoneVO.setPageUnit(propertiesService.getInt("pageUnit"));
		mainzoneVO.setPageSize(propertiesService.getInt("pageSize"));

		CmmUtil.getPageing(mainzoneVO, 10);
		/** pageing */
		mainzoneVO.setUseYn("Y"); // 사용하는것만
		mainzoneVO.setDeviceType("P"); // PC
		List<EgovMap> mainzoneList = new ArrayList<>();
		try {
			mainzoneList = (List<EgovMap>)egovPopupManageService.selectMainzoneList(mainzoneVO);
		} catch (Exception e) {
		} // 상단메인 이미지
		if(mainzoneList.size() > 0) {
			mainzoneList.sort(Comparator.comparing((EgovMap map) -> Integer.valueOf(((BigDecimal) map.get("sort")).intValue())));
		}
		return mainzoneList.stream().findFirst().orElse(null); 
	}
	
	/**
	* @methodName    : Popup
	* @author        : JunHo Lee
	* @date        : 2024.10.10
	* @description : 
	* @return
	*/
	private List<?> Popup(){
		PopupManageVO popupManageVO = new PopupManageVO();
		popupManageVO.setRecordCountPerPage(10); // 10개만
		popupManageVO.setNtceAt("Y"); // 사용만
		popupManageVO.setMainPageFlag("Y"); // 메인화면의 용도(시작일 종료일 사이 조회)
		List<?> popupList = new ArrayList<>();
		try {
			popupList = egovPopupManageService.selectPopupMainList(popupManageVO);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return popupList;
	}
	
	/**
	* @methodName    : popupzone
	* @author        : JunHo Lee
	* @date        : 2024.10.10
	* @description : 
	* @return
	*/
	private EgovMap popupzone(){
		/** 알림창괸리 */
		PopupzoneVO popupzoneVo = new PopupzoneVO();
		popupzoneVo.setFirstIndex(0);
		popupzoneVo.setSeCd("02"); // 좌측팝업
		popupzoneVo.setUseYn("Y");
		popupzoneVo.setSearchSortCnd("MB.sort");
		popupzoneVo.setSearchSortOrd("ASC");

		List<EgovMap> popupzoneList = new ArrayList<>();
		try {
			popupzoneList = (List<EgovMap>)egovPopupManageService.selectPopupzoneList(popupzoneVo);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		if(popupzoneList.size() > 0) {
			popupzoneList.sort(Comparator.comparing((EgovMap map) -> Integer.valueOf(((BigDecimal) map.get("sort")).intValue())));
		}
		return popupzoneList.stream().findFirst().orElse(null);
	}
	
	/**
	* @methodName    : banner
	* @author        : JunHo Lee
	* @date        : 2024.10.10
	* @description : 
	* @return
	*/
	private List<?> banner(){
		BannerVO bannerVO = new BannerVO();
		bannerVO.setFirstIndex(0);
		bannerVO.setRecordCountPerPage(999);
		
		List<BannerVO> bannerList = new ArrayList<>();
		try {
			bannerList = egovBannerService.selectBannerList(bannerVO);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return bannerList;
	}
	
	
	/**
	* @methodName    : popupList
	* @author        : JunHo Lee
	* @date        : 2024.10.17
	* @description : 
	* @return
	*/
	private List<?> popupList(){
		PopupManageVO popupManageVO = new PopupManageVO();
		popupManageVO.setRecordCountPerPage(10);  //10개만
		popupManageVO.setNtceAt("Y");  //사용만
		popupManageVO.setMainPageFlag("Y") ; //메인화면의 용도(시작일 종료일 사이 조회)
		List<?> popupList = new ArrayList<>();
		try {
			popupList = egovPopupManageService.selectPopupMainList(popupManageVO);
		} catch (Exception e) {
		}
		return popupList;
	}
	
	/**
	* @methodName    : setViewMenu
	* @author        : JunHo Lee
	* @date        : 2024.10.17
	* @description : 
	* @param request
	* @param commandMap
	* @param tempMenuManageVO
	* @param resultVO
	* @param menuManageVO
	* @throws Exception
	*/
	private void setViewMenu(HttpServletRequest request, Map<String, Object> commandMap, MenuManageVO tempMenuManageVO,
			MenuManageVO resultVO, MenuManageJTreeVO menuManageVO) throws Exception {
		if (request.getRequestURI().contains("/web/survey_back")) {// 설문조사(각 사이트 마다 이름이 달라) survey > survey_back 으로 사용한
			tempMenuManageVO.setSearchKeyword("surveyList");
		} else if (request.getRequestURI().contains("schdlr")) { // 스케줄러 경우(일,월,년 url이 달라
			tempMenuManageVO.setSearchKeyword("schdlrManage");
		} else if (null != (String) commandMap.get("proFn") || null != (String) commandMap.get("bbsId")
				|| null != (String) commandMap.get("nttId")) { // 컨텐츠 타입, 게시판 타입의 경우
			if (null != (String) commandMap.get("proFn")) { // 컨텐츠
				tempMenuManageVO.setSearchKeyword((String) commandMap.get("proFn"));
			} else if (null != (String) commandMap.get("bbsId")) { // 게시판
				ComDefaultVO searchVO = new ComDefaultVO();
				String url = progrmManageService.getBbsUrlByNttId((String) commandMap.get("bbsId"));

				searchVO.setSearchKeyword(url);
				ProgrmManageVO progrmManageVO = progrmManageService.selectProgrmUrl(searchVO);
				if (null != progrmManageVO) {
					tempMenuManageVO.setSearchKeyword(progrmManageVO.getProgrmFileNm());
				}
			} else { // nttId 통합검색시

				BoardVO tempBoardVO = new BoardVO();
				tempBoardVO.setNttId(Integer.parseInt((String) commandMap.get("nttId")));
				BoardMasterVO bmVO = bbsAttrbService.selectBbsIdByNttId(tempBoardVO);
				ComDefaultVO searchVO = new ComDefaultVO();
				String url = progrmManageService.getBbsUrlByNttId(bmVO == null ? "" : bmVO.getBbsId());

				searchVO.setSearchKeyword(url);
				ProgrmManageVO progrmManageVO = progrmManageService.selectProgrmUrl(searchVO);
				if (null != progrmManageVO) {
					tempMenuManageVO.setSearchKeyword(progrmManageVO.getProgrmFileNm());
				}

			}
		} else { // ajax 로 검색시
					// 일반 프로그램시
			if (commandMap.get("url") != null) {
				String menuUrl = request.getRequestURI();
				if (menuUrl.equals("/web/cop/org/selectOrgDetail.do")) {
					menuUrl = "/web/cop/org/selectOrgList.do";
				} 
				/* 메뉴에 표시되는 방법 */
				else if (menuUrl.equals("/web/kccadr/adjstExpDetail/adjstReqStatusDetail.do") // 체험하기
						|| menuUrl.equals("/web/kccadr/adjstExp/adjstIncidentList.do")
						|| menuUrl.equals("/web/kccadr/adjstExpDetail/adjstIncidentEndDetail.do")) { // 체험하기
					menuUrl = "/web/kccadr/adjstExp/adjstExpMainPage.do";
				}
				/* 분쟁조정 상담 > 무료법률 상담 */
				else if(menuUrl.contains("/web/user/lawCounsel/case/02/159/")) {
					menuUrl = "/web/user/lawCounsel/case/02/159/step01.do";
				}
				/* 분쟁조정 신청 > 분쟁조정 신청하기 */
				else if(
						menuUrl.contains("/web/user/news/case/01/341/")
						) {
					menuUrl = "/web/user/news/case/01/341/newsList.do";
				}
				else if(
						menuUrl.contains("/web/user/mediation/case/")
						&& menuUrl.contains("mediationStep")
						&& menuUrl.contains(".do")
						) {
					menuUrl = "/web/user/mediation/case/01/154/mediationApp.do";
				}
				/*자주하는 질문 > (기타)절차종결 관련 질문*/
				else if(
						menuUrl.contains("/web/user/bbs/case/3/300/")
						) {
					menuUrl = "/web/user/bbs/case/3/300/bbsDataList.do";
				}
				/*분쟁조정 신청조회*/
				else if(
						menuUrl.contains("/web/user/mediation/case/02/155/")
						|| menuUrl.contains("/web/user/mediation/case/03/155/")
						) {
					menuUrl = "/web/user/mediation/case/01/155/checkMediationStep01.do";
				}
				

				// 상세화면 URL로 메뉴화면 매핑이 안되어, 문자열 치환으로 매핑...
				String strUrl = menuUrl/* .replace("Info", "List") */
						.replace("Detail", "List")
						/* .replace("Regist", "List") */
						.replace("Article", "List").replace("Inqire", "List").replace("addFcltMgr", "fcltMgrList")
						.replace("mainzoneModify", "mainzoneList");
				menuUrl = strUrl;

				ComDefaultVO searchVO = new ComDefaultVO();
				searchVO.setSearchKeyword(menuUrl);
				ProgrmManageVO progrmManageVO = progrmManageService.selectProgrmUrl(searchVO);
				if (null != progrmManageVO) {
					tempMenuManageVO.setSearchKeyword(progrmManageVO.getProgrmFileNm());
				}
			} else { // 조직도 상세
				String menuUrl = request.getRequestURI();
				if (menuUrl.equals("/web/cop/org/selectOrgDetail.do")) {
					menuUrl = "/web/cop/org/selectOrgList.do";
					ComDefaultVO searchVO = new ComDefaultVO();
					searchVO.setSearchKeyword(menuUrl);
					ProgrmManageVO progrmManageVO = progrmManageService.selectProgrmUrl(searchVO);
					if (null != progrmManageVO) {
						tempMenuManageVO.setSearchKeyword(progrmManageVO.getProgrmFileNm());
					}
				}
			}
		}

		if (!"dir".equals(tempMenuManageVO.getSearchKeyword())) {
			resultVO = menuManageService.selectMenuManage(tempMenuManageVO);
		}

		// menuManageVO.setAuthorCode("ROLE_ANONYMOUS");
		if (resultVO != null) {
			menuManageVO.setMenuNo(resultVO.getMenuNo() + "");
		}
	}
}
