Browse Source

新增:

1.oss接受导入任务描述文件的接口
修改:
1.居民信息导入,生成excel文件,传送到oss,而不再下载
dev
wangxianzhang 4 years ago
parent
commit
1508e03ba6
  1. 18
      epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java
  2. 5
      epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java
  3. 11
      epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java
  4. 38
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java
  5. 3
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java
  6. 114
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java
  7. 3
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java

18
epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/OssFeignClient.java

@ -14,7 +14,11 @@ import com.epmet.dto.result.UploadImgResultDTO;
import com.epmet.feign.fallback.OssFeignClientFallbackFactory;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
@ -64,12 +68,24 @@ public interface OssFeignClient {
@GetMapping(value = "oss/file/getOssFileUrl")
Result<String> getOssFileUrl(@RequestParam String filePath, @RequestParam String privacy);
/**
* 上传任务描述文件
* 不限制大小
* @param file
* @return
*/
@PostMapping(value = "oss/file/importTaskDescFile/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result<UploadImgResultDTO> uploadImportTaskDescFile(@RequestPart("file") MultipartFile file);
//@Configuration
class MultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder() {
return new SpringFormEncoder();
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
}

5
epmet-module/epmet-oss/epmet-oss-client/src/main/java/com/epmet/feign/fallback/OssFeignClientFallback.java

@ -50,4 +50,9 @@ public class OssFeignClientFallback implements OssFeignClient {
return ModuleUtils.feignConError(ServiceConstant.EPMET_OSS_SERVER, "download", filePath,privacy);
}
@Override
public Result<UploadImgResultDTO> uploadImportTaskDescFile(MultipartFile file) {
return ModuleUtils.feignConError(ServiceConstant.EPMET_OSS_SERVER, "uploadImportTaskDescFile", "MultipartFile");
}
}

11
epmet-module/epmet-oss/epmet-oss-server/src/main/java/com/epmet/controller/OssController.java

@ -437,4 +437,15 @@ public class OssController {
return new Result<String>().ok(ossService.getOssFileUrl(filePath,privacy));
}
/**
* 上传任务描述文件
* 不限制大小
* @param file
* @return
*/
@PostMapping("/importTaskDescFile/upload")
public Result<UploadImgResultDTO> uploadImportTaskDescFile(@RequestPart("file") MultipartFile file) {
return ossService.uploadImg(file, null);
}
}

38
epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java

