Browse Source

分析报告

master
583641232@qq.com 1 year ago
parent
commit
2885884dd7
  1. 3
      cas-admin/src/main/resources/application.yml
  2. 94
      cas-system/src/main/java/com/inscloudtech/analysiscenter/service/impl/AnalysisReportServiceImpl.java
  3. 3
      cas-system/src/main/java/com/inscloudtech/datacenter/domain/PlateNumberInfo.java
  4. 2
      cas-system/src/main/java/com/inscloudtech/datacenter/domain/dto/export/PlateNumberExportAllDto.java
  5. 5
      cas-system/src/main/java/com/inscloudtech/datacenter/service/BankService.java
  6. 2
      cas-system/src/main/java/com/inscloudtech/datacenter/service/IndexInitService.java
  7. 4
      cas-system/src/main/java/com/inscloudtech/datacenter/service/QueryCenterService.java
  8. 104
      cas-system/src/main/java/com/inscloudtech/datacenter/service/impl/BankServiceImpl.java

3
cas-admin/src/main/resources/application.yml

@ -14,8 +14,9 @@ cas:
cacheLazy: false
profile: /app/asb/uploadPath
# authUnit: 云南农垦集团有限责任公司纪委
# authStartDate: 2024-08-08
authUnit: 宏创信科
authStartDate: 2024-08-14
authStartDate: 2024-08-15
authDuration: 90
captcha:

94
cas-system/src/main/java/com/inscloudtech/analysiscenter/service/impl/AnalysisReportServiceImpl.java

