package com.ruoyi.bussiness.service.impl;
|
|
import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
import cn.afterturn.easypoi.excel.entity.ExportParams;
|
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
|
import cn.hutool.core.io.resource.ClassPathResource;
|
import cn.hutool.core.util.ObjUtil;
|
import cn.hutool.json.JSONUtil;
|
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.ExcelWriter;
|
import com.alibaba.excel.write.metadata.WriteSheet;
|
import com.alibaba.excel.write.metadata.fill.FillConfig;
|
import com.ruoyi.bussiness.object.request.report.DetailExportsRequest;
|
import com.ruoyi.bussiness.object.request.report.DetailPageRequest;
|
import com.ruoyi.bussiness.object.request.report.ReportPageRequest;
|
import com.ruoyi.bussiness.object.response.report.*;
|
import com.ruoyi.bussiness.service.PlacementBatchHouseholdService;
|
import com.ruoyi.bussiness.service.ReportService;
|
import com.ruoyi.bussiness.utils.PaymentCycleHelper;
|
import com.ruoyi.common.utils.file.FileUtils;
|
import org.apache.poi.ss.usermodel.Workbook;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.*;
|
import java.util.*;
|
|
@Service
|
public class ReportServiceImpl implements ReportService {
|
|
@Autowired
|
private PlacementBatchHouseholdService placementBatchHouseholdService;
|
|
@Override
|
public ReportPageResponse page(ReportPageRequest request) {
|
//生成季度
|
List<String> quarters = PaymentCycleHelper.getQuarterlyPaymentCyclesList(new Date());
|
request.setQuarters(quarters);
|
|
ReportPageResponse response = placementBatchHouseholdService.reportPage(request);
|
//汇总数据
|
ReportSumResponse reportSumResponse = placementBatchHouseholdService.sumHousehold(request.getStreet());
|
response.setReportSumResponse(reportSumResponse);
|
response.setQuarters(quarters);
|
return response;
|
}
|
|
@Override
|
public DetailPageResponse detail(DetailPageRequest request) {
|
ReportSumResponse reportSumResponse = placementBatchHouseholdService.sumHousehold(request.getStreet());
|
|
DetailPageResponse response = placementBatchHouseholdService.detailPage(request);
|
response.setReportSumResponse(reportSumResponse);
|
if(ObjUtil.isEmpty(response.getRecords())){
|
return response;
|
}
|
for(DetailResponse item : response.getRecords()){
|
if(ObjUtil.isNotEmpty(item.getCompensationPayTime())){
|
String cycle = PaymentCycleHelper.getFirstPaymentCycle(item.getCompensationPayTime());
|
item.setCycle(cycle);
|
}
|
}
|
return response;
|
}
|
|
@Override
|
public void exports(DetailExportsRequest request, HttpServletResponse response) throws IOException {
|
// 1. 读取模板
|
ClassPathResource resource = new ClassPathResource("templates/bjd.xlsx");
|
InputStream templateFile = resource.getStream();
|
|
// 2. 创建输出流
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
try (ExcelWriter writer = EasyExcel.write(out).withTemplate(templateFile).build()) {
|
WriteSheet sheet = EasyExcel.writerSheet("Sheet1").build();
|
|
// 3. **填充季度表头**
|
List<String> quarters = PaymentCycleHelper.getQuarterlyPaymentCyclesList(new Date());
|
request.setQuarters(quarters);
|
|
Map<String, Object> header = new HashMap<>();
|
for (int i = 0; i < quarters.size(); i++) {
|
header.put("key" + (i + 1), quarters.get(i)); // 确保和 `{key1}` ~ `{key20}` 匹配
|
}
|
writer.fill(header, sheet);
|
|
// 4. **填充数据**
|
List<Map<String, Object>> dataList = placementBatchHouseholdService.reportExportsList(request);
|
if (dataList == null || dataList.isEmpty()) {
|
throw new RuntimeException("导出数据为空");
|
}
|
|
FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
|
writer.fill(dataList, fillConfig, sheet);
|
|
} finally {
|
templateFile.close();
|
}
|
|
// 5. **设置响应头**
|
FileUtils.setExcelResponseHeader(response, "各季度应付款明细列表.xlsx");
|
|
// 6. **输出到浏览器**
|
try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream())) {
|
bufferedOutputStream.write(out.toByteArray());
|
bufferedOutputStream.flush();
|
}
|
}
|
|
}
|