package itn.let.cop.resve.web; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.annotation.Resource; import org.apache.commons.lang3.ArrayUtils; import org.json.simple.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.support.SessionStatus; 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.springmodules.validation.commons.DefaultBeanValidator; import com.ibm.icu.util.StringTokenizer; 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.ComDefaultCodeVO; import itn.com.cmm.EgovMessageSource; import itn.com.cmm.LoginVO; import itn.com.cmm.service.EgovCmmUseService; import itn.com.cmm.service.EgovFileMngService; import itn.com.cmm.service.EgovFileMngUtil; import itn.com.cmm.service.FileVO; import itn.let.cop.resve.service.Resve; import itn.let.cop.resve.service.ResveManageService; import itn.let.cop.resve.service.ResveVO; import itn.let.sec.ram.service.AuthorManageVO; import itn.let.sec.ram.service.EgovAuthorManageService; /** * 대관신청 관리를 위한 컨트롤러 클래스 * @author * @since 2018.11.21 * @version 1.0 * @see * *
 * << 개정이력(Modification Information) >>
 *
 *   수정일      수정자          수정내용
 *  -------    --------    ---------------------------
 *  2018.11.10               최초 생성
 *
 *  
*/ @Controller public class ResveManageController { @Resource(name = "ResveManageService") private ResveManageService resveManageService; @Resource(name = "EgovCmmUseService") private EgovCmmUseService cmmUseService; @Resource(name = "propertiesService") protected EgovPropertyService propertyService; @Autowired private DefaultBeanValidator beanValidator; @Resource(name = "egovAuthorManageService") private EgovAuthorManageService egovAuthorManageService; @Resource(name="egovMessageSource") EgovMessageSource egovMessageSource; @Resource(name = "EgovFileMngUtil") private EgovFileMngUtil fileUtil; @Resource(name = "EgovFileMngService") private EgovFileMngService fileMngService; private static final Logger LOGGER = LoggerFactory.getLogger(ResveManageController.class); /** * 대관관리 목록을 조회한다. * * @param ResveVO * @param model * @return * @throws Exception */ @RequestMapping("/cop/resve/selectResveManageList.do") public String selectResveManageList(@ModelAttribute("searchVO") ResveVO resveVO, ModelMap model) throws Exception { resveVO.setPageUnit(propertyService.getInt("pageUnit")); resveVO.setPageSize(propertyService.getInt("pageSize")); PaginationInfo paginationInfo = new PaginationInfo(); paginationInfo.setCurrentPageNo(resveVO.getPageIndex()); paginationInfo.setRecordCountPerPage(resveVO.getPageUnit()); paginationInfo.setPageSize(resveVO.getPageSize()); resveVO.setFirstIndex(paginationInfo.getFirstRecordIndex()); resveVO.setLastIndex(paginationInfo.getLastRecordIndex()); resveVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage()); Map map = resveManageService.selectResveManageList(resveVO); int totCnt = Integer.parseInt((String) map.get("resultCnt")); paginationInfo.setTotalRecordCount(totCnt); model.addAttribute("resultList", map.get("resultList")); model.addAttribute("resultCnt", map.get("resultCnt")); model.addAttribute("paginationInfo", paginationInfo); return "cop/resve/resveManageList"; } /** * 신규 게시판 마스터 등록을 위한 등록페이지로 이동한다. * * @param boardMasterVO * @param model * @return * @throws Exception */ @RequestMapping("/cop/resve/addResveManage.do") public String addResve(@ModelAttribute("searchVO") ResveVO resveVO, @ModelAttribute("resve") Resve resve, ModelMap model, BindingResult bindingResult, RedirectAttributes redirectAttributes) throws Exception { // 공통코드 및 권한목록 Set setCodeNAuth(model); return "cop/resve/resveManageRegist"; } /** * 신규 대관관리 정보를 등록한다. * * @param resveVO * @param resve * @param status * @return * @throws Exception */ @RequestMapping("/cop/resve/insertResveManage.do") public String insertBBSMasterInf(final MultipartHttpServletRequest multiRequest, @ModelAttribute("searchVO") ResveVO resveVO, @ModelAttribute("resve") Resve resve, BindingResult bindingResult, SessionStatus status, ModelMap model, RedirectAttributes redirectAttributes) throws Exception { LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser(); beanValidator.validate(resve, bindingResult); if (bindingResult.hasErrors()) { // 공통코드 및 권한목록 Set setCodeNAuth(model); return "cop/resve/resveManageRegist"; } // 대관신청 희망일자 가능 여부 int posbleDate = resveManageService.resvePosbleDate(resve); if (posbleDate > 0) { // 공통코드 및 권한목록 Set setCodeNAuth(model); model.addAttribute("message", "대관 희망기간일이 가능하지 않습니다."); return "cop/resve/resveManageRegist"; } // 파일업로드 final Map files = multiRequest.getFileMap(); if (!files.isEmpty()) { String storePath = "Globals.resveFileStorePath"; long posblAtchFileSize = propertyService.getInt("posblAtchFileSize"); int posblResveThumbAtchFileNum = propertyService.getInt("posblResveThumbAtchFileNum"); int posblResveImgAtchFileNum = propertyService.getInt("posblResveImgAtchFileNum"); int posblResvePortpolioAtchFileNum = propertyService.getInt("posblResvePortpolioAtchFileNum"); final Map thumbFiles = new HashMap(); final Map imgFiles = new HashMap(); final Map portpolioFiles = new HashMap(); Set keySet = files.keySet(); Iterator keyItr = keySet.iterator(); while (keyItr.hasNext()) { String key = keyItr.next(); String fileCnd = !("").equals(key) ? key.split("_")[0] : ""; String orginFileName = files.get(key).getOriginalFilename(); if ("".equals(orginFileName)) continue; switch (fileCnd) { case "thumb" : thumbFiles.put(key, files.get(key)); break; case "img" : imgFiles.put(key, files.get(key)); break; case "portfolio" : portpolioFiles.put(key, files.get(key)) ; break; } } // 기 업로드 개수 int atchFileCnt = 0; // 파일 개수/사이즈/확장자 체크 if (!isPosblAtchFile(thumbFiles, "썸네일", model, atchFileCnt, posblResveThumbAtchFileNum, posblAtchFileSize, true)) { model.addAttribute("resve", resve); return "cop/resve/resveManageRegist"; } if (!isPosblAtchFile(imgFiles, "대표이미지", model, atchFileCnt, posblResveImgAtchFileNum, posblAtchFileSize, true)) { model.addAttribute("resve", resve); return "cop/resve/resveManageRegist"; } if (!isPosblAtchFile(portpolioFiles, "포트폴리오", model, atchFileCnt, posblResvePortpolioAtchFileNum, posblAtchFileSize, false)) { model.addAttribute("resve", resve); return "cop/resve/resveManageRegist"; } List result = new ArrayList(); result = fileUtil.parseFileInf(thumbFiles, "RESVE_", 0, "", storePath, ""); String thumbAtchFileId = fileMngService.insertFileInfs(result); result = fileUtil.parseFileInf(imgFiles, "RESVE_", 0, "", storePath, ""); String imgAtchFileId = fileMngService.insertFileInfs(result); result = fileUtil.parseFileInf(portpolioFiles, "RESVE_", 0, "", storePath, ""); String portfolioAtchFileId = fileMngService.insertFileInfs(result); resve.setThumbAtchFileId(thumbAtchFileId); resve.setImgAtchFileId(imgAtchFileId); resve.setPortfolioAtchFileId(portfolioAtchFileId); } resve.setMemberId(user.getUniqId()); // 최종수정자ID. (사용없음 참조용) resveManageService.insertResveManage(resve); redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert")); return "redirect:/cop/resve/selectResveManageList.do"; } /** * 대관관리 상세내용을 조회한다. * * @param searchVO * @param model * @return * @throws Exception */ @RequestMapping("/cop/resve/selectResveManage.do") public String selectResveManageInf(@ModelAttribute("searchVO") ResveVO searchVO, ModelMap model, RedirectAttributes redirectAttributes) throws Exception { ResveVO vo = resveManageService.selectResveManageInf(searchVO); model.addAttribute("result", vo); // 공통코드 및 권한목록 Set setCodeNAuth(model); return "cop/resve/resveManageUpdt"; } /** * 대관관리 정보를 수정한다. * * @param boardMasterVO * @param boardMaster * @param model * @return * @throws Exception */ @RequestMapping("/cop/resve/updateResveManageInf.do") public String updateResveManageInf(@ModelAttribute("searchVO") ResveVO resveVO, @ModelAttribute("resve") Resve resve, BindingResult bindingResult, ModelMap model, RedirectAttributes redirectAttributes) throws Exception { // 승인완료 선택 시 희망일자 가능여부 if (("b").equals(resve.getResState())) { ResveVO vo = resveManageService.selectResveManageInf(resveVO); // 대관신청 희망일자 가능 여부 int posbleDate = resveManageService.resvePosbleDate(vo); if (posbleDate > 0) { // 공통코드 및 권한목록 Set setCodeNAuth(model); model.addAttribute("message", "대관 희망기간일이 가능하지 않습니다."); model.addAttribute("result", vo); return "cop/resve/resveManageUpdt"; } } resveManageService.updateResveManageInf(resve); redirectAttributes.addAttribute("pageIndex", resveVO.getPageIndex()); redirectAttributes.addAttribute("searchCnd", resveVO.getSearchCnd()); redirectAttributes.addAttribute("searchWrd", resveVO.getSearchWrd()); redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update")); return "redirect:/cop/resve/selectResveManageList.do"; } /** * 대관신청 전시기간 시작일 가능 일자 조회 * @param commandMap 파라메터전달용 commandMap * @param model 화면모델 * @throws Exception */ @RequestMapping(value = "/cop/resve/resveResSdateListAjax.do") public ModelAndView resveResSdateListAjax(@RequestParam Map commandMap) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); String searchYyyyMm = (String) commandMap.get("searchYyyyMm"); String selectExRoom = (String) commandMap.get("selectExRoom"); Resve vo = new Resve(); vo.setSelectExRoom(selectExRoom); Calendar cal = Calendar.getInstance(); int year = Integer.parseInt(searchYyyyMm.substring(0, 4)); int month = Integer.parseInt(searchYyyyMm.substring(4, 6)); cal.set(year, month-1, 1); int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String date = sdf.format(cal.getTime()); vo.setSearchDate(date); date = date.substring(0, 6) + (maxDay<10 ? "0"+maxDay : maxDay ); vo.setSearchDate1(date); List result = resveManageService.resveResSdateList(vo); modelAndView.addObject("result", result); return modelAndView; } /** * 공통코드 및 권한목록 Set * @param model * @throws Exception */ private void setCodeNAuth(ModelMap model) throws Exception { // 승인상태 ComDefaultCodeVO comDefaultCodeVO = new ComDefaultCodeVO(); comDefaultCodeVO.setCodeId("ITN006"); List codeResult = cmmUseService.selectCmmCodeDetail(comDefaultCodeVO); model.addAttribute("resStateList", codeResult); // 신처자 구분 comDefaultCodeVO.setCodeId("ITN007"); codeResult = cmmUseService.selectCmmCodeDetail(comDefaultCodeVO); model.addAttribute("userTypeList", codeResult); AuthorManageVO authorManageVO = new AuthorManageVO(); authorManageVO.setAuthorManageList(egovAuthorManageService.selectAuthorAllList(authorManageVO)); model.addAttribute("authorList", authorManageVO.getAuthorManageList()); // 파일개수/사이즈 model.addAttribute("maxThumbFileNum", propertyService.getInt("posblResveThumbAtchFileNum")); model.addAttribute("maxImgFileNum", propertyService.getInt("posblResveImgAtchFileNum")); model.addAttribute("maxPortpolioFileNum", propertyService.getInt("posblResvePortpolioAtchFileNum")); model.addAttribute("maxFileSize", propertyService.getInt("posblAtchFileSize")); } /** * 선택된 대관신청정보를 삭제한다. * @param applyNums String * @param resveVO ResveVO * @return String * @exception Exception */ @RequestMapping(value = "/cop/resve/deleteResveManages.do") public String deleteBBSMasterInfs(@RequestParam("applyNums") String applyNums, @ModelAttribute("ResveVO") ResveVO resveVO, RedirectAttributes redirectAttributes) throws Exception { String[] strApplyNums = applyNums.split(";"); for (int i = 0; i < strApplyNums.length; i++) { String[] strApplyNumNAtchFileId = strApplyNums[i].split("\\|"); resveVO.setApplyNum(Integer.parseInt(strApplyNumNAtchFileId[0])); if (!("-").equals(strApplyNumNAtchFileId[1])) resveVO.setThumbAtchFileId(strApplyNumNAtchFileId[1]); if (!("-").equals(strApplyNumNAtchFileId[2])) resveVO.setImgAtchFileId(strApplyNumNAtchFileId[2]); if (!("-").equals(strApplyNumNAtchFileId[3])) resveVO.setPortfolioAtchFileId(strApplyNumNAtchFileId[3]); resveManageService.deleteResveManage(resveVO); } resveVO.setPageIndex(1); redirectAttributes.addAttribute("pageIndex", resveVO.getPageIndex()); redirectAttributes.addAttribute("searchCnd", resveVO.getSearchCnd()); redirectAttributes.addAttribute("searchWrd", resveVO.getSearchWrd()); redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete")); return "redirect:/cop/resve/selectResveManageList.do"; } /** * 첨부파일 개수, 사이즈, 확장자 체크 * @param fileList 파일리스트 * @param name 파일 항목명 * @param model * @param atchFileCnt 기업로드된 파일 수 * @param posblAtchFileCnt 업로드 가능 파일 수 * @param posblAtchFileSize 업로드 가능 파일 사이즈 * @param isImg 이미지 여부 * @return boolean * @throws Exception */ private boolean isPosblAtchFile(Map fileList, String name, ModelMap model, int atchFileCnt, int posblAtchFileCnt, long posblAtchFileSize, boolean isImg) throws Exception { String flashMessage = ""; boolean posblAtchFileFlag = true; boolean posblAtchFileSizeFlag = true; boolean posblAtchFileExtFlag = true; Iterator> itr = fileList.entrySet().iterator(); MultipartFile file; while (itr.hasNext()) { Entry entry = itr.next(); file = entry.getValue(); long fileMg = file.getSize(); String orginFileName = file.getOriginalFilename(); int index = orginFileName.lastIndexOf("."); String fileExt = orginFileName.substring(index + 1); if (fileMg > posblAtchFileSize) posblAtchFileSizeFlag = false; if (isImg) { String[] imgExts = {"gif", "jpg", "bmp", "jpeg", "png"}; if (ArrayUtils.indexOf(imgExts, fileExt.toLowerCase()) == -1) posblAtchFileExtFlag = false; } } if (!posblAtchFileExtFlag) { flashMessage += name + ": 이미지 형식의 확장자만 업로드 가능합니다." + "\\n"; posblAtchFileFlag = false; } if(!posblAtchFileSizeFlag) { flashMessage += name + ": 파일사이즈가 초과되었습니다. 최대크기 " + posblAtchFileSize + "mb" + "\\n"; posblAtchFileFlag = false; } if ((fileList.size()+atchFileCnt) > posblAtchFileCnt) { flashMessage += name + ": 파일 개수가 초과되었습니다. 최대개수 " + posblAtchFileCnt + "개" + "\\n"; posblAtchFileFlag = false; } if (!posblAtchFileFlag) model.addAttribute("message", flashMessage); return posblAtchFileFlag; } /** * ************************************ 사용자 ************************************ */ /** * (사용자)대관현황 목록 데이터를 조회한다. (달력) * * @param ResveVO * @param model * @return * @throws Exception */ @RequestMapping("/web/cop/resve/selectResveListAjax.do") public ModelAndView selectResveListAjaxWeb(@ModelAttribute("searchVO") ResveVO resveVO, ModelMap model, @RequestParam Map commandMap) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); Calendar cal = Calendar.getInstance(); String searchYear = (String) commandMap.get("searchYear"); String searchMonth = (String) commandMap.get("searchMonth"); LOGGER.debug("resveList(web) input searchYear: " + searchYear + " searchMonth: " + searchMonth); if (searchYear == null || searchMonth == null || ("").equals(searchYear) || ("").equals(searchMonth)) { int iYear = cal.get(java.util.Calendar.YEAR); int iMonth = cal.get(java.util.Calendar.MONTH); searchYear = Integer.toString(iYear); searchMonth = (iMonth+1) < 10 ? "0" + Integer.toString(iMonth+1) : Integer.toString(iMonth+1); } resveVO.setSearchDate(searchYear + searchMonth + "01"); // 년월해당 전시관 내역 조회 List result = resveManageService.selectResveManageListWeb(resveVO); // 조회 결과 파싱 JSONObject resultList = new JSONObject(); resultList.put("searchYear", searchYear); resultList.put("searchMonth", searchMonth); for (ResveVO vo : result) { String[] exRoomArr = new String[5]; exRoomArr[0] = vo.getExRoom1(); exRoomArr[1] = vo.getExRoom2(); exRoomArr[2] = vo.getExRoom3(); exRoomArr[3] = vo.getExRoom5Am(); exRoomArr[4] = vo.getExRoom5Pm(); JSONObject resveJson = new JSONObject(); for (int i=0; i < exRoomArr.length; i++) { StringTokenizer strTk = new StringTokenizer(exRoomArr[i], ","); String tmpExRoom = strTk.hasMoreTokens() ? strTk.nextToken() : ""; String[] tmpArr = tmpExRoom.split("\\|"); JSONObject infoJson = new JSONObject(); if (tmpArr.length == 3) { infoJson.put("applyNum", tmpArr[0]); infoJson.put("exName", tmpArr[1]); infoJson.put("authorName", tmpArr[2]); } else { infoJson.put("applyNum", "null"); } infoJson.put("idx", i); String exRoomIdx = Integer.toString(i+1); if (("4").equals(exRoomIdx)) exRoomIdx = "5Am"; else if (("5").equals(exRoomIdx)) exRoomIdx = "5Pm"; resveJson.put("exRoom"+exRoomIdx, infoJson); } // LOGGER.debug(vo.getStrDate()); resultList.put(vo.getStrDate(), resveJson); } LOGGER.debug("resveList(web) search searchYear: " + searchYear + " searchMonth: " + searchMonth); // model.addAttribute("resultList", result); modelAndView.addObject("resultList", resultList); return modelAndView; } /** * (사용자)대관현황 목록 화면을 조회한다. (달력) * * @param searchVO * @param commandMap * @param indvdlSchdulManageVO * @param model * @return "/cop/smt/sim/EgovIndvdlSchdulManageMonthList" * @throws Exception */ @RequestMapping(value="/web/cop/resve/selectResveList.do") public String selectResveListWeb(@ModelAttribute("searchVO") ResveVO resveVO, ModelMap model) throws Exception { //if (!checkAuthority(model)) return "cmm/uat/uia/EgovLoginUsr"; // server-side 권한 확인 //일정구분 검색 유지 // model.addAttribute("searchKeyword", commandMap.get("searchKeyword") == null ? "" : (String)commandMap.get("searchKeyword")); // model.addAttribute("searchCondition", commandMap.get("searchCondition") == null ? "" : (String)commandMap.get("searchCondition")); /*java.util.Calendar cal = java.util.Calendar.getInstance(); String sYear = resveVO.getSearchYear(); String sMonth = resveVO.getSearchMonth(); sYear = "2018"; sMonth = "11"; int iYear = cal.get(java.util.Calendar.YEAR); int iMonth = cal.get(java.util.Calendar.MONTH); //int iDate = cal.get(java.util.Calendar.DATE); //검색 설정 String sSearchDate = ""; if(("").equals(sYear) || ("").equals(sMonth)){ sSearchDate += Integer.toString(iYear); sSearchDate += Integer.toString(iMonth+1).length() == 1 ? "0" + Integer.toString(iMonth+1) : Integer.toString(iMonth+1); }else{ iYear = Integer.parseInt(sYear); iMonth = Integer.parseInt(sMonth); sSearchDate += sYear; sSearchDate += Integer.toString(iMonth+1).length() == 1 ? "0" + Integer.toString(iMonth+1) :Integer.toString(iMonth+1); } model.addAttribute("schdulSe", null); model.addAttribute("searchMonth", sSearchDate); model.addAttribute("searchMode", "MONTH"); model.addAttribute("resultList", null);*/ return "/web/cop/resve/resveList"; } }