|
@@ -4,32 +4,30 @@ import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import cn.hutool.crypto.digest.MD5;
|
|
import cn.hutool.crypto.digest.MD5;
|
|
import com.alibaba.fastjson2.JSON;
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
|
+import com.alibaba.fastjson2.JSONArray;
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.pavis.backend.slim.common.constant.Constant;
|
|
import com.pavis.backend.slim.common.constant.Constant;
|
|
import com.pavis.backend.slim.common.exception.ServiceException;
|
|
import com.pavis.backend.slim.common.exception.ServiceException;
|
|
|
|
+import com.pavis.backend.slim.common.utils.CommonUtils;
|
|
import com.pavis.backend.slim.common.utils.FileUtils;
|
|
import com.pavis.backend.slim.common.utils.FileUtils;
|
|
import com.pavis.backend.slim.common.utils.SecurityUtils;
|
|
import com.pavis.backend.slim.common.utils.SecurityUtils;
|
|
import com.pavis.backend.slim.framework.minio.MinioStorage;
|
|
import com.pavis.backend.slim.framework.minio.MinioStorage;
|
|
|
|
+import com.pavis.backend.slim.project.system.client.AlgKgClient;
|
|
import com.pavis.backend.slim.project.system.domain.SysFile;
|
|
import com.pavis.backend.slim.project.system.domain.SysFile;
|
|
|
|
+import com.pavis.backend.slim.project.system.domain.annotation.ConvertAlgRes;
|
|
|
|
+import com.pavis.backend.slim.project.system.domain.annotation.ConvertDocToTxt;
|
|
import com.pavis.backend.slim.project.system.domain.vo.TreeFile;
|
|
import com.pavis.backend.slim.project.system.domain.vo.TreeFile;
|
|
import com.pavis.backend.slim.project.system.mapper.SysFileMapper;
|
|
import com.pavis.backend.slim.project.system.mapper.SysFileMapper;
|
|
import com.pavis.backend.slim.project.system.service.SysFileService;
|
|
import com.pavis.backend.slim.project.system.service.SysFileService;
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
-import org.apache.commons.compress.utils.IOUtils;
|
|
|
|
-import org.apache.commons.fileupload.FileItem;
|
|
|
|
-import org.apache.commons.fileupload.FileItemFactory;
|
|
|
|
-import org.apache.commons.fileupload.disk.DiskFileItem;
|
|
|
|
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
-import org.springframework.http.MediaType;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
import org.springframework.util.StreamUtils;
|
|
import org.springframework.util.StreamUtils;
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
@@ -39,12 +37,14 @@ import java.io.FileInputStream;
|
|
import java.io.FileOutputStream;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.InputStream;
|
|
-import java.io.OutputStream;
|
|
|
|
import java.io.PrintWriter;
|
|
import java.io.PrintWriter;
|
|
import java.net.URL;
|
|
import java.net.URL;
|
|
import java.security.InvalidKeyException;
|
|
import java.security.InvalidKeyException;
|
|
import java.security.NoSuchAlgorithmException;
|
|
import java.security.NoSuchAlgorithmException;
|
|
-import java.util.*;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -58,6 +58,9 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
|
|
@Autowired
|
|
@Autowired
|
|
MinioStorage storage;
|
|
MinioStorage storage;
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private AlgKgClient algKgClient;
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public SysFile uploadFile(MultipartFile file) {
|
|
public SysFile uploadFile(MultipartFile file) {
|
|
SysFile sysFile = uploadFile(file, "", Constant.DIR_SEP, false);
|
|
SysFile sysFile = uploadFile(file, "", Constant.DIR_SEP, false);
|
|
@@ -285,8 +288,69 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public String getFileTextContent(String fileId) {
|
|
|
|
+ SysFile sysFile = baseMapper.selectById(fileId);
|
|
|
|
+ if (null != sysFile && null != sysFile.getTextContent() && StringUtils.isNotEmpty(sysFile.getTextContent())) {
|
|
|
|
+ log.info("文本内容不为空:{}",sysFile.getFileId());
|
|
|
|
+ return sysFile.getTextContent();
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void convertToTxt(List<String> fileIds) {
|
|
|
|
+ List<SysFile> sysFiles = baseMapper.selectList(new QueryWrapper<SysFile>().lambda().in(SysFile::getFileId, fileIds));
|
|
|
|
+ if (!CollectionUtils.isEmpty(sysFiles)) {
|
|
|
|
+ List<ConvertDocToTxt> convertDocToTxts = new ArrayList<>();
|
|
|
|
+ for (SysFile sysFile : sysFiles) {
|
|
|
|
+ // 三个条件均不为空时,才调用算法获取文档转换成txt结果。
|
|
|
|
+ if (null != sysFile && null != sysFile.getObjectKey() && null != sysFile.getIdentifier()) {
|
|
|
|
+ convertDocToTxts.add(ConvertDocToTxt.builder().fileId(sysFile.getFileId()).objectKey(sysFile.getObjectKey()).identifier(sysFile.getIdentifier()).build());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (!CollectionUtils.isEmpty(convertDocToTxts)) {
|
|
|
|
+ Map<String, Object> algMap = new HashMap<>();
|
|
|
|
+ algMap.put("files", convertDocToTxts);
|
|
|
|
+ // 调用算法,获取文档转换为txt的文本内容。
|
|
|
|
+ String convertToTxtResTmp = algKgClient.convertToTxt(JSON.toJSONString(algMap));
|
|
|
|
+ if (null != convertToTxtResTmp && StringUtils.isNotEmpty(convertToTxtResTmp) && CommonUtils.isJsonArray(convertToTxtResTmp)) {
|
|
|
|
+ // 解析算法返回数据。
|
|
|
|
+ try {
|
|
|
|
+ List<ConvertAlgRes> convertAlgRes = JSONArray.parseArray(convertToTxtResTmp, ConvertAlgRes.class);
|
|
|
|
+ if (!CollectionUtils.isEmpty(convertAlgRes)) {
|
|
|
|
+ for (ConvertAlgRes algRes : convertAlgRes) {
|
|
|
|
+ if (null != algRes.getErrorCode() && "0".equals(algRes.getErrorCode())) {
|
|
|
|
+ // 调用算法接口成功,并且解析txt文件成功,将文本内容更新至sysFile的textContent字段中。
|
|
|
|
+ SysFile sysFile = baseMapper.selectById(algRes.getFileId());
|
|
|
|
+ if (null != sysFile) {
|
|
|
|
+ // 更新文本内容。
|
|
|
|
+ sysFile.setTextContent(algRes.getText());
|
|
|
|
+ int updateText = baseMapper.updateById(sysFile);
|
|
|
|
+ log.info("更新文本内容结果updateText:{}", updateText);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ log.info("算法文档转换txt接口 TXT未解析成功:{}", JSON.toJSONString(algRes));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ log.info("算法文档转换txt接口 返回数据为NULL ex convertAlgRes:{}", JSON.toJSONString(convertAlgRes));
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception ex) {
|
|
|
|
+ log.info("算法文档转换txt接口 返回数据异常 NOT JSONArray ex:{}", JSON.toJSONString(convertToTxtResTmp));
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ log.info("算法文档转换txt接口异常 ex convertToTxtResTmp:{}", convertToTxtResTmp);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ log.info("未检索到相关的sysFile。");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 用户编辑的文件上传至minio中。
|
|
* 用户编辑的文件上传至minio中。
|
|
|
|
+ *
|
|
* @param path
|
|
* @param path
|
|
* @param selSysFile
|
|
* @param selSysFile
|
|
* @param response
|
|
* @param response
|
|
@@ -346,7 +410,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
|
|
|
|
|
|
// 更新sysFile值。
|
|
// 更新sysFile值。
|
|
selSysFile.setName(fileName);
|
|
selSysFile.setName(fileName);
|
|
- log.info("fileName:{},key:{}",fileName,selSysFile.getName());
|
|
|
|
|
|
+ log.info("fileName:{},key:{}", fileName, selSysFile.getName());
|
|
// 生成新的key。http://192.168.1.141:8989/cache/files/data/181ba63c8d60452c_2481/output.docx/output.docx?md5=z3NfV5Oj4OhFo6Yo6mk2jw&expires=1692692984&filename=output.docx
|
|
// 生成新的key。http://192.168.1.141:8989/cache/files/data/181ba63c8d60452c_2481/output.docx/output.docx?md5=z3NfV5Oj4OhFo6Yo6mk2jw&expires=1692692984&filename=output.docx
|
|
String objKey = storage.genKeyWithPath(selSysFile.getUserId(), selSysFile.getName(), path);
|
|
String objKey = storage.genKeyWithPath(selSysFile.getUserId(), selSysFile.getName(), path);
|
|
selSysFile.setObjectKey(objKey);
|
|
selSysFile.setObjectKey(objKey);
|
|
@@ -370,9 +434,9 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
|
|
baseMapper.updateById(selSysFile);
|
|
baseMapper.updateById(selSysFile);
|
|
if (file.exists()) {
|
|
if (file.exists()) {
|
|
boolean deleteFlag = deleteFile(file.getPath());
|
|
boolean deleteFlag = deleteFile(file.getPath());
|
|
- log.info("file del path:{},deleteFlag:{}",file.getPath(),deleteFlag);
|
|
|
|
|
|
+ log.info("file del path:{},deleteFlag:{}", file.getPath(), deleteFlag);
|
|
boolean delete = file.delete();
|
|
boolean delete = file.delete();
|
|
- log.info("delete res:{}",delete);
|
|
|
|
|
|
+ log.info("delete res:{}", delete);
|
|
if (delete) {
|
|
if (delete) {
|
|
log.info("本地临时写入的文件已删除:{}", filePath);
|
|
log.info("本地临时写入的文件已删除:{}", filePath);
|
|
}
|
|
}
|