Bladeren bron

bug修复,知识库详情修改,删除等

zhangenzhi 2 jaren geleden
bovenliggende
commit
19352fd8d4
21 gewijzigde bestanden met toevoegingen van 466 en 58 verwijderingen
  1. 6 0
      pom.xml
  2. 16 0
      src/main/java/com/pavis/backend/slim/common/constant/Hodgepodge.java
  3. 1 1
      src/main/java/com/pavis/backend/slim/framework/config/SecurityConfig.java
  4. 21 1
      src/main/java/com/pavis/backend/slim/framework/minio/MinioStorage.java
  5. 6 0
      src/main/java/com/pavis/backend/slim/project/system/controller/SysFileController.java
  6. 23 3
      src/main/java/com/pavis/backend/slim/project/system/controller/SysKbController.java
  7. 3 3
      src/main/java/com/pavis/backend/slim/project/system/controller/SysKgController.java
  8. 1 1
      src/main/java/com/pavis/backend/slim/project/system/domain/SysEntityInstance.java
  9. 13 0
      src/main/java/com/pavis/backend/slim/project/system/domain/SysFile.java
  10. 3 0
      src/main/java/com/pavis/backend/slim/project/system/domain/algorithm/AlgSpO.java
  11. 37 0
      src/main/java/com/pavis/backend/slim/project/system/domain/front/FileKey.java
  12. 9 0
      src/main/java/com/pavis/backend/slim/project/system/mapper/SysFileMapper.java
  13. 7 0
      src/main/java/com/pavis/backend/slim/project/system/service/SysFileService.java
  14. 17 0
      src/main/java/com/pavis/backend/slim/project/system/service/SysKbFileService.java
  15. 17 1
      src/main/java/com/pavis/backend/slim/project/system/service/SysKbService.java
  16. 7 0
      src/main/java/com/pavis/backend/slim/project/system/service/impl/SysFileServiceImpl.java
  17. 42 0
      src/main/java/com/pavis/backend/slim/project/system/service/impl/SysKbFileServiceImpl.java
  18. 78 1
      src/main/java/com/pavis/backend/slim/project/system/service/impl/SysKbServiceImpl.java
  19. 127 46
      src/main/java/com/pavis/backend/slim/project/system/service/impl/SysKgServiceImpl.java
  20. 8 0
      src/main/resources/application-local.yml
  21. 24 1
      src/main/resources/mapper/system/SysFileMapper.xml

+ 6 - 0
pom.xml

@@ -133,6 +133,12 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
+        <!-- mybatis 分页-->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>1.4.6</version>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>

+ 16 - 0
src/main/java/com/pavis/backend/slim/common/constant/Hodgepodge.java

@@ -0,0 +1,16 @@
+package com.pavis.backend.slim.common.constant;
+
+/**
+ * 一些杂乱的常量类
+ * @author enen
+ */
+public class Hodgepodge {
+
+    /**
+     * 算法id,由于算法数据回传属于匿名回传,需给一个值
+     */
+    public static final long ALGORITHM = 001L;
+
+    //数据条数的默认值,用于集合判断
+    public static final int NUMBER = 0;
+}

+ 1 - 1
src/main/java/com/pavis/backend/slim/framework/config/SecurityConfig.java

@@ -123,7 +123,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
                 .antMatchers("/login", "/register","/kg/createKg","/kg/algorithm"
-                ,"/kg/kgTreeReturn").permitAll()
+                ,"/updateFile").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 21 - 1
src/main/java/com/pavis/backend/slim/framework/minio/MinioStorage.java

@@ -5,7 +5,13 @@ import cn.hutool.core.util.StrUtil;
 import com.pavis.backend.slim.common.constant.Constant;
 import com.pavis.backend.slim.common.exception.UtilException;
 import io.minio.*;
+import io.minio.errors.ErrorResponseException;
+import io.minio.errors.InsufficientDataException;
+import io.minio.errors.InternalException;
+import io.minio.errors.InvalidResponseException;
 import io.minio.errors.MinioException;
