add:第一版测试版本,第二次联调。

This commit is contained in:
2025-12-26 15:27:54 +08:00
parent cd483c81d1
commit 6e554b6bf7
32 changed files with 903 additions and 73 deletions

View File

@@ -1,5 +1,6 @@
package org.nl.task.provider;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
@@ -8,10 +9,15 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.nl.api.task.api.TaskAPI;
import org.nl.api.task.core.QRCodeTaskRequestParam;
import org.nl.enums.ScheduleTaskReportStatusEnum;
import org.nl.exception.BadRequestException;
import org.nl.response.WebResponse;
import org.nl.task.entity.Task;
import org.nl.task.enums.TaskSourceEnum;
import org.nl.task.enums.TaskStatusEnum;
import org.nl.task.param.CancelTaskRequestParam;
import org.nl.task.param.CreateTaskRequestParam;
import org.nl.task.service.TaskService;
import org.springframework.stereotype.Service;
@@ -54,7 +60,7 @@ public class TaskAPIProvider implements TaskAPI {
@Override
public String taskOperationConfirm(String taskCode,String vehicleNumber) {
Task task = this.queryCurrentTaskByVehicleNumber(vehicleNumber);
if (ObjectUtil.isEmpty(task)){
if (task == null || BeanUtil.isEmpty(task)){
log.info("任务操作确认失败,任务不存在");
return null;
}
@@ -64,4 +70,38 @@ public class TaskAPIProvider implements TaskAPI {
}
return task.getVehicleReportStatus();
}
@Override
public WebResponse createTask(QRCodeTaskRequestParam qrCodeTaskRequestParam) {
CreateTaskRequestParam param = BeanUtil.toBean(qrCodeTaskRequestParam, CreateTaskRequestParam.class);
return taskService.createTask(param, TaskSourceEnum.QRCODE.getName());
}
@Override
public WebResponse cancelTask(String taskCode) {
CancelTaskRequestParam param = new CancelTaskRequestParam();
param.setTask_code(taskCode);
return taskService.cancelTask(param);
}
@Override
public WebResponse queryTaskInfoByRoom(String room) {
// 获取当前存在的任务
List<Task> taskList = taskService.queryCurrentTaskInfo();
// 根据房间号查找当前任务中是否存在
Task currentTask = taskList.stream().filter(task -> room.equals(task.getDestinations()))
.findFirst()
.orElse(null);
JSONObject jsonObject = new JSONObject();
if (ObjectUtil.isNotEmpty(currentTask)){
jsonObject.put("currentTaskInfo", currentTask);
}
jsonObject.put("currentTaskCount", taskList.size());
return WebResponse.requestParamOk(jsonObject);
}
@Override
public WebResponse taskOperationConfirm(String taskCode) {
return taskService.taskOperationConfirm(taskCode);
}
}

View File

@@ -41,13 +41,13 @@ public interface TaskService extends IService<Task>{
WebResponse resumeTask(PauseAndResumeTaskParam pauseAndResumeTaskParam);
/**
* 查询当前未完成的任务
* 根据车号查询当前未完成的任务
* @return WebResponse
*/
WebResponse queryNotFinishTaskInfoByVehicleNumber(String vehicle_number);
/**
* 查询当前未完成的任务
* 根据车号查询当前未完成的任务
* @return List<Task>
*/
List<Task> queryCurrentTaskInfoByVehicleNumber(String vehicle_number);
@@ -64,4 +64,10 @@ public interface TaskService extends IService<Task>{
* @return WebResponse
*/
WebResponse oneClickOperation(OneClickOperationRequestParam oneClickOperationRequestParam,String taskSource);
/**
* 根据房间号查询当前任务信息
* @return List<Task>
*/
List<Task> queryCurrentTaskInfo();
}

View File

@@ -40,6 +40,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
/**
@@ -56,8 +57,16 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper,Task> implements Tas
@Resource
private ScheduleTaskAPI scheduleTaskAPI;
/**
* <车号,List<任务信息>>
*/
private ConcurrentHashMap<String,List<Task>> taskInfoList = new ConcurrentHashMap<>();
/**
* 当前任务集合
*/
private List<Task> currentTaskList = new CopyOnWriteArrayList<>();
/**
* 定时查询车辆任务状态(每秒执行)
*/
@@ -67,51 +76,56 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper,Task> implements Tas
List<Task> taskList = taskMapper.selectList(new LambdaQueryWrapper<>(Task.class)
.lt(Task::getStatus,TaskStatusEnum.FINISHED.getCode())
);
currentTaskList.clear();
currentTaskList = taskList;
taskInfoList.clear();
//根据车辆编号分类 车辆任务队列。
taskInfoList = taskList.stream()
.filter(task -> StrUtil.isNotBlank(task.getVehicle_number()) || StrUtil.isNotBlank(task.getProcessingVehicle()))
.collect(Collectors.groupingByConcurrent(task ->
StrUtil.isNotBlank(task.getProcessingVehicle()) ?
task.getProcessingVehicle() :
task.getVehicle_number(),
ConcurrentHashMap::new,
Collectors.toList()
));
for (Task task : taskList) {
HttpResponse result = scheduleTaskAPI.queryTaskStatusByTaskId(task.getTask_code());
if (result == null || !result.isOk()){
log.info("获取调度任务状态失败");
continue;
}
JSONObject scheduleTaskStatusJSON = JSONObject.parseObject(result.body());
String scheduleTaskState = scheduleTaskStatusJSON.getString("state");
String newTaskState = "";
if (ScheduleTaskStatusEnum.FINISHED.name().equals(scheduleTaskState)){
newTaskState = TaskStatusEnum.FINISHED.getCode();
} else if (ScheduleTaskStatusEnum.isFinalState(scheduleTaskState)) {
newTaskState = TaskStatusEnum.CANCELED.getCode();
task.setRemark("无路由或取消:" + scheduleTaskState);
} else if (ScheduleTaskStatusEnum.BEING_PROCESSED.name().equals(scheduleTaskState)) {
newTaskState = TaskStatusEnum.EXECUTING.getCode();
// 充电和加水任务的目标点是调度分配的,在查询任务状态时更新目标点。
if (StrUtil.isBlank(task.getDestinations()) && ObjectUtil.isNotEmpty(scheduleTaskStatusJSON.getJSONArray("destinations"))){
JSONObject destination = scheduleTaskStatusJSON.getJSONArray("destinations").getJSONObject(0);
task.setDestinations(destination.getString("locationName"));
if (!taskList.isEmpty()) {
taskInfoList = taskList.stream()
.filter(task -> StrUtil.isNotBlank(task.getVehicle_number()) || StrUtil.isNotBlank(task.getProcessingVehicle()))
.collect(Collectors.groupingByConcurrent(task ->
StrUtil.isNotBlank(task.getProcessingVehicle()) ?
task.getProcessingVehicle() :
task.getVehicle_number(),
ConcurrentHashMap::new,
Collectors.toList()
));
for (Task task : taskList) {
HttpResponse result = scheduleTaskAPI.queryTaskStatusByTaskId(task.getTask_code());
if (result == null || !result.isOk()){
log.info("获取调度任务状态失败");
continue;
}
JSONObject scheduleTaskStatusJSON = JSONObject.parseObject(result.body());
String scheduleTaskState = scheduleTaskStatusJSON.getString("state");
String newTaskState = "";
if (ScheduleTaskStatusEnum.FINISHED.name().equals(scheduleTaskState)){
newTaskState = TaskStatusEnum.FINISHED.getCode();
} else if (ScheduleTaskStatusEnum.isFinalState(scheduleTaskState)) {
newTaskState = TaskStatusEnum.CANCELED.getCode();
task.setRemark("无路由或取消:" + scheduleTaskState);
} else if (ScheduleTaskStatusEnum.BEING_PROCESSED.name().equals(scheduleTaskState)) {
newTaskState = TaskStatusEnum.EXECUTING.getCode();
// 充电和加水任务的目标点是调度分配的,在查询任务状态时更新目标点。
if (StrUtil.isBlank(task.getDestinations()) && ObjectUtil.isNotEmpty(scheduleTaskStatusJSON.getJSONArray("destinations"))){
JSONObject destination = scheduleTaskStatusJSON.getJSONArray("destinations").getJSONObject(0);
task.setDestinations(destination.getString("locationName"));
}
task.setProcessingVehicle(scheduleTaskStatusJSON.getString("processingVehicle"));
}
// 任务状态改变 进行更新
if (StrUtil.isNotBlank(newTaskState) && !newTaskState.equals(task.getStatus())){
log.info("更新任务状态,任务号:{},更新前状态:{},需要更新成的状态:{}",task.getTask_code(),task.getStatus(),newTaskState);
task.setStatus(newTaskState);
task.setUpdate_time(DateUtil.now());
// 更新任务状态
taskMapper.updateById(task);
log.info("更新任务状态成功");
}
task.setProcessingVehicle(scheduleTaskStatusJSON.getString("processingVehicle"));
}
// 任务状态改变 进行更新
if (StrUtil.isNotBlank(newTaskState) && !newTaskState.equals(task.getStatus())){
log.info("更新任务状态,任务号:{},更新前状态:{},需要更新成的状态:{}",task.getTask_code(),task.getStatus(),newTaskState);
task.setStatus(newTaskState);
task.setUpdate_time(DateUtil.now());
// 更新任务状态
taskMapper.updateById(task);
log.info("更新任务状态成功");
}
}
} catch (Exception e) {
log.error("更新任务状态失败: {}", e.getMessage());
log.error("更新任务状态失败: {}", e);
}
}
@@ -287,4 +301,9 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper,Task> implements Tas
}
}
@Override
public List<Task> queryCurrentTaskInfo() {
return currentTaskList;
}
}