JAVA開發的一個同步程序

package com.palic.elis.tjs.ceis.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import tjs.plugins.jdbc.DBOperateFactory;
import com.beetle.framework.log.SysLogger;

public class SyncVipToLcchCeisCustomerContactTmp {
 SysLogger logger = SysLogger.getInstance("JobRunLog");
 // 中心庫
 private static final String ELIS_DATA_SOURCE = "ELIS_DB";
 private static final String VIP_DATA_SOURCE = "VIP_DB";
 // JOB名字
 private static final String PRAISE_JOB_NAME = "SyncVipToLcchCeisCustomerContactTmpJob";// TJS同步數據到CEIS臨時表
 private static final String SQL_SWITCH_QUERY = "SELECT TO_CHAR(CONTROL_DATE,'yyyy-mm-dd') LAST_SYNC,to_char(sysdate,'yyyy-mm-dd') TODAY, CONTROL_CHAR SWITCH_FLAG FROM ceis_control WHERE control_id = 'SyncVipToLcchCeisCustomerContactTmpJob'";
 private static final String SQL_SWITCH_UPDATE = "UPDATE ceis_control SET CONTROL_DATE =SYSDATE WHERE control_id = 'SyncVipToLcchCeisCustomerContactTmpJob'";
 // VIP系統同步數據到CEIS臨時表查詢語句
 private static final String SQL_QUERY_Userdefined_LIST = "select  Contact_Type_Id,"
   + "Contact_Id,"
   + "Channel_Id,"
   + "Date_Start,"
   + "'02' motive_type,"
   + "SYSTEM_ID,"
   + "Motive_Result_Id,"
   + "Activity_Id,"
   + "Activity_Type,"
   + "Url_Content,"
   + "Match_Flag,"
   + "Mem_Name,"
   + "Sex,"
   + "to_char(Date_Birthday,'yyyy-mm-dd') Date_Birthday,"
   + "ID_Type,"
   + "ID_No," + "Row_id" + " from  " + " order_info_to_lcch_temp";
 // 根據五項信息查詢客戶號信息
 private static final String SQL_QUERY_UserClientno_LIST = "SELECT CLIENTNO FROM ecif_client_info WHERE id_type = decode(ltrim(rtrim(?)),'***','1','護照','2','軍人證','3','少兒證','4','異常***','5','港澳臺證件','6','戶口本','0','轉換不詳','9','出生證','A','9')"
   + " AND ((id_type = '1' AND elis_ecif_package.func_is_idno_equal(idno,  ltrim(rtrim(?))) = 'Y') OR (id_type <> '1' AND upper(idno) = upper( ltrim(rtrim(?))))) "
   + " AND client_name =  ltrim(rtrim(?)) "
   + "AND trunc(birth_date, 'DD') = trunc(to_date(?,'yyyy-mm-dd'), 'DD') "
   + "AND sex = decode(ltrim(rtrim(?)),'男','M','女','F','9') and rownum=1 ";
 // 插入到CEIS的CEIS_CUSTOMER_CONTACT_TMP表
 private static final String SQL_INSERT_KIT_INFO_LIST = "insert into ceis_customer_contact_new_tmp (module_code,contact_type_id,contact_id,channel_id,date_start,client_no ,motive_type ,system_id ,motive_result_id,activity_id ,activity_type  ,url_content , match_flag) values(?,?,?,?,?,?,?,?,?,?,?,?,?)";
 // 更新VIP系統同步標誌
 private static final String SQL_VIP_UPDATE = "update order_info_to_lcch_temp set is_synchronized=?, CREATED=SYSDATE, CREATED_BY=USER ,LAST_UPD=SYSDATE,  LAST_UPD_BY=USER ";