+import io.minio.errors.ServerException;
+import io.minio.errors.XmlParserException;
 import io.minio.http.Method;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -67,7 +73,7 @@ public class MinioStorage {
      * 上传文件至指定bucket或指定文件夹
      *
      * @param key 文件键值
-     * @param is  文件input流
+     * @param file  文件input流
      */
     public void putObject(String key, MultipartFile file) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
         try {
@@ -176,4 +182,18 @@ public class MinioStorage {
     public String getBucketName() {
         return bucketName;
     }
+
+    /**
+     * 删除文件
+     * @param bucketName 桶名字
+     * @param fileName 文件路径
+     */
+    public void delect(String bucketName, String fileName) {
+        try {
+            client.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new UtilException(e.getMessage());
+        }
+    }
 }

+ 6 - 0
src/main/java/com/pavis/backend/slim/project/system/controller/SysFileController.java

@@ -1,6 +1,7 @@
 package com.pavis.backend.slim.project.system.controller;
 
 import com.pavis.backend.slim.framework.web.domain.AjaxResult;
+import com.pavis.backend.slim.project.system.domain.SysFile;
 import com.pavis.backend.slim.project.system.service.SysFileService;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -62,4 +63,9 @@ public class SysFileController {
         return AjaxResult.success("预览地址获取成功!", fileService.preview(key));
     }
 
+    @ApiOperation("文件名字修改")
+    @PostMapping("/updateFile")
+    public AjaxResult updateFile(@RequestBody SysFile sysFile) {
+        return AjaxResult.success(fileService.updateFile(sysFile));
+    }
 }

+ 23 - 3
src/main/java/com/pavis/backend/slim/project/system/controller/SysKbController.java

@@ -4,17 +4,25 @@ import com.pavis.backend.slim.common.utils.SecurityUtils;
 import com.pavis.backend.slim.framework.web.domain.AjaxResult;
 import com.pavis.backend.slim.project.system.domain.SysFile;
 import com.pavis.backend.slim.project.system.domain.SysKb;
+import com.pavis.backend.slim.project.system.domain.front.FileKey;
 import com.pavis.backend.slim.project.system.service.SysFileService;
 import com.pavis.backend.slim.project.system.service.SysKbFileService;
 import com.pavis.backend.slim.project.system.service.SysKbService;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import java.util.concurrent.Delayed;
+
 /**
  * @author semi
  * @create 2023-05-08 17:12
@@ -83,8 +91,8 @@ public class SysKbController {
             @ApiImplicitParam(name = "fileId", value = "文件id", required = true, paramType = "form")
     })
     @PostMapping("/doc/remove")
-    public AjaxResult removeKbDoc(String kbId, String fileId) {
-        kbFileService.delDoc(kbId, fileId);
+    public AjaxResult removeKbDoc(@RequestParam("kbId") String kbId, @RequestParam("fileIds") List<String> fileIds) {
+        kbFileService.deleteList(kbId, fileIds);
         return AjaxResult.success("知识库文档删除成功!");
     }
 
@@ -107,7 +115,8 @@ public class SysKbController {
     })
     @GetMapping("/del/{id}")
     public AjaxResult delKb(@PathVariable("id") String kbId) {
-        return AjaxResult.success("知识库删除成功!", kbService.removeById(kbId));
+        kbService.delFileAndRelation(kbId);
+        return AjaxResult.success("知识库删除成功!");
     }
 
     @ApiOperation("更新知识库")
@@ -118,4 +127,15 @@ public class SysKbController {
         }
         return AjaxResult.success("知识库修改成功!", kbService.update(kb));
     }
+
+    @ApiOperation("文件搜索接口")
+    @PostMapping("/searchFile")
+    public AjaxResult searchFile(@RequestBody FileKey fileKey) {
+        try {
+            Thread.sleep(300);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return AjaxResult.success(kbService.searchFile(fileKey));
+    }
 }

+ 3 - 3
src/main/java/com/pavis/backend/slim/project/system/controller/SysKgController.java

@@ -68,11 +68,11 @@ public class SysKgController {
     }
 
     /**
-     * 所有知识库的树结构
-     *
+     * 接收算法返回数据接口
+     * @param algSpO 算法返回数据的结构
      * @return
      */
-    @ApiOperation("所有知识库的树结构")
+    @ApiOperation("接收算法返回数据接口")
     @PostMapping("/algorithm")
     public AjaxResult algorithm(@RequestBody AlgSpO algSpO) {
         kgService.algorithm(algSpO);

+ 1 - 1
src/main/java/com/pavis/backend/slim/project/system/domain/SysEntityInstance.java

@@ -17,7 +17,7 @@ public class SysEntityInstance extends BaseEntity {
     /**
      * 实例id
      */
-    @TableId(type = IdType.ASSIGN_UUID)
+    // @TableId(type = IdType.ASSIGN_UUID)
     private String instanceId;
 
     /**

+ 13 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/SysFile.java

@@ -1,6 +1,7 @@
 package com.pavis.backend.slim.project.system.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.pavis.backend.slim.framework.web.domain.BaseEntity;
 
@@ -86,6 +87,18 @@ public class SysFile extends BaseEntity {
      */
     private Boolean isDir;
 
+
+    @TableField(exist = false)
+    private String kbName;
+
+    public String getKbName() {
+        return kbName;
+    }
+
+    public void setKbName(String kbName) {
+        this.kbName = kbName;
+    }
+
     public String getFileId() {
         return fileId;
     }

+ 3 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/algorithm/AlgSpO.java

@@ -1,5 +1,6 @@
 package com.pavis.backend.slim.project.system.domain.algorithm;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.List;
@@ -7,6 +8,8 @@ import java.util.Map;
 
 @Data
 public class AlgSpO {
+    @ApiModelProperty("图谱id")
     private String kgId;
+    @ApiModelProperty("三元组")
     private List<Map<String,Object>> spo;
 }

+ 37 - 0
src/main/java/com/pavis/backend/slim/project/system/domain/front/FileKey.java

@@ -0,0 +1,37 @@
+package com.pavis.backend.slim.project.system.domain.front;
+
+import com.pavis.backend.slim.project.system.domain.SysFile;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+
+@Data
+/**
+ * 文件搜索类
+ * @author enen
+ */
+public class FileKey extends SysFile {
+    @ApiModelProperty("页数")
+    private Integer pageNum;
+
+    @ApiModelProperty("条数")
+    private Integer pageSize;
+    
+    /**
+     *搜索文件的天数范围
+     * 1:最近一天内;7:最近一周内;30:最近一个月内;0:所有时间,不区别
+     */
+    @ApiModelProperty("文件后缀")
+    private Integer numDay;
+    /**
+     * 文件类型
+     */
+    @ApiModelProperty("文件类型")
+    private String suffix;
+    /**
+     * 文件名字
+     */
+    @ApiModelProperty("文件名字")
+    private String fileName;
+
+}

+ 9 - 0
src/main/java/com/pavis/backend/slim/project/system/mapper/SysFileMapper.java

@@ -2,6 +2,7 @@ package com.pavis.backend.slim.project.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.pavis.backend.slim.project.system.domain.SysFile;
+import com.pavis.backend.slim.project.system.domain.front.FileKey;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -22,4 +23,12 @@ public interface SysFileMapper extends BaseMapper<SysFile> {
      * @return 文件列表
      */
     List<SysFile> selectByKbIdAndUserId(@Param("kbId") String kbId, @Param("userId") Long userId);
+
+    /**
+     * 根据搜索条件获取文件列表
+     * @param fileKey 搜索条件
+     * @return 文件列表
+     */
+    List<SysFile> selectFileAndKbName(FileKey fileKey);
+
 }

+ 7 - 0
src/main/java/com/pavis/backend/slim/project/system/service/SysFileService.java

@@ -70,4 +70,11 @@ public interface SysFileService extends IService<SysFile> {
      * @return 文件可访问的url
      */
     String preview(String key);
+
+    /**
+     * 修改文件名称
+     * @param file 文件详情
+     * @return 修改后的文件详情
+     */
+    public SysFile updateFile(SysFile file);
 }

+ 17 - 0
src/main/java/com/pavis/backend/slim/project/system/service/SysKbFileService.java

@@ -5,6 +5,8 @@ import com.pavis.backend.slim.project.system.domain.SysFile;
 import com.pavis.backend.slim.project.system.domain.SysKbFile;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * @author semi
  * @create 2023-05-09 11:14
@@ -30,4 +32,19 @@ public interface SysKbFileService extends IService<SysKbFile> {
      * @param fileId 知识库文档id
      */
     void delDoc(String kbId, String fileId);
+
+    /**
+     * 判断创建知识库中的文件是否重复
+     * @param path 文件路径
+     * @param kbId 知识库Id
+     * @return 返回为true则存在重复,返回为false则不存在
+     */
+    Boolean checkFileAndKb(String path, String kbId);
+
+    /**
+     * 批量删除文件
+     * @param kbId 知识库id
+     * @param fileList 文件集合
+     */
+    void deleteList(String kbId, List<String> fileList);
 }

+ 17 - 1
src/main/java/com/pavis/backend/slim/project/system/service/SysKbService.java

@@ -1,7 +1,10 @@
 package com.pavis.backend.slim.project.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.pagehelper.PageInfo;
+import com.pavis.backend.slim.project.system.domain.SysFile;
 import com.pavis.backend.slim.project.system.domain.SysKb;
+import com.pavis.backend.slim.project.system.domain.front.FileKey;
 
 import java.util.List;
 
@@ -58,5 +61,18 @@ public interface SysKbService extends IService<SysKb> {
      * @param kb 知识库信息
      * @return 是否唯一
      */
-    public boolean checkName(SysKb kb);
+    boolean checkName(SysKb kb);
+
+    /***
+     * 文件搜索
+     * @param file 搜索条件实体类
+     * @return 文件集合
+     */
+    PageInfo searchFile(FileKey file);
+
+    /**
+     * 删除知识库关联关系
+     * @param kbId 知识库id
+     */
+    void delFileAndRelation(String kbId);
 }

+ 7 - 0
src/main/java/com/pavis/backend/slim/project/system/service/impl/SysFileServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.digest.MD5;
 import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.pavis.backend.slim.common.constant.Constant;
 import com.pavis.backend.slim.common.exception.ServiceException;
@@ -214,4 +215,10 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
     public String preview(String key) {
         return storage.preview(key);
     }
+
+    @Override
+    public SysFile updateFile(SysFile file) {
+        baseMapper.updateById(file);
+        return file;
+    }
 }

+ 42 - 0
src/main/java/com/pavis/backend/slim/project/system/service/impl/SysKbFileServiceImpl.java

@@ -3,13 +3,17 @@ package com.pavis.backend.slim.project.system.service.impl;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pavis.backend.slim.common.constant.Hodgepodge;
 import com.pavis.backend.slim.common.exception.ServiceException;
+import com.pavis.backend.slim.common.utils.FileUtils;
 import com.pavis.backend.slim.common.utils.SecurityUtils;
 import com.pavis.backend.slim.project.system.domain.SysFile;
 import com.pavis.backend.slim.project.system.domain.SysKbFile;
+import com.pavis.backend.slim.project.system.mapper.SysFileMapper;
 import com.pavis.backend.slim.project.system.mapper.SysKbFileMapper;
 import com.pavis.backend.slim.project.system.service.SysFileService;
 import com.pavis.backend.slim.project.system.service.SysKbFileService;
+import org.apache.catalina.security.SecurityUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -25,9 +29,17 @@ public class SysKbFileServiceImpl extends ServiceImpl<SysKbFileMapper, SysKbFile
 
     @Autowired
     private SysFileService fileService;
+    @Autowired
+    private SysFileMapper sysFileMapper;
 
     @Override
     public SysFile addDoc(String kbId, MultipartFile file, String icon, String path, Boolean isDir) {
+        // 效验文件夹名字是否重复 isDir为true则是文件夹;false则为文件
+        if (isDir) {
+            if (checkFileAndKb(path, kbId)) {
+                throw new ServiceException("文件夹名字重复,请重新操作!");
+            }
+        }
         SysFile sysFile = fileService.uploadFile(file, icon, path, isDir);
         SysKbFile kbFile = new SysKbFile();
         kbFile.setKbId(kbId);
@@ -55,5 +67,35 @@ public class SysKbFileServiceImpl extends ServiceImpl<SysKbFileMapper, SysKbFile
             throw new ServiceException("文件不存在!");
         }
         baseMapper.delete(wrapper);
+        QueryWrapper<SysFile> file = new QueryWrapper<>();
+        file.eq("file_id", fileId).eq("user_id", userId);
+        sysFileMapper.delete(file);
+    }
+
+    @Override
+    public void deleteList(String kbId, List<String> fileList) {
+        for (String file : fileList) {
+            delDoc(kbId, file);
+        }
+    }
+
+    @Override
+    public Boolean checkFileAndKb(String path, String kbId) {
+        Boolean bool = false;
+        // 通过路径和创建人查询文件
+        List<SysFile> listFile = sysFileMapper.selectList(new QueryWrapper<SysFile>()
+                .eq("path", path)
+                .eq("user_id", SecurityUtils.getUserId()));
+        // 如果文件存在则进行判断,是否一致,一致则返回true
+        if (listFile.size() > Hodgepodge.NUMBER) {
+            for (SysFile sysFile : listFile) {
+                SysKbFile sysKbFile = baseMapper.selectOne(new QueryWrapper<SysKbFile>()
+                        .eq("file_id", sysFile.getFileId()));
+                if (sysKbFile != null && sysKbFile.getKbId().equals(kbId)) {
+                    bool = true;
+                }
+            }
+        }
+        return bool;
     }
 }

