diff --git a/build.gradle b/build.gradle index e934733..91538dd 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'cn.gudqs7.idea.plugins' -version '2.6.0' +version '2.6.2' repositories { mavenCentral() diff --git a/parts/changeNotes.html b/parts/changeNotes.html index 589224b..5acbed7 100644 --- a/parts/changeNotes.html +++ b/parts/changeNotes.html @@ -1,6 +1,10 @@
+Release v2.6.2
+    1.支持java8所有的时间类型
+    2.修复近期的一些Issues缺陷
+    3.支持swagger3注解(ruoyi框架常用的几个);
 Release v2.6.0
     1.feat: 批量导出时, 新增带全部数据的单独 markdown 文件; #88
     2.fix: 修复随机字符串使用了中文生僻字过多像乱码一样的问题: 不生成中文, 生成字母; #89
diff --git a/src/main/java/cn/gudqs7/plugins/common/base/reader/AbstractReader.java b/src/main/java/cn/gudqs7/plugins/common/base/reader/AbstractReader.java
index 45ef538..e3d2d16 100644
--- a/src/main/java/cn/gudqs7/plugins/common/base/reader/AbstractReader.java
+++ b/src/main/java/cn/gudqs7/plugins/common/base/reader/AbstractReader.java
@@ -57,7 +57,7 @@ public T read0(StructureAndCommentInfo structureAndCommentInfo, Map children = structureAndCommentInfo.getChildren();
-            if (children != null && children.size() > 0) {
+            if (children != null && !children.isEmpty()) {
                 Map loopData = new HashMap<>(8);
                 loopData.put(MapKeyConstant.READER_PARENT_KEY, parentData);
                 beforeLoop(structureAndCommentInfo, loopData, data, parentData);
diff --git a/src/main/java/cn/gudqs7/plugins/common/enums/CommentTagEnum.java b/src/main/java/cn/gudqs7/plugins/common/enums/CommentTagEnum.java
index c1f8852..2ca0612 100644
--- a/src/main/java/cn/gudqs7/plugins/common/enums/CommentTagEnum.java
+++ b/src/main/java/cn/gudqs7/plugins/common/enums/CommentTagEnum.java
@@ -22,6 +22,7 @@ public enum CommentTagEnum {
     EXAMPLE("example"),
     NOTES("notes"),
     TAGS("tags"),
+    NAME("name"),
     IMPORTANT("important", true),
     DESCRIPTION("description"),
     ;
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/AnnotationHolder.java b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/AnnotationHolder.java
index 9b29a73..d3f6262 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/AnnotationHolder.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/AnnotationHolder.java
@@ -18,6 +18,15 @@ public interface AnnotationHolder {
     String QNAME_OF_PARAM = "io.swagger.annotations.ApiParam";
     String QNAME_OF_RESPONSE = "io.swagger.annotations.ApiResponse";
     String QNAME_OF_RESPONSES = "io.swagger.annotations.ApiResponses";
+
+    // 新增 Swagger v3 注解
+    String QNAME_OF_OPENAPI_API = "io.swagger.v3.oas.annotations.tags.Tag";
+    String QNAME_OF_OPENAPI_OPERATION = "io.swagger.v3.oas.annotations.Operation";
+    String QNAME_OF_OPENAPI_SCHEMA = "io.swagger.v3.oas.annotations.media.Schema";
+    String QNAME_OF_OPENAPI_PARAMETER = "io.swagger.v3.oas.annotations.Parameter";
+    String QNAME_OF_OPENAPI_RESPONSE = "io.swagger.v3.oas.annotations.responses.ApiResponse";
+    String QNAME_OF_OPENAPI_RESPONSES = "io.swagger.v3.oas.annotations.responses.ApiResponses";
+
     String QNAME_OF_MAPPING = "org.springframework.web.bind.annotation.RequestMapping";
     String QNAME_OF_GET_MAPPING = "org.springframework.web.bind.annotation.GetMapping";
     String QNAME_OF_POST_MAPPING = "org.springframework.web.bind.annotation.PostMapping";
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiClassAnnotationHolderImpl.java b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiClassAnnotationHolderImpl.java
index fc0f95d..adf6fb1 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiClassAnnotationHolderImpl.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiClassAnnotationHolderImpl.java
@@ -101,8 +101,9 @@ public CommentInfo getCommentInfoByAnnotation() {
             commentInfo.setValue(getAnnotationValueByQname(QNAME_OF_MODEL, CommentTagEnum.DEFAULT.getTag()));
         }
         if (hasAnnotation(QNAME_OF_API)) {
-            commentInfo.setValue(getAnnotationValueByQname(QNAME_OF_API, CommentTagEnum.DESCRIPTION.getTag()));
-            commentInfo.setNotes(getAnnotationValueByQname(QNAME_OF_API, CommentTagEnum.DESCRIPTION.getTag()));
+            String description = getAnnotationValueByQname(QNAME_OF_API, CommentTagEnum.DESCRIPTION.getTag());
+            commentInfo.setValue(description);
+            commentInfo.setNotes(description);
             List tagsList = getAnnotationListValueByQname(QNAME_OF_API, CommentTagEnum.TAGS.getTag());
             String tags = "";
             if (CollectionUtils.isNotEmpty(tagsList)) {
@@ -111,12 +112,18 @@ public CommentInfo getCommentInfoByAnnotation() {
             commentInfo.setTags(tags);
             commentInfo.setHidden(getAnnotationValueByQname(QNAME_OF_API, CommentTagEnum.HIDDEN.getTag()));
         }
+        if (hasAnnotation(QNAME_OF_OPENAPI_API)) {
+            String description = getAnnotationValueByQname(QNAME_OF_OPENAPI_API, CommentTagEnum.DESCRIPTION.getTag());
+            commentInfo.setValue(description);
+            commentInfo.setNotes(description);
+            commentInfo.setTags(getAnnotationValueByQname(QNAME_OF_OPENAPI_API, CommentTagEnum.NAME.getTag()));
+        }
         return commentInfo;
     }
 
     @Override
     protected boolean usingAnnotation() {
-        return hasAnyOneAnnotation(QNAME_OF_MODEL, QNAME_OF_API);
+        return hasAnyOneAnnotation(QNAME_OF_MODEL, QNAME_OF_API, QNAME_OF_OPENAPI_API);
     }
 
 }
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiFieldAnnotationHolderImpl.java b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiFieldAnnotationHolderImpl.java
index 86acf5b..f706ef0 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiFieldAnnotationHolderImpl.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiFieldAnnotationHolderImpl.java
@@ -5,6 +5,7 @@
 import cn.gudqs7.plugins.common.enums.MoreCommentTagEnum;
 import cn.gudqs7.plugins.common.pojo.resolver.CommentInfo;
 import cn.gudqs7.plugins.common.pojo.resolver.CommentInfoTag;
+import cn.gudqs7.plugins.common.util.structure.PsiAnnotationUtil;
 import com.intellij.psi.PsiAnnotation;
 import com.intellij.psi.PsiComment;
 import com.intellij.psi.PsiElement;
@@ -79,12 +80,12 @@ public CommentInfoTag getCommentInfoByComment() {
     @Override
     public CommentInfo getCommentInfoByAnnotation() {
         CommentInfo commentInfo = new CommentInfo();
-        boolean hasAnnotatation = hasAnnotation(QNAME_OF_PROPERTY);
-        if (hasAnnotatation) {
-            commentInfo.setHidden(getAnnotationValueByProperty(CommentTagEnum.HIDDEN.getTag()));
-            commentInfo.setRequired(getAnnotationValueByProperty(CommentTagEnum.REQUIRED.getTag()));
-            String value = getAnnotationValueByProperty(CommentTagEnum.DEFAULT.getTag());
-            String notes = getAnnotationValueByProperty(CommentTagEnum.NOTES.getTag());
+        PsiAnnotation psiAnnotation = getAnnotationByQname(QNAME_OF_PROPERTY);
+        if (psiAnnotation != null) {
+            commentInfo.setHidden(getAnnotationValueByProperty(psiAnnotation,CommentTagEnum.HIDDEN.getTag()));
+            commentInfo.setRequired(getAnnotationValueByProperty(psiAnnotation,CommentTagEnum.REQUIRED.getTag()));
+            String value = getAnnotationValueByProperty(psiAnnotation,CommentTagEnum.DEFAULT.getTag());
+            String notes = getAnnotationValueByProperty(psiAnnotation,CommentTagEnum.NOTES.getTag());
             if (StringUtils.isNotBlank(value)) {
                 value = value.replaceAll("\\n", CommonConst.BREAK_LINE);
             }
@@ -93,7 +94,15 @@ public CommentInfo getCommentInfoByAnnotation() {
             }
             commentInfo.setValue(value);
             commentInfo.setNotes(notes);
-            commentInfo.setExample(getAnnotationValueByProperty(CommentTagEnum.EXAMPLE.getTag()));
+            commentInfo.setExample(getAnnotationValueByProperty(psiAnnotation,CommentTagEnum.EXAMPLE.getTag()));
+        }
+        psiAnnotation = getAnnotationByQname(QNAME_OF_OPENAPI_SCHEMA);
+        if (psiAnnotation != null) {
+            // 补充 CommentInfo 中已有的属性
+            commentInfo.setHidden(getAnnotationValueByProperty(psiAnnotation, "hidden"));
+            commentInfo.setRequired(getAnnotationValueByProperty(psiAnnotation, "required"));
+            commentInfo.setValue(getAnnotationValueByProperty(psiAnnotation, "description"));
+            commentInfo.setExample(getAnnotationValueByProperty(psiAnnotation, "example"));
         }
         dealOtherAnnotation(commentInfo);
         return commentInfo;
@@ -118,9 +127,19 @@ private   T getAnnotationValueByProperty(String attr) {
         return getAnnotationValueByQname(QNAME_OF_PROPERTY, attr);
     }
 
+    /**
+     * 获取注解中的信息
+     *
+     * @param attr 注解字段
+     * @return 信息
+     */
+    private   T getAnnotationValueByProperty( PsiAnnotation psiAnnotation,String attr) {
+        return PsiAnnotationUtil.getAnnotationValue(psiAnnotation, attr, null);
+    }
+
     @Override
     protected boolean usingAnnotation() {
-        return hasAnnotation(QNAME_OF_PROPERTY);
+        return hasAnyOneAnnotation(QNAME_OF_PROPERTY, QNAME_OF_OPENAPI_SCHEMA);
     }
 
 }
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiMethodAnnotationHolderImpl.java b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiMethodAnnotationHolderImpl.java
index 0ebe6fa..67f6947 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiMethodAnnotationHolderImpl.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiMethodAnnotationHolderImpl.java
@@ -113,8 +113,10 @@ public CommentInfoTag getCommentInfoByComment() {
     @Override
     public CommentInfo getCommentInfoByAnnotation() {
         CommentInfo commentInfo = new CommentInfo();
-        boolean hasOperationAnnotation = hasAnnotation(QNAME_OF_OPERATION);
-        if (hasOperationAnnotation) {
+
+        // 方法级别的注解:优先使用 @ApiOperation,如果没有则使用 @Operation
+        if (hasAnnotation(QNAME_OF_OPERATION)) {
+            // 使用 Swagger v2 的 @ApiOperation 注解
             commentInfo.setHidden(getAnnotationValueByApiOperation(CommentTagEnum.HIDDEN.getTag()));
             String value = getAnnotationValueByApiOperation(CommentTagEnum.DEFAULT.getTag());
             String notes = getAnnotationValueByApiOperation(CommentTagEnum.NOTES.getTag());
@@ -126,34 +128,40 @@ public CommentInfo getCommentInfoByAnnotation() {
             }
             commentInfo.setValue(value);
             commentInfo.setNotes(notes);
+        } else if (hasAnnotation(QNAME_OF_OPENAPI_OPERATION)) {
+            // 使用 Swagger v3 的 @Operation 注解
+            String summary = getAnnotationValueByQname(QNAME_OF_OPENAPI_OPERATION, "summary");
+            String description = getAnnotationValueByQname(QNAME_OF_OPENAPI_OPERATION, "description");
+            commentInfo.setValue(summary); // 映射到 value
+            commentInfo.setNotes(description); // 映射到 notes
         }
-        // 添加 knife4j 的 ApiOperationSupport 注解支持, 主要是 includeParameters 和 ignoreParameters
-        // 优先级是有 ignoreParameters 则跳过 includeParameters 字段
-        if (hasAnnotation(QNAME_OF_OPERATION_SUPPORT)) {
-            List includeParameters = getAnnotationValueByQname(QNAME_OF_OPERATION_SUPPORT, "includeParameters");
-            addRequestTagInfo(commentInfo, includeParameters, MoreCommentTagEnum.ONLY_REQUEST.getTag());
-            List ignoreParameters = getAnnotationValueByQname(QNAME_OF_OPERATION_SUPPORT, "ignoreParameters");
-            addRequestTagInfo(commentInfo, ignoreParameters, MoreCommentTagEnum.HIDDEN_REQUEST.getTag());
-        }
+
+        // 响应信息:优先使用 @ApiResponses,如果没有则使用 @ApiResponses
         if (hasAnnotation(QNAME_OF_RESPONSES)) {
-            // 存在多个 code
+            // 使用 Swagger v2 的 @ApiResponses 注解
             List psiAnnotationList = getAnnotationValueByQname(QNAME_OF_RESPONSES, "value");
-            if (psiAnnotationList != null && psiAnnotationList.size() > 0) {
+            if (psiAnnotationList != null) {
                 for (PsiAnnotation psiAnnotation : psiAnnotationList) {
                     Integer code = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "code", null);
                     String message = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "message", null);
-                    ResponseCodeInfo codeInfo = new ResponseCodeInfo(String.valueOf(code), message);
-                    commentInfo.getResponseCodeInfoList().add(codeInfo);
+                    commentInfo.getResponseCodeInfoList().add(new ResponseCodeInfo(String.valueOf(code), message));
+                }
+            }
+        } else if (hasAnnotation(QNAME_OF_OPENAPI_RESPONSES)) {
+            // 使用 Swagger v3 的 @ApiResponses 注解
+            List psiAnnotationList = getAnnotationValueByQname(QNAME_OF_OPENAPI_RESPONSES, "value");
+            if (psiAnnotationList != null) {
+                for (PsiAnnotation psiAnnotation : psiAnnotationList) {
+                    Integer code = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "responseCode", null);
+                    String description = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "description", null);
+                    commentInfo.getResponseCodeInfoList().add(new ResponseCodeInfo(String.valueOf(code), description));
                 }
             }
-        } else if (hasAnnotation(QNAME_OF_RESPONSE)) {
-            // 存在单个 code
-            Integer code = getAnnotationValueByQname(QNAME_OF_RESPONSE, "code");
-            String message = getAnnotationValueByQname(QNAME_OF_RESPONSE, "message");
-            ResponseCodeInfo codeInfo = new ResponseCodeInfo(String.valueOf(code), message);
-            commentInfo.getResponseCodeInfoList().add(codeInfo);
         }
+
+        // 请求映射处理
         dealRequestMapping(commentInfo);
+
         return commentInfo;
     }
 
@@ -164,6 +172,7 @@ public CommentInfo getCommentInfoByAnnotation() {
      * @return 信息
      */
     private  T getAnnotationValueByApiOperation(String attr) {
+
         return getAnnotationValueByQname(QNAME_OF_OPERATION, attr);
     }
 
@@ -310,7 +319,7 @@ private void dealHttpMethod(CommentInfo commentInfo, String qnameOfXxxMapping, S
 
     @Override
     protected boolean usingAnnotation() {
-        return hasAnnotation(QNAME_OF_OPERATION);
+        return hasAnyOneAnnotation(QNAME_OF_OPERATION,QNAME_OF_OPENAPI_OPERATION);
     }
 
 }
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiParameterAnnotationHolderImpl.java b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiParameterAnnotationHolderImpl.java
index b469201..ff243c9 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiParameterAnnotationHolderImpl.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiParameterAnnotationHolderImpl.java
@@ -35,6 +35,7 @@ public CommentInfoTag getCommentInfoByComment() {
         CommentInfoTag commentInfoTag = new CommentInfoTag();
         PsiElement parent = psiParameter.getParent().getParent();
         String parameterName = psiParameter.getName();
+
         if (parent instanceof PsiMethod) {
             for (PsiElement child : parent.getChildren()) {
                 if (child instanceof PsiDocComment) {
@@ -42,49 +43,19 @@ public CommentInfoTag getCommentInfoByComment() {
                     Map moreCommentTagMap = MoreCommentTagEnum.allTagMap();
                     PsiDocComment psiComment = (PsiDocComment) child;
                     String text = psiComment.getText();
+
                     if (text.startsWith("/**") && text.endsWith("*/")) {
                         String[] lines = text.replaceAll("\r", "").split("\n");
                         for (String line : lines) {
-                            if (line.contains("/**") || line.contains("*/")) {
-                                continue;
-                            }
-                            line = removeJavaDocPrefix(line);
-                            if (StringUtils.isBlank(line)) {
+                            line = processCommentLine(line);
+                            if (line == null) {
                                 continue;
                             }
-                            if (line.contains("@")) {
-                                String atParam = "@param";
-                                if (line.startsWith("@param")) {
-                                    line = line.substring(atParam.length()).trim();
-                                    String[] paramInfoArray = line.split(" ");
-                                    String fieldName = "";
-                                    if (paramInfoArray.length > 0) {
-                                        fieldName = paramInfoArray[0];
-                                    }
-                                    if (!fieldName.equals(parameterName)) {
-                                        continue;
-                                    }
-                                    String tag = line.substring(fieldName.length()).trim();
-                                    String[] tagArray = tag.split(" ");
-                                    for (String t : tagArray) {
-                                        String tagName = t;
-                                        String tagVal = null;
-                                        if (t.contains("=")) {
-                                            String[] tagKeyVal = t.split("=");
-                                            tagName = tagKeyVal[0];
-                                            if (tagKeyVal.length > 1) {
-                                                tagVal = tagKeyVal[1];
-                                            }
-                                        }
-                                        if (commentTagMap.containsKey(tagName)) {
-                                            setCommentInfoByTag(commentInfoTag, tagName, tagVal);
-                                        } else if (moreCommentTagMap.containsKey(tagName)) {
-                                            commentInfoTag.appendToTag(tagName, tagVal);
-                                        } else {
-                                            commentInfoTag.appendValue(t, CommonConst.SPACE);
-                                        }
-                                    }
-                                }
+
+                            if (line.startsWith("@param")) {
+                                processParamTag(line, parameterName, commentTagMap, moreCommentTagMap, commentInfoTag);
+                            } else {
+                                commentInfoTag.appendValue(line, CommonConst.SPACE);
                             }
                         }
                     }
@@ -92,10 +63,66 @@ public CommentInfoTag getCommentInfoByComment() {
                 }
             }
         }
+
         dealOtherAnnotation(commentInfoTag);
         return commentInfoTag;
     }
 
+    private String processCommentLine(String line) {
+        // 去除注释前缀并修剪空白字符
+        line = removeJavaDocPrefix(line).trim();
+        if (StringUtils.isBlank(line)) {
+            return null; // 如果行为空或仅包含空白字符,返回 null
+        }
+        return line;
+    }
+
+    private void processParamTag(String line, String parameterName,
+                                 Map commentTagMap,
+                                 Map moreCommentTagMap,
+                                 CommentInfoTag commentInfoTag) {
+        // 去掉 "@param" 前缀
+        line = line.substring("@param".length()).trim();
+        // 分割参数名和注释内容
+        String[] paramInfoArray = line.split(" ", 2);
+        if (paramInfoArray.length < 2) {
+            return; // 格式错误,跳过
+        }
+
+        String fieldName = paramInfoArray[0];
+        if (!fieldName.equals(parameterName)) {
+            return; // 不是当前参数,跳过
+        }
+
+        // 获取注释内容部分
+        String tagContent = paramInfoArray[1];
+        // 分割注释内容中的标签
+        String[] tagArray = tagContent.split(" ");
+        for (String tagEntry : tagArray) {
+            String tagName = tagEntry;
+            String tagVal = null;
+
+            // 处理键值对形式的标签
+            if (tagEntry.contains("=")) {
+                String[] tagKeyValue = tagEntry.split("=", 2);
+                tagName = tagKeyValue[0];
+                if (tagKeyValue.length > 1) {
+                    tagVal = tagKeyValue[1];
+                }
+            }
+
+            // 根据标签类型处理
+            if (commentTagMap.containsKey(tagName)) {
+                setCommentInfoByTag(commentInfoTag, tagName, tagVal);
+            } else if (moreCommentTagMap.containsKey(tagName)) {
+                commentInfoTag.appendToTag(tagName, tagVal);
+            } else {
+                commentInfoTag.appendValue(tagEntry, CommonConst.SPACE);
+            }
+        }
+    }
+
+
     @Override
     public CommentInfo getCommentInfoByAnnotation() {
         CommentInfo commentInfo = new CommentInfo();
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/structure/StructureAndCommentResolver.java b/src/main/java/cn/gudqs7/plugins/common/resolver/structure/StructureAndCommentResolver.java
index 97db4e0..e0e042f 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/structure/StructureAndCommentResolver.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/structure/StructureAndCommentResolver.java
@@ -283,7 +283,7 @@ private StructureAndCommentInfo resolveByPsiType0(StructureAndCommentInfo parent
         structureAndCommentInfo.setFieldName(fieldName);
         structureAndCommentInfo.setCommentInfo(commentInfo);
         structureAndCommentInfo.setFieldType(fieldTypeName);
-        structureAndCommentInfo.setOriginalFieldType(psiFieldTypeName);
+        structureAndCommentInfo.setOriginalFieldType(psiFieldType.getCanonicalText());
         structureAndCommentInfo.setFieldTypeCode(fieldTypeCode);
         structureAndCommentInfo.setOriginalFieldTypeCode(FieldType.BASE.getType());
         structureAndCommentInfo.setPsiType(psiFieldType);
diff --git a/src/main/java/cn/gudqs7/plugins/common/util/structure/BaseTypeUtil.java b/src/main/java/cn/gudqs7/plugins/common/util/structure/BaseTypeUtil.java
index fb59b2b..c93f00f 100644
--- a/src/main/java/cn/gudqs7/plugins/common/util/structure/BaseTypeUtil.java
+++ b/src/main/java/cn/gudqs7/plugins/common/util/structure/BaseTypeUtil.java
@@ -7,6 +7,7 @@
 import cn.gudqs7.plugins.common.util.PluginSettingHelper;
 import com.intellij.psi.PsiClass;
 import com.intellij.psi.PsiType;
+import groovy.lang.GroovyShell;
 import lombok.Data;
 import org.apache.commons.lang.time.DateFormatUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -14,6 +15,7 @@
 
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.function.Function;
 
@@ -30,13 +32,11 @@ public class BaseTypeUtil {
     static {
         Function stringGetFn = commentInfo -> {
             String example = commentInfo.getExample("");
-            boolean noExampleValue = StringUtils.isBlank(example);
-            return noExampleValue ? randomString(commentInfo) : example;
+            return StringUtils.isBlank(example) ? randomString(commentInfo) : example;
         };
         Function dateGetFn = commentInfo -> {
             String example = commentInfo.getExample("");
-            boolean noExampleValue = StringUtils.isBlank(example);
-            return noExampleValue ? randomDate(commentInfo) : example;
+            return StringUtils.isBlank(example) ? randomDate(commentInfo) : example;
         };
         // 此处处理不能直接 new 的类型, 也就是接口, 常用的接口目前只想到三大集合
         OTHER_INTERFACE_MAP.put("java.util.List", TypeInfo.of("java.util.ArrayList", "new ArrayList<>()", new ArrayList<>()));
@@ -49,16 +49,30 @@ public class BaseTypeUtil {
         OTHER_BASE_TYPE_MAP.put("java.lang.Number", TypeInfo.of("0", commentInfo -> 0));
         OTHER_BASE_TYPE_MAP.put("java.math.BigDecimal", TypeInfo.of("java.math.BigDecimal", "new BigDecimal(0)", commentInfo -> {
             String example = commentInfo.getExample("");
-            boolean noExampleValue = StringUtils.isBlank(example);
-            return noExampleValue ? BigDecimal.valueOf(randomDouble()) : new BigDecimal(example);
+            return StringUtils.isBlank(example) ? BigDecimal.valueOf(randomDouble()).setScale(2, RoundingMode.HALF_UP) : new BigDecimal(example);
         }));
 
         // 日期, 时间
-        OTHER_BASE_TYPE_MAP.put("java.util.Date", TypeInfo.of("java.util.Date", "new Date()", dateGetFn));
-        OTHER_BASE_TYPE_MAP.put("java.time.LocalDateTime", TypeInfo.of("java.time.LocalDateTime", "LocalDateTime.now()", dateGetFn));
-        OTHER_BASE_TYPE_MAP.put("java.sql.Date", TypeInfo.of("java.sql.Date", "new Date(System.currentTimeMillis())", dateGetFn));
-        OTHER_BASE_TYPE_MAP.put("java.sql.Timestamp", TypeInfo.of("java.sql.Timestamp", "new Timestamp(System.currentTimeMillis())", dateGetFn));
-        OTHER_BASE_TYPE_MAP.put("java.sql.Time", TypeInfo.of("java.sql.Time", "new Time(System.currentTimeMillis())", dateGetFn));
+        OTHER_BASE_TYPE_MAP.put("java.util.Date", TypeInfo.of("java.util.Date", "org.apache.commons.lang.time.DateFormatUtils.format(new java.util.Date(), \"yyyy-MM-dd HH:mm:ss\")", dateGetFn));
+        OTHER_BASE_TYPE_MAP.put("java.sql.Date", TypeInfo.of("java.sql.Date", "new java.sql.Date(System.currentTimeMillis()).toString()", dateGetFn));
+        OTHER_BASE_TYPE_MAP.put("java.sql.Timestamp", TypeInfo.of("java.sql.Timestamp", "new java.sql.Timestamp(System.currentTimeMillis()).toString()", dateGetFn));
+        OTHER_BASE_TYPE_MAP.put("java.sql.Time", TypeInfo.of("java.sql.Time", "new java.sql.Time(System.currentTimeMillis()).toString()", dateGetFn));
+
+        // 添加 Java 8 时间类型
+        OTHER_BASE_TYPE_MAP.put("java.time.LocalDateTime", TypeInfo.of("java.time.LocalDateTime",
+                "java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"))", dateGetFn));
+        OTHER_BASE_TYPE_MAP.put("java.time.LocalDate", TypeInfo.of("java.time.LocalDate",
+                "java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.ofPattern(\"yyyy-MM-dd\"))", dateGetFn));
+        OTHER_BASE_TYPE_MAP.put("java.time.LocalTime", TypeInfo.of("java.time.LocalTime",
+                "java.time.LocalTime.now().format(java.time.format.DateTimeFormatter.ofPattern(\"HH:mm:ss\"))", dateGetFn));
+        OTHER_BASE_TYPE_MAP.put("java.time.Instant", TypeInfo.of("java.time.Instant",
+                "java.time.Instant.now().atZone(java.time.ZoneId.systemDefault()).format(java.time.format.DateTimeFormatter.ofPattern(\"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'\"))", dateGetFn));
+        OTHER_BASE_TYPE_MAP.put("java.time.ZonedDateTime", TypeInfo.of("java.time.ZonedDateTime",
+                "java.time.ZonedDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss.SSSXXX\"))", dateGetFn));
+        OTHER_BASE_TYPE_MAP.put("java.time.OffsetDateTime", TypeInfo.of("java.time.OffsetDateTime",
+                "java.time.OffsetDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern(\"yyyy-MM-dd'T'HH:mm:ss.SSSXXX\"))", dateGetFn));
+        OTHER_BASE_TYPE_MAP.put("java.time.OffsetTime", TypeInfo.of("java.time.OffsetTime",
+                "java.time.OffsetTime.now().format(java.time.format.DateTimeFormatter.ofPattern(\"HH:mm:ss.SSSXXX\"))", dateGetFn));
 
         OTHER_BASE_TYPE_MAP.put("java.sql.Blob", TypeInfo.of("javax.sql.rowset.serial.SerialBlob", "new SerialBlob(new byte[]{})", stringGetFn));
         OTHER_BASE_TYPE_MAP.put("java.sql.Clob", TypeInfo.of("javax.sql.rowset.serial.SerialClob", "new SerialClob(new char[]{})", stringGetFn));
@@ -248,12 +262,17 @@ public static Object getBaseDefaultVal(PsiType psiType, CommentInfo commentInfo)
         String typeName = psiType.getPresentableText();
         String qName = psiType.getCanonicalText();
         TypeInfo typeInfo = JAVA_BASE_TYPE_MAP.get(typeName.toLowerCase());
-        if (typeInfo == null) {
-            typeInfo = OTHER_BASE_TYPE_MAP.get(qName);
-        }
         if (typeInfo != null) {
             return typeInfo.getDefaultValGetFn().apply(commentInfo);
         }
+        typeInfo = OTHER_BASE_TYPE_MAP.get(qName);
+        if (typeInfo != null) {
+            Object defaultValue = typeInfo.getDefaultValGetFn().apply(commentInfo);
+            if (defaultValue == null ) {
+                defaultValue =  new GroovyShell().evaluate(typeInfo.getDefaultValStr());
+            }
+            return defaultValue;
+        }
         return null;
     }
 
@@ -290,9 +309,14 @@ private static boolean notUsingRandom() {
     }
 
     private static String randomDate(CommentInfo commentInfo) {
+        String pattern = commentInfo.getSingleStr(MoreCommentTagEnum.DATE_FORMAT.getTag(), null);
+        if (pattern == null) {
+            pattern = commentInfo.getSingleStr(MoreCommentTagEnum.JSON_FORMAT.getTag(), null);
+        }
+        if (pattern == null) {
+            return null;
+        }
         Date now = new Date();
-        String pattern = commentInfo.getSingleStr(MoreCommentTagEnum.JSON_FORMAT.getTag(), "yyyy-MM-dd'T'HH:mm:ss.SSS+0000");
-        pattern = commentInfo.getSingleStr(MoreCommentTagEnum.DATE_FORMAT.getTag(), pattern);
         now.setTime(System.currentTimeMillis() + RandomUtils.nextLong(0, 86400000));
         if (notUsingRandom()) {
             now.setTime(1338182040520L);
diff --git a/src/main/java/cn/gudqs7/plugins/common/util/structure/PsiAnnotationUtil.java b/src/main/java/cn/gudqs7/plugins/common/util/structure/PsiAnnotationUtil.java
index 684e1ec..0a8e02f 100644
--- a/src/main/java/cn/gudqs7/plugins/common/util/structure/PsiAnnotationUtil.java
+++ b/src/main/java/cn/gudqs7/plugins/common/util/structure/PsiAnnotationUtil.java
@@ -1,10 +1,7 @@
 package cn.gudqs7.plugins.common.util.structure;
 
 import com.intellij.codeInsight.AnnotationUtil;
-import com.intellij.psi.JavaPsiFacade;
-import com.intellij.psi.PsiAnnotation;
-import com.intellij.psi.PsiAnnotationMemberValue;
-import com.intellij.psi.PsiReferenceExpression;
+import com.intellij.psi.*;
 import lombok.SneakyThrows;
 import org.jetbrains.annotations.NotNull;
 
@@ -124,19 +121,25 @@ public static  T getAnnotationInfoByPojo(PsiAnnotation psiAnnotation,@NotNull
         return instance;
     }
 
+
     private static Object getValueByPsiAnnotationMemberValue(PsiAnnotationMemberValue value) {
         if (value instanceof PsiReferenceExpression) {
             PsiReferenceExpression psiReferenceExpression = (PsiReferenceExpression) value;
-            String text = psiReferenceExpression.getText();
-            String prefixWithRequestMethod = "RequestMethod.";
-            if (text.startsWith(prefixWithRequestMethod)) {
-                return text.substring(prefixWithRequestMethod.length());
-            } else {
-                return text;
+            PsiElement resolvedElement = psiReferenceExpression.resolve();
+            // 如果解析到的是一个字段(如静态常量)
+            if (resolvedElement instanceof PsiField) {
+                PsiField field = (PsiField) resolvedElement;
+                PsiExpression initializer = field.getInitializer();
+                if (initializer != null) {
+                    // 递归解析字段的初始化表达式
+                    return getValueByPsiAnnotationMemberValue(initializer);
+                }
             }
         } else {
+            // 尝试直接计算常量表达式的值
             return computeConstantExpression(value);
         }
+        return null;
     }
 
     private static Object computeConstantExpression(PsiAnnotationMemberValue psiAnnotationMemberValue) {
diff --git a/src/main/java/cn/gudqs7/plugins/savior/reader/Java2BulkReader.java b/src/main/java/cn/gudqs7/plugins/savior/reader/Java2BulkReader.java
index 35fc8bf..c9937cd 100644
--- a/src/main/java/cn/gudqs7/plugins/savior/reader/Java2BulkReader.java
+++ b/src/main/java/cn/gudqs7/plugins/savior/reader/Java2BulkReader.java
@@ -47,7 +47,7 @@ protected List handleReturnNull() {
     }
 
     private List getBulkList(Map json, String prefix) {
-        if (json == null || json.size() == 0) {
+        if (json == null || json.isEmpty()) {
             return new ArrayList<>();
         }
         List kvList = new ArrayList<>();
@@ -62,7 +62,7 @@ private List getBulkList(Map json, String prefix)
     private void handleKeyValue(String prefix, List kvList, String key, Object value) {
         if (value instanceof Map) {
             Map map = (Map) value;
-            if (map.size() == 0) {
+            if (map.isEmpty()) {
                 kvList.add(kv(prefix + key, FINAL_DEFAULT_OBJECT_EXAMPLE, "", true));
             } else {
                 List mapKvList = getBulkList(map, prefix + key + ".");
diff --git a/src/main/java/cn/gudqs7/plugins/savior/theme/RestfulTheme.java b/src/main/java/cn/gudqs7/plugins/savior/theme/RestfulTheme.java
index 3717be0..602233b 100644
--- a/src/main/java/cn/gudqs7/plugins/savior/theme/RestfulTheme.java
+++ b/src/main/java/cn/gudqs7/plugins/savior/theme/RestfulTheme.java
@@ -65,7 +65,7 @@ public boolean handleMethodHidden(AnnotationHolder annotationHolder) {
 
     @Override
     public void afterCollectData(Map dataByStr, Project project, PsiMethod publicMethod, String interfaceClassName, CommentInfo commentInfo, StructureAndCommentInfo paramStructureAndCommentInfo, StructureAndCommentInfo returnStructureAndCommentInfo, Map java2jsonMap, Map returnJava2jsonMap, String java2jsonStr, String returnJava2jsonStr) {
-        if (java2jsonMap == null || java2jsonMap.size() == 0) {
+        if (java2jsonMap == null || java2jsonMap.isEmpty()) {
             dataByStr.put("jsonExample", "");
             return;
         }