diff --git a/cas-framework/src/main/java/com/inscloudtech/framework/config/ThreadPoolConfig.java b/cas-framework/src/main/java/com/inscloudtech/framework/config/ThreadPoolConfig.java index 2ef86e2..5f0cae2 100644 --- a/cas-framework/src/main/java/com/inscloudtech/framework/config/ThreadPoolConfig.java +++ b/cas-framework/src/main/java/com/inscloudtech/framework/config/ThreadPoolConfig.java @@ -37,6 +37,7 @@ public class ThreadPoolConfig { executor.setQueueCapacity(threadPoolProperties.getQueueCapacity()); executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds()); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + System.out.println("核心线程数 = " + core); return executor; } diff --git a/cas-system/src/main/java/com/inscloudtech/analysiscenter/service/impl/AnalysisReportServiceImpl.java b/cas-system/src/main/java/com/inscloudtech/analysiscenter/service/impl/AnalysisReportServiceImpl.java index a48bdc8..9e2ae93 100644 --- a/cas-system/src/main/java/com/inscloudtech/analysiscenter/service/impl/AnalysisReportServiceImpl.java +++ b/cas-system/src/main/java/com/inscloudtech/analysiscenter/service/impl/AnalysisReportServiceImpl.java @@ -130,7 +130,7 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { // 不是查询历史报告,则展示最新一条数据 lqw.isNull(AnalysisReport::getHistory); } - + lqw.orderByDesc(AnalysisReport::getCreateTime); return lqw; } @@ -215,6 +215,7 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { if (null != analysisReport) { analysisReport.setHistory("1"); + analysisReport.setUpdateTime(new Date()); baseMapper.updateById(analysisReport); } boolean b = baseMapper.insert(add) > 0; @@ -234,18 +235,27 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { } private File generateWordFileByTemplate(JSONObject esData, AnalysisReportVo vo, String caseId) throws Exception { + List bsList = new ArrayList<>(); + if (esData.containsKey("dc_bank_statement")) { + bsList = esData.getBeanList("dc_bank_statement", BankStatement.class); + } + // 一、基础信息 setValueByPublicFamily(esData, vo); - setPhoneByBankStatement(esData, vo); + if(CollectionUtil.isNotEmpty(bsList)){ + + setPhoneByBankStatement(bsList, vo); + + // 二、账户总体情况 + handleOverallAccountInfo(bsList, vo); - // 二、账户总体情况 - handleOverallAccountInfo(esData, vo); + // 三、涉嫌关联交易 + handleConnectedTransaction(bsList, vo, caseId); - // 三、涉嫌关联交易 - handleConnectedTransaction(esData, vo, caseId); + // 四、其他可疑交易 + handleSuspiciousTransactions(bsList, vo); + } - // 四、其他可疑交易 - handleSuspiciousTransactions(esData, vo); // 五、可疑资金来源及去向 // 六、存取现情况 @@ -530,10 +540,7 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { /** * 可疑交易 */ - private void handleSuspiciousTransactions(JSONObject esData, AnalysisReportVo vo) { - if (!esData.containsKey("dc_bank_statement")) { - return; - } + private void handleSuspiciousTransactions(List bsList, AnalysisReportVo vo) { // 交易笔数 Integer transCount = vo.getTransCount(); @@ -541,7 +548,6 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { // 筛选某人作为交易对手的流水数据,其中有交易时间,以及交易金额,进为转入金额,出为转出金额,获取交易备注 String name = vo.getName(); - String idCard = vo.getIdCard(); List transItems = vo.getTransItems(); // 涉嫌关联交易 Set nameSet = transItems.stream() @@ -552,9 +558,12 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { // 分析theList Map> counterpartyBSMap = new HashMap<>(); // 可疑交易 跟 涉嫌关联交易 不重合 - List bsList = esData.getBeanList("dc_bank_statement", BankStatement.class); + for (BankStatement bs : bsList) { String counterpartyName = bs.getCounterpartyName(); + if (StringUtils.isEmpty(counterpartyName)) { + continue; + } if (StrUtil.isNotEmpty(counterpartyName)) { if(filterByCounterpartyName(counterpartyName,1)){ continue; @@ -568,41 +577,18 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { if (StringUtils.isNotEmpty(counterpartyName) && counterpartyName.equals(vo.getName())) { continue; } - if(StrUtil.isEmpty(idCard)){ - if (Objects.equals(bs.getCardHolderName().trim(), name) - && !nameSet.contains(bs.getCounterpartyName().trim())){ + if (Objects.equals(bs.getCardHolderName().trim(), name) + && !nameSet.contains(bs.getCounterpartyName().trim())){ - if (StringUtils.isEmpty(counterpartyName)) { - continue; - } - List list = counterpartyBSMap.getOrDefault(counterpartyName, null); - if (list == null) { - counterpartyBSMap.put(counterpartyName, new ArrayList<>()); - } - counterpartyBSMap.get(counterpartyName).add(bs); - } - }else { - if (StrUtil.isBlank(bs.getIdCardNo())) { - continue; - } - if (Objects.equals(bs.getCardHolderName().trim(), name) - && Objects.equals(bs.getIdCardNo().trim(), idCard) - && (StrUtil.isNotBlank(bs.getCounterpartyName()) - && !nameSet.contains(bs.getCounterpartyName().trim()))) { - if (StringUtils.isEmpty(counterpartyName)) { - continue; - } - List list = counterpartyBSMap.getOrDefault(counterpartyName, null); - if (list == null) { - counterpartyBSMap.put(counterpartyName, new ArrayList<>()); - } - counterpartyBSMap.get(counterpartyName).add(bs); + + List list = counterpartyBSMap.getOrDefault(counterpartyName, null); + if (list == null) { + counterpartyBSMap.put(counterpartyName, new ArrayList<>()); } + counterpartyBSMap.get(counterpartyName).add(bs); } - } - List rst = new ArrayList<>(); //同时满足两个条件的数据会重复 @@ -1115,24 +1101,29 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { String tpCardHolderName = tpEntry.getKey(); List bsList = tpEntry.getValue(); - Set tpCounterpartyAccountSet = bsList.stream().filter(item -> StrUtil.isNotEmpty(item.getCounterpartyAccount())).map(BankStatement::getCounterpartyAccount).collect(Collectors.toSet()); - Set tpCounterpartyNameSet = bsList.stream().filter(item -> StrUtil.isNotEmpty(item.getCounterpartyName())).map(BankStatement::getCounterpartyName).collect(Collectors.toSet()); - - //括内部人,也不包括自己。比如敖云松的报告,就不包括内部人藏美芳,因为他们是同事、必然是间接关系(有共同的交易对象即公司给他们发工资), - Integer personType = groupByLabel.get(tpCardHolderName); - if(tpCounterpartyNameSet.contains(counterpartyName) && personType != 0){//间接关系 A流水中出现的名字C,在所有的B的流水中也出现了,则是AB间接关系 - AnalysisReportVo.ConnectedTransItem indirectItem = new AnalysisReportVo.ConnectedTransItem(); - indirectItem.setName(counterpartyName); - indirectItem.setRemark("间接关联,该交易对象与本单位客户"+tpCardHolderName+"有疑似经济往来,仅名称相同,需确认"); - if (CollectionUtil.isNotEmpty(mainCounterpartyAccountSet)) { - mainCounterpartyAccountSet.retainAll(tpCounterpartyAccountSet); - if (CollectionUtil.isNotEmpty(mainCounterpartyAccountSet)) {//取交集 - indirectItem.setRemark("间接关联,该交易对象与本单位客户"+tpCardHolderName+"有经济往来"); + try { + Set tpCounterpartyAccountSet = bsList.stream().filter(item -> StrUtil.isNotEmpty(item.getCounterpartyAccount())).map(BankStatement::getCounterpartyAccount).collect(Collectors.toSet()); + Set tpCounterpartyNameSet = bsList.stream().filter(item -> StrUtil.isNotEmpty(item.getCounterpartyName())).map(BankStatement::getCounterpartyName).collect(Collectors.toSet()); + + //括内部人,也不包括自己。比如敖云松的报告,就不包括内部人藏美芳,因为他们是同事、必然是间接关系(有共同的交易对象即公司给他们发工资), + Integer personType = groupByLabel.get(tpCardHolderName); + if(tpCounterpartyNameSet.contains(counterpartyName) && personType != 0){//间接关系 A流水中出现的名字C,在所有的B的流水中也出现了,则是AB间接关系 + AnalysisReportVo.ConnectedTransItem indirectItem = new AnalysisReportVo.ConnectedTransItem(); + indirectItem.setName(counterpartyName); + indirectItem.setRemark("间接关联,该交易对象与本单位客户"+tpCardHolderName+"有疑似经济往来,仅名称相同,需确认"); + if (CollectionUtil.isNotEmpty(mainCounterpartyAccountSet)) { + mainCounterpartyAccountSet.retainAll(tpCounterpartyAccountSet); + if (CollectionUtil.isNotEmpty(mainCounterpartyAccountSet)) {//取交集 + indirectItem.setRemark("间接关联,该交易对象与本单位客户"+tpCardHolderName+"有经济往来"); + } } + connectedTransactionCommonMethod(tpMap,counterpartyName,indirectItem,counterpartyNameMainList); + rst.add(indirectItem); } - connectedTransactionCommonMethod(tpMap,counterpartyName,indirectItem,counterpartyNameMainList); - rst.add(indirectItem); + }catch (Exception e){ + e.printStackTrace(); } + } } } @@ -1399,15 +1390,13 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { /** * 涉嫌关联交易 */ - private void handleConnectedTransaction(JSONObject esData, AnalysisReportVo vo, String caseId) { - if (!esData.containsKey("dc_bank_statement")) { - return; - } + private void handleConnectedTransaction(List mainBsList, AnalysisReportVo vo, String caseId) { + String name = vo.getName(); if(StrUtil.isEmpty(name)){ return; } - List mainBsList = esData.getBeanList("dc_bank_statement", BankStatement.class); + List rst = null; @@ -1521,13 +1510,7 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { /** * 账户总体情况 */ - private void handleOverallAccountInfo(JSONObject esData, AnalysisReportVo vo) { - if (!esData.containsKey("dc_bank_statement")) { - return; - } - - // 分析流水 - List bsList = esData.getBeanList("dc_bank_statement", BankStatement.class); + private void handleOverallAccountInfo(List bsList, AnalysisReportVo vo) { Map> groupByCard = bsList.stream().filter(i ->StrUtil.isNotEmpty(i.getCardNumber())).collect(Collectors.groupingBy(BankStatement::getCardNumber)); @@ -1741,13 +1724,9 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService { } } - private void setPhoneByBankStatement(JSONObject esData, AnalysisReportVo vo) { - if (!esData.containsKey("dc_bank_statement")) { - return; - } - List list = esData.getBeanList("dc_bank_statement", BankStatement.class); + private void setPhoneByBankStatement(List bsList, AnalysisReportVo vo) { Set phoneSet = new HashSet<>(); - for (BankStatement p : list) { + for (BankStatement p : bsList) { if (!(StrUtil.isNotBlank(p.getCardHolderName()) && StrUtil.isNotBlank(p.getIdCardNo()))) { continue; }