대출(예약)신청 확인, 신청 처리

This commit is contained in:
KNKIM 2021-10-26 16:54:20 +09:00
parent 61e271c1e7
commit f7d1dbfa2f
6 changed files with 467 additions and 31 deletions

View File

@ -25,6 +25,17 @@ public interface RentService
* @return
*/
public DataApiResVO listRentItems(CollectionVO searchVO);
/**
* 대출을 신청한다.
*
* @param list
* @param mbInfoId
* @param mngOrgCd
* @return
*/
public List<CollectionVO> insertRentItems(List<CollectionVO> list, String mbInfoId, String mngOrgCd);
//
// /**
// * 반납 연기 목록을 조회한다.

View File

@ -70,6 +70,66 @@ public class RentServiceImpl implements RentService
reqVO.putInfoItem("bookLtRvStatusCd", searchVO.getBookLtRvStatusCd());
return dataApi.request(reqVO);
}
/**
* 대출을 신청한다.
*
* @param list
* @param mbInfoId
* @param mngOrgCd
* @return
*/
public List<CollectionVO> insertRentItems(List<CollectionVO> list, String mbInfoId, String mngOrgCd) {
if(list == null || list.size() < 1) return null;
if(StringUtil.isEmpty(mbInfoId)) {
log.error("insertRentItems > 사용자ID를 확인할 수 없습니다.");
return null;
}
if(StringUtil.isEmpty(mngOrgCd)) {
log.error("insertRentItems > 관리문화원 코드를 확인할 수 없습니다.");
return null;
}
// API 호출
/*
mngOrgCd 문화원코드 O String SU01
mbInfoId 사용자아이디 O String "BDCCAF34CF8AA365C660ADB121CE6741
(ARIAUtil 암호화)"
masterId -> jsonMasterId 자료번호 : 다건 가능하여야 O String UR-013ABB95CCD84FDA9600CCAE97032C4D
*/
DataApiReqVO reqVO = new DataApiReqVO("/uac/service/nlib/rent/insertRentItem", HttpMethod.POST);
reqVO.setMbInfoId(mbInfoId); // 통신 , 암호화되어 송수신됨
reqVO.putInfoItem("mngOrgCd", mngOrgCd);
CollectionVO cVO = null;
DataApiResVO resVO = null;
for(int i=0; i<list.size(); i++) {
cVO = list.get(0);
if(StringUtil.isEmpty(cVO.getMasterId())) {
cVO.setResult("F-REQ-MASTERID", "자료ID 정보가 없습니다.");
continue;
}
reqVO.putInfoItem("masterId", cVO.getMasterId());
resVO = dataApi.request(reqVO);
cVO.setResult(resVO.getResultCode(), resVO.getResultMessage());
// 대출예약번호 설정 (rsrvId)
if(StringUtil.startsWithIgnoreCase(resVO.getResultCode(), "S")) {
cVO.setRsrvId(resVO.getInfoItem("rsrvId", ""));
} else {
cVO.setRsrvId(null);
}
}
return list;
}
//
// /*
// * 반납 연기 목록을 조회한다.

View File

