feat(bpm): 优化财务支付模块

- 升级 commons-io 版本至 2.16.1
- 修改财务支付相关逻辑:
  - 调整默认状态值
  -优化账目明细表格生成
- 新增 MergeSameRowCellsHandler用于合并相同行单元格
- 移除 easyexcel-core 依赖
This commit is contained in:
furongxin 2025-06-20 17:29:28 +08:00
parent c512c25a50
commit 585e2afe5a
4 changed files with 162 additions and 15 deletions

View File

@ -73,7 +73,7 @@
<!-- 三方云服务相关 --> <!-- 三方云服务相关 -->
<okio.version>3.5.0</okio.version> <okio.version>3.5.0</okio.version>
<okhttp3.version>4.11.0</okhttp3.version> <okhttp3.version>4.11.0</okhttp3.version>
<commons-io.version>2.11.0</commons-io.version> <commons-io.version>2.16.1</commons-io.version>
<minio.version>8.5.6</minio.version> <minio.version>8.5.6</minio.version>
<aliyun-java-sdk-core.version>4.6.4</aliyun-java-sdk-core.version> <aliyun-java-sdk-core.version>4.6.4</aliyun-java-sdk-core.version>
<aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version> <aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version>

View File

@ -140,12 +140,12 @@
<version>2.0.0-jdk8-snapshot</version> <version>2.0.0-jdk8-snapshot</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <!-- <dependency>-->
<groupId>com.alibaba</groupId> <!-- <groupId>com.alibaba</groupId>-->
<artifactId>easyexcel-core</artifactId> <!-- <artifactId>easyexcel-core</artifactId>-->
<version>4.0.3</version> <!-- <version>4.0.3</version>-->
<scope>compile</scope> <!-- <scope>compile</scope>-->
</dependency> <!-- </dependency>-->
<dependency> <dependency>
<groupId>cn.iocoder.cloud</groupId> <groupId>cn.iocoder.cloud</groupId>
<artifactId>yudao-spring-boot-starter-excel</artifactId> <artifactId>yudao-spring-boot-starter-excel</artifactId>

View File

@ -32,6 +32,7 @@ import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.loan.LoanApi; import cn.iocoder.yudao.module.system.api.loan.LoanApi;
import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO; import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO;
import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi; import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.support.ExcelTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -296,7 +297,7 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
try { try {
if (pageReqVO.getStatus() == null) { if (pageReqVO.getStatus() == null) {
pageReqVO.setStatus(2); pageReqVO.setStatus(0);
} }
// 获取支付信息数据 // 获取支付信息数据
@ -311,7 +312,7 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
// 设置表头 // 设置表头
data.add(Arrays.asList(entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), data.add(Arrays.asList(entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(),
entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName())); entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName()));
data.add(this.setTitle()); data.add(this.setTitle());
// 提取所有公账 支付信息 // 提取所有公账 支付信息
@ -344,9 +345,11 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
data.add(row); data.add(row);
} }
// 添加公账合计数据 if (CollUtil.isNotEmpty(publicAccount)) {
BigDecimal publicAccountTotal = publicAccount.stream().map(FinancialPaymentDO::getActualPayment).reduce(BigDecimal.ZERO, BigDecimal::add); // 添加公账合计数据
data.add(Arrays.asList("公账总计", "公账总计", "公账总计", publicAccountTotal.toString(), "", "公账")); BigDecimal publicAccountTotal = publicAccount.stream().map(FinancialPaymentDO::getActualPayment).reduce(BigDecimal.ZERO, BigDecimal::add);
data.add(Arrays.asList("公账总计", "公账总计", "公账总计", publicAccountTotal.toString(), "", "公账"));
}
// 遍历私账信息 // 遍历私账信息
for (FinancialPaymentDO financialPaymentDO : privateAccount) { for (FinancialPaymentDO financialPaymentDO : privateAccount) {
@ -369,9 +372,11 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
data.add(row); data.add(row);
} }
// 添加私账合计数据 if (CollUtil.isNotEmpty(privateAccount)) {
BigDecimal privateAccountTotal = privateAccount.stream().map(FinancialPaymentDO::getActualPayment).reduce(BigDecimal.ZERO, BigDecimal::add); // 添加私账合计数据
data.add(Arrays.asList("私账总计", "私账总计", "私账总计", privateAccountTotal.toString(), "", "私账")); BigDecimal privateAccountTotal = privateAccount.stream().map(FinancialPaymentDO::getActualPayment).reduce(BigDecimal.ZERO, BigDecimal::add);
data.add(Arrays.asList("私账总计", "私账总计", "私账总计", privateAccountTotal.toString(), "", "私账"));
}
} }
EasyExcel.write(response.getOutputStream()) EasyExcel.write(response.getOutputStream())
@ -379,6 +384,7 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
.excelType(ExcelTypeEnum.XLSX) .excelType(ExcelTypeEnum.XLSX)
.sheet("账目明细") .sheet("账目明细")
.registerWriteHandler(new CustomCellStyleHandler()) .registerWriteHandler(new CustomCellStyleHandler())
.registerWriteHandler(new MergeSameRowCellsHandler())
.doWrite(data); .doWrite(data);
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("账目", StandardCharsets.UTF_8.name())); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("账目", StandardCharsets.UTF_8.name()));

