package com.pms.utility; import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import com.pms.service.CommonService; import com.pms.common.utils.CommonUtils; import com.pms.common.utils.Constants; public class WBSParsingUtil { @Autowired CommonService commonService; public static void main(String[] args) { // TODO Auto-generated method stub Map fileMap = new HashMap(); fileMap.put("FILE_PATH", Constants.FILE_STORAGE); fileMap.put("SAVED_FILE_NAME", "20180525-WBS.xlsx"); try{ parsingExcelFile(null, null, fileMap); }catch(Exception e){ e.printStackTrace(); } //rows의 경우 버그로 인해 파싱 시 row를 실제 값을 상수로 지정해 주어야함 //버그로 인해 마지막 row를 가져오지 못하고 있음 } /** * 업로드된 Excel File을 통해 데이터를 Parsing 한다. * @param request * @param paramMap * @return */ public static List parsingExcelFile(HttpServletRequest request,Map paramMap,Map fileMap)throws Exception{ String path = CommonUtils.checkNull(fileMap.get("FILE_PATH")); String fileName = CommonUtils.checkNull(fileMap.get("SAVED_FILE_NAME")); List resultList = new ArrayList(); FileInputStream fis = new FileInputStream(path+"\\"+fileName); XSSFWorkbook workBook = new XSSFWorkbook(fis); XSSFSheet sheet = workBook.getSheetAt(0); Connection conn = null; //테스트 // String url = "jdbc:oracle:thin:@211.48.180.237:1521:XE"; //운영 String url = "jdbc:oracle:thin:@211.48.180.15:1521:ILJITECHPDM"; String user = "plm_admin"; String pw = "admin_plm"; conn = getOracleConnection(url, user, pw); int rows = sheet.getPhysicalNumberOfRows(); executeUpdate(conn, "DELETE PMS_WBS_TASK WHERE IS_TEMPLATE_TASK = 0"); String level1ObjId = ""; String level2ObjId = ""; for(int rowIndex= 2; rowIndex < 164 ; rowIndex++){ XSSFRow row = sheet.getRow(rowIndex); System.out.println("rowIndex:"+rowIndex); if(null != row){ HashMap taskMap = new HashMap(); for(int columnIndex = 0 ; columnIndex < 6 ; columnIndex++){ XSSFCell cell = row.getCell(columnIndex); //데이버 유형별 get date String cellValue = ""; if(null == cell){ cellValue = ""; }else{ switch(cell.getCellType()){ case XSSFCell.CELL_TYPE_FORMULA: cellValue = cell.getCellFormula(); System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_FORMULA:"+cellValue); break; case XSSFCell.CELL_TYPE_NUMERIC: cellValue = cell.getNumericCellValue()+""; System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_NUMERIC:"+cellValue); break; case XSSFCell.CELL_TYPE_STRING: cellValue = cell.getStringCellValue()+""; System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_STRING:"+cellValue); break; case XSSFCell.CELL_TYPE_BLANK: cellValue = cell.getBooleanCellValue()+""; System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_BLANK:"+cellValue); break; case XSSFCell.CELL_TYPE_ERROR: cellValue = cell.getErrorCellValue()+""; System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_ERROR:"+cellValue); break; } } //Gate if(0 == columnIndex){ taskMap.put("GATE", cellValue); } //seq if(1 == columnIndex){ taskMap.put("SEQ", cellValue); } //Level if(2 == columnIndex){ taskMap.put("LEVEL", cellValue); } //Task Name if(3 == columnIndex){ taskMap.put("TASK_NAME", cellValue); } if(4 == columnIndex){ String deptCode = ""; //담당부서에 해당하는 영역에 담당부서 명이 작성된 경우 if(!"".equals(CommonUtils.checkNull(cellValue))){ Map sqlParamMap = new HashMap(); sqlParamMap.put("deptName", cellValue.replaceAll("'", "")); //담당부서로 작성된 부서의 DEPT_CODE를 가져온다. String selectQuery = getTaskDeptInfo(sqlParamMap); Map deptInfoMap = new HashMap(); //like 검색을 기준으로 다수의 부서가 나올 수 있어 그중 1번째에 해당하는 부서의 정보를 가져온다. deptInfoMap = executeQueryReturnMap(conn, selectQuery); if(null != deptInfoMap){ deptCode = CommonUtils.checkNull(deptInfoMap.get("DEPT_CODE")); } } taskMap.put("TASK_DEPT", deptCode); } if(5 == columnIndex){ if("false".equals(cellValue)){ cellValue=""; } taskMap.put("BASE_DATE", cellValue); break; } } String gate = CommonUtils.checkNull(taskMap.get("GATE")); if(gate.contains(".")){ gate = gate.substring(0, gate.indexOf(".")); } String seq = CommonUtils.checkNull(taskMap.get("SEQ")); String level = CommonUtils.checkNull(taskMap.get("LEVEL")); if(level.contains(".")){ level = level.substring(0, level.indexOf(".")); } String taskName = CommonUtils.checkNull(taskMap.get("TASK_NAME")); String taskDept = CommonUtils.checkNull(taskMap.get("TASK_DEPT")); String baseDate = CommonUtils.checkNull(taskMap.get("BASE_DATE")); if(baseDate.contains(".")){ baseDate = baseDate.substring(0, baseDate.indexOf(".")); } if("1".equals(level)){ Map wbsTaskSqlMap = new HashMap(); level1ObjId = CommonUtils.createObjId(); wbsTaskSqlMap.put("OBJID", level1ObjId); wbsTaskSqlMap.put("PARENT_OBJID", ""); wbsTaskSqlMap.put("TASK_NAME", taskName); wbsTaskSqlMap.put("TASK_TYPE", ""); wbsTaskSqlMap.put("PROJECT_STEP", gate); wbsTaskSqlMap.put("WBS_CODE", ""); wbsTaskSqlMap.put("SEQ", seq); wbsTaskSqlMap.put("TASK_DEPT", ""); wbsTaskSqlMap.put("BASE_SCHEDULE", ""); wbsTaskSqlMap.put("STATUS", "create"); String insertQuery = insertWBSTaskInfo(wbsTaskSqlMap); int cnt = executeUpdate(conn, insertQuery); System.out.println("level : "+level+", SEQ : "+seq+" Query Result Cnt : "+cnt); } if("2".equals(level)){ Map wbsTaskSqlMap = new HashMap(); level2ObjId = CommonUtils.createObjId(); wbsTaskSqlMap.put("OBJID", level2ObjId); wbsTaskSqlMap.put("PARENT_OBJID", level1ObjId); wbsTaskSqlMap.put("TASK_NAME", taskName); wbsTaskSqlMap.put("TASK_TYPE", ""); wbsTaskSqlMap.put("PROJECT_STEP", gate); wbsTaskSqlMap.put("WBS_CODE", ""); wbsTaskSqlMap.put("SEQ", seq); wbsTaskSqlMap.put("TASK_DEPT", ""); wbsTaskSqlMap.put("BASE_SCHEDULE", ""); wbsTaskSqlMap.put("STATUS", "create"); String insertQuery = insertWBSTaskInfo(wbsTaskSqlMap); int cnt = executeUpdate(conn, insertQuery); System.out.println("level : "+level+", SEQ : "+seq+" Query Result Cnt : "+cnt); } if("3".equals(level)){ Map wbsTaskSqlMap = new HashMap(); wbsTaskSqlMap.put("OBJID", CommonUtils.createObjId()); wbsTaskSqlMap.put("PARENT_OBJID", level2ObjId); wbsTaskSqlMap.put("TASK_NAME", taskName); wbsTaskSqlMap.put("TASK_TYPE", "task"); wbsTaskSqlMap.put("PROJECT_STEP", gate); wbsTaskSqlMap.put("WBS_CODE", ""); wbsTaskSqlMap.put("SEQ", seq); wbsTaskSqlMap.put("TASK_DEPT", taskDept); wbsTaskSqlMap.put("BASE_SCHEDULE", baseDate); wbsTaskSqlMap.put("STATUS", "create"); String insertQuery = insertWBSTaskInfo(wbsTaskSqlMap); int cnt = executeUpdate(conn, insertQuery); System.out.println("level : "+level+", SEQ : "+seq+" Query Result Cnt : "+cnt); } System.out.println("partMap:"+taskMap); } } return resultList; } public static Connection getOracleConnection(String url, String user, String pass){ Connection conn = null; try{ Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection(url, user, pass); conn.setAutoCommit(true); }catch(Exception e){ e.printStackTrace(); } return conn; } public static int executeUpdate(Connection conn, String query) throws Exception { Statement stmt = null; int resultCount = 0; try{ System.out.println("executeUpdate(query):"+query); stmt = conn.createStatement(); resultCount = stmt.executeUpdate(query); }finally{ try{ if(stmt!=null)stmt.close(); }catch(Exception ee){ ee.printStackTrace(); } } return resultCount; } /** * 데이터 조회(select only) * @param conn * @return */ public static ArrayList> executeQuery(Connection conn, String query){ ArrayList> resultList = new ArrayList(); Statement stat = null; ResultSet rs = null; try{ System.out.println("executeQuery(query):"+query); stat = conn.createStatement(); rs = stat.executeQuery(query); ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); String[] columnArray = new String[columnCount]; for(int i = 0; i < columnArray.length; i++){ columnArray[i] = metaData.getColumnLabel(i+1); } while(rs.next()){ HashMap map = new HashMap(); for(int i = 0 ; i < columnArray.length; i++){ map.put(CommonUtils.checkNull(columnArray[i]), CommonUtils.checkNull(rs.getString(columnArray[i]))); } System.out.println("executeQuery(map)"+map); resultList.add(map); } System.out.println("executeQuery(resultList.size):"+resultList.size()); return resultList; }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(rs!=null)rs.close(); if(stat!=null)stat.close(); }catch(Exception ee){ ee.printStackTrace(); } } return resultList; } public static HashMap executeQueryReturnMap(Connection conn, String query){ HashMap resultMap = new HashMap(); Statement stat = null; ResultSet rs = null; try{ System.out.println("executeQueryReturnMap(query):"+query); stat = conn.createStatement(); rs = stat.executeQuery(query); ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); String[] columnArray = new String[columnCount]; for(int i = 0; i < columnArray.length; i++){ columnArray[i] = metaData.getColumnLabel(i+1); } while(rs.next()){ HashMap map = new HashMap(); for(int i = 0 ; i < columnArray.length; i++){ resultMap.put(CommonUtils.checkNull(columnArray[i]), CommonUtils.checkNull(rs.getString(columnArray[i]))); } } System.out.println("executeQueryReturnMap(resultMap):"+resultMap); return resultMap; }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(rs!=null)rs.close(); if(stat!=null)stat.close(); }catch(Exception ee){ ee.printStackTrace(); } } return resultMap; } /** * 해당하는 Task 명에 해당하는 정보를 가져온다. * @param paramMap * @return */ public static String getWBSTaskInfo(Map paramMap){ StringBuffer sb = new StringBuffer(); String taskName = CommonUtils.checkNull(paramMap.get("taskName")); sb.append("SELECT \n"); sb.append(" OBJID, \n"); sb.append(" TARGET_OBJID, \n"); sb.append(" PARENT_OBJID, \n"); sb.append(" TASK_NAME, \n"); sb.append(" TASK_TYPE, \n"); sb.append(" PROJ_STEP, \n"); sb.append(" WBS_CODE, \n"); sb.append(" SEQ, \n"); sb.append(" TASK_START_PLAN_DATE, \n"); sb.append(" TASK_END_PLAN_DATE, \n"); sb.append(" IS_TEMPLATE_TASK, \n"); sb.append(" TASK_END_DATE, \n"); sb.append(" TASK_DEPT, \n"); sb.append(" BASE_SCHEDULE, \n"); sb.append(" REGDATE, \n"); sb.append(" STATUS, \n"); sb.append(" WRITER \n"); sb.append("FROM PMS_WBS_TASK \n"); sb.append("WHERE IS_TEMPLATE_TASK = '0' \n"); if(!"".equals(taskName)){ sb.append("AND TASK_NAME = '"+taskName+"'\n"); } return sb.toString(); } /** * 작성된 부서명에 해당하는 부서의 dept_id를 가져온다. * @param paramMap * @return */ public static String getTaskDeptInfo(Map paramMap){ StringBuffer sb = new StringBuffer(); String deptName = CommonUtils.checkNull(paramMap.get("deptName")); sb.append("SELECT * FROM(\n"); sb.append(" SELECT\n"); sb.append(" ROWNUM RNUM,\n"); sb.append(" DEPT_CODE,\n"); sb.append(" DEPT_NAME\n"); sb.append(" FROM DEPT_INFO\n"); if(!"".equals(deptName)){ sb.append(" WHERE DEPT_NAME = '"+deptName+"' \n"); sb.append(" AND LOCATION = 'G001'"); } sb.append(" )WHERE RNUM = '1'\n"); return sb.toString(); } /** * WBS Task를 입력한다. * @param paramMap * @return */ public static String insertWBSTaskInfo(Map paramMap){ StringBuffer sb = new StringBuffer(); sb.append("INSERT INTO \n"); sb.append(" PMS_WBS_TASK ( \n"); sb.append(" OBJID, \n"); sb.append(" PARENT_OBJID, \n"); sb.append(" TASK_NAME, \n"); sb.append(" TASK_TYPE, \n"); sb.append(" PROJ_STEP, \n"); sb.append(" WBS_CODE, \n"); sb.append(" SEQ, \n"); sb.append(" IS_TEMPLATE_TASK, \n"); sb.append(" TASK_DEPT, \n"); sb.append(" BASE_SCHEDULE, \n"); sb.append(" REGDATE, \n"); sb.append(" STATUS \n"); sb.append(" ) \n"); sb.append("VALUES \n"); sb.append(" ( \n"); sb.append(" '"+CommonUtils.checkNull(paramMap.get("OBJID"))+"', \n"); sb.append(" '"+CommonUtils.checkNull(paramMap.get("PARENT_OBJID"))+"', \n"); sb.append(" '"+CommonUtils.checkNull(paramMap.get("TASK_NAME"))+"', \n"); sb.append(" '"+CommonUtils.checkNull(paramMap.get("TASK_TYPE"))+"', \n"); sb.append(" '"+CommonUtils.checkNull(paramMap.get("PROJECT_STEP"))+"', \n"); sb.append(" '"+CommonUtils.checkNull(paramMap.get("WBS_CODE"))+"', \n"); sb.append(" '"+CommonUtils.checkNull(paramMap.get("SEQ"))+"', \n"); sb.append(" '"+CommonUtils.checkNull(0)+"', \n"); sb.append(" '"+CommonUtils.checkNull(paramMap.get("TASK_DEPT"))+"', \n"); sb.append(" '"+CommonUtils.checkNull(paramMap.get("BASE_SCHEDULE"))+"', \n"); sb.append(" SYSDATE, \n"); sb.append(" '"+CommonUtils.checkNull(paramMap.get("STATUS"))+"' \n"); sb.append(" ) \n"); return sb.toString(); } }