+ 78 - 1
src/main/java/com/pavis/backend/slim/project/system/service/impl/SysKbServiceImpl.java

@@ -1,14 +1,30 @@
 package com.pavis.backend.slim.project.system.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.pavis.backend.slim.common.constant.Hodgepodge;
 import com.pavis.backend.slim.common.utils.SecurityUtils;
+import com.pavis.backend.slim.project.system.domain.SysFile;
 import com.pavis.backend.slim.project.system.domain.SysKb;
+import com.pavis.backend.slim.project.system.domain.SysKbFile;
+import com.pavis.backend.slim.project.system.domain.front.FileKey;
+import com.pavis.backend.slim.project.system.mapper.SysFileMapper;
+import com.pavis.backend.slim.project.system.mapper.SysKbFileMapper;
 import com.pavis.backend.slim.project.system.mapper.SysKbMapper;
 import com.pavis.backend.slim.project.system.service.SysKbService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -16,7 +32,16 @@ import java.util.List;
  * @create 2023-05-08 17:09
  */
 @Service
+@Slf4j
 public class SysKbServiceImpl extends ServiceImpl<SysKbMapper, SysKb> implements SysKbService {
+    @Autowired
+    private SysFileMapper sysFileMapper;
+
+    @Autowired
+    private SysKbFileMapper sysKbFileMapper;
+
+    @Autowired
+    private SysKbMapper sysKbMapper;
 
     @Override
     public SysKb create(SysKb kb) {
@@ -58,8 +83,60 @@ public class SysKbServiceImpl extends ServiceImpl<SysKbMapper, SysKb> implements
     @Override
     public boolean checkName(SysKb kb) {
         Integer size = baseMapper.selectList(new QueryWrapper<SysKb>()
-                .ne("kd_id", kb.getKbId())
+                .ne("kb_id", kb.getKbId())
                 .eq("name", kb.getName())).size();
         return size > 0;
     }
+
+    @Override
+    public PageInfo searchFile(FileKey file) {
+        // 处理入参时间
+        if (null != file.getNumDay()) {
+            Date date = dateRoll(new Date(), Calendar.HOUR_OF_DAY, file.getNumDay() * 24);
+            String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
+            file.setIcon(format);
+        }
+        // 进行分页
+        PageHelper.startPage(file.getPageNum(), file.getPageSize());
+        List<SysFile> sysFiles = sysFileMapper.selectFileAndKbName(file);
+        log.info("sysFiles:{}", JSON.toJSONString(sysFiles));
+        PageInfo page = new PageInfo(sysFiles);
+        log.info("page:{}", JSON.toJSONString(page));
+        return page;
+    }
+
+    /**
+     * @param date 当前时间
+     * @param i    时间规格,是二十四小时制,还是十二小时制
+     * @param d    时间变化数,1:最近一天内;7:最近一周内;30:最近一个月内
+     * @return
+     */
+    public Date dateRoll(Date date, int i, int d) {
+        // 获取Calendar对象并以传进来的时间为准
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        // 将现在的时间滚动固定时长,转换为Date类型赋值
+        calendar.add(i, -d);
+        // 转换为Date类型再赋值
+        date = calendar.getTime();
+        return date;
+    }
+
+    @Override
+    public void delFileAndRelation(String kbId) {
+        //获取知识库内的关系和文件
+        List<SysKbFile> sysKbFiles = sysKbFileMapper.selectList(new QueryWrapper<SysKbFile>()
+                .eq("kb_id", kbId)
+                .eq("user_id", SecurityUtils.getUserId()));
+        //通过文件id删除文件,通过文件id和知识库id删除关系
+        for (SysKbFile sysKbFile : sysKbFiles) {
+            sysFileMapper.deleteById(sysKbFile.getFileId());
+            sysKbFileMapper.delete(new QueryWrapper<SysKbFile>()
+                    .eq("file_id", sysKbFile.getFileId())
+                    .eq("kb_id", sysKbFile.getKbId()));
+        }
+        //删除知识库
+        sysKbMapper.deleteById(kbId);
+
+    }
 }

+ 127 - 46
src/main/java/com/pavis/backend/slim/project/system/service/impl/SysKgServiceImpl.java

@@ -1,9 +1,11 @@
 package com.pavis.backend.slim.project.system.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.crypto.digest.MD5;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pavis.backend.slim.common.constant.Hodgepodge;
 import com.pavis.backend.slim.common.utils.SecurityUtils;
 import com.pavis.backend.slim.project.system.client.HttpClientUtil;
 import com.pavis.backend.slim.project.system.domain.SysEntityInstance;
@@ -67,8 +69,7 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
         kg.setCreateTime(DateUtil.date());
         // 存储kg信息
         baseMapper.insert(kg);
-        // todo 调用算法初始化图谱接口
-        // 1. 获取文档列表
+        // 处理前端传过来的文件字段--fileIds
         List<String> li = new ArrayList();
         if (kg.getFileIds().indexOf(",") < 1) {
             li.add(kg.getFileIds());
@@ -78,11 +79,12 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
                 li.add(split[i]);
             }
         }
