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

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

card007 4 лет назад
Родитель
Сommit
b77f916aa1

+ 18 - 0
src/main/java/com/style24/core/biz/dao/TscShoplinkerDao.java

@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Alarm;
 import com.style24.persistence.domain.ShoplinkerGoods;
 import com.style24.persistence.domain.ShoplinkerInvoice;
 import com.style24.persistence.domain.ShoplinkerOrder;
@@ -127,5 +128,22 @@ public interface TscShoplinkerDao {
 	 * @since 2021. 5. 20
 	 */
 	Collection<ShoplinkerInvoice> getShoplinkerInvoiceOrdDtlSendList();
+	
+	/**
+	 * 알람SMS 생성 (개발용)
+	 * @param alarm - 알람 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 10. 08
+	 */
+	void createAlarmSmsDev(Alarm alarm);
 
+	/**
+	 * 알람SMS 생성 (운영용)
+	 * @param alarm - 알람 정보
+	 * @return
+	 * @author jmh
+	 * @since 2021. 10. 08
+	 */
+	void createAlarmSms(Alarm alarm);
 }

+ 149 - 0
src/main/java/com/style24/core/biz/service/TscExcelService.java

@@ -0,0 +1,149 @@
+package com.style24.core.biz.service;
+
+import com.gagaframework.web.parameter.GagaMap;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.NumberToTextConverter;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.io.FileInputStream;
+import java.text.FieldPosition;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * 엑셀 Service
+ *
+ * @author yujung
+ * @since 2021. 10. 13
+ */
+@Service
+@Slf4j
+public class TscExcelService {
+
+	/**
+	 * 엑셀
+	 * @author yujung
+	 * @since 2021. 10. 13
+	 */
+	public Collection<GagaMap> getExcelList(String excelFile, int headerPosition, String[] cellName, int sheetIndex) throws Exception {
+
+		Workbook wb = null;
+		String extension = getFileExtension(excelFile);
+		if (extension.equals("xls")) {
+			POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(excelFile));
+			wb = new HSSFWorkbook(fs);
+		} else if (extension.equals("xlsx")) {
+			wb = new XSSFWorkbook(OPCPackage.open(new FileInputStream(excelFile)));
+		}
+
+		Sheet sheet = getSheetSplitMergedCell((Workbook)wb, sheetIndex);
+		int rows = sheet.getLastRowNum() + 1;
+		log.debug("rows: {}", rows);
+		if (rows == 0) {
+			throw new IllegalStateException("엑셀 파일에 데이터가 없습니다.");
+		} else {
+			Row row = sheet.getRow(headerPosition++);
+			int cells = row.getPhysicalNumberOfCells();
+			log.debug("cells: {}, cellName.length: {}", cells, cellName.length);
+			if (cells != cellName.length) {
+				throw new IllegalStateException("컬럼의 개수와 제목의 개수가 일치하지 않습니다.");
+			} else {
+				Collection<GagaMap> dataList = new ArrayList();
+
+				for(int r = headerPosition; r < rows; ++r) {
+					int comVal = 0;
+					GagaMap dataMap = new GagaMap();
+					row = sheet.getRow(r);
+					if (row != null) {
+						for(int idx = 0; idx < cells; ++idx) {
+							if (row.getCell(idx) != null && !StringUtils.isEmpty(row.getCell(idx).toString())) {
+								dataMap.put(cellName[idx], getCellDataByType(row.getCell(idx)));
+							} else {
+								++comVal;
+							}
+
+							if (comVal == cells) {
+								return dataList;
+							}
+						}
+
+						log.debug("dataMap: {}", dataMap.toString());
+						dataList.add(dataMap);
+					}
+				}
+
+				return dataList;
+			}
+		}
+	}
+
+	private static String getFileExtension(String fileName) {
+		int lastDot = fileName.lastIndexOf(46);
+		String extension = lastDot != -1 ? fileName.substring(lastDot + 1) : "";
+		return extension.toLowerCase();
+	}
+
+	private static Sheet getSheetSplitMergedCell(Workbook wb, int sheetIndex) {
+		Sheet sheet = wb.getSheetAt(sheetIndex);
+		Cell cValue = null;
+
+		for(int x = 0; x < sheet.getNumMergedRegions(); ++x) {
+			CellRangeAddress cra = sheet.getMergedRegion(x);
+			if (cra.getLastColumn() - cra.getFirstColumn() == 0 && cra.getLastRow() - cra.getFirstRow() > 0) {
+				cValue = sheet.getRow(cra.getFirstRow()).getCell(cra.getFirstColumn());
+				String value = null;
+				cValue.getCellTypeEnum();
+				if (!CellType.STRING.equals(CellType.STRING)) {
+					break;
+				}
+
+				value = sheet.getRow(cra.getFirstRow()).getCell(cra.getFirstColumn()).getStringCellValue();
+				int columnIndex = cra.getFirstColumn();
+
+				for(int i = cra.getFirstRow() + 1; i <= cra.getLastRow(); ++i) {
+					sheet.getRow(i).getCell(columnIndex).getCellTypeEnum();
+					if (CellType.BLANK.equals(CellType.BLANK)) {
+						sheet.getRow(i).getCell(columnIndex).setCellValue(value);
+					}
+				}
+			}
+		}
+
+		return sheet;
+	}
+
+	private static Object getCellDataByType(Cell cell) throws Exception {
+		Object value = null;
+		CellType cellType = cell.getCellTypeEnum();
+		if (cellType.equals(CellType.STRING)) {
+			value = cell.getStringCellValue().trim();
+		} else if (cellType.equals(CellType.FORMULA)) {
+			value = cell.getCellFormula();
+		} else if (cellType.equals(CellType.NUMERIC)) {
+			if (DateUtil.isCellDateFormatted(cell)) {
+				StringBuffer toAppendTo = new StringBuffer();
+				(new SimpleDateFormat("yyyyMMdd")).format(cell.getDateCellValue(), toAppendTo, new FieldPosition(0));
+				value = toAppendTo.toString();
+			} else {
+				value = NumberToTextConverter.toText(cell.getNumericCellValue());
+			}
+		} else if (cellType.equals(CellType.BOOLEAN)) {
+			value = cell.getBooleanCellValue();
+		} else if (cellType.equals(CellType.ERROR)) {
+			value = cell.getErrorCellValue();
+		} else if (cellType.equals(CellType.BLANK)) {
+			value = "";
+		}
+
+		return value;
+	}
+	
+}