@ -39,12 +39,14 @@ import com.inscloudtech.datacenter.domain.BankStatement;
import com.inscloudtech.datacenter.domain.OpeningAccountInfo;
import com.inscloudtech.bankStatementAnalysis.util.AsposeUtil;
import com.sun.deploy.util.SystemUtils;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.http.MediaType;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
@ -828,10 +830,14 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService {
if(StrUtil.isNotEmpty(cardHolderName)){
req.setCardHolderName(cardHolderName);
}
List<BankStatement> bsList = new ArrayList<>();
try {
bsList = bankService.getBSList(req);
long start1 = System.currentTimeMillis();
// bsList = bankService.getBSList(req);
// long start2 = System.currentTimeMillis();
// System.out.println((start2 -start1)/1000 );
bsList = bankService.getBSListByCardHolderName(req);
} catch (Exception e) {
e.printStackTrace();
}
@ -962,7 +968,7 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService {
}
return false;
}
private final ThreadPoolTaskExecutor threadPoolTaskExecutor;
/**
* 内部人员涉嫌关联交易
@ -974,6 +980,7 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService {
//用于-内部人员间接关系A流水中出现的名字C在所有的B的流水中也出现了则是间接关系
Map<String, List<BankStatement>> tpBsCNameAndCounterpartMap = new HashMap<>();
List<AnalysisReportVo.ConnectedTransItem> rst = new ArrayList<>();
//交易对象 以所有名称字段拼接key对象为value
Map<String, TransactionPartner> tpMap = getTransactionPartnerMap(caseId);
@ -1054,10 +1061,10 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService {
if(tpCardHolderNameSet.contains(name)){
tpCardHolderNameSet.remove(name);
}
List<BankStatement> tpBsList = getBankStatementByCardHolderNameSet(tpCardHolderNameSet, caseId);
if (CollectionUtil.isEmpty(tpBsList)) {
return rst;
}
// 根据交易对象流水获取 1交易对象名字为key,交易对象的卡号为value的Map 2交易对象名字为key,交易对象的交易对手的名字为value的Map
getTpBsCNameAndCardMap(tpCardHolderNameSet, caseId,tpBsCNameAndCardMap,tpBsCNameAndCounterpartMap);
GetPersonReq req = new GetPersonReq();
req.setCaseId(caseId);
List<AnalysisPerson> personInfo = bankService.getPersonInfo(req);
@ -1066,38 +1073,8 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService {
.collect(Collectors.toMap(AnalysisPerson::getLabel, AnalysisPerson::getType));
// 根据交易对象流水获取 1交易对象名字为key,交易对象的卡号为value的Map 2交易对象名字为key,交易对象的交易对手的名字为value的Map
for (BankStatement item : tpBsList) {
String cardHolderName = item.getCardHolderName();
if (StrUtil.isEmpty(cardHolderName)) {
continue;
}
String cardNumber = item.getCardNumber();
String counterpartyName = item.getCounterpartyName();
if (StrUtil.isNotEmpty(cardNumber)) {
Set<String> cardSet;
if (tpBsCNameAndCardMap.containsKey(cardHolderName)) {
cardSet = tpBsCNameAndCardMap.get(cardHolderName);
} else {
cardSet = new HashSet<>();
}
cardSet.add(cardNumber);
tpBsCNameAndCardMap.put(cardHolderName, cardSet);
}
if (StrUtil.isNotEmpty(counterpartyName)) {
List<BankStatement> tempBsList;
if (tpBsCNameAndCounterpartMap.containsKey(cardHolderName)) {
tempBsList = tpBsCNameAndCounterpartMap.get(cardHolderName);
} else {
tempBsList = new ArrayList<>();
}
tempBsList.add(item);
tpBsCNameAndCounterpartMap.put(cardHolderName, tempBsList);
}
}
// 根据分析对象的流水以分析对象的交易对手名字为key分组的流水Map
@ -1164,6 +1141,13 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService {
return rst;
}
private void getTpBsCNameAndCardMap(Set<String> cardHolderNameSet, String caseId, Map<String, Set<String>> tpBsCNameAndCardMap, Map<String, List<BankStatement>> tpBsCNameAndCounterpartMap) {
GetBSFieldValueCountReq req = new GetBSFieldValueCountReq();
req.setCaseId(caseId);
req.setCardHolderNameSet(cardHolderNameSet);
bankService.getTpBsCNameAndCardMap(req,tpBsCNameAndCardMap,tpBsCNameAndCounterpartMap);
}
/**
* 外部人员涉嫌关联交易
@ -1214,43 +1198,9 @@ public class AnalysisReportServiceImpl implements IAnalysisReportService {
if(cardHolderNameSet.contains(name)){
cardHolderNameSet.remove(name);
}
List<BankStatement> familyBsList = getBankStatementByCardHolderNameSet(cardHolderNameSet, caseId);
if (CollectionUtil.isEmpty(familyBsList)) {
return rst;
}
// 根据交易对象流水获取 1交易对象名字为key,交易对象的卡号为value的Map 2交易对象名字为key,交易对象的交易对手的名字为value的Map
for (BankStatement item : familyBsList) {
String cardHolderName = item.getCardHolderName();
if (StrUtil.isEmpty(cardHolderName)) {
continue;
}
String cardNumber = item.getCardNumber();
String counterpartyName = item.getCounterpartyName();
if (StrUtil.isNotEmpty(cardNumber)) {
Set<String> cardSet;
if (familyBsCNameAndCardMap.containsKey(cardHolderName)) {
cardSet = familyBsCNameAndCardMap.get(cardHolderName);
} else {
cardSet = new HashSet<>();
}
cardSet.add(cardNumber);
familyBsCNameAndCardMap.put(cardHolderName, cardSet);
}
if (StrUtil.isNotEmpty(counterpartyName)) {
List<BankStatement> tempBsList;
if (familyBsCNameAndCounterpartMap.containsKey(cardHolderName)) {
tempBsList = familyBsCNameAndCounterpartMap.get(cardHolderName);
} else {
tempBsList = new ArrayList<>();
}
tempBsList.add(item);
familyBsCNameAndCounterpartMap.put(cardHolderName, tempBsList);
}
}
getTpBsCNameAndCardMap(cardHolderNameSet, caseId,familyBsCNameAndCardMap,familyBsCNameAndCounterpartMap);
// 根据分析对象的流水以分析对象的交易对手名字为key分组的流水Map

3
cas-system/src/main/java/com/inscloudtech/datacenter/domain/PlateNumberInfo.java

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.*;
import com.inscloudtech.common.annotation.DeduplicationField;
import com.inscloudtech.common.annotation.UpdateValueLog;
import com.inscloudtech.common.core.domain.BaseEntity;
import com.inscloudtech.datacenter.service.IndexInitService;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.easyes.annotation.IndexField;
@ -24,7 +25,7 @@ import org.dromara.easyes.annotation.rely.RefreshPolicy;
@Data
@EqualsAndHashCode(callSuper = true)
@ExcelIgnoreUnannotated
@IndexName(value = "dc_plate_number",refreshPolicy = RefreshPolicy.IMMEDIATE)
@IndexName(value = IndexInitService.PLATE_NUMBER_INDEX,refreshPolicy = RefreshPolicy.IMMEDIATE)
public class PlateNumberInfo extends BaseEntity {
/** id */