@ -443,26 +443,44 @@ public class IcResiUserController implements ResultDataResolver {
// 记录导入任务
importTaskId = icResiUserImportService.createImportTaskRecord(operatorId, ImportTaskConstants.BIZ_TYPE_RESI);
// 开始执行导入
Path savePath = null;
// 转储文件到临时目录 && 执行异步导入
submitResiImportTask(customerId, operatorId, importTaskId, extension, file, response);
// ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// CompletableFuture.runAsync(() -> {
// RequestContextHolder.setRequestAttributes(sra, true);
// submitResiImportTask(customerId, operatorId, importTaskId, extension, file, response);
// });
}
/**
* 提交居民导入任务
* @param customerId
* @param operatorId
* @param importTaskId
* @param extension
* @param file
* @param response
*/
private void submitResiImportTask(String customerId, String operatorId, String importTaskId, String extension, MultipartFile file, HttpServletResponse response) {
Path importTempFileSavePath = null;
try {
String fileName = UUID.randomUUID().toString().concat(".").concat(extension);
savePath = IC_RESI_UPLOAD_DIR.resolve(fileName);
importTempFileSavePath = IC_RESI_UPLOAD_DIR.resolve(fileName);
IOUtils.copy(file.getInputStream(), new FileOutputStream(importTempFileSavePath.toString()));
IOUtils.copy(file.getInputStream(), new FileOutputStream(savePath.toString()));
List<FormItemResult> formItemList = icResiUserService.listFormItems(customerId,IcFormCodeEnum.RESI_BASE_INFO.getCode());
icResiUserImportService.importIcResiInfoFromExcel(importTaskId, formItemList, savePath.toString(), response);
icResiUserImportService.importIcResiInfoFromExcel(importTaskId, formItemList, importTempFileSavePath.toString(), response, IC_RESI_UPLOAD_DIR);
} catch (Throwable e) {
String errorMsg = ExceptionUtils.getThrowableErrorStackTrace(e);
log.error("【导入居民信息失败】导入失败:{}", errorMsg);
// 要将导入任务状态设置为结束但不成功。不报错即成功,没有返回值 TODO 此处要改,将oss返回的路径存储到resultDescPath中
icResiUserImportService.finishImportTask(importTaskId, operatorId, ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL, null, null);
// 要将导入任务状态设置为结束但不成功。不报错即成功,没有返回值
icResiUserImportService.finishImportTask(importTaskId, operatorId, ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL, "系统异常,请查看系统日志", null);
} finally {
try {
if (savePath != null){
Files.delete(savePath);
if (importTempFileSavePath != null){
Files.delete(importTempFileSavePath);
}
} catch (IOException e) {
log.error("【导入居民信息失败】清理上传的文件失败:{}", ExceptionUtils.getErrorStackTrace(e));

3
epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcResiUserImportService.java

@ -3,6 +3,7 @@ package com.epmet.service;
import com.epmet.dto.result.FormItemResult;
import javax.servlet.http.HttpServletResponse;
import java.nio.file.Path;
import java.util.List;
/**
@ -12,7 +13,7 @@ import java.util.List;
*/
public interface IcResiUserImportService {
void importIcResiInfoFromExcel(String importTaskId, List<FormItemResult> formItemList, String excelPathName, HttpServletResponse response);
void importIcResiInfoFromExcel(String importTaskId, List<FormItemResult> formItemList, String excelPathName, HttpServletResponse response, Path importTempPath);
/**
* 创建导入任务

114
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java

@ -45,15 +45,19 @@ import com.google.common.cache.CacheBuilder;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.entity.ContentType;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.io.*;
import java.nio.file.Path;
import java.util.*;
import java.util.stream.Collectors;
@ -125,6 +129,8 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
@Autowired
private EpmetCommonServiceOpenFeignClient commonServiceOpenFeignClient;
@Autowired
private OssFeignClient ossFeignClient;
/**
* 字表中不需要的列
@ -217,7 +223,7 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
* @param response 响应对象
*/
@Override
public void importIcResiInfoFromExcel(String importTaskId, List<FormItemResult> formItemList, String excelPathName, HttpServletResponse response) {
public void importIcResiInfoFromExcel(String importTaskId, List<FormItemResult> formItemList, String excelPathName, HttpServletResponse response, Path importTempPath) {
String loginUserId = loginUserUtil.getLoginUserId();
String loginUserApp = loginUserUtil.getLoginUserApp();
@ -268,26 +274,22 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
Map<String, ResiImportChangedData> categoryChangedResis = newlyOrChangedResi.get().getCategoryChangedResis();
Map<String, ResiImportChangedData> transferedResis = newlyOrChangedResi.get().getTransferedResis();
log.info("类别变动居民数:{}", categoryChangedResis.size());
log.info("调动居民数:{}", transferedResis.size());
//保存调动或者变更记录
saveNewResiCategoryRecord();
saveResiCategoryChangedRecord(categoryChangedResis);
saveTransferedResiRecord(transferedResis);
hasErrorRows = hasErrorRows();
try {
// todo 做了导入记录之后,这里就要判断,没有错误就不生成文件了
downLoadResults(hasErrorRows, response);
} catch (Exception e) {
log.error("【导入IC居民附加信息】下载导入结果信息失败:{}", ExceptionUtils.getErrorStackTrace(e));
}
// 更新上传记录
if (hasErrorRows) {
finishImportTask(importTaskId, loginUserId, ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL,null, null);
// 生成错误描述文件 && 更新上传记录
LinkedList<ErrorRow> errorRows = getErrorRows();
if (CollectionUtils.isNotEmpty(errorRows)) {
String resultDescFilePath = null;
try {
resultDescFilePath = generateResultDescFile(errorRows, importTempPath);
} catch (Exception e) {
String errorMsg = ExceptionUtils.getErrorStackTrace(e);
log.error("【居民信息导入】", errorMsg);
}
finishImportTask(importTaskId, loginUserId, ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL,null, resultDescFilePath);
} else {
finishImportTask(importTaskId, loginUserId, ImportTaskConstants.PROCESS_STATUS_FINISHED_SUCCESS,null, null);
}
@ -314,19 +316,16 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
}
/**
* 是否有错误行
* 返回错误行
* @return
*/
private Boolean hasErrorRows() {
boolean hasError = false;
Map<String, List<ErrorRow>> tableAndErrorRows = errorRows.get();
for (Map.Entry<String, List<ErrorRow>> entry:tableAndErrorRows.entrySet()) {
if (entry.getValue().size() != 0) {
hasError = true;
}
private LinkedList<ErrorRow> getErrorRows() {
LinkedList<ErrorRow> list = new LinkedList<>();
for (Map.Entry<String, List<ErrorRow>> entry : errorRows.get().entrySet()) {
list.addAll(entry.getValue());
}
return hasError;
return list;
}
/**
@ -1027,34 +1026,47 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
}
/**
* 下载导入结果
* @param response
* 生成导入结果
* @throws IOException
*/
public void downLoadResults(Boolean hasErrorRows, HttpServletResponse response) throws IOException {
String fileName;
// 判断是否有错误信息,以确定文件名
if (hasErrorRows) {
fileName = "导入失败条目清单.xls";
} else {
fileName = "导入成功.xls";
public String generateResultDescFile(LinkedList<ErrorRow> errorRows, Path importTempDir) throws IOException {
errorRows.forEach(row -> {row.setSheetName(IcResiUserTableEnum.getObjectByTableName(row.tableName).getTableComment());});
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("导入失败的数据列表","导入失败的数据列表"),
ErrorRow.class, errorRows);
// 文件名
String resultDescFileName = UUID.randomUUID().toString().concat(".xls");
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem fileItem = factory.createItem("file", ContentType.APPLICATION_OCTET_STREAM.toString(), true, resultDescFileName);
OutputStream os = fileItem.getOutputStream();
Result<UploadImgResultDTO> uploadResult = null;
try {
workbook.write(os);
uploadResult = ossFeignClient.uploadImportTaskDescFile(new CommonsMultipartFile(fileItem));
} catch (Exception e) {
String errormsg = ExceptionUtils.getErrorStackTrace(e);
log.error("【居民信息导入】上传错误描述文件:{}", errormsg);
} finally {
try {
os.close();
} catch (IOException e) {
String errormsg = ExceptionUtils.getErrorStackTrace(e);
log.error("【居民信息导入】上传错误描述文件关闭输出流:{}", errormsg);
}
try {
fileItem.delete();
} catch (Exception e) {
String errormsg = ExceptionUtils.getErrorStackTrace(e);
log.error("【居民信息导入】上传错误描述文件删除临时文件:{}", errormsg);
}
}
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
LinkedList<ErrorRow> list = new LinkedList<>();
for (Map.Entry<String, List<ErrorRow>> entry : errorRows.get().entrySet()) {
list.addAll(entry.getValue());
if (uploadResult == null || !uploadResult.success()) {
log.error("【居民信息导入】调用OSS上传结果描述文件失败");
return null;
}
list.forEach(row -> {row.setSheetName(IcResiUserTableEnum.getObjectByTableName(row.tableName).getTableComment());});
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("导入失败的列表","导入失败列表(没有数据说明全部成功)"),
ErrorRow.class, list);
workbook.write(response.getOutputStream());
return uploadResult.getData().getUrl();
}
/**

3
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java

@ -42,8 +42,10 @@ import com.epmet.commons.tools.redis.common.CustomerStaffRedis;
import com.epmet.commons.tools.redis.common.bean.AgencyInfoCache;
import com.epmet.commons.tools.redis.common.bean.GridInfoCache;
import com.epmet.commons.tools.security.dto.TokenDto;
import com.epmet.commons.tools.security.user.LoginUserUtil;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.DateUtils;
import com.epmet.commons.tools.utils.HttpContextUtils;
import com.epmet.commons.tools.utils.Result;
import com.epmet.constant.IcPlatformConstant;
import com.epmet.constant.IcResiUserConstant;
@ -72,6 +74,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Date;

Loading…
Cancel
Save