 // 維護ceis_activity_table基表
 private static final String SQL_Query_PROD_INFO_TO_LCCH_TEMP = "select trim(row_id) row_id, trim(a.prod_code)prod_code ,trim(a.prod_name)prod_name from PROD_INFO_TO_LCCH_TEMP a  where a.is_synchronized='01'";
 // 查詢基表是否有
 private static final String SQL_Query_Ceis_Activity_Table_CNT = "select  count(*)cnt from ceis_activity_table a where a.activity_type=?";
 // 插入基表
 private static final String SQL_Insert_Ceis_Activity_Table = "insert into ceis_activity_table( activity_type,module_code,description) values(?,?,?)";
 // 更新VIP產品表的同步標誌
 private static final String SQL_UPDATE_PROD_INFO_TO_LCCH_TEMP = "update  prod_info_to_lcch_temp a set a.is_synchronized=?,a.created=sysdate,a.created_by=user,a.last_upd=sysdate,a.last_upd_by=user";
 // 記錄日誌
 private static final String SQL_TJS_CEIS_TRACE_LOG = "insert into  ceis_trace(ctrlno,trace_info,trace_type)values('SyncVipToLcchCeisCustomerContactTmpJob',?,'-1')";
 private static final String SQL_TJS_MONITOR_INS = "insert into elis_tjs_jobs_monitor(job_name,execute_date,source,target,source_count,target_count) values(?,sysdate,?,?,?,?)";

 private final Connection connElis;
 private final Connection connVip;
 private final int commitCnt = 10;

 public SyncVipToLcchCeisCustomerContactTmp() {
  connElis = DBOperateFactory.getConncetion(ELIS_DATA_SOURCE);
  connVip = DBOperateFactory.getConncetion(VIP_DATA_SOURCE);
 }

 // 獲取開關
 public Map<String, Object> getJobSwitch() {
  try {
   return queryForMap(connElis, SQL_SWITCH_QUERY);
  } catch (Exception ex) {
   logger.info("getJobSwitch ", ex);
  }
  return new HashMap<String, Object>();
 }

 // 更新開關日期
 public final int updateJobSwitch() {
  try {
   return updateSql(connElis, SQL_SWITCH_UPDATE);
  } catch (SQLException ex) {
   logger.info("updateJobSwitch", ex);
  }
  return 0;
 }

