| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -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) { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |