add:第一版测试版本。
This commit is contained in:
@@ -27,5 +27,11 @@
|
||||
<groupId>org.nl</groupId>
|
||||
<artifactId>nl-business-api</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.alibaba</groupId>-->
|
||||
<!-- <artifactId>fastjson</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
package org.nl.task.controller;
|
||||
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.logging.annotation.Log;
|
||||
import org.nl.task.enums.TaskSourceEnum;
|
||||
import org.nl.task.param.CancelTaskRequestParam;
|
||||
import org.nl.task.param.CreateTaskRequestParam;
|
||||
import org.nl.task.param.OneClickOperationRequestParam;
|
||||
import org.nl.task.param.PauseAndResumeTaskParam;
|
||||
import org.nl.task.service.TaskService;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/11/27
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/task/")
|
||||
public class TaskController {
|
||||
|
||||
@Resource
|
||||
private TaskService taskService;
|
||||
|
||||
@PostMapping("/createTask")
|
||||
@Log("创建任务")
|
||||
public ResponseEntity<Object> sendTask(@RequestBody @Validated CreateTaskRequestParam createTaskRequestParam){
|
||||
return new ResponseEntity<>(taskService.createTask(createTaskRequestParam, TaskSourceEnum.SCREEN.getName()), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/cancelTask")
|
||||
@Log("取消任务")
|
||||
public ResponseEntity<Object> cancelTask(@RequestBody @Validated CancelTaskRequestParam cancelTaskRequestParam){
|
||||
return new ResponseEntity<>(taskService.cancelTask(cancelTaskRequestParam), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/pauseTask")
|
||||
@Log("暂停任务")
|
||||
public ResponseEntity<Object> pauseTask(@RequestBody @Validated PauseAndResumeTaskParam pauseAndResumeTaskParam){
|
||||
return new ResponseEntity<>(taskService.pauseTask(pauseAndResumeTaskParam), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/resumeTask")
|
||||
@Log("恢复任务")
|
||||
public ResponseEntity<Object> resumeTask(@RequestBody @Validated PauseAndResumeTaskParam pauseAndResumeTaskParam){
|
||||
return new ResponseEntity<>(taskService.resumeTask(pauseAndResumeTaskParam), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@GetMapping("/queryNotFinishTaskInfoByVehicleNumber")
|
||||
@Log("查询当前未完成的任务")
|
||||
public ResponseEntity<Object> queryNotFinishTaskInfoByVehicleNumber(@RequestParam String vehicle_number){
|
||||
return new ResponseEntity<>(taskService.queryNotFinishTaskInfoByVehicleNumber(vehicle_number), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/taskOperationConfirm")
|
||||
@Log("任务操作确认")
|
||||
public ResponseEntity<Object> taskOperationConfirm(@RequestParam String task_code){
|
||||
return new ResponseEntity<>(taskService.taskOperationConfirm(task_code), HttpStatus.OK);
|
||||
}
|
||||
|
||||
@PostMapping("/oneClickOperation")
|
||||
@Log("一键操作任务")
|
||||
public ResponseEntity<Object> oneClickOperation(@RequestBody OneClickOperationRequestParam oneClickOperationRequestParam){
|
||||
return new ResponseEntity<>(taskService.oneClickOperation(oneClickOperationRequestParam, TaskSourceEnum.SCREEN.getName()),HttpStatus.OK);
|
||||
}
|
||||
|
||||
}
|
||||
99
nl-business-task/src/main/java/org/nl/task/entity/Task.java
Normal file
99
nl-business-task/src/main/java/org/nl/task/entity/Task.java
Normal file
@@ -0,0 +1,99 @@
|
||||
package org.nl.task.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/11/27
|
||||
*/
|
||||
@Data
|
||||
@TableName("task")
|
||||
public class Task {
|
||||
|
||||
/**
|
||||
* 任务标识
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 任务号
|
||||
*/
|
||||
private String task_code;
|
||||
|
||||
/**
|
||||
* 目标点
|
||||
*/
|
||||
private String destinations;
|
||||
|
||||
/**
|
||||
* 任务类型
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 任务状态
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 车辆上报状态(0未上报,1上报,2处理完成)
|
||||
*/
|
||||
private String vehicleReportStatus;
|
||||
|
||||
/**
|
||||
* 到达等待时间
|
||||
*/
|
||||
private Integer arrive_waiting_time;
|
||||
/**
|
||||
* 任务优先级
|
||||
*/
|
||||
private String priority;
|
||||
|
||||
/**
|
||||
* 指定车号
|
||||
*/
|
||||
private String vehicle_number;
|
||||
|
||||
/**
|
||||
* 实际执行车号
|
||||
*/
|
||||
private String processingVehicle;
|
||||
|
||||
/**
|
||||
* 是否任务暂停
|
||||
*/
|
||||
private String isPause;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 任务来源
|
||||
*/
|
||||
private String source;
|
||||
|
||||
/**
|
||||
* 创建者
|
||||
*/
|
||||
private String create_by;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private String create_time;
|
||||
|
||||
/**
|
||||
* 修改时间
|
||||
*/
|
||||
private String update_time;
|
||||
|
||||
/**
|
||||
* 修改者
|
||||
*/
|
||||
private String update_by;
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package org.nl.task.enums;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/12/2
|
||||
*/
|
||||
@Getter
|
||||
public enum ScheduleTaskStatusEnum {
|
||||
/**
|
||||
* A transport order's initial state.
|
||||
* A transport order remains in this state until its parameters have been
|
||||
* set up completely.
|
||||
*/
|
||||
RAW("0", "RAW", "初始状态"),
|
||||
/**
|
||||
* Set (by a user/client) when a transport order's parameters have been set
|
||||
* up completely and the kernel should dispatch it when possible.
|
||||
*/
|
||||
ACTIVE("1", "ACTIVE", "就绪"),
|
||||
/**
|
||||
* Marks a transport order as ready to be dispatched to a vehicle (i.e. all
|
||||
* its dependencies have been finished).
|
||||
*/
|
||||
DISPATCHABLE("2", "DISPATCHABLE", "待分配车辆"),
|
||||
|
||||
BEING_PROCESSED("3", "BEING_PROCESSED", "执行中"),
|
||||
/**
|
||||
* Marks a transport order as successfully completed.
|
||||
*/
|
||||
FINISHED("4", "FINISHED", "完成"),
|
||||
/**
|
||||
* General failure state that marks a transport order as failed.
|
||||
*/
|
||||
FAILED("5", "FAILED", "已取消"),
|
||||
/**
|
||||
* Failure state that marks a transport order as unroutable, i.e. it is
|
||||
* impossible to find a route that would allow a vehicle to process the
|
||||
* transport order completely.
|
||||
*/
|
||||
UNROUTABLE("6", "UNROUTABLE", "无路由");
|
||||
|
||||
private String code;
|
||||
private String name;
|
||||
private String desc;
|
||||
|
||||
|
||||
ScheduleTaskStatusEnum(String code, String name, String desc) {
|
||||
this.code = code;
|
||||
this.name = name;
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public static boolean isFinalState(String state) {
|
||||
return FAILED.getName().equals(state)
|
||||
|| UNROUTABLE.getName().equals(state);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package org.nl.task.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/11/27
|
||||
*/
|
||||
@Getter
|
||||
public enum TaskSourceEnum {
|
||||
|
||||
/**
|
||||
* APP
|
||||
*/
|
||||
APP("1", "app", "app"),
|
||||
/**
|
||||
* 屏幕
|
||||
*/
|
||||
SCREEN("2", "screen", "屏幕"),
|
||||
/**
|
||||
* 外部API
|
||||
*/
|
||||
EXTERNAL_API("3", "API", "外部API"),
|
||||
/**
|
||||
* 二维码
|
||||
*/
|
||||
QRCODE("4", "QRCode", "二维码");
|
||||
|
||||
private String code;
|
||||
private String name;
|
||||
private String desc;
|
||||
|
||||
|
||||
TaskSourceEnum(String code, String name, String desc) {
|
||||
this.code = code;
|
||||
this.name = name;
|
||||
this.desc = desc;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package org.nl.task.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/11/27
|
||||
*/
|
||||
@Getter
|
||||
public enum TaskStatusEnum {
|
||||
|
||||
/**
|
||||
* 生成
|
||||
*/
|
||||
CREATE("0", "生成", "生成"),
|
||||
/**
|
||||
* 执行中
|
||||
*/
|
||||
EXECUTING("1", "执行中", "执行中"),
|
||||
/**
|
||||
* 完成
|
||||
*/
|
||||
FINISHED("2", "完成", "完成"),
|
||||
/**
|
||||
* 已取消
|
||||
*/
|
||||
CANCELED("3", "已取消", "已取消");
|
||||
|
||||
private String code;
|
||||
private String name;
|
||||
private String desc;
|
||||
|
||||
|
||||
TaskStatusEnum(String code, String name, String desc) {
|
||||
this.code = code;
|
||||
this.name = name;
|
||||
this.desc = desc;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package org.nl.task.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/12/1
|
||||
*/
|
||||
@Getter
|
||||
public enum TaskTypeEnum {
|
||||
|
||||
/**
|
||||
* 送冰水、配送任务都用这个任务类型
|
||||
*/
|
||||
DELIVER("0", "Deliver", "送冰水、配送任务"),
|
||||
/**
|
||||
* 充电
|
||||
*/
|
||||
CHARGE("1", "Charge", "充电"),
|
||||
/**
|
||||
* 加水
|
||||
*/
|
||||
REFILL("2", "Refill", "加水"),
|
||||
/**
|
||||
* 移动
|
||||
*/
|
||||
MOVE("3", "Move", "移动");
|
||||
|
||||
private String code;
|
||||
private String name;
|
||||
private String desc;
|
||||
|
||||
|
||||
TaskTypeEnum(String code, String name, String desc) {
|
||||
this.code = code;
|
||||
this.name = name;
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验任务类型是否存在
|
||||
* @param taskType
|
||||
* @return
|
||||
*/
|
||||
public static boolean validationTaskType(String taskType){
|
||||
return TaskTypeEnum.DELIVER.getName().equals(taskType)
|
||||
|| TaskTypeEnum.CHARGE.getName().equals(taskType)
|
||||
|| TaskTypeEnum.REFILL.getName().equals(taskType)
|
||||
|| TaskTypeEnum.MOVE.getName().equals(taskType);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package org.nl.task.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.nl.task.entity.Task;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/11/28
|
||||
*/
|
||||
@Mapper
|
||||
public interface TaskMapper extends BaseMapper<Task> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="org.nl.task.mapper.TaskMapper">
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,18 @@
|
||||
package org.nl.task.param;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/11/28
|
||||
*/
|
||||
@Data
|
||||
public class CancelTaskRequestParam {
|
||||
|
||||
/**
|
||||
* 任务编号
|
||||
*/
|
||||
@NotBlank(message = "任务号不能为空")
|
||||
private String task_code;
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package org.nl.task.param;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/11/27
|
||||
*/
|
||||
@Data
|
||||
public class CreateTaskRequestParam {
|
||||
|
||||
/**
|
||||
* 目标点
|
||||
*/
|
||||
@NotBlank(message = "目标点不能为空")
|
||||
private String destinations;
|
||||
|
||||
/**
|
||||
* 任务类型
|
||||
*/
|
||||
@NotBlank(message = "任务类型不能为空")
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 任务号
|
||||
*/
|
||||
private String task_code;
|
||||
|
||||
/**
|
||||
* 任务优先级
|
||||
*/
|
||||
private String priority;
|
||||
|
||||
/**
|
||||
* 指定车号
|
||||
*/
|
||||
private String vehicle_number;
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package org.nl.task.param;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/12/13
|
||||
*/
|
||||
@Data
|
||||
public class OneClickOperationRequestParam {
|
||||
|
||||
/**
|
||||
* 车号
|
||||
*/
|
||||
@NotBlank(message = "车号不能为空")
|
||||
private String vehicle_number;
|
||||
|
||||
/**
|
||||
* 一键任务类型
|
||||
*/
|
||||
@NotBlank(message = "任务类型不能为空")
|
||||
private String type;
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package org.nl.task.param;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/12/3
|
||||
*/
|
||||
@Data
|
||||
public class PauseAndResumeTaskParam {
|
||||
|
||||
/**
|
||||
* 任务编号
|
||||
*/
|
||||
@NotBlank(message = "任务号不能为空")
|
||||
private String task_code;
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package org.nl.task.provider;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
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.enums.ScheduleTaskReportStatusEnum;
|
||||
import org.nl.exception.BadRequestException;
|
||||
import org.nl.task.entity.Task;
|
||||
import org.nl.task.enums.TaskStatusEnum;
|
||||
import org.nl.task.service.TaskService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/12/11
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class TaskAPIProvider implements TaskAPI {
|
||||
|
||||
@Resource
|
||||
private TaskService taskService;
|
||||
|
||||
@Override
|
||||
public Task queryCurrentTaskByVehicleNumber(String vehicleNumber) {
|
||||
List<Task> taskList = taskService.queryCurrentTaskInfoByVehicleNumber(vehicleNumber);
|
||||
Task currentTask = new Task();
|
||||
if (ObjectUtil.isNotEmpty(taskList)){
|
||||
currentTask = taskList.stream()
|
||||
.filter(task -> TaskStatusEnum.EXECUTING.getCode().equals(task.getStatus()))
|
||||
.findFirst()
|
||||
.orElse(new Task());
|
||||
}
|
||||
return currentTask;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateTaskReportStatusByCode(String taskCode, String newReportStatus,String waiting_time) {
|
||||
return taskService.update(new LambdaUpdateWrapper<>(Task.class)
|
||||
.set(Task::getVehicleReportStatus, newReportStatus)
|
||||
.set(StrUtil.isNotBlank(waiting_time),Task::getArrive_waiting_time,Integer.parseInt(waiting_time))
|
||||
.set(Task::getUpdate_time, DateUtil.now())
|
||||
.eq(Task::getTask_code,taskCode)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String taskOperationConfirm(String taskCode,String vehicleNumber) {
|
||||
Task task = this.queryCurrentTaskByVehicleNumber(vehicleNumber);
|
||||
if (ObjectUtil.isEmpty(task)){
|
||||
log.info("任务操作确认失败,任务不存在");
|
||||
return null;
|
||||
}
|
||||
if (!task.getTask_code().equals(taskCode)){
|
||||
log.info("任务操作确认失败,上报的任务号不相同");
|
||||
return null;
|
||||
}
|
||||
return task.getVehicleReportStatus();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package org.nl.task.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.nl.response.WebResponse;
|
||||
import org.nl.task.entity.Task;
|
||||
import org.nl.task.param.CancelTaskRequestParam;
|
||||
import org.nl.task.param.CreateTaskRequestParam;
|
||||
import org.nl.task.param.OneClickOperationRequestParam;
|
||||
import org.nl.task.param.PauseAndResumeTaskParam;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/11/28
|
||||
*/
|
||||
public interface TaskService extends IService<Task>{
|
||||
|
||||
/**
|
||||
* 创建任务
|
||||
* @return WebResponse
|
||||
*/
|
||||
WebResponse createTask(CreateTaskRequestParam createTaskRequestParam, String taskSource);
|
||||
|
||||
/**
|
||||
* 取消任务
|
||||
* @return WebResponse
|
||||
*/
|
||||
WebResponse cancelTask(CancelTaskRequestParam cancelTaskRequestParam);
|
||||
|
||||
/**
|
||||
* 暂停任务
|
||||
* @return WebResponse
|
||||
*/
|
||||
WebResponse pauseTask(PauseAndResumeTaskParam pauseAndResumeTaskParam);
|
||||
|
||||
/**
|
||||
* 恢复任务
|
||||
* @return WebResponse
|
||||
*/
|
||||
WebResponse resumeTask(PauseAndResumeTaskParam pauseAndResumeTaskParam);
|
||||
|
||||
/**
|
||||
* 查询当前未完成的任务
|
||||
* @return WebResponse
|
||||
*/
|
||||
WebResponse queryNotFinishTaskInfoByVehicleNumber(String vehicle_number);
|
||||
|
||||
/**
|
||||
* 查询当前未完成的任务
|
||||
* @return List<Task>
|
||||
*/
|
||||
List<Task> queryCurrentTaskInfoByVehicleNumber(String vehicle_number);
|
||||
|
||||
/**
|
||||
* 任务操作确认
|
||||
* @return WebResponse
|
||||
*/
|
||||
WebResponse taskOperationConfirm(String task_code);
|
||||
|
||||
/**
|
||||
* 一键任务操作
|
||||
* @param oneClickOperationRequestParam
|
||||
* @return WebResponse
|
||||
*/
|
||||
WebResponse oneClickOperation(OneClickOperationRequestParam oneClickOperationRequestParam,String taskSource);
|
||||
}
|
||||
@@ -0,0 +1,290 @@
|
||||
package org.nl.task.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.http.HttpResponse;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.api.schedule.task.api.ScheduleTaskAPI;
|
||||
import org.nl.api.schedule.task.core.ScheduleAPICreateOneClickTaskParam;
|
||||
import org.nl.api.schedule.task.core.ScheduleAPICreateTaskParam;
|
||||
import org.nl.enums.ScheduleTaskReportStatusEnum;
|
||||
import org.nl.enums.YesOrNoEnum;
|
||||
import org.nl.exception.BadRequestException;
|
||||
import org.nl.response.WebResponse;
|
||||
import org.nl.task.entity.Task;
|
||||
import org.nl.task.enums.ScheduleTaskStatusEnum;
|
||||
import org.nl.task.enums.TaskStatusEnum;
|
||||
import org.nl.task.enums.TaskTypeEnum;
|
||||
import org.nl.task.mapper.TaskMapper;
|
||||
import org.nl.task.param.CancelTaskRequestParam;
|
||||
import org.nl.task.param.CreateTaskRequestParam;
|
||||
import org.nl.task.param.OneClickOperationRequestParam;
|
||||
import org.nl.task.param.PauseAndResumeTaskParam;
|
||||
import org.nl.task.service.TaskService;
|
||||
import org.nl.util.IdUtil;
|
||||
import org.nl.util.TaskCodeGeneratorUtil;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author dsh
|
||||
* 2025/11/28
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class TaskServiceImpl extends ServiceImpl<TaskMapper,Task> implements TaskService {
|
||||
|
||||
@Resource
|
||||
private TaskMapper taskMapper;
|
||||
|
||||
@Resource
|
||||
private ScheduleTaskAPI scheduleTaskAPI;
|
||||
|
||||
private ConcurrentHashMap<String,List<Task>> taskInfoList = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* 定时查询车辆任务状态(每秒执行)
|
||||
*/
|
||||
@Scheduled(fixedRate = 1000) // 每秒执行一次
|
||||
public void queryScheduleTaskStatus() {
|
||||
try {
|
||||
List<Task> taskList = taskMapper.selectList(new LambdaQueryWrapper<>(Task.class)
|
||||
.lt(Task::getStatus,TaskStatusEnum.FINISHED.getCode())
|
||||
);
|
||||
//根据车辆编号分类 车辆任务队列。
|
||||
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("更新任务状态成功");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("更新任务状态失败: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public WebResponse createTask(CreateTaskRequestParam createTaskRequestParam, String taskSource) {
|
||||
try {
|
||||
if (!TaskTypeEnum.validationTaskType(createTaskRequestParam.getType())) {
|
||||
throw new BadRequestException("任务类型不存在");
|
||||
}
|
||||
Task task = BeanUtil.copyProperties(createTaskRequestParam, Task.class);
|
||||
task.setId(IdUtil.getStringId());
|
||||
if (StrUtil.isBlank(task.getTask_code())){
|
||||
task.setTask_code(TaskCodeGeneratorUtil.generateTaskId());
|
||||
}
|
||||
task.setType(createTaskRequestParam.getType());
|
||||
task.setSource(taskSource);
|
||||
task.setStatus(TaskStatusEnum.CREATE.getCode());
|
||||
task.setIsPause(YesOrNoEnum.NO.getCode());
|
||||
task.setVehicleReportStatus("0");
|
||||
task.setCreate_time(DateUtil.now());
|
||||
taskMapper.insert(task);
|
||||
|
||||
ScheduleAPICreateTaskParam scheduleAPICreateTaskParam = BeanUtil.copyProperties(task, ScheduleAPICreateTaskParam.class);
|
||||
HttpResponse result = scheduleTaskAPI.createTask(scheduleAPICreateTaskParam);
|
||||
if (result == null || !result.isOk()){
|
||||
throw new BadRequestException("调度生成任务失败");
|
||||
}
|
||||
return WebResponse.requestOk();
|
||||
}catch (Exception e){
|
||||
log.error("创建任务失败:{}",e.getMessage());
|
||||
throw new BadRequestException("创建任务失败:"+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public WebResponse cancelTask(CancelTaskRequestParam cancelTaskRequestParam) {
|
||||
try {
|
||||
if (StrUtil.isBlank(cancelTaskRequestParam.getTask_code())){
|
||||
throw new BadRequestException("任务号不能为空");
|
||||
}
|
||||
|
||||
HttpResponse result = scheduleTaskAPI.cancelTask(cancelTaskRequestParam.getTask_code());
|
||||
if (result == null || !result.isOk()){
|
||||
log.info("取消调度任务失败");
|
||||
throw new BadRequestException("取消调度任务失败");
|
||||
}
|
||||
|
||||
taskMapper.update(new LambdaUpdateWrapper<>(Task.class)
|
||||
.set(Task::getStatus,TaskStatusEnum.CANCELED.getCode())
|
||||
.eq(Task::getTask_code,cancelTaskRequestParam.getTask_code())
|
||||
);
|
||||
}catch (Exception e){
|
||||
log.error("取消任务失败:{}",e.getMessage());
|
||||
throw new BadRequestException("取消任务失败:"+e.getMessage());
|
||||
}
|
||||
|
||||
return WebResponse.requestOk();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public WebResponse pauseTask(PauseAndResumeTaskParam pauseAndResumeTaskParam) {
|
||||
try {
|
||||
if (StrUtil.isBlank(pauseAndResumeTaskParam.getTask_code())){
|
||||
throw new BadRequestException("任务号不能为空");
|
||||
}
|
||||
|
||||
HttpResponse result = scheduleTaskAPI.pauseTask(pauseAndResumeTaskParam.getTask_code());
|
||||
if (result == null || !result.isOk()){
|
||||
throw new BadRequestException("暂停调度任务失败");
|
||||
}
|
||||
|
||||
taskMapper.update(new LambdaUpdateWrapper<>(Task.class)
|
||||
.set(Task::getIsPause, YesOrNoEnum.YES.getCode())
|
||||
.set(Task::getRemark,"暂停任务")
|
||||
.set(Task::getUpdate_time,DateUtil.now())
|
||||
.eq(Task::getTask_code,pauseAndResumeTaskParam.getTask_code())
|
||||
);
|
||||
|
||||
return WebResponse.requestOk();
|
||||
}catch (Exception e){
|
||||
log.error("暂停任务失败:{}",e.getMessage());
|
||||
throw new BadRequestException("暂停任务失败:"+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public WebResponse resumeTask(PauseAndResumeTaskParam pauseAndResumeTaskParam) {
|
||||
try {
|
||||
if (StrUtil.isBlank(pauseAndResumeTaskParam.getTask_code())){
|
||||
throw new BadRequestException("任务号不能为空");
|
||||
}
|
||||
|
||||
HttpResponse result = scheduleTaskAPI.resumeTask(pauseAndResumeTaskParam.getTask_code());
|
||||
if (result == null || !result.isOk()){
|
||||
throw new BadRequestException("恢复调度任务失败");
|
||||
}
|
||||
|
||||
taskMapper.update(new LambdaUpdateWrapper<>(Task.class)
|
||||
.set(Task::getIsPause, YesOrNoEnum.NO.getCode())
|
||||
.set(Task::getRemark,"恢复任务")
|
||||
.set(Task::getUpdate_time,DateUtil.now())
|
||||
.eq(Task::getTask_code,pauseAndResumeTaskParam.getTask_code())
|
||||
);
|
||||
|
||||
return WebResponse.requestOk();
|
||||
}catch (Exception e){
|
||||
log.error("恢复任务失败:{}",e.getMessage());
|
||||
throw new BadRequestException("恢复任务失败:"+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public WebResponse queryNotFinishTaskInfoByVehicleNumber(String vehicle_number) {
|
||||
if (StrUtil.isBlank(vehicle_number)){
|
||||
throw new BadRequestException("车号不能为空");
|
||||
}
|
||||
return WebResponse.requestParamOk(taskInfoList.get(vehicle_number));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Task> queryCurrentTaskInfoByVehicleNumber(String vehicle_number) {
|
||||
if (StrUtil.isBlank(vehicle_number)){
|
||||
throw new BadRequestException("车号不能为空");
|
||||
}
|
||||
return taskInfoList.get(vehicle_number);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WebResponse taskOperationConfirm(String task_code) {
|
||||
|
||||
boolean reuslt = taskMapper.update(new LambdaUpdateWrapper<>(Task.class)
|
||||
.set(Task::getVehicleReportStatus, ScheduleTaskReportStatusEnum.FINISH_REPORTED.getCode())
|
||||
.set(Task::getUpdate_time,DateUtil.now())
|
||||
.eq(Task::getTask_code,task_code)
|
||||
) > 0;
|
||||
if (!reuslt){
|
||||
throw new BadRequestException("任务操作确认失败");
|
||||
}
|
||||
return WebResponse.requestOk();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public WebResponse oneClickOperation(OneClickOperationRequestParam oneClickOperationRequestParam,String taskSource) {
|
||||
try {
|
||||
log.info("一键任务操作参数:{}",oneClickOperationRequestParam);
|
||||
Task task = BeanUtil.copyProperties(oneClickOperationRequestParam, Task.class);
|
||||
task.setId(IdUtil.getStringId());
|
||||
if (StrUtil.isBlank(task.getTask_code())){
|
||||
task.setTask_code(TaskCodeGeneratorUtil.generateTaskId());
|
||||
}
|
||||
task.setType(oneClickOperationRequestParam.getType());
|
||||
task.setSource(taskSource);
|
||||
task.setStatus(TaskStatusEnum.CREATE.getCode());
|
||||
task.setIsPause(YesOrNoEnum.NO.getCode());
|
||||
task.setVehicleReportStatus("0");
|
||||
task.setCreate_time(DateUtil.now());
|
||||
taskMapper.insert(task);
|
||||
|
||||
ScheduleAPICreateOneClickTaskParam scheduleAPICreateOneClickTaskParam = BeanUtil.copyProperties(task, ScheduleAPICreateOneClickTaskParam.class);
|
||||
HttpResponse result = scheduleTaskAPI.oneClickOperationTask(scheduleAPICreateOneClickTaskParam);
|
||||
if (result == null || !result.isOk()){
|
||||
throw new BadRequestException("调度生成一键任务失败");
|
||||
}
|
||||
return WebResponse.requestOk();
|
||||
}catch (Exception e){
|
||||
log.error("创建一键任务失败:{}",e.getMessage());
|
||||
throw new BadRequestException("创建一键任务失败:"+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user