Bläddra i källkod

Merge branch 'develop' of http://112.172.147.34:4936/style24/style24.core.git into develop

tsit14 4 år sedan
förälder
incheckning
03e8bb65df

+ 93 - 0
src/main/java/com/style24/core/biz/service/TscKakaotalkService.java

@@ -4,6 +4,8 @@ import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
+import com.style24.core.biz.dao.TscOrderChangeDao;
+import com.style24.persistence.domain.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
@@ -14,6 +16,7 @@ import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.thirdparty.NaverShortUrl;
 import com.style24.core.biz.thirdparty.SsgKakaoSender;
 import com.style24.core.support.env.TscConstants;
+import com.style24.persistence.domain.Counsel;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustContactHst;
 import com.style24.persistence.domain.CustCoupon;
@@ -50,6 +53,9 @@ public class TscKakaotalkService {
 	@Autowired
 	private NaverShortUrl shortUrl;
 
+	@Autowired
+	private TscOrderChangeDao orderChangeDao;
+
 	/**
 	 * 고객 임시비밀번호 알림톡 발송
 	 * @param customer - 고객 정보
@@ -684,6 +690,14 @@ public class TscKakaotalkService {
 	 */
 	@Transactional("shopTxnManager")
 	public void sendDeliveryStart(Order order, Integer senderNo) throws Exception {
+		Payment payment = new Payment();
+		payment.setOrdNo(order.getOrdNo());
+		payment = orderChangeDao.getPaymentInfo(payment);
+		// 네이버페이 주문형 데이터는 알림톡 송부X
+		if(TscConstants.PgGb.NAVER_ORDER.value().equals(payment.getPgGb())) {
+			return;
+		}
+
 		SsgDirectMessage dm = new SsgDirectMessage();
 		dm.setFuserid(String.valueOf(senderNo)); // 발송자NO
 		dm.setFdestine(order.getOrdPhnno());
@@ -935,6 +949,14 @@ public class TscKakaotalkService {
 	 */
 	@Transactional("shopTxnManager")
 	public void sendOrderCancelComplete(OrderChange orderChange, Integer senderNo) throws Exception {
+		Payment payment = new Payment();
+		payment.setOrdNo(orderChange.getOrdNo());
+		payment = orderChangeDao.getPaymentInfo(payment);
+		// 네이버페이 주문형 데이터는 알림톡 송부X
+		if(TscConstants.PgGb.NAVER_ORDER.value().equals(payment.getPgGb())) {
+			return;
+		}
+
 		SsgDirectMessage dm = new SsgDirectMessage();
 		dm.setFuserid(String.valueOf(senderNo));
 		dm.setFdestine(orderChange.getOrdPhnno());
@@ -1205,4 +1227,75 @@ public class TscKakaotalkService {
 			}
 		}
 	}
+	
+	/**
+	 *  1:1문의 알림톡
+	 * @param counsel
+	 * @param senderNo - 발송자번호(고객번호)
+	 * @author sowon
+	 * @since 2021. 6. 21
+	 */
+	@Transactional("shopTxnManager")
+	public void sendOneToOneAnswerNotify(Counsel counsel, Integer senderNo) {
+		SsgDirectMessage dm = new SsgDirectMessage();
+		dm.setFuserid(String.valueOf(senderNo)); // 발송자NO
+		dm.setFdestine(counsel.getCellPhnno());
+		dm.setFkkoresendtype("LMS");
+
+		GagaMap replaceInfo = new GagaMap();
+		replaceInfo.setString("siteNm", siteNm);
+		replaceInfo.setString("custNm", counsel.getCustNm());
+		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.ONE_TO_ONE_ANSWER.value(), dm, replaceInfo);
+		
+		try {
+			// 고객접촉이력 정보
+			CustContactHst custContactHst = new CustContactHst();
+			custContactHst.setContactType(TscConstants.ContactType.ONE_TO_ONE_ANSWER.value()); // 접촉유형:임시비밀번호발급(공통코드G054)
+			custContactHst.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); 		// 접촉방법:알림톡+문자(공통코드G055)
+			custContactHst.setContactContents("1:1문의답변");
+			custContactHst.setReceiverNo(counsel.getCustNo());
+			custContactHst.setSenderNo(senderNo);
+			custContactHst.setRegNo(senderNo);
+			coreCustomerService.createCustomerContactHistory(custContactHst);
+		} catch (Exception e) {
+			log.error("error", e);
+			// Do nothing
+		}
+	}
+	
+	/**
+	 *  상품문의 알림톡
+	 * @param counsel
+	 * @param senderNo - 발송자번호(고객번호)
+	 * @author sowon
+	 * @since 2021. 6. 21
+	 */
+	@Transactional("shopTxnManager")
+	public void sendGoodsAskNotify(Counsel counsel, Integer senderNo) {
+		SsgDirectMessage dm = new SsgDirectMessage();
+		dm.setFuserid(String.valueOf(senderNo)); // 발송자NO
+		dm.setFdestine(counsel.getCellPhnno());
+		dm.setFkkoresendtype("LMS");
+
+		GagaMap replaceInfo = new GagaMap();
+		replaceInfo.setString("siteNm", siteNm);
+		replaceInfo.setString("custNm", counsel.getCustNm());
+		replaceInfo.setString("goodsNm", counsel.getGoodsNm());
+		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.GOODS_ASK_ANSWER.value(), dm, replaceInfo);
+		
+		try {
+			// 고객접촉이력 정보
+			CustContactHst custContactHst = new CustContactHst();
+			custContactHst.setContactType(TscConstants.ContactType.GOODS_ASK_ANSWER.value()); // 접촉유형:임시비밀번호발급(공통코드G054)
+			custContactHst.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); 		// 접촉방법:알림톡+문자(공통코드G055)
+			custContactHst.setContactContents("상품문의답변");
+			custContactHst.setReceiverNo(counsel.getCustNo());
+			custContactHst.setSenderNo(senderNo);
+			custContactHst.setRegNo(senderNo);
+			coreCustomerService.createCustomerContactHistory(custContactHst);
+		} catch (Exception e) {
+			log.error("error", e);
+			// Do nothing
+		}
+	}
 }