+ 66 - 31
src/main/java/com/style24/core/biz/service/TscOrderOcmService.java

@@ -109,8 +109,6 @@ public class TscOrderOcmService {
 
 					orderDetail.setUploadStat(TscConstants.ExtmallUploadStat.FAIL.value());	// 실패
 					orderDetail.setOrdNo(null);
-					orderDetail.setUploadFailCd(orderDetail.getUploadFailCd());
-					orderDetail.setUploadFailReason(orderDetail.getUploadFailReason());
 					orderOcmDao.updateExtmallOrder(orderDetail);
 
 				}else {
@@ -291,11 +289,13 @@ public class TscOrderOcmService {
 			// 주문등록 전체실패시 상태 업데이트
 			GagaMap vdMap;
 			for( ExtmallOrder orderDetail : order.getOrderDetailList()) {
-				vdMap = this.checkGoodsInfo(orderDetail);
+				
+				if("G022_70".equals(orderDetail.getUploadFailCd())) {
+					vdMap = this.checkGoodsInfo(orderDetail);
+					orderDetail.setOrdNo(vdMap.getInt("ordNo"));	// 실패	
+				}
+				
 				orderDetail.setUploadStat(TscConstants.ExtmallUploadStat.FAIL.value());	// 실패
-				orderDetail.setOrdNo(vdMap.getInt("ordNo"));	// 실패
-				orderDetail.setUploadFailCd(vdMap.getString("uploadFailCd"));
-				orderDetail.setUploadFailReason(vdMap.getString("message"));
 				orderOcmDao.updateExtmallOrder(orderDetail);
 			}
 		}
@@ -455,24 +455,58 @@ public class TscOrderOcmService {
 		int succCnt = 0;
 		int stockFailCnt = 0;
 		
-		failGoodsAdmMsg += "\n쇼핑몰주문번호: "+order.getExtmallOrderId();
-		failGoodsAdmMsg += "\n샵링커주문번호: ";
-		for (ExtmallOrder orderDetail : orderDetailList) {
-
-			GagaMap resultMap = this.checkGoodsInfo(orderDetail);
-
-			orderDetail.setUploadFailCd(resultMap.getString("uploadFailCd"));
-			orderDetail.setUploadFailReason(resultMap.getString("message"));
-
-			if ("SUCCESS".equals(resultMap.get("message").toString())) {
-				succCnt ++;
-			}else {
-				// 알림톡 발송 할 목록
-				if("Y".equals(resultMap.get("sendNotiYn"))){
-					failGoods += resultMap.get("goodsNm") + ",";
-					failGoodsAdmMsg += orderDetail.getAgentOrderId()+" ,";
-					//failGoodsAdmMsg += "\n상품:"+resultMap.get("goodsNm")+"("+resultMap.get("optCd")+ "),";
-					stockFailCnt ++;
+		if( order.getRealDelvAmt() < 0 ) {
+			// 배송비 상이 전체 주문실패 
+			succCnt = -1;
+			for (ExtmallOrder orderDetail : orderDetailList) {
+				orderDetail.setUploadFailCd(TscConstants.ExtmallUploadFailStat.DELV_FEE.value());
+			}
+			
+		}else {
+			
+			boolean bool = true;
+			failGoodsAdmMsg += "\n쇼핑몰주문번호: "+order.getExtmallOrderId();
+			failGoodsAdmMsg += "\n샵링커주문번호: ";
+			// sub1 각각의 실패사유 체크
+			for (ExtmallOrder orderDetail : orderDetailList) {
+	
+				GagaMap resultMap = this.checkGoodsInfo(orderDetail);
+				
+				orderDetail.setUploadFailCd(resultMap.getString("uploadFailCd"));
+				orderDetail.setUploadFailReason(resultMap.getString("message"));
+	
+				if ("SUCCESS".equals(resultMap.get("message").toString())) {
+					succCnt ++;
+				}else {
+					
+					// 주문전체 실패로 저장 (21.10.07)
+					if( !resultMap.getString("uploadFailCd").equals(TscConstants.ExtmallUploadFailStat.STOCK.value()) 
+						&& !resultMap.getString("uploadFailCd").equals(TscConstants.ExtmallUploadFailStat.ORDER.value()) ) {
+						bool = false;
+					}else {
+						// 알림톡 발송 할 목록
+						if("Y".equals(resultMap.get("sendNotiYn"))){
+							failGoods += resultMap.get("goodsNm") + ",";
+							failGoodsAdmMsg += orderDetail.getAgentOrderId()+" ,";
+							//failGoodsAdmMsg += "\n상품:"+resultMap.get("goodsNm")+"("+resultMap.get("optCd")+ "),";
+							stockFailCnt ++;
+						}
+					}
+				}
+			}
+			
+			// sub1 각각의 실패사유 중 재고& 동일주문건을 제외하고는 전체 실패로 저장 하도록 변경(21.10.07)
+			// 실패건은 엑셀업로드를 통한 수동등록해서, 주문건이 하나로 생성되도록 하기 위함 
+			if( !bool) {
+				succCnt = -1;
+				failGoods = "";
+				failGoodsAdmMsg = "";
+				stockFailCnt = 0;
+				for (ExtmallOrder orderDetail : orderDetailList) {
+					if("SUCCESS".equals(orderDetail.getUploadFailReason())) {
+						orderDetail.setUploadFailCd(TscConstants.ExtmallUploadFailStat.ETC.value());
+						orderDetail.setUploadFailReason("(정상) 다른 옵션으로 인한 실패");
+					}
 				}
 			}
 		}
@@ -560,12 +594,6 @@ public class TscOrderOcmService {
 			result.put("message", "이미 재고 부족으로 인한 고객 알림 발송이 완료된 건입니다.(동일수집 실패)");
 			return result;
 
-		} else if( null == dtlOrd.getGoodsCd()) {
-			result.put("sendNotiYn", "N");	// 알림톡발송 x
-			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.GOODS.value());
-			result.put("message", "상품코드가 잘못되었습니다.");
-			return result;
-
 		} else if( null == dtlOrd.getOptCd()) {
 			result.put("sendNotiYn", "N");	// 알림톡발송 x
 			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.SIZE.value());
@@ -573,6 +601,13 @@ public class TscOrderOcmService {
 			return result;
 
 		}
+		/* 21.10.07 정과장님 제외요청. 상품코드는 필수체크 제외 
+		} else if( null == dtlOrd.getGoodsCd()) {
+			result.put("sendNotiYn", "N");	// 알림톡발송 x
+			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.GOODS.value());
+			result.put("message", "상품코드가 잘못되었습니다.");
+			return result;
+		*/
 		/* 21.09.27 정과장님 제외요청 상품 상태값 상관없이 주문되어야 한다 함.(재고만 체크하도록 변경요청)
 		else if (TscConstants.GoodsStat.SOLDOUT.value().equals(dtlOrd.getGoodsStat())) {
 			result.put("goodsNm", dtlOrd.getGoodsNm());
@@ -595,7 +630,7 @@ public class TscOrderOcmService {
 		if (null == dtlOrd.getSoldoutYn()) {
 			result.put("goodsNm", dtlOrd.getGoodsNm());
 			result.put("optCd", dtlOrd.getOptCd());
-			result.put("sendNotiYn", "N");	// 알림톡발송 o
+			result.put("sendNotiYn", "N");	// 알림톡발송 x
 			result.put("uploadFailCd", TscConstants.ExtmallUploadFailStat.STOCK.value());
 			result.put("message", "재고체크 실패했습니다. 새로고침 후 다시 시도해주세요.");
 			return result;

+ 33 - 4
src/main/java/com/style24/core/biz/service/TscShoplinkerService.java

@@ -1,12 +1,8 @@
 package com.style24.core.biz.service;
 
-import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.OutputStreamWriter;
 import java.net.URLEncoder;
-import java.nio.charset.Charset;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -29,6 +25,7 @@ import com.style24.core.biz.dao.TscOrderOcmDao;
 import com.style24.core.biz.dao.TscShoplinkerDao;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Alarm;
 import com.style24.persistence.domain.ExtmallOrder;
 import com.style24.persistence.domain.ShoplinkerGoods;
 import com.style24.persistence.domain.ShoplinkerInvoice;
@@ -385,6 +382,14 @@ public class TscShoplinkerService {
 			log.error("xml 생성오류 ", e);
 			returnMap.setString("RESULT_TYPE", TscConstants.ShoplinkerApiStat.ERROR.value());
 			returnMap.setString("RESULT_MSG", "xml 생성오류");
+			
+			try {
+				if( "BATCH".equals(shoplinkerOrder.getAcType())){
+					this.createSystemAlarmSms("샵링커 주문수집 배치- xml 생성오류!! "+GagaDateUtil.getToday("yyyy.MM.dd HH:mm"));
+				}
+			} catch (Exception e2) {
+				// TODO: handle exception
+			}
 		}
 
 		returnMap.setInt("currListCount", currListCount);
@@ -406,6 +411,7 @@ public class TscShoplinkerService {
 	public void insertShoplinkerOrderStep2(ShoplinkerOrder shoplinkerOrder) {
 
 		// 1. 외부몰 미등록 목록 가져옴
+		// 중요!! 4상점(옥션,지마켓,카카오톡스토어,위메프)은 MALL_ORDER_ID를 SHIP_NO로 대처해서 저장한다.=> 1개의 주문건인데 쇼핑몰 번호가 다르게 옴 => SHIP_NO로 1개의 주문건으로 체크 함
 		Collection<ShoplinkerOrder> slkOrdList = shoplinkerDao.getShoplinkerRegExtmallList();
 
 		ExtmallOrder extmallOrder;
@@ -684,4 +690,27 @@ public class TscShoplinkerService {
 		return rtnMap;
 	}
 	
+	/**
+	 * 샵링커 주문수집 배치 오류 실패알림 
+	 * @param 
+	 * @return
+	 * @author jmh
+	 * @since 2021. 10. 08
+	 */
+	@Transactional("shopTxnManager")
+	public void createSystemAlarmSms(String msg) {
+		Alarm params = new Alarm();
+		params.setAlarmId("A009");
+		params.setFuserid(String.valueOf("99999"));
+		params.setFcallback(TscConstants.CALLCENTER_TEL_NO);
+		params.setAlarmMsg(msg);
+		
+		String profile = env.getProperty("spring.profiles.active");
+
+		if ("run".equals(profile) || "style".equals(profile) || "brdg".equals(profile)) {
+			shoplinkerDao.createAlarmSms(params);
+		} else {
+			shoplinkerDao.createAlarmSmsDev(params);
+		}
+	}
 }

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

@@ -1134,6 +1134,7 @@ public class TscConstants {
 		STORE("G022_50"),				// 판매매장미등록
 		STOCK("G022_60"),				// 가용재고없음
 		ORDER("G022_70"),				// 동일주문수집
+		DELV_FEE("G022_80"),			// 배송비 상이함
 		ETC("G022_90");					// 기타
 
 		private String value;

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

@@ -272,6 +272,7 @@ public class OrderChange extends TscBaseDomain {
 	private String delvFeeGb;
 	private int rowspanRank;
 	private int rowspanCnt;
+	private String msgStat;							// 메세지 전송 여부
 
 	public String getMaskingOrdNm() {
 		return TscSession.getAttribute("maskingYn").equals("Y") ? MaskingUtils.name(getOrdNm()) : getOrdNm();

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

@@ -130,6 +130,7 @@ public class ShoplinkerOrder extends TscBaseDomain {
 	private String sid;
 	private String acType = "";					// 실행위치 BATCH:배치 /  ADMIN :관리자
 	private String extmallRegDt; 				// 제휴몰 등록일
+	private String excelDownType; 				// 엑셀다운로드 타입(1: 일반다운로드, 2:제휴몰주문업로드 폼으로 다운로드)
 
 	public ShoplinkerOrder() {
 

+ 8 - 6
src/main/java/com/style24/persistence/mybatis/shop/TscOrderOcm.xml

@@ -18,7 +18,7 @@
 			, IFNULL(A.RECIP_ZIPCODE, '') AS RECIP_ZIPCODE
 			, IFNULL(A.RECIP_BASE_ADDR, '') AS RECIP_BASE_ADDR
 			, IFNULL(A.RECIP_DTL_ADDR, '') AS RECIP_DTL_ADDR
-			, SUM(A.DELV_FEE) AS DELV_FEE
+			, FN_GET_SHOPLINKER_DEVL_FEE(#{uploadGb}, A.EXTMALL_ID, A.EXTMALL_ORDER_ID) AS DELV_FEE
 			, SUM(A.ORD_AMT) AS REAL_ORD_SUM_AMT
 			, (SELECT CNCLSMS_SEND_YN FROM TB_EXTMALL S WHERE S.VENDOR_ID = A.VENDOR_ID
 				AND S.EXTMALL_ID = A.EXTMALL_ID AND S.USE_YN = 'Y') AS CNCLSMS_SEND_YN
@@ -87,7 +87,8 @@
 			, A.OPT_CD
 			, A.UPLOAD_GB
 		FROM TB_EXTMALL_ORDER_UPLOAD A
-			LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+			LEFT OUTER JOIN TB_OPTION OP ON A.OPT_CD = OP.OPT_CD
+			LEFT OUTER JOIN TB_GOODS B ON OP.GOODS_CD = B.GOODS_CD
 			LEFT OUTER JOIN TB_EXTMALL C ON A.VENDOR_ID = C.VENDOR_ID AND A.EXTMALL_ID = C.EXTMALL_ID AND C.USE_YN = 'Y'
 		WHERE 1=1
 		AND RECIP_BASE_ADDR IS NOT NULL AND RECIP_BASE_ADDR != ''
@@ -230,8 +231,8 @@
 		FROM TB_EXTMALL_ORDER_UPLOAD A
 			LEFT OUTER JOIN TB_ORDER_DETAIL OD ON A.VENDOR_ID = OD.VENDOR_ID AND A.EXTMALL_ID = OD.EXTMALL_ID
 					AND A.AGENT_ORDER_ID = OD.AGENT_ORDER_ID AND A.EXTMALL_ORDER_ID = OD.EXTMALL_ORDER_ID
-			LEFT OUTER JOIN TB_GOODS GS ON A.GOODS_CD = GS.GOODS_CD
-			LEFT OUTER JOIN VW_STOCK VS ON VS.GOODS_CD = A.GOODS_CD AND VS.OPT_CD = A.OPT_CD
+			LEFT OUTER JOIN VW_STOCK VS ON VS.OPT_CD = A.OPT_CD
+			LEFT OUTER JOIN TB_GOODS GS ON VS.GOODS_CD = GS.GOODS_CD
 
 		WHERE A.VENDOR_ID = #{vendorId}
 		AND A.EXTMALL_ID = #{extmallId}
@@ -298,7 +299,8 @@
 			, A.REG_NO
 			, A.REG_DT
 		FROM TB_EXTMALL_ORDER_UPLOAD A
-			LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+			LEFT OUTER JOIN TB_OPTION OP ON A.OPT_CD = OP.OPT_CD
+			LEFT OUTER JOIN TB_GOODS B ON OP.GOODS_CD = B.GOODS_CD
 			LEFT OUTER JOIN TB_EXTMALL C ON A.VENDOR_ID = C.VENDOR_ID AND A.EXTMALL_ID = C.EXTMALL_ID AND C.USE_YN = 'Y'
 		WHERE 1=1
 		AND RECIP_BASE_ADDR IS NOT NULL AND RECIP_BASE_ADDR != ''
@@ -1532,7 +1534,7 @@
 				, A.REG_NO
 				, NOW()
 		 FROM   TB_EXTMALL_ORDER_UPLOAD_TMP A
-		 		INNER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		 		LEFT OUTER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
 		 WHERE 	A.REG_NO = #{regNo}
 		 AND 	DATE(A.REG_DT) = DATE(NOW())
 

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

@@ -532,7 +532,64 @@
 			)
 		ORDER BY ORD_NO, ORD_DTL_NO
 	</select>
-
+	
+	
+	<!-- 알람SMS 생성 -->
+	<insert id="createAlarmSmsDev" parameterType="Alarm">
+		/* TscShoplinker.createAlarmSmsDev */
+		INSERT INTO SSG_SEND_TRAN_SMS (
+		       FSEQ
+		     , FUSERID
+		     , FSECTIONCODE
+		     , FCAMPCODE
+		     , FMSGTYPE
+		     , FMESSAGE
+		     , FSENDDATE
+		     , FDESTINE
+		     , FCALLBACK
+		)
+		SELECT NULL          AS FSEQ
+		     , #{fuserid}    AS FUSERID
+		     , ''            AS FSECTIONCODE
+		     , ''            AS FCAMPCODE
+		     , '0'           AS FMSGTYPE
+		     , #{alarmMsg}   AS FMESSAGE
+		     , NOW()         AS FSENDDATE
+		     , AR.CELL_PHNNO AS FDESTINE
+		     , #{fcallback}  AS FCALLBACK
+		FROM   TB_ALARM_RECEIVER AR
+		WHERE  AR.ALARM_ID = #{alarmId}
+		AND    AR.USE_YN = 'Y'
+	</insert>
+	
+	<!-- 알람SMS 생성 -->
+	<insert id="createAlarmSms" parameterType="Alarm">
+		/* TscShoplinker.createAlarmSms */
+		INSERT INTO style24_msg.SSG_SEND_TRAN_SMS (
+		       FSEQ
+		     , FUSERID
+		     , FSECTIONCODE
+		     , FCAMPCODE
+		     , FMSGTYPE
+		     , FMESSAGE
+		     , FSENDDATE
+		     , FDESTINE
+		     , FCALLBACK
+		)
+		SELECT NULL          AS FSEQ
+		     , #{fuserid}    AS FUSERID
+		     , ''            AS FSECTIONCODE
+		     , ''            AS FCAMPCODE
+		     , '0'           AS FMSGTYPE
+		     , #{alarmMsg}   AS FMESSAGE
+		     , NOW()         AS FSENDDATE
+		     , AR.CELL_PHNNO AS FDESTINE
+		     , #{fcallback}  AS FCALLBACK
+		FROM   TB_ALARM_RECEIVER AR
+		WHERE  AR.ALARM_ID = #{alarmId}
+		AND    AR.USE_YN = 'Y'
+	</insert>
+	
 </mapper>