diff --git a/src/main/java/com/batch/config/BatchMatchingConfig.java b/src/main/java/com/batch/config/BatchMatchingConfig.java index 3518aa0..467cc34 100644 --- a/src/main/java/com/batch/config/BatchMatchingConfig.java +++ b/src/main/java/com/batch/config/BatchMatchingConfig.java @@ -20,13 +20,10 @@ import org.springframework.batch.item.support.ListItemReader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.transaction.PlatformTransactionManager; import com.batch.mapper.primary.MatchingInnerDelingMapper; -import org.springframework.batch.integration.async.AsyncItemProcessor; - import lombok.extern.slf4j.Slf4j; @Configuration diff --git a/src/main/java/com/batch/config/MatchingExtraProcessorAuto.java b/src/main/java/com/batch/config/MatchingExtraProcessorAuto.java index 2faafef..48ca14e 100644 --- a/src/main/java/com/batch/config/MatchingExtraProcessorAuto.java +++ b/src/main/java/com/batch/config/MatchingExtraProcessorAuto.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import org.springframework.batch.core.configuration.annotation.StepScope; import com.batch.mapper.primary.MatchingInnerDelingMapper; import com.batch.util.StatisticsUtil; @@ -23,220 +22,227 @@ public class MatchingExtraProcessorAuto { private final MatchingInnerDelingMapper matchingInnerDelingMapper; - @SuppressWarnings("unchecked") - public void process(Map paramRec, int iCmbnOwnCnt, int iCmbnTranCnt, int iStartOwn, int iStartTran, int mtchNumber) throws Exception { - - //Job Create Log - UUID uuid = UUID.randomUUID(); - HashMap mt = new HashMap(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); - String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); - - Map paramLog = new HashMap(); - paramLog.put("user_job_id", sDate); - paramLog.put("user_job_name", "자동조합매칭(" + paramRec.toString() + ",[" + iCmbnOwnCnt + "," + iStartOwn + "],[" + iCmbnTranCnt + "," + iStartTran + "])"); - matchingInnerDelingMapper.createUserJob(paramLog); - - - int iUpdated = 0; - - String sSysSe = (String) paramRec.get("sys_se"); - String sAccnutYm = (String) paramRec.get("accnut_ym"); - String sCprCode = (String) paramRec.get("cpr_code"); - String sPartCpr = (String) paramRec.get("partn_cpr"); - String sDelngCrncy = (String) paramRec.get("delng_crncy"); - String sConds = (String) paramRec.get("conds"); - - //작업시작 - Map mParam = new HashMap(); - mParam.put("sysSe", sSysSe); - mParam.put("accnutYm", sAccnutYm); - mParam.put("conds", sConds); - mParam.put("delngCrncy", sDelngCrncy); - - //---------------------------------------------------------------------------- - //자기법인 데이타 가져오기 - mParam.put("cprCode", sCprCode); - mParam.put("partnCpr", sPartCpr); - List lMatchingDataOne = matchingInnerDelingMapper.getMatchingExtraDataOne(mParam); - - //상대법인 데이타 가져오기 - mParam.put("cprCode", sPartCpr); - mParam.put("partnCpr", sCprCode); - List lMatchingDataTwo = matchingInnerDelingMapper.getMatchingExtraDataTwo(mParam); - - //Combination 데이타 만들기 + @SuppressWarnings({ "unchecked", "rawtypes" }) + public long process(Map paramRec, int iCmbnOwnCnt, int iCmbnTranCnt, int iStartOwn, int iStartTran, long mtchNumber) throws Exception { + + // Job Create Log + UUID uuid = UUID.randomUUID(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); + + Map paramLog = new HashMap(); + paramLog.put("user_job_id", sDate); + paramLog.put("user_job_name", "자동조합매칭(" + paramRec.toString() + ",[" + iCmbnOwnCnt + "," + iStartOwn + "],[" + iCmbnTranCnt + "," + iStartTran + "])"); + matchingInnerDelingMapper.createUserJob(paramLog); + + int iUpdated = 0; + + String sSysSe = (String) paramRec.get("sys_se"); + String sAccnutYm = (String) paramRec.get("accnut_ym"); + String sCprCode = (String) paramRec.get("cpr_code"); + String sPartCpr = (String) paramRec.get("partn_cpr"); + String sDelngCrncy = (String) paramRec.get("delng_crncy"); + String sConds = (String) paramRec.get("conds"); + + // 작업시작 + Map mParam = new HashMap(); + mParam.put("sysSe", sSysSe); + mParam.put("accnutYm", sAccnutYm); + mParam.put("conds", sConds); + mParam.put("delngCrncy", sDelngCrncy); + + // ---------------------------------------------------------------------------- + // 자기법인 데이타 가져오기 + mParam.put("cprCode", sCprCode); + mParam.put("partnCpr", sPartCpr); + List lMatchingDataOne = matchingInnerDelingMapper.getMatchingExtraDataOne(mParam); + + // 상대법인 데이타 가져오기 + mParam.put("cprCode", sPartCpr); + mParam.put("partnCpr", sCprCode); + List lMatchingDataTwo = matchingInnerDelingMapper.getMatchingExtraDataTwo(mParam); + + // Combination 데이타 만들기 List compResult = new ArrayList(); List> llMatchingDataOne = new ArrayList>(); List> llMatchingDataTwo = new ArrayList>(); - + int iEndOwn = lMatchingDataOne.size(); if (iCmbnOwnCnt == 2) { iEndOwn = iStartOwn + 1000; - if (iEndOwn > lMatchingDataOne.size()) iEndOwn = lMatchingDataOne.size(); + if (iEndOwn > lMatchingDataOne.size()) + iEndOwn = lMatchingDataOne.size(); } if (iCmbnOwnCnt == 3) { iEndOwn = iStartOwn + 50; - if (iEndOwn > lMatchingDataOne.size()) iEndOwn = lMatchingDataOne.size(); + if (iEndOwn > lMatchingDataOne.size()) + iEndOwn = lMatchingDataOne.size(); } if (iCmbnOwnCnt > 3) { iEndOwn = iStartOwn + 25; - if (iEndOwn > lMatchingDataOne.size()) iEndOwn = lMatchingDataOne.size(); + if (iEndOwn > lMatchingDataOne.size()) + iEndOwn = lMatchingDataOne.size(); } int iEndTran = lMatchingDataTwo.size(); if (iCmbnTranCnt == 2) { iEndTran = iStartTran + 1000; - if (iEndTran > lMatchingDataTwo.size()) iEndTran = lMatchingDataTwo.size(); + if (iEndTran > lMatchingDataTwo.size()) + iEndTran = lMatchingDataTwo.size(); } if (iCmbnTranCnt == 3) { iEndTran = iStartTran + 50; - if (iEndTran > lMatchingDataTwo.size()) iEndTran = lMatchingDataTwo.size(); + if (iEndTran > lMatchingDataTwo.size()) + iEndTran = lMatchingDataTwo.size(); } if (iCmbnTranCnt > 3) { iEndTran = iStartTran + 25; - if (iEndTran > lMatchingDataTwo.size()) iEndTran = lMatchingDataTwo.size(); + if (iEndTran > lMatchingDataTwo.size()) + iEndTran = lMatchingDataTwo.size(); + } + + StatisticsUtil.reculsion(lMatchingDataOne, compResult, iStartOwn, iEndOwn, iCmbnOwnCnt, llMatchingDataOne); + StatisticsUtil.reculsion(lMatchingDataTwo, compResult, iStartTran, iEndTran, iCmbnTranCnt, llMatchingDataTwo); + + // ---------------------------------------------------------------------------- + // 자기법인 데이타를 맵으로 처리한다. + Map>> mMatchingDataOne = new HashMap>>(); + for (List curlMap : llMatchingDataOne) { + BigDecimal bdKey = BigDecimal.ZERO; + for (Map curMap : curlMap) { + bdKey = bdKey.add((BigDecimal) curMap.get("delng_amt")); + } + List> curllMap = new ArrayList>(); + if (mMatchingDataOne.containsKey(bdKey)) + curllMap = mMatchingDataOne.get(bdKey); + curllMap.add(curlMap); + mMatchingDataOne.put(bdKey, curllMap); } - - StatisticsUtil.reculsion(lMatchingDataOne, compResult, iStartOwn, iEndOwn, iCmbnOwnCnt, llMatchingDataOne); - StatisticsUtil.reculsion(lMatchingDataTwo, compResult, iStartTran, iEndTran, iCmbnTranCnt, llMatchingDataTwo); - - //---------------------------------------------------------------------------- - //자기법인 데이타를 맵으로 처리한다. - Map>> mMatchingDataOne = new HashMap>>(); - for (List curlMap : llMatchingDataOne) { - BigDecimal bdKey = BigDecimal.ZERO; - for(Map curMap : curlMap) { - bdKey = bdKey.add((BigDecimal) curMap.get("delng_amt")); - } - List> curllMap = new ArrayList>(); - if (mMatchingDataOne.containsKey(bdKey)) curllMap = mMatchingDataOne.get(bdKey); - curllMap.add(curlMap); - mMatchingDataOne.put(bdKey, curllMap); - } - - //상대법인 데이타를 맵으로 처리한다. - Map>> mMatchingDataTwo = new HashMap>>(); - for (List curlMap : llMatchingDataTwo) { - BigDecimal bdKey = BigDecimal.ZERO; - for(Map curMap : curlMap) { - bdKey = bdKey.add((BigDecimal) curMap.get("delng_amt")); - } - List> curllMap = new ArrayList>(); - if (mMatchingDataTwo.containsKey(bdKey)) curllMap = mMatchingDataTwo.get(bdKey); - curllMap.add(curlMap); - mMatchingDataTwo.put(bdKey, curllMap); - } - - //여기서 매칭 비교 - //비교 lMatchingDataOne vs mMatchingDataTwo - List lMatchingResultUpdate = new ArrayList(); //업데이트할 대상 - - String mtchSys = "AUTO"; - String mtchType = "EX_" + iCmbnOwnCnt + "_" + iCmbnTranCnt; - String mtchTypeName = "자기(" + iCmbnOwnCnt + "건Sum), 상대(" + iCmbnTranCnt + "건Sum), ("+sDelngCrncy+"), 비교(금액)"; - for (BigDecimal curKey : mMatchingDataOne.keySet()) { - if (mMatchingDataTwo.containsKey(curKey)) { - List> llMapOne = mMatchingDataOne.get(curKey); - List> llMapTwo = mMatchingDataTwo.get(curKey); - - //위와 관련된 동일 레코드가 있는 리스트 삭제 - for (int i=llMapOne.size()-1; i>=0;i--) { - List curlMap = llMapOne.get(i); + + // 상대법인 데이타를 맵으로 처리한다. + Map>> mMatchingDataTwo = new HashMap>>(); + for (List curlMap : llMatchingDataTwo) { + BigDecimal bdKey = BigDecimal.ZERO; + for (Map curMap : curlMap) { + bdKey = bdKey.add((BigDecimal) curMap.get("delng_amt")); + } + List> curllMap = new ArrayList>(); + if (mMatchingDataTwo.containsKey(bdKey)) + curllMap = mMatchingDataTwo.get(bdKey); + curllMap.add(curlMap); + mMatchingDataTwo.put(bdKey, curllMap); + } + + // 여기서 매칭 비교 + // 비교 lMatchingDataOne vs mMatchingDataTwo + List lMatchingResultUpdate = new ArrayList(); // 업데이트할 대상 + + String mtchSys = "AUTO"; + String mtchType = "EX_" + iCmbnOwnCnt + "_" + iCmbnTranCnt; + String mtchTypeName = "자기(" + iCmbnOwnCnt + "건Sum), 상대(" + iCmbnTranCnt + "건Sum), (" + sDelngCrncy + "), 비교(금액)"; + for (BigDecimal curKey : mMatchingDataOne.keySet()) { + if (mMatchingDataTwo.containsKey(curKey)) { + List> llMapOne = mMatchingDataOne.get(curKey); + List> llMapTwo = mMatchingDataTwo.get(curKey); + + // 위와 관련된 동일 레코드가 있는 리스트 삭제 + for (int i = llMapOne.size() - 1; i >= 0; i--) { + List curlMap = llMapOne.get(i); for (Map curMap : lMatchingResultUpdate) { int curIdx = curlMap.indexOf(curMap); if (curIdx != -1) { llMapOne.remove(i); break; - } + } } } - for (int i=llMapTwo.size()-1; i>=0;i--) { - List curlMap = llMapTwo.get(i); + for (int i = llMapTwo.size() - 1; i >= 0; i--) { + List curlMap = llMapTwo.get(i); for (Map curMap : lMatchingResultUpdate) { int curIdx = curlMap.indexOf(curMap); if (curIdx != -1) { llMapTwo.remove(i); break; - } + } } } - - - int iMin = Math.min(llMapOne.size(), llMapTwo.size()); - if (iMin > 0) mtchNumber++; - while (iMin > 0) { - List curlMapOne = llMapOne.get(0); - for (Map curMap : curlMapOne) { - curMap.put("mtch_sys", mtchSys); - curMap.put("mtch_ty", mtchType); - curMap.put("mtch_ty_nm", mtchTypeName); - curMap.put("mtch_ky", mtchNumber); - lMatchingResultUpdate.add(curMap); - } + + int iMin = Math.min(llMapOne.size(), llMapTwo.size()); + if (iMin > 0) { + mtchNumber++; + } + while (iMin > 0) { + List curlMapOne = llMapOne.get(0); + for (Map curMap : curlMapOne) { + curMap.put("mtch_sys", mtchSys); + curMap.put("mtch_ty", mtchType); + curMap.put("mtch_ty_nm", mtchTypeName); + curMap.put("mtch_ky", mtchNumber); + lMatchingResultUpdate.add(curMap); + } llMapOne.remove(0); List curlMapTwo = llMapTwo.get(0); - for (Map curMap : curlMapTwo) { - curMap.put("mtch_sys", mtchSys); - curMap.put("mtch_ty", mtchType); - curMap.put("mtch_ty_nm", mtchTypeName); - curMap.put("mtch_ky", mtchNumber); - lMatchingResultUpdate.add(curMap); - } + for (Map curMap : curlMapTwo) { + curMap.put("mtch_sys", mtchSys); + curMap.put("mtch_ty", mtchType); + curMap.put("mtch_ty_nm", mtchTypeName); + curMap.put("mtch_ky", mtchNumber); + lMatchingResultUpdate.add(curMap); + } llMapTwo.remove(0); - //위와 관련된 동일 레코드가 있는 리스트 삭제(추가 업데이트 목록) - for (int i=llMapOne.size()-1; i>=0;i--) { - List curlMap = llMapOne.get(i); - for (Map curMap : curlMapOne) { - int curIdx = curlMap.indexOf(curMap); - if (curIdx != -1) { - llMapOne.remove(i); - break; - } - } - } - for (int i=llMapTwo.size()-1; i>=0;i--) { - List curlMap = llMapTwo.get(i); - for (Map curMap : curlMapTwo) { - int curIdx = curlMap.indexOf(curMap); - if (curIdx != -1) { - llMapTwo.remove(i); - break; - } - } - } - iMin = Math.min(llMapOne.size(), llMapTwo.size()); - } - } - } - - //---------------------------------------------------------------------------- - //여기서 결과 업데이트 - iUpdated = 0; - int limit = 1000; //1000건씩 batch - List lUpdated = new ArrayList(); - for (Map curMap : lMatchingResultUpdate) { - lUpdated.add(curMap); - if (lUpdated.size() == limit) { - matchingInnerDelingMapper.setExtraResult(Map.of("itemList", lUpdated)); - iUpdated = iUpdated + lUpdated.size(); - lUpdated.clear(); - } - } - if (lUpdated.size() > 0) { - matchingInnerDelingMapper.setExtraResult(Map.of("itemList", lUpdated)); - iUpdated = iUpdated + lUpdated.size(); - } - log.debug("Updated OrgData : " + iUpdated + "건"); - - - //작업종료에 대한 로그 업데이트 - paramLog.put("exit_code", "0"); - paramLog.put("exit_message", ""); - matchingInnerDelingMapper.finishUserJob(paramLog); - - } - + // 위와 관련된 동일 레코드가 있는 리스트 삭제(추가 업데이트 목록) + for (int i = llMapOne.size() - 1; i >= 0; i--) { + List curlMap = llMapOne.get(i); + for (Map curMap : curlMapOne) { + int curIdx = curlMap.indexOf(curMap); + if (curIdx != -1) { + llMapOne.remove(i); + break; + } + } + } + for (int i = llMapTwo.size() - 1; i >= 0; i--) { + List curlMap = llMapTwo.get(i); + for (Map curMap : curlMapTwo) { + int curIdx = curlMap.indexOf(curMap); + if (curIdx != -1) { + llMapTwo.remove(i); + break; + } + } + } + iMin = Math.min(llMapOne.size(), llMapTwo.size()); + } + } + } + + // ---------------------------------------------------------------------------- + // 여기서 결과 업데이트 + iUpdated = 0; + int limit = 1000; // 1000건씩 batch + List lUpdated = new ArrayList(); + for (Map curMap : lMatchingResultUpdate) { + lUpdated.add(curMap); + if (lUpdated.size() == limit) { + matchingInnerDelingMapper.setExtraResult(Map.of("itemList", lUpdated)); + iUpdated = iUpdated + lUpdated.size(); + lUpdated.clear(); + } + } + if (lUpdated.size() > 0) { + matchingInnerDelingMapper.setExtraResult(Map.of("itemList", lUpdated)); + iUpdated = iUpdated + lUpdated.size(); + } + log.debug("Updated OrgData : " + iUpdated + "건"); + + // 작업종료에 대한 로그 업데이트 + paramLog.put("exit_code", "0"); + paramLog.put("exit_message", ""); + matchingInnerDelingMapper.finishUserJob(paramLog); + + return mtchNumber; + } + } \ No newline at end of file diff --git a/src/main/java/com/batch/config/MatchingItemWriter.java b/src/main/java/com/batch/config/MatchingItemWriter.java index a08cc07..c174312 100644 --- a/src/main/java/com/batch/config/MatchingItemWriter.java +++ b/src/main/java/com/batch/config/MatchingItemWriter.java @@ -1,13 +1,8 @@ package com.batch.config; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import org.springframework.batch.core.configuration.annotation.JobScope; -import org.springframework.batch.item.ItemProcessor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.batch.mapper.primary.MatchingInnerDelingMapper; diff --git a/src/main/java/com/batch/config/MatchingSetup.java b/src/main/java/com/batch/config/MatchingSetup.java index df65ddc..2150f42 100644 --- a/src/main/java/com/batch/config/MatchingSetup.java +++ b/src/main/java/com/batch/config/MatchingSetup.java @@ -1,6 +1,5 @@ package com.batch.config; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/batch/config/PrimaryMybatisConfiguration.java b/src/main/java/com/batch/config/PrimaryMybatisConfiguration.java index 78f0dc4..1d1dd3e 100644 --- a/src/main/java/com/batch/config/PrimaryMybatisConfiguration.java +++ b/src/main/java/com/batch/config/PrimaryMybatisConfiguration.java @@ -11,7 +11,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; -import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @MapperScan(value = "com.batch.mapper.primary", sqlSessionFactoryRef="primarySqlSessionFactory") diff --git a/src/main/java/com/batch/config/SecondaryMyBatisConfiguration.java b/src/main/java/com/batch/config/SecondaryMyBatisConfiguration.java index 788765d..eb5225d 100644 --- a/src/main/java/com/batch/config/SecondaryMyBatisConfiguration.java +++ b/src/main/java/com/batch/config/SecondaryMyBatisConfiguration.java @@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @MapperScan(value = "com.batch.mapper.secondary", sqlSessionFactoryRef="secondarySqlSessionFactory") diff --git a/src/main/java/com/batch/controller/JobController.java b/src/main/java/com/batch/controller/JobController.java index bf4e6f6..bc73485 100644 --- a/src/main/java/com/batch/controller/JobController.java +++ b/src/main/java/com/batch/controller/JobController.java @@ -7,8 +7,6 @@ import java.util.Map; import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Isolation; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -19,7 +17,6 @@ import org.springframework.web.bind.annotation.RestController; import com.batch.config.MatchingSetup; import com.batch.config.MatchingSetup.Matching; import com.batch.mapper.primary.MatchingInnerDelingMapper; -import com.batch.mapper.secondary.OracleMapper; import com.batch.service.JobService; import com.batch.util.FileUtil; import com.google.gson.JsonObject; @@ -43,6 +40,17 @@ public class JobController { /** * TODO : AI 서버에 특정 경로에 생성되는 파일을 읽는(끝에 50줄 정도) API * */ + @PostMapping("/readlogs") + public StringBuffer readLogs( @RequestBody Map params) throws Exception { + StringBuffer sb = new StringBuffer(); + + String filePath = params.get("filePath"); + int readCnt = Integer.parseInt(params.get("readCnt")); + + sb = FileUtil.readFileLastLines(filePath, readCnt); + + return sb; + } @PostMapping("/create") public Map createJob( @RequestBody Map params) throws Exception { @@ -146,11 +154,9 @@ public class JobController { /** extraJobSub2 start ************************************************************************************** */ long startTime = System.currentTimeMillis(); - log.info("### Start Extra Matching Job : "+startTime); + log.info("### Start Extra Matching Job2 : "+startTime); jobService.extraJobSub2(sJobGroup, params); - long endTime = System.currentTimeMillis(); - log.info("### End Extra Matching Job : "+endTime); /** extraJobSub2 end ************************************************************************************** */ diff --git a/src/main/java/com/batch/mapper/primary/MatchingInnerDelingMapper.java b/src/main/java/com/batch/mapper/primary/MatchingInnerDelingMapper.java index d6034aa..e565092 100644 --- a/src/main/java/com/batch/mapper/primary/MatchingInnerDelingMapper.java +++ b/src/main/java/com/batch/mapper/primary/MatchingInnerDelingMapper.java @@ -169,4 +169,27 @@ public interface MatchingInnerDelingMapper { @SuppressWarnings("rawtypes") List getUserJobStatus(Map param); + + + + + + /** + * 매칭제외1 : 거래금액 = 0 + * @param param + * @return + */ + @SuppressWarnings("rawtypes") + int updateInitExclusion1(Map param); + + + /** + * 매칭제외2 : 거래유형, 자기/상대 법인, 거래일자, 계정 이 같은 1:1 내역 금액이 +, - 로 합이 0 인 경우 + * @param param + * @return + */ + @SuppressWarnings("rawtypes") + int updateInitExclusion2(Map param); + + } \ No newline at end of file diff --git a/src/main/java/com/batch/service/JobService.java b/src/main/java/com/batch/service/JobService.java index ad170b3..cc17a0f 100644 --- a/src/main/java/com/batch/service/JobService.java +++ b/src/main/java/com/batch/service/JobService.java @@ -24,8 +24,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Isolation; -import org.springframework.transaction.annotation.Transactional; import org.zeroturnaround.exec.ProcessExecutor; import org.zeroturnaround.exec.stream.LogOutputStream; @@ -48,455 +46,458 @@ public class JobService { @Value("${python.ai.target}") String sPythonAiTarget; - - @Autowired - private JobLauncher jobLauncher; - @Autowired - private ApplicationContext context; + @Autowired + private JobLauncher jobLauncher; - @Autowired - private MatchingInnerDelingMapper matchingInnerDelingMapper; + @Autowired + private ApplicationContext context; - @Autowired - private OracleMapper oracleMapper; - - - @SuppressWarnings("rawtypes") + @Autowired + private MatchingInnerDelingMapper matchingInnerDelingMapper; + + @Autowired + private OracleMapper oracleMapper; + + @SuppressWarnings("rawtypes") @Async("commAsync") - public void matchingJob(String jobGroupId, Map params) throws Exception { - - //Job Create Log - UUID uuid = UUID.randomUUID(); - HashMap mt = new HashMap(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); - String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); - - Map paramLog = new HashMap(); - paramLog.put("user_job_group", jobGroupId); - paramLog.put("user_job_id", sDate); - paramLog.put("user_job_name", "자동매칭(" + params.toString() + ")"); - matchingInnerDelingMapper.createUserJob(paramLog); - - String sThreadName = Thread.currentThread().getName(); - long startTime = System.currentTimeMillis(); - log.info("[" + sThreadName + "]Job Started : " + startTime); - log.debug("[" + sThreadName + "]params=" + params.toString()); - - StringBuffer sb = FileUtil.readFileToString("matchingSetup.json"); - MatchingSetup matchingSetup = (MatchingSetup) FileUtil.strToObj(sb.toString(), MatchingSetup.class); - - String sJobTypeList = params.get("jobType").toUpperCase(); - List lJobType = Arrays.asList(sJobTypeList != null?sJobTypeList.split(","):new String[0]); - - //파라미터가 ALL일 경우 ALL 대신 등록된 모든 Type를 넣어준다. - if (lJobType.size() > 0 && lJobType.indexOf("ALL") != -1) { - lJobType = new ArrayList(); - for (Matching matching : matchingSetup.getMatchingSetup()) { - if (matching.getActive()) { - lJobType.add(matching.getType()); - } else { - log.info("[" + sThreadName + "]JobType(" + matching.getType() + ") is Disabled"); - } - } - } - - - for (String sJobType : lJobType) { - log.info("[" + sThreadName + "]Current running job type: " + sJobType); - JobExecution jobExe = invokeJob("matchingInnerDelng", sJobType, params); - if (!jobExe.getStatus().equals(BatchStatus.COMPLETED)) { - throw new Exception("Job execution error : Batchstatus(" + jobExe.getStatus() + "), ExitStatus(" + jobExe.getExitStatus() + ")" ); - } - } - - long endTime = System.currentTimeMillis(); - log.info("[" + sThreadName + "]Job Type : " + lJobType.toString()); - log.info("[" + sThreadName + "]Job Ended: " + endTime); - log.info("[" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); - - //작업종료에 대한 로그 업데이트 - paramLog.put("exit_code", "0"); - paramLog.put("exit_message", ""); - matchingInnerDelingMapper.finishUserJob(paramLog); - - } - - - - - - @SuppressWarnings("rawtypes") + public void matchingJob(String jobGroupId, Map params) throws Exception { + + // Job Create Log + UUID uuid = UUID.randomUUID(); + HashMap mt = new HashMap(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); + + Map paramLog = new HashMap(); + paramLog.put("user_job_group", jobGroupId); + paramLog.put("user_job_id", sDate); + paramLog.put("user_job_name", "자동매칭(" + params.toString() + ")"); + matchingInnerDelingMapper.createUserJob(paramLog); + + String sThreadName = Thread.currentThread().getName(); + long startTime = System.currentTimeMillis(); + log.info("[" + sThreadName + "]Job Started : " + startTime); + log.debug("[" + sThreadName + "]params=" + params.toString()); + + StringBuffer sb = FileUtil.readFileToString("matchingSetup.json"); + MatchingSetup matchingSetup = (MatchingSetup) FileUtil.strToObj(sb.toString(), MatchingSetup.class); + + String sJobTypeList = params.get("jobType").toUpperCase(); + List lJobType = Arrays.asList(sJobTypeList != null ? sJobTypeList.split(",") : new String[0]); + + // 파라미터가 ALL일 경우 ALL 대신 등록된 모든 Type를 넣어준다. + if (lJobType.size() > 0 && lJobType.indexOf("ALL") != -1) { + lJobType = new ArrayList(); + for (Matching matching : matchingSetup.getMatchingSetup()) { + if (matching.getActive()) { + lJobType.add(matching.getType()); + } else { + log.info("[" + sThreadName + "]JobType(" + matching.getType() + ") is Disabled"); + } + } + } + + for (String sJobType : lJobType) { + log.info("[" + sThreadName + "]Current running job type: " + sJobType); + JobExecution jobExe = invokeJob("matchingInnerDelng", sJobType, params); + if (!jobExe.getStatus().equals(BatchStatus.COMPLETED)) { + throw new Exception("Job execution error : Batchstatus(" + jobExe.getStatus() + "), ExitStatus(" + jobExe.getExitStatus() + ")"); + } + } + + long endTime = System.currentTimeMillis(); + log.info("[" + sThreadName + "]Job Type : " + lJobType.toString()); + log.info("[" + sThreadName + "]Job Ended: " + endTime); + log.info("[" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); + + // 작업종료에 대한 로그 업데이트 + paramLog.put("exit_code", "0"); + paramLog.put("exit_message", ""); + matchingInnerDelingMapper.finishUserJob(paramLog); + + } + + @SuppressWarnings("rawtypes") @Async("extAsync") - public void extraJobSub(String jobGroupId, Map paramRec, int key) throws Exception { - - int mtchNumber = key; - //Job Create Log - UUID uuid = UUID.randomUUID(); - HashMap mt = new HashMap(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); - String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); - - Map paramLog = new HashMap(); - paramLog.put("user_job_group", jobGroupId); - paramLog.put("user_job_id", sDate); - paramLog.put("user_job_name", "Extra매칭(" + paramRec.toString() + ")"); - - matchingInnerDelingMapper.createUserJob(paramLog); - - String sThreadName = Thread.currentThread().getName(); - long startTime = System.currentTimeMillis(); - log.info("extra [" + sThreadName + " : "+sDate+"]Job Started : " + startTime + "]params=" + paramRec.toString()); - log.debug("extra [" + sThreadName + "]params=" + paramRec.toString()); - - MatchingExtraProcessorAuto matchingExtraProcessorAuto = new MatchingExtraProcessorAuto(matchingInnerDelingMapper); - - //2건씩 합산 매칭일 경우 최대 20000건 까지 - for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 1, 2, 0, i, mtchNumber); - } - for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 2, 1, i, 0, mtchNumber); - } - for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 2, 2, i, i, mtchNumber); - } - - //3건씩 매칭일 경우 최대 5000건 까지 - for (int i=0; i<2000;i=i+100) { - matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i, mtchNumber); - } - for (int i=0; i<2000;i=i+100) { - matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0, mtchNumber); - } - - long endTime = System.currentTimeMillis(); - log.info("extra [" + sThreadName + " : "+sDate+"]Job Ended: " + endTime); - log.info("extra [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); - - //작업종료에 대한 로그 업데이트 - paramLog.put("exit_code", "0"); - paramLog.put("exit_message", ""); - matchingInnerDelingMapper.finishUserJob(paramLog); - - } - - - @SuppressWarnings("rawtypes") + public void extraJobSub(String jobGroupId, Map paramRec, int key) throws Exception { + + int mtchNumber = key; + // Job Create Log + UUID uuid = UUID.randomUUID(); + HashMap mt = new HashMap(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); + + Map paramLog = new HashMap(); + paramLog.put("user_job_group", jobGroupId); + paramLog.put("user_job_id", sDate); + paramLog.put("user_job_name", "Extra매칭(" + paramRec.toString() + ")"); + + matchingInnerDelingMapper.createUserJob(paramLog); + + String sThreadName = Thread.currentThread().getName(); + long startTime = System.currentTimeMillis(); + log.info("extra [" + sThreadName + " : " + sDate + "]Job Started : " + startTime + "]params=" + paramRec.toString()); + log.debug("extra [" + sThreadName + "]params=" + paramRec.toString()); + + MatchingExtraProcessorAuto matchingExtraProcessorAuto = new MatchingExtraProcessorAuto(matchingInnerDelingMapper); + + // 2건씩 합산 매칭일 경우 최대 20000건 까지 + for (int i = 0; i < 20000; i = i + 1000) { + matchingExtraProcessorAuto.process(paramRec, 1, 2, 0, i, mtchNumber); + } + for (int i = 0; i < 20000; i = i + 1000) { + matchingExtraProcessorAuto.process(paramRec, 2, 1, i, 0, mtchNumber); + } + for (int i = 0; i < 20000; i = i + 1000) { + matchingExtraProcessorAuto.process(paramRec, 2, 2, i, i, mtchNumber); + } + + // 3건씩 매칭일 경우 최대 5000건 까지 + for (int i = 0; i < 2000; i = i + 100) { + matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i, mtchNumber); + } + for (int i = 0; i < 2000; i = i + 100) { + matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0, mtchNumber); + } + + long endTime = System.currentTimeMillis(); + log.info("extra [" + sThreadName + " : " + sDate + "]Job Ended: " + endTime); + log.info("extra [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); + + // 작업종료에 대한 로그 업데이트 + paramLog.put("exit_code", "0"); + paramLog.put("exit_message", ""); + matchingInnerDelingMapper.finishUserJob(paramLog); + + } + + @SuppressWarnings("rawtypes") @Async("extAsync") - public void extraJobSub2(String jobGroupId, Map paramRec) throws Exception { - - - List retData = matchingInnerDelingMapper.getCustomItemReadData(paramRec); - - int mtchNumber = 0; - paramRec.put("conds", "T"); - for(Map curMap : retData) { - paramRec.putAll(curMap); - //Job Create Log - UUID uuid = UUID.randomUUID(); - HashMap mt = new HashMap(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); - String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); - - Map paramLog = new HashMap(); - paramLog.put("user_job_group", jobGroupId); - paramLog.put("user_job_id", sDate); - paramLog.put("user_job_name", "Extra매칭(" + paramRec.toString() + ")"); - try { - matchingInnerDelingMapper.createUserJob(paramLog); - }catch(Exception e) { - log.info("createUserJob Exception : "+e.getMessage()); - } - String sThreadName = Thread.currentThread().getName(); - long startTime = System.currentTimeMillis(); - log.info("extra [" + sThreadName + " : "+sDate+"]Job Started : " + startTime + "]params=" + paramRec.toString()); - log.debug("extra [" + sThreadName + "]params=" + paramRec.toString()); - - MatchingExtraProcessorAuto matchingExtraProcessorAuto = new MatchingExtraProcessorAuto(matchingInnerDelingMapper); - - //2건씩 합산 매칭일 경우 최대 20000건 까지 - for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 1, 2, 0, i, mtchNumber); - } - for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 2, 1, i, 0, mtchNumber); - } - for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 2, 2, i, i, mtchNumber); - } - - //3건씩 매칭일 경우 최대 5000건 까지 - for (int i=0; i<2000;i=i+100) { - matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i, mtchNumber); - } - for (int i=0; i<2000;i=i+100) { - matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0, mtchNumber); - } - - long endTime = System.currentTimeMillis(); - log.info("extra [" + sThreadName + " : "+sDate+"]Job Ended: " + endTime); - log.info("extra [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); - - //작업종료에 대한 로그 업데이트 - paramLog.put("exit_code", "0"); - paramLog.put("exit_message", ""); - matchingInnerDelingMapper.finishUserJob(paramLog); - - } - - - paramRec.put("conds", "B"); - for(Map curMap : retData) { - paramRec.putAll(curMap); - - //Job Create Log - UUID uuid = UUID.randomUUID(); - HashMap mt = new HashMap(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); - String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); - - Map paramLog = new HashMap(); - paramLog.put("user_job_group", jobGroupId); - paramLog.put("user_job_id", sDate); - paramLog.put("user_job_name", "Extra매칭(" + paramRec.toString() + ")"); - try { - matchingInnerDelingMapper.createUserJob(paramLog); - }catch(Exception e) { - log.info("createUserJob Exception : "+e.getMessage()); - } - String sThreadName = Thread.currentThread().getName(); - long startTime = System.currentTimeMillis(); - log.info("extra [" + sThreadName + " : "+sDate+"]Job Started : " + startTime + "]params=" + paramRec.toString()); - log.debug("extra [" + sThreadName + "]params=" + paramRec.toString()); - - MatchingExtraProcessorAuto matchingExtraProcessorAuto = new MatchingExtraProcessorAuto(matchingInnerDelingMapper); - - //2건씩 합산 매칭일 경우 최대 20000건 까지 - for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 1, 2, 0, i, mtchNumber); - } - for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 2, 1, i, 0, mtchNumber); - } - for (int i=0; i<20000;i=i+1000) { - matchingExtraProcessorAuto.process(paramRec, 2, 2, i, i, mtchNumber); - } - - //3건씩 매칭일 경우 최대 5000건 까지 - for (int i=0; i<2000;i=i+100) { - matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i, mtchNumber); - } - for (int i=0; i<2000;i=i+100) { - matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0, mtchNumber); - } - - long endTime = System.currentTimeMillis(); - log.info("extra [" + sThreadName + " : "+sDate+"]Job Ended: " + endTime); - log.info("extra [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); - - //작업종료에 대한 로그 업데이트 - paramLog.put("exit_code", "0"); - paramLog.put("exit_message", ""); - matchingInnerDelingMapper.finishUserJob(paramLog); - - } - - } - - @SuppressWarnings("rawtypes") + public void extraJobSub2(String jobGroupId, Map paramRec) throws Exception { + + List retData = matchingInnerDelingMapper.getCustomItemReadData(paramRec); + + long mtchNumber = 10000; + paramRec.put("conds", "T"); + for (Map curMap : retData) { + paramRec.putAll(curMap); + // Job Create Log + UUID uuid = UUID.randomUUID(); + HashMap mt = new HashMap(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); + + Map paramLog = new HashMap(); + paramLog.put("user_job_group", jobGroupId); + paramLog.put("user_job_id", sDate); + paramLog.put("user_job_name", "Extra매칭(" + paramRec.toString() + ")"); + try { + matchingInnerDelingMapper.createUserJob(paramLog); + } catch (Exception e) { + log.info("createUserJob Exception : " + e.getMessage()); + } + String sThreadName = Thread.currentThread().getName(); + long startTime = System.currentTimeMillis(); + log.info("extra [" + sThreadName + " : " + sDate + "]Job Started : " + startTime + "]params=" + paramRec.toString()); + log.debug("extra [" + sThreadName + "]params=" + paramRec.toString()); + + MatchingExtraProcessorAuto matchingExtraProcessorAuto = new MatchingExtraProcessorAuto(matchingInnerDelingMapper); + + // 2건씩 합산 매칭일 경우 최대 20000건 까지 + for (int i = 0; i < 20000; i = i + 1000) { + mtchNumber = matchingExtraProcessorAuto.process(paramRec, 1, 2, 0, i, mtchNumber); + } + for (int i = 0; i < 20000; i = i + 1000) { + mtchNumber = matchingExtraProcessorAuto.process(paramRec, 2, 1, i, 0, mtchNumber); + } + for (int i = 0; i < 20000; i = i + 1000) { + mtchNumber = matchingExtraProcessorAuto.process(paramRec, 2, 2, i, i, mtchNumber); + } + + // 3건씩 매칭일 경우 최대 5000건 까지 + for (int i = 0; i < 2000; i = i + 100) { + mtchNumber = matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i, mtchNumber); + } + for (int i = 0; i < 2000; i = i + 100) { + mtchNumber = matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0, mtchNumber); + } + + long endTime = System.currentTimeMillis(); + log.info( + "extra [" + sThreadName + " : " + sDate + "]Job Ended: " + endTime + " mtchNumber = " + mtchNumber); + log.info("extra [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); + + // 작업종료에 대한 로그 업데이트 + paramLog.put("exit_code", "0"); + paramLog.put("exit_message", ""); + matchingInnerDelingMapper.finishUserJob(paramLog); + + } + + paramRec.put("conds", "B"); + for (Map curMap : retData) { + paramRec.putAll(curMap); + + // Job Create Log + UUID uuid = UUID.randomUUID(); + HashMap mt = new HashMap(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); + + Map paramLog = new HashMap(); + paramLog.put("user_job_group", jobGroupId); + paramLog.put("user_job_id", sDate); + paramLog.put("user_job_name", "Extra매칭(" + paramRec.toString() + ")"); + try { + matchingInnerDelingMapper.createUserJob(paramLog); + } catch (Exception e) { + log.info("createUserJob Exception : " + e.getMessage()); + } + String sThreadName = Thread.currentThread().getName(); + long startTime = System.currentTimeMillis(); + log.info("extra [" + sThreadName + " : " + sDate + "]Job Started : " + startTime + "]params=" + + paramRec.toString()); + log.debug("extra [" + sThreadName + "]params=" + paramRec.toString()); + + MatchingExtraProcessorAuto matchingExtraProcessorAuto = new MatchingExtraProcessorAuto( + matchingInnerDelingMapper); + + // 2건씩 합산 매칭일 경우 최대 20000건 까지 + for (int i = 0; i < 20000; i = i + 1000) { + mtchNumber = matchingExtraProcessorAuto.process(paramRec, 1, 2, 0, i, mtchNumber); + } + for (int i = 0; i < 20000; i = i + 1000) { + mtchNumber = matchingExtraProcessorAuto.process(paramRec, 2, 1, i, 0, mtchNumber); + } + for (int i = 0; i < 20000; i = i + 1000) { + mtchNumber = matchingExtraProcessorAuto.process(paramRec, 2, 2, i, i, mtchNumber); + } + + // 3건씩 매칭일 경우 최대 5000건 까지 + for (int i = 0; i < 2000; i = i + 100) { + mtchNumber = matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i, mtchNumber); + } + for (int i = 0; i < 2000; i = i + 100) { + mtchNumber = matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0, mtchNumber); + } + + long endTime = System.currentTimeMillis(); + log.info("extra [" + sThreadName + " : " + sDate + "]Job Ended: " + endTime + " mtchNumber = " + mtchNumber); + log.info("extra [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); + + // 작업종료에 대한 로그 업데이트 + paramLog.put("exit_code", "0"); + paramLog.put("exit_message", ""); + matchingInnerDelingMapper.finishUserJob(paramLog); + + } + + long endTime = System.currentTimeMillis(); + log.info("### End Extra Matching Job2 : " + endTime); + + } + + @SuppressWarnings("rawtypes") @Async("aiAsync") - public void aiJobSub(String jobGroupId, Map paramRec) throws Exception { - - - //Job Create Log - UUID uuid = UUID.randomUUID(); - HashMap mt = new HashMap(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); - String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); - - Map paramLog = new HashMap(); - paramLog.put("user_job_group", jobGroupId); - paramLog.put("user_job_id", sDate); - paramLog.put("user_job_name", "AI매칭(" + paramRec.toString() + ")"); - matchingInnerDelingMapper.createUserJob(paramLog); - - - long startTime = System.currentTimeMillis(); - log.info("ai Job Started : " + startTime); - log.debug("ai Job params=" + paramRec.toString()); - - String sSysSe = (String) paramRec.get("sys_se"); - String sAccnutYm = (String) paramRec.get("accnut_ym"); - String sCprCode = (String) paramRec.get("cpr_code"); - String sPartCpr = (String) paramRec.get("partn_cpr"); - String sDelngCrncy = (String) paramRec.get("delng_crncy"); - - String sThreadName = Thread.currentThread().getName(); - - log.debug("call python"); - new ProcessExecutor() - .command(sPythonPrg, sPythonAiTarget, sDate, sSysSe, sAccnutYm, sCprCode, sPartCpr, sDelngCrncy) - .redirectOutput(new LogOutputStream() { - @Override - protected void processLine(String line) { - log.info(line); - } - }) - .execute(); - - long endTime = System.currentTimeMillis(); - log.info("ai Job Ended: " + endTime); - log.info("ai Job Running Time : " + (endTime - startTime) + "ms"); - - + public void aiJobSub(String jobGroupId, Map paramRec) throws Exception { + + // Job Create Log + UUID uuid = UUID.randomUUID(); + HashMap mt = new HashMap(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); + + Map paramLog = new HashMap(); + paramLog.put("user_job_group", jobGroupId); + paramLog.put("user_job_id", sDate); + paramLog.put("user_job_name", "AI매칭(" + paramRec.toString() + ")"); + matchingInnerDelingMapper.createUserJob(paramLog); + + long startTime = System.currentTimeMillis(); + log.info("ai Job Started : " + startTime); + log.debug("ai Job params=" + paramRec.toString()); + + String sSysSe = (String) paramRec.get("sys_se"); + String sAccnutYm = (String) paramRec.get("accnut_ym"); + String sCprCode = (String) paramRec.get("cpr_code"); + String sPartCpr = (String) paramRec.get("partn_cpr"); + String sDelngCrncy = (String) paramRec.get("delng_crncy"); + + String sThreadName = Thread.currentThread().getName(); + + log.debug("call python"); + new ProcessExecutor() + .command(sPythonPrg, sPythonAiTarget, sDate, sSysSe, sAccnutYm, sCprCode, sPartCpr, sDelngCrncy) + .redirectOutput(new LogOutputStream() { + @Override + protected void processLine(String line) { + log.info(line); + } + }).execute(); + + long endTime = System.currentTimeMillis(); + log.info("ai Job Ended: " + endTime); + log.info("ai Job Running Time : " + (endTime - startTime) + "ms"); + // //작업종료에 대한 로그 업데이트 // paramLog.put("exit_code", "0"); // paramLog.put("exit_message", ""); // matchingInnerDelingMapper.finishUserJob(paramLog); - - } - - - public JobExecution invokeJob(String jobName, String jobType, Map params) throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException { - - UUID uuid = UUID.randomUUID(); - HashMap mt = new HashMap(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); - final String date = dateFormat.format(new Date()) + ":" + uuid.toString(); - JobParameters jobParameters = new JobParametersBuilder() - .addString("syncDate", date) - .addString("jobType", jobType) - .addString("sysSe", params.get("sysSe")) - .addString("accnutYm", params.get("accnutYm")) - .addString("searchCond", params.get("searchCond")) - .toJobParameters(); - - var jobToStart = context.getBean(jobName, Job.class); - JobExecution jobExe = jobLauncher.run(jobToStart, jobParameters); - - return jobExe; - } - - - - @SuppressWarnings("rawtypes") + + } + + public JobExecution invokeJob(String jobName, String jobType, Map params) + throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, + JobParametersInvalidException, JobRestartException { + + UUID uuid = UUID.randomUUID(); + HashMap mt = new HashMap(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + final String date = dateFormat.format(new Date()) + ":" + uuid.toString(); + JobParameters jobParameters = new JobParametersBuilder().addString("syncDate", date) + .addString("jobType", jobType).addString("sysSe", params.get("sysSe")) + .addString("accnutYm", params.get("accnutYm")).addString("searchCond", params.get("searchCond")) + .toJobParameters(); + + var jobToStart = context.getBean(jobName, Job.class); + JobExecution jobExe = jobLauncher.run(jobToStart, jobParameters); + + return jobExe; + } + + @SuppressWarnings("rawtypes") @Async("commAsync") - public void createData(String jobGroupId, Map params) throws Exception { - - //Job Create Log - UUID uuid = UUID.randomUUID(); - HashMap mt = new HashMap(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); - String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); - - Map paramLog = new HashMap(); - paramLog.put("user_job_group", jobGroupId); - paramLog.put("user_job_id", sDate); - paramLog.put("user_job_name", "작업데이타생성(" + params.toString() + ")"); - matchingInnerDelingMapper.createUserJob(paramLog); - - - long startTime = System.currentTimeMillis(); - log.info("Create Data Started : " + startTime); - log.debug("params=" + params.toString()); - - //기존데이타 삭제 + public void createData(String jobGroupId, Map params) throws Exception { + + // Job Create Log + UUID uuid = UUID.randomUUID(); + HashMap mt = new HashMap(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); + + Map paramLog = new HashMap(); + paramLog.put("user_job_group", jobGroupId); + paramLog.put("user_job_id", sDate); + paramLog.put("user_job_name", "작업데이타생성(" + params.toString() + ")"); + matchingInnerDelingMapper.createUserJob(paramLog); + + long startTime = System.currentTimeMillis(); + log.info("Create Data Started : " + startTime); + log.debug("params=" + params.toString()); + + // 기존데이타 삭제 int iDeleted = matchingInnerDelingMapper.deleteOriginalData(params); - log.debug("Deleted OrgData : " + iDeleted + "건"); - - //신규데이타 생성 - //매칭키에 대한 정보 (sql로 조인하여 조회하기에는 너무 느리고 데이타 중복도 발생함) - List lMatchingInfo = oracleMapper.getMatchingInfo(params); - Map mMatchingInfo = new HashMap(); - for (Map curMap : lMatchingInfo) { - String sKey = String.valueOf(curMap.get("SEQ")); - mMatchingInfo.put(sKey, curMap); - } - - List lOrgData = oracleMapper.getOriginalData(params); - int iInserted = 0; - int limit = 1000; //1000건씩 batch - List lInserted = new ArrayList(); - for (Map curRec : lOrgData) { - String sKey = String.valueOf(curRec.get("SEQ")); - Map curMatchingInfo = mMatchingInfo.get(sKey); - if (curMatchingInfo != null) { - curRec.put("MATCHING_CAUSE", curMatchingInfo.get("MATCHING_CAUSE")); - curRec.put("MATCH_KEY", curMatchingInfo.get("MATCH_KEY")); - } - lInserted.add(curRec); - if (lInserted.size() == limit) { - matchingInnerDelingMapper.insertOriginalData(Map.of("itemList", lInserted)); - iInserted = iInserted + lInserted.size(); - lInserted.clear(); - } - } - if (lInserted.size() > 0) { - matchingInnerDelingMapper.insertOriginalData(Map.of("itemList", lInserted)); - iInserted = iInserted + lInserted.size(); - } - log.info("Inserted OrgData : " + iInserted + "건"); - - iDeleted = matchingInnerDelingMapper.deleteData(params); - log.debug("Deleted Work Data : " + iDeleted + "건"); - iInserted = matchingInnerDelingMapper.insertDataFromOriginal(params); - log.info("Inserted Work Data : " + iInserted + "건"); - - iDeleted = matchingInnerDelingMapper.deleteDataAi(params); - log.debug("Deleted Work AI Data : " + iDeleted + "건"); - iInserted = matchingInnerDelingMapper.insertDataAiFromOriginal(params); - log.info("Inserted Work AI Data : " + iInserted + "건"); - - long endTime = System.currentTimeMillis(); - log.info("Create Data Ended : " + endTime); - log.info("Running Time : " + (endTime - startTime) + "ms"); - - //작업종료에 대한 로그 업데이트 - paramLog.put("exit_code", "0"); - paramLog.put("exit_message", ""); - matchingInnerDelingMapper.finishUserJob(paramLog); - } - - - - @SuppressWarnings("rawtypes") + log.debug("Deleted OrgData : " + iDeleted + "건"); + + // 신규데이타 생성 + // 매칭키에 대한 정보 (sql로 조인하여 조회하기에는 너무 느리고 데이타 중복도 발생함) + List lMatchingInfo = oracleMapper.getMatchingInfo(params); + Map mMatchingInfo = new HashMap(); + for (Map curMap : lMatchingInfo) { + String sKey = String.valueOf(curMap.get("SEQ")); + mMatchingInfo.put(sKey, curMap); + } + + List lOrgData = oracleMapper.getOriginalData(params); + int iInserted = 0; + int iUpdated = 0; + int limit = 1000; // 1000건씩 batch + List lInserted = new ArrayList(); + for (Map curRec : lOrgData) { + String sKey = String.valueOf(curRec.get("SEQ")); + Map curMatchingInfo = mMatchingInfo.get(sKey); + if (curMatchingInfo != null) { + curRec.put("MATCHING_CAUSE", curMatchingInfo.get("MATCHING_CAUSE")); + curRec.put("MATCH_KEY", curMatchingInfo.get("MATCH_KEY")); + } + lInserted.add(curRec); + if (lInserted.size() == limit) { + matchingInnerDelingMapper.insertOriginalData(Map.of("itemList", lInserted)); + iInserted = iInserted + lInserted.size(); + lInserted.clear(); + } + } + if (lInserted.size() > 0) { + matchingInnerDelingMapper.insertOriginalData(Map.of("itemList", lInserted)); + iInserted = iInserted + lInserted.size(); + } + log.info("Inserted OrgData : " + iInserted + "건"); + + iDeleted = matchingInnerDelingMapper.deleteData(params); + log.debug("Deleted Work Data : " + iDeleted + "건"); + iInserted = matchingInnerDelingMapper.insertDataFromOriginal(params); + log.info("Inserted Work Data : " + iInserted + "건"); + + + /**** 매칭제외 처리 start **************************************************************************************************/ + /** 1. 거래금액 = 0 */ + iUpdated = matchingInnerDelingMapper.updateInitExclusion1(params); + + + /** 2. 거래유형, 자기/상대 법인, 거래일자, 계정 이 같은 1:1 내역 금액이 +, - 로 합이 0 인 경우 */ + iUpdated += matchingInnerDelingMapper.updateInitExclusion2(params); + + + + + + /**** 매칭제외 처리 end **************************************************************************************************/ + + + + + iDeleted = matchingInnerDelingMapper.deleteDataAi(params); + log.debug("Deleted Work AI Data : " + iDeleted + "건"); + iInserted = matchingInnerDelingMapper.insertDataAiFromOriginal(params); + log.info("Inserted Work AI Data : " + iInserted + "건"); + + long endTime = System.currentTimeMillis(); + log.info("Create Data Ended : " + endTime); + log.info("Running Time : " + (endTime - startTime) + "ms"); + + // 작업종료에 대한 로그 업데이트 + paramLog.put("exit_code", "0"); + paramLog.put("exit_message", ""); + matchingInnerDelingMapper.finishUserJob(paramLog); + } + + @SuppressWarnings("rawtypes") @Async("commAsync") - public void returnRwsultData(String jobGroupId, Map params) throws Exception { - - //Job Create Log - UUID uuid = UUID.randomUUID(); - HashMap mt = new HashMap(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); - String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); - - Map paramLog = new HashMap(); - paramLog.put("user_job_group", jobGroupId); - paramLog.put("user_job_id", sDate); - paramLog.put("user_job_name", "결과데이타리턴(" + params.toString() + ")"); - matchingInnerDelingMapper.createUserJob(paramLog); - - long startTime = System.currentTimeMillis(); - log.info("Update Data Started : " + startTime); - log.debug("params=" + params.toString()); - - //기존데이타 초기화 + public void returnRwsultData(String jobGroupId, Map params) throws Exception { + + // Job Create Log + UUID uuid = UUID.randomUUID(); + HashMap mt = new HashMap(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString(); + + Map paramLog = new HashMap(); + paramLog.put("user_job_group", jobGroupId); + paramLog.put("user_job_id", sDate); + paramLog.put("user_job_name", "결과데이타리턴(" + params.toString() + ")"); + matchingInnerDelingMapper.createUserJob(paramLog); + + long startTime = System.currentTimeMillis(); + log.info("Update Data Started : " + startTime); + log.debug("params=" + params.toString()); + + // 기존데이타 초기화 int iUpdated = matchingInnerDelingMapper.updateClearNewMatchKey(params); - //새로운 매칭키 생성 + // 새로운 매칭키 생성 iUpdated = matchingInnerDelingMapper.updateNewMatchKey(params); - log.debug("Updated OrgData : " + iUpdated + "건"); - - long endTime = System.currentTimeMillis(); - log.info("Update Data Ended : " + endTime); - log.info("Running Time : " + (endTime - startTime) + "ms"); - - - //작업종료에 대한 로그 업데이트 - paramLog.put("exit_code", "0"); - paramLog.put("exit_message", ""); - matchingInnerDelingMapper.finishUserJob(paramLog); - - } + log.debug("Updated OrgData : " + iUpdated + "건"); + + long endTime = System.currentTimeMillis(); + log.info("Update Data Ended : " + endTime); + log.info("Running Time : " + (endTime - startTime) + "ms"); + + // 작업종료에 대한 로그 업데이트 + paramLog.put("exit_code", "0"); + paramLog.put("exit_message", ""); + matchingInnerDelingMapper.finishUserJob(paramLog); + } } diff --git a/src/main/java/com/batch/util/FileUtil.java b/src/main/java/com/batch/util/FileUtil.java index e839447..58025d1 100644 --- a/src/main/java/com/batch/util/FileUtil.java +++ b/src/main/java/com/batch/util/FileUtil.java @@ -1,7 +1,9 @@ package com.batch.util; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; +import java.io.RandomAccessFile; import org.springframework.core.io.ClassPathResource; @@ -12,27 +14,80 @@ import com.google.gson.JsonParser; public class FileUtil { public static StringBuffer readFileToString(String resourceName) { - StringBuffer sb = new StringBuffer(); - try { + StringBuffer sb = new StringBuffer(); + try { ClassPathResource resource = new ClassPathResource(resourceName); - BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream())); - - // br.readLine() 이 null 인지 검사할 때 한번 사용되므로 String 에 먼저 저장해둬야한다. - String s = ""; - while((s = br.readLine()) != null){ - sb.append(s); - } - } catch (Exception e) { - sb.append(e.getStackTrace()); - } - return sb; + BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream())); + + // br.readLine() 이 null 인지 검사할 때 한번 사용되므로 String 에 먼저 저장해둬야한다. + String s = ""; + while ((s = br.readLine()) != null) { + sb.append(s); + } + } catch (Exception e) { + sb.append(e.getStackTrace()); + } + return sb; + } + + /** + * 파일 마지막 부터 lineCnt행 읽기 + * @param resourceName + * @param lineCnt + * @return + */ + public static StringBuffer readFileLastLines(String resourceName, int lineCnt) { + StringBuffer sb = new StringBuffer(); + +// lineCnt = 50; // test case +// resourceName = "D://logs/localhost_access_log.2019-03-26.txt"; // test case + + if(resourceName == null || resourceName.isEmpty()) { + sb.append("파일 경로가 입력되지 않았습니다."); + }else if(lineCnt < 1) { + sb.append("라인갯수가 입력되지 않았습니다."); + }else { + RandomAccessFile rf = null; + + try { + + rf = new RandomAccessFile(resourceName, "r"); + long len = rf.length(); + for (long i = len - 1; i >= 0; i--) { + rf.seek(i); + char c = (char) rf.read(); + if (c == '\n') { + lineCnt--; + if(lineCnt < 0) { + break; + } + } + + sb.insert(0, c); + } + + } catch (Exception e) { +// e.printStackTrace(); + sb = new StringBuffer("유효한 파일경로가 아닙니다.("+resourceName+")"); + } finally { + if (rf != null) { + try { + rf.close(); + } catch (IOException e) { +// e.printStackTrace(); + sb = new StringBuffer("유효한 파일경로가 아닙니다.("+resourceName+")"); + } + } + } + } + return sb; } public static JsonObject strToJsonObj(String jsonString) { JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject(); return jsonObject; } - + public static Object strToObj(String jsonString, Class anyClass) { Gson gson = new Gson(); Object convertedObject = gson.fromJson(jsonString, anyClass); @@ -44,5 +99,5 @@ public class FileUtil { String stringObject = gson.toJson(obj); return stringObject; } - + } diff --git a/src/main/resources/matchingSetup.json b/src/main/resources/matchingSetup.json index 09db2a5..9e1d56a 100644 --- a/src/main/resources/matchingSetup.json +++ b/src/main/resources/matchingSetup.json @@ -1293,7 +1293,7 @@ { "active": true, "type": "I-AA", - "typeName": "자기수익(전체),상대비용(겨래월),비교(년월,거래금액)", + "typeName": "자기수익(전체),상대비용(거래월),비교(년월,거래금액)", "condOne": { "cond": [ @@ -1334,7 +1334,7 @@ { "active": true, "type": "I-AB", - "typeName": "자기수익(전체),상대비용(겨래일자),비교(년월,거래금액)", + "typeName": "자기수익(전체),상대비용(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ @@ -1375,7 +1375,7 @@ { "active": true, "type": "I-AC", - "typeName": "자기비용(전체),상대수익(겨래월),비교(년월,거래금액)", + "typeName": "자기비용(전체),상대수익(거래월),비교(년월,거래금액)", "condOne": { "cond": [ @@ -1416,7 +1416,7 @@ { "active": true, "type": "I-AD", - "typeName": "자기비용(전체),상대수익(겨래일자),비교(년월,거래금액)", + "typeName": "자기비용(전체),상대수익(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ @@ -1542,7 +1542,7 @@ { "active": true, "type": "I-BA", - "typeName": "자기채권(전체),상대채무(겨래월),비교(년월,거래금액)", + "typeName": "자기채권(전체),상대채무(거래월),비교(년월,거래금액)", "condOne": { "cond": [ @@ -1583,7 +1583,7 @@ { "active": true, "type": "I-BB", - "typeName": "자기채권(전체),상대채무(겨래일자),비교(년월,거래금액)", + "typeName": "자기채권(전체),상대채무(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ @@ -1624,7 +1624,7 @@ { "active": true, "type": "I-BC", - "typeName": "자기채무(전체),상대채권(겨래월),비교(년월,거래금액)", + "typeName": "자기채무(전체),상대채권(거래월),비교(년월,거래금액)", "condOne": { "cond": [ @@ -1665,7 +1665,7 @@ { "active": true, "type": "I-BD", - "typeName": "자기채무(전체),상대채권(겨래일자),비교(년월,거래금액)", + "typeName": "자기채무(전체),상대채권(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ @@ -1792,7 +1792,7 @@ { "active": true, "type": "J-AA", - "typeName": "자기수익(거래월),상대비용(겨래일자),비교(년월,거래금액)", + "typeName": "자기수익(거래월),상대비용(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ @@ -1834,7 +1834,7 @@ { "active": true, "type": "J-AB", - "typeName": "자기비용(거래월),상대수익(겨래일자),비교(년월,거래금액)", + "typeName": "자기비용(거래월),상대수익(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ @@ -1961,7 +1961,7 @@ { "active": true, "type": "J-BA", - "typeName": "자기채권(거래월),상대채무(겨래일자),비교(년월,거래금액)", + "typeName": "자기채권(거래월),상대채무(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ @@ -2003,7 +2003,7 @@ { "active": true, "type": "J-BB", - "typeName": "자기채무(거래월),상대채권(겨래일자),비교(년월,거래금액)", + "typeName": "자기채무(거래월),상대채권(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ @@ -2184,7 +2184,7 @@ { "active": true, "type": "K-AB", - "typeName": "자기비용(적요),상대수익(겨래일자),비교(년월,거래금액)", + "typeName": "자기비용(적요),상대수익(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ @@ -2310,7 +2310,7 @@ { "active": true, "type": "K-BA", - "typeName": "자기채권(적요),상대채무(겨래일자),비교(년월,거래금액)", + "typeName": "자기채권(적요),상대채무(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ @@ -2352,7 +2352,7 @@ { "active": true, "type": "K-BB", - "typeName": "자기채무(적요),상대채권(겨래일자),비교(년월,거래금액)", + "typeName": "자기채무(적요),상대채권(거래일자),비교(년월,거래금액)", "condOne": { "cond": [ diff --git a/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml b/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml index 16739be..04192fa 100644 --- a/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml +++ b/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml @@ -660,4 +660,50 @@ and accnut_ym = #{accnutYm} + + + + + update batch_tbcr_inner_delng + set + MTCH_SYS = 'EXCLUSION' + , MTCH_TY = 'EXCLUSION' + , MTCH_TY_NM = 'EXCLUSION' + where sys_se = #{sysSe} + and accnut_ym = #{accnutYm} + and mtch_ty is null + and delng_amt = 0 + + + + + merge into batch_tbcr_inner_delng a + using ( + with ht_data as ( + select count(*) over(partition by sys_se, accnut_ym, dta_ty, cpr_code, partn_cpr, cnnc_acnt_code, delng_de, delng_crncy) as cnt + , sum(delng_amt) over(partition by sys_se, accnut_ym, dta_ty, cpr_code, partn_cpr, cnnc_acnt_code, delng_de, delng_crncy) as sum_amt + , a.* + from batch_tbcr_inner_delng a + where sys_se = #{sysSe} + and accnut_ym = #{accnutYm} + and mtch_ty is null + and delng_amt != 0 + ) + select sys_se, accnut_ym, sn + from ht_data + where cnt = 2 + and sum_amt = 0 + ) b + on ( + b.sys_se = a.sys_se + and b.accnut_ym = a.accnut_ym + and b.sn = a.sn + ) + when matched then + update + set MTCH_SYS = 'EXCLUSION' + , MTCH_TY = 'EXCLUSION' + , MTCH_TY_NM = 'EXCLUSION' + + \ No newline at end of file -- libgit2 0.21.4