-        Map map = new HashMap();
+        // 1. 获取文档列表
         List<SysFile> listFile = kgCom(li);
         log.info("json:{}", listFile);
         log.info("url:{}", JSON.toJSONString(url));
-
+        // 将处理好的map,传给算法,调用算法接口
+        Map map = new HashMap();
         map.put("id", kg.getKgId());
         map.put("files", listFile);
         log.info("map:{}", JSON.toJSONString(map));
@@ -90,6 +92,12 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
         return kg;
     }
 
+    /**
+     * 将数据库中文件整理成集合的公共方法
+     *
+     * @param list
+     * @return 文件的集合
+     */
     public List<SysFile> kgCom(List<String> list) {
         List<SysFile> l = new ArrayList();
         for (String str : list) {
@@ -101,9 +109,10 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
 
     @Override
     public List listKg() {
+        // 获取知识库
         List<SysKb> listKb = sysKbMapper.selectList(new QueryWrapper<>());
         List l = new ArrayList();
-        Map m = new HashMap();
+        // 将知识库所有数据,构造成前端所需的树结构
         for (SysKb sysKb : listKb) {
             TreeFile tre = new TreeFile();
             tre.setId(sysKb.getKbId());
@@ -113,11 +122,11 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
             tre.setChildList(list);
             l.add(tre);
         }
-
-        log.info("tre:{}", JSON.toJSONString(l));
+        log.info("返参树结构:{}", JSON.toJSONString(l));
         return l;
     }
 
+    @Override
     public List<SysKg> list(SysKg kg) {
         return baseMapper.selectList(new QueryWrapper<SysKg>().eq("user_id", SecurityUtils.getUserId()));
     }
@@ -125,53 +134,99 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
     @Override
     public void algorithm(AlgSpO algSpO) {
         log.info("算法传参map:{}", JSON.toJSONString(algSpO));
+        // todo 先这么做,以后还需改动
         Integer integer = 0;
         if (integer == 0) {
             for (Map map : algSpO.getSpo()) {
-                // 插入起始点实例
-                SysEntityInstance sysEntityInstanceS = new SysEntityInstance();
-                sysEntityInstanceS.setUserId(001L);  // 001默认算法那边的用户id
-                sysEntityInstanceS.setCreateBy("001");
-                sysEntityInstanceS.setCreateTime(DateUtil.date());
-                // 插入终点实例
-                SysEntityInstance sysEntityInstanceO = new SysEntityInstance();
-                sysEntityInstanceO.setUserId(001L);  // 001默认算法那边的用户id
-                sysEntityInstanceO.setCreateBy("001");
-                sysEntityInstanceO.setCreateTime(DateUtil.date());
-
-                sysEntityInstanceS.setName((String) map.get("s"));
-                sysEntityInstanceMapper.insert(sysEntityInstanceS);
-                sysEntityInstanceO.setName((String) map.get("o"));
-                sysEntityInstanceMapper.insert(sysEntityInstanceO);
-                // 插入实例关系
-                SysEntityRelation sysEntityRelation = new SysEntityRelation();
-                sysEntityRelation.setKgId(algSpO.getKgId());
-                sysEntityRelation.setUserId(001L);
-                sysEntityRelation.setStart((String) map.get("s"));
-                sysEntityRelation.setStartId(sysEntityInstanceS.getInstanceId());
-                sysEntityRelation.setRelation((String) map.get("p"));
-                sysEntityRelation.setEnd((String) map.get("o"));
-                sysEntityRelation.setEndId(sysEntityInstanceO.getInstanceId());
-                sysEntityRelationMapper.insert(sysEntityRelation);
+                // check库里是否存在此值
+                String s = md5Check(MD5.create().digestHex16((String) map.get("s")));
+                // 临时变量,将起点id赋值给sCopy,最后用于实例关系插入时使用
+                String sCopy = "";
+                if (s.equals("false")) {
+                    // 插入起始点实例
+                    SysEntityInstance sysEntityInstanceS = new SysEntityInstance();
+                    // 创建实例
+                    sysEntityInstanceS.setUserId(Hodgepodge.ALGORITHM);
+                    sysEntityInstanceS.setCreateBy(String.valueOf(Hodgepodge.ALGORITHM));
+                    sysEntityInstanceS.setCreateTime(DateUtil.date());
+                    sysEntityInstanceS.setInstanceId(MD5.create().digestHex16((String) map.get("s")));
+                    sysEntityInstanceS.setName((String) map.get("s"));
+                    sysEntityInstanceMapper.insert(sysEntityInstanceS);
+                    sCopy = MD5.create().digestHex16((String) map.get("s"));
+                } else {
+                    sCopy = s;
+                }
+                String o = md5Check(MD5.create().digestHex16((String) map.get("o")));
+                String oCopy = "";
+                if (o.equals("false")) {
+                    // 插入终点实例
+                    SysEntityInstance sysEntityInstanceO = new SysEntityInstance();
+                    // 创建实例
+                    sysEntityInstanceO.setUserId(Hodgepodge.ALGORITHM);
+                    sysEntityInstanceO.setCreateBy(String.valueOf(Hodgepodge.ALGORITHM));
+                    sysEntityInstanceO.setCreateTime(DateUtil.date());
+                    sysEntityInstanceO.setInstanceId(MD5.create().digestHex16((String) map.get("o")));
+                    sysEntityInstanceO.setName((String) map.get("o"));
+                    sysEntityInstanceMapper.insert(sysEntityInstanceO);
+                    oCopy = MD5.create().digestHex16((String) map.get("o"));
+                } else {
+                    oCopy = o;
+                }
+                // 对算法那边出现的重复数据进行去去重判断,如果数据库里有数据,则不在插入;如果数据库里没有,则进行插入
+                List<SysEntityRelation> list = sysEntityRelationMapper.selectList(new QueryWrapper<SysEntityRelation>()
+                        .eq("kg_id", algSpO.getKgId())
+                        .eq("start_id", sCopy)
+                        .eq("end_id", oCopy));
+                if (list.size() == Hodgepodge.NUMBER) {
+                    // 插入实例关系
+                    SysEntityRelation sysEntityRelation = new SysEntityRelation();
+                    sysEntityRelation.setKgId(algSpO.getKgId());
+                    sysEntityRelation.setUserId(Hodgepodge.ALGORITHM);
+                    sysEntityRelation.setStart((String) map.get("s"));
+                    sysEntityRelation.setStartId(sCopy);
+                    sysEntityRelation.setRelation((String) map.get("p"));
+                    sysEntityRelation.setEnd((String) map.get("o"));
+                    sysEntityRelation.setEndId(oCopy);
+                    sysEntityRelationMapper.insert(sysEntityRelation);
+                }
             }
         }
     }
 
+    /**
+     * 判断数据库内是否存在相同的数据
+     *
+     * @param instanceId 唯一id
+     * @return 如果库里有值,直接将库里的值返回;如果没有,则返回false
+     */
+    public String md5Check(String instanceId) {
+        List<SysEntityInstance> listEIM = sysEntityInstanceMapper.selectList(new QueryWrapper<SysEntityInstance>()
+                .eq("instance_id", instanceId));
+        if (listEIM.size() > 0) {
+            return listEIM.get(0).getInstanceId();
+        } else {
+            return "false";
+        }
+    }
+
     @Override
     public Integer delectKg(List<String> list) {
-        int num = 0;
+        int num = Hodgepodge.NUMBER;
         for (String kg : list) {
             num += baseMapper.deleteById(kg);
+            // 删除跟此图谱有关的关联数据
             List<SysEntityRelation> listR = sysEntityRelationMapper.selectList(new QueryWrapper<SysEntityRelation>()
                     .eq("kg_id", kg));
-            if (listR.size() > 0) {
+            if (listR.size() > Hodgepodge.NUMBER) {
+                // 删除此图谱的所有实例
                 for (SysEntityRelation sysEntityR : listR) {
-                    List l = new ArrayList();
-                    l.add(sysEntityR.getStartId());
-                    l.add(sysEntityR.getEndId());
-                    sysEntityInstanceMapper.deleteBatchIds(l);
+                    sysEntityInstanceMapper.delete(new QueryWrapper<SysEntityInstance>()
+                            .eq("instance_id", sysEntityR.getStartId())
+                            .or()
+                            .eq("instance_id", sysEntityR.getEndId()));
                 }
             }
+            // 删除此图谱的所有关系
             sysEntityRelationMapper.delete(new QueryWrapper<SysEntityRelation>()
                     .eq("kg_id", kg));
         }
@@ -180,18 +235,44 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
 
     @Override
     public KgReturn kgTreeReturn(String kgId) {
+        // 根据图谱id,获取此图谱的相关关系
         List<SysEntityRelation> listKg = sysEntityRelationMapper.selectList(new QueryWrapper<SysEntityRelation>()
                 .eq("kg_id", kgId));
+        // 最后返参的数据结构--kgReturn
         KgReturn kgReturn = new KgReturn();
-        if (listKg.size() > 0) {
-            List nodesList = new ArrayList(); // 实例集合
-            List edgesList = new ArrayList(); // 关系集合
+        if (listKg.size() > Hodgepodge.NUMBER) {
+            // 图谱实例集合
+            List nodesList = new ArrayList();
+            // 图谱关系集合
+            List<KgRelation> edgesList = new ArrayList();
             for (SysEntityRelation entity : listKg) {
-                // 插入关系
                 KgRelation kgRelation = new KgRelation();
-                kgRelation.setSource(entity.getStartId());
-                kgRelation.setTarget(entity.getEndId());
-                kgRelation.setLabel(entity.getRelation());
+                if (edgesList.size() > 0 && edgesList != null) {
+                    // todo 对于相互皆有关系的数据,进行处理,日后还需优化
+                    for (int i = 0; i < edgesList.size(); i++) {
+                        KgRelation k = edgesList.get(i);
+                        if (k.getSource().equals(entity.getEndId()) && k.getTarget().equals(entity.getStartId())) {
+                            // todo 优化位置
+                            // k.setType("quadratic");
+                            // 插入关系
+                            kgRelation.setSource(entity.getStartId());
+                            kgRelation.setTarget(entity.getEndId());
+                            kgRelation.setLabel(entity.getRelation());
+                            // todo 优化位置
+                            // kgRelation.setType("quadratic");
+                        } else {
+                            // 插入关系
+                            kgRelation.setSource(entity.getStartId());
+                            kgRelation.setTarget(entity.getEndId());
+                            kgRelation.setLabel(entity.getRelation());
+                        }
+                    }
+                } else {
+                    // 插入关系
+                    kgRelation.setSource(entity.getStartId());
+                    kgRelation.setTarget(entity.getEndId());
+                    kgRelation.setLabel(entity.getRelation());
+                }
                 edgesList.add(kgRelation);
                 // 插入实例
                 KgInstance kgInstance = new KgInstance();
@@ -205,7 +286,7 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
             }
             kgReturn.setNodes(nodesList);
             kgReturn.setEdges(edgesList);
-            log.info("返参结构:{}",JSON.toJSONString(kgReturn));
+            log.info("返参结构:{}", JSON.toJSONString(kgReturn));
         }
         return kgReturn;
     }

+ 8 - 0
src/main/resources/application-local.yml

@@ -73,4 +73,12 @@ feign:
 #调用算法接口
 algorithm:
   creat:
+    # 将所需要生成图谱的文件,传给算法的接口
     url: http://192.168.1.150:8900/data_access
+
+#PageHelper 分页插件配置
+pagehelper:
+  helperDialect: mysql
+  reasonable: true
+  supportMethodsArguments: true
+  params: count=countSql

+ 24 - 1
src/main/resources/mapper/system/SysFileMapper.xml

@@ -4,7 +4,7 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.pavis.backend.slim.project.system.mapper.SysFileMapper">
 
-    <resultMap type="SysFile" id="SysFileResult">
+    <resultMap type="com.pavis.backend.slim.project.system.domain.SysFile" id="SysFileResult">
         <id property="fileId" column="file_id"/>
         <result property="userId" column="user_id"/>
         <result property="name" column="name"/>
@@ -31,5 +31,28 @@
         where skf.kb_id = #{kbId}
           and skf.user_id = #{userId}
     </select>
+    <select id="selectFileAndKbName" resultType="com.pavis.backend.slim.project.system.domain.SysFile"
+            parameterType="com.pavis.backend.slim.project.system.domain.front.FileKey">
+        SELECT
+        sf.file_id,sf.user_id,sf.name,sf.original_name,sf.object_key,sf.url,
+        sf.path,sf.size,sf.type,sf.suffix,sf.icon,sf.identifier,
+        sf.is_dir,sf.create_by,sf.create_time,sf.update_by,sf.update_time,sk.name as kbName
+        FROM
+        sys_file sf
+        LEFT JOIN sys_kb_file skf ON sf.file_id = skf.file_id
+        RIGHT JOIN sys_kb sk ON skf.kb_id = sk.kb_id
+        WHERE 1=1
+        <if test="numDay!=null and numDay!=''">
+            and <![CDATA[ sf.create_time >= #{icon} ]]>
+        </if>
+        <if test="suffix!=null and suffix!=''">
+            and sf.suffix like concat ('%',#{suffix},'%')
+        </if>
+        <if test="fileName!=null and fileName!=''">
+            and sf.original_name like concat ('%',#{fileName},'%')
+        </if>
+        and sf.is_dir=0
+    </select>
+
 
 </mapper>