Commit 30bbef42a0db1669e40ab1f2bfdc8163e5e36053

Authored by 함상기
1 parent dec8d909

ai sub Matching 추가

실행시 추가로 자가및 상대법인 파라미터로 받을 수 있도록 추가
src/main/java/com/batch/config/MatchingAiSubProcessorAuto.java 0 → 100644
  1 +package com.batch.config;
  2 +
  3 +import java.math.BigDecimal;
  4 +import java.math.MathContext;
  5 +import java.math.RoundingMode;
  6 +import java.text.SimpleDateFormat;
  7 +import java.util.ArrayList;
  8 +import java.util.Date;
  9 +import java.util.HashMap;
  10 +import java.util.List;
  11 +import java.util.Map;
  12 +import java.util.UUID;
  13 +
  14 +import com.batch.mapper.primary.MatchingInnerDelingMapper;
  15 +import com.batch.util.StatisticsUtil;
  16 +
  17 +import lombok.RequiredArgsConstructor;
  18 +import lombok.extern.slf4j.Slf4j;
  19 +
  20 +@Slf4j
  21 +@RequiredArgsConstructor
  22 +public class MatchingAiSubProcessorAuto {
  23 +
  24 + private final MatchingInnerDelingMapper matchingInnerDelingMapper;
  25 +
  26 + @SuppressWarnings("unchecked")
  27 + public void process(Map paramRec, int iCmbnOwnCnt, int iCmbnTranCnt, int iStartOwn, int iStartTran) throws Exception {
  28 +
  29 + //Job Create Log
  30 + UUID uuid = UUID.randomUUID();
  31 + HashMap<String, String> mt = new HashMap<String, String>();
  32 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
  33 + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString();
  34 +
  35 + Map<String, Object> paramLog = new HashMap<String, Object>();
  36 + paramLog.put("user_job_id", sDate);
  37 + paramLog.put("user_job_name", "AI Sub 조합매칭(" + paramRec.toString() + ",[" + iCmbnOwnCnt + "," + iStartOwn + "],[" + iCmbnTranCnt + "," + iStartTran + "])");
  38 + matchingInnerDelingMapper.createUserJob(paramLog);
  39 +
  40 +
  41 + int iUpdated = 0;
  42 +
  43 + String sSysSe = (String) paramRec.get("sys_se");
  44 + String sAccnutYm = (String) paramRec.get("accnut_ym");
  45 + String sMtchTy = (String) paramRec.get("mtch_ty");
  46 + Long lngMtchKy = (Long) paramRec.get("mtch_ky");
  47 + String sCprCode = (String) paramRec.get("cpr_code");
  48 + String sPartCpr = (String) paramRec.get("partn_cpr");
  49 + String sConds = (String) paramRec.get("conds");
  50 +
  51 + Integer iErrorRange = 0;
  52 + if (paramRec.get("error_range") != null) iErrorRange = Integer.parseInt((String) paramRec.get("error_range"));
  53 +
  54 + //작업시작
  55 + Map<String, Object> mParam = new HashMap<String, Object>();
  56 + mParam.put("sysSe", sSysSe);
  57 + mParam.put("accnutYm", sAccnutYm);
  58 + mParam.put("mtchTy", sMtchTy);
  59 + mParam.put("mtchKy", lngMtchKy);
  60 + mParam.put("conds", sConds);
  61 +
  62 + //----------------------------------------------------------------------------
  63 + //자기법인 데이타 가져오기
  64 + mParam.put("cprCode", sCprCode);
  65 + mParam.put("partnCpr", sPartCpr);
  66 + List<Map> lMatchingDataOne = matchingInnerDelingMapper.getAiSubDataOne(mParam);
  67 +
  68 + //상대법인 데이타 가져오기
  69 + mParam.put("cprCode", sPartCpr);
  70 + mParam.put("partnCpr", sCprCode);
  71 + List<Map> lMatchingDataTwo = matchingInnerDelingMapper.getAiSubDataTwo(mParam);
  72 +
  73 + //Combination 데이타 만들기
  74 + List<Map> compResult = new ArrayList<Map>();
  75 + List<List<Map>> llMatchingDataOne = new ArrayList<List<Map>>();
  76 + List<List<Map>> llMatchingDataTwo = new ArrayList<List<Map>>();
  77 +
  78 + int iEndOwn = lMatchingDataOne.size();
  79 + if (iCmbnOwnCnt == 2) {
  80 + iEndOwn = iStartOwn + 1000;
  81 + if (iEndOwn > lMatchingDataOne.size()) iEndOwn = lMatchingDataOne.size();
  82 + }
  83 + if (iCmbnOwnCnt == 3) {
  84 + iEndOwn = iStartOwn + 50;
  85 + if (iEndOwn > lMatchingDataOne.size()) iEndOwn = lMatchingDataOne.size();
  86 + }
  87 + if (iCmbnOwnCnt > 3) {
  88 + iEndOwn = iStartOwn + 25;
  89 + if (iEndOwn > lMatchingDataOne.size()) iEndOwn = lMatchingDataOne.size();
  90 + }
  91 +
  92 + int iEndTran = lMatchingDataTwo.size();
  93 + if (iCmbnTranCnt == 2) {
  94 + iEndTran = iStartTran + 1000;
  95 + if (iEndTran > lMatchingDataTwo.size()) iEndTran = lMatchingDataTwo.size();
  96 + }
  97 + if (iCmbnTranCnt == 3) {
  98 + iEndTran = iStartTran + 50;
  99 + if (iEndTran > lMatchingDataTwo.size()) iEndTran = lMatchingDataTwo.size();
  100 + }
  101 + if (iCmbnTranCnt > 3) {
  102 + iEndTran = iStartTran + 25;
  103 + if (iEndTran > lMatchingDataTwo.size()) iEndTran = lMatchingDataTwo.size();
  104 + }
  105 +
  106 + StatisticsUtil.reculsion(lMatchingDataOne, compResult, iStartOwn, iEndOwn, iCmbnOwnCnt, llMatchingDataOne);
  107 + StatisticsUtil.reculsion(lMatchingDataTwo, compResult, iStartTran, iEndTran, iCmbnTranCnt, llMatchingDataTwo);
  108 +
  109 + //----------------------------------------------------------------------------
  110 + //자기법인 데이타를 맵으로 처리한다.
  111 + Map<BigDecimal, List<List<Map>>> mMatchingDataOne = new HashMap<BigDecimal, List<List<Map>>>();
  112 + for (List<Map> curlMap : llMatchingDataOne) {
  113 + BigDecimal bdKey = BigDecimal.ZERO;
  114 + for(Map curMap : curlMap) {
  115 + bdKey = bdKey.add((BigDecimal) curMap.get("delng_amt"));
  116 + }
  117 + List<List<Map>> curllMap = new ArrayList<List<Map>>();
  118 + if (mMatchingDataOne.containsKey(bdKey)) curllMap = mMatchingDataOne.get(bdKey);
  119 + curllMap.add(curlMap);
  120 + mMatchingDataOne.put(bdKey, curllMap);
  121 + }
  122 +
  123 + //키를 Ceiling 처리하여 다시 작성
  124 + Map<BigDecimal, List<List<Map>>> mMatchingDataOneNew = new HashMap<BigDecimal, List<List<Map>>>();
  125 + for (BigDecimal bdKey : mMatchingDataOne.keySet()) {
  126 + BigDecimal bdKeyNew = bdKey.setScale(iErrorRange, RoundingMode.HALF_UP);
  127 + mMatchingDataOneNew.put(bdKeyNew, mMatchingDataOne.get(bdKey));
  128 + }
  129 + mMatchingDataOne = mMatchingDataOneNew;
  130 +
  131 + //상대법인 데이타를 맵으로 처리한다.
  132 + Map<BigDecimal, List<List<Map>>> mMatchingDataTwo = new HashMap<BigDecimal, List<List<Map>>>();
  133 + for (List<Map> curlMap : llMatchingDataTwo) {
  134 + BigDecimal bdKey = BigDecimal.ZERO;
  135 + for(Map curMap : curlMap) {
  136 + bdKey = bdKey.add((BigDecimal) curMap.get("delng_amt"));
  137 + }
  138 + List<List<Map>> curllMap = new ArrayList<List<Map>>();
  139 + if (mMatchingDataTwo.containsKey(bdKey)) curllMap = mMatchingDataTwo.get(bdKey);
  140 + curllMap.add(curlMap);
  141 + mMatchingDataTwo.put(bdKey, curllMap);
  142 + }
  143 +
  144 + //키를 Ceiling 처리하여 다시 작성
  145 + Map<BigDecimal, List<List<Map>>> mMatchingDataTwoNew = new HashMap<BigDecimal, List<List<Map>>>();
  146 + for (BigDecimal bdKey : mMatchingDataTwo.keySet()) {
  147 + BigDecimal bdKeyNew = bdKey.setScale(iErrorRange, RoundingMode.HALF_UP);
  148 + mMatchingDataTwoNew.put(bdKeyNew, mMatchingDataTwo.get(bdKey));
  149 + }
  150 + mMatchingDataTwo = mMatchingDataTwoNew;
  151 +
  152 + //여기서 매칭 비교
  153 + //비교 lMatchingDataOne vs mMatchingDataTwo
  154 + List<Map> lMatchingResultUpdate = new ArrayList<Map>(); //업데이트할 대상
  155 +
  156 + int mtchNumber = 0;
  157 + String mtchSys = "AUTO";
  158 + String mtchType = "AI_" + iCmbnOwnCnt + "_" + iCmbnTranCnt;
  159 + String mtchTypeName = "자기(" + iCmbnOwnCnt + "건Sum), 상대(" + iCmbnTranCnt + "건Sum), 비교(금액)";
  160 + for (BigDecimal curKey : mMatchingDataOne.keySet()) {
  161 + if (mMatchingDataTwo.containsKey(curKey)) {
  162 + List<List<Map>> llMapOne = mMatchingDataOne.get(curKey);
  163 + List<List<Map>> llMapTwo = mMatchingDataTwo.get(curKey);
  164 +
  165 + //위와 관련된 동일 레코드가 있는 리스트 삭제
  166 + for (int i=llMapOne.size()-1; i>=0;i--) {
  167 + List<Map> curlMap = llMapOne.get(i);
  168 + for (Map curMap : lMatchingResultUpdate) {
  169 + int curIdx = curlMap.indexOf(curMap);
  170 + if (curIdx != -1) {
  171 + llMapOne.remove(i);
  172 + break;
  173 + }
  174 + }
  175 + }
  176 + for (int i=llMapTwo.size()-1; i>=0;i--) {
  177 + List<Map> curlMap = llMapTwo.get(i);
  178 + for (Map curMap : lMatchingResultUpdate) {
  179 + int curIdx = curlMap.indexOf(curMap);
  180 + if (curIdx != -1) {
  181 + llMapTwo.remove(i);
  182 + break;
  183 + }
  184 + }
  185 + }
  186 +
  187 +
  188 + int iMin = Math.min(llMapOne.size(), llMapTwo.size());
  189 + if (iMin > 0) mtchNumber++;
  190 + while (iMin > 0) {
  191 + List<Map> curlMapOne = llMapOne.get(0);
  192 + for (Map curMap : curlMapOne) {
  193 + curMap.put("mtch_sys", mtchSys);
  194 + curMap.put("mtch_ty", mtchType);
  195 + curMap.put("mtch_ty_nm", mtchTypeName);
  196 + curMap.put("mtch_ky", mtchNumber);
  197 + lMatchingResultUpdate.add(curMap);
  198 + }
  199 + llMapOne.remove(0);
  200 +
  201 + List<Map> curlMapTwo = llMapTwo.get(0);
  202 + for (Map curMap : curlMapTwo) {
  203 + curMap.put("mtch_sys", mtchSys);
  204 + curMap.put("mtch_ty", mtchType);
  205 + curMap.put("mtch_ty_nm", mtchTypeName);
  206 + curMap.put("mtch_ky", mtchNumber);
  207 + lMatchingResultUpdate.add(curMap);
  208 + }
  209 + llMapTwo.remove(0);
  210 +
  211 + //위와 관련된 동일 레코드가 있는 리스트 삭제(추가 업데이트 목록)
  212 + for (int i=llMapOne.size()-1; i>=0;i--) {
  213 + List<Map> curlMap = llMapOne.get(i);
  214 + for (Map curMap : curlMapOne) {
  215 + int curIdx = curlMap.indexOf(curMap);
  216 + if (curIdx != -1) {
  217 + llMapOne.remove(i);
  218 + break;
  219 + }
  220 + }
  221 + }
  222 + for (int i=llMapTwo.size()-1; i>=0;i--) {
  223 + List<Map> curlMap = llMapTwo.get(i);
  224 + for (Map curMap : curlMapTwo) {
  225 + int curIdx = curlMap.indexOf(curMap);
  226 + if (curIdx != -1) {
  227 + llMapTwo.remove(i);
  228 + break;
  229 + }
  230 + }
  231 + }
  232 + iMin = Math.min(llMapOne.size(), llMapTwo.size());
  233 + }
  234 + }
  235 + }
  236 +
  237 + //----------------------------------------------------------------------------
  238 + //여기서 결과 업데이트
  239 + iUpdated = 0;
  240 + int limit = 1000; //1000건씩 batch
  241 + List<Map> lUpdated = new ArrayList<Map>();
  242 + for (Map curMap : lMatchingResultUpdate) {
  243 + lUpdated.add(curMap);
  244 + if (lUpdated.size() == limit) {
  245 + matchingInnerDelingMapper.setExtraResult(Map.of("itemList", lUpdated));
  246 + iUpdated = iUpdated + lUpdated.size();
  247 + lUpdated.clear();
  248 + }
  249 + }
  250 + if (lUpdated.size() > 0) {
  251 + matchingInnerDelingMapper.setExtraResult(Map.of("itemList", lUpdated));
  252 + iUpdated = iUpdated + lUpdated.size();
  253 + }
  254 + log.debug("Updated OrgData : " + iUpdated + "건");
  255 +
  256 + //작업종료에 대한 로그 업데이트
  257 + paramLog.put("exit_code", "0");
  258 + paramLog.put("exit_message", "");
  259 + matchingInnerDelingMapper.finishUserJob(paramLog);
  260 +
  261 + }
  262 +
  263 +}