@ -154,9 +154,11 @@ public class RentController extends NlibCommonController
return makeResponseEntityJson(retMap);
}
@RequestMapping("/rent/confirmRent.do")
@RequestMapping(value={"/rent/confirmRentFromCart.do", "/rent/confirmRent.do"})
public String confirmRent(HttpServletRequest request, CollectionVO rentVO, ModelMap model) throws Exception {
boolean fromCart = request.getServletPath().contains("Cart.do");
String mbInfoId = getMbInfoId(request);
if(StringUtil.isEmpty(mbInfoId)) {
@ -173,32 +175,49 @@ public class RentController extends NlibCommonController
List<CollectionVO> list = collectionService.makeInfoListOfCollectionVO(selItems, mbInfoId, NlibProperty.getString("thumbnail.image.url.small"));
model.addAttribute("rentVO", rentVO);
model.addAttribute("list", list);
if(fromCart) model.addAttribute("fromCart", fromCart ? "Y" : "N");
return "nlib/rent/confirmRent";
}
@RequestMapping(value={"/rent/insertRentItems.do"})
public String insertRentItems(HttpServletRequest request, CollectionVO rentVO, ModelMap model) throws Exception {
String retJsp = "nlib/rent/insertRentItems";
String mbInfoId = getMbInfoId(request);
if(StringUtil.isEmpty(mbInfoId)) {
model.addAttribute("message", "로그인 후, 이용해 주시기 바랍니다.");
return retJsp;
}
if(rentVO == null || StringUtil.isEmpty(rentVO.getSelItems())) {
model.addAttribute("message", "대출(예약)신청할 정보가 없습니다.");
return retJsp;
}
if(StringUtil.isEmpty(rentVO.getMngOrgCd())) {
model.addAttribute("message", "관리문화원 정보가 없습니다.");
return retJsp;
}
String selItems = rentVO.getSelItems();
List<CollectionVO> list = collectionService.makeInfoListOfCollectionVO(selItems, mbInfoId, NlibProperty.getString("thumbnail.image.url.small"));
list = rentService.insertRentItems(list, mbInfoId, rentVO.getMngOrgCd());
model.addAttribute("rentVO", rentVO);
model.addAttribute("list", list);
return retJsp;
}
//
// /** 대출 목록 화면을 호출한다.
// * @param req
// * @return
// */
// @RequestMapping("/rent/listRentItems_BK.do")
// public String listRentItems_BK(HttpServletRequest req, Authentication authentication, @RequestParam Map<String, String> paramMap, ModelMap model) throws Exception {
// String searchKeyword = paramMap.get("searchKeyword");
// String pageIndex = StringUtil.getString(paramMap.get("pageIndex"), "1");
// String pageSize = StringUtil.getString(paramMap.get("pageSize") , DEFUALT_PAGE_SIZE);
//
// // 페이징 사이즈 코드 목록 조회 (DB방식으로 변경 2021.08.06 KNKIM)
// List<HashMap<String,String>> pageSizeCodes = codeService.listCodes("PAGE_SIZE_OPTION");
//
// // 반환 정보
// model.addAttribute("pageIndex" , pageIndex);
// model.addAttribute("pageSize" , pageSize);
// model.addAttribute("searchKeyword", searchKeyword);
// model.addAttribute("pageSizeCodes", pageSizeCodes);
// return "nlib/rent/listRentItems";
// }
//
// /** 대출 목록 화면을 호출한다.
// * @param req

View File

@ -68,7 +68,23 @@ public interface DataApiInterface {
if(reqVO.hasInfo()) {
HashMap<String, String> info = reqVO.getInfo();
for(String key : info.keySet()) {
String val = info.get(key);
String val = null;
if(DataApiVO.XML_EL_NAME_MB_INFO_ID.equals(key)) {
val = reqVO.getEncMbInfoId();
} else {
val = info.get(key);
}
/*
String encVal = null;
try {
encVal = URLEncoder.encode((String)val, "UTF-8");
} catch(Exception e) {
log.error("makeRequestParamUrl > " + e.toString());
continue;
}
*/
map.add(key, val);
}
}
@ -121,13 +137,14 @@ public interface DataApiInterface {
} else {
val = info.get(key);
}
/*
String encVal = null;
try {
encVal = URLEncoder.encode((String)val, "UTF-8");
} catch(Exception e) {
log.error("makeRequestParamUrl > " + e.toString());
continue;
}
}*/
builder.queryParam(key, (String)val);
}
}

View File

