You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2264 lines
122 KiB
Java

package cokr.xit.fims.sndb.web;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.poi.ss.usermodel.CellStyle;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import cokr.xit.applib.Print;
import cokr.xit.base.code.CommonCode;
import cokr.xit.base.docs.xls.CellDef;
import cokr.xit.base.docs.xls.Format;
import cokr.xit.base.docs.xls.Style;
import cokr.xit.base.docs.xls.XLSWriter;
import cokr.xit.base.file.service.FileQuery;
import cokr.xit.base.file.service.bean.FileBean;
import cokr.xit.base.web.ApplicationController;
import cokr.xit.fims.base.service.bean.OgdpBean;
import cokr.xit.fims.cmmn.CmmnQuery;
import cokr.xit.fims.cmmn.FimsPrintOption;
import cokr.xit.fims.cmmn.OtptStngQuery;
import cokr.xit.fims.cmmn.OutsourcingFileMaker;
import cokr.xit.fims.cmmn.OutsourcingStngQuery;
import cokr.xit.fims.cmmn.dao.OtptStngMapper;
import cokr.xit.fims.cmmn.hwp.format.SvbtcList;
import cokr.xit.fims.cmmn.pdf.print.format.Advntce;
import cokr.xit.fims.cmmn.pdf.print.format.Nht;
import cokr.xit.fims.cmmn.service.bean.OutsourcingStngBean;
import cokr.xit.fims.cmmn.service.bean.StngBean;
import cokr.xit.fims.cmmn.xls.FormatMaker;
import cokr.xit.fims.cmmn.xls.StyleMaker;
import cokr.xit.fims.crdn.Crdn;
import cokr.xit.fims.mngt.service.bean.TaskBean;
import cokr.xit.fims.mngt.service.bean.TaskProcessor;
import cokr.xit.fims.sndb.SndbQuery;
import cokr.xit.fims.sndb.Sndng;
import cokr.xit.fims.sndb.SndngDtl;
import cokr.xit.fims.sndb.Svbtc;
import cokr.xit.fims.sndb.service.SndngDtlService;
import cokr.xit.fims.sndb.service.SndngService;
import cokr.xit.fims.sndb.service.SvbtcService;
import cokr.xit.fims.sndb.service.bean.SvbtcBean;
import cokr.xit.fims.sprt.SprtQuery;
import cokr.xit.fims.sprt.dao.IntegrationSearchMapper;
import cokr.xit.fims.sprt.service.IntegrationSearchService;
import cokr.xit.fims.sprt.service.bean.MediaBean;
import cokr.xit.fims.task.Task;
import cokr.xit.foundation.UserInfo;
import cokr.xit.foundation.data.DataObject;
import cokr.xit.foundation.data.DataProc;
/**발송대장 서비스의 웹 컨트롤러
*
* <p>상세 설명:
*
* <pre>
* ============ 변경 이력 ============
* 2023-08-24 JoJH 최초 작성
* ================================
* </pre>
*/
@Controller
@RequestMapping(name="발송반송", value=Sndb01Controller.CLASS_URL)
public class Sndb01Controller extends ApplicationController {
public static final String CLASS_URL = "/sndb/sndb01";
public class METHOD_URL {
public static final String
warningTargetMain = "/010/main.do" // 계고장 발송 대상 메인 화면
, getWarningTargetList = "/010/list.do" // 계고장 발송 대상 목록 조회
, getWarningTargetInfo = "/020/info.do" // 계고장 발송 대상 조회
, createWarningSendingList = "/020/createList.do" // 계고장 발송 대상 목록의 발송 등록
, warningSendingMain = "/030/main.do" // 계고장 발송 현황 메인 화면
, getWarningSendingList = "/030/list.do" // 계고장 발송 현황 목록 조회
, removeWarningSending = "/030/remove.do" // 계고장 발송 현황 삭제
, getWarningSendingDetailInfo = "/040/info.do" // 계고장 발송 현황 상세 화면
, getWarningSendingDetailList = "/040/list.do" // 계고장 발송 현황 상세 목록 조회
, advanceNoticeTargetMain = "/050/main.do" // 사전통지 발송 대상 메인 화면
, getAdvanceNoticeTargetList = "/050/list.do" // 사전통지 발송 대상 목록 조회
, getAdvanceNoticeTargetInfo = "/060/info.do" // 사전통지 발송 대상 조회
, createAdvanceNoticeSendingList = "/060/createList.do" // 사전통지 발송 대상 목록의 발송 등록
, advanceNoticeSendingMain = "/070/main.do" // 사전통지 발송 현황 메인 화면
, getAdvanceNoticeSendingList = "/070/list.do" // 사전통지 발송 현황 목록 조회
, removeAdvanceNoticeSending = "/070/remove.do" // 사전통지 발송 현황 삭제
, getAdvanceNoticeSendingDetailInfo = "/080/info.do" // 사전통지 발송 현황 상세 화면
, getAdvanceNoticeSendingDetailList = "/080/list.do" // 사전통지 발송 현황 상세 목록 조회
, createSendingLink = "/080/createSndngLink.do" // 사전통지 발송 현황 상세 목록의 우편통합 발송 연계 등록
, makeAdvanceNoticePdf = "/080/makeAdvntcePdf.do" // 사전통지 발송 현황 사전통지서 출력(PDF)
, makeAdvanceNoticeOutsourcing = "/080/makeAdvntceOutsourcing.do" // 사전통지 발송 현황 사전통지서 출력(외주파일)
, noticeSheetTargetMain = "/090/main.do" // 고지서 발송 대상 메인 화면
, getNoticeSheetTargetList = "/090/list.do" // 고지서 발송 대상 목록 조회
, getNoticeSheetTargetInfo = "/100/info.do" // 고지서 발송 대상 조회
, createNoticeSheetSendingList = "/100/createList.do" // 고지서 발송 대상 목록의 발송 등록
, noticeSheetSendingMain = "/110/main.do" // 고지서 발송 현황 메인 화면
, getNoticeSheetSendingList = "/110/list.do" // 고지서 발송 현황 상세 목록 조회
, removeNoticeSheetSending = "/110/remove.do" // 고지서 발송 현황 삭제
, getNoticeSheetSendingDetailInfo = "/120/info.do" // 고지서 발송 현황 화면
, getNoticeSheetSendingDetailList = "/120/list.do" // 고지서 발송 현황 상세 목록 조회
, makeNoticeSheetPdf = "/120/makeNhtPdf.do" // 고지서 발송 현황 사전통지서 출력(PDF)
, makeNoticeSheetOutsourcing = "/120/makeNhtOutsourcing.do" // 고지서 발송 현황 사전통지서 출력(외주파일)
, sendingDetailInfo = "/210/info.do" // 수기 반송 등록 상세
, getSendingDetailList = "/210/list.do" // 수기 반송 등록 조회
, sendBackMain = "/220/main.do" // 반송 현황 메인 화면
, getSendBackList = "/220/list.do" // 반송 현황 목록 조회
, removeSendBack = "/220/remove.do" // 반송 삭제
, getSendBackInfo = "/230/info.do" // 반송 정보 조회
, createSendBackList = "/230/createSndbkList.do" // 사전통지 발송 상세 목록의 반송 확인(등록)
, createSendBack = "/230/create.do" // 반송 등록
, updateSendBack = "/230/update.do" // 반송 수정
, serviceByPublicNoticeMain = "/240/main.do" // 공시송달 현황 메인 화면
, getServiceByPublicNoticeList = "/240/list.do" // 공시송달 현황 목록 조회
, removeServiceByPublicNotice = "/240/remove.do" // 공시송달 삭제
, makeSvbtcFileFromHwpFormat = "/240/makeSvbtcHwp.do" // 공시송달 한글 파일 출력
, getServiceByPublicNoticeDetailInfo = "/250/info.do" // 공시송달 상세 화면
, getServiceByPublicNoticeDetailList = "/250/list.do" // 공시송달 상세 목록 조회
, makeSvbtcDetailsFileFromHwpFormat = "/250/makeSvbtcDtlHwp.do" // 공시송달 상세 한글 파일 출력
, removeServiceByPublicNoticeEach = "/250/remove.do" // 공시송달 개별 삭제
, getServiceByPublicNoticeInfo = "/260/info.do" // 공시송달 정보
, createServiceByPublicNotice = "/260/create.do" // 공시송달 등록
, updateServiceByPublicNotice = "/260/update.do" // 공시송달 수정
, setNonTaxReceiptIndividualA01List = "/991/nxrpA01List.do" // 과태료대장 단속정보 등록(실시간) A01
, getNonTaxReceiptIndividualA03List = "/991/nxrpA03List.do" // 과태료대장 상세조회(실시간) A03
, getNonTaxReceiptSpecialB01List = "/991/nxrpB01List.do" // 체납상세세목정보(실시간) B01
;
}
/**발송대장 서비스*/
@Resource(name="sndngService")
private SndngService sndngService;
/**발송 상세 서비스*/
@Resource(name="sndngDtlService")
private SndngDtlService sndngDtlService;
/**공시송달 대장 서비스*/
@Resource(name="svbtcService")
private SvbtcService svbtcService;
/**업무 정보 서비스*/
@Resource(name="taskBean")
private TaskBean taskBean;
/**통합 조회 서비스*/
@Resource(name="integrationSearchService")
private IntegrationSearchService integrationSearchService;
@Resource(name="stngBean")
private StngBean stngBean;
@Resource(name="fileBean")
private FileBean fileBean;
@Resource(name = "ogdpBean")
private OgdpBean ogdpBean;
@Resource(name="svbtcBean")
private SvbtcBean svbtcBean;
@Resource(name="mediaBean")
private MediaBean mediaBean;
@Resource(name="otptStngMapper")
private OtptStngMapper otptStngMapper;
@Resource(name="outsourcingStngBean")
protected OutsourcingStngBean outsourcingStngBean;
@Resource(name="integrationSearchMapper")
private IntegrationSearchMapper integrationSearchMapper;
/**계고장 발송 대상 자료 메인화면(sndb/sndb01/010-main)을 연다.
* @return /sndb/sndb01/010-main
*/
@RequestMapping(name = "계고장 발송 대상 메인", value = METHOD_URL.warningTargetMain)
public ModelAndView warningTargetMain() {
// View(jsp)에서 사용할 공통코드를 조회
List<String> cdGrps = TaskProcessor.get().getVltnCdGrps();
cdGrps.add("FIM022"); // 부과 제외 사유 코드(LEVY_EXCL_RSN_CD)
cdGrps.add("FIM054"); // 업무구분 코드(TASE_SE_CD)
String[] groupIDs = cdGrps.toArray(new String[cdGrps.size()]);
Map<String, List<CommonCode>> commonCodes = getCodesOf(groupIDs);
ModelAndView mav = new ModelAndView("fims/sndb/sndb01010-main")
.addObject("pageName", "sndb01010") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", currentUser().getOrgID()) // 시군구 코드(SGG_CD)
.addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054"))); // 시군구에서 사용하는 업무 목록
commonCodes.forEach((grpID, codes) -> mav.addObject(grpID + "List", codes));
return addCodes(commonCodes, mav, groupIDs);
}
/**계고장 발송 대상 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "wrngSndngTrgtList": [계고장 발송 대상 목록]
* "wrngSndngTrgtStart": 계고장 발송 대상 목록 시작 인덱스
* "wrngSndngTrgtFetch": 한 번에 가져오는 계고장 발송 대상 목록 수
* "wrngSndngTrgtTotal": 조회 결과 찾은 전체 계고장 발송 대상 수
* }</code></pre>
*/
@Task
@RequestMapping(name="계고장 발송 대상 목록 조회", value=METHOD_URL.getWarningTargetList)
public ModelAndView getWarningTargetList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngService.getWrngTrgtList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = sndngService.getWrngTrgtList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("업무구분", format.of("TASK_SE_NM").style(center));
valueMap.put("계고일자", FormatMaker.yyyy_mm_dd(format, "LEVY_EXCL_YMD").style(dateYMD));
valueMap.put("계고사유", format.of("LEVY_EXCL_RSN_NM"));
valueMap.put("기타내용", format.of("ETC_CN"));
valueMap.put("민원신청번호", format.of("CVLCPT_APLY_NO").style(center));
valueMap.put("민원접수번호", format.of("CVLCPT_RCPT_NO").style(center));
valueMap.put("민원접수일자", FormatMaker.yyyy_mm_dd(format, "CVLCPT_RCPT_YMD").style(dateYMD));
valueMap.put("민원처리담당자", format.of("CVLCPT_PRCS_PIC_NM").style(center));
valueMap.put("민원처리결과", format.of("CVLCPT_PRCS_NM").style(center));
valueMap.put("단속일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "CRDN_YMD_TM").style(dateDT));
valueMap.put("차량번호", format.of("VHRNO"));
valueMap.put("위반항목", format.of("VLTN_ARTCL"));
valueMap.put("단속법정동", format.of("CRDN_STDG_NM"));
valueMap.put("단속장소", format.of("CRDN_PLC"));
valueMap.put("상세단속장소", format.of("DTL_CRDN_PLC"));
valueMap.put("단속원금", format.of("FFNLG_CRDN_AMT").style(numeric));
valueMap.put("처리상태", format.of("CRDN_STTS_NM"));
valueMap.put("납부자명", format.of("RTPYR_NM"));
valueMap.put("납부자생일", format.of("RTPYR_BRDT_MASK").style(center));
valueMap.put("우편번호", format.of("ZIP").style(center));
valueMap.put("주소", format.of("ADDR"));
valueMap.put("상세주소", format.of("DTL_ADDR"));
valueMap.put("단속특별구역", format.of("CRDN_SPAREA_NM").style(center));
valueMap.put("사용연료", format.of("USE_FUEL_NM").style(center));
valueMap.put("주차가능여부", format.of("PRK_PSBLTY_RSLT_NM").style(center));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("계고장 발송 대상").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("계고장발송대상" + "_목록_" + now() + ".xlsx"));
}
}
private String now() {
return dateFormats.format("yyyyMMdd_HHmmss", System.currentTimeMillis());
}
/**계고장 발송 대상 정보 화면(sndb/sndb01/020-info)을 연다.
* @param crdnIds 단속 Ids
* @return fims/sndb/sndb01020-info 또는 jsonView
* <pre>{
* "wrngSndngTrgts": [계고장 발송 대상 목록]
* }</pre>
*/
@Task
@RequestMapping(name="계고장 발송 대상 상세조회", value=METHOD_URL.getWarningTargetInfo)
public ModelAndView getWarningTargetInfo(HttpServletRequest hReq, SndbQuery req) {
ModelAndView mav = getWarningTargetList(req);
if (jsonResponse()) {
mav.setViewName("jsonView");
} else {
String egp002 = "EGP002"; // 우편취급 구분
Map<String, List<CommonCode>> commonCodes = getCodesOf(egp002);
mav.setViewName("fims/sndb/sndb01020-info");
mav.addObject("callPurpose", req.getCallPurpose()) // 호출 용도
.addObject("pageName", "sndb01020") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", req.getSggCd()) // 시군구 코드(SGG_CD)
.addObject("taskSeCd", req.getTaskSeCd()) // 업무 구분 코드(TASK_SE_CD)
.addObject("vltnCd", req.getSchVltnCd()) // 위반 코드(VLTN_CD)
.addObject("mainQuery", toJson(req)) // 검색 조건
.addObject("List", toJson(mav.getModel().get("List"))) // 데이터
.addObject("Paging", toJson(mav.getModel().get("Paging"))) // 페이징
.addObject(egp002, toJson(commonCodes.get(egp002)))
;
}
return mav;
}
/**계고장 발송 대상을 조회하여 발송대장에 등록한다.
* @param req 계고장 발송 대상 조회, sndng 발송대장
* @return jsonView
* <pre><code> {
* "saved": 등록되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="계고장 발송 등록", value=METHOD_URL.createWarningSendingList)
public ModelAndView createWarningSendingList(SndbQuery req, Sndng sndng) {
DataProc result = sndngService.createWrngSndngList(req, sndng);
return new ModelAndView("jsonView")
.addObject("saved", result.isSuccess())
.addObject("sndng", result.getTarget())
.addObject("rtnMsg", result.getMessage());
}
/**계고장 발송 현황 메인화면(sndb/sndb01/030-main)을 연다.
* @return /sndb/sndb01/030-main
*/
@RequestMapping(name = "계고장 발송 현황 메인", value = METHOD_URL.warningSendingMain)
public ModelAndView warningSendingMain() {
// View(jsp)에서 사용할 공통코드를 조회
Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM054", "FIM067");
return new ModelAndView("fims/sndb/sndb01030-main")
.addObject("pageName", "sndb01030") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", currentUser().getOrgID()) // 시군구 코드(SGG_CD)
.addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054"))) // 시군구에서 사용하는 업무 목록
.addObject("FIM067List", commonCodes.get("FIM067")) // 발송 등록 구분 코드(SNDNG_REG_SE_CD)
;
}
/**계고장 발송 현황 목록을 조회하여 반환한다.
* {@link SndngService#getWarningSendingList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngList": [계고장 발송 현황 목록]
* "sndngStart": 계고장 발송 현황 목록 시작 인덱스
* "sndngFetch": 한 번에 가져오는 계고장 발송 현황 목록 수
* "sndngTotal": 조회 결과 찾은 전체 계고장 발송 현황 수
* }</code></pre>
*/
@Task
@RequestMapping(name="계고장 발송 현황 목록 조회", value=METHOD_URL.getWarningSendingList)
public ModelAndView getWarningSendingList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngService.getWrngSndngList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = sndngService.getWrngSndngList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("업무구분", format.of("TASK_SE_NM").style(center));
valueMap.put("등록구분", format.of("SNDNG_REG_SE_NM").style(center));
valueMap.put("위반항목", format.of("VLTN_ARTCL"));
valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_YMD").style(dateYMD));
valueMap.put("납기일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_END_YMD").style(dateYMD));
valueMap.put("총건수", format.of("TNOCS").style(numeric));
valueMap.put("총금액", format.of("GRAMT").style(numeric));
valueMap.put("문서번호", format.of("DOC_NO"));
valueMap.put("제목", format.of("TTL_NM"));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("계고장 발송 현황").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("계고장발송현황" + "_목록_" + now() + ".xlsx"));
}
}
/**계고장 발송 현황 - 발송상세 화면(sndb/sndb01/040-info)을 연다.
* @param sndngId 발송 ID
* @return fims/sndb/sndb01040-info 또는 jsonView
* <pre>{
* "sndngDtls": [계고장 발송 상세 목록]
* }</pre>
*/
@Task
@RequestMapping(name="계고장 발송 현황 상세 화면", value=METHOD_URL.getWarningSendingDetailInfo)
public ModelAndView getWarningSendingDetailInfo(HttpServletRequest hReq, SndbQuery req) {
ModelAndView mav = getWarningSendingDetailList(req);
if (jsonResponse()) {
mav.setViewName("jsonView");
} else {
mav.setViewName("fims/sndb/sndb01040-info");
mav.addObject("callPurpose", req.getCallPurpose()) // 호출 용도
.addObject("pageName", "sndb01040") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", req.getSggCd()) // 시군구 코드(SGG_CD)
.addObject("taskSeCd", req.getTaskSeCd()) // 업무 구분 코드(TASK_SE_CD)
.addObject("sndngId", req.getSndngId()) // 발송 ID(SNDNG_ID)
.addObject("mainQuery", toJson(req)) // 검색 조건
.addObject("List", toJson(mav.getModel().get("List"))) // 데이터
.addObject("Paging", toJson(mav.getModel().get("Paging"))) // 페이징
;
}
return mav;
}
/**계고장 발송 현황 - 발송상세 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngDtlList": [발송상세 목록]
* "sndngDtlStart": 발송상세 목록 시작 인덱스
* "sndngDtlFetch": 한 번에 가져오는 발송상세 목록 수
* "sndngDtlTotal": 조회 결과 찾은 전체 발송상세 수
* }</code></pre>
*/
@Task
@RequestMapping(name="계고장 발송 현황 상세 목록 조회", value=METHOD_URL.getWarningSendingDetailList)
public ModelAndView getWarningSendingDetailList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngDtlService.getSndngDtlList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<DataObject> list = sndngDtlService.getSndngDtlList(req.setFetchSize(0));
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("발송상태", format.of("SNDNG_DTL_STTS_NM").style(center));
valueMap.put("등기번호", format.of("RG_NO").style(center));
valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_YMD").style(dateYMD));
valueMap.put("납기일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_END_YMD").style(dateYMD));
valueMap.put("성명", format.of("RCPN_NM"));
valueMap.put("우편번호", format.of("RCPN_ZIP").style(center));
valueMap.put("주소", format.of("RCPN_ADDR"));
valueMap.put("상세주소", format.of("RCPN_DTL_ADDR"));
valueMap.put("배달일자", FormatMaker.yyyy_mm_dd(format, "DLVR_YMD").style(dateYMD));
valueMap.put("배달시각", format.of("DLVR_TM").style(center));
valueMap.put("미배달사유", format.of("UNDLVR_RSN_NM"));
valueMap.put("수령인", format.of("ACTL_RCPN_NM"));
valueMap.put("수령인관계", format.of("RCPN_REL_NM"));
valueMap.put("단속일시", format.of("CRDN_DT").style(center));
valueMap.put("차량번호", format.of("VHRNO"));
valueMap.put("단속법정동", format.of("CRDN_STDG_NM"));
valueMap.put("단속장소", format.of("CRDN_PLC"));
valueMap.put("과태료금액", format.of("FFNLG_AMT").style(numeric));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("계고장 발송 상세").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("계고장 발송상세" + "_목록_" + now() + ".xlsx"));
}
}
/**지정한 계고장 발송대장을 제거한다.
* @param sndng 발송대장
* @return jsonView
* <pre><code> {
* "saved": 등록되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="계고장 발송대장 제거", value=METHOD_URL.removeWarningSending)
public ModelAndView removeWarningSending(Sndng sndng) {
String rtnMsg = "";
// 발송 ID 단건 삭제
if (isEmpty(sndng.getSndngIds())) {
rtnMsg = sndngService.removeWrngSndng(sndng);
} else {
// 발송 IDs 만큼 발송 삭제 반복..
for (String sndngId : sndng.getSndngIds()) {
Sndng deltSndng = new Sndng();
deltSndng.setSndngId(sndngId);
deltSndng.setDelRsn(sndng.getDelRsn());
// 발송 삭제 호출
rtnMsg = sndngService.removeWrngSndng(deltSndng);
if (!rtnMsg.contains("[S]")) // 오류가 발생하였으면 종료..
break;
}
}
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**사전통지 발송 대상 자료 메인화면(sndb/sndb01/050-main)을 연다.
* @return /sndb/sndb01/050-main
*/
@RequestMapping(name = "사전통지 발송 대상 메인", value = METHOD_URL.advanceNoticeTargetMain)
public ModelAndView advanceNoticeTargetMain() {
// View(jsp)에서 사용할 공통코드를 조회
List<String> cdGrps = TaskProcessor.get().getVltnCdGrps();
cdGrps.add("FIM054");
String[] groupIDs = cdGrps.toArray(new String[cdGrps.size()]);
Map<String, List<CommonCode>> commonCodes = getCodesOf(groupIDs);
ModelAndView mav = new ModelAndView("fims/sndb/sndb01050-main")
.addObject("pageName", "sndb01050") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", currentUser().getOrgID()) // 시군구 코드(SGG_CD)
.addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054"))); // 시군구에서 사용하는 업무 목록
commonCodes.forEach((grpID, codes) -> mav.addObject(grpID + "List", codes));
return addCodes(commonCodes, mav, groupIDs);
}
/**사전통지 발송 대상 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngList": [사전통지 발송 대상 목록]
* "sndngStart": 사전통지 발송 대상 목록 시작 인덱스
* "sndngFetch": 한 번에 가져오는 사전통지 발송 대상 목록 수
* "sndngTotal": 조회 결과 찾은 전체 사전통지 발송 대상 수
* }</code></pre>
*/
@Task
@RequestMapping(name="사전통지 발송 대상 목록 조회", value=METHOD_URL.getAdvanceNoticeTargetList)
public ModelAndView getAdvanceNoticeTargetList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngService.getAdvntceTrgtList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = sndngService.getAdvntceTrgtList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("업무구분", format.of("TASK_SE_NM").style(center));
valueMap.put("민원신청번호", format.of("CVLCPT_APLY_NO").style(center));
valueMap.put("민원접수번호", format.of("CVLCPT_RCPT_NO").style(center));
valueMap.put("민원접수일자", FormatMaker.yyyy_mm_dd(format, "CVLCPT_RCPT_YMD").style(dateYMD));
valueMap.put("민원처리담당자", format.of("CVLCPT_PRCS_PIC_NM").style(center));
valueMap.put("민원처리결과", format.of("CVLCPT_PRCS_NM").style(center));
valueMap.put("단속일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "CRDN_YMD_TM").style(dateDT));
valueMap.put("차량번호", format.of("VHRNO"));
valueMap.put("위반항목", format.of("VLTN_ARTCL"));
valueMap.put("단속법정동", format.of("CRDN_STDG_NM"));
valueMap.put("단속장소", format.of("CRDN_PLC"));
valueMap.put("상세단속장소", format.of("DTL_CRDN_PLC"));
valueMap.put("과태료금액", format.of("FFNLG_AMT").style(numeric));
valueMap.put("사전통지금액", format.of("ADVNTCE_AMT").style(numeric));
valueMap.put("처리상태", format.of("CRDN_STTS_NM"));
valueMap.put("납부자명", format.of("RTPYR_NM"));
valueMap.put("납부자생일", format.of("RTPYR_BRDT_MASK").style(center));
valueMap.put("우편번호", format.of("ZIP").style(center));
valueMap.put("주소", format.of("ADDR"));
valueMap.put("상세주소", format.of("DTL_ADDR"));
valueMap.put("단속특별구역", format.of("CRDN_SPAREA_NM").style(center));
valueMap.put("사용연료", format.of("USE_FUEL_NM").style(center));
valueMap.put("주차가능여부", format.of("PRK_PSBLTY_RSLT_NM").style(center));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("사전통지 발송 대상").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("사전통지발송대상" + "_목록_" + now() + ".xlsx"));
}
}
/**사전통지 발송 대상 정보 화면(sndb/sndb01/060-info)을 연다.
* @param crdnIds 단속 Ids
* @return fims/sndb/sndb01060-info 또는 jsonView
* <pre>{
* "advntceSndngTrgs": [사전통지 발송 대상 목록]
* }</pre>
*/
@Task
@RequestMapping(name="사전통지 발송 대상 상세조회", value=METHOD_URL.getAdvanceNoticeTargetInfo)
public ModelAndView getAdvanceNoticeTargetInfo(HttpServletRequest hReq, SndbQuery req) {
ModelAndView mav = getAdvanceNoticeTargetList(req);
if (jsonResponse()) {
mav.setViewName("jsonView");
} else {
String egp002 = "EGP002"; // 우편취급 구분
Map<String, List<CommonCode>> commonCodes = getCodesOf(egp002);
mav.setViewName("fims/sndb/sndb01060-info");
// 사전통지 납기일자 조회
CmmnQuery cmmnReq = new CmmnQuery()
.setSggCd(req.getSggCd())
.setTaskSeCd(req.getTaskSeCd());
DataObject advntceInfo = taskBean.getAdvntceYmdInfo(cmmnReq);
mav.addObject("callPurpose", req.getCallPurpose()) // 호출 용도
.addObject("pageName", "sndb01060") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", req.getSggCd()) // 시군구 코드(SGG_CD)
.addObject("taskSeCd", req.getTaskSeCd()) // 업무 구분 코드(TASK_SE_CD)
.addObject("vltnCd", req.getSchVltnCd()) // 위반 코드(VLTN_CD)
.addObject("mainQuery", toJson(req)) // 검색 조건
.addObject(egp002, toJson(commonCodes.get(egp002)))
.addObject("advntceInfo", toJson(advntceInfo)) // 사전통지 기간 정보
.addObject("List", toJson(mav.getModel().get("List"))) // 데이터
.addObject("Paging", toJson(mav.getModel().get("Paging"))) // 페이징
;
}
return mav;
}
/**사전통지 발송 대상을 등록한다.
* @param sndng 발송 정보
* @return jsonView
* <pre><code> {
* "saved": 등록되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="사전통지 발송 등록", value=METHOD_URL.createAdvanceNoticeSendingList)
public ModelAndView createAdvanceNoticeSendingList(SndbQuery req, Sndng sndng) {
DataProc result = sndngService.createAdvntceSndngList(req, sndng);
return new ModelAndView("jsonView")
.addObject("saved", result.isSuccess())
.addObject("sndng", result.getTarget())
.addObject("rtnMsg", result.getMessage());
}
/**사전통지 발송 현황 메인화면(sndb/sndb01/070-main)을 연다.
*
* @return /sndb/sndb01/070-main
*/
@RequestMapping(name = "사전통지 발송 현황 메인", value = METHOD_URL.advanceNoticeSendingMain)
public ModelAndView advanceNoticeSendingMain() {
// View(jsp)에서 사용할 공통코드를 조회
Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM054", "FIM067");
return new ModelAndView("fims/sndb/sndb01070-main")
.addObject("pageName", "sndb01070") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", currentUser().getOrgID()) // 시군구 코드(SGG_CD)
.addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054"))) // 시군구에서 사용하는 업무 목록
.addObject("FIM067List", commonCodes.get("FIM067")) // 발송 등록 구분 코드(SNDNG_REG_SE_CD)
;
}
/**사전통지 발송 현황 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngList": [사전통지 발송 현황 목록]
* "sndngStart": 사전통지 발송 현황 목록 시작 인덱스
* "sndngFetch": 한 번에 가져오는 사전통지 발송 현황 목록 수
* "sndngTotal": 조회 결과 찾은 전체 사전통지 발송 현황 수
* }</code></pre>
*/
@Task
@RequestMapping(name="사전통지 발송 현황 목록 조회", value=METHOD_URL.getAdvanceNoticeSendingList)
public ModelAndView getAdvanceNoticeSendingList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngService.getAdvntceSndngList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = sndngService.getAdvntceSndngList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("업무구분", format.of("TASK_SE_NM").style(center));
valueMap.put("등록구분", format.of("SNDNG_REG_SE_NM").style(center));
valueMap.put("위반항목", format.of("VLTN_ARTCL"));
valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_YMD").style(dateYMD));
valueMap.put("납기일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_END_YMD").style(dateYMD));
valueMap.put("총건수", format.of("TNOCS").style(numeric));
valueMap.put("총금액", format.of("GRAMT").style(numeric));
valueMap.put("문서번호", format.of("DOC_NO"));
valueMap.put("제목", format.of("TTL_NM"));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("사전통지 발송 현황").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("사전통지발송현황" + "_목록_" + now() + ".xlsx"));
}
}
/**지정한 사전통지 발송대장을 제거한다.
* @param sndng 발송대장
* @return jsonView
* <pre><code> {
* "saved": 삭제되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="사전통지 발송대장 제거", value=METHOD_URL.removeAdvanceNoticeSending)
public ModelAndView removeAdvanceNoticeSending(Sndng sndng) {
String rtnMsg = "";
// 발송 ID 단건 삭제
if (isEmpty(sndng.getSndngIds())) {
rtnMsg = sndngService.removeAdvntceSndng(sndng);
} else {
// 발송 IDs 만큼 발송 삭제 반복..
for (String sndngId : sndng.getSndngIds()) {
Sndng deltSndng = new Sndng();
deltSndng.setSndngId(sndngId);
deltSndng.setDelRsn(sndng.getDelRsn());
// 발송 삭제 호출
rtnMsg = sndngService.removeAdvntceSndng(deltSndng);
if (!rtnMsg.contains("[S]")) // 오류가 발생하였으면 종료..
break;
}
}
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**사전통지 발송 현황 - 발송상세 화면(sndb/sndb01/080-info)을 연다.
* @param sndngId 발송 ID
* @return fims/sndb/sndb01080-info 또는 jsonView
* <pre>{
* "sndngDtls": [사전통지 발송 상세 목록]
* }</pre>
*/
@Task
@RequestMapping(name="사전통지 발송 현황 상세 화면", value=METHOD_URL.getAdvanceNoticeSendingDetailInfo)
public ModelAndView getAdvanceNoticeSendingDetailInfo(HttpServletRequest hReq, SndbQuery req) {
ModelAndView mav = getAdvanceNoticeSendingDetailList(req);
if (jsonResponse()) {
mav.setViewName("jsonView");
} else {
mav.setViewName("fims/sndb/sndb01080-info");
mav.addObject("callPurpose", req.getCallPurpose()) // 호출 용도
.addObject("pageName", "sndb01080") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", req.getSggCd()) // 시군구 코드(SGG_CD)
.addObject("taskSeCd", req.getTaskSeCd()) // 업무 구분 코드(TASK_SE_CD)
.addObject("sndngId", req.getSndngId()) // 발송 ID(SNDNG_ID)
.addObject("mainQuery", toJson(req)) // 검색 조건
.addObject("List", toJson(mav.getModel().get("List"))) // 데이터
.addObject("Paging", toJson(mav.getModel().get("Paging"))) // 페이징
;
}
return mav;
}
/**사전통지 발송 현황 - 발송상세 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngDtlList": [발송상세 목록]
* "sndngDtlStart": 발송상세 목록 시작 인덱스
* "sndngDtlFetch": 한 번에 가져오는 발송상세 목록 수
* "sndngDtlTotal": 조회 결과 찾은 전체 발송상세 수
* }</code></pre>
*/
@Task
@RequestMapping(name="사전통지 발송 현황 상세 목록 조회", value=METHOD_URL.getAdvanceNoticeSendingDetailList)
public ModelAndView getAdvanceNoticeSendingDetailList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngDtlService.getSndngDtlList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = sndngDtlService.getSndngDtlList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("발송상태", format.of("SNDNG_DTL_STTS_NM").style(center));
valueMap.put("등기번호", format.of("RG_NO").style(center));
valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_YMD").style(dateYMD));
valueMap.put("발송종료일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_END_YMD").style(dateYMD));
valueMap.put("성명", format.of("RCPN_NM"));
valueMap.put("우편번호", format.of("RCPN_ZIP").style(center));
valueMap.put("주소", format.of("RCPN_ADDR"));
valueMap.put("상세주소", format.of("RCPN_DTL_ADDR"));
valueMap.put("배달일자", FormatMaker.yyyy_mm_dd(format, "DLVR_YMD").style(dateYMD));
valueMap.put("배달시각", format.of("DLVR_TM").style(center));
valueMap.put("미배달사유", format.of("UNDLVR_RSN_NM"));
valueMap.put("수령인", format.of("ACTL_RCPN_NM"));
valueMap.put("수령인관계", format.of("RCPN_REL_NM"));
valueMap.put("단속일시", format.of("CRDN_DT").style(center));
valueMap.put("차량번호", format.of("VHRNO"));
valueMap.put("단속법정동", format.of("CRDN_STDG_NM"));
valueMap.put("단속장소", format.of("CRDN_PLC"));
valueMap.put("회계연도", format.of("FYR").style(center));
valueMap.put("부과번호", format.of("LEVY_NO").style(center));
valueMap.put("부과일자", FormatMaker.yyyy_mm_dd(format, "LEVY_YMD").style(dateYMD));
valueMap.put("납기일자", FormatMaker.yyyy_mm_dd(format, "DUDT_YMD").style(dateYMD));
valueMap.put("과태료금액", format.of("FFNLG_AMT").style(numeric));
valueMap.put("본세", format.of("PCPTAX").style(numeric));
valueMap.put("가산금", format.of("ADAMT").style(numeric));
valueMap.put("최종금액", format.of("LAST_AMT").style(numeric));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("사전통지 발송 상세").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("사전통지 발송상세" + "_목록_" + now() + ".xlsx"));
}
}
/**고지서 발송 대상 자료 메인화면(sndb/sndb01/090-main)을 연다.
* @return /sndb/sndb01/090-main
*/
@RequestMapping(name = "고지서 발송 대상 메인", value = METHOD_URL.noticeSheetTargetMain)
public ModelAndView noticeSheetTargetMain() {
// View(jsp)에서 사용할 공통코드를 조회
Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM004", "FIM005", "FIM006", "FIM054", "FIM061", "FIM064");
return addCodes(commonCodes, new ModelAndView("fims/sndb/sndb01090-main"), "FIM004", "FIM005", "FIM006", "FIM061", "FIM064")
.addObject("pageName", "sndb01090") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("infoPrefix", "nhtTrgt") // prefix
.addObject("infoPrefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", currentUser().getOrgID()) // 시군구 코드(SGG_CD)
.addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054"))) // 시군구에서 사용하는 업무 목록
.addObject("FIM004List", commonCodes.get("FIM004")) // 주정차위반 내역 코드(VLTN_CD)
.addObject("FIM005List", commonCodes.get("FIM005")) // 전용차로위반 내역 코드(VLTN_CD)
.addObject("FIM006List", commonCodes.get("FIM006")) // 장애인주차위반 내역 코드(VLTN_CD)
.addObject("FIM061List", commonCodes.get("FIM061")) // 전기차 충전구역 및 충전방해 위반 코드(VLTN_CD)
.addObject("FIM064List", commonCodes.get("FIM064")) // 화물자동차 밤샘주차 위반 코드(VLTN_CD)
;
}
/**고지서 발송 대상 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngList": [사전통지 발송 대상 목록]
* "sndngStart": 사전통지 발송 대상 목록 시작 인덱스
* "sndngFetch": 한 번에 가져오는 사전통지 발송 대상 목록 수
* "sndngTotal": 조회 결과 찾은 전체 사전통지 발송 대상 수
* }</code></pre>
*/
@Task
@RequestMapping(name="고지서 발송 대상 목록 조회", value=METHOD_URL.getNoticeSheetTargetList)
public ModelAndView getNoticeSheetTargetList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngService.getNhtTrgtList(setFetchSize(req));
return setCollectionInfo(new ModelAndView("jsonView"), result, "nhtTrgt");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = sndngService.getNhtTrgtList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("업무구분", format.of("TASK_SE_NM").style(center));
valueMap.put("민원신청번호", format.of("CVLCPT_APLY_NO").style(center));
valueMap.put("민원접수번호", format.of("CVLCPT_RCPT_NO").style(center));
valueMap.put("민원접수일자", FormatMaker.yyyy_mm_dd(format, "CVLCPT_RCPT_YMD").style(dateYMD));
valueMap.put("민원처리담당자", format.of("CVLCPT_PRCS_PIC_NM").style(center));
valueMap.put("민원처리결과", format.of("CVLCPT_PRCS_NM").style(center));
valueMap.put("단속일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "CRDN_YMD_TM").style(dateDT));
valueMap.put("차량번호", format.of("VHRNO"));
valueMap.put("위반항목", format.of("VLTN_ARTCL"));
valueMap.put("단속법정동", format.of("CRDN_STDG_NM"));
valueMap.put("단속장소", format.of("CRDN_PLC"));
valueMap.put("상세단속장소", format.of("DTL_CRDN_PLC"));
valueMap.put("과태료금액", format.of("FFNLG_AMT").style(numeric));
valueMap.put("사전통지금액", format.of("ADVNTCE_AMT").style(numeric));
valueMap.put("처리상태", format.of("CRDN_STTS_NM"));
valueMap.put("납부자명", format.of("RTPYR_NM"));
valueMap.put("납부자생일", format.of("RTPYR_BRDT_MASK").style(center));
valueMap.put("우편번호", format.of("ZIP").style(center));
valueMap.put("주소", format.of("ADDR"));
valueMap.put("상세주소", format.of("DTL_ADDR"));
valueMap.put("단속특별구역", format.of("CRDN_SPAREA_NM").style(center));
valueMap.put("사용연료", format.of("USE_FUEL_NM").style(center));
valueMap.put("주차가능여부", format.of("PRK_PSBLTY_RSLT_NM").style(center));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("사전통지 발송 대상").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("사전통지발송대상" + "_목록_" + now() + ".xlsx"));
}
}
/**고지서 발송 대상 현황 - 발송 대상 상세 화면(sndb/sndb01/100-info)을 연다.
* @param sndngId 발송 ID
* @return fims/sndb/sndb01100-info 또는 jsonView
* <pre>{
* "sndngDtls": [고지서 발송 대상 상세 목록]
* }</pre>
*/
@Task
@RequestMapping(name="고지서 발송 대상 상세 화면", value=METHOD_URL.getNoticeSheetTargetInfo)
public ModelAndView getNoticeSheetTargetInfo(HttpServletRequest hReq, SndbQuery req) {
// View(jsp)에서 사용할 공통코드를 조회
List<String> cdGrpList = TaskProcessor.get().getVltnCdGrps();
cdGrpList.add("EGP002");
cdGrpList.add("FIM047");
String[] cdGrps = cdGrpList.toArray(new String[cdGrpList.size()]);
Map<String, List<CommonCode>> commonCodes = getCodesOf(cdGrps);
return addCodes(commonCodes, new ModelAndView("fims/sndb/sndb01100-info"), cdGrps)
.addObject("openerPageName", hReq.getParameter("openerPageName")) // 호출한 Jsp PageName
.addObject("callPurpose", req.getCallPurpose()) // 호출 용도
.addObject("pageName", "sndb01100") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("infoPrefix", "nhtTrgt") // prefix
.addObject("infoPrefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", req.getSggCd()) // 시군구 코드(SGG_CD)
.addObject("taskSeCd", req.getTaskSeCd()) // 업무 구분 코드(TASK_SE_CD)
.addObject("FIM047List", commonCodes.get("FIM047")) // 발송 구분 코드(SNDNG_SE_CD)
.addObject("mainQuery", toJson(req)) // 검색 조건
;
}
/**고지서 발송 대상을 등록한다.
* @param sndng 발송 정보
* @return jsonView
* <pre><code> {
* "saved": 등록되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="고지서 발송대장 등록", value=METHOD_URL.createNoticeSheetSendingList)
public ModelAndView createNoticeSheetSendingList(SndbQuery req, Sndng sndng) {
DataProc result = sndngService.createNhtSndngList(req, sndng);
return new ModelAndView("jsonView")
.addObject("saved", result.isSuccess())
.addObject("sndng", result.getTarget())
.addObject("rtnMsg", result.getMessage());
}
/**고지서 발송 현황 메인화면(sndb/sndb01/110-main)을 연다.
*
* @return /sndb/sndb01/110-main
*/
@RequestMapping(name = "고지서 발송 현황 메인", value = METHOD_URL.noticeSheetSendingMain)
public ModelAndView noticeSheetSendingMain() {
// View(jsp)에서 사용할 공통코드를 조회
Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM047", "FIM054", "FIM067");
return addCodes(commonCodes, new ModelAndView("fims/sndb/sndb01110-main"), "FIM047")
.addObject("pageName", "sndb01110") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", currentUser().getOrgID()) // 시군구 코드(SGG_CD)
.addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054"))) // 시군구에서 사용하는 업무 목록
.addObject("FIM047List", commonCodes.get("FIM047")) // 발송 구분 코드(SNDNG_SE_CD)
.addObject("FIM067List", commonCodes.get("FIM067")) // 발송 등록 구분 코드(SNDNG_REG_SE_CD)
;
}
/**고지서 발송 현황 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngList": [고지서 발송 현황 목록]
* "sndngStart": 고지서 발송 현황 목록 시작 인덱스
* "sndngFetch": 한 번에 가져오는 고지서 발송 현황 목록 수
* "sndngTotal": 조회 결과 찾은 전체 고지서 발송 현황 수
* }</code></pre>
*/
@Task
@RequestMapping(name="고지서 발송 현황 목록 조회", value=METHOD_URL.getNoticeSheetSendingList)
public ModelAndView getNoticeSheetSendingList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngService.getSndngList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = sndngService.getSndngList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("업무구분", format.of("TASK_SE_NM").style(center));
valueMap.put("등록구분", format.of("SNDNG_REG_SE_NM").style(center));
valueMap.put("위반항목", format.of("VLTN_ARTCL"));
valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_YMD").style(dateYMD));
valueMap.put("납기일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_END_YMD").style(dateYMD));
valueMap.put("총건수", format.of("TNOCS").style(numeric));
valueMap.put("총금액", format.of("GRAMT").style(numeric));
valueMap.put("문서번호", format.of("DOC_NO"));
valueMap.put("제목", format.of("TTL_NM"));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("고지서 발송 현황").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("고지서발송현황" + "_목록_" + now() + ".xlsx"));
}
}
/****지정한 고지서 발송대장을 제거한다.
* @param sndng 발송대장
* @return jsonView
* <pre><code> {
* "saved": 저장되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="고지서 발송대장 삭제", value=METHOD_URL.removeNoticeSheetSending)
public ModelAndView removeNoticeSheetSending(Sndng sndng) {
String rtnMsg = "";
// 발송(sndngId) 단건 삭제
if (isEmpty(sndng.getSndngIds())) {
rtnMsg = sndngService.removeSndng(sndng);
} else {
// 발송 IDs 만큼 삭제 반복..
for (String sndngId : sndng.getSndngIds()) {
Sndng deltSndng = new Sndng();
deltSndng.setSndngId(sndngId);
deltSndng.setDelRsn(sndng.getDelRsn());
// 발송 삭제 호출
rtnMsg = sndngService.removeSndng(deltSndng);
if (!rtnMsg.contains("[S]")) // 오류가 발생하였으면 종료..
break;
}
}
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**고지서 발송 현황 - 발송상세 화면(sndb/sndb01/120-info)을 연다.
* @param sndngId 발송 ID
* @return fims/sndb/sndb01120-info 또는 jsonView
* <pre>{
* "sndngDtls": [고지서 발송 상세 목록]
* }</pre>
*/
@Task
@RequestMapping(name="고지서 발송 현황 상세 화면", value=METHOD_URL.getNoticeSheetSendingDetailInfo)
public ModelAndView getNoticeSheetSendingDetailInfo(HttpServletRequest hReq, SndbQuery req) {
boolean json = jsonResponse();
ModelAndView mav = getNoticeSheetSendingDetailList(req);
if (json) {
mav.setViewName("jsonView");
} else {
mav.setViewName("fims/sndb/sndb01120-info");
mav.addObject("callPurpose", req.getCallPurpose()) // 호출 용도
.addObject("pageName", "sndb01120") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", req.getSggCd()) // 시군구 코드(SGG_CD)
.addObject("taskSeCd", req.getTaskSeCd()) // 업무 구분 코드(TASK_SE_CD)
.addObject("sndngId", req.getSndngId()) // 발송 ID(SNDNG_ID)
.addObject("mainQuery", toJson(req)) // 검색 조건
.addObject("List", toJson(mav.getModel().get("List"))) // 데이터
.addObject("Paging", toJson(mav.getModel().get("Paging"))) // 페이징
;
}
return mav;
}
/**고지서 발송 현황 - 발송상세 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngDtlList": [발송상세 목록]
* "sndngDtlStart": 발송상세 목록 시작 인덱스
* "sndngDtlFetch": 한 번에 가져오는 발송상세 목록 수
* "sndngDtlTotal": 조회 결과 찾은 전체 발송상세 수
* }</code></pre>
*/
@Task
@RequestMapping(name="고지서 발송 현황 상세 목록 조회", value=METHOD_URL.getNoticeSheetSendingDetailList)
public ModelAndView getNoticeSheetSendingDetailList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngDtlService.getSndngDtlList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = sndngDtlService.getSndngDtlList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("발송상태", format.of("SNDNG_DTL_STTS_NM").style(center));
valueMap.put("등기번호", format.of("RG_NO").style(center));
valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_YMD").style(dateYMD));
valueMap.put("발송종료일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_END_YMD").style(dateYMD));
valueMap.put("성명", format.of("RCPN_NM"));
valueMap.put("우편번호", format.of("RCPN_ZIP").style(center));
valueMap.put("주소", format.of("RCPN_ADDR"));
valueMap.put("상세주소", format.of("RCPN_DTL_ADDR"));
valueMap.put("배달일자", FormatMaker.yyyy_mm_dd(format, "DLVR_YMD").style(dateYMD));
valueMap.put("배달시각", format.of("DLVR_TM").style(center));
valueMap.put("미배달사유", format.of("UNDLVR_RSN_NM"));
valueMap.put("수령인", format.of("ACTL_RCPN_NM"));
valueMap.put("수령인관계", format.of("RCPN_REL_NM"));
valueMap.put("단속일시", format.of("CRDN_DT").style(center));
valueMap.put("차량번호", format.of("VHRNO"));
valueMap.put("단속법정동", format.of("CRDN_STDG_NM"));
valueMap.put("단속장소", format.of("CRDN_PLC"));
valueMap.put("회계연도", format.of("FYR").style(center));
valueMap.put("부과번호", format.of("LEVY_NO").style(center));
valueMap.put("부과일자", FormatMaker.yyyy_mm_dd(format, "LEVY_YMD").style(dateYMD));
valueMap.put("납기일자", FormatMaker.yyyy_mm_dd(format, "DUDT_YMD").style(dateYMD));
valueMap.put("과태료금액", format.of("FFNLG_AMT").style(numeric));
valueMap.put("본세", format.of("PCPTAX").style(numeric));
valueMap.put("가산금", format.of("ADAMT").style(numeric));
valueMap.put("최종금액", format.of("LAST_AMT").style(numeric));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("고지서 발송 상세").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("고지서발송상세" + "_목록_" + now() + ".xlsx"));
}
}
/**우편통합 발송 대상을 등록한다.
* @param sndng 발송 정보
* @return jsonView
* <pre><code> {
* "saved": 등록되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="우편통합 발송 연계 등록", value=METHOD_URL.createSendingLink)
public ModelAndView createSendingLink(Sndng sndng) {
String rtnMsg = sndngService.createSndngLink(sndng);
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**수기 반송 등록 정보(sndb/sndb01/210-info)을 연다.
*
* @return /sndb/sndb01/210-info
*/
@Task
@RequestMapping(name = "수기 반송 등록 정보 조회", value = METHOD_URL.sendingDetailInfo)
public ModelAndView sendingDetailInfo(HttpServletRequest hReq, SndbQuery req) {
// View(jsp)에서 사용할 공통코드를 조회
Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM047", "FIM054", "FIM081");
return new ModelAndView("fims/sndb/sndb01210-info")
.addObject("callPurpose", req.getCallPurpose()) // 호출 용도
.addObject("pageName", "sndb01210") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("infoPrefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", req.getSggCd()) // 시군구 코드(SGG_CD)
.addObject("taskSeCd", req.getTaskSeCd()) // 업무 구분 코드(TASK_SE_CD)
.addObject("FIM047List", commonCodes.get("FIM047")) // 발송 구분 코드(SNDNG_SE_CD)
.addObject("FIM081List", commonCodes.get("FIM081")) // 미배달 사유 코드(UNDLVR_RSN_CD)
;
}
/**발송 상세 대장 목록을 조회하여 반환한다
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngDtlList": [발송상세 목록]
* "sndngDtlStart": 발송상세 목록 시작 인덱스
* "sndngDtlFetch": 한 번에 가져오는 발송상세 목록 수
* "sndngDtlTotal": 조회 결과 찾은 전체 발송상세 수
* }</code></pre>
*/
@Task
@RequestMapping(name="반송 대상 목록 조회", value=METHOD_URL.getSendingDetailList)
public ModelAndView getSendingDetailList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngDtlService.getSndngDtlList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = sndngDtlService.getSndngDtlList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("발송상태", format.of("SNDNG_DTL_STTS_NM").style(center));
valueMap.put("등기번호", format.of("RG_NO").style(center));
valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_YMD").style(dateYMD));
valueMap.put("발송종료일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_END_YMD").style(dateYMD));
valueMap.put("성명", format.of("RCPN_NM"));
valueMap.put("우편번호", format.of("RCPN_ZIP").style(center));
valueMap.put("주소", format.of("RCPN_ADDR"));
valueMap.put("상세주소", format.of("RCPN_DTL_ADDR"));
valueMap.put("배달일자", FormatMaker.yyyy_mm_dd(format, "DLVR_YMD").style(dateYMD));
valueMap.put("배달시각", format.of("DLVR_TM").style(center));
valueMap.put("미배달사유", format.of("UNDLVR_RSN_NM"));
valueMap.put("수령인", format.of("ACTL_RCPN_NM"));
valueMap.put("수령인관계", format.of("RCPN_REL_NM"));
valueMap.put("단속일시", format.of("CRDN_DT").style(center));
valueMap.put("차량번호", format.of("VHRNO"));
valueMap.put("단속법정동", format.of("CRDN_STDG_NM"));
valueMap.put("단속장소", format.of("CRDN_PLC"));
valueMap.put("회계연도", format.of("FYR").style(center));
valueMap.put("부과번호", format.of("LEVY_NO").style(center));
valueMap.put("부과일자", FormatMaker.yyyy_mm_dd(format, "LEVY_YMD").style(dateYMD));
valueMap.put("납기일자", FormatMaker.yyyy_mm_dd(format, "DUDT_YMD").style(dateYMD));
valueMap.put("과태료금액", format.of("FFNLG_AMT").style(numeric));
valueMap.put("본세", format.of("PCPTAX").style(numeric));
valueMap.put("가산금", format.of("ADAMT").style(numeric));
valueMap.put("최종금액", format.of("LAST_AMT").style(numeric));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("사전통지 발송 상세").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("발송 상세" + "_목록_" + now() + ".xlsx"));
}
}
/**발송상세 목록의 반송 정보를 등록한다.
* @param sndngDtl 발송상세 정보
* @return jsonView
* <pre><code> {
* "saved": 수정되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="발송상세 목록의 반송 정보 등록", value=METHOD_URL.createSendBackList)
public ModelAndView createSendBackList(SndbQuery req) {
String rtnMsg = sndngDtlService.createSndbkList(req);
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**발송상세 정보의 반송 정보를 등록한다.
* @param sndngDtl 발송상세 정보
* @return jsonView
* <pre><code> {
* "saved": 수정되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="발송상세의 반송 정보 등록", value=METHOD_URL.createSendBack)
public ModelAndView createSendBack(SndngDtl sndngDtl) {
String rtnMsg = sndngDtlService.createSndbk(sndngDtl);
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**발송상세 정보의 반송 정보를 수정한다.
* @param sndngDtl 발송상세 정보
* @return jsonView
* <pre><code> {
* "saved": 수정되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="발송상세의 반송 정보 수정", value=METHOD_URL.updateSendBack)
public ModelAndView updateSendBack(SndngDtl sndngDtl) {
String rtnMsg = sndngDtlService.updateSndbk(sndngDtl);
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**발송상세 정보의 반송 정보를 삭제한다.
* @param sndngDtl 발송상세 정보
* @return jsonView
* <pre><code> {
* "saved": 수정되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="발송 상세의 반송 정보 삭제", value=METHOD_URL.removeSendBack)
public ModelAndView removeSendBack(SndngDtl sndngDtl) {
String rtnMsg = "";
// 발송상세의 반송 정보 삭제
if (isEmpty(sndngDtl.getSndngDtlIds())) {
rtnMsg = sndngDtlService.removeSndbk(sndngDtl);
} else {
// 발송상세 IDs 만큼 반송 삭제 반복..
for (String sndngDtlId : sndngDtl.getSndngDtlIds()) {
SndngDtl deltSndngDtl = new SndngDtl();
deltSndngDtl.setSndngDtlId(sndngDtlId);
// 반송 삭제 호출
rtnMsg = sndngDtlService.removeSndbk(deltSndngDtl);
if (!rtnMsg.contains("[S]")) // 오류가 발생하였으면 종료..
break;
}
}
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**반송 현황 메인화면(sndb/sndb01/220-main)을 연다.
*
* @return /sndb/sndb01/220-main
*/
@RequestMapping(name = "반송 현황 메인", value = METHOD_URL.sendBackMain)
public ModelAndView sendBackMain() {
// View(jsp)에서 사용할 공통코드를 조회
Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM047", "FIM054", "FIM081");
return new ModelAndView("fims/sndb/sndb01220-main")
.addObject("pageName", "sndb01220") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", currentUser().getOrgID()) // 시군구 코드(SGG_CD)
.addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054"))) // 시군구에서 사용하는 업무 목록
.addObject("FIM047List", commonCodes.get("FIM047")) // 발송 구분 코드(SNDNG_SE_CD)
.addObject("FIM081List", commonCodes.get("FIM081")) // 미배달 사유 코드(UNDLVR_RSN_CD)
;
}
/**반송 현황 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngList": [반송 현황 목록]
* "sndngStart": 반송 현황 목록 시작 인덱스
* "sndngFetch": 한 번에 가져오는 반송 현황 목록 수
* "sndngTotal": 조회 결과 찾은 전체 반송 현황 수
* }</code></pre>
*/
@Task
@RequestMapping(name="반송 목록 조회", value=METHOD_URL.getSendBackList)
public ModelAndView getSendBackList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = sndngDtlService.getSndbkList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = sndngDtlService.getSndbkList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("업무구분", format.of("TASK_SE_NM").style(center));
valueMap.put("고지번호", format.of("GOJI_NO").style(center));
valueMap.put("등기번호", format.of("RG_NO").style(center));
valueMap.put("배달일자", FormatMaker.yyyy_mm_dd(format, "DLVR_YMD").style(dateYMD));
valueMap.put("배달시간", format.of("DLVR_TM"));
valueMap.put("미배달사유", format.of("UNDLVR_RSN_NM"));
valueMap.put("수령인", format.of("ACTL_RCPN_NM"));
valueMap.put("수령인관계", format.of("RCPN_REL_NM"));
valueMap.put("발송구분", format.of("SNDNG_SE_NM").style(center));
valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_YMD").style(dateYMD));
valueMap.put("과태료금액", format.of("FFNLG_AMT").style(numeric));
valueMap.put("성명", format.of("RCPN_NM"));
valueMap.put("우편번호", format.of("RCPN_ZIP").style(center));
valueMap.put("주소", format.of("RCPN_ADDR"));
valueMap.put("상세주소", format.of("RCPN_DTL_ADDR"));
valueMap.put("단속일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "CRDN_YMD_TM").style(dateDT));
valueMap.put("차량번호", format.of("VHRNO"));
valueMap.put("납부자구분", format.of("RTPYR_SE_NM").style(center));
valueMap.put("납부자번호", format.of("RTPYR_NO").style(center));
valueMap.put("납부자명", format.of("RTPYR_NM"));
valueMap.put("단속법정동", format.of("CRDN_STDG_NM").style(center));
valueMap.put("단속장소", format.of("CRDN_PLC"));
valueMap.put("처리상태", format.of("CRDN_STTS_NM"));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("반송현황").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("반송현황" + "_목록_" + now() + ".xlsx"));
}
}
/**반송등록 (sndb/sndb01/230-info)을 연다.
* @param sndngId 발송 ID
* @return fims/sndb/sndb01230-info 또는 jsonView
* <pre>{
* "sndngDtls":
* }</pre>
*/
@Task
@RequestMapping(name="발송상세의 반송(미배달) 정보 조회", value=METHOD_URL.getSendBackInfo)
public ModelAndView getSendBackInfo(HttpServletRequest hReq, SndbQuery req) {
DataObject info = sndngDtlService.getSndbkInfo(req);
// 등록을 호출하였지만 등록된 미배달 사유가 있는지 확인.
if ("create".equals(req.getCallPurpose()) && !isEmpty(info.get("UNDLVR_RSN_NM"))) {
return new ModelAndView("jsonView")
.addObject("pageName", "sndb01230")
.addObject("rtnMsg", "이미 등록된 미배달 사유가 있습니다.");
} else {
boolean json = jsonResponse();
// View(jsp)에서 사용할 공통코드를 조회
Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM054", "FIM081");
return new ModelAndView(json ? "jsonView" : "fims/sndb/sndb01230-info")
.addObject("openerPageName", hReq.getParameter("openerPageName")) // 호출한 Jsp PageName
.addObject("callPurpose", req.getCallPurpose()) // 호출 용도
.addObject("pageName", "sndb01230") // jsp pageName
.addObject("infoPrefix", "sndbk") // prefix
.addObject("infoPrefixUrl", CLASS_URL) // prefixUrl
.addObject("FIM054List", commonCodes.get("FIM054")) // 업무 구분 코드(TASK_SE_CD)
.addObject("FIM081List", commonCodes.get("FIM081")) // 미배달 사유 코드(UNDLVR_RSN_CD)
.addObject("sndbkInfo", json ? info : toJson(info)) // 반송 정보
;
}
}
/**공시송달 현황 메인화면(sndb/sndb01/240-main)을 연다.
*
* @return /sndb/sndb01/240-main
*/
@RequestMapping(name = "공시송달 현황 메인", value = METHOD_URL.serviceByPublicNoticeMain)
public ModelAndView serviceByPublicNoticeMain() {
// View(jsp)에서 사용할 공통코드를 조회
Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM047", "FIM054");
return new ModelAndView("fims/sndb/sndb01240-main")
.addObject("pageName", "sndb01240") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", currentUser().getOrgID()) // 시군구 코드(SGG_CD)
.addObject("taskListForSgg", stngBean.filterTaskSectionCodeForSgg(commonCodes.get("FIM054"))) // 시군구에서 사용하는 업무 목록
.addObject("FIM047List", commonCodes.get("FIM047")) // 발송 구분 코드(SNDNG_SE_CD)
;
}
/**공시송달 현황 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngList": [공시송달 현황 목록]
* "sndngStart": 공시송달 현황 목록 시작 인덱스
* "sndngFetch": 한 번에 가져오는 공시송달 현황 목록 수
* "sndngTotal": 조회 결과 찾은 전체 공시송달 현황 수
* }</code></pre>
*/
@Task
@RequestMapping(name="공시송달 목록 조회", value=METHOD_URL.getServiceByPublicNoticeList)
public ModelAndView getServiceByPublicNoticeList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = svbtcService.getSvbtcList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = svbtcService.getSvbtcList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("업무구분", format.of("TASK_SE_NM").style(center));
valueMap.put("발송구분", format.of("SNDNG_SE_NM").style(center));
valueMap.put("공시송달일자", FormatMaker.yyyy_mm_dd(format, "SVBTC_YMD").style(dateYMD));
valueMap.put("공시송달종료일자", FormatMaker.yyyy_mm_dd(format, "SVBTC_END_YMD").style(dateYMD));
valueMap.put("총건수", format.of("TNOCS").style(numeric));
valueMap.put("문서번호", format.of("DOC_NO"));
valueMap.put("제목", format.of("TTL_NM"));
valueMap.put("기타내용", format.of("ETC_CN"));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("공시송달현황").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("공시송달현황" + "_목록_" + now() + ".xlsx"));
}
}
/**공시송달 발송 현황 - 공시송달 상세 정보 화면(sndb/sndb01/250-info)을 연다.
* @param svbtcId 공시송달 ID
* @return fims/sndb/sndb01250-info 또는 jsonView
* <pre>{
* "sndngDtls": [발송 상세 목록]
* }</pre>
*/
@Task
@RequestMapping(name="공시송달 상세 화면", value=METHOD_URL.getServiceByPublicNoticeDetailInfo)
public ModelAndView getServiceByPublicNoticeDetailInfo(HttpServletRequest hReq, SndbQuery req) {
ModelAndView mav = getServiceByPublicNoticeDetailList(req);
if (jsonResponse()) {
mav.setViewName("jsonView");
} else {
mav.setViewName("fims/sndb/sndb01250-info");
mav.addObject("callPurpose", req.getCallPurpose()) // 호출 용도
.addObject("pageName", "sndb01250") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("sggCd", req.getSggCd()) // 시군구 코드(SGG_CD)
.addObject("taskSeCd", req.getTaskSeCd()) // 업무 구분 코드(TASK_SE_CD)
.addObject("svbtcId", req.getSvbtcId()) // 업무 구분 코드(TASK_SE_CD)
.addObject("mainQuery", toJson(req)) // 검색 조건
.addObject("List", toJson(mav.getModel().get("List"))) // 데이터
.addObject("Paging", toJson(mav.getModel().get("Paging"))) // 페이징
;
}
return mav;
}
/**공시송달 발송 현황 - 공시송달 상세 목록을 조회하여 반환한다.
* {@link SndngService#getSndngList(SndngQuery)} 참고
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "sndngDtlList": [공시송달 상세 목록]
* "sndngDtlStart": 공시송달 상세 목록 시작 인덱스
* "sndngDtlFetch": 한 번에 가져오는 공시송달 상세 목록 수
* "sndngDtlTotal": 조회 결과 찾은 전체 공시송달 상세 수
* }</code></pre>
*/
@Task
@RequestMapping(name="공시송달 상세 목록 조회", value=METHOD_URL.getServiceByPublicNoticeDetailList)
public ModelAndView getServiceByPublicNoticeDetailList(SndbQuery req) {
if (!"xls".equals(req.getDownload())) {
List<?> result = svbtcService.getSvbtcDtlList(setFetchSize(req));
return setPagingInfo(new ModelAndView("jsonView"), result, "");
} else {
List<CellDef> cellDefs = fromJson(req.getCellDefs(), CellDef.listType());
XLSWriter xlsx = new XLSWriter().worksheet(0);
Format format = new Format(xlsx);
CellStyle center = format.cellStyle(Style.CENTER);
CellStyle numeric = format.n_nn0();
CellStyle dateYMD = format.yyyy_mm_dd();
CellStyle dateDT = format.yyyy_mm_dd_hh_mm_ss();
List<DataObject> list = svbtcService.getSvbtcDtlList(req.setFetchSize(0));
Map<String,Object> valueMap = new HashMap<String,Object>();
valueMap.put("발송상태", format.of("SNDNG_DTL_STTS_NM").style(center));
valueMap.put("공시송달일자", FormatMaker.yyyy_mm_dd(format, "SVBTC_YMD").style(dateYMD));
valueMap.put("등기번호", format.of("RG_NO").style(center));
valueMap.put("발송일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_YMD").style(dateYMD));
valueMap.put("발송종료일자", FormatMaker.yyyy_mm_dd(format, "SNDNG_END_YMD").style(dateYMD));
valueMap.put("성명", format.of("RCPN_NM"));
valueMap.put("우편번호", format.of("RCPN_ZIP").style(center));
valueMap.put("주소", format.of("RCPN_ADDR"));
valueMap.put("상세주소", format.of("RCPN_DTL_ADDR"));
valueMap.put("배달일자", FormatMaker.yyyy_mm_dd(format, "DLVR_YMD").style(dateYMD));
valueMap.put("배달시각", format.of("DLVR_TM").style(center));
valueMap.put("미배달사유", format.of("UNDLVR_RSN_NM"));
valueMap.put("수령인", format.of("ACTL_RCPN_NM"));
valueMap.put("수령인관계", format.of("RCPN_REL_NM"));
valueMap.put("단속일시", format.of("CRDN_DT").style(center));
valueMap.put("차량번호", format.of("VHRNO"));
valueMap.put("단속법정동", format.of("CRDN_STDG_NM"));
valueMap.put("단속장소", format.of("CRDN_PLC"));
valueMap.put("회계연도", format.of("FYR").style(center));
valueMap.put("부과번호", format.of("LEVY_NO").style(center));
valueMap.put("부과일자", FormatMaker.yyyy_mm_dd(format, "LEVY_YMD").style(dateYMD));
valueMap.put("납기일자", FormatMaker.yyyy_mm_dd(format, "DUDT_YMD").style(dateYMD));
valueMap.put("과태료금액", format.of("FFNLG_AMT").style(numeric));
valueMap.put("본세", format.of("PCPTAX").style(numeric));
valueMap.put("가산금", format.of("ADAMT").style(numeric));
valueMap.put("등록일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "REG_DT").style(dateDT));
valueMap.put("등록사용자", format.of("RGTR_NM").style(center));
valueMap.put("수정일시", FormatMaker.yyyy_mm_dd_hh_mm_ss(format, "MDFCN_DT").style(dateDT));
valueMap.put("수정사용자", format.of("MDFR_NM").style(center));
CellDef.setValues(cellDefs, valueMap);
xlsx.cell(0, 0).value("공시송달 상세").value(center).merge(0, cellDefs.size() - 1)
.cell(3, 0).rowValues(CellDef.header(cellDefs, () -> StyleMaker.headerStyle(xlsx)))
.cell(4, 0).values(list, CellDef.values(cellDefs.stream().map(i -> {if (i.getValue() instanceof Format) {i.setField(null);}; return i;}).toList()));
return new ModelAndView("downloadView")
.addObject("download", xlsx.getDownloadable().setFilename("공시송달상세" + "_목록_" + now() + ".xlsx"));
}
}
/** 공시송달 한글 파일로 작성한다.
* @return 공시송달 hwp파일
*/
@Task
@RequestMapping(name="공시송달 한글 저장", value=METHOD_URL.makeSvbtcFileFromHwpFormat)
public ModelAndView makeSvbtcFileFromHwpFormat(SndbQuery req) {
UserInfo userInfo = currentUser();
ogdpBean.initUserInfo(userInfo);
Print print = new Print();
print.setPrintRequestUserInfo(userInfo);
FimsPrintOption printOption = new FimsPrintOption();
req.setSggCd((String)userInfo.getInfo().get("sggCd"))
.setDeptCd((String)userInfo.getInfo().get("deptCd"))
.setOrderBy("SV.SVBTC_ID, SD.SNDNG_DTL_ID");
List<DataObject> dataObjectList = svbtcBean.getSvbtcPrint(req);
SvbtcList hwpFormat = new SvbtcList(print, printOption, dataObjectList);
HashMap<String, Object> result = hwpFormat.makeFile().andDownload();
return new ModelAndView("downloadView")
.addAllObjects(result);
}
/**지정한 ID의 공시송달 정보를 반환한다.
* @param svbtcId 공시송달 ID
* @return fims/sndb/sndb01260-info 또는 jsonView
* <pre>{
* "svbtcInfo": 공시송달 정보
* }</pre>
*/
@Task
@RequestMapping(name="공시송달 정보 상세조회", value=METHOD_URL.getServiceByPublicNoticeInfo)
public ModelAndView getServiceByPublicNoticeInfo(HttpServletRequest hReq, SndbQuery req) {
boolean json = jsonResponse();
// 공시송달 정보 조회
DataObject svbtcInfo = new DataObject();
if (req.getSvbtcId() == null) {
svbtcInfo.set("SGG_CD", req.getSggCd()); // 시군구 코드
svbtcInfo.set("TASK_SE_CD", req.getTaskSeCd()); // 업무 구분 코드
svbtcInfo.set("SNDNG_SE_CD", req.getSchSndngSeCd()); // 발송 구분 코드
svbtcInfo.set("TNOCS", req.getTnocs()); // 총건수
} else {
svbtcInfo = svbtcService.getSvbtcInfo(req);
}
// View(jsp)에서 사용할 공통코드를 조회
Map<String, List<CommonCode>> commonCodes = getCodesOf("FIM047", "FIM054");
return addCodes(commonCodes, new ModelAndView(json ? "jsonView" : "fims/sndb/sndb01260-info"), "FIM047", "FIM054")
.addObject("callPurpose", req.getCallPurpose()) // 호출 용도
.addObject("pageName", "sndb01260") // View(jsp)에서 사용할 id 뒤에 붙일 suffix
.addObject("prefixUrl", CLASS_URL) // prefixUrl
.addObject("mainQuery", json ? req : toJson(req)) // mainQuery
.addObject("Info", json ? svbtcInfo : toJson(svbtcInfo)) // 공시송달 정보
;
}
/**공시송달 대장에 공시송달 정보를 등록한다.
* @param svbtc 공시송달 정보
* @return jsonView
* <pre><code> {
* "saved": 수정되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="공시송달 등록", value=METHOD_URL.createServiceByPublicNotice)
public ModelAndView createServiceByPublicNotice(SndbQuery req, Svbtc svbtc) {
String rtnMsg = svbtcService.createSvbtc(req, svbtc);
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**공시송달 대장에 공시송달 정보를 수정한다.
* @param svbtc 공시송달 정보
* @return jsonView
* <pre><code> {
* "saved": 수정되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="공시송달 수정", value=METHOD_URL.updateServiceByPublicNotice)
public ModelAndView updateServiceByPublicNotice(Svbtc svbtc) {
String rtnMsg = svbtcService.updateSvbtc(svbtc);
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**지정한 공시송달 ID에 해당하는 공시송달 대장을 제거한다.
* @param svbtcId 공시송달 ID
* @return jsonView
* <pre><code> {
* "affected": 저장된 정보수
* "saved": 저장되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="공시송달 삭제", value=METHOD_URL.removeServiceByPublicNotice)
public ModelAndView removeServiceByPublicNotice(Svbtc svbtc) {
String rtnMsg = "";
if (isEmpty(svbtc.getSvbtcIds())) {
rtnMsg = svbtcService.removeSvbtc(svbtc);
} else {
// 공시송달 Ids 만큼 삭제 반복..
for (String svbtcId : svbtc.getSvbtcIds()) {
Svbtc deltSvbtc = new Svbtc();
deltSvbtc.setSvbtcId(svbtcId);
deltSvbtc.setDelRsn(svbtc.getDelRsn());
// 공시송달 삭제 호출
rtnMsg = svbtcService.removeSvbtc(deltSvbtc);
if (!rtnMsg.contains("[S]")) // 오류가 발생하였으면 종료..
break;
}
}
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/**지정한 공시송달 ID에 해당하는 공시송달 대장을 제거한다.
* @param svbtcId 공시송달 ID
* @return jsonView
* <pre><code> {
* "affected": 저장된 정보수
* "saved": 저장되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="공시송달 개별 삭제", value=METHOD_URL.removeServiceByPublicNoticeEach)
public ModelAndView removeServiceByPublicNoticeEach(Svbtc svbtc) {
String rtnMsg = svbtcService.removeSvbtcEach(svbtc);
return new ModelAndView("jsonView")
.addObject("saved", rtnMsg.contains("[S]"))
.addObject("rtnMsg", rtnMsg);
}
/** 사전통지서를 PDF 파일로 작성한다.
* @return 사전통지서 PDF파일
*/
@Task
@RequestMapping(name="사전통지서 pdf 파일 생성", value=METHOD_URL.makeAdvanceNoticePdf)
public ModelAndView makeAdvanceNoticePdf(SndbQuery req, FimsPrintOption printOption) {
List<DataObject> list = sndngDtlService.getSndngTrgtDtlIds(req);
String[] crdnIds = list.stream()
.map(row -> row.string("CRDN_ID"))
.toList()
.toArray(new String[list.size()]);
List<DataObject> dataObjectList = new ArrayList<DataObject>();
if (crdnIds.length == 1 && crdnIds[0].equals("sample")) {
DataObject sample = new Advntce().createSampleData();
dataObjectList.add(sample);
} else {
dataObjectList = integrationSearchMapper.selectIntegrationDataList(new SprtQuery().setCrdnIds(crdnIds));
Map<String, List<DataObject>> fileList = fileBean.getFileList(
new FileQuery().setInfoType(Crdn.INF_TYPE).setInfoKeys(crdnIds)
).stream()
.collect(Collectors.groupingBy(row -> row.string("INF_ID")));
dataObjectList.forEach(row -> {
String crdnId = row.string("CRDN_ID");
List<DataObject> files = fileList.get(crdnId);
if (isEmpty(files)) return;
for (int i = 0; i < files.size(); ++i) {
DataObject fileInfo = files.get(i);
row.set("CRDN_PHOTO"+(i+1), fileInfo.string("URL"));
String fileID = fileInfo.string("FILE_ID");
row.set("CRDN_PHOTO"+(i+1)+"KEY", fileID);
List<DataObject> mosSet = mediaBean.getMosaicList(fileID);
if (mosSet != null && !mosSet.isEmpty()) {
row.set("MOS"+fileID, mosSet);
}
}
});
}
Print print = new Print();
UserInfo userInfo = currentUser();
ogdpBean.initUserInfo(userInfo);
print.setPrintRequestUserInfo(userInfo);
//출력물 기본 설정
OtptStngQuery otptStngQuery = new OtptStngQuery();
otptStngQuery.setSggCd((String)userInfo.getInfo().get("sggCd"));
String paperSeCd = printOption.getPaperSeCd();
String taskSeCd = printOption.getTaskSeCd();
otptStngQuery.setTaskSeCd(taskSeCd);
otptStngQuery.setSndngSeCd("02");
otptStngQuery.setPaperSeCd(paperSeCd);
DataObject otptBscStng = ifEmpty(otptStngMapper.selectOtptBscStng(otptStngQuery), DataObject::new);
//출력 요소별 설정
List<DataObject> otptArtclStngList = otptStngMapper.selectOtptArtclStngList(otptStngQuery);
DataObject sggStngInfo = stngBean.getStng("sgg");
DataObject deptStngInfo = stngBean.getStng("dept");
//
Map<String, String> globalVariable = printOption.getGlobalVariable();
if (globalVariable == null) {
globalVariable = new HashMap<String, String>();
}
globalVariable.put("offcsFilePath", sggStngInfo.string("OFFCS_FILE_PATH"));
globalVariable.put("logoFilePath", sggStngInfo.string("LOGO_FILE_PATH"));
globalVariable.put("instAddr", sggStngInfo.string("INST_ADDR"));
globalVariable.put("instDaddr", sggStngInfo.string("INST_DADDR"));
globalVariable.put("instZip", sggStngInfo.string("INST_ZIP"));
globalVariable.put("deptTelno", deptStngInfo.string("DEPT_TELNO"));
globalVariable.put("deptFxno", deptStngInfo.string("DEPT_FXNO"));
if (!otptBscStng.string("BCRN_IMG_PATH").equals("")) {
globalVariable.put("bcrnImgPath", otptBscStng.string("BCRN_IMG_PATH"));
}
printOption.setGlobalVariable(globalVariable);
Advntce pdfFormat = new Advntce(print,printOption,otptBscStng,otptArtclStngList,paperSeCd,dataObjectList);
Map<String, Object> result = pdfFormat.makeFile();
return new ModelAndView("downloadView")
.addAllObjects(result);
}
/** 사전통지 정보로 txt파일,이미지파일을 생성하고 압축파일로 반환한다.
* @return 사전통지서 압축파일
*/
@Task
@RequestMapping(name="사전통지서 외주 파일 생성", value=METHOD_URL.makeAdvanceNoticeOutsourcing)
public ModelAndView makeAdvanceNoticeOutsourcing(SndbQuery req, FimsPrintOption printOption) {
List<DataObject> list = sndngDtlService.getSndngTrgtDtlIds(req);
String[] crdnIds = list.stream().map(row -> row.string("CRDN_ID")).toList().toArray(new String[list.size()]);
SprtQuery sprtQuery = new SprtQuery()
.setCrdnIds(crdnIds);
List<DataObject> dataObjectList = integrationSearchMapper.selectIntegrationDataList(sprtQuery);
for (DataObject row: dataObjectList) {
DataObject sndngDtl = integrationSearchMapper.selectLatestSndngDtlInfo(row.string("CRDN_ID"));
row.set("SNDNG_DTL_ID", sndngDtl.string("SNDNG_DTL_ID"));
row.set("SNDNG_YMD", sndngDtl.string("SNDNG_YMD"));
row.set("OPNN_RANGE", row.string("SNDNG_YMD")+"~"+row.string("DUDT_YMD"));
row.set("RG_NO",sndngDtl.string("RG_NO"));
}
String taskSeCd = "";
for (int i = 0; i < dataObjectList.size(); i++) {
DataObject dataObject = dataObjectList.get(i);
if (taskSeCd.isEmpty())
taskSeCd = dataObject.string("TASK_SE_CD");
FileQuery fileQuery = new FileQuery()
.setInfoType(Crdn.INF_TYPE)
.setInfoKeys(dataObject.string("CRDN_ID"));
List<DataObject> fileInfoList = fileBean.getFileList(fileQuery);
int crdnPhotoCnt = fileInfoList.size();
for (int j=0; j < fileInfoList.size(); j++) {
DataObject fileInfo = fileInfoList.get(j);
dataObject
.set("CRDN_PHOTO"+(j+1), fileInfo.string("FILE_PATH"))
.set("CRDN_PHOTO"+(j+1)+"KEY", fileInfo.string("FILE_ID"));
List<DataObject> mosSet = mediaBean.getMosaicList(fileInfo.string("FILE_ID"));
if (mosSet != null) {
for (int k=0; k < mosSet.size(); k++) {
dataObject.set("MOS"+fileInfo.string("FILE_ID"), mosSet);
}
}
}
dataObject.set("CRDN_PHOTO_CNT", crdnPhotoCnt);
}
OutsourcingStngQuery stngQuery = new OutsourcingStngQuery()
.setSndngSeCd("02")
.setSggCd(currentUser().getOrgID())
.setTaskSeCd(taskSeCd);
List<DataObject> printStngItems = outsourcingStngBean.getArtclStngList(stngQuery);
Map<String, Object> result = new OutsourcingFileMaker("사전통지", printOption, printStngItems, dataObjectList).makeFile();
return new ModelAndView("downloadView")
.addAllObjects(result);
}
/** 고지서를 PDF 파일로 작성한다.
* @return 고지서 PDF파일
*/
@Task
@RequestMapping(name="고지서 pdf 파일 생성", value=METHOD_URL.makeNoticeSheetPdf)
public ModelAndView makeNoticeSheetPdf(SndbQuery req, FimsPrintOption printOption) {
// 고지서 출력 대상 자료 조회
List<DataObject> list = sndngDtlService.getSndngTrgtDtlIds(req);
String[] crdnIds = list.stream().map(row -> row.string("CRDN_ID")).toList().toArray(new String[list.size()]);
// 단속 대장 조회
List<DataObject> crdnList = integrationSearchMapper.selectIntegrationDataList(new SprtQuery().setCrdnIds(crdnIds));
Map<String, List<DataObject>> crdnFiles = fileBean.getFileList(new FileQuery().setInfoType(Crdn.INF_TYPE).setInfoKeys(crdnIds)).stream()
.collect(Collectors.groupingBy(row -> row.string("INF_KEY")));
for (DataObject dataObject: crdnList) {
List<DataObject> fileList = crdnFiles.get(dataObject.string("CRDN_ID"));
if (isEmpty(fileList)) continue;
for (int i = 0; i < fileList.size(); i++) {
DataObject fileInfo = fileList.get(i);
dataObject.set("CRDN_PHOTO"+(i+1), fileInfo.string("URL"));
String fileID = fileInfo.string("FILE_ID");
dataObject.set("CRDN_PHOTO"+(i+1)+"KEY", fileID);
List<DataObject> mosSet = mediaBean.getMosaicList(fileID);
if (!isEmpty(mosSet))
dataObject.set("MOS"+fileID, mosSet);
}
}
UserInfo userInfo = currentUser();
ogdpBean.initUserInfo(userInfo);
Print print = new Print();
print.setPrintRequestUserInfo(userInfo);
//출력물 기본 설정
String paperSeCd = printOption.getPaperSeCd();
String taskSeCd = printOption.getTaskSeCd();
OtptStngQuery otptStngQuery = new OtptStngQuery()
.setSndngSeCd("03")
.setPaperSeCd(paperSeCd)
.setSggCd((String)userInfo.getInfo().get("sggCd"))
.setTaskSeCd(taskSeCd);
DataObject otptBscStng = ifEmpty(otptStngMapper.selectOtptBscStng(otptStngQuery), DataObject::new);
//출력 요소별 설정
List<DataObject> otptArtclStngList = otptStngMapper.selectOtptArtclStngList(otptStngQuery);
DataObject sggStngInfo = stngBean.getStng("sgg");
DataObject deptStngInfo = stngBean.getStng("dept");
//
Map<String, String> globalVariable = ifEmpty(printOption.getGlobalVariable(), HashMap::new);
globalVariable.put("offcsFilePath", sggStngInfo.string("OFFCS_FILE_PATH"));
globalVariable.put("logoFilePath", sggStngInfo.string("LOGO_FILE_PATH"));
globalVariable.put("instAddr", sggStngInfo.string("INST_ADDR"));
globalVariable.put("instDaddr", sggStngInfo.string("INST_DADDR"));
globalVariable.put("instZip", sggStngInfo.string("INST_ZIP"));
globalVariable.put("deptTelno", deptStngInfo.string("DEPT_TELNO"));
globalVariable.put("deptFxno", deptStngInfo.string("DEPT_FXNO"));
if (!isEmpty(otptBscStng.string("BCRN_IMG_PATH"))) {
globalVariable.put("bcrnImgPath", otptBscStng.string("BCRN_IMG_PATH"));
}
printOption.setGlobalVariable(globalVariable);
Map<String, Object> result = new Nht(print,printOption,otptBscStng,otptArtclStngList,paperSeCd,crdnList).makeFile();
return new ModelAndView("downloadView")
.addAllObjects(result);
}
/** 고지서 정보로 txt파일,이미지파일을 생성하고 압축파일로 반환한다.
* @return 고지서 압축파일
*/
@Task
@RequestMapping(name="고지서 외주 파일 생성", value=METHOD_URL.makeNoticeSheetOutsourcing)
public ModelAndView makeNoticeSheetOutsourcing(SndbQuery req, FimsPrintOption printOption) {
// 고지서 출력 대상 자료 조회
List<DataObject> list = sndngDtlService.getSndngTrgtDtlIds(req);
String[] crdnIds = list.stream().map(row -> row.string("CRDN_ID")).toList().toArray(new String[list.size()]);
UserInfo userInfo = currentUser();
ogdpBean.initUserInfo(userInfo);
String taskSeCd = req.getTaskSeCd();
// 단속 대장 조회
SprtQuery sprtQuery = new SprtQuery()
.setCrdnIds(crdnIds);
List<DataObject> dataObjectList = integrationSearchMapper.selectIntegrationDataList(sprtQuery);
for (DataObject dataObject: dataObjectList) {
if (taskSeCd.isEmpty()) {
taskSeCd = dataObject.string("TASK_SE_CD");
}
FileQuery fileQuery = new FileQuery()
.setInfoType(Crdn.INF_TYPE)
.setInfoKeys(dataObject.string("CRDN_ID"));
List<DataObject> fileInfoList = fileBean.getFileList(fileQuery);
int crdnPhotoCnt = fileInfoList.size();
for (int j = 0; j < crdnPhotoCnt; j++) {
DataObject fileInfo = fileInfoList.get(j);
dataObject.set("CRDN_PHOTO"+(j + 1), fileInfo.string("FILE_PATH"));
String fileID = fileInfo.string("FILE_ID");
dataObject.set("CRDN_PHOTO"+(j + 1)+"KEY", fileID);
List<DataObject> mosSet = mediaBean.getMosaicList(fileID);
if (mosSet != null) {
for (int k=0; k < mosSet.size(); k++) {
dataObject.set("MOS"+fileID, mosSet);
}
}
}
dataObject.set("CRDN_PHOTO_CNT", crdnPhotoCnt);
}
OutsourcingStngQuery stngQuery = new OutsourcingStngQuery()
.setSndngSeCd("03")
.setSggCd(currentUser().getOrgID())
.setTaskSeCd(taskSeCd);
List<DataObject> printStngItems = outsourcingStngBean.getArtclStngList(stngQuery);
Map<String, Object> result = new OutsourcingFileMaker("고지서", printOption, printStngItems, dataObjectList).makeFile();
return new ModelAndView("downloadView").addAllObjects(result);
}
/**과태료대장 단속정보 등록를 등록한다.
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "saved": 등록되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task({"ECA","DPV","PES","DVS"})
@RequestMapping(name="세외수입 과태료대장 단속정보 등록", value=METHOD_URL.setNonTaxReceiptIndividualA01List)
public ModelAndView setNonTaxReceiptIndividualA01List(SndbQuery req, Sndng sndng) {
if ("lntris".equals(TaskProcessor.get().getNtrisInterface(req.getTaskSeCd()))) { // 지방 세외수입
boolean saved = false;
String rtnMsg = "";
SndngDtl sndngDtl = new SndngDtl();
sndngDtl.setTaskSeCd(req.getTaskSeCd());
// 발송상세 Ids 만큼 반복..
for (DataObject dtl: sndngDtlService.getSndngTrgtDtlIds(req)) {
sndngDtl.setSndngDtlId(dtl.string("SNDNG_DTL_ID"));
sndngDtl.setCrdnId(dtl.string("CRDN_ID"));
sndngDtl.setLinkTrgtCd(dtl.string("LINK_TRGT_CD"));
sndngDtl.setLinkMngKey(dtl.string("LINK_MNG_KEY"));
sndngDtl.setSndngDtlSttsCd(dtl.string("SNDNG_DTL_STTS_CD"));
sndngDtl.setDelYn("N");
sndngDtl.setSndngYmd(sndng.getSndngYmd());
rtnMsg = sndngDtlService.setNxrpIndivA01List(sndngDtl);
saved = rtnMsg.contains("[S]");
}
return new ModelAndView("jsonView")
.addObject("saved", saved)
.addObject("rtnMsg", rtnMsg);
} else { // 서울 세외수입
if (!"xls".equals(req.getDownload())) {
String resp = sndngDtlService.registerPreNotice(req);
return new ModelAndView("jsonView")
.addObject("saved", true)
.addObject("rtnMsg", resp);
} else {
return new ModelAndView("downloadView")
.addObject("download", sndngDtlService.downloadPreNotices(req));
}
}
}
/**과태료대장 상세조회(실시간)한다.
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "saved": 등록되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task({"ECA","DPV","PES","DVS"})
@RequestMapping(name="세외수입 과태료대장 상세조회", value=METHOD_URL.getNonTaxReceiptIndividualA03List)
public ModelAndView getNonTaxReceiptIndividualA03List(SndbQuery req) {
boolean saved = false;
List<DataObject> dtlIds = sndngDtlService.getSndngTrgtDtlIds(req);
String rtnMsg = dtlIds.isEmpty() ? "[F] 자료를 찾지못했습니다." : "";
boolean lntris = "lntris".equals(TaskProcessor.get().getNtrisInterface(req.getTaskSeCd()));
for (DataObject dtl: dtlIds) {
SndngDtl sndngDtl = new SndngDtl();
sndngDtl.setSndngDtlId(dtl.string("SNDNG_DTL_ID"));
sndngDtl.setCrdnId(dtl.string("CRDN_ID"));
sndngDtl.setLinkTrgtCd(dtl.string("LINK_TRGT_CD"));
sndngDtl.setLinkMngKey(dtl.string("LINK_MNG_KEY"));
sndngDtl.setSndngDtlSttsCd(dtl.string("SNDNG_DTL_STTS_CD"));
sndngDtl.setDelYn("N");
rtnMsg = lntris ? sndngDtlService.getNxrpIndivA03List(sndngDtl) : sndngDtlService.updatePreNotice(sndngDtl);
saved = rtnMsg.contains("[S]");
}
return new ModelAndView("jsonView")
.addObject("saved", saved)
.addObject("rtnMsg", rtnMsg);
}
/**과태료대장 상세조회(실시간)한다.
* @param req 발송대장 조회 조건
* @return jsonView
* <pre><code> {
* "saved": 등록되었으면 true, 그렇지 않으면 false
* }</code></pre>
*/
@Task
@RequestMapping(name="세외수입 체납상세 세목정보 조회", value=METHOD_URL.getNonTaxReceiptSpecialB01List)
public ModelAndView getNonTaxReceiptSpecialB01List(SndbQuery req) {
ModelAndView mav = getNonTaxReceiptIndividualA03List(req);
if (Boolean.TRUE.equals(mav.getModel().get("saved"))) {
List<DataObject> dtlIds = sndngDtlService.getSndngTrgtDtlIds(req);
mav.addObject("tnocs", dtlIds.size());
}
return mav;
/*
boolean saved = false;
String rtnMsg = "";
List<DataObject> dtlList = sndngDtlService.getSndngTrgtDtlIds(req);
// 발송상세 Ids 만큼 반복..
for (int iLoop = 0; iLoop < dtlList.size(); iLoop++) {
SndngDtl sndngDtl = new SndngDtl();
sndngDtl.setSndngDtlId(dtlList.get(iLoop).string("SNDNG_DTL_ID"));
sndngDtl.setCrdnId(dtlList.get(iLoop).string("CRDN_ID"));
sndngDtl.setLinkTrgtCd(dtlList.get(iLoop).string("LINK_TRGT_CD"));
sndngDtl.setLinkMngKey(dtlList.get(iLoop).string("LINK_MNG_KEY"));
sndngDtl.setSndngDtlSttsCd(dtlList.get(iLoop).string("SNDNG_DTL_STTS_CD"));
sndngDtl.setDelYn("N");
rtnMsg = sndngDtlService.getNxrpIndivA03List(sndngDtl);
if (rtnMsg.contains("[S]")) {
saved = true;
} else {
saved = false;
}
}
saved = true;
rtnMsg = "[S]";
return new ModelAndView("jsonView")
.addObject("saved", saved)
.addObject("rtnMsg", rtnMsg);
*/
}
}