2
cas-system/src/main/java/com/inscloudtech/datacenter/domain/dto/export/PlateNumberInfoExportAllDto.java → cas-system/src/main/java/com/inscloudtech/datacenter/domain/dto/export/PlateNumberExportAllDto.java

@ -25,7 +25,7 @@ import org.dromara.easyes.annotation.rely.FieldType;
@Data
@EqualsAndHashCode(callSuper = true)
@ExcelIgnoreUnannotated
public class PlateNumberInfoExportAllDto extends ExportBaseEntity {
public class PlateNumberExportAllDto extends ExportBaseEntity {
@ExcelProperty("车牌号")
private String plateNumber;

5
cas-system/src/main/java/com/inscloudtech/datacenter/service/BankService.java

@ -18,6 +18,7 @@ import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Administrator
@ -84,4 +85,8 @@ public interface BankService {
void save2AnalysisResult(AnalysisDto dto);
void save2AnalysisResultOai(AnalysisDto dto);
List<BankStatement> getBSListByCardHolderName(GetBSFieldValueCountReq req);
void getTpBsCNameAndCardMap(GetBSFieldValueCountReq req, Map<String, Set<String>> tpBsCNameAndCardMap, Map<String, List<BankStatement>> tpBsCNameAndCounterpartMap);
}

2
cas-system/src/main/java/com/inscloudtech/datacenter/service/IndexInitService.java

@ -30,7 +30,7 @@ public class IndexInitService {
public static final String CAR_INFO_MAPPING = "{\"properties\":{\"address\":{\"type\":\"keyword\"},\"analysisResultId\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"bgc\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"carNo\":{\"type\":\"keyword\"},\"carType\":{\"type\":\"keyword\"},\"caseId\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"createBy\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"createTime\":{\"type\":\"date\",\"format\":\"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"},\"idCard\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"name\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"registration\":{\"type\":\"keyword\"},\"remark\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"updateBy\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"updateTime\":{\"type\":\"date\",\"format\":\"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"}}}";
public static final String PLATE_NUMBER_INDEX = "dc_plate_number";
public static final String PLATE_NUMBER_MAPPING = "{\"properties\":{\"plateNumber\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"sourceFile\":{\"type\":\"keyword\"},\"bsHolder\":{\"type\":\"keyword\"},\"hasDeal\":{\"type\":\"byte\"},\"sourceContent\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"holder\":{\"type\":\"keyword\"},\"bankName\":{\"type\":\"keyword\"},\"caseId\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"createBy\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"createTime\":{\"type\":\"date\",\"format\":\"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"},\"remark\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"updateBy\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"updateTime\":{\"type\":\"date\",\"format\":\"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"}}}";
public static final String PLATE_NUMBER_MAPPING = "{\"properties\":{\"carNo\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"sourceFile\":{\"type\":\"keyword\"},\"bsHolder\":{\"type\":\"keyword\"},\"hasDeal\":{\"type\":\"byte\"},\"sourceContent\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"holder\":{\"type\":\"keyword\"},\"bankName\":{\"type\":\"keyword\"},\"caseId\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"createBy\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"createTime\":{\"type\":\"date\",\"format\":\"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"},\"remark\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"updateBy\":{\"type\":\"text\",\"fields\":{\"keyword\":{\"type\":\"keyword\",\"ignore_above\":256}}},\"updateTime\":{\"type\":\"date\",\"format\":\"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"}}}";
public static final String COLLECTION_INFORMATION_INDEX = "dc_collection_information";
public static final String COLLECTION_INFORMATION_MAPPING = "{\"properties\":{\"actionInfo\":{\"type\":\"keyword\"},\"analysisResultId\":{\"type\":\"keyword\"},\"assetsInfo\":{\"type\":\"keyword\"},\"basicInfo\":{\"type\":\"keyword\"},\"caseId\":{\"type\":\"keyword\"},\"createBy\":{\"type\":\"keyword\"},\"createTime\":{\"type\":\"date\",\"format\":\"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"},\"informationSources\":{\"type\":\"keyword\"},\"name\":{\"type\":\"keyword\"},\"relationInfo\":{\"type\":\"keyword\"},\"remark\":{\"type\":\"keyword\"},\"updateBy\":{\"type\":\"keyword\"},\"updateTime\":{\"type\":\"date\",\"format\":\"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"}}}";

