Browse Source

研判分析报告--接口拆分,排查循环依赖

master
buaixuexideshitongxue 2 weeks ago
parent
commit
7448567d90
  1. 5
      src/main/java/com/biutag/supervision/controller/work/NegativeController.java
  2. 28
      src/main/java/com/biutag/supervision/controller/work/NegativeReportController.java
  3. 62
      src/main/java/com/biutag/supervision/service/NegativeService.java
  4. 5
      src/main/java/com/biutag/supervision/service/negativeReport/NegativeReportService.java
  5. 58
      src/main/java/com/biutag/supervision/service/negativeReport/NegativeReportServiceImpl.java

5
src/main/java/com/biutag/supervision/controller/work/NegativeController.java

@ -302,10 +302,5 @@ public class NegativeController {
return Result.success(); return Result.success();
} }
@Operation(summary = "生成研判分析报告")
@PostMapping("/generateReport")
public void generateReport(@RequestBody ReportGenerationRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
negativeService.generateReport(request, response);
}
} }

28
src/main/java/com/biutag/supervision/controller/work/NegativeReportController.java

@ -0,0 +1,28 @@
package com.biutag.supervision.controller.work;
import com.biutag.supervision.pojo.param.NegativeQueryParam;
import com.biutag.supervision.service.negativeReport.NegativeReportService;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.UnsupportedEncodingException;
@RequiredArgsConstructor
@RequestMapping("negative")
@RestController
public class NegativeReportController {
private final NegativeReportService negativeReportService;
@Operation(summary = "生成研判分析报告")
@PostMapping("/generateReport")
public void generateReport(@RequestBody NegativeQueryParam request, HttpServletResponse response) throws UnsupportedEncodingException {
negativeReportService.generateReport(request, response);
}
}

62
src/main/java/com/biutag/supervision/service/NegativeService.java

