|
|
@ -53,7 +53,6 @@ import com.epmet.dto.form.*; |
|
|
|
import com.epmet.dto.result.*; |
|
|
|
import com.epmet.enums.IcResiUserTableEnum; |
|
|
|
import com.epmet.excel.support.ExportResiUserItemDTO; |
|
|
|
import com.epmet.feign.EpmetCommonServiceOpenFeignClient; |
|
|
|
import com.epmet.feign.EpmetMessageOpenFeignClient; |
|
|
|
import com.epmet.feign.OperCustomizeOpenFeignClient; |
|
|
|
import com.epmet.feign.OssFeignClient; |
|
|
@ -65,6 +64,7 @@ import org.apache.commons.io.FileUtils; |
|
|
|
import org.apache.commons.io.FilenameUtils; |
|
|
|
import org.apache.commons.io.IOUtils; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.apache.tomcat.util.http.MimeHeaders; |
|
|
|
import org.jetbrains.annotations.NotNull; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.http.HttpHeaders; |
|
|
@ -72,17 +72,21 @@ import org.springframework.http.HttpStatus; |
|
|
|
import org.springframework.http.ResponseEntity; |
|
|
|
import org.springframework.web.bind.annotation.*; |
|
|
|
import org.springframework.web.multipart.MultipartFile; |
|
|
|
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; |
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest; |
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
import java.io.File; |
|
|
|
import java.io.FileOutputStream; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.lang.reflect.Field; |
|
|
|
import java.net.URLEncoder; |
|
|
|
import java.nio.file.Files; |
|
|
|
import java.nio.file.Path; |
|
|
|
import java.nio.file.Paths; |
|
|
|
import java.util.*; |
|
|
|
import java.util.concurrent.CompletableFuture; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
|
@ -429,30 +433,95 @@ public class IcResiUserController implements ResultDataResolver { |
|
|
|
*/ |
|
|
|
@NoRepeatSubmit |
|
|
|
@PostMapping("importExcel") |
|
|
|
public void importExcelByEasyExcel(@RequestHeader("customerId") String customerId,@RequestPart("file") MultipartFile file, HttpServletResponse response) { |
|
|
|
public Result importExcelByEasyExcel(@RequestHeader("customerId") String customerId,@RequestPart("file") MultipartFile file, HttpServletRequest multipartRequest, HttpServletResponse response) { |
|
|
|
if (file.isEmpty()) { |
|
|
|
throw new RenException("请上传文件"); |
|
|
|
} |
|
|
|
|
|
|
|
String originalFilename = file.getOriginalFilename(); |
|
|
|
// 校验文件类型
|
|
|
|
String extension = FilenameUtils.getExtension(file.getOriginalFilename()); |
|
|
|
String extension = FilenameUtils.getExtension(originalFilename); |
|
|
|
if (!"xls".equals(extension) && !"xlsx".equals(extension)) { |
|
|
|
throw new RenException("文件类型不匹配"); |
|
|
|
} |
|
|
|
|
|
|
|
String operatorId = loginUserUtil.getLoginUserId(); |
|
|
|
String importTaskId; |
|
|
|
|
|
|
|
// 记录导入任务
|
|
|
|
importTaskId = icResiUserImportService.createImportTaskRecord(operatorId, ImportTaskConstants.BIZ_TYPE_RESI); |
|
|
|
String importTaskId = icResiUserImportService.createImportTaskRecord(operatorId, ImportTaskConstants.BIZ_TYPE_RESI, originalFilename);; |
|
|
|
|
|
|
|
// 转储文件到临时目录 && 执行异步导入
|
|
|
|
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);
|
|
|
|
// });
|
|
|
|
// 缓存上传的文件
|
|
|
|
Path importTempFileSavePath; |
|
|
|
try { |
|
|
|
String fileName = UUID.randomUUID().toString().concat(".").concat(extension); |
|
|
|
importTempFileSavePath = IC_RESI_UPLOAD_DIR.resolve(fileName); |
|
|
|
IOUtils.copy(file.getInputStream(), new FileOutputStream(importTempFileSavePath.toString())); |
|
|
|
} catch (Exception e) { |
|
|
|
log.error("【上传居民信息】保存上传的文件失败:{}", ExceptionUtils.getErrorStackTrace(e)); |
|
|
|
throw new RenException("上传失败"); |
|
|
|
} |
|
|
|
|
|
|
|
final Path importTempFileSavePathFinal = importTempFileSavePath; |
|
|
|
|
|
|
|
HttpServletRequest request = ((StandardMultipartHttpServletRequest)multipartRequest).getRequest(); |
|
|
|
|
|
|
|
HashMap<String, String> headers = getHeadersFromRequest(request); |
|
|
|
|
|
|
|
// 异步执行导入
|
|
|
|
CompletableFuture.runAsync(() -> { |
|
|
|
try { |
|
|
|
// 睡眠2秒钟,等待主线程先结束,主线程会清空request对象的headers,等他执行了清空之后,我们这边再手动setHeader进去
|
|
|
|
Thread.sleep(1000l); |
|
|
|
} catch (InterruptedException e) { |
|
|
|
e.printStackTrace(); |
|
|
|
} |
|
|
|
setHeaders2Request(request, headers); |
|
|
|
submitResiImportTask(customerId, operatorId, importTaskId, importTempFileSavePathFinal, response); |
|
|
|
}); |
|
|
|
|
|
|
|
return new Result(); |
|
|
|
} |
|
|
|
|
|
|
|
private HashMap<String, String> getHeadersFromRequest(HttpServletRequest request) { |
|
|
|
HashMap<String, String> headers = new HashMap<>(); |
|
|
|
Enumeration<String> headerNames = request.getHeaderNames(); |
|
|
|
if (headerNames != null) { |
|
|
|
while (headerNames.hasMoreElements()) { |
|
|
|
String name = headerNames.nextElement(); |
|
|
|
Enumeration<String> values = request.getHeaders(name); |
|
|
|
while (values.hasMoreElements()) { |
|
|
|
String value = values.nextElement(); |
|
|
|
headers.put(name, value); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return headers; |
|
|
|
} |
|
|
|
|
|
|
|
private void setHeaders2Request(HttpServletRequest request, HashMap<String, String> headers) { |
|
|
|
for (Map.Entry<String, String> kv : headers.entrySet()) { |
|
|
|
setParam2Header(request, kv.getKey(), kv.getValue()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void setParam2Header(HttpServletRequest requestFacade, String key, String value){ |
|
|
|
Class<? extends HttpServletRequest> requestFacadeClass = requestFacade.getClass(); |
|
|
|
try { |
|
|
|
Field requestField = requestFacadeClass.getDeclaredField("request"); |
|
|
|
requestField.setAccessible(true); |
|
|
|
Object requestObject = requestField.get(requestFacade); |
|
|
|
|
|
|
|
Field coyoteRequestField = requestObject.getClass().getDeclaredField("coyoteRequest"); |
|
|
|
coyoteRequestField.setAccessible(true); |
|
|
|
Object coyoteRequestObject = coyoteRequestField.get(requestObject); |
|
|
|
|
|
|
|
Field headers = coyoteRequestObject.getClass().getDeclaredField("headers"); |
|
|
|
headers.setAccessible(true); |
|
|
|
MimeHeaders o2 = (MimeHeaders)headers.get(coyoteRequestObject); |
|
|
|
o2.addValue(key).setString(value); |
|
|
|
} catch (Exception e) { |
|
|
|
e.printStackTrace(); |
|
|
|
log.error("为子线程设置请求头出错"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@ -460,18 +529,11 @@ public class IcResiUserController implements ResultDataResolver { |
|
|
|
* @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) { |
|
|
|
private void submitResiImportTask(String customerId, String operatorId, String importTaskId, Path importTempFileSavePath, HttpServletResponse response) { |
|
|
|
|
|
|
|
Path importTempFileSavePath = null; |
|
|
|
try { |
|
|
|
String fileName = UUID.randomUUID().toString().concat(".").concat(extension); |
|
|
|
importTempFileSavePath = IC_RESI_UPLOAD_DIR.resolve(fileName); |
|
|
|
IOUtils.copy(file.getInputStream(), new FileOutputStream(importTempFileSavePath.toString())); |
|
|
|
|
|
|
|
List<FormItemResult> formItemList = icResiUserService.listFormItems(customerId,IcFormCodeEnum.RESI_BASE_INFO.getCode()); |
|
|
|
icResiUserImportService.importIcResiInfoFromExcel(importTaskId, formItemList, importTempFileSavePath.toString(), response, IC_RESI_UPLOAD_DIR); |
|
|
|
} catch (Throwable e) { |
|
|
|