4
cas-system/src/main/java/com/inscloudtech/datacenter/service/QueryCenterService.java

@ -1432,8 +1432,8 @@ public class QueryCenterService {
private static final List<Class> SERVICE_LIST_MERGE = Arrays.asList(BankService.class, OpeningAccountInfoService.class,ITransactionPartnerService.class, IPublicFamilyService.class,
IRealEstateService.class, ICarInfoService.class,IOtherAssetsService.class,IOtherInformationService.class, IAnalysisResultService.class,
IAnalysisReportService.class,
PlateNumberInfo.class, CollectionInformation.class);
IAnalysisReportService.class, CollectionInformation.class,
PlateNumberInfo.class);
public void caseMerge(AnalysisDto bo) {

104
cas-system/src/main/java/com/inscloudtech/datacenter/service/impl/BankServiceImpl.java

@ -93,7 +93,9 @@ import java.io.IOException;
import java.math.BigDecimal;
import java.time.Duration;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
@ -271,6 +273,7 @@ public class BankServiceImpl implements BankService {
}
}
@SneakyThrows
@Override
public List<BankStatement> getBSList(GetBSFieldValueCountReq req) {
@ -291,10 +294,13 @@ public class BankServiceImpl implements BankService {
while (true) {
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
threadPoolTaskExecutor.execute(() -> {
JSONObject json = JSONUtil.parseObj(hit.getSourceAsString());
json.put("id", hit.getId());
dataList.add(JSONUtil.toBean(json,BankStatement.class));
dataList.add(JSONUtil.toBean(json, BankStatement.class));
});
}
// 继续滚动获取下一页数据
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(TimeValue.timeValueMinutes(1L));
@ -1403,7 +1409,6 @@ public class BankServiceImpl implements BankService {
int pageNum = req.getPageNum();
int pageSize = req.getPageSize();
SAPageInfo<BankStatement> pageInfo;
if (pageNum == 1) {
pageInfo = esBsMapper.searchAfterPage(wrapper, null, pageSize);
@ -1711,7 +1716,7 @@ public class BankServiceImpl implements BankService {
public void analysisFile(File file, String bankNo, String caseId, String bankName) {
try {
String completeKey = Constants.COMPLETE_BANK_COUNT +caseId;
long start = System.currentTimeMillis();
// 导入数据
switch (bankNo) {
case Constants.BANK_IMPORT_MODEL_BANK_FDB: // 富滇银行
@ -2187,6 +2192,99 @@ public class BankServiceImpl implements BankService {
}
}
@Override
public List<BankStatement> getBSListByCardHolderName(GetBSFieldValueCountReq req) {
LambdaEsQueryWrapper<BankStatement> queryWrapper = EsWrappers.lambdaQuery(BankStatement.class);
queryWrapper.eq(BankStatement::getCaseId, req.getCaseId());
queryWrapper.eq(StrUtil.isNotEmpty(req.getCardHolderName()),BankStatement::getCardHolderName, req.getCardHolderName());
queryWrapper.in(CollectionUtil.isNotEmpty(req.getCardHolderNameSet()),BankStatement::getCardHolderName, req.getCardHolderNameSet());
return esBsMapper.selectList(queryWrapper);
}
@SneakyThrows
@Override
public void getTpBsCNameAndCardMap(GetBSFieldValueCountReq req, Map<String,
Set<String>> tpBsCNameAndCardMap, Map<String, List<BankStatement>> tpBsCNameAndCounterpartMap) {
SearchSourceBuilder searchSourceBuilder = buildSearchSourceBuilder(req);
SearchRequest searchRequest = new SearchRequest("dc_bank_statement");
Scroll scroll = new Scroll(TimeValue.timeValueMinutes(3)); // 设置一次读取的最大连接时长
searchSourceBuilder.size(QueryCenterService.MAX_PAGE_SIZE);
searchRequest.source(searchSourceBuilder);
searchRequest.scroll(scroll);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits responseHits = searchResponse.getHits();
String scrollId = searchResponse.getScrollId();
List<BankStatement> dataList = new ArrayList<>();
long total = responseHits.getTotalHits().value;
if (total > QueryCenterService.MAX_PAGE_SIZE) {
while (true) {
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
setTpBsCNameAndCounterpartMap(hit,tpBsCNameAndCardMap,tpBsCNameAndCounterpartMap);
}
// 继续滚动获取下一页数据
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(TimeValue.timeValueMinutes(1L));
searchResponse = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);
scrollId = searchResponse.getScrollId();
// 判断是否还有数据
if (searchResponse.getHits().getHits().length == 0) {
break;
}
}
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);
restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
} else {
SearchHit[] hits = responseHits.getHits();
for (SearchHit hit : hits) {
setTpBsCNameAndCounterpartMap(hit,tpBsCNameAndCardMap,tpBsCNameAndCounterpartMap);
}
}
}
void setTpBsCNameAndCounterpartMap(SearchHit hit, Map<String,
Set<String>> tpBsCNameAndCardMap, Map<String, List<BankStatement>> tpBsCNameAndCounterpartMap){
threadPoolTaskExecutor.execute(() -> {
JSONObject json = JSONUtil.parseObj(hit.getSourceAsString());
json.put("id", hit.getId());
BankStatement item = JSONUtil.toBean(json, BankStatement.class);
String cardHolderName = item.getCardHolderName();
if (StrUtil.isEmpty(cardHolderName)) {
return;
}
String cardNumber = item.getCardNumber();
String counterpartyName = item.getCounterpartyName();
if (StrUtil.isNotEmpty(cardNumber)) {
Set<String> cardSet;
if (tpBsCNameAndCardMap.containsKey(cardHolderName)) {
cardSet = tpBsCNameAndCardMap.get(cardHolderName);
} else {
cardSet = new HashSet<>();
}
cardSet.add(cardNumber);
tpBsCNameAndCardMap.put(cardHolderName, cardSet);
}
if (StrUtil.isNotEmpty(counterpartyName)) {
List<BankStatement> tempBsList;
if (tpBsCNameAndCounterpartMap.containsKey(cardHolderName)) {
tempBsList = tpBsCNameAndCounterpartMap.get(cardHolderName);
} else {
tempBsList = new ArrayList<>();
}
tempBsList.add(item);
tpBsCNameAndCounterpartMap.put(cardHolderName, tempBsList);
}
});
}
/**
* 复制出新的caseId为null的数重新计算MD5
* @param dto

Loading…
Cancel
Save