0 264 \ No newline at end of file
... ...
src/main/java/com/batch/config/MatchingItemProcessorAuto.java
... ... @@ -71,12 +71,14 @@ public class MatchingItemProcessorAuto implements ItemProcessor&lt;Map, Map&gt; {
71 71 params.put("cprCode", item.get("cpr_code"));
72 72 params.put("partnCpr", item.get("partn_cpr"));
73 73 params.put("amtField", matching.getAmtField());
  74 + params.put("currencyField", matching.getCurrencyField());
74 75 params.put("cond", condOne.getCond() ); //조건리스트
75 76 List<Map> lMatchingDataOne = matchingInnerDelingMapper.getMatchingData(params);
76 77  
77 78 //상대법인 데이타 가져오기
78 79 params.put("cprCode", item.get("partn_cpr"));
79 80 params.put("partnCpr", item.get("cpr_code"));
  81 + params.put("currencyField", matching.getCurrencyField());
80 82 params.put("amtField", matching.getAmtField());
81 83 params.put("cond", condTwo.getCond() ); //조건리스트
82 84 List<Map> lMatchingDataTwo = matchingInnerDelingMapper.getMatchingData(params);
... ...
src/main/java/com/batch/config/MatchingItemReader.java
... ... @@ -32,7 +32,7 @@ public class MatchingItemReader {
32 32 */
33 33 public List<Map> customRead(){
34 34 log.debug("customRead.params : " + this.params.toString());
35   - // 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}
  35 + // customRead.params : {sysSe=KUMKANG, run.id=1, syncDate=2024-02-02-03-52-27:50deede8-ce3d-4841-ba65-f733bdd38533, jobType=F, accnutYm=202112}
36 36 String sMatchType = this.params.get("jobType");
37 37 StringBuffer sb = FileUtil.readFileToString("matchingSetup.json");
38 38 MatchingSetup matchingSetup = (MatchingSetup) FileUtil.strToObj(sb.toString(), MatchingSetup.class);
... ...
src/main/java/com/batch/config/MatchingSetup.java
... ... @@ -20,6 +20,7 @@ public class MatchingSetup {
20 20 List<String> uniqueKey;
21 21 String compareKey;
22 22 List<String> compareField;
  23 + String currencyField;
23 24 String amtField;
24 25 String matchingType;
25 26 String matchingTypeName;
... ...
src/main/java/com/batch/controller/JobController.java
1 1 package com.batch.controller;
2 2  
  3 +import java.math.BigDecimal;
3 4 import java.util.ArrayList;
4 5 import java.util.HashMap;
5 6 import java.util.List;
... ... @@ -85,6 +86,8 @@ public class JobController {
85 86 * {
86 87 * "sysSe": "LS_ALL",
87 88 * "accnutYm": "202306",
  89 + * "cpr_code": "xxxxx",
  90 + * "partn_cpr": "xxxxx",
88 91 * }
89 92 */
90 93 //Job Create Log
... ... @@ -109,6 +112,8 @@ public class JobController {
109 112 * {
110 113 * "sysSe": "LS_ALL",
111 114 * "accnutYm": "202306",
  115 + * "cpr_code": "xxxxx",
  116 + * "partn_cpr": "xxxxx",
112 117 * "searchOne": "dta_ty in ('11','21','31','33','35','37','41')",
113 118 * "searchTwo": "dta_ty in ('11','21','31','33','35','37','41')"
114 119 * }
... ... @@ -145,6 +150,44 @@ public class JobController {
145 150 }
146 151  
147 152  
  153 + @PostMapping("/aisubmatching")
  154 + public Map<String, String> aiSubMatchingJob( @RequestBody Map<String, String> params) throws Exception {
  155 +
  156 + /*
  157 + * {
  158 + * "sysSe": "LS_ALL",
  159 + * "accnutYm": "202306",
  160 + * "mtch_ty": "AI_SLT"
  161 + * "cpr_code": "xxxxx",
  162 + * "partn_cpr": "xxxxx"
  163 + * }
  164 + */
  165 + //Job Create Log
  166 + UUID uuid = UUID.randomUUID();
  167 + String sJobGroup = uuid.toString();
  168 +
  169 + log.debug("Start AI Sub Matching Job");
  170 + List<Map> retData = matchingInnerDelingMapper.getAiSubReadData(params);
  171 +
  172 + //AI의 경우 수익비용만 매칭하고 있음
  173 + for(Map curMap : retData) {
  174 + Map<String, String> cParams = new HashMap<String, String>();
  175 + cParams.putAll(params);
  176 + cParams.putAll(curMap);
  177 + cParams.put("conds", "T");
  178 + jobService.aiSubJobSub(sJobGroup, cParams);
  179 + }
  180 +
  181 + log.debug("End Extra Matching Job");
  182 +
  183 + Map<String, String> rtnMap = new HashMap<String, String>();
  184 + rtnMap.put("jobGroupId", sJobGroup);
  185 + rtnMap.put("jobMessage", "Extra 매칭작업을 시작합니다. 작업이 끝난후 작업결과는 별도로 확인 바랍니다.");
  186 +
  187 + return rtnMap;
  188 + }
  189 +
  190 +
148 191 @PostMapping("/aimatching")
149 192 public Map<String, String> aiMatchingJob( @RequestBody Map<String, String> params) throws Exception {
150 193  
... ... @@ -152,6 +195,9 @@ public class JobController {
152 195 * {
153 196 * "sysSe": "LS_ALL",
154 197 * "accnutYm": "202306",
  198 + * "cpr_code": "xxxxx",
  199 + * "partn_cpr": "xxxxx",
  200 + * "error_range": "0"
155 201 * }
156 202 */
157 203 //Job Create Log
... ... @@ -161,7 +207,10 @@ public class JobController {
161 207 log.debug("Start AI Matching Job");
162 208 List<Map> retData = matchingInnerDelingMapper.getAiReadData(params);
163 209 for(Map curMap : retData) {
164   - jobService.aiJobSub(sJobGroup, curMap);
  210 + Map<String, Object> curMParams = new HashMap<String, Object>();
  211 + curMParams.putAll(curMap);
  212 + curMParams.put("error_range", params.get("error_range"));
  213 + jobService.aiJobSub(sJobGroup, curMParams);
165 214 }
166 215 log.debug("End AI Matching Job");
167 216  
... ...
src/main/java/com/batch/mapper/primary/MatchingInnerDelingMapper.java
... ... @@ -13,7 +13,6 @@ public interface MatchingInnerDelingMapper {
13 13 */
14 14 @SuppressWarnings("rawtypes")
15 15 List<Map> getCustomItemReadData(Map param);
16   -
17 16  
18 17 /**
19 18 * 작업키 업데이트 (파라미터 : 자기데이타/상대데이타)
... ... @@ -168,5 +167,27 @@ public interface MatchingInnerDelingMapper {
168 167 */
169 168 @SuppressWarnings("rawtypes")
170 169 List<Map> getUserJobStatus(Map param);
  170 +
  171 + /*
  172 + * AI Sub 작업리스트
  173 + */
  174 + @SuppressWarnings("rawtypes")
  175 + List<Map> getAiSubReadData(Map param);
  176 +
  177 + /**
  178 + * AI Sub matching을 위한 자료 조회
  179 + * @param param
  180 + * @return
  181 + */
  182 + @SuppressWarnings("rawtypes")
  183 + List<Map> getAiSubDataOne(Map param);
  184 +
  185 + /**
  186 + * AI Sub matching을 위한 자료 조회
  187 + * @param param
  188 + * @return
  189 + */
  190 + @SuppressWarnings("rawtypes")
  191 + List<Map> getAiSubDataTwo(Map param);
171 192  
172 193 }
173 194 \ No newline at end of file
... ...
src/main/java/com/batch/service/JobService.java
1 1 package com.batch.service;
2 2  
  3 +import java.math.BigDecimal;
3 4 import java.text.SimpleDateFormat;
4 5 import java.util.ArrayList;
5 6 import java.util.Arrays;
... ... @@ -12,6 +13,7 @@ import java.util.UUID;
12 13 import org.springframework.batch.core.BatchStatus;
13 14 import org.springframework.batch.core.Job;
14 15 import org.springframework.batch.core.JobExecution;
  16 +import org.springframework.batch.core.JobParameter;
15 17 import org.springframework.batch.core.JobParameters;
16 18 import org.springframework.batch.core.JobParametersBuilder;
17 19 import org.springframework.batch.core.JobParametersInvalidException;
... ... @@ -27,6 +29,7 @@ import org.springframework.stereotype.Service;
27 29 import org.zeroturnaround.exec.ProcessExecutor;
28 30 import org.zeroturnaround.exec.stream.LogOutputStream;
29 31  
  32 +import com.batch.config.MatchingAiSubProcessorAuto;
30 33 import com.batch.config.MatchingExtraProcessorAuto;
31 34 import com.batch.config.MatchingSetup;
32 35 import com.batch.config.MatchingSetup.Matching;
... ... @@ -160,8 +163,20 @@ public class JobService {
160 163 matchingExtraProcessorAuto.process(paramRec, 1, 3, 0, i);
161 164 }
162 165 for (int i=0; i<2000;i=i+50) {
  166 + matchingExtraProcessorAuto.process(paramRec, 2, 3, 0, i);
  167 + }
  168 + for (int i=0; i<2000;i=i+50) {
  169 + matchingExtraProcessorAuto.process(paramRec, 3, 3, 0, i);
  170 + }
  171 + for (int i=0; i<2000;i=i+50) {
163 172 matchingExtraProcessorAuto.process(paramRec, 3, 1, i, 0);
164 173 }
  174 + for (int i=0; i<2000;i=i+50) {
  175 + matchingExtraProcessorAuto.process(paramRec, 3, 2, i, 0);
  176 + }
  177 + for (int i=0; i<2000;i=i+50) {
  178 + matchingExtraProcessorAuto.process(paramRec, 3, 3, i, 0);
  179 + }
165 180  
166 181 //4건씩 매칭일 경우 최대 2000건 까지
167 182 for (int i=0; i<2000;i=i+25) {
... ... @@ -183,6 +198,79 @@ public class JobService {
183 198 }
184 199  
185 200 @SuppressWarnings("rawtypes")
  201 + @Async("extAsync")
  202 + public void aiSubJobSub(String jobGroupId, Map paramRec) throws Exception {
  203 +
  204 + //Job Create Log
  205 + UUID uuid = UUID.randomUUID();
  206 + HashMap<String, String> mt = new HashMap<String, String>();
  207 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
  208 + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString();
  209 +
  210 + Map<String, Object> paramLog = new HashMap<String, Object>();
  211 + paramLog.put("user_job_group", jobGroupId);
  212 + paramLog.put("user_job_id", sDate);
  213 + paramLog.put("user_job_name", "AI Sub 매칭(" + paramRec.toString() + ")");
  214 + matchingInnerDelingMapper.createUserJob(paramLog);
  215 +
  216 + String sThreadName = Thread.currentThread().getName();
  217 + long startTime = System.currentTimeMillis();
  218 + log.info("AI Sub [" + sThreadName + "]Job Started : " + startTime);
  219 + log.debug("AI Sub [" + sThreadName + "]params=" + paramRec.toString());
  220 +
  221 + MatchingAiSubProcessorAuto matchingAiSubProcessorAuto = new MatchingAiSubProcessorAuto(matchingInnerDelingMapper);
  222 +
  223 + //2건씩 합산 매칭일 경우 최대 20000건 까지
  224 + for (int i=0; i<20000;i=i+1000) {
  225 + matchingAiSubProcessorAuto.process(paramRec, 1, 2, 0, i);
  226 + }
  227 + for (int i=0; i<20000;i=i+1000) {
  228 + matchingAiSubProcessorAuto.process(paramRec, 2, 1, i, 0);
  229 + }
  230 + for (int i=0; i<20000;i=i+1000) {
  231 + matchingAiSubProcessorAuto.process(paramRec, 2, 2, i, i);
  232 + }
  233 +
  234 + //3건씩 매칭일 경우 최대 2000건 까지
  235 + for (int i=0; i<2000;i=i+50) {
  236 + matchingAiSubProcessorAuto.process(paramRec, 1, 3, 0, i);
  237 + }
  238 + for (int i=0; i<2000;i=i+50) {
  239 + matchingAiSubProcessorAuto.process(paramRec, 2, 3, 0, i);
  240 + }
  241 + for (int i=0; i<2000;i=i+50) {
  242 + matchingAiSubProcessorAuto.process(paramRec, 3, 3, 0, i);
  243 + }
  244 + for (int i=0; i<2000;i=i+50) {
  245 + matchingAiSubProcessorAuto.process(paramRec, 3, 1, i, 0);
  246 + }
  247 + for (int i=0; i<2000;i=i+50) {
  248 + matchingAiSubProcessorAuto.process(paramRec, 3, 2, i, 0);
  249 + }
  250 + for (int i=0; i<2000;i=i+50) {
  251 + matchingAiSubProcessorAuto.process(paramRec, 3, 3, i, 0);
  252 + }
  253 +
  254 + //4건씩 매칭일 경우 최대 2000건 까지
  255 + for (int i=0; i<2000;i=i+25) {
  256 + matchingAiSubProcessorAuto.process(paramRec, 1, 4, 0, i);
  257 + }
  258 + for (int i=0; i<2000;i=i+25) {
  259 + matchingAiSubProcessorAuto.process(paramRec, 4, 1, i, 0);
  260 + }
  261 +
  262 + long endTime = System.currentTimeMillis();
  263 + log.info("AI Sub [" + sThreadName + "]Job Ended: " + endTime);
  264 + log.info("AI Sub [" + sThreadName + "]Running Time : " + (endTime - startTime) + "ms");
  265 +
  266 + //작업종료에 대한 로그 업데이트
  267 + paramLog.put("exit_code", "0");
  268 + paramLog.put("exit_message", "");
  269 + matchingInnerDelingMapper.finishUserJob(paramLog);
  270 +
  271 + }
  272 +
  273 + @SuppressWarnings("rawtypes")
186 274 @Async("aiAsync")
187 275 public void aiJobSub(String jobGroupId, Map paramRec) throws Exception {
188 276  
... ... @@ -209,12 +297,13 @@ public class JobService {
209 297 String sCprCode = (String) paramRec.get("cpr_code");
210 298 String sPartCpr = (String) paramRec.get("partn_cpr");
211 299 String sDelngCrncy = (String) paramRec.get("delng_crncy");
  300 + String sErrorRange = (String) paramRec.get("error_range");
212 301  
213 302 String sThreadName = Thread.currentThread().getName();
214 303  
215 304 log.debug("call python");
216 305 new ProcessExecutor()
217   - .command(sPythonPrg, sPythonAiTarget, sThreadName, sSysSe, sAccnutYm, sCprCode, sPartCpr, sDelngCrncy)
  306 + .command(sPythonPrg, sPythonAiTarget, sThreadName, sSysSe, sAccnutYm, sCprCode, sPartCpr, sDelngCrncy, sErrorRange)
218 307 .redirectOutput(new LogOutputStream() {
219 308 @Override
220 309 protected void processLine(String line) {
... ... @@ -242,14 +331,17 @@ public class JobService {
242 331 HashMap<String, String> mt = new HashMap<String, String>();
243 332 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
244 333 final String date = dateFormat.format(new Date()) + ":" + uuid.toString();
245   - JobParameters jobParameters = new JobParametersBuilder()
246   - .addString("syncDate", date)
247   - .addString("jobType", jobType)
248   - .addString("sysSe", params.get("sysSe"))
249   - .addString("accnutYm", params.get("accnutYm"))
250   - .addString("searchCond", params.get("searchCond"))
251   - .toJobParameters();
  334 + JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
  335 + jobParametersBuilder
  336 + .addString("syncDate", date)
  337 + .addString("jobType", jobType)
  338 + .addString("sysSe", params.get("sysSe"))
  339 + .addString("accnutYm", params.get("accnutYm"));
  340 + if (params.get("cpr_code") != null) jobParametersBuilder.addString("cpr_code", params.get("cpr_code"));
  341 + if (params.get("partn_cpr") != null) jobParametersBuilder.addString("partn_cpr", params.get("partn_cpr"));
252 342  
  343 + JobParameters jobParameters = jobParametersBuilder.toJobParameters();
  344 +
253 345 var jobToStart = context.getBean(jobName, Job.class);
254 346 JobExecution jobExe = jobLauncher.run(jobToStart, jobParameters);
255 347  
... ...
src/main/resources/application.properties
... ... @@ -46,7 +46,7 @@ decorator.datasource.p6spy.enable-logging=true
46 46  
47 47 logging.level.root=info
48 48 logging.level.com.batch=info
49   -logging.level.p6spy=debug
  49 +logging.level.p6spy=off
50 50  
51 51 #Thread Count 설정
52 52 thread.comm.count=10
... ...
src/main/resources/matchingSetup.json
... ... @@ -35,6 +35,7 @@
35 35 "sn"
36 36 ],
37 37 "compareKey": "compare_ky",
  38 + "currencyField": "delng_crncy",
38 39 "amtField": "sum(delng_amt) as delng_amt",
39 40 "compareField": [
40 41 "accnut_ym",
... ... @@ -81,6 +82,7 @@
81 82 "sn"
82 83 ],
83 84 "compareKey": "compare_ky",
  85 + "currencyField": "delng_crncy",
84 86 "amtField": "sum(delng_amt) as delng_amt",
85 87 "compareField": [
86 88 "accnut_ym",
... ... @@ -131,6 +133,7 @@
131 133 "sn"
132 134 ],
133 135 "compareKey": "compare_ky",
  136 + "currencyField": "delng_crncy",
134 137 "amtField": "sum(delng_amt) as delng_amt",
135 138 "compareField": [
136 139 "accnut_ym",
... ... @@ -176,6 +179,7 @@
176 179 "sn"
177 180 ],
178 181 "compareKey": "compare_ky",
  182 + "currencyField": "delng_crncy",
179 183 "amtField": "sum(delng_amt) as delng_amt",
180 184 "compareField": [
181 185 "accnut_ym",
... ... @@ -227,6 +231,7 @@
227 231 "sn"
228 232 ],
229 233 "compareKey": "compare_ky",
  234 + "currencyField": "delng_crncy",
230 235 "amtField": "sum(delng_amt) as delng_amt",
231 236 "compareField": [
232 237 "accnut_ym",
... ... @@ -271,6 +276,7 @@
271 276 "sn"
272 277 ],
273 278 "compareKey": "compare_ky",
  279 + "currencyField": "delng_crncy",
274 280 "amtField": "sum(delng_amt) as delng_amt",
275 281 "compareField": [
276 282 "accnut_ym",
... ... @@ -318,6 +324,7 @@
318 324 "sn"
319 325 ],
320 326 "compareKey": "compare_ky",
  327 + "currencyField": "delng_crncy",
321 328 "amtField": "sum(delng_amt) as delng_amt",
322 329 "compareField": [
323 330 "accnut_ym",
... ... @@ -359,6 +366,7 @@
359 366 "sn"
360 367 ],
361 368 "compareKey": "compare_ky",
  369 + "currencyField": "delng_crncy",
362 370 "amtField": "sum(delng_amt) as delng_amt",
363 371 "compareField": [
364 372 "accnut_ym",
... ... @@ -405,6 +413,7 @@
405 413 "sn"
406 414 ],
407 415 "compareKey": "compare_ky",
  416 + "currencyField": "delng_crncy",
408 417 "amtField": "sum(delng_amt) as delng_amt",
409 418 "compareField": [
410 419 "accnut_ym",
... ... @@ -446,6 +455,7 @@
446 455 "sn"
447 456 ],
448 457 "compareKey": "compare_ky",
  458 + "currencyField": "delng_crncy",
449 459 "amtField": "sum(delng_amt) as delng_amt",
450 460 "compareField": [
451 461 "accnut_ym",
... ... @@ -497,6 +507,7 @@
497 507 "sn"
498 508 ],
499 509 "compareKey": "compare_ky",
  510 + "currencyField": "delng_crncy",
500 511 "amtField": "sum(delng_amt) as delng_amt",
501 512 "compareField": [
502 513 "accnut_ym",
... ... @@ -540,6 +551,7 @@
540 551 "sn"
541 552 ],
542 553 "compareKey": "compare_ky",
  554 + "currencyField": "delng_crncy",
543 555 "amtField": "sum(delng_amt) as delng_amt",
544 556 "compareField": [
545 557 "accnut_ym",
... ... @@ -590,6 +602,7 @@
590 602 "sn"
591 603 ],
592 604 "compareKey": "compare_ky",
  605 + "currencyField": "delng_crncy",
593 606 "amtField": "sum(delng_amt) as delng_amt",
594 607 "compareField": [
595 608 "accnut_ym",
... ... @@ -635,6 +648,7 @@
635 648 "sn"
636 649 ],
637 650 "compareKey": "compare_ky",
  651 + "currencyField": "delng_crncy",
638 652 "amtField": "sum(delng_amt) as delng_amt",
639 653 "compareField": [
640 654 "accnut_ym",
... ... @@ -688,6 +702,7 @@
688 702 "sn"
689 703 ],
690 704 "compareKey": "compare_ky",
  705 + "currencyField": "delng_crncy",
691 706 "amtField": "sum(delng_amt) as delng_amt",
692 707 "compareField": [
693 708 "accnut_ym",
... ... @@ -733,6 +748,7 @@
733 748 "sn"
734 749 ],
735 750 "compareKey": "compare_ky",
  751 + "currencyField": "delng_crncy",
736 752 "amtField": "sum(delng_amt) as delng_amt",
737 753 "compareField": [
738 754 "accnut_ym",
... ... @@ -780,6 +796,7 @@
780 796 "sn"
781 797 ],
782 798 "compareKey": "compare_ky",
  799 + "currencyField": "delng_crncy",
783 800 "amtField": "sum(delng_amt) as delng_amt",
784 801 "compareField": [
785 802 "accnut_ym",
... ... @@ -827,6 +844,7 @@
827 844 "sn"
828 845 ],
829 846 "compareKey": "compare_ky",
  847 + "currencyField": "delng_crncy",
830 848 "amtField": "sum(delng_amt) as delng_amt",
831 849 "compareField": [
832 850 "accnut_ym",
... ... @@ -872,6 +890,7 @@
872 890 "sn"
873 891 ],
874 892 "compareKey": "compare_ky",
  893 + "currencyField": "delng_crncy",
875 894 "amtField": "sum(delng_amt) as delng_amt",
876 895 "compareField": [
877 896 "accnut_ym",
... ... @@ -917,6 +936,7 @@
917 936 "sn"
918 937 ],
919 938 "compareKey": "compare_ky",
  939 + "currencyField": "delng_crncy",
920 940 "amtField": "sum(delng_amt) as delng_amt",
921 941 "compareField": [
922 942 "accnut_ym",
... ... @@ -964,6 +984,7 @@
964 984 "sn"
965 985 ],
966 986 "compareKey": "compare_ky",
  987 + "currencyField": "delng_crncy",
967 988 "amtField": "sum(delng_amt) as delng_amt",
968 989 "compareField": [
969 990 "accnut_ym",
... ... @@ -1011,6 +1032,7 @@
1011 1032 "sn"
1012 1033 ],
1013 1034 "compareKey": "compare_ky",
  1035 + "currencyField": "delng_crncy",
1014 1036 "amtField": "sum(delng_amt) as delng_amt",
1015 1037 "compareField": [
1016 1038 "accnut_ym",
... ... @@ -1059,6 +1081,7 @@
1059 1081 "sn"
1060 1082 ],
1061 1083 "compareKey": "compare_ky",
  1084 + "currencyField": "delng_crncy",
1062 1085 "amtField": "sum(delng_amt) as delng_amt",
1063 1086 "compareField": [
1064 1087 "accnut_ym",
... ... @@ -1104,6 +1127,7 @@
1104 1127 "sn"
1105 1128 ],
1106 1129 "compareKey": "compare_ky",
  1130 + "currencyField": "delng_crncy",
1107 1131 "amtField": "sum(delng_amt) as delng_amt",
1108 1132 "compareField": [
1109 1133 "accnut_ym",
... ... @@ -1151,6 +1175,7 @@
1151 1175 "sn"
1152 1176 ],
1153 1177 "compareKey": "compare_ky",
  1178 + "currencyField": "delng_crncy",
1154 1179 "amtField": "sum(delng_amt) as delng_amt",
1155 1180 "compareField": [
1156 1181 "accnut_ym",
... ... @@ -1196,6 +1221,7 @@
1196 1221 "sn"
1197 1222 ],
1198 1223 "compareKey": "compare_ky",
  1224 + "currencyField": "delng_crncy",
1199 1225 "amtField": "sum(delng_amt) as delng_amt",
1200 1226 "compareField": [
1201 1227 "accnut_ym",
... ... @@ -1241,6 +1267,7 @@
1241 1267 "sn"
1242 1268 ],
1243 1269 "compareKey": "compare_ky",
  1270 + "currencyField": "delng_crncy",
1244 1271 "amtField": "sum(delng_amt) as delng_amt",
1245 1272 "compareField": [
1246 1273 "accnut_ym",
... ... @@ -1286,6 +1313,7 @@
1286 1313 "sn"
1287 1314 ],
1288 1315 "compareKey": "compare_ky",
  1316 + "currencyField": "delng_crncy",
1289 1317 "amtField": "sum(delng_amt) as delng_amt",
1290 1318 "compareField": [
1291 1319 "accnut_ym",
... ... @@ -1333,6 +1361,7 @@
1333 1361 "sn"
1334 1362 ],
1335 1363 "compareKey": "compare_ky",
  1364 + "currencyField": "delng_crncy",
1336 1365 "amtField": "sum(delng_amt) as delng_amt",
1337 1366 "compareField": [
1338 1367 "accnut_ym",
... ... @@ -1378,6 +1407,7 @@
1378 1407 "sn"
1379 1408 ],
1380 1409 "compareKey": "compare_ky",
  1410 + "currencyField": "delng_crncy",
1381 1411 "amtField": "sum(delng_amt) as delng_amt",
1382 1412 "compareField": [
1383 1413 "accnut_ym",
... ... @@ -1426,6 +1456,7 @@
1426 1456 "sn"
1427 1457 ],
1428 1458 "compareKey": "compare_ky",
  1459 + "currencyField": "delng_crncy",
1429 1460 "amtField": "sum(delng_amt) as delng_amt",
1430 1461 "compareField": [
1431 1462 "accnut_ym",
... ... @@ -1470,6 +1501,7 @@
1470 1501 "sn"
1471 1502 ],
1472 1503 "compareKey": "compare_ky",
  1504 + "currencyField": "delng_crncy",
1473 1505 "amtField": "sum(delng_amt) as delng_amt",
1474 1506 "compareField": [
1475 1507 "accnut_ym",
... ... @@ -1514,6 +1546,7 @@
1514 1546 "sn"
1515 1547 ],
1516 1548 "compareKey": "compare_ky",
  1549 + "currencyField": "delng_crncy",
1517 1550 "amtField": "sum(delng_amt) as delng_amt",
1518 1551 "compareField": [
1519 1552 "accnut_ym",
... ... @@ -1558,6 +1591,7 @@
1558 1591 "sn"
1559 1592 ],
1560 1593 "compareKey": "compare_ky",
  1594 + "currencyField": "delng_crncy",
1561 1595 "amtField": "sum(delng_amt) as delng_amt",
1562 1596 "compareField": [
1563 1597 "accnut_ym",
... ... @@ -1602,6 +1636,7 @@
1602 1636 "sn"
1603 1637 ],
1604 1638 "compareKey": "compare_ky",
  1639 + "currencyField": "delng_crncy",
1605 1640 "amtField": "sum(delng_amt) as delng_amt",
1606 1641 "compareField": [
1607 1642 "accnut_ym",
... ... @@ -1646,6 +1681,7 @@
1646 1681 "sn"
1647 1682 ],
1648 1683 "compareKey": "compare_ky",
  1684 + "currencyField": "delng_crncy",
1649 1685 "amtField": "sum(delng_amt) as delng_amt",
1650 1686 "compareField": [
1651 1687 "accnut_ym",
... ... @@ -1693,6 +1729,7 @@
1693 1729 "sn"
1694 1730 ],
1695 1731 "compareKey": "compare_ky",
  1732 + "currencyField": "delng_crncy",
1696 1733 "amtField": "sum(delng_amt) as delng_amt",
1697 1734 "compareField": [
1698 1735 "accnut_ym",
... ... @@ -1737,6 +1774,7 @@
1737 1774 "sn"
1738 1775 ],
1739 1776 "compareKey": "compare_ky",
  1777 + "currencyField": "delng_crncy",
1740 1778 "amtField": "sum(delng_amt) as delng_amt",
1741 1779 "compareField": [
1742 1780 "accnut_ym",
... ... @@ -1781,6 +1819,7 @@
1781 1819 "sn"
1782 1820 ],
1783 1821 "compareKey": "compare_ky",
  1822 + "currencyField": "delng_crncy",
1784 1823 "amtField": "sum(delng_amt) as delng_amt",
1785 1824 "compareField": [
1786 1825 "accnut_ym",
... ... @@ -1825,6 +1864,7 @@
1825 1864 "sn"
1826 1865 ],
1827 1866 "compareKey": "compare_ky",
  1867 + "currencyField": "delng_crncy",
1828 1868 "amtField": "sum(delng_amt) as delng_amt",
1829 1869 "compareField": [
1830 1870 "accnut_ym",
... ... @@ -1869,6 +1909,7 @@
1869 1909 "sn"
1870 1910 ],
1871 1911 "compareKey": "compare_ky",
  1912 + "currencyField": "delng_crncy",
1872 1913 "amtField": "sum(delng_amt) as delng_amt",
1873 1914 "compareField": [
1874 1915 "accnut_ym",
... ... @@ -1913,6 +1954,7 @@
1913 1954 "sn"
1914 1955 ],
1915 1956 "compareKey": "compare_ky",
  1957 + "currencyField": "delng_crncy",
1916 1958 "amtField": "sum(delng_amt) as delng_amt",
1917 1959 "compareField": [
1918 1960 "accnut_ym",
... ... @@ -1962,6 +2004,7 @@
1962 2004 "sn"
1963 2005 ],
1964 2006 "compareKey": "compare_ky",
  2007 + "currencyField": "delng_crncy",
1965 2008 "amtField": "sum(delng_amt) as delng_amt",
1966 2009 "compareField": [
1967 2010 "accnut_ym",
... ... @@ -2007,6 +2050,7 @@
2007 2050 "sn"
2008 2051 ],
2009 2052 "compareKey": "compare_ky",
  2053 + "currencyField": "delng_crncy",
2010 2054 "amtField": "sum(delng_amt) as delng_amt",
2011 2055 "compareField": [
2012 2056 "accnut_ym",
... ... @@ -2052,6 +2096,7 @@
2052 2096 "sn"
2053 2097 ],
2054 2098 "compareKey": "compare_ky",
  2099 + "currencyField": "delng_crncy",
2055 2100 "amtField": "sum(delng_amt) as delng_amt",
2056 2101 "compareField": [
2057 2102 "accnut_ym",
... ... @@ -2097,6 +2142,7 @@
2097 2142 "sn"
2098 2143 ],
2099 2144 "compareKey": "compare_ky",
  2145 + "currencyField": "delng_crncy",
2100 2146 "amtField": "sum(delng_amt) as delng_amt",
2101 2147 "compareField": [
2102 2148 "accnut_ym",
... ... @@ -2143,6 +2189,7 @@
2143 2189 "sn"
2144 2190 ],
2145 2191 "compareKey": "compare_ky",
  2192 + "currencyField": "delng_crncy",
2146 2193 "amtField": "sum(delng_amt) as delng_amt",
2147 2194 "compareField": [
2148 2195 "accnut_ym",
... ... @@ -2188,6 +2235,7 @@
2188 2235 "sn"
2189 2236 ],
2190 2237 "compareKey": "compare_ky",
  2238 + "currencyField": "delng_crncy",
2191 2239 "amtField": "sum(delng_amt) as delng_amt",
2192 2240 "compareField": [
2193 2241 "accnut_ym",
... ... @@ -2233,6 +2281,7 @@
2233 2281 "sn"
2234 2282 ],
2235 2283 "compareKey": "compare_ky",
  2284 + "currencyField": "delng_crncy",
2236 2285 "amtField": "sum(delng_amt) as delng_amt",
2237 2286 "compareField": [
2238 2287 "accnut_ym",
... ... @@ -2278,6 +2327,7 @@
2278 2327 "sn"
2279 2328 ],
2280 2329 "compareKey": "compare_ky",
  2330 + "currencyField": "delng_crncy",
2281 2331 "amtField": "sum(delng_amt) as delng_amt",
2282 2332 "compareField": [
2283 2333 "accnut_ym",
... ... @@ -2336,6 +2386,7 @@
2336 2386 "sn"
2337 2387 ],
2338 2388 "compareKey": "compare_ky",
  2389 + "currencyField": "delng_crncy",
2339 2390 "amtField": "sum(delng_amt) as delng_amt",
2340 2391 "compareField": [
2341 2392 "accnut_ym",
... ... @@ -2381,6 +2432,7 @@
2381 2432 "sn"
2382 2433 ],
2383 2434 "compareKey": "compare_ky",
  2435 + "currencyField": "delng_crncy",
2384 2436 "amtField": "sum(delng_amt) as delng_amt",
2385 2437 "compareField": [
2386 2438 "accnut_ym",
... ... @@ -2426,6 +2478,7 @@
2426 2478 "sn"
2427 2479 ],
2428 2480 "compareKey": "compare_ky",
  2481 + "currencyField": "delng_crncy",
2429 2482 "amtField": "sum(delng_amt) as delng_amt",
2430 2483 "compareField": [
2431 2484 "accnut_ym",
... ... @@ -2471,6 +2524,7 @@
2471 2524 "sn"
2472 2525 ],
2473 2526 "compareKey": "compare_ky",
  2527 + "currencyField": "delng_crncy",
2474 2528 "amtField": "sum(delng_amt) as delng_amt",
2475 2529 "compareField": [
2476 2530 "accnut_ym",
... ... @@ -2516,6 +2570,7 @@
2516 2570 "sn"
2517 2571 ],
2518 2572 "compareKey": "compare_ky",
  2573 + "currencyField": "delng_crncy",
2519 2574 "amtField": "sum(delng_amt) as delng_amt",
2520 2575 "compareField": [
2521 2576 "accnut_ym",
... ... @@ -2561,6 +2616,7 @@
2561 2616 "sn"
2562 2617 ],
2563 2618 "compareKey": "compare_ky",
  2619 + "currencyField": "delng_crncy",
2564 2620 "amtField": "sum(delng_amt) as delng_amt",
2565 2621 "compareField": [
2566 2622 "accnut_ym",
... ... @@ -2606,6 +2662,7 @@
2606 2662 "sn"
2607 2663 ],
2608 2664 "compareKey": "compare_ky",
  2665 + "currencyField": "delng_crncy",
2609 2666 "amtField": "sum(delng_amt) as delng_amt",
2610 2667 "compareField": [
2611 2668 "accnut_ym",
... ... @@ -2651,6 +2708,7 @@
2651 2708 "sn"
2652 2709 ],
2653 2710 "compareKey": "compare_ky",
  2711 + "currencyField": "delng_crncy",
2654 2712 "amtField": "sum(delng_amt) as delng_amt",
2655 2713 "compareField": [
2656 2714 "accnut_ym",
... ... @@ -2700,6 +2758,7 @@
2700 2758 "sn"
2701 2759 ],
2702 2760 "compareKey": "compare_ky",
  2761 + "currencyField": "delng_crncy",
2703 2762 "amtField": "sum(delng_amt) as delng_amt",
2704 2763 "compareField": [
2705 2764 "accnut_ym",
... ... @@ -2745,6 +2804,7 @@
2745 2804 "sn"
2746 2805 ],
2747 2806 "compareKey": "compare_ky",
  2807 + "currencyField": "delng_crncy",
2748 2808 "amtField": "sum(delng_amt) as delng_amt",
2749 2809 "compareField": [
2750 2810 "accnut_ym",
... ... @@ -2790,6 +2850,7 @@
2790 2850 "sn"
2791 2851 ],
2792 2852 "compareKey": "compare_ky",
  2853 + "currencyField": "delng_crncy",
2793 2854 "amtField": "sum(delng_amt) as delng_amt",
2794 2855 "compareField": [
2795 2856 "accnut_ym",
... ... @@ -2836,6 +2897,7 @@
2836 2897 "sn"
2837 2898 ],
2838 2899 "compareKey": "compare_ky",
  2900 + "currencyField": "delng_crncy",
2839 2901 "amtField": "sum(delng_amt) as delng_amt",
2840 2902 "compareField": [
2841 2903 "accnut_ym",
... ... @@ -2879,6 +2941,7 @@
2879 2941 "sn"
2880 2942 ],
2881 2943 "compareKey": "compare_ky",
  2944 + "currencyField": "delng_crncy",
2882 2945 "amtField": "sum(delng_amt) as delng_amt",
2883 2946 "compareField": [
2884 2947 "accnut_ym",
... ... @@ -2922,6 +2985,7 @@
2922 2985 "sn"
2923 2986 ],
2924 2987 "compareKey": "compare_ky",
  2988 + "currencyField": "delng_crncy",
2925 2989 "amtField": "sum(delng_amt) as delng_amt",
2926 2990 "compareField": [
2927 2991 "accnut_ym",
... ... @@ -2967,6 +3031,7 @@
2967 3031 "sn"
2968 3032 ],
2969 3033 "compareKey": "compare_ky",
  3034 + "currencyField": "delng_crncy",
2970 3035 "amtField": "sum(delng_amt) as delng_amt",
2971 3036 "compareField": [
2972 3037 "accnut_ym",
... ... @@ -3010,6 +3075,7 @@
3010 3075 "sn"
3011 3076 ],
3012 3077 "compareKey": "compare_ky",
  3078 + "currencyField": "delng_crncy",
3013 3079 "amtField": "sum(delng_amt) as delng_amt",
3014 3080 "compareField": [
3015 3081 "accnut_ym",
... ... @@ -3053,6 +3119,7 @@
3053 3119 "sn"
3054 3120 ],
3055 3121 "compareKey": "compare_ky",
  3122 + "currencyField": "delng_crncy",
3056 3123 "amtField": "sum(delng_amt) as delng_amt",
3057 3124 "compareField": [
3058 3125 "accnut_ym",
... ... @@ -3093,6 +3160,7 @@
3093 3160 "sn"
3094 3161 ],
3095 3162 "compareKey": "compare_ky",
  3163 + "currencyField": "delng_crncy",
3096 3164 "amtField": "sum(delng_amt) as delng_amt",
3097 3165 "compareField": [
3098 3166 "accnut_ym",
... ... @@ -3134,6 +3202,7 @@
3134 3202 "sn"
3135 3203 ],
3136 3204 "compareKey": "compare_ky",
  3205 + "currencyField": "delng_crncy",
3137 3206 "amtField": "sum(delng_amt) as delng_amt",
3138 3207 "compareField": [
3139 3208 "accnut_ym",
... ... @@ -3183,6 +3252,7 @@
3183 3252 "sn"
3184 3253 ],
3185 3254 "compareKey": "compare_ky",
  3255 + "currencyField": "delng_crncy",
3186 3256 "amtField": "sum(delng_amt) as delng_amt",
3187 3257 "compareField": [
3188 3258 "accnut_ym",
... ... @@ -3228,6 +3298,7 @@
3228 3298 "sn"
3229 3299 ],
3230 3300 "compareKey": "compare_ky",
  3301 + "currencyField": "delng_crncy",
3231 3302 "amtField": "sum(delng_amt) as delng_amt",
3232 3303 "compareField": [
3233 3304 "accnut_ym",
... ... @@ -3273,6 +3344,7 @@
3273 3344 "sn"
3274 3345 ],
3275 3346 "compareKey": "compare_ky",
  3347 + "currencyField": "delng_crncy",
3276 3348 "amtField": "sum(delng_amt) as delng_amt",
3277 3349 "compareField": [
3278 3350 "accnut_ym",
... ... @@ -3321,6 +3393,7 @@
3321 3393 "sn"
3322 3394 ],
3323 3395 "compareKey": "compare_ky",
  3396 + "currencyField": "delng_crncy",
3324 3397 "amtField": "sum(delng_amt) as delng_amt",
3325 3398 "compareField": [
3326 3399 "accnut_ym",
... ... @@ -3366,6 +3439,7 @@
3366 3439 "sn"
3367 3440 ],
3368 3441 "compareKey": "compare_ky",
  3442 + "currencyField": "delng_crncy",
3369 3443 "amtField": "sum(delng_amt) as delng_amt",
3370 3444 "compareField": [
3371 3445 "accnut_ym",
... ... @@ -3411,6 +3485,7 @@
3411 3485 "sn"
3412 3486 ],
3413 3487 "compareKey": "compare_ky",
  3488 + "currencyField": "delng_crncy",
3414 3489 "amtField": "sum(delng_amt) as delng_amt",
3415 3490 "compareField": [
3416 3491 "accnut_ym",
... ... @@ -3459,6 +3534,7 @@
3459 3534 "sn"
3460 3535 ],
3461 3536 "compareKey": "compare_ky",
  3537 + "currencyField": "delng_crncy",
3462 3538 "amtField": "sum(delng_amt) as delng_amt",
3463 3539 "compareField": [
3464 3540 "accnut_ym",
... ... @@ -3504,6 +3580,7 @@
3504 3580 "sn"
3505 3581 ],
3506 3582 "compareKey": "compare_ky",
  3583 + "currencyField": "delng_crncy",
3507 3584 "amtField": "sum(delng_amt) as delng_amt",
3508 3585 "compareField": [
3509 3586 "accnut_ym",
... ... @@ -3549,6 +3626,7 @@
3549 3626 "sn"
3550 3627 ],
3551 3628 "compareKey": "compare_ky",
  3629 + "currencyField": "delng_crncy",
3552 3630 "amtField": "sum(delng_amt) as delng_amt",
3553 3631 "compareField": [
3554 3632 "accnut_ym",
... ... @@ -3599,6 +3677,7 @@
3599 3677 "sn"
3600 3678 ],
3601 3679 "compareKey": "compare_ky",
  3680 + "currencyField": "delng_crncy",
3602 3681 "amtField": "sum(delng_amt) as delng_amt",
3603 3682 "compareField": [
3604 3683 "accnut_ym",
... ... @@ -3644,6 +3723,7 @@
3644 3723 "sn"
3645 3724 ],
3646 3725 "compareKey": "compare_ky",
  3726 + "currencyField": "delng_crncy",
3647 3727 "amtField": "sum(delng_amt) as delng_amt",
3648 3728 "compareField": [
3649 3729 "accnut_ym",
... ... @@ -3687,6 +3767,7 @@
3687 3767 "sn"
3688 3768 ],
3689 3769 "compareKey": "compare_ky",
  3770 + "currencyField": "delng_crncy",
3690 3771 "amtField": "sum(delng_amt) as delng_amt",
3691 3772 "compareField": [
3692 3773 "accnut_ym",
... ... @@ -3732,6 +3813,7 @@
3732 3813 "sn"
3733 3814 ],
3734 3815 "compareKey": "compare_ky",
  3816 + "currencyField": "delng_crncy",
3735 3817 "amtField": "sum(delng_amt) as delng_amt",
3736 3818 "compareField": [
3737 3819 "accnut_ym",
... ... @@ -3777,6 +3859,7 @@
3777 3859 "sn"
3778 3860 ],
3779 3861 "compareKey": "compare_ky",
  3862 + "currencyField": "delng_crncy",
3780 3863 "amtField": "sum(delng_amt) as delng_amt",
3781 3864 "compareField": [
3782 3865 "accnut_ym",
... ... @@ -3820,6 +3903,7 @@
3820 3903 "sn"
3821 3904 ],
3822 3905 "compareKey": "compare_ky",
  3906 + "currencyField": "delng_crncy",
3823 3907 "amtField": "sum(delng_amt) as delng_amt",
3824 3908 "compareField": [
3825 3909 "accnut_ym",
... ...
src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml
... ... @@ -24,6 +24,12 @@
24 24 and accnut_ym = #{accnutYm}
25 25 and mtch_ty is null
26 26 and dta_ty in ('11','21','31','33','35','37','41')
  27 + <if test='cpr_code != null and !cpr_code.equals("")'>
  28 + and cpr_code = #{cpr_code}
  29 + </if>
  30 + <if test='partn_cpr != null and !partn_cpr.equals("")'>
  31 + and partn_cpr = #{partn_cpr}
  32 + </if>
27 33 GROUP BY
28 34 sys_se
29 35 , accnut_ym
... ... @@ -43,6 +49,12 @@
43 49 and accnut_ym = #{accnutYm}
44 50 and mtch_ty is null
45 51 and dta_ty in ('12','22','32','34','36','38','42')
  52 + <if test='cpr_code != null and !cpr_code.equals("")'>
  53 + and partn_cpr = #{partn_cpr}
  54 + </if>
  55 + <if test='partn_cpr != null and !partn_cpr.equals("")'>
  56 + and cpr_code = #{cpr_code}
  57 + </if>
46 58 GROUP BY
47 59 sys_se
48 60 , accnut_ym
... ... @@ -77,6 +89,7 @@
77 89 SELECT
78 90 accnut_ym
79 91 , compare_ky
  92 + , ${currencyField}
80 93 , ${amtField}
81 94 FROM
82 95 public.batch_tbcr_inner_delng
... ... @@ -91,7 +104,8 @@
91 104 </foreach>
92 105 group by
93 106 accnut_ym,
94   - compare_ky
  107 + compare_ky,
  108 + ${currencyField}
95 109 </select>
96 110  
97 111 <!-- 매칭결과 업데이트 -->
... ... @@ -525,6 +539,12 @@
525 539 and accnut_ym = #{accnutYm}
526 540 and mtch_ty is null
527 541 and dta_ty in ('11','21','31','33','35','37','41')
  542 + <if test='cpr_code != null and !cpr_code.equals("")'>
  543 + and cpr_code = #{cpr_code}
  544 + </if>
  545 + <if test='partn_cpr != null and !partn_cpr.equals("")'>
  546 + and partn_cpr = #{partn_cpr}
  547 + </if>
528 548 GROUP BY
529 549 sys_se
530 550 , accnut_ym
... ... @@ -546,6 +566,12 @@
546 566 and accnut_ym = #{accnutYm}
547 567 and mtch_ty is null
548 568 and dta_ty in ('12','22','32','34','36','38','42')
  569 + <if test='cpr_code != null and !cpr_code.equals("")'>
  570 + and partn_cpr = #{partn_cpr}
  571 + </if>
  572 + <if test='partn_cpr != null and !partn_cpr.equals("")'>
  573 + and cpr_code = #{cpr_code}
  574 + </if>
549 575 GROUP BY
550 576 sys_se
551 577 , accnut_ym
... ... @@ -624,4 +650,142 @@
624 650 and accnut_ym = #{accnutYm}
625 651 </select>
626 652  
  653 + <!-- 작업리스트 -->
  654 + <select id="getAiSubReadData" parameterType="map" resultType="map">
  655 + SELECT
  656 + sys_se
  657 + , accnut_ym
  658 + , cpr_code
  659 + , partn_cpr
  660 + , mtch_ty
  661 + , mtch_ky
  662 + FROM
  663 + (
  664 + SELECT
  665 + sys_se
  666 + , accnut_ym
  667 + , cpr_code
  668 + , partn_cpr
  669 + , mtch_ty
  670 + , mtch_ky
  671 + , case when count(*) > 0 then 1 else 0 end as cnt
  672 + FROM
  673 + public.batch_tbcr_inner_delng
  674 + WHERE
  675 + sys_se = #{sysSe}
  676 + and accnut_ym = #{accnutYm}
  677 + and mtch_ty = #{mtch_ty}
  678 + and dta_ty in ('11','21','31','33','35','37','41')
  679 + <if test='cpr_code != null and !cpr_code.equals("")'>
  680 + and cpr_code = #{cpr_code}
  681 + </if>
  682 + <if test='partn_cpr != null and !partn_cpr.equals("")'>
  683 + and partn_cpr = #{partn_cpr}
  684 + </if>
  685 + GROUP BY
  686 + sys_se
  687 + , accnut_ym
  688 + , cpr_code
  689 + , partn_cpr
  690 + , mtch_ty
  691 + , mtch_ky
  692 + union all
  693 + SELECT
  694 + sys_se
  695 + , accnut_ym
  696 + , partn_cpr as cpr_code
  697 + , cpr_code as partn_cpr
  698 + , mtch_ty
  699 + , mtch_ky
  700 + , case when count(*) > 0 then 1 else 0 end as cnt
  701 + FROM
  702 + public.batch_tbcr_inner_delng
  703 + WHERE
  704 + sys_se = #{sysSe}
  705 + and accnut_ym = #{accnutYm}
  706 + and mtch_ty = #{mtch_ty}
  707 + and dta_ty in ('12','22','32','34','36','38','42')
  708 + <if test='cpr_code != null and !cpr_code.equals("")'>
  709 + and partn_cpr = #{partn_cpr}
  710 + </if>
  711 + <if test='partn_cpr != null and !partn_cpr.equals("")'>
  712 + and cpr_code = #{cpr_code}
  713 + </if>
  714 + GROUP BY
  715 + sys_se
  716 + , accnut_ym
  717 + , cpr_code
  718 + , partn_cpr
  719 + , mtch_ty
  720 + , mtch_ky
  721 + ) m
  722 + GROUP BY
  723 + sys_se
  724 + , accnut_ym
  725 + , cpr_code
  726 + , partn_cpr
  727 + , mtch_ty
  728 + , mtch_ky
  729 + HAVING sum(cnt) > 1
  730 + </select>
  731 +
  732 +
  733 + <!-- 매칭작업할 데이타 가져오기 -->
  734 + <select id="getAiSubDataOne" parameterType="map" resultType="map">
  735 + SELECT
  736 + sys_se
  737 + , accnut_ym
  738 + , sn
  739 + , '' as compare_ky
  740 + , delng_de
  741 + , delng_amt
  742 + FROM
  743 + public.batch_tbcr_inner_delng
  744 + WHERE
  745 + sys_se = #{sysSe}
  746 + and accnut_ym = #{accnutYm}
  747 + and cpr_code = #{cprCode}
  748 + and partn_cpr = #{partnCpr}
  749 + and mtch_ty = #{mtchTy}
  750 + and mtch_ky = #{mtchKy}
  751 + <if test='conds eq "T".toString()'>
  752 + and dta_ty in ('11','21','41')
  753 + </if>
  754 + <if test='conds eq "B".toString()'>
  755 + and dta_ty in ('31','33','35','37')
  756 + </if>
  757 + and delng_amt != 0
  758 + ORDER BY
  759 + delng_de
  760 + </select>
  761 +
  762 + <!-- 매칭작업할 데이타 가져오기 -->
  763 + <select id="getAiSubDataTwo" parameterType="map" resultType="map">
  764 + SELECT
  765 + sys_se
  766 + , accnut_ym
  767 + , sn
  768 + , '' as compare_ky
  769 + , delng_de
  770 + , delng_amt
  771 + FROM
  772 + public.batch_tbcr_inner_delng
  773 + WHERE
  774 + sys_se = #{sysSe}
  775 + and accnut_ym = #{accnutYm}
  776 + and cpr_code = #{cprCode}
  777 + and partn_cpr = #{partnCpr}
  778 + and mtch_ty = #{mtchTy}
  779 + and mtch_ky = #{mtchKy}
  780 + <if test='conds eq "T".toString()'>
  781 + and dta_ty in ('12','22','42')
  782 + </if>
  783 + <if test='conds eq "B".toString()'>
  784 + and dta_ty in ('32','34','36','38')
  785 + </if>
  786 + and delng_amt != 0
  787 + ORDER BY
  788 + delng_de
  789 + </select>
  790 +
627 791 </mapper>
628 792 \ No newline at end of file
... ...
사용법.md
... ... @@ -20,7 +20,8 @@ http://localhost:8080/api/job/matching
20 20 "jobType": "ALL",
21 21 "sysSe": "AI_ALL",
22 22 "accnutYm": "202311",
23   - "searchCond": "mtch_ty is null"
  23 + "cpr_code": "O01100",
  24 + "partn_cpr": "Z01100"
24 25 }
25 26  
26 27 .\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
32 33 http://localhost:8080/api/job/extramatching
33 34 {
34 35 "sysSe": "LS_ALL",
35   - "accnutYm": "202311"
  36 + "accnutYm": "202311",
  37 + "cpr_code": "O01100",
  38 + "partn_cpr": "Z01100"
36 39 }
37 40  
38 41 .\curl\bin\curl -d '{"sysSe":"AI_ALL", "accnutYm":"202311"}' `
... ... @@ -45,13 +48,29 @@ http://localhost:8080/api/job/aimatching
45 48 {
46 49 "sysSe": "LS_ALL",
47 50 "accnutYm": "202310",
  51 + "cpr_code": "O01100",
  52 + "partn_cpr": "Z01100",
  53 + "error_range": "0"
48 54 }
49 55  
  56 +파이썬에 파라미터 넘기는 내용
  57 +{PythonPrg, PythonAiTarget, ThreadName, SysSe, AccnutYm, CprCode, PartCpr, DelngCrncy, ErrorRange}
50 58  
51 59 .\curl\bin\curl -d '{"sysSe":"AI_ALL", "accnutYm":"202311"}' `
52 60 -H "Content-Type: application/json" `
53 61 -X POST http://localhost:8080/api/job/aimatching
54 62  
  63 +#AI SUB 매칭 (조합)
  64 +http://localhost:8080/api/job/aisubmatching
  65 +{
  66 + "sysSe": "LS_ALL",
  67 + "accnutYm": "202311",
  68 + "mtch_ty": "AI_SLT",
  69 + "cpr_code": "O01100",
  70 + "partn_cpr": "Z01100",
  71 + "error_range": "0"
  72 +}
  73 +
55 74  
56 75 #매칭결과 리턴시
57 76 http://localhost:8080/api/job/return
... ...