Advertisement
aadddrr

GenerateBatchReportConsumer

Nov 7th, 2018
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.21 KB | None | 0 0
  1. package org.jleaf.erp.jmsclient.consumer;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.sql.Connection;
  7. import java.sql.PreparedStatement;
  8. import java.sql.ResultSet;
  9. import java.sql.SQLException;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. import java.util.Properties;
  13.  
  14. import org.jleaf.common.CommonConstants;
  15. import org.jleaf.core.BusinessFunction;
  16. import org.jleaf.core.BusinessTransaction;
  17. import org.jleaf.core.Dto;
  18. import org.jleaf.core.GeneralConstants;
  19. import org.jleaf.erp.jmsclient.ErpJleafJmsConstants;
  20. import org.jleaf.erp.jmsclient.ErpJleafProperties;
  21. import org.jleaf.erp.jmsclient.ErpJleafQueueAppContext;
  22. import org.jleaf.erp.jmsclient.util.ReportServerHttpUtilForJms;
  23. import org.jleaf.jms.AbstractConsumerWithEmail;
  24. import org.jleaf.jms.AbstractQueueAppContext;
  25. import org.jleaf.jms.bo.JmsConstants;
  26. import org.jleaf.util.DateUtil;
  27. import org.jleaf.util.DtoUtil;
  28. import org.jleaf.util.ZipUtils;
  29. import org.jleaf.util.mail.MailSenderConfig;
  30. import org.json.simple.JSONObject;
  31. import org.slf4j.Logger;
  32. import org.slf4j.LoggerFactory;
  33. import org.springframework.jdbc.core.JdbcTemplate;
  34. import org.springframework.dao.DataAccessException;
  35. import org.springframework.jdbc.core.PreparedStatementCallback;
  36. import org.springframework.jdbc.core.PreparedStatementCreator;
  37.  
  38.  
  39. public class GenerateBatchReportConsumer extends AbstractConsumerWithEmail {
  40.     private static final Logger log = LoggerFactory.getLogger(GenerateBatchReportConsumer.class);
  41.    
  42.     @Override
  43.     protected Properties getServerConfigProp() {
  44.         return ErpJleafProperties.getServerConfigProperties();
  45.     }
  46.  
  47.     @Override
  48.     public MailSenderConfig getMailConfig() {
  49.         return null;
  50.     }
  51.  
  52.     @Override
  53.     public AbstractQueueAppContext getQueueAppContext() {
  54.         return ErpJleafQueueAppContext.getInstance();
  55.     }
  56.  
  57.     String functionForSendEmail = GeneralConstants.EMPTY_VALUE;
  58.     Long requestUserId = GeneralConstants.NULL_REF_VALUE_LONG;
  59.    
  60.     @SuppressWarnings("unchecked")
  61.     @Override
  62.     protected void processExecuteQueue(String processName, String processNo, Long tenantId, Dto paramDto) throws Exception {
  63.  
  64.         String reportServerBaseUrl = getServerConfigProp().getProperty(ErpJleafJmsConstants.PROP_REPORT_SERVER_BASE_URL);
  65.         String reportServerRequestDownloadSyncUrl = reportServerBaseUrl.concat("/").concat(ErpJleafJmsConstants.REPORT_SERVER_API_REQUEST_DOWNLOAD_SYNC);
  66.        
  67.         log.info("BEGIN processing queue processName ::: "+processName);
  68.         log.info("BEGIN processing queue processNo ::: "+processNo);
  69.         log.info("BEGIN processing queue tenantId ::: "+tenantId);
  70.         log.info("BEGIN processing queue paramDto ::: "+paramDto);
  71.                
  72.         final Long reportMessageId = Long.valueOf(paramDto.get(JmsConstants.KEY_REPORT_MESSAGE_ID)+GeneralConstants.EMPTY_VALUE);
  73.        
  74.         ReportServerHttpUtilForJms reportServerHttpUtilForJms = new ReportServerHttpUtilForJms();
  75.         Connection conn = null;
  76.         FileOutputStream fos = null;
  77.         try{
  78.             // find reprot message
  79.             BusinessFunction findReportMessageById = getQueueAppContext().getContext().getBean("findReportMessageById", BusinessFunction.class);
  80.             Dto reportMessageDto = findReportMessageById.execute(new Dto().put("id", reportMessageId));
  81.            
  82.             // get common info from reportMessage
  83.             BusinessFunction getReportParameterListByReportMessageId = getQueueAppContext().getContext().getBean("getReportParameterListByReportMessageId", BusinessFunction.class);
  84.             Dto outputGetReportParameterListByReportMessageId = getReportParameterListByReportMessageId.execute(new Dto()
  85.                     .put("reportMessageId", reportMessageDto.get("id")));
  86.             Dto reportParameterDto = new Dto();
  87.             java.util.List<Dto> reportParameterList = outputGetReportParameterListByReportMessageId.getList("reportParameterList");
  88.             if(reportParameterList!=null && reportParameterList.size()>0){
  89.                 for (Dto dto : reportParameterList) {
  90.                     reportParameterDto.put(dto.get("reportParameterKey"), dto.get("reportParameterValue"));
  91.                 }
  92.             }
  93.            
  94.             // update progress report
  95.             final String datetime = org.jleaf.util.DateUtil.dateTimeNow();
  96.             BusinessTransaction updateReportMessage = getQueueAppContext().getContext()
  97.                     .getBean("updateReportMessageStatus", BusinessTransaction.class);
  98.             updateReportMessage.execute(new Dto()
  99.                     .put("userLoginId", CommonConstants.USER_SUPER_ADMIN)
  100.                     .put("tenantLoginId", tenantId)
  101.                     .put("roleLoginId", CommonConstants.ROLE_SUPER_ADMIN)
  102.                     .put("datetime", datetime)
  103.                    
  104.                     .put("id", reportMessageId)
  105.                     .put("version", reportMessageDto.get("version"))
  106.                     .put("processQueueDatetime", datetime)
  107.                     .put("processFinishDatetime", GeneralConstants.EMPTY_VALUE)
  108.                     .put("processStatus", JmsConstants.QUEUED));
  109.            
  110.             // get connection from jdbc template
  111.             JdbcTemplate jdbcTemplate = getQueueAppContext().getContext().getBean("jdbcTemplate", JdbcTemplate.class);
  112.  
  113.             conn = jdbcTemplate.getDataSource().getConnection();
  114.             conn.setAutoCommit(false);
  115.            
  116.             List<Dto> resultList = getDataListForGenerateReport(conn, reportParameterDto);
  117.            
  118.             conn.commit();
  119.            
  120.             // prepare temp dir untuk menampung kumpulan file hasil generate
  121.             File tempDir = createTempDir(reportParameterDto.getString("yearMonth"));
  122.            
  123.             for (Dto result : resultList) {
  124.  
  125.                 functionForSendEmail = reportParameterDto.getString("functionForSendEmail");
  126.                 requestUserId = Long.valueOf(reportParameterDto.get("userLoginId").toString());
  127.                
  128.                 log.info("invoice Dto ::: " + result.toString());
  129.                
  130.                 JSONObject requestBody = new JSONObject();
  131.                 JSONObject header = new JSONObject();
  132.                 JSONObject body = new JSONObject();
  133.                        
  134.                 String fileName = new StringBuilder().append(result.getString("doc_no"))
  135.                             .append("_").append(result.getString("ds_name"))
  136.                             .append("_").append(result.getString("ds_code"))
  137.                             .append(ErpJleafJmsConstants.EXT_PDF).toString();
  138.                
  139.                 JSONObject params = new JSONObject();
  140.                 params.put("sessionId", reportParameterDto.get("sessionId"));
  141.                 params.put("tenantId", Long.valueOf(reportParameterDto.get("tenantLoginId").toString()));
  142.                 params.put("invoiceId", Long.valueOf(result.get("invoice_id").toString()));
  143.                 params.put("userId", Long.valueOf(reportParameterDto.get("userLoginId").toString()));
  144.                 params.put("approvalName", reportParameterDto.get("userLoginName"));
  145.                
  146.                 header.put("userLoginId", Long.valueOf(reportParameterDto.get("userLoginId").toString()));
  147.                 header.put("roleLoginId", Long.valueOf(reportParameterDto.get("roleLoginId").toString()));
  148.                 header.put("tenantLoginId", Long.valueOf(reportParameterDto.get("tenantLoginId").toString()));
  149.                 header.put("userLoginName", reportParameterDto.get("userLoginName"));
  150.                 header.put("roleLoginName", reportParameterDto.get("roleLoginName"));
  151.                 header.put("datetime", reportParameterDto.get("datetime"));
  152.                 header.put("taskName", reportParameterDto.get("taskName"));
  153.                 header.put("sessionId", reportParameterDto.get("sessionId"));
  154.                
  155.                 body.put("reportName", reportParameterDto.get("reportName"));
  156.                 body.put("fileName", fileName);
  157.                 body.put("remark", reportParameterDto.get("remark"));
  158.                 body.put("params", params);
  159.                 body.put("requestUserId", Long.valueOf(reportParameterDto.get("userLoginId").toString()));
  160.                 body.put("requestRoleId", Long.valueOf(reportParameterDto.get("roleLoginId").toString()));
  161.                 body.put("requestUserName", reportParameterDto.get("userLoginName"));
  162.                 body.put("requestRoleName", reportParameterDto.get("roleLoginName"));
  163.                
  164.                 requestBody.put("header", header);
  165.                 requestBody.put("body", body);
  166.        
  167.                 log.info("header ::: " + header.toString());
  168.                 log.info("body ::: " + body.toString());
  169.                 log.info("requestBody ::: " + requestBody.toString());
  170.                        
  171.                 File generatedFile = new File(tempDir, fileName);
  172.                 fos = new FileOutputStream(generatedFile, false);
  173.                
  174.                 reportServerHttpUtilForJms.post(reportServerRequestDownloadSyncUrl, requestBody.toString(), fos );
  175.                 fos.close();
  176.                
  177.                 // mark generated file to be deleted on exit
  178.                 generatedFile.deleteOnExit();
  179.             }
  180.            
  181.             // Create zip file of parent temp dir
  182.             File zipFile = getZipFile(reportParameterDto);
  183.             ZipUtils.zipFolder(tempDir.getParentFile().getAbsolutePath(), zipFile.getAbsolutePath());
  184.  
  185.             Dto fileDto = new Dto();
  186.             fileDto.put("fileName", zipFile.getAbsolutePath());
  187.             fileDto.put("fileType", ErpJleafJmsConstants.FILE_TYPE_ZIP);
  188.             fileDto.put("fileSize", zipFile.length());
  189.             List<Dto> fileList = new ArrayList<Dto>(1);
  190.             fileList.add(fileDto);
  191.            
  192.             // call BT complete
  193.             BusinessTransaction completeGenerateReport = getQueueAppContext().getContext()
  194.                     .getBean("completeGenerateReport", BusinessTransaction.class);
  195.            
  196.             Dto inputDtoForCompleteGenerateReport = new Dto();
  197.             inputDtoForCompleteGenerateReport.put("tenantId", tenantId);
  198.             inputDtoForCompleteGenerateReport.put("userId", CommonConstants.USER_SUPER_ADMIN);
  199.             inputDtoForCompleteGenerateReport.put("roleId", CommonConstants.ROLE_SUPER_ADMIN);
  200.             inputDtoForCompleteGenerateReport.put("datetime", org.jleaf.util.DateUtil.dateTimeNow());
  201.             inputDtoForCompleteGenerateReport.put("reportMessageId", reportMessageId);
  202.             inputDtoForCompleteGenerateReport.put("reportStatus", JmsConstants.PROCESS_RESULT_SUCCESS);
  203.             inputDtoForCompleteGenerateReport.put("message", "Report Success Generated");
  204.             inputDtoForCompleteGenerateReport.put("fileList", fileList);
  205.            
  206.             completeGenerateReport.execute(inputDtoForCompleteGenerateReport);
  207.            
  208.             reportMessageDto = findReportMessageById.execute(new Dto().put("id", reportMessageId));
  209.             updateReportMessage.execute(new Dto()
  210.                 .put("userLoginId", CommonConstants.USER_SUPER_ADMIN)
  211.                 .put("tenantLoginId", tenantId)
  212.                 .put("roleLoginId", CommonConstants.ROLE_SUPER_ADMIN)
  213.                 .put("datetime", datetime)
  214.                
  215.                 .put("id", reportMessageId)
  216.                 .put("version", reportMessageDto.get("version"))
  217.                 .put("processQueueDatetime", reportMessageDto.get("processQueueDatetime"))
  218.                 .put("processFinishDatetime", DateUtil.dateTimeNow())
  219.                 .put("processStatus", JmsConstants.PROCESS_RESULT_SUCCESS));
  220.            
  221.            
  222.             jdbcTemplate = (JdbcTemplate) getAutowiredBean("jdbcTemplate");
  223.            
  224.             // Send Email
  225.            
  226.             PreparedStatementCreator psc = new PreparedStatementCreator() {
  227.                 @Override
  228.                 public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
  229.                     String sqlStatement = "SELECT " + functionForSendEmail + "(?, ?, ?)";
  230.                     PreparedStatement ps = con.prepareStatement(sqlStatement);
  231.  
  232.                     ps.setString(1, datetime.toString());
  233.                     ps.setLong(2, requestUserId);
  234.                     ps.setLong(3, reportMessageId);
  235.                     return ps;
  236.                 }
  237.             };
  238.  
  239.             PreparedStatementCallback<Boolean> action = new PreparedStatementCallback<Boolean>() {
  240.                 @Override
  241.                 public Boolean doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
  242.                     return ps.execute();
  243.                 }
  244.             };
  245.  
  246.             log.info("BEGIN processing... " + processName);
  247.             jdbcTemplate.execute(psc, action);
  248.            
  249. //          StringBuilder sendEmail = new StringBuilder();
  250. //          sendEmail.append(" SELECT COUNT(1) FROM ")
  251. //              .append(functionForSendEmail).append("('").append(datetime).append("', ")
  252. //              .append(requestUserId).append(", ").append(reportMessageId).append(" )");
  253. //         
  254. //          log.info("query untuk send email ::: "+sendEmail.toString());
  255. //         
  256. //          PreparedStatement prepStatement = conn.prepareStatement(sendEmail.toString());
  257. //          prepStatement.executeUpdate();
  258. //         
  259. //          conn.commit();
  260.            
  261.             log.info("DONE process report successfully");
  262.         } catch(Exception e){
  263.             if (fos != null) fos.close();
  264.            
  265.             // call BT complete
  266.             BusinessTransaction completeGenerateReport = getQueueAppContext().getContext()
  267.                     .getBean("completeGenerateReport", BusinessTransaction.class);
  268.            
  269.             Dto inputDtoForCompleteGenerateReport = new Dto();
  270.             inputDtoForCompleteGenerateReport.put("tenantId", tenantId);
  271.             inputDtoForCompleteGenerateReport.put("userId", CommonConstants.USER_SUPER_ADMIN);
  272.             inputDtoForCompleteGenerateReport.put("roleId", CommonConstants.ROLE_SUPER_ADMIN);
  273.             inputDtoForCompleteGenerateReport.put("datetime", org.jleaf.util.DateUtil.dateTimeNow());
  274.             inputDtoForCompleteGenerateReport.put("reportMessageId", reportMessageId);
  275.             inputDtoForCompleteGenerateReport.put("reportStatus", JmsConstants.PROCESS_RESULT_ERROR);
  276.             inputDtoForCompleteGenerateReport.put("message", e.getMessage());
  277.             inputDtoForCompleteGenerateReport.put("fileList", null);
  278.            
  279.             completeGenerateReport.execute(inputDtoForCompleteGenerateReport);
  280.  
  281.            
  282.             BusinessFunction findReportMessageById = getQueueAppContext().getContext().getBean("findReportMessageById", BusinessFunction.class);
  283.             Dto reportMessageDto = findReportMessageById.execute(new Dto().put("id", reportMessageId));
  284.            
  285.             String datetime = org.jleaf.util.DateUtil.dateTimeNow();
  286.             BusinessTransaction updateReportMessage = getQueueAppContext().getContext()
  287.                     .getBean("updateReportMessageStatus", BusinessTransaction.class);
  288.             updateReportMessage.execute(new Dto()
  289.                 .put("userLoginId", CommonConstants.USER_SUPER_ADMIN)
  290.                 .put("tenantLoginId", tenantId)
  291.                 .put("roleLoginId", CommonConstants.ROLE_SUPER_ADMIN)
  292.                 .put("datetime", datetime)
  293.                
  294.                 .put("id", reportMessageId)
  295.                 .put("version", reportMessageDto.get("version"))
  296.                 .put("processQueueDatetime", datetime)
  297.                 .put("processFinishDatetime", DateUtil.dateTimeNow())
  298.                 .put("processStatus", JmsConstants.PROCESS_STATUS_ERROR));
  299.  
  300.             if(conn!=null){
  301.                 conn.rollback();
  302.             }
  303.             log.error("Error processing report", e);
  304.            
  305.             throw e;
  306.         } finally{
  307.             if(conn!=null){
  308.                 conn.close();
  309.             }
  310.         }
  311.                
  312.         log.debug("END processing... " + processName);
  313.     }
  314.  
  315.     /**
  316.      * Get list data untuk generate report
  317.      */
  318.     private List<Dto> getDataListForGenerateReport(Connection conn, Dto reportParameterDto) throws SQLException {
  319.         List<Dto> resultList = new ArrayList<Dto>();
  320.                    
  321.         // Get Batch
  322.         // call function untuk mendapatkan data pendukung report yang akan digenerate
  323.         String sqlStatement = "SELECT " + reportParameterDto.getString("functionForGetBatch") + "(?)";
  324.  
  325.         log.info("query untuk get batch ::: " + sqlStatement);
  326.        
  327.         PreparedStatement ps = conn.prepareStatement(sqlStatement);
  328.         ps.setString(1, reportParameterDto.getString("yearMonth"));
  329.        
  330.         ResultSet resultSet = ps.executeQuery();
  331.        
  332.         while(resultSet.next()){
  333.            
  334.             Object rsDataObj = resultSet.getObject(1);
  335.            
  336.             if(rsDataObj instanceof ResultSet){
  337.                 ResultSet rsData = (ResultSet)rsDataObj;
  338.                 resultList = DtoUtil.createDtoListFromResultSet(rsData);
  339.             }
  340.            
  341.             log.info("resultList::: " + resultList);
  342.         }
  343.        
  344.        
  345.  
  346.         return resultList;
  347.     }
  348.    
  349.     /**
  350.      * Membuat folder temporer sebagai penampung file hasil generate report.
  351.      * Contoh folder temporer: /tmp/yiuasd/invoice_2018_06
  352.      *
  353.      * @return folder temporer sebagai penampung file hasil generate report
  354.      * @throws IOException
  355.      */
  356.     private File createTempDir(String yearMonth) throws IOException {
  357.         String tmpFolderName = getServerConfigProp().getProperty(ErpJleafJmsConstants.PROP_TASKHUB_HOME) + ErpJleafJmsConstants.TMP_FOLDER_NAME;
  358.         File mainTmpFolder = new File(tmpFolderName);
  359.         if(!mainTmpFolder.exists()){
  360.             mainTmpFolder.mkdirs();
  361.         }
  362.         log.debug("tmpParentFolder : "+tmpFolderName);
  363.  
  364.         // Create temp file, lalu hapus temp file tsb, karena akan di-recreate menjadi directory
  365.         File tempFile = File.createTempFile("invoice_tmp", "", mainTmpFolder);
  366.         String absolutePath = tempFile.getAbsolutePath();
  367.         boolean delete = tempFile.delete();
  368.         log.info(String.format("Temp file (%s) deleted: %s", absolutePath, delete));
  369.        
  370.         File tempDir = new File(absolutePath);
  371.         String childDirName = new StringBuilder().append("invoice_").append(yearMonth.substring(0, 4)).append("_").append(yearMonth.substring(4)).toString();
  372.         File tempChildDir = new File(tempDir, childDirName);
  373.         boolean mkdir = tempChildDir.mkdirs();
  374.         log.info(String.format("Temp dir (%s) created: %s", tempChildDir.getAbsolutePath(), mkdir));
  375.        
  376.         // mark directories to be deleted on exit. The sequence must be from parent folder, because the deletion sequence will be reversed
  377.         tempDir.deleteOnExit();
  378.         tempChildDir.deleteOnExit();
  379.        
  380.         return tempChildDir;
  381.     }
  382.    
  383.     /**
  384.      * Membuat object file zip yang akan berisi file-file hasil generate report
  385.      *
  386.      * @param reportParameterDto
  387.      * @return object File zip
  388.      */
  389.     private File getZipFile(Dto reportParameterDto) {
  390.         String zipFileName = new StringBuilder()
  391.                 .append("Invoice_")
  392.                 .append(reportParameterDto.getString("yearMonth").substring(0, 4))
  393.                 .append("_")
  394.                 .append(reportParameterDto.getString("yearMonth").substring(4))
  395.                 .append("_")
  396.                 .append(reportParameterDto.get("datetime"))
  397.                 .append("_")
  398.                 .append(reportParameterDto.get("userLoginName"))
  399.                 .append(ErpJleafJmsConstants.EXT_ZIP).toString();
  400.  
  401.         // Prepare folder untuk menampung zip file hasil generate
  402.         String reportFolder = getServerConfigProp().getProperty(ErpJleafJmsConstants.PROP_TASKHUB_HOME) + ErpJleafJmsConstants.OUTPUT_REPORT_FOLDER_NAME;
  403.         File reportFolderFile = new File(reportFolder);
  404.         if(!reportFolderFile.exists()){
  405.             reportFolderFile.mkdirs();
  406.         }
  407.         log.debug("reportFolder : "+reportFolder);
  408.        
  409.         return new File(reportFolder, zipFileName);
  410.  
  411.     }
  412.  
  413. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement