From dc9bf3e25d2bfeb736fc9801363cee9fea99910d Mon Sep 17 00:00:00 2001
From: zhouweiyi
Date: 星期三, 14 五月 2025 15:41:57 +0800
Subject: [PATCH] pdf文件解析成异步处理

---
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeInfoService.java      |    2 
 script/sql/update/202505141010.sql                                                                    |    6 
 ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIApplication.java                                           |    2 
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeAttachBo.java        |   95 ++-
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java |  501 +++++++++++-------
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/constant/DealStatus.java                |   16 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java   |    2 
 ruoyi-modules/ruoyi-generator/src/main/java/org/ruoyi/generator/util/VelocityUtils.java               |  718 +++++++++++++-------------
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeAttach.java             |   84 ++-
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeAttachVo.java        |  100 ++-
 10 files changed, 866 insertions(+), 660 deletions(-)

diff --git a/ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIApplication.java b/ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIApplication.java
index 2d0693c..df57f7e 100644
--- a/ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIApplication.java
+++ b/ruoyi-admin/src/main/java/org/ruoyi/RuoYiAIApplication.java
@@ -3,6 +3,7 @@
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * 鍚姩绋嬪簭
@@ -10,6 +11,7 @@
  * @author Lion Li
  */
 @SpringBootApplication
+@EnableScheduling
 public class RuoYiAIApplication {
 
     public static void main(String[] args) {
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/constant/DealStatus.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/constant/DealStatus.java
new file mode 100644
index 0000000..aadf19a
--- /dev/null
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/constant/DealStatus.java
@@ -0,0 +1,16 @@
+package org.ruoyi.constant;
+
+/**
+ * @Description:
+ * @Date: 2025/5/14 涓嬪崍2:04
+ */
+public class DealStatus {
+  //鏈紑濮�
+  public static final Integer STATUS_10 = 10;
+  //杩涜涓�
+  public static final Integer STATUS_20 = 20;
+  //宸茬粨鏉�
+  public static final Integer STATUS_30 = 30;
+
+
+}
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeAttach.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeAttach.java
index 5935ddc..c6b812a 100644
--- a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeAttach.java
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/KnowledgeAttach.java
@@ -18,44 +18,66 @@
 @TableName("knowledge_attach")
 public class KnowledgeAttach extends BaseEntity {
 
-    @Serial
-    private static final long serialVersionUID = 1L;
+  @Serial
+  private static final long serialVersionUID = 1L;
 
-    /**
-     *
-     */
-    @TableId(value = "id")
-    private Long id;
+  /**
+   *
+   */
+  @TableId(value = "id")
+  private Long id;
 
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    private String kid;
+  /**
+   * 鐭ヨ瘑搴揑D
+   */
+  private String kid;
 
-    /**
-     * 鏂囨。ID
-     */
-    private String docId;
+  /**
+   * 鏂囨。ID
+   */
+  private String docId;
 
-    /**
-     * 鏂囨。鍚嶇О
-     */
-    private String docName;
+  /**
+   * 鏂囨。鍚嶇О
+   */
+  private String docName;
 
-    /**
-     * 鏂囨。绫诲瀷
-     */
-    private String docType;
+  /**
+   * 鏂囨。绫诲瀷
+   */
+  private String docType;
 
-    /**
-     * 鏂囨。鍐呭
-     */
-    private String content;
+  /**
+   * 鏂囨。鍐呭
+   */
+  private String content;
 
-    /**
-     * 澶囨敞
-     */
-    private String remark;
+  /**
+   * 澶囨敞
+   */
+  private String remark;
 
 
+  /**
+   * 瀵硅薄瀛樺偍涓婚敭
+   */
+  private Long ossId;
+
+
+
+  /**
+   * 鎷嗚В鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�
+   */
+  private Integer picStatus;
+
+  /**
+   * 鍒嗘瀽鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�
+   */
+  private Integer picAnysStatus;
+
+  /**
+   * 鍐欏叆鍚戦噺鏁版嵁搴撶姸鎬�10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�
+   */
+  private Integer vectorStatus;
+
 }
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeAttachBo.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeAttachBo.java
index 3851a22..7db1770 100644
--- a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeAttachBo.java
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/bo/KnowledgeAttachBo.java
@@ -20,47 +20,72 @@
 @AutoMapper(target = KnowledgeAttach.class, reverseConvertGenerate = false)
 public class KnowledgeAttachBo extends BaseEntity {
 
-    /**
-     *
-     */
-    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
-    private Long id;
+  /**
+   *
+   */
+  @NotNull(message = "涓嶈兘涓虹┖", groups = {EditGroup.class})
+  private Long id;
 
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    @NotBlank(message = "鐭ヨ瘑搴揑D涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String kid;
+  /**
+   * 鐭ヨ瘑搴揑D
+   */
+  @NotBlank(message = "鐭ヨ瘑搴揑D涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+  private String kid;
 
-    /**
-     * 鏂囨。ID
-     */
-    @NotBlank(message = "鏂囨。ID涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String docId;
+  /**
+   * 鏂囨。ID
+   */
+  @NotBlank(message = "鏂囨。ID涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+  private String docId;
 
-    /**
-     * 鏂囨。鍚嶇О
-     */
-    @NotBlank(message = "鏂囨。鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String docName;
+  /**
+   * 鏂囨。鍚嶇О
+   */
+  @NotBlank(message = "鏂囨。鍚嶇О涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+  private String docName;
 
-    /**
-     * 鏂囨。绫诲瀷
-     */
-    @NotBlank(message = "鏂囨。绫诲瀷涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String docType;
+  /**
+   * 鏂囨。绫诲瀷
+   */
+  @NotBlank(message = "鏂囨。绫诲瀷涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+  private String docType;
 
-    /**
-     * 鏂囨。鍐呭
-     */
-    @NotBlank(message = "鏂囨。鍐呭涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String content;
+  /**
+   * 鏂囨。鍐呭
+   */
+  @NotBlank(message = "鏂囨。鍐呭涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+  private String content;
 
-    /**
-     * 澶囨敞
-     */
-    @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
-    private String remark;
+  /**
+   * 澶囨敞
+   */
+  @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+  private String remark;
+
+  /**
+   * 瀵硅薄瀛樺偍涓婚敭
+   */
+  @NotNull(message = "瀵硅薄瀛樺偍涓婚敭涓嶈兘涓虹┖", groups = {AddGroup.class, EditGroup.class})
+  private Long ossId;
+
+
+  /**
+   * 鎷嗚В鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�
+   */
+  @NotNull(message = "鎷嗚В鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴愪笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+  private Integer picStatus;
+
+  /**
+   * 鍒嗘瀽鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�
+   */
+  @NotNull(message = "鍒嗘瀽鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴愪笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+  private Integer picAnysStatus;
+
+  /**
+   * 鍐欏叆鍚戦噺鏁版嵁搴撶姸鎬�10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�
+   */
+  @NotNull(message = "鍐欏叆鍚戦噺鏁版嵁搴撶姸鎬�10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴愪笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+  private Integer vectorStatus;
 
 
 }
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeAttachVo.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeAttachVo.java
index fb463d4..8a9db27 100644
--- a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeAttachVo.java
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/domain/vo/KnowledgeAttachVo.java
@@ -10,8 +10,6 @@
 import java.io.Serializable;
 
 
-
-
 /**
  * 鐭ヨ瘑搴撻檮浠惰鍥惧璞� knowledge_attach
  *
@@ -23,50 +21,74 @@
 @AutoMapper(target = KnowledgeAttach.class)
 public class KnowledgeAttachVo implements Serializable {
 
-    @Serial
-    private static final long serialVersionUID = 1L;
+  @Serial
+  private static final long serialVersionUID = 1L;
 
-    /**
-     *
-     */
-    @ExcelProperty(value = "")
-    private Long id;
+  /**
+   *
+   */
+  @ExcelProperty(value = "")
+  private Long id;
 
-    /**
-     * 鐭ヨ瘑搴揑D
-     */
-    @ExcelProperty(value = "鐭ヨ瘑搴揑D")
-    private String kid;
+  /**
+   * 鐭ヨ瘑搴揑D
+   */
+  @ExcelProperty(value = "鐭ヨ瘑搴揑D")
+  private String kid;
 
-    /**
-     * 鏂囨。ID
-     */
-    @ExcelProperty(value = "鏂囨。ID")
-    private String docId;
+  /**
+   * 鏂囨。ID
+   */
+  @ExcelProperty(value = "鏂囨。ID")
+  private String docId;
 
-    /**
-     * 鏂囨。鍚嶇О
-     */
-    @ExcelProperty(value = "鏂囨。鍚嶇О")
-    private String docName;
+  /**
+   * 鏂囨。鍚嶇О
+   */
+  @ExcelProperty(value = "鏂囨。鍚嶇О")
+  private String docName;
 
-    /**
-     * 鏂囨。绫诲瀷
-     */
-    @ExcelProperty(value = "鏂囨。绫诲瀷")
-    private String docType;
+  /**
+   * 鏂囨。绫诲瀷
+   */
+  @ExcelProperty(value = "鏂囨。绫诲瀷")
+  private String docType;
 
-    /**
-     * 鏂囨。鍐呭
-     */
-    @ExcelProperty(value = "鏂囨。鍐呭")
-    private String content;
+  /**
+   * 鏂囨。鍐呭
+   */
+  @ExcelProperty(value = "鏂囨。鍐呭")
+  private String content;
 
-    /**
-     * 澶囨敞
-     */
-    @ExcelProperty(value = "澶囨敞")
-    private String remark;
+  /**
+   * 澶囨敞
+   */
+  @ExcelProperty(value = "澶囨敞")
+  private String remark;
+
+  /**
+   * 瀵硅薄瀛樺偍涓婚敭
+   */
+  @ExcelProperty(value = "瀵硅薄瀛樺偍涓婚敭")
+  private Long ossId;
 
 
+
+  /**
+   * 鎷嗚В鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�
+   */
+  @ExcelProperty(value = "鎷嗚В鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�")
+  private Integer picStatus;
+
+  /**
+   * 鍒嗘瀽鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�
+   */
+  @ExcelProperty(value = "鍒嗘瀽鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�")
+  private Integer picAnysStatus;
+
+  /**
+   * 鍐欏叆鍚戦噺鏁版嵁搴撶姸鎬�10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�
+   */
+  @ExcelProperty(value = "鍐欏叆鍚戦噺鏁版嵁搴撶姸鎬�10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�")
+  private Integer vectorStatus;
 }
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeInfoService.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeInfoService.java
index 79ce870..e965579 100644
--- a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeInfoService.java
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/IKnowledgeInfoService.java
@@ -61,5 +61,5 @@
     /**
      * 涓婁紶闄勪欢
      */
-    void upload(KnowledgeInfoUploadBo bo);
+    void upload(KnowledgeInfoUploadBo bo) throws Exception;
 }
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java
index 68fc661..4b57e25 100644
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/controller/knowledge/KnowledgeController.java
@@ -118,7 +118,7 @@
    * 涓婁紶鐭ヨ瘑搴撻檮浠�
    */
   @PostMapping(value = "/attach/upload")
-  public R<String> upload(KnowledgeInfoUploadBo bo) {
+  public R<String> upload(KnowledgeInfoUploadBo bo) throws Exception {
     knowledgeInfoService.upload(bo);
     return R.ok("涓婁紶鐭ヨ瘑搴撻檮浠舵垚鍔�!");
   }
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java
index 00153c3..3c5bb34 100644
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java
@@ -1,11 +1,14 @@
 package org.ruoyi.chat.service.knowledge;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import java.util.stream.Collectors;
 import lombok.RequiredArgsConstructor;
 import org.ruoyi.chain.loader.ResourceLoader;
 import org.ruoyi.chain.loader.ResourceLoaderFactory;
@@ -13,6 +16,8 @@
 import org.ruoyi.common.core.utils.MapstructUtils;
 import org.ruoyi.common.core.utils.StringUtils;
 import org.ruoyi.common.satoken.utils.LoginHelper;
+import org.ruoyi.constant.DealStatus;
+import org.ruoyi.constant.FileType;
 import org.ruoyi.core.page.PageQuery;
 import org.ruoyi.core.page.TableDataInfo;
 import org.ruoyi.domain.ChatModel;
@@ -30,11 +35,15 @@
 import org.ruoyi.service.IChatModelService;
 import org.ruoyi.service.VectorStoreService;
 import org.ruoyi.service.IKnowledgeInfoService;
+import org.ruoyi.system.domain.vo.SysOssVo;
+import org.ruoyi.system.service.ISysOssService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.scheduling.annotation.Async;
 
 import java.io.IOException;
 import java.util.*;
@@ -49,217 +58,321 @@
 @Service
 public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
 
-    private static final Logger log = LoggerFactory.getLogger(KnowledgeInfoServiceImpl.class);
-    private final KnowledgeInfoMapper baseMapper;
+  private static final Logger log = LoggerFactory.getLogger(KnowledgeInfoServiceImpl.class);
+  private final KnowledgeInfoMapper baseMapper;
 
-    private final VectorStoreService vectorStoreService;
+  private final VectorStoreService vectorStoreService;
 
-    private final ResourceLoaderFactory resourceLoaderFactory;
+  private final ResourceLoaderFactory resourceLoaderFactory;
 
-    private final KnowledgeFragmentMapper fragmentMapper;
+  private final KnowledgeFragmentMapper fragmentMapper;
 
-    private final KnowledgeAttachMapper attachMapper;
+  private final KnowledgeAttachMapper attachMapper;
 
-    private final IChatModelService chatModelService;
+  private final IChatModelService chatModelService;
 
-    /**
-     * 鏌ヨ鐭ヨ瘑搴�
-     */
-    @Override
-    public KnowledgeInfoVo queryById(Long id){
-        return baseMapper.selectVoById(id);
+  private final ISysOssService ossService;
+
+  /**
+   * 鏌ヨ鐭ヨ瘑搴�
+   */
+  @Override
+  public KnowledgeInfoVo queryById(Long id) {
+    return baseMapper.selectVoById(id);
+  }
+
+  /**
+   * 鏌ヨ鐭ヨ瘑搴撳垪琛�
+   */
+  @Override
+  public TableDataInfo<KnowledgeInfoVo> queryPageList(KnowledgeInfoBo bo, PageQuery pageQuery) {
+    LambdaQueryWrapper<KnowledgeInfo> lqw = buildQueryWrapper(bo);
+    Page<KnowledgeInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+    return TableDataInfo.build(result);
+  }
+
+  /**
+   * 鏌ヨ鐭ヨ瘑搴撳垪琛�
+   */
+  @Override
+  public List<KnowledgeInfoVo> queryList(KnowledgeInfoBo bo) {
+    LambdaQueryWrapper<KnowledgeInfo> lqw = buildQueryWrapper(bo);
+    return baseMapper.selectVoList(lqw);
+  }
+
+  private LambdaQueryWrapper<KnowledgeInfo> buildQueryWrapper(KnowledgeInfoBo bo) {
+    Map<String, Object> params = bo.getParams();
+    LambdaQueryWrapper<KnowledgeInfo> lqw = Wrappers.lambdaQuery();
+    lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeInfo::getKid, bo.getKid());
+    lqw.eq(bo.getUid() != null, KnowledgeInfo::getUid, bo.getUid());
+    lqw.like(StringUtils.isNotBlank(bo.getKname()), KnowledgeInfo::getKname, bo.getKname());
+    lqw.eq(bo.getShare() != null, KnowledgeInfo::getShare, bo.getShare());
+    lqw.eq(StringUtils.isNotBlank(bo.getDescription()), KnowledgeInfo::getDescription,
+        bo.getDescription());
+    lqw.eq(StringUtils.isNotBlank(bo.getKnowledgeSeparator()), KnowledgeInfo::getKnowledgeSeparator,
+        bo.getKnowledgeSeparator());
+    lqw.eq(StringUtils.isNotBlank(bo.getQuestionSeparator()), KnowledgeInfo::getQuestionSeparator,
+        bo.getQuestionSeparator());
+    lqw.eq(bo.getOverlapChar() != null, KnowledgeInfo::getOverlapChar, bo.getOverlapChar());
+    lqw.eq(bo.getRetrieveLimit() != null, KnowledgeInfo::getRetrieveLimit, bo.getRetrieveLimit());
+    lqw.eq(bo.getTextBlockSize() != null, KnowledgeInfo::getTextBlockSize, bo.getTextBlockSize());
+    lqw.eq(StringUtils.isNotBlank(bo.getVector()), KnowledgeInfo::getVector, bo.getVector());
+    lqw.eq(StringUtils.isNotBlank(bo.getVectorModel()), KnowledgeInfo::getVectorModel,
+        bo.getVectorModel());
+    return lqw;
+  }
+
+  /**
+   * 鏂板鐭ヨ瘑搴�
+   */
+  @Override
+  public Boolean insertByBo(KnowledgeInfoBo bo) {
+    KnowledgeInfo add = MapstructUtils.convert(bo, KnowledgeInfo.class);
+    validEntityBeforeSave(add);
+    boolean flag = baseMapper.insert(add) > 0;
+    if (flag) {
+      bo.setId(add.getId());
+    }
+    return flag;
+  }
+
+  /**
+   * 淇敼鐭ヨ瘑搴�
+   */
+  @Override
+  public Boolean updateByBo(KnowledgeInfoBo bo) {
+    KnowledgeInfo update = MapstructUtils.convert(bo, KnowledgeInfo.class);
+    validEntityBeforeSave(update);
+    return baseMapper.updateById(update) > 0;
+  }
+
+  /**
+   * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+   */
+  private void validEntityBeforeSave(KnowledgeInfo entity) {
+    //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+  }
+
+  /**
+   * 鎵归噺鍒犻櫎鐭ヨ瘑搴�
+   */
+  @Override
+  public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+    if (isValid) {
+      //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+    }
+    return baseMapper.deleteBatchIds(ids) > 0;
+  }
+
+  @Override
+  @Transactional(rollbackFor = Exception.class)
+  public void saveOne(KnowledgeInfoBo bo) {
+    KnowledgeInfo knowledgeInfo = MapstructUtils.convert(bo, KnowledgeInfo.class);
+    if (StringUtils.isBlank(bo.getKid())) {
+      String kid = RandomUtil.randomString(10);
+      if (knowledgeInfo != null) {
+        knowledgeInfo.setKid(kid);
+        knowledgeInfo.setUid(LoginHelper.getLoginUser().getUserId());
+      }
+      baseMapper.insert(knowledgeInfo);
+      if (knowledgeInfo != null) {
+        vectorStoreService.createSchema(String.valueOf(knowledgeInfo.getId()), bo.getVector());
+      }
+    } else {
+      baseMapper.updateById(knowledgeInfo);
+    }
+  }
+
+  @Override
+  @Transactional(rollbackFor = Exception.class)
+  public void removeKnowledge(String id) {
+    Map<String, Object> map = new HashMap<>();
+    map.put("kid", id);
+    List<KnowledgeInfoVo> knowledgeInfoList = baseMapper.selectVoByMap(map);
+    check(knowledgeInfoList);
+    // 鍒犻櫎鍚戦噺搴撲俊鎭�
+    knowledgeInfoList.forEach(knowledgeInfoVo -> {
+      vectorStoreService.removeByKid(String.valueOf(knowledgeInfoVo.getId()));
+    });
+    // 鍒犻櫎闄勪欢鍜岀煡璇嗙墖娈�
+    fragmentMapper.deleteByMap(map);
+    attachMapper.deleteByMap(map);
+    // 鍒犻櫎鐭ヨ瘑搴�
+    baseMapper.deleteByMap(map);
+  }
+
+  @Override
+  public void upload(KnowledgeInfoUploadBo bo) {
+    storeContent(bo.getFile(), bo.getKid());
+  }
+
+  public void storeContent(MultipartFile file, String kid) {
+    if (file == null || file.isEmpty()) {
+      throw new IllegalArgumentException("File cannot be null or empty");
     }
 
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撳垪琛�
-     */
-    @Override
-    public TableDataInfo<KnowledgeInfoVo> queryPageList(KnowledgeInfoBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<KnowledgeInfo> lqw = buildQueryWrapper(bo);
-        Page<KnowledgeInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
-        return TableDataInfo.build(result);
-    }
+    SysOssVo uploadDto = null;
 
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撳垪琛�
-     */
-    @Override
-    public List<KnowledgeInfoVo> queryList(KnowledgeInfoBo bo) {
-        LambdaQueryWrapper<KnowledgeInfo> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
-    }
+    String fileName = file.getOriginalFilename();
+    List<String> chunkList = new ArrayList<>();
+    KnowledgeAttach knowledgeAttach = new KnowledgeAttach();
+    knowledgeAttach.setKid(kid);
+    String docId = RandomUtil.randomString(10);
+    knowledgeAttach.setDocId(docId);
+    knowledgeAttach.setDocName(fileName);
+    knowledgeAttach.setDocType(fileName.substring(fileName.lastIndexOf(".") + 1));
+    String content = "";
+    ResourceLoader resourceLoader = resourceLoaderFactory.getLoaderByFileType(
+        knowledgeAttach.getDocType());
+    List<String> fids = new ArrayList<>();
+    try {
+      content = resourceLoader.getContent(file.getInputStream());
+      chunkList = resourceLoader.getChunkList(content, kid);
+      List<KnowledgeFragment> knowledgeFragmentList = new ArrayList<>();
+      if (CollUtil.isNotEmpty(chunkList)) {
+        // Upload file to OSS
+        uploadDto = ossService.upload(file);
 
-    private LambdaQueryWrapper<KnowledgeInfo> buildQueryWrapper(KnowledgeInfoBo bo) {
-        Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<KnowledgeInfo> lqw = Wrappers.lambdaQuery();
-        lqw.eq(StringUtils.isNotBlank(bo.getKid()), KnowledgeInfo::getKid, bo.getKid());
-        lqw.eq(bo.getUid() != null, KnowledgeInfo::getUid, bo.getUid());
-        lqw.like(StringUtils.isNotBlank(bo.getKname()), KnowledgeInfo::getKname, bo.getKname());
-        lqw.eq(bo.getShare() != null, KnowledgeInfo::getShare, bo.getShare());
-        lqw.eq(StringUtils.isNotBlank(bo.getDescription()), KnowledgeInfo::getDescription, bo.getDescription());
-        lqw.eq(StringUtils.isNotBlank(bo.getKnowledgeSeparator()), KnowledgeInfo::getKnowledgeSeparator, bo.getKnowledgeSeparator());
-        lqw.eq(StringUtils.isNotBlank(bo.getQuestionSeparator()), KnowledgeInfo::getQuestionSeparator, bo.getQuestionSeparator());
-        lqw.eq(bo.getOverlapChar() != null, KnowledgeInfo::getOverlapChar, bo.getOverlapChar());
-        lqw.eq(bo.getRetrieveLimit() != null, KnowledgeInfo::getRetrieveLimit, bo.getRetrieveLimit());
-        lqw.eq(bo.getTextBlockSize() != null, KnowledgeInfo::getTextBlockSize, bo.getTextBlockSize());
-        lqw.eq(StringUtils.isNotBlank(bo.getVector()), KnowledgeInfo::getVector, bo.getVector());
-        lqw.eq(StringUtils.isNotBlank(bo.getVectorModel()), KnowledgeInfo::getVectorModel, bo.getVectorModel());
-        return lqw;
-    }
-
-    /**
-     * 鏂板鐭ヨ瘑搴�
-     */
-    @Override
-    public Boolean insertByBo(KnowledgeInfoBo bo) {
-        KnowledgeInfo add = MapstructUtils.convert(bo, KnowledgeInfo.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
-        if (flag) {
-            bo.setId(add.getId());
+        for (int i = 0; i < chunkList.size(); i++) {
+          String fid = RandomUtil.randomString(10);
+          fids.add(fid);
+          KnowledgeFragment knowledgeFragment = new KnowledgeFragment();
+          knowledgeFragment.setKid(kid);
+          knowledgeFragment.setDocId(docId);
+          knowledgeFragment.setFid(fid);
+          knowledgeFragment.setIdx(i);
+          knowledgeFragment.setContent(chunkList.get(i));
+          knowledgeFragment.setCreateTime(new Date());
+          knowledgeFragmentList.add(knowledgeFragment);
         }
-        return flag;
+      }
+      fragmentMapper.insertBatch(knowledgeFragmentList);
+    } catch (IOException e) {
+      log.error("淇濆瓨鐭ヨ瘑搴撲俊鎭け璐ワ紒{}", e.getMessage());
+    }
+    knowledgeAttach.setContent(content);
+    knowledgeAttach.setCreateTime(new Date());
+
+    if (ObjectUtil.isNotEmpty(uploadDto) && ObjectUtil.isNotEmpty(uploadDto.getOssId())) {
+      knowledgeAttach.setOssId(uploadDto.getOssId());
+      //鍙湁pdf鏂囦欢 鎵嶉渶瑕佹媶瑙e浘鐗囧拰鍒嗘瀽鍥剧墖鍐呭
+      if (FileType.PDF.equals(knowledgeAttach.getDocType())) {
+        knowledgeAttach.setPicStatus(DealStatus.STATUS_10);
+        knowledgeAttach.setPicAnysStatus(DealStatus.STATUS_10);
+      } else {
+        knowledgeAttach.setPicStatus(DealStatus.STATUS_30);
+        knowledgeAttach.setPicAnysStatus(DealStatus.STATUS_30);
+      }
+      //鎵�鏈夋枃浠朵笂浼犲悗锛岄兘闇�瑕佸悓姝ュ埌鍚戦噺鏁版嵁搴�
+      knowledgeAttach.setVectorStatus(DealStatus.STATUS_10);
     }
 
-    /**
-     * 淇敼鐭ヨ瘑搴�
-     */
-    @Override
-    public Boolean updateByBo(KnowledgeInfoBo bo) {
-        KnowledgeInfo update = MapstructUtils.convert(bo, KnowledgeInfo.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
+    attachMapper.insert(knowledgeAttach);
+  }
+
+
+  /**
+   * 妫�鏌ョ敤鎴锋槸鍚︽湁鍒犻櫎鐭ヨ瘑搴撴潈闄�
+   *
+   * @param knowledgeInfoList 鐭ヨ瘑搴撳垪琛�
+   */
+  public void check(List<KnowledgeInfoVo> knowledgeInfoList) {
+    LoginUser loginUser = LoginHelper.getLoginUser();
+    for (KnowledgeInfoVo knowledgeInfoVo : knowledgeInfoList) {
+      if (!knowledgeInfoVo.getUid().equals(loginUser.getUserId())) {
+        throw new SecurityException("鏉冮檺涓嶈冻");
+      }
     }
+  }
 
-    /**
-     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
-     */
-    private void validEntityBeforeSave(KnowledgeInfo entity){
-        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+  /**
+   * 瀹氭椂 澶勭悊 闄勪欢涓婁紶鍚庝笂浼犲悜閲忔暟鎹簱鍜孭DF鏂囦欢鍥剧墖鎷嗚В鍜屽垎鏋愬唴瀹�
+   */
+  @Scheduled(fixedDelay = 3000) // 姣�3绉掓墽琛屼竴娆�
+  public void dealKnowledgeAttach() throws Exception {
+    //澶勭悊 闇�瑕佷笂浼犲悜閲忔暟鎹簱鐨勮褰�
+    List<KnowledgeAttach> knowledgeAttaches = attachMapper.selectList(
+        new LambdaQueryWrapper<KnowledgeAttach>()
+            .eq(KnowledgeAttach::getPicStatus, DealStatus.STATUS_30)
+            .eq(KnowledgeAttach::getPicAnysStatus, DealStatus.STATUS_30)
+            .eq(KnowledgeAttach::getVectorStatus, DealStatus.STATUS_10)
+    );
+    if (ObjectUtil.isNotEmpty(knowledgeAttaches)) {
+      for (KnowledgeAttach attachItem : knowledgeAttaches) {
+        this.dealVectorStatus(attachItem);
+      }
     }
+  }
 
-    /**
-     * 鎵归噺鍒犻櫎鐭ヨ瘑搴�
-     */
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
-        }
-        return baseMapper.deleteBatchIds(ids) > 0;
+  @Async
+  public void dealVectorStatus(KnowledgeAttach attachItem) throws Exception {
+    try {
+      //閿佸畾鏁版嵁 鏇存敼VectorStatus 鍒拌繘琛屼腑
+      if (attachMapper.update(new LambdaUpdateWrapper<KnowledgeAttach>()
+          .set(KnowledgeAttach::getVectorStatus, DealStatus.STATUS_20)
+          .eq(KnowledgeAttach::getPicStatus, DealStatus.STATUS_30)
+          .eq(KnowledgeAttach::getPicAnysStatus, DealStatus.STATUS_30)
+          .eq(KnowledgeAttach::getVectorStatus, DealStatus.STATUS_10)
+          .eq(KnowledgeAttach::getId, attachItem.getId())
+      ) == 0) {
+        return;
+      }
+      // 閫氳繃kid鏌ヨ鐭ヨ瘑搴撲俊鎭�
+      KnowledgeInfoVo knowledgeInfoVo = baseMapper.selectVoOne(Wrappers.<KnowledgeInfo>lambdaQuery()
+          .eq(KnowledgeInfo::getKid, attachItem.getKid()));
+
+      // 閫氳繃鍚戦噺妯″瀷鏌ヨ妯″瀷淇℃伅
+      ChatModelVo chatModelVo = chatModelService.selectModelByName(
+          knowledgeInfoVo.getVectorModel());
+
+      List<KnowledgeFragment> knowledgeFragments = fragmentMapper.selectList(
+          new LambdaQueryWrapper<KnowledgeFragment>()
+              .eq(KnowledgeFragment::getKid, attachItem.getKid())
+              .eq(KnowledgeFragment::getDocId, attachItem.getDocId())
+      );
+      if (ObjectUtil.isEmpty(knowledgeFragments)) {
+        throw new Exception("鏂囦欢娈佃惤涓虹┖");
+      }
+      List<String> fids = knowledgeFragments.stream()
+          .map(KnowledgeFragment::getFid)
+          .collect(Collectors.toList());
+      if (ObjectUtil.isEmpty(fids)) {
+        throw new Exception("fids 涓虹┖");
+      }
+      List<String> chunkList = knowledgeFragments.stream()
+          .map(KnowledgeFragment::getContent)
+          .collect(Collectors.toList());
+
+      if (ObjectUtil.isEmpty(chunkList)) {
+        throw new Exception("chunkList 涓虹┖");
+      }
+      StoreEmbeddingBo storeEmbeddingBo = new StoreEmbeddingBo();
+      storeEmbeddingBo.setKid(attachItem.getKid());
+      storeEmbeddingBo.setDocId(attachItem.getDocId());
+      storeEmbeddingBo.setFids(fids);
+      storeEmbeddingBo.setChunkList(chunkList);
+      storeEmbeddingBo.setModelName(knowledgeInfoVo.getVectorModel());
+      storeEmbeddingBo.setApiKey(chatModelVo.getApiKey());
+      storeEmbeddingBo.setBaseUrl(chatModelVo.getApiHost());
+      vectorStoreService.storeEmbeddings(storeEmbeddingBo);
+
+      //璁剧疆澶勭悊瀹屾垚
+      attachMapper.update(new LambdaUpdateWrapper<KnowledgeAttach>()
+          .set(KnowledgeAttach::getVectorStatus, DealStatus.STATUS_30)
+          .eq(KnowledgeAttach::getPicStatus, DealStatus.STATUS_30)
+          .eq(KnowledgeAttach::getPicAnysStatus, DealStatus.STATUS_30)
+          .eq(KnowledgeAttach::getVectorStatus, DealStatus.STATUS_20)
+          .eq(KnowledgeAttach::getId, attachItem.getId()));
+    } catch (Exception e) {
+      //璁剧疆澶勭悊澶辫触
+      attachMapper.update(new LambdaUpdateWrapper<KnowledgeAttach>()
+          .set(KnowledgeAttach::getVectorStatus, DealStatus.STATUS_10)
+          .eq(KnowledgeAttach::getPicStatus, DealStatus.STATUS_30)
+          .eq(KnowledgeAttach::getPicAnysStatus, DealStatus.STATUS_30)
+          .eq(KnowledgeAttach::getVectorStatus, DealStatus.STATUS_20)
+          .eq(KnowledgeAttach::getId, attachItem.getId()));
+      throw new RuntimeException(e);
     }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void saveOne(KnowledgeInfoBo bo) {
-        KnowledgeInfo knowledgeInfo = MapstructUtils.convert(bo, KnowledgeInfo.class);
-        if (StringUtils.isBlank(bo.getKid())){
-            String kid = RandomUtil.randomString(10);
-            if (knowledgeInfo != null) {
-                knowledgeInfo.setKid(kid);
-                knowledgeInfo.setUid(LoginHelper.getLoginUser().getUserId());
-            }
-            baseMapper.insert(knowledgeInfo);
-            if (knowledgeInfo != null) {
-                vectorStoreService.createSchema(String.valueOf(knowledgeInfo.getId()),bo.getVector());
-            }
-        }else {
-            baseMapper.updateById(knowledgeInfo);
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void removeKnowledge(String id) {
-        Map<String,Object> map = new HashMap<>();
-        map.put("kid",id);
-        List<KnowledgeInfoVo> knowledgeInfoList = baseMapper.selectVoByMap(map);
-        check(knowledgeInfoList);
-        // 鍒犻櫎鍚戦噺搴撲俊鎭�
-        knowledgeInfoList.forEach(knowledgeInfoVo -> {
-            vectorStoreService.removeByKid(String.valueOf(knowledgeInfoVo.getId()));
-        });
-        // 鍒犻櫎闄勪欢鍜岀煡璇嗙墖娈�
-        fragmentMapper.deleteByMap(map);
-        attachMapper.deleteByMap(map);
-        // 鍒犻櫎鐭ヨ瘑搴�
-        baseMapper.deleteByMap(map);
-    }
-
-    @Override
-    public void upload(KnowledgeInfoUploadBo bo) {
-        storeContent(bo.getFile(), bo.getKid());
-    }
-
-    public void storeContent(MultipartFile file, String kid) {
-        String fileName = file.getOriginalFilename();
-        List<String> chunkList = new ArrayList<>();
-        KnowledgeAttach knowledgeAttach = new KnowledgeAttach();
-        knowledgeAttach.setKid(kid);
-        String docId = RandomUtil.randomString(10);
-        knowledgeAttach.setDocId(docId);
-        knowledgeAttach.setDocName(fileName);
-        knowledgeAttach.setDocType(fileName.substring(fileName.lastIndexOf(".")+1));
-        String content = "";
-        ResourceLoader resourceLoader = resourceLoaderFactory.getLoaderByFileType(knowledgeAttach.getDocType());
-        List<String> fids = new ArrayList<>();
-        try {
-            content = resourceLoader.getContent(file.getInputStream());
-            chunkList = resourceLoader.getChunkList(content, kid);
-            List<KnowledgeFragment> knowledgeFragmentList = new ArrayList<>();
-            if (CollUtil.isNotEmpty(chunkList)) {
-                for (int i = 0; i < chunkList.size(); i++) {
-                    String fid = RandomUtil.randomString(10);
-                    fids.add(fid);
-                    KnowledgeFragment knowledgeFragment = new KnowledgeFragment();
-                    knowledgeFragment.setKid(kid);
-                    knowledgeFragment.setDocId(docId);
-                    knowledgeFragment.setFid(fid);
-                    knowledgeFragment.setIdx(i);
-                    knowledgeFragment.setContent(chunkList.get(i));
-                    knowledgeFragment.setCreateTime(new Date());
-                    knowledgeFragmentList.add(knowledgeFragment);
-                }
-            }
-            fragmentMapper.insertBatch(knowledgeFragmentList);
-        } catch (IOException e) {
-            log.error("淇濆瓨鐭ヨ瘑搴撲俊鎭け璐ワ紒{}", e.getMessage());
-        }
-        knowledgeAttach.setContent(content);
-        knowledgeAttach.setCreateTime(new Date());
-        attachMapper.insert(knowledgeAttach);
-
-        // 閫氳繃kid鏌ヨ鐭ヨ瘑搴撲俊鎭�
-        KnowledgeInfoVo knowledgeInfoVo = baseMapper.selectVoOne(Wrappers.<KnowledgeInfo>lambdaQuery()
-                .eq(KnowledgeInfo::getKid, kid));
-
-        // 閫氳繃鍚戦噺妯″瀷鏌ヨ妯″瀷淇℃伅
-        ChatModelVo chatModelVo = chatModelService.selectModelByName(knowledgeInfoVo.getVectorModel());
-
-        StoreEmbeddingBo storeEmbeddingBo = new StoreEmbeddingBo();
-        storeEmbeddingBo.setKid(kid);
-        storeEmbeddingBo.setDocId(docId);
-        storeEmbeddingBo.setFids(fids);
-        storeEmbeddingBo.setChunkList(chunkList);
-        storeEmbeddingBo.setModelName(knowledgeInfoVo.getVectorModel());
-        storeEmbeddingBo.setApiKey(chatModelVo.getApiKey());
-        storeEmbeddingBo.setBaseUrl(chatModelVo.getApiHost());
-        vectorStoreService.storeEmbeddings(storeEmbeddingBo);
-    }
-
-
-    /**
-     * 妫�鏌ョ敤鎴锋槸鍚︽湁鍒犻櫎鐭ヨ瘑搴撴潈闄�
-     *
-     * @param knowledgeInfoList 鐭ヨ瘑搴撳垪琛�
-     */
-    public void check(List<KnowledgeInfoVo> knowledgeInfoList){
-        LoginUser loginUser = LoginHelper.getLoginUser();
-        for (KnowledgeInfoVo knowledgeInfoVo : knowledgeInfoList) {
-            if(!knowledgeInfoVo.getUid().equals(loginUser.getUserId())){
-                throw new SecurityException("鏉冮檺涓嶈冻");
-            }
-        }
-    }
+  }
 
 }
diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/ruoyi/generator/util/VelocityUtils.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/ruoyi/generator/util/VelocityUtils.java
index 6d0e68a..65ab7ea 100644
--- a/ruoyi-modules/ruoyi-generator/src/main/java/org/ruoyi/generator/util/VelocityUtils.java
+++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/ruoyi/generator/util/VelocityUtils.java
@@ -25,386 +25,386 @@
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public class VelocityUtils {
 
-    /**
-     * 椤圭洰绌洪棿璺緞
-     */
-    private static final String PROJECT_PATH = "main/java";
+  /**
+   * 椤圭洰绌洪棿璺緞
+   */
+  private static final String PROJECT_PATH = "main/java";
 
-    /**
-     * mybatis绌洪棿璺緞
-     */
-    private static final String MYBATIS_PATH = "main/resources/mapper";
+  /**
+   * mybatis绌洪棿璺緞
+   */
+  private static final String MYBATIS_PATH = "main/resources/mapper";
 
-    /**
-     * 榛樿涓婄骇鑿滃崟锛岀郴缁熷伐鍏�
-     */
-    private static final String DEFAULT_PARENT_MENU_ID = "3";
+  /**
+   * 榛樿涓婄骇鑿滃崟锛岀郴缁熷伐鍏�
+   */
+  private static final String DEFAULT_PARENT_MENU_ID = "3";
 
-    /**
-     * 璁剧疆妯℃澘鍙橀噺淇℃伅
-     *
-     * @return 妯℃澘鍒楄〃
-     */
-    public static VelocityContext prepareContext(GenTable genTable) {
-        String moduleName = genTable.getModuleName();
-        String businessName = genTable.getBusinessName();
-        String packageName = genTable.getPackageName();
-        String tplCategory = genTable.getTplCategory();
-        String functionName = genTable.getFunctionName();
+  /**
+   * 璁剧疆妯℃澘鍙橀噺淇℃伅
+   *
+   * @return 妯℃澘鍒楄〃
+   */
+  public static VelocityContext prepareContext(GenTable genTable) {
+    String moduleName = genTable.getModuleName();
+    String businessName = genTable.getBusinessName();
+    String packageName = genTable.getPackageName();
+    String tplCategory = genTable.getTplCategory();
+    String functionName = genTable.getFunctionName();
 
-        VelocityContext velocityContext = new VelocityContext();
-        velocityContext.put("tplCategory", genTable.getTplCategory());
-        velocityContext.put("tableName", genTable.getTableName());
-        velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "銆愯濉啓鍔熻兘鍚嶇О銆�");
-        velocityContext.put("ClassName", genTable.getClassName());
-        velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName()));
-        velocityContext.put("moduleName", genTable.getModuleName());
-        velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName()));
-        velocityContext.put("businessName", genTable.getBusinessName());
-        velocityContext.put("basePackage", getPackagePrefix(packageName));
-        velocityContext.put("packageName", packageName);
-        velocityContext.put("author", genTable.getFunctionAuthor());
-        velocityContext.put("datetime", DateUtils.getDate());
-        velocityContext.put("pkColumn", genTable.getPkColumn());
-        velocityContext.put("importList", getImportList(genTable));
-        velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
-        velocityContext.put("columns", genTable.getColumns());
-        velocityContext.put("table", genTable);
-        velocityContext.put("dicts", getDicts(genTable));
-        setMenuVelocityContext(velocityContext, genTable);
-        if (GenConstants.TPL_TREE.equals(tplCategory)) {
-            setTreeVelocityContext(velocityContext, genTable);
-        }
-        // 鍒ゆ柇鏄痬odal杩樻槸drawer
-        Dict paramsObj = JsonUtils.parseMap(genTable.getOptions());
-        if (ObjectUtil.isNotNull(paramsObj)) {
-            String popupComponent = Optional
-                .ofNullable(paramsObj.getStr("popupComponent"))
-                .orElse("modal");
-            velocityContext.put("popupComponent", popupComponent);
-            velocityContext.put("PopupComponent", StringUtils.capitalize(popupComponent));
-        } else {
-            velocityContext.put("popupComponent", "modal");
-            velocityContext.put("PopupComponent", "Modal");
-        }
-        // 鍒ゆ柇鏄師鐢焌ntd琛ㄥ崟杩樻槸useForm琛ㄥ崟
-        // native 鍘熺敓antd琛ㄥ崟
-        // useForm useVbenForm
-        if (ObjectUtil.isNotNull(paramsObj)) {
-            String formComponent = Optional
-                .ofNullable(paramsObj.getStr("formComponent"))
-                .orElse("useForm");
-            velocityContext.put("formComponent", formComponent);
-        }
-        return velocityContext;
+    VelocityContext velocityContext = new VelocityContext();
+    velocityContext.put("tplCategory", genTable.getTplCategory());
+    velocityContext.put("tableName", genTable.getTableName());
+    velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "銆愯濉啓鍔熻兘鍚嶇О銆�");
+    velocityContext.put("ClassName", genTable.getClassName());
+    velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName()));
+    velocityContext.put("moduleName", genTable.getModuleName());
+    velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName()));
+    velocityContext.put("businessName", genTable.getBusinessName());
+    velocityContext.put("basePackage", getPackagePrefix(packageName));
+    velocityContext.put("packageName", packageName);
+    velocityContext.put("author", genTable.getFunctionAuthor());
+    velocityContext.put("datetime", DateUtils.getDate());
+    velocityContext.put("pkColumn", genTable.getPkColumn());
+    velocityContext.put("importList", getImportList(genTable));
+    velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
+    velocityContext.put("columns", genTable.getColumns());
+    velocityContext.put("table", genTable);
+    velocityContext.put("dicts", getDicts(genTable));
+    setMenuVelocityContext(velocityContext, genTable);
+    if (GenConstants.TPL_TREE.equals(tplCategory)) {
+      setTreeVelocityContext(velocityContext, genTable);
     }
-
-    public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) {
-        String options = genTable.getOptions();
-        Dict paramsObj = JsonUtils.parseMap(options);
-        String parentMenuId = getParentMenuId(paramsObj);
-        context.put("parentMenuId", parentMenuId);
+    // 鍒ゆ柇鏄痬odal杩樻槸drawer
+    Dict paramsObj = JsonUtils.parseMap(genTable.getOptions());
+    if (ObjectUtil.isNotNull(paramsObj)) {
+      String popupComponent = Optional
+          .ofNullable(paramsObj.getStr("popupComponent"))
+          .orElse("modal");
+      velocityContext.put("popupComponent", popupComponent);
+      velocityContext.put("PopupComponent", StringUtils.capitalize(popupComponent));
+    } else {
+      velocityContext.put("popupComponent", "modal");
+      velocityContext.put("PopupComponent", "Modal");
     }
+    // 鍒ゆ柇鏄師鐢焌ntd琛ㄥ崟杩樻槸useForm琛ㄥ崟
+    // native 鍘熺敓antd琛ㄥ崟
+    // useForm useVbenForm
+    if (ObjectUtil.isNotNull(paramsObj)) {
+      String formComponent = Optional
+          .ofNullable(paramsObj.getStr("formComponent"))
+          .orElse("useForm");
+      velocityContext.put("formComponent", formComponent);
+    }
+    return velocityContext;
+  }
 
-    public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) {
-        String options = genTable.getOptions();
-        Dict paramsObj = JsonUtils.parseMap(options);
-        String treeCode = getTreecode(paramsObj);
-        String treeParentCode = getTreeParentCode(paramsObj);
-        String treeName = getTreeName(paramsObj);
+  public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) {
+    String options = genTable.getOptions();
+    Dict paramsObj = JsonUtils.parseMap(options);
+    String parentMenuId = getParentMenuId(paramsObj);
+    context.put("parentMenuId", parentMenuId);
+  }
 
-        context.put("treeCode", treeCode);
-        context.put("treeParentCode", treeParentCode);
-        context.put("treeName", treeName);
-        context.put("expandColumn", getExpandColumn(genTable));
-        if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
-            context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE));
-        }
-        if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
-            context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME));
-        }
+  public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) {
+    String options = genTable.getOptions();
+    Dict paramsObj = JsonUtils.parseMap(options);
+    String treeCode = getTreecode(paramsObj);
+    String treeParentCode = getTreeParentCode(paramsObj);
+    String treeName = getTreeName(paramsObj);
+
+    context.put("treeCode", treeCode);
+    context.put("treeParentCode", treeParentCode);
+    context.put("treeName", treeName);
+    context.put("expandColumn", getExpandColumn(genTable));
+    if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
+      context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE));
+    }
+    if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
+      context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME));
+    }
+  }
+
+  /**
+   * 鑾峰彇妯℃澘淇℃伅
+   *
+   * @return 妯℃澘鍒楄〃
+   */
+  public static List<String> getTemplateList(String tplCategory) {
+    List<String> templates = new ArrayList<>();
+    templates.add("vm/java/domain.java.vm");
+    templates.add("vm/java/vo.java.vm");
+    templates.add("vm/java/bo.java.vm");
+    templates.add("vm/java/mapper.java.vm");
+    templates.add("vm/java/service.java.vm");
+    templates.add("vm/java/serviceImpl.java.vm");
+    templates.add("vm/java/controller.java.vm");
+    templates.add("vm/xml/mapper.xml.vm");
+    if (DataBaseHelper.isOracle()) {
+      templates.add("vm/sql/oracle/sql.vm");
+    } else if (DataBaseHelper.isPostgerSql()) {
+      templates.add("vm/sql/postgres/sql.vm");
+    } else if (DataBaseHelper.isSqlServer()) {
+      templates.add("vm/sql/sqlserver/sql.vm");
+    } else {
+      templates.add("vm/sql/sql.vm");
+    }
+    templates.add("vm/ts/api.ts.vm");
+    templates.add("vm/ts/types.ts.vm");
+    if (GenConstants.TPL_CRUD.equals(tplCategory)) {
+      templates.add("vm/vue/index.vue.vm");
+    } else if (GenConstants.TPL_TREE.equals(tplCategory)) {
+      templates.add("vm/vue/index-tree.vue.vm");
     }
 
     /**
-     * 鑾峰彇妯℃澘淇℃伅
-     *
-     * @return 妯℃澘鍒楄〃
+     * 娣诲姞vben5
      */
-    public static List<String> getTemplateList(String tplCategory) {
-        List<String> templates = new ArrayList<>();
-        templates.add("vm/java/domain.java.vm");
-        templates.add("vm/java/vo.java.vm");
-        templates.add("vm/java/bo.java.vm");
-        templates.add("vm/java/mapper.java.vm");
-        templates.add("vm/java/service.java.vm");
-        templates.add("vm/java/serviceImpl.java.vm");
-        templates.add("vm/java/controller.java.vm");
-        templates.add("vm/xml/mapper.xml.vm");
-        if (DataBaseHelper.isOracle()) {
-            templates.add("vm/sql/oracle/sql.vm");
-        } else if (DataBaseHelper.isPostgerSql()) {
-            templates.add("vm/sql/postgres/sql.vm");
-        } else if (DataBaseHelper.isSqlServer()) {
-            templates.add("vm/sql/sqlserver/sql.vm");
-        } else {
-            templates.add("vm/sql/sql.vm");
-        }
-        templates.add("vm/ts/api.ts.vm");
-        templates.add("vm/ts/types.ts.vm");
-        if (GenConstants.TPL_CRUD.equals(tplCategory)) {
-            templates.add("vm/vue/index.vue.vm");
-        } else if (GenConstants.TPL_TREE.equals(tplCategory)) {
-            templates.add("vm/vue/index-tree.vue.vm");
-        }
-
-        /**
-         * 娣诲姞vben5
-         */
-        templates.add("vm/vben5/api/index.ts.vm");
-        templates.add("vm/vben5/api/model.d.ts.vm");
-        templates.add("vm/vben5/views/data.ts.vm");
-        if (GenConstants.TPL_CRUD.equals(tplCategory)) {
-            templates.add("vm/vben5/views/index_vben.vue.vm");
-            templates.add("vm/vben5/views/popup.vue.vm");
-        } else if (GenConstants.TPL_TREE.equals(tplCategory)) {
-            templates.add("vm/vben5/views/index_vben_tree.vue.vm");
-            templates.add("vm/vben5/views/popup_tree.vue.vm");
-        }
-
-        return templates;
+    templates.add("vm/vben5/api/index.ts.vm");
+    templates.add("vm/vben5/api/model.d.ts.vm");
+    templates.add("vm/vben5/views/data.ts.vm");
+    if (GenConstants.TPL_CRUD.equals(tplCategory)) {
+      templates.add("vm/vben5/views/index_vben.vue.vm");
+      templates.add("vm/vben5/views/popup.vue.vm");
+    } else if (GenConstants.TPL_TREE.equals(tplCategory)) {
+      templates.add("vm/vben5/views/index_vben_tree.vue.vm");
+      templates.add("vm/vben5/views/popup_tree.vue.vm");
     }
 
-    /**
-     * 鑾峰彇鏂囦欢鍚�
-     */
-    public static String getFileName(String template, GenTable genTable) {
-        // 鏂囦欢鍚嶇О
-        String fileName = "";
-        // 鍖呰矾寰�
-        String packageName = genTable.getPackageName();
-        // 妯″潡鍚�
-        String moduleName = genTable.getModuleName();
-        // 澶у啓绫诲悕
-        String className = genTable.getClassName();
-        // 涓氬姟鍚嶇О
-        String businessName = genTable.getBusinessName();
+    return templates;
+  }
 
-        String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
-        String mybatisPath = MYBATIS_PATH + "/" + moduleName;
-        String vuePath = "vue";
+  /**
+   * 鑾峰彇鏂囦欢鍚�
+   */
+  public static String getFileName(String template, GenTable genTable) {
+    // 鏂囦欢鍚嶇О
+    String fileName = "";
+    // 鍖呰矾寰�
+    String packageName = genTable.getPackageName();
+    // 妯″潡鍚�
+    String moduleName = genTable.getModuleName();
+    // 澶у啓绫诲悕
+    String className = genTable.getClassName();
+    // 涓氬姟鍚嶇О
+    String businessName = genTable.getBusinessName();
 
-        if (template.contains("domain.java.vm")) {
-            fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
-        }
-        if (template.contains("vo.java.vm")) {
-            fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className);
-        }
-        if (template.contains("bo.java.vm")) {
-            fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className);
-        }
-        if (template.contains("mapper.java.vm")) {
-            fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className);
-        } else if (template.contains("service.java.vm")) {
-            fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className);
-        } else if (template.contains("serviceImpl.java.vm")) {
-            fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className);
-        } else if (template.contains("controller.java.vm")) {
-            fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className);
-        } else if (template.contains("mapper.xml.vm")) {
-            fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className);
-        } else if (template.contains("sql.vm")) {
-            fileName = businessName + "Menu.sql";
-        } else if (template.contains("api.ts.vm")) {
-            fileName = StringUtils.format("{}/api/{}/{}/index.ts", vuePath, moduleName, businessName);
-        } else if (template.contains("types.ts.vm")) {
-            fileName = StringUtils.format("{}/api/{}/{}/types.ts", vuePath, moduleName, businessName);
-        } else if (template.contains("index.vue.vm")) {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
-        } else if (template.contains("index-tree.vue.vm")) {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
-        }
+    String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
+    String mybatisPath = MYBATIS_PATH + "/" + moduleName;
+    String vuePath = "vue";
 