View File

@ -0,0 +1,141 @@
package cn.iocoder.yudao.module.bpm.service.financialpayment;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.List;
public class MergeSameRowCellsHandler implements CellWriteHandler {
private int currentRowIndex = -1;
private Object lastValue = null;
private int startMergeColumnIndex = 0;
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
if (relativeRowIndex != null && relativeRowIndex != currentRowIndex) {
flushLastMerge(writeSheetHolder); // 处理上一行最后未合并的列
reset();
currentRowIndex = relativeRowIndex;
}
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
if (isHead != null && isHead) {
return;
}
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
Sheet sheet = writeSheetHolder.getSheet();
Object currentValue = getCellValue(cell);
// 确保是当前行才处理
if (relativeRowIndex != currentRowIndex) {
flushLastMerge(writeSheetHolder);
reset();
currentRowIndex = relativeRowIndex;
}
if (lastValue == null) {
startMergeColumnIndex = cell.getColumnIndex();
} else if (!currentValue.equals(lastValue)) {
int endMergeColumnIndex = cell.getColumnIndex() - 1;
if (startMergeColumnIndex < endMergeColumnIndex) {
try {
sheet.addMergedRegion(new CellRangeAddress(
currentRowIndex, currentRowIndex,
startMergeColumnIndex, endMergeColumnIndex
));
setCellStyle(workbook, sheet, currentRowIndex, startMergeColumnIndex, endMergeColumnIndex);
} catch (Exception ignored) {}
}
startMergeColumnIndex = cell.getColumnIndex();
}
lastValue = currentValue;
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
flushLastMerge(writeSheetHolder);
}
private void flushLastMerge(WriteSheetHolder writeSheetHolder) {
Sheet sheet = writeSheetHolder.getSheet();
Row row = sheet.getRow(currentRowIndex);
if (row == null || currentRowIndex < 0) {
return;
}
int lastCellNum = row.getLastCellNum();
if (lastCellNum <= 0) {
return;
}
int endMergeColumnIndex = lastCellNum - 1;
if (startMergeColumnIndex < endMergeColumnIndex) {
try {
sheet.addMergedRegion(new CellRangeAddress(
currentRowIndex, currentRowIndex,
startMergeColumnIndex, endMergeColumnIndex
));
setCellStyle(writeSheetHolder.getSheet().getWorkbook(), sheet, currentRowIndex, startMergeColumnIndex, endMergeColumnIndex);
} catch (Exception ignored) {}
}
}
private void setCellStyle(Workbook workbook, Sheet sheet, int rowIndex, int startCol, int endCol) {
CellStyle style = createMergedCellStyle(workbook);
Row row = sheet.getRow(rowIndex);
if (row != null) {
Cell firstCell = row.getCell(startCol);
if (firstCell != null) {
firstCell.setCellStyle(style);
}
}
}
private Object getCellValue(Cell cell) {
if (cell == null) {
return null;
}
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue();
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
return cell.getDateCellValue();
} else {
double value = cell.getNumericCellValue();
return value == (long) value ? (long) value : value;
}
case BOOLEAN:
return cell.getBooleanCellValue();
case FORMULA:
return cell.getCellFormula();
case BLANK:
return "";
default:
return null;
}
}
private CellStyle createMergedCellStyle(Workbook workbook) {
CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
return style;
}
private void reset() {
lastValue = null;
startMergeColumnIndex = 0;
}
}