itsm_ysm/src/main/java/nlib/col/service/impl/CartServiceImpl.java
2021-12-02 17:49:28 +09:00

602 lines
18 KiB
Java

package nlib.col.service.impl;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import nlib.cmm.service.NlibProperty;
import nlib.col.service.CartCookieVO;
import nlib.col.service.CartService;
import nlib.col.service.CollectionService;
import nlib.col.service.CollectionVO;
import nlib.util.StringUtil;
/**
* <pre>
* @Class Name : CartServiceImpl.java
*
* @Description : 카트관련 기능 서비스 구현 클래스
*
*
* @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
*
* </pre>
*
* @ ------------ -------- ---------------------------
* @ 수정일 수정자 수정내용
* @ ------------ -------- ---------------------------
* @ 2021. 10. 5. KNKIM 최초 생성
*
*
* @author 이씨플라자 * DIGITALSHIP KNKIM
* @since 2021. 10. 5.
* @version 1.0
*
*/
@Service("cartService")
public class CartServiceImpl implements CartService
{
private static final Logger log = LoggerFactory.getLogger(CartServiceImpl.class);
// 비로그인회원의 카트정보 쿠키명
public static final String CART_COOKIE_NAME = NlibProperty.getString("cart.cookie.name");
@Resource(name="cartDAO")
private CartDAO cartDAO;
@Resource(name = "collectionService")
private CollectionService collectionService;
/**
* (로그인자용) 로그인한 사용자의 카트 목록을 조회한다.
*
* @param mbInfoId
* @param cartDivCd
* @return
* @throws Exception
*/
public List<CollectionVO> listCartItems(String mbInfoId, String cartTypeCd) throws Exception {
return cartDAO.listCartItems(mbInfoId, cartTypeCd);
}
/**
* (비로그인자용) 쿠키에서 카트 목록을 조회한다.
*
* @param request
* @param cartTypeCd
* @return
* @throws Exception
*/
public List<CollectionVO> listCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, String cartTypeCd) throws Exception {
if(StringUtil.isEmpty(cartTypeCd)) return null;
List<CollectionVO> list = new ArrayList<CollectionVO>();
String targetCookieName = CART_COOKIE_NAME + cartTypeCd;
// _NLIB_COOKIE1=:masterId:masterId:
String cartStr = getCookie(request, targetCookieName);
if(StringUtil.isEmpty(cartStr)) return null;
String[] cartItemsStr = cartStr.split(":");
for(String itemStr : cartItemsStr) {
if(StringUtil.isEmpty(itemStr)) continue;
CollectionVO vo = CollectionVO.createWithMasterId(targetCookieName.substring(targetCookieName.length()-2), itemStr);
vo.setMbCartId(vo.getMasterId()); // 비회원 쿠키 카트의 경우, 카트ID를 자료ID로 대체한다.
if(vo != null) list.add(vo);
}
if(list.size() < 1) return null;
return list;
}
/**
* (로그인자용) 카트 영역 구분코드를 변경한다. (대출 <-> 방문열람)
*
* @param mbInfoId
* @param targetCartItems
* @return
* @throws Exception
*/
public String changeCartType(CollectionVO cartVO) throws Exception {
if(cartVO == null || StringUtil.isEmpty(cartVO.getMbInfoId())) return "회원 정보가 없습니다.";
if(StringUtil.isEmpty(cartVO.getSelItems())) return "변경할 대상 정보가 없습니다.";
String checkResult = checkValidCartItems(cartVO.getCartTypeCd(), cartVO.getSelItems());
if(checkResult != null) return checkResult;
updateSelItemsForDB(cartVO);
int resultCnt = cartDAO.changeCartType(cartVO);
if(resultCnt > 0) return null;
return "변경 처리에 실패하였습니다. 관리자에게 문의하여 주시기 바랍니다.";
}
/**
* (비로그인자용) 카트 영역 구분코드를 변경한다. (대출 <-> 방문열람)
*
* @param request
* @param targetCartItems
* @return
* @throws Exception
*/
public String changeCartTypeToCookie(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO) throws Exception {
if(cartVO == null) return "요청 정보가 없습니다.";
if(StringUtil.isEmpty(cartVO.getSelItems())) return "변경할 대상 정보가 없습니다.";
String checkResult = checkValidCartItems(cartVO.getCartTypeCd(), cartVO.getSelItems());
if(checkResult != null) return checkResult;
int totCnt = 0;
int sucCnt = 0;
int errCnt = 0;
String addCartTypeCd = null;
String delCartTypeCd = null;
if("1".equals(cartVO.getCartTypeCd())) {
addCartTypeCd = "1";
delCartTypeCd = "2";
} else if("2".equals(cartVO.getCartTypeCd())) {
addCartTypeCd = "2";
delCartTypeCd = "1";
} else {
return "카트 구분값 정보가 정확하지 않습니다.";
}
String[] masterIds = cartVO.getSelItems().split(",");
String resultMsgAdd = null;
String resultMsgDel = null;
// 쿠키 카트 정보 가져오기
CartCookieVO cartCookie = getCartCookieInfo(request);
for(int i=0; i<masterIds.length; i++) {
if(StringUtil.isEmpty(masterIds[i])) continue;
totCnt++;
resultMsgAdd = cartCookie.addCartItem(addCartTypeCd, masterIds[i]);
if(resultMsgAdd == null) {
sucCnt++;
resultMsgDel = cartCookie.removeCartItem(delCartTypeCd, masterIds[i]);
if(resultMsgDel != null) log.error("changeCartTypeFromCookie removing > " + delCartTypeCd + "카트 " + masterIds[i] + " : 삭제오류 => " + resultMsgDel);
} else {
errCnt++;
log.error("changeCartTypeFromCookie adding > " + addCartTypeCd + "카트 " + masterIds[i] + " : 추가 오류 => " + resultMsgAdd);
}
}
if(sucCnt > 0) {
String result = setCookieCart(response, cartCookie);
if(result == null) {
if(totCnt == sucCnt) return null;
else return String.format("총 %d건의 자료 중 %d건에 대한 변경 처리가 정상적으로 처리되었습니다.", totCnt, sucCnt);
} else {
return result;
}
}
return StringUtil.getString(resultMsgAdd, "") + StringUtil.getString(resultMsgDel, "");
}
/**
* (로그인자용) 카트에 추가한다.
*
* @param cartVO
* @return
* @throws Exception
*/
public String insertCartItem(CollectionVO cartVO) {
cartVO = checkValidCartItem(cartVO);
if(cartVO.getResultCode().charAt(0) != 'S') return cartVO.getResultMessage();
//-----------------------------------------------
// 등록 처리
//-----------------------------------------------
int resultCnt = cartDAO.insertCartItem(cartVO);
if(resultCnt > 0) return null;
return "등록 처리에 실패하였습니다. 관리자에게 문의하여 주시기 바랍니다.";
}
/**
* (비로그인자용) 카트에 추가한다.
*
* @param cartVO
* @return
* @throws Exception
*/
public String insertCartItemToCookie(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO) throws Exception {
cartVO = checkValidCartItem(cartVO);
if(cartVO.getResultCode().charAt(0) != 'S') return cartVO.getResultMessage();
//-----------------------------------------------
// 등록 처리
//-----------------------------------------------
// 쿠키 카트 정보 가져오기
CartCookieVO cartCookie = getCartCookieInfo(request);
String result = cartCookie.addCartItem(cartVO.getCartTypeCd(), cartVO.getMasterId());
if(result != null) return result;
return setCookieCart(response, cartCookie);
}
/**
* (비로그인자용) 쿠키에서 카트 정보를 조회하여 CartCookieVO 생성하여 리턴한다.
*
* @param request
* @return
*/
public CartCookieVO getCartCookieInfo(HttpServletRequest request) {
CartCookieVO cartCookieInfo = new CartCookieVO();
cartCookieInfo.setRentValues(getCookie(request, CART_COOKIE_NAME + "1"));
cartCookieInfo.setReadValues(getCookie(request, CART_COOKIE_NAME + "2"));
return cartCookieInfo;
}
/**
* (비로그인자용) 쿠키 카트에 자료 항목을 추가한다.
*
* @param request
* @param response
* @param cartTypeCd
* @param masterId
* @return
*/
public String setCookieCart(HttpServletResponse response, CartCookieVO cartCookie) {
if(response == null) return "쿠키를 저장할 Response 객체 정보가 없습니다.";
if(cartCookie == null) return "쿠키에 저장할 카트정보가 없습니다.";
setCookie(response, CART_COOKIE_NAME + "1", cartCookie.getRentValues());
setCookie(response, CART_COOKIE_NAME + "2", cartCookie.getReadValues());
return null;
}
/**
* (비로그인자용) 쿠키값을 설정한다.
*
* @param response
* @param name
* @param value
*/
public void setCookie(HttpServletResponse response, String name, String value) {
Cookie cookie = new Cookie(name, value);
cookie.setSecure(true);
cookie.setDomain(NlibProperty.getString("cart.cookie.domain"));
cookie.setPath(NlibProperty.getString("cart.cookie.path"));
response.addCookie(cookie);
}
/**
* (비로그인자용) 쿠키값을 가져온다.
*
* @param request
* @param cookieName
* @return
*/
public String getCookie(HttpServletRequest request, String cookieName) {
Cookie[] cookies = request.getCookies();
if(cookies == null || cookies.length < 1) return null;
if(StringUtil.isEmpty(cookieName)) return null;
for(Cookie cookie : cookies) {
if(cookieName.equalsIgnoreCase(cookie.getName())) {
return cookie.getValue();
}
}
return null;
}
/**
* 해당 자료가 대출/열람 카트 유형에 추가될 수 있는지 검증한다.
*
* @param String : null 정상
* @return
* @throws Exception
*/
public String checkValidCartItems(String cartTypeCd, String selItems) throws Exception {
if(StringUtil.isEmpty(cartTypeCd)) return "카트 유형 정보가 존재하지 않습니다.";
if(StringUtil.isEmpty(selItems)) return "대상 자료 정보가 존재하지 않습니다.";
String masterIds[] = selItems.split(",");
for(int i=0; i<masterIds.length; i++) {
CollectionVO cartVO = CollectionVO.createWithMasterId(cartTypeCd, masterIds[i]);
cartVO = checkValidCartItem(cartVO);
if(cartVO.getResultCode().charAt(0) != 'S') return cartVO.getTitle() + "에 대한 유형변경은 불가합니다. 대출 또는 방문열람이 가능한 자료인지 확인바랍니다.";
}
return null;
}
/**
* 카트에 추가할 수 있는 자료인지 확인하고, 대출/열람 유형을 검증한다. 필요시 대출/열람 유형을 변경하고 리턴한다.
*
* @param cartVO
* @return
* @throws Exception
*/
public CollectionVO checkValidCartItem(CollectionVO cartVO) {
if(cartVO == null) return new CollectionVO("FCART00", "카트에 추가할 자료 정보가 없습니다.");
//-----------------------------------------------
// 기존에 등록된 자료인지 확인
//-----------------------------------------------
int existCnt = cartDAO.countCartItem(cartVO);
if(existCnt > 0) {
cartVO.setResult("FCART01", "이미 카트에 등록된 자료입니다.");
return cartVO;
}
//-----------------------------------------------
// 해당 카트 구분값으로 등록가능한지 여부 체크
//-----------------------------------------------
CollectionVO searchColVO = new CollectionVO();
searchColVO.setMasterId(cartVO.getMasterId());
searchColVO.setMngOrgCd(cartVO.getMngOrgCd());
searchColVO.setTypeDivCd(cartVO.getTypeDivCd());
searchColVO.setMbInfoId(cartVO.getMbInfoId());
CollectionVO collectionVO = collectionService.getItemInfo(searchColVO);
// 자료 상세 조회 성공한 경우
if(collectionVO.getResultCode().startsWith("S")) {
cartVO.setTitle(collectionVO.getTitle());
// 대출인 경우
if("1".equals(cartVO.getCartTypeCd())) {
// 대출불가인 경우
if("02".equals(collectionVO.getOperOutRangeCd())) { // 대출가능여부 확인 : 02 대출불가
// 열람 가능인 경우 열람 처리
if(!"03".equals(collectionVO.getOperReadRangeCd())) {
cartVO.setCartTypeCd("2"); // 대출가능하지 않으나 열람 가능한 경우, 열람으로 강제 변경
} else {
cartVO.setResult("FCART02", "대출 및 열람이 불가한 자료입니다.");
return cartVO;
}
}
}
// 열람인 경우
else if("2".equals(cartVO.getCartTypeCd())) {
// 열람불가인 경우
if("03".equals(collectionVO.getOperReadRangeCd())) { // 열람가능여부 확인 : 03 열람불가
// 대출가능한 경우, 대출로 처리
if(!"02".equals(collectionVO.getOperOutRangeCd())) {
cartVO.setCartTypeCd("1"); // 대출가능한 경우, 대출로 강제 변경
} else {
cartVO.setResult("FCART03", "열람 및 대출이 불가한 자료입니다.");
return cartVO;
}
}
}
// 카드유형구분이 없는 경우, 대출->열람 우선순위서 설정
else {
if(!"02".equals(collectionVO.getOperOutRangeCd())) { // 대출가능여부 확인 : 02 대출불가
cartVO.setCartTypeCd("1"); // 대출가능한 경우, 대출로 설정
} else if(!"03".equals(collectionVO.getOperReadRangeCd())) { // 열람가능여부 확인 : 03 열람불가
cartVO.setCartTypeCd("2"); // 열람가능한 경우, 열람으로 설정
} else {
cartVO.setResult("FCART04", "대출 및 열람이 불가한 자료입니다.");
return cartVO;
}
}
}
// 자료 상세 조회 실패한 경우, 처리결과 메시지를 리턴한다.
else {
cartVO.setResult("FCART05", collectionVO.getResultMessage());
return cartVO;
}
cartVO.setResult("S", null);
return cartVO;
}
/**
* (로그인자용) 카트에서 선택된 자료들을 삭제한다.
*
* @param targetCartItems
* @return
* @throws Exception
*/
public String deleteCartItems(CollectionVO cartVO) throws Exception {
if(cartVO == null || StringUtil.isEmpty(cartVO.getMbInfoId())) return "회원 정보가 없습니다.";
String selItems = cartVO.getSelItems();
if(StringUtil.isEmpty(selItems)) return "삭제할 자료 정보가 없습니다.";
updateSelItemsForDB(cartVO);
int resultCnt = cartDAO.deleteCartItems(cartVO);
if(resultCnt > 0) return null;
return "변경 처리에 실패하였습니다. 관리자에게 문의하여 주시기 바랍니다.";
}
/**
* (비로그인자용) 카트에서 선택된 자료들을 삭제한다.
*
* @param targetCartItems
* @return
* @throws Exception
*/
public String deleteCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, CollectionVO cartVO) throws Exception {
if(cartVO == null) return "요청 정보가 없습니다.";
if(StringUtil.isEmpty(cartVO.getSelItems())) return "변경할 대상 정보가 없습니다.";
int totCnt = 0;
int sucCnt = 0;
int errCnt = 0;
String delCartTypeCd = cartVO.getCartTypeCd();
if(!"1".equals(delCartTypeCd) && !"2".equals(delCartTypeCd)) {
return "카트 구분값 정보가 정확하지 않습니다.";
}
// 쿠키 카트 정보 가져오기
CartCookieVO cartCookie = getCartCookieInfo(request);
String[] masterIds = cartVO.getSelItems().split(",");
String resultMsgDel = null;
for(int i=0; i<masterIds.length; i++) {
if(StringUtil.isEmpty(masterIds[i])) continue;
totCnt++;
resultMsgDel = cartCookie.removeCartItem(delCartTypeCd, masterIds[i]);
if(resultMsgDel == null) {
sucCnt++;
} else {
errCnt++;
log.error("changeCartTypeFromCookie removing > " + delCartTypeCd + "카트 " + masterIds[i] + " : 삭제 오류 => " + resultMsgDel);
}
}
if(sucCnt > 0) {
String result = setCookieCart(response, cartCookie);
if(result == null) {
if(totCnt == sucCnt) return null;
else return String.format("총 %d건의 자료 중 %d건에 대한 삭제가 정상적으로 처리되었습니다.", totCnt, sucCnt);
} else {
return result;
}
}
return StringUtil.getString(resultMsgDel, "");
}
public void updateSelItemsForDB(CollectionVO cartVO) {
if(cartVO == null || StringUtil.isEmpty(cartVO.getMbInfoId())) return;
String selItems = cartVO.getSelItems();
if(!selItems.startsWith("'")) {
String[] items = selItems.split(",");
String newSelItems = "";
for(String item : items) {
if(StringUtil.isEmpty(item)) continue;
if(newSelItems.length() > 0) newSelItems += ",";
newSelItems += "'" + item + "'";
}
cartVO.setSelItems(newSelItems);
}
log.debug("updateSelItemsForDB > " + cartVO.getSelItems());
}
/**
* 쿠키 카트(비로그인 상태의 카트정보) 존재하는 경우, 해당 사용자 카트(DB)로 등록한 후, 쿠키 카트 삭제한다.
*
* @param request
* @param response
* @return
* @throws Exception
*/
public int mergeCart(String mbInfoId, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 대출 카트
String cartTypeCds[] = {"1", "2"};
int mergeCnt = 0;
for(String cartTypeCd : cartTypeCds) {
List<CollectionVO> list = listCartItemsFromCookie(request, response, cartTypeCd);
if(list == null || list.size() < 1) continue;
for(CollectionVO item : list) {
item.setCartTypeCd(cartTypeCd);
item.setMbInfoId(mbInfoId);
item.setRegId(mbInfoId);
if(insertCartItem(item) != null) continue;
mergeCnt++;
}
}
// 쿠키 카트 정보 초기화
setCookieCart(response, new CartCookieVO());
return mergeCnt;
}
/**
* 쿠키 카트(비로그인 상태의 카트정보)에 존재하는 자료 개수를 리턴한다.
*
* @param request
* @param response
* @param cartTypeCd
* @return
* @throws Exception
*/
public int countCartItemsFromCookie(HttpServletRequest request, HttpServletResponse response, String cartTypeCd) throws Exception {
if(StringUtil.isEmpty(cartTypeCd)) return 0;
String targetCookieName = CART_COOKIE_NAME + cartTypeCd;
String cartStr = getCookie(request, targetCookieName);
if(StringUtil.isEmpty(cartStr)) return 0;
String[] cartItemsStr = cartStr.split(":");
int retCnt = 0;
for(String itemStr : cartItemsStr) {
if(StringUtil.isEmpty(itemStr)) continue;
retCnt++;
}
return retCnt;
}
/**
* 사용자 카트의 자료 개수를 리턴한다.
*
* @param mbInfoId
* @param cartTypeCd
* @return
* @throws Exception
*/
public int countCartItems(String mbInfoId, String cartTypeCd) throws Exception {
return cartDAO.countCartItems(mbInfoId, cartTypeCd);
}
}