Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/order' into xodud1202

xodud1202 5 anni fa
parent
commit
e02d6b4009
20 ha cambiato i file con 688 aggiunte e 175 eliminazioni
  1. 24 0
      src/main/java/com/style24/core/biz/dao/TscCouponDao.java
  2. 22 2
      src/main/java/com/style24/core/biz/dao/TscOrderChangeDao.java
  3. 10 1
      src/main/java/com/style24/core/biz/dao/TscOrderDao.java
  4. 22 0
      src/main/java/com/style24/core/biz/service/TscCouponService.java
  5. 365 133
      src/main/java/com/style24/core/biz/service/TscOrderChangeService.java
  6. 18 4
      src/main/java/com/style24/core/biz/service/TscOrderService.java
  7. 42 1
      src/main/java/com/style24/core/biz/service/TscPointService.java
  8. 11 11
      src/main/java/com/style24/core/biz/service/TscWmsService.java
  9. 3 0
      src/main/java/com/style24/persistence/domain/Coupon.java
  10. 22 0
      src/main/java/com/style24/persistence/domain/CouponAfChannel.java
  11. 3 0
      src/main/java/com/style24/persistence/domain/OrderChange.java
  12. 1 0
      src/main/java/com/style24/persistence/domain/Point.java
  13. 3 4
      src/main/java/com/style24/persistence/domain/Review.java
  14. 27 0
      src/main/java/com/style24/persistence/domain/ReviewAttach.java
  15. 5 3
      src/main/java/com/style24/persistence/domain/WmsDelivery.java
  16. 46 2
      src/main/java/com/style24/persistence/mybatis/shop/TscCoupon.xml
  17. 12 0
      src/main/java/com/style24/persistence/mybatis/shop/TscOrder.xml
  18. 40 1
      src/main/java/com/style24/persistence/mybatis/shop/TscOrderChange.xml
  19. 6 7
      src/main/java/com/style24/persistence/mybatis/shop/TscPoint.xml
  20. 6 6
      src/main/java/com/style24/persistence/mybatis/wms/TscWmsDelivery.xml

+ 24 - 0
src/main/java/com/style24/core/biz/dao/TscCouponDao.java

@@ -136,6 +136,14 @@ public interface TscCouponDao {
      */
     ArrayList<Coupon> getLimitedTimeCouponList(int cpnId);
 
+    /**
+     * 쿠폰 제휴채널 조회
+     * @param cpnId
+     * @author bin2107
+     * @since 2021. 04. 22
+     */
+    ArrayList<Coupon> getCouponAfChannelList(int cpnId);
+
     /**
      * 쿠폰 마스터 수정
      * @param
@@ -192,6 +200,14 @@ public interface TscCouponDao {
      */
     void deleteLimitedTimeCoupon(Coupon coupon);
 
+    /**
+     * 쿠폰 제휴링크 삭제
+     * @param
+     * @author bin2107
+     * @since 2021. 4. 22
+     */
+    void deleteCouponAfChannel(Coupon coupon);
+
     /**
      * 쿠폰 등록
      * @param params
@@ -248,6 +264,14 @@ public interface TscCouponDao {
      */
     void createLimitedTimeCoupon(CouponLimitedTime couponLimitedTime);
 
+    /**
+     * 쿠폰 제휴링크 저장
+     * @param couponLimitedTime
+     * @author bin2107
+     * @since 2021. 04. 22
+     */
+    void createCouponAfChannel(CouponAfChannel couponAfChannel);
+
     /**
      * 특정 쿠폰 발급받은 고객 조회
      * @param  custCoupon

+ 22 - 2
src/main/java/com/style24/core/biz/dao/TscOrderChangeDao.java

@@ -288,14 +288,14 @@ public interface TscOrderChangeDao {
 	Order getAddDeliveryFeePayment(OrderChange orderChange);
 
 	/**
-	 * 추가배송비 결제 취소 정보 생성
+	 * 추가배송비 결제 취소 정보 생성 (사용안함)
 	 *
 	 * @param Order - 주문 정보
 	 * @return 
 	 * @author card007
 	 * @since 2021. 02. 02
 	 */
-	int createAddDeliveryFeeCancelPayment(Order order);
+	// int createAddDeliveryFeeCancelPayment(Order order);
 
 	/**
 	 * 교환철회 주문상세 상태코드 변경
@@ -526,4 +526,24 @@ public interface TscOrderChangeDao {
 	 * @since 2021. 04. 21
 	 */
 	Order getCurrStockQty(Order order);
+
+	/**
+	 * 결제취소 환불정보 수정
+	 *
+	 * @param Order
+	 * @return int
+	 * @author card007
+	 * @since 2021. 04. 22
+	 */
+	int updateRefundInfo(Order order);
+
+	/**
+	 * 주문취소접수승인 정보 조회
+	 *
+	 * @param Collection<OrderChange>
+	 * @return OrderChange
+	 * @author card007
+	 * @since 2021. 04. 22
+	 */
+	Collection<OrderChange> approveCancelRequestInfo(OrderChange orderChange);
 }

+ 10 - 1
src/main/java/com/style24/core/biz/dao/TscOrderDao.java

@@ -741,5 +741,14 @@ public interface TscOrderDao {
 	 * @since 2021. 04. 20
 	 */
 	int createOrderChangeDetailHstChgStat(Order order);
-	
+
+	/**
+	 * 주문상세단품 상태값 변경
+	 *
+	 * @param order
+	 * @return int
+	 * @author jsshin
+	 * @since 2021. 04. 22
+	 */
+	int updateOrderDetailItemStat(Order order);
 }

+ 22 - 0
src/main/java/com/style24/core/biz/service/TscCouponService.java

@@ -208,6 +208,18 @@ public class TscCouponService {
         return couponDao.getLimitedTimeCouponList(cpnId);
     }
 
+    /**
+     * 쿠폰 제휴채널 조회
+     * @param
+     * @return
+     * @author bin2107
+     * @since 2021-04-22
+     */
+    public ArrayList<Coupon> getCouponAfChannelList(int cpnId) {
+        return couponDao.getCouponAfChannelList(cpnId);
+    }
+
+
     /**
      * 쿠폰 저장
      * @param params
@@ -226,6 +238,7 @@ public class TscCouponService {
             couponDao.deleteCouponRefVal(params);	// 공급업체,브랜드,카테고리,상품 삭제
             couponDao.deleteCouponBurden(params);	// 입점업체 분담율 삭제
             couponDao.deleteLimitedTimeCoupon(params);	// 선착순 쿠폰 삭제
+            couponDao.deleteCouponAfChannel(params);	// 제휴링크 삭제
         }else{	//등록모드일때
             params.setCpnStat("G232_10");
             couponDao.couponInsert(params);
@@ -304,6 +317,7 @@ public class TscCouponService {
         }
 
         // 입점업체분담율
+        log.info("CouponAfChannel params getBurdenList{}",params.getBurdenList());
         for(CouponBurden couponBurden : params.getBurdenList()){
             couponBurden.setCpnId(params.getCpnId());
             couponBurden.setRegNo(params.getRegNo());
@@ -318,6 +332,14 @@ public class TscCouponService {
             couponLimitedTime.setUpdNo(params.getUpdNo());
             couponDao.createLimitedTimeCoupon(couponLimitedTime);
         }
+        log.info("CouponAfChannel params getAfChannelList{}",params.getAfChannelList());
+        // 쿠폰제휴링크
+        for(CouponAfChannel couponAfChannel : params.getAfChannelList()){
+            couponAfChannel.setCpnId(params.getCpnId());
+            couponAfChannel.setRegNo(params.getRegNo());
+            log.info("CouponAfChannel  couponAfChannel{}",couponAfChannel);
+            couponDao.createCouponAfChannel(couponAfChannel);
+        }
 
         // 수정모드이고 변경된 쿠폰상태가 대기 , 중지 인경우 고객이 발급받은 내용도 변경
         if(cpnId != 0 &&

+ 365 - 133
src/main/java/com/style24/core/biz/service/TscOrderChangeService.java

@@ -57,6 +57,9 @@ public class TscOrderChangeService {
 
 	@Autowired
 	private TscNaverPayService naverPayService;
+	
+	@Autowired
+	private TscWmsService wmsService;
 
 	/**
 	 * 주문변경정보 (상세번호배열, 취소수량배열) 취소 목록으로 변환 (사용안함)
@@ -176,14 +179,14 @@ public class TscOrderChangeService {
 	 */
 	@SuppressWarnings("unchecked")
 	@Transactional("shopTxnManager")
