Просмотр исходного кода

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

xodud lee 5 лет назад
Родитель
Сommit
8d452fc694
24 измененных файлов с 908 добавлено и 79 удалено
  1. 34 0
      pom.xml
  2. 90 1
      src/main/java/com/style24/batch/biz/dao/TsbCustomerDao.java
  3. 2 2
      src/main/java/com/style24/batch/biz/dao/TsbDeliveryDao.java
  4. 59 0
      src/main/java/com/style24/batch/biz/job/customer/TsbGradeChangeJob.java
  5. 53 0
      src/main/java/com/style24/batch/biz/job/customer/TsbNetpathyMailJob.java
  6. 2 2
      src/main/java/com/style24/batch/biz/job/delivery/TsbSoldoutCancelJob.java
  7. 65 0
      src/main/java/com/style24/batch/biz/job/marketing/TsbBirthdayCouponNoticeJob.java
  8. 129 7
      src/main/java/com/style24/batch/biz/service/TsbCustomerService.java
  9. 4 4
      src/main/java/com/style24/batch/biz/service/TsbDeliveryService.java
  10. 23 2
      src/main/java/com/style24/batch/biz/service/TsbGoodsService.java
  11. 47 11
      src/main/java/com/style24/batch/biz/task/TsbCustomerTask.java
  12. 1 1
      src/main/java/com/style24/batch/biz/task/TsbDeliveryTask.java
  13. 1 1
      src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java
  14. 25 2
      src/main/java/com/style24/batch/biz/task/TsbMarketingTask.java
  15. 2 1
      src/main/java/com/style24/batch/biz/task/TsbSocialTask.java
  16. 11 0
      src/main/java/com/style24/persistence/domain/GoodsSafeNo.java
  17. 299 0
      src/main/java/com/style24/persistence/mybatis/shop/TsbCustomer.xml
  18. 9 9
      src/main/java/com/style24/persistence/mybatis/shop/TsbDelivery.xml
  19. 9 14
      src/main/java/com/style24/persistence/mybatis/shop/TsbDisplay.xml
  20. 15 5
      src/main/java/com/style24/persistence/mybatis/shop/TsbGoods.xml
  21. 2 2
      src/main/java/com/style24/persistence/mybatis/shop/TsbPoint.xml
  22. 13 10
      src/main/resources/config/application-locd.yml
  23. 8 1
      src/main/resources/config/application-run.yml
  24. 5 4
      src/main/resources/config/application-style.yml

+ 34 - 0
pom.xml

@@ -96,6 +96,40 @@
 	</dependencies>
 	
 	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-resources-plugin</artifactId>
+				<version>3.1.0</version>
+				<executions>
+					<execution>
+						<id>copyCore</id>
+						<phase>prepare-package</phase>
+						<goals>
+							<goal>copy-resources</goal>
+						</goals>
+						<configuration>
+							<resources>
+								<resource>
+									<directory>
+										${basedir}/../style24.core/target/classes
+									</directory>
+									<filtering>
+										false
+									</filtering>
+									<includes>
+										<include>**/*</include>
+									</includes>
+								</resource>
+							</resources>
+							<outputDirectory>
+								${basedir}/target/classes
+							</outputDirectory>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
 		<finalName>${project.name}</finalName>
 		<resources>
 			<resource>

+ 90 - 1
src/main/java/com/style24/batch/biz/dao/TsbCustomerDao.java

@@ -1,6 +1,7 @@
 package com.style24.batch.biz.dao;
 
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
 
@@ -38,7 +39,6 @@ public interface TsbCustomerDao {
 	 */
 	Collection<Customer> getDormentCustomerList(CustomerSearch customerSearch);
 
-
 	/**
 	 * 휴면회원보 저장
 	 *
@@ -136,4 +136,93 @@ public interface TsbCustomerDao {
 	 * @since  2021. 05. 06
 	 */
 	Collection<Customer> getMarketingAgreeNoticeTargetList(CustomerSearch customerSearch);
+
+	/**
+	 * 회원등급정책 목록
+	 *
+	 * @return Collection<CustGrade>
+	 * @author jsshin
+	 * @since  2021. 05. 07
+	 */
+	Collection<CustGrade> getCustGradePolicyList(CustGrade custGrade);
+
+	/**
+	 * 변경된 회원등급 이력 생성
+	 *
+	 * @return int - 결과
+	 * @author jsshin
+	 * @since  2021. 05. 07
+	 */
+	int createChangeCustGradeHst(CustGrade custGrade);
+
+	/**
+	 * 변경된등급 회원 이력 생성
+	 *
+	 * @return int - 결과
+	 * @author jsshin
+	 * @since  2021. 05. 07
+	 */
+	int createChangeCustomerHst(CustGrade custGrade);
+
+	/**
+	 * 회원등급 변경 처리
+	 *
+	 * @return int - 결과
+	 * @author jsshin
+	 * @since  2021. 05. 07
+	 */
+	int updateCustomerGrade(CustGrade custGrade);
+
+	/**
+	 * 넷퍼시메일솔루션 회원정보 Truncate
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	void truncateNetpathyMailCustomer();
+
+	/**
+	 * 넷퍼시메일솔루션 회원정보 생성
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	int createNetpathyMailCustomer();
+
+	/**
+	 * 넷퍼시메일솔루션 탈퇴/휴면회원정보 Truncate
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	void truncateNetpathyMailWithdrawalCustomer();
+
+	/**
+	 * 넷퍼시메일솔루션 탈퇴/휴면회원정보 생성
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	int createNetpathyMailWithdrawalCustomer();
+
+	/**
+	 * 넷퍼시메일솔루션 회원포인트정보 Truncate
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	void truncateNetpathyMailCustomerPoint();
+
+	/**
+	 * 넷퍼시메일솔루션 회원포인트정보 생성
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	int createNetpathyMailCustomerPoint();
+
+
+	/**
+	 * 생일자대상 목록
+	 *
+	 * @param  customerSearch - 사이트 코드
+	 * @return Collection<Customer> - 목록
+	 * @author jsshin
+	 * @since  2021. 05. 10
+	 */
+	Collection<Customer> getBirthDayTargetList(CustomerSearch customerSearch);
 }

+ 2 - 2
src/main/java/com/style24/batch/biz/dao/TsbDeliveryDao.java

@@ -510,7 +510,7 @@ public interface TsbDeliveryDao {
 	 * @author moon
 	 * @since 2021. 05. 06
 	 */
-	Collection<Delivery> getSoldoutOrderExcDtlNoList();
+	Collection<Delivery> getSoldoutOrderExcNoList();
 	
 	/**
 	 * 품절대상 출고예외 주문상세 목록 조회   
@@ -528,7 +528,7 @@ public interface TsbDeliveryDao {
 	 * @author moon
 	 * @since 2021. 05. 06
 	 */
-	Collection<Delivery> getSoldoutOrderRecallDtlNoList();
+	Collection<Delivery> getSoldoutOrderRecallNoList();
 	
 	/**
 	 * 품절대상 회수예외 주문상세 목록 조회   

+ 59 - 0
src/main/java/com/style24/batch/biz/job/customer/TsbGradeChangeJob.java

@@ -0,0 +1,59 @@
+package com.style24.batch.biz.job.customer;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbCustomerService;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.core.support.env.TscConstants;
+import com.style24.persistence.domain.CustGrade;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 회원(고객)등급 산정
+ *
+ * @author jsshin
+ * @since 2021.05.07
+*/
+@Component
+@Slf4j
+public class TsbGradeChangeJob extends TsbAbstractJob<CustGrade, GagaMap, GagaMap> {
+
+	@Autowired
+	private TsbCustomerService customerService;
+
+	private int custGradeHstCnt = 0;
+	private int custHstCnt = 0;
+	private int custGradeCnt = 0;
+
+	@Override
+	public CustGrade read() throws Exception {
+		CustGrade custGrade = new CustGrade();
+		custGrade.setSiteCd(TscConstants.Site.STYLE24.value());
+		custGrade.setRegNo(TsbConstants.REG_NO);
+		custGrade.setUpdNo(TsbConstants.REG_NO);
+		return custGrade;
+	}
+
+	@Override
+	public GagaMap process(CustGrade custGrade) throws Exception {
+		GagaMap result = customerService.saveCustomerGrade(custGrade);
+		return result;
+	}
+
+	@Override
+	public GagaMap write(GagaMap result) throws Exception {
+		custGradeHstCnt = result.getInt("custGradeHstCnt");
+		custHstCnt = result.getInt("custHstCnt");
+		custGradeCnt = result.getInt("custGradeCnt");
+		return null;
+	}
+
+	@Override
+	public void notify(GagaMap resultItem) throws Exception {
+		log.info("--------------------------------------------------------------------------------");
+		log.info("등급이력생성: {}건, 회원이력생성: {}건, 회원등급변경: {}건", custGradeHstCnt, custHstCnt, custGradeCnt);
+		log.info("--------------------------------------------------------------------------------");
+	}
+}

+ 53 - 0
src/main/java/com/style24/batch/biz/job/customer/TsbNetpathyMailJob.java

@@ -0,0 +1,53 @@
+package com.style24.batch.biz.job.customer;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbCustomerService;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 넷퍼시메일 솔루션에 회원정보 연동 처리
+ *
+ * @author gagamel
+ * @since 2021. 5. 10
+ */
+@Component
+@Slf4j
+public class TsbNetpathyMailJob extends TsbAbstractJob<String, String, String> {
+
+	@Autowired
+	private TsbCustomerService customerService;
+
+	@Override
+	public String read() throws Exception {
+		return "OK";
+	}
+
+	@Override
+	public String process(String result) throws Exception {
+		// 넷퍼시메일 회원정보 생성
+		customerService.createNetpathyMailCustomer();
+
+		// 넷퍼시메일 탈퇴/휴면회원정보 생성
+		customerService.createNetpathyMailWithdrawalCustomer();
+
+		// 넷퍼시메일 회원포인트 정보 생성
+		customerService.createNetpathyMailCustomerPoint();
+
+		return result;
+	}
+
+	@Override
+	public String write(String result) throws Exception {
+		return result;
+	}
+
+	@Override
+	public void notify(String result) throws Exception {
+		// Do nothing
+	}
+
+}

+ 2 - 2
src/main/java/com/style24/batch/biz/job/delivery/TsbSoldoutCancelJob.java

@@ -61,7 +61,7 @@ public class TsbSoldoutCancelJob extends TsbAbstractJob<Delivery, Delivery, Deli
 		}
 		
 		// 2. (출고예외 -- 재고부족)               품절 대상 조회     core 취소 서비스호출  처리완료 업데이트 
