diff --git a/pom.xml b/pom.xml
index 1606168..86301eb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,6 +54,19 @@
+
+
+ com.itextpdf
+ itext7-core
+ 7.2.5
+
+
+ com.itextpdf
+ font-asian
+ 7.2.5
+
+
+
com.baomidou
mybatis-plus-spring-boot3-starter
diff --git a/src/main/java/com/gunshi/project/hsz/controller/ForecastProjectController.java b/src/main/java/com/gunshi/project/hsz/controller/ForecastProjectController.java
index d35df2b..7939a9a 100644
--- a/src/main/java/com/gunshi/project/hsz/controller/ForecastProjectController.java
+++ b/src/main/java/com/gunshi/project/hsz/controller/ForecastProjectController.java
@@ -17,6 +17,8 @@ import com.gunshi.project.hsz.validate.markers.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@@ -27,13 +29,17 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
/**
* 描述: 预报_预测方案管理表
@@ -43,6 +49,7 @@ import java.util.stream.Collectors;
@Tag(name = "预报_预测方案管理表")
@RestController
@RequestMapping(value="/forecastProject")
+@Slf4j
public class ForecastProjectController {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -175,4 +182,66 @@ public class ForecastProjectController {
}
return R.ok(forecastProject);
}
+
+
+ @Operation(summary = "pdf导出")
+ @GetMapping("export")
+ public void export(@RequestParam("ids") List ids, HttpServletResponse response) {
+ try {
+ // 设置响应头
+ response.setContentType("application/zip");
+ response.setHeader("Content-Disposition", "attachment; filename=\"forecast_reports.zip\"");
+
+ // 创建ZIP输出流
+ ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
+
+
+ for (String projectId : ids) {
+ ForecastProject forecastProject = service.getById(projectId);
+ if (Objects.isNull(forecastProject)) {
+ throw new IllegalArgumentException("当前数据不存在");
+ }
+ List resultList = forecastResultsService.list(new QueryWrapper().eq("project_id", projectId).orderBy(true, true, "tm"));
+ if (CollectionUtils.isNotEmpty(resultList)) {
+ List vos = resultList.stream()
+ .map(result -> {
+ ForecastResultVo vo = new ForecastResultVo();
+ vo.setTm(sdf.format(result.getTm()));
+ vo.setYcRkQValue(result.getYcRkQValue());
+ vo.setRealRkQValue(result.getRealRkQValue());
+ vo.setYcCkQValue(result.getYcCkQValue());
+ vo.setRealCkQValue(result.getRealCkQValue());
+ vo.setYcSwHValue(result.getYcSwHValue());
+ vo.setRealSwHValue(result.getRealSwHValue());
+ BigDecimal ycSwHValue = result.getYcSwHValue() == null ? BigDecimal.ZERO : result.getYcSwHValue();
+ BigDecimal realSwHValue = result.getRealSwHValue() == null ? BigDecimal.ZERO : result.getRealSwHValue();
+ vo.setSwHDValue(ycSwHValue.subtract(realSwHValue));// 处理预测与实测水位差
+ vo.setDrp(result.getDrp());
+ vo.setIspreDrp(result.getIspreDrp());
+ vo.setR(result.getR());
+ vo.setFlLowLimLev(result.getFlLowLimLev());
+ vo.setCurrentYdgdyjz(result.getCurrentYdgdyjz());
+ vo.setPa(result.getPa());
+ return vo;
+ }).collect(Collectors.toList());
+ forecastProject.setVoList(vos);
+ forecastResultsService.handleVoList(forecastProject);
+ }
+ //进行pdf导出
+ // 为每个项目生成PDF
+ String fileName = "预报报告_" + forecastProject.getName() + "_" +
+ new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".pdf";
+ // 添加到ZIP
+ zipOut.putNextEntry(new ZipEntry(fileName));
+ service.generatePdf(forecastProject, zipOut);
+ zipOut.closeEntry();
+ }
+ zipOut.finish();
+ zipOut.close();
+ } catch (IOException e) {
+ log.error("PDF导出失败", e);
+ throw new RuntimeException("导出失败: " + e.getMessage());
+ }
+
+ }
}
diff --git a/src/main/java/com/gunshi/project/hsz/service/ForecastProjectService.java b/src/main/java/com/gunshi/project/hsz/service/ForecastProjectService.java
index edef942..599e397 100644
--- a/src/main/java/com/gunshi/project/hsz/service/ForecastProjectService.java
+++ b/src/main/java/com/gunshi/project/hsz/service/ForecastProjectService.java
@@ -6,15 +6,42 @@ import com.gunshi.project.hsz.entity.vo.ForecastResultVo;
import com.gunshi.project.hsz.mapper.ForecastProjectMapper;
import com.gunshi.project.hsz.model.ForecastProject;
import com.gunshi.project.hsz.model.ForecastResults;
+import com.itextpdf.io.font.PdfEncodings;
+import com.itextpdf.kernel.colors.DeviceRgb;
+import com.itextpdf.kernel.events.Event;
+import com.itextpdf.kernel.events.IEventHandler;
+import com.itextpdf.kernel.events.PdfDocumentEvent;
+import com.itextpdf.kernel.font.PdfFont;
+import com.itextpdf.kernel.font.PdfFontFactory;
+import com.itextpdf.kernel.geom.PageSize;
+import com.itextpdf.kernel.geom.Rectangle;
+import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfPage;
+import com.itextpdf.kernel.pdf.PdfWriter;
+import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
+import com.itextpdf.layout.Canvas;
+import com.itextpdf.layout.Document;
+import com.itextpdf.layout.element.Cell;
+import com.itextpdf.layout.element.Paragraph;
+import com.itextpdf.layout.element.Table;
+import com.itextpdf.layout.properties.TextAlignment;
+import com.itextpdf.layout.properties.UnitValue;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
+import java.util.zip.ZipOutputStream;
/**
* 描述: 预报_预测方案管理表
@@ -63,6 +90,118 @@ public class ForecastProjectService extends ServiceImpl