package itn.let.lett.web;

import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;

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

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
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 org.springframework.web.servlet.support.RequestContextUtils;

import egovframework.rte.fdl.idgnr.EgovIdGnrService;
import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.LoginVO;
import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.EgovDoubleSubmitHelper;
import itn.com.cmm.util.RedirectUrlMaker;
import itn.com.cmm.util.StringUtil;
import itn.com.uss.ion.fms.service.FmsFileService;
import itn.com.uss.ion.fms.service.FmsFileVO;
import itn.let.lett.service.CateConfVO;
import itn.let.lett.service.HashConfVO;
import itn.let.lett.service.LetterService;
import itn.let.lett.service.LetterVO;
import itn.let.mjo.msgagent.service.MjonMsgAgentStsService;
import itn.let.mjo.msgagent.service.MjonMsgAgentStsVO;
import itn.let.sym.ccm.cde.service.CateCode;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.UserDefaultVO;

@Controller
public class LetterController {

	/** userManageService */
	@Resource(name = "userManageService")
	private EgovUserManageService userManageService;
	
	@Resource(name = "LetterService")
    private LetterService letterService;

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

    @Resource(name="egovMessageSource")
    EgovMessageSource egovMessageSource;
    
	@Resource(name = "fmsFileService")
	private FmsFileService fmsFileService;
    
	@Resource(name="EgovFileMngUtil")
	private EgovFileMngUtil fileUtil;
	 
	@Resource(name="EgovFileMngService")
    private EgovFileMngService fileMngService;
	
	@Resource(name = "egovFmsFileGnrService")
    private EgovIdGnrService idgenService;
	
	/** 첨부파일 저장경로 */
	@Value("#{globalSettings['Globals.file.saveDir']}")
	private String fileSaveDir;
    
	@Resource(name = "mjonMsgAgentStsService")
	private MjonMsgAgentStsService mjonMsgAgentStsService;
	
	
    
	//카테고리 배열 정의{"컬럼순차번호, 컬럼이름, 컬럼내용, 컬럼이름에 붙여야할 내용(엑셀코드양식다운로드시 필요)"}
	private String[][] categoryExcelValue ={
	    {"0" ,"번호" , "1" , "" },
	    {"1", "카테고리 타입" , "ITN" , "[코드]"}, 
	    {"2", "카테고리 이름" , "선거", "[코드]"}, 
	    {"3", "순서" , "1", ""}, 
	    {"4", "사용 유무" , "사용", ""}, 
	    {"5", "등록일" ,"2019-10-31", ""}
	} ;
	
	//해쉬태그 배열 정의{"컬럼순차번호, 컬럼이름, 컬럼내용, 컬럼이름에 붙여야할 내용(엑셀코드양식다운로드시 필요)"}
	private String[][] hashTagExcelValue ={
	    {"0" ,"번호" , "1" , "" },
	    {"1", "해쉬테그 이름" , "ITN" ,""}, 
	    {"2", "순서" , "1", ""}, 
	    {"3", "사용 유무" , "사용", ""}, 
	    {"4", "등록일" ,"2019-10-31", ""}
	} ;
		
