구독서비스 결제 적용

This commit is contained in:
이대환
2026-03-19 10:09:51 +09:00
parent 3e77f9bf31
commit bcc7371b7a
15 changed files with 501 additions and 235 deletions

View File

@@ -419,8 +419,15 @@ public class BOMaMtngService {
//상품별 총 구매갯수 합계
Map<String, Integer> qySums = goodsList.stream()
.collect(Collectors.groupingBy(
// goodsInnb기준 키로 묶음
goods -> goods.get("goodsInnb").toString(),
goods -> {
// goodsInnb기준 키로 묶음
Object key = goods.get("goodsInnb");
if(key == null) {
// subsvcInnb기준 키로 묶음
key = goods.get("subsvcInnb");
}
return key.toString();
},
// qy 값을 합산
Collectors.summingInt(goods -> Integer.parseInt(goods.getOrDefault("qy", "0").toString()))
));

View File

@@ -79,6 +79,10 @@ public class BOOrderService {
LinkedHashMap setle = (LinkedHashMap) param.get("setle"); // 결제정보
List<LinkedHashMap> prsntList = (List<LinkedHashMap>) param.get("prsnt"); // 사은품 정보
if(param.containsKey("subsvcInnb")) {
setle.put("subsvcInnb", param.get("subsvcInnb"));
}
log.debug("구매자정보 => {} ", new Gson().toJson(purchsr));
log.debug("상품정보 => {} ", new Gson().toJson(goodsList));
log.debug("배송정보 => {} ", new Gson().toJson(shipping));
@@ -498,7 +502,7 @@ public class BOOrderService {
}
List<LinkedHashMap> itempPrsntList = new ArrayList<>();
if(!prsntList.isEmpty()){
if(prsntList != null && !prsntList.isEmpty()){
itempPrsntList.add(prsntList.get(i));
for (LinkedHashMap<String, Object> itemPrsntMap : itempPrsntList) {
if((goodsQy-j) > 1){
@@ -545,7 +549,7 @@ public class BOOrderService {
}
List<LinkedHashMap> itempPrsntList = new ArrayList<>();
if(!prsntList.isEmpty()){
if(prsntList != null && !prsntList.isEmpty()){
itempPrsntList.add(prsntList.get(i));
for (LinkedHashMap<String, Object> itemPrsntMap : itempPrsntList) {
itemPrsntMap.put("qy", qy.intValue());
@@ -981,7 +985,7 @@ public class BOOrderService {
inputOptnVO.setOptnVal4(optns[3]);
}
itemOptnVO.setOrdrGoodsOptnInnb(orderNoService.generateOrderItemOptnNo());
inputOptnVO.setOrdrGoodsOptnInnb(orderNoService.generateOrderItemOptnNo());
mapper.insertOrdrGoodsOption(inputOptnVO); // 주문 상품 입력 옵션 정보 등록
}
}
@@ -1445,7 +1449,7 @@ public class BOOrderService {
setleVO.setPgCmpnyNm("");
}
if (StringUtils.hasText((String) purchsr.get("mbrId"))) { // GC머니는 회원만 적용
if (StringUtils.hasText((String) purchsr.get("mbrId")) && orderVO.getSubsvcInnb() == null) { // GC머니는 회원만 적용
// GC 머니 사용했을 경우 여부, 금액 세팅 ( 결제유형과는 무관 )
Object useCashMlgAmt = enuri.get("useCashMlgAmt"); // 사용 GC 머니
if (useCashMlgAmt != null) {
@@ -2019,6 +2023,11 @@ public class BOOrderService {
orderVO.setMngrId((String) setle.get("mngrId")); // 관리자ID
orderVO.setMngrNm((String) setle.get("mngrNm")); // 관리자명
}
if (setle.containsKey("subsvcInnb")) { // 구독서비스 고유번호
int subsvcInnb = (Integer) setle.get("subsvcInnb");
orderVO.setSubsvcInnb(subsvcInnb);
}
} else {
orderVO.setOrdrSttusCd("0");
orderVO.setUseAt("Y");

View File

@@ -145,4 +145,6 @@ public class BOOrderVO extends AbstractVO {
private String secretKey;
private String currOrdrSttusCd;
private Integer subsvcInnb;
}

View File

@@ -99,4 +99,56 @@ private static final long serialVersionUID = 1L;
private String sortDv;
/** 배열 구독서비스고유번호 */
private List<String> arrSubsvcInnb;
/** 결제정보 */
/** 회원고유번호 */
private Integer mbrInnb;
/** 회원구분코드 */
private String mbrDvCd;
/** 결제상품정보 */
/** 판매상품 고유번호 */
private Integer goodsInnb;
/** 상품옵션 고유번호 */
private Integer goodsOptnInnb;
/** 개수 */
private Integer qy;
/** 입력옵션 텍스트 */
private String inputOptn;
/** 입력옵션 텍스트 */
private String inputOptnText;
/** 배송그룹고유번호 */
private Integer dlvyGroupInnb;
/** 상품상태코드 */
private String goodsSttusCd;
/** 상품상태명 */
private String goodsSttusNm;
/** 상품명 */
private String goodsNm;
/** 상품옵션 타입 */
private String optnTy;
/** 옵션관계번호 */
private String optnRelateNb;
/** 복수할인여부 */
private String compnbDscntAt;
/** 구간할인여부 */
private String sctnDscntAt;
/** 옵션필수여부 */
private String optnEssntlAt;
/** 소비자가 합계 (형식적용) */
private String subCnsmrpricByFormat;
/** 소비자가 합계 */
private Integer subCnsmrpric;
/** 소비자가 (형식적용) */
private String cnsmrpricByFormat;
/** 판매가 합계 (형식적용) */
private String subSlepricByFormat;
/** 판매가 합계 (형식적용) */
private Integer subSlepric;
/** 판매가 합계 (형식적용) */
private String slepricByFormat;
/** 상품이미지경로 */
private String goodsImgCours;
}

View File

@@ -9,6 +9,7 @@ import com.wb.domainserver.domain.gcone.goods.purchs.vo.BOGoodsVO;
import com.wb.domainserver.domain.gcone.goods.purchs.vo.BOOrderItemOptnVO;
import com.wb.domainserver.domain.gcone.goods.purchs.vo.BOOrderSetleVO;
import com.wb.domainserver.domain.gcone.goods.purchs.vo.BOOrderVO;
import com.wb.domainserver.domain.gcone.goods.subsvc.vo.BOSubsvcVO;
import com.wb.domainserver.domain.gcone.mbr.mbr.vo.BOMbrAppnVO;
import com.wb.domainserver.domain.gcone.ordr.ordr.vo.*;
@@ -994,6 +995,14 @@ public interface BOOrdrMapper {
*/
public List<DataMap> selectMbrSubsvcOrdrList(BOOrdrDlvyVO ordrDlvyVO);
/**
* 사용자 > 구독서비스 결제 > 구독서비스 주문 상품 목록 조회
* @param subsvcVO
* @return List<BOSubsvcVO>
*/
public List<BOSubsvcVO> selectSubsvcGoodsList(BOSubsvcVO subsvcVO);
/**
* 최종 한화금액이 결제금액보다 많은지 체크하여 환불금액(원화) update
* @param refundVO

View File

@@ -1,5 +1,6 @@
package com.wb.domainserver.domain.gcone.ordr.ordr.service;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nimbusds.jose.shaded.gson.Gson;
import com.wb.domainserver.common.prop.PropertyService;
@@ -2896,7 +2897,7 @@ public class BOOrdrService{
content.put("purchsr", purchsrMap);
content.put("mlgAccmlNtcList", purchsMapper.selectMlgAccmlNtcList(purchsrVO));
content.put("goodsList", goodsList);
content.put("goodsListByJson", new Gson().toJson(goodsList));
content.put("goodsListByJson", new Gson().toJson(goodsList));//subslepric
content.put("payInfo", payInfo);
content.put("shopInfo", shopInfo);
@@ -6187,6 +6188,10 @@ public class BOOrdrService{
subsvcVO.setSopmalCd(ordrVO.getSopmalCd());
subsvcVO.setSubsvcInnb(ordrVO.getSubsvcInnb());
//결제정보 추가
subsvcVO.setMbrInnb(ordrVO.getMbrInnb());
subsvcVO.setMbrDvCd(ordrVO.getMbrDvCd());
DataMap subsvcOne = subsvcService.selectBOSubsvcDetail(subsvcVO);
BOPurchsrVO purchsrVO = new BOPurchsrVO();
@@ -6246,7 +6251,7 @@ public class BOOrdrService{
*/
public Map<String, Object> selectSubsvcSetleExpectAmt(DataMap param) throws Exception {
Map<String, Object> content = new HashMap<>();
log.debug("selectSetleExpectAmt-param : {}", param);
log.debug("selectSubsvcSetleExpectAmt-param : {}", param);
LinkedHashMap setleExpectAmtMap = new LinkedHashMap() {{
put("goodsAmt", 0);
@@ -6259,27 +6264,54 @@ public class BOOrdrService{
put("useCashMlgAmt", 0);
put("dscntAmt", 0);
put("setleAmt", 0);
put("setleAmtKr", 0);
put("accmlMlgAmt", 0);
}};
BigDecimal goodsAmt = new BigDecimal(0);
BigDecimal setleAmt = new BigDecimal(0);
BigDecimal setleAmtKr = new BigDecimal(0);
LinkedHashMap subsvcOne = (LinkedHashMap) param.get("subsvcOne");
BigDecimal buyRate = mapper.selectBuyRate(param);
List<LinkedHashMap> subsvcList = (List<LinkedHashMap>) param.get("goodsList");
LinkedHashMap subsvcOne = subsvcList.get(0);
log.debug("subsvcOne : {}", subsvcOne);
goodsAmt = BigDecimal.valueOf((Integer) subsvcOne.get("selpric"));
setleAmt = BigDecimal.valueOf((Integer) subsvcOne.get("selpric"));
log.debug("결제 예정 금액 : {}", setleAmt);
// 환율계산
setleAmtKr = setleAmt.multiply(buyRate);
setleAmtKr = setleAmtKr.setScale(0,RoundingMode.HALF_UP);
log.debug("결제 예정 금액 (환율 적용) : {}", setleAmtKr);
// ############################################## 결제 예정 금액 적용 ##############################################
setleExpectAmtMap.put("goodsAmt", goodsAmt.intValue());
setleExpectAmtMap.put("setleAmt", setleAmt.intValue());
setleExpectAmtMap.put("setleAmtKr", setleAmtKr.intValue());
content.put("setleExpectAmt", setleExpectAmtMap);
content.put("subsvcOne", param.get("subsvcOne"));
content.put("goodsList", param.get("goodsList"));
return content;
}
/**
* 사용자 > 상품 > 장바구니 > 장바구니 조회 > 장바구니 상품 목록 조회
* @param subsvcVO
* @return Map<String, Object>
*/
public List<LinkedHashMap<String, Object>> selectSubsvcGoodsList(BOSubsvcVO subsvcVO) {
List<BOSubsvcVO> subsvcGoodsList = mapper.selectSubsvcGoodsList(subsvcVO);
ObjectMapper objectMapper = new ObjectMapper();
List<LinkedHashMap<String, Object>> goodsLinkedHashMapList =
new ObjectMapper().convertValue(subsvcGoodsList, new TypeReference<List<LinkedHashMap<String, Object>>>() {});
return goodsLinkedHashMapList;
}
/* ####################################
사용자 > 구독상품 > 구매/결제 > 구독서비스 결제 종료
#################################### */

View File

@@ -444,7 +444,7 @@ public class OrdrController {
* @return ResponseEntity<WnbtResponse>
*/
@Policy(AuthPolicy.RESTRICTED)
@RequestMapping(value="/selectOrderSubsvcOne", produces = MediaType.APPLICATION_JSON_VALUE)
@RequestMapping(value="/selectOrderSubsvcList", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<WnbtResponse> selectOrderSubsvcOne(@RequestBody HashMap<String, Object> param) {
AnonymousUser user = MemberJwtContextHolder.getMemberInfo();
BOSubsvcVO subsvcVO = new BOSubsvcVO();
@@ -452,9 +452,11 @@ public class OrdrController {
if ("01".equals(user.getSysDvCd())) {
subsvcVO.setSopmalCd(user.getSopmalCd());
}
subsvcVO.setMbrInnb((Integer) param.get("mbrInnb"));
subsvcVO.setSubsvcInnb(String.valueOf(param.get("subsvcInnb")));
DataMap content = subsvcService.selectBOSubsvcDetail(subsvcVO);
List<DataMap> content = new ArrayList<>();
content.add(subsvcService.selectBOSubsvcDetail(subsvcVO));
return ResponseEntity.ok(
WnbtResponse.builder()
@@ -788,6 +790,17 @@ public class OrdrController {
paramData.put(map.getKey(), map.getValue());
});
LinkedHashMap goodsOne = ((List<LinkedHashMap>) paramData.get("goodsList")).get(0);
if(goodsOne.containsKey("subsvcInnb")) {
BOSubsvcVO subsvcVO = new BOSubsvcVO();
subsvcVO.setSopmalCd((String) goodsOne.get("sopmalCd"));
subsvcVO.setSubsvcInnb(goodsOne.get("subsvcInnb").toString());
subsvcVO.setQy(1);
paramData.remove("goodsList");
paramData.put("goodsList", service.selectSubsvcGoodsList(subsvcVO));
}
Map<String, Object> resultMap = insertBOOrder(paramData);
// Map<String, Object> resultMap = responseHandler.handleResponseAsMap(
// sendToResrc.ofPost(RESRC.GCONEBO, "/gcone/ordr/ordr/insertBOOrder", param)
@@ -3106,6 +3119,8 @@ public class OrdrController {
List<LinkedHashMap> goodsList = (List<LinkedHashMap>) param.get("goodsList"); // 상품정보
LinkedHashMap enuri = null;
LinkedHashMap setle = null;
// 구독서비스 여부
Boolean isSubsvc = goodsList.get(0).containsKey("subsvcInnb");
//회원일 경우에만 enuri정보 존재
if(user.getUserInnb() > 0){
@@ -3151,8 +3166,7 @@ public class OrdrController {
return content;
}
if (CollectionUtils.isEmpty(enuri)) {
if (!isSubsvc && CollectionUtils.isEmpty(enuri)) {
log.info("할인 또는 결제 정보를 찾을 수 없습니다.");
content.put("result","Y");
content.put("message", "할인 또는 결제 정보를 찾을 수 없습니다.");
@@ -3162,7 +3176,7 @@ public class OrdrController {
String sopmalCd = (String) param.get("sopmalCd");
String ordrTyCd = (String) param.get("ordrTyCd");
String mbrInnb = (String) goodsList.get(0).get("mbrInnb");
String mbrInnb = String.valueOf(goodsList.get(0).get("mbrInnb"));
String mbrDvCd = (String) goodsList.get(0).get("mbrDvCd");
String ordrrMbtlnb = (String) purchsr.get("mbtlnb");
@@ -3300,7 +3314,12 @@ public class OrdrController {
//회원/비회원 총결제금액
String reqSetleAmt = StringUtil.isNullToString(setle.get("rlSetleAmt"));
//재계산된 총결제금액관련정보
Map<String, Object> resultAmt = service.selectSetleExpectAmt(param);
Map<String, Object> resultAmt;
if(isSubsvc) {
resultAmt = service.selectSubsvcSetleExpectAmt(param);
} else {
resultAmt = service.selectSetleExpectAmt(param);
}
if(resultAmt.containsKey("setleExpectAmt")){
LinkedHashMap setleExpectAmt = (LinkedHashMap) resultAmt.get("setleExpectAmt");