+ 35 - 2
src/main/java/com/style24/core/biz/service/TscKcpService.java

@@ -22,6 +22,8 @@ import com.style24.persistence.domain.Payment;
 
 import lombok.extern.slf4j.Slf4j;
 
+import java.lang.reflect.Field;
+import java.nio.charset.Charset;
 import java.util.HashMap;
 
 @Service
@@ -400,14 +402,14 @@ public class TscKcpService {
 		siteKey = "4aVa--.Xz8Fc78nwYPsrmmY__";
 
 		String tranCd = "00100000";
-		
+		// 파일 인코딩 EUC-KR 변경
+		setFileEncoding("EUC-KR");
 		J_PP_CLI_N c_PayPlus = new J_PP_CLI_N();
 		c_PayPlus.mf_init( "", pgUrl, pgPort, 0, env.getProperty("pg.kcp.log.dir") );
 		c_PayPlus.mf_init_set();
 
 		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
 		String custIp = request.getRemoteAddr();
-		//String custIp = custAccount.getIpAddress();
 		String ordNo = String.valueOf(custAccount.getOrdNo());
 		String bankCode = custAccount.getBankCd();
 		String accountNo = custAccount.getAccountNo();
@@ -447,6 +449,8 @@ public class TscKcpService {
 		result.set("resCd", c_PayPlus.m_res_cd);										// 결과 메시지
 		result.set("resMsg", c_PayPlus.m_res_msg);										// 결과 메시지
 		result.set("res_en_msg", c_PayPlus.getRecvMsgOfKey("res_en_msg"));				// 결과 메시지(영문)
+		// 파일 인코딩 UTF-8 변경
+		setFileEncoding("UTF-8");
 
 		return result;
 	}
@@ -526,4 +530,33 @@ public class TscKcpService {
 
 		return result;
 	}
+
+	/**
+	 * 파일 인코딩 설정
+	 * JDK 1.9에서는 작동 안하는것 같음
+	 * @param encoding - EUC-KR, UTF-8
+	 * @author jsshin
+	 * @since 2021. 06. 21
+	 */
+	private void setFileEncoding(String encoding) {
+		log.info("file.encoding Before: {}", System.getProperty("file.encoding"));
+		System.setProperty("file.encoding", encoding);
+		Field charset;
+		try {
+			charset = Charset.class.getDeclaredField("defaultCharset");
+			charset.setAccessible(true);
+			charset.set(null, null);
+		} catch (NoSuchFieldException e1) {
+			e1.printStackTrace();
+		} catch (SecurityException e1) {
+			e1.printStackTrace();
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		}
+		log.info("file.encoding After: {}", System.getProperty("file.encoding"));
+	}
+
 }
+

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