@ -27,37 +27,24 @@ import com.biutag.supervision.pojo.dto.NegativeDto;
import com.biutag.supervision.pojo.dto.flow.FirstDistributeData; import com.biutag.supervision.pojo.dto.flow.FirstDistributeData;
import com.biutag.supervision.pojo.dto.flow.VerifyData; import com.biutag.supervision.pojo.dto.flow.VerifyData;
import com.biutag.supervision.pojo.dto.jwdc.NegativeApiDto; import com.biutag.supervision.pojo.dto.jwdc.NegativeApiDto;
import com.biutag.supervision.pojo.dto.report.ReportViewModel;
import com.biutag.supervision.pojo.entity.*; import com.biutag.supervision.pojo.entity.*;
import com.biutag.supervision.pojo.model.UserAuth; import com.biutag.supervision.pojo.model.UserAuth;
import com.biutag.supervision.pojo.request.negative.ReportGenerationRequest;
import com.biutag.supervision.pojo.vo.NegativeFileVo; import com.biutag.supervision.pojo.vo.NegativeFileVo;
import com.biutag.supervision.service.report.ReportDataService;
import com.biutag.supervision.util.ChartRenderUtil;
import com.biutag.supervision.util.SpringUtil; import com.biutag.supervision.util.SpringUtil;
import com.biutag.supervision.util.TimeUtil; import com.biutag.supervision.util.TimeUtil;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.Pictures;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StreamUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.biutag.supervision.constants.AppConstants.*; import static com.biutag.supervision.constants.AppConstants.JWPY_DEPARTID;
import static com.biutag.supervision.constants.AppConstants.JWPY_DEPART_NAME;
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@ -94,7 +81,6 @@ public class NegativeService extends ServiceImpl<NegativeMapper, Negative> {
private final NegativeCountersignApplyService countersignApplyService; private final NegativeCountersignApplyService countersignApplyService;
private final ReportDataService reportDataService;
public NegativeDetail get(String id, Integer workId) { public NegativeDetail get(String id, Integer workId) {
Negative negative = getById(id); Negative negative = getById(id);
@ -494,48 +480,4 @@ public class NegativeService extends ServiceImpl<NegativeMapper, Negative> {
public void generateReport(ReportGenerationRequest request, HttpServletResponse response) {
// 你要返回的模板路径
String templatePath = "static/templates/督审一体化平台研判分析报告.docx";
ClassPathResource resource = new ClassPathResource(templatePath);
if (!resource.exists()) {
// 资源不存在,返回 404
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
response.setContentType("application/json;charset=UTF-8");
try {
response.getWriter().write("{\"message\":\"模板文件不存在: " + templatePath + "\"}");
} catch (IOException ignored) {}
return;
}
// 1) 准备模板变量(含图表)
ReportViewModel vm = reportDataService.buildViewModel(request);
// 2) 响应头(docx 正确类型)
String downloadName = "督审一体化平台研判分析报告.docx";
String encoded = URLEncoder.encode(downloadName, StandardCharsets.UTF_8).replaceAll("\\+", "%20");
String contentDisposition = "attachment; filename=\"" + encoded + "\"; filename*=UTF-8''" + encoded;
response.reset();
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", contentDisposition);
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
// 3) 关键:compile + render + write(不要 StreamUtils.copy)
try (InputStream in = resource.getInputStream();
XWPFTemplate template = XWPFTemplate.compile(in).render(vm);
ServletOutputStream out = response.getOutputStream()) {
template.write(out);
out.flush();
} catch (Exception e) {
log.error("生成/下载报告失败", e);
// 如果你们有统一异常处理,可以直接抛出去
// throw new RuntimeException("生成报告失败", e);
}
}
} }

5
src/main/java/com/biutag/supervision/service/negativeReport/NegativeReportService.java

@ -1,4 +1,9 @@
package com.biutag.supervision.service.negativeReport; package com.biutag.supervision.service.negativeReport;
import com.biutag.supervision.pojo.param.NegativeQueryParam;
import jakarta.servlet.http.HttpServletResponse;
public interface NegativeReportService { public interface NegativeReportService {
void generateReport(NegativeQueryParam request, HttpServletResponse response);
} }

58
src/main/java/com/biutag/supervision/service/negativeReport/NegativeReportServiceImpl.java

@ -1,10 +1,22 @@
package com.biutag.supervision.service.negativeReport; package com.biutag.supervision.service.negativeReport;
import com.biutag.supervision.pojo.dto.report.ReportViewModel;
import com.biutag.supervision.pojo.param.NegativeQueryParam;
import com.biutag.supervision.service.report.ReportDataService;
import com.deepoove.poi.XWPFTemplate;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
/** /**
* @ClassName NegativeReportServiceImpl * @ClassName NegativeReportServiceImpl
* @Description TODO * @Description TODO
@ -17,4 +29,50 @@ import org.springframework.stereotype.Service;
@Schema(description = "研判分析报告") @Schema(description = "研判分析报告")
public class NegativeReportServiceImpl implements NegativeReportService { public class NegativeReportServiceImpl implements NegativeReportService {
private final ReportDataService reportDataService;
public void generateReport(NegativeQueryParam request, HttpServletResponse response) {
// 你要返回的模板路径
String templatePath = "static/templates/督审一体化平台研判分析报告.docx";
ClassPathResource resource = new ClassPathResource(templatePath);
if (!resource.exists()) {
// 资源不存在,返回 404
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
response.setContentType("application/json;charset=UTF-8");
try {
response.getWriter().write("{\"message\":\"模板文件不存在: " + templatePath + "\"}");
} catch (IOException ignored) {}
return;
}
// 1) 准备模板变量(含图表)
ReportViewModel vm = reportDataService.buildViewModel(request);
// 2) 响应头(docx 正确类型)
String downloadName = "督审一体化平台研判分析报告.docx";
String encoded = URLEncoder.encode(downloadName, StandardCharsets.UTF_8).replaceAll("\\+", "%20");
String contentDisposition = "attachment; filename=\"" + encoded + "\"; filename*=UTF-8''" + encoded;
response.reset();
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", contentDisposition);
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
// 3) 关键:compile + render + write(不要 StreamUtils.copy)
try (InputStream in = resource.getInputStream();
XWPFTemplate template = XWPFTemplate.compile(in).render(vm);
ServletOutputStream out = response.getOutputStream()) {
template.write(out);
out.flush();
} catch (Exception e) {
log.error("生成/下载报告失败", e);
// 如果你们有统一异常处理,可以直接抛出去
// throw new RuntimeException("生成报告失败", e);
}
}
} }

Loading…
Cancel
Save