-	public GagaMap partialCancel(GagaMap map) {
+	public GagaMap partialCancel(GagaMap map, Integer userNo) {
 		// 1. 취소요청목록 및 정보 설정
 		List<Order> cancelOrderRefundList 	= (List<Order>) map.get("cancelOrderRefundList");				// 취소환불금액 목록 (주문상세단품 단위)
 		List<Order> cancelDelvRefundList 	= (List<Order>) map.get("cancelDelvRefundList");				// 취소환불배송금액 목록 (DELV_FEE_CD 단위)
 		int ordNo 							= map.getInt("ordNo");											// 주문번호
-		int custNo							= map.getInt("custNo");											// 고객번호
+		int ordChgSq						= map.getInt("ordChgSq");										// 주문변경일련번호
 		String chgReason 					= map.getString("chgReason");									// 변경사유
-		String chgReasonNm 					= "고객변심";														// 변경사유명
+		String chgReasonNm 					= map.getString("chgReasonNm");									// 변경사유명
 		String chgMemo 						= map.getString("chgMemo");										// 변경메모
 		String allLastCanYn					= map.getString("allLastCanYn");								// 마지막 취소 여부
 		String ipAddress					= map.getString("ipAddress");									// IP주소
@@ -193,28 +196,31 @@ public class TscOrderChangeService {
 		String accountNo					= map.getString("accountNo");									// 환불계좌번호
 		String accountNm					= map.getString("accountNm");									// 환불계좌주명
 		String bankCd						= map.getString("bankCd");										// 환불계좌은행코드
+		String reqGbn						= map.getString("reqGbn");										// 신청구분
 		String chgGb						= TscConstants.OrderChangeGb.CANCEL.value(); 					// 취소요청 (공톹코드:G680)
 		String ordDtlStat					= TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value();	// 주문상세상태
 		String chgStat						= TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value();	// 주문변경상태
 		int realOrdAmt						= map.getInt("spanSumRealOrdAmt");								// 부분취소 전 결제금액
-		String modType;
+		String modType						= "";
 
 		// 무통장입금 결제 주문 전체취소 상태값 처리
-		if (TscConstants.PgGb.KCP.value().equals(pgGb)
-			&& TscConstants.PayMeans.BANK_DEPOSIT.value().equals(payMeans)) {
-			modType = "STPD";															// KCP 무통장입금 부분취소
-		} else {
-			modType = "STPC";															// KCP 부분취소
+		if (TscConstants.PgGb.KCP.value().equals(pgGb)) {
+			if (TscConstants.PayMeans.BANK_DEPOSIT.value().equals(payMeans)) {
+				modType = "STPD";															// KCP 무통장입금 부분취소
+			} else {
+				modType = "STPC";															// KCP 부분취소
+			}
 		}
 
 		// 2. 주문상세단품정보등록, 변경 (단품단위)
 		List<Order> cancelOrderDetailList = new ArrayList<>();
 		List<Integer> ordDtlNoList = new ArrayList<>();
+		List<Integer> ordCanChgQtyList = new ArrayList<>();
 
 		for (Order cancelOrderRefundPo : cancelOrderRefundList) {
 			cancelOrderRefundPo.setOrdDtlStat(ordDtlStat);
-			cancelOrderRefundPo.setRegNo(custNo);
-			cancelOrderRefundPo.setUpdNo(custNo);
+			cancelOrderRefundPo.setRegNo(userNo);
+			cancelOrderRefundPo.setUpdNo(userNo);
 
 			// 2-1. 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품 이력 등록
 			if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
@@ -226,13 +232,16 @@ public class TscOrderChangeService {
 
 			// 2-2. 주문상세단위로 데이터 설정
 			Integer ordDtlNo = cancelOrderRefundPo.getOrdDtlNo();
+			int ordCanChgQty = cancelOrderRefundPo.getOrdCanChgQty();
 			if (!ordDtlNoList.contains(ordDtlNo)) {
 				cancelOrderDetailList.add(cancelOrderRefundPo);
 				ordDtlNoList.add(ordDtlNo);
+				ordCanChgQtyList.add(ordCanChgQty);
 			}
 		}
 
 		// 3. 주문변경정보, 주문정보, 환불정보 (배송정책코드 별)
+		List<Payment> pgList = new ArrayList<>();
 		for (Order obj : cancelDelvRefundList) {
 			// 취소금액 있을 시 처리
 			if (obj.getCnclRtnAmt() > 0) {
@@ -244,10 +253,18 @@ public class TscOrderChangeService {
 				orderChange.setChgMemo(chgMemo);
 				orderChange.setAddPayCost(0);
 				orderChange.setAddPayAmt(0);
-				orderChange.setRegNo(custNo);
-				orderChange.setUpdNo(custNo);
+				orderChange.setRegNo(userNo);
+				orderChange.setUpdNo(userNo);
 
-				orderChangeDao.createOrderChange(orderChange);
+				// 신청구분 처리
+				if ("cnclComplete".equals(reqGbn)) {
+					// 취소 완료 시 생성
+					orderChangeDao.createOrderChange(orderChange);
+					ordChgSq = orderChange.getOrdChgSq();
+				} else {
+					// 취소접수승인 시 ordChgSq 설정
+					orderChange.setOrdChgSq(ordChgSq);
+				}
 
 				// 3-2. 주문상세정보 수정
 				for (Order vo : cancelOrderDetailList) {
@@ -279,8 +296,8 @@ public class TscOrderChangeService {
 								point.setOccurGb(TscConstants.PointOccurGb.USE_POINT_CANCEL.value());
 								point.setPntUploadStat(TscConstants.PntUploadStat.APPLY_COMPLETE.value());
 								point.setOccurDtlDesc("포인트사용취소");
-								point.setRegNo(custNo);
-								point.setUpdNo(custNo);
+								point.setRegNo(userNo);
+								point.setUpdNo(userNo);
 
 								// 포인트 사용 취소 이력 생성 및 포인트 수정
 								orderChangeDao.createCustPointHstRollback(point);
@@ -297,8 +314,8 @@ public class TscOrderChangeService {
 							point.setPntUploadStat(TscConstants.PntUploadStat.APPLY_EXPECT.value());
 							point.setOccurDtlDesc("예정포인트적립취소");
 							point.setPntAmt(savePntAmt * -1);
-							point.setRegNo(custNo);
-							point.setUpdNo(custNo);
+							point.setRegNo(userNo);
+							point.setUpdNo(userNo);
 							
 
 							// 적립예정포인트 취소 이력 생성
@@ -324,8 +341,8 @@ public class TscOrderChangeService {
 
 								giftCard.setOccurGb(TscConstants.GiftCardOccurGb.USE_GIFTCARD_CANCEL.value());
 								giftCard.setOccurDtlDesc("상품권사용취소");
-								giftCard.setRegNo(custNo);
-								giftCard.setUpdNo(custNo);
+								giftCard.setRegNo(userNo);
+								giftCard.setUpdNo(userNo);
 
 								// 포인트 사용 취소 이력 생성 및 포인트 수정
 								orderChangeDao.createCustGiftCardHstRollback(giftCard);
@@ -339,10 +356,25 @@ public class TscOrderChangeService {
 						changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
 						changeDetailPo.setChgQty(vo.getOrdCanChgQty());
 						changeDetailPo.setChgStat(chgStat);
-						changeDetailPo.setRegNo(custNo);
-						changeDetailPo.setUpdNo(custNo);
+						changeDetailPo.setRegNo(userNo);
+						changeDetailPo.setUpdNo(userNo);
+
+						// 신청구분 처리
+						if ("cnclComplete".equals(reqGbn)) {
+							// 취소완료 시 주문변경상세 정보 생성
+							orderChangeDao.createOrderChangeDetail(changeDetailPo);
+						} else {
+							// 취소접수승인 시 주문변경상세 정보 수정
+							Order order = new Order();
+							order.setOrdNo(ordNo);
+							order.setOrdChgSq(ordChgSq);
+							order.setChgStat(chgStat);
+							order.setUpdNo(userNo);
+							order.setDelYn("N");
+
+							orderChangeDao.updateOrderChangeDtlCancel(order);
+						}
 
-						orderChangeDao.createOrderChangeDetail(changeDetailPo);
 						orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
 					}
 				}
@@ -353,11 +385,22 @@ public class TscOrderChangeService {
 					orderChangeDao.createSellQty(orderChange);
 				}
 
-				// 3-4. PG 결제 취소 처리 (상품권으로만 결제 시 PG점프)
+				// 3-4. PG 결제 취소 정보 설정 (상품권으로만 결제 시 PG점프)
 				int spanRealCnclRtnAmt = obj.getRealOrdAmt();			// 취소금액합계
 				int sumDeliveryFee = obj.getDelvFee();					// 배송비합계
+				int spanTotDeliveryFee = obj.getAddDelvFee();			// 추가배송비합계
 				int spanRefundAmt = spanRealCnclRtnAmt + sumDeliveryFee;
 
+				// 고객사유일때 추가배송비 차감 후 환불처리 
+				if ("G686_10".equals(chgReason)) {
+					spanRefundAmt -= spanTotDeliveryFee;
+				}
+
+				// 환불금액이 추가배송비 보다 적을 시
+				if (spanRefundAmt < 0) {
+					throw new IllegalStateException(message.getMessage("CANCEL_0002"));
+				}
+
 				Payment pg = new Payment();
 				pg.setOrdNo(ordNo);
 				pg.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
@@ -366,33 +409,17 @@ public class TscOrderChangeService {
 				pg.setPayMeans(payMeans);
 				pg.setPartCancelAmt(spanRefundAmt);
 				pg.setLeftAmt(realOrdAmt);
-				pg.setRegNo(custNo);
-				pg.setUpdNo(custNo);
-
-				if (!TscConstants.PgGb.ISTYLE.value().equals(pgGb)) {
-					if (TscConstants.PgGb.KCP.value().equals(pgGb) || TscConstants.PgGb.PAYCO.value().equals(pgGb)) {
-						pg.setModType(modType);
-						pg.setModDesc("가맹점 취소 - 부분 취소");
-						pg.setIpAddress(ipAddress);
-						pg.setAccountNm(accountNm);
-						pg.setAccountNo(accountNo);
-						pg.setBankCd(bankCd);
-
-						kcpService.kcpCancel(pg);
-					} else if (TscConstants.PgGb.NAVER.value().equals(pgGb)) {
-						pg.setPayMeans(payMeans);
-						pg.setChgReasonNm(chgReasonNm);
-
-						naverPayService.cancelNaverPayment(pg);
-					} else if (TscConstants.PgGb.KAKAO.value().equals(pgGb)) {
-						kakaoPayService.cancelKakaoPayment(pg);
-					}
+				pg.setRegNo(userNo);
+				pg.setUpdNo(userNo);
+
+				if (!TscConstants.PgGb.ISTYLE.value().equals(pgGb) && spanRefundAmt > 0) {
+					pgList.add(pg);
 				}
 
 				// 3-5. 환불정보 등록
 				Order refundOrder = new Order();
 				refundOrder.setOrdNo(ordNo);
-				refundOrder.setPaySq(pg.getPaySq());
+				refundOrder.setPaySq(0);
 				refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
 				refundOrder.setRefundAmt(spanRefundAmt);
 				refundOrder.setRfCpn1Amt(obj.getCpn1DcAmt());
@@ -409,7 +436,7 @@ public class TscOrderChangeService {
 				refundOrder.setRaNo(accountNo);
 				refundOrder.setRaNm(accountNm);
 				refundOrder.setRaBank(bankCd);
-				refundOrder.setRegNo(custNo);
+				refundOrder.setRegNo(userNo);
 
 				orderChangeDao.createRefund(refundOrder);
 
@@ -424,8 +451,8 @@ public class TscOrderChangeService {
 					delvFeeOrder.setRealDelvAmt(obj.getDelvFee());
 					delvFeeOrder.setOrdChgSq(orderChange.getOrdChgSq());
 					delvFeeOrder.setSupplyCompCd(obj.getSupplyCompCd());
-					delvFeeOrder.setRegNo(custNo);
-					delvFeeOrder.setUpdNo(custNo);
+					delvFeeOrder.setRegNo(userNo);
+					delvFeeOrder.setUpdNo(userNo);
 
 					orderChangeDao.createDeliveryFee(delvFeeOrder);
 				}
@@ -436,16 +463,58 @@ public class TscOrderChangeService {
 				// 4-1. 장바구니, 배송비 쿠폰 원복처리
 				Order coupon = new Order();
 				coupon.setOrdNo(ordNo);
-				coupon.setUpdNo(custNo);
+				coupon.setUpdNo(userNo);
 				orderChangeDao.updateCartCpnRollback(coupon);
 				orderChangeDao.updateDeliveryCpnRollback(coupon);
 
 				// 4-2. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
 				Order freegiftOrder = new Order();
 				freegiftOrder.setOrdNo(ordNo);
-				freegiftOrder.setUpdNo(custNo);
+				freegiftOrder.setUpdNo(userNo);
 				orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
 			}
+
+			// 5. WMS 취소 처리
+			List<Order> wmsList = new ArrayList<>();
+			for (int i = 0; i < ordDtlNoList.size(); i++) {
+				Order wms = new Order();
+				wms.setOrdNo(ordNo);
+				wms.setOrdDtlNo(ordDtlNoList.get(i));
+				wms.setChgQty(ordCanChgQtyList.get(i));
+
+				wmsList.add(wms);
+			}
+
+			wmsService.updateWmsCancel(wmsList);
+			
+			// 6. PG 취소 처리
+			for (Payment pg : pgList) {
+				if (TscConstants.PgGb.KCP.value().equals(pgGb) || TscConstants.PgGb.PAYCO.value().equals(pgGb)) {
+					pg.setModType(modType);
+					pg.setModDesc("가맹점 취소 - 부분 취소");
+					pg.setIpAddress(ipAddress);
+					pg.setAccountNm(accountNm);
+					pg.setAccountNo(accountNo);
+					pg.setBankCd(bankCd);
+
+					kcpService.kcpCancel(pg);
+				} else if (TscConstants.PgGb.NAVER.value().equals(pgGb)) {
+					pg.setPayMeans(payMeans);
+					pg.setChgReasonNm(chgReasonNm);
+
+					naverPayService.cancelNaverPayment(pg);
+				} else if (TscConstants.PgGb.KAKAO.value().equals(pgGb)) {
+					kakaoPayService.cancelKakaoPayment(pg);
+				}
+
+				Order refundOrder = new Order();
+				refundOrder.setOrdNo(ordNo);
+				refundOrder.setPaySq(pg.getPaySq());
+				refundOrder.setOrdChgSq(ordChgSq);
+				refundOrder.setUpdNo(userNo);
+				
+				orderChangeDao.updateRefundInfo(refundOrder);
+			}
 		}
 
 		return map;
@@ -984,11 +1053,13 @@ public class TscOrderChangeService {
 				orderChangeDao.createDeliveryFee(deliveryFee);
 
 				// 추가배송비 등록
-				deliveryFee.setDelvFeeGb(TscConstants.DeliveryFeeGb.ORIGIN_DELIVERY_FEE.value());
-				deliveryFee.setDelvFee(spanTotDeliveryFee);
-				deliveryFee.setRealDelvAmt(spanTotDeliveryFee);
+				if (spanTotDeliveryFee > 0) {
+					deliveryFee.setDelvFeeGb(TscConstants.DeliveryFeeGb.ORIGIN_DELIVERY_FEE.value());
+					deliveryFee.setDelvFee(spanTotDeliveryFee);
+					deliveryFee.setRealDelvAmt(spanTotDeliveryFee);
 
-				orderChangeDao.createDeliveryFee(deliveryFee);
+					orderChangeDao.createDeliveryFee(deliveryFee);
+				}
 
 				// 3-4. 주문상세정보 수정
 				ordChgSq = orderChange.getOrdChgSq();
@@ -1296,7 +1367,6 @@ public class TscOrderChangeService {
 	@Transactional("shopTxnManager")
 	public GagaMap exchReq(OrderChange excReq) {
 		GagaMap result = new GagaMap();
-		result.set("status", GagaResponseStatus.FAIL.getCode());
 
 		// 교환 기본 정보
 		int ordNo = excReq.getOrdNo();						// 주문번호
@@ -1314,7 +1384,7 @@ public class TscOrderChangeService {
 		String orderChangeStat = TscConstants.OrderChangeStat.EXCHANGE.value();
 		String ordDtlStat = TscConstants.OrderDetailStat.REFUND_CONFIRM_WAIT.value();
 
-		if (addPayCost > 0) { // 프론트 결제 여부 체크 필요
+		if (addPayCost > 0) {
 			orderChangeStat = TscConstants.OrderChangeStat.EXCHANGE_WAIT.value();
 		}
 
@@ -1555,25 +1625,32 @@ public class TscOrderChangeService {
 		int regNo = orderChange.getRegNo();					// 등록자번호
 		int updNo = orderChange.getUpdNo();					// 수정자번호
 
-		// 추가배송비 조회
+		// 1. PG 실행 (취소시 추가결제금액 취소처리)
 		Order payment = orderChangeDao.getAddDeliveryFeePayment(orderChange);
 
-		// 추가배송비 결제취소 처리
+		// 추가배송비 존재 시
 		if (payment != null && payment.getPayAmt() > 0) {
-			payment.setOrdNo(ordNo);
-			payment.setOrdChgSq(ordChgSq);
-			payment.setPayAmt(payment.getPayAmt() * -1);
-			payment.setPayStat(TscConstants.PaymentStat.PAYMENT_WAIT.value());
-			payment.setPayGb(TscConstants.PaymentGb.DELIVERY.value());
-			payment.setRegNo(regNo);
-			payment.setUpdNo(updNo);
-			orderChangeDao.createAddDeliveryFeeCancelPayment(payment);
-
-			// TODO
-			// PG취소처리
+			// 1-1. 추가배송비 결제정보 조회
+			Payment pg = new Payment();
+			pg.setOrdChgSq(ordChgSq);
+			pg = orderChangeDao.getAddPayCostPaymentInfo(pg);
+
+			// 1-2. 추가배송비 취소 정보 설정
+			if (StringUtils.isNotBlank(pg.getPgTid())) {
+				pg.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+				pg.setPayGb("D");
+				pg.setModType("STSC");
+				pg.setModDesc("가맹점 취소 - 전체 취소");
+				pg.setIpAddress(orderChange.getIpAddress());
+				pg.setRegNo(regNo);
+				pg.setUpdNo(updNo);
+			}
+
+			// 1-3. PG 취소 처리
+			kcpService.kcpCancel(pg);
 		}
 
-		// 교환철회 처리
+		// 2. 교환철회 처리
 		Order exchangeCancel = new Order();
 		exchangeCancel.setOrdNo(ordNo);
 		exchangeCancel.setOrdChgSq(ordChgSq);
@@ -1583,22 +1660,22 @@ public class TscOrderChangeService {
 		exchangeCancel.setRegNo(regNo);
 		exchangeCancel.setUpdNo(updNo);
 
-		// TB_ORDER_DETAIL 상태값 변경
+		// 2-1. TB_ORDER_DETAIL 상태값 변경
 		orderChangeDao.updateOrderDetailForExchangeCancel(exchangeCancel);
 
-		// TB_ORDER_DETAIL_HST 생성
+		// 2-2. TB_ORDER_DETAIL_HST 생성
 		orderChangeDao.createOrderDtlHstCancel(exchangeCancel);
 
-		// TB_ORDER_DETAIL_ITEM 상태값 변경
+		// 2-3. TB_ORDER_DETAIL_ITEM 상태값 변경
 		orderChangeDao.updateOrderDetailItemForExchangeCancel(exchangeCancel);
 
-		// TB_ORDER_DETAIL_ITEM_HST 생성
+		// 2-4. TB_ORDER_DETAIL_ITEM_HST 생성
 		orderChangeDao.createOrderDetailItemHstForExchangeCancel(exchangeCancel);
 
-		// TB_ORDER_CHANGE_DETAIL 상태값 변경 및 DEL_YN Y로 업데이트
+		// 2-5. TB_ORDER_CHANGE_DETAIL 상태값 변경 및 DEL_YN Y로 업데이트
 		orderChangeDao.updateOrderChangeDtlCancel(exchangeCancel);
 
-		// 결과값 처리
+		// 3. 결과값 처리
 		result.set("status", GagaResponseStatus.SUCCESS.getCode());
 
 		return result;
@@ -1652,7 +1729,122 @@ public class TscOrderChangeService {
 
 
 
+	/**
+	 * 취소 접수
+	 * 
+	 * @param OrderChange
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 04. 22
+	 */
+	@SuppressWarnings("unchecked")
+	@Transactional("shopTxnManager")
+	public GagaMap cancelRequest(OrderChange orderChange) {
+		GagaMap result = new GagaMap();
+		int userNo = orderChange.getUserNo();
+
+		// 1. 주문변경 등록
+		// ordNo				: 주문번호
+		// chgGb				: 변경구분
+		// chgReason			: 변경사유
+		// chgMemo				: 변경메모
+		// userNo				: 회원번호
+		// ordDtlNoArr			: 주문상세번호배열
+		// cnclRtnReqQtyArr		: 변경수량배열
+
+		orderChange.setRegNo(userNo);
+		orderChange.setUpdNo(userNo);
+		orderChangeDao.createOrderChange(orderChange);
+
+		for (int i = 0; i < orderChange.getOrdDtlNoArr().length; i++) {
+			Integer ordDtlNo = orderChange.getOrdDtlNoArr()[i];
+			int chgQty = orderChange.getCnclRtnReqQtyArr()[i];
+
+			// 2. 주문변경상세정보 등록
+			OrderChange changeDetailPo = new OrderChange();
+			changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
+			changeDetailPo.setOrdDtlNo(ordDtlNo);
+			changeDetailPo.setChgQty(chgQty);
+			changeDetailPo.setChgStat(TscConstants.OrderChangeStat.CANCEL.value());
+			changeDetailPo.setRegNo(userNo);
+			changeDetailPo.setUpdNo(userNo);
+
+			orderChangeDao.createOrderChangeDetail(changeDetailPo);
+		}
+		
+		result.setInt("status", GagaResponseStatus.SUCCESS.getCode());
+		
+		return result;
+	}
 
+	/**
+	 * 취소접수승인
+	 * 
+	 * @param GagaMap, int
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 04. 22
+	 */
+	@SuppressWarnings("unchecked")
+	@Transactional("shopTxnManager")
+	public GagaMap approveCancelRequest(OrderChange orderChange, Integer userNo) {
+		GagaMap result = new GagaMap();
+
+		// 1. 환불 사전 정보 조회
+		// ordChgSq, accountNo, accountNm, bankCd, ipAddress
+		List<Integer> ordDtlNoList = new ArrayList<>();
+		List<Integer> chgQtyList = new ArrayList<>();
+		for (OrderChange preInfo : orderChangeDao.approveCancelRequestInfo(orderChange)) {
+			ordDtlNoList.add(preInfo.getOrdDtlNo());
+			chgQtyList.add(preInfo.getChgQty());
+		}
+
+		orderChange.setOrdDtlNoArr(ordDtlNoList.stream().mapToInt(Integer::intValue).toArray());
+		orderChange.setCnclRtnReqQtyArr(chgQtyList.stream().mapToInt(Integer::intValue).toArray());
+		orderChange.setReqGbn("cnclReqComplete");
+		// 전체취소 분기처리
+		// 부분취소 신청구분 처리
+
+		GagaMap refundPreInfo = getRefundPreInfo(orderChange);
+		List<Order> cnclReqList = (List<Order>)refundPreInfo.get("cnclReqList");
+		String allCanYn = refundPreInfo.getString("allCanYn");
+		String allLastCanYn = refundPreInfo.getString("allLastCanYn");
+
+		// 2. 전체취소, 부분취소 구분 처리 진행
+		if ("Y".equals(allCanYn)) {
+			orderChange.setChgGb(TscConstants.OrderChangeGb.CANCEL.value());
+			orderChange.setRegNo(userNo);
+			orderChange.setUpdNo(userNo);
+
+			// 전체 취소 처리
+			allCnclComplete(orderChange);
+		} else {
+			// 3. 환불금액계산
+			// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
+			result = orderRefundService.cnclRtnRefundAmt(cnclReqList);
+
+			// 4. 부분취소 처리 정보 설정
+			result.setInt("ordNo", orderChange.getOrdNo());						// 주문번호
+			result.setString("chgReason", orderChange.getChgReason());			// 변경사유
+			result.setString("chgReasonNm", orderChange.getChgReasonNm());		// 변경사유명
+			result.setString("chgMemo", orderChange.getChgMemo());				// 변경메모
+			result.setString("accountNo", orderChange.getAccountNo());			// 환불계좌번호
+			result.setString("accountNm", orderChange.getAccountNm());			// 환불계좌예금주명
+			result.setString("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
+			result.setString("allLastCanYn", allLastCanYn);						// 전체 마지막 취소 여부
+			result.setString("reqGbn", orderChange.getReqGbn());				// 신청구분
+			result.setString("ipAddress", orderChange.getIpAddress());			// IP주소
+			result.setInt("custNo", orderChange.getCustNo());					// 고객번호
+			result.setString("pgTid", refundPreInfo.getString("pgTid"));		// PG거래ID
+			result.setString("payMeans", refundPreInfo.getString("payMeans"));	// 결제수단
+			result.setString("pgGb", refundPreInfo.getString("pgGb"));			// PG구분
+
+			// 부분취소 처리
+			partialCancel(result, userNo);
+		}
+
+		return result;
+	}
 
 
 	/**
@@ -1914,6 +2106,8 @@ public class TscOrderChangeService {
 		String accountNm = orderChange.getAccountNm();									// 환불계좌주명
 		String bankCd = orderChange.getBankCd();										// 환불은행
 		String ipAddress = orderChange.getIpAddress();									// IP주소
+		String reqGbn = orderChange.getReqGbn();										// 신청구분
+		Integer ordChgSq = orderChange.getOrdChgSq();									// 주문변경일련번호
 		int regNo = orderChange.getRegNo();												// 등록자번호
 		int updNo = orderChange.getUpdNo();												// 등록자번호
 
@@ -1954,10 +2148,31 @@ public class TscOrderChangeService {
 		orderChangeDetail.setUpdNo(updNo);
 
 		// 주문변경정보 등록
-		orderChangeDao.createOrderChange(orderChangeDetail);
+		if ("cnclComplete".equals(reqGbn)) {
+			// 취소 완료 시 생성
+			orderChangeDao.createOrderChange(orderChangeDetail);
+			ordChgSq = orderChangeDetail.getOrdChgSq();
+		} else {
+			// 취소접수승인 시 ordChgSq 설정
+			orderChangeDetail.setOrdChgSq(ordChgSq);
+		}
 
 		// 주문변경상세 및 이력정보 등록
-		orderChangeDao.createOrderChangeDetailForAllCancel(orderChangeDetail);
+		if ("cnclComplete".equals(reqGbn)) {
+			// 취소완료 시 주문변경상세 정보 생성
+			orderChangeDao.createOrderChangeDetailForAllCancel(orderChangeDetail);
+		} else {
+			// 취소접수승인 시 주문변경상세 정보 수정
+			Order order = new Order();
+			order.setOrdNo(ordNo);
+			order.setOrdChgSq(ordChgSq);
+			order.setChgStat(chgStat);
+			order.setUpdNo(updNo);
+			order.setDelYn("N");
+
+			orderChangeDao.updateOrderChangeDtlCancel(order);
+		}
+
 		orderChangeDao.createOrderChangeDetailHstForAllCancel(orderChangeDetail);
 
 		// 2. 사용포인트원복
@@ -2030,7 +2245,49 @@ public class TscOrderChangeService {
 		freegiftOrder.setUpdNo(updNo);
 		orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
 
-		// 8. PG 연동
+		// 8. 주문상세 및 주문상세단품 정보 설정
+		OrderChange orderDetail = new OrderChange();
+		orderDetail.setOrdNo(ordNo);
+		orderDetail.setOrdDtlStat(ordDtlStat);
+		orderDetail.setRegNo(regNo);
+		orderDetail.setUpdNo(updNo);
+
+		// 주문상세정보 수정 및 이력 등록
+		orderChangeDao.updateOrderDetailForAllCancel(orderDetail);
+		orderChangeDao.createOrderDetailHstForAllCancel(orderDetail);
+
+		// 주문상세단품정보 수정 및 이력 등록
+		orderChangeDao.updateOrderDetailItemForAllCancel(orderDetail);
+		orderChangeDao.createOrderDetailItemHstForAllCancel(orderDetail);
+		
+		// 9. WMS 취소 처리
+		List<Order> wmsList = new ArrayList<>();
+		for (int i = 0; i < orderChange.getOrdDtlNoArr().length; i++) {
+			Order wms = new Order();
+			wms.setOrdNo(ordNo);
+			wms.setOrdDtlNo(orderChange.getOrdDtlNoArr()[i]);
+			wms.setChgQty(orderChange.getCnclRtnReqQtyArr()[i]);
+
+			wmsList.add(wms);
+		}
+
+		wmsService.updateWmsCancel(wmsList);
+
+		// 10. 환불금액 등록
+		Order refundOrder = orderChangeDao.getRefundInfoForAllCancel(vo);
+		refundOrder.setOrdNo(ordNo);
+		refundOrder.setPaySq(0);
+		refundOrder.setOrdChgSq(orderChangeDetail.getOrdChgSq());
+		refundOrder.setRefundAmt(refundAmt);
+		refundOrder.setRfRealCnclAmt(refundOrder.getRealOrdAmt() - refundOrder.getRfDeliveryFee());
+		refundOrder.setRaNo(accountNo);
+		refundOrder.setRaNm(accountNm);
+		refundOrder.setRaBank(bankCd);
+		refundOrder.setRegNo(regNo);
+
+		orderChangeDao.createRefund(refundOrder);
+
+		// 11. PG 연동
 		Payment pg = new Payment();
 		pg.setOrdNo(ordNo);
 		pg.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
@@ -2060,91 +2317,66 @@ public class TscOrderChangeService {
 			} else if (TscConstants.PgGb.KAKAO.value().equals(pgGb)) {
 				kakaoPayService.cancelKakaoPayment(pg);
 			}
-		}
-
-		// 9. 환불금액 등록
-		Order refundOrder = orderChangeDao.getRefundInfoForAllCancel(vo);
-		refundOrder.setOrdNo(ordNo);
-		refundOrder.setPaySq(pg.getPaySq());
-		refundOrder.setOrdChgSq(orderChangeDetail.getOrdChgSq());
-		refundOrder.setRefundAmt(refundAmt);
-		refundOrder.setRfRealCnclAmt(refundOrder.getRealOrdAmt() - refundOrder.getRfDeliveryFee());
-		refundOrder.setRaNo(accountNo);
-		refundOrder.setRaNm(accountNm);
-		refundOrder.setRaBank(bankCd);
-		refundOrder.setRegNo(regNo);
-
-		orderChangeDao.createRefund(refundOrder);
 
-		// 10. 주문상세 및 주문상세단품 정보 설정
-		OrderChange orderDetail = new OrderChange();
-		orderDetail.setOrdNo(ordNo);
-		orderDetail.setOrdDtlStat(ordDtlStat);
-		orderDetail.setRegNo(regNo);
-		orderDetail.setUpdNo(updNo);
+			// 11. 환불금액 정보 수정
+			refundOrder.setPaySq(pg.getPaySq());
 
-		// 주문상세정보 수정 및 이력 등록
-		orderChangeDao.updateOrderDetailForAllCancel(orderDetail);
-		orderChangeDao.createOrderDetailHstForAllCancel(orderDetail);
-
-		// 주문상세단품정보 수정 및 이력 등록
-		orderChangeDao.updateOrderDetailItemForAllCancel(orderDetail);
-		orderChangeDao.createOrderDetailItemHstForAllCancel(orderDetail);
+			orderChangeDao.updateRefundInfo(refundOrder);
+		}
 	}
 
-	public GagaMap orderCancelPreInfo(OrderChange orderChange) {
+	/**
+	 * 취소완료 요청
+	 *
+	 * @param OrderChange
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 04. 21
+	 */
+	@SuppressWarnings("unchecked")
+	@Transactional("shopTxnManager")
+	public GagaMap orderCancelPreInfo(OrderChange orderChange, Integer userNo) {
 		GagaMap result = new GagaMap();
 
-		// 2. 환불 사전 정보 조회
+		// 1. 환불 사전 정보 조회
 		GagaMap refundPreInfo = getRefundPreInfo(orderChange);
 		List<Order> cnclReqList = (List<Order>)refundPreInfo.get("cnclReqList");
 		String allCanYn = refundPreInfo.getString("allCanYn");
 		String allLastCanYn = refundPreInfo.getString("allLastCanYn");
-		// String allCanYnBeforePayment = refundPreInfo.getString("allCanYnBeforePayment");
 
-		// 전체취소, 부분취소 구분 처리 진행
+		// 2. 전체취소, 부분취소 구분 처리 진행
+		orderChange.setReqGbn("cnclComplete");
+
 		if ("Y".equals(allCanYn)) {
 			orderChange.setChgGb(TscConstants.OrderChangeGb.CANCEL.value());
-			orderChange.setRegNo(orderChange.getCustNo());
-			orderChange.setUpdNo(orderChange.getCustNo());
+			orderChange.setRegNo(userNo);
+			orderChange.setUpdNo(userNo);
 
+			// 전체 취소 처리
 			allCnclComplete(orderChange);
 		} else {
 			// 3. 환불금액계산
 			// 2021.01.19 취소신청정보를 목록 (주문상세번호, 취소/반품수량) 으로 표현
 			result = orderRefundService.cnclRtnRefundAmt(cnclReqList);
 
-			// 4. 주문변경 기본정보 설정
+			// 4. 부분취소 처리 정보 설정
 			result.setInt("ordNo", orderChange.getOrdNo());						// 주문번호
-			// result.setInt("ordChgSq", orderChange.getOrdChgSq());				// 주문변경번호
 			result.setString("chgReason", orderChange.getChgReason());			// 변경사유
+			result.setString("chgReasonNm", orderChange.getChgReasonNm());		// 변경사유명
 			result.setString("chgMemo", orderChange.getChgMemo());				// 변경메모
-
 			result.setString("accountNo", orderChange.getAccountNo());			// 환불계좌번호
 			result.setString("accountNm", orderChange.getAccountNm());			// 환불계좌예금주명
 			result.setString("bankCd", orderChange.getBankCd());				// 환불계좌은행코드
-
-			// result.setString("allCanYnBeforePayment", allCanYnBeforePayment);	// 무통장입금전 전체취소 여부
-			// result.setString("allCanYn", allCanYn);								// 전체취소 여부
 			result.setString("allLastCanYn", allLastCanYn);						// 전체 마지막 취소 여부
-			// result.setString("isCustomer", orderChange.getIsCustomer());		// 변경사유 (고객, 회사)
-
-			// 5. 주문변경 회수지정보 추가
-			// result.setString("chgerNm", orderChange.getChgerNm());				// 변경자명
-			// result.setString("chgerEmail", orderChange.getChgerEmail());			// 변경자이메일주소
-			// result.setString("chgerPhnno", orderChange.getChgerPhnno());			// 변경자핸드폰번호
-			// result.setString("chgerTelno", orderChange.getChgerTelno());			// 변경자전화번호
-
-			// result.setString("reqGbn", orderChange.getReqGbn());				// 신청구분
+			result.setString("reqGbn", orderChange.getReqGbn());				// 신청구분
 			result.setString("ipAddress", orderChange.getIpAddress());			// IP주소
-			result.setInt("custNo", orderChange.getCustNo());									// 고객번호
+			result.setInt("custNo", orderChange.getCustNo());					// 고객번호
 			result.setString("pgTid", refundPreInfo.getString("pgTid"));		// PG거래ID
 			result.setString("payMeans", refundPreInfo.getString("payMeans"));	// 결제수단
 			result.setString("pgGb", refundPreInfo.getString("pgGb"));			// PG구분
 
-			// 6. 주문변경 DB 등록 (TB_ORDER_CHANGE, TB_ORDER_CHANGE_DETAIL)
-			// coreOrderChangeService.cnclComplete(result, custNo);
-			partialCancel(result);
+			// 부분취소 처리
+			partialCancel(result, userNo);
 		}
 
 		return result;

+ 18 - 4
src/main/java/com/style24/core/biz/service/TscOrderService.java

@@ -808,7 +808,7 @@ public class TscOrderService {
 								goodsCpn.setCpnDcAmt(goodsCpnAll.getMaxDcAmt());
 							}
 						}
-						
+
 						// 8. 주문최소주문금액 보다 크면 쿠폰 적용
 						if (tmtbGoods.getCurrPrice() > goodsCpn.getBuyLimitAmt()) {
 							goodsCpnList.add(goodsCpn);
@@ -884,7 +884,7 @@ public class TscOrderService {
 			}
 			
 			// 최소금액주문이상일때 쿠폰사용불가
-			if (cartCpn.getMinOrdAmt() > ordAmtSum) {
+			if (cartCpn.getBuyLimitAmt() > ordAmtSum) {
 				cartCpn.setCartCpnCartSqArr(null);
 			} else {
 				cartCpn.setCartCpnCartSqArr(cartCpnCartSqArr);
@@ -2139,7 +2139,7 @@ public class TscOrderService {
 				} else {		// 무통장입금 주문 중 환불계좌정보 없을 경우 제외는 취소처리
 					// 취소완료
 					log.info("CHECK IN PART CANCEL ORD_DTL_NO_ARR ::::: {} / {} / {}", change.getOrdNo(), change.getOrdDtlNoArr(), change.getAccountNo());
-					GagaMap cancelInfo = orderChangeService.orderCancelPreInfo(change);
+					GagaMap cancelInfo = orderChangeService.orderCancelPreInfo(change, userNo);
 
 					// TODO 취소 완료 알림톡 발송 에정
 					//
@@ -2168,6 +2168,21 @@ public class TscOrderService {
 		}
 	}
 
+	/**
+	 * 주문상세상태 변경 및 이력 생성
+	 * @param order - 고객번호, 주문번호, 주문상세번호
+	 * @author jsshin
+	 * @since 2021. 04. 21
+	 */
+	@Transactional("shopTxnManager")
+	public void saveOrdDtlStat(Order order) {
+		// 주문상세 상태 변경
+		orderDao.changedOrdDtlStat(order);
+		// 주문상세 이력 저장
+		orderDao.createOrderDetailHst(order);
+		// 주문상세단품 상태 변경
+		orderDao.updateOrderDetailItemStat(order);
+ 	}
 }
 
 
@@ -2187,4 +2202,3 @@ public class TscOrderService {
 
 
 
-

+ 42 - 1
src/main/java/com/style24/core/biz/service/TscPointService.java

@@ -1,5 +1,7 @@
 package com.style24.core.biz.service;
 
+import com.style24.core.support.env.TscConstants;
+import com.style24.persistence.domain.Order;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -23,6 +25,11 @@ public class TscPointService {
 	@Autowired
 	private TscPointDao pointDao;
 
+	@Autowired
+	private TscEnvsetService envsetService;
+
+	@Autowired
+	private TscOrderService orderService;
 
 	/**
 	 * 포인트 적립
@@ -38,12 +45,17 @@ public class TscPointService {
 
 	/**
 	 * 구매확정 포인트 생성
-	 * @param Integer
+	 * @param point
 	 * @return int
 	 * @author card007
 	 * @since 2021. 02. 17
 	 */
+	@Transactional("shopTxnManager")
 	public int createOrderDecisionPoint(Point point) {
+		// 구매포인트소멸기한(일)
+		int expireDays = envsetService.getBuyPointExpireDays(TscConstants.Site.STYLE24.value());
+		point.setBuyPointExpireDays(expireDays);
+
 		// 구매확정 포인트 생성
 		pointDao.createOrderDecisionPoint(point);
 		// 구매확정 포인트 히스토리 수정
@@ -53,4 +65,33 @@ public class TscPointService {
 		return pointDao.getOrderDecisionPoint(point);
 	}
 
+	/**
+	 * 자동 구매확정 포인트 생성
+	 *
+	 * @param point - 고객번호, 주문번호, 주문상세번호
+	 * @author jsshin
+	 * @since 2021. 04. 21
+	 */
+	@Transactional("shopTxnManager")
+	public void saveAutoPurchaseConfirmation(Point point) {
+		// 1.구매포인트소멸기한(일)
+		int expireDays = envsetService.getBuyPointExpireDays(TscConstants.Site.STYLE24.value());
+		point.setBuyPointExpireDays(expireDays);
+
+		// 2.구매확정 포인트 생성
+		pointDao.createOrderDecisionPoint(point);
+		// 3.구매확정 포인트 히스토리 수정
+		pointDao.updateOrderDecisionPointHst(point);
+
+		// 4.주문상세 상태 변경 및 히스토리 생성
+		Order order = new Order();
+		order.setOrdDtlStat(TscConstants.OrderDetailStat.PURCHASE_CONFIRM.value());
+		order.setOrdNo(point.getOrdNo());
+		order.setOrdDtlNo(point.getOrdDtlNo());
+		order.setRegNo(point.getRegNo());
+		order.setUpdNo(point.getUpdNo());
+		orderService.saveOrdDtlStat(order);
+
+	}
+
 }

+ 11 - 11
src/main/java/com/style24/core/biz/service/TscWmsService.java

@@ -1,22 +1,21 @@
 package com.style24.core.biz.service;
 
-import com.style24.core.biz.dao.TscWmsDao;
-import com.style24.core.biz.dao.TscDeliveryDao;
-import com.style24.core.support.env.TscConstants;
-import com.style24.persistence.domain.WmsDelivery;
-import com.style24.persistence.domain.Order;
-import com.style24.persistence.domain.ErpStock;
-
-import com.style24.core.biz.service.TscErpService;
-
-import lombok.extern.slf4j.Slf4j;
-
 import java.util.ArrayList;
 import java.util.Collection;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.style24.core.biz.dao.TscDeliveryDao;
+import com.style24.core.biz.dao.TscWmsDao;
+import com.style24.core.support.env.TscConstants;
+import com.style24.persistence.domain.ErpStock;
+import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.WmsDelivery;
+
+import lombok.extern.slf4j.Slf4j;
+
 
 /**
  * Wms Service
@@ -134,6 +133,7 @@ public class TscWmsService {
 	 * @author moon
 	 * @since 2021. 03. 16
 	 */
+	@Transactional("wmsTxnManager")
 	public void updateWmsCancel(Collection<Order> ordCancelList) {
 		// 주문번호, 주문상세번호, 변경수량 
 		// ordNo, ordDtlNo , chgQty

+ 3 - 0
src/main/java/com/style24/persistence/domain/Coupon.java

@@ -120,6 +120,8 @@ public class Coupon extends TscBaseDomain {
     private String couponStat;			// 쿠폰 다운받았는지 여부
     private String title;				//기획전 에서 설정한 쿠폰 타이틀
     private String note;				//기획전 에서 설정한 쿠폰 유의사항
+    
+    private String planCouponStat;
     // 그리드 파라미터
     List<CouponRefval> supplyCompList;          // 공급업체 리스트
     List<CouponRefval> brandList;               // 브랜드 리스트
@@ -144,6 +146,7 @@ public class Coupon extends TscBaseDomain {
     private String[] payTypeArr;
 
     List<CouponLimitedTime> limitedTimeCpnList; //선착순 쿠폰 리스트
+    List<CouponAfChannel> afChannelList; //쿠폰 제휴채널 리스트
 
     // Pagination
     private TscPageRequest pageable;

+ 22 - 0
src/main/java/com/style24/persistence/domain/CouponAfChannel.java

@@ -0,0 +1,22 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+import lombok.Data;
+
+/**
+ * 쿠폰 제휴채널 도메인
+ * @author bin2107
+ * @since 2021-04-22
+ */
+@SuppressWarnings("serial")
+@Data
+public class CouponAfChannel extends TscBaseDomain {
+    private int  cpnId;					// 쿠폰ID
+    private String afLinkCd;
+
+    private String afLinkNm;
+    private int freeRate;
+    private int dispOrd;
+    private String afChannel;
+
+}

+ 3 - 0
src/main/java/com/style24/persistence/domain/OrderChange.java

@@ -21,6 +21,7 @@ public class OrderChange extends TscBaseDomain {
 	private Integer ordNo;
 	private Integer ordDtlNo;
 	private Integer custNo;
+	private Integer userNo;
 	private String orderNm;
 	
 	private Integer ordChgSq;
@@ -63,6 +64,8 @@ public class OrderChange extends TscBaseDomain {
 	private int[] ordDtlNoArr;
 	private int[] cnclRtnReqQtyArr;
 	private String[] chgOptCd2Arr;
+	private String ordDtlNos;
+	private String chgQtys;
 
 	private List<Integer> ordDtlNoList = new ArrayList<>();
 	private List<Integer> cnclRtnReqQtyList = new ArrayList<>();

+ 1 - 0
src/main/java/com/style24/persistence/domain/Point.java

@@ -41,4 +41,5 @@ public class Point extends TscBaseDomain {
 	private String month;				// 날짜변수
 
 	private String searchDt;			// 검색일자
+	private int buyPointExpireDays;		// 구매포인트소멸일
 }

+ 3 - 4
src/main/java/com/style24/persistence/domain/Review.java

@@ -1,5 +1,7 @@
 package com.style24.persistence.domain;
 
+import java.util.Collection;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.core.support.util.CryptoUtils;
 import com.style24.persistence.TscBaseDomain;
@@ -54,10 +56,7 @@ public class Review extends TscBaseDomain {
 	private int giveDueBpnt;			// 지급예정베스트포인트
 
 	// 상품평 첨부파일
-	private Integer rvAtcSq;			// 상품평첨부파일일련번호
-	private String fileGb;				// 첨부파일종류(M:동영상,I:이미지)
-	private String orgFileNm;			// 원본파일명
-	private String sysFileNm;			// 시스템파일명
+	private Collection<ReviewAttach> attachList;
 
 	// 검색조건
 	private String startDt;

+ 27 - 0
src/main/java/com/style24/persistence/domain/ReviewAttach.java

@@ -0,0 +1,27 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품평 첨부파일 Domain
+ *
+ * @author gagamel
+ * @since 2021. 4. 22
+ */
+@SuppressWarnings("serial")
+@Data
+public class ReviewAttach extends TscBaseDomain {
+
+	// 상품평 첨부파일
+	private Integer rvAtcSq;	// 상품평첨부파일일련번호
+	private Integer reviewSq;	// 상품평일련번호
+	private String fileGb;		// 첨부파일종류(M:동영상,I:이미지)
+	private String orgFileNm;	// 원본파일명
+	private String sysFileNm;	// 시스템파일명
+	private String kufKey;		// Kollus업로드파일키
+	private String kmcKey;		// Kollus미디어컨텐츠키
+	private String delYn;		// 삭제여부
+
+}

+ 5 - 3
src/main/java/com/style24/persistence/domain/WmsDelivery.java

@@ -1,8 +1,5 @@
 package com.style24.persistence.domain;
 
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
@@ -20,15 +17,20 @@ public class WmsDelivery extends TscBaseDomain {
 	private Integer productNo;
 	private Integer ordNo;
 	private Integer ordDtlNo;
+	private Integer ordDtlItemSq;
+	private String optCd;
 	
 	private String skuCode;
 	private String stockLoc;
 	private String whCode;
 	private String cancelYn;
 	private String chkYn;
+	private String goodsType;
+	
 	
 	private int locQty;
 	private int chgQty;
+	private int itemQty;
 	
 	
 }

+ 46 - 2
src/main/java/com/style24/persistence/mybatis/shop/TscCoupon.xml

@@ -288,6 +288,7 @@
         WHERE CPN_ID = #{cpnId}
     </select>
 
+    <!-- 선착순쿠폰 조회 -->
     <select id="getLimitedTimeCouponList" parameterType="int" resultType="CouponLimitedTime">
         /* TscCoupon.getLimitedTimeCouponList */
         SELECT	LIMIT_CPN_ID
@@ -307,6 +308,20 @@
           AND  DEL_YN = 'N'
     </select>
 
+    <!-- 쿠폰 제휴채널 조회 -->
+    <select id="getCouponAfChannelList" parameterType="int" resultType="CouponAfChannel">
+        /* TscCoupon.getCouponAfChannelList */
+        SELECT A.CPN_ID
+             ,A.AF_LINK_CD
+             ,B.AF_LINK_NM
+             ,A.REG_DT
+             ,B.FEE_RATE
+             ,B.DISP_ORD
+             ,B.AF_CHANNEL
+        FROM TB_COUPON_AF_CHANNEL A LEFT JOIN TB_AF_LINK B ON A.AF_LINK_CD = B.AF_LINK_CD
+        WHERE CPN_ID = #{cpnId}
+    </select>
+
     <update id="updateCouponMstInfo" parameterType="Coupon">
         /* TscCoupon.updateCouponMstInfo */
         UPDATE	TB_COUPON	SET
@@ -414,8 +429,19 @@
         /* TscCoupon.deleteLimitedTimeCoupon */
         UPDATE TB_LIMITED_TIME_COUPON SET
             DEL_YN = 'Y'
-                                        , UPD_NO = #{updNo}
-                                        , UPD_DT = CURRENT_TIMESTAMP
+          , UPD_NO = #{updNo}
+          , UPD_DT = CURRENT_TIMESTAMP
+        WHERE CPN_ID = #{cpnId}
+          AND DEL_YN = 'N'
+    </update>
+
+    <!-- 쿠폰 제휴링크 삭제 -->
+    <update id="deleteCouponAfChannel" parameterType="Coupon">
+        /* TscCoupon.deleteCouponAfChannel */
+        UPDATE TB_COUPON_AF_CHANNEL SET
+            DEL_YN = 'Y'
+            , UPD_NO = #{updNo}
+            , UPD_DT = CURRENT_TIMESTAMP
         WHERE CPN_ID = #{cpnId}
           AND DEL_YN = 'N'
     </update>
@@ -740,6 +766,24 @@
             , UPD_DT = CURRENT_TIMESTAMP()
     </insert>
 
+    <!-- 쿠폰 제휴링크 저장 -->
+    <insert id="createCouponAfChannel" parameterType="CouponAfChannel">
+        /* TscCoupon.createLimitedTimeCoupon */
+        INSERT INTO TB_COUPON_AF_CHANNEL (
+                                          CPN_ID
+                                          , AF_LINK_CD
+                                          , REG_NO
+                                          , REG_DT
+        ) VALUES (
+            #{cpnId}
+            , #{afLinkCd}
+            , #{regNo}
+            , CURRENT_TIMESTAMP()
+        ) ON DUPLICATE KEY UPDATE
+          REG_NO = #{regNo}
+        , REG_DT = CURRENT_TIMESTAMP()
+    </insert>
+
     <!-- 특정 쿠폰 발급받은 회원 조회-->
     <select id="getCouponIssueCustList" parameterType="CustCoupon" resultType="CustCoupon">
         /* TscCoupon.getCouponIssueCustList */

+ 12 - 0
src/main/java/com/style24/persistence/mybatis/shop/TscOrder.xml

@@ -3574,6 +3574,18 @@
 		  FROM TB_ORDER_CHANGE_DETAIL
 		 WHERE ORD_CHG_SQ = #{ordChgSq}
 	</insert>
+
+	<!-- 주문상세단품 상태값 변경-->
+	<update id="updateOrderDetailItemStat" parameterType="Order">
+	/* TscOrder.updateOrderDetailItemStat */
+		UPDATE TB_ORDER_DETAIL_ITEM
+		SET    ORD_DTL_STAT = #{ordDtlStat}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  ORD_NO = #{ordNo}
+		AND    ORD_DTL_NO = #{ordDtlNo}
+	</update>
+
 </mapper>
 
 

+ 40 - 1
src/main/java/com/style24/persistence/mybatis/shop/TscOrderChange.xml

@@ -1679,7 +1679,7 @@
 		   AND OC.ADD_PAY_COST > 0
 	</select>
 	
-	<!-- 추가배송비 결제 취소 정보 생성 -->
+	<!-- 추가배송비 결제 취소 정보 생성(사용안함) -->
 	<insert id="createAddDeliveryFeeCancelPayment" parameterType="Order" keyProperty="paySq">
 		/* OrderChange.createAddDeliveryFeeCancelPayment */
 		INSERT INTO TB_PAYMENT (
@@ -2590,6 +2590,45 @@
 		   AND O.DISP_YN = 'Y'
 		</where>
 	</select>
+	
+	<!-- 결제취소 환불정보 수정 -->
+	<update id="updateRefundInfo" parameterType="Order">
+		/* TscOrderChange.updateRefundInfo */
+		UPDATE TB_REFUND
+		   SET PAY_SQ = #{paySq}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		 WHERE ORD_NO = #{ordNo}
+		   AND ORD_CHG_SQ = #{ordChgSq}
+	</update>
+	
+	<!-- 주문취소접수승인 정보 조회 -->
+	<select id="approveCancelRequestInfo" parameterType="OrderChange" resultType="OrderChange">
+		/* TscOrderChange.approveCancelRequestInfo */
+		SELECT OD.ORD_NO
+		     , O.CUST_NO
+		     , O.ORD_NM
+		     , OCD.ORD_DTL_NO
+			 , OCD.CHG_QTY
+		     , OC.CHG_REASON
+		     , FN_GET_CODE_NM('G686', OC.CHG_REASON) AS CHG_REASON_NM
+		     , OC.CHG_MEMO
+		     , P.PG_TID
+		     , P.PAY_MEANS
+		     , P.PG_GB
+		  FROM TB_ORDER_CHANGE_DETAIL OCD
+		 INNER JOIN TB_ORDER_CHANGE OC
+		    ON OC.ORD_CHG_SQ = OCD.ORD_CHG_SQ
+		 INNER JOIN TB_ORDER_DETAIL OD
+		    ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
+		 INNER JOIN TB_ORDER O
+		    ON O.ORD_NO = OD.ORD_NO
+		 INNER JOIN TB_PAYMENT P
+		    ON P.ORD_NO = O.ORD_NO
+		   AND P.PAY_GB = 'O'
+		   AND P.PAY_STAT = 'G016_30'
+		 WHERE OCD.ORD_CHG_SQ = #{ordChgSq}
+	</select>
 </mapper>
 
 

+ 6 - 7
src/main/java/com/style24/persistence/mybatis/shop/TscPoint.xml

@@ -99,7 +99,7 @@
 			 , SUM(PNT_AMT) AS GV_POINT_AMT
 			 , 0            AS US_PNT_AMT
 			 , SUM(PNT_AMT) AS RM_POINT_AMT
-			 , CONCAT(CURRENT_DATE + INTERVAL 2 YEAR, ' 23:59:59') AS EXP_BE_DT
+			 , CONCAT(CURRENT_DATE + INTERVAL #{buyPointExpireDays} DAY, ' 23:59:59') AS EXP_BE_DT
 			 , NULL         AS EXP_CMP_DT
 			 , #{regNo}     AS REG_NO
 			 , NOW()        AS REG_DT
@@ -109,9 +109,8 @@
 		WHERE CUST_NO = #{custNo}
 		AND   ORD_NO = #{ordNo}
 		AND   ORD_DTL_NO = #{ordDtlNo}
-		AND   OCCUR_GB = 'G069_12'              -- 예정포인트적립
-		AND   PNT_UPLOAD_STAT = 'G070_10'       -- 반영예정
-		GROUP BY CUST_NO
+		AND   OCCUR_GB IN ('G069_12', 'G069_13')  -- 예정포인트적립
+		AND   PNT_UPLOAD_STAT = 'G070_10'         -- 반영예정
 	</insert>
 	
 	<!-- 구매확정 포인트 이력 수정 -->
@@ -130,7 +129,7 @@
 		WHERE  CUST_NO = #{custNo}
 		AND    ORD_NO = #{ordNo}
 		AND    ORD_DTL_NO = #{ordDtlNo}
-		AND    OCCUR_GB = 'G069_12'
+		AND    OCCUR_GB IN ('G069_12', 'G069_13')
 		AND    PNT_UPLOAD_STAT = 'G070_10'
 	</update>
 	
@@ -138,8 +137,8 @@
 	<select id="getOrderDecisionPoint" parameterType="Point" resultType="int">
 		/* TscPoint.getOrderDecisionPoint */
 		SELECT GV_PNT_AMT
-		  FROM TB_CUST_POINT
-		 WHERE CUST_PNT_SQ = #{custPntSq}
+		FROM TB_CUST_POINT
+		WHERE CUST_PNT_SQ = #{custPntSq}
 	</select>
 
 </mapper>

+ 6 - 6
src/main/java/com/style24/persistence/mybatis/wms/TscWmsDelivery.xml

@@ -99,16 +99,16 @@
 	<update id="updateWmsIfDeliveryOrderItemCancel" parameterType="WmsDelivery">
 		/* TscWmsDelivery.updateWmsIfDeliveryOrderItemCancel */
 			UPDATE istyle24_Wmsif.dbo.TB_IF_DeliveryOrderItem SET
-			  StatusCd = CASE WHEN (Qty - Cqty) = #{chgQty} THEN '60' ELSE StatusCd END 
-			, IsCancel = CASE WHEN (Qty - Cqty) = #{chgQty} THEN 1    ELSE IsCancel END 
-			, Cqty     =  #{chgQty}
+			  StatusCd = CASE WHEN (Qty - Cqty) = #{itemQty} THEN '60' ELSE StatusCd END 
+			, IsCancel = CASE WHEN (Qty - Cqty) = #{itemQty} THEN 1    ELSE IsCancel END 
+			, Cqty     =  #{itemQty}
 			WHERE 1=1
 			  <if test='ordDtlNo != null and ordDtlNo != ""'>
 			  AND OrderDtlNo = #{ordDtlNo}
 			  </if>
-			  <if test='ordDtlNo = null or ordDtlNo = ""'>
+			  <if test='ordDtlNo == null or ordDtlNo == ""'>
 			  AND ProductNo  = #{productNo}
-			  AND SKUCode    = #{skuCode}  	
+			  AND SKUCode    = #{optCd}  	
 			  </if>	
 			  AND (GiftYn != 'Y' OR GiftYn IS NULL) 
 	</update>
@@ -130,7 +130,7 @@
 	<!-- WMS 배송 사은품 취소  -->
 	<update id="updateWmsIfDeliveryOrderGiftCancel" parameterType="WmsDelivery">
 		/* TscWmsDelivery.updateWmsIfDeliveryOrderGiftCancel */
-		UPDATE istyle24_Wmsif.dbo.TB_IF_DeliveryOrderItem A SET 
+		UPDATE istyle24_Wmsif.dbo.TB_IF_DeliveryOrderItem SET 
 			  StatusCd = '60'
 			, IsCancel = 1
 		WHERE DeliveryOrderNo = ( SELECT MAX(A.DeliveryOrderNo) AS DeliveryOrderNo