diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..ed17839 --- /dev/null +++ b/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/jsch-0.1.55.jar b/lib/jsch-0.1.55.jar new file mode 100644 index 0000000..1a64e71 Binary files /dev/null and b/lib/jsch-0.1.55.jar differ diff --git a/lib/log4j-1.2.17.jar b/lib/log4j-1.2.17.jar new file mode 100644 index 0000000..068867e Binary files /dev/null and b/lib/log4j-1.2.17.jar differ diff --git a/lib/ojdbc6-12.1.0.1.jar b/lib/ojdbc6-12.1.0.1.jar new file mode 100644 index 0000000..ec3d6f1 Binary files /dev/null and b/lib/ojdbc6-12.1.0.1.jar differ diff --git a/lib/tibero6-jdbc.jar b/lib/tibero6-jdbc.jar new file mode 100644 index 0000000..7517a42 Binary files /dev/null and b/lib/tibero6-jdbc.jar differ diff --git a/src/main/java/BasicInfoDB2File.java b/src/main/java/BasicInfoDB2File.java new file mode 100644 index 0000000..de392b8 --- /dev/null +++ b/src/main/java/BasicInfoDB2File.java @@ -0,0 +1,443 @@ +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.log4j.Logger; + +public class BasicInfoDB2File { + private static String[] strParam = {"RF_ID Insert", "발생사 Insert", "면제PL", "사전등록결제", "미닙내역PL_inser", "경차PL_insert"}; + private static String[] g_strDB = new String[4]; + + private final Logger logger = Logger.getLogger(BasicInfoDB2File .class); + + public static void main(String[] args) { + try{ + + // 프로퍼티 파일 위치 + String propFile = "/gpta/source-app/cfs/relay_jar/config.properties"; + //String propFile = "./config.properties"; + + // 프로퍼티 객체 생성 + Properties props = new Properties(); + + // 프로퍼티 파일 스트림에 담기 + FileInputStream fis = new FileInputStream(propFile); + + // 프로퍼티 파일 로딩 + props.load(new java.io.BufferedInputStream(fis)); + + // 항목 읽기 + g_strDB[0] = props.getProperty("db_driver") ; + g_strDB[1] = props.getProperty("db_connect") ; + g_strDB[2] = props.getProperty("db_id") ; + g_strDB[3] = props.getProperty("db_pw") ; + + // 콘솔 출력 + System.out.println(String.format("=== DB접속정보 : %s, %s, %s", g_strDB[1], g_strDB[2], g_strDB[3])) ; + }catch(Exception e){ + e.printStackTrace(); + } + + for(int i = 0; i < strParam.length; i++) + System.out.println(String.format("=== 실행 구분 : [%d] - %s", i, strParam[i])); + + String runGubun = args[0]; + System.out.println("=== 실행 구분 : " + runGubun); + try { + BasicInfoDB2File obj = new BasicInfoDB2File(); + if(runGubun.equals("0") == true) + obj.runInsertTbRfid(); + else if(runGubun.equals("1") == true) { + obj.runInsertTbIssue("T_PREFIX_INFO_A"); + obj.runInsertTbIssue("T_PREFIX_INFO_B"); + } + else if(runGubun.equals("2") == true) + obj.runMakeExemptCsv(); + else + System.out.println("=== 잘못된 파라미터 입력 "); + } catch (Exception e) { + e.printStackTrace(); + } + + System.exit(0); + } + + public BasicInfoDB2File() { + + } + + private int getFtpData(String fileNm) { + + FTPUtil sftp = new FTPUtil(); + + this.logger.debug("======== 다운로드 시작 : " + fileNm); + + sftp.init("175.193.201.56", "tmax","tmax1234"); + + Map map = new HashMap(); + map.put("return", "0"); + sftp.download2("/gpta/source-web/cfs/relay/data/", fileNm, "/gpta/source-app/cfs/relay_jar/" + fileNm, map); + this.logger.debug("======== : " + map.get("return")); + + int nReturn = Integer.parseInt(map.get("return")); + if(nReturn > 0) { + sftp.fileDelete("/gpta/source-web/cfs/relay/data/" + fileNm); + } + + sftp.disconnect(); + + this.logger.debug("======== 다운로드 끝 : " + nReturn); + + return nReturn; + } + + // + private Connection getOrclConn( ) throws Exception{ + Class.forName(g_strDB[0]); + return DriverManager.getConnection(g_strDB[1], g_strDB[2], g_strDB[3]); + } + + + @SuppressWarnings("resource") + public double runInsertTbRfid() { + long start = System.currentTimeMillis(); // 작동 시간 측정용 + + Date time = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMdd"); + + String strFile = String.format("/gpta/source-app/cfs/relay_jar/RFID_CARS_INFO_%s.CSV", sdf.format(time)); + + if(getFtpData(String.format("RFID_CARS_INFO_%s.CSV", sdf.format(time))) < 0) { + this.logger.debug("===== 다운로드 대상 파일 없음"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + String sql = ""; + BufferedReader br = null; + + Connection conn = null; // 통상 Connection으로 선언 + PreparedStatement ps = null; // 통상 PreparedStatement로 선언 + try { + this.logger.debug("======== runInsertTbRfid start"); + + conn = getOrclConn(); + conn.setAutoCommit(false); // 자동 commit 끔 + + this.logger.debug("======== runInsertTbRfid 1"); + ps = conn.prepareStatement("delete from RFID_INFO"); + ps.execute(); + + this.logger.debug("======== runInsertTbRfid 2"); + int n = 0; + + sql = "Insert into RFID_INFO (RFID_TAG, CAR_NO, CAR_TYPE_KBN, DAMAGE_NO, WEEK_WRONG_NO, CAR_NO_HEX) "; + sql = sql + " values (?, ?, ?, ?,?, ?) "; + + this.logger.debug("======== runInsertTbRfid 3"); + + this.logger.debug("======== runInsertTbRfid " + sdf.format(time)); + String str1 = ""; + String str2 = ""; + String str3 = ""; + String str4 = ""; + String str5 = ""; + String str6 = ""; + + this.logger.debug("======== runInsertTbRfid 4"); + br = Files.newBufferedReader(Paths.get(strFile)); + Charset.forName("UTF-8"); + String line = ""; + + ps = (PreparedStatement) conn.prepareStatement(sql); + while ((line = br.readLine()) != null) { + this.logger.debug("===== " + n); + n++; + + if (n == 1) { + continue; + } + String array[] = line.split(",", -1); + + str1 = array[0].replaceAll("\"", ""); + str2 = array[1].replaceAll("\"", ""); + str3 = array[2].replaceAll("\"", ""); + str4 = array[3].replaceAll("\"", ""); + str5 = array[4].replaceAll("\"", ""); + str6 = PLUploader.runCarNo2Code(str2); + + ps.setString(1, str1); + ps.setString(2, str2); + ps.setString(3, str3); + ps.setInt(4 ,Integer.parseInt(str4)); + ps.setInt(5,Integer.parseInt(str5.trim())); + ps.setString(6, str6); + // this.logger.debug(String.format("'%s', '%s', '%s', '%s'", + // String.format("to_date('%s','YYYYMMDDHH24MISS'", str1), str2, + // str3, str4)); + ps.addBatch(); // OraclePreparedStatement에 batch로 완성된 SQL 추가 + ps.clearParameters(); // OraclePreparedStatement에 지정된 Parameter값 초기화 + + if (n % 100 == 0) { + ps.executeBatch(); // 누적된 batch 실행 + ps.clearBatch(); // 누적된 batch 초기화 + conn.commit(); // Commit하여 적용 + + this.logger.debug("===== commit ok"); + } else if (n % 10 == 0) { + this.logger.debug("===== : " + n); + } + } // end while + + // 최종적으로 누적된 채 남은 batch 작업(위의 if문) 실행 + ps.executeBatch(); + ps.clearBatch(); + conn.commit(); + + + File file = new File(strFile); + File file2 = new File(String.format("/gpta/source-app/cfs/relay_jar/data/RFID_CARS_INFO_%s.CSV", sdf.format(time))); + if (file.exists()) { + file.renameTo(file2); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if(ps != null) + ps.close(); + if(conn != null) + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + this.logger.debug("===== insert ok"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + + this.logger.debug("======== runInsertTbRfid end"); + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + public double runInsertTbIssue(String strFileName) { + long start = System.currentTimeMillis(); // 작동 시간 측정용 + + Date time = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMdd"); + + String strFile = String.format("/gpta/source-app/cfs/relay_jar/%s.CSV", strFileName); + + if(getFtpData(String.format("%s.CSV", strFileName)) < 0) { + this.logger.debug("===== 다운로드 대상 파일 없음"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + BufferedReader br = null; + + Connection conn = null; // 통상 Connection으로 선언 + PreparedStatement ps = null; // 통상 PreparedStatement로 선언 + try { + this.logger.debug("======== runInsertTbIssue start"); + + conn = getOrclConn(); + conn.setAutoCommit(false); // 자동 commit 끔 + + this.logger.debug("======== runInsertTbRfid 2"); + int n = 0; + + + StringBuffer strSQL = new StringBuffer(); + strSQL.append(" insert INTO T_PREFIX_INFO (CARD_COMP, COMP_CODE, BIN_CODE, ISS_CODE) ") ; + strSQL.append(" VALUES (?, ?, ?, ?)") ; + + + + this.logger.debug("======== runInsertTbRfid 3"); + + this.logger.debug("======== runInsertTbRfid " + sdf.format(time)); + String str1 = ""; + String str2 = ""; + String str3 = ""; + String str4 = ""; + + this.logger.debug("======== runInsertTbRfid 4"); + br = Files.newBufferedReader(Paths.get(strFile)); + Charset.forName("UTF-8"); + String line = ""; + + ps = (PreparedStatement) conn.prepareStatement(strSQL.toString()); + while ((line = br.readLine()) != null) { + this.logger.debug("===== " + n); + n++; + + String array[] = line.split(",", -1); + + str1 = array[0].replaceAll("\"", ""); + str2 = array[1].replaceAll("\"", ""); + str3 = array[2].replaceAll("\"", ""); + str4 = array[3].replaceAll("\"", ""); + + ps.setString(1, str1); + ps.setString(2, str2); + ps.setString(3, str3); + ps.setString(4, str4); + + try { + this.logger.debug("======== runInsertTbRfid 5"); + ps.executeUpdate(); + } + catch(SQLException ex) { + this.logger.debug("======== runInsertTbRfid 6"); + } + this.logger.debug("======== runInsertTbRfid 9"); + /* + ps.addBatch(); // OraclePreparedStatement에 batch로 완성된 SQL 추가 + ps.clearParameters(); // OraclePreparedStatement에 지정된 Parameter값 초기화 + + if (n % 100 == 0) { + ps.executeBatch(); // 누적된 batch 실행 + ps.clearBatch(); // 누적된 batch 초기화 + conn.commit(); // Commit하여 적용 + + this.logger.debug("===== commit ok"); + } else if (n % 10 == 0) { + this.logger.debug("===== : " + n); + }*/ + } // end while +/* + // 최종적으로 누적된 채 남은 batch 작업(위의 if문) 실행 + ps.executeBatch(); + ps.clearBatch(); +*/ + conn.commit(); + + + File file = new File(strFile); + File file2 = new File(String.format("/gpta/source-app/cfs/relay_jar/data/%s.CSV", strFileName)); + if (file.exists()) { + file.renameTo(file2); + } + + strSQL = new StringBuffer(); + strSQL.append(" UPDATE TB_CFS_TABLENOM ") ; + strSQL.append(" set TCRD_BIN_RVS_NO = DECODE(TCRD_BIN_RVS_NO, '99', '0', TCRD_BIN_RVS_NO)+ 1, ") ; + strSQL.append(" TCRD_BIN_UPDATE_DATE = SYSDATE, ") ; + strSQL.append(" TCRD_BIN_APPLY_DATE = SYSDATE") ; + + ps = conn.prepareStatement(strSQL.toString()); + ps.execute(); + conn.commit(); // Commit하여 적용 + this.logger.debug("===== update ok"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if(ps != null) + ps.close(); + if(conn != null) + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + + this.logger.debug("===== insert ok"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + + this.logger.debug("======== runInsertTbUssue end"); + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + + + @SuppressWarnings("resource") + public double runMakeExemptCsv() throws Exception { + long start = System.currentTimeMillis(); // 작동 시간 측정용 + + String sql = ""; + + Connection conn = null; // 통상 Connection으로 선언 + PreparedStatement ps = null; // 통상 PreparedStatement로 선언 + ResultSet rs = null; + + try { + conn = (Connection) getOrclConn(); // Connection 생성 시 Connection으로 형변환 + + // prepareStatement를 PreparedStatement으로 형변환 + + sql= "select to_char(ENFORCE_DATE, 'YYYYMMDDHH24MISS'), CAR_NO, CARS_TYPE_ID, FILE_KIND_ID, DATA_SEQNO, YEAR, MONTH, DAY, DOCUMENT_NO, CAR_TYPE_NAME, OWNER"; + sql+= " , to_char(END_DATE, 'YYYYMMDDHH24MISS'), to_char(DOCUMENT_DATE, 'YYYYMMDDHH24MISS'), POSITION_BODY, to_char(ACCEPT_DATE, 'YYYYMMDDHH24MISS')"; + sql+= " , REPLACE_KBN, REPLACE_CAR_NO, END_KBN, REMARKS, TRANS_FILE_CREATE_YN, to_char(CREATE_DATE, 'YYYYMMDDHH24MISS')"; + sql+= ", CREATER, to_char(UPDATE_DATE, 'YYYYMMDDHH24MISS'), UPDATER, EXEMPT_KBN, COMPANY_KBN, USE_REMARK"; + sql+= " from exempt_cars_info"; + + + ps = (PreparedStatement) conn.prepareStatement(sql); + rs = ps.executeQuery( sql ); + rs.setFetchSize(10000); + + Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY); + stmt.setFetchSize(10000); + rs = stmt.executeQuery( sql ); + + String str = ""; + int n = 0; + File file = new File("./vo co9n .csv"); + FileOutputStream fos = new FileOutputStream(file); + while (rs.next()) { + n++; + + str = String.format("%s,%s,%s,%s,%s,", rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5)); + str += String.format("%s,%s,%s,%s,%s,", rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9), rs.getString(10)); + str += String.format("%s,%s,%s,%s,%s,", rs.getString(11), rs.getString(12), rs.getString(13), rs.getString(14), rs.getString(15)); + str += String.format("%s,%s,%s,%s,%s,", rs.getString(16), rs.getString(17), rs.getString(18), rs.getString(19), rs.getString(20)); + str += String.format("%s,%s,%s,%s,%s,", rs.getString(21), rs.getString(22), rs.getString(23), rs.getString(24), rs.getString(25)); + str += String.format("%s,%s\r\n", rs.getString(26), rs.getString(27)); + fos.write(str.getBytes()); + + + if(n % 100 == 0) { + System.out.println("===== : " + str); + } + + } // end while + + fos.close(); + }catch(Exception e){ + e.printStackTrace(); + }finally{ + if(rs != null) + rs.close(); + if(ps != null) + ps.close(); + + conn.close(); + } + + System.out.println("===== insert ok"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + +} diff --git a/src/main/java/FTPUtil.java b/src/main/java/FTPUtil.java new file mode 100644 index 0000000..f2ecd92 --- /dev/null +++ b/src/main/java/FTPUtil.java @@ -0,0 +1,263 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.jcraft.jsch.Channel; +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import com.jcraft.jsch.SftpException; + +public class FTPUtil { + + private Session session = null; + private Channel channel = null; + private ChannelSftp channelSftp = null; + + private final Logger logger = Logger.getLogger(FTPUtil.class); + + public String mkdir(String path) throws SftpException { + String[] pathArray = path.split("/"); + + String currentDirectory = channelSftp.pwd() + "/"; + String totPathArray = ""; + + for (int i = 0; i < pathArray.length; i++) { + if (pathArray[i].length() == 0) + continue; + + totPathArray += pathArray[i] + "/"; + String currentPath = currentDirectory + totPathArray; + + try { + channelSftp.mkdir(currentPath); + channelSftp.cd(currentPath); + } catch (Exception e) { + channelSftp.cd(currentPath); + } + } + + return currentDirectory + "/" + totPathArray; + } + + public String mkdir2(String path) throws SftpException { + String[] pathArray = path.split("/"); + + String currentDirectory = "/"; + String totPathArray = ""; + + for (int i = 0; i < pathArray.length; i++) { + if (pathArray[i].length() == 0) + continue; + + totPathArray += pathArray[i] + "/"; + String currentPath = currentDirectory + totPathArray; + + try { + channelSftp.mkdir(currentPath); + channelSftp.cd(currentPath); + channelSftp.chmod(511, currentPath); + } catch (Exception e) { + channelSftp.cd(currentPath); + } + } + + return currentDirectory + "/" + totPathArray; + } + + public void init(String host, String user, String password) { + System.out.println(host); + System.setProperty("java.net.preferIPv4Stack", "true"); + + System.out.println("==> Connecting to " + host); + + // 1. JSch 객체를 생성한다. + JSch jsch = new JSch(); + try { + // 2. 세션 객체를 생성한다(사용자 이름, 접속할 호스트, 포트를 인자로 전달한다.) + session = jsch.getSession(user, host, 10040); + + // 3. 패스워드를 설정한다. + session.setPassword(password); + + // 4. 세션과 관련된 정보를 설정한다. + java.util.Properties config = new java.util.Properties(); + // 4-1. 호스트 정보를 검사하지 않는다. + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + + System.out.println("======== 1: "); + // 5. 접속한다. + session.connect(); + System.out.println("======== 2: "); + + // 6. sftp 채널을 연다. + channel = session.openChannel("sftp"); + + // 7. 채널에 연결한다. + channel.connect(); + } catch (JSchException e) { + e.printStackTrace(); + } + + // 8. 채널을 FTP용 채널 객체로 캐스팅한다. + channelSftp = (ChannelSftp) channel; + System.out.println("==> Connected to " + host); + } + + public void upload(String dir, File file, boolean isChmod) throws SftpException, IOException { + FileInputStream in = null; + + in = new FileInputStream(file); + channelSftp.cd(dir); + channelSftp.put(in, file.getName()); + in.close(); + + if(isChmod == true) { + channelSftp.chmod(511, dir); // Integer.parseInt("777", 8) + channelSftp.chmod(511, file.getName()); + } + } + + public void upload(String dir, File file, String old, String neo) throws SftpException, IOException { + FileInputStream in = null; + + in = new FileInputStream(file); + channelSftp.cd(dir); + channelSftp.put(in, file.getName()); + in.close(); + + channelSftp.chmod(511, dir); // Integer.parseInt("777", 8) + channelSftp.chmod(511, old); + channelSftp.rename(old, neo); + } + + public void upload2(String dir, File file, String old, String neo) throws SftpException, IOException { + System.out.println("==> Uploading: " + file.getPath() ); + FileInputStream in = null; + try { + // 입력 파일을 가져온다. + in = new FileInputStream(file); + + // 업로드하려는 위치르 디렉토리를 변경한다. + channelSftp.cd(dir); + + // 파일을 업로드한다. + channelSftp.put(in, file.getName()); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + // 업로드된 파일을 닫는다. + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + System.out.println("==> Uploaded: " + file.getPath()); + } + + public void upload3(String dir, File file, String old, String neo, Map map) throws SftpException, IOException { + System.out.println("==> Uploading: " + file.getPath() ); + FileInputStream in = null; + try { + // 입력 파일을 가져온다. + in = new FileInputStream(file); + + System.out.println("============= 1"); + System.out.println("============= dir : " + dir); + // 업로드하려는 위치르 디렉토리를 변경한다. + channelSftp.cd(dir); + + System.out.println("============= 2"); + // 파일을 업로드한다. + channelSftp.put(in, file.getName()); + System.out.println("============= 3"); + } catch (Exception e) { + e.printStackTrace(); + map.put("return", "-1"); + return; + } finally { + try { + // 업로드된 파일을 닫는다. + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + map.put("return", "1"); + System.out.println("==> Uploaded: " + file.getPath()); + } + + public void download2(String dir, String downloadFileName, String path, Map map) { + + InputStream in = null; + FileOutputStream out = null; + try { + channelSftp.cd(dir); + in = channelSftp.get(downloadFileName); + } catch (SftpException e) { + e.printStackTrace(); + map.put("return", "-1"); + return; + } + + try { + out = new FileOutputStream(new File(path)); + + int i; + while ((i = in.read()) != -1) { + out.write(i); + } + } catch (IOException e) { + e.printStackTrace(); + map.put("return", "-1"); + } finally { + try { + out.close(); + in.close(); + } catch (IOException e) { + e.printStackTrace(); + map.put("return", "-1"); + } + } + + map.put("return", "1"); + } + + public void fileDelete(String fileName){ + try { + channelSftp.rm(fileName); + } catch (SftpException e) { + e.printStackTrace(); + } + } + + public InputStream download(String dir, String fileNm) { + InputStream in = null; + String path = ""; + + System.out.println(path + dir); + try { + channelSftp.cd(path + dir); + in = channelSftp.get(fileNm); + + } catch (SftpException se) { + this.logger.debug("Exception : " + se); + } + + return in; + } + + public void disconnect() { + channelSftp.quit(); + session.disconnect(); + } +} diff --git a/src/main/java/FileMove.java b/src/main/java/FileMove.java new file mode 100644 index 0000000..5fa01f8 --- /dev/null +++ b/src/main/java/FileMove.java @@ -0,0 +1,214 @@ + + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +public class FileMove { + + public static void main(String[] args) { + /* + FileMove.makeDir(); + + FileMove.makeDirSub(); + */ + + FileMove.copyData(); + } + + public static void copyData() { + try { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); //년월일 표시 + SimpleDateFormat sdf_4 = new SimpleDateFormat("yyyy"); + //dateFormat = new SimpleDateFormat("yyyyMM"); //년월 표시 + + Calendar cal = Calendar.getInstance(); + + cal.set ( 2019, 12-1, 31 ); //종료 날짜 셋팅 + String endDate = dateFormat.format(cal.getTime()); + + cal.set ( 2016, 1-1, 1 ); //시작 날짜 셋팅 + String startDate = dateFormat.format(cal.getTime()); + + int i = 0; + + String pathOrg = "E:\\혼잡_센터_이미지 백업\\DOTR"; //폴더 경로 + String path = "E:\\혼잡_센터_이미지 백업\\New"; //폴더 경로 + while(!startDate.equals(endDate)){ //다르다면 실행, 동일 하다면 빠져나감 + if(i==0) { //최초 실행 출력 + System.out.println(dateFormat.format(cal.getTime())); + } + + startDate = dateFormat.format(cal.getTime()); //비교를 위한 값 셋팅 + // 1호터널 + copyFile(String.format("%s\\\\%s\\\\01\\\\IMAGE", pathOrg, startDate) + , String.format("%s\\\\%s\\\\01\\\\%s", path, sdf_4.format(cal.getTime()), startDate)); + + // 3호터널 + copyFile(String.format("%s\\\\%s\\\\03\\\\IMAGE", pathOrg, startDate) + , String.format("%s\\\\%s\\\\03\\\\%s", path, sdf_4.format(cal.getTime()), startDate)); + + //cal.add(Calendar.MONTH, 1); //1달 더해줌 + cal.add(Calendar.DATE, 1); //1일 더해줌 + i++; + + } + } + catch(Exception e ) { + e.printStackTrace(); + } + } + + public static void copyFile(String pathOrg, String path) { + // 폴더 참조 + File original_dir = new File(pathOrg); // 절대경로 + File move_dir = new File(path); + + if (original_dir.exists()) { + // 폴더의 내용물 확인 -> 폴더 & 파일.. + File[] fileNames = original_dir.listFiles(); // 내용 목록 반환 + + System.out.println("--------------파일 읽기-----------------"); + + for (int i = 0; i < fileNames.length; i++) { + if (fileNames[i].isFile()) { + if (fileNames[i].exists()) { + if (original_dir.exists()) { + } + File MoveFile = new File(move_dir, fileNames[i].getName()); + fileNames[i].renameTo(MoveFile); // 변경(이동) + System.out.println(fileNames[i].getName()); // 폴더내에 있는 파일 리스트 + } + } + } // end for + } + + System.out.println(pathOrg); // 폴더내에 있는 파일 리스트 + System.out.println(path); // 폴더내에 있는 파일 리스트 + } + + public static void makeDirSub() { + + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); //년월일 표시 + SimpleDateFormat sdf_4 = new SimpleDateFormat("yyyy"); + //dateFormat = new SimpleDateFormat("yyyyMM"); //년월 표시 + + Calendar cal = Calendar.getInstance(); + + cal.set ( 2019, 12-1, 31 ); //종료 날짜 셋팅 + String endDate = dateFormat.format(cal.getTime()); + + cal.set ( 2016, 1-1, 1 ); //시작 날짜 셋팅 + String startDate = dateFormat.format(cal.getTime()); + + int i = 0; + + String path = "E:\\혼잡_센터_이미지 백업\\New"; //폴더 경로 + File Folder = null; + while(!startDate.equals(endDate)){ //다르다면 실행, 동일 하다면 빠져나감 + if(i==0) { //최초 실행 출력 + System.out.println(dateFormat.format(cal.getTime())); + } + + startDate = dateFormat.format(cal.getTime()); //비교를 위한 값 셋팅 + + + Folder = new File(String.format("%s\\\\%s\\\\01\\\\%s", path, sdf_4.format(cal.getTime()), startDate)); + if (!Folder.exists()) { + try{ + Folder.mkdir(); //폴더 생성합니다. + System.out.println("폴더가 생성되었습니다."); + } + catch(Exception e){ + e.getStackTrace(); + } + }else { + System.out.println("이미 폴더가 생성되어 있습니다."); + } + Folder = new File(String.format("%s\\\\%s\\\\03\\\\%s", path, sdf_4.format(cal.getTime()), startDate)); + if (!Folder.exists()) { + try{ + Folder.mkdir(); //폴더 생성합니다. + System.out.println("폴더가 생성되었습니다."); + } + catch(Exception e){ + e.getStackTrace(); + } + }else { + System.out.println("이미 폴더가 생성되어 있습니다."); + } + + //cal.add(Calendar.MONTH, 1); //1달 더해줌 + cal.add(Calendar.DATE, 1); //1일 더해줌 + i++; + + } + } + + public static void makeDir() { + + SimpleDateFormat sdf_4 = new SimpleDateFormat ("yyyy"); + + Date dtStart = FileMove.getDate(2007, 1, 1, 0, 0, 0); + Date dtEnd = FileMove.getDate(2015, 12, 31, 23, 59, 59); + + long lStartYear = Long.parseLong(sdf_4.format(dtStart)); + long lEndYear = Long.parseLong(sdf_4.format(dtEnd)); + + File Folder = null; + for(long index = lStartYear; index <= lEndYear; index++) { + String path = "E:\\혼잡_센터_이미지 백업\\New"; //폴더 경로 + Folder = new File(String.format("%s\\\\%d", path, index)); + if (!Folder.exists()) { + try{ + Folder.mkdir(); //폴더 생성합니다. + System.out.println("폴더가 생성되었습니다."); + } + catch(Exception e){ + e.getStackTrace(); + } + }else { + System.out.println("이미 폴더가 생성되어 있습니다."); + } + + Folder = new File(String.format("%s\\\\%d\\\\01", path, index)); + if (!Folder.exists()) { + try{ + Folder.mkdir(); //폴더 생성합니다. + System.out.println("폴더가 생성되었습니다."); + } + catch(Exception e){ + e.getStackTrace(); + } + }else { + System.out.println("이미 폴더가 생성되어 있습니다."); + } + Folder = new File(String.format("%s\\\\%d\\\\03", path, index)); + if (!Folder.exists()) { + try{ + Folder.mkdir(); //폴더 생성합니다. + System.out.println("폴더가 생성되었습니다."); + } + catch(Exception e){ + e.getStackTrace(); + } + }else { + System.out.println("이미 폴더가 생성되어 있습니다."); + } + } + + } + + public static Date getDate(int year, int month, int date, int hour, int minute, int second) { + + Calendar cal = Calendar.getInstance(); + + cal.set(year, month-1, date, hour, minute, second); + cal.set(Calendar.MILLISECOND, 0); + + return cal.getTime(); + + } + +} diff --git a/src/main/java/MakeExemptInfo.java b/src/main/java/MakeExemptInfo.java new file mode 100644 index 0000000..82f4b8e --- /dev/null +++ b/src/main/java/MakeExemptInfo.java @@ -0,0 +1,240 @@ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.log4j.Logger; + +public class MakeExemptInfo { + private static String[] g_strDB = new String[4]; + + private final Logger logger = Logger.getLogger(MakeExemptInfo .class); + + + public static void main(String[] args) { + try { + + // 프로퍼티 파일 위치 + String propFile = "/gpta/source-app/cfs/relay_jar/config.properties"; + + // 프로퍼티 객체 생성 + Properties props = new Properties(); + + // 프로퍼티 파일 스트림에 담기 + FileInputStream fis = new FileInputStream(propFile); + + // 프로퍼티 파일 로딩 + props.load(new java.io.BufferedInputStream(fis)); + + // 항목 읽기 + g_strDB[0] = props.getProperty("db_driver"); + g_strDB[1] = props.getProperty("db_connect"); + g_strDB[2] = props.getProperty("db_id"); + g_strDB[3] = props.getProperty("db_pw"); + + // 콘솔 출력 + System.out.println(String.format("=== DB접속정보 : %s, %s, %s", g_strDB[1], g_strDB[2], g_strDB[3])); + } catch (Exception e) { + e.printStackTrace(); + } + + MakeExemptInfo obj = new MakeExemptInfo(); + try { + + if(args.length != 2) { + System.err.println("총 2개의 args를 입력하지 않았습니다."); + System.err.println("파라미터 의미 없음"); + System.exit(0); + } + + double d = 0.0; + d = obj.runMakeExemptMstBin(Long.parseLong(args[0]), Long.parseLong(args[1])); + MakeScarInfo.logger.info("=== 파일 생성 소요시간 : " + d); + } catch (Exception e) { + e.printStackTrace(); + } + + System.exit(0); + } + + // + private Connection getOrclConn( ) throws Exception{ + Class.forName(g_strDB[0]); + return DriverManager.getConnection(g_strDB[1], g_strDB[2], g_strDB[3]); + } + + @SuppressWarnings({ "resource", "unused" }) + private double runMakeExemptBin() throws Exception { + long start = System.currentTimeMillis(); // 작동 시간 측정용 + + String sql = ""; + + Connection conn = null; // 통상 Connection으로 선언 + PreparedStatement ps = null; // 통상 PreparedStatement로 선언 + ResultSet rs = null; + + try { + conn = (Connection) getOrclConn(); // Connection 생성 시 Connection으로 형변환 + + // prepareStatement를 PreparedStatement으로 형변환 + + sql= "select * from ("; + sql= sql + "select car_no, decode(EXEMPT_KBN, '0', '01', '2', '02', '3', '03', '4', '04', '5', '05', '6', '06') as exempt_cd, car_no_hex, document_no, enforce_date, end_date from exempt_cars_info"; + sql= sql + " where to_char(enforce_date,'yyyymmdd') <= to_char(sysdate, 'yyyymmdd')"; + sql= sql + " and to_char(end_date, 'yyyymmdd') >= to_char(sysdate, 'yyyymmdd')"; + sql= sql + " and car_no_hex != '0000000000'"; + sql= sql + " order by car_no_hex"; + + ps = (PreparedStatement) conn.prepareStatement(sql); + rs = ps.executeQuery( sql ); + rs.setFetchSize(10000); + + Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY); + stmt.setFetchSize(10000); + rs = stmt.executeQuery( sql ); + + String str = ""; + int n = 0; + File file = new File("./ExemptPL.bin"); + FileOutputStream fos = new FileOutputStream(file); + while (rs.next()) { + n++; + if(n % 100 == 0) { + System.out.println("===== : " + n); + } + + str = String.format("%010d%s%02d%s", n, "00", Integer.parseInt(rs.getString(2)), rs.getString(3)); + fos.write(str.getBytes()); + } // end while + + fos.close(); + }catch(Exception e){ + e.printStackTrace(); + }finally{ + if(rs != null) + rs.close(); + if(ps != null) + ps.close(); + + conn.close(); + } + + System.out.println("===== insert ok"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + private double runMakeExemptMstBin(long nStart, long nEnd) throws Exception { + long start = System.currentTimeMillis(); // 작동 시간 측정용 + + Connection conn = null; // 통상 Connection으로 선언 + PreparedStatement ps = null; // 통상 PreparedStatement로 선언 + ResultSet rs = null; + + try { + conn = (Connection) getOrclConn(); // Connection 생성 시 Connection으로 형변환 + + // prepareStatement를 PreparedStatement으로 형변환 + + StringBuffer strSQL = new StringBuffer(); + strSQL.append(" SELECT LPAD(ROWNUM, 10, '0') AS SEQ, '00' AS REG, NVL(DIV, '01') AS DIV, LPAD(DECODE(FUN_CAR_CODE(NVL(CAR_NO,'0')),'없음','0', '숫자오류2', '0', '숫자오류3', '0', FUN_CAR_CODE(NVL(CAR_NO,'0'))), 10, '0') AS CARCODE"); + strSQL.append(" FROM"); + strSQL.append(" (") ; + strSQL.append(" SELECT CAR_NO, decode(EXEMPT_KBN, '0', '01', '2', '02', '3', '03', '4', '04', '5', '05', '6', '06') AS DIV"); + strSQL.append(" FROM EXEMPT_CARS_INFO A"); + strSQL.append(" WHERE ENFORCE_DATE <= SYSDATE"); + strSQL.append(" AND END_DATE >= SYSDATE"); + strSQL.append(" ORDER BY CAR_NO"); + strSQL.append(" )") ; + + + logger.info(strSQL.toString()); + + Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY); + stmt.setFetchSize(10000); + rs = stmt.executeQuery( strSQL.toString() ); + + String str = ""; + int n = 0; + File file = new File("/gpta/source-app/cfs/relay_jar/data/IMMCARNO"); + FileOutputStream fos = new FileOutputStream(file); + while (rs.next()) { + n++; + if(n % 10000 == 0) { + logger.info("===== : " + n); + } + + str = String.format("%s%s%s%s", rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4)); + fos.write(str.getBytes()); + } // end while + + fos.close(); + + logger.info( strSQL.toString()); + + if(setFtpData(file, "IMMCARNO") < 0) { + this.logger.debug("===== 업로드 대상 파일 없음(IMMCARNO)"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + String sql = "update TB_CFS_MST_FLAG set EXEMPT_FLAG = '1', EXEMPT_SENDTIME = SYSDATE "; + ps = (PreparedStatement) conn.prepareStatement(sql); + ps.executeUpdate(); + conn.commit(); + + }catch(Exception e){ + e.printStackTrace(); + }finally{ + if(rs != null) + rs.close(); + if(ps != null) + ps.close(); + + conn.close(); + } + + logger.info("===== make ok"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + private int setFtpData(File file, String fileNm) { + + FTPUtil sftp = new FTPUtil(); + + this.logger.debug("======== 업로드 시작 : " + fileNm); + + sftp.init("175.193.201.56", "tmax","tmax1234"); + + Map map = new HashMap(); + map.put("return", "0"); + + try { + sftp.upload3("/gpta/source-web/cfs/relay/data/", file, fileNm, fileNm, map); + } catch (Exception e) { + e.printStackTrace(); + } + + this.logger.debug("======== : " + map.get("return")); + + int nReturn = Integer.parseInt(map.get("return")); + + sftp.disconnect(); + + this.logger.debug("======== 업로드 끝 : " + nReturn); + + return nReturn; + } + + +} diff --git a/src/main/java/MakePreregistrInfo.java b/src/main/java/MakePreregistrInfo.java new file mode 100644 index 0000000..a7b7d09 --- /dev/null +++ b/src/main/java/MakePreregistrInfo.java @@ -0,0 +1,201 @@ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.log4j.Logger; + +import com.tmax.tibero.TbTypes; + +public class MakePreregistrInfo { + private static String[] g_strDB = new String[4]; + + public static final Logger logger = Logger.getLogger(MakePreregistrInfo .class); + + + public static void main(String[] args) { + try { + + // 프로퍼티 파일 위치 + String propFile = "/gpta/source-app/cfs/relay_jar/config.properties"; + + // 프로퍼티 객체 생성 + Properties props = new Properties(); + + // 프로퍼티 파일 스트림에 담기 + FileInputStream fis = new FileInputStream(propFile); + + // 프로퍼티 파일 로딩 + props.load(new java.io.BufferedInputStream(fis)); + + // 항목 읽기 + g_strDB[0] = props.getProperty("db_driver"); + g_strDB[1] = props.getProperty("db_connect"); + g_strDB[2] = props.getProperty("db_id"); + g_strDB[3] = props.getProperty("db_pw"); + + // 콘솔 출력 + MakePreregistrInfo.logger.info(String.format("=== DB접속정보 : %s, %s, %s", g_strDB[1], g_strDB[2], g_strDB[3])); + } catch (Exception e) { + e.printStackTrace(); + } + + MakePreregistrInfo obj = new MakePreregistrInfo(); + try { + + if(args.length != 3) { + System.err.println("총 3개의 args를 입력하지 않았습니다."); + System.err.println("sFileDir, sFileName"); + System.exit(0); + } + + double d = 0.0; + d = obj.runMakeScarMstBin(Long.parseLong(args[0]), Long.parseLong(args[1]), args[2]); + MakePreregistrInfo.logger.info("=== 파일 생성 소요시간 : " + d); + } catch (Exception e) { + e.printStackTrace(); + } + + System.exit(0); + } + + // + private Connection getOrclConn( ) throws Exception{ + Class.forName(g_strDB[0]); + return DriverManager.getConnection(g_strDB[1], g_strDB[2], g_strDB[3]); + } + + private double runMakeScarMstBin(long nStart, long nEnd, String strWorkDate) throws Exception { + long start = System.currentTimeMillis(); // 작동 시간 측정용 + + + Connection conn = null; // 통상 Connection으로 선언 + PreparedStatement ps = null; // 통상 PreparedStatement로 선언 + ResultSet rs = null; + + try { + conn = (Connection) getOrclConn(); // Connection 생성 시 Connection으로 형변환 + + + CallableStatement cs = conn.prepareCall("call SP_ADVREDUCE_CHK(?,?)"); + // 입력 파라메터 + cs.setString(1, strWorkDate); + // 출력 파라메터 + cs.registerOutParameter(2, TbTypes.NUMERIC); + // 실행 + cs.execute(); + + int out_ret = cs.getInt(2); + System.out.println("======== " + out_ret); + cs.close(); + + if(out_ret != 1 ) { + logger.debug("===== SP_ADVREDUCE_CHK 오류 : " + out_ret); + long end = System.currentTimeMillis(); // 작동시간 측정용 + + + String sql = "update TB_CFS_MST_FLAG set PRP_FLAG = '1', PRP_SENDTIME = SYSDATE "; + ps = (PreparedStatement) conn.prepareStatement(sql); + ps.executeUpdate(); + ps.close(); + + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + // prepareStatement를 PreparedStatement으로 형변환 + StringBuffer strSQL = new StringBuffer(); + strSQL.append(" SELECT /*+ index_desc(A IDX_SRCH_PRP_MST) */") ; + strSQL.append(" LPAD(PRP_INFO_SEQ, 10, '0') AS SEQ, '00' AS REG, NVL(EXMP_CD,'01') AS DIV, LPAD(DECODE(FUN_CAR_CODE(NVL(CAR_NO,'0')),'없음','0', '숫자오류2', '0', '숫자오류3', '0', FUN_CAR_CODE(NVL(CAR_NO,'0'))), 10, '0') AS CARCODE") ; + strSQL.append(" FROM TB_CFS_PRP_INFO_MST A") ; + strSQL.append(" WHERE SECSN_YN ='N'") ; + strSQL.append(" ORDER BY PRP_INFO_SEQ") ; + + logger.info(strSQL.toString()); + + Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY); + stmt.setFetchSize(10000); + rs = stmt.executeQuery( strSQL.toString() ); + + String str = ""; + int n = 0; + File file = new File("/gpta/source-app/cfs/relay_jar/data/ADVMST"); + FileOutputStream fos = new FileOutputStream(file); + while (rs.next()) { + n++; + if(n % 10000 == 0) { + logger.info("===== : " + n); + } + + str = String.format("%s%s%s%s", rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4)); + fos.write(str.getBytes()); + } // end while + + fos.close(); + + logger.info(strSQL.toString()); + + if(setFtpData(file, "ADVMST") < 0) { + logger.debug("===== 업로드 대상 파일 없음(ADVMST)"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + String sql = "update TB_CFS_MST_FLAG set PRP_FLAG = '1', PRP_SENDTIME = SYSDATE, PRP_CHG_TIME = SYSDATE "; + ps = (PreparedStatement) conn.prepareStatement(sql); + ps.executeUpdate(); + conn.commit(); + + }catch(Exception e){ + e.printStackTrace(); + }finally{ + if(rs != null) + rs.close(); + if(ps != null) + ps.close(); + + conn.close(); + } + + logger.info("===== make ok"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + private int setFtpData(File file, String fileNm) { + + FTPUtil sftp = new FTPUtil(); + + logger.debug("======== 업로드 시작 : " + fileNm); + + sftp.init("175.193.201.56", "tmax","tmax1234"); + + Map map = new HashMap(); + map.put("return", "0"); + + try { + sftp.upload3("/gpta/source-web/cfs/relay/data/", file, fileNm, fileNm, map); + } catch (Exception e) { + e.printStackTrace(); + } + + logger.debug("======== : " + map.get("return")); + + int nReturn = Integer.parseInt(map.get("return")); + + sftp.disconnect(); + + logger.debug("======== 업로드 끝 : " + nReturn); + + return nReturn; + } +} diff --git a/src/main/java/MakeRfidnfo.java b/src/main/java/MakeRfidnfo.java new file mode 100644 index 0000000..3d6cae5 --- /dev/null +++ b/src/main/java/MakeRfidnfo.java @@ -0,0 +1,182 @@ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.log4j.Logger; + +public class MakeRfidnfo { + private static String[] g_strDB = new String[4]; + + public static final Logger logger = Logger.getLogger(MakeRfidnfo .class); + + + public static void main(String[] args) { + try { + + // 프로퍼티 파일 위치 + String propFile = "/gpta/source-app/cfs/relay_jar/config.properties"; + + // 프로퍼티 객체 생성 + Properties props = new Properties(); + + // 프로퍼티 파일 스트림에 담기 + FileInputStream fis = new FileInputStream(propFile); + + // 프로퍼티 파일 로딩 + props.load(new java.io.BufferedInputStream(fis)); + + // 항목 읽기 + g_strDB[0] = props.getProperty("db_driver"); + g_strDB[1] = props.getProperty("db_connect"); + g_strDB[2] = props.getProperty("db_id"); + g_strDB[3] = props.getProperty("db_pw"); + + // 콘솔 출력 + MakeRfidnfo.logger.info(String.format("=== DB접속정보 : %s, %s, %s", g_strDB[1], g_strDB[2], g_strDB[3])); + } catch (Exception e) { + e.printStackTrace(); + } + + MakeRfidnfo obj = new MakeRfidnfo(); + try { + + if(args.length != 2) { + System.err.println("총 2개의 args를 입력하지 않았습니다."); + System.err.println("sFileDir, sFileName"); + System.exit(0); + } + + double d = 0.0; + d = obj.runMakeRfidMstBin(Long.parseLong(args[0]), Long.parseLong(args[1])); + MakeRfidnfo.logger.info("=== 파일 생성 소요시간 : " + d); + } catch (Exception e) { + e.printStackTrace(); + } + + System.exit(0); + } + + // + private Connection getOrclConn( ) throws Exception{ + Class.forName(g_strDB[0]); + return DriverManager.getConnection(g_strDB[1], g_strDB[2], g_strDB[3]); + } + + private double runMakeRfidMstBin(long nStart, long nEnd) throws Exception { + long start = System.currentTimeMillis(); // 작동 시간 측정용 + + + Connection conn = null; // 통상 Connection으로 선언 + PreparedStatement ps = null; // 통상 PreparedStatement로 선언 + ResultSet rs = null; + + try { + conn = (Connection) getOrclConn(); // Connection 생성 시 Connection으로 형변환 + + // prepareStatement를 PreparedStatement으로 형변환 + StringBuffer strSQL = new StringBuffer(); + strSQL.append(" SELECT ") ; + strSQL.append(" LPAD(ROWNUM, 10, '0') AS SEQ, '00' AS REG, SUBSTR(CAR_TYPE_KBN, 4, 1) AS DIV, LPAD(RFID_TAG, 24, '0') AS TAG, ") ; + strSQL.append(" LPAD(DECODE(FUN_CAR_CODE(NVL(CAR_NO,'0')),'없음','0', FUN_CAR_CODE(NVL(CAR_NO,'0'))), 10, '0') AS CAR, ") ; + strSQL.append(" NVL(DAMAGE_NO,'0') AS NON, NVL(WEEK_WRONG_NO,'0') AS VIO ") ; + strSQL.append(" FROM") ; + strSQL.append("(") ; + strSQL.append(" SELECT /*+ INDEX_ASC(A IDX01_RFID_INFO) */ A.* ") ; + strSQL.append(" FROM RFID_INFO A") ; + strSQL.append(" WHERE A.CAR_NO NOT IN ('00x0000', '01괘0006')") ; + strSQL.append(" and car_type_kbn in ('000E', '000F')") ; + strSQL.append(")") ; + + + logger.info(strSQL.toString()); + + Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY); + stmt.setFetchSize(10000); + rs = stmt.executeQuery( strSQL.toString() ); + + String str = ""; + int n = 0; + File file = new File("/gpta/source-app/cfs/relay_jar/data/IMMRFID"); + FileOutputStream fos = new FileOutputStream(file); + while (rs.next()) { + n++; + if(n % 10000 == 0) { + logger.info("===== : " + n); + } + + str = String.format("%s%s%s%s%s%s%s", rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7)); + fos.write(str.getBytes()); + } // end while + + fos.close(); + + logger.info(strSQL.toString()); + + if(setFtpData(file, "IMMRFID") < 0) { + logger.debug("===== 업로드 대상 파일 없음(REDCARNO)"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + String sql = "update TB_CFS_MST_FLAG set RFID_FLAG = '1', RFID_SENDTIME = SYSDATE "; + ps = (PreparedStatement) conn.prepareStatement(sql); + ps.executeUpdate(); + conn.commit(); + + }catch(Exception e){ + e.printStackTrace(); + }finally{ + if(rs != null) + rs.close(); + if(ps != null) + ps.close(); + + conn.close(); + } + + logger.info("===== make ok"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + private int setFtpData(File file, String fileNm) { + + FTPUtil sftp = new FTPUtil(); + + logger.debug("======== 업로드 시작 : " + fileNm); + + sftp.init("175.193.201.56", "tmax","tmax1234"); + + Map map = new HashMap(); + map.put("return", "0"); + + try { + sftp.upload3("/gpta/source-web/cfs/relay/data/", file, fileNm, fileNm, map); + } catch (Exception e) { + e.printStackTrace(); + } + + logger.debug("======== : " + map.get("return")); + + int nReturn = Integer.parseInt(map.get("return")); + + sftp.disconnect(); + + logger.debug("======== 업로드 끝 : " + nReturn); + + return nReturn; + } + + + +} diff --git a/src/main/java/MakeScarInfo.java b/src/main/java/MakeScarInfo.java new file mode 100644 index 0000000..3eac33e --- /dev/null +++ b/src/main/java/MakeScarInfo.java @@ -0,0 +1,176 @@ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.log4j.Logger; + +public class MakeScarInfo { + private static String[] g_strDB = new String[4]; + + public static final Logger logger = Logger.getLogger(MakeScarInfo .class); + + + public static void main(String[] args) { + try { + + // 프로퍼티 파일 위치 + String propFile = "/gpta/source-app/cfs/relay_jar/config.properties"; + + // 프로퍼티 객체 생성 + Properties props = new Properties(); + + // 프로퍼티 파일 스트림에 담기 + FileInputStream fis = new FileInputStream(propFile); + + // 프로퍼티 파일 로딩 + props.load(new java.io.BufferedInputStream(fis)); + + // 항목 읽기 + g_strDB[0] = props.getProperty("db_driver"); + g_strDB[1] = props.getProperty("db_connect"); + g_strDB[2] = props.getProperty("db_id"); + g_strDB[3] = props.getProperty("db_pw"); + + // 콘솔 출력 + MakeScarInfo.logger.info(String.format("=== DB접속정보 : %s, %s, %s", g_strDB[1], g_strDB[2], g_strDB[3])); + } catch (Exception e) { + e.printStackTrace(); + } + + MakeScarInfo obj = new MakeScarInfo(); + try { + + if(args.length != 2) { + System.err.println("총 2개의 args를 입력하지 않았습니다."); + System.err.println("sFileDir, sFileName"); + System.exit(0); + } + + double d = 0.0; + d = obj.runMakeScarMstBin(Long.parseLong(args[0]), Long.parseLong(args[1])); + MakeScarInfo.logger.info("=== 파일 생성 소요시간 : " + d); + } catch (Exception e) { + e.printStackTrace(); + } + + System.exit(0); + } + + // + private Connection getOrclConn( ) throws Exception{ + Class.forName(g_strDB[0]); + return DriverManager.getConnection(g_strDB[1], g_strDB[2], g_strDB[3]); + } + + private double runMakeScarMstBin(long nStart, long nEnd) throws Exception { + long start = System.currentTimeMillis(); // 작동 시간 측정용 + + + Connection conn = null; // 통상 Connection으로 선언 + PreparedStatement ps = null; // 통상 PreparedStatement로 선언 + ResultSet rs = null; + + try { + conn = (Connection) getOrclConn(); // Connection 생성 시 Connection으로 형변환 + + // prepareStatement를 PreparedStatement으로 형변환 + + StringBuffer strSQL = new StringBuffer(); + strSQL.append(" SELECT LPAD(SCAR_SEQ, 10, '0') AS SEQ, '00' AS REG, DECODE(REDU_CD, '00', '01', '02') AS DIV, LPAD(DECODE(FUN_CAR_CODE(NVL(CAR_NO,'0')),'없음','0', '숫자오류2', '0', '숫자오류3', '0', FUN_CAR_CODE(NVL(CAR_NO,'0'))), 10, '0') AS CARCODE") ; + strSQL.append(" FROM TB_CFS_SCAR_PL_MST A") ; + strSQL.append(" WHERE REDU_CD IN ('00')") ; + strSQL.append(" AND MODI_YN = 'N'") ; + strSQL.append(" ORDER BY SCAR_SEQ") ; + + logger.info(strSQL.toString()); + + Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY); + stmt.setFetchSize(10000); + rs = stmt.executeQuery( strSQL.toString() ); + + String str = ""; + int n = 0; + File file = new File("/gpta/source-app/cfs/relay_jar/data/REDCARNO"); + FileOutputStream fos = new FileOutputStream(file); + while (rs.next()) { + n++; + if(n % 10000 == 0) { + logger.info("===== : " + n); + } + + str = String.format("%s%s%s%s", rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4)); + fos.write(str.getBytes()); + } // end while + + fos.close(); + + logger.info(strSQL.toString()); + + if(setFtpData(file, "REDCARNO") < 0) { + logger.debug("===== 업로드 대상 파일 없음(REDCARNO)"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + String sql = "update TB_CFS_MST_FLAG set RED_FLAG = '1', RED_SENDTIME = SYSDATE "; + ps = (PreparedStatement) conn.prepareStatement(sql); + ps.executeUpdate(); + conn.commit(); + + }catch(Exception e){ + e.printStackTrace(); + }finally{ + if(rs != null) + rs.close(); + if(ps != null) + ps.close(); + + conn.close(); + } + + logger.info("===== make ok"); + long end = System.currentTimeMillis(); // 작동시간 측정용 + return (end - start) / 1000.0; // insertBatchFileToDB 실행에 걸린 시간 + } + + private int setFtpData(File file, String fileNm) { + + FTPUtil sftp = new FTPUtil(); + + logger.debug("======== 업로드 시작 : " + fileNm); + + sftp.init("175.193.201.56", "tmax","tmax1234"); + + Map map = new HashMap(); + map.put("return", "0"); + + try { + sftp.upload3("/gpta/source-web/cfs/relay/data/", file, fileNm, fileNm, map); + } catch (Exception e) { + e.printStackTrace(); + } + + logger.debug("======== : " + map.get("return")); + + int nReturn = Integer.parseInt(map.get("return")); + + sftp.disconnect(); + + logger.debug("======== 업로드 끝 : " + nReturn); + + return nReturn; + } + + + +} diff --git a/src/main/java/PLUploader.java b/src/main/java/PLUploader.java new file mode 100644 index 0000000..8435580 --- /dev/null +++ b/src/main/java/PLUploader.java @@ -0,0 +1,269 @@ + +import java.util.HashMap; +import java.util.Map; + +public class PLUploader { + public static boolean isNumeric(String s) { + return s.matches("-?\\d+(\\.\\d+)?"); + } + + public static String runCarNo2Code(String strCarNo) { + strCarNo = strCarNo.trim(); + strCarNo = strCarNo.replaceAll(" ", ""); + + if (strCarNo.contains("0000")) + return "0000000000"; + + // System.out.println("====" + strCarNo + "==="); + // System.out.println("==== " + nCarNoLength); + int nCarNoLength = strCarNo.length(); + + if (nCarNoLength < 7 || nCarNoLength > 9) + return "0000000000"; + + if (nCarNoLength == 9 && PLUploader.isNumeric(strCarNo.substring(2, 4)) == false) { + return "0000000000"; + } + + if (PLUploader.isNumeric(strCarNo.substring(strCarNo.length()-4, strCarNo.length())) == false) { + return "0000000000"; + } + short b1, b2, b3, b4, b5; + // 1. 외교 관련 + if (strCarNo.indexOf("외교") >= 0 || strCarNo.indexOf("영사") >= 0 || strCarNo.indexOf("국기") >= 0) { + String strCarNoF = strCarNo.replaceAll("-", ""); + + b1 = getRegion("외교"); + b2 = Short.parseShort(strCarNoF.substring(2, 4), 16); + b3 = getCarClass("외"); + b4 = Short.parseShort(strCarNoF.substring(4, 6), 16); + b5 = Short.parseShort(strCarNoF.substring(6, 8), 16); + } + // 2. 비사업자용 + else if (nCarNoLength == 7) { // 35도2345 + b1 = getRegion("전국"); + String temp = strCarNo.substring(0, 2); + if (PLUploader.isNumeric(temp) == false) { + return "0000000000"; + } + b2 = Short.parseShort(strCarNo.substring(0, 2), 16); + b3 = getCarClass(strCarNo.substring(2, 3)); + b4 = Short.parseShort(strCarNo.substring(3, 5), 16); + b5 = Short.parseShort(strCarNo.substring(5, 7), 16); + + if (b1 == 256) + return "0000000000"; + + if (b3 < 0) + return "0000000000"; + } else if (nCarNoLength == 8) { // 135도2345 + // 예외처리 + String temp = strCarNo.substring(0, 3); + if (PLUploader.isNumeric(temp) == true) { + b1 = getRegion(strCarNo.substring(0, 1)); + b2 = Short.parseShort(strCarNo.substring(1, 3), 16); + b3 = getCarClass(strCarNo.substring(3, 4)); + b4 = Short.parseShort(strCarNo.substring(4, 6), 16); + b5 = Short.parseShort(strCarNo.substring(6, 8), 16); + + if (b1 == 256) + return "0000000000"; + + if (b3 < 0) + return "0000000000"; + } else { + temp = strCarNo.substring(0, 2); + if (PLUploader.isNumeric(temp) ==true) { + return "0000000000"; + } + + b1 = getRegion(strCarNo.substring(0, 2)); + if (PLUploader.isNumeric(strCarNo.substring(2, 3)) ==false) { + return "0000000000"; + } + b2 = Short.parseShort(strCarNo.substring(2, 3), 16); + b3 = getCarClass(strCarNo.substring(3, 4)); + b4 = Short.parseShort(strCarNo.substring(4, 6), 16); + b5 = Short.parseShort(strCarNo.substring(6, 8), 16); + + if (b1 == 256) + return "0000000000"; + + if (b3 < 0) + return "0000000000"; + } + } + // 3. 사업자용 + else { + b1 = getRegion(strCarNo.substring(0, 2)); + b2 = Short.parseShort(strCarNo.substring(2, 4), 16); + b3 = getCarClass(strCarNo.substring(4, 5)); + b4 = Short.parseShort(strCarNo.substring(5, 7), 16); + b5 = Short.parseShort(strCarNo.substring(7, 9), 16); + + if (b1 == 256) + return "0000000000"; + + if (b3 < 0) + return "0000000000"; + } + + return String.format("%02X%02X%02X%02X%02X", b1, b2, b3, b4, b5); + } + + private static short getRegion(String str) { + + Map mapRegion = new HashMap<>(); + + mapRegion.put("서울", "00"); + mapRegion.put("부산", "01"); + mapRegion.put("인천", "02"); + mapRegion.put("대구", "03"); + mapRegion.put("광주", "04"); + mapRegion.put("대전", "05"); + mapRegion.put("경기", "06"); + mapRegion.put("강원", "07"); + mapRegion.put("충북", "08"); + mapRegion.put("충남", "09"); + mapRegion.put("전북", "10"); + mapRegion.put("전남", "11"); + mapRegion.put("경북", "12"); + mapRegion.put("경남", "13"); + mapRegion.put("제주", "14"); + mapRegion.put("울산", "15"); + mapRegion.put("세종", "16"); + + mapRegion.put("1", "81"); + mapRegion.put("2", "82"); + mapRegion.put("3", "83"); + mapRegion.put("4", "84"); + mapRegion.put("5", "85"); + mapRegion.put("6", "86"); + mapRegion.put("7", "87"); + mapRegion.put("8", "88"); + mapRegion.put("9", "89"); + + mapRegion.put("외교", "98"); + + mapRegion.put("전국", "99"); + + if (mapRegion.get(str) == null) + return Short.parseShort("100", 16); + + return Short.parseShort((String) mapRegion.get(str), 16); + } + + private static short getCarClass(String str) { + + Map mapCarClass = new HashMap<>(); + mapCarClass.put("가", "00"); + mapCarClass.put("나", "01"); + mapCarClass.put("다", "02"); + mapCarClass.put("라", "03"); + mapCarClass.put("마", "04"); + mapCarClass.put("바", "05"); + mapCarClass.put("사", "06"); + mapCarClass.put("아", "07"); + mapCarClass.put("자", "08"); + mapCarClass.put("차", "09"); + mapCarClass.put("카", "10"); + mapCarClass.put("타", "11"); + mapCarClass.put("파", "12"); + mapCarClass.put("하", "13"); + mapCarClass.put("거", "14"); + mapCarClass.put("너", "15"); + mapCarClass.put("더", "16"); + mapCarClass.put("러", "17"); + mapCarClass.put("머", "18"); + mapCarClass.put("버", "19"); + mapCarClass.put("서", "20"); + mapCarClass.put("어", "21"); + mapCarClass.put("저", "22"); + mapCarClass.put("처", "23"); + mapCarClass.put("커", "24"); + mapCarClass.put("터", "25"); + mapCarClass.put("퍼", "26"); + mapCarClass.put("허", "27"); + mapCarClass.put("고", "28"); + mapCarClass.put("노", "29"); + mapCarClass.put("도", "30"); + mapCarClass.put("로", "31"); + mapCarClass.put("모", "32"); + mapCarClass.put("보", "33"); + mapCarClass.put("소", "34"); + mapCarClass.put("오", "35"); + mapCarClass.put("조", "36"); + mapCarClass.put("초", "37"); + mapCarClass.put("코", "38"); + mapCarClass.put("토", "39"); + mapCarClass.put("포", "40"); + mapCarClass.put("호", "41"); + mapCarClass.put("구", "42"); + mapCarClass.put("누", "43"); + mapCarClass.put("두", "44"); + mapCarClass.put("루", "45"); + mapCarClass.put("무", "46"); + mapCarClass.put("부", "47"); + mapCarClass.put("수", "48"); + mapCarClass.put("우", "49"); + mapCarClass.put("주", "50"); + mapCarClass.put("추", "51"); + mapCarClass.put("쿠", "52"); + mapCarClass.put("투", "53"); + mapCarClass.put("푸", "54"); + mapCarClass.put("후", "55"); + mapCarClass.put("그", "56"); + mapCarClass.put("느", "57"); + mapCarClass.put("드", "58"); + mapCarClass.put("르", "59"); + mapCarClass.put("므", "60"); + mapCarClass.put("브", "61"); + mapCarClass.put("스", "62"); + mapCarClass.put("으", "63"); + mapCarClass.put("즈", "64"); + mapCarClass.put("츠", "65"); + mapCarClass.put("크", "66"); + mapCarClass.put("트", "67"); + mapCarClass.put("프", "68"); + mapCarClass.put("흐", "69"); + mapCarClass.put("기", "70"); + mapCarClass.put("니", "71"); + mapCarClass.put("디", "72"); + mapCarClass.put("리", "73"); + mapCarClass.put("미", "74"); + mapCarClass.put("비", "75"); + mapCarClass.put("시", "76"); + mapCarClass.put("이", "77"); + mapCarClass.put("지", "78"); + mapCarClass.put("치", "79"); + mapCarClass.put("키", "80"); + mapCarClass.put("티", "81"); + mapCarClass.put("피", "82"); + mapCarClass.put("히", "83"); + mapCarClass.put("육", "84"); + mapCarClass.put("해", "85"); + mapCarClass.put("공", "86"); + mapCarClass.put("국", "87"); + mapCarClass.put("합", "88"); + mapCarClass.put("_", "89"); + mapCarClass.put("배", "90"); + mapCarClass.put("외", "98"); + + if (mapCarClass.get(str) == null) + return -1; + + return Short.parseShort((String) mapCarClass.get(str), 16); + } + + public static void main(String[] args) { + + //String[] array ={"37너6202", "37너6202", "27어7623", "17러0863", "47어5540", "115조1722", "68부7433", "", ""}; + String[] array ={"서울4보2416","21러3078", "21러3071", "69오6464", "21러3121", "14두6096", "14두6043" }; + //{"서울31바3919", "61두6950", "54누5840", "56보1098", "06무3635", "31두7103", "42러2718 ", "41주4712", "24버1549 ", "68라8528 ", "61가3088 ", ""}; + + for(int i = 0; i < array.length; i++) + System.out.println(PLUploader.runCarNo2Code(array[i])); + + } + +} diff --git a/src/main/java/util/IllegalRecordException.java b/src/main/java/util/IllegalRecordException.java new file mode 100644 index 0000000..a4e3421 --- /dev/null +++ b/src/main/java/util/IllegalRecordException.java @@ -0,0 +1,17 @@ +package util; + +/** + * File 처리하는 클래스에서 사용하기 위한 사용자 정의 예외
+ * @author pantarei + * @since JDK 1.4.1 + * @version 0.1, 2004-11-19 pantarei create + */ +@SuppressWarnings("serial") +public class IllegalRecordException extends Exception{ + public IllegalRecordException(){ + super(); + } + public IllegalRecordException(String msg){ + super(msg); + } +} diff --git a/src/main/java/util/Record.java b/src/main/java/util/Record.java new file mode 100644 index 0000000..1e594d7 --- /dev/null +++ b/src/main/java/util/Record.java @@ -0,0 +1,48 @@ +package util; + + +/** + 레코드
+ @author pantarei + @since JDK 1.4.1 + @version 0.1, 2004-11-17 pantarei create + 0.2, 2006-06-12 코드 추가 +*/ +public class Record{ + protected String record; + /** + * 레코드 길이 체크 + * @param record + * @return + */ + protected boolean checkLength(String record, int length){ + return record.getBytes().length == length ? true : false; + } + /** + * 레코드를 byte단위로 잘라서 String 로 리턴 + * @param line + * @param start + * @param end + * @return + */ + protected String getStringInLine(String line , int start, int end) + { + byte[] bTmpLine = line.getBytes(); + + return new String(bTmpLine, start, end-start); + } + /** + * 레코드 Return + * @return String + */ + public String getRecord() throws IllegalRecordException{ + return record; + } + /** + * 레코드 Return + * @return String + */ + public String getData(){ + return record; + } +} diff --git a/src/main/java/util/RfTerminalRecord.java b/src/main/java/util/RfTerminalRecord.java new file mode 100644 index 0000000..23ec9a6 --- /dev/null +++ b/src/main/java/util/RfTerminalRecord.java @@ -0,0 +1,198 @@ +package util; + + +/** + * 요금단말정보(RF) 데이터 포멧
+ * @author jckim + * @since JDK 1.4.1 + * @version 0.1, 2007-11-01 초기 작성, 2011-12-12 kde 이비카드 추가 컬럼사이즈 변경. + */ +public class RfTerminalRecord extends Record { + private int RECORD_LEN = 260; // 레코드 길이 2011.12.12 kde 255 -> 260 + private String worker_id, fare_office_id, booth_id, year, month, day, work_times, + seqno, after_kbn, card_no,in_out_kbn, trans_file_create_yn, + collect_id, levy_amount, remaind_amount, card_office_id, c_repay_kbn, + rfid_kbn, rfid_tag1, rfid_tag2, terminal_id, sam_id, sam_seqno, + card_seqno, before_amount, algorithm_id, key_version, e_cash_identifier, + sam_tot_seqno, sam_collect_cnt, sam_tot_amount, sign_value, person_code, + zipge_id, alias_no, issue_id; + /** + * Counstructor + */ + public RfTerminalRecord(String worker_id, String fare_office_id, String booth_id, String year, String month, + String day, String work_times, String seqno, String after_kbn, String card_no, + String in_out_kbn, String trans_file_create_yn, String collect_id, String levy_amount, + String remaind_amount, String card_office_id, String c_repay_kbn, String rfid_kbn, + String rfid_tag1, String rfid_tag2, String terminal_id, String sam_id, + String sam_seqno, String card_seqno, String before_amount, String algorithm_id, + String key_version, String e_cash_identifier, String sam_tot_seqno, String sam_collect_cnt, + String sam_tot_amount, String sign_value, String person_code, String zipge_id, + String alias_no, String issue_id){ + this.worker_id = worker_id ; + this.fare_office_id = fare_office_id; + this.booth_id = booth_id ; + this.year = year ; + this.month = month ; + this.day = day ; + this.work_times = work_times ; + this.seqno = StringUtil.justify(StringUtil.RIGHT,seqno , "0", 9); + this.after_kbn = StringUtil.justify(StringUtil.LEFT ,after_kbn , " ", 1); + this.card_no = StringUtil.justify(StringUtil.LEFT ,card_no , " ", 20); + this.in_out_kbn = StringUtil.justify(StringUtil.LEFT ,in_out_kbn , " ", 1); + this.trans_file_create_yn= StringUtil.justify(StringUtil.LEFT ,trans_file_create_yn, " ", 1); + this.collect_id = StringUtil.justify(StringUtil.LEFT ,collect_id , " ", 2); + this.levy_amount = StringUtil.justify(StringUtil.RIGHT,levy_amount , "0", 10); + this.remaind_amount = StringUtil.justify(StringUtil.RIGHT,remaind_amount , "0", 10); + this.card_office_id = StringUtil.justify(StringUtil.LEFT ,card_office_id , " ", 1); + this.c_repay_kbn = StringUtil.justify(StringUtil.LEFT ,c_repay_kbn , " ", 1); + this.rfid_kbn = StringUtil.justify(StringUtil.LEFT ,rfid_kbn , " ", 2); + this.rfid_tag1 = StringUtil.justify(StringUtil.LEFT ,rfid_tag1 , " ", 24); + this.rfid_tag2 = StringUtil.justify(StringUtil.LEFT ,rfid_tag2 , " ", 24); + this.terminal_id = StringUtil.justify(StringUtil.LEFT ,terminal_id , " ", 9); + this.sam_id = StringUtil.justify(StringUtil.LEFT ,sam_id , " ", 16); + this.sam_seqno = StringUtil.justify(StringUtil.RIGHT,sam_seqno , "0", 10); + this.card_seqno = StringUtil.justify(StringUtil.RIGHT,card_seqno , "0", 10); + this.before_amount = StringUtil.justify(StringUtil.RIGHT,before_amount , "0", 10); + this.algorithm_id = StringUtil.justify(StringUtil.LEFT ,algorithm_id , " ", 3); // 2011.12.12 kde 2 -> 3 + this.key_version = StringUtil.justify(StringUtil.LEFT ,key_version , " ", 3); // 2011.12.12 kde 2 -> 3 + this.e_cash_identifier = StringUtil.justify(StringUtil.LEFT ,e_cash_identifier , " ", 3); // 2011.12.12 kde 2 -> 3 + this.sam_tot_seqno = StringUtil.justify(StringUtil.RIGHT,sam_tot_seqno , "0", 10); + this.sam_collect_cnt = StringUtil.justify(StringUtil.RIGHT,sam_collect_cnt , "0", 5); + this.sam_tot_amount = StringUtil.justify(StringUtil.RIGHT,sam_tot_amount , "0", 10); + this.sign_value = StringUtil.justify(StringUtil.LEFT ,sign_value , " ", 10); // 2011.12.12 kde 8 -> 10 + this.person_code = StringUtil.justify(StringUtil.LEFT ,person_code , " ", 2); + this.zipge_id = StringUtil.justify(StringUtil.LEFT ,zipge_id , " ", 12); + this.alias_no = StringUtil.justify(StringUtil.LEFT ,alias_no , " ", 10); + this.issue_id = StringUtil.justify(StringUtil.LEFT ,issue_id , " ", 7); + } + /** + * 레코드 정보를 String으로 return + * @return String + * @throws IllegalRecordException + */ + public String getRecord() throws IllegalRecordException{ + String result + = new StringBuffer(worker_id ) + .append(fare_office_id ) + .append(booth_id ) + .append(year ) + .append(month ) + .append(day ) + .append(work_times ) + .append(seqno ) + .append(after_kbn ) + .append(card_no ) + .append(in_out_kbn ) + .append(trans_file_create_yn) + .append(collect_id ) + .append(levy_amount ) + .append(remaind_amount ) + .append(card_office_id ) + .append(c_repay_kbn ) + .append(rfid_kbn ) + .append(rfid_tag1 ) + .append(rfid_tag2 ) + .append(terminal_id ) + .append(sam_id ) + .append(sam_seqno ) + .append(card_seqno ) + .append(before_amount ) + .append(algorithm_id ) + .append(key_version ) + .append(e_cash_identifier ) + .append(sam_tot_seqno ) + .append(sam_collect_cnt ) + .append(sam_tot_amount ) + .append(sign_value ) + .append(person_code ) + .append(zipge_id ) + .append(alias_no ) + .append(issue_id ).toString(); + + getRecord2(); +//System.out.println("=== " + result); + if(checkLength(result, RECORD_LEN)){ + return result; + }else{ + throw new IllegalRecordException( + "Cannot create DATA record : [" + result.length() + "] " + result); + } + } + + public String getRecord2() throws IllegalRecordException{ + String result + = new StringBuffer(worker_id ) + .append(", " ) + .append(fare_office_id ) + .append(", " ) + .append(booth_id ) + .append(", " ) + .append(year ) + .append(", " ) + .append(month ) + .append(", " ) + .append(day ) + .append(", " ) + .append(work_times ) + .append(", " ) + .append(seqno ) + .append(", " ) + .append(after_kbn ) + .append(", " ) + .append(card_no ) + .append(", " ) + .append(in_out_kbn ) + .append(", " ) + .append(trans_file_create_yn) + .append(", " ) + .append(collect_id ) + .append(levy_amount ) + .append(", " ) + .append(remaind_amount ) + .append(", " ) + .append(card_office_id ) + .append(", " ) + .append(c_repay_kbn ) + .append(", " ) + .append(rfid_kbn ) + .append(", " ) + .append(rfid_tag1 ) + .append(", " ) + .append(rfid_tag2 ) + .append(", " ) + .append(terminal_id ) + .append(", " ) + .append(sam_id ) + .append(", " ) + .append(sam_seqno ) + .append(", " ) + .append(card_seqno ) + .append(", " ) + .append(before_amount ) + .append(", " ) + .append(algorithm_id ) + .append(", " ) + .append(key_version ) + .append(", " ) + .append(e_cash_identifier ) + .append(", " ) + .append(sam_tot_seqno ) + .append(", " ) + .append(sam_collect_cnt ) + .append(", " ) + .append(sam_tot_amount ) + .append(", " ) + .append(sign_value ) + .append(", " ) + .append(person_code ) + .append(", " ) + .append(zipge_id ) + .append(", " ) + .append(alias_no ) + .append(", " ) + .append(issue_id ).toString(); +System.out.println(result); + + return result; + } +} diff --git a/src/main/java/util/StringUtil.java b/src/main/java/util/StringUtil.java new file mode 100644 index 0000000..b148fa3 --- /dev/null +++ b/src/main/java/util/StringUtil.java @@ -0,0 +1,295 @@ +package util; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +/** + * 문자열 처리 공통 클래스
+ * @since JDK 1.4.1 + * @version 0.1, 2006-12-20 초기 작성 + */ +public class StringUtil { + + private static final char[] toHex = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + public static String toHexString(byte b[]) { + return toHexString(b, 0, b.length); + } + + public static String toHexString(byte b[], int spos, int epos) { + int pos = 0; + char[] cbuf = new char[(epos - spos) * 2]; + + for (int i = spos; i < epos; i++) { + cbuf[pos++] = toHex[(b[i] >> 4) & 0x0F]; + cbuf[pos++] = toHex[b[i] & 0x0F]; + } + return new String(cbuf); + } + + public static byte [] toHexBytes(String str) { + String recv_data = str.toUpperCase(); + byte [] aBuff = null; + if( recv_data.length()%2 == 0){ + aBuff = new byte[recv_data.length()]; + }else{ + aBuff = new byte[recv_data.length()+1]; + aBuff[recv_data.length()] = 0x00; + } + + for(int i=0; i< recv_data.length(); i++){ + char buff = recv_data.charAt(i); + if( buff >= '0' && buff <= '9'){ + aBuff[i] = (byte)(buff-48); + }else{ + aBuff[i] = (byte)(buff-55); + } + } + byte [] bBuff = new byte[aBuff.length/2]; + + for(int i=0; i< aBuff.length/2; i++){ + byte a = (byte)( aBuff[i*2+0] << 4 & 0xF0); + byte b = (byte)( aBuff[i*2+1] & 0x0F); + bBuff[i] = (byte)( a | b); + } + return bBuff; + } + + public static long toLong(byte b[]) { + return toLong(b, 0, b.length); + } + + public static long toLong(byte b[], int spos, int epos) { + long num = 0; + int pos = 0; + + for (int i=epos - 1; i>= spos; i--, pos++) { + num |= (b[i] & 0xFF) << (8 * pos); + } + + return num; + } + + @SuppressWarnings("unused") + public static boolean isSupportedEncoding(String charset) { + try { + byte[] b = charset.getBytes("8859_1"); + String value = new String(b, charset); + } + catch (Exception e) { + return false; + } + return true; + } + + public static String toEncString(String str, String charset) { + try { + byte[] b = str.getBytes("8859_1"); + return new String(b, charset); + } + catch (UnsupportedEncodingException e) { + return null; + } + } + + public static String toWhiteSpace(String str) { + StringBuffer buffer = new StringBuffer(); + String whites = " \t\r\n"; + boolean before = false; + + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + int p = whites.indexOf(c); + + if (before && p >= 0) + continue; + + if (p >= 0) { + buffer.append(" "); + before = true; + } + else { + buffer.append(c); + before = false; + } + } + return new String(buffer.toString().trim()); + } + + public static String toEncString(byte b[], String charset) { + try { + return new String(b, charset); + } + catch (UnsupportedEncodingException e) { + return null; + } + } + + public static String MD5(String str) { + return MD5(str.getBytes()); + } + + public static String MD5(byte[] msg) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(msg); + + byte[] digest = md.digest(); + StringBuffer buf = new StringBuffer(digest.length * 2); + + for (int i = 0; i < digest.length; i++) { + int intVal = digest[i] & 0xff; + + if (intVal < 0x10) { + buf.append("0"); + } + + buf.append(Integer.toHexString(intVal)); + } + return buf.toString(); + } + catch (NoSuchAlgorithmException ne) { + return null; + } + } + + public static String ntos(int num, int len) { + StringBuffer buffer = new StringBuffer(); + buffer.append(Integer.toString(num)); + + while (buffer.length() < len) { + buffer.insert(0, "0"); + } + + return buffer.toString(); + } + + public static String ltos(long num, int len) { + StringBuffer buffer = new StringBuffer(); + buffer.append(Long.toString(num)); + + while (buffer.length() < len) { + buffer.insert(0, "0"); + } + + return buffer.toString(); + } + + public static String getString(char c, int length) { + char[] chars = new char[length]; + for (int i = 0; i < length; i++) { + chars[i] = c; + } + return new String(chars); + } + + public static String getDate(String format) { + return new SimpleDateFormat(format, Locale.KOREA).format(new Date()); + } + + public static String getTomorrow(String format){ + Date today = new Date(); + Date tomorrow = new Date(); + tomorrow.setTime( today.getTime() + (long) ( 1000 * 60 * 60 * 24 ) * 1 ); + return new SimpleDateFormat(format, Locale.KOREA).format(tomorrow); + } + + public static final boolean LEFT = true; + public static final boolean RIGHT = false; + + public static String justify( + boolean direction, String src, String filler, int length) { + if (src == null || filler == null || length < 0) { + return ""; + } + int len = src.getBytes().length; + if (len > length) { + return src.substring(0, length); + } + if (len == length) { + return src; + } + StringBuffer buf = direction == LEFT ? new StringBuffer(src) : new StringBuffer(); + int fillLength = length - len; + for (int i = 0; i < fillLength; i++) { + buf.append(filler); + } + if (direction == RIGHT) { + buf.append(src); + } + return buf.toString(); + } + /** + * 특정구분자로 문자열을 자르는 메소드 + * @param src + * @param filler + * @param nArrSize + * @return String [] + * @throws Exception + */ + public static String [] split( String src, byte filler, int nArrSize) throws Exception { + int iArrIndex = 0; + int iStartIndex = 0; + String [] saReturn = new String[100]; + byte[] byteOrigin = src.getBytes(); + byte[] byteArrTemp = null; + for(int idx=0; idx