任务执行接口,xxl-job接口任务、案件层业务逻辑提交

jinan_dev
yaxin 2 months ago
parent 9e733ebb97
commit d3f7290413

@ -6,6 +6,20 @@
# Release Notes
# 发布时间 2024-12-26
## 新特性
- 页面确保在不同尺寸宽度的屏幕上均能正常显示,并支持用户通过滚动查看完整内容。
- 案件列表添加鼠标悬停效果,悬停行背景颜色加深
- 证据图像上传加载页面时,增加骨架屏效果优化用户体验。
- 模型分析功能按钮增加防抖限制,避免短时间内重复触发导致的性能问题
## 变更
- 指标结果-原子指标结果显示“存在/不存在”
- 统计案件状态:未分析、已分析、正在分析
- 证据列表删除分页、指标结果删除分页
- 修复问题未调整案件及指标相关配置执行模型分析后指标结果仍显示new标识
# 发布时间 2024-12-13
## 新特性

@ -4,4 +4,6 @@ public class XxlJobConstants {
public static final String URL_LOGIN = "/login";
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 = "extractEvidenceByTask";
}

@ -7,8 +7,8 @@ import com.supervision.police.domain.TaskRecord;
import com.supervision.police.service.*;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
@ -19,12 +19,16 @@ import static com.supervision.common.constant.TaskRecordConstants.*;
@Slf4j
@Component
@RequiredArgsConstructor
public class XxlJobTask {
@Autowired
private CaseEvidenceService caseEvidenceService;
@Autowired
private TaskRecordService taskRecordService;
@Autowired
private TaskCaseRecordService taskCaseRecordService;
@Autowired
private ModelCaseService modelCaseService;
@Autowired
private NotePromptService notePromptService;
/**
@ -44,19 +48,19 @@ public class XxlJobTask {
}
/**
*
*
*/
@XxlJob("extractTask")
public void extractEvidenceByTask() {
@XxlJob("promptExtractTask")
public void promptExtractTask() {
String jobParam = XxlJobHelper.getJobParam();
log.info("【提取任务】任务开始。参数: 【{}】", jobParam);
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");
NotePrompt prompt = notePromptService.getById(promptId);
boolean executable = true;
log.info("【提取任务】任务开始。参数: {}", jobParam);
try {
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");
NotePrompt prompt = notePromptService.getById(promptId);
boolean executable = true;
TaskRecord taskRecord = taskRecordService.getById(taskId);
switch (taskRecord.getStatus()) {
case TASK_STATUS_WAITING:
@ -86,15 +90,19 @@ public class XxlJobTask {
}
switch (prompt.getType()) {
case TYPE_GRAPH_REASONING:
log.info("【图推理】任务开始。任务ID: 【{}】", taskId);
// TODO: 笔录处理
break;
case TYPE_STRUCTURAL_REASONING:
log.info("【结构推理】任务开始。任务ID: 【{}】", taskId);
// TODO: 证据处理
break;
default:
log.error("未知的任务类型");
break;
}
//TODO:更新案件状态、任务状态
log.info("【提取任务】任务结束。任务ID: 【{}】", taskId);
}
} catch (Exception e) {
log.error("任务执行失败", e);

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
@ -30,6 +31,16 @@ public class TaskCaseRecord implements Serializable {
*/
private String caseId;
/**
* ID
*/
private String waitingId;
/**
* ID
*/
private String processedId;
/**
* ID
*/
@ -60,6 +71,7 @@ public class TaskCaseRecord implements Serializable {
*/
private Date updateTime;
@Serial
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -49,6 +49,8 @@ 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
@Service
@RequiredArgsConstructor
@ -414,7 +416,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
@Override
public void callEvidenceAnalysis(String evidenceId) {
Assert.notEmpty(evidenceId, "证据ID不能为空");
xxlJobService.executeTaskByJobHandler("evidenceAnalysis", evidenceId);
xxlJobService.executeTaskByJobHandler(TASK_NAME_EVIDENCE_ANALYSIS, evidenceId);
}
@Override

@ -4,15 +4,13 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.common.constant.TaskRecordConstants;
import com.supervision.constant.DataStatus;
import com.supervision.police.domain.ModelCase;
import com.supervision.police.domain.NotePrompt;
import com.supervision.police.domain.NoteRecord;
import com.supervision.police.domain.TaskRecord;
import com.supervision.police.domain.*;
import com.supervision.police.dto.TaskInfoDTO;
import com.supervision.police.dto.taskRecord.TaskRecordVo;
import com.supervision.police.mapper.TaskRecordMapper;
@ -25,12 +23,15 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
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;
/**
* @author dxy
@ -52,40 +53,61 @@ public class TaskRecordServiceImpl extends ServiceImpl<TaskRecordMapper, TaskRec
@Override
public void executePromptExtractTask(TaskRecordVo taskRecordVo) {
//保存任务记录
TaskRecord taskRecord = new TaskRecord();
BeanUtils.copyProperties(taskRecordVo, taskRecord);
super.save(taskRecord);
NotePrompt prompt = notePromptService.getById(taskRecordVo.getPromptId());
switch (taskRecord.getType()) {
case TaskRecordConstants.TASK_TYPE_ALL_CASE:
if (TYPE_GRAPH_REASONING.equals(prompt.getType())) {
//笔录
List<ModelCase> modelCases = modelCaseService.lambdaQuery().eq(ModelCase::getDataStatus, DataStatus.AVAILABLE.getCode()).list();
for (ModelCase modelCase : modelCases) {
List<NoteRecord> noteRecords = noteRecordService.lambdaQuery().eq(NoteRecord::getCaseId, modelCase.getId()).list();
for (NoteRecord noteRecord : noteRecords) {
Map<String, String> params = new HashMap<>();
params.put("taskId", taskRecord.getId());
params.put("caseId", modelCase.getId());
params.put("executeId", noteRecord.getId());
params.put("promptId", taskRecordVo.getPromptId());
//map转String作为参数
xxlJobService.executeTaskByJobHandler("extractRecordByTask", new JSONObject(params).toString());
}
List<ModelCase> modelCases;
LambdaQueryWrapper<ModelCase> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ModelCase::getDataStatus, DataStatus.AVAILABLE.getCode());
//根据任务类型查找案件
if (TASK_TYPE_SPECIFIED_CASE.equals(taskRecord.getType())) {
queryWrapper.in(ModelCase::getId, List.of(taskRecordVo.getCaseId().split(",")));
} else if (TASK_TYPE_SPECIFIED_RECORD.equals(taskRecord.getType()) || TASK_TYPE_SPECIFIED_EVIDENCE.equals(taskRecord.getType())) {
queryWrapper.eq(ModelCase::getId, taskRecord.getCaseId());
}
modelCases = modelCaseService.list(queryWrapper);
if (!CollUtil.isEmpty(modelCases)) {
for (ModelCase modelCase : modelCases) {
String caseId = modelCase.getId();
//查出当前案件相关笔录或证据
List<String> ids = new ArrayList<>();
//如果类型为指定笔录或证据直接取传入的id
if (TASK_TYPE_SPECIFIED_RECORD.equals(taskRecord.getType())) {
ids = List.of(taskRecordVo.getRecordId().split(","));
} else if (TASK_TYPE_SPECIFIED_EVIDENCE.equals(taskRecord.getType())) {
ids = List.of(taskRecordVo.getEvidenceId().split(","));
} else {
//如果是案件维度根据案件ID查找笔录或证据
if (TYPE_GRAPH_REASONING.equals(prompt.getType())) {
ids = noteRecordService.lambdaQuery().eq(NoteRecord::getCaseId, caseId).eq(NoteRecord::getDataStatus, DataStatus.AVAILABLE.getCode()).list().stream().map(NoteRecord::getId).toList();
} else if (TYPE_STRUCTURAL_REASONING.equals(prompt.getType())) {
ids = caseEvidenceService.lambdaQuery().eq(CaseEvidence::getCaseId, caseId).list().stream().map(CaseEvidence::getId).toList();
}
} else if (TYPE_STRUCTURAL_REASONING.equals(prompt.getType())) {
//证据
}
break;
case TaskRecordConstants.TASK_TYPE_SPECIFIED_CASE:
break;
case TaskRecordConstants.TASK_TYPE_SPECIFIED_RECORD:
break;
case TaskRecordConstants.TASK_TYPE_SPECIFIED_EVIDENCE:
break;
default:
break;
if (!ids.isEmpty()) {
TaskCaseRecord taskCaseRecord = new TaskCaseRecord();
taskCaseRecord.setTaskRecordId(taskRecord.getId());
taskCaseRecord.setCaseId(caseId);
taskCaseRecord.setWaitingId(ids.stream().reduce((a, b) -> a + "," + b).orElse(""));
taskCaseRecord.setStatus(TaskRecordConstants.TASK_STATUS_WAITING);
taskCaseRecordService.save(taskCaseRecord);
for (String id : ids) {
Map<String, String> params = new HashMap<>();
params.put("taskId", taskRecord.getId());
params.put("caseId", caseId);
params.put("executeId", id);
params.put("promptId", taskRecordVo.getPromptId());
//map转String作为参数
xxlJobService.executeTaskByJobHandler(TASK_NAME_PROMPT_EXTRACT_TASK, new JSONObject(params).toString());
}
} else {
log.info("案件【{}】没有笔录", caseId);
}
}
} else {
log.info("没有找到案件");
}
}
@ -114,8 +136,8 @@ public class TaskRecordServiceImpl extends ServiceImpl<TaskRecordMapper, TaskRec
Assert.notEmpty(taskIds, "取消任务失败,未找到任务信息");
List<TaskRecord> list = taskRecords.stream().filter(taskRecord -> !this.taskStatusCancelEnabled(taskRecord.getStatus())).toList();
if (CollUtil.isNotEmpty(list)){
log.info("cancelTask:取消任务失败,存在不可取消的任务:{}",list.stream().map(TaskRecord::getId).toList());
if (CollUtil.isNotEmpty(list)) {
log.info("cancelTask:取消任务失败,存在不可取消的任务:{}", list.stream().map(TaskRecord::getId).toList());
}
Assert.isTrue(CollUtil.isEmpty(list), "取消任务失败,存在不可取消的任务");
@ -133,8 +155,8 @@ public class TaskRecordServiceImpl extends ServiceImpl<TaskRecordMapper, TaskRec
Assert.notEmpty(taskIds, "删除任务失败,未找到任务信息");
List<TaskRecord> list = taskRecords.stream().filter(taskRecord -> !this.taskStatusDeleteEnabled(taskRecord.getStatus())).toList();
if (CollUtil.isNotEmpty(list)){
log.info("deleteTask:删除任务失败,存在不可删除的任务:{}",list.stream().map(TaskRecord::getId).toList());
if (CollUtil.isNotEmpty(list)) {
log.info("deleteTask:删除任务失败,存在不可删除的任务:{}", list.stream().map(TaskRecord::getId).toList());
}
Assert.isTrue(CollUtil.isEmpty(list), "删除任务失败,存在不可删除的任务");

Loading…
Cancel
Save