You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1555 lines
62 KiB
1555 lines
62 KiB
package com.inscloudtech.bankStatementAnalysis.helper;
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.io.FileUtil;
|
|
import cn.hutool.core.util.IdUtil;
|
|
import cn.hutool.core.util.NumberUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import com.alibaba.excel.EasyExcel;
|
|
import com.alibaba.excel.ExcelReader;
|
|
import com.alibaba.excel.context.AnalysisContext;
|
|
import com.alibaba.excel.exception.ExcelAnalysisStopException;
|
|
import com.alibaba.excel.read.listener.ReadListener;
|
|
import com.alibaba.excel.read.metadata.ReadSheet;
|
|
import com.alibaba.excel.util.ListUtils;
|
|
import com.aspose.cells.*;
|
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
|
|
|
import com.inscloudtech.bankStatementAnalysis.helper.HelperUtil;
|
|
import com.inscloudtech.bankStatementAnalysis.mapper.*;
|
|
import com.inscloudtech.common.constant.BankStatementConstants;
|
|
import com.inscloudtech.common.constant.Constants;
|
|
import com.inscloudtech.common.exception.dc.AnalyzeDataFailedException;
|
|
import com.inscloudtech.common.exception.dc.ImportDataFailedException;
|
|
import com.inscloudtech.common.exception.dc.TemplateNotFindException;
|
|
import com.inscloudtech.common.utils.bean.BeanUtils;
|
|
import com.inscloudtech.common.utils.file.FileUtils;
|
|
import com.inscloudtech.datacenter.domain.PlateNumberInfo;
|
|
import com.inscloudtech.datacenter.mapper.es.*;
|
|
import com.inscloudtech.datacenter.service.ImportResultService;
|
|
import com.inscloudtech.bankStatementAnalysis.listener.ReadCCBCurrentAccountInfoListener;
|
|
import com.inscloudtech.datacenter.domain.BankStatement;
|
|
import com.inscloudtech.datacenter.domain.OpeningAccountInfo;
|
|
|
|
import com.inscloudtech.bankStatementAnalysis.domain.entity.*;
|
|
import com.inscloudtech.bankStatementAnalysis.util.AnalyzeFileHelper;
|
|
import com.inscloudtech.bankStatementAnalysis.util.AsposeUtil;
|
|
|
|
import lombok.Data;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import java.io.File;
|
|
import java.math.BigDecimal;
|
|
import java.util.*;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.stream.Collectors;
|
|
import com.alibaba.excel.converters.Converter;
|
|
/**
|
|
* 建设银行数据分析
|
|
*/
|
|
@Slf4j
|
|
@RequiredArgsConstructor
|
|
@Component
|
|
public class CCBDataAnalysisHelper {
|
|
private final ImportResultService importResultService;
|
|
private final EsCCBCurrentAccountInfoMapper accountInfoMapper;
|
|
private final EsCCBRegularAccountInfoMapper esCCBRegularAccountInfoMapper;
|
|
private final EsCCBElectronicCashAccountInfoMapper esCCBElectronicCashAccountInfoMapper;
|
|
private final EsCCBElectronicCashBankStatementMapper esCCBElectronicCashBankStatementMapper;
|
|
private final EsCCBRegularBankStatementMapper esCCBRegularBankStatementMapper;
|
|
private final EsCCBCurrentBankStatementMapper esCCBCurrentBankStatementMapper;
|
|
private final static String BANK_NAME = "建设银行";
|
|
|
|
public void analyzeData(String caseId) {
|
|
analyzeOAI(caseId);
|
|
analyzeBS(caseId);
|
|
}
|
|
|
|
/**
|
|
* 开户信息分析
|
|
*/
|
|
private void analyzeOAI(String caseId) {
|
|
analyzeElectronicCashOpeningAccountInfo(caseId);
|
|
analyzeOtherOpeningAccountInfo(caseId);
|
|
}
|
|
|
|
private void analyzeElectronicCashOpeningAccountInfo(String caseId) {
|
|
|
|
List<OpeningAccountInfo> oaiList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
|
|
List<CCBElectronicCashAccountInfoEntity> entityList = HelperUtil.getEntityList(
|
|
esCCBElectronicCashAccountInfoMapper, CCBElectronicCashAccountInfoEntity.class);
|
|
Set<String> uniqueKeySet = new HashSet();
|
|
for (CCBElectronicCashAccountInfoEntity entity : entityList) {
|
|
|
|
String cardHolderName = entity.getCardHolderName();
|
|
if (StringUtils.isEmpty(cardHolderName)) {
|
|
continue;
|
|
}
|
|
|
|
OpeningAccountInfo oai = new OpeningAccountInfo();
|
|
oai.setName(cardHolderName);
|
|
oai.setBankName(BANK_NAME);
|
|
oai.setAccountNumber(entity.getCardNumber());
|
|
oai.setIdType(entity.getIdType());
|
|
oai.setIdNo(entity.getIdCardNo());
|
|
|
|
String md5Id = HelperUtil.generateMD5Id4OAI(oai,caseId);
|
|
//未导入数据内部去重
|
|
if(HelperUtil.deduplication(md5Id,uniqueKeySet)){
|
|
continue;
|
|
}
|
|
|
|
oai.setId(md5Id);
|
|
oai.setCaseId(caseId);
|
|
oaiList.add(oai);
|
|
if (oaiList.size() >= Constants.BATCH_SIZE) {
|
|
List<OpeningAccountInfo> dest = HelperUtil.getDest(oaiList);
|
|
HelperUtil.batchSaveOAI2Es(dest, caseId);
|
|
|
|
oaiList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
}
|
|
}
|
|
|
|
if (!oaiList.isEmpty()) {
|
|
HelperUtil.batchSaveOAI2Es(oaiList, caseId);
|
|
}
|
|
}
|
|
|
|
private void analyzeOtherOpeningAccountInfo(String caseId) {
|
|
|
|
List<OpeningAccountInfo> oaiList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
|
|
List<CCBCurrentAccountInfoEntity> entityList =
|
|
HelperUtil.getEntityList(accountInfoMapper, CCBCurrentAccountInfoEntity.class);
|
|
Set<String> uniqueKeySet = new HashSet();
|
|
for (CCBCurrentAccountInfoEntity entity : entityList) {
|
|
|
|
String cardHolderName = entity.getCardHolderName();
|
|
if (StringUtils.isEmpty(cardHolderName)) {
|
|
continue;
|
|
}
|
|
|
|
OpeningAccountInfo oai = getOpeningAccountInfo(BANK_NAME, entity);
|
|
|
|
String md5Id = HelperUtil.generateMD5Id4OAI(oai,caseId);
|
|
//未导入数据内部去重
|
|
if(HelperUtil.deduplication(md5Id,uniqueKeySet)){
|
|
continue;
|
|
}
|
|
|
|
oai.setId(md5Id);
|
|
oai.setCaseId(caseId);
|
|
oaiList.add(oai);
|
|
if (oaiList.size() >= Constants.BATCH_SIZE) {
|
|
List<OpeningAccountInfo> dest = HelperUtil.getDest(oaiList);
|
|
HelperUtil.batchSaveOAI2Es(dest, caseId);
|
|
|
|
oaiList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
}
|
|
}
|
|
|
|
if (!oaiList.isEmpty()) {
|
|
HelperUtil.batchSaveOAI2Es(oaiList, caseId);
|
|
}
|
|
}
|
|
|
|
private static OpeningAccountInfo getOpeningAccountInfo(String bankName, CCBCurrentAccountInfoEntity entity) {
|
|
OpeningAccountInfo oai = new OpeningAccountInfo();
|
|
oai.setName(entity.getCardHolderName());
|
|
oai.setBankName(BANK_NAME);
|
|
oai.setAccountNumber(entity.getCardNumber());
|
|
oai.setIdType(entity.getIdType());
|
|
oai.setIdNo(entity.getIdCardNo());
|
|
oai.setOpeningAccountDate(entity.getOpeningAccountDate());
|
|
oai.setClosingDate(entity.getClosingDate());
|
|
oai.setStatus(entity.getStatus());
|
|
oai.setAccountOpeningInstitution(entity.getAccountOpeningInstitution());
|
|
oai.setBalance(
|
|
StrUtil.isEmpty(entity.getBalance()) ? BigDecimal.ZERO : NumberUtil.toBigDecimal(entity.getBalance()));
|
|
oai.setFreezeInfo(entity.getFreezeInfo());
|
|
|
|
return oai;
|
|
}
|
|
|
|
/**
|
|
* 分析交易流水
|
|
*/
|
|
private void analyzeBS(String caseId) {
|
|
analyzeCurrentBS(caseId);
|
|
analyzeRegularBS(caseId);
|
|
analyzeElectronicCashBS(caseId);
|
|
}
|
|
|
|
private void analyzeElectronicCashBS(String caseId) {
|
|
|
|
List<BankStatement> bsList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
|
|
List<CCBElectronicCashBankStatementEntity> entityList = HelperUtil.getEntityList(
|
|
esCCBElectronicCashBankStatementMapper, CCBElectronicCashBankStatementEntity.class);
|
|
// 根据名称去查找基本信息
|
|
List<CCBElectronicCashAccountInfoEntity> infoList = HelperUtil.getEntityList(esCCBElectronicCashAccountInfoMapper,
|
|
CCBElectronicCashAccountInfoEntity.class);
|
|
Map<String, List<CCBElectronicCashAccountInfoEntity>> groupByCardHolderName = infoList.stream().filter(item ->StrUtil.isNotEmpty(item.getCardHolderName())).collect(Collectors.groupingBy(CCBElectronicCashAccountInfoEntity::getCardHolderName));
|
|
|
|
Set<String> uniqueKeySet = new HashSet();
|
|
List<PlateNumberInfo> plateNumberInfoList = new ArrayList<>();
|
|
|
|
for (CCBElectronicCashBankStatementEntity entity : entityList) {
|
|
String sourceFile = entity.getSourceFile();
|
|
try {
|
|
String cardHolderName = entity.getCardHolderName();
|
|
if (StringUtils.isEmpty(cardHolderName)) {
|
|
continue;
|
|
}
|
|
|
|
// 流水
|
|
BankStatement bs = new BankStatement();
|
|
bs.setBankName(BANK_NAME);
|
|
bs.setCardHolderName(cardHolderName);
|
|
|
|
|
|
|
|
if(StrUtil.isNotEmpty(cardHolderName) && StrUtil.isEmpty(bs.getIdCardNo())) {
|
|
if (groupByCardHolderName.containsKey(cardHolderName)) {
|
|
List<CCBElectronicCashAccountInfoEntity> infoEntities = groupByCardHolderName.get(cardHolderName);
|
|
for (CCBElectronicCashAccountInfoEntity infoEntity : infoEntities) {
|
|
if (StrUtil.isNotEmpty(infoEntity.getIdCardNo())) {
|
|
bs.setIdCardNo(infoEntity.getIdCardNo());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bs.setCardNumber(entity.getCardNumber());
|
|
// 1 货币类型
|
|
// 人民币
|
|
bs.setTransCurrencyType(Constants.CURRENCY_TYPE_CHINA);
|
|
|
|
// 2 交易金额 可能是double或者int类型
|
|
String expenditureAmount = entity.getExpenditureAmount();
|
|
if (StrUtil.isNotEmpty(expenditureAmount)) {
|
|
bs.setTransactionAmount(new BigDecimal(expenditureAmount));
|
|
}
|
|
|
|
String incomeAmount = entity.getIncomeAmount();
|
|
if (StrUtil.isNotEmpty(incomeAmount)) {
|
|
BigDecimal value =new BigDecimal(incomeAmount);
|
|
bs.setTransactionAmount(BigDecimal.ZERO.subtract(value));
|
|
}
|
|
|
|
// 3 余额
|
|
bs.setBalance(BigDecimal.valueOf(Double.parseDouble(entity.getBalance())));
|
|
// 4 交易日期
|
|
String transDate = entity.getTransDate();
|
|
if (StrUtil.isNotEmpty(transDate)) {
|
|
String transTime = entity.getTransTime();
|
|
try {
|
|
if (StrUtil.isNotEmpty(transTime)) {
|
|
bs.setTransactionTime(DateUtil.parse(transDate + " " + transTime, "yyyy-MM-dd HH:mm:ss"));
|
|
} else {
|
|
bs.setTransactionTime(DateUtil.parse(transDate, "yyyy-MM-dd"));
|
|
}
|
|
} catch (Exception e) {
|
|
log.error("解析日期出错", e);
|
|
|
|
|
|
throw new AnalyzeDataFailedException(
|
|
StrUtil.format("日期格式为:yyyy-MM-dd HH:mm:ss,日期为:{}", transDate), e, sourceFile);
|
|
}
|
|
}
|
|
|
|
String counterpartyName = entity.getCounterpartyName();
|
|
bs.setCounterpartyName(counterpartyName);
|
|
|
|
bs.setCounterpartyAccount(entity.getCounterpartyAccount());
|
|
bs.setCounterpartyBankName(entity.getCounterpartyBankName());
|
|
bs.setTransRemark(entity.getTansRemark());
|
|
|
|
String md5Id = HelperUtil.generateMD5Id(bs,caseId);
|
|
//未导入数据内部去重
|
|
if(HelperUtil.deduplication(md5Id,uniqueKeySet)){
|
|
continue;
|
|
}
|
|
|
|
bs.setSourceFile(entity.getSourceFile());
|
|
bs.setId(md5Id);
|
|
bs.setCaseId(caseId);
|
|
try {
|
|
BeanUtils.beanAttributeValueTrim(bs);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
bsList.add(bs);
|
|
HelperUtil.extractPlateNumber(bs,plateNumberInfoList);
|
|
|
|
if (bsList.size() >= Constants.BATCH_SIZE) {
|
|
List<BankStatement> dest = HelperUtil.getDest(bsList);
|
|
|
|
HelperUtil.batchInsert2Es(dest, caseId);
|
|
|
|
bsList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
}
|
|
} catch (Exception e) {
|
|
importResultService.record(caseId, BANK_NAME, e,sourceFile);
|
|
}
|
|
}
|
|
uniqueKeySet.clear();
|
|
HelperUtil.batchInsertPlateNumber(plateNumberInfoList);
|
|
// 保存数据库
|
|
if (!bsList.isEmpty()) {
|
|
List<BankStatement> dest = HelperUtil.getDest(bsList);
|
|
HelperUtil.batchInsert2Es(dest, caseId);
|
|
}
|
|
}
|
|
|
|
private void analyzeRegularBS(String caseId) {
|
|
|
|
List<BankStatement> bsList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
|
|
List<CCBRegularBankStatementEntity> entityList =
|
|
HelperUtil.getEntityList(esCCBRegularBankStatementMapper, CCBRegularBankStatementEntity.class);
|
|
// 根据名称去查找基本信息
|
|
List<CCBRegularAccountInfoEntity> infoList = HelperUtil.getEntityList(esCCBRegularAccountInfoMapper, CCBRegularAccountInfoEntity.class);
|
|
Map<String, List<CCBRegularAccountInfoEntity>> groupByCardHolderName = infoList.stream().filter(item ->StrUtil.isNotEmpty(item.getCardHolderName())).collect(Collectors.groupingBy(CCBRegularAccountInfoEntity::getCardHolderName));
|
|
|
|
|
|
Set<String> uniqueKeySet = new HashSet();
|
|
List<PlateNumberInfo> plateNumberInfoList = new ArrayList<>();
|
|
for (CCBRegularBankStatementEntity entity : entityList) {
|
|
String sourceFile = entity.getSourceFile();
|
|
try {
|
|
String cardHolderName = entity.getCardHolderName();
|
|
if (StringUtils.isEmpty(cardHolderName)) {
|
|
continue;
|
|
}
|
|
|
|
// 流水
|
|
BankStatement bs = new BankStatement();
|
|
bs.setBankName(BANK_NAME);
|
|
bs.setCardHolderName(cardHolderName);
|
|
|
|
if(StrUtil.isNotEmpty(cardHolderName) && StrUtil.isEmpty(bs.getIdCardNo())) {
|
|
if (groupByCardHolderName.containsKey(cardHolderName)) {
|
|
List<CCBRegularAccountInfoEntity> infoEntities = groupByCardHolderName.get(cardHolderName);
|
|
for (CCBRegularAccountInfoEntity infoEntity : infoEntities) {
|
|
if (StrUtil.isNotEmpty(infoEntity.getIdCardNo())) {
|
|
bs.setIdCardNo(infoEntity.getIdCardNo());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bs.setCardNumber(entity.getCardNumber());
|
|
// 1 货币类型
|
|
// 人民币
|
|
bs.setTransCurrencyType(Constants.CURRENCY_TYPE_CHINA);
|
|
|
|
// 2 交易金额 可能是double或者int类型
|
|
BigDecimal transactionAmount = entity.getTransactionAmount();
|
|
String loanFlag = entity.getLoanFlag();
|
|
if (StrUtil.isNotEmpty(loanFlag)) {
|
|
if (Objects.equals("贷", loanFlag)) {
|
|
bs.setTransactionAmount(transactionAmount);
|
|
} else {
|
|
bs.setTransactionAmount(BigDecimal.ZERO.subtract(transactionAmount));
|
|
}
|
|
}
|
|
|
|
// 3 余额
|
|
bs.setBalance(entity.getBalance());
|
|
// 4 交易日期
|
|
String transDate = entity.getTransDate();
|
|
if (StrUtil.isNotEmpty(transDate)) {
|
|
String transTime = entity.getTransTime();
|
|
try {
|
|
if (StrUtil.isNotEmpty(transTime)) {
|
|
bs.setTransactionTime(DateUtil.parse(transDate + " " + transTime, "yyyy-MM-dd HH:mm:ss"));
|
|
} else {
|
|
bs.setTransactionTime(DateUtil.parse(transDate, "yyyy-MM-dd"));
|
|
}
|
|
} catch (Exception e) {
|
|
log.error("日期转换异常", e);
|
|
|
|
|
|
throw new AnalyzeDataFailedException(StrUtil.format("日期转换异常,日期:{},时间:{}", transDate), e, sourceFile);
|
|
}
|
|
}
|
|
|
|
String counterpartyName = entity.getCounterpartyName();
|
|
bs.setCounterpartyName(counterpartyName);
|
|
|
|
bs.setTransactionInstitutions(entity.getTransactionInstitutions());
|
|
bs.setCounterpartyAccount(entity.getCounterpartyAccount());
|
|
bs.setTransChannel(entity.getTransChannel());
|
|
bs.setSummary(entity.getSummary());
|
|
|
|
String md5Id = HelperUtil.generateMD5Id(bs,caseId);
|
|
//未导入数据内部去重
|
|
if(HelperUtil.deduplication(md5Id,uniqueKeySet)){
|
|
continue;
|
|
}
|
|
|
|
bs.setSourceFile(entity.getSourceFile());
|
|
bs.setId(md5Id);
|
|
bs.setCaseId(caseId);
|
|
try {
|
|
BeanUtils.beanAttributeValueTrim(bs);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
bsList.add(bs);
|
|
HelperUtil.extractPlateNumber(bs,plateNumberInfoList);
|
|
|
|
|
|
if (bsList.size() >= Constants.BATCH_SIZE) {
|
|
List<BankStatement> dest = HelperUtil.getDest(bsList);
|
|
|
|
HelperUtil.batchInsert2Es(dest, caseId);
|
|
|
|
bsList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
}
|
|
} catch (Exception e) {
|
|
importResultService.record(caseId, BANK_NAME, e,sourceFile);
|
|
}
|
|
}
|
|
uniqueKeySet.clear();
|
|
HelperUtil.batchInsertPlateNumber(plateNumberInfoList);
|
|
// 保存数据库
|
|
if (!bsList.isEmpty()) {
|
|
List<BankStatement> dest = HelperUtil.getDest(bsList);
|
|
HelperUtil.batchInsert2Es(dest, caseId);
|
|
}
|
|
}
|
|
|
|
private void analyzeCurrentBS(String caseId) {
|
|
|
|
List<BankStatement> bsList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
|
|
List<CCBCurrentBankStatementEntity> entityList =
|
|
HelperUtil.getEntityList(esCCBCurrentBankStatementMapper, CCBCurrentBankStatementEntity.class);
|
|
List<CCBCurrentAccountInfoEntity> oaiList =
|
|
HelperUtil.getEntityList(accountInfoMapper, CCBCurrentAccountInfoEntity.class);
|
|
Map<String, List<CCBCurrentAccountInfoEntity>> groupByCardNumber = oaiList.stream().filter(item ->StrUtil.isNotEmpty(item.getCardNumber())).collect(Collectors.groupingBy(CCBCurrentAccountInfoEntity::getCardNumber));
|
|
Map<String, List<CCBCurrentAccountInfoEntity>> groupByCardHolderName = oaiList.stream().filter(item ->StrUtil.isNotEmpty(item.getCardHolderName())).collect(Collectors.groupingBy(CCBCurrentAccountInfoEntity::getCardHolderName));
|
|
|
|
|
|
Map<String, List<CCBCurrentBankStatementEntity>> map = new HashMap<>();
|
|
Set<String> uniqueKeySet = new HashSet();
|
|
List<PlateNumberInfo> plateNumberInfoList = new ArrayList<>();
|
|
for (CCBCurrentBankStatementEntity entity : entityList) {
|
|
String sourceFile = entity.getSourceFile();
|
|
|
|
try {
|
|
boolean isSame = false;
|
|
|
|
String cardHolderName = entity.getCardHolderName();
|
|
String cardNumber = entity.getCardNumber();
|
|
|
|
if (StringUtils.isEmpty(cardHolderName)) {//这个判断直接过滤了企业数据
|
|
if (groupByCardNumber.containsKey(cardNumber)) {
|
|
List<CCBCurrentAccountInfoEntity> tempList = groupByCardNumber.get(cardNumber);
|
|
for (CCBCurrentAccountInfoEntity oai : tempList) {
|
|
if(StrUtil.isNotEmpty(oai.getCardHolderName())){
|
|
cardHolderName = oai.getCardHolderName();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (HelperUtil.isContainsChinese(entity.getTransDate())) {
|
|
continue;
|
|
}
|
|
|
|
// 去重
|
|
String serialNumber = entity.getSerialNumber();
|
|
if (StringUtils.isEmpty(serialNumber)) {
|
|
serialNumber = "-";
|
|
}
|
|
|
|
List<CCBCurrentBankStatementEntity> value = map.getOrDefault(serialNumber, null);
|
|
if (value == null) {
|
|
value = new ArrayList<>();
|
|
value.add(entity);
|
|
|
|
map.put(serialNumber, value);
|
|
} else {
|
|
for (CCBCurrentBankStatementEntity entry : value) {
|
|
if (HelperUtil.isTheSameBankStatement(entity, entry)) {
|
|
isSame = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (isSame) {
|
|
continue;
|
|
} else {
|
|
map.get(serialNumber).add(entity);
|
|
}
|
|
}
|
|
|
|
// 流水
|
|
BankStatement bs = new BankStatement();
|
|
bs.setBankName(BANK_NAME);
|
|
bs.setCardHolderName(cardHolderName);
|
|
// 根据名称去查找基本信息
|
|
|
|
if(StrUtil.isNotEmpty(cardHolderName) && StrUtil.isEmpty(bs.getIdCardNo())) {
|
|
if (groupByCardHolderName.containsKey(cardHolderName)) {
|
|
List<CCBCurrentAccountInfoEntity> infoEntities = groupByCardHolderName.get(cardHolderName);
|
|
for (CCBCurrentAccountInfoEntity infoEntity : infoEntities) {
|
|
if (StrUtil.isNotEmpty(infoEntity.getIdCardNo())) {
|
|
bs.setIdCardNo(infoEntity.getIdCardNo());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
bs.setCardNumber(entity.getCardNumber());
|
|
// 1 货币类型
|
|
// 人民币
|
|
bs.setTransCurrencyType(Constants.CURRENCY_TYPE_CHINA);
|
|
|
|
// 2 交易金额 可能是double或者int类型
|
|
try {
|
|
if(StrUtil.isEmpty(entity.getLoanFlag()) && entity.getExpenditureAmount() != null && entity.getIncomeAmount() != null){
|
|
BigDecimal expenditureAmount = BigDecimal.valueOf(Double.parseDouble(entity.getExpenditureAmount()));
|
|
BigDecimal incomeAmount = BigDecimal.valueOf(Double.parseDouble(entity.getIncomeAmount()));
|
|
bs.setTransactionAmount(incomeAmount.subtract(expenditureAmount));
|
|
}else {
|
|
BigDecimal transactionAmount = new BigDecimal(entity.getTransactionAmount());
|
|
if(entity.getLoanFlag().contains("借")){
|
|
bs.setTransactionAmount(transactionAmount.negate());
|
|
} else {
|
|
bs.setTransactionAmount(transactionAmount);
|
|
}
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
throw new AnalyzeDataFailedException("金额解析异常", e, sourceFile);
|
|
}
|
|
|
|
// 3 余额
|
|
bs.setBalance(BigDecimal.valueOf(Double.parseDouble(entity.getBalance())));
|
|
// 4 交易日期
|
|
String transDate = entity.getTransDate();
|
|
if (StrUtil.isNotEmpty(transDate)) {
|
|
String transTime = entity.getTransTime();
|
|
try {
|
|
if (StrUtil.isNotEmpty(transTime)) {
|
|
bs.setTransactionTime(DateUtil.parse(transDate + " " + transTime, "yyyy-MM-dd HH:mm:ss"));
|
|
} else {
|
|
bs.setTransactionTime(DateUtil.parse(transDate, "yyyy-MM-dd"));
|
|
}
|
|
} catch (Exception e) {
|
|
log.error("日期转换异常", e);
|
|
throw new AnalyzeDataFailedException(StrUtil.format("日期转换异常:{}", transDate), e, sourceFile);
|
|
}
|
|
}else {
|
|
continue;
|
|
}
|
|
|
|
String counterpartyName = entity.getCounterpartyName();
|
|
bs.setCounterpartyName(counterpartyName);
|
|
|
|
bs.setTransactionInstitutions(entity.getTransactionInstitutions());
|
|
bs.setCounterpartyAccount(entity.getCounterpartyAccount());
|
|
bs.setCounterpartyBankName(entity.getCounterpartyBankName());
|
|
bs.setTransChannel(entity.getTransChannel());
|
|
bs.setTransRemark(entity.getTansRemark());
|
|
bs.setSummary(entity.getSummary());
|
|
|
|
String md5Id = HelperUtil.generateMD5Id(bs,caseId);
|
|
//未导入数据内部去重
|
|
if(HelperUtil.deduplication(md5Id,uniqueKeySet)){
|
|
continue;
|
|
}
|
|
|
|
bs.setSourceFile(entity.getSourceFile());
|
|
bs.setId(md5Id);
|
|
bs.setCaseId(caseId);
|
|
try {
|
|
BeanUtils.beanAttributeValueTrim(bs);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
bsList.add(bs);
|
|
HelperUtil.extractPlateNumber(bs,plateNumberInfoList);
|
|
|
|
|
|
if (bsList.size() >= Constants.BATCH_SIZE) {
|
|
List<BankStatement> dest = HelperUtil.getDest(bsList);
|
|
|
|
HelperUtil.batchInsert2Es(dest, caseId);
|
|
|
|
bsList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
}
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
importResultService.record(caseId, BANK_NAME, e,sourceFile);
|
|
}
|
|
}
|
|
uniqueKeySet.clear();
|
|
HelperUtil.batchInsertPlateNumber(plateNumberInfoList);
|
|
// 保存数据库
|
|
if (!bsList.isEmpty()) {
|
|
List<BankStatement> dest = HelperUtil.getDest(bsList);
|
|
HelperUtil.batchInsert2Es(dest, caseId);
|
|
}
|
|
}
|
|
|
|
public void importData(File file,String caseId) throws Exception {
|
|
|
|
List<File> fileList = FileUtil.loopFiles(file);
|
|
|
|
if (fileList.isEmpty()) {
|
|
throw new ImportDataFailedException(
|
|
StrUtil.format("导入失败,未找到Excel文件:{}", file.getName()), file.getAbsolutePath());
|
|
}
|
|
|
|
// 剔除汇总表
|
|
fileList = fileList.stream()
|
|
.filter(f -> {
|
|
if (FileUtil.mainName(f).contains("汇总")) {
|
|
AnalyzeFileHelper.putBSFile(f);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
})
|
|
.collect(Collectors.toList());
|
|
List<File> excelFileList = HelperUtil.getExcelFile(fileList);
|
|
for (File excelFile : excelFileList) {
|
|
try {
|
|
analysisCCBExcel(excelFile,caseId);
|
|
} catch (Exception e) {
|
|
importResultService.record(caseId, BANK_NAME, e);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void analysisCCBExcel(File excelFile,String caseId) throws Exception {
|
|
ZipSecureFile.setMinInflateRatio(0.001);
|
|
String absolutePath = excelFile.getAbsolutePath();
|
|
Workbook wb = new Workbook(absolutePath);
|
|
WorksheetCollection worksheets = wb.getWorksheets();
|
|
String sourceFile = HelperUtil.getSourceFileName(absolutePath,BANK_NAME);
|
|
int count = worksheets.getCount();
|
|
for (int sheetNo = 0; sheetNo < count; sheetNo++) {
|
|
Worksheet ws = worksheets.get(sheetNo);
|
|
String sheetName = ws.getName();
|
|
Cells cells = ws.getCells();
|
|
String ssss = sourceFile + BankStatementConstants.NAME_WITH_SHEET_NAME + sheetName;
|
|
try {
|
|
if (AsposeUtil.getCell(cells, "有无查询结果") != null) {
|
|
continue;
|
|
}else if (AsposeUtil.getCell(cells, "查询无数据") != null) {
|
|
continue;
|
|
} else if (AsposeUtil.getCell(cells, "个人账户信息") != null) {
|
|
// 读取账户信息
|
|
readAccountInfo(excelFile, cells, sheetNo, ssss);
|
|
} else if (AsposeUtil.getCell(cells, "个人活期明细信息") != null) {
|
|
// 读取活期信息
|
|
readCurrentDetailsV2(excelFile, cells, sheetNo, ssss);
|
|
} else if (AsposeUtil.getCell(cells, "个人定期明细信息") != null) {
|
|
// 读取定期明细
|
|
readRegularDetailsV2(excelFile, cells, sheetNo, ssss);
|
|
} else if (AsposeUtil.getCell(cells, "新一代电子现金") != null || AsposeUtil.getCell(cells, "电子现金-新一代") != null) {
|
|
// 读取电子现金明细
|
|
readElectronicCashDetails(excelFile, cells, sheetNo, ssss);
|
|
} else if (AsposeUtil.getCell(cells, "企业账户信息") != null) {
|
|
// 读取企业账户信息
|
|
readCompanyAccountInfo(excelFile, cells, sheetNo, ssss);
|
|
} else if (AsposeUtil.getCell(cells, "企业活期明细信息") != null) {
|
|
// 读取活期明细
|
|
// readCompanyCurrentDetails(excelFile, cells, sheetNo);
|
|
xiangjiaoTemplate(excelFile, sheetNo, ssss);
|
|
} else if (AsposeUtil.getCell(cells, "企业定期明细信息") != null) {
|
|
// 读取定期明细
|
|
readCompanyRegularDetails(excelFile, cells, sheetNo);
|
|
} else if (AsposeUtil.getCell(cells, "笔号") != null) {
|
|
if(AsposeUtil.getCell(cells, "交易日期") != null ){
|
|
readBSTemplate20240417(absolutePath, sheetNo,caseId, ssss);
|
|
}else if(AsposeUtil.getCell(cells, "开户日期") != null ){
|
|
readOAITemplate20240417(absolutePath, sheetNo,caseId, ssss);
|
|
}
|
|
} else if (AsposeUtil.getCell(cells, "错误原因") != null) {
|
|
continue;
|
|
}else {
|
|
throw new TemplateNotFindException(ssss);
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
importResultService.record(caseId, BANK_NAME, e,ssss);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void readOAITemplate20240417(String excelFile, int sheetNo, String caseId, String sourceFile) {
|
|
ExcelReader reader = EasyExcel.read(excelFile).build();
|
|
ReadSheet sheet = EasyExcel.readSheet(sheetNo)
|
|
.headRowNumber(1)
|
|
.head(CCBCurrentAccountInfoEntity.class)
|
|
.registerReadListener(readTemplate20240417OAIReadListener(caseId,sourceFile))
|
|
.build();
|
|
reader.read(sheet);
|
|
}
|
|
|
|
private void readBSTemplate20240417(String excelFile,int sheetNo,String caseId,String sourceFile) {
|
|
ExcelReader reader = EasyExcel.read(excelFile).build();
|
|
ReadSheet sheet = EasyExcel.readSheet(sheetNo)
|
|
.headRowNumber(1)
|
|
.head(CCBCurrentBankStatementEntity.class)
|
|
.registerReadListener(readTemplate20240417ReadListener(caseId,sourceFile))
|
|
.build();
|
|
reader.read(sheet);
|
|
}
|
|
|
|
public ReadListener<CCBCurrentAccountInfoEntity> readTemplate20240417OAIReadListener(String caseId,String sourceFile) {
|
|
return new ReadListener<CCBCurrentAccountInfoEntity>() {
|
|
|
|
List<CCBCurrentAccountInfoEntity> cacheList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
|
|
@Override
|
|
public void invoke(CCBCurrentAccountInfoEntity entity, AnalysisContext context) {
|
|
entity.setId(IdUtil.objectId());
|
|
entity.setSourceFile(sourceFile);
|
|
entity.setCaseId(caseId);
|
|
cacheList.add(entity);
|
|
if (cacheList.size() >= Constants.BATCH_SIZE) {
|
|
save();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void doAfterAllAnalysed(AnalysisContext context) {
|
|
if (!cacheList.isEmpty()) {
|
|
save();
|
|
}
|
|
}
|
|
|
|
private void save() {
|
|
accountInfoMapper.insertBatch(cacheList);
|
|
cacheList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
}
|
|
};
|
|
}
|
|
|
|
public ReadListener<CCBCurrentBankStatementEntity> readTemplate20240417ReadListener(String caseId,String sourceFile) {
|
|
return new ReadListener<CCBCurrentBankStatementEntity>() {
|
|
|
|
List<CCBCurrentBankStatementEntity> cacheList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
|
|
@Override
|
|
public void invoke(CCBCurrentBankStatementEntity entity, AnalysisContext context) {
|
|
entity.setId(IdUtil.objectId());
|
|
entity.setSourceFile(sourceFile);
|
|
entity.setCaseId(caseId);
|
|
cacheList.add(entity);
|
|
if (cacheList.size() >= Constants.BATCH_SIZE) {
|
|
save();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void doAfterAllAnalysed(AnalysisContext context) {
|
|
if (!cacheList.isEmpty()) {
|
|
save();
|
|
}
|
|
}
|
|
|
|
private void save() {
|
|
esCCBCurrentBankStatementMapper.insertBatch(cacheList);
|
|
cacheList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
}
|
|
};
|
|
}
|
|
|
|
private void readCompanyRegularDetails(File excelFile, Cells cells, int sheetNo) {
|
|
Class<CCBRegularBankStatementEntity> headClazz = CCBRegularBankStatementEntity.class;
|
|
String sourceFile = HelperUtil.getSourceFileName(excelFile.getAbsolutePath(),BANK_NAME);
|
|
Cell startCell = null;
|
|
Cell endCell = null;
|
|
int startRow = 0;
|
|
int endRow = 0;
|
|
|
|
for (; ; ) {
|
|
startCell = AsposeUtil.getCell(cells, "交易日期", startRow);
|
|
if (startCell == null) {
|
|
break;
|
|
}
|
|
|
|
startRow = startCell.getRow() + 1; // headRowNum
|
|
endCell = AsposeUtil.getCell(cells, "根据查询条件", startRow);
|
|
if (endCell == null) {
|
|
// 设置最后一行
|
|
endRow = cells.getMaxRow() + 1;
|
|
} else {
|
|
endRow = endCell.getRow() + 1;
|
|
}
|
|
|
|
try (ExcelReader r = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet rs = EasyExcel.readSheet(sheetNo)
|
|
.head(headClazz)
|
|
.headRowNumber(startRow)
|
|
.registerReadListener(HelperUtil.getReadListener(
|
|
esCCBRegularBankStatementMapper, headClazz, startRow, endRow,sourceFile))
|
|
.build();
|
|
r.read(rs);
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
// if (e instanceof ExcelAnalysisStopException) {
|
|
// continue;
|
|
// }
|
|
//
|
|
// log.error("读取企业定期流水信息失败: " + e.getMessage(), e);
|
|
// throw new ImportDataFailedException("读取企业定期流水信息失败: " + e.getMessage(), excelFile.getAbsolutePath());
|
|
}
|
|
|
|
startRow = endRow;
|
|
}
|
|
}
|
|
|
|
// 读取活期明细
|
|
private void readCompanyCurrentDetails(File excelFile, Cells cells, int sheetNo) {
|
|
String sourceFile = HelperUtil.getSourceFileName(excelFile.getAbsolutePath(),BANK_NAME);
|
|
Class<CCBCurrentBankStatementEntity> headClazz = CCBCurrentBankStatementEntity.class;
|
|
|
|
Cell startCell = null;
|
|
Cell endCell = null;
|
|
int startRow = 0;
|
|
int endRow = 0;
|
|
|
|
for (; ; ) {
|
|
startCell = AsposeUtil.getCell(cells, "交易日期", startRow);
|
|
if (startCell == null) {
|
|
break;
|
|
}
|
|
|
|
startRow = startCell.getRow() + 1; // headRowNum
|
|
endCell = AsposeUtil.getCell(cells, "根据查询条件", startRow);
|
|
if (endCell == null) {
|
|
// 设置最后一行
|
|
endRow = cells.getMaxRow() + 1;
|
|
} else {
|
|
endRow = endCell.getRow() + 1;
|
|
}
|
|
|
|
try (ExcelReader r = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet rs = EasyExcel.readSheet(sheetNo)
|
|
.head(headClazz)
|
|
.headRowNumber(startRow)
|
|
.registerReadListener(HelperUtil.getReadListener(
|
|
esCCBCurrentBankStatementMapper, headClazz, startRow, endRow,sourceFile))
|
|
.build();
|
|
r.read(rs);
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
if (e instanceof ExcelAnalysisStopException) {
|
|
continue;
|
|
}
|
|
|
|
log.error("读取企业活期流水信息失败: " + e.getMessage(), e);
|
|
throw new ImportDataFailedException("读取企业活期流水信息失败: " + e.getMessage(), sourceFile);
|
|
}
|
|
|
|
startRow = endRow;
|
|
}
|
|
}
|
|
|
|
private void xiangjiaoTemplate(File excelFile, int sheetNo , String sourceFile) throws Exception {
|
|
List<AnalyzeItem> itemList = getAnalyzeItemList(excelFile.getAbsolutePath(), sheetNo);
|
|
|
|
for (AnalyzeItem item : itemList) {
|
|
|
|
try (ExcelReader r = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet readSheet = EasyExcel.readSheet(sheetNo)
|
|
.headRowNumber(item.headRowNumber)
|
|
.head(CCBCurrentBankStatementEntity.class)
|
|
.registerReadListener(getCurrentDetailListener(item,sourceFile))
|
|
.build();
|
|
r.read(readSheet);
|
|
|
|
} catch (Exception e) {
|
|
if (e instanceof ExcelAnalysisStopException) {
|
|
continue;
|
|
}
|
|
|
|
// 停止继续读取需要抛出异常,这里不必处理
|
|
log.error("读取个人活期明细信息失败: " + e.getMessage(), e);
|
|
throw new AnalyzeDataFailedException("读取个人活期明细信息失败: " + e.getMessage(), e);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void readCompanyAccountInfo(File excelFile, Cells cells, int sheetNo,String sourceFile) {
|
|
|
|
// 关键字:企业活期账户信息
|
|
Cell startCell = null;
|
|
Cell endCell = null;
|
|
int startRow = 0;
|
|
int endRow = 0;
|
|
|
|
Class<CCBCurrentAccountInfoEntity> headClazz = CCBCurrentAccountInfoEntity.class;
|
|
|
|
String[] keys = {"企业活期账户信息", "企业定期账户信息"};
|
|
|
|
for (String key : keys) {
|
|
|
|
startCell = AsposeUtil.getCell(cells, key, startRow);
|
|
if (startCell == null) {
|
|
break;
|
|
}
|
|
|
|
startRow = startCell.getRow();
|
|
|
|
|
|
|
|
Cell cell = AsposeUtil.getCell(cells, "开户日期", startRow );
|
|
if (cell == null) {
|
|
continue;
|
|
}
|
|
startRow = cell.getRow();
|
|
|
|
// if (endCell != null) {
|
|
// startRow = endCell.getRow();
|
|
// }
|
|
endCell = AsposeUtil.getCell(cells, "根据查询条件", startRow);
|
|
if (endCell == null) {
|
|
// 设置最后一行
|
|
endRow = cells.getMaxRow() + 1;
|
|
} else {
|
|
endRow = endCell.getRow() + 1;
|
|
}
|
|
|
|
int headRowNumber = cell.getRow() + 1;
|
|
|
|
try (ExcelReader r = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet rs = EasyExcel.readSheet(sheetNo)
|
|
.head(headClazz)
|
|
.headRowNumber(headRowNumber)
|
|
.registerReadListener(
|
|
HelperUtil.getReadListener(accountInfoMapper, headClazz, startRow, endRow,sourceFile))
|
|
.build();
|
|
r.read(rs);
|
|
} catch (Exception e) {
|
|
|
|
if (e instanceof ExcelAnalysisStopException) {
|
|
continue;
|
|
}
|
|
|
|
log.error("读取企业活期账户信息失败: " + e.getMessage(), e);
|
|
throw new ImportDataFailedException("读取企业活期账户信息失败: " + e.getMessage(), sourceFile);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 读取定期数据,分为个人和企业两种数据
|
|
private void readRegularDetailsV2(File excelFile, Cells cells, int sheetNo,String sourceFile) throws Exception {
|
|
|
|
Cell cell = AsposeUtil.getCell(excelFile, sheetNo, "企业");
|
|
if (cell != null) {
|
|
readRegularDetailsForCompany(excelFile, sheetNo,sourceFile);
|
|
} else {
|
|
readRegularDetailsForPerson(excelFile, sheetNo,sourceFile);
|
|
}
|
|
}
|
|
|
|
private void readRegularDetailsForCompany(File excelFile, int sheetNo,String sourceFile) throws Exception {
|
|
List<AnalyzeItem> itemList = getAnalyzeItemListForCompany(excelFile.getAbsolutePath(), sheetNo);
|
|
|
|
for (AnalyzeItem item : itemList) {
|
|
|
|
try (ExcelReader r = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet readSheet = EasyExcel.readSheet(sheetNo)
|
|
.headRowNumber(item.headRowNumber)
|
|
.head(CCBRegularBankStatementEntity.class)
|
|
.registerReadListener(getRegularDetailListener(item,sourceFile))
|
|
.build();
|
|
r.read(readSheet);
|
|
|
|
} catch (Exception e) {
|
|
// 停止继续读取需要抛出异常,这里不必处理
|
|
if (e instanceof ExcelAnalysisStopException) {
|
|
continue;
|
|
}
|
|
|
|
log.error("读取公司定期流水文件失败: " + e.getMessage(), e);
|
|
throw new ImportDataFailedException("读取公司定期流水文件失败: " + e.getMessage(), excelFile.getAbsolutePath());
|
|
}
|
|
}
|
|
}
|
|
|
|
private void readRegularDetailsForPerson(File excelFile, int sheetNo,String sourceFile) throws Exception {
|
|
List<AnalyzeItem> itemList = getAnalyzeItemList(excelFile.getAbsolutePath(), sheetNo);
|
|
|
|
for (AnalyzeItem item : itemList) {
|
|
|
|
try (ExcelReader r = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet readSheet = EasyExcel.readSheet(sheetNo)
|
|
.headRowNumber(item.headRowNumber)
|
|
.head(CCBRegularBankStatementEntity.class)
|
|
.registerReadListener(getRegularDetailListener(item,sourceFile))
|
|
.build();
|
|
r.read(readSheet);
|
|
|
|
|
|
} catch (Exception e) {
|
|
// 停止继续读取需要抛出异常,这里不必处理
|
|
log.error("读取_accounts_info文件失败", e);
|
|
throw new AnalyzeDataFailedException("读取_accounts_info文件失败", e);
|
|
}
|
|
}
|
|
}
|
|
|
|
private ReadListener<CCBRegularBankStatementEntity> getRegularDetailListener(AnalyzeItem item,String sourceFile) {
|
|
AtomicInteger cnt = new AtomicInteger(item.headRowNumber + 1);
|
|
return new ReadListener<CCBRegularBankStatementEntity>() {
|
|
|
|
private List<CCBRegularBankStatementEntity> docList =
|
|
ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
|
|
@Override
|
|
public void invoke(CCBRegularBankStatementEntity entity, AnalysisContext context) {
|
|
|
|
String id = IdUtil.objectId();
|
|
|
|
|
|
entity.setId(id);
|
|
entity.setCardNumber(item.getCardNumber());
|
|
entity.setCardHolderName(item.getCardHolderName());
|
|
entity.setSourceFile(sourceFile);
|
|
docList.add(entity);
|
|
if (docList.size() >= Constants.BATCH_SIZE) {
|
|
saveToMongo();
|
|
docList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
}
|
|
|
|
if (cnt.incrementAndGet() > item.endRowNumber) {
|
|
saveToMongo();
|
|
throw new ExcelAnalysisStopException("stop running.");
|
|
}
|
|
}
|
|
|
|
private void saveToMongo() {
|
|
if (!docList.isEmpty()) {
|
|
esCCBRegularBankStatementMapper.insertBatch(docList);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void doAfterAllAnalysed(AnalysisContext context) {
|
|
if (!docList.isEmpty()) {
|
|
saveToMongo();
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
// 个人活期明细信息
|
|
private void readCurrentDetailsV2(File excelFile, Cells cells, int sheetNo, String sourceFile) throws Exception {
|
|
List<AnalyzeItem> itemList = getAnalyzeItemList(excelFile.getAbsolutePath(), sheetNo);
|
|
|
|
for (AnalyzeItem item : itemList) {
|
|
|
|
try (ExcelReader r = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet readSheet = EasyExcel.readSheet(sheetNo)
|
|
.headRowNumber(item.headRowNumber)
|
|
.head(CCBCurrentBankStatementEntity.class)
|
|
.registerReadListener(getCurrentDetailListener(item,sourceFile))
|
|
.build();
|
|
r.read(readSheet);
|
|
|
|
} catch (Exception e) {
|
|
if (e instanceof ExcelAnalysisStopException) {
|
|
continue;
|
|
}
|
|
|
|
// 停止继续读取需要抛出异常,这里不必处理
|
|
log.error("读取个人活期明细信息失败: " + e.getMessage(), e);
|
|
throw new AnalyzeDataFailedException("读取个人活期明细信息失败: " + e.getMessage(), e);
|
|
}
|
|
}
|
|
}
|
|
|
|
private ReadListener<CCBCurrentBankStatementEntity> getCurrentDetailListener(AnalyzeItem item,String sourceFile) {
|
|
AtomicInteger cnt = new AtomicInteger(item.headRowNumber + 1);
|
|
return new ReadListener<CCBCurrentBankStatementEntity>() {
|
|
|
|
private List<CCBCurrentBankStatementEntity> docList =
|
|
ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
|
|
@Override
|
|
public void invoke(CCBCurrentBankStatementEntity entity, AnalysisContext context) {
|
|
|
|
if (HelperUtil.isContainsChinese(entity.getId())) {
|
|
return;
|
|
}
|
|
|
|
String id = IdUtil.objectId();
|
|
|
|
|
|
entity.setId(id);
|
|
if(StrUtil.isEmpty(entity.getCardNumber())){
|
|
entity.setCardNumber(item.getCardNumber());
|
|
}
|
|
entity.setSourceFile(sourceFile);
|
|
entity.setCardHolderName(item.getCardHolderName());
|
|
|
|
docList.add(entity);
|
|
if (docList.size() >= Constants.BATCH_SIZE) {
|
|
saveToMongo();
|
|
docList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
}
|
|
|
|
if (cnt.incrementAndGet() > item.endRowNumber) {
|
|
saveToMongo();
|
|
throw new ExcelAnalysisStopException("stop running.");
|
|
}
|
|
}
|
|
|
|
private void saveToMongo() {
|
|
if (!docList.isEmpty()) {
|
|
esCCBCurrentBankStatementMapper.insertBatch(docList);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void doAfterAllAnalysed(AnalysisContext context) {
|
|
if (!docList.isEmpty()) {
|
|
saveToMongo();
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 读取电子现金明细
|
|
*/
|
|
private void readElectronicCashDetails(File excelFile, Cells cells, int sheetNo,String sourceFile) throws Exception {
|
|
List<AnalyzeItem> itemList = getAnalyzeItemList(excelFile.getAbsolutePath(), sheetNo);
|
|
|
|
for (AnalyzeItem item : itemList) {
|
|
|
|
try (ExcelReader r = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet readSheet = EasyExcel.readSheet(sheetNo)
|
|
.headRowNumber(item.headRowNumber)
|
|
.head(CCBElectronicCashBankStatementEntity.class)
|
|
.registerReadListener(getElectronicCashDetailListener(item,sourceFile))
|
|
.build();
|
|
r.read(readSheet);
|
|
|
|
} catch (Exception e) {
|
|
|
|
if (e instanceof ExcelAnalysisStopException) {
|
|
// 停止继续读取需要抛出异常,这里不必处理
|
|
continue;
|
|
} else {
|
|
// 打印日志,抛出异常
|
|
log.error("读取电子现金明细异常", e);
|
|
throw new ImportDataFailedException(e.getMessage(), excelFile.getAbsolutePath());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private ReadListener<CCBElectronicCashBankStatementEntity> getElectronicCashDetailListener(AnalyzeItem item,String sourceFile) {
|
|
AtomicInteger cnt = new AtomicInteger(item.headRowNumber + 1);
|
|
return new ReadListener<CCBElectronicCashBankStatementEntity>() {
|
|
|
|
private List<CCBElectronicCashBankStatementEntity> docList =
|
|
ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
|
|
@Override
|
|
public void invoke(CCBElectronicCashBankStatementEntity entity, AnalysisContext context) {
|
|
String id = IdUtil.objectId();
|
|
|
|
entity.setId(id);
|
|
entity.setCardNumber(item.getCardNumber());
|
|
entity.setCardHolderName(item.getCardHolderName());
|
|
entity.setSourceFile(sourceFile);
|
|
docList.add(entity);
|
|
if (docList.size() >= Constants.BATCH_SIZE) {
|
|
saveToMongo();
|
|
docList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
|
|
}
|
|
|
|
if (cnt.incrementAndGet() > item.endRowNumber) {
|
|
saveToMongo();
|
|
throw new ExcelAnalysisStopException("stop running.");
|
|
}
|
|
}
|
|
|
|
private void saveToMongo() {
|
|
if (!docList.isEmpty()) {
|
|
esCCBElectronicCashBankStatementMapper.insertBatch(docList);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void doAfterAllAnalysed(AnalysisContext context) {
|
|
if (!docList.isEmpty()) {
|
|
saveToMongo();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onException(Exception exception, AnalysisContext context) throws Exception {
|
|
HelperUtil.handleException(exception);
|
|
|
|
ReadListener.super.onException(exception, context);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 读取账户信息
|
|
*/
|
|
private void readAccountInfo(File excelFile, Cells cells, int sheetNo,String sourceFile) throws Exception {
|
|
// 三种账户信息
|
|
int currentStartRow = AsposeUtil.getRowNumber(excelFile, sheetNo, "活期账户信息", 0);
|
|
if (currentStartRow != -1) {
|
|
currentStartRow += 3;
|
|
// 根据查询条件
|
|
int currentEndRow = AsposeUtil.getRowNumber(excelFile, sheetNo, "根据查询条件", currentStartRow);
|
|
if (currentEndRow != -1) {
|
|
// 1、个人活期账户信息 个人活期账户信息
|
|
readCurrentAccountInfo(excelFile, sheetNo, currentStartRow, currentEndRow,sourceFile);
|
|
}
|
|
}
|
|
int regularStartRow = AsposeUtil.getRowNumber(excelFile, sheetNo, "定期账户信息", 0);
|
|
if (regularStartRow != -1) {
|
|
regularStartRow += 3;
|
|
int regularEndRow = AsposeUtil.getRowNumber(excelFile, sheetNo, "根据查询条件", regularStartRow);
|
|
if (regularEndRow != -1) {
|
|
// 2、个人定期账户信息
|
|
readRegularAccountInfo(excelFile, sheetNo, regularStartRow, regularEndRow,sourceFile);
|
|
}
|
|
}
|
|
|
|
int electronicCashStartRow = AsposeUtil.getRowNumber(excelFile, sheetNo, "个人电子现金账户信息", 0);
|
|
if (electronicCashStartRow != -1) {
|
|
electronicCashStartRow += 3;
|
|
int electronicCashEndRow =
|
|
AsposeUtil.getRowNumber(excelFile, sheetNo, "个人电子现金账户信息", electronicCashStartRow);
|
|
if (electronicCashEndRow != -1) {
|
|
// 3、个人电子现金账户信息
|
|
readElectronicCashAccountInfo(excelFile, sheetNo, electronicCashStartRow, electronicCashEndRow,sourceFile);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 读取电子现金账户信息
|
|
*/
|
|
private void readElectronicCashAccountInfo(File excelFile, int sheetNo, int startRow, int endRow,String sourceFile) {
|
|
Class<CCBElectronicCashAccountInfoEntity> clazz = CCBElectronicCashAccountInfoEntity.class;
|
|
try (ExcelReader reader = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet readSheet = EasyExcel.readSheet(sheetNo)
|
|
.headRowNumber(startRow)
|
|
.head(clazz)
|
|
.registerReadListener(HelperUtil.getReadListener(
|
|
esCCBElectronicCashAccountInfoMapper, clazz, startRow, endRow,sourceFile))
|
|
.build();
|
|
reader.read(readSheet);
|
|
} catch (Exception e) {
|
|
|
|
if (e instanceof ExcelAnalysisStopException) {
|
|
return;
|
|
}
|
|
|
|
log.error("read current account info error", e);
|
|
throw new ImportDataFailedException(e.getMessage(), excelFile.getAbsolutePath());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 读取定期账户信息
|
|
*/
|
|
private void readRegularAccountInfo(File excelFile, int sheetNo, int startRow, int endRow,String sourceFile) {
|
|
try (ExcelReader reader = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet readSheet = EasyExcel.readSheet(sheetNo)
|
|
.headRowNumber(startRow)
|
|
.head(CCBRegularAccountInfoEntity.class)
|
|
.registerReadListener(
|
|
HelperUtil.getReadListener(esCCBRegularAccountInfoMapper, CCBRegularAccountInfoEntity.class, startRow, endRow,sourceFile))
|
|
.build();
|
|
reader.read(readSheet);
|
|
} catch (Exception e) {
|
|
if (e instanceof ExcelAnalysisStopException) {
|
|
return;
|
|
}
|
|
|
|
log.error("read current account info error", e);
|
|
throw new ImportDataFailedException(e.getMessage(), excelFile.getAbsolutePath());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 读取活期账户信息
|
|
*/
|
|
private void readCurrentAccountInfo(File excelFile, int sheetNo, int startRow, int endRow,String sourceFile) {
|
|
try (ExcelReader reader = EasyExcel.read(excelFile).build()) {
|
|
ReadSheet readSheet = EasyExcel.readSheet(sheetNo)
|
|
.headRowNumber(startRow)
|
|
.head(CCBCurrentAccountInfoEntity.class)
|
|
.registerReadListener(new ReadCCBCurrentAccountInfoListener(startRow, endRow, accountInfoMapper,sourceFile))
|
|
.build();
|
|
reader.read(readSheet);
|
|
} catch (Exception e) {
|
|
|
|
if (e instanceof ExcelAnalysisStopException) {
|
|
return;
|
|
}
|
|
|
|
log.error("read current account info error", e);
|
|
throw new ImportDataFailedException(e.getMessage(), excelFile.getAbsolutePath());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 通过读取汇总结果,得到相关文件
|
|
*/
|
|
private Set<String> readSummary(File f) {
|
|
|
|
List<CCBSummaryEntry> summaryList = new ArrayList<>();
|
|
|
|
Set<String> fileNameSet = new HashSet<>();
|
|
|
|
try (ExcelReader reader = EasyExcel.read(f).build()) {
|
|
ReadSheet sheet = EasyExcel.readSheet()
|
|
.headRowNumber(2)
|
|
.head(CCBSummaryEntry.class)
|
|
.registerReadListener(new ReadListener<CCBSummaryEntry>() {
|
|
@Override
|
|
public void invoke(CCBSummaryEntry entry, AnalysisContext context) {
|
|
summaryList.add(entry);
|
|
}
|
|
|
|
@Override
|
|
public void doAfterAllAnalysed(AnalysisContext context) {
|
|
// 读取文件结束
|
|
for (CCBSummaryEntry entry : summaryList) {
|
|
String resultFileName = entry.getResultFileName();
|
|
if (!com.inscloudtech.common.utils.StringUtils.isEmpty(resultFileName)) {
|
|
int idx = resultFileName.indexOf("_");
|
|
if (idx != -1) {
|
|
String fileName = resultFileName.substring(idx + 1);
|
|
|
|
Integer resultCount = entry.getResultCount();
|
|
if (resultCount != 0) {
|
|
fileNameSet.add(fileName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
.build();
|
|
// 读文件
|
|
reader.read(sheet);
|
|
}
|
|
|
|
return fileNameSet;
|
|
}
|
|
|
|
// ------------------------------------------------------------------------------------------------------------------
|
|
|
|
private List<AnalyzeItem> getAnalyzeItemListForCompany(String filename, int sheetNo) throws Exception {
|
|
Workbook wb = new Workbook(filename);
|
|
WorksheetCollection worksheets = wb.getWorksheets();
|
|
|
|
Worksheet ws = worksheets.get(sheetNo);
|
|
|
|
String mainKey = "根据查询条件";
|
|
final String key = "客户名称";
|
|
|
|
Cells cells = ws.getCells();
|
|
|
|
Cell roundStartCell = cells.find(mainKey, null);
|
|
|
|
List<AnalyzeItem> itemList = new ArrayList<>();
|
|
|
|
for (; ; ) {
|
|
|
|
if (roundStartCell == null) {
|
|
break;
|
|
}
|
|
|
|
Cell roundEndCell = cells.find(mainKey, roundStartCell);
|
|
|
|
Cell cell = cells.find(key, roundStartCell);
|
|
if (cell == null) {
|
|
break;
|
|
}
|
|
|
|
int roundEndRow;
|
|
if (roundEndCell == null) {
|
|
roundEndRow = cells.getMaxRow();
|
|
} else {
|
|
roundEndRow = roundEndCell.getRow();
|
|
}
|
|
|
|
int row = cell.getRow();
|
|
|
|
while (row < roundEndRow) {
|
|
AnalyzeItem ai = new AnalyzeItem();
|
|
// 说明这一轮有数据
|
|
// 客户名称:徐唯,客户编号:667190000103481964,客户账号:3860740150310007432,一本通账号或卡号:4340613860503177,存款种类:一户通,币别:人民币元,钞汇标志:钞,册号:0,笔号:1
|
|
String complexStr = cell.getStringValue(); // 解析客户名称和客户账号
|
|
if (StrUtil.isNotEmpty(complexStr)) {
|
|
String[] strArr = complexStr.split(",");
|
|
if (strArr.length > 3) {
|
|
String nameStr = strArr[0];
|
|
String[] nameArr = nameStr.split(":");
|
|
if (nameArr.length == 2) {
|
|
ai.setCardHolderName(nameArr[1]);
|
|
} else {
|
|
break;
|
|
}
|
|
|
|
String cardNumberStr = strArr[2];
|
|
String[] cardNumberArr = cardNumberStr.split(":");
|
|
if (cardNumberArr.length == 2) {
|
|
ai.setCardNumber(cardNumberArr[1]);
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
break;
|
|
}
|
|
|
|
int headRowNumber = cell.getRow() + 2;
|
|
|
|
ai.setHeadRowNumber(headRowNumber);
|
|
|
|
cell = cells.find(key, cell);
|
|
if (cell == null) {
|
|
ai.setEndRowNumber(roundEndRow);
|
|
itemList.add(ai);
|
|
|
|
break;
|
|
}
|
|
|
|
row = cell.getRow();
|
|
ai.setEndRowNumber(Math.min(row, roundEndRow));
|
|
|
|
itemList.add(ai);
|
|
}
|
|
|
|
// 这一轮没有数据,开始下一轮
|
|
roundStartCell = roundEndCell;
|
|
}
|
|
return itemList;
|
|
}
|
|
|
|
private List<AnalyzeItem> getAnalyzeItemList(String filename, int sheetNo) throws Exception {
|
|
Workbook wb = new Workbook(filename);
|
|
WorksheetCollection worksheets = wb.getWorksheets();
|
|
|
|
Worksheet ws = worksheets.get(sheetNo);
|
|
|
|
String mainKey = "根据查询条件";
|
|
final String key = "客户名称";
|
|
|
|
Cells cells = ws.getCells();
|
|
|
|
Cell roundStartCell = cells.find(mainKey, null);
|
|
|
|
List<AnalyzeItem> itemList = new ArrayList<>();
|
|
|
|
for (; ; ) {
|
|
|
|
if (roundStartCell == null) {
|
|
break;
|
|
}
|
|
|
|
Cell roundEndCell = cells.find(mainKey, roundStartCell);
|
|
|
|
Cell cell = cells.find(key, roundStartCell);
|
|
if (cell == null) {
|
|
break;
|
|
}
|
|
|
|
int roundEndRow;
|
|
if (roundEndCell == null) {
|
|
roundEndRow = cells.getMaxRow() + 1;
|
|
} else {
|
|
roundEndRow = roundEndCell.getRow();
|
|
}
|
|
|
|
int row = cell.getRow();
|
|
|
|
while (row <= roundEndRow) {
|
|
AnalyzeItem ai = new AnalyzeItem();
|
|
// 说明这一轮有数据
|
|
// 客户名称:徐唯,客户编号:667190000103481964,客户账号:3860740150310007432,一本通账号或卡号:4340613860503177,存款种类:一户通,币别:人民币元,钞汇标志:钞,册号:0,笔号:1
|
|
String complexStr = cell.getStringValue(); // 解析客户名称和客户账号
|
|
if (StrUtil.isNotEmpty(complexStr)) {
|
|
String[] strArr = complexStr.split(",");
|
|
if (strArr.length > 3) {
|
|
String nameStr = strArr[0];
|
|
String[] nameArr = nameStr.split(":");
|
|
if (nameArr.length == 2) {
|
|
ai.setCardHolderName(nameArr[1]);
|
|
} else {
|
|
break;
|
|
}
|
|
|
|
String cardNumberStr = strArr[2];
|
|
String[] cardNumberArr = cardNumberStr.split(":");
|
|
if (cardNumberArr.length == 2) {
|
|
ai.setCardNumber(cardNumberArr[1]);
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
break;
|
|
}
|
|
|
|
int headRowNumber = cell.getRow() + 2;
|
|
|
|
ai.setHeadRowNumber(headRowNumber);
|
|
|
|
cell = cells.find(key, cell);
|
|
if (cell == null) {
|
|
ai.setEndRowNumber(roundEndRow);
|
|
itemList.add(ai);
|
|
|
|
break;
|
|
}
|
|
|
|
row = cell.getRow();
|
|
ai.setEndRowNumber(Math.min(row, roundEndRow));
|
|
|
|
itemList.add(ai);
|
|
}
|
|
|
|
// 这一轮没有数据,开始下一轮
|
|
roundStartCell = roundEndCell;
|
|
}
|
|
return itemList;
|
|
}
|
|
|
|
@Data
|
|
public static class AnalyzeItem {
|
|
private int headRowNumber;
|
|
private int endRowNumber;
|
|
private String cardHolderName;
|
|
private String cardNumber;
|
|
}
|
|
}
|