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

jinan_dev
yaxin 4 months ago
parent 9e733ebb97
commit d3f7290413

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

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

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

@ -49,6 +49,8 @@ import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static com.supervision.common.constant.XxlJobConstants.TASK_NAME_EVIDENCE_ANALYSIS;
@Slf4j @Slf4j
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@ -414,7 +416,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
@Override @Override
public void callEvidenceAnalysis(String evidenceId) { public void callEvidenceAnalysis(String evidenceId) {
Assert.notEmpty(evidenceId, "证据ID不能为空"); Assert.notEmpty(evidenceId, "证据ID不能为空");
xxlJobService.executeTaskByJobHandler("evidenceAnalysis", evidenceId); xxlJobService.executeTaskByJobHandler(TASK_NAME_EVIDENCE_ANALYSIS, evidenceId);
} }
@Override @Override

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

Loading…
Cancel
Save