Procházet zdrojové kódy

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

card007 před 5 roky
rodič
revize
0f53668a1c

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

@@ -359,4 +359,13 @@ public interface TscCouponDao {
      * @since 2021. 1. 8
      */
     void updateGiveRandomCoupon(CustCoupon coupon);
+
+    /**
+     * 쿠폰지급 - pdGb 별 쿠폰 지급
+     * @param custCoupon
+     * @return int
+     * @author jsshin
+     * @since 2021. 4. 15
+     */
+    int createCustCoupon(CustCoupon custCoupon);
 }

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

@@ -488,6 +488,17 @@ public class TscCouponService {
         couponDao.saveCouponCustPub(coupon);
     }
 
+    /**
+     * 쿠폰지급 - pdGb 별 쿠폰 지급
+     * @param coupon - 쿠폰정보
+     * @author jsshin
+     * @since 2021. 04. 15
+     */
+    @Transactional("shopTxnManager")
+    public int createCustCoupon(CustCoupon coupon) {
+        return couponDao.createCustCoupon(coupon);
+    }
+
     /**
      * 랜덤 쿠폰 지급
      * @param coupon - 쿠폰정보

+ 92 - 0
src/main/java/com/style24/core/biz/thirdparty/KollusApi.java

@@ -0,0 +1,92 @@
+package com.style24.core.biz.thirdparty;
+
+import java.net.URI;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import com.google.gson.Gson;
+import com.style24.persistence.domain.KollusResult;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * CATENOID 동영상 업로드 API (Kollus)
+ * 
+ * @author gagamel
+ * @since 2021. 4. 15
+ */
+@Component
+@Slf4j
+public class KollusApi {
+
+	// URL
+	private String apiUrl = "http://api.kr.kollus.com/0/media_auth/upload/create_url?access_token=7ge80tfvz51x2606";
+
+	@Autowired
+	private RestTemplate restTemplate;
+
+	@PostConstruct
+	public void init() {
+		log.debug("\n\n---- CATENOID Kollus initialization started ----");
+		log.debug("apiUrl: [{}]", apiUrl);
+		log.debug("\n--- CATENOID Kollus initialization completed ----\n");
+	}
+
+	/**
+	 * 일회성 동영상 업로드 URL 조회
+	 * @param goodsCd - 상품코드
+	 * @return 동영상 업로드 URL 정보
+	 * @throws Exception
+	 * @author gagamel
+	 * @since 2021. 4. 15
+	 */
+	public KollusResult getVideoUploadUrl(String goodsCd) throws Exception {
+		// Parameter
+		MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
+//		params.add("expire_time", "600");			// 만료시간. 값의 범위는 0 < expire_time <= 21600. 빈값을 보내거나 항목 자체를 제거하면 기본 600초로 설정
+//		params.add("category_key", "");				// 업로드할 파일이 속할 카테고리키
+//		params.add("title", "");					// 입력한 제목을 컨텐츠의 제목으로 강제 지정. 이 값을 보내지 않거나 빈 값으로 보내면 기본적으로 파일명이 제목으로 사용됨. is_passthrough를 1로 설정 시 원본파일명으로 지정됨.
+		params.add("is_encryption_upload", "0");	// 0은 일반업로드, 1은 암호화업로드. 암호화 업로드 시 파일이 암호화 되어 Kollus의 전용 플레이어로만 재생됨.
+		params.add("is_audio_upload", "0");			// 0은 비디오 업로드, 1은 음원파일 업로드
+//		params.add("is_multipart_upload", "0");		// 파일의 분할 업로드를 지원하기 위한 값. 현재는 동작하지 않으며 추후 제공될 기능
+		params.add("is_passthrough", "0");			// 1은 passthrough 업로드, 0은 일반 업로드
+//		params.add("profile_key", "");				// is_passthrough가 1인 경우 의미가 있음. (profile_key={계정명}-pc-high). 설정->고급기능->인코딩 프로파일에서 확인 가능
+//		params.add("selected_profile_key", "");		// 파일라이브의 업로드 경우에만 사용. 값 : (서비스계정키)-filelive. kollus 라이브의 파일라이브가 활성화 상태에만 유효
+		log.info("params: {}", params);
+
+		// Header
+		HttpHeaders headers = new HttpHeaders();
+//		headers.add("Accept", "application/xml; charset=utf-8");
+//		headers.add("Content-Type", "application/xml; charset=utf-8");
+		headers.setContentType(MediaType.APPLICATION_XML);
+
+		HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(params, headers);
+		URI url = URI.create(apiUrl);
+
+		// POST방식으로 호출
+		ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class);
+		log.info("responseEntity.getStatusCode(): {} ", responseEntity.getStatusCode());
+
+		String responseJson = responseEntity.getBody();
+		log.info("responseEntity.getBody(): {}", responseJson);
+
+		if (!responseEntity.getStatusCode().equals(HttpStatus.OK)) {
+			return null;
+		}
+
+		Gson gson = new Gson();
+		return gson.fromJson(responseJson, KollusResult.class);
+	}
+
+}

