Compare commits

..

13 Commits

Author SHA1 Message Date
xueqingkun 923063dcf2 1. 优化代码
xueqingkun 53efc04e71 1. 优化代码
xueqingkun a8c9e84cbd 1. 修复新增案件知识图谱保存不进去问题
xueqingkun b759955f5b 1. 修复新增案件创建知识库报错问题
xueqingkun c19fc37e35 1. 添加removeCaseDataSet
yaxin 37ed83a12a 任务、案件任务状态管理,code format
xueqingkun a5611ec313 1. 添加单个提示词分析笔录功能
xueqingkun 55076f376b 1. 添加单个提示词分析笔录功能
yaxin 90b4e1f792 方法提取
异常处理
longbao 0e7c6e6b4d [事务管理器]
primary mysql dataSourceTransactionManager
longbao 95b5736221 [长文本方案]
longbao 00f85c8dc9 代码生成器
longbao 51dc2cb9d7 本地测试

@ -2,37 +2,19 @@
宁夏刑侦大模型后台服务
# Release Notes
# 发布时间 2025-02-20
## 新特性
- 增加多模型接入的能力
## 变更
- 调整原子指标、指标的详情展示样式
## 更新步骤
- 备份mysql数据库、前后端包
- 执行变更sql脚本
- 替换后端服务包(fu-hsi-service-1.0.0.jar)
- 替换前端包(dist)
- 重启后端服务,并查看服务是否正常启动
- 重启前端服务,并查看服务是否正常启动
- 验证更新内容
# Release Notes
# 发布时间 2024-12-26
## 新特性
- 页面确保在不同尺寸宽度的屏幕上均能正常显示,并支持用户通过滚动查看完整内容。
- 案件列表添加鼠标悬停效果,悬停行背景颜色加深
- 证据图像上传加载页面时,增加骨架屏效果优化用户体验。
- 模型分析功能按钮增加防抖限制,避免短时间内重复触发导致的性能问题
## 变更
- 指标结果-原子指标结果显示“存在/不存在”
- 统计案件状态:未分析、已分析、正在分析
- 证据列表删除分页、指标结果删除分页
@ -41,47 +23,43 @@
# 发布时间 2024-12-13
## 新特性
- 上线dify服务
- 数字民警对话功能改造,支持精确、模糊意图识别,知识检索,历史记录,关联证据文件下载等
- 存量案件同步到dify知识库
- Http请求、响应日志审计功能
## 变更
- 下线langChain-Chatchat服务
- 数字民警UI交互改造独立tab页展示支持快捷操作功能
## 更新步骤
0. 备份fu-hsi-mysql数据库中的所有数据
1. 导入fu-hsi-web1.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
## 变更
- 案件图谱展示优化,支持搜索,全屏,节点/关系过滤等
- 原子指标-图谱查询支持在线调试
@ -106,9 +84,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. 执行数据初始化脚本(在文档末尾处)
@ -117,53 +95,45 @@
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
# 发布时间 2024-09-12
# 变更记录
- 调整提示词后,笔录列表增加“笔录提取”功能,并显示更新标签
- 指标结果各项标题显示总分
- 首页统计项7项案件数量、行为数、月新增、较上月、模型分析<70
@ -171,44 +141,34 @@
- 经侦案件列表根据模型分析状态进行分类,分别在“全部”、“已分析”、“未分析”三个标签下展示对应案件。
# 安装包
- /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
# 发布时间 2024-08-29
# 变更记录
- 案件笔录列表调整,仅展示子列表
- 字典值配置生效
- 案件笔录列表调整,仅展示子列表
- 字典值配置生效
# 安装包
- /data/archives/fu-hsi/20240828/fu-hsi-service-1.0.0.tar.gz
- /data/archives/fu-hsi/20240828/dist
- /data/archives/fu-hsi/20240828/dist

@ -1,164 +0,0 @@
INSERT INTO `nx_llm`.`com_dictionary` (`id`, `name`, `code`, `pid`, `type`, `status`, `note`, `priority`, `creator`,
`update_time`, `create_time`, `updater`, `data_status`, `create_user_id`,
`update_user_id`)
VALUES (89, '任务状态', NULL, 0, 'task_status', '1', NULL, 0, NULL, NULL, CURRENT_TIMESTAMP, NULL, '1', NULL, NULL);
INSERT INTO `nx_llm`.`com_dictionary` (`id`, `name`, `code`, `pid`, `type`, `status`, `note`, `priority`, `creator`,
`update_time`, `create_time`, `updater`, `data_status`, `create_user_id`,
`update_user_id`)
VALUES (90, '待处理', '0', 89, 'task_status', '1', NULL, 0, NULL, NULL, CURRENT_TIMESTAMP, NULL, '1', NULL, NULL);
INSERT INTO `nx_llm`.`com_dictionary` (`id`, `name`, `code`, `pid`, `type`, `status`, `note`, `priority`, `creator`,
`update_time`, `create_time`, `updater`, `data_status`, `create_user_id`,
`update_user_id`)
VALUES (91, '处理中', '1', 89, 'task_status', '1', NULL, 0, NULL, NULL, CURRENT_TIMESTAMP, NULL, '1', NULL, NULL);
INSERT INTO `nx_llm`.`com_dictionary` (`id`, `name`, `code`, `pid`, `type`, `status`, `note`, `priority`, `creator`,
`update_time`, `create_time`, `updater`, `data_status`, `create_user_id`,
`update_user_id`)
VALUES (92, '取消中', '2', 89, 'task_status', '1', NULL, 0, NULL, NULL, CURRENT_TIMESTAMP, NULL, '1', NULL, NULL);
INSERT INTO `nx_llm`.`com_dictionary` (`id`, `name`, `code`, `pid`, `type`, `status`, `note`, `priority`, `creator`,
`update_time`, `create_time`, `updater`, `data_status`, `create_user_id`,
`update_user_id`)
VALUES (93, '已取消', '3', 89, 'task_status', '1', NULL, 0, NULL, NULL, CURRENT_TIMESTAMP, NULL, '1', NULL, NULL);
INSERT INTO `nx_llm`.`com_dictionary` (`id`, `name`, `code`, `pid`, `type`, `status`, `note`, `priority`, `creator`,
`update_time`, `create_time`, `updater`, `data_status`, `create_user_id`,
`update_user_id`)
VALUES (94, '处理成功', '4', 89, 'task_status', '1', NULL, 0, NULL, NULL, CURRENT_TIMESTAMP, NULL, '1', NULL, NULL);
INSERT INTO `nx_llm`.`com_dictionary` (`id`, `name`, `code`, `pid`, `type`, `status`, `note`, `priority`, `creator`,
`update_time`, `create_time`, `updater`, `data_status`, `create_user_id`,
`update_user_id`)
VALUES (95, '处理失败', '5', 89, 'task_status', '1', NULL, 0, NULL, NULL, CURRENT_TIMESTAMP, NULL, '1', NULL, NULL);
-- 案件分析状态字典
INSERT INTO nx_llm.com_dictionary (id, name, code, pid, type, status, note, priority, creator, update_time, create_time, updater, data_status, create_user_id, update_user_id) VALUES (97, '分析状态', null, 0, 'case_analysis_status', '1', null, 0, null, null, '2024-12-31 14:26:52', null, '1', null, null);
INSERT INTO nx_llm.com_dictionary (id, name, code, pid, type, status, note, priority, creator, update_time, create_time, updater, data_status, create_user_id, update_user_id) VALUES (98, '未分析', '0', 97, 'case_analysis_status', '1', null, 0, null, null, '2024-12-31 14:26:52', null, '1', null, null);
INSERT INTO nx_llm.com_dictionary (id, name, code, pid, type, status, note, priority, creator, update_time, create_time, updater, data_status, create_user_id, update_user_id) VALUES (99, '正在分析', '1', 97, 'case_analysis_status', '1', null, 0, null, null, '2024-12-31 14:26:52', null, '1', null, null);
INSERT INTO nx_llm.com_dictionary (id, name, code, pid, type, status, note, priority, creator, update_time, create_time, updater, data_status, create_user_id, update_user_id) VALUES (100, '分析成功', '2', 97, 'case_analysis_status', '1', null, 0, null, null, '2024-12-31 14:26:52', null, '1', null, null);
INSERT INTO nx_llm.com_dictionary (id, name, code, pid, type, status, note, priority, creator, update_time, create_time, updater, data_status, create_user_id, update_user_id) VALUES (101, '分析失败', '3', 97, 'case_analysis_status', '1', null, 0, null, null, '2024-12-31 14:26:52', null, '1', null, null);
-- 添加运营管理菜单
INSERT INTO nx_llm.system_menu (id, label, label_code, label_type, parent_id, create_user_id, create_time, update_user_id, update_time) VALUES ('16', '运营管理', 'p_operationManagement', 0, null, null, '2025-01-02 14:29:10', null, '2025-01-02 14:29:10');
INSERT INTO nx_llm.system_menu (id, label, label_code, label_type, parent_id, create_user_id, create_time, update_user_id, update_time) VALUES ('17', '任务列表', 'p_taskList', 0, '16', null, '2025-01-02 14:29:47', null, '2025-01-02 14:29:47');
INSERT INTO nx_llm.system_menu (id, label, label_code, label_type, parent_id, create_user_id, create_time, update_user_id, update_time) VALUES ('18', '案件批量处理', 'p_handleCases', 0, '16', null, '2025-01-02 16:13:47', null, '2025-01-02 16:13:47');
-- 给管理员角色添加权限
INSERT INTO nx_llm.system_role_menu_relation (id, role_id, menu_id, create_user_id, create_time, update_user_id, update_time) VALUES ('1830865690704818280', '1820688378166366209', '16', null, '2025-01-02 15:09:31', null, '2025-01-02 15:09:31');
INSERT INTO nx_llm.system_role_menu_relation (id, role_id, menu_id, create_user_id, create_time, update_user_id, update_time) VALUES ('1830865690704818281', '1820688378166366209', '17', null, '2025-01-02 15:09:31', null, '2025-01-02 15:09:31');
INSERT INTO nx_llm.system_role_menu_relation (id, role_id, menu_id, create_user_id, create_time, update_user_id, update_time) VALUES ('1830865690704818282', '1820688378166366209', '18', null, '2024-09-03 15:09:31', null, '2024-09-03 15:09:31');
CREATE TABLE `task_record`
(
`id` varchar(64) NOT NULL,
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`prompt_id` varchar(64) DEFAULT NULL,
`case_id` text COMMENT '案件ID英文逗号分隔',
`record_id` text COMMENT '笔录ID英文逗号分隔',
`evidence_id` text COMMENT '证据ID英文逗号分隔',
`type` varchar(1) DEFAULT NULL COMMENT '0全部案件 1部分案件 2部分笔录 3部分证据',
`status` varchar(1) DEFAULT '0' COMMENT '0待处理 1处理中 2取消中 3已取消 4处理成功 5处理失败',
`cancel_time` datetime DEFAULT NULL COMMENT '取消时间',
`create_user_id` varchar(64) DEFAULT NULL COMMENT '创建人ID',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_user_id` varchar(64) DEFAULT NULL COMMENT '更新人ID',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE `task_case_record`
(
`id` varchar(64) NOT NULL,
`task_record_id` varchar(64) DEFAULT NULL COMMENT '任务ID',
`case_id` varchar(64) DEFAULT NULL COMMENT '案件ID',
`waiting_id` text COMMENT '等待处理的ID逗号分隔',
`processed_id` text COMMENT '处理完成的ID逗号分隔',
`exception_id` text COMMENT '异常ID逗号分隔',
`status` varchar(1) DEFAULT NULL COMMENT '0待处理 1处理中 2取消中 3已取消 4处理成功 5处理失败',
`create_user_id` varchar(64) DEFAULT NULL COMMENT '创建人ID',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_user_id` varchar(64) DEFAULT NULL COMMENT '更新人ID',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
-- 创建索引
create index model_atomic_result_case_id_index
on model_atomic_result (case_id);
-- 修改属性表字段长度
alter table attribute_mmht
modify part_a varchar(1024) null comment '甲方';
alter table attribute_mmht
modify part_b varchar(1024) null comment '乙方';
alter table attribute_mmht
modify part_c varchar(1024) null comment '乙方';
alter table attribute_mmht
modify qualifications varchar(1024) null comment '资质要求';
alter table attribute_mmht
modify subject_matter varchar(1024) null comment '合同标的物';
alter table attribute_mmht
modify number varchar(1024) null comment '数量';
alter table attribute_mmht
modify amount_money varchar(1024) null comment '金额';
alter table attribute_mmht
modify payment_method varchar(1024) null comment '支付方式';
alter table attribute_mmht
modify payment_time varchar(1024) null comment '支付时间';
alter table attribute_mmht
modify performance_period varchar(1024) null comment '履行期限';
alter table attribute_mmht
modify place_performance varchar(1024) null comment '履行地点';
alter table attribute_mmht
modify signing_date varchar(1024) null comment '签订日期';
alter table attribute_gwzs
modify project_name varchar(1024) null comment '项目名称';
alter table attribute_gwzs
modify project_status varchar(1024) null comment '项目状态';
alter table attribute_gwzs
modify publishing_unit varchar(1024) null comment '发布单位';
alter table attribute_gwzs
modify conclusion varchar(1024) null comment '结论';
alter table attribute_gwzs
modify publication_time varchar(1024) null comment '发文时间';
alter table attribute_xmht
modify project_name varchar(1024) null comment '项目名称';
alter table attribute_xmht
modify part_a varchar(1024) null comment '甲方';
alter table attribute_xmht
modify part_b varchar(1024) null comment '乙方';
alter table attribute_xmht
modify scope varchar(1024) null comment '项目范围';
alter table attribute_xmht
modify project_start_time varchar(1024) null comment '项目开始时间';
alter table attribute_xmht
modify project_end_time varchar(1024) null comment '项目结束时间';
alter table attribute_xmht
modify signing_time varchar(1024) null comment '签订日期';
alter table attribute_xmht
modify project_status varchar(1024) null comment '项目状态';
alter table attribute_yhls
modify account_information varchar(1024) null comment '账户信息';
alter table attribute_yhls
modify other_account_information varchar(1024) null comment '对方账户信息';
alter table attribute_yhls
modify amount varchar(1024) null comment '金额';
alter table attribute_yhls
modify trading_time varchar(1024) null comment '交易时间';
alter table attribute_yhls
modify revenue_expenditure_identification varchar(1024) null comment '收入支出标识';
alter table attribute_yhls
modify abstract_info varchar(1024) null comment '摘要';
alter table attribute_zfpz
modify payer_name varchar(1024) null comment '付款方名称';
alter table attribute_zfpz
modify payee_name varchar(1024) null comment '收款方名称';
alter table attribute_zfpz
modify payment_time varchar(1024) null comment '支付时间';
alter table attribute_zfpz
modify amount varchar(1024) null comment '金额';
alter table attribute_zfpz
modify describe_info varchar(1024) null comment '说明';

@ -1,4 +0,0 @@
alter table task_record
add finish_time datetime null comment '结束时间' after cancel_time;
alter table task_case_record
add prompt_id varchar(64) null comment '提示词ID' after task_record_id;

@ -1,7 +0,0 @@
alter table model_atomic_result
modify record_split_id text null comment '笔录片段id';
alter table note_record_split
add processed_question text null comment '处理后的回答' after answer;
alter table note_record_split
add processed_answer text null comment '处理后的回答' after processed_question;

@ -1,20 +0,0 @@
create table scoring_model_info
(
id varchar(64) not null comment '主键',
model_name varchar(128) null comment '模型名',
model_desc varchar(2048) null comment '模型说明',
scoring_rules varchar(2048) null comment '模型设置及赋分规则',
create_user_id varchar(64) null comment '创建人id',
create_time datetime null comment '创建时间',
update_user_id varchar(64) null comment '更新人',
update_time datetime null comment '更新时间'
)
comment '赋分模型信息表' collate = utf8mb4_bin;
-- 初始化数据
INSERT INTO scoring_model_info (id, model_name, model_desc, scoring_rules, create_user_id, create_time, update_user_id, update_time) VALUES ('1', '工程类合同诈骗案规则', '针对工程类合同诈骗案高发态势以及办理合同诈骗案存在的诸多问题和困难,宁夏总队在梳理近年来侦办的百余起合同诈骗案基础上,分析了有罪、无罪判决、绝对不起诉、存疑不起诉案件的取证情况、证据证明力、断案依据等,搭建了宁夏工程类合同诈骗案取证智能分析模型。', '模型采取赋分制的方法来综合判定案件证据充分与否分为三个模块第一模块是共性证据指标赋30分第二模块是有罪证据指标赋70分第三模块是无罪证据指标赋70分。采取“共性指标+入罪指标”或“共性指标+出罪指标”的计算方式评定综合得分。综合得分70分以上判定证据较充分司法机关对案件形成一致认定意见的概率较大综合得分50分至70分判定案件事实不清、证据不足司法机关认定意见不一致的概率较大综合得分50分以下判定证据不充分司法机关会作出绝对不起诉或存疑不起诉的决定。', null, current_timestamp(), null, null);
alter table model_index
modify case_type varchar(64) null comment '案件类型';
-- 修改菜单
UPDATE system_menu SET label = '赋分模型', label_code = 'p_scoringModele' WHERE id = '7';

@ -65,6 +65,24 @@
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.9</version>
</dependency>
<!-- 添加模板引擎thymeleaf 还有freemarker都是模板引擎 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--mybatis-plus 代码生成器的模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
@ -199,23 +217,6 @@
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>
</dependencies>
@ -248,6 +249,13 @@
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
</plugins>
</build>
<repositories>

@ -3,16 +3,15 @@ package com.supervision.common.constant;
public class TaskRecordConstants {
// 任务名称前缀
public static final String TASK_NAME_PREFIX = "任务";
public static final String TASK_NAME_PREFIX_TYPE_ALL_CASE = "全部案件";
public static final String TASK_NAME_PREFIX_TYPE_SPECIFIED_CASE = "指定案件";
public static final String TASK_NAME_PREFIX_TYPE_SPECIFIED_RECORD = "指定笔录";
public static final String TASK_NAME_PREFIX_TYPE_SPECIFIED_EVIDENCE = "指定证据";
public static final String TASK_NAME_PREFIX_TYPE_ALL_CASE = "AllCase";
public static final String TASK_NAME_PREFIX_TYPE_SPECIFIED_CASE = "CasePart";
public static final String TASK_NAME_PREFIX_TYPE_SPECIFIED_RECORD = "CaseRecord";
public static final String TASK_NAME_PREFIX_TYPE_SPECIFIED_EVIDENCE = "CaseEvidence";
// 任务类型
public static final String TASK_TYPE_ALL_CASE = "0";
public static final String TASK_TYPE_SPECIFIED_CASE = "1";
public static final String TASK_TYPE_SPECIFIED_RECORD = "2";
public static final String TASK_TYPE_SPECIFIED_EVIDENCE = "3";
public static final String TASK_TYPE_ONE_CLICK = "4";
// 任务状态
public static final String TASK_STATUS_WAITING = "0";
public static final String TASK_STATUS_PROCESSING = "1";

@ -5,5 +5,5 @@ public class XxlJobConstants {
public static final String URL_JOB_INFO_PAGE_LIST = "/jobinfo/pageList";
public static final String URL_JOB_INFO_TRIGGER = "/jobinfo/trigger";
public static final String TASK_NAME_PROMPT_EXTRACT_TASK= "promptExtractTask";
public static final String TASK_NAME_EVIDENCE_ANALYSIS = "evidenceAnalysis";
public static final String TASK_NAME_EVIDENCE_ANALYSIS = "extractEvidenceByTask";
}

@ -1,16 +1,14 @@
package com.supervision.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.supervision.police.dto.user.UserInfoDTO;
import com.supervision.utils.UserUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import java.time.LocalDateTime;
import java.util.Date;
/**
* @author Ray
*/
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
public MyMetaObjectHandler() {
}
@ -19,30 +17,11 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
if (null == this.getFieldValByName("createUserId", metaObject)){
// 只有为空才会继续创建
try {
UserInfoDTO user = UserUtil.getUser();
this.setFieldValByName("createUserId", user.getId(), metaObject);
}catch (Exception e){
log.info("获取用户信息失败");
}
}
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
if (null == this.getFieldValByName("updateUserId", metaObject)){
// 只有为空才会继续创建
try {
UserInfoDTO user = UserUtil.getUser();
this.setFieldValByName("updateUserId", user.getId(), metaObject);
}catch (Exception e){
log.info("获取用户信息失败");
}
}
}
}

