Browse Source

工商银行数据导入

master
583641232@qq.com 1 year ago
parent
commit
9dad0b65e3
  1. 8
      cas-admin/src/main/resources/application.yml
  2. 4
      cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/domain/ImportOpeningAccountInfo.java
  3. 2
      cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/domain/ReadDto.java
  4. 1
      cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/domain/entity/ICBCBankStatementEntry.java
  5. 2
      cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/helper/BOCDataAnalysisHelper.java
  6. 58
      cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/helper/ICBCDataAnalysisHelper.java
  7. 2
      cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/service/ImportService.java
  8. 27
      cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/service/impl/ImportServiceImpl.java
  9. 9
      cas-system/src/main/java/com/inscloudtech/datacenter/service/impl/DcImportResultServiceImpl.java

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

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

4
cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/domain/ImportOpeningAccountInfo.java

@ -25,11 +25,11 @@ public class ImportOpeningAccountInfo {
@IndexId(type = IdType.CUSTOMIZE)
private String id;
@ExcelProperty({"客户名称", "客户名","账户户名","姓名"})
@ExcelProperty({"客户名称", "客户名","账户户名","姓名","公司名称"})
@IndexField(fieldType = FieldType.KEYWORD)
private String name;
@ExcelProperty({"客户号"})
@ExcelProperty({"客户号","客户编号"})
private String customerId;
@ExcelProperty({"客户账号","客户主账号", "主账号", "卡号", "账号","卡号或帐号"})

2
cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/domain/ReadDto.java

@ -19,6 +19,8 @@ public class ReadDto {
private String excelFileName;
private int headRowNumber;
private int endRow;
private int sheetNo;
private Class headClass;
private BaseEsMapper esMapper;

1
cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/domain/entity/ICBCBankStatementEntry.java

@ -22,6 +22,7 @@ public class ICBCBankStatementEntry {
@IndexId(type = IdType.CUSTOMIZE)
private String id;
@ExcelProperty("持卡人")
private String cardHolderName;
@ExcelProperty({"账号","帐号"})

2
cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/helper/BOCDataAnalysisHelper.java

@ -76,7 +76,7 @@ public class BOCDataAnalysisHelper {
Cell tradeCell = AsposeUtil.getCell(cells, "交易日期");
Cell contentCell = cells.get(0, 0);
if (tradeCell != null) {
importService.readMultiplePersonAndMultipleHeadBankStatement(excelFileName, tradeCell.getRow() + 1, sheetNum,
importService.readMultiplePersonAndMultipleHeadBankStatement(excelFileName, tradeCell.getRow() + 1,null ,sheetNum,
BOCPrivateBankStatementEntry.class, esBOCPrivateBankStatementMapper, "", nameWithSheetName, null);
} else if (khcell != null || khjg != null) {
Cell headCell = khcell == null?khjg:khcell;

58
cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/helper/ICBCDataAnalysisHelper.java

@ -3,6 +3,8 @@ package com.inscloudtech.bankStatementAnalysis.helper;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
@ -103,7 +105,7 @@ public class ICBCDataAnalysisHelper {
String withSheetName = sourceFile + BankStatementConstants.NAME_WITH_SHEET_NAME + worksheetName;
/**20240418新增模板*/
if (cell420240418 != null) {
readBSFor20240418(cells,cell420240418,absolutePath, sheetNo,withSheetName);
readBSFor20240418(cells,absolutePath, sheetNo,withSheetName);
}else if (khCell != null) {
// 判断是否是开户信息
int rowNumber = khCell.getRow() + 1;
@ -127,20 +129,58 @@ public class ICBCDataAnalysisHelper {
}
}
private void readBSFor20240418(Cells cells,Cell dateCell,String absolutePath, int sheetNo,String sourceFile) {
int startRow = dateCell.getRow();
Cell cardHolderNameCell = cells.get(startRow - 1, 1);
if(null == cardHolderNameCell || StrUtil.isEmpty(cardHolderNameCell.getStringValue())){
throw new ImportDataFailedException("读取持卡人信息异常", sourceFile);
}
private void readBSFor20240418(Cells cells ,String absolutePath, int sheetNo,String sourceFile) {
// int startRow = dateCell.getRow();
// Cell cardHolderNameCell = cells.get(startRow - 1, 1);
// if(null == cardHolderNameCell || StrUtil.isEmpty(cardHolderNameCell.getStringValue())){
// throw new ImportDataFailedException("读取持卡人信息异常", sourceFile);
// }
String cardHolderName = cardHolderNameCell.getStringValue().trim();
List<JSONObject> maps = new LinkedList<>();
int maxRow = cells.getMaxRow();
List<HeadField> headFields = new ArrayList<>();
headFields.add(new HeadField("transactionAmount","发生额"));
headFields.add(new HeadField("balance","余额"));
headFields.add(new HeadField("accountNumber","商密二级,帐号"));
importService.readMultiplePersonAndMultipleHeadBankStatement(absolutePath,startRow + 1,sheetNo,
for(int i = 0; i < maxRow; i++){
Cell dateCell = cells.get(i, 2);
String stringValue = dateCell.getStringValue();
if (StrUtil.isEmpty(stringValue)) {
continue;
}
if(stringValue.equals("入帐日期")){
int startRow = dateCell.getRow();
Cell cardHolderNameCell = cells.get(startRow - 1, 1);
if(null == cardHolderNameCell || StrUtil.isEmpty(cardHolderNameCell.getStringValue())){
throw new ImportDataFailedException("读取持卡人信息异常", sourceFile);
}
String cardHolderName = cardHolderNameCell.getStringValue().trim();
JSONObject jsonObject = new JSONObject();
jsonObject.putOnce("startRow",i);
jsonObject.putOnce("cardHolderName",cardHolderName);
maps.add(jsonObject);
}
}
int size = maps.size();
for(int i = 0; i < size; i++){
JSONObject jsonObject = maps.get(i);
String cardHolderName = jsonObject.getStr("cardHolderName");
int headRowNumber = jsonObject.getInt("startRow") + 1;
int endRow = maxRow -1;
if(i + 1 < size){
JSONObject nextRow = maps.get(i + 1);
endRow = nextRow.getInt("startRow") - 1;
}
if(endRow - headRowNumber <= 1){
continue;
}
importService.readMultiplePersonAndMultipleHeadBankStatement(absolutePath,headRowNumber,endRow,sheetNo,
ICBCBankStatementEntry.class,bankStatementMapper,cardHolderName,sourceFile,headFields);
}
}

2
cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/service/ImportService.java

@ -26,7 +26,7 @@ public interface ImportService{
Map<String,List<OpeningAccountInfo>> getOAIMapByCardNumber(String caseId,String bankName);
<T>void readMultiplePersonAndMultipleHeadBankStatement(String excelFileName, int headRowNumber, int sheetNo, Class<T> clazz, BaseEsMapper<T> baseEsMapper,
<T>void readMultiplePersonAndMultipleHeadBankStatement(String excelFileName, int headRowNumber,Integer endRow, int sheetNo, Class<T> clazz, BaseEsMapper<T> baseEsMapper,
String cardHolderName, String sourceFile, List<HeadField> headFields);

27
cas-system/src/main/java/com/inscloudtech/bankStatementAnalysis/service/impl/ImportServiceImpl.java

@ -10,11 +10,11 @@ import cn.hutool.json.JSONUtil;
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.read.metadata.holder.ReadRowHolder;
import com.alibaba.excel.util.ListUtils;
import com.aspose.cells.Cell;
import com.aspose.cells.Cells;
import com.aspose.cells.Workbook;
@ -40,20 +40,16 @@ import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.dromara.easyes.core.core.BaseEsMapper;
import org.dromara.easyes.core.core.EsWrappers;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.*;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.xmlbeans.XmlException;
import org.springframework.web.multipart.MultipartFile;
@Service
@RequiredArgsConstructor
@ -234,7 +230,7 @@ public class ImportServiceImpl implements ImportService {
* 一个excel里多个人流水重复表头
*/
@Override
public <T> void readMultiplePersonAndMultipleHeadBankStatement(String excelFileName, int headRowNumber, int sheetNo, Class<T> clazz, BaseEsMapper<T> baseEsMapper,
public <T>void readMultiplePersonAndMultipleHeadBankStatement(String excelFileName, int headRowNumber,Integer endRow, int sheetNo, Class<T> clazz, BaseEsMapper<T> baseEsMapper,
String cardHolderName, String sourceFile,
List<HeadField> headFields) {
ReadDto readDto = new ReadDto();
@ -245,7 +241,7 @@ public class ImportServiceImpl implements ImportService {
readDto.setEsMapper(baseEsMapper);
readDto.setCardHolderName(cardHolderName);
readDto.setSourceFile(sourceFile);
readDto.setEndRow(endRow);
//过滤中途的表头行
readDto.setHeadFields(headFields);
readDto.setReadListener(readMultiplePersonAndMultipleHeadBankStatementReadListener(readDto));
@ -309,9 +305,12 @@ public class ImportServiceImpl implements ImportService {
List<T> cacheList = ListUtils.newArrayListWithExpectedSize( Constants.BATCH_SIZE);
BaseEsMapper<T> esMapper = readDto.getEsMapper();
Class<T> headClass = readDto.getHeadClass();
// int startRow = start;
final Integer endRow = readDto.getEndRow();
@Override
public void invoke(T data, AnalysisContext context) {
ReadRowHolder readRowHolder = context.readRowHolder();
Integer rowIndex = readRowHolder.getRowIndex();//从0开始
String str = JSONUtil.toJsonStr(data);
JSONObject obj = JSONUtil.parseObj(str);
@ -332,6 +331,8 @@ public class ImportServiceImpl implements ImportService {
if (skip) {
return;
}
if(StrUtil.isNotEmpty(readDto.getCardHolderName())){
obj.put("cardHolderName", readDto.getCardHolderName());
}
@ -341,6 +342,12 @@ public class ImportServiceImpl implements ImportService {
obj.put("id", IdUtil.objectId());
cacheList.add(obj.toBean(headClass));
if (endRow != null && rowIndex+1 >= endRow) {
esMapper.insertBatch(cacheList);
cacheList.clear();
throw new ExcelAnalysisStopException("读完一段了");
}
if (cacheList.size() >= Constants.BATCH_SIZE) {
esMapper.insertBatch(cacheList);
cacheList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);

9
cas-system/src/main/java/com/inscloudtech/datacenter/service/impl/DcImportResultServiceImpl.java

@ -2,6 +2,7 @@ package com.inscloudtech.datacenter.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.exception.ExcelAnalysisStopException;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -33,6 +34,9 @@ public class DcImportResultServiceImpl extends ServiceImpl<ImportResultMapper, I
@Override
public void record(String caseId, String bankName, Exception exception,String sourceFile) {
ImportResult importResult = this.record(caseId, bankName, exception);
if(null == importResult){
return;
}
if(StrUtil.isEmpty(importResult.getFileName()) && StrUtil.isNotEmpty(sourceFile)){
setFileNameAndSheetName(sourceFile,importResult);
}
@ -43,7 +47,10 @@ public class DcImportResultServiceImpl extends ServiceImpl<ImportResultMapper, I
public ImportResult record(String caseId, String bankName, Exception exception) {
String errorInfo = StrUtil.isEmpty(exception.getMessage())?"":exception.getMessage();
ImportResult importResult = new ImportResult();
if(exception instanceof TemplateNotFindException){
if(exception instanceof ExcelAnalysisStopException){
return null;
}else if(exception instanceof TemplateNotFindException){
TemplateNotFindException templateNotFindException = (TemplateNotFindException) exception;
String filename = templateNotFindException.getFilename();
setFileNameAndSheetName(filename,importResult);

Loading…
Cancel
Save