	/**
	 * 
	 * 단문/장문 문자 목록 화면
	 * @param userSearchVO 검색조건정보
	 * @param model 화면모델
	 * @return letter/messages/letterMessagesList
	 * @throws Exception
	 */
	@RequestMapping("/letter/messages/letterMessagesList.do")
	public String letterMessagesList(@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
		ModelMap model, 
		HttpServletRequest request,
		HttpSession session) throws Exception {
		
		Map<String, ?> flashMap =RequestContextUtils.getInputFlashMap(request);
        
        if(flashMap!=null && flashMap.get("userSearchVO") != null) {
        	userSearchVO = (UserDefaultVO)flashMap.get("userSearchVO");
        }
		
		if(userSearchVO.getPageUnit() != 10) {
			userSearchVO.setPageUnit(userSearchVO.getPageUnit());
		}

		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(userSearchVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(userSearchVO.getPageUnit());
		paginationInfo.setPageSize(userSearchVO.getPageSize());

		userSearchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		userSearchVO.setLastIndex(paginationInfo.getLastRecordIndex());
		userSearchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		//userSearchVO.setAdminYn("Y");
		if("".equals(userSearchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			userSearchVO.setSearchSortCnd("regdate");
			userSearchVO.setSearchSortOrd("desc");
		}
		if("".equals(userSearchVO.getSearchDiv()) || userSearchVO.getSearchDiv() == null){
			userSearchVO.setSearchDiv("S");
		}
		
		//2뎁스(상위카테고리) selectbox 검색 시 
		if(!"".equals(userSearchVO.getSearchTwoDptCategoryCode())) {
			userSearchVO.setSearchCategoryCode(userSearchVO.getSearchTwoDptCategoryCode());
		}
		//3뎁스(상위카테고리) selectbox 검색 시 		
		if(!"".equals(userSearchVO.getSearchThrDptCategoryCode())) {
			userSearchVO.setSearchCategoryCode(userSearchVO.getSearchThrDptCategoryCode());
		}
		
		//List<?> resultList = userManageService.selectUserList(userSearchVO) ;
		List<?> resultList = letterService.selectLetterMessageList(userSearchVO);
		
		model.addAttribute("resultList", resultList);
		paginationInfo.setTotalRecordCount( resultList.size()> 0 ? ((Long)((EgovMap)resultList.get(0)).get("totCnt")).intValue() : 0);
		model.addAttribute("paginationInfo", paginationInfo);

    	//카테고리 미리만들기 selectbox 미리 만들기
		CateCode cateCode = new CateCode();
		//일반 카테고리(맞춤X)만 조회
		cateCode.setCateType("N");
    	List<CateCode> cateCodeList = letterService.selectCateCodeTwoDptWithList(cateCode);
    	model.addAttribute("cateCodeList", cateCodeList);
		
		return "letter/messages/LetterMessageList";
	}
	
	/**
	 * 단문/장문 문자 등록 화면
	 * 
	 * @param 
	 * @param 
	 * @return letter/messages/letterMessagesRegist
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/messages/letterMessagesRegist.do")
	public String letterMessagesRegist(
			LetterVO letterVO,
			CateCode cateCode,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		// 권한 체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		// 그림문자 카테고리 리스트 불러오기
		List<CateCode> cateCodeList = letterService.selectPhotoCateCodeWithList(cateCode);
		model.addAttribute("cateCodeList", cateCodeList);	
		
		return "letter/messages/LetterMessageRegist";
		
	}
	
	/**
	 * 단문/장문 문자 데이터 디비 입력 처리
	 * 
	 * @param 
	 * @param 
	 * @return letter/messages/letterMessagesList
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/messages/insertLetterMessages.do")
	public String insertLetterMessages(
			LetterVO letterVO,
			CateCode cateCode,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		//권한체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		//카테고리 뎁스 정보 불러오기
		String depth1 = commandMap.get("cateCodeDepth_01").toString();
		String depth2 = commandMap.get("cateCodeDepth_02").toString();
		String depth3 = commandMap.get("cateCodeDepth_03").toString();
		
		//카테고리 최종 코드 번호 저장 2 뎁스 혹은 3뎁스 번호를 저장함
		if(depth3.length() > 0) {
			
			letterVO.setCategoryCode(depth3);
			
		}else{
			
			letterVO.setCategoryCode(depth2);
			
		}
		
		//장/단문 메세지 내용 저장하기
		String resultSts = letterService.insertLetterMessages(letterVO);
		
		letterVO.setLetterId(resultSts);
		
		//우선순위 변경
    	if(!"".equals(letterVO.getPriNum()) && letterVO.getPriNum() != null) {
    		String[] tmpArray = {letterVO.getLetterId()};
    		
    		letterVO.setChkIds(tmpArray);
    		letterVO.setChkIdsSize(tmpArray.length);
    		//1. 설정하고자 하는 우선순위를 포함한 뒷 우선순위들을 우선순위 + 체크한 리스트 크기만큼 증가시키기
        	int cnt = letterService.updateChkAfterPriorityPlus(letterVO);
        	//2. 체크한 리스트들 우선순위 업데이트
        	cnt += letterService.updateChkListPriority(letterVO);
        	//3. 그림문자 전체 우선순위 빈값없이 정렬하기
        	cnt += letterService.updateOrderByPriority(letterVO);
        	//4. 우선순위가 null인 값 우선순위 부여
        	cnt += letterService.updateNullPriority(letterVO);
    	}
		
		if(StringUtil.isNotEmpty(resultSts)) {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert"));
			
		}else {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.insert"));
			
		}
		
		return "redirect:/letter/messages/letterMessagesList.do";
		
	}
	
	
	/**
	 * 단문/장문 문자 삭제후 목록조회 화면으로 이동한다.
	 * @param checkedIdForDel 삭제대상아이디 정보
	 * @param userSearchVO 검색조건
	 * @param model 화면모델
	 * @return forward:/letter/messages/letterMessagesList.do
	 * @throws Exception
	 */
	@RequestMapping("/letter/messages/letterMessageDelete.do")
	public String letterMessageDelete(@RequestParam("checkedIdForDel") String checkedIdForDel, 
			@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
			RedirectAttributes redirectAttributes, 
			Model model) throws Exception {
		
		if (!EgovDoubleSubmitHelper.checkAndSaveToken("someKey")) {  
			return "redirect:/letter/messages/letterMessagesList.do";
		}	
		
		// 미인증 사용자에 대한 보안처리
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
    	if(!isAuthenticated) {
    		model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
        	return "uat/uia/EgovLoginUsr";
    	}

    	// 단문/장문 문자 삭제 - USE_YN 값을 'N'으로 변경함
    	letterService.deleteLetterMessage(checkedIdForDel);
    	
    	redirectAttributes.addFlashAttribute("userSearchVO", userSearchVO);
		
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
		if(userSearchVO.getGnrlUser().equals("N")) {
			RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/letter/messages/letterMessagesList.do");
			return redirectUrlMaker.getRedirectUrl();
		}
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/letter/messages/letterMessagesList.do");
		return redirectUrlMaker.getRedirectUrl();
	}
	
	/**
	 * 단문/장문 문자 데이터 디비 상세화면 이동
	 * 
	 * @param 
	 * @param 
	 * @return letter/messages/letterMessagesDetail
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/messages/letterMessagesDetail.do")
	public String letterMessagesDetail(
			@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
			LetterVO letterVO,
			CateCode cateCode,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		//권한체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		// 그림문자 카테고리 리스트 불러오기
		List<CateCode> cateCodeList = letterService.selectPhotoCateCodeWithList(cateCode);
		model.addAttribute("cateCodeList", cateCodeList);
		
		//등록된 카테고리 정보 불러오기
    	List<CateCode> cateCodeRegList = new ArrayList<CateCode>();
    	String cateCodeId = commandMap.get("cateCodeId").toString();
    	cateCodeRegList = letterService.selectPhotoCateCodeListWithId(cateCodeId);
    	
    	model.addAttribute("cateCodeRegList", cateCodeRegList);
		
		String letterId = commandMap.get("selectedId").toString();
		
		letterVO.setLetterId(letterId);
		
		//장/단문 메세지 내용 저장하기
		LetterVO result = new LetterVO();
		result = letterService.letterMessagesDetail(letterVO);
		
		model.addAttribute("result", result);
		
		return "letter/messages/LetterMessageDetail";
		
	}
	
	
	/**
	 * 단문/장문 문자 데이터 수정 처리
	 * 
	 * @param 
	 * @param 
	 * @return /letter/messages/updateLetterMessages.do
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/messages/updateLetterMessages.do")
	public String updateLetterMessages(
			LetterVO letterVO,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model,
			UserDefaultVO userSearchVO,
			RedirectAttributes rttr) throws Exception {
		
		//권한체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		//카테고리 뎁스 정보 불러오기
		String depth1 = commandMap.get("cateCodeDepth_01").toString();
		String depth2 = commandMap.get("cateCodeDepth_02").toString();
		String depth3 = commandMap.get("cateCodeDepth_03").toString();
		
		//카테고리 최종 코드 번호 저장 2 뎁스 혹은 3뎁스 번호를 저장함
		if(depth3.length() > 0) {
			
			letterVO.setCategoryCode(depth3);
			
		}else{
			
			letterVO.setCategoryCode(depth2);
			
		}
		
		//장/단문 메세지 내용 수정하기
		int result = letterService.updateLetterMessages(letterVO);
		
		//우선순위 변경
    	if(!"".equals(letterVO.getPriNum()) && letterVO.getPriNum() != null) {
    		String[] tmpArray = {letterVO.getLetterId()};
    		
    		letterVO.setChkIds(tmpArray);
    		letterVO.setChkIdsSize(tmpArray.length);
    		//1. 설정하고자 하는 우선순위를 포함한 뒷 우선순위들을 우선순위 + 체크한 리스트 크기만큼 증가시키기
        	int cnt = letterService.updateChkAfterPriorityPlus(letterVO);
        	//2. 체크한 리스트들 우선순위 업데이트
        	cnt += letterService.updateChkListPriority(letterVO);
        	//3. 그림문자 전체 우선순위 빈값없이 정렬하기
        	cnt += letterService.updateOrderByPriority(letterVO);
        	//4. 우선순위가 null인 값 우선순위 부여
        	cnt += letterService.updateNullPriority(letterVO);
    	}
		
		if(result > 0) {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
			
		}else {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.update"));
			
		}
		
		rttr.addFlashAttribute("userSearchVO", userSearchVO);
		
		return "redirect:/letter/messages/letterMessagesList.do";
		
	}
	
	/**
	 * 그림 문자 등록화면
	 * 
	 * @param 
	 * @param 
	 * @return /letter/photo/letterPhotoList.do
	 * @param model 화면모델
	 * @throws Exception
	 */
    @RequestMapping(value="/letter/photo/letterPhotosRegist.do")
    public String letterPhotosRegist(CateCode cateCode, Model model, @ModelAttribute("userSearchVO") UserDefaultVO userSearchVO) throws Exception  {
    	
    	//카테고리 미리만들기 selectbox 미리 만들기
		List<CateCode> cateCodeList = letterService.selectPhotoCateCodeWithList(cateCode);
		model.addAttribute("cateCodeList", cateCodeList);	
		
    	return "letter/photo/LetterPhotoRegist";
    } 
    
	/**
	 * 그림 문자 등록 프로세스
	 * 
	 * @param 
	 * @param 
	 * @return /letter/photo/letterPhotoList.do
	 * @param model 화면모델
	 * @throws Exception
	 */
    @RequestMapping(value="/letter/photo/insertletterPhotosAjax.do")
    public ModelAndView insertletterPhotos(@RequestParam Map<?, ?> commandMap, 
    		@ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO,
    		@ModelAttribute("fileVO") FileVO fileVO,
    		LetterVO letterVO,
            RedirectAttributes redirectAttributes, 
			final MultipartHttpServletRequest multiRequest,
			HttpServletRequest request)
            throws Exception  {
    	
    	ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	
		try {
			List<FileVO> result = null;
	    	String atchFileId = fmsFileVO.getFmsImageFile(); //수정일때
	    	String isThumbFile = "";
	    	final Map<String, MultipartFile> files = multiRequest.getFileMap();
	    	String KeyStr = "PHO_";
	    	
	    	if(!files.isEmpty()) {
	    		
	    		//카테고리 뎁스 정보 불러오기
	    		String depth1 = commandMap.get("cateCodeDepth_01").toString();
	    		String depth2 = commandMap.get("cateCodeDepth_02").toString();
	    		String depth3 = commandMap.get("cateCodeDepth_03").toString();
	    		
	    		//그림문자 일반
	    		if(depth1.equals("13000")) {
	    			
	    			// 일반문자
	    			letterVO.setMemberType("P");
	    			
	    		}else if(depth1.equals("15000")) { // 기업 기업문자
	    			
	    			letterVO.setMemberType("B");
	    			
	    		}else {
	    			
	    			letterVO.setMemberType("C");
	    			
	    		}
	    		
	    		//카테고리 최종 코드 번호 저장 2 뎁스 혹은 3뎁스 번호를 저장함
	    		if(depth3.length() > 0) {
	    			
	    			letterVO.setCategoryCode(depth3);
	    			
	    		}else{
	    			
	    			letterVO.setCategoryCode(depth2);
	    			
	    		}
	    		
	    		//문자 타입 입력
	    		
	    		//그림문자 일반
	    		if(depth1.equals("11000")) {
	    			
	    			// 맞춤제작문자
	    			letterVO.setLetterType("C");
	    			
	    		}else {
	    			//일반그림문자
	    			letterVO.setLetterType("P");
	    			
	    		}
	    		
	    		
	    		
	    		if ("".equals(atchFileId)){ // 첨부 이미지 등록
	    			
	    			String imagePath = "";
	    			Date now = new Date();
	    			SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMdd");
	    			String fdlDate = formatDate.format(now);
	    			
	    			
	    			//로컬 과 개발서버의 이미지 저장 경로 분기처리
	    			if(request.getServerName().equals("localhost")) {
	    				
	    				imagePath = fileSaveDir + "src/main/webapp/mjon/MMS/" + fdlDate;
	    				
	    			}else {
	    				
	    				/*imagePath = "/usr/local/tomcat_mjon/webapps/mjon/MMS/" + fdlDate;*/
	    				imagePath = fileSaveDir+"/file/MMS/" + fdlDate;
	    				
	    			}
	    			
	    			//별도 이미지 저장 함수로 파일 처리함
	    			result = fileUtil.parseImageFileInf(files, KeyStr, 0, atchFileId , imagePath, isThumbFile);
		    		atchFileId = fileMngService.insertFileInfs(result);
		    		FileVO vo = null;
					Iterator<FileVO> iter = result.iterator();
					while (iter.hasNext()) {
						vo = iter.next();
						letterVO.setOrignlFileNm(vo.getOrignlFileNm());
						letterVO.setAttachFileId(vo.getAtchFileId());
					}
	    		}
	    		
	    	}
	    	
	    	//그림문자 내용 입력
    		String resultSts = letterService.insertletterPhotosInfo(letterVO);
			
    		letterVO.setLetterId(resultSts);
    		
    		//우선순위 변경
	    	if(!"".equals(letterVO.getPriNum()) && letterVO.getPriNum() != null) {
	    		String[] tmpArray = {letterVO.getLetterId()};
	    		
	    		letterVO.setChkIds(tmpArray);
	    		letterVO.setChkIdsSize(tmpArray.length);
	    		//1. 설정하고자 하는 우선순위를 포함한 뒷 우선순위들을 우선순위 + 체크한 리스트 크기만큼 증가시키기
	        	int cnt = letterService.updateChkAfterPriorityPlus(letterVO);
	        	//2. 체크한 리스트들 우선순위 업데이트
	        	cnt += letterService.updateChkListPriority(letterVO);
	        	//3. 그림문자 전체 우선순위 빈값없이 정렬하기
	        	cnt += letterService.updateOrderByPriority(letterVO);
	        	//4. 우선순위가 null인 값 우선순위 부여
	        	cnt += letterService.updateNullPriority(letterVO);
	    	}
    		
    		if(StringUtil.isNotEmpty(resultSts)) {
    			
    			modelAndView.addObject("result", "success");
    			
    		}else {
    			
    			modelAndView.addObject("result", "fail");
    			
    		}
		}catch (Exception e) {
			modelAndView.addObject("result", "fail");
		} 
    	
 		return modelAndView;
    } 
    
    /*그림문자 리스트 화면 관리*/
    @RequestMapping(value="/letter/photo/letterPhotosList.do")
    public String letterPhotosList(ModelMap model ,  
    		@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
    		HttpSession session,
    		HttpServletRequest request) throws Exception {
    	
    	Map<String, ?> flashMap =RequestContextUtils.getInputFlashMap(request);
		
		if(flashMap!=null && flashMap.get("userSearchVO") != null) {
			userSearchVO = (UserDefaultVO)flashMap.get("userSearchVO");
		}
    	
    	if(userSearchVO.getPageUnit() != 10) {
			userSearchVO.setPageUnit(userSearchVO.getPageUnit());
		}

		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(userSearchVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(userSearchVO.getPageUnit());
		paginationInfo.setPageSize(userSearchVO.getPageSize());

		userSearchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		userSearchVO.setLastIndex(paginationInfo.getLastRecordIndex());
		userSearchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		//userSearchVO.setAdminYn("Y");
		if("".equals(userSearchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			userSearchVO.setSearchSortCnd("regdate");
			userSearchVO.setSearchSortOrd("desc");
		}
		
		//2뎁스(상위카테고리) selectbox 검색 시 
		if(!"".equals(userSearchVO.getSearchTwoDptCategoryCode())) {
			userSearchVO.setSearchCategoryCode(userSearchVO.getSearchTwoDptCategoryCode());
		}
		//3뎁스(상위카테고리) selectbox 검색 시 		
		if(!"".equals(userSearchVO.getSearchThrDptCategoryCode())) {
			userSearchVO.setSearchCategoryCode(userSearchVO.getSearchThrDptCategoryCode());
		}
		
		List<?> resultList = letterService.selectLetterPhotosList(userSearchVO);
		
		model.addAttribute("resultList", resultList);
		paginationInfo.setTotalRecordCount( resultList.size()> 0 ? ((Long)((EgovMap)resultList.get(0)).get("totCnt")).intValue() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
    	//카테고리 미리만들기 selectbox 미리 만들기
		CateCode cateCode = new CateCode();
		cateCode.setCateType("N");
    	List<CateCode> cateCodeList = letterService.selectCateCodeTwoDptWithList(cateCode);		
    	/*List<CateCode> cateCodeList = letterService.selectPhotoCateCodeWithList(cateCode);*/
    	model.addAttribute("cateCodeList", cateCodeList);			
		
		return "letter/photo/LetterPhotoList";
    }
    
	/**
	 * 그림 문자 삭제후 목록조회 화면으로 이동한다.
	 * @param checkedIdForDel 삭제대상아이디 정보
	 * @param userSearchVO 검색조건
	 * @param model 화면모델
	 * @return forward:/letter/photo/letterPhotosList.do
	 * @throws Exception
	 */
	@RequestMapping("/letter/photo/letterPhotosDelete.do")
	public String letterPhotosDelete(@RequestParam("checkedIdForDel") String checkedIdForDel, 
			@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
			RedirectAttributes redirectAttributes, 
			Model model) throws Exception {
		
		if (!EgovDoubleSubmitHelper.checkAndSaveToken("someKey")) {  
			return "redirect:/letter/photo/letterPhotosList.do";
		}	
		
		// 미인증 사용자에 대한 보안처리
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
    	if(!isAuthenticated) {
    		model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
        	return "uat/uia/EgovLoginUsr";
    	}

    	// 그림문자 문자 삭제 - USE_YN 값을 'N'으로 변경함
    	letterService.deleteLetterPhotos(checkedIdForDel);
    	
    	redirectAttributes.addFlashAttribute("userSearchVO", userSearchVO);
		
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
		if(userSearchVO.getGnrlUser().equals("N")) {
			RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/letter/photo/letterPhotosList.do");
			return redirectUrlMaker.getRedirectUrl();
		}
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/letter/photo/letterPhotosList.do");
		return redirectUrlMaker.getRedirectUrl();
	}
	
    /*그림문자 상세보기 화면*/
    @RequestMapping(value="/letter/photo/letterPhotosDetail.do")
    public String letterPhotosDetail(@RequestParam Map<?, ?> commandMap, 
    		@ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO,
    		CateCode cateCode,
            LetterVO letterVO,
    		HttpServletRequest request, 
            HttpServletResponse response, 
            RedirectAttributes redirectAttributes, 
            Model model, 
            @ModelAttribute("userSearchVO")UserDefaultVO userSearchVO,
            HttpSession session)
            throws Exception  {
    	
    	//카테고리 미리만들기 selectbox 미리 만들기
    	List<CateCode> cateCodeList = letterService.selectPhotoCateCodeWithList(cateCode);
    	model.addAttribute("cateCodeList", cateCodeList);	
    	
    	//등록된 카테고리 정보 불러오기
    	List<CateCode> cateCodeRegList = new ArrayList<CateCode>();
    	String cateCodeId = commandMap.get("cateCodeId").toString();
    	cateCodeRegList = letterService.selectPhotoCateCodeListWithId(cateCodeId);
    	
    	model.addAttribute("cateCodeRegList", cateCodeRegList);
    	
    	letterVO.setLetterId(commandMap.get("selectedId").toString());
    	//그림문자 내용 불러오기
    	LetterVO resultPhotoList = letterService.selectPhotosDetail(letterVO);
    	model.addAttribute("resultPhotoList", resultPhotoList);
    	
    	String attchFileId = resultPhotoList.getAttachFileId();
    	//그림문자 첨부파일 정보 불러오기
    	LetterVO resultFileList = letterService.selectPhotoFileList(attchFileId);
    	
    	model.addAttribute("resultFileList", resultFileList);
    	return "letter/photo/LetterPhotoDetail";
    } 
    
	/* 그림문자 수정 처리  */
	@RequestMapping(value="/letter/photo/updateLetterPhotosAjax.do")
	public ModelAndView updateLetterPhotosAjax(@RequestParam Map<?, ?> commandMap,
			@ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO,
			@ModelAttribute("fileVO") FileVO fileVO,
			LetterVO letterVO,
			final MultipartHttpServletRequest multiRequest,
    		ModelMap model,
			HttpServletRequest request) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			modelAndView.addObject("result", "auth_fail"); //권한없음 팝업창 닫고, 오프너 창 리로드
			return modelAndView;
		}
		try {
			
			//카테고리 뎁스 정보 불러오기
    		String depth1 = commandMap.get("cateCodeDepth_01").toString();
    		String depth2 = commandMap.get("cateCodeDepth_02").toString();
    		String depth3 = commandMap.get("cateCodeDepth_03").toString();
    		
    		//그림문자 일반
    		if(depth1.equals("13000")) {
    			
    			letterVO.setMemberType("P");
    			
    		}else if(depth1.equals("15000")) { // 기업 기업문자
    			
    			letterVO.setMemberType("B");
    			
    		}else {// 맞춤제작문자
    			
    			letterVO.setMemberType("C");
    			
    		}
    		
    		//카테고리 최종 코드 번호 저장 2 뎁스 혹은 3뎁스 번호를 저장함
    		if(depth3.length() > 0) {
    			
    			letterVO.setCategoryCode(depth3);
    			
    		}else{
    			
    			letterVO.setCategoryCode(depth2);
    			
    		}
    		
    		//문자 타입 입력
    		
    		//그림문자 일반
    		if(depth1.equals("11000")) {
    			
    			// 맞춤제작문자
    			letterVO.setLetterType("C");
    			
    		}else {
    			
    			//일반그림문자
    			letterVO.setLetterType("P");
    			
    		}
    		
			List<FileVO> result = null;
	    	String attachFileId = letterVO.getAttachFileId(); //수정일때
	    	String orignlFileNm = letterVO.getOrignlFileNm();
	    	String isThumbFile = "";
	    	final Map<String, MultipartFile> files = multiRequest.getFileMap();
	    	String KeyStr = "PHO_";
	    	
	    	String imagePath = "";
			Date now = new Date();
			SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMdd");
			String fdlDate = formatDate.format(now);
			
			
			//로컬 과 개발서버의 이미지 저장 경로 분기처리
			if(request.getServerName().equals("localhost")) {
				
				imagePath = fileSaveDir + "src/main/webapp" + "/mjon/MMS/" + fdlDate;
				
			}else {
				
				/*imagePath = "/usr/local/tomcat_mjon/webapps/mjon/MMS/" + fdlDate;*/
				imagePath = fileSaveDir+"/file/MMS/" + fdlDate;
				
			}

	    	if (!files.isEmpty()){
	    		if ("".equals(attachFileId)){ //이미지 등록
	    			
	    			result = fileUtil.parseImageFileInf(files, KeyStr, 0, attachFileId , imagePath, isThumbFile);
	    			attachFileId = fileMngService.insertFileInfs(result);
		    		FileVO vo = null;
					Iterator<FileVO> iter = result.iterator();
					while (iter.hasNext()) {
						vo = iter.next();
						orignlFileNm = vo.getOrignlFileNm();
						attachFileId = vo.getAtchFileId();
					}
					if (vo == null) {
					} else {
						
						letterVO.setOrignlFileNm(orignlFileNm);
						letterVO.setAttachFileId(attachFileId);
						
					}
	    		}else{ //파일 업데이트
	    			
	    			FileVO fvo = new FileVO();
					fvo.setAtchFileId(attachFileId);
					int cnt = fileMngService.getMaxFileSN(fvo);
					result = fileUtil.parseImageFileInf(files, KeyStr , cnt, attachFileId, imagePath, isThumbFile);
					fileMngService.updateFileInfs(result);
					
	    		}
	    	}
	    	
	    	//해당 매뉴 DB에 update
	    	int resultUpdateCnt = 0;
	    	if(result != null) { // 첨부파일이 수정되었다면 신규 파일 정보로 업데이트
	    		
	    		letterVO.setAttachFileId(result.get(0).getAtchFileId());
		    	letterVO.setOrignlFileNm(result.get(0).getOrignlFileNm());
		    	resultUpdateCnt = letterService.updateLetterPhotosInfo(letterVO);
	    		
	    	}else { // 첨부파일 수정이 없다면 기존 파일 명으로 업데이트 처리
	    		
	    		letterVO.setAttachFileId(attachFileId);
		    	letterVO.setOrignlFileNm(orignlFileNm);
		    	resultUpdateCnt = letterService.updateLetterPhotosInfo(letterVO);
	    		
	    	}
	    	
	    	//우선순위 변경
	    	if(!"".equals(letterVO.getPriNum()) && letterVO.getPriNum() != null) {
	    		String[] tmpArray = {letterVO.getLetterId()};
	    		
	    		letterVO.setChkIds(tmpArray);
	    		letterVO.setChkIdsSize(tmpArray.length);
	    		//1. 설정하고자 하는 우선순위를 포함한 뒷 우선순위들을 우선순위 + 체크한 리스트 크기만큼 증가시키기
	        	int cnt = letterService.updateChkAfterPriorityPlus(letterVO);
	        	//2. 체크한 리스트들 우선순위 업데이트
	        	cnt += letterService.updateChkListPriority(letterVO);
	        	//3. 그림문자 전체 우선순위 빈값없이 정렬하기
	        	cnt += letterService.updateOrderByPriority(letterVO);
	        	//4. 우선순위가 null인 값 우선순위 부여
	        	cnt += letterService.updateNullPriority(letterVO);
	    	}
	    	
	    	if(resultUpdateCnt > 0) {
	    		
	    		modelAndView.addObject("result", "success");
	    		
	    	}else {
	    		
	    		modelAndView.addObject("result", "fail");
	    		
	    	}
		}catch (Exception e) {
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
	
	
	/**
	 * 맞춤제작 그림 문자 등록화면
	 * 
	 * @param 
	 * @param 
	 * @return /letter/photo/letterPhotoCustomList.do
	 * @param model 화면모델
	 * @throws Exception
	 */
    @RequestMapping(value="/letter/photo/letterPhotosCustomRegist.do")
    public String letterPhotosCustomRegist(CateCode cateCode, Model model) throws Exception  {
    	
    	//카테고리 미리만들기 selectbox 미리 만들기
		List<CateCode> cateCodeList = letterService.selectPhotoCateCodeWithList(cateCode);
		model.addAttribute("cateCodeList", cateCodeList);	
		
    	return "letter/photo/custom/LetterPhotoCustomRegist";
    } 
    
	/**
	 * 맞춤제작 그림 문자 등록 프로세스
	 * 
	 * @param 
	 * @param 
	 * @return /letter/photo/letterPhotoCustomList.do
	 * @param model 화면모델
	 * @throws Exception
	 */
    @RequestMapping(value="/letter/photo/insertletterPhotosCustomAjax.do")
    public ModelAndView insertletterPhotosCustom(@RequestParam Map<?, ?> commandMap, 
    		@ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO,
    		@ModelAttribute("fileVO") FileVO fileVO,
    		LetterVO letterVO,
            RedirectAttributes redirectAttributes, 
			final MultipartHttpServletRequest multiRequest,
			HttpServletRequest request)
            throws Exception  {
    	
    	ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	
		try {
			List<FileVO> result = null;
	    	String atchFileId = fmsFileVO.getFmsImageFile(); //수정일때
	    	String isThumbFile = "";
	    	final Map<String, MultipartFile> files = multiRequest.getFileMap();
	    	String KeyStr = "PHO_";
	    	
	    	if(!files.isEmpty()) {
	    		
	    		//카테고리 뎁스 정보 불러오기
	    		String depth1 = commandMap.get("cateCodeDepth_01").toString();
	    		String depth2 = commandMap.get("cateCodeDepth_02").toString();
	    		String depth3 = commandMap.get("cateCodeDepth_03").toString();
	    		
	    		//그림문자 일반
	    		if(depth1.equals("13000")) {
	    			
	    			// 일반문자
	    			letterVO.setMemberType("P");
	    			
	    		}else if(depth1.equals("15000")) { // 기업 기업문자
	    			
	    			letterVO.setMemberType("B");
	    			
	    		}else {
	    			
	    			letterVO.setMemberType("C");
	    			
	    		}
	    		
	    		//카테고리 최종 코드 번호 저장 2 뎁스 혹은 3뎁스 번호를 저장함
	    		if(depth3.length() > 0) {
	    			
	    			letterVO.setCategoryCode(depth3);
	    			
	    		}else{
	    			
	    			letterVO.setCategoryCode(depth2);
	    			
	    		}
	    		
	    		//문자 타입 입력
	    		
	    		//그림문자 일반
	    		if(depth1.equals("11000")) {
	    			
	    			// 맞춤제작문자
	    			letterVO.setLetterType("C");
	    			
	    		}else {
	    			//일반그림문자
	    			letterVO.setLetterType("P");
	    			
	    		}
	    		
	    		if ("".equals(atchFileId)){ // 첨부 이미지 등록
	    			
	    			String imagePath = "";
	    			Date now = new Date();
	    			SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMdd");
	    			String fdlDate = formatDate.format(now);
	    			
	    			
	    			//로컬 과 개발서버의 이미지 저장 경로 분기처리
	    			if(request.getServerName().equals("localhost")) {
	    				
	    				imagePath = fileSaveDir+"src/main/webapp/MMS/" + fdlDate;
	    				
	    			}else {
	    				/*imagePath = "/usr/local/tomcat_mjon/webapps/mjon/MMS/" + fdlDate;*/
	    				imagePath = fileSaveDir+"/file/MMS/" + fdlDate;
	    				
	    			}
	    			
	    			//별도 이미지 저장 함수로 파일 처리함
	    			result = fileUtil.parseImageFileInf(files, KeyStr, 0, atchFileId , imagePath, isThumbFile);
		    		atchFileId = fileMngService.insertFileInfs(result);
		    		FileVO vo = null;
					Iterator<FileVO> iter = result.iterator();
					while (iter.hasNext()) {
						vo = iter.next();
						letterVO.setOrignlFileNm(vo.getOrignlFileNm());
						letterVO.setAttachFileId(vo.getAtchFileId());
					}
	    		}
	    		
	    	}
	    	
	    	//그림문자 내용 입력
    		String resultSts = letterService.insertletterPhotosInfo(letterVO);
    		
    		letterVO.setLetterId(resultSts);
    		
    		//우선순위 변경
	    	if(!"".equals(letterVO.getPriNum()) && letterVO.getPriNum() != null) {
	    		String[] tmpArray = {letterVO.getLetterId()};
	    		
	    		letterVO.setChkIds(tmpArray);
	    		letterVO.setChkIdsSize(tmpArray.length);
	    		//1. 설정하고자 하는 우선순위를 포함한 뒷 우선순위들을 우선순위 + 체크한 리스트 크기만큼 증가시키기
	        	int cnt = letterService.updateChkAfterPriorityPlus(letterVO);
	        	//2. 체크한 리스트들 우선순위 업데이트
	        	cnt += letterService.updateChkListPriority(letterVO);
	        	//3. 그림문자 전체 우선순위 빈값없이 정렬하기
	        	cnt += letterService.updateOrderByPriority(letterVO);
	        	//4. 우선순위가 null인 값 우선순위 부여
	        	cnt += letterService.updateNullPriority(letterVO);
	    	}
			
    		if(StringUtil.isNotEmpty(resultSts)) {
    			
    			modelAndView.addObject("result", "success");
    			
    		}else {
    			
    			modelAndView.addObject("result", "fail");
    			
    		}
		}catch (Exception e) {
			modelAndView.addObject("result", "fail");
		} 
    	
 		return modelAndView;
    } 
    
    
    /*맞춤제작 그림문자 리스트 화면 관리*/
    @RequestMapping(value="/letter/photo/letterPhotosCustomList.do")
    public String letterPhotosCustomList(ModelMap model ,  
    		@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
    		HttpSession session,
    		HttpServletRequest request) throws Exception {
    	
    	Map<String, ?> flashMap =RequestContextUtils.getInputFlashMap(request);
		
		if(flashMap!=null && flashMap.get("userSearchVO") != null) {
			userSearchVO = (UserDefaultVO)flashMap.get("userSearchVO");
		}
    	
    	if(userSearchVO.getPageUnit() != 10) {
			userSearchVO.setPageUnit(userSearchVO.getPageUnit());
		}

		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(userSearchVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(userSearchVO.getPageUnit());
		paginationInfo.setPageSize(userSearchVO.getPageSize());

		userSearchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		userSearchVO.setLastIndex(paginationInfo.getLastRecordIndex());
		userSearchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		//userSearchVO.setAdminYn("Y");
		if("".equals(userSearchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			userSearchVO.setSearchSortCnd("regdate");
			userSearchVO.setSearchSortOrd("desc");
		}
		
		List<?> resultList = letterService.selectLetterPhotosCustomList(userSearchVO);
		
		model.addAttribute("resultList", resultList);
		paginationInfo.setTotalRecordCount( resultList.size()> 0 ? ((Long)((EgovMap)resultList.get(0)).get("totCnt")).intValue() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
    	//카테고리 미리만들기 selectbox 미리 만들기
		CateCode cateCode = new CateCode();
    	List<CateCode> cateCodeList = letterService.selectPhotoCateCodeWithList(cateCode);
    	model.addAttribute("cateCodeList", cateCodeList);	    	
		
		return "letter/photo/custom/LetterPhotoCustomList";
    }
    
    
    /*마춤제작 그림문자 상세보기 화면*/
    @RequestMapping(value="/letter/photo/letterPhotosCustomDetail.do")
    public String letterPhotosCustomDetail(@RequestParam Map<?, ?> commandMap, 
    		@ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO,
    		CateCode cateCode,
            LetterVO letterVO,
    		HttpServletRequest request, 
            HttpServletResponse response, 
            RedirectAttributes redirectAttributes, 
            Model model, 
            HttpSession session,
            @ModelAttribute("userSearchVO") UserDefaultVO userSearchVO)
            throws Exception  {
    	
    	//카테고리 미리만들기 selectbox 미리 만들기
    	List<CateCode> cateCodeList = letterService.selectPhotoCateCodeWithList(cateCode);
    	model.addAttribute("cateCodeList", cateCodeList);	
    	
    	//등록된 카테고리 정보 불러오기
    	List<CateCode> cateCodeRegList = new ArrayList<CateCode>();
    	String cateCodeId = commandMap.get("cateCodeId").toString();
    	cateCodeRegList = letterService.selectPhotoCateCodeListWithId(cateCodeId);
    	
    	model.addAttribute("cateCodeRegList", cateCodeRegList);
    	
    	letterVO.setLetterId(commandMap.get("selectedId").toString());
    	//그림문자 내용 불러오기
    	LetterVO resultPhotoList = letterService.selectPhotosDetail(letterVO);
    	model.addAttribute("resultPhotoList", resultPhotoList);
    	
    	String attchFileId = resultPhotoList.getAttachFileId();
    	//그림문자 첨부파일 정보 불러오기
    	LetterVO resultFileList = letterService.selectPhotoFileList(attchFileId);
    	
    	model.addAttribute("resultFileList", resultFileList);
    	return "letter/photo/custom/LetterPhotoCustomDetail";
    } 
    
	/* 맞춤제작 그림문자 수정 처리  */
	@RequestMapping(value="/letter/photo/updateLetterPhotosCustomAjax.do")
	public ModelAndView updateLetterPhotosCustom(@RequestParam Map<?, ?> commandMap,
			@ModelAttribute("fmsFileVO") FmsFileVO fmsFileVO,
			@ModelAttribute("fileVO") FileVO fileVO,
			LetterVO letterVO,
			final MultipartHttpServletRequest multiRequest,
    		ModelMap model,
			HttpServletRequest request) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			modelAndView.addObject("result", "auth_fail"); //권한없음 팝업창 닫고, 오프너 창 리로드
			return modelAndView;
		}
		try {
			
			//카테고리 뎁스 정보 불러오기
    		String depth1 = commandMap.get("cateCodeDepth_01").toString();
    		String depth2 = commandMap.get("cateCodeDepth_02").toString();
    		String depth3 = commandMap.get("cateCodeDepth_03").toString();
    		
    		//그림문자 일반
    		if(depth1.equals("13000")) {
    			
    			letterVO.setMemberType("P");
    			
    		}else if(depth1.equals("15000")) { // 기업 기업문자
    			
    			letterVO.setMemberType("B");
    			
    		}else {// 맞춤제작문자
    			
    			letterVO.setMemberType("C");
    			
    		}
    		
    		//카테고리 최종 코드 번호 저장 2 뎁스 혹은 3뎁스 번호를 저장함
    		if(depth3.length() > 0) {
    			
    			letterVO.setCategoryCode(depth3);
    			
    		}else{
    			
    			letterVO.setCategoryCode(depth2);
    			
    		}
    		
    		//문자 타입 입력
    		
    		//그림문자 일반
    		if(depth1.equals("11000")) {
    			
    			// 맞춤제작문자
    			letterVO.setLetterType("C");
    			
    		}else {
    			
    			//일반그림문자
    			letterVO.setLetterType("P");
    			
    		}
    		
			List<FileVO> result = null;
	    	String attachFileId = letterVO.getAttachFileId(); //수정일때
	    	String orignlFileNm = letterVO.getOrignlFileNm();
	    	String isThumbFile = "";
	    	final Map<String, MultipartFile> files = multiRequest.getFileMap();
	    	String KeyStr = "PHO_";
	    	
	    	String imagePath = "";
			Date now = new Date();
			SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMdd");
			String fdlDate = formatDate.format(now);
			
			
			//로컬 과 개발서버의 이미지 저장 경로 분기처리
			if(request.getServerName().equals("localhost")) {
				
				imagePath = fileSaveDir+"src/main/webapp/MMS/" + fdlDate;
				
			}else {
				/*imagePath = "/usr/local/tomcat_mjon/webapps/mjon/MMS/" + fdlDate;*/
				imagePath = fileSaveDir+"/file/MMS/" + fdlDate;
				
			}

	    	if (!files.isEmpty()){
	    		if ("".equals(attachFileId)){ //이미지 등록
	    			
	    			result = fileUtil.parseImageFileInf(files, KeyStr, 0, attachFileId , imagePath, isThumbFile);
	    			attachFileId = fileMngService.insertFileInfs(result);
		    		FileVO vo = null;
					Iterator<FileVO> iter = result.iterator();
					while (iter.hasNext()) {
						vo = iter.next();
						orignlFileNm = vo.getOrignlFileNm();
						attachFileId = vo.getAtchFileId();
					}
					if (vo == null) {
					} else {
						
						letterVO.setOrignlFileNm(orignlFileNm);
						letterVO.setAttachFileId(attachFileId);
						
					}
	    		}else{ //파일 업데이트
	    			
	    			FileVO fvo = new FileVO();
					fvo.setAtchFileId(attachFileId);
					int cnt = fileMngService.getMaxFileSN(fvo);
					result = fileUtil.parseImageFileInf(files, KeyStr , cnt, attachFileId, imagePath, isThumbFile);
					fileMngService.updateFileInfs(result);
					
	    		}
	    	}
	    	
	    	//해당 매뉴 DB에 update
	    	int resultUpdateCnt = 0;
	    	if(result != null) { // 첨부파일이 수정되었다면 신규 파일 정보로 업데이트
	    		
	    		letterVO.setAttachFileId(result.get(0).getAtchFileId());
		    	letterVO.setOrignlFileNm(result.get(0).getOrignlFileNm());
		    	resultUpdateCnt = letterService.updateLetterPhotosInfo(letterVO);
	    		
	    	}else { // 첨부파일 수정이 없다면 기존 파일 명으로 업데이트 처리
	    		
	    		letterVO.setAttachFileId(attachFileId);
		    	letterVO.setOrignlFileNm(orignlFileNm);
		    	resultUpdateCnt = letterService.updateLetterPhotosInfo(letterVO);
	    		
	    	}
	    	
	    	//우선순위 변경
	    	if(!"".equals(letterVO.getPriNum()) && letterVO.getPriNum() != null) {
	    		String[] tmpArray = {letterVO.getLetterId()};
	    		
	    		letterVO.setChkIds(tmpArray);
	    		letterVO.setChkIdsSize(tmpArray.length);
	    		//1. 설정하고자 하는 우선순위를 포함한 뒷 우선순위들을 우선순위 + 체크한 리스트 크기만큼 증가시키기
	        	int cnt = letterService.updateChkAfterPriorityPlus(letterVO);
	        	//2. 체크한 리스트들 우선순위 업데이트
	        	cnt += letterService.updateChkListPriority(letterVO);
	        	//3. 그림문자 전체 우선순위 빈값없이 정렬하기
	        	cnt += letterService.updateOrderByPriority(letterVO);
	        	//4. 우선순위가 null인 값 우선순위 부여
	        	cnt += letterService.updateNullPriority(letterVO);
	    	}
	    	
	    	if(resultUpdateCnt > 0) {
	    		
	    		modelAndView.addObject("result", "success");
	    		
	    	}else {
	    		
	    		modelAndView.addObject("result", "fail");
	    		
	    	}
		}catch (Exception e) {
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
	
	/**
	 * 맞춤제작 그림 문자 삭제후 목록조회 화면으로 이동한다.
	 * @param checkedIdForDel 삭제대상아이디 정보
	 * @param userSearchVO 검색조건
	 * @param model 화면모델
	 * @return forward:/letter/photo/letterPhotosCustomList.do
	 * @throws Exception
	 */
	@RequestMapping("/letter/photo/letterPhotosCustomDelete.do")
	public String letterPhotosCustomDelete(@RequestParam("checkedIdForDel") String checkedIdForDel, 
			@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
			RedirectAttributes redirectAttributes, 
			Model model) throws Exception {
		
		if (!EgovDoubleSubmitHelper.checkAndSaveToken("someKey")) {  
			return "redirect:/letter/photo/letterPhotosCustomList.do";
		}	
		
		// 미인증 사용자에 대한 보안처리
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
    	if(!isAuthenticated) {
    		model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
        	return "uat/uia/EgovLoginUsr";
    	}

    	// 그림문자 문자 삭제 - USE_YN 값을 'N'으로 변경함
    	letterService.deleteLetterPhotos(checkedIdForDel);
    	
    	redirectAttributes.addFlashAttribute("userSearchVO", userSearchVO);
		
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
		if(userSearchVO.getGnrlUser().equals("N")) {
			RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/letter/photo/letterPhotosCustomList.do");
			return redirectUrlMaker.getRedirectUrl();
		}
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/letter/photo/letterPhotosCustomList.do");
		return redirectUrlMaker.getRedirectUrl();
	}
    
	
	
	/**
	 * 
	 * 문자 발송 카테고리 관리 리스트 화면
	 * @param userSearchVO 검색조건정보
	 * @param model 화면모델
	 * @return letter/cateconf/categoryConfList
	 * @throws Exception
	 */
	@RequestMapping("/letter/cateconf/categoryConfList.do")
	public String categoryConfList(@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
		ModelMap model, 
		HttpServletRequest request,
		HttpSession session) throws Exception {
		
		Map<String, ?> flashMap =RequestContextUtils.getInputFlashMap(request);
		
		if(flashMap!=null && flashMap.get("userSearchVO") != null) {
			userSearchVO = (UserDefaultVO)flashMap.get("userSearchVO");
			model.addAttribute("userSearchVO", userSearchVO);
		}
		
		if(userSearchVO.getPageUnit() != 10) {
			userSearchVO.setPageUnit(userSearchVO.getPageUnit());
		}

		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(userSearchVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(userSearchVO.getPageUnit());
		paginationInfo.setPageSize(userSearchVO.getPageSize());

		userSearchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		userSearchVO.setLastIndex(paginationInfo.getLastRecordIndex());
		userSearchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		//userSearchVO.setAdminYn("Y");
		if("".equals(userSearchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			userSearchVO.setSearchSortCnd("regdate");
			userSearchVO.setSearchSortOrd("desc");
		}
		//List<?> resultList = userManageService.selectUserList(userSearchVO) ;
		List<?> resultList = letterService.selectCategoryConfList(userSearchVO);
		
		model.addAttribute("resultList", resultList);
		paginationInfo.setTotalRecordCount(resultList.size()> 0 ? ((Long)((EgovMap)resultList.get(0)).get("totCnt")).intValue() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "letter/cateconf/CateConfList";
	}
	
	/**
	 * 문자 발송 카테고리 관리 등록 화면
	 * 
	 * @param 
	 * @param 
	 * @return letter/cateconf/categoryConfRegist
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/cateconf/categoryConfRegist.do")
	public String categoryConfRegist(
			CateConfVO cateConfVO,
			CateCode cateCode,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		// 권한 체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		// 그림문자 카테고리 리스트 불러오기
		List<CateCode> cateCodeList = letterService.selectPhotoCateCodeWithList(cateCode);
		model.addAttribute("cateCodeList", cateCodeList);	
		
		return "letter/cateconf/CateConfRegist";
		
	}
	
	/**
	 * 문자 발송 카테고리 관리 디비 입력 처리
	 * 
	 * @param 
	 * @param 
	 * @return letter/cateconf/categoryConfList.do
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/cateconf/insertCategoryConf.do")
	public String insertCategoryConf(
			CateConfVO cateConfVO,
			CateCode cateCode,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		//권한체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		//카테고리 뎁스 정보 불러오기
		//String depth1 = commandMap.get("cateCodeDepth_01").toString();
		String depth2 = commandMap.get("cateCodeDepth_02").toString();
		String depth3 = commandMap.get("cateCodeDepth_03").toString();
		
		//카테고리 최종 코드 번호 저장 2 뎁스 혹은 3뎁스 번호를 저장함
		if(depth3.length() > 0) {
			
			cateConfVO.setCategoryCode(depth3);
			
		}else{
			
			cateConfVO.setCategoryCode(depth2);
			
		}
		
		// 카테고리 내용 저장하기
		int result = letterService.insertCategoryConf(cateConfVO);
		
		if(result > 0) {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert"));
			
		}else {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.insert"));
			
		}
		
		return "redirect:/letter/cateconf/categoryConfList.do";
		
	}
	
	/**
	 * 문자 발송 카테고리 관리 상세보기 화면
	 * 
	 * @param 
	 * @param 
	 * @return letter/cateconf/categoryConfDetail
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/cateconf/categoryConfDetail.do")
	public String categoryConfDetail(
			@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
			CateConfVO cateConfVO,
			CateCode cateCode,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		//권한체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		// 그림문자 카테고리 리스트 불러오기
		List<CateCode> cateCodeList = letterService.selectPhotoCateCodeWithList(cateCode);
		model.addAttribute("cateCodeList", cateCodeList);
		
		//등록된 카테고리 정보 불러오기
    	List<CateCode> cateCodeRegList = new ArrayList<CateCode>();
    	String cateCodeId = commandMap.get("cateCodeId").toString();
    	cateCodeRegList = letterService.selectPhotoCateCodeListWithId(cateCodeId);
    	
    	model.addAttribute("cateCodeRegList", cateCodeRegList);
		
		String categoryId = commandMap.get("selectedId").toString();
		
		cateConfVO.setCategoryId(categoryId);
		
		//장/단문 메세지 내용 저장하기
		CateConfVO result = new CateConfVO();
		result = letterService.categoryConfDetail(cateConfVO);
		
		model.addAttribute("result", result);
		
		return "letter/cateconf/CateConfDetail";
		
	}
	
	/**
	 * 문자 발송 카테고리 삭제후 목록조회 화면으로 이동한다.
	 * @param checkedIdForDel 삭제대상아이디 정보
	 * @param userSearchVO 검색조건
	 * @param model 화면모델
	 * @return forward:/letter/cateconf/categoryConfList.do
	 * @throws Exception
	 */
	@RequestMapping("/letter/cateconf/categoryConfDelete.do")
	public String categoryConfDelete(@RequestParam("checkedIdForDel") String checkedIdForDel, 
			@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
			RedirectAttributes redirectAttributes, 
			Model model) throws Exception {
		
		if (!EgovDoubleSubmitHelper.checkAndSaveToken("someKey")) {  
			return "redirect:/letter/cateconf/categoryConfList.do";
		}	
		
		// 미인증 사용자에 대한 보안처리
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
    	if(!isAuthenticated) {
    		model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
        	return "uat/uia/EgovLoginUsr";
    	}

    	// 문자 발송 카테고리 삭제 - 
    	letterService.deleteCategoryConf(checkedIdForDel);
    	
    	redirectAttributes.addFlashAttribute("userSearchVO", userSearchVO);
		
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
		if(userSearchVO.getGnrlUser().equals("N")) {
			RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/letter/cateconf/categoryConfList.do");
			return redirectUrlMaker.getRedirectUrl();
		}
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/letter/cateconf/categoryConfList.do");
		return redirectUrlMaker.getRedirectUrl();
	}
	
	
	/**
	 * 문자 발송 카테고리 수정 처리
	 * 
	 * @param 
	 * @param 
	 * @return /letter/cateconf/categoryConfList.do
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/cateconf/updateCategoryConf.do")
	public String updateCategoryConf(
			UserDefaultVO userSearchVO,
			CateConfVO cateConfVO,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		//권한체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		//카테고리 뎁스 정보 불러오기
		String depth1 = commandMap.get("cateCodeDepth_01").toString();
		String depth2 = commandMap.get("cateCodeDepth_02").toString();
		String depth3 = commandMap.get("cateCodeDepth_03").toString();
		
		//카테고리 최종 코드 번호 저장 2 뎁스 혹은 3뎁스 번호를 저장함
		if(depth3.length() > 0) {
			
			cateConfVO.setCategoryCode(depth3);
			
		}else{
			
			cateConfVO.setCategoryCode(depth2);
			
		}
		
		//문자 발송 카테고리 내용 수정하기
		int result = letterService.updateCategoryConf(cateConfVO);
		
		if(result > 0) {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
			
		}else {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.update"));
			
		}
		
		redirectAttributes.addFlashAttribute("userSearchVO", userSearchVO);
		
		return "redirect:/letter/cateconf/categoryConfList.do";
		
	}
	
	//카테고리 엑셀 다운로드
	@RequestMapping(value="/letter/cateconf/categoryExcelDownload.do")
	public void categoryExcelDownload(UserDefaultVO userSearchVO, 
			HttpServletRequest request, 
			HttpServletResponse response , 
			ModelMap model) throws Exception {
		
		userSearchVO.setRecordCountPerPage(100000);
		userSearchVO.setFirstIndex(0);
		if("".equals(userSearchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			userSearchVO.setSearchSortCnd("categoryId");
			userSearchVO.setSearchSortOrd("ASC");
		}
		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		if(null != loginVO && !"super".equals(loginVO.getSiteId())){
			userSearchVO.setSiteId(loginVO.getSiteId());
		}
		// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
		SXSSFWorkbook wb = new SXSSFWorkbook(100);
		CellStyle style = wb.createCellStyle();
		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
 		style.setBorderLeft(CellStyle.BORDER_THIN);
 		style.setBorderRight(CellStyle.BORDER_THIN);
 		style.setBorderTop(CellStyle.BORDER_THIN);
 		Font font = wb.createFont();
 		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
 		
		Cell cell = null;
		Row row = null;
		
		String fileName ="카테고리 리스트";
		
		String sheetTitle = "";
		try{
			List<?> categorySearchList  = letterService.selectCategoryConfList(userSearchVO) ;
			{ //화면 리스트
				sheetTitle = "카테고리 리스트" ; //제목
				Sheet sheet = wb.createSheet(sheetTitle);
				row = sheet.createRow(0);
		        for(int i=0 ; i < categoryExcelValue.length ; i++) {
	 		       cell = row.createCell(i);
	 		       cell.setCellStyle(style);
		 	       cell.setCellValue(categoryExcelValue[i][1]);
	 		    }
			        
		        for(int i=0; i < categorySearchList.size(); i++){
			    	row = sheet.createRow(i+1);
			    	System.out.println("row  : "+row);
			    	System.out.println("I  : "+i);
			    	for(int j=0 ; j < categoryExcelValue.length ; j++) {
			    		System.out.println("J   :  "+ j);
			        	cell = row.createCell(j);
			        	cell.setCellStyle(style);
			        	if(j==0) {
			        		cell.setCellValue(i+1);																//번호
			        	}
			        	if(j==1) {
			        		String categoryType = "C".equals((String)((EgovMap)categorySearchList.get(i)).get("categoryType")) ? "맞춤제작" : "일반제작";
			        		cell.setCellValue(categoryType);
			        		System.out.println("categoryType   :  "+ categoryType);
			        	}
			        	if(j==2) {
			        		cell.setCellValue((String)((EgovMap)categorySearchList.get(i)).get("categoryNm"));		//카테고리 이름
			        		System.out.println("categoryNm   :  "+ (String)((EgovMap)categorySearchList.get(i)).get("categoryNm"));
			        	}
			        	if(j==3) {
			        		
			        		BigDecimal sort = (BigDecimal)((EgovMap)categorySearchList.get(i)).get("sort");
			        		cell.setCellValue(sort.toString());			//순서
			        		System.out.println("sort   :  "+ ((EgovMap)categorySearchList.get(i)).get("sort"));
			        	}
			        	if(j==4) {
			        		cell.setCellValue((String)((EgovMap)categorySearchList.get(i)).get("useYn"));			//사용 유무
			        		System.out.println("useYn   :  "+ (String)((EgovMap)categorySearchList.get(i)).get("useYn"));
			        	}
			        	if(j==5) {
			        		cell.setCellValue((String)((EgovMap)categorySearchList.get(i)).get("regdate"));		//등록일자
			        		System.out.println("regdate   :  "+ ((EgovMap)categorySearchList.get(i)).get("regdate"));
			        	}
			        	
				 	}
		        }
			}
			response.setHeader("Set-Cookie", "fileDownload=true; path=/");
			SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
			Date currentTime = new Date ();
			String mTime = mSimpleDateFormat.format ( currentTime );
			fileName = fileName+"("+mTime+")";
			
			response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
			wb.write(response.getOutputStream());
	    
		}catch(Exception e) {
			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
			response.setHeader("Content-Type","text/html; charset=utf-8");
			OutputStream out = null;
			try {
				out = response.getOutputStream();
				byte[] data = new String("fail..").getBytes();
				out.write(data, 0, data.length);
			} catch(Exception ignore) {
				ignore.printStackTrace();
			} finally {
				if(out != null) try { out.close(); } catch(Exception ignore) {}
			}
		}finally {
			// 디스크 적었던 임시파일을 제거합니다.
			wb.dispose();
			try { wb.close(); } catch(Exception ignore) {}
		}
	}
	
	/**
	 * 문자 발송 해쉬태그 관리 등록 화면
	 * 
	 * @param 
	 * @param 
	 * @return letter/hashconf/hashTagConfRegist
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/hashconf/hashTagConfRegist.do")
	public String hashTagConfRegist(
			HashConfVO hashConfVO,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		// 권한 체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		return "letter/hashconf/HashConfRegist";
		
	}
	
	/**
	 * 문자 발송 해쉬태그 관리 디비 입력 처리
	 * 
	 * @param 
	 * @param 
	 * @return letter/cateconf/categoryConfList.do
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/hashconf/insertHashTagConf.do")
	public String insertHashTagConf(
			HashConfVO hashConfVO,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		//권한체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		// 해쉬태그 내용 저장하기
		int result = letterService.insertHashTagConf(hashConfVO);
		
		if(result > 0) {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert"));
			
		}else {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.insert"));
			
		}
		
		return "redirect:/letter/hashconf/hashTagConfList.do";
		
	}
	
	/**
	 * 
	 * 문자 발송 해쉬태그 관리 리스트 화면
	 * @param userSearchVO 검색조건정보
	 * @param model 화면모델
	 * @return letter/hashconf/hashTatgconfList
	 * @throws Exception
	 */
	@RequestMapping("/letter/hashconf/hashTagConfList.do")
	public String hashTagConfList(@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, 
		ModelMap model, 
		HttpServletRequest request,
		HttpSession session) throws Exception {
		
		Map<String, ?> flashMap =RequestContextUtils.getInputFlashMap(request);
		
		if(flashMap!=null && flashMap.get("userSearchVO") != null) {
			userSearchVO = (UserDefaultVO)flashMap.get("userSearchVO");
			model.addAttribute("userSearchVO", userSearchVO);
		}
		
		if(userSearchVO.getPageUnit() != 10) {
			userSearchVO.setPageUnit(userSearchVO.getPageUnit());
		}

		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(userSearchVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(userSearchVO.getPageUnit());
		paginationInfo.setPageSize(userSearchVO.getPageSize());

		userSearchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		userSearchVO.setLastIndex(paginationInfo.getLastRecordIndex());
		userSearchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		//userSearchVO.setAdminYn("Y");
		if("".equals(userSearchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			userSearchVO.setSearchSortCnd("regdate");
			userSearchVO.setSearchSortOrd("desc");
		}
		//List<?> resultList = userManageService.selectUserList(userSearchVO) ;
		List<?> resultList = letterService.selectHashTagConfList(userSearchVO);
		
		model.addAttribute("resultList", resultList);
		paginationInfo.setTotalRecordCount( resultList.size()> 0 ? ((Long)((EgovMap)resultList.get(0)).get("totCnt")).intValue() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "letter/hashconf/HashConfList";
	}
	
	/**
	 * 문자 발송 해쉬태그 관리 상세보기 화면
	 * 
	 * @param 
	 * @param 
	 * @return letter/cateconf/categoryConfDetail
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/hashconf/hashTagConfDetail.do")
	public String hashTagConfDetail(
			@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO,
			HashConfVO hashConfVO,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		//권한체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		String hashId = commandMap.get("selectedId").toString();
		
		hashConfVO.setHashId(hashId);
		
		//장/단문 메세지 내용 저장하기
		HashConfVO result = new HashConfVO();
		result = letterService.hashTagConfDetail(hashConfVO);
		
		model.addAttribute("result", result);
		
		return "letter/hashconf/HashConfDetail";
		
	}
	
	/**
	 * 문자 발송 해쉬태그 수정 처리
	 * 
	 * @param 
	 * @param 
	 * @return /letter/hashconf/hashTagConfList.do
	 * @param model 화면모델
	 * @throws Exception
	 */
	@RequestMapping("/letter/hashconf/updateHashTagConf.do")
	public String updateHashTagConf(
			UserDefaultVO userSearchVO,
			HashConfVO hashConfVO,
			HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes,
			Model model) throws Exception {
		
		//권한체크
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "redirect:/uat/uia/EgovLoginUsr.do";
		}
		
		//문자 발송 해쉬태그 내용 수정하기
		int result = letterService.updateHashTagConf(hashConfVO);
		
		if(result > 0) {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update"));
			
		}else {
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.update"));
			
		}
		
		redirectAttributes.addFlashAttribute("userSearchVO", userSearchVO);
		
		return "redirect:/letter/hashconf/hashTagConfList.do";
		
	}
	
	//해쉬태그 엑셀 다운로드
	@RequestMapping(value="/letter/hashconf/hashTagExcelDownload.do")
	public void hashTagExcelDownload(UserDefaultVO userSearchVO, 
			HttpServletRequest request, 
			HttpServletResponse response , 
			ModelMap model) throws Exception {
		
		userSearchVO.setRecordCountPerPage(100000);
		userSearchVO.setFirstIndex(0);
		if("".equals(userSearchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			userSearchVO.setSearchSortCnd("regdate");
			userSearchVO.setSearchSortOrd("desc");
		}
		
		LoginVO loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		if(null != loginVO && !"super".equals(loginVO.getSiteId())){
			userSearchVO.setSiteId(loginVO.getSiteId());
		}
		// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
		SXSSFWorkbook wb = new SXSSFWorkbook(100);
		CellStyle style = wb.createCellStyle();
		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
 		style.setBorderLeft(CellStyle.BORDER_THIN);
 		style.setBorderRight(CellStyle.BORDER_THIN);
 		style.setBorderTop(CellStyle.BORDER_THIN);
 		Font font = wb.createFont();
 		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
 		
		Cell cell = null;
		Row row = null;
		
		String fileName ="해쉬태그 리스트";
		
		String sheetTitle = "";
		try{
			List<?> hashTagSearchList  = letterService.selectHashTagConfList(userSearchVO) ;
			{ //화면 리스트
				sheetTitle = "해쉬태그 리스트" ; //제목
				Sheet sheet = wb.createSheet(sheetTitle);
				row = sheet.createRow(0);
		        for(int i=0 ; i < hashTagExcelValue.length ; i++) {
	 		       cell = row.createCell(i);
	 		       cell.setCellStyle(style);
		 	       cell.setCellValue(hashTagExcelValue[i][1]);
	 		    }
			        
		        for(int i=0; i < hashTagSearchList.size(); i++){
			    	row = sheet.createRow(i+1);
			    	System.out.println("row  : "+row);
			    	System.out.println("I  : "+i);
			    	for(int j=0 ; j < hashTagExcelValue.length ; j++) {
			    		System.out.println("J   :  "+ j);
			        	cell = row.createCell(j);
			        	cell.setCellStyle(style);
			        	if(j==0) {
			        		cell.setCellValue(i+1);																//번호
			        	}
			        	if(j==1) {
			        		cell.setCellValue((String)((EgovMap)hashTagSearchList.get(i)).get("hashNm"));		//카테고리 이름
			        		System.out.println("categoryNm   :  "+ (String)((EgovMap)hashTagSearchList.get(i)).get("hashNm"));
			        	}
			        	if(j==2) {
			        		BigDecimal sort = (BigDecimal)((EgovMap)hashTagSearchList.get(i)).get("sort");
			        		cell.setCellValue(sort.toString());			//순서
			        		System.out.println("sort   :  "+ ((EgovMap)hashTagSearchList.get(i)).get("sort"));
			        	}
			        	if(j==3) {
			        		cell.setCellValue((String)((EgovMap)hashTagSearchList.get(i)).get("useYn"));			//사용 유무
			        		System.out.println("useYn   :  "+ (String)((EgovMap)hashTagSearchList.get(i)).get("useYn"));
			        	}
			        	if(j==4) {
			        		cell.setCellValue((String)((EgovMap)hashTagSearchList.get(i)).get("regdate"));			//사용 유무
			        		System.out.println("regdate   :  "+ (String)((EgovMap)hashTagSearchList.get(i)).get("regdate"));
			        	}
				 	}
		        }
			}
			response.setHeader("Set-Cookie", "fileDownload=true; path=/");
			SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
			Date currentTime = new Date ();
			String mTime = mSimpleDateFormat.format ( currentTime );
			fileName = fileName+"("+mTime+")";
			
			response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
			wb.write(response.getOutputStream());
	    
		}catch(Exception e) {
			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
			response.setHeader("Content-Type","text/html; charset=utf-8");
			OutputStream out = null;
			try {
				out = response.getOutputStream();
				byte[] data = new String("fail..").getBytes();
				out.write(data, 0, data.length);
			} catch(Exception ignore) {
				ignore.printStackTrace();
			} finally {
				if(out != null) try { out.close(); } catch(Exception ignore) {}
			}
		}finally {
			// 디스크 적었던 임시파일을 제거합니다.
			wb.dispose();
			try { wb.close(); } catch(Exception ignore) {}
		}
	}
	
	/**
	 * 문자 발송 해쉬태그 삭제후 목록조회 화면으로 이동한다.
	 * @param checkedIdForDel 삭제대상아이디 정보
	 * @param userSearchVO 검색조건
	 * @param model 화면모델
	 * @return forward:/letter/hashconf/hashTagConfList.do
	 * @throws Exception
	 */
	@RequestMapping("/letter/hashconf/deleteHashTagConf.do")
	public String deleteHashTagConf(@RequestParam("checkedIdForDel") String checkedIdForDel, 
			@ModelAttribute("searchVO") UserDefaultVO userSearchVO, 
			RedirectAttributes redirectAttributes, 
			Model model) throws Exception {
		
		if (!EgovDoubleSubmitHelper.checkAndSaveToken("someKey")) {  
			return "redirect:/letter/hashconf/hashTagConfList.do";
		}	
		
		// 미인증 사용자에 대한 보안처리
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
    	if(!isAuthenticated) {
    		model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
        	return "uat/uia/EgovLoginUsr";
    	}

    	// 문자 발송 해쉬태그 삭제 - 
    	letterService.deleteHashTagConf(checkedIdForDel);
    	
    	redirectAttributes.addFlashAttribute("userSearchVO", userSearchVO);
		
		redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete"));
		if(userSearchVO.getGnrlUser().equals("N")) {
			RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/letter/hashconf/hashTagConfList.do");
			return redirectUrlMaker.getRedirectUrl();
		}
		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/letter/hashconf/hashTagConfList.do");
		return redirectUrlMaker.getRedirectUrl();
	}
	
	/* 그림문자 letterIdgen 강제 업데이트  */
	@RequestMapping(value="/letter/photo/updateLetterPhotosIdgenAjax.do")
	public ModelAndView updateLetterPhotosIdgenAjax(ModelMap model,
			HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
    	
		if (!isAuthenticated) {
			modelAndView.addObject("result", "auth_fail"); //권한없음
			return modelAndView;
		}
		
		try {
			//letterService.updateLetterIdgen(횟수)
			letterService.updateLetterIdgen(50);
			
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
	
	/* 첨부파일 atchFileIdgen 강제 업데이트  */
	@RequestMapping(value="/letter/photo/updateAtchFileIdgenAjax.do")
	public ModelAndView updateAtchFileIdgenAjax(ModelMap model,
			HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
    	
		if (!isAuthenticated) {
			modelAndView.addObject("result", "auth_fail"); //권한없음
			return modelAndView;
		}
		
		try {
			//fileUtil.updateAtchFileIdgen(횟수)
			fileUtil.updateAtchFileIdgen(50);
			
			modelAndView.addObject("result", "success");
		}catch (Exception e) {
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}
	
	
	/**
	 * 그림 문자 리스트에서 우선순위 변경
	 * @param 
	 * @param userSearchVO 검색조건
	 * @param model 화면모델
	 * @return 
	 * @throws Exception
	 */
	@RequestMapping("/letter/photo/updateLetterPriorityChangeAjax.do")
	@ResponseBody
	public ModelAndView updateLetterPriorityChangeAjax(LetterVO letterVO,
			ModelMap model,
			HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	
    	Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
    	if (!isAuthenticated) {
    		modelAndView.addObject("result", "auth_fail");
    		return modelAndView;
    	}
    	
    	letterVO.setChkIdsSize(letterVO.getChkIds().length);
    	
    	try {
    		
    		//1. 설정하고자 하는 우선순위를 포함한 뒷 우선순위들을 우선순위 + 체크한 리스트 크기만큼 증가시키기
        	int result = letterService.updateChkAfterPriorityPlus(letterVO);
        	//2. 체크한 리스트들 우선순위 업데이트
        	result += letterService.updateChkListPriority(letterVO);
        	//3. 그림문자 전체 우선순위 빈값없이 정렬하기
        	result += letterService.updateOrderByPriority(letterVO);
        	//4. 우선순위가 null인 값 우선순위 부여
        	result += letterService.updateNullPriority(letterVO);
        	
    		modelAndView.addObject("result", "success");
        	
		} catch (Exception e) {
			System.out.println(e.getMessage());
			modelAndView.addObject("result", "fail");
		}
    	
		
		return modelAndView;
	}
	
	/**
	 * 카테고리 관리 리스트에서 우선순위 변경
	 * @param 
	 * @param userSearchVO 검색조건
	 * @param model 화면모델
	 * @return 
	 * @throws Exception
	 */
	@RequestMapping("/letter/cateconf/updateCateConfSortChangeAjax.do")
	@ResponseBody
	public ModelAndView updateCateConfPriorityChangeAjax(LetterVO letterVO,
			ModelMap model,
			HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
    	modelAndView.setViewName("jsonView");
    	
    	Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
    	if (!isAuthenticated) {
    		modelAndView.addObject("result", "auth_fail");
    		return modelAndView;
    	}
    	
    	letterVO.setChkIdsSize(letterVO.getChkIds().length);
    	
    	try {
    		
    		//1. 설정하고자 하는 우선순위를 포함한 뒷 우선순위들을 우선순위 + 체크한 리스트 크기만큼 증가시키기
        	int result = letterService.updateChkCateAfterSortPlus(letterVO);
        	//2. 체크한 리스트들 우선순위 업데이트
        	result += letterService.updateChkCateListSort(letterVO);
        	//3. 그림문자 전체 우선순위 빈값없이 정렬하기
        	result += letterService.updateCateOrderBySort(letterVO);
        	//4. 우선순위가 null인 값 우선순위 부여
        	result += letterService.updateCateNullSort(letterVO);
        	
    		modelAndView.addObject("result", "success");
        	
		} catch (Exception e) {
			System.out.println(e.getMessage());
			modelAndView.addObject("result", "fail");
		}
    	
		
		return modelAndView;
	}	
	
	/**
	 * 베스트 문자샘플 관리 리스트에서 우선순위 변경
	 * @param 
	 * @param userSearchVO 검색조건
	 * @param model 화면모델
	 * @return 
	 * @throws Exception
	 */
	@RequestMapping("/letter/messages/updateMainTagSortChangeAjax.do")
	@ResponseBody
	public ModelAndView updateMainTagSortChangeAjax(LetterVO letterVO,
			ModelMap model,
			HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			modelAndView.addObject("result", "auth_fail");
			return modelAndView;
		}
		
		letterVO.setChkIdsSize(letterVO.getChkIds().length);
		
		try {
			
			//1. 설정하고자 하는 우선순위를 포함한 뒷 우선순위들을 우선순위 + 체크한 리스트 크기만큼 증가시키기
			int result = letterService.updateChkTagAfterSortPlus(letterVO);
			//2. 체크한 리스트들 우선순위 업데이트
			result += letterService.updateChkTagListSort(letterVO);
			//3. 그림문자 전체 우선순위 빈값없이 정렬하기
			result += letterService.updateTagOrderBySort(letterVO);
			//4. 우선순위가 null인 값 우선순위 부여
			result += letterService.updateTagNullSort(letterVO);
			
			modelAndView.addObject("result", "success");
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
			modelAndView.addObject("result", "fail");
		}
		
		
		return modelAndView;
	}	
	
	
	// 그림문자 해쉬태그 일괄 저장
	@RequestMapping(value = "/letter/photo/hashTagMassUpdateAjax.do")
	public ModelAndView hashTagMassUpdateAjax(
			@ModelAttribute("letterVO") LetterVO letterVO) throws Exception {

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

		boolean isSuccess = true;
		String msg = "";
		
    	// 로그인VO에서  사용자 정보 가져오기
    	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
    	String frstRegisterId = loginVO == null ? "" : loginVO.getId();
    	letterVO.setRegId(frstRegisterId);		// 최초등록자ID

        try{
        	// 제목, 해쉬태그 일괄변경
        	letterService.updateHashTagList(letterVO);
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("msg", msg);
		
		return modelAndView;
	}	
	

	/**
	 * 
	 * 단문/장문 문자 목록 화면 하위 카테고리 selectbox 조회 ajax
	 * @param userSearchVO 검색조건정보
	 * @param model 화면모델
	 * @return letter/messages/selectCateTwoDptListAjax
	 * @throws Exception
	 */
	@RequestMapping("/letter/messages/selectCateTwoDptListAjax.do")
	public ModelAndView selectCateTwoDptListAjax(CateCode cateCode) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		try {
			
			List<CateCode> cateCodeList = letterService.selectCateCodeThrDptWithList(cateCode);
			
			modelAndView.addObject("status", "success");
			modelAndView.addObject("result", cateCodeList);
		}catch(Exception e) {
			modelAndView.addObject("status", "fail");
		}
	
		return modelAndView;
	}
	
	/**
     * 메인태그 관리 (pageing)
     * @param searchVO
     * @param model
     * @return	"letter/messages/MainTagList"
     * @throws Exception
     */
    @RequestMapping(value="/letter/messages/selectMainTagList.do")
    public String selectMainTagList(@ModelAttribute("searchVO") LetterVO searchVO, 
    		ModelMap model) throws Exception {

    	if(searchVO.getPageUnit() != 10) {
    		searchVO.setPageUnit(searchVO.getPageUnit());
		}
    	
    	/** pageing */
    	PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(searchVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(searchVO.getPageUnit());
		paginationInfo.setPageSize(searchVO.getPageSize());

		if("".equals(searchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
			searchVO.setSearchSortCnd("mainTagNo");
			searchVO.setSearchSortOrd("desc");
		}
		
		searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		searchVO.setLastIndex(paginationInfo.getLastRecordIndex());
		searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
        List<LetterVO> mainTagList = letterService.selectMainTagList(searchVO);
        
        model.addAttribute("resultList", mainTagList);
        paginationInfo.setTotalRecordCount(mainTagList.size() > 0 ? ((LetterVO)mainTagList.get(0)).getTotCnt() : 0);
        model.addAttribute("paginationInfo", paginationInfo);
        
        return "letter/messages/MainTagList";
    }
    
    /**
     * 메인태그 등록화면
     * @param searchVO
     * @param model
     * @return	"letter/messages/MainTagRegist"
     * @throws Exception
     */
    @RequestMapping("/letter/messages/insertMainTagView.do")
    public String insertMainTagView(
            @ModelAttribute("searchVO") LetterVO searchVO
            , Model model) throws Exception {

    	LetterVO letterVO = new LetterVO(); 
    	if(null != searchVO.getCrudMode() && "U".equals(searchVO.getCrudMode())) { 
    		//수정
    		letterVO  = letterService.selectMainTagDetail(searchVO); //이전 로그인한 IP 까지 조회
    	}
    	model.addAttribute("letterVO", letterVO);
    	
        return "letter/messages/MainTagRegist";
    }    
    
	// 메인태그 정보
	@RequestMapping(value = "/letter/messages/viewMainTagAjax.do")
	public ModelAndView viewMainTagAjax(
			@ModelAttribute("letterVO") LetterVO searchVO) throws Exception {

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

		boolean isSuccess = true;
		String msg = "";
		LetterVO letterVO = new LetterVO();
		
        try {
        	 
        	if(null != searchVO.getCrudMode() && "U".equals(searchVO.getCrudMode())) { 
        		//수정
        		letterVO  = letterService.selectMainTagDetail(searchVO); //이전 로그인한 IP 까지 조회
        	}
        	
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

        modelAndView.addObject("letterVO", letterVO);
		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("msg", msg);
		
		return modelAndView;
	}	      
    
	// 메인태그 저장
	@RequestMapping(value = "/letter/messages/saveMainTagAjax.do")
	public ModelAndView saveMainTagAjax(
			@ModelAttribute("letterVO") LetterVO letterVO) throws Exception {

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

		boolean isSuccess = true;
		String msg = "";
		
    	// 로그인VO에서  사용자 정보 가져오기
    	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
    	String frstRegisterId = loginVO == null ? "" : loginVO.getId();
    	letterVO.setRegId(frstRegisterId);		// 최초등록자ID

        try{
        	if(null != letterVO.getCrudMode() && "U".equals(letterVO.getCrudMode())) { 
        		//수정
        		letterService.updateMainTag(letterVO);
        	}        	
        	else {
        		// 등록
        		letterService.insertMainTag(letterVO);
        	}
			
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("msg", msg);
		
		return modelAndView;
	}
	
	
	
	/*-------------------------------------------*/
	
	
	/**
	  * @Method Name	: selectBastMsgTagList
	  * @작성일 			: 2023. 9. 5.
	  * @작성자			: WYH
	  * @변경이력			: 
	  * @Method 설명 		: 배스트 문자샘플 매인화면
	  */
	@RequestMapping(value="/letter/messages/selectBastMsgTagList.do")
	public String selectBastMsgTagList(@ModelAttribute("searchVO") LetterVO searchVO, 
		ModelMap model) throws Exception {
		
		if(searchVO.getPageUnit() != 10) {
			searchVO.setPageUnit(searchVO.getPageUnit());
		}
		
		/** pageing */
		PaginationInfo paginationInfo = new PaginationInfo();
		paginationInfo.setCurrentPageNo(searchVO.getPageIndex());
		paginationInfo.setRecordCountPerPage(searchVO.getPageUnit());
		paginationInfo.setPageSize(searchVO.getPageSize());
		
		if("".equals(searchVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
		searchVO.setSearchSortCnd("mainSearchTagNo");
		searchVO.setSearchSortOrd("desc");
		}
		
		searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
		searchVO.setLastIndex(paginationInfo.getLastRecordIndex());
		searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
		List<LetterVO> mainTagList = letterService.selectBastMsgTagList(searchVO);
		
		model.addAttribute("resultList", mainTagList);
		paginationInfo.setTotalRecordCount(mainTagList.size() > 0 ? ((LetterVO)mainTagList.get(0)).getTotCnt() : 0);
		model.addAttribute("paginationInfo", paginationInfo);
		
		return "letter/messages/BastMsgTagList";
	}
	
	/**
	  * @Method Name	: insertBastMsgTagView
	  * @작성일 			: 2023. 9. 5.
	  * @작성자			: WYH
	  * @변경이력			: 
	  * @Method 설명 		: 베스트 문자샘플 등록화면
	  */
	@RequestMapping("/letter/messages/insertBastMsgTagView.do")
	public String insertBastMsgTagView(
		@ModelAttribute("searchVO") LetterVO searchVO
		, Model model) throws Exception {
	
		LetterVO letterVO = new LetterVO(); 
		if(null != searchVO.getMainSearchTagNo() && !"".equals(searchVO.getMainSearchTagNo())) { 
			//수정
			letterVO  = letterService.selectBastMsgTagInfo(searchVO); //이전 로그인한 IP 까지 조회
		}
		model.addAttribute("letterVO", letterVO);
		
		return "letter/messages/BastMsgTagInfo";
	}
	
	/**
	  * @Method Name	: saveBastMsgTagAjax
	  * @작성일 			: 2023. 9. 5.
	  * @작성자			: WYH
	  * @변경이력			: 
	  * @Method 설명 		: 베스트 문자샘플 등록 / 수정
	  */
	@RequestMapping(value = "/letter/messages/saveBastMsgTagAjax.do")
	public ModelAndView saveBastMsgTagAjax(
			@ModelAttribute("letterVO") LetterVO letterVO) throws Exception {

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

		boolean isSuccess = true;
		String msg = "";
		
		// 로그인VO에서  사용자 정보 가져오기
		LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
		String frstRegisterId = loginVO == null ? "" : loginVO.getId();
		letterVO.setRegId(frstRegisterId);		// 최초등록자ID

		
		try{
			if(null != letterVO.getMainSearchTagNo() && !"".equals(letterVO.getMainSearchTagNo())) { 
				//수정
				letterService.updateBastMsgTag(letterVO);
			}
			else {
				// 등록
				letterService.insertBastMsgTag(letterVO);
			}
			
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("msg", msg);
		
		return modelAndView;
	}
	
	
	@RequestMapping("/letter/messages/updateBastMsgTagSortChangeAjax.do")
	@ResponseBody
	public ModelAndView updateBastMsgTagSortChangeAjax(LetterVO letterVO,
			ModelMap model,
			HttpServletRequest request) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			modelAndView.addObject("result", "auth_fail");
			return modelAndView;
		}
		
		letterVO.setChkIdsSize(letterVO.getChkIds().length);
		
		try {
			
			//1. 설정하고자 하는 우선순위를 포함한 뒷 우선순위들을 우선순위 + 체크한 리스트 크기만큼 증가시키기
			int result = letterService.updateChkBastMsgTagAfterSortPlus(letterVO);
			//2. 체크한 리스트들 우선순위 업데이트
			result += letterService.updateChkBastMsgTagListSort(letterVO);
			//3. 그림문자 전체 우선순위 빈값없이 정렬하기
			result += letterService.updateBastMsgTagOrderBySort(letterVO);
			//4. 우선순위가 null인 값 우선순위 부여
			result += letterService.updateBastMsgTagNullSort(letterVO);
			
			modelAndView.addObject("result", "success");
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
			modelAndView.addObject("result", "fail");
		}
		
		
		return modelAndView;
	}	
	
	@RequestMapping(value={"/letter/photo/updateMultiMjonMsgAgentStsDataAjax.do"})
	public ModelAndView updateMultiMjonMsgAgentStsDataAjax(@ModelAttribute("mjonMsgAgentStsVO") MjonMsgAgentStsVO mjonMsgAgentStsVO) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String msg = "";
		
    	System.out.print("\n updateMultiMjonMsgAgentStsData 1==== \n");
    	System.out.print("  mjonMsgAgentStsVO.getAgentCodes().size():  " + mjonMsgAgentStsVO.getAgentCodes().size() + ":===end=== \n");       

        try{
        	
        	System.out.print("==== updateMultiMjonMsgAgentStsDataAjax controller try start ==== \n");
        	mjonMsgAgentStsService.updateMjonMsgAgentStsDataList(mjonMsgAgentStsVO);        	
        	System.out.print("==== updateMultiMjonMsgAgentStsDataAjax controller try catch end ==== \n");        	
        	
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("msg", msg);
    	System.out.println("modelAndView.getViewName(): " + modelAndView.getViewName()) ;
    	
		return modelAndView;
	}	
	
}


