Browse Source

动态模版实现

dev_shibei_match
jianjun 4 years ago
parent
commit
c1f78bc394
  1. 14
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
  2. 11
      epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java
  3. 6
      epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java
  4. 16
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AbstractCloudStorageService.java
  5. 9
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/AliyunCloudStorageService.java
  6. 24
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/FastDFSCloudStorageService.java
  7. 24
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/LocalCloudStorageService.java
  8. 24
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QcloudCloudStorageService.java
  9. 24
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/cloud/QiniuCloudStorageService.java
  10. 5
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java
  11. 7
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java
  12. 18
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/impl/OssServiceImpl.java
  13. 6
      epmet-user/epmet-user-server/pom.xml
  14. 108
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java

14
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);
}
}

11
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<UploadImgResultDTO> uploadQrCodeV2(@RequestPart(value = "file") MultipartFile file, @RequestParam("customerId") String customerId);
/**
* desc:通过文件路径获取文件地址
* @param filePath 文件路径 eg:epmet
* @param privacy 内部 外部
* @return
*/
@GetMapping(value = "oss/file/getOssFileUrl")
Result<String> getOssFileUrl(@RequestParam String filePath, @RequestParam String privacy);
//@Configuration
class MultipartSupportConfig {

6
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<String> getOssFileUrl(String filePath, String privacy) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_OSS_SERVER, "download", filePath,privacy);
}
}

16
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 前缀

9
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);

24
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);

24
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);

24
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);

24
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 {

5
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<String> download(@RequestParam(required = false) String filePath,@RequestParam(required = false) String privacy){
return new Result<String>().ok(ossService.getOssFileUrl(filePath,privacy));
}
}

7
epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/service/OssService.java

@ -53,4 +53,11 @@ public interface OssService extends BaseService<OssEntity> {
* @author sun
*/
Result<UploadImgResultDTO> uploadImgV2(MultipartFile file, String privacy, String customerId);
/**
* desc:通过文件路径获取下载 全路径 不传文件路径则为服务域名
* @param filePath
* @return
*/
String getOssFileUrl(String filePath,String privacy);
}

18
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<OssDao, OssEntity> implement
return new Result<UploadImgResultDTO>().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);
}
}

6
epmet-user/epmet-user-server/pom.xml

@ -148,6 +148,12 @@
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.epmet</groupId>
<artifactId>epmet-oss-client</artifactId>
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

108
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<FormItemResult> 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<String> fileUrlResult = ossFeignClient.getOssFileUrl(ossFilePath, null);
Result<byte[]> 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<String, Map<String, FormItemResult>> buildItemMap(CustomerFormResultDTO resiFormItems) {
Map<String, Map<String, FormItemResult>> otherSheetItems = new HashMap<>();

Loading…
Cancel
Save