Ver código fonte

文件总数,总字符数,切片总数。

S0025136190 7 meses atrás
pai
commit
bd26f08b22

+ 4 - 7
takai-admin/src/main/java/com/takai/web/controller/takaiai/TakaiAiController.java

@@ -6,9 +6,6 @@ import com.takai.ai.domain.dto.TakaiDialogReqDTO;
 import com.takai.ai.domain.dto.TakaiQuestionDTO;
 import com.takai.ai.domain.entity.*;
 import com.takai.ai.service.ITakaiAiService;
-import com.takai.bigmodel.domain.dto.DialogReqDTO;
-import com.takai.bigmodel.domain.dto.DialogRespDTO;
-import com.takai.bigmodel.domain.dto.QuestionDTO;
 import com.takai.bigmodel.domain.entity.PageParams;
 import com.takai.common.annotation.Log;
 import com.takai.common.core.controller.BaseController;
@@ -257,7 +254,7 @@ public class TakaiAiController extends BaseController {
 
     /**
      * 上传知识文件
-     * @param file
+     * @param files
      * @param knowledgeId
      * @return
      * @throws Exception
@@ -313,9 +310,9 @@ public class TakaiAiController extends BaseController {
      * @param sliceId
      * @param knowledgeId
      */
-    @DeleteMapping("/deleteSlice/{sliceId}/{knowledgeId}")
-    public AjaxResult deleteSlice(@PathVariable String sliceId, @PathVariable String knowledgeId) {
-        return success (takaiAisService.deleteSlice(sliceId, knowledgeId));
+    @DeleteMapping("/deleteSlice/{sliceId}/{knowledgeId}/{documentId}")
+    public AjaxResult deleteSlice(@PathVariable String sliceId, @PathVariable String knowledgeId, @PathVariable String documentId) {
+        return success (takaiAisService.deleteSlice(sliceId, knowledgeId, documentId));
     }
 
     /**

+ 43 - 0
takai-ai/src/main/java/com/takai/ai/config/MinioConfig.java

@@ -3,21 +3,64 @@ package com.takai.ai.config;
 import com.takai.ai.domain.TakaiSysOssConfig;
 import com.takai.ai.service.IMinioConfigService;
 import io.minio.MinioClient;
+import okhttp3.OkHttpClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.beans.factory.annotation.Value;
 
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.X509Certificate;
+
 @Configuration
 public class MinioConfig {
 
     @Bean
     public MinioClient minioClient(@Autowired IMinioConfigService configService) throws Exception {
         TakaiSysOssConfig config = configService.getCurrentConfig();
+        // 1. 创建信任所有证书的 TrustManager
+        TrustManager[] trustAllCerts = new TrustManager[]{
+                new X509TrustManager() {
+                    @Override
+                    public void checkClientTrusted(X509Certificate[] chain, String authType) {
+                        // 信任所有客户端证书
+                    }
+
+                    @Override
+                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
+                        // 信任所有服务端证书
+                    }
+
+                    @Override
+                    public X509Certificate[] getAcceptedIssuers() {
+                        return new X509Certificate[0];
+                    }
+                }
+        };
+
+        // 2. 配置 SSLContext
+        SSLContext sslContext = SSLContext.getInstance("TLS");
+        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
+
+        // 3. 创建 OkHttpClient 并禁用证书验证
+        OkHttpClient httpClient = new OkHttpClient.Builder()
+                .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0])
+                .hostnameVerifier((hostname, session) -> true) // 跳过主机名验证
+                .build();
+
+        // 4. 初始化 MinIO 客户端
         return MinioClient.builder()
                 .endpoint(config.getEndpoint())
                 .credentials(config.getAccessKey(), config.getSecretKey())
+                .httpClient(httpClient)
                 .build();
+
+//        return MinioClient.builder()
+//                .endpoint(config.getEndpoint())
+//                .credentials(config.getAccessKey(), config.getSecretKey())
+//                .build();
     }
 
     @Bean

+ 11 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiDocument.java

@@ -44,6 +44,8 @@ public class TakaiDocument extends BaseEntity
 
     private Integer parseImage;
 
+    private Integer sliceTotal;
+
     public String getDocumentId() {
         return documentId;
     }
@@ -124,6 +126,14 @@ public class TakaiDocument extends BaseEntity
         this.parseImage = parseImage;
     }
 
+    public Integer getSliceTotal() {
+        return sliceTotal;
+    }
+
+    public void setSliceTotal(Integer sliceTotal) {
+        this.sliceTotal = sliceTotal;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -141,6 +151,7 @@ public class TakaiDocument extends BaseEntity
             .append("createTime", getCreateTime())
             .append("updateBy", getUpdateBy())
             .append("updateTime", getUpdateTime())
+            .append("sliceTotal", getSliceTotal())
             .toString();
     }
 

+ 2 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/TakaiSliceUpdateParams.java

@@ -11,4 +11,6 @@ public class TakaiSliceUpdateParams {
 
     private String sliceText;
 
+    private String documentId;
+
 }

+ 1 - 1
takai-ai/src/main/java/com/takai/ai/service/ITakaiAiService.java

@@ -79,7 +79,7 @@ public interface ITakaiAiService
 
     JSONObject getSliceList(TakaiSliceParams params);
 
-    int deleteSlice(String sliceId, String knowledgeId);
+    int deleteSlice(String sliceId, String knowledgeId, String documentId);
 
     JSONObject getSliceDetail(String sliceId, String knowledgeId);
 

+ 74 - 49
takai-ai/src/main/java/com/takai/ai/service/impl/TakaiAiServiceImpl.java

@@ -491,39 +491,59 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             }
 
             TakaiDocumentSettings settings = new TakaiDocumentSettings();
-//            settings.setDocumentId("a" + documentId);
             settings.setKnowledgeId(knowledgeId);
-            boolean flag = analysisFile(params, settings, "upload");
-
-            if (flag) {
-                for (TakaiSysOss oss : result) {
-                    // oss保存到数据库
-                    takaiSysOssMapper.insertSysOss(oss);
-                }
+            JSONObject jsonObject = analysisFile(params, settings, "upload");
 
+            if (jsonObject != null && jsonObject.containsKey("code") && jsonObject.getInteger("code") == 200) {
                 for (UploadDocumentParams vo : params) {
-                    // 保存知识信息
-                    TakaiDocument document = TakaiDocument.builder()
-                            .documentId(vo.getDocument_id())
-                            .knowledgeId(knowledgeId)
-                            .customSeparator(String.format("[\"%s\"", "\\n") + "]")
-                            .sentenceSize("300")
-                            .name(vo.getName())
-                            .url(vo.getUrl()).build();
-                    int documentIdInsert = takaiDocumentMapper.insertDocument(document);
-
-                    if (documentIdInsert > 0) {
-                        // 保存知识设置信息
-                        SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
-                        long id = snowflakeDigitGenerator.nextId();
-                        TakaiDocumentSettings dSettings = new TakaiDocumentSettings();
-                        dSettings.setId(String.valueOf(id));
-                        dSettings.setKnowledgeId(knowledgeId);
-                        dSettings.setDocumentId(vo.getDocument_id());
-                        dSettings.setSetSlice("0");   // 默认 按标题段落切片
-                        dSettings.setSetAnalyze("1"); // 默认 图片转换成标识符
-                        dSettings.setSetTable("0");   // 默认 ttable转图片
-                        takaiDocumentSettingsMapper.insertDocumentSettings(dSettings);
+                    TakaiKnowledge info  = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
+                    if(info != null){
+                        // 更新知识库文件大小,总字符数, 文件总数
+                        JSONObject docInfo = jsonObject.getJSONObject("doc_info");
+                        if(docInfo != null){
+                            Integer fileLen = docInfo.getInteger("file_size");
+                            Integer wordNum = docInfo.getInteger("total_char_len");
+                            Integer sliceTotal = docInfo.getInteger("slice_num");
+                            TakaiKnowledge paramInfo = TakaiKnowledge.builder().knowledgeId(knowledgeId)
+                                    .length(info.getLength() == null ? fileLen : info.getLength() + fileLen )       // 文件大小
+                                    .wordNum(info.getWordNum() == null ? wordNum : info.getWordNum() + wordNum)      // 总字符数
+                                    .documentSize(info.getDocumentSize() == null ? sliceTotal : info.getDocumentSize() + sliceTotal) // 文件总数
+                                    .build();
+                            takaiKnowledgeMapper.updateKnowledge(paramInfo);
+
+                            for (TakaiSysOss oss : result) {
+                                // oss保存到数据库
+                                takaiSysOssMapper.insertSysOss(oss);
+                            }
+
+                            // 保存知识信息
+                            TakaiDocument document = TakaiDocument.builder()
+                                    .documentId(vo.getDocument_id())
+                                    .knowledgeId(knowledgeId)
+                                    .customSeparator(String.format("[\"%s\"", "\\n") + "]")
+                                    .sentenceSize("300")
+                                    .name(vo.getName())
+                                    .url(vo.getUrl())
+                                    .sliceTotal(sliceTotal)
+                                    .length(fileLen)
+                                    .wordNum(wordNum)
+                                    .build();
+                            int documentIdInsert = takaiDocumentMapper.insertDocument(document);
+
+                            if (documentIdInsert > 0) {
+                                // 保存知识设置信息
+                                SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
+                                long id = snowflakeDigitGenerator.nextId();
+                                TakaiDocumentSettings dSettings = new TakaiDocumentSettings();
+                                dSettings.setId(String.valueOf(id));
+                                dSettings.setKnowledgeId(knowledgeId);
+                                dSettings.setDocumentId(vo.getDocument_id());
+                                dSettings.setSetSlice("0");   // 默认 按标题段落切片
+                                dSettings.setSetAnalyze("1"); // 默认 图片转换成标识符
+                                dSettings.setSetTable("0");   // 默认 ttable转图片
+                                takaiDocumentSettingsMapper.insertDocumentSettings(dSettings);
+                            }
+                        }
                     }
                 }
                 setRedisCache(knowledgeId);
@@ -568,7 +588,19 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                     JSONObject obj = JSON.parseObject(body);
                     Integer code = obj.getInteger("code");
                     if (code == 200) {
-                        return takaiDocumentMapper.delDocument(documentId);
+                        int i = takaiDocumentMapper.delDocument(documentId);
+                        if(i > 0){
+                            TakaiKnowledge info  = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(vo.getKnowledgeId()).build());
+                            if(info != null){
+                                // 更新知识库文件大小,总字符数, 文件总数
+                                TakaiKnowledge paramInfo = TakaiKnowledge.builder().knowledgeId(vo.getKnowledgeId())
+                                        .length(vo.getLength() == null ? info.getLength() == null ? 0 : info.getLength() : info.getLength() - vo.getLength())       // 文件大小
+                                        .wordNum(vo.getWordNum() == null ? info.getWordNum() == null ? 0 : info.getWordNum() : info.getWordNum() - vo.getWordNum())      // 总字符数
+                                        .documentSize(info.getDocumentSize() == null ? 0 : info.getDocumentSize() - 1) // 文件总数
+                                        .build();
+                                takaiKnowledgeMapper.updateKnowledge(paramInfo);
+                            }
+                        }
                     }
                 }
             } catch (IOException e) {
@@ -727,12 +759,11 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
             listParams.add(params);
         }
 
-        boolean status = analysisFile(listParams, settings, "update");
-        if (status) {
+        JSONObject jsonObject = analysisFile(listParams, settings, "update");
+        if (jsonObject != null && jsonObject.containsKey("code") && jsonObject.getInteger("code") == 200) {
             logger.info("update document setting success, id:{}", documentId);
             documentSettings.setDocumentId(documentId);
-            int i = takaiDocumentSettingsMapper.updateDocumentSettings(documentSettings);
-            return i;
+            return takaiDocumentSettingsMapper.updateDocumentSettings(documentSettings);
         }
         return 0;
     }
@@ -771,10 +802,8 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
     }
 
     @Override
-    public int deleteSlice(String sliceId, String knowledgeId) {
-//        TakaiKnowledge knowledge = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
-
-        String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteSlice() + "/" + sliceId + "/" + knowledgeId;
+    public int deleteSlice(String sliceId, String knowledgeId, String documentId) {
+        String url = deepseekConfig.getBaseurl() + deepseekConfig.getDeleteSlice() + "/" + sliceId + "/" + knowledgeId +  "/" + documentId;
         Request request = buildDeleteRequest(url);
         OkHttpClient client = buildOkHttpClient();
         Response response = null;
@@ -822,6 +851,7 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         object.put("knowledge_id", params.getKnowledgeId());
         object.put("slice_id", params.getSliceId());
         object.put("slice_text", params.getSliceText());
+        object.put("document_id", params.getDocumentId());
         RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), object.toJSONString());
 
         Request request = buildPutRequest(url, requestBody);
@@ -852,16 +882,11 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         return mrVo;
     }
 
-    private boolean analysisFile(List<UploadDocumentParams> result, TakaiDocumentSettings settings, String flag) {
-//        TakaiKnowledge knowledge = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(settings.getKnowledgeId()).build());
+    private JSONObject analysisFile(List<UploadDocumentParams> result, TakaiDocumentSettings settings, String flag) {
         String url = deepseekConfig.getBaseurl() + deepseekConfig.getUploadKnowledge();
         JSONObject json = new JSONObject();
         json.put("knowledge_id", settings.getKnowledgeId());
-//        json.put("document_id", settings.getDocumentId());
-//        json.put("embedding_id", knowledge == null ? "" : knowledge.getEmbeddingId());
         json.put("docs", result);
-//        json.put("name", result.getOriginalName());
-//        json.put("url", result.getUrl());
         if ("upload".equals(flag)) {
             json.put("set_slice", "0");
             json.put("slice_value", null);
@@ -888,16 +913,16 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                 Integer code = obj.getInteger("code");
                 if (code == 200) {
                     logger.info("上传文档调用python接口成功,返回内容:{}", body);
-                    return true;
+                    return obj;
                 }
-                return false;
+                return obj;
             } else {
                 logger.error("上传文档调用python接口失败返回code:{}", response.code());
-                return false;
+                return null;
             }
         } catch (IOException e) {
             logger.error("上传文档调用python接口失败", e.getMessage());
-            return false;
+            return null;
         }
     }
 

+ 5 - 1
takai-ai/src/main/resources/mapper/takaiai/TakaiDocumentMapper.xml

@@ -20,10 +20,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="createTime" column="create_time" />
 		<result property="updateBy"   column="update_by"   />
 		<result property="updateTime" column="update_time" />
+		<result property="sliceTotal" column="slice_total" />
 	</resultMap>
 	
 	<sql id="selectSql">
-        select document_id, knowledge_id,custom_separator, knowledge_type, sentence_size, length, word_num, name,url, create_by, create_time, remark, update_time
+        select document_id, knowledge_id,custom_separator, knowledge_type, sentence_size, length, word_num, name,url,
+			   parse_image, remark, create_by, create_time, update_by, update_time, slice_total
 		from bm_document
     </sql>
 
@@ -59,6 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		    <if test="parseImage != null">parse_image,</if>
  			<if test="remark != null and remark != ''">remark,</if>
  			<if test="createBy != null and createBy != ''">create_by,</if>
+		    <if test="sliceTotal != null and sliceTotal != ''">slice_total,</if>
  			create_time
  		)values(
 			<if test="documentId != null  and documentId != ''">#{documentId},</if>
@@ -73,6 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="parseImage != null">#{parseImage},</if>
  			<if test="remark != null and remark != ''">#{remark},</if>
  			<if test="createBy != null and createBy != ''">#{createBy},</if>
+		    <if test="sliceTotal != null and sliceTotal != ''">#{sliceTotal},</if>
  			sysdate()
  		)
 	</insert>