package cokr.xit.fims.crdn.web; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.apache.poi.ss.usermodel.CellStyle; import org.springframework.web.servlet.ModelAndView; import cokr.xit.base.code.CommonCode; import cokr.xit.base.file.service.FileQuery; import cokr.xit.base.file.service.bean.FileBean; import cokr.xit.base.file.xls.XLSWriter; import cokr.xit.base.file.xls.XLSWriter.CellDef; import cokr.xit.base.file.xls.XLSWriter.CommentSupport; import cokr.xit.base.file.xls.XLSWriter.Styler; import cokr.xit.base.user.ManagedUser; import cokr.xit.base.user.dao.UserMapper; import cokr.xit.base.web.ApplicationController; import cokr.xit.fims.cmmn.CellDecorator; import cokr.xit.fims.cmmn.CmmnUtil; import cokr.xit.fims.cmmn.service.bean.StngBean; import cokr.xit.fims.crdn.Crdn; import cokr.xit.fims.crdn.CrdnQuery; import cokr.xit.fims.crdn.dao.GlobalStngMapper; import cokr.xit.fims.crdn.service.CrdnService; import cokr.xit.fims.crdn.service.CrdnStngService; import cokr.xit.foundation.data.DataObject; /**단속 관리 서비스 웹 컨트롤러.
* {웹 컨텍스트}/crdn/crdn06 로 접근할 수 있다. * @author leebj */ public class Crdn06Controller extends ApplicationController { public static final String CLASS_URL = "/crdn/crdn06"; public class METHOD_URL { public static final String crackdownManagementMain = "/010/main.do" , getCrackdownList = "/010/list.do" , removeCrackdown = "/010/remove.do" , removeCrackdownPayer = "/010/removeCrdnPayer.do" , countCrdn = "/010/nocs.do" , sendCrdn = "/010/sendCrdn.do" , getCrackdownInfo = "/020/info.do" , updateCrackdown = "/020/update.do" , getCrackdownStatusInfo = "/030/info.do" , updateCrackdownStatus = "/030/update.do" ; } @Resource(name="crdnService") private CrdnService crdnService; @Resource(name="crdnStngService") private CrdnStngService crdnStngService; @Resource(name="userMapper") protected UserMapper userMapper; @Resource(name="globalStngMapper") protected GlobalStngMapper globalStngMapper; @Resource(name = "fileBean") private FileBean fileBean; @Resource(name = "stngBean") private StngBean stngBean; /** 단속 관리 메인화면을 연다. * @return fims/crdn/crdn06010-main */ public ModelAndView crackdownManagementMain(String openType, String taskSeCd) { ModelAndView mav = new ModelAndView(); mav.setViewName("fims/crdn/crdn06010-main"); mav.addObject("pageName", "crdn06010" + ifEmpty(openType, ()-> "")); if(!ifEmpty(taskSeCd, ()-> "").equals("")) { mav.addObject("taskSeCd", taskSeCd); } Map> commonCodes = getCodesOf("FIM002", "FIM003", "FIM005", "FIM010", "FIM022", "FIM026", "FIM034", "FIM054"); mav.addObject("FIM003List", commonCodes.get("FIM003")); mav.addObject("FIM005List", commonCodes.get("FIM005")); mav.addObject("FIM010List", commonCodes.get("FIM010")); mav.addObject("FIM054List", commonCodes.get("FIM054")); mav.addObject("TaskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054"))); addCodes(commonCodes, mav, "FIM002", "FIM003", "FIM010", "FIM022", "FIM026", "FIM034"); return mav; } /**단속자료 목록을 조회한다.
* {@link CrdnService#getCrackdownList(CrdnQuery)} 참고 * @param query 단속자료 목록 조회 조건 * @return jsonView */ public ModelAndView getCrackdownList(CrdnQuery query) { setFetchSize(query); ManagedUser currentUser = userMapper.getUser(currentUser().getAccount(), currentUser().getInstitute()); String curDeptCode = currentUser.getDeptCode(); String sggCd = currentUser.getOrgID(); query.setSggCd(sggCd); if("xls".equals(query.getDownload())) { List cellDefs = fromJson(query.getCellDefs(), CellDef.listType()); if(ifEmpty(query.getIncludePhoto(), () -> "").equals("Y")) { cellDefs.add((new CellDef()).setLabel("사진1").setWidth(18).setField("CRDN_PHOTO_PATH1")); cellDefs.add((new CellDef()).setLabel("사진2").setWidth(18).setField("CRDN_PHOTO_PATH2")); } XLSWriter xlsx = new XLSWriter() .setFilename("단속자료 목록.xlsx") .worksheet(0); CellStyle center = xlsx.cellStyle(Styler.CENTER); CellStyle dateYMD = xlsx.yyyy_mm_dd(); CellStyle dateDT = xlsx.yyyy_mm_dd_hh_mm_ss(); List list = crdnService.getCrackdownList(query.setFetchSize(0)); if(ifEmpty(query.getIncludePhoto(), () -> "").equals("Y")) { for(DataObject crdn : list) { String crdnId = crdn.string("CRDN_ID"); FileQuery fileQuery = new FileQuery(); fileQuery.setInfoType(Crdn.INF_TYPE); fileQuery.setInfoKeys(crdnId); List fileInfoList = fileBean.getFileList(fileQuery); if(fileInfoList != null && fileInfoList.size() > 0) { for(int j=0; (j < fileInfoList.size()) && (j < 2); j++) { crdn.set("CRDN_PHOTO_PATH"+(j+1), fileInfoList.get(j).string("FILE_PATH")); } } } } Map valueMap = new HashMap(); valueMap.put("자료출처", xlsx.style("CRDN_INPT_SE_NM", center)); valueMap.put("위반일시", xlsx.format(o -> xlsx.str2datetime(o.get("CRDN_YMD_TM"))).style(dateDT)); valueMap.put("사진건수", xlsx.style("ATCH_FILE_CNT", center)); valueMap.put("장애차량확인", xlsx.style("PARKNG_PSBLTY_RSLT_NM", center)); valueMap.put("처리상태", xlsx.style("CRDN_STTS_NM", center)); valueMap.put("제외사유", xlsx.style("LEVY_EXCL_RSN_NM", center)); valueMap.put("제외처리일자", xlsx.format(o -> xlsx.str2date(o.get("LEVY_EXCL_YMD"))).style(dateYMD)); if(ifEmpty(query.getIncludePhoto(), () -> "").equals("Y")) { CommentSupport commentSupport = new CommentSupport(xlsx); CellDecorator col1 = CmmnUtil.photoCellForApproval(commentSupport, "CRDN_PHOTO_PATH1"); CellDecorator col2 = CmmnUtil.photoCellForApproval(commentSupport, "CRDN_PHOTO_PATH2"); valueMap.put("사진1", xlsx.format(col1.value()).onCell(col1.memo())); valueMap.put("사진2", xlsx.format(col2.value()).onCell(col2.memo())); } CellDef.setValues(cellDefs, valueMap); xlsx.cell(0, 0) .value("단속자료 목록", center) .merge(0, cellDefs.size()-1) .cell(3, 0) .rowValues(CellDef.header(cellDefs, () -> CmmnUtil.headerStyle(xlsx))) .cell(4, 0) .values(list, CellDef.values(cellDefs)); return new ModelAndView("xlsView").addObject("xls", xlsx); } return setCollectionInfo(new ModelAndView("jsonView"), crdnService.getCrackdownList(query),"",""); } /**지정한 단속 ID에 해당하는 단속 대장를 제거한다. * @param crdnID 단속 ID * @return jsonView *
 {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }
*/ public ModelAndView removeCrackdown(Crdn crdn) { boolean saved = false; String rtnMsg = crdnService.removeCrackdown(crdn); if (rtnMsg.contains("[S]")) { saved = true; } else { saved = false; } return new ModelAndView("jsonView") .addObject("saved", saved) .addObject("rtnMsg", rtnMsg); } /**지정한 단속 ID에 해당하는 납부자 ID를 제거한다. * @param crdnID 단속 ID * @return jsonView *
 {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }
*/ public ModelAndView removeCrackdownPayer(Crdn crdn) { boolean saved = false; String rtnMsg = crdnService.removeCrackdownPayer(crdn); if (rtnMsg.contains("[S]")) { saved = true; } else { saved = false; } return new ModelAndView("jsonView") .addObject("saved", saved) .addObject("rtnMsg", rtnMsg); } /**지정한 조회조건으로 단속 건수를 반환한다. * @param CrdnQuery 조회조건 * @return jsonView */ public ModelAndView countCrdn(CrdnQuery crdnQuery) { ModelAndView mav = new ModelAndView("jsonView"); int crdnCount = crdnService.countCrdn(crdnQuery); mav.addObject("crdnCount", crdnCount); return mav; } /**단속자료를 압축파일로 생성하여 세외수입으로 전송한다. * @param crdnIds 단속ID 목록 * @return jsonView *
 {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }
*/ public ModelAndView sendCrdn(String... crdnIds) { ModelAndView mav = new ModelAndView("jsonView"); boolean saved = false; String rtnMsg = crdnService.sendCrdn(crdnIds); if(rtnMsg.contains("[S]")) { saved = true; } mav.addObject("saved", saved); mav.addObject("rtnMsg", rtnMsg); return mav; } /**지정한 ID의 단속 정보(info)를 반환한다. * @param query 단속 대장 조회 조건 * @return fims/crdn/crdn06020-info 또는 jsonView *
{
	 *     "crdnInfo": 단속 정보
	 * }
*/ public ModelAndView getCrackdownInfo(CrdnQuery query) { DataObject crdnInfo = crdnService.getCrackdownInfo(query); boolean json = jsonResponse(); ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/crdn/crdn06020-info"); // 법정동 ManagedUser currentUser = userMapper.getUser(currentUser().getAccount(), currentUser().getInstitute()); String curDeptCode = currentUser.getDeptCode(); String sggCd = currentUser.getOrgID(); mav.addObject("stdgNmList", globalStngMapper.selectStdgNmList(sggCd)); // 공통코드 - 위반 내역 코드 String vltnByTask = ""; switch(query.getTaskSeCd()) { case "PVS" -> { vltnByTask = "FIM004"; } case "BPV" -> { vltnByTask = "FIM005"; } case "DPV" -> { vltnByTask = "FIM006"; } case "ECA" -> { vltnByTask = "FIM061"; } case "TPV" -> { vltnByTask = "FIM064"; } } Map> commonCodes = getCodesOf("FIM011","FIM053","LVS005",vltnByTask); mav.addObject("FIM011List", commonCodes.get("FIM011")); mav.addObject("FIM053List", commonCodes.get("FIM053")); mav.addObject("LVS005List", commonCodes.get("LVS005")); mav.addObject("VLTNList", commonCodes.get(vltnByTask)); // 단속조 List teamList = crdnStngService.getTeamList(query); // 단속부가정보(TB_CRDN_ADI) 공통코드 switch(query.getTaskSeCd()) { case "PVS" -> { commonCodes = getCodesOf("FIM002","FIM007","FIM009"); mav.addObject("FIM002List", commonCodes.get("FIM002")); mav.addObject("FIM007List", commonCodes.get("FIM007")); mav.addObject("FIM009List", commonCodes.get("FIM009")); mav.addObject("TeamList", teamList); } case "BPV" -> { commonCodes = getCodesOf("FIM002","FIM009"); mav.addObject("FIM002List", commonCodes.get("FIM002")); mav.addObject("FIM009List", commonCodes.get("FIM009")); mav.addObject("TeamList", teamList); } case "DPV" -> { commonCodes = getCodesOf("FIM034"); mav.addObject("FIM034List", commonCodes.get("FIM034")); } case "ECA" -> { } case "TPV" -> { } } return mav .addObject("pageName", "crdn06020") // .addObject("crdnInfo", json ? crdnInfo : toJson(crdnInfo)) ; } /**지정한 단속 ID에 해당하는 단속 대장를 수정한다. * @param crdnID 단속 ID * @return jsonView *
 {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }
*/ public ModelAndView updateCrackdown(Crdn crdn) { boolean saved = false; String rtnMsg = crdnService.updateCrackdown(crdn); if (rtnMsg.contains("[S]")) { saved = true; } else { saved = false; } return new ModelAndView("jsonView") .addObject("saved", saved) .addObject("rtnMsg", rtnMsg); } /**지정한 ID의 단속 처리 상태 정보(info)를 반환한다. * @param query 단속 대장 조회 조건 * @return fims/crdn/crdn06030-info 또는 jsonView *
{
	 *     "crdnInfo": 단속 정보
	 * }
*/ public ModelAndView getCrackdownStatusInfo(CrdnQuery query) { DataObject crdnInfo = crdnService.getCrackdownInfo(query); boolean json = jsonResponse(); ModelAndView mav = new ModelAndView(json ? "jsonView" : "fims/crdn/crdn06030-info"); Map> commonCodes = getCodesOf("FIM010"); return mav .addObject("pageName", "crdn06030") // .addObject("FIM010List", commonCodes.get("FIM010")) // 단속 처리 상태 코드(CRDN_STTS_CD) .addObject("crdnInfo", json ? crdnInfo : toJson(crdnInfo)) ; } /**지정한 단속 ID에 해당하는 단속 처리 상태를 수정한다. * @param crdnID 단속 ID * @return jsonView *
 {
	 *     "affected": 저장된 정보수
	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
	 * }
*/ public ModelAndView updateCrackdownStatus(Crdn crdn) { boolean saved = false; String rtnMsg = crdnService.updateCrackdownStatus(crdn); if (rtnMsg.contains("[S]")) { saved = true; } else { saved = false; } return new ModelAndView("jsonView") .addObject("saved", saved) .addObject("rtnMsg", rtnMsg); } }