+ 27 - 15
src/main/java/com/style24/core/biz/thirdparty/SsgKakaoSender.java

@@ -1,22 +1,26 @@
 package com.style24.core.biz.thirdparty;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import javax.annotation.PostConstruct;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.google.gson.Gson;
 import com.style24.core.biz.dao.SsgDirectMessageDao;
 import com.style24.core.biz.dao.TscAnswerPhaseDao;
 import com.style24.core.support.env.TscConstants;
 import com.style24.persistence.domain.AnswerPhase;
 import com.style24.persistence.domain.SsgDirectMessage;
 
+import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
@@ -130,20 +134,19 @@ public class SsgKakaoSender {
 		dm.setFcallback(callbackTelNo);
 
 		// 버튼생성
-//		if (StringUtils.isNotBlank(dm.getButtonNm())) {
-//			JSONObject button = new JSONObject();
-//			button.put("name", dm.getButtonNm());
-//			button.put("type", "WL");
-//			button.put("url_mobile", domainUrl + dm.getButtonUrl());
-//
-//			JSONObject jsonData = new JSONObject();
-//			jsonData.put("button", button);
-//
-//			JSONArray jsonArray = new JSONArray();
-//			jsonArray.add(button);
-//
-//			dm.setFkkobutton(jsonArray.toString());
-//		}
+		if (StringUtils.isNotBlank(ansPhase.getButtonNm())) {
+			Button button = new Button();
+			button.setName(ansPhase.getButtonNm());
+			button.setType("WL");
+			button.setUrl_pc(ansPhase.getButtonUrl());
+			button.setUrl_mobile(ansPhase.getButtonUrl());
+
+			Collection<Button> buttonList = new ArrayList<>();
+			buttonList.add(button);
+
+			Gson gson = new Gson();
+			dm.setFkkobutton("\"button\":" + gson.toJson(buttonList));
+		}
 
 		// 카카오 알림톡 발송
 		dmDao.createKakao(dm);
@@ -186,13 +189,14 @@ public class SsgKakaoSender {
 
 	/**
 	 * 답변문구 조회
+	 * 		어드민의 "운영관리 > 사이트설정 > 답변문구관리" 화면에서 등록/수정 시 answerPhase 캐시를 삭제
 	 * @param ansSq - 답변일련번호
 	 * @param replaceInfo - 메시지내용 중 대체할 정보
 	 * @return
 	 * @author gagamel
 	 * @since 2020. 11. 9
 	 */
-	@Cacheable(value = "common", key = "'answerPhase-'.concat(#ansSq)")
+	@Cacheable(value = "answerPhase", key = "#ansSq")
 	public AnswerPhase getAnswerPhase(Integer ansSq, GagaMap replaceInfo) {
 		AnswerPhase ansPhase = ansPhaseDao.getAnswerPhase(ansSq);
 		ansPhase.setAnsContent(GagaStringUtil.replace(this.mergeData(ansPhase.getAnsContent(), replaceInfo), "&gt;", ">"));
@@ -249,4 +253,12 @@ public class SsgKakaoSender {
 		return keyList;
 	}
 
+	@Data
+	class Button {
+		private String name;
+		private String type;
+		private String url_pc;
+		private String url_mobile;
+	}
+
 }

+ 9 - 6
src/main/java/com/style24/persistence/domain/AnswerPhase.java

@@ -14,11 +14,14 @@ import lombok.Data;
 @Data
 public class AnswerPhase extends TscBaseDomain {
 
-	private Integer ansSq;
-	private String siteCd;
-	private String ansClsf;
-	private String ansTitle;
-	private String ansContent;
-	private String useYn;
+	private Integer ansSq;		// 답변일련번호
+	private String siteCd;		// 사이트코드
+	private String ansClsf;		// 답변종류
+	private String ansTitle;	// 답변제목
+	private String ansContent;	// 답변내용
+	private String kakaoCd;		// 카카오템플릿코드
+	private String buttonNm;	// 카카오버튼명
+	private String buttonUrl;	// 카카오버튼URL
+	private String useYn;		// 사용여부
 
 }

+ 8 - 0
src/main/java/com/style24/persistence/domain/CustCoupon.java

@@ -25,9 +25,17 @@ public class CustCoupon extends TscBaseDomain {
     private String  rdCpnNm;                // 랜덤쿠폰 및 시리얼쿠폰 키
     private String  custId;                 // 고객 아이디
     private String  custNm;                 // 고객명
+    private String  pdGb;                   // 기간/일수구분(P:기간, D:일수)
+    private int   availDays;                // 유효일수
+
+    private String siteCd;
+    private String dcWay;
+    private int dcVal;
+    private String frontGb;
 
     // 그리드 컬럼
     private String  custList;
     private String  cpnNm;                  // 쿠폰명
     private Integer ordNo;                  // 주문번호
+
 }

+ 29 - 0
src/main/java/com/style24/persistence/domain/KollusResult.java

@@ -0,0 +1,29 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * CATENOID 동영상업로드 API 결과 (Kollus)
+ * 
+ * @author gagamel
+ * @since 2021. 4. 15
+ */
+@SuppressWarnings("serial")
+@Data
+public class KollusResult extends TscBaseDomain {
+
+	private String error;	// 에러코드. 0이면 정상
+	private String message;	// 에러의 경우 상세 설명
+	private Result result;	// 정상인 경우 업로드API호출 결과
+
+	@Data
+	public class Result {
+		private String upload_url;			// 업로드할 URL
+		private String progress_url;		// 업로드 진행율을 획득할 수 있는 URL
+		private String upload_file_key;		// 업로드파일키
+		private String will_be_expired_at;	// 만료시간
+	}
+
+}

+ 15 - 15
src/main/java/com/style24/persistence/mybatis/shop/SsgDirectMessage.xml

@@ -62,21 +62,21 @@
 	<insert id="createKakao" parameterType="SsgDirectMessage">
 		/* SsgDirectMessage.createKakao */
 		INSERT INTO SSG_SEND_TRAN_KKO (
-		       FSEQ            --메시지SEQ
-		     , FUSERID         --사용자계정
-		     , FSECTIONCODE    --계층코드(SINC로부터 부여받은 코드값)
-		     , FCAMPCODE       --캠페인코드(CRM전송 등에 이용)
-		     , FYELLOWID       --KKO발신프로필키(카카오 전송을 위해 승인받은 프로필키)
-		     , FKKOSUBJECT     --KKO친구툭전용제목
-		     , FTEMPLATEKEY    --KKO템플릿키
-		     , FKKOBUTTON      --KKO버튼(링크기능, JSON 이용)
-		     , FMSGTYPE        --메시지타입(4:KKO)
-		     , FMESSAGE        --메시지본문
-		     , FSENDDATE       --메시지발송시간(예약메시지인경우 해당 예약일시)
-		     , FKKORESENDTYPE  --KKO/KKF재발송메시지타입(SMS/LMS)
-		     , FKKORESENDMSG   --KKO/KKF재발송메시지내용
-		     , FDESTINE        --수신자전화번호
-		     , FCALLBACK       --발신자전화번호(회신번호)
+		       FSEQ            /*메시지SEQ*/
+		     , FUSERID         /*사용자계정*/
+		     , FSECTIONCODE    /*계층코드(SINC로부터 부여받은 코드값)*/
+		     , FCAMPCODE       /*캠페인코드(CRM전송 등에 이용)*/
+		     , FYELLOWID       /*KKO발신프로필키(카카오 전송을 위해 승인받은 프로필키)*/
+		     , FKKOSUBJECT     /*KKO친구툭전용제목*/
+		     , FTEMPLATEKEY    /*KKO템플릿키*/
+		     , FKKOBUTTON      /*KKO버튼(링크기능, JSON 이용)*/
+		     , FMSGTYPE        /*메시지타입(4:KKO)*/
+		     , FMESSAGE        /*메시지본문*/
+		     , FSENDDATE       /*메시지발송시간(예약메시지인경우 해당 예약일시)*/
+		     , FKKORESENDTYPE  /*KKO/KKF재발송메시지타입(SMS/LMS)*/
+		     , FKKORESENDMSG   /*KKO/KKF재발송메시지내용*/
+		     , FDESTINE        /*수신자전화번호*/
+		     , FCALLBACK       /*발신자전화번호(회신번호)*/
 		)
 		VALUES (
 		       NULL

+ 35 - 0
src/main/java/com/style24/persistence/mybatis/shop/TscCoupon.xml

@@ -966,4 +966,39 @@
             , UPD_DT = NOW()
         WHERE RD_CPN_ID = #{rdCpnId}
     </update>
+
+	<insert id="createCustCoupon" parameterType="CustCoupon">
+		/* TscCoupon.createCustCoupon */
+		INSERT INTO TB_CUST_COUPON (
+		      CUST_NO
+		    , CPN_ID
+		    , AVAIL_STDT
+		    , AVAIL_EDDT
+		    , PUB_REASON
+		    , PUB_REASON_DTL
+		    , END_ALIM_SEND_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		) VALUES (
+		      #{custNo}
+		    , #{cpnId}
+		<if test='pdGb == "P"'>
+		    , DATE_FORMAT(#{availStdt} , '%Y%m%d%H%i%S')
+		    , DATE_FORMAT(#{availEddt} , '%Y%m%d%H%i%S')
+		</if>
+		<if test='pdGb == "D"'>
+		    , NOW()
+		    , DATE_ADD(NOW(), INTERVAL #{availDays} DAY )
+		</if>
+		    , #{pubReason}
+		    , IFNULL(#{pubReasonDtl}, FN_GET_CODE_NM('G068', #{pubReason}))
+		    , #{endAlimSendYn}
+		    , #{regNo}
+		    , CURRENT_TIMESTAMP()
+		    , #{updNo}
+		    , CURRENT_TIMESTAMP()
+		)
+	</insert>
 </mapper>