diff --git a/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportBriefResultDTO.java b/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportBriefResultDTO.java new file mode 100644 index 0000000000..be5f3df667 --- /dev/null +++ b/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/dtos/result/JiMuReportBriefResultDTO.java @@ -0,0 +1,17 @@ +package com.epmet.commons.feignclient.dtos.result; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 报表简要信息result dto + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class JiMuReportBriefResultDTO { + private String id; + private String code; + private String name; +} diff --git a/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/JiMuReportOpenFeignClient.java b/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/JiMuReportOpenFeignClient.java index 08b07c0dab..009c68c2c8 100644 --- a/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/JiMuReportOpenFeignClient.java +++ b/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/JiMuReportOpenFeignClient.java @@ -3,6 +3,7 @@ package com.epmet.commons.feignclient.feigns; import com.epmet.commons.feignclient.dtos.JiMuPage; import com.epmet.commons.feignclient.dtos.JiMuResult; import com.epmet.commons.feignclient.dtos.form.JimuReportExportRequestDTO; +import com.epmet.commons.feignclient.dtos.result.JiMuReportBriefResultDTO; import com.epmet.commons.feignclient.dtos.result.JiMuReportDetailResultDTO; import com.epmet.commons.feignclient.dtos.result.JimuReportDbDataResultDTO; import com.epmet.commons.feignclient.dtos.result.JimuReportFieldTreeResultDTO; @@ -44,4 +45,11 @@ public interface JiMuReportOpenFeignClient { @PostMapping("jmreport/exportAllExcelStream") Response exportAllExcelStream(JimuReportExportRequestDTO param); + + /** + * 报表简要信息 + * @return + */ + @GetMapping("jmreport/get/{report-id}") + JiMuResult getReportBrief(@PathVariable("report-id") String reportId); } diff --git a/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallback.java b/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallback.java index b1c793d560..9158a6858c 100644 --- a/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallback.java +++ b/epmet-commons/epmet-commons-feignclient/src/main/java/com/epmet/commons/feignclient/feigns/fallback/JiMuReportOpenFeignClientFallback.java @@ -3,6 +3,7 @@ package com.epmet.commons.feignclient.feigns.fallback; import com.epmet.commons.feignclient.dtos.JiMuPage; import com.epmet.commons.feignclient.dtos.JiMuResult; import com.epmet.commons.feignclient.dtos.form.JimuReportExportRequestDTO; +import com.epmet.commons.feignclient.dtos.result.JiMuReportBriefResultDTO; import com.epmet.commons.feignclient.dtos.result.JiMuReportDetailResultDTO; import com.epmet.commons.feignclient.dtos.result.JimuReportDbDataResultDTO; import com.epmet.commons.feignclient.dtos.result.JimuReportFieldTreeResultDTO; @@ -48,4 +49,10 @@ public class JiMuReportOpenFeignClientFallback implements JiMuReportOpenFeignCli JiMuResult rst = new JiMuResult<>(false, "请求失败", 200, null,null); return rst; } + + @Override + public JiMuResult getReportBrief(String reportID) { + JiMuResult rst = new JiMuResult<>(false, "请求失败", 200, null,null); + return rst; + } } diff --git a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcCustomerReportServiceImpl.java b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcCustomerReportServiceImpl.java index f88fd01ee9..27450721d8 100644 --- a/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcCustomerReportServiceImpl.java +++ b/epmet-module/oper-customize/oper-customize-server/src/main/java/com/epmet/service/impl/IcCustomerReportServiceImpl.java @@ -9,10 +9,7 @@ import com.epmet.commons.feignclient.dtos.JiMuPage; import com.epmet.commons.feignclient.dtos.JiMuResult; import com.epmet.commons.feignclient.dtos.form.JiMuReportFormDTO; import com.epmet.commons.feignclient.dtos.form.JimuReportExportRequestDTO; -import com.epmet.commons.feignclient.dtos.result.JiMuReportDetailResultDTO; -import com.epmet.commons.feignclient.dtos.result.JiMuReportResultDTO; -import com.epmet.commons.feignclient.dtos.result.JimuReportDbDataResultDTO; -import com.epmet.commons.feignclient.dtos.result.JimuReportFieldTreeResultDTO; +import com.epmet.commons.feignclient.dtos.result.*; import com.epmet.commons.feignclient.feigns.JiMuReportOpenFeignClient; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.*; @@ -280,14 +277,18 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl>> fResult = jiMuReportOpenFeignClient.fieldTree(reportId); String datasourceId = fResult.getResult().get(0).get(0).getDbId(); - // 根据数据源ID查询数据源信息 + // 报表数据源信息 JiMuResult dbData = jiMuReportOpenFeignClient.loadDbData(datasourceId); JimuReportDbDataResultDTO.ReportDB reportDb = dbData.getResult().getReportDb(); + // 报表简要信息 + JiMuResult reportBriefResult = jiMuReportOpenFeignClient.getReportBrief(reportId); + JiMuReportBriefResultDTO reportBrief = reportBriefResult.getResult(); + // api的url String apiUrl = reportDb.getApiUrl(); // api方法 @@ -296,29 +297,34 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl ids = listIds(bizId, paramKey, apiUrl, isHttps, idFieldName); + HashMap idAndNames = listBizObjectIdAndName(bizId, paramKey, apiUrl, isHttps, idFieldName, nameFieldName); // 3. 然后以这一列作为查询条件,循环,继续调用该接口,得到单条数据,每一条数据都下载一个excel,最后将其打包为一个压缩包下载 Path storePath = makeTemporaryDownloadDir(reportId); // 4.生成压缩文件 - Path zipFile = downloadAndComppress(storePath, reportId, reportDb.getDbChName(), paramKey, ids); + Path zipFile = downloadAndComppress(storePath, reportId, reportBrief.getName(), paramKey, idAndNames); // 5.下载 try (FileInputStream fis = new FileInputStream(zipFile.toFile())) { @@ -342,10 +348,9 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl ids) { + private Path downloadAndComppress(Path storePath, String reportId, String reportName, String paramKey, HashMap idAndNames) { // 请求头 Map headers = new HashMap<>(); headers.put(Constant.AUTHORIZATION_HEADER, EpmetRequestHolder.getHeader(Constant.AUTHORIZATION_HEADER)); @@ -360,7 +365,7 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl files = new ArrayList<>(); + HashMap files = new HashMap<>(); String currentTimeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")); @@ -373,13 +378,15 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl> idParts = ListUtils.partition(ids, 100); + ArrayList idList = new ArrayList<>(); + idList.addAll(idAndNames.keySet()); + List> idParts = ListUtils.partition(idList, 100); // 1. 循环下载所有id对应的excel CountDownLatch cdl = new CountDownLatch(idParts.size()); for (List idPart : idParts) { CompletableFuture.runAsync(() -> { - downloadXlsByBatchByBizId(reportId, idPart, param, xlsxStorePath, files, cdl); + downloadXlsByBatchByBizId(reportId, idPart, idAndNames, param, xlsxStorePath, files, cdl); }, executorService); } @@ -397,9 +404,17 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl bizObjNameAndCount = new HashMap<>(32); + for (Map.Entry entry : files.entrySet()) { + String bizObjectId = entry.getKey(); + File file = entry.getValue(); + + String bizObjName = idAndNames.get(bizObjectId); + + bizObjName = getBizObjName(bizObjNameAndCount, bizObjName); + try (final FileInputStream fis = new FileInputStream(file.getAbsolutePath())) { - zos.putNextEntry(new ZipEntry(reportName + "_" + currentTimeStr + "/" + file.getName())); + zos.putNextEntry(new ZipEntry(String.format("%s_%s/%s_%s.xlsx", reportName, currentTimeStr, reportName, bizObjName))); final byte[] buffer = new byte[10240]; for (int len; (len = fis.read(buffer)) > 0; ) { zos.write(buffer, 0, len); @@ -421,6 +436,22 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl bizObjNameAndCount, String bizObjName) { + Integer nameCount = bizObjNameAndCount.get(bizObjName); + if (nameCount == null) { + nameCount = 1; + bizObjNameAndCount.put(bizObjName, nameCount); + } else { + bizObjNameAndCount.put(bizObjName, ++nameCount); + } + + if (nameCount > 1) { + bizObjName = String.format("%s(%d)", bizObjName, nameCount); + } + + return bizObjName; + } + /** * 批量下载xlsx * @param reportId @@ -429,7 +460,7 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl bizIds, JimuReportExportRequestDTO param, Path xlsxStorePath, ArrayList files, + public void downloadXlsByBatchByBizId(String reportId, List bizIds, Map idAndNames, JimuReportExportRequestDTO param, Path xlsxStorePath, Map files, CountDownLatch cdl) { for (String id : bizIds) { @@ -456,7 +487,7 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl listIds(String id, String paramKey, String apiUrl, boolean isHttps, String idFieldName) { + public HashMap listBizObjectIdAndName(String id, String paramKey, String apiUrl, boolean isHttps, String idFieldName, String nameFieldName) { apiUrl = apiUrl.replace("'${id}'", id == null ? "" : id); apiUrl = apiUrl.replace("'${paramKey}'", paramKey); @@ -526,7 +557,7 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl ids = new ArrayList<>(); + HashMap idAndNames = new HashMap<>(); if (data instanceof JSONObject) { // 这种可能是pageData的 @@ -539,8 +570,10 @@ public class IcCustomerReportServiceImpl extends BaseServiceImpl it = array.listIterator(); it.hasNext(); ) { JSONObject e = (JSONObject) it.next(); - ids.add(e.getString(idFieldName)); + String idValue = e.getString(idFieldName); + String nameValue = e.getString(nameFieldName); + idAndNames.put(idValue, nameValue); } - return ids; + return idAndNames; } } \ No newline at end of file