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.

564 lines
25 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. package com.inscloudtech.bankStatementAnalysis.helper;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.io.FileUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.json.JSON;
  6. import cn.hutool.json.JSONObject;
  7. import com.alibaba.excel.EasyExcel;
  8. import com.alibaba.excel.ExcelReader;
  9. import com.alibaba.excel.read.metadata.ReadSheet;
  10. import com.alibaba.excel.util.ListUtils;
  11. import com.alibaba.excel.util.StringUtils;
  12. import com.aspose.cells.Cell;
  13. import com.aspose.cells.Cells;
  14. import com.aspose.cells.Workbook;
  15. import com.aspose.cells.Worksheet;
  16. import com.inscloudtech.bankStatementAnalysis.domain.HeadField;
  17. import com.inscloudtech.bankStatementAnalysis.helper.HelperUtil;
  18. import com.inscloudtech.bankStatementAnalysis.service.ImportService;
  19. import com.inscloudtech.common.constant.BankStatementConstants;
  20. import com.inscloudtech.common.constant.Constants;
  21. import com.inscloudtech.common.exception.dc.AnalyzeDataFailedException;
  22. import com.inscloudtech.common.exception.dc.ImportDataFailedException;
  23. import com.inscloudtech.common.exception.dc.TemplateNotFindException;
  24. import com.inscloudtech.common.utils.bean.BeanUtils;
  25. import com.inscloudtech.common.utils.file.FileUtils;
  26. import com.inscloudtech.datacenter.domain.PlateNumberInfo;
  27. import com.inscloudtech.bankStatementAnalysis.mapper.EsICBCBankStatementMapper;
  28. import com.inscloudtech.bankStatementAnalysis.mapper.EsICBCCreditCardBankStatementMapper;
  29. import com.inscloudtech.datacenter.service.ImportResultService;
  30. import com.inscloudtech.datacenter.domain.BankStatement;
  31. import com.inscloudtech.datacenter.domain.OpeningAccountInfo;
  32. import com.inscloudtech.bankStatementAnalysis.domain.entity.ICBCBankStatementEntry;
  33. import com.inscloudtech.bankStatementAnalysis.domain.entity.ICBCCreditCardBankStatementEntry;
  34. import com.inscloudtech.bankStatementAnalysis.util.AsposeUtil;
  35. import lombok.RequiredArgsConstructor;
  36. import lombok.extern.slf4j.Slf4j;
  37. import org.springframework.stereotype.Component;
  38. import java.io.File;
  39. import java.math.BigDecimal;
  40. import java.util.*;
  41. /**
  42. * 工商银行数据分析
  43. */
  44. @Slf4j
  45. @RequiredArgsConstructor
  46. @Component
  47. public class ICBCDataAnalysisHelper {
  48. private final ImportService importService;
  49. private final ImportResultService importResultService;
  50. private final EsICBCBankStatementMapper bankStatementMapper;
  51. private final EsICBCCreditCardBankStatementMapper creditCardBankStatementMapper;
  52. private final static String BANK_NAME = "工商银行";
  53. public void importData(File dir,String caseId) throws Exception {
  54. List<File> fileList = FileUtil.loopFiles(dir);
  55. if (fileList == null) {
  56. return;
  57. }
  58. List<File> excelFileList = HelperUtil.getExcelFile(fileList);
  59. // List<File> pdfFileList = fileList.stream()
  60. // .filter(file -> FileUtil.extName(file).equalsIgnoreCase("pdf"))
  61. // .collect(Collectors.toList());
  62. // Map<String, List<File>> groupByPath = excelFileList.stream().collect(Collectors.groupingBy(File::getAbsolutePath));
  63. // for (File file : pdfFileList) {
  64. // String excelFilename = AsposeUtil.pdf2ExcelV6(file.getAbsolutePath());
  65. // if(groupByPath.containsKey(excelFilename)){
  66. // continue;
  67. // }
  68. // excelFileList.add(new File(excelFilename));
  69. // }
  70. for (File f : excelFileList) {
  71. try {
  72. String absolutePath = f.getAbsolutePath();
  73. Workbook wb = new Workbook(absolutePath);
  74. int count = wb.getWorksheets().getCount();
  75. String sourceFile = HelperUtil.getSourceFileName(absolutePath, BANK_NAME);
  76. for (int sheetNo = 0; sheetNo < count; sheetNo++) {
  77. try {
  78. Worksheet worksheet = wb.getWorksheets().get(sheetNo);
  79. Cells cells = worksheet.getCells();
  80. Cell contentCell = cells.get(0, 0);
  81. if (contentCell.getValue() == null) {//空白excel
  82. continue;
  83. }
  84. String worksheetName = worksheet.getName();
  85. Cell cell420240418 = AsposeUtil.getCell(cells, "入帐日期");
  86. Cell khCell = AsposeUtil.getCell(cells, "开户日期");
  87. Cell tradeCell = AsposeUtil.getCell(cells, "交易时间戳");
  88. Cell khhzh = AsposeUtil.getCell(cells, "卡号或帐号");
  89. String withSheetName = sourceFile + BankStatementConstants.NAME_WITH_SHEET_NAME + worksheetName;
  90. /**20240418新增模板*/
  91. if (cell420240418 != null) {
  92. readBSFor20240418(cells,absolutePath, sheetNo,withSheetName);
  93. }else if (khCell != null) {
  94. // 判断是否是开户信息
  95. int rowNumber = khCell.getRow() + 1;
  96. importService.readOAIData(absolutePath, rowNumber,
  97. sheetNo, caseId, BANK_NAME, withSheetName);
  98. } else if (tradeCell != null) { // 流水信息
  99. readBS(absolutePath, sheetNo,withSheetName);
  100. } else if (khhzh != null) { // 开户
  101. importService.readOAIData(absolutePath, khhzh.getRow() + 1,
  102. sheetNo, caseId, BANK_NAME, withSheetName);
  103. } else {
  104. throw new TemplateNotFindException(withSheetName);
  105. }
  106. } catch (Exception e) {
  107. importResultService.record(caseId, BANK_NAME, e);
  108. }
  109. }
  110. } catch (Exception e) {
  111. importResultService.record(caseId, BANK_NAME, e);
  112. }
  113. }
  114. }
  115. private void readBSFor20240418(Cells cells ,String absolutePath, int sheetNo,String sourceFile) {
  116. // int startRow = dateCell.getRow();
  117. // Cell cardHolderNameCell = cells.get(startRow - 1, 1);
  118. // if(null == cardHolderNameCell || StrUtil.isEmpty(cardHolderNameCell.getStringValue())){
  119. // throw new ImportDataFailedException("读取持卡人信息异常", sourceFile);
  120. // }
  121. List<JSONObject> maps = new LinkedList<>();
  122. int maxRow = cells.getMaxRow();
  123. List<HeadField> headFields = new ArrayList<>();
  124. headFields.add(new HeadField("transactionAmount","发生额"));
  125. headFields.add(new HeadField("balance","余额"));
  126. headFields.add(new HeadField("accountNumber","商密二级,帐号"));
  127. for(int i = 0; i < maxRow; i++){
  128. Cell dateCell = cells.get(i, 2);
  129. String stringValue = dateCell.getStringValue();
  130. if (StrUtil.isEmpty(stringValue)) {
  131. continue;
  132. }
  133. if(stringValue.equals("入帐日期")){
  134. int startRow = dateCell.getRow();
  135. Cell cardHolderNameCell = cells.get(startRow - 1, 1);
  136. if(null == cardHolderNameCell || StrUtil.isEmpty(cardHolderNameCell.getStringValue())){
  137. throw new ImportDataFailedException("读取持卡人信息异常", sourceFile);
  138. }
  139. String cardHolderName = cardHolderNameCell.getStringValue().trim();
  140. JSONObject jsonObject = new JSONObject();
  141. jsonObject.putOnce("startRow",i);
  142. jsonObject.putOnce("cardHolderName",cardHolderName);
  143. maps.add(jsonObject);
  144. }
  145. }
  146. int size = maps.size();
  147. for(int i = 0; i < size; i++){
  148. JSONObject jsonObject = maps.get(i);
  149. String cardHolderName = jsonObject.getStr("cardHolderName");
  150. int headRowNumber = jsonObject.getInt("startRow") + 1;
  151. int endRow = maxRow -1;
  152. if(i + 1 < size){
  153. JSONObject nextRow = maps.get(i + 1);
  154. endRow = nextRow.getInt("startRow") - 1;
  155. }
  156. if(endRow - headRowNumber <= 1){
  157. continue;
  158. }
  159. importService.readMultiplePersonAndMultipleHeadBankStatement(absolutePath,headRowNumber,endRow,sheetNo,
  160. ICBCBankStatementEntry.class,bankStatementMapper,cardHolderName,sourceFile,headFields);
  161. }
  162. }
  163. public void analyzeIData(String caseId) {
  164. // 储蓄卡流水
  165. analyzeSavingsCardBS(caseId);
  166. // 信用卡流水
  167. analyzeCreditCardBS(caseId);
  168. }
  169. private void analyzeCreditCardBS(String caseId) {
  170. List<BankStatement> bsList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
  171. List<ICBCCreditCardBankStatementEntry> entityList =
  172. HelperUtil.getEntityList(creditCardBankStatementMapper, ICBCCreditCardBankStatementEntry.class);
  173. List<OpeningAccountInfo> oaiData = importService.getOAIData(caseId, BANK_NAME);
  174. Map<String, OpeningAccountInfo> nameAccMap = new HashMap<>();
  175. Map<String, OpeningAccountInfo> cardNumberAccMap = new HashMap<>();
  176. Map<String, OpeningAccountInfo> account2CardNumberMap = new HashMap<>();
  177. for (OpeningAccountInfo entry : oaiData) {
  178. if (StrUtil.isNotEmpty(entry.getName())) {
  179. nameAccMap.put(entry.getName(), entry);
  180. }
  181. if (StrUtil.isNotEmpty(entry.getAccountNumber())) {
  182. cardNumberAccMap.put(entry.getAccountNumber(), entry);
  183. }
  184. if (StrUtil.isNotEmpty(entry.getAccount2CardNumber())) {
  185. account2CardNumberMap.put(entry.getAccount2CardNumber(), entry);
  186. }
  187. }
  188. //去重
  189. Set<String> uniqueKeySet = new HashSet();
  190. List<PlateNumberInfo> plateNumberInfoList = new ArrayList<>();
  191. for (ICBCCreditCardBankStatementEntry entry : entityList) {
  192. String sourceFile = entry.getSourceFile();
  193. try {
  194. BankStatement bs = new BankStatement();
  195. bs.setBankName(BANK_NAME);
  196. bs.setCardNumber(entry.getCardNumber());
  197. bs.setCardHolderName(entry.getCardHolderName());
  198. if (StrUtil.isEmpty(bs.getCardHolderName())) {
  199. // 从开户信息中获取数据
  200. OpeningAccountInfo acc = cardNumberAccMap.getOrDefault(entry.getCardNumber(), null);
  201. if (acc != null) {
  202. bs.setCardHolderName(acc.getName());
  203. bs.setIdCardNo(acc.getIdNo());
  204. }else {
  205. acc = account2CardNumberMap.getOrDefault(entry.getCardNumber(), null);
  206. if (acc != null) {
  207. bs.setCardHolderName(acc.getName());
  208. bs.setIdCardNo(acc.getIdNo());
  209. }
  210. }
  211. }else {
  212. // 从开户信息中获取数据
  213. OpeningAccountInfo acc = nameAccMap.getOrDefault(entry.getCardHolderName(), null);
  214. if (acc != null) {
  215. bs.setIdCardNo(acc.getIdNo());
  216. }
  217. }
  218. bs.setCounterpartyName(entry.getCounterpartyName());
  219. bs.setCounterpartIdCardNo(null);
  220. bs.setCounterpartyAccount(entry.getCounterpartyAccount());
  221. bs.setSummary(entry.getSummary());
  222. bs.setTransRemark(entry.getTransRemark());
  223. bs.setTransCurrencyType(Constants.CURRENCY_TYPE_CHINA);
  224. bs.setTransactionInstitutions(entry.getTransactionInstitutions());
  225. // 交易金额
  226. String loanFlag = entry.getLoanFlag();
  227. if (StrUtil.isNotEmpty(loanFlag)) {
  228. if (Objects.equals("借", loanFlag)) {
  229. bs.setTransactionAmount(BigDecimal.ZERO.subtract(entry.getTransactionAmount()));
  230. } else {
  231. bs.setTransactionAmount(entry.getTransactionAmount());
  232. }
  233. }
  234. // 交易时间 2015-08-29-13.16.32.670138
  235. String transactionTime = entry.getTransactionTime();
  236. String pattern = "yyyy-MM-dd-HH.mm.ss";
  237. int len = pattern.length();
  238. transactionTime = transactionTime.substring(0, len);
  239. try {
  240. bs.setTransactionTime(DateUtil.parse(transactionTime, pattern));
  241. } catch (Exception e) {
  242. log.error("解析时间出错", e);
  243. throw new AnalyzeDataFailedException("解析时间出错: " + e.getMessage(), e, sourceFile);
  244. }
  245. // 信用卡余额为0
  246. bs.setBalance(entry.getUpdateBalance());
  247. bs.setRemark("信用卡");
  248. String md5Id = HelperUtil.generateMD5Id(bs,caseId);
  249. //未导入数据内部去重
  250. if(HelperUtil.deduplication(md5Id,uniqueKeySet)){
  251. continue;
  252. }
  253. bs.setId(md5Id);
  254. bs.setCaseId(caseId);
  255. try {
  256. BeanUtils.beanAttributeValueTrim(bs);
  257. } catch (Exception e) {
  258. e.printStackTrace();
  259. }
  260. bsList.add(bs);
  261. HelperUtil.extractPlateNumber(bs,plateNumberInfoList);
  262. if (bsList.size() >= Constants.BATCH_SIZE) {
  263. List<BankStatement> dest = HelperUtil.getDest(bsList);
  264. HelperUtil.batchInsert2Es(dest, caseId);
  265. bsList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
  266. }
  267. } catch (Exception e) {
  268. importResultService.record(caseId, BANK_NAME, e, sourceFile);
  269. }
  270. }
  271. uniqueKeySet.clear();
  272. HelperUtil.batchInsertPlateNumber(plateNumberInfoList);
  273. if (!bsList.isEmpty()) {
  274. List<BankStatement> dest = HelperUtil.getDest(bsList);
  275. HelperUtil.batchInsert2Es(dest, caseId);
  276. }
  277. }
  278. private void analyzeSavingsCardBS(String caseId) {
  279. List<BankStatement> bsList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
  280. List<ICBCBankStatementEntry> entityList =
  281. HelperUtil.getEntityList(bankStatementMapper, ICBCBankStatementEntry.class);
  282. // Map<String, List<OpeningAccountInfo>> oaiMap = importService.getOAIMap(caseId, BANK_NAME);
  283. List<OpeningAccountInfo> oaiData = importService.getOAIData(caseId, BANK_NAME);
  284. Map<String, OpeningAccountInfo> nameAccMap = new HashMap<>();
  285. Map<String, OpeningAccountInfo> cardNumberAccMap = new HashMap<>();
  286. Map<String, OpeningAccountInfo> accountNumberAccMap = new HashMap<>();
  287. Map<String, OpeningAccountInfo> account2CardNumberMap = new HashMap<>();
  288. for (OpeningAccountInfo entry : oaiData) {
  289. if (StrUtil.isNotEmpty(entry.getName())) {
  290. nameAccMap.put(entry.getName(), entry);
  291. }
  292. if (StrUtil.isNotEmpty(entry.getAccountNumber())) {
  293. cardNumberAccMap.put(entry.getAccountNumber(), entry);
  294. }
  295. if (StrUtil.isNotEmpty(entry.getCustomerId())) {
  296. accountNumberAccMap.put(entry.getCustomerId(), entry);
  297. }
  298. if (StrUtil.isNotEmpty(entry.getAccount2CardNumber())) {
  299. account2CardNumberMap.put(entry.getAccount2CardNumber(), entry);
  300. }
  301. }
  302. Set<String> uniqueKeySet = new HashSet();
  303. List<PlateNumberInfo> plateNumberInfoList = new ArrayList<>();
  304. for (ICBCBankStatementEntry entry : entityList) {
  305. String sourceFile = entry.getSourceFile();
  306. try {
  307. String cardNumber = entry.getCardNumber();
  308. String accountNumber = entry.getAccountNumber();
  309. if (StrUtil.isEmpty(entry.getCardHolderName())) {
  310. if (cardNumberAccMap.containsKey(cardNumber)) {
  311. OpeningAccountInfo info = cardNumberAccMap.get(cardNumber);
  312. entry.setCardHolderName(info.getName());
  313. entry.setIdCardNo(info.getIdNo());
  314. } else if (cardNumberAccMap.containsKey(accountNumber)) {
  315. OpeningAccountInfo info = cardNumberAccMap.get(accountNumber);
  316. entry.setCardHolderName(info.getName());
  317. entry.setIdCardNo(info.getIdNo());
  318. } else if(accountNumberAccMap.containsKey(cardNumber)){
  319. OpeningAccountInfo info = accountNumberAccMap.get(cardNumber);
  320. entry.setCardHolderName(info.getName());
  321. entry.setIdCardNo(info.getIdNo());
  322. } else if(accountNumberAccMap.containsKey(accountNumber)){
  323. OpeningAccountInfo info = accountNumberAccMap.get(accountNumber);
  324. entry.setCardHolderName(info.getName());
  325. entry.setIdCardNo(info.getIdNo());
  326. } else if(account2CardNumberMap.containsKey(accountNumber)){
  327. OpeningAccountInfo info = account2CardNumberMap.get(accountNumber);
  328. entry.setCardHolderName(info.getName());
  329. entry.setIdCardNo(info.getIdNo());
  330. }else if(account2CardNumberMap.containsKey(cardNumber)){
  331. OpeningAccountInfo info = account2CardNumberMap.get(cardNumber);
  332. entry.setCardHolderName(info.getName());
  333. entry.setIdCardNo(info.getIdNo());
  334. }
  335. }else {
  336. OpeningAccountInfo acc = nameAccMap.getOrDefault(entry.getCardHolderName(), null);
  337. if (acc != null) {
  338. entry.setIdCardNo(acc.getIdNo());
  339. }
  340. }
  341. BankStatement bs = new BankStatement();
  342. bs.setBankName(BANK_NAME);
  343. cardNumber = StrUtil.isEmpty(cardNumber)? accountNumber : cardNumber;
  344. bs.setCardNumber(cardNumber);
  345. bs.setCardHolderName(entry.getCardHolderName());
  346. bs.setIdCardNo(entry.getIdCardNo() == null?"":entry.getIdCardNo());
  347. String counterpartName = entry.getCounterpartName();
  348. bs.setCounterpartyName(counterpartName);
  349. bs.setCounterpartyAccount(entry.getCounterpartyAccount());
  350. bs.setCounterpartyBankName(entry.getCounterpartyBankName());
  351. bs.setTransRemark(entry.getTransRemark());
  352. bs.setTransCurrencyType(Constants.CURRENCY_TYPE_CHINA);
  353. bs.setTransactionInstitutions(entry.getTransactionInstitutions());
  354. // 交易金额
  355. String loanFlag = entry.getLoanFlag();
  356. try {
  357. if (StrUtil.isNotEmpty(loanFlag) && StrUtil.isNotEmpty(entry.getTransactionAmount())) {
  358. BigDecimal transactionAmount = new BigDecimal(entry.getTransactionAmount());
  359. if (transactionAmount.compareTo(BigDecimal.ZERO) < 0) {
  360. transactionAmount = BigDecimal.ZERO.subtract(transactionAmount);
  361. }
  362. if (Objects.equals("借", loanFlag)) {
  363. bs.setTransactionAmount(BigDecimal.ZERO.subtract( new BigDecimal(entry.getTransactionAmount())));
  364. } else {
  365. bs.setTransactionAmount(transactionAmount);
  366. }
  367. }
  368. }catch (Exception e){
  369. throw new AnalyzeDataFailedException(
  370. StrUtil.format("金额, 无法将字符串【{}】化为金额。", entry.getTransactionAmount()), e, sourceFile);
  371. }
  372. // 交易时间 2015-08-29-13.16.32.670138
  373. String transactionTime = entry.getTransactionTime();
  374. String transactionDate = entry.getTransactionDate();
  375. try {
  376. if(StrUtil.isNotEmpty(transactionDate)){
  377. String format = "yyyy-MM-ddHH.mm.ss";
  378. if(!transactionDate.contains("-")){
  379. format = "yyyyMMddHH.mm.ss";
  380. }
  381. bs.setTransactionTime(DateUtil.parse(transactionDate + transactionTime, format));
  382. }else if(StrUtil.isNotEmpty(transactionTime) && transactionTime.contains(".")){
  383. String pattern = "yyyy-MM-dd-HH.mm.ss";
  384. int len = pattern.length();
  385. transactionTime = transactionTime.substring(0, len);
  386. bs.setTransactionTime(DateUtil.parse(transactionTime, pattern));
  387. }else {
  388. }
  389. } catch (Exception e) {
  390. throw new AnalyzeDataFailedException(StrUtil.format("解析时间失败,时间:{}", transactionTime), e,entry.getSourceFile());
  391. }
  392. bs.setBalance(new BigDecimal(entry.getBalance()));
  393. bs.setSummary(entry.getSummary());
  394. bs.setTransChannel(entry.getTransChannel());
  395. String md5Id = HelperUtil.generateMD5Id(bs,caseId);
  396. //未导入数据内部去重
  397. if(HelperUtil.deduplication(md5Id,uniqueKeySet)){
  398. continue;
  399. }
  400. bs.setSourceFile(entry.getSourceFile());
  401. bs.setId(md5Id);
  402. bs.setCaseId(caseId);
  403. try {
  404. BeanUtils.beanAttributeValueTrim(bs);
  405. } catch (Exception e) {
  406. e.printStackTrace();
  407. }
  408. bsList.add(bs);
  409. HelperUtil.extractPlateNumber(bs,plateNumberInfoList);
  410. if (bsList.size() >= Constants.BATCH_SIZE) {
  411. List<BankStatement> dest = HelperUtil.getDest(bsList);
  412. HelperUtil.batchInsert2Es(dest, caseId);
  413. bsList = ListUtils.newArrayListWithExpectedSize(Constants.BATCH_SIZE);
  414. }
  415. } catch (Exception e) {
  416. importResultService.record(caseId, BANK_NAME, e, sourceFile);
  417. }
  418. }
  419. uniqueKeySet.clear();
  420. HelperUtil.batchInsertPlateNumber(plateNumberInfoList);
  421. if (!bsList.isEmpty()) {
  422. List<BankStatement> dest = HelperUtil.getDest(bsList);
  423. HelperUtil.batchInsert2Es(dest, caseId);
  424. }
  425. }
  426. private void readBS(String excelFileName, int sheetNo,String sourceFile) {
  427. try {
  428. // 分两种流水,一种是信用卡流水,一种是储蓄卡流水
  429. int type = getBSType(excelFileName, sheetNo);
  430. if (type == Constants.ICBC_BS_TYPE_CREDIT_CARD) { // 信用卡流水
  431. try (ExcelReader reader = EasyExcel.read(excelFileName).build()) {
  432. ReadSheet sheet = EasyExcel.readSheet(sheetNo)
  433. .head(ICBCCreditCardBankStatementEntry.class)
  434. .registerReadListener(HelperUtil.getReadListener(
  435. creditCardBankStatementMapper,
  436. ICBCCreditCardBankStatementEntry.class,
  437. "",sourceFile))
  438. .build();
  439. reader.read(sheet);
  440. } catch (Exception e) {
  441. log.error("读取excel文件失败", e);
  442. throw new ImportDataFailedException(e.getMessage(), excelFileName);
  443. }
  444. } else if (type == Constants.ICBC_BS_TYPE_DEBIT_CARD) { // 储蓄卡流水
  445. try (ExcelReader reader = EasyExcel.read(excelFileName).build()) {
  446. ReadSheet sheet = EasyExcel.readSheet(sheetNo)
  447. .head(ICBCBankStatementEntry.class)
  448. .registerReadListener(HelperUtil.getReadListener(
  449. bankStatementMapper, ICBCBankStatementEntry.class, "",sourceFile))
  450. .build();
  451. reader.read(sheet);
  452. } catch (Exception e) {
  453. log.error("读取excel文件失败", e);
  454. throw new ImportDataFailedException(e.getMessage(), excelFileName);
  455. }
  456. }
  457. } catch (Exception e) {
  458. log.error("读取excel文件失败", e);
  459. throw new ImportDataFailedException(e.getMessage(), excelFileName);
  460. }
  461. }
  462. private int getBSType(String excelFilename, int sheetNo) {
  463. File file = new File(excelFilename);
  464. Cell cell = AsposeUtil.getCell(file, sheetNo, "更新后余额");
  465. if (cell != null) {
  466. return Constants.ICBC_BS_TYPE_CREDIT_CARD;
  467. } else {
  468. Cell c = AsposeUtil.getCell(file, sheetNo, "余额");
  469. if (c != null) {
  470. return Constants.ICBC_BS_TYPE_DEBIT_CARD;
  471. }
  472. }
  473. return -1;
  474. }
  475. }