-        // 鍒ゆ柇鏄痬odal杩樻槸drawer
-        Dict paramsObj = JsonUtils.parseMap(genTable.getOptions());
-        String popupComponent = "modal";
-        if (ObjectUtil.isNotNull(paramsObj)) {
-            popupComponent = Optional
-                .ofNullable(paramsObj.getStr("popupComponent"))
-                .orElse("modal");
-        }
-        String vben5Path = "vben5";
-        if (template.contains("vm/vben5/api/index.ts.vm")) {
-            fileName = StringUtils.format("{}/api/{}/{}/index.ts", vben5Path, moduleName, businessName);
-        }
-        if (template.contains("vm/vben5/api/model.d.ts.vm")) {
-            fileName = StringUtils.format("{}/api/{}/{}/model.d.ts", vben5Path, moduleName, businessName);
-        }
-        if (template.contains("vm/vben5/views/index_vben.vue.vm")) {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vben5Path, moduleName, businessName);
-        }
-        if (template.contains("vm/vben5/views/index_vben_tree.vue.vm")) {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vben5Path, moduleName, businessName);
-        }
-        if (template.contains("vm/vben5/views/data.ts.vm")) {
-            fileName = StringUtils.format("{}/views/{}/{}/data.ts", vben5Path, moduleName, businessName);
-        }
-        if (template.contains("vm/vben5/views/popup.vue.vm")) {
-            fileName = StringUtils.format("{}/views/{}/{}/{}-{}.vue", vben5Path, moduleName, businessName, businessName, popupComponent);
-        }
-        if (template.contains("vm/vben5/views/popup_tree.vue.vm")) {
-            fileName = StringUtils.format("{}/views/{}/{}/{}-{}.vue", vben5Path, moduleName, businessName, businessName, popupComponent);
-        }
-
-        return fileName;
+    if (template.contains("domain.java.vm")) {
+      fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
+    }
+    if (template.contains("vo.java.vm")) {
+      fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className);
+    }
+    if (template.contains("bo.java.vm")) {
+      fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className);
+    }
+    if (template.contains("mapper.java.vm")) {
+      fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className);
+    } else if (template.contains("service.java.vm")) {
+      fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className);
+    } else if (template.contains("serviceImpl.java.vm")) {
+      fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className);
+    } else if (template.contains("controller.java.vm")) {
+      fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className);
+    } else if (template.contains("mapper.xml.vm")) {
+      fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className);
+    } else if (template.contains("sql.vm")) {
+      fileName = businessName + "Menu.sql";
+    } else if (template.contains("api.ts.vm")) {
+      fileName = StringUtils.format("{}/api/{}/{}/index.ts", vuePath, moduleName, businessName);
+    } else if (template.contains("types.ts.vm")) {
+      fileName = StringUtils.format("{}/api/{}/{}/types.ts", vuePath, moduleName, businessName);
+    } else if (template.contains("index.vue.vm")) {
+      fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
+    } else if (template.contains("index-tree.vue.vm")) {
+      fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
     }
 