@ -59,6 +59,8 @@ $( document ).ready(function() {
}
$("#mngOrgCd").val(mngOrgCd);
$("#mngOrgNm").val($("#_" + mngOrgCd + "_nm").text());
$("[id^=chk_item_" + mngOrgCd + "]").filter(":first").trigger("change");
});
@ -168,12 +170,10 @@ function fn_appRent() {
return;
}
if(!confirm(($("[id^=chk_item_]:checked").length) + "건을 대출신청하시겠습니까?\n\n[안내]\n- 대출중인 자료는 대출예약으로 신청됩니다.\n- 대출대기자가 존재하는 경우, 대출신청/예약이 불가능합니다.")) {
return;
}
$("#selItems").val(fn_getCheckedCartItemsValues());
$("#frm").attr("action","${pageContext.request.contextPath}/rent/confirmRent.do");
$("#frm").attr("action","${pageContext.request.contextPath}/rent/confirmRentFromCart.do");
$("#frm").submit();
</sec:authorize>
@ -213,9 +213,11 @@ $(document).ready(function() {
</script>
<form name="frm" id="frm" action="${pageContext.request.contextPath}/cart/listCartItems.do" method="post">
<input type="hidden" id="cartTypeCd" name="cartTypeCd" value="${cartTypeCd }" />
<input type="hidden" id="mngOrgCd" name="mngOrgCd" value="" />
<input type="teselItemsxt" id="selItems" name="selItems" value="" />
<input type="text" id="cartTypeCd" name="cartTypeCd" value="${cartTypeCd }" />
<input type="text" id="mngOrgNm" name="mngOrgNm" value="${mngOrgNm }" />
<input type="text" id="mngOrgCd" name="mngOrgCd" value="" />
<input type="text" id="selItems" name="selItems" value="" />
<!-- 카트 섹션 -->
<section class="location cart">
@ -264,7 +266,7 @@ $(document).ready(function() {
<c:set var="mngOrgCdCnt" value="0" />
<!-- 문화원 시작 -->
<h3><label><input type="radio" id="selMngOrgCd" name="selMngOrgCd" value="${cart.mngOrgCd}">${cart.mngOrgNm } (<span class="count" id="_${cart.mngOrgCd}_cnt"></span>)</label></h3>
<h3><label><input type="radio" id="selMngOrgCd" name="selMngOrgCd" value="${cart.mngOrgCd}"><span id="_${cart.mngOrgCd}_nm">${cart.mngOrgNm }</span> (<span class="count" id="_${cart.mngOrgCd}_cnt"></span>)</label></h3>
<div class="list-cart">
<div class="list t-tit-line">
<div class="t-chk"><input type="checkbox" id="chk_all_${cart.mngOrgCd }" name="chk_all_${cart.mngOrgCd }" onclick="fn_selectAll('${cart.mngOrgCd}')"></div>

View File

@ -0,0 +1,327 @@
<%
/**
* <pre>
* @Class Name : confirmRent.jsp
*
* @Description : 대출신청 확인 화면
*
*
* @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
*
* </pre>
*
* @ ------------ -------- ---------------------------
* @ 수정일 수정자 수정내용
* @ ------------ -------- ---------------------------
* @ 2021. 10. 25. KNKIM 최초 생성
*
*
* @author 이씨플라자 * DIGITALSHIP KNKIM
* @since 2021. 10. 25.
* @version 1.0
*
*/
%>
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
<script type="text/javaScript" language="javascript">
var BTN_APP_PREFIX = "대출신청/예약";
$( document ).ready(function() {
$("[id^=chk_item_]").prop("disabled", true);
$("[id^=chk_all_]").prop("disabled", true);
$("[id=selMngOrgCd]").change(function(obj) {
var checked = $(this).prop("checked");
var mngOrgCd = $(this).val();
if(checked) {
// uncheck others and disable
// enable
//$("[id^=chk_item_" + mngOrgCd + "]").prop("checked", false);
$("[id^=chk_item_" + mngOrgCd + "]").prop("disabled", false);
$("[id^=chk_all_" + mngOrgCd + "]").prop("disabled", false);
$("[id^=chk_item_]").not("[id^=chk_item_" + mngOrgCd + "]").prop("checked", false);
$("[id^=chk_item_]").not("[id^=chk_item_" + mngOrgCd + "]").prop("disabled", true);
$("[id^=chk_all_]").not("[id^=chk_all_" + mngOrgCd + "]").prop("checked", false);
$("[id^=chk_all_]").not("[id^=chk_all_" + mngOrgCd + "]").prop("disabled", true);
}
$("#mngOrgCd").val(mngOrgCd);
$("[id^=chk_item_" + mngOrgCd + "]").filter(":first").trigger("change");
});
$("[id^=chk_item_]").change(function(obj) {
var mngOrgCd = $(this).attr("id").substr(9);
var totNum = $("[id^=chk_item_" + mngOrgCd + "]").length;
var selNum = $("[id^=chk_item_" + mngOrgCd + "]:checked").length;
var checked = false;
if(totNum <= selNum) checked = true;
$("[id^=chk_all_" + mngOrgCd + "]").prop("checked", checked);
$("#btnApp").val(BTN_APP_PREFIX + " (" + selNum + ")");
$("#appCnt").text("(" + selNum + ")");
});
$("[id^=selMngOrgCd]").filter(":first").prop("checked", true);
$("[id^=selMngOrgCd]").filter(":first").trigger("change",true);
}); // document ready
// 선택한 게시글 상세 보기로 이동
function fn_viewDetail(articleNo) {
$("#articleNo").val(articleNo);
$("#articleForm").attr("action", "${pageContext.request.contextPath}/board/selectNotice.do");
$("#articleForm").submit();
}
function fn_insertRentItems() {
<sec:authorize access="not isAuthenticated()">
alert("먼저 로그인하신 후, 이용해 주시기 바랍니다.");
</sec:authorize>
<sec:authorize access="isAuthenticated()">
if($("#selItems").val() == "" || $("#selItems").val() == ",") {
alert("대출할 대상정보가 없습니다.");
return;
}
$("#frm").attr("action","${pageContext.request.contextPath}/rent/insertRentItems.do");
$("#frm").submit();
</sec:authorize>
}
function fn_changeInterest(masterId, onOff) {
alert("관심등록/삭제 준비중 : " + masterId + ", " + onOff);
}
function fn_gotoDetail(masterId) {
alert("상세보기 준비중 : " + masterId);
}
$(document).ready(function() {
/* 탭메뉴 */
var selectedIdx = '> li:eq(' + (${cartTypeCd } -1) + ')';
$('.cartTab ul.tabs').addClass('active').find(selectedIdx).addClass('current');
$('.tab ul.tabs li a').click(function (g) {
var tab = $(this).closest('.tab'),
index = $(this).closest('li').index();
tab.find('ul.tabs > li').removeClass('current');
$(this).closest('li').addClass('current');
tab.find('.tab_content').find('div.tabs_item').not('div.tabs_item:eq(' + index + ')').hide();
tab.find('.tab_content').find('div.tabs_item:eq(' + index + ')').show();
g.preventDefault();
});
if("${message}" != "") alert("${message}");
});
</script>
<form name="frm" id="frm" action="${pageContext.request.contextPath}/cart/listCartItems.do" method="post">
<input type="text" id="cartTypeCd" name="cartTypeCd" value="${rentVO.cartTypeCd }" />
<input type="text" id="mngOrgCd" name="mngOrgCd" value="${rentVO.mngOrgCd }" />
<!-- 카트 섹션 -->
<section class="location cart">
<h2 class="blind">카트 섹션영역</h2>
<div class="inner">
<div class="row-top">
<div class="location-box">
<ul class="loc">
<li>HOME</li>
<c:if test='${fromCart == "Y" }'>
<li>카트</li>
</c:if>
<li class="on">대출신청/예약</li>
</ul>
<ul class="tit">
<li><span>대출신청/예약</span></li>
</ul>
</div>
<div class="arr"><img src="/images/icon/icon-join-arr2.png" alt="화살표 아이콘"></div>
</div>
<div class="contents row-bottom">
<div class="cart-box">
<div class="tab">
<div class="tab_content">
<div class="tabs_item">
<div class="inner">
<div class="list-cart-wrap confirm">
<c:set var="totCnt" value="0" />
<c:set var="rentType1Cnt" value="0" />
<c:set var="rentType2Cnt" value="0" />
<c:set var="curType" value="" />
<c:set var="selItems" value="" />
<h3><label>대출신청/예약확인 : ${rentVO.mngOrgNm }</label></h3>
<div class="list-cart">
<div class="list t-tit-line">
<div class="t-data">자료정보</div>
<div class="t-state">이용상태</div>
<div class="t-date">반납예정일</div>
<div class="t-reser">신청/예약정보</div>
<div class="t-visit">비고</div>
</div>
<c:forEach var="rent" items="${list}" varStatus="status">
<c:set var="curType" value="0" />
<%
//-----------------------------------
// 대출신청인 경우
//-----------------------------------
// 대출가능코드(operOutRangeCd)가 01:대출가능이면서
// 이용상태코드 (useStatus)가 01:이용가능, 또는 05 : 이용가능, 또는 04 : 열람대기(대출가능) 인 경우
%>
<c:if test="${rent.operOutRangeCd == '01' and (rent.useStatus == '01' or rent.useStatus == '04' or rent.useStatus == '05') }">
<c:set var="rentType1Cnt" value="${rentType1Cnt+1}" />
<c:set var="curType" value="1" />
<c:set var="selItems" value='${selItems += "," += rent.masterId }' />
</c:if>
<%
//-----------------------------------
// 대출예약신청인 경우
//-----------------------------------
// 대출가능코드(operOutRangeCd)가 01 :대출가능이면서
// 이용상태코드 (useStatus)가 02 : 대출중 (대기자 0명) 인 경우
%>
<c:if test="${rent.operOutRangeCd == '01' and rent.useStatus == '02' }">
<c:set var="rentType2Cnt" value="${rentType2Cnt+1}" />
<c:set var="curType" value="2" />
<c:set var="selItems" value='${selItems += "," += rent.masterId }' />
</c:if>
<div class="list">
<div class="t-data">
<div class="img"><a href="javascript:void(0)"><img src="${rent.rprsThumbUrl }" alt="" width="60" height="91" title="상세보기" onclick="fn_gotoDetail('${rent.masterId }')"></a>
<c:if test='${cart.MUseYn == "Y"}'>
<span class="favorites" onclick="fn_changeInterest('${rent.masterId }', 'off')" title="관심자료에서 삭제합니다.">
<img src="/images/icon/icon-cart-Favorites-on.png" class="off" alt="즐겨찾기 아이콘">
<img src="/images/icon/icon-cart-Favorites.png" class="on" alt="즐겨찾기 아이콘">
</span>
</c:if>
<c:if test='${rent.MUseYn != "Y"}'>
<span class="favorites" onclick="fn_changeInterest('${rent.masterId }', 'on')" title="관심자료로 등록합니다.">
<img src="/images/icon/icon-cart-Favorites.png" class="off" alt="즐겨찾기 아이콘">
<img src="/images/icon/icon-cart-Favorites-on.png" class="on" alt="즐겨찾기 아이콘">
</span>
</c:if>
</div>
<div class="type">
<c:if test="${rent.openDivCd != '3' }">
<span class="online">온라인열람</span>
</c:if>
<c:if test="${rent.operOutRangeCd == '01' }">
<span class="loan">대출</span>
</c:if>
<c:if test="${rent.operReadRangeCd != '03' }">
<span class="visit">방문열람</span>
</c:if>
</div>
<div class="title"><a href="javascript:void(0)" onclick="fn_gotoDetail('${rent.masterId }')" title="상세보기">${rent.title }</a></div>
</div>
<div class="t-state <c:if test="${rent.useStatus != '03' and rent.useStatus != '06' }">poss</c:if> <c:if test="${rent.useStatus == '03' or rent.useStatus == '06' }">imposs</c:if>"><p>${rent.useStatusNm }</p></div>
<div class="t-date">${rent.rtnExpctDd }</div>
<div class="t-reser <c:if test='${curType != "0" }'>poss</c:if> <c:if test='${curType == "0" }'>imposs</c:if> ">
<c:if test='${curType == "0" }'>신청 불가</c:if>
<c:if test='${curType == "1" }'>대출신청</c:if>
<c:if test='${curType == "2" }'>대출예약</c:if>
</div>
<div class="t-visit">
<c:if test='${curType == "0" }'>이미 대출 대기자가 있거나 대출가능 자료가 아닙니다.</c:if>
<c:if test='${curType == "1" }'>대출신청 자료는 신청 다음날까지 방문대출이 가능합니다.</c:if>
<c:if test='${curType == "2" }'>대출예약 자료는 반납 즉시 문자(SMS)나 이메일로 안내 드립니다.</c:if>
</div>
</div>
</c:forEach>
</div> <!-- 목록 테이블 list-cart : 종료 -->
</div>
<div class="total-box">
<div class="row-top">
<div class="t-subsc">대출신청</div>
<div class="t-reser">대출예약</div>
<div class="t-total">총 자료 건수</div>
</div>
<div class="row-bottom">
<div class="t-subsc"><strong>${rentType1Cnt}</strong>건</div>
<div class="plus"><strong>+</strong></div>
<div class="t-reser"><strong>${rentType2Cnt}</strong>건</div>
<div class="result"><strong>=</strong></div>
<div class="t-total"><strong>${rentType1Cnt + rentType2Cnt}</strong>건</div>
</div>
</div>
<c:if test='${rentVO.cartTypeCd == "1"}'>
<p class="text">- 대출예약 자료는 반납 즉시 문자(SMS)나 이메일을 통해 안내 드리며, 3일간 별도 보관됩니다. (3일이 지나면 예약이 취소됩니다.)</p>
<p class="text">- 대출신청 자료의 경우 대출을 신청한 후 다음날까지 방문대출이 가능합니다.</p>
</c:if>
<c:if test='${rentVO.cartTypeCd == "2"}'>
<p class="text">- 자료 열람은 방문열람신청이 승인된 후, 지정된 시간에 가능합니다.</p>
<p class="text">- 방문열람신청이 승인되면 문자(SMS)나 이메일을 통해 안내 드립니다.</p>
</c:if>
<div class="btn-wrap">
<button type="button" class="btn btn-gray">취소</button>
<c:if test="${(rentType1Cnt + rentType2Cnt) > 0}">
<button type="button" class="btn btn-color" onclick="fn_insertRentItems()">신청/예약하기<span id="totCnt" class="count">(${rentType1Cnt + rentType2Cnt})</span></button>
</c:if>
<c:if test="${(rentType1Cnt + rentType2Cnt) < 1}">
<button type="button" class="btn btn-color" onclick="alert('대출신청할 자료가 없습니다.');">신청/예약하기<span id="totCnt" class="count">(${rentType1Cnt + rentType2Cnt})</span></button>
</c:if>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<input type="text" id="selItemsOld" name="selItemsOld" value="${rentVO.selItems }" />
<input type="text" id="selItems" name="selItems" value="${selItems }" />
</form>