@@ -300,11 +300,11 @@ public class TscNaverPayService {
 				order = orderDao.getOrdDtlInfo(order);
 
 				// 네이버 페이 주문일 경우
-				if(TscConstants.PgGb.NAVER_ORDER.value().equals(order.getPgGb())) {
+				if(order != null && TscConstants.PgGb.NAVER_ORDER.value().equals(order.getPgGb())) {
 					try {
 						Security.addProvider(new BouncyCastleProvider());
 						AccessCredentialsType accessCredentialsType = new AccessCredentialsType();
-						MallServiceLocator MSL = new MallServiceLocator(env.getProperty("naver.pay.port.address"));
+						MallServiceLocator MSL = new MallServiceLocator(env.getProperty("naverPay.port.address"));
 						MallServiceSOAP11BindingStub stub = new MallServiceSOAP11BindingStub();
 
 						stub = (MallServiceSOAP11BindingStub) MSL.getMallServiceSOAP11Port();
@@ -312,9 +312,9 @@ public class TscNaverPayService {
 						ShipProductOrderRequest shipProductOrderRequest 	= null;
 						ShipProductOrderResponse shipProductOrderResponse 	= null;
 
-						order.setAccessLicense(env.getProperty("naver.pay.access.license"));
-						order.setSecretKey(env.getProperty("naver.pay.secret.key"));
-						order.setMallCd(env.getProperty("naver.pay.mall.id"));
+						order.setAccessLicense(env.getProperty("naverPay.access.license"));
+						order.setSecretKey(env.getProperty("naverPay.secret.key"));
+						order.setMallCd(env.getProperty("naverPay.shop.id"));
 
 						//서명생성
 						generateSignature("ShipProductOrder", order.getSecretKey());
@@ -330,7 +330,7 @@ public class TscNaverPayService {
 						shipProductOrderRequest = new ShipProductOrderRequest();
 						shipProductOrderRequest.setAccessCredentials(accessCredentialsType);
 						shipProductOrderRequest.setDetailLevel("Full");
-						shipProductOrderRequest.setVersion(env.getProperty("naver.pay.version"));
+						shipProductOrderRequest.setVersion(env.getProperty("naverPay.version"));
 						shipProductOrderRequest.setRequestID("");
 						shipProductOrderRequest.setProductOrderID(String.valueOf(order.getNpayOrdDtlNo()));
 						shipProductOrderRequest.setDeliveryMethodCode(DeliveryMethodType.DELIVERY);
@@ -338,8 +338,12 @@ public class TscNaverPayService {
 						shipProductOrderRequest.setTrackingNumber(order.getInvoiceNo());
 
 						Calendar dispatchDate = Calendar.getInstance();
-						Date tmp = new SimpleDateFormat("yyyyMMddHHmmss").parse(order.getDelvStdt(), new ParsePosition(0));
-						if("".equals(order.getDelvStdt())) tmp = new Date();
+						Date tmp;
+						if(StringUtils.isNotBlank(order.getDelvStdt())) {
+							tmp = new SimpleDateFormat("yyyyMMddHHmmss").parse(order.getDelvStdt(), new ParsePosition(0));
+						} else {
+							tmp = new Date();
+						}
 
 						dispatchDate.setTime(tmp);
 						shipProductOrderRequest.setDispatchDate(dispatchDate);
@@ -365,8 +369,8 @@ public class TscNaverPayService {
 							try {
 								Order fail = new Order();
 								fail.setErrorReason("변경상품주문조회 에러");
-								fail.setOrdNo(fail.getOrdNo());
-								fail.setNpayOrdDtlNo(fail.getNpayOrdDtlNo());
+								fail.setOrdNo(order.getOrdNo());
+								fail.setNpayOrdDtlNo(order.getNpayOrdDtlNo());
 								fail.setOptCd("sendNaverPayDeliveryStartOrder");
 								fail.setResultCd(shipProductOrderResponse.getError().getCode());
 								fail.setResultMsg(shipProductOrderResponse.getError().getMessage());
@@ -398,7 +402,7 @@ public class TscNaverPayService {
 	private void generateSignature(String operationName, String secretKey) {
 		timeStamp = SimpleCryptLib.getTimestamp();
 
-		String data = timeStamp + env.getProperty("naver.pay.service.name") + operationName;
+		String data = timeStamp + env.getProperty("naverPay.service.name") + operationName;
 
 		try {
 			signature = SimpleCryptLib.generateSign(data, secretKey);

+ 15 - 6
src/main/java/com/style24/core/biz/service/TscOrderService.java

@@ -2298,12 +2298,12 @@ public class TscOrderService {
 	 */
 	@Transactional("shopTxnManager")
 	public void updateSellerDelvStartAndPartCancel(Collection<Order> params, int userNo) {
-		try {
-			// 주문번호별 상세번호, 취소수량 및 주문정보 세팅
-			List<OrderChange> cancelDataList = new ArrayList<OrderChange>();
-			// 배송중 주문 목록 (알림톡 송부 위함)
-			List<Order> delvStartList = new ArrayList<Order>();
+		// 주문번호별 상세번호, 취소수량 및 주문정보 세팅
+		List<OrderChange> cancelDataList = new ArrayList<OrderChange>();
+		// 배송중 주문 목록 (알림톡 송부 및 네이버페이 주문형 데이터 송부 위함)
+		List<Order> delvStartList = new ArrayList<Order>();
 
+		try {
 			for(Order param : params) {
 				if(param.getCnclRtnQty() > 0) {
 					boolean chkOrd = true;
@@ -2371,6 +2371,14 @@ public class TscOrderService {
 
 						// TODO 취소 메일 송부
 
+
+						// TODO 품절취소 네이버페이 송부
+						try {
+							// 네이버페이 품절취소 송부
+
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
 					}
 				}
 			}
@@ -2407,6 +2415,7 @@ public class TscOrderService {
 						delv.setGoodsNm(param.getGoodsNm());
 						delv.setOrdPhnno(param.getOrdPhnno());
 						delv.setCustNo(param.getCustNo());
+						delv.setOrdDtlNo(param.getOrdDtlNo());
 						delv.setGoodsCnt("0");		// 첫 상품은 외 0건
 
 						delvStartList.add(delv);
@@ -2436,7 +2445,7 @@ public class TscOrderService {
 		}
 
 		try {
-			naverPayService.sendNaverPayDeliveryStartOrder(params, "SHIPPING");
+			naverPayService.sendNaverPayDeliveryStartOrder(delvStartList, "SHIPPING");
 		} catch(Exception e) {
 			e.printStackTrace();
 		}

+ 1 - 0
src/main/java/com/style24/core/support/env/TscConstants.java

@@ -80,6 +80,7 @@ public class TscConstants {
 		GIFTCARD_EXTNC_EXPECT("G054_213"),		// 회원/마케팅 - 상품권 소멸 예정 안내
 		COUPON_EXTNC_EXPECT("G054_214"),		// 회원/마케팅 - 쿠폰 소멸 예정안내
 		POINT_EXTNC_EXPECT("G054_215"),			// 회원/마케팅 - 포인트 소멸 예정안내
+		GOODS_ASK_ANSWER("G054_216"),			// 회원/마케팅 - 상품문의답변
 		ORDER_INFO("G054_301"),					// 주문-주문안내
 		BANK_DEPOSIT_INFO("G054_302"),			// 주문-무통장입금안내
 		SOLDOUT_EXPECTED_INFO("G054_303"),		// 주문-결품예정안내

+ 113 - 0
src/main/java/com/style24/persistence/domain/Counsel.java

@@ -0,0 +1,113 @@
+package com.style24.persistence.domain;
+
+import com.style24.core.support.session.TscSession;
+import com.style24.core.support.util.CryptoUtils;
+import com.style24.core.support.util.MaskingUtils;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상담(1:1문의) Domain
+ *
+ * @author gagamel
+ * @since 2020. 12. 24
+ */
+@SuppressWarnings("serial")
+@Data
+public class Counsel extends TscBaseDomain {
+
+	private Integer counselSq;		// 상담일련번호
+	private String counselType;		// 상담유형(C-1:1문의, G-상품문의)
+	private String siteCd;			// 사이트코드(공통코드G000)
+	private String siteNm;			// 사이트명
+	private String counselClsf;		// 상담분류(공통코드G059)
+	private String counselClsfNm;	// 상담분류명
+	private String counselDclsf;	// 상담분류상세(공통코드G591~G599)
+	private String counselDclsfNm;	// 상담분류상세명
+	private Integer custNo;			// 고객번호
+	private String custId;			// 고객ID
+	private String custNm;			// 고객명
+	private String cellPhnno;		// 휴대전화번호
+	private String smsReqYn;		// SMS(알림톡)요청여부
+	private String smsSendYn;		// SMS(알림톡)발송여부
+	private String email;			// 이메일
+//	private String emailReqYn;		// 이메일요청여부
+//	private String emailSendYn;		// 이메일발송여부
+	private String relOrdNo;		// 관련상품 주문번호
+	private String relGoodsCd;		// 관련상품코드(상품문의에서만 사용)
+	private String goodsNm;			// 상품명(상품문의에서만 사용)
+	private String goodsImg;		// 상품이미지
+	private String selfGoodsYn;		// 자사상품여부(상품문의에서만 사용)
+	private String questTitle;		// 문의제목
+	private String questContent;	// 문의내용
+	private String questDt;			// 문의일시
+	private String orgFileNm1;		// 원본파일명1
+	private String sysFileNm1;		// 시스템파일명1
+	private String orgFileNm2;		// 원본파일명2
+	private String sysFileNm2;		// 시스템파일명2
+	private String ansStat;			// 답변상태(공통코드G060)
+	private String ansStatNm;		// 답변상태명
+	private String ansTransYn;		// 답변의뢰여부(상품문의에서만 사용)
+	private String ansCompCd;		// 답변업체코드(상품문의에서만 사용)
+	private String ansCompNm;		// 답변업체명(상품문의에서만 사용)
+	private Integer ansTransNo;		// 답변의뢰자번호(상품문의에서만 사용)
+	private String ansTransNm;		// 답변의뢰자명(상품문의에서만 사용)
+	private String ansTransDt;		// 답변의뢰일시(상품문의에서만 사용)
+	private Integer assignedCsNo;	// 할당된CS담당자번호
+	private String assignedCsNm;	// 할당된CS담당자명
+	private String assignedYmd;		// 할당된연월일
+	private String assignedHms;		// 할당된시분초
+	private String ansTitle;		// 답변제목
+	private String ansContent;		// 답변내용
+	private Integer ansNo;			// 답변자번호
+	private String ansNm;			// 답변자명
+	private String ansDt;			// 답변일시
+	private String secretYn;		// 비밀글여부(상품문의에서만 사용)
+	private String delYn;			// 삭제여부
+
+	private Integer ansSq;
+	private String ansClsf;
+
+	// 검색조건
+	private String condition;		// 검색어
+	private String custGb;			// 회원구분
+	private String termGb;			// 기간구분
+	private String termStdt;		// 검색시작날짜
+	private String termEddt;		// 검색끝날짜
+
+	// 암호화 대상 복호화 처리
+	public String getCustNm() {
+		this.custNm = CryptoUtils.decryptAES(this.custNm);
+		return this.custNm;
+	}
+
+	public String getCellPhnno() {
+		this.cellPhnno = CryptoUtils.decryptAES(this.cellPhnno);
+		return this.cellPhnno;
+	}
+
+	public String getEmail() {
+		this.email = CryptoUtils.decryptAES(this.email);
+		return this.email;
+	}
+
+	// Masking
+	public String getMaskingCustId() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.id(this.custId) : this.custId;
+	}
+
+	public String getMaskingCustNm() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.name(getCustNm()) : getCustNm();
+
+	}
+
+	public String getMaskingCellPhnno() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.phoneNo(getCellPhnno()) : getCellPhnno();
+	}
+
+	public String getMaskingEmail() {
+		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.email(getEmail()) : getEmail();
+	}
+
+}

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

@@ -639,6 +639,7 @@
 		     , A.SHIP_COMP_CD
 		     , A.SHIP_COMP_NM
 		     , A.DELV_LOC_NM
+			 , A.PG_GB
 		FROM (
 		    SELECT OD.ORD_NO
 		         , CASE WHEN OD.ORD_EXCH_GB = 'O'
@@ -726,6 +727,7 @@
 		            WHERE  DL.DELV_LOC_CD = OD.DELV_LOC_CD
 		            AND    DL.USE_YN = 'Y'
 		            LIMIT  1) AS DELV_LOC_NM
+		         , P.PG_GB
 		      FROM TB_ORDER O
 		     INNER JOIN TB_ORDER_DETAIL OD
 		        ON O.ORD_NO = OD.ORD_NO
@@ -829,6 +831,7 @@
 		     , A.SHIP_COMP_CD
 		     , A.SHIP_COMP_NM
 		     , A.DELV_LOC_NM
+		     , A.PG_GB
 		 ORDER BY A.ORD_NO
 		     , A.ORD_DTL_NO DESC
 	</select>
@@ -4404,6 +4407,7 @@
 		INNER  JOIN TB_PAYMENT P
 		ON     OD.ORD_NO = P.ORD_NO
 		AND    P.PAY_STAT = 'G016_30'
+		AND    P.PAY_GB = 'O'
 		INNER  JOIN TB_SHIP_COMPANY SC
 		ON     OD.SHIP_COMP_CD = SC.SHIP_COMP_CD
 		WHERE  OD.ORD_DTL_NO = #{ordDtlNo}

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

@@ -2917,7 +2917,7 @@
 
 	<!-- 결제정보 조회 -->
 	<select id="getPaymentInfo" parameterType="Payment" resultType="Payment">
-		/* TscOrder.getPaymentInfo */
+		/* TscOrderChange.getPaymentInfo */
 		SELECT PAY_SQ
 		     , ORD_NO
 		     , PAY_DT