diff --git a/README.md b/README.md
index 30cb70e..fb414bd 100644
--- a/README.md
+++ b/README.md
@@ -2,19 +2,37 @@
宁夏刑侦大模型后台服务
+# Release Notes
+# 发布时间 2025-02-20
+
+## 新特性
+- 增加多模型接入的能力
+
+## 变更
+- 调整原子指标、指标的详情展示样式
+
+## 更新步骤
+- 备份mysql数据库
+- 执行变更sql脚本
+- 替换后端服务包(fu-hsi-service-1.0.0.jar)
+- 替换前端包(dist)
+- 重启后端服务,并查看服务是否正常启动
+- 重启前端服务,并查看服务是否正常启动
+- 验证更新内容
-# Release Notes
# 发布时间 2024-12-26
## 新特性
+
- 页面确保在不同尺寸宽度的屏幕上均能正常显示,并支持用户通过滚动查看完整内容。
- 案件列表添加鼠标悬停效果,悬停行背景颜色加深
- 证据图像上传加载页面时,增加骨架屏效果优化用户体验。
- 模型分析功能按钮增加防抖限制,避免短时间内重复触发导致的性能问题
## 变更
+
- 指标结果-原子指标结果显示“存在/不存在”
- 统计案件状态:未分析、已分析、正在分析
- 证据列表删除分页、指标结果删除分页
@@ -23,43 +41,47 @@
# 发布时间 2024-12-13
## 新特性
+
- 上线dify服务
- 数字民警对话功能改造,支持精确、模糊意图识别,知识检索,历史记录,关联证据文件下载等
- 存量案件同步到dify知识库
- Http请求、响应日志审计功能
## 变更
+
- 下线langChain-Chatchat服务
- 数字民警UI交互改造,独立tab页展示,支持快捷操作功能
## 更新步骤
+
0. 备份fu-hsi-mysql数据库中的所有数据
1. 导入fu-hsi-web:1.1.0镜像 (docker load -i fu-hsi-web.1.1.0.tar.gz)
2. 修改docker-compose.yml配置文件
- - 在services.fu-hsi-web.command配置下添加以下参数
- --dify.server.url=${DIFY_SERVER_URL}
- --dify.dataset.auth=${DIFY_DATASET_AUTH}
- --dify.app.auth=${DIFY_APP_AUTH}
- - 修改services.fu-hsi-web.image为fu-hsi-web:1.1.0
+ - 在services.fu-hsi-web.command配置下添加以下参数
+ --dify.server.url=${DIFY_SERVER_URL}
+ --dify.dataset.auth=${DIFY_DATASET_AUTH}
+ --dify.app.auth=${DIFY_APP_AUTH}
+ - 修改services.fu-hsi-web.image为fu-hsi-web:1.1.0
3. 修改.env配置文件,追加参数(注意:Bearer后面的空格前面需要添加转移符号):
- DIFY_SERVER_URL=http://192.168.10.137/v1
- DIFY_DATASET_AUTH="Bearer\ dataset-g3RctoaHdvXAAQjUVNMuUWCY"
- DIFY_APP_AUTH="Bearer\ app-YrNuU7Puxr3ko8ftUdWtDKhz"
+ DIFY_SERVER_URL=http://192.168.10.137/v1
+ DIFY_DATASET_AUTH="Bearer\ dataset-g3RctoaHdvXAAQjUVNMuUWCY"
+ DIFY_APP_AUTH="Bearer\ app-YrNuU7Puxr3ko8ftUdWtDKhz"
4. 执行变更sql(migration_2.1.sql)
5. 安装dify服务
6. 启动服务(docker compose up -d)
7. 迁移案件数据到dify知识库(调用接口 GET /modelCase/migrateRecordKnowledgeBase)
8. 验证更新内容
-
# 发布时间 2024-12-03
## 变更
+
- 案件图谱优化,支持多种节点颜色样式,引力布局调整,交互体验优化
# 发布时间 2024-11-21
## 变更
+
- 案件图谱展示优化,支持搜索,全屏,节点/关系过滤等
- 原子指标-图谱查询支持在线调试
@@ -84,9 +106,9 @@
1. 加载镜像(如果docker可以访问外网直接下载,否则需要先上传到服务器)
- docker load -i xxl-job-admin:2.4.1.tar.gz
2. 修改.env中的xxl-job中对应的配置
- - XXl_JOB_PASSWORD=sT7SSTiX8s
- - XXL_JOB_PORT_HTTP=8081
- - SPRING_DATASOURCE_URL=jdbc:mysql://fu-hsi-mysql:3306/xxl-job?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+ - XXl_JOB_PASSWORD=sT7SSTiX8s
+ - XXL_JOB_PORT_HTTP=8081
+ - SPRING_DATASOURCE_URL=jdbc:mysql://fu-hsi-mysql:3306/xxl-job?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
3. 替换docker-compose-base.yml、docker-compose.yml配置文件
4. 备份mysql数据库!!!!
5. 执行数据初始化脚本(在文档末尾处)
@@ -95,45 +117,53 @@
8. 调用案件证据归档刷新接口完成历史案件证据归档整理(get ip:port/caseEvidence/fresh)、初始化指标计算规则数据
9. 验证更新内容
-
# 发布时间 2024-09-20
# 变更
+
- 修复编辑ocr识别证据异常问题
- 优化前端等待展示样式
# 安装包
+
- /data/archives/fu-hsi/20240920/fu-hsi-service-1.0.0.tar.gz
- /data/archives/fu-hsi/20240920/dist
# 发布时间 2024-09-19
## 新特性
+
- 增加笔录和证据上传OCR识别功能
- 首页数据统计接口
- 日志输出规范配置
## 变更
+
- 案件查询列表查询条件变更
- 增加过滤条件已分析、未分析、全部
- 增加按照分数排序的规则
+
## 优化
+
- 数据库提示词优化
## 安装步骤
+
1. 修改.env 和docker-compose-base.yml 文件
2. 加载镜像 paddleocr:v2.1
3. 备份mysql所有数据文件
4. 重新启动服务 docker-compose up -d
# 安装包
+
- /data/archives/fu-hsi/20240919/fu-hsi-service-1.0.0.tar.gz
- /data/archives/fu-hsi/20240919/dist
- /data/archives/fu-hsi/20240919/paddleocr:v2.1.tar.gz
-
# 发布时间 2024-09-12
+
# 变更记录
+
- 调整提示词后,笔录列表增加“笔录提取”功能,并显示更新标签
- 指标结果各项标题显示总分
- 首页统计项(7项),案件数量、行为数、月新增、较上月、模型分析<70分数量、取证不完全占比、自动投案占比
@@ -141,34 +171,44 @@
- 经侦案件列表根据模型分析状态进行分类,分别在“全部”、“已分析”、“未分析”三个标签下展示对应案件。
# 安装包
+
- /data/archives/fu-hsi/20240912/fu-hsi-service-1.0.0.tar.gz
- /data/archives/fu-hsi/20240912/dist
# 发布时间 2024-09-05
+
# 变更记录
+
- 修复案件证据分页失效问题
- 修复经侦模型指标数据只展示部分数据问题
# 安装包
+
- /data/archives/fu-hsi/20240905/dist
# 发布时间 2024-09-03
+
# 变更记录
+
- 修复三元组提取进度问题不准确的问题
- 解除首页页面限制
- 优化原子指标提示
- 解除模型分析需要有数据变动校验限制
# 安装包
+
- /data/archives/fu-hsi/20240903/fu-hsi-service-1.0.0.tar.gz
- /data/archives/fu-hsi/20240903/dist
-
# 发布时间 2024-08-29
+
# 变更记录
- - 案件笔录列表调整,仅展示子列表
- - 字典值配置生效
+
+- 案件笔录列表调整,仅展示子列表
+- 字典值配置生效
# 安装包
+
- /data/archives/fu-hsi/20240828/fu-hsi-service-1.0.0.tar.gz
-- /data/archives/fu-hsi/20240828/dist
\ No newline at end of file
+- /data/archives/fu-hsi/20240828/dist
+
diff --git a/pom.xml b/pom.xml
index 198ec07..184eed4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -199,6 +199,23 @@
itext-asian
5.2.0
+
+ org.apache.poi
+ poi
+ 4.1.2
+
+
+
+ org.apache.poi
+ poi-ooxml
+ 4.1.2
+
+
+ org.apache.poi
+ poi-scratchpad
+ 4.1.2
+
+
diff --git a/src/main/java/com/supervision/utils/WordReadUtil.java b/src/main/java/com/supervision/utils/WordReadUtil.java
index 15a5aea..ed3dd10 100644
--- a/src/main/java/com/supervision/utils/WordReadUtil.java
+++ b/src/main/java/com/supervision/utils/WordReadUtil.java
@@ -1,14 +1,15 @@
package com.supervision.utils;
-import com.supervision.minio.domain.MinioFile;
import com.supervision.minio.service.MinioService;
import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hwpf.HWPFDocument;
+import org.apache.poi.hwpf.extractor.WordExtractor;
+import org.apache.poi.poifs.filesystem.FileMagic;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.springframework.web.multipart.MultipartFile;
-import java.io.FileInputStream;
-import java.io.InputStream;
+import java.io.*;
import java.util.List;
@Slf4j
@@ -57,20 +58,43 @@ public class WordReadUtil {
}
public static String readWord(InputStream inputStream) {
- StringBuilder stringBuilder = new StringBuilder();
- try (inputStream) {
- // 创建 XWPFDocument 对象
- XWPFDocument document = new XWPFDocument(inputStream);
- // 获取所有段落
- List paragraphs = document.getParagraphs();
- // 遍历所有段落并打印文本
- for (XWPFParagraph paragraph : paragraphs) {
- stringBuilder.append(paragraph.getText()).append("\n");
+ byte[] fileBytes;
+ try {
+ fileBytes = inputStream.readAllBytes();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileBytes);
+ try (InputStream is = FileMagic.prepareToCheckMagic(byteArrayInputStream)) {
+ FileMagic fm = FileMagic.valueOf(is);
+ // 判断文件类型 docx
+ if (FileMagic.OOXML == fm) {
+ try (byteArrayInputStream) {
+ XWPFDocument document = new XWPFDocument(byteArrayInputStream);
+ List paragraphs = document.getParagraphs();
+ StringBuilder stringBuilder = new StringBuilder();
+ for (XWPFParagraph paragraph : paragraphs) {
+ stringBuilder.append(paragraph.getText()).append("\n");
+ }
+ return stringBuilder.toString();
+ } catch (Exception e) {
+ throw new RuntimeException("获取笔录内容失败", e);
+ }
+ } else if (FileMagic.OLE2 == fm) {
+ // 判断文件类型 doc
+ try (byteArrayInputStream) {
+ HWPFDocument document = new HWPFDocument(byteArrayInputStream);
+ WordExtractor extractor = new WordExtractor(document);
+ return extractor.getText();
+ } catch (Exception e) {
+ throw new RuntimeException("获取笔录内容失败", e);
+ }
+ } else {
+ throw new RuntimeException("不支持的文件类型");
}
- } catch (Exception e) {
- log.error("获取笔录内容失败",e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
}
- return stringBuilder.toString();
}
public static String readWordInMinio(MinioService minioService, String fileId) {