-    /**
-     * 鑾峰彇鍖呭墠缂�
-     *
-     * @param packageName 鍖呭悕绉�
-     * @return 鍖呭墠缂�鍚嶇О
-     */
-    public static String getPackagePrefix(String packageName) {
-        int lastIndex = packageName.lastIndexOf(".");
-        return StringUtils.substring(packageName, 0, lastIndex);
+    // 鍒ゆ柇鏄痬odal杩樻槸drawer
+    Dict paramsObj = JsonUtils.parseMap(genTable.getOptions());
+    String popupComponent = "modal";
+    if (ObjectUtil.isNotNull(paramsObj)) {
+      popupComponent = Optional
+          .ofNullable(paramsObj.getStr("popupComponent"))
+          .orElse("modal");
+    }
+    String vben5Path = "vben5";
+    if (template.contains("vm/vben5/api/index.ts.vm")) {
+      fileName = StringUtils.format("{}/api/{}/{}/index.ts", vben5Path, moduleName, businessName);
+    }
+    if (template.contains("vm/vben5/api/model.d.ts.vm")) {
+      fileName = StringUtils.format("{}/api/{}/{}/model.d.ts", vben5Path, moduleName, businessName);
+    }
+    if (template.contains("vm/vben5/views/index_vben.vue.vm")) {
+      fileName = StringUtils.format("{}/views/{}/{}/index.vue", vben5Path, moduleName, businessName);
+    }
+    if (template.contains("vm/vben5/views/index_vben_tree.vue.vm")) {
+      fileName = StringUtils.format("{}/views/{}/{}/index.vue", vben5Path, moduleName, businessName);
+    }
+    if (template.contains("vm/vben5/views/data.ts.vm")) {
+      fileName = StringUtils.format("{}/views/{}/{}/data.ts", vben5Path, moduleName, businessName);
+    }
+    if (template.contains("vm/vben5/views/popup.vue.vm")) {
+      fileName = StringUtils.format("{}/views/{}/{}/{}-{}.vue", vben5Path, moduleName, businessName, businessName, popupComponent);
+    }
+    if (template.contains("vm/vben5/views/popup_tree.vue.vm")) {
+      fileName = StringUtils.format("{}/views/{}/{}/{}-{}.vue", vben5Path, moduleName, businessName, businessName, popupComponent);
     }
 
-    /**
-     * 鏍规嵁鍒楃被鍨嬭幏鍙栧鍏ュ寘
-     *
-     * @param genTable 涓氬姟琛ㄥ璞�
-     * @return 杩斿洖闇�瑕佸鍏ョ殑鍖呭垪琛�
-     */
-    public static HashSet<String> getImportList(GenTable genTable) {
-        List<GenTableColumn> columns = genTable.getColumns();
-        HashSet<String> importList = new HashSet<>();
-        for (GenTableColumn column : columns) {
-            if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) {
-                importList.add("java.util.Date");
-                importList.add("com.fasterxml.jackson.annotation.JsonFormat");
-            } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) {
-                importList.add("java.math.BigDecimal");
-            } else if (!column.isSuperColumn() && "imageUpload".equals(column.getHtmlType())) {
-                importList.add("org.dromara.common.translation.annotation.Translation");
-                importList.add("org.dromara.common.translation.constant.TransConstant");
-            }
+    return fileName;
+  }
+
+  /**
+   * 鑾峰彇鍖呭墠缂�
+   *
+   * @param packageName 鍖呭悕绉�
+   * @return 鍖呭墠缂�鍚嶇О
+   */
+  public static String getPackagePrefix(String packageName) {
+    int lastIndex = packageName.lastIndexOf(".");
+    return StringUtils.substring(packageName, 0, lastIndex);
+  }
+
+  /**
+   * 鏍规嵁鍒楃被鍨嬭幏鍙栧鍏ュ寘
+   *
+   * @param genTable 涓氬姟琛ㄥ璞�
+   * @return 杩斿洖闇�瑕佸鍏ョ殑鍖呭垪琛�
+   */
+  public static HashSet<String> getImportList(GenTable genTable) {
+    List<GenTableColumn> columns = genTable.getColumns();
+    HashSet<String> importList = new HashSet<>();
+    for (GenTableColumn column : columns) {
+      if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) {
+        importList.add("java.util.Date");
+        importList.add("com.fasterxml.jackson.annotation.JsonFormat");
+      } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) {
+        importList.add("java.math.BigDecimal");
+      } else if (!column.isSuperColumn() && "imageUpload".equals(column.getHtmlType())) {
+        importList.add("org.dromara.common.translation.annotation.Translation");
+        importList.add("org.dromara.common.translation.constant.TransConstant");
+      }
+    }
+    return importList;
+  }
+
+  /**
+   * 鏍规嵁鍒楃被鍨嬭幏鍙栧瓧鍏哥粍
+   *
+   * @param genTable 涓氬姟琛ㄥ璞�
+   * @return 杩斿洖瀛楀吀缁�
+   */
+  public static String getDicts(GenTable genTable) {
+    List<GenTableColumn> columns = genTable.getColumns();
+    Set<String> dicts = new HashSet<>();
+    addDicts(dicts, columns);
+    return StringUtils.join(dicts, ", ");
+  }
+
+  /**
+   * 娣诲姞瀛楀吀鍒楄〃
+   *
+   * @param dicts 瀛楀吀鍒楄〃
+   * @param columns 鍒楅泦鍚�
+   */
+  public static void addDicts(Set<String> dicts, List<GenTableColumn> columns) {
+    for (GenTableColumn column : columns) {
+      if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny(
+          column.getHtmlType(),
+          new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) {
+        dicts.add("'" + column.getDictType() + "'");
+      }
+    }
+  }
+
+  /**
+   * 鑾峰彇鏉冮檺鍓嶇紑
+   *
+   * @param moduleName   妯″潡鍚嶇О
+   * @param businessName 涓氬姟鍚嶇О
+   * @return 杩斿洖鏉冮檺鍓嶇紑
+   */
+  public static String getPermissionPrefix(String moduleName, String businessName) {
+    return StringUtils.format("{}:{}", moduleName, businessName);
+  }
+
+  /**
+   * 鑾峰彇涓婄骇鑿滃崟ID瀛楁
+   *
+   * @param paramsObj 鐢熸垚鍏朵粬閫夐」
+   * @return 涓婄骇鑿滃崟ID瀛楁
+   */
+  public static String getParentMenuId(Dict paramsObj) {
+    if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)
+        && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) {
+      return paramsObj.getStr(GenConstants.PARENT_MENU_ID);
+    }
+    return DEFAULT_PARENT_MENU_ID;
+  }
+
+  /**
+   * 鑾峰彇鏍戠紪鐮�
+   *
+   * @param paramsObj 鐢熸垚鍏朵粬閫夐」
+   * @return 鏍戠紪鐮�
+   */
+  public static String getTreecode(Map<String, Object> paramsObj) {
+    if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) {
+      return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE)));
+    }
+    return StringUtils.EMPTY;
+  }
+
+  /**
+   * 鑾峰彇鏍戠埗缂栫爜
+   *
+   * @param paramsObj 鐢熸垚鍏朵粬閫夐」
+   * @return 鏍戠埗缂栫爜
+   */
+  public static String getTreeParentCode(Dict paramsObj) {
+    if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
+      return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE));
+    }
+    return StringUtils.EMPTY;
+  }
+
+  /**
+   * 鑾峰彇鏍戝悕绉�
+   *
+   * @param paramsObj 鐢熸垚鍏朵粬閫夐」
+   * @return 鏍戝悕绉�
+   */
+  public static String getTreeName(Dict paramsObj) {
+    if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) {
+      return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME));
+    }
+    return StringUtils.EMPTY;
+  }
+
+  /**
+   * 鑾峰彇闇�瑕佸湪鍝竴鍒椾笂闈㈡樉绀哄睍寮�鎸夐挳
+   *
+   * @param genTable 涓氬姟琛ㄥ璞�
+   * @return 灞曞紑鎸夐挳鍒楀簭鍙�
+   */
+  public static int getExpandColumn(GenTable genTable) {
+    String options = genTable.getOptions();
+    Dict paramsObj = JsonUtils.parseMap(options);
+    String treeName = paramsObj.getStr(GenConstants.TREE_NAME);
+    int num = 0;
+    for (GenTableColumn column : genTable.getColumns()) {
+      if (column.isList()) {
+        num++;
+        String columnName = column.getColumnName();
+        if (columnName.equals(treeName)) {
+          break;
         }
-        return importList;
+      }
     }
-
-    /**
-     * 鏍规嵁鍒楃被鍨嬭幏鍙栧瓧鍏哥粍
-     *
-     * @param genTable 涓氬姟琛ㄥ璞�
-     * @return 杩斿洖瀛楀吀缁�
-     */
-    public static String getDicts(GenTable genTable) {
-        List<GenTableColumn> columns = genTable.getColumns();
-        Set<String> dicts = new HashSet<>();
-        addDicts(dicts, columns);
-        return StringUtils.join(dicts, ", ");
-    }
-
-    /**
-     * 娣诲姞瀛楀吀鍒楄〃
-     *
-     * @param dicts 瀛楀吀鍒楄〃
-     * @param columns 鍒楅泦鍚�
-     */
-    public static void addDicts(Set<String> dicts, List<GenTableColumn> columns) {
-        for (GenTableColumn column : columns) {
-            if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny(
-                column.getHtmlType(),
-                new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) {
-                dicts.add("'" + column.getDictType() + "'");
-            }
-        }
-    }
-
-    /**
-     * 鑾峰彇鏉冮檺鍓嶇紑
-     *
-     * @param moduleName   妯″潡鍚嶇О
-     * @param businessName 涓氬姟鍚嶇О
-     * @return 杩斿洖鏉冮檺鍓嶇紑
-     */
-    public static String getPermissionPrefix(String moduleName, String businessName) {
-        return StringUtils.format("{}:{}", moduleName, businessName);
-    }
-
-    /**
-     * 鑾峰彇涓婄骇鑿滃崟ID瀛楁
-     *
-     * @param paramsObj 鐢熸垚鍏朵粬閫夐」
-     * @return 涓婄骇鑿滃崟ID瀛楁
-     */
-    public static String getParentMenuId(Dict paramsObj) {
-        if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)
-            && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) {
-            return paramsObj.getStr(GenConstants.PARENT_MENU_ID);
-        }
-        return DEFAULT_PARENT_MENU_ID;
-    }
-
-    /**
-     * 鑾峰彇鏍戠紪鐮�
-     *
-     * @param paramsObj 鐢熸垚鍏朵粬閫夐」
-     * @return 鏍戠紪鐮�
-     */
-    public static String getTreecode(Map<String, Object> paramsObj) {
-        if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) {
-            return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE)));
-        }
-        return StringUtils.EMPTY;
-    }
-
-    /**
-     * 鑾峰彇鏍戠埗缂栫爜
-     *
-     * @param paramsObj 鐢熸垚鍏朵粬閫夐」
-     * @return 鏍戠埗缂栫爜
-     */
-    public static String getTreeParentCode(Dict paramsObj) {
-        if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
-            return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE));
-        }
-        return StringUtils.EMPTY;
-    }
-
-    /**
-     * 鑾峰彇鏍戝悕绉�
-     *
-     * @param paramsObj 鐢熸垚鍏朵粬閫夐」
-     * @return 鏍戝悕绉�
-     */
-    public static String getTreeName(Dict paramsObj) {
-        if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) {
-            return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME));
-        }
-        return StringUtils.EMPTY;
-    }
-
-    /**
-     * 鑾峰彇闇�瑕佸湪鍝竴鍒椾笂闈㈡樉绀哄睍寮�鎸夐挳
-     *
-     * @param genTable 涓氬姟琛ㄥ璞�
-     * @return 灞曞紑鎸夐挳鍒楀簭鍙�
-     */
-    public static int getExpandColumn(GenTable genTable) {
-        String options = genTable.getOptions();
-        Dict paramsObj = JsonUtils.parseMap(options);
-        String treeName = paramsObj.getStr(GenConstants.TREE_NAME);
-        int num = 0;
-        for (GenTableColumn column : genTable.getColumns()) {
-            if (column.isList()) {
-                num++;
-                String columnName = column.getColumnName();
-                if (columnName.equals(treeName)) {
-                    break;
-                }
-            }
-        }
-        return num;
-    }
+    return num;
+  }
 }
diff --git a/script/sql/update/202505141010.sql b/script/sql/update/202505141010.sql
new file mode 100644
index 0000000..2cb86be
--- /dev/null
+++ b/script/sql/update/202505141010.sql
@@ -0,0 +1,6 @@
+ALTER TABLE `knowledge_attach`
+ADD COLUMN `pic_status` tinyint(1) NOT NULL DEFAULT 10 COMMENT '鎷嗚В鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�' AFTER `oss_id`,
+ADD COLUMN `pic_anys_status` tinyint(1) NOT NULL DEFAULT 10 COMMENT '鍒嗘瀽鍥剧墖鐘舵��10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�' AFTER `pic_status`,
+ADD COLUMN `vector_status` tinyint(1) NOT NULL DEFAULT 10 COMMENT '鍐欏叆鍚戦噺鏁版嵁搴撶姸鎬�10鏈紑濮嬶紝20杩涜涓紝30宸插畬鎴�' AFTER `pic_anys_status`,
+DROP PRIMARY KEY,
+ADD PRIMARY KEY (`id`) USING BTREE;

--
Gitblit v1.9.3