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