admin-server/src/main/java/com/estate/expert/admin/service/impl/ReportServiceImpl.java
@@ -48,6 +48,8 @@ @Service public class ReportServiceImpl implements ReportService { private static final String DAIGUAN_TECH_REMARK = "岱观科技"; private static final String DAIGUAN_SYSTEM_TEMPLATE_FILE = "第三方评估报告new.docx"; private static final String DAIGUAN_REMARK = "岱观科技"; private static final String DAIGUAN_DEVICE_TEMPLATE_FILE = "设备风险评估报告new.docx"; @@ -192,6 +194,9 @@ BizResultCode.BIZ_REPORT_TEMPLATE_NOT_EXIST.check(reportTemplate == null); switch (reportTemplate.getType()) { case ThirdPartyReport: if (isDaiguanTechTemplate(reportTemplate)) { return new SystemReportBuilder(userFileService, DAIGUAN_SYSTEM_TEMPLATE_FILE); } return new SystemReportBuilder(userFileService); case DeviceReport: if (DAIGUAN_REMARK.equals(reportTemplate.getRemark())) { @@ -467,6 +472,13 @@ return reportTemplate != null && DAIGUAN_REMARK.equals(reportTemplate.getRemark()); } private boolean isDaiguanTechTemplate(ReportTemplate reportTemplate) { if (reportTemplate == null || reportTemplate.getRemark() == null) { return false; } return DAIGUAN_TECH_REMARK.equals(reportTemplate.getRemark().trim()); } private long countProjectChecks(Integer projectId) { if (projectId == null) { return 0L; admin-server/src/main/java/com/estate/expert/admin/stat/report/builder/SystemReportBuilder.java
@@ -13,7 +13,6 @@ import com.estate.expert.admin.stat.report.render.AbstractInfoTablePolicy; import com.estate.expert.admin.stat.report.render.CheckInfoTablePolicy; import com.estate.expert.admin.stat.report.render.CustomPictureRenderPolicy; import lombok.AllArgsConstructor; import org.springframework.core.io.ClassPathResource; import org.springframework.util.CollectionUtils; @@ -24,10 +23,22 @@ /** * 第三方评估报告构建器 */ @AllArgsConstructor public class SystemReportBuilder implements ReportBuilderBase { private static final String DEFAULT_TEMPLATE_FILE = "第三方评估报告.docx"; protected UserFileService userFileService; private final String templateFile; public SystemReportBuilder(UserFileService userFileService) { this(userFileService, DEFAULT_TEMPLATE_FILE); } public SystemReportBuilder(UserFileService userFileService, String templateFile) { this.userFileService = userFileService; this.templateFile = templateFile; } /** * 构建第三方评估报告 @@ -37,7 +48,7 @@ */ @Override public XWPFTemplate buildReport(JSONObject data, Map<String, Integer> templateConfig) { var res = new ClassPathResource("templates/第三方评估报告.docx"); var res = new ClassPathResource("templates/" + templateFile); var viewConfig = templateConfig != null ? toViewConfig(templateConfig) : null; var builder = initConfig(viewConfig); @@ -77,6 +88,7 @@ private ConfigureBuilder initConfig(Map<String, Boolean> viewConfig){ ConfigureBuilder builder = Configure.builder(); builder.bind("data.设备信息", new LoopRowTableRenderPolicy()); builder.bind("data.设备分组信息", new LoopRowTableRenderPolicy()); builder.bind("data.评估结果.隐患等级分布.分项", new LoopRowTableRenderPolicy()); builder.bind("分项评估", new CheckInfoTablePolicy()); @@ -107,10 +119,15 @@ * @param dataMap 数据映射 */ private void initChart(JSONObject data, Map<String, Object> dataMap){ var checkCategories = data.getJSONObject("评估结果").getJSONArray("检查项"); var evalResult = data.getJSONObject("评估结果"); var checkCategories = evalResult.getJSONArray("检查项"); if(checkCategories == null) return; var safetyCategories = new JSONArray(); for (var c : checkCategories){ var co = (JSONObject)c; var name = co.getString("名称"); if(name != null && name.contains("安全")) safetyCategories.add(co); var pieChart = buildPieChart(co); if(pieChart!=null) co.put("问题分布饼图", pieChart); @@ -118,6 +135,9 @@ if(barChart!=null) co.put("问题分布直方图", barChart); } if(safetyCategories.isEmpty() && !checkCategories.isEmpty()) safetyCategories.add(checkCategories.get(0)); evalResult.put("安全检查项", safetyCategories); } /** admin-server/src/main/java/com/estate/expert/admin/stat/report/data/DaiguanDeviceReportData.java
@@ -67,7 +67,7 @@ /** * 按设备类型汇总设备信息,供新版设备报告使用。 */ private List<Object> buildDeviceGroupInfo() { protected List<Object> buildDeviceGroupInfo() { Map<String, List<Device>> groupedDevices = devices.stream() .sorted(Comparator.comparing(device -> device.getType() != null ? device.getType().ordinal() : Integer.MAX_VALUE)) .collect(java.util.stream.Collectors.groupingBy( admin-server/src/main/java/com/estate/expert/admin/stat/report/data/ReportDataBase.java
@@ -16,6 +16,7 @@ import org.springframework.util.StringUtils; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -45,6 +46,7 @@ var result = buildReportInfo(); result.put("工程概况", buildProjectInfo()); result.put("设备信息", buildDeviceInfo()); result.put("设备分组信息", buildDeviceGroupInfo()); result.put("评估结果", buildEvalInfo()); return result; } @@ -61,9 +63,11 @@ */ protected JSONObject buildReportInfo() { JSONObject result = new JSONObject(); var reportDate = LocalDate.now(); result.put("项目名称", project.getName()); result.put("报告编号", template.getNumber() + "-" + String.format("%08d", reportId)); result.put("报告日期", LocalDate.now()); result.put("报告日期", reportDate); result.put("报告日期中文", reportDate.format(DateTimeFormatter.ofPattern("yyyy年M月d日"))); result.put("公司名称", "四川信立隆第三方评估咨询有限公司"); return result; } @@ -92,6 +96,40 @@ } /** * 按设备类型汇总设备信息,供新版报告模板使用 * @return 设备分组信息 */ protected List<Object> buildDeviceGroupInfo() { Map<String, List<Device>> groupedDevices = devices.stream() .sorted(Comparator.comparing(device -> device.getType() != null ? device.getType().ordinal() : Integer.MAX_VALUE)) .collect(Collectors.groupingBy( device -> device.getType() != null ? device.getType().getDesc() : "", LinkedHashMap::new, Collectors.toList() )); List<Object> groupInfos = new ArrayList<>(); groupedDevices.forEach((deviceType, groupDevices) -> { var deviceNumbers = groupDevices.stream() .map(Device::getManufacturerNumber) .filter(StringUtils::hasText) .collect(Collectors.toList()); if (deviceNumbers.isEmpty()) { deviceNumbers.add(""); } for (int i = 0; i < deviceNumbers.size(); i++) { JSONObject groupInfo = new JSONObject(); groupInfo.put("设备类型", i == 0 ? deviceType : ""); groupInfo.put("设备数量", i == 0 ? groupDevices.size() : ""); groupInfo.put("设备编号", deviceNumbers.get(i)); groupInfos.add(groupInfo); } }); return groupInfos; } /** * 构建错误级别 * @param node 节点 * @return 错误级别 @@ -114,6 +152,10 @@ info.put("比例", formatPercent(count * 1.0 / totalErrors)); errorInfos.add(info); } result.put("一级隐患数量", node.getData().getTotalErrorCounts()[0]); result.put("二级隐患数量", node.getData().getTotalErrorCounts()[1]); result.put("三级隐患数量", node.getData().getTotalErrorCounts()[2]); result.put("四级隐患数量", node.getData().getTotalErrorCounts()[3]); result.put("分项", errorInfos); return result; } admin-server/src/main/resources/templates/第三方评估报告new.docxBinary files differ