 // 運行
 @SuppressWarnings({ "rawtypes" })
 public void run() {
  try {
   // 查詢開關日期,防止重複同步
   Map switchMap = getJobSwitch();
   String last = (String) switchMap.get("LAST_SYNC");
   String today = (String) switchMap.get("TODAY");
   if (last == null || last.compareTo(today) < 0) {
    // VIP同步數據到CEIS臨時表語句
    syncDepraiseData(last);
    // 更新開關日期
    updateJobSwitch();
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 // VIP同步數據到CEIS臨時表語句
 public void syncDepraiseData(String day) throws SQLException {
  int cnt = 0;
  int count = 0;
  StringBuffer st = new StringBuffer();
  ResultSet rtype = null;
  ResultSet qcnt = null;
  String pcode = null;
  String Rowid = null;
  PreparedStatement quertype = null;
  PreparedStatement querycnt = null;
  PreparedStatement insertable = null;
  PreparedStatement update = null;
  List<String> CommitProdList = new ArrayList<String>();
  // 維護基表
  logger.info("------維護基表開始-----");
  try {
   // 查詢VIP系統沒有同步的業務類型
   quertype = connVip
     .prepareStatement(SQL_Query_PROD_INFO_TO_LCCH_TEMP);
   // 查詢基表是否已經存在
   querycnt = connElis
     .prepareStatement(SQL_Query_Ceis_Activity_Table_CNT);
   // 如果沒有則插入到基表
   insertable = connElis
     .prepareStatement(SQL_Insert_Ceis_Activity_Table);
   // 更新VIP產品表的同步標誌
   update = connVip
     .prepareStatement(SQL_UPDATE_PROD_INFO_TO_LCCH_TEMP);
   // 查詢產品表
   rtype = quertype.executeQuery();
   /*
    * 基表維護 1、首先取出VIP系統的產品表同步標誌爲沒有同步的數據。
    * 2、根據不同的VIP增值服務類型給產品編碼拼接前綴查詢ceis_activity_table的業務類型如果沒有需要插入進去。
    * 3、每插入一條到ceis_activity_table表就需要更新VIP系統的產品表同步標誌。 4、如果報錯記錄日誌。
    * VIP增值服務申請/預約= VIPSV001(需要和產品組合) VIP增值服務訂單取消= VIPSV002(需要和產品組合)
    * VIP增值服務訂單諮詢= VIPSV003(不需要和產品組合) VIP增值服務投訴= VIPSV004(不需要和產品組合)
    * VIP增值服務使用= VIPSV005(需要和產品組合)
    */
   while (rtype.next()) {
    logger.info("source Row_id " + rtype.getString("Row_id"));
    String[] a = { "VIPSV001_", "VIPSV002_", "VIPSV005_" };
    String[] b = { "增值服務申請/預約_", "VIP增值服務訂單取消_", "VIP增值服務使用_" };
    CommitProdList.add(rtype.getString("Row_id"));
    for (int i = 0; i < a.length; i++) {
     pcode = null;
     String description = null;
     pcode = a[i] + rtype.getString("prod_code");
     description = b[i] + rtype.getString("prod_name");
     querycnt.setString(1, pcode);
     qcnt = querycnt.executeQuery();
     while (qcnt.next()) {
      if (qcnt.getString("cnt").equals("0")) {
       insertable.setString(1, null);
       insertable.setString(2, "30");
       insertable.setString(3, description);
       insertable.execute();
      }
     }
    }
    CommitProdList.clear();
   }
  } catch (Exception e) {
   logger.info("VIP系統同步到CEIS基表數據報:" + e.getMessage());
   for (String rowid : CommitProdList) {
    insert_ceis_trace_Log("VIP系統同步到CEIS基表數據報錯主鍵爲:"
      + rowid+ "錯誤信息爲:"
      + e.getMessage());
   }
   CommitProdList.clear();

  } finally {

   // 關閉連接
   try {
    if (quertype != null) {
     quertype.executeBatch();
     quertype.close();
    }
    if (querycnt != null) {
     querycnt.executeBatch();
     querycnt.close();
    }

    if (insertable != null) {
     insertable.executeBatch();
     insertable.close();
    }

    if (update != null) {
     update.setString(1, "02");
     update.execute();
     update.close();
    }
   } catch (SQLException e) {
    e.printStackTrace();
    logger.info("關閉鏈接異常" + e.getMessage());
   }
  }
  logger.info("------維護基表結束-----");
  /*
   * 同步VIP數據到CEIS臨時表 1、首先是JOB開關打開、查詢VIP系統是否有沒有同步的數據。
   * 2、逐條處理,根據VIP系統的五項信息查詢查詢出客戶號。 3、查詢出來的信息插入到CEIS臨時表。 4、更新VIP系統的同步標誌。
   * 5、關閉連接、記錄日誌。
   */
  try {
   // 查詢VIP未同步的數據
   String sql = SQL_QUERY_Userdefined_LIST;
   if (day != null && !"".equals(day)) {
    sql = SQL_QUERY_Userdefined_LIST + " where  created> to_date('"
      + day + "','yyyy-mm-dd')and Is_Synchronized='01'";
   }
   logger.info("VIP系統同步到CEIS臨時表查詢SQL語句:" + sql);
   PreparedStatement psql = connVip.prepareStatement(sql);
   // 插入到CEIS的CEIS_CUSTOMER_CONTACT_TMP表
   PreparedStatement isql = connElis
     .prepareStatement(SQL_INSERT_KIT_INFO_LIST);
   // 根據五項信息查詢客戶號信息
   PreparedStatement qclientno = connElis
     .prepareStatement(SQL_QUERY_UserClientno_LIST);
   // 記錄錯誤日誌
   PreparedStatement ceislog = connElis
     .prepareStatement(SQL_TJS_CEIS_TRACE_LOG);
   // 更新VIP系統同步標誌
   PreparedStatement vipsign = connVip
     .prepareStatement(SQL_VIP_UPDATE);
   ResultSet rs = null;
   ResultSet scup = null;
   ResultSet rno = null;
   String clientno = null;
   List<String> commitDataList = new ArrayList<String>();
   try {
    psql.setFetchSize(1000);
    isql.setFetchSize(1000);
    // 查詢出VIP系統的同步數據
    rs = psql.executeQuery();
    ResultSetMetaData rsmt = rs.getMetaData();
    // 循環逐條處理
    while (rs.next()) {
     cnt++;
     try {
      clientno = null;
      // 根據五項信息定位唯一客戶
      qclientno.setString(1, rs.getString("ID_TYPE"));
      qclientno.setString(2, rs.getString("ID_NO"));
      qclientno.setString(3, rs.getString("ID_NO"));
      qclientno.setString(4, rs.getString("MEM_NAME"));
      qclientno.setString(5, rs.getString("DATE_BIRTHDAY"));
      qclientno.setString(6, rs.getString("SEX"));
      System.out.println("source ID_TYPE "
        + rs.getString("ID_TYPE") + " IDNO "
        + rs.getString("ID_NO") + " CLIENT_NAME "
        + rs.getString("MEM_NAME") + " DATE_BIRTHDAY "
        + rs.getString("DATE_BIRTHDAY") + " SEX "
        + rs.getString("SEX"));

      // 查詢客戶號
      rno = qclientno.executeQuery();
      rno.next();
      if (rno.getRow() == 0) {
       logger.info("以上五項信息沒有取到客戶號");
       ceislog.setString(1,
         "主鍵Row_id爲" + rs.getString("Row_id")
           + "根據五項信息沒有查到對應的客戶號");
       vipsign.setString(1, "2");
       vipsign.executeUpdate();
       ceislog.executeUpdate();
      } else if (rno.getRow() == 1) {
       count++;
       // 取到一個客戶號,同步數據
       clientno = rno.getString("CLIENTNO");
       logger.info("clientno取出來的客戶號:" + clientno);
       commitDataList.add(rs.getString("Row_id"));
       isql.setString((1), "30");
       isql.setString((2), rs.getString("contact_type_id"));
       isql.setString((3), rs.getString("contact_id"));
       isql.setString((4), rs.getString("channel_id"));
       isql.setTimestamp((5),
         rs.getTimestamp("date_start"));
       isql.setString(6, clientno);
       isql.setString((7), rs.getString("motive_type"));
       isql.setString((8), rs.getString("system_id"));
       isql.setString((9),
         rs.getString("motive_result_id"));
       isql.setString((10), rs.getString("activity_id"));
       isql.setString((11), rs.getString("activity_type"));
       isql.setString((12), rs.getString("url_content"));
       isql.setString((13), rs.getString("match_flag"));
       // 成功後更新VIP表的同步狀態
       vipsign.setString(1, "02");
       isql.addBatch();
       vipsign.addBatch();
      }
      if (cnt % commitCnt == 0) {// 每1000條提交
       isql.executeBatch();
       // vipsign.executeBatch();
       if (ceislog != null)
        ceislog.executeBatch();
       commitDataList.clear();
      }
     } catch (Exception e) {
      if (vipsign != null) {
       vipsign.close();
      }
      connElis.rollback();
      connVip.rollback();
      vipsign = connVip.prepareStatement(SQL_VIP_UPDATE);

      for (String rowid : commitDataList) {
       insert_ceis_trace_Log("VIP系統同步到CEIS臨時表數據報錯主鍵爲:"
         + rowid + "錯誤信息爲" + e.getMessage());
       count = count - 1;
      }
      commitDataList.clear();
     }
    }
    // 執行最後一次批量
    if (cnt % commitCnt != 0) {
     try {
      if (isql != null) {
       isql.executeBatch();
      }
      if (vipsign != null) {
       vipsign.executeBatch();
      }
      if (ceislog != null) {
       ceislog.executeBatch();
      }
      commitDataList.clear();
     } catch (Exception e) {
      if (vipsign != null)
       vipsign.close();
      connElis.rollback();
      vipsign = connVip.prepareStatement(SQL_VIP_UPDATE);
      for (String rowid : commitDataList) {
       logger.info("VIP系統同步到CEIS臨時表數據報錯主鍵爲:" + rowid
         + "錯誤信息爲" + e.getMessage());
       insert_ceis_trace_Log("VIP系統同步到CEIS臨時表數據報錯主鍵爲:"
         + rowid + "錯誤信息爲" + e.getMessage());
       count = count - 1;
      }
      commitDataList.clear();
     }
    }
   } catch (Exception e) {
    logger.info("VIP系統同步到CEIS臨時表數據報錯:" + e.getMessage());
   } finally {
    if (psql != null) {
     psql.close();
    }
    if (isql != null) {
     isql.close();
    }

    if (qclientno != null) {
     qclientno.close();
    }

    if (vipsign != null) {
     vipsign.close();
    }
    if (ceislog != null) {
     ceislog.close();
    }
   }
  } catch (Exception e) {
   count = (cnt - commitCnt) < 0 ? 0 : (cnt - commitCnt);
   logger.info("VIP系統同步到CEIS臨時表數據報錯" + e.getMessage());
   insert_ceis_trace_Log(e.getMessage());
  } finally {
   insertTjsLog(PRAISE_JOB_NAME, String.valueOf(cnt),
     String.valueOf(count));
  }
 }

 // 插入到TJS對賬日誌表
 public void insertTjsLog(String jobName, String sourceCnt, String targetCnt) {
  PreparedStatement psql;
  try {
   psql = connElis.prepareStatement(SQL_TJS_MONITOR_INS);
   psql.setString(1, jobName);
   psql.setString(2, VIP_DATA_SOURCE);
   psql.setString(3, ELIS_DATA_SOURCE);
   psql.setString(4, sourceCnt);
   psql.setString(5, targetCnt);
   psql.executeUpdate();
  } catch (SQLException e) {
   logger.info("記錄TJS日誌報錯" + e);
   e.printStackTrace();
  }
 }

 // 關閉數據庫連接
 public void close() {
  try {
   if (connElis != null) {
    connElis.close();
   }
   if (connVip != null) {
    connVip.close();
   }
  } catch (SQLException e) {
   logger.error("關閉數據庫連接失敗", e);
  }
 }

 // 插入到ceis_trace
 public void insert_ceis_trace_Log(String trace_info) {
  PreparedStatement psql;
  try {
   psql = connElis.prepareStatement(SQL_TJS_CEIS_TRACE_LOG);
   psql.setString(1, trace_info);
   psql.execute();

  } catch (SQLException e) {
   logger.info("記錄ceis_trace日誌報錯" + e);
   e.printStackTrace();
  }
 }

 private Map<String, Object> queryForMap(final Connection conn,
   final String sql) throws SQLException {
  List<Map<String, Object>> list = queryForList(conn, sql);
  return list.isEmpty() ? new HashMap<String, Object>() : list.get(0);
 }

 private int updateSql(final Connection conn, final String sql)
   throws SQLException {
  PreparedStatement psql = conn.prepareStatement(sql);
  return psql.executeUpdate();
 }

 private List<Map<String, Object>> queryForList(final Connection conn,
   final String sql) throws SQLException {
  List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
  PreparedStatement psql = conn.prepareStatement(sql);
  Map<String, Object> dataRow = null;
  ResultSet rs = null;
  psql.setFetchSize(1000);
  rs = psql.executeQuery();
  ResultSetMetaData rsmt = rs.getMetaData();
  while (rs.next()) {
   dataRow = new HashMap<String, Object>();
   for (int i = 1; i <= rsmt.getColumnCount(); i++) {
    if ("java.lang.String".equals(rsmt.getColumnClassName(i))) {
     dataRow.put(rsmt.getColumnLabel(i), rs.getString(i));
    } else if ("java.sql.Timestamp".equals(rsmt
      .getColumnClassName(i))) {
     dataRow.put(rsmt.getColumnLabel(i), rs.getTimestamp(i));
    } else if ("java.math.BigDecimal".equals(rsmt
      .getColumnClassName(i))) {
     dataRow.put(rsmt.getColumnLabel(i), rs.getBigDecimal(i));
    } else {
     throw new SQLException("Unsupport column type");
    }
   }
   resultList.add(dataRow);
  }
  return resultList;
 }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章