diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 1b6b1b15ef..a24aa8ee82 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -604,7 +604,21 @@ public class RedisKeys { return rootPrefix.concat("icform:").concat(formCode).concat(":items:").concat(customerId); } + /** + * desc:导出居民信息时 临时存储居民信息 便于其他sheet复用信息 + * @param resiId + * @return + */ public static String getExportResiBaseInfoKey(String resiId) { return rootPrefix.concat("resi:").concat("export").concat(":temp:").concat(resiId); } + + /** + * desc:获取客户的居民下载模版是否变更的key 1表示变更 0没有变更 + * @param customerId + * @return + */ + public static String getResiTempChangedKey(String customerId) { + return rootPrefix.concat("resi:").concat("export").concat(":template:changed").concat(customerId); + } } diff --git a/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java b/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java index b5c31ef82f..db8cda16cf 100644 --- a/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java +++ b/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java @@ -11,13 +11,13 @@ package com.epmet.feign; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.result.UploadImgResultDTO; -import com.epmet.feign.fallback.OssFeignClientFallback; import com.epmet.feign.fallback.OssFeignClientFallbackFactory; import feign.codec.Encoder; import feign.form.spring.SpringFormEncoder; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.context.annotation.Bean; import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; @@ -55,6 +55,15 @@ public interface OssFeignClient { @PostMapping(value ="oss/file/uploadqrcodeV2", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) Result uploadQrCodeV2(@RequestPart(value = "file") MultipartFile file, @RequestParam("customerId") String customerId); + /** + * desc:通过文件路径获取文件地址 + * @param filePath 文件路径 eg:epmet + * @param privacy 内部 外部 + * @return + */ + @GetMapping(value = "oss/file/getOssFileUrl") + Result getOssFileUrl(@RequestParam String filePath, @RequestParam String privacy); + //@Configuration class MultipartSupportConfig { diff --git a/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java b/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java index b60e59cc19..e55182a73f 100644 --- a/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java +++ b/epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java @@ -13,7 +13,6 @@ import com.epmet.commons.tools.utils.ModuleUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.dto.result.UploadImgResultDTO; import com.epmet.feign.OssFeignClient; -import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; /** @@ -40,4 +39,9 @@ public class OssFeignClientFallback implements OssFeignClient { return ModuleUtils.feignConError(ServiceConstant.EPMET_OSS_SERVER, "uploadQrCodeV2", file, customerId); } + @Override + public Result getOssFileUrl(String filePath, String privacy) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_OSS_SERVER, "download", filePath,privacy); + } + } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java index 74a38551d0..99b79d233a 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java @@ -25,17 +25,23 @@ import java.util.UUID; public abstract class AbstractCloudStorageService { /** 云存储配置信息 */ CloudStorageConfig config; + /** * desc: 获取oss域名 * * @param privacy * @return java.lang.String - * @author LiuJanJun - * @date 2021/3/30 10:05 上午 + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + public abstract String getOssDomain(String privacy); + /** + * desc: 获取oss前缀 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 */ - public String getOssDomain(String privacy){ - return null; - }; + public abstract String getOssPrefix(String privacy); /** * 文件路径 * @param prefix 前缀 diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java index c1865d8234..7c8cd5d668 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java @@ -90,6 +90,15 @@ public class AliyunCloudStorageService extends AbstractCloudStorageService { } } + @Override + public String getOssPrefix(String privacy) { + if (PrivacyType.INTERNAL.equalsIgnoreCase(privacy)) { + return config.getAliyun().getInternal().getAliyunPrefix(); + } else { + return config.getAliyun().getExternal().getAliyunPrefix(); + } + } + @Override public String upload(byte[] data, String path, String privacyType) { return upload(new ByteArrayInputStream(data), path, privacyType); diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java index 08a591e86d..a2290ec7f1 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java @@ -34,6 +34,30 @@ public class FastDFSCloudStorageService extends AbstractCloudStorageService { this.config = config; } + /** + * desc: 获取oss域名 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssDomain(String privacy) { + return config.getFastdfsDomain(); + } + + /** + * desc: 获取oss前缀 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssPrefix(String privacy) { + return null; + } + @Override public String upload(byte[] data, String path, String privacyType) { return upload(new ByteArrayInputStream(data), path, privacyType); diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java index 7317bbd780..1659386ab9 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java @@ -28,6 +28,30 @@ public class LocalCloudStorageService extends AbstractCloudStorageService { this.config = config; } + /** + * desc: 获取oss域名 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssDomain(String privacy) { + return config.getLocalDomain(); + } + + /** + * desc: 获取oss前缀 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssPrefix(String privacy) { + return config.getLocalPrefix(); + } + @Override public String upload(byte[] data, String path, String privacyType) { return upload(new ByteArrayInputStream(data), path, privacyType); diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java index 5d657ba318..7c289e63ac 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java @@ -47,6 +47,30 @@ public class QcloudCloudStorageService extends AbstractCloudStorageService { clientConfig = new ClientConfig(new Region(config.getQcloudRegion())); } + /** + * desc: 获取oss域名 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssDomain(String privacy) { + return config.getQcloudDomain(); + } + + /** + * desc: 获取oss前缀 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssPrefix(String privacy) { + return config.getQcloudPrefix(); + } + @Override public String upload(byte[] data, String path, String privacyType) { return upload(new ByteArrayInputStream(data), path, privacyType); diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java index 2fe73cddeb..a4aa05ecda 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java @@ -44,6 +44,30 @@ public class QiniuCloudStorageService extends AbstractCloudStorageService { } + /** + * desc: 获取oss域名 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssDomain(String privacy) { + return config.getQiniuDomain(); + } + + /** + * desc: 获取oss前缀 + * + * @param privacy + * @return java.lang.String + * @author LiuJanJu * @date 2021/3/30 10:05 上午 + */ + @Override + public String getOssPrefix(String privacy) { + return config.getQiniuPrefix(); + } + @Override public String upload(byte[] data, String path, String privacyType) { try { diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java index 47be7d427a..2c65bcea65 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java @@ -423,4 +423,9 @@ public class OssController { return ossService.uploadImgV2(file, PrivacyType.EXTERNAL, customerId); } + @GetMapping("getOssFileUrl") + public Result download(@RequestParam(required = false) String filePath,@RequestParam(required = false) String privacy){ + return new Result().ok(ossService.getOssFileUrl(filePath,privacy)); + } + } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java index 04c15973fe..ae9625ee66 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java @@ -53,4 +53,11 @@ public interface OssService extends BaseService { * @author sun */ Result uploadImgV2(MultipartFile file, String privacy, String customerId); + + /** + * desc:通过文件路径获取下载 全路径 不传文件路径则为服务域名 + * @param filePath + * @return + */ + String getOssFileUrl(String filePath,String privacy); } diff --git a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java index 0805fd43c9..fc209d3535 100644 --- a/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java +++ b/epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java @@ -36,6 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import java.io.File; import java.io.IOException; import java.util.Map; @@ -242,5 +243,22 @@ public class OssServiceImpl extends BaseServiceImpl implement return new Result().ok(dto); } + @Override + public String getOssFileUrl(String filePath,String privacy) { + if (StringUtils.isBlank(filePath)){ + filePath = StrConstant.EPMETY_STR; + } + AbstractCloudStorageService storageService = OssFactory.build(); + String ossDomain = storageService.getOssDomain(privacy); + String ossPrefix = storageService.getOssPrefix(privacy); + if (StringUtils.isBlank(ossDomain)){ + throw new RenException("oss配置错误"); + } + if (StringUtils.isBlank(ossPrefix)){ + ossPrefix = StrConstant.EPMETY_STR; + } + return ossDomain.concat(File.separator).concat(ossPrefix).concat(File.separator).concat(filePath); + } + } diff --git a/epmet-user/epmet-user-server/pom.xml b/epmet-user/epmet-user-server/pom.xml index dcd727ce13..08b20aeaa5 100644 --- a/epmet-user/epmet-user-server/pom.xml +++ b/epmet-user/epmet-user-server/pom.xml @@ -148,6 +148,12 @@ 2.0.0 compile + + com.epmet + epmet-oss-client + 2.0.0 + compile + diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index 2c5336d0f7..7c6b673934 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -34,9 +34,12 @@ import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.page.PageData; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.HttpClientManager; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.IcResiUserDTO; @@ -44,9 +47,11 @@ import com.epmet.dto.form.*; import com.epmet.dto.result.*; import com.epmet.enums.IcResiUserTableEnums; import com.epmet.feign.OperCustomizeOpenFeignClient; +import com.epmet.feign.OssFeignClient; import com.epmet.service.IcResiUserImportService; import com.epmet.service.IcResiUserService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -57,10 +62,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Path; @@ -81,7 +83,21 @@ import java.util.concurrent.atomic.AtomicInteger; public class IcResiUserController { private static final String BASE_TABLE_NAME = "ic_resi_user"; + /** + * 居民上传临时目录 + */ private Path IC_RESI_UPLOAD_DIR; + /** + * 居民下载模版临时目录 + */ + private String OSS_TEMP_RESI_TEMP_DIR = "file-temp/resi-temp/"; + /** + * 本地模版缓存目录 + */ + private Path IC_RESI_DOWNLOAD_DIR; + + @Autowired + private OssFeignClient ossFeignClient; @Autowired private OperCustomizeOpenFeignClient operCustomizeOpenFeignClient; @@ -89,6 +105,8 @@ public class IcResiUserController { private IcResiUserService icResiUserService; @Autowired private IcResiUserImportService icResiUserImportService; + @Autowired + private RedisUtils redisUtils; { // 初始化上传目录 @@ -101,7 +119,15 @@ public class IcResiUserController { log.error("创建数字赋能平台上传目录失败"); } } - IC_RESI_UPLOAD_DIR = importDir; + Path exportDir = Paths.get(home, "epmet_files", "ic_user_export"); + if (Files.notExists(exportDir)) { + try { + Files.createDirectories(exportDir); + } catch (IOException e) { + log.error("创建数字赋能平台下载目录失败"); + } + } + IC_RESI_DOWNLOAD_DIR = exportDir; } @PostMapping("delete") @@ -248,11 +274,10 @@ public class IcResiUserController { /*List resiFormAllItems = getResiFormAllItems(pageFormDTO.getCustomerId()); resiFormAllItems.stream().collect(Collectors.groupingBy(e ->e.get));*/ - //读取模版 - String templatePath = "excel/ic_resi_info_cid_for_easy_excel.xlsx"; - InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(templatePath); - String fileName = "居民基本信息.xlsx"; - ExcelWriter excelWriter = EasyExcel.write(getOutputStream(fileName, response)).withTemplate(inputStream).build(); + //获取模版文件 + File file = getExportTemplateFile(customerId); + ExcelWriter excelWriter = EasyExcel.write(getOutputStream("居民基本信息.xlsx", response)).withTemplate(file).build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); IcResiUserTableEnums tableEnums = IcResiUserTableEnums.getObjectByTableName(BASE_TABLE_NAME); WriteSheet fistSheet = EasyExcel.writerSheet(tableEnums.getSheetNo()).build(); @@ -269,8 +294,6 @@ public class IcResiUserController { if (resiMainTableMap.keySet().size() < pageFormDTO.getPageSize()) { stopSearchSet.add(BASE_TABLE_NAME); } - - System.out.println("===resiMainTableMap===" + " " + JSON.toJSONString(resiMainTableMap.values())); //写入数据 excelWriter.fill(new FillWrapper("t1", resiMainTableMap.values()), fillConfig, fistSheet); pageFormDTO.setPageNo(pageFormDTO.getPageNo() + 1); @@ -301,9 +324,8 @@ public class IcResiUserController { if (resiChildMap.keySet().size() < pageFormDTO.getPageSize()) { stopSearchSet.add(tableName); } - System.out.println("===resiChildMap===" + tableName + " " + JSON.toJSONString(resiChildMap.values())); tableEnums = IcResiUserTableEnums.getObjectByTableName(tableName); - if (tableEnums == null){ + if (tableEnums == null) { continue; } //构建新的sheet @@ -323,6 +345,64 @@ public class IcResiUserController { excelWriter.finish(); } + /** + * desc:根据客户id 下载模版文件 如果不存在则返回null + * + * @param customerId + * @return + */ + private File getExportTemplateFile(String customerId) throws Exception{ + String fileType = ".xlsx"; + String fileName = customerId + fileType; + File file = new File(IC_RESI_DOWNLOAD_DIR.resolve(fileName).toString()); + String isChanged = redisUtils.getString(RedisKeys.getResiTempChangedKey(customerId)); + //如果 本地文件不存在 或者已经变动 则重新下载 + if (!file.exists() || NumConstant.ONE_STR.equals(isChanged)) { + if (file.exists()) { + file.delete(); + } + String ossFilePath = OSS_TEMP_RESI_TEMP_DIR + fileName; + Result fileUrlResult = ossFeignClient.getOssFileUrl(ossFilePath, null); + Result result = HttpClientManager.getInstance().getDownloadFilebytes(fileUrlResult.getData(), null); + //获取模版失败 则把默认文件写入 + if (result == null || !result.success()) { + log.warn("获取居民导出模版失败,path:{},走默认模版", ossFilePath); + String defaultTemplatePath = "excel/ic_resi_info_cid_for_easy_excel.xlsx"; + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(defaultTemplatePath); + FileUtils.copyInputStreamToFile(resourceAsStream,file); + log.warn("getExportTemplateFile copy default file to template,customerId:{}",customerId); + } else { + log.warn("getExportTemplateFile reload file form oss default file to template,customerId:{}",customerId); + FileUtils.writeByteArrayToFile(file,result.getData()); + } + redisUtils.setString(RedisKeys.getResiTempChangedKey(customerId), NumConstant.ZERO_STR); + return file; + } + return file; + } + + public static void main(String[] args) { + String home = System.getProperty("user.home"); + Path exportDir = Paths.get(home, "epmet_files", "ic_user_export"); + if (Files.notExists(exportDir)) { + try { + Files.createDirectories(exportDir); + } catch (IOException e) { + log.error("创建数字赋能平台下载目录失败"); + } + } + Path IC_RESI_DOWNLOAD_DIR = exportDir; + + + String fileType = ".xlsx"; + String fileName = "customerId" + fileType; + File file = new File(IC_RESI_DOWNLOAD_DIR.resolve(fileName).toString()); + System.out.println("file路径:" + file); + System.out.println(file.exists()); + + + } + @NotNull private Map> buildItemMap(CustomerFormResultDTO resiFormItems) { Map> otherSheetItems = new HashMap<>();