diff --git a/EasyExcel/pom.xml b/EasyExcel/pom.xml index 7c07ee3..521a335 100644 --- a/EasyExcel/pom.xml +++ b/EasyExcel/pom.xml @@ -6,7 +6,7 @@ com.netease.lowcode.extensions EasyExcel - 2.4.2 + 2.5.0 8 @@ -122,7 +122,7 @@ 1.7.1 false - + true diff --git a/EasyExcel/src/main/java/com/netease/lowcode/extensions/EasyExcelTools.java b/EasyExcel/src/main/java/com/netease/lowcode/extensions/EasyExcelTools.java index f60302b..5aaf920 100644 --- a/EasyExcel/src/main/java/com/netease/lowcode/extensions/EasyExcelTools.java +++ b/EasyExcel/src/main/java/com/netease/lowcode/extensions/EasyExcelTools.java @@ -433,7 +433,7 @@ public static ExcelResponse createExcelWithUrl(CustomExcelData excelData) { } /** - * [推荐] 解析excel + * [推荐] 解析excel-数据传入handle * * @param handle * @param request @@ -474,6 +474,48 @@ public static ParseBigDataResponse parseBigDataExcel(Function, Stri return ParseBigDataResponse.OK(readListener.getTotal()); } + + /** + * [推荐] 解析excel-数据直接返回 + * + * @param request + * @return + */ + @NaslLogic + public static ParseBigDataResponse parseBigDataExcelNoSave(ParseRequest request) { + + if (Objects.isNull(request) || StringUtils.isBlank(request.fullClassName)) { + return ParseBigDataResponse.FAIL("请求参数为空,fullClassName不能为空!"); + } + if (StringUtils.isBlank(request.url)) { + return ParseBigDataResponse.FAIL("文件url不能为空!"); + } + Class clazz; + try { + clazz = Class.forName(request.getFullClassName(), false, Thread.currentThread().getContextClassLoader()); + } catch (ClassNotFoundException e) { + log.error("加载类失败", e); + return ParseBigDataResponse.FAIL(String.format("加载类[%s]失败!", request.getFullClassName()), e.getMessage() + Arrays.toString(e.getStackTrace())); + } + + LibraryReadListener readListener = new LibraryReadListener<>(null, clazz, request, fileUtils); + SimpleReadCacheSelector simpleReadCacheSelector = new SimpleReadCacheSelector(); + // 放多少批数据在内存,默认20 + if (Objects.nonNull(request.getMaxCacheActivateBatchCount())) { + simpleReadCacheSelector.setMaxCacheActivateBatchCount(request.getMaxCacheActivateBatchCount()); + } + try (InputStream inputStream = openUrlStream(request.getUrl())) { + EasyExcel.read(inputStream, clazz, readListener).readCacheSelector(simpleReadCacheSelector).sheet().doRead(); + } catch (RuntimeException e) { + log.error("excel解析失败", e); + return ParseBigDataResponse.FAIL("excel解析失败!", e.getMessage() + Arrays.toString(e.getStackTrace())); + } catch (IOException e) { + log.error("文件下载失败", e); + return ParseBigDataResponse.FAIL("文件下载失败", e.getMessage() + Arrays.toString(e.getStackTrace())); + } + return ParseBigDataResponse.OK(readListener.getTotal(), readListener.getCachedDataList()); + } + /** * [推荐使用]导出大数据量excel * diff --git a/EasyExcel/src/main/java/com/netease/lowcode/extensions/listeners/LibraryReadListener.java b/EasyExcel/src/main/java/com/netease/lowcode/extensions/listeners/LibraryReadListener.java index 1db2519..6d32318 100644 --- a/EasyExcel/src/main/java/com/netease/lowcode/extensions/listeners/LibraryReadListener.java +++ b/EasyExcel/src/main/java/com/netease/lowcode/extensions/listeners/LibraryReadListener.java @@ -85,7 +85,7 @@ public LibraryReadListener(Function, String> handle, Class type, } - private List toJsonString(List data) { + public List toJsonString(List data) { // https://blog.csdn.net/fenglllle/article/details/114293427 // 使用fastjson2会出现classloader问题(cast to exception) @@ -131,8 +131,10 @@ public void invoke(T data, AnalysisContext context) { // 解析到一条数据,加入缓存 cachedDataList.add(data); if (cachedDataList.size() >= BATCH_COUNT) { - // 调用function处理数据 - handle.apply(toJsonString(cachedDataList)); + if (handle != null) { + // 调用function处理数据 + handle.apply(toJsonString(cachedDataList)); + } // 处理完清理list cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); } @@ -216,8 +218,10 @@ private void fillPicture(T data, AnalysisContext context) { @Override public void doAfterAllAnalysed(AnalysisContext context) { - // 调用function处理数据 - handle.apply(toJsonString(cachedDataList)); + if (handle != null) { + // 调用function处理数据 + handle.apply(toJsonString(cachedDataList)); + } // 数据处理完成 } @@ -241,6 +245,15 @@ public boolean hasNext(AnalysisContext context) { return ReadListener.super.hasNext(context); } + /** + * 获取缓存数据 + * + * @return + */ + public List getCachedDataList() { + return toJsonString(cachedDataList); + } + /** * 获取导入数量 * diff --git a/EasyExcel/src/main/java/com/netease/lowcode/extensions/response/ParseBigDataResponse.java b/EasyExcel/src/main/java/com/netease/lowcode/extensions/response/ParseBigDataResponse.java index 1708d89..8914acb 100644 --- a/EasyExcel/src/main/java/com/netease/lowcode/extensions/response/ParseBigDataResponse.java +++ b/EasyExcel/src/main/java/com/netease/lowcode/extensions/response/ParseBigDataResponse.java @@ -2,6 +2,8 @@ import com.netease.lowcode.core.annotation.NaslStructure; +import java.util.List; + @NaslStructure public class ParseBigDataResponse { @@ -12,12 +14,16 @@ public class ParseBigDataResponse { public Double cost;// 处理耗时,单位 s public Double size;// 文件大小,单位字节 public Long total;// 统计导入条数 + /** + * 数据列表 + */ + public List dataList; public static ParseBigDataResponse FAIL(String msg) { - return FAIL(msg,null); + return FAIL(msg, null); } - public static ParseBigDataResponse FAIL(String msg,String trace){ + public static ParseBigDataResponse FAIL(String msg, String trace) { ParseBigDataResponse fail = new ParseBigDataResponse(); fail.setSuccess(false); fail.setMsg(msg); @@ -29,6 +35,13 @@ public static ParseBigDataResponse OK() { return OK("success"); } + public static ParseBigDataResponse OK(Long total, List dataList) { + ParseBigDataResponse ok = OK(); + ok.setTotal(total); + ok.setDataList(dataList); + return ok; + } + public static ParseBigDataResponse OK(Long total) { ParseBigDataResponse ok = OK(); ok.setTotal(total); @@ -42,6 +55,10 @@ public static ParseBigDataResponse OK(String msg) { return ok; } + public void setDataList(List dataList) { + this.dataList = dataList; + } + public Boolean getSuccess() { return success; } diff --git a/async_function_pool/pom.xml b/async_function_pool/pom.xml index 68ca28d..b5595be 100644 --- a/async_function_pool/pom.xml +++ b/async_function_pool/pom.xml @@ -12,7 +12,7 @@ com.netease async_function_pool - 1.1.0 + 1.3.2 8 @@ -39,6 +39,7 @@ lcap-annotation com.netease.lowcode 1.0.4 + provided org.slf4j @@ -75,7 +76,7 @@ 1.4.3 false - true + diff --git a/async_function_pool/src/main/java/com/netease/lib/tasks/api/FunctionManagerApi.java b/async_function_pool/src/main/java/com/netease/lib/tasks/api/FunctionManagerApi.java index 20f207a..fe456e6 100644 --- a/async_function_pool/src/main/java/com/netease/lib/tasks/api/FunctionManagerApi.java +++ b/async_function_pool/src/main/java/com/netease/lib/tasks/api/FunctionManagerApi.java @@ -26,7 +26,7 @@ @Component public class FunctionManagerApi { - private static final Logger logger = LoggerFactory.getLogger("LCAP_CUSTOMIZE_LOGGER"); + private static final Logger logger = LoggerFactory.getLogger("LCAP_EXTENSION_LOGGER"); /** * 逻辑关键词,逻辑 diff --git a/async_function_pool/src/main/java/com/netease/lib/tasks/aspect/ExtensionAsyncLogicExcuteAspect.java b/async_function_pool/src/main/java/com/netease/lib/tasks/aspect/ExtensionAsyncLogicExcuteAspect.java index abe73f2..e0ddbc4 100644 --- a/async_function_pool/src/main/java/com/netease/lib/tasks/aspect/ExtensionAsyncLogicExcuteAspect.java +++ b/async_function_pool/src/main/java/com/netease/lib/tasks/aspect/ExtensionAsyncLogicExcuteAspect.java @@ -16,8 +16,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; -import static java.lang.Thread.sleep; - @Aspect @Component public class ExtensionAsyncLogicExcuteAspect { @@ -37,7 +35,6 @@ public Object aroundCustomizeServiceMethods(ProceedingJoinPoint joinPoint) throw } CompletableFuture future = CompletableFuture.supplyAsync(() -> { try { - sleep(10*1000); return joinPoint.proceed(); } catch (Throwable e) { log.error("ExtensionAsyncLogicExcuteAspect error", e); diff --git a/async_function_pool/src/main/java/com/netease/lib/tasks/util/AsyncLogicAnnotationConfigUtil.java b/async_function_pool/src/main/java/com/netease/lib/tasks/util/AsyncLogicAnnotationConfigUtil.java index 688218e..d9cb8cf 100644 --- a/async_function_pool/src/main/java/com/netease/lib/tasks/util/AsyncLogicAnnotationConfigUtil.java +++ b/async_function_pool/src/main/java/com/netease/lib/tasks/util/AsyncLogicAnnotationConfigUtil.java @@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.util.FileCopyUtils; +import org.springframework.util.StringUtils; import java.io.InputStream; import java.nio.charset.StandardCharsets; @@ -28,7 +29,7 @@ public static JSONArray readAnnotationFile(String annoName) { JSONArray array = JSONObject.parseArray(new String(bdata, StandardCharsets.UTF_8)); return array; } catch (Exception e) { - log.error("readAnnotationFile error", e); + log.warn("readAnnotationFile error", e); // 处理异常 return null; } @@ -51,8 +52,9 @@ public static List listAlluseAnnoLogicNames(String annoName) { JSONObject annoObj = (JSONObject) anno; String logicName = annoObj.getString("logicName"); JSONObject annotationProperties = annoObj.getJSONObject("annotationProperties"); - if ("true".equals(annotationProperties.getString("useAnno"))) { + if ("true".equals(annotationProperties.getString("useAnno")) && !StringUtils.isEmpty(logicName)) { result.add(logicName); + result.add(NamingUtils.toLowerCamelCase(logicName)); } }); useAnnoLogicNames.put(annoName, result); diff --git a/async_function_pool/src/main/java/com/netease/lib/tasks/util/NamingUtils.java b/async_function_pool/src/main/java/com/netease/lib/tasks/util/NamingUtils.java new file mode 100644 index 0000000..26e8afa --- /dev/null +++ b/async_function_pool/src/main/java/com/netease/lib/tasks/util/NamingUtils.java @@ -0,0 +1,36 @@ +package com.netease.lib.tasks.util; + +public class NamingUtils { + public static String toLowerCamelCase(String str) { + if (str == null || str.isEmpty()) { + return str; + } + + // 如果已经是首字母小写,直接返回 + if (Character.isLowerCase(str.charAt(0))) { + return str; + } + + // 处理多单词的驼峰命名 + StringBuilder result = new StringBuilder(); + boolean firstWord = true; + + // 分割单词(根据大写字母分割) + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (Character.isUpperCase(c) && i > 0) { + if (firstWord) { + result.append(Character.toLowerCase(c)); + firstWord = false; + } else { + result.append(c); + } + } else { + result.append(firstWord ? Character.toLowerCase(c) : c); + firstWord = false; + } + } + + return result.toString(); + } +} diff --git a/excel-parser/pom.xml b/excel-parser/pom.xml index 44ee210..419fef8 100644 --- a/excel-parser/pom.xml +++ b/excel-parser/pom.xml @@ -4,7 +4,7 @@ com.netease.lowcode.extension excel-parser - 1.3.0 + 1.3.1 extension module archetype jar diff --git a/excel-parser/src/main/java/com/netease/lowcode/extension/excel/ExcelParser.java b/excel-parser/src/main/java/com/netease/lowcode/extension/excel/ExcelParser.java index 9a33115..b718c80 100644 --- a/excel-parser/src/main/java/com/netease/lowcode/extension/excel/ExcelParser.java +++ b/excel-parser/src/main/java/com/netease/lowcode/extension/excel/ExcelParser.java @@ -18,7 +18,8 @@ import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; -import java.io.*; +import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -44,8 +45,8 @@ public class ExcelParser { * @param columnFieldMap 列映射:key表示列的索引,value表示映射的字段名称 * @param row 表头的行数 * @param clazz 映射类 - * @return * @param + * @return */ public static ExcelParseResult parseAllSheet(String url, ExcelParseRect rect, Map columnFieldMap, Long row, Class clazz) { return parseBySheetName(url, null, rect, columnFieldMap, row, clazz); @@ -161,24 +162,25 @@ private static InputStream openUrlStream(String url) { /** * 获取文件下载路径,因为是请求本服务所以替换域名为localhost避免出现一些hostname unknown的情况 + * * @param url * @return */ private static String getFileUrl(String url) { int index = url.indexOf("/upload/"); - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - int port = request.getLocalPort(); - String contextPath = request.getContextPath(); - - if (index >= 0) { - //制品中上传文件后的url - url = "http://localhost:" + port + "/upload/" + url.substring(index + "/upload/".length()); - - if (StringUtils.isNotBlank(contextPath) && !"/".equals(contextPath)) { - url = "http://localhost:" + port + contextPath + "/upload/" + url.substring(index + "/upload/".length()); + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (servletRequestAttributes != null) { + HttpServletRequest request = servletRequestAttributes.getRequest(); + int port = request.getLocalPort(); + String contextPath = request.getContextPath(); + if (index >= 0) { + //制品中上传文件后的url + url = "http://localhost:" + port + "/upload/" + url.substring(index + "/upload/".length()); + if (StringUtils.isNotBlank(contextPath) && !"/".equals(contextPath)) { + url = "http://localhost:" + port + contextPath + "/upload/" + url.substring(index + "/upload/".length()); + } } } - log.info("文件下载路径{}", url); return url; } diff --git a/httpclient/pom.xml b/httpclient/pom.xml index 29c7319..5e4566a 100644 --- a/httpclient/pom.xml +++ b/httpclient/pom.xml @@ -16,7 +16,7 @@ httpclient httpclient httpclient - 1.4.1 + 1.4.2 diff --git a/httpclient/src/main/java/com/netease/http/web/filter/ExtHttpLogicAuthFilter.java b/httpclient/src/main/java/com/netease/http/web/filter/ExtHttpLogicAuthFilter.java index 84f5567..4fa81de 100644 --- a/httpclient/src/main/java/com/netease/http/web/filter/ExtHttpLogicAuthFilter.java +++ b/httpclient/src/main/java/com/netease/http/web/filter/ExtHttpLogicAuthFilter.java @@ -70,7 +70,6 @@ public void setExpandLogicAuthFlag(String expandLogicAuthFlag) { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if ("0".equals(this.getExpandLogicAuthFlag())) { - log.debug("逻辑鉴权开关关闭"); filterChain.doFilter(servletRequest, servletResponse); return; } @@ -80,7 +79,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo String requestURI = httpRequest.getRequestURI(); String method = httpRequest.getMethod(); String logicIdentifier = requestURI + LOGIC_IDENTIFIER_SEPARATOR + method; - log.info("当前请求的逻辑标识: {}", logicIdentifier); try { if ("1".equals(this.getExpandLogicAuthFlag()) || "3".equals(this.getExpandLogicAuthFlag())) { Map userInfo = getSession(httpRequest);