spc-sms/java_run/CallHpordRunOutOfStock.java

586 lines
18 KiB
Java
Raw Normal View History

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.lang.management.ManagementFactory;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
public class CallHpordRunOutOfStock {
/* 개발
private static String jdbcUrl = "jdbc:oracle:thin:@10.0.50.147:1521:spcdev01";
private static String jdbcId = "spp";//jdbc id
private static String jdbcPw = "spp";//jdbc pw
*/
/* 운영 */
private static String jdbcUrl = "jdbc:oracle:thin:@10.0.50.152:1521/PCPOS";
private static String jdbcId = "SPP";//jdbc id
private static String jdbcPw = "Spc_$pp!23";//jdbc pw
private static Connection dbConn = null;
private static String chk = "";
private static SimpleDateFormat formatter;
public static void main(String[] args) {
try {
SimpleDateFormat formatTime = new SimpleDateFormat("HHmmss");
chk = formatTime.format(new Date());
formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println( "[" + formatter.format(new Date()) + "] [" + chk + "] [INFO] ==== START ====" );
startCallApi();
} catch (SQLException se) {
se.printStackTrace();
} finally{
if(dbConn != null){
try{
dbConn.close();
}catch(SQLException e){
}
}
System.out.println( "[" + formatter.format(new Date()) + "] [" + chk + "] [INFO] ==== END ====" );
}
}
public static void startCallApi() throws SQLException{
String strOSName = System.getProperty("os.name");
String strPID = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
String strClassName = "CallHpordRunOutOfStock";
Boolean isRunnable = false;
try {
Process p = Runtime.getRuntime().exec( new String[]{
"/bin/sh"
, "-c"
, "ps -ef | grep [" + strClassName.substring(0, 1) + "]" + strClassName.substring(1, strClassName.length()) + " | awk '{ print $2 }'"
} );
BufferedReader in = new BufferedReader(new InputStreamReader( p.getInputStream() ) );
String s = null;
while( ( s = in.readLine() ) != null ){
if( strPID.equals(s) ){
continue;
}
isRunnable = true;
break;
}
if( in != null ) in.close();
} catch( IOException e ){
e.printStackTrace();
isRunnable = true;
}
if( !isRunnable ){
selectData();
} else {
/*isRunnable = searchAction();
if(isRunnable){*/
System.out.println( "[" + formatter.format(new Date()) + "] [" + chk + "] [INFO] " + strClassName + " Daemon이 이미 실행중 입니다" );
/*} else {
selectData();
}*/
}
}
public static void selectData() throws SQLException{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
dbConn = DriverManager.getConnection(jdbcUrl, jdbcId, jdbcPw);
dbConn.setAutoCommit(false);
} catch (ClassNotFoundException ce) {
ce.printStackTrace();
}
updateAction("1");
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "";
HashMap mp = null;
String storCd = "";
String itemCd = "";
String updStatus = "";
sql = " SELECT * FROM ( \n"; //점포코드
sql = sql + " SELECT A.STOR_CD \n"; //점포코드
sql = sql + " , A.ITEM_CD \n"; //상품코드
sql = sql + " , CASE WHEN A.STATUS_DIV = '0' THEN '01' \n";
sql = sql + " WHEN A.STATUS_DIV = '2' THEN '00' \n";
sql = sql + " ELSE '' END SHORTAGE_CD \n"; //품점여부 00:판매(비결품) , 01:결품
sql = sql + " , NVL( A.BASE_QTY , 0) \n";
sql = sql + " - NVL(A.SALE_QTY , 0) \n";
sql = sql + " + NVL(A.ORD_QTY , 0) \n";
sql = sql + " + NVL(A.MV_QTY , 0) \n";
sql = sql + " + NVL(A.ADD_STOCK_QTY , 0) \n";
sql = sql + " AS STOCK_QTY \n"; //재고수량
sql = sql + " , CASE WHEN A.STATUS_DIV = '0' THEN '1' \n";
sql = sql + " WHEN A.STATUS_DIV = '2' THEN '3' \n";
sql = sql + " ELSE '' END AS UPD_STATUS \n";
sql = sql + " FROM SPL_DAY_STOCK_HP A \n";
sql = sql + " , MST_STOR B \n";
sql = sql + " , MST_SALESORG_ITEM C \n";
sql = sql + " WHERE A.STOR_CD = B.STOR_CD \n";
sql = sql + " AND B.CMP_CD = C.CMP_CD \n";
sql = sql + " AND B.SALES_ORG_CD = C.SALES_ORG_CD \n";
sql = sql + " AND B.DRT_FRCS_TYPE = C.DRT_FRCS_TYPE \n";
sql = sql + " AND A.ITEM_CD = C.ITEM_CD \n";
sql = sql + " AND A.STATUS_DIV IN ('0', '2') \n";
sql = sql + " AND B.CMP_CD = 'PCKR' \n";
sql = sql + " AND C.CMP_CD = 'PCKR' \n";
sql = sql + " AND NVL(C.ITEM_PROD_TYPE, '1') <> '3' \n";
sql = sql + " UNION ALL \n";
sql = sql + " SELECT A.STOR_CD \n"; //점포코드
sql = sql + " , A.ITEM_CD \n"; //상품코드
sql = sql + " , CASE WHEN A.STATUS_DIV = '0' THEN '01' \n";
sql = sql + " WHEN A.STATUS_DIV = '2' THEN '00' \n";
sql = sql + " ELSE '' END SHORTAGE_CD \n"; //품점여부 00:판매(비결품) , 01:결품
sql = sql + " , NVL( A.BASE_QTY , 0) \n";
sql = sql + " - NVL(A.SALE_QTY , 0) \n";
sql = sql + " + NVL(A.ORD_QTY , 0) \n";
sql = sql + " + NVL(A.MV_QTY , 0) \n";
sql = sql + " + NVL(A.ADD_STOCK_QTY , 0) \n";
sql = sql + " AS STOCK_QTY \n"; //재고수량
sql = sql + " , CASE WHEN A.STATUS_DIV = '0' THEN '1' \n";
sql = sql + " WHEN A.STATUS_DIV = '2' THEN '3' \n";
sql = sql + " ELSE '' END AS UPD_STATUS \n";
sql = sql + " FROM SPL_DAY_STOCK_HP A \n";
sql = sql + " , SPL_HPYORD_ITEMVIEW_YN D \n";
sql = sql + " WHERE A.STOR_CD = D.STOR_CD \n";
sql = sql + " AND A.ITEM_CD = D.ITEM_CD \n";
sql = sql + " AND A.STATUS_DIV IN ('0', '2') \n";
sql = sql + " AND D.CMP_CD = 'PCKR' \n";
sql = sql + " ) \n";
sql = sql + " WHERE 1=1 \n";
sql = sql + " AND ROWNUM <= ( SELECT TO_NUMBER(CHAR_VAL_TITLE_VAL_01) AS NUM "
+ " FROM MST_CMM_CD_DTL "
+ " WHERE CMP_CD = 'PCKR' "
+ " AND CMM_GRP_CD = 'S0102' "
+ " AND CMM_CD = '1' "
+ " AND ROWNUM = 1 ) \n";
sql = sql + " \r\n";
try{
pstmt = dbConn.prepareStatement(sql) ;
rs = pstmt.executeQuery();
String sendJson = "";
int i = 0;
while(rs.next()){
storCd = rs.getString("STOR_CD");
itemCd = rs.getString("ITEM_CD");
updStatus = rs.getString("UPD_STATUS");
sendJson = "{\"deviceType\"" + ":\"POS\","
+ "\"brandCode\"" + ":\"PBparis\","
+ "\"storeCode\"" + ":\"" + storCd + "\","
+ "\"itemCode\"" + ":\"" + itemCd + "\","
+ "\"shortageCode\"" + ":\"" + rs.getString("SHORTAGE_CD") + "\","
+ "\"shortageMemo\"" + ":\"\","
+ "\"stockQty\"" + ":\"" + rs.getString("STOCK_QTY") + "\"}";
mp = new HashMap();
mp.put("STOR_CD" , storCd);
mp.put("ITEM_CD" , itemCd);
mp.put("UPD_STATUS" , updStatus);
// API 통신
callHappyOrdApi(sendJson, mp);
i++;
}
System.out.println( "[" + formatter.format(new Date()) + "] [" + chk + "] [INFO] Send Count ==> " + i );
}catch(Exception e){
e.printStackTrace();
}finally{
if(rs != null){
try{
rs.close();
}catch(SQLException e){
}
}
if(pstmt != null){
try{
pstmt.close();
}catch(SQLException e){
}
}
updateAction("0");
}
}
/**
* 해피오더 제고 테이블 상태 업데이트
*
* @param dsm 조회조건 데이터
* @return DataSet 조회 결과 데이터셋
*
* @throws Exception
*/
public static int updateStatus(HashMap param) {
PreparedStatement pstmt = null;
int rs = -1;
String sql = "";
sql = " UPDATE SPL_DAY_STOCK_HP \n";
sql = sql + " SET STATUS_DIV = ? \n"; //상태 업데이트
sql = sql + " , UPD_DATE = SYSDATE \n"; //업데이트 일자
sql = sql + " WHERE STOR_CD = ? \n";
sql = sql + " AND ITEM_CD = ? \n";
sql = sql + " \r\n";
try {
//System.out.println("Start updateStatus");
pstmt = dbConn.prepareStatement(sql) ;
pstmt.setString(1, (String) param.get("UPD_STATUS") );
pstmt.setString(2, (String) param.get("STOR_CD") );
pstmt.setString(3, (String) param.get("ITEM_CD") );
rs = pstmt.executeUpdate();
}catch(Exception e){
try {
dbConn.rollback();
} catch (SQLException e1) {
}
e.printStackTrace();
}finally{
try{
dbConn.commit();
if(pstmt != null){
pstmt.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
return rs;
}
public static boolean searchAction() {
ResultSet rs = null;
int intRs = 0;
PreparedStatement pstmt = null;
String sql = "";
sql = " SELECT NVL(CHAR_VAL_TITLE_VAL_01, 0) AS PRESS_YN \n";
sql = sql + " FROM MST_CMM_CD_DTL \n"; //상태 업데이트
sql = sql + " WHERE CMP_CD = 'PCKR' \n";
sql = sql + " AND CMM_GRP_CD = 'S0101' \n";
sql = sql + " AND CMM_CD = 'P' \n";
sql = sql + " \r\n";
try {
pstmt = dbConn.prepareStatement(sql) ;
rs = pstmt.executeQuery();
while(rs.next()){
intRs = rs.getInt("PRESS_YN");
}
}catch(Exception e){
e.printStackTrace();
}
return intRs==1?true:false;
}
public static int updateAction(String param) {
PreparedStatement pstmt = null;
int rs = -1;
String sql = "";
sql = " UPDATE MST_CMM_CD_DTL \n";
sql = sql + " SET CHAR_VAL_TITLE_VAL_01 = ? \n"; //상태 업데이트
sql = sql + " WHERE CMP_CD = 'PCKR' \n";
sql = sql + " AND CMM_GRP_CD = 'S0101' \n";
sql = sql + " AND CMM_CD = 'P' \n";
sql = sql + " \r\n";
try {
pstmt = dbConn.prepareStatement(sql) ;
pstmt.setString(1, param );
rs = pstmt.executeUpdate();
}catch(Exception e){
try{
dbConn.rollback();
}catch(SQLException se){
}
e.printStackTrace();
}finally{
try{
dbConn.commit();
if(pstmt != null){
pstmt.close();
}
}catch(SQLException e){
}
}
return rs;
}
/**
* 해피오더 점포 재고 JSON POST 통신
*
* @param dsm 조회조건 데이터
* @return DataSet 조회 결과 데이터셋
*
* @throws Exception
*/
public static void callHappyOrdApi(String sendJson, HashMap param) {
HttpURLConnection con = null;
BufferedReader in = null;
OutputStream os = null;
//JSON API URL(IP) 정보 -개발
String HP_IP = "http://apex.happypointcard.co.kr";
String URL = "/ho/soldout"; //매장 상품 결품 처리
//String sendJson = "";
//System.out.println("[ JSon Data ] =============================> " + sendJson);
try {
URL url = new URL( HP_IP + URL ); //웹 화면 MST409 승인 업체 관리에서 55 해피오더로 관리 됨
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(10000); //1000 millisecond 가 1초
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
con.setDoOutput(true); //POST 방식은 스트림 기반의 데이터 전송 방식이기 때문에 setDoOutput(true)를 실행
con.setDoInput(true); //Server 통신에서 입력 가능한 상태로 만듬
con.setRequestMethod("POST");
con.connect();
//System.out.println( "[ JSON SEND ] " + sendJson );
System.out.println( "[" + formatter.format(new Date()) + "] [" + chk + "] [INFO] " + sendJson);
os = con.getOutputStream();
os.write(sendJson.getBytes("UTF-8"));
os.close();
// 응답값 처리
in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
String receiveJson = "";
String strMap = "";
while((receiveJson = in.readLine()) != null) { // response를 차례대로 출력
//System.out.println( "[ JSON RECEIVE ] " + receiveJson );
//System.out.println( "[" + formatter.format(new Date()) + "] [" + chk + "] [INFO] " + receiveJson);
HashMap hm = new HashMap();
strMap = jSonToMapParsing(receiveJson).get("status").toString();
//System.out.println(strMap);
hm = jSonToMapParsing(strMap);
String strStatus = hm.get("status").toString().replace("\"", "");
String strCode = hm.get("code").toString().replace("\"", "");
String strMsg = hm.get("message").toString().replace("\"", "");
// 정상처리시 상태값 변경
if("200".equals(strStatus) && "20000".equals(strCode)){
updateStatus(param);
}else if("507".equals(strStatus) && "91005".equals(strCode)){
updateStatus(param);
}else{
String errMsg = "[ERROR] 점포코드/상품 [" + param.get("STOR_CD") + "/" + param.get("ITEM_CD") + "] status:" + strStatus + ",code:" + strCode + ",msg:" + strMsg ;
//System.out.println( "[" + formatter.format(new Date()) + "] [" + chk + "] [ERROR] "+ "status : " + strStatus.replace("\"", "") + ", code : " + strCode.replace("\"", "") );
errLog(param, errMsg);
}
}
in.close();
con.disconnect();
}catch (Exception e){
System.out.println( "[" + formatter.format(new Date()) + "] [" + chk + "] [ERROR] " + e.toString() );
}
}
public static int errLog(HashMap param, String errMsg) {
PreparedStatement pstmt = null;
PreparedStatement pstmt2 = null;
int rs = -1;
try {
String errSql = "";
errSql = " INSERT INTO SYS_BATCH_LOG (BATCH_ID ,BATCH_NM ,BATCH_TYPE ,START_DATE ,END_DATE ,SUCC_YN ,ERR_DESC ,REG_DATE ,REG_USER_ID ,UPD_DATE ,UPD_USER_ID) "
+ " VALUES ('YGY' ,'요기요 결품/재판매 API' ,'005' ,TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS') ,TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') ,1 ,'"+errMsg+"' ,SYSDATE ,'java_run' ,SYSDATE ,'java_run' ) " ;
String updSql = "";
updSql = " UPDATE SPL_DAY_STOCK_HP \n";
updSql = updSql + " SET STATUS_DIV = ? \n"; //상태 업데이트
updSql = updSql + " , UPD_DATE = SYSDATE \n"; //업데이트 일자
updSql = updSql + " WHERE STOR_CD = ? \n";
updSql = updSql + " AND ITEM_CD = ? \n";
updSql = updSql + " \r\n";
pstmt = dbConn.prepareStatement(errSql) ;
rs = pstmt.executeUpdate();
//System.out.println("Start updateStatus");
pstmt2 = dbConn.prepareStatement(updSql) ;
pstmt2.setString(1, (String) param.get("UPD_STATUS") );
pstmt2.setString(2, (String) param.get("STOR_CD") );
pstmt2.setString(3, (String) param.get("ITEM_CD") );
rs = pstmt2.executeUpdate();
}catch(Exception e){
e.printStackTrace();
try {
dbConn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
try{
dbConn.commit();
if(pstmt != null){
pstmt.close();
}
if(pstmt2 != null){
pstmt2.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
return rs;
}
public static String isNull(String source, String value) {
String retVal;
if(source == null || source.trim().equals("") || source.trim().equals("null")) {
retVal = value;
} else {
retVal = source.trim();
}
return retVal;
}
public static String MapTojSonParsing(Map hmData) {
Gson gson = new GsonBuilder().disableHtmlEscaping().serializeNulls().create();
String sb = gson.toJson(hmData);
return sb.toString();
}
public static HashMap jSonToMapParsing(String sjson) {
JsonObject obj =(JsonObject) new com.google.gson.JsonParser().parse(sjson);
//new JsonParser().parse(sjson).getAsJsonObject(); //
Iterator i = obj.entrySet().iterator();
HashMap map = new HashMap();
while (i.hasNext()) {
Map.Entry e = (Map.Entry)i.next();
map.put((String)e.getKey(), e.getValue());
}
return map;
}
}