|
|
|
@ -18,6 +18,7 @@ import com.supervision.police.service.*;
|
|
|
|
|
import com.supervision.police.vo.TaskInfoReqVO;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
@ -57,7 +58,91 @@ public class TaskRecordServiceImpl extends ServiceImpl<TaskRecordMapper, TaskRec
|
|
|
|
|
TaskRecord taskRecord = new TaskRecord();
|
|
|
|
|
BeanUtils.copyProperties(taskRecordVo, taskRecord);
|
|
|
|
|
super.save(taskRecord);
|
|
|
|
|
NotePrompt prompt = notePromptService.getById(taskRecordVo.getPromptId());
|
|
|
|
|
try {
|
|
|
|
|
NotePrompt prompt = notePromptService.getById(taskRecordVo.getPromptId());
|
|
|
|
|
List<ModelCase> modelCases = this.getModelCases(taskRecordVo, taskRecord);
|
|
|
|
|
if (!CollUtil.isEmpty(modelCases)) {
|
|
|
|
|
for (ModelCase modelCase : modelCases) {
|
|
|
|
|
String caseId = modelCase.getId();
|
|
|
|
|
List<String> ids = this.getIds(taskRecordVo, taskRecord, prompt, caseId);
|
|
|
|
|
if (!ids.isEmpty()) {
|
|
|
|
|
this.invokeXxlJob(taskRecordVo, taskRecord, caseId, ids);
|
|
|
|
|
} else {
|
|
|
|
|
log.info("案件【{}】没有笔录", caseId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.info("查无案件");
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
taskRecord.setStatus(TASK_STATUS_FAIL);
|
|
|
|
|
super.updateById(taskRecord);
|
|
|
|
|
log.error("任务执行失败", e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据任务类型获取笔录或证据ID
|
|
|
|
|
*
|
|
|
|
|
* @param taskRecordVo 任务记录
|
|
|
|
|
* @param taskRecord 任务
|
|
|
|
|
* @param prompt 提示词
|
|
|
|
|
* @param caseId 案件ID
|
|
|
|
|
* @return 笔录或证据ID
|
|
|
|
|
*/
|
|
|
|
|
private @NotNull List<String> getIds(TaskRecordVo taskRecordVo, TaskRecord taskRecord, NotePrompt prompt, String caseId) {
|
|
|
|
|
//查出当前案件相关笔录或证据
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return ids;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 调用xxl-job执行任务
|
|
|
|
|
*
|
|
|
|
|
* @param taskRecordVo 任务记录
|
|
|
|
|
* @param taskRecord 任务
|
|
|
|
|
* @param caseId 案件ID
|
|
|
|
|
* @param ids 笔录或证据ID
|
|
|
|
|
*/
|
|
|
|
|
private void invokeXxlJob(TaskRecordVo taskRecordVo, TaskRecord taskRecord, String caseId, List<String> ids) {
|
|
|
|
|
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());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据任务类型查找案件
|
|
|
|
|
*
|
|
|
|
|
* @param taskRecordVo 任务记录
|
|
|
|
|
* @param taskRecord 任务
|
|
|
|
|
* @return 案件列表
|
|
|
|
|
*/
|
|
|
|
|
private List<ModelCase> getModelCases(TaskRecordVo taskRecordVo, TaskRecord taskRecord) {
|
|
|
|
|
List<ModelCase> modelCases;
|
|
|
|
|
LambdaQueryWrapper<ModelCase> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
queryWrapper.eq(ModelCase::getDataStatus, DataStatus.AVAILABLE.getCode());
|
|
|
|
@ -68,49 +153,10 @@ public class TaskRecordServiceImpl extends ServiceImpl<TaskRecordMapper, TaskRec
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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("没有找到案件");
|
|
|
|
|
}
|
|
|
|
|
return modelCases;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IPage<TaskInfoDTO> queryTaskList(TaskInfoReqVO taskInfo, Integer page, Integer size) {
|
|
|
|
|
return super.getBaseMapper().queryTaskList(taskInfo, Page.of(page, size));
|
|
|
|
|