diff --git a/src/main/java/com/batch/config/MatchingAiSubProcessorAuto.java b/src/main/java/com/batch/config/MatchingAiSubProcessorAuto.java new file mode 100644 index 0000000..44c92d7 --- /dev/null +++ b/src/main/java/com/batch/config/MatchingAiSubProcessorAuto.java @@ -0,0 +1,263 @@ +package com.batch.config; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import com.batch.mapper.primary.MatchingInnerDelingMapper; +import com.batch.util.StatisticsUtil; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +public class MatchingAiSubProcessorAuto { + + private final MatchingInnerDelingMapper matchingInnerDelingMapper; + + @SuppressWarnings("unchecked") + public void process(Map paramRec, int iCmbnOwnCnt, int iCmbnTranCnt, int iStartOwn, int iStartTran) 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", "AI Sub 조합매칭(" + 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 sMtchTy = (String) paramRec.get("mtch_ty"); + Long lngMtchKy = (Long) paramRec.get("mtch_ky"); + String sCprCode = (String) paramRec.get("cpr_code"); + String sPartCpr = (String) paramRec.get("partn_cpr"); + String sConds = (String) paramRec.get("conds"); + + Integer iErrorRange = 0; + if (paramRec.get("error_range") != null) iErrorRange = Integer.parseInt((String) paramRec.get("error_range")); + + //작업시작 + Map mParam = new HashMap(); + mParam.put("sysSe", sSysSe); + mParam.put("accnutYm", sAccnutYm); + mParam.put("mtchTy", sMtchTy); + mParam.put("mtchKy", lngMtchKy); + mParam.put("conds", sConds); + + //---------------------------------------------------------------------------- + //자기법인 데이타 가져오기 + mParam.put("cprCode", sCprCode); + mParam.put("partnCpr", sPartCpr); + List lMatchingDataOne = matchingInnerDelingMapper.getAiSubDataOne(mParam); + + //상대법인 데이타 가져오기 + mParam.put("cprCode", sPartCpr); + mParam.put("partnCpr", sCprCode); + List lMatchingDataTwo = matchingInnerDelingMapper.getAiSubDataTwo(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 (iCmbnOwnCnt == 3) { + iEndOwn = iStartOwn + 50; + if (iEndOwn > lMatchingDataOne.size()) iEndOwn = lMatchingDataOne.size(); + } + if (iCmbnOwnCnt > 3) { + iEndOwn = iStartOwn + 25; + 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 (iCmbnTranCnt == 3) { + iEndTran = iStartTran + 50; + if (iEndTran > lMatchingDataTwo.size()) iEndTran = lMatchingDataTwo.size(); + } + if (iCmbnTranCnt > 3) { + iEndTran = iStartTran + 25; + 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); + } + + //키를 Ceiling 처리하여 다시 작성 + Map>> mMatchingDataOneNew = new HashMap>>(); + for (BigDecimal bdKey : mMatchingDataOne.keySet()) { + BigDecimal bdKeyNew = bdKey.setScale(iErrorRange, RoundingMode.HALF_UP); + mMatchingDataOneNew.put(bdKeyNew, mMatchingDataOne.get(bdKey)); + } + mMatchingDataOne = mMatchingDataOneNew; + + //상대법인 데이타를 맵으로 처리한다. + 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); + } + + //키를 Ceiling 처리하여 다시 작성 + Map>> mMatchingDataTwoNew = new HashMap>>(); + for (BigDecimal bdKey : mMatchingDataTwo.keySet()) { + BigDecimal bdKeyNew = bdKey.setScale(iErrorRange, RoundingMode.HALF_UP); + mMatchingDataTwoNew.put(bdKeyNew, mMatchingDataTwo.get(bdKey)); + } + mMatchingDataTwo = mMatchingDataTwoNew; + + //여기서 매칭 비교 + //비교 lMatchingDataOne vs mMatchingDataTwo + List lMatchingResultUpdate = new ArrayList(); //업데이트할 대상 + + int mtchNumber = 0; + String mtchSys = "AUTO"; + String mtchType = "AI_" + iCmbnOwnCnt + "_" + iCmbnTranCnt; + String mtchTypeName = "자기(" + iCmbnOwnCnt + "건Sum), 상대(" + iCmbnTranCnt + "건Sum), 비교(금액)"; + 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 (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); + } + 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); + } + 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); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/batch/config/MatchingItemProcessorAuto.java b/src/main/java/com/batch/config/MatchingItemProcessorAuto.java index 8c0547a..65a0ce1 100644 --- a/src/main/java/com/batch/config/MatchingItemProcessorAuto.java +++ b/src/main/java/com/batch/config/MatchingItemProcessorAuto.java @@ -71,12 +71,14 @@ public class MatchingItemProcessorAuto implements ItemProcessor { params.put("cprCode", item.get("cpr_code")); params.put("partnCpr", item.get("partn_cpr")); params.put("amtField", matching.getAmtField()); + params.put("currencyField", matching.getCurrencyField()); params.put("cond", condOne.getCond() ); //조건리스트 List lMatchingDataOne = matchingInnerDelingMapper.getMatchingData(params); //상대법인 데이타 가져오기 params.put("cprCode", item.get("partn_cpr")); params.put("partnCpr", item.get("cpr_code")); + params.put("currencyField", matching.getCurrencyField()); params.put("amtField", matching.getAmtField()); params.put("cond", condTwo.getCond() ); //조건리스트 List lMatchingDataTwo = matchingInnerDelingMapper.getMatchingData(params); diff --git a/src/main/java/com/batch/config/MatchingItemReader.java b/src/main/java/com/batch/config/MatchingItemReader.java index d182891..49106f5 100644 --- a/src/main/java/com/batch/config/MatchingItemReader.java +++ b/src/main/java/com/batch/config/MatchingItemReader.java @@ -32,7 +32,7 @@ public class MatchingItemReader { */ public List customRead(){ log.debug("customRead.params : " + this.params.toString()); - // customRead.params : {sysSe=KUMKANG, searchCond=mtch_ky is null, run.id=1, syncDate=2024-02-02-03-52-27:50deede8-ce3d-4841-ba65-f733bdd38533, jobType=F, accnutYm=202112} + // customRead.params : {sysSe=KUMKANG, run.id=1, syncDate=2024-02-02-03-52-27:50deede8-ce3d-4841-ba65-f733bdd38533, jobType=F, accnutYm=202112} String sMatchType = this.params.get("jobType"); StringBuffer sb = FileUtil.readFileToString("matchingSetup.json"); MatchingSetup matchingSetup = (MatchingSetup) FileUtil.strToObj(sb.toString(), MatchingSetup.class); diff --git a/src/main/java/com/batch/config/MatchingSetup.java b/src/main/java/com/batch/config/MatchingSetup.java index df65ddc..13ab7a3 100644 --- a/src/main/java/com/batch/config/MatchingSetup.java +++ b/src/main/java/com/batch/config/MatchingSetup.java @@ -20,6 +20,7 @@ public class MatchingSetup { List uniqueKey; String compareKey; List compareField; + String currencyField; String amtField; String matchingType; String matchingTypeName; diff --git a/src/main/java/com/batch/controller/JobController.java b/src/main/java/com/batch/controller/JobController.java index 22ab0a6..4932fcf 100644 --- a/src/main/java/com/batch/controller/JobController.java +++ b/src/main/java/com/batch/controller/JobController.java @@ -1,5 +1,6 @@ package com.batch.controller; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -85,6 +86,8 @@ public class JobController { * { * "sysSe": "LS_ALL", * "accnutYm": "202306", + * "cpr_code": "xxxxx", + * "partn_cpr": "xxxxx", * } */ //Job Create Log @@ -109,6 +112,8 @@ public class JobController { * { * "sysSe": "LS_ALL", * "accnutYm": "202306", + * "cpr_code": "xxxxx", + * "partn_cpr": "xxxxx", * "searchOne": "dta_ty in ('11','21','31','33','35','37','41')", * "searchTwo": "dta_ty in ('11','21','31','33','35','37','41')" * } @@ -145,6 +150,44 @@ public class JobController { } + @PostMapping("/aisubmatching") + public Map aiSubMatchingJob( @RequestBody Map params) throws Exception { + + /* + * { + * "sysSe": "LS_ALL", + * "accnutYm": "202306", + * "mtch_ty": "AI_SLT" + * "cpr_code": "xxxxx", + * "partn_cpr": "xxxxx" + * } + */ + //Job Create Log + UUID uuid = UUID.randomUUID(); + String sJobGroup = uuid.toString(); + + log.debug("Start AI Sub Matching Job"); + List retData = matchingInnerDelingMapper.getAiSubReadData(params); + + //AI의 경우 수익비용만 매칭하고 있음 + for(Map curMap : retData) { + Map cParams = new HashMap(); + cParams.putAll(params); + cParams.putAll(curMap); + cParams.put("conds", "T"); + jobService.aiSubJobSub(sJobGroup, cParams); + } + + log.debug("End Extra Matching Job"); + + Map rtnMap = new HashMap(); + rtnMap.put("jobGroupId", sJobGroup); + rtnMap.put("jobMessage", "Extra 매칭작업을 시작합니다. 작업이 끝난후 작업결과는 별도로 확인 바랍니다."); + + return rtnMap; + } + + @PostMapping("/aimatching") public Map aiMatchingJob( @RequestBody Map params) throws Exception { @@ -152,6 +195,9 @@ public class JobController { * { * "sysSe": "LS_ALL", * "accnutYm": "202306", + * "cpr_code": "xxxxx", + * "partn_cpr": "xxxxx", + * "error_range": "0" * } */ //Job Create Log @@ -161,7 +207,10 @@ public class JobController { log.debug("Start AI Matching Job"); List retData = matchingInnerDelingMapper.getAiReadData(params); for(Map curMap : retData) { - jobService.aiJobSub(sJobGroup, curMap); + Map curMParams = new HashMap(); + curMParams.putAll(curMap); + curMParams.put("error_range", params.get("error_range")); + jobService.aiJobSub(sJobGroup, curMParams); } log.debug("End AI Matching Job"); diff --git a/src/main/java/com/batch/mapper/primary/MatchingInnerDelingMapper.java b/src/main/java/com/batch/mapper/primary/MatchingInnerDelingMapper.java index d6034aa..d93c541 100644 --- a/src/main/java/com/batch/mapper/primary/MatchingInnerDelingMapper.java +++ b/src/main/java/com/batch/mapper/primary/MatchingInnerDelingMapper.java @@ -13,7 +13,6 @@ public interface MatchingInnerDelingMapper { */ @SuppressWarnings("rawtypes") List getCustomItemReadData(Map param); - /** * 작업키 업데이트 (파라미터 : 자기데이타/상대데이타) @@ -168,5 +167,27 @@ public interface MatchingInnerDelingMapper { */ @SuppressWarnings("rawtypes") List getUserJobStatus(Map param); + + /* + * AI Sub 작업리스트 + */ + @SuppressWarnings("rawtypes") + List getAiSubReadData(Map param); + + /** + * AI Sub matching을 위한 자료 조회 + * @param param + * @return + */ + @SuppressWarnings("rawtypes") + List getAiSubDataOne(Map param); + + /** + * AI Sub matching을 위한 자료 조회 + * @param param + * @return + */ + @SuppressWarnings("rawtypes") + List getAiSubDataTwo(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 a14f6aa..a57425e 100644 --- a/src/main/java/com/batch/service/JobService.java +++ b/src/main/java/com/batch/service/JobService.java @@ -1,5 +1,6 @@ package com.batch.service; +import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -12,6 +13,7 @@ import java.util.UUID; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobParameter; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.JobParametersInvalidException; @@ -27,6 +29,7 @@ import org.springframework.stereotype.Service; import org.zeroturnaround.exec.ProcessExecutor; import org.zeroturnaround.exec.stream.LogOutputStream; +import com.batch.config.MatchingAiSubProcessorAuto; import com.batch.config.MatchingExtraProcessorAuto; import com.batch.config.MatchingSetup; import com.batch.config.MatchingSetup.Matching; @@ -160,8 +163,20 @@ public class JobService { matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i); } for (int i=0; i<2000;i=i+50) { + matchingExtraProcessorAuto.process(paramRec, 2, 3, 0, i); + } + for (int i=0; i<2000;i=i+50) { + matchingExtraProcessorAuto.process(paramRec, 3, 3, 0, i); + } + for (int i=0; i<2000;i=i+50) { matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0); } + for (int i=0; i<2000;i=i+50) { + matchingExtraProcessorAuto.process(paramRec, 3, 2, i, 0); + } + for (int i=0; i<2000;i=i+50) { + matchingExtraProcessorAuto.process(paramRec, 3, 3, i, 0); + } //4건씩 매칭일 경우 최대 2000건 까지 for (int i=0; i<2000;i=i+25) { @@ -183,6 +198,79 @@ public class JobService { } @SuppressWarnings("rawtypes") + @Async("extAsync") + public void aiSubJobSub(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 Sub 매칭(" + paramRec.toString() + ")"); + matchingInnerDelingMapper.createUserJob(paramLog); + + String sThreadName = Thread.currentThread().getName(); + long startTime = System.currentTimeMillis(); + log.info("AI Sub [" + sThreadName + "]Job Started : " + startTime); + log.debug("AI Sub [" + sThreadName + "]params=" + paramRec.toString()); + + MatchingAiSubProcessorAuto matchingAiSubProcessorAuto = new MatchingAiSubProcessorAuto(matchingInnerDelingMapper); + + //2건씩 합산 매칭일 경우 최대 20000건 까지 + for (int i=0; i<20000;i=i+1000) { + matchingAiSubProcessorAuto.process(paramRec, 1, 2, 0, i); + } + for (int i=0; i<20000;i=i+1000) { + matchingAiSubProcessorAuto.process(paramRec, 2, 1, i, 0); + } + for (int i=0; i<20000;i=i+1000) { + matchingAiSubProcessorAuto.process(paramRec, 2, 2, i, i); + } + + //3건씩 매칭일 경우 최대 2000건 까지 + for (int i=0; i<2000;i=i+50) { + matchingAiSubProcessorAuto.process(paramRec, 1, 3, 0, i); + } + for (int i=0; i<2000;i=i+50) { + matchingAiSubProcessorAuto.process(paramRec, 2, 3, 0, i); + } + for (int i=0; i<2000;i=i+50) { + matchingAiSubProcessorAuto.process(paramRec, 3, 3, 0, i); + } + for (int i=0; i<2000;i=i+50) { + matchingAiSubProcessorAuto.process(paramRec, 3, 1, i, 0); + } + for (int i=0; i<2000;i=i+50) { + matchingAiSubProcessorAuto.process(paramRec, 3, 2, i, 0); + } + for (int i=0; i<2000;i=i+50) { + matchingAiSubProcessorAuto.process(paramRec, 3, 3, i, 0); + } + + //4건씩 매칭일 경우 최대 2000건 까지 + for (int i=0; i<2000;i=i+25) { + matchingAiSubProcessorAuto.process(paramRec, 1, 4, 0, i); + } + for (int i=0; i<2000;i=i+25) { + matchingAiSubProcessorAuto.process(paramRec, 4, 1, i, 0); + } + + long endTime = System.currentTimeMillis(); + log.info("AI Sub [" + sThreadName + "]Job Ended: " + endTime); + log.info("AI Sub [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms"); + + //작업종료에 대한 로그 업데이트 + paramLog.put("exit_code", "0"); + paramLog.put("exit_message", ""); + matchingInnerDelingMapper.finishUserJob(paramLog); + + } + + @SuppressWarnings("rawtypes") @Async("aiAsync") public void aiJobSub(String jobGroupId, Map paramRec) throws Exception { @@ -209,12 +297,13 @@ public class JobService { String sCprCode = (String) paramRec.get("cpr_code"); String sPartCpr = (String) paramRec.get("partn_cpr"); String sDelngCrncy = (String) paramRec.get("delng_crncy"); + String sErrorRange = (String) paramRec.get("error_range"); String sThreadName = Thread.currentThread().getName(); log.debug("call python"); new ProcessExecutor() - .command(sPythonPrg, sPythonAiTarget, sThreadName, sSysSe, sAccnutYm, sCprCode, sPartCpr, sDelngCrncy) + .command(sPythonPrg, sPythonAiTarget, sThreadName, sSysSe, sAccnutYm, sCprCode, sPartCpr, sDelngCrncy, sErrorRange) .redirectOutput(new LogOutputStream() { @Override protected void processLine(String line) { @@ -242,14 +331,17 @@ public class JobService { 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(); + JobParametersBuilder jobParametersBuilder = new JobParametersBuilder(); + jobParametersBuilder + .addString("syncDate", date) + .addString("jobType", jobType) + .addString("sysSe", params.get("sysSe")) + .addString("accnutYm", params.get("accnutYm")); + if (params.get("cpr_code") != null) jobParametersBuilder.addString("cpr_code", params.get("cpr_code")); + if (params.get("partn_cpr") != null) jobParametersBuilder.addString("partn_cpr", params.get("partn_cpr")); + JobParameters jobParameters = jobParametersBuilder.toJobParameters(); + var jobToStart = context.getBean(jobName, Job.class); JobExecution jobExe = jobLauncher.run(jobToStart, jobParameters); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 98882de..373b089 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -46,7 +46,7 @@ decorator.datasource.p6spy.enable-logging=true logging.level.root=info logging.level.com.batch=info -logging.level.p6spy=debug +logging.level.p6spy=off #Thread Count 설정 thread.comm.count=10 diff --git a/src/main/resources/matchingSetup.json b/src/main/resources/matchingSetup.json index 89674b5..0022081 100644 --- a/src/main/resources/matchingSetup.json +++ b/src/main/resources/matchingSetup.json @@ -35,6 +35,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -81,6 +82,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -131,6 +133,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -176,6 +179,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -227,6 +231,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -271,6 +276,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -318,6 +324,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -359,6 +366,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -405,6 +413,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -446,6 +455,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -497,6 +507,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -540,6 +551,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -590,6 +602,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -635,6 +648,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -688,6 +702,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -733,6 +748,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -780,6 +796,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -827,6 +844,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -872,6 +890,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -917,6 +936,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -964,6 +984,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1011,6 +1032,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1059,6 +1081,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1104,6 +1127,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1151,6 +1175,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1196,6 +1221,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1241,6 +1267,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1286,6 +1313,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1333,6 +1361,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1378,6 +1407,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1426,6 +1456,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1470,6 +1501,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1514,6 +1546,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1558,6 +1591,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1602,6 +1636,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1646,6 +1681,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1693,6 +1729,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1737,6 +1774,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1781,6 +1819,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1825,6 +1864,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1869,6 +1909,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1913,6 +1954,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -1962,6 +2004,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2007,6 +2050,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2052,6 +2096,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2097,6 +2142,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2143,6 +2189,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2188,6 +2235,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2233,6 +2281,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2278,6 +2327,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2336,6 +2386,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2381,6 +2432,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2426,6 +2478,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2471,6 +2524,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2516,6 +2570,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2561,6 +2616,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2606,6 +2662,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2651,6 +2708,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2700,6 +2758,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2745,6 +2804,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2790,6 +2850,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2836,6 +2897,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2879,6 +2941,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2922,6 +2985,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -2967,6 +3031,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3010,6 +3075,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3053,6 +3119,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3093,6 +3160,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3134,6 +3202,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3183,6 +3252,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3228,6 +3298,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3273,6 +3344,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3321,6 +3393,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3366,6 +3439,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3411,6 +3485,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3459,6 +3534,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3504,6 +3580,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3549,6 +3626,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3599,6 +3677,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3644,6 +3723,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3687,6 +3767,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3732,6 +3813,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3777,6 +3859,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", @@ -3820,6 +3903,7 @@ "sn" ], "compareKey": "compare_ky", + "currencyField": "delng_crncy", "amtField": "sum(delng_amt) as delng_amt", "compareField": [ "accnut_ym", diff --git a/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml b/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml index 501e970..5cab282 100644 --- a/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml +++ b/src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml @@ -24,6 +24,12 @@ and accnut_ym = #{accnutYm} and mtch_ty is null and dta_ty in ('11','21','31','33','35','37','41') + + and cpr_code = #{cpr_code} + + + and partn_cpr = #{partn_cpr} + GROUP BY sys_se , accnut_ym @@ -43,6 +49,12 @@ and accnut_ym = #{accnutYm} and mtch_ty is null and dta_ty in ('12','22','32','34','36','38','42') + + and partn_cpr = #{partn_cpr} + + + and cpr_code = #{cpr_code} + GROUP BY sys_se , accnut_ym @@ -77,6 +89,7 @@ SELECT accnut_ym , compare_ky + , ${currencyField} , ${amtField} FROM public.batch_tbcr_inner_delng @@ -91,7 +104,8 @@ group by accnut_ym, - compare_ky + compare_ky, + ${currencyField} @@ -525,6 +539,12 @@ and accnut_ym = #{accnutYm} and mtch_ty is null and dta_ty in ('11','21','31','33','35','37','41') + + and cpr_code = #{cpr_code} + + + and partn_cpr = #{partn_cpr} + GROUP BY sys_se , accnut_ym @@ -546,6 +566,12 @@ and accnut_ym = #{accnutYm} and mtch_ty is null and dta_ty in ('12','22','32','34','36','38','42') + + and partn_cpr = #{partn_cpr} + + + and cpr_code = #{cpr_code} + GROUP BY sys_se , accnut_ym @@ -624,4 +650,142 @@ and accnut_ym = #{accnutYm} + + + + + + + + + + \ No newline at end of file diff --git a/사용법.md b/사용법.md index a34fc53..223cb16 100644 --- a/사용법.md +++ b/사용법.md @@ -20,7 +20,8 @@ http://localhost:8080/api/job/matching "jobType": "ALL", "sysSe": "AI_ALL", "accnutYm": "202311", - "searchCond": "mtch_ty is null" + "cpr_code": "O01100", + "partn_cpr": "Z01100" } .\curl\bin\curl -d '{"jobType": "ALL", "sysSe":"AI_ALL", "accnutYm":"202311", "searchCond":"mtch_ty is null"}' ` @@ -32,7 +33,9 @@ http://localhost:8080/api/job/matching http://localhost:8080/api/job/extramatching { "sysSe": "LS_ALL", - "accnutYm": "202311" + "accnutYm": "202311", + "cpr_code": "O01100", + "partn_cpr": "Z01100" } .\curl\bin\curl -d '{"sysSe":"AI_ALL", "accnutYm":"202311"}' ` @@ -45,13 +48,29 @@ http://localhost:8080/api/job/aimatching { "sysSe": "LS_ALL", "accnutYm": "202310", + "cpr_code": "O01100", + "partn_cpr": "Z01100", + "error_range": "0" } +파이썬에 파라미터 넘기는 내용 +{PythonPrg, PythonAiTarget, ThreadName, SysSe, AccnutYm, CprCode, PartCpr, DelngCrncy, ErrorRange} .\curl\bin\curl -d '{"sysSe":"AI_ALL", "accnutYm":"202311"}' ` -H "Content-Type: application/json" ` -X POST http://localhost:8080/api/job/aimatching +#AI SUB 매칭 (조합) +http://localhost:8080/api/job/aisubmatching +{ + "sysSe": "LS_ALL", + "accnutYm": "202311", + "mtch_ty": "AI_SLT", + "cpr_code": "O01100", + "partn_cpr": "Z01100", + "error_range": "0" +} + #매칭결과 리턴시 http://localhost:8080/api/job/return -- libgit2 0.21.4