@ -2,6 +2,7 @@ package com.supervision.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@ -19,6 +20,7 @@ public class TransactionManagerConfig {
* @param dataSource
* @return
*/
@Primary
@Bean("dataSourceTransactionManager")
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();

@ -0,0 +1,96 @@
package com.supervision.constant;
import lombok.Getter;
/**
* @Authorlongbao
* @Date2024/12/10 13:37
* @Description:
*/
@Getter
public enum PromptsEnum {
LONG_TEXT_SINGLE_SENTENCE_SUMMARY("长文本单句总结提示词", """
: 2
:
: (1)
---
:
1 2
:{"result": {"id": "1","llmGenA":"冒充"},{"id": "2","llmGenA":"欺诈"}}
---
:
1.
2. 2
3.
4.
5. idllmGenA
6.
7.
---
:
{noteRecordSplitList}
---
json,:{"result": [{"id": "","llmGenA":""}]}
"""),
LONG_TEXT_SINGLE_STATEMENT_WITH_SEMANTIC_JUDGMENT_PROMPT_WORD("长文本单语句同语义判断提示词", """
:
:
:
---
:
{"result":false}
---
1.
3.
4.
5. truefalse
6. 2
---
:
{encCombinedSentence}
{currentSentence}
---
json:
{"result":xxxx}
"""),
LONG_TEXT_TRIPLE_INFO("长文本三元组信息提取", """
:
1.
2.
3.
4.
5. 使
6.
{requirement}
"{headEntityType}";"{tailEntityType}","{relation}"
json:{"result":[]}
---
:
{"result":[{"headEntity": {"type": "{headEntityType}","name":"小明"},"relation": "{relation}","tailEntity": {"type": "{tailEntityType}","name": "光缆承揽合同"}}]}
---
{contentChuckSummary}
---
json:
{"result":[{"headEntity": {"type": "{headEntityType}","name":"提取到的头实体内容1"},"relation": "{relation}","tailEntity": {"type": "{tailEntityType}","name": "提取到的尾实体内容1"}}]}
""");
private String description;
private String content;
PromptsEnum(String description, String content) {
this.description = description;
this.content = content;
}
}

@ -0,0 +1,27 @@
package com.supervision.handler;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.List;
public class StringListTypeHandler extends JacksonTypeHandler {
private static final ObjectMapper objectMapper = new ObjectMapper();
public StringListTypeHandler(Class<Object> type) {
super(type);
}
@Override
protected Object parse(String json) {
try {
return objectMapper.readValue(json, new TypeReference<List<String>>() {});
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

@ -2,18 +2,18 @@ package com.supervision.job;
import com.alibaba.fastjson.JSON;
import com.supervision.common.constant.XxlJobConstants;
import com.supervision.constant.CaseAnalysisStatusEnum;
import com.supervision.police.domain.ModelCase;
import com.supervision.police.domain.NotePrompt;
import com.supervision.police.domain.TaskCaseRecord;
import com.supervision.police.domain.TaskRecord;
import com.supervision.police.service.*;
import com.supervision.police.service.CaseEvidenceService;
import com.supervision.police.service.NotePromptService;
import com.supervision.police.service.TaskCaseRecordService;
import com.supervision.police.service.TaskRecordService;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import java.util.List;
import java.util.Map;
@ -21,7 +21,6 @@ import java.util.Map;
import static com.supervision.common.constant.NotePromptConstants.TYPE_GRAPH_REASONING;
import static com.supervision.common.constant.NotePromptConstants.TYPE_STRUCTURAL_REASONING;
import static com.supervision.common.constant.TaskRecordConstants.*;
import static com.supervision.common.constant.XxlJobConstants.TASK_NAME_PROMPT_EXTRACT_TASK;
@Slf4j
@Component
@ -36,8 +35,6 @@ public class XxlJobTask {
private final NotePromptService notePromptService;
private final ModelCaseService modelCaseService;
/**
*
*/
@ -57,19 +54,17 @@ public class XxlJobTask {
/**
*
*/
@XxlJob(TASK_NAME_PROMPT_EXTRACT_TASK)
@XxlJob(XxlJobConstants.TASK_NAME_PROMPT_EXTRACT_TASK)
public void promptExtractTask() {
String jobParam = XxlJobHelper.getJobParam();
log.info("【提取任务】任务开始。参数: {}", jobParam);
StopWatch stopWatch = new StopWatch(TASK_NAME_PROMPT_EXTRACT_TASK + " stopwatch");
stopWatch.start("Data preparation and task status check");
Map<String, String> map = JSON.parseObject(XxlJobHelper.getJobParam(), Map.class);
String taskId = map.get("taskId");
String caseId = map.get("caseId");
String promptId = map.get("promptId");
String executeId = map.get("executeId");
try {
NotePrompt prompt = notePromptService.getBaseMapper().selectById(promptId);
String taskId = map.get("taskId");
String caseId = map.get("caseId");
String promptId = map.get("promptId");
String executeId = map.get("executeId");
NotePrompt prompt = notePromptService.getById(promptId);
boolean executable = true;
TaskRecord taskRecord = taskRecordService.getById(taskId);
switch (taskRecord.getStatus()) {
@ -96,18 +91,13 @@ public class XxlJobTask {
default:
break;
}
stopWatch.stop();
if (executable) {
stopWatch.start("Model case analysis status check");
this.modelCaseAnalyzingStatusCheck(caseId);
TaskCaseRecord taskCaseRecord = taskCaseRecordService.lambdaQuery().eq(TaskCaseRecord::getCaseId, caseId).eq(TaskCaseRecord::getTaskRecordId, taskId).eq(TaskCaseRecord::getPromptId, promptId).one();
TaskCaseRecord taskCaseRecord = taskCaseRecordService.lambdaQuery().eq(TaskCaseRecord::getCaseId, caseId).eq(TaskCaseRecord::getTaskRecordId, taskId).one();
if (TASK_STATUS_WAITING.equals(taskCaseRecord.getStatus())) {
log.info("任务状态为等待中任务状态更新为处理中任务案件ID: 【{}】", taskCaseRecord.getId());
taskCaseRecord.setStatus(TASK_STATUS_PROCESSING);
taskCaseRecordService.updateById(taskCaseRecord);
}
stopWatch.stop();
stopWatch.start("Extract task execution");
switch (prompt.getType()) {
case TYPE_GRAPH_REASONING:
log.info("【图推理】任务开始。任务ID: 【{}】", taskId);
@ -121,34 +111,14 @@ public class XxlJobTask {
log.error("未知的任务类型");
break;
}
stopWatch.stop();
stopWatch.start("Complete task");
taskRecordService.completeTask(taskId, map.get("executeId"),promptId, true);
stopWatch.stop();
taskRecordService.completeTask(taskId, map.get("executeId"), true);
log.info("【提取任务】任务结束。任务ID: 【{}】", taskId);
}
} catch (Exception e) {
stopWatch.stop();
log.error("任务执行失败Task ID:{}", taskId, e);
taskRecordService.completeTask(map.get("taskId"), map.get("executeId"), promptId,false);
log.error("任务执行失败", e);
taskRecordService.completeTask(map.get("taskId"), map.get("executeId"), false);
} finally {
log.info("【提取任务】任务结束。任务ID: 【{}】。耗时:{}", taskId, stopWatch.prettyPrint());
}
}
/**
*
* 552
*/
private void modelCaseAnalyzingStatusCheck(String caseId) throws InterruptedException {
ModelCase modelCase = modelCaseService.getById(caseId);
int count = 0;
while (CaseAnalysisStatusEnum.ANALYZING.getCode() == modelCase.getCaseAnalysisStatus() && count < 24) {
Thread.sleep(5000);
modelCase = modelCaseService.getById(caseId);
count++;
if (count == 24) {
log.error("案件模型分析状态检查超时默认继续执行提取任务。案件ID: 【{}】", caseId);
}
log.info("【提取任务】任务结束。");
}
}

@ -70,6 +70,4 @@ public interface Neo4jService {
List<Record> executeCypher(String cypher, Map<String, Object> parameters);
TripleInfo saveTripleInfo(TripleInfo tripleInfo);
void deleteTripleInfo(TripleInfo tripleInfo);
}

@ -1,7 +1,6 @@
package com.supervision.neo4j.service.impl;
import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
@ -100,7 +99,6 @@ public class Neo4jServiceImpl implements Neo4jService {
run.next();
}
} catch (Exception e) {
//如果报错,说明存在未删除的关系,是合理的
log.error(e.getMessage(), e);
}
}
@ -110,14 +108,13 @@ public class Neo4jServiceImpl implements Neo4jService {
try {
Session session = driver.session();
StringBuilder cql = new StringBuilder();
cql.append("MATCH (n) WHERE id(n) = ").append(id).append(" AND NOT (n)--() DELETE n");
cql.append("MATCH (n) WHERE n.id = ").append(id).append(" AND NOT (n)--() DELETE n");
log.info(cql.toString());
Result run = session.run(cql.toString());
while (run.hasNext()) {
run.next();
}
} catch (Exception e) {
//如果报错,说明存在未删除的关系,是合理的
log.error(e.getMessage(), e);
}
}
@ -670,34 +667,4 @@ public class Neo4jServiceImpl implements Neo4jService {
tripleInfo.setEndNodeGraphId(endNode.getId());
return tripleInfo;
}
@Override
public void deleteTripleInfo(TripleInfo tripleInfo) {
if (ObjectUtil.isNotEmpty(tripleInfo.getRelGraphId())) {
// 先移除关系
try {
this.deleteRel(tripleInfo.getRelGraphId());
} catch (Exception e) {
log.error("删除关系失败:{}", tripleInfo.getRelation(), e);
return;
}
}
if (ObjectUtil.isNotEmpty(tripleInfo.getEndNodeGraphId())) {
// 再移除尾节点
try {
this.deleteNoRelationNode(tripleInfo.getEndNodeGraphId());
} catch (Exception e) {
log.error("删除尾节点失败:{}", tripleInfo.getEndNode(), e);
return;
}
}
if (ObjectUtil.isNotEmpty(tripleInfo.getStartNodeGraphId())) {
// 尝试删除头节点(只有头节点不存在任何关系的时候才进行删除)
try {
this.deleteNoRelationNode(tripleInfo.getStartNodeGraphId());
} catch (Exception e) {
log.error("删除头节点失败:{}", tripleInfo.getStartNode(), e);
}
}
}
}

@ -0,0 +1,32 @@
package com.supervision.police.controller;
import com.supervision.common.domain.R;
import com.supervision.police.service.LongTextService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Authorlongbao
* @Date2024/12/10 10:20
* @Description: QA
*/
@Slf4j
@RestController
@RequestMapping("/answerLongText")
public class LongTextController {
@Autowired
private LongTextService longTextService;
@Operation(summary = "笔录长文本三元组提取")
@GetMapping("/tripletExtraction")
public R<Object> answerLongTextTripletExtraction(String noteRecordId) {
return longTextService.qaAnswerLongTextTripletExtractionByNoteRecordId(noteRecordId);
}
}

@ -3,7 +3,6 @@ package com.supervision.police.controller;
import com.supervision.common.domain.R;
import com.supervision.police.domain.ModelAtomicIndex;
import com.supervision.police.domain.ModelIndex;
import com.supervision.police.dto.AtomicIndexUsedDTO;
import com.supervision.police.dto.CaseAtomicIndexDTO;
import com.supervision.police.dto.CaseAtomicResultWrapper;
import com.supervision.police.vo.GraphDebugReqVO;
@ -107,14 +106,6 @@ public class ModelIndexController {
}
@Operation(summary = "查询原子指标被使用情况")
@GetMapping("/atomic/used")
public R<List<AtomicIndexUsedDTO>> atomicUsed(@RequestParam String atomicIndexId) {
List<AtomicIndexUsedDTO> atomicIndexUsedDTOS = modelIndexService.atomicUsed(atomicIndexId);
return R.ok(atomicIndexUsedDTOS);
}
/**
*
* @return

@ -0,0 +1,18 @@
package com.supervision.police.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-11
*/
@RestController
@RequestMapping("/police/model-piece-record-type")
public class ModelPieceRecordTypeController {
}

@ -43,4 +43,32 @@ public class MroController {
return R.ok();
}
@Operation(summary = "查询任务列表")
@PostMapping("/taskList")
public R<IPage<TaskInfoDTO>> queryTaskList(@RequestBody TaskInfoReqVO taskInfoReqVO,
@RequestParam(required = false, defaultValue = "1") Integer page,
@RequestParam(required = false, defaultValue = "20") Integer size) {
IPage<TaskInfoDTO> iPage = mroService.queryTaskList(taskInfoReqVO, page, size);
return R.ok(iPage);
}
@Operation(summary = "取消任务")
@PostMapping("/cancelTask")
public R<Boolean> cancelTask(@RequestBody List<String> taskIds) {
Boolean success = mroService.cancelTask(taskIds);
return R.ok(success);
}
@Operation(summary = "删除任务")
@PostMapping("/deleteTask")
public R<Boolean> deleteTask(@RequestBody List<String> taskIds) {
Boolean success = mroService.deleteTask(taskIds);
return R.ok(success);
}
}

@ -0,0 +1,18 @@
package com.supervision.police.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@RestController
@RequestMapping("/police/note-piece-prompt")
public class NotePiecePromptController {
}

@ -0,0 +1,18 @@
package com.supervision.police.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@RestController
@RequestMapping("/police/note-piece-prompt-type-rel")
public class NotePiecePromptTypeRelController {
}

@ -0,0 +1,18 @@
package com.supervision.police.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-11
*/
@RestController
@RequestMapping("/police/note-record-split-piece-sentence")
public class NoteRecordSplitPieceSentenceController {
}

@ -0,0 +1,18 @@
package com.supervision.police.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-10
*/
@RestController
@RequestMapping("/police/note-record-split-sentence")
public class NoteRecordSplitSentenceController {
}

@ -0,0 +1,18 @@
package com.supervision.police.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@RestController
@RequestMapping("/police/piece-triple-info")
public class PieceTripleInfoController {
}

@ -1,57 +0,0 @@
package com.supervision.police.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.common.domain.R;
import com.supervision.police.domain.ScoringModelInfo;
import com.supervision.police.service.ScoringModelInfoService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@Tag(name = "赋分模型信息")
@RestController
@RequestMapping("/scoringModel")
@RequiredArgsConstructor
public class ScoringModelInfoController {
private final ScoringModelInfoService scoringModelInfoService;
@Operation(summary = "保存赋分模型")
@PostMapping("/save")
public R<String> saveScoringModel(@RequestBody ScoringModelInfo modelInfo) {
String roleId = scoringModelInfoService.saveScoringModel(modelInfo);
return R.ok(roleId);
}
@Operation(summary = "删除赋分模型")
@PostMapping("/delete")
public R<?> deleteScoringModel(@RequestBody ScoringModelInfo modelInfo) {
scoringModelInfoService.deleteScoringModel(modelInfo.getId());
return R.ok();
}
@Operation(summary = "修改赋分模型")
@PostMapping("/update")
public R<?> updateScoringModel(@RequestBody ScoringModelInfo modelInfo) {
scoringModelInfoService.updateScoringModel(modelInfo);
return R.ok();
}
@Operation(summary = "复制赋分模型")
@PostMapping("/copy")
public R<String> copyScoringModel(@RequestBody ScoringModelInfo modelInfo) {
String modelId = scoringModelInfoService.copyScoringModel(modelInfo);
return R.ok(modelId);
}
@Operation(summary = "查看赋分模型列表")
@GetMapping("/pageList")
public R<IPage<ScoringModelInfo>> pageList(@RequestParam(required = false) @Parameter(name = "modelName",description = "模型名称") String modelName,
@RequestParam(defaultValue = "1") @Parameter(name = "pageNum",description = "页码") Integer pageNum,
@RequestParam(defaultValue = "99999") @Parameter(name = "pageSize",description = "每页数量") Integer pageSize) {
IPage<ScoringModelInfo> page = scoringModelInfoService.pageList(modelName,pageNum, pageSize);
return R.ok(page);
}
}

@ -1,18 +1,16 @@
package com.supervision.police.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.common.domain.R;
import com.supervision.police.dto.TaskInfoDTO;
import com.supervision.police.dto.taskRecord.TaskRecordVo;
import com.supervision.police.service.TaskCaseRecordService;
import com.supervision.police.service.TaskRecordService;
import com.supervision.police.vo.TaskInfoReqVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Tag(name = "任务管理")
@RestController
@ -22,6 +20,7 @@ public class TaskRecordController {
private final TaskRecordService taskRecordService;
@Operation(summary = "执行提示词提取任务")
@PostMapping("/executePromptExtractTask")
public R<?> executePromptExtractTask(@RequestBody TaskRecordVo taskRecordVo) {
@ -29,36 +28,4 @@ public class TaskRecordController {
return R.ok();
}
@Operation(summary = "一键提取任务")
@PostMapping("/executeAllPromptExtractTask")
public R<?> executeAllPromptExtractTask() {
taskRecordService.executeAllPromptExtractTask();
return R.ok();
}
@Operation(summary = "查询任务列表")
@PostMapping("/taskList")
public R<IPage<TaskInfoDTO>> queryTaskList(@RequestBody TaskInfoReqVO taskInfoReqVO,
@RequestParam(required = false, defaultValue = "1") Integer page,
@RequestParam(required = false, defaultValue = "20") Integer size) {
IPage<TaskInfoDTO> iPage = taskRecordService.queryTaskList(taskInfoReqVO, page, size);
return R.ok(iPage);
}
@Operation(summary = "取消任务")
@PostMapping("/cancelTask")
public R<Boolean> cancelTask(@RequestBody List<String> taskIds) {
taskRecordService.cancelTask(taskIds);
return R.ok(true);
}
@Operation(summary = "删除任务")
@PostMapping("/deleteTask")
public R<Boolean> deleteTask(@RequestBody List<String> taskIds) {
taskRecordService.deleteTask(taskIds);
return R.ok(true);
}
}

@ -8,7 +8,6 @@ import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import static com.baomidou.mybatisplus.annotation.IdType.INPUT;
/**
*
@ -21,7 +20,7 @@ public class EvidenceCategory implements Serializable {
/**
* id
*/
@TableId(type = INPUT)
@TableId
private String id;
/**

@ -35,9 +35,8 @@ public class ModelAtomicIndex implements Serializable {
private String remark;
/**
* case_type
*
*/
@Deprecated(since = "dev_2.3 time:2024-07-05")
private String caseType;

@ -3,7 +3,10 @@ package com.supervision.police.domain;
import java.time.LocalDateTime;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
@ -92,7 +95,6 @@ public class ModelCase implements Serializable {
/**
*
*/
@TableField(updateStrategy = FieldStrategy.ALWAYS, insertStrategy = FieldStrategy.ALWAYS)
private String identifyResult;
@TableField(exist=false)
private String identifyResultName;
@ -100,7 +102,6 @@ public class ModelCase implements Serializable {
/**
*
*/
@TableField(updateStrategy = FieldStrategy.ALWAYS, insertStrategy = FieldStrategy.ALWAYS)
private Integer totalScore;
/**
@ -121,7 +122,6 @@ public class ModelCase implements Serializable {
*
*/
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(updateStrategy = FieldStrategy.ALWAYS, insertStrategy = FieldStrategy.ALWAYS)
private LocalDateTime caseAnalysisSuccessTime;
/**

@ -0,0 +1,56 @@
package com.supervision.police.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-11
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("model_piece_record_type")
@ApiModel(value = "ModelPieceRecordType对象", description = "笔录同语义类型表")
public class ModelPieceRecordType implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键")
@TableId(value = "id")
private String id;
@ApiModelProperty("笔录语句段类型(总结)")
@TableField("record_type")
private String recordType;
@ApiModelProperty("创建人ID")
@TableField("create_user_id")
private String createUserId;
@ApiModelProperty("创建时间")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@ApiModelProperty("更新人")
@TableField("update_user_id")
private String updateUserId;
@ApiModelProperty("更新时间")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}

@ -0,0 +1,85 @@
package com.supervision.police.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("note_piece_prompt")
@ApiModel(value = "NotePiecePrompt对象", description = "长文本提示词表")
public class NotePiecePrompt implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键id")
@TableId(value = "id")
private String id;
@ApiModelProperty("提示词")
@TableField("prompt")
private String prompt;
@ApiModelProperty("开始节点类型")
@TableField("start_entity_type")
private String startEntityType;
@ApiModelProperty("开始节点占位符")
@TableField("start_entity_template")
private String startEntityTemplate;
@ApiModelProperty("关系类型")
@TableField("rel_type")
private String relType;
@ApiModelProperty("名称")
@TableField("name")
private String name;
@ApiModelProperty("关系占位符")
@TableField("rel_template")
private String relTemplate;
@ApiModelProperty("结束节点类型")
@TableField("end_entity_type")
private String endEntityType;
@ApiModelProperty("结束节点占位符")
@TableField("end_entity_template")
private String endEntityTemplate;
@ApiModelProperty("创建人ID")
@TableField("create_user_id")
private String createUserId;
@ApiModelProperty("创建时间")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@ApiModelProperty("更新人")
@TableField("update_user_id")
private String updateUserId;
@ApiModelProperty("更新时间")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}

@ -0,0 +1,42 @@
package com.supervision.police.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("note_piece_prompt_type_rel")
@ApiModel(value = "NotePiecePromptTypeRel对象", description = "句子三元组提示词和分类关系表")
public class NotePiecePromptTypeRel implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键id")
@TableId(value = "id")
private String id;
@ApiModelProperty("note_piece_prompt表ID")
@TableField("prompt_id")
private String promptId;
@ApiModelProperty("id(model_piece_record_type)")
@TableField("type_id")
private String typeId;
}

@ -1,7 +1,5 @@
package com.supervision.police.domain;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@ -133,29 +131,4 @@ public class NotePrompt implements Serializable {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
public String findRelationValue(){
return filterValue("relation");
}
public String findHeadEntityValue(){
return filterValue("headEntityType");
}
public String findTailEntityValue(){
return filterValue("tailEntityType");
}
private String filterValue(String templateName){
if (CollUtil.isEmpty(this.tripleList)){
return null;
}
// 匹配出关系的value
TripleInfoDTO tripleInfoDTO1 = this.tripleList.stream()
.filter(tripleInfoDTO -> StrUtil.equals(tripleInfoDTO.getTemplateName(), templateName)).findFirst().orElse(null);
if (tripleInfoDTO1 == null){
return null;
}
return tripleInfoDTO1.getValue();
}
}

@ -1,6 +1,5 @@
package com.supervision.police.domain;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@ -54,16 +53,6 @@ public class NoteRecordSplit implements Serializable {
*/
private String answer;
/**
*
*/
private String processedQuestion;
/**
*
*/
private String processedAnswer;
/**
* ()
*/
@ -101,11 +90,4 @@ public class NoteRecordSplit implements Serializable {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
public String getAnswerIfProcessedAbsent() {
return StrUtil.isNotEmpty(this.processedAnswer) ? this.processedAnswer : this.answer;
}
public String getQuestionIfProcessedAbsent() {
return StrUtil.isNotEmpty(this.processedQuestion) ? this.processedQuestion : this.question;
}
}

@ -0,0 +1,77 @@
package com.supervision.police.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import com.supervision.handler.StringListTypeHandler;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-11
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("note_record_split_piece_sentence")
@ApiModel(value = "NoteRecordSplitPieceSentence对象", description = "笔录相同语义片段表")
public class NoteRecordSplitPieceSentence implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键id")
@TableId(value = "id")
private String id;
@ApiModelProperty("笔录片段表id")
@TableField("record_split_id")
private String recordSplitId;
// @ApiModelProperty("同语义片段")
// @TableField(value = "content_chuck", typeHandler = StringListTypeHandler.class)
// private List<String> contentChuck;
@ApiModelProperty("同语义片段")
@TableField(value = "content_chuck")
private String contentChuck;
@ApiModelProperty("片段内容总结")
@TableField("content_chuck_summary")
private String contentChuckSummary;
@ApiModelProperty("备用字段")
@TableField("extend")
private String extend;
@ApiModelProperty("创建人ID")
@TableField("create_user_id")
private String createUserId;
@ApiModelProperty("创建时间")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@ApiModelProperty("更新人")
@TableField("update_user_id")
private String updateUserId;
@ApiModelProperty("更新时间")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}

@ -0,0 +1,73 @@
package com.supervision.police.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-10
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("note_record_split_sentence")
@ApiModel(value = "NoteRecordSplitSentence对象", description = "长文本单句表")
public class NoteRecordSplitSentence implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("笔录片段表id")
@TableField("record_split_id")
private String recordSplitId;
@ApiModelProperty("笔录相同语义片段表id")
@TableField("piece_record_split_id")
private String pieceRecordSplitId;
@ApiModelProperty("回答")
@TableField("answer")
private String answer;
@ApiModelProperty("句子模型总结内容")
@TableField("llm_gen_a")
private String llmGenA;
@ApiModelProperty("备用字段")
@TableField("extend_one")
private String extendOne;
@ApiModelProperty("创建人ID")
@TableField("create_user_id")
private String createUserId;
@ApiModelProperty("创建时间")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@ApiModelProperty("更新人")
@TableField("update_user_id")
private String updateUserId;
@ApiModelProperty("更新时间")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}

@ -0,0 +1,102 @@
package com.supervision.police.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("piece_triple_info")
@ApiModel(value = "PieceTripleInfo对象", description = "长文本三元组信息表")
public class PieceTripleInfo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键id")
@TableId(value = "id")
private String id;
@ApiModelProperty("开始节点")
@TableField("start_node")
private String startNode;
@ApiModelProperty("结束节点")
@TableField("end_node")
private String endNode;
@ApiModelProperty("关系")
@TableField("relation")
private String relation;
@ApiModelProperty("笔录片段id")
@TableField("record_split_id")
private String recordSplitId;
@ApiModelProperty("同语义片段id")
@TableField("piece_record_split_id")
private String pieceRecordSplitId;
@ApiModelProperty("实际提交给大模型的提示词")
@TableField("submit_prompt")
private String submitPrompt;
@ApiModelProperty("是否生成图谱")
@TableField("add_neo4j")
private String addNeo4j;
@ApiModelProperty("创建时间")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@ApiModelProperty("起始节点图ID")
@TableField("start_node_graph_id")
private Long startNodeGraphId;
@ApiModelProperty("关系ID(neo4j关系id)")
@TableField("rel_graph_id")
private Long relGraphId;
@ApiModelProperty("结束节点图ID")
@TableField("end_node_graph_id")
private Long endNodeGraphId;
@ApiModelProperty("开始节点类型(neo4j节点类型)")
@TableField("start_node_type")
private String startNodeType;
@ApiModelProperty("结束节点类型(neo4j节点类型)")
@TableField("end_node_type")
private String endNodeType;
@ApiModelProperty("创建人ID")
@TableField("create_user_id")
private String createUserId;
@ApiModelProperty("更新人")
@TableField("update_user_id")
private String updateUserId;
@ApiModelProperty("更新时间")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}

@ -1,68 +0,0 @@
package com.supervision.police.domain;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
*
* @TableName scoring_model_info
*/
@Data
@TableName(value ="scoring_model_info")
public class ScoringModelInfo implements Serializable {
/**
*
*/
@TableId
private String id;
/**
*
*/
private String modelName;
/**
*
*/
private String modelDesc;
/**
*
*/
private String scoringRules;
/**
* id
*/
private String createUserId;
/**
*
*/
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
*
*/
private String updateUserId;
/**
*
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -32,11 +32,6 @@ public class TaskCaseRecord implements Serializable {
*/
private String caseId;
/**
* ID
*/
private String promptId;
/**
* ID
*/

@ -61,15 +61,11 @@ public class TaskRecord implements Serializable {
/**
*
*/
private LocalDateTime cancelTime;
private LocalDateTime finishTime;
private Date cancelTime;
/**
* ID
*/
@TableField(fill = FieldFill.INSERT)
private String createUserId;
/**
@ -81,7 +77,6 @@ public class TaskRecord implements Serializable {
/**
* ID
*/
@TableField(fill = FieldFill.UPDATE)
private String updateUserId;
/**

@ -113,6 +113,7 @@ public class TripleInfo implements Serializable {
public TripleInfo() {
}
// todo
public TripleInfo(String startNode, String endNode, String relation,String caseId, String recordId, String recordSplitId, LocalDateTime createTime, String startNodeType, String endNodeType) {
this.startNode = startNode;
this.endNode = endNode;

@ -1,22 +0,0 @@
package com.supervision.police.dto;
import lombok.Data;
/**
* 使DTO
*/
@Data
public class AtomicIndexUsedDTO {
private String atomicIndexId;
private String atomicIndexName;
private String indexId;
private String indexName;
private String modelName;
private String modelId;
}

@ -1,7 +1,6 @@
package com.supervision.police.dto;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.supervision.police.domain.ModelCase;
import lombok.Data;
@ -22,7 +21,6 @@ public class CaseProcessDTO {
/**
*
*/
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime analysisSuccessTime;
/**
@ -48,6 +46,5 @@ public class CaseProcessDTO {
this.analysisStatus = StrUtil.toString(modelCase.getCaseAnalysisStatus());
this.analysisSuccessTime = modelCase.getCaseAnalysisSuccessTime();
this.identifyResult = modelCase.getIdentifyResult();
this.enableAnalyse = modelCase.getCaseAnalysisStatus() == 1 ? "1" : "0";
}
}

@ -7,13 +7,10 @@ import lombok.Data;
public class IndexResultQuery {
@Schema(description = "案件id")
private String caseId;
private String caseId;
@Schema(description = "指标类型")
private String indexType;
private String caseType;
private String indexType;
@Schema(description = "指标名称")
private String indexName;

@ -0,0 +1,20 @@
package com.supervision.police.dto;
import lombok.Data;
import java.util.List;
/**
* @Authorlongbao
* @Date2024/12/10 14:19
* @Description:
*/
@Data
public class LongTextPieceSentenceDto {
// 笔录片段 长文本单句 id
private List<String> noteRecordSplitSentenceId;
// 笔录片段 长文本同语义id
private String noteRecordSplitPieceSentenceId;
}

@ -0,0 +1,21 @@
package com.supervision.police.dto;
import com.supervision.police.domain.NoteRecordSplitSentence;
import lombok.Data;
import java.util.List;
/**
* @Authorlongbao
* @Date2024/12/10 14:19
* @Description:
*/
@Data
public class LongTextSingleSentenceSummaryDto {
// 笔录片段id
private String noteRecordSplitId;
// 笔录片段单句集合
private List<NoteRecordSplitSentence> noteRecordSplitSentences;
}

@ -0,0 +1,29 @@
package com.supervision.police.dto;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @Authorlongbao
* @Date2024/12/10 14:19
* @Description: 使 id
*/
@Data
public class PieceSentenceIdDto {
// 同语义句id
private String noteRecordSplitPieceSentenceId;
// 单语句 id集合
private List<Long> noteRecordSplitSentenceId;
public PieceSentenceIdDto() {
}
public PieceSentenceIdDto(String noteRecordSplitPieceSentenceId, List<Long> noteRecordSplitSentenceId) {
this.noteRecordSplitPieceSentenceId = noteRecordSplitPieceSentenceId;
this.noteRecordSplitSentenceId = noteRecordSplitSentenceId;
}
}

@ -1,6 +1,5 @@
package com.supervision.police.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@ -27,15 +26,6 @@ public class TaskInfoDTO {
*/
private String taskName;
private String taskType;
private String promptId;
private String promptName;
/**
*
*/
@ -44,19 +34,11 @@ public class TaskInfoDTO {
/**
*
*/
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime cancelTime;
/**
*
*/
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime finishTime;
/**
*
*/
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime createTime;
/**

@ -457,7 +457,9 @@ public class CaseScoreDetailBuilder {
new LambdaQueryWrapper<ModelIndexResult>().eq(ModelIndexResult::getCaseId, caseId));
// 3.3 获取原子指标信息
List<ModelAtomicIndex> modelAtomicIndices = modelAtomicIndexMapper.listCaseAtomicIndex(null, modelCase.getCaseType(), "1");
List<ModelAtomicIndex> modelAtomicIndices = modelAtomicIndexMapper.selectList(
new LambdaQueryWrapper<ModelAtomicIndex>().eq(ModelAtomicIndex::getCaseType, modelCase.getCaseType())
.eq(ModelAtomicIndex::getDataStatus, "1"));
// 3.4 获取原子指标结果
List<ModelAtomicResult> modelAtomicResults = modelAtomicResultMapper.selectList(

@ -3,7 +3,6 @@ package com.supervision.police.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.police.domain.ModelAtomicIndex;
import com.supervision.police.dto.AtomicIndexUsedDTO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -23,7 +22,5 @@ public interface ModelAtomicIndexMapper extends BaseMapper<ModelAtomicIndex> {
List<ModelAtomicIndex> listCaseAtomicIndex(@Param("indexIdList") List<String> indexIdList,
@Param("caseType") String caseType,
@Param("indexSource") String indexSource);
List<AtomicIndexUsedDTO> atomicUsed(@Param("atomicIndexId") String atomicIndexId);
}

@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.supervision.police.domain.ModelAtomicResult;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* (ModelAtomicResult)访
*
@ -19,7 +17,5 @@ public interface ModelAtomicResultMapper extends BaseMapper<ModelAtomicResult> {
@Param("indexId") String indexId,
@Param("atomicId") String atomicId);
List<ModelAtomicResult> queryByCaseIdForUpdate(@Param("caseId") String caseId);
}

@ -0,0 +1,18 @@
package com.supervision.police.mapper;
import com.supervision.police.domain.ModelPieceRecordType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author longbao
* @since 2024-12-11
*/
@Mapper
public interface ModelPieceRecordTypeMapper extends BaseMapper<ModelPieceRecordType> {
}

@ -0,0 +1,18 @@
package com.supervision.police.mapper;
import com.supervision.police.domain.NotePiecePrompt;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@Mapper
public interface NotePiecePromptMapper extends BaseMapper<NotePiecePrompt> {
}

@ -0,0 +1,18 @@
package com.supervision.police.mapper;
import com.supervision.police.domain.NotePiecePromptTypeRel;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@Mapper
public interface NotePiecePromptTypeRelMapper extends BaseMapper<NotePiecePromptTypeRel> {
}

@ -0,0 +1,18 @@
package com.supervision.police.mapper;
import com.supervision.police.domain.NoteRecordSplitPieceSentence;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author longbao
* @since 2024-12-11
*/
@Mapper
public interface NoteRecordSplitPieceSentenceMapper extends BaseMapper<NoteRecordSplitPieceSentence> {
}

@ -0,0 +1,26 @@
package com.supervision.police.mapper;
import com.supervision.police.domain.NoteRecordSplitSentence;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* Mapper
* </p>
*
* @author longbao
* @since 2024-12-10
*/
@Mapper
public interface NoteRecordSplitSentenceMapper extends BaseMapper<NoteRecordSplitSentence> {
void saveBatchList(List<NoteRecordSplitSentence> noteRecordSplitList);
void updateBatchList(@Param("ids") List<Long> ids, @Param("noteRecordSplitPieceSentences") Long noteRecordSplitPieceSentences);
}

@ -0,0 +1,18 @@
package com.supervision.police.mapper;
import com.supervision.police.domain.PieceTripleInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* Mapper
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@Mapper
public interface PieceTripleInfoMapper extends BaseMapper<PieceTripleInfo> {
}

@ -1,18 +0,0 @@
package com.supervision.police.mapper;
import com.supervision.police.domain.ScoringModelInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Administrator
* @description scoring_model_info()Mapper
* @createDate 2025-02-14 16:27:25
* @Entity com.supervision.police.domain.ScoringModelInfo
*/
public interface ScoringModelInfoMapper extends BaseMapper<ScoringModelInfo> {
}

@ -0,0 +1,139 @@
package com.supervision.police.mybatis;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @Authorlongbao
* @Date2024/11/19 13:03
* @Description:
*/
public class MySqlCodeGenerator {
public static void main(String[] args) {
String projectPath = System.getProperty("user.dir"); //获取当前项目路径
List<String> tables = new ArrayList<>();
//添加 表 到集合中,可以添加多个表
tables.add("transcription_triple_info");
FastAutoGenerator.create("jdbc:mysql://192.168.1.101:42415/nx_llm?useUnicode=true&characterEncoding=utf-8&useSSL=true&allowMultiQueries=true",
"root",
"llm@984573~!eda")
// 全局配置
.globalConfig(builder -> {
builder
.enableSwagger() // 是否启用swagger注解
.author("longbao") // 作者名称
.dateType(DateType.ONLY_DATE) // 时间策略
.commentDate("yyyy-MM-dd") // 注释日期
.outputDir(projectPath + "/src/main/java") // 输出目录
.disableOpenDir(); // 生成后禁止打开所生成的系统目录
})
//java和数据库字段的类型转换
.dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
int typeCode = metaInfo.getJdbcType().TYPE_CODE;
if (typeCode == Types.SMALLINT || typeCode == Types.TINYINT) {
// 自定义类型转换
return DbColumnType.INTEGER;
}
return typeRegistry.getColumnType(metaInfo);
}))
// 包配置
.packageConfig(builder -> {
builder
.parent("com.supervision") // 父包名
.moduleName("police") // 模块包名
.controller("controller")
.entity("domain") // 实体类包名
.service("service") // service包名
.serviceImpl("service.impl") // serviceImpl包名
.mapper("mapper") // mapper包名
.xml("mapper.xml");
})
// 策略配置
.strategyConfig(builder -> {
builder.enableCapitalMode()//驼峰
.enableSkipView()//跳过视图
.disableSqlFilter()
// .addTablePrefix("t_") // 增加过滤表前缀
// .addTableSuffix("_db") // 增加过滤表后缀
// .addFieldPrefix("t_") // 增加过滤字段前缀
// .addFieldSuffix("_field") // 增加过滤字段后缀
.addInclude(tables) // 表匹配
// Entity 策略配置
.entityBuilder()
.enableFileOverride()
.enableLombok() // 开启lombok
.enableChainModel() // 链式
.enableRemoveIsPrefix() // 开启boolean类型字段移除is前缀
.enableTableFieldAnnotation() //开启生成实体时生成的字段注解
.versionColumnName("version") // 乐观锁数据库字段
.versionPropertyName("version") // 乐观锁实体类名称
.logicDeleteColumnName("delflag") // 逻辑删除数据库中字段名
.logicDeletePropertyName("delFlag") // 逻辑删除实体类中的字段名
.naming(NamingStrategy.underline_to_camel) // 表名 下划线 -》 驼峰命名
.columnNaming(NamingStrategy.underline_to_camel) // 字段名 下划线 -》 驼峰命名
.idType(IdType.ASSIGN_ID) // 主键生成策略 雪花算法生成id
.formatFileName("%s") // Entity 文件名称
.addTableFills(new Column("create_time", FieldFill.INSERT)) // 表字段填充
.addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE)) // 表字段填充
//.enableColumnConstant()
//.enableActiveRecord()//MPlus中启用ActiveRecord模式生成的实体类会继承activerecord.Model类直接进行数据库操作
// Controller 策略配置
.controllerBuilder()
.enableFileOverride()
.enableHyphenStyle()
.enableRestStyle() // 开启@RestController
.formatFileName("%sController") // Controller 文件名称
// Service 策略配置
.serviceBuilder()
.enableFileOverride()
.formatServiceFileName("%sService") // Service 文件名称
.formatServiceImplFileName("%sServiceImpl") // ServiceImpl 文件名称
// Mapper 策略配置
.mapperBuilder()
.enableFileOverride()
.enableMapperAnnotation() // 开启@Mapper
.enableBaseColumnList() // 启用 columnList (通用查询结果列)
.enableBaseResultMap() // 启动resultMap
.formatMapperFileName("%sMapper") // Mapper 文件名称
.formatXmlFileName("%sMapper"); // Xml 文件名称
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板默认的是Velocity引擎模板
.templateConfig(builder -> {
builder.controller("/templates/controller.java")
.service("/templates/service.java")
.serviceImpl("/templates/serviceImpl.java")
//.mapper()
.build();
})
.execute(); // 执行
}
}

@ -15,6 +15,4 @@ public interface EvidenceCategoryService extends IService<EvidenceCategory> {
List<EvidenceCategoryDTO> listCategoryTree(String caseType);
List<EvidenceCategory> listCategoryByCaseType(String caseType);
}

@ -0,0 +1,22 @@
package com.supervision.police.service;
import com.supervision.common.domain.R;
import java.sql.SQLException;
/**
* @Authorlongbao
* @Date2024/12/10 10:21
* @Description: id
*/
public interface LongTextService {
/**
* id
*
* @param noteRecordId id
* @return
*/
public R<Object> qaAnswerLongTextTripletExtractionByNoteRecordId(String noteRecordId);
}

@ -3,7 +3,6 @@ package com.supervision.police.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.police.domain.ModelAtomicIndex;
import com.supervision.police.dto.AtomicIndexUsedDTO;
import com.supervision.police.mapper.ModelAtomicIndexMapper;
import java.util.List;
@ -22,12 +21,12 @@ public interface ModelAtomicIndexService extends IService<ModelAtomicIndex> {
/**
* id
* @param atomicIndexIds id
* @param caseType
* @param indexIdList id
* @param caseId id
* @param indexSource
* @return
*/
List<ModelAtomicIndex> listCaseAtomicIndex(List<String> atomicIndexIds, String caseType, String indexSource);
List<ModelAtomicIndex> listCaseAtomicIndex(List<String> indexIdList, String caseId, String indexSource);
@ -37,7 +36,4 @@ public interface ModelAtomicIndexService extends IService<ModelAtomicIndex> {
* @param atomicIndexId id
*/
void whenDeleteAtomicIndex(String caseType,String atomicIndexId);
List<AtomicIndexUsedDTO> atomicUsed(String atomicIndexId);
}

@ -2,13 +2,9 @@ package com.supervision.police.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.police.domain.ModelAtomicResult;
import com.supervision.police.dto.EvidentIndexResultDTO;
import java.util.List;
public interface ModelAtomicResultService extends IService<ModelAtomicResult> {
List<ModelAtomicResult> queryByCaseIdForUpdate(String caseId);
void replaceResultCaseId(String oldCaseId, String newCaseId);
}

@ -61,7 +61,5 @@ public interface ModelCaseService extends IService<ModelCase> {
List<String> listCaseFileIds(String caseId);
boolean scoringModelIsUsed(String modelId);
}

@ -39,6 +39,6 @@ public interface ModelIndexAtomicRelationService extends IService<ModelIndexAtom
*/
void deleteByModelIndex(String modelIndexId);
void deleteByIndexIds(List<String> indexIds);
}

@ -1,8 +0,0 @@
package com.supervision.police.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.police.domain.ModelIndexResult;
public interface ModelIndexResultService extends IService<ModelIndexResult> {
void removeByCaseId(String caseId);
}

@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.common.domain.R;
import com.supervision.police.domain.ModelAtomicIndex;
import com.supervision.police.domain.ModelIndex;
import com.supervision.police.dto.AtomicIndexUsedDTO;
import com.supervision.police.dto.CaseAtomicIndexDTO;
import com.supervision.police.dto.CaseAtomicResultWrapper;
import com.supervision.police.dto.ValueCalculateScopeDTO;
@ -29,8 +28,6 @@ public interface ModelIndexService extends IService<ModelIndex> {
R<?> del(String id);
void deleteModelIndexByCaseType(String caseType);
R<?> selectAllAtomic(ModelAtomicIndex modelAtomicIndex, Integer page, Integer size);
R<?> addOrUpdAtomic(ModelAtomicIndex modelAtomicIndex);
@ -62,14 +59,5 @@ public interface ModelIndexService extends IService<ModelIndex> {
Map<String,List<ValueCalculateScopeDTO>> listAtomicIndexAttributeScope(List<String> atomicIndexIds);
GraphDebugResVO graphDebug(GraphDebugReqVO graphDebugDTO);
/**
*
* @param oldModelId id
* @param newModelId id
*/
void copyIndex(String oldModelId, String newModelId);
List<AtomicIndexUsedDTO> atomicUsed(String atomicIndexId);
}

@ -0,0 +1,16 @@
package com.supervision.police.service;
import com.supervision.police.domain.ModelPieceRecordType;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-11
*/
public interface ModelPieceRecordTypeService extends IService<ModelPieceRecordType> {
}

@ -12,4 +12,10 @@ public interface MroService {
IPage<CaseProcessDTO> queryCaseList(CaseProcessReqVO caseProcessReqVO, Integer page, Integer size);
void analysisCase(List<String> caseIds);
IPage<TaskInfoDTO> queryTaskList(TaskInfoReqVO taskInfoReqVO, Integer page, Integer size);
Boolean cancelTask(List<String> taskIds);
Boolean deleteTask(List<String> taskIds);
}

@ -0,0 +1,29 @@
package com.supervision.police.service;
import com.supervision.police.domain.NotePiecePrompt;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.police.domain.NotePrompt;
import com.supervision.police.domain.NoteRecordSplitPieceSentence;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
public interface NotePiecePromptService extends IService<NotePiecePrompt> {
/**
*
* @param recordSplitId
* @return
*/
List<NotePiecePrompt> listPiecePromptBySplitId(NoteRecordSplitPieceSentence recordSplitId);
}

@ -0,0 +1,16 @@
package com.supervision.police.service;
import com.supervision.police.domain.NotePiecePromptTypeRel;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
public interface NotePiecePromptTypeRelService extends IService<NotePiecePromptTypeRel> {
}

@ -0,0 +1,16 @@
package com.supervision.police.service;
import com.supervision.police.domain.NoteRecordSplitPieceSentence;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-11
*/
public interface NoteRecordSplitPieceSentenceService extends IService<NoteRecordSplitPieceSentence> {
}

@ -0,0 +1,32 @@
package com.supervision.police.service;
import com.supervision.police.domain.NoteRecordSplitSentence;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-10
*/
public interface NoteRecordSplitSentenceService extends IService<NoteRecordSplitSentence> {
/**
*
* @param noteRecordSplitList
*/
public void saveBatchList(List<NoteRecordSplitSentence> noteRecordSplitList);
/**
* llmGenA
* @param ids id
* @param noteRecordSplitPieceSentences id
*/
void updateBatchList(List<Long> ids,Long noteRecordSplitPieceSentences);
}

@ -35,10 +35,4 @@ public interface NoteRecordSplitService extends IService<NoteRecordSplit> {
List<NoteRecordSplit> queryRecordSplitList(String recordId);
/**
*
* @param splitList
*/
void batchUpdatePronoun(List<NoteRecordSplit> splitList);
}

@ -0,0 +1,16 @@
package com.supervision.police.service;
import com.supervision.police.domain.PieceTripleInfo;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
public interface PieceTripleInfoService extends IService<PieceTripleInfo> {
}

@ -1,7 +1,7 @@
package com.supervision.police.service;
import com.supervision.police.domain.ModelRecordType;
import com.supervision.police.domain.NoteRecordSplit;
import com.supervision.thread.ReplacePronounTask;
import java.util.List;
@ -9,9 +9,6 @@ public interface RecordSplitProcessService {
void process(List<ModelRecordType> allTypeList, List<NoteRecordSplit> splitList);
void processWithReplacePronoun(List<ModelRecordType> allTypeList, List<NoteRecordSplit> splitList);
/**
*
*
@ -21,22 +18,4 @@ public interface RecordSplitProcessService {
*/
boolean recordProcessTaskStatusCheck(String caseId, String recordId, Integer splitSize);
/**
*
* @param splitList
* @return note:
* @throws InterruptedException
*/
List<NoteRecordSplit> replacePronoun(List<NoteRecordSplit> splitList) throws InterruptedException;
/**
*
*
* @param splitList
* @param index
*/
ReplacePronounTask buildReplacePronounTask(List<NoteRecordSplit> splitList, int index);
}

@ -1,28 +0,0 @@
package com.supervision.police.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.police.domain.ScoringModelInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.stream.LongStream;
/**
* @author Administrator
* @description scoring_model_info()Service
* @createDate 2025-02-14 16:27:25
*/
public interface ScoringModelInfoService extends IService<ScoringModelInfo> {
String saveScoringModel(ScoringModelInfo modelInfo);
void deleteScoringModel(String modelId);
void updateScoringModel(ScoringModelInfo modelInfo);
String copyScoringModel(ScoringModelInfo modelInfo);
IPage<ScoringModelInfo> pageList(String modelName, Integer pageNum, Integer pageSize);
String getScoringModelNameById(String modelId, List<ScoringModelInfo> modelInfoList);
}

@ -3,7 +3,6 @@ package com.supervision.police.service;
import com.supervision.police.domain.TaskCaseRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* @author dxy
@ -30,8 +29,8 @@ public interface TaskCaseRecordService extends IService<TaskCaseRecord> {
*/
String getActuallyStatus(TaskCaseRecord taskCaseRecord);
TaskCaseRecord updateStatus(String taskId, String executeId,String promptId,boolean isSuccess);
TaskCaseRecord updateStatus(String taskId, String executeId,String promptId,boolean isSuccess,List<TaskCaseRecord> taskCaseRecordList);
TaskCaseRecord updateStatus(String taskId, String executeId,boolean isSuccess);
TaskCaseRecord updateStatus(String taskId, String executeId,boolean isSuccess,List<TaskCaseRecord> taskCaseRecordList);
Boolean updateStatus(String taskId,List<String> olderStatus,String nowStatus);

@ -20,8 +20,6 @@ public interface TaskRecordService extends IService<TaskRecord> {
void executePromptExtractTask(TaskRecordVo taskRecordVo);
void executeAllPromptExtractTask();
void graphExtract(NotePrompt prompt, String caseId, String executeId);
/**
@ -63,7 +61,7 @@ public interface TaskRecordService extends IService<TaskRecord> {
* @param taskId id
* @param executeId id
*/
void completeTask(String taskId, String promptId,String executeId, boolean isSuccess);
void completeTask(String taskId, String executeId, boolean isSuccess);
String determineStatus(List<TaskCaseRecord> taskCaseRecords);

@ -1,7 +1,6 @@
package com.supervision.police.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.police.domain.NotePrompt;
import com.supervision.police.domain.TripleInfo;
import java.util.List;
@ -17,6 +16,4 @@ public interface TripleInfoService extends IService<TripleInfo> {
void updateNeo4jFlag(List<String> ids, String neo4jFlag);
List<TripleInfo> queryByRecordIdAndPrompt(String recordId, NotePrompt notePrompt);
}

@ -48,6 +48,7 @@ import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.supervision.common.constant.XxlJobConstants.TASK_NAME_EVIDENCE_ANALYSIS;
@Slf4j
@ -307,12 +308,12 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
CaseEvidence caseEvidence = getById(evidenceId);
if (caseEvidence == null) {
log.error("证据不存在");
throw new IllegalArgumentException("证据不存在");
return;
}
List<EvidenceFileDTO> evidenceFiles = evidenceFileService.listFileInfo(List.of(evidenceId));
if (evidenceFiles.isEmpty()) {
log.error("证据id:【{}】不存在证据文件", evidenceId);
throw new IllegalArgumentException("证据不存在证据文件");
return;
}
try {
// 根据rank升序排序
@ -802,7 +803,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
.filter(evidenceDetail -> CollUtil.isNotEmpty(evidenceDetail.getFileList()))
.map(EvidenceProcessDTO::new).collect(Collectors.toList());
List<EvidenceDirectoryDTO> evidenceDirectoryDTOS = evidenceDirectoryService.listDirectoryTree(caseId);
List<EvidenceCategory> categoryList = evidenceCategoryService.listCategoryByCaseType(modelCase.getCaseType());
List<EvidenceCategory> categoryList = evidenceCategoryService.lambdaQuery().eq(EvidenceCategory::getCaseType, modelCase.getCaseType()).list();
for (EvidenceProcessDTO evidenceProcessDTO : processDTOList) {
evidenceProcessDTO.setTemplateInfo(evidenceDirectoryDTOS, categoryList);
evidenceProcessDTO.setEvidenceTypeName(categoryList);

@ -273,7 +273,7 @@ public class ChatServiceImpl implements ChatService {
private void handleIndexResultQA(List<ModelIndex> modelIndices, String query, String caseId, Map<String, Object> answerMap) {
//如果案件分析状态不是分析成功,则先执行案件分析
ModelCase modelCase = modelCaseService.getById(caseId);
ModelIndex modelIndex = modelIndices.stream().filter(index -> query.equals(index.getName())).findFirst().get();
ModelIndex modelIndex = modelIndices.stream().filter(index -> query.contains(index.getName())).findFirst().get();
IndexResultQuery indexResultQuery = new IndexResultQuery();
indexResultQuery.setCaseId(caseId);
indexResultQuery.setIndexType(modelIndex.getIndexType());
@ -292,7 +292,7 @@ public class ChatServiceImpl implements ChatService {
answerMap.put("indexType", modelIndex.getIndexType());
answerMap.put("result", Boolean.parseBoolean(indexDetail.getIndexResult()) ? "符合" : "不符合");
List<Map<String, String>> qaSplitList = new ArrayList<>();
if (CollUtil.isNotEmpty(indexDetail.getChildren())) {
if (!indexDetail.getChildren().isEmpty()) {
indexDetail.getChildren().forEach(atomicIndexDTO -> {
if (!atomicIndexDTO.getRecordSegmentationList().isEmpty()) {
atomicIndexDTO.getRecordSegmentationList().forEach(split -> {
@ -310,7 +310,7 @@ public class ChatServiceImpl implements ChatService {
}
answerMap.put("qaSplitList", qaSplitList);
List<Map<String, String>> evidenceList = new ArrayList<>();
if (CollUtil.isNotEmpty(indexDetail.getChildren())) {
if (!indexDetail.getChildren().isEmpty()) {
indexDetail.getChildren().forEach(atomicIndexDTO -> {
if (!atomicIndexDTO.getEvidentResultList().isEmpty()) {
atomicIndexDTO.getEvidentResultList().forEach(evidentIndexResultDTO -> {

@ -12,6 +12,7 @@ import com.supervision.police.service.NotePromptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
@ -26,15 +27,10 @@ public class EvidenceCategoryServiceImpl extends ServiceImpl<EvidenceCategoryMap
@Autowired
private NotePromptService notePromptService;
/**
*
* @param caseType
* @return
*/
@Override
public List<EvidenceCategoryDTO> listCategoryTree(String caseType) {
List<EvidenceCategoryDTO> list = super.getBaseMapper().listCategoryDTO(null);
List<EvidenceCategoryDTO> list = super.getBaseMapper().listCategoryDTO(caseType);
List<NotePrompt> notePrompts = notePromptService.list();
for (EvidenceCategoryDTO categoryDTO : list) {
List<EvidenceCategoryDTO> child = list.stream()
@ -51,11 +47,6 @@ public class EvidenceCategoryServiceImpl extends ServiceImpl<EvidenceCategoryMap
}
return list.stream().filter(categoryDTO -> StrUtil.isEmpty(categoryDTO.getParentId())).toList();
}
@Override
public List<EvidenceCategory> listCategoryByCaseType(String caseType) {
return super.lambdaQuery().list();
}
}

@ -3,7 +3,7 @@ package com.supervision.police.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.supervision.neo4j.service.Neo4jService;
import cn.hutool.json.JSONUtil;
import com.supervision.police.domain.CasePerson;
import com.supervision.police.domain.NotePrompt;
import com.supervision.police.domain.NoteRecordSplit;
@ -42,8 +42,6 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
@Autowired
private NoteRecordSplitService noteRecordSplitService;
private final Neo4jService neo4jService;
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
public void extractTripleInfo(String caseId, String name, String recordSplitId) {
@ -110,11 +108,7 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
// 如果有提取到三元组信息
if (CollUtil.isNotEmpty(tripleInfos)) {
for (TripleInfo tripleInfo : tripleInfos) {
// 三元组入库到neo4j
log.info("doTripleExtractTask:笔录片段:{}三元组提取任务执行结束,开始三元组信息入库",tripleInfo.getRecordSplitId());
neo4jService.saveTripleInfo(tripleInfo);
log.info("doTripleExtractTask:笔录片段:{}三元组提取任务执行结束...,开始三元组信息入库",tripleInfo.getRecordSplitId());
tripleInfo.setAddNeo4j("1");
log.info("doTripleExtractTask:笔录片段:{}三元组提取任务执行结束...,三元组信息入库:{}",tripleInfo.getRecordSplitId(), JSONUtil.toJsonStr(tripleInfo));
tripleInfoService.saveOrUpdateByBusiness(tripleInfo);
}
}
@ -149,13 +143,7 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
Assert.notNull(notePrompt, "notePrompt不能为空");
Assert.notEmpty(recordId, "recordId不能为空");
Assert.notEmpty(caseId, "caseId不能为空");
// 先清除之前的三元组信息
List<TripleInfo> tripleInfos = tripleInfoService.queryByRecordIdAndPrompt(recordId, notePrompt);
log.info("extractTripleInfo:笔录片段:{}清除之前的三元组信息,三元组个数:{}", recordId, tripleInfos.size());
for (TripleInfo tripleInfo : tripleInfos) {
neo4jService.deleteTripleInfo(tripleInfo);
tripleInfoService.removeById(tripleInfo.getId());
}
CasePerson mainActor = casePersonService.getMainActor(caseId);
List<NoteRecordSplit> noteRecordSplits = noteRecordSplitService.queryRecordSplitList(recordId);
return extractTripleInfo(notePrompt, mainActor, noteRecordSplits);

@ -0,0 +1,750 @@
package com.supervision.police.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.supervision.common.domain.R;
import com.supervision.common.utils.StringUtils;
import com.supervision.constant.PromptsEnum;
import com.supervision.police.domain.*;
import com.supervision.police.dto.LongTextSingleSentenceSummaryDto;
import com.supervision.police.dto.PieceSentenceIdDto;
import com.supervision.police.service.*;
import com.supervision.thread.*;
import com.supervision.utils.UserUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StopWatch;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @Authorlongbao
* @Date2024/12/10 10:22
* @Description: QA
*/
@Slf4j
@Service
public class LongTextServiceImpl implements LongTextService {
private static final String HEAD_ENTITY_TYPE_ACTOR = "行为人";
@Autowired
private NoteRecordService noteRecordService;
@Autowired
private NoteRecordSplitService noteRecordSplitService;
@Autowired
private NoteRecordSplitSentenceService noteRecordSplitSentenceService;
@Autowired
private OllamaChatClient chatClient;
@Autowired
private NoteRecordSplitPieceSentenceService noteRecordSplitPieceSentenceService;
@Autowired
private ModelPieceRecordTypeService modelPieceRecordTypeService;
@Autowired
private NotePiecePromptTypeRelService notePiecePromptTypeRelService;
@Autowired
private NotePiecePromptService notePiecePromptService;
@Autowired
private CasePersonService casePersonService;
@Autowired
private PieceTripleInfoService pieceTripleInfoService;
/**
* id
*
* @param noteRecordId id
* @return
*/
@Override
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
public R<Object> qaAnswerLongTextTripletExtractionByNoteRecordId(String noteRecordId) {
log.info("[QaAnswerLongTextTripletExtraction]开始");
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 校验参数
if (StringUtils.isNull(noteRecordId)) {
stopWatch.stop();
log.error("[QaAnswerLongTextTripletExtraction]笔录id不存在{}", noteRecordId);
log.warn("[QaAnswerLongTextTripletExtraction]主线程程序总耗时:{}", stopWatch.getTotalTimeSeconds());
return R.fail("笔录id不可为空");
}
// 查询笔录是否存在
NoteRecord noteRecord = noteRecordService
.lambdaQuery()
.select(NoteRecord::getId)
.eq(NoteRecord::getId, noteRecordId)
.one();
if (null == noteRecord) {
stopWatch.stop();
log.error("[QaAnswerLongTextTripletExtraction]笔录不存在{}", noteRecordId);
log.warn("[QaAnswerLongTextTripletExtraction]主线程程序总耗时:{}", stopWatch.getTotalTimeSeconds());
return R.fail("该笔录不存在");
}
// 笔录是否已拆分QA
List<NoteRecordSplit> noteRecordSplits = noteRecordSplitService
.lambdaQuery()
.select(NoteRecordSplit::getId, NoteRecordSplit::getAnswer)
.eq(NoteRecordSplit::getNoteRecordId, noteRecordId)
.list();
if (null == noteRecordSplits || noteRecordSplits.isEmpty()) {
stopWatch.stop();
log.error("[QaAnswerLongTextTripletExtraction]笔录未拆分{}", noteRecordId);
log.warn("[QaAnswerLongTextTripletExtraction]主线程程序总耗时:{}", stopWatch.getTotalTimeSeconds());
return R.fail("该笔录未拆分QA对");
}
R<Object> threadPoolExecutorCheck = singlePointCheck();
if (null != threadPoolExecutorCheck) {
stopWatch.stop();
return threadPoolExecutorCheck;
}
// 获取笔录片段中回答中的长文本
List<NoteRecordSplitSentence> noteRecordSplitList = matcherLongText(noteRecordSplits);
if (noteRecordSplitList.isEmpty()) {
stopWatch.stop();
log.error("[QaAnswerLongTextTripletExtraction]笔录无长文本{}", noteRecordId);
log.warn("[QaAnswerLongTextTripletExtraction]主线程程序总耗时:{}", stopWatch.getTotalTimeSeconds());
return R.fail("该笔录QA对未查询到长文本");
}
log.info("[QaAnswerLongTextTripletExtraction]校验通过");
// 保存长文本单句
noteRecordSplitSentenceService.saveBatch(noteRecordSplitList);
log.info("[QaAnswerLongTextTripletExtraction]保存长文本单句成功");
// 长文本单句总结
List<String> noteRecordSplitAnswerList = new ArrayList<>();
for (NoteRecordSplitSentence noteRecordSplitSentence : noteRecordSplitList) {
Long noteRecordSplitSentenceId = noteRecordSplitSentence.getId();
String answer = noteRecordSplitSentence.getAnswer();
noteRecordSplitAnswerList.add(noteRecordSplitSentenceId + "、" + answer);
}
log.info("[QaAnswerLongTextTripletExtraction]长文本单句总结开始");
List<NoteRecordSplitSentence> noteRecordSplitSentences = chatAiLongTextSingleSentenceSummary(PromptsEnum.LONG_TEXT_SINGLE_SENTENCE_SUMMARY, noteRecordSplitAnswerList);
log.info("[QaAnswerLongTextTripletExtraction]长文本单句总结结束");
// 更新长文本单句
noteRecordSplitSentenceService.updateBatchById(noteRecordSplitSentences);
log.info("[QaAnswerLongTextTripletExtraction]更新长文本单句成功");
// 获取answer片段对应的单句集合
List<Long> noteRecordSplitSentenceIdList = noteRecordSplitList
.stream()
.map(NoteRecordSplitSentence::getId)
.toList();
List<LongTextSingleSentenceSummaryDto> longTextSingleSentenceSummaryDtoList = new ArrayList<>();
List<NoteRecordSplitSentence> splitSentences = noteRecordSplitSentenceService
.lambdaQuery()
.select(NoteRecordSplitSentence::getRecordSplitId)
.in(NoteRecordSplitSentence::getId, noteRecordSplitSentenceIdList)
.groupBy(NoteRecordSplitSentence::getRecordSplitId)
.list();
// 遍历长文本单句
for (NoteRecordSplitSentence noteRecordSplit : splitSentences) {
String noteRecordSplitId = noteRecordSplit.getRecordSplitId();
List<NoteRecordSplitSentence> recordSplitSentenceList = noteRecordSplitSentenceService
.lambdaQuery()
.eq(NoteRecordSplitSentence::getRecordSplitId, noteRecordSplitId)
.in(NoteRecordSplitSentence::getId, noteRecordSplitSentenceIdList)
.orderByAsc(NoteRecordSplitSentence::getId)
.list();
LongTextSingleSentenceSummaryDto longTextSingleSentenceSummaryDto = new LongTextSingleSentenceSummaryDto();
longTextSingleSentenceSummaryDto.setNoteRecordSplitId(noteRecordSplitId);
longTextSingleSentenceSummaryDto.setNoteRecordSplitSentences(recordSplitSentenceList);
longTextSingleSentenceSummaryDtoList.add(longTextSingleSentenceSummaryDto);
}
if (longTextSingleSentenceSummaryDtoList.isEmpty()) {
log.warn("[QaAnswerLongTextTripletExtraction]当前回答下的单句集合不可为空");
return R.fail("当前回答下的长文本单句集合为空");
}
log.info("[QaAnswerLongTextTripletExtraction]当前回答下的单句集合查询成功");
try {
// 遍历单句集合-同语义归纳
List<Future<Map<String, Object>>> futureList = new ArrayList<>();
for (LongTextSingleSentenceSummaryDto longTextSingleSentenceSummaryDto : longTextSingleSentenceSummaryDtoList) {
LongTextTask longTextTask = new LongTextTask(chatClient, longTextSingleSentenceSummaryDto, pieceSentenceSave());
Future<Map<String, Object>> submit = LongtextThreadPool.executorService.submit(longTextTask);
futureList.add(submit);
}
log.info("[QaAnswerLongTextTripletExtraction]:同语义归纳任务成功提交{}个任务....", futureList.size());
} catch (Exception e) {
log.error("[QaAnswerLongTextTripletExtraction]未知异常:", e);
return R.fail("长文本接口未知异常");
} finally {
stopWatch.stop();
log.warn("[QaAnswerLongTextTripletExtraction]主线程程序总耗时:{}", stopWatch.getTotalTimeSeconds());
}
return null;
}
/**
*
*
* @param noteRecordSplitPieceSentence
* @return person- notePromptList-
*/
private Map<String, Object> queryPromptByType(NoteRecordSplitPieceSentence noteRecordSplitPieceSentence) {
log.info("longTextExtractTripleInfo:同语义句类型查询开始");
Map<String, Object> returnMap = new HashMap<>();
// 判断同语义类型是否存在
String pieceSentenceId = noteRecordSplitPieceSentence.getId();
String contentChuck = noteRecordSplitPieceSentence.getContentChuckSummary();
if (null == contentChuck || contentChuck.isEmpty()) {
log.warn("longTextExtractTripleInfo:同语义片段片段:{} 不存在任何分类信息,不进行后续操作...", pieceSentenceId);
return null;
}
// 查询 同语义类型 对应的 提示词集合
List<NotePiecePrompt> notePromptList = notePiecePromptService.listPiecePromptBySplitId(noteRecordSplitPieceSentence);
if (CollUtil.isEmpty(notePromptList)) {
log.warn("longTextExtractTripleInfo:同语义片段:{},分类:{} 不属于任何提示词,不进行后续操作...", pieceSentenceId, contentChuck);
return null;
}
// 查询笔录的案件信息
String recordSplitId = noteRecordSplitPieceSentence.getRecordSplitId();
NoteRecordSplit recordSplit = noteRecordSplitService.lambdaQuery().select(NoteRecordSplit::getCaseId).eq(NoteRecordSplit::getId, recordSplitId).one();
QueryWrapper<CasePerson> wrapper = new QueryWrapper<>();
wrapper.eq("case_id", recordSplit.getCaseId());
wrapper.eq("case_actor_flag", 1);
CasePerson personServiceOne = casePersonService.getOne(wrapper);
returnMap.put("person", personServiceOne);
returnMap.put("notePromptList", notePromptList);
return returnMap;
}
/**
*
*
* @return
*/
private Consumer<Map<String, Object>> pieceSentenceSave() throws Exception {
return (noteMap) -> {
log.info("[QaAnswerLongTextTripletExtraction-Pool-pieceSentenceSave]同语义保存,当前线程是:{}", Thread.currentThread().getName());
String contentChuck;
List<NoteRecordSplitPieceSentence> recordSplitPieceSentences = (List<NoteRecordSplitPieceSentence>) noteMap.get("recordSplitPieceSentences");
List<PieceSentenceIdDto> noteRecordSplitPieceSentenceBySingle = (List<PieceSentenceIdDto>) noteMap.get("noteRecordSplitPieceSentenceBySingle");
// 保存同语义集合
noteRecordSplitPieceSentenceService.saveBatch(recordSplitPieceSentences);
// 更新单语句 的 长语句id
for (PieceSentenceIdDto pieceSentenceIdDto : noteRecordSplitPieceSentenceBySingle) {
List<NoteRecordSplitSentence> recordSplitSentences = getNoteRecordSplitSentences(pieceSentenceIdDto);
noteRecordSplitSentenceService.updateBatchById(recordSplitSentences);
}
// 保存 提示词
NotePiecePrompt piecePrompt = notePiecePromptService.lambdaQuery().eq(NotePiecePrompt::getName, "行为人-担保-xxxx").one();
if (null == piecePrompt) {
NotePiecePrompt notePiecePrompt = getNotePiecePrompt();
notePiecePromptService.save(notePiecePrompt);
piecePrompt = notePiecePrompt;
}
// 更新同语义总结
List<NoteRecordSplitPieceSentence> noteRecordSplitPieceSentences = new ArrayList<>();
List<ModelPieceRecordType> modelPieceRecordTypes = new ArrayList<>();
List<NotePiecePromptTypeRel> notePiecePromptTypeRels = new ArrayList<>();
for (NoteRecordSplitPieceSentence noteRecordSplitPieceSentence : recordSplitPieceSentences) {
String splitPieceSentenceId = noteRecordSplitPieceSentence.getId();
List<NoteRecordSplitSentence> splitSentence = noteRecordSplitSentenceService.lambdaQuery()
.select(NoteRecordSplitSentence::getLlmGenA)
.isNotNull(NoteRecordSplitSentence::getLlmGenA)
.ne(NoteRecordSplitSentence::getLlmGenA, "无")
.eq(NoteRecordSplitSentence::getPieceRecordSplitId, splitPieceSentenceId)
.list();
if (null != splitSentence && !splitSentence.isEmpty()) {
// 更新同语义总结
contentChuck = splitSentence.get(0).getLlmGenA();
} else {
// 重新请求模型生成同语义句子的语义
List<String> noteRecordSplitAnswerList = new ArrayList<>();
noteRecordSplitAnswerList.add(noteRecordSplitPieceSentence.getContentChuck());
contentChuck = ((chatAiLongTextSingleSentenceSummary(PromptsEnum.LONG_TEXT_SINGLE_SENTENCE_SUMMARY, noteRecordSplitAnswerList).get(0)) == null) ? "无"
: (chatAiLongTextSingleSentenceSummary(PromptsEnum.LONG_TEXT_SINGLE_SENTENCE_SUMMARY, noteRecordSplitAnswerList).get(0).getLlmGenA());
}
NoteRecordSplitPieceSentence splitPieceSentence = new NoteRecordSplitPieceSentence();
splitPieceSentence.setId(splitPieceSentenceId);
splitPieceSentence.setContentChuckSummary(contentChuck);
noteRecordSplitPieceSentences.add(splitPieceSentence);
// 类型
String modelPieceRecordTypeId = DefaultIdentifierGenerator.getInstance().nextId(null).toString();
ModelPieceRecordType modelPieceRecordType = new ModelPieceRecordType();
modelPieceRecordType.setId(modelPieceRecordTypeId);
modelPieceRecordType.setRecordType(contentChuck);
modelPieceRecordType.setCreateUserId(UserUtil.getUser().getId());
modelPieceRecordType.setUpdateUserId(UserUtil.getUser().getId());
modelPieceRecordTypes.add(modelPieceRecordType);
// 保存 类型 提示词关系
String notePiecePromptTypeRelId = DefaultIdentifierGenerator.getInstance().nextId(null).toString();
NotePiecePromptTypeRel notePiecePromptTypeRel = new NotePiecePromptTypeRel();
notePiecePromptTypeRel.setId(notePiecePromptTypeRelId);
notePiecePromptTypeRel.setPromptId(piecePrompt.getId());
notePiecePromptTypeRel.setTypeId(modelPieceRecordType.getId());
notePiecePromptTypeRels.add(notePiecePromptTypeRel);
}
// 更新同语义句的总结(类型)
noteRecordSplitPieceSentenceService.updateBatchById(noteRecordSplitPieceSentences);
// 保存同语义总结(类型)
modelPieceRecordTypeService.saveBatch(modelPieceRecordTypes);
// 保存 类型 提示词关系
notePiecePromptTypeRelService.saveBatch(notePiecePromptTypeRels);
log.info("[QaAnswerLongTextTripletExtraction-Pool-pieceSentenceSave]保存类型+总结+提示词成功,当前线程是:{}", Thread.currentThread().getName());
// 12.三元组提取
// 查询同语义句
log.info("[QaAnswerLongTextTripletExtraction-Pool-pieceSentenceSave]开始同语义三元组提取。当前线程是:{}", Thread.currentThread().getName());
List<String> notePieceSentencesIdList = recordSplitPieceSentences.stream().map(NoteRecordSplitPieceSentence::getId).toList();
List<NoteRecordSplitPieceSentence> notePieceSentences = noteRecordSplitPieceSentenceService
.lambdaQuery()
.select(NoteRecordSplitPieceSentence::getId, NoteRecordSplitPieceSentence::getRecordSplitId, NoteRecordSplitPieceSentence::getContentChuck, NoteRecordSplitPieceSentence::getContentChuckSummary)
.in(NoteRecordSplitPieceSentence::getId, notePieceSentencesIdList)
.list();
// 遍历同语义句
for (NoteRecordSplitPieceSentence noteRecordSplitPieceSentence : notePieceSentences) {
Map<String, Object> queryPromptByType = queryPromptByType(noteRecordSplitPieceSentence);
if (null == queryPromptByType) {
log.warn("[QaAnswerLongTextTripletExtraction-Pool-pieceSentenceSave]同语义查询案件信息或提示词为null,noteRecordSplitPieceSentenceId:{},当前线程是:{}", noteRecordSplitPieceSentence.getId(), Thread.currentThread().getName());
continue;
}
CasePerson mainActor = (CasePerson) queryPromptByType.get("person");
List<NotePiecePrompt> notePromptList = (List<NotePiecePrompt>) queryPromptByType.get("notePromptList");
if (null == mainActor || CollUtil.isEmpty(notePromptList)) {
log.warn("[QaAnswerLongTextTripletExtraction-Pool-pieceSentenceSave]该同语义句三元组提示词或案件信息缺失,noteRecordSplitPieceSentenceId:{},当前线程是:{}", noteRecordSplitPieceSentence.getId(), Thread.currentThread().getName());
continue;
}
List<Future<PieceTripleInfo>> futures = new ArrayList<>();
for (NotePiecePrompt notePiecePrompt : notePromptList) {
PieceTripleExtractTask pieceTripleExtractTask = new PieceTripleExtractTask(chatClient, mainActor, notePiecePrompt, noteRecordSplitPieceSentence);
Future<PieceTripleInfo> submit = PieceTripleThreadPool.executorService.submit(pieceTripleExtractTask);
futures.add(submit);
}
List<PieceTripleInfo> tripleInfos = new ArrayList<>();
try {
log.info("[QaAnswerLongTextTripletExtraction-Pool-pieceSentenceSave]当前线程{},同语义片段:{}三元组抽取任务成功提交{}个任务....", Thread.currentThread().getName(), noteRecordSplitPieceSentence.getId(), futures.size());
for (Future<PieceTripleInfo> future : futures) {
PieceTripleInfo tripleInfo = future.get();
if (Objects.nonNull(tripleInfo)) {
tripleInfos.add(tripleInfo);
}
}
// 如果有提取到三元组信息
if (CollUtil.isNotEmpty(tripleInfos)) {
log.info("[QaAnswerLongTextTripletExtraction-Pool-pieceSentenceSave]当前线程{},同语义片段:{}三元组提取任务执行结束...,三元组信息入库:{}", Thread.currentThread().getName(), noteRecordSplitPieceSentence.getId(), JSONUtil.toJsonStr(tripleInfos));
pieceTripleInfoService.saveBatch(tripleInfos);
} else {
log.info("[QaAnswerLongTextTripletExtraction-Pool-pieceSentenceSave]当前线程{},同语义片段:{}三元组提取任务执行结束...,未提取到任何三元组信息...", Thread.currentThread().getName(), noteRecordSplitPieceSentence.getId());
}
} catch (InterruptedException | ExecutionException e) {
log.error("[QaAnswerLongTextTripletExtraction-Pool-pieceSentenceSave]当前线程{},同语义片段:{}三元组提取任务提交失败...", Thread.currentThread().getName(), noteRecordSplitPieceSentence.getId(), e);
throw new RuntimeException(e);
}
}
};
}
/**
*
*
* @param longTextSingleSentenceSummaryDto
*/
private void pieceSentenceNormal(LongTextSingleSentenceSummaryDto longTextSingleSentenceSummaryDto) {
log.info("[pieceSentenceNormal]开始同语义归纳方法");
String contentChuck = "";
// 同语义集合
List<NoteRecordSplitPieceSentence> recordSplitPieceSentences = new ArrayList<>();
// 同语义使用单句id集合
List<PieceSentenceIdDto> noteRecordSplitPieceSentenceBySingle = new ArrayList<>();
// 笔录片段id
String noteRecordSplitId = longTextSingleSentenceSummaryDto.getNoteRecordSplitId();
// 单语句集合
List<NoteRecordSplitSentence> noteRecordSplitSentences = longTextSingleSentenceSummaryDto.getNoteRecordSplitSentences();
int noteRecordSplitSentencesSize = noteRecordSplitSentences.size();
// 获取末尾单句 N+1
NoteRecordSplitSentence endCombinedSentence = noteRecordSplitSentences.get(noteRecordSplitSentencesSize - 1);
Long endCombinedSentenceId = endCombinedSentence.getId();
ConcurrentLinkedDeque<Long> noteRecordSplitPieceSentenceDeque = new ConcurrentLinkedDeque<>();
noteRecordSplitPieceSentenceDeque.add(endCombinedSentenceId);
ConcurrentLinkedDeque<String> endCombinedSentenceDeque = new ConcurrentLinkedDeque<>();
endCombinedSentenceDeque.addLast(endCombinedSentence.getAnswer());
// 遍历单句集合
for (int i = noteRecordSplitSentencesSize - 2; i >= 0; i--) {
PieceSentenceIdDto pieceSentenceIdDto = new PieceSentenceIdDto();
// 获取第N句
NoteRecordSplitSentence currentSentence = noteRecordSplitSentences.get(i);
Long currentSentenceId = currentSentence.getId();
String currentSentenceAnswer = currentSentence.getAnswer();
// 对比句子语义
boolean inductionFlag = chatAiLongTextHomoSemanticInduction(String.valueOf(endCombinedSentenceDeque), currentSentenceAnswer);
if (inductionFlag) {
endCombinedSentenceDeque.addFirst(currentSentenceAnswer);
noteRecordSplitPieceSentenceDeque.addFirst(currentSentenceId);
} else {
NoteRecordSplitPieceSentence pieceSentence = setNotePieceRecordSentence(noteRecordSplitId, endCombinedSentenceDeque);
endCombinedSentenceDeque.remove();
endCombinedSentenceDeque.addLast(currentSentenceAnswer);
List<Long> longList = noteRecordSplitPieceSentenceDeque.stream().toList();
noteRecordSplitPieceSentenceDeque.remove();
noteRecordSplitPieceSentenceDeque.addLast(currentSentenceId);
pieceSentenceIdDto.setNoteRecordSplitPieceSentenceId(pieceSentence.getId());
pieceSentenceIdDto.setNoteRecordSplitSentenceId(longList);
recordSplitPieceSentences.add(pieceSentence);
noteRecordSplitPieceSentenceBySingle.add(pieceSentenceIdDto);
}
}
NoteRecordSplitPieceSentence pieceSentence = setNotePieceRecordSentence(noteRecordSplitId, endCombinedSentenceDeque);
recordSplitPieceSentences.add(pieceSentence);
noteRecordSplitPieceSentenceBySingle.add(new PieceSentenceIdDto(pieceSentence.getId(), noteRecordSplitPieceSentenceDeque.stream().toList()));
// 保存同语义集合
noteRecordSplitPieceSentenceService.saveBatch(recordSplitPieceSentences);
// 更新单语句 的 长语句id
for (PieceSentenceIdDto pieceSentenceIdDto : noteRecordSplitPieceSentenceBySingle) {
List<NoteRecordSplitSentence> recordSplitSentences = getNoteRecordSplitSentences(pieceSentenceIdDto);
noteRecordSplitSentenceService.updateBatchById(recordSplitSentences);
}
// 保存 提示词
NotePiecePrompt piecePrompt = notePiecePromptService.lambdaQuery().eq(NotePiecePrompt::getName, "行为人-担保-xxxx").one();
if (null == piecePrompt) {
NotePiecePrompt notePiecePrompt = getNotePiecePrompt();
notePiecePromptService.save(notePiecePrompt);
piecePrompt = notePiecePrompt;
}
// 更新同语义总结
List<NoteRecordSplitPieceSentence> noteRecordSplitPieceSentences = new ArrayList<>();
List<ModelPieceRecordType> modelPieceRecordTypes = new ArrayList<>();
List<NotePiecePromptTypeRel> notePiecePromptTypeRels = new ArrayList<>();
for (NoteRecordSplitPieceSentence noteRecordSplitPieceSentence : recordSplitPieceSentences) {
String splitPieceSentenceId = noteRecordSplitPieceSentence.getId();
List<NoteRecordSplitSentence> splitSentence = noteRecordSplitSentenceService.lambdaQuery()
.select(NoteRecordSplitSentence::getLlmGenA)
.isNotNull(NoteRecordSplitSentence::getLlmGenA)
.ne(NoteRecordSplitSentence::getLlmGenA, "无")
.eq(NoteRecordSplitSentence::getPieceRecordSplitId, splitPieceSentenceId)
.list();
if (null != splitSentence && !splitSentence.isEmpty()) {
// 更新同语义总结
contentChuck = splitSentence.get(0).getLlmGenA();
} else {
// 重新请求模型生成同语义句子的语义
List<String> noteRecordSplitAnswerList = new ArrayList<>();
noteRecordSplitAnswerList.add(noteRecordSplitPieceSentence.getContentChuck());
contentChuck = ((chatAiLongTextSingleSentenceSummary(PromptsEnum.LONG_TEXT_SINGLE_SENTENCE_SUMMARY, noteRecordSplitAnswerList).get(0)) == null) ? "无"
: (chatAiLongTextSingleSentenceSummary(PromptsEnum.LONG_TEXT_SINGLE_SENTENCE_SUMMARY, noteRecordSplitAnswerList).get(0).getLlmGenA());
}
NoteRecordSplitPieceSentence splitPieceSentence = new NoteRecordSplitPieceSentence();
splitPieceSentence.setId(splitPieceSentenceId);
splitPieceSentence.setContentChuckSummary(contentChuck);
noteRecordSplitPieceSentences.add(splitPieceSentence);
// 类型
String modelPieceRecordTypeId = DefaultIdentifierGenerator.getInstance().nextId(null).toString();
ModelPieceRecordType modelPieceRecordType = new ModelPieceRecordType();
modelPieceRecordType.setId(modelPieceRecordTypeId);
modelPieceRecordType.setRecordType(contentChuck);
modelPieceRecordType.setCreateUserId(UserUtil.getUser().getId());
modelPieceRecordType.setUpdateUserId(UserUtil.getUser().getId());
modelPieceRecordTypes.add(modelPieceRecordType);
// 保存 类型 提示词关系
String notePiecePromptTypeRelId = DefaultIdentifierGenerator.getInstance().nextId(null).toString();
NotePiecePromptTypeRel notePiecePromptTypeRel = new NotePiecePromptTypeRel();
notePiecePromptTypeRel.setId(notePiecePromptTypeRelId);
notePiecePromptTypeRel.setPromptId(piecePrompt.getId());
notePiecePromptTypeRel.setTypeId(modelPieceRecordType.getId());
notePiecePromptTypeRels.add(notePiecePromptTypeRel);
}
// 更新同语义句的总结(类型)
noteRecordSplitPieceSentenceService.updateBatchById(noteRecordSplitPieceSentences);
// 保存同语义总结(类型)
modelPieceRecordTypeService.saveBatch(modelPieceRecordTypes);
// 保存 类型 提示词关系
notePiecePromptTypeRelService.saveBatch(notePiecePromptTypeRels);
log.info("[pieceSentenceNormal]关系已保存");
}
/**
*
*
* @return
*/
private NotePiecePrompt getNotePiecePrompt() {
NotePiecePrompt notePiecePrompt = new NotePiecePrompt();
notePiecePrompt.setStartEntityType("行为人");
notePiecePrompt.setRelType("担保");
notePiecePrompt.setEndEntityType("xxxx");
notePiecePrompt.setPrompt(PromptsEnum.LONG_TEXT_TRIPLE_INFO.getContent());
notePiecePrompt.setStartEntityTemplate("headEntityType");
notePiecePrompt.setRelTemplate("relation");
notePiecePrompt.setEndEntityTemplate("tailEntityType");
notePiecePrompt.setName("行为人-担保-xxxx");
notePiecePrompt.setCreateUserId(UserUtil.getUser().getId());
notePiecePrompt.setUpdateUserId(UserUtil.getUser().getId());
return notePiecePrompt;
}
/**
* @param prompt
* @param noteRecordSplitAnswerList
* @return
*/
public List<NoteRecordSplitSentence> chatAiLongTextSingleSentenceSummary(PromptsEnum prompt, List<String> noteRecordSplitAnswerList) {
List<NoteRecordSplitSentence> noteRecordSplitSentenceArrayList = new ArrayList<>();
StopWatch stopWatch = new StopWatch();
// 分析同语义集合
stopWatch.start();
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("noteRecordSplitList", noteRecordSplitAnswerList);
String format = StrUtil.format(prompt.getContent(), paramMap);
ChatResponse call = chatClient.call(new Prompt(new UserMessage(format)));
stopWatch.stop();
log.warn("[QaAnswerLongTextTripletExtraction-chatAiLongTextSingleSentenceSummary]长文本单句总结集合模型耗时:{}", stopWatch.getTotalTimeSeconds());
String content = call.getResult().getOutput().getContent();
JSONObject jsonObject = JSON.parseObject(content);
Object object = jsonObject.get("result");
JSONArray jsonArray = JSONArray.parseArray(object.toString());
List<Object> list = jsonArray.stream().toList();
try {
for (Object listObject : list) {
NoteRecordSplitSentence noteRecordSplitSentence = JSONUtil.toBean(String.valueOf(listObject), NoteRecordSplitSentence.class);
noteRecordSplitSentenceArrayList.add(noteRecordSplitSentence);
}
} catch (Exception e) {
log.error("[QaAnswerLongTextTripletExtraction-chatAiLongTextSingleSentenceSummary]长文本单句总结集合模型转换错误");
throw new RuntimeException(e);
}
return noteRecordSplitSentenceArrayList;
}
/**
*
*
* @param noteRecordSplits
* @return
*/
private List<NoteRecordSplitSentence> matcherLongText(List<NoteRecordSplit> noteRecordSplits) {
// 定义正则表达式,匹配“:”,“:”
String regexSplit = "[:]";
// 长文本段落集合
List<NoteRecordSplitSentence> noteRecordSplitList = new ArrayList<>();
// 回答中匹配的长文本段落
String paragraph = null;
for (NoteRecordSplit noteRecordSplit : noteRecordSplits) {
String noteRecordSplitId = noteRecordSplit.getId();
String answer = noteRecordSplit.getAnswer();
if (StringUtils.isEmpty(answer)) {
continue;
}
// 使用 Pattern 和 Matcher 类进行匹配
Pattern pattern = Pattern.compile(regexSplit);
Matcher matcher = pattern.matcher(answer);
boolean isMatch = matcher.find();
if (isMatch) {
String[] answerSplit = answer.split(regexSplit);
paragraph = answerSplit[1];
if (StringUtils.isEmpty(paragraph)) {
continue;
}
}
List<String> splitSentences = splitSentences(paragraph);
int paragraphChar = paragraph.replace("\n", "")
.replace("\t", "")
.replace("\s", "")
.trim().length();
if (splitSentences.size() > 5 || paragraphChar > 100) {
// 长文本
for (String sentence : splitSentences) {
NoteRecordSplitSentence noteRecordSplitSentence = new NoteRecordSplitSentence();
noteRecordSplitSentence.setRecordSplitId(noteRecordSplitId);
noteRecordSplitSentence.setAnswer(sentence);
noteRecordSplitSentence.setCreateUserId(UserUtil.getUser().getId());
noteRecordSplitSentence.setUpdateUserId(UserUtil.getUser().getId());
noteRecordSplitList.add(noteRecordSplitSentence);
}
}
}
return noteRecordSplitList;
}
/**
*
*
* @param paragraph
* @return
*/
private List<String> splitSentences(String paragraph) {
List<String> sentences = new ArrayList<>();
StringBuilder currentSentence = new StringBuilder();
for (char c : paragraph.toCharArray()) {
if (c == '。' || c == '' || c == '' || c == '.' || c == '?' || c == '!') {
sentences.add(currentSentence.append(c).toString().trim());
currentSentence.setLength(0);
} else {
currentSentence.append(c);
}
}
// 处理段落末尾可能没有标点符号的情况
if (!currentSentence.isEmpty()) {
sentences.add(currentSentence.toString().trim());
}
return sentences;
}
/**
* @param encCombinedSentence N+1
* @param currentSentence N
* @return
*/
private boolean chatAiLongTextHomoSemanticInduction(String encCombinedSentence, String currentSentence) {
StopWatch stopWatch = new StopWatch();
// 分析同语义集合
stopWatch.start();
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("encCombinedSentence", encCombinedSentence);
paramMap.put("currentSentence", currentSentence);
String format = StrUtil.format(PromptsEnum.LONG_TEXT_SINGLE_STATEMENT_WITH_SEMANTIC_JUDGMENT_PROMPT_WORD.getContent(), paramMap);
ChatResponse call = chatClient.call(new Prompt(new UserMessage(format)));
stopWatch.stop();
String content = call.getResult().getOutput().getContent();
JSONObject jsonObject = JSON.parseObject(content);
boolean result = (boolean) jsonObject.get("result");
return result;
}
/**
*
*
* @param noteRecordSplitId id
* @param endSentenceDequeStringDeque
* @return
*/
public NoteRecordSplitPieceSentence setNotePieceRecordSentence(String noteRecordSplitId, ConcurrentLinkedDeque<String> endSentenceDequeStringDeque) {
StringBuilder endSentenceDequeStringBuilder = new StringBuilder();
for (String endSentenceDeque : endSentenceDequeStringDeque) {
endSentenceDequeStringBuilder.append(endSentenceDeque);
}
String endSentenceDequeStringBuilderString = String.valueOf(endSentenceDequeStringBuilder);
String noteRecordSplitPieceSentenceId = DefaultIdentifierGenerator.getInstance().nextId(null).toString();
NoteRecordSplitPieceSentence noteRecordSplitPieceSentence = new NoteRecordSplitPieceSentence();
noteRecordSplitPieceSentence.setId(noteRecordSplitPieceSentenceId);
noteRecordSplitPieceSentence.setCreateUserId(UserUtil.getUser().getId());
noteRecordSplitPieceSentence.setUpdateUserId(UserUtil.getUser().getId());
noteRecordSplitPieceSentence.setRecordSplitId(noteRecordSplitId);
noteRecordSplitPieceSentence.setContentChuck(endSentenceDequeStringBuilderString);
return noteRecordSplitPieceSentence;
}
/**
*
*
* @return
*/
public R<Object> singlePointCheck() {
// 检测上个线程池中是否有未完成的任务
ThreadPoolExecutor longTextExecutorService = LongtextThreadPool.executorService;
ThreadPoolExecutor pieceTripleExecutorService = PieceTripleThreadPool.executorService;
int longTextActiveCount = longTextExecutorService.getActiveCount();
boolean longTextEmpty = longTextExecutorService.getQueue().isEmpty();
int pieceTripleActiveCount = pieceTripleExecutorService.getActiveCount();
boolean pieceTripleTextEmpty = longTextExecutorService.getQueue().isEmpty();
if ((longTextActiveCount != 0 || !longTextEmpty) || (pieceTripleActiveCount != 0 || !pieceTripleTextEmpty)) {
log.error("[QaAnswerLongTextTripletExtraction-threadPoolExecutorCheck]线程池中有未完成的任务,请稍后再试");
return R.fail("操作过快,请稍后再试");
}
return null;
}
/**
*
*
* @param pieceSentenceIdDto
* @return
*/
private List<NoteRecordSplitSentence> getNoteRecordSplitSentences(PieceSentenceIdDto pieceSentenceIdDto) {
String noteRecordSplitPieceSentenceId = pieceSentenceIdDto.getNoteRecordSplitPieceSentenceId();
List<Long> noteRecordSplitSentenceId = pieceSentenceIdDto.getNoteRecordSplitSentenceId();
List<NoteRecordSplitSentence> recordSplitSentences = new ArrayList<>();
for (Long recordSplitSentenceId : noteRecordSplitSentenceId) {
NoteRecordSplitSentence noteRecordSplitSentence = new NoteRecordSplitSentence();
noteRecordSplitSentence.setId(recordSplitSentenceId);
noteRecordSplitSentence.setPieceRecordSplitId(noteRecordSplitPieceSentenceId);
recordSplitSentences.add(noteRecordSplitSentence);
}
return recordSplitSentences;
}
}

@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.constant.DataStatus;
import com.supervision.police.domain.ModelAtomicIndex;
import com.supervision.police.domain.ModelIndex;
import com.supervision.police.dto.AtomicIndexUsedDTO;
import com.supervision.police.dto.JudgeLogic;
import com.supervision.police.dto.ModelIndexDTO;
import com.supervision.police.mapper.ModelAtomicIndexMapper;
@ -82,9 +81,4 @@ public class ModelAtomicIndexServiceImpl extends ServiceImpl<ModelAtomicIndexMap
modelIndexService.lambdaUpdate().eq(ModelIndex::getId, modelIndexDTO.getId()).set(ModelIndex::getJudgeLogic, modelIndexDTO.getJudgeLogic()).update();
});
}
@Override
public List<AtomicIndexUsedDTO> atomicUsed(String atomicIndexId) {
return super.getBaseMapper().atomicUsed(atomicIndexId);
}
}

@ -7,20 +7,7 @@ import com.supervision.police.service.ModelAtomicResultService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class ModelAtomicResultServiceImpl extends ServiceImpl<ModelAtomicResultMapper, ModelAtomicResult> implements ModelAtomicResultService {
@Override
public List<ModelAtomicResult> queryByCaseIdForUpdate(String caseId) {
return super.getBaseMapper().queryByCaseIdForUpdate(caseId);
}
@Override
public void replaceResultCaseId(String oldCaseId, String newCaseId) {
super.lambdaUpdate().eq(ModelAtomicResult::getCaseId, oldCaseId)
.set(ModelAtomicResult::getCaseId, newCaseId).update();
}
}

@ -60,10 +60,10 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
private final CaseStatusManageService caseStatusManageService;
private final LangChainChatService langChainChatService;
private final ModelAtomicResultService modelAtomicResultService;
@Autowired
private ScoringModelInfoService modelInfoService;
@Autowired
private NoteRecordSplitService noteRecordSplitService;
@ -79,9 +79,6 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
@Autowired
private DifyApiUtil difyApiUtil;
@Autowired
private ModelIndexResultService modelIndexResultService;
/**
*
*
@ -106,14 +103,13 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
Map<String, Map<String, List<CasePerson>>> persionMap = casePersonList.stream().collect(Collectors.groupingBy(CasePerson::getCaseId,
Collectors.groupingBy(person -> NumberUtil.equals(person.getCaseActorFlag(), 1) ? "1" : "2")));
List<ComDictionary> dicts = comDictionaryService.list();
List<ScoringModelInfo> scoringModelInfos = modelInfoService.list();
return modelCaseIPage.convert(modelCaseInfo -> {
ModelCaseDTO modelCaseDTO = BeanUtil.toBean(modelCaseInfo, ModelCaseDTO.class, CopyOptions.create().setIgnoreProperties("lawActor"));
String[] caseTypes = modelCaseDTO.getCaseType().split(",");
List<String> caseType = new ArrayList<>();
for (String type : caseTypes) {
caseType.add(modelInfoService.getScoringModelNameById(type, scoringModelInfos));
caseType.add(comDictionaryService.getName(dicts, "case_type", type));
}
if (StrUtil.isEmpty(modelCaseDTO.getCaseStatus())) {
modelCaseDTO.setCaseStatus("1");
@ -167,15 +163,6 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
if (!StrUtil.equals(exist.getCaseNo(), modelCase.getCaseNo())) {
throw new BusinessException("案件编号不允许修改");
}
if (!StrUtil.equals(exist.getCaseType(), modelCase.getCaseType())) {
// 案件类型发生改变,清除指标结果数据
modelIndexResultService.removeByCaseId(modelCase.getId());
modelAtomicResultService.replaceResultCaseId(exist.getCaseType(), modelCase.getCaseType());
modelCase.setTotalScore(null);
modelCase.setCaseAnalysisStatus(0);
modelCase.setCaseAnalysisSuccessTime(null);
modelCase.setIdentifyResult(null);
}
i = modelCaseMapper.updateById(modelCase);
} else {
@ -386,16 +373,11 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
Assert.notEmpty(query.getCaseId(), "案件id不能为空");
Assert.notEmpty(query.getIndexType(), "指标类型不能为空");
ModelCase modelCase = super.getById(query.getCaseId());
Assert.notNull(modelCase, "案件不存在");
Assert.notEmpty(modelCase.getCaseType(), "案件类型不能为空");
query.setCaseType(modelCase.getCaseType());
IPage<IndexDetail> iPage = modelCaseMapper.pageListIndexResult(query, Page.of(pageNum, pageSize));
List<IndexDetail> records = iPage.getRecords();
// 添加 附属内容
attachRecord(query, records);
attachRecord(query.getCaseId(), records);
return iPage;
}
@ -480,24 +462,17 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
return recordFileIds.stream().distinct().toList();
}
@Override
public boolean scoringModelIsUsed(String modelId) {
return super.lambdaQuery().eq(ModelCase::getCaseType, modelId).exists();
}
/**
*
*
* @param query
* @param caseId id
* @param indexDetails
*/
private void attachRecord(IndexResultQuery query, List<IndexDetail> indexDetails) {
private void attachRecord(String caseId, List<IndexDetail> indexDetails) {
if (CollUtil.isEmpty(indexDetails)) {
return;
}
String caseId = query.getCaseId();
// indexDetails中涉及到的原子指标结果数据
List<String> indexIdList = indexDetails.stream().map(IndexDetail::getIndexId).toList();
@ -532,14 +507,6 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
record.setNewFlagValue();
List<String> atomicIndexIds = IndexRuleUtil.getAtomicIndexIds(record.getIndexRule());
List<AtomicIndexDTO> atomics = modelCaseMapper.getAtomicDetail(caseId, record.getIndexId(), atomicIndexIds);
if (Objects.nonNull(query.getIndexHasRecord())){
atomics = atomics.stream()
.filter(atomic -> query.getIndexHasRecord()
? StrUtil.isNotEmpty(atomic.getRecordSplitId())
: StrUtil.isEmpty(atomic.getRecordSplitId()))
.toList();
}
for (AtomicIndexDTO atomic : atomics) {
// 获取原子指标的判断规则
// 配置的指标的逻辑
@ -555,6 +522,31 @@ public class ModelCaseServiceImpl extends ServiceImpl<ModelCaseMapper, ModelCase
atomic.setParentIndexName(record.getIndexName());
}
// ===================================↑新方法=====================================
// ===================================↓老方法=====================================
// if (StringUtils.isEmpty(record.getJudgeLogic())) {
// continue;
// }
// // 是否是新的结果
// record.setNewFlagValue();
//
// List<String> atomicIds = JudgeLogicUtil.pickAtomicIndexIds(record.getJudgeLogic());
// List<AtomicIndexDTO> atomics = modelCaseMapper.getAtomicDetail(caseId, record.getIndexId(), atomicIds);
// for (AtomicIndexDTO atomic : atomics) {
// // 获取原子指标的判断规则
// // 配置的指标的逻辑
// Map<String, String> indexJundgeLogicMap = parseLogicMap(record.getJudgeLogic());
// // 需要和原子指标的规则判断是否一致(解决出罪和入罪冲突的问题)
// String relationalSymbol = indexJundgeLogicMap.get(atomic.getAtomicIndexId());
//
// atomic.judgeWithIndexResult(relationalSymbol);
// atomic.setSegmentation(nodeRecordSpliteMap);
// atomic.setRecordIfSegmentationAbsent("无");
// List<ModelAtomicResult> filterAtomicResultList = atomicResultList.stream().filter(v -> StrUtil.equals(record.getIndexId(), v.getIndexId())).toList();
// List<EvidentIndexResultDTO> evidentResult = getEvidentResult(filterAtomicResultList, caseEvidenceList, rootDirectory);
// atomic.setEvidentResultList(evidentResult);
// }
record.setChildren(atomics);
record.setRecordValue();

@ -86,15 +86,6 @@ public class ModelIndexAtomicRelationServiceImpl extends ServiceImpl<ModelIndexA
}
super.remove(new LambdaQueryWrapper<ModelIndexAtomicRelation>().eq(ModelIndexAtomicRelation::getModelIndexId, modelIndexId));
}
@Override
public void deleteByIndexIds(List<String> indexIds) {
if (indexIds.isEmpty()){
log.warn("deleteByIndexIds: indexIds 为空,不删除关联关系....indexIds:{}", JSONUtil.toJsonStr(indexIds));
return;
}
super.lambdaUpdate().in(ModelIndexAtomicRelation::getModelIndexId, indexIds).remove();
}
}

@ -1,19 +0,0 @@
package com.supervision.police.service.impl;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.police.domain.ModelIndexResult;
import com.supervision.police.mapper.ModelIndexResultMapper;
import com.supervision.police.service.ModelIndexResultService;
import org.springframework.stereotype.Service;
@Service
public class ModelIndexResultServiceImpl extends ServiceImpl<ModelIndexResultMapper, ModelIndexResult>
implements ModelIndexResultService {
@Override
public void removeByCaseId(String caseId) {
Assert.notEmpty(caseId, "案件id不能为空");
super.lambdaUpdate().eq(ModelIndexResult::getCaseId, caseId).remove();
}
}

@ -46,10 +46,11 @@ import org.neo4j.driver.internal.InternalNode;
import org.neo4j.driver.internal.InternalRelationship;
import org.neo4j.driver.types.Node;
import org.neo4j.driver.types.Relationship;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;
@ -91,9 +92,6 @@ public class ModelIndexServiceImpl extends ServiceImpl<ModelIndexMapper, ModelIn
private final Neo4jService neo4jService;
@Autowired
private ScoringModelInfoService scoringModelInfoService;
@Override
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
public R<?> selectAll(ModelIndexReqVO modelIndex, Integer page, Integer size) {
@ -125,12 +123,11 @@ public class ModelIndexServiceImpl extends ServiceImpl<ModelIndexMapper, ModelIn
// 分页查询
List<ModelIndex> records = iPage.getRecords();
List<ComDictionary> dicts = comDictionaryService.list();
List<ScoringModelInfo> scoringModelInfoList = scoringModelInfoService.list();
// 查询结果拼装
for (ModelIndex index : records) {
index.setIndexTypeName(comDictionaryService.getName(dicts, "index_type", index.getIndexType()));
index.setCaseTypeName(scoringModelInfoService.getScoringModelNameById(index.getCaseType(), scoringModelInfoList));
index.setCaseTypeName(comDictionaryService.getName(dicts, "case_type", index.getCaseType()));
//原子指标
String judgeLogic = index.getJudgeLogic();
Set<String> ids = new HashSet<>();
@ -196,20 +193,6 @@ public class ModelIndexServiceImpl extends ServiceImpl<ModelIndexMapper, ModelIn
}
}
@Override
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
public void deleteModelIndexByCaseType(String caseType) {
Assert.notEmpty(caseType, "模型类型不能为空");
List<ModelIndex> modelIndexList = super.lambdaQuery().eq(ModelIndex::getCaseType, caseType).list();
if (CollUtil.isEmpty(modelIndexList)) {
log.info("deleteModelIndexByCaseType:未查询到模型类型:{}的指标", caseType);
return;
}
super.lambdaUpdate().eq(ModelIndex::getCaseType, caseType).remove();
modelIndexAtomicRelationService.deleteByIndexIds(modelIndexList.stream().map(ModelIndex::getId).toList());
}
@Override
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
public R<?> selectAllAtomic(ModelAtomicIndex modelAtomicIndex, Integer page, Integer size) {
@ -219,9 +202,8 @@ public class ModelIndexServiceImpl extends ServiceImpl<ModelIndexMapper, ModelIn
List<ComDictionary> dicts = comDictionaryService.list();
String caseType = StrUtil.isNotEmpty(modelAtomicIndex.getCaseType()) ? modelAtomicIndex.getCaseType() : NotePromptConstants.CASE_TYPE_ENGINEERING_CONTRACT_FRAUD;
EvidenceCategoryDTO rootCategory = new EvidenceCategoryDTO(evidenceCategoryService.listCategoryTree(caseType));
List<ScoringModelInfo> scoringModelInfoList = scoringModelInfoService.list();
for (ModelAtomicIndex index : records) {
index.setCaseTypeName(scoringModelInfoService.getScoringModelNameById(index.getCaseType(), scoringModelInfoList));
index.setCaseTypeName(comDictionaryService.getName(dicts, "case_type", index.getCaseType()));
index.setIndexSourceName(comDictionaryService.getName(dicts, "index_source", index.getIndexSource()));
index.setRecordTypeName(comDictionaryService.getName(dicts, "record_type", index.getRecordType()));
index.setCategoryIdPath(rootCategory.listCategoryIdPath(index.getCategoryId()));
@ -243,7 +225,7 @@ public class ModelIndexServiceImpl extends ServiceImpl<ModelIndexMapper, ModelIn
if (ObjectUtil.isNotEmpty(existIndex) && !StringUtils.equals(modelAtomicIndex.getId(), existIndex.getId())) {
throw new IllegalArgumentException("已存在相同名称的原子指标");
}
modelAtomicIndex.setCaseType(null);
boolean success = modelAtomicIndexService.saveOrUpdate(modelAtomicIndex);
return success ? R.okMsg("保存成功") : R.fail("保存失败");
}
@ -481,9 +463,6 @@ public class ModelIndexServiceImpl extends ServiceImpl<ModelIndexMapper, ModelIn
// 尝试转换为图形数据
Pair<List<WebRelDTO>, List<Map<String, String>>> pair = this.neo4jService.mergeRecord(generateNodes(records), generateRelations(records));
graphDebugResVO.setGraphRelList(pair.getKey());
// 移除没有关系的图节点
pair.getValue().removeIf(node -> pair.getKey().stream().noneMatch(
rel -> StrUtil.equals(rel.getSource(), node.get("id")) || StrUtil.equals(rel.getTarget(), node.get("id"))));
graphDebugResVO.setGraphNodeList(pair.getValue());
List<Map<String, Object>> collect = graphDebugResVO.getGraphRelList().stream().collect(Collectors.groupingBy(WebRelDTO::getName, Collectors.counting()))
@ -498,56 +477,6 @@ public class ModelIndexServiceImpl extends ServiceImpl<ModelIndexMapper, ModelIn
return graphDebugResVO;
}
@Override
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
public void copyIndex(String oldModelId, String newModelId) {
Assert.notEmpty(oldModelId, "原模型id不能为空");
Assert.notEmpty(newModelId, "新模型id不能为空");
List<ModelIndex> modelIndexList = super.lambdaQuery().eq(ModelIndex::getCaseType, oldModelId).eq(ModelIndex::getDataStatus, "1").list();
if (CollUtil.isEmpty(modelIndexList)){
log.info("copyIndex:未查询到原模型id:{}的指标", oldModelId);
return;
}
for (ModelIndex modelIndex : modelIndexList) {
ModelIndex newIndex = modelIndexCopy(modelIndex,newModelId);
modelIndexMapper.insert(newIndex);
modelIndexAtomicRelationService.saveByModelIndex(newIndex);
}
}
@Override
public List<AtomicIndexUsedDTO> atomicUsed(String atomicIndexId) {
Assert.notEmpty(atomicIndexId, "原子指标id不能为空");
List<AtomicIndexUsedDTO> atomicUsed = modelAtomicIndexService.atomicUsed(atomicIndexId);
// 根据指标id和案件类型id进行去重
return atomicUsed.stream().filter(dto -> StrUtil.isNotEmpty(dto.getIndexId()))
.collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(o -> o.getIndexId() + "-" + o.getModelId()))), ArrayList::new));
}
/**
*
* @param modelIndex
* @param caseType
* @return
*/
private ModelIndex modelIndexCopy(ModelIndex modelIndex,String caseType) {
ModelIndex newIndex = new ModelIndex();
newIndex.setName(modelIndex.getName());
newIndex.setShortName(modelIndex.getShortName());
newIndex.setRemark(modelIndex.getRemark());
newIndex.setIndexType(modelIndex.getIndexType());
newIndex.setIndexScore(modelIndex.getIndexScore());
newIndex.setAtomicIndexNum(modelIndex.getAtomicIndexNum());
newIndex.setCaseType(caseType);
newIndex.setJudgeLogic(modelIndex.getJudgeLogic());
newIndex.setIndexRule(modelIndex.getIndexRule());
newIndex.setDataStatus(modelIndex.getDataStatus());
return newIndex;
}
private List<WebRelDTO> generateRelations(List<Record> records) {

@ -0,0 +1,20 @@
package com.supervision.police.service.impl;
import com.supervision.police.domain.ModelPieceRecordType;
import com.supervision.police.mapper.ModelPieceRecordTypeMapper;
import com.supervision.police.service.ModelPieceRecordTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-11
*/
@Service
public class ModelPieceRecordTypeServiceImpl extends ServiceImpl<ModelPieceRecordTypeMapper, ModelPieceRecordType> implements ModelPieceRecordTypeService {
}

@ -48,6 +48,9 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl<ModelRecordTypeMappe
private final Neo4jService neo4jService;
private final OllamaChatClient chatClient;
private final NotePromptTypeRelService notePromptTypeRelService;
private final CaseTaskRecordService caseTaskRecordService;
@ -158,7 +161,7 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl<ModelRecordTypeMappe
boolean save;
if (StringUtils.isEmpty(prompt.getId())) {
// 新增的时候,校验是否已经存在相同的三元组关系,如果已经存在了相同的三元组关系,不允许添加
if (checkHasSameTriple(prompt.findHeadEntityValue(), prompt.findRelationValue(), prompt.findTailEntityValue(), null)) {
if (checkHasSameTriple(prompt.getStartEntityType(), prompt.getRelType(), prompt.getEndEntityType(), null)) {
return R.fail("已存在相同的三元组关系,不允许添加");
}
save = notePromptService.save(prompt);
@ -170,7 +173,7 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl<ModelRecordTypeMappe
notePromptTypeRelService.save(rel);
}
} else {
if (checkHasSameTriple(prompt.findHeadEntityValue(), prompt.findRelationValue(), prompt.findTailEntityValue(), prompt.getId())) {
if (checkHasSameTriple(prompt.getStartEntityType(), prompt.getRelType(), prompt.getEndEntityType(), prompt.getId())) {
return R.fail("已存在相同的三元组关系,不允许添加");
}
save = notePromptService.updateById(prompt);
@ -334,8 +337,7 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl<ModelRecordTypeMappe
for (TripleInfo tripleInfo : tripleInfos) {
try {
TripleInfo neo4jTripleInfo = neo4jService.saveTripleInfo(tripleInfo);
neo4jTripleInfo.setAddNeo4j("1");
tripleInfoService.saveOrUpdateByBusiness(neo4jTripleInfo);
tripleInfoService.updateNeo4jFlag(List.of(neo4jTripleInfo.getId()), "1");
} catch (Exception e) {
log.error(e.getMessage(), e);
}
@ -353,14 +355,20 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl<ModelRecordTypeMappe
if (ObjectUtil.isNotEmpty(tripleInfo.getRelGraphId())) {
// 先移除关系
neo4jService.deleteRel(tripleInfo.getRelGraphId());
} else {
break;
}
if (ObjectUtil.isNotEmpty(tripleInfo.getEndNodeGraphId())) {
// 再移除尾节点
neo4jService.delNode(tripleInfo.getEndNodeGraphId());
} else {
break;
}
if (ObjectUtil.isNotEmpty(tripleInfo.getStartNodeGraphId())) {
// 尝试删除头节点(只有头节点不存在任何关系的时候才进行删除)
neo4jService.deleteNoRelationNode(tripleInfo.getStartNodeGraphId());
} else {
break;
}
// 更新状态
tripleInfoService.lambdaUpdate().set(TripleInfo::getAddNeo4j, "0")

@ -86,7 +86,7 @@ public class ModelServiceImpl implements ModelService {
private final ModelIndexAtomicRelationService modelIndexAtomicRelationService;
private final ModelAtomicIndexService modelAtomicIndexService;
private final NoteRecordService noteRecordService;
@Autowired
private NotePromptService notePromptService;
@ -127,7 +127,7 @@ public class ModelServiceImpl implements ModelService {
log.error("未找到指标信息:【{}】", modelCase.getCaseType());
return R.fail("未找到指标信息");
}
List<ModelAtomicIndex> atomicIndices = modelAtomicIndexService.listCaseAtomicIndex(null, modelCase.getCaseType(), null);
List<ModelAtomicIndex> atomicIndices = modelAtomicIndexMapper.selectByCaseType(modelCase.getCaseType());
if (atomicIndices.isEmpty()) {
log.error("未找到原子指标信息:【{}】", modelCase.getCaseType());
return R.fail("未找到原子指标信息");
@ -159,7 +159,7 @@ public class ModelServiceImpl implements ModelService {
// 将原先的值进行赋值,设置到pre_result
modelIndexResultMapper.updatePreResult(analyseCaseDTO.getCaseId());
List<ModelAtomicResult> modelAtomicResultList = modelAtomicResultService.queryByCaseIdForUpdate(caseId);
List<ModelAtomicResult> modelAtomicResultList = modelAtomicResultService.lambdaQuery().eq(ModelAtomicResult::getCaseId, caseId).list();
log.info("开始计算指标结果");
// 遍历指标集合,处理每个指标的判断逻辑,得出结果
modelIndices.forEach(modelIndex -> {
@ -371,7 +371,7 @@ public class ModelServiceImpl implements ModelService {
String recordSplitIdJoin = res.stream().filter(r ->
StringUtils.isNotEmpty(r.getRelId())
&& StringUtils.isNotEmpty(r.getRecordSplitId()))
.map(ResultDTO::getRecordSplitId).distinct().collect(Collectors.joining(","));
.map(ResultDTO::getRecordSplitId).collect(Collectors.joining(","));
atomicResult.setRecordSplitId(recordSplitIdJoin);
}
}

@ -9,13 +9,15 @@ import com.supervision.police.domain.ModelCase;
import com.supervision.police.domain.TaskCaseRecord;
import com.supervision.police.dto.AnalyseCaseDTO;
import com.supervision.police.dto.CaseProcessDTO;
import com.supervision.police.dto.TaskInfoDTO;
import com.supervision.police.service.*;
import com.supervision.police.vo.CaseProcessReqVO;
import com.supervision.police.vo.TaskInfoReqVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@ -29,20 +31,28 @@ public class MroServiceImpl implements MroService {
private final ModelService modelService;
private final CaseStatusManageService caseStatusManageService;
private final TaskCaseRecordService caseRecordService;
private final TaskRecordService taskRecordService;
@Override
public IPage<CaseProcessDTO> queryCaseList(CaseProcessReqVO caseProcessReqVO, Integer page, Integer size) {
Page<ModelCase> paged = modelCaseService.lambdaQuery()
.eq(ModelCase::getDataStatus, "1")
.like(StrUtil.isNotEmpty(caseProcessReqVO.getCaseName()), ModelCase::getCaseName, caseProcessReqVO.getCaseName())
.in(CollUtil.isNotEmpty(caseProcessReqVO.getIdentifyResult()), ModelCase::getIdentifyResult, caseProcessReqVO.getIdentifyResult())
.in(CollUtil.isNotEmpty(caseProcessReqVO.getAnalysisStatus()), ModelCase::getCaseAnalysisStatus, caseProcessReqVO.getAnalysisStatus())
.orderBy(true, StrUtil.equalsIgnoreCase(caseProcessReqVO.getSort(), "desc"), ModelCase::getCaseAnalysisSuccessTime)
.page(Page.of(page, size));
return paged.convert(CaseProcessDTO::new);
final Set<String> processCaseIds = new HashSet<>();
if (!paged.getRecords().isEmpty()){
caseRecordService.queryProcessingTaskList().stream().map(TaskCaseRecord::getCaseId).forEach(processCaseIds::add);
}
return paged.convert(r->{
CaseProcessDTO caseProcessDTO = new CaseProcessDTO(r);
caseProcessDTO.setEnableAnalyse(processCaseIds.contains(r.getId()) ? "0" : "1");
return caseProcessDTO;
});
}
@ -53,35 +63,44 @@ public class MroServiceImpl implements MroService {
List<ModelCase> modelCases = modelCaseService.listByIds(caseIds);
Assert.notEmpty(modelCases, "案件不存在!");
// 创建一个线程
new Thread(() -> {
log.info("开始异步分析案件....");
List<String> caseIdList = new ArrayList<>();
for (ModelCase modelCase : modelCases) {
try {
int caseAnalysisStatus = modelCase.getCaseAnalysisStatus();
if (1 == caseAnalysisStatus) {
log.info("案件【{}】正在分析中,跳过", modelCase.getCaseName());
continue;
}
caseStatusManageService.whenAnalyseCaseStart(modelCase.getId());
caseIdList.add(modelCase.getId());
} catch (Exception e) {
log.error("案件【{}】添加开始标识失败!", modelCase.getCaseName(), e);
}
}
for (String caseId : caseIdList) {
try {
AnalyseCaseDTO analyseCaseDTO = new AnalyseCaseDTO();
analyseCaseDTO.setCaseId(caseId);
modelService.analyseCaseWrapper(analyseCaseDTO);
} catch (Exception e) {
log.error("案件【{}】分析失败", caseId, e);
}
for (ModelCase modelCase : modelCases) {
int caseAnalysisStatus = modelCase.getCaseAnalysisStatus();
if (1 == caseAnalysisStatus) {
log.info("案件【{}】正在分析中,跳过", modelCase.getCaseName());
continue;
}
log.info("案件分析完成!");
}).start();
AnalyseCaseDTO analyseCaseDTO = new AnalyseCaseDTO();
analyseCaseDTO.setCaseId(modelCase.getId());
modelService.analyseCaseWrapper(analyseCaseDTO);
}
}
@Override
public IPage<TaskInfoDTO> queryTaskList(TaskInfoReqVO taskInfoReqVO, Integer page, Integer size) {
return taskRecordService.queryTaskList(taskInfoReqVO, page, size);
}
@Override
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
public Boolean cancelTask(List<String> taskIds) {
if (CollUtil.isEmpty(taskIds)){
log.info("cancelTask:取消任务失败,参数为空");
return false;
}
taskRecordService.cancelTask(taskIds);
return true;
}
@Override
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
public Boolean deleteTask(List<String> taskIds) {
if (CollUtil.isEmpty(taskIds)){
log.info("deleteTask:删除任务失败,参数为空");
return false;
}
taskRecordService.deleteTask(taskIds);
return true;
}
}

@ -0,0 +1,94 @@
package com.supervision.police.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.supervision.police.domain.*;
import com.supervision.police.mapper.NotePiecePromptMapper;
import com.supervision.police.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class NotePiecePromptServiceImpl extends ServiceImpl<NotePiecePromptMapper, NotePiecePrompt> implements NotePiecePromptService {
private final NotePiecePromptTypeRelService notePiecePromptTypeRelService;
private final ModelPieceRecordTypeService modelPieceRecordTypeService;
@Override
public List<NotePiecePrompt> listPiecePromptBySplitId(NoteRecordSplitPieceSentence noteRecordSplitPieceSentence) {
List<NotePiecePrompt> notePromptList = new ArrayList<>();
// 同语义片段是否为空
if (null == noteRecordSplitPieceSentence) {
log.warn("listPiecePromptBySplitId根据同语义片段id{}未找到切分笔录数据...", noteRecordSplitPieceSentence.getId());
return notePromptList;
}
// 查询同语义片段分类
String recordType = noteRecordSplitPieceSentence.getContentChuckSummary();
if (StrUtil.isBlank(recordType)) {
log.info("listPiecePromptBySplitId:同语义片段:{} 不属于任何分类...", noteRecordSplitPieceSentence.getId());
return notePromptList;
}
// todo 这里是用全部分类还是用当前笔录生成的分类,暂定全部分类
// 获取所有的分类
List<ModelPieceRecordType> allTypeList = modelPieceRecordTypeService
.lambdaQuery()
.select(ModelPieceRecordType::getId, ModelPieceRecordType::getRecordType)
.list();
Map<String, String> allTypeMap = allTypeList.stream().collect(Collectors.toMap(ModelPieceRecordType::getRecordType, ModelPieceRecordType::getId, (k1, k2) -> k1));
// 对切分后的笔录进行遍历
String[] split = recordType.split(";");
for (String typeName : split) {
String typeId = allTypeMap.get(typeName);
if (null == typeId) {
log.info("listPiecePromptBySplitId:同语义片段id:{} typeName:{}未在全局分类中找到数据...", noteRecordSplitPieceSentence.getId(), typeName);
continue;
}
// 根据同语义类型找到所有的提取三元组的提示词
// 一个提示词可能关联多个类型,要进行拆分操作
List<NotePiecePromptTypeRel> promptTypeRelList = notePiecePromptTypeRelService.lambdaQuery().eq(NotePiecePromptTypeRel::getTypeId, typeId).select(NotePiecePromptTypeRel::getPromptId).list();
if (CollUtil.isEmpty(promptTypeRelList)) {
log.info("listPiecePromptBySplitId:同语义片段:{}根据typeId:{},typeName:{},未找到对应的提示词信息...", noteRecordSplitPieceSentence.getId(), typeId, typeName);
continue;
}
List<String> promptIdList = promptTypeRelList.stream().map(NotePiecePromptTypeRel::getPromptId).toList();
List<NotePiecePrompt> list = super.lambdaQuery().in(NotePiecePrompt::getId, promptIdList).list();
if (CollUtil.isEmpty(list)) {
log.info("listPiecePromptBySplitId:根据 promptIdList:{},未找到对应的提示词信息...", CollUtil.join(promptIdList, ","));
continue;
}
notePromptList.addAll(list);
}
return notePromptList;
}
}

@ -0,0 +1,20 @@
package com.supervision.police.service.impl;
import com.supervision.police.domain.NotePiecePromptTypeRel;
import com.supervision.police.mapper.NotePiecePromptTypeRelMapper;
import com.supervision.police.service.NotePiecePromptTypeRelService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-12
*/
@Service
public class NotePiecePromptTypeRelServiceImpl extends ServiceImpl<NotePiecePromptTypeRelMapper, NotePiecePromptTypeRel> implements NotePiecePromptTypeRelService {
}

@ -46,8 +46,7 @@ import static com.supervision.police.service.impl.ModelRecordTypeServiceImpl.bui
@RequiredArgsConstructor
public class NotePromptServiceImpl extends ServiceImpl<NotePromptMapper, NotePrompt> implements NotePromptService {
@Autowired
private NoteRecordSplitService noteRecordSplitService;
private final NoteRecordSplitService noteRecordSplitService;
@Autowired
private ModelRecordTypeService modelRecordTypeService;

@ -0,0 +1,20 @@
package com.supervision.police.service.impl;
import com.supervision.police.domain.NoteRecordSplitPieceSentence;
import com.supervision.police.mapper.NoteRecordSplitPieceSentenceMapper;
import com.supervision.police.service.NoteRecordSplitPieceSentenceService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-11
*/
@Service
public class NoteRecordSplitPieceSentenceServiceImpl extends ServiceImpl<NoteRecordSplitPieceSentenceMapper, NoteRecordSplitPieceSentence> implements NoteRecordSplitPieceSentenceService {
}

@ -0,0 +1,42 @@
package com.supervision.police.service.impl;
import com.supervision.police.domain.NoteRecordSplitSentence;
import com.supervision.police.mapper.NoteRecordSplitSentenceMapper;
import com.supervision.police.service.NoteRecordSplitSentenceService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author longbao
* @since 2024-12-10
*/
@Service
public class NoteRecordSplitSentenceServiceImpl extends ServiceImpl<NoteRecordSplitSentenceMapper, NoteRecordSplitSentence> implements NoteRecordSplitSentenceService {
/**
*
* @param noteRecordSplitList
*/
@Override
public void saveBatchList(List<NoteRecordSplitSentence> noteRecordSplitList) {
this.baseMapper.saveBatchList(noteRecordSplitList);
}
/**
* llmGenA
* @param ids id
* @param noteRecordSplitPieceSentences id
*/
@Override
public void updateBatchList(List<Long> ids,Long noteRecordSplitPieceSentences){
this.baseMapper.updateBatchList(ids,noteRecordSplitPieceSentences);
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save