Files
dzpt-server/src/main/java/com/saye/hgddmz/controller/GetDateController.java

1115 lines
49 KiB
Java
Raw Normal View History

2025-09-15 18:52:59 +08:00
package com.saye.hgddmz.controller;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import com.saye.hgddmz.commons.date.DateDUtil;
import com.saye.hgddmz.commons.string.StringDUtil;
import com.saye.hgddmz.entity.BankbillHistory;
import com.saye.hgddmz.util.DownloadFtpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Cell;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.File;
import java.io.FileInputStream;
import java.util.*;
/**
* @author thuang
* @version 1.0
* @description: TODO
* @date 2021/9/22 13:55
*/
@Controller
@Slf4j
public class GetDateController {
private static String grant_type = "client_credential";
private static String appid = "wx45acd2b4907cb8f4";
private static String secret = "895b90585c4698485c07e113711eac85";
private static String key = "Nxwj20250903Jojubanking12091209x";
/**
* 安全获取单元格字符串值
* @param row 行对象
* @param cellIndex 单元格索引
* @return 单元格字符串值如果单元格为空则返回空字符串
*/
private static String getCellStringValue(HSSFRow row, int cellIndex) {
if (row == null) {
return "";
}
HSSFCell cell = row.getCell(cellIndex);
if (cell == null) {
return "";
}
try {
cell.setCellType(Cell.CELL_TYPE_STRING);
String value = cell.getStringCellValue();
return value != null ? value.trim() : "";
} catch (Exception e) {
log.warn("获取单元格值失败,行: {}, 列: {}, 错误: {}", row.getRowNum(), cellIndex, e.getMessage());
return "";
}
}
/**
* 安全获取单元格日期值
* @param row 行对象
* @param cellIndex 单元格索引
* @return 日期字符串如果单元格为空或不是日期格式则返回空字符串
*/
private static String getCellDateValue(HSSFRow row, int cellIndex) {
if (row == null) {
return "";
}
HSSFCell cell = row.getCell(cellIndex);
if (cell == null) {
return "";
}
try {
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date dateCellValue = cell.getDateCellValue();
return DateDUtil.DateToStr(DateDUtil.yyyy_MM_dd, dateCellValue);
}
return "";
} catch (Exception e) {
log.warn("获取单元格日期值失败,行: {}, 列: {}, 错误: {}", row.getRowNum(), cellIndex, e.getMessage());
return "";
}
}
/**
* @description: 获取银行端商户对账数据
* @author thuang
* @date 2021/9/22 13:57
* @version 1.0
*/
@PostMapping("/getBankDataBySH")
@ResponseBody
public HashMap<Object, Object> getBankDataBySH(@RequestBody HashMap<Object, Object> map) {
HashMap<Object, Object> responseMap = new HashMap<>();
String errCode = "0";
String errMsg = "";
// 先下载文件
String host = StringDUtil.changeNullToEmpty(map.get("FTP_HOST"));
String portStr = StringDUtil.changeNullToEmpty(map.get("FTP_PORT"));
int port = Integer.parseInt("".equals(portStr) ? "21" : portStr);
String username = StringDUtil.changeNullToEmpty(map.get("FTP_USER"));
String password = StringDUtil.changeNullToEmpty(map.get("FTP_PASSWORD"));
String localPath = StringDUtil.changeNullToEmpty(map.get("LOCAL_PATH"));
String mch_id = StringDUtil.changeNullToEmpty(map.get("MCH_ID"));
String ftp_path = StringDUtil.changeNullToEmpty(map.get("FTP_PATH"));
String ftp_file_name = StringDUtil.changeNullToEmpty(map.get("FTP_FILE_NAME"));
String bill_table_name = StringDUtil.changeNullToEmpty(map.get("BILL_TABLE_NAME"));
String thirdConfigId = StringDUtil.changeNullToEmpty(map.get("ID"));
String trade_date = StringDUtil.changeNullToEmpty(map.get("trade_date"));
HSSFWorkbook sheets = null;
try {
// 下载文件
log.info("开始下载FTP文件: " + ftp_file_name);
boolean b = DownloadFtpUtil.downloadFtpFile(host, username, password, port, ftp_path, localPath, ftp_file_name);
// 判断是否下载到文件
if (!b) {
log.error("FTP文件下载失败: " + ftp_file_name);
errCode = "1";
errMsg = "FTP文件下载失败请检查FTP连接参数和文件是否存在";
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
// 判断本地是否有文件
File file = new File(localPath + "/" + ftp_file_name);
if (file.exists()) {
// 存在 开始解析 存入数据库
FileInputStream fileInputStream = new FileInputStream(localPath + "/" + ftp_file_name);
sheets = new HSSFWorkbook(fileInputStream);
HSSFSheet sheet = sheets.getSheetAt(0);
// 获取sheet中第一行行号
int firstRowNum = sheet.getFirstRowNum();
// 获取sheet中最后一行行号
int lastRowNum = sheet.getLastRowNum();
List<BankbillHistory> list = new ArrayList<>();
for (int i = firstRowNum + 3; i <= lastRowNum - 2; i++) {// 因为表格中第一行为说明,第二行为列标题
HSSFRow row = sheet.getRow(i);
if (row == null) {
continue;
}
BankbillHistory bankbillHistory = new BankbillHistory();
// 清算日期
String qsrqStr = getCellStringValue(row, 0);
// 拿第一个字段判断这条记录是否为空 如果为空直接跳出 一般这字段为空就是数据结束了或根本没有
// 为合计也跳出
if ("".equals(qsrqStr) || "合计".equals(qsrqStr)) {
break;
}
bankbillHistory.setCQsrq(qsrqStr);
// 交易日期
String jyrqStr = getCellDateValue(row, 1);
bankbillHistory.setCJyrq(jyrqStr);
if (i == firstRowNum + 3) {
trade_date = jyrqStr;
}
// 交易时间
String jysjStr = getCellStringValue(row, 2);
bankbillHistory.setCJysj(jysjStr);
// 卡号
String khStr = getCellStringValue(row, 3);
bankbillHistory.setCCard(khStr);
// 交易类型
String jylxStr = getCellStringValue(row, 4);
bankbillHistory.setCJylx(jylxStr);
// 交易金额
String jyjeStr = getCellStringValue(row, 5);
bankbillHistory.setCJyje(jyjeStr);
// 终端号
String zdhStr = getCellStringValue(row, 6);
bankbillHistory.setCZdh(zdhStr);
// 清算金额
String qsjeStr = getCellStringValue(row, 7);
bankbillHistory.setCQsje(qsjeStr);
// 手续费
String sxfStr = getCellStringValue(row, 8);
bankbillHistory.setCSxf(sxfStr);
// 参考号
String ckhStr = getCellStringValue(row, 9);
bankbillHistory.setCCkh(ckhStr);
// 流水号
String lshStr = getCellStringValue(row, 10);
bankbillHistory.setCLsh(lshStr);
// 卡类型
String klxStr = getCellStringValue(row, 11);
bankbillHistory.setCKlx(klxStr);
// 商户订单号
String shddhStr = getCellStringValue(row, 12);
bankbillHistory.setCShddh(shddhStr);
// 支付方式
String zffsStr = getCellStringValue(row, 13);
bankbillHistory.setCZffs(zffsStr);
// 银商订单号
String ysddhStr = getCellStringValue(row, 14);
bankbillHistory.setCYsddh(ysddhStr);
// 退货订单号
String thddhStr = getCellStringValue(row, 15);
bankbillHistory.setCThddh(thddhStr);
// 实际支付金额
String sjzfjeStr = getCellStringValue(row, 16);
bankbillHistory.setCSjzfje(sjzfjeStr);
// 备注字段
String bzzdStr = getCellStringValue(row, 17);
bankbillHistory.setCBzzd(bzzdStr);
// 付款附言
String fkfyStr = getCellStringValue(row, 18);
bankbillHistory.setCFkfy(fkfyStr);
// 钱包优惠金额
String qbyhjeStr = getCellStringValue(row, 19);
bankbillHistory.setCQbyhje(qbyhjeStr);
// 商户优惠金额
String shyhjeStr = getCellStringValue(row, 20);
bankbillHistory.setCShyhje(shyhjeStr);
// 发卡行
String fkhStr = getCellStringValue(row, 21);
bankbillHistory.setCFkh(fkhStr);
// 分店简称
String fdjcStr = getCellStringValue(row, 22);
bankbillHistory.setCFdjc(fdjcStr);
// 其他优惠金额
String qtyhjeStr = getCellStringValue(row, 23);
bankbillHistory.setCQtyhje(qtyhjeStr);
// 分期期数
String fqqsStr = getCellStringValue(row, 24);
bankbillHistory.setCFqqs(fqqsStr);
// 分期手续费
String fqsxfStr = getCellStringValue(row, 25);
bankbillHistory.setCFqsxf(fqsxfStr);
// 分期服务方
String fqfwfStr = getCellStringValue(row, 26);
bankbillHistory.setCFqfwf(fqfwfStr);
// 分期付息方
String fqfxfStr = getCellStringValue(row, 27);
bankbillHistory.setCFqfxf(fqfxfStr);
// 子订单号
String zddhStr = getCellStringValue(row, 28);
bankbillHistory.setCZddh(zddhStr);
// 表名
bankbillHistory.setBillTableName(bill_table_name);
list.add(bankbillHistory);
}
responseMap.put("list", list);
} else {
System.out.println("执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name);
errCode = "999";
errMsg = "执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name;
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("执行失败,原因:" + e.getMessage());
errCode = "999";
errMsg = "执行失败,原因:" + e.getMessage();
} finally {
try {
if (sheets != null) {
sheets.close();
}
} catch (Exception ie) {
ie.printStackTrace();
}
}
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
/**
* @description: 获取银行端商户POS对账数据
* @author thuang
* @date 2021/9/22 13:57
* @version 1.0
*/
@PostMapping("/getBankDataBySHPOS")
@ResponseBody
public HashMap<Object, Object> getBankDataBySHPOS(@RequestBody HashMap<Object, Object> map) {
HashMap<Object, Object> responseMap = new HashMap<>();
String errCode = "0";
String errMsg = "";
// 先下载文件
String host = StringDUtil.changeNullToEmpty(map.get("FTP_HOST"));
String portStr = StringDUtil.changeNullToEmpty(map.get("FTP_PORT"));
int port = Integer.parseInt("".equals(portStr) ? "21" : portStr);
String username = StringDUtil.changeNullToEmpty(map.get("FTP_USER"));
String password = StringDUtil.changeNullToEmpty(map.get("FTP_PASSWORD"));
String localPath = StringDUtil.changeNullToEmpty(map.get("LOCAL_PATH"));
String mch_id = StringDUtil.changeNullToEmpty(map.get("MCH_ID"));
String ftp_path = StringDUtil.changeNullToEmpty(map.get("FTP_PATH"));
String ftp_file_name = StringDUtil.changeNullToEmpty(map.get("FTP_FILE_NAME"));
String bill_table_name = StringDUtil.changeNullToEmpty(map.get("BILL_TABLE_NAME"));
String thirdConfigId = StringDUtil.changeNullToEmpty(map.get("ID"));
String trade_date = StringDUtil.changeNullToEmpty(map.get("trade_date"));
HSSFWorkbook sheets = null;
try {
// 下载文件
log.info("开始下载FTP文件: " + ftp_file_name);
boolean b = DownloadFtpUtil.downloadFtpFile(host, username, password, port, ftp_path, localPath, ftp_file_name);
// 判断是否下载到文件
if (!b) {
log.error("FTP文件下载失败: " + ftp_file_name);
errCode = "1";
errMsg = "FTP文件下载失败请检查FTP连接参数和文件是否存在";
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
// 判断本地是否有文件
File file = new File(localPath + "/" + ftp_file_name);
if (file.exists()) {
// 存在 开始解析 存入数据库
FileInputStream fileInputStream = new FileInputStream(localPath + "/" + ftp_file_name);
sheets = new HSSFWorkbook(fileInputStream);
HSSFSheet sheet = sheets.getSheetAt(0);
// 获取sheet中第一行行号
int firstRowNum = sheet.getFirstRowNum();
// 获取sheet中最后一行行号
int lastRowNum = sheet.getLastRowNum();
List<BankbillHistory> list = new ArrayList<>();
for (int i = firstRowNum + 3; i <= lastRowNum - 4; i++) {
log.info("正在解析第" + i + "行数据");// 因为表格中第一行为说明,第二行为列标题
HSSFRow row = sheet.getRow(i);
if (row == null) {
continue;
}
BankbillHistory bankbillHistory = new BankbillHistory();
// 清算日期
String qsrqStr = getCellStringValue(row, 0);
// 拿第一个字段判断这条记录是否为空 如果为空直接跳出 一般这字段为空就是数据结束了或根本没有
if ("".equals(qsrqStr) || "汇总信息".equals(qsrqStr)) {
break;
}
bankbillHistory.setCQsrq(qsrqStr);
// 交易日期
String jyrqStr = getCellDateValue(row, 1);
bankbillHistory.setCJyrq(jyrqStr);
if (i == firstRowNum + 3) {
trade_date = jyrqStr;
}
// 交易时间
String jysjStr = getCellStringValue(row, 2);
bankbillHistory.setCJysj(jysjStr);
// 终端号
String zdhStr = getCellStringValue(row, 3);
bankbillHistory.setCZdh(zdhStr);
// 卡号
String khStr = getCellStringValue(row, 4);
bankbillHistory.setCCard(khStr);
// 交易类型
String jylxStr = getCellStringValue(row, 5);
bankbillHistory.setCJylx(jylxStr);
// 交易金额
String jyjeStr = getCellStringValue(row, 6);
log.info("jyjeStr:" + jyjeStr);
bankbillHistory.setCJyje(jyjeStr);
// 清算金额
String qsjeStr = getCellStringValue(row, 7);
bankbillHistory.setCQsje(qsjeStr);
// 手续费
String sxfStr = getCellStringValue(row, 8);
bankbillHistory.setCSxf(sxfStr);
// 参考号
String ckhStr = getCellStringValue(row, 9);
bankbillHistory.setCCkh(ckhStr);
// 流水号
String lshStr = getCellStringValue(row, 10);
bankbillHistory.setCLsh(lshStr);
// 卡类型
String klxStr = getCellStringValue(row, 11);
bankbillHistory.setCKlx(klxStr);
// 发卡行
String fkhStr = getCellStringValue(row, 12);
bankbillHistory.setCFkh(fkhStr);
// 支付方式
String zffsStr = getCellStringValue(row, 13);
bankbillHistory.setCZffs(zffsStr);
// 银商订单号
String ysddhStr = getCellStringValue(row, 15);
log.info("ysddhStr:" + ysddhStr);
bankbillHistory.setCYsddh(ysddhStr);
// 商户订单号
String shddhStr = getCellStringValue(row, 16);
bankbillHistory.setCShddh(shddhStr);
// 备注字段
String bzzdStr = getCellStringValue(row, 18);
bankbillHistory.setCBzzd(bzzdStr);
// 钱包优惠金额
String fdmcjjStr = getCellStringValue(row, 19);
bankbillHistory.setCFdjc(fdmcjjStr);
// 表名
bankbillHistory.setBillTableName(bill_table_name);
list.add(bankbillHistory);
}
responseMap.put("list", list);
} else {
System.out.println("执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name);
errCode = "999";
errMsg = "执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name;
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("执行失败,原因:" + e.getMessage());
errCode = "999";
errMsg = "执行失败,原因:" + e.getMessage();
} finally {
try {
if (sheets != null) {
sheets.close();
}
} catch (Exception ie) {
ie.printStackTrace();
}
}
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
/**
* @description: 获取银行端商户银联卡对账数据
* @author thuang
* @date 2021/9/22 13:57
* @version 1.0
*/
@PostMapping("/getBankDataBySHYLK")
@ResponseBody
public HashMap<Object, Object> getBankDataBySHYLK(@RequestBody HashMap<Object, Object> map) {
HashMap<Object, Object> responseMap = new HashMap<>();
String errCode = "0";
String errMsg = "";
// 先下载文件
String host = StringDUtil.changeNullToEmpty(map.get("FTP_HOST"));
String portStr = StringDUtil.changeNullToEmpty(map.get("FTP_PORT"));
int port = Integer.parseInt("".equals(portStr) ? "21" : portStr);
String username = StringDUtil.changeNullToEmpty(map.get("FTP_USER"));
String password = StringDUtil.changeNullToEmpty(map.get("FTP_PASSWORD"));
String localPath = StringDUtil.changeNullToEmpty(map.get("LOCAL_PATH"));
String mch_id = StringDUtil.changeNullToEmpty(map.get("MCH_ID"));
String ftp_path = StringDUtil.changeNullToEmpty(map.get("FTP_PATH"));
String ftp_file_name = StringDUtil.changeNullToEmpty(map.get("FTP_FILE_NAME"));
String bill_table_name = StringDUtil.changeNullToEmpty(map.get("BILL_TABLE_NAME"));
String thirdConfigId = StringDUtil.changeNullToEmpty(map.get("ID"));
String trade_date = StringDUtil.changeNullToEmpty(map.get("trade_date"));
HSSFWorkbook sheets = null;
try {
// 下载文件
log.info("开始下载FTP文件: " + ftp_file_name);
boolean b = DownloadFtpUtil.downloadFtpFile(host, username, password, port, ftp_path, localPath, ftp_file_name);
// 判断是否下载到文件
if (!b) {
log.error("FTP文件下载失败: " + ftp_file_name);
errCode = "1";
errMsg = "FTP文件下载失败请检查FTP连接参数和文件是否存在";
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
// 判断本地是否有文件
File file = new File(localPath + "/" + ftp_file_name);
if (file.exists()) {
// 存在 开始解析 存入数据库
FileInputStream fileInputStream = new FileInputStream(localPath + "/" + ftp_file_name);
sheets = new HSSFWorkbook(fileInputStream);
HSSFSheet sheet = sheets.getSheetAt(0);
// 获取sheet中第一行行号
int firstRowNum = sheet.getFirstRowNum();
// 获取sheet中最后一行行号
int lastRowNum = sheet.getLastRowNum();
List<BankbillHistory> list = new ArrayList<>();
for (int i = firstRowNum + 3; i <= lastRowNum - 2; i++) {// 因为表格中第一行为说明,第二行为列标题
HSSFRow row = sheet.getRow(i);
if (row == null) {
continue;
}
BankbillHistory bankbillHistory = new BankbillHistory();
// 清算日期
String qsrqStr = getCellStringValue(row, 0);
// 拿第一个字段判断这条记录是否为空 如果为空直接跳出 一般这字段为空就是数据结束了或根本没有
if ("".equals(qsrqStr) || "合计".equals(qsrqStr)) {
break;
}
bankbillHistory.setCQsrq(qsrqStr);
// 交易日期
String jyrqStr = getCellDateValue(row, 1);
bankbillHistory.setCJyrq(jyrqStr);
if (i == firstRowNum + 3) {
trade_date = jyrqStr;
}
// 交易时间
String jysjStr = getCellStringValue(row, 2);
bankbillHistory.setCJysj(jysjStr);
// 终端号
String zdhStr = getCellStringValue(row, 3);
bankbillHistory.setCZdh(zdhStr);
// 卡号
String khStr = getCellStringValue(row, 4);
bankbillHistory.setCCard(khStr);
// 交易类型
String jylxStr = getCellStringValue(row, 5);
bankbillHistory.setCJylx(jylxStr);
// 交易金额
String jyjeStr = getCellStringValue(row, 6);
bankbillHistory.setCJyje(jyjeStr);
// 清算金额
String qsjeStr = getCellStringValue(row, 7);
bankbillHistory.setCQsje(qsjeStr);
// 手续费
String sxfStr = getCellStringValue(row, 8);
bankbillHistory.setCSxf(sxfStr);
// 流水号
String lshStr = getCellStringValue(row, 9);
bankbillHistory.setCLsh(lshStr);
// 卡类型
String klxStr = getCellStringValue(row, 10);
bankbillHistory.setCKlx(klxStr);
// 发卡行
String fkhStr = getCellStringValue(row, 11);
bankbillHistory.setCFkh(fkhStr);
// 系统参考号 (对应银商订单号)
String xtckhStr = getCellStringValue(row, 12);
// 支付方式
bankbillHistory.setCZffs("银行卡支付");
// 银商订单号
bankbillHistory.setCYsddh(xtckhStr);
// 表名
bankbillHistory.setBillTableName(bill_table_name);
list.add(bankbillHistory);
}
responseMap.put("list", list);
} else {
System.out.println("执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name);
errCode = "999";
errMsg = "执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name;
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("执行失败,原因:" + e.getMessage());
errCode = "999";
errMsg = "执行失败,原因:" + e.getMessage();
} finally {
try {
if (sheets != null) {
sheets.close();
}
} catch (Exception ie) {
ie.printStackTrace();
}
}
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
/**
* @description: 获取银行端商户银联外卡对账数据
* @author yuan
* @date 2025/7/18 13:57
* @version 1.0
*/
@PostMapping("/getBankDataBySHYLWK")
@ResponseBody
public HashMap<Object, Object> getBankDataBySHYLWK(@RequestBody HashMap<Object, Object> map) {
HashMap<Object, Object> responseMap = new HashMap<>();
String errCode = "0";
String errMsg = "";
// 先下载文件
String host = StringDUtil.changeNullToEmpty(map.get("FTP_HOST"));
String portStr = StringDUtil.changeNullToEmpty(map.get("FTP_PORT"));
int port = Integer.parseInt("".equals(portStr) ? "21" : portStr);
String username = StringDUtil.changeNullToEmpty(map.get("FTP_USER"));
String password = StringDUtil.changeNullToEmpty(map.get("FTP_PASSWORD"));
String localPath = StringDUtil.changeNullToEmpty(map.get("LOCAL_PATH"));
String mch_id = StringDUtil.changeNullToEmpty(map.get("MCH_ID"));
String ftp_path = StringDUtil.changeNullToEmpty(map.get("FTP_PATH"));
String ftp_file_name = StringDUtil.changeNullToEmpty(map.get("FTP_FILE_NAME"));
String bill_table_name = StringDUtil.changeNullToEmpty(map.get("BILL_TABLE_NAME"));
String thirdConfigId = StringDUtil.changeNullToEmpty(map.get("ID"));
String trade_date = StringDUtil.changeNullToEmpty(map.get("trade_date"));
HSSFWorkbook sheets = null;
try {
// 下载文件
log.info("开始下载FTP文件: " + ftp_file_name);
boolean b = DownloadFtpUtil.downloadFtpFile(host, username, password, port, ftp_path, localPath, ftp_file_name);
// 判断是否下载到文件
if (!b) {
log.error("FTP文件下载失败: " + ftp_file_name);
errCode = "1";
errMsg = "FTP文件下载失败请检查FTP连接参数和文件是否存在";
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
// 判断本地是否有文件
File file = new File(localPath + "/" + ftp_file_name);
if (file.exists()) {
// 存在 开始解析 存入数据库
FileInputStream fileInputStream = new FileInputStream(localPath + "/" + ftp_file_name);
sheets = new HSSFWorkbook(fileInputStream);
HSSFSheet sheet = sheets.getSheetAt(0);
// 获取sheet中第一行行号
int firstRowNum = sheet.getFirstRowNum();
// 获取sheet中最后一行行号
int lastRowNum = sheet.getLastRowNum();
List<BankbillHistory> list = new ArrayList<>();
// 银联外卡对账单从第4行开始解析数据前3行是标题和表头
for (int i = firstRowNum + 3; i <= lastRowNum - 2; i++) {
HSSFRow row = sheet.getRow(i);
if (row == null) {
continue;
}
BankbillHistory bankbillHistory = new BankbillHistory();
// 清算日期
String qsrqStr = getCellStringValue(row, 0);
// 拿第一个字段判断这条记录是否为空 如果为空直接跳出
if ("".equals(qsrqStr) || "合计".equals(qsrqStr)) {
break;
}
bankbillHistory.setCQsrq(qsrqStr);
// 交易日期
String jyrqStr = getCellDateValue(row, 1);
bankbillHistory.setCJyrq(jyrqStr);
// 交易时间
String jysjStr = getCellStringValue(row, 2);
bankbillHistory.setCJysj(jysjStr);
// 终端号
String zdhStr = getCellStringValue(row, 3);
bankbillHistory.setCZdh(zdhStr);
// 卡号
String khStr = getCellStringValue(row, 4);
bankbillHistory.setCCard(khStr);
// 交易类型
String jylxStr = getCellStringValue(row, 5);
bankbillHistory.setCJylx(jylxStr);
// 交易金额
String jyjeStr = getCellStringValue(row, 6);
bankbillHistory.setCJyje(jyjeStr);
// 清算金额
String qsjeStr = getCellStringValue(row, 7);
bankbillHistory.setCQsje(qsjeStr);
// 手续费
String sxfStr = getCellStringValue(row, 8);
bankbillHistory.setCSxf(sxfStr);
// 参考号
String ckhStr = getCellStringValue(row, 9);
bankbillHistory.setCCkh(ckhStr);
// 流水号
String lshStr = getCellStringValue(row, 10);
bankbillHistory.setCLsh(lshStr);
// 卡类型
String klxStr = getCellStringValue(row, 11);
bankbillHistory.setCKlx(klxStr);
// 授权码
String sqmStr = getCellStringValue(row, 12);
bankbillHistory.setCBzzd(sqmStr); // 使用备注字段存储授权码
// 分店名称
String fdmcStr = getCellStringValue(row, 13);
bankbillHistory.setCFdjc(fdmcStr);
// 设置支付方式
bankbillHistory.setCZffs("银联外卡支付");
// 设置表名
bankbillHistory.setBillTableName(bill_table_name);
list.add(bankbillHistory);
}
responseMap.put("list", list);
} else {
System.out.println("执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name);
errCode = "999";
errMsg = "执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name;
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("执行失败,原因:" + e.getMessage());
errCode = "999";
errMsg = "执行失败,原因:" + e.getMessage();
} finally {
try {
if (sheets != null) {
sheets.close();
}
} catch (Exception ie) {
ie.printStackTrace();
}
}
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
/**
* @description: 获取微信支付对账数据
* @author thuang
* @date 2021/9/22 13:57
* @version 1.0
*/
@PostMapping("/getBankDataByWXAPI")
@ResponseBody
public HashMap<Object, Object> getBankDataByWXAPI(@RequestBody HashMap<Object, Object> map) {
List<BankbillHistory> list = new ArrayList<>();
log.info("开始获取微信账单");
HashMap<Object, Object> responseMap = new HashMap<>();
String errCode = "0";
String errMsg = "";
try {
String localPath = StringDUtil.changeNullToEmpty(map.get("LOCAL_PATH"));
String mch_id = StringDUtil.changeNullToEmpty(map.get("MCH_ID"));
String trade_date = StringDUtil.changeNullToEmpty(map.get("trade_date"));
2025-09-25 16:08:34 +08:00
log.info("开始获取微信账单,参数: mch_id={}, trade_date={}", mch_id, trade_date);
2025-09-15 18:52:59 +08:00
HashMap<String, Object> reqMap = new HashMap<>();
reqMap.put("grant_type", grant_type);
reqMap.put("appid", appid);
reqMap.put("secret", secret);
String randomStr = RandomUtil.randomString(32);
String signString = "appid=" + appid + "&bill_date=" + trade_date + "&bill_type=ALL&mch_id=" + mch_id + "&nonce_str=" + randomStr + "&key="+ key;
String sign = SecureUtil.md5(signString).toUpperCase();
String reqXml = "<xml>\n" +
" <appid>" + appid + "</appid>\n" +
" <bill_date>" + trade_date + "</bill_date>\n" +
" <bill_type>ALL</bill_type>\n" +
" <mch_id>" + mch_id + "</mch_id>\n" +
" <nonce_str>" + randomStr + "</nonce_str>\n" +
" <sign>" + sign + "</sign>\n" +
"</xml>";
// 获取access_token
log.info("开始调用微信账单接口,参数: mch_id={}, trade_date={}", mch_id, trade_date);
String body1 = HttpUtil.createPost("https://api.mch.weixin.qq.com/pay/downloadbill")
.header("Content-Type", "text/xml")
.timeout(30000) // 设置30秒超时
.body(reqXml)
.execute()
.body();
log.info("微信账单接口返回数据长度: {}", body1 != null ? body1.length() : 0);
2025-09-25 16:08:34 +08:00
log.info("微信账单接口返回数据: {}", body1);
2025-09-15 18:52:59 +08:00
// 检查微信接口返回状态
if (body1.contains("<return_msg><![CDATA[Bill Creating]]></return_msg>")) {
log.info("账单正在生成中,请稍后重试");
errCode = "999";
errMsg = "微信账单正在生成中,请稍后重试";
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
String[] split = body1.split("\n");
for (int i = 1; i < split.length - 2; i++) {
String[] split1 = split[i].split(",");
if (Arrays.toString(split1).equals("[<return_msg><![CDATA[No Bill Exist]]></return_msg>]")) {
break;
}
// 检查是否是账单正在生成状态
if (Arrays.toString(split1).contains("Bill Creating")) {
log.info("账单正在生成中,跳过处理");
break;
}
BankbillHistory bankbillHistory = new BankbillHistory();
int flag = 0;
// 解析CSV数据到BankbillHistory实体
for (int j = 0; j < split1.length; j++) {
String value = split1[j].replaceAll("`", "").trim();
switch (j) {
case 0: // 交易时间
if (value.contains(" ")) {
String[] timeSplit = value.split(" ");
bankbillHistory.setCQsrq(timeSplit[0]); // 清算日期
bankbillHistory.setCJyrq(timeSplit[0]); // 交易日期
bankbillHistory.setCJysj(timeSplit[1]); // 交易时间
}
break;
case 4: // 设备号
bankbillHistory.setCZdh(value);
break;
case 5: // 微信订单号
bankbillHistory.setCYsddh(value);
break;
case 6: // 商户订单号
bankbillHistory.setCShddh(value);
break;
case 7: // 用户标识
bankbillHistory.setCCard(value);
break;
case 8: // 交易类型
bankbillHistory.setCJylx(value);
break;
case 9: // 交易状态
if ("REFUND".equals(value)) {
flag = -1;
}
break;
case 10: // 付款银行
bankbillHistory.setCFkh(value);
break;
case 12: // 应结订单金额
bankbillHistory.setCQsje(value);
break;
case 24: // 订单金额
2025-09-25 16:08:34 +08:00
// 只有在非退款状态时才设置订单金额
if (flag >= 0) {
2025-09-15 18:52:59 +08:00
bankbillHistory.setCJyje(value);
}
break;
case 20: // 商品名称
bankbillHistory.setCBzzd(value);
break;
case 22: // 手续费
bankbillHistory.setCSxf(value);
break;
2025-09-25 16:08:34 +08:00
case 14: // 微信退款单号
2025-09-15 18:52:59 +08:00
bankbillHistory.setCThddh(value);
break;
2025-09-25 16:08:34 +08:00
case 15: // 商户退款单号
2025-09-15 18:52:59 +08:00
bankbillHistory.setCYjylsh(value);
break;
2025-09-25 16:08:34 +08:00
case 25: // 申请退款金额
if (!"0.00".equals(value) && !value.isEmpty()) {
2025-09-15 18:52:59 +08:00
bankbillHistory.setCJyje("-" + value);
}
break;
}
}
// 设置支付方式
bankbillHistory.setCZffs("微信支付");
// 设置表名
bankbillHistory.setBillTableName("微信支付账单");
list.add(bankbillHistory);
}
// // 获取access_token
// String body = HttpUtil.createPost("https://api.weixin.qq.com/cgi-bin/stable_token").body(JSONUtil.toJsonStr(reqMap)).execute().body();
//
// String access_token = JSONUtil.parseObj(body).getStr("access_token");
// // 获取医保账单下载地址
// // https://api.weixin.qq.com/payinsurance/billdownload?access_token=ACCESS_TOKEN
// String signYBString = "appid=" + appid + "&bill_date=" + trade_date + "&bill_type=ALL&mch_id=" + mch_id + "&nonce_str=" + randomStr + "&key="+key;
// log.info("微信账单签名:" + signYBString);
// String signYB = SecureUtil.md5(signYBString).toUpperCase();
// String reqYbXml = "<xml>\n" +
// " <appid>" + appid + "</appid>\n" +
// " <bill_date>" + trade_date + "</bill_date>\n" +
// " <bill_type>ALL</bill_type>\n" +
// " <mch_id>" + mch_id + "</mch_id>\n" +
// " <nonce_str>" + randomStr + "</nonce_str>\n" +
// " <sign>" + signYB + "</sign>\n" +
// "</xml>";
// String resBody = HttpUtil.createPost("https://api.weixin.qq.com/payinsurance/billdownload?access_token=" + access_token).header("Content-Type", "text/xml").body(reqYbXml).execute().body();
// log.info("微信账单下载返回结果:" + resBody);
// Document document = XmlUtil.parseXml(resBody);
// Element elementG = XmlUtil.getRootElement(document);
// Element returnCode = XmlUtil.getElement(elementG, "return_code");
//
// if (returnCode.getTextContent().equals("SUCCESS")) {// 响应成功
// // 下载文件
// Element downloadUrl = XmlUtil.getElement(elementG, "download_url");
// String dwUrl = downloadUrl.getTextContent();
// log.info("开始下载文件");
// HttpUtil.downloadFileFromUrl(dwUrl, localPath + File.separator + trade_date + ".csv");
// HttpUtil.downloadFileFromUrl(dwUrl, localPath + File.separator + trade_date + ".txt");
// // HttpUtil.downloadFileFromUrl(dwUrl, localPath);
// log.info("下载文件成功");
// CsvReader reader = CsvUtil.getReader();
// try {
// CsvData read = reader.read(FileUtil.file(localPath + File.separator + trade_date + ".csv"));
// List<CsvRow> rows = read.getRows();
// if (rows.size() > 1) {
// for (int i = 1; i < rows.size(); i++) {
// CsvRow row = rows.get(i);
// BankbillHistory bankbillHistory = new BankbillHistory();
// String s = row.get(0).replaceAll("`", "");
// String[] s1 = s.split(" ");
// log.info("s1 is :" + Arrays.toString(s1));
// bankbillHistory.setCJyrq(s1[0]);
// bankbillHistory.setCQsrq(s1[0]);
// bankbillHistory.setCJysj(s1[1]);
// bankbillHistory.setCZdh(row.get(1).replaceAll("`", ""));
// bankbillHistory.setCCkh(row.get(2).replaceAll("`", ""));
// bankbillHistory.setCLsh(row.get(5).replaceAll("`", ""));
// bankbillHistory.setCShddh(row.get(6).replaceAll("`", ""));
// bankbillHistory.setCCard(row.get(7).replaceAll("`", ""));
// bankbillHistory.setCYsddh(row.get(25).replaceAll("`", ""));
// if (row.get(46).replaceAll("`", "").equals("0.00")) {
// continue;
// }
// if (row.get(45).replaceAll("`", "").equals("REFUND")) {
// bankbillHistory.setCJyje("-" + row.get(46).replaceAll("`", ""));
// } else {
// bankbillHistory.setCJyje(row.get(46).replaceAll("`", ""));
// }
// bankbillHistory.setBillTableName("微信支付账单");
// list.add(bankbillHistory);
// }
// }
// responseMap.put("list", list);
// } catch (IORuntimeException e) {
// throw new RuntimeException(e);
// } finally {
// try {
// reader.close();
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// }
// }
if (list.size() > 0) {
responseMap.put("list", list);
} else {
errCode = "999";
errMsg = "账单数据为空,或未获取到账单!";
}
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
} catch (Exception e) {
log.error("微信账单获取异常", e);
errCode = "999";
errMsg = "微信账单获取异常: " + e.getMessage();
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
}
// public static void main(String[] args) {
//
// String a = "?交易时间,公众账号ID,商户号,特约商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,应结订单金额,代金券金额,微信退款单号,商户退款单号,退款金额,充值券退款金额,退款类型,退款状态,商品名称,商户数据包,手续费,费率,订单金额,申请退款金额,费率备注\n" +
// "`2024-08-09 17:55:10,`wx83bc9715be856b14,`1648728329,`0,`,`4200002314202408091169938410,`JJ20240809175501,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`SUCCESS,`ICBC_DEBIT,`CNY,`61.00,`0.00,`0,`0,`0.00,`0.00,`,`,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"385606\\\"\\ \\\"sjh\\\":\\\"20240809yypt120016\\\"\\ \\\"ysje\\\":\\\"61.0000\\\"\\ \\\"zfje\\\":\\\"61.0000\\\"\\ \\\"zje\\\":\\\"61.0000\\\"},`0.00000,`0.00%,`61.00,`0.00,`\n" +
// "`2024-08-09 19:09:18,`wx83bc9715be856b14,`1648728329,`0,`,`4200002314202408091169938410,`JJ20240809175501,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`REFUND,`ICBC_DEBIT,`CNY,`0.00,`0.00,`50303000492024080988526514493,`C0_20240809yypt120016,`61.00,`0.00,`ORIGINAL,`SUCCESS,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"385606\\\"\\ \\\"sjh\\\":\\\"20240809yypt120016\\\"\\ \\\"ysje\\\":\\\"61.0000\\\"\\ \\\"zfje\\\":\\\"61.0000\\\"\\ \\\"zje\\\":\\\"61.0000\\\"},`0.00000,`0.00%,`0.00,`61.00,`\n" +
// "`2024-08-09 18:07:51,`wx83bc9715be856b14,`1648728329,`0,`,`4200002320202408095363202348,`JJ20240809180744,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`SUCCESS,`ICBC_DEBIT,`CNY,`104.00,`0.00,`0,`0,`0.00,`0.00,`,`,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"447719\\\"\\ \\\"sjh\\\":\\\"20240809yypt120017\\\"\\ \\\"ysje\\\":\\\"104.0000\\\"\\ \\\"zfje\\\":\\\"104.0000\\\"\\ \\\"zje\\\":\\\"104.0000\\\"},`0.00000,`0.00%,`104.00,`0.00,`\n" +
// "`2024-08-09 19:07:39,`wx83bc9715be856b14,`1648728329,`0,`,`4200002320202408095363202348,`JJ20240809180744,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`REFUND,`ICBC_DEBIT,`CNY,`0.00,`0.00,`50303500422024080937274513002,`C0_20240809yypt120017,`104.00,`0.00,`ORIGINAL,`SUCCESS,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"447719\\\"\\ \\\"sjh\\\":\\\"20240809yypt120017\\\"\\ \\\"ysje\\\":\\\"104.0000\\\"\\ \\\"zfje\\\":\\\"104.0000\\\"\\ \\\"zje\\\":\\\"104.0000\\\"},`0.00000,`0.00%,`0.00,`104.00,`\n" +
// "`2024-08-09 17:54:18,`wx83bc9715be856b14,`1648728329,`0,`,`4200002326202408099114331548,`JJ20240809175411,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`SUCCESS,`ICBC_DEBIT,`CNY,`298.38,`0.00,`0,`0,`0.00,`0.00,`,`,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"447719\\\"\\ \\\"sjh\\\":\\\"20240809yypt120015\\\"\\ \\\"ysje\\\":\\\"298.3800\\\"\\ \\\"zfje\\\":\\\"298.3800\\\"\\ \\\"zje\\\":\\\"298.3800\\\"},`0.00000,`0.00%,`298.38,`0.00,`\n" +
// "`2024-08-09 19:47:02,`wx83bc9715be856b14,`1648728329,`0,`,`4200002326202408099114331548,`JJ20240809175411,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`REFUND,`ICBC_DEBIT,`CNY,`0.00,`0.00,`50303500342024080940745293001,`C0_20240809yypt120015,`298.38,`0.00,`ORIGINAL,`SUCCESS,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"447719\\\"\\ \\\"sjh\\\":\\\"20240809yypt120015\\\"\\ \\\"ysje\\\":\\\"298.3800\\\"\\ \\\"zfje\\\":\\\"298.3800\\\"\\ \\\"zje\\\":\\\"298.3800\\\"},`0.00000,`0.00%,`0.00,`298.38,`\n" +
// "总交易单数,应结订单总金额,退款总金额,充值券退款总金额,手续费总金额,订单总金额,申请退款总金额\n" +
// "`6,`463.38,`463.38,`0.00,`0.00000,`463.38,`463.38";
// String[] split = a.split("\n");
// for (int i = 1; i < split.length - 2; i++) {
// String[] split1 = split[i].split(",");
// for (int j = 0; j < split1.length; j++) {
//
// System.out.println("==============");
// System.out.println("第" + j + "个:");
// System.out.println(split1[j]);
// System.out.println("==============");
// if (j == 21) {
// String s = split1[j].replaceAll("`", "");
// String s1 = s.replaceAll(" ", ",").replaceAll("\\\\", "");
// JSONObject entries = JSONUtil.parseObj(s1);
// Object zfje = entries.get("zfje");
//
// System.out.println(zfje.toString().substring(0, 5));
//
// }
// }
// }
// System.out.println();
// }
}