-		Collection<Delivery> excOrdnoList = deliveryService.getSoldoutOrderExcDtlNoList();
+		Collection<Delivery> excOrdnoList = deliveryService.getSoldoutOrderExcNoList();
 		try {
 			for(Delivery data2 : excOrdnoList) {
 				deliveryService.SoldoutCancel(data2,"E");
@@ -72,7 +72,7 @@ public class TsbSoldoutCancelJob extends TsbAbstractJob<Delivery, Delivery, Deli
 		}
 		
 		// 3. (회수예외 -- 확정전 품절, 확정전 불량 )   품절 대상 조회    core 취소 서비스호출   처리완료 업데이트 
-		Collection<Delivery> recallOrdnoList = deliveryService.getSoldoutOrderRecallDtlNoList();
+		Collection<Delivery> recallOrdnoList = deliveryService.getSoldoutOrderRecallNoList();
 		try {
 			for(Delivery data3 : recallOrdnoList) {
 				deliveryService.SoldoutCancel(data3,"R");

+ 65 - 0
src/main/java/com/style24/batch/biz/job/marketing/TsbBirthdayCouponNoticeJob.java

@@ -0,0 +1,65 @@
+package com.style24.batch.biz.job.marketing;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbCustomerService;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.core.support.env.TscConstants;
+import com.style24.persistence.domain.Customer;
+import com.style24.persistence.domain.CustomerSearch;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+
+/**
+ * 생일자 쿠폰 안내
+ *
+ * @author jsshin
+ * @since 2021.05.10
+ */
+@Component
+@Slf4j
+public class TsbBirthdayCouponNoticeJob extends TsbAbstractJob<Collection<Customer>, GagaMap, GagaMap> {
+
+	@Autowired
+	TsbCustomerService customerService;
+
+	private int succCnt = 0;
+	private int failCnt = 0;
+
+	@Override
+	public Collection<Customer> read() throws Exception {
+		CustomerSearch customerSearch = new CustomerSearch();
+		customerSearch.setSiteCd(TscConstants.Site.STYLE24.value());
+		return customerService.getBirthDayTargetList(customerSearch);
+	}
+
+	@Override
+	public GagaMap process(Collection<Customer> readItem) throws Exception {
+
+		for (Customer customer: readItem) {
+			try {
+				customer.setRegNo(TsbConstants.REG_NO);
+				customer.setUpdNo(TsbConstants.REG_NO);
+				customerService.sendBirthDayCouponNotice(customer);
+				succCnt++;
+			} catch (Exception e) {
+				failCnt++;
+			}
+
+		}
+		return null;
+	}
+
+	@Override
+	public GagaMap write(GagaMap convertedItem) throws Exception {
+		return null;
+	}
+
+	@Override
+	public void notify(GagaMap resultItem) throws Exception {
+		super.printResult(succCnt, failCnt);
+	}
+}

+ 129 - 7
src/main/java/com/style24/batch/biz/service/TsbCustomerService.java

@@ -2,23 +2,25 @@ package com.style24.batch.biz.service;
 
 import java.util.Collection;
 
-import com.gagaframework.web.parameter.GagaMap;
-import com.style24.batch.support.env.TsbConstants;
-import com.style24.core.biz.service.TscCustomerService;
-import com.style24.core.support.env.TscConstants;
-import com.style24.core.support.util.CryptoUtils;
-import com.style24.persistence.domain.CustContactHst;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.style24.batch.biz.dao.TsbCustomerDao;
+import com.style24.batch.support.env.TsbConstants;
+import com.style24.core.biz.service.TscCustomerService;
+import com.style24.core.support.env.TscConstants;
+import com.style24.core.support.util.CryptoUtils;
+import com.style24.persistence.domain.CustContactHst;
+import com.style24.persistence.domain.CustGrade;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
+
 /**
  * 회원(고객) Service
  *
@@ -35,7 +37,6 @@ public class TsbCustomerService {
 	@Autowired
 	private TscCustomerService coreCustomerService;
 
-
 	/**
 	 * 휴면전환예정 메일 발송 대상
 	 *
@@ -284,4 +285,125 @@ public class TsbCustomerService {
 		result.setInt("failCnt", failCnt);
 		return result;
 	}
+
+	/**
+	 * 회원등급 변경
+	 *
+	 * @param custGrade - 정보
+	 * @return GagaMap - 성공/실패 카운트
+	 * @author jsshin
+	 * @since 2021. 05. 06
+	 */
+	@Transactional("shopTxnManager")
+	public GagaMap saveCustomerGrade(CustGrade custGrade) {
+		GagaMap result = new GagaMap();
+		Collection<CustGrade> custGradeCollection = customerDao.getCustGradePolicyList(custGrade);
+		int custGradeHstCnt = 0;
+
+		// 1. 등급산정
+		for (CustGrade grade : custGradeCollection) {
+			grade.setSiteCd(custGrade.getSiteCd());
+			grade.setRegNo(custGrade.getRegNo());
+			custGradeHstCnt += customerDao.createChangeCustGradeHst(grade);
+		}
+
+		// 2. 회원이력 생성
+		int custHstCnt = customerDao.createChangeCustomerHst(custGrade);
+
+		// 3. 회원등급 변경
+		int custGradeCnt = customerDao.updateCustomerGrade(custGrade);
+
+		result.setInt("custGradeHstCnt", custGradeHstCnt);
+		result.setInt("custHstCnt", custHstCnt);
+		result.setInt("custGradeCnt", custGradeCnt);
+
+		return result;
+	}
+
+	/**
+	 * 넷퍼시메일솔루션으로 회원정보 생성
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	@Transactional("shopTxnManager")
+	public void createNetpathyMailCustomer() {
+		// 회원정보 Truncate
+		customerDao.truncateNetpathyMailCustomer();
+
+		// 회원정보 생성
+		int result = customerDao.createNetpathyMailCustomer();
+
+		log.info("1.넷퍼시메일솔루션으로 회원정보 생성 ({}건) : OK", result);
+	}
+
+	/**
+	 * 넷퍼시메일솔루션으로 탈퇴/휴면회원정보 생성
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	@Transactional("shopTxnManager")
+	public void createNetpathyMailWithdrawalCustomer() {
+		// 회원정보 Truncate
+		customerDao.truncateNetpathyMailWithdrawalCustomer();
+
+		// 회원정보 생성
+		int result = customerDao.createNetpathyMailWithdrawalCustomer();
+
+		log.info("2.넷퍼시메일솔루션으로 탈퇴/휴면회원정보 생성 ({}건) : OK", result);
+	}
+
+	/**
+	 * 넷퍼시메일솔루션으로 회원포인트정보 생성
+	 * 		전일자 변경된 포인트가 있는 회원에 대해서만
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+	@Transactional("shopTxnManager")
+	public void createNetpathyMailCustomerPoint() {
+		// 회원정보 Truncate
+		customerDao.truncateNetpathyMailCustomerPoint();
+
+		// 회원정보 생성
+		int result = customerDao.createNetpathyMailCustomerPoint();
+
+		log.info("3.넷퍼시메일솔루션으로 회원포인트정보 생성 ({}건) : OK", result);
+	}
+
+	/**
+	 * 생일쿠폰안내대상 목록
+	 *
+	 * @param customerSearch - 사이트 코드
+	 * @return Collection<Customer> - 목록
+	 * @author jsshin
+	 * @since  2021. 05. 10
+	 */
+	public Collection<Customer> getBirthDayTargetList(CustomerSearch customerSearch) {
+		return customerDao.getBirthDayTargetList(customerSearch);
+	}
+
+
+	/**
+	 * 생일쿠폰 안내
+	 *
+	 * @param customer - 사이트 코드
+	 * @author jsshin
+	 * @since  2021. 05. 10
+	 */
+	@Transactional("shopTxnManager")
+	public void sendBirthDayCouponNotice(Customer customer) {
+		// TODO: 이메일 발송 모듈 붙어야 함 2021.05.10 jsshin
+		// 이메일 발송
+		if (StringUtils.isNotBlank(customer.getEmail())) {
+
+		}
+		CustContactHst custContactHst = new CustContactHst();
+		custContactHst.setContactType(TscConstants.ContactType.BIRTH_COUPON_NOTICE.value());
+		custContactHst.setContactMethod(TscConstants.ContactMethod.EMAIL.value());
+		custContactHst.setContactContents("생일쿠폰 다운로드 안내");
+		custContactHst.setSenderNo(TsbConstants.REG_NO);
+		custContactHst.setReceiverNo(customer.getCustNo());
+		custContactHst.setRegNo(TsbConstants.REG_NO);
+		//접촉 이력 저장
+		coreCustomerService.createCustomerContactHistory(custContactHst);
+	}
 }

+ 4 - 4
src/main/java/com/style24/batch/biz/service/TsbDeliveryService.java

@@ -1016,9 +1016,9 @@ public class TsbDeliveryService {
 	 * @author moon
 	 * @since  2021. 05. 06
 	 */
-	public Collection<Delivery> getSoldoutOrderExcDtlNoList() {
+	public Collection<Delivery> getSoldoutOrderExcNoList() {
 
-		Collection<Delivery> list = deliveryDao.getSoldoutOrderExcDtlNoList();
+		Collection<Delivery> list = deliveryDao.getSoldoutOrderExcNoList();
 		return list ;
 	}
 	
@@ -1029,9 +1029,9 @@ public class TsbDeliveryService {
 	 * @author moon
 	 * @since  2021. 05. 06
 	 */
-	public Collection<Delivery> getSoldoutOrderRecallDtlNoList() {
+	public Collection<Delivery> getSoldoutOrderRecallNoList() {
 
-		Collection<Delivery> list = deliveryDao.getSoldoutOrderRecallDtlNoList();
+		Collection<Delivery> list = deliveryDao.getSoldoutOrderRecallNoList();
 		return list ;
 	}
 	

+ 23 - 2
src/main/java/com/style24/batch/biz/service/TsbGoodsService.java

@@ -339,17 +339,38 @@ public class TsbGoodsService {
 	@Transactional("shopTxnManager")
 	public void saveGoodsSafeNo() {
 
-		// 1. 대상 상품 조회
+//		// 1. 대상 상품 조회
+//		Collection<GoodsSafeNo> goodsSafeNoList = goodsDao.getGoodsSafeNoList();
+//		// 2. 인증테이블 적용
+//		for (GoodsSafeNo goodsSafeNo : goodsSafeNoList) {
+//			try {
+//				GagaMap result = safetyKoreaApi.getKoreaCertifyNo(goodsSafeNo.getGoodsNum()); // 품번으로 처리
+//				if (result != null || !StringUtil.isNullOrEmpty(result.get("certNum").toString())) {
+//					goodsSafeNo.setCertDt(result.get("certDt").toString());
+//					goodsSafeNo.setCertNum(result.get("certNum").toString());
+//					goodsSafeNo.setCertDiv(result.get("certDiv").toString());
+//					goodsSafeNo.setCertState(result.get("certState").toString());
+//					goodsSafeNo.setRegNo(TsbConstants.REG_NO);
+//					goodsSafeNo.setUpdNo(TsbConstants.REG_NO);
+//					goodsDao.saveGoodsSafeNo(goodsSafeNo);
+//				}
+//			} catch (Exception e) {
+//				// do nothing
+//			}
+//		}
+
+		// 1. 대상 상품 조회 - 인증번호가 있는 상품 조회(tb_goods_safe 변경)
 		Collection<GoodsSafeNo> goodsSafeNoList = goodsDao.getGoodsSafeNoList();
 		// 2. 인증테이블 적용
 		for (GoodsSafeNo goodsSafeNo : goodsSafeNoList) {
 			try {
-				GagaMap result = safetyKoreaApi.getKoreaCertifyNo(goodsSafeNo.getGoodsNum()); // 품번으로 처리
+				GagaMap result = safetyKoreaApi.getKoreaCertifyDetail(goodsSafeNo.getCertNum());
 				if (result != null || !StringUtil.isNullOrEmpty(result.get("certNum").toString())) {
 					goodsSafeNo.setCertDt(result.get("certDt").toString());
 					goodsSafeNo.setCertNum(result.get("certNum").toString());
 					goodsSafeNo.setCertDiv(result.get("certDiv").toString());
 					goodsSafeNo.setCertState(result.get("certState").toString());
+					goodsSafeNo.setCertOrganName(result.get("certOrganName").toString());
 					goodsSafeNo.setRegNo(TsbConstants.REG_NO);
 					goodsSafeNo.setUpdNo(TsbConstants.REG_NO);
 					goodsDao.saveGoodsSafeNo(goodsSafeNo);

+ 47 - 11
src/main/java/com/style24/batch/biz/task/TsbCustomerTask.java

@@ -1,17 +1,19 @@
 package com.style24.batch.biz.task;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
 
-import com.style24.batch.biz.job.customer.TsbDormantTransformJob;
 import com.style24.batch.biz.job.customer.TsbDormantScheduleJob;
+import com.style24.batch.biz.job.customer.TsbDormantTransformJob;
+import com.style24.batch.biz.job.customer.TsbGradeChangeJob;
 import com.style24.batch.biz.job.customer.TsbMarketingAgreementNoticeJob;
+import com.style24.batch.biz.job.customer.TsbNetpathyMailJob;
 import com.style24.batch.biz.job.customer.TsbPrivacyPolicyNoticeJob;
 import com.style24.batch.biz.job.customer.TsbSecedeProcessJob;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
 
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 회원(고객) Task
@@ -37,6 +39,12 @@ public class TsbCustomerTask {
 	@Autowired
 	TsbMarketingAgreementNoticeJob marketingAgreementNoticeJob;
 
+	@Autowired
+	TsbGradeChangeJob gradeChangeJob;
+
+	@Autowired
+	TsbNetpathyMailJob netpathyJob;
+
 	/**
 	 * 휴면전환 예정 대상 메일 발송
 	 *
@@ -44,7 +52,7 @@ public class TsbCustomerTask {
 	 * @author jsshin
 	 * @since 2021. 03. 08
 	 */
-	//@Scheduled(cron = "${cron.customer.dormant.schedule}")
+//	@Scheduled(cron = "${cron.customer.dormant.schedule}")
 //	@Scheduled(fixedDelay=360000)
 	@Async
 	public void dormantScheduleJob() throws Exception {
@@ -58,7 +66,7 @@ public class TsbCustomerTask {
 	 * @author jsshin
 	 * @since 2021. 03. 08
 	 */
-	//@Scheduled(cron = "${cron.customer.dormant.transform}")
+//	@Scheduled(cron = "${cron.customer.dormant.transform}")
 //	@Scheduled(fixedDelay=360000)
 	@Async
 	public void dormantTransformJob() throws Exception {
@@ -72,7 +80,7 @@ public class TsbCustomerTask {
 	 * @author jsshin
 	 * @since 2021. 03. 08
 	 */
-	//@Scheduled(cron = "${cron.customer.secede.process}")
+//	@Scheduled(cron = "${cron.customer.secede.process}")
 //	@Scheduled(fixedDelay=360000)
 	@Async
 	public void secedeProcessJob() throws Exception {
@@ -86,7 +94,7 @@ public class TsbCustomerTask {
 	 * @author jsshin
 	 * @since 2021. 05. 06
 	 */
-	//@Scheduled(cron = "${cron.customer.privacy.policy.notice}")
+//	@Scheduled(cron = "${cron.customer.privacy.policy.notice}")
 //	@Scheduled(fixedDelay=360000)
 	@Async
 	public void privacyPolicyNoticeJob() throws Exception {
@@ -100,10 +108,38 @@ public class TsbCustomerTask {
 	 * @author jsshin
 	 * @since 2021. 05. 06
 	 */
-	//@Scheduled(cron = "${cron.customer.marketing.agreement.notice}")
+//	@Scheduled(cron = "${cron.customer.marketing.agreement.notice}")
 //	@Scheduled(fixedDelay=360000)
 	@Async
 	public void marketingAgreementNoticeJob() throws Exception {
 		marketingAgreementNoticeJob.runById("cron.customer.marketing.agreement.notice");
 	}
+
+	/**
+	 * 회원등급 변경
+	 *
+	 * @throws Exception - 예외처리
+	 * @author jsshin
+	 * @since 2021. 05. 06
+	 */
+//	@Scheduled(cron = "${cron.customer.grade.change}")
+//	@Scheduled(fixedDelay=360000)
+	@Async
+	public void gradeChangeJob() throws Exception {
+		gradeChangeJob.runById("cron.customer.grade.change");
+	}
+
+	/**
+	 * 넷퍼시메일솔루션에 회원정보 연동
+	 * @throws Exception - 예외처리
+	 * @author gagamel
+	 * @since 2021. 5. 10
+	 */
+//	@Scheduled(cron = "${cron.customer.netpathy.sync}")
+//	@Scheduled(fixedDelay = 360000)
+	@Async
+	public void syncronizeNetpathyMailCustomerInfo() throws Exception {
+		netpathyJob.runById("cron.customer.netpathy.sync");
+	}
+
 }

+ 1 - 1
src/main/java/com/style24/batch/biz/task/TsbDeliveryTask.java

@@ -120,7 +120,7 @@ public class TsbDeliveryTask {
 	 * @throws Exception
 	 */
 	//@Scheduled(cron = "${cron.delivery.tsbDeliveryOrderJob}")
-	//@Scheduled(fixedDelay = 3500000)
+//	@Scheduled(fixedDelay = 3500000)
 	@Async
 	public void tsbDeliveryOrderJob() throws Exception {
 		deliveryOrderJob.run("cron.delivery.tsbDeliveryOrderJob");

+ 1 - 1
src/main/java/com/style24/batch/biz/task/TsbGoodsTask.java

@@ -170,7 +170,7 @@ public class TsbGoodsTask {
 	}
 
 	/**
-	 * 영유아상품 인증번호 수신 : 일배치 - 매일 3시 5분
+	 * 영유아상품 인증번호 수신 : 일회성배치
 	 *
 	 * @throws Exception
 	 */

+ 25 - 2
src/main/java/com/style24/batch/biz/task/TsbMarketingTask.java

@@ -1,5 +1,6 @@
 package com.style24.batch.biz.task;
 
+import com.style24.batch.biz.job.marketing.TsbBirthdayCouponNoticeJob;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -29,6 +30,11 @@ public class TsbMarketingTask {
 	
 	@Autowired
 	private TsbExpirePointJob expirePointJob;
+
+	@Autowired
+	private TsbBirthdayCouponNoticeJob birthdayCouponNoticeJob;
+
+
 	/**
 	 * 자동구매확정 포인트 지급
 	 *
@@ -36,12 +42,27 @@ public class TsbMarketingTask {
 	 * @author jsshin
 	 * @since 2021. 04. 23
 	 */
-	//@Scheduled(cron = "${cron.marketing.auto.buy.confirm}")
+	@Scheduled(cron = "${cron.marketing.auto.buy.confirm}")
 	// @Scheduled(fixedDelay=360000)
 	@Async
 	public void autoBuyConfirmJob() throws Exception {
 		autoBuyConfirmJob.runById("cron.marketing.auto.buy.confirm");
 	}
+
+
+	/**
+	 * 생일쿠폰 다운로드 안내
+	 *
+	 * @throws Exception - 예외처리
+	 * @author jsshin
+	 * @since 2021. 05. 10
+	 */
+	@Scheduled(cron = "${cron.marketing.birthday.coupon.notice}")
+//	@Scheduled(fixedDelay=360000)
+	@Async
+	public void birthdayCouponNoticeJob() throws Exception {
+		birthdayCouponNoticeJob.runById("cron.marketing.birthday.coupon.notice");
+	}
 	
 	/**
 	 * 포인트 소멸처리
@@ -51,7 +72,7 @@ public class TsbMarketingTask {
 	 * @since 2021. 04. 26
 	 */
 	//@Scheduled(cron = "${cron.marketing.expire.point}")
-	//@Scheduled(fixedDelay=360000)
+//	@Scheduled(fixedDelay=360000)
 	@Async
 	public void expirePointJob() throws Exception {
 		expirePointJob.runById("cron.marketing.expire.point");
@@ -70,4 +91,6 @@ public class TsbMarketingTask {
 	public void expireCartExpirationJob() throws Exception {
 		cartExpirationJob.runById("cron.marketing.cart.expiration");
 	}
+
+
 }

+ 2 - 1
src/main/java/com/style24/batch/biz/task/TsbSocialTask.java

@@ -2,6 +2,7 @@ package com.style24.batch.biz.task;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import com.style24.batch.biz.job.social.TsbSocialGoodsJob;
@@ -55,7 +56,7 @@ public class TsbSocialTask {
 	 *
 	 * @throws Exception
 	 */
-	//@Scheduled(cron = "${cron.social.socialGoodsJob}") // * 0 15 10 * * ?" : 아무 요일, 매월, 매일 10:15:00 // 매시 5분 0 5 * * * *
+	@Scheduled(cron = "${cron.social.socialGoodsJob}") // * 0 15 10 * * ?" : 아무 요일, 매월, 매일 10:15:00 // 매시 5분 0 5 * * * *
 	//@Scheduled(fixedDelay=360000)
 	@Async
 	public void tsbSocialGoodsJob() throws Exception {

+ 11 - 0
src/main/java/com/style24/persistence/domain/GoodsSafeNo.java

@@ -14,11 +14,22 @@ import lombok.Data;
 @Data
 public class GoodsSafeNo extends TscBaseDomain {
 
+//	private String goodsCd;
+//	private String goodsNum;
+//	private String certNum;
+//	private String certState;
+//	private String certDiv;
+//	private String certDt;
+
 	private String goodsCd;
 	private String goodsNum;
+	private String certTargetGb;
+	private String certFormGb;
+	private String certType;
 	private String certNum;
 	private String certState;
 	private String certDiv;
+	private String certOrganName;
 	private String certDt;
 
 }

+ 299 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsbCustomer.xml

@@ -304,4 +304,303 @@
 		AND     C.SITE_CD = #{siteCd}
 	</select>
 
+	<!--회원등급정책 목록-->
+	<select id="getCustGradePolicyList" parameterType="CustGrade" resultType="CustGrade">
+		/*TsbCustomerDao.getCustGradePolicyList*/
+		SELECT GRADE_CD      AS GRADE_ACD
+		     , MIN_BUY_AMT
+		     , MIN_BUY_CNT
+		     , BUY_EXCEPT_AMT
+		     , CAL_MONTHS
+		FROM   TB_CUST_GRADE_POLICY
+		WHERE  USE_YN = 'Y'
+		AND    SITE_CD = #{siteCd}
+		ORDER BY GRADE_CD
+	</select>
+
+	<!--변경된 회원등급 이력 생성-->
+	<insert id="createChangeCustGradeHst" parameterType="CustGrade" timeout="100">
+		/*TsbCustomerDao.createChangeCustGradeHst*/
+		INSERT INTO TB_CUST_GRADE_HST (
+		       CUST_NO
+		     , APPLY_YMD
+		     , GRADE_BCD
+		     , GRADE_ACD
+		     , REAL_ORD_AMT
+		     , ORD_CNT
+		     , REG_NO
+		     , REG_DT
+		)
+		SELECT TG.CUST_NO
+		     , DATE_FORMAT(NOW(), '%Y%m%d') AS APPLY_YMD
+		     , TG.CUST_GRADE                AS GRADE_BCD
+		     , #{gradeAcd}                  AS GRADE_ACD
+		     , TG.SUM_REAL_ORD_AMT          AS REAL_ORD_AMT
+		     , TG.ORD_NO_CNT                AS ORD_CNT
+		     , #{regNo}                     AS REG_NO
+		     , NOW()                        AS REG_DT
+		FROM (
+		     SELECT C.CUST_NO
+		          , COUNT(DISTINCT ORD.ORD_NO)      AS ORD_NO_CNT
+		          , IFNULL(SUM(ORD.SUM_REAL_ORD_AMT), 0) AS SUM_REAL_ORD_AMT
+		          , MAX(C.CUST_GRADE)               AS CUST_GRADE
+		     FROM TB_CUSTOMER C
+		     LEFT JOIN (
+		                SELECT O.CUST_NO
+		                     , O.ORD_NO
+		                     , SUM(OD.REAL_ORD_AMT + OD.GFCD_USE_AMT) AS SUM_REAL_ORD_AMT
+		                FROM   TB_ORDER O
+		                INNER JOIN
+		                       TB_ORDER_DETAIL OD
+		                WHERE  O.ORD_NO = OD.ORD_NO
+		                AND    OD.ORD_DTL_STAT = 'G013_70' /*구매확정*/
+		                AND    O.ORD_DT >= DATE_ADD(DATE_ADD(LAST_DAY(NOW()), INTERVAL 1 DAY), INTERVAL -#{calMonths} MONTH)
+		                AND    O.ORD_DT <![CDATA[<]]> DATE_ADD(LAST_DAY(NOW()), INTERVAL 1 DAY) /*익월 1일*/
+		                GROUP BY O.ORD_NO, O.CUST_NO
+		                HAVING SUM(OD.REAL_ORD_AMT + OD.GFCD_USE_AMT) >= #{buyExceptAmt}
+		               ) ORD
+		     ON    C.CUST_NO = ORD.CUST_NO
+		     WHERE C.CUST_STAT = 'G104_10'
+		     AND   C.CUST_NO != 0
+		     GROUP BY C.CUST_NO
+		     ) TG
+		WHERE (TG.ORD_NO_CNT >= #{minBuyCnt} OR TG.SUM_REAL_ORD_AMT >= #{minBuyAmt})
+		AND   NOT EXISTS (
+		                  SELECT 1
+		                  FROM  TB_CUST_GRADE_HST CGH
+		                  WHERE CGH.CUST_NO = TG.CUST_NO
+		                  AND   CGH.APPLY_YMD = DATE_FORMAT(NOW(), '%Y%m%d')
+		                 )
+	</insert>
+
+	<!--변경된등급 회원 이력 생성-->
+	<insert id="createChangeCustomerHst" parameterType="CustGrade" timeout="100">
+		/*TsbCustomerDao.createChangeCustomerHst*/
+		INSERT INTO TB_CUSTOMER_HST (
+		       CUST_NO
+		     , CUST_ID
+		     , CUST_NM
+		     , PASSWD
+		     , BIRTH_YMD
+		     , SEX_GB
+		     , CELL_PHNNO
+		     , APP_AGREE_YN
+		     , APP_AGREE_DT
+		     , SMS_AGREE_YN
+		     , SMS_AGREE_DT
+		     , EMAIL
+		     , EMAIL_AGREE_YN
+		     , EMAIL_AGREE_DT
+		     , MK_AGREE_YN
+		     , MK_AGREE_DT
+		     , HOME_ZIPCODE
+		     , HOME_BASE_ADDR
+		     , HOME_DTL_ADDR
+		     , SITE_CD
+		     , FRONT_GB
+		     , AF_LINK_CD
+		     , CUST_GB
+		     , CUST_GRADE
+		     , JOIN_DT
+		     , FOREIGNER_YN
+		     , CUST_STAT
+		     , PASSWD_CHG_DT
+		     , TEMP_PASSWD_YN
+		     , LOGIN_LDT
+		     , CI
+		     , AUTH_DT
+		     , SNS_TYPE
+		     , MANAGED_RSN
+		     , MANAGED_DTL_RSN
+		     , MANAGED_DT
+		     , SECEDE_RSN
+		     , SECEDE_DTL_RSN
+		     , SECEDE_DT
+		     , RM_DORMANT_DT
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT CUST_NO
+		     , CUST_ID
+		     , CUST_NM
+		     , PASSWD
+		     , BIRTH_YMD
+		     , SEX_GB
+		     , CELL_PHNNO
+		     , APP_AGREE_YN
+		     , APP_AGREE_DT
+		     , SMS_AGREE_YN
+		     , SMS_AGREE_DT
+		     , EMAIL
+		     , EMAIL_AGREE_YN
+		     , EMAIL_AGREE_DT
+		     , MK_AGREE_YN
+		     , MK_AGREE_DT
+		     , HOME_ZIPCODE
+		     , HOME_BASE_ADDR
+		     , HOME_DTL_ADDR
+		     , SITE_CD
+		     , FRONT_GB
+		     , AF_LINK_CD
+		     , CUST_GB
+		     , CUST_GRADE
+		     , JOIN_DT
+		     , FOREIGNER_YN
+		     , CUST_STAT
+		     , PASSWD_CHG_DT
+		     , TEMP_PASSWD_YN
+		     , LOGIN_LDT
+		     , CI
+		     , AUTH_DT
+		     , SNS_TYPE
+		     , MANAGED_RSN
+		     , MANAGED_DTL_RSN
+		     , MANAGED_DT
+		     , SECEDE_RSN
+		     , SECEDE_DTL_RSN
+		     , SECEDE_DT
+		     , RM_DORMANT_DT
+		     , #{regNo}   AS REG_NO
+		     , NOW()      AS REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		FROM   TB_CUSTOMER
+		WHERE  CUST_NO IN (
+		                   SELECT CGH.CUST_NO
+		                   FROM   TB_CUST_GRADE_HST CGH
+		                   WHERE  CGH.APPLY_YMD = DATE_FORMAT(NOW(), '%Y%m%d')
+		                   )
+	</insert>
+
+	<!--회원등급 변경 처리-->
+	<update id="updateCustomerGrade" parameterType="CustGrade" timeout="100">
+		/*TsbCustomerDao.updateCustomerGrade*/
+		UPDATE TB_CUSTOMER C
+		INNER JOIN
+		       TB_CUST_GRADE_HST CGH
+		ON     C.CUST_NO = CGH.CUST_NO
+		SET    CUST_GRADE = CGH.GRADE_ACD
+		     , UPD_DT = NOW()
+		     , UPD_NO = #{updNo}
+		WHERE  CGH.APPLY_YMD = DATE_FORMAT(NOW(), '%Y%m%d')
+	</update>
+	
+	<!-- 넷퍼시메일솔루션 회원정보 Truncate -->
+	<delete id="truncateNetpathyMailCustomer">
+		/* TsbCustomerDao.truncateNetpathyMailCustomer */
+		TRUNCATE TABLE NETPATHY_MEMBER
+	</delete>
+	
+	<!-- 넷퍼시메일솔루션 회원정보 생성 -->
+	<insert id="createNetpathyMailCustomer" timeout="600">
+		/* TsbCustomerDao.createNetpathyMailCustomer */
+		INSERT INTO NETPATHY_MEMBER (
+		       CUST_NO
+		     , CUST_ID
+		     , CUST_NM
+		     , BIRTH_YMD
+		     , EMAIL
+		     , EMAIL_AGREE_YN
+		     , SEX_GB
+		     , ZIPCODE
+		     , JOIN_DT
+		     , UPD_DT
+		)
+		SELECT C.CUST_NO                                 /*회원GUID(=회원번호)*/
+		     , C.CUST_ID                                 /*로그인ID(=회원ID)*/
+		     , C.CUST_NM                                 /*회원명(암호화된값)*/
+		     , C.BIRTH_YMD                               /*생년월일(암호화된값)*/
+		     , C.EMAIL                                   /*이메일(암호화된값)*/
+		     , C.EMAIL_AGREE_YN                          /*메일수신여부*/
+		     , C.SEX_GB                                  /*성별(암호화된값)*/
+		     , CDA.RECIP_ZIPCODE              AS ZIPCODE /*우편번호*/
+		     , IFNULL(C.JOIN_DT,'1900-01-01') AS JOIN_DT /*가입일시*/
+		     , C.UPD_DT                                  /*수정일시*/
+		FROM   TB_CUSTOMER C
+		LEFT OUTER JOIN TB_CUST_DELIVERY_ADDR CDA ON C.CUST_NO = CDA.CUST_NO
+		                                         AND CDA.DEL_YN = 'N' /*삭제안된넘*/
+		                                         AND CDA.DEFAULT_YN = 'Y' /*기본배송지*/
+		WHERE  CUST_STAT = 'G104_10' /*활동회원*/
+	</insert>
+	
+	<!-- 넷퍼시메일솔루션 탈퇴/휴면회원정보 Truncate -->
+	<delete id="truncateNetpathyMailWithdrawalCustomer">
+		/* TsbCustomerDao.truncateNetpathyMailWithdrawalCustomer */
+		TRUNCATE TABLE NETPATHY_WITHDRAWAL
+	</delete>
+	
+	<!-- 넷퍼시메일솔루션 탈퇴/휴면회원정보 생성 -->
+	<insert id="createNetpathyMailWithdrawalCustomer" timeout="600">
+		/* TsbCustomerDao.createNetpathyMailWithdrawalCustomer */
+		INSERT INTO NETPATHY_WITHDRAWAL (
+		       CUST_NO
+		     , CUST_ID
+		     , CUST_NM
+		     , JOIN_DT
+		     , REG_DT
+		)
+		SELECT CUST_NO                              /*회원GUID(=회원번호)*/
+		     , CUST_ID                              /*로그인ID(=회원ID)*/
+		     , CUST_NM                              /*회원명(암호화된값)*/
+		     , IFNULL(JOIN_DT,SECEDE_DT) AS JOIN_DT /*가입일시*/
+		     , SECEDE_DT                 AS REG_DT  /*등록일시*/
+		FROM   TB_SECEDE_CUST
+		UNION ALL
+		SELECT CUST_NO              /*회원GUID(=회원번호)*/
+		     , CUST_ID              /*로그인ID(=회원ID)*/
+		     , CUST_NM              /*회원명(암호화된값)*/
+		     , JOIN_DT              /*가입일시*/
+		     , DORMANT_DT AS REG_DT /*등록일시*/
+		FROM   TB_DORMANT_CUST
+	</insert>
+	
+	<!-- 넷퍼시메일솔루션 회원포인트정보 Truncate -->
+	<delete id="truncateNetpathyMailCustomerPoint">
+		/* TsbCustomerDao.truncateNetpathyMailCustomerPoint */
+		TRUNCATE TABLE NETPATHY_POINT
+	</delete>
+	
+	<!-- 넷퍼시메일솔루션 회원포인트정보 생성 -->
+	<insert id="createNetpathyMailCustomerPoint" timeout="600">
+		/* TsbCustomerDao.createNetpathyMailCustomerPoint */
+		INSERT INTO NETPATHY_POINT (
+		       CUST_NO
+		     , CUST_ID
+		     , RM_PNT_AMT
+		     , PREV_DT
+		)
+		SELECT CP.CUST_NO                                                                       /*회원번호*/
+		     , C.CUST_ID                                                                        /*회원ID*/
+		     , SUM(CASE WHEN CP.EXP_CMP_DT IS NULL THEN CP.RM_PNT_AMT ELSE 0 END) AS RM_PNT_AMT /*남은포인트금액*/
+		     , DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)                          AS PREV_DT    /*전일*/
+		FROM   TB_CUST_POINT CP
+		     , TB_CUSTOMER C
+		WHERE  CP.CUST_NO = C.CUST_NO
+		AND    CP.CUST_NO IN (SELECT CUST_NO
+		                      FROM   TB_CUST_POINT
+		                      WHERE  UPD_DT <![CDATA[>=]]> DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
+		                      AND    UPD_DT <![CDATA[<]]> CURRENT_DATE()
+		                     )
+		GROUP  BY CP.CUST_NO
+	</insert>
+
+	<!--생일쿠폰 다운로드 안내 대상자-->
+	<select id="getBirthDayTargetList" parameterType="CustomerSearch" resultType="Customer">
+		/*TsbCustomerDao.getBirthDayTargetList*/
+		SELECT C.CUST_NO
+		     , C.CUST_ID
+		     , C.EMAIL
+		     , BB.BIRTH_YMD
+		FROM   TB_CUSTOMER C
+		INNER JOIN
+		       TB_BATCH_BIRTH BB
+		ON     C.CUST_NO = BB.CUST_NO
+		WHERE  C.CUST_STAT = 'G104_10'
+		AND    C.SITE_CD = #{siteCd}
+		AND    SUBSTR(BB.BIRTH_YMD, 5,8) > DATE_FORMAT(DATE_ADD(LAST_DAY(NOW()), INTERVAL -1 MONTH ), '%m%d')
+		AND    SUBSTR(BB.BIRTH_YMD, 5,8) <![CDATA[<]]> DATE_FORMAT(DATE_ADD(LAST_DAY(NOW()), INTERVAL 1 DAY), '%m%d')
+	</select>
+
 </mapper>

+ 9 - 9
src/main/java/com/style24/persistence/mybatis/shop/TsbDelivery.xml

@@ -117,7 +117,7 @@
 			  #{recallexceptionitemno}
 			, #{recallexceptionno}
 			, #{deliveryorderitemno}
-			, CASE WHEN #{orderdtlno} IS NULL THEN (SELECT ORD_DTL_NO FROM TB_ORDER_DETAIL_ITEM WHERE ORD_NO = #{orderno} AND OPT_CD = #{skucode} ) ELSE #{orderdtlno} END
+			, CASE WHEN #{orderdtlno} IS NULL THEN (SELECT D.ORD_DTL_NO FROM TB_ORDER_DETAIL_ITEM D WHERE D.ORD_NO = #{orderno} AND D.OPT_CD = #{skucode} ) ELSE #{orderdtlno} END
 			, #{productno}
 			, #{productcode}
 			, #{productname}
@@ -251,7 +251,7 @@
 				, #{exceptionqty} 
 				, #{reasoncd}
 				, #{orderno}
-				, CASE WHEN #{orderdtlno} IS NULL THEN (SELECT ORD_DTL_NO FROM TB_ORDER_DETAIL_ITEM WHERE ORD_NO = #{orderno} AND OPT_CD = #{skucode} ) ELSE #{orderdtlno} END 
+				, CASE WHEN #{orderdtlno} IS NULL THEN (SELECT D.ORD_DTL_NO FROM TB_ORDER_DETAIL_ITEM D WHERE D.ORD_NO = #{orderno} AND D.OPT_CD = #{skucode} ) ELSE #{orderdtlno} END 
 				, #{giftyn}
 				, #{productno}
 				, #{productcode}
@@ -555,7 +555,7 @@
 			   AND B.ORD_EXCH_GB   = 'O'       -- 주문
 			   AND A.ORD_DT >= DATE_ADD(DATE_FORMAT(CONCAT(STR_TO_DATE(NOW(), '%Y-%m-%d'),' 10:00:00'),'%Y%m%d%H%i%S') , INTERVAL -1 DAY)
 			   AND NOT EXISTS (SELECT '1' FROM TB_GOODS_RES_SELL WHERE GOODS_CD = B.GOODS_CD AND USE_YN ='Y') 
-			--   AND A.REG_NO = 100025
+			   -- AND A.REG_NO = 100025
 			 GROUP BY A.ORD_NO
 			
 			UNION ALL /* 교환  상품 */
@@ -572,7 +572,7 @@
 			   AND D.CHG_STAT     IN ('G685_30','G685_32')
 			   AND DATE_ADD(DATE_FORMAT(CONCAT(STR_TO_DATE(NOW(), '%Y-%m-%d'),' 10:00:00'),'%Y%m%d%H%i%S') , INTERVAL -1 DAY) 
 			       <= CASE WHEN E.WD_BF_SEND_YN = 'Y' THEN B.REG_DT ELSE D.COMPLETE_DT END
-			--   AND A.REG_NO = 100025
+			   -- AND A.REG_NO = 100025
 			 GROUP BY A.ORD_NO
 			 
 			UNION ALL  
@@ -587,7 +587,7 @@
 			   AND D.DELV_RES_DT  <= NOW()
 			   AND DATE_ADD(DATE_FORMAT(CONCAT(STR_TO_DATE(NOW(), '%Y-%m-%d'),' 10:00:00'),'%Y%m%d%H%i%S') , INTERVAL -1 DAY)
 			       < CASE WHEN  A.ORD_DT < D.DELV_RES_DT THEN D.DELV_RES_DT ELSE A.ORD_DT END 
-			--   AND A.REG_NO = 100025    
+			   -- AND A.REG_NO = 100025    
 			 GROUP BY A.ORD_NO
 			
 		) A
@@ -1485,8 +1485,8 @@
 		
 	
 	<!-- 품절대상 출고예외 주문 목록 조회         -->	
-	<select id="getSoldoutOrderExcDtlNoList" resultType="Delivery">
-		/*TsbDelivery.getSoldoutOrderExcDtlNoList*/
+	<select id="getSoldoutOrderExcNoList" resultType="Delivery">
+		/*TsbDelivery.getSoldoutOrderExcNoList*/
 		SELECT A.ORD_NO 
 		  FROM TB_ORDER_DELIVERY_EXCEPTION A 
 		  JOIN TB_ORDER_DELIVERY_EXCEPTION_ITEM B ON A.DELIVERY_EXCEPTION_SQ = B.DELIVERY_EXCEPTION_SQ 
@@ -1520,8 +1520,8 @@
 	</select>	
 	
 	<!-- 품절대상 회수예외 주문 목록 조회         -->	
-	<select id="getSoldoutOrderRecallDtlNoList" resultType="Delivery">
-		/*TsbDelivery.getSoldoutOrderRecallDtlNoList*/
+	<select id="getSoldoutOrderRecallNoList" resultType="Delivery">
+		/*TsbDelivery.getSoldoutOrderRecallNoList*/
 		SELECT A.ORDER_NO 
 		  FROM TB_ORDER_RECALL_EXCEPTION A 
 		  JOIN TB_ORDER_RECALL_EXCEPTION_ITEM B ON A.RECALL_EXCEPTION_NO = B.RECALL_EXCEPTION_NO 

+ 9 - 14
src/main/java/com/style24/persistence/mybatis/shop/TsbDisplay.xml

@@ -116,7 +116,7 @@
 		            AND    G.BRAND_CD = B.BRAND_CD
 		            AND    G.GOODS_TYPE != 'G056_N' /*일반상품이 아닌넘*/
 		            AND    G.GOODS_STAT = 'G008_90' /*승인된상품*/
-		            AND    G.SELF_GOODS_YN = 'Y' /*자사상품만(세트상품과 딜상품은 자사상품만)*/
+		         --   AND    G.SELF_GOODS_YN = 'Y' /*자사상품만(세트상품과 딜상품은 자사상품만)*/
 		            AND    G.SELF_MALL_YN = 'Y' /*자사몰에노출하는넘만*/
 		            AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한판매기간*/
 		            AND    GC.USE_YN = 'Y' /*사용하는구성상품*/
@@ -247,7 +247,7 @@
 		WITH TAB_FILTER AS (
 		    SELECT C4.SITE_CD
 		         , C4.CATE_GB
-		         , C4.FORMAL_GB
+		         , G.FORMAL_GB
 		         , CG.BRAND_GROUP_NO
 		         , C4.CATE1_NO
 		         , C4.CATE2_NO
@@ -378,7 +378,7 @@
 		WITH TAB_FILTER AS (
 		    SELECT C4.SITE_CD
 		         , C4.CATE_GB
-		         , C4.FORMAL_GB
+		         , G.FORMAL_GB
 		         , CG.BRAND_GROUP_NO
 		         , C4.CATE1_NO
 		         , C4.CATE2_NO
@@ -448,7 +448,7 @@
 		    AND    C4.CATE_TYPE = 'G031_10' /*상품카테고리*/
 		    AND    G.GOODS_TYPE != 'G056_N' /*일반상품이 아닌넘*/
 		    AND    G.GOODS_STAT = 'G008_90' /*승인된상품*/
-		    AND    G.SELF_GOODS_YN = 'Y' /*자사상품만(세트상품과 딜상품은 자사상품만)*/
+		  --  AND    G.SELF_GOODS_YN = 'Y' /*자사상품만(세트상품과 딜상품은 자사상품만)*/
 		    AND    G.SELF_MALL_YN = 'Y' /*자사몰에노출하는넘만*/
 		    AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한판매기간*/
 		    AND    I.SIZE_GB IS NOT NULL
@@ -555,7 +555,7 @@
 		WITH TAB_FILTER AS (
 		    SELECT C4.SITE_CD
 		         , C4.CATE_GB
-		         , C4.FORMAL_GB
+		         , G.FORMAL_GB
 		         , CG.BRAND_GROUP_NO
 		         , C4.CATE1_NO
 		         , C4.CATE2_NO
@@ -712,7 +712,8 @@
 		            GROUP  BY SITE_CD, CATE_GB, FORMAL_GB, BRAND_GROUP_NO, CATE1_NO
 		           ) Z
 		)
-		SELECT SITE_CD
+		SELECT DISTINCT
+		       SITE_CD
 		     , CATE_GB
 		     , FORMAL_GB
 		     , BRAND_GROUP_NO
@@ -721,7 +722,7 @@
 		     , FILTER_CD
 		     , FILTER_NM
 		     , RANK() OVER(PARTITION BY SITE_CD, CATE_GB, FORMAL_GB, BRAND_GROUP_NO, CATE_NO
-		                   ORDER BY DISP_ORD
+		                   ORDER BY FILTER_CD
 		                   )  AS DISP_ORD
 		FROM   (
 		        SELECT SITE_CD
@@ -731,7 +732,6 @@
 		             , CATE_NO
 		             , PRICE1         AS FILTER_CD
 		             , PRICE1         AS FILTER_NM
-		             , 1              AS DISP_ORD
 		        FROM   TAB_PRICE
 		        UNION ALL
 		        SELECT SITE_CD
@@ -741,7 +741,6 @@
 		             , CATE_NO
 		             , PRICE2         AS FILTER_CD
 		             , PRICE2         AS FILTER_NM
-		             , 2              AS DISP_ORD
 		        FROM   TAB_PRICE
 		        UNION ALL
 		        SELECT SITE_CD
@@ -751,7 +750,6 @@
 		             , CATE_NO
 		             , PRICE3         AS FILTER_CD
 		             , PRICE3         AS FILTER_NM
-		             , 3              AS DISP_ORD
 		        FROM   TAB_PRICE
 		        UNION ALL
 		        SELECT SITE_CD
@@ -761,7 +759,6 @@
 		             , CATE_NO
 		             , PRICE4         AS FILTER_CD
 		             , PRICE4         AS FILTER_NM
-		             , 4              AS DISP_ORD
 		        FROM   TAB_PRICE
 		        UNION ALL
 		        SELECT SITE_CD
@@ -771,7 +768,6 @@
 		             , CATE_NO
 		             , PRICE5         AS FILTER_CD
 		             , PRICE5         AS FILTER_NM
-		             , 5              AS DISP_ORD
 		        FROM   TAB_PRICE
 		        UNION ALL
 		        SELECT SITE_CD
@@ -781,7 +777,6 @@
 		             , CATE_NO
 		             , PRICE6         AS FILTER_CD
 		             , PRICE6         AS FILTER_NM
-		             , 6              AS DISP_ORD
 		        FROM   TAB_PRICE
 		       ) Z
 	</insert>
@@ -1118,7 +1113,7 @@
 		    AND    C4.CATE_TYPE = 'G031_10' /*상품카테고리*/
 		    AND    G.GOODS_TYPE != 'G056_N' /*일반상품이아닌넘*/
 		    AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
-		    AND    G.SELF_GOODS_YN = 'Y' /*자사상품만(세트상품과 딜상품은 자사상품만)*/
+		  --  AND    G.SELF_GOODS_YN = 'Y' /*자사상품만(세트상품과 딜상품은 자사상품만)*/
 		    AND    G.SELF_MALL_YN = 'Y' /*몰노출상품*/
 		    AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한판매기간*/
 		    AND    GS.SOLDOUT_YN = 'N' /*품절이아닌넘*/

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

@@ -570,8 +570,6 @@
 		                AND    CP.CPN_TYPE = 'G230_10' /*즉시할인쿠폰*/
 		                AND    CP.DC_CD_GB = 'G233_00'                         -- 일반유형(할인쿠폰구분)
 		                AND   (
-		                        (CP.APPLY_SCOPE = 'A' ) 
-		                        OR  /* 적용대상:상품*/
 		                        (CP.APPLY_SCOPE = 'I' AND (SELECT COUNT(1) FROM TB_COUPON_REFVAL
 		                                                   WHERE CPN_ID = CP.CPN_ID
 		                                                   AND CPN_TARGET = 'G260_10'
@@ -1139,9 +1137,21 @@
 		WHERE A.GOODS_CD = GS.GOODS_CD
 	</insert>
 	
-	<!--  안전인증대상 상품 조회 -->
+	<!--  안전인증대상 상품 조회 - 오픈후 1회성 작업 -->
 	<select id="getGoodsSafeNoList"   resultType="GoodsSafeNo">
 		/* TsbGoods.getGoodsSafeNoList */
+		SELECT GOODS_CD
+		     , CERT_NUM 
+		FROM TB_GOODS_SAFE_NO 
+		WHERE CERT_TARGET_GB = 'G083_1'  -- 인증대상
+		-- AND CERT_FORM_GB = 'G084_3'   -- 어린이제품
+		AND CERT_TYPE IN ('G081_1', 'G081_2')  -- 안전인증, 안전확인 
+		AND NULLIF(CERT_NUM, '') IS NOT NULL
+	</select>
+
+	<!--  안전인증대상 상품 조회 -->
+	<select id="getGoodsSafeNoList_org"   resultType="GoodsSafeNo">
+		/* TsbGoods.getGoodsSafeNoList_org */
 		SELECT B.GOODS_CD
 		     , B.GOODS_NUM
 		     , A.ITEMKIND_CD 
@@ -1161,7 +1171,7 @@
 		                                       )
 		WHERE A.NI_CLSF_CD = 'G004_23'  /*고시 유아용품*/
 	</select>
-	
+		
 	<!--  상품 안전인증번호 저장 -->
 	<insert id="saveGoodsSafeNo"  parameterType="GoodsSafeNo">
 		/* TsbGoods.saveGoodsSafeNo */
@@ -1689,7 +1699,7 @@
 		AND    GC.COMPS_GOODS_CD = S.GOODS_CD
 		AND    G.GOODS_TYPE != 'G056_N' /*일반상품이 아닌넘*/
 		AND    G.GOODS_STAT = 'G008_90' /*승인된상품*/
-		AND    G.SELF_GOODS_YN = 'Y' /*자사상품만(세트상품과 딜상품은 자사상품만)*/
+		-- AND    G.SELF_GOODS_YN = 'Y' /*자사상품만(세트상품과 딜상품은 자사상품만)*/
 		AND    G.SELF_MALL_YN = 'Y' /*자사몰에노출하는넘만*/
 		AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*유효한판매기간*/
 		AND    GC.USE_YN = 'Y' /*사용하는구성상품*/

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

@@ -46,9 +46,9 @@
 		      ,CP.EXP_BE_DT 
 		FROM TB_CUST_POINT CP
 		WHERE  1=1
-		AND CP.EXP_BE_DT <![CDATA[<=]]> DATE_FORMAT(CONCAT(CURRENT_DATE(),' 23:59:59'), '%Y%m%d%H%i%S')
+		AND CP.EXP_BE_DT <![CDATA[<]]> DATE_FORMAT(CONCAT(CURRENT_DATE(),' 23:59:59'), '%Y%m%d%H%i%S')
 		AND CP.RM_PNT_AMT > 0
-		AND EXP_CMP_DT IS NOT NULL
+		AND EXP_CMP_DT IS NULL
 	</select>
 	
 	<insert id="saveExpirePointHst" parameterType="Point">

+ 13 - 10
src/main/resources/config/application-locd.yml

@@ -88,16 +88,16 @@ cron:
             goods: 2 22 2 29 2 ?            #WMS 상품정보 송신
             goods.stock: 2 22 2 29 2 ?      #WMS 상품재고 수신
         
-    #소셜
+    # 소셜
     social:
          socialGoodsJob : 2 22 2 29 2 ?     #소셜 상품 적용
     
-    #통계
+    # 통계
     statistics:
         inflow: 2 22 2 29 2 ?               #유입통계
         inflow.yesterday: 2 22 2 29 2 ?     #어제일자유입통계
 
-    #물류/배송
+    # 물류/배송
     delivery:
         tsbDailyDeliveryZoneJob: 2 22 2 29 2 ?      # 총알배송 권역정보 갱신 (매일 11시)
         tsbDeliveryOrderJob: 2 22 2 29 2 ?          # 출고처 지정 및 배송(출고)지시
@@ -112,17 +112,19 @@ cron:
         tsbCjWithdrawInvoiceJob: 2 22 2 29 2 ?      # CJ 회수송장번호 수신
         tsbCjWithdrawInvoiceStatJob: 2 22 2 29 2 ?  # CJ 회수상태 수신
         tsbSweetTrackerJob: 2 22 2 29 2 ?           # 스윗트래커 송장상태조회
-        tsbSoldoutCancelJob: 2 22 2 29 2 ? # 품절취소
-    #회원(고객)
+        tsbSoldoutCancelJob: 2 22 2 29 2 ?          # 품절취소
+
+    # 회원(고객)
     customer:
         dormant.schedule : 2 22 2 29 2 ?            # 휴면예정 고객 메일발송
         dormant.transform : 2 22 2 29 2 ?           # 휴면처리
         secede.process : 2 22 2 29 2 ?              # 탈퇴처리
         privacy.policy.notice : 2 22 2 29 2 ?       # 개인정보 이용내역 안내(가입일로부터 1년 시점에 발송)
         marketing.agreement.notice : 2 22 2 29 2 ?  # 마케팅 정보 수신동의 내역 안내(마케팅 정보 수신자에 한해 발송. 가입일로부터 2년 시점에 발송)
-        grade.change : 2 22 2 29 2                  # 등급변경(매월1일)
+        grade.change : 2 22 2 29 2 ?                # 등급변경(매월1일)
+        netpathy.sync : 2 22 2 29 2 ?               # 넷퍼시메일솔루션에 회원정보 연동 (매일 1회)
 
-    #전시
+    # 전시
     display:
         category.refresh: 2 22 2 29 2 ?         #카테고리 갱신
         category.stock : 2 22 2 29 2 ?          #카테고리별 재고 생성
@@ -131,11 +133,12 @@ cron:
     # 마케팅
     marketing:
         auto.buy.confirm : 2 22 2 29 2 ?        # 자동구매확정 예정포인트 지급
-        birthday.coupon.notice : 2 22 2 29 2 ?  # 생일쿠폰 다운로드 안내(당월 생일인 회원을 대상으로 해당 월 1일에 발송)(해야함)
-        comback.coupon.notice : 2 22 2 29 2 ?   # 복귀할인쿠폰발급안내(매월 1일)(해야함)
+        birthday.coupon.notice : 2 22 2 29 2 ?  # 생일쿠폰 다운로드 안내(당월 생일인 회원을 대상으로 해당 월 1일에 발송)
+        comback.coupon.notice : 2 22 2 29 2 ?   # 복귀할인쿠폰발급안내(매월 5일)(해야함)
         expire.point : 2 22 2 29 2 ?            # 포인트 소멸
         cart.expiration : 2 22 2 29 2 ?         # 만료기간 지난 장바구니 삭제
 
+    # 주문
     order:
         deposit.expiration : 2 22 2 29 2 ?      # 무통장입금 입금기한 만료 주문 취소
-        gift.expiration : 2 22 2 29 2 ?         # 선물하기 배송지 등록 기간 만료 주문 취소
+        gift.expiration : 2 22 2 29 2 ?         # 선물하기 배송지 등록 기간 만료 주문 취소

+ 8 - 1
src/main/resources/config/application-run.yml

@@ -26,6 +26,13 @@ spring:
 logging:
     config: classpath:log/logback-run.xml
 
+upload:
+    goods:
+        target.path: /files/data/style24/ProductImage
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.istyle24.com/Upload/ProductImage
+
 # USAFE 보증보험 정보
 usafe.guarantee:
     mall.id: istyle2400
@@ -34,7 +41,7 @@ usafe.guarantee:
 # PG
 pg:
     kcp:
-        log.dir: E:/Run/Payplus
+        log.dir: /logs/style24/kcpLogs/batch
         gw:
             url: paygw.kcp.co.kr
             port: 8090

+ 5 - 4
src/main/resources/config/application-style.yml

@@ -28,10 +28,10 @@ logging:
 
 upload:
     goods:
-        target.path: /files/data/style24
+        target.path: /files/data/style24/ProductImage
         max.size: 10
         allow.extension: jpg|gif|jpeg|png
-        view: //image.style24.com/goods
+        view: //image.istyle24.com/Upload/ProductImage
 
 # USAFE 보증보험 정보
 usafe.guarantee:
@@ -41,7 +41,7 @@ usafe.guarantee:
 # PG
 pg:
     kcp:
-        log.dir: /files/data/style24/logs/kcpLogs/batch
+        log.dir: /logs/style24/kcpLogs/batch
         gw:
             url: testpaygw.kcp.co.kr
             port: 8090
@@ -130,7 +130,8 @@ cron:
         secede.process : 2 22 2 29 2 ?              # 탈퇴처리
         privacy.policy.notice : 2 22 2 29 2 ?       # 개인정보 이용내역 안내(가입일로부터 1년 시점에 발송)
         marketing.agreement.notice : 2 22 2 29 2 ?  # 마케팅 정보 수신동의 내역 안내(마케팅 정보 수신자에 한해 발송. 가입일로부터 2년 시점에 발송)
-        grade.change : 2 22 2 29 2                  # 등급변경(매월1일)
+        grade.change : 2 22 2 29 2 ?                # 등급변경(매월1일)
+        netpathy.sync : 2 22 2 29 2 ?               # 넷퍼시메일솔루션에 회원정보 연동 (매일 1회)
 
     #전시
     display: